[
  {
    "path": ".coveralls.yml",
    "content": "service_name: travis-pro\nrepo_token: 8YyWggHYCJrQmm4qdV2f5LVvo3vBD7Xsa\n"
  },
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\nend_of_line = lf\ninsert_final_newline = false\nindent_style = space\nindent_size = 2\n"
  },
  {
    "path": ".gitattributes",
    "content": "* text eol=lf\n*.png -text\n*.exe -text\n*.jpg -text\n*.txt -text\n"
  },
  {
    "path": ".gitignore",
    "content": ".idea/\n.DS_Store\nnode_modules\nnpm-debug.log\n.vscode/\n"
  },
  {
    "path": ".jamignore",
    "content": ".*\n*.bat\n*.md\n*.min.*\n*.txt\n*.log\npackage.json\nnode_modules\ndoc\nexamples\nsrc\ntests\n.nuget\nnuget\n"
  },
  {
    "path": ".jscsrc",
    "content": "{\n  \"excludeFiles\": [\n    \"src/core/asyncintro.js\",\n    \"src/core/intro.js\",\n    \"src/core/outro.js\",\n    \"src/core/suboutro.js\",\n    \"src/core/subintro.js\",\n    \"src/core/testintro.js\"\n  ],\n  \"requireCurlyBraces\": [\n      \"if\",\n      \"else\",\n      \"for\",\n      \"while\",\n      \"do\",\n      \"try\",\n      \"catch\"\n  ],\n  \"requireOperatorBeforeLineBreak\": true,\n  \"requireCamelCaseOrUpperCaseIdentifiers\": true,\n  \"disallowMultipleLineStrings\": true,\n  \"disallowMixedSpacesAndTabs\": true,\n  \"disallowTrailingWhitespace\": true,\n  \"disallowSpaceAfterPrefixUnaryOperators\": true,\n  \"requireSpaceAfterKeywords\": [\n    \"if\",\n    \"else\",\n    \"for\",\n    \"while\",\n    \"do\",\n    \"switch\",\n    \"return\",\n    \"try\",\n    \"catch\"\n  ],\n  \"requireSpaceBeforeBinaryOperators\": [\n      \"=\", \"+=\", \"-=\", \"*=\", \"/=\", \"%=\", \"<<=\", \">>=\", \">>>=\",\n      \"&=\", \"|=\", \"^=\", \"+=\",\n\n      \"+\", \"-\", \"*\", \"/\", \"%\", \"<<\", \">>\", \">>>\", \"&\",\n      \"|\", \"^\", \"&&\", \"||\", \"===\", \"==\", \">=\",\n      \"<=\", \"<\", \">\", \"!=\", \"!==\"\n  ],\n  \"requireSpaceAfterBinaryOperators\": true,\n  \"requireSpacesInConditionalExpression\": true,\n  \"requireSpaceBeforeBlockStatements\": true,\n  \"requireLineFeedAtFileEnd\": true,\n  \"requireSpacesInFunctionExpression\": {\n      \"beforeOpeningCurlyBrace\": true\n  },\n  \"disallowSpacesInsideParentheses\": true,\n  \"disallowMultipleLineBreaks\": true,\n  \"disallowNewlineBeforeBlockStatements\": true\n}"
  },
  {
    "path": ".jscsrc.todo",
    "content": "{\n  \"maximumLineLength\": {\n    \"value\": 80,\n    \"allowComments\": true,\n    \"allowRegex\": true\n  },\n  \"validateIndentation\": 2,\n  \"validateQuoteMarks\": \"'\",\n  \"disallowMultipleVarDecl\": true,\n  \"disallowSpacesInAnonymousFunctionExpression\": {\n      \"beforeOpeningRoundBrace\": true\n  },\n  \"disallowSpacesInsideObjectBrackets\": \"all\",\n  \"disallowSpacesInsideArrayBrackets\": \"all\",\n  \"validateJSDoc\": {\n      \"checkParamNames\": true,\n      \"requireParamTypes\": true\n  }\n}"
  },
  {
    "path": ".jshintrc",
    "content": "{\n  \"curly\": true,\n  \"eqeqeq\": true,\n  \"immed\": true,\n  \"latedef\": true,\n  \"newcap\": true,\n  \"noarg\": true,\n  \"sub\": true,\n  \"undef\": true,\n  \"unused\": true,\n  \"boss\": true,\n  \"eqnull\": true,\n  \"node\": true,\n  \"-W030\": true,\n  \"predef\": [ \"Promise\" ]\n}\n"
  },
  {
    "path": ".npmignore",
    "content": "node_modules/\nmodules/\n.npm-debug.log\n.nuget/\n.vscode/\nnuget/\ndoc/\nexamples/\ntests/\nlogos/\nmodules/\nsrc/\n.git*\n.jshint*\n.npmignore\n.travis.yml\nCHANGELOG.*\nGruntfile.js\ntravis.sh\n"
  },
  {
    "path": ".nuget/nuget.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <solution>\n    <add key=\"disableSourceControlIntegration\" value=\"true\" />\n  </solution>\n</configuration>"
  },
  {
    "path": ".nuget/nuget.targets",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n    <PropertyGroup>\n        <SolutionDir Condition=\"$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'\">$(MSBuildProjectDirectory)\\..\\</SolutionDir>\n\n        <!-- Windows specific commands -->\n        <NuGetToolsPath Condition=\" '$(OS)' == 'Windows_NT'\">$([System.IO.Path]::Combine($(SolutionDir), \".nuget\"))</NuGetToolsPath>\n        <PackagesConfig Condition=\" '$(OS)' == 'Windows_NT'\">$([System.IO.Path]::Combine($(ProjectDir), \"packages.config\"))</PackagesConfig>\n        <PackagesDir Condition=\" '$(OS)' == 'Windows_NT'\">$([System.IO.Path]::Combine($(SolutionDir), \"packages\"))</PackagesDir>\n\n        <!-- We need to launch nuget.exe with the mono command if we're not on windows -->\n        <NuGetToolsPath Condition=\" '$(OS)' != 'Windows_NT'\">$(SolutionDir).nuget</NuGetToolsPath>\n        <PackagesConfig Condition=\" '$(OS)' != 'Windows_NT' \">packages.config</PackagesConfig>\n        <PackagesDir Condition=\" '$(OS)' != 'Windows_NT'\">$(SolutionDir)packages</PackagesDir>\n        \n        <!-- NuGet command -->\n        <NuGetExePath>$(NuGetToolsPath)\\nuget.exe</NuGetExePath>\n        <NuGetCommand Condition=\" '$(OS)' == 'Windows_NT'\">\"$(NuGetExePath)\"</NuGetCommand>\n        <NuGetCommand Condition=\" '$(OS)' != 'Windows_NT' \">mono --runtime=v4.0.30319 $(NuGetExePath)</NuGetCommand>\n\n        <PackageOutputDir Condition=\"$(PackageOutputDir) == ''\">$(TargetDir.Trim('\\\\'))</PackageOutputDir>\n\n        <!-- Package sources used to restore packages. By default will used the registered sources under %APPDATA%\\NuGet\\NuGet.Config -->\n        <PackageSources>\"\"</PackageSources>\n\n        <!-- Enable the restore command to run before builds -->\n        <RestorePackages Condition=\"$(RestorePackages) == ''\">false</RestorePackages>\n\n        <!-- Property that enables building a package from a project -->\n        <BuildPackage Condition=\"$(BuildPackage) == ''\">false</BuildPackage>\n\n        <!-- Commands -->\n        <RestoreCommand>$(NuGetCommand) install \"$(PackagesConfig)\" -source $(PackageSources) -o \"$(PackagesDir)\"</RestoreCommand>\n        <BuildCommand>$(NuGetCommand) pack \"$(ProjectPath)\" -p Configuration=$(Configuration) -o \"$(PackageOutputDir)\" -symbols</BuildCommand>\n\n        <!-- Make the build depend on restore packages -->\n        <BuildDependsOn Condition=\"$(RestorePackages) == 'true'\">\n            RestorePackages;\n            $(BuildDependsOn);\n        </BuildDependsOn>\n\n        <!-- Make the build depend on restore packages -->\n        <BuildDependsOn Condition=\"$(BuildPackage) == 'true'\">\n            $(BuildDependsOn);\n            BuildPackage;\n        </BuildDependsOn>\n    </PropertyGroup>\n\n    <Target Name=\"CheckPrerequisites\">\n        <!-- Raise an error if we're unable to locate nuget.exe  -->\n        <Error Condition=\"!Exists('$(NuGetExePath)')\" Text=\"Unable to locate '$(NuGetExePath)'\" />\n    </Target>\n\n    <Target Name=\"RestorePackages\" DependsOnTargets=\"CheckPrerequisites\">\n        <Exec Command=\"$(RestoreCommand)\"\n              Condition=\"'$(OS)' != 'Windows_NT' And Exists('$(PackagesConfig)')\" />\n              \n        <Exec Command=\"$(RestoreCommand)\"\n              LogStandardErrorAsError=\"true\"\n              Condition=\"'$(OS)' == 'Windows_NT' And Exists('$(PackagesConfig)')\" />\n    </Target>\n\n    <Target Name=\"BuildPackage\" DependsOnTargets=\"CheckPrerequisites\">\n        <Exec Command=\"$(BuildCommand)\" \n              Condition=\" '$(OS)' != 'Windows_NT' \" />\n              \n        <Exec Command=\"$(BuildCommand)\"\n              LogStandardErrorAsError=\"true\"\n              Condition=\" '$(OS)' == 'Windows_NT' \" />\n    </Target>\n</Project>"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\nnode_js:\n  - \"0.10\"\n  - \"0.12\"\n  - 4\n  - 5\nenv:\n  global:\n    - secure: \"JwyiLIEV6S7wzr9eUgQ/rP8BeeSY6ZabknHpUKSk4miA7d+/acFeuMAYu0d79BG8ndFIdG9EYbA7ZY1TH/metqDTrExzYLooa0XrAYg2x+cDSboII9albVn5bvdmmWIcgcmcZwKvi5JYLHWcA3Px84Aaf3YXN9V4lS1uLhl0eBI=\"\n    - secure: \"BVYlZy3vIt21bhrzKPgQzRlbwGCBrdBtRPRvX/qCGi1jYAoAtrT0bYllZpNqduPLouW3LaJDwOJx9zLDmZDwKDvPgTinpVwmkhZYRFl1kNweku3ZfeHR5ejOVYvdQEqVU4rOtTBLk6emItEPTuFtC9SPSYQZQtjnZAjHTg0jqLU=\"\nnotifications:\n  slack: reactivex:e424dAgQ2W9kuRMe6ngxHQbv\n  webhooks:\n    urls:\n      - https://webhooks.gitter.im/e/8f1482d7420d95b647ce\n    on_success: change  # options: [always|never|change] default: always\n    on_failure: always  # options: [always|never|change] default: always\n    on_start: false     # default: false\n"
  },
  {
    "path": "Gruntfile.js",
    "content": "module.exports = function (grunt) {\n\n  grunt.initConfig({\n      pkg: grunt.file.readJSON('package.json'),\n      meta: {\n          banner:\n            '/*'+\n            'Copyright (c) Microsoft.  All rights reserved.\\r\\n' +\n            'Microsoft Open Technologies. Licensed under the Apache License, Version 2.0 (the \"License\"); you.\\r\\n' +\n            'may not use this file except in compliance with the License. You may.\\r\\n' +\n            'obtain a copy of the License at.\\r\\n\\r\\n' +\n            'http://www.apache.org/licenses/LICENSE-2.0.\\r\\n\\r\\n' +\n            'Unless required by applicable law or agreed to in writing, software.\\r\\n' +\n            'distributed under the License is distributed on an \"AS IS\" BASIS,.\\r\\n' +\n            'WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or.\\r\\n' +\n            'implied. See the License for the specific language governing permissions.\\r\\n' +\n            'and limitations under the License..\\r\\n' +\n            '*/'\n      },\n      concat: {\n          core: {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/intro.js',\n              'src/core/headers/coreheader.js',\n\n              // Stack trace start\n              'src/core/internal/trycatch.js',\n              'src/core/longstacktraces/longstackbegin.js',\n              'src/core/longstacktraces/longstacktraces.js',\n\n              // internals\n              'src/core/internal/util.js',\n\n              // Disposables\n              'src/core/disposables/compositedisposable.js',\n              'src/core/disposables/disposable.js',\n              'src/core/disposables/booleandisposable.js',\n              'src/core/disposables/binarydisposable.js',\n\n              // Schedulers\n              'src/core/concurrency/scheduleditem.js',\n              'src/core/concurrency/scheduler.js',\n              'src/core/concurrency/scheduler.recursive.js',\n              'src/core/concurrency/scheduler.periodic.js',\n              'src/core/concurrency/scheduleperiodicrecursive.js',\n              'src/core/concurrency/immediatescheduler.js',\n              'src/core/concurrency/currentthreadscheduler.js',\n              'src/core/concurrency/defaultscheduler.js',\n              'src/core/internal/priorityqueue.js',\n\n              // Observer\n              'src/core/observer-lite.js',\n              'src/core/abstractobserver.js',\n              'src/core/anonymousobserver.js',\n\n              // Observable\n              'src/core/observable.js',\n              'src/core/anonymousobservable.js',\n              'src/core/perf/observablebase.js',\n              'src/core/autodetachobserver.js',\n              'src/core/linq/observable/create.js',\n\n              'src/core/headers/exports.js',\n\n              // Long stacktrace end\n              'src/core/longstacktraces/longstackend.js',\n\n              'src/core/headers/outro.js'\n            ],\n            dest: 'dist/rx.core.js'\n          },\n          'core-binding': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/core-intro.js',\n              'src/core/headers/core-bindingheader.js',\n              'src/core/internal/trycatch.js',\n              'src/core/linq/observable/multicast.js',\n              'src/core/linq/observable/publish.js',\n              'src/core/linq/observable/share.js',\n              'src/core/linq/observable/publishlast.js',\n              'src/core/linq/observable/publishvalue.js',\n              'src/core/linq/observable/sharevalue.js',\n              'src/core/linq/observable/replay.js',\n              'src/core/linq/observable/sharereplay.js',\n              'src/core/scheduledobserver.js',\n              'src/core/subjects/innersubscription.js',\n              'src/core/subjects/subject.js',\n              'src/core/subjects/anonymoussubject.js',\n              'src/core/subjects/asyncsubject.js',\n              'src/core/subjects/behaviorsubject.js',\n              'src/core/subjects/replaysubject.js',\n              'src/core/linq/connectableobservable.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'dist/rx.core.binding.js'\n          },\n          'core-testing': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/core-intro.js',\n              'src/core/headers/core-testheader.js',\n\n              'src/core/notification.js',\n              'src/core/internal/dontenums.js',\n              'src/core/internal/isequal.js',\n\n              'src/core/concurrency/scheduleperiodicrecursive.js',\n              'src/core/concurrency/virtualtimescheduler.js',\n\n              'src/core/testing/reactivetest.js',\n              'src/core/testing/recorded.js',\n              'src/core/testing/subscription.js',\n              'src/core/testing/mockdisposable.js',\n              'src/core/testing/mockobserver.js',\n              'src/core/testing/mockpromise.js',\n              'src/core/testing/hotobservable.js',\n              'src/core/testing/coldobservable.js',\n              'src/core/testing/testscheduler.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'dist/rx.core.testing.js'\n          },\n          all: {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/intro.js',\n              'src/core/headers/basicheader.js',\n\n              // Stack trace start\n              'src/core/internal/trycatch.js',\n              'src/core/longstacktraces/longstackbegin.js',\n              'src/core/longstacktraces/longstacktraces.js',\n\n              'src/core/internal/errors.js',\n\n              'src/core/headers/enumeratorheader.js',\n\n              'src/core/internal/bindcallback.js',\n              'src/core/internal/dontenums.js',\n              'src/core/internal/isequal.js',\n              'src/core/internal/util.js',\n              'src/core/internal/priorityqueue.js',\n              'src/core/disposables/compositedisposable.js',\n              'src/core/disposables/disposable.js',\n              'src/core/disposables/booleandisposable.js',\n              'src/core/disposables/binarydisposable.js',\n              'src/core/disposables/refcountdisposable.js',\n              'src/core/disposables/scheduleddisposable.js',\n              'src/core/concurrency/scheduleditem.js',\n              'src/core/concurrency/scheduler.js',\n              'src/core/concurrency/scheduler.recursive.js',\n              'src/core/concurrency/scheduler.periodic.js',\n              'src/core/concurrency/scheduler.wrappers.js',\n              'src/core/concurrency/scheduleperiodicrecursive.js',\n              'src/core/concurrency/immediatescheduler.js',\n              'src/core/concurrency/currentthreadscheduler.js',\n              'src/core/concurrency/defaultscheduler.js',\n              'src/core/concurrency/catchscheduler.js',\n              'src/core/notification.js',\n              'src/core/observer.js',\n              'src/core/abstractobserver.js',\n              'src/core/anonymousobserver.js',\n              'src/core/checkedobserver.js',\n              'src/core/scheduledobserver.js',\n              'src/core/observeonobserver.js',\n              'src/core/observable.js',\n              'src/core/perf/observablebase.js',\n              'src/core/perf/operators/flatmapbase.js',\n              'src/core/enumerable.js',\n\n              // Concurrency\n              'src/core/linq/observable/observeon.js', // ObserveOnObserver\n              'src/core/linq/observable/subscribeon.js', // SingleAssignmentDisposable, SerialDisposable, ScheduleDisposable\n\n              // Async\n              'src/core/perf/operators/frompromise.js', // AsyncSubject, asObservable\n              'src/core/linq/observable/topromise.js',\n\n              // Creation\n              'src/core/perf/operators/toarray.js',\n              'src/core/linq/observable/create.js',\n              'src/core/linq/observable/defer.js',\n              'src/core/perf/operators/empty.js',\n              'src/core/perf/operators/from.js',\n              'src/core/perf/operators/fromarrayobservable.js','src/core/perf/operators/fromarray.js',\n              'src/core/linq/observable/generate.js',\n              'src/core/perf/operators/of.js',\n              'src/core/linq/observable/ofarraychanges.js',\n              'src/core/linq/observable/ofobjectchanges.js',\n              'src/core/perf/operators/never.js',\n              'src/core/perf/operators/pairs.js',\n              'src/core/perf/operators/range.js',\n              'src/core/perf/operators/repeat.js',\n              'src/core/perf/operators/just.js',\n              'src/core/perf/operators/throw.js',\n              'src/core/linq/observable/using.js',\n\n              // Multiple\n              'src/core/linq/observable/ambproto.js',\n              'src/core/linq/observable/amb.js',\n              'src/core/linq/observable/catchproto.js',\n              'src/core/linq/observable/catch.js',\n              'src/core/linq/observable/combinelatestproto.js',\n              'src/core/perf/operators/combinelatest.js',\n              'src/core/linq/observable/concatproto.js',\n              'src/core/perf/operators/concat.js',\n              'src/core/linq/observable/concatall.js',\n              'src/core/perf/operators/mergeconcat.js',\n              'src/core/linq/observable/merge.js',\n              'src/core/perf/operators/mergeall.js',\n              'src/core/linq/observable/mergedelayerror.js',\n              'src/core/linq/observable/onerrorresumenextproto.js',\n              'src/core/linq/observable/onerrorresumenext.js',\n              'src/core/perf/operators/skipuntil.js',\n              'src/core/perf/operators/switch.js',\n              'src/core/perf/operators/takeuntil.js',\n              'src/core/perf/operators/withlatestfrom.js',\n              'src/core/perf/operators/zip.js',\n              'src/core/linq/observable/zip.js',\n              'src/core/linq/observable/zipiterable.js',\n\n              // Single\n              'src/core/linq/observable/asobservable.js',\n              'src/core/linq/observable/bufferwithcount.js',\n              'src/core/linq/observable/dematerialize.js',\n              'src/core/perf/operators/distinctuntilchanged.js',\n              'src/core/perf/operators/tap.js',\n              'src/core/perf/operators/finally.js',\n              'src/core/perf/operators/ignoreelements.js',\n              'src/core/linq/observable/materialize.js',\n              'src/core/linq/observable/repeatproto.js',\n              'src/core/linq/observable/retry.js',\n              'src/core/linq/observable/retrywhen.js',\n              'src/core/linq/observable/repeatwhen.js',\n              'src/core/perf/operators/scan.js',\n              'src/core/linq/observable/skiplast.js',\n              'src/core/linq/observable/startwith.js',\n              'src/core/linq/observable/takelast.js',\n              'src/core/linq/observable/takelastbuffer.js',\n              'src/core/linq/observable/windowwithcount.js',\n\n              // Standard query operators\n              'src/core/linq/observable/concatmap.js',\n              'src/core/linq/observable/concatmapobserver.js',\n              'src/core/linq/observable/defaultifempty.js',\n              'src/core/linq/observable/distinct.js',\n              'src/core/linq/observable/groupby.js',\n              'src/core/linq/observable/groupbyuntil.js',\n              'src/core/perf/operators/map.js',\n              'src/core/linq/observable/pluck.js',\n              'src/core/perf/operators/flatmap.js',\n              'src/core/linq/observable/selectmanyobserver.js',\n              'src/core/perf/operators/flatmaplatest.js',\n              'src/core/perf/operators/skip.js',\n              'src/core/linq/observable/skipwhile.js',\n              'src/core/perf/operators/take.js',\n              'src/core/linq/observable/takewhile.js',\n              'src/core/perf/operators/filter.js',\n\n              // Aggregate Operators\n              'src/core/linq/observable/_extremaby.js',\n              'src/core/linq/observable/_firstonly.js',\n              'src/core/perf/operators/reduce.js', // scan, startwith, finalvalue\n              'src/core/linq/observable/some.js',  // where\n              'src/core/linq/observable/isempty.js', // any, select\n              'src/core/linq/observable/every.js', // where, any\n              'src/core/linq/observable/includes.js', // where, any\n              'src/core/linq/observable/count.js', // where, aggregate\n              'src/core/linq/observable/indexof.js',\n              'src/core/linq/observable/sum.js', // select, aggregate\n              'src/core/linq/observable/minby.js', // _extremaby\n              'src/core/linq/observable/min.js',   // minby, _firstonly\n              'src/core/linq/observable/maxby.js', // _extremaby\n              'src/core/linq/observable/max.js',   // max, _firstonly\n              'src/core/linq/observable/average.js',   // select, scan, aggregate, finalvalue\n              'src/core/linq/observable/sequenceequal.js',   // compositedisposable\n              'src/core/linq/observable/elementat.js',\n              'src/core/linq/observable/single.js',\n              'src/core/linq/observable/first.js',\n              'src/core/linq/observable/last.js',\n              'src/core/linq/observable/_findvalue.js',\n              'src/core/linq/observable/find.js', // _findvalue, where\n              'src/core/linq/observable/findindex.js', // _findvalue, where\n              'src/core/linq/observable/toset.js',\n              'src/core/linq/observable/tomap.js',\n              'src/core/linq/observable/slice.js',\n              'src/core/linq/observable/lastindexof.js',\n\n              // Async operators\n              'src/core/linq/observable/spawn.js',\n              'src/core/linq/observable/start.js', // toasync\n              'src/core/linq/observable/toasync.js', // AsyncSubject, asObservable\n              'src/core/perf/operators/fromcallback.js',\n              'src/core/perf/operators/fromnodecallback.js',\n              'src/core/linq/observable/fromevent.js', // publish\n              'src/core/linq/observable/fromeventpattern.js', // publish\n              'src/core/linq/observable/startasync.js',\n\n              // Backpressure operators\n              'src/core/backpressure/pausable.js',\n              'src/core/backpressure/pausablebuffered.js',\n              'src/core/backpressure/controlled.js',\n              'src/core/backpressure/stopandwait.js',\n              'src/core/backpressure/windowed.js',\n              'src/core/linq/observable/pipe.js',\n\n              // Binding operators\n              'src/core/linq/observable/multicast.js', // ConnectableObservable\n              'src/core/linq/observable/publish.js',   // mulitcast, Subject\n              'src/core/linq/observable/share.js',   // mulitcast, Subject, Reference counted\n              'src/core/linq/observable/publishlast.js', // multicast, AsyncSubject\n              'src/core/linq/observable/publishvalue.js', // multicast, BehaviorSubject\n              'src/core/linq/observable/sharevalue.js', // multicast, BehaviorSubject, Reference counted\n              'src/core/linq/observable/replay.js', // multicast, ReplaySubject\n              'src/core/linq/observable/sharereplay.js',\n              'src/core/subjects/innersubscription.js',\n              'src/core/linq/connectableobservable.js',\n              'src/core/linq/observable/singleinstance.js',\n\n              // Coincidence operators\n              'src/core/linq/observable/join.js', // SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, Dictionary\n              'src/core/linq/observable/groupjoin.js', // SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, Dictionary\n              'src/core/linq/observable/buffer.js', // window, selectMany, toArray\n              'src/core/linq/observable/window.js', // CompositeDisposable, RefCountDisposable, Subject, SingleAssignmentDisposable\n              'src/core/linq/observable/pairwise.js',\n              'src/core/linq/observable/partition.js',\n\n              // Experimental operators\n              'src/core/linq/enumerable/while.js', // Enumerable\n              'src/core/linq/observable/let.js',\n              'src/core/linq/observable/if.js', // defer, empty\n              'src/core/linq/observable/for.js', // Enumerable.forEach, concatproto\n              'src/core/linq/observable/while.js', // Enumerable.while, concatproto\n              'src/core/linq/observable/dowhile.js', // Enumerable.while, concat\n              'src/core/linq/observable/case.js', // defer, empty\n              'src/core/linq/observable/expand.js', // immediateScheduler, SerialDisposable, CompositeDisposable, SingleAssignmentDisposable\n              'src/core/linq/observable/forkjoin.js', // CompositeDisposable\n              'src/core/linq/observable/forkjoinproto.js', // SingleAssignmentDisposable, CompositeDisposable\n              'src/core/linq/observable/manyselect.js', // ImmediateScheduler, CurrentThreadScheduler, select, do, observeOn\n\n              // Join pattern operators\n              'src/core/internal/map.js',\n              'src/core/joins/pattern.js',\n              'src/core/joins/plan.js',\n              'src/core/joins/activeplan.js',\n              'src/core/joins/joinobserver.js',\n              'src/core/linq/observable/and.js', // Pattern\n              'src/core/linq/observable/thendo.js', // Pattern\n              'src/core/linq/observable/when.js', // CompositeDisposable\n\n              // Time based operators\n              'src/core/linq/observable/_observabletimer.js', // AnonymousObservable\n              'src/core/linq/observable/_observabletimerdateandperiod.js', // AnonymousObservable, normalizeTime\n\n              'src/core/linq/observable/_observabletimertimespanandperiod.js', // AnonymousObservable, defer, _observabletimerdateandperiod\n              'src/core/linq/observable/interval.js', // timeoutScheduler, _observabletimertimespanandperiod\n              'src/core/linq/observable/timer.js', // timeoutScheduler, _observabletimerdate, _observabletimerdateandperiod, _observabletimertimespan, _observabletimertimespanandperiod\n              'src/core/linq/observable/delay.js', // AnonymousObservable, timeoutScheduler, SerialDisposable, materialize, timestamp\n              'src/core/linq/observable/debounce.js', // AnonymousObservable, SerialDisposable, timeoutScheduler, SingleAssignmentDisposable, CompositeDisposable\n              'src/core/linq/observable/windowwithtime.js', // AnonymousObservable, SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, addref, subject\n              'src/core/linq/observable/windowwithtimeorcount.js', // AnonymousObservable, SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, addref, subject\n              'src/core/linq/observable/bufferwithtime.js', // windowwithtime, selectMany, toArray\n              'src/core/linq/observable/bufferwithtimeorcount.js', // windowwithtimeorcount, selectMany, toArray\n              'src/core/linq/observable/timeinterval.js', // timeoutScheduler, defer, select\n              'src/core/linq/observable/timestamp.js', // timeoutScheduler, select\n              'src/core/linq/observable/sample.js', // AnonymousObservable, CompositeDisposable, interval, timeoutScheduler\n              'src/core/linq/observable/timeout.js', // AnonymousObservable, timeoutScheduler, throw, SingleAssignmentDisposable, SerialDisposable, CompositeDisposable\n              'src/core/linq/observable/generatewithabsolutetime.js', // timeoutScheduler, AnonymousObservable\n              'src/core/linq/observable/generatewithrelativetime.js', // timeoutScheduler, AnonymousObservable\n              'src/core/linq/observable/delaysubscription.js', // delayWithSelector, timer, empty\n              'src/core/linq/observable/skiplastwithtime.js',\n              'src/core/linq/observable/takelastwithtime.js',\n              'src/core/linq/observable/takelastbufferwithtime.js',\n              'src/core/linq/observable/takewithtime.js',\n              'src/core/linq/observable/skipwithtime.js',\n              'src/core/linq/observable/skipuntilwithtime.js',\n              'src/core/linq/observable/takeuntilwithtime.js',\n              'src/core/linq/observable/throttle.js',\n\n              // Transducers\n              'src/core/linq/observable/transduce.js',\n\n              // Experimental Flattening\n              'src/core/linq/observable/switchfirst.js',\n              'src/core/perf/operators/flatmapfirst.js',\n              'src/core/perf/operators/flatmapwithmaxconcurrent.js',\n\n              // Virtual time\n              'src/core/concurrency/virtualtimescheduler.js',\n              'src/core/concurrency/historicalscheduler.js',\n\n              'src/core/testing/reactivetest.js',\n              'src/core/testing/recorded.js',\n              'src/core/testing/subscription.js',\n              'src/core/testing/mockdisposable.js',\n              'src/core/testing/mockobserver.js',\n              'src/core/testing/mockpromise.js',\n              'src/core/testing/hotobservable.js',\n              'src/core/testing/coldobservable.js',\n              'src/core/testing/testscheduler.js',\n\n              'src/core/anonymousobservable.js',\n              'src/core/autodetachobserver.js',\n              'src/core/linq/groupedobservable.js',\n              'src/core/subjects/innersubscription.js',\n              'src/core/subjects/subject.js',\n              'src/core/subjects/asyncsubject.js',\n              'src/core/subjects/behaviorsubject.js',\n              'src/core/subjects/replaysubject.js',\n              'src/core/subjects/anonymoussubject.js',\n              'src/core/backpressure/pauser.js',\n              'src/core/headers/exports.js',\n\n              // Long stacktrace end\n              'src/core/longstacktraces/longstackend.js',\n\n              'src/core/headers/outro.js'\n            ],\n            dest: 'dist/rx.all.js'\n          },\n          'all-compat': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/intro.js',\n              'src/core/headers/basicheader-compat.js',\n\n              // Stack trace start\n              'src/core/internal/trycatch.js',\n              'src/core/longstacktraces/longstackbegin.js',\n              'src/core/longstacktraces/longstacktraces.js',\n\n              'src/core/internal/polyfills.js',\n              'src/core/internal/errors.js',\n\n              'src/core/headers/enumeratorheader.js',\n\n              'src/core/internal/bindcallback.js',\n              'src/core/internal/dontenums.js',\n              'src/core/internal/isequal.js',\n              'src/core/internal/util.js',\n              'src/core/internal/priorityqueue.js',\n              'src/core/disposables/compositedisposable.js',\n              'src/core/disposables/disposable.js',\n              'src/core/disposables/booleandisposable.js',\n              'src/core/disposables/binarydisposable.js',\n              'src/core/disposables/refcountdisposable.js',\n              'src/core/disposables/scheduleddisposable.js',\n              'src/core/concurrency/scheduleditem.js',\n              'src/core/concurrency/scheduler.js',\n              'src/core/concurrency/scheduler.recursive.js',\n              'src/core/concurrency/scheduler.periodic.js',\n              'src/core/concurrency/scheduler.wrappers.js',\n              'src/core/concurrency/scheduleperiodicrecursive.js',\n              'src/core/concurrency/immediatescheduler.js',\n              'src/core/concurrency/currentthreadscheduler.js',\n              'src/core/concurrency/defaultscheduler.js',\n              'src/core/concurrency/catchscheduler.js',\n              'src/core/notification.js',\n              'src/core/observer.js',\n              'src/core/abstractobserver.js',\n              'src/core/anonymousobserver.js',\n              'src/core/checkedobserver.js',\n              'src/core/scheduledobserver.js',\n              'src/core/observeonobserver.js',\n              'src/core/observable.js',\n              'src/core/perf/observablebase.js',\n              'src/core/perf/operators/flatmapbase.js',\n              'src/core/enumerable.js',\n\n              'src/core/linq/observable/observeon.js', // ObserveOnObserver\n              'src/core/linq/observable/subscribeon.js', // SingleAssignmentDisposable, SerialDisposable, ScheduleDisposable\n\n              // Async\n              'src/core/perf/operators/frompromise.js', // AsyncSubject, asObservable\n              'src/core/linq/observable/topromise.js',\n\n              // Creation\n              'src/core/perf/operators/toarray.js',\n              'src/core/linq/observable/create.js',\n              'src/core/linq/observable/defer.js',\n              'src/core/perf/operators/empty.js',\n              'src/core/perf/operators/from.js',\n              'src/core/perf/operators/fromarrayobservable.js','src/core/perf/operators/fromarray.js',\n              'src/core/linq/observable/generate.js',\n              'src/core/perf/operators/of.js',\n              'src/core/perf/operators/never.js',\n              'src/core/perf/operators/pairs.js',\n              'src/core/perf/operators/range.js',\n              'src/core/perf/operators/repeat.js',\n              'src/core/perf/operators/just.js',\n              'src/core/perf/operators/throw.js',\n              'src/core/linq/observable/using.js',\n\n              // Multiple\n              'src/core/linq/observable/ambproto.js',\n              'src/core/linq/observable/amb.js',\n              'src/core/linq/observable/catchproto.js',\n              'src/core/linq/observable/catch.js',\n              'src/core/linq/observable/combinelatestproto.js',\n              'src/core/perf/operators/combinelatest.js',\n              'src/core/linq/observable/concatproto.js',\n              'src/core/perf/operators/concat.js',\n              'src/core/linq/observable/concatall.js',\n              'src/core/perf/operators/mergeconcat.js',\n              'src/core/linq/observable/merge.js',\n              'src/core/perf/operators/mergeall.js',\n              'src/core/linq/observable/mergedelayerror.js',\n              'src/core/linq/observable/onerrorresumenextproto.js',\n              'src/core/linq/observable/onerrorresumenext.js',\n              'src/core/perf/operators/skipuntil.js',\n              'src/core/perf/operators/switch.js',\n              'src/core/perf/operators/takeuntil.js',\n              'src/core/perf/operators/withlatestfrom.js',\n              'src/core/perf/operators/zip.js',\n              'src/core/linq/observable/zip.js',\n              'src/core/linq/observable/zipiterable.js',\n\n              // Single\n              'src/core/linq/observable/asobservable.js',\n              'src/core/linq/observable/bufferwithcount.js',\n              'src/core/linq/observable/dematerialize.js',\n              'src/core/perf/operators/distinctuntilchanged.js',\n              'src/core/perf/operators/tap.js',\n              'src/core/perf/operators/finally.js',\n              'src/core/perf/operators/ignoreelements.js',\n              'src/core/linq/observable/materialize.js',\n              'src/core/linq/observable/repeatproto.js',\n              'src/core/linq/observable/retry.js',\n              'src/core/linq/observable/retrywhen.js',\n              'src/core/linq/observable/repeatwhen.js',\n              'src/core/perf/operators/scan.js',\n              'src/core/linq/observable/skiplast.js',\n              'src/core/linq/observable/startwith.js',\n              'src/core/linq/observable/takelast.js',\n              'src/core/linq/observable/takelastbuffer.js',\n              'src/core/linq/observable/windowwithcount.js',\n\n              // Standard query operators\n              'src/core/perf/operators/concatmap.js',\n              'src/core/linq/observable/concatmapobserver.js',\n              'src/core/linq/observable/defaultifempty.js',\n              'src/core/linq/observable/distinct.js',\n              'src/core/linq/observable/groupby.js',\n              'src/core/linq/observable/groupbyuntil.js',\n              'src/core/perf/operators/map.js',\n              'src/core/linq/observable/pluck.js',\n              'src/core/perf/operators/flatmap.js',\n              'src/core/linq/observable/selectmanyobserver.js',\n              'src/core/perf/operators/flatmaplatest.js',\n              'src/core/perf/operators/skip.js',\n              'src/core/linq/observable/skipwhile.js',\n              'src/core/perf/operators/take.js',\n              'src/core/linq/observable/takewhile.js',\n              'src/core/perf/operators/filter.js',\n\n              // Aggregate operators\n              'src/core/linq/observable/_extremaby.js',\n              'src/core/linq/observable/_firstonly.js',\n              'src/core/perf/operators/reduce.js', // scan, startwith, finalvalue\n              'src/core/linq/observable/some.js',  // where\n              'src/core/linq/observable/isempty.js', // any, select\n              'src/core/linq/observable/every.js', // where, any\n              'src/core/linq/observable/includes.js', // where, any\n              'src/core/linq/observable/count.js', // where, aggregate\n              'src/core/linq/observable/indexof.js',\n              'src/core/linq/observable/sum.js', // select, aggregate\n              'src/core/linq/observable/minby.js', // _extremaby\n              'src/core/linq/observable/min.js',   // minby, _firstonly\n              'src/core/linq/observable/maxby.js', // _extremaby\n              'src/core/linq/observable/max.js',   // max, _firstonly\n              'src/core/linq/observable/average.js',   // select, scan, aggregate, finalvalue\n              'src/core/linq/observable/sequenceequal.js',   // compositedisposable\n              'src/core/linq/observable/elementat.js',\n              'src/core/linq/observable/single.js',\n              'src/core/linq/observable/first.js',\n              'src/core/linq/observable/last.js',\n              'src/core/linq/observable/_findvalue.js',\n              'src/core/linq/observable/find.js', // _findvalue, where\n              'src/core/linq/observable/findindex.js', // _findvalue, where\n              'src/core/linq/observable/toset.js',\n              'src/core/linq/observable/tomap.js',\n              'src/core/linq/observable/slice.js',\n              'src/core/linq/observable/lastindexof.js',\n\n              // Async compat operators\n              'src/core/linq/observable/spawn.js',\n              'src/core/linq/observable/start.js', // toasync\n              'src/core/linq/observable/toasync.js', // asyncsubject, asObservable\n              'src/core/perf/operators/fromcallback.js',\n              'src/core/perf/operators/fromnodecallback.js',\n              'src/core/linq/observable/fromevent.js', // publish\n              'src/core/linq/observable/fromeventpattern.js', // publish\n              'src/core/linq/observable/startasync.js',\n\n              // Backpressure operators\n              'src/core/backpressure/pausable.js',\n              'src/core/backpressure/pausablebuffered.js',\n              'src/core/backpressure/controlled.js',\n              'src/core/backpressure/stopandwait.js',\n              'src/core/backpressure/windowed.js',\n              'src/core/linq/observable/pipe.js',\n\n              // Binding operators\n              'src/core/linq/observable/multicast.js', // ConnectableObservable\n              'src/core/linq/observable/publish.js',   // mulitcast, Subject\n              'src/core/linq/observable/share.js',   // mulitcast, Subject, Reference counted\n              'src/core/linq/observable/publishlast.js', // multicast, AsyncSubject\n              'src/core/linq/observable/publishvalue.js', // multicast, BehaviorSubject\n              'src/core/linq/observable/sharevalue.js', // multicast, BehaviorSubject, Reference counted\n              'src/core/linq/observable/replay.js', // multicast, ReplaySubject\n              'src/core/linq/observable/sharereplay.js',\n              'src/core/subjects/innersubscription.js',\n              'src/core/linq/connectableobservable.js',\n              'src/core/linq/observable/singleinstance.js',\n\n              // Coincidence operators\n              'src/core/linq/observable/join.js', // SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, Dictionary\n              'src/core/linq/observable/groupjoin.js', // SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, Dictionary\n              'src/core/linq/observable/buffer.js', // window, selectMany, toArray\n              'src/core/linq/observable/window.js', // CompositeDisposable, RefCountDisposable, Subject, SingleAssignmentDisposable\n              'src/core/linq/observable/pairwise.js',\n              'src/core/linq/observable/partition.js',\n\n              // Experimental operators\n              'src/core/linq/enumerable/while.js', // Enumerable\n              'src/core/linq/observable/let.js',\n              'src/core/linq/observable/if.js', // defer, empty\n              'src/core/linq/observable/for.js', // Enumerable.forEach, concatproto\n              'src/core/linq/observable/while.js', // Enumerable.while, concatproto\n              'src/core/linq/observable/dowhile.js', // Enumerable.while, concat\n              'src/core/linq/observable/case.js', // defer, empty\n              'src/core/linq/observable/expand.js', // immediateScheduler, SerialDisposable, CompositeDisposable, SingleAssignmentDisposable\n              'src/core/linq/observable/forkjoin.js', // CompositeDisposable\n              'src/core/linq/observable/forkjoinproto.js', // SingleAssignmentDisposable, CompositeDisposable\n              'src/core/linq/observable/manyselect.js', // ImmediateScheduler, CurrentThreadScheduler, select, do, observeOn\n\n              // Join pattern operators\n              'src/core/internal/map.js',\n              'src/core/joins/pattern.js',\n              'src/core/joins/plan.js',\n              'src/core/joins/activeplan.js',\n              'src/core/joins/joinobserver.js',\n              'src/core/linq/observable/and.js', // Pattern\n              'src/core/linq/observable/thendo.js', // Pattern\n              'src/core/linq/observable/when.js', // CompositeDisposable\n\n              // Time based operators\n              'src/core/linq/observable/_observabletimer.js', // AnonymousObservable\n              'src/core/linq/observable/_observabletimerdateandperiod.js', // AnonymousObservable, normalizeTime\n\n              'src/core/linq/observable/_observabletimertimespanandperiod.js', // AnonymousObservable, defer, _observabletimerdateandperiod\n              'src/core/linq/observable/interval.js', // timeoutScheduler, _observabletimertimespanandperiod\n              'src/core/linq/observable/timer.js', // timeoutScheduler, _observabletimerdate, _observabletimerdateandperiod, _observabletimertimespan, _observabletimertimespanandperiod\n              'src/core/linq/observable/delay.js', // AnonymousObservable, timeoutScheduler, SerialDisposable, materialize, timestamp\n              'src/core/linq/observable/debounce.js', // AnonymousObservable, SerialDisposable, timeoutScheduler, SingleAssignmentDisposable, CompositeDisposable\n              'src/core/linq/observable/windowwithtime.js', // AnonymousObservable, SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, addref, subject\n              'src/core/linq/observable/windowwithtimeorcount.js', // AnonymousObservable, SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, addref, subject\n              'src/core/linq/observable/bufferwithtime.js', // windowwithtime, selectMany, toArray\n              'src/core/linq/observable/bufferwithtimeorcount.js', // windowwithtimeorcount, selectMany, toArray\n              'src/core/linq/observable/timeinterval.js', // timeoutScheduler, defer, select\n              'src/core/linq/observable/timestamp.js', // timeoutScheduler, select\n              'src/core/linq/observable/sample.js', // AnonymousObservable, CompositeDisposable, interval, timeoutScheduler\n              'src/core/linq/observable/timeout.js', // AnonymousObservable, timeoutScheduler, throw, SingleAssignmentDisposable, SerialDisposable, CompositeDisposable\n              'src/core/linq/observable/generatewithabsolutetime.js', // timeoutScheduler, AnonymousObservable\n              'src/core/linq/observable/generatewithrelativetime.js', // timeoutScheduler, AnonymousObservable\n              'src/core/linq/observable/delaysubscription.js', // delayWithSelector, timer, empty\n              'src/core/linq/observable/skiplastwithtime.js',\n              'src/core/linq/observable/takelastwithtime.js',\n              'src/core/linq/observable/takelastbufferwithtime.js',\n              'src/core/linq/observable/takewithtime.js',\n              'src/core/linq/observable/skipwithtime.js',\n              'src/core/linq/observable/skipuntilwithtime.js',\n              'src/core/linq/observable/takeuntilwithtime.js',\n              'src/core/linq/observable/throttle.js',\n\n              // Experimental Flattening\n              'src/core/linq/observable/switchfirst.js',\n              'src/core/perf/operators/flatmapfirst.js',\n              'src/core/perf/operators/flatmapwithmaxconcurrent.js',\n\n              // Transducers\n              'src/core/linq/observable/transduce.js',\n\n              // Virtual time\n              'src/core/concurrency/virtualtimescheduler.js',\n              'src/core/concurrency/historicalscheduler.js',\n\n              'src/core/testing/reactivetest.js',\n              'src/core/testing/recorded.js',\n              'src/core/testing/subscription.js',\n              'src/core/testing/mockdisposable.js',\n              'src/core/testing/mockobserver.js',\n              'src/core/testing/mockpromise.js',\n              'src/core/testing/hotobservable.js',\n              'src/core/testing/coldobservable.js',\n              'src/core/testing/testscheduler.js',\n\n              'src/core/anonymousobservable.js',\n              'src/core/autodetachobserver.js',\n              'src/core/linq/groupedobservable.js',\n              'src/core/subjects/innersubscription.js',\n              'src/core/subjects/subject.js',\n              'src/core/subjects/asyncsubject.js',\n              'src/core/subjects/anonymoussubject.js',\n              'src/core/subjects/behaviorsubject.js',\n              'src/core/subjects/replaysubject.js',\n              'src/core/backpressure/pauser.js',\n              'src/core/headers/exports.js',\n\n              // End long stack traces\n              'src/core/longstacktraces/longstackend.js',\n\n              'src/core/headers/outro.js',\n            ],\n            dest: 'dist/rx.all.compat.js'\n          },\n          main: {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/intro.js',\n              'src/core/headers/basicheader.js',\n\n              // Stack trace start\n              'src/core/internal/trycatch.js',\n              'src/core/longstacktraces/longstackbegin.js',\n              'src/core/longstacktraces/longstacktraces.js',\n\n              'src/core/internal/errors.js',\n\n              'src/core/headers/enumeratorheader.js',\n\n              'src/core/internal/bindcallback.js',\n              'src/core/internal/dontenums.js',\n              'src/core/internal/isequal.js',\n              'src/core/internal/util.js',\n              'src/core/disposables/compositedisposable.js',\n              'src/core/disposables/disposable.js',\n              'src/core/disposables/booleandisposable.js',\n              'src/core/disposables/binarydisposable.js',\n              'src/core/disposables/refcountdisposable.js',\n              'src/core/disposables/scheduleddisposable.js',\n              'src/core/concurrency/scheduleditem.js',\n              'src/core/concurrency/scheduler.js',\n              'src/core/concurrency/scheduler.recursive.js',\n              'src/core/concurrency/scheduler.periodic.js',\n              'src/core/concurrency/scheduler.wrappers.js',\n              'src/core/concurrency/scheduleperiodicrecursive.js',\n              'src/core/concurrency/immediatescheduler.js',\n              'src/core/concurrency/currentthreadscheduler.js',\n              'src/core/concurrency/defaultscheduler.js',\n              'src/core/concurrency/catchscheduler.js',\n              'src/core/internal/priorityqueue.js',\n              'src/core/notification.js',\n              'src/core/observer.js',\n              'src/core/abstractobserver.js',\n              'src/core/anonymousobserver.js',\n              'src/core/checkedobserver.js',\n              'src/core/scheduledobserver.js',\n              'src/core/observeonobserver.js',\n              'src/core/observable.js',\n              'src/core/perf/observablebase.js',\n              'src/core/perf/operators/flatmapbase.js',\n              'src/core/enumerable.js',\n\n              // Concurrency\n              'src/core/linq/observable/observeon.js', // ObserveOnObserver\n              'src/core/linq/observable/subscribeon.js', // SingleAssignmentDisposable, SerialDisposable, ScheduleDisposable\n\n              // Async\n              'src/core/perf/operators/frompromise.js', // AsyncSubject, asObservable\n              'src/core/linq/observable/topromise.js',\n\n              // Creation\n              'src/core/perf/operators/toarray.js',\n              'src/core/linq/observable/create.js',\n              'src/core/linq/observable/defer.js',\n              'src/core/perf/operators/empty.js',\n              'src/core/perf/operators/from.js',\n              'src/core/perf/operators/fromarrayobservable.js','src/core/perf/operators/fromarray.js',\n              'src/core/linq/observable/generate.js',\n              'src/core/perf/operators/never.js',\n              'src/core/perf/operators/of.js',\n              'src/core/perf/operators/pairs.js',\n              'src/core/perf/operators/range.js',\n              'src/core/perf/operators/repeat.js',\n              'src/core/perf/operators/just.js',\n              'src/core/perf/operators/throw.js',\n              'src/core/linq/observable/using.js',\n\n              // Multiple\n              'src/core/linq/observable/ambproto.js',\n              'src/core/linq/observable/amb.js',\n              'src/core/linq/observable/catchproto.js',\n              'src/core/linq/observable/catch.js',\n              'src/core/linq/observable/combinelatestproto.js',\n              'src/core/perf/operators/combinelatest.js',\n              'src/core/linq/observable/concatproto.js',\n              'src/core/perf/operators/concat.js',\n              'src/core/linq/observable/concatall.js',\n              'src/core/perf/operators/mergeconcat.js',\n              'src/core/linq/observable/merge.js',\n              'src/core/linq/observable/mergedelayerror.js',\n              'src/core/perf/operators/mergeall.js',\n              'src/core/linq/observable/onerrorresumenextproto.js',\n              'src/core/linq/observable/onerrorresumenext.js',\n              'src/core/perf/operators/skipuntil.js',\n              'src/core/perf/operators/switch.js',\n              'src/core/perf/operators/takeuntil.js',\n              'src/core/perf/operators/withlatestfrom.js',\n              'src/core/perf/operators/zip.js',\n              'src/core/linq/observable/zip.js',\n              'src/core/linq/observable/zipiterable.js',\n\n              // Single\n              'src/core/linq/observable/asobservable.js',\n              'src/core/linq/observable/bufferwithcount.js',\n              'src/core/linq/observable/dematerialize.js',\n              'src/core/perf/operators/distinctuntilchanged.js',\n              'src/core/perf/operators/tap.js',\n              'src/core/perf/operators/finally.js',\n              'src/core/perf/operators/ignoreelements.js',\n              'src/core/linq/observable/materialize.js',\n              'src/core/linq/observable/repeatproto.js',\n              'src/core/linq/observable/retry.js',\n              'src/core/linq/observable/retrywhen.js',\n              'src/core/linq/observable/repeatwhen.js',\n              'src/core/perf/operators/scan.js',\n              'src/core/linq/observable/skiplast.js',\n              'src/core/linq/observable/startwith.js',\n              'src/core/linq/observable/takelast.js',\n              'src/core/linq/observable/takelastbuffer.js',\n              'src/core/linq/observable/windowwithcount.js',\n\n              // Standard query operators\n              'src/core/perf/operators/concatmap.js',\n              'src/core/linq/observable/concatmapobserver.js',\n              'src/core/linq/observable/defaultifempty.js',\n              'src/core/linq/observable/distinct.js',\n              'src/core/perf/operators/map.js',\n              'src/core/linq/observable/pluck.js',\n              'src/core/linq/observable/selectmanyobserver.js',\n              'src/core/perf/operators/flatmap.js',\n              'src/core/perf/operators/flatmaplatest.js',\n              'src/core/perf/operators/skip.js',\n              'src/core/linq/observable/skipwhile.js',\n              'src/core/perf/operators/take.js',\n              'src/core/linq/observable/takewhile.js',\n              'src/core/perf/operators/filter.js',\n\n              // Transducers\n              'src/core/linq/observable/transduce.js',\n\n              'src/core/anonymousobservable.js',\n              'src/core/autodetachobserver.js',\n              'src/core/subjects/innersubscription.js',\n              'src/core/subjects/subject.js',\n              'src/core/subjects/asyncsubject.js',\n              'src/core/subjects/anonymoussubject.js',\n              'src/core/headers/exports.js',\n\n              // Long stack trace end\n              'src/core/longstacktraces/longstackend.js',\n\n              'src/core/headers/outro.js',\n            ],\n            dest: 'dist/rx.js'\n          },\n          'main-compat': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/intro.js',\n              'src/core/headers/basicheader-compat.js',\n\n              // Stack trace start\n              'src/core/internal/trycatch.js',\n              'src/core/longstacktraces/longstackbegin.js',\n              'src/core/longstacktraces/longstacktraces.js',\n\n              'src/core/internal/polyfills.js',\n              'src/core/internal/errors.js',\n\n              'src/core/headers/enumeratorheader.js',\n\n              'src/core/internal/bindcallback.js',\n              'src/core/internal/dontenums.js',\n              'src/core/internal/isequal.js',\n              'src/core/internal/util.js',\n              'src/core/disposables/compositedisposable.js',\n              'src/core/disposables/disposable.js',\n              'src/core/disposables/booleandisposable.js',\n              'src/core/disposables/binarydisposable.js',\n              'src/core/disposables/refcountdisposable.js',\n              'src/core/disposables/scheduleddisposable.js',\n              'src/core/concurrency/scheduleditem.js',\n              'src/core/concurrency/scheduler.js',\n              'src/core/concurrency/scheduler.recursive.js',\n              'src/core/concurrency/scheduler.periodic.js',\n              'src/core/concurrency/scheduler.wrappers.js',\n              'src/core/concurrency/scheduleperiodicrecursive.js',\n              'src/core/concurrency/immediatescheduler.js',\n              'src/core/concurrency/currentthreadscheduler.js',\n              'src/core/concurrency/defaultscheduler.js',\n              'src/core/concurrency/catchscheduler.js',\n              'src/core/internal/priorityqueue.js',\n              'src/core/notification.js',\n              'src/core/observer.js',\n              'src/core/abstractobserver.js',\n              'src/core/anonymousobserver.js',\n              'src/core/checkedobserver.js',\n              'src/core/scheduledobserver.js',\n              'src/core/observeonobserver.js',\n              'src/core/observable.js',\n              'src/core/perf/observablebase.js',\n              'src/core/perf/operators/flatmapbase.js',\n              'src/core/enumerable.js',\n\n              'src/core/linq/observable/observeon.js', // ObserveOnObserver\n              'src/core/linq/observable/subscribeon.js', // SingleAssignmentDisposable, SerialDisposable, ScheduleDisposable\n\n              // Async\n              'src/core/perf/operators/frompromise.js', // AsyncSubject, asObservable\n              'src/core/linq/observable/topromise.js',\n\n              // Creation\n              'src/core/perf/operators/toarray.js',\n              'src/core/linq/observable/create.js',\n              'src/core/linq/observable/defer.js',\n              'src/core/perf/operators/empty.js',\n              'src/core/perf/operators/from.js',\n              'src/core/perf/operators/fromarrayobservable.js','src/core/perf/operators/fromarray.js',\n              'src/core/linq/observable/generate.js',\n              'src/core/perf/operators/never.js',\n              'src/core/perf/operators/of.js',\n              'src/core/perf/operators/pairs.js',\n              'src/core/perf/operators/range.js',\n              'src/core/perf/operators/repeat.js',\n              'src/core/perf/operators/just.js',\n              'src/core/perf/operators/throw.js',\n              'src/core/linq/observable/using.js',\n\n              // Multiple\n              'src/core/linq/observable/ambproto.js',\n              'src/core/linq/observable/amb.js',\n              'src/core/linq/observable/catchproto.js',\n              'src/core/linq/observable/catch.js',\n              'src/core/linq/observable/combinelatestproto.js',\n              'src/core/perf/operators/combinelatest.js',\n              'src/core/linq/observable/concatproto.js',\n              'src/core/perf/operators/concat.js',\n              'src/core/linq/observable/concatall.js',\n              'src/core/perf/operators/mergeconcat.js',\n              'src/core/linq/observable/merge.js',\n              'src/core/perf/operators/mergeall.js',\n              'src/core/linq/observable/mergedelayerror.js',\n              'src/core/linq/observable/onerrorresumenextproto.js',\n              'src/core/linq/observable/onerrorresumenext.js',\n              'src/core/perf/operators/skipuntil.js',\n              'src/core/perf/operators/switch.js',\n              'src/core/perf/operators/takeuntil.js',\n              'src/core/perf/operators/withlatestfrom.js',\n              'src/core/perf/operators/zip.js',\n              'src/core/linq/observable/zip.js',\n              'src/core/linq/observable/zipiterable.js',\n\n              // Single\n              'src/core/linq/observable/asobservable.js',\n              'src/core/linq/observable/bufferwithcount.js',\n              'src/core/linq/observable/dematerialize.js',\n              'src/core/perf/operators/distinctuntilchanged.js',\n              'src/core/perf/operators/tap.js',\n              'src/core/perf/operators/finally.js',\n              'src/core/perf/operators/ignoreelements.js',\n              'src/core/linq/observable/materialize.js',\n              'src/core/linq/observable/repeatproto.js',\n              'src/core/linq/observable/retry.js',\n              'src/core/linq/observable/retrywhen.js',\n              'src/core/linq/observable/repeatwhen.js',\n              'src/core/perf/operators/scan.js',\n              'src/core/linq/observable/skiplast.js',\n              'src/core/linq/observable/startwith.js',\n              'src/core/linq/observable/takelast.js',\n              'src/core/linq/observable/takelastbuffer.js',\n              'src/core/linq/observable/windowwithcount.js',\n\n              // Standard query operators\n              'src/core/perf/operators/concatmap.js',\n              'src/core/linq/observable/concatmapobserver.js',\n              'src/core/linq/observable/defaultifempty.js',\n              'src/core/linq/observable/distinct.js',\n              'src/core/perf/operators/map.js',\n              'src/core/linq/observable/pluck.js',\n              'src/core/perf/operators/flatmap.js',\n              'src/core/linq/observable/selectmanyobserver.js',\n              'src/core/perf/operators/flatmaplatest.js',\n              'src/core/perf/operators/skip.js',\n              'src/core/linq/observable/skipwhile.js',\n              'src/core/perf/operators/take.js',\n              'src/core/linq/observable/takewhile.js',\n              'src/core/perf/operators/filter.js',\n\n              // Transducers\n              'src/core/linq/observable/transduce.js',\n\n              'src/core/anonymousobservable.js',\n              'src/core/autodetachobserver.js',\n              'src/core/subjects/innersubscription.js',\n              'src/core/subjects/subject.js',\n              'src/core/subjects/asyncsubject.js',\n              'src/core/subjects/anonymoussubject.js',\n              'src/core/headers/exports.js',\n\n              'src/core/longstacktraces/longstackend.js',\n\n              'src/core/headers/outro.js',\n            ],\n            dest: 'dist/rx.compat.js'\n          },\n          lite: {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/intro.js',\n              'src/core/headers/liteheader.js',\n\n              // Stack trace start\n              'src/core/internal/trycatch.js',\n              'src/core/longstacktraces/longstackbegin.js',\n              'src/core/longstacktraces/longstacktraces.js',\n\n              'src/core/internal/errors.js',\n\n              'src/core/headers/enumeratorheader.js',\n\n              'src/core/internal/bindcallback.js',\n              'src/core/internal/dontenums.js',\n              'src/core/internal/isequal.js',\n              'src/core/internal/util.js',\n              'src/core/disposables/compositedisposable.js',\n              'src/core/disposables/disposable.js',\n              'src/core/disposables/booleandisposable.js',\n              'src/core/disposables/binarydisposable.js',\n              'src/core/disposables/refcountdisposable.js',\n\n              'src/core/concurrency/scheduleditem.js',\n              'src/core/concurrency/scheduler.js',\n              'src/core/concurrency/scheduler.recursive.js',\n              'src/core/concurrency/scheduler.periodic.js',\n              'src/core/concurrency/immediatescheduler.js',\n              'src/core/concurrency/currentthreadscheduler.js',\n              'src/core/concurrency/scheduleperiodicrecursive.js',\n              'src/core/concurrency/defaultscheduler.js',\n              'src/core/internal/priorityqueue.js',\n\n              'src/core/notification.js',\n              'src/core/observer-lite.js',\n              'src/core/abstractobserver.js',\n              'src/core/anonymousobserver.js',\n              'src/core/observable.js',\n              'src/core/scheduledobserver.js',\n              'src/core/perf/observablebase.js',\n              'src/core/perf/operators/flatmapbase.js',\n              'src/core/enumerable.js',\n\n              // Creation\n              'src/core/perf/operators/toarray.js',\n              'src/core/linq/observable/create.js',\n              'src/core/linq/observable/defer.js',\n              'src/core/perf/operators/empty.js',\n              'src/core/perf/operators/from.js',\n              'src/core/perf/operators/fromarrayobservable.js','src/core/perf/operators/fromarray.js',\n              'src/core/perf/operators/never.js',\n              'src/core/perf/operators/of.js',\n              'src/core/perf/operators/pairs.js',\n              'src/core/perf/operators/range.js',\n              'src/core/perf/operators/repeat.js',\n              'src/core/perf/operators/just.js',\n              'src/core/perf/operators/throw.js',\n\n              // Multiple\n              'src/core/linq/observable/catchproto.js',\n              'src/core/linq/observable/catch.js',\n              'src/core/linq/observable/combinelatestproto.js',\n              'src/core/perf/operators/combinelatest.js',\n              'src/core/linq/observable/concatproto.js',\n              'src/core/perf/operators/concat.js',\n              'src/core/linq/observable/concatall.js',\n              'src/core/perf/operators/mergeconcat.js',\n              'src/core/linq/observable/merge.js',\n              'src/core/linq/observable/mergedelayerror.js',\n              'src/core/perf/operators/mergeall.js',\n              'src/core/perf/operators/skipuntil.js',\n              'src/core/perf/operators/switch.js',\n              'src/core/perf/operators/takeuntil.js',\n              'src/core/perf/operators/withlatestfrom.js',\n              'src/core/perf/operators/zip.js',\n              'src/core/linq/observable/zip.js',\n              'src/core/linq/observable/zipiterable.js',\n\n              // Single\n              'src/core/linq/observable/asobservable.js',\n              'src/core/linq/observable/dematerialize.js',\n              'src/core/perf/operators/distinctuntilchanged.js',\n              'src/core/perf/operators/tap.js',\n              'src/core/perf/operators/finally.js',\n              'src/core/perf/operators/ignoreelements.js',\n              'src/core/linq/observable/materialize.js',\n              'src/core/linq/observable/repeatproto.js',\n              'src/core/linq/observable/retry.js',\n              'src/core/linq/observable/retrywhen.js',\n              'src/core/linq/observable/repeatwhen.js',\n              'src/core/perf/operators/scan.js',\n              'src/core/linq/observable/skiplast.js',\n              'src/core/linq/observable/startwith.js',\n              'src/core/linq/observable/takelast.js',\n\n              // Standard Query Operators\n              'src/core/perf/operators/concatmap.js',\n              'src/core/perf/operators/map.js',\n              'src/core/linq/observable/pluck.js',\n              'src/core/perf/operators/flatmap.js',\n              'src/core/perf/operators/flatmaplatest.js',\n              'src/core/perf/operators/skip.js',\n              'src/core/linq/observable/skipwhile.js',\n              'src/core/perf/operators/take.js',\n              'src/core/linq/observable/takewhile.js',\n              'src/core/perf/operators/filter.js',\n\n              // Async Operators\n              'src/core/perf/operators/fromcallback.js',\n              'src/core/perf/operators/fromnodecallback.js',\n              'src/core/linq/observable/fromevent.js', // publish\n              'src/core/linq/observable/fromeventpattern.js', // publish\n              'src/core/perf/operators/frompromise.js', // AsyncSubject, asObservable\n              'src/core/linq/observable/topromise.js',\n              'src/core/linq/observable/startasync.js',\n\n              // Binding Operators\n              'src/core/linq/observable/multicast.js', // ConnectableObservable\n              'src/core/linq/observable/publish.js',   // mulitcast, Subject\n              'src/core/linq/observable/share.js',   // mulitcast, Subject, Reference counted\n              'src/core/linq/observable/publishlast.js', // multicast, AsyncSubject\n              'src/core/linq/observable/publishvalue.js', // multicast, BehaviorSubject\n              'src/core/linq/observable/sharevalue.js', // multicast, BehaviorSubject, Reference counted\n              'src/core/linq/observable/replay.js', // multicast, ReplaySubject\n              'src/core/linq/observable/sharereplay.js',\n              'src/core/linq/connectableobservable.js',\n\n              // Time operators\n              'src/core/linq/observable/_observabletimer.js', // AnonymousObservable\n              'src/core/linq/observable/_observabletimerdateandperiod.js', // AnonymousObservable, normalizeTime\n\n              'src/core/linq/observable/_observabletimertimespanandperiod.js', // AnonymousObservable, defer, _observabletimerdateandperiod\n              'src/core/linq/observable/interval.js', // timeoutScheduler, _observabletimertimespanandperiod\n              'src/core/linq/observable/timer.js', // timeoutScheduler, _observabletimerdate, _observabletimerdateandperiod, _observabletimertimespan, _observabletimertimespanandperiod\n              'src/core/linq/observable/delay.js', // AnonymousObservable, timeoutScheduler, SerialDisposable, materialize, timestamp\n              'src/core/linq/observable/debounce.js', // AnonymousObservable, SerialDisposable, timeoutScheduler, SingleAssignmentDisposable, CompositeDisposable\n              'src/core/linq/observable/timestamp.js', // timeoutScheduler, select\n              'src/core/linq/observable/sample.js', // AnonymousObservable, CompositeDisposable, interval, timeoutScheduler\n              'src/core/linq/observable/timeout.js', // AnonymousObservable, timeoutScheduler, throw, SingleAssignmentDisposable, SerialDisposable, CompositeDisposable\n              'src/core/linq/observable/throttle.js',\n\n              // Backpressure operators\n              'src/core/backpressure/pausable.js',\n              'src/core/backpressure/pausablebuffered.js',\n              'src/core/backpressure/controlled.js',\n              'src/core/linq/observable/pipe.js',\n\n              // Transducers\n              'src/core/linq/observable/transduce.js',\n\n              'src/core/anonymousobservable.js',\n              'src/core/autodetachobserver.js',\n              'src/core/subjects/innersubscription.js',\n              'src/core/subjects/subject.js',\n              'src/core/subjects/asyncsubject.js',\n              'src/core/subjects/anonymoussubject.js',\n              'src/core/subjects/behaviorsubject.js',\n              'src/core/subjects/replaysubject.js',\n              'src/core/backpressure/pauser.js',\n\n              'src/core/headers/exports.js',\n\n              // End long stack traces\n              'src/core/longstacktraces/longstackend.js',\n\n              'src/core/headers/outro.js',\n            ],\n            dest: 'dist/rx.lite.js'\n          },\n          'lite-compat': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/intro.js',\n              'src/core/headers/liteheader-compat.js',\n\n              // Stack trace start\n              'src/core/internal/trycatch.js',\n              'src/core/longstacktraces/longstackbegin.js',\n              'src/core/longstacktraces/longstacktraces.js',\n\n              'src/core/internal/polyfills.js',\n              'src/core/internal/errors.js',\n\n              'src/core/headers/enumeratorheader.js',\n\n              'src/core/internal/bindcallback.js',\n              'src/core/internal/dontenums.js',\n              'src/core/internal/isequal.js',\n              'src/core/internal/util.js',\n              'src/core/disposables/compositedisposable.js',\n              'src/core/disposables/disposable.js',\n              'src/core/disposables/booleandisposable.js',\n              'src/core/disposables/binarydisposable.js',\n              'src/core/disposables/refcountdisposable.js',\n\n              'src/core/concurrency/scheduleditem.js',\n              'src/core/concurrency/scheduler.js',\n              'src/core/concurrency/scheduler.recursive.js',\n              'src/core/concurrency/scheduler.periodic.js',\n              'src/core/concurrency/immediatescheduler.js',\n              'src/core/concurrency/currentthreadscheduler.js',\n              'src/core/concurrency/scheduleperiodicrecursive.js',\n              'src/core/concurrency/defaultscheduler.js',\n              'src/core/internal/priorityqueue.js',\n\n              'src/core/notification.js',\n              'src/core/observer-lite.js',\n              'src/core/abstractobserver.js',\n              'src/core/anonymousobserver.js',\n              'src/core/observable.js',\n              'src/core/perf/observablebase.js',\n              'src/core/perf/operators/flatmapbase.js',\n              'src/core/enumerable.js',\n              'src/core/scheduledobserver.js',\n\n              // Creation\n              'src/core/perf/operators/toarray.js',\n              'src/core/linq/observable/create.js',\n              'src/core/linq/observable/defer.js',\n              'src/core/perf/operators/empty.js',\n              'src/core/perf/operators/from.js',\n              'src/core/perf/operators/fromarrayobservable.js','src/core/perf/operators/fromarray.js',\n              'src/core/perf/operators/never.js',\n              'src/core/perf/operators/of.js',\n              'src/core/perf/operators/pairs.js',\n              'src/core/perf/operators/range.js',\n              'src/core/perf/operators/repeat.js',\n              'src/core/perf/operators/just.js',\n              'src/core/perf/operators/throw.js',\n\n              // Multiple\n              'src/core/linq/observable/catchproto.js',\n              'src/core/linq/observable/catch.js',\n              'src/core/linq/observable/combinelatestproto.js',\n              'src/core/perf/operators/combinelatest.js',\n              'src/core/linq/observable/concatproto.js',\n              'src/core/perf/operators/concat.js',\n              'src/core/linq/observable/concatall.js',\n              'src/core/perf/operators/mergeconcat.js',\n              'src/core/linq/observable/merge.js',\n              'src/core/perf/operators/mergeall.js',\n              'src/core/linq/observable/mergedelayerror.js',\n              'src/core/perf/operators/skipuntil.js',\n              'src/core/perf/operators/switch.js',\n              'src/core/perf/operators/takeuntil.js',\n              'src/core/perf/operators/withlatestfrom.js',\n              'src/core/perf/operators/zip.js',\n              'src/core/linq/observable/zip.js',\n              'src/core/linq/observable/zipiterable.js',\n\n              // Single\n              'src/core/linq/observable/asobservable.js',\n              'src/core/linq/observable/dematerialize.js',\n              'src/core/perf/operators/distinctuntilchanged.js',\n              'src/core/perf/operators/tap.js',\n              'src/core/perf/operators/finally.js',\n              'src/core/perf/operators/ignoreelements.js',\n              'src/core/linq/observable/materialize.js',\n              'src/core/linq/observable/repeatproto.js',\n              'src/core/linq/observable/retry.js',\n              'src/core/linq/observable/retrywhen.js',\n              'src/core/linq/observable/repeatwhen.js',\n              'src/core/perf/operators/scan.js',\n              'src/core/linq/observable/skiplast.js',\n              'src/core/linq/observable/startwith.js',\n              'src/core/linq/observable/takelast.js',\n\n              // Standard Query Operators\n              'src/core/perf/operators/concatmap.js',\n              'src/core/perf/operators/map.js',\n              'src/core/linq/observable/pluck.js',\n              'src/core/perf/operators/flatmap.js',\n              'src/core/perf/operators/flatmaplatest.js',\n              'src/core/perf/operators/skip.js',\n              'src/core/linq/observable/skipwhile.js',\n              'src/core/perf/operators/take.js',\n              'src/core/linq/observable/takewhile.js',\n              'src/core/perf/operators/filter.js',\n\n              // Async Operators\n              'src/core/perf/operators/fromcallback.js',\n              'src/core/perf/operators/fromnodecallback.js',\n              'src/core/linq/observable/fromevent.js', // publish\n              'src/core/linq/observable/fromeventpattern.js', // publish\n              'src/core/perf/operators/frompromise.js', // AsyncSubject, asObservable\n              'src/core/linq/observable/topromise.js',\n              'src/core/linq/observable/startasync.js',\n\n              // Binding Operators\n              'src/core/linq/observable/multicast.js', // ConnectableObservable\n              'src/core/linq/observable/publish.js',   // mulitcast, Subject\n              'src/core/linq/observable/share.js',   // mulitcast, Subject, Reference counted\n              'src/core/linq/observable/publishlast.js', // multicast, AsyncSubject\n              'src/core/linq/observable/publishvalue.js', // multicast, BehaviorSubject\n              'src/core/linq/observable/sharevalue.js', // multicast, BehaviorSubject, Reference counted\n              'src/core/linq/observable/replay.js', // multicast, ReplaySubject\n              'src/core/linq/observable/sharereplay.js',\n              'src/core/linq/connectableobservable.js',\n\n              // Time operators\n              'src/core/linq/observable/_observabletimer.js', // AnonymousObservable\n              'src/core/linq/observable/_observabletimerdateandperiod.js', // AnonymousObservable, normalizeTime\n\n              'src/core/linq/observable/_observabletimertimespanandperiod.js', // AnonymousObservable, defer, _observabletimerdateandperiod\n              'src/core/linq/observable/interval.js', // timeoutScheduler, _observabletimertimespanandperiod\n              'src/core/linq/observable/timer.js', // timeoutScheduler, _observabletimerdate, _observabletimerdateandperiod, _observabletimertimespan, _observabletimertimespanandperiod\n              'src/core/linq/observable/delay.js', // AnonymousObservable, timeoutScheduler, SerialDisposable, materialize, timestamp\n              'src/core/linq/observable/debounce.js', // AnonymousObservable, SerialDisposable, timeoutScheduler, SingleAssignmentDisposable, CompositeDisposable\n              'src/core/linq/observable/timestamp.js', // timeoutScheduler, select\n              'src/core/linq/observable/sample.js', // AnonymousObservable, CompositeDisposable, interval, timeoutScheduler\n              'src/core/linq/observable/timeout.js', // AnonymousObservable, timeoutScheduler, throw, SingleAssignmentDisposable, SerialDisposable, CompositeDisposable\n              'src/core/linq/observable/throttle.js',\n\n              // Backpressure operators\n              'src/core/backpressure/pausable.js',\n              'src/core/backpressure/pausablebuffered.js',\n              'src/core/backpressure/controlled.js',\n              'src/core/linq/observable/pipe.js',\n\n              // Transducers\n              'src/core/linq/observable/transduce.js',\n\n              'src/core/anonymousobservable.js',\n              'src/core/autodetachobserver.js',\n              'src/core/subjects/innersubscription.js',\n              'src/core/subjects/subject.js',\n              'src/core/subjects/asyncsubject.js',\n              'src/core/subjects/anonymoussubject.js',\n              'src/core/subjects/behaviorsubject.js',\n              'src/core/subjects/replaysubject.js',\n              'src/core/backpressure/pauser.js',\n\n              'src/core/headers/exports.js',\n\n              // End long stack traces\n              'src/core/longstacktraces/longstackend.js',\n\n              'src/core/headers/outro.js',\n            ],\n            dest: 'dist/rx.lite.compat.js'\n          },\n          'lite-extras': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/liteintro.js',\n              'src/core/headers/liteextrasheader.js',\n              'src/core/internal/trycatch.js',\n\n              'src/core/disposables/scheduleddisposable.js',\n              'src/core/checkedobserver.js',\n              'src/core/observeonobserver.js',\n              'src/core/observer-extras.js',\n\n              // Concurrency\n              'src/core/linq/observable/observeon.js', // ObserveOnObserver\n              'src/core/linq/observable/subscribeon.js', // SingleAssignmentDisposable, SerialDisposable, ScheduleDisposable\n\n              // Creation\n              'src/core/linq/observable/generate.js',\n              'src/core/linq/observable/using.js',\n\n              // Multiple\n              'src/core/linq/observable/ambproto.js',\n              'src/core/linq/observable/amb.js',\n              'src/core/linq/observable/onerrorresumenextproto.js',\n              'src/core/linq/observable/onerrorresumenext.js',\n\n              // Single\n              'src/core/linq/observable/bufferwithcount.js',\n              'src/core/linq/observable/windowwithcount.js',\n              'src/core/linq/observable/takelastbuffer.js',\n\n              // Standard Query Operators\n              'src/core/linq/observable/defaultifempty.js',\n              'src/core/linq/observable/distinct.js',\n\n              'src/core/linq/observable/singleinstance.js',\n\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'dist/rx.lite.extras.js'\n          },\n          'lite-extras-compat': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/liteintro-compat.js',\n              'src/core/headers/liteextrasheader.js',\n              'src/core/internal/trycatch.js',\n\n              'src/core/disposables/scheduleddisposable.js',\n              'src/core/checkedobserver.js',\n              'src/core/observeonobserver.js',\n              'src/core/observer-extras.js',\n\n              // Concurrency\n              'src/core/linq/observable/observeon.js', // ObserveOnObserver\n              'src/core/linq/observable/subscribeon.js', // SingleAssignmentDisposable, SerialDisposable, ScheduleDisposable\n\n              // Creation\n              'src/core/linq/observable/generate.js',\n              'src/core/linq/observable/using.js',\n\n              // Multiple\n              'src/core/linq/observable/ambproto.js',\n              'src/core/linq/observable/amb.js',\n              'src/core/linq/observable/onerrorresumenextproto.js',\n              'src/core/linq/observable/onerrorresumenext.js',\n\n              // Single\n              'src/core/linq/observable/bufferwithcount.js',\n              'src/core/linq/observable/windowwithcount.js',\n              'src/core/linq/observable/takelastbuffer.js',\n\n              // Standard Query Operators\n              'src/core/linq/observable/defaultifempty.js',\n              'src/core/linq/observable/distinct.js',\n\n              'src/core/linq/observable/singleinstance.js',\n\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'dist/rx.lite.extras.compat.js'\n          },\n          backpressure: {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/subintro.js',\n              'src/core/headers/backpressureheader.js',\n              'src/core/internal/trycatch.js',\n\n              // Backpressure operators\n              'src/core/backpressure/pauser.js',\n              'src/core/backpressure/pausable.js',\n              'src/core/backpressure/pausablebuffered.js',\n              'src/core/backpressure/controlled.js',\n              'src/core/backpressure/stopandwait.js',\n              'src/core/backpressure/windowed.js',\n              'src/core/linq/observable/pipe.js',\n\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'dist/rx.backpressure.js'\n          },\n          'backpressure-lite': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/liteintro.js',\n              'src/core/headers/backpressureheader.js',\n              'src/core/internal/trycatch.js',\n\n              // Backpressure operators\n              'src/core/backpressure/stopandwait.js',\n              'src/core/backpressure/windowed.js',\n              'src/core/linq/observable/pipe.js',\n\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'modules/rx-lite-backpressure/rx.lite.backpressure.js'\n          },\n          'backpressure-lite-compat': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/liteintro-compat.js',\n              'src/core/headers/backpressureheader.js',\n              'src/core/internal/trycatch.js',\n\n              // Backpressure operators\n              'src/core/backpressure/stopandwait.js',\n              'src/core/backpressure/windowed.js',\n              'src/core/linq/observable/pipe.js',\n\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'modules/rx-lite-backpressure-compat/rx.lite.backpressure.compat.js'\n          },\n          aggregates: {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/subintro.js',\n              'src/core/headers/aggregatesheader.js',\n              'src/core/internal/trycatch.js',\n              'src/core/linq/observable/_extremaby.js',\n              'src/core/linq/observable/_firstonly.js',\n              'src/core/perf/operators/reduce.js', // scan, startwith, finalvalue\n              'src/core/linq/observable/some.js',  // where\n              'src/core/linq/observable/isempty.js', // any, select\n              'src/core/linq/observable/every.js', // where, any\n              'src/core/linq/observable/includes.js', // where, any\n              'src/core/linq/observable/count.js', // where, aggregate\n              'src/core/linq/observable/indexof.js',\n              'src/core/linq/observable/sum.js', // select, aggregate\n              'src/core/linq/observable/minby.js', // _extremaby\n              'src/core/linq/observable/min.js',   // minby, _firstonly\n              'src/core/linq/observable/maxby.js', // _extremaby\n              'src/core/linq/observable/max.js',   // max, _firstonly\n              'src/core/linq/observable/average.js',   // select, scan, aggregate, finalvalue\n              'src/core/linq/observable/sequenceequal.js',   // compositedisposable\n              'src/core/linq/observable/elementat.js',\n              'src/core/linq/observable/single.js',\n              'src/core/linq/observable/first.js',\n              'src/core/linq/observable/last.js',\n              'src/core/linq/observable/_findvalue.js',\n              'src/core/linq/observable/find.js', // _findvalue, where\n              'src/core/linq/observable/findindex.js', // _findvalue, where\n              'src/core/linq/observable/toset.js',\n              'src/core/linq/observable/tomap.js',\n              'src/core/linq/observable/slice.js',\n              'src/core/linq/observable/lastindexof.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'dist/rx.aggregates.js'\n          },\n          'aggregates-lite': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/liteintro.js',\n              'src/core/headers/aggregatesheader.js',\n              'src/core/internal/trycatch.js',\n              'src/core/linq/observable/_extremaby.js',\n              'src/core/linq/observable/_firstonly.js',\n              'src/core/perf/operators/reduce.js', // scan, startwith, finalvalue\n              'src/core/linq/observable/some.js',  // where\n              'src/core/linq/observable/isempty.js', // any, select\n              'src/core/linq/observable/every.js', // where, any\n              'src/core/linq/observable/includes.js', // where, any\n              'src/core/linq/observable/count.js', // where, aggregate\n              'src/core/linq/observable/indexof.js',\n              'src/core/linq/observable/sum.js', // select, aggregate\n              'src/core/linq/observable/minby.js', // _extremaby\n              'src/core/linq/observable/min.js',   // minby, _firstonly\n              'src/core/linq/observable/maxby.js', // _extremaby\n              'src/core/linq/observable/max.js',   // max, _firstonly\n              'src/core/linq/observable/average.js',   // select, scan, aggregate, finalvalue\n              'src/core/linq/observable/sequenceequal.js',   // compositedisposable\n              'src/core/linq/observable/elementat.js',\n              'src/core/linq/observable/single.js',\n              'src/core/linq/observable/first.js',\n              'src/core/linq/observable/last.js',\n              'src/core/linq/observable/_findvalue.js',\n              'src/core/linq/observable/find.js', // _findvalue, where\n              'src/core/linq/observable/findindex.js', // _findvalue, where\n              'src/core/linq/observable/toset.js',\n              'src/core/linq/observable/tomap.js',\n              'src/core/linq/observable/slice.js',\n              'src/core/linq/observable/lastindexof.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'modules/rx-lite-aggregates/rx.lite.aggregates.js'\n          },\n          'aggregates-lite-compat': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/liteintro-compat.js',\n              'src/core/headers/aggregatesheader.js',\n              'src/core/internal/trycatch.js',\n              'src/core/linq/observable/_extremaby.js',\n              'src/core/linq/observable/_firstonly.js',\n              'src/core/perf/operators/reduce.js', // scan, startwith, finalvalue\n              'src/core/linq/observable/some.js',  // where\n              'src/core/linq/observable/isempty.js', // any, select\n              'src/core/linq/observable/every.js', // where, any\n              'src/core/linq/observable/includes.js', // where, any\n              'src/core/linq/observable/count.js', // where, aggregate\n              'src/core/linq/observable/indexof.js',\n              'src/core/linq/observable/sum.js', // select, aggregate\n              'src/core/linq/observable/minby.js', // _extremaby\n              'src/core/linq/observable/min.js',   // minby, _firstonly\n              'src/core/linq/observable/maxby.js', // _extremaby\n              'src/core/linq/observable/max.js',   // max, _firstonly\n              'src/core/linq/observable/average.js',   // select, scan, aggregate, finalvalue\n              'src/core/linq/observable/sequenceequal.js',   // compositedisposable\n              'src/core/linq/observable/elementat.js',\n              'src/core/linq/observable/single.js',\n              'src/core/linq/observable/first.js',\n              'src/core/linq/observable/last.js',\n              'src/core/linq/observable/_findvalue.js',\n              'src/core/linq/observable/find.js', // _findvalue, where\n              'src/core/linq/observable/findindex.js', // _findvalue, where\n              'src/core/linq/observable/toset.js',\n              'src/core/linq/observable/tomap.js',\n              'src/core/linq/observable/slice.js',\n              'src/core/linq/observable/lastindexof.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'modules/rx-lite-aggregates-compat/rx.lite.aggregates.compat.js'\n          },\n          'async': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/asyncintro.js',\n              'src/core/headers/asyncheader.js',\n              'src/core/internal/trycatch.js',\n              'src/core/linq/observable/spawn.js',\n              'src/core/linq/observable/start.js', // toasync\n              'src/core/linq/observable/toasync.js', // AsyncSubject, asObservable\n              'src/core/perf/operators/fromcallback.js',\n              'src/core/perf/operators/fromnodecallback.js',\n              'src/core/linq/observable/fromevent.js', // publish\n              'src/core/linq/observable/fromeventpattern.js', // publish\n              'src/core/linq/observable/startasync.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'dist/rx.async.js'\n          },\n          'async-compat': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/asyncintro.js',\n              'src/core/headers/asyncheader.js',\n              'src/core/internal/trycatch.js',\n              'src/core/linq/observable/spawn.js',\n              'src/core/linq/observable/start.js', // toasync\n              'src/core/linq/observable/toasync.js', // asyncsubject, asObservable\n              'src/core/perf/operators/fromcallback.js',\n              'src/core/perf/operators/fromnodecallback.js',\n              'src/core/linq/observable/fromevent.js', // publish\n              'src/core/linq/observable/fromeventpattern.js', // publish\n              'src/core/linq/observable/startasync.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'dist/rx.async.compat.js'\n          },\n          'async-lite': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/liteintro.js',\n              'src/core/headers/asyncheader.js',\n              'src/core/linq/observable/spawn.js',\n              'src/core/linq/observable/start.js', // toasync\n              'src/core/linq/observable/startasync.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'modules/rx-lite-async/rx.lite.async.js'\n          },\n          'async-lite-compat': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/liteintro-compat.js',\n              'src/core/headers/asyncheader.js',\n              'src/core/linq/observable/spawn.js',\n              'src/core/linq/observable/start.js', // toasync\n              'src/core/linq/observable/startasync.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'modules/rx-lite-async-compat/rx.lite.async.compat.js'\n          },\n          binding: {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/subintro.js',\n              'src/core/headers/bindingheader.js',\n              'src/core/linq/observable/multicast.js', // ConnectableObservable\n              'src/core/linq/observable/publish.js',   // mulitcast, Subject\n              'src/core/linq/observable/share.js',   // mulitcast, Subject, Reference counted\n              'src/core/linq/observable/publishlast.js', // multicast, AsyncSubject\n              'src/core/linq/observable/publishvalue.js', // multicast, BehaviorSubject\n              'src/core/linq/observable/sharevalue.js', // multicast, BehaviorSubject, Reference counted\n              'src/core/linq/observable/replay.js', // multicast, ReplaySubject\n              'src/core/linq/observable/sharereplay.js',\n              'src/core/subjects/innersubscription.js',\n              'src/core/subjects/behaviorsubject.js',\n              'src/core/subjects/replaysubject.js',\n              'src/core/linq/connectableobservable.js',\n              'src/core/linq/observable/singleinstance.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'dist/rx.binding.js'\n          },\n          coincidence: {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/subintro.js',\n              'src/core/headers/coincidenceheader.js',\n              'src/core/internal/trycatch.js',\n              'src/core/internal/map.js',\n              'src/core/linq/observable/join.js', // SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, Dictionary\n              'src/core/linq/observable/groupjoin.js', // SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, Dictionary\n              'src/core/linq/observable/buffer.js', // window, selectMany, toArray\n              'src/core/linq/observable/window.js', // CompositeDisposable, RefCountDisposable, Subject, SingleAssignmentDisposable\n              'src/core/linq/observable/pairwise.js',\n              'src/core/linq/observable/partition.js',\n              'src/core/linq/observable/groupby.js',\n              'src/core/linq/observable/groupbyuntil.js',\n              'src/core/linq/groupedobservable.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'dist/rx.coincidence.js'\n          },\n          'coincidence-lite': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/liteintro.js',\n              'src/core/headers/coincidenceheader.js',\n              'src/core/internal/trycatch.js',\n              'src/core/internal/map.js',\n              'src/core/linq/observable/join.js', // SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, Dictionary\n              'src/core/linq/observable/groupjoin.js', // SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, Dictionary\n              'src/core/linq/observable/buffer.js', // window, selectMany, toArray\n              'src/core/linq/observable/window.js', // CompositeDisposable, RefCountDisposable, Subject, SingleAssignmentDisposable\n              'src/core/linq/observable/pairwise.js',\n              'src/core/linq/observable/partition.js',\n              'src/core/linq/observable/groupby.js',\n              'src/core/linq/observable/groupbyuntil.js',\n              'src/core/linq/groupedobservable.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'modules/rx-lite-coincidence/rx.lite.coincidence.js'\n          },\n          'coincidence-lite-compat': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/liteintro-compat.js',\n              'src/core/headers/coincidenceheader.js',\n              'src/core/internal/trycatch.js',\n              'src/core/internal/map.js',\n              'src/core/linq/observable/join.js', // SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, Dictionary\n              'src/core/linq/observable/groupjoin.js', // SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, Dictionary\n              'src/core/linq/observable/buffer.js', // window, selectMany, toArray\n              'src/core/linq/observable/window.js', // CompositeDisposable, RefCountDisposable, Subject, SingleAssignmentDisposable\n              'src/core/linq/observable/pairwise.js',\n              'src/core/linq/observable/partition.js',\n              'src/core/linq/observable/groupby.js',\n              'src/core/linq/observable/groupbyuntil.js',\n              'src/core/linq/groupedobservable.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'modules/rx-lite-coincidence-compat/rx.lite.coincidence.compat.js'\n          },\n          experimental: {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/subintro.js',\n              'src/core/headers/experimentalheader.js',\n              'src/core/internal/trycatch.js',\n              'src/core/headers/enumeratorheader.js',\n              'src/core/linq/enumerable/while.js', // Enumerable\n              'src/core/linq/observable/let.js',\n              'src/core/linq/observable/if.js', // defer, empty\n              'src/core/linq/observable/for.js', // Enumerable.forEach, concatproto\n              'src/core/linq/observable/while.js', // Enumerable.while, concatproto\n              'src/core/linq/observable/dowhile.js', // Enumerable.while, concat\n              'src/core/linq/observable/case.js', // defer, empty\n              'src/core/linq/observable/expand.js', // immediateScheduler, SerialDisposable, CompositeDisposable, SingleAssignmentDisposable\n              'src/core/linq/observable/forkjoin.js', // CompositeDisposable\n              'src/core/linq/observable/forkjoinproto.js', // SingleAssignmentDisposable, CompositeDisposable\n              'src/core/linq/observable/manyselect.js', // ImmediateScheduler, CurrentThreadScheduler, select, do, observeOn\n\n              // Experimental Flattening\n              'src/core/linq/observable/switchfirst.js',\n              'src/core/perf/operators/flatmapfirst.js',\n              'src/core/perf/operators/flatmapwithmaxconcurrent.js',\n\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'dist/rx.experimental.js'\n          },\n          'experimental-lite': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/liteintro.js',\n              'src/core/headers/experimentalheader.js',\n              'src/core/internal/trycatch.js',\n              'src/core/headers/enumeratorheader.js',\n              'src/core/linq/enumerable/while.js', // Enumerable\n              'src/core/linq/observable/let.js',\n              'src/core/linq/observable/if.js', // defer, empty\n              'src/core/linq/observable/for.js', // Enumerable.forEach, concatproto\n              'src/core/linq/observable/while.js', // Enumerable.while, concatproto\n              'src/core/linq/observable/dowhile.js', // Enumerable.while, concat\n              'src/core/linq/observable/case.js', // defer, empty\n              'src/core/linq/observable/expand.js', // immediateScheduler, SerialDisposable, CompositeDisposable, SingleAssignmentDisposable\n              'src/core/linq/observable/forkjoin.js', // CompositeDisposable\n              'src/core/linq/observable/forkjoinproto.js', // SingleAssignmentDisposable, CompositeDisposable\n              'src/core/linq/observable/manyselect.js', // ImmediateScheduler, CurrentThreadScheduler, select, do, observeOn\n\n              // Experimental Flattening\n              'src/core/linq/observable/switchfirst.js',\n              'src/core/perf/operators/flatmapfirst.js',\n              'src/core/perf/operators/flatmapwithmaxconcurrent.js',\n\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'modules/rx-lite-experimental/rx.lite.experimental.js'\n          },\n          'experimental-lite-compat': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/liteintro-compat.js',\n              'src/core/headers/experimentalheader.js',\n              'src/core/internal/trycatch.js',\n              'src/core/headers/enumeratorheader.js',\n              'src/core/linq/enumerable/while.js', // Enumerable\n              'src/core/linq/observable/let.js',\n              'src/core/linq/observable/if.js', // defer, empty\n              'src/core/linq/observable/for.js', // Enumerable.forEach, concatproto\n              'src/core/linq/observable/while.js', // Enumerable.while, concatproto\n              'src/core/linq/observable/dowhile.js', // Enumerable.while, concat\n              'src/core/linq/observable/case.js', // defer, empty\n              'src/core/linq/observable/expand.js', // immediateScheduler, SerialDisposable, CompositeDisposable, SingleAssignmentDisposable\n              'src/core/linq/observable/forkjoin.js', // CompositeDisposable\n              'src/core/linq/observable/forkjoinproto.js', // SingleAssignmentDisposable, CompositeDisposable\n              'src/core/linq/observable/manyselect.js', // ImmediateScheduler, CurrentThreadScheduler, select, do, observeOn\n\n              // Experimental Flattening\n              'src/core/linq/observable/switchfirst.js',\n              'src/core/perf/operators/flatmapfirst.js',\n              'src/core/perf/operators/flatmapwithmaxconcurrent.js',\n\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'modules/rx-lite-experimental-compat/rx.lite.experimental.compat.js'\n          },\n          joinpatterns: {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/subintro.js',\n              'src/core/headers/joinpatternsheader.js',\n              'src/core/internal/trycatch.js',\n              'src/core/internal/map.js',\n              'src/core/joins/pattern.js',\n              'src/core/joins/plan.js',\n              'src/core/joins/activeplan.js',\n              'src/core/joins/joinobserver.js',\n              'src/core/linq/observable/and.js', // Pattern\n              'src/core/linq/observable/thendo.js', // Pattern\n              'src/core/linq/observable/when.js', // CompositeDisposable\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'dist/rx.joinpatterns.js'\n          },\n          'joinpatterns-lite': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/liteintro.js',\n              'src/core/headers/joinpatternsheader.js',\n              'src/core/internal/trycatch.js',\n              'src/core/internal/map.js',\n              'src/core/joins/pattern.js',\n              'src/core/joins/plan.js',\n              'src/core/joins/activeplan.js',\n              'src/core/joins/joinobserver.js',\n              'src/core/linq/observable/and.js', // Pattern\n              'src/core/linq/observable/thendo.js', // Pattern\n              'src/core/linq/observable/when.js', // CompositeDisposable\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'modules/rx-lite-joinpatterns/rx.lite.joinpatterns.js'\n          },\n          'joinpatterns-lite-compat': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/liteintro-compat.js',\n              'src/core/headers/joinpatternsheader.js',\n              'src/core/internal/trycatch.js',\n              'src/core/internal/map.js',\n              'src/core/joins/pattern.js',\n              'src/core/joins/plan.js',\n              'src/core/joins/activeplan.js',\n              'src/core/joins/joinobserver.js',\n              'src/core/linq/observable/and.js', // Pattern\n              'src/core/linq/observable/thendo.js', // Pattern\n              'src/core/linq/observable/when.js', // CompositeDisposable\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'modules/rx-lite-joinpatterns-compat/rx.lite.joinpatterns.compat.js'\n          },\n          testing: {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/testintro.js',\n              'src/core/headers/testheader.js',\n              'src/core/testing/reactivetest.js',\n              'src/core/testing/recorded.js',\n              'src/core/testing/subscription.js',\n              'src/core/testing/mockdisposable.js',\n              'src/core/testing/mockobserver.js',\n              'src/core/testing/mockpromise.js',\n              'src/core/testing/hotobservable.js',\n              'src/core/testing/coldobservable.js',\n              'src/core/testing/testscheduler.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'dist/rx.testing.js'\n          },\n          'testing-lite': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/litetestintro.js',\n              'src/core/headers/testheader.js',\n              'src/core/testing/reactivetest.js',\n              'src/core/testing/recorded.js',\n              'src/core/testing/subscription.js',\n              'src/core/testing/mockdisposable.js',\n              'src/core/testing/mockobserver.js',\n              'src/core/testing/mockpromise.js',\n              'src/core/testing/hotobservable.js',\n              'src/core/testing/coldobservable.js',\n              'src/core/testing/testscheduler.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'modules/rx-lite-testing/rx.lite.testing.js'\n          },\n          'testing-lite-compat': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/litetestintro-compat.js',\n              'src/core/headers/testheader.js',\n              'src/core/testing/reactivetest.js',\n              'src/core/testing/recorded.js',\n              'src/core/testing/subscription.js',\n              'src/core/testing/mockdisposable.js',\n              'src/core/testing/mockobserver.js',\n              'src/core/testing/mockpromise.js',\n              'src/core/testing/hotobservable.js',\n              'src/core/testing/coldobservable.js',\n              'src/core/testing/testscheduler.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'modules/rx-lite-testing-compat/rx.lite.testing.compat.js'\n          },\n          time: {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/subintro.js',\n              'src/core/headers/timeheader.js',\n              'src/core/internal/trycatch.js',\n              'src/core/linq/observable/_observabletimer.js', // AnonymousObservable\n              'src/core/linq/observable/_observabletimerdateandperiod.js', // AnonymousObservable, normalizeTime\n\n              'src/core/linq/observable/_observabletimertimespanandperiod.js', // AnonymousObservable, defer, _observabletimerdateandperiod\n              'src/core/linq/observable/interval.js', // timeoutScheduler, _observabletimertimespanandperiod\n              'src/core/linq/observable/timer.js', // timeoutScheduler, _observabletimerdate, _observabletimerdateandperiod, _observabletimertimespan, _observabletimertimespanandperiod\n              'src/core/linq/observable/delay.js', // AnonymousObservable, timeoutScheduler, SerialDisposable, materialize, timestamp\n              'src/core/linq/observable/debounce.js', // AnonymousObservable, SerialDisposable, timeoutScheduler, SingleAssignmentDisposable, CompositeDisposable\n              'src/core/linq/observable/windowwithtime.js', // AnonymousObservable, SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, addref, subject\n              'src/core/linq/observable/windowwithtimeorcount.js', // AnonymousObservable, SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, addref, subject\n              'src/core/linq/observable/bufferwithtime.js', // windowwithtime, selectMany, toArray\n              'src/core/linq/observable/bufferwithtimeorcount.js', // windowwithtimeorcount, selectMany, toArray\n              'src/core/linq/observable/timeinterval.js', // timeoutScheduler, defer, select\n              'src/core/linq/observable/timestamp.js', // timeoutScheduler, select\n              'src/core/linq/observable/sample.js', // AnonymousObservable, CompositeDisposable, interval, timeoutScheduler\n              'src/core/linq/observable/timeout.js', // AnonymousObservable, timeoutScheduler, throw, SingleAssignmentDisposable, SerialDisposable, CompositeDisposable\n              'src/core/linq/observable/generatewithabsolutetime.js', // timeoutScheduler, AnonymousObservable\n              'src/core/linq/observable/generatewithrelativetime.js', // timeoutScheduler, AnonymousObservable\n              'src/core/linq/observable/delaysubscription.js', // delayWithSelector, timer, empty\n              'src/core/linq/observable/skiplastwithtime.js',\n              'src/core/linq/observable/takelastwithtime.js',\n              'src/core/linq/observable/takelastbufferwithtime.js',\n              'src/core/linq/observable/takewithtime.js',\n              'src/core/linq/observable/skipwithtime.js',\n              'src/core/linq/observable/skipuntilwithtime.js',\n              'src/core/linq/observable/takeuntilwithtime.js',\n              'src/core/linq/observable/throttle.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'dist/rx.time.js'\n          },\n          'time-lite': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/liteintro.js',\n              'src/core/headers/timeheader.js',\n              'src/core/internal/trycatch.js',\n              'src/core/linq/observable/windowwithtime.js', // AnonymousObservable, SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, addref, subject\n              'src/core/linq/observable/windowwithtimeorcount.js', // AnonymousObservable, SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, addref, subject\n              'src/core/linq/observable/bufferwithtime.js', // windowwithtime, selectMany, toArray\n              'src/core/linq/observable/bufferwithtimeorcount.js', // windowwithtimeorcount, selectMany, toArray\n              'src/core/linq/observable/timeinterval.js', // timeoutScheduler, defer, select\n              'src/core/linq/observable/generatewithabsolutetime.js', // timeoutScheduler, AnonymousObservable\n              'src/core/linq/observable/generatewithrelativetime.js', // timeoutScheduler, AnonymousObservable\n              'src/core/linq/observable/delaysubscription.js', // delayWithSelector, timer, empty\n              'src/core/linq/observable/skiplastwithtime.js',\n              'src/core/linq/observable/takelastwithtime.js',\n              'src/core/linq/observable/takelastbufferwithtime.js',\n              'src/core/linq/observable/takewithtime.js',\n              'src/core/linq/observable/skipwithtime.js',\n              'src/core/linq/observable/skipuntilwithtime.js',\n              'src/core/linq/observable/takeuntilwithtime.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'modules/rx-lite-time/rx.lite.time.js'\n          },\n          'time-lite-compat': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/liteintro-compat.js',\n              'src/core/headers/timeheader.js',\n              'src/core/internal/trycatch.js',\n              'src/core/linq/observable/windowwithtime.js', // AnonymousObservable, SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, addref, subject\n              'src/core/linq/observable/windowwithtimeorcount.js', // AnonymousObservable, SerialDisposable, SingleAssignmentDisposable, RefCountDisposable, CompositeDisposable, addref, subject\n              'src/core/linq/observable/bufferwithtime.js', // windowwithtime, selectMany, toArray\n              'src/core/linq/observable/bufferwithtimeorcount.js', // windowwithtimeorcount, selectMany, toArray\n              'src/core/linq/observable/timeinterval.js', // timeoutScheduler, defer, select\n              'src/core/linq/observable/generatewithabsolutetime.js', // timeoutScheduler, AnonymousObservable\n              'src/core/linq/observable/generatewithrelativetime.js', // timeoutScheduler, AnonymousObservable\n              'src/core/linq/observable/delaysubscription.js', // delayWithSelector, timer, empty\n              'src/core/linq/observable/skiplastwithtime.js',\n              'src/core/linq/observable/takelastwithtime.js',\n              'src/core/linq/observable/takelastbufferwithtime.js',\n              'src/core/linq/observable/takewithtime.js',\n              'src/core/linq/observable/skipwithtime.js',\n              'src/core/linq/observable/skipuntilwithtime.js',\n              'src/core/linq/observable/takeuntilwithtime.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'modules/rx-lite-time-compat/rx.lite.time.compat.js'\n          },\n          virtualtime: {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/subintro.js',\n              'src/core/headers/virtualtimeheader.js',\n              'src/core/concurrency/virtualtimescheduler.js',\n              'src/core/concurrency/historicalscheduler.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'dist/rx.virtualtime.js'\n          },\n          'virtualtime-lite': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/liteintro.js',\n              'src/core/headers/virtualtimeheader.js',\n              'src/core/concurrency/virtualtimescheduler.js',\n              'src/core/concurrency/historicalscheduler.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'modules/rx-lite-virtualtime/rx.lite.virtualtime.js'\n          },\n          'virtualtime-lite-compat': {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/liteintro-compat.js',\n              'src/core/headers/virtualtimeheader.js',\n              'src/core/concurrency/virtualtimescheduler.js',\n              'src/core/concurrency/historicalscheduler.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'modules/rx-lite-virtualtime-compat/rx.lite.virtualtime.compat.js'\n          },\n          sorting: {\n            src: [\n              'src/core/headers/license.js',\n              'src/core/headers/subintro.js',\n              'src/core/headers/sortingheader.js',\n              'src/core/linq/observable/jortsort.js',\n              'src/core/linq/observable/jortsortuntil.js',\n              'src/core/headers/suboutro.js'\n            ],\n            dest: 'dist/rx.sorting.js'\n          }\n      },\n      uglify: {\n        options: {\n          banner:\n            '/* Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.*/'\n        },\n        core: {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.core.map'\n          },\n          files: {'dist/rx.core.min.js': ['dist/rx.core.js'] }\n        },\n        'core-binding': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.core.binding.map'\n          },\n          files: {'dist/rx.core.binding.min.js': ['dist/rx.core.binding.js'] }\n        },\n        'core-testing': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.core.testing.map'\n          },\n          files: {'dist/rx.core.testing.min.js': ['dist/rx.core.testing.js'] }\n        },\n        all: {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.all.map'\n          },\n          files: {'dist/rx.all.min.js': ['dist/rx.all.js'] }\n        },\n        'all-compat': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.all.compat.map'\n          },\n          files: {'dist/rx.all.compat.min.js': ['dist/rx.all.compat.js'] }\n        },\n        main: {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.map'\n          },\n          files: {'dist/rx.min.js': ['dist/rx.js'] }\n        },\n        'main-compat': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.compat.map'\n          },\n          files: {'dist/rx.compat.min.js': ['dist/rx.compat.js'] }\n        },\n        lite: {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.lite.map'\n          },\n          files: {'dist/rx.lite.min.js': ['dist/rx.lite.js'] }\n        },\n        'lite-compat': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.lite.compat.map'\n          },\n          files: {'dist/rx.lite.compat.min.js': ['dist/rx.lite.compat.js'] }\n        },\n        'lite-extras': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.lite.extras.map'\n          },\n          files: {'dist/rx.lite.extras.min.js': ['dist/rx.lite.extras.js'] }\n        },\n        'lite-extras-compat': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.lite.extras.compat.map'\n          },\n          files: {'dist/rx.lite.extras.compat.min.js': ['dist/rx.lite.extras.compat.js'] }\n        },\n        aggregates: {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.aggregates.map'\n          },\n          files: {'dist/rx.aggregates.min.js': ['dist/rx.aggregates.js'] }\n        },\n        'aggregates-lite': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'modules/rx-lite-aggregates/rx.lite.aggregates.map'\n          },\n          files: {'modules/rx-lite-aggregates/rx.lite.aggregates.min.js': ['modules/rx-lite-aggregates/rx.lite.aggregates.js'] }\n        },\n        'aggregates-lite-compat': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'modules/rx-lite-aggregates-compat/rx.lite.aggregates.compat.map'\n          },\n          files: {'modules/rx-lite-aggregates-compat/rx.lite.aggregates.compat.min.js': ['modules/rx-lite-aggregates-compat/rx.lite.aggregates.compat.js'] }\n        },\n        'async': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.async.map'\n          },\n          files: {'dist/rx.async.min.js': ['dist/rx.async.js'] }\n        },\n        'async-compat': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.async.compat.map'\n          },\n          files: {'dist/rx.async.compat.min.js': ['dist/rx.async.compat.js'] }\n        },\n        'async-lite': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'modules/rx-lite-async/rx.lite.async.map'\n          },\n          files: {'modules/rx-lite-async/rx.lite.async.min.js': ['modules/rx-lite-async/rx.lite.async.js'] }\n        },\n        'async-lite-compat': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'modules/rx-lite-async-compat/rx.lite.async.compat.map'\n          },\n          files: {'modules/rx-lite-async-compat/rx.lite.async.compat.min.js': ['modules/rx-lite-async-compat/rx.lite.async.compat.js'] }\n        },\n        backpressure: {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.backpressure.map'\n          },\n          files: {'dist/rx.backpressure.min.js': ['dist/rx.backpressure.js'] }\n        },\n        'backpressure-lite': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'modules/rx-lite-backpressure/rx.lite.backpressure.map'\n          },\n          files: {'modules/rx-lite-backpressure/rx.lite.backpressure.min.js': ['modules/rx-lite-backpressure/rx.lite.backpressure.js'] }\n        },\n        'backpressure-lite-compat': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'modules/rx-lite-backpressure-compat/rx.lite.backpressure.compat.map'\n          },\n          files: {'modules/rx-lite-backpressure-compat/rx.lite.backpressure.compat.min.js': ['modules/rx-lite-backpressure-compat/rx.lite.backpressure.compat.js'] }\n        },\n        binding: {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.binding.map'\n          },\n          files: {'dist/rx.binding.min.js': ['dist/rx.binding.js'] }\n        },\n        coincidence: {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.coincidence.map'\n          },\n          files: {'dist/rx.coincidence.min.js': ['dist/rx.coincidence.js'] }\n        },\n        'coincidence-lite': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'modules/rx-lite-coincidence/rx.lite.coincidence.map'\n          },\n          files: {'modules/rx-lite-coincidence/rx.lite.coincidence.min.js': ['modules/rx-lite-coincidence/rx.lite.coincidence.js'] }\n        },\n        'coincidence-lite-compat': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'modules/rx-lite-coincidence-compat/rx.lite.coincidence.compat.map'\n          },\n          files: {'modules/rx-lite-coincidence-compat/rx.lite.coincidence.compat.min.js': ['modules/rx-lite-coincidence-compat/rx.lite.coincidence.compat.js'] }\n        },\n        experimental: {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.experimental.map'\n          },\n          files: {'dist/rx.experimental.min.js': ['dist/rx.experimental.js'] }\n        },\n        'experimental-lite': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'modules/rx-lite-experimental/rx.lite.experimental.map'\n          },\n          files: {'modules/rx-lite-experimental/rx.lite.experimental.min.js': ['modules/rx-lite-experimental/rx.lite.experimental.js'] }\n        },\n        'experimental-lite-compat': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'modules/rx-lite-experimental-compat/rx.lite.experimental.compat.map'\n          },\n          files: {'modules/rx-lite-experimental-compat/rx.lite.experimental.compat.min.js': ['modules/rx-lite-experimental-compat/rx.lite.experimental.compat.js'] }\n        },\n        joinpatterns: {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.joinpatterns.map'\n          },\n          files: {'dist/rx.joinpatterns.min.js': ['dist/rx.joinpatterns.js'] }\n        },\n        'joinpatterns-lite': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'modules/rx-lite-joinpatterns/rx.lite.joinpatterns.map'\n          },\n          files: {'modules/rx-lite-joinpatterns/rx.lite.joinpatterns.min.js': ['modules/rx-lite-joinpatterns/rx.lite.joinpatterns.js'] }\n        },\n        'joinpatterns-lite-compat': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'modules/rx-lite-joinpatterns-compat/rx.lite.joinpatterns.compat.map'\n          },\n          files: {'modules/rx-lite-joinpatterns-compat/rx.lite.joinpatterns.compat.min.js': ['modules/rx-lite-joinpatterns-compat/rx.lite.joinpatterns.compat.js'] }\n        },\n        testing: {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.testing.map'\n          },\n          files: {'dist/rx.testing.min.js': ['dist/rx.testing.js'] }\n        },\n        'testing-lite': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'modules/rx-lite-testing/rx.lite.testing.map'\n          },\n          files: {'modules/rx-lite-testing/rx.lite.testing.min.js': ['modules/rx-lite-testing/rx.lite.testing.js'] }\n        },\n        'testing-lite-compat': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'modules/rx-lite-testing-compat/rx.lite.testing.compat.map'\n          },\n          files: {'modules/rx-lite-testing-compat/rx.lite.testing.compat.min.js': ['modules/rx-lite-testing-compat/rx.lite.testing.compat.js'] }\n        },\n        time: {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.time.map'\n          },\n          files: {'dist/rx.time.min.js': ['dist/rx.time.js'] }\n        },\n        'time-lite': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'modules/rx-lite-time/rx.lite.time.map'\n          },\n          files: {'modules/rx-lite-time/rx.lite.time.min.js': ['modules/rx-lite-time/rx.lite.time.js'] }\n        },\n        'time-lite-compat': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'modules/rx-lite-time-compat/rx.lite.time.compat.map'\n          },\n          files: {'modules/rx-lite-time-compat/rx.lite.time.compat.min.js': ['modules/rx-lite-time-compat/rx.lite.time.compat.js'] }\n        },\n        virtualtime: {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.virtualtime.map'\n          },\n          files: {'dist/rx.virtualtime.min.js': ['dist/rx.virtualtime.js'] }\n        },\n        'virtualtime-lite': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'modules/rx-lite-virtualtime/rx.lite.virtualtime.map'\n          },\n          files: {'modules/rx-lite-virtualtime/rx.lite.virtualtime.min.js': ['modules/rx-lite-virtualtime/rx.lite.virtualtime.js'] }\n        },\n        'virtualtime-lite-compat': {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'modules/rx-lite-virtualtime-compat/rx.lite.virtualtime.compat.map'\n          },\n          files: {'modules/rx-lite-virtualtime-compat/rx.lite.virtualtime.compat.min.js': ['modules/rx-lite-virtualtime-compat/rx.lite.virtualtime.compat.js'] }\n        },\n        sorting: {\n          options: {\n            sourceMap: true,\n            sourceMapName: 'dist/rx.sorting.map'\n          },\n          files: {'dist/rx.sorting.min.js': ['dist/rx.sorting.js'] }\n        }\n      },\n      qunit: {\n          all: ['tests/*.html']\n      },\n      jshint: {\n        all: [\n          'rx.all.js'\n        ]\n      },\n      jscs: {\n        src: 'src/**/*.js',\n        options: {\n          config: '.jscsrc'\n        }\n      },\n      watch: {\n        scripts: {\n          files: 'src/**/*.js',\n          tasks: ['default'],\n          options: {\n            interrupt: true\n          }\n        }\n      },\n      copy: {\n        'lite': {\n          flatten: true,\n          filter: 'isFile',\n          expand: true,\n          src: [\n            'dist/rx.lite.js',\n            'dist/rx.lite.map',\n            'dist/rx.lite.min.js'\n          ],\n          dest: 'modules/rx-lite/'\n        },\n        'lite-compat': {\n          flatten: true,\n          filter: 'isFile',\n          expand: true,\n          src: [\n            'dist/rx.lite.compat.js',\n            'dist/rx.lite.compat.map',\n            'dist/rx.lite.compat.min.js'\n          ],\n          dest: 'modules/rx-lite-compat/'\n        },\n        'lite-extras': {\n          flatten: true,\n          filter: 'isFile',\n          expand: true,\n          src: [\n            'dist/rx.lite.extras.js',\n            'dist/rx.lite.extras.map',\n            'dist/rx.lite.extras.min.js'\n          ],\n          dest: 'modules/rx-lite-extras/'\n        },\n        'lite-extras-compat': {\n          flatten: true,\n          filter: 'isFile',\n          expand: true,\n          src: [\n            'dist/rx.lite.extras.compat.js',\n            'dist/rx.lite.extras.compat.map',\n            'dist/rx.lite.extras.compat.min.js'\n          ],\n          dest: 'modules/rx-lite-extras-compat/'\n        },\n        'core': {\n          flatten: true,\n          filter: 'isFile',\n          expand: true,\n          src: [\n            'dist/rx.core.js',\n            'dist/rx.core.map',\n            'dist/rx.core.min.js'\n          ],\n          dest: 'modules/rx-core/'\n        },\n        'core-binding': {\n          flatten: true,\n          filter: 'isFile',\n          expand: true,\n          src: [\n            'dist/rx.core.binding.js',\n            'dist/rx.core.binding.map',\n            'dist/rx.core.binding.min.js'\n          ],\n          dest: 'modules/rx-core-binding/'\n        },\n        'core-testing': {\n          flatten: true,\n          filter: 'isFile',\n          expand: true,\n          src: [\n            'dist/rx.core.testing.js',\n            'dist/rx.core.testing.map',\n            'dist/rx.core.testing.min.js'\n          ],\n          dest: 'modules/rx-core-testing/'\n        }\n      }\n  });\n\n  // Load all \"grunt-*\" tasks\n  require('load-grunt-tasks')(grunt);\n\n  function createNuGetPackage(nuspec) {\n    var done = this.async();\n\n    //invoke nuget.exe\n    grunt.util.spawn({\n      cmd: \".nuget/nuget.exe\",\n      args: [\n        //specify the .nuspec file\n        \"pack\",\n        nuspec,\n\n        //specify where we want the package to be created\n        \"-OutputDirectory\",\n        \"nuget\",\n\n        //override the version with whatever is currently defined in package.json\n        \"-Version\",\n        grunt.config.get(\"pkg\").version\n      ]\n    }, function (error, result) {\n      if (error) {\n        grunt.log.error(error);\n      } else {\n        grunt.log.write(result);\n      }\n\n      done();\n    });\n  }\n\n  grunt.registerTask('nuget-complete', 'Register NuGet-Complete', function () {\n    createNuGetPackage.call(this, 'nuget/RxJS-Complete/RxJS-Complete.nuspec');\n  });\n\n  grunt.registerTask('nuget-aggregates', 'Register NuGet-Aggregates', function () {\n    createNuGetPackage.call(this, 'nuget/RxJS-Aggregates/RxJS-Aggregates.nuspec');\n  });\n\n  grunt.registerTask('nuget-all', 'Register NuGet-All', function () {\n    createNuGetPackage.call(this, 'nuget/RxJS-All/RxJS-All.nuspec');\n  });\n\n  grunt.registerTask('nuget-async', 'Register NuGet-Async', function () {\n    createNuGetPackage.call(this, 'nuget/RxJS-Async/RxJS-Async.nuspec');\n  });\n\n  grunt.registerTask('nuget-backpressure', 'Register NuGet-BackPressure', function () {\n    createNuGetPackage.call(this, 'nuget/RxJS-BackPressure/RxJS-BackPressure.nuspec');\n  });\n\n  grunt.registerTask('nuget-binding', 'Register NuGet-Binding', function () {\n    createNuGetPackage.call(this, 'nuget/RxJS-Binding/RxJS-Binding.nuspec');\n  });\n\n  grunt.registerTask('nuget-coincidence', 'Register NuGet-Coincidence', function () {\n    createNuGetPackage.call(this, 'nuget/RxJS-Coincidence/RxJS-Coincidence.nuspec');\n  });\n\n  grunt.registerTask('nuget-experimental', 'Register NuGet-Experimental', function () {\n    createNuGetPackage.call(this, 'nuget/RxJS-Experimental/RxJS-Experimental.nuspec');\n  });\n\n  grunt.registerTask('nuget-joinpatterns', 'Register NuGet-JoinPatterns', function () {\n    createNuGetPackage.call(this, 'nuget/RxJS-JoinPatterns/RxJS-JoinPatterns.nuspec');\n  });\n\n  grunt.registerTask('nuget-lite', 'Register NuGet-Lite', function () {\n    createNuGetPackage.call(this, 'nuget/RxJS-Lite/RxJS-Lite.nuspec');\n  });\n\n  grunt.registerTask('nuget-main', 'Register NuGet-Main', function () {\n    createNuGetPackage.call(this, 'nuget/RxJS-Main/RxJS-Main.nuspec');\n  });\n\n  grunt.registerTask('nuget-testing', 'Register NuGet-Testing', function () {\n    createNuGetPackage.call(this, 'nuget/RxJS-Testing/RxJS-Testing.nuspec');\n  });\n\n  grunt.registerTask('nuget-time', 'Register NuGet-Time', function () {\n    createNuGetPackage.call(this, 'nuget/RxJS-Time/RxJS-Time.nuspec');\n  });\n\n  grunt.registerTask('nuget-virtualtime', 'Register NuGet-VirtualTime', function () {\n    createNuGetPackage.call(this, 'nuget/RxJS-VirtualTime/RxJS-VirtualTime.nuspec');\n  });\n\n  grunt.registerTask('nuget', [\n    'nuget-complete',\n    'nuget-aggregates',\n    'nuget-all',\n    'nuget-async',\n    'nuget-backpressure',\n    'nuget-binding',\n    'nuget-coincidence',\n    'nuget-experimental',\n    'nuget-joinpatterns',\n    'nuget-lite',\n    'nuget-main',\n    'nuget-testing',\n    'nuget-time',\n    'nuget-virtualtime'\n  ]);\n\n  grunt.registerTask('rebuild-ts', 'Rebuild typescript declarations', function() {\n    var path = require('path');\n    var fs = require('fs');\n\n    var cache = {};\n    var dependencies = {};\n    var concatItems = grunt.config.get('concat');\n\tvar allLoadedFiles = {};\n\n    function loadFile(tsFile) {\n      if (cache[tsFile]) {\n        return;\n      }\n      var dependencyRegex = /\\/\\/\\/ <reference path\\=\\\"(.*?)\\\" \\/>/g;\n      var c; //, count = 0;\n      var source = grunt.file.read(tsFile);\n\n      // source with tests\n      var s = source.match(/module Rx \\{([\\s\\S]*)\\}[\\s\\S]*\\(function\\s*\\(\\)\\s*\\{[\\s\\S]*\\}\\)/);\n      if (s && s[1]) {\n        c = cache[tsFile] = s[1];\n\t  }\n\t  if (!s) {\n\t    // source without tests\n\t\ts = source.match(/module Rx \\{([\\s\\S]*)\\}/);\n\t\tif (s && s[1]) {\n\t\t  c = cache[tsFile] = s[1];\n\t\t}\n\t  }\n\n\t  var deps = dependencies[tsFile] = [];\n\t  var result;\n\t  while (result = dependencyRegex.exec(source)) {\n\t\tvar dep = path.resolve(__dirname, path.dirname(tsFile), result[1])\n\t\t  .substr(__dirname.length + 1)\n\t\t  .replace(/\\\\/g, '/');\n\n        if (tsFile.indexOf('/testscheduler.ts') > -1 && dep.indexOf('virtualtimescheduler.ts') > -1) {\n            continue;\n        }\n\n\t\tdeps.push(dep);\n\t\tloadFile(dep);\n\t  }\n\n\t  return c;\n\t}\n\n    function addLoadedFile(concatKey, tsFile) {\n      if (loadedFiles[tsFile]) {\n\t    return;\n      }\n\n\t  if (!(concatKey === 'all' || concatKey === 'main' || concatKey === 'lite' || concatKey === 'core')) {\n\t\tif ((concatKey.indexOf('lite') === 0 && allLoadedFiles['lite'][tsFile])\n\t\t    || (concatKey.indexOf('lite') !== 0 && allLoadedFiles['main'][tsFile])\n\t\t    || allLoadedFiles['core'][tsFile]) {\n\t\t  loadedFiles[tsFile] = true;\n\t\t  return;\n\t\t}\n\t  }\n\n  \t  if (!(tsFile.match(/\\/toset\\.ts$/) || tsFile.match(/\\/tomap\\.ts$/))) {\n  \t    output.push(cache[tsFile]);\n\t  }\n\t  es6Output.push(cache[tsFile]);\n\t  loadedFiles[tsFile] = true;\n    }\n\n\tfunction addFileContent(concatKey, tsFile) {\n      if (loadedFiles[tsFile]) {\n\t    return;\n\t  }\n\n\t  var deps = dependencies[tsFile];\n\t  for (var k = 0; k < deps.length; k++) {\n\t\taddLoadedFile(concatKey, deps[k]);\n\t\taddFileContent(concatKey, deps[k]);\n\t  }\n\n\t  addLoadedFile(concatKey, tsFile);\n\t}\n\n\tloadFile('ts/core/es5.ts');\n\tloadFile('ts/core/es6.ts');\n\n\tvar items = [];\n\tfor (var key in concatItems) {\n\t  if (key.indexOf('-compat') > -1) {\n\t    continue;\n\t  }\n\n\t  if (key === 'lite' || key === 'main' || key === 'core') {\n\t\titems.unshift(key);\n\t  } else {\n\t\titems.push(key);\n\t  }\n\t}\n\n\tfor (var key = 0; key < items.length; key++) {\n\t  var concatKey = items[key];\n\n\t  if (!allLoadedFiles[concatKey])\n\t\tallLoadedFiles[concatKey] = {};\n\t  var loadedFiles = allLoadedFiles[concatKey];\n\n\t  var output = [];\n\t  var es6Output = [];\n\t  var value = concatItems[concatKey];\n\t  var src = value.src;\n\t  var dest = value.dest;\n\t  var dist = false;\n\n\t  if (dest.indexOf('dist/') === 0) {\n\t    dist = dest.match(/dist\\/(.*?)\\.js/)[1];\n\t    dest = dest.replace(/dist\\/(.*?)\\.js/, 'ts/$1.d.ts');\n\t  } else if (dest.indexOf('modules/') === 0) {\n\t    continue;\n\t  } else {\n\t    throw new Error(\"not sure how to handle \" + dest);\n\t  }\n\n\t  for (var i = 0; i < src.length; i++) {\n\t    var file = src[i];\n\t    var tsFile = file\n\t      .replace(/src\\/(.*?).js/, 'ts/$1.ts')\n\t      // Is this right 100% of the time?\n\t      .replace('perf/operators', 'linq/observable');\n\n\t    if (cache[tsFile] || fs.existsSync(tsFile)) {\n\t      if (!cache[tsFile]) {\n\t        loadFile(tsFile);\n\t      }\n\n\t      if (tsFile.indexOf('/es5') === -1 || tsFile.indexOf('/es6') === -1) {\n\t        addFileContent(concatKey, tsFile);\n\t      }\n\t    } else {\n\t      var valid = ['/headers/', '/longstacktraces/', '/internal/', '/autodetachobserver', '/subjects/innersubscription', '/perf/observablebase', 'linq/enumerable/while', '.compat.', 'linq/observable/_', '/linq/observable/fromarrayobservable', '/joins/', '/linq/observable/flatmapbase', '/disposables/scheduleddisposable', '/concurrency/catchscheduler', '/core/observeonobserver', '/testing/mockpromise', '/testing/hotobservable', '/testing/coldobservable'];\n\t      var validResult = false;\n\t      for (var z = 0; z < valid.length; z++) {\n\t        if (tsFile.indexOf(valid[z]) !== -1) {\n\t          validResult = true;\n\t          break;\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  var writeOut = function(dest, output, es6) {\n\t\tvar outputString = 'declare module Rx {\\n' + output.join('') + '\\n}\\n';\n\t\tif (concatKey === 'all' || concatKey === 'main' || concatKey === 'lite' || concatKey === 'core') {\n\t\t  outputString += '\\ndeclare module \"rx\" { export = Rx; }\\n';\n\t\t}\n\t\tif (dist && concatKey !== 'core' && concatKey !== 'main') {\n\t\t  outputString += 'declare module \"'+dist+'\" { export = Rx; }';\n\t\t}\n\n\t\toutputString = outputString + '\\n';\n\n\t\tgrunt.file.write(dest, outputString);\n\t  };\n\n\t  if (concatKey === 'all' || concatKey === 'main' || concatKey === 'lite' || concatKey === 'core') {\n        output.unshift(cache['ts/core/es5.ts']);\n        es6Output.unshift(cache['ts/core/es6.ts']);\n\t  }\n\n\t  writeOut(dest, output);\n\t  writeOut(dest.replace(/.d.ts$/, '.es6.d.ts'), es6Output, true);\n    }\n\n    grunt.file.write('ts/iterable.es6.d.ts', grunt.file.read('ts/core/es6-iterable.d.ts'));\n    grunt.file.write('ts/es6-promise.es6.d.ts', grunt.file.read('ts/core/es6-promise.d.ts'));\n  });\n\n  grunt.registerTask('concat-min', [\n    'concat:core',\n    'concat:core-binding',\n    'concat:core-testing',\n    'concat:all',\n    'concat:all-compat',\n    'concat:main',\n    'concat:main-compat',\n    'concat:aggregates',\n    'concat:aggregates-lite',\n    'concat:aggregates-lite-compat',\n    'concat:async',\n    'concat:async-compat',\n    'concat:async-lite',\n    'concat:async-lite-compat',\n    'concat:backpressure',\n    'concat:backpressure-lite',\n    'concat:backpressure-lite-compat',\n    'concat:binding',\n    'concat:coincidence',\n    'concat:coincidence-lite',\n    'concat:coincidence-lite-compat',\n    'concat:experimental',\n    'concat:experimental-lite',\n    'concat:experimental-lite-compat',\n    'concat:joinpatterns',\n    'concat:joinpatterns-lite',\n    'concat:joinpatterns-lite-compat',\n    'concat:lite',\n    'concat:lite-compat',\n    'concat:lite-extras',\n    'concat:lite-extras-compat',\n    'concat:time',\n    'concat:time-lite',\n    'concat:time-lite-compat',\n    'concat:testing',\n    'concat:testing-lite',\n    'concat:testing-lite-compat',\n    'concat:virtualtime',\n    'concat:virtualtime-lite',\n    'concat:virtualtime-lite-compat',\n    'concat:sorting',\n\n    'uglify:core',\n    'uglify:core-binding',\n    'uglify:core-testing',\n    'uglify:all',\n    'uglify:all-compat',\n    'uglify:main',\n    'uglify:main-compat',\n    'uglify:aggregates',\n    'uglify:aggregates-lite',\n    'uglify:aggregates-lite-compat',\n    'uglify:async',\n    'uglify:async-compat',\n    'uglify:async-lite',\n    'uglify:async-lite-compat',\n    'uglify:backpressure',\n    'uglify:backpressure-lite',\n    'uglify:backpressure-lite-compat',\n    'uglify:binding',\n    'uglify:coincidence',\n    'uglify:coincidence-lite',\n    'uglify:coincidence-lite-compat',\n    'uglify:experimental',\n    'uglify:experimental-lite',\n    'uglify:experimental-lite-compat',\n    'uglify:joinpatterns',\n    'uglify:joinpatterns-lite',\n    'uglify:joinpatterns-lite-compat',\n    'uglify:lite',\n    'uglify:lite-compat',\n    'uglify:lite-extras',\n    'uglify:lite-extras-compat',\n    'uglify:time',\n    'uglify:time-lite',\n    'uglify:time-lite-compat',\n    'uglify:testing',\n    'uglify:testing-lite',\n    'uglify:testing-lite-compat',\n    'uglify:virtualtime',\n    'uglify:virtualtime-lite',\n    'uglify:virtualtime-lite-compat',\n    'uglify:sorting',\n\n    'copy:lite',\n    'copy:lite-compat',\n    'copy:lite-extras',\n    'copy:lite-extras-compat',\n    'copy:core',\n    'copy:core-binding',\n    'copy:core-testing'\n  ]);\n\n  // Default task\n  grunt.registerTask('default', [\n    'concat:core',\n    'concat:core-binding',\n    'concat:core-testing',\n    'concat:all',\n    'concat:all-compat',\n    'concat:main',\n    'concat:main-compat',\n    'concat:aggregates',\n    'concat:aggregates-lite',\n    'concat:aggregates-lite-compat',\n    'concat:async',\n    'concat:async-compat',\n    'concat:async-lite',\n    'concat:async-lite-compat',\n    'concat:backpressure',\n    'concat:backpressure-lite',\n    'concat:backpressure-lite-compat',\n    'concat:binding',\n    'concat:coincidence',\n    'concat:coincidence-lite',\n    'concat:coincidence-lite-compat',\n    'concat:experimental',\n    'concat:experimental-lite',\n    'concat:experimental-lite-compat',\n    'concat:joinpatterns',\n    'concat:joinpatterns-lite',\n    'concat:joinpatterns-lite-compat',\n    'concat:lite',\n    'concat:lite-compat',\n    'concat:lite-extras',\n    'concat:lite-extras-compat',\n    'concat:time',\n    'concat:time-lite',\n    'concat:time-lite-compat',\n    'concat:testing',\n    'concat:testing-lite',\n    'concat:testing-lite-compat',\n    'concat:virtualtime',\n    'concat:virtualtime-lite',\n    'concat:virtualtime-lite-compat',\n    'concat:sorting',\n\n    'uglify:core',\n    'uglify:core-binding',\n    'uglify:core-testing',\n    'uglify:all',\n    'uglify:all-compat',\n    'uglify:main',\n    'uglify:main-compat',\n    'uglify:aggregates',\n    'uglify:aggregates-lite',\n    'uglify:aggregates-lite-compat',\n    'uglify:async',\n    'uglify:async-compat',\n    'uglify:async-lite',\n    'uglify:async-lite-compat',\n    'uglify:backpressure',\n    'uglify:backpressure-lite',\n    'uglify:backpressure-lite-compat',\n    'uglify:binding',\n    'uglify:coincidence',\n    'uglify:coincidence-lite',\n    'uglify:coincidence-lite-compat',\n    'uglify:experimental',\n    'uglify:experimental-lite',\n    'uglify:experimental-lite-compat',\n    'uglify:joinpatterns',\n    'uglify:joinpatterns-lite',\n    'uglify:joinpatterns-lite-compat',\n    'uglify:lite',\n    'uglify:lite-compat',\n    'uglify:lite-extras',\n    'uglify:lite-extras-compat',\n    'uglify:time',\n    'uglify:time-lite',\n    'uglify:time-lite-compat',\n    'uglify:testing',\n    'uglify:testing-lite',\n    'uglify:testing-lite-compat',\n    'uglify:virtualtime',\n    'uglify:virtualtime-lite',\n    'uglify:virtualtime-lite-compat',\n    'uglify:sorting',\n\n    'copy:lite',\n    'copy:lite-compat',\n    'copy:lite-extras',\n    'copy:lite-extras-compat',\n    'copy:core',\n    'copy:core-binding',\n    'copy:core-testing',\n\n    'qunit',\n\t'rebuild-ts'\n  ]);\n};\n"
  },
  {
    "path": "authors.txt",
    "content": "Matthew Podwysocki <matthewp@microsoft.com>\nBart de Smet <bartde@microsoft.com>\nErik Meijer <emeijer@microsoft.com>\n"
  },
  {
    "path": "bower.json",
    "content": "{\n  \"name\": \"rxjs\",\n  \"main\": \"dist/rx.all.js\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"license\": \"Apache-2.0\",\n  \"ignore\": [\n    \".sh\",\n    \".*\",\n    \"*.bat\",\n    \"*.md\",\n    \"*.txt\",\n    \"*.log\",\n    \"package.json\",\n    \"node_modules\",\n    \"doc\",\n    \"examples\",\n    \"src\",\n    \"tests\"\n  ]\n}\n"
  },
  {
    "path": "code-of-conduct.md",
    "content": "# Code of Conduct #\n\n[_Adapted from the Rust Code of Conduct_](https://github.com/rust-lang/rust/wiki/Note-development-policy#conduct)\n\nWe are committed to providing a friendly, safe and welcoming environment for all, regardless of gender, sexual orientation, disability, ethnicity, religion, or similar personal characteristic.\n- On any communication medium, please avoid using overtly sexual nicknames or other nicknames that might detract from a friendly, safe and welcoming environment for all.\n- Please be kind and courteous. There's no need to be mean or rude.\n- Respect that people have differences of opinion and that every design or implementation choice carries a trade-off and numerous costs. There is seldom a right answer.\n- Please keep unstructured critique to a minimum. If you have solid ideas you want to experiment with, make a fork and see how it works.\n- We will exclude you from interaction if you insult, demean or harass anyone. That is not welcome behavior. We interpret the term \"harassment\" as including the definition in the [Citizen Code of Conduct](http://citizencodeofconduct.org/); if you have any lack of clarity about what might be included in that concept, please read their definition. In particular, we don't tolerate behavior that excludes people in socially marginalized groups.\n- Private harassment is also unacceptable. No matter who you are, if you feel you have been or are being harassed or made uncomfortable by a community member, please contact one the RxJS team immediately. Whether you're a regular contributor or a newcomer, we care about making this community a safe place for you and we've got your back.\n- Likewise any spamming, trolling, flaming, baiting or other attention-stealing behavior is not welcome.\n"
  },
  {
    "path": "component.json",
    "content": "{\n  \"name\": \"rx\",\n  \"scripts\": [\n    \"dist/rx.aggregates.js\",\n    \"dist/rx.aggregates.map\",\n    \"dist/rx.aggregates.min.js\",\n    \"dist/rx.all.compat.js\",\n    \"dist/rx.all.compat.map\",\n    \"dist/rx.all.compat.min.js\",\n    \"dist/rx.all.js\",\n    \"dist/rx.all.min.js\",\n    \"dist/rx.all.map\",\n    \"dist/rx.async.js\",\n    \"dist/rx.async.map\",\n    \"dist/rx.async.min.js\",\n    \"dist/rx.async.compat.js\",\n    \"dist/rx.async.compat.map\",\n    \"dist/rx.async.compat.min.js\",\n    \"dist/rx.backpressure.js\",\n    \"dist/rx.backpressure.map\",\n    \"dist/rx.backpressure.min.js\",\n    \"dist/rx.backpressure.js\",\n    \"dist/rx.backpressure.map\",\n    \"dist/rx.backpressure.min.js\",\n    \"dist/rx.binding.js\",\n    \"dist/rx.binding.map\",\n    \"dist/rx.binding.min.js\",\n    \"dist/rx.coincidence.js\",\n    \"dist/rx.coincidence.map\",\n    \"dist/rx.coincidence.min.js\",\n    \"dist/rx.js\",\n    \"dist/rx.map\",\n    \"dist/rx.min.js\",\n    \"dist/rx.compat.js\",\n    \"dist/rx.compat.map\",\n    \"dist/rx.compat.min.js\",\n    \"dist/rx.experimental.js\",\n    \"dist/rx.experimental.map\",\n    \"dist/rx.experimental.min.js\",\n    \"dist/rx.joinpatterns.js\",\n    \"dist/rx.joinpatterns.map\",\n    \"dist/rx.joinpatterns.min.js\",\n    \"dist/rx.lite.js\",\n    \"dist/rx.lite.map\",\n    \"dist/rx.lite.min.js\",\n    \"dist/rx.lite.compat.js\",\n    \"dist/rx.lite.compat.map\",\n    \"dist/rx.lite.compat.min.js\",\n    \"dist/rx.lite.extras.js\",\n    \"dist/rx.lite.extras.map\",\n    \"dist/rx.lite.extras.min.js\",\n    \"dist/rx.testing.js\",\n    \"dist/rx.testing.map\",\n    \"dist/rx.testing.min.js\",\n    \"dist/rx.time.js\",\n    \"dist/rx.time.map\",\n    \"dist/rx.time.min.js\",\n    \"dist/rx.virtualtime.js\",\n    \"dist/rx.virtualtime.map\",\n    \"dist/rx.virtualtime.min.js\"\n  ]\n}\n"
  },
  {
    "path": "contributing.md",
    "content": "# Contributing to RxJS #\n\nWant to contribute to the Reactive Extensions for JavaScript (RxJS)?  There are many ways of helping whether contributing code, documentation, examples, podcasts, videos and presentations.\n\n# Get Involved!\n\nIn [the issue tracker](https://github.com/Reactive-Extensions/RxJS/issues), bugs can only be assigned to people who have commit access. Also, we aspire to make as many bugs as possible \"owned\" by assigning them to a core Rx contributor. Therefore, just because a bug is assigned doesn't mean it's being actively worked on. We (the core contributors) are all busy, and welcome help from the community. If you see a bug you'd like to work on that's assigned but appears to be dormant, communicate with the bug's owner with an @-reply in a comment on the issue page. If you see a bug you'd like to work on that's unassigned, it's fair game: comment to say you'd like to work on it so that we know it's getting attention.\n\n# Pull Requests\n\nTo make a pull request, you will need a GitHub account; if you're unclear on this process, see GitHub's documentation on [forking](https://help.github.com/articles/fork-a-repo/) and [pull requests](https://help.github.com/articles/using-pull-requests). Pull requests should be targeted at RxJS's master branch. Before pushing to your Github repo and issuing the pull request, please do two things:\n\n1. Rebase your local changes against the master branch. Resolve any conflicts that arise.\n2. Run the full RxJS test suite by running `grunt` in the root of the repository.\n\nPull requests will be treated as \"review requests\", and we will give feedback we expect to see corrected on style and substance before pulling. Changes contributed via pull request should focus on a single issue at a time, like any other. We will not look kindly on pull-requests that try to \"sneak\" unrelated changes in.  Note for bug fixes, regression tests should be included, denoted by Issue Number so that we have full traceability.  \n\n# What Are We Looking For?\n\nFor documentation, we are looking for the following:\n- API Documentation that is missing or out of date\n- \"How Do I?\" examples\n- Comparison to other libraries\n- Comparison to Promises\n- Introduction material\n- Tutorials\n\nFor coding, we have strict standards that must be adhere to when working on RxJS.  In order for us to accept pull requests, they must abide by the following:\n- [Coding Standard](#coding-standard)\n- [Tests](#tests)\n- [Documentation](#documentation)\n\n## Coding Standard\n\nFor RxJS, we follow the [Google JavaScript Style Guide](http://google.github.io/styleguide/jsguide.html) and adhere to it strictly in areas such as documentation using JSDoc.  The only exception to extending native prototypes is to polyfill behavior which may not exist in all browsers yet, for example, many of the [Array#extras](http://blogs.msdn.com/b/ie/archive/2010/12/13/ecmascript-5-part-2-array-extras.aspx) are implemented in compatibility builds.  We also strictly follow [our design guidelines](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/designguidelines) as well.\n\n### Supporting Multiple Platforms\n\nRxJS runs on a number of platforms and supports many styles of programming.  RxJS supports [Universal Module Definition (UMD)](https://github.com/umdjs/umd) which allows the library to work in a number of environments such as [Asynchronous Module Definition (AMD)](https://github.com/amdjs/amdjs-api/wiki/AMD), [CommonJS](http://wiki.commonjs.org/wiki/CommonJS), [Node.js](http://nodejs.org), [RingoJS](http://ringojs.org/), [Narwhal](https://github.com/280north/narwhal), the browser and other environments such as [Windows Script Host (WSH)](http://msdn.microsoft.com/en-us/library/9bbdkx3k.aspx) and embedded devices such as [Tessel](http://tessel.io).\n\nRxJS is committed to using the latest JavaScript standards as they start to arrive, for example, supporting generators, Maps, Sets, and Observable versions of new Array methods.  We also are committed to supporting legacy code as well through compatibility builds, even supporting browsers back to IE6, Firefox 3, and older versions of Node.js.  Should behavior not exist in those platforms, that behavior must be polyfilled, and made available in `*.compat.js` files only.  For example, we have `rx.lite.js` which supports modern browsers greater than or equal to IE9, and `rx.lite.compat.js` for older browsers before IE9 and modern Firefox builds.  In special cases such as event handling is different, we must provide a mainstream version of the file as well as a compat file, the latter which is included in the compat file.\n\n### Implementing Custom Operators\n\nWe welcome custom operators to RxJS if they make sense in the core RxJS, as opposed to belonging in user land.  There are a number of rules that must be adhered to when implementing a custom operator including:\n- Prefer composition over implementing a totally new operator from scratch\n- If the operator introduces any notion of concurrency, then a scheduler must introduced.  Usage of concurrency primitives such as `setTimeout`, `setInterval`, etc are forbidden.  This is to ensure easy testability.  \n  - The scheduler must be optional with the appropriate default picked\n    - `Rx.Scheduler.immediate` for any immediate blocking operations\n    - `Rx.Scheduler.currentThread` for any immediate blocking operators that require re-entrant behavior such as recursive scheduling.\n    - `Rx.Scheduler.timeout` for any operator that has a notion of time  \n\nTo make this concrete, let's implement a custom operator such as an implementation of `_.reject` from [Underscore.js](http://underscorejs.org/) / [Lo-Dash](http://lodash.com/).\n\n```js\n/**\n * The opposite of _.filter this method returns the elements of a collection that the callback does **not** return truthy for.\n * @param {Function} [callback] The function called per iteration.\n * @param {Any} [thisArg] The this binding of callback.\n * @returns {Observable} An Observable sequence which contains items that the callback does not return truthy for.\n */\nRx.Observable.prototype.reject = function (callback, thisArg) {\n  callback || (callback = Rx.helpers.identity);\n  var source = this;\n  return new Rx.AnonymousObservable(function (observer) {\n    var i = 0;\n    return source.subscribe(\n      function (x) {\n        var noYield = true;\n        try {\n          noYield = callback.call(thisArg, x, i++, source);\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n\n        if (!noYield) { observer.onNext(x); }\n      },\n      observer.onError.bind(observer),\n      observer.onCompleted.bind(observer)\n    );\n  });\n};\n```\n\nOf course, we could have implemented this using composition as well, such as using `Rx.Observable.prototype.filter`.\n\n```js\n/**\n * The opposite of _.filter this method returns the elements of a collection that the callback does **not** return truthy for.\n * @param {Function} [callback] The function called per iteration.\n * @param {Any} [thisArg] The this binding of callback.\n * @returns {Observable} An Observable sequence which contains items that the callback does not return truthy for.\n */\nRx.Observable.prototype.reject = function (callback, thisArg) {\n  callback || (callback = Rx.helpers.identity);\n  return this.filter(function (x, i, o) { return !callback.call(thisArg, x, i o); });\n};\n```\n\nTo show an operator that introduces a level of concurrency, let's implement a custom operator such as an implementation of `_.pairs` from [Underscore.js](http://underscorejs.org/) / [Lo-Dash](http://lodash.com/).  Note that since this requires recursion to implement properly, we'll use the `Rx.Scheduler.currentThread` scheduler.\n\n```js\nvar keysFunction = Object.keys || someKeysPolyfill;\n\n/**\n * Creates an Observable with an of an object’s key-value pairs.\n * @param {Object} obj The object to inspect.\n * @returns {Observable} An Observable with an of an object’s key-value pairs.\n */\nRx.Observable.pairs = function (obj, scheduler) {\n  scheduler || (scheduler = Rx.Scheduler.currentThread);\n  return new Rx.AnonymousObservable(function (observer) {\n    var keys = keysFunction(object),\n        i = 0,\n        len = keys.length;\n    return scheduler.scheduleRecursive(function (self) {\n      if (i < len) {\n        var key = keys[i++], value = obj[key];\n        observer.onNext([key, value]);\n        self();\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\n```\n\nNote that all operators must have the documentation and must be split out into its own file.  This allows us to be able to put it in different files, or make it available in custom builds.\n\n## Tests\n\nWhen a new operator is written for RxJS, in order to accepted, must be accompanied by tests.  RxJS currently uses [QUnit](http://qunitjs.com/) as a straight forward way to test our code.  These tests are automatically executed by our [Grunt](http://gruntjs.com/) setup to concatenate files, minimize, create source maps, and finally run all the tests in the [tests folder](https://github.com/Reactive-Extensions/RxJS/tree/master/tests). Each file that we produce, for example, `rx.js` has an accompanying test file such as `rx.html`, which includes tests for all operators included in that file.  \n\nEach operator under test must be in its own file to cover the following cases:\n- Never\n- Empty\n- Single/Multiple Values\n- Error in the sequence\n- Never ending sequences\n- Early disposal in sequences\n\nIf the operator has a callback, then it must cover the following cases:\n- Success with all values in the callback\n- Success with the context, if any allowed in the operator signature\n- If an error is thrown\n\nTo get a good feeling on what kind of rigor is required for testing, check out the following examples:\n- [`concatMap`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/concatmap.js)\n- [`from`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/from.js)\n\n## Documentation\n\nDocumentation is also a must, as all external operators and types must be documented and put in the [API Folder](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api).  Each operator on an Observable must have its own file in the [Operators Folder](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators).\n\nFor operators, they must be linked from the [`Observable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md) API document. In addition, each operator must be listed in which file it belongs in the [Libraries Folder](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/libraries).\n\nThe standard format of operators must be such as the [`of`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/of.md) operator which includes:\n- File Location\n- Method signature\n- Method description\n- List of Arguments\n- Return type (if there is one)\n- An example\n- File Distribution(s)\n- NuGet Distribution\n- NPM Distribution\n- Unit Tests\n"
  },
  {
    "path": "dist/rx.aggregates.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('./rx'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // References\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    BinaryDisposable = Rx.BinaryDisposable,\n    AnonymousObservable = Rx.AnonymousObservable,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    disposableEmpty = Rx.Disposable.empty,\n    helpers = Rx.helpers,\n    defaultComparer = helpers.defaultComparer,\n    identity = helpers.identity,\n    defaultSubComparer = helpers.defaultSubComparer,\n    isFunction = helpers.isFunction,\n    isPromise = helpers.isPromise,\n    isArrayLike = helpers.isArrayLike,\n    isIterable = helpers.isIterable,\n    inherits = Rx.internals.inherits,\n    observableFromPromise = Observable.fromPromise,\n    observableFrom = Observable.from,\n    bindCallback = Rx.internals.bindCallback,\n    EmptyError = Rx.EmptyError,\n    ObservableBase = Rx.ObservableBase,\n    ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  var ExtremaByObservable = (function (__super__) {\n    inherits(ExtremaByObservable, __super__);\n    function ExtremaByObservable(source, k, c) {\n      this.source = source;\n      this._k = k;\n      this._c = c;\n      __super__.call(this);\n    }\n\n    ExtremaByObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ExtremaByObserver(o, this._k, this._c));\n    };\n\n    return ExtremaByObservable;\n  }(ObservableBase));\n\n  var ExtremaByObserver = (function (__super__) {\n    inherits(ExtremaByObserver, __super__);\n    function ExtremaByObserver(o, k, c) {\n      this._o = o;\n      this._k = k;\n      this._c = c;\n      this._v = null;\n      this._hv = false;\n      this._l = [];\n      __super__.call(this);\n    }\n\n    ExtremaByObserver.prototype.next = function (x) {\n      var key = tryCatch(this._k)(x);\n      if (key === errorObj) { return this._o.onError(key.e); }\n      var comparison = 0;\n      if (!this._hv) {\n        this._hv = true;\n        this._v = key;\n      } else {\n        comparison = tryCatch(this._c)(key, this._v);\n        if (comparison === errorObj) { return this._o.onError(comparison.e); }\n      }\n      if (comparison > 0) {\n        this._v = key;\n        this._l = [];\n      }\n      if (comparison >= 0) { this._l.push(x); }\n    };\n\n    ExtremaByObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ExtremaByObserver.prototype.completed = function () {\n      this._o.onNext(this._l);\n      this._o.onCompleted();\n    };\n\n    return ExtremaByObserver;\n  }(AbstractObserver));\n\n  function firstOnly(x) {\n    if (x.length === 0) { throw new EmptyError(); }\n    return x[0];\n  }\n\n  var ReduceObservable = (function(__super__) {\n    inherits(ReduceObservable, __super__);\n    function ReduceObservable(source, accumulator, hasSeed, seed) {\n      this.source = source;\n      this.accumulator = accumulator;\n      this.hasSeed = hasSeed;\n      this.seed = seed;\n      __super__.call(this);\n    }\n\n    ReduceObservable.prototype.subscribeCore = function(observer) {\n      return this.source.subscribe(new ReduceObserver(observer,this));\n    };\n\n    return ReduceObservable;\n  }(ObservableBase));\n\n  var ReduceObserver = (function (__super__) {\n    inherits(ReduceObserver, __super__);\n    function ReduceObserver(o, parent) {\n      this._o = o;\n      this._p = parent;\n      this._fn = parent.accumulator;\n      this._hs = parent.hasSeed;\n      this._s = parent.seed;\n      this._ha = false;\n      this._a = null;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    ReduceObserver.prototype.next = function (x) {\n      !this._hv && (this._hv = true);\n      if (this._ha) {\n        this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n      } else {\n        this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n        this._ha = true;\n      }\n      if (this._a === errorObj) { return this._o.onError(this._a.e); }\n      this._i++;\n    };\n\n    ReduceObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ReduceObserver.prototype.completed = function () {\n      this._hv && this._o.onNext(this._a);\n      !this._hv && this._hs && this._o.onNext(this._s);\n      !this._hv && !this._hs && this._o.onError(new EmptyError());\n      this._o.onCompleted();\n    };\n\n    return ReduceObserver;\n  }(AbstractObserver));\n\n  /**\n  * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n  * For aggregation behavior with incremental intermediate results, see Observable.scan.\n  * @param {Function} accumulator An accumulator function to be invoked on each element.\n  * @param {Any} [seed] The initial accumulator value.\n  * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n  */\n  observableProto.reduce = function () {\n    var hasSeed = false, seed, accumulator = arguments[0];\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new ReduceObservable(this, accumulator, hasSeed, seed);\n  };\n\n  var SomeObservable = (function (__super__) {\n    inherits(SomeObservable, __super__);\n    function SomeObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SomeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SomeObserver(o, this._fn, this.source));\n    };\n\n    return SomeObservable;\n  }(ObservableBase));\n\n  var SomeObserver = (function (__super__) {\n    inherits(SomeObserver, __super__);\n\n    function SomeObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    SomeObserver.prototype.next = function (x) {\n      var result = tryCatch(this._fn)(x, this._i++, this._s);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      if (Boolean(result)) {\n        this._o.onNext(true);\n        this._o.onCompleted();\n      }\n    };\n    SomeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SomeObserver.prototype.completed = function () {\n      this._o.onNext(false);\n      this._o.onCompleted();\n    };\n\n    return SomeObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether any element of an observable sequence satisfies a condition if present, else if any items are in the sequence.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @returns {Observable} An observable sequence containing a single element determining whether any elements in the source sequence pass the test in the specified predicate if given, else if any items are in the sequence.\n   */\n  observableProto.some = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new SomeObservable(this, fn);\n  };\n\n  var IsEmptyObservable = (function (__super__) {\n    inherits(IsEmptyObservable, __super__);\n    function IsEmptyObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    IsEmptyObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new IsEmptyObserver(o));\n    };\n\n    return IsEmptyObservable;\n  }(ObservableBase));\n\n  var IsEmptyObserver = (function(__super__) {\n    inherits(IsEmptyObserver, __super__);\n    function IsEmptyObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    IsEmptyObserver.prototype.next = function () {\n      this._o.onNext(false);\n      this._o.onCompleted();\n    };\n    IsEmptyObserver.prototype.error = function (e) { this._o.onError(e); };\n    IsEmptyObserver.prototype.completed = function () {\n      this._o.onNext(true);\n      this._o.onCompleted();\n    };\n\n    return IsEmptyObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether an observable sequence is empty.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence is empty.\n   */\n  observableProto.isEmpty = function () {\n    return new IsEmptyObservable(this);\n  };\n\n  var EveryObservable = (function (__super__) {\n    inherits(EveryObservable, __super__);\n    function EveryObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    EveryObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new EveryObserver(o, this._fn, this.source));\n    };\n\n    return EveryObservable;\n  }(ObservableBase));\n\n  var EveryObserver = (function (__super__) {\n    inherits(EveryObserver, __super__);\n\n    function EveryObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    EveryObserver.prototype.next = function (x) {\n      var result = tryCatch(this._fn)(x, this._i++, this._s);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      if (!Boolean(result)) {\n        this._o.onNext(false);\n        this._o.onCompleted();\n      }\n    };\n    EveryObserver.prototype.error = function (e) { this._o.onError(e); };\n    EveryObserver.prototype.completed = function () {\n      this._o.onNext(true);\n      this._o.onCompleted();\n    };\n\n    return EveryObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether all elements of an observable sequence satisfy a condition.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element determining whether all elements in the source sequence pass the test in the specified predicate.\n   */\n  observableProto.every = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new EveryObservable(this, fn);\n  };\n\n  var IncludesObservable = (function (__super__) {\n    inherits(IncludesObservable, __super__);\n    function IncludesObservable(source, elem, idx) {\n      var n = +idx || 0;\n      Math.abs(n) === Infinity && (n = 0);\n\n      this.source = source;\n      this._elem = elem;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    IncludesObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(false);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new IncludesObserver(o, this._elem, this._n));\n    };\n\n    return IncludesObservable;\n  }(ObservableBase));\n\n  var IncludesObserver = (function (__super__) {\n    inherits(IncludesObserver, __super__);\n    function IncludesObserver(o, elem, n) {\n      this._o = o;\n      this._elem = elem;\n      this._n = n;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    function comparer(a, b) {\n      return (a === 0 && b === 0) || (a === b || (isNaN(a) && isNaN(b)));\n    }\n\n    IncludesObserver.prototype.next = function (x) {\n      if (this._i++ >= this._n && comparer(x, this._elem)) {\n        this._o.onNext(true);\n        this._o.onCompleted();\n      }\n    };\n    IncludesObserver.prototype.error = function (e) { this._o.onError(e); };\n    IncludesObserver.prototype.completed = function () { this._o.onNext(false); this._o.onCompleted(); };\n\n    return IncludesObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether an observable sequence includes a specified element with an optional equality comparer.\n   * @param searchElement The value to locate in the source sequence.\n   * @param {Number} [fromIndex] An equality comparer to compare elements.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence includes an element that has the specified value from the given index.\n   */\n  observableProto.includes = function (searchElement, fromIndex) {\n    return new IncludesObservable(this, searchElement, fromIndex);\n  };\n\n  var CountObservable = (function (__super__) {\n    inherits(CountObservable, __super__);\n    function CountObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CountObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new CountObserver(o, this._fn, this.source));\n    };\n\n    return CountObservable;\n  }(ObservableBase));\n\n  var CountObserver = (function (__super__) {\n    inherits(CountObserver, __super__);\n\n    function CountObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      this._c = 0;\n      __super__.call(this);\n    }\n\n    CountObserver.prototype.next = function (x) {\n      if (this._fn) {\n        var result = tryCatch(this._fn)(x, this._i++, this._s);\n        if (result === errorObj) { return this._o.onError(result.e); }\n        Boolean(result) && (this._c++);\n      } else {\n        this._c++;\n      }\n    };\n    CountObserver.prototype.error = function (e) { this._o.onError(e); };\n    CountObserver.prototype.completed = function () {\n      this._o.onNext(this._c);\n      this._o.onCompleted();\n    };\n\n    return CountObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns an observable sequence containing a value that represents how many elements in the specified observable sequence satisfy a condition if provided, else the count of items.\n   * @example\n   * res = source.count();\n   * res = source.count(function (x) { return x > 3; });\n   * @param {Function} [predicate]A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with a number that represents how many elements in the input sequence satisfy the condition in the predicate function if provided, else the count of items in the sequence.\n   */\n  observableProto.count = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new CountObservable(this, fn);\n  };\n\n  var IndexOfObservable = (function (__super__) {\n    inherits(IndexOfObservable, __super__);\n    function IndexOfObservable(source, e, n) {\n      this.source = source;\n      this._e = e;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    IndexOfObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(-1);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new IndexOfObserver(o, this._e, this._n));\n    };\n\n    return IndexOfObservable;\n  }(ObservableBase));\n\n  var IndexOfObserver = (function (__super__) {\n    inherits(IndexOfObserver, __super__);\n    function IndexOfObserver(o, e, n) {\n      this._o = o;\n      this._e = e;\n      this._n = n;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    IndexOfObserver.prototype.next = function (x) {\n      if (this._i >= this._n && x === this._e) {\n        this._o.onNext(this._i);\n        this._o.onCompleted();\n      }\n      this._i++;\n    };\n    IndexOfObserver.prototype.error = function (e) { this._o.onError(e); };\n    IndexOfObserver.prototype.completed = function () { this._o.onNext(-1); this._o.onCompleted(); };\n\n    return IndexOfObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   * @param {Any} searchElement Element to locate in the array.\n   * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n   * @returns {Observable} And observable sequence containing the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   */\n  observableProto.indexOf = function(searchElement, fromIndex) {\n    var n = +fromIndex || 0;\n    Math.abs(n) === Infinity && (n = 0);\n    return new IndexOfObservable(this, searchElement, n);\n  };\n\n  var SumObservable = (function (__super__) {\n    inherits(SumObservable, __super__);\n    function SumObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SumObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SumObserver(o, this._fn, this.source));\n    };\n\n    return SumObservable;\n  }(ObservableBase));\n\n  var SumObserver = (function (__super__) {\n    inherits(SumObserver, __super__);\n\n    function SumObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      this._c = 0;\n      __super__.call(this);\n    }\n\n    SumObserver.prototype.next = function (x) {\n      if (this._fn) {\n        var result = tryCatch(this._fn)(x, this._i++, this._s);\n        if (result === errorObj) { return this._o.onError(result.e); }\n        this._c += result;\n      } else {\n        this._c += x;\n      }\n    };\n    SumObserver.prototype.error = function (e) { this._o.onError(e); };\n    SumObserver.prototype.completed = function () {\n      this._o.onNext(this._c);\n      this._o.onCompleted();\n    };\n\n    return SumObserver;\n  }(AbstractObserver));\n\n  /**\n   * Computes the sum of a sequence of values that are obtained by invoking an optional transform function on each element of the input sequence, else if not specified computes the sum on each item in the sequence.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the sum of the values in the source sequence.\n   */\n  observableProto.sum = function (keySelector, thisArg) {\n    var fn = bindCallback(keySelector, thisArg, 3);\n    return new SumObservable(this, fn);\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n   * @example\n   * var res = source.minBy(function (x) { return x.value; });\n   * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer] Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n   */\n  observableProto.minBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return new ExtremaByObservable(this, keySelector, function (x, y) { return comparer(x, y) * -1; });\n  };\n\n  /**\n   * Returns the minimum element in an observable sequence according to the optional comparer else a default greater than less than check.\n   * @example\n   * var res = source.min();\n   * var res = source.min(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the minimum element in the source sequence.\n   */\n  observableProto.min = function (comparer) {\n    return this.minBy(identity, comparer).map(firstOnly);\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n   * @example\n   * var res = source.maxBy(function (x) { return x.value; });\n   * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer]  Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n   */\n  observableProto.maxBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return new ExtremaByObservable(this, keySelector, comparer);\n  };\n\n  /**\n   * Returns the maximum value in an observable sequence according to the specified comparer.\n   * @example\n   * var res = source.max();\n   * var res = source.max(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the maximum element in the source sequence.\n   */\n  observableProto.max = function (comparer) {\n    return this.maxBy(identity, comparer).map(firstOnly);\n  };\n\n  var AverageObservable = (function (__super__) {\n    inherits(AverageObservable, __super__);\n    function AverageObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    AverageObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new AverageObserver(o, this._fn, this.source));\n    };\n\n    return AverageObservable;\n  }(ObservableBase));\n\n  var AverageObserver = (function(__super__) {\n    inherits(AverageObserver, __super__);\n    function AverageObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._c = 0;\n      this._t = 0;\n      __super__.call(this);\n    }\n\n    AverageObserver.prototype.next = function (x) {\n      if(this._fn) {\n        var r = tryCatch(this._fn)(x, this._c++, this._s);\n        if (r === errorObj) { return this._o.onError(r.e); }\n        this._t += r;\n      } else {\n        this._c++;\n        this._t += x;\n      }\n    };\n    AverageObserver.prototype.error = function (e) { this._o.onError(e); };\n    AverageObserver.prototype.completed = function () {\n      if (this._c === 0) { return this._o.onError(new EmptyError()); }\n      this._o.onNext(this._t / this._c);\n      this._o.onCompleted();\n    };\n\n    return AverageObserver;\n  }(AbstractObserver));\n\n  /**\n   * Computes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the average of the sequence of values.\n   */\n  observableProto.average = function (keySelector, thisArg) {\n    var source = this, fn;\n    if (isFunction(keySelector)) {\n      fn = bindCallback(keySelector, thisArg, 3);\n    }\n    return new AverageObservable(source, fn);\n  };\n\n  /**\n   *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n   *\n   * @example\n   * var res = res = source.sequenceEqual([1,2,3]);\n   * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n   * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n   * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n   * @param {Observable} second Second observable sequence or array to compare.\n   * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n   * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n   */\n  observableProto.sequenceEqual = function (second, comparer) {\n    var first = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var donel = false, doner = false, ql = [], qr = [];\n      var subscription1 = first.subscribe(function (x) {\n        if (qr.length > 0) {\n          var v = qr.shift();\n          var equal = tryCatch(comparer)(v, x);\n          if (equal === errorObj) { return o.onError(equal.e); }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (doner) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          ql.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        donel = true;\n        if (ql.length === 0) {\n          if (qr.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (doner) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n\n      (isArrayLike(second) || isIterable(second)) && (second = observableFrom(second));\n      isPromise(second) && (second = observableFromPromise(second));\n      var subscription2 = second.subscribe(function (x) {\n        if (ql.length > 0) {\n          var v = ql.shift();\n          var equal = tryCatch(comparer)(v, x);\n          if (equal === errorObj) { return o.onError(equal.e); }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (donel) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          qr.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        doner = true;\n        if (qr.length === 0) {\n          if (ql.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (donel) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n      return new BinaryDisposable(subscription1, subscription2);\n    }, first);\n  };\n\n  var ElementAtObservable = (function (__super__) {\n    inherits(ElementAtObservable, __super__);\n    function ElementAtObservable(source, i, d) {\n      this.source = source;\n      this._i = i;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    ElementAtObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ElementAtObserver(o, this._i, this._d));\n    };\n\n    return ElementAtObservable;\n  }(ObservableBase));\n\n  var ElementAtObserver = (function (__super__) {\n    inherits(ElementAtObserver, __super__);\n\n    function ElementAtObserver(o, i, d) {\n      this._o = o;\n      this._i = i;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    ElementAtObserver.prototype.next = function (x) {\n      if (this._i-- === 0) {\n        this._o.onNext(x);\n        this._o.onCompleted();\n      }\n    };\n    ElementAtObserver.prototype.error = function (e) { this._o.onError(e); };\n    ElementAtObserver.prototype.completed = function () {\n      if (this._d === undefined) {\n        this._o.onError(new ArgumentOutOfRangeError());\n      } else {\n        this._o.onNext(this._d);\n        this._o.onCompleted();\n      }\n    };\n\n    return ElementAtObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the element at a specified index in a sequence or default value if not found.\n   * @param {Number} index The zero-based index of the element to retrieve.\n   * @param {Any} [defaultValue] The default value to use if elementAt does not find a value.\n   * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence.\n   */\n  observableProto.elementAt =  function (index, defaultValue) {\n    if (index < 0) { throw new ArgumentOutOfRangeError(); }\n    return new ElementAtObservable(this, index, defaultValue);\n  };\n\n  var SingleObserver = (function(__super__) {\n    inherits(SingleObserver, __super__);\n    function SingleObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      this._hv = false;\n      this._v = null;\n      __super__.call(this);\n    }\n\n    SingleObserver.prototype.next = function (x) {\n      var shouldYield = false;\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        Boolean(res) && (shouldYield = true);\n      } else if (!this._obj.predicate) {\n        shouldYield = true;\n      }\n      if (shouldYield) {\n        if (this._hv) {\n          return this._o.onError(new Error('Sequence contains more than one matching element'));\n        }\n        this._hv = true;\n        this._v = x;\n      }\n    };\n    SingleObserver.prototype.error = function (e) { this._o.onError(e); };\n    SingleObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n        this._o.onCompleted();\n      }\n      else if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return SingleObserver;\n  }(AbstractObserver));\n\n\n    /**\n     * Returns the only element of an observable sequence that satisfies the condition in the optional predicate, and reports an exception if there is not exactly one element in the observable sequence.\n     * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate.\n     */\n    observableProto.single = function (predicate, thisArg) {\n      var obj = {}, source = this;\n      if (typeof arguments[0] === 'object') {\n        obj = arguments[0];\n      } else {\n        obj = {\n          predicate: arguments[0],\n          thisArg: arguments[1],\n          defaultValue: arguments[2]\n        };\n      }\n      if (isFunction (obj.predicate)) {\n        var fn = obj.predicate;\n        obj.predicate = bindCallback(fn, obj.thisArg, 3);\n      }\n      return new AnonymousObservable(function (o) {\n        return source.subscribe(new SingleObserver(o, obj, source));\n      }, source);\n    };\n\n  var FirstObservable = (function (__super__) {\n    inherits(FirstObservable, __super__);\n    function FirstObservable(source, obj) {\n      this.source = source;\n      this._obj = obj;\n      __super__.call(this);\n    }\n\n    FirstObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new FirstObserver(o, this._obj, this.source));\n    };\n\n    return FirstObservable;\n  }(ObservableBase));\n\n  var FirstObserver = (function(__super__) {\n    inherits(FirstObserver, __super__);\n    function FirstObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    FirstObserver.prototype.next = function (x) {\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        if (Boolean(res)) {\n          this._o.onNext(x);\n          this._o.onCompleted();\n        }\n      } else if (!this._obj.predicate) {\n        this._o.onNext(x);\n        this._o.onCompleted();\n      }\n    };\n    FirstObserver.prototype.error = function (e) { this._o.onError(e); };\n    FirstObserver.prototype.completed = function () {\n      if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return FirstObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the first element of an observable sequence that satisfies the condition in the predicate if present else the first item in the sequence.\n   * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate if provided, else the first item in the sequence.\n   */\n  observableProto.first = function () {\n    var obj = {}, source = this;\n    if (typeof arguments[0] === 'object') {\n      obj = arguments[0];\n    } else {\n      obj = {\n        predicate: arguments[0],\n        thisArg: arguments[1],\n        defaultValue: arguments[2]\n      };\n    }\n    if (isFunction (obj.predicate)) {\n      var fn = obj.predicate;\n      obj.predicate = bindCallback(fn, obj.thisArg, 3);\n    }\n    return new FirstObservable(this, obj);\n  };\n\n  var LastObservable = (function (__super__) {\n    inherits(LastObservable, __super__);\n    function LastObservable(source, obj) {\n      this.source = source;\n      this._obj = obj;\n      __super__.call(this);\n    }\n\n    LastObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new LastObserver(o, this._obj, this.source));\n    };\n\n    return LastObservable;\n  }(ObservableBase));\n\n  var LastObserver = (function(__super__) {\n    inherits(LastObserver, __super__);\n    function LastObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      this._hv = false;\n      this._v = null;\n      __super__.call(this);\n    }\n\n    LastObserver.prototype.next = function (x) {\n      var shouldYield = false;\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        Boolean(res) && (shouldYield = true);\n      } else if (!this._obj.predicate) {\n        shouldYield = true;\n      }\n      if (shouldYield) {\n        this._hv = true;\n        this._v = x;\n      }\n    };\n    LastObserver.prototype.error = function (e) { this._o.onError(e); };\n    LastObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n        this._o.onCompleted();\n      }\n      else if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return LastObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the last element of an observable sequence that satisfies the condition in the predicate if specified, else the last element.\n   * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate.\n   */\n  observableProto.last = function () {\n    var obj = {}, source = this;\n    if (typeof arguments[0] === 'object') {\n      obj = arguments[0];\n    } else {\n      obj = {\n        predicate: arguments[0],\n        thisArg: arguments[1],\n        defaultValue: arguments[2]\n      };\n    }\n    if (isFunction (obj.predicate)) {\n      var fn = obj.predicate;\n      obj.predicate = bindCallback(fn, obj.thisArg, 3);\n    }\n    return new LastObservable(this, obj);\n  };\n\n  var FindValueObserver = (function(__super__) {\n    inherits(FindValueObserver, __super__);\n    function FindValueObserver(observer, source, callback, yieldIndex) {\n      this._o = observer;\n      this._s = source;\n      this._cb = callback;\n      this._y = yieldIndex;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    FindValueObserver.prototype.next = function (x) {\n      var shouldRun = tryCatch(this._cb)(x, this._i, this._s);\n      if (shouldRun === errorObj) { return this._o.onError(shouldRun.e); }\n      if (shouldRun) {\n        this._o.onNext(this._y ? this._i : x);\n        this._o.onCompleted();\n      } else {\n        this._i++;\n      }\n    };\n\n    FindValueObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    FindValueObserver.prototype.completed = function () {\n      this._y && this._o.onNext(-1);\n      this._o.onCompleted();\n    };\n\n    return FindValueObserver;\n  }(AbstractObserver));\n\n  function findValue (source, predicate, thisArg, yieldIndex) {\n    var callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new FindValueObserver(o, source, callback, yieldIndex));\n    }, source);\n  }\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the first element that matches the conditions defined by the specified predicate, if found; otherwise, undefined.\n   */\n  observableProto.find = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, false);\n  };\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns\n   * an Observable sequence with the zero-based index of the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the zero-based index of the first occurrence of an element that matches the conditions defined by match, if found; otherwise, –1.\n  */\n  observableProto.findIndex = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, true);\n  };\n\n  var ToSetObservable = (function (__super__) {\n    inherits(ToSetObservable, __super__);\n    function ToSetObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    ToSetObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ToSetObserver(o));\n    };\n\n    return ToSetObservable;\n  }(ObservableBase));\n\n  var ToSetObserver = (function (__super__) {\n    inherits(ToSetObserver, __super__);\n    function ToSetObserver(o) {\n      this._o = o;\n      this._s = new root.Set();\n      __super__.call(this);\n    }\n\n    ToSetObserver.prototype.next = function (x) {\n      this._s.add(x);\n    };\n\n    ToSetObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ToSetObserver.prototype.completed = function () {\n      this._o.onNext(this._s);\n      this._o.onCompleted();\n    };\n\n    return ToSetObserver;\n  }(AbstractObserver));\n\n  /**\n   * Converts the observable sequence to a Set if it exists.\n   * @returns {Observable} An observable sequence with a single value of a Set containing the values from the observable sequence.\n   */\n  observableProto.toSet = function () {\n    if (typeof root.Set === 'undefined') { throw new TypeError(); }\n    return new ToSetObservable(this);\n  };\n\n  var ToMapObservable = (function (__super__) {\n    inherits(ToMapObservable, __super__);\n    function ToMapObservable(source, k, e) {\n      this.source = source;\n      this._k = k;\n      this._e = e;\n      __super__.call(this);\n    }\n\n    ToMapObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ToMapObserver(o, this._k, this._e));\n    };\n\n    return ToMapObservable;\n  }(ObservableBase));\n\n  var ToMapObserver = (function (__super__) {\n    inherits(ToMapObserver, __super__);\n    function ToMapObserver(o, k, e) {\n      this._o = o;\n      this._k = k;\n      this._e = e;\n      this._m = new root.Map();\n      __super__.call(this);\n    }\n\n    ToMapObserver.prototype.next = function (x) {\n      var key = tryCatch(this._k)(x);\n      if (key === errorObj) { return this._o.onError(key.e); }\n      var elem = x;\n      if (this._e) {\n        elem = tryCatch(this._e)(x);\n        if (elem === errorObj) { return this._o.onError(elem.e); }\n      }\n\n      this._m.set(key, elem);\n    };\n\n    ToMapObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ToMapObserver.prototype.completed = function () {\n      this._o.onNext(this._m);\n      this._o.onCompleted();\n    };\n\n    return ToMapObserver;\n  }(AbstractObserver));\n\n  /**\n  * Converts the observable sequence to a Map if it exists.\n  * @param {Function} keySelector A function which produces the key for the Map.\n  * @param {Function} [elementSelector] An optional function which produces the element for the Map. If not present, defaults to the value from the observable sequence.\n  * @returns {Observable} An observable sequence with a single value of a Map containing the values from the observable sequence.\n  */\n  observableProto.toMap = function (keySelector, elementSelector) {\n    if (typeof root.Map === 'undefined') { throw new TypeError(); }\n    return new ToMapObservable(this, keySelector, elementSelector);\n  };\n\n  var SliceObservable = (function (__super__) {\n    inherits(SliceObservable, __super__);\n    function SliceObservable(source, b, e) {\n      this.source = source;\n      this._b = b;\n      this._e = e;\n      __super__.call(this);\n    }\n\n    SliceObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SliceObserver(o, this._b, this._e));\n    };\n\n    return SliceObservable;\n  }(ObservableBase));\n\n  var SliceObserver = (function (__super__) {\n    inherits(SliceObserver, __super__);\n\n    function SliceObserver(o, b, e) {\n      this._o = o;\n      this._b = b;\n      this._e = e;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    SliceObserver.prototype.next = function (x) {\n      if (this._i >= this._b) {\n        if (this._e === this._i) {\n          this._o.onCompleted();\n        } else {\n          this._o.onNext(x);\n        }\n      }\n      this._i++;\n    };\n    SliceObserver.prototype.error = function (e) { this._o.onError(e); };\n    SliceObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SliceObserver;\n  }(AbstractObserver));\n\n  /*\n  * The slice() method returns a shallow copy of a portion of an Observable into a new Observable object.\n  * Unlike the array version, this does not support negative numbers for being or end.\n  * @param {Number} [begin] Zero-based index at which to begin extraction. If omitted, this will default to zero.\n  * @param {Number} [end] Zero-based index at which to end extraction. slice extracts up to but not including end.\n  * If omitted, this will emit the rest of the Observable object.\n  * @returns {Observable} A shallow copy of a portion of an Observable into a new Observable object.\n  */\n  observableProto.slice = function (begin, end) {\n    var start = begin || 0;\n    if (start < 0) { throw new Rx.ArgumentOutOfRangeError(); }\n    if (typeof end === 'number' && end < start) {\n      throw new Rx.ArgumentOutOfRangeError();\n    }\n    return new SliceObservable(this, start, end);\n  };\n\n  var LastIndexOfObservable = (function (__super__) {\n    inherits(LastIndexOfObservable, __super__);\n    function LastIndexOfObservable(source, e, n) {\n      this.source = source;\n      this._e = e;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    LastIndexOfObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(-1);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new LastIndexOfObserver(o, this._e, this._n));\n    };\n\n    return LastIndexOfObservable;\n  }(ObservableBase));\n\n  var LastIndexOfObserver = (function (__super__) {\n    inherits(LastIndexOfObserver, __super__);\n    function LastIndexOfObserver(o, e, n) {\n      this._o = o;\n      this._e = e;\n      this._n = n;\n      this._v = 0;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    LastIndexOfObserver.prototype.next = function (x) {\n      if (this._i >= this._n && x === this._e) {\n        this._hv = true;\n        this._v = this._i;\n      }\n      this._i++;\n    };\n    LastIndexOfObserver.prototype.error = function (e) { this._o.onError(e); };\n    LastIndexOfObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n      } else {\n        this._o.onNext(-1);\n      }\n      this._o.onCompleted();\n    };\n\n    return LastIndexOfObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the last index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   * @param {Any} searchElement Element to locate in the array.\n   * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n   * @returns {Observable} And observable sequence containing the last index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   */\n  observableProto.lastIndexOf = function(searchElement, fromIndex) {\n    var n = +fromIndex || 0;\n    Math.abs(n) === Infinity && (n = 0);\n    return new LastIndexOfObservable(this, searchElement, n);\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "dist/rx.all.compat.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (undefined) {\n\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  var Rx = {\n    internals: {},\n    config: {\n      Promise: root.Promise\n    },\n    helpers: { }\n  };\n\n  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    defaultNow = Rx.helpers.defaultNow = (function () { return !!Date.now ? Date.now : function () { return +new Date; }; }()),\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.subscribe !== 'function' && typeof p.then === 'function'; },\n    isFunction = Rx.helpers.isFunction = (function () {\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      };\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n      return isFn;\n    }());\n\n    function cloneArray(arr) {\n      var len = arr.length, a = new Array(len);\n      for(var i = 0; i < len; i++) { a[i] = arr[i]; }\n      return a;\n    }\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  Rx.config.longStackSupport = false;\n  var hasStacks = false, stacks = tryCatch(function () { throw new Error(); })();\n  hasStacks = !!stacks.e && !!stacks.e.stack;\n\n  // All code after this point will be filtered from stack traces reported by RxJS\n  var rStartingLine = captureLine(), rFileName;\n\n  var STACK_JUMP_SEPARATOR = 'From previous event:';\n\n  function makeStackTraceLong(error, observable) {\n    // If possible, transform the error stack trace by removing Node and RxJS\n    // cruft, then concatenating with the stack trace of `observable`.\n    if (hasStacks &&\n        observable.stack &&\n        typeof error === 'object' &&\n        error !== null &&\n        error.stack &&\n        error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n    ) {\n      var stacks = [];\n      for (var o = observable; !!o; o = o.source) {\n        if (o.stack) {\n          stacks.unshift(o.stack);\n        }\n      }\n      stacks.unshift(error.stack);\n\n      var concatedStacks = stacks.join('\\n' + STACK_JUMP_SEPARATOR + '\\n');\n      error.stack = filterStackString(concatedStacks);\n    }\n  }\n\n  function filterStackString(stackString) {\n    var lines = stackString.split('\\n'), desiredLines = [];\n    for (var i = 0, len = lines.length; i < len; i++) {\n      var line = lines[i];\n\n      if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n        desiredLines.push(line);\n      }\n    }\n    return desiredLines.join('\\n');\n  }\n\n  function isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n    if (!fileNameAndLineNumber) {\n      return false;\n    }\n    var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === rFileName &&\n      lineNumber >= rStartingLine &&\n      lineNumber <= rEndingLine;\n  }\n\n  function isNodeFrame(stackLine) {\n    return stackLine.indexOf('(module.js:') !== -1 ||\n      stackLine.indexOf('(node.js:') !== -1;\n  }\n\n  function captureLine() {\n    if (!hasStacks) { return; }\n\n    try {\n      throw new Error();\n    } catch (e) {\n      var lines = e.stack.split('\\n');\n      var firstLine = lines[0].indexOf('@') > 0 ? lines[1] : lines[2];\n      var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n      if (!fileNameAndLineNumber) { return; }\n\n      rFileName = fileNameAndLineNumber[0];\n      return fileNameAndLineNumber[1];\n    }\n  }\n\n  function getFileNameAndLineNumber(stackLine) {\n    // Named functions: 'at functionName (filename:lineNumber:columnNumber)'\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }\n\n    // Anonymous functions: 'at filename:lineNumber:columnNumber'\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }\n\n    // Firefox style: 'function@filename:lineNumber or @filename:lineNumber'\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }\n  }\n\n  // Utilities\n  var toString = Object.prototype.toString;\n  var arrayClass = '[object Array]',\n      funcClass = '[object Function]',\n      stringClass = '[object String]';\n\n  if (!Array.prototype.forEach) {\n    Array.prototype.forEach = function (callback, thisArg) {\n      var T, k;\n\n      if (this == null) {\n        throw new TypeError(' this is null or not defined');\n      }\n\n      var O = Object(this);\n      var len = O.length >>> 0;\n\n      if (typeof callback !== 'function') {\n        throw new TypeError(callback + ' is not a function');\n      }\n\n      if (arguments.length > 1) {\n        T = thisArg;\n      }\n\n      k = 0;\n      while (k < len) {\n        var kValue;\n        if (k in O) {\n          kValue = O[k];\n          callback.call(T, kValue, k, O);\n        }\n        k++;\n      }\n    };\n  }\n\n  var boxedString = Object('a'),\n      splitString = boxedString[0] !== 'a' || !(0 in boxedString);\n  if (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n      var object = Object(this),\n        self = splitString && toString.call(this) === stringClass ?\n          this.split('') :\n          object,\n        length = self.length >>> 0,\n        thisp = arguments[1];\n\n      if (toString.call(fun) !== funcClass) {\n        throw new TypeError(fun + ' is not a function');\n      }\n\n      for (var i = 0; i < length; i++) {\n        if (i in self && !fun.call(thisp, self[i], i, object)) {\n          return false;\n        }\n      }\n      return true;\n    };\n  }\n\n  if (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n      var object = Object(this),\n        self = splitString && toString.call(this) === stringClass ?\n            this.split('') :\n            object,\n        length = self.length >>> 0,\n        result = new Array(length),\n        thisp = arguments[1];\n\n      if (toString.call(fun) !== funcClass) {\n        throw new TypeError(fun + ' is not a function');\n      }\n\n      for (var i = 0; i < length; i++) {\n        if (i in self) {\n          result[i] = fun.call(thisp, self[i], i, object);\n        }\n      }\n      return result;\n    };\n  }\n\n  if (!Array.prototype.filter) {\n    Array.prototype.filter = function (predicate) {\n      var results = [], item, t = new Object(this);\n      for (var i = 0, len = t.length >>> 0; i < len; i++) {\n        item = t[i];\n        if (i in t && predicate.call(arguments[1], item, i, t)) {\n          results.push(item);\n        }\n      }\n      return results;\n    };\n  }\n\n  if (!Array.isArray) {\n    Array.isArray = function (arg) {\n      return toString.call(arg) === arrayClass;\n    };\n  }\n\n  if (!Array.prototype.indexOf) {\n    Array.prototype.indexOf = function indexOf(searchElement) {\n      var t = Object(this);\n      var len = t.length >>> 0;\n      if (len === 0) {\n        return -1;\n      }\n      var n = 0;\n      if (arguments.length > 1) {\n        n = Number(arguments[1]);\n        if (n !== n) {\n          n = 0;\n        } else if (n !== 0 && n !== Infinity && n !== -Infinity) {\n          n = (n > 0 || -1) * Math.floor(Math.abs(n));\n        }\n      }\n      if (n >= len) {\n        return -1;\n      }\n      var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);\n      for (; k < len; k++) {\n        if (k in t && t[k] === searchElement) {\n          return k;\n        }\n      }\n      return -1;\n    };\n  }\n\n  // Fix for Tessel\n  if (!Object.prototype.propertyIsEnumerable) {\n    Object.prototype.propertyIsEnumerable = function (key) {\n      for (var k in this) { if (k === key) { return true; } }\n      return false;\n    };\n  }\n\n  if (!Object.keys) {\n    Object.keys = (function() {\n      'use strict';\n      var hasOwnProperty = Object.prototype.hasOwnProperty,\n      hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString');\n\n      return function(obj) {\n        if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n          throw new TypeError('Object.keys called on non-object');\n        }\n\n        var result = [], prop, i;\n\n        for (prop in obj) {\n          if (hasOwnProperty.call(obj, prop)) {\n            result.push(prop);\n          }\n        }\n\n        if (hasDontEnumBug) {\n          for (i = 0; i < dontEnumsLength; i++) {\n            if (hasOwnProperty.call(obj, dontEnums[i])) {\n              result.push(dontEnums[i]);\n            }\n          }\n        }\n        return result;\n      };\n    }());\n  }\n\n  if (typeof Object.create !== 'function') {\n    // Production steps of ECMA-262, Edition 5, 15.2.3.5\n    // Reference: http://es5.github.io/#x15.2.3.5\n    Object.create = (function() {\n      function Temp() {}\n\n      var hasOwn = Object.prototype.hasOwnProperty;\n\n      return function (O) {\n        if (typeof O !== 'object') {\n          throw new TypeError('Object prototype may only be an Object or null');\n        }\n\n        Temp.prototype = O;\n        var obj = new Temp();\n        Temp.prototype = null;\n\n        if (arguments.length > 1) {\n          // Object.defineProperties does ToObject on its first argument.\n          var Properties = Object(arguments[1]);\n          for (var prop in Properties) {\n            if (hasOwn.call(Properties, prop)) {\n              obj[prop] = Properties[prop];\n            }\n          }\n        }\n\n        // 5. Return obj\n        return obj;\n      };\n    })();\n  }\n\n  root.Element && root.Element.prototype.attachEvent && !root.Element.prototype.addEventListener && (function () {\n    function addMethod(name, fn) {\n      Window.prototype[name] = HTMLDocument.prototype[name] = Element.prototype[name] = fn;\n    }\n\n    addMethod('addEventListener', function (type, listener) {\n      var target = this;\n      var listeners = target._c1_listeners = target._c1_listeners || {};\n      var typeListeners = listeners[type] = listeners[type] || [];\n\n      target.attachEvent('on' + type, typeListeners.event = function (e) {\n        e || (e = root.event);\n\n        var documentElement = target.document &&\n          target.document.documentElement ||\n          target.documentElement ||\n          { scrollLeft: 0, scrollTop: 0 };\n\n        e.currentTarget = target;\n        e.pageX = e.clientX + documentElement.scrollLeft;\n        e.pageY = e.clientY + documentElement.scrollTop;\n\n        e.preventDefault = function () {\n          e.bubbledKeyCode = e.keyCode;\n          if (e.ctrlKey) {\n            try {\n              e.keyCode = 0;\n            } catch (e) { }\n          }\n          e.defaultPrevented = true;\n          e.returnValue = false;\n          e.modified = true;\n          e.returnValue = false;\n        };\n\n        e.stopImmediatePropagation = function () {\n          immediatePropagation = false;\n          e.cancelBubble = true;\n        };\n\n        e.stopPropagation = function () {\n          e.cancelBubble = true;\n        };\n\n        e.relatedTarget = e.fromElement || null;\n        e.target = e.srcElement || target;\n        e.timeStamp = +new Date();\n\n        // Normalize key events\n        switch(e.type) {\n          case 'keypress':\n            var c = ('charCode' in e ? e.charCode : e.keyCode);\n            if (c === 10) {\n              c = 0;\n              e.keyCode = 13;\n            } else if (c === 13 || c === 27) {\n              c = 0;\n            } else if (c === 3) {\n              c = 99;\n            }\n            e.charCode = c;\n            e.keyChar = e.charCode ? String.fromCharCode(e.charCode) : '';\n            break;\n        }\n\n        var copiedEvent = {};\n        for (var prop in e) {\n          copiedEvent[prop] = e[prop];\n        }\n\n        for (var i = 0, typeListenersCache = [].concat(typeListeners), typeListenerCache, immediatePropagation = true; immediatePropagation && (typeListenerCache = typeListenersCache[i]); ++i) {\n          for (var ii = 0, typeListener; typeListener = typeListeners[ii]; ++ii) {\n            if (typeListener === typeListenerCache) { typeListener.call(target, copiedEvent); break; }\n          }\n        }\n      });\n\n      typeListeners.push(listener);\n    });\n\n    addMethod('removeEventListener', function (type, listener) {\n      var target = this;\n      var listeners = target._c1_listeners = target._c1_listeners || {};\n      var typeListeners = listeners[type] = listeners[type] || [];\n\n      for (var i = typeListeners.length - 1, typeListener; typeListener = typeListeners[i]; --i) {\n        if (typeListener === listener) { typeListeners.splice(i, 1); break; }\n      }\n\n      !typeListeners.length &&\n        typeListeners.event &&\n        target.detachEvent('on' + type, typeListeners.event);\n    });\n\n    addMethod('dispatchEvent', function (e) {\n      var target = this;\n      var type = e.type;\n      var listeners = target._c1_listeners = target._c1_listeners || {};\n      var typeListeners = listeners[type] = listeners[type] || [];\n\n      try {\n        return target.fireEvent('on' + type, e);\n      } catch (err) {\n        return typeListeners.event && typeListeners.event(e);\n      }\n    });\n\n    function ready() {\n      if (ready.interval && document.body) {\n        ready.interval = clearInterval(ready.interval);\n\n        document.dispatchEvent(new CustomEvent('DOMContentLoaded'));\n      }\n    }\n\n    ready.interval = setInterval(ready, 1);\n\n    root.addEventListener('load', ready);\n  }());\n\n  (!root.CustomEvent || typeof root.CustomEvent === 'object') && (function() {\n    function CustomEvent (type, params) {\n      var event;\n      params = params || { bubbles: false, cancelable: false, detail: undefined };\n\n      try {\n        if (document.createEvent) {\n          event = document.createEvent('CustomEvent');\n          event.initCustomEvent(type, params.bubbles, params.cancelable, params.detail);\n        } else if (document.createEventObject) {\n          event = document.createEventObject();\n        }\n      } catch (error) {\n        event = document.createEvent('Event');\n        event.initEvent(type, params.bubbles, params.cancelable);\n        event.detail = params.detail;\n      }\n\n      return event;\n    }\n\n    root.CustomEvent && (CustomEvent.prototype = root.CustomEvent.prototype);\n    root.CustomEvent = CustomEvent;\n  }());\n\n  var EmptyError = Rx.EmptyError = function() {\n    this.message = 'Sequence contains no elements.';\n    Error.call(this);\n  };\n  EmptyError.prototype = Object.create(Error.prototype);\n  EmptyError.prototype.name = 'EmptyError';\n\n  var ObjectDisposedError = Rx.ObjectDisposedError = function() {\n    this.message = 'Object has been disposed';\n    Error.call(this);\n  };\n  ObjectDisposedError.prototype = Object.create(Error.prototype);\n  ObjectDisposedError.prototype.name = 'ObjectDisposedError';\n\n  var ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError = function () {\n    this.message = 'Argument out of range';\n    Error.call(this);\n  };\n  ArgumentOutOfRangeError.prototype = Object.create(Error.prototype);\n  ArgumentOutOfRangeError.prototype.name = 'ArgumentOutOfRangeError';\n\n  var NotSupportedError = Rx.NotSupportedError = function (message) {\n    this.message = message || 'This operation is not supported';\n    Error.call(this);\n  };\n  NotSupportedError.prototype = Object.create(Error.prototype);\n  NotSupportedError.prototype.name = 'NotSupportedError';\n\n  var NotImplementedError = Rx.NotImplementedError = function (message) {\n    this.message = message || 'This operation is not implemented';\n    Error.call(this);\n  };\n  NotImplementedError.prototype = Object.create(Error.prototype);\n  NotImplementedError.prototype.name = 'NotImplementedError';\n\n  var notImplemented = Rx.helpers.notImplemented = function () {\n    throw new NotImplementedError();\n  };\n\n  var notSupported = Rx.helpers.notSupported = function () {\n    throw new NotSupportedError();\n  };\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o && o[$iterator$] !== undefined;\n  };\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  };\n\n  Rx.helpers.iterator = $iterator$;\n\n  var bindCallback = Rx.internals.bindCallback = function (func, thisArg, argCount) {\n    if (typeof thisArg === 'undefined') { return func; }\n    switch(argCount) {\n      case 0:\n        return function() {\n          return func.call(thisArg)\n        };\n      case 1:\n        return function(arg) {\n          return func.call(thisArg, arg);\n        };\n      case 2:\n        return function(value, index) {\n          return func.call(thisArg, value, index);\n        };\n      case 3:\n        return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n    }\n\n    return function() {\n      return func.apply(thisArg, arguments);\n    };\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var dontEnums = ['toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'],\n  dontEnumsLength = dontEnums.length;\n\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\nvar objectProto = Object.prototype,\n    hasOwnProperty = objectProto.hasOwnProperty,\n    objToString = objectProto.toString,\n    MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\nvar keys = Object.keys || (function() {\n    var hasOwnProperty = Object.prototype.hasOwnProperty,\n        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),\n        dontEnums = [\n          'toString',\n          'toLocaleString',\n          'valueOf',\n          'hasOwnProperty',\n          'isPrototypeOf',\n          'propertyIsEnumerable',\n          'constructor'\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    return function(obj) {\n      if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n        throw new TypeError('Object.keys called on non-object');\n      }\n\n      var result = [], prop, i;\n\n      for (prop in obj) {\n        if (hasOwnProperty.call(obj, prop)) {\n          result.push(prop);\n        }\n      }\n\n      if (hasDontEnumBug) {\n        for (i = 0; i < dontEnumsLength; i++) {\n          if (hasOwnProperty.call(obj, dontEnums[i])) {\n            result.push(dontEnums[i]);\n          }\n        }\n      }\n      return result;\n    };\n  }());\n\nfunction equalObjects(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objProps = keys(object),\n      objLength = objProps.length,\n      othProps = keys(other),\n      othLength = othProps.length;\n\n  if (objLength !== othLength && !isLoose) {\n    return false;\n  }\n  var index = objLength, key;\n  while (index--) {\n    key = objProps[index];\n    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  var skipCtor = isLoose;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key],\n        result;\n\n    if (!(result === undefined ? equalFunc(objValue, othValue, isLoose, stackA, stackB) : result)) {\n      return false;\n    }\n    skipCtor || (skipCtor = key === 'constructor');\n  }\n  if (!skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    if (objCtor !== othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor === 'function' && objCtor instanceof objCtor &&\n          typeof othCtor === 'function' && othCtor instanceof othCtor)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction equalByTag(object, other, tag) {\n  switch (tag) {\n    case boolTag:\n    case dateTag:\n      return +object === +other;\n\n    case errorTag:\n      return object.name === other.name && object.message === other.message;\n\n    case numberTag:\n      return (object !== +object) ?\n        other !== +other :\n        object === +other;\n\n    case regexpTag:\n    case stringTag:\n      return object === (other + '');\n  }\n  return false;\n}\n\nvar isObject = Rx.internals.isObject = function(value) {\n  var type = typeof value;\n  return !!value && (type === 'object' || type === 'function');\n};\n\nfunction isObjectLike(value) {\n  return !!value && typeof value === 'object';\n}\n\nfunction isLength(value) {\n  return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nvar isHostObject = (function() {\n  try {\n    Object({ 'toString': 0 } + '');\n  } catch(e) {\n    return function() { return false; };\n  }\n  return function(value) {\n    return typeof value.toString !== 'function' && typeof (value + '') === 'string';\n  };\n}());\n\nfunction isTypedArray(value) {\n  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nvar isArray = Array.isArray || function(value) {\n  return isObjectLike(value) && isLength(value.length) && objToString.call(value) === arrayTag;\n};\n\nfunction arraySome (array, predicate) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction equalArrays(array, other, equalFunc, isLoose, stackA, stackB) {\n  var index = -1,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength !== othLength && !(isLoose && othLength > arrLength)) {\n    return false;\n  }\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index],\n        result;\n\n    if (result !== undefined) {\n      if (result) {\n        continue;\n      }\n      return false;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (isLoose) {\n      if (!arraySome(other, function(othValue) {\n            return arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB);\n          })) {\n        return false;\n      }\n    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB))) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction baseIsEqualDeep(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = arrayTag,\n      othTag = arrayTag;\n\n  if (!objIsArr) {\n    objTag = objToString.call(object);\n    if (objTag === argsTag) {\n      objTag = objectTag;\n    } else if (objTag !== objectTag) {\n      objIsArr = isTypedArray(object);\n    }\n  }\n  if (!othIsArr) {\n    othTag = objToString.call(other);\n    if (othTag === argsTag) {\n      othTag = objectTag;\n    }\n  }\n  var objIsObj = objTag === objectTag && !isHostObject(object),\n      othIsObj = othTag === objectTag && !isHostObject(other),\n      isSameTag = objTag === othTag;\n\n  if (isSameTag && !(objIsArr || objIsObj)) {\n    return equalByTag(object, other, objTag);\n  }\n  if (!isLoose) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, isLoose, stackA, stackB);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  // For more information on detecting circular references see https://es5.github.io/#JO.\n  stackA || (stackA = []);\n  stackB || (stackB = []);\n\n  var length = stackA.length;\n  while (length--) {\n    if (stackA[length] === object) {\n      return stackB[length] === other;\n    }\n  }\n  // Add `object` and `other` to the stack of traversed objects.\n  stackA.push(object);\n  stackB.push(other);\n\n  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, isLoose, stackA, stackB);\n\n  stackA.pop();\n  stackB.pop();\n\n  return result;\n}\n\nfunction baseIsEqual(value, other, isLoose, stackA, stackB) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, baseIsEqual, isLoose, stackA, stackB);\n}\n\nvar isEqual = Rx.internals.isEqual = function (value, other) {\n  return baseIsEqual(value, other);\n};\n\n  var hasProp = {}.hasOwnProperty,\n      slice = Array.prototype.slice;\n\n  var inherits = Rx.internals.inherits = function (child, parent) {\n    function __() { this.constructor = child; }\n    __.prototype = parent.prototype;\n    child.prototype = new __();\n  };\n\n  var addProperties = Rx.internals.addProperties = function (obj) {\n    for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n      var source = sources[idx];\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n  };\n\n  // Rx Utils\n  var addRef = Rx.internals.addRef = function (xs, r) {\n    return new AnonymousObservable(function (observer) {\n      return new BinaryDisposable(r.getDisposable(), xs.subscribe(observer));\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n\n  function IndexedItem(id, value) {\n    this.id = id;\n    this.value = value;\n  }\n\n  IndexedItem.prototype.compareTo = function (other) {\n    var c = this.value.compareTo(other.value);\n    c === 0 && (c = this.id - other.id);\n    return c;\n  };\n\n  var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) {\n    this.items = new Array(capacity);\n    this.length = 0;\n  };\n\n  var priorityProto = PriorityQueue.prototype;\n  priorityProto.isHigherPriority = function (left, right) {\n    return this.items[left].compareTo(this.items[right]) < 0;\n  };\n\n  priorityProto.percolate = function (index) {\n    if (index >= this.length || index < 0) { return; }\n    var parent = index - 1 >> 1;\n    if (parent < 0 || parent === index) { return; }\n    if (this.isHigherPriority(index, parent)) {\n      var temp = this.items[index];\n      this.items[index] = this.items[parent];\n      this.items[parent] = temp;\n      this.percolate(parent);\n    }\n  };\n\n  priorityProto.heapify = function (index) {\n    +index || (index = 0);\n    if (index >= this.length || index < 0) { return; }\n    var left = 2 * index + 1,\n        right = 2 * index + 2,\n        first = index;\n    if (left < this.length && this.isHigherPriority(left, first)) {\n      first = left;\n    }\n    if (right < this.length && this.isHigherPriority(right, first)) {\n      first = right;\n    }\n    if (first !== index) {\n      var temp = this.items[index];\n      this.items[index] = this.items[first];\n      this.items[first] = temp;\n      this.heapify(first);\n    }\n  };\n\n  priorityProto.peek = function () { return this.items[0].value; };\n\n  priorityProto.removeAt = function (index) {\n    this.items[index] = this.items[--this.length];\n    this.items[this.length] = undefined;\n    this.heapify();\n  };\n\n  priorityProto.dequeue = function () {\n    var result = this.peek();\n    this.removeAt(0);\n    return result;\n  };\n\n  priorityProto.enqueue = function (item) {\n    var index = this.length++;\n    this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n    this.percolate(index);\n  };\n\n  priorityProto.remove = function (item) {\n    for (var i = 0; i < this.length; i++) {\n      if (this.items[i].value === item) {\n        this.removeAt(i);\n        return true;\n      }\n    }\n    return false;\n  };\n  PriorityQueue.count = 0;\n\n  /**\n   * Represents a group of disposable resources that are disposed together.\n   * @constructor\n   */\n  var CompositeDisposable = Rx.CompositeDisposable = function () {\n    var args = [], i, len;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      len = arguments.length;\n      args = new Array(len);\n      for(i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    this.disposables = args;\n    this.isDisposed = false;\n    this.length = args.length;\n  };\n\n  var CompositeDisposablePrototype = CompositeDisposable.prototype;\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Mixed} item Disposable to add.\n   */\n  CompositeDisposablePrototype.add = function (item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n      this.length++;\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Mixed} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n  CompositeDisposablePrototype.remove = function (item) {\n    var shouldDispose = false;\n    if (!this.isDisposed) {\n      var idx = this.disposables.indexOf(item);\n      if (idx !== -1) {\n        shouldDispose = true;\n        this.disposables.splice(idx, 1);\n        this.length--;\n        item.dispose();\n      }\n    }\n    return shouldDispose;\n  };\n\n  /**\n   *  Disposes all disposables in the group and removes them from the group.\n   */\n  CompositeDisposablePrototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var len = this.disposables.length, currentDisposables = new Array(len);\n      for(var i = 0; i < len; i++) { currentDisposables[i] = this.disposables[i]; }\n      this.disposables = [];\n      this.length = 0;\n\n      for (i = 0; i < len; i++) {\n        currentDisposables[i].dispose();\n      }\n    }\n  };\n\n  /**\n   * Provides a set of static methods for creating Disposables.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   */\n  var Disposable = Rx.Disposable = function (action) {\n    this.isDisposed = false;\n    this.action = action || noop;\n  };\n\n  /** Performs the task of cleaning up resources. */\n  Disposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.action();\n      this.isDisposed = true;\n    }\n  };\n\n  /**\n   * Creates a disposable object that invokes the specified action when disposed.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   * @return {Disposable} The disposable object that runs the given action upon disposal.\n   */\n  var disposableCreate = Disposable.create = function (action) { return new Disposable(action); };\n\n  /**\n   * Gets the disposable that does nothing when disposed.\n   */\n  var disposableEmpty = Disposable.empty = { dispose: noop };\n\n  /**\n   * Validates whether the given object is a disposable\n   * @param {Object} Object to test whether it has a dispose method\n   * @returns {Boolean} true if a disposable object, else false.\n   */\n  var isDisposable = Disposable.isDisposable = function (d) {\n    return d && isFunction(d.dispose);\n  };\n\n  var checkDisposed = Disposable.checkDisposed = function (disposable) {\n    if (disposable.isDisposed) { throw new ObjectDisposedError(); }\n  };\n\n  var disposableFixup = Disposable._fixup = function (result) {\n    return isDisposable(result) ? result : disposableEmpty;\n  };\n\n  // Single assignment\n  var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SingleAssignmentDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SingleAssignmentDisposable.prototype.setDisposable = function (value) {\n    if (this.current) { throw new Error('Disposable has already been assigned'); }\n    var shouldDispose = this.isDisposed;\n    !shouldDispose && (this.current = value);\n    shouldDispose && value && value.dispose();\n  };\n  SingleAssignmentDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n      old && old.dispose();\n    }\n  };\n\n  // Multiple assignment disposable\n  var SerialDisposable = Rx.SerialDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SerialDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SerialDisposable.prototype.setDisposable = function (value) {\n    var shouldDispose = this.isDisposed;\n    if (!shouldDispose) {\n      var old = this.current;\n      this.current = value;\n    }\n    old && old.dispose();\n    shouldDispose && value && value.dispose();\n  };\n  SerialDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n    }\n    old && old.dispose();\n  };\n\n  var BinaryDisposable = Rx.BinaryDisposable = function (first, second) {\n    this._first = first;\n    this._second = second;\n    this.isDisposed = false;\n  };\n\n  BinaryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old1 = this._first;\n      this._first = null;\n      old1 && old1.dispose();\n      var old2 = this._second;\n      this._second = null;\n      old2 && old2.dispose();\n    }\n  };\n\n  var NAryDisposable = Rx.NAryDisposable = function (disposables) {\n    this._disposables = disposables;\n    this.isDisposed = false;\n  };\n\n  NAryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      for (var i = 0, len = this._disposables.length; i < len; i++) {\n        this._disposables[i].dispose();\n      }\n      this._disposables.length = 0;\n    }\n  };\n\n  /**\n   * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n   */\n  var RefCountDisposable = Rx.RefCountDisposable = (function () {\n\n    function InnerDisposable(disposable) {\n      this.disposable = disposable;\n      this.disposable.count++;\n      this.isInnerDisposed = false;\n    }\n\n    InnerDisposable.prototype.dispose = function () {\n      if (!this.disposable.isDisposed && !this.isInnerDisposed) {\n        this.isInnerDisposed = true;\n        this.disposable.count--;\n        if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {\n          this.disposable.isDisposed = true;\n          this.disposable.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Initializes a new instance of the RefCountDisposable with the specified disposable.\n     * @constructor\n     * @param {Disposable} disposable Underlying disposable.\n      */\n    function RefCountDisposable(disposable) {\n      this.underlyingDisposable = disposable;\n      this.isDisposed = false;\n      this.isPrimaryDisposed = false;\n      this.count = 0;\n    }\n\n    /**\n     * Disposes the underlying disposable only when all dependent disposables have been disposed\n     */\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed && !this.isPrimaryDisposed) {\n        this.isPrimaryDisposed = true;\n        if (this.count === 0) {\n          this.isDisposed = true;\n          this.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n     * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n     */\n    RefCountDisposable.prototype.getDisposable = function () {\n      return this.isDisposed ? disposableEmpty : new InnerDisposable(this);\n    };\n\n    return RefCountDisposable;\n  })();\n\n  function ScheduledDisposable(scheduler, disposable) {\n    this.scheduler = scheduler;\n    this.disposable = disposable;\n    this.isDisposed = false;\n  }\n\n  function scheduleItem(s, self) {\n    if (!self.isDisposed) {\n      self.isDisposed = true;\n      self.disposable.dispose();\n    }\n  }\n\n  ScheduledDisposable.prototype.dispose = function () {\n    this.scheduler.schedule(this, scheduleItem);\n  };\n\n  var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) {\n    this.scheduler = scheduler;\n    this.state = state;\n    this.action = action;\n    this.dueTime = dueTime;\n    this.comparer = comparer || defaultSubComparer;\n    this.disposable = new SingleAssignmentDisposable();\n  };\n\n  ScheduledItem.prototype.invoke = function () {\n    this.disposable.setDisposable(this.invokeCore());\n  };\n\n  ScheduledItem.prototype.compareTo = function (other) {\n    return this.comparer(this.dueTime, other.dueTime);\n  };\n\n  ScheduledItem.prototype.isCancelled = function () {\n    return this.disposable.isDisposed;\n  };\n\n  ScheduledItem.prototype.invokeCore = function () {\n    return disposableFixup(this.action(this.scheduler, this.state));\n  };\n\n  /** Provides a set of static properties to access commonly used schedulers. */\n  var Scheduler = Rx.Scheduler = (function () {\n\n    function Scheduler() { }\n\n    /** Determines whether the given object is a scheduler */\n    Scheduler.isScheduler = function (s) {\n      return s instanceof Scheduler;\n    };\n\n    var schedulerProto = Scheduler.prototype;\n\n    /**\n   * Schedules an action to be executed.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.schedule = function (state, action) {\n      throw new NotImplementedError();\n    };\n\n  /**\n   * Schedules an action to be executed after dueTime.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @param {Number} dueTime Relative time after which to execute the action.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime;\n      dt instanceof Date && (dt = dt - this.now());\n      dt = Scheduler.normalize(dt);\n\n      if (dt === 0) { return this.schedule(state, action); }\n\n      return this._scheduleFuture(state, dt, action);\n    };\n\n    schedulerProto._scheduleFuture = function (state, dueTime, action) {\n      throw new NotImplementedError();\n    };\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.now = defaultNow;\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.prototype.now = defaultNow;\n\n    /**\n     * Normalizes the specified TimeSpan value to a positive value.\n     * @param {Number} timeSpan The time span value to normalize.\n     * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n     */\n    Scheduler.normalize = function (timeSpan) {\n      timeSpan < 0 && (timeSpan = 0);\n      return timeSpan;\n    };\n\n    return Scheduler;\n  }());\n\n  var normalizeTime = Scheduler.normalize, isScheduler = Scheduler.isScheduler;\n\n  (function (schedulerProto) {\n\n    function invokeRecImmediate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.schedule(state2, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    function invokeRecDate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2, dueTime1) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.scheduleFuture(state2, dueTime1, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursive = function (state, action) {\n      return this.schedule([state, action], invokeRecImmediate);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative or absolute due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number | Date} dueTime Relative or absolute time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveFuture = function (state, dueTime, action) {\n      return this.scheduleFuture([state, action], dueTime, invokeRecDate);\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    schedulerProto.schedulePeriodic = function(state, period, action) {\n      if (typeof root.setInterval === 'undefined') { throw new NotSupportedError(); }\n      period = normalizeTime(period);\n      var s = state, id = root.setInterval(function () { s = action(s); }, period);\n      return disposableCreate(function () { root.clearInterval(id); });\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n    /**\n     * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n     * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n     * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n     */\n    schedulerProto.catchError = schedulerProto['catch'] = function (handler) {\n      return new CatchScheduler(this, handler);\n    };\n  }(Scheduler.prototype));\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function createTick(self) {\n      return function tick(command, recurse) {\n        recurse(0, self._period);\n        var state = tryCatch(self._action)(self._state);\n        if (state === errorObj) {\n          self._cancel.dispose();\n          thrower(state.e);\n        }\n        self._state = state;\n      };\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveFuture(0, this._period, createTick(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  /** Gets a scheduler that schedules work immediately on the current thread. */\n   var ImmediateScheduler = (function (__super__) {\n    inherits(ImmediateScheduler, __super__);\n    function ImmediateScheduler() {\n      __super__.call(this);\n    }\n\n    ImmediateScheduler.prototype.schedule = function (state, action) {\n      return disposableFixup(action(this, state));\n    };\n\n    return ImmediateScheduler;\n  }(Scheduler));\n\n  var immediateScheduler = Scheduler.immediate = new ImmediateScheduler();\n\n  /**\n   * Gets a scheduler that schedules work as soon as possible on the current thread.\n   */\n  var CurrentThreadScheduler = (function (__super__) {\n    var queue;\n\n    function runTrampoline () {\n      while (queue.length > 0) {\n        var item = queue.dequeue();\n        !item.isCancelled() && item.invoke();\n      }\n    }\n\n    inherits(CurrentThreadScheduler, __super__);\n    function CurrentThreadScheduler() {\n      __super__.call(this);\n    }\n\n    CurrentThreadScheduler.prototype.schedule = function (state, action) {\n      var si = new ScheduledItem(this, state, action, this.now());\n\n      if (!queue) {\n        queue = new PriorityQueue(4);\n        queue.enqueue(si);\n\n        var result = tryCatch(runTrampoline)();\n        queue = null;\n        if (result === errorObj) { thrower(result.e); }\n      } else {\n        queue.enqueue(si);\n      }\n      return si.disposable;\n    };\n\n    CurrentThreadScheduler.prototype.scheduleRequired = function () { return !queue; };\n\n    return CurrentThreadScheduler;\n  }(Scheduler));\n\n  var currentThreadScheduler = Scheduler.currentThread = new CurrentThreadScheduler();\n\n  var scheduleMethod, clearMethod;\n\n  var localTimer = (function () {\n    var localSetTimeout, localClearTimeout = noop;\n    if (!!root.setTimeout) {\n      localSetTimeout = root.setTimeout;\n      localClearTimeout = root.clearTimeout;\n    } else if (!!root.WScript) {\n      localSetTimeout = function (fn, time) {\n        root.WScript.Sleep(time);\n        fn();\n      };\n    } else {\n      throw new NotSupportedError();\n    }\n\n    return {\n      setTimeout: localSetTimeout,\n      clearTimeout: localClearTimeout\n    };\n  }());\n  var localSetTimeout = localTimer.setTimeout,\n    localClearTimeout = localTimer.clearTimeout;\n\n  (function () {\n\n    var nextHandle = 1, tasksByHandle = {}, currentlyRunning = false;\n\n    clearMethod = function (handle) {\n      delete tasksByHandle[handle];\n    };\n\n    function runTask(handle) {\n      if (currentlyRunning) {\n        localSetTimeout(function () { runTask(handle); }, 0);\n      } else {\n        var task = tasksByHandle[handle];\n        if (task) {\n          currentlyRunning = true;\n          var result = tryCatch(task)();\n          clearMethod(handle);\n          currentlyRunning = false;\n          if (result === errorObj) { thrower(result.e); }\n        }\n      }\n    }\n\n    var reNative = new RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&\n      !reNative.test(setImmediate) && setImmediate;\n\n    function postMessageSupported () {\n      // Ensure not in a worker\n      if (!root.postMessage || root.importScripts) { return false; }\n      var isAsync = false, oldHandler = root.onmessage;\n      // Test for async\n      root.onmessage = function () { isAsync = true; };\n      root.postMessage('', '*');\n      root.onmessage = oldHandler;\n\n      return isAsync;\n    }\n\n    // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n    if (isFunction(setImmediate)) {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        setImmediate(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        process.nextTick(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (postMessageSupported()) {\n      var MSG_PREFIX = 'ms.rx.schedule' + Math.random();\n\n      var onGlobalPostMessage = function (event) {\n        // Only if we're a match to avoid any other global events\n        if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n          runTask(event.data.substring(MSG_PREFIX.length));\n        }\n      };\n\n      root.addEventListener('message', onGlobalPostMessage, false);\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        root.postMessage(MSG_PREFIX + id, '*');\n        return id;\n      };\n    } else if (!!root.MessageChannel) {\n      var channel = new root.MessageChannel();\n\n      channel.port1.onmessage = function (e) { runTask(e.data); };\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        channel.port2.postMessage(id);\n        return id;\n      };\n    } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {\n\n      scheduleMethod = function (action) {\n        var scriptElement = root.document.createElement('script');\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n\n        scriptElement.onreadystatechange = function () {\n          runTask(id);\n          scriptElement.onreadystatechange = null;\n          scriptElement.parentNode.removeChild(scriptElement);\n          scriptElement = null;\n        };\n        root.document.documentElement.appendChild(scriptElement);\n        return id;\n      };\n\n    } else {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        localSetTimeout(function () {\n          runTask(id);\n        }, 0);\n\n        return id;\n      };\n    }\n  }());\n\n  /**\n   * Gets a scheduler that schedules work via a timed callback based upon platform.\n   */\n   var DefaultScheduler = (function (__super__) {\n     inherits(DefaultScheduler, __super__);\n     function DefaultScheduler() {\n       __super__.call(this);\n     }\n\n     function scheduleAction(disposable, action, scheduler, state) {\n       return function schedule() {\n         disposable.setDisposable(Disposable._fixup(action(scheduler, state)));\n       };\n     }\n\n     function ClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     ClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         clearMethod(this._id);\n       }\n     };\n\n     function LocalClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     LocalClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         localClearTimeout(this._id);\n       }\n     };\n\n    DefaultScheduler.prototype.schedule = function (state, action) {\n      var disposable = new SingleAssignmentDisposable(),\n          id = scheduleMethod(scheduleAction(disposable, action, this, state));\n      return new BinaryDisposable(disposable, new ClearDisposable(id));\n    };\n\n    DefaultScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      if (dueTime === 0) { return this.schedule(state, action); }\n      var disposable = new SingleAssignmentDisposable(),\n          id = localSetTimeout(scheduleAction(disposable, action, this, state), dueTime);\n      return new BinaryDisposable(disposable, new LocalClearDisposable(id));\n    };\n\n    function scheduleLongRunning(state, action, disposable) {\n      return function () { action(state, disposable); };\n    }\n\n    DefaultScheduler.prototype.scheduleLongRunning = function (state, action) {\n      var disposable = disposableCreate(noop);\n      scheduleMethod(scheduleLongRunning(state, action, disposable));\n      return disposable;\n    };\n\n    return DefaultScheduler;\n  }(Scheduler));\n\n  var defaultScheduler = Scheduler['default'] = Scheduler.async = new DefaultScheduler();\n\n  var CatchScheduler = (function (__super__) {\n    inherits(CatchScheduler, __super__);\n\n    function CatchScheduler(scheduler, handler) {\n      this._scheduler = scheduler;\n      this._handler = handler;\n      this._recursiveOriginal = null;\n      this._recursiveWrapper = null;\n      __super__.call(this);\n    }\n\n    CatchScheduler.prototype.schedule = function (state, action) {\n      return this._scheduler.schedule(state, this._wrap(action));\n    };\n\n    CatchScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      return this._scheduler.schedule(state, dueTime, this._wrap(action));\n    };\n\n    CatchScheduler.prototype.now = function () { return this._scheduler.now(); };\n\n    CatchScheduler.prototype._clone = function (scheduler) {\n        return new CatchScheduler(scheduler, this._handler);\n    };\n\n    CatchScheduler.prototype._wrap = function (action) {\n      var parent = this;\n      return function (self, state) {\n        var res = tryCatch(action)(parent._getRecursiveWrapper(self), state);\n        if (res === errorObj) {\n          if (!parent._handler(res.e)) { thrower(res.e); }\n          return disposableEmpty;\n        }\n        return disposableFixup(res);\n      };\n    };\n\n    CatchScheduler.prototype._getRecursiveWrapper = function (scheduler) {\n      if (this._recursiveOriginal !== scheduler) {\n        this._recursiveOriginal = scheduler;\n        var wrapper = this._clone(scheduler);\n        wrapper._recursiveOriginal = scheduler;\n        wrapper._recursiveWrapper = wrapper;\n        this._recursiveWrapper = wrapper;\n      }\n      return this._recursiveWrapper;\n    };\n\n    CatchScheduler.prototype.schedulePeriodic = function (state, period, action) {\n      var self = this, failed = false, d = new SingleAssignmentDisposable();\n\n      d.setDisposable(this._scheduler.schedulePeriodic(state, period, function (state1) {\n        if (failed) { return null; }\n        var res = tryCatch(action)(state1);\n        if (res === errorObj) {\n          failed = true;\n          if (!self._handler(res.e)) { thrower(res.e); }\n          d.dispose();\n          return null;\n        }\n        return res;\n      }));\n\n      return d;\n    };\n\n    return CatchScheduler;\n  }(Scheduler));\n\n  /**\n   *  Represents a notification to an observer.\n   */\n  var Notification = Rx.Notification = (function () {\n    function Notification() {\n\n    }\n\n    Notification.prototype._accept = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    Notification.prototype._acceptObserver = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    /**\n     * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n     * @param {Function | Observer} observerOrOnNext Function to invoke for an OnNext notification or Observer to invoke the notification on..\n     * @param {Function} onError Function to invoke for an OnError notification.\n     * @param {Function} onCompleted Function to invoke for an OnCompleted notification.\n     * @returns {Any} Result produced by the observation.\n     */\n    Notification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n      return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n        this._acceptObserver(observerOrOnNext) :\n        this._accept(observerOrOnNext, onError, onCompleted);\n    };\n\n    /**\n     * Returns an observable sequence with a single notification.\n     *\n     * @memberOf Notifications\n     * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n     * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n     */\n    Notification.prototype.toObservable = function (scheduler) {\n      var self = this;\n      isScheduler(scheduler) || (scheduler = immediateScheduler);\n      return new AnonymousObservable(function (o) {\n        return scheduler.schedule(self, function (_, notification) {\n          notification._acceptObserver(o);\n          notification.kind === 'N' && o.onCompleted();\n        });\n      });\n    };\n\n    return Notification;\n  })();\n\n  var OnNextNotification = (function (__super__) {\n    inherits(OnNextNotification, __super__);\n    function OnNextNotification(value) {\n      this.value = value;\n      this.kind = 'N';\n    }\n\n    OnNextNotification.prototype._accept = function (onNext) {\n      return onNext(this.value);\n    };\n\n    OnNextNotification.prototype._acceptObserver = function (o) {\n      return o.onNext(this.value);\n    };\n\n    OnNextNotification.prototype.toString = function () {\n      return 'OnNext(' + this.value + ')';\n    };\n\n    return OnNextNotification;\n  }(Notification));\n\n  var OnErrorNotification = (function (__super__) {\n    inherits(OnErrorNotification, __super__);\n    function OnErrorNotification(error) {\n      this.error = error;\n      this.kind = 'E';\n    }\n\n    OnErrorNotification.prototype._accept = function (onNext, onError) {\n      return onError(this.error);\n    };\n\n    OnErrorNotification.prototype._acceptObserver = function (o) {\n      return o.onError(this.error);\n    };\n\n    OnErrorNotification.prototype.toString = function () {\n      return 'OnError(' + this.error + ')';\n    };\n\n    return OnErrorNotification;\n  }(Notification));\n\n  var OnCompletedNotification = (function (__super__) {\n    inherits(OnCompletedNotification, __super__);\n    function OnCompletedNotification() {\n      this.kind = 'C';\n    }\n\n    OnCompletedNotification.prototype._accept = function (onNext, onError, onCompleted) {\n      return onCompleted();\n    };\n\n    OnCompletedNotification.prototype._acceptObserver = function (o) {\n      return o.onCompleted();\n    };\n\n    OnCompletedNotification.prototype.toString = function () {\n      return 'OnCompleted()';\n    };\n\n    return OnCompletedNotification;\n  }(Notification));\n\n  /**\n   * Creates an object that represents an OnNext notification to an observer.\n   * @param {Any} value The value contained in the notification.\n   * @returns {Notification} The OnNext notification containing the value.\n   */\n  var notificationCreateOnNext = Notification.createOnNext = function (value) {\n    return new OnNextNotification(value);\n  };\n\n  /**\n   * Creates an object that represents an OnError notification to an observer.\n   * @param {Any} error The exception contained in the notification.\n   * @returns {Notification} The OnError notification containing the exception.\n   */\n  var notificationCreateOnError = Notification.createOnError = function (error) {\n    return new OnErrorNotification(error);\n  };\n\n  /**\n   * Creates an object that represents an OnCompleted notification to an observer.\n   * @returns {Notification} The OnCompleted notification.\n   */\n  var notificationCreateOnCompleted = Notification.createOnCompleted = function () {\n    return new OnCompletedNotification();\n  };\n\n  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates a notification callback from an observer.\n   * @returns The action that forwards its input notification to the underlying observer.\n   */\n  Observer.prototype.toNotifier = function () {\n    var observer = this;\n    return function (n) { return n.accept(observer); };\n  };\n\n  /**\n   *  Hides the identity of an observer.\n   * @returns An observer that hides the identity of the specified observer.\n   */\n  Observer.prototype.asObserver = function () {\n    var self = this;\n    return new AnonymousObserver(\n      function (x) { self.onNext(x); },\n      function (err) { self.onError(err); },\n      function () { self.onCompleted(); });\n  };\n\n  /**\n   *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n   *  If a violation is detected, an Error is thrown from the offending observer method call.\n   * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n   */\n  Observer.prototype.checked = function () { return new CheckedObserver(this); };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n\n  /**\n   *  Creates an observer from a notification callback.\n   * @param {Function} handler Action that handles a notification.\n   * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n   */\n  Observer.fromNotifier = function (handler, thisArg) {\n    var cb = bindCallback(handler, thisArg, 1);\n    return new AnonymousObserver(function (x) {\n      return cb(notificationCreateOnNext(x));\n    }, function (e) {\n      return cb(notificationCreateOnError(e));\n    }, function () {\n      return cb(notificationCreateOnCompleted());\n    });\n  };\n\n  /**\n   * Schedules the invocation of observer methods on the given scheduler.\n   * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n   * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n   */\n  Observer.prototype.notifyOn = function (scheduler) {\n    return new ObserveOnObserver(scheduler, this);\n  };\n\n  Observer.prototype.makeSafe = function(disposable) {\n    return new AnonymousSafeObserver(this._onNext, this._onError, this._onCompleted, disposable);\n  };\n\n  /**\n   * Abstract base class for implementations of the Observer class.\n   * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n   */\n  var AbstractObserver = Rx.internals.AbstractObserver = (function (__super__) {\n    inherits(AbstractObserver, __super__);\n\n    /**\n     * Creates a new observer in a non-stopped state.\n     */\n    function AbstractObserver() {\n      this.isStopped = false;\n    }\n\n    // Must be implemented by other observers\n    AbstractObserver.prototype.next = notImplemented;\n    AbstractObserver.prototype.error = notImplemented;\n    AbstractObserver.prototype.completed = notImplemented;\n\n    /**\n     * Notifies the observer of a new element in the sequence.\n     * @param {Any} value Next element in the sequence.\n     */\n    AbstractObserver.prototype.onNext = function (value) {\n      !this.isStopped && this.next(value);\n    };\n\n    /**\n     * Notifies the observer that an exception has occurred.\n     * @param {Any} error The error that has occurred.\n     */\n    AbstractObserver.prototype.onError = function (error) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(error);\n      }\n    };\n\n    /**\n     * Notifies the observer of the end of the sequence.\n     */\n    AbstractObserver.prototype.onCompleted = function () {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.completed();\n      }\n    };\n\n    /**\n     * Disposes the observer, causing it to transition to the stopped state.\n     */\n    AbstractObserver.prototype.dispose = function () { this.isStopped = true; };\n\n    AbstractObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return AbstractObserver;\n  }(Observer));\n\n  /**\n   * Class to create an Observer instance from delegate-based implementations of the on* methods.\n   */\n  var AnonymousObserver = Rx.AnonymousObserver = (function (__super__) {\n    inherits(AnonymousObserver, __super__);\n\n    /**\n     * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n     * @param {Any} onNext Observer's OnNext action implementation.\n     * @param {Any} onError Observer's OnError action implementation.\n     * @param {Any} onCompleted Observer's OnCompleted action implementation.\n     */\n    function AnonymousObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    /**\n     * Calls the onNext action.\n     * @param {Any} value Next element in the sequence.\n     */\n    AnonymousObserver.prototype.next = function (value) {\n      this._onNext(value);\n    };\n\n    /**\n     * Calls the onError action.\n     * @param {Any} error The error that has occurred.\n     */\n    AnonymousObserver.prototype.error = function (error) {\n      this._onError(error);\n    };\n\n    /**\n     *  Calls the onCompleted action.\n     */\n    AnonymousObserver.prototype.completed = function () {\n      this._onCompleted();\n    };\n\n    return AnonymousObserver;\n  }(AbstractObserver));\n\n  var CheckedObserver = (function (__super__) {\n    inherits(CheckedObserver, __super__);\n\n    function CheckedObserver(observer) {\n      __super__.call(this);\n      this._observer = observer;\n      this._state = 0; // 0 - idle, 1 - busy, 2 - done\n    }\n\n    var CheckedObserverPrototype = CheckedObserver.prototype;\n\n    CheckedObserverPrototype.onNext = function (value) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onNext).call(this._observer, value);\n      this._state = 0;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onError = function (err) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onError).call(this._observer, err);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onCompleted = function () {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onCompleted).call(this._observer);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.checkAccess = function () {\n      if (this._state === 1) { throw new Error('Re-entrancy detected'); }\n      if (this._state === 2) { throw new Error('Observer completed'); }\n      if (this._state === 0) { this._state = 1; }\n    };\n\n    return CheckedObserver;\n  }(Observer));\n\n  var ScheduledObserver = Rx.internals.ScheduledObserver = (function (__super__) {\n    inherits(ScheduledObserver, __super__);\n\n    function ScheduledObserver(scheduler, observer) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.observer = observer;\n      this.isAcquired = false;\n      this.hasFaulted = false;\n      this.queue = [];\n      this.disposable = new SerialDisposable();\n    }\n\n    function enqueueNext(observer, x) { return function () { observer.onNext(x); }; }\n    function enqueueError(observer, e) { return function () { observer.onError(e); }; }\n    function enqueueCompleted(observer) { return function () { observer.onCompleted(); }; }\n\n    ScheduledObserver.prototype.next = function (x) {\n      this.queue.push(enqueueNext(this.observer, x));\n    };\n\n    ScheduledObserver.prototype.error = function (e) {\n      this.queue.push(enqueueError(this.observer, e));\n    };\n\n    ScheduledObserver.prototype.completed = function () {\n      this.queue.push(enqueueCompleted(this.observer));\n    };\n\n\n    function scheduleMethod(state, recurse) {\n      var work;\n      if (state.queue.length > 0) {\n        work = state.queue.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var res = tryCatch(work)();\n      if (res === errorObj) {\n        state.queue = [];\n        state.hasFaulted = true;\n        return thrower(res.e);\n      }\n      recurse(state);\n    }\n\n    ScheduledObserver.prototype.ensureActive = function () {\n      var isOwner = false;\n      if (!this.hasFaulted && this.queue.length > 0) {\n        isOwner = !this.isAcquired;\n        this.isAcquired = true;\n      }\n      isOwner &&\n        this.disposable.setDisposable(this.scheduler.scheduleRecursive(this, scheduleMethod));\n    };\n\n    ScheduledObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.disposable.dispose();\n    };\n\n    return ScheduledObserver;\n  }(AbstractObserver));\n\n  var ObserveOnObserver = (function (__super__) {\n    inherits(ObserveOnObserver, __super__);\n\n    function ObserveOnObserver(scheduler, observer, cancel) {\n      __super__.call(this, scheduler, observer);\n      this._cancel = cancel;\n    }\n\n    ObserveOnObserver.prototype.next = function (value) {\n      __super__.prototype.next.call(this, value);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.error = function (e) {\n      __super__.prototype.error.call(this, e);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.completed = function () {\n      __super__.prototype.completed.call(this);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this._cancel && this._cancel.dispose();\n      this._cancel = null;\n    };\n\n    return ObserveOnObserver;\n  })(ScheduledObserver);\n\n  var observableProto;\n\n  /**\n   * Represents a push-style collection.\n   */\n  var Observable = Rx.Observable = (function () {\n\n    function makeSubscribe(self, subscribe) {\n      return function (o) {\n        var oldOnError = o.onError;\n        o.onError = function (e) {\n          makeStackTraceLong(e, self);\n          oldOnError.call(o, e);\n        };\n\n        return subscribe.call(self, o);\n      };\n    }\n\n    function Observable() {\n      if (Rx.config.longStackSupport && hasStacks) {\n        var oldSubscribe = this._subscribe;\n        var e = tryCatch(thrower)(new Error()).e;\n        this.stack = e.stack.substring(e.stack.indexOf('\\n') + 1);\n        this._subscribe = makeSubscribe(this, oldSubscribe);\n      }\n    }\n\n    observableProto = Observable.prototype;\n\n    /**\n    * Determines whether the given object is an Observable\n    * @param {Any} An object to determine whether it is an Observable\n    * @returns {Boolean} true if an Observable, else false.\n    */\n    Observable.isObservable = function (o) {\n      return o && isFunction(o.subscribe);\n    };\n\n    /**\n     *  Subscribes an o to the observable sequence.\n     *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n     *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n     *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n     *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribe = observableProto.forEach = function (oOrOnNext, onError, onCompleted) {\n      return this._subscribe(typeof oOrOnNext === 'object' ?\n        oOrOnNext :\n        observerCreate(oOrOnNext, onError, onCompleted));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onNext The function to invoke on each element in the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnNext = function (onNext, thisArg) {\n      return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n    };\n\n    /**\n     * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n     * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnError = function (onError, thisArg) {\n      return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnCompleted = function (onCompleted, thisArg) {\n      return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n    };\n\n    return Observable;\n  })();\n\n  var ObservableBase = Rx.ObservableBase = (function (__super__) {\n    inherits(ObservableBase, __super__);\n\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.subscribeCore).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function ObservableBase() {\n      __super__.call(this);\n    }\n\n    ObservableBase.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    ObservableBase.prototype.subscribeCore = notImplemented;\n\n    return ObservableBase;\n  }(Observable));\n\nvar FlatMapObservable = Rx.FlatMapObservable = (function(__super__) {\n\n    inherits(FlatMapObservable, __super__);\n\n    function FlatMapObservable(source, selector, resultSelector, thisArg) {\n      this.resultSelector = isFunction(resultSelector) ? resultSelector : null;\n      this.selector = bindCallback(isFunction(selector) ? selector : function() { return selector; }, thisArg, 3);\n      this.source = source;\n      __super__.call(this);\n    }\n\n    FlatMapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this.resultSelector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(observer, selector, resultSelector, source) {\n      this.i = 0;\n      this.selector = selector;\n      this.resultSelector = resultSelector;\n      this.source = source;\n      this.o = observer;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype._wrapResult = function(result, x, i) {\n      return this.resultSelector ?\n        result.map(function(y, i2) { return this.resultSelector(x, y, i, i2); }, this) :\n        result;\n    };\n\n    InnerObserver.prototype.next = function(x) {\n      var i = this.i++;\n      var result = tryCatch(this.selector)(x, i, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = Observable.from(result));\n      this.o.onNext(this._wrapResult(result, x, i));\n    };\n\n    InnerObserver.prototype.error = function(e) { this.o.onError(e); };\n\n    InnerObserver.prototype.completed = function() { this.o.onCompleted(); };\n\n    return FlatMapObservable;\n\n}(ObservableBase));\n\n  var Enumerable = Rx.internals.Enumerable = function () { };\n\n  function IsDisposedDisposable(state) {\n    this._s = state;\n    this.isDisposed = false;\n  }\n\n  IsDisposedDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      this._s.isDisposed = true;\n    }\n  };\n\n  var ConcatEnumerableObservable = (function(__super__) {\n    inherits(ConcatEnumerableObservable, __super__);\n    function ConcatEnumerableObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    ConcatEnumerableObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        o: o,\n        subscription: subscription,\n        e: this.sources[$iterator$]()\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.o.onError(e); };\n    InnerObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return ConcatEnumerableObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.concat = function () {\n    return new ConcatEnumerableObservable(this);\n  };\n\n  var CatchErrorObservable = (function(__super__) {\n    function CatchErrorObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    inherits(CatchErrorObservable, __super__);\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.lastError !== null ? state.o.onError(state.lastError) : state.o.onCompleted(); }\n\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    CatchErrorObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        e: this.sources[$iterator$](),\n        subscription: subscription,\n        lastError: null,\n        o: o\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.lastError = e; this._recurse(this._state); };\n    InnerObserver.prototype.completed = function () { this._state.o.onCompleted(); };\n\n    return CatchErrorObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.catchError = function () {\n    return new CatchErrorObservable(this);\n  };\n\n  var RepeatEnumerable = (function (__super__) {\n    inherits(RepeatEnumerable, __super__);\n    function RepeatEnumerable(v, c) {\n      this.v = v;\n      this.c = c == null ? -1 : c;\n    }\n\n    RepeatEnumerable.prototype[$iterator$] = function () {\n      return new RepeatEnumerator(this);\n    };\n\n    function RepeatEnumerator(p) {\n      this.v = p.v;\n      this.l = p.c;\n    }\n\n    RepeatEnumerator.prototype.next = function () {\n      if (this.l === 0) { return doneEnumerator; }\n      if (this.l > 0) { this.l--; }\n      return { done: false, value: this.v };\n    };\n\n    return RepeatEnumerable;\n  }(Enumerable));\n\n  var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) {\n    return new RepeatEnumerable(value, repeatCount);\n  };\n\n  var OfEnumerable = (function(__super__) {\n    inherits(OfEnumerable, __super__);\n    function OfEnumerable(s, fn, thisArg) {\n      this.s = s;\n      this.fn = fn ? bindCallback(fn, thisArg, 3) : null;\n    }\n    OfEnumerable.prototype[$iterator$] = function () {\n      return new OfEnumerator(this);\n    };\n\n    function OfEnumerator(p) {\n      this.i = -1;\n      this.s = p.s;\n      this.l = this.s.length;\n      this.fn = p.fn;\n    }\n\n    OfEnumerator.prototype.next = function () {\n     return ++this.i < this.l ?\n       { done: false, value: !this.fn ? this.s[this.i] : this.fn(this.s[this.i], this.i, this.s) } :\n       doneEnumerator;\n    };\n\n    return OfEnumerable;\n  }(Enumerable));\n\n  var enumerableOf = Enumerable.of = function (source, selector, thisArg) {\n    return new OfEnumerable(source, selector, thisArg);\n  };\n\nvar ObserveOnObservable = (function (__super__) {\n  inherits(ObserveOnObservable, __super__);\n  function ObserveOnObservable(source, s) {\n    this.source = source;\n    this._s = s;\n    __super__.call(this);\n  }\n\n  ObserveOnObservable.prototype.subscribeCore = function (o) {\n    return this.source.subscribe(new ObserveOnObserver(this._s, o));\n  };\n\n  return ObserveOnObservable;\n}(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n   *\n   *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n   *  that require to be run on a scheduler, use subscribeOn.\n   *\n   *  @param {Scheduler} scheduler Scheduler to notify observers on.\n   *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n   */\n  observableProto.observeOn = function (scheduler) {\n    return new ObserveOnObservable(this, scheduler);\n  };\n\n  var SubscribeOnObservable = (function (__super__) {\n    inherits(SubscribeOnObservable, __super__);\n    function SubscribeOnObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(scheduler, state) {\n      var source = state[0], d = state[1], o = state[2];\n      d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(o)));\n    }\n\n    SubscribeOnObservable.prototype.subscribeCore = function (o) {\n      var m = new SingleAssignmentDisposable(), d = new SerialDisposable();\n      d.setDisposable(m);\n      m.setDisposable(this._s.schedule([this.source, d, o], scheduleMethod));\n      return d;\n    };\n\n    return SubscribeOnObservable;\n  }(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n   *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n   *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n   *  callbacks on a scheduler, use observeOn.\n\n   *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n   *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n   */\n  observableProto.subscribeOn = function (scheduler) {\n    return new SubscribeOnObservable(this, scheduler);\n  };\n\n  var FromPromiseObservable = (function(__super__) {\n    inherits(FromPromiseObservable, __super__);\n    function FromPromiseObservable(p, s) {\n      this._p = p;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleNext(s, state) {\n      var o = state[0], data = state[1];\n      o.onNext(data);\n      o.onCompleted();\n    }\n\n    function scheduleError(s, state) {\n      var o = state[0], err = state[1];\n      o.onError(err);\n    }\n\n    FromPromiseObservable.prototype.subscribeCore = function(o) {\n      var sad = new SingleAssignmentDisposable(), self = this, p = this._p;\n\n      if (isFunction(p)) {\n        p = tryCatch(p)();\n        if (p === errorObj) {\n          o.onError(p.e);\n          return sad;\n        }\n      }\n\n      p\n        .then(function (data) {\n          sad.setDisposable(self._s.schedule([o, data], scheduleNext));\n        }, function (err) {\n          sad.setDisposable(self._s.schedule([o, err], scheduleError));\n        });\n\n      return sad;\n    };\n\n    return FromPromiseObservable;\n  }(ObservableBase));\n\n  /**\n  * Converts a Promise to an Observable sequence\n  * @param {Promise} An ES6 Compliant promise.\n  * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n  */\n  var observableFromPromise = Observable.fromPromise = function (promise, scheduler) {\n    scheduler || (scheduler = defaultScheduler);\n    return new FromPromiseObservable(promise, scheduler);\n  };\n\n  /*\n   * Converts an existing observable sequence to an ES6 Compatible Promise\n   * @example\n   * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n   *\n   * // With config\n   * Rx.config.Promise = RSVP.Promise;\n   * var promise = Rx.Observable.return(42).toPromise();\n   * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n   * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n   */\n  observableProto.toPromise = function (promiseCtor) {\n    promiseCtor || (promiseCtor = Rx.config.Promise);\n    if (!promiseCtor) { throw new NotSupportedError('Promise type not provided nor in Rx.config.Promise'); }\n    var source = this;\n    return new promiseCtor(function (resolve, reject) {\n      // No cancellation can be done\n      var value;\n      source.subscribe(function (v) {\n        value = v;\n      }, reject, function () {\n        resolve(value);\n      });\n    });\n  };\n\n  var ToArrayObservable = (function(__super__) {\n    inherits(ToArrayObservable, __super__);\n    function ToArrayObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    ToArrayObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o) {\n      this.o = o;\n      this.a = [];\n      AbstractObserver.call(this);\n    }\n    \n    InnerObserver.prototype.next = function (x) { this.a.push(x); };\n    InnerObserver.prototype.error = function (e) { this.o.onError(e);  };\n    InnerObserver.prototype.completed = function () { this.o.onNext(this.a); this.o.onCompleted(); };\n\n    return ToArrayObservable;\n  }(ObservableBase));\n\n  /**\n  * Creates an array from an observable sequence.\n  * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n  */\n  observableProto.toArray = function () {\n    return new ToArrayObservable(this);\n  };\n\n  /**\n   *  Creates an observable sequence from a specified subscribe method implementation.\n   * @example\n   *  var res = Rx.Observable.create(function (observer) { return function () { } );\n   *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n   *  var res = Rx.Observable.create(function (observer) { } );\n   * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n   * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n   */\n  Observable.create = function (subscribe, parent) {\n    return new AnonymousObservable(subscribe, parent);\n  };\n\n  var Defer = (function(__super__) {\n    inherits(Defer, __super__);\n    function Defer(factory) {\n      this._f = factory;\n      __super__.call(this);\n    }\n\n    Defer.prototype.subscribeCore = function (o) {\n      var result = tryCatch(this._f)();\n      if (result === errorObj) { return observableThrow(result.e).subscribe(o);}\n      isPromise(result) && (result = observableFromPromise(result));\n      return result.subscribe(o);\n    };\n\n    return Defer;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n   *\n   * @example\n   *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n   * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n   * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n   */\n  var observableDefer = Observable.defer = function (observableFactory) {\n    return new Defer(observableFactory);\n  };\n\n  var EmptyObservable = (function(__super__) {\n    inherits(EmptyObservable, __super__);\n    function EmptyObservable(scheduler) {\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    EmptyObservable.prototype.subscribeCore = function (observer) {\n      var sink = new EmptySink(observer, this.scheduler);\n      return sink.run();\n    };\n\n    function EmptySink(observer, scheduler) {\n      this.observer = observer;\n      this.scheduler = scheduler;\n    }\n\n    function scheduleItem(s, state) {\n      state.onCompleted();\n      return disposableEmpty;\n    }\n\n    EmptySink.prototype.run = function () {\n      var state = this.observer;\n      return this.scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this.scheduler.schedule(state, scheduleItem);\n    };\n\n    return EmptyObservable;\n  }(ObservableBase));\n\n  var EMPTY_OBSERVABLE = new EmptyObservable(immediateScheduler);\n\n  /**\n   *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n   *\n   * @example\n   *  var res = Rx.Observable.empty();\n   *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n   * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n   * @returns {Observable} An observable sequence with no elements.\n   */\n  var observableEmpty = Observable.empty = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return scheduler === immediateScheduler ? EMPTY_OBSERVABLE : new EmptyObservable(scheduler);\n  };\n\n  var FromObservable = (function(__super__) {\n    inherits(FromObservable, __super__);\n    function FromObservable(iterable, fn, scheduler) {\n      this._iterable = iterable;\n      this._fn = fn;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function createScheduleMethod(o, it, fn) {\n      return function loopRecursive(i, recurse) {\n        var next = tryCatch(it.next).call(it);\n        if (next === errorObj) { return o.onError(next.e); }\n        if (next.done) { return o.onCompleted(); }\n\n        var result = next.value;\n\n        if (isFunction(fn)) {\n          result = tryCatch(fn)(result, i);\n          if (result === errorObj) { return o.onError(result.e); }\n        }\n\n        o.onNext(result);\n        recurse(i + 1);\n      };\n    }\n\n    FromObservable.prototype.subscribeCore = function (o) {\n      var list = Object(this._iterable),\n          it = getIterable(list);\n\n      return this._scheduler.scheduleRecursive(0, createScheduleMethod(o, it, this._fn));\n    };\n\n    return FromObservable;\n  }(ObservableBase));\n\n  var maxSafeInteger = Math.pow(2, 53) - 1;\n\n  function StringIterable(s) {\n    this._s = s;\n  }\n\n  StringIterable.prototype[$iterator$] = function () {\n    return new StringIterator(this._s);\n  };\n\n  function StringIterator(s) {\n    this._s = s;\n    this._l = s.length;\n    this._i = 0;\n  }\n\n  StringIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  StringIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._s.charAt(this._i++) } : doneEnumerator;\n  };\n\n  function ArrayIterable(a) {\n    this._a = a;\n  }\n\n  ArrayIterable.prototype[$iterator$] = function () {\n    return new ArrayIterator(this._a);\n  };\n\n  function ArrayIterator(a) {\n    this._a = a;\n    this._l = toLength(a);\n    this._i = 0;\n  }\n\n  ArrayIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  ArrayIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._a[this._i++] } : doneEnumerator;\n  };\n\n  function numberIsFinite(value) {\n    return typeof value === 'number' && root.isFinite(value);\n  }\n\n  function isNan(n) {\n    return n !== n;\n  }\n\n  function getIterable(o) {\n    var i = o[$iterator$], it;\n    if (!i && typeof o === 'string') {\n      it = new StringIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i && o.length !== undefined) {\n      it = new ArrayIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i) { throw new TypeError('Object is not iterable'); }\n    return o[$iterator$]();\n  }\n\n  function sign(value) {\n    var number = +value;\n    if (number === 0) { return number; }\n    if (isNaN(number)) { return number; }\n    return number < 0 ? -1 : 1;\n  }\n\n  function toLength(o) {\n    var len = +o.length;\n    if (isNaN(len)) { return 0; }\n    if (len === 0 || !numberIsFinite(len)) { return len; }\n    len = sign(len) * Math.floor(Math.abs(len));\n    if (len <= 0) { return 0; }\n    if (len > maxSafeInteger) { return maxSafeInteger; }\n    return len;\n  }\n\n  /**\n  * This method creates a new Observable sequence from an array-like or iterable object.\n  * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n  * @param {Function} [mapFn] Map function to call on every element of the array.\n  * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n  * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n  */\n  var observableFrom = Observable.from = function (iterable, mapFn, thisArg, scheduler) {\n    if (iterable == null) {\n      throw new Error('iterable cannot be null.')\n    }\n    if (mapFn && !isFunction(mapFn)) {\n      throw new Error('mapFn when provided must be a function');\n    }\n    if (mapFn) {\n      var mapper = bindCallback(mapFn, thisArg, 2);\n    }\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromObservable(iterable, mapper, scheduler);\n  }\n\n  var FromArrayObservable = (function(__super__) {\n    inherits(FromArrayObservable, __super__);\n    function FromArrayObservable(args, scheduler) {\n      this._args = args;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, args) {\n      var len = args.length;\n      return function loopRecursive (i, recurse) {\n        if (i < len) {\n          o.onNext(args[i]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    FromArrayObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._args));\n    };\n\n    return FromArrayObservable;\n  }(ObservableBase));\n\n  /**\n  *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n  * @deprecated use Observable.from or Observable.of\n  * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n  */\n  var observableFromArray = Observable.fromArray = function (array, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler)\n  };\n\n  var GenerateObservable = (function (__super__) {\n    inherits(GenerateObservable, __super__);\n    function GenerateObservable(state, cndFn, itrFn, resFn, s) {\n      this._initialState = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n      var hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (hasResult === errorObj) { return state.o.onError(hasResult.e); }\n      if (hasResult) {\n        var result = tryCatch(state.self._resFn)(state.newState);\n        if (result === errorObj) { return state.o.onError(result.e); }\n        state.o.onNext(result);\n        recurse(state);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        first: true,\n        newState: this._initialState\n      };\n      return this._s.scheduleRecursive(state, scheduleRecursive);\n    };\n\n    return GenerateObservable;\n  }(ObservableBase));\n\n  /**\n   *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new GenerateObservable(initialState, condition, iterate, resultSelector, scheduler);\n  };\n\n  function observableOf (scheduler, array) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler);\n  }\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.of = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return new FromArrayObservable(args, currentThreadScheduler);\n  };\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.ofWithScheduler = function (scheduler) {\n    var len = arguments.length, args = new Array(len - 1);\n    for(var i = 1; i < len; i++) { args[i - 1] = arguments[i]; }\n    return new FromArrayObservable(args, scheduler);\n  };\n\n  var NeverObservable = (function(__super__) {\n    inherits(NeverObservable, __super__);\n    function NeverObservable() {\n      __super__.call(this);\n    }\n\n    NeverObservable.prototype.subscribeCore = function (observer) {\n      return disposableEmpty;\n    };\n\n    return NeverObservable;\n  }(ObservableBase));\n\n  var NEVER_OBSERVABLE = new NeverObservable();\n\n  /**\n   * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n   * @returns {Observable} An observable sequence whose observers will never get called.\n   */\n  var observableNever = Observable.never = function () {\n    return NEVER_OBSERVABLE;\n  };\n\n  var PairsObservable = (function(__super__) {\n    inherits(PairsObservable, __super__);\n    function PairsObservable(o, scheduler) {\n      this._o = o;\n      this._keys = Object.keys(o);\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, obj, keys) {\n      return function loopRecursive(i, recurse) {\n        if (i < keys.length) {\n          var key = keys[i];\n          o.onNext([key, obj[key]]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    PairsObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._o, this._keys));\n    };\n\n    return PairsObservable;\n  }(ObservableBase));\n\n  /**\n   * Convert an object into an observable sequence of [key, value] pairs.\n   * @param {Object} obj The object to inspect.\n   * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n   * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n   */\n  Observable.pairs = function (obj, scheduler) {\n    scheduler || (scheduler = currentThreadScheduler);\n    return new PairsObservable(obj, scheduler);\n  };\n\n    var RangeObservable = (function(__super__) {\n    inherits(RangeObservable, __super__);\n    function RangeObservable(start, count, scheduler) {\n      this.start = start;\n      this.rangeCount = count;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function loopRecursive(start, count, o) {\n      return function loop (i, recurse) {\n        if (i < count) {\n          o.onNext(start + i);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    RangeObservable.prototype.subscribeCore = function (o) {\n      return this.scheduler.scheduleRecursive(\n        0,\n        loopRecursive(this.start, this.rangeCount, o)\n      );\n    };\n\n    return RangeObservable;\n  }(ObservableBase));\n\n  /**\n  *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n  * @param {Number} start The value of the first integer in the sequence.\n  * @param {Number} count The number of sequential integers to generate.\n  * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n  * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n  */\n  Observable.range = function (start, count, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RangeObservable(start, count, scheduler);\n  };\n\n  var RepeatObservable = (function(__super__) {\n    inherits(RepeatObservable, __super__);\n    function RepeatObservable(value, repeatCount, scheduler) {\n      this.value = value;\n      this.repeatCount = repeatCount == null ? -1 : repeatCount;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    RepeatObservable.prototype.subscribeCore = function (observer) {\n      var sink = new RepeatSink(observer, this);\n      return sink.run();\n    };\n\n    return RepeatObservable;\n  }(ObservableBase));\n\n  function RepeatSink(observer, parent) {\n    this.observer = observer;\n    this.parent = parent;\n  }\n\n  RepeatSink.prototype.run = function () {\n    var observer = this.observer, value = this.parent.value;\n    function loopRecursive(i, recurse) {\n      if (i === -1 || i > 0) {\n        observer.onNext(value);\n        i > 0 && i--;\n      }\n      if (i === 0) { return observer.onCompleted(); }\n      recurse(i);\n    }\n\n    return this.parent.scheduler.scheduleRecursive(this.parent.repeatCount, loopRecursive);\n  };\n\n  /**\n   *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n   * @param {Mixed} value Element to repeat.\n   * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n   * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n   */\n  Observable.repeat = function (value, repeatCount, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RepeatObservable(value, repeatCount, scheduler);\n  };\n\n  var JustObservable = (function(__super__) {\n    inherits(JustObservable, __super__);\n    function JustObservable(value, scheduler) {\n      this._value = value;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    JustObservable.prototype.subscribeCore = function (o) {\n      var state = [this._value, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var value = state[0], observer = state[1];\n      observer.onNext(value);\n      observer.onCompleted();\n      return disposableEmpty;\n    }\n\n    return JustObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n   *  There is an alias called 'just' or browsers <IE9.\n   * @param {Mixed} value Single element in the resulting observable sequence.\n   * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence containing the single specified element.\n   */\n  var observableReturn = Observable['return'] = Observable.just = function (value, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new JustObservable(value, scheduler);\n  };\n\n  var ThrowObservable = (function(__super__) {\n    inherits(ThrowObservable, __super__);\n    function ThrowObservable(error, scheduler) {\n      this._error = error;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    ThrowObservable.prototype.subscribeCore = function (o) {\n      var state = [this._error, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var e = state[0], o = state[1];\n      o.onError(e);\n      return disposableEmpty;\n    }\n\n    return ThrowObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n   *  There is an alias to this method called 'throwError' for browsers <IE9.\n   * @param {Mixed} error An object used for the sequence's termination.\n   * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n   */\n  var observableThrow = Observable['throw'] = function (error, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new ThrowObservable(error, scheduler);\n  };\n\n  var UsingObservable = (function (__super__) {\n    inherits(UsingObservable, __super__);\n    function UsingObservable(resFn, obsFn) {\n      this._resFn = resFn;\n      this._obsFn = obsFn;\n      __super__.call(this);\n    }\n\n    UsingObservable.prototype.subscribeCore = function (o) {\n      var disposable = disposableEmpty;\n      var resource = tryCatch(this._resFn)();\n      if (resource === errorObj) {\n        return new BinaryDisposable(observableThrow(resource.e).subscribe(o), disposable);\n      }\n      resource && (disposable = resource);\n      var source = tryCatch(this._obsFn)(resource);\n      if (source === errorObj) {\n        return new BinaryDisposable(observableThrow(source.e).subscribe(o), disposable);\n      }\n      return new BinaryDisposable(source.subscribe(o), disposable);\n    };\n\n    return UsingObservable;\n  }(ObservableBase));\n\n  /**\n   * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n   * @param {Function} resourceFactory Factory function to obtain a resource object.\n   * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n   * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n   */\n  Observable.using = function (resourceFactory, observableFactory) {\n    return new UsingObservable(resourceFactory, observableFactory);\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @param {Observable} rightSource Second observable sequence or Promise.\n   * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n   */\n  observableProto.amb = function (rightSource) {\n    var leftSource = this;\n    return new AnonymousObservable(function (observer) {\n      var choice,\n        leftChoice = 'L', rightChoice = 'R',\n        leftSubscription = new SingleAssignmentDisposable(),\n        rightSubscription = new SingleAssignmentDisposable();\n\n      isPromise(rightSource) && (rightSource = observableFromPromise(rightSource));\n\n      function choiceL() {\n        if (!choice) {\n          choice = leftChoice;\n          rightSubscription.dispose();\n        }\n      }\n\n      function choiceR() {\n        if (!choice) {\n          choice = rightChoice;\n          leftSubscription.dispose();\n        }\n      }\n\n      var leftSubscribe = observerCreate(\n        function (left) {\n          choiceL();\n          choice === leftChoice && observer.onNext(left);\n        },\n        function (e) {\n          choiceL();\n          choice === leftChoice && observer.onError(e);\n        },\n        function () {\n          choiceL();\n          choice === leftChoice && observer.onCompleted();\n        }\n      );\n      var rightSubscribe = observerCreate(\n        function (right) {\n          choiceR();\n          choice === rightChoice && observer.onNext(right);\n        },\n        function (e) {\n          choiceR();\n          choice === rightChoice && observer.onError(e);\n        },\n        function () {\n          choiceR();\n          choice === rightChoice && observer.onCompleted();\n        }\n      );\n\n      leftSubscription.setDisposable(leftSource.subscribe(leftSubscribe));\n      rightSubscription.setDisposable(rightSource.subscribe(rightSubscribe));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    });\n  };\n\n  function amb(p, c) { return p.amb(c); }\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n   */\n  Observable.amb = function () {\n    var acc = observableNever(), items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(items);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    for (var i = 0, len = items.length; i < len; i++) {\n      acc = amb(acc, items[i]);\n    }\n    return acc;\n  };\n\n  var CatchObservable = (function (__super__) {\n    inherits(CatchObservable, __super__);\n    function CatchObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObservable.prototype.subscribeCore = function (o) {\n      var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();\n      subscription.setDisposable(d1);\n      d1.setDisposable(this.source.subscribe(new CatchObserver(o, subscription, this._fn)));\n      return subscription;\n    };\n\n    return CatchObservable;\n  }(ObservableBase));\n\n  var CatchObserver = (function(__super__) {\n    inherits(CatchObserver, __super__);\n    function CatchObserver(o, s, fn) {\n      this._o = o;\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObserver.prototype.next = function (x) { this._o.onNext(x); };\n    CatchObserver.prototype.completed = function () { return this._o.onCompleted(); };\n    CatchObserver.prototype.error = function (e) {\n      var result = tryCatch(this._fn)(e);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      isPromise(result) && (result = observableFromPromise(result));\n\n      var d = new SingleAssignmentDisposable();\n      this._s.setDisposable(d);\n      d.setDisposable(result.subscribe(this._o));\n    };\n\n    return CatchObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n   * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n   */\n  observableProto['catch'] = function (handlerOrSecond) {\n    return isFunction(handlerOrSecond) ? new CatchObservable(this, handlerOrSecond) : observableCatch([this, handlerOrSecond]);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n   * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n   */\n  var observableCatch = Observable['catch'] = function () {\n    var items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(len);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    return enumerableOf(items).catchError();\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   * This can be in the form of an argument list of observables or an array.\n   *\n   * @example\n   * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return combineLatest.apply(this, args);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var CombineLatestObservable = (function(__super__) {\n    inherits(CombineLatestObservable, __super__);\n    function CombineLatestObservable(params, cb) {\n      this._params = params;\n      this._cb = cb;\n      __super__.call(this);\n    }\n\n    CombineLatestObservable.prototype.subscribeCore = function(observer) {\n      var len = this._params.length,\n          subscriptions = new Array(len);\n\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        isDone: arrayInitialize(len, falseFactory),\n        values: new Array(len)\n      };\n\n      for (var i = 0; i < len; i++) {\n        var source = this._params[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new CombineLatestObserver(observer, i, this._cb, state)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return CombineLatestObservable;\n  }(ObservableBase));\n\n  var CombineLatestObserver = (function (__super__) {\n    inherits(CombineLatestObserver, __super__);\n    function CombineLatestObserver(o, i, cb, state) {\n      this._o = o;\n      this._i = i;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    CombineLatestObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      if (this._state.hasValueAll || (this._state.hasValueAll = this._state.hasValue.every(identity))) {\n        var res = tryCatch(this._cb).apply(null, this._state.values);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._state.isDone.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    CombineLatestObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    CombineLatestObserver.prototype.completed = function () {\n      this._state.isDone[this._i] = true;\n      this._state.isDone.every(identity) && this._o.onCompleted();\n    };\n\n    return CombineLatestObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n  *\n  * @example\n  * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n  * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n  * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n  */\n  var combineLatest = Observable.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n    return new CombineLatestObservable(args, resultSelector);\n  };\n\n  /**\n   * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  observableProto.concat = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    args.unshift(this);\n    return observableConcat.apply(null, args);\n  };\n\n  var ConcatObserver = (function(__super__) {\n    inherits(ConcatObserver, __super__);\n    function ConcatObserver(s, fn) {\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    ConcatObserver.prototype.next = function (x) { this._s.o.onNext(x); };\n    ConcatObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    ConcatObserver.prototype.completed = function () { this._s.i++; this._fn(this._s); };\n\n    return ConcatObserver;\n  }(AbstractObserver));\n\n  var ConcatObservable = (function(__super__) {\n    inherits(ConcatObservable, __super__);\n    function ConcatObservable(sources) {\n      this._sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive (state, recurse) {\n      if (state.disposable.isDisposed) { return; }\n      if (state.i === state.sources.length) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = state.sources[state.i];\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new ConcatObserver(state, recurse)));\n    }\n\n    ConcatObservable.prototype.subscribeCore = function(o) {\n      var subscription = new SerialDisposable();\n      var disposable = disposableCreate(noop);\n      var state = {\n        o: o,\n        i: 0,\n        subscription: subscription,\n        disposable: disposable,\n        sources: this._sources\n      };\n\n      var cancelable = immediateScheduler.scheduleRecursive(state, scheduleRecursive);\n      return new NAryDisposable([subscription, disposable, cancelable]);\n    };\n\n    return ConcatObservable;\n  }(ObservableBase));\n\n  /**\n   * Concatenates all the observable sequences.\n   * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  var observableConcat = Observable.concat = function () {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      args = new Array(arguments.length);\n      for(var i = 0, len = arguments.length; i < len; i++) { args[i] = arguments[i]; }\n    }\n    return new ConcatObservable(args);\n  };\n\n  /**\n   * Concatenates an observable sequence of observable sequences.\n   * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n   */\n  observableProto.concatAll = function () {\n    return this.merge(1);\n  };\n\n  var MergeObservable = (function (__super__) {\n    inherits(MergeObservable, __super__);\n\n    function MergeObservable(source, maxConcurrent) {\n      this.source = source;\n      this.maxConcurrent = maxConcurrent;\n      __super__.call(this);\n    }\n\n    MergeObservable.prototype.subscribeCore = function(observer) {\n      var g = new CompositeDisposable();\n      g.add(this.source.subscribe(new MergeObserver(observer, this.maxConcurrent, g)));\n      return g;\n    };\n\n    return MergeObservable;\n\n  }(ObservableBase));\n\n  var MergeObserver = (function (__super__) {\n    function MergeObserver(o, max, g) {\n      this.o = o;\n      this.max = max;\n      this.g = g;\n      this.done = false;\n      this.q = [];\n      this.activeCount = 0;\n      __super__.call(this);\n    }\n\n    inherits(MergeObserver, __super__);\n\n    MergeObserver.prototype.handleSubscribe = function (xs) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(xs) && (xs = observableFromPromise(xs));\n      sad.setDisposable(xs.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeObserver.prototype.next = function (innerSource) {\n      if(this.activeCount < this.max) {\n        this.activeCount++;\n        this.handleSubscribe(innerSource);\n      } else {\n        this.q.push(innerSource);\n      }\n    };\n    MergeObserver.prototype.error = function (e) { this.o.onError(e); };\n    MergeObserver.prototype.completed = function () { this.done = true; this.activeCount === 0 && this.o.onCompleted(); };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) { this.parent.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this.parent.o.onError(e); };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      if (this.parent.q.length > 0) {\n        this.parent.handleSubscribe(this.parent.q.shift());\n      } else {\n        this.parent.activeCount--;\n        this.parent.done && this.parent.activeCount === 0 && this.parent.o.onCompleted();\n      }\n    };\n\n    return MergeObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n  * Or merges two observable sequences into a single observable sequence.\n  * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.merge = function (maxConcurrentOrOther) {\n    return typeof maxConcurrentOrOther !== 'number' ?\n      observableMerge(this, maxConcurrentOrOther) :\n      new MergeObservable(this, maxConcurrentOrOther);\n  };\n\n  /**\n   * Merges all the observable sequences into a single observable sequence.\n   * The scheduler is optional and if not specified, the immediate scheduler is used.\n   * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n   */\n  var observableMerge = Observable.merge = function () {\n    var scheduler, sources = [], i, len = arguments.length;\n    if (!arguments[0]) {\n      scheduler = immediateScheduler;\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else if (isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else {\n      scheduler = immediateScheduler;\n      for(i = 0; i < len; i++) { sources.push(arguments[i]); }\n    }\n    if (Array.isArray(sources[0])) {\n      sources = sources[0];\n    }\n    return observableOf(scheduler, sources).mergeAll();\n  };\n\n  var MergeAllObservable = (function (__super__) {\n    inherits(MergeAllObservable, __super__);\n\n    function MergeAllObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeAllObservable.prototype.subscribeCore = function (o) {\n      var g = new CompositeDisposable(), m = new SingleAssignmentDisposable();\n      g.add(m);\n      m.setDisposable(this.source.subscribe(new MergeAllObserver(o, g)));\n      return g;\n    };\n\n    return MergeAllObservable;\n  }(ObservableBase));\n\n  var MergeAllObserver = (function (__super__) {\n    function MergeAllObserver(o, g) {\n      this.o = o;\n      this.g = g;\n      this.done = false;\n      __super__.call(this);\n    }\n\n    inherits(MergeAllObserver, __super__);\n\n    MergeAllObserver.prototype.next = function(innerSource) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      sad.setDisposable(innerSource.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeAllObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    MergeAllObserver.prototype.completed = function () {\n      this.done = true;\n      this.g.length === 1 && this.o.onCompleted();\n    };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) {\n      this.parent.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function (e) {\n      this.parent.o.onError(e);\n    };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      this.parent.done && this.parent.g.length === 1 && this.parent.o.onCompleted();\n    };\n\n    return MergeAllObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.mergeAll = function () {\n    return new MergeAllObservable(this);\n  };\n\n  var CompositeError = Rx.CompositeError = function(errors) {\n    this.innerErrors = errors;\n    this.message = 'This contains multiple errors. Check the innerErrors';\n    Error.call(this);\n  };\n  CompositeError.prototype = Object.create(Error.prototype);\n  CompositeError.prototype.name = 'CompositeError';\n\n  var MergeDelayErrorObservable = (function(__super__) {\n    inherits(MergeDelayErrorObservable, __super__);\n    function MergeDelayErrorObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeDelayErrorObservable.prototype.subscribeCore = function (o) {\n      var group = new CompositeDisposable(),\n        m = new SingleAssignmentDisposable(),\n        state = { isStopped: false, errors: [], o: o };\n\n      group.add(m);\n      m.setDisposable(this.source.subscribe(new MergeDelayErrorObserver(group, state)));\n\n      return group;\n    };\n\n    return MergeDelayErrorObservable;\n  }(ObservableBase));\n\n  var MergeDelayErrorObserver = (function(__super__) {\n    inherits(MergeDelayErrorObserver, __super__);\n    function MergeDelayErrorObserver(group, state) {\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function setCompletion(o, errors) {\n      if (errors.length === 0) {\n        o.onCompleted();\n      } else if (errors.length === 1) {\n        o.onError(errors[0]);\n      } else {\n        o.onError(new CompositeError(errors));\n      }\n    }\n\n    MergeDelayErrorObserver.prototype.next = function (x) {\n      var inner = new SingleAssignmentDisposable();\n      this._group.add(inner);\n\n      // Check for promises support\n      isPromise(x) && (x = observableFromPromise(x));\n      inner.setDisposable(x.subscribe(new InnerObserver(inner, this._group, this._state)));\n    };\n\n    MergeDelayErrorObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    MergeDelayErrorObserver.prototype.completed = function () {\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    inherits(InnerObserver, __super__);\n    function InnerObserver(inner, group, state) {\n      this._inner = inner;\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n    InnerObserver.prototype.completed = function () {\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    return MergeDelayErrorObserver;\n  }(AbstractObserver));\n\n  /**\n  * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n  * receive all successfully emitted items from all of the source Observables without being interrupted by\n  * an error notification from one of them.\n  *\n  * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n  * error via the Observer's onError, mergeDelayError will refrain from propagating that\n  * error notification until all of the merged Observables have finished emitting items.\n  * @param {Array | Arguments} args Arguments or an array to merge.\n  * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n  */\n  Observable.mergeDelayError = function() {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      var len = arguments.length;\n      args = new Array(len);\n      for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    var source = observableOf(null, args);\n    return new MergeDelayErrorObservable(source);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n   * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n   */\n  observableProto.onErrorResumeNext = function (second) {\n    if (!second) { throw new Error('Second observable is required'); }\n    return onErrorResumeNext([this, second]);\n  };\n\n  var OnErrorResumeNextObservable = (function(__super__) {\n    inherits(OnErrorResumeNextObservable, __super__);\n    function OnErrorResumeNextObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.pos < state.sources.length) {\n        var current = state.sources[state.pos++];\n        isPromise(current) && (current = observableFromPromise(current));\n        var d = new SingleAssignmentDisposable();\n        state.subscription.setDisposable(d);\n        d.setDisposable(current.subscribe(new OnErrorResumeNextObserver(state, recurse)));\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    OnErrorResumeNextObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable(),\n          state = {pos: 0, subscription: subscription, o: o, sources: this.sources },\n          cancellable = immediateScheduler.scheduleRecursive(state, scheduleMethod);\n\n      return new BinaryDisposable(subscription, cancellable);\n    };\n\n    return OnErrorResumeNextObservable;\n  }(ObservableBase));\n\n  var OnErrorResumeNextObserver = (function(__super__) {\n    inherits(OnErrorResumeNextObserver, __super__);\n    function OnErrorResumeNextObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      __super__.call(this);\n    }\n\n    OnErrorResumeNextObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    OnErrorResumeNextObserver.prototype.error = function () { this._recurse(this._state); };\n    OnErrorResumeNextObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return OnErrorResumeNextObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n   */\n  var onErrorResumeNext = Observable.onErrorResumeNext = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      var len = arguments.length;\n      sources = new Array(len);\n      for(var i = 0; i < len; i++) { sources[i] = arguments[i]; }\n    }\n    return new OnErrorResumeNextObservable(sources);\n  };\n\n  var SkipUntilObservable = (function(__super__) {\n    inherits(SkipUntilObservable, __super__);\n\n    function SkipUntilObservable(source, other) {\n      this._s = source;\n      this._o = isPromise(other) ? observableFromPromise(other) : other;\n      this._open = false;\n      __super__.call(this);\n    }\n\n    SkipUntilObservable.prototype.subscribeCore = function(o) {\n      var leftSubscription = new SingleAssignmentDisposable();\n      leftSubscription.setDisposable(this._s.subscribe(new SkipUntilSourceObserver(o, this)));\n\n      isPromise(this._o) && (this._o = observableFromPromise(this._o));\n\n      var rightSubscription = new SingleAssignmentDisposable();\n      rightSubscription.setDisposable(this._o.subscribe(new SkipUntilOtherObserver(o, this, rightSubscription)));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    };\n\n    return SkipUntilObservable;\n  }(ObservableBase));\n\n  var SkipUntilSourceObserver = (function(__super__) {\n    inherits(SkipUntilSourceObserver, __super__);\n    function SkipUntilSourceObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipUntilSourceObserver.prototype.next = function (x) {\n      this._p._open && this._o.onNext(x);\n    };\n\n    SkipUntilSourceObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilSourceObserver.prototype.onCompleted = function () {\n      this._p._open && this._o.onCompleted();\n    };\n\n    return SkipUntilSourceObserver;\n  }(AbstractObserver));\n\n  var SkipUntilOtherObserver = (function(__super__) {\n    inherits(SkipUntilOtherObserver, __super__);\n    function SkipUntilOtherObserver(o, p, r) {\n      this._o = o;\n      this._p = p;\n      this._r = r;\n      __super__.call(this);\n    }\n\n    SkipUntilOtherObserver.prototype.next = function () {\n      this._p._open = true;\n      this._r.dispose();\n    };\n\n    SkipUntilOtherObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilOtherObserver.prototype.onCompleted = function () {\n      this._r.dispose();\n    };\n\n    return SkipUntilOtherObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n   * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n   */\n  observableProto.skipUntil = function (other) {\n    return new SkipUntilObservable(this, other);\n  };\n\n  var SwitchObservable = (function(__super__) {\n    inherits(SwitchObservable, __super__);\n    function SwitchObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    SwitchObservable.prototype.subscribeCore = function (o) {\n      var inner = new SerialDisposable(), s = this.source.subscribe(new SwitchObserver(o, inner));\n      return new BinaryDisposable(s, inner);\n    };\n\n    inherits(SwitchObserver, AbstractObserver);\n    function SwitchObserver(o, inner) {\n      this.o = o;\n      this.inner = inner;\n      this.stopped = false;\n      this.latest = 0;\n      this.hasLatest = false;\n      AbstractObserver.call(this);\n    }\n\n    SwitchObserver.prototype.next = function (innerSource) {\n      var d = new SingleAssignmentDisposable(), id = ++this.latest;\n      this.hasLatest = true;\n      this.inner.setDisposable(d);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      d.setDisposable(innerSource.subscribe(new InnerObserver(this, id)));\n    };\n\n    SwitchObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    SwitchObserver.prototype.completed = function () {\n      this.stopped = true;\n      !this.hasLatest && this.o.onCompleted();\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(parent, id) {\n      this.parent = parent;\n      this.id = id;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function (x) {\n      this.parent.latest === this.id && this.parent.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.parent.latest === this.id && this.parent.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      if (this.parent.latest === this.id) {\n        this.parent.hasLatest = false;\n        this.parent.stopped && this.parent.o.onCompleted();\n      }\n    };\n\n    return SwitchObservable;\n  }(ObservableBase));\n\n  /**\n  * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n  * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n  */\n  observableProto['switch'] = observableProto.switchLatest = function () {\n    return new SwitchObservable(this);\n  };\n\n  var TakeUntilObservable = (function(__super__) {\n    inherits(TakeUntilObservable, __super__);\n\n    function TakeUntilObservable(source, other) {\n      this.source = source;\n      this.other = isPromise(other) ? observableFromPromise(other) : other;\n      __super__.call(this);\n    }\n\n    TakeUntilObservable.prototype.subscribeCore = function(o) {\n      return new BinaryDisposable(\n        this.source.subscribe(o),\n        this.other.subscribe(new TakeUntilObserver(o))\n      );\n    };\n\n    return TakeUntilObservable;\n  }(ObservableBase));\n\n  var TakeUntilObserver = (function(__super__) {\n    inherits(TakeUntilObserver, __super__);\n    function TakeUntilObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    TakeUntilObserver.prototype.next = function () {\n      this._o.onCompleted();\n    };\n\n    TakeUntilObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    TakeUntilObserver.prototype.onCompleted = noop;\n\n    return TakeUntilObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence until the other observable sequence produces a value.\n   * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n   */\n  observableProto.takeUntil = function (other) {\n    return new TakeUntilObservable(this, other);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var WithLatestFromObservable = (function(__super__) {\n    inherits(WithLatestFromObservable, __super__);\n    function WithLatestFromObservable(source, sources, resultSelector) {\n      this._s = source;\n      this._ss = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    WithLatestFromObservable.prototype.subscribeCore = function (o) {\n      var len = this._ss.length;\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        values: new Array(len)\n      };\n\n      var n = this._ss.length, subscriptions = new Array(n + 1);\n      for (var i = 0; i < n; i++) {\n        var other = this._ss[i], sad = new SingleAssignmentDisposable();\n        isPromise(other) && (other = observableFromPromise(other));\n        sad.setDisposable(other.subscribe(new WithLatestFromOtherObserver(o, i, state)));\n        subscriptions[i] = sad;\n      }\n\n      var outerSad = new SingleAssignmentDisposable();\n      outerSad.setDisposable(this._s.subscribe(new WithLatestFromSourceObserver(o, this._cb, state)));\n      subscriptions[n] = outerSad;\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return WithLatestFromObservable;\n  }(ObservableBase));\n\n  var WithLatestFromOtherObserver = (function (__super__) {\n    inherits(WithLatestFromOtherObserver, __super__);\n    function WithLatestFromOtherObserver(o, i, state) {\n      this._o = o;\n      this._i = i;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromOtherObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      this._state.hasValueAll = this._state.hasValue.every(identity);\n    };\n\n    WithLatestFromOtherObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromOtherObserver.prototype.completed = noop;\n\n    return WithLatestFromOtherObserver;\n  }(AbstractObserver));\n\n  var WithLatestFromSourceObserver = (function (__super__) {\n    inherits(WithLatestFromSourceObserver, __super__);\n    function WithLatestFromSourceObserver(o, cb, state) {\n      this._o = o;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromSourceObserver.prototype.next = function (x) {\n      var allValues = [x].concat(this._state.values);\n      if (!this._state.hasValueAll) { return; }\n      var res = tryCatch(this._cb).apply(null, allValues);\n      if (res === errorObj) { return this._o.onError(res.e); }\n      this._o.onNext(res);\n    };\n\n    WithLatestFromSourceObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromSourceObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return WithLatestFromSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.withLatestFrom = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    return new WithLatestFromObservable(this, args, resultSelector);\n  };\n\n  function falseFactory() { return false; }\n  function emptyArrayFactory() { return []; }\n\n  var ZipObservable = (function(__super__) {\n    inherits(ZipObservable, __super__);\n    function ZipObservable(sources, resultSelector) {\n      this._s = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    ZipObservable.prototype.subscribeCore = function(observer) {\n      var n = this._s.length,\n          subscriptions = new Array(n),\n          done = arrayInitialize(n, falseFactory),\n          q = arrayInitialize(n, emptyArrayFactory);\n\n      for (var i = 0; i < n; i++) {\n        var source = this._s[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new ZipObserver(observer, i, this, q, done)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return ZipObservable;\n  }(ObservableBase));\n\n  var ZipObserver = (function (__super__) {\n    inherits(ZipObserver, __super__);\n    function ZipObserver(o, i, p, q, d) {\n      this._o = o;\n      this._i = i;\n      this._p = p;\n      this._q = q;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    function notEmpty(x) { return x.length > 0; }\n    function shiftEach(x) { return x.shift(); }\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    ZipObserver.prototype.next = function (x) {\n      this._q[this._i].push(x);\n      if (this._q.every(notEmpty)) {\n        var queuedValues = this._q.map(shiftEach);\n        var res = tryCatch(this._p._cb).apply(null, queuedValues);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._d.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    ZipObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ZipObserver.prototype.completed = function () {\n      this._d[this._i] = true;\n      this._d.every(identity) && this._o.onCompleted();\n    };\n\n    return ZipObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n   * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n   */\n  observableProto.zip = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    var parent = this;\n    args.unshift(parent);\n\n    return new ZipObservable(args, resultSelector);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n   * @param arguments Observable sources.\n   * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  Observable.zip = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args = isFunction(args[1]) ? args[0].concat(args[1]) : args[0];\n    }\n    var first = args.shift();\n    return first.zip.apply(first, args);\n  };\n\nfunction falseFactory() { return false; }\nfunction emptyArrayFactory() { return []; }\nfunction argumentsToArray() {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return args;\n}\n\nvar ZipIterableObservable = (function(__super__) {\n  inherits(ZipIterableObservable, __super__);\n  function ZipIterableObservable(sources, cb) {\n    this.sources = sources;\n    this._cb = cb;\n    __super__.call(this);\n  }\n\n  ZipIterableObservable.prototype.subscribeCore = function (o) {\n    var sources = this.sources, len = sources.length, subscriptions = new Array(len);\n\n    var state = {\n      q: arrayInitialize(len, emptyArrayFactory),\n      done: arrayInitialize(len, falseFactory),\n      cb: this._cb,\n      o: o\n    };\n\n    for (var i = 0; i < len; i++) {\n      (function (i) {\n        var source = sources[i], sad = new SingleAssignmentDisposable();\n        (isArrayLike(source) || isIterable(source)) && (source = observableFrom(source));\n\n        subscriptions[i] = sad;\n        sad.setDisposable(source.subscribe(new ZipIterableObserver(state, i)));\n      }(i));\n    }\n\n    return new NAryDisposable(subscriptions);\n  };\n\n  return ZipIterableObservable;\n}(ObservableBase));\n\nvar ZipIterableObserver = (function (__super__) {\n  inherits(ZipIterableObserver, __super__);\n  function ZipIterableObserver(s, i) {\n    this._s = s;\n    this._i = i;\n    __super__.call(this);\n  }\n\n  function notEmpty(x) { return x.length > 0; }\n  function shiftEach(x) { return x.shift(); }\n  function notTheSame(i) {\n    return function (x, j) {\n      return j !== i;\n    };\n  }\n\n  ZipIterableObserver.prototype.next = function (x) {\n    this._s.q[this._i].push(x);\n    if (this._s.q.every(notEmpty)) {\n      var queuedValues = this._s.q.map(shiftEach),\n          res = tryCatch(this._s.cb).apply(null, queuedValues);\n      if (res === errorObj) { return this._s.o.onError(res.e); }\n      this._s.o.onNext(res);\n    } else if (this._s.done.filter(notTheSame(this._i)).every(identity)) {\n      this._s.o.onCompleted();\n    }\n  };\n\n  ZipIterableObserver.prototype.error = function (e) { this._s.o.onError(e); };\n\n  ZipIterableObserver.prototype.completed = function () {\n    this._s.done[this._i] = true;\n    this._s.done.every(identity) && this._s.o.onCompleted();\n  };\n\n  return ZipIterableObserver;\n}(AbstractObserver));\n\n/**\n * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n */\nobservableProto.zipIterable = function () {\n  if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n\n  var parent = this;\n  args.unshift(parent);\n  return new ZipIterableObservable(args, resultSelector);\n};\n\n  function asObservable(source) {\n    return function subscribe(o) { return source.subscribe(o); };\n  }\n\n  /**\n   *  Hides the identity of an observable sequence.\n   * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n   */\n  observableProto.asObservable = function () {\n    return new AnonymousObservable(asObservable(this), this);\n  };\n\n  function toArray(x) { return x.toArray(); }\n  function notEmpty(x) { return x.length > 0; }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n   * @param {Number} count Length of each buffer.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithCount = observableProto.bufferCount = function (count, skip) {\n    typeof skip !== 'number' && (skip = count);\n    return this.windowWithCount(count, skip)\n      .flatMap(toArray)\n      .filter(notEmpty);\n  };\n\n  var DematerializeObservable = (function (__super__) {\n    inherits(DematerializeObservable, __super__);\n    function DematerializeObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    DematerializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DematerializeObserver(o));\n    };\n\n    return DematerializeObservable;\n  }(ObservableBase));\n\n  var DematerializeObserver = (function (__super__) {\n    inherits(DematerializeObserver, __super__);\n\n    function DematerializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    DematerializeObserver.prototype.next = function (x) { x.accept(this._o); };\n    DematerializeObserver.prototype.error = function (e) { this._o.onError(e); };\n    DematerializeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DematerializeObserver;\n  }(AbstractObserver));\n\n  /**\n   * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n   * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n   */\n  observableProto.dematerialize = function () {\n    return new DematerializeObservable(this);\n  };\n\n  var DistinctUntilChangedObservable = (function(__super__) {\n    inherits(DistinctUntilChangedObservable, __super__);\n    function DistinctUntilChangedObservable(source, keyFn, comparer) {\n      this.source = source;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctUntilChangedObserver(o, this.keyFn, this.comparer));\n    };\n\n    return DistinctUntilChangedObservable;\n  }(ObservableBase));\n\n  var DistinctUntilChangedObserver = (function(__super__) {\n    inherits(DistinctUntilChangedObserver, __super__);\n    function DistinctUntilChangedObserver(o, keyFn, comparer) {\n      this.o = o;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      this.hasCurrentKey = false;\n      this.currentKey = null;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObserver.prototype.next = function (x) {\n      var key = x, comparerEquals;\n      if (isFunction(this.keyFn)) {\n        key = tryCatch(this.keyFn)(x);\n        if (key === errorObj) { return this.o.onError(key.e); }\n      }\n      if (this.hasCurrentKey) {\n        comparerEquals = tryCatch(this.comparer)(this.currentKey, key);\n        if (comparerEquals === errorObj) { return this.o.onError(comparerEquals.e); }\n      }\n      if (!this.hasCurrentKey || !comparerEquals) {\n        this.hasCurrentKey = true;\n        this.currentKey = key;\n        this.o.onNext(x);\n      }\n    };\n    DistinctUntilChangedObserver.prototype.error = function(e) {\n      this.o.onError(e);\n    };\n    DistinctUntilChangedObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return DistinctUntilChangedObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Returns an observable sequence that contains only distinct contiguous elements according to the keyFn and the comparer.\n  * @param {Function} [keyFn] A function to compute the comparison key for each element. If not provided, it projects the value.\n  * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n  * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n  */\n  observableProto.distinctUntilChanged = function (keyFn, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctUntilChangedObservable(this, keyFn, comparer);\n  };\n\n  var TapObservable = (function(__super__) {\n    inherits(TapObservable,__super__);\n    function TapObservable(source, observerOrOnNext, onError, onCompleted) {\n      this.source = source;\n      this._oN = observerOrOnNext;\n      this._oE = onError;\n      this._oC = onCompleted;\n      __super__.call(this);\n    }\n\n    TapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, p) {\n      this.o = o;\n      this.t = !p._oN || isFunction(p._oN) ?\n        observerCreate(p._oN || noop, p._oE || noop, p._oC || noop) :\n        p._oN;\n      this.isStopped = false;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function(x) {\n      var res = tryCatch(this.t.onNext).call(this.t, x);\n      if (res === errorObj) { this.o.onError(res.e); }\n      this.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function(err) {\n      var res = tryCatch(this.t.onError).call(this.t, err);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onError(err);\n    };\n    InnerObserver.prototype.completed = function() {\n      var res = tryCatch(this.t.onCompleted).call(this.t);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onCompleted();\n    };\n\n    return TapObservable;\n  }(ObservableBase));\n\n  /**\n  *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an o.\n  * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto['do'] = observableProto.tap = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) {\n    return new TapObservable(this, observerOrOnNext, onError, onCompleted);\n  };\n\n  /**\n  *  Invokes an action for each element in the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onNext Action to invoke for each element in the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnNext = observableProto.tapOnNext = function (onNext, thisArg) {\n    return this.tap(typeof thisArg !== 'undefined' ? function (x) { onNext.call(thisArg, x); } : onNext);\n  };\n\n  /**\n  *  Invokes an action upon exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnError = observableProto.tapOnError = function (onError, thisArg) {\n    return this.tap(noop, typeof thisArg !== 'undefined' ? function (e) { onError.call(thisArg, e); } : onError);\n  };\n\n  /**\n  *  Invokes an action upon graceful termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnCompleted = observableProto.tapOnCompleted = function (onCompleted, thisArg) {\n    return this.tap(noop, null, typeof thisArg !== 'undefined' ? function () { onCompleted.call(thisArg); } : onCompleted);\n  };\n\n  var FinallyObservable = (function (__super__) {\n    inherits(FinallyObservable, __super__);\n    function FinallyObservable(source, fn, thisArg) {\n      this.source = source;\n      this._fn = bindCallback(fn, thisArg, 0);\n      __super__.call(this);\n    }\n\n    FinallyObservable.prototype.subscribeCore = function (o) {\n      var d = tryCatch(this.source.subscribe).call(this.source, o);\n      if (d === errorObj) {\n        this._fn();\n        thrower(d.e);\n      }\n\n      return new FinallyDisposable(d, this._fn);\n    };\n\n    function FinallyDisposable(s, fn) {\n      this.isDisposed = false;\n      this._s = s;\n      this._fn = fn;\n    }\n    FinallyDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        var res = tryCatch(this._s.dispose).call(this._s);\n        this._fn();\n        res === errorObj && thrower(res.e);\n      }\n    };\n\n    return FinallyObservable;\n\n  }(ObservableBase));\n\n  /**\n   *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n   * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n   * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n   */\n  observableProto['finally'] = function (action, thisArg) {\n    return new FinallyObservable(this, action, thisArg);\n  };\n\n  var IgnoreElementsObservable = (function(__super__) {\n    inherits(IgnoreElementsObservable, __super__);\n\n    function IgnoreElementsObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    IgnoreElementsObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    function InnerObserver(o) {\n      this.o = o;\n      this.isStopped = false;\n    }\n    InnerObserver.prototype.onNext = noop;\n    InnerObserver.prototype.onError = function (err) {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onError(err);\n      }\n    };\n    InnerObserver.prototype.onCompleted = function () {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onCompleted();\n      }\n    };\n    InnerObserver.prototype.dispose = function() { this.isStopped = true; };\n    InnerObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.observer.onError(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return IgnoreElementsObservable;\n  }(ObservableBase));\n\n  /**\n   *  Ignores all elements in an observable sequence leaving only the termination messages.\n   * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n   */\n  observableProto.ignoreElements = function () {\n    return new IgnoreElementsObservable(this);\n  };\n\n  var MaterializeObservable = (function (__super__) {\n    inherits(MaterializeObservable, __super__);\n    function MaterializeObservable(source, fn) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MaterializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new MaterializeObserver(o));\n    };\n\n    return MaterializeObservable;\n  }(ObservableBase));\n\n  var MaterializeObserver = (function (__super__) {\n    inherits(MaterializeObserver, __super__);\n\n    function MaterializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    MaterializeObserver.prototype.next = function (x) { this._o.onNext(notificationCreateOnNext(x)) };\n    MaterializeObserver.prototype.error = function (e) { this._o.onNext(notificationCreateOnError(e)); this._o.onCompleted(); };\n    MaterializeObserver.prototype.completed = function () { this._o.onNext(notificationCreateOnCompleted()); this._o.onCompleted(); };\n\n    return MaterializeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n   * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n   */\n  observableProto.materialize = function () {\n    return new MaterializeObservable(this);\n  };\n\n  /**\n   *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n   * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n   * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n   */\n  observableProto.repeat = function (repeatCount) {\n    return enumerableRepeat(this, repeatCount).concat();\n  };\n\n  /**\n   *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n   *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n   *\n   * @example\n   *  var res = retried = retry.repeat();\n   *  var res = retried = retry.repeat(2);\n   * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retry = function (retryCount) {\n    return enumerableRepeat(this, retryCount).catchError();\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RetryWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RetryWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RetryWhenObservable, __super__);\n\n    RetryWhenObservable.prototype.subscribeCore = function (o) {\n      var exceptions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(exceptions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            exceptions.onNext(exn);\n            outer.dispose();\n          },\n          function() { o.onCompleted(); }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RetryWhenObservable;\n  }(ObservableBase));\n\n  observableProto.retryWhen = function (notifier) {\n    return new RetryWhenObservable(repeat(this), notifier);\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RepeatWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RepeatWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RepeatWhenObservable, __super__);\n\n    RepeatWhenObservable.prototype.subscribeCore = function (o) {\n      var completions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(completions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) { o.onError(exn); },\n          function() {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            completions.onNext(null);\n            outer.dispose();\n          }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RepeatWhenObservable;\n  }(ObservableBase));\n\n  observableProto.repeatWhen = function (notifier) {\n    return new RepeatWhenObservable(repeat(this), notifier);\n  };\n\n  var ScanObservable = (function(__super__) {\n    inherits(ScanObservable, __super__);\n    function ScanObservable(source, accumulator, hasSeed, seed) {\n      this.source = source;\n      this.accumulator = accumulator;\n      this.hasSeed = hasSeed;\n      this.seed = seed;\n      __super__.call(this);\n    }\n\n    ScanObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new ScanObserver(o,this));\n    };\n\n    return ScanObservable;\n  }(ObservableBase));\n\n  var ScanObserver = (function (__super__) {\n    inherits(ScanObserver, __super__);\n    function ScanObserver(o, parent) {\n      this._o = o;\n      this._p = parent;\n      this._fn = parent.accumulator;\n      this._hs = parent.hasSeed;\n      this._s = parent.seed;\n      this._ha = false;\n      this._a = null;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    ScanObserver.prototype.next = function (x) {\n      !this._hv && (this._hv = true);\n      if (this._ha) {\n        this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n      } else {\n        this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n        this._ha = true;\n      }\n      if (this._a === errorObj) { return this._o.onError(this._a.e); }\n      this._o.onNext(this._a);\n      this._i++;\n    };\n\n    ScanObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ScanObserver.prototype.completed = function () {\n      !this._hv && this._hs && this._o.onNext(this._s);\n      this._o.onCompleted();\n    };\n\n    return ScanObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n  *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n  * @param {Mixed} [seed] The initial accumulator value.\n  * @param {Function} accumulator An accumulator function to be invoked on each element.\n  * @returns {Observable} An observable sequence containing the accumulated values.\n  */\n  observableProto.scan = function () {\n    var hasSeed = false, seed, accumulator = arguments[0];\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new ScanObservable(this, accumulator, hasSeed, seed);\n  };\n\n  var SkipLastObservable = (function (__super__) {\n    inherits(SkipLastObservable, __super__);\n    function SkipLastObservable(source, c) {\n      this.source = source;\n      this._c = c;\n      __super__.call(this);\n    }\n\n    SkipLastObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipLastObserver(o, this._c));\n    };\n\n    return SkipLastObservable;\n  }(ObservableBase));\n\n  var SkipLastObserver = (function (__super__) {\n    inherits(SkipLastObserver, __super__);\n    function SkipLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    SkipLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._o.onNext(this._q.shift());\n    };\n\n    SkipLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    SkipLastObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return SkipLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses a specified number of elements at the end of an observable sequence.\n   * @description\n   *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n   *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n   * @param count Number of elements to bypass at the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n   */\n  observableProto.skipLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipLastObservable(this, count);\n  };\n\n  /**\n   *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n   *  @example\n   *  var res = source.startWith(1, 2, 3);\n   *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n   * @param {Arguments} args The specified values to prepend to the observable sequence\n   * @returns {Observable} The source sequence prepended with the specified values.\n   */\n  observableProto.startWith = function () {\n    var values, scheduler, start = 0;\n    if (!!arguments.length && isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      start = 1;\n    } else {\n      scheduler = immediateScheduler;\n    }\n    for(var args = [], i = start, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableConcat.apply(null, [observableFromArray(args, scheduler), this]);\n  };\n\n  var TakeLastObserver = (function (__super__) {\n    inherits(TakeLastObserver, __super__);\n    function TakeLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastObserver.prototype.completed = function () {\n      while (this._q.length > 0) { this._o.onNext(this._q.shift()); }\n      this._o.onCompleted();\n    };\n\n    return TakeLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns a specified number of contiguous elements from the end of an observable sequence.\n   * @description\n   *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n   *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastObserver(o, count));\n    }, source);\n  };\n\n  var TakeLastBufferObserver = (function (__super__) {\n    inherits(TakeLastBufferObserver, __super__);\n    function TakeLastBufferObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastBufferObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastBufferObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastBufferObserver.prototype.completed = function () {\n      this._o.onNext(this._q);\n      this._o.onCompleted();\n    };\n\n    return TakeLastBufferObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n   *\n   * @description\n   *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n   *  source sequence, this buffer is produced on the result sequence.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLastBuffer = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastBufferObserver(o, count));\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n   * @param {Number} count Length of each window.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithCount = observableProto.windowCount = function (count, skip) {\n    var source = this;\n    +count || (count = 0);\n    Math.abs(count) === Infinity && (count = 0);\n    if (count <= 0) { throw new ArgumentOutOfRangeError(); }\n    skip == null && (skip = count);\n    +skip || (skip = 0);\n    Math.abs(skip) === Infinity && (skip = 0);\n\n    if (skip <= 0) { throw new ArgumentOutOfRangeError(); }\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(),\n        refCountDisposable = new RefCountDisposable(m),\n        n = 0,\n        q = [];\n\n      function createWindow () {\n        var s = new Subject();\n        q.push(s);\n        observer.onNext(addRef(s, refCountDisposable));\n      }\n\n      createWindow();\n\n      m.setDisposable(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n          var c = n - count + 1;\n          c >= 0 && c % skip === 0 && q.shift().onCompleted();\n          ++n % skip === 0 && createWindow();\n        },\n        function (e) {\n          while (q.length > 0) { q.shift().onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          while (q.length > 0) { q.shift().onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\nobservableProto.flatMapConcat = observableProto.concatMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).merge(1);\n};\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.concatMapObserver = observableProto.selectConcatObserver = function(onNext, onError, onCompleted, thisArg) {\n    var source = this,\n        onNextFunc = bindCallback(onNext, thisArg, 2),\n        onErrorFunc = bindCallback(onError, thisArg, 1),\n        onCompletedFunc = bindCallback(onCompleted, thisArg, 0);\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNextFunc(x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onErrorFunc(err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompletedFunc();\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, this).concatAll();\n  };\n\n  var DefaultIfEmptyObserver = (function (__super__) {\n    inherits(DefaultIfEmptyObserver, __super__);\n    function DefaultIfEmptyObserver(o, d) {\n      this._o = o;\n      this._d = d;\n      this._f = false;\n      __super__.call(this);\n    }\n\n    DefaultIfEmptyObserver.prototype.next = function (x) {\n      this._f = true;\n      this._o.onNext(x);\n    };\n\n    DefaultIfEmptyObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    DefaultIfEmptyObserver.prototype.completed = function () {\n      !this._f && this._o.onNext(this._d);\n      this._o.onCompleted();\n    };\n\n    return DefaultIfEmptyObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n   *\n   *  var res = obs = xs.defaultIfEmpty();\n   *  2 - obs = xs.defaultIfEmpty(false);\n   *\n   * @memberOf Observable#\n   * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n   * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n   */\n    observableProto.defaultIfEmpty = function (defaultValue) {\n      var source = this;\n      defaultValue === undefined && (defaultValue = null);\n      return new AnonymousObservable(function (o) {\n        return source.subscribe(new DefaultIfEmptyObserver(o, defaultValue));\n      }, source);\n    };\n\n  // Swap out for Array.findIndex\n  function arrayIndexOfComparer(array, item, comparer) {\n    for (var i = 0, len = array.length; i < len; i++) {\n      if (comparer(array[i], item)) { return i; }\n    }\n    return -1;\n  }\n\n  function HashSet(comparer) {\n    this.comparer = comparer;\n    this.set = [];\n  }\n  HashSet.prototype.push = function(value) {\n    var retValue = arrayIndexOfComparer(this.set, value, this.comparer) === -1;\n    retValue && this.set.push(value);\n    return retValue;\n  };\n\n  var DistinctObservable = (function (__super__) {\n    inherits(DistinctObservable, __super__);\n    function DistinctObservable(source, keyFn, cmpFn) {\n      this.source = source;\n      this._keyFn = keyFn;\n      this._cmpFn = cmpFn;\n      __super__.call(this);\n    }\n\n    DistinctObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctObserver(o, this._keyFn, this._cmpFn));\n    };\n\n    return DistinctObservable;\n  }(ObservableBase));\n\n  var DistinctObserver = (function (__super__) {\n    inherits(DistinctObserver, __super__);\n    function DistinctObserver(o, keyFn, cmpFn) {\n      this._o = o;\n      this._keyFn = keyFn;\n      this._h = new HashSet(cmpFn);\n      __super__.call(this);\n    }\n\n    DistinctObserver.prototype.next = function (x) {\n      var key = x;\n      if (isFunction(this._keyFn)) {\n        key = tryCatch(this._keyFn)(x);\n        if (key === errorObj) { return this._o.onError(key.e); }\n      }\n      this._h.push(key) && this._o.onNext(x);\n    };\n\n    DistinctObserver.prototype.error = function (e) { this._o.onError(e); };\n    DistinctObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DistinctObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n   *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n   *\n   * @example\n   *  var res = obs = xs.distinct();\n   *  2 - obs = xs.distinct(function (x) { return x.id; });\n   *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n   * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n   * @param {Function} [comparer]  Used to compare items in the collection.\n   * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinct = function (keySelector, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctObservable(this, keySelector, comparer);\n  };\n\n  /**\n   *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n   *\n   * @example\n   *  var res = observable.groupBy(function (x) { return x.id; });\n   *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n   *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n   * @param {Function} keySelector A function to extract the key for each element.\n   * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n   * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n   */\n  observableProto.groupBy = function (keySelector, elementSelector) {\n    return this.groupByUntil(keySelector, elementSelector, observableNever);\n  };\n\n    /**\n     *  Groups the elements of an observable sequence according to a specified key selector function.\n     *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n     *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n     *\n     * @example\n     *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n     *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n     *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n     * @param {Function} keySelector A function to extract the key for each element.\n     * @param {Function} durationSelector A function to signal the expiration of a group.\n     * @returns {Observable}\n     *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n     *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n     *\n     */\n    observableProto.groupByUntil = function (keySelector, elementSelector, durationSelector) {\n      var source = this;\n      return new AnonymousObservable(function (o) {\n        var map = new Map(),\n          groupDisposable = new CompositeDisposable(),\n          refCountDisposable = new RefCountDisposable(groupDisposable),\n          handleError = function (e) { return function (item) { item.onError(e); }; };\n\n        groupDisposable.add(\n          source.subscribe(function (x) {\n            var key = tryCatch(keySelector)(x);\n            if (key === errorObj) {\n              map.forEach(handleError(key.e));\n              return o.onError(key.e);\n            }\n\n            var fireNewMapEntry = false, writer = map.get(key);\n            if (writer === undefined) {\n              writer = new Subject();\n              map.set(key, writer);\n              fireNewMapEntry = true;\n            }\n\n            if (fireNewMapEntry) {\n              var group = new GroupedObservable(key, writer, refCountDisposable),\n                durationGroup = new GroupedObservable(key, writer);\n              var duration = tryCatch(durationSelector)(durationGroup);\n              if (duration === errorObj) {\n                map.forEach(handleError(duration.e));\n                return o.onError(duration.e);\n              }\n\n              o.onNext(group);\n\n              var md = new SingleAssignmentDisposable();\n              groupDisposable.add(md);\n\n              md.setDisposable(duration.take(1).subscribe(\n                noop,\n                function (e) {\n                  map.forEach(handleError(e));\n                  o.onError(e);\n                },\n                function () {\n                  if (map['delete'](key)) { writer.onCompleted(); }\n                  groupDisposable.remove(md);\n                }));\n            }\n\n            var element = x;\n            if (isFunction(elementSelector)) {\n              element = tryCatch(elementSelector)(x);\n              if (element === errorObj) {\n                map.forEach(handleError(element.e));\n                return o.onError(element.e);\n              }\n            }\n\n            writer.onNext(element);\n        }, function (e) {\n          map.forEach(handleError(e));\n          o.onError(e);\n        }, function () {\n          map.forEach(function (item) { item.onCompleted(); });\n          o.onCompleted();\n        }));\n\n      return refCountDisposable;\n    }, source);\n  };\n\n  var MapObservable = (function (__super__) {\n    inherits(MapObservable, __super__);\n\n    function MapObservable(source, selector, thisArg) {\n      this.source = source;\n      this.selector = bindCallback(selector, thisArg, 3);\n      __super__.call(this);\n    }\n\n    function innerMap(selector, self) {\n      return function (x, i, o) { return selector.call(this, self.selector(x, i, o), i, o); };\n    }\n\n    MapObservable.prototype.internalMap = function (selector, thisArg) {\n      return new MapObservable(this.source, innerMap(selector, this), thisArg);\n    };\n\n    MapObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, selector, source) {\n      this.o = o;\n      this.selector = selector;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var result = tryCatch(this.selector)(x, this.i++, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n      this.o.onNext(result);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return MapObservable;\n\n  }(ObservableBase));\n\n  /**\n  * Projects each element of an observable sequence into a new form by incorporating the element's index.\n  * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n  */\n  observableProto.map = observableProto.select = function (selector, thisArg) {\n    var selectorFn = typeof selector === 'function' ? selector : function () { return selector; };\n    return this instanceof MapObservable ?\n      this.internalMap(selectorFn, thisArg) :\n      new MapObservable(this, selectorFn, thisArg);\n  };\n\n  function plucker(args, len) {\n    return function mapper(x) {\n      var currentProp = x;\n      for (var i = 0; i < len; i++) {\n        var p = currentProp[args[i]];\n        if (typeof p !== 'undefined') {\n          currentProp = p;\n        } else {\n          return undefined;\n        }\n      }\n      return currentProp;\n    };\n  }\n\n  /**\n   * Retrieves the value of a specified nested property from all elements in\n   * the Observable sequence.\n   * @param {Arguments} arguments The nested properties to pluck.\n   * @returns {Observable} Returns a new Observable sequence of property values.\n   */\n  observableProto.pluck = function () {\n    var len = arguments.length, args = new Array(len);\n    if (len === 0) { throw new Error('List of properties cannot be empty.'); }\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return this.map(plucker(args, len));\n  };\n\nobservableProto.flatMap = observableProto.selectMany = observableProto.mergeMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).mergeAll();\n};\n\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.flatMapObserver = observableProto.selectManyObserver = function (onNext, onError, onCompleted, thisArg) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNext.call(thisArg, x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onError.call(thisArg, err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompleted.call(thisArg);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, source).mergeAll();\n  };\n\nobservableProto.flatMapLatest = observableProto.switchMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).switchLatest();\n};\n\n  var SkipObservable = (function(__super__) {\n    inherits(SkipObservable, __super__);\n    function SkipObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    SkipObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipObserver(o, this._count));\n    };\n\n    function SkipObserver(o, c) {\n      this._o = o;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(SkipObserver, AbstractObserver);\n\n    SkipObserver.prototype.next = function (x) {\n      if (this._r <= 0) {\n        this._o.onNext(x);\n      } else {\n        this._r--;\n      }\n    };\n    SkipObserver.prototype.error = function(e) { this._o.onError(e); };\n    SkipObserver.prototype.completed = function() { this._o.onCompleted(); };\n\n    return SkipObservable;\n  }(ObservableBase));\n\n  /**\n   * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n   * @param {Number} count The number of elements to skip before returning the remaining elements.\n   * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n   */\n  observableProto.skip = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipObservable(this, count);\n  };\n\n  var SkipWhileObservable = (function (__super__) {\n    inherits(SkipWhileObservable, __super__);\n    function SkipWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SkipWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipWhileObserver(o, this));\n    };\n\n    return SkipWhileObservable;\n  }(ObservableBase));\n\n  var SkipWhileObserver = (function (__super__) {\n    inherits(SkipWhileObserver, __super__);\n\n    function SkipWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = false;\n      __super__.call(this);\n    }\n\n    SkipWhileObserver.prototype.next = function (x) {\n      if (!this._r) {\n        var res = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._r = !res;\n      }\n      this._r && this._o.onNext(x);\n    };\n    SkipWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n   *  The element's index is used in the logic of the predicate function.\n   *\n   *  var res = source.skipWhile(function (value) { return value < 10; });\n   *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n   */\n  observableProto.skipWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new SkipWhileObservable(this, fn);\n  };\n\n  var TakeObservable = (function(__super__) {\n    inherits(TakeObservable, __super__);\n    function TakeObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    TakeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeObserver(o, this._count));\n    };\n\n    function TakeObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(TakeObserver, AbstractObserver);\n\n    TakeObserver.prototype.next = function (x) {\n      if (this._r-- > 0) {\n        this._o.onNext(x);\n        this._r <= 0 && this._o.onCompleted();\n      }\n    };\n\n    TakeObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n   * @param {Number} count The number of elements to return.\n   * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n   * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n   */\n  observableProto.take = function (count, scheduler) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    if (count === 0) { return observableEmpty(scheduler); }\n    return new TakeObservable(this, count);\n  };\n\n  var TakeWhileObservable = (function (__super__) {\n    inherits(TakeWhileObservable, __super__);\n    function TakeWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    TakeWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeWhileObserver(o, this));\n    };\n\n    return TakeWhileObservable;\n  }(ObservableBase));\n\n  var TakeWhileObserver = (function (__super__) {\n    inherits(TakeWhileObserver, __super__);\n\n    function TakeWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = true;\n      __super__.call(this);\n    }\n\n    TakeWhileObserver.prototype.next = function (x) {\n      if (this._r) {\n        this._r = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (this._r === errorObj) { return this._o.onError(this._r.e); }\n      }\n      if (this._r) {\n        this._o.onNext(x);\n      } else {\n        this._o.onCompleted();\n      }\n    };\n    TakeWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns elements from an observable sequence as long as a specified condition is true.\n   *  The element's index is used in the logic of the predicate function.\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n   */\n  observableProto.takeWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new TakeWhileObservable(this, fn);\n  };\n\n  var FilterObservable = (function (__super__) {\n    inherits(FilterObservable, __super__);\n\n    function FilterObservable(source, predicate, thisArg) {\n      this.source = source;\n      this.predicate = bindCallback(predicate, thisArg, 3);\n      __super__.call(this);\n    }\n\n    FilterObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.predicate, this));\n    };\n\n    function innerPredicate(predicate, self) {\n      return function(x, i, o) { return self.predicate(x, i, o) && predicate.call(this, x, i, o); }\n    }\n\n    FilterObservable.prototype.internalFilter = function(predicate, thisArg) {\n      return new FilterObservable(this.source, innerPredicate(predicate, this), thisArg);\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, predicate, source) {\n      this.o = o;\n      this.predicate = predicate;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var shouldYield = tryCatch(this.predicate)(x, this.i++, this.source);\n      if (shouldYield === errorObj) {\n        return this.o.onError(shouldYield.e);\n      }\n      shouldYield && this.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return FilterObservable;\n\n  }(ObservableBase));\n\n  /**\n  *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n  * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n  */\n  observableProto.filter = observableProto.where = function (predicate, thisArg) {\n    return this instanceof FilterObservable ? this.internalFilter(predicate, thisArg) :\n      new FilterObservable(this, predicate, thisArg);\n  };\n\n  var ExtremaByObservable = (function (__super__) {\n    inherits(ExtremaByObservable, __super__);\n    function ExtremaByObservable(source, k, c) {\n      this.source = source;\n      this._k = k;\n      this._c = c;\n      __super__.call(this);\n    }\n\n    ExtremaByObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ExtremaByObserver(o, this._k, this._c));\n    };\n\n    return ExtremaByObservable;\n  }(ObservableBase));\n\n  var ExtremaByObserver = (function (__super__) {\n    inherits(ExtremaByObserver, __super__);\n    function ExtremaByObserver(o, k, c) {\n      this._o = o;\n      this._k = k;\n      this._c = c;\n      this._v = null;\n      this._hv = false;\n      this._l = [];\n      __super__.call(this);\n    }\n\n    ExtremaByObserver.prototype.next = function (x) {\n      var key = tryCatch(this._k)(x);\n      if (key === errorObj) { return this._o.onError(key.e); }\n      var comparison = 0;\n      if (!this._hv) {\n        this._hv = true;\n        this._v = key;\n      } else {\n        comparison = tryCatch(this._c)(key, this._v);\n        if (comparison === errorObj) { return this._o.onError(comparison.e); }\n      }\n      if (comparison > 0) {\n        this._v = key;\n        this._l = [];\n      }\n      if (comparison >= 0) { this._l.push(x); }\n    };\n\n    ExtremaByObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ExtremaByObserver.prototype.completed = function () {\n      this._o.onNext(this._l);\n      this._o.onCompleted();\n    };\n\n    return ExtremaByObserver;\n  }(AbstractObserver));\n\n  function firstOnly(x) {\n    if (x.length === 0) { throw new EmptyError(); }\n    return x[0];\n  }\n\n  var ReduceObservable = (function(__super__) {\n    inherits(ReduceObservable, __super__);\n    function ReduceObservable(source, accumulator, hasSeed, seed) {\n      this.source = source;\n      this.accumulator = accumulator;\n      this.hasSeed = hasSeed;\n      this.seed = seed;\n      __super__.call(this);\n    }\n\n    ReduceObservable.prototype.subscribeCore = function(observer) {\n      return this.source.subscribe(new ReduceObserver(observer,this));\n    };\n\n    return ReduceObservable;\n  }(ObservableBase));\n\n  var ReduceObserver = (function (__super__) {\n    inherits(ReduceObserver, __super__);\n    function ReduceObserver(o, parent) {\n      this._o = o;\n      this._p = parent;\n      this._fn = parent.accumulator;\n      this._hs = parent.hasSeed;\n      this._s = parent.seed;\n      this._ha = false;\n      this._a = null;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    ReduceObserver.prototype.next = function (x) {\n      !this._hv && (this._hv = true);\n      if (this._ha) {\n        this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n      } else {\n        this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n        this._ha = true;\n      }\n      if (this._a === errorObj) { return this._o.onError(this._a.e); }\n      this._i++;\n    };\n\n    ReduceObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ReduceObserver.prototype.completed = function () {\n      this._hv && this._o.onNext(this._a);\n      !this._hv && this._hs && this._o.onNext(this._s);\n      !this._hv && !this._hs && this._o.onError(new EmptyError());\n      this._o.onCompleted();\n    };\n\n    return ReduceObserver;\n  }(AbstractObserver));\n\n  /**\n  * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n  * For aggregation behavior with incremental intermediate results, see Observable.scan.\n  * @param {Function} accumulator An accumulator function to be invoked on each element.\n  * @param {Any} [seed] The initial accumulator value.\n  * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n  */\n  observableProto.reduce = function () {\n    var hasSeed = false, seed, accumulator = arguments[0];\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new ReduceObservable(this, accumulator, hasSeed, seed);\n  };\n\n  var SomeObservable = (function (__super__) {\n    inherits(SomeObservable, __super__);\n    function SomeObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SomeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SomeObserver(o, this._fn, this.source));\n    };\n\n    return SomeObservable;\n  }(ObservableBase));\n\n  var SomeObserver = (function (__super__) {\n    inherits(SomeObserver, __super__);\n\n    function SomeObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    SomeObserver.prototype.next = function (x) {\n      var result = tryCatch(this._fn)(x, this._i++, this._s);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      if (Boolean(result)) {\n        this._o.onNext(true);\n        this._o.onCompleted();\n      }\n    };\n    SomeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SomeObserver.prototype.completed = function () {\n      this._o.onNext(false);\n      this._o.onCompleted();\n    };\n\n    return SomeObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether any element of an observable sequence satisfies a condition if present, else if any items are in the sequence.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @returns {Observable} An observable sequence containing a single element determining whether any elements in the source sequence pass the test in the specified predicate if given, else if any items are in the sequence.\n   */\n  observableProto.some = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new SomeObservable(this, fn);\n  };\n\n  var IsEmptyObservable = (function (__super__) {\n    inherits(IsEmptyObservable, __super__);\n    function IsEmptyObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    IsEmptyObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new IsEmptyObserver(o));\n    };\n\n    return IsEmptyObservable;\n  }(ObservableBase));\n\n  var IsEmptyObserver = (function(__super__) {\n    inherits(IsEmptyObserver, __super__);\n    function IsEmptyObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    IsEmptyObserver.prototype.next = function () {\n      this._o.onNext(false);\n      this._o.onCompleted();\n    };\n    IsEmptyObserver.prototype.error = function (e) { this._o.onError(e); };\n    IsEmptyObserver.prototype.completed = function () {\n      this._o.onNext(true);\n      this._o.onCompleted();\n    };\n\n    return IsEmptyObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether an observable sequence is empty.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence is empty.\n   */\n  observableProto.isEmpty = function () {\n    return new IsEmptyObservable(this);\n  };\n\n  var EveryObservable = (function (__super__) {\n    inherits(EveryObservable, __super__);\n    function EveryObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    EveryObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new EveryObserver(o, this._fn, this.source));\n    };\n\n    return EveryObservable;\n  }(ObservableBase));\n\n  var EveryObserver = (function (__super__) {\n    inherits(EveryObserver, __super__);\n\n    function EveryObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    EveryObserver.prototype.next = function (x) {\n      var result = tryCatch(this._fn)(x, this._i++, this._s);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      if (!Boolean(result)) {\n        this._o.onNext(false);\n        this._o.onCompleted();\n      }\n    };\n    EveryObserver.prototype.error = function (e) { this._o.onError(e); };\n    EveryObserver.prototype.completed = function () {\n      this._o.onNext(true);\n      this._o.onCompleted();\n    };\n\n    return EveryObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether all elements of an observable sequence satisfy a condition.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element determining whether all elements in the source sequence pass the test in the specified predicate.\n   */\n  observableProto.every = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new EveryObservable(this, fn);\n  };\n\n  var IncludesObservable = (function (__super__) {\n    inherits(IncludesObservable, __super__);\n    function IncludesObservable(source, elem, idx) {\n      var n = +idx || 0;\n      Math.abs(n) === Infinity && (n = 0);\n\n      this.source = source;\n      this._elem = elem;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    IncludesObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(false);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new IncludesObserver(o, this._elem, this._n));\n    };\n\n    return IncludesObservable;\n  }(ObservableBase));\n\n  var IncludesObserver = (function (__super__) {\n    inherits(IncludesObserver, __super__);\n    function IncludesObserver(o, elem, n) {\n      this._o = o;\n      this._elem = elem;\n      this._n = n;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    function comparer(a, b) {\n      return (a === 0 && b === 0) || (a === b || (isNaN(a) && isNaN(b)));\n    }\n\n    IncludesObserver.prototype.next = function (x) {\n      if (this._i++ >= this._n && comparer(x, this._elem)) {\n        this._o.onNext(true);\n        this._o.onCompleted();\n      }\n    };\n    IncludesObserver.prototype.error = function (e) { this._o.onError(e); };\n    IncludesObserver.prototype.completed = function () { this._o.onNext(false); this._o.onCompleted(); };\n\n    return IncludesObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether an observable sequence includes a specified element with an optional equality comparer.\n   * @param searchElement The value to locate in the source sequence.\n   * @param {Number} [fromIndex] An equality comparer to compare elements.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence includes an element that has the specified value from the given index.\n   */\n  observableProto.includes = function (searchElement, fromIndex) {\n    return new IncludesObservable(this, searchElement, fromIndex);\n  };\n\n  var CountObservable = (function (__super__) {\n    inherits(CountObservable, __super__);\n    function CountObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CountObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new CountObserver(o, this._fn, this.source));\n    };\n\n    return CountObservable;\n  }(ObservableBase));\n\n  var CountObserver = (function (__super__) {\n    inherits(CountObserver, __super__);\n\n    function CountObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      this._c = 0;\n      __super__.call(this);\n    }\n\n    CountObserver.prototype.next = function (x) {\n      if (this._fn) {\n        var result = tryCatch(this._fn)(x, this._i++, this._s);\n        if (result === errorObj) { return this._o.onError(result.e); }\n        Boolean(result) && (this._c++);\n      } else {\n        this._c++;\n      }\n    };\n    CountObserver.prototype.error = function (e) { this._o.onError(e); };\n    CountObserver.prototype.completed = function () {\n      this._o.onNext(this._c);\n      this._o.onCompleted();\n    };\n\n    return CountObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns an observable sequence containing a value that represents how many elements in the specified observable sequence satisfy a condition if provided, else the count of items.\n   * @example\n   * res = source.count();\n   * res = source.count(function (x) { return x > 3; });\n   * @param {Function} [predicate]A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with a number that represents how many elements in the input sequence satisfy the condition in the predicate function if provided, else the count of items in the sequence.\n   */\n  observableProto.count = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new CountObservable(this, fn);\n  };\n\n  var IndexOfObservable = (function (__super__) {\n    inherits(IndexOfObservable, __super__);\n    function IndexOfObservable(source, e, n) {\n      this.source = source;\n      this._e = e;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    IndexOfObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(-1);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new IndexOfObserver(o, this._e, this._n));\n    };\n\n    return IndexOfObservable;\n  }(ObservableBase));\n\n  var IndexOfObserver = (function (__super__) {\n    inherits(IndexOfObserver, __super__);\n    function IndexOfObserver(o, e, n) {\n      this._o = o;\n      this._e = e;\n      this._n = n;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    IndexOfObserver.prototype.next = function (x) {\n      if (this._i >= this._n && x === this._e) {\n        this._o.onNext(this._i);\n        this._o.onCompleted();\n      }\n      this._i++;\n    };\n    IndexOfObserver.prototype.error = function (e) { this._o.onError(e); };\n    IndexOfObserver.prototype.completed = function () { this._o.onNext(-1); this._o.onCompleted(); };\n\n    return IndexOfObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   * @param {Any} searchElement Element to locate in the array.\n   * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n   * @returns {Observable} And observable sequence containing the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   */\n  observableProto.indexOf = function(searchElement, fromIndex) {\n    var n = +fromIndex || 0;\n    Math.abs(n) === Infinity && (n = 0);\n    return new IndexOfObservable(this, searchElement, n);\n  };\n\n  var SumObservable = (function (__super__) {\n    inherits(SumObservable, __super__);\n    function SumObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SumObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SumObserver(o, this._fn, this.source));\n    };\n\n    return SumObservable;\n  }(ObservableBase));\n\n  var SumObserver = (function (__super__) {\n    inherits(SumObserver, __super__);\n\n    function SumObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      this._c = 0;\n      __super__.call(this);\n    }\n\n    SumObserver.prototype.next = function (x) {\n      if (this._fn) {\n        var result = tryCatch(this._fn)(x, this._i++, this._s);\n        if (result === errorObj) { return this._o.onError(result.e); }\n        this._c += result;\n      } else {\n        this._c += x;\n      }\n    };\n    SumObserver.prototype.error = function (e) { this._o.onError(e); };\n    SumObserver.prototype.completed = function () {\n      this._o.onNext(this._c);\n      this._o.onCompleted();\n    };\n\n    return SumObserver;\n  }(AbstractObserver));\n\n  /**\n   * Computes the sum of a sequence of values that are obtained by invoking an optional transform function on each element of the input sequence, else if not specified computes the sum on each item in the sequence.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the sum of the values in the source sequence.\n   */\n  observableProto.sum = function (keySelector, thisArg) {\n    var fn = bindCallback(keySelector, thisArg, 3);\n    return new SumObservable(this, fn);\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n   * @example\n   * var res = source.minBy(function (x) { return x.value; });\n   * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer] Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n   */\n  observableProto.minBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return new ExtremaByObservable(this, keySelector, function (x, y) { return comparer(x, y) * -1; });\n  };\n\n  /**\n   * Returns the minimum element in an observable sequence according to the optional comparer else a default greater than less than check.\n   * @example\n   * var res = source.min();\n   * var res = source.min(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the minimum element in the source sequence.\n   */\n  observableProto.min = function (comparer) {\n    return this.minBy(identity, comparer).map(firstOnly);\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n   * @example\n   * var res = source.maxBy(function (x) { return x.value; });\n   * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer]  Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n   */\n  observableProto.maxBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return new ExtremaByObservable(this, keySelector, comparer);\n  };\n\n  /**\n   * Returns the maximum value in an observable sequence according to the specified comparer.\n   * @example\n   * var res = source.max();\n   * var res = source.max(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the maximum element in the source sequence.\n   */\n  observableProto.max = function (comparer) {\n    return this.maxBy(identity, comparer).map(firstOnly);\n  };\n\n  var AverageObservable = (function (__super__) {\n    inherits(AverageObservable, __super__);\n    function AverageObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    AverageObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new AverageObserver(o, this._fn, this.source));\n    };\n\n    return AverageObservable;\n  }(ObservableBase));\n\n  var AverageObserver = (function(__super__) {\n    inherits(AverageObserver, __super__);\n    function AverageObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._c = 0;\n      this._t = 0;\n      __super__.call(this);\n    }\n\n    AverageObserver.prototype.next = function (x) {\n      if(this._fn) {\n        var r = tryCatch(this._fn)(x, this._c++, this._s);\n        if (r === errorObj) { return this._o.onError(r.e); }\n        this._t += r;\n      } else {\n        this._c++;\n        this._t += x;\n      }\n    };\n    AverageObserver.prototype.error = function (e) { this._o.onError(e); };\n    AverageObserver.prototype.completed = function () {\n      if (this._c === 0) { return this._o.onError(new EmptyError()); }\n      this._o.onNext(this._t / this._c);\n      this._o.onCompleted();\n    };\n\n    return AverageObserver;\n  }(AbstractObserver));\n\n  /**\n   * Computes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the average of the sequence of values.\n   */\n  observableProto.average = function (keySelector, thisArg) {\n    var source = this, fn;\n    if (isFunction(keySelector)) {\n      fn = bindCallback(keySelector, thisArg, 3);\n    }\n    return new AverageObservable(source, fn);\n  };\n\n  /**\n   *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n   *\n   * @example\n   * var res = res = source.sequenceEqual([1,2,3]);\n   * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n   * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n   * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n   * @param {Observable} second Second observable sequence or array to compare.\n   * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n   * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n   */\n  observableProto.sequenceEqual = function (second, comparer) {\n    var first = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var donel = false, doner = false, ql = [], qr = [];\n      var subscription1 = first.subscribe(function (x) {\n        if (qr.length > 0) {\n          var v = qr.shift();\n          var equal = tryCatch(comparer)(v, x);\n          if (equal === errorObj) { return o.onError(equal.e); }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (doner) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          ql.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        donel = true;\n        if (ql.length === 0) {\n          if (qr.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (doner) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n\n      (isArrayLike(second) || isIterable(second)) && (second = observableFrom(second));\n      isPromise(second) && (second = observableFromPromise(second));\n      var subscription2 = second.subscribe(function (x) {\n        if (ql.length > 0) {\n          var v = ql.shift();\n          var equal = tryCatch(comparer)(v, x);\n          if (equal === errorObj) { return o.onError(equal.e); }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (donel) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          qr.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        doner = true;\n        if (qr.length === 0) {\n          if (ql.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (donel) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n      return new BinaryDisposable(subscription1, subscription2);\n    }, first);\n  };\n\n  var ElementAtObservable = (function (__super__) {\n    inherits(ElementAtObservable, __super__);\n    function ElementAtObservable(source, i, d) {\n      this.source = source;\n      this._i = i;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    ElementAtObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ElementAtObserver(o, this._i, this._d));\n    };\n\n    return ElementAtObservable;\n  }(ObservableBase));\n\n  var ElementAtObserver = (function (__super__) {\n    inherits(ElementAtObserver, __super__);\n\n    function ElementAtObserver(o, i, d) {\n      this._o = o;\n      this._i = i;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    ElementAtObserver.prototype.next = function (x) {\n      if (this._i-- === 0) {\n        this._o.onNext(x);\n        this._o.onCompleted();\n      }\n    };\n    ElementAtObserver.prototype.error = function (e) { this._o.onError(e); };\n    ElementAtObserver.prototype.completed = function () {\n      if (this._d === undefined) {\n        this._o.onError(new ArgumentOutOfRangeError());\n      } else {\n        this._o.onNext(this._d);\n        this._o.onCompleted();\n      }\n    };\n\n    return ElementAtObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the element at a specified index in a sequence or default value if not found.\n   * @param {Number} index The zero-based index of the element to retrieve.\n   * @param {Any} [defaultValue] The default value to use if elementAt does not find a value.\n   * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence.\n   */\n  observableProto.elementAt =  function (index, defaultValue) {\n    if (index < 0) { throw new ArgumentOutOfRangeError(); }\n    return new ElementAtObservable(this, index, defaultValue);\n  };\n\n  var SingleObserver = (function(__super__) {\n    inherits(SingleObserver, __super__);\n    function SingleObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      this._hv = false;\n      this._v = null;\n      __super__.call(this);\n    }\n\n    SingleObserver.prototype.next = function (x) {\n      var shouldYield = false;\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        Boolean(res) && (shouldYield = true);\n      } else if (!this._obj.predicate) {\n        shouldYield = true;\n      }\n      if (shouldYield) {\n        if (this._hv) {\n          return this._o.onError(new Error('Sequence contains more than one matching element'));\n        }\n        this._hv = true;\n        this._v = x;\n      }\n    };\n    SingleObserver.prototype.error = function (e) { this._o.onError(e); };\n    SingleObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n        this._o.onCompleted();\n      }\n      else if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return SingleObserver;\n  }(AbstractObserver));\n\n\n    /**\n     * Returns the only element of an observable sequence that satisfies the condition in the optional predicate, and reports an exception if there is not exactly one element in the observable sequence.\n     * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate.\n     */\n    observableProto.single = function (predicate, thisArg) {\n      var obj = {}, source = this;\n      if (typeof arguments[0] === 'object') {\n        obj = arguments[0];\n      } else {\n        obj = {\n          predicate: arguments[0],\n          thisArg: arguments[1],\n          defaultValue: arguments[2]\n        };\n      }\n      if (isFunction (obj.predicate)) {\n        var fn = obj.predicate;\n        obj.predicate = bindCallback(fn, obj.thisArg, 3);\n      }\n      return new AnonymousObservable(function (o) {\n        return source.subscribe(new SingleObserver(o, obj, source));\n      }, source);\n    };\n\n  var FirstObservable = (function (__super__) {\n    inherits(FirstObservable, __super__);\n    function FirstObservable(source, obj) {\n      this.source = source;\n      this._obj = obj;\n      __super__.call(this);\n    }\n\n    FirstObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new FirstObserver(o, this._obj, this.source));\n    };\n\n    return FirstObservable;\n  }(ObservableBase));\n\n  var FirstObserver = (function(__super__) {\n    inherits(FirstObserver, __super__);\n    function FirstObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    FirstObserver.prototype.next = function (x) {\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        if (Boolean(res)) {\n          this._o.onNext(x);\n          this._o.onCompleted();\n        }\n      } else if (!this._obj.predicate) {\n        this._o.onNext(x);\n        this._o.onCompleted();\n      }\n    };\n    FirstObserver.prototype.error = function (e) { this._o.onError(e); };\n    FirstObserver.prototype.completed = function () {\n      if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return FirstObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the first element of an observable sequence that satisfies the condition in the predicate if present else the first item in the sequence.\n   * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate if provided, else the first item in the sequence.\n   */\n  observableProto.first = function () {\n    var obj = {}, source = this;\n    if (typeof arguments[0] === 'object') {\n      obj = arguments[0];\n    } else {\n      obj = {\n        predicate: arguments[0],\n        thisArg: arguments[1],\n        defaultValue: arguments[2]\n      };\n    }\n    if (isFunction (obj.predicate)) {\n      var fn = obj.predicate;\n      obj.predicate = bindCallback(fn, obj.thisArg, 3);\n    }\n    return new FirstObservable(this, obj);\n  };\n\n  var LastObservable = (function (__super__) {\n    inherits(LastObservable, __super__);\n    function LastObservable(source, obj) {\n      this.source = source;\n      this._obj = obj;\n      __super__.call(this);\n    }\n\n    LastObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new LastObserver(o, this._obj, this.source));\n    };\n\n    return LastObservable;\n  }(ObservableBase));\n\n  var LastObserver = (function(__super__) {\n    inherits(LastObserver, __super__);\n    function LastObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      this._hv = false;\n      this._v = null;\n      __super__.call(this);\n    }\n\n    LastObserver.prototype.next = function (x) {\n      var shouldYield = false;\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        Boolean(res) && (shouldYield = true);\n      } else if (!this._obj.predicate) {\n        shouldYield = true;\n      }\n      if (shouldYield) {\n        this._hv = true;\n        this._v = x;\n      }\n    };\n    LastObserver.prototype.error = function (e) { this._o.onError(e); };\n    LastObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n        this._o.onCompleted();\n      }\n      else if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return LastObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the last element of an observable sequence that satisfies the condition in the predicate if specified, else the last element.\n   * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate.\n   */\n  observableProto.last = function () {\n    var obj = {}, source = this;\n    if (typeof arguments[0] === 'object') {\n      obj = arguments[0];\n    } else {\n      obj = {\n        predicate: arguments[0],\n        thisArg: arguments[1],\n        defaultValue: arguments[2]\n      };\n    }\n    if (isFunction (obj.predicate)) {\n      var fn = obj.predicate;\n      obj.predicate = bindCallback(fn, obj.thisArg, 3);\n    }\n    return new LastObservable(this, obj);\n  };\n\n  var FindValueObserver = (function(__super__) {\n    inherits(FindValueObserver, __super__);\n    function FindValueObserver(observer, source, callback, yieldIndex) {\n      this._o = observer;\n      this._s = source;\n      this._cb = callback;\n      this._y = yieldIndex;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    FindValueObserver.prototype.next = function (x) {\n      var shouldRun = tryCatch(this._cb)(x, this._i, this._s);\n      if (shouldRun === errorObj) { return this._o.onError(shouldRun.e); }\n      if (shouldRun) {\n        this._o.onNext(this._y ? this._i : x);\n        this._o.onCompleted();\n      } else {\n        this._i++;\n      }\n    };\n\n    FindValueObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    FindValueObserver.prototype.completed = function () {\n      this._y && this._o.onNext(-1);\n      this._o.onCompleted();\n    };\n\n    return FindValueObserver;\n  }(AbstractObserver));\n\n  function findValue (source, predicate, thisArg, yieldIndex) {\n    var callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new FindValueObserver(o, source, callback, yieldIndex));\n    }, source);\n  }\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the first element that matches the conditions defined by the specified predicate, if found; otherwise, undefined.\n   */\n  observableProto.find = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, false);\n  };\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns\n   * an Observable sequence with the zero-based index of the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the zero-based index of the first occurrence of an element that matches the conditions defined by match, if found; otherwise, –1.\n  */\n  observableProto.findIndex = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, true);\n  };\n\n  var ToSetObservable = (function (__super__) {\n    inherits(ToSetObservable, __super__);\n    function ToSetObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    ToSetObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ToSetObserver(o));\n    };\n\n    return ToSetObservable;\n  }(ObservableBase));\n\n  var ToSetObserver = (function (__super__) {\n    inherits(ToSetObserver, __super__);\n    function ToSetObserver(o) {\n      this._o = o;\n      this._s = new root.Set();\n      __super__.call(this);\n    }\n\n    ToSetObserver.prototype.next = function (x) {\n      this._s.add(x);\n    };\n\n    ToSetObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ToSetObserver.prototype.completed = function () {\n      this._o.onNext(this._s);\n      this._o.onCompleted();\n    };\n\n    return ToSetObserver;\n  }(AbstractObserver));\n\n  /**\n   * Converts the observable sequence to a Set if it exists.\n   * @returns {Observable} An observable sequence with a single value of a Set containing the values from the observable sequence.\n   */\n  observableProto.toSet = function () {\n    if (typeof root.Set === 'undefined') { throw new TypeError(); }\n    return new ToSetObservable(this);\n  };\n\n  var ToMapObservable = (function (__super__) {\n    inherits(ToMapObservable, __super__);\n    function ToMapObservable(source, k, e) {\n      this.source = source;\n      this._k = k;\n      this._e = e;\n      __super__.call(this);\n    }\n\n    ToMapObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ToMapObserver(o, this._k, this._e));\n    };\n\n    return ToMapObservable;\n  }(ObservableBase));\n\n  var ToMapObserver = (function (__super__) {\n    inherits(ToMapObserver, __super__);\n    function ToMapObserver(o, k, e) {\n      this._o = o;\n      this._k = k;\n      this._e = e;\n      this._m = new root.Map();\n      __super__.call(this);\n    }\n\n    ToMapObserver.prototype.next = function (x) {\n      var key = tryCatch(this._k)(x);\n      if (key === errorObj) { return this._o.onError(key.e); }\n      var elem = x;\n      if (this._e) {\n        elem = tryCatch(this._e)(x);\n        if (elem === errorObj) { return this._o.onError(elem.e); }\n      }\n\n      this._m.set(key, elem);\n    };\n\n    ToMapObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ToMapObserver.prototype.completed = function () {\n      this._o.onNext(this._m);\n      this._o.onCompleted();\n    };\n\n    return ToMapObserver;\n  }(AbstractObserver));\n\n  /**\n  * Converts the observable sequence to a Map if it exists.\n  * @param {Function} keySelector A function which produces the key for the Map.\n  * @param {Function} [elementSelector] An optional function which produces the element for the Map. If not present, defaults to the value from the observable sequence.\n  * @returns {Observable} An observable sequence with a single value of a Map containing the values from the observable sequence.\n  */\n  observableProto.toMap = function (keySelector, elementSelector) {\n    if (typeof root.Map === 'undefined') { throw new TypeError(); }\n    return new ToMapObservable(this, keySelector, elementSelector);\n  };\n\n  var SliceObservable = (function (__super__) {\n    inherits(SliceObservable, __super__);\n    function SliceObservable(source, b, e) {\n      this.source = source;\n      this._b = b;\n      this._e = e;\n      __super__.call(this);\n    }\n\n    SliceObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SliceObserver(o, this._b, this._e));\n    };\n\n    return SliceObservable;\n  }(ObservableBase));\n\n  var SliceObserver = (function (__super__) {\n    inherits(SliceObserver, __super__);\n\n    function SliceObserver(o, b, e) {\n      this._o = o;\n      this._b = b;\n      this._e = e;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    SliceObserver.prototype.next = function (x) {\n      if (this._i >= this._b) {\n        if (this._e === this._i) {\n          this._o.onCompleted();\n        } else {\n          this._o.onNext(x);\n        }\n      }\n      this._i++;\n    };\n    SliceObserver.prototype.error = function (e) { this._o.onError(e); };\n    SliceObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SliceObserver;\n  }(AbstractObserver));\n\n  /*\n  * The slice() method returns a shallow copy of a portion of an Observable into a new Observable object.\n  * Unlike the array version, this does not support negative numbers for being or end.\n  * @param {Number} [begin] Zero-based index at which to begin extraction. If omitted, this will default to zero.\n  * @param {Number} [end] Zero-based index at which to end extraction. slice extracts up to but not including end.\n  * If omitted, this will emit the rest of the Observable object.\n  * @returns {Observable} A shallow copy of a portion of an Observable into a new Observable object.\n  */\n  observableProto.slice = function (begin, end) {\n    var start = begin || 0;\n    if (start < 0) { throw new Rx.ArgumentOutOfRangeError(); }\n    if (typeof end === 'number' && end < start) {\n      throw new Rx.ArgumentOutOfRangeError();\n    }\n    return new SliceObservable(this, start, end);\n  };\n\n  var LastIndexOfObservable = (function (__super__) {\n    inherits(LastIndexOfObservable, __super__);\n    function LastIndexOfObservable(source, e, n) {\n      this.source = source;\n      this._e = e;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    LastIndexOfObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(-1);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new LastIndexOfObserver(o, this._e, this._n));\n    };\n\n    return LastIndexOfObservable;\n  }(ObservableBase));\n\n  var LastIndexOfObserver = (function (__super__) {\n    inherits(LastIndexOfObserver, __super__);\n    function LastIndexOfObserver(o, e, n) {\n      this._o = o;\n      this._e = e;\n      this._n = n;\n      this._v = 0;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    LastIndexOfObserver.prototype.next = function (x) {\n      if (this._i >= this._n && x === this._e) {\n        this._hv = true;\n        this._v = this._i;\n      }\n      this._i++;\n    };\n    LastIndexOfObserver.prototype.error = function (e) { this._o.onError(e); };\n    LastIndexOfObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n      } else {\n        this._o.onNext(-1);\n      }\n      this._o.onCompleted();\n    };\n\n    return LastIndexOfObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the last index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   * @param {Any} searchElement Element to locate in the array.\n   * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n   * @returns {Observable} And observable sequence containing the last index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   */\n  observableProto.lastIndexOf = function(searchElement, fromIndex) {\n    var n = +fromIndex || 0;\n    Math.abs(n) === Infinity && (n = 0);\n    return new LastIndexOfObservable(this, searchElement, n);\n  };\n\n  Observable.wrap = function (fn) {\n    function createObservable() {\n      return Observable.spawn.call(this, fn.apply(this, arguments));\n    }\n\n    createObservable.__generatorFunction__ = fn;\n    return createObservable;\n  };\n\n  var spawn = Observable.spawn = function () {\n    var gen = arguments[0], self = this, args = [];\n    for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n    return new AnonymousObservable(function (o) {\n      var g = new CompositeDisposable();\n\n      if (isFunction(gen)) { gen = gen.apply(self, args); }\n      if (!gen || !isFunction(gen.next)) {\n        o.onNext(gen);\n        return o.onCompleted();\n      }\n\n      function processGenerator(res) {\n        var ret = tryCatch(gen.next).call(gen, res);\n        if (ret === errorObj) { return o.onError(ret.e); }\n        next(ret);\n      }\n\n      processGenerator();\n\n      function onError(err) {\n        var ret = tryCatch(gen.next).call(gen, err);\n        if (ret === errorObj) { return o.onError(ret.e); }\n        next(ret);\n      }\n\n      function next(ret) {\n        if (ret.done) {\n          o.onNext(ret.value);\n          o.onCompleted();\n          return;\n        }\n        var obs = toObservable.call(self, ret.value);\n        var value = null;\n        var hasValue = false;\n        if (Observable.isObservable(obs)) {\n          g.add(obs.subscribe(function(val) {\n            hasValue = true;\n            value = val;\n          }, onError, function() {\n            hasValue && processGenerator(value);\n          }));\n        } else {\n          onError(new TypeError('type not supported'));\n        }\n      }\n\n      return g;\n    });\n  };\n\n  function toObservable(obj) {\n    if (!obj) { return obj; }\n    if (Observable.isObservable(obj)) { return obj; }\n    if (isPromise(obj)) { return Observable.fromPromise(obj); }\n    if (isGeneratorFunction(obj) || isGenerator(obj)) { return spawn.call(this, obj); }\n    if (isFunction(obj)) { return thunkToObservable.call(this, obj); }\n    if (isArrayLike(obj) || isIterable(obj)) { return arrayToObservable.call(this, obj); }\n    if (isObject(obj)) {return objectToObservable.call(this, obj);}\n    return obj;\n  }\n\n  function arrayToObservable (obj) {\n    return Observable.from(obj).concatMap(function(o) {\n      if(Observable.isObservable(o) || isObject(o)) {\n        return toObservable.call(null, o);\n      } else {\n        return Rx.Observable.just(o);\n      }\n    }).toArray();\n  }\n\n  function objectToObservable (obj) {\n    var results = new obj.constructor(), keys = Object.keys(obj), observables = [];\n    for (var i = 0, len = keys.length; i < len; i++) {\n      var key = keys[i];\n      var observable = toObservable.call(this, obj[key]);\n\n      if(observable && Observable.isObservable(observable)) {\n        defer(observable, key);\n      } else {\n        results[key] = obj[key];\n      }\n    }\n\n    return Observable.forkJoin.apply(Observable, observables).map(function() {\n      return results;\n    });\n\n\n    function defer (observable, key) {\n      results[key] = undefined;\n      observables.push(observable.map(function (next) {\n        results[key] = next;\n      }));\n    }\n  }\n\n  function thunkToObservable(fn) {\n    var self = this;\n    return new AnonymousObservable(function (o) {\n      fn.call(self, function () {\n        var err = arguments[0], res = arguments[1];\n        if (err) { return o.onError(err); }\n        if (arguments.length > 2) {\n          var args = [];\n          for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n          res = args;\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    });\n  }\n\n  function isGenerator(obj) {\n    return isFunction (obj.next) && isFunction (obj['throw']);\n  }\n\n  function isGeneratorFunction(obj) {\n    var ctor = obj.constructor;\n    if (!ctor) { return false; }\n    if (ctor.name === 'GeneratorFunction' || ctor.displayName === 'GeneratorFunction') { return true; }\n    return isGenerator(ctor.prototype);\n  }\n\n  function isObject(val) {\n    return Object == val.constructor;\n  }\n\n  /**\n   * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.\n   *\n   * @example\n   * var res = Rx.Observable.start(function () { console.log('hello'); });\n   * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout);\n   * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console);\n   *\n   * @param {Function} func Function to run asynchronously.\n   * @param {Scheduler} [scheduler]  Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param [context]  The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   *\n   * Remarks\n   * * The function is called immediately, not during the subscription of the resulting sequence.\n   * * Multiple subscriptions to the resulting sequence can observe the function's result.\n   */\n  Observable.start = function (func, context, scheduler) {\n    return observableToAsync(func, context, scheduler)();\n  };\n\n  /**\n   * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n   * @param {Function} function Function to convert to an asynchronous function.\n   * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Function} Asynchronous function.\n   */\n  var observableToAsync = Observable.toAsync = function (func, context, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return function () {\n      var args = arguments,\n        subject = new AsyncSubject();\n\n      scheduler.schedule(null, function () {\n        var result;\n        try {\n          result = func.apply(context, args);\n        } catch (e) {\n          subject.onError(e);\n          return;\n        }\n        subject.onNext(result);\n        subject.onCompleted();\n      });\n      return subject.asObservable();\n    };\n  };\n\nfunction createCbObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createCbHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createCbHandler(o, ctx, selector) {\n  return function handler () {\n    var len = arguments.length, results = new Array(len);\n    for(var i = 0; i < len; i++) { results[i] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a callback function to an observable sequence.\n *\n * @param {Function} fn Function with a callback as the last parameter to convert to an Observable sequence.\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n */\nObservable.fromCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n\n    var len = arguments.length, args = new Array(len)\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createCbObservable(fn, ctx, selector, args);\n  };\n};\n\nfunction createNodeObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createNodeHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createNodeHandler(o, ctx, selector) {\n  return function handler () {\n    var err = arguments[0];\n    if (err) { return o.onError(err); }\n\n    var len = arguments.length, results = [];\n    for(var i = 1; i < len; i++) { results[i - 1] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      var results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n * @param {Function} fn The function to call\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n */\nObservable.fromNodeCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createNodeObservable(fn, ctx, selector, args);\n  };\n};\n\n  function isNodeList(el) {\n    if (root.StaticNodeList) {\n      // IE8 Specific\n      // instanceof is slower than Object#toString, but Object#toString will not work as intended in IE8\n      return el instanceof root.StaticNodeList || el instanceof root.NodeList;\n    } else {\n      return Object.prototype.toString.call(el) === '[object NodeList]';\n    }\n  }\n\n  function ListenDisposable(e, n, fn) {\n    this._e = e;\n    this._n = n;\n    this._fn = fn;\n    this._e.addEventListener(this._n, this._fn, false);\n    this.isDisposed = false;\n  }\n  ListenDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this._e.removeEventListener(this._n, this._fn, false);\n      this.isDisposed = true;\n    }\n  };\n\n  function createEventListener (el, eventName, handler) {\n    var disposables = new CompositeDisposable();\n\n    // Asume NodeList or HTMLCollection\n    var elemToString = Object.prototype.toString.call(el);\n    if (isNodeList(el) || elemToString === '[object HTMLCollection]') {\n      for (var i = 0, len = el.length; i < len; i++) {\n        disposables.add(createEventListener(el.item(i), eventName, handler));\n      }\n    } else if (el) {\n      disposables.add(new ListenDisposable(el, eventName, handler));\n    }\n\n    return disposables;\n  }\n\n  /**\n   * Configuration option to determine whether to use native events only\n   */\n  Rx.config.useNativeEvents = false;\n\n  var EventObservable = (function(__super__) {\n    inherits(EventObservable, __super__);\n    function EventObservable(el, name, fn) {\n      this._el = el;\n      this._n = name;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventObservable.prototype.subscribeCore = function (o) {\n      return createEventListener(\n        this._el,\n        this._n,\n        createHandler(o, this._fn));\n    };\n\n    return EventObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n   * @param {Object} element The DOMElement or NodeList to attach a listener.\n   * @param {String} eventName The event name to attach the observable sequence.\n   * @param {Object} eventListenerOptions An object describing EventListenerOptions\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n   */\n  Observable.fromEvent = function (element, eventName, selector, eventListenerOptions) {\n    // Node.js specific\n    if (element.addListener) {\n      return fromEventPattern(\n        function (h) { element.addListener(eventName, h, eventListenerOptions); },\n        function (h) { element.removeListener(eventName, h, eventListenerOptions); },\n        selector);\n    }\n\n    // Use only if non-native events are allowed\n    if (!Rx.config.useNativeEvents) {\n      // Handles jq, Angular.js, Zepto, Marionette, Ember.js\n      if (typeof element.on === 'function' && typeof element.off === 'function') {\n        return fromEventPattern(\n          function (h) { element.on(eventName, h, eventListenerOptions); },\n          function (h) { element.off(eventName, h, eventListenerOptions); },\n          selector);\n      }\n    }\n\n    return new EventObservable(element, eventName, selector).publish().refCount();\n  };\n\n  var EventPatternObservable = (function(__super__) {\n    inherits(EventPatternObservable, __super__);\n    function EventPatternObservable(add, del, fn) {\n      this._add = add;\n      this._del = del;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventPatternObservable.prototype.subscribeCore = function (o) {\n      var fn = createHandler(o, this._fn);\n      var returnValue = this._add(fn);\n      return new EventPatternDisposable(this._del, fn, returnValue);\n    };\n\n    function EventPatternDisposable(del, fn, ret) {\n      this._del = del;\n      this._fn = fn;\n      this._ret = ret;\n      this.isDisposed = false;\n    }\n\n    EventPatternDisposable.prototype.dispose = function () {\n      if(!this.isDisposed) {\n        isFunction(this._del) && this._del(this._fn, this._ret);\n        this.isDisposed = true;\n      }\n    };\n\n    return EventPatternObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n   * @param {Function} addHandler The function to add a handler to the emitter.\n   * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence which wraps an event from an event emitter\n   */\n  var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) {\n    return new EventPatternObservable(addHandler, removeHandler, selector).publish().refCount();\n  };\n\n  /**\n   * Invokes the asynchronous function, surfacing the result through an observable sequence.\n   * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   */\n  Observable.startAsync = function (functionAsync) {\n    var promise = tryCatch(functionAsync)();\n    if (promise === errorObj) { return observableThrow(promise.e); }\n    return observableFromPromise(promise);\n  };\n\n  var PausableObservable = (function (__super__) {\n    inherits(PausableObservable, __super__);\n    function PausableObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableObservable.prototype._subscribe = function (o) {\n      var conn = this.source.publish(),\n        subscription = conn.subscribe(o),\n        connection = disposableEmpty;\n\n      var pausable = this.pauser.startWith(!this.paused).distinctUntilChanged().subscribe(function (b) {\n        if (b) {\n          connection = conn.connect();\n        } else {\n          connection.dispose();\n          connection = disposableEmpty;\n        }\n      });\n\n      return new NAryDisposable([subscription, connection, pausable]);\n    };\n\n    PausableObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausable(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausable = function (pauser) {\n    return new PausableObservable(this, pauser);\n  };\n\n  function combineLatestSource(source, subject, resultSelector) {\n    return new AnonymousObservable(function (o) {\n      var hasValue = [false, false],\n        hasValueAll = false,\n        isDone = false,\n        values = new Array(2),\n        err;\n\n      function next(x, i) {\n        values[i] = x;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          if (err) { return o.onError(err); }\n          var res = tryCatch(resultSelector).apply(null, values);\n          if (res === errorObj) { return o.onError(res.e); }\n          o.onNext(res);\n        }\n        isDone && values[1] && o.onCompleted();\n      }\n\n      return new BinaryDisposable(\n        source.subscribe(\n          function (x) {\n            next(x, 0);\n          },\n          function (e) {\n            if (values[1]) {\n              o.onError(e);\n            } else {\n              err = e;\n            }\n          },\n          function () {\n            isDone = true;\n            values[1] && o.onCompleted();\n          }),\n        subject.subscribe(\n          function (x) {\n            next(x, 1);\n          },\n          function (e) { o.onError(e); },\n          function () {\n            isDone = true;\n            next(true, 1);\n          })\n        );\n    }, source);\n  }\n\n  var PausableBufferedObservable = (function (__super__) {\n    inherits(PausableBufferedObservable, __super__);\n    function PausableBufferedObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableBufferedObservable.prototype._subscribe = function (o) {\n      var q = [], previousShouldFire;\n\n      function drainQueue() { while (q.length > 0) { o.onNext(q.shift()); } }\n\n      var subscription =\n        combineLatestSource(\n          this.source,\n          this.pauser.startWith(!this.paused).distinctUntilChanged(),\n          function (data, shouldFire) {\n            return { data: data, shouldFire: shouldFire };\n          })\n          .subscribe(\n            function (results) {\n              if (previousShouldFire !== undefined && results.shouldFire !== previousShouldFire) {\n                previousShouldFire = results.shouldFire;\n                // change in shouldFire\n                if (results.shouldFire) { drainQueue(); }\n              } else {\n                previousShouldFire = results.shouldFire;\n                // new data\n                if (results.shouldFire) {\n                  o.onNext(results.data);\n                } else {\n                  q.push(results.data);\n                }\n              }\n            },\n            function (err) {\n              drainQueue();\n              o.onError(err);\n            },\n            function () {\n              drainQueue();\n              o.onCompleted();\n            }\n          );\n      return subscription;      \n    };\n\n    PausableBufferedObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableBufferedObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableBufferedObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n   * and yields the values that were buffered while paused.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausableBuffered = function (pauser) {\n    return new PausableBufferedObservable(this, pauser);\n  };\n\n  var ControlledObservable = (function (__super__) {\n    inherits(ControlledObservable, __super__);\n    function ControlledObservable (source, enableQueue, scheduler) {\n      __super__.call(this);\n      this.subject = new ControlledSubject(enableQueue, scheduler);\n      this.source = source.multicast(this.subject).refCount();\n    }\n\n    ControlledObservable.prototype._subscribe = function (o) {\n      return this.source.subscribe(o);\n    };\n\n    ControlledObservable.prototype.request = function (numberOfItems) {\n      return this.subject.request(numberOfItems == null ? -1 : numberOfItems);\n    };\n\n    return ControlledObservable;\n\n  }(Observable));\n\n  var ControlledSubject = (function (__super__) {\n    inherits(ControlledSubject, __super__);\n    function ControlledSubject(enableQueue, scheduler) {\n      enableQueue == null && (enableQueue = true);\n\n      __super__.call(this);\n      this.subject = new Subject();\n      this.enableQueue = enableQueue;\n      this.queue = enableQueue ? [] : null;\n      this.requestedCount = 0;\n      this.requestedDisposable = null;\n      this.error = null;\n      this.hasFailed = false;\n      this.hasCompleted = false;\n      this.scheduler = scheduler || currentThreadScheduler;\n    }\n\n    addProperties(ControlledSubject.prototype, Observer, {\n      _subscribe: function (o) {\n        return this.subject.subscribe(o);\n      },\n      onCompleted: function () {\n        this.hasCompleted = true;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onCompleted();\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnCompleted());\n        }\n      },\n      onError: function (error) {\n        this.hasFailed = true;\n        this.error = error;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onError(error);\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnError(error));\n        }\n      },\n      onNext: function (value) {\n        if (this.requestedCount <= 0) {\n          this.enableQueue && this.queue.push(Notification.createOnNext(value));\n        } else {\n          (this.requestedCount-- === 0) && this.disposeCurrentRequest();\n          this.subject.onNext(value);\n        }\n      },\n      _processRequest: function (numberOfItems) {\n        if (this.enableQueue) {\n          while (this.queue.length > 0 && (numberOfItems > 0 || this.queue[0].kind !== 'N')) {\n            var first = this.queue.shift();\n            first.accept(this.subject);\n            if (first.kind === 'N') {\n              numberOfItems--;\n            } else {\n              this.disposeCurrentRequest();\n              this.queue = [];\n            }\n          }\n        }\n\n        return numberOfItems;\n      },\n      request: function (number) {\n        this.disposeCurrentRequest();\n        var self = this;\n\n        this.requestedDisposable = this.scheduler.schedule(number,\n        function(s, i) {\n          var remaining = self._processRequest(i);\n          var stopped = self.hasCompleted || self.hasFailed;\n          if (!stopped && remaining > 0) {\n            self.requestedCount = remaining;\n\n            return disposableCreate(function () {\n              self.requestedCount = 0;\n            });\n              // Scheduled item is still in progress. Return a new\n              // disposable to allow the request to be interrupted\n              // via dispose.\n          }\n        });\n\n        return this.requestedDisposable;\n      },\n      disposeCurrentRequest: function () {\n        if (this.requestedDisposable) {\n          this.requestedDisposable.dispose();\n          this.requestedDisposable = null;\n        }\n      }\n    });\n\n    return ControlledSubject;\n  }(Observable));\n\n  /**\n   * Attaches a controller to the observable sequence with the ability to queue.\n   * @example\n   * var source = Rx.Observable.interval(100).controlled();\n   * source.request(3); // Reads 3 values\n   * @param {bool} enableQueue truthy value to determine if values should be queued pending the next request\n   * @param {Scheduler} scheduler determines how the requests will be scheduled\n   * @returns {Observable} The observable sequence which only propagates values on request.\n   */\n  observableProto.controlled = function (enableQueue, scheduler) {\n\n    if (enableQueue && isScheduler(enableQueue)) {\n      scheduler = enableQueue;\n      enableQueue = true;\n    }\n\n    if (enableQueue == null) {  enableQueue = true; }\n    return new ControlledObservable(this, enableQueue, scheduler);\n  };\n\n  var StopAndWaitObservable = (function (__super__) {\n    inherits(StopAndWaitObservable, __super__);\n    function StopAndWaitObservable (source) {\n      __super__.call(this);\n      this.source = source;\n    }\n\n    function scheduleMethod(s, self) {\n      return self.source.request(1);\n    }\n\n    StopAndWaitObservable.prototype._subscribe = function (o) {\n      this.subscription = this.source.subscribe(new StopAndWaitObserver(o, this, this.subscription));\n      return new BinaryDisposable(\n        this.subscription,\n        defaultScheduler.schedule(this, scheduleMethod)\n      );\n    };\n\n    var StopAndWaitObserver = (function (__sub__) {\n      inherits(StopAndWaitObserver, __sub__);\n      function StopAndWaitObserver (observer, observable, cancel) {\n        __sub__.call(this);\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n        this.scheduleDisposable = null;\n      }\n\n      StopAndWaitObserver.prototype.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      StopAndWaitObserver.prototype.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      };\n\n      function innerScheduleMethod(s, self) {\n        return self.observable.source.request(1);\n      }\n\n      StopAndWaitObserver.prototype.next = function (value) {\n        this.observer.onNext(value);\n        this.scheduleDisposable = defaultScheduler.schedule(this, innerScheduleMethod);\n      };\n\n      StopAndWaitObserver.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        if (this.scheduleDisposable) {\n          this.scheduleDisposable.dispose();\n          this.scheduleDisposable = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return StopAndWaitObserver;\n    }(AbstractObserver));\n\n    return StopAndWaitObservable;\n  }(Observable));\n\n\n  /**\n   * Attaches a stop and wait observable to the current observable.\n   * @returns {Observable} A stop and wait observable.\n   */\n  ControlledObservable.prototype.stopAndWait = function () {\n    return new StopAndWaitObservable(this);\n  };\n\n  var WindowedObservable = (function (__super__) {\n    inherits(WindowedObservable, __super__);\n    function WindowedObservable(source, windowSize) {\n      __super__.call(this);\n      this.source = source;\n      this.windowSize = windowSize;\n    }\n\n    function scheduleMethod(s, self) {\n      return self.source.request(self.windowSize);\n    }\n\n    WindowedObservable.prototype._subscribe = function (o) {\n      this.subscription = this.source.subscribe(new WindowedObserver(o, this, this.subscription));\n      return new BinaryDisposable(\n        this.subscription,\n        defaultScheduler.schedule(this, scheduleMethod)\n      );\n    };\n\n    var WindowedObserver = (function (__sub__) {\n      inherits(WindowedObserver, __sub__);\n      function WindowedObserver(observer, observable, cancel) {\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n        this.received = 0;\n        this.scheduleDisposable = null;\n        __sub__.call(this);\n      }\n\n      WindowedObserver.prototype.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      WindowedObserver.prototype.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      };\n\n      function innerScheduleMethod(s, self) {\n        return self.observable.source.request(self.observable.windowSize);\n      }\n\n      WindowedObserver.prototype.next = function (value) {\n        this.observer.onNext(value);\n        this.received = ++this.received % this.observable.windowSize;\n        this.received === 0 && (this.scheduleDisposable = defaultScheduler.schedule(this, innerScheduleMethod));\n      };\n\n      WindowedObserver.prototype.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        if (this.scheduleDisposable) {\n          this.scheduleDisposable.dispose();\n          this.scheduleDisposable = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return WindowedObserver;\n    }(AbstractObserver));\n\n    return WindowedObservable;\n  }(Observable));\n\n  /**\n   * Creates a sliding windowed observable based upon the window size.\n   * @param {Number} windowSize The number of items in the window\n   * @returns {Observable} A windowed observable based upon the window size.\n   */\n  ControlledObservable.prototype.windowed = function (windowSize) {\n    return new WindowedObservable(this, windowSize);\n  };\n\n  /**\n   * Pipes the existing Observable sequence into a Node.js Stream.\n   * @param {Stream} dest The destination Node.js stream.\n   * @returns {Stream} The destination stream.\n   */\n  observableProto.pipe = function (dest) {\n    var source = this.pausableBuffered();\n\n    function onDrain() {\n      source.resume();\n    }\n\n    dest.addListener('drain', onDrain);\n\n    source.subscribe(\n      function (x) {\n        !dest.write(x) && source.pause();\n      },\n      function (err) {\n        dest.emit('error', err);\n      },\n      function () {\n        // Hack check because STDIO is not closable\n        !dest._isStdio && dest.end();\n        dest.removeListener('drain', onDrain);\n      });\n\n    source.resume();\n\n    return dest;\n  };\n\n  var MulticastObservable = (function (__super__) {\n    inherits(MulticastObservable, __super__);\n    function MulticastObservable(source, fn1, fn2) {\n      this.source = source;\n      this._fn1 = fn1;\n      this._fn2 = fn2;\n      __super__.call(this);\n    }\n\n    MulticastObservable.prototype.subscribeCore = function (o) {\n      var connectable = this.source.multicast(this._fn1());\n      return new BinaryDisposable(this._fn2(connectable).subscribe(o), connectable.connect());\n    };\n\n    return MulticastObservable;\n  }(ObservableBase));\n\n  /**\n   * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n   * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n   * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n   *\n   * @example\n   * 1 - res = source.multicast(observable);\n   * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n   *\n   * @param {Function|Subject} subjectOrSubjectSelector\n   * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n   * Or:\n   * Subject to push source elements into.\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.multicast = function (subjectOrSubjectSelector, selector) {\n    return isFunction(subjectOrSubjectSelector) ?\n      new MulticastObservable(this, subjectOrSubjectSelector, selector) :\n      new ConnectableObservable(this, subjectOrSubjectSelector);\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of Multicast using a regular Subject.\n   *\n   * @example\n   * var resres = source.publish();\n   * var res = source.publish(function (x) { return x; });\n   *\n   * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publish = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new Subject(); }, selector) :\n      this.multicast(new Subject());\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.share = function () {\n    return this.publish().refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n   * This operator is a specialization of Multicast using a AsyncSubject.\n   *\n   * @example\n   * var res = source.publishLast();\n   * var res = source.publishLast(function (x) { return x; });\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishLast = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new AsyncSubject(); }, selector) :\n      this.multicast(new AsyncSubject());\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n   * This operator is a specialization of Multicast using a BehaviorSubject.\n   *\n   * @example\n   * var res = source.publishValue(42);\n   * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishValue = function (initialValueOrSelector, initialValue) {\n    return arguments.length === 2 ?\n      this.multicast(function () {\n        return new BehaviorSubject(initialValue);\n      }, initialValueOrSelector) :\n      this.multicast(new BehaviorSubject(initialValueOrSelector));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n   * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareValue = function (initialValue) {\n    return this.publishValue(initialValue).refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of Multicast using a ReplaySubject.\n   *\n   * @example\n   * var res = source.replay(null, 3);\n   * var res = source.replay(null, 3, 500);\n   * var res = source.replay(null, 3, 500, scheduler);\n   * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param windowSize [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.replay = function (selector, bufferSize, windowSize, scheduler) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new ReplaySubject(bufferSize, windowSize, scheduler); }, selector) :\n      this.multicast(new ReplaySubject(bufferSize, windowSize, scheduler));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   *\n   * @example\n   * var res = source.shareReplay(3);\n   * var res = source.shareReplay(3, 500);\n   * var res = source.shareReplay(3, 500, scheduler);\n   *\n\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareReplay = function (bufferSize, windowSize, scheduler) {\n    return this.replay(null, bufferSize, windowSize, scheduler).refCount();\n  };\n\n  var InnerSubscription = function (s, o) {\n    this._s = s;\n    this._o = o;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this._s.isDisposed && this._o !== null) {\n      var idx = this._s.observers.indexOf(this._o);\n      this._s.observers.splice(idx, 1);\n      this._o = null;\n    }\n  };\n\n  var RefCountObservable = (function (__super__) {\n    inherits(RefCountObservable, __super__);\n    function RefCountObservable(source) {\n      this.source = source;\n      this._count = 0;\n      this._connectableSubscription = null;\n      __super__.call(this);\n    }\n\n    RefCountObservable.prototype.subscribeCore = function (o) {\n      var subscription = this.source.subscribe(o);\n      ++this._count === 1 && (this._connectableSubscription = this.source.connect());\n      return new RefCountDisposable(this, subscription);\n    };\n\n    function RefCountDisposable(p, s) {\n      this._p = p;\n      this._s = s;\n      this.isDisposed = false;\n    }\n\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this._s.dispose();\n        --this._p._count === 0 && this._p._connectableSubscription.dispose();\n      }\n    };\n\n    return RefCountObservable;\n  }(ObservableBase));\n\n  var ConnectableObservable = Rx.ConnectableObservable = (function (__super__) {\n    inherits(ConnectableObservable, __super__);\n    function ConnectableObservable(source, subject) {\n      this.source = source;\n      this._connection = null;\n      this._source = source.asObservable();\n      this._subject = subject;\n      __super__.call(this);\n    }\n\n    function ConnectDisposable(parent, subscription) {\n      this._p = parent;\n      this._s = subscription;\n    }\n\n    ConnectDisposable.prototype.dispose = function () {\n      if (this._s) {\n        this._s.dispose();\n        this._s = null;\n        this._p._connection = null;\n      }\n    };\n\n    ConnectableObservable.prototype.connect = function () {\n      if (!this._connection) {\n        if (this._subject.isStopped) {\n          return disposableEmpty;\n        }\n        var subscription = this._source.subscribe(this._subject);\n        this._connection = new ConnectDisposable(this, subscription);\n      }\n      return this._connection;\n    };\n\n    ConnectableObservable.prototype._subscribe = function (o) {\n      return this._subject.subscribe(o);\n    };\n\n    ConnectableObservable.prototype.refCount = function () {\n      return new RefCountObservable(this);\n    };\n\n    return ConnectableObservable;\n  }(Observable));\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence. This observable sequence\n   * can be resubscribed to, even if all prior subscriptions have ended. (unlike `.publish().refCount()`)\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source.\n   */\n  observableProto.singleInstance = function() {\n    var source = this, hasObservable = false, observable;\n\n    function getObservable() {\n      if (!hasObservable) {\n        hasObservable = true;\n        observable = source['finally'](function() { hasObservable = false; }).publish().refCount();\n      }\n      return observable;\n    }\n\n    return new AnonymousObservable(function(o) {\n      return getObservable().subscribe(o);\n    });\n  };\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters passed to the function correspond with the elements from the left and right source sequences for which overlap occurs.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.join = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable();\n      var leftDone = false, rightDone = false;\n      var leftId = 0, rightId = 0;\n      var leftMap = new Map(), rightMap = new Map();\n      var handleError = function (e) { o.onError(e); };\n\n      group.add(left.subscribe(\n        function (value) {\n          var id = leftId++, md = new SingleAssignmentDisposable();\n\n          leftMap.set(id, value);\n          group.add(md);\n\n          var duration = tryCatch(leftDurationSelector)(value);\n          if (duration === errorObj) { return o.onError(duration.e); }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            handleError,\n            function () {\n              leftMap['delete'](id) && leftMap.size === 0 && leftDone && o.onCompleted();\n              group.remove(md);\n            }));\n\n          rightMap.forEach(function (v) {\n            var result = tryCatch(resultSelector)(value, v);\n            if (result === errorObj) { return o.onError(result.e); }\n            o.onNext(result);\n          });\n        },\n        handleError,\n        function () {\n          leftDone = true;\n          (rightDone || leftMap.size === 0) && o.onCompleted();\n        })\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++, md = new SingleAssignmentDisposable();\n\n          rightMap.set(id, value);\n          group.add(md);\n\n          var duration = tryCatch(rightDurationSelector)(value);\n          if (duration === errorObj) { return o.onError(duration.e); }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            handleError,\n            function () {\n              rightMap['delete'](id) && rightMap.size === 0 && rightDone && o.onCompleted();\n              group.remove(md);\n            }));\n\n          leftMap.forEach(function (v) {\n            var result = tryCatch(resultSelector)(v, value);\n            if (result === errorObj) { return o.onError(result.e); }\n            o.onNext(result);\n          });\n        },\n        handleError,\n        function () {\n          rightDone = true;\n          (leftDone || rightMap.size === 0) && o.onCompleted();\n        })\n      );\n      return group;\n    }, left);\n  };\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations, and groups the results.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. The first parameter passed to the function is an element of the left sequence. The second parameter passed to the function is an observable sequence with elements from the right sequence that overlap with the left sequence's element.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.groupJoin = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable();\n      var r = new RefCountDisposable(group);\n      var leftMap = new Map(), rightMap = new Map();\n      var leftId = 0, rightId = 0;\n      var handleError = function (e) { return function (v) { v.onError(e); }; };\n\n      function handleError(e) { };\n\n      group.add(left.subscribe(\n        function (value) {\n          var s = new Subject();\n          var id = leftId++;\n          leftMap.set(id, s);\n\n          var result = tryCatch(resultSelector)(value, addRef(s, r));\n          if (result === errorObj) {\n            leftMap.forEach(handleError(result.e));\n            return o.onError(result.e);\n          }\n          o.onNext(result);\n\n          rightMap.forEach(function (v) { s.onNext(v); });\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var duration = tryCatch(leftDurationSelector)(value);\n          if (duration === errorObj) {\n            leftMap.forEach(handleError(duration.e));\n            return o.onError(duration.e);\n          }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.forEach(handleError(e));\n              o.onError(e);\n            },\n            function () {\n              leftMap['delete'](id) && s.onCompleted();\n              group.remove(md);\n            }));\n        },\n        function (e) {\n          leftMap.forEach(handleError(e));\n          o.onError(e);\n        },\n        function () { o.onCompleted(); })\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++;\n          rightMap.set(id, value);\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var duration = tryCatch(rightDurationSelector)(value);\n          if (duration === errorObj) {\n            leftMap.forEach(handleError(duration.e));\n            return o.onError(duration.e);\n          }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.forEach(handleError(e));\n              o.onError(e);\n            },\n            function () {\n              rightMap['delete'](id);\n              group.remove(md);\n            }));\n\n          leftMap.forEach(function (v) { v.onNext(value); });\n        },\n        function (e) {\n          leftMap.forEach(handleError(e));\n          o.onError(e);\n        })\n      );\n\n      return r;\n    }, left);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers.\n   *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n   *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n   *  @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.buffer = function () {\n    return this.window.apply(this, arguments)\n      .flatMap(toArray);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows.\n   *\n   *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n   *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n   *  @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.window = function (windowOpeningsOrClosingSelector, windowClosingSelector) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'function') {\n      return observableWindowWithBoundaries.call(this, windowOpeningsOrClosingSelector);\n    }\n    return typeof windowOpeningsOrClosingSelector === 'function' ?\n      observableWindowWithClosingSelector.call(this, windowOpeningsOrClosingSelector) :\n      observableWindowWithOpenings.call(this, windowOpeningsOrClosingSelector, windowClosingSelector);\n  };\n\n  function observableWindowWithOpenings(windowOpenings, windowClosingSelector) {\n    return windowOpenings.groupJoin(this, windowClosingSelector, observableEmpty, function (_, win) {\n      return win;\n    });\n  }\n\n  function observableWindowWithBoundaries(windowBoundaries) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var win = new Subject(),\n        d = new CompositeDisposable(),\n        r = new RefCountDisposable(d);\n\n      observer.onNext(addRef(win, r));\n\n      d.add(source.subscribe(function (x) {\n        win.onNext(x);\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      isPromise(windowBoundaries) && (windowBoundaries = observableFromPromise(windowBoundaries));\n\n      d.add(windowBoundaries.subscribe(function (w) {\n        win.onCompleted();\n        win = new Subject();\n        observer.onNext(addRef(win, r));\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      return r;\n    }, source);\n  }\n\n  function observableWindowWithClosingSelector(windowClosingSelector) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        r = new RefCountDisposable(d),\n        win = new Subject();\n      observer.onNext(addRef(win, r));\n      d.add(source.subscribe(function (x) {\n          win.onNext(x);\n      }, function (err) {\n          win.onError(err);\n          observer.onError(err);\n      }, function () {\n          win.onCompleted();\n          observer.onCompleted();\n      }));\n\n      function createWindowClose () {\n        var windowClose;\n        try {\n          windowClose = windowClosingSelector();\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n\n        isPromise(windowClose) && (windowClose = observableFromPromise(windowClose));\n\n        var m1 = new SingleAssignmentDisposable();\n        m.setDisposable(m1);\n        m1.setDisposable(windowClose.take(1).subscribe(noop, function (err) {\n          win.onError(err);\n          observer.onError(err);\n        }, function () {\n          win.onCompleted();\n          win = new Subject();\n          observer.onNext(addRef(win, r));\n          createWindowClose();\n        }));\n      }\n\n      createWindowClose();\n      return r;\n    }, source);\n  }\n\n  var PairwiseObservable = (function (__super__) {\n    inherits(PairwiseObservable, __super__);\n    function PairwiseObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    PairwiseObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new PairwiseObserver(o));\n    };\n\n    return PairwiseObservable;\n  }(ObservableBase));\n\n  var PairwiseObserver = (function(__super__) {\n    inherits(PairwiseObserver, __super__);\n    function PairwiseObserver(o) {\n      this._o = o;\n      this._p = null;\n      this._hp = false;\n      __super__.call(this);\n    }\n\n    PairwiseObserver.prototype.next = function (x) {\n      if (this._hp) {\n        this._o.onNext([this._p, x]);\n      } else {\n        this._hp = true;\n      }\n      this._p = x;\n    };\n    PairwiseObserver.prototype.error = function (err) { this._o.onError(err); };\n    PairwiseObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return PairwiseObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns a new observable that triggers on the second and subsequent triggerings of the input observable.\n   * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair.\n   * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs.\n   * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array.\n   */\n  observableProto.pairwise = function () {\n    return new PairwiseObservable(this);\n  };\n\n  /**\n   * Returns two observables which partition the observations of the source by the given function.\n   * The first will trigger observations for those values for which the predicate returns true.\n   * The second will trigger observations for those values where the predicate returns false.\n   * The predicate is executed once for each subscribed observer.\n   * Both also propagate all error observations arising from the source and each completes\n   * when the source completes.\n   * @param {Function} predicate\n   *    The function to determine which output Observable will trigger a particular observation.\n   * @returns {Array}\n   *    An array of observables. The first triggers when the predicate returns true,\n   *    and the second triggers when the predicate returns false.\n  */\n  observableProto.partition = function(predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return [\n      this.filter(predicate, thisArg),\n      this.filter(function (x, i, o) { return !fn(x, i, o); })\n    ];\n  };\n\n  var WhileEnumerable = (function(__super__) {\n    inherits(WhileEnumerable, __super__);\n    function WhileEnumerable(c, s) {\n      this.c = c;\n      this.s = s;\n    }\n    WhileEnumerable.prototype[$iterator$] = function () {\n      var self = this;\n      return {\n        next: function () {\n          return self.c() ?\n           { done: false, value: self.s } :\n           { done: true, value: void 0 };\n        }\n      };\n    };\n    return WhileEnumerable;\n  }(Enumerable));\n  \n  function enumerableWhile(condition, source) {\n    return new WhileEnumerable(condition, source);\n  }  \n\n   /**\n   *  Returns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions.\n   *  This operator allows for a fluent style of writing queries that use the same sequence multiple times.\n   *\n   * @param {Function} selector Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.letBind = observableProto['let'] = function (func) {\n    return func(this);\n  };\n\n   /**\n   *  Determines whether an observable collection contains values. \n   *\n   * @example\n   *  1 - res = Rx.Observable.if(condition, obs1);\n   *  2 - res = Rx.Observable.if(condition, obs1, obs2);\n   *  3 - res = Rx.Observable.if(condition, obs1, scheduler);\n   * @param {Function} condition The condition which determines if the thenSource or elseSource will be run.\n   * @param {Observable} thenSource The observable sequence or Promise that will be run if the condition function returns true.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the condition function returns false. If this is not provided, it defaults to Rx.Observabe.Empty with the specified scheduler.\n   * @returns {Observable} An observable sequence which is either the thenSource or elseSource.\n   */\n  Observable['if'] = function (condition, thenSource, elseSourceOrScheduler) {\n    return observableDefer(function () {\n      elseSourceOrScheduler || (elseSourceOrScheduler = observableEmpty());\n\n      isPromise(thenSource) && (thenSource = observableFromPromise(thenSource));\n      isPromise(elseSourceOrScheduler) && (elseSourceOrScheduler = observableFromPromise(elseSourceOrScheduler));\n\n      // Assume a scheduler for empty only\n      typeof elseSourceOrScheduler.now === 'function' && (elseSourceOrScheduler = observableEmpty(elseSourceOrScheduler));\n      return condition() ? thenSource : elseSourceOrScheduler;\n    });\n  };\n\n   /**\n   *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n   * There is an alias for this method called 'forIn' for browsers <IE9\n   * @param {Array} sources An array of values to turn into an observable sequence.\n   * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n   * @returns {Observable} An observable sequence from the concatenated observable sequences.\n   */\n  Observable['for'] = Observable.forIn = function (sources, resultSelector, thisArg) {\n    return enumerableOf(sources, resultSelector, thisArg).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a while loop.\n   * There is an alias for this method called 'whileDo' for browsers <IE9\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  var observableWhileDo = Observable['while'] = Observable.whileDo = function (condition, source) {\n    isPromise(source) && (source = observableFromPromise(source));\n    return enumerableWhile(condition, source).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a do while loop.\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  observableProto.doWhile = function (condition) {\n    return observableConcat([this, observableWhileDo(condition, this)]);\n  };\n\n   /**\n   *  Uses selector to determine which source in sources to use.\n   * @param {Function} selector The function which extracts the value for to test in a case statement.\n   * @param {Array} sources A object which has keys which correspond to the case statement labels.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n   *\n   * @returns {Observable} An observable sequence which is determined by a case statement.\n   */\n  Observable['case'] = function (selector, sources, defaultSourceOrScheduler) {\n    return observableDefer(function () {\n      isPromise(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableFromPromise(defaultSourceOrScheduler));\n      defaultSourceOrScheduler || (defaultSourceOrScheduler = observableEmpty());\n\n      isScheduler(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableEmpty(defaultSourceOrScheduler));\n\n      var result = sources[selector()];\n      isPromise(result) && (result = observableFromPromise(result));\n\n      return result || defaultSourceOrScheduler;\n    });\n  };\n\n  var ExpandObservable = (function(__super__) {\n    inherits(ExpandObservable, __super__);\n    function ExpandObservable(source, fn, scheduler) {\n      this.source = source;\n      this._fn = fn;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(args, recurse) {\n      var state = args[0], self = args[1];\n      var work;\n      if (state.q.length > 0) {\n        work = state.q.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var m1 = new SingleAssignmentDisposable();\n      state.d.add(m1);\n      m1.setDisposable(work.subscribe(new ExpandObserver(state, self, m1)));\n      recurse([state, self]);\n    }\n\n    ExpandObservable.prototype._ensureActive = function (state) {\n      var isOwner = false;\n      if (state.q.length > 0) {\n        isOwner = !state.isAcquired;\n        state.isAcquired = true;\n      }\n      isOwner && state.m.setDisposable(this._scheduler.scheduleRecursive([state, this], scheduleRecursive));\n    };\n\n    ExpandObservable.prototype.subscribeCore = function (o) {\n      var m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        state = {\n          q: [],\n          m: m,\n          d: d,\n          activeCount: 0,\n          isAcquired: false,\n          o: o\n        };\n\n      state.q.push(this.source);\n      state.activeCount++;\n      this._ensureActive(state);\n      return d;\n    };\n\n    return ExpandObservable;\n  }(ObservableBase));\n\n  var ExpandObserver = (function(__super__) {\n    inherits(ExpandObserver, __super__);\n    function ExpandObserver(state, parent, m1) {\n      this._s = state;\n      this._p = parent;\n      this._m1 = m1;\n      __super__.call(this);\n    }\n\n    ExpandObserver.prototype.next = function (x) {\n      this._s.o.onNext(x);\n      var result = tryCatch(this._p._fn)(x);\n      if (result === errorObj) { return this._s.o.onError(result.e); }\n      this._s.q.push(result);\n      this._s.activeCount++;\n      this._p._ensureActive(this._s);\n    };\n\n    ExpandObserver.prototype.error = function (e) {\n      this._s.o.onError(e);\n    };\n\n    ExpandObserver.prototype.completed = function () {\n      this._s.d.remove(this._m1);\n      this._s.activeCount--;\n      this._s.activeCount === 0 && this._s.o.onCompleted();\n    };\n\n    return ExpandObserver;\n  }(AbstractObserver));\n\n   /**\n   *  Expands an observable sequence by recursively invoking selector.\n   *\n   * @param {Function} selector Selector function to invoke for each produced element, resulting in another sequence to which the selector will be invoked recursively again.\n   * @param {Scheduler} [scheduler] Scheduler on which to perform the expansion. If not provided, this defaults to the current thread scheduler.\n   * @returns {Observable} An observable sequence containing all the elements produced by the recursive expansion.\n   */\n  observableProto.expand = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new ExpandObservable(this, selector, scheduler);\n  };\n\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var ForkJoinObservable = (function (__super__) {\n    inherits(ForkJoinObservable, __super__);\n    function ForkJoinObservable(sources, cb) {\n      this._sources = sources;\n      this._cb = cb;\n      __super__.call(this);\n    }\n\n    ForkJoinObservable.prototype.subscribeCore = function (o) {\n      if (this._sources.length === 0) {\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      var count = this._sources.length;\n      var state = {\n        finished: false,\n        hasResults: new Array(count),\n        hasCompleted: new Array(count),\n        results: new Array(count)\n      };\n\n      var subscriptions = new CompositeDisposable();\n      for (var i = 0, len = this._sources.length; i < len; i++) {\n        var source = this._sources[i];\n        isPromise(source) && (source = observableFromPromise(source));\n        subscriptions.add(source.subscribe(new ForkJoinObserver(o, state, i, this._cb, subscriptions)));\n      }\n\n      return subscriptions;\n    };\n\n    return ForkJoinObservable;\n  }(ObservableBase));\n\n  var ForkJoinObserver = (function(__super__) {\n    inherits(ForkJoinObserver, __super__);\n    function ForkJoinObserver(o, s, i, cb, subs) {\n      this._o = o;\n      this._s = s;\n      this._i = i;\n      this._cb = cb;\n      this._subs = subs;\n      __super__.call(this);\n    }\n\n    ForkJoinObserver.prototype.next = function (x) {\n      if (!this._s.finished) {\n        this._s.hasResults[this._i] = true;\n        this._s.results[this._i] = x;\n      }\n    };\n\n    ForkJoinObserver.prototype.error = function (e) {\n      this._s.finished = true;\n      this._o.onError(e);\n      this._subs.dispose();\n    };\n\n    ForkJoinObserver.prototype.completed = function () {\n      if (!this._s.finished) {\n        if (!this._s.hasResults[this._i]) {\n          return this._o.onCompleted();\n        }\n        this._s.hasCompleted[this._i] = true;\n        for (var i = 0; i < this._s.results.length; i++) {\n          if (!this._s.hasCompleted[i]) { return; }\n        }\n        this._s.finished = true;\n\n        var res = tryCatch(this._cb).apply(null, this._s.results);\n        if (res === errorObj) { return this._o.onError(res.e); }\n\n        this._o.onNext(res);\n        this._o.onCompleted();\n      }\n    };\n\n    return ForkJoinObserver;\n  }(AbstractObserver));\n\n   /**\n   *  Runs all observable sequences in parallel and collect their last elements.\n   *\n   * @example\n   *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n   *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n   * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n   */\n  Observable.forkJoin = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n    return new ForkJoinObservable(args, resultSelector);\n  };\n\n   /**\n   *  Runs two observable sequences in parallel and combines their last elemenets.\n   * @param {Observable} second Second observable sequence.\n   * @param {Function} resultSelector Result selector function to invoke with the last elements of both sequences.\n   * @returns {Observable} An observable sequence with the result of calling the selector function with the last elements of both input sequences.\n   */\n  observableProto.forkJoin = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return Observable.forkJoin.apply(null, args);\n  };\n\n  /**\n   * Comonadic bind operator.\n   * @param {Function} selector A transform function to apply to each element.\n   * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n   * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n   */\n  observableProto.manySelect = observableProto.extend = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = Rx.Scheduler.immediate);\n    var source = this;\n    return observableDefer(function () {\n      var chain;\n\n      return source\n        .map(function (x) {\n          var curr = new ChainObservable(x);\n\n          chain && chain.onNext(x);\n          chain = curr;\n\n          return curr;\n        })\n        .tap(\n          noop,\n          function (e) { chain && chain.onError(e); },\n          function () { chain && chain.onCompleted(); }\n        )\n        .observeOn(scheduler)\n        .map(selector);\n    }, source);\n  };\n\n  var ChainObservable = (function (__super__) {\n    inherits(ChainObservable, __super__);\n    function ChainObservable(head) {\n      __super__.call(this);\n      this.head = head;\n      this.tail = new AsyncSubject();\n    }\n\n    addProperties(ChainObservable.prototype, Observer, {\n      _subscribe: function (o) {\n        var g = new CompositeDisposable();\n        g.add(currentThreadScheduler.schedule(this, function (_, self) {\n          o.onNext(self.head);\n          g.add(self.tail.mergeAll().subscribe(o));\n        }));\n\n        return g;\n      },\n      onCompleted: function () {\n        this.onNext(Observable.empty());\n      },\n      onError: function (e) {\n        this.onNext(Observable['throw'](e));\n      },\n      onNext: function (v) {\n        this.tail.onNext(v);\n        this.tail.onCompleted();\n      }\n    });\n\n    return ChainObservable;\n\n  }(Observable));\n\n  var Map = root.Map || (function () {\n    function Map() {\n      this.size = 0;\n      this._values = [];\n      this._keys = [];\n    }\n\n    Map.prototype['delete'] = function (key) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) { return false; }\n      this._values.splice(i, 1);\n      this._keys.splice(i, 1);\n      this.size--;\n      return true;\n    };\n\n    Map.prototype.get = function (key) {\n      var i = this._keys.indexOf(key);\n      return i === -1 ? undefined : this._values[i];\n    };\n\n    Map.prototype.set = function (key, value) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) {\n        this._keys.push(key);\n        this._values.push(value);\n        this.size++;\n      } else {\n        this._values[i] = value;\n      }\n      return this;\n    };\n\n    Map.prototype.forEach = function (cb, thisArg) {\n      for (var i = 0; i < this.size; i++) {\n        cb.call(thisArg, this._values[i], this._keys[i]);\n      }\n    };\n\n    return Map;\n  }());\n\n  /**\n   * @constructor\n   * Represents a join pattern over observable sequences.\n   */\n  function Pattern(patterns) {\n    this.patterns = patterns;\n  }\n\n  /**\n   *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n   *  @param other Observable sequence to match in addition to the current pattern.\n   *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n   */\n  Pattern.prototype.and = function (other) {\n    return new Pattern(this.patterns.concat(other));\n  };\n\n  /**\n   *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n   *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n   *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  Pattern.prototype.thenDo = function (selector) {\n    return new Plan(this, selector);\n  };\n\n  function Plan(expression, selector) {\n    this.expression = expression;\n    this.selector = selector;\n  }\n\n  function handleOnError(o) { return function (e) { o.onError(e); }; }\n  function handleOnNext(self, observer) {\n    return function onNext () {\n      var result = tryCatch(self.selector).apply(self, arguments);\n      if (result === errorObj) { return observer.onError(result.e); }\n      observer.onNext(result);\n    };\n  }\n\n  Plan.prototype.activate = function (externalSubscriptions, observer, deactivate) {\n    var joinObservers = [], errHandler = handleOnError(observer);\n    for (var i = 0, len = this.expression.patterns.length; i < len; i++) {\n      joinObservers.push(planCreateObserver(externalSubscriptions, this.expression.patterns[i], errHandler));\n    }\n    var activePlan = new ActivePlan(joinObservers, handleOnNext(this, observer), function () {\n      for (var j = 0, jlen = joinObservers.length; j < jlen; j++) {\n        joinObservers[j].removeActivePlan(activePlan);\n      }\n      deactivate(activePlan);\n    });\n    for (i = 0, len = joinObservers.length; i < len; i++) {\n      joinObservers[i].addActivePlan(activePlan);\n    }\n    return activePlan;\n  };\n\n  function planCreateObserver(externalSubscriptions, observable, onError) {\n    var entry = externalSubscriptions.get(observable);\n    if (!entry) {\n      var observer = new JoinObserver(observable, onError);\n      externalSubscriptions.set(observable, observer);\n      return observer;\n    }\n    return entry;\n  }\n\n  function ActivePlan(joinObserverArray, onNext, onCompleted) {\n    this.joinObserverArray = joinObserverArray;\n    this.onNext = onNext;\n    this.onCompleted = onCompleted;\n    this.joinObservers = new Map();\n    for (var i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      var joinObserver = this.joinObserverArray[i];\n      this.joinObservers.set(joinObserver, joinObserver);\n    }\n  }\n\n  ActivePlan.prototype.dequeue = function () {\n    this.joinObservers.forEach(function (v) { v.queue.shift(); });\n  };\n\n  ActivePlan.prototype.match = function () {\n    var i, len, hasValues = true;\n    for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      if (this.joinObserverArray[i].queue.length === 0) {\n        hasValues = false;\n        break;\n      }\n    }\n    if (hasValues) {\n      var firstValues = [],\n          isCompleted = false;\n      for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n        firstValues.push(this.joinObserverArray[i].queue[0]);\n        this.joinObserverArray[i].queue[0].kind === 'C' && (isCompleted = true);\n      }\n      if (isCompleted) {\n        this.onCompleted();\n      } else {\n        this.dequeue();\n        var values = [];\n        for (i = 0, len = firstValues.length; i < firstValues.length; i++) {\n          values.push(firstValues[i].value);\n        }\n        this.onNext.apply(this, values);\n      }\n    }\n  };\n\n  var JoinObserver = (function (__super__) {\n    inherits(JoinObserver, __super__);\n\n    function JoinObserver(source, onError) {\n      __super__.call(this);\n      this.source = source;\n      this.onError = onError;\n      this.queue = [];\n      this.activePlans = [];\n      this.subscription = new SingleAssignmentDisposable();\n      this.isDisposed = false;\n    }\n\n    var JoinObserverPrototype = JoinObserver.prototype;\n\n    JoinObserverPrototype.next = function (notification) {\n      if (!this.isDisposed) {\n        if (notification.kind === 'E') {\n          return this.onError(notification.error);\n        }\n        this.queue.push(notification);\n        var activePlans = this.activePlans.slice(0);\n        for (var i = 0, len = activePlans.length; i < len; i++) {\n          activePlans[i].match();\n        }\n      }\n    };\n\n    JoinObserverPrototype.error = noop;\n    JoinObserverPrototype.completed = noop;\n\n    JoinObserverPrototype.addActivePlan = function (activePlan) {\n      this.activePlans.push(activePlan);\n    };\n\n    JoinObserverPrototype.subscribe = function () {\n      this.subscription.setDisposable(this.source.materialize().subscribe(this));\n    };\n\n    JoinObserverPrototype.removeActivePlan = function (activePlan) {\n      this.activePlans.splice(this.activePlans.indexOf(activePlan), 1);\n      this.activePlans.length === 0 && this.dispose();\n    };\n\n    JoinObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this.subscription.dispose();\n      }\n    };\n\n    return JoinObserver;\n  } (AbstractObserver));\n\n  /**\n   *  Creates a pattern that matches when both observable sequences have an available value.\n   *\n   *  @param right Observable sequence to match with the current sequence.\n   *  @return {Pattern} Pattern object that matches when both observable sequences have an available value.\n   */\n  observableProto.and = function (right) {\n    return new Pattern([this, right]);\n  };\n\n  /**\n   *  Matches when the observable sequence has an available value and projects the value.\n   *\n   *  @param {Function} selector Selector that will be invoked for values in the source sequence.\n   *  @returns {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  observableProto.thenDo = function (selector) {\n    return new Pattern([this]).thenDo(selector);\n  };\n\n  /**\n   *  Joins together the results from several patterns.\n   *\n   *  @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns.\n   *  @returns {Observable} Observable sequence with the results form matching several patterns.\n   */\n  Observable.when = function () {\n    var len = arguments.length, plans;\n    if (Array.isArray(arguments[0])) {\n      plans = arguments[0];\n    } else {\n      plans = new Array(len);\n      for(var i = 0; i < len; i++) { plans[i] = arguments[i]; }\n    }\n    return new AnonymousObservable(function (o) {\n      var activePlans = [],\n          externalSubscriptions = new Map();\n      var outObserver = observerCreate(\n        function (x) { o.onNext(x); },\n        function (err) {\n          externalSubscriptions.forEach(function (v) { v.onError(err); });\n          o.onError(err);\n        },\n        function (x) { o.onCompleted(); }\n      );\n      try {\n        for (var i = 0, len = plans.length; i < len; i++) {\n          activePlans.push(plans[i].activate(externalSubscriptions, outObserver, function (activePlan) {\n            var idx = activePlans.indexOf(activePlan);\n            activePlans.splice(idx, 1);\n            activePlans.length === 0 && o.onCompleted();\n          }));\n        }\n      } catch (e) {\n        return observableThrow(e).subscribe(o);\n      }\n      var group = new CompositeDisposable();\n      externalSubscriptions.forEach(function (joinObserver) {\n        joinObserver.subscribe();\n        group.add(joinObserver);\n      });\n\n      return group;\n    });\n  };\n\n  var TimerObservable = (function(__super__) {\n    inherits(TimerObservable, __super__);\n    function TimerObservable(dt, s) {\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimerObservable.prototype.subscribeCore = function (o) {\n      return this._s.scheduleFuture(o, this._dt, scheduleMethod);\n    };\n\n    function scheduleMethod(s, o) {\n      o.onNext(0);\n      o.onCompleted();\n    }\n\n    return TimerObservable;\n  }(ObservableBase));\n\n  function _observableTimer(dueTime, scheduler) {\n    return new TimerObservable(dueTime, scheduler);\n  }\n\n  function observableTimerDateAndPeriod(dueTime, period, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var d = dueTime, p = normalizeTime(period);\n      return scheduler.scheduleRecursiveFuture(0, d, function (count, self) {\n        if (p > 0) {\n          var now = scheduler.now();\n          d = new Date(d.getTime() + p);\n          d.getTime() <= now && (d = new Date(now + p));\n        }\n        observer.onNext(count);\n        self(count + 1, new Date(d));\n      });\n    });\n  }\n\n  function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) {\n    return dueTime === period ?\n      new AnonymousObservable(function (observer) {\n        return scheduler.schedulePeriodic(0, period, function (count) {\n          observer.onNext(count);\n          return count + 1;\n        });\n      }) :\n      observableDefer(function () {\n        return observableTimerDateAndPeriod(new Date(scheduler.now() + dueTime), period, scheduler);\n      });\n  }\n\n  /**\n   *  Returns an observable sequence that produces a value after each period.\n   *\n   * @example\n   *  1 - res = Rx.Observable.interval(1000);\n   *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n   *\n   * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n   * @returns {Observable} An observable sequence that produces a value after each period.\n   */\n  var observableinterval = Observable.interval = function (period, scheduler) {\n    return observableTimerTimeSpanAndPeriod(period, period, isScheduler(scheduler) ? scheduler : defaultScheduler);\n  };\n\n  /**\n   *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n   * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n   */\n  var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) {\n    var period;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    if (periodOrScheduler != null && typeof periodOrScheduler === 'number') {\n      period = periodOrScheduler;\n    } else if (isScheduler(periodOrScheduler)) {\n      scheduler = periodOrScheduler;\n    }\n    if ((dueTime instanceof Date || typeof dueTime === 'number') && period === undefined) {\n      return _observableTimer(dueTime, scheduler);\n    }\n    if (dueTime instanceof Date && period !== undefined) {\n      return observableTimerDateAndPeriod(dueTime, periodOrScheduler, scheduler);\n    }\n    return observableTimerTimeSpanAndPeriod(dueTime, period, scheduler);\n  };\n\n  function observableDelayRelative(source, dueTime, scheduler) {\n    return new AnonymousObservable(function (o) {\n      var active = false,\n        cancelable = new SerialDisposable(),\n        exception = null,\n        q = [],\n        running = false,\n        subscription;\n      subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) {\n        var d, shouldRun;\n        if (notification.value.kind === 'E') {\n          q = [];\n          q.push(notification);\n          exception = notification.value.error;\n          shouldRun = !running;\n        } else {\n          q.push({ value: notification.value, timestamp: notification.timestamp + dueTime });\n          shouldRun = !active;\n          active = true;\n        }\n        if (shouldRun) {\n          if (exception !== null) {\n            o.onError(exception);\n          } else {\n            d = new SingleAssignmentDisposable();\n            cancelable.setDisposable(d);\n            d.setDisposable(scheduler.scheduleRecursiveFuture(null, dueTime, function (_, self) {\n              var e, recurseDueTime, result, shouldRecurse;\n              if (exception !== null) {\n                return;\n              }\n              running = true;\n              do {\n                result = null;\n                if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) {\n                  result = q.shift().value;\n                }\n                if (result !== null) {\n                  result.accept(o);\n                }\n              } while (result !== null);\n              shouldRecurse = false;\n              recurseDueTime = 0;\n              if (q.length > 0) {\n                shouldRecurse = true;\n                recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now());\n              } else {\n                active = false;\n              }\n              e = exception;\n              running = false;\n              if (e !== null) {\n                o.onError(e);\n              } else if (shouldRecurse) {\n                self(null, recurseDueTime);\n              }\n            }));\n          }\n        }\n      });\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  function observableDelayAbsolute(source, dueTime, scheduler) {\n    return observableDefer(function () {\n      return observableDelayRelative(source, dueTime - scheduler.now(), scheduler);\n    });\n  }\n\n  function delayWithSelector(source, subscriptionDelay, delayDurationSelector) {\n    var subDelay, selector;\n    if (isFunction(subscriptionDelay)) {\n      selector = subscriptionDelay;\n    } else {\n      subDelay = subscriptionDelay;\n      selector = delayDurationSelector;\n    }\n    return new AnonymousObservable(function (o) {\n      var delays = new CompositeDisposable(), atEnd = false, subscription = new SerialDisposable();\n\n      function start() {\n        subscription.setDisposable(source.subscribe(\n          function (x) {\n            var delay = tryCatch(selector)(x);\n            if (delay === errorObj) { return o.onError(delay.e); }\n            var d = new SingleAssignmentDisposable();\n            delays.add(d);\n            d.setDisposable(delay.subscribe(\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              },\n              function (e) { o.onError(e); },\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              }\n            ));\n          },\n          function (e) { o.onError(e); },\n          function () {\n            atEnd = true;\n            subscription.dispose();\n            done();\n          }\n        ));\n      }\n\n      function done () {\n        atEnd && delays.length === 0 && o.onCompleted();\n      }\n\n      if (!subDelay) {\n        start();\n      } else {\n        subscription.setDisposable(subDelay.subscribe(start, function (e) { o.onError(e); }, start));\n      }\n\n      return new BinaryDisposable(subscription, delays);\n    }, source);\n  }\n\n  /**\n   *  Time shifts the observable sequence by dueTime.\n   *  The relative time intervals between the values are preserved.\n   *\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n   * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delay = function () {\n    var firstArg = arguments[0];\n    if (typeof firstArg === 'number' || firstArg instanceof Date) {\n      var dueTime = firstArg, scheduler = arguments[1];\n      isScheduler(scheduler) || (scheduler = defaultScheduler);\n      return dueTime instanceof Date ?\n        observableDelayAbsolute(this, dueTime, scheduler) :\n        observableDelayRelative(this, dueTime, scheduler);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return delayWithSelector(this, firstArg, arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  var DebounceObservable = (function (__super__) {\n    inherits(DebounceObservable, __super__);\n    function DebounceObservable(source, dt, s) {\n      isScheduler(s) || (s = defaultScheduler);\n      this.source = source;\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    DebounceObservable.prototype.subscribeCore = function (o) {\n      var cancelable = new SerialDisposable();\n      return new BinaryDisposable(\n        this.source.subscribe(new DebounceObserver(o, this._dt, this._s, cancelable)),\n        cancelable);\n    };\n\n    return DebounceObservable;\n  }(ObservableBase));\n\n  var DebounceObserver = (function (__super__) {\n    inherits(DebounceObserver, __super__);\n    function DebounceObserver(observer, dueTime, scheduler, cancelable) {\n      this._o = observer;\n      this._d = dueTime;\n      this._scheduler = scheduler;\n      this._c = cancelable;\n      this._v = null;\n      this._hv = false;\n      this._id = 0;\n      __super__.call(this);\n    }\n\n    function scheduleFuture(s, state) {\n      state.self._hv && state.self._id === state.currentId && state.self._o.onNext(state.x);\n      state.self._hv = false;\n    }\n\n    DebounceObserver.prototype.next = function (x) {\n      this._hv = true;\n      this._v = x;\n      var currentId = ++this._id, d = new SingleAssignmentDisposable();\n      this._c.setDisposable(d);\n      d.setDisposable(this._scheduler.scheduleFuture(this, this._d, function (_, self) {\n        self._hv && self._id === currentId && self._o.onNext(x);\n        self._hv = false;\n      }));\n    };\n\n    DebounceObserver.prototype.error = function (e) {\n      this._c.dispose();\n      this._o.onError(e);\n      this._hv = false;\n      this._id++;\n    };\n\n    DebounceObserver.prototype.completed = function () {\n      this._c.dispose();\n      this._hv && this._o.onNext(this._v);\n      this._o.onCompleted();\n      this._hv = false;\n      this._id++;\n    };\n\n    return DebounceObserver;\n  }(AbstractObserver));\n\n  function debounceWithSelector(source, durationSelector) {\n    return new AnonymousObservable(function (o) {\n      var value, hasValue = false, cancelable = new SerialDisposable(), id = 0;\n      var subscription = source.subscribe(\n        function (x) {\n          var throttle = tryCatch(durationSelector)(x);\n          if (throttle === errorObj) { return o.onError(throttle.e); }\n\n          isPromise(throttle) && (throttle = observableFromPromise(throttle));\n\n          hasValue = true;\n          value = x;\n          id++;\n          var currentid = id, d = new SingleAssignmentDisposable();\n          cancelable.setDisposable(d);\n          d.setDisposable(throttle.subscribe(\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            },\n            function (e) { o.onError(e); },\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            }\n          ));\n        },\n        function (e) {\n          cancelable.dispose();\n          o.onError(e);\n          hasValue = false;\n          id++;\n        },\n        function () {\n          cancelable.dispose();\n          hasValue && o.onNext(value);\n          o.onCompleted();\n          hasValue = false;\n          id++;\n        }\n      );\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  observableProto.debounce = function () {\n    if (isFunction (arguments[0])) {\n      return debounceWithSelector(this, arguments[0]);\n    } else if (typeof arguments[0] === 'number') {\n      return new DebounceObservable(this, arguments[0], arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n   * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n   * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTime = observableProto.windowTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n    var source = this, timeShift;\n    timeShiftOrScheduler == null && (timeShift = timeSpan);\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    if (typeof timeShiftOrScheduler === 'number') {\n      timeShift = timeShiftOrScheduler;\n    } else if (isScheduler(timeShiftOrScheduler)) {\n      timeShift = timeSpan;\n      scheduler = timeShiftOrScheduler;\n    }\n    return new AnonymousObservable(function (observer) {\n      var groupDisposable,\n        nextShift = timeShift,\n        nextSpan = timeSpan,\n        q = [],\n        refCountDisposable,\n        timerD = new SerialDisposable(),\n        totalTime = 0;\n        groupDisposable = new CompositeDisposable(timerD),\n        refCountDisposable = new RefCountDisposable(groupDisposable);\n\n       function createTimer () {\n        var m = new SingleAssignmentDisposable(),\n          isSpan = false,\n          isShift = false;\n        timerD.setDisposable(m);\n        if (nextSpan === nextShift) {\n          isSpan = true;\n          isShift = true;\n        } else if (nextSpan < nextShift) {\n            isSpan = true;\n        } else {\n          isShift = true;\n        }\n        var newTotalTime = isSpan ? nextSpan : nextShift,\n          ts = newTotalTime - totalTime;\n        totalTime = newTotalTime;\n        if (isSpan) {\n          nextSpan += timeShift;\n        }\n        if (isShift) {\n          nextShift += timeShift;\n        }\n        m.setDisposable(scheduler.scheduleFuture(null, ts, function () {\n          if (isShift) {\n            var s = new Subject();\n            q.push(s);\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          isSpan && q.shift().onCompleted();\n          createTimer();\n        }));\n      };\n      q.push(new Subject());\n      observer.onNext(addRef(q[0], refCountDisposable));\n      createTimer();\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n        },\n        function (e) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed.\n   * @param {Number} timeSpan Maximum time length of a window.\n   * @param {Number} count Maximum element count of a window.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTimeOrCount = observableProto.windowTimeOrCount = function (timeSpan, count, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new AnonymousObservable(function (observer) {\n      var timerD = new SerialDisposable(),\n          groupDisposable = new CompositeDisposable(timerD),\n          refCountDisposable = new RefCountDisposable(groupDisposable),\n          n = 0,\n          windowId = 0,\n          s = new Subject();\n\n      function createTimer(id) {\n        var m = new SingleAssignmentDisposable();\n        timerD.setDisposable(m);\n        m.setDisposable(scheduler.scheduleFuture(null, timeSpan, function () {\n          if (id !== windowId) { return; }\n          n = 0;\n          var newId = ++windowId;\n          s.onCompleted();\n          s = new Subject();\n          observer.onNext(addRef(s, refCountDisposable));\n          createTimer(newId);\n        }));\n      }\n\n      observer.onNext(addRef(s, refCountDisposable));\n      createTimer(0);\n\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          var newId = 0, newWindow = false;\n          s.onNext(x);\n          if (++n === count) {\n            newWindow = true;\n            n = 0;\n            newId = ++windowId;\n            s.onCompleted();\n            s = new Subject();\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          newWindow && createTimer(newId);\n        },\n        function (e) {\n          s.onError(e);\n          observer.onError(e);\n        }, function () {\n          s.onCompleted();\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n   * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n   * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n   * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithTime = observableProto.bufferTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n    return this.windowWithTime(timeSpan, timeShiftOrScheduler, scheduler).flatMap(toArray);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed.\n   * @param {Number} timeSpan Maximum time length of a buffer.\n   * @param {Number} count Maximum element count of a buffer.\n   * @param {Scheduler} [scheduler]  Scheduler to run bufferin timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithTimeOrCount = observableProto.bufferTimeOrCount = function (timeSpan, count, scheduler) {\n    return this.windowWithTimeOrCount(timeSpan, count, scheduler).flatMap(toArray);\n  };\n\n  var TimeIntervalObservable = (function (__super__) {\n    inherits(TimeIntervalObservable, __super__);\n    function TimeIntervalObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimeIntervalObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TimeIntervalObserver(o, this._s));\n    };\n\n    return TimeIntervalObservable;\n  }(ObservableBase));\n\n  var TimeIntervalObserver = (function (__super__) {\n    inherits(TimeIntervalObserver, __super__);\n\n    function TimeIntervalObserver(o, s) {\n      this._o = o;\n      this._s = s;\n      this._l = s.now();\n      __super__.call(this);\n    }\n\n    TimeIntervalObserver.prototype.next = function (x) {\n      var now = this._s.now(), span = now - this._l;\n      this._l = now;\n      this._o.onNext({ value: x, interval: span });\n    };\n    TimeIntervalObserver.prototype.error = function (e) { this._o.onError(e); };\n    TimeIntervalObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TimeIntervalObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Records the time interval between consecutive values in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timeInterval();\n   *  2 - res = source.timeInterval(Rx.Scheduler.timeout);\n   *\n   * @param [scheduler]  Scheduler used to compute time intervals. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence with time interval information on values.\n   */\n  observableProto.timeInterval = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TimeIntervalObservable(this, scheduler);\n  };\n\n  var TimestampObservable = (function (__super__) {\n    inherits(TimestampObservable, __super__);\n    function TimestampObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TimestampObserver(o, this._s));\n    };\n\n    return TimestampObservable;\n  }(ObservableBase));\n\n  var TimestampObserver = (function (__super__) {\n    inherits(TimestampObserver, __super__);\n    function TimestampObserver(o, s) {\n      this._o = o;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObserver.prototype.next = function (x) {\n      this._o.onNext({ value: x, timestamp: this._s.now() });\n    };\n\n    TimestampObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TimestampObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return TimestampObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Records the timestamp for each value in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n   *  2 - res = source.timestamp(Rx.Scheduler.default);\n   *\n   * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the default scheduler is used.\n   * @returns {Observable} An observable sequence with timestamp information on values.\n   */\n  observableProto.timestamp = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TimestampObservable(this, scheduler);\n  };\n\n  var SampleObservable = (function(__super__) {\n    inherits(SampleObservable, __super__);\n    function SampleObservable(source, sampler) {\n      this.source = source;\n      this._sampler = sampler;\n      __super__.call(this);\n    }\n\n    SampleObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        atEnd: false,\n        value: null,\n        hasValue: false,\n        sourceSubscription: new SingleAssignmentDisposable()\n      };\n\n      state.sourceSubscription.setDisposable(this.source.subscribe(new SampleSourceObserver(state)));\n      return new BinaryDisposable(\n        state.sourceSubscription,\n        this._sampler.subscribe(new SamplerObserver(state))\n      );\n    };\n\n    return SampleObservable;\n  }(ObservableBase));\n\n  var SamplerObserver = (function(__super__) {\n    inherits(SamplerObserver, __super__);\n    function SamplerObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SamplerObserver.prototype._handleMessage = function () {\n      if (this._s.hasValue) {\n        this._s.hasValue = false;\n        this._s.o.onNext(this._s.value);\n      }\n      this._s.atEnd && this._s.o.onCompleted();\n    };\n\n    SamplerObserver.prototype.next = function () { this._handleMessage(); };\n    SamplerObserver.prototype.error = function (e) { this._s.onError(e); };\n    SamplerObserver.prototype.completed = function () { this._handleMessage(); };\n\n    return SamplerObserver;\n  }(AbstractObserver));\n\n  var SampleSourceObserver = (function(__super__) {\n    inherits(SampleSourceObserver, __super__);\n    function SampleSourceObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SampleSourceObserver.prototype.next = function (x) {\n      this._s.hasValue = true;\n      this._s.value = x;\n    };\n    SampleSourceObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    SampleSourceObserver.prototype.completed = function () {\n      this._s.atEnd = true;\n      this._s.sourceSubscription.dispose();\n    };\n\n    return SampleSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Samples the observable sequence at each interval.\n   *\n   * @example\n   *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n   *  2 - res = source.sample(5000); // 5 seconds\n   *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n   *\n   * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n   * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Sampled observable sequence.\n   */\n  observableProto.sample = function (intervalOrSampler, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return typeof intervalOrSampler === 'number' ?\n      new SampleObservable(this, observableinterval(intervalOrSampler, scheduler)) :\n      new SampleObservable(this, intervalOrSampler);\n  };\n\n  var TimeoutError = Rx.TimeoutError = function(message) {\n    this.message = message || 'Timeout has occurred';\n    this.name = 'TimeoutError';\n    Error.call(this);\n  };\n  TimeoutError.prototype = Object.create(Error.prototype);\n\n  function timeoutWithSelector(source, firstTimeout, timeoutDurationSelector, other) {\n    if (isFunction(firstTimeout)) {\n      other = timeoutDurationSelector;\n      timeoutDurationSelector = firstTimeout;\n      firstTimeout = observableNever();\n    }\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var subscription = new SerialDisposable(),\n        timer = new SerialDisposable(),\n        original = new SingleAssignmentDisposable();\n\n      subscription.setDisposable(original);\n\n      var id = 0, switched = false;\n\n      function setTimer(timeout) {\n        var myId = id, d = new SingleAssignmentDisposable();\n\n        function timerWins() {\n          switched = (myId === id);\n          return switched;\n        }\n\n        timer.setDisposable(d);\n        d.setDisposable(timeout.subscribe(function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n          d.dispose();\n        }, function (e) {\n          timerWins() && o.onError(e);\n        }, function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n        }));\n      };\n\n      setTimer(firstTimeout);\n\n      function oWins() {\n        var res = !switched;\n        if (res) { id++; }\n        return res;\n      }\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (oWins()) {\n          o.onNext(x);\n          var timeout = tryCatch(timeoutDurationSelector)(x);\n          if (timeout === errorObj) { return o.onError(timeout.e); }\n          setTimer(isPromise(timeout) ? observableFromPromise(timeout) : timeout);\n        }\n      }, function (e) {\n        oWins() && o.onError(e);\n      }, function () {\n        oWins() && o.onCompleted();\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  function timeout(source, dueTime, other, scheduler) {\n    if (isScheduler(other)) {\n      scheduler = other;\n      other = observableThrow(new TimeoutError());\n    }\n    if (other instanceof Error) { other = observableThrow(other); }\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var id = 0,\n        original = new SingleAssignmentDisposable(),\n        subscription = new SerialDisposable(),\n        switched = false,\n        timer = new SerialDisposable();\n\n      subscription.setDisposable(original);\n\n      function createTimer() {\n        var myId = id;\n        timer.setDisposable(scheduler.scheduleFuture(null, dueTime, function () {\n          switched = id === myId;\n          if (switched) {\n            isPromise(other) && (other = observableFromPromise(other));\n            subscription.setDisposable(other.subscribe(o));\n          }\n        }));\n      }\n\n      createTimer();\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (!switched) {\n          id++;\n          o.onNext(x);\n          createTimer();\n        }\n      }, function (e) {\n        if (!switched) {\n          id++;\n          o.onError(e);\n        }\n      }, function () {\n        if (!switched) {\n          id++;\n          o.onCompleted();\n        }\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  observableProto.timeout = function () {\n    var firstArg = arguments[0];\n    if (firstArg instanceof Date || typeof firstArg === 'number') {\n      return timeout(this, firstArg, arguments[1], arguments[2]);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return timeoutWithSelector(this, firstArg, arguments[1], arguments[2]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  var GenerateAbsoluteObservable = (function (__super__) {\n    inherits(GenerateAbsoluteObservable, __super__);\n    function GenerateAbsoluteObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n      this._state = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._timeFn = timeFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      state.hasResult && state.o.onNext(state.result);\n\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n      state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (state.hasResult === errorObj) { return state.o.onError(state.hasResult.e); }\n      if (state.hasResult) {\n        state.result = tryCatch(state.self._resFn)(state.newState);\n        if (state.result === errorObj) { return state.o.onError(state.result.e); }\n        var time = tryCatch(state.self._timeFn)(state.newState);\n        if (time === errorObj) { return state.o.onError(time.e); }\n        recurse(state, time);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateAbsoluteObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        newState: this._state,\n        first: true,\n        hasResult: false\n      };\n      return this._s.scheduleRecursiveFuture(state, new Date(this._s.now()), scheduleRecursive);\n    };\n\n    return GenerateAbsoluteObservable;\n  }(ObservableBase));\n\n  /**\n   *  GenerateAbsolutes an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithAbsoluteTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return new Date(); }\n   *  });\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning Date values.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithAbsoluteTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new GenerateAbsoluteObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n  };\n\n  var GenerateRelativeObservable = (function (__super__) {\n    inherits(GenerateRelativeObservable, __super__);\n    function GenerateRelativeObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n      this._state = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._timeFn = timeFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      state.hasResult && state.o.onNext(state.result);\n\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n\n      state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (state.hasResult === errorObj) { return state.o.onError(state.hasResult.e); }\n      if (state.hasResult) {\n        state.result = tryCatch(state.self._resFn)(state.newState);\n        if (state.result === errorObj) { return state.o.onError(state.result.e); }\n        var time = tryCatch(state.self._timeFn)(state.newState);\n        if (time === errorObj) { return state.o.onError(time.e); }\n        recurse(state, time);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateRelativeObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        newState: this._state,\n        first: true,\n        hasResult: false\n      };\n      return this._s.scheduleRecursiveFuture(state, 0, scheduleRecursive);\n    };\n\n    return GenerateRelativeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithRelativeTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return 500; }\n   *  );\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithRelativeTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new GenerateRelativeObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n  };\n\n  var DelaySubscription = (function(__super__) {\n    inherits(DelaySubscription, __super__);\n    function DelaySubscription(source, dt, s) {\n      this.source = source;\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    DelaySubscription.prototype.subscribeCore = function (o) {\n      var d = new SerialDisposable();\n\n      d.setDisposable(this._s.scheduleFuture([this.source, o, d], this._dt, scheduleMethod));\n\n      return d;\n    };\n\n    function scheduleMethod(s, state) {\n      var source = state[0], o = state[1], d = state[2];\n      d.setDisposable(source.subscribe(o));\n    }\n\n    return DelaySubscription;\n  }(ObservableBase));\n\n  /**\n   *  Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.delaySubscription(5000); // 5s\n   *  2 - res = source.delaySubscription(5000, Rx.Scheduler.default); // 5 seconds\n   *\n   * @param {Number} dueTime Relative or absolute time shift of the subscription.\n   * @param {Scheduler} [scheduler]  Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delaySubscription = function (dueTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new DelaySubscription(this, dueTime, scheduler);\n  };\n\n  var SkipLastWithTimeObservable = (function (__super__) {\n    inherits(SkipLastWithTimeObservable, __super__);\n    function SkipLastWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SkipLastWithTimeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipLastWithTimeObserver(o, this));\n    };\n\n    return SkipLastWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipLastWithTimeObserver = (function (__super__) {\n    inherits(SkipLastWithTimeObserver, __super__);\n\n    function SkipLastWithTimeObserver(o, p) {\n      this._o = o;\n      this._s = p._s;\n      this._d = p._d;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    SkipLastWithTimeObserver.prototype.next = function (x) {\n      var now = this._s.now();\n      this._q.push({ interval: now, value: x });\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._o.onNext(this._q.shift().value);\n      }\n    };\n    SkipLastWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipLastWithTimeObserver.prototype.completed = function () {\n      var now = this._s.now();\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._o.onNext(this._q.shift().value);\n      }\n      this._o.onCompleted();\n    };\n\n    return SkipLastWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for skipping elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence.\n   */\n  observableProto.skipLastWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipLastWithTimeObservable(this, duration, scheduler);\n  };\n\n  var TakeLastWithTimeObservable = (function (__super__) {\n    inherits(TakeLastWithTimeObservable, __super__);\n    function TakeLastWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TakeLastWithTimeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeLastWithTimeObserver(o, this._d, this._s));\n    };\n\n    return TakeLastWithTimeObservable;\n  }(ObservableBase));\n\n  var TakeLastWithTimeObserver = (function (__super__) {\n    inherits(TakeLastWithTimeObserver, __super__);\n\n    function TakeLastWithTimeObserver(o, d, s) {\n      this._o = o;\n      this._d = d;\n      this._s = s;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastWithTimeObserver.prototype.next = function (x) {\n      var now = this._s.now();\n      this._q.push({ interval: now, value: x });\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._q.shift();\n      }\n    };\n    TakeLastWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeLastWithTimeObserver.prototype.completed = function () {\n      var now = this._s.now();\n      while (this._q.length > 0) {\n        var next = this._q.shift();\n        if (now - next.interval <= this._d) { this._o.onNext(next.value); }\n      }\n      this._o.onCompleted();\n    };\n\n    return TakeLastWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TakeLastWithTimeObservable(this, duration, scheduler);\n  };\n\n  /**\n   *  Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastBufferWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        var now = scheduler.now();\n        q.push({ interval: now, value: x });\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          q.shift();\n        }\n      }, function (e) { o.onError(e); }, function () {\n        var now = scheduler.now(), res = [];\n        while (q.length > 0) {\n          var next = q.shift();\n          now - next.interval <= duration && res.push(next.value);\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  var TakeWithTimeObservable = (function (__super__) {\n    inherits(TakeWithTimeObservable, __super__);\n    function TakeWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, o) {\n      o.onCompleted();\n    }\n\n    TakeWithTimeObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(\n        this._s.scheduleFuture(o, this._d, scheduleMethod),\n        this.source.subscribe(o)\n      );\n    };\n\n    return TakeWithTimeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.takeWithTime(5000,  [optional scheduler]);\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence.\n   */\n  observableProto.takeWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TakeWithTimeObservable(this, duration, scheduler);\n  };\n\n  var SkipWithTimeObservable = (function (__super__) {\n    inherits(SkipWithTimeObservable, __super__);\n    function SkipWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      this._open = false;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, self) {\n      self._open = true;\n    }\n\n    SkipWithTimeObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(\n        this._s.scheduleFuture(this, this._d, scheduleMethod),\n        this.source.subscribe(new SkipWithTimeObserver(o, this))\n      );\n    };\n\n    return SkipWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipWithTimeObserver = (function (__super__) {\n    inherits(SkipWithTimeObserver, __super__);\n\n    function SkipWithTimeObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipWithTimeObserver.prototype.next = function (x) { this._p._open && this._o.onNext(x); };\n    SkipWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipWithTimeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence.\n   *  This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded\n   *  may not execute immediately, despite the zero due time.\n   *\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration.\n   * @param {Number} duration Duration for skipping elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence.\n   */\n  observableProto.skipWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipWithTimeObservable(this, duration, scheduler);\n  };\n\n  var SkipUntilWithTimeObservable = (function (__super__) {\n    inherits(SkipUntilWithTimeObservable, __super__);\n    function SkipUntilWithTimeObservable(source, startTime, scheduler) {\n      this.source = source;\n      this._st = startTime;\n      this._s = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, state) {\n      state._open = true;\n    }\n\n    SkipUntilWithTimeObservable.prototype.subscribeCore = function (o) {\n      this._open = false;\n      return new BinaryDisposable(\n        this._s.scheduleFuture(this, this._st, scheduleMethod),\n        this.source.subscribe(new SkipUntilWithTimeObserver(o, this))\n      );\n    };\n\n    return SkipUntilWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipUntilWithTimeObserver = (function (__super__) {\n    inherits(SkipUntilWithTimeObserver, __super__);\n\n    function SkipUntilWithTimeObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipUntilWithTimeObserver.prototype.next = function (x) { this._p._open && this._o.onNext(x); };\n    SkipUntilWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipUntilWithTimeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipUntilWithTimeObserver;\n  }(AbstractObserver));\n\n\n  /**\n   *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n   *\n   * @examples\n   *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n   *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n   * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n   */\n  observableProto.skipUntilWithTime = function (startTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipUntilWithTimeObservable(this, startTime, scheduler);\n  };\n\n  /**\n   *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n   * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n   * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n   */\n  observableProto.takeUntilWithTime = function (endTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return new BinaryDisposable(\n        scheduler.scheduleFuture(o, endTime, function (_, o) { o.onCompleted(); }),\n        source.subscribe(o));\n    }, source);\n  };\n\n  /**\n   * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n   * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n   * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n   * @returns {Observable} An Observable that performs the throttle operation.\n   */\n  observableProto.throttle = function (windowDuration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    var duration = +windowDuration || 0;\n    if (duration <= 0) { throw new RangeError('windowDuration cannot be less or equal zero.'); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var lastOnNext = 0;\n      return source.subscribe(\n        function (x) {\n          var now = scheduler.now();\n          if (lastOnNext === 0 || now - lastOnNext >= duration) {\n            lastOnNext = now;\n            o.onNext(x);\n          }\n        },function (e) { o.onError(e); }, function () { o.onCompleted(); }\n      );\n    }, source);\n  };\n\n  var SwitchFirstObservable = (function (__super__) {\n    inherits(SwitchFirstObservable, __super__);\n    function SwitchFirstObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    SwitchFirstObservable.prototype.subscribeCore = function (o) {\n      var m = new SingleAssignmentDisposable(),\n        g = new CompositeDisposable(),\n        state = {\n          hasCurrent: false,\n          isStopped: false,\n          o: o,\n          g: g\n        };\n\n      g.add(m);\n      m.setDisposable(this.source.subscribe(new SwitchFirstObserver(state)));\n      return g;\n    };\n\n    return SwitchFirstObservable;\n  }(ObservableBase));\n\n  var SwitchFirstObserver = (function(__super__) {\n    inherits(SwitchFirstObserver, __super__);\n    function SwitchFirstObserver(state) {\n      this._s = state;\n      __super__.call(this);\n    }\n\n    SwitchFirstObserver.prototype.next = function (x) {\n      if (!this._s.hasCurrent) {\n        this._s.hasCurrent = true;\n        isPromise(x) && (x = observableFromPromise(x));\n        var inner = new SingleAssignmentDisposable();\n        this._s.g.add(inner);\n        inner.setDisposable(x.subscribe(new InnerObserver(this._s, inner)));\n      }\n    };\n\n    SwitchFirstObserver.prototype.error = function (e) {\n      this._s.o.onError(e);\n    };\n\n    SwitchFirstObserver.prototype.completed = function () {\n      this._s.isStopped = true;\n      !this._s.hasCurrent && this._s.g.length === 1 && this._s.o.onCompleted();\n    };\n\n    inherits(InnerObserver, __super__);\n    function InnerObserver(state, inner) {\n      this._s = state;\n      this._i = inner;\n      __super__.call(this);\n    }\n\n    InnerObserver.prototype.next = function (x) { this._s.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    InnerObserver.prototype.completed = function () {\n      this._s.g.remove(this._i);\n      this._s.hasCurrent = false;\n      this._s.isStopped && this._s.g.length === 1 && this._s.o.onCompleted();\n    };\n\n    return SwitchFirstObserver;\n  }(AbstractObserver));\n\n  /**\n   * Performs a exclusive waiting for the first to finish before subscribing to another observable.\n   * Observables that come in between subscriptions will be dropped on the floor.\n   * @returns {Observable} A exclusive observable with only the results that happen when subscribed.\n   */\n  observableProto.switchFirst = function () {\n    return new SwitchFirstObservable(this);\n  };\n\nobservableProto.flatMapFirst = observableProto.exhaustMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).switchFirst();\n};\n\nobservableProto.flatMapWithMaxConcurrent = observableProto.flatMapMaxConcurrent = function(limit, selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).merge(limit);\n};\n\n  var TransduceObserver = (function (__super__) {\n    inherits(TransduceObserver, __super__);\n    function TransduceObserver(o, xform) {\n      this._o = o;\n      this._xform = xform;\n      __super__.call(this);\n    }\n\n    TransduceObserver.prototype.next = function (x) {\n      var res = tryCatch(this._xform['@@transducer/step']).call(this._xform, this._o, x);\n      if (res === errorObj) { this._o.onError(res.e); }\n    };\n\n    TransduceObserver.prototype.error = function (e) { this._o.onError(e); };\n\n    TransduceObserver.prototype.completed = function () {\n      this._xform['@@transducer/result'](this._o);\n    };\n\n    return TransduceObserver;\n  }(AbstractObserver));\n\n  function transformForObserver(o) {\n    return {\n      '@@transducer/init': function() {\n        return o;\n      },\n      '@@transducer/step': function(obs, input) {\n        return obs.onNext(input);\n      },\n      '@@transducer/result': function(obs) {\n        return obs.onCompleted();\n      }\n    };\n  }\n\n  /**\n   * Executes a transducer to transform the observable sequence\n   * @param {Transducer} transducer A transducer to execute\n   * @returns {Observable} An Observable sequence containing the results from the transducer.\n   */\n  observableProto.transduce = function(transducer) {\n    var source = this;\n    return new AnonymousObservable(function(o) {\n      var xform = transducer(transformForObserver(o));\n      return source.subscribe(new TransduceObserver(o, xform));\n    }, source);\n  };\n\n  /** Provides a set of extension methods for virtual time scheduling. */\n  var VirtualTimeScheduler = Rx.VirtualTimeScheduler = (function (__super__) {\n    inherits(VirtualTimeScheduler, __super__);\n\n    /**\n     * Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer.\n     *\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function VirtualTimeScheduler(initialClock, comparer) {\n      this.clock = initialClock;\n      this.comparer = comparer;\n      this.isEnabled = false;\n      this.queue = new PriorityQueue(1024);\n      __super__.call(this);\n    }\n\n    var VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype;\n\n    VirtualTimeSchedulerPrototype.now = function () {\n      return this.toAbsoluteTime(this.clock);\n    };\n\n    VirtualTimeSchedulerPrototype.schedule = function (state, action) {\n      return this.scheduleAbsolute(state, this.clock, action);\n    };\n\n    VirtualTimeSchedulerPrototype.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime instanceof Date ?\n        this.toRelativeTime(dueTime - this.now()) :\n        this.toRelativeTime(dueTime);\n\n      return this.scheduleRelative(state, dt, action);\n    };\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    VirtualTimeSchedulerPrototype.add = notImplemented;\n\n    /**\n     * Converts an absolute time to a number\n     * @param {Any} The absolute time.\n     * @returns {Number} The absolute time in ms\n     */\n    VirtualTimeSchedulerPrototype.toAbsoluteTime = notImplemented;\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    VirtualTimeSchedulerPrototype.toRelativeTime = notImplemented;\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be emulated using recursive scheduling.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.schedulePeriodic = function (state, period, action) {\n      var s = new SchedulePeriodicRecursive(this, state, period, action);\n      return s.start();\n    };\n\n    /**\n     * Schedules an action to be executed after dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleRelative = function (state, dueTime, action) {\n      var runAt = this.add(this.clock, dueTime);\n      return this.scheduleAbsolute(state, runAt, action);\n    };\n\n    /**\n     * Starts the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.start = function () {\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n      }\n    };\n\n    /**\n     * Stops the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.stop = function () {\n      this.isEnabled = false;\n    };\n\n    /**\n     * Advances the scheduler's clock to the specified time, running all work till that point.\n     * @param {Number} time Absolute time to advance the scheduler's clock to.\n     */\n    VirtualTimeSchedulerPrototype.advanceTo = function (time) {\n      var dueToClock = this.comparer(this.clock, time);\n      if (this.comparer(this.clock, time) > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) { return; }\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null && this.comparer(next.dueTime, time) <= 0) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n        this.clock = time;\n      }\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.advanceBy = function (time) {\n      var dt = this.add(this.clock, time),\n          dueToClock = this.comparer(this.clock, dt);\n      if (dueToClock > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) {  return; }\n\n      this.advanceTo(dt);\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.sleep = function (time) {\n      var dt = this.add(this.clock, time);\n      if (this.comparer(this.clock, dt) >= 0) { throw new ArgumentOutOfRangeError(); }\n\n      this.clock = dt;\n    };\n\n    /**\n     * Gets the next scheduled item to be executed.\n     * @returns {ScheduledItem} The next scheduled item.\n     */\n    VirtualTimeSchedulerPrototype.getNext = function () {\n      while (this.queue.length > 0) {\n        var next = this.queue.peek();\n        if (next.isCancelled()) {\n          this.queue.dequeue();\n        } else {\n          return next;\n        }\n      }\n      return null;\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleAbsolute = function (state, dueTime, action) {\n      var self = this;\n\n      function run(scheduler, state1) {\n        self.queue.remove(si);\n        return action(scheduler, state1);\n      }\n\n      var si = new ScheduledItem(this, state, run, dueTime, this.comparer);\n      this.queue.enqueue(si);\n\n      return si.disposable;\n    };\n\n    return VirtualTimeScheduler;\n  }(Scheduler));\n\n  /** Provides a virtual time scheduler that uses Date for absolute time and number for relative time. */\n  Rx.HistoricalScheduler = (function (__super__) {\n    inherits(HistoricalScheduler, __super__);\n\n    /**\n     * Creates a new historical scheduler with the specified initial clock value.\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function HistoricalScheduler(initialClock, comparer) {\n      var clock = initialClock == null ? 0 : initialClock;\n      var cmp = comparer || defaultSubComparer;\n      __super__.call(this, clock, cmp);\n    }\n\n    var HistoricalSchedulerProto = HistoricalScheduler.prototype;\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    HistoricalSchedulerProto.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n\n    HistoricalSchedulerProto.toAbsoluteTime = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @memberOf HistoricalScheduler\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    HistoricalSchedulerProto.toRelativeTime = function (timeSpan) {\n      return timeSpan;\n    };\n\n    return HistoricalScheduler;\n  }(Rx.VirtualTimeScheduler));\n\nfunction OnNextPredicate(predicate) {\n    this.predicate = predicate;\n}\n\nOnNextPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'N') { return false; }\n  return this.predicate(other.value);\n};\n\nfunction OnErrorPredicate(predicate) {\n  this.predicate = predicate;\n}\n\nOnErrorPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'E') { return false; }\n  return this.predicate(other.error);\n};\n\nvar ReactiveTest = Rx.ReactiveTest = {\n  /** Default virtual time used for creation of observable sequences in unit tests. */\n  created: 100,\n  /** Default virtual time used to subscribe to observable sequences in unit tests. */\n  subscribed: 200,\n  /** Default virtual time used to dispose subscriptions in unit tests. */\n  disposed: 1000,\n\n  /**\n   * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n   *\n   * 1 - ReactiveTest.onNext(200, 42);\n   * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n   *\n   * @param ticks Recorded virtual time the OnNext notification occurs.\n   * @param value Recorded value stored in the OnNext notification or a predicate.\n   * @return Recorded OnNext notification.\n   */\n  onNext: function (ticks, value) {\n    return typeof value === 'function' ?\n      new Recorded(ticks, new OnNextPredicate(value)) :\n      new Recorded(ticks, Notification.createOnNext(value));\n  },\n  /**\n   * Factory method for an OnError notification record at a given time with a given error.\n   *\n   * 1 - ReactiveTest.onNext(200, new Error('error'));\n   * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n   *\n   * @param ticks Recorded virtual time the OnError notification occurs.\n   * @param exception Recorded exception stored in the OnError notification.\n   * @return Recorded OnError notification.\n   */\n  onError: function (ticks, error) {\n    return typeof error === 'function' ?\n      new Recorded(ticks, new OnErrorPredicate(error)) :\n      new Recorded(ticks, Notification.createOnError(error));\n  },\n  /**\n   * Factory method for an OnCompleted notification record at a given time.\n   *\n   * @param ticks Recorded virtual time the OnCompleted notification occurs.\n   * @return Recorded OnCompleted notification.\n   */\n  onCompleted: function (ticks) {\n    return new Recorded(ticks, Notification.createOnCompleted());\n  },\n  /**\n   * Factory method for a subscription record based on a given subscription and disposal time.\n   *\n   * @param start Virtual time indicating when the subscription was created.\n   * @param end Virtual time indicating when the subscription was disposed.\n   * @return Subscription object.\n   */\n  subscribe: function (start, end) {\n    return new Subscription(start, end);\n  }\n};\n\n  /**\n   * Creates a new object recording the production of the specified value at the given virtual time.\n   *\n   * @constructor\n   * @param {Number} time Virtual time the value was produced on.\n   * @param {Mixed} value Value that was produced.\n   * @param {Function} comparer An optional comparer.\n   */\n  var Recorded = Rx.Recorded = function (time, value, comparer) {\n    this.time = time;\n    this.value = value;\n    this.comparer = comparer || defaultComparer;\n  };\n\n  /**\n   * Checks whether the given recorded object is equal to the current instance.\n   *\n   * @param {Recorded} other Recorded object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Recorded.prototype.equals = function (other) {\n    return this.time === other.time && this.comparer(this.value, other.value);\n  };\n\n  /**\n   * Returns a string representation of the current Recorded value.\n   *\n   * @returns {String} String representation of the current Recorded value.\n   */\n  Recorded.prototype.toString = function () {\n    return this.value.toString() + '@' + this.time;\n  };\n\n  /**\n   * Creates a new subscription object with the given virtual subscription and unsubscription time.\n   *\n   * @constructor\n   * @param {Number} subscribe Virtual time at which the subscription occurred.\n   * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n   */\n  var Subscription = Rx.Subscription = function (start, end) {\n    this.subscribe = start;\n    this.unsubscribe = end || Number.MAX_VALUE;\n  };\n\n  /**\n   * Checks whether the given subscription is equal to the current instance.\n   * @param other Subscription object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Subscription.prototype.equals = function (other) {\n    return this.subscribe === other.subscribe && this.unsubscribe === other.unsubscribe;\n  };\n\n  /**\n   * Returns a string representation of the current Subscription value.\n   * @returns {String} String representation of the current Subscription value.\n   */\n  Subscription.prototype.toString = function () {\n    return '(' + this.subscribe + ', ' + (this.unsubscribe === Number.MAX_VALUE ? 'Infinite' : this.unsubscribe) + ')';\n  };\n\n  var MockDisposable = Rx.MockDisposable = function (scheduler) {\n    this.scheduler = scheduler;\n    this.disposes = [];\n    this.disposes.push(this.scheduler.clock);\n  };\n\n  MockDisposable.prototype.dispose = function () {\n    this.disposes.push(this.scheduler.clock);\n  };\n\n  var MockObserver = (function (__super__) {\n    inherits(MockObserver, __super__);\n\n    function MockObserver(scheduler) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = [];\n    }\n\n    var MockObserverPrototype = MockObserver.prototype;\n\n    MockObserverPrototype.onNext = function (value) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnNext(value)));\n    };\n\n    MockObserverPrototype.onError = function (e) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnError(e)));\n    };\n\n    MockObserverPrototype.onCompleted = function () {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnCompleted()));\n    };\n\n    return MockObserver;\n  })(Observer);\n\n  function MockPromise(scheduler, messages) {\n    var self = this;\n    this.scheduler = scheduler;\n    this.messages = messages;\n    this.subscriptions = [];\n    this.observers = [];\n    for (var i = 0, len = this.messages.length; i < len; i++) {\n      var message = this.messages[i],\n          notification = message.value;\n      (function (innerNotification) {\n        scheduler.scheduleAbsolute(null, message.time, function () {\n          var obs = self.observers.slice(0);\n\n          for (var j = 0, jLen = obs.length; j < jLen; j++) {\n            innerNotification.accept(obs[j]);\n          }\n          return disposableEmpty;\n        });\n      })(notification);\n    }\n  }\n\n  MockPromise.prototype.then = function (onResolved, onRejected) {\n    var self = this;\n\n    this.subscriptions.push(new Subscription(this.scheduler.clock));\n    var index = this.subscriptions.length - 1;\n\n    var newPromise;\n\n    var observer = Rx.Observer.create(\n      function (x) {\n        var retValue = onResolved(x);\n        if (retValue && typeof retValue.then === 'function') {\n          newPromise = retValue;\n        } else {\n          var ticks = self.scheduler.clock;\n          newPromise = new MockPromise(self.scheduler, [Rx.ReactiveTest.onNext(ticks, undefined), Rx.ReactiveTest.onCompleted(ticks)]);\n        }\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      },\n      function (err) {\n        onRejected(err);\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      }\n    );\n    this.observers.push(observer);\n\n    return newPromise || new MockPromise(this.scheduler, this.messages);\n  };\n\n  var HotObservable = (function (__super__) {\n    inherits(HotObservable, __super__);\n\n    function HotObservable(scheduler, messages) {\n      __super__.call(this);\n      var message, notification, observable = this;\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n      this.observers = [];\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          scheduler.scheduleAbsolute(null, message.time, function () {\n            var obs = observable.observers.slice(0);\n\n            for (var j = 0, jLen = obs.length; j < jLen; j++) {\n              innerNotification.accept(obs[j]);\n            }\n            return disposableEmpty;\n          });\n        })(notification);\n      }\n    }\n\n    HotObservable.prototype._subscribe = function (o) {\n      var observable = this;\n      this.observers.push(o);\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      return disposableCreate(function () {\n        var idx = observable.observers.indexOf(o);\n        observable.observers.splice(idx, 1);\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n      });\n    };\n\n    return HotObservable;\n  })(Observable);\n\n  var ColdObservable = (function (__super__) {\n    inherits(ColdObservable, __super__);\n\n    function ColdObservable(scheduler, messages) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n    }\n\n    ColdObservable.prototype._subscribe = function (o) {\n      var message, notification, observable = this;\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      var d = new CompositeDisposable();\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          d.add(observable.scheduler.scheduleRelative(null, message.time, function () {\n            innerNotification.accept(o);\n            return disposableEmpty;\n          }));\n        })(notification);\n      }\n      return disposableCreate(function () {\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n        d.dispose();\n      });\n    };\n\n    return ColdObservable;\n  })(Observable);\n\n  /** Virtual time scheduler used for testing applications and libraries built using Reactive Extensions. */\n  Rx.TestScheduler = (function (__super__) {\n    inherits(TestScheduler, __super__);\n\n    function baseComparer(x, y) {\n      return x > y ? 1 : (x < y ? -1 : 0);\n    }\n\n    function TestScheduler() {\n      __super__.call(this, 0, baseComparer);\n    }\n\n    /**\n     * Schedules an action to be executed at the specified virtual time.\n     *\n     * @param state State passed to the action to be executed.\n     * @param dueTime Absolute virtual time at which to execute the action.\n     * @param action Action to be executed.\n     * @return Disposable object used to cancel the scheduled action (best effort).\n     */\n    TestScheduler.prototype.scheduleAbsolute = function (state, dueTime, action) {\n      dueTime <= this.clock && (dueTime = this.clock + 1);\n      return __super__.prototype.scheduleAbsolute.call(this, state, dueTime, action);\n    };\n    /**\n     * Adds a relative virtual time to an absolute virtual time value.\n     *\n     * @param absolute Absolute virtual time value.\n     * @param relative Relative virtual time value to add.\n     * @return Resulting absolute virtual time sum value.\n     */\n    TestScheduler.prototype.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n    /**\n     * Converts the absolute virtual time value to a DateTimeOffset value.\n     *\n     * @param absolute Absolute virtual time value to convert.\n     * @return Corresponding DateTimeOffset value.\n     */\n    TestScheduler.prototype.toAbsoluteTime = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     *\n     * @param timeSpan TimeSpan value to convert.\n     * @return Corresponding relative virtual time value.\n     */\n    TestScheduler.prototype.toRelativeTime = function (timeSpan) {\n      return timeSpan;\n    };\n    /**\n     * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n     *\n     * @param create Factory method to create an observable sequence.\n     * @param created Virtual time at which to invoke the factory to create an observable sequence.\n     * @param subscribed Virtual time at which to subscribe to the created observable sequence.\n     * @param disposed Virtual time at which to dispose the subscription.\n     * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n     */\n    TestScheduler.prototype.startScheduler = function (createFn, settings) {\n      settings || (settings = {});\n      settings.created == null && (settings.created = ReactiveTest.created);\n      settings.subscribed == null && (settings.subscribed = ReactiveTest.subscribed);\n      settings.disposed == null && (settings.disposed = ReactiveTest.disposed);\n\n      var observer = this.createObserver(), source, subscription;\n\n      this.scheduleAbsolute(null, settings.created, function () {\n        source = createFn();\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.subscribed, function () {\n        subscription = source.subscribe(observer);\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.disposed, function () {\n        subscription.dispose();\n        return disposableEmpty;\n      });\n\n      this.start();\n\n      return observer;\n    };\n\n    /**\n     * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n     * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createHotObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new HotObservable(this, args);\n    };\n\n    /**\n     * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n     * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createColdObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new ColdObservable(this, args);\n    };\n\n    /**\n     * Creates a resolved promise with the given value and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} value The value to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which fulfills with the given value.\n     */\n    TestScheduler.prototype.createResolvedPromise = function (ticks, value) {\n      return new MockPromise(this, [Rx.ReactiveTest.onNext(ticks, value), Rx.ReactiveTest.onCompleted(ticks)]);\n    };\n\n    /**\n     * Creates a rejected promise with the given reason and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} reason The reason for rejection to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which rejects with the given reason.\n     */\n    TestScheduler.prototype.createRejectedPromise = function (ticks, reason) {\n      return new MockPromise(this, [Rx.ReactiveTest.onError(ticks, reason)]);\n    };\n\n    /**\n     * Creates an observer that records received notification messages and timestamps those.\n     * @return Observer that can be used to assert the timing of received notifications.\n     */\n    TestScheduler.prototype.createObserver = function () {\n      return new MockObserver(this);\n    };\n\n    return TestScheduler;\n  })(VirtualTimeScheduler);\n\n  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {\n    inherits(AnonymousObservable, __super__);\n\n    // Fix subscriber to check for undefined or function returned to decorate as Disposable\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.__subscribe).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function AnonymousObservable(subscribe, parent) {\n      this.source = parent;\n      this.__subscribe = subscribe;\n      __super__.call(this);\n    }\n\n    AnonymousObservable.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    return AnonymousObservable;\n\n  }(Observable));\n\n  var AutoDetachObserver = (function (__super__) {\n    inherits(AutoDetachObserver, __super__);\n\n    function AutoDetachObserver(observer) {\n      __super__.call(this);\n      this.observer = observer;\n      this.m = new SingleAssignmentDisposable();\n    }\n\n    var AutoDetachObserverPrototype = AutoDetachObserver.prototype;\n\n    AutoDetachObserverPrototype.next = function (value) {\n      var result = tryCatch(this.observer.onNext).call(this.observer, value);\n      if (result === errorObj) {\n        this.dispose();\n        thrower(result.e);\n      }\n    };\n\n    AutoDetachObserverPrototype.error = function (err) {\n      var result = tryCatch(this.observer.onError).call(this.observer, err);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.completed = function () {\n      var result = tryCatch(this.observer.onCompleted).call(this.observer);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };\n    AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };\n\n    AutoDetachObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.m.dispose();\n    };\n\n    return AutoDetachObserver;\n  }(AbstractObserver));\n\n  var UnderlyingObservable = (function (__super__) {\n    inherits(UnderlyingObservable, __super__);\n    function UnderlyingObservable(m, u) {\n      this._m = m;\n      this._u = u;\n      __super__.call(this);\n    }\n\n    UnderlyingObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(this._m.getDisposable(), this._u.subscribe(o));\n    };\n\n    return UnderlyingObservable;\n  }(ObservableBase));\n\n  var GroupedObservable = (function (__super__) {\n    inherits(GroupedObservable, __super__);\n    function GroupedObservable(key, underlyingObservable, mergedDisposable) {\n      __super__.call(this);\n      this.key = key;\n      this.underlyingObservable = !mergedDisposable ?\n        underlyingObservable :\n        new UnderlyingObservable(mergedDisposable, underlyingObservable);\n    }\n\n    GroupedObservable.prototype._subscribe = function (o) {\n      return this.underlyingObservable.subscribe(o);\n    };\n\n    return GroupedObservable;\n  }(Observable));\n\n  /**\n   *  Represents an object that is both an observable sequence as well as an observer.\n   *  Each notification is broadcasted to all subscribed observers.\n   */\n  var Subject = Rx.Subject = (function (__super__) {\n    inherits(Subject, __super__);\n    function Subject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(Subject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n          return disposableEmpty;\n        }\n        o.onCompleted();\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onCompleted();\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.error = error;\n          this.hasError = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onNext(value);\n          }\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    /**\n     * Creates a subject from the specified observer and observable.\n     * @param {Observer} observer The observer used to send messages to the subject.\n     * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n     * @returns {Subject} Subject implemented using the given observer and observable.\n     */\n    Subject.create = function (observer, observable) {\n      return new AnonymousSubject(observer, observable);\n    };\n\n    return Subject;\n  }(Observable));\n\n  /**\n   *  Represents the result of an asynchronous operation.\n   *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n   */\n  var AsyncSubject = Rx.AsyncSubject = (function (__super__) {\n    inherits(AsyncSubject, __super__);\n\n    /**\n     * Creates a subject that can only receive one value and that value is cached for all future observations.\n     * @constructor\n     */\n    function AsyncSubject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasValue = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(AsyncSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n\n        if (this.hasError) {\n          o.onError(this.error);\n        } else if (this.hasValue) {\n          o.onNext(this.value);\n          o.onCompleted();\n        } else {\n          o.onCompleted();\n        }\n\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n       */\n      onCompleted: function () {\n        var i, len;\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          var os = cloneArray(this.observers), len = os.length;\n\n          if (this.hasValue) {\n            for (i = 0; i < len; i++) {\n              var o = os[i];\n              o.onNext(this.value);\n              o.onCompleted();\n            }\n          } else {\n            for (i = 0; i < len; i++) {\n              os[i].onCompleted();\n            }\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the error.\n       * @param {Mixed} error The Error to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.hasError = true;\n          this.error = error;\n\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n       * @param {Mixed} value The value to store in the subject.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        this.hasValue = true;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.error = null;\n        this.value = null;\n      }\n    });\n\n    return AsyncSubject;\n  }(Observable));\n\n  var AnonymousSubject = Rx.AnonymousSubject = (function (__super__) {\n    inherits(AnonymousSubject, __super__);\n    function AnonymousSubject(observer, observable) {\n      this.observer = observer;\n      this.observable = observable;\n      __super__.call(this);\n    }\n\n    addProperties(AnonymousSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        return this.observable.subscribe(o);\n      },\n      onCompleted: function () {\n        this.observer.onCompleted();\n      },\n      onError: function (error) {\n        this.observer.onError(error);\n      },\n      onNext: function (value) {\n        this.observer.onNext(value);\n      }\n    });\n\n    return AnonymousSubject;\n  }(Observable));\n\n  /**\n   *  Represents a value that changes over time.\n   *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n   */\n  var BehaviorSubject = Rx.BehaviorSubject = (function (__super__) {\n    inherits(BehaviorSubject, __super__);\n    function BehaviorSubject(value) {\n      __super__.call(this);\n      this.value = value;\n      this.observers = [];\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasError = false;\n    }\n\n    addProperties(BehaviorSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          o.onNext(this.value);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n        } else {\n          o.onCompleted();\n        }\n        return disposableEmpty;\n      },\n      /**\n       * Gets the current value or throws an exception.\n       * Value is frozen after onCompleted is called.\n       * After onError is called always throws the specified exception.\n       * An exception is always thrown after dispose is called.\n       * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n       */\n      getValue: function () {\n        checkDisposed(this);\n        if (this.hasError) { thrower(this.error); }\n        return this.value;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onCompleted();\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.hasError = true;\n        this.error = error;\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onError(error);\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onNext(value);\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.value = null;\n        this.error = null;\n      }\n    });\n\n    return BehaviorSubject;\n  }(Observable));\n\n  /**\n   * Represents an object that is both an observable sequence as well as an observer.\n   * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n   */\n  var ReplaySubject = Rx.ReplaySubject = (function (__super__) {\n\n    var maxSafeInteger = Math.pow(2, 53) - 1;\n\n    function createRemovableDisposable(subject, observer) {\n      return disposableCreate(function () {\n        observer.dispose();\n        !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n      });\n    }\n\n    inherits(ReplaySubject, __super__);\n\n    /**\n     *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n     *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n     *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n     *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n     */\n    function ReplaySubject(bufferSize, windowSize, scheduler) {\n      this.bufferSize = bufferSize == null ? maxSafeInteger : bufferSize;\n      this.windowSize = windowSize == null ? maxSafeInteger : windowSize;\n      this.scheduler = scheduler || currentThreadScheduler;\n      this.q = [];\n      this.observers = [];\n      this.isStopped = false;\n      this.isDisposed = false;\n      this.hasError = false;\n      this.error = null;\n      __super__.call(this);\n    }\n\n    addProperties(ReplaySubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        var so = new ScheduledObserver(this.scheduler, o), subscription = createRemovableDisposable(this, so);\n\n        this._trim(this.scheduler.now());\n        this.observers.push(so);\n\n        for (var i = 0, len = this.q.length; i < len; i++) {\n          so.onNext(this.q[i].value);\n        }\n\n        if (this.hasError) {\n          so.onError(this.error);\n        } else if (this.isStopped) {\n          so.onCompleted();\n        }\n\n        so.ensureActive();\n        return subscription;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      _trim: function (now) {\n        while (this.q.length > this.bufferSize) {\n          this.q.shift();\n        }\n        while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {\n          this.q.shift();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        var now = this.scheduler.now();\n        this.q.push({ interval: now, value: value });\n        this._trim(now);\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onNext(value);\n          observer.ensureActive();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.error = error;\n        this.hasError = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onError(error);\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onCompleted();\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    return ReplaySubject;\n  }(Observable));\n\n  /**\n  * Used to pause and resume streams.\n  */\n  Rx.Pauser = (function (__super__) {\n    inherits(Pauser, __super__);\n    function Pauser() {\n      __super__.call(this);\n    }\n\n    /**\n     * Pauses the underlying sequence.\n     */\n    Pauser.prototype.pause = function () { this.onNext(false); };\n\n    /**\n    * Resumes the underlying sequence.\n    */\n    Pauser.prototype.resume = function () { this.onNext(true); };\n\n    return Pauser;\n  }(Subject));\n\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    root.Rx = Rx;\n\n    define(function() {\n      return Rx;\n    });\n  } else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = Rx).Rx = Rx;\n    } else {\n      freeExports.Rx = Rx;\n    }\n  } else {\n    // in a browser or Rhino\n    root.Rx = Rx;\n  }\n\n  // All code before this point will be filtered from stack traces.\n  var rEndingLine = captureLine();\n\n}.call(this));\n"
  },
  {
    "path": "dist/rx.all.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (undefined) {\n\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  var Rx = {\n    internals: {},\n    config: {\n      Promise: root.Promise\n    },\n    helpers: { }\n  };\n\n  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    defaultNow = Rx.helpers.defaultNow = Date.now,\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.subscribe !== 'function' && typeof p.then === 'function'; },\n    isFunction = Rx.helpers.isFunction = (function () {\n\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      };\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n\n      return isFn;\n    }());\n\n  function cloneArray(arr) { for(var a = [], i = 0, len = arr.length; i < len; i++) { a.push(arr[i]); } return a;}\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  Rx.config.longStackSupport = false;\n  var hasStacks = false, stacks = tryCatch(function () { throw new Error(); })();\n  hasStacks = !!stacks.e && !!stacks.e.stack;\n\n  // All code after this point will be filtered from stack traces reported by RxJS\n  var rStartingLine = captureLine(), rFileName;\n\n  var STACK_JUMP_SEPARATOR = 'From previous event:';\n\n  function makeStackTraceLong(error, observable) {\n    // If possible, transform the error stack trace by removing Node and RxJS\n    // cruft, then concatenating with the stack trace of `observable`.\n    if (hasStacks &&\n        observable.stack &&\n        typeof error === 'object' &&\n        error !== null &&\n        error.stack &&\n        error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n    ) {\n      var stacks = [];\n      for (var o = observable; !!o; o = o.source) {\n        if (o.stack) {\n          stacks.unshift(o.stack);\n        }\n      }\n      stacks.unshift(error.stack);\n\n      var concatedStacks = stacks.join('\\n' + STACK_JUMP_SEPARATOR + '\\n');\n      error.stack = filterStackString(concatedStacks);\n    }\n  }\n\n  function filterStackString(stackString) {\n    var lines = stackString.split('\\n'), desiredLines = [];\n    for (var i = 0, len = lines.length; i < len; i++) {\n      var line = lines[i];\n\n      if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n        desiredLines.push(line);\n      }\n    }\n    return desiredLines.join('\\n');\n  }\n\n  function isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n    if (!fileNameAndLineNumber) {\n      return false;\n    }\n    var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === rFileName &&\n      lineNumber >= rStartingLine &&\n      lineNumber <= rEndingLine;\n  }\n\n  function isNodeFrame(stackLine) {\n    return stackLine.indexOf('(module.js:') !== -1 ||\n      stackLine.indexOf('(node.js:') !== -1;\n  }\n\n  function captureLine() {\n    if (!hasStacks) { return; }\n\n    try {\n      throw new Error();\n    } catch (e) {\n      var lines = e.stack.split('\\n');\n      var firstLine = lines[0].indexOf('@') > 0 ? lines[1] : lines[2];\n      var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n      if (!fileNameAndLineNumber) { return; }\n\n      rFileName = fileNameAndLineNumber[0];\n      return fileNameAndLineNumber[1];\n    }\n  }\n\n  function getFileNameAndLineNumber(stackLine) {\n    // Named functions: 'at functionName (filename:lineNumber:columnNumber)'\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }\n\n    // Anonymous functions: 'at filename:lineNumber:columnNumber'\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }\n\n    // Firefox style: 'function@filename:lineNumber or @filename:lineNumber'\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }\n  }\n\n  var EmptyError = Rx.EmptyError = function() {\n    this.message = 'Sequence contains no elements.';\n    Error.call(this);\n  };\n  EmptyError.prototype = Object.create(Error.prototype);\n  EmptyError.prototype.name = 'EmptyError';\n\n  var ObjectDisposedError = Rx.ObjectDisposedError = function() {\n    this.message = 'Object has been disposed';\n    Error.call(this);\n  };\n  ObjectDisposedError.prototype = Object.create(Error.prototype);\n  ObjectDisposedError.prototype.name = 'ObjectDisposedError';\n\n  var ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError = function () {\n    this.message = 'Argument out of range';\n    Error.call(this);\n  };\n  ArgumentOutOfRangeError.prototype = Object.create(Error.prototype);\n  ArgumentOutOfRangeError.prototype.name = 'ArgumentOutOfRangeError';\n\n  var NotSupportedError = Rx.NotSupportedError = function (message) {\n    this.message = message || 'This operation is not supported';\n    Error.call(this);\n  };\n  NotSupportedError.prototype = Object.create(Error.prototype);\n  NotSupportedError.prototype.name = 'NotSupportedError';\n\n  var NotImplementedError = Rx.NotImplementedError = function (message) {\n    this.message = message || 'This operation is not implemented';\n    Error.call(this);\n  };\n  NotImplementedError.prototype = Object.create(Error.prototype);\n  NotImplementedError.prototype.name = 'NotImplementedError';\n\n  var notImplemented = Rx.helpers.notImplemented = function () {\n    throw new NotImplementedError();\n  };\n\n  var notSupported = Rx.helpers.notSupported = function () {\n    throw new NotSupportedError();\n  };\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o && o[$iterator$] !== undefined;\n  };\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  };\n\n  Rx.helpers.iterator = $iterator$;\n\n  var bindCallback = Rx.internals.bindCallback = function (func, thisArg, argCount) {\n    if (typeof thisArg === 'undefined') { return func; }\n    switch(argCount) {\n      case 0:\n        return function() {\n          return func.call(thisArg)\n        };\n      case 1:\n        return function(arg) {\n          return func.call(thisArg, arg);\n        };\n      case 2:\n        return function(value, index) {\n          return func.call(thisArg, value, index);\n        };\n      case 3:\n        return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n    }\n\n    return function() {\n      return func.apply(thisArg, arguments);\n    };\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var dontEnums = ['toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'],\n  dontEnumsLength = dontEnums.length;\n\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\nvar objectProto = Object.prototype,\n    hasOwnProperty = objectProto.hasOwnProperty,\n    objToString = objectProto.toString,\n    MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\nvar keys = Object.keys || (function() {\n    var hasOwnProperty = Object.prototype.hasOwnProperty,\n        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),\n        dontEnums = [\n          'toString',\n          'toLocaleString',\n          'valueOf',\n          'hasOwnProperty',\n          'isPrototypeOf',\n          'propertyIsEnumerable',\n          'constructor'\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    return function(obj) {\n      if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n        throw new TypeError('Object.keys called on non-object');\n      }\n\n      var result = [], prop, i;\n\n      for (prop in obj) {\n        if (hasOwnProperty.call(obj, prop)) {\n          result.push(prop);\n        }\n      }\n\n      if (hasDontEnumBug) {\n        for (i = 0; i < dontEnumsLength; i++) {\n          if (hasOwnProperty.call(obj, dontEnums[i])) {\n            result.push(dontEnums[i]);\n          }\n        }\n      }\n      return result;\n    };\n  }());\n\nfunction equalObjects(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objProps = keys(object),\n      objLength = objProps.length,\n      othProps = keys(other),\n      othLength = othProps.length;\n\n  if (objLength !== othLength && !isLoose) {\n    return false;\n  }\n  var index = objLength, key;\n  while (index--) {\n    key = objProps[index];\n    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  var skipCtor = isLoose;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key],\n        result;\n\n    if (!(result === undefined ? equalFunc(objValue, othValue, isLoose, stackA, stackB) : result)) {\n      return false;\n    }\n    skipCtor || (skipCtor = key === 'constructor');\n  }\n  if (!skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    if (objCtor !== othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor === 'function' && objCtor instanceof objCtor &&\n          typeof othCtor === 'function' && othCtor instanceof othCtor)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction equalByTag(object, other, tag) {\n  switch (tag) {\n    case boolTag:\n    case dateTag:\n      return +object === +other;\n\n    case errorTag:\n      return object.name === other.name && object.message === other.message;\n\n    case numberTag:\n      return (object !== +object) ?\n        other !== +other :\n        object === +other;\n\n    case regexpTag:\n    case stringTag:\n      return object === (other + '');\n  }\n  return false;\n}\n\nvar isObject = Rx.internals.isObject = function(value) {\n  var type = typeof value;\n  return !!value && (type === 'object' || type === 'function');\n};\n\nfunction isObjectLike(value) {\n  return !!value && typeof value === 'object';\n}\n\nfunction isLength(value) {\n  return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nvar isHostObject = (function() {\n  try {\n    Object({ 'toString': 0 } + '');\n  } catch(e) {\n    return function() { return false; };\n  }\n  return function(value) {\n    return typeof value.toString !== 'function' && typeof (value + '') === 'string';\n  };\n}());\n\nfunction isTypedArray(value) {\n  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nvar isArray = Array.isArray || function(value) {\n  return isObjectLike(value) && isLength(value.length) && objToString.call(value) === arrayTag;\n};\n\nfunction arraySome (array, predicate) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction equalArrays(array, other, equalFunc, isLoose, stackA, stackB) {\n  var index = -1,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength !== othLength && !(isLoose && othLength > arrLength)) {\n    return false;\n  }\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index],\n        result;\n\n    if (result !== undefined) {\n      if (result) {\n        continue;\n      }\n      return false;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (isLoose) {\n      if (!arraySome(other, function(othValue) {\n            return arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB);\n          })) {\n        return false;\n      }\n    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB))) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction baseIsEqualDeep(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = arrayTag,\n      othTag = arrayTag;\n\n  if (!objIsArr) {\n    objTag = objToString.call(object);\n    if (objTag === argsTag) {\n      objTag = objectTag;\n    } else if (objTag !== objectTag) {\n      objIsArr = isTypedArray(object);\n    }\n  }\n  if (!othIsArr) {\n    othTag = objToString.call(other);\n    if (othTag === argsTag) {\n      othTag = objectTag;\n    }\n  }\n  var objIsObj = objTag === objectTag && !isHostObject(object),\n      othIsObj = othTag === objectTag && !isHostObject(other),\n      isSameTag = objTag === othTag;\n\n  if (isSameTag && !(objIsArr || objIsObj)) {\n    return equalByTag(object, other, objTag);\n  }\n  if (!isLoose) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, isLoose, stackA, stackB);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  // For more information on detecting circular references see https://es5.github.io/#JO.\n  stackA || (stackA = []);\n  stackB || (stackB = []);\n\n  var length = stackA.length;\n  while (length--) {\n    if (stackA[length] === object) {\n      return stackB[length] === other;\n    }\n  }\n  // Add `object` and `other` to the stack of traversed objects.\n  stackA.push(object);\n  stackB.push(other);\n\n  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, isLoose, stackA, stackB);\n\n  stackA.pop();\n  stackB.pop();\n\n  return result;\n}\n\nfunction baseIsEqual(value, other, isLoose, stackA, stackB) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, baseIsEqual, isLoose, stackA, stackB);\n}\n\nvar isEqual = Rx.internals.isEqual = function (value, other) {\n  return baseIsEqual(value, other);\n};\n\n  var hasProp = {}.hasOwnProperty,\n      slice = Array.prototype.slice;\n\n  var inherits = Rx.internals.inherits = function (child, parent) {\n    function __() { this.constructor = child; }\n    __.prototype = parent.prototype;\n    child.prototype = new __();\n  };\n\n  var addProperties = Rx.internals.addProperties = function (obj) {\n    for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n      var source = sources[idx];\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n  };\n\n  // Rx Utils\n  var addRef = Rx.internals.addRef = function (xs, r) {\n    return new AnonymousObservable(function (observer) {\n      return new BinaryDisposable(r.getDisposable(), xs.subscribe(observer));\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n\n  function IndexedItem(id, value) {\n    this.id = id;\n    this.value = value;\n  }\n\n  IndexedItem.prototype.compareTo = function (other) {\n    var c = this.value.compareTo(other.value);\n    c === 0 && (c = this.id - other.id);\n    return c;\n  };\n\n  var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) {\n    this.items = new Array(capacity);\n    this.length = 0;\n  };\n\n  var priorityProto = PriorityQueue.prototype;\n  priorityProto.isHigherPriority = function (left, right) {\n    return this.items[left].compareTo(this.items[right]) < 0;\n  };\n\n  priorityProto.percolate = function (index) {\n    if (index >= this.length || index < 0) { return; }\n    var parent = index - 1 >> 1;\n    if (parent < 0 || parent === index) { return; }\n    if (this.isHigherPriority(index, parent)) {\n      var temp = this.items[index];\n      this.items[index] = this.items[parent];\n      this.items[parent] = temp;\n      this.percolate(parent);\n    }\n  };\n\n  priorityProto.heapify = function (index) {\n    +index || (index = 0);\n    if (index >= this.length || index < 0) { return; }\n    var left = 2 * index + 1,\n        right = 2 * index + 2,\n        first = index;\n    if (left < this.length && this.isHigherPriority(left, first)) {\n      first = left;\n    }\n    if (right < this.length && this.isHigherPriority(right, first)) {\n      first = right;\n    }\n    if (first !== index) {\n      var temp = this.items[index];\n      this.items[index] = this.items[first];\n      this.items[first] = temp;\n      this.heapify(first);\n    }\n  };\n\n  priorityProto.peek = function () { return this.items[0].value; };\n\n  priorityProto.removeAt = function (index) {\n    this.items[index] = this.items[--this.length];\n    this.items[this.length] = undefined;\n    this.heapify();\n  };\n\n  priorityProto.dequeue = function () {\n    var result = this.peek();\n    this.removeAt(0);\n    return result;\n  };\n\n  priorityProto.enqueue = function (item) {\n    var index = this.length++;\n    this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n    this.percolate(index);\n  };\n\n  priorityProto.remove = function (item) {\n    for (var i = 0; i < this.length; i++) {\n      if (this.items[i].value === item) {\n        this.removeAt(i);\n        return true;\n      }\n    }\n    return false;\n  };\n  PriorityQueue.count = 0;\n\n  /**\n   * Represents a group of disposable resources that are disposed together.\n   * @constructor\n   */\n  var CompositeDisposable = Rx.CompositeDisposable = function () {\n    var args = [], i, len;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      len = arguments.length;\n      args = new Array(len);\n      for(i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    this.disposables = args;\n    this.isDisposed = false;\n    this.length = args.length;\n  };\n\n  var CompositeDisposablePrototype = CompositeDisposable.prototype;\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Mixed} item Disposable to add.\n   */\n  CompositeDisposablePrototype.add = function (item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n      this.length++;\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Mixed} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n  CompositeDisposablePrototype.remove = function (item) {\n    var shouldDispose = false;\n    if (!this.isDisposed) {\n      var idx = this.disposables.indexOf(item);\n      if (idx !== -1) {\n        shouldDispose = true;\n        this.disposables.splice(idx, 1);\n        this.length--;\n        item.dispose();\n      }\n    }\n    return shouldDispose;\n  };\n\n  /**\n   *  Disposes all disposables in the group and removes them from the group.\n   */\n  CompositeDisposablePrototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var len = this.disposables.length, currentDisposables = new Array(len);\n      for(var i = 0; i < len; i++) { currentDisposables[i] = this.disposables[i]; }\n      this.disposables = [];\n      this.length = 0;\n\n      for (i = 0; i < len; i++) {\n        currentDisposables[i].dispose();\n      }\n    }\n  };\n\n  /**\n   * Provides a set of static methods for creating Disposables.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   */\n  var Disposable = Rx.Disposable = function (action) {\n    this.isDisposed = false;\n    this.action = action || noop;\n  };\n\n  /** Performs the task of cleaning up resources. */\n  Disposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.action();\n      this.isDisposed = true;\n    }\n  };\n\n  /**\n   * Creates a disposable object that invokes the specified action when disposed.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   * @return {Disposable} The disposable object that runs the given action upon disposal.\n   */\n  var disposableCreate = Disposable.create = function (action) { return new Disposable(action); };\n\n  /**\n   * Gets the disposable that does nothing when disposed.\n   */\n  var disposableEmpty = Disposable.empty = { dispose: noop };\n\n  /**\n   * Validates whether the given object is a disposable\n   * @param {Object} Object to test whether it has a dispose method\n   * @returns {Boolean} true if a disposable object, else false.\n   */\n  var isDisposable = Disposable.isDisposable = function (d) {\n    return d && isFunction(d.dispose);\n  };\n\n  var checkDisposed = Disposable.checkDisposed = function (disposable) {\n    if (disposable.isDisposed) { throw new ObjectDisposedError(); }\n  };\n\n  var disposableFixup = Disposable._fixup = function (result) {\n    return isDisposable(result) ? result : disposableEmpty;\n  };\n\n  // Single assignment\n  var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SingleAssignmentDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SingleAssignmentDisposable.prototype.setDisposable = function (value) {\n    if (this.current) { throw new Error('Disposable has already been assigned'); }\n    var shouldDispose = this.isDisposed;\n    !shouldDispose && (this.current = value);\n    shouldDispose && value && value.dispose();\n  };\n  SingleAssignmentDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n      old && old.dispose();\n    }\n  };\n\n  // Multiple assignment disposable\n  var SerialDisposable = Rx.SerialDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SerialDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SerialDisposable.prototype.setDisposable = function (value) {\n    var shouldDispose = this.isDisposed;\n    if (!shouldDispose) {\n      var old = this.current;\n      this.current = value;\n    }\n    old && old.dispose();\n    shouldDispose && value && value.dispose();\n  };\n  SerialDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n    }\n    old && old.dispose();\n  };\n\n  var BinaryDisposable = Rx.BinaryDisposable = function (first, second) {\n    this._first = first;\n    this._second = second;\n    this.isDisposed = false;\n  };\n\n  BinaryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old1 = this._first;\n      this._first = null;\n      old1 && old1.dispose();\n      var old2 = this._second;\n      this._second = null;\n      old2 && old2.dispose();\n    }\n  };\n\n  var NAryDisposable = Rx.NAryDisposable = function (disposables) {\n    this._disposables = disposables;\n    this.isDisposed = false;\n  };\n\n  NAryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      for (var i = 0, len = this._disposables.length; i < len; i++) {\n        this._disposables[i].dispose();\n      }\n      this._disposables.length = 0;\n    }\n  };\n\n  /**\n   * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n   */\n  var RefCountDisposable = Rx.RefCountDisposable = (function () {\n\n    function InnerDisposable(disposable) {\n      this.disposable = disposable;\n      this.disposable.count++;\n      this.isInnerDisposed = false;\n    }\n\n    InnerDisposable.prototype.dispose = function () {\n      if (!this.disposable.isDisposed && !this.isInnerDisposed) {\n        this.isInnerDisposed = true;\n        this.disposable.count--;\n        if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {\n          this.disposable.isDisposed = true;\n          this.disposable.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Initializes a new instance of the RefCountDisposable with the specified disposable.\n     * @constructor\n     * @param {Disposable} disposable Underlying disposable.\n      */\n    function RefCountDisposable(disposable) {\n      this.underlyingDisposable = disposable;\n      this.isDisposed = false;\n      this.isPrimaryDisposed = false;\n      this.count = 0;\n    }\n\n    /**\n     * Disposes the underlying disposable only when all dependent disposables have been disposed\n     */\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed && !this.isPrimaryDisposed) {\n        this.isPrimaryDisposed = true;\n        if (this.count === 0) {\n          this.isDisposed = true;\n          this.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n     * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n     */\n    RefCountDisposable.prototype.getDisposable = function () {\n      return this.isDisposed ? disposableEmpty : new InnerDisposable(this);\n    };\n\n    return RefCountDisposable;\n  })();\n\n  function ScheduledDisposable(scheduler, disposable) {\n    this.scheduler = scheduler;\n    this.disposable = disposable;\n    this.isDisposed = false;\n  }\n\n  function scheduleItem(s, self) {\n    if (!self.isDisposed) {\n      self.isDisposed = true;\n      self.disposable.dispose();\n    }\n  }\n\n  ScheduledDisposable.prototype.dispose = function () {\n    this.scheduler.schedule(this, scheduleItem);\n  };\n\n  var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) {\n    this.scheduler = scheduler;\n    this.state = state;\n    this.action = action;\n    this.dueTime = dueTime;\n    this.comparer = comparer || defaultSubComparer;\n    this.disposable = new SingleAssignmentDisposable();\n  };\n\n  ScheduledItem.prototype.invoke = function () {\n    this.disposable.setDisposable(this.invokeCore());\n  };\n\n  ScheduledItem.prototype.compareTo = function (other) {\n    return this.comparer(this.dueTime, other.dueTime);\n  };\n\n  ScheduledItem.prototype.isCancelled = function () {\n    return this.disposable.isDisposed;\n  };\n\n  ScheduledItem.prototype.invokeCore = function () {\n    return disposableFixup(this.action(this.scheduler, this.state));\n  };\n\n  /** Provides a set of static properties to access commonly used schedulers. */\n  var Scheduler = Rx.Scheduler = (function () {\n\n    function Scheduler() { }\n\n    /** Determines whether the given object is a scheduler */\n    Scheduler.isScheduler = function (s) {\n      return s instanceof Scheduler;\n    };\n\n    var schedulerProto = Scheduler.prototype;\n\n    /**\n   * Schedules an action to be executed.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.schedule = function (state, action) {\n      throw new NotImplementedError();\n    };\n\n  /**\n   * Schedules an action to be executed after dueTime.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @param {Number} dueTime Relative time after which to execute the action.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime;\n      dt instanceof Date && (dt = dt - this.now());\n      dt = Scheduler.normalize(dt);\n\n      if (dt === 0) { return this.schedule(state, action); }\n\n      return this._scheduleFuture(state, dt, action);\n    };\n\n    schedulerProto._scheduleFuture = function (state, dueTime, action) {\n      throw new NotImplementedError();\n    };\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.now = defaultNow;\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.prototype.now = defaultNow;\n\n    /**\n     * Normalizes the specified TimeSpan value to a positive value.\n     * @param {Number} timeSpan The time span value to normalize.\n     * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n     */\n    Scheduler.normalize = function (timeSpan) {\n      timeSpan < 0 && (timeSpan = 0);\n      return timeSpan;\n    };\n\n    return Scheduler;\n  }());\n\n  var normalizeTime = Scheduler.normalize, isScheduler = Scheduler.isScheduler;\n\n  (function (schedulerProto) {\n\n    function invokeRecImmediate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.schedule(state2, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    function invokeRecDate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2, dueTime1) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.scheduleFuture(state2, dueTime1, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursive = function (state, action) {\n      return this.schedule([state, action], invokeRecImmediate);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative or absolute due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number | Date} dueTime Relative or absolute time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveFuture = function (state, dueTime, action) {\n      return this.scheduleFuture([state, action], dueTime, invokeRecDate);\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    schedulerProto.schedulePeriodic = function(state, period, action) {\n      if (typeof root.setInterval === 'undefined') { throw new NotSupportedError(); }\n      period = normalizeTime(period);\n      var s = state, id = root.setInterval(function () { s = action(s); }, period);\n      return disposableCreate(function () { root.clearInterval(id); });\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n    /**\n     * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n     * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n     * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n     */\n    schedulerProto.catchError = schedulerProto['catch'] = function (handler) {\n      return new CatchScheduler(this, handler);\n    };\n  }(Scheduler.prototype));\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function createTick(self) {\n      return function tick(command, recurse) {\n        recurse(0, self._period);\n        var state = tryCatch(self._action)(self._state);\n        if (state === errorObj) {\n          self._cancel.dispose();\n          thrower(state.e);\n        }\n        self._state = state;\n      };\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveFuture(0, this._period, createTick(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  /** Gets a scheduler that schedules work immediately on the current thread. */\n   var ImmediateScheduler = (function (__super__) {\n    inherits(ImmediateScheduler, __super__);\n    function ImmediateScheduler() {\n      __super__.call(this);\n    }\n\n    ImmediateScheduler.prototype.schedule = function (state, action) {\n      return disposableFixup(action(this, state));\n    };\n\n    return ImmediateScheduler;\n  }(Scheduler));\n\n  var immediateScheduler = Scheduler.immediate = new ImmediateScheduler();\n\n  /**\n   * Gets a scheduler that schedules work as soon as possible on the current thread.\n   */\n  var CurrentThreadScheduler = (function (__super__) {\n    var queue;\n\n    function runTrampoline () {\n      while (queue.length > 0) {\n        var item = queue.dequeue();\n        !item.isCancelled() && item.invoke();\n      }\n    }\n\n    inherits(CurrentThreadScheduler, __super__);\n    function CurrentThreadScheduler() {\n      __super__.call(this);\n    }\n\n    CurrentThreadScheduler.prototype.schedule = function (state, action) {\n      var si = new ScheduledItem(this, state, action, this.now());\n\n      if (!queue) {\n        queue = new PriorityQueue(4);\n        queue.enqueue(si);\n\n        var result = tryCatch(runTrampoline)();\n        queue = null;\n        if (result === errorObj) { thrower(result.e); }\n      } else {\n        queue.enqueue(si);\n      }\n      return si.disposable;\n    };\n\n    CurrentThreadScheduler.prototype.scheduleRequired = function () { return !queue; };\n\n    return CurrentThreadScheduler;\n  }(Scheduler));\n\n  var currentThreadScheduler = Scheduler.currentThread = new CurrentThreadScheduler();\n\n  var scheduleMethod, clearMethod;\n\n  var localTimer = (function () {\n    var localSetTimeout, localClearTimeout = noop;\n    if (!!root.setTimeout) {\n      localSetTimeout = root.setTimeout;\n      localClearTimeout = root.clearTimeout;\n    } else if (!!root.WScript) {\n      localSetTimeout = function (fn, time) {\n        root.WScript.Sleep(time);\n        fn();\n      };\n    } else {\n      throw new NotSupportedError();\n    }\n\n    return {\n      setTimeout: localSetTimeout,\n      clearTimeout: localClearTimeout\n    };\n  }());\n  var localSetTimeout = localTimer.setTimeout,\n    localClearTimeout = localTimer.clearTimeout;\n\n  (function () {\n\n    var nextHandle = 1, tasksByHandle = {}, currentlyRunning = false;\n\n    clearMethod = function (handle) {\n      delete tasksByHandle[handle];\n    };\n\n    function runTask(handle) {\n      if (currentlyRunning) {\n        localSetTimeout(function () { runTask(handle); }, 0);\n      } else {\n        var task = tasksByHandle[handle];\n        if (task) {\n          currentlyRunning = true;\n          var result = tryCatch(task)();\n          clearMethod(handle);\n          currentlyRunning = false;\n          if (result === errorObj) { thrower(result.e); }\n        }\n      }\n    }\n\n    var reNative = new RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&\n      !reNative.test(setImmediate) && setImmediate;\n\n    function postMessageSupported () {\n      // Ensure not in a worker\n      if (!root.postMessage || root.importScripts) { return false; }\n      var isAsync = false, oldHandler = root.onmessage;\n      // Test for async\n      root.onmessage = function () { isAsync = true; };\n      root.postMessage('', '*');\n      root.onmessage = oldHandler;\n\n      return isAsync;\n    }\n\n    // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n    if (isFunction(setImmediate)) {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        setImmediate(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        process.nextTick(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (postMessageSupported()) {\n      var MSG_PREFIX = 'ms.rx.schedule' + Math.random();\n\n      var onGlobalPostMessage = function (event) {\n        // Only if we're a match to avoid any other global events\n        if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n          runTask(event.data.substring(MSG_PREFIX.length));\n        }\n      };\n\n      root.addEventListener('message', onGlobalPostMessage, false);\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        root.postMessage(MSG_PREFIX + id, '*');\n        return id;\n      };\n    } else if (!!root.MessageChannel) {\n      var channel = new root.MessageChannel();\n\n      channel.port1.onmessage = function (e) { runTask(e.data); };\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        channel.port2.postMessage(id);\n        return id;\n      };\n    } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {\n\n      scheduleMethod = function (action) {\n        var scriptElement = root.document.createElement('script');\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n\n        scriptElement.onreadystatechange = function () {\n          runTask(id);\n          scriptElement.onreadystatechange = null;\n          scriptElement.parentNode.removeChild(scriptElement);\n          scriptElement = null;\n        };\n        root.document.documentElement.appendChild(scriptElement);\n        return id;\n      };\n\n    } else {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        localSetTimeout(function () {\n          runTask(id);\n        }, 0);\n\n        return id;\n      };\n    }\n  }());\n\n  /**\n   * Gets a scheduler that schedules work via a timed callback based upon platform.\n   */\n   var DefaultScheduler = (function (__super__) {\n     inherits(DefaultScheduler, __super__);\n     function DefaultScheduler() {\n       __super__.call(this);\n     }\n\n     function scheduleAction(disposable, action, scheduler, state) {\n       return function schedule() {\n         disposable.setDisposable(Disposable._fixup(action(scheduler, state)));\n       };\n     }\n\n     function ClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     ClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         clearMethod(this._id);\n       }\n     };\n\n     function LocalClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     LocalClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         localClearTimeout(this._id);\n       }\n     };\n\n    DefaultScheduler.prototype.schedule = function (state, action) {\n      var disposable = new SingleAssignmentDisposable(),\n          id = scheduleMethod(scheduleAction(disposable, action, this, state));\n      return new BinaryDisposable(disposable, new ClearDisposable(id));\n    };\n\n    DefaultScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      if (dueTime === 0) { return this.schedule(state, action); }\n      var disposable = new SingleAssignmentDisposable(),\n          id = localSetTimeout(scheduleAction(disposable, action, this, state), dueTime);\n      return new BinaryDisposable(disposable, new LocalClearDisposable(id));\n    };\n\n    function scheduleLongRunning(state, action, disposable) {\n      return function () { action(state, disposable); };\n    }\n\n    DefaultScheduler.prototype.scheduleLongRunning = function (state, action) {\n      var disposable = disposableCreate(noop);\n      scheduleMethod(scheduleLongRunning(state, action, disposable));\n      return disposable;\n    };\n\n    return DefaultScheduler;\n  }(Scheduler));\n\n  var defaultScheduler = Scheduler['default'] = Scheduler.async = new DefaultScheduler();\n\n  var CatchScheduler = (function (__super__) {\n    inherits(CatchScheduler, __super__);\n\n    function CatchScheduler(scheduler, handler) {\n      this._scheduler = scheduler;\n      this._handler = handler;\n      this._recursiveOriginal = null;\n      this._recursiveWrapper = null;\n      __super__.call(this);\n    }\n\n    CatchScheduler.prototype.schedule = function (state, action) {\n      return this._scheduler.schedule(state, this._wrap(action));\n    };\n\n    CatchScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      return this._scheduler.schedule(state, dueTime, this._wrap(action));\n    };\n\n    CatchScheduler.prototype.now = function () { return this._scheduler.now(); };\n\n    CatchScheduler.prototype._clone = function (scheduler) {\n        return new CatchScheduler(scheduler, this._handler);\n    };\n\n    CatchScheduler.prototype._wrap = function (action) {\n      var parent = this;\n      return function (self, state) {\n        var res = tryCatch(action)(parent._getRecursiveWrapper(self), state);\n        if (res === errorObj) {\n          if (!parent._handler(res.e)) { thrower(res.e); }\n          return disposableEmpty;\n        }\n        return disposableFixup(res);\n      };\n    };\n\n    CatchScheduler.prototype._getRecursiveWrapper = function (scheduler) {\n      if (this._recursiveOriginal !== scheduler) {\n        this._recursiveOriginal = scheduler;\n        var wrapper = this._clone(scheduler);\n        wrapper._recursiveOriginal = scheduler;\n        wrapper._recursiveWrapper = wrapper;\n        this._recursiveWrapper = wrapper;\n      }\n      return this._recursiveWrapper;\n    };\n\n    CatchScheduler.prototype.schedulePeriodic = function (state, period, action) {\n      var self = this, failed = false, d = new SingleAssignmentDisposable();\n\n      d.setDisposable(this._scheduler.schedulePeriodic(state, period, function (state1) {\n        if (failed) { return null; }\n        var res = tryCatch(action)(state1);\n        if (res === errorObj) {\n          failed = true;\n          if (!self._handler(res.e)) { thrower(res.e); }\n          d.dispose();\n          return null;\n        }\n        return res;\n      }));\n\n      return d;\n    };\n\n    return CatchScheduler;\n  }(Scheduler));\n\n  /**\n   *  Represents a notification to an observer.\n   */\n  var Notification = Rx.Notification = (function () {\n    function Notification() {\n\n    }\n\n    Notification.prototype._accept = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    Notification.prototype._acceptObserver = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    /**\n     * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n     * @param {Function | Observer} observerOrOnNext Function to invoke for an OnNext notification or Observer to invoke the notification on..\n     * @param {Function} onError Function to invoke for an OnError notification.\n     * @param {Function} onCompleted Function to invoke for an OnCompleted notification.\n     * @returns {Any} Result produced by the observation.\n     */\n    Notification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n      return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n        this._acceptObserver(observerOrOnNext) :\n        this._accept(observerOrOnNext, onError, onCompleted);\n    };\n\n    /**\n     * Returns an observable sequence with a single notification.\n     *\n     * @memberOf Notifications\n     * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n     * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n     */\n    Notification.prototype.toObservable = function (scheduler) {\n      var self = this;\n      isScheduler(scheduler) || (scheduler = immediateScheduler);\n      return new AnonymousObservable(function (o) {\n        return scheduler.schedule(self, function (_, notification) {\n          notification._acceptObserver(o);\n          notification.kind === 'N' && o.onCompleted();\n        });\n      });\n    };\n\n    return Notification;\n  })();\n\n  var OnNextNotification = (function (__super__) {\n    inherits(OnNextNotification, __super__);\n    function OnNextNotification(value) {\n      this.value = value;\n      this.kind = 'N';\n    }\n\n    OnNextNotification.prototype._accept = function (onNext) {\n      return onNext(this.value);\n    };\n\n    OnNextNotification.prototype._acceptObserver = function (o) {\n      return o.onNext(this.value);\n    };\n\n    OnNextNotification.prototype.toString = function () {\n      return 'OnNext(' + this.value + ')';\n    };\n\n    return OnNextNotification;\n  }(Notification));\n\n  var OnErrorNotification = (function (__super__) {\n    inherits(OnErrorNotification, __super__);\n    function OnErrorNotification(error) {\n      this.error = error;\n      this.kind = 'E';\n    }\n\n    OnErrorNotification.prototype._accept = function (onNext, onError) {\n      return onError(this.error);\n    };\n\n    OnErrorNotification.prototype._acceptObserver = function (o) {\n      return o.onError(this.error);\n    };\n\n    OnErrorNotification.prototype.toString = function () {\n      return 'OnError(' + this.error + ')';\n    };\n\n    return OnErrorNotification;\n  }(Notification));\n\n  var OnCompletedNotification = (function (__super__) {\n    inherits(OnCompletedNotification, __super__);\n    function OnCompletedNotification() {\n      this.kind = 'C';\n    }\n\n    OnCompletedNotification.prototype._accept = function (onNext, onError, onCompleted) {\n      return onCompleted();\n    };\n\n    OnCompletedNotification.prototype._acceptObserver = function (o) {\n      return o.onCompleted();\n    };\n\n    OnCompletedNotification.prototype.toString = function () {\n      return 'OnCompleted()';\n    };\n\n    return OnCompletedNotification;\n  }(Notification));\n\n  /**\n   * Creates an object that represents an OnNext notification to an observer.\n   * @param {Any} value The value contained in the notification.\n   * @returns {Notification} The OnNext notification containing the value.\n   */\n  var notificationCreateOnNext = Notification.createOnNext = function (value) {\n    return new OnNextNotification(value);\n  };\n\n  /**\n   * Creates an object that represents an OnError notification to an observer.\n   * @param {Any} error The exception contained in the notification.\n   * @returns {Notification} The OnError notification containing the exception.\n   */\n  var notificationCreateOnError = Notification.createOnError = function (error) {\n    return new OnErrorNotification(error);\n  };\n\n  /**\n   * Creates an object that represents an OnCompleted notification to an observer.\n   * @returns {Notification} The OnCompleted notification.\n   */\n  var notificationCreateOnCompleted = Notification.createOnCompleted = function () {\n    return new OnCompletedNotification();\n  };\n\n  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates a notification callback from an observer.\n   * @returns The action that forwards its input notification to the underlying observer.\n   */\n  Observer.prototype.toNotifier = function () {\n    var observer = this;\n    return function (n) { return n.accept(observer); };\n  };\n\n  /**\n   *  Hides the identity of an observer.\n   * @returns An observer that hides the identity of the specified observer.\n   */\n  Observer.prototype.asObserver = function () {\n    var self = this;\n    return new AnonymousObserver(\n      function (x) { self.onNext(x); },\n      function (err) { self.onError(err); },\n      function () { self.onCompleted(); });\n  };\n\n  /**\n   *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n   *  If a violation is detected, an Error is thrown from the offending observer method call.\n   * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n   */\n  Observer.prototype.checked = function () { return new CheckedObserver(this); };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n\n  /**\n   *  Creates an observer from a notification callback.\n   * @param {Function} handler Action that handles a notification.\n   * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n   */\n  Observer.fromNotifier = function (handler, thisArg) {\n    var cb = bindCallback(handler, thisArg, 1);\n    return new AnonymousObserver(function (x) {\n      return cb(notificationCreateOnNext(x));\n    }, function (e) {\n      return cb(notificationCreateOnError(e));\n    }, function () {\n      return cb(notificationCreateOnCompleted());\n    });\n  };\n\n  /**\n   * Schedules the invocation of observer methods on the given scheduler.\n   * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n   * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n   */\n  Observer.prototype.notifyOn = function (scheduler) {\n    return new ObserveOnObserver(scheduler, this);\n  };\n\n  Observer.prototype.makeSafe = function(disposable) {\n    return new AnonymousSafeObserver(this._onNext, this._onError, this._onCompleted, disposable);\n  };\n\n  /**\n   * Abstract base class for implementations of the Observer class.\n   * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n   */\n  var AbstractObserver = Rx.internals.AbstractObserver = (function (__super__) {\n    inherits(AbstractObserver, __super__);\n\n    /**\n     * Creates a new observer in a non-stopped state.\n     */\n    function AbstractObserver() {\n      this.isStopped = false;\n    }\n\n    // Must be implemented by other observers\n    AbstractObserver.prototype.next = notImplemented;\n    AbstractObserver.prototype.error = notImplemented;\n    AbstractObserver.prototype.completed = notImplemented;\n\n    /**\n     * Notifies the observer of a new element in the sequence.\n     * @param {Any} value Next element in the sequence.\n     */\n    AbstractObserver.prototype.onNext = function (value) {\n      !this.isStopped && this.next(value);\n    };\n\n    /**\n     * Notifies the observer that an exception has occurred.\n     * @param {Any} error The error that has occurred.\n     */\n    AbstractObserver.prototype.onError = function (error) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(error);\n      }\n    };\n\n    /**\n     * Notifies the observer of the end of the sequence.\n     */\n    AbstractObserver.prototype.onCompleted = function () {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.completed();\n      }\n    };\n\n    /**\n     * Disposes the observer, causing it to transition to the stopped state.\n     */\n    AbstractObserver.prototype.dispose = function () { this.isStopped = true; };\n\n    AbstractObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return AbstractObserver;\n  }(Observer));\n\n  /**\n   * Class to create an Observer instance from delegate-based implementations of the on* methods.\n   */\n  var AnonymousObserver = Rx.AnonymousObserver = (function (__super__) {\n    inherits(AnonymousObserver, __super__);\n\n    /**\n     * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n     * @param {Any} onNext Observer's OnNext action implementation.\n     * @param {Any} onError Observer's OnError action implementation.\n     * @param {Any} onCompleted Observer's OnCompleted action implementation.\n     */\n    function AnonymousObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    /**\n     * Calls the onNext action.\n     * @param {Any} value Next element in the sequence.\n     */\n    AnonymousObserver.prototype.next = function (value) {\n      this._onNext(value);\n    };\n\n    /**\n     * Calls the onError action.\n     * @param {Any} error The error that has occurred.\n     */\n    AnonymousObserver.prototype.error = function (error) {\n      this._onError(error);\n    };\n\n    /**\n     *  Calls the onCompleted action.\n     */\n    AnonymousObserver.prototype.completed = function () {\n      this._onCompleted();\n    };\n\n    return AnonymousObserver;\n  }(AbstractObserver));\n\n  var CheckedObserver = (function (__super__) {\n    inherits(CheckedObserver, __super__);\n\n    function CheckedObserver(observer) {\n      __super__.call(this);\n      this._observer = observer;\n      this._state = 0; // 0 - idle, 1 - busy, 2 - done\n    }\n\n    var CheckedObserverPrototype = CheckedObserver.prototype;\n\n    CheckedObserverPrototype.onNext = function (value) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onNext).call(this._observer, value);\n      this._state = 0;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onError = function (err) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onError).call(this._observer, err);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onCompleted = function () {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onCompleted).call(this._observer);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.checkAccess = function () {\n      if (this._state === 1) { throw new Error('Re-entrancy detected'); }\n      if (this._state === 2) { throw new Error('Observer completed'); }\n      if (this._state === 0) { this._state = 1; }\n    };\n\n    return CheckedObserver;\n  }(Observer));\n\n  var ScheduledObserver = Rx.internals.ScheduledObserver = (function (__super__) {\n    inherits(ScheduledObserver, __super__);\n\n    function ScheduledObserver(scheduler, observer) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.observer = observer;\n      this.isAcquired = false;\n      this.hasFaulted = false;\n      this.queue = [];\n      this.disposable = new SerialDisposable();\n    }\n\n    function enqueueNext(observer, x) { return function () { observer.onNext(x); }; }\n    function enqueueError(observer, e) { return function () { observer.onError(e); }; }\n    function enqueueCompleted(observer) { return function () { observer.onCompleted(); }; }\n\n    ScheduledObserver.prototype.next = function (x) {\n      this.queue.push(enqueueNext(this.observer, x));\n    };\n\n    ScheduledObserver.prototype.error = function (e) {\n      this.queue.push(enqueueError(this.observer, e));\n    };\n\n    ScheduledObserver.prototype.completed = function () {\n      this.queue.push(enqueueCompleted(this.observer));\n    };\n\n\n    function scheduleMethod(state, recurse) {\n      var work;\n      if (state.queue.length > 0) {\n        work = state.queue.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var res = tryCatch(work)();\n      if (res === errorObj) {\n        state.queue = [];\n        state.hasFaulted = true;\n        return thrower(res.e);\n      }\n      recurse(state);\n    }\n\n    ScheduledObserver.prototype.ensureActive = function () {\n      var isOwner = false;\n      if (!this.hasFaulted && this.queue.length > 0) {\n        isOwner = !this.isAcquired;\n        this.isAcquired = true;\n      }\n      isOwner &&\n        this.disposable.setDisposable(this.scheduler.scheduleRecursive(this, scheduleMethod));\n    };\n\n    ScheduledObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.disposable.dispose();\n    };\n\n    return ScheduledObserver;\n  }(AbstractObserver));\n\n  var ObserveOnObserver = (function (__super__) {\n    inherits(ObserveOnObserver, __super__);\n\n    function ObserveOnObserver(scheduler, observer, cancel) {\n      __super__.call(this, scheduler, observer);\n      this._cancel = cancel;\n    }\n\n    ObserveOnObserver.prototype.next = function (value) {\n      __super__.prototype.next.call(this, value);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.error = function (e) {\n      __super__.prototype.error.call(this, e);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.completed = function () {\n      __super__.prototype.completed.call(this);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this._cancel && this._cancel.dispose();\n      this._cancel = null;\n    };\n\n    return ObserveOnObserver;\n  })(ScheduledObserver);\n\n  var observableProto;\n\n  /**\n   * Represents a push-style collection.\n   */\n  var Observable = Rx.Observable = (function () {\n\n    function makeSubscribe(self, subscribe) {\n      return function (o) {\n        var oldOnError = o.onError;\n        o.onError = function (e) {\n          makeStackTraceLong(e, self);\n          oldOnError.call(o, e);\n        };\n\n        return subscribe.call(self, o);\n      };\n    }\n\n    function Observable() {\n      if (Rx.config.longStackSupport && hasStacks) {\n        var oldSubscribe = this._subscribe;\n        var e = tryCatch(thrower)(new Error()).e;\n        this.stack = e.stack.substring(e.stack.indexOf('\\n') + 1);\n        this._subscribe = makeSubscribe(this, oldSubscribe);\n      }\n    }\n\n    observableProto = Observable.prototype;\n\n    /**\n    * Determines whether the given object is an Observable\n    * @param {Any} An object to determine whether it is an Observable\n    * @returns {Boolean} true if an Observable, else false.\n    */\n    Observable.isObservable = function (o) {\n      return o && isFunction(o.subscribe);\n    };\n\n    /**\n     *  Subscribes an o to the observable sequence.\n     *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n     *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n     *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n     *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribe = observableProto.forEach = function (oOrOnNext, onError, onCompleted) {\n      return this._subscribe(typeof oOrOnNext === 'object' ?\n        oOrOnNext :\n        observerCreate(oOrOnNext, onError, onCompleted));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onNext The function to invoke on each element in the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnNext = function (onNext, thisArg) {\n      return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n    };\n\n    /**\n     * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n     * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnError = function (onError, thisArg) {\n      return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnCompleted = function (onCompleted, thisArg) {\n      return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n    };\n\n    return Observable;\n  })();\n\n  var ObservableBase = Rx.ObservableBase = (function (__super__) {\n    inherits(ObservableBase, __super__);\n\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.subscribeCore).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function ObservableBase() {\n      __super__.call(this);\n    }\n\n    ObservableBase.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    ObservableBase.prototype.subscribeCore = notImplemented;\n\n    return ObservableBase;\n  }(Observable));\n\nvar FlatMapObservable = Rx.FlatMapObservable = (function(__super__) {\n\n    inherits(FlatMapObservable, __super__);\n\n    function FlatMapObservable(source, selector, resultSelector, thisArg) {\n      this.resultSelector = isFunction(resultSelector) ? resultSelector : null;\n      this.selector = bindCallback(isFunction(selector) ? selector : function() { return selector; }, thisArg, 3);\n      this.source = source;\n      __super__.call(this);\n    }\n\n    FlatMapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this.resultSelector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(observer, selector, resultSelector, source) {\n      this.i = 0;\n      this.selector = selector;\n      this.resultSelector = resultSelector;\n      this.source = source;\n      this.o = observer;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype._wrapResult = function(result, x, i) {\n      return this.resultSelector ?\n        result.map(function(y, i2) { return this.resultSelector(x, y, i, i2); }, this) :\n        result;\n    };\n\n    InnerObserver.prototype.next = function(x) {\n      var i = this.i++;\n      var result = tryCatch(this.selector)(x, i, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = Observable.from(result));\n      this.o.onNext(this._wrapResult(result, x, i));\n    };\n\n    InnerObserver.prototype.error = function(e) { this.o.onError(e); };\n\n    InnerObserver.prototype.completed = function() { this.o.onCompleted(); };\n\n    return FlatMapObservable;\n\n}(ObservableBase));\n\n  var Enumerable = Rx.internals.Enumerable = function () { };\n\n  function IsDisposedDisposable(state) {\n    this._s = state;\n    this.isDisposed = false;\n  }\n\n  IsDisposedDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      this._s.isDisposed = true;\n    }\n  };\n\n  var ConcatEnumerableObservable = (function(__super__) {\n    inherits(ConcatEnumerableObservable, __super__);\n    function ConcatEnumerableObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    ConcatEnumerableObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        o: o,\n        subscription: subscription,\n        e: this.sources[$iterator$]()\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.o.onError(e); };\n    InnerObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return ConcatEnumerableObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.concat = function () {\n    return new ConcatEnumerableObservable(this);\n  };\n\n  var CatchErrorObservable = (function(__super__) {\n    function CatchErrorObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    inherits(CatchErrorObservable, __super__);\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.lastError !== null ? state.o.onError(state.lastError) : state.o.onCompleted(); }\n\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    CatchErrorObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        e: this.sources[$iterator$](),\n        subscription: subscription,\n        lastError: null,\n        o: o\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.lastError = e; this._recurse(this._state); };\n    InnerObserver.prototype.completed = function () { this._state.o.onCompleted(); };\n\n    return CatchErrorObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.catchError = function () {\n    return new CatchErrorObservable(this);\n  };\n\n  var RepeatEnumerable = (function (__super__) {\n    inherits(RepeatEnumerable, __super__);\n    function RepeatEnumerable(v, c) {\n      this.v = v;\n      this.c = c == null ? -1 : c;\n    }\n\n    RepeatEnumerable.prototype[$iterator$] = function () {\n      return new RepeatEnumerator(this);\n    };\n\n    function RepeatEnumerator(p) {\n      this.v = p.v;\n      this.l = p.c;\n    }\n\n    RepeatEnumerator.prototype.next = function () {\n      if (this.l === 0) { return doneEnumerator; }\n      if (this.l > 0) { this.l--; }\n      return { done: false, value: this.v };\n    };\n\n    return RepeatEnumerable;\n  }(Enumerable));\n\n  var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) {\n    return new RepeatEnumerable(value, repeatCount);\n  };\n\n  var OfEnumerable = (function(__super__) {\n    inherits(OfEnumerable, __super__);\n    function OfEnumerable(s, fn, thisArg) {\n      this.s = s;\n      this.fn = fn ? bindCallback(fn, thisArg, 3) : null;\n    }\n    OfEnumerable.prototype[$iterator$] = function () {\n      return new OfEnumerator(this);\n    };\n\n    function OfEnumerator(p) {\n      this.i = -1;\n      this.s = p.s;\n      this.l = this.s.length;\n      this.fn = p.fn;\n    }\n\n    OfEnumerator.prototype.next = function () {\n     return ++this.i < this.l ?\n       { done: false, value: !this.fn ? this.s[this.i] : this.fn(this.s[this.i], this.i, this.s) } :\n       doneEnumerator;\n    };\n\n    return OfEnumerable;\n  }(Enumerable));\n\n  var enumerableOf = Enumerable.of = function (source, selector, thisArg) {\n    return new OfEnumerable(source, selector, thisArg);\n  };\n\nvar ObserveOnObservable = (function (__super__) {\n  inherits(ObserveOnObservable, __super__);\n  function ObserveOnObservable(source, s) {\n    this.source = source;\n    this._s = s;\n    __super__.call(this);\n  }\n\n  ObserveOnObservable.prototype.subscribeCore = function (o) {\n    return this.source.subscribe(new ObserveOnObserver(this._s, o));\n  };\n\n  return ObserveOnObservable;\n}(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n   *\n   *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n   *  that require to be run on a scheduler, use subscribeOn.\n   *\n   *  @param {Scheduler} scheduler Scheduler to notify observers on.\n   *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n   */\n  observableProto.observeOn = function (scheduler) {\n    return new ObserveOnObservable(this, scheduler);\n  };\n\n  var SubscribeOnObservable = (function (__super__) {\n    inherits(SubscribeOnObservable, __super__);\n    function SubscribeOnObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(scheduler, state) {\n      var source = state[0], d = state[1], o = state[2];\n      d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(o)));\n    }\n\n    SubscribeOnObservable.prototype.subscribeCore = function (o) {\n      var m = new SingleAssignmentDisposable(), d = new SerialDisposable();\n      d.setDisposable(m);\n      m.setDisposable(this._s.schedule([this.source, d, o], scheduleMethod));\n      return d;\n    };\n\n    return SubscribeOnObservable;\n  }(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n   *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n   *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n   *  callbacks on a scheduler, use observeOn.\n\n   *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n   *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n   */\n  observableProto.subscribeOn = function (scheduler) {\n    return new SubscribeOnObservable(this, scheduler);\n  };\n\n  var FromPromiseObservable = (function(__super__) {\n    inherits(FromPromiseObservable, __super__);\n    function FromPromiseObservable(p, s) {\n      this._p = p;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleNext(s, state) {\n      var o = state[0], data = state[1];\n      o.onNext(data);\n      o.onCompleted();\n    }\n\n    function scheduleError(s, state) {\n      var o = state[0], err = state[1];\n      o.onError(err);\n    }\n\n    FromPromiseObservable.prototype.subscribeCore = function(o) {\n      var sad = new SingleAssignmentDisposable(), self = this, p = this._p;\n\n      if (isFunction(p)) {\n        p = tryCatch(p)();\n        if (p === errorObj) {\n          o.onError(p.e);\n          return sad;\n        }\n      }\n\n      p\n        .then(function (data) {\n          sad.setDisposable(self._s.schedule([o, data], scheduleNext));\n        }, function (err) {\n          sad.setDisposable(self._s.schedule([o, err], scheduleError));\n        });\n\n      return sad;\n    };\n\n    return FromPromiseObservable;\n  }(ObservableBase));\n\n  /**\n  * Converts a Promise to an Observable sequence\n  * @param {Promise} An ES6 Compliant promise.\n  * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n  */\n  var observableFromPromise = Observable.fromPromise = function (promise, scheduler) {\n    scheduler || (scheduler = defaultScheduler);\n    return new FromPromiseObservable(promise, scheduler);\n  };\n\n  /*\n   * Converts an existing observable sequence to an ES6 Compatible Promise\n   * @example\n   * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n   *\n   * // With config\n   * Rx.config.Promise = RSVP.Promise;\n   * var promise = Rx.Observable.return(42).toPromise();\n   * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n   * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n   */\n  observableProto.toPromise = function (promiseCtor) {\n    promiseCtor || (promiseCtor = Rx.config.Promise);\n    if (!promiseCtor) { throw new NotSupportedError('Promise type not provided nor in Rx.config.Promise'); }\n    var source = this;\n    return new promiseCtor(function (resolve, reject) {\n      // No cancellation can be done\n      var value;\n      source.subscribe(function (v) {\n        value = v;\n      }, reject, function () {\n        resolve(value);\n      });\n    });\n  };\n\n  var ToArrayObservable = (function(__super__) {\n    inherits(ToArrayObservable, __super__);\n    function ToArrayObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    ToArrayObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o) {\n      this.o = o;\n      this.a = [];\n      AbstractObserver.call(this);\n    }\n    \n    InnerObserver.prototype.next = function (x) { this.a.push(x); };\n    InnerObserver.prototype.error = function (e) { this.o.onError(e);  };\n    InnerObserver.prototype.completed = function () { this.o.onNext(this.a); this.o.onCompleted(); };\n\n    return ToArrayObservable;\n  }(ObservableBase));\n\n  /**\n  * Creates an array from an observable sequence.\n  * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n  */\n  observableProto.toArray = function () {\n    return new ToArrayObservable(this);\n  };\n\n  /**\n   *  Creates an observable sequence from a specified subscribe method implementation.\n   * @example\n   *  var res = Rx.Observable.create(function (observer) { return function () { } );\n   *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n   *  var res = Rx.Observable.create(function (observer) { } );\n   * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n   * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n   */\n  Observable.create = function (subscribe, parent) {\n    return new AnonymousObservable(subscribe, parent);\n  };\n\n  var Defer = (function(__super__) {\n    inherits(Defer, __super__);\n    function Defer(factory) {\n      this._f = factory;\n      __super__.call(this);\n    }\n\n    Defer.prototype.subscribeCore = function (o) {\n      var result = tryCatch(this._f)();\n      if (result === errorObj) { return observableThrow(result.e).subscribe(o);}\n      isPromise(result) && (result = observableFromPromise(result));\n      return result.subscribe(o);\n    };\n\n    return Defer;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n   *\n   * @example\n   *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n   * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n   * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n   */\n  var observableDefer = Observable.defer = function (observableFactory) {\n    return new Defer(observableFactory);\n  };\n\n  var EmptyObservable = (function(__super__) {\n    inherits(EmptyObservable, __super__);\n    function EmptyObservable(scheduler) {\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    EmptyObservable.prototype.subscribeCore = function (observer) {\n      var sink = new EmptySink(observer, this.scheduler);\n      return sink.run();\n    };\n\n    function EmptySink(observer, scheduler) {\n      this.observer = observer;\n      this.scheduler = scheduler;\n    }\n\n    function scheduleItem(s, state) {\n      state.onCompleted();\n      return disposableEmpty;\n    }\n\n    EmptySink.prototype.run = function () {\n      var state = this.observer;\n      return this.scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this.scheduler.schedule(state, scheduleItem);\n    };\n\n    return EmptyObservable;\n  }(ObservableBase));\n\n  var EMPTY_OBSERVABLE = new EmptyObservable(immediateScheduler);\n\n  /**\n   *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n   *\n   * @example\n   *  var res = Rx.Observable.empty();\n   *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n   * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n   * @returns {Observable} An observable sequence with no elements.\n   */\n  var observableEmpty = Observable.empty = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return scheduler === immediateScheduler ? EMPTY_OBSERVABLE : new EmptyObservable(scheduler);\n  };\n\n  var FromObservable = (function(__super__) {\n    inherits(FromObservable, __super__);\n    function FromObservable(iterable, fn, scheduler) {\n      this._iterable = iterable;\n      this._fn = fn;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function createScheduleMethod(o, it, fn) {\n      return function loopRecursive(i, recurse) {\n        var next = tryCatch(it.next).call(it);\n        if (next === errorObj) { return o.onError(next.e); }\n        if (next.done) { return o.onCompleted(); }\n\n        var result = next.value;\n\n        if (isFunction(fn)) {\n          result = tryCatch(fn)(result, i);\n          if (result === errorObj) { return o.onError(result.e); }\n        }\n\n        o.onNext(result);\n        recurse(i + 1);\n      };\n    }\n\n    FromObservable.prototype.subscribeCore = function (o) {\n      var list = Object(this._iterable),\n          it = getIterable(list);\n\n      return this._scheduler.scheduleRecursive(0, createScheduleMethod(o, it, this._fn));\n    };\n\n    return FromObservable;\n  }(ObservableBase));\n\n  var maxSafeInteger = Math.pow(2, 53) - 1;\n\n  function StringIterable(s) {\n    this._s = s;\n  }\n\n  StringIterable.prototype[$iterator$] = function () {\n    return new StringIterator(this._s);\n  };\n\n  function StringIterator(s) {\n    this._s = s;\n    this._l = s.length;\n    this._i = 0;\n  }\n\n  StringIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  StringIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._s.charAt(this._i++) } : doneEnumerator;\n  };\n\n  function ArrayIterable(a) {\n    this._a = a;\n  }\n\n  ArrayIterable.prototype[$iterator$] = function () {\n    return new ArrayIterator(this._a);\n  };\n\n  function ArrayIterator(a) {\n    this._a = a;\n    this._l = toLength(a);\n    this._i = 0;\n  }\n\n  ArrayIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  ArrayIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._a[this._i++] } : doneEnumerator;\n  };\n\n  function numberIsFinite(value) {\n    return typeof value === 'number' && root.isFinite(value);\n  }\n\n  function isNan(n) {\n    return n !== n;\n  }\n\n  function getIterable(o) {\n    var i = o[$iterator$], it;\n    if (!i && typeof o === 'string') {\n      it = new StringIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i && o.length !== undefined) {\n      it = new ArrayIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i) { throw new TypeError('Object is not iterable'); }\n    return o[$iterator$]();\n  }\n\n  function sign(value) {\n    var number = +value;\n    if (number === 0) { return number; }\n    if (isNaN(number)) { return number; }\n    return number < 0 ? -1 : 1;\n  }\n\n  function toLength(o) {\n    var len = +o.length;\n    if (isNaN(len)) { return 0; }\n    if (len === 0 || !numberIsFinite(len)) { return len; }\n    len = sign(len) * Math.floor(Math.abs(len));\n    if (len <= 0) { return 0; }\n    if (len > maxSafeInteger) { return maxSafeInteger; }\n    return len;\n  }\n\n  /**\n  * This method creates a new Observable sequence from an array-like or iterable object.\n  * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n  * @param {Function} [mapFn] Map function to call on every element of the array.\n  * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n  * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n  */\n  var observableFrom = Observable.from = function (iterable, mapFn, thisArg, scheduler) {\n    if (iterable == null) {\n      throw new Error('iterable cannot be null.')\n    }\n    if (mapFn && !isFunction(mapFn)) {\n      throw new Error('mapFn when provided must be a function');\n    }\n    if (mapFn) {\n      var mapper = bindCallback(mapFn, thisArg, 2);\n    }\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromObservable(iterable, mapper, scheduler);\n  }\n\n  var FromArrayObservable = (function(__super__) {\n    inherits(FromArrayObservable, __super__);\n    function FromArrayObservable(args, scheduler) {\n      this._args = args;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, args) {\n      var len = args.length;\n      return function loopRecursive (i, recurse) {\n        if (i < len) {\n          o.onNext(args[i]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    FromArrayObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._args));\n    };\n\n    return FromArrayObservable;\n  }(ObservableBase));\n\n  /**\n  *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n  * @deprecated use Observable.from or Observable.of\n  * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n  */\n  var observableFromArray = Observable.fromArray = function (array, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler)\n  };\n\n  var GenerateObservable = (function (__super__) {\n    inherits(GenerateObservable, __super__);\n    function GenerateObservable(state, cndFn, itrFn, resFn, s) {\n      this._initialState = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n      var hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (hasResult === errorObj) { return state.o.onError(hasResult.e); }\n      if (hasResult) {\n        var result = tryCatch(state.self._resFn)(state.newState);\n        if (result === errorObj) { return state.o.onError(result.e); }\n        state.o.onNext(result);\n        recurse(state);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        first: true,\n        newState: this._initialState\n      };\n      return this._s.scheduleRecursive(state, scheduleRecursive);\n    };\n\n    return GenerateObservable;\n  }(ObservableBase));\n\n  /**\n   *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new GenerateObservable(initialState, condition, iterate, resultSelector, scheduler);\n  };\n\n  function observableOf (scheduler, array) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler);\n  }\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.of = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return new FromArrayObservable(args, currentThreadScheduler);\n  };\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.ofWithScheduler = function (scheduler) {\n    var len = arguments.length, args = new Array(len - 1);\n    for(var i = 1; i < len; i++) { args[i - 1] = arguments[i]; }\n    return new FromArrayObservable(args, scheduler);\n  };\n\n  /**\n   * Creates an Observable sequence from changes to an array using Array.observe.\n   * @param {Array} array An array to observe changes.\n   * @returns {Observable} An observable sequence containing changes to an array from Array.observe.\n   */\n  Observable.ofArrayChanges = function(array) {\n    if (!Array.isArray(array)) { throw new TypeError('Array.observe only accepts arrays.'); }\n    if (typeof Array.observe !== 'function' && typeof Array.unobserve !== 'function') { throw new TypeError('Array.observe is not supported on your platform') }\n    return new AnonymousObservable(function(observer) {\n      function observerFn(changes) {\n        for(var i = 0, len = changes.length; i < len; i++) {\n          observer.onNext(changes[i]);\n        }\n      }\n      \n      Array.observe(array, observerFn);\n\n      return function () {\n        Array.unobserve(array, observerFn);\n      };\n    });\n  };\n\n  /**\n   * Creates an Observable sequence from changes to an object using Object.observe.\n   * @param {Object} obj An object to observe changes.\n   * @returns {Observable} An observable sequence containing changes to an object from Object.observe.\n   */\n  Observable.ofObjectChanges = function(obj) {\n    if (obj == null) { throw new TypeError('object must not be null or undefined.'); }\n    if (typeof Object.observe !== 'function' && typeof Object.unobserve !== 'function') { throw new TypeError('Object.observe is not supported on your platform') }\n    return new AnonymousObservable(function(observer) {\n      function observerFn(changes) {\n        for(var i = 0, len = changes.length; i < len; i++) {\n          observer.onNext(changes[i]);\n        }\n      }\n\n      Object.observe(obj, observerFn);\n\n      return function () {\n        Object.unobserve(obj, observerFn);\n      };\n    });\n  };\n\n  var NeverObservable = (function(__super__) {\n    inherits(NeverObservable, __super__);\n    function NeverObservable() {\n      __super__.call(this);\n    }\n\n    NeverObservable.prototype.subscribeCore = function (observer) {\n      return disposableEmpty;\n    };\n\n    return NeverObservable;\n  }(ObservableBase));\n\n  var NEVER_OBSERVABLE = new NeverObservable();\n\n  /**\n   * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n   * @returns {Observable} An observable sequence whose observers will never get called.\n   */\n  var observableNever = Observable.never = function () {\n    return NEVER_OBSERVABLE;\n  };\n\n  var PairsObservable = (function(__super__) {\n    inherits(PairsObservable, __super__);\n    function PairsObservable(o, scheduler) {\n      this._o = o;\n      this._keys = Object.keys(o);\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, obj, keys) {\n      return function loopRecursive(i, recurse) {\n        if (i < keys.length) {\n          var key = keys[i];\n          o.onNext([key, obj[key]]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    PairsObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._o, this._keys));\n    };\n\n    return PairsObservable;\n  }(ObservableBase));\n\n  /**\n   * Convert an object into an observable sequence of [key, value] pairs.\n   * @param {Object} obj The object to inspect.\n   * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n   * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n   */\n  Observable.pairs = function (obj, scheduler) {\n    scheduler || (scheduler = currentThreadScheduler);\n    return new PairsObservable(obj, scheduler);\n  };\n\n    var RangeObservable = (function(__super__) {\n    inherits(RangeObservable, __super__);\n    function RangeObservable(start, count, scheduler) {\n      this.start = start;\n      this.rangeCount = count;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function loopRecursive(start, count, o) {\n      return function loop (i, recurse) {\n        if (i < count) {\n          o.onNext(start + i);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    RangeObservable.prototype.subscribeCore = function (o) {\n      return this.scheduler.scheduleRecursive(\n        0,\n        loopRecursive(this.start, this.rangeCount, o)\n      );\n    };\n\n    return RangeObservable;\n  }(ObservableBase));\n\n  /**\n  *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n  * @param {Number} start The value of the first integer in the sequence.\n  * @param {Number} count The number of sequential integers to generate.\n  * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n  * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n  */\n  Observable.range = function (start, count, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RangeObservable(start, count, scheduler);\n  };\n\n  var RepeatObservable = (function(__super__) {\n    inherits(RepeatObservable, __super__);\n    function RepeatObservable(value, repeatCount, scheduler) {\n      this.value = value;\n      this.repeatCount = repeatCount == null ? -1 : repeatCount;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    RepeatObservable.prototype.subscribeCore = function (observer) {\n      var sink = new RepeatSink(observer, this);\n      return sink.run();\n    };\n\n    return RepeatObservable;\n  }(ObservableBase));\n\n  function RepeatSink(observer, parent) {\n    this.observer = observer;\n    this.parent = parent;\n  }\n\n  RepeatSink.prototype.run = function () {\n    var observer = this.observer, value = this.parent.value;\n    function loopRecursive(i, recurse) {\n      if (i === -1 || i > 0) {\n        observer.onNext(value);\n        i > 0 && i--;\n      }\n      if (i === 0) { return observer.onCompleted(); }\n      recurse(i);\n    }\n\n    return this.parent.scheduler.scheduleRecursive(this.parent.repeatCount, loopRecursive);\n  };\n\n  /**\n   *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n   * @param {Mixed} value Element to repeat.\n   * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n   * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n   */\n  Observable.repeat = function (value, repeatCount, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RepeatObservable(value, repeatCount, scheduler);\n  };\n\n  var JustObservable = (function(__super__) {\n    inherits(JustObservable, __super__);\n    function JustObservable(value, scheduler) {\n      this._value = value;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    JustObservable.prototype.subscribeCore = function (o) {\n      var state = [this._value, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var value = state[0], observer = state[1];\n      observer.onNext(value);\n      observer.onCompleted();\n      return disposableEmpty;\n    }\n\n    return JustObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n   *  There is an alias called 'just' or browsers <IE9.\n   * @param {Mixed} value Single element in the resulting observable sequence.\n   * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence containing the single specified element.\n   */\n  var observableReturn = Observable['return'] = Observable.just = function (value, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new JustObservable(value, scheduler);\n  };\n\n  var ThrowObservable = (function(__super__) {\n    inherits(ThrowObservable, __super__);\n    function ThrowObservable(error, scheduler) {\n      this._error = error;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    ThrowObservable.prototype.subscribeCore = function (o) {\n      var state = [this._error, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var e = state[0], o = state[1];\n      o.onError(e);\n      return disposableEmpty;\n    }\n\n    return ThrowObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n   *  There is an alias to this method called 'throwError' for browsers <IE9.\n   * @param {Mixed} error An object used for the sequence's termination.\n   * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n   */\n  var observableThrow = Observable['throw'] = function (error, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new ThrowObservable(error, scheduler);\n  };\n\n  var UsingObservable = (function (__super__) {\n    inherits(UsingObservable, __super__);\n    function UsingObservable(resFn, obsFn) {\n      this._resFn = resFn;\n      this._obsFn = obsFn;\n      __super__.call(this);\n    }\n\n    UsingObservable.prototype.subscribeCore = function (o) {\n      var disposable = disposableEmpty;\n      var resource = tryCatch(this._resFn)();\n      if (resource === errorObj) {\n        return new BinaryDisposable(observableThrow(resource.e).subscribe(o), disposable);\n      }\n      resource && (disposable = resource);\n      var source = tryCatch(this._obsFn)(resource);\n      if (source === errorObj) {\n        return new BinaryDisposable(observableThrow(source.e).subscribe(o), disposable);\n      }\n      return new BinaryDisposable(source.subscribe(o), disposable);\n    };\n\n    return UsingObservable;\n  }(ObservableBase));\n\n  /**\n   * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n   * @param {Function} resourceFactory Factory function to obtain a resource object.\n   * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n   * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n   */\n  Observable.using = function (resourceFactory, observableFactory) {\n    return new UsingObservable(resourceFactory, observableFactory);\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @param {Observable} rightSource Second observable sequence or Promise.\n   * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n   */\n  observableProto.amb = function (rightSource) {\n    var leftSource = this;\n    return new AnonymousObservable(function (observer) {\n      var choice,\n        leftChoice = 'L', rightChoice = 'R',\n        leftSubscription = new SingleAssignmentDisposable(),\n        rightSubscription = new SingleAssignmentDisposable();\n\n      isPromise(rightSource) && (rightSource = observableFromPromise(rightSource));\n\n      function choiceL() {\n        if (!choice) {\n          choice = leftChoice;\n          rightSubscription.dispose();\n        }\n      }\n\n      function choiceR() {\n        if (!choice) {\n          choice = rightChoice;\n          leftSubscription.dispose();\n        }\n      }\n\n      var leftSubscribe = observerCreate(\n        function (left) {\n          choiceL();\n          choice === leftChoice && observer.onNext(left);\n        },\n        function (e) {\n          choiceL();\n          choice === leftChoice && observer.onError(e);\n        },\n        function () {\n          choiceL();\n          choice === leftChoice && observer.onCompleted();\n        }\n      );\n      var rightSubscribe = observerCreate(\n        function (right) {\n          choiceR();\n          choice === rightChoice && observer.onNext(right);\n        },\n        function (e) {\n          choiceR();\n          choice === rightChoice && observer.onError(e);\n        },\n        function () {\n          choiceR();\n          choice === rightChoice && observer.onCompleted();\n        }\n      );\n\n      leftSubscription.setDisposable(leftSource.subscribe(leftSubscribe));\n      rightSubscription.setDisposable(rightSource.subscribe(rightSubscribe));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    });\n  };\n\n  function amb(p, c) { return p.amb(c); }\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n   */\n  Observable.amb = function () {\n    var acc = observableNever(), items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(items);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    for (var i = 0, len = items.length; i < len; i++) {\n      acc = amb(acc, items[i]);\n    }\n    return acc;\n  };\n\n  var CatchObservable = (function (__super__) {\n    inherits(CatchObservable, __super__);\n    function CatchObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObservable.prototype.subscribeCore = function (o) {\n      var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();\n      subscription.setDisposable(d1);\n      d1.setDisposable(this.source.subscribe(new CatchObserver(o, subscription, this._fn)));\n      return subscription;\n    };\n\n    return CatchObservable;\n  }(ObservableBase));\n\n  var CatchObserver = (function(__super__) {\n    inherits(CatchObserver, __super__);\n    function CatchObserver(o, s, fn) {\n      this._o = o;\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObserver.prototype.next = function (x) { this._o.onNext(x); };\n    CatchObserver.prototype.completed = function () { return this._o.onCompleted(); };\n    CatchObserver.prototype.error = function (e) {\n      var result = tryCatch(this._fn)(e);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      isPromise(result) && (result = observableFromPromise(result));\n\n      var d = new SingleAssignmentDisposable();\n      this._s.setDisposable(d);\n      d.setDisposable(result.subscribe(this._o));\n    };\n\n    return CatchObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n   * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n   */\n  observableProto['catch'] = function (handlerOrSecond) {\n    return isFunction(handlerOrSecond) ? new CatchObservable(this, handlerOrSecond) : observableCatch([this, handlerOrSecond]);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n   * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n   */\n  var observableCatch = Observable['catch'] = function () {\n    var items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(len);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    return enumerableOf(items).catchError();\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   * This can be in the form of an argument list of observables or an array.\n   *\n   * @example\n   * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return combineLatest.apply(this, args);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var CombineLatestObservable = (function(__super__) {\n    inherits(CombineLatestObservable, __super__);\n    function CombineLatestObservable(params, cb) {\n      this._params = params;\n      this._cb = cb;\n      __super__.call(this);\n    }\n\n    CombineLatestObservable.prototype.subscribeCore = function(observer) {\n      var len = this._params.length,\n          subscriptions = new Array(len);\n\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        isDone: arrayInitialize(len, falseFactory),\n        values: new Array(len)\n      };\n\n      for (var i = 0; i < len; i++) {\n        var source = this._params[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new CombineLatestObserver(observer, i, this._cb, state)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return CombineLatestObservable;\n  }(ObservableBase));\n\n  var CombineLatestObserver = (function (__super__) {\n    inherits(CombineLatestObserver, __super__);\n    function CombineLatestObserver(o, i, cb, state) {\n      this._o = o;\n      this._i = i;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    CombineLatestObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      if (this._state.hasValueAll || (this._state.hasValueAll = this._state.hasValue.every(identity))) {\n        var res = tryCatch(this._cb).apply(null, this._state.values);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._state.isDone.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    CombineLatestObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    CombineLatestObserver.prototype.completed = function () {\n      this._state.isDone[this._i] = true;\n      this._state.isDone.every(identity) && this._o.onCompleted();\n    };\n\n    return CombineLatestObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n  *\n  * @example\n  * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n  * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n  * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n  */\n  var combineLatest = Observable.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n    return new CombineLatestObservable(args, resultSelector);\n  };\n\n  /**\n   * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  observableProto.concat = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    args.unshift(this);\n    return observableConcat.apply(null, args);\n  };\n\n  var ConcatObserver = (function(__super__) {\n    inherits(ConcatObserver, __super__);\n    function ConcatObserver(s, fn) {\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    ConcatObserver.prototype.next = function (x) { this._s.o.onNext(x); };\n    ConcatObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    ConcatObserver.prototype.completed = function () { this._s.i++; this._fn(this._s); };\n\n    return ConcatObserver;\n  }(AbstractObserver));\n\n  var ConcatObservable = (function(__super__) {\n    inherits(ConcatObservable, __super__);\n    function ConcatObservable(sources) {\n      this._sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive (state, recurse) {\n      if (state.disposable.isDisposed) { return; }\n      if (state.i === state.sources.length) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = state.sources[state.i];\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new ConcatObserver(state, recurse)));\n    }\n\n    ConcatObservable.prototype.subscribeCore = function(o) {\n      var subscription = new SerialDisposable();\n      var disposable = disposableCreate(noop);\n      var state = {\n        o: o,\n        i: 0,\n        subscription: subscription,\n        disposable: disposable,\n        sources: this._sources\n      };\n\n      var cancelable = immediateScheduler.scheduleRecursive(state, scheduleRecursive);\n      return new NAryDisposable([subscription, disposable, cancelable]);\n    };\n\n    return ConcatObservable;\n  }(ObservableBase));\n\n  /**\n   * Concatenates all the observable sequences.\n   * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  var observableConcat = Observable.concat = function () {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      args = new Array(arguments.length);\n      for(var i = 0, len = arguments.length; i < len; i++) { args[i] = arguments[i]; }\n    }\n    return new ConcatObservable(args);\n  };\n\n  /**\n   * Concatenates an observable sequence of observable sequences.\n   * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n   */\n  observableProto.concatAll = function () {\n    return this.merge(1);\n  };\n\n  var MergeObservable = (function (__super__) {\n    inherits(MergeObservable, __super__);\n\n    function MergeObservable(source, maxConcurrent) {\n      this.source = source;\n      this.maxConcurrent = maxConcurrent;\n      __super__.call(this);\n    }\n\n    MergeObservable.prototype.subscribeCore = function(observer) {\n      var g = new CompositeDisposable();\n      g.add(this.source.subscribe(new MergeObserver(observer, this.maxConcurrent, g)));\n      return g;\n    };\n\n    return MergeObservable;\n\n  }(ObservableBase));\n\n  var MergeObserver = (function (__super__) {\n    function MergeObserver(o, max, g) {\n      this.o = o;\n      this.max = max;\n      this.g = g;\n      this.done = false;\n      this.q = [];\n      this.activeCount = 0;\n      __super__.call(this);\n    }\n\n    inherits(MergeObserver, __super__);\n\n    MergeObserver.prototype.handleSubscribe = function (xs) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(xs) && (xs = observableFromPromise(xs));\n      sad.setDisposable(xs.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeObserver.prototype.next = function (innerSource) {\n      if(this.activeCount < this.max) {\n        this.activeCount++;\n        this.handleSubscribe(innerSource);\n      } else {\n        this.q.push(innerSource);\n      }\n    };\n    MergeObserver.prototype.error = function (e) { this.o.onError(e); };\n    MergeObserver.prototype.completed = function () { this.done = true; this.activeCount === 0 && this.o.onCompleted(); };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) { this.parent.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this.parent.o.onError(e); };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      if (this.parent.q.length > 0) {\n        this.parent.handleSubscribe(this.parent.q.shift());\n      } else {\n        this.parent.activeCount--;\n        this.parent.done && this.parent.activeCount === 0 && this.parent.o.onCompleted();\n      }\n    };\n\n    return MergeObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n  * Or merges two observable sequences into a single observable sequence.\n  * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.merge = function (maxConcurrentOrOther) {\n    return typeof maxConcurrentOrOther !== 'number' ?\n      observableMerge(this, maxConcurrentOrOther) :\n      new MergeObservable(this, maxConcurrentOrOther);\n  };\n\n  /**\n   * Merges all the observable sequences into a single observable sequence.\n   * The scheduler is optional and if not specified, the immediate scheduler is used.\n   * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n   */\n  var observableMerge = Observable.merge = function () {\n    var scheduler, sources = [], i, len = arguments.length;\n    if (!arguments[0]) {\n      scheduler = immediateScheduler;\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else if (isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else {\n      scheduler = immediateScheduler;\n      for(i = 0; i < len; i++) { sources.push(arguments[i]); }\n    }\n    if (Array.isArray(sources[0])) {\n      sources = sources[0];\n    }\n    return observableOf(scheduler, sources).mergeAll();\n  };\n\n  var MergeAllObservable = (function (__super__) {\n    inherits(MergeAllObservable, __super__);\n\n    function MergeAllObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeAllObservable.prototype.subscribeCore = function (o) {\n      var g = new CompositeDisposable(), m = new SingleAssignmentDisposable();\n      g.add(m);\n      m.setDisposable(this.source.subscribe(new MergeAllObserver(o, g)));\n      return g;\n    };\n\n    return MergeAllObservable;\n  }(ObservableBase));\n\n  var MergeAllObserver = (function (__super__) {\n    function MergeAllObserver(o, g) {\n      this.o = o;\n      this.g = g;\n      this.done = false;\n      __super__.call(this);\n    }\n\n    inherits(MergeAllObserver, __super__);\n\n    MergeAllObserver.prototype.next = function(innerSource) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      sad.setDisposable(innerSource.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeAllObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    MergeAllObserver.prototype.completed = function () {\n      this.done = true;\n      this.g.length === 1 && this.o.onCompleted();\n    };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) {\n      this.parent.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function (e) {\n      this.parent.o.onError(e);\n    };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      this.parent.done && this.parent.g.length === 1 && this.parent.o.onCompleted();\n    };\n\n    return MergeAllObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.mergeAll = function () {\n    return new MergeAllObservable(this);\n  };\n\n  var CompositeError = Rx.CompositeError = function(errors) {\n    this.innerErrors = errors;\n    this.message = 'This contains multiple errors. Check the innerErrors';\n    Error.call(this);\n  };\n  CompositeError.prototype = Object.create(Error.prototype);\n  CompositeError.prototype.name = 'CompositeError';\n\n  var MergeDelayErrorObservable = (function(__super__) {\n    inherits(MergeDelayErrorObservable, __super__);\n    function MergeDelayErrorObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeDelayErrorObservable.prototype.subscribeCore = function (o) {\n      var group = new CompositeDisposable(),\n        m = new SingleAssignmentDisposable(),\n        state = { isStopped: false, errors: [], o: o };\n\n      group.add(m);\n      m.setDisposable(this.source.subscribe(new MergeDelayErrorObserver(group, state)));\n\n      return group;\n    };\n\n    return MergeDelayErrorObservable;\n  }(ObservableBase));\n\n  var MergeDelayErrorObserver = (function(__super__) {\n    inherits(MergeDelayErrorObserver, __super__);\n    function MergeDelayErrorObserver(group, state) {\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function setCompletion(o, errors) {\n      if (errors.length === 0) {\n        o.onCompleted();\n      } else if (errors.length === 1) {\n        o.onError(errors[0]);\n      } else {\n        o.onError(new CompositeError(errors));\n      }\n    }\n\n    MergeDelayErrorObserver.prototype.next = function (x) {\n      var inner = new SingleAssignmentDisposable();\n      this._group.add(inner);\n\n      // Check for promises support\n      isPromise(x) && (x = observableFromPromise(x));\n      inner.setDisposable(x.subscribe(new InnerObserver(inner, this._group, this._state)));\n    };\n\n    MergeDelayErrorObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    MergeDelayErrorObserver.prototype.completed = function () {\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    inherits(InnerObserver, __super__);\n    function InnerObserver(inner, group, state) {\n      this._inner = inner;\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n    InnerObserver.prototype.completed = function () {\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    return MergeDelayErrorObserver;\n  }(AbstractObserver));\n\n  /**\n  * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n  * receive all successfully emitted items from all of the source Observables without being interrupted by\n  * an error notification from one of them.\n  *\n  * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n  * error via the Observer's onError, mergeDelayError will refrain from propagating that\n  * error notification until all of the merged Observables have finished emitting items.\n  * @param {Array | Arguments} args Arguments or an array to merge.\n  * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n  */\n  Observable.mergeDelayError = function() {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      var len = arguments.length;\n      args = new Array(len);\n      for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    var source = observableOf(null, args);\n    return new MergeDelayErrorObservable(source);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n   * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n   */\n  observableProto.onErrorResumeNext = function (second) {\n    if (!second) { throw new Error('Second observable is required'); }\n    return onErrorResumeNext([this, second]);\n  };\n\n  var OnErrorResumeNextObservable = (function(__super__) {\n    inherits(OnErrorResumeNextObservable, __super__);\n    function OnErrorResumeNextObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.pos < state.sources.length) {\n        var current = state.sources[state.pos++];\n        isPromise(current) && (current = observableFromPromise(current));\n        var d = new SingleAssignmentDisposable();\n        state.subscription.setDisposable(d);\n        d.setDisposable(current.subscribe(new OnErrorResumeNextObserver(state, recurse)));\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    OnErrorResumeNextObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable(),\n          state = {pos: 0, subscription: subscription, o: o, sources: this.sources },\n          cancellable = immediateScheduler.scheduleRecursive(state, scheduleMethod);\n\n      return new BinaryDisposable(subscription, cancellable);\n    };\n\n    return OnErrorResumeNextObservable;\n  }(ObservableBase));\n\n  var OnErrorResumeNextObserver = (function(__super__) {\n    inherits(OnErrorResumeNextObserver, __super__);\n    function OnErrorResumeNextObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      __super__.call(this);\n    }\n\n    OnErrorResumeNextObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    OnErrorResumeNextObserver.prototype.error = function () { this._recurse(this._state); };\n    OnErrorResumeNextObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return OnErrorResumeNextObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n   */\n  var onErrorResumeNext = Observable.onErrorResumeNext = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      var len = arguments.length;\n      sources = new Array(len);\n      for(var i = 0; i < len; i++) { sources[i] = arguments[i]; }\n    }\n    return new OnErrorResumeNextObservable(sources);\n  };\n\n  var SkipUntilObservable = (function(__super__) {\n    inherits(SkipUntilObservable, __super__);\n\n    function SkipUntilObservable(source, other) {\n      this._s = source;\n      this._o = isPromise(other) ? observableFromPromise(other) : other;\n      this._open = false;\n      __super__.call(this);\n    }\n\n    SkipUntilObservable.prototype.subscribeCore = function(o) {\n      var leftSubscription = new SingleAssignmentDisposable();\n      leftSubscription.setDisposable(this._s.subscribe(new SkipUntilSourceObserver(o, this)));\n\n      isPromise(this._o) && (this._o = observableFromPromise(this._o));\n\n      var rightSubscription = new SingleAssignmentDisposable();\n      rightSubscription.setDisposable(this._o.subscribe(new SkipUntilOtherObserver(o, this, rightSubscription)));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    };\n\n    return SkipUntilObservable;\n  }(ObservableBase));\n\n  var SkipUntilSourceObserver = (function(__super__) {\n    inherits(SkipUntilSourceObserver, __super__);\n    function SkipUntilSourceObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipUntilSourceObserver.prototype.next = function (x) {\n      this._p._open && this._o.onNext(x);\n    };\n\n    SkipUntilSourceObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilSourceObserver.prototype.onCompleted = function () {\n      this._p._open && this._o.onCompleted();\n    };\n\n    return SkipUntilSourceObserver;\n  }(AbstractObserver));\n\n  var SkipUntilOtherObserver = (function(__super__) {\n    inherits(SkipUntilOtherObserver, __super__);\n    function SkipUntilOtherObserver(o, p, r) {\n      this._o = o;\n      this._p = p;\n      this._r = r;\n      __super__.call(this);\n    }\n\n    SkipUntilOtherObserver.prototype.next = function () {\n      this._p._open = true;\n      this._r.dispose();\n    };\n\n    SkipUntilOtherObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilOtherObserver.prototype.onCompleted = function () {\n      this._r.dispose();\n    };\n\n    return SkipUntilOtherObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n   * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n   */\n  observableProto.skipUntil = function (other) {\n    return new SkipUntilObservable(this, other);\n  };\n\n  var SwitchObservable = (function(__super__) {\n    inherits(SwitchObservable, __super__);\n    function SwitchObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    SwitchObservable.prototype.subscribeCore = function (o) {\n      var inner = new SerialDisposable(), s = this.source.subscribe(new SwitchObserver(o, inner));\n      return new BinaryDisposable(s, inner);\n    };\n\n    inherits(SwitchObserver, AbstractObserver);\n    function SwitchObserver(o, inner) {\n      this.o = o;\n      this.inner = inner;\n      this.stopped = false;\n      this.latest = 0;\n      this.hasLatest = false;\n      AbstractObserver.call(this);\n    }\n\n    SwitchObserver.prototype.next = function (innerSource) {\n      var d = new SingleAssignmentDisposable(), id = ++this.latest;\n      this.hasLatest = true;\n      this.inner.setDisposable(d);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      d.setDisposable(innerSource.subscribe(new InnerObserver(this, id)));\n    };\n\n    SwitchObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    SwitchObserver.prototype.completed = function () {\n      this.stopped = true;\n      !this.hasLatest && this.o.onCompleted();\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(parent, id) {\n      this.parent = parent;\n      this.id = id;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function (x) {\n      this.parent.latest === this.id && this.parent.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.parent.latest === this.id && this.parent.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      if (this.parent.latest === this.id) {\n        this.parent.hasLatest = false;\n        this.parent.stopped && this.parent.o.onCompleted();\n      }\n    };\n\n    return SwitchObservable;\n  }(ObservableBase));\n\n  /**\n  * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n  * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n  */\n  observableProto['switch'] = observableProto.switchLatest = function () {\n    return new SwitchObservable(this);\n  };\n\n  var TakeUntilObservable = (function(__super__) {\n    inherits(TakeUntilObservable, __super__);\n\n    function TakeUntilObservable(source, other) {\n      this.source = source;\n      this.other = isPromise(other) ? observableFromPromise(other) : other;\n      __super__.call(this);\n    }\n\n    TakeUntilObservable.prototype.subscribeCore = function(o) {\n      return new BinaryDisposable(\n        this.source.subscribe(o),\n        this.other.subscribe(new TakeUntilObserver(o))\n      );\n    };\n\n    return TakeUntilObservable;\n  }(ObservableBase));\n\n  var TakeUntilObserver = (function(__super__) {\n    inherits(TakeUntilObserver, __super__);\n    function TakeUntilObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    TakeUntilObserver.prototype.next = function () {\n      this._o.onCompleted();\n    };\n\n    TakeUntilObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    TakeUntilObserver.prototype.onCompleted = noop;\n\n    return TakeUntilObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence until the other observable sequence produces a value.\n   * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n   */\n  observableProto.takeUntil = function (other) {\n    return new TakeUntilObservable(this, other);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var WithLatestFromObservable = (function(__super__) {\n    inherits(WithLatestFromObservable, __super__);\n    function WithLatestFromObservable(source, sources, resultSelector) {\n      this._s = source;\n      this._ss = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    WithLatestFromObservable.prototype.subscribeCore = function (o) {\n      var len = this._ss.length;\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        values: new Array(len)\n      };\n\n      var n = this._ss.length, subscriptions = new Array(n + 1);\n      for (var i = 0; i < n; i++) {\n        var other = this._ss[i], sad = new SingleAssignmentDisposable();\n        isPromise(other) && (other = observableFromPromise(other));\n        sad.setDisposable(other.subscribe(new WithLatestFromOtherObserver(o, i, state)));\n        subscriptions[i] = sad;\n      }\n\n      var outerSad = new SingleAssignmentDisposable();\n      outerSad.setDisposable(this._s.subscribe(new WithLatestFromSourceObserver(o, this._cb, state)));\n      subscriptions[n] = outerSad;\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return WithLatestFromObservable;\n  }(ObservableBase));\n\n  var WithLatestFromOtherObserver = (function (__super__) {\n    inherits(WithLatestFromOtherObserver, __super__);\n    function WithLatestFromOtherObserver(o, i, state) {\n      this._o = o;\n      this._i = i;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromOtherObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      this._state.hasValueAll = this._state.hasValue.every(identity);\n    };\n\n    WithLatestFromOtherObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromOtherObserver.prototype.completed = noop;\n\n    return WithLatestFromOtherObserver;\n  }(AbstractObserver));\n\n  var WithLatestFromSourceObserver = (function (__super__) {\n    inherits(WithLatestFromSourceObserver, __super__);\n    function WithLatestFromSourceObserver(o, cb, state) {\n      this._o = o;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromSourceObserver.prototype.next = function (x) {\n      var allValues = [x].concat(this._state.values);\n      if (!this._state.hasValueAll) { return; }\n      var res = tryCatch(this._cb).apply(null, allValues);\n      if (res === errorObj) { return this._o.onError(res.e); }\n      this._o.onNext(res);\n    };\n\n    WithLatestFromSourceObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromSourceObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return WithLatestFromSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.withLatestFrom = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    return new WithLatestFromObservable(this, args, resultSelector);\n  };\n\n  function falseFactory() { return false; }\n  function emptyArrayFactory() { return []; }\n\n  var ZipObservable = (function(__super__) {\n    inherits(ZipObservable, __super__);\n    function ZipObservable(sources, resultSelector) {\n      this._s = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    ZipObservable.prototype.subscribeCore = function(observer) {\n      var n = this._s.length,\n          subscriptions = new Array(n),\n          done = arrayInitialize(n, falseFactory),\n          q = arrayInitialize(n, emptyArrayFactory);\n\n      for (var i = 0; i < n; i++) {\n        var source = this._s[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new ZipObserver(observer, i, this, q, done)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return ZipObservable;\n  }(ObservableBase));\n\n  var ZipObserver = (function (__super__) {\n    inherits(ZipObserver, __super__);\n    function ZipObserver(o, i, p, q, d) {\n      this._o = o;\n      this._i = i;\n      this._p = p;\n      this._q = q;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    function notEmpty(x) { return x.length > 0; }\n    function shiftEach(x) { return x.shift(); }\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    ZipObserver.prototype.next = function (x) {\n      this._q[this._i].push(x);\n      if (this._q.every(notEmpty)) {\n        var queuedValues = this._q.map(shiftEach);\n        var res = tryCatch(this._p._cb).apply(null, queuedValues);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._d.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    ZipObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ZipObserver.prototype.completed = function () {\n      this._d[this._i] = true;\n      this._d.every(identity) && this._o.onCompleted();\n    };\n\n    return ZipObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n   * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n   */\n  observableProto.zip = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    var parent = this;\n    args.unshift(parent);\n\n    return new ZipObservable(args, resultSelector);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n   * @param arguments Observable sources.\n   * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  Observable.zip = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args = isFunction(args[1]) ? args[0].concat(args[1]) : args[0];\n    }\n    var first = args.shift();\n    return first.zip.apply(first, args);\n  };\n\nfunction falseFactory() { return false; }\nfunction emptyArrayFactory() { return []; }\nfunction argumentsToArray() {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return args;\n}\n\nvar ZipIterableObservable = (function(__super__) {\n  inherits(ZipIterableObservable, __super__);\n  function ZipIterableObservable(sources, cb) {\n    this.sources = sources;\n    this._cb = cb;\n    __super__.call(this);\n  }\n\n  ZipIterableObservable.prototype.subscribeCore = function (o) {\n    var sources = this.sources, len = sources.length, subscriptions = new Array(len);\n\n    var state = {\n      q: arrayInitialize(len, emptyArrayFactory),\n      done: arrayInitialize(len, falseFactory),\n      cb: this._cb,\n      o: o\n    };\n\n    for (var i = 0; i < len; i++) {\n      (function (i) {\n        var source = sources[i], sad = new SingleAssignmentDisposable();\n        (isArrayLike(source) || isIterable(source)) && (source = observableFrom(source));\n\n        subscriptions[i] = sad;\n        sad.setDisposable(source.subscribe(new ZipIterableObserver(state, i)));\n      }(i));\n    }\n\n    return new NAryDisposable(subscriptions);\n  };\n\n  return ZipIterableObservable;\n}(ObservableBase));\n\nvar ZipIterableObserver = (function (__super__) {\n  inherits(ZipIterableObserver, __super__);\n  function ZipIterableObserver(s, i) {\n    this._s = s;\n    this._i = i;\n    __super__.call(this);\n  }\n\n  function notEmpty(x) { return x.length > 0; }\n  function shiftEach(x) { return x.shift(); }\n  function notTheSame(i) {\n    return function (x, j) {\n      return j !== i;\n    };\n  }\n\n  ZipIterableObserver.prototype.next = function (x) {\n    this._s.q[this._i].push(x);\n    if (this._s.q.every(notEmpty)) {\n      var queuedValues = this._s.q.map(shiftEach),\n          res = tryCatch(this._s.cb).apply(null, queuedValues);\n      if (res === errorObj) { return this._s.o.onError(res.e); }\n      this._s.o.onNext(res);\n    } else if (this._s.done.filter(notTheSame(this._i)).every(identity)) {\n      this._s.o.onCompleted();\n    }\n  };\n\n  ZipIterableObserver.prototype.error = function (e) { this._s.o.onError(e); };\n\n  ZipIterableObserver.prototype.completed = function () {\n    this._s.done[this._i] = true;\n    this._s.done.every(identity) && this._s.o.onCompleted();\n  };\n\n  return ZipIterableObserver;\n}(AbstractObserver));\n\n/**\n * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n */\nobservableProto.zipIterable = function () {\n  if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n\n  var parent = this;\n  args.unshift(parent);\n  return new ZipIterableObservable(args, resultSelector);\n};\n\n  function asObservable(source) {\n    return function subscribe(o) { return source.subscribe(o); };\n  }\n\n  /**\n   *  Hides the identity of an observable sequence.\n   * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n   */\n  observableProto.asObservable = function () {\n    return new AnonymousObservable(asObservable(this), this);\n  };\n\n  function toArray(x) { return x.toArray(); }\n  function notEmpty(x) { return x.length > 0; }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n   * @param {Number} count Length of each buffer.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithCount = observableProto.bufferCount = function (count, skip) {\n    typeof skip !== 'number' && (skip = count);\n    return this.windowWithCount(count, skip)\n      .flatMap(toArray)\n      .filter(notEmpty);\n  };\n\n  var DematerializeObservable = (function (__super__) {\n    inherits(DematerializeObservable, __super__);\n    function DematerializeObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    DematerializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DematerializeObserver(o));\n    };\n\n    return DematerializeObservable;\n  }(ObservableBase));\n\n  var DematerializeObserver = (function (__super__) {\n    inherits(DematerializeObserver, __super__);\n\n    function DematerializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    DematerializeObserver.prototype.next = function (x) { x.accept(this._o); };\n    DematerializeObserver.prototype.error = function (e) { this._o.onError(e); };\n    DematerializeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DematerializeObserver;\n  }(AbstractObserver));\n\n  /**\n   * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n   * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n   */\n  observableProto.dematerialize = function () {\n    return new DematerializeObservable(this);\n  };\n\n  var DistinctUntilChangedObservable = (function(__super__) {\n    inherits(DistinctUntilChangedObservable, __super__);\n    function DistinctUntilChangedObservable(source, keyFn, comparer) {\n      this.source = source;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctUntilChangedObserver(o, this.keyFn, this.comparer));\n    };\n\n    return DistinctUntilChangedObservable;\n  }(ObservableBase));\n\n  var DistinctUntilChangedObserver = (function(__super__) {\n    inherits(DistinctUntilChangedObserver, __super__);\n    function DistinctUntilChangedObserver(o, keyFn, comparer) {\n      this.o = o;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      this.hasCurrentKey = false;\n      this.currentKey = null;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObserver.prototype.next = function (x) {\n      var key = x, comparerEquals;\n      if (isFunction(this.keyFn)) {\n        key = tryCatch(this.keyFn)(x);\n        if (key === errorObj) { return this.o.onError(key.e); }\n      }\n      if (this.hasCurrentKey) {\n        comparerEquals = tryCatch(this.comparer)(this.currentKey, key);\n        if (comparerEquals === errorObj) { return this.o.onError(comparerEquals.e); }\n      }\n      if (!this.hasCurrentKey || !comparerEquals) {\n        this.hasCurrentKey = true;\n        this.currentKey = key;\n        this.o.onNext(x);\n      }\n    };\n    DistinctUntilChangedObserver.prototype.error = function(e) {\n      this.o.onError(e);\n    };\n    DistinctUntilChangedObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return DistinctUntilChangedObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Returns an observable sequence that contains only distinct contiguous elements according to the keyFn and the comparer.\n  * @param {Function} [keyFn] A function to compute the comparison key for each element. If not provided, it projects the value.\n  * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n  * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n  */\n  observableProto.distinctUntilChanged = function (keyFn, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctUntilChangedObservable(this, keyFn, comparer);\n  };\n\n  var TapObservable = (function(__super__) {\n    inherits(TapObservable,__super__);\n    function TapObservable(source, observerOrOnNext, onError, onCompleted) {\n      this.source = source;\n      this._oN = observerOrOnNext;\n      this._oE = onError;\n      this._oC = onCompleted;\n      __super__.call(this);\n    }\n\n    TapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, p) {\n      this.o = o;\n      this.t = !p._oN || isFunction(p._oN) ?\n        observerCreate(p._oN || noop, p._oE || noop, p._oC || noop) :\n        p._oN;\n      this.isStopped = false;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function(x) {\n      var res = tryCatch(this.t.onNext).call(this.t, x);\n      if (res === errorObj) { this.o.onError(res.e); }\n      this.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function(err) {\n      var res = tryCatch(this.t.onError).call(this.t, err);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onError(err);\n    };\n    InnerObserver.prototype.completed = function() {\n      var res = tryCatch(this.t.onCompleted).call(this.t);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onCompleted();\n    };\n\n    return TapObservable;\n  }(ObservableBase));\n\n  /**\n  *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an o.\n  * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto['do'] = observableProto.tap = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) {\n    return new TapObservable(this, observerOrOnNext, onError, onCompleted);\n  };\n\n  /**\n  *  Invokes an action for each element in the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onNext Action to invoke for each element in the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnNext = observableProto.tapOnNext = function (onNext, thisArg) {\n    return this.tap(typeof thisArg !== 'undefined' ? function (x) { onNext.call(thisArg, x); } : onNext);\n  };\n\n  /**\n  *  Invokes an action upon exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnError = observableProto.tapOnError = function (onError, thisArg) {\n    return this.tap(noop, typeof thisArg !== 'undefined' ? function (e) { onError.call(thisArg, e); } : onError);\n  };\n\n  /**\n  *  Invokes an action upon graceful termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnCompleted = observableProto.tapOnCompleted = function (onCompleted, thisArg) {\n    return this.tap(noop, null, typeof thisArg !== 'undefined' ? function () { onCompleted.call(thisArg); } : onCompleted);\n  };\n\n  var FinallyObservable = (function (__super__) {\n    inherits(FinallyObservable, __super__);\n    function FinallyObservable(source, fn, thisArg) {\n      this.source = source;\n      this._fn = bindCallback(fn, thisArg, 0);\n      __super__.call(this);\n    }\n\n    FinallyObservable.prototype.subscribeCore = function (o) {\n      var d = tryCatch(this.source.subscribe).call(this.source, o);\n      if (d === errorObj) {\n        this._fn();\n        thrower(d.e);\n      }\n\n      return new FinallyDisposable(d, this._fn);\n    };\n\n    function FinallyDisposable(s, fn) {\n      this.isDisposed = false;\n      this._s = s;\n      this._fn = fn;\n    }\n    FinallyDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        var res = tryCatch(this._s.dispose).call(this._s);\n        this._fn();\n        res === errorObj && thrower(res.e);\n      }\n    };\n\n    return FinallyObservable;\n\n  }(ObservableBase));\n\n  /**\n   *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n   * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n   * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n   */\n  observableProto['finally'] = function (action, thisArg) {\n    return new FinallyObservable(this, action, thisArg);\n  };\n\n  var IgnoreElementsObservable = (function(__super__) {\n    inherits(IgnoreElementsObservable, __super__);\n\n    function IgnoreElementsObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    IgnoreElementsObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    function InnerObserver(o) {\n      this.o = o;\n      this.isStopped = false;\n    }\n    InnerObserver.prototype.onNext = noop;\n    InnerObserver.prototype.onError = function (err) {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onError(err);\n      }\n    };\n    InnerObserver.prototype.onCompleted = function () {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onCompleted();\n      }\n    };\n    InnerObserver.prototype.dispose = function() { this.isStopped = true; };\n    InnerObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.observer.onError(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return IgnoreElementsObservable;\n  }(ObservableBase));\n\n  /**\n   *  Ignores all elements in an observable sequence leaving only the termination messages.\n   * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n   */\n  observableProto.ignoreElements = function () {\n    return new IgnoreElementsObservable(this);\n  };\n\n  var MaterializeObservable = (function (__super__) {\n    inherits(MaterializeObservable, __super__);\n    function MaterializeObservable(source, fn) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MaterializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new MaterializeObserver(o));\n    };\n\n    return MaterializeObservable;\n  }(ObservableBase));\n\n  var MaterializeObserver = (function (__super__) {\n    inherits(MaterializeObserver, __super__);\n\n    function MaterializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    MaterializeObserver.prototype.next = function (x) { this._o.onNext(notificationCreateOnNext(x)) };\n    MaterializeObserver.prototype.error = function (e) { this._o.onNext(notificationCreateOnError(e)); this._o.onCompleted(); };\n    MaterializeObserver.prototype.completed = function () { this._o.onNext(notificationCreateOnCompleted()); this._o.onCompleted(); };\n\n    return MaterializeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n   * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n   */\n  observableProto.materialize = function () {\n    return new MaterializeObservable(this);\n  };\n\n  /**\n   *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n   * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n   * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n   */\n  observableProto.repeat = function (repeatCount) {\n    return enumerableRepeat(this, repeatCount).concat();\n  };\n\n  /**\n   *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n   *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n   *\n   * @example\n   *  var res = retried = retry.repeat();\n   *  var res = retried = retry.repeat(2);\n   * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retry = function (retryCount) {\n    return enumerableRepeat(this, retryCount).catchError();\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RetryWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RetryWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RetryWhenObservable, __super__);\n\n    RetryWhenObservable.prototype.subscribeCore = function (o) {\n      var exceptions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(exceptions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            exceptions.onNext(exn);\n            outer.dispose();\n          },\n          function() { o.onCompleted(); }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RetryWhenObservable;\n  }(ObservableBase));\n\n  observableProto.retryWhen = function (notifier) {\n    return new RetryWhenObservable(repeat(this), notifier);\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RepeatWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RepeatWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RepeatWhenObservable, __super__);\n\n    RepeatWhenObservable.prototype.subscribeCore = function (o) {\n      var completions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(completions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) { o.onError(exn); },\n          function() {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            completions.onNext(null);\n            outer.dispose();\n          }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RepeatWhenObservable;\n  }(ObservableBase));\n\n  observableProto.repeatWhen = function (notifier) {\n    return new RepeatWhenObservable(repeat(this), notifier);\n  };\n\n  var ScanObservable = (function(__super__) {\n    inherits(ScanObservable, __super__);\n    function ScanObservable(source, accumulator, hasSeed, seed) {\n      this.source = source;\n      this.accumulator = accumulator;\n      this.hasSeed = hasSeed;\n      this.seed = seed;\n      __super__.call(this);\n    }\n\n    ScanObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new ScanObserver(o,this));\n    };\n\n    return ScanObservable;\n  }(ObservableBase));\n\n  var ScanObserver = (function (__super__) {\n    inherits(ScanObserver, __super__);\n    function ScanObserver(o, parent) {\n      this._o = o;\n      this._p = parent;\n      this._fn = parent.accumulator;\n      this._hs = parent.hasSeed;\n      this._s = parent.seed;\n      this._ha = false;\n      this._a = null;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    ScanObserver.prototype.next = function (x) {\n      !this._hv && (this._hv = true);\n      if (this._ha) {\n        this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n      } else {\n        this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n        this._ha = true;\n      }\n      if (this._a === errorObj) { return this._o.onError(this._a.e); }\n      this._o.onNext(this._a);\n      this._i++;\n    };\n\n    ScanObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ScanObserver.prototype.completed = function () {\n      !this._hv && this._hs && this._o.onNext(this._s);\n      this._o.onCompleted();\n    };\n\n    return ScanObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n  *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n  * @param {Mixed} [seed] The initial accumulator value.\n  * @param {Function} accumulator An accumulator function to be invoked on each element.\n  * @returns {Observable} An observable sequence containing the accumulated values.\n  */\n  observableProto.scan = function () {\n    var hasSeed = false, seed, accumulator = arguments[0];\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new ScanObservable(this, accumulator, hasSeed, seed);\n  };\n\n  var SkipLastObservable = (function (__super__) {\n    inherits(SkipLastObservable, __super__);\n    function SkipLastObservable(source, c) {\n      this.source = source;\n      this._c = c;\n      __super__.call(this);\n    }\n\n    SkipLastObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipLastObserver(o, this._c));\n    };\n\n    return SkipLastObservable;\n  }(ObservableBase));\n\n  var SkipLastObserver = (function (__super__) {\n    inherits(SkipLastObserver, __super__);\n    function SkipLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    SkipLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._o.onNext(this._q.shift());\n    };\n\n    SkipLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    SkipLastObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return SkipLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses a specified number of elements at the end of an observable sequence.\n   * @description\n   *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n   *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n   * @param count Number of elements to bypass at the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n   */\n  observableProto.skipLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipLastObservable(this, count);\n  };\n\n  /**\n   *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n   *  @example\n   *  var res = source.startWith(1, 2, 3);\n   *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n   * @param {Arguments} args The specified values to prepend to the observable sequence\n   * @returns {Observable} The source sequence prepended with the specified values.\n   */\n  observableProto.startWith = function () {\n    var values, scheduler, start = 0;\n    if (!!arguments.length && isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      start = 1;\n    } else {\n      scheduler = immediateScheduler;\n    }\n    for(var args = [], i = start, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableConcat.apply(null, [observableFromArray(args, scheduler), this]);\n  };\n\n  var TakeLastObserver = (function (__super__) {\n    inherits(TakeLastObserver, __super__);\n    function TakeLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastObserver.prototype.completed = function () {\n      while (this._q.length > 0) { this._o.onNext(this._q.shift()); }\n      this._o.onCompleted();\n    };\n\n    return TakeLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns a specified number of contiguous elements from the end of an observable sequence.\n   * @description\n   *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n   *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastObserver(o, count));\n    }, source);\n  };\n\n  var TakeLastBufferObserver = (function (__super__) {\n    inherits(TakeLastBufferObserver, __super__);\n    function TakeLastBufferObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastBufferObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastBufferObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastBufferObserver.prototype.completed = function () {\n      this._o.onNext(this._q);\n      this._o.onCompleted();\n    };\n\n    return TakeLastBufferObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n   *\n   * @description\n   *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n   *  source sequence, this buffer is produced on the result sequence.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLastBuffer = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastBufferObserver(o, count));\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n   * @param {Number} count Length of each window.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithCount = observableProto.windowCount = function (count, skip) {\n    var source = this;\n    +count || (count = 0);\n    Math.abs(count) === Infinity && (count = 0);\n    if (count <= 0) { throw new ArgumentOutOfRangeError(); }\n    skip == null && (skip = count);\n    +skip || (skip = 0);\n    Math.abs(skip) === Infinity && (skip = 0);\n\n    if (skip <= 0) { throw new ArgumentOutOfRangeError(); }\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(),\n        refCountDisposable = new RefCountDisposable(m),\n        n = 0,\n        q = [];\n\n      function createWindow () {\n        var s = new Subject();\n        q.push(s);\n        observer.onNext(addRef(s, refCountDisposable));\n      }\n\n      createWindow();\n\n      m.setDisposable(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n          var c = n - count + 1;\n          c >= 0 && c % skip === 0 && q.shift().onCompleted();\n          ++n % skip === 0 && createWindow();\n        },\n        function (e) {\n          while (q.length > 0) { q.shift().onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          while (q.length > 0) { q.shift().onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  function concatMap(source, selector, thisArg) {\n    var selectorFunc = bindCallback(selector, thisArg, 3);\n    return source.map(function (x, i) {\n      var result = selectorFunc(x, i, source);\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));\n      return result;\n    }).concatAll();\n  }\n\n  /**\n   *  One of the Following:\n   *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   * @example\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n   *  Or:\n   *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n   *\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n   *  Or:\n   *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n   * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n   * source sequence onto which could be either an observable or Promise.\n   * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n   */\n  observableProto.selectConcat = observableProto.concatMap = function (selector, resultSelector, thisArg) {\n    if (isFunction(selector) && isFunction(resultSelector)) {\n      return this.concatMap(function (x, i) {\n        var selectorResult = selector(x, i);\n        isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));\n        (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));\n\n        return selectorResult.map(function (y, i2) {\n          return resultSelector(x, y, i, i2);\n        });\n      });\n    }\n    return isFunction(selector) ?\n      concatMap(this, selector, thisArg) :\n      concatMap(this, function () { return selector; });\n  };\n\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.concatMapObserver = observableProto.selectConcatObserver = function(onNext, onError, onCompleted, thisArg) {\n    var source = this,\n        onNextFunc = bindCallback(onNext, thisArg, 2),\n        onErrorFunc = bindCallback(onError, thisArg, 1),\n        onCompletedFunc = bindCallback(onCompleted, thisArg, 0);\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNextFunc(x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onErrorFunc(err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompletedFunc();\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, this).concatAll();\n  };\n\n  var DefaultIfEmptyObserver = (function (__super__) {\n    inherits(DefaultIfEmptyObserver, __super__);\n    function DefaultIfEmptyObserver(o, d) {\n      this._o = o;\n      this._d = d;\n      this._f = false;\n      __super__.call(this);\n    }\n\n    DefaultIfEmptyObserver.prototype.next = function (x) {\n      this._f = true;\n      this._o.onNext(x);\n    };\n\n    DefaultIfEmptyObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    DefaultIfEmptyObserver.prototype.completed = function () {\n      !this._f && this._o.onNext(this._d);\n      this._o.onCompleted();\n    };\n\n    return DefaultIfEmptyObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n   *\n   *  var res = obs = xs.defaultIfEmpty();\n   *  2 - obs = xs.defaultIfEmpty(false);\n   *\n   * @memberOf Observable#\n   * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n   * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n   */\n    observableProto.defaultIfEmpty = function (defaultValue) {\n      var source = this;\n      defaultValue === undefined && (defaultValue = null);\n      return new AnonymousObservable(function (o) {\n        return source.subscribe(new DefaultIfEmptyObserver(o, defaultValue));\n      }, source);\n    };\n\n  // Swap out for Array.findIndex\n  function arrayIndexOfComparer(array, item, comparer) {\n    for (var i = 0, len = array.length; i < len; i++) {\n      if (comparer(array[i], item)) { return i; }\n    }\n    return -1;\n  }\n\n  function HashSet(comparer) {\n    this.comparer = comparer;\n    this.set = [];\n  }\n  HashSet.prototype.push = function(value) {\n    var retValue = arrayIndexOfComparer(this.set, value, this.comparer) === -1;\n    retValue && this.set.push(value);\n    return retValue;\n  };\n\n  var DistinctObservable = (function (__super__) {\n    inherits(DistinctObservable, __super__);\n    function DistinctObservable(source, keyFn, cmpFn) {\n      this.source = source;\n      this._keyFn = keyFn;\n      this._cmpFn = cmpFn;\n      __super__.call(this);\n    }\n\n    DistinctObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctObserver(o, this._keyFn, this._cmpFn));\n    };\n\n    return DistinctObservable;\n  }(ObservableBase));\n\n  var DistinctObserver = (function (__super__) {\n    inherits(DistinctObserver, __super__);\n    function DistinctObserver(o, keyFn, cmpFn) {\n      this._o = o;\n      this._keyFn = keyFn;\n      this._h = new HashSet(cmpFn);\n      __super__.call(this);\n    }\n\n    DistinctObserver.prototype.next = function (x) {\n      var key = x;\n      if (isFunction(this._keyFn)) {\n        key = tryCatch(this._keyFn)(x);\n        if (key === errorObj) { return this._o.onError(key.e); }\n      }\n      this._h.push(key) && this._o.onNext(x);\n    };\n\n    DistinctObserver.prototype.error = function (e) { this._o.onError(e); };\n    DistinctObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DistinctObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n   *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n   *\n   * @example\n   *  var res = obs = xs.distinct();\n   *  2 - obs = xs.distinct(function (x) { return x.id; });\n   *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n   * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n   * @param {Function} [comparer]  Used to compare items in the collection.\n   * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinct = function (keySelector, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctObservable(this, keySelector, comparer);\n  };\n\n  /**\n   *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n   *\n   * @example\n   *  var res = observable.groupBy(function (x) { return x.id; });\n   *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n   *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n   * @param {Function} keySelector A function to extract the key for each element.\n   * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n   * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n   */\n  observableProto.groupBy = function (keySelector, elementSelector) {\n    return this.groupByUntil(keySelector, elementSelector, observableNever);\n  };\n\n    /**\n     *  Groups the elements of an observable sequence according to a specified key selector function.\n     *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n     *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n     *\n     * @example\n     *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n     *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n     *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n     * @param {Function} keySelector A function to extract the key for each element.\n     * @param {Function} durationSelector A function to signal the expiration of a group.\n     * @returns {Observable}\n     *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n     *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n     *\n     */\n    observableProto.groupByUntil = function (keySelector, elementSelector, durationSelector) {\n      var source = this;\n      return new AnonymousObservable(function (o) {\n        var map = new Map(),\n          groupDisposable = new CompositeDisposable(),\n          refCountDisposable = new RefCountDisposable(groupDisposable),\n          handleError = function (e) { return function (item) { item.onError(e); }; };\n\n        groupDisposable.add(\n          source.subscribe(function (x) {\n            var key = tryCatch(keySelector)(x);\n            if (key === errorObj) {\n              map.forEach(handleError(key.e));\n              return o.onError(key.e);\n            }\n\n            var fireNewMapEntry = false, writer = map.get(key);\n            if (writer === undefined) {\n              writer = new Subject();\n              map.set(key, writer);\n              fireNewMapEntry = true;\n            }\n\n            if (fireNewMapEntry) {\n              var group = new GroupedObservable(key, writer, refCountDisposable),\n                durationGroup = new GroupedObservable(key, writer);\n              var duration = tryCatch(durationSelector)(durationGroup);\n              if (duration === errorObj) {\n                map.forEach(handleError(duration.e));\n                return o.onError(duration.e);\n              }\n\n              o.onNext(group);\n\n              var md = new SingleAssignmentDisposable();\n              groupDisposable.add(md);\n\n              md.setDisposable(duration.take(1).subscribe(\n                noop,\n                function (e) {\n                  map.forEach(handleError(e));\n                  o.onError(e);\n                },\n                function () {\n                  if (map['delete'](key)) { writer.onCompleted(); }\n                  groupDisposable.remove(md);\n                }));\n            }\n\n            var element = x;\n            if (isFunction(elementSelector)) {\n              element = tryCatch(elementSelector)(x);\n              if (element === errorObj) {\n                map.forEach(handleError(element.e));\n                return o.onError(element.e);\n              }\n            }\n\n            writer.onNext(element);\n        }, function (e) {\n          map.forEach(handleError(e));\n          o.onError(e);\n        }, function () {\n          map.forEach(function (item) { item.onCompleted(); });\n          o.onCompleted();\n        }));\n\n      return refCountDisposable;\n    }, source);\n  };\n\n  var MapObservable = (function (__super__) {\n    inherits(MapObservable, __super__);\n\n    function MapObservable(source, selector, thisArg) {\n      this.source = source;\n      this.selector = bindCallback(selector, thisArg, 3);\n      __super__.call(this);\n    }\n\n    function innerMap(selector, self) {\n      return function (x, i, o) { return selector.call(this, self.selector(x, i, o), i, o); };\n    }\n\n    MapObservable.prototype.internalMap = function (selector, thisArg) {\n      return new MapObservable(this.source, innerMap(selector, this), thisArg);\n    };\n\n    MapObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, selector, source) {\n      this.o = o;\n      this.selector = selector;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var result = tryCatch(this.selector)(x, this.i++, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n      this.o.onNext(result);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return MapObservable;\n\n  }(ObservableBase));\n\n  /**\n  * Projects each element of an observable sequence into a new form by incorporating the element's index.\n  * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n  */\n  observableProto.map = observableProto.select = function (selector, thisArg) {\n    var selectorFn = typeof selector === 'function' ? selector : function () { return selector; };\n    return this instanceof MapObservable ?\n      this.internalMap(selectorFn, thisArg) :\n      new MapObservable(this, selectorFn, thisArg);\n  };\n\n  function plucker(args, len) {\n    return function mapper(x) {\n      var currentProp = x;\n      for (var i = 0; i < len; i++) {\n        var p = currentProp[args[i]];\n        if (typeof p !== 'undefined') {\n          currentProp = p;\n        } else {\n          return undefined;\n        }\n      }\n      return currentProp;\n    };\n  }\n\n  /**\n   * Retrieves the value of a specified nested property from all elements in\n   * the Observable sequence.\n   * @param {Arguments} arguments The nested properties to pluck.\n   * @returns {Observable} Returns a new Observable sequence of property values.\n   */\n  observableProto.pluck = function () {\n    var len = arguments.length, args = new Array(len);\n    if (len === 0) { throw new Error('List of properties cannot be empty.'); }\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return this.map(plucker(args, len));\n  };\n\nobservableProto.flatMap = observableProto.selectMany = observableProto.mergeMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).mergeAll();\n};\n\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.flatMapObserver = observableProto.selectManyObserver = function (onNext, onError, onCompleted, thisArg) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNext.call(thisArg, x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onError.call(thisArg, err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompleted.call(thisArg);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, source).mergeAll();\n  };\n\nobservableProto.flatMapLatest = observableProto.switchMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).switchLatest();\n};\n\n  var SkipObservable = (function(__super__) {\n    inherits(SkipObservable, __super__);\n    function SkipObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    SkipObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipObserver(o, this._count));\n    };\n\n    function SkipObserver(o, c) {\n      this._o = o;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(SkipObserver, AbstractObserver);\n\n    SkipObserver.prototype.next = function (x) {\n      if (this._r <= 0) {\n        this._o.onNext(x);\n      } else {\n        this._r--;\n      }\n    };\n    SkipObserver.prototype.error = function(e) { this._o.onError(e); };\n    SkipObserver.prototype.completed = function() { this._o.onCompleted(); };\n\n    return SkipObservable;\n  }(ObservableBase));\n\n  /**\n   * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n   * @param {Number} count The number of elements to skip before returning the remaining elements.\n   * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n   */\n  observableProto.skip = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipObservable(this, count);\n  };\n\n  var SkipWhileObservable = (function (__super__) {\n    inherits(SkipWhileObservable, __super__);\n    function SkipWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SkipWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipWhileObserver(o, this));\n    };\n\n    return SkipWhileObservable;\n  }(ObservableBase));\n\n  var SkipWhileObserver = (function (__super__) {\n    inherits(SkipWhileObserver, __super__);\n\n    function SkipWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = false;\n      __super__.call(this);\n    }\n\n    SkipWhileObserver.prototype.next = function (x) {\n      if (!this._r) {\n        var res = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._r = !res;\n      }\n      this._r && this._o.onNext(x);\n    };\n    SkipWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n   *  The element's index is used in the logic of the predicate function.\n   *\n   *  var res = source.skipWhile(function (value) { return value < 10; });\n   *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n   */\n  observableProto.skipWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new SkipWhileObservable(this, fn);\n  };\n\n  var TakeObservable = (function(__super__) {\n    inherits(TakeObservable, __super__);\n    function TakeObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    TakeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeObserver(o, this._count));\n    };\n\n    function TakeObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(TakeObserver, AbstractObserver);\n\n    TakeObserver.prototype.next = function (x) {\n      if (this._r-- > 0) {\n        this._o.onNext(x);\n        this._r <= 0 && this._o.onCompleted();\n      }\n    };\n\n    TakeObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n   * @param {Number} count The number of elements to return.\n   * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n   * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n   */\n  observableProto.take = function (count, scheduler) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    if (count === 0) { return observableEmpty(scheduler); }\n    return new TakeObservable(this, count);\n  };\n\n  var TakeWhileObservable = (function (__super__) {\n    inherits(TakeWhileObservable, __super__);\n    function TakeWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    TakeWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeWhileObserver(o, this));\n    };\n\n    return TakeWhileObservable;\n  }(ObservableBase));\n\n  var TakeWhileObserver = (function (__super__) {\n    inherits(TakeWhileObserver, __super__);\n\n    function TakeWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = true;\n      __super__.call(this);\n    }\n\n    TakeWhileObserver.prototype.next = function (x) {\n      if (this._r) {\n        this._r = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (this._r === errorObj) { return this._o.onError(this._r.e); }\n      }\n      if (this._r) {\n        this._o.onNext(x);\n      } else {\n        this._o.onCompleted();\n      }\n    };\n    TakeWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns elements from an observable sequence as long as a specified condition is true.\n   *  The element's index is used in the logic of the predicate function.\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n   */\n  observableProto.takeWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new TakeWhileObservable(this, fn);\n  };\n\n  var FilterObservable = (function (__super__) {\n    inherits(FilterObservable, __super__);\n\n    function FilterObservable(source, predicate, thisArg) {\n      this.source = source;\n      this.predicate = bindCallback(predicate, thisArg, 3);\n      __super__.call(this);\n    }\n\n    FilterObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.predicate, this));\n    };\n\n    function innerPredicate(predicate, self) {\n      return function(x, i, o) { return self.predicate(x, i, o) && predicate.call(this, x, i, o); }\n    }\n\n    FilterObservable.prototype.internalFilter = function(predicate, thisArg) {\n      return new FilterObservable(this.source, innerPredicate(predicate, this), thisArg);\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, predicate, source) {\n      this.o = o;\n      this.predicate = predicate;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var shouldYield = tryCatch(this.predicate)(x, this.i++, this.source);\n      if (shouldYield === errorObj) {\n        return this.o.onError(shouldYield.e);\n      }\n      shouldYield && this.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return FilterObservable;\n\n  }(ObservableBase));\n\n  /**\n  *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n  * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n  */\n  observableProto.filter = observableProto.where = function (predicate, thisArg) {\n    return this instanceof FilterObservable ? this.internalFilter(predicate, thisArg) :\n      new FilterObservable(this, predicate, thisArg);\n  };\n\n  var ExtremaByObservable = (function (__super__) {\n    inherits(ExtremaByObservable, __super__);\n    function ExtremaByObservable(source, k, c) {\n      this.source = source;\n      this._k = k;\n      this._c = c;\n      __super__.call(this);\n    }\n\n    ExtremaByObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ExtremaByObserver(o, this._k, this._c));\n    };\n\n    return ExtremaByObservable;\n  }(ObservableBase));\n\n  var ExtremaByObserver = (function (__super__) {\n    inherits(ExtremaByObserver, __super__);\n    function ExtremaByObserver(o, k, c) {\n      this._o = o;\n      this._k = k;\n      this._c = c;\n      this._v = null;\n      this._hv = false;\n      this._l = [];\n      __super__.call(this);\n    }\n\n    ExtremaByObserver.prototype.next = function (x) {\n      var key = tryCatch(this._k)(x);\n      if (key === errorObj) { return this._o.onError(key.e); }\n      var comparison = 0;\n      if (!this._hv) {\n        this._hv = true;\n        this._v = key;\n      } else {\n        comparison = tryCatch(this._c)(key, this._v);\n        if (comparison === errorObj) { return this._o.onError(comparison.e); }\n      }\n      if (comparison > 0) {\n        this._v = key;\n        this._l = [];\n      }\n      if (comparison >= 0) { this._l.push(x); }\n    };\n\n    ExtremaByObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ExtremaByObserver.prototype.completed = function () {\n      this._o.onNext(this._l);\n      this._o.onCompleted();\n    };\n\n    return ExtremaByObserver;\n  }(AbstractObserver));\n\n  function firstOnly(x) {\n    if (x.length === 0) { throw new EmptyError(); }\n    return x[0];\n  }\n\n  var ReduceObservable = (function(__super__) {\n    inherits(ReduceObservable, __super__);\n    function ReduceObservable(source, accumulator, hasSeed, seed) {\n      this.source = source;\n      this.accumulator = accumulator;\n      this.hasSeed = hasSeed;\n      this.seed = seed;\n      __super__.call(this);\n    }\n\n    ReduceObservable.prototype.subscribeCore = function(observer) {\n      return this.source.subscribe(new ReduceObserver(observer,this));\n    };\n\n    return ReduceObservable;\n  }(ObservableBase));\n\n  var ReduceObserver = (function (__super__) {\n    inherits(ReduceObserver, __super__);\n    function ReduceObserver(o, parent) {\n      this._o = o;\n      this._p = parent;\n      this._fn = parent.accumulator;\n      this._hs = parent.hasSeed;\n      this._s = parent.seed;\n      this._ha = false;\n      this._a = null;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    ReduceObserver.prototype.next = function (x) {\n      !this._hv && (this._hv = true);\n      if (this._ha) {\n        this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n      } else {\n        this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n        this._ha = true;\n      }\n      if (this._a === errorObj) { return this._o.onError(this._a.e); }\n      this._i++;\n    };\n\n    ReduceObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ReduceObserver.prototype.completed = function () {\n      this._hv && this._o.onNext(this._a);\n      !this._hv && this._hs && this._o.onNext(this._s);\n      !this._hv && !this._hs && this._o.onError(new EmptyError());\n      this._o.onCompleted();\n    };\n\n    return ReduceObserver;\n  }(AbstractObserver));\n\n  /**\n  * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n  * For aggregation behavior with incremental intermediate results, see Observable.scan.\n  * @param {Function} accumulator An accumulator function to be invoked on each element.\n  * @param {Any} [seed] The initial accumulator value.\n  * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n  */\n  observableProto.reduce = function () {\n    var hasSeed = false, seed, accumulator = arguments[0];\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new ReduceObservable(this, accumulator, hasSeed, seed);\n  };\n\n  var SomeObservable = (function (__super__) {\n    inherits(SomeObservable, __super__);\n    function SomeObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SomeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SomeObserver(o, this._fn, this.source));\n    };\n\n    return SomeObservable;\n  }(ObservableBase));\n\n  var SomeObserver = (function (__super__) {\n    inherits(SomeObserver, __super__);\n\n    function SomeObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    SomeObserver.prototype.next = function (x) {\n      var result = tryCatch(this._fn)(x, this._i++, this._s);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      if (Boolean(result)) {\n        this._o.onNext(true);\n        this._o.onCompleted();\n      }\n    };\n    SomeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SomeObserver.prototype.completed = function () {\n      this._o.onNext(false);\n      this._o.onCompleted();\n    };\n\n    return SomeObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether any element of an observable sequence satisfies a condition if present, else if any items are in the sequence.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @returns {Observable} An observable sequence containing a single element determining whether any elements in the source sequence pass the test in the specified predicate if given, else if any items are in the sequence.\n   */\n  observableProto.some = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new SomeObservable(this, fn);\n  };\n\n  var IsEmptyObservable = (function (__super__) {\n    inherits(IsEmptyObservable, __super__);\n    function IsEmptyObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    IsEmptyObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new IsEmptyObserver(o));\n    };\n\n    return IsEmptyObservable;\n  }(ObservableBase));\n\n  var IsEmptyObserver = (function(__super__) {\n    inherits(IsEmptyObserver, __super__);\n    function IsEmptyObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    IsEmptyObserver.prototype.next = function () {\n      this._o.onNext(false);\n      this._o.onCompleted();\n    };\n    IsEmptyObserver.prototype.error = function (e) { this._o.onError(e); };\n    IsEmptyObserver.prototype.completed = function () {\n      this._o.onNext(true);\n      this._o.onCompleted();\n    };\n\n    return IsEmptyObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether an observable sequence is empty.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence is empty.\n   */\n  observableProto.isEmpty = function () {\n    return new IsEmptyObservable(this);\n  };\n\n  var EveryObservable = (function (__super__) {\n    inherits(EveryObservable, __super__);\n    function EveryObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    EveryObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new EveryObserver(o, this._fn, this.source));\n    };\n\n    return EveryObservable;\n  }(ObservableBase));\n\n  var EveryObserver = (function (__super__) {\n    inherits(EveryObserver, __super__);\n\n    function EveryObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    EveryObserver.prototype.next = function (x) {\n      var result = tryCatch(this._fn)(x, this._i++, this._s);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      if (!Boolean(result)) {\n        this._o.onNext(false);\n        this._o.onCompleted();\n      }\n    };\n    EveryObserver.prototype.error = function (e) { this._o.onError(e); };\n    EveryObserver.prototype.completed = function () {\n      this._o.onNext(true);\n      this._o.onCompleted();\n    };\n\n    return EveryObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether all elements of an observable sequence satisfy a condition.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element determining whether all elements in the source sequence pass the test in the specified predicate.\n   */\n  observableProto.every = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new EveryObservable(this, fn);\n  };\n\n  var IncludesObservable = (function (__super__) {\n    inherits(IncludesObservable, __super__);\n    function IncludesObservable(source, elem, idx) {\n      var n = +idx || 0;\n      Math.abs(n) === Infinity && (n = 0);\n\n      this.source = source;\n      this._elem = elem;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    IncludesObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(false);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new IncludesObserver(o, this._elem, this._n));\n    };\n\n    return IncludesObservable;\n  }(ObservableBase));\n\n  var IncludesObserver = (function (__super__) {\n    inherits(IncludesObserver, __super__);\n    function IncludesObserver(o, elem, n) {\n      this._o = o;\n      this._elem = elem;\n      this._n = n;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    function comparer(a, b) {\n      return (a === 0 && b === 0) || (a === b || (isNaN(a) && isNaN(b)));\n    }\n\n    IncludesObserver.prototype.next = function (x) {\n      if (this._i++ >= this._n && comparer(x, this._elem)) {\n        this._o.onNext(true);\n        this._o.onCompleted();\n      }\n    };\n    IncludesObserver.prototype.error = function (e) { this._o.onError(e); };\n    IncludesObserver.prototype.completed = function () { this._o.onNext(false); this._o.onCompleted(); };\n\n    return IncludesObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether an observable sequence includes a specified element with an optional equality comparer.\n   * @param searchElement The value to locate in the source sequence.\n   * @param {Number} [fromIndex] An equality comparer to compare elements.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence includes an element that has the specified value from the given index.\n   */\n  observableProto.includes = function (searchElement, fromIndex) {\n    return new IncludesObservable(this, searchElement, fromIndex);\n  };\n\n  var CountObservable = (function (__super__) {\n    inherits(CountObservable, __super__);\n    function CountObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CountObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new CountObserver(o, this._fn, this.source));\n    };\n\n    return CountObservable;\n  }(ObservableBase));\n\n  var CountObserver = (function (__super__) {\n    inherits(CountObserver, __super__);\n\n    function CountObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      this._c = 0;\n      __super__.call(this);\n    }\n\n    CountObserver.prototype.next = function (x) {\n      if (this._fn) {\n        var result = tryCatch(this._fn)(x, this._i++, this._s);\n        if (result === errorObj) { return this._o.onError(result.e); }\n        Boolean(result) && (this._c++);\n      } else {\n        this._c++;\n      }\n    };\n    CountObserver.prototype.error = function (e) { this._o.onError(e); };\n    CountObserver.prototype.completed = function () {\n      this._o.onNext(this._c);\n      this._o.onCompleted();\n    };\n\n    return CountObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns an observable sequence containing a value that represents how many elements in the specified observable sequence satisfy a condition if provided, else the count of items.\n   * @example\n   * res = source.count();\n   * res = source.count(function (x) { return x > 3; });\n   * @param {Function} [predicate]A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with a number that represents how many elements in the input sequence satisfy the condition in the predicate function if provided, else the count of items in the sequence.\n   */\n  observableProto.count = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new CountObservable(this, fn);\n  };\n\n  var IndexOfObservable = (function (__super__) {\n    inherits(IndexOfObservable, __super__);\n    function IndexOfObservable(source, e, n) {\n      this.source = source;\n      this._e = e;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    IndexOfObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(-1);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new IndexOfObserver(o, this._e, this._n));\n    };\n\n    return IndexOfObservable;\n  }(ObservableBase));\n\n  var IndexOfObserver = (function (__super__) {\n    inherits(IndexOfObserver, __super__);\n    function IndexOfObserver(o, e, n) {\n      this._o = o;\n      this._e = e;\n      this._n = n;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    IndexOfObserver.prototype.next = function (x) {\n      if (this._i >= this._n && x === this._e) {\n        this._o.onNext(this._i);\n        this._o.onCompleted();\n      }\n      this._i++;\n    };\n    IndexOfObserver.prototype.error = function (e) { this._o.onError(e); };\n    IndexOfObserver.prototype.completed = function () { this._o.onNext(-1); this._o.onCompleted(); };\n\n    return IndexOfObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   * @param {Any} searchElement Element to locate in the array.\n   * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n   * @returns {Observable} And observable sequence containing the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   */\n  observableProto.indexOf = function(searchElement, fromIndex) {\n    var n = +fromIndex || 0;\n    Math.abs(n) === Infinity && (n = 0);\n    return new IndexOfObservable(this, searchElement, n);\n  };\n\n  var SumObservable = (function (__super__) {\n    inherits(SumObservable, __super__);\n    function SumObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SumObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SumObserver(o, this._fn, this.source));\n    };\n\n    return SumObservable;\n  }(ObservableBase));\n\n  var SumObserver = (function (__super__) {\n    inherits(SumObserver, __super__);\n\n    function SumObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      this._c = 0;\n      __super__.call(this);\n    }\n\n    SumObserver.prototype.next = function (x) {\n      if (this._fn) {\n        var result = tryCatch(this._fn)(x, this._i++, this._s);\n        if (result === errorObj) { return this._o.onError(result.e); }\n        this._c += result;\n      } else {\n        this._c += x;\n      }\n    };\n    SumObserver.prototype.error = function (e) { this._o.onError(e); };\n    SumObserver.prototype.completed = function () {\n      this._o.onNext(this._c);\n      this._o.onCompleted();\n    };\n\n    return SumObserver;\n  }(AbstractObserver));\n\n  /**\n   * Computes the sum of a sequence of values that are obtained by invoking an optional transform function on each element of the input sequence, else if not specified computes the sum on each item in the sequence.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the sum of the values in the source sequence.\n   */\n  observableProto.sum = function (keySelector, thisArg) {\n    var fn = bindCallback(keySelector, thisArg, 3);\n    return new SumObservable(this, fn);\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n   * @example\n   * var res = source.minBy(function (x) { return x.value; });\n   * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer] Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n   */\n  observableProto.minBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return new ExtremaByObservable(this, keySelector, function (x, y) { return comparer(x, y) * -1; });\n  };\n\n  /**\n   * Returns the minimum element in an observable sequence according to the optional comparer else a default greater than less than check.\n   * @example\n   * var res = source.min();\n   * var res = source.min(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the minimum element in the source sequence.\n   */\n  observableProto.min = function (comparer) {\n    return this.minBy(identity, comparer).map(firstOnly);\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n   * @example\n   * var res = source.maxBy(function (x) { return x.value; });\n   * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer]  Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n   */\n  observableProto.maxBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return new ExtremaByObservable(this, keySelector, comparer);\n  };\n\n  /**\n   * Returns the maximum value in an observable sequence according to the specified comparer.\n   * @example\n   * var res = source.max();\n   * var res = source.max(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the maximum element in the source sequence.\n   */\n  observableProto.max = function (comparer) {\n    return this.maxBy(identity, comparer).map(firstOnly);\n  };\n\n  var AverageObservable = (function (__super__) {\n    inherits(AverageObservable, __super__);\n    function AverageObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    AverageObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new AverageObserver(o, this._fn, this.source));\n    };\n\n    return AverageObservable;\n  }(ObservableBase));\n\n  var AverageObserver = (function(__super__) {\n    inherits(AverageObserver, __super__);\n    function AverageObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._c = 0;\n      this._t = 0;\n      __super__.call(this);\n    }\n\n    AverageObserver.prototype.next = function (x) {\n      if(this._fn) {\n        var r = tryCatch(this._fn)(x, this._c++, this._s);\n        if (r === errorObj) { return this._o.onError(r.e); }\n        this._t += r;\n      } else {\n        this._c++;\n        this._t += x;\n      }\n    };\n    AverageObserver.prototype.error = function (e) { this._o.onError(e); };\n    AverageObserver.prototype.completed = function () {\n      if (this._c === 0) { return this._o.onError(new EmptyError()); }\n      this._o.onNext(this._t / this._c);\n      this._o.onCompleted();\n    };\n\n    return AverageObserver;\n  }(AbstractObserver));\n\n  /**\n   * Computes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the average of the sequence of values.\n   */\n  observableProto.average = function (keySelector, thisArg) {\n    var source = this, fn;\n    if (isFunction(keySelector)) {\n      fn = bindCallback(keySelector, thisArg, 3);\n    }\n    return new AverageObservable(source, fn);\n  };\n\n  /**\n   *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n   *\n   * @example\n   * var res = res = source.sequenceEqual([1,2,3]);\n   * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n   * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n   * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n   * @param {Observable} second Second observable sequence or array to compare.\n   * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n   * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n   */\n  observableProto.sequenceEqual = function (second, comparer) {\n    var first = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var donel = false, doner = false, ql = [], qr = [];\n      var subscription1 = first.subscribe(function (x) {\n        if (qr.length > 0) {\n          var v = qr.shift();\n          var equal = tryCatch(comparer)(v, x);\n          if (equal === errorObj) { return o.onError(equal.e); }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (doner) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          ql.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        donel = true;\n        if (ql.length === 0) {\n          if (qr.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (doner) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n\n      (isArrayLike(second) || isIterable(second)) && (second = observableFrom(second));\n      isPromise(second) && (second = observableFromPromise(second));\n      var subscription2 = second.subscribe(function (x) {\n        if (ql.length > 0) {\n          var v = ql.shift();\n          var equal = tryCatch(comparer)(v, x);\n          if (equal === errorObj) { return o.onError(equal.e); }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (donel) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          qr.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        doner = true;\n        if (qr.length === 0) {\n          if (ql.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (donel) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n      return new BinaryDisposable(subscription1, subscription2);\n    }, first);\n  };\n\n  var ElementAtObservable = (function (__super__) {\n    inherits(ElementAtObservable, __super__);\n    function ElementAtObservable(source, i, d) {\n      this.source = source;\n      this._i = i;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    ElementAtObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ElementAtObserver(o, this._i, this._d));\n    };\n\n    return ElementAtObservable;\n  }(ObservableBase));\n\n  var ElementAtObserver = (function (__super__) {\n    inherits(ElementAtObserver, __super__);\n\n    function ElementAtObserver(o, i, d) {\n      this._o = o;\n      this._i = i;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    ElementAtObserver.prototype.next = function (x) {\n      if (this._i-- === 0) {\n        this._o.onNext(x);\n        this._o.onCompleted();\n      }\n    };\n    ElementAtObserver.prototype.error = function (e) { this._o.onError(e); };\n    ElementAtObserver.prototype.completed = function () {\n      if (this._d === undefined) {\n        this._o.onError(new ArgumentOutOfRangeError());\n      } else {\n        this._o.onNext(this._d);\n        this._o.onCompleted();\n      }\n    };\n\n    return ElementAtObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the element at a specified index in a sequence or default value if not found.\n   * @param {Number} index The zero-based index of the element to retrieve.\n   * @param {Any} [defaultValue] The default value to use if elementAt does not find a value.\n   * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence.\n   */\n  observableProto.elementAt =  function (index, defaultValue) {\n    if (index < 0) { throw new ArgumentOutOfRangeError(); }\n    return new ElementAtObservable(this, index, defaultValue);\n  };\n\n  var SingleObserver = (function(__super__) {\n    inherits(SingleObserver, __super__);\n    function SingleObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      this._hv = false;\n      this._v = null;\n      __super__.call(this);\n    }\n\n    SingleObserver.prototype.next = function (x) {\n      var shouldYield = false;\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        Boolean(res) && (shouldYield = true);\n      } else if (!this._obj.predicate) {\n        shouldYield = true;\n      }\n      if (shouldYield) {\n        if (this._hv) {\n          return this._o.onError(new Error('Sequence contains more than one matching element'));\n        }\n        this._hv = true;\n        this._v = x;\n      }\n    };\n    SingleObserver.prototype.error = function (e) { this._o.onError(e); };\n    SingleObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n        this._o.onCompleted();\n      }\n      else if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return SingleObserver;\n  }(AbstractObserver));\n\n\n    /**\n     * Returns the only element of an observable sequence that satisfies the condition in the optional predicate, and reports an exception if there is not exactly one element in the observable sequence.\n     * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate.\n     */\n    observableProto.single = function (predicate, thisArg) {\n      var obj = {}, source = this;\n      if (typeof arguments[0] === 'object') {\n        obj = arguments[0];\n      } else {\n        obj = {\n          predicate: arguments[0],\n          thisArg: arguments[1],\n          defaultValue: arguments[2]\n        };\n      }\n      if (isFunction (obj.predicate)) {\n        var fn = obj.predicate;\n        obj.predicate = bindCallback(fn, obj.thisArg, 3);\n      }\n      return new AnonymousObservable(function (o) {\n        return source.subscribe(new SingleObserver(o, obj, source));\n      }, source);\n    };\n\n  var FirstObservable = (function (__super__) {\n    inherits(FirstObservable, __super__);\n    function FirstObservable(source, obj) {\n      this.source = source;\n      this._obj = obj;\n      __super__.call(this);\n    }\n\n    FirstObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new FirstObserver(o, this._obj, this.source));\n    };\n\n    return FirstObservable;\n  }(ObservableBase));\n\n  var FirstObserver = (function(__super__) {\n    inherits(FirstObserver, __super__);\n    function FirstObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    FirstObserver.prototype.next = function (x) {\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        if (Boolean(res)) {\n          this._o.onNext(x);\n          this._o.onCompleted();\n        }\n      } else if (!this._obj.predicate) {\n        this._o.onNext(x);\n        this._o.onCompleted();\n      }\n    };\n    FirstObserver.prototype.error = function (e) { this._o.onError(e); };\n    FirstObserver.prototype.completed = function () {\n      if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return FirstObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the first element of an observable sequence that satisfies the condition in the predicate if present else the first item in the sequence.\n   * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate if provided, else the first item in the sequence.\n   */\n  observableProto.first = function () {\n    var obj = {}, source = this;\n    if (typeof arguments[0] === 'object') {\n      obj = arguments[0];\n    } else {\n      obj = {\n        predicate: arguments[0],\n        thisArg: arguments[1],\n        defaultValue: arguments[2]\n      };\n    }\n    if (isFunction (obj.predicate)) {\n      var fn = obj.predicate;\n      obj.predicate = bindCallback(fn, obj.thisArg, 3);\n    }\n    return new FirstObservable(this, obj);\n  };\n\n  var LastObservable = (function (__super__) {\n    inherits(LastObservable, __super__);\n    function LastObservable(source, obj) {\n      this.source = source;\n      this._obj = obj;\n      __super__.call(this);\n    }\n\n    LastObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new LastObserver(o, this._obj, this.source));\n    };\n\n    return LastObservable;\n  }(ObservableBase));\n\n  var LastObserver = (function(__super__) {\n    inherits(LastObserver, __super__);\n    function LastObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      this._hv = false;\n      this._v = null;\n      __super__.call(this);\n    }\n\n    LastObserver.prototype.next = function (x) {\n      var shouldYield = false;\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        Boolean(res) && (shouldYield = true);\n      } else if (!this._obj.predicate) {\n        shouldYield = true;\n      }\n      if (shouldYield) {\n        this._hv = true;\n        this._v = x;\n      }\n    };\n    LastObserver.prototype.error = function (e) { this._o.onError(e); };\n    LastObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n        this._o.onCompleted();\n      }\n      else if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return LastObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the last element of an observable sequence that satisfies the condition in the predicate if specified, else the last element.\n   * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate.\n   */\n  observableProto.last = function () {\n    var obj = {}, source = this;\n    if (typeof arguments[0] === 'object') {\n      obj = arguments[0];\n    } else {\n      obj = {\n        predicate: arguments[0],\n        thisArg: arguments[1],\n        defaultValue: arguments[2]\n      };\n    }\n    if (isFunction (obj.predicate)) {\n      var fn = obj.predicate;\n      obj.predicate = bindCallback(fn, obj.thisArg, 3);\n    }\n    return new LastObservable(this, obj);\n  };\n\n  var FindValueObserver = (function(__super__) {\n    inherits(FindValueObserver, __super__);\n    function FindValueObserver(observer, source, callback, yieldIndex) {\n      this._o = observer;\n      this._s = source;\n      this._cb = callback;\n      this._y = yieldIndex;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    FindValueObserver.prototype.next = function (x) {\n      var shouldRun = tryCatch(this._cb)(x, this._i, this._s);\n      if (shouldRun === errorObj) { return this._o.onError(shouldRun.e); }\n      if (shouldRun) {\n        this._o.onNext(this._y ? this._i : x);\n        this._o.onCompleted();\n      } else {\n        this._i++;\n      }\n    };\n\n    FindValueObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    FindValueObserver.prototype.completed = function () {\n      this._y && this._o.onNext(-1);\n      this._o.onCompleted();\n    };\n\n    return FindValueObserver;\n  }(AbstractObserver));\n\n  function findValue (source, predicate, thisArg, yieldIndex) {\n    var callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new FindValueObserver(o, source, callback, yieldIndex));\n    }, source);\n  }\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the first element that matches the conditions defined by the specified predicate, if found; otherwise, undefined.\n   */\n  observableProto.find = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, false);\n  };\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns\n   * an Observable sequence with the zero-based index of the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the zero-based index of the first occurrence of an element that matches the conditions defined by match, if found; otherwise, –1.\n  */\n  observableProto.findIndex = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, true);\n  };\n\n  var ToSetObservable = (function (__super__) {\n    inherits(ToSetObservable, __super__);\n    function ToSetObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    ToSetObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ToSetObserver(o));\n    };\n\n    return ToSetObservable;\n  }(ObservableBase));\n\n  var ToSetObserver = (function (__super__) {\n    inherits(ToSetObserver, __super__);\n    function ToSetObserver(o) {\n      this._o = o;\n      this._s = new root.Set();\n      __super__.call(this);\n    }\n\n    ToSetObserver.prototype.next = function (x) {\n      this._s.add(x);\n    };\n\n    ToSetObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ToSetObserver.prototype.completed = function () {\n      this._o.onNext(this._s);\n      this._o.onCompleted();\n    };\n\n    return ToSetObserver;\n  }(AbstractObserver));\n\n  /**\n   * Converts the observable sequence to a Set if it exists.\n   * @returns {Observable} An observable sequence with a single value of a Set containing the values from the observable sequence.\n   */\n  observableProto.toSet = function () {\n    if (typeof root.Set === 'undefined') { throw new TypeError(); }\n    return new ToSetObservable(this);\n  };\n\n  var ToMapObservable = (function (__super__) {\n    inherits(ToMapObservable, __super__);\n    function ToMapObservable(source, k, e) {\n      this.source = source;\n      this._k = k;\n      this._e = e;\n      __super__.call(this);\n    }\n\n    ToMapObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ToMapObserver(o, this._k, this._e));\n    };\n\n    return ToMapObservable;\n  }(ObservableBase));\n\n  var ToMapObserver = (function (__super__) {\n    inherits(ToMapObserver, __super__);\n    function ToMapObserver(o, k, e) {\n      this._o = o;\n      this._k = k;\n      this._e = e;\n      this._m = new root.Map();\n      __super__.call(this);\n    }\n\n    ToMapObserver.prototype.next = function (x) {\n      var key = tryCatch(this._k)(x);\n      if (key === errorObj) { return this._o.onError(key.e); }\n      var elem = x;\n      if (this._e) {\n        elem = tryCatch(this._e)(x);\n        if (elem === errorObj) { return this._o.onError(elem.e); }\n      }\n\n      this._m.set(key, elem);\n    };\n\n    ToMapObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ToMapObserver.prototype.completed = function () {\n      this._o.onNext(this._m);\n      this._o.onCompleted();\n    };\n\n    return ToMapObserver;\n  }(AbstractObserver));\n\n  /**\n  * Converts the observable sequence to a Map if it exists.\n  * @param {Function} keySelector A function which produces the key for the Map.\n  * @param {Function} [elementSelector] An optional function which produces the element for the Map. If not present, defaults to the value from the observable sequence.\n  * @returns {Observable} An observable sequence with a single value of a Map containing the values from the observable sequence.\n  */\n  observableProto.toMap = function (keySelector, elementSelector) {\n    if (typeof root.Map === 'undefined') { throw new TypeError(); }\n    return new ToMapObservable(this, keySelector, elementSelector);\n  };\n\n  var SliceObservable = (function (__super__) {\n    inherits(SliceObservable, __super__);\n    function SliceObservable(source, b, e) {\n      this.source = source;\n      this._b = b;\n      this._e = e;\n      __super__.call(this);\n    }\n\n    SliceObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SliceObserver(o, this._b, this._e));\n    };\n\n    return SliceObservable;\n  }(ObservableBase));\n\n  var SliceObserver = (function (__super__) {\n    inherits(SliceObserver, __super__);\n\n    function SliceObserver(o, b, e) {\n      this._o = o;\n      this._b = b;\n      this._e = e;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    SliceObserver.prototype.next = function (x) {\n      if (this._i >= this._b) {\n        if (this._e === this._i) {\n          this._o.onCompleted();\n        } else {\n          this._o.onNext(x);\n        }\n      }\n      this._i++;\n    };\n    SliceObserver.prototype.error = function (e) { this._o.onError(e); };\n    SliceObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SliceObserver;\n  }(AbstractObserver));\n\n  /*\n  * The slice() method returns a shallow copy of a portion of an Observable into a new Observable object.\n  * Unlike the array version, this does not support negative numbers for being or end.\n  * @param {Number} [begin] Zero-based index at which to begin extraction. If omitted, this will default to zero.\n  * @param {Number} [end] Zero-based index at which to end extraction. slice extracts up to but not including end.\n  * If omitted, this will emit the rest of the Observable object.\n  * @returns {Observable} A shallow copy of a portion of an Observable into a new Observable object.\n  */\n  observableProto.slice = function (begin, end) {\n    var start = begin || 0;\n    if (start < 0) { throw new Rx.ArgumentOutOfRangeError(); }\n    if (typeof end === 'number' && end < start) {\n      throw new Rx.ArgumentOutOfRangeError();\n    }\n    return new SliceObservable(this, start, end);\n  };\n\n  var LastIndexOfObservable = (function (__super__) {\n    inherits(LastIndexOfObservable, __super__);\n    function LastIndexOfObservable(source, e, n) {\n      this.source = source;\n      this._e = e;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    LastIndexOfObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(-1);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new LastIndexOfObserver(o, this._e, this._n));\n    };\n\n    return LastIndexOfObservable;\n  }(ObservableBase));\n\n  var LastIndexOfObserver = (function (__super__) {\n    inherits(LastIndexOfObserver, __super__);\n    function LastIndexOfObserver(o, e, n) {\n      this._o = o;\n      this._e = e;\n      this._n = n;\n      this._v = 0;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    LastIndexOfObserver.prototype.next = function (x) {\n      if (this._i >= this._n && x === this._e) {\n        this._hv = true;\n        this._v = this._i;\n      }\n      this._i++;\n    };\n    LastIndexOfObserver.prototype.error = function (e) { this._o.onError(e); };\n    LastIndexOfObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n      } else {\n        this._o.onNext(-1);\n      }\n      this._o.onCompleted();\n    };\n\n    return LastIndexOfObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the last index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   * @param {Any} searchElement Element to locate in the array.\n   * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n   * @returns {Observable} And observable sequence containing the last index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   */\n  observableProto.lastIndexOf = function(searchElement, fromIndex) {\n    var n = +fromIndex || 0;\n    Math.abs(n) === Infinity && (n = 0);\n    return new LastIndexOfObservable(this, searchElement, n);\n  };\n\n  Observable.wrap = function (fn) {\n    function createObservable() {\n      return Observable.spawn.call(this, fn.apply(this, arguments));\n    }\n\n    createObservable.__generatorFunction__ = fn;\n    return createObservable;\n  };\n\n  var spawn = Observable.spawn = function () {\n    var gen = arguments[0], self = this, args = [];\n    for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n    return new AnonymousObservable(function (o) {\n      var g = new CompositeDisposable();\n\n      if (isFunction(gen)) { gen = gen.apply(self, args); }\n      if (!gen || !isFunction(gen.next)) {\n        o.onNext(gen);\n        return o.onCompleted();\n      }\n\n      function processGenerator(res) {\n        var ret = tryCatch(gen.next).call(gen, res);\n        if (ret === errorObj) { return o.onError(ret.e); }\n        next(ret);\n      }\n\n      processGenerator();\n\n      function onError(err) {\n        var ret = tryCatch(gen.next).call(gen, err);\n        if (ret === errorObj) { return o.onError(ret.e); }\n        next(ret);\n      }\n\n      function next(ret) {\n        if (ret.done) {\n          o.onNext(ret.value);\n          o.onCompleted();\n          return;\n        }\n        var obs = toObservable.call(self, ret.value);\n        var value = null;\n        var hasValue = false;\n        if (Observable.isObservable(obs)) {\n          g.add(obs.subscribe(function(val) {\n            hasValue = true;\n            value = val;\n          }, onError, function() {\n            hasValue && processGenerator(value);\n          }));\n        } else {\n          onError(new TypeError('type not supported'));\n        }\n      }\n\n      return g;\n    });\n  };\n\n  function toObservable(obj) {\n    if (!obj) { return obj; }\n    if (Observable.isObservable(obj)) { return obj; }\n    if (isPromise(obj)) { return Observable.fromPromise(obj); }\n    if (isGeneratorFunction(obj) || isGenerator(obj)) { return spawn.call(this, obj); }\n    if (isFunction(obj)) { return thunkToObservable.call(this, obj); }\n    if (isArrayLike(obj) || isIterable(obj)) { return arrayToObservable.call(this, obj); }\n    if (isObject(obj)) {return objectToObservable.call(this, obj);}\n    return obj;\n  }\n\n  function arrayToObservable (obj) {\n    return Observable.from(obj).concatMap(function(o) {\n      if(Observable.isObservable(o) || isObject(o)) {\n        return toObservable.call(null, o);\n      } else {\n        return Rx.Observable.just(o);\n      }\n    }).toArray();\n  }\n\n  function objectToObservable (obj) {\n    var results = new obj.constructor(), keys = Object.keys(obj), observables = [];\n    for (var i = 0, len = keys.length; i < len; i++) {\n      var key = keys[i];\n      var observable = toObservable.call(this, obj[key]);\n\n      if(observable && Observable.isObservable(observable)) {\n        defer(observable, key);\n      } else {\n        results[key] = obj[key];\n      }\n    }\n\n    return Observable.forkJoin.apply(Observable, observables).map(function() {\n      return results;\n    });\n\n\n    function defer (observable, key) {\n      results[key] = undefined;\n      observables.push(observable.map(function (next) {\n        results[key] = next;\n      }));\n    }\n  }\n\n  function thunkToObservable(fn) {\n    var self = this;\n    return new AnonymousObservable(function (o) {\n      fn.call(self, function () {\n        var err = arguments[0], res = arguments[1];\n        if (err) { return o.onError(err); }\n        if (arguments.length > 2) {\n          var args = [];\n          for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n          res = args;\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    });\n  }\n\n  function isGenerator(obj) {\n    return isFunction (obj.next) && isFunction (obj['throw']);\n  }\n\n  function isGeneratorFunction(obj) {\n    var ctor = obj.constructor;\n    if (!ctor) { return false; }\n    if (ctor.name === 'GeneratorFunction' || ctor.displayName === 'GeneratorFunction') { return true; }\n    return isGenerator(ctor.prototype);\n  }\n\n  function isObject(val) {\n    return Object == val.constructor;\n  }\n\n  /**\n   * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.\n   *\n   * @example\n   * var res = Rx.Observable.start(function () { console.log('hello'); });\n   * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout);\n   * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console);\n   *\n   * @param {Function} func Function to run asynchronously.\n   * @param {Scheduler} [scheduler]  Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param [context]  The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   *\n   * Remarks\n   * * The function is called immediately, not during the subscription of the resulting sequence.\n   * * Multiple subscriptions to the resulting sequence can observe the function's result.\n   */\n  Observable.start = function (func, context, scheduler) {\n    return observableToAsync(func, context, scheduler)();\n  };\n\n  /**\n   * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n   * @param {Function} function Function to convert to an asynchronous function.\n   * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Function} Asynchronous function.\n   */\n  var observableToAsync = Observable.toAsync = function (func, context, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return function () {\n      var args = arguments,\n        subject = new AsyncSubject();\n\n      scheduler.schedule(null, function () {\n        var result;\n        try {\n          result = func.apply(context, args);\n        } catch (e) {\n          subject.onError(e);\n          return;\n        }\n        subject.onNext(result);\n        subject.onCompleted();\n      });\n      return subject.asObservable();\n    };\n  };\n\nfunction createCbObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createCbHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createCbHandler(o, ctx, selector) {\n  return function handler () {\n    var len = arguments.length, results = new Array(len);\n    for(var i = 0; i < len; i++) { results[i] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a callback function to an observable sequence.\n *\n * @param {Function} fn Function with a callback as the last parameter to convert to an Observable sequence.\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n */\nObservable.fromCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n\n    var len = arguments.length, args = new Array(len)\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createCbObservable(fn, ctx, selector, args);\n  };\n};\n\nfunction createNodeObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createNodeHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createNodeHandler(o, ctx, selector) {\n  return function handler () {\n    var err = arguments[0];\n    if (err) { return o.onError(err); }\n\n    var len = arguments.length, results = [];\n    for(var i = 1; i < len; i++) { results[i - 1] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      var results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n * @param {Function} fn The function to call\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n */\nObservable.fromNodeCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createNodeObservable(fn, ctx, selector, args);\n  };\n};\n\n  function isNodeList(el) {\n    if (root.StaticNodeList) {\n      // IE8 Specific\n      // instanceof is slower than Object#toString, but Object#toString will not work as intended in IE8\n      return el instanceof root.StaticNodeList || el instanceof root.NodeList;\n    } else {\n      return Object.prototype.toString.call(el) === '[object NodeList]';\n    }\n  }\n\n  function ListenDisposable(e, n, fn) {\n    this._e = e;\n    this._n = n;\n    this._fn = fn;\n    this._e.addEventListener(this._n, this._fn, false);\n    this.isDisposed = false;\n  }\n  ListenDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this._e.removeEventListener(this._n, this._fn, false);\n      this.isDisposed = true;\n    }\n  };\n\n  function createEventListener (el, eventName, handler) {\n    var disposables = new CompositeDisposable();\n\n    // Asume NodeList or HTMLCollection\n    var elemToString = Object.prototype.toString.call(el);\n    if (isNodeList(el) || elemToString === '[object HTMLCollection]') {\n      for (var i = 0, len = el.length; i < len; i++) {\n        disposables.add(createEventListener(el.item(i), eventName, handler));\n      }\n    } else if (el) {\n      disposables.add(new ListenDisposable(el, eventName, handler));\n    }\n\n    return disposables;\n  }\n\n  /**\n   * Configuration option to determine whether to use native events only\n   */\n  Rx.config.useNativeEvents = false;\n\n  var EventObservable = (function(__super__) {\n    inherits(EventObservable, __super__);\n    function EventObservable(el, name, fn) {\n      this._el = el;\n      this._n = name;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventObservable.prototype.subscribeCore = function (o) {\n      return createEventListener(\n        this._el,\n        this._n,\n        createHandler(o, this._fn));\n    };\n\n    return EventObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n   * @param {Object} element The DOMElement or NodeList to attach a listener.\n   * @param {String} eventName The event name to attach the observable sequence.\n   * @param {Object} eventListenerOptions An object describing EventListenerOptions\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n   */\n  Observable.fromEvent = function (element, eventName, selector, eventListenerOptions) {\n    // Node.js specific\n    if (element.addListener) {\n      return fromEventPattern(\n        function (h) { element.addListener(eventName, h, eventListenerOptions); },\n        function (h) { element.removeListener(eventName, h, eventListenerOptions); },\n        selector);\n    }\n\n    // Use only if non-native events are allowed\n    if (!Rx.config.useNativeEvents) {\n      // Handles jq, Angular.js, Zepto, Marionette, Ember.js\n      if (typeof element.on === 'function' && typeof element.off === 'function') {\n        return fromEventPattern(\n          function (h) { element.on(eventName, h, eventListenerOptions); },\n          function (h) { element.off(eventName, h, eventListenerOptions); },\n          selector);\n      }\n    }\n\n    return new EventObservable(element, eventName, selector).publish().refCount();\n  };\n\n  var EventPatternObservable = (function(__super__) {\n    inherits(EventPatternObservable, __super__);\n    function EventPatternObservable(add, del, fn) {\n      this._add = add;\n      this._del = del;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventPatternObservable.prototype.subscribeCore = function (o) {\n      var fn = createHandler(o, this._fn);\n      var returnValue = this._add(fn);\n      return new EventPatternDisposable(this._del, fn, returnValue);\n    };\n\n    function EventPatternDisposable(del, fn, ret) {\n      this._del = del;\n      this._fn = fn;\n      this._ret = ret;\n      this.isDisposed = false;\n    }\n\n    EventPatternDisposable.prototype.dispose = function () {\n      if(!this.isDisposed) {\n        isFunction(this._del) && this._del(this._fn, this._ret);\n        this.isDisposed = true;\n      }\n    };\n\n    return EventPatternObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n   * @param {Function} addHandler The function to add a handler to the emitter.\n   * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence which wraps an event from an event emitter\n   */\n  var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) {\n    return new EventPatternObservable(addHandler, removeHandler, selector).publish().refCount();\n  };\n\n  /**\n   * Invokes the asynchronous function, surfacing the result through an observable sequence.\n   * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   */\n  Observable.startAsync = function (functionAsync) {\n    var promise = tryCatch(functionAsync)();\n    if (promise === errorObj) { return observableThrow(promise.e); }\n    return observableFromPromise(promise);\n  };\n\n  var PausableObservable = (function (__super__) {\n    inherits(PausableObservable, __super__);\n    function PausableObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableObservable.prototype._subscribe = function (o) {\n      var conn = this.source.publish(),\n        subscription = conn.subscribe(o),\n        connection = disposableEmpty;\n\n      var pausable = this.pauser.startWith(!this.paused).distinctUntilChanged().subscribe(function (b) {\n        if (b) {\n          connection = conn.connect();\n        } else {\n          connection.dispose();\n          connection = disposableEmpty;\n        }\n      });\n\n      return new NAryDisposable([subscription, connection, pausable]);\n    };\n\n    PausableObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausable(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausable = function (pauser) {\n    return new PausableObservable(this, pauser);\n  };\n\n  function combineLatestSource(source, subject, resultSelector) {\n    return new AnonymousObservable(function (o) {\n      var hasValue = [false, false],\n        hasValueAll = false,\n        isDone = false,\n        values = new Array(2),\n        err;\n\n      function next(x, i) {\n        values[i] = x;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          if (err) { return o.onError(err); }\n          var res = tryCatch(resultSelector).apply(null, values);\n          if (res === errorObj) { return o.onError(res.e); }\n          o.onNext(res);\n        }\n        isDone && values[1] && o.onCompleted();\n      }\n\n      return new BinaryDisposable(\n        source.subscribe(\n          function (x) {\n            next(x, 0);\n          },\n          function (e) {\n            if (values[1]) {\n              o.onError(e);\n            } else {\n              err = e;\n            }\n          },\n          function () {\n            isDone = true;\n            values[1] && o.onCompleted();\n          }),\n        subject.subscribe(\n          function (x) {\n            next(x, 1);\n          },\n          function (e) { o.onError(e); },\n          function () {\n            isDone = true;\n            next(true, 1);\n          })\n        );\n    }, source);\n  }\n\n  var PausableBufferedObservable = (function (__super__) {\n    inherits(PausableBufferedObservable, __super__);\n    function PausableBufferedObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableBufferedObservable.prototype._subscribe = function (o) {\n      var q = [], previousShouldFire;\n\n      function drainQueue() { while (q.length > 0) { o.onNext(q.shift()); } }\n\n      var subscription =\n        combineLatestSource(\n          this.source,\n          this.pauser.startWith(!this.paused).distinctUntilChanged(),\n          function (data, shouldFire) {\n            return { data: data, shouldFire: shouldFire };\n          })\n          .subscribe(\n            function (results) {\n              if (previousShouldFire !== undefined && results.shouldFire !== previousShouldFire) {\n                previousShouldFire = results.shouldFire;\n                // change in shouldFire\n                if (results.shouldFire) { drainQueue(); }\n              } else {\n                previousShouldFire = results.shouldFire;\n                // new data\n                if (results.shouldFire) {\n                  o.onNext(results.data);\n                } else {\n                  q.push(results.data);\n                }\n              }\n            },\n            function (err) {\n              drainQueue();\n              o.onError(err);\n            },\n            function () {\n              drainQueue();\n              o.onCompleted();\n            }\n          );\n      return subscription;      \n    };\n\n    PausableBufferedObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableBufferedObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableBufferedObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n   * and yields the values that were buffered while paused.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausableBuffered = function (pauser) {\n    return new PausableBufferedObservable(this, pauser);\n  };\n\n  var ControlledObservable = (function (__super__) {\n    inherits(ControlledObservable, __super__);\n    function ControlledObservable (source, enableQueue, scheduler) {\n      __super__.call(this);\n      this.subject = new ControlledSubject(enableQueue, scheduler);\n      this.source = source.multicast(this.subject).refCount();\n    }\n\n    ControlledObservable.prototype._subscribe = function (o) {\n      return this.source.subscribe(o);\n    };\n\n    ControlledObservable.prototype.request = function (numberOfItems) {\n      return this.subject.request(numberOfItems == null ? -1 : numberOfItems);\n    };\n\n    return ControlledObservable;\n\n  }(Observable));\n\n  var ControlledSubject = (function (__super__) {\n    inherits(ControlledSubject, __super__);\n    function ControlledSubject(enableQueue, scheduler) {\n      enableQueue == null && (enableQueue = true);\n\n      __super__.call(this);\n      this.subject = new Subject();\n      this.enableQueue = enableQueue;\n      this.queue = enableQueue ? [] : null;\n      this.requestedCount = 0;\n      this.requestedDisposable = null;\n      this.error = null;\n      this.hasFailed = false;\n      this.hasCompleted = false;\n      this.scheduler = scheduler || currentThreadScheduler;\n    }\n\n    addProperties(ControlledSubject.prototype, Observer, {\n      _subscribe: function (o) {\n        return this.subject.subscribe(o);\n      },\n      onCompleted: function () {\n        this.hasCompleted = true;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onCompleted();\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnCompleted());\n        }\n      },\n      onError: function (error) {\n        this.hasFailed = true;\n        this.error = error;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onError(error);\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnError(error));\n        }\n      },\n      onNext: function (value) {\n        if (this.requestedCount <= 0) {\n          this.enableQueue && this.queue.push(Notification.createOnNext(value));\n        } else {\n          (this.requestedCount-- === 0) && this.disposeCurrentRequest();\n          this.subject.onNext(value);\n        }\n      },\n      _processRequest: function (numberOfItems) {\n        if (this.enableQueue) {\n          while (this.queue.length > 0 && (numberOfItems > 0 || this.queue[0].kind !== 'N')) {\n            var first = this.queue.shift();\n            first.accept(this.subject);\n            if (first.kind === 'N') {\n              numberOfItems--;\n            } else {\n              this.disposeCurrentRequest();\n              this.queue = [];\n            }\n          }\n        }\n\n        return numberOfItems;\n      },\n      request: function (number) {\n        this.disposeCurrentRequest();\n        var self = this;\n\n        this.requestedDisposable = this.scheduler.schedule(number,\n        function(s, i) {\n          var remaining = self._processRequest(i);\n          var stopped = self.hasCompleted || self.hasFailed;\n          if (!stopped && remaining > 0) {\n            self.requestedCount = remaining;\n\n            return disposableCreate(function () {\n              self.requestedCount = 0;\n            });\n              // Scheduled item is still in progress. Return a new\n              // disposable to allow the request to be interrupted\n              // via dispose.\n          }\n        });\n\n        return this.requestedDisposable;\n      },\n      disposeCurrentRequest: function () {\n        if (this.requestedDisposable) {\n          this.requestedDisposable.dispose();\n          this.requestedDisposable = null;\n        }\n      }\n    });\n\n    return ControlledSubject;\n  }(Observable));\n\n  /**\n   * Attaches a controller to the observable sequence with the ability to queue.\n   * @example\n   * var source = Rx.Observable.interval(100).controlled();\n   * source.request(3); // Reads 3 values\n   * @param {bool} enableQueue truthy value to determine if values should be queued pending the next request\n   * @param {Scheduler} scheduler determines how the requests will be scheduled\n   * @returns {Observable} The observable sequence which only propagates values on request.\n   */\n  observableProto.controlled = function (enableQueue, scheduler) {\n\n    if (enableQueue && isScheduler(enableQueue)) {\n      scheduler = enableQueue;\n      enableQueue = true;\n    }\n\n    if (enableQueue == null) {  enableQueue = true; }\n    return new ControlledObservable(this, enableQueue, scheduler);\n  };\n\n  var StopAndWaitObservable = (function (__super__) {\n    inherits(StopAndWaitObservable, __super__);\n    function StopAndWaitObservable (source) {\n      __super__.call(this);\n      this.source = source;\n    }\n\n    function scheduleMethod(s, self) {\n      return self.source.request(1);\n    }\n\n    StopAndWaitObservable.prototype._subscribe = function (o) {\n      this.subscription = this.source.subscribe(new StopAndWaitObserver(o, this, this.subscription));\n      return new BinaryDisposable(\n        this.subscription,\n        defaultScheduler.schedule(this, scheduleMethod)\n      );\n    };\n\n    var StopAndWaitObserver = (function (__sub__) {\n      inherits(StopAndWaitObserver, __sub__);\n      function StopAndWaitObserver (observer, observable, cancel) {\n        __sub__.call(this);\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n        this.scheduleDisposable = null;\n      }\n\n      StopAndWaitObserver.prototype.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      StopAndWaitObserver.prototype.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      };\n\n      function innerScheduleMethod(s, self) {\n        return self.observable.source.request(1);\n      }\n\n      StopAndWaitObserver.prototype.next = function (value) {\n        this.observer.onNext(value);\n        this.scheduleDisposable = defaultScheduler.schedule(this, innerScheduleMethod);\n      };\n\n      StopAndWaitObserver.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        if (this.scheduleDisposable) {\n          this.scheduleDisposable.dispose();\n          this.scheduleDisposable = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return StopAndWaitObserver;\n    }(AbstractObserver));\n\n    return StopAndWaitObservable;\n  }(Observable));\n\n\n  /**\n   * Attaches a stop and wait observable to the current observable.\n   * @returns {Observable} A stop and wait observable.\n   */\n  ControlledObservable.prototype.stopAndWait = function () {\n    return new StopAndWaitObservable(this);\n  };\n\n  var WindowedObservable = (function (__super__) {\n    inherits(WindowedObservable, __super__);\n    function WindowedObservable(source, windowSize) {\n      __super__.call(this);\n      this.source = source;\n      this.windowSize = windowSize;\n    }\n\n    function scheduleMethod(s, self) {\n      return self.source.request(self.windowSize);\n    }\n\n    WindowedObservable.prototype._subscribe = function (o) {\n      this.subscription = this.source.subscribe(new WindowedObserver(o, this, this.subscription));\n      return new BinaryDisposable(\n        this.subscription,\n        defaultScheduler.schedule(this, scheduleMethod)\n      );\n    };\n\n    var WindowedObserver = (function (__sub__) {\n      inherits(WindowedObserver, __sub__);\n      function WindowedObserver(observer, observable, cancel) {\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n        this.received = 0;\n        this.scheduleDisposable = null;\n        __sub__.call(this);\n      }\n\n      WindowedObserver.prototype.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      WindowedObserver.prototype.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      };\n\n      function innerScheduleMethod(s, self) {\n        return self.observable.source.request(self.observable.windowSize);\n      }\n\n      WindowedObserver.prototype.next = function (value) {\n        this.observer.onNext(value);\n        this.received = ++this.received % this.observable.windowSize;\n        this.received === 0 && (this.scheduleDisposable = defaultScheduler.schedule(this, innerScheduleMethod));\n      };\n\n      WindowedObserver.prototype.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        if (this.scheduleDisposable) {\n          this.scheduleDisposable.dispose();\n          this.scheduleDisposable = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return WindowedObserver;\n    }(AbstractObserver));\n\n    return WindowedObservable;\n  }(Observable));\n\n  /**\n   * Creates a sliding windowed observable based upon the window size.\n   * @param {Number} windowSize The number of items in the window\n   * @returns {Observable} A windowed observable based upon the window size.\n   */\n  ControlledObservable.prototype.windowed = function (windowSize) {\n    return new WindowedObservable(this, windowSize);\n  };\n\n  /**\n   * Pipes the existing Observable sequence into a Node.js Stream.\n   * @param {Stream} dest The destination Node.js stream.\n   * @returns {Stream} The destination stream.\n   */\n  observableProto.pipe = function (dest) {\n    var source = this.pausableBuffered();\n\n    function onDrain() {\n      source.resume();\n    }\n\n    dest.addListener('drain', onDrain);\n\n    source.subscribe(\n      function (x) {\n        !dest.write(x) && source.pause();\n      },\n      function (err) {\n        dest.emit('error', err);\n      },\n      function () {\n        // Hack check because STDIO is not closable\n        !dest._isStdio && dest.end();\n        dest.removeListener('drain', onDrain);\n      });\n\n    source.resume();\n\n    return dest;\n  };\n\n  var MulticastObservable = (function (__super__) {\n    inherits(MulticastObservable, __super__);\n    function MulticastObservable(source, fn1, fn2) {\n      this.source = source;\n      this._fn1 = fn1;\n      this._fn2 = fn2;\n      __super__.call(this);\n    }\n\n    MulticastObservable.prototype.subscribeCore = function (o) {\n      var connectable = this.source.multicast(this._fn1());\n      return new BinaryDisposable(this._fn2(connectable).subscribe(o), connectable.connect());\n    };\n\n    return MulticastObservable;\n  }(ObservableBase));\n\n  /**\n   * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n   * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n   * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n   *\n   * @example\n   * 1 - res = source.multicast(observable);\n   * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n   *\n   * @param {Function|Subject} subjectOrSubjectSelector\n   * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n   * Or:\n   * Subject to push source elements into.\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.multicast = function (subjectOrSubjectSelector, selector) {\n    return isFunction(subjectOrSubjectSelector) ?\n      new MulticastObservable(this, subjectOrSubjectSelector, selector) :\n      new ConnectableObservable(this, subjectOrSubjectSelector);\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of Multicast using a regular Subject.\n   *\n   * @example\n   * var resres = source.publish();\n   * var res = source.publish(function (x) { return x; });\n   *\n   * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publish = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new Subject(); }, selector) :\n      this.multicast(new Subject());\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.share = function () {\n    return this.publish().refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n   * This operator is a specialization of Multicast using a AsyncSubject.\n   *\n   * @example\n   * var res = source.publishLast();\n   * var res = source.publishLast(function (x) { return x; });\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishLast = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new AsyncSubject(); }, selector) :\n      this.multicast(new AsyncSubject());\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n   * This operator is a specialization of Multicast using a BehaviorSubject.\n   *\n   * @example\n   * var res = source.publishValue(42);\n   * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishValue = function (initialValueOrSelector, initialValue) {\n    return arguments.length === 2 ?\n      this.multicast(function () {\n        return new BehaviorSubject(initialValue);\n      }, initialValueOrSelector) :\n      this.multicast(new BehaviorSubject(initialValueOrSelector));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n   * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareValue = function (initialValue) {\n    return this.publishValue(initialValue).refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of Multicast using a ReplaySubject.\n   *\n   * @example\n   * var res = source.replay(null, 3);\n   * var res = source.replay(null, 3, 500);\n   * var res = source.replay(null, 3, 500, scheduler);\n   * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param windowSize [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.replay = function (selector, bufferSize, windowSize, scheduler) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new ReplaySubject(bufferSize, windowSize, scheduler); }, selector) :\n      this.multicast(new ReplaySubject(bufferSize, windowSize, scheduler));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   *\n   * @example\n   * var res = source.shareReplay(3);\n   * var res = source.shareReplay(3, 500);\n   * var res = source.shareReplay(3, 500, scheduler);\n   *\n\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareReplay = function (bufferSize, windowSize, scheduler) {\n    return this.replay(null, bufferSize, windowSize, scheduler).refCount();\n  };\n\n  var InnerSubscription = function (s, o) {\n    this._s = s;\n    this._o = o;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this._s.isDisposed && this._o !== null) {\n      var idx = this._s.observers.indexOf(this._o);\n      this._s.observers.splice(idx, 1);\n      this._o = null;\n    }\n  };\n\n  var RefCountObservable = (function (__super__) {\n    inherits(RefCountObservable, __super__);\n    function RefCountObservable(source) {\n      this.source = source;\n      this._count = 0;\n      this._connectableSubscription = null;\n      __super__.call(this);\n    }\n\n    RefCountObservable.prototype.subscribeCore = function (o) {\n      var subscription = this.source.subscribe(o);\n      ++this._count === 1 && (this._connectableSubscription = this.source.connect());\n      return new RefCountDisposable(this, subscription);\n    };\n\n    function RefCountDisposable(p, s) {\n      this._p = p;\n      this._s = s;\n      this.isDisposed = false;\n    }\n\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this._s.dispose();\n        --this._p._count === 0 && this._p._connectableSubscription.dispose();\n      }\n    };\n\n    return RefCountObservable;\n  }(ObservableBase));\n\n  var ConnectableObservable = Rx.ConnectableObservable = (function (__super__) {\n    inherits(ConnectableObservable, __super__);\n    function ConnectableObservable(source, subject) {\n      this.source = source;\n      this._connection = null;\n      this._source = source.asObservable();\n      this._subject = subject;\n      __super__.call(this);\n    }\n\n    function ConnectDisposable(parent, subscription) {\n      this._p = parent;\n      this._s = subscription;\n    }\n\n    ConnectDisposable.prototype.dispose = function () {\n      if (this._s) {\n        this._s.dispose();\n        this._s = null;\n        this._p._connection = null;\n      }\n    };\n\n    ConnectableObservable.prototype.connect = function () {\n      if (!this._connection) {\n        if (this._subject.isStopped) {\n          return disposableEmpty;\n        }\n        var subscription = this._source.subscribe(this._subject);\n        this._connection = new ConnectDisposable(this, subscription);\n      }\n      return this._connection;\n    };\n\n    ConnectableObservable.prototype._subscribe = function (o) {\n      return this._subject.subscribe(o);\n    };\n\n    ConnectableObservable.prototype.refCount = function () {\n      return new RefCountObservable(this);\n    };\n\n    return ConnectableObservable;\n  }(Observable));\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence. This observable sequence\n   * can be resubscribed to, even if all prior subscriptions have ended. (unlike `.publish().refCount()`)\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source.\n   */\n  observableProto.singleInstance = function() {\n    var source = this, hasObservable = false, observable;\n\n    function getObservable() {\n      if (!hasObservable) {\n        hasObservable = true;\n        observable = source['finally'](function() { hasObservable = false; }).publish().refCount();\n      }\n      return observable;\n    }\n\n    return new AnonymousObservable(function(o) {\n      return getObservable().subscribe(o);\n    });\n  };\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters passed to the function correspond with the elements from the left and right source sequences for which overlap occurs.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.join = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable();\n      var leftDone = false, rightDone = false;\n      var leftId = 0, rightId = 0;\n      var leftMap = new Map(), rightMap = new Map();\n      var handleError = function (e) { o.onError(e); };\n\n      group.add(left.subscribe(\n        function (value) {\n          var id = leftId++, md = new SingleAssignmentDisposable();\n\n          leftMap.set(id, value);\n          group.add(md);\n\n          var duration = tryCatch(leftDurationSelector)(value);\n          if (duration === errorObj) { return o.onError(duration.e); }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            handleError,\n            function () {\n              leftMap['delete'](id) && leftMap.size === 0 && leftDone && o.onCompleted();\n              group.remove(md);\n            }));\n\n          rightMap.forEach(function (v) {\n            var result = tryCatch(resultSelector)(value, v);\n            if (result === errorObj) { return o.onError(result.e); }\n            o.onNext(result);\n          });\n        },\n        handleError,\n        function () {\n          leftDone = true;\n          (rightDone || leftMap.size === 0) && o.onCompleted();\n        })\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++, md = new SingleAssignmentDisposable();\n\n          rightMap.set(id, value);\n          group.add(md);\n\n          var duration = tryCatch(rightDurationSelector)(value);\n          if (duration === errorObj) { return o.onError(duration.e); }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            handleError,\n            function () {\n              rightMap['delete'](id) && rightMap.size === 0 && rightDone && o.onCompleted();\n              group.remove(md);\n            }));\n\n          leftMap.forEach(function (v) {\n            var result = tryCatch(resultSelector)(v, value);\n            if (result === errorObj) { return o.onError(result.e); }\n            o.onNext(result);\n          });\n        },\n        handleError,\n        function () {\n          rightDone = true;\n          (leftDone || rightMap.size === 0) && o.onCompleted();\n        })\n      );\n      return group;\n    }, left);\n  };\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations, and groups the results.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. The first parameter passed to the function is an element of the left sequence. The second parameter passed to the function is an observable sequence with elements from the right sequence that overlap with the left sequence's element.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.groupJoin = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable();\n      var r = new RefCountDisposable(group);\n      var leftMap = new Map(), rightMap = new Map();\n      var leftId = 0, rightId = 0;\n      var handleError = function (e) { return function (v) { v.onError(e); }; };\n\n      function handleError(e) { };\n\n      group.add(left.subscribe(\n        function (value) {\n          var s = new Subject();\n          var id = leftId++;\n          leftMap.set(id, s);\n\n          var result = tryCatch(resultSelector)(value, addRef(s, r));\n          if (result === errorObj) {\n            leftMap.forEach(handleError(result.e));\n            return o.onError(result.e);\n          }\n          o.onNext(result);\n\n          rightMap.forEach(function (v) { s.onNext(v); });\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var duration = tryCatch(leftDurationSelector)(value);\n          if (duration === errorObj) {\n            leftMap.forEach(handleError(duration.e));\n            return o.onError(duration.e);\n          }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.forEach(handleError(e));\n              o.onError(e);\n            },\n            function () {\n              leftMap['delete'](id) && s.onCompleted();\n              group.remove(md);\n            }));\n        },\n        function (e) {\n          leftMap.forEach(handleError(e));\n          o.onError(e);\n        },\n        function () { o.onCompleted(); })\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++;\n          rightMap.set(id, value);\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var duration = tryCatch(rightDurationSelector)(value);\n          if (duration === errorObj) {\n            leftMap.forEach(handleError(duration.e));\n            return o.onError(duration.e);\n          }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.forEach(handleError(e));\n              o.onError(e);\n            },\n            function () {\n              rightMap['delete'](id);\n              group.remove(md);\n            }));\n\n          leftMap.forEach(function (v) { v.onNext(value); });\n        },\n        function (e) {\n          leftMap.forEach(handleError(e));\n          o.onError(e);\n        })\n      );\n\n      return r;\n    }, left);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers.\n   *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n   *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n   *  @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.buffer = function () {\n    return this.window.apply(this, arguments)\n      .flatMap(toArray);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows.\n   *\n   *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n   *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n   *  @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.window = function (windowOpeningsOrClosingSelector, windowClosingSelector) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'function') {\n      return observableWindowWithBoundaries.call(this, windowOpeningsOrClosingSelector);\n    }\n    return typeof windowOpeningsOrClosingSelector === 'function' ?\n      observableWindowWithClosingSelector.call(this, windowOpeningsOrClosingSelector) :\n      observableWindowWithOpenings.call(this, windowOpeningsOrClosingSelector, windowClosingSelector);\n  };\n\n  function observableWindowWithOpenings(windowOpenings, windowClosingSelector) {\n    return windowOpenings.groupJoin(this, windowClosingSelector, observableEmpty, function (_, win) {\n      return win;\n    });\n  }\n\n  function observableWindowWithBoundaries(windowBoundaries) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var win = new Subject(),\n        d = new CompositeDisposable(),\n        r = new RefCountDisposable(d);\n\n      observer.onNext(addRef(win, r));\n\n      d.add(source.subscribe(function (x) {\n        win.onNext(x);\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      isPromise(windowBoundaries) && (windowBoundaries = observableFromPromise(windowBoundaries));\n\n      d.add(windowBoundaries.subscribe(function (w) {\n        win.onCompleted();\n        win = new Subject();\n        observer.onNext(addRef(win, r));\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      return r;\n    }, source);\n  }\n\n  function observableWindowWithClosingSelector(windowClosingSelector) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        r = new RefCountDisposable(d),\n        win = new Subject();\n      observer.onNext(addRef(win, r));\n      d.add(source.subscribe(function (x) {\n          win.onNext(x);\n      }, function (err) {\n          win.onError(err);\n          observer.onError(err);\n      }, function () {\n          win.onCompleted();\n          observer.onCompleted();\n      }));\n\n      function createWindowClose () {\n        var windowClose;\n        try {\n          windowClose = windowClosingSelector();\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n\n        isPromise(windowClose) && (windowClose = observableFromPromise(windowClose));\n\n        var m1 = new SingleAssignmentDisposable();\n        m.setDisposable(m1);\n        m1.setDisposable(windowClose.take(1).subscribe(noop, function (err) {\n          win.onError(err);\n          observer.onError(err);\n        }, function () {\n          win.onCompleted();\n          win = new Subject();\n          observer.onNext(addRef(win, r));\n          createWindowClose();\n        }));\n      }\n\n      createWindowClose();\n      return r;\n    }, source);\n  }\n\n  var PairwiseObservable = (function (__super__) {\n    inherits(PairwiseObservable, __super__);\n    function PairwiseObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    PairwiseObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new PairwiseObserver(o));\n    };\n\n    return PairwiseObservable;\n  }(ObservableBase));\n\n  var PairwiseObserver = (function(__super__) {\n    inherits(PairwiseObserver, __super__);\n    function PairwiseObserver(o) {\n      this._o = o;\n      this._p = null;\n      this._hp = false;\n      __super__.call(this);\n    }\n\n    PairwiseObserver.prototype.next = function (x) {\n      if (this._hp) {\n        this._o.onNext([this._p, x]);\n      } else {\n        this._hp = true;\n      }\n      this._p = x;\n    };\n    PairwiseObserver.prototype.error = function (err) { this._o.onError(err); };\n    PairwiseObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return PairwiseObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns a new observable that triggers on the second and subsequent triggerings of the input observable.\n   * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair.\n   * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs.\n   * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array.\n   */\n  observableProto.pairwise = function () {\n    return new PairwiseObservable(this);\n  };\n\n  /**\n   * Returns two observables which partition the observations of the source by the given function.\n   * The first will trigger observations for those values for which the predicate returns true.\n   * The second will trigger observations for those values where the predicate returns false.\n   * The predicate is executed once for each subscribed observer.\n   * Both also propagate all error observations arising from the source and each completes\n   * when the source completes.\n   * @param {Function} predicate\n   *    The function to determine which output Observable will trigger a particular observation.\n   * @returns {Array}\n   *    An array of observables. The first triggers when the predicate returns true,\n   *    and the second triggers when the predicate returns false.\n  */\n  observableProto.partition = function(predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return [\n      this.filter(predicate, thisArg),\n      this.filter(function (x, i, o) { return !fn(x, i, o); })\n    ];\n  };\n\n  var WhileEnumerable = (function(__super__) {\n    inherits(WhileEnumerable, __super__);\n    function WhileEnumerable(c, s) {\n      this.c = c;\n      this.s = s;\n    }\n    WhileEnumerable.prototype[$iterator$] = function () {\n      var self = this;\n      return {\n        next: function () {\n          return self.c() ?\n           { done: false, value: self.s } :\n           { done: true, value: void 0 };\n        }\n      };\n    };\n    return WhileEnumerable;\n  }(Enumerable));\n  \n  function enumerableWhile(condition, source) {\n    return new WhileEnumerable(condition, source);\n  }  \n\n   /**\n   *  Returns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions.\n   *  This operator allows for a fluent style of writing queries that use the same sequence multiple times.\n   *\n   * @param {Function} selector Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.letBind = observableProto['let'] = function (func) {\n    return func(this);\n  };\n\n   /**\n   *  Determines whether an observable collection contains values. \n   *\n   * @example\n   *  1 - res = Rx.Observable.if(condition, obs1);\n   *  2 - res = Rx.Observable.if(condition, obs1, obs2);\n   *  3 - res = Rx.Observable.if(condition, obs1, scheduler);\n   * @param {Function} condition The condition which determines if the thenSource or elseSource will be run.\n   * @param {Observable} thenSource The observable sequence or Promise that will be run if the condition function returns true.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the condition function returns false. If this is not provided, it defaults to Rx.Observabe.Empty with the specified scheduler.\n   * @returns {Observable} An observable sequence which is either the thenSource or elseSource.\n   */\n  Observable['if'] = function (condition, thenSource, elseSourceOrScheduler) {\n    return observableDefer(function () {\n      elseSourceOrScheduler || (elseSourceOrScheduler = observableEmpty());\n\n      isPromise(thenSource) && (thenSource = observableFromPromise(thenSource));\n      isPromise(elseSourceOrScheduler) && (elseSourceOrScheduler = observableFromPromise(elseSourceOrScheduler));\n\n      // Assume a scheduler for empty only\n      typeof elseSourceOrScheduler.now === 'function' && (elseSourceOrScheduler = observableEmpty(elseSourceOrScheduler));\n      return condition() ? thenSource : elseSourceOrScheduler;\n    });\n  };\n\n   /**\n   *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n   * There is an alias for this method called 'forIn' for browsers <IE9\n   * @param {Array} sources An array of values to turn into an observable sequence.\n   * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n   * @returns {Observable} An observable sequence from the concatenated observable sequences.\n   */\n  Observable['for'] = Observable.forIn = function (sources, resultSelector, thisArg) {\n    return enumerableOf(sources, resultSelector, thisArg).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a while loop.\n   * There is an alias for this method called 'whileDo' for browsers <IE9\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  var observableWhileDo = Observable['while'] = Observable.whileDo = function (condition, source) {\n    isPromise(source) && (source = observableFromPromise(source));\n    return enumerableWhile(condition, source).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a do while loop.\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  observableProto.doWhile = function (condition) {\n    return observableConcat([this, observableWhileDo(condition, this)]);\n  };\n\n   /**\n   *  Uses selector to determine which source in sources to use.\n   * @param {Function} selector The function which extracts the value for to test in a case statement.\n   * @param {Array} sources A object which has keys which correspond to the case statement labels.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n   *\n   * @returns {Observable} An observable sequence which is determined by a case statement.\n   */\n  Observable['case'] = function (selector, sources, defaultSourceOrScheduler) {\n    return observableDefer(function () {\n      isPromise(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableFromPromise(defaultSourceOrScheduler));\n      defaultSourceOrScheduler || (defaultSourceOrScheduler = observableEmpty());\n\n      isScheduler(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableEmpty(defaultSourceOrScheduler));\n\n      var result = sources[selector()];\n      isPromise(result) && (result = observableFromPromise(result));\n\n      return result || defaultSourceOrScheduler;\n    });\n  };\n\n  var ExpandObservable = (function(__super__) {\n    inherits(ExpandObservable, __super__);\n    function ExpandObservable(source, fn, scheduler) {\n      this.source = source;\n      this._fn = fn;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(args, recurse) {\n      var state = args[0], self = args[1];\n      var work;\n      if (state.q.length > 0) {\n        work = state.q.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var m1 = new SingleAssignmentDisposable();\n      state.d.add(m1);\n      m1.setDisposable(work.subscribe(new ExpandObserver(state, self, m1)));\n      recurse([state, self]);\n    }\n\n    ExpandObservable.prototype._ensureActive = function (state) {\n      var isOwner = false;\n      if (state.q.length > 0) {\n        isOwner = !state.isAcquired;\n        state.isAcquired = true;\n      }\n      isOwner && state.m.setDisposable(this._scheduler.scheduleRecursive([state, this], scheduleRecursive));\n    };\n\n    ExpandObservable.prototype.subscribeCore = function (o) {\n      var m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        state = {\n          q: [],\n          m: m,\n          d: d,\n          activeCount: 0,\n          isAcquired: false,\n          o: o\n        };\n\n      state.q.push(this.source);\n      state.activeCount++;\n      this._ensureActive(state);\n      return d;\n    };\n\n    return ExpandObservable;\n  }(ObservableBase));\n\n  var ExpandObserver = (function(__super__) {\n    inherits(ExpandObserver, __super__);\n    function ExpandObserver(state, parent, m1) {\n      this._s = state;\n      this._p = parent;\n      this._m1 = m1;\n      __super__.call(this);\n    }\n\n    ExpandObserver.prototype.next = function (x) {\n      this._s.o.onNext(x);\n      var result = tryCatch(this._p._fn)(x);\n      if (result === errorObj) { return this._s.o.onError(result.e); }\n      this._s.q.push(result);\n      this._s.activeCount++;\n      this._p._ensureActive(this._s);\n    };\n\n    ExpandObserver.prototype.error = function (e) {\n      this._s.o.onError(e);\n    };\n\n    ExpandObserver.prototype.completed = function () {\n      this._s.d.remove(this._m1);\n      this._s.activeCount--;\n      this._s.activeCount === 0 && this._s.o.onCompleted();\n    };\n\n    return ExpandObserver;\n  }(AbstractObserver));\n\n   /**\n   *  Expands an observable sequence by recursively invoking selector.\n   *\n   * @param {Function} selector Selector function to invoke for each produced element, resulting in another sequence to which the selector will be invoked recursively again.\n   * @param {Scheduler} [scheduler] Scheduler on which to perform the expansion. If not provided, this defaults to the current thread scheduler.\n   * @returns {Observable} An observable sequence containing all the elements produced by the recursive expansion.\n   */\n  observableProto.expand = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new ExpandObservable(this, selector, scheduler);\n  };\n\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var ForkJoinObservable = (function (__super__) {\n    inherits(ForkJoinObservable, __super__);\n    function ForkJoinObservable(sources, cb) {\n      this._sources = sources;\n      this._cb = cb;\n      __super__.call(this);\n    }\n\n    ForkJoinObservable.prototype.subscribeCore = function (o) {\n      if (this._sources.length === 0) {\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      var count = this._sources.length;\n      var state = {\n        finished: false,\n        hasResults: new Array(count),\n        hasCompleted: new Array(count),\n        results: new Array(count)\n      };\n\n      var subscriptions = new CompositeDisposable();\n      for (var i = 0, len = this._sources.length; i < len; i++) {\n        var source = this._sources[i];\n        isPromise(source) && (source = observableFromPromise(source));\n        subscriptions.add(source.subscribe(new ForkJoinObserver(o, state, i, this._cb, subscriptions)));\n      }\n\n      return subscriptions;\n    };\n\n    return ForkJoinObservable;\n  }(ObservableBase));\n\n  var ForkJoinObserver = (function(__super__) {\n    inherits(ForkJoinObserver, __super__);\n    function ForkJoinObserver(o, s, i, cb, subs) {\n      this._o = o;\n      this._s = s;\n      this._i = i;\n      this._cb = cb;\n      this._subs = subs;\n      __super__.call(this);\n    }\n\n    ForkJoinObserver.prototype.next = function (x) {\n      if (!this._s.finished) {\n        this._s.hasResults[this._i] = true;\n        this._s.results[this._i] = x;\n      }\n    };\n\n    ForkJoinObserver.prototype.error = function (e) {\n      this._s.finished = true;\n      this._o.onError(e);\n      this._subs.dispose();\n    };\n\n    ForkJoinObserver.prototype.completed = function () {\n      if (!this._s.finished) {\n        if (!this._s.hasResults[this._i]) {\n          return this._o.onCompleted();\n        }\n        this._s.hasCompleted[this._i] = true;\n        for (var i = 0; i < this._s.results.length; i++) {\n          if (!this._s.hasCompleted[i]) { return; }\n        }\n        this._s.finished = true;\n\n        var res = tryCatch(this._cb).apply(null, this._s.results);\n        if (res === errorObj) { return this._o.onError(res.e); }\n\n        this._o.onNext(res);\n        this._o.onCompleted();\n      }\n    };\n\n    return ForkJoinObserver;\n  }(AbstractObserver));\n\n   /**\n   *  Runs all observable sequences in parallel and collect their last elements.\n   *\n   * @example\n   *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n   *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n   * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n   */\n  Observable.forkJoin = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n    return new ForkJoinObservable(args, resultSelector);\n  };\n\n   /**\n   *  Runs two observable sequences in parallel and combines their last elemenets.\n   * @param {Observable} second Second observable sequence.\n   * @param {Function} resultSelector Result selector function to invoke with the last elements of both sequences.\n   * @returns {Observable} An observable sequence with the result of calling the selector function with the last elements of both input sequences.\n   */\n  observableProto.forkJoin = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return Observable.forkJoin.apply(null, args);\n  };\n\n  /**\n   * Comonadic bind operator.\n   * @param {Function} selector A transform function to apply to each element.\n   * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n   * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n   */\n  observableProto.manySelect = observableProto.extend = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = Rx.Scheduler.immediate);\n    var source = this;\n    return observableDefer(function () {\n      var chain;\n\n      return source\n        .map(function (x) {\n          var curr = new ChainObservable(x);\n\n          chain && chain.onNext(x);\n          chain = curr;\n\n          return curr;\n        })\n        .tap(\n          noop,\n          function (e) { chain && chain.onError(e); },\n          function () { chain && chain.onCompleted(); }\n        )\n        .observeOn(scheduler)\n        .map(selector);\n    }, source);\n  };\n\n  var ChainObservable = (function (__super__) {\n    inherits(ChainObservable, __super__);\n    function ChainObservable(head) {\n      __super__.call(this);\n      this.head = head;\n      this.tail = new AsyncSubject();\n    }\n\n    addProperties(ChainObservable.prototype, Observer, {\n      _subscribe: function (o) {\n        var g = new CompositeDisposable();\n        g.add(currentThreadScheduler.schedule(this, function (_, self) {\n          o.onNext(self.head);\n          g.add(self.tail.mergeAll().subscribe(o));\n        }));\n\n        return g;\n      },\n      onCompleted: function () {\n        this.onNext(Observable.empty());\n      },\n      onError: function (e) {\n        this.onNext(Observable['throw'](e));\n      },\n      onNext: function (v) {\n        this.tail.onNext(v);\n        this.tail.onCompleted();\n      }\n    });\n\n    return ChainObservable;\n\n  }(Observable));\n\n  var Map = root.Map || (function () {\n    function Map() {\n      this.size = 0;\n      this._values = [];\n      this._keys = [];\n    }\n\n    Map.prototype['delete'] = function (key) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) { return false; }\n      this._values.splice(i, 1);\n      this._keys.splice(i, 1);\n      this.size--;\n      return true;\n    };\n\n    Map.prototype.get = function (key) {\n      var i = this._keys.indexOf(key);\n      return i === -1 ? undefined : this._values[i];\n    };\n\n    Map.prototype.set = function (key, value) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) {\n        this._keys.push(key);\n        this._values.push(value);\n        this.size++;\n      } else {\n        this._values[i] = value;\n      }\n      return this;\n    };\n\n    Map.prototype.forEach = function (cb, thisArg) {\n      for (var i = 0; i < this.size; i++) {\n        cb.call(thisArg, this._values[i], this._keys[i]);\n      }\n    };\n\n    return Map;\n  }());\n\n  /**\n   * @constructor\n   * Represents a join pattern over observable sequences.\n   */\n  function Pattern(patterns) {\n    this.patterns = patterns;\n  }\n\n  /**\n   *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n   *  @param other Observable sequence to match in addition to the current pattern.\n   *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n   */\n  Pattern.prototype.and = function (other) {\n    return new Pattern(this.patterns.concat(other));\n  };\n\n  /**\n   *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n   *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n   *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  Pattern.prototype.thenDo = function (selector) {\n    return new Plan(this, selector);\n  };\n\n  function Plan(expression, selector) {\n    this.expression = expression;\n    this.selector = selector;\n  }\n\n  function handleOnError(o) { return function (e) { o.onError(e); }; }\n  function handleOnNext(self, observer) {\n    return function onNext () {\n      var result = tryCatch(self.selector).apply(self, arguments);\n      if (result === errorObj) { return observer.onError(result.e); }\n      observer.onNext(result);\n    };\n  }\n\n  Plan.prototype.activate = function (externalSubscriptions, observer, deactivate) {\n    var joinObservers = [], errHandler = handleOnError(observer);\n    for (var i = 0, len = this.expression.patterns.length; i < len; i++) {\n      joinObservers.push(planCreateObserver(externalSubscriptions, this.expression.patterns[i], errHandler));\n    }\n    var activePlan = new ActivePlan(joinObservers, handleOnNext(this, observer), function () {\n      for (var j = 0, jlen = joinObservers.length; j < jlen; j++) {\n        joinObservers[j].removeActivePlan(activePlan);\n      }\n      deactivate(activePlan);\n    });\n    for (i = 0, len = joinObservers.length; i < len; i++) {\n      joinObservers[i].addActivePlan(activePlan);\n    }\n    return activePlan;\n  };\n\n  function planCreateObserver(externalSubscriptions, observable, onError) {\n    var entry = externalSubscriptions.get(observable);\n    if (!entry) {\n      var observer = new JoinObserver(observable, onError);\n      externalSubscriptions.set(observable, observer);\n      return observer;\n    }\n    return entry;\n  }\n\n  function ActivePlan(joinObserverArray, onNext, onCompleted) {\n    this.joinObserverArray = joinObserverArray;\n    this.onNext = onNext;\n    this.onCompleted = onCompleted;\n    this.joinObservers = new Map();\n    for (var i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      var joinObserver = this.joinObserverArray[i];\n      this.joinObservers.set(joinObserver, joinObserver);\n    }\n  }\n\n  ActivePlan.prototype.dequeue = function () {\n    this.joinObservers.forEach(function (v) { v.queue.shift(); });\n  };\n\n  ActivePlan.prototype.match = function () {\n    var i, len, hasValues = true;\n    for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      if (this.joinObserverArray[i].queue.length === 0) {\n        hasValues = false;\n        break;\n      }\n    }\n    if (hasValues) {\n      var firstValues = [],\n          isCompleted = false;\n      for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n        firstValues.push(this.joinObserverArray[i].queue[0]);\n        this.joinObserverArray[i].queue[0].kind === 'C' && (isCompleted = true);\n      }\n      if (isCompleted) {\n        this.onCompleted();\n      } else {\n        this.dequeue();\n        var values = [];\n        for (i = 0, len = firstValues.length; i < firstValues.length; i++) {\n          values.push(firstValues[i].value);\n        }\n        this.onNext.apply(this, values);\n      }\n    }\n  };\n\n  var JoinObserver = (function (__super__) {\n    inherits(JoinObserver, __super__);\n\n    function JoinObserver(source, onError) {\n      __super__.call(this);\n      this.source = source;\n      this.onError = onError;\n      this.queue = [];\n      this.activePlans = [];\n      this.subscription = new SingleAssignmentDisposable();\n      this.isDisposed = false;\n    }\n\n    var JoinObserverPrototype = JoinObserver.prototype;\n\n    JoinObserverPrototype.next = function (notification) {\n      if (!this.isDisposed) {\n        if (notification.kind === 'E') {\n          return this.onError(notification.error);\n        }\n        this.queue.push(notification);\n        var activePlans = this.activePlans.slice(0);\n        for (var i = 0, len = activePlans.length; i < len; i++) {\n          activePlans[i].match();\n        }\n      }\n    };\n\n    JoinObserverPrototype.error = noop;\n    JoinObserverPrototype.completed = noop;\n\n    JoinObserverPrototype.addActivePlan = function (activePlan) {\n      this.activePlans.push(activePlan);\n    };\n\n    JoinObserverPrototype.subscribe = function () {\n      this.subscription.setDisposable(this.source.materialize().subscribe(this));\n    };\n\n    JoinObserverPrototype.removeActivePlan = function (activePlan) {\n      this.activePlans.splice(this.activePlans.indexOf(activePlan), 1);\n      this.activePlans.length === 0 && this.dispose();\n    };\n\n    JoinObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this.subscription.dispose();\n      }\n    };\n\n    return JoinObserver;\n  } (AbstractObserver));\n\n  /**\n   *  Creates a pattern that matches when both observable sequences have an available value.\n   *\n   *  @param right Observable sequence to match with the current sequence.\n   *  @return {Pattern} Pattern object that matches when both observable sequences have an available value.\n   */\n  observableProto.and = function (right) {\n    return new Pattern([this, right]);\n  };\n\n  /**\n   *  Matches when the observable sequence has an available value and projects the value.\n   *\n   *  @param {Function} selector Selector that will be invoked for values in the source sequence.\n   *  @returns {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  observableProto.thenDo = function (selector) {\n    return new Pattern([this]).thenDo(selector);\n  };\n\n  /**\n   *  Joins together the results from several patterns.\n   *\n   *  @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns.\n   *  @returns {Observable} Observable sequence with the results form matching several patterns.\n   */\n  Observable.when = function () {\n    var len = arguments.length, plans;\n    if (Array.isArray(arguments[0])) {\n      plans = arguments[0];\n    } else {\n      plans = new Array(len);\n      for(var i = 0; i < len; i++) { plans[i] = arguments[i]; }\n    }\n    return new AnonymousObservable(function (o) {\n      var activePlans = [],\n          externalSubscriptions = new Map();\n      var outObserver = observerCreate(\n        function (x) { o.onNext(x); },\n        function (err) {\n          externalSubscriptions.forEach(function (v) { v.onError(err); });\n          o.onError(err);\n        },\n        function (x) { o.onCompleted(); }\n      );\n      try {\n        for (var i = 0, len = plans.length; i < len; i++) {\n          activePlans.push(plans[i].activate(externalSubscriptions, outObserver, function (activePlan) {\n            var idx = activePlans.indexOf(activePlan);\n            activePlans.splice(idx, 1);\n            activePlans.length === 0 && o.onCompleted();\n          }));\n        }\n      } catch (e) {\n        return observableThrow(e).subscribe(o);\n      }\n      var group = new CompositeDisposable();\n      externalSubscriptions.forEach(function (joinObserver) {\n        joinObserver.subscribe();\n        group.add(joinObserver);\n      });\n\n      return group;\n    });\n  };\n\n  var TimerObservable = (function(__super__) {\n    inherits(TimerObservable, __super__);\n    function TimerObservable(dt, s) {\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimerObservable.prototype.subscribeCore = function (o) {\n      return this._s.scheduleFuture(o, this._dt, scheduleMethod);\n    };\n\n    function scheduleMethod(s, o) {\n      o.onNext(0);\n      o.onCompleted();\n    }\n\n    return TimerObservable;\n  }(ObservableBase));\n\n  function _observableTimer(dueTime, scheduler) {\n    return new TimerObservable(dueTime, scheduler);\n  }\n\n  function observableTimerDateAndPeriod(dueTime, period, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var d = dueTime, p = normalizeTime(period);\n      return scheduler.scheduleRecursiveFuture(0, d, function (count, self) {\n        if (p > 0) {\n          var now = scheduler.now();\n          d = new Date(d.getTime() + p);\n          d.getTime() <= now && (d = new Date(now + p));\n        }\n        observer.onNext(count);\n        self(count + 1, new Date(d));\n      });\n    });\n  }\n\n  function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) {\n    return dueTime === period ?\n      new AnonymousObservable(function (observer) {\n        return scheduler.schedulePeriodic(0, period, function (count) {\n          observer.onNext(count);\n          return count + 1;\n        });\n      }) :\n      observableDefer(function () {\n        return observableTimerDateAndPeriod(new Date(scheduler.now() + dueTime), period, scheduler);\n      });\n  }\n\n  /**\n   *  Returns an observable sequence that produces a value after each period.\n   *\n   * @example\n   *  1 - res = Rx.Observable.interval(1000);\n   *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n   *\n   * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n   * @returns {Observable} An observable sequence that produces a value after each period.\n   */\n  var observableinterval = Observable.interval = function (period, scheduler) {\n    return observableTimerTimeSpanAndPeriod(period, period, isScheduler(scheduler) ? scheduler : defaultScheduler);\n  };\n\n  /**\n   *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n   * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n   */\n  var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) {\n    var period;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    if (periodOrScheduler != null && typeof periodOrScheduler === 'number') {\n      period = periodOrScheduler;\n    } else if (isScheduler(periodOrScheduler)) {\n      scheduler = periodOrScheduler;\n    }\n    if ((dueTime instanceof Date || typeof dueTime === 'number') && period === undefined) {\n      return _observableTimer(dueTime, scheduler);\n    }\n    if (dueTime instanceof Date && period !== undefined) {\n      return observableTimerDateAndPeriod(dueTime, periodOrScheduler, scheduler);\n    }\n    return observableTimerTimeSpanAndPeriod(dueTime, period, scheduler);\n  };\n\n  function observableDelayRelative(source, dueTime, scheduler) {\n    return new AnonymousObservable(function (o) {\n      var active = false,\n        cancelable = new SerialDisposable(),\n        exception = null,\n        q = [],\n        running = false,\n        subscription;\n      subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) {\n        var d, shouldRun;\n        if (notification.value.kind === 'E') {\n          q = [];\n          q.push(notification);\n          exception = notification.value.error;\n          shouldRun = !running;\n        } else {\n          q.push({ value: notification.value, timestamp: notification.timestamp + dueTime });\n          shouldRun = !active;\n          active = true;\n        }\n        if (shouldRun) {\n          if (exception !== null) {\n            o.onError(exception);\n          } else {\n            d = new SingleAssignmentDisposable();\n            cancelable.setDisposable(d);\n            d.setDisposable(scheduler.scheduleRecursiveFuture(null, dueTime, function (_, self) {\n              var e, recurseDueTime, result, shouldRecurse;\n              if (exception !== null) {\n                return;\n              }\n              running = true;\n              do {\n                result = null;\n                if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) {\n                  result = q.shift().value;\n                }\n                if (result !== null) {\n                  result.accept(o);\n                }\n              } while (result !== null);\n              shouldRecurse = false;\n              recurseDueTime = 0;\n              if (q.length > 0) {\n                shouldRecurse = true;\n                recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now());\n              } else {\n                active = false;\n              }\n              e = exception;\n              running = false;\n              if (e !== null) {\n                o.onError(e);\n              } else if (shouldRecurse) {\n                self(null, recurseDueTime);\n              }\n            }));\n          }\n        }\n      });\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  function observableDelayAbsolute(source, dueTime, scheduler) {\n    return observableDefer(function () {\n      return observableDelayRelative(source, dueTime - scheduler.now(), scheduler);\n    });\n  }\n\n  function delayWithSelector(source, subscriptionDelay, delayDurationSelector) {\n    var subDelay, selector;\n    if (isFunction(subscriptionDelay)) {\n      selector = subscriptionDelay;\n    } else {\n      subDelay = subscriptionDelay;\n      selector = delayDurationSelector;\n    }\n    return new AnonymousObservable(function (o) {\n      var delays = new CompositeDisposable(), atEnd = false, subscription = new SerialDisposable();\n\n      function start() {\n        subscription.setDisposable(source.subscribe(\n          function (x) {\n            var delay = tryCatch(selector)(x);\n            if (delay === errorObj) { return o.onError(delay.e); }\n            var d = new SingleAssignmentDisposable();\n            delays.add(d);\n            d.setDisposable(delay.subscribe(\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              },\n              function (e) { o.onError(e); },\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              }\n            ));\n          },\n          function (e) { o.onError(e); },\n          function () {\n            atEnd = true;\n            subscription.dispose();\n            done();\n          }\n        ));\n      }\n\n      function done () {\n        atEnd && delays.length === 0 && o.onCompleted();\n      }\n\n      if (!subDelay) {\n        start();\n      } else {\n        subscription.setDisposable(subDelay.subscribe(start, function (e) { o.onError(e); }, start));\n      }\n\n      return new BinaryDisposable(subscription, delays);\n    }, source);\n  }\n\n  /**\n   *  Time shifts the observable sequence by dueTime.\n   *  The relative time intervals between the values are preserved.\n   *\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n   * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delay = function () {\n    var firstArg = arguments[0];\n    if (typeof firstArg === 'number' || firstArg instanceof Date) {\n      var dueTime = firstArg, scheduler = arguments[1];\n      isScheduler(scheduler) || (scheduler = defaultScheduler);\n      return dueTime instanceof Date ?\n        observableDelayAbsolute(this, dueTime, scheduler) :\n        observableDelayRelative(this, dueTime, scheduler);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return delayWithSelector(this, firstArg, arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  var DebounceObservable = (function (__super__) {\n    inherits(DebounceObservable, __super__);\n    function DebounceObservable(source, dt, s) {\n      isScheduler(s) || (s = defaultScheduler);\n      this.source = source;\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    DebounceObservable.prototype.subscribeCore = function (o) {\n      var cancelable = new SerialDisposable();\n      return new BinaryDisposable(\n        this.source.subscribe(new DebounceObserver(o, this._dt, this._s, cancelable)),\n        cancelable);\n    };\n\n    return DebounceObservable;\n  }(ObservableBase));\n\n  var DebounceObserver = (function (__super__) {\n    inherits(DebounceObserver, __super__);\n    function DebounceObserver(observer, dueTime, scheduler, cancelable) {\n      this._o = observer;\n      this._d = dueTime;\n      this._scheduler = scheduler;\n      this._c = cancelable;\n      this._v = null;\n      this._hv = false;\n      this._id = 0;\n      __super__.call(this);\n    }\n\n    function scheduleFuture(s, state) {\n      state.self._hv && state.self._id === state.currentId && state.self._o.onNext(state.x);\n      state.self._hv = false;\n    }\n\n    DebounceObserver.prototype.next = function (x) {\n      this._hv = true;\n      this._v = x;\n      var currentId = ++this._id, d = new SingleAssignmentDisposable();\n      this._c.setDisposable(d);\n      d.setDisposable(this._scheduler.scheduleFuture(this, this._d, function (_, self) {\n        self._hv && self._id === currentId && self._o.onNext(x);\n        self._hv = false;\n      }));\n    };\n\n    DebounceObserver.prototype.error = function (e) {\n      this._c.dispose();\n      this._o.onError(e);\n      this._hv = false;\n      this._id++;\n    };\n\n    DebounceObserver.prototype.completed = function () {\n      this._c.dispose();\n      this._hv && this._o.onNext(this._v);\n      this._o.onCompleted();\n      this._hv = false;\n      this._id++;\n    };\n\n    return DebounceObserver;\n  }(AbstractObserver));\n\n  function debounceWithSelector(source, durationSelector) {\n    return new AnonymousObservable(function (o) {\n      var value, hasValue = false, cancelable = new SerialDisposable(), id = 0;\n      var subscription = source.subscribe(\n        function (x) {\n          var throttle = tryCatch(durationSelector)(x);\n          if (throttle === errorObj) { return o.onError(throttle.e); }\n\n          isPromise(throttle) && (throttle = observableFromPromise(throttle));\n\n          hasValue = true;\n          value = x;\n          id++;\n          var currentid = id, d = new SingleAssignmentDisposable();\n          cancelable.setDisposable(d);\n          d.setDisposable(throttle.subscribe(\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            },\n            function (e) { o.onError(e); },\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            }\n          ));\n        },\n        function (e) {\n          cancelable.dispose();\n          o.onError(e);\n          hasValue = false;\n          id++;\n        },\n        function () {\n          cancelable.dispose();\n          hasValue && o.onNext(value);\n          o.onCompleted();\n          hasValue = false;\n          id++;\n        }\n      );\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  observableProto.debounce = function () {\n    if (isFunction (arguments[0])) {\n      return debounceWithSelector(this, arguments[0]);\n    } else if (typeof arguments[0] === 'number') {\n      return new DebounceObservable(this, arguments[0], arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n   * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n   * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTime = observableProto.windowTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n    var source = this, timeShift;\n    timeShiftOrScheduler == null && (timeShift = timeSpan);\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    if (typeof timeShiftOrScheduler === 'number') {\n      timeShift = timeShiftOrScheduler;\n    } else if (isScheduler(timeShiftOrScheduler)) {\n      timeShift = timeSpan;\n      scheduler = timeShiftOrScheduler;\n    }\n    return new AnonymousObservable(function (observer) {\n      var groupDisposable,\n        nextShift = timeShift,\n        nextSpan = timeSpan,\n        q = [],\n        refCountDisposable,\n        timerD = new SerialDisposable(),\n        totalTime = 0;\n        groupDisposable = new CompositeDisposable(timerD),\n        refCountDisposable = new RefCountDisposable(groupDisposable);\n\n       function createTimer () {\n        var m = new SingleAssignmentDisposable(),\n          isSpan = false,\n          isShift = false;\n        timerD.setDisposable(m);\n        if (nextSpan === nextShift) {\n          isSpan = true;\n          isShift = true;\n        } else if (nextSpan < nextShift) {\n            isSpan = true;\n        } else {\n          isShift = true;\n        }\n        var newTotalTime = isSpan ? nextSpan : nextShift,\n          ts = newTotalTime - totalTime;\n        totalTime = newTotalTime;\n        if (isSpan) {\n          nextSpan += timeShift;\n        }\n        if (isShift) {\n          nextShift += timeShift;\n        }\n        m.setDisposable(scheduler.scheduleFuture(null, ts, function () {\n          if (isShift) {\n            var s = new Subject();\n            q.push(s);\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          isSpan && q.shift().onCompleted();\n          createTimer();\n        }));\n      };\n      q.push(new Subject());\n      observer.onNext(addRef(q[0], refCountDisposable));\n      createTimer();\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n        },\n        function (e) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed.\n   * @param {Number} timeSpan Maximum time length of a window.\n   * @param {Number} count Maximum element count of a window.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTimeOrCount = observableProto.windowTimeOrCount = function (timeSpan, count, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new AnonymousObservable(function (observer) {\n      var timerD = new SerialDisposable(),\n          groupDisposable = new CompositeDisposable(timerD),\n          refCountDisposable = new RefCountDisposable(groupDisposable),\n          n = 0,\n          windowId = 0,\n          s = new Subject();\n\n      function createTimer(id) {\n        var m = new SingleAssignmentDisposable();\n        timerD.setDisposable(m);\n        m.setDisposable(scheduler.scheduleFuture(null, timeSpan, function () {\n          if (id !== windowId) { return; }\n          n = 0;\n          var newId = ++windowId;\n          s.onCompleted();\n          s = new Subject();\n          observer.onNext(addRef(s, refCountDisposable));\n          createTimer(newId);\n        }));\n      }\n\n      observer.onNext(addRef(s, refCountDisposable));\n      createTimer(0);\n\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          var newId = 0, newWindow = false;\n          s.onNext(x);\n          if (++n === count) {\n            newWindow = true;\n            n = 0;\n            newId = ++windowId;\n            s.onCompleted();\n            s = new Subject();\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          newWindow && createTimer(newId);\n        },\n        function (e) {\n          s.onError(e);\n          observer.onError(e);\n        }, function () {\n          s.onCompleted();\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n   * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n   * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n   * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithTime = observableProto.bufferTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n    return this.windowWithTime(timeSpan, timeShiftOrScheduler, scheduler).flatMap(toArray);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed.\n   * @param {Number} timeSpan Maximum time length of a buffer.\n   * @param {Number} count Maximum element count of a buffer.\n   * @param {Scheduler} [scheduler]  Scheduler to run bufferin timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithTimeOrCount = observableProto.bufferTimeOrCount = function (timeSpan, count, scheduler) {\n    return this.windowWithTimeOrCount(timeSpan, count, scheduler).flatMap(toArray);\n  };\n\n  var TimeIntervalObservable = (function (__super__) {\n    inherits(TimeIntervalObservable, __super__);\n    function TimeIntervalObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimeIntervalObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TimeIntervalObserver(o, this._s));\n    };\n\n    return TimeIntervalObservable;\n  }(ObservableBase));\n\n  var TimeIntervalObserver = (function (__super__) {\n    inherits(TimeIntervalObserver, __super__);\n\n    function TimeIntervalObserver(o, s) {\n      this._o = o;\n      this._s = s;\n      this._l = s.now();\n      __super__.call(this);\n    }\n\n    TimeIntervalObserver.prototype.next = function (x) {\n      var now = this._s.now(), span = now - this._l;\n      this._l = now;\n      this._o.onNext({ value: x, interval: span });\n    };\n    TimeIntervalObserver.prototype.error = function (e) { this._o.onError(e); };\n    TimeIntervalObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TimeIntervalObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Records the time interval between consecutive values in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timeInterval();\n   *  2 - res = source.timeInterval(Rx.Scheduler.timeout);\n   *\n   * @param [scheduler]  Scheduler used to compute time intervals. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence with time interval information on values.\n   */\n  observableProto.timeInterval = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TimeIntervalObservable(this, scheduler);\n  };\n\n  var TimestampObservable = (function (__super__) {\n    inherits(TimestampObservable, __super__);\n    function TimestampObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TimestampObserver(o, this._s));\n    };\n\n    return TimestampObservable;\n  }(ObservableBase));\n\n  var TimestampObserver = (function (__super__) {\n    inherits(TimestampObserver, __super__);\n    function TimestampObserver(o, s) {\n      this._o = o;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObserver.prototype.next = function (x) {\n      this._o.onNext({ value: x, timestamp: this._s.now() });\n    };\n\n    TimestampObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TimestampObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return TimestampObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Records the timestamp for each value in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n   *  2 - res = source.timestamp(Rx.Scheduler.default);\n   *\n   * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the default scheduler is used.\n   * @returns {Observable} An observable sequence with timestamp information on values.\n   */\n  observableProto.timestamp = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TimestampObservable(this, scheduler);\n  };\n\n  var SampleObservable = (function(__super__) {\n    inherits(SampleObservable, __super__);\n    function SampleObservable(source, sampler) {\n      this.source = source;\n      this._sampler = sampler;\n      __super__.call(this);\n    }\n\n    SampleObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        atEnd: false,\n        value: null,\n        hasValue: false,\n        sourceSubscription: new SingleAssignmentDisposable()\n      };\n\n      state.sourceSubscription.setDisposable(this.source.subscribe(new SampleSourceObserver(state)));\n      return new BinaryDisposable(\n        state.sourceSubscription,\n        this._sampler.subscribe(new SamplerObserver(state))\n      );\n    };\n\n    return SampleObservable;\n  }(ObservableBase));\n\n  var SamplerObserver = (function(__super__) {\n    inherits(SamplerObserver, __super__);\n    function SamplerObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SamplerObserver.prototype._handleMessage = function () {\n      if (this._s.hasValue) {\n        this._s.hasValue = false;\n        this._s.o.onNext(this._s.value);\n      }\n      this._s.atEnd && this._s.o.onCompleted();\n    };\n\n    SamplerObserver.prototype.next = function () { this._handleMessage(); };\n    SamplerObserver.prototype.error = function (e) { this._s.onError(e); };\n    SamplerObserver.prototype.completed = function () { this._handleMessage(); };\n\n    return SamplerObserver;\n  }(AbstractObserver));\n\n  var SampleSourceObserver = (function(__super__) {\n    inherits(SampleSourceObserver, __super__);\n    function SampleSourceObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SampleSourceObserver.prototype.next = function (x) {\n      this._s.hasValue = true;\n      this._s.value = x;\n    };\n    SampleSourceObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    SampleSourceObserver.prototype.completed = function () {\n      this._s.atEnd = true;\n      this._s.sourceSubscription.dispose();\n    };\n\n    return SampleSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Samples the observable sequence at each interval.\n   *\n   * @example\n   *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n   *  2 - res = source.sample(5000); // 5 seconds\n   *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n   *\n   * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n   * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Sampled observable sequence.\n   */\n  observableProto.sample = function (intervalOrSampler, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return typeof intervalOrSampler === 'number' ?\n      new SampleObservable(this, observableinterval(intervalOrSampler, scheduler)) :\n      new SampleObservable(this, intervalOrSampler);\n  };\n\n  var TimeoutError = Rx.TimeoutError = function(message) {\n    this.message = message || 'Timeout has occurred';\n    this.name = 'TimeoutError';\n    Error.call(this);\n  };\n  TimeoutError.prototype = Object.create(Error.prototype);\n\n  function timeoutWithSelector(source, firstTimeout, timeoutDurationSelector, other) {\n    if (isFunction(firstTimeout)) {\n      other = timeoutDurationSelector;\n      timeoutDurationSelector = firstTimeout;\n      firstTimeout = observableNever();\n    }\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var subscription = new SerialDisposable(),\n        timer = new SerialDisposable(),\n        original = new SingleAssignmentDisposable();\n\n      subscription.setDisposable(original);\n\n      var id = 0, switched = false;\n\n      function setTimer(timeout) {\n        var myId = id, d = new SingleAssignmentDisposable();\n\n        function timerWins() {\n          switched = (myId === id);\n          return switched;\n        }\n\n        timer.setDisposable(d);\n        d.setDisposable(timeout.subscribe(function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n          d.dispose();\n        }, function (e) {\n          timerWins() && o.onError(e);\n        }, function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n        }));\n      };\n\n      setTimer(firstTimeout);\n\n      function oWins() {\n        var res = !switched;\n        if (res) { id++; }\n        return res;\n      }\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (oWins()) {\n          o.onNext(x);\n          var timeout = tryCatch(timeoutDurationSelector)(x);\n          if (timeout === errorObj) { return o.onError(timeout.e); }\n          setTimer(isPromise(timeout) ? observableFromPromise(timeout) : timeout);\n        }\n      }, function (e) {\n        oWins() && o.onError(e);\n      }, function () {\n        oWins() && o.onCompleted();\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  function timeout(source, dueTime, other, scheduler) {\n    if (isScheduler(other)) {\n      scheduler = other;\n      other = observableThrow(new TimeoutError());\n    }\n    if (other instanceof Error) { other = observableThrow(other); }\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var id = 0,\n        original = new SingleAssignmentDisposable(),\n        subscription = new SerialDisposable(),\n        switched = false,\n        timer = new SerialDisposable();\n\n      subscription.setDisposable(original);\n\n      function createTimer() {\n        var myId = id;\n        timer.setDisposable(scheduler.scheduleFuture(null, dueTime, function () {\n          switched = id === myId;\n          if (switched) {\n            isPromise(other) && (other = observableFromPromise(other));\n            subscription.setDisposable(other.subscribe(o));\n          }\n        }));\n      }\n\n      createTimer();\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (!switched) {\n          id++;\n          o.onNext(x);\n          createTimer();\n        }\n      }, function (e) {\n        if (!switched) {\n          id++;\n          o.onError(e);\n        }\n      }, function () {\n        if (!switched) {\n          id++;\n          o.onCompleted();\n        }\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  observableProto.timeout = function () {\n    var firstArg = arguments[0];\n    if (firstArg instanceof Date || typeof firstArg === 'number') {\n      return timeout(this, firstArg, arguments[1], arguments[2]);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return timeoutWithSelector(this, firstArg, arguments[1], arguments[2]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  var GenerateAbsoluteObservable = (function (__super__) {\n    inherits(GenerateAbsoluteObservable, __super__);\n    function GenerateAbsoluteObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n      this._state = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._timeFn = timeFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      state.hasResult && state.o.onNext(state.result);\n\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n      state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (state.hasResult === errorObj) { return state.o.onError(state.hasResult.e); }\n      if (state.hasResult) {\n        state.result = tryCatch(state.self._resFn)(state.newState);\n        if (state.result === errorObj) { return state.o.onError(state.result.e); }\n        var time = tryCatch(state.self._timeFn)(state.newState);\n        if (time === errorObj) { return state.o.onError(time.e); }\n        recurse(state, time);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateAbsoluteObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        newState: this._state,\n        first: true,\n        hasResult: false\n      };\n      return this._s.scheduleRecursiveFuture(state, new Date(this._s.now()), scheduleRecursive);\n    };\n\n    return GenerateAbsoluteObservable;\n  }(ObservableBase));\n\n  /**\n   *  GenerateAbsolutes an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithAbsoluteTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return new Date(); }\n   *  });\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning Date values.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithAbsoluteTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new GenerateAbsoluteObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n  };\n\n  var GenerateRelativeObservable = (function (__super__) {\n    inherits(GenerateRelativeObservable, __super__);\n    function GenerateRelativeObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n      this._state = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._timeFn = timeFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      state.hasResult && state.o.onNext(state.result);\n\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n\n      state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (state.hasResult === errorObj) { return state.o.onError(state.hasResult.e); }\n      if (state.hasResult) {\n        state.result = tryCatch(state.self._resFn)(state.newState);\n        if (state.result === errorObj) { return state.o.onError(state.result.e); }\n        var time = tryCatch(state.self._timeFn)(state.newState);\n        if (time === errorObj) { return state.o.onError(time.e); }\n        recurse(state, time);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateRelativeObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        newState: this._state,\n        first: true,\n        hasResult: false\n      };\n      return this._s.scheduleRecursiveFuture(state, 0, scheduleRecursive);\n    };\n\n    return GenerateRelativeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithRelativeTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return 500; }\n   *  );\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithRelativeTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new GenerateRelativeObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n  };\n\n  var DelaySubscription = (function(__super__) {\n    inherits(DelaySubscription, __super__);\n    function DelaySubscription(source, dt, s) {\n      this.source = source;\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    DelaySubscription.prototype.subscribeCore = function (o) {\n      var d = new SerialDisposable();\n\n      d.setDisposable(this._s.scheduleFuture([this.source, o, d], this._dt, scheduleMethod));\n\n      return d;\n    };\n\n    function scheduleMethod(s, state) {\n      var source = state[0], o = state[1], d = state[2];\n      d.setDisposable(source.subscribe(o));\n    }\n\n    return DelaySubscription;\n  }(ObservableBase));\n\n  /**\n   *  Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.delaySubscription(5000); // 5s\n   *  2 - res = source.delaySubscription(5000, Rx.Scheduler.default); // 5 seconds\n   *\n   * @param {Number} dueTime Relative or absolute time shift of the subscription.\n   * @param {Scheduler} [scheduler]  Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delaySubscription = function (dueTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new DelaySubscription(this, dueTime, scheduler);\n  };\n\n  var SkipLastWithTimeObservable = (function (__super__) {\n    inherits(SkipLastWithTimeObservable, __super__);\n    function SkipLastWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SkipLastWithTimeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipLastWithTimeObserver(o, this));\n    };\n\n    return SkipLastWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipLastWithTimeObserver = (function (__super__) {\n    inherits(SkipLastWithTimeObserver, __super__);\n\n    function SkipLastWithTimeObserver(o, p) {\n      this._o = o;\n      this._s = p._s;\n      this._d = p._d;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    SkipLastWithTimeObserver.prototype.next = function (x) {\n      var now = this._s.now();\n      this._q.push({ interval: now, value: x });\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._o.onNext(this._q.shift().value);\n      }\n    };\n    SkipLastWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipLastWithTimeObserver.prototype.completed = function () {\n      var now = this._s.now();\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._o.onNext(this._q.shift().value);\n      }\n      this._o.onCompleted();\n    };\n\n    return SkipLastWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for skipping elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence.\n   */\n  observableProto.skipLastWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipLastWithTimeObservable(this, duration, scheduler);\n  };\n\n  var TakeLastWithTimeObservable = (function (__super__) {\n    inherits(TakeLastWithTimeObservable, __super__);\n    function TakeLastWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TakeLastWithTimeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeLastWithTimeObserver(o, this._d, this._s));\n    };\n\n    return TakeLastWithTimeObservable;\n  }(ObservableBase));\n\n  var TakeLastWithTimeObserver = (function (__super__) {\n    inherits(TakeLastWithTimeObserver, __super__);\n\n    function TakeLastWithTimeObserver(o, d, s) {\n      this._o = o;\n      this._d = d;\n      this._s = s;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastWithTimeObserver.prototype.next = function (x) {\n      var now = this._s.now();\n      this._q.push({ interval: now, value: x });\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._q.shift();\n      }\n    };\n    TakeLastWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeLastWithTimeObserver.prototype.completed = function () {\n      var now = this._s.now();\n      while (this._q.length > 0) {\n        var next = this._q.shift();\n        if (now - next.interval <= this._d) { this._o.onNext(next.value); }\n      }\n      this._o.onCompleted();\n    };\n\n    return TakeLastWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TakeLastWithTimeObservable(this, duration, scheduler);\n  };\n\n  /**\n   *  Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastBufferWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        var now = scheduler.now();\n        q.push({ interval: now, value: x });\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          q.shift();\n        }\n      }, function (e) { o.onError(e); }, function () {\n        var now = scheduler.now(), res = [];\n        while (q.length > 0) {\n          var next = q.shift();\n          now - next.interval <= duration && res.push(next.value);\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  var TakeWithTimeObservable = (function (__super__) {\n    inherits(TakeWithTimeObservable, __super__);\n    function TakeWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, o) {\n      o.onCompleted();\n    }\n\n    TakeWithTimeObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(\n        this._s.scheduleFuture(o, this._d, scheduleMethod),\n        this.source.subscribe(o)\n      );\n    };\n\n    return TakeWithTimeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.takeWithTime(5000,  [optional scheduler]);\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence.\n   */\n  observableProto.takeWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TakeWithTimeObservable(this, duration, scheduler);\n  };\n\n  var SkipWithTimeObservable = (function (__super__) {\n    inherits(SkipWithTimeObservable, __super__);\n    function SkipWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      this._open = false;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, self) {\n      self._open = true;\n    }\n\n    SkipWithTimeObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(\n        this._s.scheduleFuture(this, this._d, scheduleMethod),\n        this.source.subscribe(new SkipWithTimeObserver(o, this))\n      );\n    };\n\n    return SkipWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipWithTimeObserver = (function (__super__) {\n    inherits(SkipWithTimeObserver, __super__);\n\n    function SkipWithTimeObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipWithTimeObserver.prototype.next = function (x) { this._p._open && this._o.onNext(x); };\n    SkipWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipWithTimeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence.\n   *  This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded\n   *  may not execute immediately, despite the zero due time.\n   *\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration.\n   * @param {Number} duration Duration for skipping elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence.\n   */\n  observableProto.skipWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipWithTimeObservable(this, duration, scheduler);\n  };\n\n  var SkipUntilWithTimeObservable = (function (__super__) {\n    inherits(SkipUntilWithTimeObservable, __super__);\n    function SkipUntilWithTimeObservable(source, startTime, scheduler) {\n      this.source = source;\n      this._st = startTime;\n      this._s = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, state) {\n      state._open = true;\n    }\n\n    SkipUntilWithTimeObservable.prototype.subscribeCore = function (o) {\n      this._open = false;\n      return new BinaryDisposable(\n        this._s.scheduleFuture(this, this._st, scheduleMethod),\n        this.source.subscribe(new SkipUntilWithTimeObserver(o, this))\n      );\n    };\n\n    return SkipUntilWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipUntilWithTimeObserver = (function (__super__) {\n    inherits(SkipUntilWithTimeObserver, __super__);\n\n    function SkipUntilWithTimeObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipUntilWithTimeObserver.prototype.next = function (x) { this._p._open && this._o.onNext(x); };\n    SkipUntilWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipUntilWithTimeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipUntilWithTimeObserver;\n  }(AbstractObserver));\n\n\n  /**\n   *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n   *\n   * @examples\n   *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n   *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n   * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n   */\n  observableProto.skipUntilWithTime = function (startTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipUntilWithTimeObservable(this, startTime, scheduler);\n  };\n\n  /**\n   *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n   * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n   * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n   */\n  observableProto.takeUntilWithTime = function (endTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return new BinaryDisposable(\n        scheduler.scheduleFuture(o, endTime, function (_, o) { o.onCompleted(); }),\n        source.subscribe(o));\n    }, source);\n  };\n\n  /**\n   * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n   * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n   * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n   * @returns {Observable} An Observable that performs the throttle operation.\n   */\n  observableProto.throttle = function (windowDuration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    var duration = +windowDuration || 0;\n    if (duration <= 0) { throw new RangeError('windowDuration cannot be less or equal zero.'); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var lastOnNext = 0;\n      return source.subscribe(\n        function (x) {\n          var now = scheduler.now();\n          if (lastOnNext === 0 || now - lastOnNext >= duration) {\n            lastOnNext = now;\n            o.onNext(x);\n          }\n        },function (e) { o.onError(e); }, function () { o.onCompleted(); }\n      );\n    }, source);\n  };\n\n  var TransduceObserver = (function (__super__) {\n    inherits(TransduceObserver, __super__);\n    function TransduceObserver(o, xform) {\n      this._o = o;\n      this._xform = xform;\n      __super__.call(this);\n    }\n\n    TransduceObserver.prototype.next = function (x) {\n      var res = tryCatch(this._xform['@@transducer/step']).call(this._xform, this._o, x);\n      if (res === errorObj) { this._o.onError(res.e); }\n    };\n\n    TransduceObserver.prototype.error = function (e) { this._o.onError(e); };\n\n    TransduceObserver.prototype.completed = function () {\n      this._xform['@@transducer/result'](this._o);\n    };\n\n    return TransduceObserver;\n  }(AbstractObserver));\n\n  function transformForObserver(o) {\n    return {\n      '@@transducer/init': function() {\n        return o;\n      },\n      '@@transducer/step': function(obs, input) {\n        return obs.onNext(input);\n      },\n      '@@transducer/result': function(obs) {\n        return obs.onCompleted();\n      }\n    };\n  }\n\n  /**\n   * Executes a transducer to transform the observable sequence\n   * @param {Transducer} transducer A transducer to execute\n   * @returns {Observable} An Observable sequence containing the results from the transducer.\n   */\n  observableProto.transduce = function(transducer) {\n    var source = this;\n    return new AnonymousObservable(function(o) {\n      var xform = transducer(transformForObserver(o));\n      return source.subscribe(new TransduceObserver(o, xform));\n    }, source);\n  };\n\n  var SwitchFirstObservable = (function (__super__) {\n    inherits(SwitchFirstObservable, __super__);\n    function SwitchFirstObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    SwitchFirstObservable.prototype.subscribeCore = function (o) {\n      var m = new SingleAssignmentDisposable(),\n        g = new CompositeDisposable(),\n        state = {\n          hasCurrent: false,\n          isStopped: false,\n          o: o,\n          g: g\n        };\n\n      g.add(m);\n      m.setDisposable(this.source.subscribe(new SwitchFirstObserver(state)));\n      return g;\n    };\n\n    return SwitchFirstObservable;\n  }(ObservableBase));\n\n  var SwitchFirstObserver = (function(__super__) {\n    inherits(SwitchFirstObserver, __super__);\n    function SwitchFirstObserver(state) {\n      this._s = state;\n      __super__.call(this);\n    }\n\n    SwitchFirstObserver.prototype.next = function (x) {\n      if (!this._s.hasCurrent) {\n        this._s.hasCurrent = true;\n        isPromise(x) && (x = observableFromPromise(x));\n        var inner = new SingleAssignmentDisposable();\n        this._s.g.add(inner);\n        inner.setDisposable(x.subscribe(new InnerObserver(this._s, inner)));\n      }\n    };\n\n    SwitchFirstObserver.prototype.error = function (e) {\n      this._s.o.onError(e);\n    };\n\n    SwitchFirstObserver.prototype.completed = function () {\n      this._s.isStopped = true;\n      !this._s.hasCurrent && this._s.g.length === 1 && this._s.o.onCompleted();\n    };\n\n    inherits(InnerObserver, __super__);\n    function InnerObserver(state, inner) {\n      this._s = state;\n      this._i = inner;\n      __super__.call(this);\n    }\n\n    InnerObserver.prototype.next = function (x) { this._s.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    InnerObserver.prototype.completed = function () {\n      this._s.g.remove(this._i);\n      this._s.hasCurrent = false;\n      this._s.isStopped && this._s.g.length === 1 && this._s.o.onCompleted();\n    };\n\n    return SwitchFirstObserver;\n  }(AbstractObserver));\n\n  /**\n   * Performs a exclusive waiting for the first to finish before subscribing to another observable.\n   * Observables that come in between subscriptions will be dropped on the floor.\n   * @returns {Observable} A exclusive observable with only the results that happen when subscribed.\n   */\n  observableProto.switchFirst = function () {\n    return new SwitchFirstObservable(this);\n  };\n\nobservableProto.flatMapFirst = observableProto.exhaustMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).switchFirst();\n};\n\nobservableProto.flatMapWithMaxConcurrent = observableProto.flatMapMaxConcurrent = function(limit, selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).merge(limit);\n};\n\n  /** Provides a set of extension methods for virtual time scheduling. */\n  var VirtualTimeScheduler = Rx.VirtualTimeScheduler = (function (__super__) {\n    inherits(VirtualTimeScheduler, __super__);\n\n    /**\n     * Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer.\n     *\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function VirtualTimeScheduler(initialClock, comparer) {\n      this.clock = initialClock;\n      this.comparer = comparer;\n      this.isEnabled = false;\n      this.queue = new PriorityQueue(1024);\n      __super__.call(this);\n    }\n\n    var VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype;\n\n    VirtualTimeSchedulerPrototype.now = function () {\n      return this.toAbsoluteTime(this.clock);\n    };\n\n    VirtualTimeSchedulerPrototype.schedule = function (state, action) {\n      return this.scheduleAbsolute(state, this.clock, action);\n    };\n\n    VirtualTimeSchedulerPrototype.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime instanceof Date ?\n        this.toRelativeTime(dueTime - this.now()) :\n        this.toRelativeTime(dueTime);\n\n      return this.scheduleRelative(state, dt, action);\n    };\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    VirtualTimeSchedulerPrototype.add = notImplemented;\n\n    /**\n     * Converts an absolute time to a number\n     * @param {Any} The absolute time.\n     * @returns {Number} The absolute time in ms\n     */\n    VirtualTimeSchedulerPrototype.toAbsoluteTime = notImplemented;\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    VirtualTimeSchedulerPrototype.toRelativeTime = notImplemented;\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be emulated using recursive scheduling.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.schedulePeriodic = function (state, period, action) {\n      var s = new SchedulePeriodicRecursive(this, state, period, action);\n      return s.start();\n    };\n\n    /**\n     * Schedules an action to be executed after dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleRelative = function (state, dueTime, action) {\n      var runAt = this.add(this.clock, dueTime);\n      return this.scheduleAbsolute(state, runAt, action);\n    };\n\n    /**\n     * Starts the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.start = function () {\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n      }\n    };\n\n    /**\n     * Stops the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.stop = function () {\n      this.isEnabled = false;\n    };\n\n    /**\n     * Advances the scheduler's clock to the specified time, running all work till that point.\n     * @param {Number} time Absolute time to advance the scheduler's clock to.\n     */\n    VirtualTimeSchedulerPrototype.advanceTo = function (time) {\n      var dueToClock = this.comparer(this.clock, time);\n      if (this.comparer(this.clock, time) > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) { return; }\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null && this.comparer(next.dueTime, time) <= 0) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n        this.clock = time;\n      }\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.advanceBy = function (time) {\n      var dt = this.add(this.clock, time),\n          dueToClock = this.comparer(this.clock, dt);\n      if (dueToClock > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) {  return; }\n\n      this.advanceTo(dt);\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.sleep = function (time) {\n      var dt = this.add(this.clock, time);\n      if (this.comparer(this.clock, dt) >= 0) { throw new ArgumentOutOfRangeError(); }\n\n      this.clock = dt;\n    };\n\n    /**\n     * Gets the next scheduled item to be executed.\n     * @returns {ScheduledItem} The next scheduled item.\n     */\n    VirtualTimeSchedulerPrototype.getNext = function () {\n      while (this.queue.length > 0) {\n        var next = this.queue.peek();\n        if (next.isCancelled()) {\n          this.queue.dequeue();\n        } else {\n          return next;\n        }\n      }\n      return null;\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleAbsolute = function (state, dueTime, action) {\n      var self = this;\n\n      function run(scheduler, state1) {\n        self.queue.remove(si);\n        return action(scheduler, state1);\n      }\n\n      var si = new ScheduledItem(this, state, run, dueTime, this.comparer);\n      this.queue.enqueue(si);\n\n      return si.disposable;\n    };\n\n    return VirtualTimeScheduler;\n  }(Scheduler));\n\n  /** Provides a virtual time scheduler that uses Date for absolute time and number for relative time. */\n  Rx.HistoricalScheduler = (function (__super__) {\n    inherits(HistoricalScheduler, __super__);\n\n    /**\n     * Creates a new historical scheduler with the specified initial clock value.\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function HistoricalScheduler(initialClock, comparer) {\n      var clock = initialClock == null ? 0 : initialClock;\n      var cmp = comparer || defaultSubComparer;\n      __super__.call(this, clock, cmp);\n    }\n\n    var HistoricalSchedulerProto = HistoricalScheduler.prototype;\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    HistoricalSchedulerProto.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n\n    HistoricalSchedulerProto.toAbsoluteTime = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @memberOf HistoricalScheduler\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    HistoricalSchedulerProto.toRelativeTime = function (timeSpan) {\n      return timeSpan;\n    };\n\n    return HistoricalScheduler;\n  }(Rx.VirtualTimeScheduler));\n\nfunction OnNextPredicate(predicate) {\n    this.predicate = predicate;\n}\n\nOnNextPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'N') { return false; }\n  return this.predicate(other.value);\n};\n\nfunction OnErrorPredicate(predicate) {\n  this.predicate = predicate;\n}\n\nOnErrorPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'E') { return false; }\n  return this.predicate(other.error);\n};\n\nvar ReactiveTest = Rx.ReactiveTest = {\n  /** Default virtual time used for creation of observable sequences in unit tests. */\n  created: 100,\n  /** Default virtual time used to subscribe to observable sequences in unit tests. */\n  subscribed: 200,\n  /** Default virtual time used to dispose subscriptions in unit tests. */\n  disposed: 1000,\n\n  /**\n   * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n   *\n   * 1 - ReactiveTest.onNext(200, 42);\n   * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n   *\n   * @param ticks Recorded virtual time the OnNext notification occurs.\n   * @param value Recorded value stored in the OnNext notification or a predicate.\n   * @return Recorded OnNext notification.\n   */\n  onNext: function (ticks, value) {\n    return typeof value === 'function' ?\n      new Recorded(ticks, new OnNextPredicate(value)) :\n      new Recorded(ticks, Notification.createOnNext(value));\n  },\n  /**\n   * Factory method for an OnError notification record at a given time with a given error.\n   *\n   * 1 - ReactiveTest.onNext(200, new Error('error'));\n   * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n   *\n   * @param ticks Recorded virtual time the OnError notification occurs.\n   * @param exception Recorded exception stored in the OnError notification.\n   * @return Recorded OnError notification.\n   */\n  onError: function (ticks, error) {\n    return typeof error === 'function' ?\n      new Recorded(ticks, new OnErrorPredicate(error)) :\n      new Recorded(ticks, Notification.createOnError(error));\n  },\n  /**\n   * Factory method for an OnCompleted notification record at a given time.\n   *\n   * @param ticks Recorded virtual time the OnCompleted notification occurs.\n   * @return Recorded OnCompleted notification.\n   */\n  onCompleted: function (ticks) {\n    return new Recorded(ticks, Notification.createOnCompleted());\n  },\n  /**\n   * Factory method for a subscription record based on a given subscription and disposal time.\n   *\n   * @param start Virtual time indicating when the subscription was created.\n   * @param end Virtual time indicating when the subscription was disposed.\n   * @return Subscription object.\n   */\n  subscribe: function (start, end) {\n    return new Subscription(start, end);\n  }\n};\n\n  /**\n   * Creates a new object recording the production of the specified value at the given virtual time.\n   *\n   * @constructor\n   * @param {Number} time Virtual time the value was produced on.\n   * @param {Mixed} value Value that was produced.\n   * @param {Function} comparer An optional comparer.\n   */\n  var Recorded = Rx.Recorded = function (time, value, comparer) {\n    this.time = time;\n    this.value = value;\n    this.comparer = comparer || defaultComparer;\n  };\n\n  /**\n   * Checks whether the given recorded object is equal to the current instance.\n   *\n   * @param {Recorded} other Recorded object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Recorded.prototype.equals = function (other) {\n    return this.time === other.time && this.comparer(this.value, other.value);\n  };\n\n  /**\n   * Returns a string representation of the current Recorded value.\n   *\n   * @returns {String} String representation of the current Recorded value.\n   */\n  Recorded.prototype.toString = function () {\n    return this.value.toString() + '@' + this.time;\n  };\n\n  /**\n   * Creates a new subscription object with the given virtual subscription and unsubscription time.\n   *\n   * @constructor\n   * @param {Number} subscribe Virtual time at which the subscription occurred.\n   * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n   */\n  var Subscription = Rx.Subscription = function (start, end) {\n    this.subscribe = start;\n    this.unsubscribe = end || Number.MAX_VALUE;\n  };\n\n  /**\n   * Checks whether the given subscription is equal to the current instance.\n   * @param other Subscription object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Subscription.prototype.equals = function (other) {\n    return this.subscribe === other.subscribe && this.unsubscribe === other.unsubscribe;\n  };\n\n  /**\n   * Returns a string representation of the current Subscription value.\n   * @returns {String} String representation of the current Subscription value.\n   */\n  Subscription.prototype.toString = function () {\n    return '(' + this.subscribe + ', ' + (this.unsubscribe === Number.MAX_VALUE ? 'Infinite' : this.unsubscribe) + ')';\n  };\n\n  var MockDisposable = Rx.MockDisposable = function (scheduler) {\n    this.scheduler = scheduler;\n    this.disposes = [];\n    this.disposes.push(this.scheduler.clock);\n  };\n\n  MockDisposable.prototype.dispose = function () {\n    this.disposes.push(this.scheduler.clock);\n  };\n\n  var MockObserver = (function (__super__) {\n    inherits(MockObserver, __super__);\n\n    function MockObserver(scheduler) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = [];\n    }\n\n    var MockObserverPrototype = MockObserver.prototype;\n\n    MockObserverPrototype.onNext = function (value) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnNext(value)));\n    };\n\n    MockObserverPrototype.onError = function (e) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnError(e)));\n    };\n\n    MockObserverPrototype.onCompleted = function () {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnCompleted()));\n    };\n\n    return MockObserver;\n  })(Observer);\n\n  function MockPromise(scheduler, messages) {\n    var self = this;\n    this.scheduler = scheduler;\n    this.messages = messages;\n    this.subscriptions = [];\n    this.observers = [];\n    for (var i = 0, len = this.messages.length; i < len; i++) {\n      var message = this.messages[i],\n          notification = message.value;\n      (function (innerNotification) {\n        scheduler.scheduleAbsolute(null, message.time, function () {\n          var obs = self.observers.slice(0);\n\n          for (var j = 0, jLen = obs.length; j < jLen; j++) {\n            innerNotification.accept(obs[j]);\n          }\n          return disposableEmpty;\n        });\n      })(notification);\n    }\n  }\n\n  MockPromise.prototype.then = function (onResolved, onRejected) {\n    var self = this;\n\n    this.subscriptions.push(new Subscription(this.scheduler.clock));\n    var index = this.subscriptions.length - 1;\n\n    var newPromise;\n\n    var observer = Rx.Observer.create(\n      function (x) {\n        var retValue = onResolved(x);\n        if (retValue && typeof retValue.then === 'function') {\n          newPromise = retValue;\n        } else {\n          var ticks = self.scheduler.clock;\n          newPromise = new MockPromise(self.scheduler, [Rx.ReactiveTest.onNext(ticks, undefined), Rx.ReactiveTest.onCompleted(ticks)]);\n        }\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      },\n      function (err) {\n        onRejected(err);\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      }\n    );\n    this.observers.push(observer);\n\n    return newPromise || new MockPromise(this.scheduler, this.messages);\n  };\n\n  var HotObservable = (function (__super__) {\n    inherits(HotObservable, __super__);\n\n    function HotObservable(scheduler, messages) {\n      __super__.call(this);\n      var message, notification, observable = this;\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n      this.observers = [];\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          scheduler.scheduleAbsolute(null, message.time, function () {\n            var obs = observable.observers.slice(0);\n\n            for (var j = 0, jLen = obs.length; j < jLen; j++) {\n              innerNotification.accept(obs[j]);\n            }\n            return disposableEmpty;\n          });\n        })(notification);\n      }\n    }\n\n    HotObservable.prototype._subscribe = function (o) {\n      var observable = this;\n      this.observers.push(o);\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      return disposableCreate(function () {\n        var idx = observable.observers.indexOf(o);\n        observable.observers.splice(idx, 1);\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n      });\n    };\n\n    return HotObservable;\n  })(Observable);\n\n  var ColdObservable = (function (__super__) {\n    inherits(ColdObservable, __super__);\n\n    function ColdObservable(scheduler, messages) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n    }\n\n    ColdObservable.prototype._subscribe = function (o) {\n      var message, notification, observable = this;\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      var d = new CompositeDisposable();\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          d.add(observable.scheduler.scheduleRelative(null, message.time, function () {\n            innerNotification.accept(o);\n            return disposableEmpty;\n          }));\n        })(notification);\n      }\n      return disposableCreate(function () {\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n        d.dispose();\n      });\n    };\n\n    return ColdObservable;\n  })(Observable);\n\n  /** Virtual time scheduler used for testing applications and libraries built using Reactive Extensions. */\n  Rx.TestScheduler = (function (__super__) {\n    inherits(TestScheduler, __super__);\n\n    function baseComparer(x, y) {\n      return x > y ? 1 : (x < y ? -1 : 0);\n    }\n\n    function TestScheduler() {\n      __super__.call(this, 0, baseComparer);\n    }\n\n    /**\n     * Schedules an action to be executed at the specified virtual time.\n     *\n     * @param state State passed to the action to be executed.\n     * @param dueTime Absolute virtual time at which to execute the action.\n     * @param action Action to be executed.\n     * @return Disposable object used to cancel the scheduled action (best effort).\n     */\n    TestScheduler.prototype.scheduleAbsolute = function (state, dueTime, action) {\n      dueTime <= this.clock && (dueTime = this.clock + 1);\n      return __super__.prototype.scheduleAbsolute.call(this, state, dueTime, action);\n    };\n    /**\n     * Adds a relative virtual time to an absolute virtual time value.\n     *\n     * @param absolute Absolute virtual time value.\n     * @param relative Relative virtual time value to add.\n     * @return Resulting absolute virtual time sum value.\n     */\n    TestScheduler.prototype.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n    /**\n     * Converts the absolute virtual time value to a DateTimeOffset value.\n     *\n     * @param absolute Absolute virtual time value to convert.\n     * @return Corresponding DateTimeOffset value.\n     */\n    TestScheduler.prototype.toAbsoluteTime = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     *\n     * @param timeSpan TimeSpan value to convert.\n     * @return Corresponding relative virtual time value.\n     */\n    TestScheduler.prototype.toRelativeTime = function (timeSpan) {\n      return timeSpan;\n    };\n    /**\n     * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n     *\n     * @param create Factory method to create an observable sequence.\n     * @param created Virtual time at which to invoke the factory to create an observable sequence.\n     * @param subscribed Virtual time at which to subscribe to the created observable sequence.\n     * @param disposed Virtual time at which to dispose the subscription.\n     * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n     */\n    TestScheduler.prototype.startScheduler = function (createFn, settings) {\n      settings || (settings = {});\n      settings.created == null && (settings.created = ReactiveTest.created);\n      settings.subscribed == null && (settings.subscribed = ReactiveTest.subscribed);\n      settings.disposed == null && (settings.disposed = ReactiveTest.disposed);\n\n      var observer = this.createObserver(), source, subscription;\n\n      this.scheduleAbsolute(null, settings.created, function () {\n        source = createFn();\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.subscribed, function () {\n        subscription = source.subscribe(observer);\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.disposed, function () {\n        subscription.dispose();\n        return disposableEmpty;\n      });\n\n      this.start();\n\n      return observer;\n    };\n\n    /**\n     * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n     * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createHotObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new HotObservable(this, args);\n    };\n\n    /**\n     * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n     * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createColdObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new ColdObservable(this, args);\n    };\n\n    /**\n     * Creates a resolved promise with the given value and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} value The value to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which fulfills with the given value.\n     */\n    TestScheduler.prototype.createResolvedPromise = function (ticks, value) {\n      return new MockPromise(this, [Rx.ReactiveTest.onNext(ticks, value), Rx.ReactiveTest.onCompleted(ticks)]);\n    };\n\n    /**\n     * Creates a rejected promise with the given reason and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} reason The reason for rejection to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which rejects with the given reason.\n     */\n    TestScheduler.prototype.createRejectedPromise = function (ticks, reason) {\n      return new MockPromise(this, [Rx.ReactiveTest.onError(ticks, reason)]);\n    };\n\n    /**\n     * Creates an observer that records received notification messages and timestamps those.\n     * @return Observer that can be used to assert the timing of received notifications.\n     */\n    TestScheduler.prototype.createObserver = function () {\n      return new MockObserver(this);\n    };\n\n    return TestScheduler;\n  })(VirtualTimeScheduler);\n\n  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {\n    inherits(AnonymousObservable, __super__);\n\n    // Fix subscriber to check for undefined or function returned to decorate as Disposable\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.__subscribe).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function AnonymousObservable(subscribe, parent) {\n      this.source = parent;\n      this.__subscribe = subscribe;\n      __super__.call(this);\n    }\n\n    AnonymousObservable.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    return AnonymousObservable;\n\n  }(Observable));\n\n  var AutoDetachObserver = (function (__super__) {\n    inherits(AutoDetachObserver, __super__);\n\n    function AutoDetachObserver(observer) {\n      __super__.call(this);\n      this.observer = observer;\n      this.m = new SingleAssignmentDisposable();\n    }\n\n    var AutoDetachObserverPrototype = AutoDetachObserver.prototype;\n\n    AutoDetachObserverPrototype.next = function (value) {\n      var result = tryCatch(this.observer.onNext).call(this.observer, value);\n      if (result === errorObj) {\n        this.dispose();\n        thrower(result.e);\n      }\n    };\n\n    AutoDetachObserverPrototype.error = function (err) {\n      var result = tryCatch(this.observer.onError).call(this.observer, err);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.completed = function () {\n      var result = tryCatch(this.observer.onCompleted).call(this.observer);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };\n    AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };\n\n    AutoDetachObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.m.dispose();\n    };\n\n    return AutoDetachObserver;\n  }(AbstractObserver));\n\n  var UnderlyingObservable = (function (__super__) {\n    inherits(UnderlyingObservable, __super__);\n    function UnderlyingObservable(m, u) {\n      this._m = m;\n      this._u = u;\n      __super__.call(this);\n    }\n\n    UnderlyingObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(this._m.getDisposable(), this._u.subscribe(o));\n    };\n\n    return UnderlyingObservable;\n  }(ObservableBase));\n\n  var GroupedObservable = (function (__super__) {\n    inherits(GroupedObservable, __super__);\n    function GroupedObservable(key, underlyingObservable, mergedDisposable) {\n      __super__.call(this);\n      this.key = key;\n      this.underlyingObservable = !mergedDisposable ?\n        underlyingObservable :\n        new UnderlyingObservable(mergedDisposable, underlyingObservable);\n    }\n\n    GroupedObservable.prototype._subscribe = function (o) {\n      return this.underlyingObservable.subscribe(o);\n    };\n\n    return GroupedObservable;\n  }(Observable));\n\n  /**\n   *  Represents an object that is both an observable sequence as well as an observer.\n   *  Each notification is broadcasted to all subscribed observers.\n   */\n  var Subject = Rx.Subject = (function (__super__) {\n    inherits(Subject, __super__);\n    function Subject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(Subject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n          return disposableEmpty;\n        }\n        o.onCompleted();\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onCompleted();\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.error = error;\n          this.hasError = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onNext(value);\n          }\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    /**\n     * Creates a subject from the specified observer and observable.\n     * @param {Observer} observer The observer used to send messages to the subject.\n     * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n     * @returns {Subject} Subject implemented using the given observer and observable.\n     */\n    Subject.create = function (observer, observable) {\n      return new AnonymousSubject(observer, observable);\n    };\n\n    return Subject;\n  }(Observable));\n\n  /**\n   *  Represents the result of an asynchronous operation.\n   *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n   */\n  var AsyncSubject = Rx.AsyncSubject = (function (__super__) {\n    inherits(AsyncSubject, __super__);\n\n    /**\n     * Creates a subject that can only receive one value and that value is cached for all future observations.\n     * @constructor\n     */\n    function AsyncSubject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasValue = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(AsyncSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n\n        if (this.hasError) {\n          o.onError(this.error);\n        } else if (this.hasValue) {\n          o.onNext(this.value);\n          o.onCompleted();\n        } else {\n          o.onCompleted();\n        }\n\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n       */\n      onCompleted: function () {\n        var i, len;\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          var os = cloneArray(this.observers), len = os.length;\n\n          if (this.hasValue) {\n            for (i = 0; i < len; i++) {\n              var o = os[i];\n              o.onNext(this.value);\n              o.onCompleted();\n            }\n          } else {\n            for (i = 0; i < len; i++) {\n              os[i].onCompleted();\n            }\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the error.\n       * @param {Mixed} error The Error to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.hasError = true;\n          this.error = error;\n\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n       * @param {Mixed} value The value to store in the subject.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        this.hasValue = true;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.error = null;\n        this.value = null;\n      }\n    });\n\n    return AsyncSubject;\n  }(Observable));\n\n  /**\n   *  Represents a value that changes over time.\n   *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n   */\n  var BehaviorSubject = Rx.BehaviorSubject = (function (__super__) {\n    inherits(BehaviorSubject, __super__);\n    function BehaviorSubject(value) {\n      __super__.call(this);\n      this.value = value;\n      this.observers = [];\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasError = false;\n    }\n\n    addProperties(BehaviorSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          o.onNext(this.value);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n        } else {\n          o.onCompleted();\n        }\n        return disposableEmpty;\n      },\n      /**\n       * Gets the current value or throws an exception.\n       * Value is frozen after onCompleted is called.\n       * After onError is called always throws the specified exception.\n       * An exception is always thrown after dispose is called.\n       * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n       */\n      getValue: function () {\n        checkDisposed(this);\n        if (this.hasError) { thrower(this.error); }\n        return this.value;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onCompleted();\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.hasError = true;\n        this.error = error;\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onError(error);\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onNext(value);\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.value = null;\n        this.error = null;\n      }\n    });\n\n    return BehaviorSubject;\n  }(Observable));\n\n  /**\n   * Represents an object that is both an observable sequence as well as an observer.\n   * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n   */\n  var ReplaySubject = Rx.ReplaySubject = (function (__super__) {\n\n    var maxSafeInteger = Math.pow(2, 53) - 1;\n\n    function createRemovableDisposable(subject, observer) {\n      return disposableCreate(function () {\n        observer.dispose();\n        !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n      });\n    }\n\n    inherits(ReplaySubject, __super__);\n\n    /**\n     *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n     *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n     *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n     *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n     */\n    function ReplaySubject(bufferSize, windowSize, scheduler) {\n      this.bufferSize = bufferSize == null ? maxSafeInteger : bufferSize;\n      this.windowSize = windowSize == null ? maxSafeInteger : windowSize;\n      this.scheduler = scheduler || currentThreadScheduler;\n      this.q = [];\n      this.observers = [];\n      this.isStopped = false;\n      this.isDisposed = false;\n      this.hasError = false;\n      this.error = null;\n      __super__.call(this);\n    }\n\n    addProperties(ReplaySubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        var so = new ScheduledObserver(this.scheduler, o), subscription = createRemovableDisposable(this, so);\n\n        this._trim(this.scheduler.now());\n        this.observers.push(so);\n\n        for (var i = 0, len = this.q.length; i < len; i++) {\n          so.onNext(this.q[i].value);\n        }\n\n        if (this.hasError) {\n          so.onError(this.error);\n        } else if (this.isStopped) {\n          so.onCompleted();\n        }\n\n        so.ensureActive();\n        return subscription;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      _trim: function (now) {\n        while (this.q.length > this.bufferSize) {\n          this.q.shift();\n        }\n        while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {\n          this.q.shift();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        var now = this.scheduler.now();\n        this.q.push({ interval: now, value: value });\n        this._trim(now);\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onNext(value);\n          observer.ensureActive();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.error = error;\n        this.hasError = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onError(error);\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onCompleted();\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    return ReplaySubject;\n  }(Observable));\n\n  var AnonymousSubject = Rx.AnonymousSubject = (function (__super__) {\n    inherits(AnonymousSubject, __super__);\n    function AnonymousSubject(observer, observable) {\n      this.observer = observer;\n      this.observable = observable;\n      __super__.call(this);\n    }\n\n    addProperties(AnonymousSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        return this.observable.subscribe(o);\n      },\n      onCompleted: function () {\n        this.observer.onCompleted();\n      },\n      onError: function (error) {\n        this.observer.onError(error);\n      },\n      onNext: function (value) {\n        this.observer.onNext(value);\n      }\n    });\n\n    return AnonymousSubject;\n  }(Observable));\n\n  /**\n  * Used to pause and resume streams.\n  */\n  Rx.Pauser = (function (__super__) {\n    inherits(Pauser, __super__);\n    function Pauser() {\n      __super__.call(this);\n    }\n\n    /**\n     * Pauses the underlying sequence.\n     */\n    Pauser.prototype.pause = function () { this.onNext(false); };\n\n    /**\n    * Resumes the underlying sequence.\n    */\n    Pauser.prototype.resume = function () { this.onNext(true); };\n\n    return Pauser;\n  }(Subject));\n\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    root.Rx = Rx;\n\n    define(function() {\n      return Rx;\n    });\n  } else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = Rx).Rx = Rx;\n    } else {\n      freeExports.Rx = Rx;\n    }\n  } else {\n    // in a browser or Rhino\n    root.Rx = Rx;\n  }\n\n  // All code before this point will be filtered from stack traces.\n  var rEndingLine = captureLine();\n\n}.call(this));\n"
  },
  {
    "path": "dist/rx.async.compat.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.binding', 'exports'], function (Rx, exports) {\n      root.Rx = factory(root, exports, Rx);\n      return root.Rx;\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('./rx'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Aliases\n  var Observable = Rx.Observable,\n    observableFromPromise = Observable.fromPromise,\n    observableThrow = Observable.throwError,\n    AnonymousObservable = Rx.AnonymousObservable,\n    ObservableBase = Rx.ObservableBase,\n    AsyncSubject = Rx.AsyncSubject,\n    disposableCreate = Rx.Disposable.create,\n    CompositeDisposable = Rx.CompositeDisposable,\n    immediateScheduler = Rx.Scheduler.immediate,\n    defaultScheduler = Rx.Scheduler['default'],\n    inherits = Rx.internals.inherits,\n    isScheduler = Rx.Scheduler.isScheduler,\n    isPromise = Rx.helpers.isPromise,\n    isFunction = Rx.helpers.isFunction,\n    isIterable = Rx.helpers.isIterable,\n    isArrayLike = Rx.helpers.isArrayLike;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  Observable.wrap = function (fn) {\n    function createObservable() {\n      return Observable.spawn.call(this, fn.apply(this, arguments));\n    }\n\n    createObservable.__generatorFunction__ = fn;\n    return createObservable;\n  };\n\n  var spawn = Observable.spawn = function () {\n    var gen = arguments[0], self = this, args = [];\n    for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n    return new AnonymousObservable(function (o) {\n      var g = new CompositeDisposable();\n\n      if (isFunction(gen)) { gen = gen.apply(self, args); }\n      if (!gen || !isFunction(gen.next)) {\n        o.onNext(gen);\n        return o.onCompleted();\n      }\n\n      function processGenerator(res) {\n        var ret = tryCatch(gen.next).call(gen, res);\n        if (ret === errorObj) { return o.onError(ret.e); }\n        next(ret);\n      }\n\n      processGenerator();\n\n      function onError(err) {\n        var ret = tryCatch(gen.next).call(gen, err);\n        if (ret === errorObj) { return o.onError(ret.e); }\n        next(ret);\n      }\n\n      function next(ret) {\n        if (ret.done) {\n          o.onNext(ret.value);\n          o.onCompleted();\n          return;\n        }\n        var obs = toObservable.call(self, ret.value);\n        var value = null;\n        var hasValue = false;\n        if (Observable.isObservable(obs)) {\n          g.add(obs.subscribe(function(val) {\n            hasValue = true;\n            value = val;\n          }, onError, function() {\n            hasValue && processGenerator(value);\n          }));\n        } else {\n          onError(new TypeError('type not supported'));\n        }\n      }\n\n      return g;\n    });\n  };\n\n  function toObservable(obj) {\n    if (!obj) { return obj; }\n    if (Observable.isObservable(obj)) { return obj; }\n    if (isPromise(obj)) { return Observable.fromPromise(obj); }\n    if (isGeneratorFunction(obj) || isGenerator(obj)) { return spawn.call(this, obj); }\n    if (isFunction(obj)) { return thunkToObservable.call(this, obj); }\n    if (isArrayLike(obj) || isIterable(obj)) { return arrayToObservable.call(this, obj); }\n    if (isObject(obj)) {return objectToObservable.call(this, obj);}\n    return obj;\n  }\n\n  function arrayToObservable (obj) {\n    return Observable.from(obj).concatMap(function(o) {\n      if(Observable.isObservable(o) || isObject(o)) {\n        return toObservable.call(null, o);\n      } else {\n        return Rx.Observable.just(o);\n      }\n    }).toArray();\n  }\n\n  function objectToObservable (obj) {\n    var results = new obj.constructor(), keys = Object.keys(obj), observables = [];\n    for (var i = 0, len = keys.length; i < len; i++) {\n      var key = keys[i];\n      var observable = toObservable.call(this, obj[key]);\n\n      if(observable && Observable.isObservable(observable)) {\n        defer(observable, key);\n      } else {\n        results[key] = obj[key];\n      }\n    }\n\n    return Observable.forkJoin.apply(Observable, observables).map(function() {\n      return results;\n    });\n\n\n    function defer (observable, key) {\n      results[key] = undefined;\n      observables.push(observable.map(function (next) {\n        results[key] = next;\n      }));\n    }\n  }\n\n  function thunkToObservable(fn) {\n    var self = this;\n    return new AnonymousObservable(function (o) {\n      fn.call(self, function () {\n        var err = arguments[0], res = arguments[1];\n        if (err) { return o.onError(err); }\n        if (arguments.length > 2) {\n          var args = [];\n          for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n          res = args;\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    });\n  }\n\n  function isGenerator(obj) {\n    return isFunction (obj.next) && isFunction (obj['throw']);\n  }\n\n  function isGeneratorFunction(obj) {\n    var ctor = obj.constructor;\n    if (!ctor) { return false; }\n    if (ctor.name === 'GeneratorFunction' || ctor.displayName === 'GeneratorFunction') { return true; }\n    return isGenerator(ctor.prototype);\n  }\n\n  function isObject(val) {\n    return Object == val.constructor;\n  }\n\n  /**\n   * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.\n   *\n   * @example\n   * var res = Rx.Observable.start(function () { console.log('hello'); });\n   * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout);\n   * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console);\n   *\n   * @param {Function} func Function to run asynchronously.\n   * @param {Scheduler} [scheduler]  Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param [context]  The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   *\n   * Remarks\n   * * The function is called immediately, not during the subscription of the resulting sequence.\n   * * Multiple subscriptions to the resulting sequence can observe the function's result.\n   */\n  Observable.start = function (func, context, scheduler) {\n    return observableToAsync(func, context, scheduler)();\n  };\n\n  /**\n   * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n   * @param {Function} function Function to convert to an asynchronous function.\n   * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Function} Asynchronous function.\n   */\n  var observableToAsync = Observable.toAsync = function (func, context, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return function () {\n      var args = arguments,\n        subject = new AsyncSubject();\n\n      scheduler.schedule(null, function () {\n        var result;\n        try {\n          result = func.apply(context, args);\n        } catch (e) {\n          subject.onError(e);\n          return;\n        }\n        subject.onNext(result);\n        subject.onCompleted();\n      });\n      return subject.asObservable();\n    };\n  };\n\nfunction createCbObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createCbHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createCbHandler(o, ctx, selector) {\n  return function handler () {\n    var len = arguments.length, results = new Array(len);\n    for(var i = 0; i < len; i++) { results[i] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a callback function to an observable sequence.\n *\n * @param {Function} fn Function with a callback as the last parameter to convert to an Observable sequence.\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n */\nObservable.fromCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n\n    var len = arguments.length, args = new Array(len)\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createCbObservable(fn, ctx, selector, args);\n  };\n};\n\nfunction createNodeObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createNodeHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createNodeHandler(o, ctx, selector) {\n  return function handler () {\n    var err = arguments[0];\n    if (err) { return o.onError(err); }\n\n    var len = arguments.length, results = [];\n    for(var i = 1; i < len; i++) { results[i - 1] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      var results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n * @param {Function} fn The function to call\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n */\nObservable.fromNodeCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createNodeObservable(fn, ctx, selector, args);\n  };\n};\n\n  function isNodeList(el) {\n    if (root.StaticNodeList) {\n      // IE8 Specific\n      // instanceof is slower than Object#toString, but Object#toString will not work as intended in IE8\n      return el instanceof root.StaticNodeList || el instanceof root.NodeList;\n    } else {\n      return Object.prototype.toString.call(el) === '[object NodeList]';\n    }\n  }\n\n  function ListenDisposable(e, n, fn) {\n    this._e = e;\n    this._n = n;\n    this._fn = fn;\n    this._e.addEventListener(this._n, this._fn, false);\n    this.isDisposed = false;\n  }\n  ListenDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this._e.removeEventListener(this._n, this._fn, false);\n      this.isDisposed = true;\n    }\n  };\n\n  function createEventListener (el, eventName, handler) {\n    var disposables = new CompositeDisposable();\n\n    // Asume NodeList or HTMLCollection\n    var elemToString = Object.prototype.toString.call(el);\n    if (isNodeList(el) || elemToString === '[object HTMLCollection]') {\n      for (var i = 0, len = el.length; i < len; i++) {\n        disposables.add(createEventListener(el.item(i), eventName, handler));\n      }\n    } else if (el) {\n      disposables.add(new ListenDisposable(el, eventName, handler));\n    }\n\n    return disposables;\n  }\n\n  /**\n   * Configuration option to determine whether to use native events only\n   */\n  Rx.config.useNativeEvents = false;\n\n  var EventObservable = (function(__super__) {\n    inherits(EventObservable, __super__);\n    function EventObservable(el, name, fn) {\n      this._el = el;\n      this._n = name;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventObservable.prototype.subscribeCore = function (o) {\n      return createEventListener(\n        this._el,\n        this._n,\n        createHandler(o, this._fn));\n    };\n\n    return EventObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n   * @param {Object} element The DOMElement or NodeList to attach a listener.\n   * @param {String} eventName The event name to attach the observable sequence.\n   * @param {Object} eventListenerOptions An object describing EventListenerOptions\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n   */\n  Observable.fromEvent = function (element, eventName, selector, eventListenerOptions) {\n    // Node.js specific\n    if (element.addListener) {\n      return fromEventPattern(\n        function (h) { element.addListener(eventName, h, eventListenerOptions); },\n        function (h) { element.removeListener(eventName, h, eventListenerOptions); },\n        selector);\n    }\n\n    // Use only if non-native events are allowed\n    if (!Rx.config.useNativeEvents) {\n      // Handles jq, Angular.js, Zepto, Marionette, Ember.js\n      if (typeof element.on === 'function' && typeof element.off === 'function') {\n        return fromEventPattern(\n          function (h) { element.on(eventName, h, eventListenerOptions); },\n          function (h) { element.off(eventName, h, eventListenerOptions); },\n          selector);\n      }\n    }\n\n    return new EventObservable(element, eventName, selector).publish().refCount();\n  };\n\n  var EventPatternObservable = (function(__super__) {\n    inherits(EventPatternObservable, __super__);\n    function EventPatternObservable(add, del, fn) {\n      this._add = add;\n      this._del = del;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventPatternObservable.prototype.subscribeCore = function (o) {\n      var fn = createHandler(o, this._fn);\n      var returnValue = this._add(fn);\n      return new EventPatternDisposable(this._del, fn, returnValue);\n    };\n\n    function EventPatternDisposable(del, fn, ret) {\n      this._del = del;\n      this._fn = fn;\n      this._ret = ret;\n      this.isDisposed = false;\n    }\n\n    EventPatternDisposable.prototype.dispose = function () {\n      if(!this.isDisposed) {\n        isFunction(this._del) && this._del(this._fn, this._ret);\n        this.isDisposed = true;\n      }\n    };\n\n    return EventPatternObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n   * @param {Function} addHandler The function to add a handler to the emitter.\n   * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence which wraps an event from an event emitter\n   */\n  var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) {\n    return new EventPatternObservable(addHandler, removeHandler, selector).publish().refCount();\n  };\n\n  /**\n   * Invokes the asynchronous function, surfacing the result through an observable sequence.\n   * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   */\n  Observable.startAsync = function (functionAsync) {\n    var promise = tryCatch(functionAsync)();\n    if (promise === errorObj) { return observableThrow(promise.e); }\n    return observableFromPromise(promise);\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "dist/rx.async.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.binding', 'exports'], function (Rx, exports) {\n      root.Rx = factory(root, exports, Rx);\n      return root.Rx;\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('./rx'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Aliases\n  var Observable = Rx.Observable,\n    observableFromPromise = Observable.fromPromise,\n    observableThrow = Observable.throwError,\n    AnonymousObservable = Rx.AnonymousObservable,\n    ObservableBase = Rx.ObservableBase,\n    AsyncSubject = Rx.AsyncSubject,\n    disposableCreate = Rx.Disposable.create,\n    CompositeDisposable = Rx.CompositeDisposable,\n    immediateScheduler = Rx.Scheduler.immediate,\n    defaultScheduler = Rx.Scheduler['default'],\n    inherits = Rx.internals.inherits,\n    isScheduler = Rx.Scheduler.isScheduler,\n    isPromise = Rx.helpers.isPromise,\n    isFunction = Rx.helpers.isFunction,\n    isIterable = Rx.helpers.isIterable,\n    isArrayLike = Rx.helpers.isArrayLike;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  Observable.wrap = function (fn) {\n    function createObservable() {\n      return Observable.spawn.call(this, fn.apply(this, arguments));\n    }\n\n    createObservable.__generatorFunction__ = fn;\n    return createObservable;\n  };\n\n  var spawn = Observable.spawn = function () {\n    var gen = arguments[0], self = this, args = [];\n    for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n    return new AnonymousObservable(function (o) {\n      var g = new CompositeDisposable();\n\n      if (isFunction(gen)) { gen = gen.apply(self, args); }\n      if (!gen || !isFunction(gen.next)) {\n        o.onNext(gen);\n        return o.onCompleted();\n      }\n\n      function processGenerator(res) {\n        var ret = tryCatch(gen.next).call(gen, res);\n        if (ret === errorObj) { return o.onError(ret.e); }\n        next(ret);\n      }\n\n      processGenerator();\n\n      function onError(err) {\n        var ret = tryCatch(gen.next).call(gen, err);\n        if (ret === errorObj) { return o.onError(ret.e); }\n        next(ret);\n      }\n\n      function next(ret) {\n        if (ret.done) {\n          o.onNext(ret.value);\n          o.onCompleted();\n          return;\n        }\n        var obs = toObservable.call(self, ret.value);\n        var value = null;\n        var hasValue = false;\n        if (Observable.isObservable(obs)) {\n          g.add(obs.subscribe(function(val) {\n            hasValue = true;\n            value = val;\n          }, onError, function() {\n            hasValue && processGenerator(value);\n          }));\n        } else {\n          onError(new TypeError('type not supported'));\n        }\n      }\n\n      return g;\n    });\n  };\n\n  function toObservable(obj) {\n    if (!obj) { return obj; }\n    if (Observable.isObservable(obj)) { return obj; }\n    if (isPromise(obj)) { return Observable.fromPromise(obj); }\n    if (isGeneratorFunction(obj) || isGenerator(obj)) { return spawn.call(this, obj); }\n    if (isFunction(obj)) { return thunkToObservable.call(this, obj); }\n    if (isArrayLike(obj) || isIterable(obj)) { return arrayToObservable.call(this, obj); }\n    if (isObject(obj)) {return objectToObservable.call(this, obj);}\n    return obj;\n  }\n\n  function arrayToObservable (obj) {\n    return Observable.from(obj).concatMap(function(o) {\n      if(Observable.isObservable(o) || isObject(o)) {\n        return toObservable.call(null, o);\n      } else {\n        return Rx.Observable.just(o);\n      }\n    }).toArray();\n  }\n\n  function objectToObservable (obj) {\n    var results = new obj.constructor(), keys = Object.keys(obj), observables = [];\n    for (var i = 0, len = keys.length; i < len; i++) {\n      var key = keys[i];\n      var observable = toObservable.call(this, obj[key]);\n\n      if(observable && Observable.isObservable(observable)) {\n        defer(observable, key);\n      } else {\n        results[key] = obj[key];\n      }\n    }\n\n    return Observable.forkJoin.apply(Observable, observables).map(function() {\n      return results;\n    });\n\n\n    function defer (observable, key) {\n      results[key] = undefined;\n      observables.push(observable.map(function (next) {\n        results[key] = next;\n      }));\n    }\n  }\n\n  function thunkToObservable(fn) {\n    var self = this;\n    return new AnonymousObservable(function (o) {\n      fn.call(self, function () {\n        var err = arguments[0], res = arguments[1];\n        if (err) { return o.onError(err); }\n        if (arguments.length > 2) {\n          var args = [];\n          for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n          res = args;\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    });\n  }\n\n  function isGenerator(obj) {\n    return isFunction (obj.next) && isFunction (obj['throw']);\n  }\n\n  function isGeneratorFunction(obj) {\n    var ctor = obj.constructor;\n    if (!ctor) { return false; }\n    if (ctor.name === 'GeneratorFunction' || ctor.displayName === 'GeneratorFunction') { return true; }\n    return isGenerator(ctor.prototype);\n  }\n\n  function isObject(val) {\n    return Object == val.constructor;\n  }\n\n  /**\n   * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.\n   *\n   * @example\n   * var res = Rx.Observable.start(function () { console.log('hello'); });\n   * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout);\n   * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console);\n   *\n   * @param {Function} func Function to run asynchronously.\n   * @param {Scheduler} [scheduler]  Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param [context]  The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   *\n   * Remarks\n   * * The function is called immediately, not during the subscription of the resulting sequence.\n   * * Multiple subscriptions to the resulting sequence can observe the function's result.\n   */\n  Observable.start = function (func, context, scheduler) {\n    return observableToAsync(func, context, scheduler)();\n  };\n\n  /**\n   * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n   * @param {Function} function Function to convert to an asynchronous function.\n   * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Function} Asynchronous function.\n   */\n  var observableToAsync = Observable.toAsync = function (func, context, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return function () {\n      var args = arguments,\n        subject = new AsyncSubject();\n\n      scheduler.schedule(null, function () {\n        var result;\n        try {\n          result = func.apply(context, args);\n        } catch (e) {\n          subject.onError(e);\n          return;\n        }\n        subject.onNext(result);\n        subject.onCompleted();\n      });\n      return subject.asObservable();\n    };\n  };\n\nfunction createCbObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createCbHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createCbHandler(o, ctx, selector) {\n  return function handler () {\n    var len = arguments.length, results = new Array(len);\n    for(var i = 0; i < len; i++) { results[i] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a callback function to an observable sequence.\n *\n * @param {Function} fn Function with a callback as the last parameter to convert to an Observable sequence.\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n */\nObservable.fromCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n\n    var len = arguments.length, args = new Array(len)\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createCbObservable(fn, ctx, selector, args);\n  };\n};\n\nfunction createNodeObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createNodeHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createNodeHandler(o, ctx, selector) {\n  return function handler () {\n    var err = arguments[0];\n    if (err) { return o.onError(err); }\n\n    var len = arguments.length, results = [];\n    for(var i = 1; i < len; i++) { results[i - 1] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      var results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n * @param {Function} fn The function to call\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n */\nObservable.fromNodeCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createNodeObservable(fn, ctx, selector, args);\n  };\n};\n\n  function isNodeList(el) {\n    if (root.StaticNodeList) {\n      // IE8 Specific\n      // instanceof is slower than Object#toString, but Object#toString will not work as intended in IE8\n      return el instanceof root.StaticNodeList || el instanceof root.NodeList;\n    } else {\n      return Object.prototype.toString.call(el) === '[object NodeList]';\n    }\n  }\n\n  function ListenDisposable(e, n, fn) {\n    this._e = e;\n    this._n = n;\n    this._fn = fn;\n    this._e.addEventListener(this._n, this._fn, false);\n    this.isDisposed = false;\n  }\n  ListenDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this._e.removeEventListener(this._n, this._fn, false);\n      this.isDisposed = true;\n    }\n  };\n\n  function createEventListener (el, eventName, handler) {\n    var disposables = new CompositeDisposable();\n\n    // Asume NodeList or HTMLCollection\n    var elemToString = Object.prototype.toString.call(el);\n    if (isNodeList(el) || elemToString === '[object HTMLCollection]') {\n      for (var i = 0, len = el.length; i < len; i++) {\n        disposables.add(createEventListener(el.item(i), eventName, handler));\n      }\n    } else if (el) {\n      disposables.add(new ListenDisposable(el, eventName, handler));\n    }\n\n    return disposables;\n  }\n\n  /**\n   * Configuration option to determine whether to use native events only\n   */\n  Rx.config.useNativeEvents = false;\n\n  var EventObservable = (function(__super__) {\n    inherits(EventObservable, __super__);\n    function EventObservable(el, name, fn) {\n      this._el = el;\n      this._n = name;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventObservable.prototype.subscribeCore = function (o) {\n      return createEventListener(\n        this._el,\n        this._n,\n        createHandler(o, this._fn));\n    };\n\n    return EventObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n   * @param {Object} element The DOMElement or NodeList to attach a listener.\n   * @param {String} eventName The event name to attach the observable sequence.\n   * @param {Object} eventListenerOptions An object describing EventListenerOptions\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n   */\n  Observable.fromEvent = function (element, eventName, selector, eventListenerOptions) {\n    // Node.js specific\n    if (element.addListener) {\n      return fromEventPattern(\n        function (h) { element.addListener(eventName, h, eventListenerOptions); },\n        function (h) { element.removeListener(eventName, h, eventListenerOptions); },\n        selector);\n    }\n\n    // Use only if non-native events are allowed\n    if (!Rx.config.useNativeEvents) {\n      // Handles jq, Angular.js, Zepto, Marionette, Ember.js\n      if (typeof element.on === 'function' && typeof element.off === 'function') {\n        return fromEventPattern(\n          function (h) { element.on(eventName, h, eventListenerOptions); },\n          function (h) { element.off(eventName, h, eventListenerOptions); },\n          selector);\n      }\n    }\n\n    return new EventObservable(element, eventName, selector).publish().refCount();\n  };\n\n  var EventPatternObservable = (function(__super__) {\n    inherits(EventPatternObservable, __super__);\n    function EventPatternObservable(add, del, fn) {\n      this._add = add;\n      this._del = del;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventPatternObservable.prototype.subscribeCore = function (o) {\n      var fn = createHandler(o, this._fn);\n      var returnValue = this._add(fn);\n      return new EventPatternDisposable(this._del, fn, returnValue);\n    };\n\n    function EventPatternDisposable(del, fn, ret) {\n      this._del = del;\n      this._fn = fn;\n      this._ret = ret;\n      this.isDisposed = false;\n    }\n\n    EventPatternDisposable.prototype.dispose = function () {\n      if(!this.isDisposed) {\n        isFunction(this._del) && this._del(this._fn, this._ret);\n        this.isDisposed = true;\n      }\n    };\n\n    return EventPatternObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n   * @param {Function} addHandler The function to add a handler to the emitter.\n   * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence which wraps an event from an event emitter\n   */\n  var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) {\n    return new EventPatternObservable(addHandler, removeHandler, selector).publish().refCount();\n  };\n\n  /**\n   * Invokes the asynchronous function, surfacing the result through an observable sequence.\n   * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   */\n  Observable.startAsync = function (functionAsync) {\n    var promise = tryCatch(functionAsync)();\n    if (promise === errorObj) { return observableThrow(promise.e); }\n    return observableFromPromise(promise);\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "dist/rx.backpressure.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('./rx'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // References\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    NAryDisposable = Rx.NAryDisposable,\n    Notification = Rx.Notification,\n    Subject = Rx.Subject,\n    Observer = Rx.Observer,\n    disposableEmpty = Rx.Disposable.empty,\n    disposableCreate = Rx.Disposable.create,\n    inherits = Rx.internals.inherits,\n    addProperties = Rx.internals.addProperties,\n    defaultScheduler = Rx.Scheduler['default'],\n    currentThreadScheduler = Rx.Scheduler.currentThread,\n    identity = Rx.helpers.identity,\n    isScheduler = Rx.Scheduler.isScheduler,\n    isFunction = Rx.helpers.isFunction,\n    checkDisposed = Rx.Disposable.checkDisposed;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  /**\n  * Used to pause and resume streams.\n  */\n  Rx.Pauser = (function (__super__) {\n    inherits(Pauser, __super__);\n    function Pauser() {\n      __super__.call(this);\n    }\n\n    /**\n     * Pauses the underlying sequence.\n     */\n    Pauser.prototype.pause = function () { this.onNext(false); };\n\n    /**\n    * Resumes the underlying sequence.\n    */\n    Pauser.prototype.resume = function () { this.onNext(true); };\n\n    return Pauser;\n  }(Subject));\n\n  var PausableObservable = (function (__super__) {\n    inherits(PausableObservable, __super__);\n    function PausableObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableObservable.prototype._subscribe = function (o) {\n      var conn = this.source.publish(),\n        subscription = conn.subscribe(o),\n        connection = disposableEmpty;\n\n      var pausable = this.pauser.startWith(!this.paused).distinctUntilChanged().subscribe(function (b) {\n        if (b) {\n          connection = conn.connect();\n        } else {\n          connection.dispose();\n          connection = disposableEmpty;\n        }\n      });\n\n      return new NAryDisposable([subscription, connection, pausable]);\n    };\n\n    PausableObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausable(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausable = function (pauser) {\n    return new PausableObservable(this, pauser);\n  };\n\n  function combineLatestSource(source, subject, resultSelector) {\n    return new AnonymousObservable(function (o) {\n      var hasValue = [false, false],\n        hasValueAll = false,\n        isDone = false,\n        values = new Array(2),\n        err;\n\n      function next(x, i) {\n        values[i] = x;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          if (err) { return o.onError(err); }\n          var res = tryCatch(resultSelector).apply(null, values);\n          if (res === errorObj) { return o.onError(res.e); }\n          o.onNext(res);\n        }\n        isDone && values[1] && o.onCompleted();\n      }\n\n      return new BinaryDisposable(\n        source.subscribe(\n          function (x) {\n            next(x, 0);\n          },\n          function (e) {\n            if (values[1]) {\n              o.onError(e);\n            } else {\n              err = e;\n            }\n          },\n          function () {\n            isDone = true;\n            values[1] && o.onCompleted();\n          }),\n        subject.subscribe(\n          function (x) {\n            next(x, 1);\n          },\n          function (e) { o.onError(e); },\n          function () {\n            isDone = true;\n            next(true, 1);\n          })\n        );\n    }, source);\n  }\n\n  var PausableBufferedObservable = (function (__super__) {\n    inherits(PausableBufferedObservable, __super__);\n    function PausableBufferedObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableBufferedObservable.prototype._subscribe = function (o) {\n      var q = [], previousShouldFire;\n\n      function drainQueue() { while (q.length > 0) { o.onNext(q.shift()); } }\n\n      var subscription =\n        combineLatestSource(\n          this.source,\n          this.pauser.startWith(!this.paused).distinctUntilChanged(),\n          function (data, shouldFire) {\n            return { data: data, shouldFire: shouldFire };\n          })\n          .subscribe(\n            function (results) {\n              if (previousShouldFire !== undefined && results.shouldFire !== previousShouldFire) {\n                previousShouldFire = results.shouldFire;\n                // change in shouldFire\n                if (results.shouldFire) { drainQueue(); }\n              } else {\n                previousShouldFire = results.shouldFire;\n                // new data\n                if (results.shouldFire) {\n                  o.onNext(results.data);\n                } else {\n                  q.push(results.data);\n                }\n              }\n            },\n            function (err) {\n              drainQueue();\n              o.onError(err);\n            },\n            function () {\n              drainQueue();\n              o.onCompleted();\n            }\n          );\n      return subscription;      \n    };\n\n    PausableBufferedObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableBufferedObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableBufferedObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n   * and yields the values that were buffered while paused.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausableBuffered = function (pauser) {\n    return new PausableBufferedObservable(this, pauser);\n  };\n\n  var ControlledObservable = (function (__super__) {\n    inherits(ControlledObservable, __super__);\n    function ControlledObservable (source, enableQueue, scheduler) {\n      __super__.call(this);\n      this.subject = new ControlledSubject(enableQueue, scheduler);\n      this.source = source.multicast(this.subject).refCount();\n    }\n\n    ControlledObservable.prototype._subscribe = function (o) {\n      return this.source.subscribe(o);\n    };\n\n    ControlledObservable.prototype.request = function (numberOfItems) {\n      return this.subject.request(numberOfItems == null ? -1 : numberOfItems);\n    };\n\n    return ControlledObservable;\n\n  }(Observable));\n\n  var ControlledSubject = (function (__super__) {\n    inherits(ControlledSubject, __super__);\n    function ControlledSubject(enableQueue, scheduler) {\n      enableQueue == null && (enableQueue = true);\n\n      __super__.call(this);\n      this.subject = new Subject();\n      this.enableQueue = enableQueue;\n      this.queue = enableQueue ? [] : null;\n      this.requestedCount = 0;\n      this.requestedDisposable = null;\n      this.error = null;\n      this.hasFailed = false;\n      this.hasCompleted = false;\n      this.scheduler = scheduler || currentThreadScheduler;\n    }\n\n    addProperties(ControlledSubject.prototype, Observer, {\n      _subscribe: function (o) {\n        return this.subject.subscribe(o);\n      },\n      onCompleted: function () {\n        this.hasCompleted = true;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onCompleted();\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnCompleted());\n        }\n      },\n      onError: function (error) {\n        this.hasFailed = true;\n        this.error = error;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onError(error);\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnError(error));\n        }\n      },\n      onNext: function (value) {\n        if (this.requestedCount <= 0) {\n          this.enableQueue && this.queue.push(Notification.createOnNext(value));\n        } else {\n          (this.requestedCount-- === 0) && this.disposeCurrentRequest();\n          this.subject.onNext(value);\n        }\n      },\n      _processRequest: function (numberOfItems) {\n        if (this.enableQueue) {\n          while (this.queue.length > 0 && (numberOfItems > 0 || this.queue[0].kind !== 'N')) {\n            var first = this.queue.shift();\n            first.accept(this.subject);\n            if (first.kind === 'N') {\n              numberOfItems--;\n            } else {\n              this.disposeCurrentRequest();\n              this.queue = [];\n            }\n          }\n        }\n\n        return numberOfItems;\n      },\n      request: function (number) {\n        this.disposeCurrentRequest();\n        var self = this;\n\n        this.requestedDisposable = this.scheduler.schedule(number,\n        function(s, i) {\n          var remaining = self._processRequest(i);\n          var stopped = self.hasCompleted || self.hasFailed;\n          if (!stopped && remaining > 0) {\n            self.requestedCount = remaining;\n\n            return disposableCreate(function () {\n              self.requestedCount = 0;\n            });\n              // Scheduled item is still in progress. Return a new\n              // disposable to allow the request to be interrupted\n              // via dispose.\n          }\n        });\n\n        return this.requestedDisposable;\n      },\n      disposeCurrentRequest: function () {\n        if (this.requestedDisposable) {\n          this.requestedDisposable.dispose();\n          this.requestedDisposable = null;\n        }\n      }\n    });\n\n    return ControlledSubject;\n  }(Observable));\n\n  /**\n   * Attaches a controller to the observable sequence with the ability to queue.\n   * @example\n   * var source = Rx.Observable.interval(100).controlled();\n   * source.request(3); // Reads 3 values\n   * @param {bool} enableQueue truthy value to determine if values should be queued pending the next request\n   * @param {Scheduler} scheduler determines how the requests will be scheduled\n   * @returns {Observable} The observable sequence which only propagates values on request.\n   */\n  observableProto.controlled = function (enableQueue, scheduler) {\n\n    if (enableQueue && isScheduler(enableQueue)) {\n      scheduler = enableQueue;\n      enableQueue = true;\n    }\n\n    if (enableQueue == null) {  enableQueue = true; }\n    return new ControlledObservable(this, enableQueue, scheduler);\n  };\n\n  var StopAndWaitObservable = (function (__super__) {\n    inherits(StopAndWaitObservable, __super__);\n    function StopAndWaitObservable (source) {\n      __super__.call(this);\n      this.source = source;\n    }\n\n    function scheduleMethod(s, self) {\n      return self.source.request(1);\n    }\n\n    StopAndWaitObservable.prototype._subscribe = function (o) {\n      this.subscription = this.source.subscribe(new StopAndWaitObserver(o, this, this.subscription));\n      return new BinaryDisposable(\n        this.subscription,\n        defaultScheduler.schedule(this, scheduleMethod)\n      );\n    };\n\n    var StopAndWaitObserver = (function (__sub__) {\n      inherits(StopAndWaitObserver, __sub__);\n      function StopAndWaitObserver (observer, observable, cancel) {\n        __sub__.call(this);\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n        this.scheduleDisposable = null;\n      }\n\n      StopAndWaitObserver.prototype.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      StopAndWaitObserver.prototype.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      };\n\n      function innerScheduleMethod(s, self) {\n        return self.observable.source.request(1);\n      }\n\n      StopAndWaitObserver.prototype.next = function (value) {\n        this.observer.onNext(value);\n        this.scheduleDisposable = defaultScheduler.schedule(this, innerScheduleMethod);\n      };\n\n      StopAndWaitObserver.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        if (this.scheduleDisposable) {\n          this.scheduleDisposable.dispose();\n          this.scheduleDisposable = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return StopAndWaitObserver;\n    }(AbstractObserver));\n\n    return StopAndWaitObservable;\n  }(Observable));\n\n\n  /**\n   * Attaches a stop and wait observable to the current observable.\n   * @returns {Observable} A stop and wait observable.\n   */\n  ControlledObservable.prototype.stopAndWait = function () {\n    return new StopAndWaitObservable(this);\n  };\n\n  var WindowedObservable = (function (__super__) {\n    inherits(WindowedObservable, __super__);\n    function WindowedObservable(source, windowSize) {\n      __super__.call(this);\n      this.source = source;\n      this.windowSize = windowSize;\n    }\n\n    function scheduleMethod(s, self) {\n      return self.source.request(self.windowSize);\n    }\n\n    WindowedObservable.prototype._subscribe = function (o) {\n      this.subscription = this.source.subscribe(new WindowedObserver(o, this, this.subscription));\n      return new BinaryDisposable(\n        this.subscription,\n        defaultScheduler.schedule(this, scheduleMethod)\n      );\n    };\n\n    var WindowedObserver = (function (__sub__) {\n      inherits(WindowedObserver, __sub__);\n      function WindowedObserver(observer, observable, cancel) {\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n        this.received = 0;\n        this.scheduleDisposable = null;\n        __sub__.call(this);\n      }\n\n      WindowedObserver.prototype.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      WindowedObserver.prototype.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      };\n\n      function innerScheduleMethod(s, self) {\n        return self.observable.source.request(self.observable.windowSize);\n      }\n\n      WindowedObserver.prototype.next = function (value) {\n        this.observer.onNext(value);\n        this.received = ++this.received % this.observable.windowSize;\n        this.received === 0 && (this.scheduleDisposable = defaultScheduler.schedule(this, innerScheduleMethod));\n      };\n\n      WindowedObserver.prototype.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        if (this.scheduleDisposable) {\n          this.scheduleDisposable.dispose();\n          this.scheduleDisposable = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return WindowedObserver;\n    }(AbstractObserver));\n\n    return WindowedObservable;\n  }(Observable));\n\n  /**\n   * Creates a sliding windowed observable based upon the window size.\n   * @param {Number} windowSize The number of items in the window\n   * @returns {Observable} A windowed observable based upon the window size.\n   */\n  ControlledObservable.prototype.windowed = function (windowSize) {\n    return new WindowedObservable(this, windowSize);\n  };\n\n  /**\n   * Pipes the existing Observable sequence into a Node.js Stream.\n   * @param {Stream} dest The destination Node.js stream.\n   * @returns {Stream} The destination stream.\n   */\n  observableProto.pipe = function (dest) {\n    var source = this.pausableBuffered();\n\n    function onDrain() {\n      source.resume();\n    }\n\n    dest.addListener('drain', onDrain);\n\n    source.subscribe(\n      function (x) {\n        !dest.write(x) && source.pause();\n      },\n      function (err) {\n        dest.emit('error', err);\n      },\n      function () {\n        // Hack check because STDIO is not closable\n        !dest._isStdio && dest.end();\n        dest.removeListener('drain', onDrain);\n      });\n\n    source.resume();\n\n    return dest;\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "dist/rx.binding.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('./rx'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    ObservableBase = Rx.ObservableBase,\n    Subject = Rx.Subject,\n    AsyncSubject = Rx.AsyncSubject,\n    Observer = Rx.Observer,\n    ScheduledObserver = Rx.internals.ScheduledObserver,\n    disposableCreate = Rx.Disposable.create,\n    disposableEmpty = Rx.Disposable.empty,\n    BinaryDisposable = Rx.BinaryDisposable,\n    currentThreadScheduler = Rx.Scheduler.currentThread,\n    isFunction = Rx.helpers.isFunction,\n    inherits = Rx.internals.inherits,\n    addProperties = Rx.internals.addProperties,\n    checkDisposed = Rx.Disposable.checkDisposed;\n\n  // Utilities\n  function cloneArray(arr) {\n    var len = arr.length, a = new Array(len);\n    for(var i = 0; i < len; i++) { a[i] = arr[i]; }\n    return a;\n  }\n\n  var MulticastObservable = (function (__super__) {\n    inherits(MulticastObservable, __super__);\n    function MulticastObservable(source, fn1, fn2) {\n      this.source = source;\n      this._fn1 = fn1;\n      this._fn2 = fn2;\n      __super__.call(this);\n    }\n\n    MulticastObservable.prototype.subscribeCore = function (o) {\n      var connectable = this.source.multicast(this._fn1());\n      return new BinaryDisposable(this._fn2(connectable).subscribe(o), connectable.connect());\n    };\n\n    return MulticastObservable;\n  }(ObservableBase));\n\n  /**\n   * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n   * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n   * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n   *\n   * @example\n   * 1 - res = source.multicast(observable);\n   * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n   *\n   * @param {Function|Subject} subjectOrSubjectSelector\n   * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n   * Or:\n   * Subject to push source elements into.\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.multicast = function (subjectOrSubjectSelector, selector) {\n    return isFunction(subjectOrSubjectSelector) ?\n      new MulticastObservable(this, subjectOrSubjectSelector, selector) :\n      new ConnectableObservable(this, subjectOrSubjectSelector);\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of Multicast using a regular Subject.\n   *\n   * @example\n   * var resres = source.publish();\n   * var res = source.publish(function (x) { return x; });\n   *\n   * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publish = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new Subject(); }, selector) :\n      this.multicast(new Subject());\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.share = function () {\n    return this.publish().refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n   * This operator is a specialization of Multicast using a AsyncSubject.\n   *\n   * @example\n   * var res = source.publishLast();\n   * var res = source.publishLast(function (x) { return x; });\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishLast = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new AsyncSubject(); }, selector) :\n      this.multicast(new AsyncSubject());\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n   * This operator is a specialization of Multicast using a BehaviorSubject.\n   *\n   * @example\n   * var res = source.publishValue(42);\n   * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishValue = function (initialValueOrSelector, initialValue) {\n    return arguments.length === 2 ?\n      this.multicast(function () {\n        return new BehaviorSubject(initialValue);\n      }, initialValueOrSelector) :\n      this.multicast(new BehaviorSubject(initialValueOrSelector));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n   * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareValue = function (initialValue) {\n    return this.publishValue(initialValue).refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of Multicast using a ReplaySubject.\n   *\n   * @example\n   * var res = source.replay(null, 3);\n   * var res = source.replay(null, 3, 500);\n   * var res = source.replay(null, 3, 500, scheduler);\n   * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param windowSize [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.replay = function (selector, bufferSize, windowSize, scheduler) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new ReplaySubject(bufferSize, windowSize, scheduler); }, selector) :\n      this.multicast(new ReplaySubject(bufferSize, windowSize, scheduler));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   *\n   * @example\n   * var res = source.shareReplay(3);\n   * var res = source.shareReplay(3, 500);\n   * var res = source.shareReplay(3, 500, scheduler);\n   *\n\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareReplay = function (bufferSize, windowSize, scheduler) {\n    return this.replay(null, bufferSize, windowSize, scheduler).refCount();\n  };\n\n  var InnerSubscription = function (s, o) {\n    this._s = s;\n    this._o = o;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this._s.isDisposed && this._o !== null) {\n      var idx = this._s.observers.indexOf(this._o);\n      this._s.observers.splice(idx, 1);\n      this._o = null;\n    }\n  };\n\n  /**\n   *  Represents a value that changes over time.\n   *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n   */\n  var BehaviorSubject = Rx.BehaviorSubject = (function (__super__) {\n    inherits(BehaviorSubject, __super__);\n    function BehaviorSubject(value) {\n      __super__.call(this);\n      this.value = value;\n      this.observers = [];\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasError = false;\n    }\n\n    addProperties(BehaviorSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          o.onNext(this.value);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n        } else {\n          o.onCompleted();\n        }\n        return disposableEmpty;\n      },\n      /**\n       * Gets the current value or throws an exception.\n       * Value is frozen after onCompleted is called.\n       * After onError is called always throws the specified exception.\n       * An exception is always thrown after dispose is called.\n       * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n       */\n      getValue: function () {\n        checkDisposed(this);\n        if (this.hasError) { thrower(this.error); }\n        return this.value;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onCompleted();\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.hasError = true;\n        this.error = error;\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onError(error);\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onNext(value);\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.value = null;\n        this.error = null;\n      }\n    });\n\n    return BehaviorSubject;\n  }(Observable));\n\n  /**\n   * Represents an object that is both an observable sequence as well as an observer.\n   * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n   */\n  var ReplaySubject = Rx.ReplaySubject = (function (__super__) {\n\n    var maxSafeInteger = Math.pow(2, 53) - 1;\n\n    function createRemovableDisposable(subject, observer) {\n      return disposableCreate(function () {\n        observer.dispose();\n        !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n      });\n    }\n\n    inherits(ReplaySubject, __super__);\n\n    /**\n     *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n     *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n     *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n     *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n     */\n    function ReplaySubject(bufferSize, windowSize, scheduler) {\n      this.bufferSize = bufferSize == null ? maxSafeInteger : bufferSize;\n      this.windowSize = windowSize == null ? maxSafeInteger : windowSize;\n      this.scheduler = scheduler || currentThreadScheduler;\n      this.q = [];\n      this.observers = [];\n      this.isStopped = false;\n      this.isDisposed = false;\n      this.hasError = false;\n      this.error = null;\n      __super__.call(this);\n    }\n\n    addProperties(ReplaySubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        var so = new ScheduledObserver(this.scheduler, o), subscription = createRemovableDisposable(this, so);\n\n        this._trim(this.scheduler.now());\n        this.observers.push(so);\n\n        for (var i = 0, len = this.q.length; i < len; i++) {\n          so.onNext(this.q[i].value);\n        }\n\n        if (this.hasError) {\n          so.onError(this.error);\n        } else if (this.isStopped) {\n          so.onCompleted();\n        }\n\n        so.ensureActive();\n        return subscription;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      _trim: function (now) {\n        while (this.q.length > this.bufferSize) {\n          this.q.shift();\n        }\n        while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {\n          this.q.shift();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        var now = this.scheduler.now();\n        this.q.push({ interval: now, value: value });\n        this._trim(now);\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onNext(value);\n          observer.ensureActive();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.error = error;\n        this.hasError = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onError(error);\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onCompleted();\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    return ReplaySubject;\n  }(Observable));\n\n  var RefCountObservable = (function (__super__) {\n    inherits(RefCountObservable, __super__);\n    function RefCountObservable(source) {\n      this.source = source;\n      this._count = 0;\n      this._connectableSubscription = null;\n      __super__.call(this);\n    }\n\n    RefCountObservable.prototype.subscribeCore = function (o) {\n      var subscription = this.source.subscribe(o);\n      ++this._count === 1 && (this._connectableSubscription = this.source.connect());\n      return new RefCountDisposable(this, subscription);\n    };\n\n    function RefCountDisposable(p, s) {\n      this._p = p;\n      this._s = s;\n      this.isDisposed = false;\n    }\n\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this._s.dispose();\n        --this._p._count === 0 && this._p._connectableSubscription.dispose();\n      }\n    };\n\n    return RefCountObservable;\n  }(ObservableBase));\n\n  var ConnectableObservable = Rx.ConnectableObservable = (function (__super__) {\n    inherits(ConnectableObservable, __super__);\n    function ConnectableObservable(source, subject) {\n      this.source = source;\n      this._connection = null;\n      this._source = source.asObservable();\n      this._subject = subject;\n      __super__.call(this);\n    }\n\n    function ConnectDisposable(parent, subscription) {\n      this._p = parent;\n      this._s = subscription;\n    }\n\n    ConnectDisposable.prototype.dispose = function () {\n      if (this._s) {\n        this._s.dispose();\n        this._s = null;\n        this._p._connection = null;\n      }\n    };\n\n    ConnectableObservable.prototype.connect = function () {\n      if (!this._connection) {\n        if (this._subject.isStopped) {\n          return disposableEmpty;\n        }\n        var subscription = this._source.subscribe(this._subject);\n        this._connection = new ConnectDisposable(this, subscription);\n      }\n      return this._connection;\n    };\n\n    ConnectableObservable.prototype._subscribe = function (o) {\n      return this._subject.subscribe(o);\n    };\n\n    ConnectableObservable.prototype.refCount = function () {\n      return new RefCountObservable(this);\n    };\n\n    return ConnectableObservable;\n  }(Observable));\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence. This observable sequence\n   * can be resubscribed to, even if all prior subscriptions have ended. (unlike `.publish().refCount()`)\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source.\n   */\n  observableProto.singleInstance = function() {\n    var source = this, hasObservable = false, observable;\n\n    function getObservable() {\n      if (!hasObservable) {\n        hasObservable = true;\n        observable = source['finally'](function() { hasObservable = false; }).publish().refCount();\n      }\n      return observable;\n    }\n\n    return new AnonymousObservable(function(o) {\n      return getObservable().subscribe(o);\n    });\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "dist/rx.coincidence.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('./rx'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  var Observable = Rx.Observable,\n    ObservableBase = Rx.ObservableBase,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    Subject = Rx.Subject,\n    observableProto = Observable.prototype,\n    observableEmpty = Observable.empty,\n    observableNever = Observable.never,\n    AnonymousObservable = Rx.AnonymousObservable,\n    addRef = Rx.internals.addRef,\n    inherits = Rx.internals.inherits,\n    bindCallback = Rx.internals.bindCallback,\n    noop = Rx.helpers.noop,\n    isPromise = Rx.helpers.isPromise,\n    isFunction = Rx.helpers.isFunction,\n    observableFromPromise = Observable.fromPromise;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  var Map = root.Map || (function () {\n    function Map() {\n      this.size = 0;\n      this._values = [];\n      this._keys = [];\n    }\n\n    Map.prototype['delete'] = function (key) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) { return false; }\n      this._values.splice(i, 1);\n      this._keys.splice(i, 1);\n      this.size--;\n      return true;\n    };\n\n    Map.prototype.get = function (key) {\n      var i = this._keys.indexOf(key);\n      return i === -1 ? undefined : this._values[i];\n    };\n\n    Map.prototype.set = function (key, value) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) {\n        this._keys.push(key);\n        this._values.push(value);\n        this.size++;\n      } else {\n        this._values[i] = value;\n      }\n      return this;\n    };\n\n    Map.prototype.forEach = function (cb, thisArg) {\n      for (var i = 0; i < this.size; i++) {\n        cb.call(thisArg, this._values[i], this._keys[i]);\n      }\n    };\n\n    return Map;\n  }());\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters passed to the function correspond with the elements from the left and right source sequences for which overlap occurs.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.join = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable();\n      var leftDone = false, rightDone = false;\n      var leftId = 0, rightId = 0;\n      var leftMap = new Map(), rightMap = new Map();\n      var handleError = function (e) { o.onError(e); };\n\n      group.add(left.subscribe(\n        function (value) {\n          var id = leftId++, md = new SingleAssignmentDisposable();\n\n          leftMap.set(id, value);\n          group.add(md);\n\n          var duration = tryCatch(leftDurationSelector)(value);\n          if (duration === errorObj) { return o.onError(duration.e); }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            handleError,\n            function () {\n              leftMap['delete'](id) && leftMap.size === 0 && leftDone && o.onCompleted();\n              group.remove(md);\n            }));\n\n          rightMap.forEach(function (v) {\n            var result = tryCatch(resultSelector)(value, v);\n            if (result === errorObj) { return o.onError(result.e); }\n            o.onNext(result);\n          });\n        },\n        handleError,\n        function () {\n          leftDone = true;\n          (rightDone || leftMap.size === 0) && o.onCompleted();\n        })\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++, md = new SingleAssignmentDisposable();\n\n          rightMap.set(id, value);\n          group.add(md);\n\n          var duration = tryCatch(rightDurationSelector)(value);\n          if (duration === errorObj) { return o.onError(duration.e); }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            handleError,\n            function () {\n              rightMap['delete'](id) && rightMap.size === 0 && rightDone && o.onCompleted();\n              group.remove(md);\n            }));\n\n          leftMap.forEach(function (v) {\n            var result = tryCatch(resultSelector)(v, value);\n            if (result === errorObj) { return o.onError(result.e); }\n            o.onNext(result);\n          });\n        },\n        handleError,\n        function () {\n          rightDone = true;\n          (leftDone || rightMap.size === 0) && o.onCompleted();\n        })\n      );\n      return group;\n    }, left);\n  };\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations, and groups the results.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. The first parameter passed to the function is an element of the left sequence. The second parameter passed to the function is an observable sequence with elements from the right sequence that overlap with the left sequence's element.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.groupJoin = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable();\n      var r = new RefCountDisposable(group);\n      var leftMap = new Map(), rightMap = new Map();\n      var leftId = 0, rightId = 0;\n      var handleError = function (e) { return function (v) { v.onError(e); }; };\n\n      function handleError(e) { };\n\n      group.add(left.subscribe(\n        function (value) {\n          var s = new Subject();\n          var id = leftId++;\n          leftMap.set(id, s);\n\n          var result = tryCatch(resultSelector)(value, addRef(s, r));\n          if (result === errorObj) {\n            leftMap.forEach(handleError(result.e));\n            return o.onError(result.e);\n          }\n          o.onNext(result);\n\n          rightMap.forEach(function (v) { s.onNext(v); });\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var duration = tryCatch(leftDurationSelector)(value);\n          if (duration === errorObj) {\n            leftMap.forEach(handleError(duration.e));\n            return o.onError(duration.e);\n          }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.forEach(handleError(e));\n              o.onError(e);\n            },\n            function () {\n              leftMap['delete'](id) && s.onCompleted();\n              group.remove(md);\n            }));\n        },\n        function (e) {\n          leftMap.forEach(handleError(e));\n          o.onError(e);\n        },\n        function () { o.onCompleted(); })\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++;\n          rightMap.set(id, value);\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var duration = tryCatch(rightDurationSelector)(value);\n          if (duration === errorObj) {\n            leftMap.forEach(handleError(duration.e));\n            return o.onError(duration.e);\n          }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.forEach(handleError(e));\n              o.onError(e);\n            },\n            function () {\n              rightMap['delete'](id);\n              group.remove(md);\n            }));\n\n          leftMap.forEach(function (v) { v.onNext(value); });\n        },\n        function (e) {\n          leftMap.forEach(handleError(e));\n          o.onError(e);\n        })\n      );\n\n      return r;\n    }, left);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers.\n   *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n   *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n   *  @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.buffer = function () {\n    return this.window.apply(this, arguments)\n      .flatMap(toArray);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows.\n   *\n   *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n   *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n   *  @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.window = function (windowOpeningsOrClosingSelector, windowClosingSelector) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'function') {\n      return observableWindowWithBoundaries.call(this, windowOpeningsOrClosingSelector);\n    }\n    return typeof windowOpeningsOrClosingSelector === 'function' ?\n      observableWindowWithClosingSelector.call(this, windowOpeningsOrClosingSelector) :\n      observableWindowWithOpenings.call(this, windowOpeningsOrClosingSelector, windowClosingSelector);\n  };\n\n  function observableWindowWithOpenings(windowOpenings, windowClosingSelector) {\n    return windowOpenings.groupJoin(this, windowClosingSelector, observableEmpty, function (_, win) {\n      return win;\n    });\n  }\n\n  function observableWindowWithBoundaries(windowBoundaries) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var win = new Subject(),\n        d = new CompositeDisposable(),\n        r = new RefCountDisposable(d);\n\n      observer.onNext(addRef(win, r));\n\n      d.add(source.subscribe(function (x) {\n        win.onNext(x);\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      isPromise(windowBoundaries) && (windowBoundaries = observableFromPromise(windowBoundaries));\n\n      d.add(windowBoundaries.subscribe(function (w) {\n        win.onCompleted();\n        win = new Subject();\n        observer.onNext(addRef(win, r));\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      return r;\n    }, source);\n  }\n\n  function observableWindowWithClosingSelector(windowClosingSelector) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        r = new RefCountDisposable(d),\n        win = new Subject();\n      observer.onNext(addRef(win, r));\n      d.add(source.subscribe(function (x) {\n          win.onNext(x);\n      }, function (err) {\n          win.onError(err);\n          observer.onError(err);\n      }, function () {\n          win.onCompleted();\n          observer.onCompleted();\n      }));\n\n      function createWindowClose () {\n        var windowClose;\n        try {\n          windowClose = windowClosingSelector();\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n\n        isPromise(windowClose) && (windowClose = observableFromPromise(windowClose));\n\n        var m1 = new SingleAssignmentDisposable();\n        m.setDisposable(m1);\n        m1.setDisposable(windowClose.take(1).subscribe(noop, function (err) {\n          win.onError(err);\n          observer.onError(err);\n        }, function () {\n          win.onCompleted();\n          win = new Subject();\n          observer.onNext(addRef(win, r));\n          createWindowClose();\n        }));\n      }\n\n      createWindowClose();\n      return r;\n    }, source);\n  }\n\n  var PairwiseObservable = (function (__super__) {\n    inherits(PairwiseObservable, __super__);\n    function PairwiseObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    PairwiseObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new PairwiseObserver(o));\n    };\n\n    return PairwiseObservable;\n  }(ObservableBase));\n\n  var PairwiseObserver = (function(__super__) {\n    inherits(PairwiseObserver, __super__);\n    function PairwiseObserver(o) {\n      this._o = o;\n      this._p = null;\n      this._hp = false;\n      __super__.call(this);\n    }\n\n    PairwiseObserver.prototype.next = function (x) {\n      if (this._hp) {\n        this._o.onNext([this._p, x]);\n      } else {\n        this._hp = true;\n      }\n      this._p = x;\n    };\n    PairwiseObserver.prototype.error = function (err) { this._o.onError(err); };\n    PairwiseObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return PairwiseObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns a new observable that triggers on the second and subsequent triggerings of the input observable.\n   * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair.\n   * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs.\n   * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array.\n   */\n  observableProto.pairwise = function () {\n    return new PairwiseObservable(this);\n  };\n\n  /**\n   * Returns two observables which partition the observations of the source by the given function.\n   * The first will trigger observations for those values for which the predicate returns true.\n   * The second will trigger observations for those values where the predicate returns false.\n   * The predicate is executed once for each subscribed observer.\n   * Both also propagate all error observations arising from the source and each completes\n   * when the source completes.\n   * @param {Function} predicate\n   *    The function to determine which output Observable will trigger a particular observation.\n   * @returns {Array}\n   *    An array of observables. The first triggers when the predicate returns true,\n   *    and the second triggers when the predicate returns false.\n  */\n  observableProto.partition = function(predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return [\n      this.filter(predicate, thisArg),\n      this.filter(function (x, i, o) { return !fn(x, i, o); })\n    ];\n  };\n\n  /**\n   *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n   *\n   * @example\n   *  var res = observable.groupBy(function (x) { return x.id; });\n   *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n   *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n   * @param {Function} keySelector A function to extract the key for each element.\n   * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n   * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n   */\n  observableProto.groupBy = function (keySelector, elementSelector) {\n    return this.groupByUntil(keySelector, elementSelector, observableNever);\n  };\n\n    /**\n     *  Groups the elements of an observable sequence according to a specified key selector function.\n     *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n     *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n     *\n     * @example\n     *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n     *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n     *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n     * @param {Function} keySelector A function to extract the key for each element.\n     * @param {Function} durationSelector A function to signal the expiration of a group.\n     * @returns {Observable}\n     *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n     *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n     *\n     */\n    observableProto.groupByUntil = function (keySelector, elementSelector, durationSelector) {\n      var source = this;\n      return new AnonymousObservable(function (o) {\n        var map = new Map(),\n          groupDisposable = new CompositeDisposable(),\n          refCountDisposable = new RefCountDisposable(groupDisposable),\n          handleError = function (e) { return function (item) { item.onError(e); }; };\n\n        groupDisposable.add(\n          source.subscribe(function (x) {\n            var key = tryCatch(keySelector)(x);\n            if (key === errorObj) {\n              map.forEach(handleError(key.e));\n              return o.onError(key.e);\n            }\n\n            var fireNewMapEntry = false, writer = map.get(key);\n            if (writer === undefined) {\n              writer = new Subject();\n              map.set(key, writer);\n              fireNewMapEntry = true;\n            }\n\n            if (fireNewMapEntry) {\n              var group = new GroupedObservable(key, writer, refCountDisposable),\n                durationGroup = new GroupedObservable(key, writer);\n              var duration = tryCatch(durationSelector)(durationGroup);\n              if (duration === errorObj) {\n                map.forEach(handleError(duration.e));\n                return o.onError(duration.e);\n              }\n\n              o.onNext(group);\n\n              var md = new SingleAssignmentDisposable();\n              groupDisposable.add(md);\n\n              md.setDisposable(duration.take(1).subscribe(\n                noop,\n                function (e) {\n                  map.forEach(handleError(e));\n                  o.onError(e);\n                },\n                function () {\n                  if (map['delete'](key)) { writer.onCompleted(); }\n                  groupDisposable.remove(md);\n                }));\n            }\n\n            var element = x;\n            if (isFunction(elementSelector)) {\n              element = tryCatch(elementSelector)(x);\n              if (element === errorObj) {\n                map.forEach(handleError(element.e));\n                return o.onError(element.e);\n              }\n            }\n\n            writer.onNext(element);\n        }, function (e) {\n          map.forEach(handleError(e));\n          o.onError(e);\n        }, function () {\n          map.forEach(function (item) { item.onCompleted(); });\n          o.onCompleted();\n        }));\n\n      return refCountDisposable;\n    }, source);\n  };\n\n  var UnderlyingObservable = (function (__super__) {\n    inherits(UnderlyingObservable, __super__);\n    function UnderlyingObservable(m, u) {\n      this._m = m;\n      this._u = u;\n      __super__.call(this);\n    }\n\n    UnderlyingObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(this._m.getDisposable(), this._u.subscribe(o));\n    };\n\n    return UnderlyingObservable;\n  }(ObservableBase));\n\n  var GroupedObservable = (function (__super__) {\n    inherits(GroupedObservable, __super__);\n    function GroupedObservable(key, underlyingObservable, mergedDisposable) {\n      __super__.call(this);\n      this.key = key;\n      this.underlyingObservable = !mergedDisposable ?\n        underlyingObservable :\n        new UnderlyingObservable(mergedDisposable, underlyingObservable);\n    }\n\n    GroupedObservable.prototype._subscribe = function (o) {\n      return this.underlyingObservable.subscribe(o);\n    };\n\n    return GroupedObservable;\n  }(Observable));\n\n  return Rx;\n}));\n"
  },
  {
    "path": "dist/rx.compat.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (undefined) {\n\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  var Rx = {\n    internals: {},\n    config: {\n      Promise: root.Promise\n    },\n    helpers: { }\n  };\n\n  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    defaultNow = Rx.helpers.defaultNow = (function () { return !!Date.now ? Date.now : function () { return +new Date; }; }()),\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.subscribe !== 'function' && typeof p.then === 'function'; },\n    isFunction = Rx.helpers.isFunction = (function () {\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      };\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n      return isFn;\n    }());\n\n    function cloneArray(arr) {\n      var len = arr.length, a = new Array(len);\n      for(var i = 0; i < len; i++) { a[i] = arr[i]; }\n      return a;\n    }\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  Rx.config.longStackSupport = false;\n  var hasStacks = false, stacks = tryCatch(function () { throw new Error(); })();\n  hasStacks = !!stacks.e && !!stacks.e.stack;\n\n  // All code after this point will be filtered from stack traces reported by RxJS\n  var rStartingLine = captureLine(), rFileName;\n\n  var STACK_JUMP_SEPARATOR = 'From previous event:';\n\n  function makeStackTraceLong(error, observable) {\n    // If possible, transform the error stack trace by removing Node and RxJS\n    // cruft, then concatenating with the stack trace of `observable`.\n    if (hasStacks &&\n        observable.stack &&\n        typeof error === 'object' &&\n        error !== null &&\n        error.stack &&\n        error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n    ) {\n      var stacks = [];\n      for (var o = observable; !!o; o = o.source) {\n        if (o.stack) {\n          stacks.unshift(o.stack);\n        }\n      }\n      stacks.unshift(error.stack);\n\n      var concatedStacks = stacks.join('\\n' + STACK_JUMP_SEPARATOR + '\\n');\n      error.stack = filterStackString(concatedStacks);\n    }\n  }\n\n  function filterStackString(stackString) {\n    var lines = stackString.split('\\n'), desiredLines = [];\n    for (var i = 0, len = lines.length; i < len; i++) {\n      var line = lines[i];\n\n      if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n        desiredLines.push(line);\n      }\n    }\n    return desiredLines.join('\\n');\n  }\n\n  function isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n    if (!fileNameAndLineNumber) {\n      return false;\n    }\n    var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === rFileName &&\n      lineNumber >= rStartingLine &&\n      lineNumber <= rEndingLine;\n  }\n\n  function isNodeFrame(stackLine) {\n    return stackLine.indexOf('(module.js:') !== -1 ||\n      stackLine.indexOf('(node.js:') !== -1;\n  }\n\n  function captureLine() {\n    if (!hasStacks) { return; }\n\n    try {\n      throw new Error();\n    } catch (e) {\n      var lines = e.stack.split('\\n');\n      var firstLine = lines[0].indexOf('@') > 0 ? lines[1] : lines[2];\n      var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n      if (!fileNameAndLineNumber) { return; }\n\n      rFileName = fileNameAndLineNumber[0];\n      return fileNameAndLineNumber[1];\n    }\n  }\n\n  function getFileNameAndLineNumber(stackLine) {\n    // Named functions: 'at functionName (filename:lineNumber:columnNumber)'\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }\n\n    // Anonymous functions: 'at filename:lineNumber:columnNumber'\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }\n\n    // Firefox style: 'function@filename:lineNumber or @filename:lineNumber'\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }\n  }\n\n  // Utilities\n  var toString = Object.prototype.toString;\n  var arrayClass = '[object Array]',\n      funcClass = '[object Function]',\n      stringClass = '[object String]';\n\n  if (!Array.prototype.forEach) {\n    Array.prototype.forEach = function (callback, thisArg) {\n      var T, k;\n\n      if (this == null) {\n        throw new TypeError(' this is null or not defined');\n      }\n\n      var O = Object(this);\n      var len = O.length >>> 0;\n\n      if (typeof callback !== 'function') {\n        throw new TypeError(callback + ' is not a function');\n      }\n\n      if (arguments.length > 1) {\n        T = thisArg;\n      }\n\n      k = 0;\n      while (k < len) {\n        var kValue;\n        if (k in O) {\n          kValue = O[k];\n          callback.call(T, kValue, k, O);\n        }\n        k++;\n      }\n    };\n  }\n\n  var boxedString = Object('a'),\n      splitString = boxedString[0] !== 'a' || !(0 in boxedString);\n  if (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n      var object = Object(this),\n        self = splitString && toString.call(this) === stringClass ?\n          this.split('') :\n          object,\n        length = self.length >>> 0,\n        thisp = arguments[1];\n\n      if (toString.call(fun) !== funcClass) {\n        throw new TypeError(fun + ' is not a function');\n      }\n\n      for (var i = 0; i < length; i++) {\n        if (i in self && !fun.call(thisp, self[i], i, object)) {\n          return false;\n        }\n      }\n      return true;\n    };\n  }\n\n  if (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n      var object = Object(this),\n        self = splitString && toString.call(this) === stringClass ?\n            this.split('') :\n            object,\n        length = self.length >>> 0,\n        result = new Array(length),\n        thisp = arguments[1];\n\n      if (toString.call(fun) !== funcClass) {\n        throw new TypeError(fun + ' is not a function');\n      }\n\n      for (var i = 0; i < length; i++) {\n        if (i in self) {\n          result[i] = fun.call(thisp, self[i], i, object);\n        }\n      }\n      return result;\n    };\n  }\n\n  if (!Array.prototype.filter) {\n    Array.prototype.filter = function (predicate) {\n      var results = [], item, t = new Object(this);\n      for (var i = 0, len = t.length >>> 0; i < len; i++) {\n        item = t[i];\n        if (i in t && predicate.call(arguments[1], item, i, t)) {\n          results.push(item);\n        }\n      }\n      return results;\n    };\n  }\n\n  if (!Array.isArray) {\n    Array.isArray = function (arg) {\n      return toString.call(arg) === arrayClass;\n    };\n  }\n\n  if (!Array.prototype.indexOf) {\n    Array.prototype.indexOf = function indexOf(searchElement) {\n      var t = Object(this);\n      var len = t.length >>> 0;\n      if (len === 0) {\n        return -1;\n      }\n      var n = 0;\n      if (arguments.length > 1) {\n        n = Number(arguments[1]);\n        if (n !== n) {\n          n = 0;\n        } else if (n !== 0 && n !== Infinity && n !== -Infinity) {\n          n = (n > 0 || -1) * Math.floor(Math.abs(n));\n        }\n      }\n      if (n >= len) {\n        return -1;\n      }\n      var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);\n      for (; k < len; k++) {\n        if (k in t && t[k] === searchElement) {\n          return k;\n        }\n      }\n      return -1;\n    };\n  }\n\n  // Fix for Tessel\n  if (!Object.prototype.propertyIsEnumerable) {\n    Object.prototype.propertyIsEnumerable = function (key) {\n      for (var k in this) { if (k === key) { return true; } }\n      return false;\n    };\n  }\n\n  if (!Object.keys) {\n    Object.keys = (function() {\n      'use strict';\n      var hasOwnProperty = Object.prototype.hasOwnProperty,\n      hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString');\n\n      return function(obj) {\n        if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n          throw new TypeError('Object.keys called on non-object');\n        }\n\n        var result = [], prop, i;\n\n        for (prop in obj) {\n          if (hasOwnProperty.call(obj, prop)) {\n            result.push(prop);\n          }\n        }\n\n        if (hasDontEnumBug) {\n          for (i = 0; i < dontEnumsLength; i++) {\n            if (hasOwnProperty.call(obj, dontEnums[i])) {\n              result.push(dontEnums[i]);\n            }\n          }\n        }\n        return result;\n      };\n    }());\n  }\n\n  if (typeof Object.create !== 'function') {\n    // Production steps of ECMA-262, Edition 5, 15.2.3.5\n    // Reference: http://es5.github.io/#x15.2.3.5\n    Object.create = (function() {\n      function Temp() {}\n\n      var hasOwn = Object.prototype.hasOwnProperty;\n\n      return function (O) {\n        if (typeof O !== 'object') {\n          throw new TypeError('Object prototype may only be an Object or null');\n        }\n\n        Temp.prototype = O;\n        var obj = new Temp();\n        Temp.prototype = null;\n\n        if (arguments.length > 1) {\n          // Object.defineProperties does ToObject on its first argument.\n          var Properties = Object(arguments[1]);\n          for (var prop in Properties) {\n            if (hasOwn.call(Properties, prop)) {\n              obj[prop] = Properties[prop];\n            }\n          }\n        }\n\n        // 5. Return obj\n        return obj;\n      };\n    })();\n  }\n\n  root.Element && root.Element.prototype.attachEvent && !root.Element.prototype.addEventListener && (function () {\n    function addMethod(name, fn) {\n      Window.prototype[name] = HTMLDocument.prototype[name] = Element.prototype[name] = fn;\n    }\n\n    addMethod('addEventListener', function (type, listener) {\n      var target = this;\n      var listeners = target._c1_listeners = target._c1_listeners || {};\n      var typeListeners = listeners[type] = listeners[type] || [];\n\n      target.attachEvent('on' + type, typeListeners.event = function (e) {\n        e || (e = root.event);\n\n        var documentElement = target.document &&\n          target.document.documentElement ||\n          target.documentElement ||\n          { scrollLeft: 0, scrollTop: 0 };\n\n        e.currentTarget = target;\n        e.pageX = e.clientX + documentElement.scrollLeft;\n        e.pageY = e.clientY + documentElement.scrollTop;\n\n        e.preventDefault = function () {\n          e.bubbledKeyCode = e.keyCode;\n          if (e.ctrlKey) {\n            try {\n              e.keyCode = 0;\n            } catch (e) { }\n          }\n          e.defaultPrevented = true;\n          e.returnValue = false;\n          e.modified = true;\n          e.returnValue = false;\n        };\n\n        e.stopImmediatePropagation = function () {\n          immediatePropagation = false;\n          e.cancelBubble = true;\n        };\n\n        e.stopPropagation = function () {\n          e.cancelBubble = true;\n        };\n\n        e.relatedTarget = e.fromElement || null;\n        e.target = e.srcElement || target;\n        e.timeStamp = +new Date();\n\n        // Normalize key events\n        switch(e.type) {\n          case 'keypress':\n            var c = ('charCode' in e ? e.charCode : e.keyCode);\n            if (c === 10) {\n              c = 0;\n              e.keyCode = 13;\n            } else if (c === 13 || c === 27) {\n              c = 0;\n            } else if (c === 3) {\n              c = 99;\n            }\n            e.charCode = c;\n            e.keyChar = e.charCode ? String.fromCharCode(e.charCode) : '';\n            break;\n        }\n\n        var copiedEvent = {};\n        for (var prop in e) {\n          copiedEvent[prop] = e[prop];\n        }\n\n        for (var i = 0, typeListenersCache = [].concat(typeListeners), typeListenerCache, immediatePropagation = true; immediatePropagation && (typeListenerCache = typeListenersCache[i]); ++i) {\n          for (var ii = 0, typeListener; typeListener = typeListeners[ii]; ++ii) {\n            if (typeListener === typeListenerCache) { typeListener.call(target, copiedEvent); break; }\n          }\n        }\n      });\n\n      typeListeners.push(listener);\n    });\n\n    addMethod('removeEventListener', function (type, listener) {\n      var target = this;\n      var listeners = target._c1_listeners = target._c1_listeners || {};\n      var typeListeners = listeners[type] = listeners[type] || [];\n\n      for (var i = typeListeners.length - 1, typeListener; typeListener = typeListeners[i]; --i) {\n        if (typeListener === listener) { typeListeners.splice(i, 1); break; }\n      }\n\n      !typeListeners.length &&\n        typeListeners.event &&\n        target.detachEvent('on' + type, typeListeners.event);\n    });\n\n    addMethod('dispatchEvent', function (e) {\n      var target = this;\n      var type = e.type;\n      var listeners = target._c1_listeners = target._c1_listeners || {};\n      var typeListeners = listeners[type] = listeners[type] || [];\n\n      try {\n        return target.fireEvent('on' + type, e);\n      } catch (err) {\n        return typeListeners.event && typeListeners.event(e);\n      }\n    });\n\n    function ready() {\n      if (ready.interval && document.body) {\n        ready.interval = clearInterval(ready.interval);\n\n        document.dispatchEvent(new CustomEvent('DOMContentLoaded'));\n      }\n    }\n\n    ready.interval = setInterval(ready, 1);\n\n    root.addEventListener('load', ready);\n  }());\n\n  (!root.CustomEvent || typeof root.CustomEvent === 'object') && (function() {\n    function CustomEvent (type, params) {\n      var event;\n      params = params || { bubbles: false, cancelable: false, detail: undefined };\n\n      try {\n        if (document.createEvent) {\n          event = document.createEvent('CustomEvent');\n          event.initCustomEvent(type, params.bubbles, params.cancelable, params.detail);\n        } else if (document.createEventObject) {\n          event = document.createEventObject();\n        }\n      } catch (error) {\n        event = document.createEvent('Event');\n        event.initEvent(type, params.bubbles, params.cancelable);\n        event.detail = params.detail;\n      }\n\n      return event;\n    }\n\n    root.CustomEvent && (CustomEvent.prototype = root.CustomEvent.prototype);\n    root.CustomEvent = CustomEvent;\n  }());\n\n  var EmptyError = Rx.EmptyError = function() {\n    this.message = 'Sequence contains no elements.';\n    Error.call(this);\n  };\n  EmptyError.prototype = Object.create(Error.prototype);\n  EmptyError.prototype.name = 'EmptyError';\n\n  var ObjectDisposedError = Rx.ObjectDisposedError = function() {\n    this.message = 'Object has been disposed';\n    Error.call(this);\n  };\n  ObjectDisposedError.prototype = Object.create(Error.prototype);\n  ObjectDisposedError.prototype.name = 'ObjectDisposedError';\n\n  var ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError = function () {\n    this.message = 'Argument out of range';\n    Error.call(this);\n  };\n  ArgumentOutOfRangeError.prototype = Object.create(Error.prototype);\n  ArgumentOutOfRangeError.prototype.name = 'ArgumentOutOfRangeError';\n\n  var NotSupportedError = Rx.NotSupportedError = function (message) {\n    this.message = message || 'This operation is not supported';\n    Error.call(this);\n  };\n  NotSupportedError.prototype = Object.create(Error.prototype);\n  NotSupportedError.prototype.name = 'NotSupportedError';\n\n  var NotImplementedError = Rx.NotImplementedError = function (message) {\n    this.message = message || 'This operation is not implemented';\n    Error.call(this);\n  };\n  NotImplementedError.prototype = Object.create(Error.prototype);\n  NotImplementedError.prototype.name = 'NotImplementedError';\n\n  var notImplemented = Rx.helpers.notImplemented = function () {\n    throw new NotImplementedError();\n  };\n\n  var notSupported = Rx.helpers.notSupported = function () {\n    throw new NotSupportedError();\n  };\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o && o[$iterator$] !== undefined;\n  };\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  };\n\n  Rx.helpers.iterator = $iterator$;\n\n  var bindCallback = Rx.internals.bindCallback = function (func, thisArg, argCount) {\n    if (typeof thisArg === 'undefined') { return func; }\n    switch(argCount) {\n      case 0:\n        return function() {\n          return func.call(thisArg)\n        };\n      case 1:\n        return function(arg) {\n          return func.call(thisArg, arg);\n        };\n      case 2:\n        return function(value, index) {\n          return func.call(thisArg, value, index);\n        };\n      case 3:\n        return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n    }\n\n    return function() {\n      return func.apply(thisArg, arguments);\n    };\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var dontEnums = ['toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'],\n  dontEnumsLength = dontEnums.length;\n\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\nvar objectProto = Object.prototype,\n    hasOwnProperty = objectProto.hasOwnProperty,\n    objToString = objectProto.toString,\n    MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\nvar keys = Object.keys || (function() {\n    var hasOwnProperty = Object.prototype.hasOwnProperty,\n        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),\n        dontEnums = [\n          'toString',\n          'toLocaleString',\n          'valueOf',\n          'hasOwnProperty',\n          'isPrototypeOf',\n          'propertyIsEnumerable',\n          'constructor'\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    return function(obj) {\n      if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n        throw new TypeError('Object.keys called on non-object');\n      }\n\n      var result = [], prop, i;\n\n      for (prop in obj) {\n        if (hasOwnProperty.call(obj, prop)) {\n          result.push(prop);\n        }\n      }\n\n      if (hasDontEnumBug) {\n        for (i = 0; i < dontEnumsLength; i++) {\n          if (hasOwnProperty.call(obj, dontEnums[i])) {\n            result.push(dontEnums[i]);\n          }\n        }\n      }\n      return result;\n    };\n  }());\n\nfunction equalObjects(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objProps = keys(object),\n      objLength = objProps.length,\n      othProps = keys(other),\n      othLength = othProps.length;\n\n  if (objLength !== othLength && !isLoose) {\n    return false;\n  }\n  var index = objLength, key;\n  while (index--) {\n    key = objProps[index];\n    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  var skipCtor = isLoose;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key],\n        result;\n\n    if (!(result === undefined ? equalFunc(objValue, othValue, isLoose, stackA, stackB) : result)) {\n      return false;\n    }\n    skipCtor || (skipCtor = key === 'constructor');\n  }\n  if (!skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    if (objCtor !== othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor === 'function' && objCtor instanceof objCtor &&\n          typeof othCtor === 'function' && othCtor instanceof othCtor)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction equalByTag(object, other, tag) {\n  switch (tag) {\n    case boolTag:\n    case dateTag:\n      return +object === +other;\n\n    case errorTag:\n      return object.name === other.name && object.message === other.message;\n\n    case numberTag:\n      return (object !== +object) ?\n        other !== +other :\n        object === +other;\n\n    case regexpTag:\n    case stringTag:\n      return object === (other + '');\n  }\n  return false;\n}\n\nvar isObject = Rx.internals.isObject = function(value) {\n  var type = typeof value;\n  return !!value && (type === 'object' || type === 'function');\n};\n\nfunction isObjectLike(value) {\n  return !!value && typeof value === 'object';\n}\n\nfunction isLength(value) {\n  return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nvar isHostObject = (function() {\n  try {\n    Object({ 'toString': 0 } + '');\n  } catch(e) {\n    return function() { return false; };\n  }\n  return function(value) {\n    return typeof value.toString !== 'function' && typeof (value + '') === 'string';\n  };\n}());\n\nfunction isTypedArray(value) {\n  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nvar isArray = Array.isArray || function(value) {\n  return isObjectLike(value) && isLength(value.length) && objToString.call(value) === arrayTag;\n};\n\nfunction arraySome (array, predicate) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction equalArrays(array, other, equalFunc, isLoose, stackA, stackB) {\n  var index = -1,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength !== othLength && !(isLoose && othLength > arrLength)) {\n    return false;\n  }\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index],\n        result;\n\n    if (result !== undefined) {\n      if (result) {\n        continue;\n      }\n      return false;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (isLoose) {\n      if (!arraySome(other, function(othValue) {\n            return arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB);\n          })) {\n        return false;\n      }\n    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB))) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction baseIsEqualDeep(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = arrayTag,\n      othTag = arrayTag;\n\n  if (!objIsArr) {\n    objTag = objToString.call(object);\n    if (objTag === argsTag) {\n      objTag = objectTag;\n    } else if (objTag !== objectTag) {\n      objIsArr = isTypedArray(object);\n    }\n  }\n  if (!othIsArr) {\n    othTag = objToString.call(other);\n    if (othTag === argsTag) {\n      othTag = objectTag;\n    }\n  }\n  var objIsObj = objTag === objectTag && !isHostObject(object),\n      othIsObj = othTag === objectTag && !isHostObject(other),\n      isSameTag = objTag === othTag;\n\n  if (isSameTag && !(objIsArr || objIsObj)) {\n    return equalByTag(object, other, objTag);\n  }\n  if (!isLoose) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, isLoose, stackA, stackB);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  // For more information on detecting circular references see https://es5.github.io/#JO.\n  stackA || (stackA = []);\n  stackB || (stackB = []);\n\n  var length = stackA.length;\n  while (length--) {\n    if (stackA[length] === object) {\n      return stackB[length] === other;\n    }\n  }\n  // Add `object` and `other` to the stack of traversed objects.\n  stackA.push(object);\n  stackB.push(other);\n\n  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, isLoose, stackA, stackB);\n\n  stackA.pop();\n  stackB.pop();\n\n  return result;\n}\n\nfunction baseIsEqual(value, other, isLoose, stackA, stackB) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, baseIsEqual, isLoose, stackA, stackB);\n}\n\nvar isEqual = Rx.internals.isEqual = function (value, other) {\n  return baseIsEqual(value, other);\n};\n\n  var hasProp = {}.hasOwnProperty,\n      slice = Array.prototype.slice;\n\n  var inherits = Rx.internals.inherits = function (child, parent) {\n    function __() { this.constructor = child; }\n    __.prototype = parent.prototype;\n    child.prototype = new __();\n  };\n\n  var addProperties = Rx.internals.addProperties = function (obj) {\n    for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n      var source = sources[idx];\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n  };\n\n  // Rx Utils\n  var addRef = Rx.internals.addRef = function (xs, r) {\n    return new AnonymousObservable(function (observer) {\n      return new BinaryDisposable(r.getDisposable(), xs.subscribe(observer));\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n\n  /**\n   * Represents a group of disposable resources that are disposed together.\n   * @constructor\n   */\n  var CompositeDisposable = Rx.CompositeDisposable = function () {\n    var args = [], i, len;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      len = arguments.length;\n      args = new Array(len);\n      for(i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    this.disposables = args;\n    this.isDisposed = false;\n    this.length = args.length;\n  };\n\n  var CompositeDisposablePrototype = CompositeDisposable.prototype;\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Mixed} item Disposable to add.\n   */\n  CompositeDisposablePrototype.add = function (item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n      this.length++;\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Mixed} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n  CompositeDisposablePrototype.remove = function (item) {\n    var shouldDispose = false;\n    if (!this.isDisposed) {\n      var idx = this.disposables.indexOf(item);\n      if (idx !== -1) {\n        shouldDispose = true;\n        this.disposables.splice(idx, 1);\n        this.length--;\n        item.dispose();\n      }\n    }\n    return shouldDispose;\n  };\n\n  /**\n   *  Disposes all disposables in the group and removes them from the group.\n   */\n  CompositeDisposablePrototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var len = this.disposables.length, currentDisposables = new Array(len);\n      for(var i = 0; i < len; i++) { currentDisposables[i] = this.disposables[i]; }\n      this.disposables = [];\n      this.length = 0;\n\n      for (i = 0; i < len; i++) {\n        currentDisposables[i].dispose();\n      }\n    }\n  };\n\n  /**\n   * Provides a set of static methods for creating Disposables.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   */\n  var Disposable = Rx.Disposable = function (action) {\n    this.isDisposed = false;\n    this.action = action || noop;\n  };\n\n  /** Performs the task of cleaning up resources. */\n  Disposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.action();\n      this.isDisposed = true;\n    }\n  };\n\n  /**\n   * Creates a disposable object that invokes the specified action when disposed.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   * @return {Disposable} The disposable object that runs the given action upon disposal.\n   */\n  var disposableCreate = Disposable.create = function (action) { return new Disposable(action); };\n\n  /**\n   * Gets the disposable that does nothing when disposed.\n   */\n  var disposableEmpty = Disposable.empty = { dispose: noop };\n\n  /**\n   * Validates whether the given object is a disposable\n   * @param {Object} Object to test whether it has a dispose method\n   * @returns {Boolean} true if a disposable object, else false.\n   */\n  var isDisposable = Disposable.isDisposable = function (d) {\n    return d && isFunction(d.dispose);\n  };\n\n  var checkDisposed = Disposable.checkDisposed = function (disposable) {\n    if (disposable.isDisposed) { throw new ObjectDisposedError(); }\n  };\n\n  var disposableFixup = Disposable._fixup = function (result) {\n    return isDisposable(result) ? result : disposableEmpty;\n  };\n\n  // Single assignment\n  var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SingleAssignmentDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SingleAssignmentDisposable.prototype.setDisposable = function (value) {\n    if (this.current) { throw new Error('Disposable has already been assigned'); }\n    var shouldDispose = this.isDisposed;\n    !shouldDispose && (this.current = value);\n    shouldDispose && value && value.dispose();\n  };\n  SingleAssignmentDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n      old && old.dispose();\n    }\n  };\n\n  // Multiple assignment disposable\n  var SerialDisposable = Rx.SerialDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SerialDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SerialDisposable.prototype.setDisposable = function (value) {\n    var shouldDispose = this.isDisposed;\n    if (!shouldDispose) {\n      var old = this.current;\n      this.current = value;\n    }\n    old && old.dispose();\n    shouldDispose && value && value.dispose();\n  };\n  SerialDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n    }\n    old && old.dispose();\n  };\n\n  var BinaryDisposable = Rx.BinaryDisposable = function (first, second) {\n    this._first = first;\n    this._second = second;\n    this.isDisposed = false;\n  };\n\n  BinaryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old1 = this._first;\n      this._first = null;\n      old1 && old1.dispose();\n      var old2 = this._second;\n      this._second = null;\n      old2 && old2.dispose();\n    }\n  };\n\n  var NAryDisposable = Rx.NAryDisposable = function (disposables) {\n    this._disposables = disposables;\n    this.isDisposed = false;\n  };\n\n  NAryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      for (var i = 0, len = this._disposables.length; i < len; i++) {\n        this._disposables[i].dispose();\n      }\n      this._disposables.length = 0;\n    }\n  };\n\n  /**\n   * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n   */\n  var RefCountDisposable = Rx.RefCountDisposable = (function () {\n\n    function InnerDisposable(disposable) {\n      this.disposable = disposable;\n      this.disposable.count++;\n      this.isInnerDisposed = false;\n    }\n\n    InnerDisposable.prototype.dispose = function () {\n      if (!this.disposable.isDisposed && !this.isInnerDisposed) {\n        this.isInnerDisposed = true;\n        this.disposable.count--;\n        if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {\n          this.disposable.isDisposed = true;\n          this.disposable.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Initializes a new instance of the RefCountDisposable with the specified disposable.\n     * @constructor\n     * @param {Disposable} disposable Underlying disposable.\n      */\n    function RefCountDisposable(disposable) {\n      this.underlyingDisposable = disposable;\n      this.isDisposed = false;\n      this.isPrimaryDisposed = false;\n      this.count = 0;\n    }\n\n    /**\n     * Disposes the underlying disposable only when all dependent disposables have been disposed\n     */\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed && !this.isPrimaryDisposed) {\n        this.isPrimaryDisposed = true;\n        if (this.count === 0) {\n          this.isDisposed = true;\n          this.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n     * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n     */\n    RefCountDisposable.prototype.getDisposable = function () {\n      return this.isDisposed ? disposableEmpty : new InnerDisposable(this);\n    };\n\n    return RefCountDisposable;\n  })();\n\n  function ScheduledDisposable(scheduler, disposable) {\n    this.scheduler = scheduler;\n    this.disposable = disposable;\n    this.isDisposed = false;\n  }\n\n  function scheduleItem(s, self) {\n    if (!self.isDisposed) {\n      self.isDisposed = true;\n      self.disposable.dispose();\n    }\n  }\n\n  ScheduledDisposable.prototype.dispose = function () {\n    this.scheduler.schedule(this, scheduleItem);\n  };\n\n  var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) {\n    this.scheduler = scheduler;\n    this.state = state;\n    this.action = action;\n    this.dueTime = dueTime;\n    this.comparer = comparer || defaultSubComparer;\n    this.disposable = new SingleAssignmentDisposable();\n  };\n\n  ScheduledItem.prototype.invoke = function () {\n    this.disposable.setDisposable(this.invokeCore());\n  };\n\n  ScheduledItem.prototype.compareTo = function (other) {\n    return this.comparer(this.dueTime, other.dueTime);\n  };\n\n  ScheduledItem.prototype.isCancelled = function () {\n    return this.disposable.isDisposed;\n  };\n\n  ScheduledItem.prototype.invokeCore = function () {\n    return disposableFixup(this.action(this.scheduler, this.state));\n  };\n\n  /** Provides a set of static properties to access commonly used schedulers. */\n  var Scheduler = Rx.Scheduler = (function () {\n\n    function Scheduler() { }\n\n    /** Determines whether the given object is a scheduler */\n    Scheduler.isScheduler = function (s) {\n      return s instanceof Scheduler;\n    };\n\n    var schedulerProto = Scheduler.prototype;\n\n    /**\n   * Schedules an action to be executed.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.schedule = function (state, action) {\n      throw new NotImplementedError();\n    };\n\n  /**\n   * Schedules an action to be executed after dueTime.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @param {Number} dueTime Relative time after which to execute the action.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime;\n      dt instanceof Date && (dt = dt - this.now());\n      dt = Scheduler.normalize(dt);\n\n      if (dt === 0) { return this.schedule(state, action); }\n\n      return this._scheduleFuture(state, dt, action);\n    };\n\n    schedulerProto._scheduleFuture = function (state, dueTime, action) {\n      throw new NotImplementedError();\n    };\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.now = defaultNow;\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.prototype.now = defaultNow;\n\n    /**\n     * Normalizes the specified TimeSpan value to a positive value.\n     * @param {Number} timeSpan The time span value to normalize.\n     * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n     */\n    Scheduler.normalize = function (timeSpan) {\n      timeSpan < 0 && (timeSpan = 0);\n      return timeSpan;\n    };\n\n    return Scheduler;\n  }());\n\n  var normalizeTime = Scheduler.normalize, isScheduler = Scheduler.isScheduler;\n\n  (function (schedulerProto) {\n\n    function invokeRecImmediate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.schedule(state2, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    function invokeRecDate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2, dueTime1) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.scheduleFuture(state2, dueTime1, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursive = function (state, action) {\n      return this.schedule([state, action], invokeRecImmediate);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative or absolute due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number | Date} dueTime Relative or absolute time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveFuture = function (state, dueTime, action) {\n      return this.scheduleFuture([state, action], dueTime, invokeRecDate);\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    schedulerProto.schedulePeriodic = function(state, period, action) {\n      if (typeof root.setInterval === 'undefined') { throw new NotSupportedError(); }\n      period = normalizeTime(period);\n      var s = state, id = root.setInterval(function () { s = action(s); }, period);\n      return disposableCreate(function () { root.clearInterval(id); });\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n    /**\n     * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n     * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n     * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n     */\n    schedulerProto.catchError = schedulerProto['catch'] = function (handler) {\n      return new CatchScheduler(this, handler);\n    };\n  }(Scheduler.prototype));\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function createTick(self) {\n      return function tick(command, recurse) {\n        recurse(0, self._period);\n        var state = tryCatch(self._action)(self._state);\n        if (state === errorObj) {\n          self._cancel.dispose();\n          thrower(state.e);\n        }\n        self._state = state;\n      };\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveFuture(0, this._period, createTick(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  /** Gets a scheduler that schedules work immediately on the current thread. */\n   var ImmediateScheduler = (function (__super__) {\n    inherits(ImmediateScheduler, __super__);\n    function ImmediateScheduler() {\n      __super__.call(this);\n    }\n\n    ImmediateScheduler.prototype.schedule = function (state, action) {\n      return disposableFixup(action(this, state));\n    };\n\n    return ImmediateScheduler;\n  }(Scheduler));\n\n  var immediateScheduler = Scheduler.immediate = new ImmediateScheduler();\n\n  /**\n   * Gets a scheduler that schedules work as soon as possible on the current thread.\n   */\n  var CurrentThreadScheduler = (function (__super__) {\n    var queue;\n\n    function runTrampoline () {\n      while (queue.length > 0) {\n        var item = queue.dequeue();\n        !item.isCancelled() && item.invoke();\n      }\n    }\n\n    inherits(CurrentThreadScheduler, __super__);\n    function CurrentThreadScheduler() {\n      __super__.call(this);\n    }\n\n    CurrentThreadScheduler.prototype.schedule = function (state, action) {\n      var si = new ScheduledItem(this, state, action, this.now());\n\n      if (!queue) {\n        queue = new PriorityQueue(4);\n        queue.enqueue(si);\n\n        var result = tryCatch(runTrampoline)();\n        queue = null;\n        if (result === errorObj) { thrower(result.e); }\n      } else {\n        queue.enqueue(si);\n      }\n      return si.disposable;\n    };\n\n    CurrentThreadScheduler.prototype.scheduleRequired = function () { return !queue; };\n\n    return CurrentThreadScheduler;\n  }(Scheduler));\n\n  var currentThreadScheduler = Scheduler.currentThread = new CurrentThreadScheduler();\n\n  var scheduleMethod, clearMethod;\n\n  var localTimer = (function () {\n    var localSetTimeout, localClearTimeout = noop;\n    if (!!root.setTimeout) {\n      localSetTimeout = root.setTimeout;\n      localClearTimeout = root.clearTimeout;\n    } else if (!!root.WScript) {\n      localSetTimeout = function (fn, time) {\n        root.WScript.Sleep(time);\n        fn();\n      };\n    } else {\n      throw new NotSupportedError();\n    }\n\n    return {\n      setTimeout: localSetTimeout,\n      clearTimeout: localClearTimeout\n    };\n  }());\n  var localSetTimeout = localTimer.setTimeout,\n    localClearTimeout = localTimer.clearTimeout;\n\n  (function () {\n\n    var nextHandle = 1, tasksByHandle = {}, currentlyRunning = false;\n\n    clearMethod = function (handle) {\n      delete tasksByHandle[handle];\n    };\n\n    function runTask(handle) {\n      if (currentlyRunning) {\n        localSetTimeout(function () { runTask(handle); }, 0);\n      } else {\n        var task = tasksByHandle[handle];\n        if (task) {\n          currentlyRunning = true;\n          var result = tryCatch(task)();\n          clearMethod(handle);\n          currentlyRunning = false;\n          if (result === errorObj) { thrower(result.e); }\n        }\n      }\n    }\n\n    var reNative = new RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&\n      !reNative.test(setImmediate) && setImmediate;\n\n    function postMessageSupported () {\n      // Ensure not in a worker\n      if (!root.postMessage || root.importScripts) { return false; }\n      var isAsync = false, oldHandler = root.onmessage;\n      // Test for async\n      root.onmessage = function () { isAsync = true; };\n      root.postMessage('', '*');\n      root.onmessage = oldHandler;\n\n      return isAsync;\n    }\n\n    // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n    if (isFunction(setImmediate)) {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        setImmediate(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        process.nextTick(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (postMessageSupported()) {\n      var MSG_PREFIX = 'ms.rx.schedule' + Math.random();\n\n      var onGlobalPostMessage = function (event) {\n        // Only if we're a match to avoid any other global events\n        if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n          runTask(event.data.substring(MSG_PREFIX.length));\n        }\n      };\n\n      root.addEventListener('message', onGlobalPostMessage, false);\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        root.postMessage(MSG_PREFIX + id, '*');\n        return id;\n      };\n    } else if (!!root.MessageChannel) {\n      var channel = new root.MessageChannel();\n\n      channel.port1.onmessage = function (e) { runTask(e.data); };\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        channel.port2.postMessage(id);\n        return id;\n      };\n    } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {\n\n      scheduleMethod = function (action) {\n        var scriptElement = root.document.createElement('script');\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n\n        scriptElement.onreadystatechange = function () {\n          runTask(id);\n          scriptElement.onreadystatechange = null;\n          scriptElement.parentNode.removeChild(scriptElement);\n          scriptElement = null;\n        };\n        root.document.documentElement.appendChild(scriptElement);\n        return id;\n      };\n\n    } else {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        localSetTimeout(function () {\n          runTask(id);\n        }, 0);\n\n        return id;\n      };\n    }\n  }());\n\n  /**\n   * Gets a scheduler that schedules work via a timed callback based upon platform.\n   */\n   var DefaultScheduler = (function (__super__) {\n     inherits(DefaultScheduler, __super__);\n     function DefaultScheduler() {\n       __super__.call(this);\n     }\n\n     function scheduleAction(disposable, action, scheduler, state) {\n       return function schedule() {\n         disposable.setDisposable(Disposable._fixup(action(scheduler, state)));\n       };\n     }\n\n     function ClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     ClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         clearMethod(this._id);\n       }\n     };\n\n     function LocalClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     LocalClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         localClearTimeout(this._id);\n       }\n     };\n\n    DefaultScheduler.prototype.schedule = function (state, action) {\n      var disposable = new SingleAssignmentDisposable(),\n          id = scheduleMethod(scheduleAction(disposable, action, this, state));\n      return new BinaryDisposable(disposable, new ClearDisposable(id));\n    };\n\n    DefaultScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      if (dueTime === 0) { return this.schedule(state, action); }\n      var disposable = new SingleAssignmentDisposable(),\n          id = localSetTimeout(scheduleAction(disposable, action, this, state), dueTime);\n      return new BinaryDisposable(disposable, new LocalClearDisposable(id));\n    };\n\n    function scheduleLongRunning(state, action, disposable) {\n      return function () { action(state, disposable); };\n    }\n\n    DefaultScheduler.prototype.scheduleLongRunning = function (state, action) {\n      var disposable = disposableCreate(noop);\n      scheduleMethod(scheduleLongRunning(state, action, disposable));\n      return disposable;\n    };\n\n    return DefaultScheduler;\n  }(Scheduler));\n\n  var defaultScheduler = Scheduler['default'] = Scheduler.async = new DefaultScheduler();\n\n  var CatchScheduler = (function (__super__) {\n    inherits(CatchScheduler, __super__);\n\n    function CatchScheduler(scheduler, handler) {\n      this._scheduler = scheduler;\n      this._handler = handler;\n      this._recursiveOriginal = null;\n      this._recursiveWrapper = null;\n      __super__.call(this);\n    }\n\n    CatchScheduler.prototype.schedule = function (state, action) {\n      return this._scheduler.schedule(state, this._wrap(action));\n    };\n\n    CatchScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      return this._scheduler.schedule(state, dueTime, this._wrap(action));\n    };\n\n    CatchScheduler.prototype.now = function () { return this._scheduler.now(); };\n\n    CatchScheduler.prototype._clone = function (scheduler) {\n        return new CatchScheduler(scheduler, this._handler);\n    };\n\n    CatchScheduler.prototype._wrap = function (action) {\n      var parent = this;\n      return function (self, state) {\n        var res = tryCatch(action)(parent._getRecursiveWrapper(self), state);\n        if (res === errorObj) {\n          if (!parent._handler(res.e)) { thrower(res.e); }\n          return disposableEmpty;\n        }\n        return disposableFixup(res);\n      };\n    };\n\n    CatchScheduler.prototype._getRecursiveWrapper = function (scheduler) {\n      if (this._recursiveOriginal !== scheduler) {\n        this._recursiveOriginal = scheduler;\n        var wrapper = this._clone(scheduler);\n        wrapper._recursiveOriginal = scheduler;\n        wrapper._recursiveWrapper = wrapper;\n        this._recursiveWrapper = wrapper;\n      }\n      return this._recursiveWrapper;\n    };\n\n    CatchScheduler.prototype.schedulePeriodic = function (state, period, action) {\n      var self = this, failed = false, d = new SingleAssignmentDisposable();\n\n      d.setDisposable(this._scheduler.schedulePeriodic(state, period, function (state1) {\n        if (failed) { return null; }\n        var res = tryCatch(action)(state1);\n        if (res === errorObj) {\n          failed = true;\n          if (!self._handler(res.e)) { thrower(res.e); }\n          d.dispose();\n          return null;\n        }\n        return res;\n      }));\n\n      return d;\n    };\n\n    return CatchScheduler;\n  }(Scheduler));\n\n  function IndexedItem(id, value) {\n    this.id = id;\n    this.value = value;\n  }\n\n  IndexedItem.prototype.compareTo = function (other) {\n    var c = this.value.compareTo(other.value);\n    c === 0 && (c = this.id - other.id);\n    return c;\n  };\n\n  var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) {\n    this.items = new Array(capacity);\n    this.length = 0;\n  };\n\n  var priorityProto = PriorityQueue.prototype;\n  priorityProto.isHigherPriority = function (left, right) {\n    return this.items[left].compareTo(this.items[right]) < 0;\n  };\n\n  priorityProto.percolate = function (index) {\n    if (index >= this.length || index < 0) { return; }\n    var parent = index - 1 >> 1;\n    if (parent < 0 || parent === index) { return; }\n    if (this.isHigherPriority(index, parent)) {\n      var temp = this.items[index];\n      this.items[index] = this.items[parent];\n      this.items[parent] = temp;\n      this.percolate(parent);\n    }\n  };\n\n  priorityProto.heapify = function (index) {\n    +index || (index = 0);\n    if (index >= this.length || index < 0) { return; }\n    var left = 2 * index + 1,\n        right = 2 * index + 2,\n        first = index;\n    if (left < this.length && this.isHigherPriority(left, first)) {\n      first = left;\n    }\n    if (right < this.length && this.isHigherPriority(right, first)) {\n      first = right;\n    }\n    if (first !== index) {\n      var temp = this.items[index];\n      this.items[index] = this.items[first];\n      this.items[first] = temp;\n      this.heapify(first);\n    }\n  };\n\n  priorityProto.peek = function () { return this.items[0].value; };\n\n  priorityProto.removeAt = function (index) {\n    this.items[index] = this.items[--this.length];\n    this.items[this.length] = undefined;\n    this.heapify();\n  };\n\n  priorityProto.dequeue = function () {\n    var result = this.peek();\n    this.removeAt(0);\n    return result;\n  };\n\n  priorityProto.enqueue = function (item) {\n    var index = this.length++;\n    this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n    this.percolate(index);\n  };\n\n  priorityProto.remove = function (item) {\n    for (var i = 0; i < this.length; i++) {\n      if (this.items[i].value === item) {\n        this.removeAt(i);\n        return true;\n      }\n    }\n    return false;\n  };\n  PriorityQueue.count = 0;\n\n  /**\n   *  Represents a notification to an observer.\n   */\n  var Notification = Rx.Notification = (function () {\n    function Notification() {\n\n    }\n\n    Notification.prototype._accept = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    Notification.prototype._acceptObserver = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    /**\n     * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n     * @param {Function | Observer} observerOrOnNext Function to invoke for an OnNext notification or Observer to invoke the notification on..\n     * @param {Function} onError Function to invoke for an OnError notification.\n     * @param {Function} onCompleted Function to invoke for an OnCompleted notification.\n     * @returns {Any} Result produced by the observation.\n     */\n    Notification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n      return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n        this._acceptObserver(observerOrOnNext) :\n        this._accept(observerOrOnNext, onError, onCompleted);\n    };\n\n    /**\n     * Returns an observable sequence with a single notification.\n     *\n     * @memberOf Notifications\n     * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n     * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n     */\n    Notification.prototype.toObservable = function (scheduler) {\n      var self = this;\n      isScheduler(scheduler) || (scheduler = immediateScheduler);\n      return new AnonymousObservable(function (o) {\n        return scheduler.schedule(self, function (_, notification) {\n          notification._acceptObserver(o);\n          notification.kind === 'N' && o.onCompleted();\n        });\n      });\n    };\n\n    return Notification;\n  })();\n\n  var OnNextNotification = (function (__super__) {\n    inherits(OnNextNotification, __super__);\n    function OnNextNotification(value) {\n      this.value = value;\n      this.kind = 'N';\n    }\n\n    OnNextNotification.prototype._accept = function (onNext) {\n      return onNext(this.value);\n    };\n\n    OnNextNotification.prototype._acceptObserver = function (o) {\n      return o.onNext(this.value);\n    };\n\n    OnNextNotification.prototype.toString = function () {\n      return 'OnNext(' + this.value + ')';\n    };\n\n    return OnNextNotification;\n  }(Notification));\n\n  var OnErrorNotification = (function (__super__) {\n    inherits(OnErrorNotification, __super__);\n    function OnErrorNotification(error) {\n      this.error = error;\n      this.kind = 'E';\n    }\n\n    OnErrorNotification.prototype._accept = function (onNext, onError) {\n      return onError(this.error);\n    };\n\n    OnErrorNotification.prototype._acceptObserver = function (o) {\n      return o.onError(this.error);\n    };\n\n    OnErrorNotification.prototype.toString = function () {\n      return 'OnError(' + this.error + ')';\n    };\n\n    return OnErrorNotification;\n  }(Notification));\n\n  var OnCompletedNotification = (function (__super__) {\n    inherits(OnCompletedNotification, __super__);\n    function OnCompletedNotification() {\n      this.kind = 'C';\n    }\n\n    OnCompletedNotification.prototype._accept = function (onNext, onError, onCompleted) {\n      return onCompleted();\n    };\n\n    OnCompletedNotification.prototype._acceptObserver = function (o) {\n      return o.onCompleted();\n    };\n\n    OnCompletedNotification.prototype.toString = function () {\n      return 'OnCompleted()';\n    };\n\n    return OnCompletedNotification;\n  }(Notification));\n\n  /**\n   * Creates an object that represents an OnNext notification to an observer.\n   * @param {Any} value The value contained in the notification.\n   * @returns {Notification} The OnNext notification containing the value.\n   */\n  var notificationCreateOnNext = Notification.createOnNext = function (value) {\n    return new OnNextNotification(value);\n  };\n\n  /**\n   * Creates an object that represents an OnError notification to an observer.\n   * @param {Any} error The exception contained in the notification.\n   * @returns {Notification} The OnError notification containing the exception.\n   */\n  var notificationCreateOnError = Notification.createOnError = function (error) {\n    return new OnErrorNotification(error);\n  };\n\n  /**\n   * Creates an object that represents an OnCompleted notification to an observer.\n   * @returns {Notification} The OnCompleted notification.\n   */\n  var notificationCreateOnCompleted = Notification.createOnCompleted = function () {\n    return new OnCompletedNotification();\n  };\n\n  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates a notification callback from an observer.\n   * @returns The action that forwards its input notification to the underlying observer.\n   */\n  Observer.prototype.toNotifier = function () {\n    var observer = this;\n    return function (n) { return n.accept(observer); };\n  };\n\n  /**\n   *  Hides the identity of an observer.\n   * @returns An observer that hides the identity of the specified observer.\n   */\n  Observer.prototype.asObserver = function () {\n    var self = this;\n    return new AnonymousObserver(\n      function (x) { self.onNext(x); },\n      function (err) { self.onError(err); },\n      function () { self.onCompleted(); });\n  };\n\n  /**\n   *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n   *  If a violation is detected, an Error is thrown from the offending observer method call.\n   * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n   */\n  Observer.prototype.checked = function () { return new CheckedObserver(this); };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n\n  /**\n   *  Creates an observer from a notification callback.\n   * @param {Function} handler Action that handles a notification.\n   * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n   */\n  Observer.fromNotifier = function (handler, thisArg) {\n    var cb = bindCallback(handler, thisArg, 1);\n    return new AnonymousObserver(function (x) {\n      return cb(notificationCreateOnNext(x));\n    }, function (e) {\n      return cb(notificationCreateOnError(e));\n    }, function () {\n      return cb(notificationCreateOnCompleted());\n    });\n  };\n\n  /**\n   * Schedules the invocation of observer methods on the given scheduler.\n   * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n   * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n   */\n  Observer.prototype.notifyOn = function (scheduler) {\n    return new ObserveOnObserver(scheduler, this);\n  };\n\n  Observer.prototype.makeSafe = function(disposable) {\n    return new AnonymousSafeObserver(this._onNext, this._onError, this._onCompleted, disposable);\n  };\n\n  /**\n   * Abstract base class for implementations of the Observer class.\n   * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n   */\n  var AbstractObserver = Rx.internals.AbstractObserver = (function (__super__) {\n    inherits(AbstractObserver, __super__);\n\n    /**\n     * Creates a new observer in a non-stopped state.\n     */\n    function AbstractObserver() {\n      this.isStopped = false;\n    }\n\n    // Must be implemented by other observers\n    AbstractObserver.prototype.next = notImplemented;\n    AbstractObserver.prototype.error = notImplemented;\n    AbstractObserver.prototype.completed = notImplemented;\n\n    /**\n     * Notifies the observer of a new element in the sequence.\n     * @param {Any} value Next element in the sequence.\n     */\n    AbstractObserver.prototype.onNext = function (value) {\n      !this.isStopped && this.next(value);\n    };\n\n    /**\n     * Notifies the observer that an exception has occurred.\n     * @param {Any} error The error that has occurred.\n     */\n    AbstractObserver.prototype.onError = function (error) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(error);\n      }\n    };\n\n    /**\n     * Notifies the observer of the end of the sequence.\n     */\n    AbstractObserver.prototype.onCompleted = function () {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.completed();\n      }\n    };\n\n    /**\n     * Disposes the observer, causing it to transition to the stopped state.\n     */\n    AbstractObserver.prototype.dispose = function () { this.isStopped = true; };\n\n    AbstractObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return AbstractObserver;\n  }(Observer));\n\n  /**\n   * Class to create an Observer instance from delegate-based implementations of the on* methods.\n   */\n  var AnonymousObserver = Rx.AnonymousObserver = (function (__super__) {\n    inherits(AnonymousObserver, __super__);\n\n    /**\n     * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n     * @param {Any} onNext Observer's OnNext action implementation.\n     * @param {Any} onError Observer's OnError action implementation.\n     * @param {Any} onCompleted Observer's OnCompleted action implementation.\n     */\n    function AnonymousObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    /**\n     * Calls the onNext action.\n     * @param {Any} value Next element in the sequence.\n     */\n    AnonymousObserver.prototype.next = function (value) {\n      this._onNext(value);\n    };\n\n    /**\n     * Calls the onError action.\n     * @param {Any} error The error that has occurred.\n     */\n    AnonymousObserver.prototype.error = function (error) {\n      this._onError(error);\n    };\n\n    /**\n     *  Calls the onCompleted action.\n     */\n    AnonymousObserver.prototype.completed = function () {\n      this._onCompleted();\n    };\n\n    return AnonymousObserver;\n  }(AbstractObserver));\n\n  var CheckedObserver = (function (__super__) {\n    inherits(CheckedObserver, __super__);\n\n    function CheckedObserver(observer) {\n      __super__.call(this);\n      this._observer = observer;\n      this._state = 0; // 0 - idle, 1 - busy, 2 - done\n    }\n\n    var CheckedObserverPrototype = CheckedObserver.prototype;\n\n    CheckedObserverPrototype.onNext = function (value) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onNext).call(this._observer, value);\n      this._state = 0;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onError = function (err) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onError).call(this._observer, err);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onCompleted = function () {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onCompleted).call(this._observer);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.checkAccess = function () {\n      if (this._state === 1) { throw new Error('Re-entrancy detected'); }\n      if (this._state === 2) { throw new Error('Observer completed'); }\n      if (this._state === 0) { this._state = 1; }\n    };\n\n    return CheckedObserver;\n  }(Observer));\n\n  var ScheduledObserver = Rx.internals.ScheduledObserver = (function (__super__) {\n    inherits(ScheduledObserver, __super__);\n\n    function ScheduledObserver(scheduler, observer) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.observer = observer;\n      this.isAcquired = false;\n      this.hasFaulted = false;\n      this.queue = [];\n      this.disposable = new SerialDisposable();\n    }\n\n    function enqueueNext(observer, x) { return function () { observer.onNext(x); }; }\n    function enqueueError(observer, e) { return function () { observer.onError(e); }; }\n    function enqueueCompleted(observer) { return function () { observer.onCompleted(); }; }\n\n    ScheduledObserver.prototype.next = function (x) {\n      this.queue.push(enqueueNext(this.observer, x));\n    };\n\n    ScheduledObserver.prototype.error = function (e) {\n      this.queue.push(enqueueError(this.observer, e));\n    };\n\n    ScheduledObserver.prototype.completed = function () {\n      this.queue.push(enqueueCompleted(this.observer));\n    };\n\n\n    function scheduleMethod(state, recurse) {\n      var work;\n      if (state.queue.length > 0) {\n        work = state.queue.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var res = tryCatch(work)();\n      if (res === errorObj) {\n        state.queue = [];\n        state.hasFaulted = true;\n        return thrower(res.e);\n      }\n      recurse(state);\n    }\n\n    ScheduledObserver.prototype.ensureActive = function () {\n      var isOwner = false;\n      if (!this.hasFaulted && this.queue.length > 0) {\n        isOwner = !this.isAcquired;\n        this.isAcquired = true;\n      }\n      isOwner &&\n        this.disposable.setDisposable(this.scheduler.scheduleRecursive(this, scheduleMethod));\n    };\n\n    ScheduledObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.disposable.dispose();\n    };\n\n    return ScheduledObserver;\n  }(AbstractObserver));\n\n  var ObserveOnObserver = (function (__super__) {\n    inherits(ObserveOnObserver, __super__);\n\n    function ObserveOnObserver(scheduler, observer, cancel) {\n      __super__.call(this, scheduler, observer);\n      this._cancel = cancel;\n    }\n\n    ObserveOnObserver.prototype.next = function (value) {\n      __super__.prototype.next.call(this, value);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.error = function (e) {\n      __super__.prototype.error.call(this, e);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.completed = function () {\n      __super__.prototype.completed.call(this);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this._cancel && this._cancel.dispose();\n      this._cancel = null;\n    };\n\n    return ObserveOnObserver;\n  })(ScheduledObserver);\n\n  var observableProto;\n\n  /**\n   * Represents a push-style collection.\n   */\n  var Observable = Rx.Observable = (function () {\n\n    function makeSubscribe(self, subscribe) {\n      return function (o) {\n        var oldOnError = o.onError;\n        o.onError = function (e) {\n          makeStackTraceLong(e, self);\n          oldOnError.call(o, e);\n        };\n\n        return subscribe.call(self, o);\n      };\n    }\n\n    function Observable() {\n      if (Rx.config.longStackSupport && hasStacks) {\n        var oldSubscribe = this._subscribe;\n        var e = tryCatch(thrower)(new Error()).e;\n        this.stack = e.stack.substring(e.stack.indexOf('\\n') + 1);\n        this._subscribe = makeSubscribe(this, oldSubscribe);\n      }\n    }\n\n    observableProto = Observable.prototype;\n\n    /**\n    * Determines whether the given object is an Observable\n    * @param {Any} An object to determine whether it is an Observable\n    * @returns {Boolean} true if an Observable, else false.\n    */\n    Observable.isObservable = function (o) {\n      return o && isFunction(o.subscribe);\n    };\n\n    /**\n     *  Subscribes an o to the observable sequence.\n     *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n     *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n     *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n     *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribe = observableProto.forEach = function (oOrOnNext, onError, onCompleted) {\n      return this._subscribe(typeof oOrOnNext === 'object' ?\n        oOrOnNext :\n        observerCreate(oOrOnNext, onError, onCompleted));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onNext The function to invoke on each element in the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnNext = function (onNext, thisArg) {\n      return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n    };\n\n    /**\n     * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n     * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnError = function (onError, thisArg) {\n      return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnCompleted = function (onCompleted, thisArg) {\n      return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n    };\n\n    return Observable;\n  })();\n\n  var ObservableBase = Rx.ObservableBase = (function (__super__) {\n    inherits(ObservableBase, __super__);\n\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.subscribeCore).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function ObservableBase() {\n      __super__.call(this);\n    }\n\n    ObservableBase.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    ObservableBase.prototype.subscribeCore = notImplemented;\n\n    return ObservableBase;\n  }(Observable));\n\nvar FlatMapObservable = Rx.FlatMapObservable = (function(__super__) {\n\n    inherits(FlatMapObservable, __super__);\n\n    function FlatMapObservable(source, selector, resultSelector, thisArg) {\n      this.resultSelector = isFunction(resultSelector) ? resultSelector : null;\n      this.selector = bindCallback(isFunction(selector) ? selector : function() { return selector; }, thisArg, 3);\n      this.source = source;\n      __super__.call(this);\n    }\n\n    FlatMapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this.resultSelector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(observer, selector, resultSelector, source) {\n      this.i = 0;\n      this.selector = selector;\n      this.resultSelector = resultSelector;\n      this.source = source;\n      this.o = observer;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype._wrapResult = function(result, x, i) {\n      return this.resultSelector ?\n        result.map(function(y, i2) { return this.resultSelector(x, y, i, i2); }, this) :\n        result;\n    };\n\n    InnerObserver.prototype.next = function(x) {\n      var i = this.i++;\n      var result = tryCatch(this.selector)(x, i, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = Observable.from(result));\n      this.o.onNext(this._wrapResult(result, x, i));\n    };\n\n    InnerObserver.prototype.error = function(e) { this.o.onError(e); };\n\n    InnerObserver.prototype.completed = function() { this.o.onCompleted(); };\n\n    return FlatMapObservable;\n\n}(ObservableBase));\n\n  var Enumerable = Rx.internals.Enumerable = function () { };\n\n  function IsDisposedDisposable(state) {\n    this._s = state;\n    this.isDisposed = false;\n  }\n\n  IsDisposedDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      this._s.isDisposed = true;\n    }\n  };\n\n  var ConcatEnumerableObservable = (function(__super__) {\n    inherits(ConcatEnumerableObservable, __super__);\n    function ConcatEnumerableObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    ConcatEnumerableObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        o: o,\n        subscription: subscription,\n        e: this.sources[$iterator$]()\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.o.onError(e); };\n    InnerObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return ConcatEnumerableObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.concat = function () {\n    return new ConcatEnumerableObservable(this);\n  };\n\n  var CatchErrorObservable = (function(__super__) {\n    function CatchErrorObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    inherits(CatchErrorObservable, __super__);\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.lastError !== null ? state.o.onError(state.lastError) : state.o.onCompleted(); }\n\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    CatchErrorObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        e: this.sources[$iterator$](),\n        subscription: subscription,\n        lastError: null,\n        o: o\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.lastError = e; this._recurse(this._state); };\n    InnerObserver.prototype.completed = function () { this._state.o.onCompleted(); };\n\n    return CatchErrorObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.catchError = function () {\n    return new CatchErrorObservable(this);\n  };\n\n  var RepeatEnumerable = (function (__super__) {\n    inherits(RepeatEnumerable, __super__);\n    function RepeatEnumerable(v, c) {\n      this.v = v;\n      this.c = c == null ? -1 : c;\n    }\n\n    RepeatEnumerable.prototype[$iterator$] = function () {\n      return new RepeatEnumerator(this);\n    };\n\n    function RepeatEnumerator(p) {\n      this.v = p.v;\n      this.l = p.c;\n    }\n\n    RepeatEnumerator.prototype.next = function () {\n      if (this.l === 0) { return doneEnumerator; }\n      if (this.l > 0) { this.l--; }\n      return { done: false, value: this.v };\n    };\n\n    return RepeatEnumerable;\n  }(Enumerable));\n\n  var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) {\n    return new RepeatEnumerable(value, repeatCount);\n  };\n\n  var OfEnumerable = (function(__super__) {\n    inherits(OfEnumerable, __super__);\n    function OfEnumerable(s, fn, thisArg) {\n      this.s = s;\n      this.fn = fn ? bindCallback(fn, thisArg, 3) : null;\n    }\n    OfEnumerable.prototype[$iterator$] = function () {\n      return new OfEnumerator(this);\n    };\n\n    function OfEnumerator(p) {\n      this.i = -1;\n      this.s = p.s;\n      this.l = this.s.length;\n      this.fn = p.fn;\n    }\n\n    OfEnumerator.prototype.next = function () {\n     return ++this.i < this.l ?\n       { done: false, value: !this.fn ? this.s[this.i] : this.fn(this.s[this.i], this.i, this.s) } :\n       doneEnumerator;\n    };\n\n    return OfEnumerable;\n  }(Enumerable));\n\n  var enumerableOf = Enumerable.of = function (source, selector, thisArg) {\n    return new OfEnumerable(source, selector, thisArg);\n  };\n\nvar ObserveOnObservable = (function (__super__) {\n  inherits(ObserveOnObservable, __super__);\n  function ObserveOnObservable(source, s) {\n    this.source = source;\n    this._s = s;\n    __super__.call(this);\n  }\n\n  ObserveOnObservable.prototype.subscribeCore = function (o) {\n    return this.source.subscribe(new ObserveOnObserver(this._s, o));\n  };\n\n  return ObserveOnObservable;\n}(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n   *\n   *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n   *  that require to be run on a scheduler, use subscribeOn.\n   *\n   *  @param {Scheduler} scheduler Scheduler to notify observers on.\n   *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n   */\n  observableProto.observeOn = function (scheduler) {\n    return new ObserveOnObservable(this, scheduler);\n  };\n\n  var SubscribeOnObservable = (function (__super__) {\n    inherits(SubscribeOnObservable, __super__);\n    function SubscribeOnObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(scheduler, state) {\n      var source = state[0], d = state[1], o = state[2];\n      d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(o)));\n    }\n\n    SubscribeOnObservable.prototype.subscribeCore = function (o) {\n      var m = new SingleAssignmentDisposable(), d = new SerialDisposable();\n      d.setDisposable(m);\n      m.setDisposable(this._s.schedule([this.source, d, o], scheduleMethod));\n      return d;\n    };\n\n    return SubscribeOnObservable;\n  }(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n   *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n   *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n   *  callbacks on a scheduler, use observeOn.\n\n   *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n   *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n   */\n  observableProto.subscribeOn = function (scheduler) {\n    return new SubscribeOnObservable(this, scheduler);\n  };\n\n  var FromPromiseObservable = (function(__super__) {\n    inherits(FromPromiseObservable, __super__);\n    function FromPromiseObservable(p, s) {\n      this._p = p;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleNext(s, state) {\n      var o = state[0], data = state[1];\n      o.onNext(data);\n      o.onCompleted();\n    }\n\n    function scheduleError(s, state) {\n      var o = state[0], err = state[1];\n      o.onError(err);\n    }\n\n    FromPromiseObservable.prototype.subscribeCore = function(o) {\n      var sad = new SingleAssignmentDisposable(), self = this, p = this._p;\n\n      if (isFunction(p)) {\n        p = tryCatch(p)();\n        if (p === errorObj) {\n          o.onError(p.e);\n          return sad;\n        }\n      }\n\n      p\n        .then(function (data) {\n          sad.setDisposable(self._s.schedule([o, data], scheduleNext));\n        }, function (err) {\n          sad.setDisposable(self._s.schedule([o, err], scheduleError));\n        });\n\n      return sad;\n    };\n\n    return FromPromiseObservable;\n  }(ObservableBase));\n\n  /**\n  * Converts a Promise to an Observable sequence\n  * @param {Promise} An ES6 Compliant promise.\n  * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n  */\n  var observableFromPromise = Observable.fromPromise = function (promise, scheduler) {\n    scheduler || (scheduler = defaultScheduler);\n    return new FromPromiseObservable(promise, scheduler);\n  };\n\n  /*\n   * Converts an existing observable sequence to an ES6 Compatible Promise\n   * @example\n   * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n   *\n   * // With config\n   * Rx.config.Promise = RSVP.Promise;\n   * var promise = Rx.Observable.return(42).toPromise();\n   * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n   * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n   */\n  observableProto.toPromise = function (promiseCtor) {\n    promiseCtor || (promiseCtor = Rx.config.Promise);\n    if (!promiseCtor) { throw new NotSupportedError('Promise type not provided nor in Rx.config.Promise'); }\n    var source = this;\n    return new promiseCtor(function (resolve, reject) {\n      // No cancellation can be done\n      var value;\n      source.subscribe(function (v) {\n        value = v;\n      }, reject, function () {\n        resolve(value);\n      });\n    });\n  };\n\n  var ToArrayObservable = (function(__super__) {\n    inherits(ToArrayObservable, __super__);\n    function ToArrayObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    ToArrayObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o) {\n      this.o = o;\n      this.a = [];\n      AbstractObserver.call(this);\n    }\n    \n    InnerObserver.prototype.next = function (x) { this.a.push(x); };\n    InnerObserver.prototype.error = function (e) { this.o.onError(e);  };\n    InnerObserver.prototype.completed = function () { this.o.onNext(this.a); this.o.onCompleted(); };\n\n    return ToArrayObservable;\n  }(ObservableBase));\n\n  /**\n  * Creates an array from an observable sequence.\n  * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n  */\n  observableProto.toArray = function () {\n    return new ToArrayObservable(this);\n  };\n\n  /**\n   *  Creates an observable sequence from a specified subscribe method implementation.\n   * @example\n   *  var res = Rx.Observable.create(function (observer) { return function () { } );\n   *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n   *  var res = Rx.Observable.create(function (observer) { } );\n   * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n   * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n   */\n  Observable.create = function (subscribe, parent) {\n    return new AnonymousObservable(subscribe, parent);\n  };\n\n  var Defer = (function(__super__) {\n    inherits(Defer, __super__);\n    function Defer(factory) {\n      this._f = factory;\n      __super__.call(this);\n    }\n\n    Defer.prototype.subscribeCore = function (o) {\n      var result = tryCatch(this._f)();\n      if (result === errorObj) { return observableThrow(result.e).subscribe(o);}\n      isPromise(result) && (result = observableFromPromise(result));\n      return result.subscribe(o);\n    };\n\n    return Defer;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n   *\n   * @example\n   *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n   * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n   * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n   */\n  var observableDefer = Observable.defer = function (observableFactory) {\n    return new Defer(observableFactory);\n  };\n\n  var EmptyObservable = (function(__super__) {\n    inherits(EmptyObservable, __super__);\n    function EmptyObservable(scheduler) {\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    EmptyObservable.prototype.subscribeCore = function (observer) {\n      var sink = new EmptySink(observer, this.scheduler);\n      return sink.run();\n    };\n\n    function EmptySink(observer, scheduler) {\n      this.observer = observer;\n      this.scheduler = scheduler;\n    }\n\n    function scheduleItem(s, state) {\n      state.onCompleted();\n      return disposableEmpty;\n    }\n\n    EmptySink.prototype.run = function () {\n      var state = this.observer;\n      return this.scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this.scheduler.schedule(state, scheduleItem);\n    };\n\n    return EmptyObservable;\n  }(ObservableBase));\n\n  var EMPTY_OBSERVABLE = new EmptyObservable(immediateScheduler);\n\n  /**\n   *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n   *\n   * @example\n   *  var res = Rx.Observable.empty();\n   *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n   * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n   * @returns {Observable} An observable sequence with no elements.\n   */\n  var observableEmpty = Observable.empty = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return scheduler === immediateScheduler ? EMPTY_OBSERVABLE : new EmptyObservable(scheduler);\n  };\n\n  var FromObservable = (function(__super__) {\n    inherits(FromObservable, __super__);\n    function FromObservable(iterable, fn, scheduler) {\n      this._iterable = iterable;\n      this._fn = fn;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function createScheduleMethod(o, it, fn) {\n      return function loopRecursive(i, recurse) {\n        var next = tryCatch(it.next).call(it);\n        if (next === errorObj) { return o.onError(next.e); }\n        if (next.done) { return o.onCompleted(); }\n\n        var result = next.value;\n\n        if (isFunction(fn)) {\n          result = tryCatch(fn)(result, i);\n          if (result === errorObj) { return o.onError(result.e); }\n        }\n\n        o.onNext(result);\n        recurse(i + 1);\n      };\n    }\n\n    FromObservable.prototype.subscribeCore = function (o) {\n      var list = Object(this._iterable),\n          it = getIterable(list);\n\n      return this._scheduler.scheduleRecursive(0, createScheduleMethod(o, it, this._fn));\n    };\n\n    return FromObservable;\n  }(ObservableBase));\n\n  var maxSafeInteger = Math.pow(2, 53) - 1;\n\n  function StringIterable(s) {\n    this._s = s;\n  }\n\n  StringIterable.prototype[$iterator$] = function () {\n    return new StringIterator(this._s);\n  };\n\n  function StringIterator(s) {\n    this._s = s;\n    this._l = s.length;\n    this._i = 0;\n  }\n\n  StringIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  StringIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._s.charAt(this._i++) } : doneEnumerator;\n  };\n\n  function ArrayIterable(a) {\n    this._a = a;\n  }\n\n  ArrayIterable.prototype[$iterator$] = function () {\n    return new ArrayIterator(this._a);\n  };\n\n  function ArrayIterator(a) {\n    this._a = a;\n    this._l = toLength(a);\n    this._i = 0;\n  }\n\n  ArrayIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  ArrayIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._a[this._i++] } : doneEnumerator;\n  };\n\n  function numberIsFinite(value) {\n    return typeof value === 'number' && root.isFinite(value);\n  }\n\n  function isNan(n) {\n    return n !== n;\n  }\n\n  function getIterable(o) {\n    var i = o[$iterator$], it;\n    if (!i && typeof o === 'string') {\n      it = new StringIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i && o.length !== undefined) {\n      it = new ArrayIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i) { throw new TypeError('Object is not iterable'); }\n    return o[$iterator$]();\n  }\n\n  function sign(value) {\n    var number = +value;\n    if (number === 0) { return number; }\n    if (isNaN(number)) { return number; }\n    return number < 0 ? -1 : 1;\n  }\n\n  function toLength(o) {\n    var len = +o.length;\n    if (isNaN(len)) { return 0; }\n    if (len === 0 || !numberIsFinite(len)) { return len; }\n    len = sign(len) * Math.floor(Math.abs(len));\n    if (len <= 0) { return 0; }\n    if (len > maxSafeInteger) { return maxSafeInteger; }\n    return len;\n  }\n\n  /**\n  * This method creates a new Observable sequence from an array-like or iterable object.\n  * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n  * @param {Function} [mapFn] Map function to call on every element of the array.\n  * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n  * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n  */\n  var observableFrom = Observable.from = function (iterable, mapFn, thisArg, scheduler) {\n    if (iterable == null) {\n      throw new Error('iterable cannot be null.')\n    }\n    if (mapFn && !isFunction(mapFn)) {\n      throw new Error('mapFn when provided must be a function');\n    }\n    if (mapFn) {\n      var mapper = bindCallback(mapFn, thisArg, 2);\n    }\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromObservable(iterable, mapper, scheduler);\n  }\n\n  var FromArrayObservable = (function(__super__) {\n    inherits(FromArrayObservable, __super__);\n    function FromArrayObservable(args, scheduler) {\n      this._args = args;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, args) {\n      var len = args.length;\n      return function loopRecursive (i, recurse) {\n        if (i < len) {\n          o.onNext(args[i]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    FromArrayObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._args));\n    };\n\n    return FromArrayObservable;\n  }(ObservableBase));\n\n  /**\n  *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n  * @deprecated use Observable.from or Observable.of\n  * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n  */\n  var observableFromArray = Observable.fromArray = function (array, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler)\n  };\n\n  var GenerateObservable = (function (__super__) {\n    inherits(GenerateObservable, __super__);\n    function GenerateObservable(state, cndFn, itrFn, resFn, s) {\n      this._initialState = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n      var hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (hasResult === errorObj) { return state.o.onError(hasResult.e); }\n      if (hasResult) {\n        var result = tryCatch(state.self._resFn)(state.newState);\n        if (result === errorObj) { return state.o.onError(result.e); }\n        state.o.onNext(result);\n        recurse(state);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        first: true,\n        newState: this._initialState\n      };\n      return this._s.scheduleRecursive(state, scheduleRecursive);\n    };\n\n    return GenerateObservable;\n  }(ObservableBase));\n\n  /**\n   *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new GenerateObservable(initialState, condition, iterate, resultSelector, scheduler);\n  };\n\n  var NeverObservable = (function(__super__) {\n    inherits(NeverObservable, __super__);\n    function NeverObservable() {\n      __super__.call(this);\n    }\n\n    NeverObservable.prototype.subscribeCore = function (observer) {\n      return disposableEmpty;\n    };\n\n    return NeverObservable;\n  }(ObservableBase));\n\n  var NEVER_OBSERVABLE = new NeverObservable();\n\n  /**\n   * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n   * @returns {Observable} An observable sequence whose observers will never get called.\n   */\n  var observableNever = Observable.never = function () {\n    return NEVER_OBSERVABLE;\n  };\n\n  function observableOf (scheduler, array) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler);\n  }\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.of = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return new FromArrayObservable(args, currentThreadScheduler);\n  };\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.ofWithScheduler = function (scheduler) {\n    var len = arguments.length, args = new Array(len - 1);\n    for(var i = 1; i < len; i++) { args[i - 1] = arguments[i]; }\n    return new FromArrayObservable(args, scheduler);\n  };\n\n  var PairsObservable = (function(__super__) {\n    inherits(PairsObservable, __super__);\n    function PairsObservable(o, scheduler) {\n      this._o = o;\n      this._keys = Object.keys(o);\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, obj, keys) {\n      return function loopRecursive(i, recurse) {\n        if (i < keys.length) {\n          var key = keys[i];\n          o.onNext([key, obj[key]]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    PairsObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._o, this._keys));\n    };\n\n    return PairsObservable;\n  }(ObservableBase));\n\n  /**\n   * Convert an object into an observable sequence of [key, value] pairs.\n   * @param {Object} obj The object to inspect.\n   * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n   * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n   */\n  Observable.pairs = function (obj, scheduler) {\n    scheduler || (scheduler = currentThreadScheduler);\n    return new PairsObservable(obj, scheduler);\n  };\n\n    var RangeObservable = (function(__super__) {\n    inherits(RangeObservable, __super__);\n    function RangeObservable(start, count, scheduler) {\n      this.start = start;\n      this.rangeCount = count;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function loopRecursive(start, count, o) {\n      return function loop (i, recurse) {\n        if (i < count) {\n          o.onNext(start + i);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    RangeObservable.prototype.subscribeCore = function (o) {\n      return this.scheduler.scheduleRecursive(\n        0,\n        loopRecursive(this.start, this.rangeCount, o)\n      );\n    };\n\n    return RangeObservable;\n  }(ObservableBase));\n\n  /**\n  *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n  * @param {Number} start The value of the first integer in the sequence.\n  * @param {Number} count The number of sequential integers to generate.\n  * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n  * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n  */\n  Observable.range = function (start, count, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RangeObservable(start, count, scheduler);\n  };\n\n  var RepeatObservable = (function(__super__) {\n    inherits(RepeatObservable, __super__);\n    function RepeatObservable(value, repeatCount, scheduler) {\n      this.value = value;\n      this.repeatCount = repeatCount == null ? -1 : repeatCount;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    RepeatObservable.prototype.subscribeCore = function (observer) {\n      var sink = new RepeatSink(observer, this);\n      return sink.run();\n    };\n\n    return RepeatObservable;\n  }(ObservableBase));\n\n  function RepeatSink(observer, parent) {\n    this.observer = observer;\n    this.parent = parent;\n  }\n\n  RepeatSink.prototype.run = function () {\n    var observer = this.observer, value = this.parent.value;\n    function loopRecursive(i, recurse) {\n      if (i === -1 || i > 0) {\n        observer.onNext(value);\n        i > 0 && i--;\n      }\n      if (i === 0) { return observer.onCompleted(); }\n      recurse(i);\n    }\n\n    return this.parent.scheduler.scheduleRecursive(this.parent.repeatCount, loopRecursive);\n  };\n\n  /**\n   *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n   * @param {Mixed} value Element to repeat.\n   * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n   * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n   */\n  Observable.repeat = function (value, repeatCount, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RepeatObservable(value, repeatCount, scheduler);\n  };\n\n  var JustObservable = (function(__super__) {\n    inherits(JustObservable, __super__);\n    function JustObservable(value, scheduler) {\n      this._value = value;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    JustObservable.prototype.subscribeCore = function (o) {\n      var state = [this._value, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var value = state[0], observer = state[1];\n      observer.onNext(value);\n      observer.onCompleted();\n      return disposableEmpty;\n    }\n\n    return JustObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n   *  There is an alias called 'just' or browsers <IE9.\n   * @param {Mixed} value Single element in the resulting observable sequence.\n   * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence containing the single specified element.\n   */\n  var observableReturn = Observable['return'] = Observable.just = function (value, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new JustObservable(value, scheduler);\n  };\n\n  var ThrowObservable = (function(__super__) {\n    inherits(ThrowObservable, __super__);\n    function ThrowObservable(error, scheduler) {\n      this._error = error;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    ThrowObservable.prototype.subscribeCore = function (o) {\n      var state = [this._error, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var e = state[0], o = state[1];\n      o.onError(e);\n      return disposableEmpty;\n    }\n\n    return ThrowObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n   *  There is an alias to this method called 'throwError' for browsers <IE9.\n   * @param {Mixed} error An object used for the sequence's termination.\n   * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n   */\n  var observableThrow = Observable['throw'] = function (error, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new ThrowObservable(error, scheduler);\n  };\n\n  var UsingObservable = (function (__super__) {\n    inherits(UsingObservable, __super__);\n    function UsingObservable(resFn, obsFn) {\n      this._resFn = resFn;\n      this._obsFn = obsFn;\n      __super__.call(this);\n    }\n\n    UsingObservable.prototype.subscribeCore = function (o) {\n      var disposable = disposableEmpty;\n      var resource = tryCatch(this._resFn)();\n      if (resource === errorObj) {\n        return new BinaryDisposable(observableThrow(resource.e).subscribe(o), disposable);\n      }\n      resource && (disposable = resource);\n      var source = tryCatch(this._obsFn)(resource);\n      if (source === errorObj) {\n        return new BinaryDisposable(observableThrow(source.e).subscribe(o), disposable);\n      }\n      return new BinaryDisposable(source.subscribe(o), disposable);\n    };\n\n    return UsingObservable;\n  }(ObservableBase));\n\n  /**\n   * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n   * @param {Function} resourceFactory Factory function to obtain a resource object.\n   * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n   * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n   */\n  Observable.using = function (resourceFactory, observableFactory) {\n    return new UsingObservable(resourceFactory, observableFactory);\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @param {Observable} rightSource Second observable sequence or Promise.\n   * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n   */\n  observableProto.amb = function (rightSource) {\n    var leftSource = this;\n    return new AnonymousObservable(function (observer) {\n      var choice,\n        leftChoice = 'L', rightChoice = 'R',\n        leftSubscription = new SingleAssignmentDisposable(),\n        rightSubscription = new SingleAssignmentDisposable();\n\n      isPromise(rightSource) && (rightSource = observableFromPromise(rightSource));\n\n      function choiceL() {\n        if (!choice) {\n          choice = leftChoice;\n          rightSubscription.dispose();\n        }\n      }\n\n      function choiceR() {\n        if (!choice) {\n          choice = rightChoice;\n          leftSubscription.dispose();\n        }\n      }\n\n      var leftSubscribe = observerCreate(\n        function (left) {\n          choiceL();\n          choice === leftChoice && observer.onNext(left);\n        },\n        function (e) {\n          choiceL();\n          choice === leftChoice && observer.onError(e);\n        },\n        function () {\n          choiceL();\n          choice === leftChoice && observer.onCompleted();\n        }\n      );\n      var rightSubscribe = observerCreate(\n        function (right) {\n          choiceR();\n          choice === rightChoice && observer.onNext(right);\n        },\n        function (e) {\n          choiceR();\n          choice === rightChoice && observer.onError(e);\n        },\n        function () {\n          choiceR();\n          choice === rightChoice && observer.onCompleted();\n        }\n      );\n\n      leftSubscription.setDisposable(leftSource.subscribe(leftSubscribe));\n      rightSubscription.setDisposable(rightSource.subscribe(rightSubscribe));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    });\n  };\n\n  function amb(p, c) { return p.amb(c); }\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n   */\n  Observable.amb = function () {\n    var acc = observableNever(), items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(items);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    for (var i = 0, len = items.length; i < len; i++) {\n      acc = amb(acc, items[i]);\n    }\n    return acc;\n  };\n\n  var CatchObservable = (function (__super__) {\n    inherits(CatchObservable, __super__);\n    function CatchObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObservable.prototype.subscribeCore = function (o) {\n      var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();\n      subscription.setDisposable(d1);\n      d1.setDisposable(this.source.subscribe(new CatchObserver(o, subscription, this._fn)));\n      return subscription;\n    };\n\n    return CatchObservable;\n  }(ObservableBase));\n\n  var CatchObserver = (function(__super__) {\n    inherits(CatchObserver, __super__);\n    function CatchObserver(o, s, fn) {\n      this._o = o;\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObserver.prototype.next = function (x) { this._o.onNext(x); };\n    CatchObserver.prototype.completed = function () { return this._o.onCompleted(); };\n    CatchObserver.prototype.error = function (e) {\n      var result = tryCatch(this._fn)(e);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      isPromise(result) && (result = observableFromPromise(result));\n\n      var d = new SingleAssignmentDisposable();\n      this._s.setDisposable(d);\n      d.setDisposable(result.subscribe(this._o));\n    };\n\n    return CatchObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n   * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n   */\n  observableProto['catch'] = function (handlerOrSecond) {\n    return isFunction(handlerOrSecond) ? new CatchObservable(this, handlerOrSecond) : observableCatch([this, handlerOrSecond]);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n   * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n   */\n  var observableCatch = Observable['catch'] = function () {\n    var items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(len);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    return enumerableOf(items).catchError();\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   * This can be in the form of an argument list of observables or an array.\n   *\n   * @example\n   * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return combineLatest.apply(this, args);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var CombineLatestObservable = (function(__super__) {\n    inherits(CombineLatestObservable, __super__);\n    function CombineLatestObservable(params, cb) {\n      this._params = params;\n      this._cb = cb;\n      __super__.call(this);\n    }\n\n    CombineLatestObservable.prototype.subscribeCore = function(observer) {\n      var len = this._params.length,\n          subscriptions = new Array(len);\n\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        isDone: arrayInitialize(len, falseFactory),\n        values: new Array(len)\n      };\n\n      for (var i = 0; i < len; i++) {\n        var source = this._params[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new CombineLatestObserver(observer, i, this._cb, state)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return CombineLatestObservable;\n  }(ObservableBase));\n\n  var CombineLatestObserver = (function (__super__) {\n    inherits(CombineLatestObserver, __super__);\n    function CombineLatestObserver(o, i, cb, state) {\n      this._o = o;\n      this._i = i;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    CombineLatestObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      if (this._state.hasValueAll || (this._state.hasValueAll = this._state.hasValue.every(identity))) {\n        var res = tryCatch(this._cb).apply(null, this._state.values);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._state.isDone.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    CombineLatestObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    CombineLatestObserver.prototype.completed = function () {\n      this._state.isDone[this._i] = true;\n      this._state.isDone.every(identity) && this._o.onCompleted();\n    };\n\n    return CombineLatestObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n  *\n  * @example\n  * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n  * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n  * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n  */\n  var combineLatest = Observable.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n    return new CombineLatestObservable(args, resultSelector);\n  };\n\n  /**\n   * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  observableProto.concat = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    args.unshift(this);\n    return observableConcat.apply(null, args);\n  };\n\n  var ConcatObserver = (function(__super__) {\n    inherits(ConcatObserver, __super__);\n    function ConcatObserver(s, fn) {\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    ConcatObserver.prototype.next = function (x) { this._s.o.onNext(x); };\n    ConcatObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    ConcatObserver.prototype.completed = function () { this._s.i++; this._fn(this._s); };\n\n    return ConcatObserver;\n  }(AbstractObserver));\n\n  var ConcatObservable = (function(__super__) {\n    inherits(ConcatObservable, __super__);\n    function ConcatObservable(sources) {\n      this._sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive (state, recurse) {\n      if (state.disposable.isDisposed) { return; }\n      if (state.i === state.sources.length) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = state.sources[state.i];\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new ConcatObserver(state, recurse)));\n    }\n\n    ConcatObservable.prototype.subscribeCore = function(o) {\n      var subscription = new SerialDisposable();\n      var disposable = disposableCreate(noop);\n      var state = {\n        o: o,\n        i: 0,\n        subscription: subscription,\n        disposable: disposable,\n        sources: this._sources\n      };\n\n      var cancelable = immediateScheduler.scheduleRecursive(state, scheduleRecursive);\n      return new NAryDisposable([subscription, disposable, cancelable]);\n    };\n\n    return ConcatObservable;\n  }(ObservableBase));\n\n  /**\n   * Concatenates all the observable sequences.\n   * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  var observableConcat = Observable.concat = function () {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      args = new Array(arguments.length);\n      for(var i = 0, len = arguments.length; i < len; i++) { args[i] = arguments[i]; }\n    }\n    return new ConcatObservable(args);\n  };\n\n  /**\n   * Concatenates an observable sequence of observable sequences.\n   * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n   */\n  observableProto.concatAll = function () {\n    return this.merge(1);\n  };\n\n  var MergeObservable = (function (__super__) {\n    inherits(MergeObservable, __super__);\n\n    function MergeObservable(source, maxConcurrent) {\n      this.source = source;\n      this.maxConcurrent = maxConcurrent;\n      __super__.call(this);\n    }\n\n    MergeObservable.prototype.subscribeCore = function(observer) {\n      var g = new CompositeDisposable();\n      g.add(this.source.subscribe(new MergeObserver(observer, this.maxConcurrent, g)));\n      return g;\n    };\n\n    return MergeObservable;\n\n  }(ObservableBase));\n\n  var MergeObserver = (function (__super__) {\n    function MergeObserver(o, max, g) {\n      this.o = o;\n      this.max = max;\n      this.g = g;\n      this.done = false;\n      this.q = [];\n      this.activeCount = 0;\n      __super__.call(this);\n    }\n\n    inherits(MergeObserver, __super__);\n\n    MergeObserver.prototype.handleSubscribe = function (xs) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(xs) && (xs = observableFromPromise(xs));\n      sad.setDisposable(xs.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeObserver.prototype.next = function (innerSource) {\n      if(this.activeCount < this.max) {\n        this.activeCount++;\n        this.handleSubscribe(innerSource);\n      } else {\n        this.q.push(innerSource);\n      }\n    };\n    MergeObserver.prototype.error = function (e) { this.o.onError(e); };\n    MergeObserver.prototype.completed = function () { this.done = true; this.activeCount === 0 && this.o.onCompleted(); };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) { this.parent.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this.parent.o.onError(e); };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      if (this.parent.q.length > 0) {\n        this.parent.handleSubscribe(this.parent.q.shift());\n      } else {\n        this.parent.activeCount--;\n        this.parent.done && this.parent.activeCount === 0 && this.parent.o.onCompleted();\n      }\n    };\n\n    return MergeObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n  * Or merges two observable sequences into a single observable sequence.\n  * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.merge = function (maxConcurrentOrOther) {\n    return typeof maxConcurrentOrOther !== 'number' ?\n      observableMerge(this, maxConcurrentOrOther) :\n      new MergeObservable(this, maxConcurrentOrOther);\n  };\n\n  /**\n   * Merges all the observable sequences into a single observable sequence.\n   * The scheduler is optional and if not specified, the immediate scheduler is used.\n   * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n   */\n  var observableMerge = Observable.merge = function () {\n    var scheduler, sources = [], i, len = arguments.length;\n    if (!arguments[0]) {\n      scheduler = immediateScheduler;\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else if (isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else {\n      scheduler = immediateScheduler;\n      for(i = 0; i < len; i++) { sources.push(arguments[i]); }\n    }\n    if (Array.isArray(sources[0])) {\n      sources = sources[0];\n    }\n    return observableOf(scheduler, sources).mergeAll();\n  };\n\n  var MergeAllObservable = (function (__super__) {\n    inherits(MergeAllObservable, __super__);\n\n    function MergeAllObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeAllObservable.prototype.subscribeCore = function (o) {\n      var g = new CompositeDisposable(), m = new SingleAssignmentDisposable();\n      g.add(m);\n      m.setDisposable(this.source.subscribe(new MergeAllObserver(o, g)));\n      return g;\n    };\n\n    return MergeAllObservable;\n  }(ObservableBase));\n\n  var MergeAllObserver = (function (__super__) {\n    function MergeAllObserver(o, g) {\n      this.o = o;\n      this.g = g;\n      this.done = false;\n      __super__.call(this);\n    }\n\n    inherits(MergeAllObserver, __super__);\n\n    MergeAllObserver.prototype.next = function(innerSource) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      sad.setDisposable(innerSource.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeAllObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    MergeAllObserver.prototype.completed = function () {\n      this.done = true;\n      this.g.length === 1 && this.o.onCompleted();\n    };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) {\n      this.parent.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function (e) {\n      this.parent.o.onError(e);\n    };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      this.parent.done && this.parent.g.length === 1 && this.parent.o.onCompleted();\n    };\n\n    return MergeAllObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.mergeAll = function () {\n    return new MergeAllObservable(this);\n  };\n\n  var CompositeError = Rx.CompositeError = function(errors) {\n    this.innerErrors = errors;\n    this.message = 'This contains multiple errors. Check the innerErrors';\n    Error.call(this);\n  };\n  CompositeError.prototype = Object.create(Error.prototype);\n  CompositeError.prototype.name = 'CompositeError';\n\n  var MergeDelayErrorObservable = (function(__super__) {\n    inherits(MergeDelayErrorObservable, __super__);\n    function MergeDelayErrorObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeDelayErrorObservable.prototype.subscribeCore = function (o) {\n      var group = new CompositeDisposable(),\n        m = new SingleAssignmentDisposable(),\n        state = { isStopped: false, errors: [], o: o };\n\n      group.add(m);\n      m.setDisposable(this.source.subscribe(new MergeDelayErrorObserver(group, state)));\n\n      return group;\n    };\n\n    return MergeDelayErrorObservable;\n  }(ObservableBase));\n\n  var MergeDelayErrorObserver = (function(__super__) {\n    inherits(MergeDelayErrorObserver, __super__);\n    function MergeDelayErrorObserver(group, state) {\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function setCompletion(o, errors) {\n      if (errors.length === 0) {\n        o.onCompleted();\n      } else if (errors.length === 1) {\n        o.onError(errors[0]);\n      } else {\n        o.onError(new CompositeError(errors));\n      }\n    }\n\n    MergeDelayErrorObserver.prototype.next = function (x) {\n      var inner = new SingleAssignmentDisposable();\n      this._group.add(inner);\n\n      // Check for promises support\n      isPromise(x) && (x = observableFromPromise(x));\n      inner.setDisposable(x.subscribe(new InnerObserver(inner, this._group, this._state)));\n    };\n\n    MergeDelayErrorObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    MergeDelayErrorObserver.prototype.completed = function () {\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    inherits(InnerObserver, __super__);\n    function InnerObserver(inner, group, state) {\n      this._inner = inner;\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n    InnerObserver.prototype.completed = function () {\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    return MergeDelayErrorObserver;\n  }(AbstractObserver));\n\n  /**\n  * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n  * receive all successfully emitted items from all of the source Observables without being interrupted by\n  * an error notification from one of them.\n  *\n  * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n  * error via the Observer's onError, mergeDelayError will refrain from propagating that\n  * error notification until all of the merged Observables have finished emitting items.\n  * @param {Array | Arguments} args Arguments or an array to merge.\n  * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n  */\n  Observable.mergeDelayError = function() {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      var len = arguments.length;\n      args = new Array(len);\n      for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    var source = observableOf(null, args);\n    return new MergeDelayErrorObservable(source);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n   * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n   */\n  observableProto.onErrorResumeNext = function (second) {\n    if (!second) { throw new Error('Second observable is required'); }\n    return onErrorResumeNext([this, second]);\n  };\n\n  var OnErrorResumeNextObservable = (function(__super__) {\n    inherits(OnErrorResumeNextObservable, __super__);\n    function OnErrorResumeNextObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.pos < state.sources.length) {\n        var current = state.sources[state.pos++];\n        isPromise(current) && (current = observableFromPromise(current));\n        var d = new SingleAssignmentDisposable();\n        state.subscription.setDisposable(d);\n        d.setDisposable(current.subscribe(new OnErrorResumeNextObserver(state, recurse)));\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    OnErrorResumeNextObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable(),\n          state = {pos: 0, subscription: subscription, o: o, sources: this.sources },\n          cancellable = immediateScheduler.scheduleRecursive(state, scheduleMethod);\n\n      return new BinaryDisposable(subscription, cancellable);\n    };\n\n    return OnErrorResumeNextObservable;\n  }(ObservableBase));\n\n  var OnErrorResumeNextObserver = (function(__super__) {\n    inherits(OnErrorResumeNextObserver, __super__);\n    function OnErrorResumeNextObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      __super__.call(this);\n    }\n\n    OnErrorResumeNextObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    OnErrorResumeNextObserver.prototype.error = function () { this._recurse(this._state); };\n    OnErrorResumeNextObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return OnErrorResumeNextObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n   */\n  var onErrorResumeNext = Observable.onErrorResumeNext = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      var len = arguments.length;\n      sources = new Array(len);\n      for(var i = 0; i < len; i++) { sources[i] = arguments[i]; }\n    }\n    return new OnErrorResumeNextObservable(sources);\n  };\n\n  var SkipUntilObservable = (function(__super__) {\n    inherits(SkipUntilObservable, __super__);\n\n    function SkipUntilObservable(source, other) {\n      this._s = source;\n      this._o = isPromise(other) ? observableFromPromise(other) : other;\n      this._open = false;\n      __super__.call(this);\n    }\n\n    SkipUntilObservable.prototype.subscribeCore = function(o) {\n      var leftSubscription = new SingleAssignmentDisposable();\n      leftSubscription.setDisposable(this._s.subscribe(new SkipUntilSourceObserver(o, this)));\n\n      isPromise(this._o) && (this._o = observableFromPromise(this._o));\n\n      var rightSubscription = new SingleAssignmentDisposable();\n      rightSubscription.setDisposable(this._o.subscribe(new SkipUntilOtherObserver(o, this, rightSubscription)));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    };\n\n    return SkipUntilObservable;\n  }(ObservableBase));\n\n  var SkipUntilSourceObserver = (function(__super__) {\n    inherits(SkipUntilSourceObserver, __super__);\n    function SkipUntilSourceObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipUntilSourceObserver.prototype.next = function (x) {\n      this._p._open && this._o.onNext(x);\n    };\n\n    SkipUntilSourceObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilSourceObserver.prototype.onCompleted = function () {\n      this._p._open && this._o.onCompleted();\n    };\n\n    return SkipUntilSourceObserver;\n  }(AbstractObserver));\n\n  var SkipUntilOtherObserver = (function(__super__) {\n    inherits(SkipUntilOtherObserver, __super__);\n    function SkipUntilOtherObserver(o, p, r) {\n      this._o = o;\n      this._p = p;\n      this._r = r;\n      __super__.call(this);\n    }\n\n    SkipUntilOtherObserver.prototype.next = function () {\n      this._p._open = true;\n      this._r.dispose();\n    };\n\n    SkipUntilOtherObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilOtherObserver.prototype.onCompleted = function () {\n      this._r.dispose();\n    };\n\n    return SkipUntilOtherObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n   * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n   */\n  observableProto.skipUntil = function (other) {\n    return new SkipUntilObservable(this, other);\n  };\n\n  var SwitchObservable = (function(__super__) {\n    inherits(SwitchObservable, __super__);\n    function SwitchObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    SwitchObservable.prototype.subscribeCore = function (o) {\n      var inner = new SerialDisposable(), s = this.source.subscribe(new SwitchObserver(o, inner));\n      return new BinaryDisposable(s, inner);\n    };\n\n    inherits(SwitchObserver, AbstractObserver);\n    function SwitchObserver(o, inner) {\n      this.o = o;\n      this.inner = inner;\n      this.stopped = false;\n      this.latest = 0;\n      this.hasLatest = false;\n      AbstractObserver.call(this);\n    }\n\n    SwitchObserver.prototype.next = function (innerSource) {\n      var d = new SingleAssignmentDisposable(), id = ++this.latest;\n      this.hasLatest = true;\n      this.inner.setDisposable(d);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      d.setDisposable(innerSource.subscribe(new InnerObserver(this, id)));\n    };\n\n    SwitchObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    SwitchObserver.prototype.completed = function () {\n      this.stopped = true;\n      !this.hasLatest && this.o.onCompleted();\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(parent, id) {\n      this.parent = parent;\n      this.id = id;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function (x) {\n      this.parent.latest === this.id && this.parent.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.parent.latest === this.id && this.parent.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      if (this.parent.latest === this.id) {\n        this.parent.hasLatest = false;\n        this.parent.stopped && this.parent.o.onCompleted();\n      }\n    };\n\n    return SwitchObservable;\n  }(ObservableBase));\n\n  /**\n  * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n  * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n  */\n  observableProto['switch'] = observableProto.switchLatest = function () {\n    return new SwitchObservable(this);\n  };\n\n  var TakeUntilObservable = (function(__super__) {\n    inherits(TakeUntilObservable, __super__);\n\n    function TakeUntilObservable(source, other) {\n      this.source = source;\n      this.other = isPromise(other) ? observableFromPromise(other) : other;\n      __super__.call(this);\n    }\n\n    TakeUntilObservable.prototype.subscribeCore = function(o) {\n      return new BinaryDisposable(\n        this.source.subscribe(o),\n        this.other.subscribe(new TakeUntilObserver(o))\n      );\n    };\n\n    return TakeUntilObservable;\n  }(ObservableBase));\n\n  var TakeUntilObserver = (function(__super__) {\n    inherits(TakeUntilObserver, __super__);\n    function TakeUntilObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    TakeUntilObserver.prototype.next = function () {\n      this._o.onCompleted();\n    };\n\n    TakeUntilObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    TakeUntilObserver.prototype.onCompleted = noop;\n\n    return TakeUntilObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence until the other observable sequence produces a value.\n   * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n   */\n  observableProto.takeUntil = function (other) {\n    return new TakeUntilObservable(this, other);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var WithLatestFromObservable = (function(__super__) {\n    inherits(WithLatestFromObservable, __super__);\n    function WithLatestFromObservable(source, sources, resultSelector) {\n      this._s = source;\n      this._ss = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    WithLatestFromObservable.prototype.subscribeCore = function (o) {\n      var len = this._ss.length;\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        values: new Array(len)\n      };\n\n      var n = this._ss.length, subscriptions = new Array(n + 1);\n      for (var i = 0; i < n; i++) {\n        var other = this._ss[i], sad = new SingleAssignmentDisposable();\n        isPromise(other) && (other = observableFromPromise(other));\n        sad.setDisposable(other.subscribe(new WithLatestFromOtherObserver(o, i, state)));\n        subscriptions[i] = sad;\n      }\n\n      var outerSad = new SingleAssignmentDisposable();\n      outerSad.setDisposable(this._s.subscribe(new WithLatestFromSourceObserver(o, this._cb, state)));\n      subscriptions[n] = outerSad;\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return WithLatestFromObservable;\n  }(ObservableBase));\n\n  var WithLatestFromOtherObserver = (function (__super__) {\n    inherits(WithLatestFromOtherObserver, __super__);\n    function WithLatestFromOtherObserver(o, i, state) {\n      this._o = o;\n      this._i = i;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromOtherObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      this._state.hasValueAll = this._state.hasValue.every(identity);\n    };\n\n    WithLatestFromOtherObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromOtherObserver.prototype.completed = noop;\n\n    return WithLatestFromOtherObserver;\n  }(AbstractObserver));\n\n  var WithLatestFromSourceObserver = (function (__super__) {\n    inherits(WithLatestFromSourceObserver, __super__);\n    function WithLatestFromSourceObserver(o, cb, state) {\n      this._o = o;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromSourceObserver.prototype.next = function (x) {\n      var allValues = [x].concat(this._state.values);\n      if (!this._state.hasValueAll) { return; }\n      var res = tryCatch(this._cb).apply(null, allValues);\n      if (res === errorObj) { return this._o.onError(res.e); }\n      this._o.onNext(res);\n    };\n\n    WithLatestFromSourceObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromSourceObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return WithLatestFromSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.withLatestFrom = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    return new WithLatestFromObservable(this, args, resultSelector);\n  };\n\n  function falseFactory() { return false; }\n  function emptyArrayFactory() { return []; }\n\n  var ZipObservable = (function(__super__) {\n    inherits(ZipObservable, __super__);\n    function ZipObservable(sources, resultSelector) {\n      this._s = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    ZipObservable.prototype.subscribeCore = function(observer) {\n      var n = this._s.length,\n          subscriptions = new Array(n),\n          done = arrayInitialize(n, falseFactory),\n          q = arrayInitialize(n, emptyArrayFactory);\n\n      for (var i = 0; i < n; i++) {\n        var source = this._s[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new ZipObserver(observer, i, this, q, done)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return ZipObservable;\n  }(ObservableBase));\n\n  var ZipObserver = (function (__super__) {\n    inherits(ZipObserver, __super__);\n    function ZipObserver(o, i, p, q, d) {\n      this._o = o;\n      this._i = i;\n      this._p = p;\n      this._q = q;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    function notEmpty(x) { return x.length > 0; }\n    function shiftEach(x) { return x.shift(); }\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    ZipObserver.prototype.next = function (x) {\n      this._q[this._i].push(x);\n      if (this._q.every(notEmpty)) {\n        var queuedValues = this._q.map(shiftEach);\n        var res = tryCatch(this._p._cb).apply(null, queuedValues);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._d.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    ZipObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ZipObserver.prototype.completed = function () {\n      this._d[this._i] = true;\n      this._d.every(identity) && this._o.onCompleted();\n    };\n\n    return ZipObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n   * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n   */\n  observableProto.zip = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    var parent = this;\n    args.unshift(parent);\n\n    return new ZipObservable(args, resultSelector);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n   * @param arguments Observable sources.\n   * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  Observable.zip = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args = isFunction(args[1]) ? args[0].concat(args[1]) : args[0];\n    }\n    var first = args.shift();\n    return first.zip.apply(first, args);\n  };\n\nfunction falseFactory() { return false; }\nfunction emptyArrayFactory() { return []; }\nfunction argumentsToArray() {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return args;\n}\n\nvar ZipIterableObservable = (function(__super__) {\n  inherits(ZipIterableObservable, __super__);\n  function ZipIterableObservable(sources, cb) {\n    this.sources = sources;\n    this._cb = cb;\n    __super__.call(this);\n  }\n\n  ZipIterableObservable.prototype.subscribeCore = function (o) {\n    var sources = this.sources, len = sources.length, subscriptions = new Array(len);\n\n    var state = {\n      q: arrayInitialize(len, emptyArrayFactory),\n      done: arrayInitialize(len, falseFactory),\n      cb: this._cb,\n      o: o\n    };\n\n    for (var i = 0; i < len; i++) {\n      (function (i) {\n        var source = sources[i], sad = new SingleAssignmentDisposable();\n        (isArrayLike(source) || isIterable(source)) && (source = observableFrom(source));\n\n        subscriptions[i] = sad;\n        sad.setDisposable(source.subscribe(new ZipIterableObserver(state, i)));\n      }(i));\n    }\n\n    return new NAryDisposable(subscriptions);\n  };\n\n  return ZipIterableObservable;\n}(ObservableBase));\n\nvar ZipIterableObserver = (function (__super__) {\n  inherits(ZipIterableObserver, __super__);\n  function ZipIterableObserver(s, i) {\n    this._s = s;\n    this._i = i;\n    __super__.call(this);\n  }\n\n  function notEmpty(x) { return x.length > 0; }\n  function shiftEach(x) { return x.shift(); }\n  function notTheSame(i) {\n    return function (x, j) {\n      return j !== i;\n    };\n  }\n\n  ZipIterableObserver.prototype.next = function (x) {\n    this._s.q[this._i].push(x);\n    if (this._s.q.every(notEmpty)) {\n      var queuedValues = this._s.q.map(shiftEach),\n          res = tryCatch(this._s.cb).apply(null, queuedValues);\n      if (res === errorObj) { return this._s.o.onError(res.e); }\n      this._s.o.onNext(res);\n    } else if (this._s.done.filter(notTheSame(this._i)).every(identity)) {\n      this._s.o.onCompleted();\n    }\n  };\n\n  ZipIterableObserver.prototype.error = function (e) { this._s.o.onError(e); };\n\n  ZipIterableObserver.prototype.completed = function () {\n    this._s.done[this._i] = true;\n    this._s.done.every(identity) && this._s.o.onCompleted();\n  };\n\n  return ZipIterableObserver;\n}(AbstractObserver));\n\n/**\n * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n */\nobservableProto.zipIterable = function () {\n  if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n\n  var parent = this;\n  args.unshift(parent);\n  return new ZipIterableObservable(args, resultSelector);\n};\n\n  function asObservable(source) {\n    return function subscribe(o) { return source.subscribe(o); };\n  }\n\n  /**\n   *  Hides the identity of an observable sequence.\n   * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n   */\n  observableProto.asObservable = function () {\n    return new AnonymousObservable(asObservable(this), this);\n  };\n\n  function toArray(x) { return x.toArray(); }\n  function notEmpty(x) { return x.length > 0; }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n   * @param {Number} count Length of each buffer.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithCount = observableProto.bufferCount = function (count, skip) {\n    typeof skip !== 'number' && (skip = count);\n    return this.windowWithCount(count, skip)\n      .flatMap(toArray)\n      .filter(notEmpty);\n  };\n\n  var DematerializeObservable = (function (__super__) {\n    inherits(DematerializeObservable, __super__);\n    function DematerializeObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    DematerializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DematerializeObserver(o));\n    };\n\n    return DematerializeObservable;\n  }(ObservableBase));\n\n  var DematerializeObserver = (function (__super__) {\n    inherits(DematerializeObserver, __super__);\n\n    function DematerializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    DematerializeObserver.prototype.next = function (x) { x.accept(this._o); };\n    DematerializeObserver.prototype.error = function (e) { this._o.onError(e); };\n    DematerializeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DematerializeObserver;\n  }(AbstractObserver));\n\n  /**\n   * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n   * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n   */\n  observableProto.dematerialize = function () {\n    return new DematerializeObservable(this);\n  };\n\n  var DistinctUntilChangedObservable = (function(__super__) {\n    inherits(DistinctUntilChangedObservable, __super__);\n    function DistinctUntilChangedObservable(source, keyFn, comparer) {\n      this.source = source;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctUntilChangedObserver(o, this.keyFn, this.comparer));\n    };\n\n    return DistinctUntilChangedObservable;\n  }(ObservableBase));\n\n  var DistinctUntilChangedObserver = (function(__super__) {\n    inherits(DistinctUntilChangedObserver, __super__);\n    function DistinctUntilChangedObserver(o, keyFn, comparer) {\n      this.o = o;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      this.hasCurrentKey = false;\n      this.currentKey = null;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObserver.prototype.next = function (x) {\n      var key = x, comparerEquals;\n      if (isFunction(this.keyFn)) {\n        key = tryCatch(this.keyFn)(x);\n        if (key === errorObj) { return this.o.onError(key.e); }\n      }\n      if (this.hasCurrentKey) {\n        comparerEquals = tryCatch(this.comparer)(this.currentKey, key);\n        if (comparerEquals === errorObj) { return this.o.onError(comparerEquals.e); }\n      }\n      if (!this.hasCurrentKey || !comparerEquals) {\n        this.hasCurrentKey = true;\n        this.currentKey = key;\n        this.o.onNext(x);\n      }\n    };\n    DistinctUntilChangedObserver.prototype.error = function(e) {\n      this.o.onError(e);\n    };\n    DistinctUntilChangedObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return DistinctUntilChangedObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Returns an observable sequence that contains only distinct contiguous elements according to the keyFn and the comparer.\n  * @param {Function} [keyFn] A function to compute the comparison key for each element. If not provided, it projects the value.\n  * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n  * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n  */\n  observableProto.distinctUntilChanged = function (keyFn, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctUntilChangedObservable(this, keyFn, comparer);\n  };\n\n  var TapObservable = (function(__super__) {\n    inherits(TapObservable,__super__);\n    function TapObservable(source, observerOrOnNext, onError, onCompleted) {\n      this.source = source;\n      this._oN = observerOrOnNext;\n      this._oE = onError;\n      this._oC = onCompleted;\n      __super__.call(this);\n    }\n\n    TapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, p) {\n      this.o = o;\n      this.t = !p._oN || isFunction(p._oN) ?\n        observerCreate(p._oN || noop, p._oE || noop, p._oC || noop) :\n        p._oN;\n      this.isStopped = false;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function(x) {\n      var res = tryCatch(this.t.onNext).call(this.t, x);\n      if (res === errorObj) { this.o.onError(res.e); }\n      this.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function(err) {\n      var res = tryCatch(this.t.onError).call(this.t, err);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onError(err);\n    };\n    InnerObserver.prototype.completed = function() {\n      var res = tryCatch(this.t.onCompleted).call(this.t);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onCompleted();\n    };\n\n    return TapObservable;\n  }(ObservableBase));\n\n  /**\n  *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an o.\n  * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto['do'] = observableProto.tap = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) {\n    return new TapObservable(this, observerOrOnNext, onError, onCompleted);\n  };\n\n  /**\n  *  Invokes an action for each element in the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onNext Action to invoke for each element in the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnNext = observableProto.tapOnNext = function (onNext, thisArg) {\n    return this.tap(typeof thisArg !== 'undefined' ? function (x) { onNext.call(thisArg, x); } : onNext);\n  };\n\n  /**\n  *  Invokes an action upon exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnError = observableProto.tapOnError = function (onError, thisArg) {\n    return this.tap(noop, typeof thisArg !== 'undefined' ? function (e) { onError.call(thisArg, e); } : onError);\n  };\n\n  /**\n  *  Invokes an action upon graceful termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnCompleted = observableProto.tapOnCompleted = function (onCompleted, thisArg) {\n    return this.tap(noop, null, typeof thisArg !== 'undefined' ? function () { onCompleted.call(thisArg); } : onCompleted);\n  };\n\n  var FinallyObservable = (function (__super__) {\n    inherits(FinallyObservable, __super__);\n    function FinallyObservable(source, fn, thisArg) {\n      this.source = source;\n      this._fn = bindCallback(fn, thisArg, 0);\n      __super__.call(this);\n    }\n\n    FinallyObservable.prototype.subscribeCore = function (o) {\n      var d = tryCatch(this.source.subscribe).call(this.source, o);\n      if (d === errorObj) {\n        this._fn();\n        thrower(d.e);\n      }\n\n      return new FinallyDisposable(d, this._fn);\n    };\n\n    function FinallyDisposable(s, fn) {\n      this.isDisposed = false;\n      this._s = s;\n      this._fn = fn;\n    }\n    FinallyDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        var res = tryCatch(this._s.dispose).call(this._s);\n        this._fn();\n        res === errorObj && thrower(res.e);\n      }\n    };\n\n    return FinallyObservable;\n\n  }(ObservableBase));\n\n  /**\n   *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n   * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n   * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n   */\n  observableProto['finally'] = function (action, thisArg) {\n    return new FinallyObservable(this, action, thisArg);\n  };\n\n  var IgnoreElementsObservable = (function(__super__) {\n    inherits(IgnoreElementsObservable, __super__);\n\n    function IgnoreElementsObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    IgnoreElementsObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    function InnerObserver(o) {\n      this.o = o;\n      this.isStopped = false;\n    }\n    InnerObserver.prototype.onNext = noop;\n    InnerObserver.prototype.onError = function (err) {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onError(err);\n      }\n    };\n    InnerObserver.prototype.onCompleted = function () {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onCompleted();\n      }\n    };\n    InnerObserver.prototype.dispose = function() { this.isStopped = true; };\n    InnerObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.observer.onError(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return IgnoreElementsObservable;\n  }(ObservableBase));\n\n  /**\n   *  Ignores all elements in an observable sequence leaving only the termination messages.\n   * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n   */\n  observableProto.ignoreElements = function () {\n    return new IgnoreElementsObservable(this);\n  };\n\n  var MaterializeObservable = (function (__super__) {\n    inherits(MaterializeObservable, __super__);\n    function MaterializeObservable(source, fn) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MaterializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new MaterializeObserver(o));\n    };\n\n    return MaterializeObservable;\n  }(ObservableBase));\n\n  var MaterializeObserver = (function (__super__) {\n    inherits(MaterializeObserver, __super__);\n\n    function MaterializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    MaterializeObserver.prototype.next = function (x) { this._o.onNext(notificationCreateOnNext(x)) };\n    MaterializeObserver.prototype.error = function (e) { this._o.onNext(notificationCreateOnError(e)); this._o.onCompleted(); };\n    MaterializeObserver.prototype.completed = function () { this._o.onNext(notificationCreateOnCompleted()); this._o.onCompleted(); };\n\n    return MaterializeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n   * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n   */\n  observableProto.materialize = function () {\n    return new MaterializeObservable(this);\n  };\n\n  /**\n   *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n   * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n   * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n   */\n  observableProto.repeat = function (repeatCount) {\n    return enumerableRepeat(this, repeatCount).concat();\n  };\n\n  /**\n   *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n   *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n   *\n   * @example\n   *  var res = retried = retry.repeat();\n   *  var res = retried = retry.repeat(2);\n   * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retry = function (retryCount) {\n    return enumerableRepeat(this, retryCount).catchError();\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RetryWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RetryWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RetryWhenObservable, __super__);\n\n    RetryWhenObservable.prototype.subscribeCore = function (o) {\n      var exceptions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(exceptions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            exceptions.onNext(exn);\n            outer.dispose();\n          },\n          function() { o.onCompleted(); }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RetryWhenObservable;\n  }(ObservableBase));\n\n  observableProto.retryWhen = function (notifier) {\n    return new RetryWhenObservable(repeat(this), notifier);\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RepeatWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RepeatWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RepeatWhenObservable, __super__);\n\n    RepeatWhenObservable.prototype.subscribeCore = function (o) {\n      var completions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(completions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) { o.onError(exn); },\n          function() {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            completions.onNext(null);\n            outer.dispose();\n          }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RepeatWhenObservable;\n  }(ObservableBase));\n\n  observableProto.repeatWhen = function (notifier) {\n    return new RepeatWhenObservable(repeat(this), notifier);\n  };\n\n  var ScanObservable = (function(__super__) {\n    inherits(ScanObservable, __super__);\n    function ScanObservable(source, accumulator, hasSeed, seed) {\n      this.source = source;\n      this.accumulator = accumulator;\n      this.hasSeed = hasSeed;\n      this.seed = seed;\n      __super__.call(this);\n    }\n\n    ScanObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new ScanObserver(o,this));\n    };\n\n    return ScanObservable;\n  }(ObservableBase));\n\n  var ScanObserver = (function (__super__) {\n    inherits(ScanObserver, __super__);\n    function ScanObserver(o, parent) {\n      this._o = o;\n      this._p = parent;\n      this._fn = parent.accumulator;\n      this._hs = parent.hasSeed;\n      this._s = parent.seed;\n      this._ha = false;\n      this._a = null;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    ScanObserver.prototype.next = function (x) {\n      !this._hv && (this._hv = true);\n      if (this._ha) {\n        this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n      } else {\n        this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n        this._ha = true;\n      }\n      if (this._a === errorObj) { return this._o.onError(this._a.e); }\n      this._o.onNext(this._a);\n      this._i++;\n    };\n\n    ScanObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ScanObserver.prototype.completed = function () {\n      !this._hv && this._hs && this._o.onNext(this._s);\n      this._o.onCompleted();\n    };\n\n    return ScanObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n  *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n  * @param {Mixed} [seed] The initial accumulator value.\n  * @param {Function} accumulator An accumulator function to be invoked on each element.\n  * @returns {Observable} An observable sequence containing the accumulated values.\n  */\n  observableProto.scan = function () {\n    var hasSeed = false, seed, accumulator = arguments[0];\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new ScanObservable(this, accumulator, hasSeed, seed);\n  };\n\n  var SkipLastObservable = (function (__super__) {\n    inherits(SkipLastObservable, __super__);\n    function SkipLastObservable(source, c) {\n      this.source = source;\n      this._c = c;\n      __super__.call(this);\n    }\n\n    SkipLastObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipLastObserver(o, this._c));\n    };\n\n    return SkipLastObservable;\n  }(ObservableBase));\n\n  var SkipLastObserver = (function (__super__) {\n    inherits(SkipLastObserver, __super__);\n    function SkipLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    SkipLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._o.onNext(this._q.shift());\n    };\n\n    SkipLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    SkipLastObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return SkipLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses a specified number of elements at the end of an observable sequence.\n   * @description\n   *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n   *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n   * @param count Number of elements to bypass at the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n   */\n  observableProto.skipLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipLastObservable(this, count);\n  };\n\n  /**\n   *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n   *  @example\n   *  var res = source.startWith(1, 2, 3);\n   *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n   * @param {Arguments} args The specified values to prepend to the observable sequence\n   * @returns {Observable} The source sequence prepended with the specified values.\n   */\n  observableProto.startWith = function () {\n    var values, scheduler, start = 0;\n    if (!!arguments.length && isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      start = 1;\n    } else {\n      scheduler = immediateScheduler;\n    }\n    for(var args = [], i = start, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableConcat.apply(null, [observableFromArray(args, scheduler), this]);\n  };\n\n  var TakeLastObserver = (function (__super__) {\n    inherits(TakeLastObserver, __super__);\n    function TakeLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastObserver.prototype.completed = function () {\n      while (this._q.length > 0) { this._o.onNext(this._q.shift()); }\n      this._o.onCompleted();\n    };\n\n    return TakeLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns a specified number of contiguous elements from the end of an observable sequence.\n   * @description\n   *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n   *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastObserver(o, count));\n    }, source);\n  };\n\n  var TakeLastBufferObserver = (function (__super__) {\n    inherits(TakeLastBufferObserver, __super__);\n    function TakeLastBufferObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastBufferObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastBufferObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastBufferObserver.prototype.completed = function () {\n      this._o.onNext(this._q);\n      this._o.onCompleted();\n    };\n\n    return TakeLastBufferObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n   *\n   * @description\n   *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n   *  source sequence, this buffer is produced on the result sequence.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLastBuffer = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastBufferObserver(o, count));\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n   * @param {Number} count Length of each window.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithCount = observableProto.windowCount = function (count, skip) {\n    var source = this;\n    +count || (count = 0);\n    Math.abs(count) === Infinity && (count = 0);\n    if (count <= 0) { throw new ArgumentOutOfRangeError(); }\n    skip == null && (skip = count);\n    +skip || (skip = 0);\n    Math.abs(skip) === Infinity && (skip = 0);\n\n    if (skip <= 0) { throw new ArgumentOutOfRangeError(); }\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(),\n        refCountDisposable = new RefCountDisposable(m),\n        n = 0,\n        q = [];\n\n      function createWindow () {\n        var s = new Subject();\n        q.push(s);\n        observer.onNext(addRef(s, refCountDisposable));\n      }\n\n      createWindow();\n\n      m.setDisposable(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n          var c = n - count + 1;\n          c >= 0 && c % skip === 0 && q.shift().onCompleted();\n          ++n % skip === 0 && createWindow();\n        },\n        function (e) {\n          while (q.length > 0) { q.shift().onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          while (q.length > 0) { q.shift().onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\nobservableProto.flatMapConcat = observableProto.concatMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).merge(1);\n};\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.concatMapObserver = observableProto.selectConcatObserver = function(onNext, onError, onCompleted, thisArg) {\n    var source = this,\n        onNextFunc = bindCallback(onNext, thisArg, 2),\n        onErrorFunc = bindCallback(onError, thisArg, 1),\n        onCompletedFunc = bindCallback(onCompleted, thisArg, 0);\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNextFunc(x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onErrorFunc(err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompletedFunc();\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, this).concatAll();\n  };\n\n  var DefaultIfEmptyObserver = (function (__super__) {\n    inherits(DefaultIfEmptyObserver, __super__);\n    function DefaultIfEmptyObserver(o, d) {\n      this._o = o;\n      this._d = d;\n      this._f = false;\n      __super__.call(this);\n    }\n\n    DefaultIfEmptyObserver.prototype.next = function (x) {\n      this._f = true;\n      this._o.onNext(x);\n    };\n\n    DefaultIfEmptyObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    DefaultIfEmptyObserver.prototype.completed = function () {\n      !this._f && this._o.onNext(this._d);\n      this._o.onCompleted();\n    };\n\n    return DefaultIfEmptyObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n   *\n   *  var res = obs = xs.defaultIfEmpty();\n   *  2 - obs = xs.defaultIfEmpty(false);\n   *\n   * @memberOf Observable#\n   * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n   * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n   */\n    observableProto.defaultIfEmpty = function (defaultValue) {\n      var source = this;\n      defaultValue === undefined && (defaultValue = null);\n      return new AnonymousObservable(function (o) {\n        return source.subscribe(new DefaultIfEmptyObserver(o, defaultValue));\n      }, source);\n    };\n\n  // Swap out for Array.findIndex\n  function arrayIndexOfComparer(array, item, comparer) {\n    for (var i = 0, len = array.length; i < len; i++) {\n      if (comparer(array[i], item)) { return i; }\n    }\n    return -1;\n  }\n\n  function HashSet(comparer) {\n    this.comparer = comparer;\n    this.set = [];\n  }\n  HashSet.prototype.push = function(value) {\n    var retValue = arrayIndexOfComparer(this.set, value, this.comparer) === -1;\n    retValue && this.set.push(value);\n    return retValue;\n  };\n\n  var DistinctObservable = (function (__super__) {\n    inherits(DistinctObservable, __super__);\n    function DistinctObservable(source, keyFn, cmpFn) {\n      this.source = source;\n      this._keyFn = keyFn;\n      this._cmpFn = cmpFn;\n      __super__.call(this);\n    }\n\n    DistinctObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctObserver(o, this._keyFn, this._cmpFn));\n    };\n\n    return DistinctObservable;\n  }(ObservableBase));\n\n  var DistinctObserver = (function (__super__) {\n    inherits(DistinctObserver, __super__);\n    function DistinctObserver(o, keyFn, cmpFn) {\n      this._o = o;\n      this._keyFn = keyFn;\n      this._h = new HashSet(cmpFn);\n      __super__.call(this);\n    }\n\n    DistinctObserver.prototype.next = function (x) {\n      var key = x;\n      if (isFunction(this._keyFn)) {\n        key = tryCatch(this._keyFn)(x);\n        if (key === errorObj) { return this._o.onError(key.e); }\n      }\n      this._h.push(key) && this._o.onNext(x);\n    };\n\n    DistinctObserver.prototype.error = function (e) { this._o.onError(e); };\n    DistinctObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DistinctObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n   *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n   *\n   * @example\n   *  var res = obs = xs.distinct();\n   *  2 - obs = xs.distinct(function (x) { return x.id; });\n   *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n   * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n   * @param {Function} [comparer]  Used to compare items in the collection.\n   * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinct = function (keySelector, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctObservable(this, keySelector, comparer);\n  };\n\n  var MapObservable = (function (__super__) {\n    inherits(MapObservable, __super__);\n\n    function MapObservable(source, selector, thisArg) {\n      this.source = source;\n      this.selector = bindCallback(selector, thisArg, 3);\n      __super__.call(this);\n    }\n\n    function innerMap(selector, self) {\n      return function (x, i, o) { return selector.call(this, self.selector(x, i, o), i, o); };\n    }\n\n    MapObservable.prototype.internalMap = function (selector, thisArg) {\n      return new MapObservable(this.source, innerMap(selector, this), thisArg);\n    };\n\n    MapObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, selector, source) {\n      this.o = o;\n      this.selector = selector;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var result = tryCatch(this.selector)(x, this.i++, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n      this.o.onNext(result);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return MapObservable;\n\n  }(ObservableBase));\n\n  /**\n  * Projects each element of an observable sequence into a new form by incorporating the element's index.\n  * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n  */\n  observableProto.map = observableProto.select = function (selector, thisArg) {\n    var selectorFn = typeof selector === 'function' ? selector : function () { return selector; };\n    return this instanceof MapObservable ?\n      this.internalMap(selectorFn, thisArg) :\n      new MapObservable(this, selectorFn, thisArg);\n  };\n\n  function plucker(args, len) {\n    return function mapper(x) {\n      var currentProp = x;\n      for (var i = 0; i < len; i++) {\n        var p = currentProp[args[i]];\n        if (typeof p !== 'undefined') {\n          currentProp = p;\n        } else {\n          return undefined;\n        }\n      }\n      return currentProp;\n    };\n  }\n\n  /**\n   * Retrieves the value of a specified nested property from all elements in\n   * the Observable sequence.\n   * @param {Arguments} arguments The nested properties to pluck.\n   * @returns {Observable} Returns a new Observable sequence of property values.\n   */\n  observableProto.pluck = function () {\n    var len = arguments.length, args = new Array(len);\n    if (len === 0) { throw new Error('List of properties cannot be empty.'); }\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return this.map(plucker(args, len));\n  };\n\nobservableProto.flatMap = observableProto.selectMany = observableProto.mergeMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).mergeAll();\n};\n\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.flatMapObserver = observableProto.selectManyObserver = function (onNext, onError, onCompleted, thisArg) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNext.call(thisArg, x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onError.call(thisArg, err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompleted.call(thisArg);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, source).mergeAll();\n  };\n\nobservableProto.flatMapLatest = observableProto.switchMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).switchLatest();\n};\n\n  var SkipObservable = (function(__super__) {\n    inherits(SkipObservable, __super__);\n    function SkipObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    SkipObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipObserver(o, this._count));\n    };\n\n    function SkipObserver(o, c) {\n      this._o = o;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(SkipObserver, AbstractObserver);\n\n    SkipObserver.prototype.next = function (x) {\n      if (this._r <= 0) {\n        this._o.onNext(x);\n      } else {\n        this._r--;\n      }\n    };\n    SkipObserver.prototype.error = function(e) { this._o.onError(e); };\n    SkipObserver.prototype.completed = function() { this._o.onCompleted(); };\n\n    return SkipObservable;\n  }(ObservableBase));\n\n  /**\n   * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n   * @param {Number} count The number of elements to skip before returning the remaining elements.\n   * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n   */\n  observableProto.skip = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipObservable(this, count);\n  };\n\n  var SkipWhileObservable = (function (__super__) {\n    inherits(SkipWhileObservable, __super__);\n    function SkipWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SkipWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipWhileObserver(o, this));\n    };\n\n    return SkipWhileObservable;\n  }(ObservableBase));\n\n  var SkipWhileObserver = (function (__super__) {\n    inherits(SkipWhileObserver, __super__);\n\n    function SkipWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = false;\n      __super__.call(this);\n    }\n\n    SkipWhileObserver.prototype.next = function (x) {\n      if (!this._r) {\n        var res = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._r = !res;\n      }\n      this._r && this._o.onNext(x);\n    };\n    SkipWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n   *  The element's index is used in the logic of the predicate function.\n   *\n   *  var res = source.skipWhile(function (value) { return value < 10; });\n   *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n   */\n  observableProto.skipWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new SkipWhileObservable(this, fn);\n  };\n\n  var TakeObservable = (function(__super__) {\n    inherits(TakeObservable, __super__);\n    function TakeObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    TakeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeObserver(o, this._count));\n    };\n\n    function TakeObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(TakeObserver, AbstractObserver);\n\n    TakeObserver.prototype.next = function (x) {\n      if (this._r-- > 0) {\n        this._o.onNext(x);\n        this._r <= 0 && this._o.onCompleted();\n      }\n    };\n\n    TakeObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n   * @param {Number} count The number of elements to return.\n   * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n   * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n   */\n  observableProto.take = function (count, scheduler) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    if (count === 0) { return observableEmpty(scheduler); }\n    return new TakeObservable(this, count);\n  };\n\n  var TakeWhileObservable = (function (__super__) {\n    inherits(TakeWhileObservable, __super__);\n    function TakeWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    TakeWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeWhileObserver(o, this));\n    };\n\n    return TakeWhileObservable;\n  }(ObservableBase));\n\n  var TakeWhileObserver = (function (__super__) {\n    inherits(TakeWhileObserver, __super__);\n\n    function TakeWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = true;\n      __super__.call(this);\n    }\n\n    TakeWhileObserver.prototype.next = function (x) {\n      if (this._r) {\n        this._r = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (this._r === errorObj) { return this._o.onError(this._r.e); }\n      }\n      if (this._r) {\n        this._o.onNext(x);\n      } else {\n        this._o.onCompleted();\n      }\n    };\n    TakeWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns elements from an observable sequence as long as a specified condition is true.\n   *  The element's index is used in the logic of the predicate function.\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n   */\n  observableProto.takeWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new TakeWhileObservable(this, fn);\n  };\n\n  var FilterObservable = (function (__super__) {\n    inherits(FilterObservable, __super__);\n\n    function FilterObservable(source, predicate, thisArg) {\n      this.source = source;\n      this.predicate = bindCallback(predicate, thisArg, 3);\n      __super__.call(this);\n    }\n\n    FilterObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.predicate, this));\n    };\n\n    function innerPredicate(predicate, self) {\n      return function(x, i, o) { return self.predicate(x, i, o) && predicate.call(this, x, i, o); }\n    }\n\n    FilterObservable.prototype.internalFilter = function(predicate, thisArg) {\n      return new FilterObservable(this.source, innerPredicate(predicate, this), thisArg);\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, predicate, source) {\n      this.o = o;\n      this.predicate = predicate;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var shouldYield = tryCatch(this.predicate)(x, this.i++, this.source);\n      if (shouldYield === errorObj) {\n        return this.o.onError(shouldYield.e);\n      }\n      shouldYield && this.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return FilterObservable;\n\n  }(ObservableBase));\n\n  /**\n  *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n  * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n  */\n  observableProto.filter = observableProto.where = function (predicate, thisArg) {\n    return this instanceof FilterObservable ? this.internalFilter(predicate, thisArg) :\n      new FilterObservable(this, predicate, thisArg);\n  };\n\n  var TransduceObserver = (function (__super__) {\n    inherits(TransduceObserver, __super__);\n    function TransduceObserver(o, xform) {\n      this._o = o;\n      this._xform = xform;\n      __super__.call(this);\n    }\n\n    TransduceObserver.prototype.next = function (x) {\n      var res = tryCatch(this._xform['@@transducer/step']).call(this._xform, this._o, x);\n      if (res === errorObj) { this._o.onError(res.e); }\n    };\n\n    TransduceObserver.prototype.error = function (e) { this._o.onError(e); };\n\n    TransduceObserver.prototype.completed = function () {\n      this._xform['@@transducer/result'](this._o);\n    };\n\n    return TransduceObserver;\n  }(AbstractObserver));\n\n  function transformForObserver(o) {\n    return {\n      '@@transducer/init': function() {\n        return o;\n      },\n      '@@transducer/step': function(obs, input) {\n        return obs.onNext(input);\n      },\n      '@@transducer/result': function(obs) {\n        return obs.onCompleted();\n      }\n    };\n  }\n\n  /**\n   * Executes a transducer to transform the observable sequence\n   * @param {Transducer} transducer A transducer to execute\n   * @returns {Observable} An Observable sequence containing the results from the transducer.\n   */\n  observableProto.transduce = function(transducer) {\n    var source = this;\n    return new AnonymousObservable(function(o) {\n      var xform = transducer(transformForObserver(o));\n      return source.subscribe(new TransduceObserver(o, xform));\n    }, source);\n  };\n\n  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {\n    inherits(AnonymousObservable, __super__);\n\n    // Fix subscriber to check for undefined or function returned to decorate as Disposable\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.__subscribe).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function AnonymousObservable(subscribe, parent) {\n      this.source = parent;\n      this.__subscribe = subscribe;\n      __super__.call(this);\n    }\n\n    AnonymousObservable.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    return AnonymousObservable;\n\n  }(Observable));\n\n  var AutoDetachObserver = (function (__super__) {\n    inherits(AutoDetachObserver, __super__);\n\n    function AutoDetachObserver(observer) {\n      __super__.call(this);\n      this.observer = observer;\n      this.m = new SingleAssignmentDisposable();\n    }\n\n    var AutoDetachObserverPrototype = AutoDetachObserver.prototype;\n\n    AutoDetachObserverPrototype.next = function (value) {\n      var result = tryCatch(this.observer.onNext).call(this.observer, value);\n      if (result === errorObj) {\n        this.dispose();\n        thrower(result.e);\n      }\n    };\n\n    AutoDetachObserverPrototype.error = function (err) {\n      var result = tryCatch(this.observer.onError).call(this.observer, err);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.completed = function () {\n      var result = tryCatch(this.observer.onCompleted).call(this.observer);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };\n    AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };\n\n    AutoDetachObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.m.dispose();\n    };\n\n    return AutoDetachObserver;\n  }(AbstractObserver));\n\n  var InnerSubscription = function (s, o) {\n    this._s = s;\n    this._o = o;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this._s.isDisposed && this._o !== null) {\n      var idx = this._s.observers.indexOf(this._o);\n      this._s.observers.splice(idx, 1);\n      this._o = null;\n    }\n  };\n\n  /**\n   *  Represents an object that is both an observable sequence as well as an observer.\n   *  Each notification is broadcasted to all subscribed observers.\n   */\n  var Subject = Rx.Subject = (function (__super__) {\n    inherits(Subject, __super__);\n    function Subject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(Subject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n          return disposableEmpty;\n        }\n        o.onCompleted();\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onCompleted();\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.error = error;\n          this.hasError = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onNext(value);\n          }\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    /**\n     * Creates a subject from the specified observer and observable.\n     * @param {Observer} observer The observer used to send messages to the subject.\n     * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n     * @returns {Subject} Subject implemented using the given observer and observable.\n     */\n    Subject.create = function (observer, observable) {\n      return new AnonymousSubject(observer, observable);\n    };\n\n    return Subject;\n  }(Observable));\n\n  /**\n   *  Represents the result of an asynchronous operation.\n   *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n   */\n  var AsyncSubject = Rx.AsyncSubject = (function (__super__) {\n    inherits(AsyncSubject, __super__);\n\n    /**\n     * Creates a subject that can only receive one value and that value is cached for all future observations.\n     * @constructor\n     */\n    function AsyncSubject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasValue = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(AsyncSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n\n        if (this.hasError) {\n          o.onError(this.error);\n        } else if (this.hasValue) {\n          o.onNext(this.value);\n          o.onCompleted();\n        } else {\n          o.onCompleted();\n        }\n\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n       */\n      onCompleted: function () {\n        var i, len;\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          var os = cloneArray(this.observers), len = os.length;\n\n          if (this.hasValue) {\n            for (i = 0; i < len; i++) {\n              var o = os[i];\n              o.onNext(this.value);\n              o.onCompleted();\n            }\n          } else {\n            for (i = 0; i < len; i++) {\n              os[i].onCompleted();\n            }\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the error.\n       * @param {Mixed} error The Error to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.hasError = true;\n          this.error = error;\n\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n       * @param {Mixed} value The value to store in the subject.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        this.hasValue = true;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.error = null;\n        this.value = null;\n      }\n    });\n\n    return AsyncSubject;\n  }(Observable));\n\n  var AnonymousSubject = Rx.AnonymousSubject = (function (__super__) {\n    inherits(AnonymousSubject, __super__);\n    function AnonymousSubject(observer, observable) {\n      this.observer = observer;\n      this.observable = observable;\n      __super__.call(this);\n    }\n\n    addProperties(AnonymousSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        return this.observable.subscribe(o);\n      },\n      onCompleted: function () {\n        this.observer.onCompleted();\n      },\n      onError: function (error) {\n        this.observer.onError(error);\n      },\n      onNext: function (value) {\n        this.observer.onNext(value);\n      }\n    });\n\n    return AnonymousSubject;\n  }(Observable));\n\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    root.Rx = Rx;\n\n    define(function() {\n      return Rx;\n    });\n  } else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = Rx).Rx = Rx;\n    } else {\n      freeExports.Rx = Rx;\n    }\n  } else {\n    // in a browser or Rhino\n    root.Rx = Rx;\n  }\n\n  // All code before this point will be filtered from stack traces.\n  var rEndingLine = captureLine();\n\n}.call(this));\n"
  },
  {
    "path": "dist/rx.core.binding.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n    // Because of build optimizers\n    if (typeof define === 'function' && define.amd) {\n        define(['./rx.core'], function (Rx, exports) {\n            return factory(root, exports, Rx);\n        });\n    } else if (typeof module === 'object' && module && module.exports === freeExports) {\n        module.exports = factory(root, module.exports, require('./rx.core'));\n    } else {\n        root.Rx = factory(root, {}, root.Rx);\n    }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    ObservableBase = Rx.ObservableBase,\n    Observer = Rx.Observer,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    disposableCreate = Rx.Disposable.create,\n    disposableEmpty = Rx.Disposable.empty,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    currentThreadScheduler = Rx.Scheduler.currentThread,\n    isFunction = Rx.helpers.isFunction,\n    inherits = Rx.internals.inherits,\n    addProperties = Rx.internals.addProperties,\n    checkDisposed = Rx.Disposable.checkDisposed;\n\n  // Utilities\n  function cloneArray(arr) {\n    var len = arr.length, a = new Array(len);\n    for(var i = 0; i < len; i++) { a[i] = arr[i]; }\n    return a;\n  }\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  var MulticastObservable = (function (__super__) {\n    inherits(MulticastObservable, __super__);\n    function MulticastObservable(source, fn1, fn2) {\n      this.source = source;\n      this._fn1 = fn1;\n      this._fn2 = fn2;\n      __super__.call(this);\n    }\n\n    MulticastObservable.prototype.subscribeCore = function (o) {\n      var connectable = this.source.multicast(this._fn1());\n      return new BinaryDisposable(this._fn2(connectable).subscribe(o), connectable.connect());\n    };\n\n    return MulticastObservable;\n  }(ObservableBase));\n\n  /**\n   * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n   * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n   * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n   *\n   * @example\n   * 1 - res = source.multicast(observable);\n   * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n   *\n   * @param {Function|Subject} subjectOrSubjectSelector\n   * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n   * Or:\n   * Subject to push source elements into.\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.multicast = function (subjectOrSubjectSelector, selector) {\n    return isFunction(subjectOrSubjectSelector) ?\n      new MulticastObservable(this, subjectOrSubjectSelector, selector) :\n      new ConnectableObservable(this, subjectOrSubjectSelector);\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of Multicast using a regular Subject.\n   *\n   * @example\n   * var resres = source.publish();\n   * var res = source.publish(function (x) { return x; });\n   *\n   * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publish = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new Subject(); }, selector) :\n      this.multicast(new Subject());\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.share = function () {\n    return this.publish().refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n   * This operator is a specialization of Multicast using a AsyncSubject.\n   *\n   * @example\n   * var res = source.publishLast();\n   * var res = source.publishLast(function (x) { return x; });\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishLast = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new AsyncSubject(); }, selector) :\n      this.multicast(new AsyncSubject());\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n   * This operator is a specialization of Multicast using a BehaviorSubject.\n   *\n   * @example\n   * var res = source.publishValue(42);\n   * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishValue = function (initialValueOrSelector, initialValue) {\n    return arguments.length === 2 ?\n      this.multicast(function () {\n        return new BehaviorSubject(initialValue);\n      }, initialValueOrSelector) :\n      this.multicast(new BehaviorSubject(initialValueOrSelector));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n   * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareValue = function (initialValue) {\n    return this.publishValue(initialValue).refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of Multicast using a ReplaySubject.\n   *\n   * @example\n   * var res = source.replay(null, 3);\n   * var res = source.replay(null, 3, 500);\n   * var res = source.replay(null, 3, 500, scheduler);\n   * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param windowSize [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.replay = function (selector, bufferSize, windowSize, scheduler) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new ReplaySubject(bufferSize, windowSize, scheduler); }, selector) :\n      this.multicast(new ReplaySubject(bufferSize, windowSize, scheduler));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   *\n   * @example\n   * var res = source.shareReplay(3);\n   * var res = source.shareReplay(3, 500);\n   * var res = source.shareReplay(3, 500, scheduler);\n   *\n\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareReplay = function (bufferSize, windowSize, scheduler) {\n    return this.replay(null, bufferSize, windowSize, scheduler).refCount();\n  };\n\n  var ScheduledObserver = Rx.internals.ScheduledObserver = (function (__super__) {\n    inherits(ScheduledObserver, __super__);\n\n    function ScheduledObserver(scheduler, observer) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.observer = observer;\n      this.isAcquired = false;\n      this.hasFaulted = false;\n      this.queue = [];\n      this.disposable = new SerialDisposable();\n    }\n\n    function enqueueNext(observer, x) { return function () { observer.onNext(x); }; }\n    function enqueueError(observer, e) { return function () { observer.onError(e); }; }\n    function enqueueCompleted(observer) { return function () { observer.onCompleted(); }; }\n\n    ScheduledObserver.prototype.next = function (x) {\n      this.queue.push(enqueueNext(this.observer, x));\n    };\n\n    ScheduledObserver.prototype.error = function (e) {\n      this.queue.push(enqueueError(this.observer, e));\n    };\n\n    ScheduledObserver.prototype.completed = function () {\n      this.queue.push(enqueueCompleted(this.observer));\n    };\n\n\n    function scheduleMethod(state, recurse) {\n      var work;\n      if (state.queue.length > 0) {\n        work = state.queue.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var res = tryCatch(work)();\n      if (res === errorObj) {\n        state.queue = [];\n        state.hasFaulted = true;\n        return thrower(res.e);\n      }\n      recurse(state);\n    }\n\n    ScheduledObserver.prototype.ensureActive = function () {\n      var isOwner = false;\n      if (!this.hasFaulted && this.queue.length > 0) {\n        isOwner = !this.isAcquired;\n        this.isAcquired = true;\n      }\n      isOwner &&\n        this.disposable.setDisposable(this.scheduler.scheduleRecursive(this, scheduleMethod));\n    };\n\n    ScheduledObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.disposable.dispose();\n    };\n\n    return ScheduledObserver;\n  }(AbstractObserver));\n\n  var InnerSubscription = function (s, o) {\n    this._s = s;\n    this._o = o;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this._s.isDisposed && this._o !== null) {\n      var idx = this._s.observers.indexOf(this._o);\n      this._s.observers.splice(idx, 1);\n      this._o = null;\n    }\n  };\n\n  /**\n   *  Represents an object that is both an observable sequence as well as an observer.\n   *  Each notification is broadcasted to all subscribed observers.\n   */\n  var Subject = Rx.Subject = (function (__super__) {\n    inherits(Subject, __super__);\n    function Subject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(Subject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n          return disposableEmpty;\n        }\n        o.onCompleted();\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onCompleted();\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.error = error;\n          this.hasError = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onNext(value);\n          }\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    /**\n     * Creates a subject from the specified observer and observable.\n     * @param {Observer} observer The observer used to send messages to the subject.\n     * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n     * @returns {Subject} Subject implemented using the given observer and observable.\n     */\n    Subject.create = function (observer, observable) {\n      return new AnonymousSubject(observer, observable);\n    };\n\n    return Subject;\n  }(Observable));\n\n  var AnonymousSubject = Rx.AnonymousSubject = (function (__super__) {\n    inherits(AnonymousSubject, __super__);\n    function AnonymousSubject(observer, observable) {\n      this.observer = observer;\n      this.observable = observable;\n      __super__.call(this);\n    }\n\n    addProperties(AnonymousSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        return this.observable.subscribe(o);\n      },\n      onCompleted: function () {\n        this.observer.onCompleted();\n      },\n      onError: function (error) {\n        this.observer.onError(error);\n      },\n      onNext: function (value) {\n        this.observer.onNext(value);\n      }\n    });\n\n    return AnonymousSubject;\n  }(Observable));\n\n  /**\n   *  Represents the result of an asynchronous operation.\n   *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n   */\n  var AsyncSubject = Rx.AsyncSubject = (function (__super__) {\n    inherits(AsyncSubject, __super__);\n\n    /**\n     * Creates a subject that can only receive one value and that value is cached for all future observations.\n     * @constructor\n     */\n    function AsyncSubject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasValue = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(AsyncSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n\n        if (this.hasError) {\n          o.onError(this.error);\n        } else if (this.hasValue) {\n          o.onNext(this.value);\n          o.onCompleted();\n        } else {\n          o.onCompleted();\n        }\n\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n       */\n      onCompleted: function () {\n        var i, len;\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          var os = cloneArray(this.observers), len = os.length;\n\n          if (this.hasValue) {\n            for (i = 0; i < len; i++) {\n              var o = os[i];\n              o.onNext(this.value);\n              o.onCompleted();\n            }\n          } else {\n            for (i = 0; i < len; i++) {\n              os[i].onCompleted();\n            }\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the error.\n       * @param {Mixed} error The Error to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.hasError = true;\n          this.error = error;\n\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n       * @param {Mixed} value The value to store in the subject.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        this.hasValue = true;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.error = null;\n        this.value = null;\n      }\n    });\n\n    return AsyncSubject;\n  }(Observable));\n\n  /**\n   *  Represents a value that changes over time.\n   *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n   */\n  var BehaviorSubject = Rx.BehaviorSubject = (function (__super__) {\n    inherits(BehaviorSubject, __super__);\n    function BehaviorSubject(value) {\n      __super__.call(this);\n      this.value = value;\n      this.observers = [];\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasError = false;\n    }\n\n    addProperties(BehaviorSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          o.onNext(this.value);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n        } else {\n          o.onCompleted();\n        }\n        return disposableEmpty;\n      },\n      /**\n       * Gets the current value or throws an exception.\n       * Value is frozen after onCompleted is called.\n       * After onError is called always throws the specified exception.\n       * An exception is always thrown after dispose is called.\n       * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n       */\n      getValue: function () {\n        checkDisposed(this);\n        if (this.hasError) { thrower(this.error); }\n        return this.value;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onCompleted();\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.hasError = true;\n        this.error = error;\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onError(error);\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onNext(value);\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.value = null;\n        this.error = null;\n      }\n    });\n\n    return BehaviorSubject;\n  }(Observable));\n\n  /**\n   * Represents an object that is both an observable sequence as well as an observer.\n   * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n   */\n  var ReplaySubject = Rx.ReplaySubject = (function (__super__) {\n\n    var maxSafeInteger = Math.pow(2, 53) - 1;\n\n    function createRemovableDisposable(subject, observer) {\n      return disposableCreate(function () {\n        observer.dispose();\n        !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n      });\n    }\n\n    inherits(ReplaySubject, __super__);\n\n    /**\n     *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n     *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n     *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n     *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n     */\n    function ReplaySubject(bufferSize, windowSize, scheduler) {\n      this.bufferSize = bufferSize == null ? maxSafeInteger : bufferSize;\n      this.windowSize = windowSize == null ? maxSafeInteger : windowSize;\n      this.scheduler = scheduler || currentThreadScheduler;\n      this.q = [];\n      this.observers = [];\n      this.isStopped = false;\n      this.isDisposed = false;\n      this.hasError = false;\n      this.error = null;\n      __super__.call(this);\n    }\n\n    addProperties(ReplaySubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        var so = new ScheduledObserver(this.scheduler, o), subscription = createRemovableDisposable(this, so);\n\n        this._trim(this.scheduler.now());\n        this.observers.push(so);\n\n        for (var i = 0, len = this.q.length; i < len; i++) {\n          so.onNext(this.q[i].value);\n        }\n\n        if (this.hasError) {\n          so.onError(this.error);\n        } else if (this.isStopped) {\n          so.onCompleted();\n        }\n\n        so.ensureActive();\n        return subscription;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      _trim: function (now) {\n        while (this.q.length > this.bufferSize) {\n          this.q.shift();\n        }\n        while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {\n          this.q.shift();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        var now = this.scheduler.now();\n        this.q.push({ interval: now, value: value });\n        this._trim(now);\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onNext(value);\n          observer.ensureActive();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.error = error;\n        this.hasError = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onError(error);\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onCompleted();\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    return ReplaySubject;\n  }(Observable));\n\n  var RefCountObservable = (function (__super__) {\n    inherits(RefCountObservable, __super__);\n    function RefCountObservable(source) {\n      this.source = source;\n      this._count = 0;\n      this._connectableSubscription = null;\n      __super__.call(this);\n    }\n\n    RefCountObservable.prototype.subscribeCore = function (o) {\n      var subscription = this.source.subscribe(o);\n      ++this._count === 1 && (this._connectableSubscription = this.source.connect());\n      return new RefCountDisposable(this, subscription);\n    };\n\n    function RefCountDisposable(p, s) {\n      this._p = p;\n      this._s = s;\n      this.isDisposed = false;\n    }\n\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this._s.dispose();\n        --this._p._count === 0 && this._p._connectableSubscription.dispose();\n      }\n    };\n\n    return RefCountObservable;\n  }(ObservableBase));\n\n  var ConnectableObservable = Rx.ConnectableObservable = (function (__super__) {\n    inherits(ConnectableObservable, __super__);\n    function ConnectableObservable(source, subject) {\n      this.source = source;\n      this._connection = null;\n      this._source = source.asObservable();\n      this._subject = subject;\n      __super__.call(this);\n    }\n\n    function ConnectDisposable(parent, subscription) {\n      this._p = parent;\n      this._s = subscription;\n    }\n\n    ConnectDisposable.prototype.dispose = function () {\n      if (this._s) {\n        this._s.dispose();\n        this._s = null;\n        this._p._connection = null;\n      }\n    };\n\n    ConnectableObservable.prototype.connect = function () {\n      if (!this._connection) {\n        if (this._subject.isStopped) {\n          return disposableEmpty;\n        }\n        var subscription = this._source.subscribe(this._subject);\n        this._connection = new ConnectDisposable(this, subscription);\n      }\n      return this._connection;\n    };\n\n    ConnectableObservable.prototype._subscribe = function (o) {\n      return this._subject.subscribe(o);\n    };\n\n    ConnectableObservable.prototype.refCount = function () {\n      return new RefCountObservable(this);\n    };\n\n    return ConnectableObservable;\n  }(Observable));\n\n  return Rx;\n}));\n"
  },
  {
    "path": "dist/rx.core.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (undefined) {\n\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  var Rx = {\n    internals: {},\n    config: {\n      Promise: root.Promise\n    },\n    helpers: { }\n  };\n\n// Defaults\nvar\n  noop = Rx.helpers.noop = function () { },\n  defaultNow = Rx.helpers.defaultNow = (function () { return !!Date.now ? Date.now : function () { return +new Date; }; }()),\n  defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n  isPromise = Rx.helpers.isPromise = function (p) { return !!p && !isFunction(p.subscribe) && isFunction(p.then); },\n  defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); }\n  isFunction = Rx.helpers.isFunction = (function () {\n    var isFn = function (value) {\n      return typeof value == 'function' || false;\n    };\n\n    // fallback for older versions of Chrome and Safari\n    if (isFn(/x/)) {\n      isFn = function(value) {\n        return typeof value == 'function' && toString.call(value) == '[object Function]';\n      };\n    }\n    return isFn;\n  }());\n\n  var NotImplementedError = Rx.NotImplementedError = function (message) {\n    this.message = message || 'This operation is not implemented';\n    Error.call(this);\n  };\n  NotImplementedError.prototype = Error.prototype;\n\n  var NotSupportedError = Rx.NotSupportedError = function (message) {\n    this.message = message || 'This operation is not supported';\n    Error.call(this);\n  };\n  NotSupportedError.prototype = Error.prototype;\n\n  var notImplemented = Rx.helpers.notImplemented = function () {\n    throw new NotImplementedError();\n  };\n\n  var notSupported = Rx.helpers.notSupported = function () {\n    throw new NotSupportedError();\n  };\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  Rx.config.longStackSupport = false;\n  var hasStacks = false, stacks = tryCatch(function () { throw new Error(); })();\n  hasStacks = !!stacks.e && !!stacks.e.stack;\n\n  // All code after this point will be filtered from stack traces reported by RxJS\n  var rStartingLine = captureLine(), rFileName;\n\n  var STACK_JUMP_SEPARATOR = 'From previous event:';\n\n  function makeStackTraceLong(error, observable) {\n    // If possible, transform the error stack trace by removing Node and RxJS\n    // cruft, then concatenating with the stack trace of `observable`.\n    if (hasStacks &&\n        observable.stack &&\n        typeof error === 'object' &&\n        error !== null &&\n        error.stack &&\n        error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n    ) {\n      var stacks = [];\n      for (var o = observable; !!o; o = o.source) {\n        if (o.stack) {\n          stacks.unshift(o.stack);\n        }\n      }\n      stacks.unshift(error.stack);\n\n      var concatedStacks = stacks.join('\\n' + STACK_JUMP_SEPARATOR + '\\n');\n      error.stack = filterStackString(concatedStacks);\n    }\n  }\n\n  function filterStackString(stackString) {\n    var lines = stackString.split('\\n'), desiredLines = [];\n    for (var i = 0, len = lines.length; i < len; i++) {\n      var line = lines[i];\n\n      if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n        desiredLines.push(line);\n      }\n    }\n    return desiredLines.join('\\n');\n  }\n\n  function isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n    if (!fileNameAndLineNumber) {\n      return false;\n    }\n    var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === rFileName &&\n      lineNumber >= rStartingLine &&\n      lineNumber <= rEndingLine;\n  }\n\n  function isNodeFrame(stackLine) {\n    return stackLine.indexOf('(module.js:') !== -1 ||\n      stackLine.indexOf('(node.js:') !== -1;\n  }\n\n  function captureLine() {\n    if (!hasStacks) { return; }\n\n    try {\n      throw new Error();\n    } catch (e) {\n      var lines = e.stack.split('\\n');\n      var firstLine = lines[0].indexOf('@') > 0 ? lines[1] : lines[2];\n      var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n      if (!fileNameAndLineNumber) { return; }\n\n      rFileName = fileNameAndLineNumber[0];\n      return fileNameAndLineNumber[1];\n    }\n  }\n\n  function getFileNameAndLineNumber(stackLine) {\n    // Named functions: 'at functionName (filename:lineNumber:columnNumber)'\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }\n\n    // Anonymous functions: 'at filename:lineNumber:columnNumber'\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }\n\n    // Firefox style: 'function@filename:lineNumber or @filename:lineNumber'\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }\n  }\n\n  var hasProp = {}.hasOwnProperty,\n      slice = Array.prototype.slice;\n\n  var inherits = Rx.internals.inherits = function (child, parent) {\n    function __() { this.constructor = child; }\n    __.prototype = parent.prototype;\n    child.prototype = new __();\n  };\n\n  var addProperties = Rx.internals.addProperties = function (obj) {\n    for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n      var source = sources[idx];\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n  };\n\n  // Rx Utils\n  var addRef = Rx.internals.addRef = function (xs, r) {\n    return new AnonymousObservable(function (observer) {\n      return new BinaryDisposable(r.getDisposable(), xs.subscribe(observer));\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n\n  /**\n   * Represents a group of disposable resources that are disposed together.\n   * @constructor\n   */\n  var CompositeDisposable = Rx.CompositeDisposable = function () {\n    var args = [], i, len;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      len = arguments.length;\n      args = new Array(len);\n      for(i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    this.disposables = args;\n    this.isDisposed = false;\n    this.length = args.length;\n  };\n\n  var CompositeDisposablePrototype = CompositeDisposable.prototype;\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Mixed} item Disposable to add.\n   */\n  CompositeDisposablePrototype.add = function (item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n      this.length++;\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Mixed} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n  CompositeDisposablePrototype.remove = function (item) {\n    var shouldDispose = false;\n    if (!this.isDisposed) {\n      var idx = this.disposables.indexOf(item);\n      if (idx !== -1) {\n        shouldDispose = true;\n        this.disposables.splice(idx, 1);\n        this.length--;\n        item.dispose();\n      }\n    }\n    return shouldDispose;\n  };\n\n  /**\n   *  Disposes all disposables in the group and removes them from the group.\n   */\n  CompositeDisposablePrototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var len = this.disposables.length, currentDisposables = new Array(len);\n      for(var i = 0; i < len; i++) { currentDisposables[i] = this.disposables[i]; }\n      this.disposables = [];\n      this.length = 0;\n\n      for (i = 0; i < len; i++) {\n        currentDisposables[i].dispose();\n      }\n    }\n  };\n\n  /**\n   * Provides a set of static methods for creating Disposables.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   */\n  var Disposable = Rx.Disposable = function (action) {\n    this.isDisposed = false;\n    this.action = action || noop;\n  };\n\n  /** Performs the task of cleaning up resources. */\n  Disposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.action();\n      this.isDisposed = true;\n    }\n  };\n\n  /**\n   * Creates a disposable object that invokes the specified action when disposed.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   * @return {Disposable} The disposable object that runs the given action upon disposal.\n   */\n  var disposableCreate = Disposable.create = function (action) { return new Disposable(action); };\n\n  /**\n   * Gets the disposable that does nothing when disposed.\n   */\n  var disposableEmpty = Disposable.empty = { dispose: noop };\n\n  /**\n   * Validates whether the given object is a disposable\n   * @param {Object} Object to test whether it has a dispose method\n   * @returns {Boolean} true if a disposable object, else false.\n   */\n  var isDisposable = Disposable.isDisposable = function (d) {\n    return d && isFunction(d.dispose);\n  };\n\n  var checkDisposed = Disposable.checkDisposed = function (disposable) {\n    if (disposable.isDisposed) { throw new ObjectDisposedError(); }\n  };\n\n  var disposableFixup = Disposable._fixup = function (result) {\n    return isDisposable(result) ? result : disposableEmpty;\n  };\n\n  // Single assignment\n  var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SingleAssignmentDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SingleAssignmentDisposable.prototype.setDisposable = function (value) {\n    if (this.current) { throw new Error('Disposable has already been assigned'); }\n    var shouldDispose = this.isDisposed;\n    !shouldDispose && (this.current = value);\n    shouldDispose && value && value.dispose();\n  };\n  SingleAssignmentDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n      old && old.dispose();\n    }\n  };\n\n  // Multiple assignment disposable\n  var SerialDisposable = Rx.SerialDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SerialDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SerialDisposable.prototype.setDisposable = function (value) {\n    var shouldDispose = this.isDisposed;\n    if (!shouldDispose) {\n      var old = this.current;\n      this.current = value;\n    }\n    old && old.dispose();\n    shouldDispose && value && value.dispose();\n  };\n  SerialDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n    }\n    old && old.dispose();\n  };\n\n  var BinaryDisposable = Rx.BinaryDisposable = function (first, second) {\n    this._first = first;\n    this._second = second;\n    this.isDisposed = false;\n  };\n\n  BinaryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old1 = this._first;\n      this._first = null;\n      old1 && old1.dispose();\n      var old2 = this._second;\n      this._second = null;\n      old2 && old2.dispose();\n    }\n  };\n\n  var NAryDisposable = Rx.NAryDisposable = function (disposables) {\n    this._disposables = disposables;\n    this.isDisposed = false;\n  };\n\n  NAryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      for (var i = 0, len = this._disposables.length; i < len; i++) {\n        this._disposables[i].dispose();\n      }\n      this._disposables.length = 0;\n    }\n  };\n\n  var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) {\n    this.scheduler = scheduler;\n    this.state = state;\n    this.action = action;\n    this.dueTime = dueTime;\n    this.comparer = comparer || defaultSubComparer;\n    this.disposable = new SingleAssignmentDisposable();\n  };\n\n  ScheduledItem.prototype.invoke = function () {\n    this.disposable.setDisposable(this.invokeCore());\n  };\n\n  ScheduledItem.prototype.compareTo = function (other) {\n    return this.comparer(this.dueTime, other.dueTime);\n  };\n\n  ScheduledItem.prototype.isCancelled = function () {\n    return this.disposable.isDisposed;\n  };\n\n  ScheduledItem.prototype.invokeCore = function () {\n    return disposableFixup(this.action(this.scheduler, this.state));\n  };\n\n  /** Provides a set of static properties to access commonly used schedulers. */\n  var Scheduler = Rx.Scheduler = (function () {\n\n    function Scheduler() { }\n\n    /** Determines whether the given object is a scheduler */\n    Scheduler.isScheduler = function (s) {\n      return s instanceof Scheduler;\n    };\n\n    var schedulerProto = Scheduler.prototype;\n\n    /**\n   * Schedules an action to be executed.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.schedule = function (state, action) {\n      throw new NotImplementedError();\n    };\n\n  /**\n   * Schedules an action to be executed after dueTime.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @param {Number} dueTime Relative time after which to execute the action.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime;\n      dt instanceof Date && (dt = dt - this.now());\n      dt = Scheduler.normalize(dt);\n\n      if (dt === 0) { return this.schedule(state, action); }\n\n      return this._scheduleFuture(state, dt, action);\n    };\n\n    schedulerProto._scheduleFuture = function (state, dueTime, action) {\n      throw new NotImplementedError();\n    };\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.now = defaultNow;\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.prototype.now = defaultNow;\n\n    /**\n     * Normalizes the specified TimeSpan value to a positive value.\n     * @param {Number} timeSpan The time span value to normalize.\n     * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n     */\n    Scheduler.normalize = function (timeSpan) {\n      timeSpan < 0 && (timeSpan = 0);\n      return timeSpan;\n    };\n\n    return Scheduler;\n  }());\n\n  var normalizeTime = Scheduler.normalize, isScheduler = Scheduler.isScheduler;\n\n  (function (schedulerProto) {\n\n    function invokeRecImmediate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.schedule(state2, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    function invokeRecDate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2, dueTime1) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.scheduleFuture(state2, dueTime1, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursive = function (state, action) {\n      return this.schedule([state, action], invokeRecImmediate);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative or absolute due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number | Date} dueTime Relative or absolute time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveFuture = function (state, dueTime, action) {\n      return this.scheduleFuture([state, action], dueTime, invokeRecDate);\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    schedulerProto.schedulePeriodic = function(state, period, action) {\n      if (typeof root.setInterval === 'undefined') { throw new NotSupportedError(); }\n      period = normalizeTime(period);\n      var s = state, id = root.setInterval(function () { s = action(s); }, period);\n      return disposableCreate(function () { root.clearInterval(id); });\n    };\n\n  }(Scheduler.prototype));\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function createTick(self) {\n      return function tick(command, recurse) {\n        recurse(0, self._period);\n        var state = tryCatch(self._action)(self._state);\n        if (state === errorObj) {\n          self._cancel.dispose();\n          thrower(state.e);\n        }\n        self._state = state;\n      };\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveFuture(0, this._period, createTick(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  /** Gets a scheduler that schedules work immediately on the current thread. */\n   var ImmediateScheduler = (function (__super__) {\n    inherits(ImmediateScheduler, __super__);\n    function ImmediateScheduler() {\n      __super__.call(this);\n    }\n\n    ImmediateScheduler.prototype.schedule = function (state, action) {\n      return disposableFixup(action(this, state));\n    };\n\n    return ImmediateScheduler;\n  }(Scheduler));\n\n  var immediateScheduler = Scheduler.immediate = new ImmediateScheduler();\n\n  /**\n   * Gets a scheduler that schedules work as soon as possible on the current thread.\n   */\n  var CurrentThreadScheduler = (function (__super__) {\n    var queue;\n\n    function runTrampoline () {\n      while (queue.length > 0) {\n        var item = queue.dequeue();\n        !item.isCancelled() && item.invoke();\n      }\n    }\n\n    inherits(CurrentThreadScheduler, __super__);\n    function CurrentThreadScheduler() {\n      __super__.call(this);\n    }\n\n    CurrentThreadScheduler.prototype.schedule = function (state, action) {\n      var si = new ScheduledItem(this, state, action, this.now());\n\n      if (!queue) {\n        queue = new PriorityQueue(4);\n        queue.enqueue(si);\n\n        var result = tryCatch(runTrampoline)();\n        queue = null;\n        if (result === errorObj) { thrower(result.e); }\n      } else {\n        queue.enqueue(si);\n      }\n      return si.disposable;\n    };\n\n    CurrentThreadScheduler.prototype.scheduleRequired = function () { return !queue; };\n\n    return CurrentThreadScheduler;\n  }(Scheduler));\n\n  var currentThreadScheduler = Scheduler.currentThread = new CurrentThreadScheduler();\n\n  var scheduleMethod, clearMethod;\n\n  var localTimer = (function () {\n    var localSetTimeout, localClearTimeout = noop;\n    if (!!root.setTimeout) {\n      localSetTimeout = root.setTimeout;\n      localClearTimeout = root.clearTimeout;\n    } else if (!!root.WScript) {\n      localSetTimeout = function (fn, time) {\n        root.WScript.Sleep(time);\n        fn();\n      };\n    } else {\n      throw new NotSupportedError();\n    }\n\n    return {\n      setTimeout: localSetTimeout,\n      clearTimeout: localClearTimeout\n    };\n  }());\n  var localSetTimeout = localTimer.setTimeout,\n    localClearTimeout = localTimer.clearTimeout;\n\n  (function () {\n\n    var nextHandle = 1, tasksByHandle = {}, currentlyRunning = false;\n\n    clearMethod = function (handle) {\n      delete tasksByHandle[handle];\n    };\n\n    function runTask(handle) {\n      if (currentlyRunning) {\n        localSetTimeout(function () { runTask(handle); }, 0);\n      } else {\n        var task = tasksByHandle[handle];\n        if (task) {\n          currentlyRunning = true;\n          var result = tryCatch(task)();\n          clearMethod(handle);\n          currentlyRunning = false;\n          if (result === errorObj) { thrower(result.e); }\n        }\n      }\n    }\n\n    var reNative = new RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&\n      !reNative.test(setImmediate) && setImmediate;\n\n    function postMessageSupported () {\n      // Ensure not in a worker\n      if (!root.postMessage || root.importScripts) { return false; }\n      var isAsync = false, oldHandler = root.onmessage;\n      // Test for async\n      root.onmessage = function () { isAsync = true; };\n      root.postMessage('', '*');\n      root.onmessage = oldHandler;\n\n      return isAsync;\n    }\n\n    // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n    if (isFunction(setImmediate)) {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        setImmediate(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        process.nextTick(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (postMessageSupported()) {\n      var MSG_PREFIX = 'ms.rx.schedule' + Math.random();\n\n      var onGlobalPostMessage = function (event) {\n        // Only if we're a match to avoid any other global events\n        if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n          runTask(event.data.substring(MSG_PREFIX.length));\n        }\n      };\n\n      root.addEventListener('message', onGlobalPostMessage, false);\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        root.postMessage(MSG_PREFIX + id, '*');\n        return id;\n      };\n    } else if (!!root.MessageChannel) {\n      var channel = new root.MessageChannel();\n\n      channel.port1.onmessage = function (e) { runTask(e.data); };\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        channel.port2.postMessage(id);\n        return id;\n      };\n    } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {\n\n      scheduleMethod = function (action) {\n        var scriptElement = root.document.createElement('script');\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n\n        scriptElement.onreadystatechange = function () {\n          runTask(id);\n          scriptElement.onreadystatechange = null;\n          scriptElement.parentNode.removeChild(scriptElement);\n          scriptElement = null;\n        };\n        root.document.documentElement.appendChild(scriptElement);\n        return id;\n      };\n\n    } else {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        localSetTimeout(function () {\n          runTask(id);\n        }, 0);\n\n        return id;\n      };\n    }\n  }());\n\n  /**\n   * Gets a scheduler that schedules work via a timed callback based upon platform.\n   */\n   var DefaultScheduler = (function (__super__) {\n     inherits(DefaultScheduler, __super__);\n     function DefaultScheduler() {\n       __super__.call(this);\n     }\n\n     function scheduleAction(disposable, action, scheduler, state) {\n       return function schedule() {\n         disposable.setDisposable(Disposable._fixup(action(scheduler, state)));\n       };\n     }\n\n     function ClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     ClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         clearMethod(this._id);\n       }\n     };\n\n     function LocalClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     LocalClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         localClearTimeout(this._id);\n       }\n     };\n\n    DefaultScheduler.prototype.schedule = function (state, action) {\n      var disposable = new SingleAssignmentDisposable(),\n          id = scheduleMethod(scheduleAction(disposable, action, this, state));\n      return new BinaryDisposable(disposable, new ClearDisposable(id));\n    };\n\n    DefaultScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      if (dueTime === 0) { return this.schedule(state, action); }\n      var disposable = new SingleAssignmentDisposable(),\n          id = localSetTimeout(scheduleAction(disposable, action, this, state), dueTime);\n      return new BinaryDisposable(disposable, new LocalClearDisposable(id));\n    };\n\n    function scheduleLongRunning(state, action, disposable) {\n      return function () { action(state, disposable); };\n    }\n\n    DefaultScheduler.prototype.scheduleLongRunning = function (state, action) {\n      var disposable = disposableCreate(noop);\n      scheduleMethod(scheduleLongRunning(state, action, disposable));\n      return disposable;\n    };\n\n    return DefaultScheduler;\n  }(Scheduler));\n\n  var defaultScheduler = Scheduler['default'] = Scheduler.async = new DefaultScheduler();\n\n  function IndexedItem(id, value) {\n    this.id = id;\n    this.value = value;\n  }\n\n  IndexedItem.prototype.compareTo = function (other) {\n    var c = this.value.compareTo(other.value);\n    c === 0 && (c = this.id - other.id);\n    return c;\n  };\n\n  var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) {\n    this.items = new Array(capacity);\n    this.length = 0;\n  };\n\n  var priorityProto = PriorityQueue.prototype;\n  priorityProto.isHigherPriority = function (left, right) {\n    return this.items[left].compareTo(this.items[right]) < 0;\n  };\n\n  priorityProto.percolate = function (index) {\n    if (index >= this.length || index < 0) { return; }\n    var parent = index - 1 >> 1;\n    if (parent < 0 || parent === index) { return; }\n    if (this.isHigherPriority(index, parent)) {\n      var temp = this.items[index];\n      this.items[index] = this.items[parent];\n      this.items[parent] = temp;\n      this.percolate(parent);\n    }\n  };\n\n  priorityProto.heapify = function (index) {\n    +index || (index = 0);\n    if (index >= this.length || index < 0) { return; }\n    var left = 2 * index + 1,\n        right = 2 * index + 2,\n        first = index;\n    if (left < this.length && this.isHigherPriority(left, first)) {\n      first = left;\n    }\n    if (right < this.length && this.isHigherPriority(right, first)) {\n      first = right;\n    }\n    if (first !== index) {\n      var temp = this.items[index];\n      this.items[index] = this.items[first];\n      this.items[first] = temp;\n      this.heapify(first);\n    }\n  };\n\n  priorityProto.peek = function () { return this.items[0].value; };\n\n  priorityProto.removeAt = function (index) {\n    this.items[index] = this.items[--this.length];\n    this.items[this.length] = undefined;\n    this.heapify();\n  };\n\n  priorityProto.dequeue = function () {\n    var result = this.peek();\n    this.removeAt(0);\n    return result;\n  };\n\n  priorityProto.enqueue = function (item) {\n    var index = this.length++;\n    this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n    this.percolate(index);\n  };\n\n  priorityProto.remove = function (item) {\n    for (var i = 0; i < this.length; i++) {\n      if (this.items[i].value === item) {\n        this.removeAt(i);\n        return true;\n      }\n    }\n    return false;\n  };\n  PriorityQueue.count = 0;\n\n  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n\n  /**\n   * Abstract base class for implementations of the Observer class.\n   * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n   */\n  var AbstractObserver = Rx.internals.AbstractObserver = (function (__super__) {\n    inherits(AbstractObserver, __super__);\n\n    /**\n     * Creates a new observer in a non-stopped state.\n     */\n    function AbstractObserver() {\n      this.isStopped = false;\n    }\n\n    // Must be implemented by other observers\n    AbstractObserver.prototype.next = notImplemented;\n    AbstractObserver.prototype.error = notImplemented;\n    AbstractObserver.prototype.completed = notImplemented;\n\n    /**\n     * Notifies the observer of a new element in the sequence.\n     * @param {Any} value Next element in the sequence.\n     */\n    AbstractObserver.prototype.onNext = function (value) {\n      !this.isStopped && this.next(value);\n    };\n\n    /**\n     * Notifies the observer that an exception has occurred.\n     * @param {Any} error The error that has occurred.\n     */\n    AbstractObserver.prototype.onError = function (error) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(error);\n      }\n    };\n\n    /**\n     * Notifies the observer of the end of the sequence.\n     */\n    AbstractObserver.prototype.onCompleted = function () {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.completed();\n      }\n    };\n\n    /**\n     * Disposes the observer, causing it to transition to the stopped state.\n     */\n    AbstractObserver.prototype.dispose = function () { this.isStopped = true; };\n\n    AbstractObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return AbstractObserver;\n  }(Observer));\n\n  /**\n   * Class to create an Observer instance from delegate-based implementations of the on* methods.\n   */\n  var AnonymousObserver = Rx.AnonymousObserver = (function (__super__) {\n    inherits(AnonymousObserver, __super__);\n\n    /**\n     * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n     * @param {Any} onNext Observer's OnNext action implementation.\n     * @param {Any} onError Observer's OnError action implementation.\n     * @param {Any} onCompleted Observer's OnCompleted action implementation.\n     */\n    function AnonymousObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    /**\n     * Calls the onNext action.\n     * @param {Any} value Next element in the sequence.\n     */\n    AnonymousObserver.prototype.next = function (value) {\n      this._onNext(value);\n    };\n\n    /**\n     * Calls the onError action.\n     * @param {Any} error The error that has occurred.\n     */\n    AnonymousObserver.prototype.error = function (error) {\n      this._onError(error);\n    };\n\n    /**\n     *  Calls the onCompleted action.\n     */\n    AnonymousObserver.prototype.completed = function () {\n      this._onCompleted();\n    };\n\n    return AnonymousObserver;\n  }(AbstractObserver));\n\n  var observableProto;\n\n  /**\n   * Represents a push-style collection.\n   */\n  var Observable = Rx.Observable = (function () {\n\n    function makeSubscribe(self, subscribe) {\n      return function (o) {\n        var oldOnError = o.onError;\n        o.onError = function (e) {\n          makeStackTraceLong(e, self);\n          oldOnError.call(o, e);\n        };\n\n        return subscribe.call(self, o);\n      };\n    }\n\n    function Observable() {\n      if (Rx.config.longStackSupport && hasStacks) {\n        var oldSubscribe = this._subscribe;\n        var e = tryCatch(thrower)(new Error()).e;\n        this.stack = e.stack.substring(e.stack.indexOf('\\n') + 1);\n        this._subscribe = makeSubscribe(this, oldSubscribe);\n      }\n    }\n\n    observableProto = Observable.prototype;\n\n    /**\n    * Determines whether the given object is an Observable\n    * @param {Any} An object to determine whether it is an Observable\n    * @returns {Boolean} true if an Observable, else false.\n    */\n    Observable.isObservable = function (o) {\n      return o && isFunction(o.subscribe);\n    };\n\n    /**\n     *  Subscribes an o to the observable sequence.\n     *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n     *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n     *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n     *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribe = observableProto.forEach = function (oOrOnNext, onError, onCompleted) {\n      return this._subscribe(typeof oOrOnNext === 'object' ?\n        oOrOnNext :\n        observerCreate(oOrOnNext, onError, onCompleted));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onNext The function to invoke on each element in the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnNext = function (onNext, thisArg) {\n      return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n    };\n\n    /**\n     * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n     * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnError = function (onError, thisArg) {\n      return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnCompleted = function (onCompleted, thisArg) {\n      return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n    };\n\n    return Observable;\n  })();\n\n  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {\n    inherits(AnonymousObservable, __super__);\n\n    // Fix subscriber to check for undefined or function returned to decorate as Disposable\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.__subscribe).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function AnonymousObservable(subscribe, parent) {\n      this.source = parent;\n      this.__subscribe = subscribe;\n      __super__.call(this);\n    }\n\n    AnonymousObservable.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    return AnonymousObservable;\n\n  }(Observable));\n\n  var ObservableBase = Rx.ObservableBase = (function (__super__) {\n    inherits(ObservableBase, __super__);\n\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.subscribeCore).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function ObservableBase() {\n      __super__.call(this);\n    }\n\n    ObservableBase.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    ObservableBase.prototype.subscribeCore = notImplemented;\n\n    return ObservableBase;\n  }(Observable));\n\n  var AutoDetachObserver = (function (__super__) {\n    inherits(AutoDetachObserver, __super__);\n\n    function AutoDetachObserver(observer) {\n      __super__.call(this);\n      this.observer = observer;\n      this.m = new SingleAssignmentDisposable();\n    }\n\n    var AutoDetachObserverPrototype = AutoDetachObserver.prototype;\n\n    AutoDetachObserverPrototype.next = function (value) {\n      var result = tryCatch(this.observer.onNext).call(this.observer, value);\n      if (result === errorObj) {\n        this.dispose();\n        thrower(result.e);\n      }\n    };\n\n    AutoDetachObserverPrototype.error = function (err) {\n      var result = tryCatch(this.observer.onError).call(this.observer, err);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.completed = function () {\n      var result = tryCatch(this.observer.onCompleted).call(this.observer);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };\n    AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };\n\n    AutoDetachObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.m.dispose();\n    };\n\n    return AutoDetachObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Creates an observable sequence from a specified subscribe method implementation.\n   * @example\n   *  var res = Rx.Observable.create(function (observer) { return function () { } );\n   *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n   *  var res = Rx.Observable.create(function (observer) { } );\n   * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n   * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n   */\n  Observable.create = function (subscribe, parent) {\n    return new AnonymousObservable(subscribe, parent);\n  };\n\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    root.Rx = Rx;\n\n    define(function() {\n      return Rx;\n    });\n  } else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = Rx).Rx = Rx;\n    } else {\n      freeExports.Rx = Rx;\n    }\n  } else {\n    // in a browser or Rhino\n    root.Rx = Rx;\n  }\n\n  // All code before this point will be filtered from stack traces.\n  var rEndingLine = captureLine();\n\n}.call(this));\n"
  },
  {
    "path": "dist/rx.core.testing.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n    // Because of build optimizers\n    if (typeof define === 'function' && define.amd) {\n        define(['./rx.core'], function (Rx, exports) {\n            return factory(root, exports, Rx);\n        });\n    } else if (typeof module === 'object' && module && module.exports === freeExports) {\n        module.exports = factory(root, module.exports, require('./rx.core'));\n    } else {\n        root.Rx = factory(root, {}, root.Rx);\n    }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Defaults\n  var Observer = Rx.Observer,\n    Observable = Rx.Observable,\n    Disposable = Rx.Disposable,\n    disposableEmpty = Disposable.empty,\n    disposableCreate = Disposable.create,\n    CompositeDisposable = Rx.CompositeDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    Scheduler = Rx.Scheduler,\n    ScheduledItem = Rx.internals.ScheduledItem,\n    SchedulePeriodicRecursive  = Rx.internals.SchedulePeriodicRecursive,\n    PriorityQueue = Rx.internals.PriorityQueue,\n    inherits = Rx.internals.inherits,\n    notImplemented = Rx.helpers.notImplemented,\n    defaultComparer = Rx.helpers.defaultComparer = function (a, b) { return isEqual(a, b); };\n\n  /**\n   *  Represents a notification to an observer.\n   */\n  var Notification = Rx.Notification = (function () {\n    function Notification() {\n\n    }\n\n    Notification.prototype._accept = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    Notification.prototype._acceptObserver = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    /**\n     * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n     * @param {Function | Observer} observerOrOnNext Function to invoke for an OnNext notification or Observer to invoke the notification on..\n     * @param {Function} onError Function to invoke for an OnError notification.\n     * @param {Function} onCompleted Function to invoke for an OnCompleted notification.\n     * @returns {Any} Result produced by the observation.\n     */\n    Notification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n      return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n        this._acceptObserver(observerOrOnNext) :\n        this._accept(observerOrOnNext, onError, onCompleted);\n    };\n\n    /**\n     * Returns an observable sequence with a single notification.\n     *\n     * @memberOf Notifications\n     * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n     * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n     */\n    Notification.prototype.toObservable = function (scheduler) {\n      var self = this;\n      isScheduler(scheduler) || (scheduler = immediateScheduler);\n      return new AnonymousObservable(function (o) {\n        return scheduler.schedule(self, function (_, notification) {\n          notification._acceptObserver(o);\n          notification.kind === 'N' && o.onCompleted();\n        });\n      });\n    };\n\n    return Notification;\n  })();\n\n  var OnNextNotification = (function (__super__) {\n    inherits(OnNextNotification, __super__);\n    function OnNextNotification(value) {\n      this.value = value;\n      this.kind = 'N';\n    }\n\n    OnNextNotification.prototype._accept = function (onNext) {\n      return onNext(this.value);\n    };\n\n    OnNextNotification.prototype._acceptObserver = function (o) {\n      return o.onNext(this.value);\n    };\n\n    OnNextNotification.prototype.toString = function () {\n      return 'OnNext(' + this.value + ')';\n    };\n\n    return OnNextNotification;\n  }(Notification));\n\n  var OnErrorNotification = (function (__super__) {\n    inherits(OnErrorNotification, __super__);\n    function OnErrorNotification(error) {\n      this.error = error;\n      this.kind = 'E';\n    }\n\n    OnErrorNotification.prototype._accept = function (onNext, onError) {\n      return onError(this.error);\n    };\n\n    OnErrorNotification.prototype._acceptObserver = function (o) {\n      return o.onError(this.error);\n    };\n\n    OnErrorNotification.prototype.toString = function () {\n      return 'OnError(' + this.error + ')';\n    };\n\n    return OnErrorNotification;\n  }(Notification));\n\n  var OnCompletedNotification = (function (__super__) {\n    inherits(OnCompletedNotification, __super__);\n    function OnCompletedNotification() {\n      this.kind = 'C';\n    }\n\n    OnCompletedNotification.prototype._accept = function (onNext, onError, onCompleted) {\n      return onCompleted();\n    };\n\n    OnCompletedNotification.prototype._acceptObserver = function (o) {\n      return o.onCompleted();\n    };\n\n    OnCompletedNotification.prototype.toString = function () {\n      return 'OnCompleted()';\n    };\n\n    return OnCompletedNotification;\n  }(Notification));\n\n  /**\n   * Creates an object that represents an OnNext notification to an observer.\n   * @param {Any} value The value contained in the notification.\n   * @returns {Notification} The OnNext notification containing the value.\n   */\n  var notificationCreateOnNext = Notification.createOnNext = function (value) {\n    return new OnNextNotification(value);\n  };\n\n  /**\n   * Creates an object that represents an OnError notification to an observer.\n   * @param {Any} error The exception contained in the notification.\n   * @returns {Notification} The OnError notification containing the exception.\n   */\n  var notificationCreateOnError = Notification.createOnError = function (error) {\n    return new OnErrorNotification(error);\n  };\n\n  /**\n   * Creates an object that represents an OnCompleted notification to an observer.\n   * @returns {Notification} The OnCompleted notification.\n   */\n  var notificationCreateOnCompleted = Notification.createOnCompleted = function () {\n    return new OnCompletedNotification();\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var dontEnums = ['toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'],\n  dontEnumsLength = dontEnums.length;\n\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\nvar objectProto = Object.prototype,\n    hasOwnProperty = objectProto.hasOwnProperty,\n    objToString = objectProto.toString,\n    MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\nvar keys = Object.keys || (function() {\n    var hasOwnProperty = Object.prototype.hasOwnProperty,\n        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),\n        dontEnums = [\n          'toString',\n          'toLocaleString',\n          'valueOf',\n          'hasOwnProperty',\n          'isPrototypeOf',\n          'propertyIsEnumerable',\n          'constructor'\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    return function(obj) {\n      if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n        throw new TypeError('Object.keys called on non-object');\n      }\n\n      var result = [], prop, i;\n\n      for (prop in obj) {\n        if (hasOwnProperty.call(obj, prop)) {\n          result.push(prop);\n        }\n      }\n\n      if (hasDontEnumBug) {\n        for (i = 0; i < dontEnumsLength; i++) {\n          if (hasOwnProperty.call(obj, dontEnums[i])) {\n            result.push(dontEnums[i]);\n          }\n        }\n      }\n      return result;\n    };\n  }());\n\nfunction equalObjects(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objProps = keys(object),\n      objLength = objProps.length,\n      othProps = keys(other),\n      othLength = othProps.length;\n\n  if (objLength !== othLength && !isLoose) {\n    return false;\n  }\n  var index = objLength, key;\n  while (index--) {\n    key = objProps[index];\n    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  var skipCtor = isLoose;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key],\n        result;\n\n    if (!(result === undefined ? equalFunc(objValue, othValue, isLoose, stackA, stackB) : result)) {\n      return false;\n    }\n    skipCtor || (skipCtor = key === 'constructor');\n  }\n  if (!skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    if (objCtor !== othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor === 'function' && objCtor instanceof objCtor &&\n          typeof othCtor === 'function' && othCtor instanceof othCtor)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction equalByTag(object, other, tag) {\n  switch (tag) {\n    case boolTag:\n    case dateTag:\n      return +object === +other;\n\n    case errorTag:\n      return object.name === other.name && object.message === other.message;\n\n    case numberTag:\n      return (object !== +object) ?\n        other !== +other :\n        object === +other;\n\n    case regexpTag:\n    case stringTag:\n      return object === (other + '');\n  }\n  return false;\n}\n\nvar isObject = Rx.internals.isObject = function(value) {\n  var type = typeof value;\n  return !!value && (type === 'object' || type === 'function');\n};\n\nfunction isObjectLike(value) {\n  return !!value && typeof value === 'object';\n}\n\nfunction isLength(value) {\n  return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nvar isHostObject = (function() {\n  try {\n    Object({ 'toString': 0 } + '');\n  } catch(e) {\n    return function() { return false; };\n  }\n  return function(value) {\n    return typeof value.toString !== 'function' && typeof (value + '') === 'string';\n  };\n}());\n\nfunction isTypedArray(value) {\n  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nvar isArray = Array.isArray || function(value) {\n  return isObjectLike(value) && isLength(value.length) && objToString.call(value) === arrayTag;\n};\n\nfunction arraySome (array, predicate) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction equalArrays(array, other, equalFunc, isLoose, stackA, stackB) {\n  var index = -1,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength !== othLength && !(isLoose && othLength > arrLength)) {\n    return false;\n  }\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index],\n        result;\n\n    if (result !== undefined) {\n      if (result) {\n        continue;\n      }\n      return false;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (isLoose) {\n      if (!arraySome(other, function(othValue) {\n            return arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB);\n          })) {\n        return false;\n      }\n    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB))) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction baseIsEqualDeep(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = arrayTag,\n      othTag = arrayTag;\n\n  if (!objIsArr) {\n    objTag = objToString.call(object);\n    if (objTag === argsTag) {\n      objTag = objectTag;\n    } else if (objTag !== objectTag) {\n      objIsArr = isTypedArray(object);\n    }\n  }\n  if (!othIsArr) {\n    othTag = objToString.call(other);\n    if (othTag === argsTag) {\n      othTag = objectTag;\n    }\n  }\n  var objIsObj = objTag === objectTag && !isHostObject(object),\n      othIsObj = othTag === objectTag && !isHostObject(other),\n      isSameTag = objTag === othTag;\n\n  if (isSameTag && !(objIsArr || objIsObj)) {\n    return equalByTag(object, other, objTag);\n  }\n  if (!isLoose) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, isLoose, stackA, stackB);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  // For more information on detecting circular references see https://es5.github.io/#JO.\n  stackA || (stackA = []);\n  stackB || (stackB = []);\n\n  var length = stackA.length;\n  while (length--) {\n    if (stackA[length] === object) {\n      return stackB[length] === other;\n    }\n  }\n  // Add `object` and `other` to the stack of traversed objects.\n  stackA.push(object);\n  stackB.push(other);\n\n  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, isLoose, stackA, stackB);\n\n  stackA.pop();\n  stackB.pop();\n\n  return result;\n}\n\nfunction baseIsEqual(value, other, isLoose, stackA, stackB) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, baseIsEqual, isLoose, stackA, stackB);\n}\n\nvar isEqual = Rx.internals.isEqual = function (value, other) {\n  return baseIsEqual(value, other);\n};\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function createTick(self) {\n      return function tick(command, recurse) {\n        recurse(0, self._period);\n        var state = tryCatch(self._action)(self._state);\n        if (state === errorObj) {\n          self._cancel.dispose();\n          thrower(state.e);\n        }\n        self._state = state;\n      };\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveFuture(0, this._period, createTick(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  /** Provides a set of extension methods for virtual time scheduling. */\n  var VirtualTimeScheduler = Rx.VirtualTimeScheduler = (function (__super__) {\n    inherits(VirtualTimeScheduler, __super__);\n\n    /**\n     * Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer.\n     *\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function VirtualTimeScheduler(initialClock, comparer) {\n      this.clock = initialClock;\n      this.comparer = comparer;\n      this.isEnabled = false;\n      this.queue = new PriorityQueue(1024);\n      __super__.call(this);\n    }\n\n    var VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype;\n\n    VirtualTimeSchedulerPrototype.now = function () {\n      return this.toAbsoluteTime(this.clock);\n    };\n\n    VirtualTimeSchedulerPrototype.schedule = function (state, action) {\n      return this.scheduleAbsolute(state, this.clock, action);\n    };\n\n    VirtualTimeSchedulerPrototype.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime instanceof Date ?\n        this.toRelativeTime(dueTime - this.now()) :\n        this.toRelativeTime(dueTime);\n\n      return this.scheduleRelative(state, dt, action);\n    };\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    VirtualTimeSchedulerPrototype.add = notImplemented;\n\n    /**\n     * Converts an absolute time to a number\n     * @param {Any} The absolute time.\n     * @returns {Number} The absolute time in ms\n     */\n    VirtualTimeSchedulerPrototype.toAbsoluteTime = notImplemented;\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    VirtualTimeSchedulerPrototype.toRelativeTime = notImplemented;\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be emulated using recursive scheduling.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.schedulePeriodic = function (state, period, action) {\n      var s = new SchedulePeriodicRecursive(this, state, period, action);\n      return s.start();\n    };\n\n    /**\n     * Schedules an action to be executed after dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleRelative = function (state, dueTime, action) {\n      var runAt = this.add(this.clock, dueTime);\n      return this.scheduleAbsolute(state, runAt, action);\n    };\n\n    /**\n     * Starts the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.start = function () {\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n      }\n    };\n\n    /**\n     * Stops the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.stop = function () {\n      this.isEnabled = false;\n    };\n\n    /**\n     * Advances the scheduler's clock to the specified time, running all work till that point.\n     * @param {Number} time Absolute time to advance the scheduler's clock to.\n     */\n    VirtualTimeSchedulerPrototype.advanceTo = function (time) {\n      var dueToClock = this.comparer(this.clock, time);\n      if (this.comparer(this.clock, time) > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) { return; }\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null && this.comparer(next.dueTime, time) <= 0) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n        this.clock = time;\n      }\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.advanceBy = function (time) {\n      var dt = this.add(this.clock, time),\n          dueToClock = this.comparer(this.clock, dt);\n      if (dueToClock > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) {  return; }\n\n      this.advanceTo(dt);\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.sleep = function (time) {\n      var dt = this.add(this.clock, time);\n      if (this.comparer(this.clock, dt) >= 0) { throw new ArgumentOutOfRangeError(); }\n\n      this.clock = dt;\n    };\n\n    /**\n     * Gets the next scheduled item to be executed.\n     * @returns {ScheduledItem} The next scheduled item.\n     */\n    VirtualTimeSchedulerPrototype.getNext = function () {\n      while (this.queue.length > 0) {\n        var next = this.queue.peek();\n        if (next.isCancelled()) {\n          this.queue.dequeue();\n        } else {\n          return next;\n        }\n      }\n      return null;\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleAbsolute = function (state, dueTime, action) {\n      var self = this;\n\n      function run(scheduler, state1) {\n        self.queue.remove(si);\n        return action(scheduler, state1);\n      }\n\n      var si = new ScheduledItem(this, state, run, dueTime, this.comparer);\n      this.queue.enqueue(si);\n\n      return si.disposable;\n    };\n\n    return VirtualTimeScheduler;\n  }(Scheduler));\n\nfunction OnNextPredicate(predicate) {\n    this.predicate = predicate;\n}\n\nOnNextPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'N') { return false; }\n  return this.predicate(other.value);\n};\n\nfunction OnErrorPredicate(predicate) {\n  this.predicate = predicate;\n}\n\nOnErrorPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'E') { return false; }\n  return this.predicate(other.error);\n};\n\nvar ReactiveTest = Rx.ReactiveTest = {\n  /** Default virtual time used for creation of observable sequences in unit tests. */\n  created: 100,\n  /** Default virtual time used to subscribe to observable sequences in unit tests. */\n  subscribed: 200,\n  /** Default virtual time used to dispose subscriptions in unit tests. */\n  disposed: 1000,\n\n  /**\n   * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n   *\n   * 1 - ReactiveTest.onNext(200, 42);\n   * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n   *\n   * @param ticks Recorded virtual time the OnNext notification occurs.\n   * @param value Recorded value stored in the OnNext notification or a predicate.\n   * @return Recorded OnNext notification.\n   */\n  onNext: function (ticks, value) {\n    return typeof value === 'function' ?\n      new Recorded(ticks, new OnNextPredicate(value)) :\n      new Recorded(ticks, Notification.createOnNext(value));\n  },\n  /**\n   * Factory method for an OnError notification record at a given time with a given error.\n   *\n   * 1 - ReactiveTest.onNext(200, new Error('error'));\n   * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n   *\n   * @param ticks Recorded virtual time the OnError notification occurs.\n   * @param exception Recorded exception stored in the OnError notification.\n   * @return Recorded OnError notification.\n   */\n  onError: function (ticks, error) {\n    return typeof error === 'function' ?\n      new Recorded(ticks, new OnErrorPredicate(error)) :\n      new Recorded(ticks, Notification.createOnError(error));\n  },\n  /**\n   * Factory method for an OnCompleted notification record at a given time.\n   *\n   * @param ticks Recorded virtual time the OnCompleted notification occurs.\n   * @return Recorded OnCompleted notification.\n   */\n  onCompleted: function (ticks) {\n    return new Recorded(ticks, Notification.createOnCompleted());\n  },\n  /**\n   * Factory method for a subscription record based on a given subscription and disposal time.\n   *\n   * @param start Virtual time indicating when the subscription was created.\n   * @param end Virtual time indicating when the subscription was disposed.\n   * @return Subscription object.\n   */\n  subscribe: function (start, end) {\n    return new Subscription(start, end);\n  }\n};\n\n  /**\n   * Creates a new object recording the production of the specified value at the given virtual time.\n   *\n   * @constructor\n   * @param {Number} time Virtual time the value was produced on.\n   * @param {Mixed} value Value that was produced.\n   * @param {Function} comparer An optional comparer.\n   */\n  var Recorded = Rx.Recorded = function (time, value, comparer) {\n    this.time = time;\n    this.value = value;\n    this.comparer = comparer || defaultComparer;\n  };\n\n  /**\n   * Checks whether the given recorded object is equal to the current instance.\n   *\n   * @param {Recorded} other Recorded object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Recorded.prototype.equals = function (other) {\n    return this.time === other.time && this.comparer(this.value, other.value);\n  };\n\n  /**\n   * Returns a string representation of the current Recorded value.\n   *\n   * @returns {String} String representation of the current Recorded value.\n   */\n  Recorded.prototype.toString = function () {\n    return this.value.toString() + '@' + this.time;\n  };\n\n  /**\n   * Creates a new subscription object with the given virtual subscription and unsubscription time.\n   *\n   * @constructor\n   * @param {Number} subscribe Virtual time at which the subscription occurred.\n   * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n   */\n  var Subscription = Rx.Subscription = function (start, end) {\n    this.subscribe = start;\n    this.unsubscribe = end || Number.MAX_VALUE;\n  };\n\n  /**\n   * Checks whether the given subscription is equal to the current instance.\n   * @param other Subscription object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Subscription.prototype.equals = function (other) {\n    return this.subscribe === other.subscribe && this.unsubscribe === other.unsubscribe;\n  };\n\n  /**\n   * Returns a string representation of the current Subscription value.\n   * @returns {String} String representation of the current Subscription value.\n   */\n  Subscription.prototype.toString = function () {\n    return '(' + this.subscribe + ', ' + (this.unsubscribe === Number.MAX_VALUE ? 'Infinite' : this.unsubscribe) + ')';\n  };\n\n  var MockDisposable = Rx.MockDisposable = function (scheduler) {\n    this.scheduler = scheduler;\n    this.disposes = [];\n    this.disposes.push(this.scheduler.clock);\n  };\n\n  MockDisposable.prototype.dispose = function () {\n    this.disposes.push(this.scheduler.clock);\n  };\n\n  var MockObserver = (function (__super__) {\n    inherits(MockObserver, __super__);\n\n    function MockObserver(scheduler) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = [];\n    }\n\n    var MockObserverPrototype = MockObserver.prototype;\n\n    MockObserverPrototype.onNext = function (value) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnNext(value)));\n    };\n\n    MockObserverPrototype.onError = function (e) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnError(e)));\n    };\n\n    MockObserverPrototype.onCompleted = function () {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnCompleted()));\n    };\n\n    return MockObserver;\n  })(Observer);\n\n  function MockPromise(scheduler, messages) {\n    var self = this;\n    this.scheduler = scheduler;\n    this.messages = messages;\n    this.subscriptions = [];\n    this.observers = [];\n    for (var i = 0, len = this.messages.length; i < len; i++) {\n      var message = this.messages[i],\n          notification = message.value;\n      (function (innerNotification) {\n        scheduler.scheduleAbsolute(null, message.time, function () {\n          var obs = self.observers.slice(0);\n\n          for (var j = 0, jLen = obs.length; j < jLen; j++) {\n            innerNotification.accept(obs[j]);\n          }\n          return disposableEmpty;\n        });\n      })(notification);\n    }\n  }\n\n  MockPromise.prototype.then = function (onResolved, onRejected) {\n    var self = this;\n\n    this.subscriptions.push(new Subscription(this.scheduler.clock));\n    var index = this.subscriptions.length - 1;\n\n    var newPromise;\n\n    var observer = Rx.Observer.create(\n      function (x) {\n        var retValue = onResolved(x);\n        if (retValue && typeof retValue.then === 'function') {\n          newPromise = retValue;\n        } else {\n          var ticks = self.scheduler.clock;\n          newPromise = new MockPromise(self.scheduler, [Rx.ReactiveTest.onNext(ticks, undefined), Rx.ReactiveTest.onCompleted(ticks)]);\n        }\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      },\n      function (err) {\n        onRejected(err);\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      }\n    );\n    this.observers.push(observer);\n\n    return newPromise || new MockPromise(this.scheduler, this.messages);\n  };\n\n  var HotObservable = (function (__super__) {\n    inherits(HotObservable, __super__);\n\n    function HotObservable(scheduler, messages) {\n      __super__.call(this);\n      var message, notification, observable = this;\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n      this.observers = [];\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          scheduler.scheduleAbsolute(null, message.time, function () {\n            var obs = observable.observers.slice(0);\n\n            for (var j = 0, jLen = obs.length; j < jLen; j++) {\n              innerNotification.accept(obs[j]);\n            }\n            return disposableEmpty;\n          });\n        })(notification);\n      }\n    }\n\n    HotObservable.prototype._subscribe = function (o) {\n      var observable = this;\n      this.observers.push(o);\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      return disposableCreate(function () {\n        var idx = observable.observers.indexOf(o);\n        observable.observers.splice(idx, 1);\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n      });\n    };\n\n    return HotObservable;\n  })(Observable);\n\n  var ColdObservable = (function (__super__) {\n    inherits(ColdObservable, __super__);\n\n    function ColdObservable(scheduler, messages) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n    }\n\n    ColdObservable.prototype._subscribe = function (o) {\n      var message, notification, observable = this;\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      var d = new CompositeDisposable();\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          d.add(observable.scheduler.scheduleRelative(null, message.time, function () {\n            innerNotification.accept(o);\n            return disposableEmpty;\n          }));\n        })(notification);\n      }\n      return disposableCreate(function () {\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n        d.dispose();\n      });\n    };\n\n    return ColdObservable;\n  })(Observable);\n\n  /** Virtual time scheduler used for testing applications and libraries built using Reactive Extensions. */\n  Rx.TestScheduler = (function (__super__) {\n    inherits(TestScheduler, __super__);\n\n    function baseComparer(x, y) {\n      return x > y ? 1 : (x < y ? -1 : 0);\n    }\n\n    function TestScheduler() {\n      __super__.call(this, 0, baseComparer);\n    }\n\n    /**\n     * Schedules an action to be executed at the specified virtual time.\n     *\n     * @param state State passed to the action to be executed.\n     * @param dueTime Absolute virtual time at which to execute the action.\n     * @param action Action to be executed.\n     * @return Disposable object used to cancel the scheduled action (best effort).\n     */\n    TestScheduler.prototype.scheduleAbsolute = function (state, dueTime, action) {\n      dueTime <= this.clock && (dueTime = this.clock + 1);\n      return __super__.prototype.scheduleAbsolute.call(this, state, dueTime, action);\n    };\n    /**\n     * Adds a relative virtual time to an absolute virtual time value.\n     *\n     * @param absolute Absolute virtual time value.\n     * @param relative Relative virtual time value to add.\n     * @return Resulting absolute virtual time sum value.\n     */\n    TestScheduler.prototype.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n    /**\n     * Converts the absolute virtual time value to a DateTimeOffset value.\n     *\n     * @param absolute Absolute virtual time value to convert.\n     * @return Corresponding DateTimeOffset value.\n     */\n    TestScheduler.prototype.toAbsoluteTime = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     *\n     * @param timeSpan TimeSpan value to convert.\n     * @return Corresponding relative virtual time value.\n     */\n    TestScheduler.prototype.toRelativeTime = function (timeSpan) {\n      return timeSpan;\n    };\n    /**\n     * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n     *\n     * @param create Factory method to create an observable sequence.\n     * @param created Virtual time at which to invoke the factory to create an observable sequence.\n     * @param subscribed Virtual time at which to subscribe to the created observable sequence.\n     * @param disposed Virtual time at which to dispose the subscription.\n     * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n     */\n    TestScheduler.prototype.startScheduler = function (createFn, settings) {\n      settings || (settings = {});\n      settings.created == null && (settings.created = ReactiveTest.created);\n      settings.subscribed == null && (settings.subscribed = ReactiveTest.subscribed);\n      settings.disposed == null && (settings.disposed = ReactiveTest.disposed);\n\n      var observer = this.createObserver(), source, subscription;\n\n      this.scheduleAbsolute(null, settings.created, function () {\n        source = createFn();\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.subscribed, function () {\n        subscription = source.subscribe(observer);\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.disposed, function () {\n        subscription.dispose();\n        return disposableEmpty;\n      });\n\n      this.start();\n\n      return observer;\n    };\n\n    /**\n     * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n     * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createHotObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new HotObservable(this, args);\n    };\n\n    /**\n     * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n     * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createColdObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new ColdObservable(this, args);\n    };\n\n    /**\n     * Creates a resolved promise with the given value and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} value The value to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which fulfills with the given value.\n     */\n    TestScheduler.prototype.createResolvedPromise = function (ticks, value) {\n      return new MockPromise(this, [Rx.ReactiveTest.onNext(ticks, value), Rx.ReactiveTest.onCompleted(ticks)]);\n    };\n\n    /**\n     * Creates a rejected promise with the given reason and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} reason The reason for rejection to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which rejects with the given reason.\n     */\n    TestScheduler.prototype.createRejectedPromise = function (ticks, reason) {\n      return new MockPromise(this, [Rx.ReactiveTest.onError(ticks, reason)]);\n    };\n\n    /**\n     * Creates an observer that records received notification messages and timestamps those.\n     * @return Observer that can be used to assert the timing of received notifications.\n     */\n    TestScheduler.prototype.createObserver = function () {\n      return new MockObserver(this);\n    };\n\n    return TestScheduler;\n  })(VirtualTimeScheduler);\n\n  return Rx;\n}));\n"
  },
  {
    "path": "dist/rx.experimental.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('./rx'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Aliases\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    ObservableBase = Rx.ObservableBase,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    FlatMapObservable = Rx.FlatMapObservable,\n    observableConcat = Observable.concat,\n    observableDefer = Observable.defer,\n    observableEmpty = Observable.empty,\n    disposableEmpty = Rx.Disposable.empty,\n    CompositeDisposable = Rx.CompositeDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    Enumerable = Rx.internals.Enumerable,\n    enumerableOf = Enumerable.of,\n    currentThreadScheduler = Rx.Scheduler.currentThread,\n    AsyncSubject = Rx.AsyncSubject,\n    Observer = Rx.Observer,\n    inherits = Rx.internals.inherits,\n    addProperties = Rx.internals.addProperties,\n    helpers = Rx.helpers,\n    noop = helpers.noop,\n    isPromise = helpers.isPromise,\n    isFunction = helpers.isFunction,\n    isIterable = Rx.helpers.isIterable,\n    isArrayLike = Rx.helpers.isArrayLike,\n    isScheduler = Rx.Scheduler.isScheduler,\n    observableFromPromise = Observable.fromPromise;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o && o[$iterator$] !== undefined;\n  };\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  };\n\n  Rx.helpers.iterator = $iterator$;\n\n  var WhileEnumerable = (function(__super__) {\n    inherits(WhileEnumerable, __super__);\n    function WhileEnumerable(c, s) {\n      this.c = c;\n      this.s = s;\n    }\n    WhileEnumerable.prototype[$iterator$] = function () {\n      var self = this;\n      return {\n        next: function () {\n          return self.c() ?\n           { done: false, value: self.s } :\n           { done: true, value: void 0 };\n        }\n      };\n    };\n    return WhileEnumerable;\n  }(Enumerable));\n  \n  function enumerableWhile(condition, source) {\n    return new WhileEnumerable(condition, source);\n  }  \n\n   /**\n   *  Returns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions.\n   *  This operator allows for a fluent style of writing queries that use the same sequence multiple times.\n   *\n   * @param {Function} selector Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.letBind = observableProto['let'] = function (func) {\n    return func(this);\n  };\n\n   /**\n   *  Determines whether an observable collection contains values. \n   *\n   * @example\n   *  1 - res = Rx.Observable.if(condition, obs1);\n   *  2 - res = Rx.Observable.if(condition, obs1, obs2);\n   *  3 - res = Rx.Observable.if(condition, obs1, scheduler);\n   * @param {Function} condition The condition which determines if the thenSource or elseSource will be run.\n   * @param {Observable} thenSource The observable sequence or Promise that will be run if the condition function returns true.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the condition function returns false. If this is not provided, it defaults to Rx.Observabe.Empty with the specified scheduler.\n   * @returns {Observable} An observable sequence which is either the thenSource or elseSource.\n   */\n  Observable['if'] = function (condition, thenSource, elseSourceOrScheduler) {\n    return observableDefer(function () {\n      elseSourceOrScheduler || (elseSourceOrScheduler = observableEmpty());\n\n      isPromise(thenSource) && (thenSource = observableFromPromise(thenSource));\n      isPromise(elseSourceOrScheduler) && (elseSourceOrScheduler = observableFromPromise(elseSourceOrScheduler));\n\n      // Assume a scheduler for empty only\n      typeof elseSourceOrScheduler.now === 'function' && (elseSourceOrScheduler = observableEmpty(elseSourceOrScheduler));\n      return condition() ? thenSource : elseSourceOrScheduler;\n    });\n  };\n\n   /**\n   *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n   * There is an alias for this method called 'forIn' for browsers <IE9\n   * @param {Array} sources An array of values to turn into an observable sequence.\n   * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n   * @returns {Observable} An observable sequence from the concatenated observable sequences.\n   */\n  Observable['for'] = Observable.forIn = function (sources, resultSelector, thisArg) {\n    return enumerableOf(sources, resultSelector, thisArg).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a while loop.\n   * There is an alias for this method called 'whileDo' for browsers <IE9\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  var observableWhileDo = Observable['while'] = Observable.whileDo = function (condition, source) {\n    isPromise(source) && (source = observableFromPromise(source));\n    return enumerableWhile(condition, source).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a do while loop.\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  observableProto.doWhile = function (condition) {\n    return observableConcat([this, observableWhileDo(condition, this)]);\n  };\n\n   /**\n   *  Uses selector to determine which source in sources to use.\n   * @param {Function} selector The function which extracts the value for to test in a case statement.\n   * @param {Array} sources A object which has keys which correspond to the case statement labels.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n   *\n   * @returns {Observable} An observable sequence which is determined by a case statement.\n   */\n  Observable['case'] = function (selector, sources, defaultSourceOrScheduler) {\n    return observableDefer(function () {\n      isPromise(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableFromPromise(defaultSourceOrScheduler));\n      defaultSourceOrScheduler || (defaultSourceOrScheduler = observableEmpty());\n\n      isScheduler(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableEmpty(defaultSourceOrScheduler));\n\n      var result = sources[selector()];\n      isPromise(result) && (result = observableFromPromise(result));\n\n      return result || defaultSourceOrScheduler;\n    });\n  };\n\n  var ExpandObservable = (function(__super__) {\n    inherits(ExpandObservable, __super__);\n    function ExpandObservable(source, fn, scheduler) {\n      this.source = source;\n      this._fn = fn;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(args, recurse) {\n      var state = args[0], self = args[1];\n      var work;\n      if (state.q.length > 0) {\n        work = state.q.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var m1 = new SingleAssignmentDisposable();\n      state.d.add(m1);\n      m1.setDisposable(work.subscribe(new ExpandObserver(state, self, m1)));\n      recurse([state, self]);\n    }\n\n    ExpandObservable.prototype._ensureActive = function (state) {\n      var isOwner = false;\n      if (state.q.length > 0) {\n        isOwner = !state.isAcquired;\n        state.isAcquired = true;\n      }\n      isOwner && state.m.setDisposable(this._scheduler.scheduleRecursive([state, this], scheduleRecursive));\n    };\n\n    ExpandObservable.prototype.subscribeCore = function (o) {\n      var m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        state = {\n          q: [],\n          m: m,\n          d: d,\n          activeCount: 0,\n          isAcquired: false,\n          o: o\n        };\n\n      state.q.push(this.source);\n      state.activeCount++;\n      this._ensureActive(state);\n      return d;\n    };\n\n    return ExpandObservable;\n  }(ObservableBase));\n\n  var ExpandObserver = (function(__super__) {\n    inherits(ExpandObserver, __super__);\n    function ExpandObserver(state, parent, m1) {\n      this._s = state;\n      this._p = parent;\n      this._m1 = m1;\n      __super__.call(this);\n    }\n\n    ExpandObserver.prototype.next = function (x) {\n      this._s.o.onNext(x);\n      var result = tryCatch(this._p._fn)(x);\n      if (result === errorObj) { return this._s.o.onError(result.e); }\n      this._s.q.push(result);\n      this._s.activeCount++;\n      this._p._ensureActive(this._s);\n    };\n\n    ExpandObserver.prototype.error = function (e) {\n      this._s.o.onError(e);\n    };\n\n    ExpandObserver.prototype.completed = function () {\n      this._s.d.remove(this._m1);\n      this._s.activeCount--;\n      this._s.activeCount === 0 && this._s.o.onCompleted();\n    };\n\n    return ExpandObserver;\n  }(AbstractObserver));\n\n   /**\n   *  Expands an observable sequence by recursively invoking selector.\n   *\n   * @param {Function} selector Selector function to invoke for each produced element, resulting in another sequence to which the selector will be invoked recursively again.\n   * @param {Scheduler} [scheduler] Scheduler on which to perform the expansion. If not provided, this defaults to the current thread scheduler.\n   * @returns {Observable} An observable sequence containing all the elements produced by the recursive expansion.\n   */\n  observableProto.expand = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new ExpandObservable(this, selector, scheduler);\n  };\n\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var ForkJoinObservable = (function (__super__) {\n    inherits(ForkJoinObservable, __super__);\n    function ForkJoinObservable(sources, cb) {\n      this._sources = sources;\n      this._cb = cb;\n      __super__.call(this);\n    }\n\n    ForkJoinObservable.prototype.subscribeCore = function (o) {\n      if (this._sources.length === 0) {\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      var count = this._sources.length;\n      var state = {\n        finished: false,\n        hasResults: new Array(count),\n        hasCompleted: new Array(count),\n        results: new Array(count)\n      };\n\n      var subscriptions = new CompositeDisposable();\n      for (var i = 0, len = this._sources.length; i < len; i++) {\n        var source = this._sources[i];\n        isPromise(source) && (source = observableFromPromise(source));\n        subscriptions.add(source.subscribe(new ForkJoinObserver(o, state, i, this._cb, subscriptions)));\n      }\n\n      return subscriptions;\n    };\n\n    return ForkJoinObservable;\n  }(ObservableBase));\n\n  var ForkJoinObserver = (function(__super__) {\n    inherits(ForkJoinObserver, __super__);\n    function ForkJoinObserver(o, s, i, cb, subs) {\n      this._o = o;\n      this._s = s;\n      this._i = i;\n      this._cb = cb;\n      this._subs = subs;\n      __super__.call(this);\n    }\n\n    ForkJoinObserver.prototype.next = function (x) {\n      if (!this._s.finished) {\n        this._s.hasResults[this._i] = true;\n        this._s.results[this._i] = x;\n      }\n    };\n\n    ForkJoinObserver.prototype.error = function (e) {\n      this._s.finished = true;\n      this._o.onError(e);\n      this._subs.dispose();\n    };\n\n    ForkJoinObserver.prototype.completed = function () {\n      if (!this._s.finished) {\n        if (!this._s.hasResults[this._i]) {\n          return this._o.onCompleted();\n        }\n        this._s.hasCompleted[this._i] = true;\n        for (var i = 0; i < this._s.results.length; i++) {\n          if (!this._s.hasCompleted[i]) { return; }\n        }\n        this._s.finished = true;\n\n        var res = tryCatch(this._cb).apply(null, this._s.results);\n        if (res === errorObj) { return this._o.onError(res.e); }\n\n        this._o.onNext(res);\n        this._o.onCompleted();\n      }\n    };\n\n    return ForkJoinObserver;\n  }(AbstractObserver));\n\n   /**\n   *  Runs all observable sequences in parallel and collect their last elements.\n   *\n   * @example\n   *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n   *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n   * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n   */\n  Observable.forkJoin = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n    return new ForkJoinObservable(args, resultSelector);\n  };\n\n   /**\n   *  Runs two observable sequences in parallel and combines their last elemenets.\n   * @param {Observable} second Second observable sequence.\n   * @param {Function} resultSelector Result selector function to invoke with the last elements of both sequences.\n   * @returns {Observable} An observable sequence with the result of calling the selector function with the last elements of both input sequences.\n   */\n  observableProto.forkJoin = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return Observable.forkJoin.apply(null, args);\n  };\n\n  /**\n   * Comonadic bind operator.\n   * @param {Function} selector A transform function to apply to each element.\n   * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n   * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n   */\n  observableProto.manySelect = observableProto.extend = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = Rx.Scheduler.immediate);\n    var source = this;\n    return observableDefer(function () {\n      var chain;\n\n      return source\n        .map(function (x) {\n          var curr = new ChainObservable(x);\n\n          chain && chain.onNext(x);\n          chain = curr;\n\n          return curr;\n        })\n        .tap(\n          noop,\n          function (e) { chain && chain.onError(e); },\n          function () { chain && chain.onCompleted(); }\n        )\n        .observeOn(scheduler)\n        .map(selector);\n    }, source);\n  };\n\n  var ChainObservable = (function (__super__) {\n    inherits(ChainObservable, __super__);\n    function ChainObservable(head) {\n      __super__.call(this);\n      this.head = head;\n      this.tail = new AsyncSubject();\n    }\n\n    addProperties(ChainObservable.prototype, Observer, {\n      _subscribe: function (o) {\n        var g = new CompositeDisposable();\n        g.add(currentThreadScheduler.schedule(this, function (_, self) {\n          o.onNext(self.head);\n          g.add(self.tail.mergeAll().subscribe(o));\n        }));\n\n        return g;\n      },\n      onCompleted: function () {\n        this.onNext(Observable.empty());\n      },\n      onError: function (e) {\n        this.onNext(Observable['throw'](e));\n      },\n      onNext: function (v) {\n        this.tail.onNext(v);\n        this.tail.onCompleted();\n      }\n    });\n\n    return ChainObservable;\n\n  }(Observable));\n\n  var SwitchFirstObservable = (function (__super__) {\n    inherits(SwitchFirstObservable, __super__);\n    function SwitchFirstObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    SwitchFirstObservable.prototype.subscribeCore = function (o) {\n      var m = new SingleAssignmentDisposable(),\n        g = new CompositeDisposable(),\n        state = {\n          hasCurrent: false,\n          isStopped: false,\n          o: o,\n          g: g\n        };\n\n      g.add(m);\n      m.setDisposable(this.source.subscribe(new SwitchFirstObserver(state)));\n      return g;\n    };\n\n    return SwitchFirstObservable;\n  }(ObservableBase));\n\n  var SwitchFirstObserver = (function(__super__) {\n    inherits(SwitchFirstObserver, __super__);\n    function SwitchFirstObserver(state) {\n      this._s = state;\n      __super__.call(this);\n    }\n\n    SwitchFirstObserver.prototype.next = function (x) {\n      if (!this._s.hasCurrent) {\n        this._s.hasCurrent = true;\n        isPromise(x) && (x = observableFromPromise(x));\n        var inner = new SingleAssignmentDisposable();\n        this._s.g.add(inner);\n        inner.setDisposable(x.subscribe(new InnerObserver(this._s, inner)));\n      }\n    };\n\n    SwitchFirstObserver.prototype.error = function (e) {\n      this._s.o.onError(e);\n    };\n\n    SwitchFirstObserver.prototype.completed = function () {\n      this._s.isStopped = true;\n      !this._s.hasCurrent && this._s.g.length === 1 && this._s.o.onCompleted();\n    };\n\n    inherits(InnerObserver, __super__);\n    function InnerObserver(state, inner) {\n      this._s = state;\n      this._i = inner;\n      __super__.call(this);\n    }\n\n    InnerObserver.prototype.next = function (x) { this._s.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    InnerObserver.prototype.completed = function () {\n      this._s.g.remove(this._i);\n      this._s.hasCurrent = false;\n      this._s.isStopped && this._s.g.length === 1 && this._s.o.onCompleted();\n    };\n\n    return SwitchFirstObserver;\n  }(AbstractObserver));\n\n  /**\n   * Performs a exclusive waiting for the first to finish before subscribing to another observable.\n   * Observables that come in between subscriptions will be dropped on the floor.\n   * @returns {Observable} A exclusive observable with only the results that happen when subscribed.\n   */\n  observableProto.switchFirst = function () {\n    return new SwitchFirstObservable(this);\n  };\n\nobservableProto.flatMapFirst = observableProto.exhaustMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).switchFirst();\n};\n\nobservableProto.flatMapWithMaxConcurrent = observableProto.flatMapMaxConcurrent = function(limit, selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).merge(limit);\n};\n\n  return Rx;\n}));\n"
  },
  {
    "path": "dist/rx.joinpatterns.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('./rx'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Aliases\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    observableThrow = Observable.throwError,\n    observerCreate = Rx.Observer.create,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    noop = Rx.helpers.noop,\n    inherits = Rx.internals.inherits,\n    isFunction = Rx.helpers.isFunction;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  var Map = root.Map || (function () {\n    function Map() {\n      this.size = 0;\n      this._values = [];\n      this._keys = [];\n    }\n\n    Map.prototype['delete'] = function (key) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) { return false; }\n      this._values.splice(i, 1);\n      this._keys.splice(i, 1);\n      this.size--;\n      return true;\n    };\n\n    Map.prototype.get = function (key) {\n      var i = this._keys.indexOf(key);\n      return i === -1 ? undefined : this._values[i];\n    };\n\n    Map.prototype.set = function (key, value) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) {\n        this._keys.push(key);\n        this._values.push(value);\n        this.size++;\n      } else {\n        this._values[i] = value;\n      }\n      return this;\n    };\n\n    Map.prototype.forEach = function (cb, thisArg) {\n      for (var i = 0; i < this.size; i++) {\n        cb.call(thisArg, this._values[i], this._keys[i]);\n      }\n    };\n\n    return Map;\n  }());\n\n  /**\n   * @constructor\n   * Represents a join pattern over observable sequences.\n   */\n  function Pattern(patterns) {\n    this.patterns = patterns;\n  }\n\n  /**\n   *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n   *  @param other Observable sequence to match in addition to the current pattern.\n   *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n   */\n  Pattern.prototype.and = function (other) {\n    return new Pattern(this.patterns.concat(other));\n  };\n\n  /**\n   *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n   *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n   *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  Pattern.prototype.thenDo = function (selector) {\n    return new Plan(this, selector);\n  };\n\n  function Plan(expression, selector) {\n    this.expression = expression;\n    this.selector = selector;\n  }\n\n  function handleOnError(o) { return function (e) { o.onError(e); }; }\n  function handleOnNext(self, observer) {\n    return function onNext () {\n      var result = tryCatch(self.selector).apply(self, arguments);\n      if (result === errorObj) { return observer.onError(result.e); }\n      observer.onNext(result);\n    };\n  }\n\n  Plan.prototype.activate = function (externalSubscriptions, observer, deactivate) {\n    var joinObservers = [], errHandler = handleOnError(observer);\n    for (var i = 0, len = this.expression.patterns.length; i < len; i++) {\n      joinObservers.push(planCreateObserver(externalSubscriptions, this.expression.patterns[i], errHandler));\n    }\n    var activePlan = new ActivePlan(joinObservers, handleOnNext(this, observer), function () {\n      for (var j = 0, jlen = joinObservers.length; j < jlen; j++) {\n        joinObservers[j].removeActivePlan(activePlan);\n      }\n      deactivate(activePlan);\n    });\n    for (i = 0, len = joinObservers.length; i < len; i++) {\n      joinObservers[i].addActivePlan(activePlan);\n    }\n    return activePlan;\n  };\n\n  function planCreateObserver(externalSubscriptions, observable, onError) {\n    var entry = externalSubscriptions.get(observable);\n    if (!entry) {\n      var observer = new JoinObserver(observable, onError);\n      externalSubscriptions.set(observable, observer);\n      return observer;\n    }\n    return entry;\n  }\n\n  function ActivePlan(joinObserverArray, onNext, onCompleted) {\n    this.joinObserverArray = joinObserverArray;\n    this.onNext = onNext;\n    this.onCompleted = onCompleted;\n    this.joinObservers = new Map();\n    for (var i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      var joinObserver = this.joinObserverArray[i];\n      this.joinObservers.set(joinObserver, joinObserver);\n    }\n  }\n\n  ActivePlan.prototype.dequeue = function () {\n    this.joinObservers.forEach(function (v) { v.queue.shift(); });\n  };\n\n  ActivePlan.prototype.match = function () {\n    var i, len, hasValues = true;\n    for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      if (this.joinObserverArray[i].queue.length === 0) {\n        hasValues = false;\n        break;\n      }\n    }\n    if (hasValues) {\n      var firstValues = [],\n          isCompleted = false;\n      for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n        firstValues.push(this.joinObserverArray[i].queue[0]);\n        this.joinObserverArray[i].queue[0].kind === 'C' && (isCompleted = true);\n      }\n      if (isCompleted) {\n        this.onCompleted();\n      } else {\n        this.dequeue();\n        var values = [];\n        for (i = 0, len = firstValues.length; i < firstValues.length; i++) {\n          values.push(firstValues[i].value);\n        }\n        this.onNext.apply(this, values);\n      }\n    }\n  };\n\n  var JoinObserver = (function (__super__) {\n    inherits(JoinObserver, __super__);\n\n    function JoinObserver(source, onError) {\n      __super__.call(this);\n      this.source = source;\n      this.onError = onError;\n      this.queue = [];\n      this.activePlans = [];\n      this.subscription = new SingleAssignmentDisposable();\n      this.isDisposed = false;\n    }\n\n    var JoinObserverPrototype = JoinObserver.prototype;\n\n    JoinObserverPrototype.next = function (notification) {\n      if (!this.isDisposed) {\n        if (notification.kind === 'E') {\n          return this.onError(notification.error);\n        }\n        this.queue.push(notification);\n        var activePlans = this.activePlans.slice(0);\n        for (var i = 0, len = activePlans.length; i < len; i++) {\n          activePlans[i].match();\n        }\n      }\n    };\n\n    JoinObserverPrototype.error = noop;\n    JoinObserverPrototype.completed = noop;\n\n    JoinObserverPrototype.addActivePlan = function (activePlan) {\n      this.activePlans.push(activePlan);\n    };\n\n    JoinObserverPrototype.subscribe = function () {\n      this.subscription.setDisposable(this.source.materialize().subscribe(this));\n    };\n\n    JoinObserverPrototype.removeActivePlan = function (activePlan) {\n      this.activePlans.splice(this.activePlans.indexOf(activePlan), 1);\n      this.activePlans.length === 0 && this.dispose();\n    };\n\n    JoinObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this.subscription.dispose();\n      }\n    };\n\n    return JoinObserver;\n  } (AbstractObserver));\n\n  /**\n   *  Creates a pattern that matches when both observable sequences have an available value.\n   *\n   *  @param right Observable sequence to match with the current sequence.\n   *  @return {Pattern} Pattern object that matches when both observable sequences have an available value.\n   */\n  observableProto.and = function (right) {\n    return new Pattern([this, right]);\n  };\n\n  /**\n   *  Matches when the observable sequence has an available value and projects the value.\n   *\n   *  @param {Function} selector Selector that will be invoked for values in the source sequence.\n   *  @returns {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  observableProto.thenDo = function (selector) {\n    return new Pattern([this]).thenDo(selector);\n  };\n\n  /**\n   *  Joins together the results from several patterns.\n   *\n   *  @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns.\n   *  @returns {Observable} Observable sequence with the results form matching several patterns.\n   */\n  Observable.when = function () {\n    var len = arguments.length, plans;\n    if (Array.isArray(arguments[0])) {\n      plans = arguments[0];\n    } else {\n      plans = new Array(len);\n      for(var i = 0; i < len; i++) { plans[i] = arguments[i]; }\n    }\n    return new AnonymousObservable(function (o) {\n      var activePlans = [],\n          externalSubscriptions = new Map();\n      var outObserver = observerCreate(\n        function (x) { o.onNext(x); },\n        function (err) {\n          externalSubscriptions.forEach(function (v) { v.onError(err); });\n          o.onError(err);\n        },\n        function (x) { o.onCompleted(); }\n      );\n      try {\n        for (var i = 0, len = plans.length; i < len; i++) {\n          activePlans.push(plans[i].activate(externalSubscriptions, outObserver, function (activePlan) {\n            var idx = activePlans.indexOf(activePlan);\n            activePlans.splice(idx, 1);\n            activePlans.length === 0 && o.onCompleted();\n          }));\n        }\n      } catch (e) {\n        return observableThrow(e).subscribe(o);\n      }\n      var group = new CompositeDisposable();\n      externalSubscriptions.forEach(function (joinObserver) {\n        joinObserver.subscribe();\n        group.add(joinObserver);\n      });\n\n      return group;\n    });\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "dist/rx.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (undefined) {\n\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  var Rx = {\n    internals: {},\n    config: {\n      Promise: root.Promise\n    },\n    helpers: { }\n  };\n\n  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    defaultNow = Rx.helpers.defaultNow = Date.now,\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.subscribe !== 'function' && typeof p.then === 'function'; },\n    isFunction = Rx.helpers.isFunction = (function () {\n\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      };\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n\n      return isFn;\n    }());\n\n  function cloneArray(arr) { for(var a = [], i = 0, len = arr.length; i < len; i++) { a.push(arr[i]); } return a;}\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  Rx.config.longStackSupport = false;\n  var hasStacks = false, stacks = tryCatch(function () { throw new Error(); })();\n  hasStacks = !!stacks.e && !!stacks.e.stack;\n\n  // All code after this point will be filtered from stack traces reported by RxJS\n  var rStartingLine = captureLine(), rFileName;\n\n  var STACK_JUMP_SEPARATOR = 'From previous event:';\n\n  function makeStackTraceLong(error, observable) {\n    // If possible, transform the error stack trace by removing Node and RxJS\n    // cruft, then concatenating with the stack trace of `observable`.\n    if (hasStacks &&\n        observable.stack &&\n        typeof error === 'object' &&\n        error !== null &&\n        error.stack &&\n        error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n    ) {\n      var stacks = [];\n      for (var o = observable; !!o; o = o.source) {\n        if (o.stack) {\n          stacks.unshift(o.stack);\n        }\n      }\n      stacks.unshift(error.stack);\n\n      var concatedStacks = stacks.join('\\n' + STACK_JUMP_SEPARATOR + '\\n');\n      error.stack = filterStackString(concatedStacks);\n    }\n  }\n\n  function filterStackString(stackString) {\n    var lines = stackString.split('\\n'), desiredLines = [];\n    for (var i = 0, len = lines.length; i < len; i++) {\n      var line = lines[i];\n\n      if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n        desiredLines.push(line);\n      }\n    }\n    return desiredLines.join('\\n');\n  }\n\n  function isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n    if (!fileNameAndLineNumber) {\n      return false;\n    }\n    var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === rFileName &&\n      lineNumber >= rStartingLine &&\n      lineNumber <= rEndingLine;\n  }\n\n  function isNodeFrame(stackLine) {\n    return stackLine.indexOf('(module.js:') !== -1 ||\n      stackLine.indexOf('(node.js:') !== -1;\n  }\n\n  function captureLine() {\n    if (!hasStacks) { return; }\n\n    try {\n      throw new Error();\n    } catch (e) {\n      var lines = e.stack.split('\\n');\n      var firstLine = lines[0].indexOf('@') > 0 ? lines[1] : lines[2];\n      var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n      if (!fileNameAndLineNumber) { return; }\n\n      rFileName = fileNameAndLineNumber[0];\n      return fileNameAndLineNumber[1];\n    }\n  }\n\n  function getFileNameAndLineNumber(stackLine) {\n    // Named functions: 'at functionName (filename:lineNumber:columnNumber)'\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }\n\n    // Anonymous functions: 'at filename:lineNumber:columnNumber'\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }\n\n    // Firefox style: 'function@filename:lineNumber or @filename:lineNumber'\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }\n  }\n\n  var EmptyError = Rx.EmptyError = function() {\n    this.message = 'Sequence contains no elements.';\n    Error.call(this);\n  };\n  EmptyError.prototype = Object.create(Error.prototype);\n  EmptyError.prototype.name = 'EmptyError';\n\n  var ObjectDisposedError = Rx.ObjectDisposedError = function() {\n    this.message = 'Object has been disposed';\n    Error.call(this);\n  };\n  ObjectDisposedError.prototype = Object.create(Error.prototype);\n  ObjectDisposedError.prototype.name = 'ObjectDisposedError';\n\n  var ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError = function () {\n    this.message = 'Argument out of range';\n    Error.call(this);\n  };\n  ArgumentOutOfRangeError.prototype = Object.create(Error.prototype);\n  ArgumentOutOfRangeError.prototype.name = 'ArgumentOutOfRangeError';\n\n  var NotSupportedError = Rx.NotSupportedError = function (message) {\n    this.message = message || 'This operation is not supported';\n    Error.call(this);\n  };\n  NotSupportedError.prototype = Object.create(Error.prototype);\n  NotSupportedError.prototype.name = 'NotSupportedError';\n\n  var NotImplementedError = Rx.NotImplementedError = function (message) {\n    this.message = message || 'This operation is not implemented';\n    Error.call(this);\n  };\n  NotImplementedError.prototype = Object.create(Error.prototype);\n  NotImplementedError.prototype.name = 'NotImplementedError';\n\n  var notImplemented = Rx.helpers.notImplemented = function () {\n    throw new NotImplementedError();\n  };\n\n  var notSupported = Rx.helpers.notSupported = function () {\n    throw new NotSupportedError();\n  };\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o && o[$iterator$] !== undefined;\n  };\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  };\n\n  Rx.helpers.iterator = $iterator$;\n\n  var bindCallback = Rx.internals.bindCallback = function (func, thisArg, argCount) {\n    if (typeof thisArg === 'undefined') { return func; }\n    switch(argCount) {\n      case 0:\n        return function() {\n          return func.call(thisArg)\n        };\n      case 1:\n        return function(arg) {\n          return func.call(thisArg, arg);\n        };\n      case 2:\n        return function(value, index) {\n          return func.call(thisArg, value, index);\n        };\n      case 3:\n        return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n    }\n\n    return function() {\n      return func.apply(thisArg, arguments);\n    };\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var dontEnums = ['toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'],\n  dontEnumsLength = dontEnums.length;\n\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\nvar objectProto = Object.prototype,\n    hasOwnProperty = objectProto.hasOwnProperty,\n    objToString = objectProto.toString,\n    MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\nvar keys = Object.keys || (function() {\n    var hasOwnProperty = Object.prototype.hasOwnProperty,\n        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),\n        dontEnums = [\n          'toString',\n          'toLocaleString',\n          'valueOf',\n          'hasOwnProperty',\n          'isPrototypeOf',\n          'propertyIsEnumerable',\n          'constructor'\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    return function(obj) {\n      if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n        throw new TypeError('Object.keys called on non-object');\n      }\n\n      var result = [], prop, i;\n\n      for (prop in obj) {\n        if (hasOwnProperty.call(obj, prop)) {\n          result.push(prop);\n        }\n      }\n\n      if (hasDontEnumBug) {\n        for (i = 0; i < dontEnumsLength; i++) {\n          if (hasOwnProperty.call(obj, dontEnums[i])) {\n            result.push(dontEnums[i]);\n          }\n        }\n      }\n      return result;\n    };\n  }());\n\nfunction equalObjects(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objProps = keys(object),\n      objLength = objProps.length,\n      othProps = keys(other),\n      othLength = othProps.length;\n\n  if (objLength !== othLength && !isLoose) {\n    return false;\n  }\n  var index = objLength, key;\n  while (index--) {\n    key = objProps[index];\n    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  var skipCtor = isLoose;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key],\n        result;\n\n    if (!(result === undefined ? equalFunc(objValue, othValue, isLoose, stackA, stackB) : result)) {\n      return false;\n    }\n    skipCtor || (skipCtor = key === 'constructor');\n  }\n  if (!skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    if (objCtor !== othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor === 'function' && objCtor instanceof objCtor &&\n          typeof othCtor === 'function' && othCtor instanceof othCtor)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction equalByTag(object, other, tag) {\n  switch (tag) {\n    case boolTag:\n    case dateTag:\n      return +object === +other;\n\n    case errorTag:\n      return object.name === other.name && object.message === other.message;\n\n    case numberTag:\n      return (object !== +object) ?\n        other !== +other :\n        object === +other;\n\n    case regexpTag:\n    case stringTag:\n      return object === (other + '');\n  }\n  return false;\n}\n\nvar isObject = Rx.internals.isObject = function(value) {\n  var type = typeof value;\n  return !!value && (type === 'object' || type === 'function');\n};\n\nfunction isObjectLike(value) {\n  return !!value && typeof value === 'object';\n}\n\nfunction isLength(value) {\n  return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nvar isHostObject = (function() {\n  try {\n    Object({ 'toString': 0 } + '');\n  } catch(e) {\n    return function() { return false; };\n  }\n  return function(value) {\n    return typeof value.toString !== 'function' && typeof (value + '') === 'string';\n  };\n}());\n\nfunction isTypedArray(value) {\n  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nvar isArray = Array.isArray || function(value) {\n  return isObjectLike(value) && isLength(value.length) && objToString.call(value) === arrayTag;\n};\n\nfunction arraySome (array, predicate) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction equalArrays(array, other, equalFunc, isLoose, stackA, stackB) {\n  var index = -1,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength !== othLength && !(isLoose && othLength > arrLength)) {\n    return false;\n  }\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index],\n        result;\n\n    if (result !== undefined) {\n      if (result) {\n        continue;\n      }\n      return false;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (isLoose) {\n      if (!arraySome(other, function(othValue) {\n            return arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB);\n          })) {\n        return false;\n      }\n    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB))) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction baseIsEqualDeep(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = arrayTag,\n      othTag = arrayTag;\n\n  if (!objIsArr) {\n    objTag = objToString.call(object);\n    if (objTag === argsTag) {\n      objTag = objectTag;\n    } else if (objTag !== objectTag) {\n      objIsArr = isTypedArray(object);\n    }\n  }\n  if (!othIsArr) {\n    othTag = objToString.call(other);\n    if (othTag === argsTag) {\n      othTag = objectTag;\n    }\n  }\n  var objIsObj = objTag === objectTag && !isHostObject(object),\n      othIsObj = othTag === objectTag && !isHostObject(other),\n      isSameTag = objTag === othTag;\n\n  if (isSameTag && !(objIsArr || objIsObj)) {\n    return equalByTag(object, other, objTag);\n  }\n  if (!isLoose) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, isLoose, stackA, stackB);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  // For more information on detecting circular references see https://es5.github.io/#JO.\n  stackA || (stackA = []);\n  stackB || (stackB = []);\n\n  var length = stackA.length;\n  while (length--) {\n    if (stackA[length] === object) {\n      return stackB[length] === other;\n    }\n  }\n  // Add `object` and `other` to the stack of traversed objects.\n  stackA.push(object);\n  stackB.push(other);\n\n  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, isLoose, stackA, stackB);\n\n  stackA.pop();\n  stackB.pop();\n\n  return result;\n}\n\nfunction baseIsEqual(value, other, isLoose, stackA, stackB) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, baseIsEqual, isLoose, stackA, stackB);\n}\n\nvar isEqual = Rx.internals.isEqual = function (value, other) {\n  return baseIsEqual(value, other);\n};\n\n  var hasProp = {}.hasOwnProperty,\n      slice = Array.prototype.slice;\n\n  var inherits = Rx.internals.inherits = function (child, parent) {\n    function __() { this.constructor = child; }\n    __.prototype = parent.prototype;\n    child.prototype = new __();\n  };\n\n  var addProperties = Rx.internals.addProperties = function (obj) {\n    for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n      var source = sources[idx];\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n  };\n\n  // Rx Utils\n  var addRef = Rx.internals.addRef = function (xs, r) {\n    return new AnonymousObservable(function (observer) {\n      return new BinaryDisposable(r.getDisposable(), xs.subscribe(observer));\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n\n  /**\n   * Represents a group of disposable resources that are disposed together.\n   * @constructor\n   */\n  var CompositeDisposable = Rx.CompositeDisposable = function () {\n    var args = [], i, len;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      len = arguments.length;\n      args = new Array(len);\n      for(i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    this.disposables = args;\n    this.isDisposed = false;\n    this.length = args.length;\n  };\n\n  var CompositeDisposablePrototype = CompositeDisposable.prototype;\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Mixed} item Disposable to add.\n   */\n  CompositeDisposablePrototype.add = function (item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n      this.length++;\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Mixed} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n  CompositeDisposablePrototype.remove = function (item) {\n    var shouldDispose = false;\n    if (!this.isDisposed) {\n      var idx = this.disposables.indexOf(item);\n      if (idx !== -1) {\n        shouldDispose = true;\n        this.disposables.splice(idx, 1);\n        this.length--;\n        item.dispose();\n      }\n    }\n    return shouldDispose;\n  };\n\n  /**\n   *  Disposes all disposables in the group and removes them from the group.\n   */\n  CompositeDisposablePrototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var len = this.disposables.length, currentDisposables = new Array(len);\n      for(var i = 0; i < len; i++) { currentDisposables[i] = this.disposables[i]; }\n      this.disposables = [];\n      this.length = 0;\n\n      for (i = 0; i < len; i++) {\n        currentDisposables[i].dispose();\n      }\n    }\n  };\n\n  /**\n   * Provides a set of static methods for creating Disposables.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   */\n  var Disposable = Rx.Disposable = function (action) {\n    this.isDisposed = false;\n    this.action = action || noop;\n  };\n\n  /** Performs the task of cleaning up resources. */\n  Disposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.action();\n      this.isDisposed = true;\n    }\n  };\n\n  /**\n   * Creates a disposable object that invokes the specified action when disposed.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   * @return {Disposable} The disposable object that runs the given action upon disposal.\n   */\n  var disposableCreate = Disposable.create = function (action) { return new Disposable(action); };\n\n  /**\n   * Gets the disposable that does nothing when disposed.\n   */\n  var disposableEmpty = Disposable.empty = { dispose: noop };\n\n  /**\n   * Validates whether the given object is a disposable\n   * @param {Object} Object to test whether it has a dispose method\n   * @returns {Boolean} true if a disposable object, else false.\n   */\n  var isDisposable = Disposable.isDisposable = function (d) {\n    return d && isFunction(d.dispose);\n  };\n\n  var checkDisposed = Disposable.checkDisposed = function (disposable) {\n    if (disposable.isDisposed) { throw new ObjectDisposedError(); }\n  };\n\n  var disposableFixup = Disposable._fixup = function (result) {\n    return isDisposable(result) ? result : disposableEmpty;\n  };\n\n  // Single assignment\n  var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SingleAssignmentDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SingleAssignmentDisposable.prototype.setDisposable = function (value) {\n    if (this.current) { throw new Error('Disposable has already been assigned'); }\n    var shouldDispose = this.isDisposed;\n    !shouldDispose && (this.current = value);\n    shouldDispose && value && value.dispose();\n  };\n  SingleAssignmentDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n      old && old.dispose();\n    }\n  };\n\n  // Multiple assignment disposable\n  var SerialDisposable = Rx.SerialDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SerialDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SerialDisposable.prototype.setDisposable = function (value) {\n    var shouldDispose = this.isDisposed;\n    if (!shouldDispose) {\n      var old = this.current;\n      this.current = value;\n    }\n    old && old.dispose();\n    shouldDispose && value && value.dispose();\n  };\n  SerialDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n    }\n    old && old.dispose();\n  };\n\n  var BinaryDisposable = Rx.BinaryDisposable = function (first, second) {\n    this._first = first;\n    this._second = second;\n    this.isDisposed = false;\n  };\n\n  BinaryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old1 = this._first;\n      this._first = null;\n      old1 && old1.dispose();\n      var old2 = this._second;\n      this._second = null;\n      old2 && old2.dispose();\n    }\n  };\n\n  var NAryDisposable = Rx.NAryDisposable = function (disposables) {\n    this._disposables = disposables;\n    this.isDisposed = false;\n  };\n\n  NAryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      for (var i = 0, len = this._disposables.length; i < len; i++) {\n        this._disposables[i].dispose();\n      }\n      this._disposables.length = 0;\n    }\n  };\n\n  /**\n   * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n   */\n  var RefCountDisposable = Rx.RefCountDisposable = (function () {\n\n    function InnerDisposable(disposable) {\n      this.disposable = disposable;\n      this.disposable.count++;\n      this.isInnerDisposed = false;\n    }\n\n    InnerDisposable.prototype.dispose = function () {\n      if (!this.disposable.isDisposed && !this.isInnerDisposed) {\n        this.isInnerDisposed = true;\n        this.disposable.count--;\n        if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {\n          this.disposable.isDisposed = true;\n          this.disposable.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Initializes a new instance of the RefCountDisposable with the specified disposable.\n     * @constructor\n     * @param {Disposable} disposable Underlying disposable.\n      */\n    function RefCountDisposable(disposable) {\n      this.underlyingDisposable = disposable;\n      this.isDisposed = false;\n      this.isPrimaryDisposed = false;\n      this.count = 0;\n    }\n\n    /**\n     * Disposes the underlying disposable only when all dependent disposables have been disposed\n     */\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed && !this.isPrimaryDisposed) {\n        this.isPrimaryDisposed = true;\n        if (this.count === 0) {\n          this.isDisposed = true;\n          this.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n     * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n     */\n    RefCountDisposable.prototype.getDisposable = function () {\n      return this.isDisposed ? disposableEmpty : new InnerDisposable(this);\n    };\n\n    return RefCountDisposable;\n  })();\n\n  function ScheduledDisposable(scheduler, disposable) {\n    this.scheduler = scheduler;\n    this.disposable = disposable;\n    this.isDisposed = false;\n  }\n\n  function scheduleItem(s, self) {\n    if (!self.isDisposed) {\n      self.isDisposed = true;\n      self.disposable.dispose();\n    }\n  }\n\n  ScheduledDisposable.prototype.dispose = function () {\n    this.scheduler.schedule(this, scheduleItem);\n  };\n\n  var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) {\n    this.scheduler = scheduler;\n    this.state = state;\n    this.action = action;\n    this.dueTime = dueTime;\n    this.comparer = comparer || defaultSubComparer;\n    this.disposable = new SingleAssignmentDisposable();\n  };\n\n  ScheduledItem.prototype.invoke = function () {\n    this.disposable.setDisposable(this.invokeCore());\n  };\n\n  ScheduledItem.prototype.compareTo = function (other) {\n    return this.comparer(this.dueTime, other.dueTime);\n  };\n\n  ScheduledItem.prototype.isCancelled = function () {\n    return this.disposable.isDisposed;\n  };\n\n  ScheduledItem.prototype.invokeCore = function () {\n    return disposableFixup(this.action(this.scheduler, this.state));\n  };\n\n  /** Provides a set of static properties to access commonly used schedulers. */\n  var Scheduler = Rx.Scheduler = (function () {\n\n    function Scheduler() { }\n\n    /** Determines whether the given object is a scheduler */\n    Scheduler.isScheduler = function (s) {\n      return s instanceof Scheduler;\n    };\n\n    var schedulerProto = Scheduler.prototype;\n\n    /**\n   * Schedules an action to be executed.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.schedule = function (state, action) {\n      throw new NotImplementedError();\n    };\n\n  /**\n   * Schedules an action to be executed after dueTime.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @param {Number} dueTime Relative time after which to execute the action.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime;\n      dt instanceof Date && (dt = dt - this.now());\n      dt = Scheduler.normalize(dt);\n\n      if (dt === 0) { return this.schedule(state, action); }\n\n      return this._scheduleFuture(state, dt, action);\n    };\n\n    schedulerProto._scheduleFuture = function (state, dueTime, action) {\n      throw new NotImplementedError();\n    };\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.now = defaultNow;\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.prototype.now = defaultNow;\n\n    /**\n     * Normalizes the specified TimeSpan value to a positive value.\n     * @param {Number} timeSpan The time span value to normalize.\n     * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n     */\n    Scheduler.normalize = function (timeSpan) {\n      timeSpan < 0 && (timeSpan = 0);\n      return timeSpan;\n    };\n\n    return Scheduler;\n  }());\n\n  var normalizeTime = Scheduler.normalize, isScheduler = Scheduler.isScheduler;\n\n  (function (schedulerProto) {\n\n    function invokeRecImmediate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.schedule(state2, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    function invokeRecDate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2, dueTime1) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.scheduleFuture(state2, dueTime1, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursive = function (state, action) {\n      return this.schedule([state, action], invokeRecImmediate);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative or absolute due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number | Date} dueTime Relative or absolute time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveFuture = function (state, dueTime, action) {\n      return this.scheduleFuture([state, action], dueTime, invokeRecDate);\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    schedulerProto.schedulePeriodic = function(state, period, action) {\n      if (typeof root.setInterval === 'undefined') { throw new NotSupportedError(); }\n      period = normalizeTime(period);\n      var s = state, id = root.setInterval(function () { s = action(s); }, period);\n      return disposableCreate(function () { root.clearInterval(id); });\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n    /**\n     * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n     * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n     * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n     */\n    schedulerProto.catchError = schedulerProto['catch'] = function (handler) {\n      return new CatchScheduler(this, handler);\n    };\n  }(Scheduler.prototype));\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function createTick(self) {\n      return function tick(command, recurse) {\n        recurse(0, self._period);\n        var state = tryCatch(self._action)(self._state);\n        if (state === errorObj) {\n          self._cancel.dispose();\n          thrower(state.e);\n        }\n        self._state = state;\n      };\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveFuture(0, this._period, createTick(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  /** Gets a scheduler that schedules work immediately on the current thread. */\n   var ImmediateScheduler = (function (__super__) {\n    inherits(ImmediateScheduler, __super__);\n    function ImmediateScheduler() {\n      __super__.call(this);\n    }\n\n    ImmediateScheduler.prototype.schedule = function (state, action) {\n      return disposableFixup(action(this, state));\n    };\n\n    return ImmediateScheduler;\n  }(Scheduler));\n\n  var immediateScheduler = Scheduler.immediate = new ImmediateScheduler();\n\n  /**\n   * Gets a scheduler that schedules work as soon as possible on the current thread.\n   */\n  var CurrentThreadScheduler = (function (__super__) {\n    var queue;\n\n    function runTrampoline () {\n      while (queue.length > 0) {\n        var item = queue.dequeue();\n        !item.isCancelled() && item.invoke();\n      }\n    }\n\n    inherits(CurrentThreadScheduler, __super__);\n    function CurrentThreadScheduler() {\n      __super__.call(this);\n    }\n\n    CurrentThreadScheduler.prototype.schedule = function (state, action) {\n      var si = new ScheduledItem(this, state, action, this.now());\n\n      if (!queue) {\n        queue = new PriorityQueue(4);\n        queue.enqueue(si);\n\n        var result = tryCatch(runTrampoline)();\n        queue = null;\n        if (result === errorObj) { thrower(result.e); }\n      } else {\n        queue.enqueue(si);\n      }\n      return si.disposable;\n    };\n\n    CurrentThreadScheduler.prototype.scheduleRequired = function () { return !queue; };\n\n    return CurrentThreadScheduler;\n  }(Scheduler));\n\n  var currentThreadScheduler = Scheduler.currentThread = new CurrentThreadScheduler();\n\n  var scheduleMethod, clearMethod;\n\n  var localTimer = (function () {\n    var localSetTimeout, localClearTimeout = noop;\n    if (!!root.setTimeout) {\n      localSetTimeout = root.setTimeout;\n      localClearTimeout = root.clearTimeout;\n    } else if (!!root.WScript) {\n      localSetTimeout = function (fn, time) {\n        root.WScript.Sleep(time);\n        fn();\n      };\n    } else {\n      throw new NotSupportedError();\n    }\n\n    return {\n      setTimeout: localSetTimeout,\n      clearTimeout: localClearTimeout\n    };\n  }());\n  var localSetTimeout = localTimer.setTimeout,\n    localClearTimeout = localTimer.clearTimeout;\n\n  (function () {\n\n    var nextHandle = 1, tasksByHandle = {}, currentlyRunning = false;\n\n    clearMethod = function (handle) {\n      delete tasksByHandle[handle];\n    };\n\n    function runTask(handle) {\n      if (currentlyRunning) {\n        localSetTimeout(function () { runTask(handle); }, 0);\n      } else {\n        var task = tasksByHandle[handle];\n        if (task) {\n          currentlyRunning = true;\n          var result = tryCatch(task)();\n          clearMethod(handle);\n          currentlyRunning = false;\n          if (result === errorObj) { thrower(result.e); }\n        }\n      }\n    }\n\n    var reNative = new RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&\n      !reNative.test(setImmediate) && setImmediate;\n\n    function postMessageSupported () {\n      // Ensure not in a worker\n      if (!root.postMessage || root.importScripts) { return false; }\n      var isAsync = false, oldHandler = root.onmessage;\n      // Test for async\n      root.onmessage = function () { isAsync = true; };\n      root.postMessage('', '*');\n      root.onmessage = oldHandler;\n\n      return isAsync;\n    }\n\n    // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n    if (isFunction(setImmediate)) {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        setImmediate(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        process.nextTick(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (postMessageSupported()) {\n      var MSG_PREFIX = 'ms.rx.schedule' + Math.random();\n\n      var onGlobalPostMessage = function (event) {\n        // Only if we're a match to avoid any other global events\n        if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n          runTask(event.data.substring(MSG_PREFIX.length));\n        }\n      };\n\n      root.addEventListener('message', onGlobalPostMessage, false);\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        root.postMessage(MSG_PREFIX + id, '*');\n        return id;\n      };\n    } else if (!!root.MessageChannel) {\n      var channel = new root.MessageChannel();\n\n      channel.port1.onmessage = function (e) { runTask(e.data); };\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        channel.port2.postMessage(id);\n        return id;\n      };\n    } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {\n\n      scheduleMethod = function (action) {\n        var scriptElement = root.document.createElement('script');\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n\n        scriptElement.onreadystatechange = function () {\n          runTask(id);\n          scriptElement.onreadystatechange = null;\n          scriptElement.parentNode.removeChild(scriptElement);\n          scriptElement = null;\n        };\n        root.document.documentElement.appendChild(scriptElement);\n        return id;\n      };\n\n    } else {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        localSetTimeout(function () {\n          runTask(id);\n        }, 0);\n\n        return id;\n      };\n    }\n  }());\n\n  /**\n   * Gets a scheduler that schedules work via a timed callback based upon platform.\n   */\n   var DefaultScheduler = (function (__super__) {\n     inherits(DefaultScheduler, __super__);\n     function DefaultScheduler() {\n       __super__.call(this);\n     }\n\n     function scheduleAction(disposable, action, scheduler, state) {\n       return function schedule() {\n         disposable.setDisposable(Disposable._fixup(action(scheduler, state)));\n       };\n     }\n\n     function ClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     ClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         clearMethod(this._id);\n       }\n     };\n\n     function LocalClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     LocalClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         localClearTimeout(this._id);\n       }\n     };\n\n    DefaultScheduler.prototype.schedule = function (state, action) {\n      var disposable = new SingleAssignmentDisposable(),\n          id = scheduleMethod(scheduleAction(disposable, action, this, state));\n      return new BinaryDisposable(disposable, new ClearDisposable(id));\n    };\n\n    DefaultScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      if (dueTime === 0) { return this.schedule(state, action); }\n      var disposable = new SingleAssignmentDisposable(),\n          id = localSetTimeout(scheduleAction(disposable, action, this, state), dueTime);\n      return new BinaryDisposable(disposable, new LocalClearDisposable(id));\n    };\n\n    function scheduleLongRunning(state, action, disposable) {\n      return function () { action(state, disposable); };\n    }\n\n    DefaultScheduler.prototype.scheduleLongRunning = function (state, action) {\n      var disposable = disposableCreate(noop);\n      scheduleMethod(scheduleLongRunning(state, action, disposable));\n      return disposable;\n    };\n\n    return DefaultScheduler;\n  }(Scheduler));\n\n  var defaultScheduler = Scheduler['default'] = Scheduler.async = new DefaultScheduler();\n\n  var CatchScheduler = (function (__super__) {\n    inherits(CatchScheduler, __super__);\n\n    function CatchScheduler(scheduler, handler) {\n      this._scheduler = scheduler;\n      this._handler = handler;\n      this._recursiveOriginal = null;\n      this._recursiveWrapper = null;\n      __super__.call(this);\n    }\n\n    CatchScheduler.prototype.schedule = function (state, action) {\n      return this._scheduler.schedule(state, this._wrap(action));\n    };\n\n    CatchScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      return this._scheduler.schedule(state, dueTime, this._wrap(action));\n    };\n\n    CatchScheduler.prototype.now = function () { return this._scheduler.now(); };\n\n    CatchScheduler.prototype._clone = function (scheduler) {\n        return new CatchScheduler(scheduler, this._handler);\n    };\n\n    CatchScheduler.prototype._wrap = function (action) {\n      var parent = this;\n      return function (self, state) {\n        var res = tryCatch(action)(parent._getRecursiveWrapper(self), state);\n        if (res === errorObj) {\n          if (!parent._handler(res.e)) { thrower(res.e); }\n          return disposableEmpty;\n        }\n        return disposableFixup(res);\n      };\n    };\n\n    CatchScheduler.prototype._getRecursiveWrapper = function (scheduler) {\n      if (this._recursiveOriginal !== scheduler) {\n        this._recursiveOriginal = scheduler;\n        var wrapper = this._clone(scheduler);\n        wrapper._recursiveOriginal = scheduler;\n        wrapper._recursiveWrapper = wrapper;\n        this._recursiveWrapper = wrapper;\n      }\n      return this._recursiveWrapper;\n    };\n\n    CatchScheduler.prototype.schedulePeriodic = function (state, period, action) {\n      var self = this, failed = false, d = new SingleAssignmentDisposable();\n\n      d.setDisposable(this._scheduler.schedulePeriodic(state, period, function (state1) {\n        if (failed) { return null; }\n        var res = tryCatch(action)(state1);\n        if (res === errorObj) {\n          failed = true;\n          if (!self._handler(res.e)) { thrower(res.e); }\n          d.dispose();\n          return null;\n        }\n        return res;\n      }));\n\n      return d;\n    };\n\n    return CatchScheduler;\n  }(Scheduler));\n\n  function IndexedItem(id, value) {\n    this.id = id;\n    this.value = value;\n  }\n\n  IndexedItem.prototype.compareTo = function (other) {\n    var c = this.value.compareTo(other.value);\n    c === 0 && (c = this.id - other.id);\n    return c;\n  };\n\n  var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) {\n    this.items = new Array(capacity);\n    this.length = 0;\n  };\n\n  var priorityProto = PriorityQueue.prototype;\n  priorityProto.isHigherPriority = function (left, right) {\n    return this.items[left].compareTo(this.items[right]) < 0;\n  };\n\n  priorityProto.percolate = function (index) {\n    if (index >= this.length || index < 0) { return; }\n    var parent = index - 1 >> 1;\n    if (parent < 0 || parent === index) { return; }\n    if (this.isHigherPriority(index, parent)) {\n      var temp = this.items[index];\n      this.items[index] = this.items[parent];\n      this.items[parent] = temp;\n      this.percolate(parent);\n    }\n  };\n\n  priorityProto.heapify = function (index) {\n    +index || (index = 0);\n    if (index >= this.length || index < 0) { return; }\n    var left = 2 * index + 1,\n        right = 2 * index + 2,\n        first = index;\n    if (left < this.length && this.isHigherPriority(left, first)) {\n      first = left;\n    }\n    if (right < this.length && this.isHigherPriority(right, first)) {\n      first = right;\n    }\n    if (first !== index) {\n      var temp = this.items[index];\n      this.items[index] = this.items[first];\n      this.items[first] = temp;\n      this.heapify(first);\n    }\n  };\n\n  priorityProto.peek = function () { return this.items[0].value; };\n\n  priorityProto.removeAt = function (index) {\n    this.items[index] = this.items[--this.length];\n    this.items[this.length] = undefined;\n    this.heapify();\n  };\n\n  priorityProto.dequeue = function () {\n    var result = this.peek();\n    this.removeAt(0);\n    return result;\n  };\n\n  priorityProto.enqueue = function (item) {\n    var index = this.length++;\n    this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n    this.percolate(index);\n  };\n\n  priorityProto.remove = function (item) {\n    for (var i = 0; i < this.length; i++) {\n      if (this.items[i].value === item) {\n        this.removeAt(i);\n        return true;\n      }\n    }\n    return false;\n  };\n  PriorityQueue.count = 0;\n\n  /**\n   *  Represents a notification to an observer.\n   */\n  var Notification = Rx.Notification = (function () {\n    function Notification() {\n\n    }\n\n    Notification.prototype._accept = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    Notification.prototype._acceptObserver = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    /**\n     * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n     * @param {Function | Observer} observerOrOnNext Function to invoke for an OnNext notification or Observer to invoke the notification on..\n     * @param {Function} onError Function to invoke for an OnError notification.\n     * @param {Function} onCompleted Function to invoke for an OnCompleted notification.\n     * @returns {Any} Result produced by the observation.\n     */\n    Notification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n      return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n        this._acceptObserver(observerOrOnNext) :\n        this._accept(observerOrOnNext, onError, onCompleted);\n    };\n\n    /**\n     * Returns an observable sequence with a single notification.\n     *\n     * @memberOf Notifications\n     * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n     * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n     */\n    Notification.prototype.toObservable = function (scheduler) {\n      var self = this;\n      isScheduler(scheduler) || (scheduler = immediateScheduler);\n      return new AnonymousObservable(function (o) {\n        return scheduler.schedule(self, function (_, notification) {\n          notification._acceptObserver(o);\n          notification.kind === 'N' && o.onCompleted();\n        });\n      });\n    };\n\n    return Notification;\n  })();\n\n  var OnNextNotification = (function (__super__) {\n    inherits(OnNextNotification, __super__);\n    function OnNextNotification(value) {\n      this.value = value;\n      this.kind = 'N';\n    }\n\n    OnNextNotification.prototype._accept = function (onNext) {\n      return onNext(this.value);\n    };\n\n    OnNextNotification.prototype._acceptObserver = function (o) {\n      return o.onNext(this.value);\n    };\n\n    OnNextNotification.prototype.toString = function () {\n      return 'OnNext(' + this.value + ')';\n    };\n\n    return OnNextNotification;\n  }(Notification));\n\n  var OnErrorNotification = (function (__super__) {\n    inherits(OnErrorNotification, __super__);\n    function OnErrorNotification(error) {\n      this.error = error;\n      this.kind = 'E';\n    }\n\n    OnErrorNotification.prototype._accept = function (onNext, onError) {\n      return onError(this.error);\n    };\n\n    OnErrorNotification.prototype._acceptObserver = function (o) {\n      return o.onError(this.error);\n    };\n\n    OnErrorNotification.prototype.toString = function () {\n      return 'OnError(' + this.error + ')';\n    };\n\n    return OnErrorNotification;\n  }(Notification));\n\n  var OnCompletedNotification = (function (__super__) {\n    inherits(OnCompletedNotification, __super__);\n    function OnCompletedNotification() {\n      this.kind = 'C';\n    }\n\n    OnCompletedNotification.prototype._accept = function (onNext, onError, onCompleted) {\n      return onCompleted();\n    };\n\n    OnCompletedNotification.prototype._acceptObserver = function (o) {\n      return o.onCompleted();\n    };\n\n    OnCompletedNotification.prototype.toString = function () {\n      return 'OnCompleted()';\n    };\n\n    return OnCompletedNotification;\n  }(Notification));\n\n  /**\n   * Creates an object that represents an OnNext notification to an observer.\n   * @param {Any} value The value contained in the notification.\n   * @returns {Notification} The OnNext notification containing the value.\n   */\n  var notificationCreateOnNext = Notification.createOnNext = function (value) {\n    return new OnNextNotification(value);\n  };\n\n  /**\n   * Creates an object that represents an OnError notification to an observer.\n   * @param {Any} error The exception contained in the notification.\n   * @returns {Notification} The OnError notification containing the exception.\n   */\n  var notificationCreateOnError = Notification.createOnError = function (error) {\n    return new OnErrorNotification(error);\n  };\n\n  /**\n   * Creates an object that represents an OnCompleted notification to an observer.\n   * @returns {Notification} The OnCompleted notification.\n   */\n  var notificationCreateOnCompleted = Notification.createOnCompleted = function () {\n    return new OnCompletedNotification();\n  };\n\n  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates a notification callback from an observer.\n   * @returns The action that forwards its input notification to the underlying observer.\n   */\n  Observer.prototype.toNotifier = function () {\n    var observer = this;\n    return function (n) { return n.accept(observer); };\n  };\n\n  /**\n   *  Hides the identity of an observer.\n   * @returns An observer that hides the identity of the specified observer.\n   */\n  Observer.prototype.asObserver = function () {\n    var self = this;\n    return new AnonymousObserver(\n      function (x) { self.onNext(x); },\n      function (err) { self.onError(err); },\n      function () { self.onCompleted(); });\n  };\n\n  /**\n   *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n   *  If a violation is detected, an Error is thrown from the offending observer method call.\n   * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n   */\n  Observer.prototype.checked = function () { return new CheckedObserver(this); };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n\n  /**\n   *  Creates an observer from a notification callback.\n   * @param {Function} handler Action that handles a notification.\n   * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n   */\n  Observer.fromNotifier = function (handler, thisArg) {\n    var cb = bindCallback(handler, thisArg, 1);\n    return new AnonymousObserver(function (x) {\n      return cb(notificationCreateOnNext(x));\n    }, function (e) {\n      return cb(notificationCreateOnError(e));\n    }, function () {\n      return cb(notificationCreateOnCompleted());\n    });\n  };\n\n  /**\n   * Schedules the invocation of observer methods on the given scheduler.\n   * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n   * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n   */\n  Observer.prototype.notifyOn = function (scheduler) {\n    return new ObserveOnObserver(scheduler, this);\n  };\n\n  Observer.prototype.makeSafe = function(disposable) {\n    return new AnonymousSafeObserver(this._onNext, this._onError, this._onCompleted, disposable);\n  };\n\n  /**\n   * Abstract base class for implementations of the Observer class.\n   * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n   */\n  var AbstractObserver = Rx.internals.AbstractObserver = (function (__super__) {\n    inherits(AbstractObserver, __super__);\n\n    /**\n     * Creates a new observer in a non-stopped state.\n     */\n    function AbstractObserver() {\n      this.isStopped = false;\n    }\n\n    // Must be implemented by other observers\n    AbstractObserver.prototype.next = notImplemented;\n    AbstractObserver.prototype.error = notImplemented;\n    AbstractObserver.prototype.completed = notImplemented;\n\n    /**\n     * Notifies the observer of a new element in the sequence.\n     * @param {Any} value Next element in the sequence.\n     */\n    AbstractObserver.prototype.onNext = function (value) {\n      !this.isStopped && this.next(value);\n    };\n\n    /**\n     * Notifies the observer that an exception has occurred.\n     * @param {Any} error The error that has occurred.\n     */\n    AbstractObserver.prototype.onError = function (error) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(error);\n      }\n    };\n\n    /**\n     * Notifies the observer of the end of the sequence.\n     */\n    AbstractObserver.prototype.onCompleted = function () {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.completed();\n      }\n    };\n\n    /**\n     * Disposes the observer, causing it to transition to the stopped state.\n     */\n    AbstractObserver.prototype.dispose = function () { this.isStopped = true; };\n\n    AbstractObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return AbstractObserver;\n  }(Observer));\n\n  /**\n   * Class to create an Observer instance from delegate-based implementations of the on* methods.\n   */\n  var AnonymousObserver = Rx.AnonymousObserver = (function (__super__) {\n    inherits(AnonymousObserver, __super__);\n\n    /**\n     * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n     * @param {Any} onNext Observer's OnNext action implementation.\n     * @param {Any} onError Observer's OnError action implementation.\n     * @param {Any} onCompleted Observer's OnCompleted action implementation.\n     */\n    function AnonymousObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    /**\n     * Calls the onNext action.\n     * @param {Any} value Next element in the sequence.\n     */\n    AnonymousObserver.prototype.next = function (value) {\n      this._onNext(value);\n    };\n\n    /**\n     * Calls the onError action.\n     * @param {Any} error The error that has occurred.\n     */\n    AnonymousObserver.prototype.error = function (error) {\n      this._onError(error);\n    };\n\n    /**\n     *  Calls the onCompleted action.\n     */\n    AnonymousObserver.prototype.completed = function () {\n      this._onCompleted();\n    };\n\n    return AnonymousObserver;\n  }(AbstractObserver));\n\n  var CheckedObserver = (function (__super__) {\n    inherits(CheckedObserver, __super__);\n\n    function CheckedObserver(observer) {\n      __super__.call(this);\n      this._observer = observer;\n      this._state = 0; // 0 - idle, 1 - busy, 2 - done\n    }\n\n    var CheckedObserverPrototype = CheckedObserver.prototype;\n\n    CheckedObserverPrototype.onNext = function (value) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onNext).call(this._observer, value);\n      this._state = 0;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onError = function (err) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onError).call(this._observer, err);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onCompleted = function () {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onCompleted).call(this._observer);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.checkAccess = function () {\n      if (this._state === 1) { throw new Error('Re-entrancy detected'); }\n      if (this._state === 2) { throw new Error('Observer completed'); }\n      if (this._state === 0) { this._state = 1; }\n    };\n\n    return CheckedObserver;\n  }(Observer));\n\n  var ScheduledObserver = Rx.internals.ScheduledObserver = (function (__super__) {\n    inherits(ScheduledObserver, __super__);\n\n    function ScheduledObserver(scheduler, observer) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.observer = observer;\n      this.isAcquired = false;\n      this.hasFaulted = false;\n      this.queue = [];\n      this.disposable = new SerialDisposable();\n    }\n\n    function enqueueNext(observer, x) { return function () { observer.onNext(x); }; }\n    function enqueueError(observer, e) { return function () { observer.onError(e); }; }\n    function enqueueCompleted(observer) { return function () { observer.onCompleted(); }; }\n\n    ScheduledObserver.prototype.next = function (x) {\n      this.queue.push(enqueueNext(this.observer, x));\n    };\n\n    ScheduledObserver.prototype.error = function (e) {\n      this.queue.push(enqueueError(this.observer, e));\n    };\n\n    ScheduledObserver.prototype.completed = function () {\n      this.queue.push(enqueueCompleted(this.observer));\n    };\n\n\n    function scheduleMethod(state, recurse) {\n      var work;\n      if (state.queue.length > 0) {\n        work = state.queue.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var res = tryCatch(work)();\n      if (res === errorObj) {\n        state.queue = [];\n        state.hasFaulted = true;\n        return thrower(res.e);\n      }\n      recurse(state);\n    }\n\n    ScheduledObserver.prototype.ensureActive = function () {\n      var isOwner = false;\n      if (!this.hasFaulted && this.queue.length > 0) {\n        isOwner = !this.isAcquired;\n        this.isAcquired = true;\n      }\n      isOwner &&\n        this.disposable.setDisposable(this.scheduler.scheduleRecursive(this, scheduleMethod));\n    };\n\n    ScheduledObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.disposable.dispose();\n    };\n\n    return ScheduledObserver;\n  }(AbstractObserver));\n\n  var ObserveOnObserver = (function (__super__) {\n    inherits(ObserveOnObserver, __super__);\n\n    function ObserveOnObserver(scheduler, observer, cancel) {\n      __super__.call(this, scheduler, observer);\n      this._cancel = cancel;\n    }\n\n    ObserveOnObserver.prototype.next = function (value) {\n      __super__.prototype.next.call(this, value);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.error = function (e) {\n      __super__.prototype.error.call(this, e);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.completed = function () {\n      __super__.prototype.completed.call(this);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this._cancel && this._cancel.dispose();\n      this._cancel = null;\n    };\n\n    return ObserveOnObserver;\n  })(ScheduledObserver);\n\n  var observableProto;\n\n  /**\n   * Represents a push-style collection.\n   */\n  var Observable = Rx.Observable = (function () {\n\n    function makeSubscribe(self, subscribe) {\n      return function (o) {\n        var oldOnError = o.onError;\n        o.onError = function (e) {\n          makeStackTraceLong(e, self);\n          oldOnError.call(o, e);\n        };\n\n        return subscribe.call(self, o);\n      };\n    }\n\n    function Observable() {\n      if (Rx.config.longStackSupport && hasStacks) {\n        var oldSubscribe = this._subscribe;\n        var e = tryCatch(thrower)(new Error()).e;\n        this.stack = e.stack.substring(e.stack.indexOf('\\n') + 1);\n        this._subscribe = makeSubscribe(this, oldSubscribe);\n      }\n    }\n\n    observableProto = Observable.prototype;\n\n    /**\n    * Determines whether the given object is an Observable\n    * @param {Any} An object to determine whether it is an Observable\n    * @returns {Boolean} true if an Observable, else false.\n    */\n    Observable.isObservable = function (o) {\n      return o && isFunction(o.subscribe);\n    };\n\n    /**\n     *  Subscribes an o to the observable sequence.\n     *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n     *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n     *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n     *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribe = observableProto.forEach = function (oOrOnNext, onError, onCompleted) {\n      return this._subscribe(typeof oOrOnNext === 'object' ?\n        oOrOnNext :\n        observerCreate(oOrOnNext, onError, onCompleted));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onNext The function to invoke on each element in the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnNext = function (onNext, thisArg) {\n      return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n    };\n\n    /**\n     * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n     * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnError = function (onError, thisArg) {\n      return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnCompleted = function (onCompleted, thisArg) {\n      return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n    };\n\n    return Observable;\n  })();\n\n  var ObservableBase = Rx.ObservableBase = (function (__super__) {\n    inherits(ObservableBase, __super__);\n\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.subscribeCore).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function ObservableBase() {\n      __super__.call(this);\n    }\n\n    ObservableBase.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    ObservableBase.prototype.subscribeCore = notImplemented;\n\n    return ObservableBase;\n  }(Observable));\n\nvar FlatMapObservable = Rx.FlatMapObservable = (function(__super__) {\n\n    inherits(FlatMapObservable, __super__);\n\n    function FlatMapObservable(source, selector, resultSelector, thisArg) {\n      this.resultSelector = isFunction(resultSelector) ? resultSelector : null;\n      this.selector = bindCallback(isFunction(selector) ? selector : function() { return selector; }, thisArg, 3);\n      this.source = source;\n      __super__.call(this);\n    }\n\n    FlatMapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this.resultSelector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(observer, selector, resultSelector, source) {\n      this.i = 0;\n      this.selector = selector;\n      this.resultSelector = resultSelector;\n      this.source = source;\n      this.o = observer;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype._wrapResult = function(result, x, i) {\n      return this.resultSelector ?\n        result.map(function(y, i2) { return this.resultSelector(x, y, i, i2); }, this) :\n        result;\n    };\n\n    InnerObserver.prototype.next = function(x) {\n      var i = this.i++;\n      var result = tryCatch(this.selector)(x, i, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = Observable.from(result));\n      this.o.onNext(this._wrapResult(result, x, i));\n    };\n\n    InnerObserver.prototype.error = function(e) { this.o.onError(e); };\n\n    InnerObserver.prototype.completed = function() { this.o.onCompleted(); };\n\n    return FlatMapObservable;\n\n}(ObservableBase));\n\n  var Enumerable = Rx.internals.Enumerable = function () { };\n\n  function IsDisposedDisposable(state) {\n    this._s = state;\n    this.isDisposed = false;\n  }\n\n  IsDisposedDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      this._s.isDisposed = true;\n    }\n  };\n\n  var ConcatEnumerableObservable = (function(__super__) {\n    inherits(ConcatEnumerableObservable, __super__);\n    function ConcatEnumerableObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    ConcatEnumerableObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        o: o,\n        subscription: subscription,\n        e: this.sources[$iterator$]()\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.o.onError(e); };\n    InnerObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return ConcatEnumerableObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.concat = function () {\n    return new ConcatEnumerableObservable(this);\n  };\n\n  var CatchErrorObservable = (function(__super__) {\n    function CatchErrorObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    inherits(CatchErrorObservable, __super__);\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.lastError !== null ? state.o.onError(state.lastError) : state.o.onCompleted(); }\n\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    CatchErrorObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        e: this.sources[$iterator$](),\n        subscription: subscription,\n        lastError: null,\n        o: o\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.lastError = e; this._recurse(this._state); };\n    InnerObserver.prototype.completed = function () { this._state.o.onCompleted(); };\n\n    return CatchErrorObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.catchError = function () {\n    return new CatchErrorObservable(this);\n  };\n\n  var RepeatEnumerable = (function (__super__) {\n    inherits(RepeatEnumerable, __super__);\n    function RepeatEnumerable(v, c) {\n      this.v = v;\n      this.c = c == null ? -1 : c;\n    }\n\n    RepeatEnumerable.prototype[$iterator$] = function () {\n      return new RepeatEnumerator(this);\n    };\n\n    function RepeatEnumerator(p) {\n      this.v = p.v;\n      this.l = p.c;\n    }\n\n    RepeatEnumerator.prototype.next = function () {\n      if (this.l === 0) { return doneEnumerator; }\n      if (this.l > 0) { this.l--; }\n      return { done: false, value: this.v };\n    };\n\n    return RepeatEnumerable;\n  }(Enumerable));\n\n  var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) {\n    return new RepeatEnumerable(value, repeatCount);\n  };\n\n  var OfEnumerable = (function(__super__) {\n    inherits(OfEnumerable, __super__);\n    function OfEnumerable(s, fn, thisArg) {\n      this.s = s;\n      this.fn = fn ? bindCallback(fn, thisArg, 3) : null;\n    }\n    OfEnumerable.prototype[$iterator$] = function () {\n      return new OfEnumerator(this);\n    };\n\n    function OfEnumerator(p) {\n      this.i = -1;\n      this.s = p.s;\n      this.l = this.s.length;\n      this.fn = p.fn;\n    }\n\n    OfEnumerator.prototype.next = function () {\n     return ++this.i < this.l ?\n       { done: false, value: !this.fn ? this.s[this.i] : this.fn(this.s[this.i], this.i, this.s) } :\n       doneEnumerator;\n    };\n\n    return OfEnumerable;\n  }(Enumerable));\n\n  var enumerableOf = Enumerable.of = function (source, selector, thisArg) {\n    return new OfEnumerable(source, selector, thisArg);\n  };\n\nvar ObserveOnObservable = (function (__super__) {\n  inherits(ObserveOnObservable, __super__);\n  function ObserveOnObservable(source, s) {\n    this.source = source;\n    this._s = s;\n    __super__.call(this);\n  }\n\n  ObserveOnObservable.prototype.subscribeCore = function (o) {\n    return this.source.subscribe(new ObserveOnObserver(this._s, o));\n  };\n\n  return ObserveOnObservable;\n}(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n   *\n   *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n   *  that require to be run on a scheduler, use subscribeOn.\n   *\n   *  @param {Scheduler} scheduler Scheduler to notify observers on.\n   *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n   */\n  observableProto.observeOn = function (scheduler) {\n    return new ObserveOnObservable(this, scheduler);\n  };\n\n  var SubscribeOnObservable = (function (__super__) {\n    inherits(SubscribeOnObservable, __super__);\n    function SubscribeOnObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(scheduler, state) {\n      var source = state[0], d = state[1], o = state[2];\n      d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(o)));\n    }\n\n    SubscribeOnObservable.prototype.subscribeCore = function (o) {\n      var m = new SingleAssignmentDisposable(), d = new SerialDisposable();\n      d.setDisposable(m);\n      m.setDisposable(this._s.schedule([this.source, d, o], scheduleMethod));\n      return d;\n    };\n\n    return SubscribeOnObservable;\n  }(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n   *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n   *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n   *  callbacks on a scheduler, use observeOn.\n\n   *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n   *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n   */\n  observableProto.subscribeOn = function (scheduler) {\n    return new SubscribeOnObservable(this, scheduler);\n  };\n\n  var FromPromiseObservable = (function(__super__) {\n    inherits(FromPromiseObservable, __super__);\n    function FromPromiseObservable(p, s) {\n      this._p = p;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleNext(s, state) {\n      var o = state[0], data = state[1];\n      o.onNext(data);\n      o.onCompleted();\n    }\n\n    function scheduleError(s, state) {\n      var o = state[0], err = state[1];\n      o.onError(err);\n    }\n\n    FromPromiseObservable.prototype.subscribeCore = function(o) {\n      var sad = new SingleAssignmentDisposable(), self = this, p = this._p;\n\n      if (isFunction(p)) {\n        p = tryCatch(p)();\n        if (p === errorObj) {\n          o.onError(p.e);\n          return sad;\n        }\n      }\n\n      p\n        .then(function (data) {\n          sad.setDisposable(self._s.schedule([o, data], scheduleNext));\n        }, function (err) {\n          sad.setDisposable(self._s.schedule([o, err], scheduleError));\n        });\n\n      return sad;\n    };\n\n    return FromPromiseObservable;\n  }(ObservableBase));\n\n  /**\n  * Converts a Promise to an Observable sequence\n  * @param {Promise} An ES6 Compliant promise.\n  * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n  */\n  var observableFromPromise = Observable.fromPromise = function (promise, scheduler) {\n    scheduler || (scheduler = defaultScheduler);\n    return new FromPromiseObservable(promise, scheduler);\n  };\n\n  /*\n   * Converts an existing observable sequence to an ES6 Compatible Promise\n   * @example\n   * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n   *\n   * // With config\n   * Rx.config.Promise = RSVP.Promise;\n   * var promise = Rx.Observable.return(42).toPromise();\n   * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n   * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n   */\n  observableProto.toPromise = function (promiseCtor) {\n    promiseCtor || (promiseCtor = Rx.config.Promise);\n    if (!promiseCtor) { throw new NotSupportedError('Promise type not provided nor in Rx.config.Promise'); }\n    var source = this;\n    return new promiseCtor(function (resolve, reject) {\n      // No cancellation can be done\n      var value;\n      source.subscribe(function (v) {\n        value = v;\n      }, reject, function () {\n        resolve(value);\n      });\n    });\n  };\n\n  var ToArrayObservable = (function(__super__) {\n    inherits(ToArrayObservable, __super__);\n    function ToArrayObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    ToArrayObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o) {\n      this.o = o;\n      this.a = [];\n      AbstractObserver.call(this);\n    }\n    \n    InnerObserver.prototype.next = function (x) { this.a.push(x); };\n    InnerObserver.prototype.error = function (e) { this.o.onError(e);  };\n    InnerObserver.prototype.completed = function () { this.o.onNext(this.a); this.o.onCompleted(); };\n\n    return ToArrayObservable;\n  }(ObservableBase));\n\n  /**\n  * Creates an array from an observable sequence.\n  * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n  */\n  observableProto.toArray = function () {\n    return new ToArrayObservable(this);\n  };\n\n  /**\n   *  Creates an observable sequence from a specified subscribe method implementation.\n   * @example\n   *  var res = Rx.Observable.create(function (observer) { return function () { } );\n   *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n   *  var res = Rx.Observable.create(function (observer) { } );\n   * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n   * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n   */\n  Observable.create = function (subscribe, parent) {\n    return new AnonymousObservable(subscribe, parent);\n  };\n\n  var Defer = (function(__super__) {\n    inherits(Defer, __super__);\n    function Defer(factory) {\n      this._f = factory;\n      __super__.call(this);\n    }\n\n    Defer.prototype.subscribeCore = function (o) {\n      var result = tryCatch(this._f)();\n      if (result === errorObj) { return observableThrow(result.e).subscribe(o);}\n      isPromise(result) && (result = observableFromPromise(result));\n      return result.subscribe(o);\n    };\n\n    return Defer;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n   *\n   * @example\n   *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n   * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n   * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n   */\n  var observableDefer = Observable.defer = function (observableFactory) {\n    return new Defer(observableFactory);\n  };\n\n  var EmptyObservable = (function(__super__) {\n    inherits(EmptyObservable, __super__);\n    function EmptyObservable(scheduler) {\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    EmptyObservable.prototype.subscribeCore = function (observer) {\n      var sink = new EmptySink(observer, this.scheduler);\n      return sink.run();\n    };\n\n    function EmptySink(observer, scheduler) {\n      this.observer = observer;\n      this.scheduler = scheduler;\n    }\n\n    function scheduleItem(s, state) {\n      state.onCompleted();\n      return disposableEmpty;\n    }\n\n    EmptySink.prototype.run = function () {\n      var state = this.observer;\n      return this.scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this.scheduler.schedule(state, scheduleItem);\n    };\n\n    return EmptyObservable;\n  }(ObservableBase));\n\n  var EMPTY_OBSERVABLE = new EmptyObservable(immediateScheduler);\n\n  /**\n   *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n   *\n   * @example\n   *  var res = Rx.Observable.empty();\n   *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n   * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n   * @returns {Observable} An observable sequence with no elements.\n   */\n  var observableEmpty = Observable.empty = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return scheduler === immediateScheduler ? EMPTY_OBSERVABLE : new EmptyObservable(scheduler);\n  };\n\n  var FromObservable = (function(__super__) {\n    inherits(FromObservable, __super__);\n    function FromObservable(iterable, fn, scheduler) {\n      this._iterable = iterable;\n      this._fn = fn;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function createScheduleMethod(o, it, fn) {\n      return function loopRecursive(i, recurse) {\n        var next = tryCatch(it.next).call(it);\n        if (next === errorObj) { return o.onError(next.e); }\n        if (next.done) { return o.onCompleted(); }\n\n        var result = next.value;\n\n        if (isFunction(fn)) {\n          result = tryCatch(fn)(result, i);\n          if (result === errorObj) { return o.onError(result.e); }\n        }\n\n        o.onNext(result);\n        recurse(i + 1);\n      };\n    }\n\n    FromObservable.prototype.subscribeCore = function (o) {\n      var list = Object(this._iterable),\n          it = getIterable(list);\n\n      return this._scheduler.scheduleRecursive(0, createScheduleMethod(o, it, this._fn));\n    };\n\n    return FromObservable;\n  }(ObservableBase));\n\n  var maxSafeInteger = Math.pow(2, 53) - 1;\n\n  function StringIterable(s) {\n    this._s = s;\n  }\n\n  StringIterable.prototype[$iterator$] = function () {\n    return new StringIterator(this._s);\n  };\n\n  function StringIterator(s) {\n    this._s = s;\n    this._l = s.length;\n    this._i = 0;\n  }\n\n  StringIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  StringIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._s.charAt(this._i++) } : doneEnumerator;\n  };\n\n  function ArrayIterable(a) {\n    this._a = a;\n  }\n\n  ArrayIterable.prototype[$iterator$] = function () {\n    return new ArrayIterator(this._a);\n  };\n\n  function ArrayIterator(a) {\n    this._a = a;\n    this._l = toLength(a);\n    this._i = 0;\n  }\n\n  ArrayIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  ArrayIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._a[this._i++] } : doneEnumerator;\n  };\n\n  function numberIsFinite(value) {\n    return typeof value === 'number' && root.isFinite(value);\n  }\n\n  function isNan(n) {\n    return n !== n;\n  }\n\n  function getIterable(o) {\n    var i = o[$iterator$], it;\n    if (!i && typeof o === 'string') {\n      it = new StringIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i && o.length !== undefined) {\n      it = new ArrayIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i) { throw new TypeError('Object is not iterable'); }\n    return o[$iterator$]();\n  }\n\n  function sign(value) {\n    var number = +value;\n    if (number === 0) { return number; }\n    if (isNaN(number)) { return number; }\n    return number < 0 ? -1 : 1;\n  }\n\n  function toLength(o) {\n    var len = +o.length;\n    if (isNaN(len)) { return 0; }\n    if (len === 0 || !numberIsFinite(len)) { return len; }\n    len = sign(len) * Math.floor(Math.abs(len));\n    if (len <= 0) { return 0; }\n    if (len > maxSafeInteger) { return maxSafeInteger; }\n    return len;\n  }\n\n  /**\n  * This method creates a new Observable sequence from an array-like or iterable object.\n  * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n  * @param {Function} [mapFn] Map function to call on every element of the array.\n  * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n  * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n  */\n  var observableFrom = Observable.from = function (iterable, mapFn, thisArg, scheduler) {\n    if (iterable == null) {\n      throw new Error('iterable cannot be null.')\n    }\n    if (mapFn && !isFunction(mapFn)) {\n      throw new Error('mapFn when provided must be a function');\n    }\n    if (mapFn) {\n      var mapper = bindCallback(mapFn, thisArg, 2);\n    }\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromObservable(iterable, mapper, scheduler);\n  }\n\n  var FromArrayObservable = (function(__super__) {\n    inherits(FromArrayObservable, __super__);\n    function FromArrayObservable(args, scheduler) {\n      this._args = args;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, args) {\n      var len = args.length;\n      return function loopRecursive (i, recurse) {\n        if (i < len) {\n          o.onNext(args[i]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    FromArrayObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._args));\n    };\n\n    return FromArrayObservable;\n  }(ObservableBase));\n\n  /**\n  *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n  * @deprecated use Observable.from or Observable.of\n  * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n  */\n  var observableFromArray = Observable.fromArray = function (array, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler)\n  };\n\n  var GenerateObservable = (function (__super__) {\n    inherits(GenerateObservable, __super__);\n    function GenerateObservable(state, cndFn, itrFn, resFn, s) {\n      this._initialState = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n      var hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (hasResult === errorObj) { return state.o.onError(hasResult.e); }\n      if (hasResult) {\n        var result = tryCatch(state.self._resFn)(state.newState);\n        if (result === errorObj) { return state.o.onError(result.e); }\n        state.o.onNext(result);\n        recurse(state);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        first: true,\n        newState: this._initialState\n      };\n      return this._s.scheduleRecursive(state, scheduleRecursive);\n    };\n\n    return GenerateObservable;\n  }(ObservableBase));\n\n  /**\n   *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new GenerateObservable(initialState, condition, iterate, resultSelector, scheduler);\n  };\n\n  var NeverObservable = (function(__super__) {\n    inherits(NeverObservable, __super__);\n    function NeverObservable() {\n      __super__.call(this);\n    }\n\n    NeverObservable.prototype.subscribeCore = function (observer) {\n      return disposableEmpty;\n    };\n\n    return NeverObservable;\n  }(ObservableBase));\n\n  var NEVER_OBSERVABLE = new NeverObservable();\n\n  /**\n   * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n   * @returns {Observable} An observable sequence whose observers will never get called.\n   */\n  var observableNever = Observable.never = function () {\n    return NEVER_OBSERVABLE;\n  };\n\n  function observableOf (scheduler, array) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler);\n  }\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.of = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return new FromArrayObservable(args, currentThreadScheduler);\n  };\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.ofWithScheduler = function (scheduler) {\n    var len = arguments.length, args = new Array(len - 1);\n    for(var i = 1; i < len; i++) { args[i - 1] = arguments[i]; }\n    return new FromArrayObservable(args, scheduler);\n  };\n\n  var PairsObservable = (function(__super__) {\n    inherits(PairsObservable, __super__);\n    function PairsObservable(o, scheduler) {\n      this._o = o;\n      this._keys = Object.keys(o);\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, obj, keys) {\n      return function loopRecursive(i, recurse) {\n        if (i < keys.length) {\n          var key = keys[i];\n          o.onNext([key, obj[key]]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    PairsObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._o, this._keys));\n    };\n\n    return PairsObservable;\n  }(ObservableBase));\n\n  /**\n   * Convert an object into an observable sequence of [key, value] pairs.\n   * @param {Object} obj The object to inspect.\n   * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n   * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n   */\n  Observable.pairs = function (obj, scheduler) {\n    scheduler || (scheduler = currentThreadScheduler);\n    return new PairsObservable(obj, scheduler);\n  };\n\n    var RangeObservable = (function(__super__) {\n    inherits(RangeObservable, __super__);\n    function RangeObservable(start, count, scheduler) {\n      this.start = start;\n      this.rangeCount = count;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function loopRecursive(start, count, o) {\n      return function loop (i, recurse) {\n        if (i < count) {\n          o.onNext(start + i);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    RangeObservable.prototype.subscribeCore = function (o) {\n      return this.scheduler.scheduleRecursive(\n        0,\n        loopRecursive(this.start, this.rangeCount, o)\n      );\n    };\n\n    return RangeObservable;\n  }(ObservableBase));\n\n  /**\n  *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n  * @param {Number} start The value of the first integer in the sequence.\n  * @param {Number} count The number of sequential integers to generate.\n  * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n  * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n  */\n  Observable.range = function (start, count, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RangeObservable(start, count, scheduler);\n  };\n\n  var RepeatObservable = (function(__super__) {\n    inherits(RepeatObservable, __super__);\n    function RepeatObservable(value, repeatCount, scheduler) {\n      this.value = value;\n      this.repeatCount = repeatCount == null ? -1 : repeatCount;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    RepeatObservable.prototype.subscribeCore = function (observer) {\n      var sink = new RepeatSink(observer, this);\n      return sink.run();\n    };\n\n    return RepeatObservable;\n  }(ObservableBase));\n\n  function RepeatSink(observer, parent) {\n    this.observer = observer;\n    this.parent = parent;\n  }\n\n  RepeatSink.prototype.run = function () {\n    var observer = this.observer, value = this.parent.value;\n    function loopRecursive(i, recurse) {\n      if (i === -1 || i > 0) {\n        observer.onNext(value);\n        i > 0 && i--;\n      }\n      if (i === 0) { return observer.onCompleted(); }\n      recurse(i);\n    }\n\n    return this.parent.scheduler.scheduleRecursive(this.parent.repeatCount, loopRecursive);\n  };\n\n  /**\n   *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n   * @param {Mixed} value Element to repeat.\n   * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n   * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n   */\n  Observable.repeat = function (value, repeatCount, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RepeatObservable(value, repeatCount, scheduler);\n  };\n\n  var JustObservable = (function(__super__) {\n    inherits(JustObservable, __super__);\n    function JustObservable(value, scheduler) {\n      this._value = value;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    JustObservable.prototype.subscribeCore = function (o) {\n      var state = [this._value, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var value = state[0], observer = state[1];\n      observer.onNext(value);\n      observer.onCompleted();\n      return disposableEmpty;\n    }\n\n    return JustObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n   *  There is an alias called 'just' or browsers <IE9.\n   * @param {Mixed} value Single element in the resulting observable sequence.\n   * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence containing the single specified element.\n   */\n  var observableReturn = Observable['return'] = Observable.just = function (value, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new JustObservable(value, scheduler);\n  };\n\n  var ThrowObservable = (function(__super__) {\n    inherits(ThrowObservable, __super__);\n    function ThrowObservable(error, scheduler) {\n      this._error = error;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    ThrowObservable.prototype.subscribeCore = function (o) {\n      var state = [this._error, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var e = state[0], o = state[1];\n      o.onError(e);\n      return disposableEmpty;\n    }\n\n    return ThrowObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n   *  There is an alias to this method called 'throwError' for browsers <IE9.\n   * @param {Mixed} error An object used for the sequence's termination.\n   * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n   */\n  var observableThrow = Observable['throw'] = function (error, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new ThrowObservable(error, scheduler);\n  };\n\n  var UsingObservable = (function (__super__) {\n    inherits(UsingObservable, __super__);\n    function UsingObservable(resFn, obsFn) {\n      this._resFn = resFn;\n      this._obsFn = obsFn;\n      __super__.call(this);\n    }\n\n    UsingObservable.prototype.subscribeCore = function (o) {\n      var disposable = disposableEmpty;\n      var resource = tryCatch(this._resFn)();\n      if (resource === errorObj) {\n        return new BinaryDisposable(observableThrow(resource.e).subscribe(o), disposable);\n      }\n      resource && (disposable = resource);\n      var source = tryCatch(this._obsFn)(resource);\n      if (source === errorObj) {\n        return new BinaryDisposable(observableThrow(source.e).subscribe(o), disposable);\n      }\n      return new BinaryDisposable(source.subscribe(o), disposable);\n    };\n\n    return UsingObservable;\n  }(ObservableBase));\n\n  /**\n   * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n   * @param {Function} resourceFactory Factory function to obtain a resource object.\n   * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n   * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n   */\n  Observable.using = function (resourceFactory, observableFactory) {\n    return new UsingObservable(resourceFactory, observableFactory);\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @param {Observable} rightSource Second observable sequence or Promise.\n   * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n   */\n  observableProto.amb = function (rightSource) {\n    var leftSource = this;\n    return new AnonymousObservable(function (observer) {\n      var choice,\n        leftChoice = 'L', rightChoice = 'R',\n        leftSubscription = new SingleAssignmentDisposable(),\n        rightSubscription = new SingleAssignmentDisposable();\n\n      isPromise(rightSource) && (rightSource = observableFromPromise(rightSource));\n\n      function choiceL() {\n        if (!choice) {\n          choice = leftChoice;\n          rightSubscription.dispose();\n        }\n      }\n\n      function choiceR() {\n        if (!choice) {\n          choice = rightChoice;\n          leftSubscription.dispose();\n        }\n      }\n\n      var leftSubscribe = observerCreate(\n        function (left) {\n          choiceL();\n          choice === leftChoice && observer.onNext(left);\n        },\n        function (e) {\n          choiceL();\n          choice === leftChoice && observer.onError(e);\n        },\n        function () {\n          choiceL();\n          choice === leftChoice && observer.onCompleted();\n        }\n      );\n      var rightSubscribe = observerCreate(\n        function (right) {\n          choiceR();\n          choice === rightChoice && observer.onNext(right);\n        },\n        function (e) {\n          choiceR();\n          choice === rightChoice && observer.onError(e);\n        },\n        function () {\n          choiceR();\n          choice === rightChoice && observer.onCompleted();\n        }\n      );\n\n      leftSubscription.setDisposable(leftSource.subscribe(leftSubscribe));\n      rightSubscription.setDisposable(rightSource.subscribe(rightSubscribe));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    });\n  };\n\n  function amb(p, c) { return p.amb(c); }\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n   */\n  Observable.amb = function () {\n    var acc = observableNever(), items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(items);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    for (var i = 0, len = items.length; i < len; i++) {\n      acc = amb(acc, items[i]);\n    }\n    return acc;\n  };\n\n  var CatchObservable = (function (__super__) {\n    inherits(CatchObservable, __super__);\n    function CatchObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObservable.prototype.subscribeCore = function (o) {\n      var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();\n      subscription.setDisposable(d1);\n      d1.setDisposable(this.source.subscribe(new CatchObserver(o, subscription, this._fn)));\n      return subscription;\n    };\n\n    return CatchObservable;\n  }(ObservableBase));\n\n  var CatchObserver = (function(__super__) {\n    inherits(CatchObserver, __super__);\n    function CatchObserver(o, s, fn) {\n      this._o = o;\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObserver.prototype.next = function (x) { this._o.onNext(x); };\n    CatchObserver.prototype.completed = function () { return this._o.onCompleted(); };\n    CatchObserver.prototype.error = function (e) {\n      var result = tryCatch(this._fn)(e);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      isPromise(result) && (result = observableFromPromise(result));\n\n      var d = new SingleAssignmentDisposable();\n      this._s.setDisposable(d);\n      d.setDisposable(result.subscribe(this._o));\n    };\n\n    return CatchObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n   * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n   */\n  observableProto['catch'] = function (handlerOrSecond) {\n    return isFunction(handlerOrSecond) ? new CatchObservable(this, handlerOrSecond) : observableCatch([this, handlerOrSecond]);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n   * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n   */\n  var observableCatch = Observable['catch'] = function () {\n    var items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(len);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    return enumerableOf(items).catchError();\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   * This can be in the form of an argument list of observables or an array.\n   *\n   * @example\n   * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return combineLatest.apply(this, args);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var CombineLatestObservable = (function(__super__) {\n    inherits(CombineLatestObservable, __super__);\n    function CombineLatestObservable(params, cb) {\n      this._params = params;\n      this._cb = cb;\n      __super__.call(this);\n    }\n\n    CombineLatestObservable.prototype.subscribeCore = function(observer) {\n      var len = this._params.length,\n          subscriptions = new Array(len);\n\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        isDone: arrayInitialize(len, falseFactory),\n        values: new Array(len)\n      };\n\n      for (var i = 0; i < len; i++) {\n        var source = this._params[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new CombineLatestObserver(observer, i, this._cb, state)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return CombineLatestObservable;\n  }(ObservableBase));\n\n  var CombineLatestObserver = (function (__super__) {\n    inherits(CombineLatestObserver, __super__);\n    function CombineLatestObserver(o, i, cb, state) {\n      this._o = o;\n      this._i = i;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    CombineLatestObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      if (this._state.hasValueAll || (this._state.hasValueAll = this._state.hasValue.every(identity))) {\n        var res = tryCatch(this._cb).apply(null, this._state.values);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._state.isDone.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    CombineLatestObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    CombineLatestObserver.prototype.completed = function () {\n      this._state.isDone[this._i] = true;\n      this._state.isDone.every(identity) && this._o.onCompleted();\n    };\n\n    return CombineLatestObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n  *\n  * @example\n  * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n  * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n  * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n  */\n  var combineLatest = Observable.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n    return new CombineLatestObservable(args, resultSelector);\n  };\n\n  /**\n   * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  observableProto.concat = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    args.unshift(this);\n    return observableConcat.apply(null, args);\n  };\n\n  var ConcatObserver = (function(__super__) {\n    inherits(ConcatObserver, __super__);\n    function ConcatObserver(s, fn) {\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    ConcatObserver.prototype.next = function (x) { this._s.o.onNext(x); };\n    ConcatObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    ConcatObserver.prototype.completed = function () { this._s.i++; this._fn(this._s); };\n\n    return ConcatObserver;\n  }(AbstractObserver));\n\n  var ConcatObservable = (function(__super__) {\n    inherits(ConcatObservable, __super__);\n    function ConcatObservable(sources) {\n      this._sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive (state, recurse) {\n      if (state.disposable.isDisposed) { return; }\n      if (state.i === state.sources.length) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = state.sources[state.i];\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new ConcatObserver(state, recurse)));\n    }\n\n    ConcatObservable.prototype.subscribeCore = function(o) {\n      var subscription = new SerialDisposable();\n      var disposable = disposableCreate(noop);\n      var state = {\n        o: o,\n        i: 0,\n        subscription: subscription,\n        disposable: disposable,\n        sources: this._sources\n      };\n\n      var cancelable = immediateScheduler.scheduleRecursive(state, scheduleRecursive);\n      return new NAryDisposable([subscription, disposable, cancelable]);\n    };\n\n    return ConcatObservable;\n  }(ObservableBase));\n\n  /**\n   * Concatenates all the observable sequences.\n   * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  var observableConcat = Observable.concat = function () {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      args = new Array(arguments.length);\n      for(var i = 0, len = arguments.length; i < len; i++) { args[i] = arguments[i]; }\n    }\n    return new ConcatObservable(args);\n  };\n\n  /**\n   * Concatenates an observable sequence of observable sequences.\n   * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n   */\n  observableProto.concatAll = function () {\n    return this.merge(1);\n  };\n\n  var MergeObservable = (function (__super__) {\n    inherits(MergeObservable, __super__);\n\n    function MergeObservable(source, maxConcurrent) {\n      this.source = source;\n      this.maxConcurrent = maxConcurrent;\n      __super__.call(this);\n    }\n\n    MergeObservable.prototype.subscribeCore = function(observer) {\n      var g = new CompositeDisposable();\n      g.add(this.source.subscribe(new MergeObserver(observer, this.maxConcurrent, g)));\n      return g;\n    };\n\n    return MergeObservable;\n\n  }(ObservableBase));\n\n  var MergeObserver = (function (__super__) {\n    function MergeObserver(o, max, g) {\n      this.o = o;\n      this.max = max;\n      this.g = g;\n      this.done = false;\n      this.q = [];\n      this.activeCount = 0;\n      __super__.call(this);\n    }\n\n    inherits(MergeObserver, __super__);\n\n    MergeObserver.prototype.handleSubscribe = function (xs) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(xs) && (xs = observableFromPromise(xs));\n      sad.setDisposable(xs.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeObserver.prototype.next = function (innerSource) {\n      if(this.activeCount < this.max) {\n        this.activeCount++;\n        this.handleSubscribe(innerSource);\n      } else {\n        this.q.push(innerSource);\n      }\n    };\n    MergeObserver.prototype.error = function (e) { this.o.onError(e); };\n    MergeObserver.prototype.completed = function () { this.done = true; this.activeCount === 0 && this.o.onCompleted(); };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) { this.parent.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this.parent.o.onError(e); };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      if (this.parent.q.length > 0) {\n        this.parent.handleSubscribe(this.parent.q.shift());\n      } else {\n        this.parent.activeCount--;\n        this.parent.done && this.parent.activeCount === 0 && this.parent.o.onCompleted();\n      }\n    };\n\n    return MergeObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n  * Or merges two observable sequences into a single observable sequence.\n  * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.merge = function (maxConcurrentOrOther) {\n    return typeof maxConcurrentOrOther !== 'number' ?\n      observableMerge(this, maxConcurrentOrOther) :\n      new MergeObservable(this, maxConcurrentOrOther);\n  };\n\n  /**\n   * Merges all the observable sequences into a single observable sequence.\n   * The scheduler is optional and if not specified, the immediate scheduler is used.\n   * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n   */\n  var observableMerge = Observable.merge = function () {\n    var scheduler, sources = [], i, len = arguments.length;\n    if (!arguments[0]) {\n      scheduler = immediateScheduler;\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else if (isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else {\n      scheduler = immediateScheduler;\n      for(i = 0; i < len; i++) { sources.push(arguments[i]); }\n    }\n    if (Array.isArray(sources[0])) {\n      sources = sources[0];\n    }\n    return observableOf(scheduler, sources).mergeAll();\n  };\n\n  var CompositeError = Rx.CompositeError = function(errors) {\n    this.innerErrors = errors;\n    this.message = 'This contains multiple errors. Check the innerErrors';\n    Error.call(this);\n  };\n  CompositeError.prototype = Object.create(Error.prototype);\n  CompositeError.prototype.name = 'CompositeError';\n\n  var MergeDelayErrorObservable = (function(__super__) {\n    inherits(MergeDelayErrorObservable, __super__);\n    function MergeDelayErrorObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeDelayErrorObservable.prototype.subscribeCore = function (o) {\n      var group = new CompositeDisposable(),\n        m = new SingleAssignmentDisposable(),\n        state = { isStopped: false, errors: [], o: o };\n\n      group.add(m);\n      m.setDisposable(this.source.subscribe(new MergeDelayErrorObserver(group, state)));\n\n      return group;\n    };\n\n    return MergeDelayErrorObservable;\n  }(ObservableBase));\n\n  var MergeDelayErrorObserver = (function(__super__) {\n    inherits(MergeDelayErrorObserver, __super__);\n    function MergeDelayErrorObserver(group, state) {\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function setCompletion(o, errors) {\n      if (errors.length === 0) {\n        o.onCompleted();\n      } else if (errors.length === 1) {\n        o.onError(errors[0]);\n      } else {\n        o.onError(new CompositeError(errors));\n      }\n    }\n\n    MergeDelayErrorObserver.prototype.next = function (x) {\n      var inner = new SingleAssignmentDisposable();\n      this._group.add(inner);\n\n      // Check for promises support\n      isPromise(x) && (x = observableFromPromise(x));\n      inner.setDisposable(x.subscribe(new InnerObserver(inner, this._group, this._state)));\n    };\n\n    MergeDelayErrorObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    MergeDelayErrorObserver.prototype.completed = function () {\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    inherits(InnerObserver, __super__);\n    function InnerObserver(inner, group, state) {\n      this._inner = inner;\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n    InnerObserver.prototype.completed = function () {\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    return MergeDelayErrorObserver;\n  }(AbstractObserver));\n\n  /**\n  * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n  * receive all successfully emitted items from all of the source Observables without being interrupted by\n  * an error notification from one of them.\n  *\n  * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n  * error via the Observer's onError, mergeDelayError will refrain from propagating that\n  * error notification until all of the merged Observables have finished emitting items.\n  * @param {Array | Arguments} args Arguments or an array to merge.\n  * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n  */\n  Observable.mergeDelayError = function() {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      var len = arguments.length;\n      args = new Array(len);\n      for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    var source = observableOf(null, args);\n    return new MergeDelayErrorObservable(source);\n  };\n\n  var MergeAllObservable = (function (__super__) {\n    inherits(MergeAllObservable, __super__);\n\n    function MergeAllObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeAllObservable.prototype.subscribeCore = function (o) {\n      var g = new CompositeDisposable(), m = new SingleAssignmentDisposable();\n      g.add(m);\n      m.setDisposable(this.source.subscribe(new MergeAllObserver(o, g)));\n      return g;\n    };\n\n    return MergeAllObservable;\n  }(ObservableBase));\n\n  var MergeAllObserver = (function (__super__) {\n    function MergeAllObserver(o, g) {\n      this.o = o;\n      this.g = g;\n      this.done = false;\n      __super__.call(this);\n    }\n\n    inherits(MergeAllObserver, __super__);\n\n    MergeAllObserver.prototype.next = function(innerSource) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      sad.setDisposable(innerSource.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeAllObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    MergeAllObserver.prototype.completed = function () {\n      this.done = true;\n      this.g.length === 1 && this.o.onCompleted();\n    };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) {\n      this.parent.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function (e) {\n      this.parent.o.onError(e);\n    };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      this.parent.done && this.parent.g.length === 1 && this.parent.o.onCompleted();\n    };\n\n    return MergeAllObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.mergeAll = function () {\n    return new MergeAllObservable(this);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n   * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n   */\n  observableProto.onErrorResumeNext = function (second) {\n    if (!second) { throw new Error('Second observable is required'); }\n    return onErrorResumeNext([this, second]);\n  };\n\n  var OnErrorResumeNextObservable = (function(__super__) {\n    inherits(OnErrorResumeNextObservable, __super__);\n    function OnErrorResumeNextObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.pos < state.sources.length) {\n        var current = state.sources[state.pos++];\n        isPromise(current) && (current = observableFromPromise(current));\n        var d = new SingleAssignmentDisposable();\n        state.subscription.setDisposable(d);\n        d.setDisposable(current.subscribe(new OnErrorResumeNextObserver(state, recurse)));\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    OnErrorResumeNextObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable(),\n          state = {pos: 0, subscription: subscription, o: o, sources: this.sources },\n          cancellable = immediateScheduler.scheduleRecursive(state, scheduleMethod);\n\n      return new BinaryDisposable(subscription, cancellable);\n    };\n\n    return OnErrorResumeNextObservable;\n  }(ObservableBase));\n\n  var OnErrorResumeNextObserver = (function(__super__) {\n    inherits(OnErrorResumeNextObserver, __super__);\n    function OnErrorResumeNextObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      __super__.call(this);\n    }\n\n    OnErrorResumeNextObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    OnErrorResumeNextObserver.prototype.error = function () { this._recurse(this._state); };\n    OnErrorResumeNextObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return OnErrorResumeNextObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n   */\n  var onErrorResumeNext = Observable.onErrorResumeNext = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      var len = arguments.length;\n      sources = new Array(len);\n      for(var i = 0; i < len; i++) { sources[i] = arguments[i]; }\n    }\n    return new OnErrorResumeNextObservable(sources);\n  };\n\n  var SkipUntilObservable = (function(__super__) {\n    inherits(SkipUntilObservable, __super__);\n\n    function SkipUntilObservable(source, other) {\n      this._s = source;\n      this._o = isPromise(other) ? observableFromPromise(other) : other;\n      this._open = false;\n      __super__.call(this);\n    }\n\n    SkipUntilObservable.prototype.subscribeCore = function(o) {\n      var leftSubscription = new SingleAssignmentDisposable();\n      leftSubscription.setDisposable(this._s.subscribe(new SkipUntilSourceObserver(o, this)));\n\n      isPromise(this._o) && (this._o = observableFromPromise(this._o));\n\n      var rightSubscription = new SingleAssignmentDisposable();\n      rightSubscription.setDisposable(this._o.subscribe(new SkipUntilOtherObserver(o, this, rightSubscription)));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    };\n\n    return SkipUntilObservable;\n  }(ObservableBase));\n\n  var SkipUntilSourceObserver = (function(__super__) {\n    inherits(SkipUntilSourceObserver, __super__);\n    function SkipUntilSourceObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipUntilSourceObserver.prototype.next = function (x) {\n      this._p._open && this._o.onNext(x);\n    };\n\n    SkipUntilSourceObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilSourceObserver.prototype.onCompleted = function () {\n      this._p._open && this._o.onCompleted();\n    };\n\n    return SkipUntilSourceObserver;\n  }(AbstractObserver));\n\n  var SkipUntilOtherObserver = (function(__super__) {\n    inherits(SkipUntilOtherObserver, __super__);\n    function SkipUntilOtherObserver(o, p, r) {\n      this._o = o;\n      this._p = p;\n      this._r = r;\n      __super__.call(this);\n    }\n\n    SkipUntilOtherObserver.prototype.next = function () {\n      this._p._open = true;\n      this._r.dispose();\n    };\n\n    SkipUntilOtherObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilOtherObserver.prototype.onCompleted = function () {\n      this._r.dispose();\n    };\n\n    return SkipUntilOtherObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n   * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n   */\n  observableProto.skipUntil = function (other) {\n    return new SkipUntilObservable(this, other);\n  };\n\n  var SwitchObservable = (function(__super__) {\n    inherits(SwitchObservable, __super__);\n    function SwitchObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    SwitchObservable.prototype.subscribeCore = function (o) {\n      var inner = new SerialDisposable(), s = this.source.subscribe(new SwitchObserver(o, inner));\n      return new BinaryDisposable(s, inner);\n    };\n\n    inherits(SwitchObserver, AbstractObserver);\n    function SwitchObserver(o, inner) {\n      this.o = o;\n      this.inner = inner;\n      this.stopped = false;\n      this.latest = 0;\n      this.hasLatest = false;\n      AbstractObserver.call(this);\n    }\n\n    SwitchObserver.prototype.next = function (innerSource) {\n      var d = new SingleAssignmentDisposable(), id = ++this.latest;\n      this.hasLatest = true;\n      this.inner.setDisposable(d);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      d.setDisposable(innerSource.subscribe(new InnerObserver(this, id)));\n    };\n\n    SwitchObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    SwitchObserver.prototype.completed = function () {\n      this.stopped = true;\n      !this.hasLatest && this.o.onCompleted();\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(parent, id) {\n      this.parent = parent;\n      this.id = id;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function (x) {\n      this.parent.latest === this.id && this.parent.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.parent.latest === this.id && this.parent.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      if (this.parent.latest === this.id) {\n        this.parent.hasLatest = false;\n        this.parent.stopped && this.parent.o.onCompleted();\n      }\n    };\n\n    return SwitchObservable;\n  }(ObservableBase));\n\n  /**\n  * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n  * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n  */\n  observableProto['switch'] = observableProto.switchLatest = function () {\n    return new SwitchObservable(this);\n  };\n\n  var TakeUntilObservable = (function(__super__) {\n    inherits(TakeUntilObservable, __super__);\n\n    function TakeUntilObservable(source, other) {\n      this.source = source;\n      this.other = isPromise(other) ? observableFromPromise(other) : other;\n      __super__.call(this);\n    }\n\n    TakeUntilObservable.prototype.subscribeCore = function(o) {\n      return new BinaryDisposable(\n        this.source.subscribe(o),\n        this.other.subscribe(new TakeUntilObserver(o))\n      );\n    };\n\n    return TakeUntilObservable;\n  }(ObservableBase));\n\n  var TakeUntilObserver = (function(__super__) {\n    inherits(TakeUntilObserver, __super__);\n    function TakeUntilObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    TakeUntilObserver.prototype.next = function () {\n      this._o.onCompleted();\n    };\n\n    TakeUntilObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    TakeUntilObserver.prototype.onCompleted = noop;\n\n    return TakeUntilObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence until the other observable sequence produces a value.\n   * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n   */\n  observableProto.takeUntil = function (other) {\n    return new TakeUntilObservable(this, other);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var WithLatestFromObservable = (function(__super__) {\n    inherits(WithLatestFromObservable, __super__);\n    function WithLatestFromObservable(source, sources, resultSelector) {\n      this._s = source;\n      this._ss = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    WithLatestFromObservable.prototype.subscribeCore = function (o) {\n      var len = this._ss.length;\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        values: new Array(len)\n      };\n\n      var n = this._ss.length, subscriptions = new Array(n + 1);\n      for (var i = 0; i < n; i++) {\n        var other = this._ss[i], sad = new SingleAssignmentDisposable();\n        isPromise(other) && (other = observableFromPromise(other));\n        sad.setDisposable(other.subscribe(new WithLatestFromOtherObserver(o, i, state)));\n        subscriptions[i] = sad;\n      }\n\n      var outerSad = new SingleAssignmentDisposable();\n      outerSad.setDisposable(this._s.subscribe(new WithLatestFromSourceObserver(o, this._cb, state)));\n      subscriptions[n] = outerSad;\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return WithLatestFromObservable;\n  }(ObservableBase));\n\n  var WithLatestFromOtherObserver = (function (__super__) {\n    inherits(WithLatestFromOtherObserver, __super__);\n    function WithLatestFromOtherObserver(o, i, state) {\n      this._o = o;\n      this._i = i;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromOtherObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      this._state.hasValueAll = this._state.hasValue.every(identity);\n    };\n\n    WithLatestFromOtherObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromOtherObserver.prototype.completed = noop;\n\n    return WithLatestFromOtherObserver;\n  }(AbstractObserver));\n\n  var WithLatestFromSourceObserver = (function (__super__) {\n    inherits(WithLatestFromSourceObserver, __super__);\n    function WithLatestFromSourceObserver(o, cb, state) {\n      this._o = o;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromSourceObserver.prototype.next = function (x) {\n      var allValues = [x].concat(this._state.values);\n      if (!this._state.hasValueAll) { return; }\n      var res = tryCatch(this._cb).apply(null, allValues);\n      if (res === errorObj) { return this._o.onError(res.e); }\n      this._o.onNext(res);\n    };\n\n    WithLatestFromSourceObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromSourceObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return WithLatestFromSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.withLatestFrom = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    return new WithLatestFromObservable(this, args, resultSelector);\n  };\n\n  function falseFactory() { return false; }\n  function emptyArrayFactory() { return []; }\n\n  var ZipObservable = (function(__super__) {\n    inherits(ZipObservable, __super__);\n    function ZipObservable(sources, resultSelector) {\n      this._s = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    ZipObservable.prototype.subscribeCore = function(observer) {\n      var n = this._s.length,\n          subscriptions = new Array(n),\n          done = arrayInitialize(n, falseFactory),\n          q = arrayInitialize(n, emptyArrayFactory);\n\n      for (var i = 0; i < n; i++) {\n        var source = this._s[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new ZipObserver(observer, i, this, q, done)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return ZipObservable;\n  }(ObservableBase));\n\n  var ZipObserver = (function (__super__) {\n    inherits(ZipObserver, __super__);\n    function ZipObserver(o, i, p, q, d) {\n      this._o = o;\n      this._i = i;\n      this._p = p;\n      this._q = q;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    function notEmpty(x) { return x.length > 0; }\n    function shiftEach(x) { return x.shift(); }\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    ZipObserver.prototype.next = function (x) {\n      this._q[this._i].push(x);\n      if (this._q.every(notEmpty)) {\n        var queuedValues = this._q.map(shiftEach);\n        var res = tryCatch(this._p._cb).apply(null, queuedValues);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._d.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    ZipObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ZipObserver.prototype.completed = function () {\n      this._d[this._i] = true;\n      this._d.every(identity) && this._o.onCompleted();\n    };\n\n    return ZipObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n   * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n   */\n  observableProto.zip = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    var parent = this;\n    args.unshift(parent);\n\n    return new ZipObservable(args, resultSelector);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n   * @param arguments Observable sources.\n   * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  Observable.zip = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args = isFunction(args[1]) ? args[0].concat(args[1]) : args[0];\n    }\n    var first = args.shift();\n    return first.zip.apply(first, args);\n  };\n\nfunction falseFactory() { return false; }\nfunction emptyArrayFactory() { return []; }\nfunction argumentsToArray() {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return args;\n}\n\nvar ZipIterableObservable = (function(__super__) {\n  inherits(ZipIterableObservable, __super__);\n  function ZipIterableObservable(sources, cb) {\n    this.sources = sources;\n    this._cb = cb;\n    __super__.call(this);\n  }\n\n  ZipIterableObservable.prototype.subscribeCore = function (o) {\n    var sources = this.sources, len = sources.length, subscriptions = new Array(len);\n\n    var state = {\n      q: arrayInitialize(len, emptyArrayFactory),\n      done: arrayInitialize(len, falseFactory),\n      cb: this._cb,\n      o: o\n    };\n\n    for (var i = 0; i < len; i++) {\n      (function (i) {\n        var source = sources[i], sad = new SingleAssignmentDisposable();\n        (isArrayLike(source) || isIterable(source)) && (source = observableFrom(source));\n\n        subscriptions[i] = sad;\n        sad.setDisposable(source.subscribe(new ZipIterableObserver(state, i)));\n      }(i));\n    }\n\n    return new NAryDisposable(subscriptions);\n  };\n\n  return ZipIterableObservable;\n}(ObservableBase));\n\nvar ZipIterableObserver = (function (__super__) {\n  inherits(ZipIterableObserver, __super__);\n  function ZipIterableObserver(s, i) {\n    this._s = s;\n    this._i = i;\n    __super__.call(this);\n  }\n\n  function notEmpty(x) { return x.length > 0; }\n  function shiftEach(x) { return x.shift(); }\n  function notTheSame(i) {\n    return function (x, j) {\n      return j !== i;\n    };\n  }\n\n  ZipIterableObserver.prototype.next = function (x) {\n    this._s.q[this._i].push(x);\n    if (this._s.q.every(notEmpty)) {\n      var queuedValues = this._s.q.map(shiftEach),\n          res = tryCatch(this._s.cb).apply(null, queuedValues);\n      if (res === errorObj) { return this._s.o.onError(res.e); }\n      this._s.o.onNext(res);\n    } else if (this._s.done.filter(notTheSame(this._i)).every(identity)) {\n      this._s.o.onCompleted();\n    }\n  };\n\n  ZipIterableObserver.prototype.error = function (e) { this._s.o.onError(e); };\n\n  ZipIterableObserver.prototype.completed = function () {\n    this._s.done[this._i] = true;\n    this._s.done.every(identity) && this._s.o.onCompleted();\n  };\n\n  return ZipIterableObserver;\n}(AbstractObserver));\n\n/**\n * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n */\nobservableProto.zipIterable = function () {\n  if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n\n  var parent = this;\n  args.unshift(parent);\n  return new ZipIterableObservable(args, resultSelector);\n};\n\n  function asObservable(source) {\n    return function subscribe(o) { return source.subscribe(o); };\n  }\n\n  /**\n   *  Hides the identity of an observable sequence.\n   * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n   */\n  observableProto.asObservable = function () {\n    return new AnonymousObservable(asObservable(this), this);\n  };\n\n  function toArray(x) { return x.toArray(); }\n  function notEmpty(x) { return x.length > 0; }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n   * @param {Number} count Length of each buffer.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithCount = observableProto.bufferCount = function (count, skip) {\n    typeof skip !== 'number' && (skip = count);\n    return this.windowWithCount(count, skip)\n      .flatMap(toArray)\n      .filter(notEmpty);\n  };\n\n  var DematerializeObservable = (function (__super__) {\n    inherits(DematerializeObservable, __super__);\n    function DematerializeObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    DematerializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DematerializeObserver(o));\n    };\n\n    return DematerializeObservable;\n  }(ObservableBase));\n\n  var DematerializeObserver = (function (__super__) {\n    inherits(DematerializeObserver, __super__);\n\n    function DematerializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    DematerializeObserver.prototype.next = function (x) { x.accept(this._o); };\n    DematerializeObserver.prototype.error = function (e) { this._o.onError(e); };\n    DematerializeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DematerializeObserver;\n  }(AbstractObserver));\n\n  /**\n   * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n   * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n   */\n  observableProto.dematerialize = function () {\n    return new DematerializeObservable(this);\n  };\n\n  var DistinctUntilChangedObservable = (function(__super__) {\n    inherits(DistinctUntilChangedObservable, __super__);\n    function DistinctUntilChangedObservable(source, keyFn, comparer) {\n      this.source = source;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctUntilChangedObserver(o, this.keyFn, this.comparer));\n    };\n\n    return DistinctUntilChangedObservable;\n  }(ObservableBase));\n\n  var DistinctUntilChangedObserver = (function(__super__) {\n    inherits(DistinctUntilChangedObserver, __super__);\n    function DistinctUntilChangedObserver(o, keyFn, comparer) {\n      this.o = o;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      this.hasCurrentKey = false;\n      this.currentKey = null;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObserver.prototype.next = function (x) {\n      var key = x, comparerEquals;\n      if (isFunction(this.keyFn)) {\n        key = tryCatch(this.keyFn)(x);\n        if (key === errorObj) { return this.o.onError(key.e); }\n      }\n      if (this.hasCurrentKey) {\n        comparerEquals = tryCatch(this.comparer)(this.currentKey, key);\n        if (comparerEquals === errorObj) { return this.o.onError(comparerEquals.e); }\n      }\n      if (!this.hasCurrentKey || !comparerEquals) {\n        this.hasCurrentKey = true;\n        this.currentKey = key;\n        this.o.onNext(x);\n      }\n    };\n    DistinctUntilChangedObserver.prototype.error = function(e) {\n      this.o.onError(e);\n    };\n    DistinctUntilChangedObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return DistinctUntilChangedObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Returns an observable sequence that contains only distinct contiguous elements according to the keyFn and the comparer.\n  * @param {Function} [keyFn] A function to compute the comparison key for each element. If not provided, it projects the value.\n  * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n  * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n  */\n  observableProto.distinctUntilChanged = function (keyFn, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctUntilChangedObservable(this, keyFn, comparer);\n  };\n\n  var TapObservable = (function(__super__) {\n    inherits(TapObservable,__super__);\n    function TapObservable(source, observerOrOnNext, onError, onCompleted) {\n      this.source = source;\n      this._oN = observerOrOnNext;\n      this._oE = onError;\n      this._oC = onCompleted;\n      __super__.call(this);\n    }\n\n    TapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, p) {\n      this.o = o;\n      this.t = !p._oN || isFunction(p._oN) ?\n        observerCreate(p._oN || noop, p._oE || noop, p._oC || noop) :\n        p._oN;\n      this.isStopped = false;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function(x) {\n      var res = tryCatch(this.t.onNext).call(this.t, x);\n      if (res === errorObj) { this.o.onError(res.e); }\n      this.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function(err) {\n      var res = tryCatch(this.t.onError).call(this.t, err);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onError(err);\n    };\n    InnerObserver.prototype.completed = function() {\n      var res = tryCatch(this.t.onCompleted).call(this.t);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onCompleted();\n    };\n\n    return TapObservable;\n  }(ObservableBase));\n\n  /**\n  *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an o.\n  * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto['do'] = observableProto.tap = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) {\n    return new TapObservable(this, observerOrOnNext, onError, onCompleted);\n  };\n\n  /**\n  *  Invokes an action for each element in the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onNext Action to invoke for each element in the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnNext = observableProto.tapOnNext = function (onNext, thisArg) {\n    return this.tap(typeof thisArg !== 'undefined' ? function (x) { onNext.call(thisArg, x); } : onNext);\n  };\n\n  /**\n  *  Invokes an action upon exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnError = observableProto.tapOnError = function (onError, thisArg) {\n    return this.tap(noop, typeof thisArg !== 'undefined' ? function (e) { onError.call(thisArg, e); } : onError);\n  };\n\n  /**\n  *  Invokes an action upon graceful termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnCompleted = observableProto.tapOnCompleted = function (onCompleted, thisArg) {\n    return this.tap(noop, null, typeof thisArg !== 'undefined' ? function () { onCompleted.call(thisArg); } : onCompleted);\n  };\n\n  var FinallyObservable = (function (__super__) {\n    inherits(FinallyObservable, __super__);\n    function FinallyObservable(source, fn, thisArg) {\n      this.source = source;\n      this._fn = bindCallback(fn, thisArg, 0);\n      __super__.call(this);\n    }\n\n    FinallyObservable.prototype.subscribeCore = function (o) {\n      var d = tryCatch(this.source.subscribe).call(this.source, o);\n      if (d === errorObj) {\n        this._fn();\n        thrower(d.e);\n      }\n\n      return new FinallyDisposable(d, this._fn);\n    };\n\n    function FinallyDisposable(s, fn) {\n      this.isDisposed = false;\n      this._s = s;\n      this._fn = fn;\n    }\n    FinallyDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        var res = tryCatch(this._s.dispose).call(this._s);\n        this._fn();\n        res === errorObj && thrower(res.e);\n      }\n    };\n\n    return FinallyObservable;\n\n  }(ObservableBase));\n\n  /**\n   *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n   * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n   * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n   */\n  observableProto['finally'] = function (action, thisArg) {\n    return new FinallyObservable(this, action, thisArg);\n  };\n\n  var IgnoreElementsObservable = (function(__super__) {\n    inherits(IgnoreElementsObservable, __super__);\n\n    function IgnoreElementsObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    IgnoreElementsObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    function InnerObserver(o) {\n      this.o = o;\n      this.isStopped = false;\n    }\n    InnerObserver.prototype.onNext = noop;\n    InnerObserver.prototype.onError = function (err) {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onError(err);\n      }\n    };\n    InnerObserver.prototype.onCompleted = function () {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onCompleted();\n      }\n    };\n    InnerObserver.prototype.dispose = function() { this.isStopped = true; };\n    InnerObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.observer.onError(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return IgnoreElementsObservable;\n  }(ObservableBase));\n\n  /**\n   *  Ignores all elements in an observable sequence leaving only the termination messages.\n   * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n   */\n  observableProto.ignoreElements = function () {\n    return new IgnoreElementsObservable(this);\n  };\n\n  var MaterializeObservable = (function (__super__) {\n    inherits(MaterializeObservable, __super__);\n    function MaterializeObservable(source, fn) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MaterializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new MaterializeObserver(o));\n    };\n\n    return MaterializeObservable;\n  }(ObservableBase));\n\n  var MaterializeObserver = (function (__super__) {\n    inherits(MaterializeObserver, __super__);\n\n    function MaterializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    MaterializeObserver.prototype.next = function (x) { this._o.onNext(notificationCreateOnNext(x)) };\n    MaterializeObserver.prototype.error = function (e) { this._o.onNext(notificationCreateOnError(e)); this._o.onCompleted(); };\n    MaterializeObserver.prototype.completed = function () { this._o.onNext(notificationCreateOnCompleted()); this._o.onCompleted(); };\n\n    return MaterializeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n   * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n   */\n  observableProto.materialize = function () {\n    return new MaterializeObservable(this);\n  };\n\n  /**\n   *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n   * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n   * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n   */\n  observableProto.repeat = function (repeatCount) {\n    return enumerableRepeat(this, repeatCount).concat();\n  };\n\n  /**\n   *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n   *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n   *\n   * @example\n   *  var res = retried = retry.repeat();\n   *  var res = retried = retry.repeat(2);\n   * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retry = function (retryCount) {\n    return enumerableRepeat(this, retryCount).catchError();\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RetryWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RetryWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RetryWhenObservable, __super__);\n\n    RetryWhenObservable.prototype.subscribeCore = function (o) {\n      var exceptions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(exceptions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            exceptions.onNext(exn);\n            outer.dispose();\n          },\n          function() { o.onCompleted(); }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RetryWhenObservable;\n  }(ObservableBase));\n\n  observableProto.retryWhen = function (notifier) {\n    return new RetryWhenObservable(repeat(this), notifier);\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RepeatWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RepeatWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RepeatWhenObservable, __super__);\n\n    RepeatWhenObservable.prototype.subscribeCore = function (o) {\n      var completions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(completions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) { o.onError(exn); },\n          function() {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            completions.onNext(null);\n            outer.dispose();\n          }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RepeatWhenObservable;\n  }(ObservableBase));\n\n  observableProto.repeatWhen = function (notifier) {\n    return new RepeatWhenObservable(repeat(this), notifier);\n  };\n\n  var ScanObservable = (function(__super__) {\n    inherits(ScanObservable, __super__);\n    function ScanObservable(source, accumulator, hasSeed, seed) {\n      this.source = source;\n      this.accumulator = accumulator;\n      this.hasSeed = hasSeed;\n      this.seed = seed;\n      __super__.call(this);\n    }\n\n    ScanObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new ScanObserver(o,this));\n    };\n\n    return ScanObservable;\n  }(ObservableBase));\n\n  var ScanObserver = (function (__super__) {\n    inherits(ScanObserver, __super__);\n    function ScanObserver(o, parent) {\n      this._o = o;\n      this._p = parent;\n      this._fn = parent.accumulator;\n      this._hs = parent.hasSeed;\n      this._s = parent.seed;\n      this._ha = false;\n      this._a = null;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    ScanObserver.prototype.next = function (x) {\n      !this._hv && (this._hv = true);\n      if (this._ha) {\n        this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n      } else {\n        this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n        this._ha = true;\n      }\n      if (this._a === errorObj) { return this._o.onError(this._a.e); }\n      this._o.onNext(this._a);\n      this._i++;\n    };\n\n    ScanObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ScanObserver.prototype.completed = function () {\n      !this._hv && this._hs && this._o.onNext(this._s);\n      this._o.onCompleted();\n    };\n\n    return ScanObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n  *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n  * @param {Mixed} [seed] The initial accumulator value.\n  * @param {Function} accumulator An accumulator function to be invoked on each element.\n  * @returns {Observable} An observable sequence containing the accumulated values.\n  */\n  observableProto.scan = function () {\n    var hasSeed = false, seed, accumulator = arguments[0];\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new ScanObservable(this, accumulator, hasSeed, seed);\n  };\n\n  var SkipLastObservable = (function (__super__) {\n    inherits(SkipLastObservable, __super__);\n    function SkipLastObservable(source, c) {\n      this.source = source;\n      this._c = c;\n      __super__.call(this);\n    }\n\n    SkipLastObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipLastObserver(o, this._c));\n    };\n\n    return SkipLastObservable;\n  }(ObservableBase));\n\n  var SkipLastObserver = (function (__super__) {\n    inherits(SkipLastObserver, __super__);\n    function SkipLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    SkipLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._o.onNext(this._q.shift());\n    };\n\n    SkipLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    SkipLastObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return SkipLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses a specified number of elements at the end of an observable sequence.\n   * @description\n   *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n   *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n   * @param count Number of elements to bypass at the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n   */\n  observableProto.skipLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipLastObservable(this, count);\n  };\n\n  /**\n   *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n   *  @example\n   *  var res = source.startWith(1, 2, 3);\n   *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n   * @param {Arguments} args The specified values to prepend to the observable sequence\n   * @returns {Observable} The source sequence prepended with the specified values.\n   */\n  observableProto.startWith = function () {\n    var values, scheduler, start = 0;\n    if (!!arguments.length && isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      start = 1;\n    } else {\n      scheduler = immediateScheduler;\n    }\n    for(var args = [], i = start, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableConcat.apply(null, [observableFromArray(args, scheduler), this]);\n  };\n\n  var TakeLastObserver = (function (__super__) {\n    inherits(TakeLastObserver, __super__);\n    function TakeLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastObserver.prototype.completed = function () {\n      while (this._q.length > 0) { this._o.onNext(this._q.shift()); }\n      this._o.onCompleted();\n    };\n\n    return TakeLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns a specified number of contiguous elements from the end of an observable sequence.\n   * @description\n   *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n   *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastObserver(o, count));\n    }, source);\n  };\n\n  var TakeLastBufferObserver = (function (__super__) {\n    inherits(TakeLastBufferObserver, __super__);\n    function TakeLastBufferObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastBufferObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastBufferObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastBufferObserver.prototype.completed = function () {\n      this._o.onNext(this._q);\n      this._o.onCompleted();\n    };\n\n    return TakeLastBufferObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n   *\n   * @description\n   *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n   *  source sequence, this buffer is produced on the result sequence.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLastBuffer = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastBufferObserver(o, count));\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n   * @param {Number} count Length of each window.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithCount = observableProto.windowCount = function (count, skip) {\n    var source = this;\n    +count || (count = 0);\n    Math.abs(count) === Infinity && (count = 0);\n    if (count <= 0) { throw new ArgumentOutOfRangeError(); }\n    skip == null && (skip = count);\n    +skip || (skip = 0);\n    Math.abs(skip) === Infinity && (skip = 0);\n\n    if (skip <= 0) { throw new ArgumentOutOfRangeError(); }\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(),\n        refCountDisposable = new RefCountDisposable(m),\n        n = 0,\n        q = [];\n\n      function createWindow () {\n        var s = new Subject();\n        q.push(s);\n        observer.onNext(addRef(s, refCountDisposable));\n      }\n\n      createWindow();\n\n      m.setDisposable(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n          var c = n - count + 1;\n          c >= 0 && c % skip === 0 && q.shift().onCompleted();\n          ++n % skip === 0 && createWindow();\n        },\n        function (e) {\n          while (q.length > 0) { q.shift().onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          while (q.length > 0) { q.shift().onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\nobservableProto.flatMapConcat = observableProto.concatMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).merge(1);\n};\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.concatMapObserver = observableProto.selectConcatObserver = function(onNext, onError, onCompleted, thisArg) {\n    var source = this,\n        onNextFunc = bindCallback(onNext, thisArg, 2),\n        onErrorFunc = bindCallback(onError, thisArg, 1),\n        onCompletedFunc = bindCallback(onCompleted, thisArg, 0);\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNextFunc(x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onErrorFunc(err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompletedFunc();\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, this).concatAll();\n  };\n\n  var DefaultIfEmptyObserver = (function (__super__) {\n    inherits(DefaultIfEmptyObserver, __super__);\n    function DefaultIfEmptyObserver(o, d) {\n      this._o = o;\n      this._d = d;\n      this._f = false;\n      __super__.call(this);\n    }\n\n    DefaultIfEmptyObserver.prototype.next = function (x) {\n      this._f = true;\n      this._o.onNext(x);\n    };\n\n    DefaultIfEmptyObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    DefaultIfEmptyObserver.prototype.completed = function () {\n      !this._f && this._o.onNext(this._d);\n      this._o.onCompleted();\n    };\n\n    return DefaultIfEmptyObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n   *\n   *  var res = obs = xs.defaultIfEmpty();\n   *  2 - obs = xs.defaultIfEmpty(false);\n   *\n   * @memberOf Observable#\n   * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n   * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n   */\n    observableProto.defaultIfEmpty = function (defaultValue) {\n      var source = this;\n      defaultValue === undefined && (defaultValue = null);\n      return new AnonymousObservable(function (o) {\n        return source.subscribe(new DefaultIfEmptyObserver(o, defaultValue));\n      }, source);\n    };\n\n  // Swap out for Array.findIndex\n  function arrayIndexOfComparer(array, item, comparer) {\n    for (var i = 0, len = array.length; i < len; i++) {\n      if (comparer(array[i], item)) { return i; }\n    }\n    return -1;\n  }\n\n  function HashSet(comparer) {\n    this.comparer = comparer;\n    this.set = [];\n  }\n  HashSet.prototype.push = function(value) {\n    var retValue = arrayIndexOfComparer(this.set, value, this.comparer) === -1;\n    retValue && this.set.push(value);\n    return retValue;\n  };\n\n  var DistinctObservable = (function (__super__) {\n    inherits(DistinctObservable, __super__);\n    function DistinctObservable(source, keyFn, cmpFn) {\n      this.source = source;\n      this._keyFn = keyFn;\n      this._cmpFn = cmpFn;\n      __super__.call(this);\n    }\n\n    DistinctObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctObserver(o, this._keyFn, this._cmpFn));\n    };\n\n    return DistinctObservable;\n  }(ObservableBase));\n\n  var DistinctObserver = (function (__super__) {\n    inherits(DistinctObserver, __super__);\n    function DistinctObserver(o, keyFn, cmpFn) {\n      this._o = o;\n      this._keyFn = keyFn;\n      this._h = new HashSet(cmpFn);\n      __super__.call(this);\n    }\n\n    DistinctObserver.prototype.next = function (x) {\n      var key = x;\n      if (isFunction(this._keyFn)) {\n        key = tryCatch(this._keyFn)(x);\n        if (key === errorObj) { return this._o.onError(key.e); }\n      }\n      this._h.push(key) && this._o.onNext(x);\n    };\n\n    DistinctObserver.prototype.error = function (e) { this._o.onError(e); };\n    DistinctObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DistinctObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n   *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n   *\n   * @example\n   *  var res = obs = xs.distinct();\n   *  2 - obs = xs.distinct(function (x) { return x.id; });\n   *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n   * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n   * @param {Function} [comparer]  Used to compare items in the collection.\n   * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinct = function (keySelector, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctObservable(this, keySelector, comparer);\n  };\n\n  var MapObservable = (function (__super__) {\n    inherits(MapObservable, __super__);\n\n    function MapObservable(source, selector, thisArg) {\n      this.source = source;\n      this.selector = bindCallback(selector, thisArg, 3);\n      __super__.call(this);\n    }\n\n    function innerMap(selector, self) {\n      return function (x, i, o) { return selector.call(this, self.selector(x, i, o), i, o); };\n    }\n\n    MapObservable.prototype.internalMap = function (selector, thisArg) {\n      return new MapObservable(this.source, innerMap(selector, this), thisArg);\n    };\n\n    MapObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, selector, source) {\n      this.o = o;\n      this.selector = selector;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var result = tryCatch(this.selector)(x, this.i++, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n      this.o.onNext(result);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return MapObservable;\n\n  }(ObservableBase));\n\n  /**\n  * Projects each element of an observable sequence into a new form by incorporating the element's index.\n  * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n  */\n  observableProto.map = observableProto.select = function (selector, thisArg) {\n    var selectorFn = typeof selector === 'function' ? selector : function () { return selector; };\n    return this instanceof MapObservable ?\n      this.internalMap(selectorFn, thisArg) :\n      new MapObservable(this, selectorFn, thisArg);\n  };\n\n  function plucker(args, len) {\n    return function mapper(x) {\n      var currentProp = x;\n      for (var i = 0; i < len; i++) {\n        var p = currentProp[args[i]];\n        if (typeof p !== 'undefined') {\n          currentProp = p;\n        } else {\n          return undefined;\n        }\n      }\n      return currentProp;\n    };\n  }\n\n  /**\n   * Retrieves the value of a specified nested property from all elements in\n   * the Observable sequence.\n   * @param {Arguments} arguments The nested properties to pluck.\n   * @returns {Observable} Returns a new Observable sequence of property values.\n   */\n  observableProto.pluck = function () {\n    var len = arguments.length, args = new Array(len);\n    if (len === 0) { throw new Error('List of properties cannot be empty.'); }\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return this.map(plucker(args, len));\n  };\n\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.flatMapObserver = observableProto.selectManyObserver = function (onNext, onError, onCompleted, thisArg) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNext.call(thisArg, x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onError.call(thisArg, err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompleted.call(thisArg);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, source).mergeAll();\n  };\n\nobservableProto.flatMap = observableProto.selectMany = observableProto.mergeMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).mergeAll();\n};\n\nobservableProto.flatMapLatest = observableProto.switchMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).switchLatest();\n};\n\n  var SkipObservable = (function(__super__) {\n    inherits(SkipObservable, __super__);\n    function SkipObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    SkipObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipObserver(o, this._count));\n    };\n\n    function SkipObserver(o, c) {\n      this._o = o;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(SkipObserver, AbstractObserver);\n\n    SkipObserver.prototype.next = function (x) {\n      if (this._r <= 0) {\n        this._o.onNext(x);\n      } else {\n        this._r--;\n      }\n    };\n    SkipObserver.prototype.error = function(e) { this._o.onError(e); };\n    SkipObserver.prototype.completed = function() { this._o.onCompleted(); };\n\n    return SkipObservable;\n  }(ObservableBase));\n\n  /**\n   * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n   * @param {Number} count The number of elements to skip before returning the remaining elements.\n   * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n   */\n  observableProto.skip = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipObservable(this, count);\n  };\n\n  var SkipWhileObservable = (function (__super__) {\n    inherits(SkipWhileObservable, __super__);\n    function SkipWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SkipWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipWhileObserver(o, this));\n    };\n\n    return SkipWhileObservable;\n  }(ObservableBase));\n\n  var SkipWhileObserver = (function (__super__) {\n    inherits(SkipWhileObserver, __super__);\n\n    function SkipWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = false;\n      __super__.call(this);\n    }\n\n    SkipWhileObserver.prototype.next = function (x) {\n      if (!this._r) {\n        var res = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._r = !res;\n      }\n      this._r && this._o.onNext(x);\n    };\n    SkipWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n   *  The element's index is used in the logic of the predicate function.\n   *\n   *  var res = source.skipWhile(function (value) { return value < 10; });\n   *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n   */\n  observableProto.skipWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new SkipWhileObservable(this, fn);\n  };\n\n  var TakeObservable = (function(__super__) {\n    inherits(TakeObservable, __super__);\n    function TakeObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    TakeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeObserver(o, this._count));\n    };\n\n    function TakeObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(TakeObserver, AbstractObserver);\n\n    TakeObserver.prototype.next = function (x) {\n      if (this._r-- > 0) {\n        this._o.onNext(x);\n        this._r <= 0 && this._o.onCompleted();\n      }\n    };\n\n    TakeObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n   * @param {Number} count The number of elements to return.\n   * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n   * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n   */\n  observableProto.take = function (count, scheduler) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    if (count === 0) { return observableEmpty(scheduler); }\n    return new TakeObservable(this, count);\n  };\n\n  var TakeWhileObservable = (function (__super__) {\n    inherits(TakeWhileObservable, __super__);\n    function TakeWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    TakeWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeWhileObserver(o, this));\n    };\n\n    return TakeWhileObservable;\n  }(ObservableBase));\n\n  var TakeWhileObserver = (function (__super__) {\n    inherits(TakeWhileObserver, __super__);\n\n    function TakeWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = true;\n      __super__.call(this);\n    }\n\n    TakeWhileObserver.prototype.next = function (x) {\n      if (this._r) {\n        this._r = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (this._r === errorObj) { return this._o.onError(this._r.e); }\n      }\n      if (this._r) {\n        this._o.onNext(x);\n      } else {\n        this._o.onCompleted();\n      }\n    };\n    TakeWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns elements from an observable sequence as long as a specified condition is true.\n   *  The element's index is used in the logic of the predicate function.\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n   */\n  observableProto.takeWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new TakeWhileObservable(this, fn);\n  };\n\n  var FilterObservable = (function (__super__) {\n    inherits(FilterObservable, __super__);\n\n    function FilterObservable(source, predicate, thisArg) {\n      this.source = source;\n      this.predicate = bindCallback(predicate, thisArg, 3);\n      __super__.call(this);\n    }\n\n    FilterObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.predicate, this));\n    };\n\n    function innerPredicate(predicate, self) {\n      return function(x, i, o) { return self.predicate(x, i, o) && predicate.call(this, x, i, o); }\n    }\n\n    FilterObservable.prototype.internalFilter = function(predicate, thisArg) {\n      return new FilterObservable(this.source, innerPredicate(predicate, this), thisArg);\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, predicate, source) {\n      this.o = o;\n      this.predicate = predicate;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var shouldYield = tryCatch(this.predicate)(x, this.i++, this.source);\n      if (shouldYield === errorObj) {\n        return this.o.onError(shouldYield.e);\n      }\n      shouldYield && this.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return FilterObservable;\n\n  }(ObservableBase));\n\n  /**\n  *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n  * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n  */\n  observableProto.filter = observableProto.where = function (predicate, thisArg) {\n    return this instanceof FilterObservable ? this.internalFilter(predicate, thisArg) :\n      new FilterObservable(this, predicate, thisArg);\n  };\n\n  var TransduceObserver = (function (__super__) {\n    inherits(TransduceObserver, __super__);\n    function TransduceObserver(o, xform) {\n      this._o = o;\n      this._xform = xform;\n      __super__.call(this);\n    }\n\n    TransduceObserver.prototype.next = function (x) {\n      var res = tryCatch(this._xform['@@transducer/step']).call(this._xform, this._o, x);\n      if (res === errorObj) { this._o.onError(res.e); }\n    };\n\n    TransduceObserver.prototype.error = function (e) { this._o.onError(e); };\n\n    TransduceObserver.prototype.completed = function () {\n      this._xform['@@transducer/result'](this._o);\n    };\n\n    return TransduceObserver;\n  }(AbstractObserver));\n\n  function transformForObserver(o) {\n    return {\n      '@@transducer/init': function() {\n        return o;\n      },\n      '@@transducer/step': function(obs, input) {\n        return obs.onNext(input);\n      },\n      '@@transducer/result': function(obs) {\n        return obs.onCompleted();\n      }\n    };\n  }\n\n  /**\n   * Executes a transducer to transform the observable sequence\n   * @param {Transducer} transducer A transducer to execute\n   * @returns {Observable} An Observable sequence containing the results from the transducer.\n   */\n  observableProto.transduce = function(transducer) {\n    var source = this;\n    return new AnonymousObservable(function(o) {\n      var xform = transducer(transformForObserver(o));\n      return source.subscribe(new TransduceObserver(o, xform));\n    }, source);\n  };\n\n  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {\n    inherits(AnonymousObservable, __super__);\n\n    // Fix subscriber to check for undefined or function returned to decorate as Disposable\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.__subscribe).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function AnonymousObservable(subscribe, parent) {\n      this.source = parent;\n      this.__subscribe = subscribe;\n      __super__.call(this);\n    }\n\n    AnonymousObservable.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    return AnonymousObservable;\n\n  }(Observable));\n\n  var AutoDetachObserver = (function (__super__) {\n    inherits(AutoDetachObserver, __super__);\n\n    function AutoDetachObserver(observer) {\n      __super__.call(this);\n      this.observer = observer;\n      this.m = new SingleAssignmentDisposable();\n    }\n\n    var AutoDetachObserverPrototype = AutoDetachObserver.prototype;\n\n    AutoDetachObserverPrototype.next = function (value) {\n      var result = tryCatch(this.observer.onNext).call(this.observer, value);\n      if (result === errorObj) {\n        this.dispose();\n        thrower(result.e);\n      }\n    };\n\n    AutoDetachObserverPrototype.error = function (err) {\n      var result = tryCatch(this.observer.onError).call(this.observer, err);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.completed = function () {\n      var result = tryCatch(this.observer.onCompleted).call(this.observer);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };\n    AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };\n\n    AutoDetachObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.m.dispose();\n    };\n\n    return AutoDetachObserver;\n  }(AbstractObserver));\n\n  var InnerSubscription = function (s, o) {\n    this._s = s;\n    this._o = o;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this._s.isDisposed && this._o !== null) {\n      var idx = this._s.observers.indexOf(this._o);\n      this._s.observers.splice(idx, 1);\n      this._o = null;\n    }\n  };\n\n  /**\n   *  Represents an object that is both an observable sequence as well as an observer.\n   *  Each notification is broadcasted to all subscribed observers.\n   */\n  var Subject = Rx.Subject = (function (__super__) {\n    inherits(Subject, __super__);\n    function Subject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(Subject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n          return disposableEmpty;\n        }\n        o.onCompleted();\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onCompleted();\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.error = error;\n          this.hasError = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onNext(value);\n          }\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    /**\n     * Creates a subject from the specified observer and observable.\n     * @param {Observer} observer The observer used to send messages to the subject.\n     * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n     * @returns {Subject} Subject implemented using the given observer and observable.\n     */\n    Subject.create = function (observer, observable) {\n      return new AnonymousSubject(observer, observable);\n    };\n\n    return Subject;\n  }(Observable));\n\n  /**\n   *  Represents the result of an asynchronous operation.\n   *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n   */\n  var AsyncSubject = Rx.AsyncSubject = (function (__super__) {\n    inherits(AsyncSubject, __super__);\n\n    /**\n     * Creates a subject that can only receive one value and that value is cached for all future observations.\n     * @constructor\n     */\n    function AsyncSubject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasValue = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(AsyncSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n\n        if (this.hasError) {\n          o.onError(this.error);\n        } else if (this.hasValue) {\n          o.onNext(this.value);\n          o.onCompleted();\n        } else {\n          o.onCompleted();\n        }\n\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n       */\n      onCompleted: function () {\n        var i, len;\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          var os = cloneArray(this.observers), len = os.length;\n\n          if (this.hasValue) {\n            for (i = 0; i < len; i++) {\n              var o = os[i];\n              o.onNext(this.value);\n              o.onCompleted();\n            }\n          } else {\n            for (i = 0; i < len; i++) {\n              os[i].onCompleted();\n            }\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the error.\n       * @param {Mixed} error The Error to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.hasError = true;\n          this.error = error;\n\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n       * @param {Mixed} value The value to store in the subject.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        this.hasValue = true;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.error = null;\n        this.value = null;\n      }\n    });\n\n    return AsyncSubject;\n  }(Observable));\n\n  var AnonymousSubject = Rx.AnonymousSubject = (function (__super__) {\n    inherits(AnonymousSubject, __super__);\n    function AnonymousSubject(observer, observable) {\n      this.observer = observer;\n      this.observable = observable;\n      __super__.call(this);\n    }\n\n    addProperties(AnonymousSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        return this.observable.subscribe(o);\n      },\n      onCompleted: function () {\n        this.observer.onCompleted();\n      },\n      onError: function (error) {\n        this.observer.onError(error);\n      },\n      onNext: function (value) {\n        this.observer.onNext(value);\n      }\n    });\n\n    return AnonymousSubject;\n  }(Observable));\n\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    root.Rx = Rx;\n\n    define(function() {\n      return Rx;\n    });\n  } else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = Rx).Rx = Rx;\n    } else {\n      freeExports.Rx = Rx;\n    }\n  } else {\n    // in a browser or Rhino\n    root.Rx = Rx;\n  }\n\n  // All code before this point will be filtered from stack traces.\n  var rEndingLine = captureLine();\n\n}.call(this));\n"
  },
  {
    "path": "dist/rx.lite.compat.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (undefined) {\n\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  var Rx = {\n    internals: {},\n    config: {\n      Promise: root.Promise\n    },\n    helpers: { }\n  };\n\n  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    defaultNow = Rx.helpers.defaultNow = (function () { return !!Date.now ? Date.now : function () { return +new Date; }; }()),\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.subscribe !== 'function' && typeof p.then === 'function'; },\n    isFunction = Rx.helpers.isFunction = (function () {\n\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      };\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n\n      return isFn;\n    }());\n\n    function cloneArray(arr) {\n      var len = arr.length, a = new Array(len);\n      for(var i = 0; i < len; i++) { a[i] = arr[i]; }\n      return a;\n    }\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  Rx.config.longStackSupport = false;\n  var hasStacks = false, stacks = tryCatch(function () { throw new Error(); })();\n  hasStacks = !!stacks.e && !!stacks.e.stack;\n\n  // All code after this point will be filtered from stack traces reported by RxJS\n  var rStartingLine = captureLine(), rFileName;\n\n  var STACK_JUMP_SEPARATOR = 'From previous event:';\n\n  function makeStackTraceLong(error, observable) {\n    // If possible, transform the error stack trace by removing Node and RxJS\n    // cruft, then concatenating with the stack trace of `observable`.\n    if (hasStacks &&\n        observable.stack &&\n        typeof error === 'object' &&\n        error !== null &&\n        error.stack &&\n        error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n    ) {\n      var stacks = [];\n      for (var o = observable; !!o; o = o.source) {\n        if (o.stack) {\n          stacks.unshift(o.stack);\n        }\n      }\n      stacks.unshift(error.stack);\n\n      var concatedStacks = stacks.join('\\n' + STACK_JUMP_SEPARATOR + '\\n');\n      error.stack = filterStackString(concatedStacks);\n    }\n  }\n\n  function filterStackString(stackString) {\n    var lines = stackString.split('\\n'), desiredLines = [];\n    for (var i = 0, len = lines.length; i < len; i++) {\n      var line = lines[i];\n\n      if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n        desiredLines.push(line);\n      }\n    }\n    return desiredLines.join('\\n');\n  }\n\n  function isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n    if (!fileNameAndLineNumber) {\n      return false;\n    }\n    var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === rFileName &&\n      lineNumber >= rStartingLine &&\n      lineNumber <= rEndingLine;\n  }\n\n  function isNodeFrame(stackLine) {\n    return stackLine.indexOf('(module.js:') !== -1 ||\n      stackLine.indexOf('(node.js:') !== -1;\n  }\n\n  function captureLine() {\n    if (!hasStacks) { return; }\n\n    try {\n      throw new Error();\n    } catch (e) {\n      var lines = e.stack.split('\\n');\n      var firstLine = lines[0].indexOf('@') > 0 ? lines[1] : lines[2];\n      var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n      if (!fileNameAndLineNumber) { return; }\n\n      rFileName = fileNameAndLineNumber[0];\n      return fileNameAndLineNumber[1];\n    }\n  }\n\n  function getFileNameAndLineNumber(stackLine) {\n    // Named functions: 'at functionName (filename:lineNumber:columnNumber)'\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }\n\n    // Anonymous functions: 'at filename:lineNumber:columnNumber'\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }\n\n    // Firefox style: 'function@filename:lineNumber or @filename:lineNumber'\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }\n  }\n\n  // Utilities\n  var toString = Object.prototype.toString;\n  var arrayClass = '[object Array]',\n      funcClass = '[object Function]',\n      stringClass = '[object String]';\n\n  if (!Array.prototype.forEach) {\n    Array.prototype.forEach = function (callback, thisArg) {\n      var T, k;\n\n      if (this == null) {\n        throw new TypeError(' this is null or not defined');\n      }\n\n      var O = Object(this);\n      var len = O.length >>> 0;\n\n      if (typeof callback !== 'function') {\n        throw new TypeError(callback + ' is not a function');\n      }\n\n      if (arguments.length > 1) {\n        T = thisArg;\n      }\n\n      k = 0;\n      while (k < len) {\n        var kValue;\n        if (k in O) {\n          kValue = O[k];\n          callback.call(T, kValue, k, O);\n        }\n        k++;\n      }\n    };\n  }\n\n  var boxedString = Object('a'),\n      splitString = boxedString[0] !== 'a' || !(0 in boxedString);\n  if (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n      var object = Object(this),\n        self = splitString && toString.call(this) === stringClass ?\n          this.split('') :\n          object,\n        length = self.length >>> 0,\n        thisp = arguments[1];\n\n      if (toString.call(fun) !== funcClass) {\n        throw new TypeError(fun + ' is not a function');\n      }\n\n      for (var i = 0; i < length; i++) {\n        if (i in self && !fun.call(thisp, self[i], i, object)) {\n          return false;\n        }\n      }\n      return true;\n    };\n  }\n\n  if (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n      var object = Object(this),\n        self = splitString && toString.call(this) === stringClass ?\n            this.split('') :\n            object,\n        length = self.length >>> 0,\n        result = new Array(length),\n        thisp = arguments[1];\n\n      if (toString.call(fun) !== funcClass) {\n        throw new TypeError(fun + ' is not a function');\n      }\n\n      for (var i = 0; i < length; i++) {\n        if (i in self) {\n          result[i] = fun.call(thisp, self[i], i, object);\n        }\n      }\n      return result;\n    };\n  }\n\n  if (!Array.prototype.filter) {\n    Array.prototype.filter = function (predicate) {\n      var results = [], item, t = new Object(this);\n      for (var i = 0, len = t.length >>> 0; i < len; i++) {\n        item = t[i];\n        if (i in t && predicate.call(arguments[1], item, i, t)) {\n          results.push(item);\n        }\n      }\n      return results;\n    };\n  }\n\n  if (!Array.isArray) {\n    Array.isArray = function (arg) {\n      return toString.call(arg) === arrayClass;\n    };\n  }\n\n  if (!Array.prototype.indexOf) {\n    Array.prototype.indexOf = function indexOf(searchElement) {\n      var t = Object(this);\n      var len = t.length >>> 0;\n      if (len === 0) {\n        return -1;\n      }\n      var n = 0;\n      if (arguments.length > 1) {\n        n = Number(arguments[1]);\n        if (n !== n) {\n          n = 0;\n        } else if (n !== 0 && n !== Infinity && n !== -Infinity) {\n          n = (n > 0 || -1) * Math.floor(Math.abs(n));\n        }\n      }\n      if (n >= len) {\n        return -1;\n      }\n      var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);\n      for (; k < len; k++) {\n        if (k in t && t[k] === searchElement) {\n          return k;\n        }\n      }\n      return -1;\n    };\n  }\n\n  // Fix for Tessel\n  if (!Object.prototype.propertyIsEnumerable) {\n    Object.prototype.propertyIsEnumerable = function (key) {\n      for (var k in this) { if (k === key) { return true; } }\n      return false;\n    };\n  }\n\n  if (!Object.keys) {\n    Object.keys = (function() {\n      'use strict';\n      var hasOwnProperty = Object.prototype.hasOwnProperty,\n      hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString');\n\n      return function(obj) {\n        if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n          throw new TypeError('Object.keys called on non-object');\n        }\n\n        var result = [], prop, i;\n\n        for (prop in obj) {\n          if (hasOwnProperty.call(obj, prop)) {\n            result.push(prop);\n          }\n        }\n\n        if (hasDontEnumBug) {\n          for (i = 0; i < dontEnumsLength; i++) {\n            if (hasOwnProperty.call(obj, dontEnums[i])) {\n              result.push(dontEnums[i]);\n            }\n          }\n        }\n        return result;\n      };\n    }());\n  }\n\n  if (typeof Object.create !== 'function') {\n    // Production steps of ECMA-262, Edition 5, 15.2.3.5\n    // Reference: http://es5.github.io/#x15.2.3.5\n    Object.create = (function() {\n      function Temp() {}\n\n      var hasOwn = Object.prototype.hasOwnProperty;\n\n      return function (O) {\n        if (typeof O !== 'object') {\n          throw new TypeError('Object prototype may only be an Object or null');\n        }\n\n        Temp.prototype = O;\n        var obj = new Temp();\n        Temp.prototype = null;\n\n        if (arguments.length > 1) {\n          // Object.defineProperties does ToObject on its first argument.\n          var Properties = Object(arguments[1]);\n          for (var prop in Properties) {\n            if (hasOwn.call(Properties, prop)) {\n              obj[prop] = Properties[prop];\n            }\n          }\n        }\n\n        // 5. Return obj\n        return obj;\n      };\n    })();\n  }\n\n  root.Element && root.Element.prototype.attachEvent && !root.Element.prototype.addEventListener && (function () {\n    function addMethod(name, fn) {\n      Window.prototype[name] = HTMLDocument.prototype[name] = Element.prototype[name] = fn;\n    }\n\n    addMethod('addEventListener', function (type, listener) {\n      var target = this;\n      var listeners = target._c1_listeners = target._c1_listeners || {};\n      var typeListeners = listeners[type] = listeners[type] || [];\n\n      target.attachEvent('on' + type, typeListeners.event = function (e) {\n        e || (e = root.event);\n\n        var documentElement = target.document &&\n          target.document.documentElement ||\n          target.documentElement ||\n          { scrollLeft: 0, scrollTop: 0 };\n\n        e.currentTarget = target;\n        e.pageX = e.clientX + documentElement.scrollLeft;\n        e.pageY = e.clientY + documentElement.scrollTop;\n\n        e.preventDefault = function () {\n          e.bubbledKeyCode = e.keyCode;\n          if (e.ctrlKey) {\n            try {\n              e.keyCode = 0;\n            } catch (e) { }\n          }\n          e.defaultPrevented = true;\n          e.returnValue = false;\n          e.modified = true;\n          e.returnValue = false;\n        };\n\n        e.stopImmediatePropagation = function () {\n          immediatePropagation = false;\n          e.cancelBubble = true;\n        };\n\n        e.stopPropagation = function () {\n          e.cancelBubble = true;\n        };\n\n        e.relatedTarget = e.fromElement || null;\n        e.target = e.srcElement || target;\n        e.timeStamp = +new Date();\n\n        // Normalize key events\n        switch(e.type) {\n          case 'keypress':\n            var c = ('charCode' in e ? e.charCode : e.keyCode);\n            if (c === 10) {\n              c = 0;\n              e.keyCode = 13;\n            } else if (c === 13 || c === 27) {\n              c = 0;\n            } else if (c === 3) {\n              c = 99;\n            }\n            e.charCode = c;\n            e.keyChar = e.charCode ? String.fromCharCode(e.charCode) : '';\n            break;\n        }\n\n        var copiedEvent = {};\n        for (var prop in e) {\n          copiedEvent[prop] = e[prop];\n        }\n\n        for (var i = 0, typeListenersCache = [].concat(typeListeners), typeListenerCache, immediatePropagation = true; immediatePropagation && (typeListenerCache = typeListenersCache[i]); ++i) {\n          for (var ii = 0, typeListener; typeListener = typeListeners[ii]; ++ii) {\n            if (typeListener === typeListenerCache) { typeListener.call(target, copiedEvent); break; }\n          }\n        }\n      });\n\n      typeListeners.push(listener);\n    });\n\n    addMethod('removeEventListener', function (type, listener) {\n      var target = this;\n      var listeners = target._c1_listeners = target._c1_listeners || {};\n      var typeListeners = listeners[type] = listeners[type] || [];\n\n      for (var i = typeListeners.length - 1, typeListener; typeListener = typeListeners[i]; --i) {\n        if (typeListener === listener) { typeListeners.splice(i, 1); break; }\n      }\n\n      !typeListeners.length &&\n        typeListeners.event &&\n        target.detachEvent('on' + type, typeListeners.event);\n    });\n\n    addMethod('dispatchEvent', function (e) {\n      var target = this;\n      var type = e.type;\n      var listeners = target._c1_listeners = target._c1_listeners || {};\n      var typeListeners = listeners[type] = listeners[type] || [];\n\n      try {\n        return target.fireEvent('on' + type, e);\n      } catch (err) {\n        return typeListeners.event && typeListeners.event(e);\n      }\n    });\n\n    function ready() {\n      if (ready.interval && document.body) {\n        ready.interval = clearInterval(ready.interval);\n\n        document.dispatchEvent(new CustomEvent('DOMContentLoaded'));\n      }\n    }\n\n    ready.interval = setInterval(ready, 1);\n\n    root.addEventListener('load', ready);\n  }());\n\n  (!root.CustomEvent || typeof root.CustomEvent === 'object') && (function() {\n    function CustomEvent (type, params) {\n      var event;\n      params = params || { bubbles: false, cancelable: false, detail: undefined };\n\n      try {\n        if (document.createEvent) {\n          event = document.createEvent('CustomEvent');\n          event.initCustomEvent(type, params.bubbles, params.cancelable, params.detail);\n        } else if (document.createEventObject) {\n          event = document.createEventObject();\n        }\n      } catch (error) {\n        event = document.createEvent('Event');\n        event.initEvent(type, params.bubbles, params.cancelable);\n        event.detail = params.detail;\n      }\n\n      return event;\n    }\n\n    root.CustomEvent && (CustomEvent.prototype = root.CustomEvent.prototype);\n    root.CustomEvent = CustomEvent;\n  }());\n\n  var EmptyError = Rx.EmptyError = function() {\n    this.message = 'Sequence contains no elements.';\n    Error.call(this);\n  };\n  EmptyError.prototype = Object.create(Error.prototype);\n  EmptyError.prototype.name = 'EmptyError';\n\n  var ObjectDisposedError = Rx.ObjectDisposedError = function() {\n    this.message = 'Object has been disposed';\n    Error.call(this);\n  };\n  ObjectDisposedError.prototype = Object.create(Error.prototype);\n  ObjectDisposedError.prototype.name = 'ObjectDisposedError';\n\n  var ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError = function () {\n    this.message = 'Argument out of range';\n    Error.call(this);\n  };\n  ArgumentOutOfRangeError.prototype = Object.create(Error.prototype);\n  ArgumentOutOfRangeError.prototype.name = 'ArgumentOutOfRangeError';\n\n  var NotSupportedError = Rx.NotSupportedError = function (message) {\n    this.message = message || 'This operation is not supported';\n    Error.call(this);\n  };\n  NotSupportedError.prototype = Object.create(Error.prototype);\n  NotSupportedError.prototype.name = 'NotSupportedError';\n\n  var NotImplementedError = Rx.NotImplementedError = function (message) {\n    this.message = message || 'This operation is not implemented';\n    Error.call(this);\n  };\n  NotImplementedError.prototype = Object.create(Error.prototype);\n  NotImplementedError.prototype.name = 'NotImplementedError';\n\n  var notImplemented = Rx.helpers.notImplemented = function () {\n    throw new NotImplementedError();\n  };\n\n  var notSupported = Rx.helpers.notSupported = function () {\n    throw new NotSupportedError();\n  };\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o && o[$iterator$] !== undefined;\n  };\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  };\n\n  Rx.helpers.iterator = $iterator$;\n\n  var bindCallback = Rx.internals.bindCallback = function (func, thisArg, argCount) {\n    if (typeof thisArg === 'undefined') { return func; }\n    switch(argCount) {\n      case 0:\n        return function() {\n          return func.call(thisArg)\n        };\n      case 1:\n        return function(arg) {\n          return func.call(thisArg, arg);\n        };\n      case 2:\n        return function(value, index) {\n          return func.call(thisArg, value, index);\n        };\n      case 3:\n        return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n    }\n\n    return function() {\n      return func.apply(thisArg, arguments);\n    };\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var dontEnums = ['toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'],\n  dontEnumsLength = dontEnums.length;\n\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\nvar objectProto = Object.prototype,\n    hasOwnProperty = objectProto.hasOwnProperty,\n    objToString = objectProto.toString,\n    MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\nvar keys = Object.keys || (function() {\n    var hasOwnProperty = Object.prototype.hasOwnProperty,\n        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),\n        dontEnums = [\n          'toString',\n          'toLocaleString',\n          'valueOf',\n          'hasOwnProperty',\n          'isPrototypeOf',\n          'propertyIsEnumerable',\n          'constructor'\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    return function(obj) {\n      if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n        throw new TypeError('Object.keys called on non-object');\n      }\n\n      var result = [], prop, i;\n\n      for (prop in obj) {\n        if (hasOwnProperty.call(obj, prop)) {\n          result.push(prop);\n        }\n      }\n\n      if (hasDontEnumBug) {\n        for (i = 0; i < dontEnumsLength; i++) {\n          if (hasOwnProperty.call(obj, dontEnums[i])) {\n            result.push(dontEnums[i]);\n          }\n        }\n      }\n      return result;\n    };\n  }());\n\nfunction equalObjects(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objProps = keys(object),\n      objLength = objProps.length,\n      othProps = keys(other),\n      othLength = othProps.length;\n\n  if (objLength !== othLength && !isLoose) {\n    return false;\n  }\n  var index = objLength, key;\n  while (index--) {\n    key = objProps[index];\n    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  var skipCtor = isLoose;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key],\n        result;\n\n    if (!(result === undefined ? equalFunc(objValue, othValue, isLoose, stackA, stackB) : result)) {\n      return false;\n    }\n    skipCtor || (skipCtor = key === 'constructor');\n  }\n  if (!skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    if (objCtor !== othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor === 'function' && objCtor instanceof objCtor &&\n          typeof othCtor === 'function' && othCtor instanceof othCtor)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction equalByTag(object, other, tag) {\n  switch (tag) {\n    case boolTag:\n    case dateTag:\n      return +object === +other;\n\n    case errorTag:\n      return object.name === other.name && object.message === other.message;\n\n    case numberTag:\n      return (object !== +object) ?\n        other !== +other :\n        object === +other;\n\n    case regexpTag:\n    case stringTag:\n      return object === (other + '');\n  }\n  return false;\n}\n\nvar isObject = Rx.internals.isObject = function(value) {\n  var type = typeof value;\n  return !!value && (type === 'object' || type === 'function');\n};\n\nfunction isObjectLike(value) {\n  return !!value && typeof value === 'object';\n}\n\nfunction isLength(value) {\n  return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nvar isHostObject = (function() {\n  try {\n    Object({ 'toString': 0 } + '');\n  } catch(e) {\n    return function() { return false; };\n  }\n  return function(value) {\n    return typeof value.toString !== 'function' && typeof (value + '') === 'string';\n  };\n}());\n\nfunction isTypedArray(value) {\n  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nvar isArray = Array.isArray || function(value) {\n  return isObjectLike(value) && isLength(value.length) && objToString.call(value) === arrayTag;\n};\n\nfunction arraySome (array, predicate) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction equalArrays(array, other, equalFunc, isLoose, stackA, stackB) {\n  var index = -1,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength !== othLength && !(isLoose && othLength > arrLength)) {\n    return false;\n  }\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index],\n        result;\n\n    if (result !== undefined) {\n      if (result) {\n        continue;\n      }\n      return false;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (isLoose) {\n      if (!arraySome(other, function(othValue) {\n            return arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB);\n          })) {\n        return false;\n      }\n    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB))) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction baseIsEqualDeep(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = arrayTag,\n      othTag = arrayTag;\n\n  if (!objIsArr) {\n    objTag = objToString.call(object);\n    if (objTag === argsTag) {\n      objTag = objectTag;\n    } else if (objTag !== objectTag) {\n      objIsArr = isTypedArray(object);\n    }\n  }\n  if (!othIsArr) {\n    othTag = objToString.call(other);\n    if (othTag === argsTag) {\n      othTag = objectTag;\n    }\n  }\n  var objIsObj = objTag === objectTag && !isHostObject(object),\n      othIsObj = othTag === objectTag && !isHostObject(other),\n      isSameTag = objTag === othTag;\n\n  if (isSameTag && !(objIsArr || objIsObj)) {\n    return equalByTag(object, other, objTag);\n  }\n  if (!isLoose) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, isLoose, stackA, stackB);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  // For more information on detecting circular references see https://es5.github.io/#JO.\n  stackA || (stackA = []);\n  stackB || (stackB = []);\n\n  var length = stackA.length;\n  while (length--) {\n    if (stackA[length] === object) {\n      return stackB[length] === other;\n    }\n  }\n  // Add `object` and `other` to the stack of traversed objects.\n  stackA.push(object);\n  stackB.push(other);\n\n  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, isLoose, stackA, stackB);\n\n  stackA.pop();\n  stackB.pop();\n\n  return result;\n}\n\nfunction baseIsEqual(value, other, isLoose, stackA, stackB) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, baseIsEqual, isLoose, stackA, stackB);\n}\n\nvar isEqual = Rx.internals.isEqual = function (value, other) {\n  return baseIsEqual(value, other);\n};\n\n  var hasProp = {}.hasOwnProperty,\n      slice = Array.prototype.slice;\n\n  var inherits = Rx.internals.inherits = function (child, parent) {\n    function __() { this.constructor = child; }\n    __.prototype = parent.prototype;\n    child.prototype = new __();\n  };\n\n  var addProperties = Rx.internals.addProperties = function (obj) {\n    for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n      var source = sources[idx];\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n  };\n\n  // Rx Utils\n  var addRef = Rx.internals.addRef = function (xs, r) {\n    return new AnonymousObservable(function (observer) {\n      return new BinaryDisposable(r.getDisposable(), xs.subscribe(observer));\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n\n  /**\n   * Represents a group of disposable resources that are disposed together.\n   * @constructor\n   */\n  var CompositeDisposable = Rx.CompositeDisposable = function () {\n    var args = [], i, len;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      len = arguments.length;\n      args = new Array(len);\n      for(i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    this.disposables = args;\n    this.isDisposed = false;\n    this.length = args.length;\n  };\n\n  var CompositeDisposablePrototype = CompositeDisposable.prototype;\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Mixed} item Disposable to add.\n   */\n  CompositeDisposablePrototype.add = function (item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n      this.length++;\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Mixed} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n  CompositeDisposablePrototype.remove = function (item) {\n    var shouldDispose = false;\n    if (!this.isDisposed) {\n      var idx = this.disposables.indexOf(item);\n      if (idx !== -1) {\n        shouldDispose = true;\n        this.disposables.splice(idx, 1);\n        this.length--;\n        item.dispose();\n      }\n    }\n    return shouldDispose;\n  };\n\n  /**\n   *  Disposes all disposables in the group and removes them from the group.\n   */\n  CompositeDisposablePrototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var len = this.disposables.length, currentDisposables = new Array(len);\n      for(var i = 0; i < len; i++) { currentDisposables[i] = this.disposables[i]; }\n      this.disposables = [];\n      this.length = 0;\n\n      for (i = 0; i < len; i++) {\n        currentDisposables[i].dispose();\n      }\n    }\n  };\n\n  /**\n   * Provides a set of static methods for creating Disposables.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   */\n  var Disposable = Rx.Disposable = function (action) {\n    this.isDisposed = false;\n    this.action = action || noop;\n  };\n\n  /** Performs the task of cleaning up resources. */\n  Disposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.action();\n      this.isDisposed = true;\n    }\n  };\n\n  /**\n   * Creates a disposable object that invokes the specified action when disposed.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   * @return {Disposable} The disposable object that runs the given action upon disposal.\n   */\n  var disposableCreate = Disposable.create = function (action) { return new Disposable(action); };\n\n  /**\n   * Gets the disposable that does nothing when disposed.\n   */\n  var disposableEmpty = Disposable.empty = { dispose: noop };\n\n  /**\n   * Validates whether the given object is a disposable\n   * @param {Object} Object to test whether it has a dispose method\n   * @returns {Boolean} true if a disposable object, else false.\n   */\n  var isDisposable = Disposable.isDisposable = function (d) {\n    return d && isFunction(d.dispose);\n  };\n\n  var checkDisposed = Disposable.checkDisposed = function (disposable) {\n    if (disposable.isDisposed) { throw new ObjectDisposedError(); }\n  };\n\n  var disposableFixup = Disposable._fixup = function (result) {\n    return isDisposable(result) ? result : disposableEmpty;\n  };\n\n  // Single assignment\n  var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SingleAssignmentDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SingleAssignmentDisposable.prototype.setDisposable = function (value) {\n    if (this.current) { throw new Error('Disposable has already been assigned'); }\n    var shouldDispose = this.isDisposed;\n    !shouldDispose && (this.current = value);\n    shouldDispose && value && value.dispose();\n  };\n  SingleAssignmentDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n      old && old.dispose();\n    }\n  };\n\n  // Multiple assignment disposable\n  var SerialDisposable = Rx.SerialDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SerialDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SerialDisposable.prototype.setDisposable = function (value) {\n    var shouldDispose = this.isDisposed;\n    if (!shouldDispose) {\n      var old = this.current;\n      this.current = value;\n    }\n    old && old.dispose();\n    shouldDispose && value && value.dispose();\n  };\n  SerialDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n    }\n    old && old.dispose();\n  };\n\n  var BinaryDisposable = Rx.BinaryDisposable = function (first, second) {\n    this._first = first;\n    this._second = second;\n    this.isDisposed = false;\n  };\n\n  BinaryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old1 = this._first;\n      this._first = null;\n      old1 && old1.dispose();\n      var old2 = this._second;\n      this._second = null;\n      old2 && old2.dispose();\n    }\n  };\n\n  var NAryDisposable = Rx.NAryDisposable = function (disposables) {\n    this._disposables = disposables;\n    this.isDisposed = false;\n  };\n\n  NAryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      for (var i = 0, len = this._disposables.length; i < len; i++) {\n        this._disposables[i].dispose();\n      }\n      this._disposables.length = 0;\n    }\n  };\n\n  /**\n   * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n   */\n  var RefCountDisposable = Rx.RefCountDisposable = (function () {\n\n    function InnerDisposable(disposable) {\n      this.disposable = disposable;\n      this.disposable.count++;\n      this.isInnerDisposed = false;\n    }\n\n    InnerDisposable.prototype.dispose = function () {\n      if (!this.disposable.isDisposed && !this.isInnerDisposed) {\n        this.isInnerDisposed = true;\n        this.disposable.count--;\n        if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {\n          this.disposable.isDisposed = true;\n          this.disposable.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Initializes a new instance of the RefCountDisposable with the specified disposable.\n     * @constructor\n     * @param {Disposable} disposable Underlying disposable.\n      */\n    function RefCountDisposable(disposable) {\n      this.underlyingDisposable = disposable;\n      this.isDisposed = false;\n      this.isPrimaryDisposed = false;\n      this.count = 0;\n    }\n\n    /**\n     * Disposes the underlying disposable only when all dependent disposables have been disposed\n     */\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed && !this.isPrimaryDisposed) {\n        this.isPrimaryDisposed = true;\n        if (this.count === 0) {\n          this.isDisposed = true;\n          this.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n     * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n     */\n    RefCountDisposable.prototype.getDisposable = function () {\n      return this.isDisposed ? disposableEmpty : new InnerDisposable(this);\n    };\n\n    return RefCountDisposable;\n  })();\n\n  var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) {\n    this.scheduler = scheduler;\n    this.state = state;\n    this.action = action;\n    this.dueTime = dueTime;\n    this.comparer = comparer || defaultSubComparer;\n    this.disposable = new SingleAssignmentDisposable();\n  };\n\n  ScheduledItem.prototype.invoke = function () {\n    this.disposable.setDisposable(this.invokeCore());\n  };\n\n  ScheduledItem.prototype.compareTo = function (other) {\n    return this.comparer(this.dueTime, other.dueTime);\n  };\n\n  ScheduledItem.prototype.isCancelled = function () {\n    return this.disposable.isDisposed;\n  };\n\n  ScheduledItem.prototype.invokeCore = function () {\n    return disposableFixup(this.action(this.scheduler, this.state));\n  };\n\n  /** Provides a set of static properties to access commonly used schedulers. */\n  var Scheduler = Rx.Scheduler = (function () {\n\n    function Scheduler() { }\n\n    /** Determines whether the given object is a scheduler */\n    Scheduler.isScheduler = function (s) {\n      return s instanceof Scheduler;\n    };\n\n    var schedulerProto = Scheduler.prototype;\n\n    /**\n   * Schedules an action to be executed.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.schedule = function (state, action) {\n      throw new NotImplementedError();\n    };\n\n  /**\n   * Schedules an action to be executed after dueTime.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @param {Number} dueTime Relative time after which to execute the action.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime;\n      dt instanceof Date && (dt = dt - this.now());\n      dt = Scheduler.normalize(dt);\n\n      if (dt === 0) { return this.schedule(state, action); }\n\n      return this._scheduleFuture(state, dt, action);\n    };\n\n    schedulerProto._scheduleFuture = function (state, dueTime, action) {\n      throw new NotImplementedError();\n    };\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.now = defaultNow;\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.prototype.now = defaultNow;\n\n    /**\n     * Normalizes the specified TimeSpan value to a positive value.\n     * @param {Number} timeSpan The time span value to normalize.\n     * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n     */\n    Scheduler.normalize = function (timeSpan) {\n      timeSpan < 0 && (timeSpan = 0);\n      return timeSpan;\n    };\n\n    return Scheduler;\n  }());\n\n  var normalizeTime = Scheduler.normalize, isScheduler = Scheduler.isScheduler;\n\n  (function (schedulerProto) {\n\n    function invokeRecImmediate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.schedule(state2, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    function invokeRecDate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2, dueTime1) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.scheduleFuture(state2, dueTime1, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursive = function (state, action) {\n      return this.schedule([state, action], invokeRecImmediate);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative or absolute due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number | Date} dueTime Relative or absolute time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveFuture = function (state, dueTime, action) {\n      return this.scheduleFuture([state, action], dueTime, invokeRecDate);\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    schedulerProto.schedulePeriodic = function(state, period, action) {\n      if (typeof root.setInterval === 'undefined') { throw new NotSupportedError(); }\n      period = normalizeTime(period);\n      var s = state, id = root.setInterval(function () { s = action(s); }, period);\n      return disposableCreate(function () { root.clearInterval(id); });\n    };\n\n  }(Scheduler.prototype));\n\n  /** Gets a scheduler that schedules work immediately on the current thread. */\n   var ImmediateScheduler = (function (__super__) {\n    inherits(ImmediateScheduler, __super__);\n    function ImmediateScheduler() {\n      __super__.call(this);\n    }\n\n    ImmediateScheduler.prototype.schedule = function (state, action) {\n      return disposableFixup(action(this, state));\n    };\n\n    return ImmediateScheduler;\n  }(Scheduler));\n\n  var immediateScheduler = Scheduler.immediate = new ImmediateScheduler();\n\n  /**\n   * Gets a scheduler that schedules work as soon as possible on the current thread.\n   */\n  var CurrentThreadScheduler = (function (__super__) {\n    var queue;\n\n    function runTrampoline () {\n      while (queue.length > 0) {\n        var item = queue.dequeue();\n        !item.isCancelled() && item.invoke();\n      }\n    }\n\n    inherits(CurrentThreadScheduler, __super__);\n    function CurrentThreadScheduler() {\n      __super__.call(this);\n    }\n\n    CurrentThreadScheduler.prototype.schedule = function (state, action) {\n      var si = new ScheduledItem(this, state, action, this.now());\n\n      if (!queue) {\n        queue = new PriorityQueue(4);\n        queue.enqueue(si);\n\n        var result = tryCatch(runTrampoline)();\n        queue = null;\n        if (result === errorObj) { thrower(result.e); }\n      } else {\n        queue.enqueue(si);\n      }\n      return si.disposable;\n    };\n\n    CurrentThreadScheduler.prototype.scheduleRequired = function () { return !queue; };\n\n    return CurrentThreadScheduler;\n  }(Scheduler));\n\n  var currentThreadScheduler = Scheduler.currentThread = new CurrentThreadScheduler();\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function createTick(self) {\n      return function tick(command, recurse) {\n        recurse(0, self._period);\n        var state = tryCatch(self._action)(self._state);\n        if (state === errorObj) {\n          self._cancel.dispose();\n          thrower(state.e);\n        }\n        self._state = state;\n      };\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveFuture(0, this._period, createTick(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  var scheduleMethod, clearMethod;\n\n  var localTimer = (function () {\n    var localSetTimeout, localClearTimeout = noop;\n    if (!!root.setTimeout) {\n      localSetTimeout = root.setTimeout;\n      localClearTimeout = root.clearTimeout;\n    } else if (!!root.WScript) {\n      localSetTimeout = function (fn, time) {\n        root.WScript.Sleep(time);\n        fn();\n      };\n    } else {\n      throw new NotSupportedError();\n    }\n\n    return {\n      setTimeout: localSetTimeout,\n      clearTimeout: localClearTimeout\n    };\n  }());\n  var localSetTimeout = localTimer.setTimeout,\n    localClearTimeout = localTimer.clearTimeout;\n\n  (function () {\n\n    var nextHandle = 1, tasksByHandle = {}, currentlyRunning = false;\n\n    clearMethod = function (handle) {\n      delete tasksByHandle[handle];\n    };\n\n    function runTask(handle) {\n      if (currentlyRunning) {\n        localSetTimeout(function () { runTask(handle); }, 0);\n      } else {\n        var task = tasksByHandle[handle];\n        if (task) {\n          currentlyRunning = true;\n          var result = tryCatch(task)();\n          clearMethod(handle);\n          currentlyRunning = false;\n          if (result === errorObj) { thrower(result.e); }\n        }\n      }\n    }\n\n    var reNative = new RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&\n      !reNative.test(setImmediate) && setImmediate;\n\n    function postMessageSupported () {\n      // Ensure not in a worker\n      if (!root.postMessage || root.importScripts) { return false; }\n      var isAsync = false, oldHandler = root.onmessage;\n      // Test for async\n      root.onmessage = function () { isAsync = true; };\n      root.postMessage('', '*');\n      root.onmessage = oldHandler;\n\n      return isAsync;\n    }\n\n    // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n    if (isFunction(setImmediate)) {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        setImmediate(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        process.nextTick(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (postMessageSupported()) {\n      var MSG_PREFIX = 'ms.rx.schedule' + Math.random();\n\n      var onGlobalPostMessage = function (event) {\n        // Only if we're a match to avoid any other global events\n        if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n          runTask(event.data.substring(MSG_PREFIX.length));\n        }\n      };\n\n      root.addEventListener('message', onGlobalPostMessage, false);\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        root.postMessage(MSG_PREFIX + id, '*');\n        return id;\n      };\n    } else if (!!root.MessageChannel) {\n      var channel = new root.MessageChannel();\n\n      channel.port1.onmessage = function (e) { runTask(e.data); };\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        channel.port2.postMessage(id);\n        return id;\n      };\n    } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {\n\n      scheduleMethod = function (action) {\n        var scriptElement = root.document.createElement('script');\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n\n        scriptElement.onreadystatechange = function () {\n          runTask(id);\n          scriptElement.onreadystatechange = null;\n          scriptElement.parentNode.removeChild(scriptElement);\n          scriptElement = null;\n        };\n        root.document.documentElement.appendChild(scriptElement);\n        return id;\n      };\n\n    } else {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        localSetTimeout(function () {\n          runTask(id);\n        }, 0);\n\n        return id;\n      };\n    }\n  }());\n\n  /**\n   * Gets a scheduler that schedules work via a timed callback based upon platform.\n   */\n   var DefaultScheduler = (function (__super__) {\n     inherits(DefaultScheduler, __super__);\n     function DefaultScheduler() {\n       __super__.call(this);\n     }\n\n     function scheduleAction(disposable, action, scheduler, state) {\n       return function schedule() {\n         disposable.setDisposable(Disposable._fixup(action(scheduler, state)));\n       };\n     }\n\n     function ClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     ClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         clearMethod(this._id);\n       }\n     };\n\n     function LocalClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     LocalClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         localClearTimeout(this._id);\n       }\n     };\n\n    DefaultScheduler.prototype.schedule = function (state, action) {\n      var disposable = new SingleAssignmentDisposable(),\n          id = scheduleMethod(scheduleAction(disposable, action, this, state));\n      return new BinaryDisposable(disposable, new ClearDisposable(id));\n    };\n\n    DefaultScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      if (dueTime === 0) { return this.schedule(state, action); }\n      var disposable = new SingleAssignmentDisposable(),\n          id = localSetTimeout(scheduleAction(disposable, action, this, state), dueTime);\n      return new BinaryDisposable(disposable, new LocalClearDisposable(id));\n    };\n\n    function scheduleLongRunning(state, action, disposable) {\n      return function () { action(state, disposable); };\n    }\n\n    DefaultScheduler.prototype.scheduleLongRunning = function (state, action) {\n      var disposable = disposableCreate(noop);\n      scheduleMethod(scheduleLongRunning(state, action, disposable));\n      return disposable;\n    };\n\n    return DefaultScheduler;\n  }(Scheduler));\n\n  var defaultScheduler = Scheduler['default'] = Scheduler.async = new DefaultScheduler();\n\n  function IndexedItem(id, value) {\n    this.id = id;\n    this.value = value;\n  }\n\n  IndexedItem.prototype.compareTo = function (other) {\n    var c = this.value.compareTo(other.value);\n    c === 0 && (c = this.id - other.id);\n    return c;\n  };\n\n  var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) {\n    this.items = new Array(capacity);\n    this.length = 0;\n  };\n\n  var priorityProto = PriorityQueue.prototype;\n  priorityProto.isHigherPriority = function (left, right) {\n    return this.items[left].compareTo(this.items[right]) < 0;\n  };\n\n  priorityProto.percolate = function (index) {\n    if (index >= this.length || index < 0) { return; }\n    var parent = index - 1 >> 1;\n    if (parent < 0 || parent === index) { return; }\n    if (this.isHigherPriority(index, parent)) {\n      var temp = this.items[index];\n      this.items[index] = this.items[parent];\n      this.items[parent] = temp;\n      this.percolate(parent);\n    }\n  };\n\n  priorityProto.heapify = function (index) {\n    +index || (index = 0);\n    if (index >= this.length || index < 0) { return; }\n    var left = 2 * index + 1,\n        right = 2 * index + 2,\n        first = index;\n    if (left < this.length && this.isHigherPriority(left, first)) {\n      first = left;\n    }\n    if (right < this.length && this.isHigherPriority(right, first)) {\n      first = right;\n    }\n    if (first !== index) {\n      var temp = this.items[index];\n      this.items[index] = this.items[first];\n      this.items[first] = temp;\n      this.heapify(first);\n    }\n  };\n\n  priorityProto.peek = function () { return this.items[0].value; };\n\n  priorityProto.removeAt = function (index) {\n    this.items[index] = this.items[--this.length];\n    this.items[this.length] = undefined;\n    this.heapify();\n  };\n\n  priorityProto.dequeue = function () {\n    var result = this.peek();\n    this.removeAt(0);\n    return result;\n  };\n\n  priorityProto.enqueue = function (item) {\n    var index = this.length++;\n    this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n    this.percolate(index);\n  };\n\n  priorityProto.remove = function (item) {\n    for (var i = 0; i < this.length; i++) {\n      if (this.items[i].value === item) {\n        this.removeAt(i);\n        return true;\n      }\n    }\n    return false;\n  };\n  PriorityQueue.count = 0;\n\n  /**\n   *  Represents a notification to an observer.\n   */\n  var Notification = Rx.Notification = (function () {\n    function Notification() {\n\n    }\n\n    Notification.prototype._accept = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    Notification.prototype._acceptObserver = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    /**\n     * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n     * @param {Function | Observer} observerOrOnNext Function to invoke for an OnNext notification or Observer to invoke the notification on..\n     * @param {Function} onError Function to invoke for an OnError notification.\n     * @param {Function} onCompleted Function to invoke for an OnCompleted notification.\n     * @returns {Any} Result produced by the observation.\n     */\n    Notification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n      return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n        this._acceptObserver(observerOrOnNext) :\n        this._accept(observerOrOnNext, onError, onCompleted);\n    };\n\n    /**\n     * Returns an observable sequence with a single notification.\n     *\n     * @memberOf Notifications\n     * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n     * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n     */\n    Notification.prototype.toObservable = function (scheduler) {\n      var self = this;\n      isScheduler(scheduler) || (scheduler = immediateScheduler);\n      return new AnonymousObservable(function (o) {\n        return scheduler.schedule(self, function (_, notification) {\n          notification._acceptObserver(o);\n          notification.kind === 'N' && o.onCompleted();\n        });\n      });\n    };\n\n    return Notification;\n  })();\n\n  var OnNextNotification = (function (__super__) {\n    inherits(OnNextNotification, __super__);\n    function OnNextNotification(value) {\n      this.value = value;\n      this.kind = 'N';\n    }\n\n    OnNextNotification.prototype._accept = function (onNext) {\n      return onNext(this.value);\n    };\n\n    OnNextNotification.prototype._acceptObserver = function (o) {\n      return o.onNext(this.value);\n    };\n\n    OnNextNotification.prototype.toString = function () {\n      return 'OnNext(' + this.value + ')';\n    };\n\n    return OnNextNotification;\n  }(Notification));\n\n  var OnErrorNotification = (function (__super__) {\n    inherits(OnErrorNotification, __super__);\n    function OnErrorNotification(error) {\n      this.error = error;\n      this.kind = 'E';\n    }\n\n    OnErrorNotification.prototype._accept = function (onNext, onError) {\n      return onError(this.error);\n    };\n\n    OnErrorNotification.prototype._acceptObserver = function (o) {\n      return o.onError(this.error);\n    };\n\n    OnErrorNotification.prototype.toString = function () {\n      return 'OnError(' + this.error + ')';\n    };\n\n    return OnErrorNotification;\n  }(Notification));\n\n  var OnCompletedNotification = (function (__super__) {\n    inherits(OnCompletedNotification, __super__);\n    function OnCompletedNotification() {\n      this.kind = 'C';\n    }\n\n    OnCompletedNotification.prototype._accept = function (onNext, onError, onCompleted) {\n      return onCompleted();\n    };\n\n    OnCompletedNotification.prototype._acceptObserver = function (o) {\n      return o.onCompleted();\n    };\n\n    OnCompletedNotification.prototype.toString = function () {\n      return 'OnCompleted()';\n    };\n\n    return OnCompletedNotification;\n  }(Notification));\n\n  /**\n   * Creates an object that represents an OnNext notification to an observer.\n   * @param {Any} value The value contained in the notification.\n   * @returns {Notification} The OnNext notification containing the value.\n   */\n  var notificationCreateOnNext = Notification.createOnNext = function (value) {\n    return new OnNextNotification(value);\n  };\n\n  /**\n   * Creates an object that represents an OnError notification to an observer.\n   * @param {Any} error The exception contained in the notification.\n   * @returns {Notification} The OnError notification containing the exception.\n   */\n  var notificationCreateOnError = Notification.createOnError = function (error) {\n    return new OnErrorNotification(error);\n  };\n\n  /**\n   * Creates an object that represents an OnCompleted notification to an observer.\n   * @returns {Notification} The OnCompleted notification.\n   */\n  var notificationCreateOnCompleted = Notification.createOnCompleted = function () {\n    return new OnCompletedNotification();\n  };\n\n  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n\n  /**\n   * Abstract base class for implementations of the Observer class.\n   * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n   */\n  var AbstractObserver = Rx.internals.AbstractObserver = (function (__super__) {\n    inherits(AbstractObserver, __super__);\n\n    /**\n     * Creates a new observer in a non-stopped state.\n     */\n    function AbstractObserver() {\n      this.isStopped = false;\n    }\n\n    // Must be implemented by other observers\n    AbstractObserver.prototype.next = notImplemented;\n    AbstractObserver.prototype.error = notImplemented;\n    AbstractObserver.prototype.completed = notImplemented;\n\n    /**\n     * Notifies the observer of a new element in the sequence.\n     * @param {Any} value Next element in the sequence.\n     */\n    AbstractObserver.prototype.onNext = function (value) {\n      !this.isStopped && this.next(value);\n    };\n\n    /**\n     * Notifies the observer that an exception has occurred.\n     * @param {Any} error The error that has occurred.\n     */\n    AbstractObserver.prototype.onError = function (error) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(error);\n      }\n    };\n\n    /**\n     * Notifies the observer of the end of the sequence.\n     */\n    AbstractObserver.prototype.onCompleted = function () {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.completed();\n      }\n    };\n\n    /**\n     * Disposes the observer, causing it to transition to the stopped state.\n     */\n    AbstractObserver.prototype.dispose = function () { this.isStopped = true; };\n\n    AbstractObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return AbstractObserver;\n  }(Observer));\n\n  /**\n   * Class to create an Observer instance from delegate-based implementations of the on* methods.\n   */\n  var AnonymousObserver = Rx.AnonymousObserver = (function (__super__) {\n    inherits(AnonymousObserver, __super__);\n\n    /**\n     * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n     * @param {Any} onNext Observer's OnNext action implementation.\n     * @param {Any} onError Observer's OnError action implementation.\n     * @param {Any} onCompleted Observer's OnCompleted action implementation.\n     */\n    function AnonymousObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    /**\n     * Calls the onNext action.\n     * @param {Any} value Next element in the sequence.\n     */\n    AnonymousObserver.prototype.next = function (value) {\n      this._onNext(value);\n    };\n\n    /**\n     * Calls the onError action.\n     * @param {Any} error The error that has occurred.\n     */\n    AnonymousObserver.prototype.error = function (error) {\n      this._onError(error);\n    };\n\n    /**\n     *  Calls the onCompleted action.\n     */\n    AnonymousObserver.prototype.completed = function () {\n      this._onCompleted();\n    };\n\n    return AnonymousObserver;\n  }(AbstractObserver));\n\n  var observableProto;\n\n  /**\n   * Represents a push-style collection.\n   */\n  var Observable = Rx.Observable = (function () {\n\n    function makeSubscribe(self, subscribe) {\n      return function (o) {\n        var oldOnError = o.onError;\n        o.onError = function (e) {\n          makeStackTraceLong(e, self);\n          oldOnError.call(o, e);\n        };\n\n        return subscribe.call(self, o);\n      };\n    }\n\n    function Observable() {\n      if (Rx.config.longStackSupport && hasStacks) {\n        var oldSubscribe = this._subscribe;\n        var e = tryCatch(thrower)(new Error()).e;\n        this.stack = e.stack.substring(e.stack.indexOf('\\n') + 1);\n        this._subscribe = makeSubscribe(this, oldSubscribe);\n      }\n    }\n\n    observableProto = Observable.prototype;\n\n    /**\n    * Determines whether the given object is an Observable\n    * @param {Any} An object to determine whether it is an Observable\n    * @returns {Boolean} true if an Observable, else false.\n    */\n    Observable.isObservable = function (o) {\n      return o && isFunction(o.subscribe);\n    };\n\n    /**\n     *  Subscribes an o to the observable sequence.\n     *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n     *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n     *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n     *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribe = observableProto.forEach = function (oOrOnNext, onError, onCompleted) {\n      return this._subscribe(typeof oOrOnNext === 'object' ?\n        oOrOnNext :\n        observerCreate(oOrOnNext, onError, onCompleted));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onNext The function to invoke on each element in the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnNext = function (onNext, thisArg) {\n      return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n    };\n\n    /**\n     * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n     * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnError = function (onError, thisArg) {\n      return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnCompleted = function (onCompleted, thisArg) {\n      return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n    };\n\n    return Observable;\n  })();\n\n  var ObservableBase = Rx.ObservableBase = (function (__super__) {\n    inherits(ObservableBase, __super__);\n\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.subscribeCore).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function ObservableBase() {\n      __super__.call(this);\n    }\n\n    ObservableBase.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    ObservableBase.prototype.subscribeCore = notImplemented;\n\n    return ObservableBase;\n  }(Observable));\n\nvar FlatMapObservable = Rx.FlatMapObservable = (function(__super__) {\n\n    inherits(FlatMapObservable, __super__);\n\n    function FlatMapObservable(source, selector, resultSelector, thisArg) {\n      this.resultSelector = isFunction(resultSelector) ? resultSelector : null;\n      this.selector = bindCallback(isFunction(selector) ? selector : function() { return selector; }, thisArg, 3);\n      this.source = source;\n      __super__.call(this);\n    }\n\n    FlatMapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this.resultSelector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(observer, selector, resultSelector, source) {\n      this.i = 0;\n      this.selector = selector;\n      this.resultSelector = resultSelector;\n      this.source = source;\n      this.o = observer;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype._wrapResult = function(result, x, i) {\n      return this.resultSelector ?\n        result.map(function(y, i2) { return this.resultSelector(x, y, i, i2); }, this) :\n        result;\n    };\n\n    InnerObserver.prototype.next = function(x) {\n      var i = this.i++;\n      var result = tryCatch(this.selector)(x, i, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = Observable.from(result));\n      this.o.onNext(this._wrapResult(result, x, i));\n    };\n\n    InnerObserver.prototype.error = function(e) { this.o.onError(e); };\n\n    InnerObserver.prototype.completed = function() { this.o.onCompleted(); };\n\n    return FlatMapObservable;\n\n}(ObservableBase));\n\n  var Enumerable = Rx.internals.Enumerable = function () { };\n\n  function IsDisposedDisposable(state) {\n    this._s = state;\n    this.isDisposed = false;\n  }\n\n  IsDisposedDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      this._s.isDisposed = true;\n    }\n  };\n\n  var ConcatEnumerableObservable = (function(__super__) {\n    inherits(ConcatEnumerableObservable, __super__);\n    function ConcatEnumerableObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    ConcatEnumerableObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        o: o,\n        subscription: subscription,\n        e: this.sources[$iterator$]()\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.o.onError(e); };\n    InnerObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return ConcatEnumerableObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.concat = function () {\n    return new ConcatEnumerableObservable(this);\n  };\n\n  var CatchErrorObservable = (function(__super__) {\n    function CatchErrorObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    inherits(CatchErrorObservable, __super__);\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.lastError !== null ? state.o.onError(state.lastError) : state.o.onCompleted(); }\n\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    CatchErrorObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        e: this.sources[$iterator$](),\n        subscription: subscription,\n        lastError: null,\n        o: o\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.lastError = e; this._recurse(this._state); };\n    InnerObserver.prototype.completed = function () { this._state.o.onCompleted(); };\n\n    return CatchErrorObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.catchError = function () {\n    return new CatchErrorObservable(this);\n  };\n\n  var RepeatEnumerable = (function (__super__) {\n    inherits(RepeatEnumerable, __super__);\n    function RepeatEnumerable(v, c) {\n      this.v = v;\n      this.c = c == null ? -1 : c;\n    }\n\n    RepeatEnumerable.prototype[$iterator$] = function () {\n      return new RepeatEnumerator(this);\n    };\n\n    function RepeatEnumerator(p) {\n      this.v = p.v;\n      this.l = p.c;\n    }\n\n    RepeatEnumerator.prototype.next = function () {\n      if (this.l === 0) { return doneEnumerator; }\n      if (this.l > 0) { this.l--; }\n      return { done: false, value: this.v };\n    };\n\n    return RepeatEnumerable;\n  }(Enumerable));\n\n  var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) {\n    return new RepeatEnumerable(value, repeatCount);\n  };\n\n  var OfEnumerable = (function(__super__) {\n    inherits(OfEnumerable, __super__);\n    function OfEnumerable(s, fn, thisArg) {\n      this.s = s;\n      this.fn = fn ? bindCallback(fn, thisArg, 3) : null;\n    }\n    OfEnumerable.prototype[$iterator$] = function () {\n      return new OfEnumerator(this);\n    };\n\n    function OfEnumerator(p) {\n      this.i = -1;\n      this.s = p.s;\n      this.l = this.s.length;\n      this.fn = p.fn;\n    }\n\n    OfEnumerator.prototype.next = function () {\n     return ++this.i < this.l ?\n       { done: false, value: !this.fn ? this.s[this.i] : this.fn(this.s[this.i], this.i, this.s) } :\n       doneEnumerator;\n    };\n\n    return OfEnumerable;\n  }(Enumerable));\n\n  var enumerableOf = Enumerable.of = function (source, selector, thisArg) {\n    return new OfEnumerable(source, selector, thisArg);\n  };\n\n  var ScheduledObserver = Rx.internals.ScheduledObserver = (function (__super__) {\n    inherits(ScheduledObserver, __super__);\n\n    function ScheduledObserver(scheduler, observer) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.observer = observer;\n      this.isAcquired = false;\n      this.hasFaulted = false;\n      this.queue = [];\n      this.disposable = new SerialDisposable();\n    }\n\n    function enqueueNext(observer, x) { return function () { observer.onNext(x); }; }\n    function enqueueError(observer, e) { return function () { observer.onError(e); }; }\n    function enqueueCompleted(observer) { return function () { observer.onCompleted(); }; }\n\n    ScheduledObserver.prototype.next = function (x) {\n      this.queue.push(enqueueNext(this.observer, x));\n    };\n\n    ScheduledObserver.prototype.error = function (e) {\n      this.queue.push(enqueueError(this.observer, e));\n    };\n\n    ScheduledObserver.prototype.completed = function () {\n      this.queue.push(enqueueCompleted(this.observer));\n    };\n\n\n    function scheduleMethod(state, recurse) {\n      var work;\n      if (state.queue.length > 0) {\n        work = state.queue.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var res = tryCatch(work)();\n      if (res === errorObj) {\n        state.queue = [];\n        state.hasFaulted = true;\n        return thrower(res.e);\n      }\n      recurse(state);\n    }\n\n    ScheduledObserver.prototype.ensureActive = function () {\n      var isOwner = false;\n      if (!this.hasFaulted && this.queue.length > 0) {\n        isOwner = !this.isAcquired;\n        this.isAcquired = true;\n      }\n      isOwner &&\n        this.disposable.setDisposable(this.scheduler.scheduleRecursive(this, scheduleMethod));\n    };\n\n    ScheduledObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.disposable.dispose();\n    };\n\n    return ScheduledObserver;\n  }(AbstractObserver));\n\n  var ToArrayObservable = (function(__super__) {\n    inherits(ToArrayObservable, __super__);\n    function ToArrayObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    ToArrayObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o) {\n      this.o = o;\n      this.a = [];\n      AbstractObserver.call(this);\n    }\n    \n    InnerObserver.prototype.next = function (x) { this.a.push(x); };\n    InnerObserver.prototype.error = function (e) { this.o.onError(e);  };\n    InnerObserver.prototype.completed = function () { this.o.onNext(this.a); this.o.onCompleted(); };\n\n    return ToArrayObservable;\n  }(ObservableBase));\n\n  /**\n  * Creates an array from an observable sequence.\n  * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n  */\n  observableProto.toArray = function () {\n    return new ToArrayObservable(this);\n  };\n\n  /**\n   *  Creates an observable sequence from a specified subscribe method implementation.\n   * @example\n   *  var res = Rx.Observable.create(function (observer) { return function () { } );\n   *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n   *  var res = Rx.Observable.create(function (observer) { } );\n   * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n   * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n   */\n  Observable.create = function (subscribe, parent) {\n    return new AnonymousObservable(subscribe, parent);\n  };\n\n  var Defer = (function(__super__) {\n    inherits(Defer, __super__);\n    function Defer(factory) {\n      this._f = factory;\n      __super__.call(this);\n    }\n\n    Defer.prototype.subscribeCore = function (o) {\n      var result = tryCatch(this._f)();\n      if (result === errorObj) { return observableThrow(result.e).subscribe(o);}\n      isPromise(result) && (result = observableFromPromise(result));\n      return result.subscribe(o);\n    };\n\n    return Defer;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n   *\n   * @example\n   *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n   * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n   * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n   */\n  var observableDefer = Observable.defer = function (observableFactory) {\n    return new Defer(observableFactory);\n  };\n\n  var EmptyObservable = (function(__super__) {\n    inherits(EmptyObservable, __super__);\n    function EmptyObservable(scheduler) {\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    EmptyObservable.prototype.subscribeCore = function (observer) {\n      var sink = new EmptySink(observer, this.scheduler);\n      return sink.run();\n    };\n\n    function EmptySink(observer, scheduler) {\n      this.observer = observer;\n      this.scheduler = scheduler;\n    }\n\n    function scheduleItem(s, state) {\n      state.onCompleted();\n      return disposableEmpty;\n    }\n\n    EmptySink.prototype.run = function () {\n      var state = this.observer;\n      return this.scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this.scheduler.schedule(state, scheduleItem);\n    };\n\n    return EmptyObservable;\n  }(ObservableBase));\n\n  var EMPTY_OBSERVABLE = new EmptyObservable(immediateScheduler);\n\n  /**\n   *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n   *\n   * @example\n   *  var res = Rx.Observable.empty();\n   *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n   * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n   * @returns {Observable} An observable sequence with no elements.\n   */\n  var observableEmpty = Observable.empty = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return scheduler === immediateScheduler ? EMPTY_OBSERVABLE : new EmptyObservable(scheduler);\n  };\n\n  var FromObservable = (function(__super__) {\n    inherits(FromObservable, __super__);\n    function FromObservable(iterable, fn, scheduler) {\n      this._iterable = iterable;\n      this._fn = fn;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function createScheduleMethod(o, it, fn) {\n      return function loopRecursive(i, recurse) {\n        var next = tryCatch(it.next).call(it);\n        if (next === errorObj) { return o.onError(next.e); }\n        if (next.done) { return o.onCompleted(); }\n\n        var result = next.value;\n\n        if (isFunction(fn)) {\n          result = tryCatch(fn)(result, i);\n          if (result === errorObj) { return o.onError(result.e); }\n        }\n\n        o.onNext(result);\n        recurse(i + 1);\n      };\n    }\n\n    FromObservable.prototype.subscribeCore = function (o) {\n      var list = Object(this._iterable),\n          it = getIterable(list);\n\n      return this._scheduler.scheduleRecursive(0, createScheduleMethod(o, it, this._fn));\n    };\n\n    return FromObservable;\n  }(ObservableBase));\n\n  var maxSafeInteger = Math.pow(2, 53) - 1;\n\n  function StringIterable(s) {\n    this._s = s;\n  }\n\n  StringIterable.prototype[$iterator$] = function () {\n    return new StringIterator(this._s);\n  };\n\n  function StringIterator(s) {\n    this._s = s;\n    this._l = s.length;\n    this._i = 0;\n  }\n\n  StringIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  StringIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._s.charAt(this._i++) } : doneEnumerator;\n  };\n\n  function ArrayIterable(a) {\n    this._a = a;\n  }\n\n  ArrayIterable.prototype[$iterator$] = function () {\n    return new ArrayIterator(this._a);\n  };\n\n  function ArrayIterator(a) {\n    this._a = a;\n    this._l = toLength(a);\n    this._i = 0;\n  }\n\n  ArrayIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  ArrayIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._a[this._i++] } : doneEnumerator;\n  };\n\n  function numberIsFinite(value) {\n    return typeof value === 'number' && root.isFinite(value);\n  }\n\n  function isNan(n) {\n    return n !== n;\n  }\n\n  function getIterable(o) {\n    var i = o[$iterator$], it;\n    if (!i && typeof o === 'string') {\n      it = new StringIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i && o.length !== undefined) {\n      it = new ArrayIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i) { throw new TypeError('Object is not iterable'); }\n    return o[$iterator$]();\n  }\n\n  function sign(value) {\n    var number = +value;\n    if (number === 0) { return number; }\n    if (isNaN(number)) { return number; }\n    return number < 0 ? -1 : 1;\n  }\n\n  function toLength(o) {\n    var len = +o.length;\n    if (isNaN(len)) { return 0; }\n    if (len === 0 || !numberIsFinite(len)) { return len; }\n    len = sign(len) * Math.floor(Math.abs(len));\n    if (len <= 0) { return 0; }\n    if (len > maxSafeInteger) { return maxSafeInteger; }\n    return len;\n  }\n\n  /**\n  * This method creates a new Observable sequence from an array-like or iterable object.\n  * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n  * @param {Function} [mapFn] Map function to call on every element of the array.\n  * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n  * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n  */\n  var observableFrom = Observable.from = function (iterable, mapFn, thisArg, scheduler) {\n    if (iterable == null) {\n      throw new Error('iterable cannot be null.')\n    }\n    if (mapFn && !isFunction(mapFn)) {\n      throw new Error('mapFn when provided must be a function');\n    }\n    if (mapFn) {\n      var mapper = bindCallback(mapFn, thisArg, 2);\n    }\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromObservable(iterable, mapper, scheduler);\n  }\n\n  var FromArrayObservable = (function(__super__) {\n    inherits(FromArrayObservable, __super__);\n    function FromArrayObservable(args, scheduler) {\n      this._args = args;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, args) {\n      var len = args.length;\n      return function loopRecursive (i, recurse) {\n        if (i < len) {\n          o.onNext(args[i]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    FromArrayObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._args));\n    };\n\n    return FromArrayObservable;\n  }(ObservableBase));\n\n  /**\n  *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n  * @deprecated use Observable.from or Observable.of\n  * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n  */\n  var observableFromArray = Observable.fromArray = function (array, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler)\n  };\n\n  var NeverObservable = (function(__super__) {\n    inherits(NeverObservable, __super__);\n    function NeverObservable() {\n      __super__.call(this);\n    }\n\n    NeverObservable.prototype.subscribeCore = function (observer) {\n      return disposableEmpty;\n    };\n\n    return NeverObservable;\n  }(ObservableBase));\n\n  var NEVER_OBSERVABLE = new NeverObservable();\n\n  /**\n   * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n   * @returns {Observable} An observable sequence whose observers will never get called.\n   */\n  var observableNever = Observable.never = function () {\n    return NEVER_OBSERVABLE;\n  };\n\n  function observableOf (scheduler, array) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler);\n  }\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.of = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return new FromArrayObservable(args, currentThreadScheduler);\n  };\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.ofWithScheduler = function (scheduler) {\n    var len = arguments.length, args = new Array(len - 1);\n    for(var i = 1; i < len; i++) { args[i - 1] = arguments[i]; }\n    return new FromArrayObservable(args, scheduler);\n  };\n\n  var PairsObservable = (function(__super__) {\n    inherits(PairsObservable, __super__);\n    function PairsObservable(o, scheduler) {\n      this._o = o;\n      this._keys = Object.keys(o);\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, obj, keys) {\n      return function loopRecursive(i, recurse) {\n        if (i < keys.length) {\n          var key = keys[i];\n          o.onNext([key, obj[key]]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    PairsObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._o, this._keys));\n    };\n\n    return PairsObservable;\n  }(ObservableBase));\n\n  /**\n   * Convert an object into an observable sequence of [key, value] pairs.\n   * @param {Object} obj The object to inspect.\n   * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n   * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n   */\n  Observable.pairs = function (obj, scheduler) {\n    scheduler || (scheduler = currentThreadScheduler);\n    return new PairsObservable(obj, scheduler);\n  };\n\n    var RangeObservable = (function(__super__) {\n    inherits(RangeObservable, __super__);\n    function RangeObservable(start, count, scheduler) {\n      this.start = start;\n      this.rangeCount = count;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function loopRecursive(start, count, o) {\n      return function loop (i, recurse) {\n        if (i < count) {\n          o.onNext(start + i);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    RangeObservable.prototype.subscribeCore = function (o) {\n      return this.scheduler.scheduleRecursive(\n        0,\n        loopRecursive(this.start, this.rangeCount, o)\n      );\n    };\n\n    return RangeObservable;\n  }(ObservableBase));\n\n  /**\n  *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n  * @param {Number} start The value of the first integer in the sequence.\n  * @param {Number} count The number of sequential integers to generate.\n  * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n  * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n  */\n  Observable.range = function (start, count, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RangeObservable(start, count, scheduler);\n  };\n\n  var RepeatObservable = (function(__super__) {\n    inherits(RepeatObservable, __super__);\n    function RepeatObservable(value, repeatCount, scheduler) {\n      this.value = value;\n      this.repeatCount = repeatCount == null ? -1 : repeatCount;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    RepeatObservable.prototype.subscribeCore = function (observer) {\n      var sink = new RepeatSink(observer, this);\n      return sink.run();\n    };\n\n    return RepeatObservable;\n  }(ObservableBase));\n\n  function RepeatSink(observer, parent) {\n    this.observer = observer;\n    this.parent = parent;\n  }\n\n  RepeatSink.prototype.run = function () {\n    var observer = this.observer, value = this.parent.value;\n    function loopRecursive(i, recurse) {\n      if (i === -1 || i > 0) {\n        observer.onNext(value);\n        i > 0 && i--;\n      }\n      if (i === 0) { return observer.onCompleted(); }\n      recurse(i);\n    }\n\n    return this.parent.scheduler.scheduleRecursive(this.parent.repeatCount, loopRecursive);\n  };\n\n  /**\n   *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n   * @param {Mixed} value Element to repeat.\n   * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n   * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n   */\n  Observable.repeat = function (value, repeatCount, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RepeatObservable(value, repeatCount, scheduler);\n  };\n\n  var JustObservable = (function(__super__) {\n    inherits(JustObservable, __super__);\n    function JustObservable(value, scheduler) {\n      this._value = value;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    JustObservable.prototype.subscribeCore = function (o) {\n      var state = [this._value, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var value = state[0], observer = state[1];\n      observer.onNext(value);\n      observer.onCompleted();\n      return disposableEmpty;\n    }\n\n    return JustObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n   *  There is an alias called 'just' or browsers <IE9.\n   * @param {Mixed} value Single element in the resulting observable sequence.\n   * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence containing the single specified element.\n   */\n  var observableReturn = Observable['return'] = Observable.just = function (value, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new JustObservable(value, scheduler);\n  };\n\n  var ThrowObservable = (function(__super__) {\n    inherits(ThrowObservable, __super__);\n    function ThrowObservable(error, scheduler) {\n      this._error = error;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    ThrowObservable.prototype.subscribeCore = function (o) {\n      var state = [this._error, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var e = state[0], o = state[1];\n      o.onError(e);\n      return disposableEmpty;\n    }\n\n    return ThrowObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n   *  There is an alias to this method called 'throwError' for browsers <IE9.\n   * @param {Mixed} error An object used for the sequence's termination.\n   * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n   */\n  var observableThrow = Observable['throw'] = function (error, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new ThrowObservable(error, scheduler);\n  };\n\n  var CatchObservable = (function (__super__) {\n    inherits(CatchObservable, __super__);\n    function CatchObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObservable.prototype.subscribeCore = function (o) {\n      var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();\n      subscription.setDisposable(d1);\n      d1.setDisposable(this.source.subscribe(new CatchObserver(o, subscription, this._fn)));\n      return subscription;\n    };\n\n    return CatchObservable;\n  }(ObservableBase));\n\n  var CatchObserver = (function(__super__) {\n    inherits(CatchObserver, __super__);\n    function CatchObserver(o, s, fn) {\n      this._o = o;\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObserver.prototype.next = function (x) { this._o.onNext(x); };\n    CatchObserver.prototype.completed = function () { return this._o.onCompleted(); };\n    CatchObserver.prototype.error = function (e) {\n      var result = tryCatch(this._fn)(e);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      isPromise(result) && (result = observableFromPromise(result));\n\n      var d = new SingleAssignmentDisposable();\n      this._s.setDisposable(d);\n      d.setDisposable(result.subscribe(this._o));\n    };\n\n    return CatchObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n   * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n   */\n  observableProto['catch'] = function (handlerOrSecond) {\n    return isFunction(handlerOrSecond) ? new CatchObservable(this, handlerOrSecond) : observableCatch([this, handlerOrSecond]);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n   * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n   */\n  var observableCatch = Observable['catch'] = function () {\n    var items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(len);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    return enumerableOf(items).catchError();\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   * This can be in the form of an argument list of observables or an array.\n   *\n   * @example\n   * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return combineLatest.apply(this, args);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var CombineLatestObservable = (function(__super__) {\n    inherits(CombineLatestObservable, __super__);\n    function CombineLatestObservable(params, cb) {\n      this._params = params;\n      this._cb = cb;\n      __super__.call(this);\n    }\n\n    CombineLatestObservable.prototype.subscribeCore = function(observer) {\n      var len = this._params.length,\n          subscriptions = new Array(len);\n\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        isDone: arrayInitialize(len, falseFactory),\n        values: new Array(len)\n      };\n\n      for (var i = 0; i < len; i++) {\n        var source = this._params[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new CombineLatestObserver(observer, i, this._cb, state)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return CombineLatestObservable;\n  }(ObservableBase));\n\n  var CombineLatestObserver = (function (__super__) {\n    inherits(CombineLatestObserver, __super__);\n    function CombineLatestObserver(o, i, cb, state) {\n      this._o = o;\n      this._i = i;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    CombineLatestObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      if (this._state.hasValueAll || (this._state.hasValueAll = this._state.hasValue.every(identity))) {\n        var res = tryCatch(this._cb).apply(null, this._state.values);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._state.isDone.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    CombineLatestObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    CombineLatestObserver.prototype.completed = function () {\n      this._state.isDone[this._i] = true;\n      this._state.isDone.every(identity) && this._o.onCompleted();\n    };\n\n    return CombineLatestObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n  *\n  * @example\n  * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n  * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n  * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n  */\n  var combineLatest = Observable.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n    return new CombineLatestObservable(args, resultSelector);\n  };\n\n  /**\n   * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  observableProto.concat = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    args.unshift(this);\n    return observableConcat.apply(null, args);\n  };\n\n  var ConcatObserver = (function(__super__) {\n    inherits(ConcatObserver, __super__);\n    function ConcatObserver(s, fn) {\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    ConcatObserver.prototype.next = function (x) { this._s.o.onNext(x); };\n    ConcatObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    ConcatObserver.prototype.completed = function () { this._s.i++; this._fn(this._s); };\n\n    return ConcatObserver;\n  }(AbstractObserver));\n\n  var ConcatObservable = (function(__super__) {\n    inherits(ConcatObservable, __super__);\n    function ConcatObservable(sources) {\n      this._sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive (state, recurse) {\n      if (state.disposable.isDisposed) { return; }\n      if (state.i === state.sources.length) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = state.sources[state.i];\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new ConcatObserver(state, recurse)));\n    }\n\n    ConcatObservable.prototype.subscribeCore = function(o) {\n      var subscription = new SerialDisposable();\n      var disposable = disposableCreate(noop);\n      var state = {\n        o: o,\n        i: 0,\n        subscription: subscription,\n        disposable: disposable,\n        sources: this._sources\n      };\n\n      var cancelable = immediateScheduler.scheduleRecursive(state, scheduleRecursive);\n      return new NAryDisposable([subscription, disposable, cancelable]);\n    };\n\n    return ConcatObservable;\n  }(ObservableBase));\n\n  /**\n   * Concatenates all the observable sequences.\n   * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  var observableConcat = Observable.concat = function () {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      args = new Array(arguments.length);\n      for(var i = 0, len = arguments.length; i < len; i++) { args[i] = arguments[i]; }\n    }\n    return new ConcatObservable(args);\n  };\n\n  /**\n   * Concatenates an observable sequence of observable sequences.\n   * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n   */\n  observableProto.concatAll = function () {\n    return this.merge(1);\n  };\n\n  var MergeObservable = (function (__super__) {\n    inherits(MergeObservable, __super__);\n\n    function MergeObservable(source, maxConcurrent) {\n      this.source = source;\n      this.maxConcurrent = maxConcurrent;\n      __super__.call(this);\n    }\n\n    MergeObservable.prototype.subscribeCore = function(observer) {\n      var g = new CompositeDisposable();\n      g.add(this.source.subscribe(new MergeObserver(observer, this.maxConcurrent, g)));\n      return g;\n    };\n\n    return MergeObservable;\n\n  }(ObservableBase));\n\n  var MergeObserver = (function (__super__) {\n    function MergeObserver(o, max, g) {\n      this.o = o;\n      this.max = max;\n      this.g = g;\n      this.done = false;\n      this.q = [];\n      this.activeCount = 0;\n      __super__.call(this);\n    }\n\n    inherits(MergeObserver, __super__);\n\n    MergeObserver.prototype.handleSubscribe = function (xs) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(xs) && (xs = observableFromPromise(xs));\n      sad.setDisposable(xs.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeObserver.prototype.next = function (innerSource) {\n      if(this.activeCount < this.max) {\n        this.activeCount++;\n        this.handleSubscribe(innerSource);\n      } else {\n        this.q.push(innerSource);\n      }\n    };\n    MergeObserver.prototype.error = function (e) { this.o.onError(e); };\n    MergeObserver.prototype.completed = function () { this.done = true; this.activeCount === 0 && this.o.onCompleted(); };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) { this.parent.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this.parent.o.onError(e); };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      if (this.parent.q.length > 0) {\n        this.parent.handleSubscribe(this.parent.q.shift());\n      } else {\n        this.parent.activeCount--;\n        this.parent.done && this.parent.activeCount === 0 && this.parent.o.onCompleted();\n      }\n    };\n\n    return MergeObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n  * Or merges two observable sequences into a single observable sequence.\n  * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.merge = function (maxConcurrentOrOther) {\n    return typeof maxConcurrentOrOther !== 'number' ?\n      observableMerge(this, maxConcurrentOrOther) :\n      new MergeObservable(this, maxConcurrentOrOther);\n  };\n\n  /**\n   * Merges all the observable sequences into a single observable sequence.\n   * The scheduler is optional and if not specified, the immediate scheduler is used.\n   * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n   */\n  var observableMerge = Observable.merge = function () {\n    var scheduler, sources = [], i, len = arguments.length;\n    if (!arguments[0]) {\n      scheduler = immediateScheduler;\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else if (isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else {\n      scheduler = immediateScheduler;\n      for(i = 0; i < len; i++) { sources.push(arguments[i]); }\n    }\n    if (Array.isArray(sources[0])) {\n      sources = sources[0];\n    }\n    return observableOf(scheduler, sources).mergeAll();\n  };\n\n  var MergeAllObservable = (function (__super__) {\n    inherits(MergeAllObservable, __super__);\n\n    function MergeAllObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeAllObservable.prototype.subscribeCore = function (o) {\n      var g = new CompositeDisposable(), m = new SingleAssignmentDisposable();\n      g.add(m);\n      m.setDisposable(this.source.subscribe(new MergeAllObserver(o, g)));\n      return g;\n    };\n\n    return MergeAllObservable;\n  }(ObservableBase));\n\n  var MergeAllObserver = (function (__super__) {\n    function MergeAllObserver(o, g) {\n      this.o = o;\n      this.g = g;\n      this.done = false;\n      __super__.call(this);\n    }\n\n    inherits(MergeAllObserver, __super__);\n\n    MergeAllObserver.prototype.next = function(innerSource) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      sad.setDisposable(innerSource.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeAllObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    MergeAllObserver.prototype.completed = function () {\n      this.done = true;\n      this.g.length === 1 && this.o.onCompleted();\n    };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) {\n      this.parent.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function (e) {\n      this.parent.o.onError(e);\n    };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      this.parent.done && this.parent.g.length === 1 && this.parent.o.onCompleted();\n    };\n\n    return MergeAllObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.mergeAll = function () {\n    return new MergeAllObservable(this);\n  };\n\n  var CompositeError = Rx.CompositeError = function(errors) {\n    this.innerErrors = errors;\n    this.message = 'This contains multiple errors. Check the innerErrors';\n    Error.call(this);\n  };\n  CompositeError.prototype = Object.create(Error.prototype);\n  CompositeError.prototype.name = 'CompositeError';\n\n  var MergeDelayErrorObservable = (function(__super__) {\n    inherits(MergeDelayErrorObservable, __super__);\n    function MergeDelayErrorObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeDelayErrorObservable.prototype.subscribeCore = function (o) {\n      var group = new CompositeDisposable(),\n        m = new SingleAssignmentDisposable(),\n        state = { isStopped: false, errors: [], o: o };\n\n      group.add(m);\n      m.setDisposable(this.source.subscribe(new MergeDelayErrorObserver(group, state)));\n\n      return group;\n    };\n\n    return MergeDelayErrorObservable;\n  }(ObservableBase));\n\n  var MergeDelayErrorObserver = (function(__super__) {\n    inherits(MergeDelayErrorObserver, __super__);\n    function MergeDelayErrorObserver(group, state) {\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function setCompletion(o, errors) {\n      if (errors.length === 0) {\n        o.onCompleted();\n      } else if (errors.length === 1) {\n        o.onError(errors[0]);\n      } else {\n        o.onError(new CompositeError(errors));\n      }\n    }\n\n    MergeDelayErrorObserver.prototype.next = function (x) {\n      var inner = new SingleAssignmentDisposable();\n      this._group.add(inner);\n\n      // Check for promises support\n      isPromise(x) && (x = observableFromPromise(x));\n      inner.setDisposable(x.subscribe(new InnerObserver(inner, this._group, this._state)));\n    };\n\n    MergeDelayErrorObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    MergeDelayErrorObserver.prototype.completed = function () {\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    inherits(InnerObserver, __super__);\n    function InnerObserver(inner, group, state) {\n      this._inner = inner;\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n    InnerObserver.prototype.completed = function () {\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    return MergeDelayErrorObserver;\n  }(AbstractObserver));\n\n  /**\n  * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n  * receive all successfully emitted items from all of the source Observables without being interrupted by\n  * an error notification from one of them.\n  *\n  * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n  * error via the Observer's onError, mergeDelayError will refrain from propagating that\n  * error notification until all of the merged Observables have finished emitting items.\n  * @param {Array | Arguments} args Arguments or an array to merge.\n  * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n  */\n  Observable.mergeDelayError = function() {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      var len = arguments.length;\n      args = new Array(len);\n      for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    var source = observableOf(null, args);\n    return new MergeDelayErrorObservable(source);\n  };\n\n  var SkipUntilObservable = (function(__super__) {\n    inherits(SkipUntilObservable, __super__);\n\n    function SkipUntilObservable(source, other) {\n      this._s = source;\n      this._o = isPromise(other) ? observableFromPromise(other) : other;\n      this._open = false;\n      __super__.call(this);\n    }\n\n    SkipUntilObservable.prototype.subscribeCore = function(o) {\n      var leftSubscription = new SingleAssignmentDisposable();\n      leftSubscription.setDisposable(this._s.subscribe(new SkipUntilSourceObserver(o, this)));\n\n      isPromise(this._o) && (this._o = observableFromPromise(this._o));\n\n      var rightSubscription = new SingleAssignmentDisposable();\n      rightSubscription.setDisposable(this._o.subscribe(new SkipUntilOtherObserver(o, this, rightSubscription)));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    };\n\n    return SkipUntilObservable;\n  }(ObservableBase));\n\n  var SkipUntilSourceObserver = (function(__super__) {\n    inherits(SkipUntilSourceObserver, __super__);\n    function SkipUntilSourceObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipUntilSourceObserver.prototype.next = function (x) {\n      this._p._open && this._o.onNext(x);\n    };\n\n    SkipUntilSourceObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilSourceObserver.prototype.onCompleted = function () {\n      this._p._open && this._o.onCompleted();\n    };\n\n    return SkipUntilSourceObserver;\n  }(AbstractObserver));\n\n  var SkipUntilOtherObserver = (function(__super__) {\n    inherits(SkipUntilOtherObserver, __super__);\n    function SkipUntilOtherObserver(o, p, r) {\n      this._o = o;\n      this._p = p;\n      this._r = r;\n      __super__.call(this);\n    }\n\n    SkipUntilOtherObserver.prototype.next = function () {\n      this._p._open = true;\n      this._r.dispose();\n    };\n\n    SkipUntilOtherObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilOtherObserver.prototype.onCompleted = function () {\n      this._r.dispose();\n    };\n\n    return SkipUntilOtherObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n   * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n   */\n  observableProto.skipUntil = function (other) {\n    return new SkipUntilObservable(this, other);\n  };\n\n  var SwitchObservable = (function(__super__) {\n    inherits(SwitchObservable, __super__);\n    function SwitchObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    SwitchObservable.prototype.subscribeCore = function (o) {\n      var inner = new SerialDisposable(), s = this.source.subscribe(new SwitchObserver(o, inner));\n      return new BinaryDisposable(s, inner);\n    };\n\n    inherits(SwitchObserver, AbstractObserver);\n    function SwitchObserver(o, inner) {\n      this.o = o;\n      this.inner = inner;\n      this.stopped = false;\n      this.latest = 0;\n      this.hasLatest = false;\n      AbstractObserver.call(this);\n    }\n\n    SwitchObserver.prototype.next = function (innerSource) {\n      var d = new SingleAssignmentDisposable(), id = ++this.latest;\n      this.hasLatest = true;\n      this.inner.setDisposable(d);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      d.setDisposable(innerSource.subscribe(new InnerObserver(this, id)));\n    };\n\n    SwitchObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    SwitchObserver.prototype.completed = function () {\n      this.stopped = true;\n      !this.hasLatest && this.o.onCompleted();\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(parent, id) {\n      this.parent = parent;\n      this.id = id;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function (x) {\n      this.parent.latest === this.id && this.parent.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.parent.latest === this.id && this.parent.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      if (this.parent.latest === this.id) {\n        this.parent.hasLatest = false;\n        this.parent.stopped && this.parent.o.onCompleted();\n      }\n    };\n\n    return SwitchObservable;\n  }(ObservableBase));\n\n  /**\n  * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n  * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n  */\n  observableProto['switch'] = observableProto.switchLatest = function () {\n    return new SwitchObservable(this);\n  };\n\n  var TakeUntilObservable = (function(__super__) {\n    inherits(TakeUntilObservable, __super__);\n\n    function TakeUntilObservable(source, other) {\n      this.source = source;\n      this.other = isPromise(other) ? observableFromPromise(other) : other;\n      __super__.call(this);\n    }\n\n    TakeUntilObservable.prototype.subscribeCore = function(o) {\n      return new BinaryDisposable(\n        this.source.subscribe(o),\n        this.other.subscribe(new TakeUntilObserver(o))\n      );\n    };\n\n    return TakeUntilObservable;\n  }(ObservableBase));\n\n  var TakeUntilObserver = (function(__super__) {\n    inherits(TakeUntilObserver, __super__);\n    function TakeUntilObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    TakeUntilObserver.prototype.next = function () {\n      this._o.onCompleted();\n    };\n\n    TakeUntilObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    TakeUntilObserver.prototype.onCompleted = noop;\n\n    return TakeUntilObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence until the other observable sequence produces a value.\n   * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n   */\n  observableProto.takeUntil = function (other) {\n    return new TakeUntilObservable(this, other);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var WithLatestFromObservable = (function(__super__) {\n    inherits(WithLatestFromObservable, __super__);\n    function WithLatestFromObservable(source, sources, resultSelector) {\n      this._s = source;\n      this._ss = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    WithLatestFromObservable.prototype.subscribeCore = function (o) {\n      var len = this._ss.length;\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        values: new Array(len)\n      };\n\n      var n = this._ss.length, subscriptions = new Array(n + 1);\n      for (var i = 0; i < n; i++) {\n        var other = this._ss[i], sad = new SingleAssignmentDisposable();\n        isPromise(other) && (other = observableFromPromise(other));\n        sad.setDisposable(other.subscribe(new WithLatestFromOtherObserver(o, i, state)));\n        subscriptions[i] = sad;\n      }\n\n      var outerSad = new SingleAssignmentDisposable();\n      outerSad.setDisposable(this._s.subscribe(new WithLatestFromSourceObserver(o, this._cb, state)));\n      subscriptions[n] = outerSad;\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return WithLatestFromObservable;\n  }(ObservableBase));\n\n  var WithLatestFromOtherObserver = (function (__super__) {\n    inherits(WithLatestFromOtherObserver, __super__);\n    function WithLatestFromOtherObserver(o, i, state) {\n      this._o = o;\n      this._i = i;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromOtherObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      this._state.hasValueAll = this._state.hasValue.every(identity);\n    };\n\n    WithLatestFromOtherObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromOtherObserver.prototype.completed = noop;\n\n    return WithLatestFromOtherObserver;\n  }(AbstractObserver));\n\n  var WithLatestFromSourceObserver = (function (__super__) {\n    inherits(WithLatestFromSourceObserver, __super__);\n    function WithLatestFromSourceObserver(o, cb, state) {\n      this._o = o;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromSourceObserver.prototype.next = function (x) {\n      var allValues = [x].concat(this._state.values);\n      if (!this._state.hasValueAll) { return; }\n      var res = tryCatch(this._cb).apply(null, allValues);\n      if (res === errorObj) { return this._o.onError(res.e); }\n      this._o.onNext(res);\n    };\n\n    WithLatestFromSourceObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromSourceObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return WithLatestFromSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.withLatestFrom = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    return new WithLatestFromObservable(this, args, resultSelector);\n  };\n\n  function falseFactory() { return false; }\n  function emptyArrayFactory() { return []; }\n\n  var ZipObservable = (function(__super__) {\n    inherits(ZipObservable, __super__);\n    function ZipObservable(sources, resultSelector) {\n      this._s = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    ZipObservable.prototype.subscribeCore = function(observer) {\n      var n = this._s.length,\n          subscriptions = new Array(n),\n          done = arrayInitialize(n, falseFactory),\n          q = arrayInitialize(n, emptyArrayFactory);\n\n      for (var i = 0; i < n; i++) {\n        var source = this._s[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new ZipObserver(observer, i, this, q, done)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return ZipObservable;\n  }(ObservableBase));\n\n  var ZipObserver = (function (__super__) {\n    inherits(ZipObserver, __super__);\n    function ZipObserver(o, i, p, q, d) {\n      this._o = o;\n      this._i = i;\n      this._p = p;\n      this._q = q;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    function notEmpty(x) { return x.length > 0; }\n    function shiftEach(x) { return x.shift(); }\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    ZipObserver.prototype.next = function (x) {\n      this._q[this._i].push(x);\n      if (this._q.every(notEmpty)) {\n        var queuedValues = this._q.map(shiftEach);\n        var res = tryCatch(this._p._cb).apply(null, queuedValues);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._d.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    ZipObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ZipObserver.prototype.completed = function () {\n      this._d[this._i] = true;\n      this._d.every(identity) && this._o.onCompleted();\n    };\n\n    return ZipObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n   * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n   */\n  observableProto.zip = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    var parent = this;\n    args.unshift(parent);\n\n    return new ZipObservable(args, resultSelector);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n   * @param arguments Observable sources.\n   * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  Observable.zip = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args = isFunction(args[1]) ? args[0].concat(args[1]) : args[0];\n    }\n    var first = args.shift();\n    return first.zip.apply(first, args);\n  };\n\nfunction falseFactory() { return false; }\nfunction emptyArrayFactory() { return []; }\nfunction argumentsToArray() {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return args;\n}\n\nvar ZipIterableObservable = (function(__super__) {\n  inherits(ZipIterableObservable, __super__);\n  function ZipIterableObservable(sources, cb) {\n    this.sources = sources;\n    this._cb = cb;\n    __super__.call(this);\n  }\n\n  ZipIterableObservable.prototype.subscribeCore = function (o) {\n    var sources = this.sources, len = sources.length, subscriptions = new Array(len);\n\n    var state = {\n      q: arrayInitialize(len, emptyArrayFactory),\n      done: arrayInitialize(len, falseFactory),\n      cb: this._cb,\n      o: o\n    };\n\n    for (var i = 0; i < len; i++) {\n      (function (i) {\n        var source = sources[i], sad = new SingleAssignmentDisposable();\n        (isArrayLike(source) || isIterable(source)) && (source = observableFrom(source));\n\n        subscriptions[i] = sad;\n        sad.setDisposable(source.subscribe(new ZipIterableObserver(state, i)));\n      }(i));\n    }\n\n    return new NAryDisposable(subscriptions);\n  };\n\n  return ZipIterableObservable;\n}(ObservableBase));\n\nvar ZipIterableObserver = (function (__super__) {\n  inherits(ZipIterableObserver, __super__);\n  function ZipIterableObserver(s, i) {\n    this._s = s;\n    this._i = i;\n    __super__.call(this);\n  }\n\n  function notEmpty(x) { return x.length > 0; }\n  function shiftEach(x) { return x.shift(); }\n  function notTheSame(i) {\n    return function (x, j) {\n      return j !== i;\n    };\n  }\n\n  ZipIterableObserver.prototype.next = function (x) {\n    this._s.q[this._i].push(x);\n    if (this._s.q.every(notEmpty)) {\n      var queuedValues = this._s.q.map(shiftEach),\n          res = tryCatch(this._s.cb).apply(null, queuedValues);\n      if (res === errorObj) { return this._s.o.onError(res.e); }\n      this._s.o.onNext(res);\n    } else if (this._s.done.filter(notTheSame(this._i)).every(identity)) {\n      this._s.o.onCompleted();\n    }\n  };\n\n  ZipIterableObserver.prototype.error = function (e) { this._s.o.onError(e); };\n\n  ZipIterableObserver.prototype.completed = function () {\n    this._s.done[this._i] = true;\n    this._s.done.every(identity) && this._s.o.onCompleted();\n  };\n\n  return ZipIterableObserver;\n}(AbstractObserver));\n\n/**\n * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n */\nobservableProto.zipIterable = function () {\n  if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n\n  var parent = this;\n  args.unshift(parent);\n  return new ZipIterableObservable(args, resultSelector);\n};\n\n  function asObservable(source) {\n    return function subscribe(o) { return source.subscribe(o); };\n  }\n\n  /**\n   *  Hides the identity of an observable sequence.\n   * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n   */\n  observableProto.asObservable = function () {\n    return new AnonymousObservable(asObservable(this), this);\n  };\n\n  var DematerializeObservable = (function (__super__) {\n    inherits(DematerializeObservable, __super__);\n    function DematerializeObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    DematerializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DematerializeObserver(o));\n    };\n\n    return DematerializeObservable;\n  }(ObservableBase));\n\n  var DematerializeObserver = (function (__super__) {\n    inherits(DematerializeObserver, __super__);\n\n    function DematerializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    DematerializeObserver.prototype.next = function (x) { x.accept(this._o); };\n    DematerializeObserver.prototype.error = function (e) { this._o.onError(e); };\n    DematerializeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DematerializeObserver;\n  }(AbstractObserver));\n\n  /**\n   * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n   * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n   */\n  observableProto.dematerialize = function () {\n    return new DematerializeObservable(this);\n  };\n\n  var DistinctUntilChangedObservable = (function(__super__) {\n    inherits(DistinctUntilChangedObservable, __super__);\n    function DistinctUntilChangedObservable(source, keyFn, comparer) {\n      this.source = source;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctUntilChangedObserver(o, this.keyFn, this.comparer));\n    };\n\n    return DistinctUntilChangedObservable;\n  }(ObservableBase));\n\n  var DistinctUntilChangedObserver = (function(__super__) {\n    inherits(DistinctUntilChangedObserver, __super__);\n    function DistinctUntilChangedObserver(o, keyFn, comparer) {\n      this.o = o;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      this.hasCurrentKey = false;\n      this.currentKey = null;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObserver.prototype.next = function (x) {\n      var key = x, comparerEquals;\n      if (isFunction(this.keyFn)) {\n        key = tryCatch(this.keyFn)(x);\n        if (key === errorObj) { return this.o.onError(key.e); }\n      }\n      if (this.hasCurrentKey) {\n        comparerEquals = tryCatch(this.comparer)(this.currentKey, key);\n        if (comparerEquals === errorObj) { return this.o.onError(comparerEquals.e); }\n      }\n      if (!this.hasCurrentKey || !comparerEquals) {\n        this.hasCurrentKey = true;\n        this.currentKey = key;\n        this.o.onNext(x);\n      }\n    };\n    DistinctUntilChangedObserver.prototype.error = function(e) {\n      this.o.onError(e);\n    };\n    DistinctUntilChangedObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return DistinctUntilChangedObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Returns an observable sequence that contains only distinct contiguous elements according to the keyFn and the comparer.\n  * @param {Function} [keyFn] A function to compute the comparison key for each element. If not provided, it projects the value.\n  * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n  * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n  */\n  observableProto.distinctUntilChanged = function (keyFn, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctUntilChangedObservable(this, keyFn, comparer);\n  };\n\n  var TapObservable = (function(__super__) {\n    inherits(TapObservable,__super__);\n    function TapObservable(source, observerOrOnNext, onError, onCompleted) {\n      this.source = source;\n      this._oN = observerOrOnNext;\n      this._oE = onError;\n      this._oC = onCompleted;\n      __super__.call(this);\n    }\n\n    TapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, p) {\n      this.o = o;\n      this.t = !p._oN || isFunction(p._oN) ?\n        observerCreate(p._oN || noop, p._oE || noop, p._oC || noop) :\n        p._oN;\n      this.isStopped = false;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function(x) {\n      var res = tryCatch(this.t.onNext).call(this.t, x);\n      if (res === errorObj) { this.o.onError(res.e); }\n      this.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function(err) {\n      var res = tryCatch(this.t.onError).call(this.t, err);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onError(err);\n    };\n    InnerObserver.prototype.completed = function() {\n      var res = tryCatch(this.t.onCompleted).call(this.t);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onCompleted();\n    };\n\n    return TapObservable;\n  }(ObservableBase));\n\n  /**\n  *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an o.\n  * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto['do'] = observableProto.tap = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) {\n    return new TapObservable(this, observerOrOnNext, onError, onCompleted);\n  };\n\n  /**\n  *  Invokes an action for each element in the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onNext Action to invoke for each element in the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnNext = observableProto.tapOnNext = function (onNext, thisArg) {\n    return this.tap(typeof thisArg !== 'undefined' ? function (x) { onNext.call(thisArg, x); } : onNext);\n  };\n\n  /**\n  *  Invokes an action upon exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnError = observableProto.tapOnError = function (onError, thisArg) {\n    return this.tap(noop, typeof thisArg !== 'undefined' ? function (e) { onError.call(thisArg, e); } : onError);\n  };\n\n  /**\n  *  Invokes an action upon graceful termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnCompleted = observableProto.tapOnCompleted = function (onCompleted, thisArg) {\n    return this.tap(noop, null, typeof thisArg !== 'undefined' ? function () { onCompleted.call(thisArg); } : onCompleted);\n  };\n\n  var FinallyObservable = (function (__super__) {\n    inherits(FinallyObservable, __super__);\n    function FinallyObservable(source, fn, thisArg) {\n      this.source = source;\n      this._fn = bindCallback(fn, thisArg, 0);\n      __super__.call(this);\n    }\n\n    FinallyObservable.prototype.subscribeCore = function (o) {\n      var d = tryCatch(this.source.subscribe).call(this.source, o);\n      if (d === errorObj) {\n        this._fn();\n        thrower(d.e);\n      }\n\n      return new FinallyDisposable(d, this._fn);\n    };\n\n    function FinallyDisposable(s, fn) {\n      this.isDisposed = false;\n      this._s = s;\n      this._fn = fn;\n    }\n    FinallyDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        var res = tryCatch(this._s.dispose).call(this._s);\n        this._fn();\n        res === errorObj && thrower(res.e);\n      }\n    };\n\n    return FinallyObservable;\n\n  }(ObservableBase));\n\n  /**\n   *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n   * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n   * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n   */\n  observableProto['finally'] = function (action, thisArg) {\n    return new FinallyObservable(this, action, thisArg);\n  };\n\n  var IgnoreElementsObservable = (function(__super__) {\n    inherits(IgnoreElementsObservable, __super__);\n\n    function IgnoreElementsObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    IgnoreElementsObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    function InnerObserver(o) {\n      this.o = o;\n      this.isStopped = false;\n    }\n    InnerObserver.prototype.onNext = noop;\n    InnerObserver.prototype.onError = function (err) {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onError(err);\n      }\n    };\n    InnerObserver.prototype.onCompleted = function () {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onCompleted();\n      }\n    };\n    InnerObserver.prototype.dispose = function() { this.isStopped = true; };\n    InnerObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.observer.onError(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return IgnoreElementsObservable;\n  }(ObservableBase));\n\n  /**\n   *  Ignores all elements in an observable sequence leaving only the termination messages.\n   * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n   */\n  observableProto.ignoreElements = function () {\n    return new IgnoreElementsObservable(this);\n  };\n\n  var MaterializeObservable = (function (__super__) {\n    inherits(MaterializeObservable, __super__);\n    function MaterializeObservable(source, fn) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MaterializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new MaterializeObserver(o));\n    };\n\n    return MaterializeObservable;\n  }(ObservableBase));\n\n  var MaterializeObserver = (function (__super__) {\n    inherits(MaterializeObserver, __super__);\n\n    function MaterializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    MaterializeObserver.prototype.next = function (x) { this._o.onNext(notificationCreateOnNext(x)) };\n    MaterializeObserver.prototype.error = function (e) { this._o.onNext(notificationCreateOnError(e)); this._o.onCompleted(); };\n    MaterializeObserver.prototype.completed = function () { this._o.onNext(notificationCreateOnCompleted()); this._o.onCompleted(); };\n\n    return MaterializeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n   * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n   */\n  observableProto.materialize = function () {\n    return new MaterializeObservable(this);\n  };\n\n  /**\n   *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n   * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n   * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n   */\n  observableProto.repeat = function (repeatCount) {\n    return enumerableRepeat(this, repeatCount).concat();\n  };\n\n  /**\n   *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n   *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n   *\n   * @example\n   *  var res = retried = retry.repeat();\n   *  var res = retried = retry.repeat(2);\n   * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retry = function (retryCount) {\n    return enumerableRepeat(this, retryCount).catchError();\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RetryWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RetryWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RetryWhenObservable, __super__);\n\n    RetryWhenObservable.prototype.subscribeCore = function (o) {\n      var exceptions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(exceptions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            exceptions.onNext(exn);\n            outer.dispose();\n          },\n          function() { o.onCompleted(); }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RetryWhenObservable;\n  }(ObservableBase));\n\n  observableProto.retryWhen = function (notifier) {\n    return new RetryWhenObservable(repeat(this), notifier);\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RepeatWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RepeatWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RepeatWhenObservable, __super__);\n\n    RepeatWhenObservable.prototype.subscribeCore = function (o) {\n      var completions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(completions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) { o.onError(exn); },\n          function() {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            completions.onNext(null);\n            outer.dispose();\n          }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RepeatWhenObservable;\n  }(ObservableBase));\n\n  observableProto.repeatWhen = function (notifier) {\n    return new RepeatWhenObservable(repeat(this), notifier);\n  };\n\n  var ScanObservable = (function(__super__) {\n    inherits(ScanObservable, __super__);\n    function ScanObservable(source, accumulator, hasSeed, seed) {\n      this.source = source;\n      this.accumulator = accumulator;\n      this.hasSeed = hasSeed;\n      this.seed = seed;\n      __super__.call(this);\n    }\n\n    ScanObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new ScanObserver(o,this));\n    };\n\n    return ScanObservable;\n  }(ObservableBase));\n\n  var ScanObserver = (function (__super__) {\n    inherits(ScanObserver, __super__);\n    function ScanObserver(o, parent) {\n      this._o = o;\n      this._p = parent;\n      this._fn = parent.accumulator;\n      this._hs = parent.hasSeed;\n      this._s = parent.seed;\n      this._ha = false;\n      this._a = null;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    ScanObserver.prototype.next = function (x) {\n      !this._hv && (this._hv = true);\n      if (this._ha) {\n        this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n      } else {\n        this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n        this._ha = true;\n      }\n      if (this._a === errorObj) { return this._o.onError(this._a.e); }\n      this._o.onNext(this._a);\n      this._i++;\n    };\n\n    ScanObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ScanObserver.prototype.completed = function () {\n      !this._hv && this._hs && this._o.onNext(this._s);\n      this._o.onCompleted();\n    };\n\n    return ScanObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n  *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n  * @param {Mixed} [seed] The initial accumulator value.\n  * @param {Function} accumulator An accumulator function to be invoked on each element.\n  * @returns {Observable} An observable sequence containing the accumulated values.\n  */\n  observableProto.scan = function () {\n    var hasSeed = false, seed, accumulator = arguments[0];\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new ScanObservable(this, accumulator, hasSeed, seed);\n  };\n\n  var SkipLastObservable = (function (__super__) {\n    inherits(SkipLastObservable, __super__);\n    function SkipLastObservable(source, c) {\n      this.source = source;\n      this._c = c;\n      __super__.call(this);\n    }\n\n    SkipLastObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipLastObserver(o, this._c));\n    };\n\n    return SkipLastObservable;\n  }(ObservableBase));\n\n  var SkipLastObserver = (function (__super__) {\n    inherits(SkipLastObserver, __super__);\n    function SkipLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    SkipLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._o.onNext(this._q.shift());\n    };\n\n    SkipLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    SkipLastObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return SkipLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses a specified number of elements at the end of an observable sequence.\n   * @description\n   *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n   *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n   * @param count Number of elements to bypass at the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n   */\n  observableProto.skipLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipLastObservable(this, count);\n  };\n\n  /**\n   *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n   *  @example\n   *  var res = source.startWith(1, 2, 3);\n   *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n   * @param {Arguments} args The specified values to prepend to the observable sequence\n   * @returns {Observable} The source sequence prepended with the specified values.\n   */\n  observableProto.startWith = function () {\n    var values, scheduler, start = 0;\n    if (!!arguments.length && isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      start = 1;\n    } else {\n      scheduler = immediateScheduler;\n    }\n    for(var args = [], i = start, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableConcat.apply(null, [observableFromArray(args, scheduler), this]);\n  };\n\n  var TakeLastObserver = (function (__super__) {\n    inherits(TakeLastObserver, __super__);\n    function TakeLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastObserver.prototype.completed = function () {\n      while (this._q.length > 0) { this._o.onNext(this._q.shift()); }\n      this._o.onCompleted();\n    };\n\n    return TakeLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns a specified number of contiguous elements from the end of an observable sequence.\n   * @description\n   *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n   *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastObserver(o, count));\n    }, source);\n  };\n\nobservableProto.flatMapConcat = observableProto.concatMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).merge(1);\n};\n  var MapObservable = (function (__super__) {\n    inherits(MapObservable, __super__);\n\n    function MapObservable(source, selector, thisArg) {\n      this.source = source;\n      this.selector = bindCallback(selector, thisArg, 3);\n      __super__.call(this);\n    }\n\n    function innerMap(selector, self) {\n      return function (x, i, o) { return selector.call(this, self.selector(x, i, o), i, o); };\n    }\n\n    MapObservable.prototype.internalMap = function (selector, thisArg) {\n      return new MapObservable(this.source, innerMap(selector, this), thisArg);\n    };\n\n    MapObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, selector, source) {\n      this.o = o;\n      this.selector = selector;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var result = tryCatch(this.selector)(x, this.i++, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n      this.o.onNext(result);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return MapObservable;\n\n  }(ObservableBase));\n\n  /**\n  * Projects each element of an observable sequence into a new form by incorporating the element's index.\n  * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n  */\n  observableProto.map = observableProto.select = function (selector, thisArg) {\n    var selectorFn = typeof selector === 'function' ? selector : function () { return selector; };\n    return this instanceof MapObservable ?\n      this.internalMap(selectorFn, thisArg) :\n      new MapObservable(this, selectorFn, thisArg);\n  };\n\n  function plucker(args, len) {\n    return function mapper(x) {\n      var currentProp = x;\n      for (var i = 0; i < len; i++) {\n        var p = currentProp[args[i]];\n        if (typeof p !== 'undefined') {\n          currentProp = p;\n        } else {\n          return undefined;\n        }\n      }\n      return currentProp;\n    };\n  }\n\n  /**\n   * Retrieves the value of a specified nested property from all elements in\n   * the Observable sequence.\n   * @param {Arguments} arguments The nested properties to pluck.\n   * @returns {Observable} Returns a new Observable sequence of property values.\n   */\n  observableProto.pluck = function () {\n    var len = arguments.length, args = new Array(len);\n    if (len === 0) { throw new Error('List of properties cannot be empty.'); }\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return this.map(plucker(args, len));\n  };\n\nobservableProto.flatMap = observableProto.selectMany = observableProto.mergeMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).mergeAll();\n};\n\nobservableProto.flatMapLatest = observableProto.switchMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).switchLatest();\n};\n\n  var SkipObservable = (function(__super__) {\n    inherits(SkipObservable, __super__);\n    function SkipObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    SkipObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipObserver(o, this._count));\n    };\n\n    function SkipObserver(o, c) {\n      this._o = o;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(SkipObserver, AbstractObserver);\n\n    SkipObserver.prototype.next = function (x) {\n      if (this._r <= 0) {\n        this._o.onNext(x);\n      } else {\n        this._r--;\n      }\n    };\n    SkipObserver.prototype.error = function(e) { this._o.onError(e); };\n    SkipObserver.prototype.completed = function() { this._o.onCompleted(); };\n\n    return SkipObservable;\n  }(ObservableBase));\n\n  /**\n   * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n   * @param {Number} count The number of elements to skip before returning the remaining elements.\n   * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n   */\n  observableProto.skip = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipObservable(this, count);\n  };\n\n  var SkipWhileObservable = (function (__super__) {\n    inherits(SkipWhileObservable, __super__);\n    function SkipWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SkipWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipWhileObserver(o, this));\n    };\n\n    return SkipWhileObservable;\n  }(ObservableBase));\n\n  var SkipWhileObserver = (function (__super__) {\n    inherits(SkipWhileObserver, __super__);\n\n    function SkipWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = false;\n      __super__.call(this);\n    }\n\n    SkipWhileObserver.prototype.next = function (x) {\n      if (!this._r) {\n        var res = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._r = !res;\n      }\n      this._r && this._o.onNext(x);\n    };\n    SkipWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n   *  The element's index is used in the logic of the predicate function.\n   *\n   *  var res = source.skipWhile(function (value) { return value < 10; });\n   *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n   */\n  observableProto.skipWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new SkipWhileObservable(this, fn);\n  };\n\n  var TakeObservable = (function(__super__) {\n    inherits(TakeObservable, __super__);\n    function TakeObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    TakeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeObserver(o, this._count));\n    };\n\n    function TakeObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(TakeObserver, AbstractObserver);\n\n    TakeObserver.prototype.next = function (x) {\n      if (this._r-- > 0) {\n        this._o.onNext(x);\n        this._r <= 0 && this._o.onCompleted();\n      }\n    };\n\n    TakeObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n   * @param {Number} count The number of elements to return.\n   * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n   * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n   */\n  observableProto.take = function (count, scheduler) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    if (count === 0) { return observableEmpty(scheduler); }\n    return new TakeObservable(this, count);\n  };\n\n  var TakeWhileObservable = (function (__super__) {\n    inherits(TakeWhileObservable, __super__);\n    function TakeWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    TakeWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeWhileObserver(o, this));\n    };\n\n    return TakeWhileObservable;\n  }(ObservableBase));\n\n  var TakeWhileObserver = (function (__super__) {\n    inherits(TakeWhileObserver, __super__);\n\n    function TakeWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = true;\n      __super__.call(this);\n    }\n\n    TakeWhileObserver.prototype.next = function (x) {\n      if (this._r) {\n        this._r = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (this._r === errorObj) { return this._o.onError(this._r.e); }\n      }\n      if (this._r) {\n        this._o.onNext(x);\n      } else {\n        this._o.onCompleted();\n      }\n    };\n    TakeWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns elements from an observable sequence as long as a specified condition is true.\n   *  The element's index is used in the logic of the predicate function.\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n   */\n  observableProto.takeWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new TakeWhileObservable(this, fn);\n  };\n\n  var FilterObservable = (function (__super__) {\n    inherits(FilterObservable, __super__);\n\n    function FilterObservable(source, predicate, thisArg) {\n      this.source = source;\n      this.predicate = bindCallback(predicate, thisArg, 3);\n      __super__.call(this);\n    }\n\n    FilterObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.predicate, this));\n    };\n\n    function innerPredicate(predicate, self) {\n      return function(x, i, o) { return self.predicate(x, i, o) && predicate.call(this, x, i, o); }\n    }\n\n    FilterObservable.prototype.internalFilter = function(predicate, thisArg) {\n      return new FilterObservable(this.source, innerPredicate(predicate, this), thisArg);\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, predicate, source) {\n      this.o = o;\n      this.predicate = predicate;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var shouldYield = tryCatch(this.predicate)(x, this.i++, this.source);\n      if (shouldYield === errorObj) {\n        return this.o.onError(shouldYield.e);\n      }\n      shouldYield && this.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return FilterObservable;\n\n  }(ObservableBase));\n\n  /**\n  *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n  * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n  */\n  observableProto.filter = observableProto.where = function (predicate, thisArg) {\n    return this instanceof FilterObservable ? this.internalFilter(predicate, thisArg) :\n      new FilterObservable(this, predicate, thisArg);\n  };\n\nfunction createCbObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createCbHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createCbHandler(o, ctx, selector) {\n  return function handler () {\n    var len = arguments.length, results = new Array(len);\n    for(var i = 0; i < len; i++) { results[i] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a callback function to an observable sequence.\n *\n * @param {Function} fn Function with a callback as the last parameter to convert to an Observable sequence.\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n */\nObservable.fromCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n\n    var len = arguments.length, args = new Array(len)\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createCbObservable(fn, ctx, selector, args);\n  };\n};\n\nfunction createNodeObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createNodeHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createNodeHandler(o, ctx, selector) {\n  return function handler () {\n    var err = arguments[0];\n    if (err) { return o.onError(err); }\n\n    var len = arguments.length, results = [];\n    for(var i = 1; i < len; i++) { results[i - 1] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      var results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n * @param {Function} fn The function to call\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n */\nObservable.fromNodeCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createNodeObservable(fn, ctx, selector, args);\n  };\n};\n\n  function isNodeList(el) {\n    if (root.StaticNodeList) {\n      // IE8 Specific\n      // instanceof is slower than Object#toString, but Object#toString will not work as intended in IE8\n      return el instanceof root.StaticNodeList || el instanceof root.NodeList;\n    } else {\n      return Object.prototype.toString.call(el) === '[object NodeList]';\n    }\n  }\n\n  function ListenDisposable(e, n, fn) {\n    this._e = e;\n    this._n = n;\n    this._fn = fn;\n    this._e.addEventListener(this._n, this._fn, false);\n    this.isDisposed = false;\n  }\n  ListenDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this._e.removeEventListener(this._n, this._fn, false);\n      this.isDisposed = true;\n    }\n  };\n\n  function createEventListener (el, eventName, handler) {\n    var disposables = new CompositeDisposable();\n\n    // Asume NodeList or HTMLCollection\n    var elemToString = Object.prototype.toString.call(el);\n    if (isNodeList(el) || elemToString === '[object HTMLCollection]') {\n      for (var i = 0, len = el.length; i < len; i++) {\n        disposables.add(createEventListener(el.item(i), eventName, handler));\n      }\n    } else if (el) {\n      disposables.add(new ListenDisposable(el, eventName, handler));\n    }\n\n    return disposables;\n  }\n\n  /**\n   * Configuration option to determine whether to use native events only\n   */\n  Rx.config.useNativeEvents = false;\n\n  var EventObservable = (function(__super__) {\n    inherits(EventObservable, __super__);\n    function EventObservable(el, name, fn) {\n      this._el = el;\n      this._n = name;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventObservable.prototype.subscribeCore = function (o) {\n      return createEventListener(\n        this._el,\n        this._n,\n        createHandler(o, this._fn));\n    };\n\n    return EventObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n   * @param {Object} element The DOMElement or NodeList to attach a listener.\n   * @param {String} eventName The event name to attach the observable sequence.\n   * @param {Object} eventListenerOptions An object describing EventListenerOptions\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n   */\n  Observable.fromEvent = function (element, eventName, selector, eventListenerOptions) {\n    // Node.js specific\n    if (element.addListener) {\n      return fromEventPattern(\n        function (h) { element.addListener(eventName, h, eventListenerOptions); },\n        function (h) { element.removeListener(eventName, h, eventListenerOptions); },\n        selector);\n    }\n\n    // Use only if non-native events are allowed\n    if (!Rx.config.useNativeEvents) {\n      // Handles jq, Angular.js, Zepto, Marionette, Ember.js\n      if (typeof element.on === 'function' && typeof element.off === 'function') {\n        return fromEventPattern(\n          function (h) { element.on(eventName, h, eventListenerOptions); },\n          function (h) { element.off(eventName, h, eventListenerOptions); },\n          selector);\n      }\n    }\n\n    return new EventObservable(element, eventName, selector).publish().refCount();\n  };\n\n  var EventPatternObservable = (function(__super__) {\n    inherits(EventPatternObservable, __super__);\n    function EventPatternObservable(add, del, fn) {\n      this._add = add;\n      this._del = del;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventPatternObservable.prototype.subscribeCore = function (o) {\n      var fn = createHandler(o, this._fn);\n      var returnValue = this._add(fn);\n      return new EventPatternDisposable(this._del, fn, returnValue);\n    };\n\n    function EventPatternDisposable(del, fn, ret) {\n      this._del = del;\n      this._fn = fn;\n      this._ret = ret;\n      this.isDisposed = false;\n    }\n\n    EventPatternDisposable.prototype.dispose = function () {\n      if(!this.isDisposed) {\n        isFunction(this._del) && this._del(this._fn, this._ret);\n        this.isDisposed = true;\n      }\n    };\n\n    return EventPatternObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n   * @param {Function} addHandler The function to add a handler to the emitter.\n   * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence which wraps an event from an event emitter\n   */\n  var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) {\n    return new EventPatternObservable(addHandler, removeHandler, selector).publish().refCount();\n  };\n\n  var FromPromiseObservable = (function(__super__) {\n    inherits(FromPromiseObservable, __super__);\n    function FromPromiseObservable(p, s) {\n      this._p = p;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleNext(s, state) {\n      var o = state[0], data = state[1];\n      o.onNext(data);\n      o.onCompleted();\n    }\n\n    function scheduleError(s, state) {\n      var o = state[0], err = state[1];\n      o.onError(err);\n    }\n\n    FromPromiseObservable.prototype.subscribeCore = function(o) {\n      var sad = new SingleAssignmentDisposable(), self = this, p = this._p;\n\n      if (isFunction(p)) {\n        p = tryCatch(p)();\n        if (p === errorObj) {\n          o.onError(p.e);\n          return sad;\n        }\n      }\n\n      p\n        .then(function (data) {\n          sad.setDisposable(self._s.schedule([o, data], scheduleNext));\n        }, function (err) {\n          sad.setDisposable(self._s.schedule([o, err], scheduleError));\n        });\n\n      return sad;\n    };\n\n    return FromPromiseObservable;\n  }(ObservableBase));\n\n  /**\n  * Converts a Promise to an Observable sequence\n  * @param {Promise} An ES6 Compliant promise.\n  * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n  */\n  var observableFromPromise = Observable.fromPromise = function (promise, scheduler) {\n    scheduler || (scheduler = defaultScheduler);\n    return new FromPromiseObservable(promise, scheduler);\n  };\n\n  /*\n   * Converts an existing observable sequence to an ES6 Compatible Promise\n   * @example\n   * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n   *\n   * // With config\n   * Rx.config.Promise = RSVP.Promise;\n   * var promise = Rx.Observable.return(42).toPromise();\n   * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n   * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n   */\n  observableProto.toPromise = function (promiseCtor) {\n    promiseCtor || (promiseCtor = Rx.config.Promise);\n    if (!promiseCtor) { throw new NotSupportedError('Promise type not provided nor in Rx.config.Promise'); }\n    var source = this;\n    return new promiseCtor(function (resolve, reject) {\n      // No cancellation can be done\n      var value;\n      source.subscribe(function (v) {\n        value = v;\n      }, reject, function () {\n        resolve(value);\n      });\n    });\n  };\n\n  /**\n   * Invokes the asynchronous function, surfacing the result through an observable sequence.\n   * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   */\n  Observable.startAsync = function (functionAsync) {\n    var promise = tryCatch(functionAsync)();\n    if (promise === errorObj) { return observableThrow(promise.e); }\n    return observableFromPromise(promise);\n  };\n\n  var MulticastObservable = (function (__super__) {\n    inherits(MulticastObservable, __super__);\n    function MulticastObservable(source, fn1, fn2) {\n      this.source = source;\n      this._fn1 = fn1;\n      this._fn2 = fn2;\n      __super__.call(this);\n    }\n\n    MulticastObservable.prototype.subscribeCore = function (o) {\n      var connectable = this.source.multicast(this._fn1());\n      return new BinaryDisposable(this._fn2(connectable).subscribe(o), connectable.connect());\n    };\n\n    return MulticastObservable;\n  }(ObservableBase));\n\n  /**\n   * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n   * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n   * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n   *\n   * @example\n   * 1 - res = source.multicast(observable);\n   * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n   *\n   * @param {Function|Subject} subjectOrSubjectSelector\n   * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n   * Or:\n   * Subject to push source elements into.\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.multicast = function (subjectOrSubjectSelector, selector) {\n    return isFunction(subjectOrSubjectSelector) ?\n      new MulticastObservable(this, subjectOrSubjectSelector, selector) :\n      new ConnectableObservable(this, subjectOrSubjectSelector);\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of Multicast using a regular Subject.\n   *\n   * @example\n   * var resres = source.publish();\n   * var res = source.publish(function (x) { return x; });\n   *\n   * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publish = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new Subject(); }, selector) :\n      this.multicast(new Subject());\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.share = function () {\n    return this.publish().refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n   * This operator is a specialization of Multicast using a AsyncSubject.\n   *\n   * @example\n   * var res = source.publishLast();\n   * var res = source.publishLast(function (x) { return x; });\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishLast = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new AsyncSubject(); }, selector) :\n      this.multicast(new AsyncSubject());\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n   * This operator is a specialization of Multicast using a BehaviorSubject.\n   *\n   * @example\n   * var res = source.publishValue(42);\n   * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishValue = function (initialValueOrSelector, initialValue) {\n    return arguments.length === 2 ?\n      this.multicast(function () {\n        return new BehaviorSubject(initialValue);\n      }, initialValueOrSelector) :\n      this.multicast(new BehaviorSubject(initialValueOrSelector));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n   * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareValue = function (initialValue) {\n    return this.publishValue(initialValue).refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of Multicast using a ReplaySubject.\n   *\n   * @example\n   * var res = source.replay(null, 3);\n   * var res = source.replay(null, 3, 500);\n   * var res = source.replay(null, 3, 500, scheduler);\n   * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param windowSize [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.replay = function (selector, bufferSize, windowSize, scheduler) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new ReplaySubject(bufferSize, windowSize, scheduler); }, selector) :\n      this.multicast(new ReplaySubject(bufferSize, windowSize, scheduler));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   *\n   * @example\n   * var res = source.shareReplay(3);\n   * var res = source.shareReplay(3, 500);\n   * var res = source.shareReplay(3, 500, scheduler);\n   *\n\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareReplay = function (bufferSize, windowSize, scheduler) {\n    return this.replay(null, bufferSize, windowSize, scheduler).refCount();\n  };\n\n  var RefCountObservable = (function (__super__) {\n    inherits(RefCountObservable, __super__);\n    function RefCountObservable(source) {\n      this.source = source;\n      this._count = 0;\n      this._connectableSubscription = null;\n      __super__.call(this);\n    }\n\n    RefCountObservable.prototype.subscribeCore = function (o) {\n      var subscription = this.source.subscribe(o);\n      ++this._count === 1 && (this._connectableSubscription = this.source.connect());\n      return new RefCountDisposable(this, subscription);\n    };\n\n    function RefCountDisposable(p, s) {\n      this._p = p;\n      this._s = s;\n      this.isDisposed = false;\n    }\n\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this._s.dispose();\n        --this._p._count === 0 && this._p._connectableSubscription.dispose();\n      }\n    };\n\n    return RefCountObservable;\n  }(ObservableBase));\n\n  var ConnectableObservable = Rx.ConnectableObservable = (function (__super__) {\n    inherits(ConnectableObservable, __super__);\n    function ConnectableObservable(source, subject) {\n      this.source = source;\n      this._connection = null;\n      this._source = source.asObservable();\n      this._subject = subject;\n      __super__.call(this);\n    }\n\n    function ConnectDisposable(parent, subscription) {\n      this._p = parent;\n      this._s = subscription;\n    }\n\n    ConnectDisposable.prototype.dispose = function () {\n      if (this._s) {\n        this._s.dispose();\n        this._s = null;\n        this._p._connection = null;\n      }\n    };\n\n    ConnectableObservable.prototype.connect = function () {\n      if (!this._connection) {\n        if (this._subject.isStopped) {\n          return disposableEmpty;\n        }\n        var subscription = this._source.subscribe(this._subject);\n        this._connection = new ConnectDisposable(this, subscription);\n      }\n      return this._connection;\n    };\n\n    ConnectableObservable.prototype._subscribe = function (o) {\n      return this._subject.subscribe(o);\n    };\n\n    ConnectableObservable.prototype.refCount = function () {\n      return new RefCountObservable(this);\n    };\n\n    return ConnectableObservable;\n  }(Observable));\n\n  var TimerObservable = (function(__super__) {\n    inherits(TimerObservable, __super__);\n    function TimerObservable(dt, s) {\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimerObservable.prototype.subscribeCore = function (o) {\n      return this._s.scheduleFuture(o, this._dt, scheduleMethod);\n    };\n\n    function scheduleMethod(s, o) {\n      o.onNext(0);\n      o.onCompleted();\n    }\n\n    return TimerObservable;\n  }(ObservableBase));\n\n  function _observableTimer(dueTime, scheduler) {\n    return new TimerObservable(dueTime, scheduler);\n  }\n\n  function observableTimerDateAndPeriod(dueTime, period, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var d = dueTime, p = normalizeTime(period);\n      return scheduler.scheduleRecursiveFuture(0, d, function (count, self) {\n        if (p > 0) {\n          var now = scheduler.now();\n          d = new Date(d.getTime() + p);\n          d.getTime() <= now && (d = new Date(now + p));\n        }\n        observer.onNext(count);\n        self(count + 1, new Date(d));\n      });\n    });\n  }\n\n  function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) {\n    return dueTime === period ?\n      new AnonymousObservable(function (observer) {\n        return scheduler.schedulePeriodic(0, period, function (count) {\n          observer.onNext(count);\n          return count + 1;\n        });\n      }) :\n      observableDefer(function () {\n        return observableTimerDateAndPeriod(new Date(scheduler.now() + dueTime), period, scheduler);\n      });\n  }\n\n  /**\n   *  Returns an observable sequence that produces a value after each period.\n   *\n   * @example\n   *  1 - res = Rx.Observable.interval(1000);\n   *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n   *\n   * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n   * @returns {Observable} An observable sequence that produces a value after each period.\n   */\n  var observableinterval = Observable.interval = function (period, scheduler) {\n    return observableTimerTimeSpanAndPeriod(period, period, isScheduler(scheduler) ? scheduler : defaultScheduler);\n  };\n\n  /**\n   *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n   * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n   */\n  var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) {\n    var period;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    if (periodOrScheduler != null && typeof periodOrScheduler === 'number') {\n      period = periodOrScheduler;\n    } else if (isScheduler(periodOrScheduler)) {\n      scheduler = periodOrScheduler;\n    }\n    if ((dueTime instanceof Date || typeof dueTime === 'number') && period === undefined) {\n      return _observableTimer(dueTime, scheduler);\n    }\n    if (dueTime instanceof Date && period !== undefined) {\n      return observableTimerDateAndPeriod(dueTime, periodOrScheduler, scheduler);\n    }\n    return observableTimerTimeSpanAndPeriod(dueTime, period, scheduler);\n  };\n\n  function observableDelayRelative(source, dueTime, scheduler) {\n    return new AnonymousObservable(function (o) {\n      var active = false,\n        cancelable = new SerialDisposable(),\n        exception = null,\n        q = [],\n        running = false,\n        subscription;\n      subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) {\n        var d, shouldRun;\n        if (notification.value.kind === 'E') {\n          q = [];\n          q.push(notification);\n          exception = notification.value.error;\n          shouldRun = !running;\n        } else {\n          q.push({ value: notification.value, timestamp: notification.timestamp + dueTime });\n          shouldRun = !active;\n          active = true;\n        }\n        if (shouldRun) {\n          if (exception !== null) {\n            o.onError(exception);\n          } else {\n            d = new SingleAssignmentDisposable();\n            cancelable.setDisposable(d);\n            d.setDisposable(scheduler.scheduleRecursiveFuture(null, dueTime, function (_, self) {\n              var e, recurseDueTime, result, shouldRecurse;\n              if (exception !== null) {\n                return;\n              }\n              running = true;\n              do {\n                result = null;\n                if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) {\n                  result = q.shift().value;\n                }\n                if (result !== null) {\n                  result.accept(o);\n                }\n              } while (result !== null);\n              shouldRecurse = false;\n              recurseDueTime = 0;\n              if (q.length > 0) {\n                shouldRecurse = true;\n                recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now());\n              } else {\n                active = false;\n              }\n              e = exception;\n              running = false;\n              if (e !== null) {\n                o.onError(e);\n              } else if (shouldRecurse) {\n                self(null, recurseDueTime);\n              }\n            }));\n          }\n        }\n      });\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  function observableDelayAbsolute(source, dueTime, scheduler) {\n    return observableDefer(function () {\n      return observableDelayRelative(source, dueTime - scheduler.now(), scheduler);\n    });\n  }\n\n  function delayWithSelector(source, subscriptionDelay, delayDurationSelector) {\n    var subDelay, selector;\n    if (isFunction(subscriptionDelay)) {\n      selector = subscriptionDelay;\n    } else {\n      subDelay = subscriptionDelay;\n      selector = delayDurationSelector;\n    }\n    return new AnonymousObservable(function (o) {\n      var delays = new CompositeDisposable(), atEnd = false, subscription = new SerialDisposable();\n\n      function start() {\n        subscription.setDisposable(source.subscribe(\n          function (x) {\n            var delay = tryCatch(selector)(x);\n            if (delay === errorObj) { return o.onError(delay.e); }\n            var d = new SingleAssignmentDisposable();\n            delays.add(d);\n            d.setDisposable(delay.subscribe(\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              },\n              function (e) { o.onError(e); },\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              }\n            ));\n          },\n          function (e) { o.onError(e); },\n          function () {\n            atEnd = true;\n            subscription.dispose();\n            done();\n          }\n        ));\n      }\n\n      function done () {\n        atEnd && delays.length === 0 && o.onCompleted();\n      }\n\n      if (!subDelay) {\n        start();\n      } else {\n        subscription.setDisposable(subDelay.subscribe(start, function (e) { o.onError(e); }, start));\n      }\n\n      return new BinaryDisposable(subscription, delays);\n    }, source);\n  }\n\n  /**\n   *  Time shifts the observable sequence by dueTime.\n   *  The relative time intervals between the values are preserved.\n   *\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n   * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delay = function () {\n    var firstArg = arguments[0];\n    if (typeof firstArg === 'number' || firstArg instanceof Date) {\n      var dueTime = firstArg, scheduler = arguments[1];\n      isScheduler(scheduler) || (scheduler = defaultScheduler);\n      return dueTime instanceof Date ?\n        observableDelayAbsolute(this, dueTime, scheduler) :\n        observableDelayRelative(this, dueTime, scheduler);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return delayWithSelector(this, firstArg, arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  var DebounceObservable = (function (__super__) {\n    inherits(DebounceObservable, __super__);\n    function DebounceObservable(source, dt, s) {\n      isScheduler(s) || (s = defaultScheduler);\n      this.source = source;\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    DebounceObservable.prototype.subscribeCore = function (o) {\n      var cancelable = new SerialDisposable();\n      return new BinaryDisposable(\n        this.source.subscribe(new DebounceObserver(o, this._dt, this._s, cancelable)),\n        cancelable);\n    };\n\n    return DebounceObservable;\n  }(ObservableBase));\n\n  var DebounceObserver = (function (__super__) {\n    inherits(DebounceObserver, __super__);\n    function DebounceObserver(observer, dueTime, scheduler, cancelable) {\n      this._o = observer;\n      this._d = dueTime;\n      this._scheduler = scheduler;\n      this._c = cancelable;\n      this._v = null;\n      this._hv = false;\n      this._id = 0;\n      __super__.call(this);\n    }\n\n    function scheduleFuture(s, state) {\n      state.self._hv && state.self._id === state.currentId && state.self._o.onNext(state.x);\n      state.self._hv = false;\n    }\n\n    DebounceObserver.prototype.next = function (x) {\n      this._hv = true;\n      this._v = x;\n      var currentId = ++this._id, d = new SingleAssignmentDisposable();\n      this._c.setDisposable(d);\n      d.setDisposable(this._scheduler.scheduleFuture(this, this._d, function (_, self) {\n        self._hv && self._id === currentId && self._o.onNext(x);\n        self._hv = false;\n      }));\n    };\n\n    DebounceObserver.prototype.error = function (e) {\n      this._c.dispose();\n      this._o.onError(e);\n      this._hv = false;\n      this._id++;\n    };\n\n    DebounceObserver.prototype.completed = function () {\n      this._c.dispose();\n      this._hv && this._o.onNext(this._v);\n      this._o.onCompleted();\n      this._hv = false;\n      this._id++;\n    };\n\n    return DebounceObserver;\n  }(AbstractObserver));\n\n  function debounceWithSelector(source, durationSelector) {\n    return new AnonymousObservable(function (o) {\n      var value, hasValue = false, cancelable = new SerialDisposable(), id = 0;\n      var subscription = source.subscribe(\n        function (x) {\n          var throttle = tryCatch(durationSelector)(x);\n          if (throttle === errorObj) { return o.onError(throttle.e); }\n\n          isPromise(throttle) && (throttle = observableFromPromise(throttle));\n\n          hasValue = true;\n          value = x;\n          id++;\n          var currentid = id, d = new SingleAssignmentDisposable();\n          cancelable.setDisposable(d);\n          d.setDisposable(throttle.subscribe(\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            },\n            function (e) { o.onError(e); },\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            }\n          ));\n        },\n        function (e) {\n          cancelable.dispose();\n          o.onError(e);\n          hasValue = false;\n          id++;\n        },\n        function () {\n          cancelable.dispose();\n          hasValue && o.onNext(value);\n          o.onCompleted();\n          hasValue = false;\n          id++;\n        }\n      );\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  observableProto.debounce = function () {\n    if (isFunction (arguments[0])) {\n      return debounceWithSelector(this, arguments[0]);\n    } else if (typeof arguments[0] === 'number') {\n      return new DebounceObservable(this, arguments[0], arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  var TimestampObservable = (function (__super__) {\n    inherits(TimestampObservable, __super__);\n    function TimestampObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TimestampObserver(o, this._s));\n    };\n\n    return TimestampObservable;\n  }(ObservableBase));\n\n  var TimestampObserver = (function (__super__) {\n    inherits(TimestampObserver, __super__);\n    function TimestampObserver(o, s) {\n      this._o = o;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObserver.prototype.next = function (x) {\n      this._o.onNext({ value: x, timestamp: this._s.now() });\n    };\n\n    TimestampObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TimestampObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return TimestampObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Records the timestamp for each value in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n   *  2 - res = source.timestamp(Rx.Scheduler.default);\n   *\n   * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the default scheduler is used.\n   * @returns {Observable} An observable sequence with timestamp information on values.\n   */\n  observableProto.timestamp = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TimestampObservable(this, scheduler);\n  };\n\n  var SampleObservable = (function(__super__) {\n    inherits(SampleObservable, __super__);\n    function SampleObservable(source, sampler) {\n      this.source = source;\n      this._sampler = sampler;\n      __super__.call(this);\n    }\n\n    SampleObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        atEnd: false,\n        value: null,\n        hasValue: false,\n        sourceSubscription: new SingleAssignmentDisposable()\n      };\n\n      state.sourceSubscription.setDisposable(this.source.subscribe(new SampleSourceObserver(state)));\n      return new BinaryDisposable(\n        state.sourceSubscription,\n        this._sampler.subscribe(new SamplerObserver(state))\n      );\n    };\n\n    return SampleObservable;\n  }(ObservableBase));\n\n  var SamplerObserver = (function(__super__) {\n    inherits(SamplerObserver, __super__);\n    function SamplerObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SamplerObserver.prototype._handleMessage = function () {\n      if (this._s.hasValue) {\n        this._s.hasValue = false;\n        this._s.o.onNext(this._s.value);\n      }\n      this._s.atEnd && this._s.o.onCompleted();\n    };\n\n    SamplerObserver.prototype.next = function () { this._handleMessage(); };\n    SamplerObserver.prototype.error = function (e) { this._s.onError(e); };\n    SamplerObserver.prototype.completed = function () { this._handleMessage(); };\n\n    return SamplerObserver;\n  }(AbstractObserver));\n\n  var SampleSourceObserver = (function(__super__) {\n    inherits(SampleSourceObserver, __super__);\n    function SampleSourceObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SampleSourceObserver.prototype.next = function (x) {\n      this._s.hasValue = true;\n      this._s.value = x;\n    };\n    SampleSourceObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    SampleSourceObserver.prototype.completed = function () {\n      this._s.atEnd = true;\n      this._s.sourceSubscription.dispose();\n    };\n\n    return SampleSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Samples the observable sequence at each interval.\n   *\n   * @example\n   *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n   *  2 - res = source.sample(5000); // 5 seconds\n   *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n   *\n   * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n   * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Sampled observable sequence.\n   */\n  observableProto.sample = function (intervalOrSampler, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return typeof intervalOrSampler === 'number' ?\n      new SampleObservable(this, observableinterval(intervalOrSampler, scheduler)) :\n      new SampleObservable(this, intervalOrSampler);\n  };\n\n  var TimeoutError = Rx.TimeoutError = function(message) {\n    this.message = message || 'Timeout has occurred';\n    this.name = 'TimeoutError';\n    Error.call(this);\n  };\n  TimeoutError.prototype = Object.create(Error.prototype);\n\n  function timeoutWithSelector(source, firstTimeout, timeoutDurationSelector, other) {\n    if (isFunction(firstTimeout)) {\n      other = timeoutDurationSelector;\n      timeoutDurationSelector = firstTimeout;\n      firstTimeout = observableNever();\n    }\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var subscription = new SerialDisposable(),\n        timer = new SerialDisposable(),\n        original = new SingleAssignmentDisposable();\n\n      subscription.setDisposable(original);\n\n      var id = 0, switched = false;\n\n      function setTimer(timeout) {\n        var myId = id, d = new SingleAssignmentDisposable();\n\n        function timerWins() {\n          switched = (myId === id);\n          return switched;\n        }\n\n        timer.setDisposable(d);\n        d.setDisposable(timeout.subscribe(function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n          d.dispose();\n        }, function (e) {\n          timerWins() && o.onError(e);\n        }, function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n        }));\n      };\n\n      setTimer(firstTimeout);\n\n      function oWins() {\n        var res = !switched;\n        if (res) { id++; }\n        return res;\n      }\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (oWins()) {\n          o.onNext(x);\n          var timeout = tryCatch(timeoutDurationSelector)(x);\n          if (timeout === errorObj) { return o.onError(timeout.e); }\n          setTimer(isPromise(timeout) ? observableFromPromise(timeout) : timeout);\n        }\n      }, function (e) {\n        oWins() && o.onError(e);\n      }, function () {\n        oWins() && o.onCompleted();\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  function timeout(source, dueTime, other, scheduler) {\n    if (isScheduler(other)) {\n      scheduler = other;\n      other = observableThrow(new TimeoutError());\n    }\n    if (other instanceof Error) { other = observableThrow(other); }\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var id = 0,\n        original = new SingleAssignmentDisposable(),\n        subscription = new SerialDisposable(),\n        switched = false,\n        timer = new SerialDisposable();\n\n      subscription.setDisposable(original);\n\n      function createTimer() {\n        var myId = id;\n        timer.setDisposable(scheduler.scheduleFuture(null, dueTime, function () {\n          switched = id === myId;\n          if (switched) {\n            isPromise(other) && (other = observableFromPromise(other));\n            subscription.setDisposable(other.subscribe(o));\n          }\n        }));\n      }\n\n      createTimer();\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (!switched) {\n          id++;\n          o.onNext(x);\n          createTimer();\n        }\n      }, function (e) {\n        if (!switched) {\n          id++;\n          o.onError(e);\n        }\n      }, function () {\n        if (!switched) {\n          id++;\n          o.onCompleted();\n        }\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  observableProto.timeout = function () {\n    var firstArg = arguments[0];\n    if (firstArg instanceof Date || typeof firstArg === 'number') {\n      return timeout(this, firstArg, arguments[1], arguments[2]);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return timeoutWithSelector(this, firstArg, arguments[1], arguments[2]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  /**\n   * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n   * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n   * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n   * @returns {Observable} An Observable that performs the throttle operation.\n   */\n  observableProto.throttle = function (windowDuration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    var duration = +windowDuration || 0;\n    if (duration <= 0) { throw new RangeError('windowDuration cannot be less or equal zero.'); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var lastOnNext = 0;\n      return source.subscribe(\n        function (x) {\n          var now = scheduler.now();\n          if (lastOnNext === 0 || now - lastOnNext >= duration) {\n            lastOnNext = now;\n            o.onNext(x);\n          }\n        },function (e) { o.onError(e); }, function () { o.onCompleted(); }\n      );\n    }, source);\n  };\n\n  var PausableObservable = (function (__super__) {\n    inherits(PausableObservable, __super__);\n    function PausableObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableObservable.prototype._subscribe = function (o) {\n      var conn = this.source.publish(),\n        subscription = conn.subscribe(o),\n        connection = disposableEmpty;\n\n      var pausable = this.pauser.startWith(!this.paused).distinctUntilChanged().subscribe(function (b) {\n        if (b) {\n          connection = conn.connect();\n        } else {\n          connection.dispose();\n          connection = disposableEmpty;\n        }\n      });\n\n      return new NAryDisposable([subscription, connection, pausable]);\n    };\n\n    PausableObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausable(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausable = function (pauser) {\n    return new PausableObservable(this, pauser);\n  };\n\n  function combineLatestSource(source, subject, resultSelector) {\n    return new AnonymousObservable(function (o) {\n      var hasValue = [false, false],\n        hasValueAll = false,\n        isDone = false,\n        values = new Array(2),\n        err;\n\n      function next(x, i) {\n        values[i] = x;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          if (err) { return o.onError(err); }\n          var res = tryCatch(resultSelector).apply(null, values);\n          if (res === errorObj) { return o.onError(res.e); }\n          o.onNext(res);\n        }\n        isDone && values[1] && o.onCompleted();\n      }\n\n      return new BinaryDisposable(\n        source.subscribe(\n          function (x) {\n            next(x, 0);\n          },\n          function (e) {\n            if (values[1]) {\n              o.onError(e);\n            } else {\n              err = e;\n            }\n          },\n          function () {\n            isDone = true;\n            values[1] && o.onCompleted();\n          }),\n        subject.subscribe(\n          function (x) {\n            next(x, 1);\n          },\n          function (e) { o.onError(e); },\n          function () {\n            isDone = true;\n            next(true, 1);\n          })\n        );\n    }, source);\n  }\n\n  var PausableBufferedObservable = (function (__super__) {\n    inherits(PausableBufferedObservable, __super__);\n    function PausableBufferedObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableBufferedObservable.prototype._subscribe = function (o) {\n      var q = [], previousShouldFire;\n\n      function drainQueue() { while (q.length > 0) { o.onNext(q.shift()); } }\n\n      var subscription =\n        combineLatestSource(\n          this.source,\n          this.pauser.startWith(!this.paused).distinctUntilChanged(),\n          function (data, shouldFire) {\n            return { data: data, shouldFire: shouldFire };\n          })\n          .subscribe(\n            function (results) {\n              if (previousShouldFire !== undefined && results.shouldFire !== previousShouldFire) {\n                previousShouldFire = results.shouldFire;\n                // change in shouldFire\n                if (results.shouldFire) { drainQueue(); }\n              } else {\n                previousShouldFire = results.shouldFire;\n                // new data\n                if (results.shouldFire) {\n                  o.onNext(results.data);\n                } else {\n                  q.push(results.data);\n                }\n              }\n            },\n            function (err) {\n              drainQueue();\n              o.onError(err);\n            },\n            function () {\n              drainQueue();\n              o.onCompleted();\n            }\n          );\n      return subscription;      \n    };\n\n    PausableBufferedObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableBufferedObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableBufferedObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n   * and yields the values that were buffered while paused.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausableBuffered = function (pauser) {\n    return new PausableBufferedObservable(this, pauser);\n  };\n\n  var ControlledObservable = (function (__super__) {\n    inherits(ControlledObservable, __super__);\n    function ControlledObservable (source, enableQueue, scheduler) {\n      __super__.call(this);\n      this.subject = new ControlledSubject(enableQueue, scheduler);\n      this.source = source.multicast(this.subject).refCount();\n    }\n\n    ControlledObservable.prototype._subscribe = function (o) {\n      return this.source.subscribe(o);\n    };\n\n    ControlledObservable.prototype.request = function (numberOfItems) {\n      return this.subject.request(numberOfItems == null ? -1 : numberOfItems);\n    };\n\n    return ControlledObservable;\n\n  }(Observable));\n\n  var ControlledSubject = (function (__super__) {\n    inherits(ControlledSubject, __super__);\n    function ControlledSubject(enableQueue, scheduler) {\n      enableQueue == null && (enableQueue = true);\n\n      __super__.call(this);\n      this.subject = new Subject();\n      this.enableQueue = enableQueue;\n      this.queue = enableQueue ? [] : null;\n      this.requestedCount = 0;\n      this.requestedDisposable = null;\n      this.error = null;\n      this.hasFailed = false;\n      this.hasCompleted = false;\n      this.scheduler = scheduler || currentThreadScheduler;\n    }\n\n    addProperties(ControlledSubject.prototype, Observer, {\n      _subscribe: function (o) {\n        return this.subject.subscribe(o);\n      },\n      onCompleted: function () {\n        this.hasCompleted = true;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onCompleted();\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnCompleted());\n        }\n      },\n      onError: function (error) {\n        this.hasFailed = true;\n        this.error = error;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onError(error);\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnError(error));\n        }\n      },\n      onNext: function (value) {\n        if (this.requestedCount <= 0) {\n          this.enableQueue && this.queue.push(Notification.createOnNext(value));\n        } else {\n          (this.requestedCount-- === 0) && this.disposeCurrentRequest();\n          this.subject.onNext(value);\n        }\n      },\n      _processRequest: function (numberOfItems) {\n        if (this.enableQueue) {\n          while (this.queue.length > 0 && (numberOfItems > 0 || this.queue[0].kind !== 'N')) {\n            var first = this.queue.shift();\n            first.accept(this.subject);\n            if (first.kind === 'N') {\n              numberOfItems--;\n            } else {\n              this.disposeCurrentRequest();\n              this.queue = [];\n            }\n          }\n        }\n\n        return numberOfItems;\n      },\n      request: function (number) {\n        this.disposeCurrentRequest();\n        var self = this;\n\n        this.requestedDisposable = this.scheduler.schedule(number,\n        function(s, i) {\n          var remaining = self._processRequest(i);\n          var stopped = self.hasCompleted || self.hasFailed;\n          if (!stopped && remaining > 0) {\n            self.requestedCount = remaining;\n\n            return disposableCreate(function () {\n              self.requestedCount = 0;\n            });\n              // Scheduled item is still in progress. Return a new\n              // disposable to allow the request to be interrupted\n              // via dispose.\n          }\n        });\n\n        return this.requestedDisposable;\n      },\n      disposeCurrentRequest: function () {\n        if (this.requestedDisposable) {\n          this.requestedDisposable.dispose();\n          this.requestedDisposable = null;\n        }\n      }\n    });\n\n    return ControlledSubject;\n  }(Observable));\n\n  /**\n   * Attaches a controller to the observable sequence with the ability to queue.\n   * @example\n   * var source = Rx.Observable.interval(100).controlled();\n   * source.request(3); // Reads 3 values\n   * @param {bool} enableQueue truthy value to determine if values should be queued pending the next request\n   * @param {Scheduler} scheduler determines how the requests will be scheduled\n   * @returns {Observable} The observable sequence which only propagates values on request.\n   */\n  observableProto.controlled = function (enableQueue, scheduler) {\n\n    if (enableQueue && isScheduler(enableQueue)) {\n      scheduler = enableQueue;\n      enableQueue = true;\n    }\n\n    if (enableQueue == null) {  enableQueue = true; }\n    return new ControlledObservable(this, enableQueue, scheduler);\n  };\n\n  /**\n   * Pipes the existing Observable sequence into a Node.js Stream.\n   * @param {Stream} dest The destination Node.js stream.\n   * @returns {Stream} The destination stream.\n   */\n  observableProto.pipe = function (dest) {\n    var source = this.pausableBuffered();\n\n    function onDrain() {\n      source.resume();\n    }\n\n    dest.addListener('drain', onDrain);\n\n    source.subscribe(\n      function (x) {\n        !dest.write(x) && source.pause();\n      },\n      function (err) {\n        dest.emit('error', err);\n      },\n      function () {\n        // Hack check because STDIO is not closable\n        !dest._isStdio && dest.end();\n        dest.removeListener('drain', onDrain);\n      });\n\n    source.resume();\n\n    return dest;\n  };\n\n  var TransduceObserver = (function (__super__) {\n    inherits(TransduceObserver, __super__);\n    function TransduceObserver(o, xform) {\n      this._o = o;\n      this._xform = xform;\n      __super__.call(this);\n    }\n\n    TransduceObserver.prototype.next = function (x) {\n      var res = tryCatch(this._xform['@@transducer/step']).call(this._xform, this._o, x);\n      if (res === errorObj) { this._o.onError(res.e); }\n    };\n\n    TransduceObserver.prototype.error = function (e) { this._o.onError(e); };\n\n    TransduceObserver.prototype.completed = function () {\n      this._xform['@@transducer/result'](this._o);\n    };\n\n    return TransduceObserver;\n  }(AbstractObserver));\n\n  function transformForObserver(o) {\n    return {\n      '@@transducer/init': function() {\n        return o;\n      },\n      '@@transducer/step': function(obs, input) {\n        return obs.onNext(input);\n      },\n      '@@transducer/result': function(obs) {\n        return obs.onCompleted();\n      }\n    };\n  }\n\n  /**\n   * Executes a transducer to transform the observable sequence\n   * @param {Transducer} transducer A transducer to execute\n   * @returns {Observable} An Observable sequence containing the results from the transducer.\n   */\n  observableProto.transduce = function(transducer) {\n    var source = this;\n    return new AnonymousObservable(function(o) {\n      var xform = transducer(transformForObserver(o));\n      return source.subscribe(new TransduceObserver(o, xform));\n    }, source);\n  };\n\n  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {\n    inherits(AnonymousObservable, __super__);\n\n    // Fix subscriber to check for undefined or function returned to decorate as Disposable\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.__subscribe).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function AnonymousObservable(subscribe, parent) {\n      this.source = parent;\n      this.__subscribe = subscribe;\n      __super__.call(this);\n    }\n\n    AnonymousObservable.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    return AnonymousObservable;\n\n  }(Observable));\n\n  var AutoDetachObserver = (function (__super__) {\n    inherits(AutoDetachObserver, __super__);\n\n    function AutoDetachObserver(observer) {\n      __super__.call(this);\n      this.observer = observer;\n      this.m = new SingleAssignmentDisposable();\n    }\n\n    var AutoDetachObserverPrototype = AutoDetachObserver.prototype;\n\n    AutoDetachObserverPrototype.next = function (value) {\n      var result = tryCatch(this.observer.onNext).call(this.observer, value);\n      if (result === errorObj) {\n        this.dispose();\n        thrower(result.e);\n      }\n    };\n\n    AutoDetachObserverPrototype.error = function (err) {\n      var result = tryCatch(this.observer.onError).call(this.observer, err);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.completed = function () {\n      var result = tryCatch(this.observer.onCompleted).call(this.observer);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };\n    AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };\n\n    AutoDetachObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.m.dispose();\n    };\n\n    return AutoDetachObserver;\n  }(AbstractObserver));\n\n  var InnerSubscription = function (s, o) {\n    this._s = s;\n    this._o = o;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this._s.isDisposed && this._o !== null) {\n      var idx = this._s.observers.indexOf(this._o);\n      this._s.observers.splice(idx, 1);\n      this._o = null;\n    }\n  };\n\n  /**\n   *  Represents an object that is both an observable sequence as well as an observer.\n   *  Each notification is broadcasted to all subscribed observers.\n   */\n  var Subject = Rx.Subject = (function (__super__) {\n    inherits(Subject, __super__);\n    function Subject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(Subject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n          return disposableEmpty;\n        }\n        o.onCompleted();\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onCompleted();\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.error = error;\n          this.hasError = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onNext(value);\n          }\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    /**\n     * Creates a subject from the specified observer and observable.\n     * @param {Observer} observer The observer used to send messages to the subject.\n     * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n     * @returns {Subject} Subject implemented using the given observer and observable.\n     */\n    Subject.create = function (observer, observable) {\n      return new AnonymousSubject(observer, observable);\n    };\n\n    return Subject;\n  }(Observable));\n\n  /**\n   *  Represents the result of an asynchronous operation.\n   *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n   */\n  var AsyncSubject = Rx.AsyncSubject = (function (__super__) {\n    inherits(AsyncSubject, __super__);\n\n    /**\n     * Creates a subject that can only receive one value and that value is cached for all future observations.\n     * @constructor\n     */\n    function AsyncSubject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasValue = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(AsyncSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n\n        if (this.hasError) {\n          o.onError(this.error);\n        } else if (this.hasValue) {\n          o.onNext(this.value);\n          o.onCompleted();\n        } else {\n          o.onCompleted();\n        }\n\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n       */\n      onCompleted: function () {\n        var i, len;\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          var os = cloneArray(this.observers), len = os.length;\n\n          if (this.hasValue) {\n            for (i = 0; i < len; i++) {\n              var o = os[i];\n              o.onNext(this.value);\n              o.onCompleted();\n            }\n          } else {\n            for (i = 0; i < len; i++) {\n              os[i].onCompleted();\n            }\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the error.\n       * @param {Mixed} error The Error to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.hasError = true;\n          this.error = error;\n\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n       * @param {Mixed} value The value to store in the subject.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        this.hasValue = true;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.error = null;\n        this.value = null;\n      }\n    });\n\n    return AsyncSubject;\n  }(Observable));\n\n  var AnonymousSubject = Rx.AnonymousSubject = (function (__super__) {\n    inherits(AnonymousSubject, __super__);\n    function AnonymousSubject(observer, observable) {\n      this.observer = observer;\n      this.observable = observable;\n      __super__.call(this);\n    }\n\n    addProperties(AnonymousSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        return this.observable.subscribe(o);\n      },\n      onCompleted: function () {\n        this.observer.onCompleted();\n      },\n      onError: function (error) {\n        this.observer.onError(error);\n      },\n      onNext: function (value) {\n        this.observer.onNext(value);\n      }\n    });\n\n    return AnonymousSubject;\n  }(Observable));\n\n  /**\n   *  Represents a value that changes over time.\n   *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n   */\n  var BehaviorSubject = Rx.BehaviorSubject = (function (__super__) {\n    inherits(BehaviorSubject, __super__);\n    function BehaviorSubject(value) {\n      __super__.call(this);\n      this.value = value;\n      this.observers = [];\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasError = false;\n    }\n\n    addProperties(BehaviorSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          o.onNext(this.value);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n        } else {\n          o.onCompleted();\n        }\n        return disposableEmpty;\n      },\n      /**\n       * Gets the current value or throws an exception.\n       * Value is frozen after onCompleted is called.\n       * After onError is called always throws the specified exception.\n       * An exception is always thrown after dispose is called.\n       * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n       */\n      getValue: function () {\n        checkDisposed(this);\n        if (this.hasError) { thrower(this.error); }\n        return this.value;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onCompleted();\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.hasError = true;\n        this.error = error;\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onError(error);\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onNext(value);\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.value = null;\n        this.error = null;\n      }\n    });\n\n    return BehaviorSubject;\n  }(Observable));\n\n  /**\n   * Represents an object that is both an observable sequence as well as an observer.\n   * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n   */\n  var ReplaySubject = Rx.ReplaySubject = (function (__super__) {\n\n    var maxSafeInteger = Math.pow(2, 53) - 1;\n\n    function createRemovableDisposable(subject, observer) {\n      return disposableCreate(function () {\n        observer.dispose();\n        !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n      });\n    }\n\n    inherits(ReplaySubject, __super__);\n\n    /**\n     *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n     *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n     *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n     *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n     */\n    function ReplaySubject(bufferSize, windowSize, scheduler) {\n      this.bufferSize = bufferSize == null ? maxSafeInteger : bufferSize;\n      this.windowSize = windowSize == null ? maxSafeInteger : windowSize;\n      this.scheduler = scheduler || currentThreadScheduler;\n      this.q = [];\n      this.observers = [];\n      this.isStopped = false;\n      this.isDisposed = false;\n      this.hasError = false;\n      this.error = null;\n      __super__.call(this);\n    }\n\n    addProperties(ReplaySubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        var so = new ScheduledObserver(this.scheduler, o), subscription = createRemovableDisposable(this, so);\n\n        this._trim(this.scheduler.now());\n        this.observers.push(so);\n\n        for (var i = 0, len = this.q.length; i < len; i++) {\n          so.onNext(this.q[i].value);\n        }\n\n        if (this.hasError) {\n          so.onError(this.error);\n        } else if (this.isStopped) {\n          so.onCompleted();\n        }\n\n        so.ensureActive();\n        return subscription;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      _trim: function (now) {\n        while (this.q.length > this.bufferSize) {\n          this.q.shift();\n        }\n        while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {\n          this.q.shift();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        var now = this.scheduler.now();\n        this.q.push({ interval: now, value: value });\n        this._trim(now);\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onNext(value);\n          observer.ensureActive();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.error = error;\n        this.hasError = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onError(error);\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onCompleted();\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    return ReplaySubject;\n  }(Observable));\n\n  /**\n  * Used to pause and resume streams.\n  */\n  Rx.Pauser = (function (__super__) {\n    inherits(Pauser, __super__);\n    function Pauser() {\n      __super__.call(this);\n    }\n\n    /**\n     * Pauses the underlying sequence.\n     */\n    Pauser.prototype.pause = function () { this.onNext(false); };\n\n    /**\n    * Resumes the underlying sequence.\n    */\n    Pauser.prototype.resume = function () { this.onNext(true); };\n\n    return Pauser;\n  }(Subject));\n\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    root.Rx = Rx;\n\n    define(function() {\n      return Rx;\n    });\n  } else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = Rx).Rx = Rx;\n    } else {\n      freeExports.Rx = Rx;\n    }\n  } else {\n    // in a browser or Rhino\n    root.Rx = Rx;\n  }\n\n  // All code before this point will be filtered from stack traces.\n  var rEndingLine = captureLine();\n\n}.call(this));\n"
  },
  {
    "path": "dist/rx.lite.extras.compat.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite.compat'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite-compat'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // References\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    observableNever = Observable.never,\n    observableThrow = Observable['throw'],\n    AnonymousObservable = Rx.AnonymousObservable,\n    ObservableBase = Rx.ObservableBase,\n    AnonymousObserver = Rx.AnonymousObserver,\n    notificationCreateOnNext = Rx.Notification.createOnNext,\n    notificationCreateOnError = Rx.Notification.createOnError,\n    notificationCreateOnCompleted = Rx.Notification.createOnCompleted,\n    Observer = Rx.Observer,\n    observerCreate = Observer.create,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    Subject = Rx.Subject,\n    internals = Rx.internals,\n    helpers = Rx.helpers,\n    ScheduledObserver = internals.ScheduledObserver,\n    SerialDisposable = Rx.SerialDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    disposableEmpty = Rx.Disposable.empty,\n    immediateScheduler = Rx.Scheduler.immediate,\n    defaultKeySerializer = helpers.defaultKeySerializer,\n    addRef = Rx.internals.addRef,\n    identity = helpers.identity,\n    isPromise = helpers.isPromise,\n    isFunction = helpers.isFunction,\n    inherits = internals.inherits,\n    bindCallback = internals.bindCallback,\n    noop = helpers.noop,\n    isScheduler = Rx.Scheduler.isScheduler,\n    observableFromPromise = Observable.fromPromise,\n    ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  function ScheduledDisposable(scheduler, disposable) {\n    this.scheduler = scheduler;\n    this.disposable = disposable;\n    this.isDisposed = false;\n  }\n\n  function scheduleItem(s, self) {\n    if (!self.isDisposed) {\n      self.isDisposed = true;\n      self.disposable.dispose();\n    }\n  }\n\n  ScheduledDisposable.prototype.dispose = function () {\n    this.scheduler.schedule(this, scheduleItem);\n  };\n\n  var CheckedObserver = (function (__super__) {\n    inherits(CheckedObserver, __super__);\n\n    function CheckedObserver(observer) {\n      __super__.call(this);\n      this._observer = observer;\n      this._state = 0; // 0 - idle, 1 - busy, 2 - done\n    }\n\n    var CheckedObserverPrototype = CheckedObserver.prototype;\n\n    CheckedObserverPrototype.onNext = function (value) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onNext).call(this._observer, value);\n      this._state = 0;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onError = function (err) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onError).call(this._observer, err);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onCompleted = function () {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onCompleted).call(this._observer);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.checkAccess = function () {\n      if (this._state === 1) { throw new Error('Re-entrancy detected'); }\n      if (this._state === 2) { throw new Error('Observer completed'); }\n      if (this._state === 0) { this._state = 1; }\n    };\n\n    return CheckedObserver;\n  }(Observer));\n\n  var ObserveOnObserver = (function (__super__) {\n    inherits(ObserveOnObserver, __super__);\n\n    function ObserveOnObserver(scheduler, observer, cancel) {\n      __super__.call(this, scheduler, observer);\n      this._cancel = cancel;\n    }\n\n    ObserveOnObserver.prototype.next = function (value) {\n      __super__.prototype.next.call(this, value);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.error = function (e) {\n      __super__.prototype.error.call(this, e);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.completed = function () {\n      __super__.prototype.completed.call(this);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this._cancel && this._cancel.dispose();\n      this._cancel = null;\n    };\n\n    return ObserveOnObserver;\n  })(ScheduledObserver);\n\n  /**\n   *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n   *  If a violation is detected, an Error is thrown from the offending observer method call.\n   *\n   * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n   */\n  Observer.prototype.checked = function () { return new CheckedObserver(this); };\n\n  /**\n   * Schedules the invocation of observer methods on the given scheduler.\n   * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n   * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n   */\n  Observer.notifyOn = function (scheduler) {\n    return new ObserveOnObserver(scheduler, this);\n  };\n\n  /**\n  *  Creates an observer from a notification callback.\n  * @param {Function} handler Action that handles a notification.\n  * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n  */\n  Observer.fromNotifier = function (handler, thisArg) {\n    var handlerFunc = bindCallback(handler, thisArg, 1);\n    return new AnonymousObserver(function (x) {\n      return handlerFunc(notificationCreateOnNext(x));\n    }, function (e) {\n      return handlerFunc(notificationCreateOnError(e));\n    }, function () {\n      return handlerFunc(notificationCreateOnCompleted());\n    });\n  };\n\n  /**\n  *  Creates a notification callback from an observer.\n  * @returns The action that forwards its input notification to the underlying observer.\n  */\n  Observer.prototype.toNotifier = function () {\n    var observer = this;\n    return function (n) { return n.accept(observer); };\n  };\n\n  /**\n  *  Hides the identity of an observer.\n  * @returns An observer that hides the identity of the specified observer.\n  */\n  Observer.prototype.asObserver = function () {\n    var source = this;\n    return new AnonymousObserver(\n      function (x) { source.onNext(x); },\n      function (e) { source.onError(e); },\n      function () { source.onCompleted(); }\n    );\n  };\n\nvar ObserveOnObservable = (function (__super__) {\n  inherits(ObserveOnObservable, __super__);\n  function ObserveOnObservable(source, s) {\n    this.source = source;\n    this._s = s;\n    __super__.call(this);\n  }\n\n  ObserveOnObservable.prototype.subscribeCore = function (o) {\n    return this.source.subscribe(new ObserveOnObserver(this._s, o));\n  };\n\n  return ObserveOnObservable;\n}(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n   *\n   *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n   *  that require to be run on a scheduler, use subscribeOn.\n   *\n   *  @param {Scheduler} scheduler Scheduler to notify observers on.\n   *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n   */\n  observableProto.observeOn = function (scheduler) {\n    return new ObserveOnObservable(this, scheduler);\n  };\n\n  var SubscribeOnObservable = (function (__super__) {\n    inherits(SubscribeOnObservable, __super__);\n    function SubscribeOnObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(scheduler, state) {\n      var source = state[0], d = state[1], o = state[2];\n      d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(o)));\n    }\n\n    SubscribeOnObservable.prototype.subscribeCore = function (o) {\n      var m = new SingleAssignmentDisposable(), d = new SerialDisposable();\n      d.setDisposable(m);\n      m.setDisposable(this._s.schedule([this.source, d, o], scheduleMethod));\n      return d;\n    };\n\n    return SubscribeOnObservable;\n  }(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n   *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n   *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n   *  callbacks on a scheduler, use observeOn.\n\n   *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n   *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n   */\n  observableProto.subscribeOn = function (scheduler) {\n    return new SubscribeOnObservable(this, scheduler);\n  };\n\n  var GenerateObservable = (function (__super__) {\n    inherits(GenerateObservable, __super__);\n    function GenerateObservable(state, cndFn, itrFn, resFn, s) {\n      this._initialState = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n      var hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (hasResult === errorObj) { return state.o.onError(hasResult.e); }\n      if (hasResult) {\n        var result = tryCatch(state.self._resFn)(state.newState);\n        if (result === errorObj) { return state.o.onError(result.e); }\n        state.o.onNext(result);\n        recurse(state);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        first: true,\n        newState: this._initialState\n      };\n      return this._s.scheduleRecursive(state, scheduleRecursive);\n    };\n\n    return GenerateObservable;\n  }(ObservableBase));\n\n  /**\n   *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new GenerateObservable(initialState, condition, iterate, resultSelector, scheduler);\n  };\n\n  var UsingObservable = (function (__super__) {\n    inherits(UsingObservable, __super__);\n    function UsingObservable(resFn, obsFn) {\n      this._resFn = resFn;\n      this._obsFn = obsFn;\n      __super__.call(this);\n    }\n\n    UsingObservable.prototype.subscribeCore = function (o) {\n      var disposable = disposableEmpty;\n      var resource = tryCatch(this._resFn)();\n      if (resource === errorObj) {\n        return new BinaryDisposable(observableThrow(resource.e).subscribe(o), disposable);\n      }\n      resource && (disposable = resource);\n      var source = tryCatch(this._obsFn)(resource);\n      if (source === errorObj) {\n        return new BinaryDisposable(observableThrow(source.e).subscribe(o), disposable);\n      }\n      return new BinaryDisposable(source.subscribe(o), disposable);\n    };\n\n    return UsingObservable;\n  }(ObservableBase));\n\n  /**\n   * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n   * @param {Function} resourceFactory Factory function to obtain a resource object.\n   * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n   * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n   */\n  Observable.using = function (resourceFactory, observableFactory) {\n    return new UsingObservable(resourceFactory, observableFactory);\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @param {Observable} rightSource Second observable sequence or Promise.\n   * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n   */\n  observableProto.amb = function (rightSource) {\n    var leftSource = this;\n    return new AnonymousObservable(function (observer) {\n      var choice,\n        leftChoice = 'L', rightChoice = 'R',\n        leftSubscription = new SingleAssignmentDisposable(),\n        rightSubscription = new SingleAssignmentDisposable();\n\n      isPromise(rightSource) && (rightSource = observableFromPromise(rightSource));\n\n      function choiceL() {\n        if (!choice) {\n          choice = leftChoice;\n          rightSubscription.dispose();\n        }\n      }\n\n      function choiceR() {\n        if (!choice) {\n          choice = rightChoice;\n          leftSubscription.dispose();\n        }\n      }\n\n      var leftSubscribe = observerCreate(\n        function (left) {\n          choiceL();\n          choice === leftChoice && observer.onNext(left);\n        },\n        function (e) {\n          choiceL();\n          choice === leftChoice && observer.onError(e);\n        },\n        function () {\n          choiceL();\n          choice === leftChoice && observer.onCompleted();\n        }\n      );\n      var rightSubscribe = observerCreate(\n        function (right) {\n          choiceR();\n          choice === rightChoice && observer.onNext(right);\n        },\n        function (e) {\n          choiceR();\n          choice === rightChoice && observer.onError(e);\n        },\n        function () {\n          choiceR();\n          choice === rightChoice && observer.onCompleted();\n        }\n      );\n\n      leftSubscription.setDisposable(leftSource.subscribe(leftSubscribe));\n      rightSubscription.setDisposable(rightSource.subscribe(rightSubscribe));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    });\n  };\n\n  function amb(p, c) { return p.amb(c); }\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n   */\n  Observable.amb = function () {\n    var acc = observableNever(), items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(items);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    for (var i = 0, len = items.length; i < len; i++) {\n      acc = amb(acc, items[i]);\n    }\n    return acc;\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n   * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n   */\n  observableProto.onErrorResumeNext = function (second) {\n    if (!second) { throw new Error('Second observable is required'); }\n    return onErrorResumeNext([this, second]);\n  };\n\n  var OnErrorResumeNextObservable = (function(__super__) {\n    inherits(OnErrorResumeNextObservable, __super__);\n    function OnErrorResumeNextObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.pos < state.sources.length) {\n        var current = state.sources[state.pos++];\n        isPromise(current) && (current = observableFromPromise(current));\n        var d = new SingleAssignmentDisposable();\n        state.subscription.setDisposable(d);\n        d.setDisposable(current.subscribe(new OnErrorResumeNextObserver(state, recurse)));\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    OnErrorResumeNextObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable(),\n          state = {pos: 0, subscription: subscription, o: o, sources: this.sources },\n          cancellable = immediateScheduler.scheduleRecursive(state, scheduleMethod);\n\n      return new BinaryDisposable(subscription, cancellable);\n    };\n\n    return OnErrorResumeNextObservable;\n  }(ObservableBase));\n\n  var OnErrorResumeNextObserver = (function(__super__) {\n    inherits(OnErrorResumeNextObserver, __super__);\n    function OnErrorResumeNextObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      __super__.call(this);\n    }\n\n    OnErrorResumeNextObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    OnErrorResumeNextObserver.prototype.error = function () { this._recurse(this._state); };\n    OnErrorResumeNextObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return OnErrorResumeNextObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n   */\n  var onErrorResumeNext = Observable.onErrorResumeNext = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      var len = arguments.length;\n      sources = new Array(len);\n      for(var i = 0; i < len; i++) { sources[i] = arguments[i]; }\n    }\n    return new OnErrorResumeNextObservable(sources);\n  };\n\n  function toArray(x) { return x.toArray(); }\n  function notEmpty(x) { return x.length > 0; }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n   * @param {Number} count Length of each buffer.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithCount = observableProto.bufferCount = function (count, skip) {\n    typeof skip !== 'number' && (skip = count);\n    return this.windowWithCount(count, skip)\n      .flatMap(toArray)\n      .filter(notEmpty);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n   * @param {Number} count Length of each window.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithCount = observableProto.windowCount = function (count, skip) {\n    var source = this;\n    +count || (count = 0);\n    Math.abs(count) === Infinity && (count = 0);\n    if (count <= 0) { throw new ArgumentOutOfRangeError(); }\n    skip == null && (skip = count);\n    +skip || (skip = 0);\n    Math.abs(skip) === Infinity && (skip = 0);\n\n    if (skip <= 0) { throw new ArgumentOutOfRangeError(); }\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(),\n        refCountDisposable = new RefCountDisposable(m),\n        n = 0,\n        q = [];\n\n      function createWindow () {\n        var s = new Subject();\n        q.push(s);\n        observer.onNext(addRef(s, refCountDisposable));\n      }\n\n      createWindow();\n\n      m.setDisposable(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n          var c = n - count + 1;\n          c >= 0 && c % skip === 0 && q.shift().onCompleted();\n          ++n % skip === 0 && createWindow();\n        },\n        function (e) {\n          while (q.length > 0) { q.shift().onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          while (q.length > 0) { q.shift().onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  var TakeLastBufferObserver = (function (__super__) {\n    inherits(TakeLastBufferObserver, __super__);\n    function TakeLastBufferObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastBufferObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastBufferObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastBufferObserver.prototype.completed = function () {\n      this._o.onNext(this._q);\n      this._o.onCompleted();\n    };\n\n    return TakeLastBufferObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n   *\n   * @description\n   *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n   *  source sequence, this buffer is produced on the result sequence.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLastBuffer = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastBufferObserver(o, count));\n    }, source);\n  };\n\n  var DefaultIfEmptyObserver = (function (__super__) {\n    inherits(DefaultIfEmptyObserver, __super__);\n    function DefaultIfEmptyObserver(o, d) {\n      this._o = o;\n      this._d = d;\n      this._f = false;\n      __super__.call(this);\n    }\n\n    DefaultIfEmptyObserver.prototype.next = function (x) {\n      this._f = true;\n      this._o.onNext(x);\n    };\n\n    DefaultIfEmptyObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    DefaultIfEmptyObserver.prototype.completed = function () {\n      !this._f && this._o.onNext(this._d);\n      this._o.onCompleted();\n    };\n\n    return DefaultIfEmptyObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n   *\n   *  var res = obs = xs.defaultIfEmpty();\n   *  2 - obs = xs.defaultIfEmpty(false);\n   *\n   * @memberOf Observable#\n   * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n   * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n   */\n    observableProto.defaultIfEmpty = function (defaultValue) {\n      var source = this;\n      defaultValue === undefined && (defaultValue = null);\n      return new AnonymousObservable(function (o) {\n        return source.subscribe(new DefaultIfEmptyObserver(o, defaultValue));\n      }, source);\n    };\n\n  // Swap out for Array.findIndex\n  function arrayIndexOfComparer(array, item, comparer) {\n    for (var i = 0, len = array.length; i < len; i++) {\n      if (comparer(array[i], item)) { return i; }\n    }\n    return -1;\n  }\n\n  function HashSet(comparer) {\n    this.comparer = comparer;\n    this.set = [];\n  }\n  HashSet.prototype.push = function(value) {\n    var retValue = arrayIndexOfComparer(this.set, value, this.comparer) === -1;\n    retValue && this.set.push(value);\n    return retValue;\n  };\n\n  var DistinctObservable = (function (__super__) {\n    inherits(DistinctObservable, __super__);\n    function DistinctObservable(source, keyFn, cmpFn) {\n      this.source = source;\n      this._keyFn = keyFn;\n      this._cmpFn = cmpFn;\n      __super__.call(this);\n    }\n\n    DistinctObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctObserver(o, this._keyFn, this._cmpFn));\n    };\n\n    return DistinctObservable;\n  }(ObservableBase));\n\n  var DistinctObserver = (function (__super__) {\n    inherits(DistinctObserver, __super__);\n    function DistinctObserver(o, keyFn, cmpFn) {\n      this._o = o;\n      this._keyFn = keyFn;\n      this._h = new HashSet(cmpFn);\n      __super__.call(this);\n    }\n\n    DistinctObserver.prototype.next = function (x) {\n      var key = x;\n      if (isFunction(this._keyFn)) {\n        key = tryCatch(this._keyFn)(x);\n        if (key === errorObj) { return this._o.onError(key.e); }\n      }\n      this._h.push(key) && this._o.onNext(x);\n    };\n\n    DistinctObserver.prototype.error = function (e) { this._o.onError(e); };\n    DistinctObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DistinctObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n   *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n   *\n   * @example\n   *  var res = obs = xs.distinct();\n   *  2 - obs = xs.distinct(function (x) { return x.id; });\n   *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n   * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n   * @param {Function} [comparer]  Used to compare items in the collection.\n   * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinct = function (keySelector, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctObservable(this, keySelector, comparer);\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence. This observable sequence\n   * can be resubscribed to, even if all prior subscriptions have ended. (unlike `.publish().refCount()`)\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source.\n   */\n  observableProto.singleInstance = function() {\n    var source = this, hasObservable = false, observable;\n\n    function getObservable() {\n      if (!hasObservable) {\n        hasObservable = true;\n        observable = source['finally'](function() { hasObservable = false; }).publish().refCount();\n      }\n      return observable;\n    }\n\n    return new AnonymousObservable(function(o) {\n      return getObservable().subscribe(o);\n    });\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "dist/rx.lite.extras.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // References\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    observableNever = Observable.never,\n    observableThrow = Observable['throw'],\n    AnonymousObservable = Rx.AnonymousObservable,\n    ObservableBase = Rx.ObservableBase,\n    AnonymousObserver = Rx.AnonymousObserver,\n    notificationCreateOnNext = Rx.Notification.createOnNext,\n    notificationCreateOnError = Rx.Notification.createOnError,\n    notificationCreateOnCompleted = Rx.Notification.createOnCompleted,\n    Observer = Rx.Observer,\n    observerCreate = Observer.create,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    Subject = Rx.Subject,\n    internals = Rx.internals,\n    helpers = Rx.helpers,\n    ScheduledObserver = internals.ScheduledObserver,\n    SerialDisposable = Rx.SerialDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    disposableEmpty = Rx.Disposable.empty,\n    immediateScheduler = Rx.Scheduler.immediate,\n    defaultKeySerializer = helpers.defaultKeySerializer,\n    addRef = Rx.internals.addRef,\n    identity = helpers.identity,\n    isPromise = helpers.isPromise,\n    isFunction = helpers.isFunction,\n    inherits = internals.inherits,\n    bindCallback = internals.bindCallback,\n    noop = helpers.noop,\n    isScheduler = Rx.Scheduler.isScheduler,\n    observableFromPromise = Observable.fromPromise,\n    ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  function ScheduledDisposable(scheduler, disposable) {\n    this.scheduler = scheduler;\n    this.disposable = disposable;\n    this.isDisposed = false;\n  }\n\n  function scheduleItem(s, self) {\n    if (!self.isDisposed) {\n      self.isDisposed = true;\n      self.disposable.dispose();\n    }\n  }\n\n  ScheduledDisposable.prototype.dispose = function () {\n    this.scheduler.schedule(this, scheduleItem);\n  };\n\n  var CheckedObserver = (function (__super__) {\n    inherits(CheckedObserver, __super__);\n\n    function CheckedObserver(observer) {\n      __super__.call(this);\n      this._observer = observer;\n      this._state = 0; // 0 - idle, 1 - busy, 2 - done\n    }\n\n    var CheckedObserverPrototype = CheckedObserver.prototype;\n\n    CheckedObserverPrototype.onNext = function (value) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onNext).call(this._observer, value);\n      this._state = 0;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onError = function (err) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onError).call(this._observer, err);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onCompleted = function () {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onCompleted).call(this._observer);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.checkAccess = function () {\n      if (this._state === 1) { throw new Error('Re-entrancy detected'); }\n      if (this._state === 2) { throw new Error('Observer completed'); }\n      if (this._state === 0) { this._state = 1; }\n    };\n\n    return CheckedObserver;\n  }(Observer));\n\n  var ObserveOnObserver = (function (__super__) {\n    inherits(ObserveOnObserver, __super__);\n\n    function ObserveOnObserver(scheduler, observer, cancel) {\n      __super__.call(this, scheduler, observer);\n      this._cancel = cancel;\n    }\n\n    ObserveOnObserver.prototype.next = function (value) {\n      __super__.prototype.next.call(this, value);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.error = function (e) {\n      __super__.prototype.error.call(this, e);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.completed = function () {\n      __super__.prototype.completed.call(this);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this._cancel && this._cancel.dispose();\n      this._cancel = null;\n    };\n\n    return ObserveOnObserver;\n  })(ScheduledObserver);\n\n  /**\n   *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n   *  If a violation is detected, an Error is thrown from the offending observer method call.\n   *\n   * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n   */\n  Observer.prototype.checked = function () { return new CheckedObserver(this); };\n\n  /**\n   * Schedules the invocation of observer methods on the given scheduler.\n   * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n   * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n   */\n  Observer.notifyOn = function (scheduler) {\n    return new ObserveOnObserver(scheduler, this);\n  };\n\n  /**\n  *  Creates an observer from a notification callback.\n  * @param {Function} handler Action that handles a notification.\n  * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n  */\n  Observer.fromNotifier = function (handler, thisArg) {\n    var handlerFunc = bindCallback(handler, thisArg, 1);\n    return new AnonymousObserver(function (x) {\n      return handlerFunc(notificationCreateOnNext(x));\n    }, function (e) {\n      return handlerFunc(notificationCreateOnError(e));\n    }, function () {\n      return handlerFunc(notificationCreateOnCompleted());\n    });\n  };\n\n  /**\n  *  Creates a notification callback from an observer.\n  * @returns The action that forwards its input notification to the underlying observer.\n  */\n  Observer.prototype.toNotifier = function () {\n    var observer = this;\n    return function (n) { return n.accept(observer); };\n  };\n\n  /**\n  *  Hides the identity of an observer.\n  * @returns An observer that hides the identity of the specified observer.\n  */\n  Observer.prototype.asObserver = function () {\n    var source = this;\n    return new AnonymousObserver(\n      function (x) { source.onNext(x); },\n      function (e) { source.onError(e); },\n      function () { source.onCompleted(); }\n    );\n  };\n\nvar ObserveOnObservable = (function (__super__) {\n  inherits(ObserveOnObservable, __super__);\n  function ObserveOnObservable(source, s) {\n    this.source = source;\n    this._s = s;\n    __super__.call(this);\n  }\n\n  ObserveOnObservable.prototype.subscribeCore = function (o) {\n    return this.source.subscribe(new ObserveOnObserver(this._s, o));\n  };\n\n  return ObserveOnObservable;\n}(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n   *\n   *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n   *  that require to be run on a scheduler, use subscribeOn.\n   *\n   *  @param {Scheduler} scheduler Scheduler to notify observers on.\n   *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n   */\n  observableProto.observeOn = function (scheduler) {\n    return new ObserveOnObservable(this, scheduler);\n  };\n\n  var SubscribeOnObservable = (function (__super__) {\n    inherits(SubscribeOnObservable, __super__);\n    function SubscribeOnObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(scheduler, state) {\n      var source = state[0], d = state[1], o = state[2];\n      d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(o)));\n    }\n\n    SubscribeOnObservable.prototype.subscribeCore = function (o) {\n      var m = new SingleAssignmentDisposable(), d = new SerialDisposable();\n      d.setDisposable(m);\n      m.setDisposable(this._s.schedule([this.source, d, o], scheduleMethod));\n      return d;\n    };\n\n    return SubscribeOnObservable;\n  }(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n   *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n   *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n   *  callbacks on a scheduler, use observeOn.\n\n   *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n   *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n   */\n  observableProto.subscribeOn = function (scheduler) {\n    return new SubscribeOnObservable(this, scheduler);\n  };\n\n  var GenerateObservable = (function (__super__) {\n    inherits(GenerateObservable, __super__);\n    function GenerateObservable(state, cndFn, itrFn, resFn, s) {\n      this._initialState = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n      var hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (hasResult === errorObj) { return state.o.onError(hasResult.e); }\n      if (hasResult) {\n        var result = tryCatch(state.self._resFn)(state.newState);\n        if (result === errorObj) { return state.o.onError(result.e); }\n        state.o.onNext(result);\n        recurse(state);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        first: true,\n        newState: this._initialState\n      };\n      return this._s.scheduleRecursive(state, scheduleRecursive);\n    };\n\n    return GenerateObservable;\n  }(ObservableBase));\n\n  /**\n   *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new GenerateObservable(initialState, condition, iterate, resultSelector, scheduler);\n  };\n\n  var UsingObservable = (function (__super__) {\n    inherits(UsingObservable, __super__);\n    function UsingObservable(resFn, obsFn) {\n      this._resFn = resFn;\n      this._obsFn = obsFn;\n      __super__.call(this);\n    }\n\n    UsingObservable.prototype.subscribeCore = function (o) {\n      var disposable = disposableEmpty;\n      var resource = tryCatch(this._resFn)();\n      if (resource === errorObj) {\n        return new BinaryDisposable(observableThrow(resource.e).subscribe(o), disposable);\n      }\n      resource && (disposable = resource);\n      var source = tryCatch(this._obsFn)(resource);\n      if (source === errorObj) {\n        return new BinaryDisposable(observableThrow(source.e).subscribe(o), disposable);\n      }\n      return new BinaryDisposable(source.subscribe(o), disposable);\n    };\n\n    return UsingObservable;\n  }(ObservableBase));\n\n  /**\n   * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n   * @param {Function} resourceFactory Factory function to obtain a resource object.\n   * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n   * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n   */\n  Observable.using = function (resourceFactory, observableFactory) {\n    return new UsingObservable(resourceFactory, observableFactory);\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @param {Observable} rightSource Second observable sequence or Promise.\n   * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n   */\n  observableProto.amb = function (rightSource) {\n    var leftSource = this;\n    return new AnonymousObservable(function (observer) {\n      var choice,\n        leftChoice = 'L', rightChoice = 'R',\n        leftSubscription = new SingleAssignmentDisposable(),\n        rightSubscription = new SingleAssignmentDisposable();\n\n      isPromise(rightSource) && (rightSource = observableFromPromise(rightSource));\n\n      function choiceL() {\n        if (!choice) {\n          choice = leftChoice;\n          rightSubscription.dispose();\n        }\n      }\n\n      function choiceR() {\n        if (!choice) {\n          choice = rightChoice;\n          leftSubscription.dispose();\n        }\n      }\n\n      var leftSubscribe = observerCreate(\n        function (left) {\n          choiceL();\n          choice === leftChoice && observer.onNext(left);\n        },\n        function (e) {\n          choiceL();\n          choice === leftChoice && observer.onError(e);\n        },\n        function () {\n          choiceL();\n          choice === leftChoice && observer.onCompleted();\n        }\n      );\n      var rightSubscribe = observerCreate(\n        function (right) {\n          choiceR();\n          choice === rightChoice && observer.onNext(right);\n        },\n        function (e) {\n          choiceR();\n          choice === rightChoice && observer.onError(e);\n        },\n        function () {\n          choiceR();\n          choice === rightChoice && observer.onCompleted();\n        }\n      );\n\n      leftSubscription.setDisposable(leftSource.subscribe(leftSubscribe));\n      rightSubscription.setDisposable(rightSource.subscribe(rightSubscribe));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    });\n  };\n\n  function amb(p, c) { return p.amb(c); }\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n   */\n  Observable.amb = function () {\n    var acc = observableNever(), items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(items);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    for (var i = 0, len = items.length; i < len; i++) {\n      acc = amb(acc, items[i]);\n    }\n    return acc;\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n   * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n   */\n  observableProto.onErrorResumeNext = function (second) {\n    if (!second) { throw new Error('Second observable is required'); }\n    return onErrorResumeNext([this, second]);\n  };\n\n  var OnErrorResumeNextObservable = (function(__super__) {\n    inherits(OnErrorResumeNextObservable, __super__);\n    function OnErrorResumeNextObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.pos < state.sources.length) {\n        var current = state.sources[state.pos++];\n        isPromise(current) && (current = observableFromPromise(current));\n        var d = new SingleAssignmentDisposable();\n        state.subscription.setDisposable(d);\n        d.setDisposable(current.subscribe(new OnErrorResumeNextObserver(state, recurse)));\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    OnErrorResumeNextObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable(),\n          state = {pos: 0, subscription: subscription, o: o, sources: this.sources },\n          cancellable = immediateScheduler.scheduleRecursive(state, scheduleMethod);\n\n      return new BinaryDisposable(subscription, cancellable);\n    };\n\n    return OnErrorResumeNextObservable;\n  }(ObservableBase));\n\n  var OnErrorResumeNextObserver = (function(__super__) {\n    inherits(OnErrorResumeNextObserver, __super__);\n    function OnErrorResumeNextObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      __super__.call(this);\n    }\n\n    OnErrorResumeNextObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    OnErrorResumeNextObserver.prototype.error = function () { this._recurse(this._state); };\n    OnErrorResumeNextObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return OnErrorResumeNextObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n   */\n  var onErrorResumeNext = Observable.onErrorResumeNext = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      var len = arguments.length;\n      sources = new Array(len);\n      for(var i = 0; i < len; i++) { sources[i] = arguments[i]; }\n    }\n    return new OnErrorResumeNextObservable(sources);\n  };\n\n  function toArray(x) { return x.toArray(); }\n  function notEmpty(x) { return x.length > 0; }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n   * @param {Number} count Length of each buffer.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithCount = observableProto.bufferCount = function (count, skip) {\n    typeof skip !== 'number' && (skip = count);\n    return this.windowWithCount(count, skip)\n      .flatMap(toArray)\n      .filter(notEmpty);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n   * @param {Number} count Length of each window.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithCount = observableProto.windowCount = function (count, skip) {\n    var source = this;\n    +count || (count = 0);\n    Math.abs(count) === Infinity && (count = 0);\n    if (count <= 0) { throw new ArgumentOutOfRangeError(); }\n    skip == null && (skip = count);\n    +skip || (skip = 0);\n    Math.abs(skip) === Infinity && (skip = 0);\n\n    if (skip <= 0) { throw new ArgumentOutOfRangeError(); }\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(),\n        refCountDisposable = new RefCountDisposable(m),\n        n = 0,\n        q = [];\n\n      function createWindow () {\n        var s = new Subject();\n        q.push(s);\n        observer.onNext(addRef(s, refCountDisposable));\n      }\n\n      createWindow();\n\n      m.setDisposable(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n          var c = n - count + 1;\n          c >= 0 && c % skip === 0 && q.shift().onCompleted();\n          ++n % skip === 0 && createWindow();\n        },\n        function (e) {\n          while (q.length > 0) { q.shift().onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          while (q.length > 0) { q.shift().onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  var TakeLastBufferObserver = (function (__super__) {\n    inherits(TakeLastBufferObserver, __super__);\n    function TakeLastBufferObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastBufferObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastBufferObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastBufferObserver.prototype.completed = function () {\n      this._o.onNext(this._q);\n      this._o.onCompleted();\n    };\n\n    return TakeLastBufferObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n   *\n   * @description\n   *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n   *  source sequence, this buffer is produced on the result sequence.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLastBuffer = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastBufferObserver(o, count));\n    }, source);\n  };\n\n  var DefaultIfEmptyObserver = (function (__super__) {\n    inherits(DefaultIfEmptyObserver, __super__);\n    function DefaultIfEmptyObserver(o, d) {\n      this._o = o;\n      this._d = d;\n      this._f = false;\n      __super__.call(this);\n    }\n\n    DefaultIfEmptyObserver.prototype.next = function (x) {\n      this._f = true;\n      this._o.onNext(x);\n    };\n\n    DefaultIfEmptyObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    DefaultIfEmptyObserver.prototype.completed = function () {\n      !this._f && this._o.onNext(this._d);\n      this._o.onCompleted();\n    };\n\n    return DefaultIfEmptyObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n   *\n   *  var res = obs = xs.defaultIfEmpty();\n   *  2 - obs = xs.defaultIfEmpty(false);\n   *\n   * @memberOf Observable#\n   * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n   * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n   */\n    observableProto.defaultIfEmpty = function (defaultValue) {\n      var source = this;\n      defaultValue === undefined && (defaultValue = null);\n      return new AnonymousObservable(function (o) {\n        return source.subscribe(new DefaultIfEmptyObserver(o, defaultValue));\n      }, source);\n    };\n\n  // Swap out for Array.findIndex\n  function arrayIndexOfComparer(array, item, comparer) {\n    for (var i = 0, len = array.length; i < len; i++) {\n      if (comparer(array[i], item)) { return i; }\n    }\n    return -1;\n  }\n\n  function HashSet(comparer) {\n    this.comparer = comparer;\n    this.set = [];\n  }\n  HashSet.prototype.push = function(value) {\n    var retValue = arrayIndexOfComparer(this.set, value, this.comparer) === -1;\n    retValue && this.set.push(value);\n    return retValue;\n  };\n\n  var DistinctObservable = (function (__super__) {\n    inherits(DistinctObservable, __super__);\n    function DistinctObservable(source, keyFn, cmpFn) {\n      this.source = source;\n      this._keyFn = keyFn;\n      this._cmpFn = cmpFn;\n      __super__.call(this);\n    }\n\n    DistinctObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctObserver(o, this._keyFn, this._cmpFn));\n    };\n\n    return DistinctObservable;\n  }(ObservableBase));\n\n  var DistinctObserver = (function (__super__) {\n    inherits(DistinctObserver, __super__);\n    function DistinctObserver(o, keyFn, cmpFn) {\n      this._o = o;\n      this._keyFn = keyFn;\n      this._h = new HashSet(cmpFn);\n      __super__.call(this);\n    }\n\n    DistinctObserver.prototype.next = function (x) {\n      var key = x;\n      if (isFunction(this._keyFn)) {\n        key = tryCatch(this._keyFn)(x);\n        if (key === errorObj) { return this._o.onError(key.e); }\n      }\n      this._h.push(key) && this._o.onNext(x);\n    };\n\n    DistinctObserver.prototype.error = function (e) { this._o.onError(e); };\n    DistinctObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DistinctObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n   *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n   *\n   * @example\n   *  var res = obs = xs.distinct();\n   *  2 - obs = xs.distinct(function (x) { return x.id; });\n   *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n   * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n   * @param {Function} [comparer]  Used to compare items in the collection.\n   * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinct = function (keySelector, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctObservable(this, keySelector, comparer);\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence. This observable sequence\n   * can be resubscribed to, even if all prior subscriptions have ended. (unlike `.publish().refCount()`)\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source.\n   */\n  observableProto.singleInstance = function() {\n    var source = this, hasObservable = false, observable;\n\n    function getObservable() {\n      if (!hasObservable) {\n        hasObservable = true;\n        observable = source['finally'](function() { hasObservable = false; }).publish().refCount();\n      }\n      return observable;\n    }\n\n    return new AnonymousObservable(function(o) {\n      return getObservable().subscribe(o);\n    });\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "dist/rx.lite.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (undefined) {\n\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  var Rx = {\n    internals: {},\n    config: {\n      Promise: root.Promise\n    },\n    helpers: { }\n  };\n\n  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    defaultNow = Rx.helpers.defaultNow = Date.now,\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.subscribe !== 'function' && typeof p.then === 'function'; },\n    isFunction = Rx.helpers.isFunction = (function () {\n\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      };\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n\n      return isFn;\n    }());\n\n    function cloneArray(arr) {\n      var len = arr.length, a = new Array(len);\n      for(var i = 0; i < len; i++) { a[i] = arr[i]; }\n      return a;\n    }\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  Rx.config.longStackSupport = false;\n  var hasStacks = false, stacks = tryCatch(function () { throw new Error(); })();\n  hasStacks = !!stacks.e && !!stacks.e.stack;\n\n  // All code after this point will be filtered from stack traces reported by RxJS\n  var rStartingLine = captureLine(), rFileName;\n\n  var STACK_JUMP_SEPARATOR = 'From previous event:';\n\n  function makeStackTraceLong(error, observable) {\n    // If possible, transform the error stack trace by removing Node and RxJS\n    // cruft, then concatenating with the stack trace of `observable`.\n    if (hasStacks &&\n        observable.stack &&\n        typeof error === 'object' &&\n        error !== null &&\n        error.stack &&\n        error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n    ) {\n      var stacks = [];\n      for (var o = observable; !!o; o = o.source) {\n        if (o.stack) {\n          stacks.unshift(o.stack);\n        }\n      }\n      stacks.unshift(error.stack);\n\n      var concatedStacks = stacks.join('\\n' + STACK_JUMP_SEPARATOR + '\\n');\n      error.stack = filterStackString(concatedStacks);\n    }\n  }\n\n  function filterStackString(stackString) {\n    var lines = stackString.split('\\n'), desiredLines = [];\n    for (var i = 0, len = lines.length; i < len; i++) {\n      var line = lines[i];\n\n      if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n        desiredLines.push(line);\n      }\n    }\n    return desiredLines.join('\\n');\n  }\n\n  function isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n    if (!fileNameAndLineNumber) {\n      return false;\n    }\n    var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === rFileName &&\n      lineNumber >= rStartingLine &&\n      lineNumber <= rEndingLine;\n  }\n\n  function isNodeFrame(stackLine) {\n    return stackLine.indexOf('(module.js:') !== -1 ||\n      stackLine.indexOf('(node.js:') !== -1;\n  }\n\n  function captureLine() {\n    if (!hasStacks) { return; }\n\n    try {\n      throw new Error();\n    } catch (e) {\n      var lines = e.stack.split('\\n');\n      var firstLine = lines[0].indexOf('@') > 0 ? lines[1] : lines[2];\n      var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n      if (!fileNameAndLineNumber) { return; }\n\n      rFileName = fileNameAndLineNumber[0];\n      return fileNameAndLineNumber[1];\n    }\n  }\n\n  function getFileNameAndLineNumber(stackLine) {\n    // Named functions: 'at functionName (filename:lineNumber:columnNumber)'\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }\n\n    // Anonymous functions: 'at filename:lineNumber:columnNumber'\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }\n\n    // Firefox style: 'function@filename:lineNumber or @filename:lineNumber'\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }\n  }\n\n  var EmptyError = Rx.EmptyError = function() {\n    this.message = 'Sequence contains no elements.';\n    Error.call(this);\n  };\n  EmptyError.prototype = Object.create(Error.prototype);\n  EmptyError.prototype.name = 'EmptyError';\n\n  var ObjectDisposedError = Rx.ObjectDisposedError = function() {\n    this.message = 'Object has been disposed';\n    Error.call(this);\n  };\n  ObjectDisposedError.prototype = Object.create(Error.prototype);\n  ObjectDisposedError.prototype.name = 'ObjectDisposedError';\n\n  var ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError = function () {\n    this.message = 'Argument out of range';\n    Error.call(this);\n  };\n  ArgumentOutOfRangeError.prototype = Object.create(Error.prototype);\n  ArgumentOutOfRangeError.prototype.name = 'ArgumentOutOfRangeError';\n\n  var NotSupportedError = Rx.NotSupportedError = function (message) {\n    this.message = message || 'This operation is not supported';\n    Error.call(this);\n  };\n  NotSupportedError.prototype = Object.create(Error.prototype);\n  NotSupportedError.prototype.name = 'NotSupportedError';\n\n  var NotImplementedError = Rx.NotImplementedError = function (message) {\n    this.message = message || 'This operation is not implemented';\n    Error.call(this);\n  };\n  NotImplementedError.prototype = Object.create(Error.prototype);\n  NotImplementedError.prototype.name = 'NotImplementedError';\n\n  var notImplemented = Rx.helpers.notImplemented = function () {\n    throw new NotImplementedError();\n  };\n\n  var notSupported = Rx.helpers.notSupported = function () {\n    throw new NotSupportedError();\n  };\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o && o[$iterator$] !== undefined;\n  };\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  };\n\n  Rx.helpers.iterator = $iterator$;\n\n  var bindCallback = Rx.internals.bindCallback = function (func, thisArg, argCount) {\n    if (typeof thisArg === 'undefined') { return func; }\n    switch(argCount) {\n      case 0:\n        return function() {\n          return func.call(thisArg)\n        };\n      case 1:\n        return function(arg) {\n          return func.call(thisArg, arg);\n        };\n      case 2:\n        return function(value, index) {\n          return func.call(thisArg, value, index);\n        };\n      case 3:\n        return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n    }\n\n    return function() {\n      return func.apply(thisArg, arguments);\n    };\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var dontEnums = ['toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'],\n  dontEnumsLength = dontEnums.length;\n\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\nvar objectProto = Object.prototype,\n    hasOwnProperty = objectProto.hasOwnProperty,\n    objToString = objectProto.toString,\n    MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\nvar keys = Object.keys || (function() {\n    var hasOwnProperty = Object.prototype.hasOwnProperty,\n        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),\n        dontEnums = [\n          'toString',\n          'toLocaleString',\n          'valueOf',\n          'hasOwnProperty',\n          'isPrototypeOf',\n          'propertyIsEnumerable',\n          'constructor'\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    return function(obj) {\n      if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n        throw new TypeError('Object.keys called on non-object');\n      }\n\n      var result = [], prop, i;\n\n      for (prop in obj) {\n        if (hasOwnProperty.call(obj, prop)) {\n          result.push(prop);\n        }\n      }\n\n      if (hasDontEnumBug) {\n        for (i = 0; i < dontEnumsLength; i++) {\n          if (hasOwnProperty.call(obj, dontEnums[i])) {\n            result.push(dontEnums[i]);\n          }\n        }\n      }\n      return result;\n    };\n  }());\n\nfunction equalObjects(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objProps = keys(object),\n      objLength = objProps.length,\n      othProps = keys(other),\n      othLength = othProps.length;\n\n  if (objLength !== othLength && !isLoose) {\n    return false;\n  }\n  var index = objLength, key;\n  while (index--) {\n    key = objProps[index];\n    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  var skipCtor = isLoose;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key],\n        result;\n\n    if (!(result === undefined ? equalFunc(objValue, othValue, isLoose, stackA, stackB) : result)) {\n      return false;\n    }\n    skipCtor || (skipCtor = key === 'constructor');\n  }\n  if (!skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    if (objCtor !== othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor === 'function' && objCtor instanceof objCtor &&\n          typeof othCtor === 'function' && othCtor instanceof othCtor)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction equalByTag(object, other, tag) {\n  switch (tag) {\n    case boolTag:\n    case dateTag:\n      return +object === +other;\n\n    case errorTag:\n      return object.name === other.name && object.message === other.message;\n\n    case numberTag:\n      return (object !== +object) ?\n        other !== +other :\n        object === +other;\n\n    case regexpTag:\n    case stringTag:\n      return object === (other + '');\n  }\n  return false;\n}\n\nvar isObject = Rx.internals.isObject = function(value) {\n  var type = typeof value;\n  return !!value && (type === 'object' || type === 'function');\n};\n\nfunction isObjectLike(value) {\n  return !!value && typeof value === 'object';\n}\n\nfunction isLength(value) {\n  return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nvar isHostObject = (function() {\n  try {\n    Object({ 'toString': 0 } + '');\n  } catch(e) {\n    return function() { return false; };\n  }\n  return function(value) {\n    return typeof value.toString !== 'function' && typeof (value + '') === 'string';\n  };\n}());\n\nfunction isTypedArray(value) {\n  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nvar isArray = Array.isArray || function(value) {\n  return isObjectLike(value) && isLength(value.length) && objToString.call(value) === arrayTag;\n};\n\nfunction arraySome (array, predicate) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction equalArrays(array, other, equalFunc, isLoose, stackA, stackB) {\n  var index = -1,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength !== othLength && !(isLoose && othLength > arrLength)) {\n    return false;\n  }\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index],\n        result;\n\n    if (result !== undefined) {\n      if (result) {\n        continue;\n      }\n      return false;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (isLoose) {\n      if (!arraySome(other, function(othValue) {\n            return arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB);\n          })) {\n        return false;\n      }\n    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB))) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction baseIsEqualDeep(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = arrayTag,\n      othTag = arrayTag;\n\n  if (!objIsArr) {\n    objTag = objToString.call(object);\n    if (objTag === argsTag) {\n      objTag = objectTag;\n    } else if (objTag !== objectTag) {\n      objIsArr = isTypedArray(object);\n    }\n  }\n  if (!othIsArr) {\n    othTag = objToString.call(other);\n    if (othTag === argsTag) {\n      othTag = objectTag;\n    }\n  }\n  var objIsObj = objTag === objectTag && !isHostObject(object),\n      othIsObj = othTag === objectTag && !isHostObject(other),\n      isSameTag = objTag === othTag;\n\n  if (isSameTag && !(objIsArr || objIsObj)) {\n    return equalByTag(object, other, objTag);\n  }\n  if (!isLoose) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, isLoose, stackA, stackB);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  // For more information on detecting circular references see https://es5.github.io/#JO.\n  stackA || (stackA = []);\n  stackB || (stackB = []);\n\n  var length = stackA.length;\n  while (length--) {\n    if (stackA[length] === object) {\n      return stackB[length] === other;\n    }\n  }\n  // Add `object` and `other` to the stack of traversed objects.\n  stackA.push(object);\n  stackB.push(other);\n\n  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, isLoose, stackA, stackB);\n\n  stackA.pop();\n  stackB.pop();\n\n  return result;\n}\n\nfunction baseIsEqual(value, other, isLoose, stackA, stackB) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, baseIsEqual, isLoose, stackA, stackB);\n}\n\nvar isEqual = Rx.internals.isEqual = function (value, other) {\n  return baseIsEqual(value, other);\n};\n\n  var hasProp = {}.hasOwnProperty,\n      slice = Array.prototype.slice;\n\n  var inherits = Rx.internals.inherits = function (child, parent) {\n    function __() { this.constructor = child; }\n    __.prototype = parent.prototype;\n    child.prototype = new __();\n  };\n\n  var addProperties = Rx.internals.addProperties = function (obj) {\n    for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n      var source = sources[idx];\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n  };\n\n  // Rx Utils\n  var addRef = Rx.internals.addRef = function (xs, r) {\n    return new AnonymousObservable(function (observer) {\n      return new BinaryDisposable(r.getDisposable(), xs.subscribe(observer));\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n\n  /**\n   * Represents a group of disposable resources that are disposed together.\n   * @constructor\n   */\n  var CompositeDisposable = Rx.CompositeDisposable = function () {\n    var args = [], i, len;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      len = arguments.length;\n      args = new Array(len);\n      for(i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    this.disposables = args;\n    this.isDisposed = false;\n    this.length = args.length;\n  };\n\n  var CompositeDisposablePrototype = CompositeDisposable.prototype;\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Mixed} item Disposable to add.\n   */\n  CompositeDisposablePrototype.add = function (item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n      this.length++;\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Mixed} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n  CompositeDisposablePrototype.remove = function (item) {\n    var shouldDispose = false;\n    if (!this.isDisposed) {\n      var idx = this.disposables.indexOf(item);\n      if (idx !== -1) {\n        shouldDispose = true;\n        this.disposables.splice(idx, 1);\n        this.length--;\n        item.dispose();\n      }\n    }\n    return shouldDispose;\n  };\n\n  /**\n   *  Disposes all disposables in the group and removes them from the group.\n   */\n  CompositeDisposablePrototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var len = this.disposables.length, currentDisposables = new Array(len);\n      for(var i = 0; i < len; i++) { currentDisposables[i] = this.disposables[i]; }\n      this.disposables = [];\n      this.length = 0;\n\n      for (i = 0; i < len; i++) {\n        currentDisposables[i].dispose();\n      }\n    }\n  };\n\n  /**\n   * Provides a set of static methods for creating Disposables.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   */\n  var Disposable = Rx.Disposable = function (action) {\n    this.isDisposed = false;\n    this.action = action || noop;\n  };\n\n  /** Performs the task of cleaning up resources. */\n  Disposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.action();\n      this.isDisposed = true;\n    }\n  };\n\n  /**\n   * Creates a disposable object that invokes the specified action when disposed.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   * @return {Disposable} The disposable object that runs the given action upon disposal.\n   */\n  var disposableCreate = Disposable.create = function (action) { return new Disposable(action); };\n\n  /**\n   * Gets the disposable that does nothing when disposed.\n   */\n  var disposableEmpty = Disposable.empty = { dispose: noop };\n\n  /**\n   * Validates whether the given object is a disposable\n   * @param {Object} Object to test whether it has a dispose method\n   * @returns {Boolean} true if a disposable object, else false.\n   */\n  var isDisposable = Disposable.isDisposable = function (d) {\n    return d && isFunction(d.dispose);\n  };\n\n  var checkDisposed = Disposable.checkDisposed = function (disposable) {\n    if (disposable.isDisposed) { throw new ObjectDisposedError(); }\n  };\n\n  var disposableFixup = Disposable._fixup = function (result) {\n    return isDisposable(result) ? result : disposableEmpty;\n  };\n\n  // Single assignment\n  var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SingleAssignmentDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SingleAssignmentDisposable.prototype.setDisposable = function (value) {\n    if (this.current) { throw new Error('Disposable has already been assigned'); }\n    var shouldDispose = this.isDisposed;\n    !shouldDispose && (this.current = value);\n    shouldDispose && value && value.dispose();\n  };\n  SingleAssignmentDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n      old && old.dispose();\n    }\n  };\n\n  // Multiple assignment disposable\n  var SerialDisposable = Rx.SerialDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SerialDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SerialDisposable.prototype.setDisposable = function (value) {\n    var shouldDispose = this.isDisposed;\n    if (!shouldDispose) {\n      var old = this.current;\n      this.current = value;\n    }\n    old && old.dispose();\n    shouldDispose && value && value.dispose();\n  };\n  SerialDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n    }\n    old && old.dispose();\n  };\n\n  var BinaryDisposable = Rx.BinaryDisposable = function (first, second) {\n    this._first = first;\n    this._second = second;\n    this.isDisposed = false;\n  };\n\n  BinaryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old1 = this._first;\n      this._first = null;\n      old1 && old1.dispose();\n      var old2 = this._second;\n      this._second = null;\n      old2 && old2.dispose();\n    }\n  };\n\n  var NAryDisposable = Rx.NAryDisposable = function (disposables) {\n    this._disposables = disposables;\n    this.isDisposed = false;\n  };\n\n  NAryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      for (var i = 0, len = this._disposables.length; i < len; i++) {\n        this._disposables[i].dispose();\n      }\n      this._disposables.length = 0;\n    }\n  };\n\n  /**\n   * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n   */\n  var RefCountDisposable = Rx.RefCountDisposable = (function () {\n\n    function InnerDisposable(disposable) {\n      this.disposable = disposable;\n      this.disposable.count++;\n      this.isInnerDisposed = false;\n    }\n\n    InnerDisposable.prototype.dispose = function () {\n      if (!this.disposable.isDisposed && !this.isInnerDisposed) {\n        this.isInnerDisposed = true;\n        this.disposable.count--;\n        if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {\n          this.disposable.isDisposed = true;\n          this.disposable.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Initializes a new instance of the RefCountDisposable with the specified disposable.\n     * @constructor\n     * @param {Disposable} disposable Underlying disposable.\n      */\n    function RefCountDisposable(disposable) {\n      this.underlyingDisposable = disposable;\n      this.isDisposed = false;\n      this.isPrimaryDisposed = false;\n      this.count = 0;\n    }\n\n    /**\n     * Disposes the underlying disposable only when all dependent disposables have been disposed\n     */\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed && !this.isPrimaryDisposed) {\n        this.isPrimaryDisposed = true;\n        if (this.count === 0) {\n          this.isDisposed = true;\n          this.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n     * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n     */\n    RefCountDisposable.prototype.getDisposable = function () {\n      return this.isDisposed ? disposableEmpty : new InnerDisposable(this);\n    };\n\n    return RefCountDisposable;\n  })();\n\n  var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) {\n    this.scheduler = scheduler;\n    this.state = state;\n    this.action = action;\n    this.dueTime = dueTime;\n    this.comparer = comparer || defaultSubComparer;\n    this.disposable = new SingleAssignmentDisposable();\n  };\n\n  ScheduledItem.prototype.invoke = function () {\n    this.disposable.setDisposable(this.invokeCore());\n  };\n\n  ScheduledItem.prototype.compareTo = function (other) {\n    return this.comparer(this.dueTime, other.dueTime);\n  };\n\n  ScheduledItem.prototype.isCancelled = function () {\n    return this.disposable.isDisposed;\n  };\n\n  ScheduledItem.prototype.invokeCore = function () {\n    return disposableFixup(this.action(this.scheduler, this.state));\n  };\n\n  /** Provides a set of static properties to access commonly used schedulers. */\n  var Scheduler = Rx.Scheduler = (function () {\n\n    function Scheduler() { }\n\n    /** Determines whether the given object is a scheduler */\n    Scheduler.isScheduler = function (s) {\n      return s instanceof Scheduler;\n    };\n\n    var schedulerProto = Scheduler.prototype;\n\n    /**\n   * Schedules an action to be executed.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.schedule = function (state, action) {\n      throw new NotImplementedError();\n    };\n\n  /**\n   * Schedules an action to be executed after dueTime.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @param {Number} dueTime Relative time after which to execute the action.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime;\n      dt instanceof Date && (dt = dt - this.now());\n      dt = Scheduler.normalize(dt);\n\n      if (dt === 0) { return this.schedule(state, action); }\n\n      return this._scheduleFuture(state, dt, action);\n    };\n\n    schedulerProto._scheduleFuture = function (state, dueTime, action) {\n      throw new NotImplementedError();\n    };\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.now = defaultNow;\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.prototype.now = defaultNow;\n\n    /**\n     * Normalizes the specified TimeSpan value to a positive value.\n     * @param {Number} timeSpan The time span value to normalize.\n     * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n     */\n    Scheduler.normalize = function (timeSpan) {\n      timeSpan < 0 && (timeSpan = 0);\n      return timeSpan;\n    };\n\n    return Scheduler;\n  }());\n\n  var normalizeTime = Scheduler.normalize, isScheduler = Scheduler.isScheduler;\n\n  (function (schedulerProto) {\n\n    function invokeRecImmediate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.schedule(state2, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    function invokeRecDate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2, dueTime1) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.scheduleFuture(state2, dueTime1, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursive = function (state, action) {\n      return this.schedule([state, action], invokeRecImmediate);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative or absolute due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number | Date} dueTime Relative or absolute time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveFuture = function (state, dueTime, action) {\n      return this.scheduleFuture([state, action], dueTime, invokeRecDate);\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    schedulerProto.schedulePeriodic = function(state, period, action) {\n      if (typeof root.setInterval === 'undefined') { throw new NotSupportedError(); }\n      period = normalizeTime(period);\n      var s = state, id = root.setInterval(function () { s = action(s); }, period);\n      return disposableCreate(function () { root.clearInterval(id); });\n    };\n\n  }(Scheduler.prototype));\n\n  /** Gets a scheduler that schedules work immediately on the current thread. */\n   var ImmediateScheduler = (function (__super__) {\n    inherits(ImmediateScheduler, __super__);\n    function ImmediateScheduler() {\n      __super__.call(this);\n    }\n\n    ImmediateScheduler.prototype.schedule = function (state, action) {\n      return disposableFixup(action(this, state));\n    };\n\n    return ImmediateScheduler;\n  }(Scheduler));\n\n  var immediateScheduler = Scheduler.immediate = new ImmediateScheduler();\n\n  /**\n   * Gets a scheduler that schedules work as soon as possible on the current thread.\n   */\n  var CurrentThreadScheduler = (function (__super__) {\n    var queue;\n\n    function runTrampoline () {\n      while (queue.length > 0) {\n        var item = queue.dequeue();\n        !item.isCancelled() && item.invoke();\n      }\n    }\n\n    inherits(CurrentThreadScheduler, __super__);\n    function CurrentThreadScheduler() {\n      __super__.call(this);\n    }\n\n    CurrentThreadScheduler.prototype.schedule = function (state, action) {\n      var si = new ScheduledItem(this, state, action, this.now());\n\n      if (!queue) {\n        queue = new PriorityQueue(4);\n        queue.enqueue(si);\n\n        var result = tryCatch(runTrampoline)();\n        queue = null;\n        if (result === errorObj) { thrower(result.e); }\n      } else {\n        queue.enqueue(si);\n      }\n      return si.disposable;\n    };\n\n    CurrentThreadScheduler.prototype.scheduleRequired = function () { return !queue; };\n\n    return CurrentThreadScheduler;\n  }(Scheduler));\n\n  var currentThreadScheduler = Scheduler.currentThread = new CurrentThreadScheduler();\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function createTick(self) {\n      return function tick(command, recurse) {\n        recurse(0, self._period);\n        var state = tryCatch(self._action)(self._state);\n        if (state === errorObj) {\n          self._cancel.dispose();\n          thrower(state.e);\n        }\n        self._state = state;\n      };\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveFuture(0, this._period, createTick(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  var scheduleMethod, clearMethod;\n\n  var localTimer = (function () {\n    var localSetTimeout, localClearTimeout = noop;\n    if (!!root.setTimeout) {\n      localSetTimeout = root.setTimeout;\n      localClearTimeout = root.clearTimeout;\n    } else if (!!root.WScript) {\n      localSetTimeout = function (fn, time) {\n        root.WScript.Sleep(time);\n        fn();\n      };\n    } else {\n      throw new NotSupportedError();\n    }\n\n    return {\n      setTimeout: localSetTimeout,\n      clearTimeout: localClearTimeout\n    };\n  }());\n  var localSetTimeout = localTimer.setTimeout,\n    localClearTimeout = localTimer.clearTimeout;\n\n  (function () {\n\n    var nextHandle = 1, tasksByHandle = {}, currentlyRunning = false;\n\n    clearMethod = function (handle) {\n      delete tasksByHandle[handle];\n    };\n\n    function runTask(handle) {\n      if (currentlyRunning) {\n        localSetTimeout(function () { runTask(handle); }, 0);\n      } else {\n        var task = tasksByHandle[handle];\n        if (task) {\n          currentlyRunning = true;\n          var result = tryCatch(task)();\n          clearMethod(handle);\n          currentlyRunning = false;\n          if (result === errorObj) { thrower(result.e); }\n        }\n      }\n    }\n\n    var reNative = new RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&\n      !reNative.test(setImmediate) && setImmediate;\n\n    function postMessageSupported () {\n      // Ensure not in a worker\n      if (!root.postMessage || root.importScripts) { return false; }\n      var isAsync = false, oldHandler = root.onmessage;\n      // Test for async\n      root.onmessage = function () { isAsync = true; };\n      root.postMessage('', '*');\n      root.onmessage = oldHandler;\n\n      return isAsync;\n    }\n\n    // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n    if (isFunction(setImmediate)) {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        setImmediate(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        process.nextTick(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (postMessageSupported()) {\n      var MSG_PREFIX = 'ms.rx.schedule' + Math.random();\n\n      var onGlobalPostMessage = function (event) {\n        // Only if we're a match to avoid any other global events\n        if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n          runTask(event.data.substring(MSG_PREFIX.length));\n        }\n      };\n\n      root.addEventListener('message', onGlobalPostMessage, false);\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        root.postMessage(MSG_PREFIX + id, '*');\n        return id;\n      };\n    } else if (!!root.MessageChannel) {\n      var channel = new root.MessageChannel();\n\n      channel.port1.onmessage = function (e) { runTask(e.data); };\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        channel.port2.postMessage(id);\n        return id;\n      };\n    } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {\n\n      scheduleMethod = function (action) {\n        var scriptElement = root.document.createElement('script');\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n\n        scriptElement.onreadystatechange = function () {\n          runTask(id);\n          scriptElement.onreadystatechange = null;\n          scriptElement.parentNode.removeChild(scriptElement);\n          scriptElement = null;\n        };\n        root.document.documentElement.appendChild(scriptElement);\n        return id;\n      };\n\n    } else {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        localSetTimeout(function () {\n          runTask(id);\n        }, 0);\n\n        return id;\n      };\n    }\n  }());\n\n  /**\n   * Gets a scheduler that schedules work via a timed callback based upon platform.\n   */\n   var DefaultScheduler = (function (__super__) {\n     inherits(DefaultScheduler, __super__);\n     function DefaultScheduler() {\n       __super__.call(this);\n     }\n\n     function scheduleAction(disposable, action, scheduler, state) {\n       return function schedule() {\n         disposable.setDisposable(Disposable._fixup(action(scheduler, state)));\n       };\n     }\n\n     function ClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     ClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         clearMethod(this._id);\n       }\n     };\n\n     function LocalClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     LocalClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         localClearTimeout(this._id);\n       }\n     };\n\n    DefaultScheduler.prototype.schedule = function (state, action) {\n      var disposable = new SingleAssignmentDisposable(),\n          id = scheduleMethod(scheduleAction(disposable, action, this, state));\n      return new BinaryDisposable(disposable, new ClearDisposable(id));\n    };\n\n    DefaultScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      if (dueTime === 0) { return this.schedule(state, action); }\n      var disposable = new SingleAssignmentDisposable(),\n          id = localSetTimeout(scheduleAction(disposable, action, this, state), dueTime);\n      return new BinaryDisposable(disposable, new LocalClearDisposable(id));\n    };\n\n    function scheduleLongRunning(state, action, disposable) {\n      return function () { action(state, disposable); };\n    }\n\n    DefaultScheduler.prototype.scheduleLongRunning = function (state, action) {\n      var disposable = disposableCreate(noop);\n      scheduleMethod(scheduleLongRunning(state, action, disposable));\n      return disposable;\n    };\n\n    return DefaultScheduler;\n  }(Scheduler));\n\n  var defaultScheduler = Scheduler['default'] = Scheduler.async = new DefaultScheduler();\n\n  function IndexedItem(id, value) {\n    this.id = id;\n    this.value = value;\n  }\n\n  IndexedItem.prototype.compareTo = function (other) {\n    var c = this.value.compareTo(other.value);\n    c === 0 && (c = this.id - other.id);\n    return c;\n  };\n\n  var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) {\n    this.items = new Array(capacity);\n    this.length = 0;\n  };\n\n  var priorityProto = PriorityQueue.prototype;\n  priorityProto.isHigherPriority = function (left, right) {\n    return this.items[left].compareTo(this.items[right]) < 0;\n  };\n\n  priorityProto.percolate = function (index) {\n    if (index >= this.length || index < 0) { return; }\n    var parent = index - 1 >> 1;\n    if (parent < 0 || parent === index) { return; }\n    if (this.isHigherPriority(index, parent)) {\n      var temp = this.items[index];\n      this.items[index] = this.items[parent];\n      this.items[parent] = temp;\n      this.percolate(parent);\n    }\n  };\n\n  priorityProto.heapify = function (index) {\n    +index || (index = 0);\n    if (index >= this.length || index < 0) { return; }\n    var left = 2 * index + 1,\n        right = 2 * index + 2,\n        first = index;\n    if (left < this.length && this.isHigherPriority(left, first)) {\n      first = left;\n    }\n    if (right < this.length && this.isHigherPriority(right, first)) {\n      first = right;\n    }\n    if (first !== index) {\n      var temp = this.items[index];\n      this.items[index] = this.items[first];\n      this.items[first] = temp;\n      this.heapify(first);\n    }\n  };\n\n  priorityProto.peek = function () { return this.items[0].value; };\n\n  priorityProto.removeAt = function (index) {\n    this.items[index] = this.items[--this.length];\n    this.items[this.length] = undefined;\n    this.heapify();\n  };\n\n  priorityProto.dequeue = function () {\n    var result = this.peek();\n    this.removeAt(0);\n    return result;\n  };\n\n  priorityProto.enqueue = function (item) {\n    var index = this.length++;\n    this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n    this.percolate(index);\n  };\n\n  priorityProto.remove = function (item) {\n    for (var i = 0; i < this.length; i++) {\n      if (this.items[i].value === item) {\n        this.removeAt(i);\n        return true;\n      }\n    }\n    return false;\n  };\n  PriorityQueue.count = 0;\n\n  /**\n   *  Represents a notification to an observer.\n   */\n  var Notification = Rx.Notification = (function () {\n    function Notification() {\n\n    }\n\n    Notification.prototype._accept = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    Notification.prototype._acceptObserver = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    /**\n     * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n     * @param {Function | Observer} observerOrOnNext Function to invoke for an OnNext notification or Observer to invoke the notification on..\n     * @param {Function} onError Function to invoke for an OnError notification.\n     * @param {Function} onCompleted Function to invoke for an OnCompleted notification.\n     * @returns {Any} Result produced by the observation.\n     */\n    Notification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n      return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n        this._acceptObserver(observerOrOnNext) :\n        this._accept(observerOrOnNext, onError, onCompleted);\n    };\n\n    /**\n     * Returns an observable sequence with a single notification.\n     *\n     * @memberOf Notifications\n     * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n     * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n     */\n    Notification.prototype.toObservable = function (scheduler) {\n      var self = this;\n      isScheduler(scheduler) || (scheduler = immediateScheduler);\n      return new AnonymousObservable(function (o) {\n        return scheduler.schedule(self, function (_, notification) {\n          notification._acceptObserver(o);\n          notification.kind === 'N' && o.onCompleted();\n        });\n      });\n    };\n\n    return Notification;\n  })();\n\n  var OnNextNotification = (function (__super__) {\n    inherits(OnNextNotification, __super__);\n    function OnNextNotification(value) {\n      this.value = value;\n      this.kind = 'N';\n    }\n\n    OnNextNotification.prototype._accept = function (onNext) {\n      return onNext(this.value);\n    };\n\n    OnNextNotification.prototype._acceptObserver = function (o) {\n      return o.onNext(this.value);\n    };\n\n    OnNextNotification.prototype.toString = function () {\n      return 'OnNext(' + this.value + ')';\n    };\n\n    return OnNextNotification;\n  }(Notification));\n\n  var OnErrorNotification = (function (__super__) {\n    inherits(OnErrorNotification, __super__);\n    function OnErrorNotification(error) {\n      this.error = error;\n      this.kind = 'E';\n    }\n\n    OnErrorNotification.prototype._accept = function (onNext, onError) {\n      return onError(this.error);\n    };\n\n    OnErrorNotification.prototype._acceptObserver = function (o) {\n      return o.onError(this.error);\n    };\n\n    OnErrorNotification.prototype.toString = function () {\n      return 'OnError(' + this.error + ')';\n    };\n\n    return OnErrorNotification;\n  }(Notification));\n\n  var OnCompletedNotification = (function (__super__) {\n    inherits(OnCompletedNotification, __super__);\n    function OnCompletedNotification() {\n      this.kind = 'C';\n    }\n\n    OnCompletedNotification.prototype._accept = function (onNext, onError, onCompleted) {\n      return onCompleted();\n    };\n\n    OnCompletedNotification.prototype._acceptObserver = function (o) {\n      return o.onCompleted();\n    };\n\n    OnCompletedNotification.prototype.toString = function () {\n      return 'OnCompleted()';\n    };\n\n    return OnCompletedNotification;\n  }(Notification));\n\n  /**\n   * Creates an object that represents an OnNext notification to an observer.\n   * @param {Any} value The value contained in the notification.\n   * @returns {Notification} The OnNext notification containing the value.\n   */\n  var notificationCreateOnNext = Notification.createOnNext = function (value) {\n    return new OnNextNotification(value);\n  };\n\n  /**\n   * Creates an object that represents an OnError notification to an observer.\n   * @param {Any} error The exception contained in the notification.\n   * @returns {Notification} The OnError notification containing the exception.\n   */\n  var notificationCreateOnError = Notification.createOnError = function (error) {\n    return new OnErrorNotification(error);\n  };\n\n  /**\n   * Creates an object that represents an OnCompleted notification to an observer.\n   * @returns {Notification} The OnCompleted notification.\n   */\n  var notificationCreateOnCompleted = Notification.createOnCompleted = function () {\n    return new OnCompletedNotification();\n  };\n\n  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n\n  /**\n   * Abstract base class for implementations of the Observer class.\n   * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n   */\n  var AbstractObserver = Rx.internals.AbstractObserver = (function (__super__) {\n    inherits(AbstractObserver, __super__);\n\n    /**\n     * Creates a new observer in a non-stopped state.\n     */\n    function AbstractObserver() {\n      this.isStopped = false;\n    }\n\n    // Must be implemented by other observers\n    AbstractObserver.prototype.next = notImplemented;\n    AbstractObserver.prototype.error = notImplemented;\n    AbstractObserver.prototype.completed = notImplemented;\n\n    /**\n     * Notifies the observer of a new element in the sequence.\n     * @param {Any} value Next element in the sequence.\n     */\n    AbstractObserver.prototype.onNext = function (value) {\n      !this.isStopped && this.next(value);\n    };\n\n    /**\n     * Notifies the observer that an exception has occurred.\n     * @param {Any} error The error that has occurred.\n     */\n    AbstractObserver.prototype.onError = function (error) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(error);\n      }\n    };\n\n    /**\n     * Notifies the observer of the end of the sequence.\n     */\n    AbstractObserver.prototype.onCompleted = function () {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.completed();\n      }\n    };\n\n    /**\n     * Disposes the observer, causing it to transition to the stopped state.\n     */\n    AbstractObserver.prototype.dispose = function () { this.isStopped = true; };\n\n    AbstractObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return AbstractObserver;\n  }(Observer));\n\n  /**\n   * Class to create an Observer instance from delegate-based implementations of the on* methods.\n   */\n  var AnonymousObserver = Rx.AnonymousObserver = (function (__super__) {\n    inherits(AnonymousObserver, __super__);\n\n    /**\n     * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n     * @param {Any} onNext Observer's OnNext action implementation.\n     * @param {Any} onError Observer's OnError action implementation.\n     * @param {Any} onCompleted Observer's OnCompleted action implementation.\n     */\n    function AnonymousObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    /**\n     * Calls the onNext action.\n     * @param {Any} value Next element in the sequence.\n     */\n    AnonymousObserver.prototype.next = function (value) {\n      this._onNext(value);\n    };\n\n    /**\n     * Calls the onError action.\n     * @param {Any} error The error that has occurred.\n     */\n    AnonymousObserver.prototype.error = function (error) {\n      this._onError(error);\n    };\n\n    /**\n     *  Calls the onCompleted action.\n     */\n    AnonymousObserver.prototype.completed = function () {\n      this._onCompleted();\n    };\n\n    return AnonymousObserver;\n  }(AbstractObserver));\n\n  var observableProto;\n\n  /**\n   * Represents a push-style collection.\n   */\n  var Observable = Rx.Observable = (function () {\n\n    function makeSubscribe(self, subscribe) {\n      return function (o) {\n        var oldOnError = o.onError;\n        o.onError = function (e) {\n          makeStackTraceLong(e, self);\n          oldOnError.call(o, e);\n        };\n\n        return subscribe.call(self, o);\n      };\n    }\n\n    function Observable() {\n      if (Rx.config.longStackSupport && hasStacks) {\n        var oldSubscribe = this._subscribe;\n        var e = tryCatch(thrower)(new Error()).e;\n        this.stack = e.stack.substring(e.stack.indexOf('\\n') + 1);\n        this._subscribe = makeSubscribe(this, oldSubscribe);\n      }\n    }\n\n    observableProto = Observable.prototype;\n\n    /**\n    * Determines whether the given object is an Observable\n    * @param {Any} An object to determine whether it is an Observable\n    * @returns {Boolean} true if an Observable, else false.\n    */\n    Observable.isObservable = function (o) {\n      return o && isFunction(o.subscribe);\n    };\n\n    /**\n     *  Subscribes an o to the observable sequence.\n     *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n     *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n     *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n     *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribe = observableProto.forEach = function (oOrOnNext, onError, onCompleted) {\n      return this._subscribe(typeof oOrOnNext === 'object' ?\n        oOrOnNext :\n        observerCreate(oOrOnNext, onError, onCompleted));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onNext The function to invoke on each element in the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnNext = function (onNext, thisArg) {\n      return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n    };\n\n    /**\n     * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n     * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnError = function (onError, thisArg) {\n      return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnCompleted = function (onCompleted, thisArg) {\n      return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n    };\n\n    return Observable;\n  })();\n\n  var ScheduledObserver = Rx.internals.ScheduledObserver = (function (__super__) {\n    inherits(ScheduledObserver, __super__);\n\n    function ScheduledObserver(scheduler, observer) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.observer = observer;\n      this.isAcquired = false;\n      this.hasFaulted = false;\n      this.queue = [];\n      this.disposable = new SerialDisposable();\n    }\n\n    function enqueueNext(observer, x) { return function () { observer.onNext(x); }; }\n    function enqueueError(observer, e) { return function () { observer.onError(e); }; }\n    function enqueueCompleted(observer) { return function () { observer.onCompleted(); }; }\n\n    ScheduledObserver.prototype.next = function (x) {\n      this.queue.push(enqueueNext(this.observer, x));\n    };\n\n    ScheduledObserver.prototype.error = function (e) {\n      this.queue.push(enqueueError(this.observer, e));\n    };\n\n    ScheduledObserver.prototype.completed = function () {\n      this.queue.push(enqueueCompleted(this.observer));\n    };\n\n\n    function scheduleMethod(state, recurse) {\n      var work;\n      if (state.queue.length > 0) {\n        work = state.queue.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var res = tryCatch(work)();\n      if (res === errorObj) {\n        state.queue = [];\n        state.hasFaulted = true;\n        return thrower(res.e);\n      }\n      recurse(state);\n    }\n\n    ScheduledObserver.prototype.ensureActive = function () {\n      var isOwner = false;\n      if (!this.hasFaulted && this.queue.length > 0) {\n        isOwner = !this.isAcquired;\n        this.isAcquired = true;\n      }\n      isOwner &&\n        this.disposable.setDisposable(this.scheduler.scheduleRecursive(this, scheduleMethod));\n    };\n\n    ScheduledObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.disposable.dispose();\n    };\n\n    return ScheduledObserver;\n  }(AbstractObserver));\n\n  var ObservableBase = Rx.ObservableBase = (function (__super__) {\n    inherits(ObservableBase, __super__);\n\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.subscribeCore).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function ObservableBase() {\n      __super__.call(this);\n    }\n\n    ObservableBase.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    ObservableBase.prototype.subscribeCore = notImplemented;\n\n    return ObservableBase;\n  }(Observable));\n\nvar FlatMapObservable = Rx.FlatMapObservable = (function(__super__) {\n\n    inherits(FlatMapObservable, __super__);\n\n    function FlatMapObservable(source, selector, resultSelector, thisArg) {\n      this.resultSelector = isFunction(resultSelector) ? resultSelector : null;\n      this.selector = bindCallback(isFunction(selector) ? selector : function() { return selector; }, thisArg, 3);\n      this.source = source;\n      __super__.call(this);\n    }\n\n    FlatMapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this.resultSelector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(observer, selector, resultSelector, source) {\n      this.i = 0;\n      this.selector = selector;\n      this.resultSelector = resultSelector;\n      this.source = source;\n      this.o = observer;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype._wrapResult = function(result, x, i) {\n      return this.resultSelector ?\n        result.map(function(y, i2) { return this.resultSelector(x, y, i, i2); }, this) :\n        result;\n    };\n\n    InnerObserver.prototype.next = function(x) {\n      var i = this.i++;\n      var result = tryCatch(this.selector)(x, i, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = Observable.from(result));\n      this.o.onNext(this._wrapResult(result, x, i));\n    };\n\n    InnerObserver.prototype.error = function(e) { this.o.onError(e); };\n\n    InnerObserver.prototype.completed = function() { this.o.onCompleted(); };\n\n    return FlatMapObservable;\n\n}(ObservableBase));\n\n  var Enumerable = Rx.internals.Enumerable = function () { };\n\n  function IsDisposedDisposable(state) {\n    this._s = state;\n    this.isDisposed = false;\n  }\n\n  IsDisposedDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      this._s.isDisposed = true;\n    }\n  };\n\n  var ConcatEnumerableObservable = (function(__super__) {\n    inherits(ConcatEnumerableObservable, __super__);\n    function ConcatEnumerableObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    ConcatEnumerableObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        o: o,\n        subscription: subscription,\n        e: this.sources[$iterator$]()\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.o.onError(e); };\n    InnerObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return ConcatEnumerableObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.concat = function () {\n    return new ConcatEnumerableObservable(this);\n  };\n\n  var CatchErrorObservable = (function(__super__) {\n    function CatchErrorObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    inherits(CatchErrorObservable, __super__);\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.lastError !== null ? state.o.onError(state.lastError) : state.o.onCompleted(); }\n\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    CatchErrorObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        e: this.sources[$iterator$](),\n        subscription: subscription,\n        lastError: null,\n        o: o\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.lastError = e; this._recurse(this._state); };\n    InnerObserver.prototype.completed = function () { this._state.o.onCompleted(); };\n\n    return CatchErrorObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.catchError = function () {\n    return new CatchErrorObservable(this);\n  };\n\n  var RepeatEnumerable = (function (__super__) {\n    inherits(RepeatEnumerable, __super__);\n    function RepeatEnumerable(v, c) {\n      this.v = v;\n      this.c = c == null ? -1 : c;\n    }\n\n    RepeatEnumerable.prototype[$iterator$] = function () {\n      return new RepeatEnumerator(this);\n    };\n\n    function RepeatEnumerator(p) {\n      this.v = p.v;\n      this.l = p.c;\n    }\n\n    RepeatEnumerator.prototype.next = function () {\n      if (this.l === 0) { return doneEnumerator; }\n      if (this.l > 0) { this.l--; }\n      return { done: false, value: this.v };\n    };\n\n    return RepeatEnumerable;\n  }(Enumerable));\n\n  var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) {\n    return new RepeatEnumerable(value, repeatCount);\n  };\n\n  var OfEnumerable = (function(__super__) {\n    inherits(OfEnumerable, __super__);\n    function OfEnumerable(s, fn, thisArg) {\n      this.s = s;\n      this.fn = fn ? bindCallback(fn, thisArg, 3) : null;\n    }\n    OfEnumerable.prototype[$iterator$] = function () {\n      return new OfEnumerator(this);\n    };\n\n    function OfEnumerator(p) {\n      this.i = -1;\n      this.s = p.s;\n      this.l = this.s.length;\n      this.fn = p.fn;\n    }\n\n    OfEnumerator.prototype.next = function () {\n     return ++this.i < this.l ?\n       { done: false, value: !this.fn ? this.s[this.i] : this.fn(this.s[this.i], this.i, this.s) } :\n       doneEnumerator;\n    };\n\n    return OfEnumerable;\n  }(Enumerable));\n\n  var enumerableOf = Enumerable.of = function (source, selector, thisArg) {\n    return new OfEnumerable(source, selector, thisArg);\n  };\n\n  var ToArrayObservable = (function(__super__) {\n    inherits(ToArrayObservable, __super__);\n    function ToArrayObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    ToArrayObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o) {\n      this.o = o;\n      this.a = [];\n      AbstractObserver.call(this);\n    }\n    \n    InnerObserver.prototype.next = function (x) { this.a.push(x); };\n    InnerObserver.prototype.error = function (e) { this.o.onError(e);  };\n    InnerObserver.prototype.completed = function () { this.o.onNext(this.a); this.o.onCompleted(); };\n\n    return ToArrayObservable;\n  }(ObservableBase));\n\n  /**\n  * Creates an array from an observable sequence.\n  * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n  */\n  observableProto.toArray = function () {\n    return new ToArrayObservable(this);\n  };\n\n  /**\n   *  Creates an observable sequence from a specified subscribe method implementation.\n   * @example\n   *  var res = Rx.Observable.create(function (observer) { return function () { } );\n   *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n   *  var res = Rx.Observable.create(function (observer) { } );\n   * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n   * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n   */\n  Observable.create = function (subscribe, parent) {\n    return new AnonymousObservable(subscribe, parent);\n  };\n\n  var Defer = (function(__super__) {\n    inherits(Defer, __super__);\n    function Defer(factory) {\n      this._f = factory;\n      __super__.call(this);\n    }\n\n    Defer.prototype.subscribeCore = function (o) {\n      var result = tryCatch(this._f)();\n      if (result === errorObj) { return observableThrow(result.e).subscribe(o);}\n      isPromise(result) && (result = observableFromPromise(result));\n      return result.subscribe(o);\n    };\n\n    return Defer;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n   *\n   * @example\n   *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n   * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n   * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n   */\n  var observableDefer = Observable.defer = function (observableFactory) {\n    return new Defer(observableFactory);\n  };\n\n  var EmptyObservable = (function(__super__) {\n    inherits(EmptyObservable, __super__);\n    function EmptyObservable(scheduler) {\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    EmptyObservable.prototype.subscribeCore = function (observer) {\n      var sink = new EmptySink(observer, this.scheduler);\n      return sink.run();\n    };\n\n    function EmptySink(observer, scheduler) {\n      this.observer = observer;\n      this.scheduler = scheduler;\n    }\n\n    function scheduleItem(s, state) {\n      state.onCompleted();\n      return disposableEmpty;\n    }\n\n    EmptySink.prototype.run = function () {\n      var state = this.observer;\n      return this.scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this.scheduler.schedule(state, scheduleItem);\n    };\n\n    return EmptyObservable;\n  }(ObservableBase));\n\n  var EMPTY_OBSERVABLE = new EmptyObservable(immediateScheduler);\n\n  /**\n   *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n   *\n   * @example\n   *  var res = Rx.Observable.empty();\n   *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n   * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n   * @returns {Observable} An observable sequence with no elements.\n   */\n  var observableEmpty = Observable.empty = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return scheduler === immediateScheduler ? EMPTY_OBSERVABLE : new EmptyObservable(scheduler);\n  };\n\n  var FromObservable = (function(__super__) {\n    inherits(FromObservable, __super__);\n    function FromObservable(iterable, fn, scheduler) {\n      this._iterable = iterable;\n      this._fn = fn;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function createScheduleMethod(o, it, fn) {\n      return function loopRecursive(i, recurse) {\n        var next = tryCatch(it.next).call(it);\n        if (next === errorObj) { return o.onError(next.e); }\n        if (next.done) { return o.onCompleted(); }\n\n        var result = next.value;\n\n        if (isFunction(fn)) {\n          result = tryCatch(fn)(result, i);\n          if (result === errorObj) { return o.onError(result.e); }\n        }\n\n        o.onNext(result);\n        recurse(i + 1);\n      };\n    }\n\n    FromObservable.prototype.subscribeCore = function (o) {\n      var list = Object(this._iterable),\n          it = getIterable(list);\n\n      return this._scheduler.scheduleRecursive(0, createScheduleMethod(o, it, this._fn));\n    };\n\n    return FromObservable;\n  }(ObservableBase));\n\n  var maxSafeInteger = Math.pow(2, 53) - 1;\n\n  function StringIterable(s) {\n    this._s = s;\n  }\n\n  StringIterable.prototype[$iterator$] = function () {\n    return new StringIterator(this._s);\n  };\n\n  function StringIterator(s) {\n    this._s = s;\n    this._l = s.length;\n    this._i = 0;\n  }\n\n  StringIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  StringIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._s.charAt(this._i++) } : doneEnumerator;\n  };\n\n  function ArrayIterable(a) {\n    this._a = a;\n  }\n\n  ArrayIterable.prototype[$iterator$] = function () {\n    return new ArrayIterator(this._a);\n  };\n\n  function ArrayIterator(a) {\n    this._a = a;\n    this._l = toLength(a);\n    this._i = 0;\n  }\n\n  ArrayIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  ArrayIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._a[this._i++] } : doneEnumerator;\n  };\n\n  function numberIsFinite(value) {\n    return typeof value === 'number' && root.isFinite(value);\n  }\n\n  function isNan(n) {\n    return n !== n;\n  }\n\n  function getIterable(o) {\n    var i = o[$iterator$], it;\n    if (!i && typeof o === 'string') {\n      it = new StringIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i && o.length !== undefined) {\n      it = new ArrayIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i) { throw new TypeError('Object is not iterable'); }\n    return o[$iterator$]();\n  }\n\n  function sign(value) {\n    var number = +value;\n    if (number === 0) { return number; }\n    if (isNaN(number)) { return number; }\n    return number < 0 ? -1 : 1;\n  }\n\n  function toLength(o) {\n    var len = +o.length;\n    if (isNaN(len)) { return 0; }\n    if (len === 0 || !numberIsFinite(len)) { return len; }\n    len = sign(len) * Math.floor(Math.abs(len));\n    if (len <= 0) { return 0; }\n    if (len > maxSafeInteger) { return maxSafeInteger; }\n    return len;\n  }\n\n  /**\n  * This method creates a new Observable sequence from an array-like or iterable object.\n  * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n  * @param {Function} [mapFn] Map function to call on every element of the array.\n  * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n  * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n  */\n  var observableFrom = Observable.from = function (iterable, mapFn, thisArg, scheduler) {\n    if (iterable == null) {\n      throw new Error('iterable cannot be null.')\n    }\n    if (mapFn && !isFunction(mapFn)) {\n      throw new Error('mapFn when provided must be a function');\n    }\n    if (mapFn) {\n      var mapper = bindCallback(mapFn, thisArg, 2);\n    }\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromObservable(iterable, mapper, scheduler);\n  }\n\n  var FromArrayObservable = (function(__super__) {\n    inherits(FromArrayObservable, __super__);\n    function FromArrayObservable(args, scheduler) {\n      this._args = args;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, args) {\n      var len = args.length;\n      return function loopRecursive (i, recurse) {\n        if (i < len) {\n          o.onNext(args[i]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    FromArrayObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._args));\n    };\n\n    return FromArrayObservable;\n  }(ObservableBase));\n\n  /**\n  *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n  * @deprecated use Observable.from or Observable.of\n  * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n  */\n  var observableFromArray = Observable.fromArray = function (array, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler)\n  };\n\n  var NeverObservable = (function(__super__) {\n    inherits(NeverObservable, __super__);\n    function NeverObservable() {\n      __super__.call(this);\n    }\n\n    NeverObservable.prototype.subscribeCore = function (observer) {\n      return disposableEmpty;\n    };\n\n    return NeverObservable;\n  }(ObservableBase));\n\n  var NEVER_OBSERVABLE = new NeverObservable();\n\n  /**\n   * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n   * @returns {Observable} An observable sequence whose observers will never get called.\n   */\n  var observableNever = Observable.never = function () {\n    return NEVER_OBSERVABLE;\n  };\n\n  function observableOf (scheduler, array) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler);\n  }\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.of = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return new FromArrayObservable(args, currentThreadScheduler);\n  };\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.ofWithScheduler = function (scheduler) {\n    var len = arguments.length, args = new Array(len - 1);\n    for(var i = 1; i < len; i++) { args[i - 1] = arguments[i]; }\n    return new FromArrayObservable(args, scheduler);\n  };\n\n  var PairsObservable = (function(__super__) {\n    inherits(PairsObservable, __super__);\n    function PairsObservable(o, scheduler) {\n      this._o = o;\n      this._keys = Object.keys(o);\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, obj, keys) {\n      return function loopRecursive(i, recurse) {\n        if (i < keys.length) {\n          var key = keys[i];\n          o.onNext([key, obj[key]]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    PairsObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._o, this._keys));\n    };\n\n    return PairsObservable;\n  }(ObservableBase));\n\n  /**\n   * Convert an object into an observable sequence of [key, value] pairs.\n   * @param {Object} obj The object to inspect.\n   * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n   * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n   */\n  Observable.pairs = function (obj, scheduler) {\n    scheduler || (scheduler = currentThreadScheduler);\n    return new PairsObservable(obj, scheduler);\n  };\n\n    var RangeObservable = (function(__super__) {\n    inherits(RangeObservable, __super__);\n    function RangeObservable(start, count, scheduler) {\n      this.start = start;\n      this.rangeCount = count;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function loopRecursive(start, count, o) {\n      return function loop (i, recurse) {\n        if (i < count) {\n          o.onNext(start + i);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    RangeObservable.prototype.subscribeCore = function (o) {\n      return this.scheduler.scheduleRecursive(\n        0,\n        loopRecursive(this.start, this.rangeCount, o)\n      );\n    };\n\n    return RangeObservable;\n  }(ObservableBase));\n\n  /**\n  *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n  * @param {Number} start The value of the first integer in the sequence.\n  * @param {Number} count The number of sequential integers to generate.\n  * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n  * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n  */\n  Observable.range = function (start, count, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RangeObservable(start, count, scheduler);\n  };\n\n  var RepeatObservable = (function(__super__) {\n    inherits(RepeatObservable, __super__);\n    function RepeatObservable(value, repeatCount, scheduler) {\n      this.value = value;\n      this.repeatCount = repeatCount == null ? -1 : repeatCount;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    RepeatObservable.prototype.subscribeCore = function (observer) {\n      var sink = new RepeatSink(observer, this);\n      return sink.run();\n    };\n\n    return RepeatObservable;\n  }(ObservableBase));\n\n  function RepeatSink(observer, parent) {\n    this.observer = observer;\n    this.parent = parent;\n  }\n\n  RepeatSink.prototype.run = function () {\n    var observer = this.observer, value = this.parent.value;\n    function loopRecursive(i, recurse) {\n      if (i === -1 || i > 0) {\n        observer.onNext(value);\n        i > 0 && i--;\n      }\n      if (i === 0) { return observer.onCompleted(); }\n      recurse(i);\n    }\n\n    return this.parent.scheduler.scheduleRecursive(this.parent.repeatCount, loopRecursive);\n  };\n\n  /**\n   *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n   * @param {Mixed} value Element to repeat.\n   * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n   * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n   */\n  Observable.repeat = function (value, repeatCount, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RepeatObservable(value, repeatCount, scheduler);\n  };\n\n  var JustObservable = (function(__super__) {\n    inherits(JustObservable, __super__);\n    function JustObservable(value, scheduler) {\n      this._value = value;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    JustObservable.prototype.subscribeCore = function (o) {\n      var state = [this._value, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var value = state[0], observer = state[1];\n      observer.onNext(value);\n      observer.onCompleted();\n      return disposableEmpty;\n    }\n\n    return JustObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n   *  There is an alias called 'just' or browsers <IE9.\n   * @param {Mixed} value Single element in the resulting observable sequence.\n   * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence containing the single specified element.\n   */\n  var observableReturn = Observable['return'] = Observable.just = function (value, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new JustObservable(value, scheduler);\n  };\n\n  var ThrowObservable = (function(__super__) {\n    inherits(ThrowObservable, __super__);\n    function ThrowObservable(error, scheduler) {\n      this._error = error;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    ThrowObservable.prototype.subscribeCore = function (o) {\n      var state = [this._error, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var e = state[0], o = state[1];\n      o.onError(e);\n      return disposableEmpty;\n    }\n\n    return ThrowObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n   *  There is an alias to this method called 'throwError' for browsers <IE9.\n   * @param {Mixed} error An object used for the sequence's termination.\n   * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n   */\n  var observableThrow = Observable['throw'] = function (error, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new ThrowObservable(error, scheduler);\n  };\n\n  var CatchObservable = (function (__super__) {\n    inherits(CatchObservable, __super__);\n    function CatchObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObservable.prototype.subscribeCore = function (o) {\n      var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();\n      subscription.setDisposable(d1);\n      d1.setDisposable(this.source.subscribe(new CatchObserver(o, subscription, this._fn)));\n      return subscription;\n    };\n\n    return CatchObservable;\n  }(ObservableBase));\n\n  var CatchObserver = (function(__super__) {\n    inherits(CatchObserver, __super__);\n    function CatchObserver(o, s, fn) {\n      this._o = o;\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObserver.prototype.next = function (x) { this._o.onNext(x); };\n    CatchObserver.prototype.completed = function () { return this._o.onCompleted(); };\n    CatchObserver.prototype.error = function (e) {\n      var result = tryCatch(this._fn)(e);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      isPromise(result) && (result = observableFromPromise(result));\n\n      var d = new SingleAssignmentDisposable();\n      this._s.setDisposable(d);\n      d.setDisposable(result.subscribe(this._o));\n    };\n\n    return CatchObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n   * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n   */\n  observableProto['catch'] = function (handlerOrSecond) {\n    return isFunction(handlerOrSecond) ? new CatchObservable(this, handlerOrSecond) : observableCatch([this, handlerOrSecond]);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n   * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n   */\n  var observableCatch = Observable['catch'] = function () {\n    var items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(len);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    return enumerableOf(items).catchError();\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   * This can be in the form of an argument list of observables or an array.\n   *\n   * @example\n   * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return combineLatest.apply(this, args);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var CombineLatestObservable = (function(__super__) {\n    inherits(CombineLatestObservable, __super__);\n    function CombineLatestObservable(params, cb) {\n      this._params = params;\n      this._cb = cb;\n      __super__.call(this);\n    }\n\n    CombineLatestObservable.prototype.subscribeCore = function(observer) {\n      var len = this._params.length,\n          subscriptions = new Array(len);\n\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        isDone: arrayInitialize(len, falseFactory),\n        values: new Array(len)\n      };\n\n      for (var i = 0; i < len; i++) {\n        var source = this._params[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new CombineLatestObserver(observer, i, this._cb, state)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return CombineLatestObservable;\n  }(ObservableBase));\n\n  var CombineLatestObserver = (function (__super__) {\n    inherits(CombineLatestObserver, __super__);\n    function CombineLatestObserver(o, i, cb, state) {\n      this._o = o;\n      this._i = i;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    CombineLatestObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      if (this._state.hasValueAll || (this._state.hasValueAll = this._state.hasValue.every(identity))) {\n        var res = tryCatch(this._cb).apply(null, this._state.values);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._state.isDone.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    CombineLatestObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    CombineLatestObserver.prototype.completed = function () {\n      this._state.isDone[this._i] = true;\n      this._state.isDone.every(identity) && this._o.onCompleted();\n    };\n\n    return CombineLatestObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n  *\n  * @example\n  * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n  * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n  * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n  */\n  var combineLatest = Observable.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n    return new CombineLatestObservable(args, resultSelector);\n  };\n\n  /**\n   * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  observableProto.concat = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    args.unshift(this);\n    return observableConcat.apply(null, args);\n  };\n\n  var ConcatObserver = (function(__super__) {\n    inherits(ConcatObserver, __super__);\n    function ConcatObserver(s, fn) {\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    ConcatObserver.prototype.next = function (x) { this._s.o.onNext(x); };\n    ConcatObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    ConcatObserver.prototype.completed = function () { this._s.i++; this._fn(this._s); };\n\n    return ConcatObserver;\n  }(AbstractObserver));\n\n  var ConcatObservable = (function(__super__) {\n    inherits(ConcatObservable, __super__);\n    function ConcatObservable(sources) {\n      this._sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive (state, recurse) {\n      if (state.disposable.isDisposed) { return; }\n      if (state.i === state.sources.length) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = state.sources[state.i];\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new ConcatObserver(state, recurse)));\n    }\n\n    ConcatObservable.prototype.subscribeCore = function(o) {\n      var subscription = new SerialDisposable();\n      var disposable = disposableCreate(noop);\n      var state = {\n        o: o,\n        i: 0,\n        subscription: subscription,\n        disposable: disposable,\n        sources: this._sources\n      };\n\n      var cancelable = immediateScheduler.scheduleRecursive(state, scheduleRecursive);\n      return new NAryDisposable([subscription, disposable, cancelable]);\n    };\n\n    return ConcatObservable;\n  }(ObservableBase));\n\n  /**\n   * Concatenates all the observable sequences.\n   * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  var observableConcat = Observable.concat = function () {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      args = new Array(arguments.length);\n      for(var i = 0, len = arguments.length; i < len; i++) { args[i] = arguments[i]; }\n    }\n    return new ConcatObservable(args);\n  };\n\n  /**\n   * Concatenates an observable sequence of observable sequences.\n   * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n   */\n  observableProto.concatAll = function () {\n    return this.merge(1);\n  };\n\n  var MergeObservable = (function (__super__) {\n    inherits(MergeObservable, __super__);\n\n    function MergeObservable(source, maxConcurrent) {\n      this.source = source;\n      this.maxConcurrent = maxConcurrent;\n      __super__.call(this);\n    }\n\n    MergeObservable.prototype.subscribeCore = function(observer) {\n      var g = new CompositeDisposable();\n      g.add(this.source.subscribe(new MergeObserver(observer, this.maxConcurrent, g)));\n      return g;\n    };\n\n    return MergeObservable;\n\n  }(ObservableBase));\n\n  var MergeObserver = (function (__super__) {\n    function MergeObserver(o, max, g) {\n      this.o = o;\n      this.max = max;\n      this.g = g;\n      this.done = false;\n      this.q = [];\n      this.activeCount = 0;\n      __super__.call(this);\n    }\n\n    inherits(MergeObserver, __super__);\n\n    MergeObserver.prototype.handleSubscribe = function (xs) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(xs) && (xs = observableFromPromise(xs));\n      sad.setDisposable(xs.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeObserver.prototype.next = function (innerSource) {\n      if(this.activeCount < this.max) {\n        this.activeCount++;\n        this.handleSubscribe(innerSource);\n      } else {\n        this.q.push(innerSource);\n      }\n    };\n    MergeObserver.prototype.error = function (e) { this.o.onError(e); };\n    MergeObserver.prototype.completed = function () { this.done = true; this.activeCount === 0 && this.o.onCompleted(); };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) { this.parent.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this.parent.o.onError(e); };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      if (this.parent.q.length > 0) {\n        this.parent.handleSubscribe(this.parent.q.shift());\n      } else {\n        this.parent.activeCount--;\n        this.parent.done && this.parent.activeCount === 0 && this.parent.o.onCompleted();\n      }\n    };\n\n    return MergeObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n  * Or merges two observable sequences into a single observable sequence.\n  * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.merge = function (maxConcurrentOrOther) {\n    return typeof maxConcurrentOrOther !== 'number' ?\n      observableMerge(this, maxConcurrentOrOther) :\n      new MergeObservable(this, maxConcurrentOrOther);\n  };\n\n  /**\n   * Merges all the observable sequences into a single observable sequence.\n   * The scheduler is optional and if not specified, the immediate scheduler is used.\n   * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n   */\n  var observableMerge = Observable.merge = function () {\n    var scheduler, sources = [], i, len = arguments.length;\n    if (!arguments[0]) {\n      scheduler = immediateScheduler;\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else if (isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else {\n      scheduler = immediateScheduler;\n      for(i = 0; i < len; i++) { sources.push(arguments[i]); }\n    }\n    if (Array.isArray(sources[0])) {\n      sources = sources[0];\n    }\n    return observableOf(scheduler, sources).mergeAll();\n  };\n\n  var CompositeError = Rx.CompositeError = function(errors) {\n    this.innerErrors = errors;\n    this.message = 'This contains multiple errors. Check the innerErrors';\n    Error.call(this);\n  };\n  CompositeError.prototype = Object.create(Error.prototype);\n  CompositeError.prototype.name = 'CompositeError';\n\n  var MergeDelayErrorObservable = (function(__super__) {\n    inherits(MergeDelayErrorObservable, __super__);\n    function MergeDelayErrorObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeDelayErrorObservable.prototype.subscribeCore = function (o) {\n      var group = new CompositeDisposable(),\n        m = new SingleAssignmentDisposable(),\n        state = { isStopped: false, errors: [], o: o };\n\n      group.add(m);\n      m.setDisposable(this.source.subscribe(new MergeDelayErrorObserver(group, state)));\n\n      return group;\n    };\n\n    return MergeDelayErrorObservable;\n  }(ObservableBase));\n\n  var MergeDelayErrorObserver = (function(__super__) {\n    inherits(MergeDelayErrorObserver, __super__);\n    function MergeDelayErrorObserver(group, state) {\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function setCompletion(o, errors) {\n      if (errors.length === 0) {\n        o.onCompleted();\n      } else if (errors.length === 1) {\n        o.onError(errors[0]);\n      } else {\n        o.onError(new CompositeError(errors));\n      }\n    }\n\n    MergeDelayErrorObserver.prototype.next = function (x) {\n      var inner = new SingleAssignmentDisposable();\n      this._group.add(inner);\n\n      // Check for promises support\n      isPromise(x) && (x = observableFromPromise(x));\n      inner.setDisposable(x.subscribe(new InnerObserver(inner, this._group, this._state)));\n    };\n\n    MergeDelayErrorObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    MergeDelayErrorObserver.prototype.completed = function () {\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    inherits(InnerObserver, __super__);\n    function InnerObserver(inner, group, state) {\n      this._inner = inner;\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n    InnerObserver.prototype.completed = function () {\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    return MergeDelayErrorObserver;\n  }(AbstractObserver));\n\n  /**\n  * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n  * receive all successfully emitted items from all of the source Observables without being interrupted by\n  * an error notification from one of them.\n  *\n  * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n  * error via the Observer's onError, mergeDelayError will refrain from propagating that\n  * error notification until all of the merged Observables have finished emitting items.\n  * @param {Array | Arguments} args Arguments or an array to merge.\n  * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n  */\n  Observable.mergeDelayError = function() {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      var len = arguments.length;\n      args = new Array(len);\n      for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    var source = observableOf(null, args);\n    return new MergeDelayErrorObservable(source);\n  };\n\n  var MergeAllObservable = (function (__super__) {\n    inherits(MergeAllObservable, __super__);\n\n    function MergeAllObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeAllObservable.prototype.subscribeCore = function (o) {\n      var g = new CompositeDisposable(), m = new SingleAssignmentDisposable();\n      g.add(m);\n      m.setDisposable(this.source.subscribe(new MergeAllObserver(o, g)));\n      return g;\n    };\n\n    return MergeAllObservable;\n  }(ObservableBase));\n\n  var MergeAllObserver = (function (__super__) {\n    function MergeAllObserver(o, g) {\n      this.o = o;\n      this.g = g;\n      this.done = false;\n      __super__.call(this);\n    }\n\n    inherits(MergeAllObserver, __super__);\n\n    MergeAllObserver.prototype.next = function(innerSource) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      sad.setDisposable(innerSource.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeAllObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    MergeAllObserver.prototype.completed = function () {\n      this.done = true;\n      this.g.length === 1 && this.o.onCompleted();\n    };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) {\n      this.parent.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function (e) {\n      this.parent.o.onError(e);\n    };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      this.parent.done && this.parent.g.length === 1 && this.parent.o.onCompleted();\n    };\n\n    return MergeAllObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.mergeAll = function () {\n    return new MergeAllObservable(this);\n  };\n\n  var SkipUntilObservable = (function(__super__) {\n    inherits(SkipUntilObservable, __super__);\n\n    function SkipUntilObservable(source, other) {\n      this._s = source;\n      this._o = isPromise(other) ? observableFromPromise(other) : other;\n      this._open = false;\n      __super__.call(this);\n    }\n\n    SkipUntilObservable.prototype.subscribeCore = function(o) {\n      var leftSubscription = new SingleAssignmentDisposable();\n      leftSubscription.setDisposable(this._s.subscribe(new SkipUntilSourceObserver(o, this)));\n\n      isPromise(this._o) && (this._o = observableFromPromise(this._o));\n\n      var rightSubscription = new SingleAssignmentDisposable();\n      rightSubscription.setDisposable(this._o.subscribe(new SkipUntilOtherObserver(o, this, rightSubscription)));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    };\n\n    return SkipUntilObservable;\n  }(ObservableBase));\n\n  var SkipUntilSourceObserver = (function(__super__) {\n    inherits(SkipUntilSourceObserver, __super__);\n    function SkipUntilSourceObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipUntilSourceObserver.prototype.next = function (x) {\n      this._p._open && this._o.onNext(x);\n    };\n\n    SkipUntilSourceObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilSourceObserver.prototype.onCompleted = function () {\n      this._p._open && this._o.onCompleted();\n    };\n\n    return SkipUntilSourceObserver;\n  }(AbstractObserver));\n\n  var SkipUntilOtherObserver = (function(__super__) {\n    inherits(SkipUntilOtherObserver, __super__);\n    function SkipUntilOtherObserver(o, p, r) {\n      this._o = o;\n      this._p = p;\n      this._r = r;\n      __super__.call(this);\n    }\n\n    SkipUntilOtherObserver.prototype.next = function () {\n      this._p._open = true;\n      this._r.dispose();\n    };\n\n    SkipUntilOtherObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilOtherObserver.prototype.onCompleted = function () {\n      this._r.dispose();\n    };\n\n    return SkipUntilOtherObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n   * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n   */\n  observableProto.skipUntil = function (other) {\n    return new SkipUntilObservable(this, other);\n  };\n\n  var SwitchObservable = (function(__super__) {\n    inherits(SwitchObservable, __super__);\n    function SwitchObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    SwitchObservable.prototype.subscribeCore = function (o) {\n      var inner = new SerialDisposable(), s = this.source.subscribe(new SwitchObserver(o, inner));\n      return new BinaryDisposable(s, inner);\n    };\n\n    inherits(SwitchObserver, AbstractObserver);\n    function SwitchObserver(o, inner) {\n      this.o = o;\n      this.inner = inner;\n      this.stopped = false;\n      this.latest = 0;\n      this.hasLatest = false;\n      AbstractObserver.call(this);\n    }\n\n    SwitchObserver.prototype.next = function (innerSource) {\n      var d = new SingleAssignmentDisposable(), id = ++this.latest;\n      this.hasLatest = true;\n      this.inner.setDisposable(d);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      d.setDisposable(innerSource.subscribe(new InnerObserver(this, id)));\n    };\n\n    SwitchObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    SwitchObserver.prototype.completed = function () {\n      this.stopped = true;\n      !this.hasLatest && this.o.onCompleted();\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(parent, id) {\n      this.parent = parent;\n      this.id = id;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function (x) {\n      this.parent.latest === this.id && this.parent.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.parent.latest === this.id && this.parent.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      if (this.parent.latest === this.id) {\n        this.parent.hasLatest = false;\n        this.parent.stopped && this.parent.o.onCompleted();\n      }\n    };\n\n    return SwitchObservable;\n  }(ObservableBase));\n\n  /**\n  * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n  * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n  */\n  observableProto['switch'] = observableProto.switchLatest = function () {\n    return new SwitchObservable(this);\n  };\n\n  var TakeUntilObservable = (function(__super__) {\n    inherits(TakeUntilObservable, __super__);\n\n    function TakeUntilObservable(source, other) {\n      this.source = source;\n      this.other = isPromise(other) ? observableFromPromise(other) : other;\n      __super__.call(this);\n    }\n\n    TakeUntilObservable.prototype.subscribeCore = function(o) {\n      return new BinaryDisposable(\n        this.source.subscribe(o),\n        this.other.subscribe(new TakeUntilObserver(o))\n      );\n    };\n\n    return TakeUntilObservable;\n  }(ObservableBase));\n\n  var TakeUntilObserver = (function(__super__) {\n    inherits(TakeUntilObserver, __super__);\n    function TakeUntilObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    TakeUntilObserver.prototype.next = function () {\n      this._o.onCompleted();\n    };\n\n    TakeUntilObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    TakeUntilObserver.prototype.onCompleted = noop;\n\n    return TakeUntilObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence until the other observable sequence produces a value.\n   * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n   */\n  observableProto.takeUntil = function (other) {\n    return new TakeUntilObservable(this, other);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var WithLatestFromObservable = (function(__super__) {\n    inherits(WithLatestFromObservable, __super__);\n    function WithLatestFromObservable(source, sources, resultSelector) {\n      this._s = source;\n      this._ss = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    WithLatestFromObservable.prototype.subscribeCore = function (o) {\n      var len = this._ss.length;\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        values: new Array(len)\n      };\n\n      var n = this._ss.length, subscriptions = new Array(n + 1);\n      for (var i = 0; i < n; i++) {\n        var other = this._ss[i], sad = new SingleAssignmentDisposable();\n        isPromise(other) && (other = observableFromPromise(other));\n        sad.setDisposable(other.subscribe(new WithLatestFromOtherObserver(o, i, state)));\n        subscriptions[i] = sad;\n      }\n\n      var outerSad = new SingleAssignmentDisposable();\n      outerSad.setDisposable(this._s.subscribe(new WithLatestFromSourceObserver(o, this._cb, state)));\n      subscriptions[n] = outerSad;\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return WithLatestFromObservable;\n  }(ObservableBase));\n\n  var WithLatestFromOtherObserver = (function (__super__) {\n    inherits(WithLatestFromOtherObserver, __super__);\n    function WithLatestFromOtherObserver(o, i, state) {\n      this._o = o;\n      this._i = i;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromOtherObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      this._state.hasValueAll = this._state.hasValue.every(identity);\n    };\n\n    WithLatestFromOtherObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromOtherObserver.prototype.completed = noop;\n\n    return WithLatestFromOtherObserver;\n  }(AbstractObserver));\n\n  var WithLatestFromSourceObserver = (function (__super__) {\n    inherits(WithLatestFromSourceObserver, __super__);\n    function WithLatestFromSourceObserver(o, cb, state) {\n      this._o = o;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromSourceObserver.prototype.next = function (x) {\n      var allValues = [x].concat(this._state.values);\n      if (!this._state.hasValueAll) { return; }\n      var res = tryCatch(this._cb).apply(null, allValues);\n      if (res === errorObj) { return this._o.onError(res.e); }\n      this._o.onNext(res);\n    };\n\n    WithLatestFromSourceObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromSourceObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return WithLatestFromSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.withLatestFrom = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    return new WithLatestFromObservable(this, args, resultSelector);\n  };\n\n  function falseFactory() { return false; }\n  function emptyArrayFactory() { return []; }\n\n  var ZipObservable = (function(__super__) {\n    inherits(ZipObservable, __super__);\n    function ZipObservable(sources, resultSelector) {\n      this._s = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    ZipObservable.prototype.subscribeCore = function(observer) {\n      var n = this._s.length,\n          subscriptions = new Array(n),\n          done = arrayInitialize(n, falseFactory),\n          q = arrayInitialize(n, emptyArrayFactory);\n\n      for (var i = 0; i < n; i++) {\n        var source = this._s[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new ZipObserver(observer, i, this, q, done)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return ZipObservable;\n  }(ObservableBase));\n\n  var ZipObserver = (function (__super__) {\n    inherits(ZipObserver, __super__);\n    function ZipObserver(o, i, p, q, d) {\n      this._o = o;\n      this._i = i;\n      this._p = p;\n      this._q = q;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    function notEmpty(x) { return x.length > 0; }\n    function shiftEach(x) { return x.shift(); }\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    ZipObserver.prototype.next = function (x) {\n      this._q[this._i].push(x);\n      if (this._q.every(notEmpty)) {\n        var queuedValues = this._q.map(shiftEach);\n        var res = tryCatch(this._p._cb).apply(null, queuedValues);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._d.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    ZipObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ZipObserver.prototype.completed = function () {\n      this._d[this._i] = true;\n      this._d.every(identity) && this._o.onCompleted();\n    };\n\n    return ZipObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n   * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n   */\n  observableProto.zip = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    var parent = this;\n    args.unshift(parent);\n\n    return new ZipObservable(args, resultSelector);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n   * @param arguments Observable sources.\n   * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  Observable.zip = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args = isFunction(args[1]) ? args[0].concat(args[1]) : args[0];\n    }\n    var first = args.shift();\n    return first.zip.apply(first, args);\n  };\n\nfunction falseFactory() { return false; }\nfunction emptyArrayFactory() { return []; }\nfunction argumentsToArray() {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return args;\n}\n\nvar ZipIterableObservable = (function(__super__) {\n  inherits(ZipIterableObservable, __super__);\n  function ZipIterableObservable(sources, cb) {\n    this.sources = sources;\n    this._cb = cb;\n    __super__.call(this);\n  }\n\n  ZipIterableObservable.prototype.subscribeCore = function (o) {\n    var sources = this.sources, len = sources.length, subscriptions = new Array(len);\n\n    var state = {\n      q: arrayInitialize(len, emptyArrayFactory),\n      done: arrayInitialize(len, falseFactory),\n      cb: this._cb,\n      o: o\n    };\n\n    for (var i = 0; i < len; i++) {\n      (function (i) {\n        var source = sources[i], sad = new SingleAssignmentDisposable();\n        (isArrayLike(source) || isIterable(source)) && (source = observableFrom(source));\n\n        subscriptions[i] = sad;\n        sad.setDisposable(source.subscribe(new ZipIterableObserver(state, i)));\n      }(i));\n    }\n\n    return new NAryDisposable(subscriptions);\n  };\n\n  return ZipIterableObservable;\n}(ObservableBase));\n\nvar ZipIterableObserver = (function (__super__) {\n  inherits(ZipIterableObserver, __super__);\n  function ZipIterableObserver(s, i) {\n    this._s = s;\n    this._i = i;\n    __super__.call(this);\n  }\n\n  function notEmpty(x) { return x.length > 0; }\n  function shiftEach(x) { return x.shift(); }\n  function notTheSame(i) {\n    return function (x, j) {\n      return j !== i;\n    };\n  }\n\n  ZipIterableObserver.prototype.next = function (x) {\n    this._s.q[this._i].push(x);\n    if (this._s.q.every(notEmpty)) {\n      var queuedValues = this._s.q.map(shiftEach),\n          res = tryCatch(this._s.cb).apply(null, queuedValues);\n      if (res === errorObj) { return this._s.o.onError(res.e); }\n      this._s.o.onNext(res);\n    } else if (this._s.done.filter(notTheSame(this._i)).every(identity)) {\n      this._s.o.onCompleted();\n    }\n  };\n\n  ZipIterableObserver.prototype.error = function (e) { this._s.o.onError(e); };\n\n  ZipIterableObserver.prototype.completed = function () {\n    this._s.done[this._i] = true;\n    this._s.done.every(identity) && this._s.o.onCompleted();\n  };\n\n  return ZipIterableObserver;\n}(AbstractObserver));\n\n/**\n * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n */\nobservableProto.zipIterable = function () {\n  if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n\n  var parent = this;\n  args.unshift(parent);\n  return new ZipIterableObservable(args, resultSelector);\n};\n\n  function asObservable(source) {\n    return function subscribe(o) { return source.subscribe(o); };\n  }\n\n  /**\n   *  Hides the identity of an observable sequence.\n   * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n   */\n  observableProto.asObservable = function () {\n    return new AnonymousObservable(asObservable(this), this);\n  };\n\n  var DematerializeObservable = (function (__super__) {\n    inherits(DematerializeObservable, __super__);\n    function DematerializeObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    DematerializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DematerializeObserver(o));\n    };\n\n    return DematerializeObservable;\n  }(ObservableBase));\n\n  var DematerializeObserver = (function (__super__) {\n    inherits(DematerializeObserver, __super__);\n\n    function DematerializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    DematerializeObserver.prototype.next = function (x) { x.accept(this._o); };\n    DematerializeObserver.prototype.error = function (e) { this._o.onError(e); };\n    DematerializeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DematerializeObserver;\n  }(AbstractObserver));\n\n  /**\n   * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n   * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n   */\n  observableProto.dematerialize = function () {\n    return new DematerializeObservable(this);\n  };\n\n  var DistinctUntilChangedObservable = (function(__super__) {\n    inherits(DistinctUntilChangedObservable, __super__);\n    function DistinctUntilChangedObservable(source, keyFn, comparer) {\n      this.source = source;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctUntilChangedObserver(o, this.keyFn, this.comparer));\n    };\n\n    return DistinctUntilChangedObservable;\n  }(ObservableBase));\n\n  var DistinctUntilChangedObserver = (function(__super__) {\n    inherits(DistinctUntilChangedObserver, __super__);\n    function DistinctUntilChangedObserver(o, keyFn, comparer) {\n      this.o = o;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      this.hasCurrentKey = false;\n      this.currentKey = null;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObserver.prototype.next = function (x) {\n      var key = x, comparerEquals;\n      if (isFunction(this.keyFn)) {\n        key = tryCatch(this.keyFn)(x);\n        if (key === errorObj) { return this.o.onError(key.e); }\n      }\n      if (this.hasCurrentKey) {\n        comparerEquals = tryCatch(this.comparer)(this.currentKey, key);\n        if (comparerEquals === errorObj) { return this.o.onError(comparerEquals.e); }\n      }\n      if (!this.hasCurrentKey || !comparerEquals) {\n        this.hasCurrentKey = true;\n        this.currentKey = key;\n        this.o.onNext(x);\n      }\n    };\n    DistinctUntilChangedObserver.prototype.error = function(e) {\n      this.o.onError(e);\n    };\n    DistinctUntilChangedObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return DistinctUntilChangedObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Returns an observable sequence that contains only distinct contiguous elements according to the keyFn and the comparer.\n  * @param {Function} [keyFn] A function to compute the comparison key for each element. If not provided, it projects the value.\n  * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n  * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n  */\n  observableProto.distinctUntilChanged = function (keyFn, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctUntilChangedObservable(this, keyFn, comparer);\n  };\n\n  var TapObservable = (function(__super__) {\n    inherits(TapObservable,__super__);\n    function TapObservable(source, observerOrOnNext, onError, onCompleted) {\n      this.source = source;\n      this._oN = observerOrOnNext;\n      this._oE = onError;\n      this._oC = onCompleted;\n      __super__.call(this);\n    }\n\n    TapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, p) {\n      this.o = o;\n      this.t = !p._oN || isFunction(p._oN) ?\n        observerCreate(p._oN || noop, p._oE || noop, p._oC || noop) :\n        p._oN;\n      this.isStopped = false;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function(x) {\n      var res = tryCatch(this.t.onNext).call(this.t, x);\n      if (res === errorObj) { this.o.onError(res.e); }\n      this.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function(err) {\n      var res = tryCatch(this.t.onError).call(this.t, err);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onError(err);\n    };\n    InnerObserver.prototype.completed = function() {\n      var res = tryCatch(this.t.onCompleted).call(this.t);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onCompleted();\n    };\n\n    return TapObservable;\n  }(ObservableBase));\n\n  /**\n  *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an o.\n  * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto['do'] = observableProto.tap = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) {\n    return new TapObservable(this, observerOrOnNext, onError, onCompleted);\n  };\n\n  /**\n  *  Invokes an action for each element in the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onNext Action to invoke for each element in the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnNext = observableProto.tapOnNext = function (onNext, thisArg) {\n    return this.tap(typeof thisArg !== 'undefined' ? function (x) { onNext.call(thisArg, x); } : onNext);\n  };\n\n  /**\n  *  Invokes an action upon exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnError = observableProto.tapOnError = function (onError, thisArg) {\n    return this.tap(noop, typeof thisArg !== 'undefined' ? function (e) { onError.call(thisArg, e); } : onError);\n  };\n\n  /**\n  *  Invokes an action upon graceful termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnCompleted = observableProto.tapOnCompleted = function (onCompleted, thisArg) {\n    return this.tap(noop, null, typeof thisArg !== 'undefined' ? function () { onCompleted.call(thisArg); } : onCompleted);\n  };\n\n  var FinallyObservable = (function (__super__) {\n    inherits(FinallyObservable, __super__);\n    function FinallyObservable(source, fn, thisArg) {\n      this.source = source;\n      this._fn = bindCallback(fn, thisArg, 0);\n      __super__.call(this);\n    }\n\n    FinallyObservable.prototype.subscribeCore = function (o) {\n      var d = tryCatch(this.source.subscribe).call(this.source, o);\n      if (d === errorObj) {\n        this._fn();\n        thrower(d.e);\n      }\n\n      return new FinallyDisposable(d, this._fn);\n    };\n\n    function FinallyDisposable(s, fn) {\n      this.isDisposed = false;\n      this._s = s;\n      this._fn = fn;\n    }\n    FinallyDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        var res = tryCatch(this._s.dispose).call(this._s);\n        this._fn();\n        res === errorObj && thrower(res.e);\n      }\n    };\n\n    return FinallyObservable;\n\n  }(ObservableBase));\n\n  /**\n   *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n   * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n   * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n   */\n  observableProto['finally'] = function (action, thisArg) {\n    return new FinallyObservable(this, action, thisArg);\n  };\n\n  var IgnoreElementsObservable = (function(__super__) {\n    inherits(IgnoreElementsObservable, __super__);\n\n    function IgnoreElementsObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    IgnoreElementsObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    function InnerObserver(o) {\n      this.o = o;\n      this.isStopped = false;\n    }\n    InnerObserver.prototype.onNext = noop;\n    InnerObserver.prototype.onError = function (err) {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onError(err);\n      }\n    };\n    InnerObserver.prototype.onCompleted = function () {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onCompleted();\n      }\n    };\n    InnerObserver.prototype.dispose = function() { this.isStopped = true; };\n    InnerObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.observer.onError(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return IgnoreElementsObservable;\n  }(ObservableBase));\n\n  /**\n   *  Ignores all elements in an observable sequence leaving only the termination messages.\n   * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n   */\n  observableProto.ignoreElements = function () {\n    return new IgnoreElementsObservable(this);\n  };\n\n  var MaterializeObservable = (function (__super__) {\n    inherits(MaterializeObservable, __super__);\n    function MaterializeObservable(source, fn) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MaterializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new MaterializeObserver(o));\n    };\n\n    return MaterializeObservable;\n  }(ObservableBase));\n\n  var MaterializeObserver = (function (__super__) {\n    inherits(MaterializeObserver, __super__);\n\n    function MaterializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    MaterializeObserver.prototype.next = function (x) { this._o.onNext(notificationCreateOnNext(x)) };\n    MaterializeObserver.prototype.error = function (e) { this._o.onNext(notificationCreateOnError(e)); this._o.onCompleted(); };\n    MaterializeObserver.prototype.completed = function () { this._o.onNext(notificationCreateOnCompleted()); this._o.onCompleted(); };\n\n    return MaterializeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n   * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n   */\n  observableProto.materialize = function () {\n    return new MaterializeObservable(this);\n  };\n\n  /**\n   *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n   * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n   * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n   */\n  observableProto.repeat = function (repeatCount) {\n    return enumerableRepeat(this, repeatCount).concat();\n  };\n\n  /**\n   *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n   *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n   *\n   * @example\n   *  var res = retried = retry.repeat();\n   *  var res = retried = retry.repeat(2);\n   * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retry = function (retryCount) {\n    return enumerableRepeat(this, retryCount).catchError();\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RetryWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RetryWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RetryWhenObservable, __super__);\n\n    RetryWhenObservable.prototype.subscribeCore = function (o) {\n      var exceptions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(exceptions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            exceptions.onNext(exn);\n            outer.dispose();\n          },\n          function() { o.onCompleted(); }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RetryWhenObservable;\n  }(ObservableBase));\n\n  observableProto.retryWhen = function (notifier) {\n    return new RetryWhenObservable(repeat(this), notifier);\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RepeatWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RepeatWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RepeatWhenObservable, __super__);\n\n    RepeatWhenObservable.prototype.subscribeCore = function (o) {\n      var completions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(completions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) { o.onError(exn); },\n          function() {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            completions.onNext(null);\n            outer.dispose();\n          }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RepeatWhenObservable;\n  }(ObservableBase));\n\n  observableProto.repeatWhen = function (notifier) {\n    return new RepeatWhenObservable(repeat(this), notifier);\n  };\n\n  var ScanObservable = (function(__super__) {\n    inherits(ScanObservable, __super__);\n    function ScanObservable(source, accumulator, hasSeed, seed) {\n      this.source = source;\n      this.accumulator = accumulator;\n      this.hasSeed = hasSeed;\n      this.seed = seed;\n      __super__.call(this);\n    }\n\n    ScanObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new ScanObserver(o,this));\n    };\n\n    return ScanObservable;\n  }(ObservableBase));\n\n  var ScanObserver = (function (__super__) {\n    inherits(ScanObserver, __super__);\n    function ScanObserver(o, parent) {\n      this._o = o;\n      this._p = parent;\n      this._fn = parent.accumulator;\n      this._hs = parent.hasSeed;\n      this._s = parent.seed;\n      this._ha = false;\n      this._a = null;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    ScanObserver.prototype.next = function (x) {\n      !this._hv && (this._hv = true);\n      if (this._ha) {\n        this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n      } else {\n        this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n        this._ha = true;\n      }\n      if (this._a === errorObj) { return this._o.onError(this._a.e); }\n      this._o.onNext(this._a);\n      this._i++;\n    };\n\n    ScanObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ScanObserver.prototype.completed = function () {\n      !this._hv && this._hs && this._o.onNext(this._s);\n      this._o.onCompleted();\n    };\n\n    return ScanObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n  *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n  * @param {Mixed} [seed] The initial accumulator value.\n  * @param {Function} accumulator An accumulator function to be invoked on each element.\n  * @returns {Observable} An observable sequence containing the accumulated values.\n  */\n  observableProto.scan = function () {\n    var hasSeed = false, seed, accumulator = arguments[0];\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new ScanObservable(this, accumulator, hasSeed, seed);\n  };\n\n  var SkipLastObservable = (function (__super__) {\n    inherits(SkipLastObservable, __super__);\n    function SkipLastObservable(source, c) {\n      this.source = source;\n      this._c = c;\n      __super__.call(this);\n    }\n\n    SkipLastObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipLastObserver(o, this._c));\n    };\n\n    return SkipLastObservable;\n  }(ObservableBase));\n\n  var SkipLastObserver = (function (__super__) {\n    inherits(SkipLastObserver, __super__);\n    function SkipLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    SkipLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._o.onNext(this._q.shift());\n    };\n\n    SkipLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    SkipLastObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return SkipLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses a specified number of elements at the end of an observable sequence.\n   * @description\n   *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n   *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n   * @param count Number of elements to bypass at the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n   */\n  observableProto.skipLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipLastObservable(this, count);\n  };\n\n  /**\n   *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n   *  @example\n   *  var res = source.startWith(1, 2, 3);\n   *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n   * @param {Arguments} args The specified values to prepend to the observable sequence\n   * @returns {Observable} The source sequence prepended with the specified values.\n   */\n  observableProto.startWith = function () {\n    var values, scheduler, start = 0;\n    if (!!arguments.length && isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      start = 1;\n    } else {\n      scheduler = immediateScheduler;\n    }\n    for(var args = [], i = start, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableConcat.apply(null, [observableFromArray(args, scheduler), this]);\n  };\n\n  var TakeLastObserver = (function (__super__) {\n    inherits(TakeLastObserver, __super__);\n    function TakeLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastObserver.prototype.completed = function () {\n      while (this._q.length > 0) { this._o.onNext(this._q.shift()); }\n      this._o.onCompleted();\n    };\n\n    return TakeLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns a specified number of contiguous elements from the end of an observable sequence.\n   * @description\n   *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n   *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastObserver(o, count));\n    }, source);\n  };\n\nobservableProto.flatMapConcat = observableProto.concatMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).merge(1);\n};\n  var MapObservable = (function (__super__) {\n    inherits(MapObservable, __super__);\n\n    function MapObservable(source, selector, thisArg) {\n      this.source = source;\n      this.selector = bindCallback(selector, thisArg, 3);\n      __super__.call(this);\n    }\n\n    function innerMap(selector, self) {\n      return function (x, i, o) { return selector.call(this, self.selector(x, i, o), i, o); };\n    }\n\n    MapObservable.prototype.internalMap = function (selector, thisArg) {\n      return new MapObservable(this.source, innerMap(selector, this), thisArg);\n    };\n\n    MapObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, selector, source) {\n      this.o = o;\n      this.selector = selector;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var result = tryCatch(this.selector)(x, this.i++, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n      this.o.onNext(result);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return MapObservable;\n\n  }(ObservableBase));\n\n  /**\n  * Projects each element of an observable sequence into a new form by incorporating the element's index.\n  * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n  */\n  observableProto.map = observableProto.select = function (selector, thisArg) {\n    var selectorFn = typeof selector === 'function' ? selector : function () { return selector; };\n    return this instanceof MapObservable ?\n      this.internalMap(selectorFn, thisArg) :\n      new MapObservable(this, selectorFn, thisArg);\n  };\n\n  function plucker(args, len) {\n    return function mapper(x) {\n      var currentProp = x;\n      for (var i = 0; i < len; i++) {\n        var p = currentProp[args[i]];\n        if (typeof p !== 'undefined') {\n          currentProp = p;\n        } else {\n          return undefined;\n        }\n      }\n      return currentProp;\n    };\n  }\n\n  /**\n   * Retrieves the value of a specified nested property from all elements in\n   * the Observable sequence.\n   * @param {Arguments} arguments The nested properties to pluck.\n   * @returns {Observable} Returns a new Observable sequence of property values.\n   */\n  observableProto.pluck = function () {\n    var len = arguments.length, args = new Array(len);\n    if (len === 0) { throw new Error('List of properties cannot be empty.'); }\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return this.map(plucker(args, len));\n  };\n\nobservableProto.flatMap = observableProto.selectMany = observableProto.mergeMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).mergeAll();\n};\n\nobservableProto.flatMapLatest = observableProto.switchMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).switchLatest();\n};\n\n  var SkipObservable = (function(__super__) {\n    inherits(SkipObservable, __super__);\n    function SkipObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    SkipObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipObserver(o, this._count));\n    };\n\n    function SkipObserver(o, c) {\n      this._o = o;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(SkipObserver, AbstractObserver);\n\n    SkipObserver.prototype.next = function (x) {\n      if (this._r <= 0) {\n        this._o.onNext(x);\n      } else {\n        this._r--;\n      }\n    };\n    SkipObserver.prototype.error = function(e) { this._o.onError(e); };\n    SkipObserver.prototype.completed = function() { this._o.onCompleted(); };\n\n    return SkipObservable;\n  }(ObservableBase));\n\n  /**\n   * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n   * @param {Number} count The number of elements to skip before returning the remaining elements.\n   * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n   */\n  observableProto.skip = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipObservable(this, count);\n  };\n\n  var SkipWhileObservable = (function (__super__) {\n    inherits(SkipWhileObservable, __super__);\n    function SkipWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SkipWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipWhileObserver(o, this));\n    };\n\n    return SkipWhileObservable;\n  }(ObservableBase));\n\n  var SkipWhileObserver = (function (__super__) {\n    inherits(SkipWhileObserver, __super__);\n\n    function SkipWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = false;\n      __super__.call(this);\n    }\n\n    SkipWhileObserver.prototype.next = function (x) {\n      if (!this._r) {\n        var res = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._r = !res;\n      }\n      this._r && this._o.onNext(x);\n    };\n    SkipWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n   *  The element's index is used in the logic of the predicate function.\n   *\n   *  var res = source.skipWhile(function (value) { return value < 10; });\n   *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n   */\n  observableProto.skipWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new SkipWhileObservable(this, fn);\n  };\n\n  var TakeObservable = (function(__super__) {\n    inherits(TakeObservable, __super__);\n    function TakeObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    TakeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeObserver(o, this._count));\n    };\n\n    function TakeObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(TakeObserver, AbstractObserver);\n\n    TakeObserver.prototype.next = function (x) {\n      if (this._r-- > 0) {\n        this._o.onNext(x);\n        this._r <= 0 && this._o.onCompleted();\n      }\n    };\n\n    TakeObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n   * @param {Number} count The number of elements to return.\n   * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n   * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n   */\n  observableProto.take = function (count, scheduler) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    if (count === 0) { return observableEmpty(scheduler); }\n    return new TakeObservable(this, count);\n  };\n\n  var TakeWhileObservable = (function (__super__) {\n    inherits(TakeWhileObservable, __super__);\n    function TakeWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    TakeWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeWhileObserver(o, this));\n    };\n\n    return TakeWhileObservable;\n  }(ObservableBase));\n\n  var TakeWhileObserver = (function (__super__) {\n    inherits(TakeWhileObserver, __super__);\n\n    function TakeWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = true;\n      __super__.call(this);\n    }\n\n    TakeWhileObserver.prototype.next = function (x) {\n      if (this._r) {\n        this._r = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (this._r === errorObj) { return this._o.onError(this._r.e); }\n      }\n      if (this._r) {\n        this._o.onNext(x);\n      } else {\n        this._o.onCompleted();\n      }\n    };\n    TakeWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns elements from an observable sequence as long as a specified condition is true.\n   *  The element's index is used in the logic of the predicate function.\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n   */\n  observableProto.takeWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new TakeWhileObservable(this, fn);\n  };\n\n  var FilterObservable = (function (__super__) {\n    inherits(FilterObservable, __super__);\n\n    function FilterObservable(source, predicate, thisArg) {\n      this.source = source;\n      this.predicate = bindCallback(predicate, thisArg, 3);\n      __super__.call(this);\n    }\n\n    FilterObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.predicate, this));\n    };\n\n    function innerPredicate(predicate, self) {\n      return function(x, i, o) { return self.predicate(x, i, o) && predicate.call(this, x, i, o); }\n    }\n\n    FilterObservable.prototype.internalFilter = function(predicate, thisArg) {\n      return new FilterObservable(this.source, innerPredicate(predicate, this), thisArg);\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, predicate, source) {\n      this.o = o;\n      this.predicate = predicate;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var shouldYield = tryCatch(this.predicate)(x, this.i++, this.source);\n      if (shouldYield === errorObj) {\n        return this.o.onError(shouldYield.e);\n      }\n      shouldYield && this.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return FilterObservable;\n\n  }(ObservableBase));\n\n  /**\n  *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n  * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n  */\n  observableProto.filter = observableProto.where = function (predicate, thisArg) {\n    return this instanceof FilterObservable ? this.internalFilter(predicate, thisArg) :\n      new FilterObservable(this, predicate, thisArg);\n  };\n\nfunction createCbObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createCbHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createCbHandler(o, ctx, selector) {\n  return function handler () {\n    var len = arguments.length, results = new Array(len);\n    for(var i = 0; i < len; i++) { results[i] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a callback function to an observable sequence.\n *\n * @param {Function} fn Function with a callback as the last parameter to convert to an Observable sequence.\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n */\nObservable.fromCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n\n    var len = arguments.length, args = new Array(len)\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createCbObservable(fn, ctx, selector, args);\n  };\n};\n\nfunction createNodeObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createNodeHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createNodeHandler(o, ctx, selector) {\n  return function handler () {\n    var err = arguments[0];\n    if (err) { return o.onError(err); }\n\n    var len = arguments.length, results = [];\n    for(var i = 1; i < len; i++) { results[i - 1] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      var results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n * @param {Function} fn The function to call\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n */\nObservable.fromNodeCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createNodeObservable(fn, ctx, selector, args);\n  };\n};\n\n  function isNodeList(el) {\n    if (root.StaticNodeList) {\n      // IE8 Specific\n      // instanceof is slower than Object#toString, but Object#toString will not work as intended in IE8\n      return el instanceof root.StaticNodeList || el instanceof root.NodeList;\n    } else {\n      return Object.prototype.toString.call(el) === '[object NodeList]';\n    }\n  }\n\n  function ListenDisposable(e, n, fn) {\n    this._e = e;\n    this._n = n;\n    this._fn = fn;\n    this._e.addEventListener(this._n, this._fn, false);\n    this.isDisposed = false;\n  }\n  ListenDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this._e.removeEventListener(this._n, this._fn, false);\n      this.isDisposed = true;\n    }\n  };\n\n  function createEventListener (el, eventName, handler) {\n    var disposables = new CompositeDisposable();\n\n    // Asume NodeList or HTMLCollection\n    var elemToString = Object.prototype.toString.call(el);\n    if (isNodeList(el) || elemToString === '[object HTMLCollection]') {\n      for (var i = 0, len = el.length; i < len; i++) {\n        disposables.add(createEventListener(el.item(i), eventName, handler));\n      }\n    } else if (el) {\n      disposables.add(new ListenDisposable(el, eventName, handler));\n    }\n\n    return disposables;\n  }\n\n  /**\n   * Configuration option to determine whether to use native events only\n   */\n  Rx.config.useNativeEvents = false;\n\n  var EventObservable = (function(__super__) {\n    inherits(EventObservable, __super__);\n    function EventObservable(el, name, fn) {\n      this._el = el;\n      this._n = name;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventObservable.prototype.subscribeCore = function (o) {\n      return createEventListener(\n        this._el,\n        this._n,\n        createHandler(o, this._fn));\n    };\n\n    return EventObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n   * @param {Object} element The DOMElement or NodeList to attach a listener.\n   * @param {String} eventName The event name to attach the observable sequence.\n   * @param {Object} eventListenerOptions An object describing EventListenerOptions\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n   */\n  Observable.fromEvent = function (element, eventName, selector, eventListenerOptions) {\n    // Node.js specific\n    if (element.addListener) {\n      return fromEventPattern(\n        function (h) { element.addListener(eventName, h, eventListenerOptions); },\n        function (h) { element.removeListener(eventName, h, eventListenerOptions); },\n        selector);\n    }\n\n    // Use only if non-native events are allowed\n    if (!Rx.config.useNativeEvents) {\n      // Handles jq, Angular.js, Zepto, Marionette, Ember.js\n      if (typeof element.on === 'function' && typeof element.off === 'function') {\n        return fromEventPattern(\n          function (h) { element.on(eventName, h, eventListenerOptions); },\n          function (h) { element.off(eventName, h, eventListenerOptions); },\n          selector);\n      }\n    }\n\n    return new EventObservable(element, eventName, selector).publish().refCount();\n  };\n\n  var EventPatternObservable = (function(__super__) {\n    inherits(EventPatternObservable, __super__);\n    function EventPatternObservable(add, del, fn) {\n      this._add = add;\n      this._del = del;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventPatternObservable.prototype.subscribeCore = function (o) {\n      var fn = createHandler(o, this._fn);\n      var returnValue = this._add(fn);\n      return new EventPatternDisposable(this._del, fn, returnValue);\n    };\n\n    function EventPatternDisposable(del, fn, ret) {\n      this._del = del;\n      this._fn = fn;\n      this._ret = ret;\n      this.isDisposed = false;\n    }\n\n    EventPatternDisposable.prototype.dispose = function () {\n      if(!this.isDisposed) {\n        isFunction(this._del) && this._del(this._fn, this._ret);\n        this.isDisposed = true;\n      }\n    };\n\n    return EventPatternObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n   * @param {Function} addHandler The function to add a handler to the emitter.\n   * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence which wraps an event from an event emitter\n   */\n  var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) {\n    return new EventPatternObservable(addHandler, removeHandler, selector).publish().refCount();\n  };\n\n  var FromPromiseObservable = (function(__super__) {\n    inherits(FromPromiseObservable, __super__);\n    function FromPromiseObservable(p, s) {\n      this._p = p;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleNext(s, state) {\n      var o = state[0], data = state[1];\n      o.onNext(data);\n      o.onCompleted();\n    }\n\n    function scheduleError(s, state) {\n      var o = state[0], err = state[1];\n      o.onError(err);\n    }\n\n    FromPromiseObservable.prototype.subscribeCore = function(o) {\n      var sad = new SingleAssignmentDisposable(), self = this, p = this._p;\n\n      if (isFunction(p)) {\n        p = tryCatch(p)();\n        if (p === errorObj) {\n          o.onError(p.e);\n          return sad;\n        }\n      }\n\n      p\n        .then(function (data) {\n          sad.setDisposable(self._s.schedule([o, data], scheduleNext));\n        }, function (err) {\n          sad.setDisposable(self._s.schedule([o, err], scheduleError));\n        });\n\n      return sad;\n    };\n\n    return FromPromiseObservable;\n  }(ObservableBase));\n\n  /**\n  * Converts a Promise to an Observable sequence\n  * @param {Promise} An ES6 Compliant promise.\n  * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n  */\n  var observableFromPromise = Observable.fromPromise = function (promise, scheduler) {\n    scheduler || (scheduler = defaultScheduler);\n    return new FromPromiseObservable(promise, scheduler);\n  };\n\n  /*\n   * Converts an existing observable sequence to an ES6 Compatible Promise\n   * @example\n   * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n   *\n   * // With config\n   * Rx.config.Promise = RSVP.Promise;\n   * var promise = Rx.Observable.return(42).toPromise();\n   * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n   * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n   */\n  observableProto.toPromise = function (promiseCtor) {\n    promiseCtor || (promiseCtor = Rx.config.Promise);\n    if (!promiseCtor) { throw new NotSupportedError('Promise type not provided nor in Rx.config.Promise'); }\n    var source = this;\n    return new promiseCtor(function (resolve, reject) {\n      // No cancellation can be done\n      var value;\n      source.subscribe(function (v) {\n        value = v;\n      }, reject, function () {\n        resolve(value);\n      });\n    });\n  };\n\n  /**\n   * Invokes the asynchronous function, surfacing the result through an observable sequence.\n   * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   */\n  Observable.startAsync = function (functionAsync) {\n    var promise = tryCatch(functionAsync)();\n    if (promise === errorObj) { return observableThrow(promise.e); }\n    return observableFromPromise(promise);\n  };\n\n  var MulticastObservable = (function (__super__) {\n    inherits(MulticastObservable, __super__);\n    function MulticastObservable(source, fn1, fn2) {\n      this.source = source;\n      this._fn1 = fn1;\n      this._fn2 = fn2;\n      __super__.call(this);\n    }\n\n    MulticastObservable.prototype.subscribeCore = function (o) {\n      var connectable = this.source.multicast(this._fn1());\n      return new BinaryDisposable(this._fn2(connectable).subscribe(o), connectable.connect());\n    };\n\n    return MulticastObservable;\n  }(ObservableBase));\n\n  /**\n   * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n   * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n   * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n   *\n   * @example\n   * 1 - res = source.multicast(observable);\n   * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n   *\n   * @param {Function|Subject} subjectOrSubjectSelector\n   * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n   * Or:\n   * Subject to push source elements into.\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.multicast = function (subjectOrSubjectSelector, selector) {\n    return isFunction(subjectOrSubjectSelector) ?\n      new MulticastObservable(this, subjectOrSubjectSelector, selector) :\n      new ConnectableObservable(this, subjectOrSubjectSelector);\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of Multicast using a regular Subject.\n   *\n   * @example\n   * var resres = source.publish();\n   * var res = source.publish(function (x) { return x; });\n   *\n   * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publish = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new Subject(); }, selector) :\n      this.multicast(new Subject());\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.share = function () {\n    return this.publish().refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n   * This operator is a specialization of Multicast using a AsyncSubject.\n   *\n   * @example\n   * var res = source.publishLast();\n   * var res = source.publishLast(function (x) { return x; });\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishLast = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new AsyncSubject(); }, selector) :\n      this.multicast(new AsyncSubject());\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n   * This operator is a specialization of Multicast using a BehaviorSubject.\n   *\n   * @example\n   * var res = source.publishValue(42);\n   * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishValue = function (initialValueOrSelector, initialValue) {\n    return arguments.length === 2 ?\n      this.multicast(function () {\n        return new BehaviorSubject(initialValue);\n      }, initialValueOrSelector) :\n      this.multicast(new BehaviorSubject(initialValueOrSelector));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n   * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareValue = function (initialValue) {\n    return this.publishValue(initialValue).refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of Multicast using a ReplaySubject.\n   *\n   * @example\n   * var res = source.replay(null, 3);\n   * var res = source.replay(null, 3, 500);\n   * var res = source.replay(null, 3, 500, scheduler);\n   * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param windowSize [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.replay = function (selector, bufferSize, windowSize, scheduler) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new ReplaySubject(bufferSize, windowSize, scheduler); }, selector) :\n      this.multicast(new ReplaySubject(bufferSize, windowSize, scheduler));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   *\n   * @example\n   * var res = source.shareReplay(3);\n   * var res = source.shareReplay(3, 500);\n   * var res = source.shareReplay(3, 500, scheduler);\n   *\n\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareReplay = function (bufferSize, windowSize, scheduler) {\n    return this.replay(null, bufferSize, windowSize, scheduler).refCount();\n  };\n\n  var RefCountObservable = (function (__super__) {\n    inherits(RefCountObservable, __super__);\n    function RefCountObservable(source) {\n      this.source = source;\n      this._count = 0;\n      this._connectableSubscription = null;\n      __super__.call(this);\n    }\n\n    RefCountObservable.prototype.subscribeCore = function (o) {\n      var subscription = this.source.subscribe(o);\n      ++this._count === 1 && (this._connectableSubscription = this.source.connect());\n      return new RefCountDisposable(this, subscription);\n    };\n\n    function RefCountDisposable(p, s) {\n      this._p = p;\n      this._s = s;\n      this.isDisposed = false;\n    }\n\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this._s.dispose();\n        --this._p._count === 0 && this._p._connectableSubscription.dispose();\n      }\n    };\n\n    return RefCountObservable;\n  }(ObservableBase));\n\n  var ConnectableObservable = Rx.ConnectableObservable = (function (__super__) {\n    inherits(ConnectableObservable, __super__);\n    function ConnectableObservable(source, subject) {\n      this.source = source;\n      this._connection = null;\n      this._source = source.asObservable();\n      this._subject = subject;\n      __super__.call(this);\n    }\n\n    function ConnectDisposable(parent, subscription) {\n      this._p = parent;\n      this._s = subscription;\n    }\n\n    ConnectDisposable.prototype.dispose = function () {\n      if (this._s) {\n        this._s.dispose();\n        this._s = null;\n        this._p._connection = null;\n      }\n    };\n\n    ConnectableObservable.prototype.connect = function () {\n      if (!this._connection) {\n        if (this._subject.isStopped) {\n          return disposableEmpty;\n        }\n        var subscription = this._source.subscribe(this._subject);\n        this._connection = new ConnectDisposable(this, subscription);\n      }\n      return this._connection;\n    };\n\n    ConnectableObservable.prototype._subscribe = function (o) {\n      return this._subject.subscribe(o);\n    };\n\n    ConnectableObservable.prototype.refCount = function () {\n      return new RefCountObservable(this);\n    };\n\n    return ConnectableObservable;\n  }(Observable));\n\n  var TimerObservable = (function(__super__) {\n    inherits(TimerObservable, __super__);\n    function TimerObservable(dt, s) {\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimerObservable.prototype.subscribeCore = function (o) {\n      return this._s.scheduleFuture(o, this._dt, scheduleMethod);\n    };\n\n    function scheduleMethod(s, o) {\n      o.onNext(0);\n      o.onCompleted();\n    }\n\n    return TimerObservable;\n  }(ObservableBase));\n\n  function _observableTimer(dueTime, scheduler) {\n    return new TimerObservable(dueTime, scheduler);\n  }\n\n  function observableTimerDateAndPeriod(dueTime, period, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var d = dueTime, p = normalizeTime(period);\n      return scheduler.scheduleRecursiveFuture(0, d, function (count, self) {\n        if (p > 0) {\n          var now = scheduler.now();\n          d = new Date(d.getTime() + p);\n          d.getTime() <= now && (d = new Date(now + p));\n        }\n        observer.onNext(count);\n        self(count + 1, new Date(d));\n      });\n    });\n  }\n\n  function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) {\n    return dueTime === period ?\n      new AnonymousObservable(function (observer) {\n        return scheduler.schedulePeriodic(0, period, function (count) {\n          observer.onNext(count);\n          return count + 1;\n        });\n      }) :\n      observableDefer(function () {\n        return observableTimerDateAndPeriod(new Date(scheduler.now() + dueTime), period, scheduler);\n      });\n  }\n\n  /**\n   *  Returns an observable sequence that produces a value after each period.\n   *\n   * @example\n   *  1 - res = Rx.Observable.interval(1000);\n   *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n   *\n   * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n   * @returns {Observable} An observable sequence that produces a value after each period.\n   */\n  var observableinterval = Observable.interval = function (period, scheduler) {\n    return observableTimerTimeSpanAndPeriod(period, period, isScheduler(scheduler) ? scheduler : defaultScheduler);\n  };\n\n  /**\n   *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n   * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n   */\n  var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) {\n    var period;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    if (periodOrScheduler != null && typeof periodOrScheduler === 'number') {\n      period = periodOrScheduler;\n    } else if (isScheduler(periodOrScheduler)) {\n      scheduler = periodOrScheduler;\n    }\n    if ((dueTime instanceof Date || typeof dueTime === 'number') && period === undefined) {\n      return _observableTimer(dueTime, scheduler);\n    }\n    if (dueTime instanceof Date && period !== undefined) {\n      return observableTimerDateAndPeriod(dueTime, periodOrScheduler, scheduler);\n    }\n    return observableTimerTimeSpanAndPeriod(dueTime, period, scheduler);\n  };\n\n  function observableDelayRelative(source, dueTime, scheduler) {\n    return new AnonymousObservable(function (o) {\n      var active = false,\n        cancelable = new SerialDisposable(),\n        exception = null,\n        q = [],\n        running = false,\n        subscription;\n      subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) {\n        var d, shouldRun;\n        if (notification.value.kind === 'E') {\n          q = [];\n          q.push(notification);\n          exception = notification.value.error;\n          shouldRun = !running;\n        } else {\n          q.push({ value: notification.value, timestamp: notification.timestamp + dueTime });\n          shouldRun = !active;\n          active = true;\n        }\n        if (shouldRun) {\n          if (exception !== null) {\n            o.onError(exception);\n          } else {\n            d = new SingleAssignmentDisposable();\n            cancelable.setDisposable(d);\n            d.setDisposable(scheduler.scheduleRecursiveFuture(null, dueTime, function (_, self) {\n              var e, recurseDueTime, result, shouldRecurse;\n              if (exception !== null) {\n                return;\n              }\n              running = true;\n              do {\n                result = null;\n                if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) {\n                  result = q.shift().value;\n                }\n                if (result !== null) {\n                  result.accept(o);\n                }\n              } while (result !== null);\n              shouldRecurse = false;\n              recurseDueTime = 0;\n              if (q.length > 0) {\n                shouldRecurse = true;\n                recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now());\n              } else {\n                active = false;\n              }\n              e = exception;\n              running = false;\n              if (e !== null) {\n                o.onError(e);\n              } else if (shouldRecurse) {\n                self(null, recurseDueTime);\n              }\n            }));\n          }\n        }\n      });\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  function observableDelayAbsolute(source, dueTime, scheduler) {\n    return observableDefer(function () {\n      return observableDelayRelative(source, dueTime - scheduler.now(), scheduler);\n    });\n  }\n\n  function delayWithSelector(source, subscriptionDelay, delayDurationSelector) {\n    var subDelay, selector;\n    if (isFunction(subscriptionDelay)) {\n      selector = subscriptionDelay;\n    } else {\n      subDelay = subscriptionDelay;\n      selector = delayDurationSelector;\n    }\n    return new AnonymousObservable(function (o) {\n      var delays = new CompositeDisposable(), atEnd = false, subscription = new SerialDisposable();\n\n      function start() {\n        subscription.setDisposable(source.subscribe(\n          function (x) {\n            var delay = tryCatch(selector)(x);\n            if (delay === errorObj) { return o.onError(delay.e); }\n            var d = new SingleAssignmentDisposable();\n            delays.add(d);\n            d.setDisposable(delay.subscribe(\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              },\n              function (e) { o.onError(e); },\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              }\n            ));\n          },\n          function (e) { o.onError(e); },\n          function () {\n            atEnd = true;\n            subscription.dispose();\n            done();\n          }\n        ));\n      }\n\n      function done () {\n        atEnd && delays.length === 0 && o.onCompleted();\n      }\n\n      if (!subDelay) {\n        start();\n      } else {\n        subscription.setDisposable(subDelay.subscribe(start, function (e) { o.onError(e); }, start));\n      }\n\n      return new BinaryDisposable(subscription, delays);\n    }, source);\n  }\n\n  /**\n   *  Time shifts the observable sequence by dueTime.\n   *  The relative time intervals between the values are preserved.\n   *\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n   * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delay = function () {\n    var firstArg = arguments[0];\n    if (typeof firstArg === 'number' || firstArg instanceof Date) {\n      var dueTime = firstArg, scheduler = arguments[1];\n      isScheduler(scheduler) || (scheduler = defaultScheduler);\n      return dueTime instanceof Date ?\n        observableDelayAbsolute(this, dueTime, scheduler) :\n        observableDelayRelative(this, dueTime, scheduler);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return delayWithSelector(this, firstArg, arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  var DebounceObservable = (function (__super__) {\n    inherits(DebounceObservable, __super__);\n    function DebounceObservable(source, dt, s) {\n      isScheduler(s) || (s = defaultScheduler);\n      this.source = source;\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    DebounceObservable.prototype.subscribeCore = function (o) {\n      var cancelable = new SerialDisposable();\n      return new BinaryDisposable(\n        this.source.subscribe(new DebounceObserver(o, this._dt, this._s, cancelable)),\n        cancelable);\n    };\n\n    return DebounceObservable;\n  }(ObservableBase));\n\n  var DebounceObserver = (function (__super__) {\n    inherits(DebounceObserver, __super__);\n    function DebounceObserver(observer, dueTime, scheduler, cancelable) {\n      this._o = observer;\n      this._d = dueTime;\n      this._scheduler = scheduler;\n      this._c = cancelable;\n      this._v = null;\n      this._hv = false;\n      this._id = 0;\n      __super__.call(this);\n    }\n\n    function scheduleFuture(s, state) {\n      state.self._hv && state.self._id === state.currentId && state.self._o.onNext(state.x);\n      state.self._hv = false;\n    }\n\n    DebounceObserver.prototype.next = function (x) {\n      this._hv = true;\n      this._v = x;\n      var currentId = ++this._id, d = new SingleAssignmentDisposable();\n      this._c.setDisposable(d);\n      d.setDisposable(this._scheduler.scheduleFuture(this, this._d, function (_, self) {\n        self._hv && self._id === currentId && self._o.onNext(x);\n        self._hv = false;\n      }));\n    };\n\n    DebounceObserver.prototype.error = function (e) {\n      this._c.dispose();\n      this._o.onError(e);\n      this._hv = false;\n      this._id++;\n    };\n\n    DebounceObserver.prototype.completed = function () {\n      this._c.dispose();\n      this._hv && this._o.onNext(this._v);\n      this._o.onCompleted();\n      this._hv = false;\n      this._id++;\n    };\n\n    return DebounceObserver;\n  }(AbstractObserver));\n\n  function debounceWithSelector(source, durationSelector) {\n    return new AnonymousObservable(function (o) {\n      var value, hasValue = false, cancelable = new SerialDisposable(), id = 0;\n      var subscription = source.subscribe(\n        function (x) {\n          var throttle = tryCatch(durationSelector)(x);\n          if (throttle === errorObj) { return o.onError(throttle.e); }\n\n          isPromise(throttle) && (throttle = observableFromPromise(throttle));\n\n          hasValue = true;\n          value = x;\n          id++;\n          var currentid = id, d = new SingleAssignmentDisposable();\n          cancelable.setDisposable(d);\n          d.setDisposable(throttle.subscribe(\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            },\n            function (e) { o.onError(e); },\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            }\n          ));\n        },\n        function (e) {\n          cancelable.dispose();\n          o.onError(e);\n          hasValue = false;\n          id++;\n        },\n        function () {\n          cancelable.dispose();\n          hasValue && o.onNext(value);\n          o.onCompleted();\n          hasValue = false;\n          id++;\n        }\n      );\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  observableProto.debounce = function () {\n    if (isFunction (arguments[0])) {\n      return debounceWithSelector(this, arguments[0]);\n    } else if (typeof arguments[0] === 'number') {\n      return new DebounceObservable(this, arguments[0], arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  var TimestampObservable = (function (__super__) {\n    inherits(TimestampObservable, __super__);\n    function TimestampObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TimestampObserver(o, this._s));\n    };\n\n    return TimestampObservable;\n  }(ObservableBase));\n\n  var TimestampObserver = (function (__super__) {\n    inherits(TimestampObserver, __super__);\n    function TimestampObserver(o, s) {\n      this._o = o;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObserver.prototype.next = function (x) {\n      this._o.onNext({ value: x, timestamp: this._s.now() });\n    };\n\n    TimestampObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TimestampObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return TimestampObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Records the timestamp for each value in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n   *  2 - res = source.timestamp(Rx.Scheduler.default);\n   *\n   * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the default scheduler is used.\n   * @returns {Observable} An observable sequence with timestamp information on values.\n   */\n  observableProto.timestamp = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TimestampObservable(this, scheduler);\n  };\n\n  var SampleObservable = (function(__super__) {\n    inherits(SampleObservable, __super__);\n    function SampleObservable(source, sampler) {\n      this.source = source;\n      this._sampler = sampler;\n      __super__.call(this);\n    }\n\n    SampleObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        atEnd: false,\n        value: null,\n        hasValue: false,\n        sourceSubscription: new SingleAssignmentDisposable()\n      };\n\n      state.sourceSubscription.setDisposable(this.source.subscribe(new SampleSourceObserver(state)));\n      return new BinaryDisposable(\n        state.sourceSubscription,\n        this._sampler.subscribe(new SamplerObserver(state))\n      );\n    };\n\n    return SampleObservable;\n  }(ObservableBase));\n\n  var SamplerObserver = (function(__super__) {\n    inherits(SamplerObserver, __super__);\n    function SamplerObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SamplerObserver.prototype._handleMessage = function () {\n      if (this._s.hasValue) {\n        this._s.hasValue = false;\n        this._s.o.onNext(this._s.value);\n      }\n      this._s.atEnd && this._s.o.onCompleted();\n    };\n\n    SamplerObserver.prototype.next = function () { this._handleMessage(); };\n    SamplerObserver.prototype.error = function (e) { this._s.onError(e); };\n    SamplerObserver.prototype.completed = function () { this._handleMessage(); };\n\n    return SamplerObserver;\n  }(AbstractObserver));\n\n  var SampleSourceObserver = (function(__super__) {\n    inherits(SampleSourceObserver, __super__);\n    function SampleSourceObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SampleSourceObserver.prototype.next = function (x) {\n      this._s.hasValue = true;\n      this._s.value = x;\n    };\n    SampleSourceObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    SampleSourceObserver.prototype.completed = function () {\n      this._s.atEnd = true;\n      this._s.sourceSubscription.dispose();\n    };\n\n    return SampleSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Samples the observable sequence at each interval.\n   *\n   * @example\n   *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n   *  2 - res = source.sample(5000); // 5 seconds\n   *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n   *\n   * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n   * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Sampled observable sequence.\n   */\n  observableProto.sample = function (intervalOrSampler, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return typeof intervalOrSampler === 'number' ?\n      new SampleObservable(this, observableinterval(intervalOrSampler, scheduler)) :\n      new SampleObservable(this, intervalOrSampler);\n  };\n\n  var TimeoutError = Rx.TimeoutError = function(message) {\n    this.message = message || 'Timeout has occurred';\n    this.name = 'TimeoutError';\n    Error.call(this);\n  };\n  TimeoutError.prototype = Object.create(Error.prototype);\n\n  function timeoutWithSelector(source, firstTimeout, timeoutDurationSelector, other) {\n    if (isFunction(firstTimeout)) {\n      other = timeoutDurationSelector;\n      timeoutDurationSelector = firstTimeout;\n      firstTimeout = observableNever();\n    }\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var subscription = new SerialDisposable(),\n        timer = new SerialDisposable(),\n        original = new SingleAssignmentDisposable();\n\n      subscription.setDisposable(original);\n\n      var id = 0, switched = false;\n\n      function setTimer(timeout) {\n        var myId = id, d = new SingleAssignmentDisposable();\n\n        function timerWins() {\n          switched = (myId === id);\n          return switched;\n        }\n\n        timer.setDisposable(d);\n        d.setDisposable(timeout.subscribe(function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n          d.dispose();\n        }, function (e) {\n          timerWins() && o.onError(e);\n        }, function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n        }));\n      };\n\n      setTimer(firstTimeout);\n\n      function oWins() {\n        var res = !switched;\n        if (res) { id++; }\n        return res;\n      }\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (oWins()) {\n          o.onNext(x);\n          var timeout = tryCatch(timeoutDurationSelector)(x);\n          if (timeout === errorObj) { return o.onError(timeout.e); }\n          setTimer(isPromise(timeout) ? observableFromPromise(timeout) : timeout);\n        }\n      }, function (e) {\n        oWins() && o.onError(e);\n      }, function () {\n        oWins() && o.onCompleted();\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  function timeout(source, dueTime, other, scheduler) {\n    if (isScheduler(other)) {\n      scheduler = other;\n      other = observableThrow(new TimeoutError());\n    }\n    if (other instanceof Error) { other = observableThrow(other); }\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var id = 0,\n        original = new SingleAssignmentDisposable(),\n        subscription = new SerialDisposable(),\n        switched = false,\n        timer = new SerialDisposable();\n\n      subscription.setDisposable(original);\n\n      function createTimer() {\n        var myId = id;\n        timer.setDisposable(scheduler.scheduleFuture(null, dueTime, function () {\n          switched = id === myId;\n          if (switched) {\n            isPromise(other) && (other = observableFromPromise(other));\n            subscription.setDisposable(other.subscribe(o));\n          }\n        }));\n      }\n\n      createTimer();\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (!switched) {\n          id++;\n          o.onNext(x);\n          createTimer();\n        }\n      }, function (e) {\n        if (!switched) {\n          id++;\n          o.onError(e);\n        }\n      }, function () {\n        if (!switched) {\n          id++;\n          o.onCompleted();\n        }\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  observableProto.timeout = function () {\n    var firstArg = arguments[0];\n    if (firstArg instanceof Date || typeof firstArg === 'number') {\n      return timeout(this, firstArg, arguments[1], arguments[2]);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return timeoutWithSelector(this, firstArg, arguments[1], arguments[2]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  /**\n   * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n   * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n   * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n   * @returns {Observable} An Observable that performs the throttle operation.\n   */\n  observableProto.throttle = function (windowDuration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    var duration = +windowDuration || 0;\n    if (duration <= 0) { throw new RangeError('windowDuration cannot be less or equal zero.'); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var lastOnNext = 0;\n      return source.subscribe(\n        function (x) {\n          var now = scheduler.now();\n          if (lastOnNext === 0 || now - lastOnNext >= duration) {\n            lastOnNext = now;\n            o.onNext(x);\n          }\n        },function (e) { o.onError(e); }, function () { o.onCompleted(); }\n      );\n    }, source);\n  };\n\n  var PausableObservable = (function (__super__) {\n    inherits(PausableObservable, __super__);\n    function PausableObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableObservable.prototype._subscribe = function (o) {\n      var conn = this.source.publish(),\n        subscription = conn.subscribe(o),\n        connection = disposableEmpty;\n\n      var pausable = this.pauser.startWith(!this.paused).distinctUntilChanged().subscribe(function (b) {\n        if (b) {\n          connection = conn.connect();\n        } else {\n          connection.dispose();\n          connection = disposableEmpty;\n        }\n      });\n\n      return new NAryDisposable([subscription, connection, pausable]);\n    };\n\n    PausableObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausable(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausable = function (pauser) {\n    return new PausableObservable(this, pauser);\n  };\n\n  function combineLatestSource(source, subject, resultSelector) {\n    return new AnonymousObservable(function (o) {\n      var hasValue = [false, false],\n        hasValueAll = false,\n        isDone = false,\n        values = new Array(2),\n        err;\n\n      function next(x, i) {\n        values[i] = x;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          if (err) { return o.onError(err); }\n          var res = tryCatch(resultSelector).apply(null, values);\n          if (res === errorObj) { return o.onError(res.e); }\n          o.onNext(res);\n        }\n        isDone && values[1] && o.onCompleted();\n      }\n\n      return new BinaryDisposable(\n        source.subscribe(\n          function (x) {\n            next(x, 0);\n          },\n          function (e) {\n            if (values[1]) {\n              o.onError(e);\n            } else {\n              err = e;\n            }\n          },\n          function () {\n            isDone = true;\n            values[1] && o.onCompleted();\n          }),\n        subject.subscribe(\n          function (x) {\n            next(x, 1);\n          },\n          function (e) { o.onError(e); },\n          function () {\n            isDone = true;\n            next(true, 1);\n          })\n        );\n    }, source);\n  }\n\n  var PausableBufferedObservable = (function (__super__) {\n    inherits(PausableBufferedObservable, __super__);\n    function PausableBufferedObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableBufferedObservable.prototype._subscribe = function (o) {\n      var q = [], previousShouldFire;\n\n      function drainQueue() { while (q.length > 0) { o.onNext(q.shift()); } }\n\n      var subscription =\n        combineLatestSource(\n          this.source,\n          this.pauser.startWith(!this.paused).distinctUntilChanged(),\n          function (data, shouldFire) {\n            return { data: data, shouldFire: shouldFire };\n          })\n          .subscribe(\n            function (results) {\n              if (previousShouldFire !== undefined && results.shouldFire !== previousShouldFire) {\n                previousShouldFire = results.shouldFire;\n                // change in shouldFire\n                if (results.shouldFire) { drainQueue(); }\n              } else {\n                previousShouldFire = results.shouldFire;\n                // new data\n                if (results.shouldFire) {\n                  o.onNext(results.data);\n                } else {\n                  q.push(results.data);\n                }\n              }\n            },\n            function (err) {\n              drainQueue();\n              o.onError(err);\n            },\n            function () {\n              drainQueue();\n              o.onCompleted();\n            }\n          );\n      return subscription;      \n    };\n\n    PausableBufferedObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableBufferedObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableBufferedObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n   * and yields the values that were buffered while paused.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausableBuffered = function (pauser) {\n    return new PausableBufferedObservable(this, pauser);\n  };\n\n  var ControlledObservable = (function (__super__) {\n    inherits(ControlledObservable, __super__);\n    function ControlledObservable (source, enableQueue, scheduler) {\n      __super__.call(this);\n      this.subject = new ControlledSubject(enableQueue, scheduler);\n      this.source = source.multicast(this.subject).refCount();\n    }\n\n    ControlledObservable.prototype._subscribe = function (o) {\n      return this.source.subscribe(o);\n    };\n\n    ControlledObservable.prototype.request = function (numberOfItems) {\n      return this.subject.request(numberOfItems == null ? -1 : numberOfItems);\n    };\n\n    return ControlledObservable;\n\n  }(Observable));\n\n  var ControlledSubject = (function (__super__) {\n    inherits(ControlledSubject, __super__);\n    function ControlledSubject(enableQueue, scheduler) {\n      enableQueue == null && (enableQueue = true);\n\n      __super__.call(this);\n      this.subject = new Subject();\n      this.enableQueue = enableQueue;\n      this.queue = enableQueue ? [] : null;\n      this.requestedCount = 0;\n      this.requestedDisposable = null;\n      this.error = null;\n      this.hasFailed = false;\n      this.hasCompleted = false;\n      this.scheduler = scheduler || currentThreadScheduler;\n    }\n\n    addProperties(ControlledSubject.prototype, Observer, {\n      _subscribe: function (o) {\n        return this.subject.subscribe(o);\n      },\n      onCompleted: function () {\n        this.hasCompleted = true;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onCompleted();\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnCompleted());\n        }\n      },\n      onError: function (error) {\n        this.hasFailed = true;\n        this.error = error;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onError(error);\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnError(error));\n        }\n      },\n      onNext: function (value) {\n        if (this.requestedCount <= 0) {\n          this.enableQueue && this.queue.push(Notification.createOnNext(value));\n        } else {\n          (this.requestedCount-- === 0) && this.disposeCurrentRequest();\n          this.subject.onNext(value);\n        }\n      },\n      _processRequest: function (numberOfItems) {\n        if (this.enableQueue) {\n          while (this.queue.length > 0 && (numberOfItems > 0 || this.queue[0].kind !== 'N')) {\n            var first = this.queue.shift();\n            first.accept(this.subject);\n            if (first.kind === 'N') {\n              numberOfItems--;\n            } else {\n              this.disposeCurrentRequest();\n              this.queue = [];\n            }\n          }\n        }\n\n        return numberOfItems;\n      },\n      request: function (number) {\n        this.disposeCurrentRequest();\n        var self = this;\n\n        this.requestedDisposable = this.scheduler.schedule(number,\n        function(s, i) {\n          var remaining = self._processRequest(i);\n          var stopped = self.hasCompleted || self.hasFailed;\n          if (!stopped && remaining > 0) {\n            self.requestedCount = remaining;\n\n            return disposableCreate(function () {\n              self.requestedCount = 0;\n            });\n              // Scheduled item is still in progress. Return a new\n              // disposable to allow the request to be interrupted\n              // via dispose.\n          }\n        });\n\n        return this.requestedDisposable;\n      },\n      disposeCurrentRequest: function () {\n        if (this.requestedDisposable) {\n          this.requestedDisposable.dispose();\n          this.requestedDisposable = null;\n        }\n      }\n    });\n\n    return ControlledSubject;\n  }(Observable));\n\n  /**\n   * Attaches a controller to the observable sequence with the ability to queue.\n   * @example\n   * var source = Rx.Observable.interval(100).controlled();\n   * source.request(3); // Reads 3 values\n   * @param {bool} enableQueue truthy value to determine if values should be queued pending the next request\n   * @param {Scheduler} scheduler determines how the requests will be scheduled\n   * @returns {Observable} The observable sequence which only propagates values on request.\n   */\n  observableProto.controlled = function (enableQueue, scheduler) {\n\n    if (enableQueue && isScheduler(enableQueue)) {\n      scheduler = enableQueue;\n      enableQueue = true;\n    }\n\n    if (enableQueue == null) {  enableQueue = true; }\n    return new ControlledObservable(this, enableQueue, scheduler);\n  };\n\n  /**\n   * Pipes the existing Observable sequence into a Node.js Stream.\n   * @param {Stream} dest The destination Node.js stream.\n   * @returns {Stream} The destination stream.\n   */\n  observableProto.pipe = function (dest) {\n    var source = this.pausableBuffered();\n\n    function onDrain() {\n      source.resume();\n    }\n\n    dest.addListener('drain', onDrain);\n\n    source.subscribe(\n      function (x) {\n        !dest.write(x) && source.pause();\n      },\n      function (err) {\n        dest.emit('error', err);\n      },\n      function () {\n        // Hack check because STDIO is not closable\n        !dest._isStdio && dest.end();\n        dest.removeListener('drain', onDrain);\n      });\n\n    source.resume();\n\n    return dest;\n  };\n\n  var TransduceObserver = (function (__super__) {\n    inherits(TransduceObserver, __super__);\n    function TransduceObserver(o, xform) {\n      this._o = o;\n      this._xform = xform;\n      __super__.call(this);\n    }\n\n    TransduceObserver.prototype.next = function (x) {\n      var res = tryCatch(this._xform['@@transducer/step']).call(this._xform, this._o, x);\n      if (res === errorObj) { this._o.onError(res.e); }\n    };\n\n    TransduceObserver.prototype.error = function (e) { this._o.onError(e); };\n\n    TransduceObserver.prototype.completed = function () {\n      this._xform['@@transducer/result'](this._o);\n    };\n\n    return TransduceObserver;\n  }(AbstractObserver));\n\n  function transformForObserver(o) {\n    return {\n      '@@transducer/init': function() {\n        return o;\n      },\n      '@@transducer/step': function(obs, input) {\n        return obs.onNext(input);\n      },\n      '@@transducer/result': function(obs) {\n        return obs.onCompleted();\n      }\n    };\n  }\n\n  /**\n   * Executes a transducer to transform the observable sequence\n   * @param {Transducer} transducer A transducer to execute\n   * @returns {Observable} An Observable sequence containing the results from the transducer.\n   */\n  observableProto.transduce = function(transducer) {\n    var source = this;\n    return new AnonymousObservable(function(o) {\n      var xform = transducer(transformForObserver(o));\n      return source.subscribe(new TransduceObserver(o, xform));\n    }, source);\n  };\n\n  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {\n    inherits(AnonymousObservable, __super__);\n\n    // Fix subscriber to check for undefined or function returned to decorate as Disposable\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.__subscribe).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function AnonymousObservable(subscribe, parent) {\n      this.source = parent;\n      this.__subscribe = subscribe;\n      __super__.call(this);\n    }\n\n    AnonymousObservable.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    return AnonymousObservable;\n\n  }(Observable));\n\n  var AutoDetachObserver = (function (__super__) {\n    inherits(AutoDetachObserver, __super__);\n\n    function AutoDetachObserver(observer) {\n      __super__.call(this);\n      this.observer = observer;\n      this.m = new SingleAssignmentDisposable();\n    }\n\n    var AutoDetachObserverPrototype = AutoDetachObserver.prototype;\n\n    AutoDetachObserverPrototype.next = function (value) {\n      var result = tryCatch(this.observer.onNext).call(this.observer, value);\n      if (result === errorObj) {\n        this.dispose();\n        thrower(result.e);\n      }\n    };\n\n    AutoDetachObserverPrototype.error = function (err) {\n      var result = tryCatch(this.observer.onError).call(this.observer, err);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.completed = function () {\n      var result = tryCatch(this.observer.onCompleted).call(this.observer);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };\n    AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };\n\n    AutoDetachObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.m.dispose();\n    };\n\n    return AutoDetachObserver;\n  }(AbstractObserver));\n\n  var InnerSubscription = function (s, o) {\n    this._s = s;\n    this._o = o;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this._s.isDisposed && this._o !== null) {\n      var idx = this._s.observers.indexOf(this._o);\n      this._s.observers.splice(idx, 1);\n      this._o = null;\n    }\n  };\n\n  /**\n   *  Represents an object that is both an observable sequence as well as an observer.\n   *  Each notification is broadcasted to all subscribed observers.\n   */\n  var Subject = Rx.Subject = (function (__super__) {\n    inherits(Subject, __super__);\n    function Subject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(Subject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n          return disposableEmpty;\n        }\n        o.onCompleted();\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onCompleted();\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.error = error;\n          this.hasError = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onNext(value);\n          }\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    /**\n     * Creates a subject from the specified observer and observable.\n     * @param {Observer} observer The observer used to send messages to the subject.\n     * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n     * @returns {Subject} Subject implemented using the given observer and observable.\n     */\n    Subject.create = function (observer, observable) {\n      return new AnonymousSubject(observer, observable);\n    };\n\n    return Subject;\n  }(Observable));\n\n  /**\n   *  Represents the result of an asynchronous operation.\n   *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n   */\n  var AsyncSubject = Rx.AsyncSubject = (function (__super__) {\n    inherits(AsyncSubject, __super__);\n\n    /**\n     * Creates a subject that can only receive one value and that value is cached for all future observations.\n     * @constructor\n     */\n    function AsyncSubject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasValue = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(AsyncSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n\n        if (this.hasError) {\n          o.onError(this.error);\n        } else if (this.hasValue) {\n          o.onNext(this.value);\n          o.onCompleted();\n        } else {\n          o.onCompleted();\n        }\n\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n       */\n      onCompleted: function () {\n        var i, len;\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          var os = cloneArray(this.observers), len = os.length;\n\n          if (this.hasValue) {\n            for (i = 0; i < len; i++) {\n              var o = os[i];\n              o.onNext(this.value);\n              o.onCompleted();\n            }\n          } else {\n            for (i = 0; i < len; i++) {\n              os[i].onCompleted();\n            }\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the error.\n       * @param {Mixed} error The Error to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.hasError = true;\n          this.error = error;\n\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n       * @param {Mixed} value The value to store in the subject.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        this.hasValue = true;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.error = null;\n        this.value = null;\n      }\n    });\n\n    return AsyncSubject;\n  }(Observable));\n\n  var AnonymousSubject = Rx.AnonymousSubject = (function (__super__) {\n    inherits(AnonymousSubject, __super__);\n    function AnonymousSubject(observer, observable) {\n      this.observer = observer;\n      this.observable = observable;\n      __super__.call(this);\n    }\n\n    addProperties(AnonymousSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        return this.observable.subscribe(o);\n      },\n      onCompleted: function () {\n        this.observer.onCompleted();\n      },\n      onError: function (error) {\n        this.observer.onError(error);\n      },\n      onNext: function (value) {\n        this.observer.onNext(value);\n      }\n    });\n\n    return AnonymousSubject;\n  }(Observable));\n\n  /**\n   *  Represents a value that changes over time.\n   *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n   */\n  var BehaviorSubject = Rx.BehaviorSubject = (function (__super__) {\n    inherits(BehaviorSubject, __super__);\n    function BehaviorSubject(value) {\n      __super__.call(this);\n      this.value = value;\n      this.observers = [];\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasError = false;\n    }\n\n    addProperties(BehaviorSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          o.onNext(this.value);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n        } else {\n          o.onCompleted();\n        }\n        return disposableEmpty;\n      },\n      /**\n       * Gets the current value or throws an exception.\n       * Value is frozen after onCompleted is called.\n       * After onError is called always throws the specified exception.\n       * An exception is always thrown after dispose is called.\n       * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n       */\n      getValue: function () {\n        checkDisposed(this);\n        if (this.hasError) { thrower(this.error); }\n        return this.value;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onCompleted();\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.hasError = true;\n        this.error = error;\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onError(error);\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onNext(value);\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.value = null;\n        this.error = null;\n      }\n    });\n\n    return BehaviorSubject;\n  }(Observable));\n\n  /**\n   * Represents an object that is both an observable sequence as well as an observer.\n   * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n   */\n  var ReplaySubject = Rx.ReplaySubject = (function (__super__) {\n\n    var maxSafeInteger = Math.pow(2, 53) - 1;\n\n    function createRemovableDisposable(subject, observer) {\n      return disposableCreate(function () {\n        observer.dispose();\n        !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n      });\n    }\n\n    inherits(ReplaySubject, __super__);\n\n    /**\n     *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n     *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n     *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n     *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n     */\n    function ReplaySubject(bufferSize, windowSize, scheduler) {\n      this.bufferSize = bufferSize == null ? maxSafeInteger : bufferSize;\n      this.windowSize = windowSize == null ? maxSafeInteger : windowSize;\n      this.scheduler = scheduler || currentThreadScheduler;\n      this.q = [];\n      this.observers = [];\n      this.isStopped = false;\n      this.isDisposed = false;\n      this.hasError = false;\n      this.error = null;\n      __super__.call(this);\n    }\n\n    addProperties(ReplaySubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        var so = new ScheduledObserver(this.scheduler, o), subscription = createRemovableDisposable(this, so);\n\n        this._trim(this.scheduler.now());\n        this.observers.push(so);\n\n        for (var i = 0, len = this.q.length; i < len; i++) {\n          so.onNext(this.q[i].value);\n        }\n\n        if (this.hasError) {\n          so.onError(this.error);\n        } else if (this.isStopped) {\n          so.onCompleted();\n        }\n\n        so.ensureActive();\n        return subscription;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      _trim: function (now) {\n        while (this.q.length > this.bufferSize) {\n          this.q.shift();\n        }\n        while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {\n          this.q.shift();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        var now = this.scheduler.now();\n        this.q.push({ interval: now, value: value });\n        this._trim(now);\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onNext(value);\n          observer.ensureActive();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.error = error;\n        this.hasError = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onError(error);\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onCompleted();\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    return ReplaySubject;\n  }(Observable));\n\n  /**\n  * Used to pause and resume streams.\n  */\n  Rx.Pauser = (function (__super__) {\n    inherits(Pauser, __super__);\n    function Pauser() {\n      __super__.call(this);\n    }\n\n    /**\n     * Pauses the underlying sequence.\n     */\n    Pauser.prototype.pause = function () { this.onNext(false); };\n\n    /**\n    * Resumes the underlying sequence.\n    */\n    Pauser.prototype.resume = function () { this.onNext(true); };\n\n    return Pauser;\n  }(Subject));\n\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    root.Rx = Rx;\n\n    define(function() {\n      return Rx;\n    });\n  } else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = Rx).Rx = Rx;\n    } else {\n      freeExports.Rx = Rx;\n    }\n  } else {\n    // in a browser or Rhino\n    root.Rx = Rx;\n  }\n\n  // All code before this point will be filtered from stack traces.\n  var rEndingLine = captureLine();\n\n}.call(this));\n"
  },
  {
    "path": "dist/rx.sorting.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('./rx'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    observableNever = Observable.never,\n    isEqual = Rx.internals.isEqual,\n    defaultSubComparer = Rx.helpers.defaultSubComparer;\n\n  /**\n   * jortSort checks if your inputs are sorted.  Note that this is only for a sequence with an end.\n   * See http://jort.technology/ for full details.\n   * @returns {Observable} An observable which has a single value of true if sorted, else false.\n   */\n  observableProto.jortSort = function () {\n    return this.jortSortUntil(observableNever());\n  };\n\n  /**\n   * jortSort checks if your inputs are sorted until another Observable sequence fires.\n   * See http://jort.technology/ for full details.\n   * @returns {Observable} An observable which has a single value of true if sorted, else false.\n   */\n  observableProto.jortSortUntil = function (other) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var arr = [];\n      return source.takeUntil(other).subscribe(\n        arr.push.bind(arr),\n        observer.onError.bind(observer),\n        function () {\n          var sorted = arr.slice(0).sort(defaultSubComparer);\n          observer.onNext(isEqual(arr, sorted));\n          observer.onCompleted();\n        });\n    }, source);\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "dist/rx.testing.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.virtualtime', 'exports'], function (Rx, exports) {\n      root.Rx = factory(root, exports, Rx);\n      return root.Rx;\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('./rx'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Defaults\n  var Observer = Rx.Observer,\n    Observable = Rx.Observable,\n    Notification = Rx.Notification,\n    VirtualTimeScheduler = Rx.VirtualTimeScheduler,\n    Disposable = Rx.Disposable,\n    disposableEmpty = Disposable.empty,\n    disposableCreate = Disposable.create,\n    CompositeDisposable = Rx.CompositeDisposable,\n    inherits = Rx.internals.inherits,\n    defaultComparer = Rx.internals.isEqual;\n\nfunction OnNextPredicate(predicate) {\n    this.predicate = predicate;\n}\n\nOnNextPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'N') { return false; }\n  return this.predicate(other.value);\n};\n\nfunction OnErrorPredicate(predicate) {\n  this.predicate = predicate;\n}\n\nOnErrorPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'E') { return false; }\n  return this.predicate(other.error);\n};\n\nvar ReactiveTest = Rx.ReactiveTest = {\n  /** Default virtual time used for creation of observable sequences in unit tests. */\n  created: 100,\n  /** Default virtual time used to subscribe to observable sequences in unit tests. */\n  subscribed: 200,\n  /** Default virtual time used to dispose subscriptions in unit tests. */\n  disposed: 1000,\n\n  /**\n   * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n   *\n   * 1 - ReactiveTest.onNext(200, 42);\n   * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n   *\n   * @param ticks Recorded virtual time the OnNext notification occurs.\n   * @param value Recorded value stored in the OnNext notification or a predicate.\n   * @return Recorded OnNext notification.\n   */\n  onNext: function (ticks, value) {\n    return typeof value === 'function' ?\n      new Recorded(ticks, new OnNextPredicate(value)) :\n      new Recorded(ticks, Notification.createOnNext(value));\n  },\n  /**\n   * Factory method for an OnError notification record at a given time with a given error.\n   *\n   * 1 - ReactiveTest.onNext(200, new Error('error'));\n   * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n   *\n   * @param ticks Recorded virtual time the OnError notification occurs.\n   * @param exception Recorded exception stored in the OnError notification.\n   * @return Recorded OnError notification.\n   */\n  onError: function (ticks, error) {\n    return typeof error === 'function' ?\n      new Recorded(ticks, new OnErrorPredicate(error)) :\n      new Recorded(ticks, Notification.createOnError(error));\n  },\n  /**\n   * Factory method for an OnCompleted notification record at a given time.\n   *\n   * @param ticks Recorded virtual time the OnCompleted notification occurs.\n   * @return Recorded OnCompleted notification.\n   */\n  onCompleted: function (ticks) {\n    return new Recorded(ticks, Notification.createOnCompleted());\n  },\n  /**\n   * Factory method for a subscription record based on a given subscription and disposal time.\n   *\n   * @param start Virtual time indicating when the subscription was created.\n   * @param end Virtual time indicating when the subscription was disposed.\n   * @return Subscription object.\n   */\n  subscribe: function (start, end) {\n    return new Subscription(start, end);\n  }\n};\n\n  /**\n   * Creates a new object recording the production of the specified value at the given virtual time.\n   *\n   * @constructor\n   * @param {Number} time Virtual time the value was produced on.\n   * @param {Mixed} value Value that was produced.\n   * @param {Function} comparer An optional comparer.\n   */\n  var Recorded = Rx.Recorded = function (time, value, comparer) {\n    this.time = time;\n    this.value = value;\n    this.comparer = comparer || defaultComparer;\n  };\n\n  /**\n   * Checks whether the given recorded object is equal to the current instance.\n   *\n   * @param {Recorded} other Recorded object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Recorded.prototype.equals = function (other) {\n    return this.time === other.time && this.comparer(this.value, other.value);\n  };\n\n  /**\n   * Returns a string representation of the current Recorded value.\n   *\n   * @returns {String} String representation of the current Recorded value.\n   */\n  Recorded.prototype.toString = function () {\n    return this.value.toString() + '@' + this.time;\n  };\n\n  /**\n   * Creates a new subscription object with the given virtual subscription and unsubscription time.\n   *\n   * @constructor\n   * @param {Number} subscribe Virtual time at which the subscription occurred.\n   * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n   */\n  var Subscription = Rx.Subscription = function (start, end) {\n    this.subscribe = start;\n    this.unsubscribe = end || Number.MAX_VALUE;\n  };\n\n  /**\n   * Checks whether the given subscription is equal to the current instance.\n   * @param other Subscription object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Subscription.prototype.equals = function (other) {\n    return this.subscribe === other.subscribe && this.unsubscribe === other.unsubscribe;\n  };\n\n  /**\n   * Returns a string representation of the current Subscription value.\n   * @returns {String} String representation of the current Subscription value.\n   */\n  Subscription.prototype.toString = function () {\n    return '(' + this.subscribe + ', ' + (this.unsubscribe === Number.MAX_VALUE ? 'Infinite' : this.unsubscribe) + ')';\n  };\n\n  var MockDisposable = Rx.MockDisposable = function (scheduler) {\n    this.scheduler = scheduler;\n    this.disposes = [];\n    this.disposes.push(this.scheduler.clock);\n  };\n\n  MockDisposable.prototype.dispose = function () {\n    this.disposes.push(this.scheduler.clock);\n  };\n\n  var MockObserver = (function (__super__) {\n    inherits(MockObserver, __super__);\n\n    function MockObserver(scheduler) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = [];\n    }\n\n    var MockObserverPrototype = MockObserver.prototype;\n\n    MockObserverPrototype.onNext = function (value) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnNext(value)));\n    };\n\n    MockObserverPrototype.onError = function (e) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnError(e)));\n    };\n\n    MockObserverPrototype.onCompleted = function () {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnCompleted()));\n    };\n\n    return MockObserver;\n  })(Observer);\n\n  function MockPromise(scheduler, messages) {\n    var self = this;\n    this.scheduler = scheduler;\n    this.messages = messages;\n    this.subscriptions = [];\n    this.observers = [];\n    for (var i = 0, len = this.messages.length; i < len; i++) {\n      var message = this.messages[i],\n          notification = message.value;\n      (function (innerNotification) {\n        scheduler.scheduleAbsolute(null, message.time, function () {\n          var obs = self.observers.slice(0);\n\n          for (var j = 0, jLen = obs.length; j < jLen; j++) {\n            innerNotification.accept(obs[j]);\n          }\n          return disposableEmpty;\n        });\n      })(notification);\n    }\n  }\n\n  MockPromise.prototype.then = function (onResolved, onRejected) {\n    var self = this;\n\n    this.subscriptions.push(new Subscription(this.scheduler.clock));\n    var index = this.subscriptions.length - 1;\n\n    var newPromise;\n\n    var observer = Rx.Observer.create(\n      function (x) {\n        var retValue = onResolved(x);\n        if (retValue && typeof retValue.then === 'function') {\n          newPromise = retValue;\n        } else {\n          var ticks = self.scheduler.clock;\n          newPromise = new MockPromise(self.scheduler, [Rx.ReactiveTest.onNext(ticks, undefined), Rx.ReactiveTest.onCompleted(ticks)]);\n        }\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      },\n      function (err) {\n        onRejected(err);\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      }\n    );\n    this.observers.push(observer);\n\n    return newPromise || new MockPromise(this.scheduler, this.messages);\n  };\n\n  var HotObservable = (function (__super__) {\n    inherits(HotObservable, __super__);\n\n    function HotObservable(scheduler, messages) {\n      __super__.call(this);\n      var message, notification, observable = this;\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n      this.observers = [];\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          scheduler.scheduleAbsolute(null, message.time, function () {\n            var obs = observable.observers.slice(0);\n\n            for (var j = 0, jLen = obs.length; j < jLen; j++) {\n              innerNotification.accept(obs[j]);\n            }\n            return disposableEmpty;\n          });\n        })(notification);\n      }\n    }\n\n    HotObservable.prototype._subscribe = function (o) {\n      var observable = this;\n      this.observers.push(o);\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      return disposableCreate(function () {\n        var idx = observable.observers.indexOf(o);\n        observable.observers.splice(idx, 1);\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n      });\n    };\n\n    return HotObservable;\n  })(Observable);\n\n  var ColdObservable = (function (__super__) {\n    inherits(ColdObservable, __super__);\n\n    function ColdObservable(scheduler, messages) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n    }\n\n    ColdObservable.prototype._subscribe = function (o) {\n      var message, notification, observable = this;\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      var d = new CompositeDisposable();\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          d.add(observable.scheduler.scheduleRelative(null, message.time, function () {\n            innerNotification.accept(o);\n            return disposableEmpty;\n          }));\n        })(notification);\n      }\n      return disposableCreate(function () {\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n        d.dispose();\n      });\n    };\n\n    return ColdObservable;\n  })(Observable);\n\n  /** Virtual time scheduler used for testing applications and libraries built using Reactive Extensions. */\n  Rx.TestScheduler = (function (__super__) {\n    inherits(TestScheduler, __super__);\n\n    function baseComparer(x, y) {\n      return x > y ? 1 : (x < y ? -1 : 0);\n    }\n\n    function TestScheduler() {\n      __super__.call(this, 0, baseComparer);\n    }\n\n    /**\n     * Schedules an action to be executed at the specified virtual time.\n     *\n     * @param state State passed to the action to be executed.\n     * @param dueTime Absolute virtual time at which to execute the action.\n     * @param action Action to be executed.\n     * @return Disposable object used to cancel the scheduled action (best effort).\n     */\n    TestScheduler.prototype.scheduleAbsolute = function (state, dueTime, action) {\n      dueTime <= this.clock && (dueTime = this.clock + 1);\n      return __super__.prototype.scheduleAbsolute.call(this, state, dueTime, action);\n    };\n    /**\n     * Adds a relative virtual time to an absolute virtual time value.\n     *\n     * @param absolute Absolute virtual time value.\n     * @param relative Relative virtual time value to add.\n     * @return Resulting absolute virtual time sum value.\n     */\n    TestScheduler.prototype.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n    /**\n     * Converts the absolute virtual time value to a DateTimeOffset value.\n     *\n     * @param absolute Absolute virtual time value to convert.\n     * @return Corresponding DateTimeOffset value.\n     */\n    TestScheduler.prototype.toAbsoluteTime = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     *\n     * @param timeSpan TimeSpan value to convert.\n     * @return Corresponding relative virtual time value.\n     */\n    TestScheduler.prototype.toRelativeTime = function (timeSpan) {\n      return timeSpan;\n    };\n    /**\n     * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n     *\n     * @param create Factory method to create an observable sequence.\n     * @param created Virtual time at which to invoke the factory to create an observable sequence.\n     * @param subscribed Virtual time at which to subscribe to the created observable sequence.\n     * @param disposed Virtual time at which to dispose the subscription.\n     * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n     */\n    TestScheduler.prototype.startScheduler = function (createFn, settings) {\n      settings || (settings = {});\n      settings.created == null && (settings.created = ReactiveTest.created);\n      settings.subscribed == null && (settings.subscribed = ReactiveTest.subscribed);\n      settings.disposed == null && (settings.disposed = ReactiveTest.disposed);\n\n      var observer = this.createObserver(), source, subscription;\n\n      this.scheduleAbsolute(null, settings.created, function () {\n        source = createFn();\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.subscribed, function () {\n        subscription = source.subscribe(observer);\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.disposed, function () {\n        subscription.dispose();\n        return disposableEmpty;\n      });\n\n      this.start();\n\n      return observer;\n    };\n\n    /**\n     * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n     * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createHotObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new HotObservable(this, args);\n    };\n\n    /**\n     * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n     * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createColdObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new ColdObservable(this, args);\n    };\n\n    /**\n     * Creates a resolved promise with the given value and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} value The value to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which fulfills with the given value.\n     */\n    TestScheduler.prototype.createResolvedPromise = function (ticks, value) {\n      return new MockPromise(this, [Rx.ReactiveTest.onNext(ticks, value), Rx.ReactiveTest.onCompleted(ticks)]);\n    };\n\n    /**\n     * Creates a rejected promise with the given reason and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} reason The reason for rejection to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which rejects with the given reason.\n     */\n    TestScheduler.prototype.createRejectedPromise = function (ticks, reason) {\n      return new MockPromise(this, [Rx.ReactiveTest.onError(ticks, reason)]);\n    };\n\n    /**\n     * Creates an observer that records received notification messages and timestamps those.\n     * @return Observer that can be used to assert the timing of received notifications.\n     */\n    TestScheduler.prototype.createObserver = function () {\n      return new MockObserver(this);\n    };\n\n    return TestScheduler;\n  })(VirtualTimeScheduler);\n\n  return Rx;\n}));\n"
  },
  {
    "path": "dist/rx.time.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('./rx'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Refernces\n  var inherits = Rx.internals.inherits,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    ObservableBase = Rx.ObservableBase,\n    observableDefer = Observable.defer,\n    observableEmpty = Observable.empty,\n    observableNever = Observable.never,\n    observableThrow = Observable['throw'],\n    observableFromArray = Observable.fromArray,\n    defaultScheduler = Rx.Scheduler['default'],\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    Subject = Rx.Subject,\n    addRef = Rx.internals.addRef,\n    normalizeTime = Rx.Scheduler.normalize,\n    helpers = Rx.helpers,\n    isPromise = helpers.isPromise,\n    isFunction = helpers.isFunction,\n    isScheduler = Rx.Scheduler.isScheduler,\n    observableFromPromise = Observable.fromPromise;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  var TimerObservable = (function(__super__) {\n    inherits(TimerObservable, __super__);\n    function TimerObservable(dt, s) {\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimerObservable.prototype.subscribeCore = function (o) {\n      return this._s.scheduleFuture(o, this._dt, scheduleMethod);\n    };\n\n    function scheduleMethod(s, o) {\n      o.onNext(0);\n      o.onCompleted();\n    }\n\n    return TimerObservable;\n  }(ObservableBase));\n\n  function _observableTimer(dueTime, scheduler) {\n    return new TimerObservable(dueTime, scheduler);\n  }\n\n  function observableTimerDateAndPeriod(dueTime, period, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var d = dueTime, p = normalizeTime(period);\n      return scheduler.scheduleRecursiveFuture(0, d, function (count, self) {\n        if (p > 0) {\n          var now = scheduler.now();\n          d = new Date(d.getTime() + p);\n          d.getTime() <= now && (d = new Date(now + p));\n        }\n        observer.onNext(count);\n        self(count + 1, new Date(d));\n      });\n    });\n  }\n\n  function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) {\n    return dueTime === period ?\n      new AnonymousObservable(function (observer) {\n        return scheduler.schedulePeriodic(0, period, function (count) {\n          observer.onNext(count);\n          return count + 1;\n        });\n      }) :\n      observableDefer(function () {\n        return observableTimerDateAndPeriod(new Date(scheduler.now() + dueTime), period, scheduler);\n      });\n  }\n\n  /**\n   *  Returns an observable sequence that produces a value after each period.\n   *\n   * @example\n   *  1 - res = Rx.Observable.interval(1000);\n   *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n   *\n   * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n   * @returns {Observable} An observable sequence that produces a value after each period.\n   */\n  var observableinterval = Observable.interval = function (period, scheduler) {\n    return observableTimerTimeSpanAndPeriod(period, period, isScheduler(scheduler) ? scheduler : defaultScheduler);\n  };\n\n  /**\n   *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n   * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n   */\n  var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) {\n    var period;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    if (periodOrScheduler != null && typeof periodOrScheduler === 'number') {\n      period = periodOrScheduler;\n    } else if (isScheduler(periodOrScheduler)) {\n      scheduler = periodOrScheduler;\n    }\n    if ((dueTime instanceof Date || typeof dueTime === 'number') && period === undefined) {\n      return _observableTimer(dueTime, scheduler);\n    }\n    if (dueTime instanceof Date && period !== undefined) {\n      return observableTimerDateAndPeriod(dueTime, periodOrScheduler, scheduler);\n    }\n    return observableTimerTimeSpanAndPeriod(dueTime, period, scheduler);\n  };\n\n  function observableDelayRelative(source, dueTime, scheduler) {\n    return new AnonymousObservable(function (o) {\n      var active = false,\n        cancelable = new SerialDisposable(),\n        exception = null,\n        q = [],\n        running = false,\n        subscription;\n      subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) {\n        var d, shouldRun;\n        if (notification.value.kind === 'E') {\n          q = [];\n          q.push(notification);\n          exception = notification.value.error;\n          shouldRun = !running;\n        } else {\n          q.push({ value: notification.value, timestamp: notification.timestamp + dueTime });\n          shouldRun = !active;\n          active = true;\n        }\n        if (shouldRun) {\n          if (exception !== null) {\n            o.onError(exception);\n          } else {\n            d = new SingleAssignmentDisposable();\n            cancelable.setDisposable(d);\n            d.setDisposable(scheduler.scheduleRecursiveFuture(null, dueTime, function (_, self) {\n              var e, recurseDueTime, result, shouldRecurse;\n              if (exception !== null) {\n                return;\n              }\n              running = true;\n              do {\n                result = null;\n                if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) {\n                  result = q.shift().value;\n                }\n                if (result !== null) {\n                  result.accept(o);\n                }\n              } while (result !== null);\n              shouldRecurse = false;\n              recurseDueTime = 0;\n              if (q.length > 0) {\n                shouldRecurse = true;\n                recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now());\n              } else {\n                active = false;\n              }\n              e = exception;\n              running = false;\n              if (e !== null) {\n                o.onError(e);\n              } else if (shouldRecurse) {\n                self(null, recurseDueTime);\n              }\n            }));\n          }\n        }\n      });\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  function observableDelayAbsolute(source, dueTime, scheduler) {\n    return observableDefer(function () {\n      return observableDelayRelative(source, dueTime - scheduler.now(), scheduler);\n    });\n  }\n\n  function delayWithSelector(source, subscriptionDelay, delayDurationSelector) {\n    var subDelay, selector;\n    if (isFunction(subscriptionDelay)) {\n      selector = subscriptionDelay;\n    } else {\n      subDelay = subscriptionDelay;\n      selector = delayDurationSelector;\n    }\n    return new AnonymousObservable(function (o) {\n      var delays = new CompositeDisposable(), atEnd = false, subscription = new SerialDisposable();\n\n      function start() {\n        subscription.setDisposable(source.subscribe(\n          function (x) {\n            var delay = tryCatch(selector)(x);\n            if (delay === errorObj) { return o.onError(delay.e); }\n            var d = new SingleAssignmentDisposable();\n            delays.add(d);\n            d.setDisposable(delay.subscribe(\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              },\n              function (e) { o.onError(e); },\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              }\n            ));\n          },\n          function (e) { o.onError(e); },\n          function () {\n            atEnd = true;\n            subscription.dispose();\n            done();\n          }\n        ));\n      }\n\n      function done () {\n        atEnd && delays.length === 0 && o.onCompleted();\n      }\n\n      if (!subDelay) {\n        start();\n      } else {\n        subscription.setDisposable(subDelay.subscribe(start, function (e) { o.onError(e); }, start));\n      }\n\n      return new BinaryDisposable(subscription, delays);\n    }, source);\n  }\n\n  /**\n   *  Time shifts the observable sequence by dueTime.\n   *  The relative time intervals between the values are preserved.\n   *\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n   * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delay = function () {\n    var firstArg = arguments[0];\n    if (typeof firstArg === 'number' || firstArg instanceof Date) {\n      var dueTime = firstArg, scheduler = arguments[1];\n      isScheduler(scheduler) || (scheduler = defaultScheduler);\n      return dueTime instanceof Date ?\n        observableDelayAbsolute(this, dueTime, scheduler) :\n        observableDelayRelative(this, dueTime, scheduler);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return delayWithSelector(this, firstArg, arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  var DebounceObservable = (function (__super__) {\n    inherits(DebounceObservable, __super__);\n    function DebounceObservable(source, dt, s) {\n      isScheduler(s) || (s = defaultScheduler);\n      this.source = source;\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    DebounceObservable.prototype.subscribeCore = function (o) {\n      var cancelable = new SerialDisposable();\n      return new BinaryDisposable(\n        this.source.subscribe(new DebounceObserver(o, this._dt, this._s, cancelable)),\n        cancelable);\n    };\n\n    return DebounceObservable;\n  }(ObservableBase));\n\n  var DebounceObserver = (function (__super__) {\n    inherits(DebounceObserver, __super__);\n    function DebounceObserver(observer, dueTime, scheduler, cancelable) {\n      this._o = observer;\n      this._d = dueTime;\n      this._scheduler = scheduler;\n      this._c = cancelable;\n      this._v = null;\n      this._hv = false;\n      this._id = 0;\n      __super__.call(this);\n    }\n\n    function scheduleFuture(s, state) {\n      state.self._hv && state.self._id === state.currentId && state.self._o.onNext(state.x);\n      state.self._hv = false;\n    }\n\n    DebounceObserver.prototype.next = function (x) {\n      this._hv = true;\n      this._v = x;\n      var currentId = ++this._id, d = new SingleAssignmentDisposable();\n      this._c.setDisposable(d);\n      d.setDisposable(this._scheduler.scheduleFuture(this, this._d, function (_, self) {\n        self._hv && self._id === currentId && self._o.onNext(x);\n        self._hv = false;\n      }));\n    };\n\n    DebounceObserver.prototype.error = function (e) {\n      this._c.dispose();\n      this._o.onError(e);\n      this._hv = false;\n      this._id++;\n    };\n\n    DebounceObserver.prototype.completed = function () {\n      this._c.dispose();\n      this._hv && this._o.onNext(this._v);\n      this._o.onCompleted();\n      this._hv = false;\n      this._id++;\n    };\n\n    return DebounceObserver;\n  }(AbstractObserver));\n\n  function debounceWithSelector(source, durationSelector) {\n    return new AnonymousObservable(function (o) {\n      var value, hasValue = false, cancelable = new SerialDisposable(), id = 0;\n      var subscription = source.subscribe(\n        function (x) {\n          var throttle = tryCatch(durationSelector)(x);\n          if (throttle === errorObj) { return o.onError(throttle.e); }\n\n          isPromise(throttle) && (throttle = observableFromPromise(throttle));\n\n          hasValue = true;\n          value = x;\n          id++;\n          var currentid = id, d = new SingleAssignmentDisposable();\n          cancelable.setDisposable(d);\n          d.setDisposable(throttle.subscribe(\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            },\n            function (e) { o.onError(e); },\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            }\n          ));\n        },\n        function (e) {\n          cancelable.dispose();\n          o.onError(e);\n          hasValue = false;\n          id++;\n        },\n        function () {\n          cancelable.dispose();\n          hasValue && o.onNext(value);\n          o.onCompleted();\n          hasValue = false;\n          id++;\n        }\n      );\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  observableProto.debounce = function () {\n    if (isFunction (arguments[0])) {\n      return debounceWithSelector(this, arguments[0]);\n    } else if (typeof arguments[0] === 'number') {\n      return new DebounceObservable(this, arguments[0], arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n   * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n   * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTime = observableProto.windowTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n    var source = this, timeShift;\n    timeShiftOrScheduler == null && (timeShift = timeSpan);\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    if (typeof timeShiftOrScheduler === 'number') {\n      timeShift = timeShiftOrScheduler;\n    } else if (isScheduler(timeShiftOrScheduler)) {\n      timeShift = timeSpan;\n      scheduler = timeShiftOrScheduler;\n    }\n    return new AnonymousObservable(function (observer) {\n      var groupDisposable,\n        nextShift = timeShift,\n        nextSpan = timeSpan,\n        q = [],\n        refCountDisposable,\n        timerD = new SerialDisposable(),\n        totalTime = 0;\n        groupDisposable = new CompositeDisposable(timerD),\n        refCountDisposable = new RefCountDisposable(groupDisposable);\n\n       function createTimer () {\n        var m = new SingleAssignmentDisposable(),\n          isSpan = false,\n          isShift = false;\n        timerD.setDisposable(m);\n        if (nextSpan === nextShift) {\n          isSpan = true;\n          isShift = true;\n        } else if (nextSpan < nextShift) {\n            isSpan = true;\n        } else {\n          isShift = true;\n        }\n        var newTotalTime = isSpan ? nextSpan : nextShift,\n          ts = newTotalTime - totalTime;\n        totalTime = newTotalTime;\n        if (isSpan) {\n          nextSpan += timeShift;\n        }\n        if (isShift) {\n          nextShift += timeShift;\n        }\n        m.setDisposable(scheduler.scheduleFuture(null, ts, function () {\n          if (isShift) {\n            var s = new Subject();\n            q.push(s);\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          isSpan && q.shift().onCompleted();\n          createTimer();\n        }));\n      };\n      q.push(new Subject());\n      observer.onNext(addRef(q[0], refCountDisposable));\n      createTimer();\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n        },\n        function (e) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed.\n   * @param {Number} timeSpan Maximum time length of a window.\n   * @param {Number} count Maximum element count of a window.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTimeOrCount = observableProto.windowTimeOrCount = function (timeSpan, count, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new AnonymousObservable(function (observer) {\n      var timerD = new SerialDisposable(),\n          groupDisposable = new CompositeDisposable(timerD),\n          refCountDisposable = new RefCountDisposable(groupDisposable),\n          n = 0,\n          windowId = 0,\n          s = new Subject();\n\n      function createTimer(id) {\n        var m = new SingleAssignmentDisposable();\n        timerD.setDisposable(m);\n        m.setDisposable(scheduler.scheduleFuture(null, timeSpan, function () {\n          if (id !== windowId) { return; }\n          n = 0;\n          var newId = ++windowId;\n          s.onCompleted();\n          s = new Subject();\n          observer.onNext(addRef(s, refCountDisposable));\n          createTimer(newId);\n        }));\n      }\n\n      observer.onNext(addRef(s, refCountDisposable));\n      createTimer(0);\n\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          var newId = 0, newWindow = false;\n          s.onNext(x);\n          if (++n === count) {\n            newWindow = true;\n            n = 0;\n            newId = ++windowId;\n            s.onCompleted();\n            s = new Subject();\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          newWindow && createTimer(newId);\n        },\n        function (e) {\n          s.onError(e);\n          observer.onError(e);\n        }, function () {\n          s.onCompleted();\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n   * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n   * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n   * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithTime = observableProto.bufferTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n    return this.windowWithTime(timeSpan, timeShiftOrScheduler, scheduler).flatMap(toArray);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed.\n   * @param {Number} timeSpan Maximum time length of a buffer.\n   * @param {Number} count Maximum element count of a buffer.\n   * @param {Scheduler} [scheduler]  Scheduler to run bufferin timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithTimeOrCount = observableProto.bufferTimeOrCount = function (timeSpan, count, scheduler) {\n    return this.windowWithTimeOrCount(timeSpan, count, scheduler).flatMap(toArray);\n  };\n\n  var TimeIntervalObservable = (function (__super__) {\n    inherits(TimeIntervalObservable, __super__);\n    function TimeIntervalObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimeIntervalObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TimeIntervalObserver(o, this._s));\n    };\n\n    return TimeIntervalObservable;\n  }(ObservableBase));\n\n  var TimeIntervalObserver = (function (__super__) {\n    inherits(TimeIntervalObserver, __super__);\n\n    function TimeIntervalObserver(o, s) {\n      this._o = o;\n      this._s = s;\n      this._l = s.now();\n      __super__.call(this);\n    }\n\n    TimeIntervalObserver.prototype.next = function (x) {\n      var now = this._s.now(), span = now - this._l;\n      this._l = now;\n      this._o.onNext({ value: x, interval: span });\n    };\n    TimeIntervalObserver.prototype.error = function (e) { this._o.onError(e); };\n    TimeIntervalObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TimeIntervalObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Records the time interval between consecutive values in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timeInterval();\n   *  2 - res = source.timeInterval(Rx.Scheduler.timeout);\n   *\n   * @param [scheduler]  Scheduler used to compute time intervals. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence with time interval information on values.\n   */\n  observableProto.timeInterval = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TimeIntervalObservable(this, scheduler);\n  };\n\n  var TimestampObservable = (function (__super__) {\n    inherits(TimestampObservable, __super__);\n    function TimestampObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TimestampObserver(o, this._s));\n    };\n\n    return TimestampObservable;\n  }(ObservableBase));\n\n  var TimestampObserver = (function (__super__) {\n    inherits(TimestampObserver, __super__);\n    function TimestampObserver(o, s) {\n      this._o = o;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObserver.prototype.next = function (x) {\n      this._o.onNext({ value: x, timestamp: this._s.now() });\n    };\n\n    TimestampObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TimestampObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return TimestampObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Records the timestamp for each value in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n   *  2 - res = source.timestamp(Rx.Scheduler.default);\n   *\n   * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the default scheduler is used.\n   * @returns {Observable} An observable sequence with timestamp information on values.\n   */\n  observableProto.timestamp = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TimestampObservable(this, scheduler);\n  };\n\n  var SampleObservable = (function(__super__) {\n    inherits(SampleObservable, __super__);\n    function SampleObservable(source, sampler) {\n      this.source = source;\n      this._sampler = sampler;\n      __super__.call(this);\n    }\n\n    SampleObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        atEnd: false,\n        value: null,\n        hasValue: false,\n        sourceSubscription: new SingleAssignmentDisposable()\n      };\n\n      state.sourceSubscription.setDisposable(this.source.subscribe(new SampleSourceObserver(state)));\n      return new BinaryDisposable(\n        state.sourceSubscription,\n        this._sampler.subscribe(new SamplerObserver(state))\n      );\n    };\n\n    return SampleObservable;\n  }(ObservableBase));\n\n  var SamplerObserver = (function(__super__) {\n    inherits(SamplerObserver, __super__);\n    function SamplerObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SamplerObserver.prototype._handleMessage = function () {\n      if (this._s.hasValue) {\n        this._s.hasValue = false;\n        this._s.o.onNext(this._s.value);\n      }\n      this._s.atEnd && this._s.o.onCompleted();\n    };\n\n    SamplerObserver.prototype.next = function () { this._handleMessage(); };\n    SamplerObserver.prototype.error = function (e) { this._s.onError(e); };\n    SamplerObserver.prototype.completed = function () { this._handleMessage(); };\n\n    return SamplerObserver;\n  }(AbstractObserver));\n\n  var SampleSourceObserver = (function(__super__) {\n    inherits(SampleSourceObserver, __super__);\n    function SampleSourceObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SampleSourceObserver.prototype.next = function (x) {\n      this._s.hasValue = true;\n      this._s.value = x;\n    };\n    SampleSourceObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    SampleSourceObserver.prototype.completed = function () {\n      this._s.atEnd = true;\n      this._s.sourceSubscription.dispose();\n    };\n\n    return SampleSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Samples the observable sequence at each interval.\n   *\n   * @example\n   *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n   *  2 - res = source.sample(5000); // 5 seconds\n   *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n   *\n   * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n   * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Sampled observable sequence.\n   */\n  observableProto.sample = function (intervalOrSampler, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return typeof intervalOrSampler === 'number' ?\n      new SampleObservable(this, observableinterval(intervalOrSampler, scheduler)) :\n      new SampleObservable(this, intervalOrSampler);\n  };\n\n  var TimeoutError = Rx.TimeoutError = function(message) {\n    this.message = message || 'Timeout has occurred';\n    this.name = 'TimeoutError';\n    Error.call(this);\n  };\n  TimeoutError.prototype = Object.create(Error.prototype);\n\n  function timeoutWithSelector(source, firstTimeout, timeoutDurationSelector, other) {\n    if (isFunction(firstTimeout)) {\n      other = timeoutDurationSelector;\n      timeoutDurationSelector = firstTimeout;\n      firstTimeout = observableNever();\n    }\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var subscription = new SerialDisposable(),\n        timer = new SerialDisposable(),\n        original = new SingleAssignmentDisposable();\n\n      subscription.setDisposable(original);\n\n      var id = 0, switched = false;\n\n      function setTimer(timeout) {\n        var myId = id, d = new SingleAssignmentDisposable();\n\n        function timerWins() {\n          switched = (myId === id);\n          return switched;\n        }\n\n        timer.setDisposable(d);\n        d.setDisposable(timeout.subscribe(function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n          d.dispose();\n        }, function (e) {\n          timerWins() && o.onError(e);\n        }, function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n        }));\n      };\n\n      setTimer(firstTimeout);\n\n      function oWins() {\n        var res = !switched;\n        if (res) { id++; }\n        return res;\n      }\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (oWins()) {\n          o.onNext(x);\n          var timeout = tryCatch(timeoutDurationSelector)(x);\n          if (timeout === errorObj) { return o.onError(timeout.e); }\n          setTimer(isPromise(timeout) ? observableFromPromise(timeout) : timeout);\n        }\n      }, function (e) {\n        oWins() && o.onError(e);\n      }, function () {\n        oWins() && o.onCompleted();\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  function timeout(source, dueTime, other, scheduler) {\n    if (isScheduler(other)) {\n      scheduler = other;\n      other = observableThrow(new TimeoutError());\n    }\n    if (other instanceof Error) { other = observableThrow(other); }\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var id = 0,\n        original = new SingleAssignmentDisposable(),\n        subscription = new SerialDisposable(),\n        switched = false,\n        timer = new SerialDisposable();\n\n      subscription.setDisposable(original);\n\n      function createTimer() {\n        var myId = id;\n        timer.setDisposable(scheduler.scheduleFuture(null, dueTime, function () {\n          switched = id === myId;\n          if (switched) {\n            isPromise(other) && (other = observableFromPromise(other));\n            subscription.setDisposable(other.subscribe(o));\n          }\n        }));\n      }\n\n      createTimer();\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (!switched) {\n          id++;\n          o.onNext(x);\n          createTimer();\n        }\n      }, function (e) {\n        if (!switched) {\n          id++;\n          o.onError(e);\n        }\n      }, function () {\n        if (!switched) {\n          id++;\n          o.onCompleted();\n        }\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  observableProto.timeout = function () {\n    var firstArg = arguments[0];\n    if (firstArg instanceof Date || typeof firstArg === 'number') {\n      return timeout(this, firstArg, arguments[1], arguments[2]);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return timeoutWithSelector(this, firstArg, arguments[1], arguments[2]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  var GenerateAbsoluteObservable = (function (__super__) {\n    inherits(GenerateAbsoluteObservable, __super__);\n    function GenerateAbsoluteObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n      this._state = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._timeFn = timeFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      state.hasResult && state.o.onNext(state.result);\n\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n      state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (state.hasResult === errorObj) { return state.o.onError(state.hasResult.e); }\n      if (state.hasResult) {\n        state.result = tryCatch(state.self._resFn)(state.newState);\n        if (state.result === errorObj) { return state.o.onError(state.result.e); }\n        var time = tryCatch(state.self._timeFn)(state.newState);\n        if (time === errorObj) { return state.o.onError(time.e); }\n        recurse(state, time);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateAbsoluteObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        newState: this._state,\n        first: true,\n        hasResult: false\n      };\n      return this._s.scheduleRecursiveFuture(state, new Date(this._s.now()), scheduleRecursive);\n    };\n\n    return GenerateAbsoluteObservable;\n  }(ObservableBase));\n\n  /**\n   *  GenerateAbsolutes an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithAbsoluteTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return new Date(); }\n   *  });\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning Date values.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithAbsoluteTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new GenerateAbsoluteObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n  };\n\n  var GenerateRelativeObservable = (function (__super__) {\n    inherits(GenerateRelativeObservable, __super__);\n    function GenerateRelativeObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n      this._state = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._timeFn = timeFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      state.hasResult && state.o.onNext(state.result);\n\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n\n      state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (state.hasResult === errorObj) { return state.o.onError(state.hasResult.e); }\n      if (state.hasResult) {\n        state.result = tryCatch(state.self._resFn)(state.newState);\n        if (state.result === errorObj) { return state.o.onError(state.result.e); }\n        var time = tryCatch(state.self._timeFn)(state.newState);\n        if (time === errorObj) { return state.o.onError(time.e); }\n        recurse(state, time);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateRelativeObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        newState: this._state,\n        first: true,\n        hasResult: false\n      };\n      return this._s.scheduleRecursiveFuture(state, 0, scheduleRecursive);\n    };\n\n    return GenerateRelativeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithRelativeTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return 500; }\n   *  );\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithRelativeTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new GenerateRelativeObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n  };\n\n  var DelaySubscription = (function(__super__) {\n    inherits(DelaySubscription, __super__);\n    function DelaySubscription(source, dt, s) {\n      this.source = source;\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    DelaySubscription.prototype.subscribeCore = function (o) {\n      var d = new SerialDisposable();\n\n      d.setDisposable(this._s.scheduleFuture([this.source, o, d], this._dt, scheduleMethod));\n\n      return d;\n    };\n\n    function scheduleMethod(s, state) {\n      var source = state[0], o = state[1], d = state[2];\n      d.setDisposable(source.subscribe(o));\n    }\n\n    return DelaySubscription;\n  }(ObservableBase));\n\n  /**\n   *  Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.delaySubscription(5000); // 5s\n   *  2 - res = source.delaySubscription(5000, Rx.Scheduler.default); // 5 seconds\n   *\n   * @param {Number} dueTime Relative or absolute time shift of the subscription.\n   * @param {Scheduler} [scheduler]  Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delaySubscription = function (dueTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new DelaySubscription(this, dueTime, scheduler);\n  };\n\n  var SkipLastWithTimeObservable = (function (__super__) {\n    inherits(SkipLastWithTimeObservable, __super__);\n    function SkipLastWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SkipLastWithTimeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipLastWithTimeObserver(o, this));\n    };\n\n    return SkipLastWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipLastWithTimeObserver = (function (__super__) {\n    inherits(SkipLastWithTimeObserver, __super__);\n\n    function SkipLastWithTimeObserver(o, p) {\n      this._o = o;\n      this._s = p._s;\n      this._d = p._d;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    SkipLastWithTimeObserver.prototype.next = function (x) {\n      var now = this._s.now();\n      this._q.push({ interval: now, value: x });\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._o.onNext(this._q.shift().value);\n      }\n    };\n    SkipLastWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipLastWithTimeObserver.prototype.completed = function () {\n      var now = this._s.now();\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._o.onNext(this._q.shift().value);\n      }\n      this._o.onCompleted();\n    };\n\n    return SkipLastWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for skipping elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence.\n   */\n  observableProto.skipLastWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipLastWithTimeObservable(this, duration, scheduler);\n  };\n\n  var TakeLastWithTimeObservable = (function (__super__) {\n    inherits(TakeLastWithTimeObservable, __super__);\n    function TakeLastWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TakeLastWithTimeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeLastWithTimeObserver(o, this._d, this._s));\n    };\n\n    return TakeLastWithTimeObservable;\n  }(ObservableBase));\n\n  var TakeLastWithTimeObserver = (function (__super__) {\n    inherits(TakeLastWithTimeObserver, __super__);\n\n    function TakeLastWithTimeObserver(o, d, s) {\n      this._o = o;\n      this._d = d;\n      this._s = s;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastWithTimeObserver.prototype.next = function (x) {\n      var now = this._s.now();\n      this._q.push({ interval: now, value: x });\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._q.shift();\n      }\n    };\n    TakeLastWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeLastWithTimeObserver.prototype.completed = function () {\n      var now = this._s.now();\n      while (this._q.length > 0) {\n        var next = this._q.shift();\n        if (now - next.interval <= this._d) { this._o.onNext(next.value); }\n      }\n      this._o.onCompleted();\n    };\n\n    return TakeLastWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TakeLastWithTimeObservable(this, duration, scheduler);\n  };\n\n  /**\n   *  Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastBufferWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        var now = scheduler.now();\n        q.push({ interval: now, value: x });\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          q.shift();\n        }\n      }, function (e) { o.onError(e); }, function () {\n        var now = scheduler.now(), res = [];\n        while (q.length > 0) {\n          var next = q.shift();\n          now - next.interval <= duration && res.push(next.value);\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  var TakeWithTimeObservable = (function (__super__) {\n    inherits(TakeWithTimeObservable, __super__);\n    function TakeWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, o) {\n      o.onCompleted();\n    }\n\n    TakeWithTimeObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(\n        this._s.scheduleFuture(o, this._d, scheduleMethod),\n        this.source.subscribe(o)\n      );\n    };\n\n    return TakeWithTimeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.takeWithTime(5000,  [optional scheduler]);\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence.\n   */\n  observableProto.takeWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TakeWithTimeObservable(this, duration, scheduler);\n  };\n\n  var SkipWithTimeObservable = (function (__super__) {\n    inherits(SkipWithTimeObservable, __super__);\n    function SkipWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      this._open = false;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, self) {\n      self._open = true;\n    }\n\n    SkipWithTimeObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(\n        this._s.scheduleFuture(this, this._d, scheduleMethod),\n        this.source.subscribe(new SkipWithTimeObserver(o, this))\n      );\n    };\n\n    return SkipWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipWithTimeObserver = (function (__super__) {\n    inherits(SkipWithTimeObserver, __super__);\n\n    function SkipWithTimeObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipWithTimeObserver.prototype.next = function (x) { this._p._open && this._o.onNext(x); };\n    SkipWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipWithTimeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence.\n   *  This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded\n   *  may not execute immediately, despite the zero due time.\n   *\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration.\n   * @param {Number} duration Duration for skipping elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence.\n   */\n  observableProto.skipWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipWithTimeObservable(this, duration, scheduler);\n  };\n\n  var SkipUntilWithTimeObservable = (function (__super__) {\n    inherits(SkipUntilWithTimeObservable, __super__);\n    function SkipUntilWithTimeObservable(source, startTime, scheduler) {\n      this.source = source;\n      this._st = startTime;\n      this._s = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, state) {\n      state._open = true;\n    }\n\n    SkipUntilWithTimeObservable.prototype.subscribeCore = function (o) {\n      this._open = false;\n      return new BinaryDisposable(\n        this._s.scheduleFuture(this, this._st, scheduleMethod),\n        this.source.subscribe(new SkipUntilWithTimeObserver(o, this))\n      );\n    };\n\n    return SkipUntilWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipUntilWithTimeObserver = (function (__super__) {\n    inherits(SkipUntilWithTimeObserver, __super__);\n\n    function SkipUntilWithTimeObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipUntilWithTimeObserver.prototype.next = function (x) { this._p._open && this._o.onNext(x); };\n    SkipUntilWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipUntilWithTimeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipUntilWithTimeObserver;\n  }(AbstractObserver));\n\n\n  /**\n   *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n   *\n   * @examples\n   *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n   *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n   * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n   */\n  observableProto.skipUntilWithTime = function (startTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipUntilWithTimeObservable(this, startTime, scheduler);\n  };\n\n  /**\n   *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n   * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n   * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n   */\n  observableProto.takeUntilWithTime = function (endTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return new BinaryDisposable(\n        scheduler.scheduleFuture(o, endTime, function (_, o) { o.onCompleted(); }),\n        source.subscribe(o));\n    }, source);\n  };\n\n  /**\n   * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n   * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n   * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n   * @returns {Observable} An Observable that performs the throttle operation.\n   */\n  observableProto.throttle = function (windowDuration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    var duration = +windowDuration || 0;\n    if (duration <= 0) { throw new RangeError('windowDuration cannot be less or equal zero.'); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var lastOnNext = 0;\n      return source.subscribe(\n        function (x) {\n          var now = scheduler.now();\n          if (lastOnNext === 0 || now - lastOnNext >= duration) {\n            lastOnNext = now;\n            o.onNext(x);\n          }\n        },function (e) { o.onError(e); }, function () { o.onCompleted(); }\n      );\n    }, source);\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "dist/rx.virtualtime.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('./rx'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Aliases\n  var Scheduler = Rx.Scheduler,\n    ScheduledItem = Rx.internals.ScheduledItem,\n    SchedulePeriodicRecursive  = Rx.internals.SchedulePeriodicRecursive,\n    PriorityQueue = Rx.internals.PriorityQueue,\n    inherits = Rx.internals.inherits,\n    defaultSubComparer = Rx.helpers.defaultSubComparer,\n    notImplemented = Rx.helpers.notImplemented;\n\n  /** Provides a set of extension methods for virtual time scheduling. */\n  var VirtualTimeScheduler = Rx.VirtualTimeScheduler = (function (__super__) {\n    inherits(VirtualTimeScheduler, __super__);\n\n    /**\n     * Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer.\n     *\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function VirtualTimeScheduler(initialClock, comparer) {\n      this.clock = initialClock;\n      this.comparer = comparer;\n      this.isEnabled = false;\n      this.queue = new PriorityQueue(1024);\n      __super__.call(this);\n    }\n\n    var VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype;\n\n    VirtualTimeSchedulerPrototype.now = function () {\n      return this.toAbsoluteTime(this.clock);\n    };\n\n    VirtualTimeSchedulerPrototype.schedule = function (state, action) {\n      return this.scheduleAbsolute(state, this.clock, action);\n    };\n\n    VirtualTimeSchedulerPrototype.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime instanceof Date ?\n        this.toRelativeTime(dueTime - this.now()) :\n        this.toRelativeTime(dueTime);\n\n      return this.scheduleRelative(state, dt, action);\n    };\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    VirtualTimeSchedulerPrototype.add = notImplemented;\n\n    /**\n     * Converts an absolute time to a number\n     * @param {Any} The absolute time.\n     * @returns {Number} The absolute time in ms\n     */\n    VirtualTimeSchedulerPrototype.toAbsoluteTime = notImplemented;\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    VirtualTimeSchedulerPrototype.toRelativeTime = notImplemented;\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be emulated using recursive scheduling.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.schedulePeriodic = function (state, period, action) {\n      var s = new SchedulePeriodicRecursive(this, state, period, action);\n      return s.start();\n    };\n\n    /**\n     * Schedules an action to be executed after dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleRelative = function (state, dueTime, action) {\n      var runAt = this.add(this.clock, dueTime);\n      return this.scheduleAbsolute(state, runAt, action);\n    };\n\n    /**\n     * Starts the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.start = function () {\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n      }\n    };\n\n    /**\n     * Stops the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.stop = function () {\n      this.isEnabled = false;\n    };\n\n    /**\n     * Advances the scheduler's clock to the specified time, running all work till that point.\n     * @param {Number} time Absolute time to advance the scheduler's clock to.\n     */\n    VirtualTimeSchedulerPrototype.advanceTo = function (time) {\n      var dueToClock = this.comparer(this.clock, time);\n      if (this.comparer(this.clock, time) > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) { return; }\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null && this.comparer(next.dueTime, time) <= 0) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n        this.clock = time;\n      }\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.advanceBy = function (time) {\n      var dt = this.add(this.clock, time),\n          dueToClock = this.comparer(this.clock, dt);\n      if (dueToClock > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) {  return; }\n\n      this.advanceTo(dt);\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.sleep = function (time) {\n      var dt = this.add(this.clock, time);\n      if (this.comparer(this.clock, dt) >= 0) { throw new ArgumentOutOfRangeError(); }\n\n      this.clock = dt;\n    };\n\n    /**\n     * Gets the next scheduled item to be executed.\n     * @returns {ScheduledItem} The next scheduled item.\n     */\n    VirtualTimeSchedulerPrototype.getNext = function () {\n      while (this.queue.length > 0) {\n        var next = this.queue.peek();\n        if (next.isCancelled()) {\n          this.queue.dequeue();\n        } else {\n          return next;\n        }\n      }\n      return null;\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleAbsolute = function (state, dueTime, action) {\n      var self = this;\n\n      function run(scheduler, state1) {\n        self.queue.remove(si);\n        return action(scheduler, state1);\n      }\n\n      var si = new ScheduledItem(this, state, run, dueTime, this.comparer);\n      this.queue.enqueue(si);\n\n      return si.disposable;\n    };\n\n    return VirtualTimeScheduler;\n  }(Scheduler));\n\n  /** Provides a virtual time scheduler that uses Date for absolute time and number for relative time. */\n  Rx.HistoricalScheduler = (function (__super__) {\n    inherits(HistoricalScheduler, __super__);\n\n    /**\n     * Creates a new historical scheduler with the specified initial clock value.\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function HistoricalScheduler(initialClock, comparer) {\n      var clock = initialClock == null ? 0 : initialClock;\n      var cmp = comparer || defaultSubComparer;\n      __super__.call(this, clock, cmp);\n    }\n\n    var HistoricalSchedulerProto = HistoricalScheduler.prototype;\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    HistoricalSchedulerProto.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n\n    HistoricalSchedulerProto.toAbsoluteTime = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @memberOf HistoricalScheduler\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    HistoricalSchedulerProto.toRelativeTime = function (timeSpan) {\n      return timeSpan;\n    };\n\n    return HistoricalScheduler;\n  }(Rx.VirtualTimeScheduler));\n\n  return Rx;\n}));\n"
  },
  {
    "path": "doc/api/config/readme.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Reactive Extensions Configuration #\n\nConfiguration information for the Reactive Extensions for JavaScript\n\n## Documentation ##\n\n- [`Rx.config.Promise`](#rxconfigpromise)\n- [`Rx.config.useNativeEvents`](#rxconfigusenativeevents)\n\n* * *\n\n### <a id=\"rxconfigpromise\"></a>`Rx.config.Promise`\n<a href=\"#rxconfigpromise\">#</a>[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/basicheader.js \"View in source\") [&#x24C9;][1]\n\nSets the default Promise type to be used when the [`toPromise`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/topromise.md) method is called.  Note that the Promise implementation must conform to the ES6 specification.  Some of those supported libraries are [Q](https://github.com/kriskowal/q), [RSVP](https://github.com/tildeio/rsvp.js), [when.js](https://github.com/cujojs/when) among others.  If not specified, this defaults to the native ES6 Promise, if available, else will throw an error.\n\n#### Example\n\n```js\nRx.config.Promise = RSVP.Promise;\n\nvar p = Rx.Observable.just(1).toPromise()\n  .then(function (value) { console.log('Value: %s', s); });\n// => Value: 1\n```\n* * *\n\n### <a id=\"rxconfigusenativeevents\"></a>`Rx.config.useNativeEvents`\n<a href=\"#rxconfigusenativeevents\">#</a>[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/fromevent.js \"View in source\") [&#x24C9;][1]\n\nDetermines whether the [`fromEvent`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/fromevent.md) method uses native DOM events only and disregards the referenced supported libraries such as [jQuery](http://jquery.com/), [Zepto.js](http://zeptojs.com/), [AngularJS](https://angularjs.org/), [Ember.js](http://emberjs.com/) and [Backbone.js](http://backbonejs.org)\n\n#### Example\n\nFor example, we could have jQuery referenced as part of our project, however, we only want native DOM events.\n\n```html\n<script src=\"jquery.js\"></script>\n<script src=\"rx.lite.js\"></script>\n```\n\nWe can do this by setting the `Rx.config.useNativeEvents` flag to `true`.\n\n```js\nRx.config.useNativeEvents = true;\n\nRx.Observable.fromEvent(document, 'mousemove')\n  .subscribe(function (e) {\n    console.log('ClientX: %d, ClientY: %d', e.clientX, e.clientY);\n  });\n```\n* * *\n"
  },
  {
    "path": "doc/api/core/notification.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Notification object #\n\nRepresents a notification to an observer.\n\n## Usage ##\n\nThis can be dematerialized into an Observable.\n```js\nvar source = Rx.Observable\n  .of(\n    Rx.Notification.createOnNext(42),\n    Rx.Notification.createOnCompleted()\n  )\n  .dematerialize();\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// => Completed\n```\n\n### Location\n\nFile:\n- [`notification.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/notification.js)\n\n## `Notification Methods`\n- [`createOnCompleted`](#rxnotificationcreateoncompleted)\n- [`createOnError`](#rxnotificationcreateonerrorexception)\n- [`createOnNext`](#rxnotificationcreateonnextvalue)\n\n## `Notification Instance Methods`\n- [`accept`](#rxnotificationprototypeacceptobserver--onnext-onerror-oncompleted)\n- [`toObservable`](#rxnotificationprototypetoobservablescheduler)\n\n## `Notification Properties`\n- [`error`](#error)\n- [`kind`](#kind)\n- [`value`](#value)\n\n## _Notification Methods_ ##\n\n### <a id=\"rxnotificationcreateoncompleted\"></a>`Rx.Notification.createOnCompleted()`\n<a href=\"#createOnCompleted\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/notification.js#L113-L134 \"View in source\")\n\nCreates an object that represents an OnCompleted notification to an observer.\n\n#### Returns\n`Notification` - The OnCompleted notification.\n\n#### Example\n```js\nvar source = Rx.Observable\n  .of(Rx.Notification.createOnCompleted() )\n  .dematerialize();\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Completed\n```\n\n***\n\n### <a id=\"rxnotificationcreateonerrorexception\"></a>`Rx.Notification.createOnError(exception)`\n<a href=\"#rxnotificationcreateonerrorexception\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/notification.js#L85-L107 \"View in source\")\n\nCreates an object that represents an OnError notification to an observer.\n\n### Arguments\n1. `error`: `Any` - The exception contained in the notification.\n\n#### Returns\n`Notification` - The OnError notification containing the exception.\n\n#### Example\n```js\nvar source = Rx.Observable\n  .of(Rx.Notification.createOnError(new Error('woops')) )\n  .dematerialize();\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Error: Error: woops\n```\n\n### Location\n\n- rx.js\n\n***\n\n### <a id=\"rxnotificationcreateonnextvalue\"></a>`Rx.Notification.createOnNext(value)`\n<a href=\"#rxnotificationcreateonnextvalue\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/notification.js#L56-L178 \"View in source\")\n\nCreates an object that represents an OnNext notification to an observer.\n\n### Arguments\n1. `value`: `Any` - The value contained in the notification.\n\n#### Returns\n`Notification`: The onNext notification containing the value.\n\n#### Example\n```js\nvar source = Rx.Observable\n  .of(\n    Rx.Notification.createOnNext(42),\n    Rx.Notification.createOnCompleted()\n  )\n  .dematerialize();\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// => Completed\n```\n\n***\n\n## _Notification Instance Methods_ ##\n\n### <a id=\"rxnotificationprototypeacceptobserver--onnext-onerror-oncompleted\"></a>`Rx.Notification.prototype.accept(observer | onNext, onError, onCompleted)`\n<a href=\"#rxnotificationprototypeacceptobserver--onnext-onerror-oncompleted\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/notification.js \"View in source\")\n\nInvokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result or the individual functions given.\n\n### Arguments\n1. `[observer]`: `Observer` Observer to invoke the notification on.\n\nOR\n\n1. `onNext`: `Function` -  Function to invoke for an `onNext` notification.\n2. `onError`: `Function` - Function to invoke for an `onError` notification.\n3. `onCompleted`: `Function` - Function to invoke for an `onCompleted` notification.\n\n#### Returns\n`Any`: Result produced by the observation.\n\n#### Example\n```js\n/* Using an observer */\nvar observer = Rx.Observer.create(function (x) { return x; });\n\nvar notification = Rx.Notification.createOnNext(42);\n\nconsole.log(notification.accept(observer));\n\n// => 42\n\n/* Using a function */\nvar notification = Rx.Notification.createOnNext(42);\n\nconsole.log(notification.accept(function (x) { return x; }))\n// => 42\n```\n\n***\n\n### <a id=\"rxnotificationprototypetoobservablescheduler\"></a>`Rx.Notification.prototype.toObservable([scheduler])`\n<a href=\"#rxnotificationprototypetoobservablescheduler\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/notification.js \"View in source\")\n\nReturns an observable sequence with a single notification.\n\n### Arguments\n1. `[scheduler = Rx.Scheduler.immediate]` `Scheduler`: Scheduler to send out the notification calls on.\n\n#### Returns\n`Observable`: The observable sequence that surfaces the behavior of the notification upon subscription.\n\n#### Example\n```js\n/* Without a scheduler */\nvar source = Rx.Notification.createOnNext(42)\n  .toObservable();\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// => Completed\n\n/* With a scheduler */\nvar source = Rx.Notification.createOnError(new Error('error!'))\n  .toObservable(Rx.Scheduler.default);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Error: Error: error!\n```\n\n***\n\n## _Notification Properties_ ##\n\n### <a id=\"error\"></a>`error`\n<a href=\"#error\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/notification.js \"View in source\")\n\nGets the exception from the OnError notification.\n\n#### Returns\n`Any`: The Error from the `onError` notification.\n\n#### Example\n```js\nvar notification = Rx.Notification.createOnError(new Error('invalid'));\nconsole.log(notification.error);\n\n// => Error: invalid\n```\n\n***\n\n### <a id=\"kind\"></a>`kind`\n<a href=\"#kind\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/notification.js \"View in source\")\n\nGets the kind from the notification which denotes 'N' for OnNext, 'E' for OnError and 'C' for OnCompleted.\n\n#### Returns\n`String`: The kind from the notification which denotes 'N' for OnNext, 'E' for OnError and 'C' for OnCompleted.\n\n#### Example\n```js\nvar notification = Rx.Notification.createOnCompleted();\nconsole.log(notification.kind);\n\n// => C\n```\n\n***\n\n### <a id=\"value\"></a>`value`\n<a href=\"#value\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/notification.js \"View in source\")\n\nGets the value from the `onNext` notification.\n\n#### Returns\n`Any`: The value from the `onNext` notification.\n\n#### Example\n```js\nvar notification = Rx.Notification.createOnNext(42);\nconsole.log(notification.value);\n\n// => 42\n```\n\n***\n"
  },
  {
    "path": "doc/api/core/observable.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Observable object #\n\nThe Observable object represents a push based collection.\n\nThe Observer and Observable interfaces provide a generalized mechanism for push-based notification, also known as the observer design pattern. The Observable object represents the object that sends notifications (the provider); the Observer object represents the class that receives them (the observer).\n\n## `Observable Methods`\n- [`amb`](operators/amb.md)\n- [`case`](operators/case.md)\n- [`catch`](operators/catch.md)\n- [`combineLatest`](operators/combinelatest.md)\n- [`concat`](operators/concat.md)\n- [`create`](operators/create.md)\n- [`defer`](operators/defer.md)\n- [`empty`](operators/empty.md)\n- [`for`](operators/for.md)\n- [`forkJoin`](operators/forkjoin.md)\n- [`from`](operators/from.md)\n- [`fromCallback`](operators/fromcallback.md)\n- [`fromEvent`](operators/fromevent.md)\n- [`fromEventPattern`](operators/fromeventpattern.md)\n- [`fromNodeCallback`](operators/fromnodecallback.md)\n- [`fromPromise`](operators/frompromise.md)\n- [`generate`](operators/generate.md)\n- [`generateWithAbsoluteTime`](operators/generatewithabsolutetime.md)\n- [`generateWithRelativeTime`](operators/generatewithrelativetime.md)\n- [`if`](operators/if.md)\n- [`interval`](operators/interval.md)\n- [`just`](operators/return.md)\n- [`merge`](operators/merge.md)\n- [`mergeDelayError`](operators/mergedelayerror.md)\n- [`never`](operators/never.md)\n- [`of`](operators/of.md)\n- [`ofWithScheduler`](operators/ofwithscheduler.md)\n- [`onErrorResumeNext`](operators/onerrorresumenext.md)\n- [`pairs`](operators/pairs.md)\n- [`range`](operators/range.md)\n- [`repeat`](operators/repeat.md)\n- [`return`](operators/return.md)\n- [`spawn`](operators/spawn.md)\n- [`start`](operators/start.md)\n- [`startAsync`](operators/startasync.md)\n- [`throw`](operators/throw.md)\n- [`timer`](operators/timer.md)\n- [`toAsync`](operators/toasync.md)\n- [`using`](operators/using.md)\n- [`when`](operators/when.md)\n- [`while`](operators/while.md)\n- [`wrap`](operators/wrap.md)\n- [`zip`](operators/zip.md)\n\n<!-- div -->\n\n<!-- div -->\n\n## `Observable Instance Methods`\n- [`amb`](operators/ambproto.md)\n- [`and`](operators/and.md)\n- [`asObservable`](operators/asobservable.md)\n- [`average`](operators/average.md)\n- [`buffer`](operators/buffer.md)\n- [`bufferWithCount`](operators/bufferwithcount.md)\n- [`bufferWithTime`](operators/bufferwithtime.md)\n- [`bufferWithTimeOrCount`](operators/bufferwithtimeorcount.md)\n- [`catch`](operators/catchproto.md)\n- [`combineLatest`](operators/combinelatestproto.md)\n- [`concat`](operators/concatproto.md)\n- [`concatAll`](operators/concatall.md)\n- [`concatMap`](operators/concatmap.md)\n- [`concatMapObserver`](operators/concatmapobserver.md)\n- [`connect`](operators/connect.md)\n- [`controlled`](operators/controlled.md)\n- [`count`](operators/count.md)\n- [`debounce`](operators/debounce.md)\n- [`defaultIfEmpty`](operators/defaultifempty.md)\n- [`delay`](operators/delay.md)\n- [`delaySubscription`](operators/delaysubscription.md)\n- [`dematerialize`](operators/dematerialize.md)\n- [`distinct`](operators/distinct.md)\n- [`distinctUntilChanged`](operators/distinctuntilchanged.md)\n- [`do`](operators/do.md)\n- [`doOnCompleted`](operators/dooncompleted.md)\n- [`doOnError`](operators/doonerror.md)\n- [`doOnNext`](operators/doonnext.md)\n- [`doWhile`](operators/dowhile.md)\n- [`elementAt`](operators/elementat.md)\n- [`every`](operators/every.md)\n- [`expand`](operators/expand.md)\n- [`extend`](operators/manyselect.md)\n- [`filter`](operators/where.md)\n- [`finally`](operators/finally.md)\n- [`find`](operators/find.md)\n- [`findIndex`](operators/findindex.md)\n- [`first`](operators/first.md)\n- [`flatMap`](operators/selectmany.md)\n- [`flatMapFirst`](operators/flatmapfirst.md)\n- [`flatMapLatest`](operators/flatmaplatest.md)\n- [`flatMapObserver`](operators/flatmapobserver.md)\n- [`flatMapWithMaxConcurrent`](operators/flatmapwithmaxconcurrent.md)\n- [`forkJoin`](operators/forkjoinproto.md)\n- [`groupBy`](operators/groupby.md)\n- [`groupByUntil`](operators/groupbyuntil.md)\n- [`groupJoin`](operators/groupjoin.md)\n- [`ignoreElements`](operators/ignoreelements.md)\n- [`includes`](operators/includes.md)\n- [`indexOf`](operators/indexof.md)\n- [`isEmpty`](operators/isempty.md)\n- [`join`](operators/join.md)\n- [`jortSort`](operators/jortsort.md)\n- [`jortSortUntil`](operators/jortsortuntil.md)\n- [`last`](operators/last.md)\n- [`lastIndexOf`](operators/lastindexof.md)\n- [`let`](operators/let.md)\n- [`manySelect`](operators/manyselect.md)\n- [`map`](operators/select.md)\n- [`max`](operators/max.md)\n- [`maxBy`](operators/maxby.md)\n- [`merge`](operators/mergeproto.md)\n- [`mergeAll`](operators/mergeall.md)\n- [`min`](operators/min.md)\n- [`minBy`](operators/minby.md)\n- [`multicast`](operators/multicast.md)\n- [`observeOn`](operators/observeon.md)\n- [`onErrorResumeNext`](operators/onerrorresumenextproto.md)\n- [`pairwise`](operators/pairwise.md)\n- [`partition`](operators/partition.md)\n- [`pausable`](operators/pausable.md)\n- [`pausableBuffered`](operators/pausablebuffered.md)\n- [`pluck`](operators/pluck.md)\n- [`publish`](operators/publish.md)\n- [`publishLast`](operators/publishlast.md)\n- [`publishValue`](operators/publishvalue.md)\n- [`reduce`](operators/reduce.md)\n- [`refCount`](operators/refcount.md)\n- [`repeat`](operators/repeatproto.md)\n- [`repeatWhen`](operators/repeatwhen.md)\n- [`replay`](operators/replay.md)\n- [`retry`](operators/retry.md)\n- [`retryWhen`](operators/retrywhen.md)\n- [`sample`](operators/sample.md)\n- [`scan`](operators/scan.md)\n- [`select`](operators/select.md)\n- [`selectConcat`](operators/concatmap.md)\n- [`selectConcatObserver`](operators/concatmapobserver.md)\n- [`selectMany`](operators/selectmany.md)\n- [`selectManyObserver`](operators/flatmapobserver.md)\n- [`sequenceEqual`](operators/sequenceequal.md)\n- [`share`](operators/share.md)\n- [`shareReplay`](operators/sharereplay.md)\n- [`shareValue`](operators/sharevalue.md)\n- [`single`](operators/single.md)\n- [`singleInstance`](operators/singleinstance.md)\n- [`skip`](operators/skip.md)\n- [`skipLast`](operators/skiplast.md)\n- [`skipLastWithTime`](operators/skiplastwithtime.md)\n- [`skipUntil`](operators/skipuntil.md)\n- [`skipUntilWithTime`](operators/skipuntilwithtime.md)\n- [`skipWhile`](operators/skipwhile.md)\n- [`slice`](operators/slice.md)\n- [`some`](operators/some.md)\n- [`startWith`](operators/startwith.md)\n- [`subscribe | forEach`](operators/subscribe.md)\n- [`subscribeOn`](operators/subscribeon.md)\n- [`subscribeOnCompleted`](operators/subscribeoncompleted.md)\n- [`subscribeOnError`](operators/subscribeonerror.md)\n- [`subscribeOnNext`](operators/subscribeonnext.md)\n- [`sum`](operators/sum.md)\n- [`switch | switchLatest`](operators/switch.md)\n- [`switchFirst`](operators/switchfirst.md)\n- [`take`](operators/take.md)\n- [`takeLast`](operators/takelast.md)\n- [`takeLastBuffer`](operators/takelastbuffer.md)\n- [`takeLastBufferWithTime`](operators/takelastbufferwithtime.md)\n- [`takeLastWithTime`](operators/takelastwithtime.md)\n- [`takeUntil`](operators/takeuntil.md)\n- [`takeUntilWithTime`](operators/takeuntilwithtime.md)\n- [`takeWhile`](operators/takewhile.md)\n- [`tap`](operators/do.md)\n- [`tapOnCompleted`](operators/dooncompleted.md)\n- [`tapOnError`](operators/doonerror.md)\n- [`tapOnNext`](operators/doonnext.md)\n- [`throttle`](operators/throttle.md)\n- [`timeInterval`](operators/timeinterval.md)\n- [`timeout`](operators/timeout.md)\n- [`timeoutWithSelector`](operators/timeoutwithselector.md)\n- [`timestamp`](operators/timestamp.md)\n- [`toArray`](operators/toarray.md)\n- [`toMap`](operators/tomap.md)\n- [`toPromise`](operators/topromise.md)\n- [`toSet`](operators/toset.md)\n- [`transduce`](operators/transduce.md)\n- [`where`](operators/where.md)\n- [`window`](operators/window.md)\n- [`windowWithCount`](operators/windowwithcount.md)\n- [`windowWithTime`](operators/windowwithtime.md)\n- [`windowWithTimeOrCount`](operators/windowwithtimeorcount.md)\n- [`withLatestFrom`](operators/withlatestfrom.md)\n- [`zip`](operators/zipproto.md)\n- [`zipIterable`](operators/zipiterable.md)\n"
  },
  {
    "path": "doc/api/core/observer.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Observer object #\n\nThe Observer object provides support for push-style iteration over an observable sequence.\n\nThe Observer and Objects interfaces provide a generalized mechanism for push-based notification, also known as the observer design pattern. The Observable object represents the object that sends notifications (the provider); the Observer object represents the class that receives them (the observer).\n\n<!-- div -->\n\n## `Observer Methods`\n- [`create`](#rxobservercreateonnext-onerror-oncompleted)\n- [`fromNotifier`](#rxobserverfromotifierhandler)\n\n## `Observer Instance Methods`\n- [`asObserver`](#rxobserverprototypeasobserver)\n- [`checked`](#rxobserverprototypechecked)\n- [`notifyOn`](#rxobserverprototypenotifyonscheduler)\n- [`onCompleted`](#rxobserverprototypeoncompleted)\n- [`onError`](#rxobserverprototypeonerrorerror)\n- [`onNext`](#rxobserverprototypeonnextvalue)\n- [`toNotifier`](#rxobserverprototypetonotifier)\n\n## _Observer Methods_ ##\n\n### <a id=\"rxobservercreateonnext-onerror-oncompleted\"></a>`Rx.Observer.create([onNext], [onError], [onCompleted])`\n<a href=\"#rxobservercreateonnext-onerror-oncompleted\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js#L1828-L1833 \"View in source\") [&#x24C9;][1]\n\nCreates an observer from the specified `onNext`, `onError`, and `onCompleted` actions.\n\n#### Arguments\n1. `[onNext]` *(Function)*: Observer's onNext action implementation.\n2. `[onError]` *(Function)*: Observer's onError action implementation.\n3. `[onCompleted]` *(Function)*: Observer's onCompleted action implementation.\n\n#### Returns\n*(Observer)*: The observer object implemented using the given actions.\n\n#### Example\n```js\nvar source = Rx.Observable.return(42);\n\nvar observer = Rx.Observer.create(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    }\n);\n\nvar subscription = source.subscribe(observer);\n\n// => Next: 42\n// => Completed\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n### <a id=\"rxobserverfromotifierhandler\"></a>`Rx.Observer.fromNotifier(handler, [thisArg])`\n<a href=\"#rxobserverfromotifierhandler\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js#L1843-L1851 \"View in source\") [&#x24C9;][1]\n\nCreates an observer from a notification callback.\n\n#### Arguments\n1. `handler` *(Function)*: Function that handles a notification.\n2. `[thisArg]` *(`Any`)*: Object to use as `this` when executing `handler`.\n\n#### Returns\n*(Observer)*: The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n\n#### Example\n```js\nfunction handler(n) {\n\t// Handle next calls\n\tif (n.kind === 'N') {\n\t\tconsole.log('Next: ' + n.value);\n\t}\n\n\t// Handle error calls\n\tif (n.kind === 'E') {\n\t\tconsole.log('Error: ' + n.exception);\n\t}\n\n\t// Handle completed\n\tif (n.kind === 'C') {\n\t\tconsole.log('Completed')\n\t}\n}\n\nRx.Observer.fromNotifier(handler).onNext(42);\n// => Next: 42\n\nRx.Observer.fromNotifier(handler).onError(new Error('error!!!'));\n// => Error: Error: error!!!\n\nRx.Observer.fromNotifier(handler).onCompleted();\n// => false\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n## _Observer Instance Methods_ ##\n\n### <a id=\"rxobserverprototypeasobserver\"></a>`Rx.Observer.prototype.asObserver()`\n<a href=\"#rxobserverprototypeasobserver\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js#L1810-L1812 \"View in source\") [&#x24C9;][1]\n\nHides the identity of an observer.\n\n#### Returns\n*(Observer)*: An observer that hides the identity of the specified observer.\n\n#### Example\n```js\nfunction SampleObserver () {\n    Rx.Observer.call(this);\n    this.isStopped = false;\n}\n\nSampleObserver.prototype = Object.create(Rx.Observer.prototype);\nSampleObserver.prototype.constructor = SampleObserver;\n\nObject.defineProperties(SampleObserver.prototype, {\n    onNext: {\n        value: function (x) {\n            if (!this.isStopped) {\n                console.log('Next: ' + x);\n            }\n        }\n    },\n    onError: {\n        value: function (err) {\n            if (!this.isStopped) {\n                this.isStopped = true;\n                console.log('Error: ' + err);\n            }\n        }\n    },\n    onCompleted: {\n        value: function () {\n            if (!this.isStopped) {\n                this.isStopped = true;\n                console.log('Completed');\n            }\n        }\n    }\n});\n\nvar sampleObserver = new SampleObserver();\n\nvar source = sampleObserver.asObserver();\n\nconsole.log(source === sampleObserver);\n// => false\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n### <a id=\"rxobserverprototypechecked\"></a>`Rx.Observer.prototype.checked()`\n<a href=\"#rxobserverprototypechecked\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js#L1819 \"View in source\") [&#x24C9;][1]\n\nChecks access to the observer for grammar violations. This includes checking for multiple `onError` or `onCompleted` calls, as well as reentrancy in any of the observer methods.\n\nIf a violation is detected, an Error is thrown from the offending observer method call.\n\n#### Returns\n*(Observer)*: An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n\n#### Example\n```js\nvar observer = Rx.Observer.create(\n    function (x) {\n        console.log('Next: ' + x)\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    }\n);\n\nvar checked = observer.checked();\n\nchecked.onNext(42);\n// => Next: 42\n\nchecked.onCompleted();\n// => Completed\n\n// Throws Error('Observer completed')\nchecked.onNext(42);\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n### <a id=\"rxobserverprototypenotifyonscheduler\"></a>`Rx.Observer.prototype.notifyOn(scheduler)`\n<a href=\"#rxobserverprototypenotifyonscheduler\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js#L1858-1860 \"View in source\") [&#x24C9;][1]\n\nSchedules the invocation of observer methods on the given scheduler.\n\n#### Arguments\n1. `scheduler` *(Scheduler)*: Scheduler to schedule observer messages on.\n\n#### Returns\n*(Observer)*: Observer whose messages are scheduled on the given scheduler.\n\n#### Example\n```js\nvar observer = Rx.Observer.create(\n    function (x) {\n        console.log('Next: ' + x)\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    }\n);\n\n// Notify on timeout scheduler\nvar timeoutObserver = observer.notifyOn(Rx.Scheduler.timeout);\n\ntimeoutObserver.onNext(42);\n// => Next: 42\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n### <a id=\"rxobserverprototypeoncompleted\"></a>`Rx.Observer.prototype.onCompleted()`\n<a href=\"#rxobserverprototypeoncompleted\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js#L1899-L1904 \"View in source\") [&#x24C9;][1]\n\nNotifies the observer of the end of the sequence.\n\n#### Example\n```js\nvar observer = Rx.Observer.create(\n    function (x) {\n        console.log('Next: ' + x)\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    }\n);\n\nobserver.onCompleted();\n// => Completed\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n### <a id=\"rxobserverprototypeonerrorerror\"></a>`Rx.Observer.prototype.onError(error)`\n<a href=\"#rxobserverprototypeonerrorerror\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js#L1889-L1894 \"View in source\") [&#x24C9;][1]\n\nNotifies the observer that an exception has occurred.\n\n#### Arguments\n1. `error` *(Any)*: The error that has occurred.\n\n#### Example\n```js\nvar observer = Rx.Observer.create(\n    function (x) {\n        console.log('Next: ' + x)\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    }\n);\n\nobserver.onError(new Error('error!!'));\n// => Error: Error: error!!\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n### <a id=\"rxobserverprototypeonnextvalue\"></a>`Rx.Observer.prototype.onNext(value)`\n<a href=\"#rxobserverprototypeonnextvalue\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js#L1881-L1883 \"View in source\") [&#x24C9;][1]\n\nNotifies the observer of a new element in the sequence.\n\n#### Arguments\n1. `value` *(Any)*: Next element in the sequence.\n\n#### Example\n```js\nvar observer = Rx.Observer.create(\n    function (x) {\n        console.log('Next: ' + x)\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    }\n);\n\nobserver.onNext(42);\n// => Next: 42\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n### <a id=\"rxobserverprototypetonotifier\"></a>`Rx.Observer.prototype.toNotifier()`\n<a href=\"#rxobserverprototypetonotifier\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js#L1801-L1804 \"View in source\") [&#x24C9;][1]\n\nCreates a notification callback from an observer.\n\n#### Returns\n*(Function)*: The function that forwards its input notification to the underlying observer.\n\n#### Example\n```js\nvar observer = Rx.Observer.create(\n    function (x) {\n        console.log('Next: ' + x)\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    }\n);\n\nvar notifier = observer.toNotifier();\n\n// Invoke with onNext\nnotifier(Rx.Notification.createOnNext(42));\n// => Next: 42\n\n// Invoke with onCompleted\nnotifier(Rx.Notification.createOnCompleted());\n// => Completed\n```\n\n### Location\n\n- rx.js\n\n* * *\n"
  },
  {
    "path": "doc/api/core/operators/amb.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.amb(...args)` [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/amb.js \"View in source\")\n\nPropagates the observable sequence or Promise that reacts first. \"amb\" stands for [ambiguous](http://blogs.msdn.com/b/jeffva/archive/2009/11/18/amb-materialize-and-dematerialize.aspx).\n\n#### Arguments\n1. `args` *(Array|arguments)*: Observable sources or Promises competing to react first either as an array or arguments.\n\n#### Returns\n*(`Observable`)*: An observable sequence that surfaces any of the given sequences, whichever reacted first.\n\n#### Example\n```js\n/* Using Observable sequences */\nvar source = Rx.Observable.amb(\n    Rx.Observable.timer(500).select(function () { return 'foo'; }),\n    Rx.Observable.timer(200).select(function () { return 'bar'; })\n);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: bar\n// => Completed\n\n/* Using Promises and Observables */\nvar source = Rx.Observable.amb(\n    RSVP.Promise.resolve('foo'),\n    Rx.Observable.timer(200).select(function () { return 'bar'; })\n);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: foo\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/amb.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/amb.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n\nUnit Tests:\n- [`/tests/observable/amb.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/amb.js)\n"
  },
  {
    "path": "doc/api/core/operators/ambproto.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### <a id=\"rxobservableprototypeambrightsource\"></a>`Rx.Observable.prototype.amb(rightSource)`\n<a href=\"#rxobservableprototypeambrightsource\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/ambproto.js \"View in source\")\n\nPropagates the observable sequence that reacts first.\n\n#### Arguments\n1. `rightSource` *(`Observable`)*: Second observable sequence.\n\n#### Returns\n*(`Observable`)*: An observable sequence that surfaces either of the given sequences, whichever reacted first.\n\n#### Example\n```js\nvar first = Rx.Observable.timer(300).map(function () { return 'first'; });\nvar second = Rx.Observable.timer(500).map(function () { return 'second'; });\n\nvar source = first.amb(second);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: first\n// => Completed\n```\n\n### Location\n\nFile:\n- [/src/core/linq/observable/ambproto.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/ambproto.js)\n\nDist:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.lite.extras.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.extras.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [/tests/observable/amb.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/amb.js)\n"
  },
  {
    "path": "doc/api/core/operators/and.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.and(rightSource)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/and.js \"View in source\")\n\nPropagates the observable sequence that reacts first.\n\n#### Arguments\n1. `right` *(`Observable`)*: Observable sequence to match with the current sequence.\n\n#### Returns\n*(`Pattern`)*: Pattern object that matches when both observable sequences have an available value.\n\n#### Example\n```js\n// Choice of either plan, the first set of timers or second set\nvar source = Rx.Observable.when(\n    Rx.Observable.timer(200).and(Rx.Observable.timer(300)).thenDo(function (x, y) { return 'first'; }),\n    Rx.Observable.timer(400).and(Rx.Observable.timer(500)).thenDo(function (x, y) { return 'second'; })\n);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: first\n// => Next: second\n// => Completed\n```\n\n### Location\n\nFile:\n- [/src/core/linq/observable/and.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/and.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.joinpatterns.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.joinpatterns.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All)\n- [`RxJS-JoinPatterns`](http://www.nuget.org/packages/RxJS-JoinPatterns)\n\nUnit Tests:\n- [/tests/observable/when.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/when.js)\n"
  },
  {
    "path": "doc/api/core/operators/asobservable.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.asObservable()` [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/asobservable.js \"View in source\")\n\nHides the identity of an observable sequence.\n\n#### Returns\n*(`Observable`)*: An observable sequence that hides the identity of the source sequence.\n\n#### Example\n```js\n// Create subject\nvar subject = new Rx.AsyncSubject();\n\n// Send a value\nsubject.onNext(42);\nsubject.onCompleted();\n\n// Hide its type\nvar source = subject.asObservable();\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/asobservable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/asobservable.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n\nUnit Tests:\n- [`/tests/observable/asobservable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/asobservable.js)\n"
  },
  {
    "path": "doc/api/core/operators/average.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.average([selector], [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/average.js \"View in source\")\n\nComputes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present.\n\n#### Arguments\n1. `[selector]` *(`Function`)*: A transform function to apply to each element.\n2. `[thisArg]` *(`Any`)*: Object to use as `this` when executing `selector`.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing a single element with the average of the sequence of values.\n\n#### Example\n```js\n// Without a selector\nvar source = Rx.Observable.range(0, 9).average();\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 4\n// => Completed\n\n// With a selector\nvar arr = [\n    { value: 1 },\n    { value: 2 },\n    { value: 3 }\n];\n\nvar source = Rx.Observable.from(arr).average(function (x) {\n    return x.value;\n});\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 2\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/average.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/average.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/average.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/average.js)\n"
  },
  {
    "path": "doc/api/core/operators/buffer.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.buffer()`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.coincidence.js#L572-L585 \"View in source\")\n\nThe `buffer` method periodically gathers items emitted by a source Observable into buffers, and emits these buffers as its own emissions.\n\nNote that if the source Observable issues an `onError` notification, `buffer` will pass on this notification immediately without first emitting the buffer it is in the process of assembling, even if that buffer contains items that were emitted by the source Observable before it issued the error notification.\n\nThere are a number of ways with which you can regulate how `buffer` gathers items from the source Observable into buffers:\n\n#### With buffer closing selector\n```js\nRx.Observable.prototype.buffer(bufferClosingSelector);\n```\n\nReturns an Observable that emits buffers of items it collects from the source `Observable`. The resulting `Observable` emits connected, non-overlapping buffers. It emits the current buffer and replaces it with a new buffer whenever the `Observable` produced by the specified `bufferClosingSelector` emits an item.\n\n#### Arguments\n1. `bufferClosingSelector` *(`Function`)*: A function invoked to define the closing of each produced window.\n\n#### Returns\n*(`Observable`)*: An observable sequence of windows.\n\n#### Example\n```js\n// With closings\nvar source = Rx.Observable.timer(0, 50)\n  .buffer(function () { return Rx.Observable.timer(125); })\n  .take(3);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n  // => Next: 0,1,2\n  // => Next: 3,4,5\n  // => Next: 6,7\n  // => Completed\n```\n\n#### With buffer opening and buffer closing selector\n```js\nRx.Observable.prototype.buffer(bufferOpenings, bufferClosingSelector);\n```\n\nThis version of `buffer` monitors an `Observable`, `bufferOpenings`, that emits Observable objects. Each time it observes such an emitted object, it creates a new bundle to begin collecting items emitted by the source Observable and it passes the `bufferOpenings` Observable into the `bufferClosingSelector` function. That function returns an `Observable`. `buffer` monitors that `Observable` and when it detects an emitted object, it closes its bundle and emits it as its own emission.\n\n1. `bufferOpenings` *(`Observable`)*: Observable sequence whose elements denote the creation of new windows.\n2. `bufferClosingSelector` *(`Function`)*: A function invoked to define the closing of each produced window.\n\n#### Returns\n*(`Observable`)*: An observable sequence of windows.\n\n#### Example\n\n```js\n/* Using Openings and Closing Selector */\nvar openings = Rx.Observable.interval(200);\n\nvar source = Rx.Observable.interval(50)\n.buffer(openings, function (x) { return Rx.Observable.timer(x + 100); })\n.take(3);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n  // => Next: 3,4\n  // => Next: 7,8\n  // => Next: 11,12\n  // => Completed\n  ```\n\n#### With boundaries\n```js\nRx.Observable.prototype.buffer(bufferBoundaries);\n```\n\nReturns an `Observable` that emits non-overlapping buffered items from the source `Observable` each time the specified boundary `Observable` emits an item.\n\n#### Arguments\n1. `bufferBoundaries` *(`Observable`)*: Sequence of buffer boundary markers. The current buffer is closed and a new buffer is opened upon receiving a boundary marker.\n\n#### Returns\n*(`Observable`)*: An observable sequence of windows.\n\n#### Example\n```js\n/* Using buffer boundaries */\nvar openings = Rx.Observable.interval(500);\n\n// Convert the window to an array\nvar source = Rx.Observable.timer(0, 100)\n  .buffer(openings)\n  .take(3);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n  // => Next: 0,1,2,3,4\n  // => Next: 5,6,7,8,9,10\n  // => Next: 11,12,13,14,15\n  // => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/buffer.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/buffer.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.coincidence.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.coincidence.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Coincidence`](http://www.nuget.org/packages/RxJS-Coincidence/)\n\nUnit Tests:\n- [`/tests/observable/buffer.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/buffer.js)\n"
  },
  {
    "path": "doc/api/core/operators/bufferwithcount.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.bufferWithCount(count, [skip])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/bufferwithcount.js)\n\nProjects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n\n#### Arguments\n1. `count` *(`Function`)*: Length of each buffer.\n2. `[skip]` *(`Function`)*: Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n\n#### Returns\n*(`Observable`)*: An observable sequence of buffers.\n\n#### Example\n```js\n/* Without a skip */\nvar source = Rx.Observable.range(1, 6)\n    .bufferWithCount(2);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 1,2\n// => Next: 3,4\n// => Next: 5,6\n// => Completed\n\n/* Using a skip */\nvar source = Rx.Observable.range(1, 6)\n    .bufferWithCount(2, 1);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 1,2\n// => Next: 2,3\n// => Next: 3,4\n// => Next: 4,5\n// => Next: 5,6\n// => Next: 6\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/bufferwithcount.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/bufferwithcount.js)\n\nDist:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.lite.extras.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.extras.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/bufferwithcount.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/bufferwithcount.js)\n"
  },
  {
    "path": "doc/api/core/operators/bufferwithtime.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.bufferWithTime(timeSpan, [timeShift | scheduler], [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/bufferwithtime.js \"View in source\")\n\nProjects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n\n#### Arguments\n1. `timeSpan` *(`Number`)*: Length of each buffer (specified as an integer denoting milliseconds).\n2. `[timeShift]` *(`Number`)*: Interval between creation of consecutive buffers (specified as an integer denoting milliseconds).\n3. `[scheduler=Rx.Scheduler.timeout]` *(`Scheduler`)*: Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n\n#### Returns\n*(`Observable`)*: An observable sequence of buffers.\n\n#### Example\n```js\n/* Without a skip */\nvar source = Rx.Observable.interval(100)\n    .bufferWithTime(500)\n    .take(3);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0,1,2,3\n// => Next: 4,5,6,7,8\n// => Next: 9,10,11,12,13\n// => Completed\n\n/* Using a skip */\nvar source = Rx.Observable.interval(100)\n    .bufferWithTime(500, 100)\n    .take(3);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0,1,2,3,4\n// => Next: 0,1,2,3,4,5\n// => Next: 2,3,4,5,6\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/bufferwithtime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/bufferwithtime.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n\nPrerequisites:\n- [`rx`](https://www.npmjs.org/package/rx).time.js\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | rx.lite.compat.js\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Time`](http://www.nuget.org/packages/RxJS-Time/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/bufferwithtime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/bufferwithtime.js)\n"
  },
  {
    "path": "doc/api/core/operators/bufferwithtimeorcount.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.bufferWithTimeOrCount(timeSpan, count, [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/bufferwithtimeorcount.js \"View in source\")\n\nProjects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed.\n\n#### Arguments\n1. `timeSpan` *(`Number`)*: Maximum time length of a buffer.\n2. `count` *(`Number`)*: Maximum element count of a buffer.\n3. `[scheduler=Rx.Scheduler.timeout]` *(`Scheduler`)*: Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n\n#### Returns\n*(`Observable`)*: An observable sequence of buffers.\n\n#### Example\n```js\n/* Hitting the count buffer first */\nvar source = Rx.Observable.interval(100)\n    .bufferWithTimeOrCount(500, 3)\n    .take(3);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0,1,2\n// => Next: 3,4,5\n// => Next: 6,7,8\n// => Completed\n```\n### Location\n\nFile:\n- [/src/core/linq/observable/bufferwithtimeorcount.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/bufferwithtimeorcount.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n\nPrerequisites:\n- [`rx`](https://www.npmjs.org/package/rx).time.js\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | rx.lite.compat.js\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Time`](http://www.nuget.org/packages/RxJS-Time/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/bufferwithtimeorcount.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/bufferwithtimeorcount.js)\n"
  },
  {
    "path": "doc/api/core/operators/case.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.case(selector, sources, [elseSource|scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/case.js \"View in source\")\n\nUses selector to determine which source in sources to use.  There is an alias 'switchCase' for browsers <IE9.\n\n### Arguments\n1. `selector` *(`Function`)*: The function which extracts the value for to test in a case statement.\n2. `sources` *(`Object`)*: An object which has keys which correspond to the case statement labels.\n3. `[elseSource|scheduler]` *(`Observable` | `Scheduler`)*: The observable sequence that will be run if the sources are not matched. If this is not provided, it defaults to `Rx.Observabe.empty` with the specified scheduler.\n\n#### Returns\n*(`Observable`)*: An observable sequence which is determined by a case statement.\n\n#### Example\n```js\nvar sources = {\n    'foo': Rx.Observable.return(42),\n    'bar': Rx.Observable.return(56)\n};\n\nvar defaultSource = Rx.Observable.empty();\n\nvar source = Rx.Observable.case(\n    function () {\n        return 'foo';\n    },\n    sources,\n    defaultSource);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n//=> Next: 42\n//=> Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/case.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/case.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.experimental.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.experimental.js)\n\nPrerequisites:\n- If using `rx.expermental.js`\n  - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Experimental`](http://www.nuget.org/packages/RxJS-Experimental)\n\nUnit Tests:\n- [`/tests/observable/case.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/case.js)\n"
  },
  {
    "path": "doc/api/core/operators/catch.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.catch(...args)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/catch.js \"View in source\")\n\nContinues an observable sequence that is terminated by an exception with the next observable sequence.\n\n#### Arguments\n1. `args` *(`Array` | `arguments`)*: Observable sequences to catch exceptions for.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n\n#### Example\n```js\nvar obs1 = Rx.Observable.throw(new Error('error'));\nvar obs2 = Rx.Observable.return(42);\n\nvar source = Rx.Observable.catch(obs1, obs2);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/catch.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/catch.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/catch.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/catch.js)\n"
  },
  {
    "path": "doc/api/core/operators/catchproto.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.catch(second | handler)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js#L3107-L3112 \"View in source\")\n\nContinues an observable sequence that is terminated by an exception with the next observable sequence.\n\n#### Arguments\n\nUsing another Observable:\n- `second` *(`Observable`)*: A second observable sequence used to produce results when an error occurred in the first sequence.\n\nUsing a handler:\n- `handler` *(`Function`)*: Exception handler function that returns an observable sequence given the error that occurred in the first sequence\n\n#### Returns\n*(`Observable`)*: An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n\n#### Example\n```js\n/* Using a second observable */\nvar source = Rx.Observable.throw(new Error()).catch(Rx.Observable.just(42));\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// => Completed\n\n/* Using a handler function */\nvar source = Rx.Observable.throw(new TimeoutError())\n    .catch(function (e) {\n      var returnValue;\n      if (e instanceof TimeoutError) { return Rx.Observable.just(42); }\n      return Rx.Observable.throw(e);\n    });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/catchproto.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/catchproto.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/catch.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/catch.js)\n"
  },
  {
    "path": "doc/api/core/operators/combinelatest.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.combineLatest(...args, [resultSelector])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/combinelatest.js \"View in source\")\n\nMerges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element.  This can be in the form of an argument list of observables or an array.  If the result selector is omitted, a list with the elements will be yielded.\n\n#### Arguments\n1. `args` *(arguments | Array)*: An array or arguments of Observable sequences.\n2. `[resultSelector]` *(`Function`)*: Function to invoke whenever either of the sources produces an element.  If omitted, a list with the elements will be yielded.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n\n#### Example\n```js\n/* Have staggering intervals */\nvar source1 = Rx.Observable.interval(100)\n  .map(function (i) { return 'First: ' + i; });\n\nvar source2 = Rx.Observable.interval(150)\n  .map(function (i) { return 'Second: ' + i; });\n\n// Combine latest of source1 and source2 whenever either gives a value\nvar source = Rx.Observable.combineLatest(\n    source1,\n    source2\n  ).take(4);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', JSON.stringify(x));\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: [\"First: 0\",\"Second: 0\"]\n// => Next: [\"First: 1\",\"Second: 0\"]\n// => Next: [\"First: 1\",\"Second: 1\"]\n// => Next: [\"First: 2\",\"Second: 1\"]\n// => Completed\n\n/* Have staggering intervals */\nvar source1 = Rx.Observable.interval(100)\n  .map(function (i) { return 'First: ' + i; });\n\nvar source2 = Rx.Observable.interval(150)\n  .map(function (i) { return 'Second: ' + i; });\n\n// Combine latest of source1 and source2 whenever either gives a value with a selector\nvar source = Rx.Observable.combineLatest(\n    source1,\n    source2,\n    function (s1, s2) { return s1 + ', ' + s2; }\n  ).take(4);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: First: 0, Second: 0\n// => Next: First: 1, Second: 0\n// => Next: First: 1, Second: 1\n// => Next: First: 2, Second: 1\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/perf/operators/combinelatest.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/combinelatest.js)\n\nDist:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/combinelatest.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/combinelatest.js)\n"
  },
  {
    "path": "doc/api/core/operators/combinelatestproto.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.combineLatest(...args, [resultSelector])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/combinelatestproto.js \"View in source\")\n\nMerges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element (so long as each of the source observable sequences has emitted at least one element).  This can be in the form of an argument list of observables or an array.  If the result selector is omitted, a list with the elements will be yielded.\n\n#### Arguments\n1. `args` *(arguments | Array)*: An array or arguments of Observable sequences.\n2. `[resultSelector]` *(`Function`)*: Function to invoke whenever either of the sources produces an element.  If omitted, a list with the elements will be yielded.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n\n#### Example\n```js\n/* Have staggering intervals */\nvar source1 = Rx.Observable.interval(100)\n  .map(function (i) { return 'First: ' + i; });\n\nvar source2 = Rx.Observable.interval(150)\n  .map(function (i) { return 'Second: ' + i; });\n\n// Combine latest of source1 and source2 whenever either gives a value with selector\nvar source = source1.combineLatest(\n    source2\n  ).take(4);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: First: 0,Second: 0\n// => Next: First: 1,Second: 0\n// => Next: First: 1,Second: 1\n// => Next: First: 2,Second: 1\n// => Completed\n\n/* Have staggering intervals */\nvar source1 = Rx.Observable.interval(100)\n  .map(function (i) { return 'First: ' + i; });\n\nvar source2 = Rx.Observable.interval(150)\n  .map(function (i) { return 'Second: ' + i; });\n\n// Combine latest of source1 and source2 whenever either gives a value\nvar source = source1.combineLatest(\n    source2,\n    function (s1, s2) { return s1 + ', ' + s2; }\n  ).take(4);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: First: 0, Second: 0\n// => Next: First: 1, Second: 0\n// => Next: First: 1, Second: 1\n// => Next: First: 2, Second: 1\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/combinelatestproto.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/combinelatestproto.js)\n\nDist:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/combinelatest.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/combinelatest.js)\n"
  },
  {
    "path": "doc/api/core/operators/concat.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.concat(...args)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/concat.js \"View in source\")\n\nConcatenates all of the specified observable sequences, as long as the previous observable sequence terminated successfully.\n\n#### Arguments\n1. `args` *(`Array` | `arguments`)*: Observable sequences or Promises to concatenate.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains the elements of each given sequence, in sequential order.\n\n#### Example\n```js\n/* Using Observable sequences */\nvar source1 = Rx.Observable.return(42);\nvar source2 = Rx.Observable.return(56);\n\nvar source = Rx.Observable.concat(source1, source2);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n// => Next: 56\n// => Completed\n\n/* Using Promises and Observable sequences */\nvar source1 = Rx.Observable.return(42);\nvar source2 = RSVP.Promise.resolve(56);\n\nvar source = Rx.Observable.concat(source1, source2);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n// => Next: 56\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/concat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/concat.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/concat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/concat.js)\n"
  },
  {
    "path": "doc/api/core/operators/concatall.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.concatAll()` ###\n### `Rx.Observable.prototype.concatObservable()` **DEPRECATED** ###\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/concatall.js \"View in source\")\n\nConcatenates a sequence of observable sequences or promises into a single observable sequence.\n\n#### Returns\n*(`Observable`)*: The observable sequence that merges the elements of the inner sequences.\n\n#### Example\n```js\nvar source = Rx.Observable.range(0, 3)\n  .map(function (x) { return Rx.Observable.range(x, 3); })\n  .concatAll();\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n// => Next: 1\n// => Next: 2\n// => Next: 3\n// => Next: 2\n// => Next: 3\n// => Next: 4\n// => Completed\n```\n\n#### Location\n\nFile:\n- [/src/core/linq/observable/concatall.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/concatall.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [/tests/observable/concat.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/concat.js)\n"
  },
  {
    "path": "doc/api/core/operators/concatmap.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.concatMap(selector, [resultSelector], [thisArg])`\n### `Rx.Observable.prototype.selectConcat(selector, [resultSelector], [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/concatmap.js \"View in source\")\n\nThis is an alias for the `selectConcat` method.  This can be one of the following:\n\nProjects each element of an observable sequence to an observable sequence and concatenates the resulting observable sequences or Promises or array/iterable into one observable sequence.\n\n```js\nsource.concatMap(function (x, i) { return Rx.Observable.range(0, x); });\nsource.concatMap(function (x, i) { return Promise.resolve(x + 1); });\nsource.concatMap(function (x, i) { return [x, i]; });\n```\n\nProjects each element of an observable sequence or Promise to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and concatenates the results into one observable sequence.\n\n```js\nsource.concatMap(function (x, i) { return Rx.Observable.range(0, x); }, function (x, y, ix, iy) { return x + y + ix + iy; });\nsource.concatMap(function (x, i) { return Promise.resolve(x + i); }, function (x, y, ix, iy) { return x + y + ix + iy; });\nsource.concatMap(function (x, i) { return [x, i];  }, function (x, y, ix, iy) { return x + y + ix + iy; });\n```\n\nProjects each element of the source observable sequence to the other observable sequence or Promise or array/iterable and merges the resulting observable sequences into one observable sequence.\n\n ```js\nsource.concatMap(Rx.Observable.of(1,2,3));\nsource.concatMap(Promise.resolve(42));\nsource.concatMap([1,2,3]);\n ```\n\n#### Arguments\n1. `selector` *(`Function` | `Iterable` | `Promise`)*:  An Object to project to the sequence or a transform function to apply to each element or an observable sequence to project each element from the source sequence onto.  The selector is called with the following information:\n    1. the value of the element\n    2. the index of the element\n    3. the Observable object being subscribed\n\n2. `[resultSelector]` *(`Function`)*: A transform function to apply to each element of the intermediate sequence.  The resultSelector is called with the following information:\n    1. the value of the outer element\n    2. the value of the inner element\n    3. the index of the outer element\n    4. the index of the inner element\n\n3. `[thisArg]` *(`Any`)*: If `resultSelector` is not `Function`, Object to use as `this` when executing `selector`.\n\n#### Returns\n*(`Observable`)*: An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n\n#### Example\n```js\nvar source = Rx.Observable.range(0, 5)\n    .concatMap(function (x, i) {\n        return Rx.Observable\n            .interval(100)\n            .take(x).map(function() { return i; });\n    });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: %s', x);\n    },\n    function (err) {\n        console.log('Error: %s', err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 1\n// => Next: 2\n// => Next: 2\n// => Next: 3\n// => Next: 3\n// => Next: 3\n// => Next: 4\n// => Next: 4\n// => Next: 4\n// => Next: 4\n// => Completed\n\n/* Using a promise */\nvar source = Rx.Observable.of(1,2,3,4)\n    .concatMap(function (x, i) {\n        return Promise.resolve(x + i);\n    });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: %s', x);\n    },\n    function (err) {\n        console.log('Error: %s', err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 1\n// => Next: 3\n// => Next: 5\n// => Next: 7\n// => Completed\n\n/* Using an array */\nvar source = Rx.Observable.of(1,2,3)\n  .concatMap(\n    function (x, i) { return [x,i]; },\n    function (x, y, ix, iy) { return x + y + ix + iy; }\n  );\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: %s', x);\n    },\n    function (err) {\n        console.log('Error: %s', err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 2\n// => Next: 2\n// => Next: 5\n// => Next: 5\n// => Next: 8\n// => Next: 8\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/concatmap.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/concatmap.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/concatmap.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/concatmap.js)\n"
  },
  {
    "path": "doc/api/core/operators/concatmapobserver.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.concatMapObserver(onNext, onError, onCompleted, [thisArg])`\n### `Rx.Observable.prototype.selectConcatObserver(onNext, onError, onCompleted, [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/concatmapobserver.js \"View in source\")\n\nProjects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n\n#### Arguments\n1. `onNext` *(`Function`)*:  A transform function to apply to each element. The selector is called with the following information:\n    1. the value of the element\n    2. the index of the element\n2. `onError` *(`Function`)*: A transform function to apply when an error occurs in the source sequence.\n3. `onCompleted` *(`Function`)*: A transform function to apply when the end of the source sequence is reached.\n4. `[thisArg]` *(`Any`)*: Object to use as `this` when executing the transform functions.\n\n#### Returns\n*(`Observable`)*: An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n\n#### Example\n```js\nvar source = Rx.Observable.range(1, 3)\n    .concatMapObserver(\n        function (x, i) {\n            return Rx.Observable.repeat(x, i);\n        },\n        function (err) {\n            return Rx.Observable.return(42);\n        },\n        function () {\n            return Rx.Observable.empty();\n        });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 2\n// => Next: 3\n// => Next: 3\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/concatmapobserver.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/concatmapobserver.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n\nUnit Tests:\n- [`/tests/observable/concatmapobserver.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/concatmapobserver.js)\n"
  },
  {
    "path": "doc/api/core/operators/concatproto.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.concat(...args)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/concatproto.js \"View in source\")\n\nConcatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n\n#### Arguments\n1. `args` *(arguments | Array)*: An array or arguments of Observable sequences.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains the elements of each given sequence, in sequential order.\n\n#### Example\n```js\nvar source = Rx.Observable\n    .return(42)\n    .concat(Rx.Observable.return(56), Rx.Observable.return(72));\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n// => Next: 56\n// => Next: 72\n// => Completed\n\n// With a promise\nvar source = Rx.Observable.just(42)\n    .concat(Promise.resolve(42));\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n// => Next: 42\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/concatproto.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/concatproto.js)\n\nDist:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/concat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/concat.js)\n"
  },
  {
    "path": "doc/api/core/operators/connect.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### <a id=\"connectableobservableprototypeconnect\"></a>`ConnectableObservable.prototype.connect()`\n<a href=\"#connectableobservableprototypeconnect\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js#L504 \"View in source\")\n\nConnects the observable wrapper to its source. All subscribed observers will receive values from the underlying observable sequence as long as the connection is established.\n\n#### Returns\n*(Disposable)*: Disposable object used to disconnect the observable wrapper from its source, causing subscribed observer to stop receiving values from the underlying observable sequence.\n\n#### Example\n```js\nvar interval = Rx.Observable.interval(1000);\n\nvar source = interval\n    .take(2)\n    .do(function (x) {\n        console.log('Side effect');\n    });\n\nvar published = source.publish();\n\npublished.subscribe(createObserver('SourceA'));\npublished.subscribe(createObserver('SourceB'));\n\n// Connect the source\nvar connection = published.connect();\n\nfunction createObserver(tag) {\n    return Rx.Observer.create(\n        function (x) {\n            console.log('Next: ' + tag + x);\n        },\n        function (err) {\n            console.log('Error: ' + err);\n        },\n        function () {\n            console.log('Completed');\n        });\n}\n\n// => Side effect\n// => Next: SourceA0\n// => Next: SourceB0\n// => Side effect\n// => Next: SourceA1\n// => Next: SourceB1\n// => Completed\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/connectableobservable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/connectableobservable.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Binding`](http://www.nuget.org/packages/RxJS-Binding/)\n\nUnit Tests:\n- [`/tests/observable/connectableobservable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/connectableobservable.js)\n"
  },
  {
    "path": "doc/api/core/operators/controlled.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.controlled([enableQueue])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/backpressure/controlled.js \"View in source\")\n\nAttaches a controller to the observable sequence with the ability to queue.\n\n#### Arguments\n1. `[enableQueue]` *(Boolean)*: Whether to enable queueing.  If not specified, defaults to true.\n\n#### Returns\n*(`Observable`)*: An observable sequence which can be used to request values from the sequence.\n\n#### Example\n```js\nvar source = Rx.Observable.range(0, 10).controlled();\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\nsource.request(2);\n\n// => Next: 0\n// => Next: 1\n```\n### Location\n\nFile:\n- [`/src/core/backpressure/controlled.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/backpressure/controlled.js)\n\nDist:\n- [`rx.backpressure.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.backpressure.js`\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n    - [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-BackPressure`](http://www.nuget.org/packages/RxJS-BackPressure/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [/tests/observable/controlled.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/controlled.js)\n"
  },
  {
    "path": "doc/api/core/operators/count.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.count([predicate], [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/count.js \"View in source\")\n\nReturns an observable sequence containing a value that represents how many elements in the specified observable sequence satisfy a condition if provided, else the count of items.\n\n#### Arguments\n1. `[predicate]` *(`Function`)*: A function to test each element for a condition.  The callback is called with the following information:\n    1. the value of the element\n    2. the index of the element\n    3. the Observable object being subscribed\n2. `[thisArg]` *(`Any`)*: Object to use as `this` when executing `predicate`.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing a single element with a number that represents how many elements in the input sequence satisfy the condition in the predicate function if provided, else the count of items in the sequence.\n\n#### Example\n```js\n/* Without a predicate */\nvar source = Rx.Observable.range(0, 10).count();\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 10\n// => Completed\n\n/* With a predicate */\nvar source = Rx.Observable.range(0, 10)\n    .count(function (x) { return x % 2 === 0; });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 5\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/count.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/count.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/count.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/count.js)\n"
  },
  {
    "path": "doc/api/core/operators/create.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.create(subscribe)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/create.js \"View in source\")\n\nCreates an observable sequence from a specified subscribe method implementation.  This is an alias for the `createWithDisposable` method\n\n#### Arguments\n1. `subscribe` *(`Function`)*: Implementation of the resulting observable sequence's subscribe method, optionally returning a function that will be wrapped in a disposable object.  This could also be a disposable object.\n\n#### Returns\n*(`Observable`)*: The observable sequence with the specified implementation for the subscribe method.\n\n#### Example\n```js\n/* Using a function */\nvar source = Rx.Observable.create(function (observer) {\n    observer.onNext(42);\n    observer.onCompleted();\n\n    // Note that this is optional, you do not have to return this if you require no cleanup\n    return function () {\n        console.log('disposed');\n    };\n});\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n// => Completed\n\nsubscription.dispose();\n\n// => disposed\n\n/* Using a disposable */\nvar source = Rx.Observable.create(function (observer) {\n    observer.onNext(42);\n    observer.onCompleted();\n\n    // Note that this is optional, you do not have to return this if you require no cleanup\n    return Rx.Disposable.create(function () {\n        console.log('disposed');\n    });\n});\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/create.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/create.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/create.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/create.js)\n"
  },
  {
    "path": "doc/api/core/operators/debounce.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.debounce(dueTime, [scheduler])` ###\n### `Rx.Observable.prototype.debounce(durationSelector)` ###\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/debounce.js \"View in source\")\n\nEmits an item from the source Observable after a particular timespan has passed without the Observable omitting any other items.\n\n--OR--\n\nIgnores values from an observable sequence which are followed by another value within a computed debounced duration.\n\n#### Arguments\n\nIf using a relative due time:\n1. `dueTime` *(`Number`)*: Duration of the throttle period for each value (specified as an integer denoting milliseconds).\n2. `[scheduler]` *(`Any`)*: Scheduler to run the throttle timers on. If not specified, the default scheduler is used.\n\nIf using the duration selector function:\n1. `durationSelector` *(`Function`)*: Selector function to retrieve a sequence indicating the throttle duration for each given element.\n\n#### Returns\n*(`Observable`)*: The debounced sequence.\n\n#### Example\n```js\nvar times = [\n    { value: 0, time: 100 },\n    { value: 1, time: 600 },\n    { value: 2, time: 400 },\n    { value: 3, time: 700 },\n    { value: 4, time: 200 }\n];\n\n// Delay each item by time and project value;\nvar source = Rx.Observable.from(times)\n  .flatMap(function (item) {\n    return Rx.Observable\n      .of(item.value)\n      .delay(item.time);\n  })\n  .debounce(500 /* ms */);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 3\n// => Completed\n\n/* Using Selector */\nvar array = [\n  800,\n  700,\n  600,\n  500\n];\n\nvar source = Rx.Observable.for(\n    array,\n    function (x) { return Rx.Observable.timer(x) }\n  )\n  .map(function(x, i) { return i; })\n  .debounce(function (x) { return Rx.Observable.timer(700); });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0\n// => Next: 3\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/debounce.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/debounce.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.time.js`\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n- [`RxJS-Time`](http://www.nuget.org/packages/RxJS-Time/)\n\nUnit Tests:\n- [`/tests/observable/debounce.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/debounce.js)\n"
  },
  {
    "path": "doc/api/core/operators/defaultifempty.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.defaultIfEmpty([defaultValue])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/defaultifempty.js \"View in source\")\n\nReturns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n\n#### Arguments\n1. `[defaultValue=null]` *(`Any`)*: The value to return if the sequence is empty. If not provided, this defaults to null.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n\n#### Example\n```js\n/* Without a default value */\nvar source = Rx.Observable.empty().defaultIfEmpty();\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: null\n// => Completed\n\n/* With a defaultValue */\nvar source = Rx.Observable.empty().defaultIfEmpty(false);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: false\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/defaultifempty.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/defaultifempty.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/defaultifempty.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/defaultifempty.js)\n"
  },
  {
    "path": "doc/api/core/operators/defer.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.defer(observableFactory)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/defer.js \"View in source\")\n\nReturns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n\n#### Arguments\n1. `observableFactory` *(`Function`)*: Observable factory function to invoke for each observer that subscribes to the resulting sequence.\n\n#### Returns\n*(`Observable`)*: An observable sequence whose observers trigger an invocation of the given observable factory function.\n\n#### Example\n```js\n/* Using an observable sequence */\nvar source = Rx.Observable.defer(function () {\n    return Rx.Observable.return(42);\n});\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n// => Completed\n\n/* Using a promise */\nvar source = Rx.Observable.defer(function () {\n    return RSVP.Promise.resolve(42);\n});\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/defer.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/defer.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/defer.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/defer.js)\n"
  },
  {
    "path": "doc/api/core/operators/delay.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.delay(dueTime, [scheduler])`\n### `Rx.Observable.prototype.delay([subscriptionDelay], delayDurationSelector`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/delay.js \"View in source\")\n\nTime shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n\n--OR--\n\nTime shifts the observable sequence based on a subscription delay and a delay selector function for each element.\n\n#### Arguments\n\nFor delays with an absolute or relative time:\n\n1. `dueTime` *(Date | Number)*: Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n2. `[scheduler]` *(`Scheduler`)*: Scheduler to run the delay timers on. If not specified, the default scheduler is used.\n\nFor delays with a delay selector function:\n\n1. `[subscriptionDelay]` *(`Observable`)*: Sequence indicating the delay for the subscription to the source.\n2. `delayDurationSelector` *(`Function`)*: Selector function to retrieve a sequence indicating the delay for each given element.\n\n#### Returns\n*(`Observable`)*: Time-shifted sequence.\n\n#### Example\n```js\n/* Using an absolute time to delay by a second */\nvar source = Rx.Observable.range(0, 3)\n  .delay(new Date(Date.now() + 1000));\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n// => Completed\n\n/* Using an relative time to delay by a second */\nvar source = Rx.Observable.range(0, 3)\n  .delay(1000);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n// => Completed\n\n/* With subscriptionDelay */\nvar source = Rx.Observable\n  .range(0, 3)\n  .delay(\n    Rx.Observable.timer(300),\n    function (x) { return Rx.Observable.timer(x * 400); }\n  )\n  .timeInterval()\n  .map(function (x) { return x.value + ':' + x.interval; });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n\n// => Next: 0:300\n// => Next: 1:400\n// => Next: 2:400\n// => Completed\n\n/* Without subscriptionDelay */\nvar source = Rx.Observable\n  .range(0, 3)\n  .delay(function (x) { return Rx.Observable.timer(x * 400); })\n  .timeInterval()\n  .map(function (x) { return x.value + ':' + x.interval; });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0:0\n// => Next: 1:400\n// => Next: 2:400\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/delay.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/delay.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n\nPrerequisites:\n- [`rx`](https://www.npmjs.org/package/rx).time.js\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | rx.lite.compat.js\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Time`](http://www.nuget.org/packages/RxJS-Time/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/delay.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/delay.js)\n"
  },
  {
    "path": "doc/api/core/operators/delaysubscription.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.delaySubscription(dueTime, [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/delaysubscription.js \"View in source\")\n\nTime shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n\nThis operator is more efficient than `delay` but postpones all side-effects of subscription and affects error propagation timing.\n\nThe side-effects of subscribing to the source sequence will be run on the specified scheduler. Observer callbacks will not be affected.\n\n#### Arguments\n1. `dueTime` *(`Number | Date`)*: Relative (Number) or Absolute (Date) time shift of the subscription.\n2. `[scheduler]` *(`Scheduler`)*: Scheduler to run the subscription delay timer on. If not specified, the default scheduler is used.\n\n#### Returns\n*(`Observable`)*: Time-shifted sequence.\n\n#### Example\n```js\nvar start = Date.now()\n\nvar source = Rx.Observable\n  .range(0, 3)\n  .delaySubscription(5000);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s, %s', x, Date.now() - start);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n//=> Next: 0, 5001\n//=> Next: 1, 5002\n//=> Next: 2, 5003\n//=> Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/delaysubscription.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/delaysubscription.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n\nPrerequisites:\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Time`](http://www.nuget.org/packages/RxJS-Time/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/delaysubscription.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/delaysubscription.js)\n"
  },
  {
    "path": "doc/api/core/operators/dematerialize.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.dematerialize()`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/dematerialize.js \"View in source\")\n\nDematerializes the explicit notification values of an observable sequence as implicit notifications.\n\n#### Returns\n*(`Observable`)*: An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n\n#### Example\n```js\nvar source = Rx.Observable\n  .from([\n    Rx.Notification.createOnNext(42),\n    Rx.Notification.createOnError(new Error('woops'))\n  ])\n  .dematerialize();\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// => Error: Error: woops\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/dematerialize.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/dematerialize.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/materialize.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/materialize.js)\n"
  },
  {
    "path": "doc/api/core/operators/distinct.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.distinct([keySelector], [comparer])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/distinct.js \"View in source\")\n\nReturns an observable sequence that contains only distinct elements according to the keySelector and the comparer. Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n\n#### Arguments\n1. `[keySelector]` *(`Function`)*: A function to compute the comparison key for each element.\n2. `[comparer]` *(`Function`)*: Used to compare objects for equality. If not provided, defaults to an equality comparer function.\n\n#### Returns\n*(`Observable`)*: An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n\n#### Example\n```js\n/* Without key selector */\nvar source = Rx.Observable.of(42, 24, 42, 24)\n  .distinct();\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// => Next: 24\n// => Completed\n\n/* With key selector */\nvar source = Rx.Observable.of({value: 42}, {value: 24}, {value: 42}, {value: 24})\n    .distinct(function (x) { return x.value; });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: { value: 42 }\n// => Next: { value: 24 }\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/distinct.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/distinct.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.extras.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.extras.js)\n- [`rx.lite.extras.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.extras.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/distinct.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/distinct.js)\n"
  },
  {
    "path": "doc/api/core/operators/distinctuntilchanged.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.distinctUntilChanged([keySelector], [comparer])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/distinctuntilchanged.js \"View in source\")\n\nReturns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.\n\n#### Arguments\n1. `[keySelector]` *(`Function`)*: A function to compute the comparison key for each element. If not provided, it projects the value.\n2. `[comparer]` *(`Function`)*: Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n\n#### Returns\n*(`Observable`)*: An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n\n#### Example\n```js\n/* Without key selector */\nvar source = Rx.Observable.of(42, 42, 24, 24)\n  .distinctUntilChanged();\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// => Next: 24\n// => Completed\n\n/* With key selector */\nvar source = Rx.Observable.of({value: 42}, {value: 42}, {value: 24}, {value: 24})\n  .distinctUntilChanged(function (x) { return x.value; });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: { value: 42 }\n// => Next: { value: 24 }\n// => Completed\n\n/* With comparer */\nvar source = Rx.Observable.of({value: 42}, {value: 42}, {value: 24}, {value: 24})\n  .distinctUntilChanged(function (x) { return x.value; }, function (a,b) { return a !== b; });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.dir('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: { value: 42 }\n// => Next: { value: 42 }\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/distinctuntilchanged.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/distinctuntilchanged.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/distinctuntilchanged.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/distinctuntilchanged.js)\n"
  },
  {
    "path": "doc/api/core/operators/do.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.do([observer] | [onNext], [onError], [onCompleted])` ###\n### `Rx.Observable.prototype.tap([observer] | [onNext], [onError], [onCompleted])` ###\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/tap.js \"View in source\")\n\nInvokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n\nThis method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n\nThere is an alias to this method `doAction` for browsers <IE9 and `tap` as well.\n\n#### Arguments\n1. `[observer]` *(Observer)*: An observer to invoke for each element in the observable sequence.\n1. `[onNext]` *(`Function`)*: Function to invoke for each element in the observable sequence.\n2. `[onError]` *(`Function`)*: Function to invoke upon exceptional termination of the observable sequence. Used if only the first parameter is also a function.\n3. `[oncompleted]` *(`Function`)*: Function to invoke upon graceful termination of the observable sequence. Used if only the first parameter is also a function.\n\n#### Returns\n*(`Observable`)*: The source sequence with the side-effecting behavior applied.\n\n#### Example\n```js\n/* Using a function */\nvar source = Rx.Observable.range(0, 3)\n  .do(\n    function (x)   { console.log('Do Next:', x); },\n    function (err) { console.log('Do Error:', err); },\n    function ()    { console.log('Do Completed'); }\n  );\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Do Next: 0\n// => Next: 0\n// => Do Next: 1\n// => Next: 1\n// => Do Next: 2\n// => Next: 2\n// => Do Completed\n// => Completed\n\n/* Using an observer */\nvar observer = Rx.Observer.create(\n  function (x) { console.log('Do Next: %s', x); },\n  function (err) { console.log('Do Error: %s', err); },\n  function () { console.log('Do Completed'); }\n);\n\nvar source = Rx.Observable.range(0, 3)\n    .do(observer);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Do Next: 0\n// => Next: 0\n// => Do Next: 1\n// => Next: 1\n// => Do Next: 2\n// => Next: 2\n// => Do Completed\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/perf/operators/tap.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/tap.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/do.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/do.js)\n"
  },
  {
    "path": "doc/api/core/operators/dooncompleted.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.doOnCompleted(onCompleted, [thisArg])`\n### `Rx.Observable.prototype.tapOnCompleted(onCompleted, [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/tap.js \"View in source\")\n\nInvokes an action upon graceful termination of the observable sequence.\n\nThis method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n\n#### Arguments\n1. `oncompleted` *(`Function`)*: Function to invoke upon graceful termination of the observable sequence.\n2. [`thisArg`] *(Any)*: Object to use as this when executing callback.\n\n#### Returns\n*(`Observable`)*: The source sequence with the side-effecting behavior applied.\n\n#### Example\n```js\n/* Using a function */\nvar source = Rx.Observable.range(0, 3)\n  .doOnCompleted(\n    function () { console.log('Do Completed'); }\n  );\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n// => Do Completed\n// => Completed\n\n/* Using a thisArg */\n\nvar source = Rx.Observable.range(0, 3)\n  .doOnCompleted(\n    function () { this.log('Do Completed'); },\n    console\n  );\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n// => Do Completed\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/perf/operators/tap.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/tap.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/do.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/do.js)\n"
  },
  {
    "path": "doc/api/core/operators/doonerror.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.doOnError(onError, [thisArg])`\n### `Rx.Observable.prototype.tapOnError(onError, [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/tap.js \"View in source\")\n\nInvokes an action upon exceptional termination of the observable sequence.\n\nThis method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n\n#### Arguments\n1. `onError` *(`Function`)*: Function to invoke upon exceptional termination of the observable sequence.\n2. [`thisArg`] *(Any)*: Object to use as this when executing callback.\n\n#### Returns\n*(`Observable`)*: The source sequence with the side-effecting behavior applied.\n\n#### Example\n```js\n/* Using a function */\nvar source = Rx.Observable.throw(new Error())\n  .doOnError(\n    function (err) { console.log('Do Error: %s', err); }\n  );\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Do Error: Error\n// => Error: Error\n\n/* Using a thisArg */\n\nvar source = Rx.Observable.throw(new Error())\n  .doOnError(\n    function (err) { this.log('Do Error: %s', err); },\n    console\n  );\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Do Error: Error\n// => Error: Error\n```\n### Location\n\nFile:\n- [`/src/core/perf/operators/tap.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/tap.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/do.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/do.js)\n"
  },
  {
    "path": "doc/api/core/operators/doonnext.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.doOnNext(onNext, [thisArg])`\n### `Rx.Observable.prototype.tapOnNext(onNext, [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/tap.js \"View in source\")\n\nInvokes an action for each element of the observable sequence.\n\nThis method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n\n#### Arguments\n1. `onNext` *(`Function`)*: Function to invoke for each element in the observable sequence.\n2. [`thisArg`] *(Any)*: Object to use as this when executing callback.\n\n#### Returns\n*(`Observable`)*: The source sequence with the side-effecting behavior applied.\n\n#### Example\n```js\n/* Using a function */\nvar source = Rx.Observable.range(0, 3)\n  .doOnNext(\n    function () { console.log('Do Next: %s', x); }\n  );\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Do Next: 0\n// => Next: 0\n// => Do Next: 1\n// => Next: 1\n// => Do Next: 2\n// => Next: 2\n// => Completed\n\n/* Using a thisArg */\n\nvar source = Rx.Observable.range(0, 3)\n  .doOnNext(\n    function () { this.log('Do Next: %s', x); },\n    console\n  );\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Do Next: 0\n// => Next: 0\n// => Do Next: 1\n// => Next: 1\n// => Do Next: 2\n// => Next: 2\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/perf/operators/tap.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/tap.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/do.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/do.js)\n"
  },
  {
    "path": "doc/api/core/operators/dowhile.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.doWhile(condition)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/dowhile.js \"View in source\")\n\nRepeats source as long as condition holds emulating a do while loop.\n\n#### Arguments\n1. `condition` *(`Function`)*: The condition which determines if the source will be repeated.\n\n#### Returns\n*(`Observable`)*: An observable sequence whose observers trigger an invocation of the given observable factory function.\n\n#### Example\n```js\nvar i = 0;\n\nvar source = Rx.Observable.return(42).doWhile(function (x) { return ++i < 2; });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// => Next: 42\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/dowhile.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/dowhile.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.experimental.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.experimental.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All)\n- [`RxJS-Experimental`](http://www.nuget.org/packages/RxJS-Experimental)\n\nUnit Tests:\n- [`/tests/observable/dowhile.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/dowhile.js)\n"
  },
  {
    "path": "doc/api/core/operators/elementat.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.elementAt(index, [defaultValue])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/elementat.js \"View in source\")\n\nReturns the element at a specified index in a sequence.  If the specified index is out of bounds and no default value was given `onError` will be called with an error, however, if a default value has been specified, that value will be returned via an `onNext` call.\n\n#### Arguments\n1. `index` *(`Number`)*: The zero-based index of the element to retrieve.\n2. `[defaultValue]` *(`Any`)*: Default value if no such element exists.\n\n#### Returns\n*(`Observable`)*: An observable sequence that produces the element at the specified position in the source sequence. If the specified index is out of bounds and no default value was given `onError` will be called with an error, however, if a default value has been specified, that value will be returned via an `onNext` call.\n\n#### Example\n```js\n/* Finds an index */\nvar source = Rx.Observable.from([1,2,3,4])\n    .elementAt(1);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 2\n// => Completed\n\n/* With default value */\nvar source = Rx.Observable.from([1,2,3,4])\n  .elementAt(4, 42);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/elementat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/elementat.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/elementat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/elementat.js)\n"
  },
  {
    "path": "doc/api/core/operators/empty.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.empty([scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/empty.js \"View in source\")\n\nReturns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n\n#### Arguments\n1. `[scheduler=Rx.Scheduler.immediate]` *(`Scheduler`)*: Scheduler to send the termination call on.\n\n#### Returns\n*(`Observable`)*: An observable sequence with no elements.\n\n#### Example\n```js\nvar source = Rx.Observable.empty();\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n  \n// => Completed\n```\n\n### Location\n\nFile:\n- [/src/core/perf/operators/empty.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/empty.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [/tests/observable/empty.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/empty.js)\n"
  },
  {
    "path": "doc/api/core/operators/every.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.every(predicate, [thisArg])` ##\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/every.js \"View in source\")\n\nDetermines whether all elements of an observable sequence satisfy a condition.\n\n#### Arguments\n1. `predicate` *(`Function`)*: A function to test each element for a condition.\n2. `[thisArg]` *(`Function`)*: Object to use as this when executing callback.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing a single element determining whether all elements in the source sequence pass the test in the specified predicate.\n\n#### Example\n```js\nvar source = Rx.Observable.of(1,2,3,4,5)\n  .every(function (x) {\n    return x < 6;\n  });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: true\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/every.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/every.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/every.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/every.js)\n"
  },
  {
    "path": "doc/api/core/operators/expand.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.expand(selector, [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/expand.js \"View in source\")\n\nExpands an observable sequence by recursively invoking selector.\n\n#### Arguments\n1. `selector` *(`Function`)*: Selector function to invoke for each produced element, resulting in another sequence to which the selector will be invoked recursively again.\n2. [`scheduler=Rx.Scheduler.immediate`] *(`Scheduler`)*: Scheduler on which to perform the expansion. If not provided, this defaults to the immediate scheduler.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing a single element determining whether all elements in the source sequence pass the test in the specified predicate.\n\n#### Example\n```js\nvar source = Rx.Observable.return(42)\n    .expand(function (x) { return Rx.Observable.return(42 + x); })\n    .take(5);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// => Next: 84\n// => Next: 126\n// => Next: 168\n// => Next: 210\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/expand.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/expand.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.experimental.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.experimental.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All)\n- [`RxJS-Experimental`](http://www.nuget.org/packages/RxJS-Experimental)\n\nUnit Tests:\n- [`/tests/observable/expand.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/expand.js)\n"
  },
  {
    "path": "doc/api/core/operators/finally.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.finally(action)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/finally.js \"View in source\")\n\nInvokes a specified action after the source observable sequence terminates gracefully or exceptionally.  There is an alias called `finallyAction` for browsers <IE9\n\n#### Arguments\n1. `action` *(`Function`)*: A function to invoke after the source observable sequence terminates.\n\n#### Returns\n*(`Observable`)*: The source sequence with the side-effecting behavior applied.\n\n#### Example\n```js\n/* Terminated by error still fires function */\nvar source = Rx.Observable.throw(new Error())\n  .finally(function () { console.log('Finally'); });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Error: Error\n// => Finally\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/finally.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/finally.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/finally.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/finally.js)\n"
  },
  {
    "path": "doc/api/core/operators/find.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.find(predicate, [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/find.js)\nSearches for an element that matches the conditions defined by the specified predicate, and returns the first occurrence within the entire Observable sequence.\n\n#### Arguments\n1. `predicate` *(`Function`)*: A function to test each source element for a condition;  The callback is called with the following information:\n    1. the value of the element\n    2. the index of the element\n    3. the Observable object being subscribed\n2. `[thisArg]` *(`Any`)*: Object to use as `this` when executing the predicate.\n\n#### Returns\n*(`Observable`)*: An Observable sequence with the first element that matches the conditions defined by the specified predicate, if found; otherwise, an empty sequence.\n\n#### Example\n```js\n/* Found an element */\nvar array = [1,2,3,4];\n\nvar source = Rx.Observable.from(array)\n  .find(function (x, i, obs) { return x === 1; });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 1\n// => Completed\n\n/* Not found */\nvar array = [1,2,3,4];\n\nvar source = Rx.Observable.from(array)\n  .find(function (x, i, obs) { return x === 5; });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/find.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/find.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/find.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/find.js)\n"
  },
  {
    "path": "doc/api/core/operators/findindex.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.findIndex(predicate, [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/findindex.js \"View in source\")\n\nSearches for an element that matches the conditions defined by the specified predicate, and returns the first occurrence within the entire Observable sequence.\n\n#### Arguments\n1. `predicate` *(`Function`)*: A function to test each source element for a condition;  The callback is called with the following information:\n    1. the value of the element\n    2. the index of the element\n    3. the Observable object being subscribed\n2. `[thisArg]` *(`Any`)*: Object to use as `this` when executing the predicate.\n\n#### Returns\n*(`Observable`)*: An Observable sequence with the first element that matches the conditions defined by the specified predicate, if found; otherwise, undefined.\n\n#### Example\n```js\n/* Found an element */\nvar array = [1,2,3,4];\n\nvar source = Rx.Observable.from(array)\n  .findIndex(function (x, i, obs) { return x === 1; });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0\n// => Completed\n\n/* Not found */\nvar array = [1,2,3,4];\n\nvar source = Rx.Observable.from(array)\n  .findIndex(function (x, i, obs) { return x === 5; });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: -1\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/findindex.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/findindex.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/findindex.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/findindex.js)\n"
  },
  {
    "path": "doc/api/core/operators/first.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.first([predicate], [thisArg], [defaultValue])`\n### `Rx.Observable.prototype.first([settings])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/first.js \"View in source\")\n\nReturns the first element of an observable sequence that satisfies the condition in the predicate, or a default value if no such element exists.  If no default value is given, then `onError` will be called.\n\n#### Arguments\n\n`Rx.Observable.prototype.first([predicate], [thisArg], [defaultValue])`\n\n1. `[predicate]` *(`Function`)*: A predicate function to evaluate for elements in the source sequence. The callback is called with the following information:\n    1. the value of the element\n    2. the index of the element\n    3. the Observable object being subscribed\n2. `[thisArg]` *(`Any`)*: Object to use as `this` when executing the predicate.\n3. `[defaultValue]` *(`Any`)*: Default value if no such element exists.\n\n`Rx.Observable.prototype.first([settings])`\n1. `[settings]` *(`Object`)*: An object with the following fields\n    - `[predicate]` *(`Function`)*: A predicate function to evaluate for elements in the source sequence. The callback is called with the following information:\n        1. the value of the element\n        2. the index of the element\n        3. the Observable object being subscribed\n    - `[thisArg]` *(`Any`)*: Object to use as `this` when executing the predicate.\n    - `[defaultValue]` *(`Any`)*: Default value if no such element exists.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains elements from the input sequence that satisfy the condition.\n\n#### Example\n```js\n/* Without a predicate */\nvar source = Rx.Observable.range(0, 10).first();\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0\n// => Completed\n\n/* With a predicate */\nvar source = Rx.Observable.range(0, 10)\n  .first(function (x, idx, obs) { return x % 2 === 1; });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 1\n// => Completed\n\n/* With a default value */\nvar source = Rx.Observable.range(0, 10)\n  .first({\n    predicate: function (x, idx, obs) { return x > 10; },\n    defaultValue: 42\n  });\n\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/first.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/first.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/first.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/first.js)\n"
  },
  {
    "path": "doc/api/core/operators/flatmapfirst.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.flatMapFirst(selector, [thisArg])`\n### `Rx.Observable.prototype.selectSwitchFirst(selector, [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/flatmapfirst.js \"View in source\")\n\nTransform the items emitted by an Observable into Observables, and mirror those items emitted by the most-recently transformed Observable.\n\nThe `flatMapFirst` operator is similar to the `flatMap` and `concatMap` methods described above, however, rather than emitting all of the items emitted by all of the Observables that the operator generates by transforming items from the source `Observable`, `flatMapFirst` instead propagates the first `Observable` exclusively until it completes before it begins subscribes to the next `Observable`.  Observables that come before the current `Observable` completes will be dropped and will not propagate.\n\n#### Arguments\n1. `selector` *(`Function`)*:  A transform function to apply to each source element.  The callback has the following information:\n    1. the value of the element\n    2. the index of the element\n    3. the Observable object being subscribed\n2. `[thisArg]` *(`Any`)*: Object to use as `this` when executing the predicate.\n\n#### Returns\n*(`Observable`)*: An Observable sequence that is the result of concatenating non-overlapping items emitted by an Observable of Observables.\n\n#### Example\n```js\n//Generate an event every 100 milliseconds\nvar source = Rx.Observable.generateWithRelativeTime(\n   0,\n   function(x) {return x < 5; },\n   function(x) {return x + 1; },\n   function(x) {return x; },\n   function(x) {return 100; })\n  .flatMapFirst(function(value) {\n    //Observable takes 150 milliseconds to complete\n    return Rx.Observable.timer(150).map(value);\n  });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %d', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// Next: 0\n// Next: 2\n// Next: 4\n// Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/flatmapfirst.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/flatmapfirst.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.experimental.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.experimental.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Experimental`](http://www.nuget.org/packages/RxJS-Experimental/)\n\nUnit Tests:\n- None\n"
  },
  {
    "path": "doc/api/core/operators/flatmaplatest.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.flatMapLatest(selector, [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/flatmaplatest.js \"View in source\")\n\nTransform the items emitted by an Observable into Observables, and mirror those items emitted by the most-recently transformed Observable.\n\nThe `flatMapLatest` operator is similar to the `flatMap` and `concatMap` methods described above, however, rather than emitting all of the items emitted by all of the Observables that the operator generates by transforming items from the source `Observable`, `flatMapLatest` instead emits items from each such transformed `Observable` only until the next such `Observable` is emitted, then it ignores the previous one and begins emitting items emitted by the new one.\n\n#### Arguments\n1. `selector` *(`Function`)*:  A transform function to apply to each source element.  The callback has the following information:\n    1. the value of the element\n    2. the index of the element\n    3. the Observable object being subscribed\n2. `[thisArg]` *(`Any`)*: Object to use as `this` when executing the predicate.\n\n#### Returns\n*(`Observable`)*: An observable sequence which transforms the items emitted by an Observable into Observables, and mirror those items emitted by the most-recently transformed Observable.\n\n#### Example\n```js\nvar source = Rx.Observable\n  .range(1, 3)\n  .flatMapLatest(function(x) {\n    return Rx.Observable.from([x + 'a', x + 'b']);\n  });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// Next: 1a\n// Next: 2a\n// Next: 3a\n// Next: 3b\n// Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/flatmaplatest.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/flatmaplatest.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- None\n"
  },
  {
    "path": "doc/api/core/operators/flatmapobserver.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.flatMapObserver(onNext, onError, onCompleted, [thisArg])`\n### `Rx.Observable.prototype.selectManyObserver(onNext, onError, onCompleted, [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/selectmanyobserver.js \"View in source\")\n\nProjects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n\n#### Arguments\n1. `onNext` *(`Function`)*:  A transform function to apply to each element. The selector is called with the following information:\n    1. the value of the element\n    2. the index of the element\n2. `onError` *(`Function`)*: A transform function to apply when an error occurs in the source sequence.\n3. `onCompleted` *(`Function`)*: A transform function to apply when the end of the source sequence is reached.\n4. `[thisArg]` *(`Any`)*: Object to use as `this` when executing the transform functions.\n\n#### Returns\n*(`Observable`)*: An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n\n#### Example\n```js\nvar source = Rx.Observable.range(1, 3)\n    .flatMapObserver(\n        function (x, i) {\n            return Rx.Observable.repeat(x, i);\n        },\n        function (err) {\n            return Rx.Observable.return(42);\n        },\n        function () {\n            return Rx.Observable.empty();\n        });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 2\n// => Next: 3\n// => Next: 3\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/selectmanyobserver.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/selectmanyobserver.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n\nUnit Tests:\n- [`/tests/observable/selectmanyobserver.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/selectmanyobserver.js)\n"
  },
  {
    "path": "doc/api/core/operators/flatmapwithmaxconcurrent.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.flatMapWithMaxConcurrent(maxConcurrent, selector, [resultSelector], [thisArg])`\n### `Rx.Observable.prototype.selectWithMaxConcurrent(maxConcurrent, selector, [resultSelector], [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/flatmapwithmaxconcurrent.js \"View in source\")\n\nThis is an alias for the `selectWithMaxConcurrent` method.  This can be one of the following:\n\nProjects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence with the given concurrency limit.\n\n```js\nsource.flatMapWithMaxConcurrent(10, function (x, i) { return Rx.Observable.range(0, x); });\nsource.flatMapWithMaxConcurrent(1, function (x, i) { return Promise.resolve(x + 1); });\nsource.flatMapWithMaxConcurrent(1, function (x, i) { return [x, i]; });\n```\n\nProjects each element of an observable sequence or Promise to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence with the given concurrency limit.\n\n```js\nsource.flatMapWithMaxConcurrent(10, function (x, i) { return Rx.Observable.range(0, x); }, function (x, y, ix, iy) { return x + y + ix + iy; });\nsource.flatMapWithMaxConcurrent(1, function (x, i) { return Promise.resolve(x + i); }, function (x, y, ix, iy) { return x + y + ix + iy; });\nsource.flatMapWithMaxConcurrent(1, function (x, i) { return [x, i];  }, function (x, y, ix, iy) { return x + y + ix + iy; });\n```\n\nProjects each element of the source observable sequence to the other observable sequence or Promise or array/iterable and merges the resulting observable sequences into one observable sequence with the given max concurrency limit.\n\n ```js\nsource.flatMapWithMaxConcurrent(1, Rx.Observable.of(1,2,3));\nsource.flatMapWithMaxConcurrent(1, Promise.resolve(42));\nsource.flatMapWithMaxConcurrent(1, [1,2,3]);\n ```\n\n#### Arguments\n1. `maxConcurrent` *(`Number`)*: Maximum number of inner observable sequences being subscribed to concurrently.\n2. `selector` *(`Function` | `Iterable` | `Promise`)*:  An Object to project to the sequence or a transform function to apply to each element or an observable sequence to project each element from the source sequence onto.  The selector is called with the following information:\n    1. the value of the element\n    2. the index of the element\n    3. the Observable object being subscribed\n\n3. `[resultSelector]` *(`Function`)*: A transform function to apply to each element of the intermediate sequence.  The resultSelector is called with the following information:\n    1. the value of the outer element\n    2. the value of the inner element\n    3. the index of the outer element\n    4. the index of the inner element\n\n4. `[thisArg]` *(`Any`)*: If `resultSelector` is not `Function`, Object to use as `this` when executing `selector`.\n\n#### Returns\n*(`Observable`)*: An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n\n#### Example\n```js\nvar source = Rx.Observable.range(0, 5)\n  .flatMapWithMaxConcurrent(2, function (x, i) {\n    return Rx.Observable\n      .interval(100)\n      .take(x).map(function() { return i; });\n  });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 1\n// => Next: 2\n// => Next: 3\n// => Next: 2\n// => Next: 3\n// => Next: 4\n// => Next: 3\n// => Next: 4\n// => Next: 4\n// => Next: 4\n// => Completed\n\n/* Using a promise */\nvar source = Rx.Observable.of(1,2,3,4)\n  .flatMapWithMaxConcurrent(1, function (x, i) {\n    return Promise.resolve(x + i);\n  });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 1\n// => Next: 3\n// => Next: 5\n// => Next: 7\n// => Completed\n\n/* Using an array */\nvar source = Rx.Observable.of(1,2,3)\n  .flatMapWithMaxConcurrent(\n    1,\n    function (x, i) { return [x,i]; },\n    function (x, y, ix, iy) { return x + y + ix + iy; }\n  );\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 2\n// => Next: 2\n// => Next: 5\n// => Next: 5\n// => Next: 8\n// => Next: 8\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/flatmapwithmaxconcurrent.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/flatmapwithmaxconcurrent.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.experimental.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.experimental.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete/)\n- [`RxJS-Experimental`](http://www.nuget.org/packages/RxJS-Experimental/)\n\nUnit Tests:\n- None\n"
  },
  {
    "path": "doc/api/core/operators/for.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.for(sources, resultSelector, [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/for.js \"View in source\")\n\nConcatenates the observable sequences or Promises obtained by running the specified result selector for each element in source.\nThere is an alias for this method called `forIn` for browsers <IE9\n\n#### Arguments\n1. `sources` *(Array)*: An array of values to turn into an observable sequence.\n2. `resultSelector` *(`Function`)*: A function to apply to each item in the sources array to turn it into an observable sequence. The resultSelector is called with the following information:\n    1. the value of the element\n    2. the index of the element\n    3. the Observable object being subscribed\n\n3. `[thisArg]` *(`Any`)*: Object to use as `this` when executing `resultSelector`.\n\n#### Returns\n*(`Observable`)*: An observable sequence from the concatenated observable sequences or Promises.\n\n#### Example\n```js\n/* Using Observables */\nvar array = [1, 2, 3];\n\nvar source = Rx.Observable.for(\n    array,\n    function (x) {\n        return Rx.Observable.return(x);\n    });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 1\n// => Next: 2\n// => Next: 3\n// => Completed\n\n/* Using Promises */\nvar array = [1, 2, 3];\n\nvar source = Rx.Observable.for(\n    array,\n    function (x) {\n        return RSVP.Promise.resolve(x);\n    });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 1\n// => Next: 2\n// => Next: 3\n// => Completed\n```\n\n### Location\n\nFile:\n- [/src/core/linq/observable/for.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/for.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.experimental.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.experimental.js)\n\nPrerequisites:\n- If using `rx.experimental.js`\n  - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Experimental`](http://www.nuget.org/packages/RxJS-Experimental)\n\nUnit Tests:\n- [`/tests/observable/for.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/for.js)\n"
  },
  {
    "path": "doc/api/core/operators/forkjoin.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.forkJoin(...args, [resultSelector])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/forkjoin.js \"View in source\")\n\nRuns all observable sequences in parallel and collect their last elements.\n\n#### Arguments\n1. `args` *(Arguments | Array)*: An array or arguments of Observable sequences or Promises to collect the last elements for.\n2. `resultSelector`: `Function` - The result selector from all the values produced. If not specified, `forkJoin` will return the results as an array.\n\n#### Returns\n*(`Observable`)*: An observable sequence with an array collecting the last elements of all the input sequences or the result of the result selector if specified.\n\n#### Example\n```js\n/* Without a selector */\nvar source = Rx.Observable.forkJoin(\n  Rx.Observable.return(42),\n  Rx.Observable.range(0, 10),\n  Rx.Observable.from([1,2,3]),\n  RSVP.Promise.resolve(56)\n);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: [42, 9, 3, 56]\n// => Completed\n\nvar source = Rx.Observable.forkJoin(\n  Rx.Observable.just(42),\n  Rx.Observable.just(56),\n  function (x, y) { return x + y; }\n);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 98\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/forkjoin.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/forkjoin.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.experimental.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.experimental.js)\n\nPrerequisites:\n- If using `rx.experimental.js` - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Experimental`](http://www.nuget.org/packages/RxJS-Experimental)\n\nUnit Tests:\n- [`/tests/observable/forkjoin.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/forkjoin.js)\n"
  },
  {
    "path": "doc/api/core/operators/forkjoinproto.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.forkJoin(...args, [resultSelector])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/forkjoinproto.js \"View in source\")\n\nRuns all observable sequences in parallel and collect their last elements.\n\n#### Arguments\n1. `args`: `Arguments` | `Array` - An array or arguments of Observable sequences or Promises to collect the last elements for.\n2. `resultSelector`: `Function` - The result selector from all the values produced. If not specified, `forkJoin` will return the results as an array.\n\n#### Returns\n*(`Observable`)*: An observable sequence with an array collecting the last elements of all the input sequences or the result of the result selector if specified.\n\n#### Example\n```js\n// With a selector\nvar source = Rx.Observable.just(42).forkJoin(\n  Rx.Observable.range(0, 3),\n  function (s1, s2) { return s1 + s2; });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 44\n// => Completed\n\n// Without a selector\nvar source = Rx.Observable.just(42).forkJoin(\n  Rx.Observable.range(0, 3));\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: [42, 2]\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/forkjoinproto.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/forkjoinproto.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.experimental.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.experimental.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All)\n- [`RxJS-Experimental`](http://www.nuget.org/packages/RxJS-Experimental)\n\nUnit Tests:\n- [`/tests/observable/forkjoin.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/forkjoin.js)\n"
  },
  {
    "path": "doc/api/core/operators/from.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.from(iterable, [mapFn], [thisArg], [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/from.js 'View in source')\n\nThis method creates a new Observable sequence from an array-like or iterable object.\n\n#### Arguments\n1. `iterable` *(`Array` | `Arguments` | `Iterable`)*: An array-like or iterable object to convert to an Observable sequence.\n2. `[mapFn]` *(`Function`)*: Map function to call on every element of the array.\n3. `[thisArg]` *(`Any`)*: The context to use calling the mapFn if provided.\n4. `[scheduler=Rx.Scheduler.currentThread]` *(`Scheduler`)*: Scheduler to run the enumeration of the input sequence on.\n\n#### Returns\n*(`Observable`)*: The observable sequence whose elements are pulled from the given iterable sequence.\n\n#### Example\n```js\n// Array-like object (arguments) to Observable\nfunction f() {\n  return Rx.Observable.from(arguments);\n}\n\nf(1, 2, 3).subscribe(\n  function (x) {\n    console.log('Next: ' + x);\n  },\n  function (err) {\n    console.log('Error: ' + err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 1\n// => Next: 2\n// => Next: 3\n// => Completed\n\n// Any iterable object...\n// Set\nvar s = new Set(['foo', window]);\nRx.Observable.from(s).subscribe(\n  function (x) {\n    console.log('Next: ' + x);\n  },\n  function (err) {\n    console.log('Error: ' + err);\n  },\n  function () {\n    console.log('Completed');\n  });\n// => Next: foo\n// => Next: window\n// => Completed\n\n// Map\nvar m = new Map([[1, 2], [2, 4], [4, 8]]);\nRx.Observable.from(m).subscribe(\n  function (x) {\n    console.log('Next: ' + x);\n  },\n  function (err) {\n    console.log('Error: ' + err);\n  },\n  function () {\n    console.log('Completed');\n  });\n// => Next: [1, 2]\n// => Next: [2, 4]\n// => Next: [4, 8]\n// => Completed\n\n// String\nRx.Observable.from('foo').subscribe(\n  function (x) {\n    console.log('Next: ' + x);\n  },\n  function (err) {\n    console.log('Error: ' + err);\n  },\n  function () {\n    console.log('Completed');\n  });\n// => Next: f\n// => Next: o\n// => Next: o\n// => Completed\n\n// Using an arrow function as the map function to\n// manipulate the elements\nRx.Observable.from([1, 2, 3], function (x) { return x + x; }).subscribe(\n  function (x) {\n    console.log('Next: ' + x);\n  },\n  function (err) {\n    console.log('Error: ' + err);\n  },\n  function () {\n    console.log('Completed');\n  });\n// => Next: 2\n// => Next: 4\n// => Next: 6\n// => Completed\n\n// Generate a sequence of numbers\nRx.Observable.from({length: 5}, function(v, k) { return k; }).subscribe(\n  function (x) {\n    console.log('Next: ' + x);\n  },\n  function (err) {\n    console.log('Error: ' + err);\n  },\n  function () {\n    console.log('Completed');\n  });\n// => Next: 0\n// => Next: 1\n// => Next: 2\n// => Next: 3\n// => Next: 4\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/from.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/from.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/from.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/from.js)\n"
  },
  {
    "path": "doc/api/core/operators/fromarray.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### ** DEPRECATED - Use [Rx.Observable.from](./from.md) instead** `Rx.Observable.fromArray(array, [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/fromarray.js \"View in source\")\n\nConverts an array to an observable sequence, using an optional scheduler to enumerate the array.\n\n#### Arguments\n1. `array` *(Array)*: An array to convert to an Observable sequence.\n2. `[scheduler=Rx.Scheduler.currentThread]` *(`Scheduler`)*: Scheduler to run the enumeration of the input sequence on.\n\n#### Returns\n*(`Observable`)*: The observable sequence whose elements are pulled from the given enumerable sequence.\n\n#### Example\n```js\nvar array = [1,2,3];\n\nvar source = Rx.Observable.fromArray(array);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 1\n// => Next: 2\n// => Next: 3\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/fromarray.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/fromarray.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/fromarray.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/fromarray.js)\n"
  },
  {
    "path": "doc/api/core/operators/fromcallback.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.fromCallback(func, [context], [selector])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/fromcallback.js \"View in source\")\n\nConverts a callback function to an observable sequence.\n\n#### Arguments\n1. `func` *(`Function`)*: Function with a callback as the last parameter to convert to an Observable sequence.\n2. `[context]` *(`Any`)*: The context for the func parameter to be executed.  If not specified, defaults to undefined.\n3. `[selector]` *(`Function`)*: A selector which takes the arguments from the callback to produce a single item to yield on next.\n\n#### Returns\n*(`Function`)*: A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array if no selector given, else the object created by the selector function.\n\n#### Example\n```js\nvar fs = require('fs'),\n    Rx = require('rx');\n\n// Wrap fs.exists\nvar exists = Rx.Observable.fromCallback(fs.exists);\n\n// Check if file.txt exists\nvar source = exists('file.txt');\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: true\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/fromcallback.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/fromcallback.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.async.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.js)\n- [`rx.async.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.async.js` | `rx.async.compat.js`\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n    - [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Async`](http://www.nuget.org/packages/RxJS-Async)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [/tests/observable/fromcallback.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/fromcallback.js)\n"
  },
  {
    "path": "doc/api/core/operators/fromevent.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.fromEvent(element, eventName, [selector], [options])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/fromevent.js \"View in source\")\n\nCreates an observable sequence by adding an event listener to the matching DOMElement, jQuery element, Zepto Element, Angular element, Ember.js element or EventEmitter.\n\nNote that this uses the library approaches for jQuery, Zepto, Backbone.Marionette, AngularJS and Ember.js and falls back to native binding if not present. If you are using AMD you may need to include these libraries as dependencies of RxJs in your requirejs configuration file. RxJs will attempt to detect their presence when deciding which library to use.\n\n#### Arguments\n1. `element` *(`Any`)*: The DOMElement, NodeList, jQuery element, Zepto Element, Angular element, Ember.js element or EventEmitter to attach a listener. For Backbone.Marionette this would be the application or an EventAggregator object.\n2. `eventName` *(`String`)*: The event name to attach the observable sequence.\n3. `[selector]` *(`Function`)*: A selector which takes the arguments from the event emitter so that you can return a single object.\n4. `[options]` *( `Object` )* An object of event listener options.\n\n#### Returns\n*(`Observable`)*: An observable sequence of events from the specified element and the specified event.\n\n#### Example\n\nWrapping an event from [jQuery](http://jquery.com)\n\n```js\nvar input = $('#input');\n\nvar source = Rx.Observable.fromEvent(input, 'click');\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: Clicked!');\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\ninput.trigger('click');\n\n// => Next: Clicked!\n```\n\n\nUsing in Node.js with using an `EventEmitter` with a selector function (which is not required).\n\n```js\nvar EventEmitter = require('events').EventEmitter,\n    Rx = require('rx');\n\nvar eventEmitter = new EventEmitter();\n\nvar source = Rx.Observable.fromEvent(\n  eventEmitter,\n  'data',\n  function (foo, bar) { return { foo: foo, bar: bar }; });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: foo -' + x.foo + ', bar -' + x.bar);\n  },\n  function (err) {\n    console.log('Error: ' + err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\neventEmitter.emit('data', 'baz', 'quux');\n// => Next: foo - baz, bar - quux\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/fromevent.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/fromevent.js)\n\nDist:\n- [`rx.async.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.js)\n- [`rx.async.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using [`rx.async.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.js) | [`rx.async.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.compat.js)\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n    - [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Async`](http://www.nuget.org/packages/RxJS-Async)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/fromevent.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/fromevent.js)\n"
  },
  {
    "path": "doc/api/core/operators/fromeventpattern.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.fromEventPattern(addHandler, [removeHandler], [selector])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/fromeventpattern.js \"View in source\")\n\nCreates an observable sequence by using the addHandler and removeHandler functions to add and remove the handlers, with an optional selector function to project the event arguments.\n\n#### Arguments\n1. `addHandler` *(`Function`)*: The DOMElement, NodeList or EventEmitter to attach a listener.\n2. `[removeHandler]` *(`Function`)*: The optional function to remove a handler from an emitter.\n3. `[selector]` *(`Function`)*: A selector which takes the arguments from the event handler to produce a single item to yield on next.\n\n#### Returns\n*(`Observable`)*: An observable sequence of events from the specified element and the specified event.\n\n#### Example\n\nWrapping an event from [jQuery](http://jquery.com)\n\n```js\nvar input = $('#input');\n\nvar source = Rx.Observable.fromEventPattern(\n  function add (h) {\n    input.bind('click', h);\n  },\n  function remove (h) {\n    input.unbind('click', h);\n  }\n);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: Clicked!');\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\ninput.trigger('click');\n\n// => Next: Clicked!\n```\n\nWrapping an event from the [Dojo Toolkit](http://dojotoolkit.org)\n\n```js\nrequire(['dojo/on', 'dojo/dom', 'rx', 'rx.async', 'rx.binding'], function (on, dom, rx) {\n\n  var input = dom.byId('input');\n\n  var source = Rx.Observable.fromEventPattern(\n    function add (h) {\n      return on(input, 'click', h);\n    },\n    function remove (_, signal) {\n      signal.remove();\n    }\n  );\n\n  var subscription = source.subscribe(\n    function (x) {\n      console.log('Next: Clicked!');\n    },\n    function (err) {\n      console.log('Error: ' + err);\n    },\n    function () {\n      console.log('Completed');\n    });\n\n  on.emit(input, 'click');\n  // => Next: Clicked!\n});\n```\n\nUsing in Node.js with using an `EventEmitter`.\n\n```js\nvar EventEmitter = require('events').EventEmitter,\n    Rx = require('rx');\n\nvar e = new EventEmitter();\n\n// Wrap EventEmitter\nvar source = Rx.Observable.fromEventPattern(\n  function add (h) {\n    e.addListener('data', h);\n  },\n  function remove (h) {\n    e.removeListener('data', h);\n  },\n  function (foo, bar) {\n    return foo + ',' + bar;\n  }\n);\n\nvar subscription = source.subscribe(\n  function (result) {\n    console.log('Next: %s', result);\n  },\n  function (err) {\n    console.log('Error: ' + err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\ne.emit('data', 'foo', 'bar');\n// => Next: foo,bar\n```\n\n### Location\n\nFile:\n- [/src/core/linq/observable/fromeventpattern.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/fromeventpattern.js)\n\nDist:\n- [`rx.async.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.js)\n- [`rx.async.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using rx.async.js | rx.async.compat.js\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n    - [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n- [`rx`](https://www.npmjs.org/package/rx).lite.js | rx.lite.compat.js\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Async`](http://www.nuget.org/packages/RxJS-Async)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [/tests/observable/fromeventpattern.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/fromeventpattern.js)\n"
  },
  {
    "path": "doc/api/core/operators/fromnodecallback.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.fromNodeCallback(func, [context], [selector])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/fromnodecallback.js \"View in source\")\n\nConverts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n\n#### Arguments\n1. `func` *(`Function`)*: Function with a callback as the last parameter to convert to an Observable sequence.\n2. `[context]` *(`Any`)*: The context for the func parameter to be executed.  If not specified, defaults to undefined.\n3. `[selector]` *(`Function`)*: A selector which takes the arguments from callback sans the error to produce a single item to yield on next.\n\n#### Returns\n*(`Function`)*: A function which when applied, returns an observable sequence with the callback arguments as an array if no selector given, else the object created by the selector function on success, or an error if the first parameter is not falsy.\n\n#### Example\n```js\nvar fs = require('fs'),\n    Rx = require('rx');\n\n// Wrap fs.rename\nvar rename = Rx.Observable.fromNodeCallback(fs.rename);\n\n// Rename file which returns no parameters except an error\nvar source = rename('file1.txt', 'file2.txt');\n\nvar subscription = source.subscribe(\n    function () {\n        console.log('Next: success!');\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: success!\n// => Completed\n```\n\n### Location\n\nFile:\n- [/src/core/perf/operators/fromnodecallback.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/fromnodecallback.js)\n\nDist:\n- [`rx.async.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.js)\n- [`rx.async.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.async.js` | `rx.async.compat.js`\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n    - [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n- [`rx`](https://www.npmjs.org/package/rx).lite.js | rx.lite.compat.js\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Async`](http://www.nuget.org/packages/RxJS-Async)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [/tests/observable/fromnodecallback.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/fromnodecallback.js)\n"
  },
  {
    "path": "doc/api/core/operators/frompromise.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.fromPromise(promise)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/frompromise.js \"View in source\")\n\nConverts a Promises/A+ spec compliant Promise and/or ES2015 compliant Promise or a factory function which returns said Promise to an Observable sequence.\n\n#### Arguments\n1. `promise|Function`: `Promise` - Promises/A+ spec compliant Promise to an Observable sequence or a function which returns a Promise.\n\n#### Returns\n`Observable`: An Observable sequence which wraps the existing promise success and failure.\n\n#### Example\n```js\n// Create a factory function which returns a promise\nvar promiseFn = function () { return Promise.resolve(42); };\n\nvar source = Rx.Observable.fromPromise(promiseFn);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// Create a promise which resolves 42\nvar promise1 = Promise.resolve(42)\n\nvar source1 = Rx.Observable.fromPromise(promise1);\n\nvar subscription1 = source1.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// => Completed\n\n// Create a promise which rejects with an error\nvar promise2 = Promise.reject(new Error('reason'));\n\nvar source2 = Rx.Observable.fromPromise(promise2);\n\nvar subscription2 = source2.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Error: Error: reject\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/frompromise.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/frompromise.js)\n\nDist:\n- [`rx.async.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.js)\n- [`rx.async.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.async.js` | `rx.async.compat.js`\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n    - [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Async`](http://www.nuget.org/packages/RxJS-Async)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/frompromise.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/frompromise.js)\n"
  },
  {
    "path": "doc/api/core/operators/generate.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.generate(initialState, condition, iterate, resultSelector, [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/generate.js \"View in source\")\n\nGenerates an observable sequence in a manner similar to a for loop, using an optional scheduler to enumerate the values.\n\n#### Arguments\n1. `initialState` *(`Any`)*: Initial state.\n2. `condition` *(`Function`)*: Condition to terminate generation (upon returning false).\n3. `iterate` *(`Function`)*: Iteration step function.\n4. `resultSelector` *(`Function`)*: Selector function for results produced in the sequence.\n5. `[scheduler=Rx.Scheduler.currentThread]` *(`Scheduler`)*: Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n\n#### Returns\n*(`Observable`)*: The generated sequence.\n\n#### Example\n```js\nvar source = Rx.Observable.generate(\n    0,\n    function (x) { return x < 3; },\n    function (x) { return x + 1; },\n    function (x) { return x; }\n);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n// => Completed\n```\n\n### Location\n\nFile:\n- [/src/core/linq/observable/generate.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/generate.js)\n\nDist:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.lite.extras.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.extras.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [/tests/observable/generate.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/generate.js)\n"
  },
  {
    "path": "doc/api/core/operators/generatewithabsolutetime.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.generateWithAbsoluteTime(initialState, condition, iterate, resultSelector, timeSelector, [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/generatewithabsolutetime.js \"View in source\")\n\nGenerates an observable sequence by iterating a state from an initial state until the condition fails.\n\n#### Arguments\n1. `initialState` *(`Any`)*: Initial state.\n2. `condition` *(`Function`)*: Condition to terminate generation (upon returning false).\n3. `iterate` *(`Function`)*: Iteration step function.\n4. `resultSelector` *(`Function`)*: Selector function for results produced in the sequence.\n5. `timeSelector` *(`Function`)*: Time selector function to control the speed of values being produced each iteration, returning Date values.\n6. `[scheduler=Rx.Scheduler.timeout]` *(`Scheduler`)*: Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.timeout.\n\n#### Returns\n*(`Observable`)*: The generated sequence.\n\n#### Example\n```js\n// Generate a value with an absolute time with an offset of 100ms multipled by value\nvar source = Rx.Observable.generate(\n    1,\n    function (x) { return x < 4; },\n    function (x) { return x + 1; },\n    function (x) { return x; },\n    function (x) { return Date.now() + (100 * x); }\n).timeInterval();\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: {value: 1, interval: 100}\n// => Next: {value: 2, interval: 200}\n// => Next: {value: 3, interval: 300}\n// => Completed\n```\n\n### Location\n\nFile:\n- [/src/core/linq/observable/generatewithabsolutetime.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/generatewithabsolutetime.js)\n\nDist:\n- [rx.time.js](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n\nPrerequisites:\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](https://www.npmjs.org/package/RxJS-All)\n- [`RxJS-Time`](https://www.npmjs.org/package/RxJS-Time)\n\nUnit Tests:\n- [/tests/observable/generatewithabsolutetime.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/generatewithabsolutetime.js)\n"
  },
  {
    "path": "doc/api/core/operators/generatewithrelativetime.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.generateWithRelativeTime(initialState, condition, iterate, resultSelector, timeSelector, [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/generatewithrelativetime.js \"View in source\")\n\nGenerates an observable sequence by iterating a state from an initial state until the condition fails.\n\n#### Arguments\n1. `initialState` *(`Any`)*: Initial state.\n2. `condition` *(`Function`)*: Condition to terminate generation (upon returning false).\n3. `iterate` *(`Function`)*: Iteration step function.\n4. `resultSelector` *(`Function`)*: Selector function for results produced in the sequence.\n5. `timeSelector` *(`Function`)*: Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds.\n6. `[scheduler=Rx.Scheduler.timeout]` *(`Scheduler`)*: Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.timeout.\n\n#### Returns\n*(`Observable`)*: The generated sequence.\n\n#### Example\n```js\n// Generate a value with an absolute time with an offset of 100ms multipled by value\nvar source = Rx.Observable.generateWithRelativeTime(\n    1,\n    function (x) { return x < 4; },\n    function (x) { return x + 1; },\n    function (x) { return x; },\n    function (x) { return 100 * x; }\n).timeInterval();\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: {value: 1, interval: 100}\n// => Next: {value: 2, interval: 200}\n// => Next: {value: 3, interval: 300}\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/generatewithrelativetime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/generatewithrelativetime.js)\n\nDist:\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n\nPrerequisites:\n- if `rx.time.js`\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](https://www.npmjs.org/package/RxJS-All)\n- [`RxJS-Time`](https://www.npmjs.org/package/RxJS-Time)\n\nUnit Tests:\n- [/tests/observable/generatewithrelativetime.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/generatewithrelativetime.js)\n"
  },
  {
    "path": "doc/api/core/operators/groupby.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.groupBy(keySelector, [elementSelector])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/groupby.js \"View in source\")\n\nGroups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n\n#### Arguments\n1. `keySelector` *(`Function`)*: A function to extract the key for each element.\n2. `[elementSelector]` *(`Function`)*: A function to map each source element to an element in an observable group.\n\n#### Returns\n*(`Observable`)*: A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n\n#### Example\n```js\nvar codes = [\n    { keyCode: 38}, // up\n    { keyCode: 38}, // up\n    { keyCode: 40}, // down\n    { keyCode: 40}, // down\n    { keyCode: 37}, // left\n    { keyCode: 39}, // right\n    { keyCode: 37}, // left\n    { keyCode: 39}, // right\n    { keyCode: 66}, // b\n    { keyCode: 65}  // a\n];\n\nvar source = Rx.Observable.from(codes)\n    .groupBy(\n        function (x) { return x.keyCode; },\n        function (x) { return x.keyCode; });\n\nvar subscription = source.subscribe(\n    function (obs) {\n        // Print the count\n        obs.count().subscribe(function (x) {\n            console.log('Count: ' + x);\n        });\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Count: 2\n// => Count: 2\n// => Count: 2\n// => Count: 2\n// => Count: 1\n// => Count: 1\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/groupby.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/groupby.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.coincidence.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.coincidence.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Coincidence`](http://www.nuget.org/packages/RxJS-Coincidence/)\n\nUnit Tests:\n- [`/tests/observable/groupby.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/groupby.js)\n"
  },
  {
    "path": "doc/api/core/operators/groupbyuntil.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.groupByUntil(keySelector, [elementSelector], durationSelector)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/groupbyuntil.js \"View in source\")\n\nGroups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n\n#### Arguments\n1. `keySelector` *(`Function`)*: A function to extract the key for each element.\n2. `[elementSelector]` *(`Function`)*: A function to map each source element to an element in an observable group.\n3. `durationSelector` *(`Function`)*: A function to signal the expiration of a group.\n\n#### Returns\n*(`Observable`)*: A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n\nIf a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encountered.\n\n#### Example\n```js\nvar codes = [\n    { keyCode: 38}, // up\n    { keyCode: 38}, // up\n    { keyCode: 40}, // down\n    { keyCode: 40}, // down\n    { keyCode: 37}, // left\n    { keyCode: 39}, // right\n    { keyCode: 37}, // left\n    { keyCode: 39}, // right\n    { keyCode: 66}, // b\n    { keyCode: 65}  // a\n];\n\nvar source = Rx.Observable\n    .for(codes, function (x) { return Rx.Observable.return(x).delay(1000); })\n    .groupByUntil(\n        function (x) { return x.keyCode; },\n        function (x) { return x.keyCode; },\n        function (x) { return Rx.Observable.timer(2000); });\n\nvar subscription = source.subscribe(\n    function (obs) {\n        // Print the count\n        obs.count().subscribe(function (x) { console.log('Count: ' + x); });\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Count: 2\n// => Count: 2\n// => Count: 1\n// => Count: 1\n// => Count: 1\n// => Count: 1\n// => Count: 1\n// => Count: 1\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/groupbyuntil.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/groupbyuntil.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.coincidence.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.coincidence.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Coincidence`](http://www.nuget.org/packages/RxJS-Coincidence/)\n\nUnit Tests:\n- [`/tests/observable/groupbyuntil.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/groupbyuntil.js)\n"
  },
  {
    "path": "doc/api/core/operators/groupjoin.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.groupJoin(right, leftDurationSelector, rightDurationSelector, resultSelector)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/groupjoin.js \"View in source\")\n\nCorrelates the elements of two sequences based on overlapping durations, and groups the results.\n\n#### Arguments\n1. `right` *(`Observable`)*: The right observable sequence to join elements for.\n2. `leftDurationSelector` *(`Function`)*: A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n3. `rightDurationSelector` *(`Function`)*: A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n4. `resultSelector` *(`Any`)*: A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. It has the following arguments\n    1. *(`Any`)* An element of the left sequence.\n    2. *(`Observable`)* An observable sequence with elements from the right sequence that overlap with the left sequence's element.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n\n#### Example\n```js\nvar xs = Rx.Observable.interval(100)\n    .map(function (x) { return 'first' + x; });\n\nvar ys = Rx.Observable.interval(100)\n    .map(function (x) { return 'second' + x; });\n\nvar source = xs.groupJoin(\n    ys,\n    function () { return Rx.Observable.timer(0); },\n    function () { return Rx.Observable.timer(0); },\n    function (x, yy) {\n        return yy.select(function (y) {\n            return x + y;\n        })\n    }).mergeAll().take(5);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: first0second0\n// => Next: first1second1\n// => Next: first2second2\n// => Next: first3second3\n// => Next: first4second4\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/groupjoin.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/groupjoin.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.coincidence.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.coincidence.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Coincidence`](http://www.nuget.org/packages/RxJS-Coincidence/)\n\nUnit Tests:\n- [`/tests/observable/groupjoin.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/groupjoin.js)\n"
  },
  {
    "path": "doc/api/core/operators/if.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.if(condition, thenSource, [elseSource])`\n### `Rx.Observable.ifThen(condition, thenSource, [elseSource])` *DEPRECATED*\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/if.js \"View in source\")\n\nDetermines whether an observable collection contains values. There is an alias for this method called `ifThen` for browsers <IE9\n\n#### Arguments\n1. `condition` *(`Function`)*: The condition which determines if the thenSource or elseSource will be run.\n2. `thenSource` *(`Observable`)*: thenSource The observable sequence that will be run if the condition function returns true.\n3. `[elseSource]` *(Observable|Scheduler)*: The observable sequence that will be run if the condition function returns false. If this is not provided, it defaults to Rx.Observabe.Empty with the specified scheduler.\n\n#### Returns\n*(`Observable`)*: The generated sequence.\n\n#### Example\n```js\n// This uses and only then source\nvar shouldRun = true;\n\nvar source = Rx.Observable.if(\n    function () { return shouldRun; },\n    Rx.Observable.return(42)\n);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n// => Completed\n\n// The next example uses an elseSource\nvar shouldRun = false;\n\nvar source = Rx.Observable.if(\n    function () { return shouldRun; },\n    Rx.Observable.return(42),\n    Rx.Observable.return(56)\n);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 56\n// => Completed\n```\n\n### Location\n\nFile:\n- [/src/core/linq/observable/if.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/if.js)\n\nDist:\n- [rx.all.js](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [rx.experimental.js](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.experimental.js)\n\nPrerequisites:\n- If using `rx.experimental.js` - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Experimental`](http://www.nuget.org/packages/RxJS-Experimental)\n\nUnit Tests:\n- [/tests/observable/if.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/if.js)\n"
  },
  {
    "path": "doc/api/core/operators/ignoreelements.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.ignoreElements()`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/ignoreelements.js \"View in source\")\n\nIgnores all elements in an observable sequence leaving only the termination messages.\n\n#### Returns\n*(`Observable`)*: An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n\n#### Example\n```js\nvar source = Rx.Observable.range(0, 10)\n    .ignoreElements();\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/ignoreelements.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/ignoreelements.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/ignoreelements.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/ignoreelements.js)\n"
  },
  {
    "path": "doc/api/core/operators/includes.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.includes(searchElement, [fromIndex])` ###\n### `Rx.Observable.prototype.contains(searchElement, [fromIndex])` **DEPRECATED** ###\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/includes.js \"View in source\")\n\nDetermines whether an observable sequence includes a specified element with an optional from index.\n\n#### Arguments\n1. `searchElement` *(`Any`)*: The value to locate in the source sequence.\n2. `[fromIndex]` *(`Number`)*: The index to start the search.  If not specified, defaults to 0.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing a single element determining whether the source sequence includes an element that has the specified value with an optional from index.\n\n#### Example\n```js\n/* Without an index */\nvar source = Rx.Observable.of(42)\n  .includes(42);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n      console.log('Completed');\n  });\n\n// => Next: true\n// => Completed\n\n/* With an index */\nvar source = Rx.Observable.of(1,2,3)\n  .includes(2, 1);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: true\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/includes.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/includes.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/includes.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/includes.js)\n"
  },
  {
    "path": "doc/api/core/operators/indexof.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.indexOf(searchElement, [fromIndex])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/indexof.js \"View in source\")\n\nReturns the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n\n#### Arguments\n1. `searchElement` *(`Any`)*: The value to locate in the source sequence.\n2. `[fromIndex]` *(`Number`)*: The index to start the search.  If not specified, defaults to 0.\n\n#### Returns\n*(`Observable`)*: And observable sequence containing the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n\n#### Example\n```js\n/* Without an index */\nvar source = Rx.Observable.of(42)\n  .indexOf(42);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n      console.log('Completed');\n  });\n\n// => Next: 0\n// => Completed\n\n/* With an index */\nvar source = Rx.Observable.of(1,2,3)\n  .indexOf(2, 1);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/indexof.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/indexof.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/indexof.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/indexof.js)\n"
  },
  {
    "path": "doc/api/core/operators/interval.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.interval(period, [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/interval.js \"View in source\")\n\nReturns an observable sequence that produces a value after each period.\n\n#### Arguments\n1. `period` *(`Number`)*: Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n2. `[scheduler]` *(Scheduler=Rx.Scheduler.timeout)*: Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n\n#### Returns\n*(`Observable`)*: An observable sequence that produces a value after each period. Each value produced will default to a `Number` denoting its order in the timeline. (e.g. `0, 1, 2...`)\n\n#### Example\n```js\nvar source = Rx.Observable\n    .interval(500 /* ms */)\n    .timeInterval()\n    .take(3);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: {value: 0, interval: 500}\n// => Next: {value: 1, interval: 500}\n// => Next: {value: 2, interval: 500}\n// => Completed\n```\n\n### Location\n\nFile:\n- [/src/core/linq/observable/interval.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/interval.js)\n\nDist:\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n\nPrerequisites:\n- if `rx.time.js`\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](https://www.npmjs.org/package/RxJS-Time)\n- [`RxJS-Time`](https://www.npmjs.org/package/RxJS-Time)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [/tests/observable/interval.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/interval.js)\n"
  },
  {
    "path": "doc/api/core/operators/isempty.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.isEmpty()`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/isempty.js \"View in source\")\n\nDetermines whether an observable sequence is empty.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing a single element determining whether the source sequence is empty.\n\n#### Example\n```js\n/* Not empty */\nvar source = Rx.Observable.range(0, 5)\n    .isEmpty()\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: false\n// => Completed\n\n/* Empty */\nvar source = Rx.Observable.empty()\n    .isEmpty()\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: true\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/isempty.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/isempty.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/isempty.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/isempty.js)\n"
  },
  {
    "path": "doc/api/core/operators/join.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.join(right, leftDurationSelector, rightDurationSelector, resultSelector)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/join.js \"View in source\")\n\nCorrelates the elements of two sequences based on overlapping durations.\n\n#### Arguments\n1. `right` *(`Observable`)*: The right observable sequence to join elements for.\n2. `leftDurationSelector` *(`Function`)*: A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n3. `rightDurationSelector` *(`Function`)*: A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n4. `resultSelector` *(`Any`)*: A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters are as follows:\n    1. *(`Any`)* Element from the left source for which the overlap occurs.\n    2. *(`Any`)* Element from the right source for which the overlap occurs.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n\n#### Example\n```js\nvar xs = Rx.Observable.interval(100)\n    .map(function (x) { return 'first' + x; });\n\nvar ys = Rx.Observable.interval(100)\n    .map(function (x) { return 'second' + x; });\n\nvar source = xs\n    .join(\n        ys,\n        function () { return Rx.Observable.timer(0); },\n        function () { return Rx.Observable.timer(0); },\n        function (x, y) { return x + y; }\n    )\n    .take(5);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: first0second0\n// => Next: first1second1\n// => Next: first2second2\n// => Next: first3second3\n// => Next: first4second4\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/join.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/join.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.coincidence.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.coincidence.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Coincidence`](http://www.nuget.org/packages/RxJS-Coincidence/)\n\nUnit Tests:\n- [`/tests/observable/join.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/join.js)\n"
  },
  {
    "path": "doc/api/core/operators/jortsort.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.jortSort()` [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/jortsort.js \"View in source\")\n\nThe `jortSort` method checks if your inputs are sorted.  Note that this is only for a sequence with an end.\n\nSee [http://jort.technology/](http://jort.technology/) for full details.\n\n#### Returns\n*(`Observable`)*:  An observable which has a single value of `true` if sorted, else `false`.\n\n#### Example\n```js\n// Sorted\nvar source = Rx.Observable.of(1,2,3,4)\n  .jortSort();\n\nvar subscription = source.subscribe(\n  function (x) { console.log('Next: %s', x); },\n  function (e) { console.log('Error: %s', e); },\n  function ( ) { console.log('Completed'); }\n);\n// => Next: true\n// => Completed\n\n// Non sorted\nvar source = Rx.Observable.of(3,1,2,4)\n  .jortSort();\n\nvar subscription = source.subscribe(\n  function (x) { console.log('Next: %s', x); },\n  function (e) { console.log('Error: %s', e); },\n  function ( ) { console.log('Completed'); }\n);\n// => Next: false\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/jortsort.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/jortsort.js)\n\nDist:\n- [`rx.sorting.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.sorting.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nUnit Tests:\n- [`/tests/observable/jortsort.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/jortsort.js)\n"
  },
  {
    "path": "doc/api/core/operators/jortsortuntil.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.jortSortUntil(other)` [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/jortsortuntil.js \"View in source\")\n\nThe `jortSort` method checks if your inputs are sorted until another Observable sequence fires.\n\nSee [http://jort.technology/](http://jort.technology/) for full details.\n\n#### Arguments\n1. `other` *(`Observable`)*: The Observable sequence which will cause the termination of the sequence.\n\n#### Returns\n*(`Observable`)*:  An observable which has a single value of `true` if sorted, else `false`.\n\n#### Example\n```js\nvar just = Rx.helpers.just;\n\n// Sorted\nvar source = Rx.Observable.of(1,2,3,4)\n  .flatMap(function (x) {\n    return Rx.Observable.timer(1000).map(just(x));\n  })\n  .jortSortUntil(Rx.Observable.timer(3000));\n\nvar subscription = source.subscribe(\n  function (x) { console.log('Next: %s', x); },\n  function (e) { console.log('Error: %s', e); },\n  function ( ) { console.log('Completed'); }\n);\n// => Next: true\n// => Completed\n\n// Non sorted\nvar source = Rx.Observable.of(3,1,2,4)\n  .flatMap(function (x) {\n    return Rx.Observable.timer(1000).map(just(x));\n  })\n  .jortSortUntil(Rx.Observable.timer(3000));\n\nvar subscription = source.subscribe(\n  function (x) { console.log('Next: %s', x); },\n  function (e) { console.log('Error: %s', e); },\n  function ( ) { console.log('Completed'); }\n);\n// => Next: false\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/jortsortuntil.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/jortsortuntil.js)\n\nDist:\n- [`rx.sorting.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.sorting.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nUnit Tests:\n- [`/tests/observable/jortsortuntil.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/jortsortuntil.js)\n"
  },
  {
    "path": "doc/api/core/operators/last.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.last([predicate], [thisArg])`\n### `Rx.Observable.prototype.last([settings])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/last.js \"View in source\")\n\nReturns the last element of an observable sequence that satisfies the condition in the predicate if specified, else the last element.  If no element was found and no default value is specified, `onError` is called with an error, however if a default value was specified, it will be yielded via an `onNext` call.\n\n#### Arguments\n`Rx.Observable.prototype.last([predicate], [thisArg], [defaultValue])`\n\n1. `[predicate]` *(`Function`)*: A predicate function to evaluate for elements in the source sequence. The callback is called with the following information:\n    1. the value of the element\n    2. the index of the element\n    3. the Observable object being subscribed\n2. `[thisArg]` *(`Any`)*: Object to use as `this` when executing the predicate.\n3. `[defaultValue]` *(`Any`)*: Default value if no such element exists.\n\n`Rx.Observable.prototype.last([settings])`\n\n1. `[settings]` *(`Object`)*: An object with the following fields\n    - `[predicate]` *(`Function`)*: A predicate function to evaluate for elements in the source sequence. The callback is called with the following information:\n        1. the value of the element\n        2. the index of the element\n        3. the Observable object being subscribed\n    - `[thisArg]` *(`Any`)*: Object to use as `this` when executing the predicate.\n    - `[defaultValue]` *(`Any`)*: Default value if no such element exists.\n\n#### Returns\n*(`Observable`)*: Sequence containing the last element in the observable sequence that satisfies the condition.\n\n#### Example\n```js\n/* Default value */\nvar source = Rx.Observable.empty().last({defaultValue: 42});\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// => Completed\n\n/* Without predicate */\nvar source = Rx.Observable.range(0, 10).last();\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 9\n// => Completed\n\n/* With predicate */\nvar source = Rx.Observable.range(0, 10)\n  .last(function (x, idx, obs) {\n    return x % 2 === 0;\n  });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 8\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/last.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/last.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/last.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/last.js)\n"
  },
  {
    "path": "doc/api/core/operators/lastindexof.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.lastIndexOf(searchElement, [fromIndex])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/lastindexof.js \"View in source\")\n\nReturns the last index at which a given element can be found in the observable sequence, or -1 if it is not present.\n\n#### Arguments\n1. `searchElement` *(`Any`)*: The value to locate in the source sequence.\n2. `[fromIndex]` *(`Number`)*: The index to start the search.  If not specified, defaults to 0.\n\n#### Returns\n*(`Observable`)*: And observable sequence containing the last index at which a given element can be found in the observable sequence, or -1 if it is not present.\n\n#### Example\n```js\n/* Without an index */\nvar source = Rx.Observable.of(1,2,3,1,2,3)\n  .lastIndexOf(3);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n      console.log('Completed');\n  });\n\n// => Next: 5\n// => Completed\n\n/* With an index */\nvar source = Rx.Observable.of(1,2,3,1,2,3)\n  .lastIndexOf(2, 1);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 5\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/lastindexof.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/lastindexof.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/lastindexof.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/lastindexof.js)\n"
  },
  {
    "path": "doc/api/core/operators/let.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.let(func)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/let.js \"View in source\")\n\nReturns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions.\n\nThis operator allows for a fluent style of writing queries that use the same sequence multiple times.  There is an alias of `letBind` for browsers older than IE 9.\n\n#### Arguments\n1. `func` *(`Function`)*: Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n\n#### Example\n```js\nvar obs = Rx.Observable.range(1, 3);\n\nvar source = obs.let(function (o) { return o.concat(o); });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 1\n// => Next: 2\n// => Next: 3\n// => Next: 1\n// => Next: 2\n// => Next: 3\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/let.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/let.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.experimental.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.experimental.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All)\n- [`RxJS-Experimental`](http://www.nuget.org/packages/RxJS-Experimental)\n\nUnit Tests:\n- [`/tests/observable/let.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/let.js)\n"
  },
  {
    "path": "doc/api/core/operators/manyselect.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.manySelect(selector, [scheduler])`\n### `Rx.Observable.prototype.extend(selector, [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/manyselect.js \"View in source\")\n\nComonadic bind operator.\n\n#### Arguments\n1. `selector` *(`Function`)*: A transform function to apply to each element.\n2. `[scheduler=Rx.Scheduler.immediate]` *(`Scheduler`)*: Scheduler used to execute the operation. If not specified, defaults to the `Rx.Scheduler.immediate` scheduler.\n\n#### Returns\n*(`Observable`)*: An observable sequence which results from the comonadic bind operation.\n\n#### Example\n```js\nvar source = Rx.Observable.range(0, 3)\n    .manySelect(function (ys) { return ys.first(); })\n    .mergeAll();\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/manyselect.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/manyselect.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.experimental.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.experimental.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All)\n- [`RxJS-Experimental`](http://www.nuget.org/packages/RxJS-Experimental)\n\nUnit Tests:\n- [`/tests/observable/manyselect.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/manyselect.js)\n"
  },
  {
    "path": "doc/api/core/operators/materialize.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.materialize()`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/materialize.js \"View in source\")\n\nMaterializes the implicit notifications of an observable sequence as explicit notification values.\n\n#### Returns\n*(`Observable<Notification>`)*: An observable sequence containing the materialized notification values from the source sequence.\n\n#### Example\n```js\nvar source = Rx.Observable.of(1,2,3).materialize();\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next OnNext(1)\n// => Next OnNext(2)\n// => Next OnNext(3)\n// => Next OnCompleted()\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/materialize.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/materialize.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/materialize.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/materialize.js)\n"
  },
  {
    "path": "doc/api/core/operators/max.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.max([comparer])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/max.js \"View in source\")\n\nReturns the maximum value in an observable sequence according to the specified comparer.\n\n#### Arguments\n1. `[comparer]` *(`Function`)*:  Comparer used to compare elements.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing a single element with the maximum element in the source sequence.\n\n#### Example\n```js\n/* Without comparer */\nvar source = Rx.Observable.from([1,3,5,7,9,2,4,6,8])\n    .max();\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 9\n// => Completed\n\n/* With a comparer */\nfunction comparer (x, y) {\n    if (x > y) {\n        return 1;\n    } else if (x < y) {\n        return -1;\n    }\n    return 0;\n}\n\nvar source = Rx.Observable.from([1,3,5,7,9,2,4,6,8])\n    .max(comparer);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 9\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/max.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/max.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/max.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/max.js)\n"
  },
  {
    "path": "doc/api/core/operators/maxby.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.maxBy(keySelector, [comparer])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/maxby.js \"View in source\")\n\nReturns the maximum value in an observable sequence according to the specified comparer.\n\n#### Arguments\n1. `keySelector` *(`Function`)*: Key selector function.\n2. `[comparer]` *(`Function`)*:  Comparer used to compare elements.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing a list of zero or more elements that have a maximum key value.\n\n#### Example\n```js\n/* Without comparer */\nvar source = Rx.Observable.from([1,3,5,7,9,2,4,6,8,9])\n    .maxBy(function (x) { return x; });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 9,9\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/maxby.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/maxby.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/maxby.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/maxby.js)\n"
  },
  {
    "path": "doc/api/core/operators/merge.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.merge([scheduler], ...args)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/merge.js \"View in source\")\n\nMerges all the observable sequences and Promises into a single observable sequence.\n\n#### Arguments\n1. `[scheduler]` *(Scheduler=Rx.Scheduler.immediate)*: Scheduler to run the timer on. If not specified, Rx.Scheduler.immediate is used.\n1. `args` *(Array|arguments)*: Observable sequences to merge into a single sequence.\n\n#### Returns\n*(`Observable`)*: An observable sequence that produces a value after each period.\n\n#### Example\n```js\nvar source1 = Rx.Observable.interval(100)\n    .timeInterval()\n    .pluck('interval');\nvar source2 = Rx.Observable.interval(150)\n    .timeInterval()\n    .pluck('interval');\n\nvar source = Rx.Observable.merge(\n    source1,\n    source2)\n    .take(5);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 100\n// => Next: 150\n// => Next: 100\n// => Next: 150\n// => Next: 100\n// => Completed\n```\n\n### Location\n\nFile:\n- [/src/core/linq/observable/merge.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/merge.js)\n\nDist:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/merge.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/merge.js)\n"
  },
  {
    "path": "doc/api/core/operators/mergeall.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.mergeAll()` ###\n### `Rx.Observable.prototype.mergeObservable()` **DEPRECATED** ###\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/mergeall.js \"View in source\")\n\nMerges an observable sequence of observable sequences into an observable sequence.\n\n#### Returns\n*(`Observable`)*: The observable sequence that merges the elements of the inner sequences.\n\n#### Example\n```js\nvar source = Rx.Observable.range(0, 3)\n  .map(function (x) { return Rx.Observable.range(x, 3); })\n  .mergeAll();\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0\n// => Next: 1\n// => Next: 1\n// => Next: 2\n// => Next: 2\n// => Next: 2\n// => Next: 3\n// => Next: 3\n// => Next: 4\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/modular/observable/mergeall.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/modular/observable/mergeall.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/mergeall.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/mergeall.js)\n"
  },
  {
    "path": "doc/api/core/operators/mergedelayerror.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.mergeDelayError(...args)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/mergedelayerror.js \"View in source\")\n\nFlattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\nreceive all successfully emitted items from all of the source Observables without being interrupted by\nan error notification from one of them.\n\nThis behaves like `Observable.prototype.mergeAll` except that if any of the merged Observables notify of an\nerror via the Observer's `onError`, `mergeDelayError` will refrain from propagating that\nerror notification until all of the merged Observables have finished emitting items.\n\n#### Arguments\n1. `args` *(Array|arguments)*: Arguments or an array of Observable sequences to merge.\n\n#### Returns\n*(`Observable`)*: An Observable that emits all of the items emitted by the Observables emitted by the Observable\n\n#### Example\n```js\nvar source1 = Rx.Observable.of(1,2,3);\nvar source2 = Rx.Observable.throwError(new Error('woops'));\nvar source3 = Rx.Observable.of(4,5,6);\n\nvar source = Rx.Observable.mergeDelayError(source1, source2, source3);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => 1\n// => 2\n// => 3\n// => 4\n// => 5\n// => 6\n// => Error: Error: woops\n```\n\n### Location\n\nFile:\n- [/src/core/linq/observable/mergedelayerror.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/mergedelayerror.js)\n\nDist:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/mergedelayerror.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/mergedelayerror.js)\n"
  },
  {
    "path": "doc/api/core/operators/mergeproto.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.merge(maxConcurrent | other)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/mergeconcat.js \"View in source\")\n\nMerges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\nOr merges two observable sequences into a single observable sequence.\n\n#### Arguments\n1. `maxConcurrent` *(`Number`)*: Maximum number of inner observable sequences being subscribed to concurrently.\n1. `other` *(`Observable`)*:  The second observable sequence to merge into the first.\n\n#### Returns\n*(`Observable`)*: The observable sequence that merges the elements of the inner sequences.\n\n#### Example\n```js\n/* Merge two sequences */\nvar source1 = Rx.Observable.interval(100)\n    .map(function (x) { return 'First: ' + x; });\n\nvar source2 = Rx.Observable.interval(50)\n    .map(function (x) { return 'Second: ' + x; });\n\nvar source = source1\n    .merge(source2)\n    .take(5);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: Second: 0\n// => Next: First: 0\n// => Next: Second: 1\n// => Next: Second: 2\n// => Next: First: 1\n// => Completed\n\n/* Use max concurrency */\nvar source = Rx.Observable.range(0, 3)\n    .map(function (x) { return Rx.Observable.range(x, 3); })\n    .merge(1);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n// => Next: 1\n// => Next: 2\n// => Next: 3\n// => Next: 2\n// => Next: 3\n// => Next: 4\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/mergeconcat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/mergeconcat.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/mergeconcat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/mergeconcat.js)\n\n* * *\n"
  },
  {
    "path": "doc/api/core/operators/min.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.min([comparer])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/min.js \"View in source\")\n\nReturns the minimum element in an observable sequence according to the optional comparer else a default greater than less than check.\n\n#### Arguments\n1. `[comparer]` *(`Function`)*:  Comparer used to compare elements.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing a single element with the minimum element in the source sequence.\n\n#### Example\n```js\n/* Without comparer */\nvar source = Rx.Observable.from([1,3,5,7,9,2,4,6,8])\n    .min();\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 1\n// => Completed\n\n/* With a comparer */\nfunction comparer (x, y) {\n    if (x > y) {\n        return 1;\n    } else if (x < y) {\n        return -1;\n    }\n    return 0;\n}\n\nvar source = Rx.Observable.from([1,3,5,7,9,2,4,6,8])\n    .min(comparer);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 1\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/min.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/min.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/min.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/min.js)\n"
  },
  {
    "path": "doc/api/core/operators/minby.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.minBy(keySelector, [comparer])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/minby.js \"View in source\")\n\nReturns the elements in an observable sequence with the minimum key value according to the specified comparer.\n\n#### Arguments\n1. `keySelector` *(`Function`)*: Key selector function.\n2. `[comparer]` *(`Function`)*:  Comparer used to compare elements.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing a list of zero or more elements that have a minimum key value.\n\n#### Example\n```js\n/* Without comparer */\nvar source = Rx.Observable.from([1,3,5,7,9,2,4,6,8,1])\n    .minBy(function (x) { return x; });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 1,1\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/minby.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/minby.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/minby.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/minby.js)\n"
  },
  {
    "path": "doc/api/core/operators/multicast.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.multicast(subject | subjectSelector, [selector])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/multicast.js \"View in source\")\n\nMulticasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\nsubscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\ninvocation. For specializations with fixed subject types, see `publish`, `share`, `publishValue`, `shareValue`, `publishLast`, `replay`, and `shareReplay`.\n\n#### Arguments\n1. `subjectSelector` *(`Function`)*:  Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n1. `subject` *(Subject)*: Subject to push source elements into.\n2. `[selector]` *(`Function`)*: Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if `subjectSelector` is provided.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n\n#### Example\n```js\nvar subject = new Rx.Subject();\nvar source = Rx.Observable.range(0, 3)\n    .multicast(subject);\n\nvar observer = Rx.Observer.create(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    }\n);\n\nvar subscription = source.subscribe(observer);\nsubject.subscribe(observer);\n\nvar connected = source.connect();\n\nsubscription.dispose();\n\n// => Next: 0\n// => Next: 0\n// => Next: 1\n// => Next: 1\n// => Next: 2\n// => Next: 2\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/multicast.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/multicast.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n  - [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Binding`](http://www.nuget.org/packages/RxJS-Binding/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/multicast.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/multicast.js)\n"
  },
  {
    "path": "doc/api/core/operators/never.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.never()`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/never.js \"View in source\")\n\nReturns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n\n#### Returns\n*(`Observable`)*: An observable sequence whose observers will never get called.\n\n#### Example\n```js\n// This will never produce a value, hence never calling any of the callbacks\nvar source = Rx.Observable.never();\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n```\n\n### Location\n\nFile:\n- [/src/core/perf/operators/never.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/never.js)\n\nDist:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [/tests/observable/never.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/never.js)\n"
  },
  {
    "path": "doc/api/core/operators/observeon.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.observeOn(scheduler)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/observeon.js \"View in source\")\n\nWraps the source sequence in order to run its observer callbacks on the specified scheduler.\n\nThis only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects that require to be run on a scheduler, use subscribeOn.\n\n#### Arguments\n1. `scheduler` *(`Scheduler`)*:  Scheduler to notify observers on.\n\n#### Returns\n*(`Observable`)*: The source sequence whose observations happen on the specified scheduler.\n\n#### Example\n```js\n/* Change from immediate scheduler to timeout */\nvar source = Rx.Observable.return(42, Rx.Scheduler.immediate)\n    .observeOn(Rx.Scheduler.timeout);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/observeon.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/observeon.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.extras.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.extras.js)\n- [`rx.lite.extras.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.extras.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/observeon.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/observeon.js)\n"
  },
  {
    "path": "doc/api/core/operators/of.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.of(...args)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/of.js \"View in source\")\n\nConverts arguments to an observable sequence.\n\n#### Arguments\n1. `args` *(Arguments)*: A list of arguments to turn into an Observable sequence.\n\n#### Returns\n*(`Observable`)*: The observable sequence whose elements are pulled from the given arguments.\n\n#### Example\n```js\nvar source = Rx.Observable.of(1,2,3);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 1\n// => Next: 2\n// => Next: 3\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/of.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/of.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/of.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/of.js)\n\n* * *\n"
  },
  {
    "path": "doc/api/core/operators/ofarraychanges.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.ofArrayChanges(array)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/ofarraychanges.js \"View in source\")\n\nCreates an Observable sequence from changes to an array using `Array.observe`.\n\n#### Arguments\n1. `array` *(`Array`)*: The array to observe changes using `Array.observe`\n\n#### Returns\n*(`Observable`)*: An observable sequence containing changes to an array from `Array.observe`.\n\n#### Example\n```js\nvar arr = [1,2,3];\nvar source = Rx.Observable.ofArrayChanges(arr);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\narr.push(4);\n\n// => Next: {type: \"splice\", object: Array[4], index: 3, removed: Array[0], addedCount: 1}\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/ofarraychanges.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/ofarraychanges.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- None\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n\nUnit Tests:\n- [`/tests/observable/ofarraychanges.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/ofarraychanges.js)\n"
  },
  {
    "path": "doc/api/core/operators/ofobjectchanges.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.ofObjectChanges(obj)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/ofobjectchanges.js \"View in source\")\n\nCreates an Observable sequence from changes to an object using `Object.observe`.\n\n#### Arguments\n1. `array` *(`Array`)*: The object to observe changes using `Object.observe`\n\n#### Returns\n*(`Observable`)*: An observable sequence containing changes to an object from `Object.observe`.\n\n#### Example\n```js\nvar obj = {x: 1};\nvar source = Rx.Observable.ofObjectChanges(obj);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\nobj.x = 42;\n\n// => Next: {type: \"update\", object: Object, name: \"x\", oldValue: 1}\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/ofobjectchanges.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/ofobjectchanges.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- None\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n\nUnit Tests:\n- [`/tests/observable/ofarraychanges.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/ofobjectchanges.js)\n"
  },
  {
    "path": "doc/api/core/operators/ofwithscheduler.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.ofWithScheduler([scheduler], ...args)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/of.js \"View in source\")\n\nConverts arguments to an observable sequence, using an optional scheduler to enumerate the arguments.\n\n#### Arguments\n1. `[scheduler]` *(Scheduler)*: An optional scheduler used to enumerate the arguments.\n2. `args` *(Arguments)*: A list of arguments to turn into an Observable sequence.\n\n#### Returns\n*(`Observable`)*: The observable sequence whose elements are pulled from the given arguments.\n\n#### Example\n```js\nvar source = Rx.Observable.ofWithScheduler(Rx.Scheduler.timeout, 1,2,3);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 1\n// => Next: 2\n// => Next: 3\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/of.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/of.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/of.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/of.js)\n"
  },
  {
    "path": "doc/api/core/operators/onerrorresumenext.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.onErrorResumeNext(...args)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/onerrorresumenext.js \"View in source\")\n\nContinues an observable sequence that is terminated normally or by an exception with the next observable sequence or Promise.\n\n### Arguments\n1. `args` *(Array|arguments)*: Observable sequences to concatenate.\n\n#### Returns\n*(`Observable`)*: An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n\n#### Example\n```js\nvar source1 = Rx.Observable.throw(new Error('error 1'));\nvar source2 = Rx.Observable.throw(new Error('error 2'));\nvar source3 = Rx.Observable.return(42);\n\nvar source = Rx.Observable.onErrorResumeNext(source1, source2, source3);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n// => Completed\n```\n\n### Location\n\nFile:\n- [/src/core/linq/observable/onerrorresumenext.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/onerrorresumenext.js)\n\nDist:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n\nUnit Tests:\n- [/tests/observable/onerrorresumenext.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/onerrorresumenext.js)\n"
  },
  {
    "path": "doc/api/core/operators/onerrorresumenextproto.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.onErrorResumeNext(second)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/onerrorresumenextproto.js \"View in source\")\n\nContinues an observable sequence that is terminated normally or by an exception with the next observable sequence or Promise.\n\n#### Arguments\n1. `second` *(`Observable` | `Promise`)*:  Second observable sequence used to produce results after the first sequence terminates.\n\n#### Returns\n*(`Observable`)*: An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n\n#### Example\n```js\nvar source = Rx.Observable.throw(new Error())\n    .onErrorResumeNext(Rx.Observable.return(42));\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/onerrorresumenextproto.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/onerrorresumenextproto.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.extras.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.extras.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/onerrorresumenext.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/onerrorresumenext.js)\n"
  },
  {
    "path": "doc/api/core/operators/pairs.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.pairs(obj, [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/pairs.js \"View in source\")\n\nConvert an object into an observable sequence of [key, value] pairs using an optional `Scheduler` to enumerate the object.\n\n#### Arguments\n1. `obj` *(Object)*: The object to inspect and turn into an Observable sequence.\n2. `[scheduler]` *(`Scheduler`)*: Scheduler to run the enumeration of the input sequence on. If not specified, defaults to `Rx.Scheduler.currentThread`\n\n#### Returns\n*(`Observable`)*: An observable sequence of [key, value] pairs from the object.\n\n#### Example\n```js\n// Using Standard JavaScript\nvar obj = {\n  foo: 42,\n  bar: 56,\n  baz: 78\n};\n\nvar source = Rx.Observable.pairs(obj);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: ['foo', 42]\n// => Next: ['bar', 56]\n// => Next: ['baz', 78]\n// => Completed\n  ```\n\nES6 makes for an even nicer experience such as:\n```es6\nlet obj = {\n  foo: 42,\n  bar: 56,\n  baz: 78\n};\n\nlet source = Rx.Observable.pairs(obj);\n\nlet subscription = source.subscribe(\n  x => {\n    var [key, value] = x;\n    console.log('Key:', key, 'Value:', value);\n  },\n  err => {\n    console.log('Error: %s', err);\n  },\n  => () {\n    console.log('Completed');\n  });\n\n// => Key: 'foo' Value: 42\n// => Key: 'bar' Value: 56\n// => Key: 'baz' Value: 78\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/pairs.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/pairs.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/pairs.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/pairs.js)\n"
  },
  {
    "path": "doc/api/core/operators/pairwise.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.pairwise()`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/pairwise.js \"View in source\")\n\nTriggers on the second and subsequent triggerings of the input observable. The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair.\n\n#### Returns\n*(`Observable`)*: An observable that triggers on successive pairs of observations from the input observable as an array.\n\n#### Example\n```js\nvar r = Rx.Observable.range(1, 4);\n\nvar source = r.pairwise();\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + JSON.stringify(x));\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: [1,2]\n// => Next: [2,3]\n// => Next: [3,4]\n// => Completed\n```\n\n#### Example (Draw line)\n```html\n<canvas id=\"canvas\" width=\"600\" height=\"600\"/>\n```\n\n```js\nvar canvas = document.getElementById(\"canvas\");\nvar g = canvas.getContext(\"2d\");\ng.rect(0, 0, canvas.width, canvas.height);\ng.fillStyle = \"rgb(0,0,0)\";\ng.fill();\n\nvar mouseMove = Rx.Observable.fromEvent(document, 'mousemove');\nvar mouseDown = Rx.Observable.fromEvent(document.getElementById('canvas'), 'mousedown');\nvar mouseUp = Rx.Observable.fromEvent(document.getElementById('canvas'), 'mouseup');\n\nmouseDown.flatMap(function(ev) {  \n  return mouseMove.map(function(ev) {\n    return {\n      x: ev.clientX,\n      y: ev.clientY\n    };\n  }).pairwise().takeUntil(mouseUp);\n  \n}).subscribe(function(pos) {\n  g.beginPath();\n  g.lineWidth = 1;\n  \n  g.strokeStyle = \"rgb(255, 0, 0)\";\n  \n  g.moveTo(pos[0].x, pos[0].y);\n  g.lineTo(pos[1].x, pos[1].y);\n  \n  g.stroke();\n});\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/pairwise.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/pairwise.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.coincidence.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.coincidence.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Coincidence`](http://www.nuget.org/packages/RxJS-Coincidence/)\n\nUnit Tests:\n- [`/tests/observable/pairwise.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/pairwise.js)\n"
  },
  {
    "path": "doc/api/core/operators/partition.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.partition(predicate, [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/partition.js \"View in source\")\n\nReturns two observables which partition the observations of the source by the given function.  The first will trigger observations for those values for which the predicate returns true. The second will trigger observations for those values where the predicate returns false. The predicate is executed once for each subscribed observer. Both also propagate all error observations arising from the source and each completes when the source completes.\n\n#### Arguments\n1. `predicate` *(`Function`)*: Selector function to invoke for each produced element, resulting in another sequence to which the selector will be invoked recursively again. The callback is called with the following information:\n    1. the value of the element\n    2. the index of the element\n    3. the Observable object being subscribed\n2. `[thisArg]` *(`Any`)*: Object to use as `this` when executing the predicate.\n\n#### Returns\n*(`Array`)*:  An array of observables. The first triggers when the predicate returns true, and the second triggers when the predicate returns false.\n\n#### Example\n\nAn example using ES6 syntax:\n```es6\nlet [evens, odds] = Rx.Observable.range(0, 10)\n  .partition(x => x % 2 === 0);\n\nlet subscription1 = evens.subscribe(\n  x  => console.log('Evens: %s', x),\n  e  => console.log('Error: %s', e),\n  () => console.log('Completed')\n);\n\n// => Evens: 0\n// => Evens: 2\n// => Evens: 4\n// => Evens: 6\n// => Evens: 8\n// => Completed\n\nlet subscription2 = odds.subscribe(\n  x  => console.log('Odds: %s', x),\n  e  => console.log('Error: %s', e),\n  () => console.log('Completed')\n);\n\n// => Odds: 1\n// => Odds: 3\n// => Odds: 5\n// => Odds: 7\n// => Odds: 9\n// => Completed\n```\n\n#### Example\n\n```html\n<div id=\"dom-event-source\"></div>\n<div id=\"dom-event-output\">\n    <div class=\"left\"><p></p></div>\n    <div class=\"right\"><p></p></div>\n</div>\n```\n\n```js\nvar sourceElement = document.getElementById(\"dom-event-source\");\nvar elements = [\"#dom-event-output .left p\", \"#dom-event-output .right p\"].map(document.querySelector.bind(document));\nvar elementRect = sourceElement.getBoundingClientRect();\n\nvar observers = Rx.Observable.fromEvent(sourceElement, 'mousemove')\n.map(e => ({\n      x: Math.floor(e.clientX - elementRect.left), \n      y: Math.floor(e.clientY - elementRect.top)\n    })\n).partition(pos => pos.x < sourceElement.clientWidth / 2);\n\nelements.forEach((n, i, a) => \n                 observers[i].subscribe(displayCoordinates.bind(displayCoordinates, n)));\n\nfunction displayCoordinates(element, pos) {\n  element.textContent = `(x: ${pos.x}, y: ${pos.y})`;\n}\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/partition.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/partition.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.coincidence.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.coincidence.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Coincidence`](http://www.nuget.org/packages/RxJS-Coincidence/)\n\nUnit Tests:\n- [`/tests/observable/partition.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/partition.js)\n"
  },
  {
    "path": "doc/api/core/operators/pausable.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.pausable(pauser)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/backpressure/pausable.js \"View in source\")\n\nPauses the underlying observable sequence based upon the observable sequence which yields true/false.  Note that this only works on hot observables.\n\n#### Arguments\n1. `pauser` *(`Observable`)*: The observable sequence used to pause the underlying sequence.\n\n#### Returns\n*(`Observable`)*: The observable sequence which is paused based upon the pauser.\n\n#### Example\n```js\nvar pauser = new Rx.Subject();\nvar source = Rx.Observable.fromEvent(document, 'mousemove').pausable(pauser);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// To begin the flow\npauser.onNext(true); // or source.resume();\n\n// To pause the flow at any point\npauser.onNext(false);  // or source.pause();\n```\n\n### Location\n\nFile:\n- [`/src/core/backpressure/pausable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/backpressure/pausable.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [rx.backpressure.js](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.backpressure.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.backpressure.js`\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n    - [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-BackPressure`](http://www.nuget.org/packages/RxJS-BackPressure/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/pausable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/pausable.js)\n"
  },
  {
    "path": "doc/api/core/operators/pausablebuffered.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.pausableBuffered(pauser)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/backpressure/pausablebuffered.js \"View in source\")\n\nPauses the underlying observable sequence based upon the observable sequence which yields true/false, and yields the values that were buffered while paused. Note that this only works on hot observables.\n\n#### Arguments\n1. `pauser` *(`Observable`)*: The observable sequence used to pause the underlying sequence.\n\n#### Returns\n*(`Observable`)*: The observable sequence which is paused based upon the pauser.\n\n#### Example\n```js\nvar pauser = new Rx.Subject();\nvar source = Rx.Observable.interval(1000).pausableBuffered(pauser);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// To begin the flow\npauser.onNext(true); // or source.resume();\n\n// To pause the flow at any point\npauser.onNext(false); // or source.pause();\n\n// Resume the flow which empties the queue from when you last paused\npauser.onNext(true); // or source.resume();\n```\n### Location\n\nFile:\n- [`/src/core/backpressure/pausablebuffered.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/backpressure/pausablebuffered.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [rx.backpressure.js](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.backpressure.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.backpressure.js`\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n    - [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-BackPressure`](http://www.nuget.org/packages/RxJS-BackPressure/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/pausablebuffered.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/pausablebuffered.js)\n"
  },
  {
    "path": "doc/api/core/operators/pluck.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.pluck(property)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/pluck.js#L10 \"View in source\")\n\nReturns an Observable containing the value of a specified nested property from\nall elements in the Observable sequence. If a property can't be resolved, it\nwill return `undefined` for that value.\n\n#### Arguments\n1. `property` *(`String`)*: The property or properties to pluck. `pluck`\n   accepts an unlimited number of nested property parameters.\n\n#### Returns\n*(`Observable`)*: Returns a new Observable sequence of property values.\n\n#### Example\n```js\nvar source = Rx.Observable\n    .from([\n        { value: 0 },\n        { value: 1 },\n        { value: 2 }\n    ])\n    .pluck('value');\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n// => Completed\n\n// Using nested properties:\n\nvar source = Rx.Observable\n    .from([\n        { valueA: { valueB: { valueC: 0 }}},\n        { valueA: { valueB: { valueC: 1 }}},\n        { valueA: { valueB: 2 }},\n    ])\n    .pluck('valueA', 'valueB', 'valueC');\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0\n// => Next: 1\n// => Next: undefined\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/pluck.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/pluck.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/pluck.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/pluck.js)\n"
  },
  {
    "path": "doc/api/core/operators/publish.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.publish([selector])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/publish.js \"View in source\")\n\nReturns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n\nThis operator is a specialization of `multicast` using a regular `Rx.Subject`.\n\n#### Arguments\n1. `[selector]` *(`Function`)*: Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n\n#### Returns\n*(ConnectableObservable)*: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n\n#### Example\n```js\n/* Without publish */\nvar interval = Rx.Observable.interval(1000);\n\nvar source = interval\n    .take(2)\n    .do(function (x) {\n        console.log('Side effect');\n    });\n\nsource.subscribe(createObserver('SourceA'));\nsource.subscribe(createObserver('SourceB'));\n\nfunction createObserver(tag) {\n    return Rx.Observer.create(\n        function (x) {\n            console.log('Next: ' + tag + x);\n        },\n        function (err) {\n            console.log('Error: ' + err);\n        },\n        function () {\n            console.log('Completed');\n        });\n}\n\n// => Side effect\n// => Next: SourceA0\n// => Side effect\n// => Next: SourceB0\n// => Side effect\n// => Next: SourceA1\n// => Completed\n// => Side effect\n// => Next: SourceB1\n// => Completed\n\n/* With publish */\nvar interval = Rx.Observable.interval(1000);\n\nvar source = interval\n    .take(2)\n    .doAction(function (x) {\n        console.log('Side effect');\n    });\n\nvar published = source.publish();\n\npublished.subscribe(createObserver('SourceA'));\npublished.subscribe(createObserver('SourceB'));\n\nvar connection = published.connect();\n\nfunction createObserver(tag) {\n    return Rx.Observer.create(\n        function (x) {\n            console.log('Next: ' + tag + x);\n        },\n        function (err) {\n            console.log('Error: ' + err);\n        },\n        function () {\n            console.log('Completed');\n        });\n}\n\n// => Side effect\n// => Next: SourceA0\n// => Next: SourceB0\n// => Side effect\n// => Next: SourceA1\n// => Next: SourceB1\n// => Completed\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/publish.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/publish.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.binding.js`\n  - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Binding`](http://www.nuget.org/packages/RxJS-Binding/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/publish.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/publish.js)\n"
  },
  {
    "path": "doc/api/core/operators/publishlast.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.publishLast([selector])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/publishlast.js \"View in source\")\n\nReturns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n\nThis operator is a specialization of `multicast` using a `Rx.AsyncSubject`.\n\n#### Arguments\n1. `[selector]` *(`Function`)*: Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n\n#### Returns\n*(ConnectableObservable)*: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n\n#### Example\n```js\nvar interval = Rx.Observable.interval(1000);\n\nvar source = interval\n    .take(2)\n    .doAction(function (x) {\n        console.log('Side effect');\n    });\n\nvar published = source.publishLast();\n\npublished.subscribe(createObserver('SourceA'));\npublished.subscribe(createObserver('SourceB'));\n\nvar connection = published.connect();\n\nfunction createObserver(tag) {\n    return Rx.Observer.create(\n        function (x) {\n            console.log('Next: ' + tag + x);\n        },\n        function (err) {\n            console.log('Error: ' + err);\n        },\n        function () {\n            console.log('Completed');\n        });\n}\n\n// => Side effect\n// => Side effect\n// => Next: SourceA1\n// => Completed\n// => Next: SourceB1\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/publishlast.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/publishlast.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.binding.js`\n  - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Binding`](http://www.nuget.org/packages/RxJS-Binding/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/publishlast.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/publishlast.js)\n"
  },
  {
    "path": "doc/api/core/operators/publishvalue.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.publishValue([selector], initialValue)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/publishvalue.js \"View in source\")\n\nReturns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n\nThis operator is a specialization of `multicast` using a `Rx.BehaviorSubject`.\n\n#### Arguments\n1. `[selector]`: `Function` - Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n2. `initialValue`: `Any` - Initial value received by observers upon subscription.\n\n#### Returns\n`ConnectableObservable` - An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function and initial value.\n\n#### Example\n```js\nvar interval = Rx.Observable.interval(1000);\n\nvar source = interval\n  .take(2)\n  .tap(function (x) {\n    console.log('Side effect');\n  });\n\nvar published = source.publishValue(42);\n\npublished.subscribe(createObserver('SourceA'));\npublished.subscribe(createObserver('SourceB'));\n\nvar connection = published.connect();\n\nfunction createObserver(tag) {\n  return Rx.Observer.create(\n    function (x) {\n      console.log('Next: ' + tag + x);\n    },\n    function (err) {\n      console.log('Error: ' + err);\n    },\n    function () {\n      console.log('Completed');\n    });\n}\n\n// => Next: SourceA42\n// => Next: SourceB42\n// => Side effect\n// => Next: SourceA0\n// => Next: SourceB0\n// => Side effect\n// => Next: SourceA1\n// => Next: SourceB1\n// => Completed\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/publishvalue.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/publishvalue.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.binding.js`\n  - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Binding`](http://www.nuget.org/packages/RxJS-Binding/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/publishvalue.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/publishvalue.js)\n"
  },
  {
    "path": "doc/api/core/operators/range.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.range(start, count, [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/range.js \"View in source\")\n\nGenerates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n\n### Arguments\n1. `start` *(`Number`)*: The value of the first integer in the sequence.\n2. `count` *(`Number`)*: The number of sequential integers to generate.\n3. `[scheduler=Rx.Scheduler.currentThread]` *(`Scheduler`)*: Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains a range of sequential integral numbers.\n\n#### Example\n```js\nvar source = Rx.Observable.range(0, 3);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n// => Completed\n```\n\n### Location\n\nFile:\n- [/src/core/perf/operators/range.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/range.js)\n\nDist:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [/tests/observable/range.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/range.js)\n"
  },
  {
    "path": "doc/api/core/operators/reduce.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.reduce(accumulator, [seed])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/reduce.js \"View in source\")\n\nApplies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n\nFor aggregation behavior with incremental intermediate results, see the [`scan`](scan.md) method.\n\n#### Arguments\n1. `accumulator` *(`Function`)*:  An accumulator function to be invoked on each element with the following arguments:\n    1. `acc`: `Any` - the accumulated value.\n    2. `currentValue`: `Any` - the current value\n    3. `index`: `Number` - the current index\n    4. `source`: `Observable` - the current observable instance\n2. `[seed]` *(`Any`)*: The initial accumulator value.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing a single element with the final accumulator value.\n\n#### Example\n```js\n/* With a seed */\nvar source = Rx.Observable.range(1, 3)\n  .reduce(function (acc, x, idx, source) {\n    return acc * x;\n  }, 1)\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 6\n// => Completed\n\n/* Without a seed */\nvar source = Rx.Observable.range(1, 3)\n  .reduce(function (acc, x, idx, source) {\n    return acc * x;\n  })\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 6\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/reduce.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/reduce.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/reduce.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/reduce.js)\n"
  },
  {
    "path": "doc/api/core/operators/refcount.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `ConnectableObservable.prototype.refCount()`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/connectableobservable.js \"View in source\")\n\nReturns an observable sequence that stays connected to the source as long as there is at least one subscription to the observable sequence.\n\n#### Returns\n*(`Observable`)*: An observable sequence that stays connected to the source as long as there is at least one subscription to the observable sequence.\n\n#### Example\n```js\nvar interval = Rx.Observable.interval(1000);\n\nvar source = interval\n    .take(2)\n    .doAction(function (x) {\n        console.log('Side effect');\n    });\n\nvar published = source.publish().refCount();\n\npublished.subscribe(createObserver('SourceA'));\npublished.subscribe(createObserver('SourceB'));\n\nfunction createObserver(tag) {\n    return Rx.Observer.create(\n        function (x) {\n            console.log('Next: ' + tag + x);\n        },\n        function (err) {\n            console.log('Error: ' + err);\n        },\n        function () {\n            console.log('Completed');\n        });\n}\n\n// => Side effect\n// => Next: SourceA0\n// => Next: SourceB0\n// => Side effect\n// => Next: SourceA1\n// => Next: SourceB1\n// => Completed\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/connectableobservable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/connectableobservable.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.binding.js`\n  - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Binding`](http://www.nuget.org/packages/RxJS-Binding/)\n\nUnit Tests:\n- [`/tests/observable/connectableobservable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/connectableobservable.js)\n"
  },
  {
    "path": "doc/api/core/operators/repeat.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.repeat(value, [repeatCount], [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/repeat.js \"View in source\")\n\nGenerates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n\n### Arguments\n1. `value` *(`Any`)*: Element to repeat.\n2. `[repeatCount=-1]` *(`Number`)*:Number of times to repeat the element. If not specified, repeats indefinitely.\n3. `[scheduler=Rx.Scheduler.immediate]` *(`Scheduler`)*: Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n\n#### Returns\n*(`Observable`)*: An observable sequence that repeats the given element the specified number of times.\n\n#### Example\n```js\nvar source = Rx.Observable.repeat(42, 3);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n//=> Next: 42\n// => Next: 42\n// => Next: 42\n// => Completed\n```\n\n### Location\n\nFile:\n- [/src/core/perf/operators/repeat.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/repeat.js)\n\nDist:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [/tests/observable/repeat.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/repeat.js)\n"
  },
  {
    "path": "doc/api/core/operators/repeatproto.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.repeat(repeatCount)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/repeatproto.js \"View in source\")\n\nRepeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n\n#### Arguments\n1. `repeatCount` *(`Number`)*:  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n\n#### Returns\n*(`Observable`)*: The observable sequence producing the elements of the given sequence repeatedly.\n\n#### Example\n```js\nvar source = Rx.Observable.range(1, 3)\n    .repeat(2);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 1\n// => Next: 2\n// => Next: 3\n// => Next: 1\n// => Next: 2\n// => Next: 3\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/repeatproto.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/repeatproto.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/repeat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/repeat.js)\n"
  },
  {
    "path": "doc/api/core/operators/repeatwhen.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.repeatWhen(notificationHandler)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/repeatwhen.js \"View in source\")\n\nReturns an Observable that emits the same values as the source Observable with the exception of an onCompleted. An onCompleted notification from the source will result in the emission of a void item to the Observable provided as an argument to the notificationHandler function. If that Observable calls onComplete or onError then repeatWhen will call onCompleted or onError on the child subscription. Otherwise, this Observable will resubscribe to the source observable.\n\n#### Arguments\n1. `notificationHandler`: `Function` - receives an Observable of notifications with which a user can complete or error, aborting the repeat.\n\n#### Returns\n`Observable`: Observable modified with repeat logic\n\n#### Example: Delayed repeat\n```js\nvar source = Rx.Observable.just(42)\n  .repeatWhen(function(notifications) {\n    return notifications.scan(\n      function (acc, x, i) { return acc + i; }, 0)\n    .delay(200)\n    .takeWhile(function (count) {\n      return count < 1;\n    });\n  });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: ' + x);\n  },\n  function (err) {\n    console.log('Error: ' + err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// 200 ms pass\n// => Next: 42\n// 200 ms pass\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/repeatwhen.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/repeatwhen.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/repeatwhen.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/repeatwhen.js)\n"
  },
  {
    "path": "doc/api/core/operators/replay.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.replay([selector], [bufferSize], [window], [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/replay.js \"View in source\")\n\nReturns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n\nThis operator is a specialization of `multicast` using a `Rx.ReplaySubject`.\n\n#### Arguments\n1. `[selector]` *(`Function`)*: Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n2. `[bufferSize]` *(`Number`)*: Maximum element count of the replay buffer.\n3. `[window]` *(`Number`)*: Maximum time length of the replay buffer in milliseconds.\n4. `[scheduler]` *(`Scheduler`)*: Scheduler where connected observers within the selector function will be invoked on.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n\n#### Example\n```js\nvar interval = Rx.Observable.interval(1000);\n\nvar source = interval\n    .take(2)\n    .do(function (x) {\n        console.log('Side effect');\n    });\n\nvar published = source\n    .replay(function (x) {\n        return x.take(2).repeat(2);\n    }, 3);\n\npublished.subscribe(createObserver('SourceA'));\npublished.subscribe(createObserver('SourceB'));\n\nfunction createObserver(tag) {\n    return Rx.Observer.create(\n        function (x) {\n            console.log('Next: ' + tag + x);\n        },\n        function (err) {\n            console.log('Error: ' + err);\n        },\n        function () {\n            console.log('Completed');\n        });\n}\n\n// => Side effect\n// => Next: SourceA0\n// => Side effect\n// => Next: SourceB0\n// => Side effect\n// => Next: SourceA1\n// => Next: SourceA0\n// => Next: SourceA1\n// => Completed\n// => Side effect\n// => Next: SourceB1\n// => Next: SourceB0\n// => Next: SourceB1\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/replay.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/replay.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.binding.js`\n  - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Binding`](http://www.nuget.org/packages/RxJS-Binding/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/replay.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/replay.js)\n"
  },
  {
    "path": "doc/api/core/operators/retry.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.retry([retryCount])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/retry.js \"View in source\")\n\nRepeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\nNote if you encounter an error and want it to retry once, then you must use .retry(2).\n\n#### Arguments\n1. `[retryCount]` *(`Number`)*:  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n\n#### Returns\n*(`Observable`)*: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n\n#### Example\n```js\nvar count = 0;\n\nvar source = Rx.Observable.interval(1000)\n    .selectMany(function () {\n        if (++count < 2) {\n            return Rx.Observable.throw(new Error());\n        }\n        return Rx.Observable.return(42);\n    })\n    .retry(3)\n    .take(1);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/retry.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/retry.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/retry.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/retry.js)\n"
  },
  {
    "path": "doc/api/core/operators/retrywhen.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.retryWhen(notifier)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/retrywhen.js \"View in source\")\n\nRepeats the source observable sequence on error when the notifier emits a next value. If the source observable errors and the notifier completes, it will complete the source sequence.\n\n#### Arguments\n1. `notificationHandler` *(`Function`)*: A handler that is passed an observable sequence of errors raised by the source observable and returns\nan observable that either continues, completes or errors. This behavior is then applied to the source observable.\n\n#### Returns\n*(`Observable`)*: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete.\n\n#### Example: Delayed retry\n```js\nvar source = Rx.Observable.interval(1000)\n    .map(function(n) {\n        if(n === 2) {\n            throw 'ex';\n        }\n        return n;\n    })\n    .retryWhen(function(errors) {\n        return errors.delay(200);\n    })\n    .take(6);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0\n// => Next: 1\n// 200 ms pass\n// => Next: 0\n// => Next: 1\n// 200 ms pass\n// => Next: 0\n// => Next: 1\n// => Completed\n```\n\n#### Example: Erroring an observable after 2 failures\n```js\nvar source = Rx.Observable.interval(1000)\n    .map(function(n) {\n        if(n === 2) {\n            throw 'ex';\n        }\n        return n;\n    })\n    .retryWhen(function(errors) {\n        return errors.scan(function(errorCount, err) {\n            if(errorCount >= 2) {\n                throw err;\n            }\n            return errorCount + 1;\n        }, 0);\n    });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0\n// => Next: 1\n// => Next: 0\n// => Next: 1\n// => Next: 0\n// => Next: 1\n// => Error: 'ex'\n```\n\n#### Example: Completing an observable after 2 failures\n```js\nvar source = Rx.Observable.interval(1000)\n    .map(function(n) {\n        if(n === 2) {\n            throw 'ex';\n        }\n        return n;\n    })\n    .retryWhen(function(errors) {\n        return errors.scan(function(errorCount, err) {\n            return errorCount + 1;\n        }, 0).takeWhile(function(errorCount) {\n            return errorCount < 2;\n        });\n    });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0\n// => Next: 1\n// => Next: 0\n// => Next: 1\n// => Completed\n```\n\n#### Example: An incremental back-off strategy for handling errors\n```js\nRx.Observable.create(function (o) {\n    console.log(\"subscribing\");\n    o.onError(new Error(\"always fails\"));\n  }).retryWhen(function (attempts) {\n      return Rx.Observable.range(1, 3).zip(attempts, function (i) { return i; }).flatMap(function (i) {\n        console.log(\"delay retry by \" + i + \" second(s)\");\n        return Rx.Observable.timer(i * 1000);\n      });\n  }).subscribe();\n  \n/*\nsubscribing\ndelay retry by 1 second(s)\nsubscribing\ndelay retry by 2 second(s)\nsubscribing\ndelay retry by 3 second(s)\nsubscribing\n*/\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/retrywhen.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/retrywhen.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/retrywhen.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/retrywhen.js)\n"
  },
  {
    "path": "doc/api/core/operators/return.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.return(value, [scheduler])` ###\n### `Rx.Observable.just(value, [scheduler])` ###\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/just.js \"View in source\")\n\nReturns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n\nThere is an alias called `returnValue` for browsers <IE9 and a regular alias called `just`.\n\n### Arguments\n1. `value` *(`Any`)*: Single element in the resulting observable sequence.\n2. `[scheduler=Rx.Scheduler.immediate]` *(`Scheduler`)*: Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n\n#### Returns\n*(`Observable`)*: An observable sequence with the single element.\n\n#### Example\n```js\nvar source = Rx.Observable.just(42);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/just.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/just.js)\n\nDist:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/return.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/return.js)\n"
  },
  {
    "path": "doc/api/core/operators/sample.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.sample(interval | sampleObservable)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/sample.js \"View in source\")\n\nSamples the observable sequence at each interval.\n\n#### Arguments\n1. `[interval]` *(`Number`)*: Interval at which to sample (specified as an integer denoting milliseconds)\n2. `[sampleObservable]` *(`Observable`)*: Sampler Observable.\n3. `[scheduler=Rx.Scheduler.timeout]` *(`Scheduler`)*: Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n\n#### Returns\n*(`Observable`)*: Sampled observable sequence.\n\n#### Example\n```js\n/* With an interval time */\nvar source = Rx.Observable.interval(1000)\n    .sample(5000)\n    .take(2);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 4\n// => Next: 9\n// => Completed\n\n/* With a sampler */\nvar source = Rx.Observable.interval(1000)\n    .sample(Rx.Observable.interval(5000))\n    .take(2);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 4\n// => Next: 9\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/sample.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/sample.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.time.js`\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/sample.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/sample.js)\n"
  },
  {
    "path": "doc/api/core/operators/scan.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.scan(accumulator, [seed])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/scan.js \"View in source\")\n\nApplies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n\nFor aggregation behavior with no intermediate results, see `Rx.Observable#reduce`.\n\nNote the `Rx.Observable.prototype.scan([seed], accumulator)` has been removed as per v3.0 and replaced with `Rx.Observable.prototype.scan(accumulator, [seed])`.\n\n#### Arguments\n1. `accumulator` *(`Function`)*: An accumulator function to be invoked on each element with the following arguments:\n    1. `acc`: `Any` - the accumulated value.\n    2. `currentValue`: `Any` - the current value\n    3. `index`: `Number` - the current index\n    4. `source`: `Observable` - the current observable instance\n2. `[seed]` *(`Any`)*: The initial accumulator value.\n\n#### Returns\n*(`Observable`)*: An observable sequence which results from the comonadic bind operation.\n\n#### Example\n```js\n/* Without a seed */\nvar source = Rx.Observable.range(1, 3)\n  .scan(function (acc, x, i, source) { return acc + x; });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 1\n// => Next: 3\n// => Next: 6\n// => Completed\n\n/* With a seed */\nvar source = Rx.Observable.range(1, 3)\n    .scan(function (acc, x, i, source) { return acc * x; }, 1);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 1\n// => Next: 2\n// => Next: 6\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/scan.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/scan.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/scan.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/scan.js)\n"
  },
  {
    "path": "doc/api/core/operators/select.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.select(selector, [thisArg])`\n### `Rx.Observable.prototype.map(selector, [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/map.js \"View in source\")\n\nProjects each element of an observable sequence into a new form by incorporating the element's index. There is an alias for this method called `map`.\n\n#### Arguments\n1. `selector` *(`Function` | `Object`)*:  Transform function to apply to each source element or an element to yield.  If selector is a function, it is called with the following information:\n    1. the value of the element\n    2. the index of the element\n    3. the Observable object being subscribed\n2. `[thisArg]` *(`Any`)*: Object to use as `this` when executing the predicate.\n\n#### Returns\n*(`Observable`)*: An observable sequence which results from the comonadic bind operation.\n\n#### Example\n```js\n// Using a value\nvar md = Rx.Observable.fromEvent(document, 'mousedown').map(true);\nvar mu = Rx.Observable.fromEvent(document, 'mouseup').map(false);\n\n// Using a function\nvar source = Rx.Observable.range(1, 3)\n    .select(function (x, idx, obs) {\n        return x * x;\n    });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 1\n// => Next: 4\n// => Next: 9\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/map.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/map.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/select.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/select.js)\n"
  },
  {
    "path": "doc/api/core/operators/selectmany.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.flatMap(selector, [resultSelector])`\n### `Rx.Observable.prototype.selectMany(selector, [resultSelector])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/flatmap.js \"View in source\")\n\n\nAliases:\n`Rx.Observable.prototype.flatMap`\nand\n`Rx.Observable.prototype.selectMany`\nare equivalent.\n\nOne of the following:\n\nProjects each element of an observable sequence to an observable sequence and merges the resulting observable sequences or Promises or array/iterable into one observable sequence.\n\n```js\nsource.selectMany(function (x, i) { return Rx.Observable.range(0, x); });\nsource.selectMany(function (x, i) { return Promise.resolve(x + 1); });\nsource.selectMany(function (x, i) { return [x, i]; });\n```\n\nProjects each element of an observable sequence or Promise to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n\n```js\nsource.selectMany(function (x, i) { return Rx.Observable.range(0, x); }, function (x, y, ix, iy) { return x + y + ix + iy; });\nsource.selectMany(function (x, i) { return Promise.resolve(x + i); }, function (x, y, ix, iy) { return x + y + ix + iy; });\nsource.selectMany(function (x, i) { return [x, i]; }, function (x, y, ix, iy) { return x + y + ix + iy; });\n```\n\nProjects each element of the source observable sequence to the other observable sequence or Promise, or array/iterable and merges the resulting observable sequences into one observable sequence.\n\n ```js\nsource.selectMany(Rx.Observable.of(1,2,3));\nsource.selectMany(Promise.resolve(42));\nsource.selectMany([1,2,3]);\n ```\n\n#### Arguments\n1. `selector` *(`Function` | `Iterable` | `Promise`)*:  An Object to project to the sequence or a transform function to apply to each element or an observable sequence to project each element from the source sequence onto.  The selector is called with the following information:\n    1. the value of the element\n    2. the index of the element\n    3. the Observable object being subscribed\n\n2. `[resultSelector]` *(`Function`)*: A transform function to apply to each element of the intermediate sequence.  The resultSelector is called with the following information:\n    1. the value of the outer element\n    2. the value of the inner element\n    3. the index of the outer element\n    4. the index of the inner element\n\n#### Returns\n*(`Observable`)*: An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n\n#### Example\n```js\nvar source = Rx.Observable\n  .range(1, 2)\n  .selectMany(function (x) {\n    return Rx.Observable.range(x, 2);\n  });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: ' + x);\n  },\n  function (err) {\n    console.log('Error: ' + err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 1\n// => Next: 2\n// => Next: 2\n// => Next: 3\n// => Completed\n\n/* Using a promise */\nvar source = Rx.Observable.of(1,2,3,4)\n  .selectMany(function (x, i) {\n    return Promise.resolve(x + i);\n  });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: ' + x);\n  },\n  function (err) {\n    console.log('Error: ' + err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 1\n// => Next: 3\n// => Next: 5\n// => Next: 7\n// => Completed\n\n/* Using an array */\nRx.Observable.of(2, 3, 5).selectMany(\n  function(x) {\n    // Return x^2, x^3 and x^4\n    return [\n      x * x,\n      x * x * x,\n      x * x * x * x\n    ];\n  },\n\n  function(outer, inner, outerIndex, innerIndex) {\n    return { outer : outer, inner : inner, outerIdx : outerIndex, innerIdx : innerIndex };\n  }\n).subscribe(\n  function(next) {\n    console.log(\n      'Outer: ' + next.outer + ', Inner: ' + next.inner +\n      ', InnerIndex: ' + next.innerIdx + ', OuterIndex: ' + next.outerIdx\n    );\n  },\n\n  function() {\n    console.log('Completed');\n  }\n);\n\n//=> Outer: 2, Inner: 4, InnerIndex : 0, OuterIndex : 0\n//=> Outer: 2, Inner: 8, InnerIndex : 1, OuterIndex : 0\n//=> Outer: 2, Inner: 16, InnerIndex : 2, OuterIndex : 0\n//=> Outer: 3, Inner: 9, InnerIndex : 0, OuterIndex : 1\n//=> Outer: 3, Inner: 27, InnerIndex : 1, OuterIndex : 1\n//=> Outer: 3, Inner: 81, InnerIndex : 2, OuterIndex : 1\n//...etc\n//=> Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/flatmap.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/flatmap.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/selectmany.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/selectmany.js)\n\n* * *\n"
  },
  {
    "path": "doc/api/core/operators/sequenceequal.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.sequenceEqual(second, [comparer])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/sequenceequal.js \"View in source\")\n\nDetermins whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n\n#### Arguments\n1. `second` *(`Observable` | `Promise` | `Array`)*:  Second observable sequence, Promise or array to compare.\n2. `[comparer]` *(`Function`)*: Comparer used to compare elements of both sequences.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n\n#### Example\n```js\nvar source1 = Rx.Observable.return(42);\nvar source2 = Rx.Observable.return(42);\n\nvar source = source1.sequenceEqual(source2);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: true\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/sequenceequal.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/sequenceequal.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/sequenceequal.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/sequenceequal.js)\n"
  },
  {
    "path": "doc/api/core/operators/share.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.share()`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/share.js \"View in source\")\n\nReturns an observable sequence that shares a single subscription to the underlying sequence.\n\nThis operator is a specialization of `publish` which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n\n#### Example\n```js\n/* Without share */\nvar interval = Rx.Observable.interval(1000);\n\nvar source = interval\n    .take(2)\n    .doAction(function (x) {\n        console.log('Side effect');\n    });\n\nsource.subscribe(createObserver('SourceA'));\nsource.subscribe(createObserver('SourceB'));\n\nfunction createObserver(tag) {\n    return Rx.Observer.create(\n        function (x) {\n            console.log('Next: ' + tag + x);\n        },\n        function (err) {\n            console.log('Error: ' + err);\n        },\n        function () {\n            console.log('Completed');\n        });\n}\n\n// => Side effect\n// => Next: SourceA0\n// => Side effect\n// => Next: SourceB0\n// => Side effect\n// => Next: SourceA1\n// => Completed\n// => Side effect\n// => Next: SourceB1\n// => Completed\n\n/* With share */\nvar interval = Rx.Observable.interval(1000);\n\nvar source = interval\n    .take(2)\n    .do(\n        function (x) {\n            console.log('Side effect');\n        });\n\nvar published = source.share();\n\n// When the number of observers subscribed to published observable goes from\n// 0 to 1, we connect to the underlying observable sequence.\npublished.subscribe(createObserver('SourceA'));\n// When the second subscriber is added, no additional subscriptions are added to the\n// underlying observable sequence. As a result the operations that result in side\n// effects are not repeated per subscriber.\npublished.subscribe(createObserver('SourceB'));\n\nfunction createObserver(tag) {\n    return Rx.Observer.create(\n        function (x) {\n            console.log('Next: ' + tag + x);\n        },\n        function (err) {\n            console.log('Error: ' + err);\n        },\n        function () {\n            console.log('Completed');\n        });\n}\n\n// => Side effect\n// => Next: SourceA0\n// => Next: SourceB0\n// => Side effect\n// => Next: SourceA1\n// => Next: SourceB1\n// => Completed\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/share.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/share.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.binding.js`\n  - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Binding`](http://www.nuget.org/packages/RxJS-Binding/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/publish.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/publish.js)\n"
  },
  {
    "path": "doc/api/core/operators/sharereplay.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.shareReplay([bufferSize], [window], [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/sharereplay.js \"View in source\")\n\nReturns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n\nThis operator is a specialization of `replay` that connects to the connectable observable sequence when the number of observers goes from zero to one, and disconnects when there are no more observers.\n\n#### Arguments\n1. `[bufferSize]` *(`Number`)*: Maximum element count of the replay buffer.\n2. `[window]` *(`Number`)*: Maximum time length of the replay buffer in milliseconds.\n3. `[scheduler]` *(`Scheduler`)*: Scheduler where connected observers within the selector function will be invoked on.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n\n#### Example\n```js\nvar interval = Rx.Observable.interval(1000);\n\nvar source = interval\n    .take(4)\n    .doAction(function (x) {\n        console.log('Side effect');\n    });\n\nvar published = source\n    .shareReplay(3);\n\npublished.subscribe(createObserver('SourceA'));\npublished.subscribe(createObserver('SourceB'));\n\n// Creating a third subscription after the previous two subscriptions have\n// completed. Notice that no side effects result from this subscription,\n// because the notifications are cached and replayed.\nRx.Observable\n    .return(true)\n    .delay(6000)\n    .flatMap(published)\n    .subscribe(createObserver('SourceC'));\n\nfunction createObserver(tag) {\n    return Rx.Observer.create(\n        function (x) {\n            console.log('Next: ' + tag + x);\n        },\n        function (err) {\n            console.log('Error: ' + err);\n        },\n        function () {\n            console.log('Completed');\n        });\n}\n\n// => Side effect\n// => Next: SourceA0\n// => Next: SourceB0\n// => Side effect\n// => Next: SourceA1\n// => Next: SourceB1\n// => Side effect\n// => Next: SourceA2\n// => Next: SourceB2\n// => Side effect\n// => Next: SourceA3\n// => Next: SourceB3\n// => Completed\n// => Completed\n// => Next: SourceC1\n// => Next: SourceC2\n// => Next: SourceC3\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/sharereplay.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/sharereplay.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.binding.js`\n  - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Binding`](http://www.nuget.org/packages/RxJS-Binding/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/replay.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/replay.js)\n"
  },
  {
    "path": "doc/api/core/operators/sharevalue.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.shareValue(value)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/sharevalue.js \"View in source\")\n\nReturns an observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n\nThis operator is a specialization of `publishValue` which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n\n#### Example\n```js\nvar interval = Rx.Observable.interval(1000);\n\nvar source = interval\n    .take(2)\n    .doAction(function (x) {\n        console.log('Side effect');\n    });\n\nvar published = source.shareValue(42);\n\npublished.subscribe(createObserver('SourceA'));\npublished.subscribe(createObserver('SourceB'));\n\nfunction createObserver(tag) {\n    return Rx.Observer.create(\n        function (x) {\n            console.log('Next: ' + tag + x);\n        },\n        function (err) {\n            console.log('Error: ' + err);\n        },\n        function () {\n            console.log('Completed');\n        });\n}\n\n// => Next: SourceA42\n// => Next: SourceB42\n// => Side effect\n// => Next: SourceA0\n// => Next: SourceB0\n// => Side effect\n// => Next: SourceA1\n// => Next: SourceB1\n// => Completed\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/sharevalue.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/sharevalue.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.binding.js`\n  - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Binding`](http://www.nuget.org/packages/RxJS-Binding/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/publishvalue.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/publishvalue.js)\n"
  },
  {
    "path": "doc/api/core/operators/single.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.single([predicate], [thisArg], [defaultValue])`\n### `Rx.Observable.prototype.single([settings])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/first.js \"View in source\")\n\nReturns a single element of an observable sequence that satisfies the condition in the predicate, or a default value if no such element exists.  If no default value is given, then `onError` will be called.  If there are more than one element that matches, then `onError` will be called.\n\n#### Arguments\n\n`Rx.Observable.prototype.single([predicate], [thisArg], [defaultValue])`\n\n1. `[predicate]` *(`Function`)*: A predicate function to evaluate for elements in the source sequence. The callback is called with the following information:\n    1. the value of the element\n    2. the index of the element\n    3. the Observable object being subscribed\n2. `[thisArg]` *(`Any`)*: Object to use as `this` when executing the predicate.\n3. `[defaultValue]` *(`Any`)*: Default value if no such element exists.\n\n`Rx.Observable.prototype.single([settings])`\n1. `[settings]` *(`Object`)*: An object with the following fields\n    - `[predicate]` *(`Function`)*: A predicate function to evaluate for elements in the source sequence. The callback is called with the following information:\n        1. the value of the element\n        2. the index of the element\n        3. the Observable object being subscribed\n    - `[thisArg]` *(`Any`)*: Object to use as `this` when executing the predicate.\n    - `[defaultValue]` *(`Any`)*: Default value if no such element exists.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains elements from the input sequence that satisfy the condition.\n\n#### Example\n```js\n/* with a default value */\nvar source = Rx.Observable.empty().single({defaultValue: 42});\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// => Completed\n\n/* With a predicate */\nvar source = Rx.Observable.range(0, 10)\n  .single(function (x, idx, obs) { return x ===  1; });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 1\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/single.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/single.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/single.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/single.js)\n"
  },
  {
    "path": "doc/api/core/operators/singleinstance.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Observable.prototype.singleInstance()`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/singleinstance.js \"View in source\")\n\nReturns a \"cold\" observable that becomes \"hot\" upon first subscription, and goes \"cold\" again when all subscriptions to it are disposed.\n\nAt first subscription to the returned observable, the source observable is subscribed to. That source subscription is then shared amongst each subsequent simultaneous subscription to the returned observable. \n\nWhen all subscriptions to the returned observable have completed, the source observable subscription is disposed of.\n\nThe first subscription after disposal starts again, subscribing one time to the source observable, then sharing that subscription with each subsequent simultaneous subscription.\n\n#### Returns\n*(`Observable`)*: An observable sequence that stays connected to the source as long as there is at least one subscription to the observable sequence.\n\n#### Example\n```js\nvar interval = Rx.Observable.interval(1000);\n\nvar source = interval\n    .take(2)\n    .doAction(function (x) {\n        console.log('Side effect');\n    });\n\nvar single = source.singleInstance();\n\n// two simultaneous subscriptions, lasting 2 seconds\nsingle.subscribe(createObserver('SourceA'));\nsingle.subscribe(createObserver('SourceB'));\n\nsetTimeout(function(){\n    // resubscribe two times again, more than 5 seconds later,\n    // long after the original two subscriptions have ended\n    single.subscribe(createObserver('SourceC'));\n    single.subscribe(createObserver('SourceD'));\n}, 5000);\n\nfunction createObserver(tag) {\n    return Rx.Observer.create(\n        function (x) {\n            console.log('Next: ' + tag + x);\n        },\n        function (err) {\n            console.log('Error: ' + err);\n        },\n        function () {\n            console.log('Completed: ' + tag);\n        });\n}\n\n// => Side effect\n// => Next: SourceA0\n// => Next: SourceB0\n// => Side effect\n// => Next: SourceA1\n// => Next: SourceB1\n// => Completed: SourceA\n// => Completed: SourceB\n// => Side effect\n// => Next: SourceC0\n// => Next: SourceD0\n// => Side effect\n// => Next: SourceC1\n// => Next: SourceD1\n// => Completed: SourceC\n// => Completed: SourceD\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/singleinstance.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/singleinstance.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.binding.js`\n  - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Binding`](http://www.nuget.org/packages/RxJS-Binding/)\n\nUnit Tests:\n- [`/tests/observable/singleinstance.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/singleinstance.js)\n"
  },
  {
    "path": "doc/api/core/operators/skip.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.skip(count)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/skip.js \"View in source\")\n\nBypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n\n#### Arguments\n1. `count` *(`Number`)*: The number of elements to skip before returning the remaining elements.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains the elements that occur after the specified index in the input sequence.\n\n#### Example\n```js\nvar source = Rx.Observable.range(0, 5)\n    .skip(3);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 3\n// => Next: 4\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/skip.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/skip.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/skip.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/skip.js)\n"
  },
  {
    "path": "doc/api/core/operators/skiplast.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.skipLast(count)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/skiplast.js \"View in source\")\n\nBypasses a specified number of elements at the end of an observable sequence.\n\nThis operator accumulates a queue with a length enough to store the first `count` elements. As more elements are received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n\n#### Arguments\n1. `count` *(`Number`)*: Number of elements to bypass at the end of the source sequence.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n\n#### Example\n```js\nvar source = Rx.Observable.range(0, 5)\n    .skipLast(3);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0\n// => Next: 1\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/skiplast.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/skiplast.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/skiplast.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/skiplast.js)\n"
  },
  {
    "path": "doc/api/core/operators/skiplastwithtime.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.skipLastWithTime(duration, [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/skiplastwithtime.js \"View in source\")\n\nBypasses a specified number of elements at the end of an observable sequence.\n\nThis operator accumulates a queue with a length enough to store the first `count` elements. As more elements are received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n\n#### Arguments\n1. `duration` *(`Number`)*: Duration for skipping elements from the end of the sequence.\n1. `[scheduler=Rx.Scheduler.timeout]` *(`Scheduler`)*: Scheduler to run the timer on. If not specified, defaults to timeout scheduler.\n\n#### Returns\n*(`Observable`)*: An observable sequence with the elements skipped during the specified duration from the end of the source sequence.\n\n#### Example\n```js\nvar source = Rx.Observable.timer(0, 1000)\n    .take(10)\n    .skipLastWithTime(5000);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0\n// => Next: 1\n// => Next: 3\n// => Next: 4\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/skiplastwithtime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/skiplastwithtime.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.time.js`\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n- [`RxJS-Time`](http://www.nuget.org/packages/RxJS-Time/)\n\nUnit Tests:\n- [`/tests/observable/skiplastwithtime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/skiplastwithtime.js)\n"
  },
  {
    "path": "doc/api/core/operators/skipuntil.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.skipUntil(other)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/skipuntil.js \"View in source\")\n\nReturns the values from the source observable sequence only after the other observable sequence produces a value.\n\n#### Arguments\n1. `other` *(`Observable` | `Promise`)*: The observable sequence or Promise that triggers propagation of elements of the source sequence.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n\n#### Example\n```js\nvar source = Rx.Observable.timer(0, 1000)\n    .skipUntil(Rx.Observable.timer(5000));\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 6\n// => Next: 7\n// => Next: 8\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/skipuntil.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/skipuntil.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/skipuntil.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/skipuntil.js)\n"
  },
  {
    "path": "doc/api/core/operators/skipuntilwithtime.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.skipUntilWithTime(startTime, [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/skipuntilwithtime.js \"View in source\")\n\nSkips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n\nErrors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n\n#### Arguments\n1. `startTime` *(`Date` | `Number`)*: Time to start taking elements from the source sequence. If this value is less than or equal to current time, no elements will be skipped.\n2. [`scheduler = Rx.Scheduler.timeout`] *(`Scheduler`)*: Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n\n#### Returns\n*(`Observable`)*: An observable sequence with the elements skipped until the specified start time.\n\n#### Example\n```js\n// Using relative time\nvar source = Rx.Observable.timer(0, 1000)\n    .skipUntilWithTime(5000);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 6\n// => Next: 7\n// => Next: 8\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/skipuntilwithtime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/skipuntilwithtime.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n\nPrerequisites:\n- If using `rx.time.js`\n  - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Time`](http://www.nuget.org/packages/RxJS-Time/)\n\nUnit Tests:\n- [`/tests/observable/skipuntilwithtime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/skipuntilwithtime.js)\n"
  },
  {
    "path": "doc/api/core/operators/skipwhile.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.skipWhile(predicate, [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/skipwhile.js \"View in source\")\n\nBypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n\n#### Arguments\n1. `predicate` *(`Function`)*: A function to test each source element for a condition. The callback is called with the following information:\n    1. the value of the element\n    2. the index of the element\n    3. the Observable object being subscribed\n2. `[thisArg]` *(`Any`)*: Object to use as this when executing callback.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n\n#### Example\n```js\n// With a predicate\nvar source = Rx.Observable.range(1, 5)\n    .skipWhile(function (x) { return x < 3; });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 3\n// => Next: 4\n// => Next: 5\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/skipwhile.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/skipwhile.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/skipwhile.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/skipwhile.js)\n"
  },
  {
    "path": "doc/api/core/operators/slice.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.slice([begin], [end])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/slice.js \"View in source\")\n\nThe `slice` method returns a shallow copy of a portion of an Observable into a new Observable object.  Unlike the `Array` version, this does not support negative numbers for begin or end.\n\n#### Arguments\n1. `[begin]`: `Any`: Zero-based index at which to begin extraction. If omitted, this will default to zero.\n2. `[end]` `Number`: Zero-based index at which to end extraction. slice extracts up to but not including end.\n\n#### Returns\n`Observable`: A shallow copy of a portion of an Observable into a new Observable object.\n\n#### Example\n```js\n/* Without an end */\nvar source = Rx.Observable.of(1,2,3,1,2,3)\n  .slice(3);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n      console.log('Completed');\n  });\n\n// => Next: 2\n// => Next: 3\n// => Completed\n\n/* With an end */\nvar source = Rx.Observable.of(1,2,3,1,2,3)\n  .slice(2, 1);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 3\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/slice.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/slice.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/slice.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/slice.js)\n"
  },
  {
    "path": "doc/api/core/operators/some.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.some([predicate], [thisArg])` ###\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/some.js \"View in source\")\n\nDetermines whether any element of an observable sequence satisfies a condition if present, else if any items are in the sequence.\n\n#### Arguments\n1. `predicate` *(`Function`)*: A function to test each element for a condition.\n2. `[thisArg]` *(`Any`)*: Object to use as this when executing callback.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing a single element determining whether one of the elements in the source sequence pass the test in the specified predicate.\n\n#### Example\n```js\nvar source = Rx.Observable.of(1,2,3,4,5)\n  .some(function (x) { return x % 2 === 0; });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: true\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/some.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/some.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/some.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/some.js)\n"
  },
  {
    "path": "doc/api/core/operators/spawn.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.spawn(fn)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/spawn.js \"View in source\")\n\nSpawns a generator function which allows for Promises, Observable sequences, Arrays, Objects, Generators and functions.\n\n#### Arguments\n1. `fn` *(`Function`)*: The spawning function.\n\n#### Returns\n*(`Observable`)*: An Observable with the final result\n\n#### Example\n```js\nvar Rx = require('rx');\n\nvar spawned = Rx.Observable.spawn(function* () {\n  var a = yield cb => cb(null, 'a');\n  var b = yield ['b'];\n  var c = yield Rx.Observable.just('c');\n  var d = yield Rx.Observable.just('d');\n  var e = yield Promise.resolve('e');\n  return a + b + c + d + e;\n});\n\nspawned.subscribe(\n  function (x) { console.log('next %s', x); },\n  function (e) { console.log('error %s', e); },\n  function () { console.log('completed'); }\n);\n\n// => next 'abcde'\n// => completed\n```\n\n### Location\n\nFile:\n- [/src/core/linq/observable/spawn.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/spawn.js)\n\nDist:\n- [`rx.async.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.js)\n- [`rx.async.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.compat.js)\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n\nPrerequisites:\n- If using `rx.async.js` | `rx.async.compat.js`\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n    - [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Async`](http://www.nuget.org/packages/RxJS-Async)\n\nUnit Tests:\n- [``/tests/observable/spawn.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/spawn.js)\n"
  },
  {
    "path": "doc/api/core/operators/start.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.start(func, [context], [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/start.js \"View in source\")\n\nInvokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.\n\n### Arguments\n1. `func` *(`Function`)*: Function to run asynchronously.\n2. `[context]` *(`Any`)*: The context for the func parameter to be executed.  If not specified, defaults to undefined.\n3. `[scheduler=Rx.Scheduler.timeout]` *(`Scheduler`)*: Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n\n#### Returns\n*(`Observable`)*: An observable sequence exposing the function's result value, or an exception.\n\n#### Example\n```js\nvar context = { value: 42 };\n\nvar source = Rx.Observable.start(\n    function () {\n        return this.value;\n    },\n    context,\n    Rx.Scheduler.timeout\n);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n// => Completed\n```\n\n### Location\n\nFile:\n- [/src/core/linq/observable/start.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/start.js)\n\nDist:\n- [`rx.async.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.js)\n- [`rx.async.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using rx.async.js | rx.async.compat.js\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n    - [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All)\n- [`RxJS-Async`](http://www.nuget.org/packages/RxJS-Async)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [/tests/observable/start.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/start.js)\n"
  },
  {
    "path": "doc/api/core/operators/startasync.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.startAsync(functionAsync)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/startasync.js \"View in source\")\n\nInvokes the asynchronous function, surfacing the result through an observable sequence.\n\n### Arguments\n1. `functionAsync` *(`Function`)*: Asynchronous function which returns a Promise to run.\n\n#### Returns\n*(`Observable`)*: An observable sequence exposing the function's Promises's value or error.\n\n#### Example\n```js\nvar source = Rx.Observable.startAsync(function () {\n    return RSVP.Promise.resolve(42);\n});\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n// => Completed\n```\n\n### Location\n\nFile:\n- [/src/core/linq/observable/startasync.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/startasync.js)\n\nDist:\n- [`rx.async.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.js)\n- [`rx.async.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.async.js` | `rx.async.compat.js`\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n    - [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Async`](http://www.nuget.org/packages/RxJS-Async)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [/tests/observable/startasync.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/start.js)\n"
  },
  {
    "path": "doc/api/core/operators/startwith.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.startWith([scheduler] ...args)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/startwith.js \"View in source\")\n\nPrepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n\n#### Arguments\n1. `[scheduler]` *(`Scheduler`)*: Scheduler to execute the function.\n2. `args` *(arguments)*: Values to prepend to the observable sequence.\n\n#### Returns\n*(`Observable`)*: The source sequence prepended with the specified values.\n\n#### Example\n```js\nvar source = Rx.Observable.return(4)\n    .startWith(1, 2, 3)\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 1\n// => Next: 2\n// => Next: 3\n// => Next: 4\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/startwith.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/startwith.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/startwith.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/startwith.js)\n"
  },
  {
    "path": "doc/api/core/operators/subscribe.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.subscribe([observer] | [onNext], [onError], [onCompleted])`\n### `Rx.Observable.prototype.forEach([observer] | [onNext], [onError], [onCompleted])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/observable.js \"View in source\")\n\nSubscribes an observer to the observable sequence.\n\n#### Arguments\n1. `[observer]` *(Observer)*: The object that is to receive notifications.\n1. `[onNext]` *(`Function`)*: Function to invoke for each element in the observable sequence.\n2. `[onError]` *(`Function`)*: Function to invoke upon exceptional termination of the observable sequence.\n3. `[onCompleted]` *(`Function`)*: Function to invoke upon graceful termination of the observable sequence.\n\n#### Returns\n*(Disposable)*: The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n\n#### Example\n```js\n/* With no arguments */\nvar source = Rx.Observable.range(0, 3)\n    .do(function (x) { console.log('Do Next: ' + x); });\n\nvar subscription = source.subscribe();\n\n// => Do Next: 0\n// => Do Next: 1\n// => Do Next: 2\n\n/* With an observer */\nvar observer = Rx.Observer.create(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\nvar source = Rx.Observable.range(0, 3)\n\nvar subscription = source.subscribe(observer);\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n\n/* Using functions */\nvar source = Rx.Observable.range(0, 3)\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n```\n\n### Location\n\nFile:\n- [`/src/core/observable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/observable.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/core/observable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/core/observable.js)\n"
  },
  {
    "path": "doc/api/core/operators/subscribeon.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.subscribeOn(scheduler)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/subscribeon.js \"View in source\")\n\nWraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler.\n\nThis only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer callbacks on a scheduler, use `observeOn`.\n\n#### Arguments\n1. `scheduler` *(`Scheduler`)*:  Scheduler to notify observers on.\n\n#### Returns\n*(`Observable`)*: The source sequence whose observations happen on the specified scheduler.\n\n#### Example\n```js\nvar observable = Rx.Observable.create(function (observer) {\n    function handler () {\n        observer.onNext(42);\n        observer.onCompleted();\n    }\n\n    // Change scheduler for here\n    var id = setTimeout(handler, 1000);\n\n    return function () {\n        // And change scheduler for here\n        if (id) clearTimeout(id);\n    };\n});\n\n// Change the scheduler to timeout for subscribe/unsubscribe\nvar source = observable.subscribeOn(Rx.Scheduler.timeout);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/subscribeon.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/subscribeon.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n\nUnit Tests:\n- [`/tests/observable/subscribeon.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/subscribeon.js)\n"
  },
  {
    "path": "doc/api/core/operators/subscribeoncompleted.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.subscribeOnCompleted(onCompleted, [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/observable.js \"View in source\")\n\nSubscribes a function to invoke upon graceful termination of the observable sequence.\n\n#### Arguments\n1. `onCompleted` *(`Function`)*: Function to invoke upon graceful termination of the observable sequence.\n2. `[thisArg]` *(`Any`)*: Object to use as this when executing callback.\n\n#### Returns\n*(Disposable)*: The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n\n#### Example\n```js\n/* Using functions */\nvar source = Rx.Observable.range(0, 3);\n\nvar subscription = source.subscribeOnCompleted(\n  function () {\n    console.log('Completed');\n  });\n\n// => Completed\n\n/* With a thisArg */\nvar source = Rx.Observable.range(0, 3);\n\nvar subscription = source.subscribeOnCompleted(\n  function (err) {\n    this.log('Completed');\n  }, console);\n\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/observable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/observable.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/core/observable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/core/observable.js)\n"
  },
  {
    "path": "doc/api/core/operators/subscribeonerror.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.subscribeOnError(onError, [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/observable.js \"View in source\")\n\nSubscribes a function to invoke upon exceptional termination of the observable sequence.\n\n#### Arguments\n1. `onError` *(`Function`)*: Function to invoke upon exceptional termination of the observable sequence.\n2. `[thisArg]` *(`Any`)*: Object to use as this when executing callback.\n\n#### Returns\n*(Disposable)*: The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n\n#### Example\n```js\n/* Using functions */\nvar source = Rx.Observable.throw(new Error());\n\nvar subscription = source.subscribeOnError(\n  function (err) {\n    console.log('Error: %s', err);\n  });\n\n// => Error: Error\n\n/* With a thisArg */\nvar source = Rx.Observable.throw(new Error());\n\nvar subscription = source.subscribeOnError(\n  function (err) {\n    this.log('Error: %s', err);\n  }, console);\n\n// => Error: Error\n```\n\n### Location\n\nFile:\n- [`/src/core/observable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/observable.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/core/observable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/core/observable.js)\n"
  },
  {
    "path": "doc/api/core/operators/subscribeonnext.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.subscribeOnNext(onNext, [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/observable.js \"View in source\")\n\nSubscribes a function to invoke for each element in the observable sequence.\n\n#### Arguments\n1. `onNext` *(`Function`)*: Function to invoke for each element in the observable sequence.\n2. `[thisArg]` *(`Any`)*: Object to use as this when executing callback.\n\n#### Returns\n*(Disposable)*: The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n\n#### Example\n```js\n/* Using functions */\nvar source = Rx.Observable.range(0, 3)\n\nvar subscription = source.subscribeOnNext(\n  function (x) {\n    console.log('Next: %s', x);\n  });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n\n/* With a thisArg */\nvar source = Rx.Observable.range(0, 3)\n\nvar subscription = source.subscribeOnNext(\n  function (x) {\n    this.log('Next: %s', x);\n  }, console);\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n```\n\n### Location\n\nFile:\n- [`/src/core/observable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/observable.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/core/observable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/core/observable.js)\n"
  },
  {
    "path": "doc/api/core/operators/sum.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.sum([keySelector], [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/sum.js \"View in source\")\n\nComputes the sum of a sequence of values that are obtained by invoking an optional transform function on each element of the input sequence, else if not specified computes the sum on each item in the sequence.\n\n#### Arguments\n1. `[keySelector]` *(`Scheduler`)*:  A transform function to apply to each element.  The callback is called with the following information:\n    1. the value of the element\n    2. the index of the element\n    3. the Observable object being subscribed\n\n#### Returns\n*(`Observable`)*: An observable sequence containing a single element with the sum of the values in the source sequence.\n\n#### Example\n```js\n/* Without a selector */\nvar source = Rx.Observable.range(1, 10)\n    .sum();\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 55\n// => Completed\n\n/* With a selector */\nvar array = [\n    { value: 1 },\n    { value: 2 },\n    { value: 3 }\n];\n\nvar source = Rx.Observable\n    .from(array)\n    .sum(function (x, idx, obs) {\n        return x.value;\n    });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 6\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/sum.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/sum.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nPrerequisites:\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/sum.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/sum.js)\n"
  },
  {
    "path": "doc/api/core/operators/switch.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.switch()`\n### `Rx.Observable.prototype.switchLatest()` *DEPRECATED*\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/switch.js \"View in source\")\n\nTransforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.  There is an alias for this method called `switchLatest` for browsers <IE9.\n\n#### Returns\n*(`Observable`)*: The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n\n#### Example\n```js\nvar source = Rx.Observable.range(0, 3)\n    .select(function (x) { return Rx.Observable.range(x, 3); })\n    .switch();\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n// => Next: 3\n// => Next: 4\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/switch.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/switch.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/switch.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/switch.js)\n\n* * *\n"
  },
  {
    "path": "doc/api/core/operators/switchfirst.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.switchFirst()` ##\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/switchfirst.js \"View in source\")\n\nReceives an `Observable` of `Observables` and propagates the first `Observable` exclusively until it completes before it begins subscribes to the next `Observable`.  Observables that come before the current Observable completes will be dropped and will not propagate.\n\nThis operator is similar to `concatAll()` except that it will not hold onto Observables that come in before the current one is finished completed.\n\n\n#### Returns\n*(`Observable`)*: An Observable sequence that is the result of concatenating non-overlapping items emitted by an Observable of Observables.\n\n#### Example\n\n```javascript\n\n//Generate an event every 100 milliseconds\nvar source = Rx.Observable.generateWithRelativeTime(\n   0,\n   function(x) {return x < 5; },\n   function(x) {return x + 1; },\n   function(x) {return x; },\n   function(x) {return 100; })\n  .map(function(value) {\n    //Observable takes 150 milliseconds to complete\n    return Rx.Observable.timer(150).map(value);\n  });\n\n\nsource.exclusive().subscribe(\n   function (x) {\n    console.log(\"Next %d\", x);\n   }, function(e) {\n    console.log(\"Error %s\", e);\n   }, function() {\n    console.log(\"Completed\");\n   });\n\n\n// Next 0\n// Next 2\n// Next 4\n// Completed\n```\n\n\n#### Location\n\nFile:\n- [`/src/core/linq/observable/switchfirst.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/switchfirst.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.experimental.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.experimental.js)\n- [`rx.experimental-lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.experimental-lite.js)\n- [`rx.experimental-lite-compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.experimental-lite-compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Experimental`](http://www.nuget.org/packages/RxJS-Experimental/)\n\nUnit Tests:\n- None\n"
  },
  {
    "path": "doc/api/core/operators/take.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.take(count, [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/take.js \"View in source\")\n\nReturns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of `take(0)`.\n\n#### Arguments\n1. `count` *(`Number`)*: The number of elements to return.\n2. `[scheduler]` *(`Scheduler`)*: Scheduler used to produce an onCompleted message in case `count` is set to 0.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains the elements before and including the specified index in the input sequence.\n\n#### Example\n```js\nvar source = Rx.Observable.range(0, 5)\n    .take(3);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/take.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/take.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/take.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/take.js)\n"
  },
  {
    "path": "doc/api/core/operators/takelast.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.takeLast(count)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/takelast.js \"View in source\")\n\nReturns a specified number of contiguous elements from the end of an observable sequence, using an optional scheduler to drain the queue.\n\nThis operator accumulates a buffer with a length enough to store elements count elements. Upon completion of the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n\n#### Arguments\n1. `count` *(`Number`)*: Number of elements to bypass at the end of the source sequence.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n\n#### Example\n```js\nvar source = Rx.Observable.range(0, 5)\n    .takeLast(3);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 2\n// => Next: 3\n// => Next: 4\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/takelast.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/takelast.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/takelast.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/takelast.js)\n"
  },
  {
    "path": "doc/api/core/operators/takelastbuffer.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.takeLastBuffer(count)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/takelastbuffer.js \"View in source\")\n\nReturns an array with the specified number of contiguous elements from the end of an observable sequence.\n\n#### Arguments\n1. `count` *(`Number`)*: Number of elements to bypass at the end of the source sequence.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n\n#### Example\n```js\nvar source = Rx.Observable.range(0, 5)\n    .takeLastBuffer(3);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 2,3,4\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/takelastbuffer.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/takelastbuffer.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.extras.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.extras.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/takelastbuffer.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/takelastbuffer.js)\n"
  },
  {
    "path": "doc/api/core/operators/takelastbufferwithtime.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.takeLastBufferWithTime(duration, [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/takelastbufferwithtime.js \"View in source\")\n\nReturns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n\nThis operator accumulates a queue with a length enough to store elements received during the initial duration window. As more elements are received, elements older than the specified duration are taken from the queue and produced on the result sequence. This causes elements to be delayed with duration.\n\n#### Arguments\n1. `duration` *(`Number`)*: Duration for taking elements from the end of the sequence.\n2. `[scheduler=Rx.Scheduler.timeout]` *(`Scheduler`)*: Scheduler to run the timer on. If not specified, defaults to timeout scheduler.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence.\n\n#### Example\n```js\nvar source = Rx.Observable\n    .timer(0, 1000)\n    .take(10)\n    .takeLastBufferWithTime(5000);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 5,6,7,8,9\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/takelastbufferwithtime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/takelastbufferwithtime.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n\nPrerequisites:\n- If using `rx.time.js`\n  - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-Time/)\n- [`RxJS-Time`](http://www.nuget.org/packages/RxJS-Time/)\n\nUnit Tests:\n- [`/tests/observable/takelastbufferwithtime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/takelastbufferwithtime.js)\n\n* * *\n"
  },
  {
    "path": "doc/api/core/operators/takelastwithtime.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.takeLastWithTime(duration, [timeScheduler], [loopScheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/takelastwithtime.js \"View in source\")\n\nReturns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements.\n\n#### Arguments\n1. `duration` *(`Number`)*: Duration for taking elements from the end of the sequence.\n2. `[timeScheduler=Rx.Scheduler.timeout]` *(`Scheduler`)*: Scheduler to run the timer on. If not specified, defaults to timeout scheduler.\n2. `[loopScheduler=Rx.Scheduler.currentThread]` *(`Scheduler`)*: Scheduler to drain the collected elements. If not specified, defaults to current thread scheduler.\n\n#### Returns\n*(`Observable`)*: An observable sequence with the elements taken during the specified duration from the end of the source sequence.\n\n#### Example\n```js\nvar source = Rx.Observable.timer(0, 1000)\n    .take(10)\n    .takeLastWithTime(5000);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 5\n// => Next: 6\n// => Next: 7\n// => Next: 8\n// => Next: 9\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/takelastwithtime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/takelastwithtime.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.time.js`\n  - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Time`](http://www.nuget.org/packages/RxJS-Time/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/skipuntilwithtime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/takelastwithtime.js)\n"
  },
  {
    "path": "doc/api/core/operators/takeuntil.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.takeUntil(other)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/takeuntil.js \"View in source\")\n\nReturns the values from the source observable sequence until the other observable sequence or Promise produces a value.\n\n#### Arguments\n1. `other` *(`Observable` | `Promise`)*: Observable sequence or Promise that terminates propagation of elements of the source sequence.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing the elements of the source sequence up to the point the other sequence or Promise interrupted further propagation.\n\n#### Example\n```js\nvar source = Rx.Observable.timer(0, 1000)\n    .takeUntil(Rx.Observable.timer(5000));\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n// => Next: 3\n// => Next: 4\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/takeuntil.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/takeuntil.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/takeuntil.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/takeuntil.js)\n"
  },
  {
    "path": "doc/api/core/operators/takeuntilwithtime.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### <a id=\"rxobservableprototypetakeuntilwithtimeendtime-scheduler\"></a>`Rx.Observable.prototype.takeUntilWithTime(endTime, [scheduler])`\n<a href=\"#rxobservableprototypetakeuntilwithtimeendtime-scheduler\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/takeuntil.js \"View in source\")\n\nReturns the values from the source observable sequence until the end time.\n\n#### Arguments\n1. `endTime` *(`Date` | `Number`)*: Time to stop taking elements from the source sequence. If this value is less than or equal to the current time, the result stream will complete immediately.\n2. [`scheduler`] *(`Scheduler`)*: Scheduler to run the timer on.\n\n#### Returns\n*(`Observable`)*: An observable sequence with the elements taken until the specified end time.\n\n#### Example\n```js\nvar source = Rx.Observable.timer(0, 1000)\n    .takeUntilWithTime(5000);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n// => Next: 3\n// => Next: 4\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/takeuntilwithtime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/takeuntilwithtime.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n\nPrerequisites:\n- If using `rx.time.js`\n  - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Time`](http://www.nuget.org/packages/RxJS-Time/)\n\nUnit Tests:\n- [`/tests/observable/takeuntilwithtime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/takeuntilwithtime.js)\n"
  },
  {
    "path": "doc/api/core/operators/takewhile.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.takeWhile(predicate, [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/takewhile.js \"View in source\")\n\nReturns elements from an observable sequence as long as a specified condition is true.\n\n#### Arguments\n1. `predicate` *(`Function`)*: A function to test each source element for a condition. The callback is called with the following information:\n    1. the value of the element\n    2. the index of the element\n    3. the Observable object being subscribed\n2. `[thisArg]` *(`Any`)*: Object to use as this when executing callback.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n\n#### Example\n```js\n// With a predicate\nvar source = Rx.Observable.range(1, 5)\n    .takeWhile(function (x) { return x < 3; });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/takewhile.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/takewhile.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/takewhile.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/takewhile.js)\n"
  },
  {
    "path": "doc/api/core/operators/thendo.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.thenDo(selector)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/thendo.js \"View in source\")\n\nMatches when the observable sequence has an available value and projects the value.\n\n#### Arguments\n1. `selector` *(`Function`)*: Selector that will be invoked for values in the source sequence.\n\n#### Returns\n*(`Plan`)*: Plan that produces the projected values, to be fed (with other plans) to the when operator.\n\n#### Example\n```js\nvar selector = function (x, y) { return x + \", \" + y; };\n\nvar source = Rx.Observable.when(\n    Rx.Observable.interval(250).and(Rx.Observable.of(\"A\", \"B\", \"C\")).thenDo(selector),\n    Rx.Observable.interval(300).and(Rx.Observable.of(\"a\", \"b\")).thenDo(selector)\n);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0, A \n// => Next: 0, a\n// => Next: 1, B\n// => Next: 1, b\n// => Next: 2, C\n// => Completed\n```\n\n### Location\n\nFile:\n- [/src/core/linq/observable/thendo.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/thendo.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.joinpatterns.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.joinpatterns.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All)\n- [`RxJS-JoinPatterns`](http://www.nuget.org/packages/RxJS-JoinPatterns)\n\nUnit Tests:\n- [/tests/observable/when.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/when.js)\n"
  },
  {
    "path": "doc/api/core/operators/throttle.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.throttle(windowDuration, [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/throttle.js \"View in source\")\n\nReturns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n\n#### Arguments\n1. `windowDuration` *(`Number`)*: Time to wait before emitting another item after emitting the last item (specified as an integer denoting milliseconds).\n2. `[scheduler]` *(`Scheduler`)*:  The Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to the default scheduler.\n\n#### Returns\n*(`Observable`)*: An Observable that performs the throttle operation.\n\n#### Example\n```js\nvar times = [\n  { value: 0, time: 100 },\n  { value: 1, time: 600 },\n  { value: 2, time: 400 },\n  { value: 3, time: 900 },\n  { value: 4, time: 200 }\n];\n\n// Delay each item by time and project value;\nvar source = Rx.Observable.from(times)\n  .flatMap(function (item) {\n    return Rx.Observable\n      .of(item.value)\n      .delay(item.time);\n  })\n  .throttle(300 /* ms */);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0\n// => Next: 2\n// => Next: 3\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/throttle.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/throttle.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.time.js`\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n- [`RxJS-Time`](http://www.nuget.org/packages/RxJS-Time/)\n\nUnit Tests:\n- [`/tests/observable/throttle.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/throttle.js)\n"
  },
  {
    "path": "doc/api/core/operators/throw.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.throw(exception, [scheduler])`\n### `Rx.Observable.throwError(exception, [scheduler])`\n### `Rx.Observable.throwException(exception, [scheduler])` ** DEPRECATED **\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/throw.js \"View in source\")\n\nReturns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n\n### Arguments\n1. `exception` *(Error)*: Error the observable sequence terminates with.\n2. `[scheduler=Rx.Scheduler.immediate]` *(`Scheduler`)*: Scheduler to send the exceptional termination call on. If not specified, defaults to the immediate scheduler.\n\n#### Returns\n*(`Observable`)*: The observable sequence that terminates exceptionally with the specified exception object.\n\n#### Example\n```js\nvar source = Rx.Observable.return(42)\n    .selectMany(Rx.Observable.throw(new Error('error!')));\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Error: Error: error!\n```\n\n### Location\n\nFile:\n- [/src/core/perf/operators/throw.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/throw.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [/tests/observable/throw.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/throw.js)\n"
  },
  {
    "path": "doc/api/core/operators/timeinterval.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.timeInterval([scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/timeinterval.js \"View in source\")\n\nRecords the time interval between consecutive values in an observable sequence.\n\n#### Arguments\n1. `[scheduler=Rx.Observable.timeout]` *(`Scheduler`)*: Scheduler used to compute time intervals. If not specified, the timeout scheduler is used.\n\n#### Returns\n*(`Observable`)*: An observable sequence with time interval information on values.\n\n#### Example\n```js\nvar source = Rx.Observable.timer(0, 1000)\n    .timeInterval()\n    .map(function (x) { return x.value + ':' + x.interval; })\n    .take(5);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0:0\n// => Next: 1:1000\n// => Next: 2:1000\n// => Next: 3:1000\n// => Next: 4:1000\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/timeinterval.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/timeinterval.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n\nPrerequisites:\n- If using `rx.time.js`\n  - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Time`](http://www.nuget.org/packages/RxJS-Time/)\n\nUnit Tests:\n- [`/tests/observable/timeinterval.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/timeinterval.js)\n"
  },
  {
    "path": "doc/api/core/operators/timeout.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.timeout(dueTime, [other], [scheduler])`\n### `Rx.Observable.prototype.timeout([firstTimeout], timeoutDurationSelector, [other])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/timeout.js \"View in source\")\n\nReturns the source observable sequence or the other observable sequence if dueTime elapses.\n\n--OR--\n\nReturns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n\n#### Arguments\n\nIf using a relative or absolute time:\n\n1. `dueTime` *(Date | Number)*: Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n2. `[other]` *(`Observable` | `Promise` | `Error`)*: Observable sequence or Promise to return in case of a timeout. If a string is specified, then an error will be thrown with the given error message.  If not specified, a timeout error throwing sequence will be used.\n3. `[scheduler]` *(`Scheduler`)*: Scheduler to run the timeout timers on. If not specified, the default scheduler is used.\n\nIf using a timeout duration selector:\n\n1. `[firstTimeout]` *(`Observable`)*: Observable sequence that represents the timeout for the first element. If not provided, this defaults to `Rx.Observable.never()`.\n2. `timeoutDurationSelector` *(`Function`)*: Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n3. `[other]` *(`Scheduler`)*:Sequence to return in case of a timeout. If not provided, this is set to `Observable.throw`\n\n#### Returns\n*(`Observable`)*: An observable sequence with time interval information on values.\n\n#### Example\n```js\n/* With no other */\nvar source = Rx.Observable\n  .just(42)\n  .delay(5000)\n  .timeout(200);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Error: Error: Timeout\n\n/* With message */\nvar source = Rx.Observable\n  .just(42)\n  .delay(5000)\n  .timeout(200, new Error('Timeout has occurred.'));\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Error: Error: Timeout has occurred.\n\n/* With an observable */\nvar source = Rx.Observable\n  .just(42)\n  .delay(5000)\n  .timeout(200, Rx.Observable.empty());\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Completed\n\n/* With a Promise */\nvar source = Rx.Observable\n  .just(42)\n  .delay(5000)\n  .timeout(200, Promise.resolve(42));\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// => Completed\n\n/* without a first timeout */\nvar array = [\n  200,\n  300,\n  350,\n  400\n];\n\nvar source = Rx.Observable\n  .for(array, function (x) { return Rx.Observable.timer(x); })\n  .map(function (x, i) { return i; })\n  .timeout(function (x) { return Rx.Observable.timer(400); });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n// => Error: Error: Timeout\n\n/* With no other */\nvar array = [\n  200,\n  300,\n  350,\n  400\n];\n\nvar source = Rx.Observable\n  .for(array, function (x) { return Rx.Observable.timer(x); })\n  .map(function (x, i) { return i; })\n  .timeout(\n    Rx.Observable.timer(250),\n    function (x) { return Rx.Observable.timer(400); }\n  );\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n// => Error: Error: Timeout\n\n/* With other */\nvar array = [\n  200,\n  300,\n  350,\n  400\n];\n\nvar source = Rx.Observable\n  .for(array, function (x) { return Rx.Observable.timer(x); })\n  .map(function (x, i) { return i; })\n  .timeout(\n    Rx.Observable.timer(250),\n    function (x) { return Rx.Observable.timer(400); },\n    Rx.Observable.just(42)\n  );\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0\n// => Next: 1\n// => Next: 2\n// => Next: 42\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/timeout.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/timeout.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n- [`RxJS-Time`](http://www.nuget.org/packages/RxJS-Time/)\n\nUnit Tests:\n- [`/tests/observable/timeout.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/timeout.js)\n"
  },
  {
    "path": "doc/api/core/operators/timer.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.timer(dueTime, [period], [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/timer.js \"View in source\")\n\nReturns an observable sequence that produces a value after dueTime has elapsed and then after each period.  Note for `rx.lite.js`, only\nrelative time is supported.\n\n### Arguments\n1. `dueTime` *(Date|Number)*: Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n2. `[period|scheduler=Rx.Scheduler.timeout]` *(Number|Scheduler)*: Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n3. `[scheduler=Rx.Scheduler.timeout]` *(`Scheduler`)*: Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n\n#### Returns\n*(`Observable`)*: An observable sequence that produces a value after due time has elapsed and then each period.\n\n#### Example\n```js\nvar source = Rx.Observable.timer(200, 100)\n    .timeInterval()\n    .pluck('interval')\n    .take(3);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 200\n// => Next: 100\n// => Next: 100\n// => Completed\n```\n\n### Location\n\nFile:\n- [/src/core/linq/observable/timer.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/timer.js)\n- [/src/core/linq/observable/timer-lite.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/timer-lite.js)\n\nDist:\n- [rx.all.js](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [rx.all.compat.js](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [rx.time.js](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- [`rx`](https://www.npmjs.org/package/rx).time.js\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | rx.lite.compat.js\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Time`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Time`](http://www.nuget.org/packages/RxJS-Time/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [/tests/observable/timer.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/timer.js)\n"
  },
  {
    "path": "doc/api/core/operators/timestamp.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.timestamp([scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/timestamp.js \"View in source\")\n\nRecords the timestamp for each value in an observable sequence.\n\n#### Arguments\n1. `[scheduler=Rx.Observable.timeout]` *(`Scheduler`)*: Scheduler used to compute timestamps. If not specified, the timeout scheduler is used.\n\n#### Returns\n*(`Observable`)*: An observable sequence with timestamp information on values.\n\n#### Example\n```js\nvar source = Rx.Observable.timer(0, 1000)\n    .timestamp()\n    .map(function (x) { return x.value + ':' + x.timestamp; })\n    .take(5);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0:1378690776351\n// => Next: 1:1378690777313\n// => Next: 2:1378690778316\n// => Next: 3:1378690779317\n// => Next: 4:1378690780319\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/timestamp.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/timestamp.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n- [`RxJS-Time`](http://www.nuget.org/packages/RxJS-Time/)\n\nUnit Tests:\n- [`/tests/observable/timestamp.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/timestamp.js)\n"
  },
  {
    "path": "doc/api/core/operators/toarray.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.toArray()`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/toarray.js \"View in source\")\n\nCreates a list from an observable sequence.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing a single element with a list containing all the elements of the source sequence.\n\n#### Example\n```js\nvar source = Rx.Observable.timer(0, 1000)\n    .take(5)\n    .toArray();\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: [0,1,2,3,4]\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/toarray.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/toarray.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/toarray.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/toarray.js)\n"
  },
  {
    "path": "doc/api/core/operators/toasync.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.toAsync(func, [context], [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/toasync.js \"View in source\")\n\nConverts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n\n### Arguments\n1. `func` *(`Function`)*: Function to convert to an asynchronous function.\n2. `[context]` *(`Any`)*: The context for the func parameter to be executed.  If not specified, defaults to undefined.\n3. `[scheduler=Rx.Scheduler.timeout]` *(`Scheduler`)*: Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n\n#### Returns\n*(`Function`)*: Asynchronous function.\n\n#### Example\n```js\nvar func = Rx.Observable.toAsync(function (x, y) {\n    return x + y;\n});\n\n// Execute function with 3 and 4\nvar source = func(3, 4);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 7\n// => Completed\n```\n\n### Location\n\nFile:\n- [/src/core/linq/observable/toasync.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/toasync.js)\n\nDist:\n- [`rx.async.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.js)\n- [`rx.async.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.compat.js)\n\nPrerequisites:\n- [`rx`](https://www.npmjs.org/package/rx).async.js | rx.async.compat.js\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`rx`](https://www.npmjs.org/package/rx)JS-Binding\n\nUnit Tests:\n- [/tests/observable/toasync.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/toasync.js)\n"
  },
  {
    "path": "doc/api/core/operators/tomap.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.toMap(keySelector, [elementSelector])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/tomap.js \"View in source\")\n\nConverts the observable sequence to a Map if it exists.  Note that this only works in an ES6 environment or polyfilled.\n\n#### Arguments\n1. `keySelector` *(`Function`)*: A function which produces the key for the Map.\n2. `[elementSelector]` *(`Function`)*: An optional function which produces the element for the Map. If not present, defaults to the value from the observable sequence.\n\n#### Returns\n*(`Observable`)*: An observable sequence with a single value of a Map containing the values from the observable sequence.\n\n#### Example\n```js\nvar source = Rx.Observable.timer(0, 1000)\n    .take(5)\n    .toMap(function (x) { return x * 2; }, function (x) { return x * 4; });\n\nvar subscription = source.subscribe(\n    function (x) {\n        var arr = [];\n        x.forEach(function (value, key) { arr.push(value, key); })\n        console.log('Next: ' + arr);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: [0,0,2,4,4,8,6,12,8,16]\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/tomap.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/tomap.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/tomap.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/tomap.js)\n"
  },
  {
    "path": "doc/api/core/operators/topromise.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.toPromise([promiseCtor])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/topromise.js \"View in source\")\n\nConverts an Observable sequence to a ES2015 compliant promise.\n\n#### Arguments\n1. `[promiseCtor]` *(Promise)*: An ES2015 compliant Promise that can be created.  This is optional.  If your runtime already supports ES2015 promises, you do not need to fill in this parameter.  Alternatively you can specify an ES2015 complaint promise via `Rx.config.Promise`\n\n#### Returns\n*(`Promise`)*: An ES2015 compliant promise which contains the last value from the Observable sequence. If the Observable sequence is in error, then the Promise will be in the rejected stage. If the sequence is empty, the Promise will not resolve.\n\n#### Example\n```es6\n/* Using normal ES2015 */\nlet source = Rx.Observable\n  .just(42)\n  .toPromise();\n\nsource.then((value) => console.log('Value: %s', value));\n// => Value: 42\n\n/* Rejected Promise */\n/* Using normal ES2015 */\nlet source = Rx.Observable\n  .throw(new Error('woops'))\n  .toPromise();\n\nsource\n  .then((value) => console.log('Value: %s', value))\n  .catch((err) => console.log('Error: %s', err));\n// => Error: Error: woops\n\n/* Setting via the config */\nRx.config.Promise = RSVP.Promise;\n\nlet source = Rx.Observable\n  .just(42)\n  .toPromise();\n\nsource.then((value) => console.log('Value: %s', value));\n// => Value: 42\n\n\n/* Setting via the method */\nlet source = Rx.Observable\n  .just(42)\n  .toPromise(RSVP.Promise);\n\nsource.then((value) => console.log('Value: %s', value));\n// => Value: 42\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/topromise.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/topromise.js)\n\nDist:\n- [`rx.async.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.js)\n- [`rx.async.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- If using `rx.async.js` | `rx.async.compat.js`\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n    - [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Async`](http://www.nuget.org/packages/RxJS-Async)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/fromnodecallback.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/topromise.js)\n"
  },
  {
    "path": "doc/api/core/operators/toset.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.toSet()`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/toset.js \"View in source\")\n\nCreates an observable sequence with a single item of a Set created from the observable sequence.  Note that this only works in an ES6 environment or polyfilled.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing a single element with a Set containing all the elements of the source sequence.\n\n#### Example\n```js\nvar source = Rx.Observable.timer(0, 1000)\n    .take(5)\n    .toSet();\n\nvar subscription = source.subscribe(\n    function (x) {\n        var arr = [];\n        x.forEach(function (i) { arr.push(i); })\n        console.log('Next: ' + arr);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: [0,1,2,3,4]\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/toset.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/toset.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nUnit Tests:\n- [`/tests/observable/toset.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/toset.js)\n"
  },
  {
    "path": "doc/api/core/operators/transduce.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.transduce(transducer)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/transduce.js \"View in source\")\n\nExecutes a transducer to transform the observable sequence.  \n\nTransducers are composable algorithmic transformations. They are independent from the context of their input and output sources and specify only the essence of the transformation in terms of an individual element. Because transducers are decoupled from input or output sources, they can be used in many different processes such as Observable sequences. Transducers compose directly, without awareness of input or creation of intermediate aggregates.\n\nSuch examples of transducers libraries are [transducers-js](https://github.com/cognitect-labs/transducers-js) from Cognitect and [transducers.js](https://github.com/jlongster/transducers.js) from James Long.\n\nIn order for this operator to work, the transducers library must follow the following contract:\n```js\nreturn {\n  '@@transducer/init': function() {\n    // Return the item\n    return observer;\n  },\n  '@@transducer/step': function(obs, input) {\n    // Process next item\n    return obs.onNext(input);\n  },\n  '@@transducer/result': function(obs) {\n    // Mark completion\n    return obs.onCompleted();\n  }\n};\n```\n\n### Arguments\n1. `transducer` *(`Transducer`)*: A transducer to execute.\n\n#### Returns\n*(`Observable`)*: An observable sequence that results from the transducer execution.\n\n#### Example\n\nBelow is an example using [transducers-js](https://github.com/cognitect-labs/transducers-js).\n```js\nfunction even (x) { return x % 2 === 0; }\nfunction mul10(x) { return x * 10; }\n\nvar t = transducers\n\nvar source = Rx.Observable.range(1, 5)\n  .transduce(t.comp(t.filter(even), t.map(mul10)));\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n      console.log('Completed');\n  });\n\n// => Next: 20\n// => Next: 40\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/transduce.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/transduce.js)\n\nDist:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/transduce.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/transduce.js)\n"
  },
  {
    "path": "doc/api/core/operators/using.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.using(resourceFactory, observableFactory)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/using.js \"View in source\")\n\nConstructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n\n### Arguments\n1. `resourceFactory` *(`Function`)*: Factory function to obtain a resource object.\n2. `observableFactory` *(`Function`)*: Factory function to obtain an observable sequence that depends on the obtained resource.\n\n#### Returns\n*(`Function`)*: An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n\n#### Example\n```js\n/* Using an AsyncSubject as a resource which supports the .dispose method */\nfunction DisposableResource(value) {\n  this.value = value;\n  this.disposed = false;\n}\n\nDisposableResource.prototype.getValue = function () {\n  if (this.disposed) {\n    throw new Error('Object is disposed');\n  }\n  return this.value;\n};\n\nDisposableResource.prototype.dispose = function () {\n  if (!this.disposed) {\n    this.disposed = true;\n    this.value = null;\n  }\n  console.log('Disposed');\n};\n\nvar source = Rx.Observable.using(\n  function () { return new DisposableResource(42); },\n  function (resource) {\n    var subject = new Rx.AsyncSubject();\n    subject.onNext(resource.getValue());\n    subject.onCompleted();\n    return subject;\n  }\n);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: ' + x);\n  },\n  function (err) {\n    console.log('Error: ' + err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 42\n// => Completed\n\nsubscription.dispose();\n\n// => Disposed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/using.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/using.js)\n\nDist:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n\nUnit Tests:\n- [`/tests/observable/using.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/using.js)\n"
  },
  {
    "path": "doc/api/core/operators/when.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.when(...args)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/when.js \"View in source\")\n\nA series of plans (specified as an Array or as a series of arguments) created by use of the Then operator on patterns.\n\n### Arguments\n1. `args` *(arguments|Array)*: A series of plans (specified as an Array of as a series of arguments) created by use of the then operator on patterns.\n\n#### Returns\n*(`Observable`)*: Observable sequence with the results form matching several patterns.\n\n#### Example\n```js\n// Fire each plan when both are ready\nvar source = Rx.Observable.when(\n  Rx.Observable.timer(100).and(Rx.Observable.timer(500)).thenDo(function (x, y) { return 'first'; }),\n  Rx.Observable.timer(400).and(Rx.Observable.timer(300)).thenDo(function (x, y) { return 'second'; })\n);\n\nvar subscription = source.subscribe(\n  function (x) {\n      console.log('Next: ' + x);\n  },\n  function (err) {\n      console.log('Error: ' + err);\n  },\n  function () {\n      console.log('Completed');\n  });\n\n// => Next: second\n// => Next: first\n// => Completed\n```\n\n#### Example\n\n```js\nvar chopsticks = [new Rx.Subject(), new Rx.Subject(), new Rx.Subject()];\n\nvar hungry = [new Rx.Subject(), new Rx.Subject(), new Rx.Subject()];\n\nvar eat = i => {\n  return () => {\n    setTimeout(() => {\n      console.log('Done');\n      chopsticks[i].onNext({});\n      chopsticks[(i+1) % 3].onNext({});\n    }, 1000);\n    return 'philosopher ' + i + ' eating';\n  };\n};\n\nvar dining = Rx.Observable.when(\n  hungry[0].and(chopsticks[0]).and(chopsticks[1]).thenDo(eat(0)),\n  hungry[1].and(chopsticks[1]).and(chopsticks[2]).thenDo(eat(1)),\n  hungry[2].and(chopsticks[2]).and(chopsticks[0]).thenDo(eat(2))\n);\n\ndining.subscribe(console.log.bind(console));\n\nchopsticks[0].onNext({}); chopsticks[1].onNext({}); chopsticks[2].onNext({});\n\nfor (var i = 0; i < 3; i++) {\n  hungry[0].onNext({}); hungry[1].onNext({}); hungry[2].onNext({});\n}\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/when.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/when.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.joinpatterns.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.joinpatterns.js)\n\nPrerequisites:\n- [`rx`](https://www.npmjs.org/package/rx).joinpatterns.js\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All)\n- [`RxJS-JoinPatterns`](http://www.nuget.org/packages/RxJS-JoinPatterns)\n\nUnit Tests:\n- [`/tests/observable/when.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/when.js)\n"
  },
  {
    "path": "doc/api/core/operators/where.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.filter(predicate, [thisArg])`\n### `Rx.Observable.prototype.where(predicate, [thisArg])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/filter.js \"View in source\")\n\nFilters the elements of an observable sequence based on a predicate.\n\n#### Arguments\n1. `predicate` *(`Function`)*: A function to test each source element for a condition. The callback is called with the following information:\n    1. the value of the element\n    2. the index of the element\n    3. the Observable object being subscribed\n2. `[thisArg]` *(`Any`)*: Object to use as `this` when executing the predicate.\n\n#### Returns\n*(`Observable`)*: An observable sequence that contains elements from the input sequence that satisfy the condition.\n\n#### Example\n```js\nvar source = Rx.Observable.range(0, 5)\n  .filter(function (x, idx, obs) {\n    return x % 2 === 0;\n  });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0\n// => Next: 2\n// => Next: 4\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/perf/operators/filter.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/filter.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/where.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/where.js)\n"
  },
  {
    "path": "doc/api/core/operators/while.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.while(condition, source)`\n### `Rx.Observable.whileDo(condition, source)` *DEPRECATED*\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/while.js \"View in source\")\n\nRepeats source as long as condition holds emulating a while loop.  There is an alias for this method called 'whileDo' for browsers <IE9.\n\n### Arguments\n1. `condition` *(`Function`)*: The condition which determines if the source will be repeated.\n2. `source` *(`Observable`)*: The observable sequence that will be run if the condition function returns true.\n\n#### Returns\n*(`Observable`)*: An observable sequence which is repeated as long as the condition holds.\n\n#### Example\n```js\nvar i = 0;\n\n// Repeat until condition no longer holds\nvar source = Rx.Observable.while(\n    function () { return i++ < 3 },\n    Rx.Observable.return(42)\n);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n// => Next: 42\n// => Next: 42\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/while.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/while.js)\n\nDist:\n- [`rx.experimental.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.experimental.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Experimental`](http://www.nuget.org/packages/RxJS-Experimental)\n\nUnit Tests:\n- [`/tests/observable/while.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/while.js)\n"
  },
  {
    "path": "doc/api/core/operators/window.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.window()`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/window.js \"View in source\")\n\nThe `window` method periodically subdivide items from an Observable into Observable windows and emit these windows rather than emitting the items one at a time.\n\nWindow is similar to `buffer`, but rather than emitting packets of items from the original `Observable`, it emits Observables, each one of which emits a subset of items from the original `Observable` and then terminates with an `onCompleted` call.\n\nLike `buffer`, `window` has many varieties, each with its own way of subdividing the original `Observable` into the resulting `Observable` emissions, each one of which contains a \"window\" onto the original emitted items. In the terminology of the `window` method, when a window \"opens,\" this means that a new `Observable` is emitted and that `Observable` will begin emitting items emitted by the source `Observable`. When a window \"closes,\" this means that the emitted Observable stops emitting items from the source Observable and calls its Subscribers' `onCompleted` method and terminates.\n\n#### With window closing selector\n```js\n\nRx.Observable.prototype.window(windowClosingSelector);\n```\n\nThis version of `window` opens its first window immediately. It closes the currently open window and immediately opens a new one each time it observes an object emitted by the `Observable` that is returned from `windowClosingSelector`. In this way, this version of `window` emits a series of non-overlapping windows whose collective `onNext` emissions correspond one-to-one with those of the source Observable.\n\n#### Arguments\n1. `windowClosingSelector` *(`Function`)*: A function invoked to define the closing of each produced window.\n\n#### Returns\n*(`Observable`)*: An observable sequence of windows.\n\n#### Example\n```js\n// With closings\nvar source = Rx.Observable.timer(0, 50)\n  .window(function () { return Rx.Observable.timer(125); })\n  .take(3)\n  .flatMap(function (x) { return x.toArray(); });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n  // => Next: 0,1,2\n  // => Next: 3,4,5\n  // => Next: 6,7\n  // => Completed\n```\n\n#### With window opening and window closing selector\n```js\nRx.Observable.prototype.window(windowOpenings, windowClosingSelector);\n```\n\nThis version of `window` opens a window whenever it observes the `windowOpenings` `Observable` emit an Opening object and at the same time calls `windowClosingSelector` to generate a closing `Observable` associated with that window. When that closing `Observable` emits an object, `window` closes that window. Since the closing of currently open windows and the opening of new windows are activities that are regulated by independent Observables, this version of `window` may create windows that overlap (duplicating items from the source `Observable`) or that leave gaps (discarding items from the source Observable).\n\n#### Arguments\n1. `windowOpenings` *(`Observable`)*: Observable sequence whose elements denote the creation of new windows\n2. `windowClosingSelector` *(`Function`)*: A function invoked to define the closing of each produced window.\n\n#### Returns\n*(`Observable`)*: An observable sequence of windows.\n\n#### Example\n\n```js\n/* Using Openings and Closing Selector */\nvar openings = Rx.Observable.interval(200);\n\nvar source = Rx.Observable.interval(50)\n  .window(openings, function (x) { return Rx.Observable.timer(x + 100); })\n  .take(3);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 3,4\n// => Next: 7,8\n// => Next: 11,12\n// => Completed\n```\n\n#### With boundaries\n```js\nRx.Observable.prototype.window(windowBoundaries);\n```\n\nThis version of `window` returns an `Observable` that emits non-overlapping buffered items from the source `Observable` each time the specified boundary Observable emits an item.\n\n#### Arguments\n1. `windowBoundaries` *(`Observable`)*: Sequence of window boundary markers. The current window is closed and a new window is opened upon receiving a boundary marker.\n\n#### Returns\n*(`Observable`)*: An observable sequence of windows.\n\n#### Example\n```js\n/* With window boundaries */\nvar openings = Rx.Observable.interval(500);\n\n// Convert the window to an array\nvar source = Rx.Observable.timer(0, 100)\n  .window(openings)\n  .take(3)\n  .flatMap(function (x) { return x.toArray(); });\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0,1,2,3,4\n// => Next: 5,6,7,8,9,10\n// => Next: 11,12,13,14,15\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/window.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/window.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.coincidence.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.coincidence.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Coincidence`](http://www.nuget.org/packages/RxJS-Coincidence/)\n\nUnit Tests:\n- [`/tests/observable/window.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/window.js)\n"
  },
  {
    "path": "doc/api/core/operators/windowwithcount.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.windowWithCount(count, [skip])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/windowwithcount.js \"View in source\")\n\nProjects each element of an observable sequence into zero or more windows which are produced based on element count information.\n\n#### Arguments\n1. `count` *(`Number`)*: Length of each buffer.\n2. `[skip]` *(`Number`)*: Number of elements to skip between creation of consecutive windows. If not provided, defaults to the count.\n\n#### Returns\n*(`Observable`)*: An observable sequence of windows.\n\n#### Example\n```js\n/* Without a skip */\nvar source = Rx.Observable.range(1, 6)\n    .windowWithCount(2)\n    .selectMany(function (x) { return x.toArray(); });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 1,2\n// => Next: 3,4\n// => Next: 5,6\n// => Next:\n// => Completed\n\n/* Using a skip */\nvar source = Rx.Observable.range(1, 6)\n    .windowWithCount(2, 1)\n    .selectMany(function (x) { return x.toArray(); });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 1,2\n// => Next: 2,3\n// => Next: 3,4\n// => Next: 4,5\n// => Next: 5,6\n// => Next: 6\n// => Next:\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/windowwithcount.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/windowwithcount.js)\n\nDist:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.extras.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.extras.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/windowwithcount.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/windowwithcount.js)\n"
  },
  {
    "path": "doc/api/core/operators/windowwithtime.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.windowWithTime(timeSpan, [timeShift | scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/windowwithtime.js \"View in source\")\n\nProjects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n\n#### Arguments\n1. `timeSpan` *(`Number`)*: Length of each buffer (specified as an integer denoting milliseconds).\n2. `[timeShift]` *(`Number`)*: Interval between creation of consecutive buffers (specified as an integer denoting milliseconds).\n3. `[scheduler=Rx.Scheduler.timeout]` *(`Scheduler`)*: Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n\n#### Returns\n*(`Observable`)*: An observable sequence of buffers.\n\n#### Example\n```js\n/* Without a skip */\nvar source = Rx.Observable.interval(100)\n    .windowWithTime(500)\n    .take(3);\n\nvar subscription = source.subscribe(\n    function (child) {\n\n        child.toArray().subscribe(\n            function (x) {\n                console.log('Child Next: ' + x.toString());\n            },\n            function (err) {\n                console.log('Child Error: ' + err);\n            },\n            function () {\n                console.log('Child Completed');\n            }\n        );\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Child Next: 0,1,2,3\n// => Child Completed\n// => Completed\n// => Child Next: 4,5,6,7,8\n// => Child Completed\n// => Child Next: 9,10,11,12,13\n// => Child Completed\n\n/* Using a skip */\nvar source = Rx.Observable.interval(100)\n    .windowWithTime(500, 100)\n    .take(3);\n\nvar subscription = source.subscribe(\n    function (child) {\n\n        child.toArray().subscribe(\n            function (x) {\n                console.log('Child Next: ' + x.toString());\n            },\n            function (err) {\n                console.log('Child Error: ' + err);\n            },\n            function () {\n                console.log('Child Completed');\n            }\n        );\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Completed\n// => Child Next: 0,1,2,3,4\n// => Child Completed\n// => Child Next: 0,1,2,3,4,5\n// => Child Completed\n// => Child Next: 1,2,3,4,5,6\n// => Child Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/windowwithtime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/windowwithtime.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Time`](http://www.nuget.org/packages/RxJS-Time/)\n\nUnit Tests:\n- [`/tests/observable/windowwithtime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/windowwithtime.js)\n"
  },
  {
    "path": "doc/api/core/operators/windowwithtimeorcount.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.windowWithTimeOrCount(timeSpan, count, [scheduler])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/windowwithtimeorcount.js \"View in source\")\n\nProjects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed.\n\n#### Arguments\n1. `timeSpan` *(`Number`)*: Maximum time length of a window.\n2. `count` *(`Number`)*: Maximum element count of a window.\n3. `[scheduler=Rx.Scheduler.timeout]` *(`Scheduler`)*: Scheduler to run windows timers on. If not specified, the timeout scheduler is used.\n\n#### Returns\n*(`Observable`)*: An observable sequence of windows.\n\n#### Example\n```js\n/* Hitting the count buffer first */\nvar source = Rx.Observable.interval(100)\n    .windowWithTimeOrCount(500, 3)\n    .take(3)\n    .selectMany(function (x) { return x.toArray(); });\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 0,1,2\n// => Next: 3,4,5\n// => Next: 6,7,8\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/linq/observable/windowwithtimeorcount.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/windowwithtimeorcount.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Time`](http://www.nuget.org/packages/RxJS-Time/)\n\nUnit Tests:\n- [`/tests/observable/windowwithtimeorcount.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/windowwithtimeorcount.js)\n"
  },
  {
    "path": "doc/api/core/operators/withlatestfrom.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.withLatestFrom(...args, [resultSelector])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/withlatestfrom.js \"View in source\")\n\nMerges the specified observable sequences into one observable sequence by using the selector function only when the source observable sequence (the instance) produces an element. The other observables can be in the form of an argument list of observables or an array. If the result selector is omitted, a list with the elements will be yielded.\n\n#### Arguments\n1. `args` *(arguments | Array)*: An array or arguments of Observable sequences.\n1. `[resultSelector]` *(`Function`)*: Function to invoke when the instance source observable produces an element. If omitted, a list with the elements will be yielded.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n\n#### Example\n```js\n/* Have staggering intervals */\nvar source1 = Rx.Observable.interval(140)\n    .map(function (i) { return 'First: ' + i; });\n\nvar source2 = Rx.Observable.interval(50)\n    .map(function (i) { return 'Second: ' + i; });\n\n// When source1 emits a value, combine it with the latest emission from source2.\nvar source = source1.withLatestFrom(\n    source2,\n    function (s1, s2) { return s1 + ', ' + s2; }\n).take(4);\n\nvar subscription = source.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: First: 0, Second: 1\n// => Next: First: 1, Second: 4\n// => Next: First: 2, Second: 7\n// => Next: First: 3, Second: 10\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/perf/operators/withlatestfrom.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/withlatestfrom.js)\n\nDist:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/withlatestfrom.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/withlatestfrom.js)\n"
  },
  {
    "path": "doc/api/core/operators/wrap.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.wrap(fn)`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/spawn.js \"View in source\")\n\nWrap the given generator `fn` into a function that returns an Observable.\n\n#### Arguments\n1. `fn` *(`Function`)*: A generator function to wrap.\n\n#### Returns\n*(`Function`)*: A function once executed, returns an Observable.\n\n#### Example\n```js\nvar Rx = require('rx');\n\nvar fn = Rx.Observable.wrap(function* (val) {\n  return yield Rx.Observable.just(val);\n});\n\nfn(42).subscribe(\n  function (x) { console.log('next %s', x); },\n  function (e) { console.log('error %s', e); },\n  function () { console.log('completed'); }\n);\n\n// => next 42\n// => completed\n```\n\n### Location\n\nFile:\n- [/src/core/linq/observable/spawn.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/spawn.js)\n\nDist:\n- [`rx.async.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.js)\n- [`rx.async.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.compat.js)\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n\nPrerequisites:\n- If using `rx.async.js` | `rx.async.compat.js`\n    - [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n    - [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Async`](http://www.nuget.org/packages/RxJS-Async)\n\nUnit Tests:\n- [`/tests/observable/spawn.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/spawn.js)\n"
  },
  {
    "path": "doc/api/core/operators/zip.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.zip(...args, [resultSelector])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/zip.js \"View in source\")\n\nMerges the specified observable sequences or Promises into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.  If the result selector function is omitted, a list with the elements of the observable sequences at corresponding indexes will be yielded.\n\n#### Arguments\n1. `args` *(Array|arguments)*: Observable sources.\n2. `[resultSelector]` *(Function)*: A function which takes the inputs at the specified index and combines them together.  If omitted, a list with the elements of the observable sequences at corresponding indexes will be yielded.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n\n#### Example\n```js\n/* Without a result selector */\nvar range = Rx.Observable.range(0, 5);\n\nvar source = Rx.Observable.zip(\n  range,\n  range.skip(1),\n  range.skip(2)\n);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0,1,2\n// => Next: 1,2,3\n// => Next: 2,3,4\n// => Completed\n\n/* With a result selector */\nvar range = Rx.Observable.range(0, 5);\n\nvar source = Rx.Observable.zip(\n  range,\n  range.skip(1),\n  range.skip(2),\n  function (s1, s2, s3) {\n    return s1 + ':' + s2 + ':' + s3;\n  }\n);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0:1:2\n// => Next: 1:2:3\n// => Next: 2:3:4\n// => Completed\n\n/* Using promises and Observables */\nvar range = Rx.Observable.range(0, 5);\n\nvar source = Rx.Observable.zip(\n  Promise.resolve(0),\n  Promise.resolve(1),\n  Rx.Observable.return(2),\n  function (s1, s2, s3) {\n    return s1 + ':' + s2 + ':' + s3;\n  }\n);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0:1:2\n// => Completed\n```\n\n### Location\n\nFile:\n- [/src/core/linq/observable/zip.js](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/zip.js)\n\nDist:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- [`rx`](https://www.npmjs.org/package/rx).experimental.js\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [/tests/observable/zip.js](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/zip.js)\n"
  },
  {
    "path": "doc/api/core/operators/zipiterable.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.zipIterable(...args, [resultSelector])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/zipiterable.js \"View in source\")\n\nMerges the current observable sequence with iterables such as `Map`, `Array`, `Set` into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n\n#### Arguments\n1. `args` *(`Arguments`)*: Arguments of Arrays, Maps, Sets or other iterables.\n2. `[resultSelector]` *(Function)*: A function which takes the inputs at the specified index and combines them together.  If omitted, a list with the elements of the observable sequences at corresponding indexes will be yielded.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing the result of combining elements of the sources using the specified result selector function.  If omitted, a list with the elements of the observable sequences at corresponding indexes will be yielded.\n\n#### Example\n```js\nvar array = [3, 4, 5];\n\nvar source = Rx.Observable.range(0, 3)\n  .zipIterable(\n    array,\n    function (s1, s2) { return s1 + ':' + s2; }\n  );\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0:3\n// => Next: 1:4\n// => Next: 2:5\n// => Completed\n```\n\n### Location\n\nFile:\n- [`/src/core/linq/observable/zipiterable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/zipiterable.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/zip.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/zip.js)\n"
  },
  {
    "path": "doc/api/core/operators/zipproto.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.Observable.prototype.zip(...args, [resultSelector])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/zip.js \"View in source\")\n\nMerges the specified observable sequences or Promises into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n\n#### Arguments\n1. `args` *(`Arguments` | `Array`)*: Arguments or an array of observable sequences.\n2. `[resultSelector]` *(Function)*: A function which takes the inputs at the specified index and combines them together.  If omitted, a list with the elements of the observable sequences at corresponding indexes will be yielded.\n\n#### Returns\n*(`Observable`)*: An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n\n#### Example\n```js\n/* Without a result selector */\nvar range = Rx.Observable.range(0, 5);\n\nvar source = range.zip(\n  range.skip(1),\n  range.skip(2)\n);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0,1,2\n// => Next: 1,2,3\n// => Next: 2,3,4\n// => Completed  \n\n/* Using arguments */\nvar range = Rx.Observable.range(0, 5);\n\nvar source = range.zip(\n  range.skip(1),\n  range.skip(2),\n  function (s1, s2, s3) {\n    return s1 + ':' + s2 + ':' + s3;\n  }\n);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 0:1:2\n// => Next: 1:2:3\n// => Next: 2:3:4\n// => Completed\n```\n### Location\n\nFile:\n- [`/src/core/perf/operators/zip.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/perf/operators/zip.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/observable/zip.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/zip.js)\n"
  },
  {
    "path": "doc/api/disposables/compositedisposable.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# `Rx.CompositeDisposable` class #\n\nRepresents a group of disposable resources that are disposed together.\n\n## Usage ##\n\nThe follow example shows the basic usage of an Rx.CompositeDisposable.\n\n```js\nvar d1 = Rx.Disposable.create(function () {\n     console.log('one');\n});\n\nvar d2 = Rx.Disposable.create(function () {\n     console.log('two');\n});\n\n// Initialize with two disposables\nvar disposables = new Rx.CompositeDisposable(d1, d2);\n\ndisposables.dispose();\n// => one\n// => two\n```\n\n### Location\n\n- rx.js\n\n## `CompositeDisposable Constructor` ##\n- [`constructor`](#rxcompositedisposablergs)\n\n## `CompositeDisposable Instance Methods` ##\n- [`add`](#rxcompositedisposableprototypeadditem)\n- [`dispose`](#rxcompositedisposableprototypedispose)\n- [`remove`](#rxcompositedisposableprototyperemoveitem)\n- [`toArray`](#rxcompositedisposableprototypetoarray)\n\n## `CompositeDisposable Instance Properties` ##\n- [`isDisposed`](#isdisposed)\n- [`length`](#length)\n\n## _CompositeDisposable Constructor_ ##\n\n### <a id=\"rxcompositedisposableargs\"></a>`Rx.CompositeDisposable(...args)`\n<a href=\"#rxcompositedisposablergs\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/compositedisposable.js#L5-L9 \"View in source\")\n\nInitializes a new instance of the `Rx.CompositeDisposable` class from a group of disposables.\n\n#### Arguments\n1. `args` *(Array|arguments)*: Disposables that will be disposed together.\n\n#### Example\n```js\nvar d1 = Rx.Disposable.create(function () {\n     console.log('one');\n});\n\nvar d2 = Rx.Disposable.create(function () {\n     console.log('two');\n});\n\n// Initialize with two disposables\nvar disposables = new Rx.CompositeDisposable(d1, d2);\n\ndisposables.dispose();\n// => one\n// => two\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n## _CompositeDisposable Instance Methods_ ##\n\n### <a id=\"rxcompositedisposableprototypeadditem\"></a>`Rx.CompositeDisposable.prototype.add(item)`\n<a href=\"#rxcompositedisposableprototypeadditem\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/compositedisposable.js#L17-L24 \"View in source\")\n\nAdds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n\n#### Arguments\n1. `item` *(Disposable)*: Disposable to add.\n\n#### Example\n\n```js\nvar disposables = new Rx.CompositeDisposable();\n\nvar d1 = Rx.Disposable.create(function () {\n     console.log('one');\n});\n\ndisposables.add(d1);\n\ndisposables.dispose();\n// => one\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n### <a id=\"rxcompositedisposableprototypedispose\"></a>`Rx.CompositeDisposable.prototype.dispose()`\n<a href=\"#rxcompositedisposableprototypedispose\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/compositedisposable.js#L49-L60 \"View in source\")\n\nDisposes all disposables in the group and removes them from the group.\n\n#### Example\n\n```js\nvar d1 = Rx.Disposable.create(function () {\n     console.log('one');\n});\n\nvar d2 = Rx.Disposable.create(function () {\n     console.log('two');\n});\n\nvar disposables = new Rx.CompositeDisposable(d1, d2);\n\ndisposables.dispose();\n// => one\n// => two\n\nconsole.log(disposables.length);\n// => 0\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n### <a id=\"rxcompositedisposableprototyperemoveitem\"></a>`Rx.CompositeDisposable.prototype.remove(item)`\n<a href=\"#rxcompositedisposableprototyperemoveitem\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/compositedisposable.js#L31-L44 \"View in source\")\n\nRemoves and disposes the first occurrence of a disposable from the CompositeDisposable.\n\n#### Arguments\n1. `item` *(Disposable)*: Disposable to remove.\n\n#### Returns\n*(Boolean)*: `true` if the disposable was found and disposed; otherwise, `false`.\n\n#### Example\n\n```js\nvar disposables = new Rx.CompositeDisposable();\n\nvar d1 = Rx.Disposable.create(function () {\n     console.log('one');\n});\n\ndisposables.add(d1);\n\nconsole.log(disposables.remove(d1));\n// => true\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n### <a id=\"rxcompositedisposableprototypetoarray\"></a>`Rx.CompositeDisposable.prototype.toarray()`\n<a href=\"#rxcompositedisposableprototypetoarray\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/compositedisposable.js#L87-L89 \"View in source\")\n\nConverts the existing CompositeDisposable to an array of disposables. Does not dispose the objects.\n\n#### Returns\n*(Array)*: An array of disposable objects.\n\n#### Example\n\n```js\nvar d1 = Rx.Disposable.create(function () {\n     console.log('one');\n});\n\nvar d2 = Rx.Disposable.create(function () {\n     console.log('two');\n});\n\nvar disposables = new Rx.CompositeDisposable(d1, d2);\n\nvar array = disposables.toArray();\n\nconsole.log(array.length);\n// => 2\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n## _CompositeDisposable Instance Properties_ ##\n\n### <a id=\"isdisposed\"></a>`isDisposed`\n<a href=\"#isdisposed\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/compositedisposable.js#L7 \"View in source\")\n\nGets a value that indicates whether the object is disposed.\n\n#### Example\n```js\nvar disposables = new Rx.CompositeDisposable();\n\nvar d1 = Rx.Disposable.create(function () {\n     console.log('disposed');\n});\n\ndisposables.add(d1);\n\nconsole.log(disposables.isDisposed);\n// => false\n\ndisposables.dispose();\n// => disposed\n\nconsole.log(disposables.isDisposed);\n// => true\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n### <a id=\"length\"></a>`length`\n<a href=\"#length\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/compositedisposable.js#L8 \"View in source\")\n\nGets the number of disposables in the CompositeDisposable.\n\n#### Example\n```js\nvar disposables = new Rx.CompositeDisposable();\n\nvar d1 = Rx.Disposable.create(function () {\n     console.log('disposed');\n});\n\ndisposables.add(d1);\n\nconsole.log(disposables.length);\n// => 1\n\ndisposables.dispose();\n// => disposed\n\nconsole.log(disposables.length);\n// => 0\n```\n\n### Location\n\n- rx.js\n\n* * *\n"
  },
  {
    "path": "doc/api/disposables/disposable.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# `Rx.Disposable` class #\n\nProvides a set of static methods for creating Disposables, which defines a method to release allocated resources.\n\n## Usage ##\n\nThe follow example shows the basic usage of an `Rx.Disposable`.\n\n```js\nvar disposable = Rx.Disposable.create(function () {\n    console.log('disposed');\n});\n\ndisposable.dispose();\n// => disposed\n```\n\n## `Disposable Class Methods` ##\n- [`create`](#rxdisposablecreateaction)\n- [`isDisposable`](#rxdisposableisdisposabled)\n\n## `Disposable Class Properties` ##\n- [`empty`](#rxdisposableempty)\n\n## `Disposable Instance Methods` ##\n- [`dispose`](#rxdisposableprototypedispose)\n\n## _Class Methods_ ##\n\n### <a id=\"rxdisposablecreateaction\"></a>`Rx.Disposable.create(action)`\n<a href=\"#rxdisposablecreateaction\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/disposable.js\"View in source\")\n\nCreates a disposable object that invokes the specified action when disposed.\n\n#### Arguments\n1. `action` *(Function)*: Function to run during the first call to `dispose`. The action is guaranteed to be run at most once.\n\n#### Returns\n*(Disposable)*: The disposable object that runs the given action upon disposal.\n\n#### Example\n```js\nvar disposable = Rx.Disposable.create(function () {\n    console.log('disposed');\n});\n\ndisposable.dispose();\n// => disposed\n```\n\n### Location\n\nFile:\n- [`/src/core/disposables/disposable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/disposable.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/disposables/disposable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/disposables/disposable.js)\n\n* * *\n\n### <a id=\"rxdisposableisdisposabled\"></a>`Rx.Disposable.isDisposable(d)`\n<a href=\"#rxdisposableisdisposabled\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/disposable.js\"View in source\")\n\nCreates a disposable object that invokes the specified action when disposed.\n\n#### Arguments\n1. `d` *(Object)*: Object to validate whether it has a dispose method.\n\n#### Returns\n*(Boolean)*: `true` if is a disposable object, else `false`.\n\n#### Example\n```js\nvar disposable = Rx.Disposable.empty;\nconsole.log(disposable.isDisposable(disposable));\n// => true\n```\n\n### Location\n\nFile:\n- [`/src/core/disposables/disposable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/disposable.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/disposables/disposable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/disposables/disposable.js)\n\n* * *\n\n## _Disposable Class Properties_ ##\n\n### <a id=\"rxdisposableempty\"></a>`Rx.Disposable.empty`\n<a href=\"#rxdisposableempty\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/disposable.js#L130 \"View in source\")\n\nGets the disposable that does nothing when disposed.\n\n#### Returns\n*(Disposable)*: The disposable that does nothing when disposed.\n\n#### Example\n\n```js\nvar disposable = Rx.Disposable.empty;\n\ndisposable.dispose(); // Does nothing\n```\n\n### Location\n\nFile:\n- [`/src/core/disposables/disposable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/disposable.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/disposables/disposable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/disposables/disposable.js)\n\n* * *\n\n## _Disposable Instance Methods_ ##\n\n### <a id=\"rxdisposableprototypedispose\"></a>`Rx.Disposable.prototype.dispose()`\n<a href=\"#rxdisposableprototypedispose\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/disposable.js#L13-L18 \"View in source\")\n\nPerforms the task of cleaning up resources.\n\n#### Example\n\n```js\nvar disposable = Rx.Disposable.create(function () {\n    console.log('disposed');\n});\n\ndisposable.dispose();\n// => disposed\n```\n\n### Location\n\n### Location\n\nFile:\n- [`/src/core/disposables/disposable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/disposable.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nPrerequisites:\n- None\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Complete`](http://www.nuget.org/packages/RxJS-Complete)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nUnit Tests:\n- [`/tests/disposables/disposable.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/disposables/disposable.js)\n\n* * *\n"
  },
  {
    "path": "doc/api/disposables/refcountdisposable.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# `Rx.RefCountDisposable` class #\n\nRepresents a disposable resource that only disposes its underlying disposable resource when all `getDisposable` dependent disposable objects have been disposed.\n\n## Usage ##\n\nThe follow example shows the basic usage of an `Rx.RefCountDisposable`.\n\n```js\nvar disposable = Rx.Disposable.create(function () {\n     console.log('disposed');\n});\n\nvar refCountDisposable = new Rx.RefCountDisposable(disposable);\n\nvar disposable1 = refCountDisposable.getDisposable();\nvar disposable2 = refCountDisposable.getDisposable();\n\ndisposable1.dispose();\nconsole.log(disposable.isDisposed);\n// => false\n\ndisposable2.dispose();\nconsole.log(disposable.isDisposed);\n// => false\n\nrefCountDisposable.dispose();\n// => disposed\n\nconsole.log(refCountDisposable.isDisposed);\n// => true\n```\n\n### Location\n\n- rx.js\n\n## `RefCountDisposable Constructor` ##\n- [`constructor`](#rxrefcountdisposabledisposable)\n\n## `RefCountDisposable Instance Methods` ##\n- [`dispose`](#rxrefcountdisposableprototypedispose)\n- [`getDisposable`](#rxrefcountdisposableprototypegetdisposable)\n\n## `RefCountDisposable Instance Properties` ##\n- [`isDisposed`](#isdisposed)\n\n## _RefCountDisposable Constructor_ ##\n\n### <a id=\"rxrefcountdisposable\"></a>`Rx.RefCountDisposable(disposable)`\n<a href=\"#rxrefcountdisposable\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/rxrefcountdisposable.js#L7-L10 \"View in source\")\n\nInitializes a new instance of the `Rx.RefCountDisposable` class with the specified disposable\n\n#### Arguments\n1. `disposable` *(Disposable)*: Underlying disposable.\n\n#### Example\n```js\nvar disposable = Rx.Disposable.create(function () {\n     console.log('disposed');\n});\n\nvar refCountDisposable = new Rx.RefCountDisposable(disposable);\n\nconsole.log(refCountDisposable.isDisposed);\n// => false\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n## _RefCountDisposable Instance Methods_ ##\n\n### <a id=\"rxrefcountdisposableprototypedispose\"></a>`Rx.RefCountDisposable.prototype.dispose()`\n<a href=\"#rxrefcountdisposableprototypedispose\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/rxrefcountdisposable.js#L30-L35 \"View in source\")\n\nDisposes the underlying disposable only when all dependent disposables have been disposed.\n\n#### Example\n\n```js\nvar disposable = Rx.Disposable.create(function () {\n     console.log('disposed');\n});\n\nvar refCountDisposable = new Rx.RefCountDisposable(disposable);\n\nvar disposable1 = refCountDisposable.getDisposable();\nvar disposable2 = refCountDisposable.getDisposable();\n\ndisposable1.dispose();\nconsole.log(disposable.isDisposed);\n// => false\n\ndisposable2.dispose();\nconsole.log(disposable.isDisposed);\n// => false\n\nrefCountDisposable.dispose();\n// => disposed\n\nconsole.log(refCountDisposable.isDisposed);\n// => true\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n### <a id=\"rxrefcountdisposableprototypegetdisposable\"></a>`Rx.RefCountDisposable.prototype.getDisposable()`\n<a href=\"#rxrefcountdisposableprototypegetdisposable\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/rxrefcountdisposable.js#L18-L20 \"View in source\")\n\nReturns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n\n#### Returns\n*(Disposable)*: A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n\n#### Example\n\n```js\nvar disposable = Rx.Disposable.create(function () {\n     console.log('disposed');\n});\n\nvar refCountDisposable = new Rx.RefCountDisposable(disposable);\n\nvar d = refCountDisposable.getDisposable();\n\nconsole.log(d === disposable);\n// => false\n\n// Clean up disposables\ndisposable.dispose();\nd.dispose();\n\n// Now try to dispose the main\nrefCountDisposable.dispose();\n\nconsole.log(refCountDisposable.isDisposed);\n// => true\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n## _RefCountDisposable Instance Properties_ ##\n\n### <a id=\"isdisposed\"></a>`isDisposed`\n<a href=\"#isdisposed\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/rxrefcountdisposable.js#L8 \"View in source\")\n\nGets a value that indicates whether the object is disposed.\n\n#### Example\n```js\nvar disposable = Rx.Disposable.create(function () {\n     console.log('disposed');\n});\n\nvar refCountDisposable = new Rx.RefCountDisposable(disposable);\n\ndisposable.dispose();\n\nconsole.log(refCountDisposable.isDisposed);\n// => false\n\nrefCountDisposable.dispose();\n// => disposed\n\nconsole.log(refCountDisposable.isDisposed);\n// => true\n```\n\n### Location\n\n- rx.js\n\n* * *\n"
  },
  {
    "path": "doc/api/disposables/serialdisposable.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# `Rx.SerialDisposable` class #\n\nRepresents a disposable resource whose underlying disposable resource can be replaced by another disposable resource, causing automatic disposal of the previous underlying disposable resource.\n\n## Usage ##\n\nThe follow example shows the basic usage of an Rx.SerialDisposable.\n\n```js\nvar serialDisposable = new Rx.SerialDisposable();\n\nvar d1 = Rx.Disposable.create(function () {\n     console.log('one');\n});\n\nserialDisposable.setDisposable(d1);\n\nvar d2 = Rx.Disposable.create(function () {\n     console.log('two');\n});\n\nserialDisposable.setDisposable(d2);\n// => one\n\nserialDisposable.dispose();\n// = two\n```\n\n### Location\n\n- rx.js\n\n## `SerialDisposable Constructor` ##\n- [`constructor`](#rxserialdisposable)\n\n## `SerialDisposable Instance Methods` ##\n- [`dispose`](#rxserialdisposableprototypedispose)\n- [`getDisposable`](#rxserialdisposableprototypegetdisposable)\n- [`setDisposable`](#rxserialdisposableprototypesetdisposable)\n\n## `SerialDisposable Instance Properties` ##\n- [`isDisposed`](#isdisposed)\n\n## _SerialDisposable Constructor_ ##\n\n### <a id=\"rxserialdisposable\"></a>`Rx.SerialDisposable()`\n<a href=\"#rxserialdisposable\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/serialdisposable.js#L5-L8 \"View in source\")\n\nInitializes a new instance of the `Rx.SerialDisposable` class.\n\n#### Example\n```js\nvar serialDisposable = new Rx.SerialDisposable();\n\nconsole.log(serialDisposable.isDisposed);\n// => false\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n## _SerialDisposable Instance Methods_ ##\n\n### <a id=\"rxserialdisposableprototypedispose\"></a>`Rx.SerialDisposable.prototype.dispose()`\n<a href=\"#rxserialdisposableprototypedispose\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/serialdisposable.js#L50-L60 \"View in source\")\n\nDisposes the underlying disposable as well as all future replacements.\n\n#### Example\n\n```js\nvar serialDisposable = new Rx.SerialDisposable();\n\nvar d1 = Rx.Disposable.create(function () {\n     console.log('one');\n});\n\nserialDisposable.setDisposable(disposable);\n\nserialDisposable.dispose();\n// => one\n\nvar d2 = Rx.Disposable.create(function () {\n     console.log('two');\n});\n\n// => two\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n### <a id=\"rxserialdisposableprototypegetdisposable\"></a>`Rx.SerialDisposable.prototype.getDisposable()`\n<a href=\"#rxserialdisposableprototypegetdisposable\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/serialdisposable.js#L16-L18 \"View in source\")\n\nGets the underlying disposable.\n\n#### Returns\n*(Disposable)*: The underlying disposable.\n\n#### Example\n\n```js\nvar serialDisposable = new Rx.SerialDisposable();\n\nvar disposable = Rx.Disposable.create(function () {\n     console.log('disposed');\n});\n\nserialDisposable.setDisposable(disposable);\n\nvar d = serialDisposable.getDisposable();\n\nconsole.log(d === disposable);\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n### <a id=\"rxserialdisposableprototypesetdisposablevalue\"></a>`Rx.SerialDisposable.prototype.setDisposable(value)`\n<a href=\"#rxserialdisposableprototypesetdisposablevalue\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/serialdisposable.js#L24-L36 \"View in source\")\n\nSets the underlying disposable.\n\n#### Arguments\n1. `value` *(Disposable)*: The new underlying disposable.\n\n#### Example\n\n```js\nvar serialDisposable = new Rx.SerialDisposable();\n\nvar d1 = Rx.Disposable.create(function () {\n     console.log('one');\n});\n\nserialDisposable.setDisposable(d1);\n\nserialDisposable.dispose();\n// => one\n\nvar d2 = Rx.Disposable.create(function () {\n     console.log('two');\n});\n\nserialDisposable.setDisposable(d2);\n// => two\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n## _SerialDisposable Instance Properties_ ##\n\n### <a id=\"isdisposed\"></a>`isDisposed`\n<a href=\"#isdisposed\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/serialdisposable.js#L6 \"View in source\")\n\nGets a value that indicates whether the object is disposed.\n\n#### Example\n```js\nvar serialDisposable = new Rx.SerialDisposable();\n\nvar disposable = Rx.Disposable.create(function () {\n     console.log('disposed');\n});\n\nserialDisposable.setDisposable(disposable);\n\nconsole.log(serialDisposable.isDisposed);\n// => false\n\nserialDisposable.dispose();\n// => disposed\n\nconsole.log(serialDisposable.isDisposed);\n// => true\n```\n\n### Location\n\n- rx.js\n\n* * *\n"
  },
  {
    "path": "doc/api/disposables/singleassignmentdisposable.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# `Rx.SingleAssignmentDisposable` class #\n\nRepresents a disposable resource which only allows a single assignment of its underlying disposable resource. If an underlying disposable resource has already been set, future attempts to set the underlying disposable resource will throw an Error.\n\n## Usage ##\n\nThe follow example shows the basic usage of an Rx.SingleAssignmentDisposable.\n\n```js\nvar singleDisposable = new Rx.SingleAssignmentDisposable();\n\nvar disposable = Rx.Disposable.create(function () {\n     console.log('disposed');\n});\n\nsingleDisposable.setDisposable(disposable);\n\nsingleDisposable.dispose();\n// => disposed\n```\n\n### Location\n\n- rx.js\n\n## `SingleAssignmentDisposable Constructor` ##\n- [`constructor`](#rxsingleassignmentdisposable)\n\n## `SingleAssignmentDisposable Instance Methods` ##\n- [`dispose`](#rxsingleassignmentdisposableprototypedispose)\n- [`getDisposable`](#rxsingleassignmentdisposableprototypegetdisposable)\n- [`setDisposable`](#rxsingleassignmentdisposableprototypesetdisposable)\n\n## `SingleAssignmentDisposable Instance Properties` ##\n- [`isDisposed`](#isdisposed)\n\n## _SingleAssignmentDisposable Constructor_ ##\n\n### <a id=\"rxsingleassignmentdisposable\"></a>`Rx.SingleAssignmentDisposable()`\n<a href=\"#rxsingleassignmentdisposable\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/singleassignmentdisposable.js#L7-L10 \"View in source\")\n\nInitializes a new instance of the `Rx.SingleAssignmentDisposable` class.\n\n#### Example\n```js\nvar singleDisposable = new Rx.SingleAssignmentDisposable();\n\nconsole.log(singleDisposable.isDisposed);\n// => false\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n## _SingleAssignmentDisposable Instance Methods_ ##\n\n### <a id=\"rxsingleassignmentdisposableprototypedispose\"></a>`Rx.SingleAssignmentDisposable.prototype.dispose()`\n<a href=\"#rxsingleassignmentdisposableprototypedispose\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/singleassignmentdisposable.js#L47-L57 \"View in source\")\n\nDisposes the underlying disposable.\n\n#### Example\n\n```js\nvar singleDisposable = new Rx.SingleAssignmentDisposable();\n\nvar disposable = Rx.Disposable.create(function () {\n     console.log('disposed');\n});\n\nsingleDisposable.setDisposable(disposable);\n\nconsole.log(singleDisposable.isDisposed);\n// => false\n\nsingleDisposable.dispose();\n// => disposed\n\nconsole.log(singleDisposable.isDisposed);\n// => true\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n### <a id=\"rxsingleassignmentdisposableprototypegetdisposable\"></a>`Rx.SingleAssignmentDisposable.prototype.getDisposable()`\n<a href=\"#rxsingleassignmentdisposableprototypegetdisposable\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/singleassignmentdisposable.js#L18-L20 \"View in source\")\n\nGets the underlying disposable. After disposal, the result of getting this method is undefined.\n\n#### Returns\n*(Disposable)*: The underlying disposable.\n\n#### Example\n\n```js\nvar singleDisposable = new Rx.SingleAssignmentDisposable();\n\nvar disposable = Rx.Disposable.create(function () {\n     console.log('disposed');\n});\n\nsingleDisposable.setDisposable(disposable);\n\nvar d = singleDisposable.getDisposable();\n\nconsole.log(d === disposable);\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n### <a id=\"rxsingleassignmentdisposableprototypesetdisposablevalue\"></a>`Rx.SingleAssignmentDisposable.prototype.setDisposable(value)`\n<a href=\"#rxsingleassignmentdisposableprototypesetdisposablevalue\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/singleassignmentdisposable.js#L31-L42 \"View in source\")\n\nSets the underlying disposable.\n\n#### Arguments\n1. `value` *(Disposable)*: The new underlying disposable.\n\n#### Example\n\n```js\nvar singleDisposable = new Rx.SingleAssignmentDisposable();\n\nvar d1 = Rx.Disposable.create(function () {\n     console.log('one');\n});\n\nsingleDisposable.setDisposable(d1);\n\nvar d2 = Rx.Disposable.create(function () {\n     console.log('two');\n});\n\ntry {\n    singleDisposable.setDisposable(d2);\n} catch (e) {\n    console.log(e.message);\n}\n\n// => Disposable has already been assigned\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n## _SingleAssignmentDisposable Instance Properties_ ##\n\n### <a id=\"isdisposed\"></a>`isDisposed`\n<a href=\"#isdisposed\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/disposables/singleassignmentdisposable.js#L8 \"View in source\")\n\nGets a value that indicates whether the object is disposed.\n\n#### Example\n```js\nvar singleDisposable = new Rx.SingleAssignmentDisposable();\n\nvar disposable = Rx.Disposable.create(function () {\n     console.log('disposed');\n});\n\nsingleDisposable.setDisposable(disposable);\n\nconsole.log(singleDisposable.isDisposed);\n// => false\n\nsingleDisposable.dispose();\n// => disposed\n\nconsole.log(singleDisposable.isDisposed);\n// => true\n```\n\n### Location\n\n- rx.js\n\n* * *\n"
  },
  {
    "path": "doc/api/helpers/readme.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Reactive Extensions Helpers #\n\nHelper functions for the Reactive Extensions for JavaScript\n\n## Documentation ##\n\n- [`Rx.helpers.defaultComparer`](#rxhelpersdefaultcomparerx-y)\n- [`Rx.helpers.defaultSubComparer`](#rxhelpersdefaultsubscomparerx-y)\n- [`Rx.helpers.defaultError`](#rxhelpersdefaulterror)\n- [`Rx.helpers.identity`](#rxhelpersidentityx)\n- [`Rx.helpers.isPromise`](#rxhelpersispromisep)\n- [`Rx.helpers.noop`](#rxhelpersnoop)\n\n* * *\n\n### <a id=\"rxhelpersdefaultcomparerx-y\"></a>`Rx.helpers.defaultComparer(x, y)`\n<a href=\"#rxhelpersdefaultcomparerx-y\">#</a>[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/basicheader.js \"View in source\") [&#x24C9;][1]\n\nThe default equality comparer, used when a comparer is not supplied to a function.  Uses an internal deep equality check.\n\n#### Arguments\n1. `x` *(Any)*: The first value to compare\n2. `y` *(Any)*: The second value to compare\n\n#### Returns\n*(Boolean)*: `true` if equal; else `false`.\n\n#### Example\n\n```js\nvar comparer = Rx.helpers.defaultComparer;\n\n// Should return true\nvar x = 42, y = 42\nconsole.log(comparer(x, y));\n// => true\n\n// Should return false\nvar x = new Date(0), y = new Date();\nconsole.log(comparer(x, y));\n// => false\n```\n* * *\n\n### <a id=\"rxhelpersdefaultsubcomparerx-y\"></a>`Rx.helpers.defaultSubcomparer(x, y)`\n<a href=\"#rxhelpersdefaultsubcomparerx-y\">#</a>[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/basicheader.js \"View in source\") [&#x24C9;][1]\n\nThe default comparer to determine whether one object is greater, less than or equal to another.\n\n#### Arguments\n1. `x` *(Any)*: The first value to compare\n2. `y` *(Any)*: The second value to compare\n\n#### Returns\n*(Number)*: Returns `1` if `x` is greater than `y`, `-1` if `y` is greater than `x`, and `0` if the objects are equal.\n\n#### Example\n\n```js\nvar comparer = Rx.helpers.defaultSubcomparer;\n\n// Should return 0\nvar x = 42, y = 42\nconsole.log(comparer(x, y));\n// => 0\n\n// Should return -1\nvar x = new Date(0), y = new Date();\nconsole.log(comparer(x, y));\n// => -1\n\n// Should return 1\nvar x = 43, y = 42;\nconsole.log(comparer(x, y));\n// => 1\n```\n* * *\n\n### <a id=\"rxhelpersdefaulterror\"></a>`Rx.helpers.defaultError(err)`\n<a href=\"#rxhelpersdefaulterror\">#</a>[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/basicheader.js \"View in source\") [&#x24C9;][1]\n\nThrows the specified error\n\n#### Arguments\n1. `err` *(Any)*: The error to throw\n\n#### Example\n\n```js\nvar defaultError = Rx.helpers.defaultError;\n\n// Returns its value\ndefaultError(new Error('woops'))\n// => Error: woops\n```\n* * *\n\n### <a id=\"rxhelpersidentityx\"></a>`Rx.helpers.identity(x)`\n<a href=\"#rxhelpersidentityx\">#</a>[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/basicheader.js \"View in source\") [&#x24C9;][1]\n\nA function which returns its value unmodified.\n\n#### Arguments\n1. `x` *(Any)*: The value to return.\n\n#### Returns\n*(Any)*: The value given as the parameter.\n\n#### Example\n\n```js\nvar identity = Rx.helpers.identity;\n\n// Returns its value\nvar x = identity(42);\nconsole.log(x);\n// => 42\n```\n* * *\n\n### <a id=\"rxhelpersispromisep\"></a>`Rx.helpers.isPromise(p)`\n<a href=\"#rxhelpersispromisep\">#</a>[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/basicheader.js \"View in source\") [&#x24C9;][1]\n\nA function which determines whether the object is a `Promise`.\n\n#### Arguments\n1. `p` *(Any)*: The object to determine whether it is a promise.\n\n#### Returns\n*(Boolean)*: `true` if the object is a `Promise` else `false`\n\n#### Example\n\n```js\nvar isPromise = Rx.helpers.isPromise;\n\nvar p = RSVP.Promise(function (res) { res(42); });\n\nconsole.log(isPromise(p));\n// => true\n```\n* * *\n\n### <a id=\"rxhelpersnoop\"></a>`Rx.helpers.noop()`\n<a href=\"#rxhelpersnoop\">#</a>[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/basicheader.js \"View in source\") [&#x24C9;][1]\n\nA function which does nothing\n\n#### Example\n\n```js\nvar noop = Rx.helpers.noop;\n\n// This does nothing!\nnoop();\n```\n* * *\n"
  },
  {
    "path": "doc/api/schedulers/historicalscheduler.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n### `Rx.HistoricalScheduler` class\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/historicalscheduler.js \"View in source\")\n\nProvides a virtual time scheduler that uses an optional `Date` for absolute time and time spans for relative time.  This inherits from the `Rx.VirtualTimeScheduler` class.\n\n## Usage ##\n\nThe following shows an example of using the `Rx.HistoricalScheduler`.  This shows creating a minute's worth of data from January 1st, 1970.\n\n```js\n// Initial data\nvar initialDate = 0;\nvar scheduler = new Rx.HistoricalScheduler(new Date(initialDate));\n\n// Yield unto this subject\nvar s = new Rx.Subject();\n\n// Some random data\nfunction getData(time) {\n  return Math.floor(Math.random() * (time + 1));\n}\n\n// Enqueue 1 minute's worth of data\nwhile (initialDate <= 60000) {\n\n  (function (i) {\n\n    scheduler.scheduleFuture(new Date(i), function () {\n      s.onNext({ value: getData(i), date: new Date(i) });\n    });\n\n  }(initialDate));\n\n  initialDate += 10000;\n}\n\n// Subscription set\ns.subscribe(function (x) {\n  console.log('value: ', x.value);\n  console.log('date: ', x.date.toGMTString());\n});\n\n// Run it\nscheduler.start();\n\n// => value: 0\n// => date: Thu, 1 Jan 1970 00:00:00 UTC\n// => value: 2013\n// => date: Thu, 1 Jan 1970 00:00:10 UTC\n// => value: 5896\n// => date: Thu, 1 Jan 1970 00:00:20 UTC\n// => value: 5415\n// => date: Thu, 1 Jan 1970 00:00:30 UTC\n// => value: 13411\n// => date: Thu, 1 Jan 1970 00:00:40 UTC\n// => value: 15518\n// => date: Thu, 1 Jan 1970 00:00:50 UTC\n// => value: 51076\n// => date: Thu, 1 Jan 1970 00:01:00 UTC\n```\n\n### Location\n\nFile:\n- [`/src/core/concurrency/historicalscheduler.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/historicalscheduler.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n- [`rx.virutaltime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.virutaltime.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-VirtualTime`](http://www.nuget.org/packages/RxJS-VirtualTime/)\n\nUnit Tests:\n- [`/tests/concurrency/historicalscheduler.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/tests/observable/historicalscheduler.js)\n\n## `HistoricalScheduler Constructor` ##\n- [`constructor`](#rxhistoricalschedulerinitialclock-comparer)\n\n## Inherited Classes ##\n- [`Rx.VirtualScheduler`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/schedulers/virtualtimescheduler.md)\n\n## _HistoricalScheduler Constructor_ ##\n\n### `Rx.HistoricalScheduler([initialClock], [comparer])`\n[&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/historicalscheduler.js \"View in source\")\n\nCreates a new historical scheduler with the specified initial clock value.\n\n#### Arguments\n1. [`initialClock`] *(Function)*: Initial value for the clock.\n2. [`comparer`] *(Function)*: Comparer to determine causality of events based on absolute time.\n\n#### Example\n```js\nfunction comparer (x, y) {\n  if (x > y) { return 1; }\n  if (x < y) { return -1; }\n  return 0;\n}\n\nvar scheduler = new Rx.HistoricalScheduler(\n  new Date(0),  /* initial clock of 0 */\n  comparer      /* comparer for determining order */\n);\n```"
  },
  {
    "path": "doc/api/schedulers/scheduler.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# `Rx.Scheduler` class #\n\nProvides a set of static methods to access commonly used schedulers and a base class for all schedulers.\n\n## Usage ##\n\nThe follow example shows the basic usage of an `Rx.Scheduler`.\n\n```js\nvar disposable = Rx.Scheduler.default.schedule(\n  'world',\n  function (scheduler, x) { console.log('hello ' + x); }\n);\n\n// => hello world\n```\n\n### Location\n\nFile:\n- [`scheduler.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/scheduler.js)\n- [`scheduler.periodic.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/scheduler.periodic.js)\n- [`scheduler.recursive.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/scheduler.recursive.js)\n- [`scheduler.wrappers.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/scheduler.wrappers.js)\n- [`currentthreadscheduler.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/currentthreadscheduler.js)\n- [`defaultscheduler.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/defaultscheduler.js)\n- [`immediatescheduler.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/immediatescheduler.js)\n\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\n## `Scheduler Instance Methods` ##\n- [`catch`](#rxschedulerprototypecatchhandler)\n- [`now`](#rxschedulerprototypenow)\n\n### Standard Scheduling ###\n- [`schedule`](#rxschedulerprototypeschedulestate-action)\n- [`scheduleFuture`](#rxschedulerprototypeschedulefuturestate-duetime-action)\n\n### Recursive Scheduling ###\n- [`scheduleRecursive`](#rxschedulerprototypeschedulerecursivestate-action)\n- [`scheduleRecursiveFuture`](#rxschedulerprototypeschedulerecursivefuturestate-duetime-action)\n\n### Periodic Scheduling ###\n- [`schedulePeriodic`](#rxschedulerscheduleperiodicstate-period-action)\n\n## `Scheduler` Class Methods ##\n- [`normalize`](#rxschedulernormalizetimespan)\n- [`isScheduler`](#rxschedulerisschedulerobj)\n\n## `Scheduler` Class Properties ##\n- [`currentThread`](#rxschedulercurrentthread)\n- [`immediate`](#rxschedulerimmediate)\n- [`default` | `async`](#rxschedulerdefault)\n\n## _Scheduler Instance Methods_ ##\n\n### <a id=\"rxschedulerprototypecatchhandler\"></a>`Rx.Scheduler.prototype.catch(handler)`\n<a href=\"#rxschedulerprototypecatchhandler\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/scheduler.wrappers.js \"View in source\")\n\nReturns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n\n#### Arguments\n1. `handler` `Function`: Handler that's run if an exception is caught. The error will be rethrown if the handler returns `false`.\n\n#### Returns\n`Scheduler`: Wrapper around the original scheduler, enforcing exception handling.\n\n#### Example\n\n```js\nSchedulerError.prototype = Object.create(Error.prototype);\n\nfunction SchedulerError(message) {\n  this.message = message;\n  Error.call(this);\n}\n\nvar scheduler = Rx.Scheduler.default;\nvar catchScheduler = scheduler.catch(function (e) {\n  return e instanceof SchedulerError;\n});\n\n// Throws no exception\nvar d1 = catchScheduler.schedule(function () {\n  throw new SchedulerError('woops');\n});\n\nvar d2 = catchScheduler.schedule(function () {\n  throw new Error('woops');\n});\n\n// => Uncaught Error: woops\n```\n\n***\n\n### <a id=\"rxschedulerprototypenow\"></a>`Rx.Scheduler.prototype.now()`\n<a href=\"#rxschedulerprototypenow\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/scheduler.js \"View in source\")\n\nGets the current time according to the Scheduler implementation.\n\n#### Returns\n`Number`: The current time according to the Scheduler implementation.\n\n#### Example\n\n```js\nvar now = Rx.Scheduler.default.now();\n\nconsole.log(now);\n// => 1381806323143\n```\n\n### Location\n\n- rx.js\n\n***\n\n### Standard Scheduling ###\n\n***\n\n### <a id=\"rxschedulerprototypeschedulestate-action\"></a>`Rx.Scheduler.prototype.schedule(state, action)`\n<a href=\"#rxschedulerprototypeschedulestate-action\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/scheduler.js \"View in source\")\n\nSchedules an action to be executed with state.\n\n#### Arguments\n1. `state`: Any: State passed to the action to be executed.\n2. `action`: `Function`: Action to execute with the following arguments:\n  1. `scheduler`: `Scheduler` - The current Scheduler\n  2. `state`: `Any` - The current state\n\n#### Returns\n`Disposable`: The disposable object used to cancel the scheduled action (best effort).\n\n#### Example\n\n```js\nvar disposable = Rx.Scheduler.immediate.schedule('world', function (scheduler, x) {\n   console.log('hello ' + x);\n});\n\n// => hello world\n\n// Tries to cancel but too late since it is immediate\ndisposable.dispose();\n```\n\n***\n\n### <a id=\"rxschedulerprototypeschedulefuturestate-duetime-action\"></a>`Rx.Scheduler.prototype.scheduleFuture(state, dueTime, action)`\n<a href=\"#rxschedulerprototypeschedulefuturestate-duetime-action\"\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/scheduler.js \"View in source\")\n\nSchedules an action to be executed at the specified relative due time. Note this only works with the built-in `Rx.Scheduler.default` scheduler, as the rest will throw an exception as the framework does not allow for blocking.\n\n#### Arguments\n1. `state` `Any`: State passed to the action to be executed.\n2. `dueTime` `Number` | `Date`: Relative or absolute time at which to execute the action.\n3. `action`: `Function`: Action to execute with the following arguments:\n  1. `scheduler`: `Scheduler` - The current Scheduler\n  2. `state`: `Any` - The current state\n\n#### Returns\n`Disposable`: The disposable object used to cancel the scheduled action (best effort).\n\n#### Example\n\n```js\n/* Relative schedule */\nvar disposable = Rx.Scheduler.default.scheduleFuture(\n  'world',\n  5000, /* 5 seconds in the future */\n  function (scheduler, x) {\n    console.log('hello ' + x + ' after 5 seconds');\n  }\n);\n// => hello world after 5 seconds\n\n/* Absolute schedule */\nvar disposable = Rx.Scheduler.default.scheduleFuture(\n  'world',\n  new Date(Date.now() + 5000), /* 5 seconds in the future */\n  function (scheduler, x) {\n    console.log('hello ' + x + ' after 5 seconds');\n  }\n);\n// => hello world after 5 seconds\n```\n\n***\n\n### Recursive Scheduling ###\n\n### <a id=\"rxschedulerprototypeschedulerecursivestate-action\"></a>`Rx.Scheduler.prototype.scheduleRecursive(state, action)`\n<a href=\"#rxschedulerprototypeschedulerecursivestate-action\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/scheduler.recursive.js \"View in source\")\n\nSchedules an action to be executed with state.\n\n#### Arguments\n1. `state` `Any`: State passed to the action to be executed.\n2. `action`: `Function`: Action to execute with the following parameters:\n  1. `state`: `Any` - The state passed in\n  2. `recurse`: `Function` - The action to execute for recursive actions which takes the form of `recurse(newState)` where the new state is passed to be executed again.\n\n#### Returns\n`Disposable`: The disposable object used to cancel the scheduled action (best effort).\n\n#### Example\n\n```js\nvar disposable = Rx.Scheduler.default.scheduleRecursive(\n   0,\n   function (i, recurse) {\n    console.log(i); if (++i < 3) { recurse(i); }\n   }\n);\n\n// => 0\n// => 1\n// => 2\n```\n\n***\n\n### <a id=\"rxschedulerprototypeschedulerecursivefuturestate-duetime-action\"></a>`Rx.Scheduler.prototype.scheduleRecursiveFuture(state, dueTime, action)`\n<a href=\"#rxschedulerprototypeschedulerecursivefuturestate-duetime-action\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/scheduler.recursive.js#L114-118 \"View in source\")\n\nSchedules an action to be executed recursively at a specified absolute or relative due time. Note this only works with the built-in `Rx.Scheduler.timeout` scheduler, as the rest will throw an exception as the framework does not allow for blocking.\n\n#### Arguments\n1. `state` `Any`: State passed to the action to be executed.\n2. `dueTime` `Number`: Absolute time at which to execute the action for the first time.\n2. `action`: `Function`: Action to execute with the following parameters:\n  1. `state`: `Any` - The state passed in\n  2. `recurse`: `Function` - The action to execute for recursive actions which takes the form of `recurse(newState, dueTime)`.\n\n#### Returns\n`Disposable`: The disposable object used to cancel the scheduled action (best effort).\n\n#### Example\n\n```js\n/* Absolute recursive future */\nvar disposable = Rx.Scheduler.default.scheduleRecursiveFuture(\n  0,\n  new Date(Date.now() + 5000), /* 5 seconds in the future */\n  function (i, self) {\n    console.log(i);\n    if (++i < 3) {\n      // Schedule mutliplied by a second by position\n      self(i, new Date(Date.now() + (i * 1000)));\n    }\n  }\n);\n\n// => 0\n// => 1\n// => 2\n\n/* Relative recursive future */\nvar disposable = Rx.Scheduler.default.scheduleRecursiveFuture(\n  0,\n  5000, /* 5 seconds in the future */\n  function (i, self) {\n    console.log(i);\n    if (++i < 3) {\n      // Schedule mutliplied by a second by position\n      self(i, i * 1000);\n    }\n  }\n);\n\n// => 0\n// => 1\n// => 2\n```\n\n***\n\n### Periodic Scheduling ###\n\n### <a id=\"rxschedulerscheduleperiodicstate-period-action\"></a>`Rx.Scheduler.prototype.schedulePeriodic(state, period, action)`\n<a href=\"#rxschedulerscheduleperiodicstate-period-action\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/scheduler.periodic.js#L20-31 \"View in source\")\n\nSchedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using `window.setInterval` for the base implementation.\n\n#### Arguments\n1. `state` `Any`: State passed to the action to be executed.\n2. `period` `Number`: Period for running the work periodically in ms.\n3. `action`: `Function`: Action to execute with the following parameters.  Note that the return value from this function becomes the state in the next execution of the action.\n  1. `state`: `Any` - The state passed in\n\n#### Returns\n`Disposable`: The disposable object used to cancel the scheduled action (best effort).\n\n#### Example\n\n```js\nvar disposable = Rx.Scheduler.default.schedulePeriodic(\n  0,\n  1000, /* 1 second */\n  function (i) {\n    console.log(i);\n\n    // After three times, dispose\n    if (++i > 3) { disposable.dispose(); }\n\n    return i;\n});\n\n// => 0\n// => 1\n// => 2\n// => 3\n```\n\n***\n\n## _Scheduler Class Methods_ ##\n\n### <a id=\"rxschedulernormalizetimespan\"></a>`Rx.Scheduler.normalize(timeSpan)`\n<a href=\"#rxschedulernormalizetimespan\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/scheduler.js#L87-90 \"View in source\")\n\nNormalizes the specified time span value to a positive value.\n\n#### Arguments\n1. `timeSpan` `Number`: The time span value to normalize.\n\n#### Returns\n`Number`: The specified time span value if it is zero or positive; otherwise, 0\n\n#### Example\n\n```js\nvar r1 = Rx.Scheduler.normalize(-1);\nconsole.log(r1);\n// => 0\n\nvar r2 = Rx.Scheduler.normalize(255);\nconsole.log(r2);\n// => 255\n```\n\n***\n\n### <a id=\"rxschedulerisschedulerobj\"></a>`Rx.Scheduler.isScheduler(obj)`\n<a href=\"#rxschedulerisschedulerobj\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/scheduler.js \"View in source\")\n\nDetermines whether the given object is a `Scheduler` instance\n\n#### Arguments\n1. `obj` `Any`: The object to determine whether it is a `Scheduler` instance\n\n#### Returns\n`Boolean`: Whether the given object is a Scheduler.\n\n#### Example\n\n```js\nvar isScheduler = Rx.Scheduler.isScheduler(Rx.Scheduler.default);\nconsole.log('Is scheduler? %s', isScheduler);\n// Is scheduler? true\n```\n\n***\n\n## _Scheduler Class Properties_ ##\n\n### <a id=\"rxschedulercurrentthread\"></a>`Rx.Scheduler.currentThread`\n<a href=\"#rxschedulercurrentthread\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/currentthreadscheduler.js \"View in source\")\n\nGets a scheduler that schedules work as soon as possible on the current thread.  This implementation does not support relative and absolute scheduling due to thread blocking required.\n\n#### Example\n```js\nvar scheduler = Rx.Scheduler.currentThread;\n\nvar disposable = scheduler.schedule(\n   'world',\n   function (scheduler, x) {\n      console.log('hello ' + x);\n   });\n\n// => hello world\n```\n\n### Location\n\n- rx.js\n\n***\n\n### <a id=\"rxschedulerimmediate\"></a>`Rx.Scheduler.immediate`\n<a href=\"#rxschedulerimmediate\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/immediatescheduler.js \"View in source\")\n\nGets a scheduler that schedules work immediately on the current thread.\n\n#### Example\n```js\nvar scheduler = Rx.Scheduler.immediate;\n\nvar disposable = scheduler.scheduleRecursive(\n  0,\n  function (x, self) {\n    console.log(x);\n    if (++x < 3) { self(x); }\n  }\n);\n\n// => 0\n// => 1\n// => 2\n```\n\n### Location\n\n- rx.js\n\n***\n\n### <a id=\"rxschedulerdefault\"></a>`Rx.Scheduler.default`\n<a href=\"#rxschedulerdefault\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/defaultscheduler.js \"View in source\")\n\nGets a scheduler that schedules work via a timed callback based upon platform.  An alias exists as `Rx.Scheduler.async`.\n\nFor all schedule calls, it defaults to:\n\n - Node.js: uses `setImmediate` for newer builds, and `process.nextTick` for older versions.\n - Browser: depending on platform may use `setImmediate`, `MessageChannel`, `window.postMessage` and for older versions of IE, it will default to `script.onreadystatechanged`, else falls back to `window.setTimeout`.\n\nFor all relative and absolute scheduling, it defaults to using `window.setTimeout`.\n\n#### Example\n```js\nvar scheduler = Rx.Scheduler.default;\n\nvar disposable = scheduler.schedule(\n  0,\n  function (scheduler, x) {\n    console.log(x);\n  }\n);\n\n// => 0\n```\n\n***\n"
  },
  {
    "path": "doc/api/schedulers/virtualtimescheduler.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# `Rx.VirtualTimeScheduler` class #\n\nBase class for providing scheduling in virtual time.  This inherits from the `Rx.Scheduler` class.\n\n## Usage ##\n\nThe following shows an example of using the `Rx.VirtualTimeScheduler`. In order for this to work, you must implement the `add`, `toAbsoluteTime` and `toRelativeTime` methods as described below.\n\n```js\n/* Comparer required for scheduling priority */\nfunction comparer (x, y) {\n  if (x > y) { return 1; }\n  if (x < y) { return -1; }\n  return 0;\n}\n\nvar scheduler = new Rx.VirtualTimeScheduler(0, comparer);\n\n/**\n * Adds a relative time value to an absolute time value.\n * @param {Any} absolute Absolute virtual time value.\n * @param {Any} relative Relative virtual time value to add.\n * @return {Any} Resulting absolute virtual time sum value.\n */\nscheduler.add = function (absolute, relative) {\n  return absolute + relative;\n};\n\n/**\n * Converts an absolute time to a number\n * @param {Number} The absolute time in ms\n * @returns {Number} The absolute time in ms\n */\nscheduler.toAbsoluteTime = function (absolute) {\n  return new Date(absolute);\n};\n\n/**\n * Converts the time span number/Date to a relative virtual time value.\n * @param {Number} timeSpan TimeSpan value to convert.\n * @return {Number} Corresponding relative virtual time value.\n */\nscheduler.toRelativeTime = function (timeSpan) {\n  return timeSpan;\n};\n\n// Schedule some time\nscheduler.scheduleAbsolute(null, new Date(1), function () { console.log('foo'); });\nscheduler.scheduleAbsolute(null, new Date(2), function () { console.log('bar'); });\nscheduler.scheduleAbsolute(null, new Date(3), function () { scheduler.stop(); });\n\n// Start the scheduler\nscheduler.start();\n\n// => foo\n// => bar\n\n// Check the clock once stopped\nconsole.log(scheduler.now());\n// => 3\n\nconsole.log(scheduler.clock);\n// => 3\n```\n\n\n### Location\n\nFile:\n- [`virtualtimescheduler.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/virtualtimescheduler.js)\n\nDist:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.virtualtime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.virtualtime.js)\n\n## `VirtualTimeScheduler Constructor` ##\n- [`constructor`](#rxvirtualtimeschedulerinitialclock-comparer)\n\n## `VirtualTimeScheduler Instance Methods` ##\n- [`advanceBy`](#rxvirtualtimeschedulerprototypeadvancebytime)\n- [`advanceTo`](#rxvirtualtimeschedulerprototypeadvancetotime)\n- [`scheduleAbsolute`](#rxvirtualtimeschedulerprototypescheduleabsolutestate-duetime-action)\n- [`scheduleRelative`](#rxvirtualtimeschedulerprototypeschedulerelativestate-duetime-action)\n- [`sleep`](#rxvirtualtimeschedulerprototypesleeptime)\n- [`start`](#rxvritualtimeschedulerprototypestart)\n- [`stop`](#rxvritualtimeschedulerprototypestop)\n\n## `VirtualTimeScheduler Instance Properties` ##\n- [`isEnabled`](#isenabled)\n\n## `VirtualTimeScheduler Protected Abstract Methods` ##\n- [`add`](#rxvirtualtimeschedulerprototypeaddabsolute-relative)\n- [`toAbsoluteTime`](#rxvirtualtimeschedulerprototypetoabsolutetimeabsolute)\n- [`toRelativeTime`](#rxvirtualtimeschedulerprototypetorelativetimetimespan)\n\n## `VirtualTimeScheduler Protected Methods` ##\n- [`getNext`](#rxvirtualtimeschedulerprototypegetnext)\n\n## Inherited Classes ##\n- [`Rx.Scheduler`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/schedulers/scheduler.md)\n\n## _VirtualTimeScheduler Constructor_ ##\n\n### <a id=\"rxvirtualtimescheduler\"></a>`Rx.VirtualTimeScheduler(initialClock, comparer)`\n<a href=\"#rxvirtualtimescheduler\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/virtualtimescheduler.js#L38-L44 \"View in source\")\n\nCreates a new virtual time scheduler with the specified initial clock value and absolute time comparer.\n\n#### Arguments\n1. `initialClock` *(Function)*: Initial value for the clock.\n2. `comparer` *(Function)*: Comparer to determine causality of events based on absolute time.\n\n#### Example\n```js\nfunction comparer (x, y) {\n  if (x > y) { return 1; }\n  if (x < y) { return -1; }\n  return 0;\n}\n\nvar scheduler = new Rx.VirtualTimeScheduler(\n  0,          /* initial clock of 0 */\n  comparer    /* comparer for determining order */\n);\n```\n\n***\n\n## _VirtualTimeScheduler Instance Methods_ ##\n\n### <a id=\"rxvirtualtimeschedulerprototypeadvancebytime\"></a>`Rx.VirtualTimeScheduler.prototype.advanceBy(time)`\n<a href=\"#rxvirtualtimeschedulerprototypeadvancebytime\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/virtualtimescheduler.js#L166-L176 \"View in source\")\n\nAdvances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n\n#### Arguments\n1. `time` *(Any)*: Relative time to advance the scheduler's clock by.\n\n#### Example\n```js\nvar scheduler = new MyVirtualScheduler(\n  200 /* initial time */\n);\n\nscheduler.scheduleAbsolute(null, 250, function () {\n  console.log('hello');\n});\n\nscheduler.advanceBy(300);\n// => hello\n\nconsole.log(scheduler.clock);\n// => 500\n```\n\n***\n\n### <a id=\"rxvirtualtimeschedulerprototypeadvancetotime\"></a>`Rx.VirtualTimeScheduler.prototype.advanceTo(time)`\n<a href=\"#rxvirtualtimeschedulerprototypeadvancetotime\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/virtualtimescheduler.js \"View in source\")\n\nAdvances the scheduler's clock to the specified time, running all work till that point.\n\n#### Arguments\n1. `time` *(Any)*: Absolute time to advance the scheduler's clock to.\n\n#### Example\n```js\nvar scheduler = new MyVirtualScheduler(\n  0 /* initial time */\n);\n\nscheduler.scheduleAbsolute(null, 100, function () {\n  console.log('hello');\n});\n\nscheduler.scheduleAbsolute(null, 200, function () {\n  console.log('world');\n});\n\nscheduler.advanceBy(300);\n// => hello\n// => world\n\nconsole.log(scheduler.clock);\n// => 300\n```\n\n***\n\n### <a id=\"rxvirtualtimeschedulerprototypescheduleabsolutestate-duetime-action\"></a>`Rx.VirtualTimeScheduler.prototype.scheduleAbsolute(state, dueTime, action)`\n<a href=\"#rxvirtualtimeschedulerprototypescheduleabsolutestate-duetime-action\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/virtualtimescheduler.js \"View in source\")\n\nSchedules an action to be executed at dueTime.\n\n#### Arguments\n1. `state`: *(Any)*: State passed to the action to be executed.\n2. `dueTime` *(Any)*: Absolute time at which to execute the action.\n3. `action`: `Function`: Action to execute with the following arguments:\n  1. `scheduler`: `Scheduler` - The current Scheduler\n  2. `state`: `Any` - The current state\n\n#### Returns\n*(Disposable)*: The disposable object used to cancel the scheduled action (best effort).\n\n#### Example\n```js\nvar scheduler = new MyVirtualScheduler(\n  0 /* initial time */\n);\n\nscheduler.scheduleAbsolute('world', 100, function (scheduler, state) {\n  console.log('hello ' + state);\n});\n\nscheduler.scheduleAbsolute('moon', 200, function (scheduler, state) {\n  console.log('goodnight ' + state);\n});\n\nscheduler.start();\n// => hello world\n// => goodnight moon\n\nconsole.log(scheduler.clock);\n// => 200\n```\n\n***\n\n### <a id=\"rxvirtualtimeschedulerprototypeschedulerelativestate-duetime-action\"></a>`Rx.VirtualTimeScheduler.prototype.scheduleRelative(state, dueTime, action)`\n<a href=\"#rxvirtualtimeschedulerprototypeschedulerelativestate-duetime-action\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/virtualtimescheduler.js#L89-L92 \"View in source\")\n\nSchedules an action to be executed at dueTime.\n\n#### Arguments\n1. `state`: *(Any)*: State passed to the action to be executed.\n2. `dueTime` *(Any)*: Relative time after which to execute the action.\n3. `action`: `Function`: Action to execute with the following arguments:\n  1. `scheduler`: `Scheduler` - The current Scheduler\n  2. `state`: `Any` - The current state\n\n#### Returns\n*(Disposable)*: The disposable object used to cancel the scheduled action (best effort).\n\n#### Example\n```js\nvar scheduler = new MyVirtualScheduler(\n  0 /* initial time */\n);\n\nscheduler.scheduleRelative('world', 100, function (scheduler, state) {\n  console.log('hello ' + state);\n});\n\nscheduler.scheduleRelative('moon', 200, function (scheduler, state) {\n  console.log('goodnight ' + state);\n});\n\nscheduler.start();\n// => hello world\n// => goodnight moon\n\nconsole.log(scheduler.clock);\n// => 300\n```\n\n***\n\n### <a id=\"rxvritualtimeschedulerprototypesleeptime\"></a>`Rx.VirtualTimeScheduler.prototype.sleep(time)`\n<a href=\"#rxvritualtimeschedulerprototypesleeptime\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/virtualtimescheduler.js#L182-L190 \"View in source\")\n\nAdvances the scheduler's clock by the specified relative time.\n\n#### Arguments\n1. `time` *(Any)*: Relative time to advance the scheduler's clock by.\n\n#### Example\n```js\nvar scheduler = new MyVirtualScheduler(\n  0 /* initial time */\n);\n\nscheduler.sleep(400);\n\nconsole.log(scheduler.clock);\n// => 400\n```\n\n***\n\n### <a id=\"rxvritualtimeschedulerprototypestart\"></a>`Rx.VirtualTimeScheduler.prototype.start()`\n<a href=\"#rxvritualtimeschedulerprototypestart\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/virtualtimescheduler.js#L107-L123 \"View in source\")\n\nStarts the virtual time scheduler.\n\n#### Example\n```js\nvar scheduler = new MyVirtualScheduler(\n  0 /* initial time */\n);\n\nscheduler.scheduleRelative('world', 100, function (scheduler, state) {\n  console.log('hello ' + state);\n});\n\nscheduler.scheduleRelative('moon', 200, function (scheduler, state) {\n  console.log('goodnight ' + state);\n});\n\nscheduler.start();\n// => hello world\n// => goodnight moon\n\nconsole.log(scheduler.clock);\n// => 400\n```\n\n***\n\n### <a id=\"rxvritualtimeschedulerprototypestop\"></a>`Rx.VirtualTimeScheduler.prototype.stop()`\n<a href=\"#rxvritualtimeschedulerprototypestop\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/concurrency/virtualtimescheduler.js#L128-L130 \"View in source\")\n\nStops the virtual time scheduler.\n\n#### Example\n```js\nvar scheduler = new MyVirtualScheduler(\n  0 /* initial time */\n);\n\nscheduler.scheduleRelative('world', 100, function (scheduler, state) {\n  console.log('hello ' + state);\n});\n\nscheduler.scheduleRelative(null, 100, function (scheduler, state) {\n  scheduler.stop();\n});\n\nscheduler.scheduleRelative(null, 100, function (scheduler, state) {\n  console.log('goodbye cruel ' + state);\n});\n\nscheduler.start();\n// => hello world\n```\n\n***\n\n## _VirtualTimeScheduler Abstract Protected Methods_ ##\n\n### <a id=\"rxvirtualtimeschedulerprototypeaddabsolute-relative\"></a>`Rx.VirtualTimeScheduler.prototype.add(absolute, relative)`\n<a href=\"#rxvirtualtimeschedulerprototypeaddabsolute-relative\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/subjects/asyncsubject.js#L54 \"View in source\")\n\nAdds a relative time value to an absolute time value.  This method is used in several methods including `scheduleRelative`, `advanceBy` and `sleep`.\n\n### Arguments\n1. `absolute` *(Any)*: Absolute virtual time value.\n2. `relative` *(Any)*: Relative virtual time value.\n\n#### Returns\n*(Any)*: Resulting absolute virtual time sum value.\n\n#### Example\n\nOne possible implementation could be as simple as the following:\n\n```js\nscheduler.add = function (absolute, relative) {\n    return absolute + relative;\n};\n```\n\n***\n\n### <a id=\"rxvirtualtimeschedulerprototypetoabsolutetimeabsolute\"></a>`Rx.VirtualTimeScheduler.prototype.toAbsoluteTime(absolute)`\n<a href=\"#rxvirtualtimeschedulerprototypetoabsolutetimeabsolute\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/subjects/asyncsubject.js#L61 \"View in source\")\n\nConverts an absolute time to a number.  This is used directly in the `now` method on the `Rx.Scheduler`\n\n### Arguments\n1. `absolute` *(Any)*: The absolute time to convert.\n\n#### Returns\n*(Number)*: The absolute time in ms.\n\n#### Example\n\nOne possible implementation could be as simple as the following:\n\n```js\n// String -> Number\nscheduler.toAbsoluteTime = function (absolute) {\n  return absolute.length;\n};\n```\n\n***\n\n### <a id=\"rxvirtualtimeschedulerprototypetorelativetimetimespan\"></a>`Rx.VirtualTimeScheduler.prototype.toRelativeTime(timeSpan)`\n<a href=\"#rxvirtualtimeschedulerprototypetorelativetimetimespan\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/subjects/asyncsubject.js#L61 \"View in source\")\n\nConverts the time span number/Date to a relative virtual time value.\n\n### Arguments\n1. `timeSpan` *(Any)*: The time span number value to convert.  This is used directly in `scheduleFuture`.\n\n#### Returns\n*(Number)*: Corresponding relative virtual time value.\n\n#### Example\n\nOne possible implementation could be as simple as the following:\n\n```js\n// Number -> Number\nscheduler.toRelativeTime = function (timeSpan) {\n  return timeSpan;\n};\n```\n\n***\n"
  },
  {
    "path": "doc/api/subjects/asyncsubject.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# `Rx.AsyncSubject` class #\n\nRepresents the result of an asynchronous operation.  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n\nThis class inherits both from the `Rx.Observable` and `Rx.Observer` classes.\n\n## Usage ##\n\nThe following example shows caching on the last value produced when followed by an onCompleted notification which makes it available to all subscribers.\n\n```js\nvar subject = new Rx.AsyncSubject();\n\nvar i = 0;\nvar handle = setInterval(function () {\n\tsubject.onNext(i);\n\tif (++i > 3) {\n\t\tsubject.onCompleted();\n\t\tclearInterval(handle);\n\t}\n}, 500);\n\nvar subscription = subject.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 3\n// => Completed\n```\n\n### Location\n\n- rx.js\n\n## `AsyncSubject Constructor` ##\n- [`constructor`](#rxasyncsubject)\n\n## `AsyncSubject Instance Methods` ##\n- [`dispose`](#rxasyncsubjectprototypedispose)\n- [`hasObservers`](#rxasyncsubjectprototypehasobservers)\n\n## Inherited Classes ##\n- [`Rx.Observable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md)\n- [`Rx.Observer`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observer.md)\n\n## _AsyncSubject Constructor_ ##\n\n### <a id=\"rxasyncsubject\"></a>`Rx.AsyncSubject()`\n<a href=\"#rxasyncsubject\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/subjects/asyncsubject.js#L33-L41 \"View in source\")\n\nCreates a subject that can only receive one value and that value is cached for all future observations.\n\n#### Example\n```js\nvar subject = new Rx.AsyncSubject();\n\nsubject.onNext(42);\nsubject.onCompleted();\n\nvar subscription = subject.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n// => Completed\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n## _AsyncSubject Instance Methods_ ##\n\n### <a id=\"rxasyncsubjectprototypedispose\"></a>`Rx.AsyncSubject.prototype.dispose()`\n<a href=\"#rxasyncsubjectprototypedispose\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/subjects/asyncsubject.js#L108-L113 \"View in source\")\n\nUnsubscribe all observers and release resources.\n\n#### Example\n```js\nvar subject = new Rx.AsyncSubject();\n\nvar subscription = subject.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\nsubject.onNext(42);\nsubject.onCompleted();\n\n// => Next: 42\n// => Completed\n\nsubject.dispose();\n\ntry {\n\tsubject.onNext(56);\n} catch (e) {\n\tconsole.log(e.message);\n}\n\n// => Object has been disposed\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n### <a id=\"rxasyncsubjectprototypehasobservers\"></a>`Rx.AsyncSubject.prototype.hasObservers()`\n<a href=\"#rxasyncsubjectprototypehasobservers\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/subjects/asyncsubject.js#L48-L51 \"View in source\")\n\nIndicates whether the subject has observers subscribed to it.\n\n#### Returns\n*(Boolean)*: Returns `true` if the AsyncSubject has observers, else `false`.\n\n#### Example\n```js\nvar subject = new Rx.AsyncSubject();\n\nconsole.log(subject.hasObservers());\n\n// => false\n\nvar subscription = subject.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\nconsole.log(subject.hasObservers());\n\n// => true\n```\n\n### Location\n\n- rx.js\n\n* * *\n"
  },
  {
    "path": "doc/api/subjects/behaviorsubject.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# `Rx.BehaviorSubject` class #\n\nRepresents a value that changes over time.  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications. If you are looking for BehaviorSubject without initial value see [`Rx.ReplaySubject`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/replaysubject.md).\n\nThis class inherits both from the `Rx.Observable` and `Rx.Observer` classes.\n\n## Usage ##\n\nThe follow example shows the basic usage of an `Rx.BehaviorSubject` class.\n\n```js\n/* Initialize with initial value of 42 */\nvar subject = new Rx.BehaviorSubject(42);\n\nvar subscription = subject.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 42\n\nsubject.onNext(56);\n// => Next: 56\n\nsubject.onCompleted();\n// => Completed\n```\n\n### Location\n\n- rx.binding.js\n\n## `BehaviorSubject Constructor` ##\n- [`constructor`](#rxbehaviorsubjectintialvalue)\n\n## `BehaviorSubject Instance Methods` ##\n- [`dispose`](#rxbehaviorsubjectprototypedispose)\n- [`getValue`](#rxbehaviorsubjectprototypegetvalue)\n- [`hasObservers`](#rxbehaviorsubjectprototypehasobservers)\n\n## Inherited Classes ##\n- [`Rx.Observable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md)\n- [`Rx.Observer`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observer.md)\n\n## _BehaviorSubject Constructor_ ##\n\n### <a id=\"rxbehaviorsubjectintialvalue\"></a>`Rx.BehaviorSubject(initialValue)`\n<a href=\"#rxbehaviorsubjectintialvalue\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/subjects/behaviorsubject.js#L27-L34 \"View in source\")\n\nInitializes a new instance of the `Rx.BehaviorSubject` class which creates a subject that caches its last value and starts with the specified value.\n\n#### Arguments\n1. `initialValue` *(Any)*: Initial value sent to observers when no other value has been received by the subject yet.\n\n#### Example\n```js\nvar subject = new Rx.BehaviorSubject(56);\n\nsubject.onCompleted();\n\nvar subscription = subject.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: 56\n\nsubject.onNext(42);\n// => Next: 42\n\nsubject.onCompleted();\n// => Completed\n```\n\n### Location\n\n= rx.binding.js\n\n* * *\n\n## _BehaviorSubject Instance Methods_ ##\n\n### <a id=\"rxbehaviorsubjectprototypedispose\"></a>`Rx.BehaviorSubject.prototype.dispose()`\n<a href=\"#rxbehaviorsubjectprototypedispose\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/subjects/behaviorsubject.js#L101-L106 \"View in source\")\n\nUnsubscribe all observers and release resources.\n\n#### Example\n```js\nvar subject = new Rx.BehaviorSubject();\n\nvar subscription = subject.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\nsubject.onNext(42);\n// => Next: 42\n\nsubject.onCompleted();\n// => Completed\n\nsubject.dispose();\n\ntry {\n\tsubject.onNext(56);\n} catch (e) {\n\tconsole.log(e.message);\n}\n\n// => Object has been disposed\n```\n\n### Location\n\n= rx.binding.js\n\n* * *\n\n### <a id=\"rxbehaviorsubjectprototypegetvalue\"></a>`Rx.BehaviorSubject.prototype.getValue()`\n<a href=\"#rxbehaviorsubjectprototypegetvalue\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/subjects/behaviorsubject.js#L44-L50 \"View in source\")\n\nGets the current value or throws an exception.\nValue is frozen after `onCompleted` is called.\nAfter `onError` is called always throws the specified exception.\nAn exception is always thrown after `dispose` is called.\n\n#### Returns\n*(Mixed)*: The initial `value` passed to the constructor until `onNext` is called; after which, the last value passed to `onNext`.\n\n#### Example\n```js\nvar subject = new Rx.BehaviorSubject(56);\n\nconsole.log('Value is: ' + subject.getValue());\n\n// => Value is: 56\n\nsubject.onNext(42);\n\nconsole.log('Value is: ' + subject.getValue());\n\n// => Value is: 42\n\nsubject.onCompleted();\n\nsubject.onNext(100);\n\nconsole.log('Value is frozen: ' + subject.getValue());\n\n// => Value is frozen: 42\n\nsubject.dispose();\n\ntry {\n    subject.getValue();\n} catch (e) {\n    console.log(e.message);\n}\n\n// => Object has been disposed\n```\n\n### Location\n\n= rx.binding.js\n\n* * *\n\n### <a id=\"rxbehaviorsubjectprototypehasobservers\"></a>`Rx.BehaviorSubject.prototype.hasObservers()`\n<a href=\"#rxbehaviorsubjectprototypehasobservers\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/subjects/behaviorsubject.js#L55 \"View in source\")\n\nIndicates whether the subject has observers subscribed to it.\n\n#### Returns\n*(Boolean)*: Returns `true` if the Subject has observers, else `false`.\n\n#### Example\n```js\nvar subject = new Rx.BehaviorSubject();\n\nconsole.log(subject.hasObservers());\n\n// => false\n\nvar subscription = subject.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\nconsole.log(subject.hasObservers());\n\n// => true\n```\n\n### Location\n\n= rx.binding.js\n\n* * *\n"
  },
  {
    "path": "doc/api/subjects/replaysubject.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# `Rx.ReplaySubject` class #\n\nRepresents an object that is both an observable sequence as well as an observer.  Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n\nThis class inherits both from the `Rx.Observable` and `Rx.Observer` classes.\n\n## Usage ##\n\nThe follow example shows the basic usage of an `Rx.ReplaySubject` class.  Note that this only holds the past two items in the cache.\n\n```js\nvar subject = new Rx.ReplaySubject(2 /* buffer size */);\n\nsubject.onNext('a');\nsubject.onNext('b');\nsubject.onNext('c');\n\nvar subscription = subject.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: b\n// => Next: c\n\nsubject.onNext('d');\n// => Next: d\n```\n\n### Location\n\n- rx.binding.js\n\n## `ReplaySubject Constructor` ##\n- [`constructor`](#rx)\n\n## `ReplaySubject Instance Methods` ##\n- [`dispose`](#rxreplaysubjectprototypedispose)\n- [`hasObservers`](#rxreplaysubjectprototypehasobservers)\n\n## Inherited Classes ##\n- [`Rx.Observable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md)\n- [`Rx.Observer`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observer.md)\n\n## _ReplaySubject Constructor_ ##\n\n### <a id=\"rxreplaysubjectbuffersize-windowSize-scheduler\"></a>`Rx.ReplaySubject([bufferSize], [windowSize], [scheduler])`\n<a href=\"#rxreplaysubjectintialvalue\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/subjects/replaysubject.js#L53-L64 \"View in source\")\n\nInitializes a new instance of the `Rx.ReplaySubject` class with the specified buffer size, window and scheduler.\n\n#### Arguments\n1. `[bufferSize = Number.MAX_VALUE]` *(Number)*: Maximum element count of the replay buffer.\n2. `[windowSize = NUMBER.MAX_VALUE]` *(Number)*: Maximum time length of the replay buffer.\n3. `[scheduler = Rx.Scheduler.currentThread]` *(Scheduler)*: Scheduler the observers are invoked on.\n\n#### Example\n```js\nvar subject = new Rx.ReplaySubject(\n    2 /* buffer size */,\n    null /* unlimited time buffer */,\n    Rx.Scheduler.timeout);\n\nsubject.onNext('a');\nsubject.onNext('b');\nsubject.onNext('c');\n\nvar subscription = subject.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\n// => Next: b\n// => Next: c\n\nsubject.onNext('d');\n// => Next: d\n```\n\n### Location\n\n- rx.binding.js\n\n* * *\n\n## _ReplaySubject Instance Methods_ ##\n\n### <a id=\"rxreplaysubjectprototypedispose\"></a>`Rx.ReplaySubject.prototype.dispose()`\n<a href=\"#rxreplaysubjectprototypedispose\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/subjects/replaysubject.js#L130-L133 \"View in source\")\n\nUnsubscribe all observers and release resources.\n\n#### Example\n```js\nvar subject = new Rx.ReplaySubject();\n\nvar subscription = subject.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\nsubject.onNext(42);\n// => Next: 42\n\nsubject.onCompleted();\n// => Completed\n\nsubject.dispose();\n\ntry {\n\tsubject.onNext(56);\n} catch (e) {\n\tconsole.log(e.message);\n}\n\n// => Object has been disposed\n```\n\n### Location\n\n- rx.binding.js\n\n* * *\n\n### <a id=\"rxreplaysubjectprototypehasobservers\"></a>`Rx.ReplaySubject.prototype.hasObservers()`\n<a href=\"#rxreplaysubjectprototypehasobservers\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/subjects/replaysubject.js#L61-L63 \"View in source\")\n\nIndicates whether the subject has observers subscribed to it.\n\n#### Returns\n*(Boolean)*: Returns `true` if the Subject has observers, else `false`.\n\n#### Example\n```js\nvar subject = new Rx.ReplaySubject();\n\nconsole.log(subject.hasObservers());\n\n// => false\n\nvar subscription = subject.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\nconsole.log(subject.hasObservers());\n\n// => true\n```\n\n### Location\n\n- rx.binding.js\n\n* * *\n"
  },
  {
    "path": "doc/api/subjects/subject.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# `Rx.Subject` class #\n\nRepresents an object that is both an observable sequence as well as an observer. Each notification is broadcasted to all subscribed observers.\n\nThis class inherits both from the `Rx.Observable` and `Rx.Observer` classes.\n\n## Usage ##\n\nThe following example shows the basic usage of an Rx.Subject.\n\n```js\nvar subject = new Rx.Subject();\n\nvar subscription = subject.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\nsubject.onNext(42);\n\n// => Next: 42\n\nsubject.onNext(56);\n\n// => Next: 56\n\nsubject.onCompleted();\n\n// => Completed\n```\n\n### Location\n\n- rx.js\n\n## `Subject Constructor` ##\n- [`constructor`](#rxsubject)\n\n## `Subject Class Methods` ##\n- [`create`](#rxsubjectcreateobserver-observable)\n\n## `Subject Instance Methods` ##\n- [`dispose`](#rxsubjectprototypedispose)\n- [`hasObservers`](#rxsubjectprototypehasobservers)\n\n## Inherited Classes ##\n- [`Rx.Observable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md)\n- [`Rx.Observer`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observer.md)\n\n## _Subject Constructor_ ##\n\n### <a id=\"rxsubject\"></a>`Rx.Subject()`\n<a href=\"#rxsubject\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/subjects/subject.js#L26-L31 \"View in source\")\n\nCreates a subject.\n\n#### Example\n```js\nvar subject = new Rx.Subject();\n\nvar subscription = subject.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\nsubject.onNext(42);\n// => Next: 42\n\nsubject.onCompleted();\n// => Completed\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n## _Subject Class Methods_ ##\n\n### <a id=\"rxsubjectcreateobserver-observable\"></a>`Rx.Subject.create(observer, observable)`\n<a href=\"#rxsubjectcreateobserver-observable\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/subjects/subject.js#L101-L103 \"View in source\")\n\nCreates a subject from the specified observer and observable.\n\n#### Arguments\n1. `observer` *(Observer)*: The observer used to send messages to the subject.\n2. `observable` *(Observable)*: The observable used to subscribe to messages sent from the subject.\n\n#### Returns\n*(Subject)*: Subject implemented using the given observer and observable.\n\n#### Example\n\n```js\n/* Using a Web Worker to send and receive data via an Rx.Subject */\n\n/* worker.js */\n\nself.onmessage = function(e) {\n    self.postMessage(e.data);\n};\n\n/* client.js */\nvar worker = new Worker('worker.js');\n\n// Create observer to handle sending messages\nvar observer = Rx.Observer.create(\n    function (data) {\n        worker.postMessage(data);\n    });\n\n// Create observable to handle the messages\nvar observable = Rx.Observable.create(function (obs) {\n\n    worker.onmessage = function (data) {\n        obs.onNext(data);\n    };\n\n    worker.onerror = function (err) {\n        obs.onError(err);\n    };\n\n    return function () {\n        worker.close();\n    };\n});\n\nvar subject = Rx.Subject.create(observer, observable);\n\nvar subscription = subject.subscribe(\n    function (x) {\n        console.log('Next: ' + x);\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\nsubject.onNext(42);\n// => Next: 42\n\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n## _Subject Instance Methods_ ##\n\n### <a id=\"rxsubjectprototypedispose\"></a>`Rx.Subject.prototype.dispose()`\n<a href=\"#rxsubjectprototypedispose\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/subjects/subject.js#L89-L92 \"View in source\")\n\nUnsubscribe all observers and release resources.\n\n#### Example\n```js\nvar subject = new Rx.Subject();\n\nvar subscription = subject.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\nsubject.onNext(42);\n// => Next: 42\n\nsubject.onCompleted();\n// => Completed\n\nsubject.dispose();\n\ntry {\n\tsubject.onNext(56);\n} catch (e) {\n\tconsole.log(e.message);\n}\n\n// => Object has been disposed\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n### <a id=\"rxsubjectprototypehasobservers\"></a>`Rx.Subject.prototype.hasObservers()`\n<a href=\"#rxsubjectprototypehasobservers\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/subjects/subject.js#L38-L40 \"View in source\")\n\nIndicates whether the subject has observers subscribed to it.\n\n#### Returns\n*(Boolean)*: Returns `true` if the Subject has observers, else `false`.\n\n#### Example\n```js\nvar subject = new Rx.Subject();\n\nconsole.log(subject.hasObservers());\n// => false\n\nvar subscription = subject.subscribe(\n    function (x) {\n        console.log('Next: ' + x.toString());\n    },\n    function (err) {\n        console.log('Error: ' + err);\n    },\n    function () {\n        console.log('Completed');\n    });\n\nconsole.log(subject.hasObservers());\n// => true\n```\n\n### Location\n\n- rx.js\n\n* * *\n"
  },
  {
    "path": "doc/api/testing/reactivetest.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# `Rx.ReactiveTest` class #\n\nThis class contains test utility methods such as create notifications for testing purposes.\n\n### Location\n\n- rx.testing.js\n\n## `ReactiveTest Class Methods` ##\n- [`onCompleted`](#rxreactivetestoncompletedticks)\n- [`onError`](#rxreactivetestonerrorticksexception)\n- [`onNext`](#rxreactivetestonnextticksvalue)\n- [`subscribe`](#rxasyncsubjectprototypehasobservers)\n\n## `ReactiveTest Class Fields` ##\n- [`created`](#rxreactivetestcreated)\n- [`disposed`](#rxreactivetestdisposed)\n- [`subscribed`](#rxreactivetestsubscribed)\n\n## _ReactiveTest Class Methods_ ##\n\n### <a id=\"rxreactivetestoncompletedticks\"></a>`Rx.ReactiveTest.onCompleted(ticks)`\n<a href=\"#rxreactivetestoncompletedticks\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/reactivetest.js#L89-L91 \"View in source\")\n\nFactory method for an OnCompleted notification record at a given time.\n\n#### Arguments\n1. `ticks` *(Number)*: Recorded virtual time the OnCompleted notification occurs.\n\n#### Returns\n*(Recorded)*: OnCompleted notification.\n\n#### Example\n```js\nvar onCompleted = Rx.ReactiveTest.onCompleted;\n\nvar scheduler = new Rx.TestScheduler();\n\nvar xs = scheduler.createHotObservable(\n  onCompleted(260)\n);\n\nvar res = scheduler.startScheduler(function () {\n  return xs.map(function (x) { return x; });\n});\n\n// Write custom assertion\ncollectionAssert.assertEqual(res.messages, [\n  onCompleted(260)\n]);\n```\n\n### Location\n\n- rx.testing.js\n\n* * *\n\n### <a id=\"rxreactivetestonerrorticksexception\"></a>`Rx.ReactiveTest.onError(ticks, exception)`\n<a href=\"#rxreactivetestonerrorticksexception\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/reactivetest.js#L77-L82 \"View in source\")\n\nFactory method for an OnError notification record at a given time with a given error.\n\n#### Arguments\n1. `ticks` *(Number)*: Recorded virtual time the OnError notification occurs.\n2. `exception` *(Error | Function)*: Recorded exception stored in the OnError notification or a predicate\n\n#### Returns\n*(Recorded)*: Recorded OnError notification.\n\n#### Example\n\n```js\nvar ex = new Error('woops');\n\nvar onError = Rx.ReactiveTest.onError;\n\nvar scheduler = new Rx.TestScheduler();\n\nvar xs = scheduler.createHotObservable(\n    onError(201, ex)\n);\n\nvar res = scheduler.startScheduler(function () {\n  return xs.map(function (x) { return x; });\n});\n\n// Write custom assertion\ncollectionAssert.assertEqual(res.messages, [\n\n  // Using a predicate\n  onError(201, function (e) { return e.message === 'woops'; })\n]);\n```\n\n### Location\n\n- rx.testing.js\n\n* * *\n\n### <a id=\"rxreactivetestonnextticksvalue\"></a>`Rx.ReactiveTest.onNext(ticks, value)`\n<a href=\"#rxreactivetestonnextticksvalue\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/reactivetest.js#L61-L66 \"View in source\")\n\nFactory method for an OnNext notification record at a given time with a given error.\n\n#### Arguments\n1. `ticks` *(Number)*: Recorded virtual time the OnNext notification occurs.\n2. `value` *(Any | Function)*: Recorded exception stored in the OnNext notification or a predicate\n\n#### Returns\n*(Recorded)*: Recorded OnNext notification.\n\n#### Example\n\n```js\nvar onNext = Rx.ReactiveTest.onNext;\n\nvar scheduler = new Rx.TestScheduler();\n\nvar xs = scheduler.createHotObservable(\n    onNext(201, 42)\n);\n\nvar res = scheduler.startScheduler(function () {\n  return xs.map(function (x) { return x; });\n});\n\n// Write custom assertion\ncollectionAssert.assertEqual(res.messages, [\n\n  // Using a predicate\n  onNext(201, function (x) { return x === 42; })\n]);\n```\n\n### Location\n\n- rx.testing.js\n\n* * *\n\n## _ReactiveTest Class Fields_ ##\n\n### <a id=\"rxreactivetestcreated\"></a>`Rx.ReactiveTest.created`\n<a href=\"#rxreactivetestcreated\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/reactivetest.js#L45 \"View in source\")\n\nDefault virtual time used for creation of observable sequences in unit tests.  This has a value of `100`.\n\n#### Example\n\n```js\nvar scheduler = new Rx.TestScheduler();\n\nvar xs = scheduler.createHotObservable(\n  Rx.ReactiveTest.onNext(201, 42),\n  Rx.ReactiveTest.onNext(202, 56),\n  Rx.ReactiveTest.onCompleted(203)\n);\n\nvar res = scheduler.startScheduler(\n  function () { return xs.map(function (x) { return x; })},\n  Rx.ReactiveTest.created,\n  Rx.ReactiveTest.subscribed,\n  Rx.ReactiveTest.disposed\n);\n```\n\n### Location\n\n- rx.testing.js\n\n* * *\n\n### <a id=\"rxreactivetestdisposed\"></a>`Rx.ReactiveTest.disposed`\n<a href=\"#rxreactivetestdisposed\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/reactivetest.js#L49 \"View in source\")\n\nDefault virtual time used to dispose subscriptions in unit tests.  This has a value of `1000`.\n\n#### Example\n\n```js\nvar scheduler = new Rx.TestScheduler();\n\nvar xs = scheduler.createHotObservable(\n  Rx.ReactiveTest.onNext(201, 42),\n  Rx.ReactiveTest.onNext(202, 56),\n  Rx.ReactiveTest.onCompleted(203)\n);\n\nvar res = scheduler.startScheduler(\n  function () { return xs.map(function (x) { return x; })},\n  {\n    created: Rx.ReactiveTest.created,\n    subscribed: Rx.ReactiveTest.subscribed,\n    disposed: Rx.ReactiveTest.disposed\n  }\n);\n```\n\n### Location\n\n- rx.testing.js\n\n* * *\n\n### <a id=\"rxreactivetestsubscribed\"></a>`Rx.ReactiveTest.subscribed`\n<a href=\"#rxreactivetestsubscribed\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/reactivetest.js#L47 \"View in source\")\n\nDefault virtual time used to subscribe to observable sequences in unit tests.  This has a value of `200`.\n\n#### Example\n\n```js\nvar scheduler = new Rx.TestScheduler();\n\nvar xs = scheduler.createHotObservable(\n  Rx.ReactiveTest.onNext(201, 42),\n  Rx.ReactiveTest.onNext(202, 56),\n  Rx.ReactiveTest.onCompleted(203)\n);\n\nvar res = scheduler.startScheduler(\n  function () { return xs.map(function (x) { return x; })}\n);\n```\n\n### Location\n\n- rx.testing.js\n\n* * *\n"
  },
  {
    "path": "doc/api/testing/recorded.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# `Rx.Recorded` class #\n\nRecord of a value including the virtual time it was produced on.\n\n### Location\n\n- rx.testing.js\n\n## `Recorded Constructor` ##\n- [`constructor`](#rxrecordedtime-value-comparer)\n\n## `Recorded Instance Methods` ##\n- [`equals`](#rxrecordedprototypeequalsother)\n- [`toString`](#rxrecordedprototypetostring)\n\n## `Recorded Instance Properties` ##\n- [`time`](#time)\n- [`value`](#value)\n\n## _Recorded Constructor_ ##\n\n### <a id=\"rxrecordedtime-value-comparer\"></a>`Rx.Recorded(time, value, [comparer])`\n<a href=\"#rxrecordedtime-value-comparer\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/recorded.js#L9-L13 \"View in source\")\n\nCreates a new object recording the production of the specified value at the given virtual time.\n\n#### Arguments\n1. `time` *(Number)*: Virtual time the value was produced on.\n2. `value` *(Any)*: Value that was produced\n3. `[comparer]` *(Function)*: Optional comparer function.\n\n#### Example\n```js\nvar recorded = new Rx.Recorded(200, 'value');\n\nconsole.log(recorded.time);\n// => 200\n\nconsole.log(recorded.value);\n// => value\n```\n\n### Location\n\n- rx.js\n\n* * *\n\n## _Recorded Instance Methods_ ##\n\n### <a id=\"rxrecordedprototypeequalsother\"></a>`Rx.Recorded.prototype.equals(other)`\n<a href=\"#rxrecordedprototypeequalsother\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/recorded.js#L21-L23 \"View in source\")\n\nChecks whether the given recorded object is equal to the current instance.\n\n#### Arguments\n1. `other` *(Recorded)*: Recorded object to check for equality.\n\n#### Returns\n*(Boolean)*: Returns `true` if the Recorded equals the other, else `false`.\n\n#### Example\n\n```js\nvar r1 = new Recorded(201, 'foo');\nvar r2 = new Recorded(201, 'bar');\nvar r3 = new Recorded(201, 'foo');\n\nconsole.log(r1.equals(r2));\n// => false\n\nconsole.log(r1.equals(r3));\n// => true\n```\n\n### Location\n\n- rx.testing.js\n\n* * *\n\n### <a id=\"rxrecordedprototypetostring\"></a>`Rx.Recorded.prototype.toString()`\n<a href=\"#rxrecordedprototypeequalsother\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/recorded.js#L30-L32 \"View in source\")\n\nReturns a string representation of the current Recorded value.\n\n#### Returns\n*(String)*: String representation of the current Recorded value.\n\n#### Example\n\n```js\nvar r1 = new Recorded(201, 'foo');\n\nconsole.log(r1.toString());\n// => foo@201\n```\n\n### Location\n\n- rx.testing.js\n\n* * *\n\n## _Recorded Instance Properties_ ##\n\n### <a id=\"time\"></a>`time`\n<a href=\"#time\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/recorded.js#L10 \"View in source\")\n\nGets the virtual time the value was produced on.\n\n#### Returns\n*(Number)*: The virtual time the value was produced on.\n\n#### Example\n\n```js\nvar r1 = new Recorded(201, 'foo');\n\nconsole.log(r1.time);\n// => 201\n```\n\n### Location\n\n- rx.testing.js\n\n* * *\n\n### <a id=\"value\"></a>`value`\n<a href=\"#value\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/recorded.js#L11 \"View in source\")\n\nGets the recorded value.\n\n#### Returns\n*(Number)*: The recorded value.\n\n#### Example\n\n```js\nvar r1 = new Recorded(201, 'foo');\n\nconsole.log(r1.value);\n// => foo\n```\n\n### Location\n\n- rx.testing.js\n\n* * *\n"
  },
  {
    "path": "doc/api/testing/subscription.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# `Rx.Subscription` class #\n\nRecords information about subscriptions to and unsubscriptions from observable sequences.\n\n### Location\n\n- rx.testing.js\n\n## `Subscription Constructor` ##\n- [`constructor`](#rxsubscriptionsubscribe-unsubscribe)\n\n## `Subscription Instance Methods` ##\n- [`equals`](#rxsubscriptionprototypeequalsother)\n- [`toString`](#rxsubscriptionprototypetostring)\n\n## `Subscription Instance Properties` ##\n- [`subscribe`](#subscribe)\n- [`unsubscribe`](#unsubscribe)\n\n## _Subscription Constructor_ ##\n\n### <a id=\"rxsubscriptionsubscribe-unsubscribe\"></a>`Rx.Subscription(subscribe, unsubscribe)`\n<a href=\"#rxsubscriptionsubscribe-unsubscribe\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/subscription.js#L8-L11 \"View in source\")\n\nCreates a new subscription object with the given virtual subscription and unsubscription time.\n\n#### Arguments\n1. `subscribe` *(Number)*: Virtual time at which the subscription occurred.\n2. `[unsubscribe = Number.MAX_VALUE]` *(Number)*: Virtual time at which the unsubscription occurred.\n\n#### Example\n```js\nvar subscription = new Rx.Subscription(200, 1000);\n\nconsole.log(subscription.subscribe);\n// => 200\n\nconsole.log(subscription.unsubscribe);\n// => 1000\n```\n\n### Location\n\n- rx.testing.js\n\n* * *\n\n## _Subscription Instance Methods_ ##\n\n### <a id=\"rxsubscriptionprototypeequalsother\"></a>`Rx.Subscription.prototype.equals(other)`\n<a href=\"#rxsubscriptionprototypeequalsother\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/subscription.js#L18-L20 \"View in source\")\n\nChecks whether the given subscription is equal to the current instance.\n\n#### Arguments\n1. `other` *(Subscription)*: Subscription object to check for equality.\n\n#### Returns\n*(Boolean)*: Returns `true` if the Subscription equals the other, else `false`.\n\n#### Example\n\n```js\nvar s1 = new Subscription(201, 500);\nvar s2 = new Subscription(201);\nvar s3 = new Subscription(201, 500);\n\nconsole.log(s1.equals(s2));\n// => false\n\nconsole.log(s1.equals(s3));\n// => true\n```\n\n### Location\n\n- rx.testing.js\n\n* * *\n\n### <a id=\"rxsubscriptionprototypetostring\"></a>`Rx.Subscription.prototype.toString()`\n<a href=\"#rxsubscriptionprototypetostring\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/subscription.js#L30-L32 \"View in source\")\n\nReturns a string representation of the current Subscription value.\n\n#### Returns\n*(String)*: String representation of the current Subscription value.\n\n#### Example\n\n```js\nvar s1 = new Subscription(201);\n\nconsole.log(s1.toString());\n// => (201, Infinite)\n\nvar s2 = new Subscription(201, 1000);\nconsole.log(s2.toString());\n// => (201, 1000)\n```\n\n### Location\n\n- rx.testing.js\n\n* * *\n\n## _Subscription Instance Properties_ ##\n\n### <a id=\"subscribe\"></a>`subscribe`\n<a href=\"#subscribe\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/subscription.js#L8 \"View in source\")\n\nGets the subscription virtual time.\n\n#### Returns\n*(Number)*: The subscription virtual time.\n\n#### Example\n\n```js\nvar s1 = new Subscription(201);\n\nconsole.log(s1.subscribe);\n// => 201\n```\n\n### Location\n\n- rx.testing.js\n\n* * *\n\n### <a id=\"unsubscribe\"></a>`unsubscribe`\n<a href=\"#value\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/subscription.js#L9 \"View in source\")\n\nGets the unsubscription virtual time.\n\n#### Returns\n*(Number)*: The unsubscription virtual time.\n\n#### Example\n\n```js\nvar s1 = new Subscription(201, 500);\n\nconsole.log(s1.unsubscribe);\n// => 500\n```\n\n### Location\n\n- rx.testing.js\n\n* * *\n"
  },
  {
    "path": "doc/api/testing/testscheduler.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# `Rx.TestScheduler` class #\n\nVirtual time scheduler used for testing applications and libraries built using Reactive Extensions.  This inherits from the `Rx.VirtualTimeScheduler` class.\n\n## Usage ##\n\nThe following shows an example of using the `Rx.TestScheduler`.  In order to make the end comparisons work, you must implement a collection assert, for example here using QUnit.\n\n```js\nfunction createMessage(expected, actual) {\n  return 'Expected: [' + expected.toString() + ']\\r\\nActual: [' + actual.toString() + ']';\n}\n\n// Using QUnit testing for assertions\nvar collectionAssert = {\n  assertEqual: function (actual, expected) {\n    var comparer = Rx.internals.isEqual, isOk = true;\n\n    if (expected.length !== actual.length) {\n      ok(false, 'Not equal length. Expected: ' + expected.length + ' Actual: ' + actual.length);\n      return;\n    }\n\n    for(var i = 0, len = expected.length; i < len; i++) {\n      isOk = comparer(expected[i], actual[i]);\n      if (!isOk) {\n        break;\n      }\n    }\n\n    ok(isOk, createMessage(expected, actual));\n  }\n};\n\nvar onNext = Rx.ReactiveTest.onNext,\n  onCompleted = Rx.ReactiveTest.onCompleted,\n  subscribe = Rx.ReactiveTest.subscribe;\n\nvar scheduler = new Rx.TestScheduler();\n\n// Create hot observable which will start firing\nvar xs = scheduler.createHotObservable(\n  onNext(150, 1),\n  onNext(210, 2),\n  onNext(220, 3),\n  onCompleted(230)\n);\n\n// Note we'll start at 200 for subscribe, hence missing the 150 mark\nvar res = scheduler.startScheduler(function () {\n  return xs.map(function (x) { return x * x });\n});\n\n// Implement collection assertion\ncollectionAssert.assertEqual(res.messages, [\n  onNext(210, 4),\n  onNext(220, 9),\n  onCompleted(230)\n]);\n\n// Check for subscribe/unsubscribe\ncollectionAssert.assertEqual(xs.subscriptions, [\n  subscribe(200, 230)\n]);\n```\n\n### Location\n\n- rx.testing.js\n\n## `TestScheduler Constructor` ##\n- [`constructor`](#rxtestscheduler)\n\n## `TestScheduler Instance Methods` ##\n- [`createColdObservable`](#rxtestschedulerprototypecreatecoldobservableargs)\n- [`createHotObservable`](#rxtestschedulerprototypecreatehotobservableargs)\n- [`createObserver`](#rxtestschedulerprototypecreateobserver)\n- [`createRejectedPromise`](#rxtestschedulerprototypecreaterejectedpromiseticks-reason)\n- [`createResolvedPromise`](#rxtestschedulerprototypecreateresolvedpromiseticks-value)\n- [`startScheduler`](#rxtestschedulerprototypestartschedulercreate-settings)\n\n## Inherited Classes ##\n\n- [`Rx.VirtualTimeScheduler`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/virtualtimescheduler.md)\n\n## **TestScheduler Constructor** ##\n\n### <a id=\"rxtestscheduler\"></a>`Rx.TestScheduler()`\n<a href=\"#rxtestscheduler\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/testscheduler.js \"View in source\")\n\nCreates a new virtual time test scheduler.\n\n#### Example\n```js\nvar onNext = Rx.ReactiveTest.onNext,\n  onCompleted = Rx.ReactiveTest.onCompleted,\n  subscribe = Rx.ReactiveTest.subscribe;\n\nvar scheduler = new Rx.TestScheduler();\n\n// Create hot observable which will start firing\nvar xs = scheduler.createHotObservable(\n  onNext(150, 1),\n  onNext(210, 2),\n  onNext(220, 3),\n  onCompleted(230)\n);\n\n// Note we'll start at 200 for subscribe, hence missing the 150 mark\nvar res = scheduler.startScheduler(function () {\n  return xs.map(function (x) { return x * x });\n});\n\n// Implement collection assertion\ncollectionAssert.assertEqual(res.messages, [\n  onNext(210, 4),\n  onNext(220, 9),\n  onCompleted(230)\n]);\n\n// Check for subscribe/unsubscribe\ncollectionAssert.assertEqual(xs.subscriptions, [\n  subscribe(200, 230)\n]);\n```\n\n### Location\n\nFile:\n- [`/src/core/testing/testscheduler.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/testscheduler.js)\n\nDist:\n- [`rx.testing.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.texting.js)\n\nPrerequisites:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js) |\n[`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js) |\n[`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Testing`](http://www.nuget.org/packages/RxJS-Testing/)\n\n* * *\n\n## **TestScheduler Instance Methods** ##\n\n### <a id=\"rxtestschedulerprototypecreatecoldobservableargs\"></a>`Rx.TestScheduler.prototype.createColdObservable(...args)`\n<a href=\"#rxtestschedulerprototypecreatecoldobservableargs\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/testscheduler.js#L118-L121 \"View in source\")\n\nCreates a cold observable using the specified timestamped notification messages.\n\n### Arguments\n1. `args` *(Arguments)*: An arguments array of Recorded objects from `Rx.ReactiveTest.onNext`, `Rx.ReactiveTest.onError`, and `Rx.ReactiveTest.onCompleted` methods.\n\n#### Returns\n*(Observable)*: Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n\n#### Example\n```js\nvar onNext = Rx.ReactiveTest.onNext,\n  onCompleted = Rx.ReactiveTest.onCompleted\n  subscribe = Rx.ReactiveTest.subscribe;\n\nvar scheduler = new Rx.TestScheduler();\n\n// Create cold observable with offset from subscribe time\nvar xs = scheduler.createColdObservable(\n  onNext(150, 1),\n  onNext(200, 2),\n  onNext(250, 3),\n  onCompleted(300)\n);\n\n// Note we'll start at 200 for subscribe\nvar res = scheduler.startScheduler(function () {\n  return xs.filter(function (x) { return x % 2 === 0; });\n});\n\n// Implement collection assertion\ncollectionAssert.assertEqual(res.messages, [\n  onNext(400, 2),\n  onCompleted(500)\n]);\n\n// Check for subscribe/unsubscribe\ncollectionAssert.assertEqual(xs.subscriptions, [\n  subscribe(200, 500)\n]);\n```\n\n### Location\n\nFile:\n- [`/src/core/testing/testscheduler.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/testscheduler.js)\n\nDist:\n- [`rx.testing.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.texting.js)\n\nPrerequisites:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js) |\n[`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js) |\n[`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Testing`](http://www.nuget.org/packages/RxJS-Testing/)\n\n* * *\n\n### <a id=\"rxtestschedulerprototypecreatehotobservableargs\"></a>`Rx.TestScheduler.prototype.createHotObservable(...args)`\n<a href=\"#rxtestschedulerprototypecreatehotobservableargs\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/testscheduler.js#L108-L111 \"View in source\")\n\nCreates a hot observable using the specified timestamped notification messages.\n\n### Arguments\n1. `args` *(Arguments)*: An arguments array of Recorded objects from `Rx.ReactiveTest.onNext`, `Rx.ReactiveTest.onError`, and `Rx.ReactiveTest.onCompleted` methods.\n\n#### Returns\n*(Observable)*: Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n\n#### Example\n```js\nvar onNext = Rx.ReactiveTest.onNext,\n  onCompleted = Rx.ReactiveTest.onCompleted;\n\nvar scheduler = new Rx.TestScheduler();\n\n// Create hot observable which will start firing\nvar xs = scheduler.createHotObservable(\n  onNext(150, 1),\n  onNext(210, 2),\n  onNext(220, 3),\n  onCompleted(230)\n);\n\n// Note we'll start at 200 for subscribe, hence missing the 150 mark\nvar res = scheduler.startScheduler(function () {\n  return xs.map(function (x) { return x * x });\n});\n\n// Implement collection assertion\ncollectionAssert.assertEqual(res.messages, [\n  onNext(210, 4),\n  onNext(220, 9),\n  onCompleted(230)\n]);\n\n// Check for subscribe/unsubscribe\ncollectionAssert.assertEqual(xs.subscriptions, [\n  subscribe(200, 230)\n]);\n```\n\n### Location\n\nFile:\n- [`/src/core/testing/testscheduler.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/testscheduler.js)\n\nDist:\n- [`rx.testing.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.texting.js)\n\nPrerequisites:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js) |\n[`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js) |\n[`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Testing`](http://www.nuget.org/packages/RxJS-Testing/)\n\n* * *\n\n### <a id=\"rxtestschedulerprototypecreateobserver\"></a>`Rx.TestScheduler.prototype.createObserver()`\n<a href=\"#rxtestschedulerprototypecreateobserver\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/testscheduler.js#L127-L129 \"View in source\")\n\nCreates an observer that records received notification messages and timestamps those.\n\n#### Returns\n`Observer`: Observer that can be used to assert the timing of received notifications.\n\n#### Example\n```js\nvar onNext = Rx.ReactiveTest.onNext;\n\nvar scheduler = new Rx.TestScheduler();\n\nvar d = new Rx.SerialDisposable();\n\nvar xs = Rx.Observable.return(42, scheduler);\n\nvar res = scheduler.createObserver();\n\nscheduler.scheduleAbsolute(null, 100, function () {\n  return d.setDisposable(xs.subscribe(\n    function (x) {\n      d.dispose();\n      res.onNext(x);\n    },\n    res.onError.bind(res),\n    res.onCompleted.bind(res)\n  ));\n});\n\nscheduler.start();\n\ncollectionAssert.assertEqual(res.messages, [\n  onNext(101, 42)\n]);\n```\n\n### Location\n\nFile:\n- [`/src/core/testing/testscheduler.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/testscheduler.js)\n\nDist:\n- [`rx.testing.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.texting.js)\n\nPrerequisites:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js) |\n[`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js) |\n[`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Testing`](http://www.nuget.org/packages/RxJS-Testing/)\n\n* * *\n\n### <a id=\"rxtestschedulerprototypecreaterejectedpromiseticks-reason\"></a>`Rx.TestScheduler.prototype.createRejectedPromise(ticks, value)`\n<a href=\"#rxtestschedulerprototypecreaterejectedpromiseticks-reason\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/testscheduler.js \"View in source\")\n\nCreates a rejected promise with the given reason and ticks.\n\n### Arguments\n1. `ticks` *(Number)*: The absolute time of the resolution.\n2. `reason` *(Any)*: The reason for rejection to yield at the given tick.\n\n#### Returns\n*(Promise)*: A mock Promise which rejects with the given reason.\n\n#### Example\n```js\nvar onNext = Rx.ReactiveTest.onNext,\n  onError = Rx.ReactiveTest.onError,\n  onCompleted = Rx.ReactiveTest.onCompleted;\n\nvar scheduler = new Rx.TestScheduler();\n\n// Create rejected promise\nvar error = new Error();\nvar xs = scheduler.createRejectedPromise(201, error);\n\n// Note we'll start at 200 for subscribe, hence missing the 150 mark\nvar res = scheduler.startScheduler(function () {\n  // Need to pass test scheduler due to issue #976\n  return Rx.Observable.fromPromise(xs, scheduler);\n});\n\n// Implement collection assertion\ncollectionAssert.assertEqual(res.messages, [\n  onError(201, error)\n]);\n```\n\n### Location\n\nFile:\n- [`/src/core/testing/testscheduler.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/testscheduler.js)\n\nDist:\n- [`rx.testing.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.texting.js)\n\nPrerequisites:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js) |\n[`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js) |\n[`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Testing`](http://www.nuget.org/packages/RxJS-Testing/)\n\n* * *\n\n### <a id=\"rxtestschedulerprototypecreateresolvedpromiseticks-value\"></a>`Rx.TestScheduler.prototype.createResolvedPromise(ticks, value)`\n<a href=\"#rxtestschedulerprototypecreateresolvedpromiseticks-value\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/testscheduler.js \"View in source\")\n\nCreates a resolved promise with the given value and ticks.\n\n### Arguments\n1. `ticks` *(Number)*: The absolute time of the resolution.\n2. `value` *(Any)*: The value to yield at the given tick.\n\n#### Returns\n*(Promise)*: A mock Promise which fulfills with the given value.\n\n#### Example\n```js\nvar onNext = Rx.ReactiveTest.onNext,\n  onError = Rx.ReactiveTest.onError,\n  onCompleted = Rx.ReactiveTest.onCompleted;\n\nvar scheduler = new Rx.TestScheduler();\n\n// Create resolved promise\nvar xs = scheduler.createResolvedPromise(201, 1);\n\n// Note we'll start at 200 for subscribe, hence missing the 150 mark\nvar res = scheduler.startScheduler(function () {\n  // Need to pass test scheduler due to issue #976\n  return Rx.Observable.fromPromise(xs, scheduler);\n});\n\n// Implement collection assertion\ncollectionAssert.assertEqual(res.messages, [\n  onNext(201, 1),\n  onCompleted(201)\n]);\n```\n\n### Location\n\nFile:\n- [`/src/core/testing/testscheduler.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/testscheduler.js)\n\nDist:\n- [`rx.testing.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.texting.js)\n\nPrerequisites:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js) |\n[`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js) |\n[`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Testing`](http://www.nuget.org/packages/RxJS-Testing/)\n\n* * *\n\n### <a id=\"rxtestschedulerprototypestartschedulercreate-settings\"></a>`Rx.TestScheduler.prototype.startScheduler(create, settings)`\n<a href=\"#rxtestschedulerprototypestartSchedulercreate\">#</a> [&#x24C8;](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/testscheduler.js \"View in source\")\n\nStarts the test scheduler and uses the specified settings for creation, subscription and disposal. If not specified, they will be set to their default timings.\n\n### Arguments\n1. `create` : `Function` - Factory method to create an observable sequence.\n2. `settings`: `Object` - An object with the following properties:\n    - `created`: `Number` - the time to create the Observable sequence. If not specified, will default to 100.\n    - `subscribed`: `Number` - the time to subscribe to the Observable sequence. If not specified, will default to 200.\n    - `disposed`: `Number` - the time to dispose the Observable sequence. If not specified, will default to 1000.\n\n#### Returns\n`Observer`: Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n\n#### Example\n```js\nvar onNext = Rx.ReactiveTest.onNext,\n    onCompleted = Rx.ReactiveTest.onCompleted;\n\nvar scheduler = new Rx.TestScheduler();\n\n// Create cold observable with offset from subscribe time\nvar xs = scheduler.createColdObservable(\n  onNext(150, 1),\n  onNext(200, 2),\n  onNext(250, 3),\n  onCompleted(300)\n);\n\n// Note we'll start at 200 for subscribe\nvar res = scheduler.startScheduler(function () {\n  return xs.filter(function (x) { return x % 2 === 0; });\n});\n\n// Implement collection assertion\ncollectionAssert.assertEqual(res.messages, [\n  onNext(400, 2),\n  onCompleted(500)\n]);\n\n// Check for subscribe/unsubscribe\ncollectionAssert.assertEqual(xs.subscriptions, [\n  subscribe(200, 500)\n]);\n```\n\n### Location\n\nFile:\n- [`/src/core/testing/testscheduler.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/testing/testscheduler.js)\n\nDist:\n- [`rx.testing.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.texting.js)\n\nPrerequisites:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js) |\n[`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js) |\n[`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Testing`](http://www.nuget.org/packages/RxJS-Testing/)\n\n* * *\n"
  },
  {
    "path": "doc/designguidelines/readme.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Design Guidelines #\n\n<img style=\"display: block; margin: 0 auto; clear: right;\"\n  src=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/designguidelines/images/984368.png\"\n  alt=\"RxJS Logo\">\n\n1. [Introduction](#1-introduction)\n2. [When to use RxJS](#2-when-to-use-rxjs)\n  1. [Use RxJS for orchestrating asynchronous and event-based computations](#21-use-rxjs-for-orchestrating-asynchronous-and-event-based-computations)\n  2. [Use RxJS to deal with asynchronous sequences of data](#22-use-rxjs-to-deal-with-asynchronous-sequences-of-data)\n3. [The RxJS contract](#3-the-rxjs-contract)\n  1. [Assume the RxJS Grammar](#31-the-rxjs-grammar)\n  2. [Assume resources are cleaned up after an `onError` or `onCompleted` messages](#32-assume-resources-are-cleaned-up-after-an-onerror-or-oncompleted-message)\n  3. [Assume a best effort to stop all outstanding work on Unsubscribe](#33-assume-a-best-effort-to-stop-all-outstanding-work-on-unsubscribe)\n4. [Using RxJS](#4-using-rx)\n  1. [Consider drawing a Marble-diagram](#41-consider-drawing-a-marble-diagram)\n  2. [Consider passing multiple arguments to `subscribe`](#42-consider-passing-multiple-arguments-to-subscribe)\n  3. [Consider passing a specific scheduler to concurrency introducing operators](#43-consider-passing-a-specific-scheduler-to-concurrency-introducing-operators)\n  4. [Call the `observeOn` operator as late and in as few places as possible](#44-call-the-observeon-operator-as-late-and-in-as-few-places-as-possible)\n  5. [Consider limiting buffers](#45-consider-limiting-buffers)\n  6. [Make side-effects explicit using the `do`/`tap` operator](#46-make-side-effects-explicit-using-the-dotap-operator)\n  7. [Assume messages can come through until unsubscribe has completed](#47-assume-messages-can-come-through-until-unsubscribe-has-completed)\n  8. [Use the `publish` operator to share side-effects](#48-use-the-publish-operator-to-share-side-effects)\n5. [Operator implementations](#5-operator-implementations)\n  1. [Implement new operators by composing existing operators](#51-implement-new-operators-by-composing-existing-operators)\n  2. [Implement custom operators using `Observable.create`](#52-implement-custom-operators-using-observablecreate)\n  3. [Protect calls to user code from within an operator](#53-protect-calls-to-user-code-from-within-an-operator)\n  4. [`subscribe` implementations should not throw](#54-subscribe-implementations-should-not-throw)\n  5. [`onError` messages should have abort semantics](#55-onerror-messages-should-have-abort-semantics)\n  6. [Parameterize concurrency by providing a scheduler argument](#56-parameterize-concurrency-by-providing-a-scheduler-argument)\n  7. [Provide a default scheduler](#57-provide-a-default-scheduler)\n  8. [The scheduler should be the last argument to the operator](#58-the-scheduler-should-be-the-last-argument-to-the-operator)\n  9. [Avoid introducing concurrency](#59-avoid-introducing-concurrency)\n  10. [Hand out all disposables instances created inside the operator to consumers](#510-hand-out-all-disposables-instances-created-inside-the-operator-to-consumers)\n  11. [Operators should not block](#511-operators-should-not-block)\n  12. [Avoid deep stacks caused by recursion in operators](#512-avoid-deep-stacks-caused-by-recursion-in-operators)\n  13. [Argument validation should occur outside `Observable.create`](#513-argument-validation-should-occur-outside-observablecreate)\n  14. [Unsubscription should be idempotent](#514-unsubscription-should-be-idempotent)\n  15. [Unsubscription should not throw](#515-unsubscription-should-not-throw)\n  16. [Custom Observable implementations should follow the RxJS contract](#516-custom-observable-implementations-should-follow-the-rxjs-contract)\n  17. [Operator implementations should follow guidelines for RxJS usage](#517-operator-implementations-should-follow-guidelines-for-rxjs-usage)\n\n## 1. Introduction ##\n\nThis document describes guidelines that aid in developing applications and libraries that use the Reactive Extensions for RxJS library.\n\nThe guidelines listed in this document have evolved over time by the Rx team during the development of the RxJS library.\n\nAs RxJS continues to evolve, these guidelines will continue to evolve with it. Make sure you have the latest version of this document.\n\nAll information described in this document is merely a set of guidelines to aid development. These guidelines do not constitute an absolute truth. They are patterns that the team found helpful; not rules that should be followed blindly. There are situations where certain guidelines do not apply. The team has tried to list known situations where this is the case. It is up to each individual developer to decide if a certain guideline makes sense in each specific situation.\n\nThe guidelines in this document are listed in no particular order. There is neither total nor partial ordering in these guidelines.\n\nPlease contact us through the [RxJS Issues](https://github.com/Reactive-Extensions/RxJS) for feedback on the guidelines, as well as questions on whether certain guidelines are applicable in specific situations.\n\n## 2. When to Use RxJS ##\n\n### 2.1 Use RxJS for orchestrating asynchronous and event-based computations ###\n\nCode that deals with more than one event or asynchronous computation gets complicated quickly as it needs to build a state-machine to deal with ordering issues. Next to this, the code needs to deal with successful and failure termination of each separate computation. This leads to code that doesn’t follow normal control-flow, is hard to understand and hard to maintain.\n\nRxJS makes these computations first-class citizens. This provides a model that allows for readable and composable APIs to deal with these asynchronous computations.\n\n#### Sample ####\n```js\nvar input = document.getElementById('input');\nvar dictionarySuggest = Rx.Observable.fromEvent(input, 'keyup')\n  .map(function () { return input.value; })\n  .filter(function (text) { return !!text; })\n  .distinctUntilChanged()\n  .debounce(250)\n  .flatMapLatest(searchWikipedia)\n  .subscribe(\n    function (results) {\n      list = [];\n      list.concat(results.map(createItem));\n    },\n    function (err) {\n      logError(err);\n    }\n  );\n```\n\nThis sample models a common UI paradigm of receiving completion suggestions while the user is typing input.\n\nRxJS creates an observable sequence that models an existing `keyup` event on the input.\n\nIt then places several filters and projections on top of the event to make the event only fire if a unique value has come through. (The `keyup` event fires for every key stroke, so also if the user presses left or right arrow, moving the cursor but not changing the input text).\n\nNext it makes sure the event only gets fired after 250 milliseconds of activity by using the `debounce` operator. (If the user is still typing characters, this saves a potentially expensive lookup that will be ignored immediately).\n\nIn traditionally written programs, this debouncing would introduce separate callbacks through a timer. This timer could potentially throw exceptions (certain timers have a maximum amount of operations in flight).\n\nOnce the user input has been filtered down it is time to perform the dictionary lookup. As this is usually an expensive operation (e.g. a request to a server on the other side of the world), this operation is itself asynchronous as well.\n\nThe `flatMap` or `selectMany` operator allows for easy combining of multiple asynchronous operations. It doesn’t only combine success values; it also tracks any exceptions that happen in each individual operation.\n\nIn traditionally written programs, this would introduce separate callbacks and a place for exceptions occurring.\n\nIf the user types a new character while the dictionary operation is still in progress, we do not want to see the results of that operation anymore. The user has typed more characters leading to a more specific word, seeing old results would be confusing.\n\nThe `flatMapLatest` operation makes sure that the dictionary operation is ignored once a new `keyup` has been detected.\n\nFinally we subscribe to the resulting observable sequence. Only at this time our execution plan will be used. We pass two functions to the `subscribe` call:\n1. Receives the result from our computation.\n2. Receives exceptions in case of a failure occurring anywhere along the computation.\n\n#### When to ignore this guideline ####\n\nIf the application/library in question has very few asynchronous/event-based operations or has very few places where these operations need to be composed, the cost of depending on RxJS (redistributing the library as well as the learning curve) might outweigh the cost of manually coding these operations.\n\n### 2.2 Use RxJS to deal with asynchronous sequences of data ###\n\nSeveral other libraries exist to aid asynchronous operations in the JavaScript ecosystem. Even though these libraries are powerful, they usually work best on operations that return a single message. They usually do not support operations that produce multiple messages over the lifetime of the operation.\n\nRxJS follows the following grammar: `onNext`* (`onCompleted`|`onError`)?. This allows for multiple messages to come in over time. This makes RxJS suitable for both operations that produce a single message, as well as operations that produce multiple messages.\n\n```js\nvar fs = require('fs');\nvar Rx = require('rx');\n\n// Read/write from stream implementation\nfunction readAsync(fd, chunkSize) { /* impl */ }\nfunction appendAsync(fd, buffer) { /* impl */ }\nfunction encrypt(buffer) { /* impl */}\n\n//open a 4GB file for asynchronous reading in blocks of 64K\nvar inFile = fs.openSync('4GBfile.txt', 'r+');\nvar outFile = fs.openSync('Encrypted.txt', 'w+');\n\nreadAsync(inFile, 2 << 15)\n  .map(encrypt)\n  .flatMap(function (data) {\n    return appendAsync(outFile, data);\n  })\n  .subscribe(\n    function () { },\n    function (err) {\n      console.log('An error occurred while encrypting the file: %s', err.message);\n      fs.closeSync(inFile);\n      fs.closeSync(outFile);\n    },\n    function () {\n      console.log('Successfully encrypted the file.');\n      fs.closeSync(inFile);\n      fs.closeSync(outFile);\n    }\n  );\n```\n\nIn this sample, a 4 GB file is read in its entirety, encrypted and saved out to another file.\n\nReading the whole file into memory, encrypting it and writing out the whole file would be an expensive operation.\n\nInstead, we rely on the fact that RxJS can produce many messages.\n\nWe read the file asynchronously in blocks of 64K. This produces an observable sequence of byte arrays. We then encrypt each block separately (for this sample we assume the encryption operation can work on separate parts of the file). Once the block is encrypted, it is immediately sent further down the pipeline to be saved to the other file.  The `appendAsync` operation is an asynchronous operation that can process multiple messages.\n\n#### When to ignore this guideline ####\n\nIf the application/library in question has very few operations with multiple messages, the cost of depending on RxJS (redistributing the library as well as the learning curve) might outweigh the cost of manually coding these operations.\n\n## 3. The RxJS Contract ##\n\n### 3.1 The RxJS Grammar ###\n\nMessages sent to instances of the `Observer` object follow the following grammar:\n    onNext* (onCompleted | onError)?\n\nThis grammar allows observable sequences to send any amount (0 or more) of `onNext` messages to the subscribed observer instance, optionally followed by a single success (`onCompleted`) or failure (`onError`) message.\n\nThe single message indicating that an observable sequence has finished ensures that consumers of the observable sequence can deterministically establish that it is safe to perform cleanup operations.\n\nA single failure further ensures that abort semantics can be maintained for operators that work on multiple observable sequences.\n\n#### Sample ####\n```js\nvar count = 0;\nxs.subscribe(\n  function () {\n    count++;\n  },\n  function (err) {\n    console.log('Error: %s', err.message);\n  },\n  function () {\n    console.log('OnNext has been called %d times', count);\n  }\n);\n```\n\nIn this sample we safely assume that the total amount of calls to the OnNext method won’t change once the OnCompleted method is called as the observable sequence follows the Rx grammar.\n\n#### When to ignore this guideline ####\n\nIgnore this guideline only when working with a non-conforming implementation of the Observable object.\n\n### 3.2 Assume resources are cleaned up after an `onError` or `onCompleted` message ###\n\nParagraph 3.1 states that no more messages should arrive after an `onError` or `onCompleted` message. This makes it possible to cleanup any resource used by the subscription the moment an `onError` or `onCompleted` arrives. Cleaning up resources immediately will make sure that any side-effect occurs in a predictable fashion. It also makes sure that the runtime can reclaim these resources.\n\n#### Sample ####\n```js\nvar fs = require('fs');\nvar Rx = require('rx');\n\nfunction appendAsync(fd, buffer) { /* impl */ }\n\nfunction openFile(path, flags) {\n  var fd = fs.openSync(path, flags);\n  return Rx.Disposable.create(function () {\n    fs.closeSync(fd);\n  });\n}\n\nRx.Observable.\n  using(\n    function () { return openFile('temp.txt', 'w+'); },\n    function (fd) {\n      return Rx.Observable.range(0, 10000)\n        .map(function (v) { return Buffer(v); })\n        .flatMap(function (buffer) {\n          return appendAsync(fd, buffer);\n        });\n    }\n  )\n  .subscribe();\n```\n\nIn this sample the Using operator creates a resource that will be disposed upon unsubscription. The Rx contract for cleanup ensures that unsubscription will be called automatically once an `onError` or `onCompleted` message is sent.\n\n#### When to ignore this guideline ####\n\nThere are currently no known cases where to ignore this guideline.\n\n### 3.3 Assume a best effort to stop all outstanding work on Unsubscribe ###\n\nWhen unsubscribe is called on an observable subscription, the observable sequence will make a best effort attempt to stop all outstanding work. This means that any queued work that has not been started will not start.\n\nAny work that is already in progress might still complete as it is not always safe to abort work that is in progress. Results from this work will not be signaled to any previously subscribed observer instances.\n\n#### Sample 1\n```js\nObservable.timer(2000).subscribe(...).dispose()\n```\n\nIn this sample subscribing to the observable sequence generated by Timer will queue an action on the `Scheduler.timeout` scheduler to send out an `onNext` message in 2 seconds. The subscription then gets canceled immediately. As the scheduled action has not started yet, it will be removed from the scheduler.\n\n\n#### Sample 2\n```js\nRx.Observable.startAsync(function () {\n  return Q.delay(2000);\n})\n.subscribe(...).dispose();\n```\n\nIn this sample the `startAsync` operator will immediately schedule the execution of the lambda provided as its argument. The subscription registers the observer instance as a listener to this execution. As the lambda is already running once the subscription is disposed, it will keep running and its return value is ignored.\n\n## 4. Using Rx ##\n\n### 4.1 Consider drawing a Marble-diagram ###\n\nDraw a marble-diagram of the observable sequence you want to create. By drawing the diagram, you will get a clearer picture on what operator(s) to use.\n\nA marble-diagram is a diagram that shows event occurring over time. A marble diagram contains both input and output sequences(s).\n\n<img src=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/designguidelines/images/throttleWithTimeout.png\" alt=\"throttleWithSelector\">\n\nBy drawing the diagram we can see that we will need some kind of delay after the user input, before firing of another asynchronous call. The delay in this sample maps to the `debounce` operator. To create another observable sequence from an observable sequence we will use the `flatMap` or `selectMany` operator. This\nwill lead to the following code:\n\n```js\nvar dictionarySuggest = userInput\n  .debounce(250)\n  .flatMap(function (input) { return serverCall(input); });\n```\n\n#### When to ignore this guideline ####\n\nThis guideline can be ignored if you feel comfortable enough with the observable sequence you want to write. However, even the Rx team members will still grab the whiteboard to draw a marble-diagram once in a while.\n\n### 4.2 Consider passing multiple arguments to `subscribe` ###\n\nFor convenience, Rx provides an overload to the `subscribe` method that takes functions instead of an Observer argument.\n\nThe Observer object would require implementing all three methods (`onNext`, `onError` & `onCompleted`). The extensions to the `subscribe` method allow developers to use defaults chosen for each of these methods.\n\nE.g. when calling the `subscribe` method that only has an `onNext` argument, the `onError` behavior will be to rethrow the exception on the thread that the message comes out from the observable sequence. The `onCompleted` behavior in this case is to do nothing.\n\nIn many situations, it is important to deal with the exception (either recover or abort the application gracefully).\n\nOften it is also important to know that the observable sequence has completed successfully. For example, the application notifies the user that the operation has completed.\n\nBecause of this, it is best to provide all 3 arguments to the subscribe function.\n\nRxJS also provides three convenience methods which only subscribe to the part of the sequence that is desired. The other handlers will default to their original behaviors. There are three of such functions:\n- `subscribeOnNext`: for `onNext` messages only\n- `subscribeOnError`: for `onError` messages only\n- `subscribeOnCompleted`: for `onCompleted` messages only.\n\n#### When to ignore this guideline ####\n\n- When the observable sequence is guaranteed not to complete, e.g. an event such as keyup.\n- When the observable sequence is guaranteed not to have `onError` messages (e.g. an event, a  materialized observable sequence etc…).\n- When the default behavior is the desirable behavior.\n\n### 4.3 Consider passing a specific scheduler to concurrency introducing operators ###\n\nRather than using the `observeOn` operator to change the execution context on which the observable sequence produces messages, it is better to create concurrency in the right place to begin with. As operators parameterize introduction of concurrency by providing a scheduler argument overload, passing the right scheduler will lead to fewer places where the ObserveOn operator has to be used.\n\n#### Sample ####\n\n```js\nRx.Observable.range(0, 90000, Rx.Scheduler.requestAnimationFrame)\n  .subscribe(draw);\n```\n\nIn this sample, callbacks from the `range` operator will arrive by calling `window.requestAnimationFrame`.  The default overload of `range` would place the `onNext` call on the `Rx.Scheduler.currentThread` which is used when recursive scheduling is required immediately.  By providing the `Rx.Scheduler.requestAnimationFrame` scheduler, all messages from this observable sequence will originiate on the `window.requestAnimationFrame` callback.\n\n#### When to ignore this guideline ####\n\nWhen combining several events that originate on different execution contexts, use guideline 4.4 to put  all messages on a specific execution context as late as possible.\n\n### 4.4 Call the `observeOn` operator as late and in as few places as possible ###\n\nBy using the `observeOn` operator, an action is scheduled for each message that comes through the original observable sequence. This potentially changes timing information as well as puts additional stress on the system. Placing this operator later in the query will reduce both concerns.\n\n#### Sample ####\n\n```js\nvar result = xs.debounce(1000)\n  .flatMap(function (x) {\n    return ys.takeUntil(zs).sample(250).map(function (y) { return x + y });\n  })\n  .merge(ws)\n  .filter(function (x) { return x < 10; })\n  .observeOn(Rx.Scheduler.requestAnimationFrame);\n```\n\nThis sample combines many observable sequences running on many different execution contexts. The query filters out a lot of messages. Placing the `observeOn` operator earlier in the query would do extra work on messages that would be filtered out anyway. Calling the `observeOn` operator at the end of the query will create the least performance impact.\n\n#### When to ignore this guideline ####\n\nIgnore this guideline if your use of the observable sequence is not bound to a specific execution context. In that case do not use the `observeOn` operator.\n\n### 4.5 Consider limiting buffers ###\n\nRxJS comes with several operators and classes that create buffers over observable sequences, e.g. the `replay` operator. As these buffers work on any observable sequence, the size of these buffers will depend on the observable sequence it is operating on. If the buffer is unbounded, this can lead to memory pressure. Many buffering operators provide policies to limit the buffer, either in time or size. Providing this limit will address memory pressure issues.\n\n#### Sample ####\n\n```js\nvar result = xs.replay(null, 10000, 1000 * 60 /* 1 hr */).refCount();\n```\n\nIn this sample, the `replay` operator creates a buffer. We have limited that buffer to contain at most 10,000 messages and keep these messages around for a maximum of 1 hour.\n\n#### When to ignore this guideline ####\n\nWhen the amount of messages created by the observable sequence that populates the buffer is small or when the buffer size is limited.\n\n### 4.6 Make side-effects explicit using the `do`/`tap` operator ###\n\nAs many Rx operators take functions as arguments, it is possible to pass any valid user code in these arguments. This code can change global state (e.g. change global variables, write to disk etc...).\n\nThe composition in Rx runs through each operator for each subscription (with the exception of the sharing operators, such as `publish`). This will make every side-effect occur for each subscription.\n\nIf this behavior is the desired behavior, it is best to make this explicit by putting the side-effecting code\nin a `do`/`tap` operator.  There are overloads to this method which call the specified method only, for example `doOnNext`/`tapOnNext`, `doOnError`/`tapOnError`,`doOnCompleted`/`tapOnCompleted`\n\n#### Sample ####\n\n```js\nvar result = xs\n  .filter(function (x) { return x.failed; })\n  .tap(function (x) { log(x); });\n```\n\nIn this sample, messages are filtered for failure. The messages are logged before handing them out to the code subscribed to this observable sequence. The logging is a side-effect (e.g. placing the messages in the computer’s event log) and is explicitly done via a call to the `do`/`tap` operator.\n\n### 4.7 Assume messages can come through until unsubscribe has completed ###\n\nAs RxJS uses a push model, messages can be sent from different execution contexts. Messages can be in flight while calling unsubscribe. These messages can still come through while the call to unsubscribe is in progress. After control has returned, no more messages will arrive. The unsubscription process can still be in progress on a different context.\n\n#### When to ignore this guideline ####\n\nOnce the `onCompleted` or `onError` method has been received, the RxJS grammar guarantees that the subscription can be considered to be finished.\n\n### 4.8 Use the `publish` operator to share side-effects ###\n\nAs many observable sequences are cold [\\(see cold vs. hot on Channel 9\\)](http://channel9.msdn.com/Blogs/J.Van.Gogh/Rx-API-in-depth-Hot-and-Cold-observables), each subscription will have a\nseparate set of side-effects. Certain situations require that these side-effects occur only once. The `publish` operator provides a mechanism to share subscriptions by broadcasting a single subscription to multiple subscribers.\n\nThere are several overloads of the `publish` operator. The most convenient overloads are the ones that provide a function with a wrapped observable sequence argument that shares the side-effects.\n\n#### Sample ####\n\n```js\nvar xs = Rx.Observable.create(function (observer) {\n  console.log('Side effect');\n  observer.onNext('hi!');\n  observer.onCompleted();\n});\n\nxs.publish(function (sharedXs) {\n  sharedXs.subscribe(console.log.bind(console));\n  sharedXs.subscribe(console.log.bind(console));\n  return sharedXs;\n}).subscribe();\n```\n\nIn this sample, xs is an observable sequence that has side-effects (writing to the console). Normally each separate subscription will trigger these side-effects. The `publish` operator uses a single subscription to xs for all subscribers to sharedXs.\n\n#### When to ignore this guideline ####\n\nOnly use the `publish` operator to share side-effects when sharing is required. In most situations you can create separate subscriptions without any problems: either the subscriptions do not have side-effects or the side effects can execute multiple times without any issues.\n\n## 5. Operator implementations ##\n\n### 5.1 Implement new operators by composing existing operators ###\n\nMany operations can be composed from existing operators. This will lead to smaller, easier to maintain code. The Rx team has put a lot of effort in dealing with all corner cases in the base operators. By reusing these operators you’ll get all that work for free in your operator.\n\n#### Sample ####\n\n```js\nRx.Observable.prototype.flatMap = function (selector) {\n  return this.map(selector).mergeAll();\n};\n```\n\nIn this sample, the `flatMap` or `selectMany` operator uses two existing operators: `map` and `mergeAll`. The `map` operator already deals with any issues around the selector function throwing an exception. The `mergeAll` operator already deals with concurrency issues of multiple observable sequences firing at the same time.\n\n#### When to ignore this guideline ####\n\n- No appropriate set of base operators is available to implement this operator.\n- Performance analysis proves that the implementation using existing operators has performance issues.  Such can be caused by `materialize`.\n\n### 5.2 Implement custom operators using `Observable.create` ###\n\nWhen it is not possible to follow guideline 5.1, use the Observable.Create(WithDisposable) method to create an observable sequence as it provides several protections make the observable sequence follow the RxJS contract.\n\n- When the observable sequence has finished (either by firing `onError` or `onCompleted`), any subscription will automatically be unsubscribed.\n- Any subscribed observer instance will only see a single OnError or OnCompleted message. No more messages are sent through. This ensures the Rx grammar of onNext* (onError|onCompleted)?\n\n#### Sample ####\n\n```js\nRx.Observable.prototype.map = function (selector, thisArg) {\n  var source = this;\n  return Rx.Observable.create(function (observer) {\n    var idx = 0;\n    return source.subscribe(\n      function (x) {\n        var result;\n        try {\n          result = selector.call(thisArg, x, idx++, source);\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n\n        observer.onNext(result);\n      },\n      observer.onError.bind(observer),\n      observer.onCompleted.bind(observer)\n    );\n  })\n};\n```\n\nIn this sample, `map` uses the `Observable.create` operator to return a new instance of the Observable class. This ensures that no matter the implementation of the source observable sequence, the output observable sequence follows the Rx contract . It also ensures that the lifetime of subscriptions is a short as possible.\n\n#### When to ignore this guideline ####\n\n- The operator needs to return an observable sequence that doesn’t follow the Rx contract. This should usually be avoided (except when writing tests to see how code behaves when the contract is broken)\n- The object returned needs to implement more than the Observable class (e.g. Subject, or a custom class).\n\n### 5.3 Protect calls to user code from within an operator ###\n\nWhen user code is called from within an operator, this is potentially happening outside of the execution context of the call to the operator (asynchronously). Any exception that happens here will cause the program to terminate unexpectedly. Instead it should be fed through to the subscribed observer instance so that the exception can be dealt with by the subscribers.\n\nCommon kinds of user code that should be protected:\n- Selector functions passed in to the operator.\n- Comparer functions passed into the operator.\n\n**Note:** calls to `Scheduler` implementations are not considered for this guideline. The reason for this is that only a small set of issues would be caught as most schedulers deal with asynchronous calls. Instead, protect the arguments passed to schedulers inside each scheduler implementation.\n\n#### Sample ####\n\n```js\nRx.Observable.prototype.map = function (selector, thisArg) {\n  var source = this;\n  return Rx.Observable.create(function (observer) {\n    var idx = 0;\n    return source.subscribe(\n      function (x) {\n        var result;\n        try {\n          result = selector.call(thisArg, x, idx++, source);\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n\n        observer.onNext(result);\n      },\n      observer.onError.bind(observer),\n      observer.onCompleted.bind(observer)\n    );\n  })\n};\n```\n\nThis sample invokes a selector function which is user code. It catches any exception resulting from this call and transfers the exception to the subscribed observer instance through the `onError` call.\n\n#### When to ignore this guideline ####\n\nIgnore this guideline for calls to user code that are made before creating the observable sequence (outside of the `Observable.create` call). These calls are on the current execution context and are allowed to follow normal control flow.\n\n**Note:** do not protect calls to `subscribe`, `dispose`, `onNext`, `onError` and `onCompleted` methods. These calls are on the edge of the monad. Calling the `onError` method from these places will lead to unexpected behavior.\n\n### 5.4 `subscribe` implementations should not throw ###\n\nAs multiple observable sequences are composed, subscribe to a specific observable sequence might not happen at the time the user calls `subscribe` (e.g. Within the `concat` operator, the second observable sequence argument to `concat` will only be subscribed to once the first observable sequence has completed). Throwing an exception would bring down the program. Instead exceptions in subscribe should be tunneled to the `onError` method.\n\n#### Sample ####\n\n```js\nvar CLOSED = 3;\n\nfunction readWebSocket(socket) {\n  return Rx.Observable.create(function (observer) {\n    if (socket.readyState === CLOSED) {\n      observer.onError(new Error('The websocket is no longer open.'));\n      return;\n    }\n    // Rest of the implementation goes here\n  });\n}\n```\n\nIn this sample, an error condition is detected in the subscribe method implementation. An error is raised by calling the `onError` method instead of throwing the exception. This allows for proper handling of the exception if `subscribe` is called outside of the execution context of the original call to Subscribe by the user.\n\n#### When to ignore this guideline ####\n\nWhen a catastrophic error occurs that should bring down the whole program anyway.\n\n### 5.5 `onError` messages should have abort semantics\n\nAs normal control flow in JavaScript uses abort semantics for exceptions (the stack is unwound, current code path is interrupted), RxJS mimics this behavior. To ensure this behavior, no messages should be sent out by an operator once one of it sources has an error message or an exception is thrown within the operator.\n\n#### Sample ####\n\n```js\nRx.Observable.prototype.minimumBuffer = function (bufferSize) {\n  var source = this;\n  return Rx.Observable.create(function (observer) {\n    var data = [];\n\n    return source.subscribe(\n      function (value) {\n        data = data.concat(value);\n        if (data.length > bufferSize) {\n          observer.onNext(data.slice(0));\n          data = [];\n        }\n      },\n      observer.onError.bind(observer),\n      function () {\n        if (data.length > 0) {\n          observer.onNext(data.slice(0));\n        }\n        observer.onCompleted();\n      }\n    );\n  });\n};\n```\n\nIn this sample, a buffering operator will abandon the observable sequence as soon as the subscription to source encounters an error. The current buffer is not sent to any subscribers, maintain abort semantics.\n\n#### When to ignore this guideline ####\n\nThere are currently no known cases where to ignore this guideline.\n\n### 5.6 Parameterize concurrency by providing a scheduler argument ###\n\nAs there are many different notions of concurrency, and no scenario fits all, it is best to parameterize the concurrency an operator introduces. The notion of parameterizing concurrency in RxJS is abstracted through the `Scheduler` class.\n\n#### Sample ####\n\n```js\nRx.Observable.just = function (value, scheduler) {\n  return Rx.Observable.create(function (observer) {\n    return scheduler.schedule(function () {\n      observer.onNext(value);\n      observer.onCompleted();\n    });\n  });\n};\n```\n\nIn this sample, the `just` operator parameterizes the level of concurrency the operator has by providing a scheduler argument. It then uses this scheduler to schedule the firing of the `onNext` and `onCompleted` messages.\n\n#### When to ignore this guideline ####\n\n- The operator is not in control of creating the concurrency (e.g. in an operator that converts an event into an observable sequence, the source event is in control of firing the messages, not the operator).\n- The operator is in control, but needs to use a specific scheduler for introducing concurrency.\n\n### 5.7 Provide a default scheduler ###\n\nIn most cases there is a good default that can be chosen for an operator that has parameterized concurrency through guideline 5.6. This will make the code that uses this operator more succinct.\n\n**Note:** Follow guideline 5.9 when choosing the default scheduler, using the immediate scheduler where possible, only choosing a scheduler with more concurrency when needed.\n\n#### Sample ####\n\n```js\nRx.Observable.just = function (value, scheduler) {\n  // Pick a default scheduler, in this case, immediately\n  Rx.helpers.isScheduler(scheduler) || (scheduler = Rx.Scheduler.immediate);\n\n  return Rx.Observable.create(function (observer) {\n    return scheduler.schedule(function () {\n      observer.onNext(value);\n      observer.onCompleted();\n    });\n  });\n};\n```\n\nIn this sample, we provided a default scheduler if not provided by the caller.\n\n#### When to ignore this guideline ####\n\nIgnore this guideline when no good default can be chosen.\n\n### 5.8 The scheduler should be the last argument to the operator ###\n\nAdding the scheduler as the last argument is a must for all operators introducing concurrency.  This is to ensure that the schedulers are optional, and a default one can be chosen.  This also makes the programming experience much more predictable.\n\n#### Sample ####\n\n```js\nRx.Observable.just = function (value, scheduler) {\n  // Pick a default scheduler, in this case, immediately\n  Rx.helpers.isScheduler(scheduler) || (scheduler = Rx.Scheduler.immediate);\n\n  return Rx.Observable.create(function (observer) {\n    return scheduler.schedule(function () {\n      observer.onNext(value);\n      observer.onCompleted();\n    });\n  });\n};\n```\n\nIn this sample the `return` operator has two parameters, and the scheduler parameter defaults to the immediate scheduler if not provided. As the scheduler argument is the last argument, adding or omitting the argument is clearly visible.\n\n#### When to ignore this guideline ####\n\nJavaScript supports rest arguments syntax. With this syntax, the rest arguments has to be the last argument. Make the scheduler the final to last argument in this case.\n\n### 5.9 Avoid introducing concurrency ###\n\nBy adding concurrency, we change the timeliness of an observable sequence. Messages will be scheduled to arrive later. The time it takes to deliver a message is data itself, by adding concurrency we skew that data.  This includes not using such mechanisms as `setTimeout`, `setImmediate`, `requestAnimationFrame`, `process.nextTick`, etc which should be avoided directly in your code, and instead be wrapped by a `Scheduler` class.\n\n#### Sample 1 ####\n\n```js\nRx.Observable.prototype.map = function (selector, thisArg) {\n  var source = this;\n  return Rx.Observable.create(function (observer) {\n    var idx = 0;\n    return source.subscribe(\n      function (x) {\n        var result;\n        try {\n          result = selector.call(thisArg, x, idx++, source);\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n\n        observer.onNext(result);\n      },\n      observer.onError.bind(observer),\n      observer.onCompleted.bind(observer)\n    );\n  })\n};\n```\n\nIn this sample, the select operator does not use a scheduler to send out the `onNext` message. Instead it uses the source observable sequence call to `onNext` to process the message, hence staying in the same time-window.\n\n#### Sample 2 ####\n\n```js\nRx.Observable.just = function (value, scheduler) {\n  // Pick a default scheduler, in this case, immediately\n  Rx.helpers.isScheduler(scheduler) || (scheduler = Rx.Scheduler.immediate);\n\n  return Rx.Observable.create(function (observer) {\n    return scheduler.schedule(function () {\n      observer.onNext(value);\n      observer.onCompleted();\n    });\n  });\n};\n```\n\nIn this case, the default scheduler for the `just` operator is the immediate scheduler. This scheduler does not introduce concurrency.\n\n#### When to ignore this guideline ####\n\nIgnore this guideline in situations where introduction of concurrency is an essential part of what the operator does.\n\n**NOTE:** When we use the Immediate scheduler or call the observer directly from within the call to `subscribe`, we make the `subscribe` call blocking. Any expensive computation in this situation would indicate a candidate for introducing concurrency.\n\n### 5.10 Hand out all disposables instances created inside the operator to consumers ###\n\n`Disposable` instances control lifetime of subscriptions as well as cancelation of scheduled actions. RxJS gives users an opportunity to unsubscribe from a subscription to the observable sequence using disposable instances.\n\nAfter a subscription has ended, no more messages are allowed through. At this point, leaving any state alive inside the observable sequence is inefficient and can lead to unexpected semantics.\n\nTo aid composition of multiple disposable instances, RxJS provides a set of classes implementing `Disposable` such as:\n\nName                       | Description\n-------------------------- | ---------------------------------------------------------------\nCompositeDisposable        | Composes and disposes a group of disposable instances together.\nSerialDisposable           | A place holder for changing instances of disposable instances. Once new disposable instance is placed, the old disposable instance is disposed.\nSingleAssignmentDisposable | A place holder for a single instance of a disposable.\nScheduledDisposable        | Uses a scheduler to dispose an underlying disposable instance.\n\n#### Sample ####\n\n```js\nObservable.prototype.zip = function () {\n  var parent = this,\n      sources = slice.call(arguments),\n      resultSelector = sources.pop();\n\n  sources.unshift(parent);\n  return new AnonymousObservable(function (observer) {\n    var n = sources.length,\n      queues = arrayInitialize(n, function () { return []; }),\n      isDone = arrayInitialize(n, function () { return false; });\n\n    function next(i) {\n      var res, queuedValues;\n      if (queues.every(function (x) { return x.length > 0; })) {\n        try {\n          queuedValues = queues.map(function (x) { return x.shift(); });\n          res = resultSelector.apply(parent, queuedValues);\n        } catch (ex) {\n          observer.onError(ex);\n          return;\n        }\n        observer.onNext(res);\n      } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n        observer.onCompleted();\n      }\n    };\n\n    function done(i) {\n      isDone[i] = true;\n      if (isDone.every(function (x) { return x; })) {\n        observer.onCompleted();\n      }\n    }\n\n    var subscriptions = new Array(n);\n    for (var idx = 0; idx < n; idx++) {\n      (function (i) {\n        var source = sources[i], sad = new SingleAssignmentDisposable();\n        Rx.helpers.isPromise(source) && (source = Rx.Observable.fromPromise(source));\n        sad.setDisposable(source.subscribe(function (x) {\n          queues[i].push(x);\n          next(i);\n        }, observer.onError.bind(observer), function () {\n          done(i);\n        }));\n        subscriptions[i] = sad;\n      })(idx);\n    }\n\n    return new CompositeDisposable(subscriptions);\n  });\n};\n```\n\nIn this sample, the operator groups all disposable instances controlling the various subscriptions together and returns the group as the result of subscribing to the outer observable sequence. When a user of this operator subscribes to the resulting observable sequence, he/she will get back a disposable instance that controls subscription to all underlying observable sequences.\n\n#### When to ignore this guideline ####\n\nThere are currently no known instances where this guideline should be ignored.\n\n### 5.11 Operators should not block ###\n\nRxJS is a library for composing asynchronous and event-based programs using observable collections.  \n\nBy making an operator blocking we lose these asynchronous characteristics. We also potentially lose composability (e.g. by returning a value typed as `T` instead of `Observable<T>`).  This is in contrast to the Array#extras such as `sum`, `reduce`, `some` and `every` which return a single value.\n\n#### Sample ####\n\n```js\nRx.Observable.prototype.sum = function () {\n  return this.reduce(function (acc, x) { return acc + x; }, 0);\n};\n```\n\nIn this sample, the `sum` operator has a return type of `Observable<Number>` instead of `Number`. By doing this, the operator does not block. It also allows the result value to be used in further composition.\n\n#### When to ignore this guideline ####\n\nThere are currently no known instances where this guideline should be ignored.\n\n### 5.12 Avoid deep stacks caused by recursion in operators ###\n\nAs code inside Rx operators can be called from different execution context in many different scenarios, it is nearly impossible to establish how deep the stack is before the code is called. If the operator itself has a deep stack (e.g. because of recursion), the operator could trigger a stack overflow quicker than one might expect.\n\nThere are two recommended ways to avoid this issue:\n\n- Use the recursive `scheduleRecursive` methods on the `Scheduler`\n- Implement an infinite looping generator using the yield iterator pattern, convert it to an observable sequence using the `from` operator.\n\n#### Sample 1 ####\n\n```js\nRx.Observable.repeat = function (value, scheduler) {\n  return Rx.Observable.create(function (observer) {\n    return scheduler.scheduleRecursive(function (self) {\n      observer.onNext(value);\n      self();\n    });\n  });\n};\n```\n\nIn this sample, the recursive `scheduleRecursive` method is used to allow the scheduler to schedule the next iteration of the recursive function. Schedulers such as the current thread scheduler do not rely on stack semantics. Using such a scheduler with this pattern will avoid stack overflow issues.\n\n#### Sample 2 ####\n\n```js\nRx.Observable.repeat = function (value) {\n  return Rx.Observable.from(\n    function* () {\n      while(true) { yield value; }\n    }());\n};\n```\n\nThe yield iterator pattern ensures that the stack depth does not increase drastically. By returning an infinite generator with the `from` operator can build an infinite observable sequence.\n\n#### When to ignore this guideline ####\n\nThere are currently no known instances where this guideline should be ignored.\n\n### 5.13 Argument validation should occur outside `Observable.create`\n\nAs guideline 5.3 specifies that the `Observable.create` operator should not throw, any argument validation that potentially throws exceptions should be done outside the `Observable.create` operator.\n\n#### Sample ####\n\n```js\nRx.Observable.prototype.map = function (selector, thisArg) {\n  if (this == null) {\n    throw new TypeError('Must be an instance of an Observable');\n  }\n  if (selector == null) {\n    throw new TypeError('selector cannot be null/undefined');\n  }\n  var selectorFn = typeof selector !== 'function' ?\n    function () { return selector; } :\n    selector;\n  var source = this;\n  return Rx.Observable.create(function (observer) {\n    var idx = 0;\n    return source.subscribe(\n      function (x) {\n        var result;\n        try {\n          result = selectorFn.call(thisArg, x, idx++, source);\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n\n        observer.onNext(result);\n      },\n      observer.onError.bind(observer),\n      observer.onCompleted.bind(observer)\n    );\n  });\n};\n```\n\nIn this sample, the arguments are checked for null values before the `Observable.create` operator is called.\n\n#### When to ignore this guideline ####\n\nIgnore this guideline if some aspect of the argument cannot be checked until the subscription is active.\n\n### 5.14 Unsubscription should be idempotent ###\n\nThe observable `subscribe` method returns a `Disposable` instance that can be used to clean up the subscription. The `Disposable` instance doesn’t give any information about what the state of the subscription is. As consumers do not know the state of the subscription, calling the `dispose` method multiple times should be allowed. Only the first call the side-effect of cleaning up the subscription should occur.\n\n#### Sample ####\n\n```js\nvar subscription = xs.subscribe(function (x) { console.log(x); });\nsubscription.dispose();\nsubscription.dispose();\n```\n\nIn this sample, the subscription is disposed twice, the first time the subscription will be cleaned up and the second call will be a no-op.\n\n### 5.15 Unsubscription should not throw ###\n\nAs the RxJS’s composition makes that subscriptions are chained, so are unsubscriptions. Because of this, any operator can call an unsubscription at any time. Because of this, just throwing an exception will lead to the application crashing unexpectedly. As the observer instance is already unsubscribed, it cannot be used for receiving the exception either. Because of this, exceptions in unsubscriptions should be avoided.\n\n#### When to ignore this guideline ####\n\nThere are currently no known cases where to ignore this guideline.\n\n### 5.16 Custom `Observable` implementations should follow the RxJS contract ###\n\nWhen it is not possible to follow guideline 5.1, the custom implementation of the `Observable` class should still follow the RxJS contract in order to get the right behavior from the RxJS operators.\n\n#### When to ignore this guideline ####\n\nOnly ignore this guideline when writing observable sequences that need to break the contract on purpose (e.g. for testing).\n\n### 5.17 Operator implementations should follow guidelines for RxJS usage ###\n\nAs Rx is a composable API, operator implementations often use other operators for their implementation (see paragraph 5.1). RxJS usage guidelines should be strongly considered when implementing these operators.\n\n#### When to ignore this guideline ####\n\nAs described in the introduction, only follow a guideline if it makes sense in that specific situation.\n"
  },
  {
    "path": "doc/gettingstarted/backpressure.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Backpressure #\n\nWhen it comes to streaming data, streams can be overly chatty in which the consumer cannot keep up with the producer.  To that end, we need mechanisms to control the source so that the consumer does not get overwhelmed.  These mechanisms can come in either the form of lossy or loss-less operations, each of which depends on the requirements.  For example, if you miss a few mouse movements, it may not be a problem, however, if you miss a few bank transactions, that could be a definite problem.  This section covers which techniques you can use to handle backpressure in either lossy or loss-less ways.\n\nFor example, imagine using the [`zip`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/zip.md) operator to zip together two infinite Observables, one of which emits items twice as frequently as the other. A naive implementation of the zip operator would have to maintain an ever-expanding buffer of items emitted by the faster Observable to eventually combine with items emitted by the slower one. This could cause RxJS to seize an unwieldy amount of system resources.\n\n## Hot and Cold Observables and Multicast ##\n\nA cold Observable emits a particular sequence of items, but can begin emitting this sequence when its Observer finds it to be convenient, and at whatever rate the Observer desires, without disrupting the integrity of the sequence. For example if you convert a iterable such as array, Map, Set, or generator into an Observable, that Observable will emit the same sequence of items no matter when it is later subscribed to or how frequently those items are observed. Examples of items emitted by a cold Observable might include the results of a database query, file retrieval, or web request.\n\nA hot Observable begins generating items to emit immediately when it is created. Subscribers typically begin observing the sequence of items emitted by a hot Observable from somewhere in the middle of the sequence, beginning with the first item emitted by the Observable subsequent to the establishment of the subscription. Such an Observable emits items at its own pace, and it is up to its observers to keep up. Examples of items emitted by a hot Observable might include mouse & keyboard events, system events, or stock prices.\n\nWhen a cold Observable is multi-cast (when it is converted into a `ConnectableObservable` and its [`connect`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/connect.md) method is called), it effectively becomes hot and for the purposes of backpressure and flow-control it should be treated as a hot Observable.\n\nCold Observables are ideal subjects for the reactive pull model of backpressure described below. Hot observables are typically not designed to cope well with a reactive pull model, and are better candidates for some of the other flow control strategies discussed on this page, such as the use of the `pausableBuffered` or `pausable` operators, throttling, buffers, or windows.\n\n## Lossy Backpressure ##\n\nThere are a number of ways that an observable sequence can be controlled so that the consumer does not get overwhelmed through lossy operations, meaning that packets will be dropped in between pause and resume actions.\n\n### Debounce ###\n\nThe first technique for lossy backpressure is called [`debounce`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/debounce.md) which only emits an item from the source Observable after a particular timespan has passed without the Observable emitting any other items.  This is useful in scenarios such as if the user is typing too fast and you do not want to yield every keystroke, and instead wait half a second after the person stopped typing before yielding the value.\n\n```js\nvar debounced = Rx.Observable.fromEvent(input, 'keyup')\n  .map(function (e) { return e.target.value; })\n  .debounce(500 /* ms */);\n\ndebounced.subscribeOnNext(function (value) {\n  console.log('Input value: %s', value);\n});\n```\n\n### Throttling ###\n\nAnother technique to deal with an observable sequence which is producing too much for the consumer is through throttling with the use of the [`throttle`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/throttle.md) method which emits the first items emitted by an Observable within periodic time intervals.  Throttling can be especially useful for rate limiting execution of handlers on events like resize and scroll.\n\n```js\nvar throttled = Rx.Observable.fromEvent(window, 'resize')\n  .throttle(250 /* ms */);\n\nthrottled.subscribeOnNext(function (e) {\n  console.log('Window inner height: %d', window.innerHeight);\n  console.log('Window inner width: %d', window.innerWidth);\n});\n```\n\n### Sampling Observables ###\n\nYou can also at certain intervals extract values from the observable sequence using the [`sample`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sample.md) method.  This is useful if you want values from say a stock ticker every five seconds or so without having to consume the entire observable sequence.\n\n```js\nvar sampled = getStockData()\n  .sample(5000 /* ms */);\n\nsampled.subscribeOnNext(function (data) {\n  console.log('Stock data: %o', data);\n});\n```\n\n### Pausable Observables ###\n\nThe ability to pause and resume is also a powerful concept which is offered in RxJS in both lossy and loss-less versions.  In the case of lossy backpressure, the [`pausable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/pausable.md) operator can be used to stop listening and then resume listening at a later time by calling `pause` and `resume` respectively on the observable sequence.  For example we can take some observable sequence and call `pausable`, then call `pause` to pause the sequence and `resume` within 5 seconds.  Note that any data that comes in between the pause and resume are lost.  Note that this only works for hot observables and is unsuitable for cold observables as they will restart upon resume.\n\n```js\nvar pausable = getSomeObservableSource()\n  .pausable();\n\npausable.subscribeOnNext(function (data) {\n  console.log('Data: %o', data);\n});\n\npausable.pause();\n\n// Resume in five seconds\nsetTimeout(function () {\n  pausable.resume();\n}, 5000);\n```\n\n## Loss-less Backpressure ##\n\nIn addition to supporting lossy backpressure mechanisms, RxJS also supports ways of getting the data in such a way that it is able to be fully consumed by the consumer at its own pace.  There are a number of strategies at work including using buffers that work with timespans, count or both, pausable buffers, reactive pull, etc.\n\n### Buffers and Windows ###\n\nThe first strategy of dealing with an overly chatty producer is through the use of buffers.  This allows the consumer to set either the number of items they wish to wait for at a time, or a particular timespan, or both, whichever comes first.  This is useful in a number of cases, for example if you want some data within a window for comparison purposes in addition to chunking up data as you need it.\n\nThe [`bufferWithCount`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/bufferwithcount.md) method allows us to specify the number of items that you wish to capture in a buffer array before yielding it to the consumer.  An impractical yet fun use of this is to calculate whether the user has input the Konami Code for example.\n\n```js\nvar codes = [\n  38, // up\n  38, // up\n  40, // down\n  40, // down\n  37, // left\n  39, // right\n  37, // left\n  39, // right\n  66, // b\n  65  // a\n];\n\nfunction isKonamiCode(buffer) {\n  return codes.toString() === buffer.toString();\n}\n\nvar keys = Rx.Observable.fromEvent(document, 'keyup')\n  .map(function (e) { return e.keyCode; })\n  .bufferWithCount(10, 1)\n  .filter(isKonamiCode)\n  .subscribeOnNext(function () {\n    console.log('KONAMI!');\n  });\n```\n\nOn the other hand, you can also get the data within a buffer for a given amount of time with the [`bufferWithTime`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/bufferwithtime.md).  This is useful for example if you are tracking volume of data that is coming across the network, which can then be handled uniformly.\n\n```js\nvar source = getStockData()\n  .bufferWithTime(5000, 1000) // time in milliseconds\n  .subscribeOnNext(function (data) {\n    data.forEach(function (d) {\n      console.log('Stock: %o', d);\n    });\n  });\n```\n\nIn order to keep buffers from filling too quickly, there is a method to cap the buffer by specifying ceilings for count and timespan, whichever occurs first.  For example, the network could be particularly quick with the data for the specified time, and other times not, so to keep the data levels even, you can specify this threshold via the [`bufferWithTimeOrCount`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/bufferwithtimeorcount.md) method\n\n```js\nvar source = getStockData()\n  .bufferWithTimeOrCount(5000 /* ms */, 100 /* items */)\n  .subscribeOnNext(function (data) {\n\n    data.forEach(function (d) {\n      console.log('Stock: %o', d);\n    });\n\n  });\n```\n\n### Pausable Buffers ###\n\nThe [`pausable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/pausable.md) method is great at dealing with hot observables where you would want to pause and resume while dropping data, however, you may want to preserve that data between the `pause` and `resume` calls.  To that end, we have introduced the [`pausableBuffered`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/pausablebuffered.md) method which keeps a running buffer between `pause` is called and is drained when `resume` is called.  This then leaves the discretion up to the developer to decide when to pause and resume and in the mean time, no data is lost.\n\n```js\nvar source = getStockData()\n  .pausableBuffered();\n\nsource.subscribeOnNext(function (stock) {\n  console.log('Stock data: %o', stock);\n});\n\nsource.pause();\n\n// Resume after five seconds\nsetTimeout(function () {\n  // Drains the buffer and subscribeOnNext is called with the data\n  source.resume();\n}, 5000);\n```\n\n### Controlled Observables ###\n\nIn more advanced scenarios, you may want to control the absolute number of items that you receive at a given time, and the rest is buffered via the `controlled` method.  For example, you can pull 10 items, followed by 20 items, and is up to the discretion of the developer.  This is more in-line with the efforts from the [Reactive Streams](http://www.reactive-streams.org/) effort to effectively turn the push stream into a push/pull stream.\n\n```js\nvar source = getStockData()\n  .controlled();\n\nsource.subscribeOnNext(function (stock) {\n  console.log('Stock data: %o', stock);\n});\n\nsource.request(2);\n\n// Keep getting more after 5 seconds\nsetInterval(function () {\n  source.request(2);\n}, 5000);\n```\n\n### Future Work ###\n\nThis is of course only the beginning of the work with backpressure as there are many other strategies that can be considered.  In future versions of RxJS, the idea of the controlled observable will be baked into the subscription itself which then allows the backpressure to be an essential part of the contract or requesting n number of items.\n"
  },
  {
    "path": "doc/gettingstarted/callbacks.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Bridging to Callbacks #\n\nBesides events, other asynchronous data sources exist in the web and server-side world. One of them is the simple callback pattern which is frequently used in Node.js. In this design pattern, the arguments are passed to the function, and then a callback is usually the last parameter, which when executed, passes control to the inner scope with the data.  Node.js has a standard way of doing callbacks in which the callback is called with the `Error` object first if there is an error, else null, and then the additional parameters from the callback.\n\n## Converting Callbacks to Observable Sequences ##\n\nMany asynchronous methods in Node.js and the many JavaScript APIs are written in such a way that it has a callback as the last parameter. These standard callbacks are executed with the data passed to it once it is available.  We can use the [`Rx.Observable.fromCallback`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/fromcallback.md) to wrap these kinds of callbacks.  Note that this does not cover the Node.js style of callbacks where the `Error` parameter is first.  For that operation, we provide the [`Rx.Observable.fromNodeCallback`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/fromnodecallback.md) which we will cover below.\n\nIn the following example, we will convert the Node.js [`fs.exists`](http://nodejs.org/api/fs.html#fs_fs_exists_path_callback) function.  This function takes a path and returns a `true` or `false` value whether the file exists, in this case we will check if 'file.txt' exists.  The arguments returned when wrapped in `Rx.Observable.fromCallback` will return an array containing the arguments passed to the callback.\n\n```js\nvar Rx = require('rx'),\n\tfs = require('fs');\n\n// Wrap the exists method\nvar exists = Rx.Observable.fromCallback(fs.exists);\n\nvar source = exists('file.txt');\n\n// Get the first argument only which is true/false\nvar subscription = source.subscribe(\n\tfunction (x) { console.log('onNext: %s', x); },\n\tfunction (e) { console.log('onError: %s', e); },\n\tfunction ()  { console.log('onCompleted'); });\n\n// => onNext: true\n// => onCompleted\n```\n\n## Converting Node.js Style Callbacks to Observable Sequences ##\n\nNode.js has adopted a convention in many of the callbacks where an error may occur, such as File I/O, Network requests, etc.  RxJS supports this through the [`Rx.Observable.fromNodeCallback`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/fromnodecallback.md) method in which the error, if present, is captured and the `onError` notification is sent.  Otherwise, the `onNext` is sent with the rest of the callback arguments, followed by an `onCompleted` notification.\n\nIn the following example, we will convert the Node.js [`fs.rename`](http://nodejs.org/api/fs.html#fs_fs_rename_oldpath_newpath_callback) function to an Observable sequence.\n\n```js\nvar fs = require('fs'),\n    Rx = require('rx');\n\n// Wrap fs.rename\nvar rename = Rx.Observable.fromNodeCallback(fs.rename);\n\n// Rename file which returns no parameters except an error\nvar source = rename('file1.txt', 'file2.txt');\n\nvar subscription = source.subscribe(\n\tfunction (x) { console.log('onNext: success!'); },\n\tfunction (e) { console.log('onError: %s', e); },\n\tfunction ()  { console.log('onCompleted'); });\n\n// => onNext: success!\n// => onCompleted\n```\n\n## Converting Observable sequences to Callbacks ##\n\nWe can easily go in another direction and convert an observable sequence to a callback.  This of course requires the observable sequence to yield only one value for this to make sense.  Let's convert using the [`timer`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/timer.md) method to wait for a certain amount of time.  The implementation of `toCallback` could look like the following.  Note that it is not included in RxJS but you can easily add it if needed.\n\n```js\nRx.Observable.prototype.toCallback = function (cb) {\n  var source = this;\n  return function () {\n    var val, hasVal = false;\n    source.subscribe(\n      function (x) { hasVal = true; val = x; },\n      function (e) { throw e; }, // Default error handling\n      function ()  { hasVal && cb(val); }\n    );\n  };\n};\n```\n\nThen we could execute our command simply like the following:\n\n```js\nfunction cb (x) { console.log('hi!'); }\n\nsetTimeout(\n  Rx.Observable.timer(5000)\n    .toCallback(cb)\n  , 500);\n```\n\n## Converting Observable sequences to Node.js Style Callbacks ##\n\nThe same could also apply to Node.js style callbacks should you desire that behavior.  Once again the same restrictions apply with regards to having a single value and an end much like above.  The implementation of `toNodeCallback` could look like the following.  Note that it is not included in RxJS but you can easily add it if needed.\n\n```js\nRx.Observable.prototype.toNodeCallback = function (cb) {\n  var source = this;\n  return function () {\n    var val, hasVal = false;\n    source.subscribe(\n      function (x) { hasVal = true; val = x; },\n      function (e) { cb(e); },\n      function ()  { hasVal && cb(null, val); }\n    );\n  };\n};\n```\n\nWe could then take this and for example if we had an observable sequence which gets a value from a REST call and then convert it to Node.js style.\n\n```js\ngetData().toNodeCallback(function (err, data) {\n\tif (err) { throw err; }\n\t// Do something with the data\n});\n```\n"
  },
  {
    "path": "doc/gettingstarted/categories.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Operators by Categories #\n\nThis topic lists all major operators implemented by the [`Observable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md) type by their categories, specifically: creation, conversion, combine, functional, mathematical, time, exceptions, miscellaneous, selection and primitives.\n\n## Operators by Categories ##\n\n<table>\n\n   <th>Usage</th><th>Operators</th>\n   <tr>\n      <td>Creating an observable sequence</td>\n      <td>\n      <ol>\n      <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/create.md\">create</a></li>\n      <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/defer.md\">defer</a></li>\n      <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/generate.md\">generate</a></li>\n      <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/generatewithabsolutetime.md\">generateWithAbsoluteTime</a></li>\n      <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/generatewithrelativetime.md\">generateWithRelativeTime</a></li>\n      <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/range.md\">range</a></li>\n      <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/using.md\">using</a></li>\n      </ol>\n      </td>\n   </tr>\n   <tr>\n      <td>Converting events or asynchronous patterns to observable sequences, or between Arrays and observable sequences.</td>\n      <td>\n    \t<ol>\n      <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/from.md\">from</a></li>\n    \t<li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromarray.md\">fromArray</a></li>\n    \t<li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromcallback.md\">fromCallback</a></li>\n    \t<li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromnodecallback.md\">fromNodeCallback</a></li>\n    \t<li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromevent.md\">fromEvent</a></li>\n    \t<li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromeventpattern.md\">fromEventPattern</a></li>\n    \t<li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/frompromise.md\">fromPromise</a></li>\n    \t<li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/of.md\">of</a></li>\n      <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/toarray.md\">toArray</a></li>\n      <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/tomap.md\">toMap</a></li>\n      <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/topromise.md\">toPromise</a></li>\n      <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/toset.md\">toSet</a></li>\n    \t</ol>\n      </td>\n   </tr>\n   <tr>\n   <td>\n   Combining multiple observable sequences into a single sequence.\n   </td>\n   <td>\n   <ol>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/amb.md\">amb</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/ambproto.md\">prototype.amb</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/combinelatest.md\">combineLatest</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/combinelatestproto.md\">proto.combineLatest</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/concat.md\">concat</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/concatproto.md\">prototype.concat</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/startwith.md\">startWith</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/merge.md\">merge</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/mergeproto.md\">prototype.merge</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/mergeall.md\">mergeAll</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/repeat.md\">repeat</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/repeatproto.md\">prototype.repeat</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/withlatestfrom.md\">withLatestFrom</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/zip.md\">zip</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/zipproto.md\">prototype.zip</a></li>\n   </ol>\n   </td>\n   </tr>\n   <tr>\n   <td>Functional - Sharing Side Effects</td>\n   <td>\n   <ol>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/let.md\">let</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/publish.md\">publish</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/publishlast.md\">publishLast</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/publishvalue.md\">publishValue</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/replay.md\">replay</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/share.md\">share</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sharelast.md\">shareLast</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sharereplay.md\">shareReplay</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sharevalue.md\">shareValue</a></li>\n   </ol>\n   </td>\n   </tr>\n   <tr>\n   <td>Mathemathical operators on sequences</td>\n   <td>\n   <ol>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/aggregate.md\">aggregate</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/average.md\">average</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/count.md\">count</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/max.md\">max</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/maxby.md\">maxBy</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/min.md\">min</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/minby.md\">minBy</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/reduce.md\">reduce</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sum.md\">sum</a></li>\n   </ol>\n   </td>\n   </tr>\n   <tr>\n   <td>Time-based operations</td>\n   <td>\n   <ol>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/debounce.md\">debounce</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/debouncewithselector.md\">debounceWithSelector</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/delay.md\">delay</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/interval.md\">interval</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sample.md\">sample</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/timeinterval.md\">timeInterval</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/timer.md\">timer</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/timeout.md\">timeout</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/timeoutwithselector.md\">timeoutWithSelector</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/timestamp.md\">timestamp</a></li>\n   </ol>\n   </td>\n   </tr>\n   <tr>\n   <td>Handling Exceptions</td>\n   <td>\n   <ol>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/catch.md\">catch</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/catchproto.md\">prototype.catch</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/finally.md\">finally</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/onerrorresumenext.md\">onErrorResumenext</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/onerrorresumenextproto.md\">prototype.onErrorResumeNext</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/retry.md\">retry</a></li>\n   </ol>\n   </td>\n   </tr>\n   <tr>\n   <td>Filtering and selecting values in a sequence</td>\n   <td>\n   <ol>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/concatmap.md\">concatMap</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/concatmapobserver.md\">concatMapObserver</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/elementat.md\">elementAt</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/elementatordefault.md\">elementAtOrDefault</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/where.md\">filter</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/selectmany.md\">flatMap</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/flatmaplatest.md\">flatMapLatest</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/flatmapobserver.md\">flatMapObserver</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/find.md\">find</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/findindex.md\">findIndex</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/first.md\">first</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/firstordefault.md\">firstOrDefault</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/includes.md\">includes</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/last.md\">last</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/lastordefault.md\">lastOrDefault</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/select.md\">map</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/pluck.md\">pluck</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/select.md\">select</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/concatmap.md\">selectConcat</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/selectmany.md\">selectMany</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/selectmanyobserver.md\">selectManyObserver</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/flatmaplatest.md\">selectSwitch</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/single.md\">single</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/singleordefault.md\">singleOrDefault</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/skip.md\">skip</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/skiplast.md\">skipLast</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/skiplastwithtime.md\">skipLastWithTime</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/skipuntil.md\">skipUntil</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/skipwhile.md\">skipWhile</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/take.md\">take</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/takelast.md\">takeLast</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/takelastbuffer.md\">takeLastBuffer</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/takelastbufferwithtime.md\">takeLastBufferWithTime</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/takelastwithtime.md\">takeLastWithTime</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/takewhile.md\">takeWhile</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/where.md\">where</a></li>\n   </ol>\n   </td>\n   </tr>\n   <tr>\n   <td>Grouping and Windowing</td>\n   <td>\n   <ol>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/buffer.md\">buffer</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/bufferwithcount.md\">bufferWithCount</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/bufferwithtimeorcount.md\">bufferWithTimeOrCount</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/groupby.md\">groupBy</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/groupbyuntil.md\">groupByUntil</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/groupjoin.md\">groupJoin</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/join.md\">join</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/window.md\">window</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/windowwithcount.md\">windowWithCount</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/windowwithtime.md\">windowWithTime</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/windowwithtimeorcount.md\">windowWithTimeOrCount</a></li>\n   </ol>\n   </td>\n   </tr>\n   <tr>\n   <td>Imperative Operators</td>\n   <td>\n   <ol>\n  <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/case.md\">case</a></li>\n  <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/do.md\">do</a></li>\n  <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/doonnext.md\">doOnNext</a></li>\n  <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/doonerror.md\">doOnError</a></li>\n  <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/dooncompleted.md\">doOnCompleted</a></li>\n  <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/dowhile.md\">doWhile</a></li>\n  <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/for.md\">for</a></li>\n  <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/if.md\">if</a></li>\n  <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/do.md\">tap</a></li>\n  <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/doonnext.md\">tapOnNext</a></li>\n  <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/doonerror.md\">tapOnError</a></li>\n  <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/dooncompleted.md\">tapOnCompleted</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/while.md\">while</a></li>\n   </ol>\n   </td>\n   </tr>\n   <tr>\n   <td>Primitives</td>\n   <td>\n   <ol>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/empty.md\">empty</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/never.md\">never</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/return.md\">return</a></li>\n   <li><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/throw.md\">throw</a></li>\n   </ol>\n   </td>\n   </tr>\n</table>\n\n## See Also ##\n\n*Reference*\n - [`Observable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md)\n\n*Concepts*\n- [Querying Observable Sequences](querying.md)\n"
  },
  {
    "path": "doc/gettingstarted/combining.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n"
  },
  {
    "path": "doc/gettingstarted/creating.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Creating and Subscribing to Simple Observable Sequences #\n\nYou do not need to implement the `Observable` class manually to create an observable sequence. Similarly, you do not need to implement `Observer` either to subscribe to a sequence. By installing the Reactive Extension libraries, you can take advantage of the `Observable` type which provides many operators for you to create a simple sequence with zero, one or more elements. In addition, RxJS provides an overloaded `subscribe` method which allows you to pass in `onNext`, `onError` and `onCompleted` function handlers.\n\n## Creating a sequence from scratch ##\n\nBefore getting into many operators, let's look at how to create an `Observable` from scratch using the [`Rx.Observable.create`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/create.md) method.\n\nFirst, we need to ensure we reference the core `rx.js` file.\n\n```html\n<script src=\"rx.js\"></script>\n```\n\nOr if we're using [Node.js](http://node.js), we can reference it as such:\n\n```js\nvar Rx = require('rx');\n```\n\nIn this example, we will simply yield a single value of 42 and then mark it as completed.  The return value is completely optional if no cleanup is required.\n\n```js\nvar source = Rx.Observable.create(function (observer) {\n  // Yield a single value and complete\n  observer.onNext(42);\n  observer.onCompleted();\n\n  // Any cleanup logic might go here\n  return function () {\n    console.log('disposed');\n  }\n});\n\nvar subscription = source.subscribe(\n  function (x) { console.log('onNext: %s', x); },\n  function (e) { console.log('onError: %s', e); },\n  function () { console.log('onCompleted'); });\n\n// => onNext: 42\n// => onCompleted\n\nsubscription.dispose();\n// => disposed\n```\n\nFor most operations, this is completely overkill, but shows the very basics of how most RxJS operators work.\n\n## Creating and subscribing to a simple sequence ##\n\nThe following sample uses the [`range`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/range.md) operator of the `Observable` type to create a simple observable collection of numbers. The observer subscribes to this collection using the Subscribe method of the Observable class, and provides actions that are delegates which handle `onNext`, `onError` and `onCompleted`.  In our example, it creates a sequence of integers that starts with x and produces y sequential numbers afterwards.\n\nAs soon as the subscription happens, the values are sent to the observer. The `onNext` function then prints out the values.\n\n```js\n// Creates an observable sequence of 5 integers, starting from 1\nvar source = Rx.Observable.range(1, 5);\n\n// Prints out each item\nvar subscription = source.subscribe(\n  function (x) { console.log('onNext: %s', x); },\n  function (e) { console.log('onError: %s', e); },\n  function () { console.log('onCompleted'); });\n\n// => onNext: 1\n// => onNext: 2\n// => onNext: 3\n// => onNext: 4\n// => onNext: 5\n// => onCompleted\n```\n\nWhen an observer subscribes to an observable sequence, the `subscribe` method may be using asynchronous behavior behind the scenes depending on the operator. Therefore, the `subscribe` call is asynchronous in that the caller is not blocked until the observation of the sequence completes. This will be covered in more details in the [Using Schedulers](schedulers.md) topic.\n\nNotice that the [`subscribe`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/susbcribe.md) method returns a `Disposable`, so that you can unsubscribe to a sequence and dispose of it easily. When you invoke the `dispose` method on the observable sequence, the observer will stop listening to the observable for data.  Normally, you do not need to explicitly call `dispose` unless you need to unsubscribe early, or when the source observable sequence has a longer life span than the observer. Subscriptions in Rx are designed for fire-and-forget scenarios without the usage of a finalizer. Note that the default behavior of the Observable operators is to dispose of the subscription as soon as possible (i.e, when an `onCompleted` or `onError` messages is published). For example, the code will subscribe x to both sequences a and b. If a throws an error, x will immediately be unsubscribed from b.\n\n```js\nvar x = Rx.Observable.zip(a, b, function (a1, b1) { return a1 + b1; }).subscribe();\n```\n\nYou can also tweak the code sample to use the Create operator of the Observer type, which creates and returns an observer from specified OnNext, OnError, and OnCompleted action delegates. You can then pass this observer to the Subscribe method of the Observable type. The following sample shows how to do this.\n\n```js\n// Creates an observable sequence of 5 integers, starting from 1\nvar source = Rx.Observable.range(1, 5);\n\n// Create observer\nvar observer = Rx.Observer.create(\n  function (x) { console.log('onNext: %s', x); },\n  function (e) { console.log('onError: %s', e); },\n  function () { console.log('onCompleted'); });\n\n// Prints out each item\nvar subscription = source.subscribe(observer);\n\n// => onNext: 1\n// => onNext: 2\n// => onNext: 3\n// => onNext: 4\n// => onNext: 5\n// => onCompleted\n```\n\nIn addition to creating an observable sequence from scratch, you can convert existing Arrays,  events, callbacks and promises into observable sequences. The other topics in this section will show you how to do this.\n\nNotice that this topic only shows you a few operators that can create an observable sequence from scratch. To learn more about other LINQ operators, see Querying Observable Sequences using LINQ Operators.\n\n## Using a timer ##\n\nThe following sample uses the [`timer`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/timer.md) operator to create a sequence. The sequence will push out the first value after 5 second has elapsed, then it will push out subsequent values every 1 second. For illustration purpose, we chain the [`timestamp`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/timestamp.md) operator to the query so that each value pushed out will be appended by the time when it is published. By doing so, when we subscribe to this source sequence, we can receive both its value and timestamp.\n\nFirst, we need to ensure we reference the proper files if in the browser.  Note that the RxJS NPM Package already includes all operators by default.\n\n```html\n<script src=\"rx.js\"></script>\n<script src=\"rx.time.js\"></script>\n```\n\nNow on to our example\n\n```js\nconsole.log('Current time: ' + Date.now());\n\nvar source = Rx.Observable.timer(\n  5000, /* 5 seconds */\n  1000 /* 1 second */)\n   .timestamp();\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log(x.value + ': ' + x.timestamp);\n  });\n\n/* Output may be similar to this */\n// Current time: 1382560697820\n// 0: 1382560702820\n// 1: 1382560703820\n// 2: 1382560704820\n```\n\nBy using the `timestamp` operator, we have verified that the first item is indeed pushed out 5 seconds after the sequence has started, and each item is published 1 second later.\n\n## Converting Arrays and Iterables to an Observable Sequence ##\n\nUsing the [`Rx.Observable.from`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/from.md) operator, you can convert an array to observable sequence.\n\n```js\nvar array = [1,2,3,4,5];\n\n// Converts an array to an observable sequence\nvar source = Rx.Observable.from(array);\n\n// Prints out each item\nvar subscription = source.subscribe(\n  function (x) { console.log('onNext: %s', x); },\n  function (e) { console.log('onError: %s', e); },\n  function () { console.log('onCompleted'); });\n\n// => onNext: 1\n// => onNext: 2\n// => onNext: 3\n// => onNext: 4\n// => onNext: 5\n// => onCompleted\n```\n\nYou can also convert array-like objects such as objects with a length property and indexed with numbers.  In this case, we'll simply have an object with a length of 5.\n```js\nvar arrayLike = { length: 5 };\n\n// Converts an array to an observable sequence\nvar source = Rx.Observable.from(arrayLike, function (v, k) { return k + 1; });\n\n// Prints out each item\nvar subscription = source.subscribe(\n  function (x) { console.log('onNext: %s', x); },\n  function (e) { console.log('onError: %s', e); },\n  function () { console.log('onCompleted'); });\n\n// => onNext: 1\n// => onNext: 2\n// => onNext: 3\n// => onNext: 4\n// => onNext: 5\n// => onCompleted\n\n```\n\n\nIn addition, we can also use ES6 Iterable objects such as `Map` and `Set` using `from` to an observable sequence.  In this example, we can take a `Set` and convert it to an observable sequence.\n\n```js\nvar set = new Set([1,2,3,4,5]);\n\n// Converts a Set to an observable sequence\nvar source = Rx.Observable.from(set);\n\n// Prints out each item\nvar subscription = source.subscribe(\n  function (x) { console.log('onNext: %s', x); },\n  function (e) { console.log('onError: %s', e); },\n  function () { console.log('onCompleted'); });\n\n// => onNext: 1\n// => onNext: 2\n// => onNext: 3\n// => onNext: 4\n// => onNext: 5\n// => onCompleted\n```\n\nWe can also do a `Map` as well by applying the same technique.\n\n```js\nvar map = new Map([['key1', 1], ['key2', 2]]);\n\n// Converts a Map to an observable sequence\nvar source = Rx.Observable.from(map);\n\n// Prints out each item\nvar subscription = source.subscribe(\n  function (x) { console.log('onNext: %s', x); },\n  function (e) { console.log('onError: %s', e); },\n  function () { console.log('onCompleted'); });\n\n// => onNext: key1, 1\n// => onNext: key2, 2\n// => onCompleted\n```\n\nThe `from` method can also support ES6 generators which may already be in your browser, or coming to a browser near you.  This allows us to do such things as Fibonacci sequences and so forth and convert them to an observable sequence.\n\n```js\nfunction* fibonacci () {\n  var fn1 = 1;\n  var fn2 = 1;\n  while (1){\n    var current = fn2;\n    fn2 = fn1;\n    fn1 = fn1 + current;\n    yield current;\n  }\n}\n\n// Converts a generator to an observable sequence\nvar source = Rx.Observable.from(fibonacci()).take(5);\n\n// Prints out each item\nvar subscription = source.subscribe(\n  function (x) { console.log('onNext: %s', x); },\n  function (e) { console.log('onError: %s', e); },\n  function () { console.log('onCompleted'); });\n\n// => onNext: 1\n// => onNext: 1\n// => onNext: 2\n// => onNext: 3\n// => onNext: 5\n// => onCompleted\n```\n\n## Cold vs. Hot Observables ##\n\nCold observables start running upon subscription, i.e., the observable sequence only starts pushing values to the observers when Subscribe is called. Values are also not shared among subscribers. This is different from hot observables such as mouse move events or stock tickers which are already producing values even before a subscription is active. When an observer subscribes to a hot observable sequence, it will get all values in the stream that are emitted after it subscribes. The hot observable sequence is shared among all subscribers, and each subscriber is pushed the next value in the sequence. For example, even if no one has subscribed to a particular stock ticker, the ticker will continue to update its value based on market movement. When a subscriber registers interest in this ticker, it will automatically receive the next tick.\n\nThe following example demonstrates a cold observable sequence. In this example, we use the Interval operator to create a simple observable sequence of numbers pumped out at specific intervals, in this case, every 1 second.\n\nTwo observers then subscribe to this sequence and print out its values. You will notice that the sequence is reset for each subscriber, in which the second subscription will restart the sequence from the first value.\n\nFirst, we need to ensure we reference the proper files if in the browser.  Note that the RxJS NPM Package already includes all operators by default.\n\n```html\n<script src=\"rx.lite.js\"></script>\n```\n\nAnd now to the example.\n\n```js\nvar source = Rx.Observable.interval(1000);\n\nvar subscription1 = source.subscribe(\n  function (x) { console.log('Observer 1: onNext: ' + x); },\n  function (e) { console.log('Observer 1: onError: ' + e.message); },\n  function () { console.log('Observer 1: onCompleted'); });\n\nvar subscription2 = source.subscribe(\n  function (x) { console.log('Observer 2: onNext: ' + x); },\n  function (e) { console.log('Observer 2: onError: ' + e.message); },\n  function () { console.log('Observer 2: onCompleted'); });\n\nsetTimeout(function () {\n  subscription1.dispose();\n  subscription2.dispose();\n}, 5000);\n\n// => Observer 1: onNext: 0\n// => Observer 2: onNext: 0\n// => Observer 1: onNext: 1\n// => Observer 2: onNext: 1\n// => Observer 1: onNext: 2\n// => Observer 2: onNext: 2\n// => Observer 1: onNext: 3\n// => Observer 2: onNext: 3\n```\n\nIn the following example, we convert the previous cold observable sequence source to a hot one using the [`publish`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/publish.md) operator, which returns a `ConnectableObservable` instance we name `hot`. The [`publish`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/publish.md) operator provides a mechanism to share subscriptions by broadcasting a single subscription to multiple subscribers. The `hot` variable acts as a proxy by subscribing to `source` and, as it receives values from `source`, pushing them to its own subscribers. To establish a subscription to the backing source and start receiving values, we use the [`ConnectableObservable.prototype.connect`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/connect.md) method. Since `ConnectableObservable` inherits `Observable`, we can use `subscribe` to subscribe to this hot sequence even before it starts running. Notice that in the example, the hot sequence has not been started when `subscription1` subscribes to it. Therefore, no value is pushed to the subscriber. After calling Connect, values are then pushed to `subscription1`. After a delay of 3 seconds, `subscription2` subscribes to `hot` and starts receiving the values immediately from the current position (3 in this case) until the end. The output looks like this:\n\n```\n// => Current time: 1382562433256\n// => Current Time after 1st subscription: 1382562433260\n// => Current Time after connect: 1382562436261\n// => Observer 1: onNext: 0\n// => Observer 1: onNext: 1\n// => Current Time after 2nd subscription: 1382562439262\n// => Observer 1: onNext: 2\n// => Observer 2: onNext: 2\n// => Observer 1: onNext: 3\n// => Observer 2: onNext: 3\n// => Observer 1: onNext: 4\n// => Observer 2: onNext: 4\n```\n\nFirst, we need to ensure we reference the proper files if in the browser.  Note that the RxJS NPM Package already includes all operators by default.\n\n```html\n<script src=\"rx.lite.js\"></script>\n```\n\nNow onto the example!\n\n```js\nconsole.log('Current time: ' + Date.now());\n\n// Creates a sequence\nvar source = Rx.Observable.interval(1000);\n\n// Convert the sequence into a hot sequence\nvar hot = source.publish();\n\n// No value is pushed to 1st subscription at this point\nvar subscription1 = hot.subscribe(\n  function (x) { console.log('Observer 1: onNext: %s', x); },\n  function (e) { console.log('Observer 1: onError: %s', e); },\n  function () { console.log('Observer 1: onCompleted'); });\n\nconsole.log('Current Time after 1st subscription: ' + Date.now());\n\n// Idle for 3 seconds\nsetTimeout(function () {\n\n  // Hot is connected to source and starts pushing value to subscribers\n  hot.connect();\n\n  console.log('Current Time after connect: ' + Date.now());\n\n  // Idle for another 3 seconds\n  setTimeout(function () {\n\n    console.log('Current Time after 2nd subscription: ' + Date.now());\n\n    var subscription2 = hot.subscribe(\n      function (x) { console.log('Observer 2: onNext: %s', x); },\n      function (e) { console.log('Observer 2: onError: %s', e); },\n      function () { console.log('Observer 2: onCompleted'); });\n\n  }, 3000);\n}, 3000);\n```\n\n**Analogies** \n\nIt helps to think of cold and hot Observables as movies or performances that one can watch (\"subscribe\").\n\n- Cold Observables: movies.\n- Hot Observables: live performances.\n- Hot Observables replayed: live performances recorded on video.\n\nWhenever you watch a movie, your run of the movie is independent of anyone else's run, even though all movie watchers see the same effects. On the other hand, a live performance is shared to multiple viewers. If you arrive late to a live performance, you will simply miss some of it. However, if it was recorded on video (in RxJS this would happen with a BehaviorSubject or a ReplaySubject), you can watch a \"movie\" of the live performance. A [`.publish().refCount()`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/refcount.md) live performance is one where the artists quit playing when no one is watching, and start playing again when there is at least one person in the audience. \n"
  },
  {
    "path": "doc/gettingstarted/creatingquerying.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Creating and Querying Observable Sequences #\n\nThis section describes how you can create and subscribe to an observable sequence, convert an existing JavaScript event and query it.\n\n1. [Creating and Subscribing to Simple Observable Sequences](creating.md)\n2. [Bridging to Events](events.md)\n3. [Bridging to Callbacks and Promises](callbacks.md)\n4. [Querying Observable Sequences](querying.md)\n5. [Operators by Category](categories.md)\n"
  },
  {
    "path": "doc/gettingstarted/errors.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Error Handling in the Reactive Extensions #\n\nOne of the most difficult tasks in asynchronous programming is dealing with errors.  Unlike interactive style programming, we cannot simply use the try/catch/finally approach that we use when dealing with blocking code.\n\n```js\ntry {\n  for (var obj in objs) {\n    doSomething(obj);\n  }\n} catch (e) {\n  handleError(e);\n} finally {\n  doCleanup();\n}\n```\n\nThese actions mirror exactly our `Observer` class which has the following contract for handing zero to infinite items with `onNext` and optionally handling either an `Error` with `onError` or successful completion with `onCompleted`.\n```typescript\ninterface Observable<T> {\n  onNext(value: T) : void\n  onError(error: Error) : void\n  onCompleted() : void\n}\n```\n\nBut the try/catch/finally approach won't work with asynchronous code.  Instead, we have a myriad of ways of handling errors as they occur, and ensure proper disposal of resources.\n\nFor example, we might want to do the following:\n- swallow the error and switch over to a backup Observable to continue the sequence\n- swallow the error and emit a default item\n- swallow the error and immediately try to restart the failed Observable\n- swallow the error and try to restart the failed Observable after some back-off interval\n\nWe'll cover each of those scenarios and more in this section.\n\n## Catching Errors ##\n\nThe first topic is catching errors as they happen with our streams. In the Reactive Extensions, any error is propogated through the `onError` channel which halts the sequence.  We can compensate for this by using the `catch` operator, at both the class and instance level.  \n\nUsing the class level `catch` method, we can catch errors as they happen with the current sequence and then move to the next sequence should there be an error.  For example, we could try getting data from several URLs, it doesn't matter which since they all have the same data, and then if that fails, default to a cached version, so an error should never propagate.  One thing to note is that if `get('url')` calls succeed, then it will not move onto the next sequence in the list.\n\n```js\nvar source = Rx.Observable.catch(\n  get('url1'),\n  get('url2'),\n  get('url3'),\n  getCachedVersion()\n);\n\nvar subscription = source.subscribe(\n  function (data) {\n    // Display the data as it comes in\n  }\n);\n```\n\nWe also have an instance version of `catch` which can be used two ways.  The first way is much like the example above, where we can take an existing stream, catch the error and move onto the next stream or `Promise`.\n\n```js\nvar source = get('url1').catch(getCachedVersion());\n\nvar subscription = source.subscribe(\n  function (data) {\n    // Display the data as it comes in\n  }\n);\n```\n\nThe other overload of `catch` allows us to inspect the error as it comes in so we can decide which route to take.  For example, if an error status code of 500 comes back from our web server, we can assume it is down and then use a cached version.\n\n```js\nvar source = get('url1').catch(function (e) {\n  if (e.status === 500) {\n    return cachedVersion();\n  } else {\n    return get('url2');\n  }\n});\n\nvar subscription = source.subscribe(\n  function (data) {\n    // Display the data as it comes in\n  }\n);\n```\n\nThis isn't the only way to handle errors as there are plenty of others as you'll see below.\n\n## Ignoring Errors with `onErrorResumeNext` ##\n\nThe Reactive Extensions borrowed from a number of languages in our design.  One of those features is bringing [`On Error Resume Next`](https://msdn.microsoft.com/en-us/library/5hsw66as.aspx) from Microsoft Visual Basic.  This operation specifies that when a run-time error occurs, control goes to the statement immediately following the statement where the error occurred, and execution continues from that point.  There are some instances with stream processing that you simply want to skip a stream which produces an error and move to the next stream.  We can achieve this with a class based and instance based `onErrorResumeNext` method.\n\nThe class based `onErrorResumeNext` continues a stream that is terminated normally or by an `Error` with the next stream or `Promise`.  Unlike `catch`, `onErrorResumeNext` will continue to the next sequence regardless of whether the previous was in error or not.  To make this more concrete, let's use a simple example of mixing error sequences with normal sequences.\n\n```js\nvar source = Rx.Observable.onErrorResumeNext(\n  Rx.Observable.just(42),\n  Rx.Observable.throw(new Error()),\n  Rx.Observable.just(56),\n  Rx.Observable.throw(new Error()),\n  Rx.Observable.just(78)\n);\n\nvar subscription = source.subscribe(\n  function (data) {\n    console.log(data);\n  }\n);\n// => 42\n// => 56\n// => 78\n```\n\nThe instance based `onErrorResumeNext` is similar to the class based version, the only difference being that it is attached to the prototype, but can take another sequence or `Promise` and continue.\n\n## Retrying Sequences ##\n\nWhen catching errors isn't enough and we want to retry our logic, we can do so with `retry` or `retryWhen` operators.  With the `retry` operator, we can try a certain operation a number of times before an error is thrown.  This is useful when you need to get data from a resource which may have intermittent failures due to load or any other issue.\n\nLet's take a look at a simple example of trying to get some data from a URL and giving up after three tries.\n\n```js\n// Try three times to get the data and then give up\nvar source = get('url').retry(3);\n\nvar subscription = source.subscribe(\n  function (data) {\n    console.log(data);\n  },\n  function (err) {\n    console.log(err);\n  }\n);\n```\n\nIn the above example, it will give up after three tries and thus call `onError` if it continues to fail after the third try.  We can remedy that by adding `catch` to use an alternate source.\n\n```js\n// Try three times to get the data and then return cached data if still fails\nvar source = get('url').retry(3).catch(cachedVersion());\n\nvar subscription = source.subscribe(\n  function (data) {\n    // Displays the data from the URL or cached data\n    console.log(data);\n  }\n);\n```\n\nThe above case retries immediately upon failure.  But what if you want to control when a retry happens?  We have the `retryWhen` operator which allows us to deeply control when the next try happens.  We incrementally back off trying again by using the following method:\n\n```js\nvar source = get('url').retryWhen(\n  function (attempts) {\n    return attempts\n      .zip(Rx.Observable.range(1, 3), function (_, i) { return i })\n      .flatMap(function (i) {\n        console.log('delay retry by ' + i + ' second(s)');\n        return Rx.Observable.timer(i * 1000);\n      });\n  }\n);\n\nvar subscription = source.subscribe(\n  function (data) {\n    // Displays the data from the URL or cached data\n    console.log(data);\n  }\n);\n// => delay retry by 1 second(s)\n// => delay retry by 2 second(s)\n// => Data\n```\n\n## Ensuring Cleanup with Finally ##\n\nWe've already covered the try/catch part of try/catch/finally, so what about finally?  We have the `finally` operator which calls a function after the source sequence terminates gracefully or exceptionally.  This is useful if you are using external resources or need to free up a particular variable upon completion.  \n\nIn this example, we can ensure that our `WebSocket` will indeed be closed once the last message is processed.\n\n```js\nvar socket = new WebSocket('ws://someurl', 'xmpp');\n\nvar source = Rx.Observable.from(data)\n  .finally(function () { socket.close(); });\n\nvar subscription = source.subscribe(\n  function (data) {\n    socket.send(data);\n  }\n);\n```\nBut,we can do a better job in terms of managing resources if need be by using the `using` method.\n\n## Ensuring Resource Disposal ##\n\nAs stated above, `finally` can be used to ensure proper cleanup of any resources or perform any side effects as necessary.  There is a cleaner approach we can take by creating a disposable wrapper around our object with a `dispose` method so that when our scope is complete, then the resource is automatically disposed through the `using` operator.\n\n```js\nfunction DisposableWebSocket(url, protocol) {\n  var socket = new WebSocket(url, protocol);\n\n  // Create a way to close the WebSocket upon completion\n  var d = Rx.Disposable.create(function () {\n    socket.close();\n  });\n\n  d.socket = socket;\n\n  return d;\n}\n\nvar source = Rx.Observable.using(\n  function () { return new DisposableWebSocket('ws://someurl', 'xmpp'); },\n  function (d) {\n    return Rx.Observable.from(data)\n      .tap(function (data) { d.socket.send(data); });\n  }\n);\n\nvar subscription = source.subscribe();\n```\n\n## Delaying Errors with `mergeDelayError` ##\n\nAnother issue may arise when you are dealing with flattening sequences into a single sequence and there may be errors along the way.  We want a way to flatten without being interrupted by one of our sources being in error.  This is much like the other operator `mergeAll` but the main difference is, instead of immediately bubbling up the error, it holds off until the very end.\n\nTo illustrate, we can create this little sample that has an errored sequence in the middle when it is trying to flatten the sequences.\n```js\nvar source1 = Rx.Observable.of(1,2,3);\nvar source2 = Rx.Observable.throwError(new Error('woops'));\nvar source3 = Rx.Observable.of(4,5,6);\n\nvar source = Rx.Observable.mergeDelayError(source1, source2, source3);\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => 1\n// => 2\n// => 3\n// => 4\n// => 5\n// => 6\n// => Error: Error: woops\n```\n\n## Further Reading ##\n- [Using Generators For Try/Catch Operations](generators.md)\n- [Testing and Debugging Your RxJS Application](testing.md)\n"
  },
  {
    "path": "doc/gettingstarted/events.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Bridging to Events #\n\nRxJS provides factory methods for you to bridge with existing asynchronous sources in the DOM or Node.js so that you can employ the rich composing, filtering and resource management features provided by RxJS on any kind of data streams. This topic examines the [`fromEvent`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/fromevent.md) and [`fromEventPattern`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/fromeventpattern.md) operator that allows \"importing\" a DOM or custom event into RxJS as an observable sequence. Every time an event is raised, an `onNext` message will be delivered to the observable sequence. You can then manipulate event data just like any other observable sequences.\n\nRxJS does not aim at replacing existing asynchronous programming models such as promises or callbacks. However, when you attempt to compose events, RxJS’s factory methods will provide you the convenience that cannot be found in the current programming model. This is especially true for resource maintenance (e.g., when to unsubscribe) and filtering (e.g., choosing what kind of data to receive). In this topic and the ones that follow, you can examine how these RxJS features can assist you in asynchronous programming.\n\nNatively, RxJS supports a number of libraries and hooks into them such as [jQuery](http://jquery.com/), [Zepto.js](http://zeptojs.com/), [AngularJS](https://angularjs.org/), [Ember.js](http://emberjs.com/) and [Backbone.js](http://backbonejs.org) for using their event system.  This behavior, however, can be overridden to only use native bindings only.  By default, RxJS also has hooks for [Node.js](http://nodejs.org) `EventEmitter` events natively supported.\n\n## Converting a DOM event to a RxJS Observable Sequence ##\n\nThe following sample creates a simple DOM event handler for the mouse move event, and prints out the mouse’s location on the page.\n\n```js\nvar result = document.getElementById('result');\n\ndocument.addEventListener('mousemove', function (e) {\n  result.innerHTML = e.clientX + ', ' + e.clientY;\n}, false);\n```\n\nTo import an event into RxJS, you can use the [`fromEvent`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/fromevent.md) operator, and provide the event arguments that will be raised by the event being bridged. It then converts the given event into an observable sequence.\n\nIn the following example, we convert the mousemove event stream of the DOM into an observable sequence. Every time a mouse-move event is fired, the subscriber will receive an `onNext` notification. We can then examine the event arguments value of such notification and get the location of the mouse-move.\n\n```js\nvar result = document.getElementById('result');\n\nvar source = Rx.Observable.fromEvent(document, 'mousemove');\n\nvar subscription = source.subscribe(function (e) {\n  result.innerHTML = e.clientX + ', ' + e.clientY;\n});\n```\n\nNotice that in this sample, move becomes an observable sequence in which we can manipulate further. The [Querying Observable Sequences](querying.md) topic will show you how you can project this sequence into a collection of Points type and filter its content, so that your application will only receive values that satisfy a certain criteria.\n\nCleaning up of the event handler is taken care of by the `Disposable` object returned by the `subscribe` method. Calling `dispose` will release all resources being used by the sequence including the underlying event handler. This essentially takes care of unsubscribing to an event on your behalf.\n\nThe `fromEvent` method also supports adding event handlers to multiple items, for example a DOM NodeList.  This example will add the 'click' to each element in the list.\n\n```js\nvar result = document.getElementById('result');\nvar sources = document.querySelectorAll('div');\n\nvar source = Rx.Observable.fromEvent(sources, 'click');\n\nvar subscription = source.subscribe(function (e) {\n  result.innerHTML = e.clientX + ', ' + e.clientY;\n});\n```\n\nIn addition, `fromEvent` also supports libraries such as [jQuery](http://jquery.com/), [Zepto.js](http://zeptojs.com/), [AngularJS](https://angularjs.org/), [Ember.js](http://emberjs.com/) and [Backbone.js](http://backbonejs.org):\n\n```js\nvar $result = $('#result');\nvar $sources = $('div');\n\nvar source = Rx.Observable.fromEvent($sources, 'click');\n\nvar subscription = source.subscribe(function (e) {\n  $result.html(e.clientX + ', ' + e.clientY);\n});\n```\n\nIf this behavior is not desired, you can override it by setting the `Rx.config.useNativeEvents` to `true` which will disregard any library for which we support events.\n\n```js\n// Use only native events even if jQuery\nRx.config.useNativeEvents = true;\n\n// Native events only\nvar result = document.getElementById('result');\n\nvar source = Rx.Observable.fromEvent(document, 'mousemove');\n\nvar subscription = source.subscribe(function (e) {\n  result.innerHTML = e.clientX + ', ' + e.clientY;\n});\n```\n\nIn addition, you could easily add many shortcuts into the event system for events such as `mousemove`, and even extending to [Pointer](http://www.w3.org/TR/pointerevents/) and [Touch](http://www.w3.org/TR/touch-events/) Events.\n\n```js\nRx.dom = {};\n\nvar events = \"blur focus focusin focusout load resize scroll unload click dblclick \" +\n  \"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n  \"change select submit keydown keypress keyup error contextmenu\";\n\nif (root.PointerEvent) {\n  events += \" pointerdown pointerup pointermove pointerover pointerout pointerenter pointerleave\";\n}\n\nif (root.TouchEvent) {\n  events += \" touchstart touchend touchmove touchcancel\";\n}\n\nevents.split(' ').forEach(function (e) {\n  Rx.dom[e] = function (element, selector) {\n    return Rx.Observable.fromEvent(element, e, selector);\n  };\n});\n```\n\nNow we can rewrite a simple mouse drag as the following:\n```js\nvar draggable = document.getElementById('draggable');\n\nvar mousedrag = Rx.dom.mousedown(draggable).flatMap(function (md) {\n  md.preventDefault();\n\n  var start = getLocation(md);\n\n  return Rx.dom.mousemove(document)\n    .map(function (mm) {\n      return getDelta(start, mm);\n    })\n    .takeUntil(Rx.dom.mouseup(draggable));\n});\n```\n\nNote this is already available in the [RxJS-DOM](https://github.com/Reactive-Extensions/RxJS-DOM) project, but is small enough for you to implement yourself.\n\n## Converting a Node.js event to a RxJS Observable Sequence ##\n\nNode.js is also supported such as an [`EventEmitter`](http://nodejs.org/api/events.html#events_class_events_eventemitter):\n\n```js\nvar Rx = require('rx'),\n  EventEmitter = require('events').EventEmitter;\n\nvar eventEmitter = new EventEmitter();\n\nvar source = Rx.Observable.fromEvent(eventEmitter, 'data')\n\nvar subscription = source.subscribe(function (data) {\n  console.log('data: ' + data);\n});\n\neventEmitter.emit('data', 'foo');\n// => data: foo\n```\n\n## Bridging to Custom Events with FromEventPattern ##\n\nThere may be instances dealing with libraries which have different ways of subscribing and unsubscribing from events.  The [`fromEventPattern`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/fromeventpattern.md) method was created exactly for this purpose to allow you to bridge to each of these custom event emitters.\n\nFor example, you might want to bridge to using jQuery [`on`](http://api.jquery.com/on/) method.  We can convert the following code which alerts based upon the click of a table row.\n\n```js\n$( \"#dataTable tbody\" ).on('click', 'tr', function() {\n  alert( $( this ).text() );\n});\n```\n\nThe converted code looks like this while using the `fromEventPattern` method.  Each function passes in the handler function which allows you to call the `on` and `off` methods to properly handle disposal of events.\n\n```js\nvar $tbody = $('#dataTable tbody');\n\nvar source = Rx.Observable.fromEventPattern(\n  function addHandler (h) { $tbody.on('click', 'tr', h); },\n  function delHandler (h) { $tbody.off('click', 'tr', h); });\n\nvar subscription = source.subscribe(function (e) {\n  alert( $(e.target).text() );\n});\n```\n\nIn addition to this normal support, we also support if the `addHandler` returns an object, it can be passed to the `removeHandler` to properly unsubscribe.  In this example, we'll use the [Dojo Toolkit](http://dojotoolkit.org) and the [`on`](http://dojotoolkit.org/api/1.9/dojo/on.html) module.\n\n```js\nrequire(['dojo/on', 'dojo/dom', 'rx', 'rx.async', 'rx.binding'], function (on, dom, rx) {\n\n    var input = dom.byId('input');\n\n    var source = Rx.Observable.fromEventPattern(\n        function addHandler (h) {\n            return on(input, 'click', h);\n        },\n        function delHandler (_, signal) {\n            signal.remove();\n        }\n    );\n\n    var subscription = source.subscribe(\n        function (x) {\n            console.log('Next: Clicked!');\n        },\n        function (err) {\n            console.log('Error: ' + err);\n        },\n        function () {\n            console.log('Completed');\n        });\n\n    on.emit(input, 'click');\n    // => Next: Clicked!\n});\n```\n\n## See Also\n\nConcepts\n- [Querying Observable Sequences](querying.md)\n"
  },
  {
    "path": "doc/gettingstarted/exploring.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Exploring The Major Concepts in RxJS #\n\nThis topic describes the major Reactive Extensions for JavaScript (Rx) objects used to represent observable sequences and subscribe to them.\n\nThe `Observable` / `Observer` objects are available in the core distribution of RxJS.\n\n## `Observable` / `Observer` ##\n\nRx exposes asynchronous and event-based data sources as push-based, observable sequences abstracted by the [`Observable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md) object in the core distribution of RxJS. It represents a data source that can be observed, meaning that it can send data to anyone who is interested.\n\nAs described in [What is RxJS](what.md), the other half of the push model is represented by the [`Observer`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observer.md) object, which represents an observer who registers an interest through a subscription. Items are subsequently handed to the observer from the observable sequence to which it subscribes.\n\nIn order to receive notifications from an observable collection, you use the [`subscribe`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservableprototypesubscribeobserver--onnext-onerror-oncompleted) method of `Observable` to hand it an `Observer` object. In return for this observer, the [`subscribe`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservableprototypesubscribeobserver--onnext-onerror-oncompleted) method returns a `Disposable` object that acts as a handle for the subscription. This allows you to clean up the subscription after you are done.  Calling `dispose` on this object detaches the observer from the source so that notifications are no longer delivered. As you can infer, in RxJS you do not need to explicitly unsubscribe from an event as in the common JavaScript event model.\n\nObservers support three publication events, reflected by the object's methods. The [`onNext`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observer.md#rxobserverprototypeonnextvalue) can be called zero or more times, when the observable data source has data available. For example, an observable data source used for mouse move events can send out an event object every time the mouse has moved. The other two methods are used to indicate completion or errors.\n\nThe following lists the `Observable` / `Observer` objects in addition to the `Disposable` object.\n\n```js\n/**\n * Defines a method to release allocated resources.\n */\nfunction Disposable() { }\n\n/**\n * Performs application-defined tasks associated with freeing, releasing, or resetting resources.\n */\nDisposable.prototype.dispose = function () { ... }\n\n/**\n * Defines a provider for push-based notification.\n */\nfunction Observable() { }\n\n/**\n * Notifies the provider that an observer is to receive notifications.\n *\n * @param {Observer} observer The object that is to receive notifications.\n * @returns {Disposable} A reference to disposable that allows observers to stop receiving notifications before the provider has finished sending them.\n */\nObservable.prototype.subscribe = function (observer) { ... }\n\n/**\n * Provides a mechanism for receiving push-based notifications.\n */\nfunction Observer() { }\n\n/**\n * Provides the observer with new data.\n *\n * @param {Any} value The current notification information.\n */\nObserver.prototype.onNext = function (value) { ... };\n\n/**\n * Notifies the observer that the provider has experienced an error condition.\n *\n * @param {Error} error An object that provides additional information about the error.\n */\nObserver.prototype.onError = function (error) { ... };\n\n/**\n * Notifies the observer that the provider has finished sending push-based notifications.\n */\nObserver.prototype.onCompleted = function () { ... };\n```\n\nRxJS also provides `subscribe` capabilities so that you can avoid implementing the `Observer` object yourself. For each publication event (`onNext`, `onError`, `onCompleted`) of an observable sequence, you can specify a function that will be invoked, as shown in the following example. If you do not specify an action for an event, the default behavior will occur.\n\n```js\n// Creates an observable sequence of 5 integers, starting from 1\nvar source = Rx.Observable.range(1, 5);\n\n// Prints out each item\nvar subscription = source.subscribe(\n\tfunction (x) { console.log('onNext: ' + x); },\n\tfunction (e) { console.log('onError: ' + e.message); },\n\tfunction () { console.log('onCompleted'); });\n\n// => onNext: 1\n// => onNext: 2\n// => onNext: 3\n// => onNext: 4\n// => onNext: 5\n// => onCompleted\n```\n\nYou can treat the observable sequence (such as a sequence of mouse-over events) as if it were a normal collection. Thus you can write queries over the collection to do things like filtering, grouping, composing, etc. To make observable sequences more useful, the RxJS libraries provide many factory operators so that you do not need to implement any of these on your own. This will be covered in the [Querying Observable Sequences](querying.md) topic.\n\n### Caution:\nYou do not need to implement the Observable/Observer objects yourself.  Rx provides internal implementations of these interfaces for you and exposes them through various extension methods provided by the Observable and Observer types.  See the [Creating and Querying Observable Sequences](creatingquerying.md) topic for more information.\n\n### See Also\n\nConcepts\n- [Querying Observable Sequences](querying.md)\n\nOther Resources\n- [Creating and Querying Observable Sequences](creatingquerying.md)\n"
  },
  {
    "path": "doc/gettingstarted/generators.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Generators and Observable Sequences #\n\nOne of the more exciting features of ES6 is a new function type called generators.  They have been in Firefox for years, although they have now been finally standardized in ES6, and will be shipping in a browser or runtime near you. How generators differ from normal functions is that a normal function such as the following will run to completion, regardless of whether it is asynchronous or not.\n\n```js\nfunction printNumberOfTimes(msg, n) {\n  for (var i = 0; i < n; i++) {\n    console.log(msg);\n  }\n}\n\nprintNumberOfTime('Hello world', 1);\n// => Hello world\n\n// Asynchronous\nsetTimeout(function () {\n  console.log('Hello from setTimeout after one second');\n}, 1000); \n// => Hello from setTimeout after one second\n```\n\nInstead of running to completion, generators allow us to interrupt the flow of the function by introducing the `yield` keyword which pauses the function.  The function cannot resume on its own without the external consumer saying that they need the next value.  \n\nTo create a generator function, you must use the `function*` syntax which then becomes a generator.  In this particular example, we will yield a single value, the meaning of life.\n```js\nfunction* theMeaningOfLife() {\n  yield 42;\n}\n```\n\nTo get the value out, we need to invoke the function, and then call `next` to get the next value.  The return value from the `next` call will have a flag as to whether it is done, as well as any value that is yielded.  Note that the function doesn't do anything until we start to call `next`.\n\n```js\nvar it = theMeaningOfLife();\n\nit.next();\n// => { done: false, value: 42 }\n\nit.next();\n// => { done: true, value: undefined }\n```\n\nWe can also use some ES6 shorthand for getting values from a generator such as the `for..of`.\n\n```js\nfor (var v of theMeaningOfLife()) {\n  console.log(v);\n}\n// => 42\n```\n\nThis of course is only scratching the surface of what generators are capable of doing as we're more focused on the simple nature of yielding values.\n\nSince RxJS believes heavily in standards, we also look for ways to incorporate new language features as they become standardized so that you can take advantage of them, combined with the power of RxJS.\n\n## Async/Await Style and RxJS ##\n\nOne common complaint of JavaScript is the callback nature to asynchronous behavior.  Luckily, this can be solved quite easily with a library approach.  To that end, we introduce [`Rx.spawn`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/spawn.md) which allows you to write straight forward code manner and can yield not only Observable sequences, but also Promises, Callbacks, Arrays, etc.  This allows you to write your code in a very imperative manner without all the callbacks, but also brings the power of RxJS whether you want to call `timeout`, `retry`, `catch` or any other method for that matter.  Note that this only yields a single value, but in RxJS terms, this is still quite useful.  \n\nFor example, we could get the HTML from Bing.com and write it to the console, with a timeout of 5 seconds which will throw an error should it not respond in time.  We could also add in things like `retry` and `catch` so that we could for example try three times and then if it fails, give a default response or cached version.\n\n```js\nvar Rx = require('rx');\nvar request = require('request');\nvar get = Rx.Observable.fromNodeCallback(request);\n\nRx.Observable.spawn(function* () {\n  var data;\n  try {\n    data = yield get('http://bing.com').timeout(5000 /*ms*/);\n  } catch (e) {\n    console.log('Error %s', e);\n  } \n\n  console.log(data);\n}).subscribe();\n```\n\n## Mixing Operators with Generators ##\n\nMany of the operators inside RxJS also support generators.  For example, we could use the [`Rx.Observable.from`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/from.md) method to take a generator function, in this case, a Fibonacci sequence, take 10 of them and display it.\n\n```js\nfunction* fibonacci(){\n  var fn1 = 1;\n  var fn2 = 1;\n  while (1) {\n    var current = fn2;\n    fn2 = fn1;\n    fn1 = fn1 + current;\n    yield current;\n  }\n}\n\nRx.Observable.from(fibonacci())\n  .take(10)\n  .subscribe(function (x) {\n    console.log('Value: %s', x);\n  });\n\n//=> Value: 1\n//=> Value: 1\n//=> Value: 2\n//=> Value: 3\n//=> Value: 5\n//=> Value: 8\n//=> Value: 13\n//=> Value: 21\n//=> Value: 34\n//=> Value: 55\n```\n\nThat's just the beginning, as there are several operators such as [`concatMap`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/concatmap.md)/[`selectConcat`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/concatmap.md) and [`flatMap`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/selectmany.md)/[`selectMany`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/concatmap.md) which take iterables as an argument so that we can further enable composition.  For example, we could project using generators from a `flatMap` operation.\n\n```js\nvar source = Rx.Observable.of(1,2,3)\n  .flatMap(\n    function (x, i) { return function* () { yield x; yield i; }(); },\n    function (x, y, i1, i2) { return x + y + i1 + i2; }\n  );\n\nvar subscription = source.subscribe(\n  function (x) {\n    console.log('Next: %s', x);\n  },\n  function (err) {\n    console.log('Error: %s', err);\n  },\n  function () {\n    console.log('Completed');\n  });\n\n// => Next: 2\n// => Next: 2\n// => Next: 5\n// => Next: 5\n// => Next: 8\n// => Next: 8\n// => Completed\n```\n\nThe future of JavaScript is exciting and generators add new possibilities to our applications to allow them to mix and match our programming styles.\n\nNotice that in this sample, move becomes an observable sequence in which we can manipulate further. The [Querying Observable Sequences](querying.md) topic will show you how you can project this sequence into a collection of Points type and filter its content, so that your application will only receive values that satisfy a certain criteria.\n\n## See Also\n\nConcepts\n- [Querying Observable Sequences](querying.md)\n"
  },
  {
    "path": "doc/gettingstarted/operators.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Implementing Your Own Observable Operators #\n\nYou can extend RxJS by adding new operators for operations that are not provided by the base library, or by creating your own implementation of standard query operators to improve readability and performance. Writing a customized version of a standard operator is useful when you want to operate with in-memory objects and when the intended customization does not require a comprehensive view of the query.\n\n## Creating New Operators ##\n\nRxJS offers a full set of operators that cover most of the possible operations on a set of entities. However, you might need an operator to add a particular semantic meaning to your query—especially if you can reuse that same operator several times in your code.  Adding new operators to RxJS is a way to extend its capabilities. However, you can also improve code readability by wrapping existing operators into more specialized and meaningful ones.\n\nFor example, let's see how we might implement the [_.where](http://lodash.com/docs#where) method from [Lo-Dash](http://lodash.com/) or [Underscore](http://underscorejs.org/), which takes a set of attributes and does a deep comparison for equality.  We might try implementing this from scratch using the `Rx.Observable.create` method such as the following code.\n\n```js\nRx.Observable.prototype.filterByProperties = function (properties) {\n\tvar source = this,\n\t\tcomparer = Rx.internals.isEqual;\n\n\treturn Rx.Observable.create(function (observer) {\n\t\t// Our disposable is the subscription from the parent\n\t\treturn source.subscribe(\n\t\t\tfunction (data) {\n\n\t\t\t\ttry {\n\t\t\t\t\tvar shouldRun = true;\n\n\t\t\t\t\t// Iterate the properties for deep equality\n\t\t\t\t\tfor (var prop in properties) {\n\t\t\t\t\t\tif (!comparer(properties[prop], data[prop])) {\n\t\t\t\t\t\t\tshouldRun = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tobserver.onError(e);\n\t\t\t\t}\n\n\t\t\t\tif (shouldRun) {\n\t\t\t\t\tobserver.onNext(data);\n\t\t\t\t}\n\t\t\t},\n\t\t\tobserver.onError.bind(observer),\n\t\t\tobserver.onCompleted.bind(observer)\n\t\t);\n\t});\n};\n```\n\nMany existing operators, such as this, instead could be built using other basic operators for example in this case, `filter` or `where`.  In fact, many existing operators are built using other basic operators. For example, the `flatMap` or `selectMany` operator is built by composing the `map` or `select` and `mergeObservable` operators, as the following code shows.\n\n```js\nRx.Observable.prototype.flatMap = function (selector) {\n\treturn this.map(selector).mergeObservable();\n};\n```\n\nWe could rewrite it as the following to take advantage of already built in operators.\n\n```js\nRx.Observable.prototype.filterByProperties = function (properties) {\n\tvar comparer = Rx.internals.isEqual;\n\n\treturn this.filter(function (data) {\n\n\t\t// Iterate the properties for deep equality\n\t\tfor (var prop in properties) {\n\t\t\tif (!comparer(properties[prop], data[prop])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t});\n};\n```\n\nBy reusing existing operators when you build a new one, you can take advantage of the existing performance or exception handling capabilities implemented in the RxJS libraries.  When writing a custom operator, it is good practice not to leave any disposables unused; otherwise, you may find that resources could actually be leaked and cancellation may not work correctly.\n\n## Testing Your New Operator ##\n\nJust because you have implemented a new operator doesn't mean you are finished.  Now, let's write a test to verify its behavior from what we learned in the [Testing and Debugging](testing.md) topic.  We'll reuse the `collectionAssert.assertEqual` from the previous topic so it is not repeated here.\n\n```js\nvar onNext = Rx.ReactiveTest.onNext,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe;\n\ntest('filterProperties should yield with match', function () {\n\n    var scheduler = new Rx.TestScheduler();\n\n    var input = scheduler.createHotObservable(\n        onNext(210, { 'name': 'curly', 'age': 30, 'quotes': ['Oh, a wise guy, eh?', 'Poifect!'] }),\n        onNext(220, { 'name': 'moe', 'age': 40, 'quotes': ['Spread out!', 'You knucklehead!'] }),\n        onCompleted(230)\n    );\n\n    var results = scheduler.startWithCreate(\n        function () {\n            return input.filterByProperties({ 'age': 40 });\n        }\n    );\n\n    collectionAssert.assertEqual(results.messages, [\n        onNext(220, { 'name': 'moe', 'age': 40, 'quotes': ['Spread out!', 'You knucklehead!'] }),\n        onCompleted(230)\n    ]);\n\n    collectionAssert.assertEqual(input.subscriptions, [\n    \tsubscribe(200, 230)\n    ]);\n});\n```\n\nIn order for this to be successfully tested, we should check for when there is no data, empty, single matches, multiple matches and so forth.\n\n## See Also ##\n\n**Resources**\n- [Testing and Debugging](testing.md)\n"
  },
  {
    "path": "doc/gettingstarted/promises.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Bridging to Promises #\n\nPromises are a defacto standard within JavaScript community and is part of the ECMAScript Standard.  A promise represents the eventual result of an asynchronous operation. The primary way of interacting with a promise is through its then method, which registers callbacks to receive either a promise’s eventual value or the reason why the promise cannot be fulfilled.  You can create them very easily where the constructor has two functions, `resolve` and `reject` which resolves the value or rejects it for a given reason.  RxJS is fully committed to standards and has native support for Promises for any number of methods where they can be used interchangeably with Observable sequences.  \n\nThe advantage that you get when you intermix Promises with Observable sequences is that unlike the ES6 Promise standard, you get cancellation semantics which means you can disregard values if you no longer are interested.  One of the biggest problems around Promises right now are around cancellation, as to cancel the operation, such as an XHR is not easily done with the existing standard, nor is it to only get the last value to ensure no out of order requests.  With Observable sequences, you get that behavior for free in a multicast behavior, instead of the unicast Promise behavior.\n\nThe following list of operators natively support Promises:\n- [`Rx.Observable.amb`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/amb.md) | [`Rx.Observable.prototype.amb`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/ambproto.md)\n- [`Rx.Observable.case`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/case.md)\n- [`Rx.Observable.catch`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/catch.md) | [`Rx.Observable.prototype.catch`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/catchproto.md)\n- [`Rx.Observable.combineLatest`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/combinelatest.md) | [`Rx.Observable.prototype.combineLatest`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/combinelatestproto.md)\n- [`Rx.Observable.concat`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/concat.md) | [`Rx.Observable.prototype.concat`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/concatproto.md)\n- [`Rx.Observable.prototype.concatMap`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/concatmap.md)\n- [`Rx.Observable.prototype.concatMapObserver`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/concatobserver.md)\n- [`Rx.Observable.defer`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/defer.md)\n- [`Rx.Observable.prototype.flatMap`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/selectmany.md)\n- [`Rx.Observable.prototype.flatMapLatest`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/flatmaplatest.md)\n- [`Rx.Observable.forkJoin`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/forkjoin.md) | [`Rx.Observable.prototype.forkJoin`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/forkjoinproto.md)\n- [`Rx.Observable.if`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/if.md)\n- [`Rx.Observable.merge`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/merge.md)\n- [`Rx.Observable.prototype.mergeAll`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/mergeall.md)\n- [`Rx.Observable.onErrorResumeNext`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/onerrorresumenext.md) | [`Rx.Observable.prototype.onErrorResumeNext`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/onerrorresumenextproto.md)\n- [`Rx.Observable.prototype.selectMany`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/selectmany.md)\n- [`Rx.Observable.prototype.selectSwitch`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/flatmaplatest.md)\n- [`Rx.Observable.prototype.sequenceEqual`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/sequenceequal.md)\n- [`Rx.Observable.prototype.skipUntil`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/skipuntil.md)\n- [`Rx.Observable.startAsync`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/startasync.md)\n- [`Rx.Observable.prototype.switch`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/switch.md)\n- [`Rx.Observable.prototype.takeUntil`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/takeuntil.md)\n- [`Rx.Observable.prototype.debounceWithSelector`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/debouncewithselector.md)\n- [`Rx.Observable.prototype.timeoutWithSelector`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/timeoutwithselector.md)\n- [`Rx.Observable.while`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/while.md)\n- [`Rx.Observable.prototype.window`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/window.md)\n- [`Rx.Observable.withLatestFrom`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/withlatestfrom.md)\n- [`Rx.Observable.zip`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/zip.md) | [`Rx.Observable.prototype.zip`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/zipproto.md)\n\nBecause of this, we can now do a number of very interesting things such as combining Promises and Observable sequences.\n\n```js\nvar source = Rx.Observable.range(0, 3)\n  .flatMap(function (x) { return Promise.resolve(x * x); });\n\nvar subscription = source.subscribe(\n  function (x) { console.log('onNext: %s', x); },\n  function (e) { console.log('onError: %s', e); },\n  function () { console.log('onCompleted'); });\n\n// => onNext: 0\n// => onNext: 1\n// => onNext: 4\n// => onCompleted\n```\n\nThis is just scratching the surface of what Promises and RxJS can do together so that we have first class single values and first class multiple values working together.\n\n## Converting Promises to Observable Sequences ##\n\nIt's quite simple to convert a Promise object which conforms to the ES6 Standard Promise where the behavior is uniform across implementations.  To support this, we provide the [`Rx.Observable.fromPromise`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/frompromise.md) method which calls the `then` method of the promise to handle both success and error cases.\n\nIn the following example, we create promise objects using [RSVP](https://github.com/tildeio/rsvp.js) library.\n\n```js\n// Create a promise which resolves 42\nvar promise1 = new RSVP.Promise(function (resolve, reject) {\n    resolve(42);\n});\n\nvar source1 = Rx.Observable.fromPromise(promise1);\n\nvar subscription1 = source1.subscribe(\n  function (x) { console.log('onNext: %s', x); },\n  function (e) { console.log('onError: %s', e); },\n  function () { console.log('onCompleted'); });\n\n// => onNext: 42\n// => onCompleted\n\n// Create a promise which rejects with an error\nvar promise2 = new RSVP.Promise(function (resolve, reject) {\n    reject(new Error('reason'));\n});\n\nvar source2 = Rx.Observable.fromPromise(promise2);\n\nvar subscription2 = source2.subscribe(\n  function (x) { console.log('onNext: %s', x); },\n  function (e) { console.log('onError: %s', e); },\n  function () { console.log('onCompleted'); });\n\n// => onError: reject\n```\n\nNotice that in this sample, these promises becomes an observable sequences in which we can manipulate further. The [Querying Observable Sequences](querying.md) topic will show you how you can project this sequence into another, filter its content, so that your application will only receive values that satisfy a certain criteria.\n\n## Converting Observable Sequences to Promises ##\n\nJust as you can convert a Promise to an Observable sequence, you can also convert an Observable sequence to a Promise.  This either requires native support for Promises, or a Promise library you can add yourself, such as [Q](https://github.com/kriskowal/q), [RSVP](https://github.com/tildeio/rsvp.js), [when.js](https://github.com/cujojs/when) among others.  These libraries must conform to the ES6 standard for construction where it provides two functions to resolve or reject the promise.\n\n```js\nvar p = new Promise(function (resolve, reject) {\n  resolve(42);\n});\n```\n\nWe can use the [`toPromise`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/topromise.md) method which allows you to convert an Observable sequence to a Promise.  This method accepts a Promise constructor, and if not provided, will default to a default implementation.  In this first example, we will use [RSVP](https://github.com/tildeio/rsvp.js) to construct our Promise objects.\n\n```js\n// Return a single value\nvar source1 = Rx.Observable.just(1).toPromise(RSVP.Promise);\n\nsource1.then(\n  function (value) {\n    console.log('Resolved value: %s', value);\n  },\n  function (reason) {\n    console.log('Rejected reason: %s', reason);\n  });\n\n// => Resolved value: 1\n\n// Reject the Promise\nvar source2 = Rx.Observable.throwError(new Error('reason')).toPromise(RSVP.Promise);\n\nsource2.then(\n  function (value) {\n    console.log('Resolved value: %s', value);\n  },\n  function (reason) {\n    console.log('Rejected reason: %s', reason);\n  });\n\n// => Rejected reason: Error: reason\n```\n\nIf an implementation is not given with the [`toPromise`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/topromise.md) method, it will fall back to the Promise implementation specified in the `Rx.config.Promise` field.  By default this will be set to the runtime's ES6 Promise implementation, but can easily be overridden by specifying the configuration information.\n\n```js\nRx.config.Promise = RSVP.Promise;\n\nvar source1 = Rx.Observable.just(1).toPromise();\n\nsource1.then(\n  function (value) {\n    console.log('Resolved value: %s', value);\n  },\n  function (reason) {\n    console.log('Rejected reason: %s', reason);\n  });\n\n// => Resolved value: 1\n```\n\nIf you are in a pure ES6 environment, this should just work without any settings on your part as it will use the runtime's ES6 Promise implementation.\n```js\nvar source1 = Rx.Observable.just(1).toPromise();\n\nsource1.then(\n  function (value) {\n    console.log('Resolved value: %s', value);\n  },\n  function (reason) {\n    console.log('Rejected reason: %s', reason);\n  });\n\n// => Resolved value: 1\n```\n\nConcepts\n- [Querying Observable Sequences](querying.md)\n"
  },
  {
    "path": "doc/gettingstarted/querying.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Querying Observable Sequences #\n\nIn [Bridging to Events](events.md), we have converted existing DOM and Node.js events into observable sequences to subscribe to them. In this topic, we will look at the first-class nature of observable sequences as IObservable<T> objects, in which generic LINQ operators are supplied by the Rx assemblies to manipulate these objects. Most operators take an observable sequence and perform some logic on it and output another observable sequence. In addition, as you can see from our code samples, you can even chain multiple operators on a source sequence to tweak the resulting sequence to your exact requirement.\n\n## Using Different Operators ##\n\nWe have already used the [`create`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservablecreatesubscribe) and [`range`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservablerangestart-count-scheduler) operators in previous topics to create and return simple sequences. We have also used the [`fromEvent`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservablefromeventelement-eventname) and [`fromEventPattern`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservablefromeventpatternaddhandler-removehandler) operators to convert existing  events into observable sequences. In this topic, we will use other operators of the `Observable` type so that you can filter, group and transform data. Such operators take observable sequence(s) as input, and produce observable sequence(s) as output.\n\n## Combining different sequences ##\n\nIn this section, we will examine some of the operators that combine various observable sequences into a single observable sequence. Notice that data are not transformed when we combine sequences.\nIn the following sample, we use the Concat operator to combine two sequences into a single sequence and subscribe to it. For illustration purpose, we will use the very simple `range(x, y)` operator to create a sequence of integers that starts with x and produces y sequential numbers afterwards.\n\n```js\nvar source1 = Rx.Observable.range(1, 3);\nvar source2 = Rx.Observable.range(1, 3);\n\nsource1.concat(source2)\n   .subscribe(function (x) { console.log(x); });\n\n// => 1\n// => 2\n// => 3\n// => 1\n// => 2\n// => 3\n```\n\nNotice that the resultant sequence is 1,2,3,1,2,3. This is because when you use the [`concat`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservableprototypeconcatargs) operator, the 2nd sequence (source2) will not be active until after the 1st sequence (source1) has finished pushing all its values. It is only after source1 has completed, then source2 will start to push values to the resultant sequence. The subscriber will then get all the values from the resultant sequence.\n\nCompare this with the [`merge`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservableprototypemergemaxconcurrent--other) operator. If you run the following sample code, you will get 1,1,2,2,3,3. This is because the two sequences are active at the same time and values are pushed out as they occur in the sources. The resultant sequence only completes when the last source sequence has finished pushing values.\n\n```js\nvar source1 = Rx.Observable.range(1, 3);\nvar source2 = Rx.Observable.range(1, 3);\n\nsource1.merge(source2)\n   .subscribe(function (x) { console.log(x); });\n\n// => 1\n// => 1\n// => 2\n// => 2\n// => 3\n// => 3\n```\n\nAnother comparison can be done with the [`catch`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservableprototypecatchsecond--handler) operator. In this case, if source1 completes without any error, then source2 will not start. Therefore, if you run the following sample code, you will get 1,2,3 only since source2 (which produces 4,5,6) is ignored.\n\n```js\nvar source1 = Rx.Observable.range(1, 3);\nvar source2 = Rx.Observable.range(4, 3);\n\nsource1.catch(source2)\n   .subscribe(function (x) { console.log(x); });\n\n// => 1\n// => 2\n// => 3\n```\n\nFinally, let’s look at [`onErrorResumeNext`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservableprototypeonerrorresumenextsecond). This operator will move on to source2 even if source1 cannot be completed due to an error. In the following example, even though source1 represents a sequence that terminates with an exception by using the [`throw`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservablethrowexception-scheduler) operator, the subscriber will receive values (1,2,3) published by source2. Therefore, if you expect either source sequence to produce any error, it is a safer bet to use [`onErrorResumeNext`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservableprototypeonerrorresumenextsecond) to guarantee that the subscriber will still receive some values.\n\n```js\nvar source1 = Rx.Observable.throw(new Error('An error has occurred.'));\nvar source2 = Rx.Observable.range(1, 3);\n\nsource1.onErrorResumeNext(source2)\n   .subscribe(function (x) { console.log(x); });\n\n// => 1\n// => 2\n// => 3\n```\n\n## Projection ##\n\nThe [`select`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservableprototypeselectselector-thisarg) or [`map`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservableprototypemapselector-thisarg) operator can translate each element of an observable sequence into another form.\n\nIn the following example, we project a sequence of strings into an a series of integers representing the length.\n\n```js\nvar array = ['Reactive', 'Extensions', 'RxJS'];\n\nvar seqString = Rx.Observable.from(array);\n\nvar seqNum = seqString.map(function (x) { return x.length; });\n\nseqNum\n   .subscribe(function (x) { console.log(x); });\n\n// => 8\n// => 10\n// => 4\n```\n\nIn the following sample, which is an extension of the event conversion example we saw in the [Bridging with Existing Events](events.md) topic, we use the `select` or `map` operator to project the event arguments to a point of x and y. In this way, we are transforming a mouse move event sequence into a data type that can be parsed and manipulated further, as can be seen in the next \"Filtering\" section.\n\n```js\nvar move = Rx.Observable.fromEvent(document, 'mousemove');\n\nvar points = move.map(function (e) {\n\treturn { x: e.clientX, y: e.clientY };\n});\n\npoints.subscribe(\n\tfunction (pos) {\n\t\tconsole.log('Mouse at point ' + pos.x + ', ' + pos.y);\n\t});\n```\n\nFinally, let’s look at the [`selectMany`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservableprototypeselectmanyselector-resultselector) or [`flatMap`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservableprototypeflatmapselector-resultselector) operator. The `selectMany` or `flatMap` operator has many overloads, one of which takes a selector function argument. This selector function is invoked on every value pushed out by the source observable. For each of these values, the selector projects it into a mini observable sequence. At the end, the `selectMany` or `flatMap` operator flattens all of these mini sequences into a single resultant sequence, which is then pushed to the subscriber.\n\nThe observable returned from `selectMany` or `flatMap` publishes `onCompleted` after the source sequence and all mini observable sequences produced by the selector have completed. It fires `onError` when an error has occurred in the source stream, when an exception was thrown by the selector function, or when an error occurred in any of the mini observable sequences.\n\nIn the following example, we first create a source sequence which produces an integer every 5 seconds, and decide to just take the first 2 values produced (by using the `take` operator). We then use `selectMany` or `flatMap` to project each of these integers using another sequence of {100, 101, 102}. By doing so, two mini observable sequences are produced, {100, 101, 102} and {100, 101, 102}. These are finally flattened into a single stream of integers of {100, 101, 102, 100, 101, 102} and pushed to the observer.\n\n```js\nvar source1 = Rx.Observable.interval(5000).take(2);\nvar proj = Rx.Observable.range(100, 3);\nvar resultSeq = source1.flatMap(proj);\n\nvar subscription = resultSeq.subscribe(\n\tfunction (x) { console.log('onNext: ' + x); },\n\tfunction (e) { console.log('onError: ' + e.message); },\n\tfunction () { console.log('onCompleted'); });\n\n// => onNext: 100\n// => onNext: 101\n// => onNext: 102\n// => onNext: 100\n// => onNext: 101\n// => onNext: 102\n// => onCompleted\n```\n\n## Filtering ##\n\nIn the following example, we use the [`generate`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservablegenerateinitialstate-condition-iterate-resultselector-scheduler) operator to create a simple observable sequence of numbers. The `generate` operator has several versions including with relative and absolute time scheduling. In our example, it takes an initial state (0 in our example), a conditional function to terminate (fewer than 10 times), an iterator (+1), a result selector (a square function of the current value), and prints out only those smaller than 5 using the [`filter`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservableprototypefilterpredicate-thisarg) or [`where`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservableprototypewherepredicate-thisarg) operators.\n\n```js\nvar seq = Rx.Observable.generate(\n\t0,\n\tfunction (i) { return i < 10; },\n\tfunction (i) { return i + 1; },\n\tfunction (i) { return i * i; });\n\nvar source = seq.filter(function (n) { return n < 5; });\n\nvar subscription = source.subscribe(\n\tfunction (x) { console.log('onNext: ' + x); },\n\tfunction (e) { console.log('onError: ' + e.message); },\n\tfunction () { console.log('onCompleted'); });\n\n// => onNext: 0\n// => onNext: 1\n// => onNext: 4\n// => onCompleted\n```\n\nThe following example is an extension of the projection example you have seen earlier in this topic. In that sample, we have used the `select` or `map` operator to project the event arguments into a point with x and y. In the following example, we use the `filter` or `where` and `select` or `map` operator to pick only those mouse movement that we are interested. In this case, we filter the mouse moves to those over the first bisector (where the x and y coordinates are equal).\n\n```js\nvar move = Rx.Observable.fromEvent(document, 'mousemove');\n\nvar points = move.map(function (e) {\n\treturn { x: e.clientX, y: e.clientY };\n});\n\nvar overfirstbisector = points.filter(function (pos) {\n\treturn pos.x === pos.y;\n});\n\nvar movesub = overfirstbisector.subscribe(function (pos) { console.log('mouse at ' + pos.x + ', ' + pos.y); });\n```\n\n## Time-based Operation ##\n\nYou can use the Buffer operators to perform time-based operations.\n\nBuffering an observable sequence means that an observable sequence’s values are put into a buffer based on either a specified timespan or by a count threshold. This is especially helpful in situations when you expect a tremendous amount of data to be pushed out by the sequence, and the subscriber does not have the resource to process these values. By buffering the results based on time or count, and only returning a sequence of values when the criteria is exceeded (or when the source sequence has completed), the subscriber can process OnNext calls at its own pace.\n\nIn the following example, we first create a simple sequence of integers for every second. We then use the `bufferWithCount` operator and specify that each buffer will hold 5 items from the sequence. The `onNext` is called when the buffer is full. We then tally the sum of the buffer using calling `Array.reduce`. The buffer is automatically flushed and another cycle begins. The printout will be 10, 35, 60… in which 10=0+1+2+3+4, 35=5+6+7+8+9, and so on.\n\n```js\nvar seq = Rx.Observable.interval(1000);\n\nvar bufSeq = seq.bufferWithCount(5);\n\nbufSeq\n\t.map(function (arr) { return arr.reduce(function (acc, x) { return acc + x; }, 0); })\n\t.subscribe(function (sum) { console.log(sum); });\n\n// => 10\n// => 35\n// => 60\n...\n```\n\nWe can also create a buffer with a specified time span in milliseconds. In the following example, the buffer will hold items that have accumulated for 3 seconds. The printout will be 3, 12, 21… in which 3=0+1+2, 12=3+4+5, and so on.\n\n```js\nvar seq = Rx.Observable.interval(1000);\n\nvar bufSeq = seq.bufferWithTime(3000);\n\nbufSeq\n\t.map(function (arr) { return arr.reduce(function (acc, x) { return acc + x; }, 0); })\n\t.subscribe(function (sum) { console.log(sum); });\n```\n\nNote that if you are using any of the `buffer*` or `window*` operators, you have to make sure that the sequence is not empty before filtering on it.\n\n## Operators by Categories ##\n\nThe [Operators by Categories](categories.md) topic lists of all major operators implemented by the `Observable` type by their categories; specifically: creation, conversion, combine, functional, mathematical, time, exceptions, miscellaneous, selection and primitives.\n\n## See Also ##\n\n*Reference*\n - [Observable](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md)\n\n*Concepts*\n- [Operators by Categories](categories.md)\n"
  },
  {
    "path": "doc/gettingstarted/schedulers.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Using Schedulers #\n\nA scheduler controls when a subscription starts and when notifications are published. It consists of three components. It is first a data structure. When you schedule for tasks to be completed, they are put into the scheduler for queueing based on priority or other criteria. It also offers an execution context which denotes where the task is executed (e.g. immediately, in the current thread, or in another callback mechanism such as `setTimeout` or `process.nextTick`). Lastly, it has a clock which provides a notion of time for itself (by accessing the `now` method of a scheduler). Tasks being scheduled on a particular scheduler will adhere to the time denoted by that clock only.\n\nSchedulers also introduce the notion of virtual time (denoted by the [`VirtualTimeScheduler`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/schedulers/virtualtimescheduler.md) type), which does not correlate with real time that is used in our daily life. For example, a sequence that is specified to take 100 years to complete can be scheduled to complete in virtual time in a mere 5 minutes. This will be covered in the [Testing and Debugging Observable Sequences](testing.md) topic.\n\n## Scheduler Types ##\n\nThe various Scheduler types provided by Rx all implement the `Scheduler` methods. Each of these can be created and returned by using static properties of the `Scheduler` object. The `ImmediateScheduler` (by accessing the static [`immediate`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/schedulers/scheduler.md#rxschedulerimmediate) property) will start the specified action immediately. The `CurrentThreadScheduler` (by accessing the static [`currentThread`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/schedulers/scheduler.md#rxschedulercurrentthread) property) will schedule actions to be performed on the thread that makes the original call. The action is not executed immediately, but is placed in a queue and only executed after the current action is complete.  The `DefaultScheduler` (by accessing the static [`default`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/schedulers/scheduler.md#rxschedulerdefault) property) will schedule actions to be performed on a asynchronous callback, which is optimized for the particular runtime, such as `setImmediate` or `process.nextTick` on Node.js or in the browser with a fallback to `setTimeout`.\n\n## Using Schedulers ##\n\nYou may have already used schedulers in your Rx code without explicitly stating the type of schedulers to be used. This is because all Observable operators that deal with concurrency have optional schedulers. If you do not provide the scheduler, RxJS will pick a default scheduler by using the principle of least concurrency. This means that the scheduler which introduces the least amount of concurrency that satisfies the needs of the operator is chosen.  For example, for operators returning an observable with a finite and small number of messages, RxJS calls `immediate`.  For operators returning a potentially large or infinite number of messages, `currentThread` is called. For operators which use timers, `default` is used.\n\nBecause RxJS uses the least concurrency scheduler, you can pick a different scheduler if you want to introduce concurrency for performance purpose.  To specify a particular scheduler, you can use those operator methods that take a scheduler, e.g., `return(42, Rx.Scheduler.default)`.\n\nIn the following example, the source observable sequence is producing values at a frantic pace. The default scheduler of the generate operator would place onNext messages on the `currentThread`.\n\n```js\nvar obs = Rx.Observable.generate(\n\t0,\n\tfunction () { return true; },\n\tfunction (x) { return x + 1; },\n\tfunction (x) { return x; });\n```\n\nThis will queue up on the observer quickly. We can improve this code by using the observeOn operator, which allows you to specify the context that you want to use to send pushed notifications (onNext) to observers. By default, the [`observeOn`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/observeon.md) operator ensures that `onNext` will be called as many times as possible on the current thread. You can use its overloads and redirect the `onNext` outputs to a different context. In addition, you can use the [`subscribeOn`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/subscribeon.md) operator to return a proxy observable that delegates actions to a specific scheduler. For example, for a UI-intensive application, you can delegate all background operations to be performed on a scheduler running in the background by using `subscribeOn` and passing to it the `DefaultScheduler`.\n\nThe following example will schedule any onNext notifications on the current Dispatcher, so that any value pushed out is sent on the UI thread. This is especially beneficial to Silverlight developers who use RxJS.\n\n```js\nRx.Observable.generate(\n\t0,\n\tfunction () { return true; },\n\tfunction (x) { return x + 1; },\n\tfunction (x) { return x; }\n\t)\n\t.observeOn(Rx.Scheduler.default)\n\t.subscribe(...);\n```\n\nInstead of using the `observeOn` operator to change the execution context on which the observable sequence produces messages, we can create concurrency in the right place to begin with. As operators parameterize introduction of concurrency by providing a scheduler argument overload, passing the right scheduler will lead to fewer places where the ObserveOn operator has to be used. For example, we can unblock the observer and subscribe to the UI thread directly by changing the scheduler used by the source, as in the following example. In this code, by using the `generate` method passing a scheduler, and providing the `Rx.Scheduler.default` instance, all values pushed out from this observable sequence will originate via an asynchronous callback.\n\n```js\nRx.Observable.generate(\n\t0,\n\tfunction () { return true; },\n\tfunction (x) { return x + 1; },\n\tfunction (x) { return x; },\n\tRx.Scheduler.default)\n\t.subscribe(...);\n```\n\nYou should also note that by using the `observeOn` operator, an action is scheduled for each message that comes through the original observable sequence. This potentially changes timing information as well as puts additional stress on the system. If you have a query that composes various observable sequences running on many different execution contexts, and you are doing filtering in the query, it is best to place `observeOn` later in the query. This is because a query will potentially filter out a lot of messages, and placing the `observeOn` operator earlier in the query would do extra work on messages that would be filtered out anyway. Calling the `observeOn` operator at the end of the query will create the least performance impact.\n\nAnother advantage of specifying a scheduler type explicitly is that you can introduce concurrency for performance purpose, as illustrated by the following code.\n\n```js\nseq.groupBy(...)\n  .map(function (x) { return x.observeOn(Rx.Scheduler.default); })\n  .map(function (x)  { return expensive(x); })  // perform operations that are expensive on resources\n```\n\n## When to Use Which Scheduler ##\n\nTo make things a little easier when you are creating your own operators, or using the standard built-in ones, which scheduler you should use.  The following table lays out each scenario with the suggested scheduler.\n\n<table>\n\t<th>\n\t\tScenario\n\t</th>\n\t<th>\n\t\tScheduler\n\t</th>\n\t<tr>\n\t\t<td>Constant Time Operations</td>\n\t\t<td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/schedulers/scheduler.md#rxschedulerimmediate\">Rx.Scheduler.immediate</a></td>\n\t</tr>\n\t<tr>\n\t\t<td>Tail Recursive Operations</td>\n\t\t<td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/schedulers/scheduler.md#rxschedulerimmediate\">Rx.Scheduler.immediate</a></td>\n\t</tr>\n\t<tr>\n\t\t<td>Iteration Operations</td>\n\t\t<td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/schedulers/scheduler.md#rxschedulercurrentthread\">Rx.Scheduler.currentThread</a></td>\n\t</tr>\n\t<tr>\n\t\t<td>Time-based Operations</td>\n\t\t<td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/schedulers/scheduler.md#rxschedulerdefault\">Rx.Scheduler.default</a></td>\n\t</tr>\n\t<tr>\n\t\t<td>Asynchronous Conversions</td>\n\t\t<td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/schedulers/scheduler.md#rxschedulerdefault\">Rx.Scheduler.default</a></td>\n\t</tr>\n\t<tr>\n\t\t<td>Historical Data Operations</td>\n\t\t<td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/schedulers/historicalscheduler.md\">Rx.HistoricalScheduler</a></td>\n\t</tr>\n\t<tr>\n\t\t<td>Unit Testing</td>\n\t\t<td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/testing/testscheduler.md\">Rx.TestScheduler</a></td>\n\t</tr>\n</table>\n\n## See Also\n\n*Reference*\n- [Testing and Debugging Observable Sequences](testing.md)\n"
  },
  {
    "path": "doc/gettingstarted/subjects.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Using Subjects #\n\nThe [`Subject`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/subject.md) class inherits both [`Observable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md) and [`Observer`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observer.md), in the sense that it is both an observer and an observable. You can use a subject to subscribe all the observers, and then subscribe the subject to a backend data source. In this way, the subject can act as a proxy for a group of subscribers and a source. You can use subjects to implement a custom observable with caching, buffering and time shifting. In addition, you can use subjects to broadcast data to multiple subscribers.\n\nBy default, subjects do not perform any synchronization across threads. They do not take a scheduler but rather assume that all serialization and grammatical correctness are handled by the caller of the subject.  A subject simply broadcasts to all subscribed observers in the thread-safe list of subscribers. Doing so has the advantage of reducing overhead and improving performance.\n\n## Using Subjects ##\n\nIn the following example, we create a subject, subscribe to that subject and then use the same subject to publish values to the observer. By doing so, we combine the publication and subscription into the same source.\n\nIn addition to taking an `Observer`, the [`subscribe`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservableprototypesubscribeobserver--onnext-onerror-oncompleted) method can also take a function for onNext, which means that the action will be executed every time an item is published. In our sample, whenever onNext is invoked, the item will be written to the console.\n\n```js\nvar subject = new Rx.Subject();\n\nvar subscription = subject.subscribe(\n\tfunction (x) { console.log('onNext: ' + x); },\n\tfunction (e) { console.log('onError: ' + e.message); },\n\tfunction () { console.log('onCompleted'); });\n\nsubject.onNext(1);\n// => onNext: 1\n\nsubject.onNext(2);\n// => onNext: 2\n\nsubject.onCompleted();\n// => onCompleted\n\nsubscription.dispose();\n\n```\n\nThe following example illustrates the proxy and broadcast nature of a `Subject`. We first create a source sequence which produces an integer every 1 second. We then create a `Subject`, and pass it as an observer to the source so that it will receive all the values pushed out by this source sequence. After that, we create another two subscriptions, this time with the subject as the source. The `subSubject1` and `subSubject2` subscriptions will then receive any value passed down (from the source) by the `Subject`.\n\n```js\n// Every second\nvar source = Rx.Observable.interval(1000);\n\nvar subject = new Rx.Subject();\n\nvar subSource = source.subscribe(subject);\n\nvar subSubject1 = subject.subscribe(\n\tfunction (x) { console.log('Value published to observer #1: ' + x); },\n\tfunction (e) { console.log('onError: ' + e.message); },\n\tfunction () { console.log('onCompleted'); });\n\nvar subSubject2 = subject.subscribe(\n\tfunction (x) { console.log('Value published to observer #2: ' + x); },\n\tfunction (e) { console.log('onError: ' + e.message); },\n\tfunction () { console.log('onCompleted'); });\n\nsetTimeout(function () {\n\t// Clean up\n\tsubject.onCompleted();\n\tsubSubject1.dispose();\n\tsubSubject2.dispose();\n}, 5000);\n\n// => Value published to observer #1: 0\n// => Value published to observer #2: 0\n// => Value published to observer #1: 1\n// => Value published to observer #2: 1\n// => Value published to observer #1: 2\n// => Value published to observer #2: 2\n// => Value published to observer #1: 3\n// => Value published to observer #2: 3\n// => onCompleted\n// => onCompleted\n\n```\n\n## Different types of Subjects ##\n\nThe `Subject` object in the RxJS library is a basic implementation, but you can create your own using  the [`Subject.create`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/subject.md#rxsubjectcreateobserver-observable) method. There are other implementations of Subjects that offer different functionalities. All of these types store some (or all of) values pushed to them via onNext, and broadcast it back to its observers. In this way, they convert a Cold Observable into a Hot one. This means that if you Subscribe to any of these more than once (i.e. subscribe -> unsubscribe -> subscribe again), you will see at least one of the same value again. For more information on hot and cold observables, see the last section of the [Creating and Subscribing to Simple Observable Sequences](creating.md) topic.\n\n[`ReplaySubject`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/replaysubject.md) stores all the values that it has published. Therefore, when you subscribe to it, you automatically receive an entire history of values that it has published, even though your subscription might have come in after certain values have been pushed out. [`BehaviorSubject`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/behaviorsubject.md) is similar to `ReplaySubject`, except that it only stored the last value it published. `BehaviourSubject` also requires a default value upon initialization. This value is sent to observers when no other value has been received by the subject yet. This means that all subscribers will receive a value instantly on `subscribe`, unless the `Subject` has already completed. [`AsyncSubject`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/asyncsubject.md) is similar to the Replay and Behavior subjects, however it will only store the last value, and only publish it when the sequence is completed. You can use the `AsyncSubject` type for situations when the source observable is hot and might complete before any observer can subscribe to it. In this case, `AsyncSubject` can still provide the last value and publish it to any future subscribers.\n"
  },
  {
    "path": "doc/gettingstarted/testing.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Testing your Rx application #\n\nLet's face it, testing asynchronous code is a pain.  In JavaScript, with so many asynchronous things to coordinate, testing can be tricky. We think you'll find the Reactive Extensions for JavaScript makes it easier.\n\nIf you have an observable sequence that publishes values over an extended period of time, testing it in real time can be a stretch. The RxJS library provides the [`TestScheduler`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/testing/testscheduler.md) type to assist testing this kind of time-dependent code without actually waiting for time to pass. The `TestScheduler` inherits [`VirtualScheduler`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/schedulers/virtualtimescheduler.md) and allows you to create, publish and subscribe to sequences in emulated time. For example, you can compact a publication which takes 5 days to complete into a 2 minute run, while maintaining the correct scale. You can also take a sequence which actually has happened in the past (e.g., a sequence of stock ticks for a previous year) and compute or subscribe to it as if it is pushing out new values in real time.\n\nThe factory methods [`startWithTiming`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/testing/testscheduler.md#rxtestschedulerprototypestartwithtimingcreate-created-subscribed-disposed), [`startWithCreate`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/testing/testscheduler.md#rxtestschedulerprototypestartwithcreatecreate) and [`startWithDispose`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/testing/testscheduler.md#rxtestschedulerprototypestartwithdisposecreate-disposed) executes all scheduled tasks until the queue is empty, or you can specify a time to so that queued-up tasks are only executed to the specified time.\n\nThe following example creates a hot observable sequence with specified `onNext` notifications. It then starts the test scheduler and specifies when to subscribe to and dispose of the hot observable sequence. The Start method returns an instance of an `Observer`, which contains a `messages` property that records all notifications in a list.\n\nAfter the sequence has completed, we can use methods such as `collectionAssert.assertEqual` to compare the `messages` property, together with a list of expected values to see if both are identical (with the same number of items, and items are equal and in the same order). By doing so, we can confirm that we have indeed received the notifications that we expect. In our example, since we only start subscribing at 150, we will miss out the value 'abc'. However, when we compare the values we have received so far at 400, we notice that we have in fact received all the published values after we subscribed to the sequence. And we also verify that the OnCompleted notification was fired at the right time at 500. In addition, subscription information is also captured by the `Observable` type returned by the [`createHotObservable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/testing/testscheduler.md#rxtestschedulerprototypecreatehotobservableargs) method.\n\nIn the same way, you can use that same defined method such as our `collectionAssert.assertEqual` below to confirm that subscriptions indeed happened at expected times.  It is easy to wrap this for your favorite unit testing framework whether it is QUnit, Mocha, Jasmine, etc.  In this example, we'll write a quick wrapper for QUnit.\n\n```js\nfunction createMessage(expected, actual) {\n  return 'Expected: [' + expected.toString() + ']\\r\\nActual: [' + actual.toString() + ']';\n}\n\n// Using QUnit testing for assertions\nvar collectionAssert = {\n  assertEqual: function (actual, expected) {\n    var comparer = Rx.internals.isEqual, isOk = true;\n\n    if (expected.length !== actual.length) {\n      ok(false, 'Not equal length. Expected: ' + expected.length + ' Actual: ' + actual.length);\n      return;\n    }\n\n    for(var i = 0, len = expected.length; i < len; i++) {\n      isOk = comparer(expected[i], actual[i]);\n      if (!isOk) {\n        break;\n      }\n    }\n\n    ok(isOk, createMessage(expected, actual));\n  }\n};\n\nvar onNext = Rx.ReactiveTest.onNext,\n  onCompleted = Rx.ReactiveTest.onCompleted,\n  subscribe = Rx.ReactiveTest.subscribe;\n\ntest('buffer should join strings', function () {\n  var scheduler = new Rx.TestScheduler();\n\n  var input = scheduler.createHotObservable(\n    onNext(100, 'abc'),\n    onNext(200, 'def'),\n    onNext(250, 'ghi'),\n    onNext(300, 'pqr'),\n    onNext(450, 'xyz'),\n    onCompleted(500)\n  );\n\n  var results = scheduler.startScheduler(\n    function () {\n      return input.buffer(function () {\n        return input.debounce(100, scheduler);\n      })\n      .map(function (b) {\n        return b.join(',');\n      });\n    },\n    {\n      created: 50,\n      subscribed: 150,\n      disposed: 600\n    }\n  );\n\n  collectionAssert.assertEqual(results.messages, [\n    onNext(400, 'def,ghi,pqr'),\n    onNext(500, 'xyz'),\n    onCompleted(500)\n  ]);\n\n  collectionAssert.assertEqual(input.subscriptions, [\n    subscribe(150, 500),\n    subscribe(150, 400),\n    subscribe(400, 500)\n  ]);\n});\n```\n\n## Debugging your Rx application ##\n\nYou can use the [`do`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservableprototypedoobserver--onnext-onerror-oncompleted) operator to debug your Rx application. The `do` operator allows you to specify various actions to be taken for each item of observable sequence (e.g., print or log the item, etc.). This is especially helpful when you are chaining many operators and you want to know what values are produced at each level.\n\nIn the following example, we are going to reuse the Buffer example which generates integers every second, while putting them into buffers that can hold 5 items each. In our original example in the [Querying Observable Sequences](querying.md) topic, we subscribe only to the final `Observable` sequence when the buffer is full (and before it is emptied). In this example, however, we will use the `do` operator to print out the values when they are being pushed out by the original sequence (an integer every second). When the buffer is full, we use the `do` operator to print the status, before handing over all this as the final sequence for the observer to subscribe.\n\n```js\nvar seq1 = Rx.Observable.interval(1000)\n  .do(function (x) { console.log(x); })\n  .bufferWithCount(5)\n  .do(function (x) { console.log('buffer is full'); })\n  .subscribe(function (x) { console.log('Sum of the buffer is ' + x.reduce(function (acc, x) { return acc + x; }, 0)); });\n\n// => 0\n// => 1\n// => 2\n// => 3\n// => 4\n// => buffer is full\n// => Sum of the buffer is 10\n// ...\n```\n\nAs you can see from this sample, a subscription is on the recipient end of a series of chained observable sequences. At first, we create an observable sequence of integers separate by a second using the Interval operator. Then, we put 5 items into a buffer using the Buffer operator, and send them out as another sequence only when the buffer is full. Lastly, this is handed over to the Subscribe operator. Data propagate down all these intermediate sequences until they are pushed to the observer. In the same way, subscriptions are propagated in the reverse direction to the source sequence. By inserting the `do` operator in the middle of such propagations, you can \"spy\" on such data flow just like you use console.log  perform debugging.\n\nYou can also use the [`timestamp`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservableprototypetimestampscheduler) operator to verify the time when an item is pushed out by an observable sequence. This can help you troubleshoot time-based operations to ensure accuracy. Recall the following example from the [Creating and Subscribing to Simple Observable Sequences](creating.md) topic, in which we chain the `timestamp` operator to the query so that each value pushed out by the source sequence will be appended by the time when it is published. By doing so, when we subscribe to this source sequence, we can receive both its value and timestamp.\n\n```js\nconsole.log('Current time: ' + Date.now());\n\nvar source = Rx.Observable.timer(5000, 1000)\n  .timestamp();\n\nvar subscription = source.subscribe(function (x) {\n  console.log(x.value + ': ' + x.timestamp);\n});\n\n/* Output will look similar to this */\n// => Current time: 1382646947400\n// => 0: 1382646952400\n// => 1: 1382646953400\n// => 2: 1382646954400\n// => 3: 1382646955400\n// => 4: 1382646956400\n// => 5: 1382646957400\n// => 6: 1382646958400\n```\n\nBy using the `timestamp` operator, we have verified that the first item is indeed pushed out 5 seconds after the sequence, and each item is published 1 second later.\n\nYou can remove any `do` and `map` or `select` calls after you finish debugging.\n\n## Long Stack Traces Support\n\nWhen dealing with large RxJS applications, debugging and finding where the error occurred can be a difficult operation. As you chain more and more operators together, the longer the stack trace gets, and the harder it is to find out where things went wrong. Inspiration for this feature came from the [Q library](https://github.com/kriskowal/q) from [@kriskowal](https://github.com/kriskowal) which helped us get started.\n\nRxJS comes with optional support for \"long stack traces\" where the stack property of Error from onError calls is rewritten to be traced along asynchronous jumps instead of stopping at the most recent one. As an example:\n```js\nvar Rx = require('rx');\n\nvar source = Rx.Observable.range(0, 100)\n  .timestamp()\n  .map(function (x) {\n    if (x.value > 98) throw new Error();\n    return x;\n  });\n\nsource.subscribeOnError(\n  function (err) {\n    console.log(err.stack);\n  });\n```\nThe error stack easily becomes unreadable and hard to find where the error actually occurred:\n```bash\n$ node example.js\n\n  Error\n  at C:\\GitHub\\example.js:6:29\n  at AnonymousObserver._onNext (C:\\GitHub\\rxjs\\dist\\rx.all.js:4013:31)\n  at AnonymousObserver.Rx.AnonymousObserver.AnonymousObserver.next (C:\\GitHub\\rxjs\\dist\\rx.all.js:1863:12)\n  at AnonymousObserver.Rx.internals.AbstractObserver.AbstractObserver.onNext (C:\\GitHub\\rxjs\\dist\\rx.all.js:1795:35)\n  at AutoDetachObserverPrototype.next (C:\\GitHub\\rxjs\\dist\\rx.all.js:9226:23)\n  at AutoDetachObserver.Rx.internals.AbstractObserver.AbstractObserver.onNext (C:\\GitHub\\rxjs\\dist\\rx.all.js:1795:35)\n  at AnonymousObserver._onNext (C:\\GitHub\\rxjs\\dist\\rx.all.js:4018:18)\n  at AnonymousObserver.Rx.AnonymousObserver.AnonymousObserver.next (C:\\GitHub\\rxjs\\dist\\rx.all.js:1863:12)\n  at AnonymousObserver.Rx.internals.AbstractObserver.AbstractObserver.onNext (C:\\GitHub\\rxjs\\dist\\rx.all.js:1795:35)\n  at AutoDetachObserverPrototype.next (C:\\GitHub\\rxjs\\dist\\rx.all.js:9226:23)\n```\nInstead, we can turn on this feature by setting the following flag:\n```js\nRx.config.longStackSupport = true;\n```\nWhen running the same example again with the flag set at the top, our stack trace looks much nicer and indicates exactly where the error occurred:\n```bash\n$ node example.js\n\n  Error\n  at C:\\GitHub\\example.js:6:29\n  From previous event:\n  at Object.<anonymous> (C:\\GitHub\\example.js:3:28)\n  From previous event:\n  at Object.<anonymous> (C:\\GitHub\\example.js:4:4)\n  From previous event:\n  at Object.<anonymous> (C:\\GitHub\\example.js:5:4)\n```\n\nNow, it is more clear that the error did occur exactly at line 6 with throwing an error and only shows the user code in this point. This is very helpful for debugging, as otherwise you end up getting only the first line, plus a bunch of RxJS internals, with no sign of where the operation started.\n\nThis feature does come with a serious performance and memory overhead, however, If you're working with lots of RxJS code, or trying to scale a server to many users, you should probably keep it off. In development, this is perfectly fine for finding those pesky errors!\n\nIn a future release, we may also release support for a node.js environment variable so that you can set it and unset it fairly easily.\n\n## See Also ##\n\n**Concepts**\n- [Creating and Subscribing to Simple Observable Sequences](creating.md)\n- [Querying Observable Sequences](querying.md)\n- [Using Schedulers](schedulers.md)\n"
  },
  {
    "path": "doc/gettingstarted/transducers.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Transducers with Observable Sequences #\n\nMuch like Language Integrated Query (LINQ), Transducers are composable algorithmic transformations. They, like LINQ, are independent from the context of their input and output sources and specify only the essence of the transformation in terms of an individual element. Because transducers are decoupled from input or output sources, they can be used in many different processes - collections, streams, observables, etc. Transducers compose directly, without awareness of input or creation of intermediate aggregates.  There are two major libraries currently out there, Cognitect's [`transducer-js`](https://github.com/cognitect-labs/transducers-js) and James Long's [`transducers.js`](https://github.com/jlongster/transducers.js) which are both great for getting high performance over large amounts of data.  Because it is collection type neutral, it is a perfect fit for RxJS to do transformations over large collections.\n\nThe word `transduce` is just a combination of `transform` and `reduce`. The reduce function is the base transformation; any other transformation can be expressed in terms of it (`map`, `filter`, etc).\n```js\nvar arr = [1, 2, 3, 4];\n\narr.reduce(\n  function(result, x) { return result.concat(x + 1); }, []);\n\n// => [ 2, 3, 4, 5 ]\n```\n\nUsing transducers, we can model the following behavior while breaking apart the map aspect of adding 1 to the concat operation, adding the seed and then the \"collection\" to transduce.\n\n```js\nvar arr = [1, 2, 3, 4];\n\nfunction increment(x) { return x + 1; }\nfunction concatItem(acc, x) { return acc.concat(x); }\n\ntransduce(map(increment), concatItem, [], arr);\n\n// => [ 2, 3, 4, 5 ]\n```\n\nUsing Cognitect's [`transducers-js`](https://github.com/cognitect-labs/transducers-js) library, we can easily accomplish what we had above.  \n\n```js\nvar t = transducers;\n\nvar arr = [1, 2, 3, 4];\n\nfunction increment(x) { return x + 1; }\n\ninto([], t.comp(t.map(increment)), arr);\n\n// => [ 2, 3, 4, 5 ]\n```\n\nWe can go a step further and add filtering as well to get only even values.\n\n```js\nvar t = transducers;\n\nvar arr = [1, 2, 3, 4];\n\nfunction increment(x) { return x + 1; }\nfunction isEven(x) { return x % 2 === 0; }\n\ninto([], t.comp(t.map(increment), t.filter(isEven)), arr);\n\n// => [ 2, 4 ]\n```\n\nSince it works so well using Arrays, there's no reason why it cannot work for Observable sequences as well.  To that end, we have introduced the [`transduce`](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/api/core/operators/transduce.md) method which acts exactly like it does for Arrays, but for Observable sequences.  Once again, let's go over the above example, this time using an Observable sequence.\n\n```js\nvar t = transducers;\n\nvar source = Rx.Observable.range(1, 4);\n\nfunction increment(x) { return x + 1; }\nfunction isEven(x) { return x % 2 === 0; }\n\nvar transduced = source.transduce(t.comp(t.map(increment), t.filter(isEven)));\n\ntransduced.subscribe(\n  function (x) { console.log('Next: %s', x); },\n  function (e) { console.log('Error: %s', e); },\n  function ()  { console.log('Completed'); });\n\n// => Next: 2\n// => Next: 4\n// => Completed\n```\n\nNote that this above example also works the same with `transducers.js` as well with little to no modification.  This example will in fact work faster than the traditional LINQ style (as of now) which most use currently.\n\n```js\nvar source = Rx.Observable.range(1, 4);\n\nfunction increment(x) { return x + 1; }\nfunction isEven(x) { return x % 2 === 0; }\n\nvar transduced = source.map(increment).filter(isEven);\n\ntransduced.subscribe(\n  function (x) { console.log('Next: %s', x); },\n  function (e) { console.log('Error: %s', e); },\n  function ()  { console.log('Completed'); });\n\n// => Next: 2\n// => Next: 4\n// => Completed\n```\n\nThis opens up a wide new set of possibilities making RxJS even faster over large collections with no intermediate Observable sequences.\n"
  },
  {
    "path": "doc/gettingstarted/what.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# What are the Reactive Extensions for JavaScript (RxJS)? #\n\nThe Reactive Extensions for JavaScript (RxJS) is a library for composing asynchronous and event-based programs using observable sequences and [LINQ-style query operators](http://en.wikipedia.org/wiki/LINQ). Using RxJS, developers *__represent__* asynchronous data streams with [Observables](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md), *__query__* asynchronous data streams using [LINQ operators](http://msdn.microsoft.com/en-us/library/hh242983.aspx), and *__parameterize__* the concurrency in the asynchronous data streams using [Schedulers](http://msdn.microsoft.com/en-us/library/hh242963.aspx). Simply put, Rx = Observables + LINQ + Schedulers.\n\nWhether you are authoring a web-based application or server-side applications with [Node.js](http://nodejs.org), you have to deal with asynchronous and event-based programming constantly. Web applications and Node.js applications have I/O operations and computationally expensive tasks that might take a long time to complete and potentially block the main thread. Furthermore, handling exceptions, cancellation, and synchronization is difficult and error-prone.\n\nUsing RxJS, you can represent multiple asynchronous data streams (that come from diverse sources, e.g., stock quote, tweets, computer events, web service requests, etc.), and subscribe to the event stream using the `Observer` object. The `Observable` object notifies the subscribed `Observer` object whenever an event occurs.\n\nBecause observable sequences are data streams, you can query them using standard query operators implemented by the Observable extension methods. Thus you can filter, project, aggregate, compose and perform time-based operations on multiple events easily by using these standard query operators. In addition, there are a number of other reactive stream specific operators that allow powerful queries to be written.  Cancellation, exceptions, and synchronization are also handled gracefully by using the extension methods provided by Rx.\n\nRxJS complements and interoperates smoothly with both synchronous data streams such as Arrays, Sets and Maps and single-value asynchronous computations such as Promises as the following diagram shows:\n\n<table>\n   <th></th><th>Single return value</th><th>Mutiple return values</th>\n   <tr>\n      <td>Pull/Synchronous/Interactive</td>\n      <td>Object</td>\n      <td>Iterables (Array | Set | Map | Object)</td>\n   </tr>\n   <tr>\n      <td>Push/Asynchronous/Reactive</td>\n      <td>Promise</td>\n      <td>Observable</td>\n   </tr>\n</table>\n\n## Pushing vs. Pulling Data ##\n\nIn interactive programming, the application actively polls a data source for more information by retrieving data from a sequence that represents the source. Such behavior is represented by the iterator pattern of JavaScript Arrays, Objects, Sets, Maps, etc. In interactive programming, one must get the next item by either getting an item by an index in an Array, or through [ES6 iterators](http://wiki.ecmascript.org/doku.php?id=harmony:iterators).\n\nThe application is active in the data retrieval process: it decides about the pace of the retrieval by calling `next` at its own convenience. This enumeration pattern is synchronous, which means your application might be blocked while polling the data source. Such pulling pattern is similar to visiting your library and checking out a book. After you are done with the book, you pay another visit to check out another one.\n\nOn the other hand, in reactive programming, the application is offered more information by subscribing to a data stream (called observable sequence in RxJS), and any update is handed to it from the source. The application is passive in the data retrieval process: apart from subscribing to the observable source, it does not actively poll the source, but merely react to the data being pushed to it. When the event has completed, the source will send a notice to the subscriber. In this way, your application will not be blocked by waiting for the source to update.\nThis is the push pattern employed by Reactive Extensions for JavaScript. This is similar to joining a book club in which you register your interest in a particular genre, and books that match your interest are automatically sent to you as they are published. You do not need to stand in a line to acquire something that you want. Employing a push pattern is especially helpful in heavy UI environment in which the UI thread cannot be blocked while the application is waiting for some events, which is essential in JavaScript environments which has its own set of asynchronous requirements. In summary, by using RxJS, you can make your application more responsive.\n\nThe push model implemented by Rx is represented by the observable pattern of `Observable`/`Observer`. The `Observable` will notify all the observers automatically of any state changes. To register an interest through a subscription, you use the `subscribe` method of `Observable`, which takes on an `Observer` and returns a `Disposable` object. This gives you the ability to track your subscription and be able to dispose the subscription. You can essentially treat the observable sequence (such as a sequence of mouseover events) as if it were a normal collection. RxJS’s built-in query implementation over observable sequences allows developers to compose complex event processing queries over push-based sequences such as events, callbacks, Promises,  HTML5 Geolocation APIs, and much much more.. For more information on these two interfaces, see [Exploring The Major Concepts in RxJS](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/exploring.md).\n"
  },
  {
    "path": "doc/gettingstarted/which-instance.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Which Operator to Use? - Instance Operators #\n\nUse this page to find the instance operator implemented by the [`Observable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md) type that fits your needs:\n\n<table>\n<thead>Instance methods</thead>\n<tbody>\n    <!-- Observable operators -->\n    <tr>\n        <td rowspan=\"71\">Using an existing sequence</td>\n        <td colspan=\"3\">I want to change each value</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/select.md\">map/select</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"3\">I want to pull a property off each value</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/pluck.md\">pluck</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"3\">I want to be notified of values without affecting them</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/do.md\">do/tap</a><br>\n            <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/doonnext.md\">doOnNext/tapOnNext</a><br>\n            <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/doonerror.md\">doOnError/tapOnError</a><br>\n            <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/dooncompleted.md\">doOnCompleted/tapOnCompleted</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"6\">I want to include values</td>\n        <td colspan=\"2\">based on custom logic</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/where.md\">filter/where</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">from the start of the sequence</td>\n        <td></td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/take.md\">take</a></td>\n    </tr>\n    <tr>\n        <td>based on custom logic</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/takewhile.md\">takeWhile</a></td>\n    </tr>\n    <tr>\n    </tr>\n    <tr>\n        <td colspan=\"2\">from the end of the sequence</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/takelast.md\">takeLast</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">until another sequence emits a value or completes</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/takeuntil.md\">takeUntil</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"7\">I want to ignore values</td>\n        <td colspan=\"2\">altogether</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/ignoreelements.md\">ignoreElements</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">from the start of the sequence</td>\n        <td></td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/skip.md\">skip</a></td>\n    </tr>\n    <tr>\n        <td>based on custom logic</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/skipwhile.md\">skipWhile</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">from the end of the sequence</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/skiplast.md\">skipLast</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">until another sequence emits a value</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/skipuntil.md\">skipUntil</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">that have the same value as the previous</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/distinctuntilchanged.md\">distinctUntilChanged</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">that occur too frequently</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/throttle.md\">throttle</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"4\">I want to compute</td>\n        <td>the sum</td>\n        <td rowspan=\"2\">of its values</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sum.md\">sum</a></td>\n    </tr>\n    <tr>\n        <td>the average</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/average.md\">average</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">using custom logic</td>\n        <td>and only output the final value</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/aggregate.md\">aggregate</a><br>\n            <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/reduce.md\">reduce</a>\n        </td>\n    </tr>\n    <tr>\n        <td>and output the values as they are calculated</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/scan.md\">scan</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"3\">I want to wrap its messages with metadata</td>\n        <td colspan=\"2\">that describes each message</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/materialize.md\">materialize</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">that includes the time past since the last value</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/timeinterval.md\">timeInterval</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">that includes a timestamp</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/timestamp.md\">timestamp</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">after a period of inactivity</td>\n        <td colspan=\"2\">I want to throw an error</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/timeout.md\">timeout</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">I want to switch to another sequence</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/timeout.md\">timeout</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">I want ensure there is only one value</td>\n        <td colspan=\"2\">and throw an error if there are more or less than one value</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/single.md\">single</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">and use the default value if there are no values</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/singleordefault.md\">singleOrDefault</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"3\">I want to only take the first value</td>\n        <td colspan=\"2\">and throw an error if there are no values</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/first.md\">first</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">and use the default value if there are no values</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/firstordefault.md\">firstOrDefault</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">within a time period</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sample.md\">sample</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">I want to only take the last value</td>\n        <td colspan=\"2\">and error if there are no values</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/last.md\">last</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">and use the default value if there are no values</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/lastordefault.md\">lastOrDefault</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"3\">I want to know how many values it contains</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/count.md\">count</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"3\">I want to know if it includes a value</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/includes.md\">contains</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">I want to know if a condition is satisfied</td>\n        <td colspan=\"2\">by any of its values</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/some.md\">some</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">by all of its values</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/every.md\">all/every</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\" colspan=\"2\">I want to delay messages by a specific amount of time</td>\n        <td></td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/delay.md\">delay</a></td>\n    </tr>\n    <tr>\n        <td>based on custom logic</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/delaywithselector.md\">delayWithSelector</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"11\">I want to group the values</td>\n        <td colspan=\"2\">until the sequence completes</td>\n        <td>\n          <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/toarray.md\">toArray</a><br>\n          <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/tomap.md\">toMap</a><br>\n          <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/toset.md\">toSet</a>\n        </td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">using custom logic</td>\n        <td>as arrays</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/buffer.md\">buffer</a></td>\n    </tr>\n    <tr>\n        <td>as sequences</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/window.md\">window</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">in batches of a particular size</td>\n        <td>as arrays</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/bufferwithcount.md\">bufferWithCount</a></td>\n    </tr>\n    <tr>\n        <td>as sequences</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/windowwithcount.md\">windowWithCount</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">based on time</td>\n        <td>as arrays</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/bufferwithtime.md\">bufferWithTime</a></td>\n    </tr>\n    <tr>\n        <td>as sequences</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/windowwithtime.md\">windowWithTime</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">based on time or count, whichever happens first</td>\n        <td>as arrays</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/bufferwithtimeorcount.md\">bufferWithTimeOrCount</a></td>\n    </tr>\n    <tr>\n        <td>as sequences</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/windowwithtimeorcount.md\">windowWithTimeOrCount</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">based on a key</td>\n        <td>until the sequence completes</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/groupby.md\">groupBy</a></td>\n    </tr>\n    <tr>\n        <td>and control the lifetime of each group</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/groupbyuntil.md\">groupByUntil</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"6\">I want to start a new sequence for each value</td>\n        <td colspan=\"2\">and emit the values from all sequences in parallel</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/selectmany.md\">flatMap/selectMany</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">and emit the values from each sequence in order</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/concatmap.md\">concatMap/selectConcat</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">and cancel the previous sequence when a new value arrives</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/flatmaplatest.md\">flatMapLatest/selectSwitch</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">and recursively start a new sequence for each new value</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/expand.md\">expand</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">and emit values from all sequences depending for onNext, onError, and onCompleted in parallel</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/flatmapobserver.md\">flatMapObserver/selectManyObserver</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">and emit values from all sequences depending for onNext, onError, and onCompleted in order</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/flatmapobserver.md\">concatMapObserver/selectConcatObserver</a></td>\n    </tr>\n    <tr>\n        <td>I want to combine it with another</td>\n        <td colspan=\"2\">And be notified when both have completed</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/forkjoin.md\">forkJoin</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"3\">I want to perform complex operations without breaking the fluent calls</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/let.md\">let</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"5\">I want to share a subscription between multiple subscribers</td>\n        <td colspan=\"2\">using a specific subject implementation</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/multicast.md\">multicast</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\"></td>\n        <td>\n          <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/publish.md\">publish</a><br>\n          <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/share.md\">share</a>\n        </td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">and suppy the last value to future subscribers</td>\n        <td>\n          <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/publishlast.md\">publishLast</a><br>\n          <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sharelast.md\">shareLast</a>\n        </td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">and replay a default or the latest value to future subscribers</td>\n        <td>\n          <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/publishvalue.md\">publishValue</a><br>\n          <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sharevalue.md\">shareValue</a>\n        </td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">and replay <em>n</em> number of values to future subscribers</td>\n        <td>\n          <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/replay.md\">replay</a><br>\n          <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sharereplay.md\">shareReplay</a>\n        </td>\n    </tr>\n    <tr>\n        <td rowspan=\"3\">when an error occurs</td>\n        <td colspan=\"2\">I want to re-subscribe</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/retry.md\">retry</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">I want to start a new sequence</td>\n        <td></td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/catchproto.md\">catch</a></td>\n    </tr>\n    <tr>\n        <td>that depends on the error</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/catchproto.md\">catch</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">when it completes</td>\n        <td colspan=\"2\">I want to re-subscribe</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/repeatproto.md\">repeat</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">I want to start a new sequence</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/concatproto.md\">concat</a></td>\n    </tr>\n    <tr>\n        <td>when it completes or errors</td>\n        <td colspan=\"2\">I want to start a new sequence</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/onerrorresumenextproto.md\">onErrorResumeNext</a></td>\n    </tr>\n    <tr>\n        <td>when it completes, errors or unsubscribes</td>\n        <td colspan=\"2\">I want to execute a function</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/finally.md\">finally</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">I want to change the scheduler that routes</td>\n        <td colspan=\"2\">calls to subscribe</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/subscribeon.md\">subscribeOn</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">messages</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/observeon.md\">observeOn</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"9\">Using two sequences</td>\n        <td>I want to decide which to receive values from</td>\n        <td colspan=\"2\">based on which one has values first</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/ambproto.md\">amb</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"3\">I want to determine if their values are equal</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sequenceequal.md\">sequenceEqual</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"5\">I want to combine their values</td>\n        <td colspan=\"2\">only when the first sequence emits, using the latest value from each</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/withlatestfrom.md\">withLatestFrom</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">in order</td>\n        <td>reusing the latest value when unchanged</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/combinelatestproto.md\">combineLatest</a></td>\n    </tr>\n    <tr>\n        <td>using each value only once</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/zipproto.md\">zip</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">that share overlapping “lifetime” that I choose</td>\n        <td>and be notified for each combination</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/join.md\">join</a></td>\n    </tr>\n    <tr>\n        <td>and be given a sequence of “rights” for each “left”</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/groupjoin.md\">groupJoin</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"3\">I want to include values from both</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/mergeproto.md\">merge</a></td>\n    </tr>\n</tbody></table>\n\n## See Also ##\n\n*Reference*\n - [`Observable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md)\n\n*Concepts*\n- [Querying Observable Sequences](querying.md)\n- [Operators By Category](categories.md)\n"
  },
  {
    "path": "doc/gettingstarted/which-static.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Which Operator to Use? - Creation Operators #\n\nUse this page to find the creation operator implemented by the [`Observable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md) type that fits your needs:\n\n<table>\n<thead>Static methods</thead>\n<tbody>\n    <!-- Observable factories -->\n    <tr>\n        <td rowspan=\"26\">I want to create a new sequence</td>\n        <td rowspan=\"4\">using custom logic</td>\n        <td colspan=\"2\"></td>\n        <td>\n            <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/create.md\">Observable.create</a>\n        </td>\n    </tr>\n    <tr>\n        <td rowspan=\"3\">that works like a for-loop</td>\n        <td></td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/generate.md\">Observable.generate</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">and emits the values over time</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/generatewithrelativetime.md\">Observable.generateWithRelativeTime</a></td>\n    </tr>\n    <tr>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/generatewithabsolutetime.md\">Observable.generateWithAbsoluteTime</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">that returns a value</td>\n        <td colspan=\"2\"></td>\n        <td>\n            <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/return.md\">Observable.return/just</a>\n        </td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">multiple times</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/repeat.md\">Observable.repeat</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"3\">that throws an error</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/throw.md\">Observable.throw</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"3\">that completes</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/empty.md\">Observable.empty</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"3\">that never does anything</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/never.md\">Observable.never</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">from an event</td>\n        <td colspan=\"2\"></td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromevent.md\">Observable.fromEvent</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">that uses custom functions to add and remove event handlers</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromeventpattern.md\">Observable.fromEventPattern</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"3\">from an <a title=\"ES6 Promise\" href=\"https://www.promisejs.org\">ES6 Promise</a></td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/frompromise.md\">Observable.fromPromise</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"6\">that iterates</td>\n        <td rowspan=\"2\">over the values in an array</td>\n        <td></td>\n        <td>\n            <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromarray.md\">Observable.fromArray</a><br>\n        </td>\n    </tr>\n    <tr>\n      <td>of object key/values</td>\n      <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/pairs.md\">Observable.pairs</a></td>\n    </tr>\n    <tr>\n        <td>of asynchronous elements</td>\n        <td></td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/for.md\">Observable.for</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">over values in a numeric range</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/range.md\">Observable.range</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">over the values in an iterable, array or array-like object</a></td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/from.md\">Observable.from</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">over arguments</a></td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/of.md\">Observable.of</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">that emits values on a timer</td>\n        <td colspan=\"2\"></td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/interval.md\">Observable.interval</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">with an optional initial delay</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/timer.md\">Observable.timer</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\" colspan=\"2\">that calls a function with no arguments</td>\n        <td>on a specific scheduler</td>\n        <td>\n            <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/start.md\">Observable.start</a>\n        </td>\n    </tr>\n    <tr>\n        <td>asynchronously</td>\n        <td>\n            <a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/startasync.md\">Observable.startAsync</a>\n        </td>\n    </tr>\n    <tr>\n        <td rowspan=\"4\">decided at subscribe-time</td>\n        <td colspan=\"2\">based on a boolean condition</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/if.md\">Observable.if</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">from a pre-set set of sequences</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/case.md\">Observable.case</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"1\" rowspan=\"2\">using custom logic</td>\n        <td></td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/defer.md\">Observable.defer</a></td>\n    </tr>\n    <tr>\n        <td>that depends on a resource</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/using.md\">Observable.using</a></td>\n    </tr>\n    <!-- Function factories -->\n    <tr>\n        <td rowspan=\"3\">I want to wrap a function</td>\n        <td colspan=\"2\"></td>\n        <td rowspan=\"3\">and yield the result in a sequence</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/toasync.md\">Observable.toAsync</a></td>\n    </tr>\n        <td colspan=\"2\">which accepts a callback</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromcallback.md\">Observable.fromCallback</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">which accepts a Node.js callback</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromnodecallback.md\">Observable.fromNodeCallback</a></td>\n    </tr>\n    <!-- Flatteners -->\n    <tr>\n        <td rowspan=\"30\">I want to combine multiple sequences</td>\n        <td colspan=\"3\">and only receive values from the sequence that yields a value first</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/amb.md\">Observable.amb</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"3\">and be notified when all of them have finished</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/forkjoin.md\">Observable.forkJoin</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"3\">and output the values from all of them</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/merge.md\">Observable.merge</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"2\">in order</td>\n        <td colspan=\"2\">reusing the latest value when unchanged</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/combinelatest.md\">Observable.combineLatest</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">using each value only once</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/zip.md\">Observable.zip</a></td>\n    </tr>\n    <tr>\n        <td rowspan=\"3\">by subscribing to each in order</td>\n        <td colspan=\"2\">when the previous sequence completes</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/concat.md\">Observable.concat</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">when the previous sequence errors</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/catch.md\">Observable.catch</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"2\">regardless of whether the previous sequence completes or errors</td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/onerrorresumenext.md\">Observable.onErrorResumeNext</a></td>\n    </tr>\n    <tr>\n        <td colspan=\"3\">by responding to different combinations of values <a href=\"http://en.wikipedia.org/wiki/Join-calculus\">(join calculus)</a></td>\n        <td><a href=\"https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/when.md\">Observable.when</a></td>\n    </tr>\n</tbody></table>\n\n## See Also ##\n\n*Reference*\n - [`Observable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md)\n\n*Concepts*\n- [Querying Observable Sequences](querying.md)\n- [Operators By Category](categories.md)\n"
  },
  {
    "path": "doc/howdoi/angular.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# How do I integrate Angular.js with RxJS? #\n\n[AngularJS](http://angularjs.org/) is a popular MV* framework for JavaScript which covers things such as data binding, controllers as well as things such as dependency injection.  The Reactive Extensions for JavaScript plays well with this framework, and in fact has a dedicated library for interop called [rx.angular.js](https://github.com/Reactive-Extensions/rx.angular.js).  However, if you don't wish to use that, here are some simple ways you can integrate the two together.\n\n## Integration with Scopes\n\nThe [`scope`](http://docs.angularjs.org/api/ng.$rootScope.Scope) is an object that refers to the application model. It is an execution context for expressions. Scopes are arranged in hierarchical structure which mimic the DOM structure of the application. Scopes can watch expressions and propagate events.\n\nScopes provide the ability to observe change mutations on the scope through the [`$watch`](http://docs.angularjs.org/api/ng.$rootScope.Scope#methods_$watch) method.  This is a perfect opportunity to integrate the power of the Reactive Extensions for JavaScript with Angular.  Let's look at a typical usage of `$watch`.\n\n```js\n// Get the scope from somewhere\nvar scope = $rootScope;\nscope.name = 'Reactive Extensions';\nscope.counter = 0;\n\nscope.$watch('name', function(newValue, oldValue) {\n  scope.counter = scope.counter + 1;\n  scope.oldValue = oldValue;\n  scope.newValue = newValue;\n});\n\n// Process All the Watchers\nscope.$digest();\n\n// See the counter increment\nconsole.log(counter);\n// => 1\n```\n\nUsing the Reactive Extensions for JavaScript, we're able to easily bind to this by wrapping the `$watch` as an observable.  To do this, we'll create an observable sequence using `Rx.Observable.create` which gives us an observer to yield to.  In this case, we'll capture both the old and new values through our listener function.  The `$watch` function returns a function, which when called, ceases the watch expression.\n\n```js\nRx.Observable.$watch = function (scope, watchExpression, objectEquality) {\n\treturn Rx.Observable.create(function (observer) {\n\t\t// Create function to handle old and new Value\n\t\tfunction listener (newValue, oldValue) {\n\t\t\tobserver.onNext({ oldValue: oldValue, newValue: newValue });\n\t\t}\n\n\t\t// Returns function which disconnects the $watch expression\n\t\treturn scope.$watch(watchExpression, listener, objectEquality);\n\t});\n};\n```\n\nNow that we have this, we're able to now take the above example and now add some RxJS goodness to it.\n\n```js\n// Get the scope from somewhere\nvar scope = $rootScope;\nscope.name = 'Reactive Extensions';\nscope.isLoading = false;\nscope.data = [];\n\n// Watch for name change and throttle it for 1 second and then query a service\nRx.Observable.$watch(scope, 'name')\n\t.throttle(1000)\n\t.map(function (e) {\n\t\treturn e.newValue;\n\t})\n\t.do(function () {\n\t\t// Set loading and reset data\n\t\tscope.isLoading = true;\n\t\tscope.data = [];\n\t})\n\t.flatMapLatest(querySomeService)\n\t.subscribe(function (data) {\n\n\t\t// Set the data\n\t\tscope.isLoading = false;\n\t\tscope.data = data;\n\t});\n```\n\n## Integration with Deferred/Promise Objects\n\nAngularJS ships a promise/deferred implementation based upon [Kris Kowal's Q](https://github.com/kriskowal/q) called the [`$q`](http://docs.angularjs.org/api/ng.$q) service.  Promises are quite useful in scenarios with one and done asynchronous operations such as querying a service through the [`$http`](http://docs.angularjs.org/api/ng.$http) service.\n\n```js\n$http.get('/someUrl')\n\t.then(successCallback, errCallback);\n```\n\nUsing the Reactive Extensions for JavaScript, we can also integrate using the `Rx.Observable.fromPromise` bridge available in RxJS version 2.2+.  We simply\n\n```js\n// Query data\nvar observable = Rx.Observable.fromPromise(\n\t$http({\n\t\tmethod: 'GET',\n\t\turl: 'someurl',\n\t\tparams: { searchString: $scope.searchString }\n\t})\n);\n\n// Subscribe to data and update UI\nobservable.subscribe(\n\tfunction (data) {\n\t\t$scope.data = data;\n\t},\n\tfunction (err) {\n\t\t$scope.error = err.message;\n\t}\n);\n```\n\nThese are just only the beginnings of what you can do with the Reactive Extensions for JavaScript and AngularJS.\n"
  },
  {
    "path": "doc/howdoi/createcustomoperators.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Creating Your Own Custom Operators\n\nFinal Result\n\n```js\n\n```\n"
  },
  {
    "path": "doc/howdoi/eventemitter.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# How do I create a custom event emitter? #\n\nPublish/Subscribe is a common pattern within JavaScript applications.  The idea is that you have a publisher that emits events and you have consumers which register their interest in a given event.  Typically you may see something like the following where you listen for a 'data' event and then the event emitter publishes data to it.\n\n```js\nvar emitter = new Emitter();\n\nfunction logData(data) {\n\tconsole.log('data: ' + data);\n}\n\nemitter.on('data', logData);\n\nemitter.emit('data', 'foo');\n// => data: foo\n\n// Destroy handler\nemitter.off('data', logData);\n```\n\nHow might one implement this using the Reactive Extensions for JavaScript?  Using an `Rx.Subject` will solve this problem easily.  As you may remember, an `Rx.Subject` is both an Observer and Observable, so it handles both publish and subscribe.\n\n```js\nvar subject = new Rx.Subject();\n\nvar subscription = subject.subscribe(function (data) {\n\tconsole.log('data: ' + data);\n});\n\nsubject.onNext('foo');\n// => data: foo\n```\n\nNow that we have a basic understanding of publish and subscribe through `onNext` and `subscribe`, let's put it to work to handle multiple types of events at once.  First, we'll create an Emitter class which has three main methods, `emit`, `on` and `off` which allows you to emit an event, listen to an event and stop listening to an event.\n\n```js\nvar hasOwnProp = {}.hasOwnProperty;\n\nfunction createName (name) {\n\treturn '$' + name;\n}\n\nfunction Emitter() {\n\tthis.subjects = {};\n}\n\nEmitter.prototype.emit = function (name, data) {\n\tvar fnName = createName(name);\n\tthis.subjects[fnName] || (this.subjects[fnName] = new Rx.Subject());\n\tthis.subjects[fnName].onNext(data);\n};\n\nEmitter.prototype.on = function (name, handler) {\n\tvar fnName = createName(name);\n\tthis.subjects[fnName] || (this.subjects[fnName] = new Rx.Subject());\n\tthis.subjects[fnName].subscribe(handler);\n};\n\nEmitter.prototype.off = function (name, handler) {\n\tvar fnName = createName(name);\n\tif (this.subjects[fnName]) {\n\t\tthis.subjects[fnName].dispose();\n\t\tdelete this.subjects[fnName];\n\t}\n};\n\nEmitter.prototype.dispose = function () {\n\tvar subjects = this.subjects;\n\tfor (var prop in subjects) {\n\t\tif (hasOwnProp.call(subjects, prop)) {\n\t\t\tsubjects[prop].dispose();\n\t\t}\n\t}\n\n\tthis.subjects = {};\n};\n```\n\nThen we can use it much as we did above.  As the call to `subscribe` returns a subscription, we might want to hand that back to the user instead of providing an off method.  So, we could rewrite the above where we call the `on` method to `listen` and we return a subscription handle to the user to stop listening.\n\n```js\nvar hasOwnProp = {}.hasOwnProperty;\n\nfunction createName (name) {\n\treturn '$' + name;\n}\n\nfunction Emitter() {\n\tthis.subjects = {};\n}\n\nEmitter.prototype.emit = function (name, data) {\n\tvar fnName = createName(name);\n\tthis.subjects[fnName] || (this.subjects[fnName] = new Rx.Subject());\n\tthis.subjects[fnName].onNext(data);\n};\n\nEmitter.prototype.listen = function (name, handler) {\n\tvar fnName = createName(name);\n\tthis.subjects[fnName] || (this.subjects[fnName] = new Rx.Subject());\n\treturn this.subjects[fnName].subscribe(handler);\n};\n\nEmitter.prototype.dispose = function () {\n\tvar subjects = this.subjects;\n\tfor (var prop in subjects) {\n\t\tif (hasOwnProp.call(subjects, prop)) {\n\t\t\tsubjects[prop].dispose();\n\t\t}\n\t}\n\n\tthis.subjects = {};\n};\n```\n\nNow we can use this to rewrite our example such as the following:\n\n```js\nvar emitter = new Emitter();\n\nvar subcription = emitter.listen('data', function (data) {\n\tconsole.log('data: ' + data);\n});\n\nemitter.emit('data', 'foo');\n// => data: foo\n\n// Destroy the subscription\nsubscription.dispose();\n```\n"
  },
  {
    "path": "doc/howdoi/jquery.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# How do I work with jQuery and RxJS #\n\nThe [jQuery](http://jquery.com) project and RxJS play very well together as libraries.  In fact, we supply bindings directly for RxJS to jQuery should you want to wrap animations, events, Ajax calls and more using Observables in [RxJS-jQuery](https://github.com/Reactive-Extensions/RxJS-jQuery).  The bindings library provides many handy features for bridging the world to Observables.  If you're interested in that library, go ahead and use it.\n\n## Using RxJS with Rx-jQuery ##\n\nGetting started with the bindings is easy.  Each method is enumerated on the main page from the jQuery method to its RxJS counterpart.\n\n```html\n<div id=\"results\"></div>\n<script src=\"http://code.jquery.com/jquery-1.9.1.js\"></script>\n<script src=\"rx.js\"></script>\n<script src=\"rx.binding.js\"></script>\n<script src=\"rx.jquery.js\"></script>\n```\n\nNow we can start using the bindings!  For example, we can listen to a `click` event and then by using `flatMap` or `selectMap` we can animate by calling `animateAsObservable`.  Finally, we can subscribe to cause the side effect and nothing more.\n\n```js\n$( \"#go\" ).clickAsObservable().flatMap(function () {\n\n\treturn $( \"#block\" ).animateAsObservable({\n\t\twidth: \"70%\",\n\t\topacity: 0.4,\n\t\tmarginLeft: \"0.6in\",\n\t\tfontSize: \"3em\",\n\t\tborderWidth: \"10px\"\n\t}, 1500 );\n}).subscribe();\n```\n\n## Using RxJS with jQuery ##\n\nLet's start though by assuming you just have RxJS and wanted to get started with jQuery without the bridge library.  There is already plenty you can do without even needing a bridge library with the support built in for events and promises.\n\n### Binding to an event ###\n\nUsing RxJS with jQuery to bind to an event using plain old RxJS is easy.  For example, we could bind to the `mousemove` event from the DOM document easily.\n\nFirst, we'll reference the files we need.\n\n```html\n<div id=\"results\"></div>\n<script src=\"http://code.jquery.com/jquery-1.9.1.js\"></script>\n<script src=\"rx.js\"></script>\n<script src=\"rx.async.js\"></script>\n<script src=\"rx.binding.js\"></script>\n```\n\n```js\nvar observable = Rx.Observable.fromEvent(\n\t$(document),\n\t'mousemove');\n\nvar subscription = observable.subscribe(function (e) {\n\t$('#results').text(e.clientX + ',' + e.clientY);\n});\n```\n\nWe could go a step further and create our own jQuery plugin which handles events with ease.\n\n```js\n/**\n * Creates an observable sequence by adding an event listener to the matching jQuery element\n *\n * @param {String} eventName The event name to attach the observable sequence.\n * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n */\njQuery.fn.toObservable = function (eventName, selector) {\n\treturn Rx.Observable.fromEvent(this, eventName, selector);\n};\n```\n\nNow we could rewrite our above example such as this.\n\n```js\nvar observable = $(document).toObservable('mousemove');\n\nvar subscription = observable.subscribe(function (e) {\n\t$('#results').text(e.clientX + ',' + e.clientY);\n});\n```\n\n### Using RxJS with Ajax calls ###\n\nBridging to jQuery Ajax calls using [`$.ajax`](http://api.jquery.com/jQuery.ajax/) is easy as well with the built-in [Promises A+](https://github.com/promises-aplus/promises-spec) support.  Since jQuery 1.5, the `$.ajax` method has implemented a promise interface (even if not 100% pure) which allows us to bridge to an observable sequence via the `Rx.Observable.fromPromise` method.\n\nFor example, we could query Wikipedia by calling the `$.ajax` method and then calling the [`promise`](http://api.jquery.com/deferred.promise/) method which then exposes the minimum promise interface needed.\n\n```js\nfunction searchWikipedia (term) {\n    var promise = $.ajax({\n        url: 'http://en.wikipedia.org/w/api.php',\n        dataType: 'jsonp',\n        data: {\n            action: 'opensearch',\n            format: 'json',\n            search: encodeURI(term)\n        }\n    }).promise();\n    return Rx.Observable.fromPromise(promise);\n}\n```\n\nOnce we created the wrapper, we can query the service by getting the text and then using `flatMapLatest` to ensure we have no out of order results.\n\n```js\n$('#input').toObservable('keyup')\n\t.map(function (e) { return e.target.value; })\n\t.flatMapLatest(searchWikipedia)\n\t.subscribe(function (data) {\n\n\t\tvar results = data[1];\n\n\t\t$.each(results, function (_, result) {\n\t\t\t// Do something with each result\n\t\t});\n\n\t});\n```\n\n### Using RxJS with Callbacks to Handle Simple Animations ###\n\nRxJS can also be used to bind to simple callbacks, such as the [`.animate()`](http://api.jquery.com/animate/) method.  We can use `Rx.Observable.fromCallback` to supply the required arguments with the last argument is to be the callback.  In this example, we'll take the animation example from above and use nothing but core RxJS to accomplish the same thing.\n\nYou'll note that we need a notion of `this` for the `block.animate` to properly work, so we have two choices, either use `Function.prototype.bind` available in most modern browsers...\n\n```js\nvar animate = Rx.Observable.fromCallback(block.animate.bind(block));\n```\n\nOr we can supply an optional argument which supplies the context to the callback such as the following...\n\n```js\nvar animate = Rx.Observable.fromCallback(\n\tblock.animate,\n\tnull, /* default scheduler used */\n\tblock /* context */);\n```\n\nWhen viewed in its entirety, it will look like this where we call `flatMap` or `selectMany` to compose together two observable sequences.  We then bind to the `animate` function through `Rx.Observable.fromCallback` and then return the observable which results from the function execution.  Our `subscribe` does nothing in this case as there is nothing to print or do, and is simply a side effect.\n\n```js\nvar block = $('#block');\n\n$('#go').toObservable('click').flatMap(function () {\n    var animate = Rx.Observable.fromCallback(block.animate.bind(block));\n\n    return animate({\n        width: \"70%\",\n        opacity: 0.4,\n        marginLeft: \"0.6in\",\n        fontSize: \"3em\",\n        borderWidth: \"10px\"\n    }, 1500);\n}).subscribe();\n```\n"
  },
  {
    "path": "doc/howdoi/wrap.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# Wrap an Existing API with RxJS\n\nOne question that often comes up is how can I wrap an existing API into an Observable sequence?  The answer is fairly simple and not a lot of lines of code to make that happen.\n\nTo make this a bit more concrete, let's take a familiar HTML5 API like [Geolocation API](http://dev.w3.org/geo/api/spec-source.html), in particular, the `navigator.geolocation.watchPosition` method.\n\nThe typical use of this method might be the following where we would hook up an event handler to listen for success and errors on watching the geolocation by using the `navigator.geolocation.watchPosition` method.  When one wishes to terminate listening for geolocation updates, you simply call the `navigator.geolocation.clearWatch` method passing in the watch ID returned from the `watchPosition` method.\n\n```js\nfunction watchPositionChanged(e) {\n\t// Do something with the coordinates\n}\n\nfunction watchPositionError(e) {\n\t// Handle position error\n}\n\nvar watchId = navigator.geolocation.watchPosition(\n\twatchPositionChanged,\n\twatchPositionError);\n\nvar stopWatching = document.querySelector('#stopWatching');\nstopWatching.addEventListener('click', stopWatchingClicked, false);\n\n// Clear watching upon click\nfunction stopWatchingClicked(e) {\n\tnavigator.geolocation.clearWatch(watchId)\n}\n```\n\nIn order to wrap this, we'll need to use the [`Rx.Observable.create`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservablecreatesubscribe) method.  From this, we can yield values to the observer or handle the errors.  Let's see how the code might look, creating a watchPosition method which takes geolocation options.\n\n```js\nfunction watchPosition(geolocationOptions) {\n    return Rx.Observable.create(function (observer) {\n        var watchId = window.navigator.geolocation.watchPosition(\n            function successHandler (loc) {\n                observer.onNext(loc);\n            },\n            function errorHandler (err) {\n                observer.onError(err);\n            },\n            geolocationOptions);\n\n        return function () {\n            window.navigator.geolocation.clearWatch(watchId);\n        };\n    });\n }\n```\n\nWe need to also be aware of ensuring we're not adding too many watchPosition calls as we compose it together with other observable sequences.  To do that, we'll need to utilize the [`publish`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#rxobservableprototypepublishselector) and [`refCount`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md#connectableobservableprototyperefcount) methods from rx.binding.js.\n\nOur final result should look like the following:\n\n```js\nfunction watchPosition(geolocationOptions) {\n    return Rx.Observable.create(function (observer) {\n        var watchId = window.navigator.geolocation.watchPosition(\n            function successHandler (loc) {\n                observer.onNext(loc);\n            },\n            function errorHandler (err) {\n                observer.onError(err);\n            },\n            geolocationOptions);\n\n        return function () {\n            window.navigator.geolocation.clearWatch(watchId);\n        };\n    }).publish().refCount();\n }\n```\n\nAnd now we can consume the geolocation such as:\n\n```js\nvar source = watchPosition();\n\nvar subscription = source.subscribe(\n    function (position) {\n        console.log('Next:' + position.coords.latitude + ',' + position.coords.longitude);\n    },\n    function (err) {\n        var message = '';\n        switch (err.code) {\n            case err.PERMISSION_DENIED:\n                message = 'Permission denied';\n                break;\n            case err.POSITION_UNAVAILABLE:\n                message = 'Position unavailable';\n                break;\n            case err.PERMISSION_DENIED_TIMEOUT:\n                message = 'Position timeout';\n                break;\n        }\n        console.log('Error: ' + message);\n    },\n    function () {\n        console.log('Completed');\n    });\n```\n"
  },
  {
    "path": "doc/libraries/core/rx.core.binding.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Core Binding Module #\n\nThe Reactive Extensions for JavaScript has a notion of hot and cold observables.  Hot observables fire whether you are listening to them or not, such as mouse movements.  Cold observables on the other hand, such as a sequence created from an array will fire the same sequence to all subscribers.  The Core Binding module gives you the ability to replay events for hot observables, and to turn cold observables into hot observables.  The primary use case is for those who are implementing libraries compatible with RxJS to be able to handle hot and cold observables.\n\n## Details ##\n\nFiles:\n- [`rx.core.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.core.binding.js)\n\nNPM Packages:\n- [`rx-core-binding`](https://www.npmjs.com/package/rx-core-binding)\n\nNuGet Packages:\n- _None_\n\nFile Dependencies:\n- [`rx.core.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.core.js)\n\nNuGet Dependencies:\n- _None_\n\n## Included Observable Operators ##\n\n### `Observable Instance Methods`\n- [`connect`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/connect.md)\n- [`publish`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/publish.md)\n- [`publishLast`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/publishlast.md)\n- [`publishValue`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/publishvalue.md)\n- [`refCount`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/refcount.md)\n- [`replay`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/replay.md)\n- [`share`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/share.md)\n- [`shareLast`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sharelast.md)\n- [`shareReplay`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sharereplay.md)\n- [`shareValue`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sharevalue.md)\n- [`singleInstance`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/singleinstance.md)\n\n## Included Classes ##\n\n### Subjects\n\n- [`Rx.AsyncSubject`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/asyncsubject.md)\n- [`Rx.Subject`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/subject.md)\n- [`Rx.BehaviorSubject`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.mdapi/subjects/behaviorsubject.md)\n- [`Rx.ReplaySubject`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.mdapi/subjects/replaysubject.md)\n"
  },
  {
    "path": "doc/libraries/core/rx.core.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Core Module #\n\nThe Reactive Extensions for JavaScript's core functionality for conforming to the RxJS contract can be found here.  This module contains only the bare essentials including Disposables, Schedulers, Observer and Observable.  This is made available with the `rx.core.js` file.  The primary use case for this file is for those who want to implement a minimal implementation of RxJS for their own usage.\n\n## Details ##\n\nFiles:\n- [`rx.core.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.core.js)\n\nNPM Packages:\n- [`rx-core`](https://www.npmjs.com/package/rx-core)\n\nNuGet Packages:\n- _None_\n\n## Included Classes ##\n\n### Core Objects\n\n- [`Rx.Observer`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observer.md)\n- [`Rx.Observable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md)\n\n### `Observable Methods`\n- [`create`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/create.md)\n\n### Schedulers\n\n- [`Rx.Scheduler`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/schedulers/scheduler.md)\n\n### Disposables\n\n- [`Rx.CompositeDisposable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/disposables/compositedisposable.md)\n- [`Rx.Disposable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/disposables/disposable.md)\n- [`Rx.SerialDisposable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/disposables/serialdisposable.md)\n- [`Rx.SingleAssignmentDisposable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/disposables/singleassignmentdisposable.md)\n"
  },
  {
    "path": "doc/libraries/core/rx.core.testing.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Core Testing Module #\n\nThe Reactive Extensions for JavaScript has a built-in mechanism for testing all operators which allows for mocking absolute and relative time with ease for use with `rx.core.js` and `rx.core.binding.js`\n\n## Details ##\n\nFiles:\n- [`rx.testing.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.core.testing.js)\n\nNPM Packages:\n- [`rx-core-testing`](https://www.npmjs.com/package/rx-core-testing)\n\nNuGet Packages:\n- _None_\n\nFile Dependencies:\n- [`rx.core.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.core.js)\n\nNuGet Dependencies:\n- _None_\n\n## Included Classes ##\n\n### Core Objects\n\n- [`Rx.Notification`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/notification.md)\n\n### Schedulers\n\n- [`Rx.TestScheduler`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/testing/testscheduler.md)\n- [`Rx.VirtualTimeScheduler`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/schedulers/virtualtimescheduler.md)\n\n### Testing Classes\n\n- [`Rx.ReactiveTest`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/testing/reactivetest.md)\n- [`Rx.Recorded`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/testing/recorded.md)\n- [`Rx.Subscription`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/testing/subscription.md)\n"
  },
  {
    "path": "doc/libraries/lite/rx.lite.aggregates.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Lite Aggregates Module #\n\nThe Reactive Extensions for JavaScript has a number of aggregation operators including those you might already know from the Array#extras and the upcoming ES6 standard such as `reduce`, `find` and `findIndex`.  This module is used exclusively for aggregation operations used on finite observable sequences.  In addition to the aforementioned operators, there are many useful operators such as `count`, `sum`, `average` and determining whether two sequences are equal via the `sequenceEqual` method.  This module is designed to work with the `rx-lite` NPM module for both the standards-compliant version as well as compat for older browsers.\n\n## Details ##\n\nFiles:\n- [`rx.lite.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/modules/rx-lite-aggregates/rx.lite.aggregates.js)\n[`rx.lite.aggregates.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/modules/rx-lite-aggregates-compat/rx.lite.aggregates.compat.js)\n\nNPM Packages:\n- [`rx-lite-aggregates`](https://www.npmjs.org/package/rx)\n\nFile Dependencies:\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\n## Included Observable Operators ##\n\n### `Observable Instance Methods`\n- [`aggregate`](../../api/core/operators/reduce.md)\n- [`all`](../../api/core/operators/every.md)\n- [`any`](../../api/core/operators/some.md)\n- [`average`](../../api/core/operators/average.md)\n- [`includes`](../../api/core/operators/includes.md)\n- [`count`](../../api/core/operators/count.md)\n- [`elementAt`](../../api/core/operators/elementat.md)\n- [`every`](../../api/core/operators/every.md)\n- [`find`](../../api/core/operators/find.md)\n- [`findIndex`](../../api/core/operators/findindex.md)\n- [`first`](../../api/core/operators/first.md)\n- [`indexOf`](../../api/core/operators/indexof.md)\n- [`isEmpty`](../../api/core/operators/isempty.md)\n- [`last`](../../api/core/operators/last.md)\n- [`lastIndexOf`](../../api/core/operators/lastindexof.md)\n- [`max`](../../api/core/operators/max.md)\n- [`maxBy`](../../api/core/operators/maxby.md)\n- [`min`](../../api/core/operators/min.md)\n- [`minBy`](../../api/core/operators/minby.md)\n- [`reduce`](../../api/core/operators/reduce.md)\n- [`sequenceEqual`](../../api/core/operators/sequenceequal.md)\n- [`single`](../../api/core/operators/single.md)\n- [`slice`](../../api/core/operators/slice.md)\n- [`some`](../../api/core/operators/some.md)\n- [`sum`](../../api/core/operators/sum.md)\n- [`toMap`](../../api/core/operators/tomap.md)\n- [`toSet`](../../api/core/operators/toset.md)\n"
  },
  {
    "path": "doc/libraries/lite/rx.lite.async.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Lite Async Module #\n\nThe Reactive Extensions for JavaScript provides support for using generators with RxJS, as well as starting async methods or turning functions into async functions. This module is designed to work with the `rx-lite` NPM module for both the standards-compliant version as well as compat for older browsers.\n\n## Details ##\n\nFiles:\n- [`rx.lite.async.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/modules/rx-lite-async/rx.lite.async.js)\n[`rx.lite.async.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/modules/rx-lite-async-compat/rx.lite.async.compat.js)\n\nNPM Packages:\n- [`rx-lite-async`](https://www.npmjs.org/package/rx-lite-async)\n- [`rx-lite-async-compat`](https://www.npmjs.org/package/rx-lite-async-compat)\n\nFile Dependencies:\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`spawn`](../../api/core/operators/spawn.md)\n- [`start`](../../api/core/operators/start.md)\n- [`startAsync`](../../api/core/operators/startasync.md)\n- [`toAsync`](../../api/core/operators/toasync.md)\n"
  },
  {
    "path": "doc/libraries/lite/rx.lite.coincidence.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Lite Coincidence Module #\n\nThe Reactive Extensions for JavaScript has a set of coincidence-based operators such as `join` and `groupJoin` which allow one to correlate two observable sequences much as you would do in SQL.  There is also support for advanced windowing and bufferring capabilities which allow for the specification of opening and closing observable sequences to denote how much data to capture. This module is designed to work with the `rx-lite` NPM module for both the standards-compliant version as well as compat for older browsers.\n\n## Details ##\n\nFiles:\n- [`rx.lite.coincidence.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/modules/rx-lite-coincidence/rx.lite.coincidence.js)\n- [`rx.lite.coincidence.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/modules/rx-lite-coincidence-compat/rx.lite.coincidence.compat.js)\n\nNPM Packages:\n- [`rx-lite-coincidence`](https://www.npmjs.org/package/rx-lite-coincidence)\n- [`rx-lite-coincidence-compat`](https://www.npmjs.org/package/rx-lite-coincidence-compat)\n\nFile Dependencies:\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\n## Included Observable Operators ##\n\n## `Observable Instance Methods`\n- [`buffer`](../../api/core/operators/buffer.md)\n- [`groupBy`](../../api/core/operators/groupby.md)\n- [`groupByUntil`](../../api/core/operators/groupbyuntil.md)\n- [`groupJoin`](../../api/core/operators/groupjoin.md)\n- [`join`](../../api/core/operators/join.md)\n- [`pairwise`](../../api/core/operators/pairwise.md)\n- [`partition`](../../api/core/operators/partition.md)\n- [`window`](../../api/core/operators/window.md)\n"
  },
  {
    "path": "doc/libraries/lite/rx.lite.experimental.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Lite Experimental Module #\n\nThe Reactive Extensions for JavaScript has a number of operators that are considered experimental and not ready for mainstream usage.  This includes imperative operators such as `if`, `case`, `for`, `while`, `doWhile` as well as operators such as `forkJoin`. This module is designed to work with the `rx-lite` NPM module for both the standards-compliant version as well as compat for older browsers.\n\n## Details ##\n\nFiles:\n- [`rx.lite.experimental.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/modules/rx-lite-experimental/rx.lite.experimental.js)\n- [`rx.lite.experimental.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/modules/rx-lite-experimental-compat/rx.lite.experimental.compat.js)\n\nNPM Packages:\n- [`rx-lite-experimental`](https://www.npmjs.org/package/rx-lite-experimental)\n- [`rx-lite-experimental-compat`](https://www.npmjs.org/package/rx-lite-experimental-compat)\n\nFile Dependencies:\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`case`](../../api/core/operators/case.md)\n- [`for`](../../api/core/operators/for.md)\n- [`forkJoin`](../../api/core/operators/forkjoin.md)\n- [`if`](../../api/core/operators/if.md)\n- [`while`](../../api/core/operators/while.md)\n\n### `Observable Instance Methods`\n- [`doWhile`](/api/core/operators/dowhile.md)\n- [`expand`](../../api/core/operators/expand.md)\n- [`extend`](../../api/core/operators/manyselect.md)\n- [`flatMapFirst`](../../api/core/operators/flatmapfirst.md)\n- [`flatMapWithMaxConcurrent`](../../api/core/flatmapwithmaxconcurrent.md)\n- [`forkJoin`](../../api/core/operators/forkjoinproto.md)\n- [`let`](../../api/core/operators/let.md)\n- [`manySelect`](../../api/core/operators/manyselect.md)\n- [`selectSwitchFirst`](../../api/core/operators/flatmapfirst.md)\n- [`selectWithMaxConcurrent`](../../api/core/operators/flatmapwithmaxconcurrent.md)\n"
  },
  {
    "path": "doc/libraries/lite/rx.lite.extras.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Lite Extras #\n\nThe Reactive Extensions for JavaScript's lite extras are the operators that are found on `rx.js` and `rx.compat.js` but not available in `rx.lite.js` and `rx.lite.compat.js`.  By adding this file, you will have full access to all operators and thus makes including other files such as `rx.time.js`, `rx.joinpatterns.js` and others easier.\n\n## Details ##\n\nFiles:\n- [`rx.lite.extras.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.extras.js)\n\nNPM Packages:\n- [`rx-lite-extras`](https://www.npmjs.org/package/rx-lite-extras)\n\nNuGet Packages:\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nFile Dependencies:\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`amb`](../../api/core/operators/amb.md)\n- [`generate`](../../api/core/operators/generate.md)\n- [`onErrorResumeNext`](../../api/core/operators/onerrorresumenext.md)\n- [`using`](../../api/core/operators/using.md)\n\n### `Observable Instance Methods`\n- [`amb`](../../api/core/operators/ambproto.md)\n- [`bufferWithCount`](../../api/core/operators/bufferwithcount.md)\n- [`distinct`](../../api/core/operators/distinct.md)\n- [`observeOn`](../../api/core/operators/observeon.md)\n- [`onErrorResumeNext`](../../api/core/operators/onerrorresumenext.md)\n- [`subscribeOn`](../../api/core/operators/subscribeon.md)\n- [`takeLastBuffer`](../../api/core/operators/takelastbuffer.md)\n- [`windowWithCount`](../../api/core/operators/windowwithcount.md)\n"
  },
  {
    "path": "doc/libraries/lite/rx.lite.joinpatterns.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Lite Join Patterns Module #\n\nThe Reactive Extensions for JavaScript also supports join calculus in that you can easily create patterns for when certain observable sequences fire. This module is designed to work with the `rx-lite` NPM module for both the standards-compliant version as well as compat for older browsers.\n\n## Details ##\n\nFiles:\n- [`rx.lite.joinpatterns.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/modules/rx-lite-joinpatterns/rx.lite.joinpatterns.js)\n- \n[`rx.lite.joinpatterns.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/modules/rx-lite-joinpatterns-compat/rx.lite.joinpatterns.compat.js)\n\nNPM Packages:\n- [`rx-lite-joinpatterns`](https://www.npmjs.org/package/rx-lite-joinpatterns)\n- [`rx-lite-joinpatterns-compat`](https://www.npmjs.org/package/rx-lite-joinpatterns-compat)\n\nFile Dependencies:\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`when`](../../api/core/operators/when.md)\n\n### `Observable Instance Methods`\n- [`and`](../../api/core/operators/and.md)\n\n### `Pattern Instance Methods`\n- [`thenDo`](../../api/core/operators/thendo.md)\n"
  },
  {
    "path": "doc/libraries/lite/rx.lite.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Lite Module #\n\nThe Reactive Extensions for JavaScript Lite version is a lightweight version of the Reactive Extensions for JavaScript which covers most of the day to day operators you might use all in a single library.  Functionality such as bridging to events, promises, callbacks, Node.js-style callbacks, time-based operations and more are built right in.\n\nThis comes with both `rx.lite.js` which is for use in modern development environments such as > IE9 and server-side environments such as Node.js.  We also have `rx.lite.compat.js` which has backwards compatibility to browsers which do not support all required ES5 features.\n\n## Details ##\n\nFiles:\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx-lite`](https://www.npmjs.org/package/rx-lite)\n\nNuGet Packages:\n- [`RxJS-Lite`](https://www.nuget.org/packages/RxJS-Lite/)\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`catch`](../../api/core/operators/catch.md)\n- [`concat`](../../api/core/operators/concat.md)\n- [`create`](../../api/core/operators/create.md)\n- [`defer`](../../api/core/operators/defer.md)\n- [`empty`](../../api/core/operators/empty.md)\n- [`from`](../../api/core/operators/from.md)\n- [`fromArray`](../../api/core/operators/fromarray.md)\n- [`fromCallback`](../../api/core/operators/fromcallback.md)\n- [`fromEvent`](../../api/core/operators/fromevent.md)\n- [`fromEventPattern`](../../api/core/operators/fromeventpattern.md)\n- [`fromNodeCallback`](../../api/core/operators/fromnodecallback.md)\n- [`fromPromise`](../../api/core/operators/frompromise.md)\n- [`interval`](../../api/core/operators/interval.md)\n- [`just`](../../api/core/operators/return.md)\n- [`merge`](../../api/core/operators/merge.md)\n- [`mergeDelayError`](../../api/core/operators/mergedelayerror.md)\n- [`never`](../../api/core/operators/never.md)\n- [`of`](../../api/core/operators/of.md)\n- [`ofWithScheduler`](../../api/core/operators/ofwithscheduler.md)\n- [`pairs`](../../api/core/operators/pairs.md)\n- [`range`](../../api/core/operators/range.md)\n- [`repeat`](../../api/core/operators/repeat.md)\n- [`return`](../../api/core/operators/return.md)\n- [`throw`](../../api/core/operators/throw.md)\n- [`timer`](../../api/core/operators/timer.md)\n- [`zip`](../../api/core/operators/zip.md)\n\n### `Observable Instance Methods`\n- [`asObservable`](../../api/core/operators/asobservable.md)\n- [`catch`](../../api/core/operators/catchproto.md)\n- [`combineLatest`](../../api/core/operators/combinelatest.md)\n- [`concat`](../../api/core/operators/concatproto.md)\n- [`concatMap`](../../api/core/operators/concatmap.md)\n- [`connect`](../../api/core/operators/connect.md)\n- [`debounce`](../../api/core/operators/debounce.md)\n- [`defaultIfEmpty`](../../api/core/operators/defaultifempty.md)\n- [`delay`](../../api/core/operators/delay.md)\n- [`dematerialize`](../../api/core/operators/dematerialize.md)\n- [`distinctUntilChanged`](../../api/core/operators/distinctuntilchanged.md)\n- [`do`](../../api/core/operators/do.md)\n- [`doOnNext`](../../api/core/operators/doonnext.md)\n- [`doOnError`](../../api/core/operators/doonerror.md)\n- [`doOnCompleted`](../../api/core/operators/dooncompleted.md)\n- [`filter`](../../api/core/operators/where.md)\n- [`finally`](../../api/core/operators/finally.md)\n- [`flatMap`](../../api/core/operators/selectmany.md)\n- [`flatMapLatest`](../../api/core/operators/flatmaplatest.md)\n- [`ignoreElements`](../../api/core/operators/ignoreelements.md)\n- [`map`](../../api/core/operators/select.md)\n- [`merge`](../../api/core/operators/mergeproto.md)\n- [`mergeAll`](../../api/core/operators/mergeall.md)\n- [`multicast`](../../api/core/operators/multicast.md)\n- [`publish`](../../api/core/operators/publish.md)\n- [`publishLast`](../../api/core/operators/publishlast.md)\n- [`publishValue`](../../api/core/operators/publishvalue.md)\n- [`refCount`](../../api/core/operators/refcount.md)\n- [`repeat`](../../api/core/operators/repeat.md)\n- [`repeatWhen`](../../api/core/operators/repeatwhen.md)\n- [`replay`](../../api/core/operators/replay.md)\n- [`retry`](../../api/core/operators/retry.md)\n- [`retryWhen`](../../api/core/operators/retrywhen.md)\n- [`sample`](../../api/core/operators/sample.md)\n- [`scan`](../../api/core/operators/scan.md)\n- [`select`](../../api/core/operators/select.md)\n- [`selectConcat`](../../api/core/operators/concatmap.md)\n- [`selectMany`](../../api/core/operators/selectmany.md)\n- [`selectSwitch`](../../api/core/operators/flatmaplatest.md)\n- [`singleInstance`](../../api/core/operators/singleinstance.md)\n- [`skip`](../../api/core/operators/skip.md)\n- [`skipLast`](../../api/core/operators/skiplast.md)\n- [`skipUntil`](../../api/core/operators/skipuntil.md)\n- [`skipWhile`](../../api/core/operators/skipwhile.md)\n- [`startWith`](../../api/core/operators/startwith.md)\n- [`subscribe | forEach`](../../api/core/operators/subscribe.md)\n- [`subscribeOnNext`](../../api/core/operators/subscribeonnext.md)\n- [`subscribeOnError`](../../api/core/operators/subscribeonerror.md)\n- [`subscribeOnCompleted`](../../api/core/operators/subscribeoncompleted.md)\n- [`switch | switchLatest`](../../api/core/operators/switch.md)\n- [`take`](../../api/core/operators/take.md)\n- [`takeLast`](../../api/core/operators/takelast.md)\n- [`takeUntil`](../../api/core/operators/takeuntil.md)\n- [`takeWhile`](../../api/core/operators/takewhile.md)\n- [`tap`](../../api/core/operators/do.md)\n- [`tapOnNext`](../../api/core/operators/doonnext.md)\n- [`tapOnError`](../../api/core/operators/doonerror.md)\n- [`tapOnCompleted`](../../api/core/operators/dooncompleted.md)\n- [`throttle`](../../api/core/operators/throttle.md)\n- [`timeout`](../../api/core/operators/timeout.md)\n- [`timestamp`](../../api/core/operators/timestamp.md)\n- [`toArray`](../../api/core/operators/toarray.md)\n- [`toPromise`](../../api/core/operators/topromise.md)\n- [`transduce`](../../api/core/operators/transduce.md)\n- [`where`](../../api/core/operators/where.md)\n- [`withLatestFrom`](../../api/core/operators/withlatestfrom.md)\n- [`zip`](../../api/core/operators/zipproto.md)\n- [`zipIterable`](../../api/core/operators/zipiterable.md)\n\n## Included Classes ##\n\n### Core Objects\n- [`Rx.Observer`](../../api/core/observer.md)\n- [`Rx.Notification`](../../api/core/notification.md)\n\n### Subjects\n\n- [`Rx.AsyncSubject`](../../api/subjects/asyncsubject.md)\n- [`Rx.BehaviorSubject`](../../api/subjects/behaviorsubject.md)\n- [`Rx.ReplaySubject`](../../api/subjects/replaysubject.md)\n- [`Rx.Subject`](../../api/subjects/subject.md)\n\n### Schedulers\n\n- [`Rx.Scheduler`](../../api/schedulers/scheduler.md)\n\n### Disposables\n\n- [`Rx.CompositeDisposable`](../../api/disposables/compositedisposable.md)\n- [`Rx.Disposable`](../../api/disposables/disposable.md)\n- [`Rx.RefCountDisposable`](../../api/disposables/refcountdisposable.md)\n- [`Rx.SerialDisposable`](../../api/disposables/serialdisposable.md)\n- [`Rx.SingleAssignmentDisposable`](../../api/disposables/singleassignmentdisposable.md)\n"
  },
  {
    "path": "doc/libraries/lite/rx.lite.testing.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Lite Testing Module #\n\nThe Reactive Extensions for JavaScript has a built-in mechanism for testing all operators which allows for mocking absolute and relative time with ease. This module is designed to work with the `rx-lite` NPM module for both the standards-compliant version as well as compat for older browsers.\n\n## Details ##\n\nFiles:\n- [`rx.lite.testing.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/modules/rx-lite-testing/rx.lite.testing.js)\n- [`rx.lite.testing.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/modules/rx-lite-testing-compat/rx.lite.testing.compat.js)\n\nNPM Packages:\n- [`rx-lite-testing`](https://www.npmjs.org/package/rx-lite-testing)\n- [`rx-lite-testing-compat`](https://www.npmjs.org/package/rx-lite-testing-compat)\n\nFile Dependencies:\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\n## Included Classes ##\n\n### Testing Classes\n\n- [`Rx.ReactiveTest`](../../api/testing/reactivetest.md)\n- [`Rx.Recorded`](../../api/testing/recorded.md)\n- [`Rx.Subscription`](../../api/testing/subscription.md)\n- [`Rx.TestScheduler`](../../api/testing/testscheduler.md)\n"
  },
  {
    "path": "doc/libraries/lite/rx.lite.time.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Lite Time Module #\n\nThe Reactive Extensions for JavaScript, as it is a library that deals with events over time, naturally has a large number of operators that allow the creation of sequences at given timers, in addition to capturing time stamp and time interval information.  In addition, you can also check for timeouts on your operations.  This also supports windows and buffers with time. This module is designed to work with the `rx-lite` NPM module for both the standards-compliant version as well as compat for older browsers.\n\n## Details ##\n\nFiles:\n- [`rx.lite.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/modules/rx-lite-time/rx.lite.time.js)\n- [`rx.lite.time.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/modules/rx-lite-time-compat/rx.lite.time.compat.js)\n\nNPM Packages:\n- [`rx-lite-time`](https://www.npmjs.org/package/rx-lite-time)\n- [`rx-lite-time-compat`](https://www.npmjs.org/package/rx-lite-time-compat)\n\nFile Dependencies:\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`generateWithAbsoluteTime`](../../api/core/operators/generatewithabsolutetime.md)\n- [`generateWithRelativeTime`](../../api/core/operators/generatewithrelativetime.md)\n\n### `Observable Instance Methods`\n- [`bufferWithTime`](../../api/core/operators/bufferwithtime.md)\n- [`bufferWithTimeOrCount`](../../api/core/operators/bufferwithtimeorcount.md)\n- [`delaySubscription`](../../api/core/operators/delaysubscription.md)\n- [`sample`](../../api/core/operators/sample.md)\n- [`skipLastWithTime`](../../api/core/operators/skiplastwithtime.md)\n- [`takeLastBufferWithTime`](../../api/core/operators/takelastbufferwithtime.md)\n- [`takeLastWithTime`](../../api/core/operators/takelastwithtime.md)\n- [`timeInterval`](../../api/core/operators/timeinterval.md)\n- [`timeout`](../../api/core/operators/timeout.md)\n- [`timeoutWithSelector`](../../api/core/operators/timeoutwithselector.md)\n- [`timestamp`](../../api/core/operators/timestamp.md)\n- [`windowWithTime`](../../api/core/operators/windowwithtime.md)\n- [`windowWithTimeOrCount`](../../api/core/operators/windowwithtimeorcount.md)\n"
  },
  {
    "path": "doc/libraries/lite/rx.lite.virtualtime.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Virtual Time Module #\n\nThe Reactive Extensions for JavaScript supports a notion of virtual time, which allows you to mock time easily, or even run through historical data through the `HistoricalScheduler`. This module is designed to work with the `rx-lite` NPM module for both the standards-compliant version as well as compat for older browsers.\n\n## Details ##\n\nFiles:\n- [`rx.lite.virtualtime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/modules/rx-lite-virtualtime/rx.lite.virtualtime.js)\n- [`rx.lite.virtualtime.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/modules/rx-lite-virtualtime-compat/rx.lite.virtualtime.compat.js)\n\nNPM Packages:\n- [`rx-lite-virtualtime`](https://www.npmjs.org/package/rx-lite-virtualtime)\n- [`rx-lite-virtualtime-compat`](https://www.npmjs.org/package/rx-lite-virtualtime-compat)\n\nFile Dependencies:\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js)\n- [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\n## Included Classes ##\n\n### Schedulers\n\n- [`Rx.HistoricalScheduler`](../../api/schedulers/historicalscheduler.md)\n- [`Rx.VirtualTimeScheduler`](../../api/schedulers/virtualtimescheduler.md)\n"
  },
  {
    "path": "doc/libraries/main/rx.aggregates.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Aggregates Module #\n\nThe Reactive Extensions for JavaScript has a number of aggregation operators including those you might already know from the Array#extras and the upcoming ES6 standard such as `reduce`, `find` and `findIndex`.  This module is used exclusively for aggregation operations used on finite observable sequences.  In addition to the aforementioned operators, there are many useful operators such as `count`, `sum`, `average` and determining whether two sequences are equal via the `sequenceEqual` method.\n\n## Details ##\n\nFiles:\n- [`rx.aggregates.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.aggregates.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Aggregates`](http://www.nuget.org/packages/RxJS-Aggregates/)\n\nFile Dependencies:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNuGet Dependencies:\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/) | [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\n## Included Observable Operators ##\n\n### `Observable Instance Methods`\n- [`aggregate`](../../api/core/operators/reduce.md)\n- [`all`](../../api/core/operators/every.md)\n- [`any`](../../api/core/operators/some.md)\n- [`average`](../../api/core/operators/average.md)\n- [`includes`](../../api/core/operators/includes.md)\n- [`count`](../../api/core/operators/count.md)\n- [`elementAt`](../../api/core/operators/elementat.md)\n- [`every`](../../api/core/operators/every.md)\n- [`find`](../../api/core/operators/find.md)\n- [`findIndex`](../../api/core/operators/findindex.md)\n- [`first`](../../api/core/operators/first.md)\n- [`indexOf`](../../api/core/operators/indexof.md)\n- [`isEmpty`](../../api/core/operators/isempty.md)\n- [`last`](../../api/core/operators/last.md)\n- [`lastIndexOf`](../../api/core/operators/lastindexof.md)\n- [`max`](../../api/core/operators/max.md)\n- [`maxBy`](../../api/core/operators/maxby.md)\n- [`min`](../../api/core/operators/min.md)\n- [`minBy`](../../api/core/operators/minby.md)\n- [`reduce`](../../api/core/operators/reduce.md)\n- [`sequenceEqual`](../../api/core/operators/sequenceequal.md)\n- [`single`](../../api/core/operators/single.md)\n- [`slice`](../../api/core/operators/slice.md)\n- [`some`](../../api/core/operators/some.md)\n- [`sum`](../../api/core/operators/sum.md)\n- [`toMap`](../../api/core/operators/tomap.md)\n- [`toSet`](../../api/core/operators/toset.md)\n"
  },
  {
    "path": "doc/libraries/main/rx.async.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Async Module #\n\nThe Reactive Extensions for JavaScript provides support for bridging to events, promises, callbacks, Node.js-style callbacks and more.  This module includes all of that functionality.  In addition, this also supports taking ordinary functions and turning them into asynchronous functions via Observable sequences.\n\nThis comes with both `rx.async.js` which is for use in modern development environments such as > IE9 and server-side environments such as Node.js.  We also have `rx.async.compat.js` which has backwards compatibility to browsers which do not support all required ES5 features.\n\n## Details ##\n\nFiles:\n- [`rx.async.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.async.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Async`](http://www.nuget.org/packages/RxJS-Async/)\n\nFile Dependencies:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNuGet Dependencies:\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Binding`](http://www.nuget.org/packages/RxJS-Binding/)\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`fromCallback`](../../api/core/operators/fromcallback.md)\n- [`fromEvent`](../../api/core/operators/fromevent.md)\n- [`fromEventPattern`](../../api/core/operators/fromeventpattern.md)\n- [`fromNodeCallback`](../../api/core/operators/fromnodecallback.md)\n- [`spawn`](../../api/core/operators/spawn.md)\n- [`start`](../../api/core/operators/start.md)\n- [`startAsync`](../../api/core/operators/startasync.md)\n- [`toAsync`](../../api/core/operators/toasync.md)\n- [`toPromise`](../../api/core/operators/topromise.md)\n- [`wrap`](../../api/core/operators/wrap.md)\n"
  },
  {
    "path": "doc/libraries/main/rx.backpressure.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Backpressure Module #\n\nThe Reactive Extensions for JavaScript provides support backpressure for situations when the observable sequences emits too many messages for the observer to consume.  This is in addition to other mechanisms already in place such as `buffer`, `throttle`, `sample` among other operators which allow you to get messages every so often, or in batches.  This module allows you to pause and resume a hot observable with `pausable` and to pause and resume with buffered data with `pausableBuffered`.  In addition, we also support the ability to get a requested number of items from the queue through the `controlled` operator.\n\n## Details ##\n\nFiles:\n- [`rx.backpressure.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.backpressure.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-BackPressure`](http://www.nuget.org/packages/RxJS-Backpressure/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nFile Dependencies:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n- [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n\nNuGet Dependencies:\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Binding`](http://www.nuget.org/packages/RxJS-Binding/)\n\n## Included Observable Operators ##\n\n### `Observable Instance Methods`\n- [`controlled`](../../api/core/operators/controlled.md)\n- [`pausable`](../../api/core/operators/pausable.md)\n- [`pausableBuffered`](../../api/core/operators/pausablebuffered.md)\n"
  },
  {
    "path": "doc/libraries/main/rx.binding.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Binding Module #\n\nThe Reactive Extensions for JavaScript has a notion of hot and cold observables.  Hot observables fire whether you are listening to them or not, such as mouse movements.  Cold observables on the other hand, such as a sequence created from an array will fire the same sequence to all subscribers.  The Binding module gives you the ability to replay events for hot observables, and to turn cold observables into hot observables.\n\n## Details ##\n\nFiles:\n- [`rx.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.binding.js)\n- [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Binding`](http://www.nuget.org/packages/RxJS-Binding/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\nFile Dependencies:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNuGet Dependencies:\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n\n## Included Observable Operators ##\n\n### `Observable Instance Methods`\n- [`connect`](../../api/core/operators/connect.md)\n- [`publish`](../../api/core/operators/publish.md)\n- [`publishLast`](../../api/core/operators/publishlast.md)\n- [`publishValue`](../../api/core/operators/publishvalue.md)\n- [`refCount`](../../api/core/operators/refcount.md)\n- [`replay`](../../api/core/operators/replay.md)\n- [`share`](../../api/core/operators/share.md)\n- [`shareLast`](../../api/core/operators/sharelast.md)\n- [`shareReplay`](../../api/core/operators/sharereplay.md)\n- [`shareValue`](../../api/core/operators/sharevalue.md)\n- [`singleInstance`](../../api/core/operators/singleinstance.md)\n\n## Included Classes ##\n\n### Subjects\n\n- [`Rx.BehaviorSubject`](../../api/core/observable.mdapi/subjects/behaviorsubject.md)\n- [`Rx.ReplaySubject`](../../api/core/observable.mdapi/subjects/replaysubject.md)\n"
  },
  {
    "path": "doc/libraries/main/rx.coincidence.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Coincidence Module #\n\nThe Reactive Extensions for JavaScript has a set of coincidence-based operators such as `join` and `groupJoin` which allow one to correlate two observable sequences much as you would do in SQL.  There is also support for advanced windowing and bufferring capabilities which allow for the specification of opening and closing observable sequences to denote how much data to capture.\n\n## Details ##\n\nFiles:\n- [`rx.coincidence.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.coincidence.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Coincidence`](http://www.nuget.org/packages/RxJS-Coincidence/)\n\nFile Dependencies:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNuGet Dependencies:\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n\n## Included Observable Operators ##\n\n## `Observable Instance Methods`\n- [`buffer`](../../api/core/operators/buffer.md)\n- [`groupBy`](../../api/core/operators/groupby.md)\n- [`groupByUntil`](../../api/core/operators/groupbyuntil.md)\n- [`groupJoin`](../../api/core/operators/groupjoin.md)\n- [`join`](../../api/core/operators/join.md)\n- [`pairwise`](../../api/core/operators/pairwise.md)\n- [`partition`](../../api/core/operators/partition.md)\n- [`window`](../../api/core/operators/window.md)\n"
  },
  {
    "path": "doc/libraries/main/rx.complete.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Complete Module #\n\nThe Reactive Extensions for JavaScript's complete functionality is in the complete RxJS file which has many core components including the Schedulers, Disposables, Observable and Observer, but omits any testing capabilities.\n\nThis comes with both [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js) which is for use in modern development environments such as > IE9 and server-side environments such as Node.js.  We also have [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js) which has backwards compatibility to browsers which do not support all required ES5 features.\n\n## Details ##\n\nFiles:\n- [`rx.all.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.js)\n- [`rx.all.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.all.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`amb`](../../api/core/operators/amb.md)\n- [`case`](../../api/core/operators/case.md)\n- [`catch`](../../api/core/operators/catch.md)\n- [`concat`](../../api/core/operators/concat.md)\n- [`create`](../../api/core/operators/create.md)\n- [`defer`](../../api/core/operators/defer.md)\n- [`empty`](../../api/core/operators/empty.md)\n- [`for`](../../api/core/operators/for.md)\n- [`forkJoin`](../../api/core/operators/forkjoin.md)\n- [`from`](../../api/core/operators/from.md)\n- [`fromArray`](../../api/core/operators/fromarray.md)\n- [`fromCallback`](../../api/core/operators/fromcallback.md)\n- [`fromEvent`](../../api/core/operators/fromevent.md)\n- [`fromEventPattern`](../../api/core/operators/fromeventpattern.md)\n- [`fromNodeCallback`](../../api/core/operators/fromnodecallback.md)\n- [`fromPromise`](../../api/core/operators/frompromise.md)\n- [`generate`](../../api/core/operators/generate.md)\n- [`generateWithAbsoluteTime`](../../api/core/operators/generatewithabsolutetime.md)\n- [`generateWithRelativeTime`](../../api/core/operators/generatewithrelativetime.md)\n- [`if`](../../api/core/operators/if.md)\n- [`interval`](../../api/core/operators/interval.md)\n- [`just`](../../api/core/operators/return.md)\n- [`merge`](../../api/core/operators/merge.md)\n- [`mergeDelayError`](../../api/core/operators/mergedelayerror.md)\n- [`never`](../../api/core/operators/never.md)\n- [`of`](../../api/core/operators/of.md)\n- [`ofArrayChanges`](../../api/core/operators/ofarraychanges.md)\n- [`ofObjectChanges`](../../api/core/operators/ofobjectchanges.md)\n- [`ofWithScheduler`](../../api/core/operators/ofwithscheduler.md)\n- [`onErrorResumeNext`](../../api/core/operators/onerrorresumenext.md)\n- [`pairs`](../../api/core/operators/pairs.md)\n- [`range`](../../api/core/operators/range.md)\n- [`repeat`](../../api/core/operators/repeat.md)\n- [`return`](../../api/core/operators/return.md)\n- [`spawn`](../../api/core/operators/spawn.md)\n- [`start`](../../api/core/operators/start.md)\n- [`startAsync`](../../api/core/operators/startasync.md)\n- [`throw`](../../api/core/operators/throw.md)\n- [`timer`](../../api/core/operators/timer.md)\n- [`toAsync`](../../api/core/operators/toasync.md)\n- [`using`](../../api/core/operators/using.md)\n- [`when`](../../api/core/operators/when.md)\n- [`while`](../../api/core/operators/while.md)\n- [`wrap`](../../api/core/operators/wrap.md)\n- [`zip`](../../api/core/operators/zip.md)\n\n### `Observable Instance Methods`\n- [`aggregate`](../../api/core/operators/reduce.md)\n- [`all`](../../api/core/operators/every.md)\n- [`amb`](../../api/core/operators/ambproto.md)\n- [`and`](../../api/core/operators/and.md)\n- [`any`](../../api/core/operators/some.md)\n- [`asObservable`](../../api/core/operators/asobservable.md)\n- [`average`](../../api/core/operators/average.md)\n- [`buffer`](../../api/core/operators/buffer.md)\n- [`bufferWithCount`](../../api/core/operators/bufferwithcount.md)\n- [`bufferWithTime`](../../api/core/operators/bufferwithtime.md)\n- [`bufferWithTimeOrCount`](../../api/core/operators/bufferwithtimeorcount.md)\n- [`catch`](../../api/core/operators/catchproto.md)\n- [`combineLatest`](../../api/core/operators/combinelatest.md)\n- [`concat`](../../api/core/operators/concatproto.md)\n- [`concatAll`](../../api/core/operators/concatall.md)\n- [`concatMap`](../../api/core/operators/concatmap.md)\n- [`connect`](../../api/core/operators/connect.md)\n- [`controlled`](../../api/core/operators/controlled.md)\n- [`count`](../../api/core/operators/count.md)\n- [`debounce`](../../api/core/operators/debounce.md)\n- [`defaultIfEmpty`](../../api/core/operators/defaultifempty.md)\n- [`delay`](../../api/core/operators/delay.md)\n- [`delaySubscription`](../../api/core/operators/delaysubscription.md)\n- [`dematerialize`](../../api/core/operators/dematerialize.md)\n- [`distinct`](../../api/core/operators/distinct.md)\n- [`distinctUntilChanged`](../../api/core/operators/distinctuntilchanged.md)\n- [`do`](../../api/core/operators/do.md)\n- [`doOnNext`](../../api/core/operators/doonnext.md)\n- [`doOnError`](../../api/core/operators/doonerror.md)\n- [`doOnCompleted`](../../api/core/operators/dooncompleted.md)\n- [`doWhile`](../../api/core/operators/dowhile.md)\n- [`elementAt`](../../api/core/operators/elementat.md)\n- [`every`](../../api/core/operators/every.md)\n- [`expand`](../../api/core/operators/expand.md)\n- [`extend`](../../api/core/operators/manyselect.md)\n- [`filter`](../../api/core/operators/where.md)\n- [`finally | ensure`](../../api/core/operators/finally.md)\n- [`find`](../../api/core/operators/find.md)\n- [`findIndex`](../../api/core/operators/findindex.md)\n- [`first`](../../api/core/operators/first.md)\n- [`flatMap`](../../api/core/operators/selectmany.md)\n- [`flatMapFirst`](../../api/core/operators/flatmapfirst.md)\n- [`flatMapLatest`](../../api/core/operators/flatmaplatest.md)\n- [`flatMapObserver`](../../api/core/operators/flatmapobserver.md)\n- [`flatMapWithMaxConcurrent`](../../api/core/flatmapwithmaxconcurrent.md)\n- [`forkJoin`](../../api/core/operators/forkjoinproto.md)\n- [`groupBy`](../../api/core/operators/groupby.md)\n- [`groupByUntil`](../../api/core/operators/groupbyuntil.md)\n- [`groupJoin`](../../api/core/operators/groupjoin.md)\n- [`ignoreElements`](../../api/core/operators/ignoreelements.md)\n- [`includes`](../../api/core/operators/includes.md)\n- [`isEmpty`](../../api/core/operators/isempty.md)\n- [`join`](../../api/core/operators/join.md)\n- [`last`](../../api/core/operators/last.md)\n- [`lastIndexOf`](../../api/core/operators/lastindexof.md)\n- [`let`](../../api/core/operators/let.md)\n- [`manySelect`](../../api/core/operators/manyselect.md)\n- [`map`](../../api/core/operators/select.md)\n- [`max`](../../api/core/operators/max.md)\n- [`maxBy`](../../api/core/operators/maxby.md)\n- [`merge`](../../api/core/operators/mergeproto.md)\n- [`mergeAll`](../../api/core/operators/mergeall.md)\n- [`min`](../../api/core/operators/min.md)\n- [`minBy`](../../api/core/operators/minby.md)\n- [`multicast`](../../api/core/operators/multicast.md)\n- [`observeOn`](../../api/core/operators/observeon.md)\n- [`onErrorResumeNext`](../../api/core/operators/onerrorresumenextproto.md)\n- [`pairwise`](../../api/core/operators/pairwise.md)\n- [`partition`](../../api/core/operators/partition.md)\n- [`pausable`](../../api/core/operators/pausable.md)\n- [`pausableBuffered`](../../api/core/operators/pausablebuffered.md)\n- [`pluck`](../../api/core/operators/pluck.md)\n- [`publish`](../../api/core/operators/publish.md)\n- [`publishLast`](../../api/core/operators/publishlast.md)\n- [`publishValue`](../../api/core/operators/publishvalue.md)\n- [`share`](../../api/core/operators/share.md)\n- [`shareReplay`](../../api/core/operators/sharereplay.md)\n- [`shareValue`](../../api/core/operators/sharevalue.md)\n- [`refCount`](../../api/core/operators/refcount.md)\n- [`reduce`](../../api/core/operators/reduce.md)\n- [`repeat`](../../api/core/operators/repeat.md)\n- [`replay`](../../api/core/operators/replay.md)\n- [`retry`](../../api/core/operators/retry.md)\n- [`retryWhen`](../../api/core/operators/retrywhen.md)\n- [`sample`](../../api/core/operators/sample.md)\n- [`scan`](../../api/core/operators/scan.md)\n- [`select`](../../api/core/operators/select.md)\n- [`selectConcat`](../../api/core/operators/concatmap.md)\n- [`selectMany`](../../api/core/operators/selectmany.md)\n- [`selectManyObserver`](../../api/core/operators/selectmanyobserver.md)\n- [`sequenceEqual`](../../api/core/operators/sequenceequal.md)\n- [`single`](../../api/core/operators/single.md)\n- [`singleInstance`](../../api/core/operators/singleinstance.md)\n- [`skip`](../../api/core/operators/skip.md)\n- [`skipLast`](../../api/core/operators/skiplast.md)\n- [`skipLastWithTime`](../../api/core/operators/skiplastwithtime.md)\n- [`skipUntil`](../../api/core/operators/skipuntil.md)\n- [`skipUntilWithTime`](../../api/core/operators/skipuntilwithtime.md)\n- [`skipWhile`](../../api/core/operators/skipwhile.md)\n- [`slice`](../../api/core/operators/slice.md)\n- [`some`](../../api/core/operators/some.md)\n- [`startWith`](../../api/core/operators/startwith.md)\n- [`subscribe | forEach`](../../api/core/operators/subscribe.md)\n- [`subscribeOn`](../../api/core/operators/subscribeon.md)\n- [`sum`](../../api/core/operators/sum.md)\n- [`switch | switchLatest`](../../api/core/operators/switch.md)\n- [`switchFirst`](../../api/core/operators/switchfirst.md)\n- [`take`](../../api/core/operators/take.md)\n- [`takeLast`](../../api/core/operators/takelast.md)\n- [`takeLastBuffer`](../../api/core/operators/takelastbuffer.md)\n- [`takeLastBufferWithTime`](../../api/core/operators/takelastbufferwithtime.md)\n- [`takeLastWithTime`](../../api/core/operators/takelastwithtime.md)\n- [`takeUntil`](../../api/core/operators/takeuntil.md)\n- [`takeUntilWithTime`](../../api/core/operators/takeuntilwithtimee.md)\n- [`takeWhile`](../../api/core/operators/takewhile.md)\n- [`tap`](../../api/core/operators/do.md)\n- [`tapOnNext`](../../api/core/operators/doonnext.md)\n- [`tapOnError`](../../api/core/operators/doonerror.md)\n- [`tapOnCompleted`](../../api/core/operators/dooncompleted.md)\n- [`throttle`](../../api/core/operators/throttle.md)\n- [`timeInterval`](../../api/core/operators/timeinterval.md)\n- [`timeout`](../../api/core/operators/timeout.md)\n- [`timestamp`](../../api/core/operators/timestamp.md)\n- [`toArray`](../../api/core/operators/toarray.md)\n- [`where`](../../api/core/operators/where.md)\n- [`window`](../../api/core/operators/window.md)\n- [`windowWithCount`](../../api/core/operators/windowwithcount.md)\n- [`windowWithTime`](../../api/core/operators/windowwithtime.md)\n- [`windowWithTimeOrCount`](../../api/core/operators/windowwithtimeorcount.md)\n- [`withLatestFrom`](../../api/core/operators/withlatestfrom.md)\n- [`zip`](../../api/core/operators/zipproto.md)\n- [`zipIterable`](../../api/core/operators/zipiterable.md)\n\n## Included Classes ##\n\n### Core Objects\n\n- [`Rx.Observer`](../../api/core/observer.md)\n- [`Rx.Notification`](../../api/core/notification.md)\n\n### Subjects\n\n- [`Rx.AsyncSubject`](../../api/subjects/asyncsubject.md)\n- [`Rx.Subject`](../../api/subjects/subject.md)\n\n### Schedulers\n\n- [`Rx.Scheduler`](../../api/schedulers/scheduler.md)\n\n### Disposables\n\n- [`Rx.CompositeDisposable`](../../api/disposables/compositedisposable.md)\n- [`Rx.Disposable`](../../api/disposables/disposable.md)\n- [`Rx.RefCountDisposable`](../../api/disposables/refcountdisposable.md)\n- [`Rx.SerialDisposable`](../../api/disposables/serialdisposable.md)\n- [`Rx.SingleAssignmentDisposable`](../../api/disposables/singleassignmentdisposable.md)\n"
  },
  {
    "path": "doc/libraries/main/rx.experimental.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Experimental Module #\n\nThe Reactive Extensions for JavaScript has a number of operators that are considered experimental and not ready for mainstream usage.  This includes imperative operators such as `if`, `case`, `for`, `while`, `doWhile` as well as operators such as `forkJoin`.\n\n## Details ##\n\nFiles:\n- [`rx.experimental.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.experimental.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Experimental`](http://www.nuget.org/packages/RxJS-Experimental/)\n\nFile Dependencies:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNuGet Dependencies:\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`case`](../../api/core/operators/case.md)\n- [`for`](../../api/core/operators/for.md)\n- [`forkJoin`](../../api/core/operators/forkjoin.md)\n- [`if`](../../api/core/operators/if.md)\n- [`while`](../../api/core/operators/while.md)\n\n### `Observable Instance Methods`\n- [`doWhile`](../../api/core/operators/dowhile.md)\n- [`expand`](../../api/core/operators/expand.md)\n- [`extend`](../../api/core/operators/manyselect.md)\n- [`flatMapFirst`](../../api/core/operators/flatmapfirst.md)\n- [`flatMapWithMaxConcurrent`](../../api/core/flatmapwithmaxconcurrent.md)\n- [`forkJoin`](../../api/core/operators/forkjoinproto.md)\n- [`let`](../../api/core/operators/let.md)\n- [`manySelect`](../../api/core/operators/manyselect.md)\n- [`selectSwitchFirst`](../../api/core/operators/flatmapfirst.md)\n- [`selectWithMaxConcurrent`](../../api/core/operators/flatmapwithmaxconcurrent.md)\n"
  },
  {
    "path": "doc/libraries/main/rx.joinpatterns.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Join Patterns Module #\n\nThe Reactive Extensions for JavaScript also supports join calculus in that you can easily create patterns for when certain observable sequences fire.\n\n## Details ##\n\nFiles:\n- [`rx.joinpatterns.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.joinpatterns.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-JoinPatterns`](http://www.nuget.org/packages/RxJS-JoinPatterns/)\n\nFile Dependencies:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNuGet Dependencies:\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`when`](../../api/core/operators/when.md)\n\n### `Observable Instance Methods`\n- [`and`](../../api/core/operators/and.md)\n\n### `Pattern Instance Methods`\n- [`thenDo`](../../api/core/operators/thendo.md)\n"
  },
  {
    "path": "doc/libraries/main/rx.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Main Module #\n\nThe Reactive Extensions for JavaScript's main functionality is in the main RxJS file which has many core components including the Schedulers, Disposables, Observable and Observer.\n\nThis comes with both `rx.js` which is for use in modern development environments such as > IE9 and server-side environments such as Node.js.  We also have `rx.compat.js` which has backwards compatibility to browsers which do not support all required ES5 features.\n\n## Details ##\n\nFiles:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js)\n- [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`amb`](../../api/core/operators/amb.md)\n- [`catch`](../../api/core/operators/catch.md)\n- [`concat`](../../api/core/operators/concat.md)\n- [`create`](../../api/core/operators/create.md)\n- [`defer`](../../api/core/operators/defer.md)\n- [`empty`](../../api/core/operators/empty.md)\n- [`from`](../../api/core/operators/from.md)\n- [`fromArray`](../../api/core/operators/fromarray.md)\n- [`generate`](../../api/core/operators/generate.md)\n- [`just`](../../api/core/operators/return.md)\n- [`merge`](../../api/core/operators/merge.md)\n- [`mergeDelayError`](../../api/core/operators/mergedelayerror.md)\n- [`never`](../../api/core/operators/never.md)\n- [`of`](../../api/core/operators/of.md)\n- [`ofWithScheduler`](../../api/core/operators/ofwithscheduler.md)\n- [`onErrorResumeNext`](../../api/core/operators/onerrorresumenext.md)\n- [`pairs`](../../api/core/operators/pairs.md)\n- [`range`](../../api/core/operators/range.md)\n- [`repeat`](../../api/core/operators/repeat.md)\n- [`return`](../../api/core/operators/return.md)\n- [`throw`](../../api/core/operators/throw.md)\n- [`zip`](../../api/core/operators/zip.md)\n\n### `Observable Instance Methods`\n- [`amb`](../../api/core/operators/ambproto.md)\n- [`asObservable`](../../api/core/operators/asobservable.md)\n- [`bufferWithCount`](../../api/core/operators/bufferwithcount.md)\n- [`catch`](../../api/core/operators/catch.md)\n- [`combineLatest`](../../api/core/operators/combinelatest.md)\n- [`concat`](../../api/core/operators/concatproto.md)\n- [`concatAll`](../../api/core/operators/concatall.md)\n- [`concatMap`](../../api/core/operators/concatmap.md)\n- [`defaultIfEmpty`](../../api/core/operators/defaultifempty.md)\n- [`distinct`](../../api/core/operators/distinct.md)\n- [`distinctUntilChanged`](../../api/core/operators/distinctuntilchanged.md)\n- [`do`](../../api/core/operators/do.md)\n- [`doOnNext`](../../api/core/operators/doonnext.md)\n- [`doOnError`](../../api/core/operators/doonerror.md)\n- [`doOnCompleted`](../../api/core/operators/dooncompleted.md)\n- [`filter`](../../api/core/operators/where.md)\n- [`finally`](../../api/core/operators/finally.md)\n- [`flatMap`](../../api/core/operators/selectmany.md)\n- [`flatMapLatest`](../../api/core/operators/flatmaplatest.md)\n- [`flatMapObserver`](../../api/core/operators/flatmapobserver.md)\n- [`ignoreElements`](../../api/core/operators/ignoreelements.md)\n- [`map`](../../api/core/operators/select.md)\n- [`merge`](../../api/core/operators/mergeproto.md)\n- [`mergeAll`](../../api/core/operators/mergeall.md)\n- [`observeOn`](../../api/core/operators/observeon.md)\n- [`onErrorResumeNext`](../../api/core/operators/onerrorresumenext.md)\n- [`repeat`](../../api/core/operators/repeatproto.md)\n- [`repeatWhen`](../../api/core/operators/repeatwhen.md)\n- [`retry`](../../api/core/operators/retry.md)\n- [`retryWhen`](../../api/core/operators/retrywhen.md)\n- [`scan`](../../api/core/operators/scan.md)\n- [`select`](../../api/core/operators/select.md)\n- [`selectConcat`](../../api/core/operators/concatmap.md)\n- [`selectMany`](../../api/core/operators/selectmany.md)\n- [`selectManyObserver`](../../api/core/operators/flatpmapobserver.md)\n- [`selectSwitch`](../../api/core/operators/flatmaplatest.md)\n- [`single`](../../api/core/operators/single.md)\n- [`singleOrDefault`](../../api/core/operators/singleordefault.md)\n- [`skip`](../../api/core/operators/skip.md)\n- [`skipLast`](../../api/core/operators/skiplast.md)\n- [`skipUntil`](../../api/core/operators/skipuntil.md)\n- [`skipWhile`](../../api/core/operators/skipwhile.md)\n- [`startWith`](../../api/core/operators/startwith.md)\n- [`subscribe | forEach`](../../api/core/operators/subscribe.md)\n- [`subscribeOnNext`](../../api/core/operators/subscribeonnext.md)\n- [`subscribeOnError`](../../api/core/operators/subscribeonerror.md)\n- [`subscribeOnCompleted`](../../api/core/operators/subscribeoncompleted.md)\n- [`subscribeOn`](../../api/core/operators/subscribeon.md)\n- [`switch | switchLatest`](../../api/core/operators/switch.md)\n- [`take`](../../api/core/operators/take.md)\n- [`takeLast`](../../api/core/operators/takelast.md)\n- [`takeLastBuffer`](../../api/core/operators/takelastbuffer.md)\n- [`takeUntil`](../../api/core/operators/takeuntil.md)\n- [`takeWhile`](../../api/core/operators/takewhile.md)\n- [`toArray`](../../api/core/operators/toarray.md)\n- [`transduce`](../../api/core/operators/transduce.md)\n- [`where`](../../api/core/operators/where.md)\n- [`windowWithCount`](../../api/core/operators/windowwithcount.md)\n- [`withLatestFrom`](../../api/core/operators/withlatestfrom.md)\n- [`zip`](../../api/core/operators/zipproto.md)\n- [`zipIterable`](../../api/core/operators/zipiterable.md)\n\n## Included Classes ##\n\n### Core Objects\n\n- [`Rx.Observer`](../../api/core/observer.md)\n- [`Rx.Observable`](../../api/core/observable.md)\n- [`Rx.Notification`](../../api/core/notification.md)\n\n### Subjects\n\n- [`Rx.AsyncSubject`](../../api/subjects/asyncsubject.md)\n- [`Rx.Subject`](../../api/subjects/subject.md)\n\n### Schedulers\n\n- [`Rx.Scheduler`](../../api/schedulers/scheduler.md)\n\n### Disposables\n\n- [`Rx.CompositeDisposable`](../../api/disposables/compositedisposable.md)\n- [`Rx.Disposable`](../../api/disposables/disposable.md)\n- [`Rx.RefCountDisposable`](../../api/disposables/refcountdisposable.md)\n- [`Rx.SerialDisposable`](../../api/disposables/serialdisposable.md)\n- [`Rx.SingleAssignmentDisposable`](../../api/disposables/singleassignmentdisposable.md)\n"
  },
  {
    "path": "doc/libraries/main/rx.testing.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Testing Module #\n\nThe Reactive Extensions for JavaScript has a built-in mechanism for testing all operators which allows for mocking absolute and relative time with ease.\n\n## Details ##\n\nFiles:\n- [`rx.testing.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.testing.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Testing`](http://www.nuget.org/packages/RxJS-Testing/)\n\nFile Dependencies:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n- [`rx.virtualtime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.virtualtime.js)\n\nNuGet Dependencies:\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\n## Included Classes ##\n\n### Testing Classes\n\n- [`Rx.ReactiveTest`](../../api/testing/reactivetest.md)\n- [`Rx.Recorded`](../../api/testing/recorded.md)\n- [`Rx.Subscription`](../../api/testing/subscription.md)\n- [`Rx.TestScheduler`](../../api/testing/testscheduler.md)\n"
  },
  {
    "path": "doc/libraries/main/rx.time.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Time Module #\n\nThe Reactive Extensions for JavaScript, as it is a library that deals with events over time, naturally has a large number of operators that allow the creation of sequences at given timers, in addition to capturing time stamp and time interval information.  In addition, you can also check for timeouts on your operations.  This also supports windows and buffers with time.\n\n## Details ##\n\nFiles:\n- [`rx.time.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.time.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-Time`](http://www.nuget.org/packages/RxJS-Time/)\n\nFile Dependencies:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNuGet Dependencies:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n- [`RxJS-Lite`](http://www.nuget.org/packages/RxJS-Lite/)\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`generateWithAbsoluteTime`](../../api/core/operators/generatewithabsolutetime.md)\n- [`generateWithRelativeTime`](../../api/core/operators/generatewithrelativetime.md)\n- [`interval`](../../api/core/operators/interval.md)\n- [`timer`](../../api/core/operators/timer.md)\n\n### `Observable Instance Methods`\n- [`bufferWithTime`](../../api/core/operators/bufferwithtime.md)\n- [`bufferWithTimeOrCount`](../../api/core/operators/bufferwithtimeorcount.md)\n- [`debounce`](../../api/core/operators/debounce.md)\n- [`delay`](../../api/core/operators/delay.md)\n- [`delaySubscription`](../../api/core/operators/delaysubscription.md)\n- [`sample`](../../api/core/operators/sample.md)\n- [`skipLastWithTime`](../../api/core/operators/skiplastwithtime.md)\n- [`takeLastBufferWithTime`](../../api/core/operators/takelastbufferwithtime.md)\n- [`takeLastWithTime`](../../api/core/operators/takelastwithtime.md)\n- [`throttle`](../../api/core/operators/throttle.md)\n- [`timeInterval`](../../api/core/operators/timeinterval.md)\n- [`timeout`](../../api/core/operators/timeout.md)\n- [`timestamp`](../../api/core/operators/timestamp.md)\n- [`windowWithTime`](../../api/core/operators/windowwithtime.md)\n- [`windowWithTimeOrCount`](../../api/core/operators/windowwithtimeorcount.md)\n"
  },
  {
    "path": "doc/libraries/main/rx.virtualtime.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS Virtual Time Module #\n\nThe Reactive Extensions for JavaScript supports a notion of virtual time, which allows you to mock time easily, or even run through historical data through the `HistoricalScheduler`.\n\n## Details ##\n\nFiles:\n- [`rx.virtualtime.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.virtualtime.js)\n\nNPM Packages:\n- [`rx`](https://www.npmjs.org/package/rx)\n\nNuGet Packages:\n- [`RxJS-VirtualTime`](http://www.nuget.org/packages/RxJS-VirtualTime/)\n\nFile Dependencies:\n- [`rx.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.js) | [`rx.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.compat.js) | [`rx.lite.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.js) | [`rx.lite.compat.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.lite.compat.js)\n\nNuGet Dependencies:\n- [`RxJS-All`](http://www.nuget.org/packages/RxJS-All/)\n- [`RxJS-Main`](http://www.nuget.org/packages/RxJS-Main/)\n\n## Included Classes ##\n\n### Schedulers\n\n- [`Rx.HistoricalScheduler`](../../api/schedulers/historicalscheduler.md)\n- [`Rx.VirtualTimeScheduler`](../../api/schedulers/virtualtimescheduler.md)\n"
  },
  {
    "path": "doc/mapping/async/comparing.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS for Async.js Users #\n\n[Async.js](https://github.com/caolan/async) is a popular utility module which provides straight-forward, powerful functions for working with asynchronous JavaScript. Async provides around 20 functions that include the usual 'functional' suspects (map, reduce, filter, each...) as well as some common patterns for asynchronous control flow (parallel, series, waterfall...). All these functions assume you follow the node.js convention of providing a single callback as the last argument of your async function.\n\nMany of these concepts in the library map directly to RxJS concepts.  We'll go operator by operator on how each map to existing functionality in RxJS.\n\n## Collection Methods\n - [`async.each`](#asynceach)\n - [`async.map`](#asyncmap)\n - [`async.filter`](#asyncfilter)\n - [`async.reject`](#asyncreject)\n - [`async.reduce`](#asyncreduce)\n - [`async.detect`](#asyncdetect)\n - [`async.some`](#asyncsome)\n - [`async.every`](#asyncevery)\n - [`async.concat`](#asynconcat)\n\n ## Control Flow\n - [`async.series`](#asyncseries)\n - [`async.parallel`](#asyncparallel)\n - [`async.whilst`](#asyncwhilst)\n - [`async.doWhilst`](#asyncdowhilst)\n - [`async.nextTick`](#asyncnexttick)\n - [`async.waterfall`](#asyncwaterfall)\n - [`async.compose`](#asynccompose)\n\n## `async.each` ##\n\nThe [`async.each`](https://github.com/caolan/async#eacharr-iterator-callback) method applies an iterator function to each item in an array, in parallel. The iterator is called with an item from the list and a callback for when it has finished. If the iterator passes an error to this callback, the main callback for the each function is immediately called with the error.\n\n#### async version ####\n\nIn this example, we will use `async.each` to iterate an array of files to write some contents and save.\n\n```js\nvar async = require('async'),\n    fs = require('fs');\n\nvar files = ['file1.txt', 'file2.txt', 'file3.txt'];\n\nfunction saveFile (file, cb) {\n    fs.writeFile(file, 'Hello Node', function (err) {\n        cb(err);\n    });\n}\n\nasync.each(files, saveFile, function (err) {\n    // if any of the saves produced an error, err would equal that error\n});\n```\n\n#### RxJS version ####\n\nUsing RxJS, you can accomplish this task in a number of ways by using `Rx.Observable.fromNodeCallback` to wrap the `fs.writeFile` function, and then iterate the files by using the `Rx.Observable.for` method.\n\n```js\nvar Rx = require('rx'),\n    fs = require('fs');\n\nvar files = ['file1.txt', 'file2.txt', 'file3.txt'];\n\n// wrap the method\nvar writeFile = Rx.Observable.fromNodeCallback(fs.writeFile);\n\nRx.Observable\n    .for(files, function (file) {\n        return writeFile(file, 'Hello Node')\n    })\n    .forEach(\n        function () {\n            console.log('file written!');\n        },\n        function (err) {\n            console.log('err ' + err);\n        },\n        function () {\n            console.log('completed!')\n        }\n    );\n```\n\n* * *\n\n## `async.map` ##\n\nThe `async.map` method produces a new array of values by mapping each value in the given array through the iterator function. The iterator is called with an item from the array and a callback for when it has finished processing. The callback takes 2 arguments, an error and the transformed item from the array. If the iterator passes an error to this callback, the main callback for the map function is immediately called with the error.\n\n#### async version ####\n\nIn this example, we'll get the `fs.stat` for each file given and have the results returned as an array.\n\n```js\nvar async = require('async'),\n    fs = require('fs');\n\nvar files = ['file1.txt', 'file2.txt', 'file3.txt'];\n\nasync.map(files, fs.stat, function (err, results) {\n\n  results.forEach(function (result) {\n    console.log('is file: %s', result.isFile());\n  });\n\n});\n```\n\n#### RxJS version ####\n\nUsing RxJS, we can achieve the same results of an array of all of our values by wrapping the `fs.stat` method again using our `Rx.Observable.fromNodeCallback`, then iterate using the `Rx.Observable.for` method, and finally, calling `.toArray()` to get our results as an entire array.\n\n```js\nvar Rx = require('rx'),\n    fs = require('fs');\n\nvar stat = Rx.Observable.fromNodeCallback(fs.stat);\n\nvar files = ['file1.txt', 'file2.txt', 'file3.txt'];\n\nRx.Observable\n  .for(files, function (file) { return stat(file); })\n  .toArray()\n  .forEach(\n    function (results) {\n\n      results.forEach(function (result) {\n        console.log('is file: %s', result.isFile());\n      });\n\n    },\n    function (err) {\n      console.log('err %s', err);\n    }\n  );\n```\n\n* * *\n\n## `async.filter` ##\n\nThe `async.filter` method returns a new array of all the values which pass an async truth test. The callback for each iterator call only accepts a single argument of true or false, it does not accept an error argument first! This is in-line with the way node libraries work with truth tests like fs.exists.\n\n#### async version ####\n\nIn this example, we'll determine whether the file exists by calling `fs.exists` for each file given and have the results returned as an array.\n\n```js\nvar async = require('async'),\n    fs = require('fs');\n\nvar files = ['file1.txt', 'file2.txt', 'file3.txt'];\n\nasync.filter(files, fs.exists, function (results) {\n\n  results.forEach(function (result) {\n    console.log('exists: %s', result);\n  });\n\n});\n```\n\n#### RxJS version ####\n\nUsing RxJS, we can achieve the same results of an array of all of our values by wrapping the `fs.exists` method using our `Rx.Observable.fromCallback` as it only has one result, a `true` or `false` value instead of the usual callback with error and result.  Then we'll iterate using the `Rx.Observable.for` method, filter the existing files and finally, calling `.toArray()` to get our results as an entire array.\n\n```js\nvar Rx = require('rx'),\n    fs = require('fs');\n\nvar files = ['file1.txt', 'file2.txt', 'file3.txt'];\n\nvar exists = Rx.Observable.fromCallback(fs.exists);\n\nRx.Observable\n  .for(files, function (file) { return exists(file); })\n  .where(function (x) { return x; })\n  .toArray()\n  .forEach(\n    function (results) {\n\n      results.forEach(function (result) {\n        console.log('exists: %s', result);\n      });\n\n    }\n  );\n```\n\n* * *\n\n## `async.reject` ##\n\nThe `async.reject` method is the opposite of filter. Removes values that pass an async truth test.\n\n#### async version ####\n\nIn this example, we'll determine whether the file exists by calling `fs.exists` for each file given and have the results returned as an array.\n\n```js\nvar async = require('async'),\n    fs = require('fs');\n\nvar files = ['file1.txt', 'file2.txt', 'file3.txt'];\n\nasync.reject(files, fs.exists, function (results) {\n\n  results.forEach(function (result) {\n    console.log('exists: %s', result);\n  });\n\n});\n```\n\n#### RxJS version ####\n\nUsing RxJS, we can achieve the same results of an array of all of our values by wrapping the `fs.exists` method using our `Rx.Observable.fromCallback` as it only has one result, a `true` or `false` value instead of the usual callback with error and result.  Then we'll iterate using the `Rx.Observable.for` method, filter the existing files using `filter` and finally, calling `.toArray()` to get our results as an entire array.\n\n```js\nvar Rx = require('rx'),\n    fs = require('fs');\n\nvar files = ['file1.txt', 'file2.txt', 'file3.txt'];\n\nvar exists = Rx.Observable.fromCallback(fs.exists);\n\nRx.Observable\n    .for(files, function (file) { return exists(file); })\n    .where(function (x) { return !x; })\n    .toArray()\n    .forEach(\n      function (results) {\n\n        results.forEach(function (result) {\n          console.log('exists: %s', result);\n        });\n\n      }\n    );\n```\n\n* * *\n\n## `async.reduce` ##\n\nThe `async.reduce` method reduces a list of values into a single value using an async iterator to return each successive step. Memo is the initial state of the reduction. This function only operates in series. For performance reasons, it may make sense to split a call to this function into a parallel map, then use the normal `Array.prototype.reduce` on the results. This function is for situations where each step in the reduction needs to be async, if you can get the data before reducing it then it's probably a good idea to do so.\n\n#### async version ####\n\nIn this example, we'll call `reduction` for each value which will return the result of adding them all together.\n\n```js\nvar async = require('async');\n\nfunction reduction (acc, x, cb) {\n    process.nextTick(function () {\n        cb(null, acc + x);\n    });\n}\n\nasync.reduce([1,2,3], 0, reduction, function (err, results) {\n    console.log(results);\n});\n\n// => 6\n```\n\n#### RxJS version ####\n\nIn RxJS, we have a number of ways of doing this including using `Rx.Observable.from` to turn an array into observable sequence, then we can call `reduce` to add the numbers.  To ensure that it is indeed async, we can switch to the `Rx.Scheduler.timeout` to ensure that it is done via a `setImmediate` call.\n\n```js\nvar Rx = require('rx');\n\nRx.Observable\n  .from([1,2,3], Rx.Scheduler.timeout)\n  .reduce(function (acc, x) { return acc + x; }, 0)\n  .forEach( function (results) { console.log(results); });\n\n// => 6\n```\n\n* * *\n\n## `async.detect` ##\n\nThe `async.detect` method returns the first value in a list that passes an async truth test. The iterator is applied in parallel, meaning the first iterator to return true will fire the detect callback with that result.\n\n#### async version ####\n\nIn this example, we'll get the first file that matches.\n\n```js\nvar async = require('async'),\n    fs = require('fs');\n\nvar files = ['file1.txt', 'file2.txt', 'file3.txt'];\n\nasync.detect(files, fs.exists, function (result){\n  // result now equals the first file in the list that exists\n});\n```\n\n#### RxJS version ####\n\nIn RxJS, we can iterate over the files as above using `Rx.Observable.from`, calling `concatMap` to call `fs.exists` and then calling `first` to get the first matching file project forward the file name and whether the file exists.\n\n```js\nvar Rx = require('rx'),\n    fs = require('fs');\n\nvar files = ['file1.txt', 'file2.txt', 'file3.txt'];\n\nvar exists = Rx.Observable.fromCallback(fs.exists);\n\nRx.Observable\n  .from(files)\n  .concatMap(\n    function (file) { return exists(file); },\n    function (file, exists) { return {file: file, exists: exists}})\n  .first(function (x) { return x.exists; })\n  .forEach(\n      function (result) {\n        // result now equals the first file in the list that exists\n      });\n```\n\n* * *\n\n## `async.some` ##\n\nThe `async.some` method returns `true` if at least one element in the array satisfies an async test. The callback for each iterator call only accepts a single argument of true or false, it does not accept an error argument first! This is in-line with the way node libraries work with truth tests like fs.exists. Once any iterator call returns true, the main callback is immediately called.\n\n#### async version ####\n\nIn this example, we'll determine whether the file exists by calling `fs.exists` for each file given and have the results returned as an array.\n\n```js\nvar async = require('async'),\n    fs = require('fs');\n\nvar files = ['file1.txt', 'file2.txt', 'file3.txt'];\n\nasync.some(files, fs.exists, function (result){\n    // if result is true then at least one of the files exists\n});\n```\n\n#### RxJS version ####\n\nUsing RxJS, we can achieve the same results of an array of all of our values by wrapping the `fs.exists` method using our `Rx.Observable.fromCallback` as it only has one result, a `true` or `false` value instead of the usual callback with error and result.  Then we'll iterate using the `Rx.Observable.for` method, then call `some` to determine whether any match.\n\n```js\nvar Rx = require('rx'),\n    fs = require('fs');\n\nvar files = ['file1.txt', 'file2.txt', 'file3.txt'];\n\nvar exists = Rx.Observable.fromCallback(fs.exists);\n\nRx.Observable\n    .for(files, function (file) { return exists(file); })\n    .some()\n    .forEach(\n      function (results) {\n        // if result is true then at least one of the files exists\n      });\n```\n\n* * *\n\n## `async.every` ##\n\nThe `async.every` method returns `true` if every element in the array satisfies an async test. The callback for each iterator call only accepts a single argument of true or false, it does not accept an error argument first! This is in-line with the way node libraries work with truth tests like fs.exists.\n\n#### async version ####\n\nIn this example, we'll determine whether the file exists by calling `fs.exists` for each file given and have the results returned as an array.\n\n```js\nvar async = require('async'),\n    fs = require('fs');\n\nvar files = ['file1.txt', 'file2.txt', 'file3.txt'];\n\nasync.every(files, fs.exists, function (result) {\n  // if result is true then every file exists\n});\n```\n\n#### RxJS version ####\n\nUsing RxJS, we can achieve the same results of an array of all of our values by wrapping the `fs.exists` method using our `Rx.Observable.fromCallback` as it only has one result, a `true` or `false` value instead of the usual callback with error and result.  Then we'll iterate using the `Rx.Observable.for` method, then call `every` to determine whether all match.\n\n```js\nvar Rx = require('rx'),\n    fs = require('fs');\n\nvar files = ['file1.txt', 'file2.txt', 'file3.txt'];\n\nvar exists = Rx.Observable.fromCallback(fs.exists);\n\nRx.Observable\n  .for(files, function (file) { return exists(file); })\n  .every(function (x) { return x; })\n  .forEach(\n    function (results) {\n        // if result is true then every file exists\n    });\n```\n\n* * *\n\n## `async.concat` ##\n\nThe `async.concat` method applies an iterator to each item in a list, concatenating the results. Returns the concatenated list. The iterators are called in parallel, and the results are concatenated as they return.\n\n#### async version ####\n\nIn this example, we'll determine whether the file exists by calling `fs.exists` for each file given and have the results returned as an array.\n\n```js\nvar async = require('async'),\n    fs = require('fs');\n\nvar directories = ['dir1', 'dir2', 'dir3'];\n\nasync.concat(directories, fs.readdir, function (err, files) {\n  // files is now a list of filenames that exist in the 3 directories\n});\n```\n\n#### RxJS version ####\n\nUsing RxJS, we can achieve the same results of an array of all of our values by wrapping the `fs.readdir` method using our `Rx.Observable.fromNodeCallback`.  Then we'll iterate using the `Rx.Observable.for` method, then call `reduce` to add each item to the item to the overall list.\n\n```js\nvar Rx = require('rx'),\n    fs = require('fs');\n\nvar directories = ['dir1', 'dir2', 'dir3'];\n\nvar readdir = Rx.Observable.fromNodeCallback(fs.readdir);\n\nRx.Observable\n  .for(directories, function (dir) { return readdir(dir); })\n  .reduce(function (acc, x) { return acc.concat(x) }, [])\n  .forEach(\n    function (files) {\n      // files is now a list of filenames that exist in the 3 directories\n    },\n    function (err) {\n      // handle error\n    });\n```\n\n* * *\n\n## `async.series` ##\n\nThe `async.series` runs an array of functions in series, each one running once the previous function has completed. If any functions in the series pass an error to its callback, no more functions are run and the callback for the series is immediately called with the value of the error. Once the tasks have completed, the results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be run as a function and the results will be passed to the final callback as an object instead of an array. This can be a more readable way of handling results from async.series.\n\n#### async version ####\n\nIn this example we'll run some examples with both an array or an object.\n\n```js\nvar async = require('async');\n\nasync.series([\n  function(callback){\n    // do some stuff ...\n    callback(null, 'one');\n  },\n  function(callback){\n    // do some more stuff ...\n    callback(null, 'two');\n  }\n],\n// optional callback\nfunction(err, results){\n  // results is now equal to ['one', 'two']\n});\n\n// an example using an object instead of an array\nasync.series({\n  one: function(callback){\n    setTimeout(function(){\n        callback(null, 1);\n    }, 200);\n  },\n  two: function(callback){\n    setTimeout(function(){\n        callback(null, 2);\n    }, 100);\n  }\n},\nfunction(err, results) {\n  // results is now equal to: {one: 1, two: 2}\n});\n```\n\n#### RxJS version ####\n\nWe can achieve the same functionality of `async.series` with an array by simply calling `from` and calling `concatAll` to give us the observable of the current.  Then we'll call `toArray` to add each item to a new array to return.\n\n```js\nvar Rx = require('rx');\n\nfunction wrapArray (items) {\n  return Rx.Observable\n    .from(items)\n    .concatAll()\n    .toArray();\n}\n\nwrapArray([\n    Rx.Observable.just('one'),\n    Rx.Observable.just('two')\n  ])\n  .forEach(\n    function (results) {\n      console.log(results);\n    },\n    function (err) {\n      console.log('Error: %s', err);\n    }\n  );\n\n// => ['one', 'two']\n```\n\nUsing an object literal can also be achieved with a little bit more work in which we call `pairs` to get the key/value pairs from the object.  Then we'll call `concatMap` to extract both the key, and the eventual value through the `map` function on the value's `Observable`.  Then we can call `reduce` to build up a new object to return.\n\n```js\nvar Rx = require('rx');\n\nfunction wrapObject (obj) {\n  return Rx.Observable\n    .pairs(obj)\n    .concatMap(function (o) {\n      return o[1].map(function (v) { return [o[0], v]});\n    })\n    .reduce(function (acc, x) {\n      var obj = Object.create(acc);\n      obj[x[0]] = x[1];\n      return obj;\n    }, {});\n}\n\nwrapObject({\n    one: Rx.Observable.just(1),\n    two: Rx.Observable.just(2)\n  })\n  .forEach(\n    function (results) {\n      console.log(results);\n    },\n    function (err) {\n      console.log('Error: %s', err);\n    }\n  );\n\n// => { one: 1, two: 2 }\n```\n\n* * *\n\n## `async.parallel` ##\n\nThe `async.parallel` runs an array of functions in parallel, without waiting until the previous function has completed. If any of the functions pass an error to its callback, the main callback is immediately called with the value of the error. Once the tasks have completed, the results are passed to the final callback as an array.\n\nIt is also possible to use an object instead of an array. Each property will be run as a function and the results will be passed to the final callback as an object instead of an array. This can be a more readable way of handling results from async.parallel.\n\n#### async version ####\n\nIn this example we'll run some examples with both an array or an object.\n\n```js\nvar async = require('async');\n\nasync.parallel([\n    function(callback){\n      setTimeout(function(){\n        callback(null, 'one');\n      }, 200);\n    },\n    function(callback){\n      setTimeout(function(){\n        callback(null, 'two');\n      }, 100);\n    }\n  ],\n\n  // optional callback\n  function(err, results){\n      // the results array will equal ['one','two'] even though\n      // the second function had a shorter timeout.\n  });\n\n// an example using an object instead of an array\nasync.parallel({\n    one: function(callback){\n      setTimeout(function(){\n        callback(null, 1);\n      }, 200);\n    },\n    two: function(callback){\n      setTimeout(function(){\n        callback(null, 2);\n      }, 100);\n    }\n  },\n  function(err, results) {\n    // results is now equals to: {one: 1, two: 2}\n  });\n```\n\n#### RxJS version ####\n\nWe can achieve the same functionality of `async.parallel` with an array by calling `Rx.Observable.forkJoin` with our array of observable sequences.  This returns the last value from each sequence in \"parallel\".\n\n```js\nvar Rx = require('rx');\n\nfunction wrapArrayParallel (items) {\n  return Rx.Observable.forkJoin.apply(null, items);\n}\n\nwrapArrayParallel([\n    Rx.Observable.just('one'),\n    Rx.Observable.just('two')\n  ])\n  .forEach(\n    function (results) {\n      console.log(results);\n    },\n    function (err) {\n      console.log('Error: %s', err);\n    }\n  );\n\n// => ['one', 'two']\n```\n\nUsing an object literal can also be achieved with a little bit more work, but totally reasonable.  Instead of simply calling `forkJoin`, we first need to extract the observable sequences by calling `map` on the keys we obtained by `Object.keys`.  Because the order of observable sequences is deterministic, we can then call `map` to transform the array into an object, by calling `reduce` on the array, turning the array into an object with the appropriate keys.\n\n```js\nvar Rx = require('rx');\n\nfunction wrapObjectParallel (obj) {\n  var keys = Object.keys(obj);\n  var mapped = keys.map(function (key) {\n    return obj[key];\n  });\n\n  return Rx.Observable.forkJoin.apply(null, mapped)\n    .map(function (arr) {\n      var idx = 0;\n      return arr.reduce(function (acc, x) {\n        var o = Object.create(acc);\n        o[key[idx++]] = x;\n        return o;\n      }, {});\n    });\n}\n\nwrapObjectParallel({\n    one: Rx.Observable.just(1),\n    two: Rx.Observable.just(2)\n  })\n  .forEach(\n      function (results) {\n          console.log(results);\n      },\n      function (err) {\n          console.log('Error: ' + err);\n      }\n    );\n\n// => { one: 1, two: 2 }\n```\n\n* * *\n\n## `async.whilst` ##\n\nThe `async.whilst` method repeatedly call function, while test returns true. Calls the callback when stopped, or an error occurs.\n\n#### async version ####\n\nIn this example we'll just run a keep calling the callback while the count is less than 5.\n\n```js\nvar async = require('async');\n\nvar count = 0;\n\nasync.whilst(\n    function () { return count < 5; },\n    function (callback) {\n      count++;\n      setTimeout(callback, 1000);\n    },\n    function (err) {\n      // 5 seconds have passed\n    }\n);\n```\n\n#### RxJS version ####\n\nWe can achieve the same kind of functionality by using the `Rx.Observable.while` method which takes a condition and an observable sequence that we created by calling `Rx.Observable.create`.\n\n```js\nvar Rx = require('rx');\n\nvar count = 0;\n\nRx.Observable.while(\n    function () { return count < 5; },\n    Rx.Observable.create(function (observer) {\n      setTimeout(function () {\n        observer.onCompleted(count++);\n      }, 1000);\n    })\n  )\n  .subscribeOnCompleted(\n    function () { /* 5 seconds have passed */ }\n  );\n```\n\n* * *\n\n## `async.doWhilst` ##\n\nThe `async.doWhilst` method is a post check version of `whilst`. To reflect the difference in the order of operations test and fn arguments are switched. `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript.\n\n#### async version ####\n\nIn this example we'll just run a keep calling the callback while the count is less than 5.\n\n```js\nvar async = require('async');\n\nvar count = 0;\n\nasync.doWhilst(\n  function (callback) {\n    count++;\n    setTimeout(callback, 1000);\n  },\n  function () { return count < 5; },\n  function (err) {\n    // 5 seconds have passed\n  }\n);\n```\n\n#### RxJS version ####\n\nWe can achieve the same kind of functionality by using the `doWhile` on our observable sequence which takes a predicate to determine whether to continue running.\n\n```js\nvar Rx = require('rx');\n\nvar i = 0;\n\nvar source = Rx.Observable.timer(0, 1000).doWhile(\n    function () { return i++ < 5; })\n    .subscribeOnCompleted(\n      // 5 seconds have passed\n    );\n```\n\n* * *\n\n## `async.nextTick` ##\n\nThe `async.nextTick` method calls the callback on a later loop around the event loop. In node.js this just calls process.nextTick, in the browser it falls back to setImmediate(callback) if available, otherwise setTimeout(callback, 0), which means other higher priority events may precede the execution of the callback.\n\n#### async version ####\n\nIn this example we'll just run a keep calling the callback while the count is less than 5.\n\n```js\nvar async = require('async');\n\nvar call_order = [];\n\nasync.nextTick( function () {\n  call_order.push('two');\n  // call_order now equals ['one','two']\n});\n\ncall_order.push('one');\n```\n\n#### RxJS version ####\n\nWe can achieve the same thing by using the `Rx.Scheduler.timeout` scheduler to schedule an item which will optimize for the runtime, for example, using `process.nextTick` if available, or `setImmediate` if available, or other fallbacks like `MessageChannel`, `postMessage` or even an async script load.\n\n```js\nvar Rx = require('rx');\n\nvar call_order = [];\n\nRx.Scheduler.timeout.schedule(function () {\n  call_order.push('two');\n  // call_order now equals ['one','two']\n});\n\ncall_order.push('one');\n```\n\n* * *\n\n## `async.waterfall` ##\n\nThe `async.waterfall` method runs an array of functions in series, each passing their results to the next in the array. However, if any of the functions pass an error to the callback, the next function is not executed and the main callback is immediately called with the error.\n\n#### async version ####\n\nIn this example, we'll check whether a file exists, then rename it and finally return its [stats](http://nodejs.org/api/fs.html#fs_class_fs_stats).\n\n```js\nvar async = require('async'),\n    fs = require('fs'),\n    path = require('path');\n\n// Get file and destination\nvar file = path.join(__dirname, 'file.txt'),\n    dest = path.join(__dirname, 'file1.txt');\n\nasync.waterfall([\n    function (callback) {\n      fs.exists(file, function (flag) {\n        if (!flag) {\n            callback(new Error('File does not exist.'))\n        } else {\n            callback(null);\n        }\n      });\n    },\n    function (callback) {\n      fs.rename(file, dest, function (err) {\n        callback(err);\n      });\n    },\n    function (callback) {\n      fs.stat(dest, function (err, fsStat) {\n        callback(err, fsStat);\n      });\n    }\n  ],\n  function (err, fsStat) {\n    if (err) {\n      console.log(err);\n    } else {\n      console.log(JSON.stringify(fsStat));\n    }\n  });\n```\n\n#### RxJS version ####\n\nWe can easily accomplish the same task as above using our wrappers for `Rx.Observable.fromCallback` and `Rx.Observable.fromNodeCallback`, creating a waterfall-like just using `concatMap`.  We can now use it such as the following, wrapping `fs.exists`, `fs.rename` and `fs.stat`.\n\n```js\nvar Rx = require('rx'),\n    fs = require('fs'),\n    path = require('path');\n\nvar file = path.join(__dirname, 'file.txt'),\n    dest = path.join(__dirname, 'file1.txt'),\n    exists = Rx.Observable.fromCallback(fs.exists),\n    rename = Rx.Observable.fromNodeCallback(fs.rename),\n    stat = Rx.Observable.fromNodeCallback(fs.stat);\n\nexists(file)\n  .concatMap(function (flag) {\n    return flag ?\n      rename(file, dest) :\n      Rx.Observable.throw(new Error('File does not exist.'));\n  })\n  .concatMap(function () {\n    return stat(dest);\n  })\n  .forEach(\n    function (fsStat) {\n      console.log(JSON.stringify(fsStat));\n    },\n    function (err) {\n      console.log(err);\n    }\n  );\n```\n\n* * *\n\n## `async.compose` ##\n\nThe [`async.compose`](https://github.com/caolan/async#composefn1-fn2) method creates a function which is a composition of the passed asynchronous functions. Each function consumes the return value of the function that follows. Composing functions f(), g() and h() would produce the result of f(g(h())), only this version uses callbacks to obtain the return values.\n\nEach function is executed with the `this` binding of the composed function.\n\n#### async version ####\n\nIn this example, we'll chain together two functions, one to add 1 to a supplied argument, and then chain it to another to multiply the result by 3.\n\n```js\nvar async = require('async');\n\nfunction add1(n, callback) {\n    setTimeout(function () {\n        callback(null, n + 1);\n    }, 10);\n}\n\nfunction mul3(n, callback) {\n    setTimeout(function () {\n        callback(null, n * 3);\n    }, 10);\n}\n\nvar add1mul3 = async.compose(mul3, add1);\n\nadd1mul3(4, function (err, result) {\n   console.log(result);\n});\n\n// => 15\n```\n\n#### RxJS version ####\n\nUsing RxJS, we can accomplish this using the usual composition operator for sequential operations `concatMap`.  We'll wrap the `setTimeout` with a `wrapTimeout` method and ensure that we do deterministic cleanup via `clearTimeout`.  Then we can compose together our `add1` and `mul3` functions which result in observable sequences.\n\n```js\nvar Rx = require('rx');\n\nfunction wrapTimeout (fn, arg) {\n  return Rx.Observable.create(function (obs) {\n\n    // Ensure the composition of the this argument\n    var id = setTimeout(function () {\n        obs.onNext(fn.call(fn, arg));\n        obs.onCompleted();\n    }, 10);\n\n    // Handle cleanup/early disposal\n    return function () {\n      clearTimeout(id);\n    };\n  });\n}\n\nfunction add1 (n) {\n  return wrapTimeout(function (x) { return x + 1; }, n);\n}\n\nfunction mul3 (n) {\n  return wrapTimeout(function (x) { return x * 3; }, n);\n}\n\nadd1(4)\n  .concatMap(mul3)\n  .forEach(\n    function (x) {\n      console.log(x);\n    },\n    function (err) {\n      console.log('Error: %s', e);\n    });\n// => 15\n```\n\n* * *\n"
  },
  {
    "path": "doc/mapping/async/whyrx.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n"
  },
  {
    "path": "doc/mapping/bacon.js/comparing.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n"
  },
  {
    "path": "doc/mapping/bacon.js/whyrx.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS for Bacon.js Users #\n\n[Bacon.js](https://github.com/baconjs/bacon.js) is a popular Reactive Programming library which was inspired by RxJS, ReactiveBanana among other libraries.  \n\nBut, before we get started, why use RxJS over Bacon.js?\n\n### Performance ###\n\nRxJS has always been committed to providing the best performance available on any given JavaScript platform.  Whether it is providing a small footprint for an `Observable` instance, to providing the capability of using `setImmediate` versus `setTimeout` versus `requestAnimationFrame`, all by choosing a different scheduler.  In addition, since RxJS is written in regular JavaScript versus CoffeeScript, there are a lot more optimizations that can be made by hand to ensure performance.\n\nTo make this more concrete, there is a project called [Kefir](https://github.com/rpominov/kefir) which is trying to make a more performance oriented version of Bacon.js.  Here are some current numbers based upon the memory tests provided by Kefir.  Note that these may change over time, but gives you a good indication of memory consumption.  Below will be comparison of `combineLatest`, `filter`, `map`, and `scan`.\n\n```\nstream1.combine(stream2, ->) (1000 samples)\n----------------------------------------------------------------\nKefir   w/o subscr. 0.44 KiB   w/ subscr. +0.80 KiB   sum 1.23 KiB\nBacon   w/o subscr. 5.42 KiB   w/ subscr. +6.15 KiB   sum 11.57 KiB\nRx      w/o subscr. 0.43 KiB   w/ subscr. +2.84 KiB   sum 3.26 KiB\n-----------------------\nKefir 1.00 1.00 1.00    Bacon 12.45 7.71 9.39    Rx 0.98 3.56 2.65\n\n.filter(->) (1000 samples)\n----------------------------------------------------------------\nKefir   w/o subscr. 0.31 KiB   w/ subscr. +0.46 KiB   sum 0.77 KiB\nBacon   w/o subscr. 1.82 KiB   w/ subscr. +2.49 KiB   sum 4.31 KiB\nRx      w/o subscr. 0.37 KiB   w/ subscr. +1.44 KiB   sum 1.81 KiB\n-----------------------\nKefir 1.00 1.00 1.00    Bacon 5.91 5.39 5.60    Rx 1.21 3.11 2.35\n\n.map(->) (1000 samples)\n----------------------------------------------------------------\nKefir   w/o subscr. 0.30 KiB   w/ subscr. +0.47 KiB   sum 0.77 KiB\nBacon   w/o subscr. 1.81 KiB   w/ subscr. +2.49 KiB   sum 4.30 KiB\nRx      w/o subscr. 0.37 KiB   w/ subscr. +1.43 KiB   sum 1.81 KiB\n-----------------------\nKefir 1.00 1.00 1.00    Bacon 6.07 5.31 5.60    Rx 1.24 3.06 2.35\n\n.scan(0, ->) (1000 samples)\n----------------------------------------------------------------\nKefir   w/o subscr. 0.30 KiB   w/ subscr. +0.47 KiB   sum 0.76 KiB\nBacon   w/o subscr. 1.68 KiB   w/ subscr. +2.06 KiB   sum 3.75 KiB\nRx      w/o subscr. 0.39 KiB   w/ subscr. +1.13 KiB   sum 1.52 KiB\n-----------------------\nKefir 1.00 1.00 1.00    Bacon 5.62 4.44 4.90    Rx 1.29 2.43 1.99\n```\n\nAs you'll note, while Kefir does pretty well here, Bacon.js does not.  Bacon.js has a fairly heavy Observable object to start with and then subscriptions are fairly heavy as well.  With both Kefir and RxJS, the initial size of the Observable is about the same.  We'll get to the other fine tuning such as schedulers in the later section.\n\n## Interoperability With The Libraries You Use ##\n\nOne of the most important parts of when choosing a library is how well it works with the libraries you already use. Bacon.js ties itself directly to [jQuery](http://jquery.com) and [Zepto.js](http://zeptojs.com) for event binding with `asEventStream`.   Not only that, but adding support for your own custom library's binding is difficult, whereas with RxJS it couldn't be easier.\n\nRxJS, on the other hand is more flexible about binding to the libraries you use.  For example, if you use [jQuery](http://jquery.com) or [Zepto.js](http://zeptojs.com), `Rx.Observable.fromEvent` will work perfectly for you. In addition, we also support the other libraries out of the box:\n- [AngularJS](http://angularjs.org)\n- [Backbone.js](http://backbonejs.org)\n- [Ember.js](http://emberjs.com)\n\nYou can also override this behavior in `fromEvent` so that you use native DOM or Node.js events via the `EventEmitter` directly by setting the `Rx.config.useNativeEvents` flag to true, so that it's never in doubt which event system you are using.  When using native DOM events, you can attach a listener to one item, or you can attach listeners to a NodeList's children, we figure that out for you without you having to change your code, whereas Bacon.js does not.\n\nIn order to support the libraries you use, it's very simple to add your own event binding, for example we can bind our events to the [Dojo Toolkit](http://dojotoolkit.org) using the `Rx.Observable.fromEventPattern` method:\n\n```js\nrequire(['dojo/on', 'dojo/dom', 'rx'], function (on, dom, rx) {\n\n  var input = dom.byId('input');\n\n  var source = Rx.Observable.fromEventPattern(\n    function addHandler (h) {\n      return on(input, 'click', h);\n    },\n    function delHandler (_, signal) {\n      signal.remove();\n    }\n  );\n\n  var subscription = source.subscribeOnNext(function (x) {\n    console.log('Next: Clicked!');\n  });\n\n  on.emit(input, 'click');\n  // => Next: Clicked!\n});\n```\n\nIn addition, transducers hold a great amount of potential for high performance querying, and to that end, RxJS has added [transducers support](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/transducers.md) via the `transduce` method.\n\n```js\nvar t = transducers;\n\nvar source = Rx.Observable.range(1, 4);\n\nfunction increment(x) { return x + 1; }\nfunction isEven(x) { return x % 2 === 0; }\n\nvar transduced = source.transduce(t.comp(t.map(increment), t.filter(isEven)));\n\ntransduced.subscribe(\n  function (x) { console.log('Next: %s', x); },\n  function (e) { console.log('Error: %s', e); },\n  function ()  { console.log('Completed'); });\n\n// => Next: 2\n// => Next: 4\n// => Completed\n```\n\n## Browser Compatibility ##\n\nBrowser and runtime compatibility is important to RxJS.  For example, it can run not only in the browser, but also Node.js, RingoJS, Narwhal, Nashorn, and event Windows Scripting Host (WSH).  We realize that there are many users out there without access to the latest browser, so we do the best to accommodate this with our `compat` builds.  These builds bridge all the way back to IE6 for support which includes using `attachEvent` with event normalization, to DOM Level 1 events.  Bacon.js does not have this behavior, and instead falls back to hoping that you use jQuery.\n\nWe also want to build RxJS for speed with asynchronous operations, so we optimize for the browser and runtime you are using.  For example, if your environment supports `setImmediate` for immediate execution, we will use that.  Else, if you're in Node.js and `setImmediate` is not available, it falls back to `process.nextTick`.  For browsers and runtimes that do not support `setImmediate`, we will fall back to `postMessage`, to `MessageChannel`, to asynchronous script loading, and finally defaulting back to `setTimeout` or event `WScript.Sleep` for Windows Scripting Host.\n\nThese `compat` files are important as we will shim behavior that we require such as `Array#extras`, `Function#bind` and so forth, so there is no need to bring in your own compatibility library such as html5shiv, although if they do exist already, we will use the native or shimmed methods directly.\n\n## Standards Based ##\n\n### Iterables and Array#extras ###\n\nRxJS has a firm commitment to standards in JavaScript.  Whether it is supporting the `Array#extras` standard method signatures such as `map`, `filter`, `reduce`, `every` and `some`, or to some new emerging standard on collections, RxJS will implement these features accordingly from pull collections to push.  Unlike Bacon.js, RxJS conforms to `Array#extras` syntax to have the callback style of `function (item, index, collection)` in addition to accepting a `thisArg` for the calling context of the callback.  This helps as you can easily reuse your code from the Array version to Observable version.\n\nAn example of forward thinking is the introduction of ES6+ operators on Array with implementations on Observable such as:\n- `includes`\n- `find`\n- `findIndex`\n- `from`\n- `of`\n\nIn addition, RxJS supports ES6 iterables in many methods which allow you to accept `Map`, `Set`, `Array` and array-like objects, for example in `Rx.Observable.from`, `flatMap`, `concatMap` among others.  RxJS also has the capability of converting to Maps and Sets via the `toMap` and `toSet` methods if available in your runtime.\n\nThis makes the following code possible to yield an array from an observable sequence and have it automatically converted into an observable sequence.\n\n```js\nRx.Observable.range(1, 3)\n  .flatMap(function (x, i) { return [x, i]; })\n  .subscribeOnNext(function (value) {\n    console.log('Value: %o', value);\n  });\n// => 1\n// => 0\n// => 2\n// => 1\n// => 3\n// => 2\n```\n\n### Generators ###\n\nGenerators also play a big part in the next version of JavaScript.  RxJS also takes [full advantage of generators](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/generators.md) as iterables in such methods as the aforementioned `Rx.Observable.from`, `flatMap`, `concatMap` and other methods.  For example, you can yield values like the following:\n\n```js\nvar source = Rx.Observable.from(\n  function* () { yield 1; yield 2; yield 3; }()\n);\n\nsource.subscribeOnNext(function (value) {\n  console.log('Next: %s', value);\n});\n\n// => 1\n// => 2\n// => 3\n```\n\nGenerators also give the developer pretty powerful capabilities when dealing with asynchronous actions.  RxJS introduced the `Rx.Observable.spawn` method which allows you to write async/await style code over Observables, Promises, Arrays, and just plain objects.\n\n```js\nvar spawned = Rx.Observable.spawn(function* () {\n  var x = yield Rx.Observable.just(42);\n  var y = yield Promise.resolve(42);\n  console.log(x + y);\n\n  try {\n    var source = yield Rx.Observable.throw(new Error('woops'));\n    console.log('Source is: %s', source);\n  } catch (e) {\n    console.log('Catched: %s', e.message);\n  }\n});\n\nspawned.subscribe();\n// => 84\n// => Source is: Error: woops\n```\n\n### Promises ###\n\nPromises have been a great way for developers to express single value asynchronous values.  With ES6, they have now been standardized and are starting to appear in all browsers.  RxJS also supports `Promise` values as arguments in many places as noted in our [Bridging to Promises](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/promises.md) documentation.  No more having to call `Rx.Observable.fromPromise` everywhere, RxJS automatically converts them for you.\n\n```js\nvar source = Rx.Observable.fromEvent(input, 'keyup')\n  .map(function (e) { return e.target.value; })\n  .flatMapLatest(function (text) {\n    return queryPromise(text);\n  });\n```\n\nRxJS also allows an Observable sequence to be converted to an ES6 compliant `Promise` with the `toPromise` method.\n```js\nRx.Observable.just(42)\n  .toPromise()\n  .then(function (value) {\n    console.log(value);\n  });\n// => 42\n```\n\n## Swappable Concurrency Layer ##\n\nRxJS can easily be described in three pieces. First the `Observer` and `Observable` objects, secondly by the operators for composition on top of them, and finally a swappable concurrency layer which allows you to swap out your concurrency model at any time.  This last part is key which distinguishes RxJS from many other libraries.  There are a number of advantages to this approach that may be subtle at first, but invaluable as you start to use them.\n\nThe first advantage is that you can switch where callbacks are executed, for example, instead of using `setImmediate` or any of its fallbacks, you can execute the callback on `window.requestAnimationFrame` for smooth animations.\n\n```js\n// Available in RxJS-DOM project\nvar scheduler = Rx.Scheduler.requestAnimationFrame;\n\nfunction render(value) {\n  // Do something to render the value\n}\n\nRx.Observable.range(1, 100, scheduler)\n  .subscribe(render);\n```\n\nSchedulers also have advantages with virtual time, which means we can say what time it really is. This is great for deterministic testing in which you can verify the behavior of every single operator.  RxJS, through the `TestScheduler` can record when items happen and what values were yielded, thus no need for asynchronous testing.\n\n```js\nvar scheduler = new TestScheduler();\n\nvar xs = scheduler.createHotObservable(\n  Rx.ReactiveTest.onNext(201, 1),\n  Rx.ReactiveTest.onCompleted(202)\n);\n\nvar results = scheduler.startWithCreate(function () {\n  return xs.map(function (x, i) { return x + x + i });\n});\n\n// Some custom collection assertion for values\ncollectionAssert.assertEqual(results.messages, [\n  Rx.ReactiveTest.onNext(201, 2),\n  Rx.ReactiveTest.onCompleted(202)\n]);\n\n// Some custom collection assertion for subscriptions\ncollectionAssert.assertEqual(xs.subscriptions, [\n  Rx.ReactiveTest.subscribe(200, 202)\n])\n```\n\nEvery operator within RxJS has tests written in this style where all data is easily verified.  Not only can we create observables through the `TestScheduler`, but we can create Promises via the `createResolvedPromise` and `createRejectedPromise` methods.\n\nVirtual time has more advantages as well.  Imagine if you had some historical stock data that you wanted to run through a simulation.  Using the `Historical` scheduler, you can easily accomplish this.\n\n```js\nvar scheduler = new Rx.HistoricalScheduler(new Date(2014, 1));\n\nvar source = new Rx.Subject();\n\ngetStockData().forEach(function (stock) {\n  scheduler.scheduleWithAbsolute(stock.date, function () {\n    stock.onNext(stock);\n  });\n});\n\n// Calculate with the data\nsource.groupBy(function (stock) { return stock.symbol; })\n  /* Do something with the data */\n  .subscribe(function (info) {\n    // Process the data\n  });\n```\n\n## Backpressure ##\n\nIn our applications, we consume a lot of data from external sources.  But, what if our consumers (Observers) cannot handle the load from the observable sequence?  RxJS has a number of mechanisms to handle this in the [Backpressure and Observable Sequences](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/backpressure.md) documentation.  This could come in the form of lossy operations such as `debounce`, `throttleFirst`, `sample`, `pausable`, to loss-less operations such as `pausableBuffered`, `buffer`, etc.\n\n## Build What You Want ##\n\nRxJS has a rather large surface area, so we give you the ability to build RxJS with only the things you want and none of the things you don't via the [`rx-cli`](https://www.npmjs.org/package/rx-cli) project.  For example, we can build a `compat` version of RxJS with only the `map`, `flatMap`, `takeUntil`, and `fromEvent` methods, which keeps your RxJS version lean and mean.\n\n```bash\nrx --lite --compat --methods map,flatmap,takeuntil,fromevent\n```\n\n## Long Stack Trace Support ##\n\nDebugging programming with callbacks can be quite cumbersome.  To that end, RxJS has introduced a notion of \"Long Stack Traces\" which allows you to quickly isolate your code from the plumbing not only of RxJS, but also Node.js and the browser cruft, thus getting you to the real cause of the issue.\n\nFor example, without \"long stack trace\" support, typically, an error would look like the following:\n\n```js\nvar Rx = require('rx');\n\nvar source = Rx.Observable.range(0, 100)\n  .timestamp()\n  .map(function (x) {\n    if (x.value > 98) throw new Error();\n    return x;\n  });\n\nsource.subscribeOnError(\n  function (err) {\n    console.log(err.stack);\n  });\n  ```\n\n  ```bash\n  $ node example.js\n\n    Error\n    at C:\\GitHub\\example.js:6:29\n    at AnonymousObserver._onNext (C:\\GitHub\\rxjs\\dist\\rx.all.js:4013:31)\n    at AnonymousObserver.Rx.AnonymousObserver.AnonymousObserver.next (C:\\GitHub\\rxjs\\dist\\rx.all.js:1863:12)\n    at AnonymousObserver.Rx.internals.AbstractObserver.AbstractObserver.onNext (C:\\GitHub\\rxjs\\dist\\rx.all.js:1795:35)\n    at AutoDetachObserverPrototype.next (C:\\GitHub\\rxjs\\dist\\rx.all.js:9226:23)\n    at AutoDetachObserver.Rx.internals.AbstractObserver.AbstractObserver.onNext (C:\\GitHub\\rxjs\\dist\\rx.all.js:1795:35)\n    at AnonymousObserver._onNext (C:\\GitHub\\rxjs\\dist\\rx.all.js:4018:18)\n    at AnonymousObserver.Rx.AnonymousObserver.AnonymousObserver.next (C:\\GitHub\\rxjs\\dist\\rx.all.js:1863:12)\n    at AnonymousObserver.Rx.internals.AbstractObserver.AbstractObserver.onNext (C:\\GitHub\\rxjs\\dist\\rx.all.js:1795:35)\n    at AutoDetachObserverPrototype.next (C:\\GitHub\\rxjs\\dist\\rx.all.js:9226:23)\n  ```\n\n  This can be remedied using \"long stack trace\" support by setting the following flag:\n  ```js\n  Rx.config.longStackSupport = true;\n  ```\n\n  Then we can run our program again using this support\n  ```bash\n  $ node example.js\n  \n    Error\n    at C:\\GitHub\\example.js:6:29\n    From previous event:\n    at Object.<anonymous> (C:\\GitHub\\example.js:3:28)\n    From previous event:\n    at Object.<anonymous> (C:\\GitHub\\example.js:4:4)\n    From previous event:\n    at Object.<anonymous> (C:\\GitHub\\example.js:5:4)\n  ```\n\n## Many Examples and Tutorials ##\n\nAs people try to learn RxJS, it's always great to have [examples](https://github.com/Reactive-Extensions/RxJS/tree/master/examples) to get them started.  To that end, RxJS ships a number of examples out of the box including simple scenarios such as Autocomplete, Follow the Mouse, Drawing, to more complete examples like databinding using a little demo project called `TKO`, to a complete game of Alphabet Invasion.\n\nWant to learn RxJS at your own pace?  We also have tutorials for that as well called [LearnRx](http://reactivex.io/learnrx/) which will walk you through the basics of learning to compose arrays, and then how that applies to observable sequences.\n\nThere are also many [community resources](https://github.com/Reactive-Extensions/RxJS#resources) to learn RxJS from videos, to presentations, to examples with integration with such libraries as AngularJS and React.\n\n## Extensive Documentation ##\n\nAs stated before, RxJS has a rather large surface area so sometimes it's hard to know where to start.  To that end, RxJS has [complete API documentation](https://github.com/Reactive-Extensions/RxJS/tree/master/doc#reactive-extensions-class-library), as well as a [Getting Started Guide](https://github.com/Reactive-Extensions/RxJS/tree/master/doc#getting-started-with-rxjs) as well as [Guidelines](https://github.com/Reactive-Extensions/RxJS/tree/master/doc#rxjs-guidelines), a [How Do I?](https://github.com/Reactive-Extensions/RxJS/tree/master/doc#how-do-i) section as well as a [growing list of comparisons with other libraries](https://github.com/Reactive-Extensions/RxJS/tree/master/doc#mapping-rxjs-from-different-libraries).\n"
  },
  {
    "path": "doc/mapping/highland/comparing.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n"
  },
  {
    "path": "doc/mapping/highland/whyrx.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS for Highland.js Users #\n\n[Highland.js](http://highlandjs.org/) is a general purpose utility belt for handling both synchronous and asynchronous code.  It is built upon node.js with EventEmitters and Streams with a focus on composition.\n\nBut, before we get started, why use RxJS over Highland.js?\n\n### Uses an Array#extras interface instead of node.js Streams ###\n\nHighland.js is built upon node.js infrastructure, including Streams.  This is great if you're a node developer using streams, but there are many who do not and simply use callbacks and events.  In addition, Streams are hard to get right, hence the changes between Streams 1, 2 and 3 with regards to pause/resume, high water marks, draining, etc.  The [Streams Handbook](https://github.com/substack/stream-handbook) is a great way to get started looking at streams as an approach.  \n\nThe Reactive Extensions are built on a language and runtime neutral approach that works great across languages, whether it is Java, .NET, Python, Ruby, Scala, Clojure, and JavaScript.  This approach allows you easily to switch between Java, JavaScript, and .NET, and get a familiar feel between all the versions.  RxJS was built upon the concept with the Array#extras in mind, where if you know Arrays in JavaScript, then you know RxJS.  The only real difference is the possible element of time, and a push model instead of the Array's pull model.\n\nFor example, you can write the following using Arrays in JavaScript.\n```js\nvar source = Array.of(1,2,3,4,5);\n\nsource\n  .map(function (x, i, a) { return x * x; })\n  .filter(function (x, i, a) { return x % 3 === 0; })\n  .forEach(function (x, i, a) {\n    console.log('next', x);\n  });\n```\n\nThe same can then be done using RxJS with only one small code change of changing `Array` to `Rx.Observable`.\n```js\nvar source = Rx.Observable.of(1,2,3,4,5);\n\nsource\n  .map(function (x, i, a) { return x * x; })\n  .filter(function (x, i, a) { return x % 3 === 0; })\n  .forEach(function (x, i, a) {\n    console.log('next', x);\n  });\n```\n\n### No Reliance on node.js Infrastructure ###\n\nHighland.js is built upon node.js infrastructure using both the `EventEmitter` and `Stream` class which bring a number of dependencies with it for Browserify to make it work for the browser., including the many drawbacks of the ever changing Streams designs within node.js.  As it interoperates with existing streams, they may or may not be well behaved in whether they will actually pause or not and whether backpressure actually works.  These were key reasons for changes between Streams 1, 2 and 3.\n\nInstead, RxJS takes a clean room approach with no external dependencies, which allows for a cleaner design without the technical debt of the `Stream` and `EventEmitter` designs in node.js.   RxJS is built from scratch on a solid platform of the core objects of `Observer`, `Observable`, operators for composition, and `Scheduler` for controlling concurrency.  \n\n## Interoperability With Libraries and the DOM ##\n\nOne of the most important parts of when choosing a library is how well it works with the libraries you already use. Highland.js, by default, ties itself directly to [jQuery](http://jquery.com) or any kind of event emitter with an `on` method, such as [Zepto.js](http://zeptojs.com) for all DOM event binding, with no deterministic way of unbinding that added event handler.  For everything else, `EventEmitters` are used for eventing.\n\nRxJS, on the other hand is more flexible about binding to the libraries you use or to the plain old DOM.  You can bind directly to the DOM elements using `Rx.Observable.fromEvent` which binds not only to a standard DOM Element, but also DOM NodeLists, etc directly, with deterministic disposal of events.\n\nFor external libraries, if you use [jQuery](http://jquery.com) or [Zepto.js](http://zeptojs.com), `Rx.Observable.fromEvent` will work perfectly for you. In addition, we also support the other libraries out of the box:\n- [AngularJS](http://angularjs.org)\n- [Backbone.js](http://backbonejs.org)\n- [Ember.js](http://emberjs.org)\n\nYou can also override this behavior in `fromEvent` so that you use native DOM or Node.js events via the `EventEmitter` directly by setting the `Rx.config.useNativeEvents` flag to true, so that it's never in doubt which event system you are using.  When using native DOM events, you can attach a listener to one item, or you can attach listeners to a NodeList's children, we figure that out for you without you having to change your code.\n\nIn order to support the libraries you use, it's very simple to add your own event binding, for example we can bind our events to the [Dojo Toolkit](http://dojotoolkit.org) using the `Rx.Observable.fromEventPattern` method:\n\n```js\nrequire(['dojo/on', 'dojo/dom', 'rx'], function (on, dom, rx) {\n\n  var input = dom.byId('input');\n\n  var source = Rx.Observable.fromEventPattern(\n    function addHandler (h) {\n      return on(input, 'click', h);\n    },\n    function delHandler (_, signal) {\n      signal.remove();\n    }\n  );\n\n  var subscription = source.subscribeOnNext(function (x) {\n    console.log('Next: Clicked!');\n  });\n\n  on.emit(input, 'click');\n  // => Next: Clicked!\n});\n```\n\nIn addition, transducers hold a great amount of potential for high performance querying, and to that end, RxJS has added [transducers support](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/transducers.md) via the `transduce` method.\n\n```js\nvar t = transducers;\n\nvar source = Rx.Observable.range(1, 4);\n\nfunction increment(x) { return x + 1; }\nfunction isEven(x) { return x % 2 === 0; }\n\nvar transduced = source.transduce(t.comp(t.map(increment), t.filter(isEven)));\n\ntransduced.subscribe(\n  function (x) { console.log('Next: %s', x); },\n  function (e) { console.log('Error: %s', e); },\n  function ()  { console.log('Completed'); });\n\n  // => Next: 2\n  // => Next: 4\n  // => Completed\n  ```\n\n## Browser Compatibility ##\n\nBrowser and runtime compatibility is important to RxJS.  For example, it can run not only in the browser, but also Node.js, RingoJS, Narwhal, Nashorn, and even Windows Scripting Host (WSH).  We realize that there are many users out there without access to the latest browser, so we do the best to accommodate this with our `compat` builds.  These builds bridge all the way back to IE6 for support which includes using `attachEvent` with event normalization, to DOM Level 1 events.  Highland.js does not have this behavior, and instead relies solely on `EventEmitter` or jQuery for events support.\n\nWe also want to build RxJS for speed with asynchronous operations, so we optimize for the browser and runtime you are using.  For example, if your environment supports `setImmediate` for immediate execution, we will use that.  Else, if you're in Node.js and `setImmediate` is not available, it falls back to `process.nextTick`.  For browsers and runtimes that do not support `setImmediate`, we will fall back to `postMessage`, to `MessageChannel`, to asynchronous script loading, and finally defaulting back to `setTimeout` or event `WScript.Sleep` for Windows Scripting Host.\n\nThese `compat` files are important as we will shim behavior that we require such as `Array#extras`, `Function#bind` and so forth, so there is no need to bring in your own compatibility library such as html5shiv, although if they do exist already, we will use the native or shimmed methods directly.\n\n## Standards Based ##\n\n### Iterables and Array#extras ###\n\nRxJS has a firm commitment to standards in JavaScript.  Whether it is supporting the `Array#extras` standard method signatures such as `map`, `filter`, `reduce`, `every` and `some`, or to some new emerging standard on collections, RxJS will implement these features accordingly from pull collections to push.  Unlike Highland.js, RxJS conforms to `Array#extras` syntax to have the callback style of `function (item, index, collection)` in addition to accepting a `thisArg` for the calling context of the callback.  This helps as you can easily reuse your code from the Array version to Observable version.\n\nAn example of forward thinking is the introduction of ES6+ operators on Array with implementations on Observable such as:\n- `includes`\n- `find`\n- `findIndex`\n- `from`\n- `of`\n\nIn addition, RxJS supports ES6 iterables in many methods which allow you to accept `Map`, `Set`, `Array` and array-like objects, for example in `Rx.Observable.from`, `flatMap`, `concatMap` among others.  RxJS also has the capability of converting to Maps and Sets via the `toMap` and `toSet` methods if available in your runtime.\n\nThis makes the following code possible to yield an array from an observable sequence and have it automatically converted into an observable sequence.\n\n```js\nRx.Observable.range(1, 3)\n  .flatMap(function (x, i) { return [x, i]; })\n  .subscribeOnNext(function (value) {\n    console.log('Value: %o', value);\n  });\n// => 1\n// => 0\n// => 2\n// => 1\n// => 3\n// => 2\n```\n\n### Generators ###\n\nGenerators also play a big part in the next version of JavaScript.  RxJS also takes [full advantage of generators](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/generators.md) as iterables in such methods as the aforementioned `Rx.Observable.from`, `flatMap`, `concatMap` and other methods.  For example, you can yield values like the following:\n\n```js\nvar source = Rx.Observable.from(\n  function* () { yield 1; yield 2; yield 3; }()\n);\n\nsource.subscribeOnNext(function (value) {\n  console.log('Next: %s', value);\n});\n\n// => 1\n// => 2\n// => 3\n```\n\nGenerators also give the developer pretty powerful capabilities when dealing with asynchronous actions.  RxJS introduced the `Rx.spawn` method which allows you to write async/await style code over Observables, Promises, Arrays, and just plain objects.\n\n```js\nRx.spawn(function* () {\n  var x = yield Rx.Observable.just(42);\n  var y = yield Promise.resolve(42);\n  console.log(x + y);\n\n  try {\n    var source = yield Rx.Observable.throwError(new Error('woops'));\n  } catch (e) {\n    console.log(e.message);\n  }\n})();\n// => 84\n// => woops\n```\n\n### Promises ###\n\nPromises have been a great way for developers to express single value asynchronous values.  With ES6, they have now been standardized and are starting to appear in all browsers.  RxJS also supports `Promise` values as arguments in many places as noted in our [Bridging to Promises](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/promises.md) documentation.  No more having to call `Rx.Observable.fromPromise` everywhere, RxJS automatically converts them for you.\n\n```js\nvar source = Rx.Observable.fromEvent(input, 'keyup')\n  .map(function (e) { return e.target.value; })\n  .flatMapLatest(function (text) {\n    return queryPromise(text);\n  });\n```\n\nRxJS also allows an Observable sequence to be converted to an ES6 compliant `Promise` with the `toPromise` method.\n```js\nRx.Observable.just(42)\n  .toPromise()\n  .then(function (value) {\n    console.log(value);\n  });\n// => 42\n```\n\n## Swappable Concurrency Layer ##\n\nRxJS can easily be described in three pieces. First the `Observer` and `Observable` objects, secondly by the operators for composition on top of them, and finally a swappable concurrency layer which allows you to swap out your concurrency model at any time.  This last part is key which distinguishes RxJS from many other libraries.  There are a number of advantages to this approach that may be subtle at first, but invaluable as you start to use them.\n\nThe first advantage is that you can switch where callbacks are executed, for example, instead of using `setImmediate` or any of its fallbacks, you can execute the callback on `window.requestAnimationFrame` for smooth animations.\n\n```js\n// Available in RxJS-DOM project\nvar scheduler = Rx.Scheduler.requestAnimationFrame;\n\nfunction render(value) {\n  // Do something to render the value\n}\n\nRx.Observable.range(1, 100, scheduler)\n  .subscribe(render);\n```\n\nSchedulers also have advantages with virtual time, which means we can say what time it really is. This is great for deterministic testing in which you can verify the behavior of every single operator.  RxJS, through the `TestScheduler` can record when items happen and what values were yielded, thus no need for asynchronous testing.\n\n```js\nvar scheduler = new TestScheduler();\n\nvar xs = scheduler.createHotObservable(\n  Rx.ReactiveTest.onNext(201, 1),\n  Rx.ReactiveTest.onCompleted(202)\n);\n\nvar results = scheduler.startWithCreate(function () {\n  return xs.map(function (x, i) { return x + x + i });\n});\n\n// Some custom collection assertion for values\ncollectionAssert.assertEqual(results.messages, [\n  Rx.ReactiveTest.onNext(201, 2),\n  Rx.ReactiveTest.onCompleted(202)\n]);\n\n// Some custom collection assertion for subscriptions\ncollectionAssert.assertEqual(xs.subscriptions, [\n  Rx.ReactiveTest.subscribe(200, 202)\n])\n```\n\nEvery operator within RxJS has tests written in this style where all data is easily verified.  Not only can we create observables through the `TestScheduler`, but we can create Promises via the `createResolvedPromise` and `createRejectedPromise` methods.\n\nVirtual time has more advantages as well.  Imagine if you had some historical stock data that you wanted to run through a simulation.  Using the `Historical` scheduler, you can easily accomplish this.\n\n```js\nvar scheduler = new Rx.HistoricalScheduler(new Date(2014, 1));\n\nvar source = new Rx.Subject();\n\ngetStockData().forEach(function (stock) {\n  scheduler.scheduleWithAbsolute(stock.date, function () {\n    stock.onNext(stock);\n  });\n});\n\n// Calculate with the data\nsource.groupBy(function (stock) { return stock.symbol })\n  /* Do something with the data */\n  .subscribe(function (info) {\n    // Process the data\n  });\n```\n\n## Multicast Backpressure ##\n\nIn our applications, we consume a lot of data from external sources.  But, what if our consumers cannot handle the load from the sequence?  \n\nHighland.js uses the standard backpressure mechanisms such as `pause`/`resume` from standard node.js streams, as well as `throttle` and `debounce` for lossy operations.  The pause/resume from normal node.js streams work for multicast streams to share backpressure via `fork`, or to keep them separate with `observe`, but this can sometimes lead to confusion, especially when mixed.\n\nRxJS has a number of mechanisms to handle this in the [Backpressure and Observable Sequences](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/backpressure.md) documentation.  This could come in the form of lossy operations such as `debounce`, `throttleFirst`, `sample`, `pausable`, to loss-less operations such as `pausableBuffered`, `buffer`, `windowed`, `stopAndWait`, etc.  These work on the idea of multicast streams so that one consumer is not punished by another's inability to process the data in a timely manner.\n\nIn RxJS, you can synchronize across streams with backpressure with the pause/resume semantics using a `Pauser` or just any ordinary `Subject` with `onNext(true)` to resume and `onNext(false)` to pause:\n```js\nvar pauser = new Rx.Pauser();\n\nvar source1 = getData().pausableBuffered(pauser);\nvar source2 = getOtherData().pausableBuffered(pauser);\n\n// To pause both streams\npauser.pause();\n\n// To resume both streams\npauser.resume();\n```\n\n## Build What You Want ##\n\nRxJS has a rather large surface area, so we give you the ability to build RxJS with only the things you want and none of the things you don't via the [`rx-cli`](https://www.npmjs.org/package/rx-cli) project.  For example, we can build a `compat` version of RxJS with only the `map`, `flatMap`, `takeUntil`, and `fromEvent` methods, which keeps your RxJS version lean and mean.\n\n```bash\nrx --lite --compat --methods map,flatmap,takeuntil,fromevent\n```\n\n## Long Stack Trace Support ##\n\nDebugging programming with callbacks can be quite cumbersome.  To that end, RxJS has introduced a notion of \"Long Stack Traces\" which allows you to quickly isolate your code from the plumbing not only of RxJS, but also node.js and the browser cruft, thus getting you to the real cause of the issue.\n\nFor example, without \"long stack trace\" support, typically, an error would look like the following:\n\n```js\nvar Rx = require('rx');\n\nvar source = Rx.Observable.range(0, 100)\n  .timestamp()\n  .map(function (x) {\n    if (x.value > 98) throw new Error();\n    return x;\n});\n\nsource.subscribeOnError(\n  function (err) {\n    console.log(err.stack);\n  });\n```\n\n```bash\n$ node example.js\n\n  Error\n  at C:\\GitHub\\example.js:6:29\n  at AnonymousObserver._onNext (C:\\GitHub\\rxjs\\dist\\rx.all.js:4013:31)\n  at AnonymousObserver.Rx.AnonymousObserver.AnonymousObserver.next (C:\\GitHub\\rxjs\\dist\\rx.all.js:1863:12)\n  at AnonymousObserver.Rx.internals.AbstractObserver.AbstractObserver.onNext (C:\\GitHub\\rxjs\\dist\\rx.all.js:1795:35)\n  at AutoDetachObserverPrototype.next (C:\\GitHub\\rxjs\\dist\\rx.all.js:9226:23)\n  at AutoDetachObserver.Rx.internals.AbstractObserver.AbstractObserver.onNext (C:\\GitHub\\rxjs\\dist\\rx.all.js:1795:35)\n  at AnonymousObserver._onNext (C:\\GitHub\\rxjs\\dist\\rx.all.js:4018:18)\n  at AnonymousObserver.Rx.AnonymousObserver.AnonymousObserver.next (C:\\GitHub\\rxjs\\dist\\rx.all.js:1863:12)\n  at AnonymousObserver.Rx.internals.AbstractObserver.AbstractObserver.onNext (C:\\GitHub\\rxjs\\dist\\rx.all.js:1795:35)\n  at AutoDetachObserverPrototype.next (C:\\GitHub\\rxjs\\dist\\rx.all.js:9226:23)\n```\n\nThis can be remedied using \"long stack trace\" support by setting the following flag:\n```js\nRx.config.longStackSupport = true;\n```\n\nThen we can run our program again using this support\n```bash\n$ node example.js\n  Error\n  at C:\\GitHub\\example.js:6:29\n  From previous event:\n  at Object.<anonymous> (C:\\GitHub\\example.js:3:28)\n  From previous event:\n  at Object.<anonymous> (C:\\GitHub\\example.js:4:4)\n  From previous event:\n  at Object.<anonymous> (C:\\GitHub\\example.js:5:4)\n```\n\n## Many Examples and Tutorials ##\n\nAs people try to learn RxJS, it's always great to have [examples](https://github.com/Reactive-Extensions/RxJS/tree/master/examples) to get them started.  To that end, RxJS ships a number of examples out of the box including simple scenarios such as Autocomplete, Follow the Mouse, Drawing, to more complete examples like databinding using a little demo project called `TKO`, to a complete game of Alphabet Invasion.\n\nWant to learn RxJS at your own pace?  We also have tutorials for that as well called [LearnRx](http://jhusain.github.io/learnrx/) which will walk you through the basics of learning to compose arrays, and then how that applies to observable sequences.\n\nThere are also many [community resources](https://github.com/Reactive-Extensions/RxJS#resources) to learn RxJS from videos, to presentations, to examples with integration with such libraries as AngularJS and React.\n\n## Extensive Documentation ##\n\nAs stated before, RxJS has a rather large surface area so sometimes it's hard to know where to start.  To that end, RxJS has [complete API documentation](https://github.com/Reactive-Extensions/RxJS/tree/master/doc#reactive-extensions-class-library), as well as a [Getting Started Guide](https://github.com/Reactive-Extensions/RxJS/tree/master/doc#getting-started-with-rxjs) as well as [Guidelines](https://github.com/Reactive-Extensions/RxJS/tree/master/doc#rxjs-guidelines), a [How Do I?](https://github.com/Reactive-Extensions/RxJS/tree/master/doc#how-do-i) section as well as a [growing list of comparisons with other libraries](https://github.com/Reactive-Extensions/RxJS/tree/master/doc#mapping-rxjs-from-different-libraries).\n"
  },
  {
    "path": "doc/readme.md",
    "content": "# This is RxJS v 4. [Find the latest version here](https://github.com/reactivex/rxjs)\n# RxJS <sup>v4.0</sup>\n\nReactive Extensions (Rx) is a library for composing asynchronous and event-based programs using observable sequences and LINQ-style query operators.\n\nData sequences can take many forms, such as a stream of data from a file or web service, web services requests, system notifications, or a series of events such as user input.\n\nReactive Extensions represents all these data sequences as observable sequences. An application can subscribe to these observable sequences to receive asynchronous notifications as new data arrive.\n\nRxJS has no dependencies which complements and interoperates smoothly with both synchronous data streams such as iterable objects in JavaScript and single-value asynchronous computations such as Promises as the following diagram shows:\n\n<center>\n<table>\n   <th></th><th>Single return value</th><th>Multiple return values</th>\n   <tr>\n      <td>Pull/Synchronous/Interactive</td>\n      <td>Object</td>\n      <td>Iterables(Array | Set | Map)</td>\n   </tr>\n   <tr>\n      <td>Push/Asynchronous/Reactive</td>\n      <td>Promise</td>\n      <td>Observable</td>\n   </tr>\n</table>\n</center>\n\nTo put it more concretely, if you know how to program against Arrays using the Array#extras, then you already know how to use RxJS!\n\n<center><table>\n <thead>\n  <tr><th colspan=\"2\">Example code showing how similar high-order functions can be applied to an Array and an Observable</th></tr>\n  <tr><th>Iterable</th><th>Observable</th></tr>\n </thead>\n <tbody>\n  <tr><td><pre><code>getDataFromLocalMemory()\n  .filter(s => s != null)\n  .map(s => s + 'transformed')\n  .forEach(s => console.log(\\`next => ${s}\\`))</code></pre></td>\n  <td><pre><code>getDataFromNetwork()\n  .filter(s => s != null)\n  .map(s => s + 'transformed')\n  .subscribe(s => console.log(\\`next => ${s}\\`))</code></pre></td></tr>\n </tbody>\n</table></center>\n\nThere are a number of ways of getting started with RxJS including:\n- [Getting Started With RxJS](#getting-started-with-rxjs)\n- [RxJS Guidelines](#rxjs-guidlines)\n- [Getting to Know RxJS Libraries](#getting-to-know-rxjs-libraries)\n- [How Do I?](#how-do-i)\n- [Mapping RxJS from Different Libraries](#mapping-rxjs-from-different-libraries)\n- [API Documentation](#reactive-extensions-class-library)\n\n## Getting Started With RxJS\n\nGetting started with the Reactive Extensions for JavaScript is easy.  Let's start with the basics here:\n\n- [What are the Reactive Extensions?](gettingstarted/what.md)\n- [Exploring Major Concepts in RxJS](gettingstarted/exploring.md)\n- [Creating and Querying Observable Sequences](gettingstarted/creatingquerying.md)\n   1. [Creating and Subscribing to Simple Observable Sequences](gettingstarted/creating.md)\n   2. [Bridging to Events](gettingstarted/events.md)\n   3. [Bridging to Callbacks](gettingstarted/callbacks.md)\n   4. [Bridging to Promises](gettingstarted/promises.md)  \n   5. [Generators and Observable Sequences](gettingstarted/generators.md)  \n   6. [Querying Observable Sequences](gettingstarted/querying.md)\n   7. [Error Handling With Observable Sequences](gettingstarted/errors.md)\n   8. [Transducers with Observable Sequences](gettingstarted/transducers.md)\n   9. [Backpressure with Observable Sequences](gettingstarted/backpressure.md)\n   10. [Operators by Category](gettingstarted/categories.md)\n   11. Which Operator do I use?\n      - [Creation Operators](gettingstarted/which-static.md)\n      - [Instance Operators](gettingstarted/which-instance.md)\n- [Subjects](gettingstarted/subjects.md)\n- [Scheduling and Concurrency](gettingstarted/schedulers.md)\n- [Testing and Debugging](gettingstarted/testing.md)\n- [Implementing Your Own Operators](gettingstarted/operators.md)\n\n## RxJS Guidelines ##\n\nCurious on how we designed RxJS? This is covered along with overall guidelines of how your RxJS code should operate.  In addition, we have contribution guidelines which set the bar for which we accept contributions.\n\n- [RxJS Code of Conduct](https://github.com/Reactive-Extensions/RxJS/tree/master/code-of-conduct.md)\n- [RxJS Design Guidelines](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/designguidelines)\n- [RxJS Contribution Guidelines](https://github.com/Reactive-Extensions/RxJS/tree/master/contributing.md)\n\n## Getting to Know RxJS Libraries ##\n\nThere are many libraries that make up the Reactive Extensions for JavaScript, so it may be a little daunting at first to know which ones to include.  This will serve as a guide for which libraries you might need.  For most operations you'll only need [`rx.lite.js`](libraries/lite/rx.lite.md), but you may find you need more operators, so you start with [`rx.js`](libraries/main/rx.md) and add additional files to mix in functionality as you need it.\n\n### The complete library:\n- [`rx.all.js`](libraries/main/rx.complete.md)\n\n### Main Libraries:\n- [`rx.js`](libraries/main/rx.md)\n- [`rx.aggregates.js`](libraries/main/rx.aggregates.md)\n- [`rx.async.js`](libraries/main/rx.async.md)\n- [`rx.binding.js`](libraries/main/rx.binding.md)\n- [`rx.coincidence.js`](libraries/main/rx.coincidence.md)\n- [`rx.experimental.js`](libraries/main/rx.experimental.md)\n- [`rx.joinpatterns.js`](libraries/main/rx.joinpatterns.md)\n- [`rx.testing.js`](libraries/main/rx.testing.md)\n- [`rx.time.js`](libraries/main/rx.time.md)\n- [`rx.virtualtime.js`](libraries/main/rx.virtualtime.md)\n\n### Lite Libraries:\n- [`rx.lite.js`](libraries/lite/rx.lite.md)\n- [`rx.lite.extras.js`](libraries/lite/rx.lite.extras.md)\n- [`rx.lite.aggregates.js`](libraries/lite/rx.lite.aggregates.md)\n- [`rx.lite.async.js`](libraries/lite/rx.lite.async.md)\n- [`rx.lite.coincidence.js`](libraries/lite/rx.lite.coincidence.md)\n- [`rx.lite.experimental.js`](libraries/lite/rx.lite.experimental.md)\n- [`rx.lite.joinpatterns.js`](libraries/lite/rx.lite.joinpatterns.md)\n- [`rx.lite.testing.js`](libraries/lite/rx.lite.testing.md)\n- [`rx.lite.time.js`](libraries/lite/rx.lite.time.md)\n- [`rx.lite.virtualtime.js`](libraries/lite/rx.lite.virtualtime.md)\n\n### Core Libraries:\n- [`rx.core.js`](libraries/core/rx.core.md)\n- [`rx.core.binding.js`](libraries/core/rx.core.binding.md)\n- [`rx.core.testing.js`](libraries/core/rx.core.testing.md)\n\n## How Do I? ##\n\nThere is a large surface area with the Reactive Extensions for JavaScript, so it might be hard to know where to start.  This will serve as a guide to answer some of the more basic questions.\n\n1. [How do I wrap an existing API?](howdoi/wrap.md)\n2. [How do I integrate jQuery with RxJS?](howdoi/jquery.md)\n3. [How do I integrate Angular.js with RxJS?](howdoi/angular.md)\n4. [How do I create a simple event emitter?](howdoi/eventemitter.md)\n\n## Mapping RxJS from Different Libraries ##\n\nConverting your existing code from other libraries can be easy.  Many of the concepts you already know from popular libraries such as [Bacon.js](https://github.com/baconjs/bacon.js) and [Async.js](https://github.com/caolan/async)\n\n1. For Bacon.js Users\n    - [Why RxJS versus Bacon.js](mapping/bacon.js/whyrx.md)\n    - [Comparing RxJS and Bacon.js](mapping/bacon.js/comparing.md)\n2. For Async.js Users\n    - [Why RxJS versus Async.js](mapping/async/whyrx.md)\n    - [Comparing RxJS and Async.js](mapping/async/comparing.md)\n3. For Highland.js Users\n    - [Why RxJS versus Highland.js](mapping/highland/whyrx.md)\n    - [Comparing RxJS and Highland.js](mapping/highland/comparing.md)\n\n## Reactive Extensions Class Library\n\nThis section contains the reference documentation for the Reactive Extensions class library.\n\n### Helpers\n\n- [`Rx.config`](api/config/readme.md)\n- [`Rx.helpers`](api/helpers/readme.md)\n\n### Core\n- [`Rx.Observable`](api/core/observable.md)\n- [`Rx.Observer`](api/core/observer.md)\n- [`Rx.Notification`](api/core/notification.md)\n\n### Subjects\n\n- [`Rx.AsyncSubject`](api/subjects/asyncsubject.md)\n- [`Rx.BehaviorSubject`](api/subjects/behaviorsubject.md)\n- [`Rx.ReplaySubject`](api/subjects/replaysubject.md)\n- [`Rx.Subject`](api/subjects/subject.md)\n\n### Schedulers\n\n- [`Rx.HistoricalScheduler`](api/schedulers/historicalscheduler.md)\n- [`Rx.Scheduler`](api/schedulers/scheduler.md)\n- [`Rx.VirtualTimeScheduler`](api/schedulers/virtualtimescheduler.md)\n\n### Disposables\n\n- [`Rx.CompositeDisposable`](api/disposables/compositedisposable.md)\n- [`Rx.Disposable`](api/disposables/disposable.md)\n- [`Rx.RefCountDisposable`](api/disposables/refcountdisposable.md)\n- [`Rx.SerialDisposable`](api/disposables/serialdisposable.md)\n- [`Rx.SingleAssignmentDisposable`](api/disposables/singleassignmentdisposable.md)\n\n### Testing\n\n- [`Rx.ReactiveTest`](api/testing/reactivetest.md)\n- [`Rx.Recorded`](api/testing/recorded.md)\n- [`Rx.Subscription`](api/testing/subscription.md)\n- [`Rx.TestScheduler`](api/testing/testscheduler.md)\n"
  },
  {
    "path": "examples/alphabetinvasion/alphabetinvasion.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" >\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta charset=\"utf-8\">\n    <title>Alphabet Invasion!</title>\n    <link rel=\"stylesheet\" href=\"main.css\">\n  </head>\n  <body>\n    <div id=\"title\">Alphabet Invasion!</div>\n\t    <div id=\"updatefield\">\n\t\t    <div class=\"infotitle\">SCORE:</div>\n\t\t    <div class=\"info\" id=\"score\">0</div>\n\t\t    <div class=\"infotitle\">LEVEL:</div>\n\t\t    <div class=\"info\" id=\"level\"></div>\n\t\t    <div class=\"infotitle\">ENEMIES REMAINING:</div>\n\t\t    <div class=\"info\" id=\"remaining\"></div>\n\t\t    <div class=\"infotitle\">HIGH SCORE</div>\n\t\t    <div class=\"info\" id=\"highscore\">0</div>\n\t    </div>\n    <div id=\"playfield\">\n\t    <div id=\"modalmessages\">\n\t\t    <div id=\"message\"></div>\n\t    </div>\n    </div>\n    <div class=\"instructions\">As the letters fall, type the letter that is lowest to the ground to keep your planet safe from these alphabetical invaders!</div>\n    <div class=\"instructions\">Score higher by zapping the invaders as early as possible.</div>\n\t<div class=\"instructions\">Remember, these sneaky invaders are CaSe-SeNsItIvE!</div>\n    <script src=\"../../dist/rx.lite.js\"></script>\n    <script src=\"alphabetinvasion.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "examples/alphabetinvasion/alphabetinvasion.js",
    "content": "(function () {\n\n    // Non-standard custom operator\n    Rx.Observable.random = function (low, high, intervalLow, intervalHigh, howMany, scheduler) {\n      scheduler || (scheduler = Rx.Scheduler['default']);\n      if (howMany == null) { howMany = -1; }\n      if (intervalLow == null) { intervalLow = 1; }\n      if (intervalHigh == null) { intervalHigh = 1; }\n      return Rx.Observable.create(function (observer) {\n        var delta = high - low, intervalDelta = intervalHigh - intervalLow;\n\t\t    var iFunc = (intervalDelta === 0) ?\n          function () { return intervalLow; } :\n\t\t      function () { return Math.floor((Math.random() * intervalDelta) + intervalLow); };\n        return scheduler.scheduleRecursiveFuture(0, iFunc(), function (ticks, recurse) {\n          if (++ticks <= howMany) {\n            observer.onNext(Math.floor((Math.random() * delta) + low));\n            recurse(ticks, iFunc());\n          } else {\n            observer.onCompleted();\n          }\n        });\n      });\n    };\n\n    var GameState = {\n        playing: 'playing',\n        paused: 'paused',\n        stopped: 'stopped'\n    };\n\n    var AlphabetInvasion = (function () {\n        function AlphabetInvasion() {\n            this.enemies = [];\n\n            // get references to our needed DOM elements\n            this.modalBox = document.querySelector('#modalmessages');\n            this.message = document.querySelector('#message');\n            this.score = document.querySelector('#score');\n            this.playfield = document.querySelector('#playfield');\n            this.level = document.querySelector(\"#level\");\n            this.remainingEnemies = document.querySelector(\"#remaining\");\n            this.highScore = document.querySelector(\"#highscore\");\n        }\n\n        var CURRENT_SPEED = 0;\n        var LAUNCH_RATE = 1;\n        var HIGH_SCORE_STORAGE_KEY = '_alphabet_attack_high_score_';\n\n        var playfieldheight = 0;\n        var lookup = \"abcdefghijklmnopqrstuvwxyz\";\n        var levels = {\n            \"Level 1 - Rookies\": [60, 1300],\n            \"Level 2 - Tenderfoots\": [55, 1200],\n            \"Level 3 - Militia\": [50, 1100],\n            \"Level 4 - Privates\": [50, 1000],\n            \"Level 5 - Corporals\": [45, 800],\n            \"Level 6 - Sergeants\": [40, 650],\n            \"Level 7 - Master Sergeants\": [35, 500],\n            \"Level 8 - Lieutenants\": [30, 450],\n            \"Level 9 - Captains\": [25, 400],\n            \"Level 10 - Majors\": [20, 400],\n            \"Level 11 - Colonels\": [15, 350],\n            \"Level 12 - Generals\": [11, 350],\n            \"Level 13 - Special Forces\": [9, 350],\n            \"Level 14 - Black Ops\": [7, 350],\n            \"Level 15 - Ninjas\": [5, 350]\n        };\n\n        AlphabetInvasion.prototype.run = function () {\n            this.resetGame();\n            this.keyboardObservable = Rx.Observable.fromEvent(document, 'keyup');\n\n            // If paused cause game to start\n            var self = this;\n            this.keyboardObservable.subscribe(function () {\n                if (self.gameState === GameState.paused) {\n                    self.hideMessage();\n                    self.playLevel();\n                }\n            });\n\n            if (window.localStorage) {\n                var hs = window.localStorage.getItem(HIGH_SCORE_STORAGE_KEY);\n                if (hs !== null) {\n                    this.highScore.textContent = hs;\n                }\n            }\n        };\n\n        AlphabetInvasion.prototype.playLevel = function () {\n            if (this.generator) {\n                this.generator.dispose();\n            }\n            var title, found = false;\n            for (var level in levels) {\n                if (level.indexOf(this.currentLevel) !== -1) {\n                    found = true;\n                }\n                if (found) {\n                    title = level;\n                    break;\n                }\n            }\n\n            var config = levels[level];\n\n            this.gameState = GameState.playing;\n            this.level.textContent = this.currentLevel;\n            this.showMessage(title);\n\n            // nested method to handle the actual gameplay loop\n            var self = this;\n            var play = function () {\n                self.hideMessage();\n                var enemiesThisLevel = self.currentLevel * 2 + 13;\n                self.remainingEnemies.textContent = enemiesThisLevel;\n\n                var capitalLetterProbability = 1 - ((self.currentLevel * 2.5) / 100);\n                var killed = 0;\n                var allEnemiesLaunched = false;\n\n                // Start the game loop, which updates the enemies.\n                self.gameloop = Rx.Observable.interval(config[CURRENT_SPEED]).subscribe(function () {\n                    self.updatePlayfield();\n                });\n\n                // set another subscriber to the keyboardObservable\n                // which handles play input during each level\n                self.keyboard = self.keyboardObservable.subscribe(function (e) {\n                    if (self.enemies.length === 0 && !allEnemiesLaunched) {\n                        return;\n                    }\n\n                    if (self.enemies.length === 0 && allEnemiesLaunched) {\n                        self.nextLevel();\n                        return;\n                    }\n                    var key = e.shiftKey ? String.fromCharCode(e.keyCode) : String.fromCharCode(e.keyCode).toLowerCase();\n                    console.log('key pressed: ' + key + ' enemy text: ' + self.enemies[0].textContent);\n                    if (key === self.enemies[0].textContent) {\n                        var enemy = self.enemies.shift();\n                        self.killEnemy(enemy);\n                        self.remainingEnemies.textContent = enemiesThisLevel - ++killed;\n\n                        if (self.enemies.length === 0 && allEnemiesLaunched) {\n                            self.nextLevel();\n                        }\n                    }\n                });\n\n                // Generate enemies for this Level.\n                // 10% chance for uppercase enemy\n                self.generator = Rx.Observable.random(0, 25, config[LAUNCH_RATE], config[LAUNCH_RATE], enemiesThisLevel).select(function (v) {\n                    return Math.random() <= capitalLetterProbability ? lookup.charAt(v) : lookup.charAt(v).toUpperCase();\n                }).subscribe(function (v) {\n                    self.launchNewEnemy(v);\n                }, function (e) {\n                    throw e;\n                }, function () {\n                    allEnemiesLaunched = true;\n                });\n            };\n\n            // This observable sets a delay for showing the level title,\n            // after which we call the nested play() method to start\n            // the level.\n            Rx.Observable.timer(2500).subscribe(function () { play(); });\n        };\n\n        AlphabetInvasion.prototype.nextLevel = function () {\n            if (this.currentLevel === 15) {\n                this.youWin();\n            }\n\n            this.gameState = GameState.stopped;\n            this.gameloop.dispose();\n            this.generator.dispose();\n            this.keyboard.dispose();\n\n            this.showMessage('Level ' + this.currentLevel + ' Complete');\n            this.currentLevel++;\n\n            var self = this;\n            Rx.Observable.timer(4000).subscribe(function () { self.playLevel(); });\n        };\n\n        AlphabetInvasion.prototype.youWin = function () {\n            if (this.gameState === GameState.stopped) {\n                return;\n            }\n\n            // change game state and dispose of our\n            // game loop observables\n            this.gameState = GameState.stopped;\n            this.gameloop.dispose();\n            this.generator.dispose();\n            this.keyboard.dispose();\n\n            this.showMessage(\"You win this time Earthling!  We'll be back!\");\n\n            // reset the game after 5.5 seconds\n            var self = this;\n            Rx.Observable.timer(5500).subscribe(function () {\n                self.resetGame();\n            });\n        };\n\n        AlphabetInvasion.prototype.youLose = function () {\n            if (this.gameState === GameState.stopped) {\n                return;\n            }\n\n            // change game state and dispose of our\n            // game loop observables\n            this.gameState = GameState.Stopped;\n            this.gameloop.dispose();\n            this.generator.dispose();\n            this.keyboard.dispose();\n\n            // adjust all enemies except the one that landed\n            // to look like :P\n            for (var i = 0, len = this.enemies.length; i < len; i++) {\n                var enemy = this.enemies[i];\n                if (enemy !== this.enemies[0]) {\n                    enemy.textContent = ':P';\n                    enemy.className += ' rotate';\n                    enemy.style.fontSize = '72px';\n                }\n            }\n\n            this.showMessage(\"You Lose Earthling.  Prepare to be alphabetized!\");\n\n            // reset the game after 4.5 seconds\n            var self = this;\n            Rx.Observable.timer(5500).subscribe(function () {\n                self.resetGame();\n            });\n        };\n\n        AlphabetInvasion.prototype.killEnemy = function (enemy) {\n            // adjust the enemy visual\n            enemy.style.color = 'red';\n            enemy.style.fontSize = '48px';\n            enemy.textContent = '@';\n\n            // calculate a score\n            var v = enemy.offsetTop;\n            this.addToScore((this.playfield.clientHeight - v) * this.currentLevel);\n\n            // remove the enemy from the DOM after 750ms\n            var self = this;\n            Rx.Observable.timer(750).subscribe(function () {\n                self.playfield.removeChild(enemy);\n            });\n        };\n\n        // Updates positions of all enemies and calculates if an enemy has landed.\n        AlphabetInvasion.prototype.updatePlayfield = function () {\n            // adjusting enemy speed based on playfield height\n\n            playfieldheight = this.playfield.clientTop + this.playfield.clientHeight;\n            var factor = playfieldheight / 200;\n\n            var self = this;\n            Rx.Observable.fromArray(this.enemies).subscribe(function (enemy) {\n\n                var newPos = enemy.offsetTop + factor;\n                enemy.style.top = newPos + 'px';\n                if (newPos >= playfieldheight + 44) {\n                    self.youLose();\n                }\n            });\n\n        };\n\n        AlphabetInvasion.prototype.launchNewEnemy = function (v) {\n            //randomize a color, not too dark\n            var r = Math.floor(Math.random() * 100 + 155)\n\t\t\t, g = Math.floor(Math.random() * 100 + 155)\n\t\t\t, b = Math.floor(Math.random() * 100 + 155);\n\n            // build the enemy and set it's initial position\n            var enemy = document.createElement('div');\n            enemy.style.color = 'rgb(' + r + ',' + g + ',' + b + ')';\n            enemy.style.position = 'absolute';\n            enemy.style.top = this.playfield.offsetTop + 'px';\n            enemy.style.left = (Math.random() * (this.playfield.clientWidth - 25)) + 'px';\n            enemy.className = 'enemy';\n            enemy.textContent = v;\n\n            // update the tracking queue and add the enemy to the DOM\n            this.enemies.push(enemy);\n            this.playfield.appendChild(enemy);\n        };\n\n        AlphabetInvasion.prototype.addToScore = function (amount) {\n            var newScore = parseInt(this.score.textContent) + amount;\n            this.score.textContent = newScore;\n\n            if (newScore > parseInt(this.highScore.textContent)) {\n                this.highScore.textContent = newScore;\n                if (window.localStorage){\n                    window.localStorage.setItem(HIGH_SCORE_STORAGE_KEY, newScore);\n                }\n            }\n        };\n\n        AlphabetInvasion.prototype.resetGame = function () {\n            this.gameState = GameState.paused;\n            this.showMessage('');\n\n            this.currentLevel = 1;\n\n            this.score.textContent = '0';\n            this.level.textContent = '1';\n            this.remainingEnemies.textContent = '-';\n\n            this.clearPlayfield();\n\n            if (this.windowHeight) this.windowHeight.dispose();\n            if (this.generator) this.generator.dispose();\n            if (this.matcher) this.matcher.dispose();\n            if (this.gameloop) this.gameloop.dispose();\n            if (this.keyboard) this.keyboard.dispose();\n\n            this.showMessage('PRESS ANY KEY TO START');\n        };\n\n        AlphabetInvasion.prototype.clearPlayfield = function () {\n            for (var i = 0, len = this.enemies.length; i < len; i++) {\n                this.playfield.removeChild(this.enemies[i]);\n            }\n            this.enemies = [];\n        };\n\n        // Displays a model message one letter at a time.\n        AlphabetInvasion.prototype.showMessage = function (msg) {\n            if (msg && msg.length === 0) {\n                this.message.text = '';\n                return;\n            }\n\n            this.modalBox.style.opacity = 1;\n\n            var self = this;\n            for (var i = 0, len = msg.length; i < len; i++) {\n                (function (i) {\n                    Rx.Observable.just(i).delay(30 * i).subscribe(function (x) {\n                        self.message.textContent = msg.substring(0, x + 1);\n                    });\n                })(i);\n            }\n        };\n\n        AlphabetInvasion.prototype.hideMessage = function () {\n            this.modalBox.style.opacity = 0;\n        };\n\n        return AlphabetInvasion;\n\n    })();\n\n    var game = new AlphabetInvasion();\n    game.run();\n})();\n"
  },
  {
    "path": "examples/alphabetinvasion/main.css",
    "content": "html{\n  margin:0px;\n  padding:0px;\n}\n\nbody{\n  background: black;\n  font-family: Consolas, courier;\n  color: WhiteSmoke;\n  margin:0px;\n  padding:0px;\n  overflow:hidden;\n}\n\n#title {\n  text-align:center;\n  font-size:38px;\n  color: Yellow;\n}\n\n#updatefield {\n  font-size: 24px;\n  display: -ms-flexbox;\n  display: -webkit-box;\n  display: -moz-box;\n  display: box;\n}\n\n.infotitle {\n  padding-left: 1.5em;\n  color: LightGreen;\n}\n\n.info{\n  padding-left: .5em;\n  width:4em;\n}\n\n.enemy{\n  position: absolute;\n  margin: 0px;\n  font-size: 30px;\n  -webkit-transition: font-size 1s linear;\n  -moz-transition: font-size 1s linear;\n  -ms-transition: font-size 1s linear;\n  transition: font-size 1s linear;\n}\n\n#playfield{\n  height: 500px;\n  border: solid 1px #a8a8a8;\n  border-bottom: solid 5px Green;\n  background-image: linear-gradient(bottom, rgb(39,54,105) 17%, rgb(1,5,54) 46%);\n  background-image: -o-linear-gradient(bottom, rgb(39,54,105) 17%, rgb(1,5,54) 46%);\n  background-image: -ms-linear-gradient(bottom, rgb(39,54,105) 17%, rgb(1,5,54) 46%);\n  background-image: -moz-linear-gradient(bottom, rgb(39,54,105) 17%, rgb(1,5,54) 46%);\n  background-image: -webkit-linear-gradient(bottom, rgb(39,54,105) 17%, rgb(1,5,54) 46%);\n}\n\n.rotate{\n  -webkit-transform: rotate(90deg);\n  -moz-transform: rotate(90deg);\n  -ms-transform: rotate(90deg);\n  -o-transform: rotate(90deg);\n  transform: rotate(90deg);\n  /*rotate(90deg); */\n}\n\n.instructions{\n  text-align:center;\n  font-size: 18px;\n}\n\n#modalmessages{\n  opacity: 0;\n  height: 100%;\n  width: 100%;\n  background: #333377;\n\n  /* flexbox */\n  display: -ms-flexbox;\n  -ms-flex-pack: center;\n  -ms-flex-align:center;\n\n  /* Box display */\n  display: -webkit-box;\n  display: -moz-box;\n  display: box;\n  -webkit-box-pack: center;\n  -moz-box-pack: center;\n  box-pack:center;\n  -webkit-box-align: center;\n  -moz-box-align: center;\n  box-align: center;\n\n  /* Transition */\n  -ms-transition: opacity .5s linear;\n  -webkit-transition: opacity .5s linear;\n  -moz-transition: opacity .5s linear;\n  transition: opacity .5s linear;\n}\n\n#message{\n  font-size: 45px;\n}\n"
  },
  {
    "path": "examples/alphabetinvasion/readme.md",
    "content": ""
  },
  {
    "path": "examples/animationtest/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <title>RxJS Animation Test</title>\n  <style type=\"text/css\" media=\"screen\">\n  body {\n      padding: 20px;\n      font-family: 'Helvetica Neue', arial, sans-serif;\n      color: #333;\n  }\n  #drawing {\n      width: 100%;\n      height: 400px;\n      border: #ddd 1px solid;\n  }\n  #displayqueue {\n      text-align: center;\n      font-family: 'Inconsolata', 'Menlo', 'Courier', monospace;\n      color: #666;\n      margin: 20px;\n  }\n</style>\n</head>\n<body>\n  <h1>RxJS Animation Test</h1>\n  <h5>Originally from <a href=\"http://darrenn.github.io/EventedArray/\">http://darrenn.github.io/EventedArray/</a></h5>\n  <div id=\"drawing\"></div>\n  <h2>[x,y] tuples for each square:</h2>\n  <div id=\"displayqueue\"></div>\n  <script src=\"../assets/jquery/jquery-1.10.2.min.js\"></script>\n  <script src=\"../../dist/rx.lite.js\"></script>\n  <script src=\"index.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/animationtest/index.js",
    "content": "(function () {\n\n  function random(low, high) {\n    return Math.floor(Math.random() * (high - low + 1)) + low;\n  }\n\n  function Box(point, parent) {\n    this.parent = parent;\n    this.id = \"box_\" + Date.now()\n    this.point = {};\n    this.point.x = point[0];\n    this.point.y = point[1];\n    this.buildBox();\n  }\n\n  Box.prototype.buildBox = function() {\n    var div = $(\"<div class=\\\"box\\\" id=\\\"\" + this.id + \"\\\">\").css({\n      height: 20,\n      width: 20,\n      position: 'absolute',\n      top: this.point.y - 10,\n      left: this.point.x - 10,\n      display: 'none',\n      backgroundColor: \"rgb(\" + (random(0, 255)) + \", \" + (random(0, 255)) + \", \" + (random(0, 255)) + \")\"\n    });\n    this.parent.append(div);\n    return this;\n  };\n\n  Box.prototype.showBox = function() {\n    return this.parent.find(\"#\" + this.id).fadeIn('fast');\n  };\n\n  Box.prototype.hideBox = function() {\n    return this.parent.find(\"#\" + this.id).fadeOut('fast', function() {\n      return $(this).remove();\n    });\n  };\n\n  $(function () {\n\n    Rx.Observable.prototype.movingWindow = function(size, selector, onShift) {\n      var source = this;\n      return Rx.Observable.create(function (o) {\n        var arr = [];\n        return source.subscribe(\n          function (x) {\n            var item = selector(x);\n            arr.push(item);\n            if (arr.length > size) {\n              var i = arr.shift();\n              onShift(i);\n            }\n          },\n          function (e) { o.onError(e); },\n          function () { o.onCompleted(); }\n        );\n      })\n    }\n\n    // Drawing area\n    var canvas = $('#drawing');\n    var source = Rx.Observable.fromEvent(canvas, 'mousemove')\n      .movingWindow(\n        25,\n        function (x) {\n          var b = new Box([x.clientX, x.clientY], canvas);\n          b.showBox();\n          return b;\n        },\n        function (b) {\n          b.hideBox();\n        }\n      ).subscribe();\n\n  });\n}());\n"
  },
  {
    "path": "examples/animationtest/readme.md",
    "content": ""
  },
  {
    "path": "examples/assets/bootstrap/css/bootstrap-responsive.css",
    "content": "/*!\n * Bootstrap Responsive v2.3.2\n *\n * Copyright 2013 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world by @mdo and @fat.\n */\n\n.clearfix {\n  *zoom: 1;\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.hide-text {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.input-block-level {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\n.hidden {\n  display: none;\n  visibility: hidden;\n}\n\n.visible-phone {\n  display: none !important;\n}\n\n.visible-tablet {\n  display: none !important;\n}\n\n.hidden-desktop {\n  display: none !important;\n}\n\n.visible-desktop {\n  display: inherit !important;\n}\n\n@media (min-width: 768px) and (max-width: 979px) {\n  .hidden-desktop {\n    display: inherit !important;\n  }\n  .visible-desktop {\n    display: none !important ;\n  }\n  .visible-tablet {\n    display: inherit !important;\n  }\n  .hidden-tablet {\n    display: none !important;\n  }\n}\n\n@media (max-width: 767px) {\n  .hidden-desktop {\n    display: inherit !important;\n  }\n  .visible-desktop {\n    display: none !important;\n  }\n  .visible-phone {\n    display: inherit !important;\n  }\n  .hidden-phone {\n    display: none !important;\n  }\n}\n\n.visible-print {\n  display: none !important;\n}\n\n@media print {\n  .visible-print {\n    display: inherit !important;\n  }\n  .hidden-print {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .row {\n    margin-left: -30px;\n    *zoom: 1;\n  }\n  .row:before,\n  .row:after {\n    display: table;\n    line-height: 0;\n    content: \"\";\n  }\n  .row:after {\n    clear: both;\n  }\n  [class*=\"span\"] {\n    float: left;\n    min-height: 1px;\n    margin-left: 30px;\n  }\n  .container,\n  .navbar-static-top .container,\n  .navbar-fixed-top .container,\n  .navbar-fixed-bottom .container {\n    width: 1170px;\n  }\n  .span12 {\n    width: 1170px;\n  }\n  .span11 {\n    width: 1070px;\n  }\n  .span10 {\n    width: 970px;\n  }\n  .span9 {\n    width: 870px;\n  }\n  .span8 {\n    width: 770px;\n  }\n  .span7 {\n    width: 670px;\n  }\n  .span6 {\n    width: 570px;\n  }\n  .span5 {\n    width: 470px;\n  }\n  .span4 {\n    width: 370px;\n  }\n  .span3 {\n    width: 270px;\n  }\n  .span2 {\n    width: 170px;\n  }\n  .span1 {\n    width: 70px;\n  }\n  .offset12 {\n    margin-left: 1230px;\n  }\n  .offset11 {\n    margin-left: 1130px;\n  }\n  .offset10 {\n    margin-left: 1030px;\n  }\n  .offset9 {\n    margin-left: 930px;\n  }\n  .offset8 {\n    margin-left: 830px;\n  }\n  .offset7 {\n    margin-left: 730px;\n  }\n  .offset6 {\n    margin-left: 630px;\n  }\n  .offset5 {\n    margin-left: 530px;\n  }\n  .offset4 {\n    margin-left: 430px;\n  }\n  .offset3 {\n    margin-left: 330px;\n  }\n  .offset2 {\n    margin-left: 230px;\n  }\n  .offset1 {\n    margin-left: 130px;\n  }\n  .row-fluid {\n    width: 100%;\n    *zoom: 1;\n  }\n  .row-fluid:before,\n  .row-fluid:after {\n    display: table;\n    line-height: 0;\n    content: \"\";\n  }\n  .row-fluid:after {\n    clear: both;\n  }\n  .row-fluid [class*=\"span\"] {\n    display: block;\n    float: left;\n    width: 100%;\n    min-height: 30px;\n    margin-left: 2.564102564102564%;\n    *margin-left: 2.5109110747408616%;\n    -webkit-box-sizing: border-box;\n       -moz-box-sizing: border-box;\n            box-sizing: border-box;\n  }\n  .row-fluid [class*=\"span\"]:first-child {\n    margin-left: 0;\n  }\n  .row-fluid .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 2.564102564102564%;\n  }\n  .row-fluid .span12 {\n    width: 100%;\n    *width: 99.94680851063829%;\n  }\n  .row-fluid .span11 {\n    width: 91.45299145299145%;\n    *width: 91.39979996362975%;\n  }\n  .row-fluid .span10 {\n    width: 82.90598290598291%;\n    *width: 82.8527914166212%;\n  }\n  .row-fluid .span9 {\n    width: 74.35897435897436%;\n    *width: 74.30578286961266%;\n  }\n  .row-fluid .span8 {\n    width: 65.81196581196582%;\n    *width: 65.75877432260411%;\n  }\n  .row-fluid .span7 {\n    width: 57.26495726495726%;\n    *width: 57.21176577559556%;\n  }\n  .row-fluid .span6 {\n    width: 48.717948717948715%;\n    *width: 48.664757228587014%;\n  }\n  .row-fluid .span5 {\n    width: 40.17094017094017%;\n    *width: 40.11774868157847%;\n  }\n  .row-fluid .span4 {\n    width: 31.623931623931625%;\n    *width: 31.570740134569924%;\n  }\n  .row-fluid .span3 {\n    width: 23.076923076923077%;\n    *width: 23.023731587561375%;\n  }\n  .row-fluid .span2 {\n    width: 14.52991452991453%;\n    *width: 14.476723040552828%;\n  }\n  .row-fluid .span1 {\n    width: 5.982905982905983%;\n    *width: 5.929714493544281%;\n  }\n  .row-fluid .offset12 {\n    margin-left: 105.12820512820512%;\n    *margin-left: 105.02182214948171%;\n  }\n  .row-fluid .offset12:first-child {\n    margin-left: 102.56410256410257%;\n    *margin-left: 102.45771958537915%;\n  }\n  .row-fluid .offset11 {\n    margin-left: 96.58119658119658%;\n    *margin-left: 96.47481360247316%;\n  }\n  .row-fluid .offset11:first-child {\n    margin-left: 94.01709401709402%;\n    *margin-left: 93.91071103837061%;\n  }\n  .row-fluid .offset10 {\n    margin-left: 88.03418803418803%;\n    *margin-left: 87.92780505546462%;\n  }\n  .row-fluid .offset10:first-child {\n    margin-left: 85.47008547008548%;\n    *margin-left: 85.36370249136206%;\n  }\n  .row-fluid .offset9 {\n    margin-left: 79.48717948717949%;\n    *margin-left: 79.38079650845607%;\n  }\n  .row-fluid .offset9:first-child {\n    margin-left: 76.92307692307693%;\n    *margin-left: 76.81669394435352%;\n  }\n  .row-fluid .offset8 {\n    margin-left: 70.94017094017094%;\n    *margin-left: 70.83378796144753%;\n  }\n  .row-fluid .offset8:first-child {\n    margin-left: 68.37606837606839%;\n    *margin-left: 68.26968539734497%;\n  }\n  .row-fluid .offset7 {\n    margin-left: 62.393162393162385%;\n    *margin-left: 62.28677941443899%;\n  }\n  .row-fluid .offset7:first-child {\n    margin-left: 59.82905982905982%;\n    *margin-left: 59.72267685033642%;\n  }\n  .row-fluid .offset6 {\n    margin-left: 53.84615384615384%;\n    *margin-left: 53.739770867430444%;\n  }\n  .row-fluid .offset6:first-child {\n    margin-left: 51.28205128205128%;\n    *margin-left: 51.175668303327875%;\n  }\n  .row-fluid .offset5 {\n    margin-left: 45.299145299145295%;\n    *margin-left: 45.1927623204219%;\n  }\n  .row-fluid .offset5:first-child {\n    margin-left: 42.73504273504273%;\n    *margin-left: 42.62865975631933%;\n  }\n  .row-fluid .offset4 {\n    margin-left: 36.75213675213675%;\n    *margin-left: 36.645753773413354%;\n  }\n  .row-fluid .offset4:first-child {\n    margin-left: 34.18803418803419%;\n    *margin-left: 34.081651209310785%;\n  }\n  .row-fluid .offset3 {\n    margin-left: 28.205128205128204%;\n    *margin-left: 28.0987452264048%;\n  }\n  .row-fluid .offset3:first-child {\n    margin-left: 25.641025641025642%;\n    *margin-left: 25.53464266230224%;\n  }\n  .row-fluid .offset2 {\n    margin-left: 19.65811965811966%;\n    *margin-left: 19.551736679396257%;\n  }\n  .row-fluid .offset2:first-child {\n    margin-left: 17.094017094017094%;\n    *margin-left: 16.98763411529369%;\n  }\n  .row-fluid .offset1 {\n    margin-left: 11.11111111111111%;\n    *margin-left: 11.004728132387708%;\n  }\n  .row-fluid .offset1:first-child {\n    margin-left: 8.547008547008547%;\n    *margin-left: 8.440625568285142%;\n  }\n  input,\n  textarea,\n  .uneditable-input {\n    margin-left: 0;\n  }\n  .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 30px;\n  }\n  input.span12,\n  textarea.span12,\n  .uneditable-input.span12 {\n    width: 1156px;\n  }\n  input.span11,\n  textarea.span11,\n  .uneditable-input.span11 {\n    width: 1056px;\n  }\n  input.span10,\n  textarea.span10,\n  .uneditable-input.span10 {\n    width: 956px;\n  }\n  input.span9,\n  textarea.span9,\n  .uneditable-input.span9 {\n    width: 856px;\n  }\n  input.span8,\n  textarea.span8,\n  .uneditable-input.span8 {\n    width: 756px;\n  }\n  input.span7,\n  textarea.span7,\n  .uneditable-input.span7 {\n    width: 656px;\n  }\n  input.span6,\n  textarea.span6,\n  .uneditable-input.span6 {\n    width: 556px;\n  }\n  input.span5,\n  textarea.span5,\n  .uneditable-input.span5 {\n    width: 456px;\n  }\n  input.span4,\n  textarea.span4,\n  .uneditable-input.span4 {\n    width: 356px;\n  }\n  input.span3,\n  textarea.span3,\n  .uneditable-input.span3 {\n    width: 256px;\n  }\n  input.span2,\n  textarea.span2,\n  .uneditable-input.span2 {\n    width: 156px;\n  }\n  input.span1,\n  textarea.span1,\n  .uneditable-input.span1 {\n    width: 56px;\n  }\n  .thumbnails {\n    margin-left: -30px;\n  }\n  .thumbnails > li {\n    margin-left: 30px;\n  }\n  .row-fluid .thumbnails {\n    margin-left: 0;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 979px) {\n  .row {\n    margin-left: -20px;\n    *zoom: 1;\n  }\n  .row:before,\n  .row:after {\n    display: table;\n    line-height: 0;\n    content: \"\";\n  }\n  .row:after {\n    clear: both;\n  }\n  [class*=\"span\"] {\n    float: left;\n    min-height: 1px;\n    margin-left: 20px;\n  }\n  .container,\n  .navbar-static-top .container,\n  .navbar-fixed-top .container,\n  .navbar-fixed-bottom .container {\n    width: 724px;\n  }\n  .span12 {\n    width: 724px;\n  }\n  .span11 {\n    width: 662px;\n  }\n  .span10 {\n    width: 600px;\n  }\n  .span9 {\n    width: 538px;\n  }\n  .span8 {\n    width: 476px;\n  }\n  .span7 {\n    width: 414px;\n  }\n  .span6 {\n    width: 352px;\n  }\n  .span5 {\n    width: 290px;\n  }\n  .span4 {\n    width: 228px;\n  }\n  .span3 {\n    width: 166px;\n  }\n  .span2 {\n    width: 104px;\n  }\n  .span1 {\n    width: 42px;\n  }\n  .offset12 {\n    margin-left: 764px;\n  }\n  .offset11 {\n    margin-left: 702px;\n  }\n  .offset10 {\n    margin-left: 640px;\n  }\n  .offset9 {\n    margin-left: 578px;\n  }\n  .offset8 {\n    margin-left: 516px;\n  }\n  .offset7 {\n    margin-left: 454px;\n  }\n  .offset6 {\n    margin-left: 392px;\n  }\n  .offset5 {\n    margin-left: 330px;\n  }\n  .offset4 {\n    margin-left: 268px;\n  }\n  .offset3 {\n    margin-left: 206px;\n  }\n  .offset2 {\n    margin-left: 144px;\n  }\n  .offset1 {\n    margin-left: 82px;\n  }\n  .row-fluid {\n    width: 100%;\n    *zoom: 1;\n  }\n  .row-fluid:before,\n  .row-fluid:after {\n    display: table;\n    line-height: 0;\n    content: \"\";\n  }\n  .row-fluid:after {\n    clear: both;\n  }\n  .row-fluid [class*=\"span\"] {\n    display: block;\n    float: left;\n    width: 100%;\n    min-height: 30px;\n    margin-left: 2.7624309392265194%;\n    *margin-left: 2.709239449864817%;\n    -webkit-box-sizing: border-box;\n       -moz-box-sizing: border-box;\n            box-sizing: border-box;\n  }\n  .row-fluid [class*=\"span\"]:first-child {\n    margin-left: 0;\n  }\n  .row-fluid .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 2.7624309392265194%;\n  }\n  .row-fluid .span12 {\n    width: 100%;\n    *width: 99.94680851063829%;\n  }\n  .row-fluid .span11 {\n    width: 91.43646408839778%;\n    *width: 91.38327259903608%;\n  }\n  .row-fluid .span10 {\n    width: 82.87292817679558%;\n    *width: 82.81973668743387%;\n  }\n  .row-fluid .span9 {\n    width: 74.30939226519337%;\n    *width: 74.25620077583166%;\n  }\n  .row-fluid .span8 {\n    width: 65.74585635359117%;\n    *width: 65.69266486422946%;\n  }\n  .row-fluid .span7 {\n    width: 57.18232044198895%;\n    *width: 57.12912895262725%;\n  }\n  .row-fluid .span6 {\n    width: 48.61878453038674%;\n    *width: 48.56559304102504%;\n  }\n  .row-fluid .span5 {\n    width: 40.05524861878453%;\n    *width: 40.00205712942283%;\n  }\n  .row-fluid .span4 {\n    width: 31.491712707182323%;\n    *width: 31.43852121782062%;\n  }\n  .row-fluid .span3 {\n    width: 22.92817679558011%;\n    *width: 22.87498530621841%;\n  }\n  .row-fluid .span2 {\n    width: 14.3646408839779%;\n    *width: 14.311449394616199%;\n  }\n  .row-fluid .span1 {\n    width: 5.801104972375691%;\n    *width: 5.747913483013988%;\n  }\n  .row-fluid .offset12 {\n    margin-left: 105.52486187845304%;\n    *margin-left: 105.41847889972962%;\n  }\n  .row-fluid .offset12:first-child {\n    margin-left: 102.76243093922652%;\n    *margin-left: 102.6560479605031%;\n  }\n  .row-fluid .offset11 {\n    margin-left: 96.96132596685082%;\n    *margin-left: 96.8549429881274%;\n  }\n  .row-fluid .offset11:first-child {\n    margin-left: 94.1988950276243%;\n    *margin-left: 94.09251204890089%;\n  }\n  .row-fluid .offset10 {\n    margin-left: 88.39779005524862%;\n    *margin-left: 88.2914070765252%;\n  }\n  .row-fluid .offset10:first-child {\n    margin-left: 85.6353591160221%;\n    *margin-left: 85.52897613729868%;\n  }\n  .row-fluid .offset9 {\n    margin-left: 79.8342541436464%;\n    *margin-left: 79.72787116492299%;\n  }\n  .row-fluid .offset9:first-child {\n    margin-left: 77.07182320441989%;\n    *margin-left: 76.96544022569647%;\n  }\n  .row-fluid .offset8 {\n    margin-left: 71.2707182320442%;\n    *margin-left: 71.16433525332079%;\n  }\n  .row-fluid .offset8:first-child {\n    margin-left: 68.50828729281768%;\n    *margin-left: 68.40190431409427%;\n  }\n  .row-fluid .offset7 {\n    margin-left: 62.70718232044199%;\n    *margin-left: 62.600799341718584%;\n  }\n  .row-fluid .offset7:first-child {\n    margin-left: 59.94475138121547%;\n    *margin-left: 59.838368402492065%;\n  }\n  .row-fluid .offset6 {\n    margin-left: 54.14364640883978%;\n    *margin-left: 54.037263430116376%;\n  }\n  .row-fluid .offset6:first-child {\n    margin-left: 51.38121546961326%;\n    *margin-left: 51.27483249088986%;\n  }\n  .row-fluid .offset5 {\n    margin-left: 45.58011049723757%;\n    *margin-left: 45.47372751851417%;\n  }\n  .row-fluid .offset5:first-child {\n    margin-left: 42.81767955801105%;\n    *margin-left: 42.71129657928765%;\n  }\n  .row-fluid .offset4 {\n    margin-left: 37.01657458563536%;\n    *margin-left: 36.91019160691196%;\n  }\n  .row-fluid .offset4:first-child {\n    margin-left: 34.25414364640884%;\n    *margin-left: 34.14776066768544%;\n  }\n  .row-fluid .offset3 {\n    margin-left: 28.45303867403315%;\n    *margin-left: 28.346655695309746%;\n  }\n  .row-fluid .offset3:first-child {\n    margin-left: 25.69060773480663%;\n    *margin-left: 25.584224756083227%;\n  }\n  .row-fluid .offset2 {\n    margin-left: 19.88950276243094%;\n    *margin-left: 19.783119783707537%;\n  }\n  .row-fluid .offset2:first-child {\n    margin-left: 17.12707182320442%;\n    *margin-left: 17.02068884448102%;\n  }\n  .row-fluid .offset1 {\n    margin-left: 11.32596685082873%;\n    *margin-left: 11.219583872105325%;\n  }\n  .row-fluid .offset1:first-child {\n    margin-left: 8.56353591160221%;\n    *margin-left: 8.457152932878806%;\n  }\n  input,\n  textarea,\n  .uneditable-input {\n    margin-left: 0;\n  }\n  .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 20px;\n  }\n  input.span12,\n  textarea.span12,\n  .uneditable-input.span12 {\n    width: 710px;\n  }\n  input.span11,\n  textarea.span11,\n  .uneditable-input.span11 {\n    width: 648px;\n  }\n  input.span10,\n  textarea.span10,\n  .uneditable-input.span10 {\n    width: 586px;\n  }\n  input.span9,\n  textarea.span9,\n  .uneditable-input.span9 {\n    width: 524px;\n  }\n  input.span8,\n  textarea.span8,\n  .uneditable-input.span8 {\n    width: 462px;\n  }\n  input.span7,\n  textarea.span7,\n  .uneditable-input.span7 {\n    width: 400px;\n  }\n  input.span6,\n  textarea.span6,\n  .uneditable-input.span6 {\n    width: 338px;\n  }\n  input.span5,\n  textarea.span5,\n  .uneditable-input.span5 {\n    width: 276px;\n  }\n  input.span4,\n  textarea.span4,\n  .uneditable-input.span4 {\n    width: 214px;\n  }\n  input.span3,\n  textarea.span3,\n  .uneditable-input.span3 {\n    width: 152px;\n  }\n  input.span2,\n  textarea.span2,\n  .uneditable-input.span2 {\n    width: 90px;\n  }\n  input.span1,\n  textarea.span1,\n  .uneditable-input.span1 {\n    width: 28px;\n  }\n}\n\n@media (max-width: 767px) {\n  body {\n    padding-right: 20px;\n    padding-left: 20px;\n  }\n  .navbar-fixed-top,\n  .navbar-fixed-bottom,\n  .navbar-static-top {\n    margin-right: -20px;\n    margin-left: -20px;\n  }\n  .container-fluid {\n    padding: 0;\n  }\n  .dl-horizontal dt {\n    float: none;\n    width: auto;\n    clear: none;\n    text-align: left;\n  }\n  .dl-horizontal dd {\n    margin-left: 0;\n  }\n  .container {\n    width: auto;\n  }\n  .row-fluid {\n    width: 100%;\n  }\n  .row,\n  .thumbnails {\n    margin-left: 0;\n  }\n  .thumbnails > li {\n    float: none;\n    margin-left: 0;\n  }\n  [class*=\"span\"],\n  .uneditable-input[class*=\"span\"],\n  .row-fluid [class*=\"span\"] {\n    display: block;\n    float: none;\n    width: 100%;\n    margin-left: 0;\n    -webkit-box-sizing: border-box;\n       -moz-box-sizing: border-box;\n            box-sizing: border-box;\n  }\n  .span12,\n  .row-fluid .span12 {\n    width: 100%;\n    -webkit-box-sizing: border-box;\n       -moz-box-sizing: border-box;\n            box-sizing: border-box;\n  }\n  .row-fluid [class*=\"offset\"]:first-child {\n    margin-left: 0;\n  }\n  .input-large,\n  .input-xlarge,\n  .input-xxlarge,\n  input[class*=\"span\"],\n  select[class*=\"span\"],\n  textarea[class*=\"span\"],\n  .uneditable-input {\n    display: block;\n    width: 100%;\n    min-height: 30px;\n    -webkit-box-sizing: border-box;\n       -moz-box-sizing: border-box;\n            box-sizing: border-box;\n  }\n  .input-prepend input,\n  .input-append input,\n  .input-prepend input[class*=\"span\"],\n  .input-append input[class*=\"span\"] {\n    display: inline-block;\n    width: auto;\n  }\n  .controls-row [class*=\"span\"] + [class*=\"span\"] {\n    margin-left: 0;\n  }\n  .modal {\n    position: fixed;\n    top: 20px;\n    right: 20px;\n    left: 20px;\n    width: auto;\n    margin: 0;\n  }\n  .modal.fade {\n    top: -100px;\n  }\n  .modal.fade.in {\n    top: 20px;\n  }\n}\n\n@media (max-width: 480px) {\n  .nav-collapse {\n    -webkit-transform: translate3d(0, 0, 0);\n  }\n  .page-header h1 small {\n    display: block;\n    line-height: 20px;\n  }\n  input[type=\"checkbox\"],\n  input[type=\"radio\"] {\n    border: 1px solid #ccc;\n  }\n  .form-horizontal .control-label {\n    float: none;\n    width: auto;\n    padding-top: 0;\n    text-align: left;\n  }\n  .form-horizontal .controls {\n    margin-left: 0;\n  }\n  .form-horizontal .control-list {\n    padding-top: 0;\n  }\n  .form-horizontal .form-actions {\n    padding-right: 10px;\n    padding-left: 10px;\n  }\n  .media .pull-left,\n  .media .pull-right {\n    display: block;\n    float: none;\n    margin-bottom: 10px;\n  }\n  .media-object {\n    margin-right: 0;\n    margin-left: 0;\n  }\n  .modal {\n    top: 10px;\n    right: 10px;\n    left: 10px;\n  }\n  .modal-header .close {\n    padding: 10px;\n    margin: -10px;\n  }\n  .carousel-caption {\n    position: static;\n  }\n}\n\n@media (max-width: 979px) {\n  body {\n    padding-top: 0;\n  }\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    position: static;\n  }\n  .navbar-fixed-top {\n    margin-bottom: 20px;\n  }\n  .navbar-fixed-bottom {\n    margin-top: 20px;\n  }\n  .navbar-fixed-top .navbar-inner,\n  .navbar-fixed-bottom .navbar-inner {\n    padding: 5px;\n  }\n  .navbar .container {\n    width: auto;\n    padding: 0;\n  }\n  .navbar .brand {\n    padding-right: 10px;\n    padding-left: 10px;\n    margin: 0 0 0 -5px;\n  }\n  .nav-collapse {\n    clear: both;\n  }\n  .nav-collapse .nav {\n    float: none;\n    margin: 0 0 10px;\n  }\n  .nav-collapse .nav > li {\n    float: none;\n  }\n  .nav-collapse .nav > li > a {\n    margin-bottom: 2px;\n  }\n  .nav-collapse .nav > .divider-vertical {\n    display: none;\n  }\n  .nav-collapse .nav .nav-header {\n    color: #777777;\n    text-shadow: none;\n  }\n  .nav-collapse .nav > li > a,\n  .nav-collapse .dropdown-menu a {\n    padding: 9px 15px;\n    font-weight: bold;\n    color: #777777;\n    -webkit-border-radius: 3px;\n       -moz-border-radius: 3px;\n            border-radius: 3px;\n  }\n  .nav-collapse .btn {\n    padding: 4px 10px 4px;\n    font-weight: normal;\n    -webkit-border-radius: 4px;\n       -moz-border-radius: 4px;\n            border-radius: 4px;\n  }\n  .nav-collapse .dropdown-menu li + li a {\n    margin-bottom: 2px;\n  }\n  .nav-collapse .nav > li > a:hover,\n  .nav-collapse .nav > li > a:focus,\n  .nav-collapse .dropdown-menu a:hover,\n  .nav-collapse .dropdown-menu a:focus {\n    background-color: #f2f2f2;\n  }\n  .navbar-inverse .nav-collapse .nav > li > a,\n  .navbar-inverse .nav-collapse .dropdown-menu a {\n    color: #999999;\n  }\n  .navbar-inverse .nav-collapse .nav > li > a:hover,\n  .navbar-inverse .nav-collapse .nav > li > a:focus,\n  .navbar-inverse .nav-collapse .dropdown-menu a:hover,\n  .navbar-inverse .nav-collapse .dropdown-menu a:focus {\n    background-color: #111111;\n  }\n  .nav-collapse.in .btn-group {\n    padding: 0;\n    margin-top: 5px;\n  }\n  .nav-collapse .dropdown-menu {\n    position: static;\n    top: auto;\n    left: auto;\n    display: none;\n    float: none;\n    max-width: none;\n    padding: 0;\n    margin: 0 15px;\n    background-color: transparent;\n    border: none;\n    -webkit-border-radius: 0;\n       -moz-border-radius: 0;\n            border-radius: 0;\n    -webkit-box-shadow: none;\n       -moz-box-shadow: none;\n            box-shadow: none;\n  }\n  .nav-collapse .open > .dropdown-menu {\n    display: block;\n  }\n  .nav-collapse .dropdown-menu:before,\n  .nav-collapse .dropdown-menu:after {\n    display: none;\n  }\n  .nav-collapse .dropdown-menu .divider {\n    display: none;\n  }\n  .nav-collapse .nav > li > .dropdown-menu:before,\n  .nav-collapse .nav > li > .dropdown-menu:after {\n    display: none;\n  }\n  .nav-collapse .navbar-form,\n  .nav-collapse .navbar-search {\n    float: none;\n    padding: 10px 15px;\n    margin: 10px 0;\n    border-top: 1px solid #f2f2f2;\n    border-bottom: 1px solid #f2f2f2;\n    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n  }\n  .navbar-inverse .nav-collapse .navbar-form,\n  .navbar-inverse .nav-collapse .navbar-search {\n    border-top-color: #111111;\n    border-bottom-color: #111111;\n  }\n  .navbar .nav-collapse .nav.pull-right {\n    float: none;\n    margin-left: 0;\n  }\n  .nav-collapse,\n  .nav-collapse.collapse {\n    height: 0;\n    overflow: hidden;\n  }\n  .navbar .btn-navbar {\n    display: block;\n  }\n  .navbar-static .navbar-inner {\n    padding-right: 10px;\n    padding-left: 10px;\n  }\n}\n\n@media (min-width: 980px) {\n  .nav-collapse.collapse {\n    height: auto !important;\n    overflow: visible !important;\n  }\n}\n"
  },
  {
    "path": "examples/assets/bootstrap/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v2.3.2\n *\n * Copyright 2013 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world by @mdo and @fat.\n */\n\n.clearfix {\n  *zoom: 1;\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.hide-text {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.input-block-level {\n  display: block;\n  width: 100%;\n  min-height: 30px;\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nnav,\nsection {\n  display: block;\n}\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n  *display: inline;\n  *zoom: 1;\n}\n\naudio:not([controls]) {\n  display: none;\n}\n\nhtml {\n  font-size: 100%;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n\na:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\na:hover,\na:active {\n  outline: 0;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nimg {\n  width: auto\\9;\n  height: auto;\n  max-width: 100%;\n  vertical-align: middle;\n  border: 0;\n  -ms-interpolation-mode: bicubic;\n}\n\n#map_canvas img,\n.google-maps img {\n  max-width: none;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-size: 100%;\n  vertical-align: middle;\n}\n\nbutton,\ninput {\n  *overflow: visible;\n  line-height: normal;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer;\n  -webkit-appearance: button;\n}\n\nlabel,\nselect,\nbutton,\ninput[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"],\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  cursor: pointer;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button {\n  -webkit-appearance: none;\n}\n\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  .ir a:after,\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  @page  {\n    margin: 0.5cm;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n}\n\nbody {\n  margin: 0;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 20px;\n  color: #333333;\n  background-color: #ffffff;\n}\n\na {\n  color: #0088cc;\n  text-decoration: none;\n}\n\na:hover,\na:focus {\n  color: #005580;\n  text-decoration: underline;\n}\n\n.img-rounded {\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n}\n\n.img-polaroid {\n  padding: 4px;\n  background-color: #fff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.img-circle {\n  -webkit-border-radius: 500px;\n     -moz-border-radius: 500px;\n          border-radius: 500px;\n}\n\n.row {\n  margin-left: -20px;\n  *zoom: 1;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.row:after {\n  clear: both;\n}\n\n[class*=\"span\"] {\n  float: left;\n  min-height: 1px;\n  margin-left: 20px;\n}\n\n.container,\n.navbar-static-top .container,\n.navbar-fixed-top .container,\n.navbar-fixed-bottom .container {\n  width: 940px;\n}\n\n.span12 {\n  width: 940px;\n}\n\n.span11 {\n  width: 860px;\n}\n\n.span10 {\n  width: 780px;\n}\n\n.span9 {\n  width: 700px;\n}\n\n.span8 {\n  width: 620px;\n}\n\n.span7 {\n  width: 540px;\n}\n\n.span6 {\n  width: 460px;\n}\n\n.span5 {\n  width: 380px;\n}\n\n.span4 {\n  width: 300px;\n}\n\n.span3 {\n  width: 220px;\n}\n\n.span2 {\n  width: 140px;\n}\n\n.span1 {\n  width: 60px;\n}\n\n.offset12 {\n  margin-left: 980px;\n}\n\n.offset11 {\n  margin-left: 900px;\n}\n\n.offset10 {\n  margin-left: 820px;\n}\n\n.offset9 {\n  margin-left: 740px;\n}\n\n.offset8 {\n  margin-left: 660px;\n}\n\n.offset7 {\n  margin-left: 580px;\n}\n\n.offset6 {\n  margin-left: 500px;\n}\n\n.offset5 {\n  margin-left: 420px;\n}\n\n.offset4 {\n  margin-left: 340px;\n}\n\n.offset3 {\n  margin-left: 260px;\n}\n\n.offset2 {\n  margin-left: 180px;\n}\n\n.offset1 {\n  margin-left: 100px;\n}\n\n.row-fluid {\n  width: 100%;\n  *zoom: 1;\n}\n\n.row-fluid:before,\n.row-fluid:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.row-fluid:after {\n  clear: both;\n}\n\n.row-fluid [class*=\"span\"] {\n  display: block;\n  float: left;\n  width: 100%;\n  min-height: 30px;\n  margin-left: 2.127659574468085%;\n  *margin-left: 2.074468085106383%;\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\n.row-fluid [class*=\"span\"]:first-child {\n  margin-left: 0;\n}\n\n.row-fluid .controls-row [class*=\"span\"] + [class*=\"span\"] {\n  margin-left: 2.127659574468085%;\n}\n\n.row-fluid .span12 {\n  width: 100%;\n  *width: 99.94680851063829%;\n}\n\n.row-fluid .span11 {\n  width: 91.48936170212765%;\n  *width: 91.43617021276594%;\n}\n\n.row-fluid .span10 {\n  width: 82.97872340425532%;\n  *width: 82.92553191489361%;\n}\n\n.row-fluid .span9 {\n  width: 74.46808510638297%;\n  *width: 74.41489361702126%;\n}\n\n.row-fluid .span8 {\n  width: 65.95744680851064%;\n  *width: 65.90425531914893%;\n}\n\n.row-fluid .span7 {\n  width: 57.44680851063829%;\n  *width: 57.39361702127659%;\n}\n\n.row-fluid .span6 {\n  width: 48.93617021276595%;\n  *width: 48.88297872340425%;\n}\n\n.row-fluid .span5 {\n  width: 40.42553191489362%;\n  *width: 40.37234042553192%;\n}\n\n.row-fluid .span4 {\n  width: 31.914893617021278%;\n  *width: 31.861702127659576%;\n}\n\n.row-fluid .span3 {\n  width: 23.404255319148934%;\n  *width: 23.351063829787233%;\n}\n\n.row-fluid .span2 {\n  width: 14.893617021276595%;\n  *width: 14.840425531914894%;\n}\n\n.row-fluid .span1 {\n  width: 6.382978723404255%;\n  *width: 6.329787234042553%;\n}\n\n.row-fluid .offset12 {\n  margin-left: 104.25531914893617%;\n  *margin-left: 104.14893617021275%;\n}\n\n.row-fluid .offset12:first-child {\n  margin-left: 102.12765957446808%;\n  *margin-left: 102.02127659574467%;\n}\n\n.row-fluid .offset11 {\n  margin-left: 95.74468085106382%;\n  *margin-left: 95.6382978723404%;\n}\n\n.row-fluid .offset11:first-child {\n  margin-left: 93.61702127659574%;\n  *margin-left: 93.51063829787232%;\n}\n\n.row-fluid .offset10 {\n  margin-left: 87.23404255319149%;\n  *margin-left: 87.12765957446807%;\n}\n\n.row-fluid .offset10:first-child {\n  margin-left: 85.1063829787234%;\n  *margin-left: 84.99999999999999%;\n}\n\n.row-fluid .offset9 {\n  margin-left: 78.72340425531914%;\n  *margin-left: 78.61702127659572%;\n}\n\n.row-fluid .offset9:first-child {\n  margin-left: 76.59574468085106%;\n  *margin-left: 76.48936170212764%;\n}\n\n.row-fluid .offset8 {\n  margin-left: 70.2127659574468%;\n  *margin-left: 70.10638297872339%;\n}\n\n.row-fluid .offset8:first-child {\n  margin-left: 68.08510638297872%;\n  *margin-left: 67.9787234042553%;\n}\n\n.row-fluid .offset7 {\n  margin-left: 61.70212765957446%;\n  *margin-left: 61.59574468085106%;\n}\n\n.row-fluid .offset7:first-child {\n  margin-left: 59.574468085106375%;\n  *margin-left: 59.46808510638297%;\n}\n\n.row-fluid .offset6 {\n  margin-left: 53.191489361702125%;\n  *margin-left: 53.085106382978715%;\n}\n\n.row-fluid .offset6:first-child {\n  margin-left: 51.063829787234035%;\n  *margin-left: 50.95744680851063%;\n}\n\n.row-fluid .offset5 {\n  margin-left: 44.68085106382979%;\n  *margin-left: 44.57446808510638%;\n}\n\n.row-fluid .offset5:first-child {\n  margin-left: 42.5531914893617%;\n  *margin-left: 42.4468085106383%;\n}\n\n.row-fluid .offset4 {\n  margin-left: 36.170212765957444%;\n  *margin-left: 36.06382978723405%;\n}\n\n.row-fluid .offset4:first-child {\n  margin-left: 34.04255319148936%;\n  *margin-left: 33.93617021276596%;\n}\n\n.row-fluid .offset3 {\n  margin-left: 27.659574468085104%;\n  *margin-left: 27.5531914893617%;\n}\n\n.row-fluid .offset3:first-child {\n  margin-left: 25.53191489361702%;\n  *margin-left: 25.425531914893618%;\n}\n\n.row-fluid .offset2 {\n  margin-left: 19.148936170212764%;\n  *margin-left: 19.04255319148936%;\n}\n\n.row-fluid .offset2:first-child {\n  margin-left: 17.02127659574468%;\n  *margin-left: 16.914893617021278%;\n}\n\n.row-fluid .offset1 {\n  margin-left: 10.638297872340425%;\n  *margin-left: 10.53191489361702%;\n}\n\n.row-fluid .offset1:first-child {\n  margin-left: 8.51063829787234%;\n  *margin-left: 8.404255319148938%;\n}\n\n[class*=\"span\"].hide,\n.row-fluid [class*=\"span\"].hide {\n  display: none;\n}\n\n[class*=\"span\"].pull-right,\n.row-fluid [class*=\"span\"].pull-right {\n  float: right;\n}\n\n.container {\n  margin-right: auto;\n  margin-left: auto;\n  *zoom: 1;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.container:after {\n  clear: both;\n}\n\n.container-fluid {\n  padding-right: 20px;\n  padding-left: 20px;\n  *zoom: 1;\n}\n\n.container-fluid:before,\n.container-fluid:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.container-fluid:after {\n  clear: both;\n}\n\np {\n  margin: 0 0 10px;\n}\n\n.lead {\n  margin-bottom: 20px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 30px;\n}\n\nsmall {\n  font-size: 85%;\n}\n\nstrong {\n  font-weight: bold;\n}\n\nem {\n  font-style: italic;\n}\n\ncite {\n  font-style: normal;\n}\n\n.muted {\n  color: #999999;\n}\n\na.muted:hover,\na.muted:focus {\n  color: #808080;\n}\n\n.text-warning {\n  color: #c09853;\n}\n\na.text-warning:hover,\na.text-warning:focus {\n  color: #a47e3c;\n}\n\n.text-error {\n  color: #b94a48;\n}\n\na.text-error:hover,\na.text-error:focus {\n  color: #953b39;\n}\n\n.text-info {\n  color: #3a87ad;\n}\n\na.text-info:hover,\na.text-info:focus {\n  color: #2d6987;\n}\n\n.text-success {\n  color: #468847;\n}\n\na.text-success:hover,\na.text-success:focus {\n  color: #356635;\n}\n\n.text-left {\n  text-align: left;\n}\n\n.text-right {\n  text-align: right;\n}\n\n.text-center {\n  text-align: center;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  margin: 10px 0;\n  font-family: inherit;\n  font-weight: bold;\n  line-height: 20px;\n  color: inherit;\n  text-rendering: optimizelegibility;\n}\n\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small {\n  font-weight: normal;\n  line-height: 1;\n  color: #999999;\n}\n\nh1,\nh2,\nh3 {\n  line-height: 40px;\n}\n\nh1 {\n  font-size: 38.5px;\n}\n\nh2 {\n  font-size: 31.5px;\n}\n\nh3 {\n  font-size: 24.5px;\n}\n\nh4 {\n  font-size: 17.5px;\n}\n\nh5 {\n  font-size: 14px;\n}\n\nh6 {\n  font-size: 11.9px;\n}\n\nh1 small {\n  font-size: 24.5px;\n}\n\nh2 small {\n  font-size: 17.5px;\n}\n\nh3 small {\n  font-size: 14px;\n}\n\nh4 small {\n  font-size: 14px;\n}\n\n.page-header {\n  padding-bottom: 9px;\n  margin: 20px 0 30px;\n  border-bottom: 1px solid #eeeeee;\n}\n\nul,\nol {\n  padding: 0;\n  margin: 0 0 10px 25px;\n}\n\nul ul,\nul ol,\nol ol,\nol ul {\n  margin-bottom: 0;\n}\n\nli {\n  line-height: 20px;\n}\n\nul.unstyled,\nol.unstyled {\n  margin-left: 0;\n  list-style: none;\n}\n\nul.inline,\nol.inline {\n  margin-left: 0;\n  list-style: none;\n}\n\nul.inline > li,\nol.inline > li {\n  display: inline-block;\n  *display: inline;\n  padding-right: 5px;\n  padding-left: 5px;\n  *zoom: 1;\n}\n\ndl {\n  margin-bottom: 20px;\n}\n\ndt,\ndd {\n  line-height: 20px;\n}\n\ndt {\n  font-weight: bold;\n}\n\ndd {\n  margin-left: 10px;\n}\n\n.dl-horizontal {\n  *zoom: 1;\n}\n\n.dl-horizontal:before,\n.dl-horizontal:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.dl-horizontal:after {\n  clear: both;\n}\n\n.dl-horizontal dt {\n  float: left;\n  width: 160px;\n  overflow: hidden;\n  clear: left;\n  text-align: right;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.dl-horizontal dd {\n  margin-left: 180px;\n}\n\nhr {\n  margin: 20px 0;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n  border-bottom: 1px solid #ffffff;\n}\n\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\n\nabbr.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\nblockquote {\n  padding: 0 0 0 15px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\n\nblockquote p {\n  margin-bottom: 0;\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25;\n}\n\nblockquote small {\n  display: block;\n  line-height: 20px;\n  color: #999999;\n}\n\nblockquote small:before {\n  content: '\\2014 \\00A0';\n}\n\nblockquote.pull-right {\n  float: right;\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\n\nblockquote.pull-right p,\nblockquote.pull-right small {\n  text-align: right;\n}\n\nblockquote.pull-right small:before {\n  content: '';\n}\n\nblockquote.pull-right small:after {\n  content: '\\00A0 \\2014';\n}\n\nq:before,\nq:after,\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\naddress {\n  display: block;\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 20px;\n}\n\ncode,\npre {\n  padding: 0 3px 2px;\n  font-family: Monaco, Menlo, Consolas, \"Courier New\", monospace;\n  font-size: 12px;\n  color: #333333;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n\ncode {\n  padding: 2px 4px;\n  color: #d14;\n  white-space: nowrap;\n  background-color: #f7f7f9;\n  border: 1px solid #e1e1e8;\n}\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 20px;\n  word-break: break-all;\n  word-wrap: break-word;\n  white-space: pre;\n  white-space: pre-wrap;\n  background-color: #f5f5f5;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n\npre.prettyprint {\n  margin-bottom: 20px;\n}\n\npre code {\n  padding: 0;\n  color: inherit;\n  white-space: pre;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border: 0;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\nform {\n  margin: 0 0 20px;\n}\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: 40px;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\n\nlegend small {\n  font-size: 15px;\n  color: #999999;\n}\n\nlabel,\ninput,\nbutton,\nselect,\ntextarea {\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 20px;\n}\n\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n}\n\nlabel {\n  display: block;\n  margin-bottom: 5px;\n}\n\nselect,\ntextarea,\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"datetime\"],\ninput[type=\"datetime-local\"],\ninput[type=\"date\"],\ninput[type=\"month\"],\ninput[type=\"time\"],\ninput[type=\"week\"],\ninput[type=\"number\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"search\"],\ninput[type=\"tel\"],\ninput[type=\"color\"],\n.uneditable-input {\n  display: inline-block;\n  height: 20px;\n  padding: 4px 6px;\n  margin-bottom: 10px;\n  font-size: 14px;\n  line-height: 20px;\n  color: #555555;\n  vertical-align: middle;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n\ninput,\ntextarea,\n.uneditable-input {\n  width: 206px;\n}\n\ntextarea {\n  height: auto;\n}\n\ntextarea,\ninput[type=\"text\"],\ninput[type=\"password\"],\ninput[type=\"datetime\"],\ninput[type=\"datetime-local\"],\ninput[type=\"date\"],\ninput[type=\"month\"],\ninput[type=\"time\"],\ninput[type=\"week\"],\ninput[type=\"number\"],\ninput[type=\"email\"],\ninput[type=\"url\"],\ninput[type=\"search\"],\ninput[type=\"tel\"],\ninput[type=\"color\"],\n.uneditable-input {\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;\n     -moz-transition: border linear 0.2s, box-shadow linear 0.2s;\n       -o-transition: border linear 0.2s, box-shadow linear 0.2s;\n          transition: border linear 0.2s, box-shadow linear 0.2s;\n}\n\ntextarea:focus,\ninput[type=\"text\"]:focus,\ninput[type=\"password\"]:focus,\ninput[type=\"datetime\"]:focus,\ninput[type=\"datetime-local\"]:focus,\ninput[type=\"date\"]:focus,\ninput[type=\"month\"]:focus,\ninput[type=\"time\"]:focus,\ninput[type=\"week\"]:focus,\ninput[type=\"number\"]:focus,\ninput[type=\"email\"]:focus,\ninput[type=\"url\"]:focus,\ninput[type=\"search\"]:focus,\ninput[type=\"tel\"]:focus,\ninput[type=\"color\"]:focus,\n.uneditable-input:focus {\n  border-color: rgba(82, 168, 236, 0.8);\n  outline: 0;\n  outline: thin dotted \\9;\n  /* IE6-9 */\n\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  *margin-top: 0;\n  line-height: normal;\n}\n\ninput[type=\"file\"],\ninput[type=\"image\"],\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"],\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  width: auto;\n}\n\nselect,\ninput[type=\"file\"] {\n  height: 30px;\n  /* In IE7, the height of the select element cannot be changed by height, only font-size */\n\n  *margin-top: 4px;\n  /* For IE7, add top margin to align select with labels */\n\n  line-height: 30px;\n}\n\nselect {\n  width: 220px;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n}\n\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\nselect:focus,\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.uneditable-input,\n.uneditable-textarea {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #fcfcfc;\n  border-color: #cccccc;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);\n     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);\n}\n\n.uneditable-input {\n  overflow: hidden;\n  white-space: nowrap;\n}\n\n.uneditable-textarea {\n  width: auto;\n  height: auto;\n}\n\ninput:-moz-placeholder,\ntextarea:-moz-placeholder {\n  color: #999999;\n}\n\ninput:-ms-input-placeholder,\ntextarea:-ms-input-placeholder {\n  color: #999999;\n}\n\ninput::-webkit-input-placeholder,\ntextarea::-webkit-input-placeholder {\n  color: #999999;\n}\n\n.radio,\n.checkbox {\n  min-height: 20px;\n  padding-left: 20px;\n}\n\n.radio input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n\n.controls > .radio:first-child,\n.controls > .checkbox:first-child {\n  padding-top: 5px;\n}\n\n.radio.inline,\n.checkbox.inline {\n  display: inline-block;\n  padding-top: 5px;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n\n.radio.inline + .radio.inline,\n.checkbox.inline + .checkbox.inline {\n  margin-left: 10px;\n}\n\n.input-mini {\n  width: 60px;\n}\n\n.input-small {\n  width: 90px;\n}\n\n.input-medium {\n  width: 150px;\n}\n\n.input-large {\n  width: 210px;\n}\n\n.input-xlarge {\n  width: 270px;\n}\n\n.input-xxlarge {\n  width: 530px;\n}\n\ninput[class*=\"span\"],\nselect[class*=\"span\"],\ntextarea[class*=\"span\"],\n.uneditable-input[class*=\"span\"],\n.row-fluid input[class*=\"span\"],\n.row-fluid select[class*=\"span\"],\n.row-fluid textarea[class*=\"span\"],\n.row-fluid .uneditable-input[class*=\"span\"] {\n  float: none;\n  margin-left: 0;\n}\n\n.input-append input[class*=\"span\"],\n.input-append .uneditable-input[class*=\"span\"],\n.input-prepend input[class*=\"span\"],\n.input-prepend .uneditable-input[class*=\"span\"],\n.row-fluid input[class*=\"span\"],\n.row-fluid select[class*=\"span\"],\n.row-fluid textarea[class*=\"span\"],\n.row-fluid .uneditable-input[class*=\"span\"],\n.row-fluid .input-prepend [class*=\"span\"],\n.row-fluid .input-append [class*=\"span\"] {\n  display: inline-block;\n}\n\ninput,\ntextarea,\n.uneditable-input {\n  margin-left: 0;\n}\n\n.controls-row [class*=\"span\"] + [class*=\"span\"] {\n  margin-left: 20px;\n}\n\ninput.span12,\ntextarea.span12,\n.uneditable-input.span12 {\n  width: 926px;\n}\n\ninput.span11,\ntextarea.span11,\n.uneditable-input.span11 {\n  width: 846px;\n}\n\ninput.span10,\ntextarea.span10,\n.uneditable-input.span10 {\n  width: 766px;\n}\n\ninput.span9,\ntextarea.span9,\n.uneditable-input.span9 {\n  width: 686px;\n}\n\ninput.span8,\ntextarea.span8,\n.uneditable-input.span8 {\n  width: 606px;\n}\n\ninput.span7,\ntextarea.span7,\n.uneditable-input.span7 {\n  width: 526px;\n}\n\ninput.span6,\ntextarea.span6,\n.uneditable-input.span6 {\n  width: 446px;\n}\n\ninput.span5,\ntextarea.span5,\n.uneditable-input.span5 {\n  width: 366px;\n}\n\ninput.span4,\ntextarea.span4,\n.uneditable-input.span4 {\n  width: 286px;\n}\n\ninput.span3,\ntextarea.span3,\n.uneditable-input.span3 {\n  width: 206px;\n}\n\ninput.span2,\ntextarea.span2,\n.uneditable-input.span2 {\n  width: 126px;\n}\n\ninput.span1,\ntextarea.span1,\n.uneditable-input.span1 {\n  width: 46px;\n}\n\n.controls-row {\n  *zoom: 1;\n}\n\n.controls-row:before,\n.controls-row:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.controls-row:after {\n  clear: both;\n}\n\n.controls-row [class*=\"span\"],\n.row-fluid .controls-row [class*=\"span\"] {\n  float: left;\n}\n\n.controls-row .checkbox[class*=\"span\"],\n.controls-row .radio[class*=\"span\"] {\n  padding-top: 5px;\n}\n\ninput[disabled],\nselect[disabled],\ntextarea[disabled],\ninput[readonly],\nselect[readonly],\ntextarea[readonly] {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n}\n\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"][readonly],\ninput[type=\"checkbox\"][readonly] {\n  background-color: transparent;\n}\n\n.control-group.warning .control-label,\n.control-group.warning .help-block,\n.control-group.warning .help-inline {\n  color: #c09853;\n}\n\n.control-group.warning .checkbox,\n.control-group.warning .radio,\n.control-group.warning input,\n.control-group.warning select,\n.control-group.warning textarea {\n  color: #c09853;\n}\n\n.control-group.warning input,\n.control-group.warning select,\n.control-group.warning textarea {\n  border-color: #c09853;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.control-group.warning input:focus,\n.control-group.warning select:focus,\n.control-group.warning textarea:focus {\n  border-color: #a47e3c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n}\n\n.control-group.warning .input-prepend .add-on,\n.control-group.warning .input-append .add-on {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #c09853;\n}\n\n.control-group.error .control-label,\n.control-group.error .help-block,\n.control-group.error .help-inline {\n  color: #b94a48;\n}\n\n.control-group.error .checkbox,\n.control-group.error .radio,\n.control-group.error input,\n.control-group.error select,\n.control-group.error textarea {\n  color: #b94a48;\n}\n\n.control-group.error input,\n.control-group.error select,\n.control-group.error textarea {\n  border-color: #b94a48;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.control-group.error input:focus,\n.control-group.error select:focus,\n.control-group.error textarea:focus {\n  border-color: #953b39;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n}\n\n.control-group.error .input-prepend .add-on,\n.control-group.error .input-append .add-on {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #b94a48;\n}\n\n.control-group.success .control-label,\n.control-group.success .help-block,\n.control-group.success .help-inline {\n  color: #468847;\n}\n\n.control-group.success .checkbox,\n.control-group.success .radio,\n.control-group.success input,\n.control-group.success select,\n.control-group.success textarea {\n  color: #468847;\n}\n\n.control-group.success input,\n.control-group.success select,\n.control-group.success textarea {\n  border-color: #468847;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.control-group.success input:focus,\n.control-group.success select:focus,\n.control-group.success textarea:focus {\n  border-color: #356635;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n}\n\n.control-group.success .input-prepend .add-on,\n.control-group.success .input-append .add-on {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #468847;\n}\n\n.control-group.info .control-label,\n.control-group.info .help-block,\n.control-group.info .help-inline {\n  color: #3a87ad;\n}\n\n.control-group.info .checkbox,\n.control-group.info .radio,\n.control-group.info input,\n.control-group.info select,\n.control-group.info textarea {\n  color: #3a87ad;\n}\n\n.control-group.info input,\n.control-group.info select,\n.control-group.info textarea {\n  border-color: #3a87ad;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.control-group.info input:focus,\n.control-group.info select:focus,\n.control-group.info textarea:focus {\n  border-color: #2d6987;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;\n}\n\n.control-group.info .input-prepend .add-on,\n.control-group.info .input-append .add-on {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #3a87ad;\n}\n\ninput:focus:invalid,\ntextarea:focus:invalid,\nselect:focus:invalid {\n  color: #b94a48;\n  border-color: #ee5f5b;\n}\n\ninput:focus:invalid:focus,\ntextarea:focus:invalid:focus,\nselect:focus:invalid:focus {\n  border-color: #e9322d;\n  -webkit-box-shadow: 0 0 6px #f8b9b7;\n     -moz-box-shadow: 0 0 6px #f8b9b7;\n          box-shadow: 0 0 6px #f8b9b7;\n}\n\n.form-actions {\n  padding: 19px 20px 20px;\n  margin-top: 20px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #e5e5e5;\n  *zoom: 1;\n}\n\n.form-actions:before,\n.form-actions:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.form-actions:after {\n  clear: both;\n}\n\n.help-block,\n.help-inline {\n  color: #595959;\n}\n\n.help-block {\n  display: block;\n  margin-bottom: 10px;\n}\n\n.help-inline {\n  display: inline-block;\n  *display: inline;\n  padding-left: 5px;\n  vertical-align: middle;\n  *zoom: 1;\n}\n\n.input-append,\n.input-prepend {\n  display: inline-block;\n  margin-bottom: 10px;\n  font-size: 0;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n\n.input-append input,\n.input-prepend input,\n.input-append select,\n.input-prepend select,\n.input-append .uneditable-input,\n.input-prepend .uneditable-input,\n.input-append .dropdown-menu,\n.input-prepend .dropdown-menu,\n.input-append .popover,\n.input-prepend .popover {\n  font-size: 14px;\n}\n\n.input-append input,\n.input-prepend input,\n.input-append select,\n.input-prepend select,\n.input-append .uneditable-input,\n.input-prepend .uneditable-input {\n  position: relative;\n  margin-bottom: 0;\n  *margin-left: 0;\n  vertical-align: top;\n  -webkit-border-radius: 0 4px 4px 0;\n     -moz-border-radius: 0 4px 4px 0;\n          border-radius: 0 4px 4px 0;\n}\n\n.input-append input:focus,\n.input-prepend input:focus,\n.input-append select:focus,\n.input-prepend select:focus,\n.input-append .uneditable-input:focus,\n.input-prepend .uneditable-input:focus {\n  z-index: 2;\n}\n\n.input-append .add-on,\n.input-prepend .add-on {\n  display: inline-block;\n  width: auto;\n  height: 20px;\n  min-width: 16px;\n  padding: 4px 5px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 20px;\n  text-align: center;\n  text-shadow: 0 1px 0 #ffffff;\n  background-color: #eeeeee;\n  border: 1px solid #ccc;\n}\n\n.input-append .add-on,\n.input-prepend .add-on,\n.input-append .btn,\n.input-prepend .btn,\n.input-append .btn-group > .dropdown-toggle,\n.input-prepend .btn-group > .dropdown-toggle {\n  vertical-align: top;\n  -webkit-border-radius: 0;\n     -moz-border-radius: 0;\n          border-radius: 0;\n}\n\n.input-append .active,\n.input-prepend .active {\n  background-color: #a9dba9;\n  border-color: #46a546;\n}\n\n.input-prepend .add-on,\n.input-prepend .btn {\n  margin-right: -1px;\n}\n\n.input-prepend .add-on:first-child,\n.input-prepend .btn:first-child {\n  -webkit-border-radius: 4px 0 0 4px;\n     -moz-border-radius: 4px 0 0 4px;\n          border-radius: 4px 0 0 4px;\n}\n\n.input-append input,\n.input-append select,\n.input-append .uneditable-input {\n  -webkit-border-radius: 4px 0 0 4px;\n     -moz-border-radius: 4px 0 0 4px;\n          border-radius: 4px 0 0 4px;\n}\n\n.input-append input + .btn-group .btn:last-child,\n.input-append select + .btn-group .btn:last-child,\n.input-append .uneditable-input + .btn-group .btn:last-child {\n  -webkit-border-radius: 0 4px 4px 0;\n     -moz-border-radius: 0 4px 4px 0;\n          border-radius: 0 4px 4px 0;\n}\n\n.input-append .add-on,\n.input-append .btn,\n.input-append .btn-group {\n  margin-left: -1px;\n}\n\n.input-append .add-on:last-child,\n.input-append .btn:last-child,\n.input-append .btn-group:last-child > .dropdown-toggle {\n  -webkit-border-radius: 0 4px 4px 0;\n     -moz-border-radius: 0 4px 4px 0;\n          border-radius: 0 4px 4px 0;\n}\n\n.input-prepend.input-append input,\n.input-prepend.input-append select,\n.input-prepend.input-append .uneditable-input {\n  -webkit-border-radius: 0;\n     -moz-border-radius: 0;\n          border-radius: 0;\n}\n\n.input-prepend.input-append input + .btn-group .btn,\n.input-prepend.input-append select + .btn-group .btn,\n.input-prepend.input-append .uneditable-input + .btn-group .btn {\n  -webkit-border-radius: 0 4px 4px 0;\n     -moz-border-radius: 0 4px 4px 0;\n          border-radius: 0 4px 4px 0;\n}\n\n.input-prepend.input-append .add-on:first-child,\n.input-prepend.input-append .btn:first-child {\n  margin-right: -1px;\n  -webkit-border-radius: 4px 0 0 4px;\n     -moz-border-radius: 4px 0 0 4px;\n          border-radius: 4px 0 0 4px;\n}\n\n.input-prepend.input-append .add-on:last-child,\n.input-prepend.input-append .btn:last-child {\n  margin-left: -1px;\n  -webkit-border-radius: 0 4px 4px 0;\n     -moz-border-radius: 0 4px 4px 0;\n          border-radius: 0 4px 4px 0;\n}\n\n.input-prepend.input-append .btn-group:first-child {\n  margin-left: 0;\n}\n\ninput.search-query {\n  padding-right: 14px;\n  padding-right: 4px \\9;\n  padding-left: 14px;\n  padding-left: 4px \\9;\n  /* IE7-8 doesn't have border-radius, so don't indent the padding */\n\n  margin-bottom: 0;\n  -webkit-border-radius: 15px;\n     -moz-border-radius: 15px;\n          border-radius: 15px;\n}\n\n/* Allow for input prepend/append in search forms */\n\n.form-search .input-append .search-query,\n.form-search .input-prepend .search-query {\n  -webkit-border-radius: 0;\n     -moz-border-radius: 0;\n          border-radius: 0;\n}\n\n.form-search .input-append .search-query {\n  -webkit-border-radius: 14px 0 0 14px;\n     -moz-border-radius: 14px 0 0 14px;\n          border-radius: 14px 0 0 14px;\n}\n\n.form-search .input-append .btn {\n  -webkit-border-radius: 0 14px 14px 0;\n     -moz-border-radius: 0 14px 14px 0;\n          border-radius: 0 14px 14px 0;\n}\n\n.form-search .input-prepend .search-query {\n  -webkit-border-radius: 0 14px 14px 0;\n     -moz-border-radius: 0 14px 14px 0;\n          border-radius: 0 14px 14px 0;\n}\n\n.form-search .input-prepend .btn {\n  -webkit-border-radius: 14px 0 0 14px;\n     -moz-border-radius: 14px 0 0 14px;\n          border-radius: 14px 0 0 14px;\n}\n\n.form-search input,\n.form-inline input,\n.form-horizontal input,\n.form-search textarea,\n.form-inline textarea,\n.form-horizontal textarea,\n.form-search select,\n.form-inline select,\n.form-horizontal select,\n.form-search .help-inline,\n.form-inline .help-inline,\n.form-horizontal .help-inline,\n.form-search .uneditable-input,\n.form-inline .uneditable-input,\n.form-horizontal .uneditable-input,\n.form-search .input-prepend,\n.form-inline .input-prepend,\n.form-horizontal .input-prepend,\n.form-search .input-append,\n.form-inline .input-append,\n.form-horizontal .input-append {\n  display: inline-block;\n  *display: inline;\n  margin-bottom: 0;\n  vertical-align: middle;\n  *zoom: 1;\n}\n\n.form-search .hide,\n.form-inline .hide,\n.form-horizontal .hide {\n  display: none;\n}\n\n.form-search label,\n.form-inline label,\n.form-search .btn-group,\n.form-inline .btn-group {\n  display: inline-block;\n}\n\n.form-search .input-append,\n.form-inline .input-append,\n.form-search .input-prepend,\n.form-inline .input-prepend {\n  margin-bottom: 0;\n}\n\n.form-search .radio,\n.form-search .checkbox,\n.form-inline .radio,\n.form-inline .checkbox {\n  padding-left: 0;\n  margin-bottom: 0;\n  vertical-align: middle;\n}\n\n.form-search .radio input[type=\"radio\"],\n.form-search .checkbox input[type=\"checkbox\"],\n.form-inline .radio input[type=\"radio\"],\n.form-inline .checkbox input[type=\"checkbox\"] {\n  float: left;\n  margin-right: 3px;\n  margin-left: 0;\n}\n\n.control-group {\n  margin-bottom: 10px;\n}\n\nlegend + .control-group {\n  margin-top: 20px;\n  -webkit-margin-top-collapse: separate;\n}\n\n.form-horizontal .control-group {\n  margin-bottom: 20px;\n  *zoom: 1;\n}\n\n.form-horizontal .control-group:before,\n.form-horizontal .control-group:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.form-horizontal .control-group:after {\n  clear: both;\n}\n\n.form-horizontal .control-label {\n  float: left;\n  width: 160px;\n  padding-top: 5px;\n  text-align: right;\n}\n\n.form-horizontal .controls {\n  *display: inline-block;\n  *padding-left: 20px;\n  margin-left: 180px;\n  *margin-left: 0;\n}\n\n.form-horizontal .controls:first-child {\n  *padding-left: 180px;\n}\n\n.form-horizontal .help-block {\n  margin-bottom: 0;\n}\n\n.form-horizontal input + .help-block,\n.form-horizontal select + .help-block,\n.form-horizontal textarea + .help-block,\n.form-horizontal .uneditable-input + .help-block,\n.form-horizontal .input-prepend + .help-block,\n.form-horizontal .input-append + .help-block {\n  margin-top: 10px;\n}\n\n.form-horizontal .form-actions {\n  padding-left: 180px;\n}\n\ntable {\n  max-width: 100%;\n  background-color: transparent;\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\n\n.table th,\n.table td {\n  padding: 8px;\n  line-height: 20px;\n  text-align: left;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n\n.table th {\n  font-weight: bold;\n}\n\n.table thead th {\n  vertical-align: bottom;\n}\n\n.table caption + thead tr:first-child th,\n.table caption + thead tr:first-child td,\n.table colgroup + thead tr:first-child th,\n.table colgroup + thead tr:first-child td,\n.table thead:first-child tr:first-child th,\n.table thead:first-child tr:first-child td {\n  border-top: 0;\n}\n\n.table tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n\n.table .table {\n  background-color: #ffffff;\n}\n\n.table-condensed th,\n.table-condensed td {\n  padding: 4px 5px;\n}\n\n.table-bordered {\n  border: 1px solid #dddddd;\n  border-collapse: separate;\n  *border-collapse: collapse;\n  border-left: 0;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n\n.table-bordered th,\n.table-bordered td {\n  border-left: 1px solid #dddddd;\n}\n\n.table-bordered caption + thead tr:first-child th,\n.table-bordered caption + tbody tr:first-child th,\n.table-bordered caption + tbody tr:first-child td,\n.table-bordered colgroup + thead tr:first-child th,\n.table-bordered colgroup + tbody tr:first-child th,\n.table-bordered colgroup + tbody tr:first-child td,\n.table-bordered thead:first-child tr:first-child th,\n.table-bordered tbody:first-child tr:first-child th,\n.table-bordered tbody:first-child tr:first-child td {\n  border-top: 0;\n}\n\n.table-bordered thead:first-child tr:first-child > th:first-child,\n.table-bordered tbody:first-child tr:first-child > td:first-child,\n.table-bordered tbody:first-child tr:first-child > th:first-child {\n  -webkit-border-top-left-radius: 4px;\n          border-top-left-radius: 4px;\n  -moz-border-radius-topleft: 4px;\n}\n\n.table-bordered thead:first-child tr:first-child > th:last-child,\n.table-bordered tbody:first-child tr:first-child > td:last-child,\n.table-bordered tbody:first-child tr:first-child > th:last-child {\n  -webkit-border-top-right-radius: 4px;\n          border-top-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n}\n\n.table-bordered thead:last-child tr:last-child > th:first-child,\n.table-bordered tbody:last-child tr:last-child > td:first-child,\n.table-bordered tbody:last-child tr:last-child > th:first-child,\n.table-bordered tfoot:last-child tr:last-child > td:first-child,\n.table-bordered tfoot:last-child tr:last-child > th:first-child {\n  -webkit-border-bottom-left-radius: 4px;\n          border-bottom-left-radius: 4px;\n  -moz-border-radius-bottomleft: 4px;\n}\n\n.table-bordered thead:last-child tr:last-child > th:last-child,\n.table-bordered tbody:last-child tr:last-child > td:last-child,\n.table-bordered tbody:last-child tr:last-child > th:last-child,\n.table-bordered tfoot:last-child tr:last-child > td:last-child,\n.table-bordered tfoot:last-child tr:last-child > th:last-child {\n  -webkit-border-bottom-right-radius: 4px;\n          border-bottom-right-radius: 4px;\n  -moz-border-radius-bottomright: 4px;\n}\n\n.table-bordered tfoot + tbody:last-child tr:last-child td:first-child {\n  -webkit-border-bottom-left-radius: 0;\n          border-bottom-left-radius: 0;\n  -moz-border-radius-bottomleft: 0;\n}\n\n.table-bordered tfoot + tbody:last-child tr:last-child td:last-child {\n  -webkit-border-bottom-right-radius: 0;\n          border-bottom-right-radius: 0;\n  -moz-border-radius-bottomright: 0;\n}\n\n.table-bordered caption + thead tr:first-child th:first-child,\n.table-bordered caption + tbody tr:first-child td:first-child,\n.table-bordered colgroup + thead tr:first-child th:first-child,\n.table-bordered colgroup + tbody tr:first-child td:first-child {\n  -webkit-border-top-left-radius: 4px;\n          border-top-left-radius: 4px;\n  -moz-border-radius-topleft: 4px;\n}\n\n.table-bordered caption + thead tr:first-child th:last-child,\n.table-bordered caption + tbody tr:first-child td:last-child,\n.table-bordered colgroup + thead tr:first-child th:last-child,\n.table-bordered colgroup + tbody tr:first-child td:last-child {\n  -webkit-border-top-right-radius: 4px;\n          border-top-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n}\n\n.table-striped tbody > tr:nth-child(odd) > td,\n.table-striped tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n\n.table-hover tbody tr:hover > td,\n.table-hover tbody tr:hover > th {\n  background-color: #f5f5f5;\n}\n\ntable td[class*=\"span\"],\ntable th[class*=\"span\"],\n.row-fluid table td[class*=\"span\"],\n.row-fluid table th[class*=\"span\"] {\n  display: table-cell;\n  float: none;\n  margin-left: 0;\n}\n\n.table td.span1,\n.table th.span1 {\n  float: none;\n  width: 44px;\n  margin-left: 0;\n}\n\n.table td.span2,\n.table th.span2 {\n  float: none;\n  width: 124px;\n  margin-left: 0;\n}\n\n.table td.span3,\n.table th.span3 {\n  float: none;\n  width: 204px;\n  margin-left: 0;\n}\n\n.table td.span4,\n.table th.span4 {\n  float: none;\n  width: 284px;\n  margin-left: 0;\n}\n\n.table td.span5,\n.table th.span5 {\n  float: none;\n  width: 364px;\n  margin-left: 0;\n}\n\n.table td.span6,\n.table th.span6 {\n  float: none;\n  width: 444px;\n  margin-left: 0;\n}\n\n.table td.span7,\n.table th.span7 {\n  float: none;\n  width: 524px;\n  margin-left: 0;\n}\n\n.table td.span8,\n.table th.span8 {\n  float: none;\n  width: 604px;\n  margin-left: 0;\n}\n\n.table td.span9,\n.table th.span9 {\n  float: none;\n  width: 684px;\n  margin-left: 0;\n}\n\n.table td.span10,\n.table th.span10 {\n  float: none;\n  width: 764px;\n  margin-left: 0;\n}\n\n.table td.span11,\n.table th.span11 {\n  float: none;\n  width: 844px;\n  margin-left: 0;\n}\n\n.table td.span12,\n.table th.span12 {\n  float: none;\n  width: 924px;\n  margin-left: 0;\n}\n\n.table tbody tr.success > td {\n  background-color: #dff0d8;\n}\n\n.table tbody tr.error > td {\n  background-color: #f2dede;\n}\n\n.table tbody tr.warning > td {\n  background-color: #fcf8e3;\n}\n\n.table tbody tr.info > td {\n  background-color: #d9edf7;\n}\n\n.table-hover tbody tr.success:hover > td {\n  background-color: #d0e9c6;\n}\n\n.table-hover tbody tr.error:hover > td {\n  background-color: #ebcccc;\n}\n\n.table-hover tbody tr.warning:hover > td {\n  background-color: #faf2cc;\n}\n\n.table-hover tbody tr.info:hover > td {\n  background-color: #c4e3f3;\n}\n\n[class^=\"icon-\"],\n[class*=\" icon-\"] {\n  display: inline-block;\n  width: 14px;\n  height: 14px;\n  margin-top: 1px;\n  *margin-right: .3em;\n  line-height: 14px;\n  vertical-align: text-top;\n  background-image: url(\"../img/glyphicons-halflings.png\");\n  background-position: 14px 14px;\n  background-repeat: no-repeat;\n}\n\n/* White icons with optional class, or on hover/focus/active states of certain elements */\n\n.icon-white,\n.nav-pills > .active > a > [class^=\"icon-\"],\n.nav-pills > .active > a > [class*=\" icon-\"],\n.nav-list > .active > a > [class^=\"icon-\"],\n.nav-list > .active > a > [class*=\" icon-\"],\n.navbar-inverse .nav > .active > a > [class^=\"icon-\"],\n.navbar-inverse .nav > .active > a > [class*=\" icon-\"],\n.dropdown-menu > li > a:hover > [class^=\"icon-\"],\n.dropdown-menu > li > a:focus > [class^=\"icon-\"],\n.dropdown-menu > li > a:hover > [class*=\" icon-\"],\n.dropdown-menu > li > a:focus > [class*=\" icon-\"],\n.dropdown-menu > .active > a > [class^=\"icon-\"],\n.dropdown-menu > .active > a > [class*=\" icon-\"],\n.dropdown-submenu:hover > a > [class^=\"icon-\"],\n.dropdown-submenu:focus > a > [class^=\"icon-\"],\n.dropdown-submenu:hover > a > [class*=\" icon-\"],\n.dropdown-submenu:focus > a > [class*=\" icon-\"] {\n  background-image: url(\"../img/glyphicons-halflings-white.png\");\n}\n\n.icon-glass {\n  background-position: 0      0;\n}\n\n.icon-music {\n  background-position: -24px 0;\n}\n\n.icon-search {\n  background-position: -48px 0;\n}\n\n.icon-envelope {\n  background-position: -72px 0;\n}\n\n.icon-heart {\n  background-position: -96px 0;\n}\n\n.icon-star {\n  background-position: -120px 0;\n}\n\n.icon-star-empty {\n  background-position: -144px 0;\n}\n\n.icon-user {\n  background-position: -168px 0;\n}\n\n.icon-film {\n  background-position: -192px 0;\n}\n\n.icon-th-large {\n  background-position: -216px 0;\n}\n\n.icon-th {\n  background-position: -240px 0;\n}\n\n.icon-th-list {\n  background-position: -264px 0;\n}\n\n.icon-ok {\n  background-position: -288px 0;\n}\n\n.icon-remove {\n  background-position: -312px 0;\n}\n\n.icon-zoom-in {\n  background-position: -336px 0;\n}\n\n.icon-zoom-out {\n  background-position: -360px 0;\n}\n\n.icon-off {\n  background-position: -384px 0;\n}\n\n.icon-signal {\n  background-position: -408px 0;\n}\n\n.icon-cog {\n  background-position: -432px 0;\n}\n\n.icon-trash {\n  background-position: -456px 0;\n}\n\n.icon-home {\n  background-position: 0 -24px;\n}\n\n.icon-file {\n  background-position: -24px -24px;\n}\n\n.icon-time {\n  background-position: -48px -24px;\n}\n\n.icon-road {\n  background-position: -72px -24px;\n}\n\n.icon-download-alt {\n  background-position: -96px -24px;\n}\n\n.icon-download {\n  background-position: -120px -24px;\n}\n\n.icon-upload {\n  background-position: -144px -24px;\n}\n\n.icon-inbox {\n  background-position: -168px -24px;\n}\n\n.icon-play-circle {\n  background-position: -192px -24px;\n}\n\n.icon-repeat {\n  background-position: -216px -24px;\n}\n\n.icon-refresh {\n  background-position: -240px -24px;\n}\n\n.icon-list-alt {\n  background-position: -264px -24px;\n}\n\n.icon-lock {\n  background-position: -287px -24px;\n}\n\n.icon-flag {\n  background-position: -312px -24px;\n}\n\n.icon-headphones {\n  background-position: -336px -24px;\n}\n\n.icon-volume-off {\n  background-position: -360px -24px;\n}\n\n.icon-volume-down {\n  background-position: -384px -24px;\n}\n\n.icon-volume-up {\n  background-position: -408px -24px;\n}\n\n.icon-qrcode {\n  background-position: -432px -24px;\n}\n\n.icon-barcode {\n  background-position: -456px -24px;\n}\n\n.icon-tag {\n  background-position: 0 -48px;\n}\n\n.icon-tags {\n  background-position: -25px -48px;\n}\n\n.icon-book {\n  background-position: -48px -48px;\n}\n\n.icon-bookmark {\n  background-position: -72px -48px;\n}\n\n.icon-print {\n  background-position: -96px -48px;\n}\n\n.icon-camera {\n  background-position: -120px -48px;\n}\n\n.icon-font {\n  background-position: -144px -48px;\n}\n\n.icon-bold {\n  background-position: -167px -48px;\n}\n\n.icon-italic {\n  background-position: -192px -48px;\n}\n\n.icon-text-height {\n  background-position: -216px -48px;\n}\n\n.icon-text-width {\n  background-position: -240px -48px;\n}\n\n.icon-align-left {\n  background-position: -264px -48px;\n}\n\n.icon-align-center {\n  background-position: -288px -48px;\n}\n\n.icon-align-right {\n  background-position: -312px -48px;\n}\n\n.icon-align-justify {\n  background-position: -336px -48px;\n}\n\n.icon-list {\n  background-position: -360px -48px;\n}\n\n.icon-indent-left {\n  background-position: -384px -48px;\n}\n\n.icon-indent-right {\n  background-position: -408px -48px;\n}\n\n.icon-facetime-video {\n  background-position: -432px -48px;\n}\n\n.icon-picture {\n  background-position: -456px -48px;\n}\n\n.icon-pencil {\n  background-position: 0 -72px;\n}\n\n.icon-map-marker {\n  background-position: -24px -72px;\n}\n\n.icon-adjust {\n  background-position: -48px -72px;\n}\n\n.icon-tint {\n  background-position: -72px -72px;\n}\n\n.icon-edit {\n  background-position: -96px -72px;\n}\n\n.icon-share {\n  background-position: -120px -72px;\n}\n\n.icon-check {\n  background-position: -144px -72px;\n}\n\n.icon-move {\n  background-position: -168px -72px;\n}\n\n.icon-step-backward {\n  background-position: -192px -72px;\n}\n\n.icon-fast-backward {\n  background-position: -216px -72px;\n}\n\n.icon-backward {\n  background-position: -240px -72px;\n}\n\n.icon-play {\n  background-position: -264px -72px;\n}\n\n.icon-pause {\n  background-position: -288px -72px;\n}\n\n.icon-stop {\n  background-position: -312px -72px;\n}\n\n.icon-forward {\n  background-position: -336px -72px;\n}\n\n.icon-fast-forward {\n  background-position: -360px -72px;\n}\n\n.icon-step-forward {\n  background-position: -384px -72px;\n}\n\n.icon-eject {\n  background-position: -408px -72px;\n}\n\n.icon-chevron-left {\n  background-position: -432px -72px;\n}\n\n.icon-chevron-right {\n  background-position: -456px -72px;\n}\n\n.icon-plus-sign {\n  background-position: 0 -96px;\n}\n\n.icon-minus-sign {\n  background-position: -24px -96px;\n}\n\n.icon-remove-sign {\n  background-position: -48px -96px;\n}\n\n.icon-ok-sign {\n  background-position: -72px -96px;\n}\n\n.icon-question-sign {\n  background-position: -96px -96px;\n}\n\n.icon-info-sign {\n  background-position: -120px -96px;\n}\n\n.icon-screenshot {\n  background-position: -144px -96px;\n}\n\n.icon-remove-circle {\n  background-position: -168px -96px;\n}\n\n.icon-ok-circle {\n  background-position: -192px -96px;\n}\n\n.icon-ban-circle {\n  background-position: -216px -96px;\n}\n\n.icon-arrow-left {\n  background-position: -240px -96px;\n}\n\n.icon-arrow-right {\n  background-position: -264px -96px;\n}\n\n.icon-arrow-up {\n  background-position: -289px -96px;\n}\n\n.icon-arrow-down {\n  background-position: -312px -96px;\n}\n\n.icon-share-alt {\n  background-position: -336px -96px;\n}\n\n.icon-resize-full {\n  background-position: -360px -96px;\n}\n\n.icon-resize-small {\n  background-position: -384px -96px;\n}\n\n.icon-plus {\n  background-position: -408px -96px;\n}\n\n.icon-minus {\n  background-position: -433px -96px;\n}\n\n.icon-asterisk {\n  background-position: -456px -96px;\n}\n\n.icon-exclamation-sign {\n  background-position: 0 -120px;\n}\n\n.icon-gift {\n  background-position: -24px -120px;\n}\n\n.icon-leaf {\n  background-position: -48px -120px;\n}\n\n.icon-fire {\n  background-position: -72px -120px;\n}\n\n.icon-eye-open {\n  background-position: -96px -120px;\n}\n\n.icon-eye-close {\n  background-position: -120px -120px;\n}\n\n.icon-warning-sign {\n  background-position: -144px -120px;\n}\n\n.icon-plane {\n  background-position: -168px -120px;\n}\n\n.icon-calendar {\n  background-position: -192px -120px;\n}\n\n.icon-random {\n  width: 16px;\n  background-position: -216px -120px;\n}\n\n.icon-comment {\n  background-position: -240px -120px;\n}\n\n.icon-magnet {\n  background-position: -264px -120px;\n}\n\n.icon-chevron-up {\n  background-position: -288px -120px;\n}\n\n.icon-chevron-down {\n  background-position: -313px -119px;\n}\n\n.icon-retweet {\n  background-position: -336px -120px;\n}\n\n.icon-shopping-cart {\n  background-position: -360px -120px;\n}\n\n.icon-folder-close {\n  width: 16px;\n  background-position: -384px -120px;\n}\n\n.icon-folder-open {\n  width: 16px;\n  background-position: -408px -120px;\n}\n\n.icon-resize-vertical {\n  background-position: -432px -119px;\n}\n\n.icon-resize-horizontal {\n  background-position: -456px -118px;\n}\n\n.icon-hdd {\n  background-position: 0 -144px;\n}\n\n.icon-bullhorn {\n  background-position: -24px -144px;\n}\n\n.icon-bell {\n  background-position: -48px -144px;\n}\n\n.icon-certificate {\n  background-position: -72px -144px;\n}\n\n.icon-thumbs-up {\n  background-position: -96px -144px;\n}\n\n.icon-thumbs-down {\n  background-position: -120px -144px;\n}\n\n.icon-hand-right {\n  background-position: -144px -144px;\n}\n\n.icon-hand-left {\n  background-position: -168px -144px;\n}\n\n.icon-hand-up {\n  background-position: -192px -144px;\n}\n\n.icon-hand-down {\n  background-position: -216px -144px;\n}\n\n.icon-circle-arrow-right {\n  background-position: -240px -144px;\n}\n\n.icon-circle-arrow-left {\n  background-position: -264px -144px;\n}\n\n.icon-circle-arrow-up {\n  background-position: -288px -144px;\n}\n\n.icon-circle-arrow-down {\n  background-position: -312px -144px;\n}\n\n.icon-globe {\n  background-position: -336px -144px;\n}\n\n.icon-wrench {\n  background-position: -360px -144px;\n}\n\n.icon-tasks {\n  background-position: -384px -144px;\n}\n\n.icon-filter {\n  background-position: -408px -144px;\n}\n\n.icon-briefcase {\n  background-position: -432px -144px;\n}\n\n.icon-fullscreen {\n  background-position: -456px -144px;\n}\n\n.dropup,\n.dropdown {\n  position: relative;\n}\n\n.dropdown-toggle {\n  *margin-bottom: -3px;\n}\n\n.dropdown-toggle:active,\n.open .dropdown-toggle {\n  outline: 0;\n}\n\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  vertical-align: top;\n  border-top: 4px solid #000000;\n  border-right: 4px solid transparent;\n  border-left: 4px solid transparent;\n  content: \"\";\n}\n\n.dropdown .caret {\n  margin-top: 8px;\n  margin-left: 2px;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  *border-right-width: 2px;\n  *border-bottom-width: 2px;\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  -webkit-background-clip: padding-box;\n     -moz-background-clip: padding;\n          background-clip: padding-box;\n}\n\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.dropdown-menu .divider {\n  *width: 100%;\n  height: 1px;\n  margin: 9px 1px;\n  *margin: -5px 0 5px;\n  overflow: hidden;\n  background-color: #e5e5e5;\n  border-bottom: 1px solid #ffffff;\n}\n\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 20px;\n  color: #333333;\n  white-space: nowrap;\n}\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus,\n.dropdown-submenu:hover > a,\n.dropdown-submenu:focus > a {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #0081c2;\n  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));\n  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);\n  background-image: -o-linear-gradient(top, #0088cc, #0077b3);\n  background-image: linear-gradient(to bottom, #0088cc, #0077b3);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);\n}\n\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #0081c2;\n  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));\n  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);\n  background-image: -o-linear-gradient(top, #0088cc, #0077b3);\n  background-image: linear-gradient(to bottom, #0088cc, #0077b3);\n  background-repeat: repeat-x;\n  outline: 0;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);\n}\n\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: default;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.open {\n  *z-index: 1000;\n}\n\n.open > .dropdown-menu {\n  display: block;\n}\n\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0;\n  border-bottom: 4px solid #000000;\n  content: \"\";\n}\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n\n.dropdown-submenu {\n  position: relative;\n}\n\n.dropdown-submenu > .dropdown-menu {\n  top: 0;\n  left: 100%;\n  margin-top: -6px;\n  margin-left: -1px;\n  -webkit-border-radius: 0 6px 6px 6px;\n     -moz-border-radius: 0 6px 6px 6px;\n          border-radius: 0 6px 6px 6px;\n}\n\n.dropdown-submenu:hover > .dropdown-menu {\n  display: block;\n}\n\n.dropup .dropdown-submenu > .dropdown-menu {\n  top: auto;\n  bottom: 0;\n  margin-top: 0;\n  margin-bottom: -2px;\n  -webkit-border-radius: 5px 5px 5px 0;\n     -moz-border-radius: 5px 5px 5px 0;\n          border-radius: 5px 5px 5px 0;\n}\n\n.dropdown-submenu > a:after {\n  display: block;\n  float: right;\n  width: 0;\n  height: 0;\n  margin-top: 5px;\n  margin-right: -10px;\n  border-color: transparent;\n  border-left-color: #cccccc;\n  border-style: solid;\n  border-width: 5px 0 5px 5px;\n  content: \" \";\n}\n\n.dropdown-submenu:hover > a:after {\n  border-left-color: #ffffff;\n}\n\n.dropdown-submenu.pull-left {\n  float: none;\n}\n\n.dropdown-submenu.pull-left > .dropdown-menu {\n  left: -100%;\n  margin-left: 10px;\n  -webkit-border-radius: 6px 0 6px 6px;\n     -moz-border-radius: 6px 0 6px 6px;\n          border-radius: 6px 0 6px 6px;\n}\n\n.dropdown .dropdown-menu .nav-header {\n  padding-right: 20px;\n  padding-left: 20px;\n}\n\n.typeahead {\n  z-index: 1051;\n  margin-top: 2px;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n\n.well-large {\n  padding: 24px;\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n}\n\n.well-small {\n  padding: 9px;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n     -moz-transition: opacity 0.15s linear;\n       -o-transition: opacity 0.15s linear;\n          transition: opacity 0.15s linear;\n}\n\n.fade.in {\n  opacity: 1;\n}\n\n.collapse {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n     -moz-transition: height 0.35s ease;\n       -o-transition: height 0.35s ease;\n          transition: height 0.35s ease;\n}\n\n.collapse.in {\n  height: auto;\n}\n\n.close {\n  float: right;\n  font-size: 20px;\n  font-weight: bold;\n  line-height: 20px;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n\n.close:hover,\n.close:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.4;\n  filter: alpha(opacity=40);\n}\n\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n\n.btn {\n  display: inline-block;\n  *display: inline;\n  padding: 4px 12px;\n  margin-bottom: 0;\n  *margin-left: .3em;\n  font-size: 14px;\n  line-height: 20px;\n  color: #333333;\n  text-align: center;\n  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);\n  vertical-align: middle;\n  cursor: pointer;\n  background-color: #f5f5f5;\n  *background-color: #e6e6e6;\n  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);\n  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);\n  background-repeat: repeat-x;\n  border: 1px solid #cccccc;\n  *border: 0;\n  border-color: #e6e6e6 #e6e6e6 #bfbfbf;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  border-bottom-color: #b3b3b3;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  *zoom: 1;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.btn:hover,\n.btn:focus,\n.btn:active,\n.btn.active,\n.btn.disabled,\n.btn[disabled] {\n  color: #333333;\n  background-color: #e6e6e6;\n  *background-color: #d9d9d9;\n}\n\n.btn:active,\n.btn.active {\n  background-color: #cccccc \\9;\n}\n\n.btn:first-child {\n  *margin-left: 0;\n}\n\n.btn:hover,\n.btn:focus {\n  color: #333333;\n  text-decoration: none;\n  background-position: 0 -15px;\n  -webkit-transition: background-position 0.1s linear;\n     -moz-transition: background-position 0.1s linear;\n       -o-transition: background-position 0.1s linear;\n          transition: background-position 0.1s linear;\n}\n\n.btn:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.btn.active,\n.btn:active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.btn.disabled,\n.btn[disabled] {\n  cursor: default;\n  background-image: none;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n     -moz-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-large {\n  padding: 11px 19px;\n  font-size: 17.5px;\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n}\n\n.btn-large [class^=\"icon-\"],\n.btn-large [class*=\" icon-\"] {\n  margin-top: 4px;\n}\n\n.btn-small {\n  padding: 2px 10px;\n  font-size: 11.9px;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n\n.btn-small [class^=\"icon-\"],\n.btn-small [class*=\" icon-\"] {\n  margin-top: 0;\n}\n\n.btn-mini [class^=\"icon-\"],\n.btn-mini [class*=\" icon-\"] {\n  margin-top: -1px;\n}\n\n.btn-mini {\n  padding: 0 6px;\n  font-size: 10.5px;\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-right: 0;\n  padding-left: 0;\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.btn-primary.active,\n.btn-warning.active,\n.btn-danger.active,\n.btn-success.active,\n.btn-info.active,\n.btn-inverse.active {\n  color: rgba(255, 255, 255, 0.75);\n}\n\n.btn-primary {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #006dcc;\n  *background-color: #0044cc;\n  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));\n  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);\n  background-image: -o-linear-gradient(top, #0088cc, #0044cc);\n  background-image: linear-gradient(to bottom, #0088cc, #0044cc);\n  background-repeat: repeat-x;\n  border-color: #0044cc #0044cc #002a80;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.btn-primary.disabled,\n.btn-primary[disabled] {\n  color: #ffffff;\n  background-color: #0044cc;\n  *background-color: #003bb3;\n}\n\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #003399 \\9;\n}\n\n.btn-warning {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #faa732;\n  *background-color: #f89406;\n  background-image: -moz-linear-gradient(top, #fbb450, #f89406);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));\n  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);\n  background-image: -o-linear-gradient(top, #fbb450, #f89406);\n  background-image: linear-gradient(to bottom, #fbb450, #f89406);\n  background-repeat: repeat-x;\n  border-color: #f89406 #f89406 #ad6704;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.btn-warning.disabled,\n.btn-warning[disabled] {\n  color: #ffffff;\n  background-color: #f89406;\n  *background-color: #df8505;\n}\n\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #c67605 \\9;\n}\n\n.btn-danger {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #da4f49;\n  *background-color: #bd362f;\n  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));\n  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);\n  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);\n  background-repeat: repeat-x;\n  border-color: #bd362f #bd362f #802420;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.btn-danger.disabled,\n.btn-danger[disabled] {\n  color: #ffffff;\n  background-color: #bd362f;\n  *background-color: #a9302a;\n}\n\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #942a25 \\9;\n}\n\n.btn-success {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #5bb75b;\n  *background-color: #51a351;\n  background-image: -moz-linear-gradient(top, #62c462, #51a351);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));\n  background-image: -webkit-linear-gradient(top, #62c462, #51a351);\n  background-image: -o-linear-gradient(top, #62c462, #51a351);\n  background-image: linear-gradient(to bottom, #62c462, #51a351);\n  background-repeat: repeat-x;\n  border-color: #51a351 #51a351 #387038;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.btn-success.disabled,\n.btn-success[disabled] {\n  color: #ffffff;\n  background-color: #51a351;\n  *background-color: #499249;\n}\n\n.btn-success:active,\n.btn-success.active {\n  background-color: #408140 \\9;\n}\n\n.btn-info {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #49afcd;\n  *background-color: #2f96b4;\n  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));\n  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);\n  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);\n  background-repeat: repeat-x;\n  border-color: #2f96b4 #2f96b4 #1f6377;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.btn-info.disabled,\n.btn-info[disabled] {\n  color: #ffffff;\n  background-color: #2f96b4;\n  *background-color: #2a85a0;\n}\n\n.btn-info:active,\n.btn-info.active {\n  background-color: #24748c \\9;\n}\n\n.btn-inverse {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #363636;\n  *background-color: #222222;\n  background-image: -moz-linear-gradient(top, #444444, #222222);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));\n  background-image: -webkit-linear-gradient(top, #444444, #222222);\n  background-image: -o-linear-gradient(top, #444444, #222222);\n  background-image: linear-gradient(to bottom, #444444, #222222);\n  background-repeat: repeat-x;\n  border-color: #222222 #222222 #000000;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.btn-inverse:hover,\n.btn-inverse:focus,\n.btn-inverse:active,\n.btn-inverse.active,\n.btn-inverse.disabled,\n.btn-inverse[disabled] {\n  color: #ffffff;\n  background-color: #222222;\n  *background-color: #151515;\n}\n\n.btn-inverse:active,\n.btn-inverse.active {\n  background-color: #080808 \\9;\n}\n\nbutton.btn,\ninput[type=\"submit\"].btn {\n  *padding-top: 3px;\n  *padding-bottom: 3px;\n}\n\nbutton.btn::-moz-focus-inner,\ninput[type=\"submit\"].btn::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\nbutton.btn.btn-large,\ninput[type=\"submit\"].btn.btn-large {\n  *padding-top: 7px;\n  *padding-bottom: 7px;\n}\n\nbutton.btn.btn-small,\ninput[type=\"submit\"].btn.btn-small {\n  *padding-top: 3px;\n  *padding-bottom: 3px;\n}\n\nbutton.btn.btn-mini,\ninput[type=\"submit\"].btn.btn-mini {\n  *padding-top: 1px;\n  *padding-bottom: 1px;\n}\n\n.btn-link,\n.btn-link:active,\n.btn-link[disabled] {\n  background-color: transparent;\n  background-image: none;\n  -webkit-box-shadow: none;\n     -moz-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-link {\n  color: #0088cc;\n  cursor: pointer;\n  border-color: transparent;\n  -webkit-border-radius: 0;\n     -moz-border-radius: 0;\n          border-radius: 0;\n}\n\n.btn-link:hover,\n.btn-link:focus {\n  color: #005580;\n  text-decoration: underline;\n  background-color: transparent;\n}\n\n.btn-link[disabled]:hover,\n.btn-link[disabled]:focus {\n  color: #333333;\n  text-decoration: none;\n}\n\n.btn-group {\n  position: relative;\n  display: inline-block;\n  *display: inline;\n  *margin-left: .3em;\n  font-size: 0;\n  white-space: nowrap;\n  vertical-align: middle;\n  *zoom: 1;\n}\n\n.btn-group:first-child {\n  *margin-left: 0;\n}\n\n.btn-group + .btn-group {\n  margin-left: 5px;\n}\n\n.btn-toolbar {\n  margin-top: 10px;\n  margin-bottom: 10px;\n  font-size: 0;\n}\n\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group {\n  margin-left: 5px;\n}\n\n.btn-group > .btn {\n  position: relative;\n  -webkit-border-radius: 0;\n     -moz-border-radius: 0;\n          border-radius: 0;\n}\n\n.btn-group > .btn + .btn {\n  margin-left: -1px;\n}\n\n.btn-group > .btn,\n.btn-group > .dropdown-menu,\n.btn-group > .popover {\n  font-size: 14px;\n}\n\n.btn-group > .btn-mini {\n  font-size: 10.5px;\n}\n\n.btn-group > .btn-small {\n  font-size: 11.9px;\n}\n\n.btn-group > .btn-large {\n  font-size: 17.5px;\n}\n\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  -webkit-border-bottom-left-radius: 4px;\n          border-bottom-left-radius: 4px;\n  -webkit-border-top-left-radius: 4px;\n          border-top-left-radius: 4px;\n  -moz-border-radius-bottomleft: 4px;\n  -moz-border-radius-topleft: 4px;\n}\n\n.btn-group > .btn:last-child,\n.btn-group > .dropdown-toggle {\n  -webkit-border-top-right-radius: 4px;\n          border-top-right-radius: 4px;\n  -webkit-border-bottom-right-radius: 4px;\n          border-bottom-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n  -moz-border-radius-bottomright: 4px;\n}\n\n.btn-group > .btn.large:first-child {\n  margin-left: 0;\n  -webkit-border-bottom-left-radius: 6px;\n          border-bottom-left-radius: 6px;\n  -webkit-border-top-left-radius: 6px;\n          border-top-left-radius: 6px;\n  -moz-border-radius-bottomleft: 6px;\n  -moz-border-radius-topleft: 6px;\n}\n\n.btn-group > .btn.large:last-child,\n.btn-group > .large.dropdown-toggle {\n  -webkit-border-top-right-radius: 6px;\n          border-top-right-radius: 6px;\n  -webkit-border-bottom-right-radius: 6px;\n          border-bottom-right-radius: 6px;\n  -moz-border-radius-topright: 6px;\n  -moz-border-radius-bottomright: 6px;\n}\n\n.btn-group > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group > .btn:active,\n.btn-group > .btn.active {\n  z-index: 2;\n}\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n.btn-group > .btn + .dropdown-toggle {\n  *padding-top: 5px;\n  padding-right: 8px;\n  *padding-bottom: 5px;\n  padding-left: 8px;\n  -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n     -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.btn-group > .btn-mini + .dropdown-toggle {\n  *padding-top: 2px;\n  padding-right: 5px;\n  *padding-bottom: 2px;\n  padding-left: 5px;\n}\n\n.btn-group > .btn-small + .dropdown-toggle {\n  *padding-top: 5px;\n  *padding-bottom: 4px;\n}\n\n.btn-group > .btn-large + .dropdown-toggle {\n  *padding-top: 7px;\n  padding-right: 12px;\n  *padding-bottom: 7px;\n  padding-left: 12px;\n}\n\n.btn-group.open .dropdown-toggle {\n  background-image: none;\n  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.btn-group.open .btn.dropdown-toggle {\n  background-color: #e6e6e6;\n}\n\n.btn-group.open .btn-primary.dropdown-toggle {\n  background-color: #0044cc;\n}\n\n.btn-group.open .btn-warning.dropdown-toggle {\n  background-color: #f89406;\n}\n\n.btn-group.open .btn-danger.dropdown-toggle {\n  background-color: #bd362f;\n}\n\n.btn-group.open .btn-success.dropdown-toggle {\n  background-color: #51a351;\n}\n\n.btn-group.open .btn-info.dropdown-toggle {\n  background-color: #2f96b4;\n}\n\n.btn-group.open .btn-inverse.dropdown-toggle {\n  background-color: #222222;\n}\n\n.btn .caret {\n  margin-top: 8px;\n  margin-left: 0;\n}\n\n.btn-large .caret {\n  margin-top: 6px;\n}\n\n.btn-large .caret {\n  border-top-width: 5px;\n  border-right-width: 5px;\n  border-left-width: 5px;\n}\n\n.btn-mini .caret,\n.btn-small .caret {\n  margin-top: 8px;\n}\n\n.dropup .btn-large .caret {\n  border-bottom-width: 5px;\n}\n\n.btn-primary .caret,\n.btn-warning .caret,\n.btn-danger .caret,\n.btn-info .caret,\n.btn-success .caret,\n.btn-inverse .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.btn-group-vertical {\n  display: inline-block;\n  *display: inline;\n  /* IE7 inline-block hack */\n\n  *zoom: 1;\n}\n\n.btn-group-vertical > .btn {\n  display: block;\n  float: none;\n  max-width: 100%;\n  -webkit-border-radius: 0;\n     -moz-border-radius: 0;\n          border-radius: 0;\n}\n\n.btn-group-vertical > .btn + .btn {\n  margin-top: -1px;\n  margin-left: 0;\n}\n\n.btn-group-vertical > .btn:first-child {\n  -webkit-border-radius: 4px 4px 0 0;\n     -moz-border-radius: 4px 4px 0 0;\n          border-radius: 4px 4px 0 0;\n}\n\n.btn-group-vertical > .btn:last-child {\n  -webkit-border-radius: 0 0 4px 4px;\n     -moz-border-radius: 0 0 4px 4px;\n          border-radius: 0 0 4px 4px;\n}\n\n.btn-group-vertical > .btn-large:first-child {\n  -webkit-border-radius: 6px 6px 0 0;\n     -moz-border-radius: 6px 6px 0 0;\n          border-radius: 6px 6px 0 0;\n}\n\n.btn-group-vertical > .btn-large:last-child {\n  -webkit-border-radius: 0 0 6px 6px;\n     -moz-border-radius: 0 0 6px 6px;\n          border-radius: 0 0 6px 6px;\n}\n\n.alert {\n  padding: 8px 35px 8px 14px;\n  margin-bottom: 20px;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n  background-color: #fcf8e3;\n  border: 1px solid #fbeed5;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n\n.alert,\n.alert h4 {\n  color: #c09853;\n}\n\n.alert h4 {\n  margin: 0;\n}\n\n.alert .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  line-height: 20px;\n}\n\n.alert-success {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.alert-success h4 {\n  color: #468847;\n}\n\n.alert-danger,\n.alert-error {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.alert-danger h4,\n.alert-error h4 {\n  color: #b94a48;\n}\n\n.alert-info {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.alert-info h4 {\n  color: #3a87ad;\n}\n\n.alert-block {\n  padding-top: 14px;\n  padding-bottom: 14px;\n}\n\n.alert-block > p,\n.alert-block > ul {\n  margin-bottom: 0;\n}\n\n.alert-block p + p {\n  margin-top: 5px;\n}\n\n.nav {\n  margin-bottom: 20px;\n  margin-left: 0;\n  list-style: none;\n}\n\n.nav > li > a {\n  display: block;\n}\n\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.nav > li > a > img {\n  max-width: none;\n}\n\n.nav > .pull-right {\n  float: right;\n}\n\n.nav-header {\n  display: block;\n  padding: 3px 15px;\n  font-size: 11px;\n  font-weight: bold;\n  line-height: 20px;\n  color: #999999;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n  text-transform: uppercase;\n}\n\n.nav li + .nav-header {\n  margin-top: 9px;\n}\n\n.nav-list {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-bottom: 0;\n}\n\n.nav-list > li > a,\n.nav-list .nav-header {\n  margin-right: -15px;\n  margin-left: -15px;\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n}\n\n.nav-list > li > a {\n  padding: 3px 15px;\n}\n\n.nav-list > .active > a,\n.nav-list > .active > a:hover,\n.nav-list > .active > a:focus {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n  background-color: #0088cc;\n}\n\n.nav-list [class^=\"icon-\"],\n.nav-list [class*=\" icon-\"] {\n  margin-right: 2px;\n}\n\n.nav-list .divider {\n  *width: 100%;\n  height: 1px;\n  margin: 9px 1px;\n  *margin: -5px 0 5px;\n  overflow: hidden;\n  background-color: #e5e5e5;\n  border-bottom: 1px solid #ffffff;\n}\n\n.nav-tabs,\n.nav-pills {\n  *zoom: 1;\n}\n\n.nav-tabs:before,\n.nav-pills:before,\n.nav-tabs:after,\n.nav-pills:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.nav-tabs:after,\n.nav-pills:after {\n  clear: both;\n}\n\n.nav-tabs > li,\n.nav-pills > li {\n  float: left;\n}\n\n.nav-tabs > li > a,\n.nav-pills > li > a {\n  padding-right: 12px;\n  padding-left: 12px;\n  margin-right: 2px;\n  line-height: 14px;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #ddd;\n}\n\n.nav-tabs > li {\n  margin-bottom: -1px;\n}\n\n.nav-tabs > li > a {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  line-height: 20px;\n  border: 1px solid transparent;\n  -webkit-border-radius: 4px 4px 0 0;\n     -moz-border-radius: 4px 4px 0 0;\n          border-radius: 4px 4px 0 0;\n}\n\n.nav-tabs > li > a:hover,\n.nav-tabs > li > a:focus {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n\n.nav-tabs > .active > a,\n.nav-tabs > .active > a:hover,\n.nav-tabs > .active > a:focus {\n  color: #555555;\n  cursor: default;\n  background-color: #ffffff;\n  border: 1px solid #ddd;\n  border-bottom-color: transparent;\n}\n\n.nav-pills > li > a {\n  padding-top: 8px;\n  padding-bottom: 8px;\n  margin-top: 2px;\n  margin-bottom: 2px;\n  -webkit-border-radius: 5px;\n     -moz-border-radius: 5px;\n          border-radius: 5px;\n}\n\n.nav-pills > .active > a,\n.nav-pills > .active > a:hover,\n.nav-pills > .active > a:focus {\n  color: #ffffff;\n  background-color: #0088cc;\n}\n\n.nav-stacked > li {\n  float: none;\n}\n\n.nav-stacked > li > a {\n  margin-right: 0;\n}\n\n.nav-tabs.nav-stacked {\n  border-bottom: 0;\n}\n\n.nav-tabs.nav-stacked > li > a {\n  border: 1px solid #ddd;\n  -webkit-border-radius: 0;\n     -moz-border-radius: 0;\n          border-radius: 0;\n}\n\n.nav-tabs.nav-stacked > li:first-child > a {\n  -webkit-border-top-right-radius: 4px;\n          border-top-right-radius: 4px;\n  -webkit-border-top-left-radius: 4px;\n          border-top-left-radius: 4px;\n  -moz-border-radius-topright: 4px;\n  -moz-border-radius-topleft: 4px;\n}\n\n.nav-tabs.nav-stacked > li:last-child > a {\n  -webkit-border-bottom-right-radius: 4px;\n          border-bottom-right-radius: 4px;\n  -webkit-border-bottom-left-radius: 4px;\n          border-bottom-left-radius: 4px;\n  -moz-border-radius-bottomright: 4px;\n  -moz-border-radius-bottomleft: 4px;\n}\n\n.nav-tabs.nav-stacked > li > a:hover,\n.nav-tabs.nav-stacked > li > a:focus {\n  z-index: 2;\n  border-color: #ddd;\n}\n\n.nav-pills.nav-stacked > li > a {\n  margin-bottom: 3px;\n}\n\n.nav-pills.nav-stacked > li:last-child > a {\n  margin-bottom: 1px;\n}\n\n.nav-tabs .dropdown-menu {\n  -webkit-border-radius: 0 0 6px 6px;\n     -moz-border-radius: 0 0 6px 6px;\n          border-radius: 0 0 6px 6px;\n}\n\n.nav-pills .dropdown-menu {\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n}\n\n.nav .dropdown-toggle .caret {\n  margin-top: 6px;\n  border-top-color: #0088cc;\n  border-bottom-color: #0088cc;\n}\n\n.nav .dropdown-toggle:hover .caret,\n.nav .dropdown-toggle:focus .caret {\n  border-top-color: #005580;\n  border-bottom-color: #005580;\n}\n\n/* move down carets for tabs */\n\n.nav-tabs .dropdown-toggle .caret {\n  margin-top: 8px;\n}\n\n.nav .active .dropdown-toggle .caret {\n  border-top-color: #fff;\n  border-bottom-color: #fff;\n}\n\n.nav-tabs .active .dropdown-toggle .caret {\n  border-top-color: #555555;\n  border-bottom-color: #555555;\n}\n\n.nav > .dropdown.active > a:hover,\n.nav > .dropdown.active > a:focus {\n  cursor: pointer;\n}\n\n.nav-tabs .open .dropdown-toggle,\n.nav-pills .open .dropdown-toggle,\n.nav > li.dropdown.open.active > a:hover,\n.nav > li.dropdown.open.active > a:focus {\n  color: #ffffff;\n  background-color: #999999;\n  border-color: #999999;\n}\n\n.nav li.dropdown.open .caret,\n.nav li.dropdown.open.active .caret,\n.nav li.dropdown.open a:hover .caret,\n.nav li.dropdown.open a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n  opacity: 1;\n  filter: alpha(opacity=100);\n}\n\n.tabs-stacked .open > a:hover,\n.tabs-stacked .open > a:focus {\n  border-color: #999999;\n}\n\n.tabbable {\n  *zoom: 1;\n}\n\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.tabbable:after {\n  clear: both;\n}\n\n.tab-content {\n  overflow: auto;\n}\n\n.tabs-below > .nav-tabs,\n.tabs-right > .nav-tabs,\n.tabs-left > .nav-tabs {\n  border-bottom: 0;\n}\n\n.tab-content > .tab-pane,\n.pill-content > .pill-pane {\n  display: none;\n}\n\n.tab-content > .active,\n.pill-content > .active {\n  display: block;\n}\n\n.tabs-below > .nav-tabs {\n  border-top: 1px solid #ddd;\n}\n\n.tabs-below > .nav-tabs > li {\n  margin-top: -1px;\n  margin-bottom: 0;\n}\n\n.tabs-below > .nav-tabs > li > a {\n  -webkit-border-radius: 0 0 4px 4px;\n     -moz-border-radius: 0 0 4px 4px;\n          border-radius: 0 0 4px 4px;\n}\n\n.tabs-below > .nav-tabs > li > a:hover,\n.tabs-below > .nav-tabs > li > a:focus {\n  border-top-color: #ddd;\n  border-bottom-color: transparent;\n}\n\n.tabs-below > .nav-tabs > .active > a,\n.tabs-below > .nav-tabs > .active > a:hover,\n.tabs-below > .nav-tabs > .active > a:focus {\n  border-color: transparent #ddd #ddd #ddd;\n}\n\n.tabs-left > .nav-tabs > li,\n.tabs-right > .nav-tabs > li {\n  float: none;\n}\n\n.tabs-left > .nav-tabs > li > a,\n.tabs-right > .nav-tabs > li > a {\n  min-width: 74px;\n  margin-right: 0;\n  margin-bottom: 3px;\n}\n\n.tabs-left > .nav-tabs {\n  float: left;\n  margin-right: 19px;\n  border-right: 1px solid #ddd;\n}\n\n.tabs-left > .nav-tabs > li > a {\n  margin-right: -1px;\n  -webkit-border-radius: 4px 0 0 4px;\n     -moz-border-radius: 4px 0 0 4px;\n          border-radius: 4px 0 0 4px;\n}\n\n.tabs-left > .nav-tabs > li > a:hover,\n.tabs-left > .nav-tabs > li > a:focus {\n  border-color: #eeeeee #dddddd #eeeeee #eeeeee;\n}\n\n.tabs-left > .nav-tabs .active > a,\n.tabs-left > .nav-tabs .active > a:hover,\n.tabs-left > .nav-tabs .active > a:focus {\n  border-color: #ddd transparent #ddd #ddd;\n  *border-right-color: #ffffff;\n}\n\n.tabs-right > .nav-tabs {\n  float: right;\n  margin-left: 19px;\n  border-left: 1px solid #ddd;\n}\n\n.tabs-right > .nav-tabs > li > a {\n  margin-left: -1px;\n  -webkit-border-radius: 0 4px 4px 0;\n     -moz-border-radius: 0 4px 4px 0;\n          border-radius: 0 4px 4px 0;\n}\n\n.tabs-right > .nav-tabs > li > a:hover,\n.tabs-right > .nav-tabs > li > a:focus {\n  border-color: #eeeeee #eeeeee #eeeeee #dddddd;\n}\n\n.tabs-right > .nav-tabs .active > a,\n.tabs-right > .nav-tabs .active > a:hover,\n.tabs-right > .nav-tabs .active > a:focus {\n  border-color: #ddd #ddd #ddd transparent;\n  *border-left-color: #ffffff;\n}\n\n.nav > .disabled > a {\n  color: #999999;\n}\n\n.nav > .disabled > a:hover,\n.nav > .disabled > a:focus {\n  text-decoration: none;\n  cursor: default;\n  background-color: transparent;\n}\n\n.navbar {\n  *position: relative;\n  *z-index: 2;\n  margin-bottom: 20px;\n  overflow: visible;\n}\n\n.navbar-inner {\n  min-height: 40px;\n  padding-right: 20px;\n  padding-left: 20px;\n  background-color: #fafafa;\n  background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));\n  background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);\n  background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);\n  background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);\n  background-repeat: repeat-x;\n  border: 1px solid #d4d4d4;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);\n  *zoom: 1;\n  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n     -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n          box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);\n}\n\n.navbar-inner:before,\n.navbar-inner:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.navbar-inner:after {\n  clear: both;\n}\n\n.navbar .container {\n  width: auto;\n}\n\n.nav-collapse.collapse {\n  height: auto;\n  overflow: visible;\n}\n\n.navbar .brand {\n  display: block;\n  float: left;\n  padding: 10px 20px 10px;\n  margin-left: -20px;\n  font-size: 20px;\n  font-weight: 200;\n  color: #777777;\n  text-shadow: 0 1px 0 #ffffff;\n}\n\n.navbar .brand:hover,\n.navbar .brand:focus {\n  text-decoration: none;\n}\n\n.navbar-text {\n  margin-bottom: 0;\n  line-height: 40px;\n  color: #777777;\n}\n\n.navbar-link {\n  color: #777777;\n}\n\n.navbar-link:hover,\n.navbar-link:focus {\n  color: #333333;\n}\n\n.navbar .divider-vertical {\n  height: 40px;\n  margin: 0 9px;\n  border-right: 1px solid #ffffff;\n  border-left: 1px solid #f2f2f2;\n}\n\n.navbar .btn,\n.navbar .btn-group {\n  margin-top: 5px;\n}\n\n.navbar .btn-group .btn,\n.navbar .input-prepend .btn,\n.navbar .input-append .btn,\n.navbar .input-prepend .btn-group,\n.navbar .input-append .btn-group {\n  margin-top: 0;\n}\n\n.navbar-form {\n  margin-bottom: 0;\n  *zoom: 1;\n}\n\n.navbar-form:before,\n.navbar-form:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.navbar-form:after {\n  clear: both;\n}\n\n.navbar-form input,\n.navbar-form select,\n.navbar-form .radio,\n.navbar-form .checkbox {\n  margin-top: 5px;\n}\n\n.navbar-form input,\n.navbar-form select,\n.navbar-form .btn {\n  display: inline-block;\n  margin-bottom: 0;\n}\n\n.navbar-form input[type=\"image\"],\n.navbar-form input[type=\"checkbox\"],\n.navbar-form input[type=\"radio\"] {\n  margin-top: 3px;\n}\n\n.navbar-form .input-append,\n.navbar-form .input-prepend {\n  margin-top: 5px;\n  white-space: nowrap;\n}\n\n.navbar-form .input-append input,\n.navbar-form .input-prepend input {\n  margin-top: 0;\n}\n\n.navbar-search {\n  position: relative;\n  float: left;\n  margin-top: 5px;\n  margin-bottom: 0;\n}\n\n.navbar-search .search-query {\n  padding: 4px 14px;\n  margin-bottom: 0;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 13px;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-border-radius: 15px;\n     -moz-border-radius: 15px;\n          border-radius: 15px;\n}\n\n.navbar-static-top {\n  position: static;\n  margin-bottom: 0;\n}\n\n.navbar-static-top .navbar-inner {\n  -webkit-border-radius: 0;\n     -moz-border-radius: 0;\n          border-radius: 0;\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n  margin-bottom: 0;\n}\n\n.navbar-fixed-top .navbar-inner,\n.navbar-static-top .navbar-inner {\n  border-width: 0 0 1px;\n}\n\n.navbar-fixed-bottom .navbar-inner {\n  border-width: 1px 0 0;\n}\n\n.navbar-fixed-top .navbar-inner,\n.navbar-fixed-bottom .navbar-inner {\n  padding-right: 0;\n  padding-left: 0;\n  -webkit-border-radius: 0;\n     -moz-border-radius: 0;\n          border-radius: 0;\n}\n\n.navbar-static-top .container,\n.navbar-fixed-top .container,\n.navbar-fixed-bottom .container {\n  width: 940px;\n}\n\n.navbar-fixed-top {\n  top: 0;\n}\n\n.navbar-fixed-top .navbar-inner,\n.navbar-static-top .navbar-inner {\n  -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);\n     -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);\n          box-shadow: 0 1px 10px rgba(0, 0, 0, 0.1);\n}\n\n.navbar-fixed-bottom {\n  bottom: 0;\n}\n\n.navbar-fixed-bottom .navbar-inner {\n  -webkit-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);\n     -moz-box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);\n          box-shadow: 0 -1px 10px rgba(0, 0, 0, 0.1);\n}\n\n.navbar .nav {\n  position: relative;\n  left: 0;\n  display: block;\n  float: left;\n  margin: 0 10px 0 0;\n}\n\n.navbar .nav.pull-right {\n  float: right;\n  margin-right: 0;\n}\n\n.navbar .nav > li {\n  float: left;\n}\n\n.navbar .nav > li > a {\n  float: none;\n  padding: 10px 15px 10px;\n  color: #777777;\n  text-decoration: none;\n  text-shadow: 0 1px 0 #ffffff;\n}\n\n.navbar .nav .dropdown-toggle .caret {\n  margin-top: 8px;\n}\n\n.navbar .nav > li > a:focus,\n.navbar .nav > li > a:hover {\n  color: #333333;\n  text-decoration: none;\n  background-color: transparent;\n}\n\n.navbar .nav > .active > a,\n.navbar .nav > .active > a:hover,\n.navbar .nav > .active > a:focus {\n  color: #555555;\n  text-decoration: none;\n  background-color: #e5e5e5;\n  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);\n     -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);\n}\n\n.navbar .btn-navbar {\n  display: none;\n  float: right;\n  padding: 7px 10px;\n  margin-right: 5px;\n  margin-left: 5px;\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #ededed;\n  *background-color: #e5e5e5;\n  background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));\n  background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);\n  background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);\n  background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);\n  background-repeat: repeat-x;\n  border-color: #e5e5e5 #e5e5e5 #bfbfbf;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);\n     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);\n}\n\n.navbar .btn-navbar:hover,\n.navbar .btn-navbar:focus,\n.navbar .btn-navbar:active,\n.navbar .btn-navbar.active,\n.navbar .btn-navbar.disabled,\n.navbar .btn-navbar[disabled] {\n  color: #ffffff;\n  background-color: #e5e5e5;\n  *background-color: #d9d9d9;\n}\n\n.navbar .btn-navbar:active,\n.navbar .btn-navbar.active {\n  background-color: #cccccc \\9;\n}\n\n.navbar .btn-navbar .icon-bar {\n  display: block;\n  width: 18px;\n  height: 2px;\n  background-color: #f5f5f5;\n  -webkit-border-radius: 1px;\n     -moz-border-radius: 1px;\n          border-radius: 1px;\n  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);\n     -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);\n          box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);\n}\n\n.btn-navbar .icon-bar + .icon-bar {\n  margin-top: 3px;\n}\n\n.navbar .nav > li > .dropdown-menu:before {\n  position: absolute;\n  top: -7px;\n  left: 9px;\n  display: inline-block;\n  border-right: 7px solid transparent;\n  border-bottom: 7px solid #ccc;\n  border-left: 7px solid transparent;\n  border-bottom-color: rgba(0, 0, 0, 0.2);\n  content: '';\n}\n\n.navbar .nav > li > .dropdown-menu:after {\n  position: absolute;\n  top: -6px;\n  left: 10px;\n  display: inline-block;\n  border-right: 6px solid transparent;\n  border-bottom: 6px solid #ffffff;\n  border-left: 6px solid transparent;\n  content: '';\n}\n\n.navbar-fixed-bottom .nav > li > .dropdown-menu:before {\n  top: auto;\n  bottom: -7px;\n  border-top: 7px solid #ccc;\n  border-bottom: 0;\n  border-top-color: rgba(0, 0, 0, 0.2);\n}\n\n.navbar-fixed-bottom .nav > li > .dropdown-menu:after {\n  top: auto;\n  bottom: -6px;\n  border-top: 6px solid #ffffff;\n  border-bottom: 0;\n}\n\n.navbar .nav li.dropdown > a:hover .caret,\n.navbar .nav li.dropdown > a:focus .caret {\n  border-top-color: #333333;\n  border-bottom-color: #333333;\n}\n\n.navbar .nav li.dropdown.open > .dropdown-toggle,\n.navbar .nav li.dropdown.active > .dropdown-toggle,\n.navbar .nav li.dropdown.open.active > .dropdown-toggle {\n  color: #555555;\n  background-color: #e5e5e5;\n}\n\n.navbar .nav li.dropdown > .dropdown-toggle .caret {\n  border-top-color: #777777;\n  border-bottom-color: #777777;\n}\n\n.navbar .nav li.dropdown.open > .dropdown-toggle .caret,\n.navbar .nav li.dropdown.active > .dropdown-toggle .caret,\n.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {\n  border-top-color: #555555;\n  border-bottom-color: #555555;\n}\n\n.navbar .pull-right > li > .dropdown-menu,\n.navbar .nav > li > .dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.navbar .pull-right > li > .dropdown-menu:before,\n.navbar .nav > li > .dropdown-menu.pull-right:before {\n  right: 12px;\n  left: auto;\n}\n\n.navbar .pull-right > li > .dropdown-menu:after,\n.navbar .nav > li > .dropdown-menu.pull-right:after {\n  right: 13px;\n  left: auto;\n}\n\n.navbar .pull-right > li > .dropdown-menu .dropdown-menu,\n.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {\n  right: 100%;\n  left: auto;\n  margin-right: -1px;\n  margin-left: 0;\n  -webkit-border-radius: 6px 0 6px 6px;\n     -moz-border-radius: 6px 0 6px 6px;\n          border-radius: 6px 0 6px 6px;\n}\n\n.navbar-inverse .navbar-inner {\n  background-color: #1b1b1b;\n  background-image: -moz-linear-gradient(top, #222222, #111111);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));\n  background-image: -webkit-linear-gradient(top, #222222, #111111);\n  background-image: -o-linear-gradient(top, #222222, #111111);\n  background-image: linear-gradient(to bottom, #222222, #111111);\n  background-repeat: repeat-x;\n  border-color: #252525;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);\n}\n\n.navbar-inverse .brand,\n.navbar-inverse .nav > li > a {\n  color: #999999;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n\n.navbar-inverse .brand:hover,\n.navbar-inverse .nav > li > a:hover,\n.navbar-inverse .brand:focus,\n.navbar-inverse .nav > li > a:focus {\n  color: #ffffff;\n}\n\n.navbar-inverse .brand {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-text {\n  color: #999999;\n}\n\n.navbar-inverse .nav > li > a:focus,\n.navbar-inverse .nav > li > a:hover {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .nav .active > a,\n.navbar-inverse .nav .active > a:hover,\n.navbar-inverse .nav .active > a:focus {\n  color: #ffffff;\n  background-color: #111111;\n}\n\n.navbar-inverse .navbar-link {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-link:hover,\n.navbar-inverse .navbar-link:focus {\n  color: #ffffff;\n}\n\n.navbar-inverse .divider-vertical {\n  border-right-color: #222222;\n  border-left-color: #111111;\n}\n\n.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,\n.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,\n.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {\n  color: #ffffff;\n  background-color: #111111;\n}\n\n.navbar-inverse .nav li.dropdown > a:hover .caret,\n.navbar-inverse .nav li.dropdown > a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {\n  border-top-color: #999999;\n  border-bottom-color: #999999;\n}\n\n.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,\n.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,\n.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.navbar-inverse .navbar-search .search-query {\n  color: #ffffff;\n  background-color: #515151;\n  border-color: #111111;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);\n     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);\n  -webkit-transition: none;\n     -moz-transition: none;\n       -o-transition: none;\n          transition: none;\n}\n\n.navbar-inverse .navbar-search .search-query:-moz-placeholder {\n  color: #cccccc;\n}\n\n.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {\n  color: #cccccc;\n}\n\n.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {\n  color: #cccccc;\n}\n\n.navbar-inverse .navbar-search .search-query:focus,\n.navbar-inverse .navbar-search .search-query.focused {\n  padding: 5px 15px;\n  color: #333333;\n  text-shadow: 0 1px 0 #ffffff;\n  background-color: #ffffff;\n  border: 0;\n  outline: 0;\n  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);\n     -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);\n          box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);\n}\n\n.navbar-inverse .btn-navbar {\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #0e0e0e;\n  *background-color: #040404;\n  background-image: -moz-linear-gradient(top, #151515, #040404);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));\n  background-image: -webkit-linear-gradient(top, #151515, #040404);\n  background-image: -o-linear-gradient(top, #151515, #040404);\n  background-image: linear-gradient(to bottom, #151515, #040404);\n  background-repeat: repeat-x;\n  border-color: #040404 #040404 #000000;\n  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.navbar-inverse .btn-navbar:hover,\n.navbar-inverse .btn-navbar:focus,\n.navbar-inverse .btn-navbar:active,\n.navbar-inverse .btn-navbar.active,\n.navbar-inverse .btn-navbar.disabled,\n.navbar-inverse .btn-navbar[disabled] {\n  color: #ffffff;\n  background-color: #040404;\n  *background-color: #000000;\n}\n\n.navbar-inverse .btn-navbar:active,\n.navbar-inverse .btn-navbar.active {\n  background-color: #000000 \\9;\n}\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin: 0 0 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n\n.breadcrumb > li {\n  display: inline-block;\n  *display: inline;\n  text-shadow: 0 1px 0 #ffffff;\n  *zoom: 1;\n}\n\n.breadcrumb > li > .divider {\n  padding: 0 5px;\n  color: #ccc;\n}\n\n.breadcrumb > .active {\n  color: #999999;\n}\n\n.pagination {\n  margin: 20px 0;\n}\n\n.pagination ul {\n  display: inline-block;\n  *display: inline;\n  margin-bottom: 0;\n  margin-left: 0;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n  *zoom: 1;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n     -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.pagination ul > li {\n  display: inline;\n}\n\n.pagination ul > li > a,\n.pagination ul > li > span {\n  float: left;\n  padding: 4px 12px;\n  line-height: 20px;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-left-width: 0;\n}\n\n.pagination ul > li > a:hover,\n.pagination ul > li > a:focus,\n.pagination ul > .active > a,\n.pagination ul > .active > span {\n  background-color: #f5f5f5;\n}\n\n.pagination ul > .active > a,\n.pagination ul > .active > span {\n  color: #999999;\n  cursor: default;\n}\n\n.pagination ul > .disabled > span,\n.pagination ul > .disabled > a,\n.pagination ul > .disabled > a:hover,\n.pagination ul > .disabled > a:focus {\n  color: #999999;\n  cursor: default;\n  background-color: transparent;\n}\n\n.pagination ul > li:first-child > a,\n.pagination ul > li:first-child > span {\n  border-left-width: 1px;\n  -webkit-border-bottom-left-radius: 4px;\n          border-bottom-left-radius: 4px;\n  -webkit-border-top-left-radius: 4px;\n          border-top-left-radius: 4px;\n  -moz-border-radius-bottomleft: 4px;\n  -moz-border-radius-topleft: 4px;\n}\n\n.pagination ul > li:last-child > a,\n.pagination ul > li:last-child > span {\n  -webkit-border-top-right-radius: 4px;\n          border-top-right-radius: 4px;\n  -webkit-border-bottom-right-radius: 4px;\n          border-bottom-right-radius: 4px;\n  -moz-border-radius-topright: 4px;\n  -moz-border-radius-bottomright: 4px;\n}\n\n.pagination-centered {\n  text-align: center;\n}\n\n.pagination-right {\n  text-align: right;\n}\n\n.pagination-large ul > li > a,\n.pagination-large ul > li > span {\n  padding: 11px 19px;\n  font-size: 17.5px;\n}\n\n.pagination-large ul > li:first-child > a,\n.pagination-large ul > li:first-child > span {\n  -webkit-border-bottom-left-radius: 6px;\n          border-bottom-left-radius: 6px;\n  -webkit-border-top-left-radius: 6px;\n          border-top-left-radius: 6px;\n  -moz-border-radius-bottomleft: 6px;\n  -moz-border-radius-topleft: 6px;\n}\n\n.pagination-large ul > li:last-child > a,\n.pagination-large ul > li:last-child > span {\n  -webkit-border-top-right-radius: 6px;\n          border-top-right-radius: 6px;\n  -webkit-border-bottom-right-radius: 6px;\n          border-bottom-right-radius: 6px;\n  -moz-border-radius-topright: 6px;\n  -moz-border-radius-bottomright: 6px;\n}\n\n.pagination-mini ul > li:first-child > a,\n.pagination-small ul > li:first-child > a,\n.pagination-mini ul > li:first-child > span,\n.pagination-small ul > li:first-child > span {\n  -webkit-border-bottom-left-radius: 3px;\n          border-bottom-left-radius: 3px;\n  -webkit-border-top-left-radius: 3px;\n          border-top-left-radius: 3px;\n  -moz-border-radius-bottomleft: 3px;\n  -moz-border-radius-topleft: 3px;\n}\n\n.pagination-mini ul > li:last-child > a,\n.pagination-small ul > li:last-child > a,\n.pagination-mini ul > li:last-child > span,\n.pagination-small ul > li:last-child > span {\n  -webkit-border-top-right-radius: 3px;\n          border-top-right-radius: 3px;\n  -webkit-border-bottom-right-radius: 3px;\n          border-bottom-right-radius: 3px;\n  -moz-border-radius-topright: 3px;\n  -moz-border-radius-bottomright: 3px;\n}\n\n.pagination-small ul > li > a,\n.pagination-small ul > li > span {\n  padding: 2px 10px;\n  font-size: 11.9px;\n}\n\n.pagination-mini ul > li > a,\n.pagination-mini ul > li > span {\n  padding: 0 6px;\n  font-size: 10.5px;\n}\n\n.pager {\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n  *zoom: 1;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager li {\n  display: inline;\n}\n\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #fff;\n  border: 1px solid #ddd;\n  -webkit-border-radius: 15px;\n     -moz-border-radius: 15px;\n          border-radius: 15px;\n}\n\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #999999;\n  cursor: default;\n  background-color: #fff;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  background-color: #000000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n}\n\n.modal-backdrop,\n.modal-backdrop.fade.in {\n  opacity: 0.8;\n  filter: alpha(opacity=80);\n}\n\n.modal {\n  position: fixed;\n  top: 10%;\n  left: 50%;\n  z-index: 1050;\n  width: 560px;\n  margin-left: -280px;\n  background-color: #ffffff;\n  border: 1px solid #999;\n  border: 1px solid rgba(0, 0, 0, 0.3);\n  *border: 1px solid #999;\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n  outline: none;\n  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);\n     -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);\n          box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);\n  -webkit-background-clip: padding-box;\n     -moz-background-clip: padding-box;\n          background-clip: padding-box;\n}\n\n.modal.fade {\n  top: -25%;\n  -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;\n     -moz-transition: opacity 0.3s linear, top 0.3s ease-out;\n       -o-transition: opacity 0.3s linear, top 0.3s ease-out;\n          transition: opacity 0.3s linear, top 0.3s ease-out;\n}\n\n.modal.fade.in {\n  top: 10%;\n}\n\n.modal-header {\n  padding: 9px 15px;\n  border-bottom: 1px solid #eee;\n}\n\n.modal-header .close {\n  margin-top: 2px;\n}\n\n.modal-header h3 {\n  margin: 0;\n  line-height: 30px;\n}\n\n.modal-body {\n  position: relative;\n  max-height: 400px;\n  padding: 15px;\n  overflow-y: auto;\n}\n\n.modal-form {\n  margin-bottom: 0;\n}\n\n.modal-footer {\n  padding: 14px 15px 15px;\n  margin-bottom: 0;\n  text-align: right;\n  background-color: #f5f5f5;\n  border-top: 1px solid #ddd;\n  -webkit-border-radius: 0 0 6px 6px;\n     -moz-border-radius: 0 0 6px 6px;\n          border-radius: 0 0 6px 6px;\n  *zoom: 1;\n  -webkit-box-shadow: inset 0 1px 0 #ffffff;\n     -moz-box-shadow: inset 0 1px 0 #ffffff;\n          box-shadow: inset 0 1px 0 #ffffff;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  font-size: 11px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  visibility: visible;\n}\n\n.tooltip.in {\n  opacity: 0.8;\n  filter: alpha(opacity=80);\n}\n\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-right-color: #000000;\n  border-width: 5px 5px 5px 0;\n}\n\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-left-color: #000000;\n  border-width: 5px 0 5px 5px;\n}\n\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  white-space: normal;\n  background-color: #ffffff;\n  border: 1px solid #ccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  -webkit-background-clip: padding-box;\n     -moz-background-clip: padding;\n          background-clip: padding-box;\n}\n\n.popover.top {\n  margin-top: -10px;\n}\n\n.popover.right {\n  margin-left: 10px;\n}\n\n.popover.bottom {\n  margin-top: 10px;\n}\n\n.popover.left {\n  margin-left: -10px;\n}\n\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  -webkit-border-radius: 5px 5px 0 0;\n     -moz-border-radius: 5px 5px 0 0;\n          border-radius: 5px 5px 0 0;\n}\n\n.popover-title:empty {\n  display: none;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n.popover .arrow,\n.popover .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.popover .arrow {\n  border-width: 11px;\n}\n\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n\n.popover.top .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  border-bottom-width: 0;\n}\n\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-top-color: #ffffff;\n  border-bottom-width: 0;\n}\n\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n  border-left-width: 0;\n}\n\n.popover.right .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  border-right-color: #ffffff;\n  border-left-width: 0;\n}\n\n.popover.bottom .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-color: #999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  border-top-width: 0;\n}\n\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-bottom-color: #ffffff;\n  border-top-width: 0;\n}\n\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-left-color: #999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n  border-right-width: 0;\n}\n\n.popover.left .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  border-left-color: #ffffff;\n  border-right-width: 0;\n}\n\n.thumbnails {\n  margin-left: -20px;\n  list-style: none;\n  *zoom: 1;\n}\n\n.thumbnails:before,\n.thumbnails:after {\n  display: table;\n  line-height: 0;\n  content: \"\";\n}\n\n.thumbnails:after {\n  clear: both;\n}\n\n.row-fluid .thumbnails {\n  margin-left: 0;\n}\n\n.thumbnails > li {\n  float: left;\n  margin-bottom: 20px;\n  margin-left: 20px;\n}\n\n.thumbnail {\n  display: block;\n  padding: 4px;\n  line-height: 20px;\n  border: 1px solid #ddd;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);\n     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);\n          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);\n  -webkit-transition: all 0.2s ease-in-out;\n     -moz-transition: all 0.2s ease-in-out;\n       -o-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\na.thumbnail:hover,\na.thumbnail:focus {\n  border-color: #0088cc;\n  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n     -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n          box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);\n}\n\n.thumbnail > img {\n  display: block;\n  max-width: 100%;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.thumbnail .caption {\n  padding: 9px;\n  color: #555555;\n}\n\n.media,\n.media-body {\n  overflow: hidden;\n  *overflow: visible;\n  zoom: 1;\n}\n\n.media,\n.media .media {\n  margin-top: 15px;\n}\n\n.media:first-child {\n  margin-top: 0;\n}\n\n.media-object {\n  display: block;\n}\n\n.media-heading {\n  margin: 0 0 5px;\n}\n\n.media > .pull-left {\n  margin-right: 10px;\n}\n\n.media > .pull-right {\n  margin-left: 10px;\n}\n\n.media-list {\n  margin-left: 0;\n  list-style: none;\n}\n\n.label,\n.badge {\n  display: inline-block;\n  padding: 2px 4px;\n  font-size: 11.844px;\n  font-weight: bold;\n  line-height: 14px;\n  color: #ffffff;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #999999;\n}\n\n.label {\n  -webkit-border-radius: 3px;\n     -moz-border-radius: 3px;\n          border-radius: 3px;\n}\n\n.badge {\n  padding-right: 9px;\n  padding-left: 9px;\n  -webkit-border-radius: 9px;\n     -moz-border-radius: 9px;\n          border-radius: 9px;\n}\n\n.label:empty,\n.badge:empty {\n  display: none;\n}\n\na.label:hover,\na.label:focus,\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.label-important,\n.badge-important {\n  background-color: #b94a48;\n}\n\n.label-important[href],\n.badge-important[href] {\n  background-color: #953b39;\n}\n\n.label-warning,\n.badge-warning {\n  background-color: #f89406;\n}\n\n.label-warning[href],\n.badge-warning[href] {\n  background-color: #c67605;\n}\n\n.label-success,\n.badge-success {\n  background-color: #468847;\n}\n\n.label-success[href],\n.badge-success[href] {\n  background-color: #356635;\n}\n\n.label-info,\n.badge-info {\n  background-color: #3a87ad;\n}\n\n.label-info[href],\n.badge-info[href] {\n  background-color: #2d6987;\n}\n\n.label-inverse,\n.badge-inverse {\n  background-color: #333333;\n}\n\n.label-inverse[href],\n.badge-inverse[href] {\n  background-color: #1a1a1a;\n}\n\n.btn .label,\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\n.btn-mini .label,\n.btn-mini .badge {\n  top: 0;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-moz-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-ms-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 0 0;\n  }\n  to {\n    background-position: 40px 0;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f7f7f7;\n  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));\n  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);\n  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);\n  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);\n  background-repeat: repeat-x;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n.progress .bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n  background-color: #0e90d2;\n  background-image: -moz-linear-gradient(top, #149bdf, #0480be);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));\n  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);\n  background-image: -o-linear-gradient(top, #149bdf, #0480be);\n  background-image: linear-gradient(to bottom, #149bdf, #0480be);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n  -webkit-transition: width 0.6s ease;\n     -moz-transition: width 0.6s ease;\n       -o-transition: width 0.6s ease;\n          transition: width 0.6s ease;\n}\n\n.progress .bar + .bar {\n  -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n     -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n          box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n}\n\n.progress-striped .bar {\n  background-color: #149bdf;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  -webkit-background-size: 40px 40px;\n     -moz-background-size: 40px 40px;\n       -o-background-size: 40px 40px;\n          background-size: 40px 40px;\n}\n\n.progress.active .bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n     -moz-animation: progress-bar-stripes 2s linear infinite;\n      -ms-animation: progress-bar-stripes 2s linear infinite;\n       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n\n.progress-danger .bar,\n.progress .bar-danger {\n  background-color: #dd514c;\n  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));\n  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);\n  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);\n  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);\n}\n\n.progress-danger.progress-striped .bar,\n.progress-striped .bar-danger {\n  background-color: #ee5f5b;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-success .bar,\n.progress .bar-success {\n  background-color: #5eb95e;\n  background-image: -moz-linear-gradient(top, #62c462, #57a957);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));\n  background-image: -webkit-linear-gradient(top, #62c462, #57a957);\n  background-image: -o-linear-gradient(top, #62c462, #57a957);\n  background-image: linear-gradient(to bottom, #62c462, #57a957);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);\n}\n\n.progress-success.progress-striped .bar,\n.progress-striped .bar-success {\n  background-color: #62c462;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-info .bar,\n.progress .bar-info {\n  background-color: #4bb1cf;\n  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));\n  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);\n  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);\n  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);\n}\n\n.progress-info.progress-striped .bar,\n.progress-striped .bar-info {\n  background-color: #5bc0de;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-warning .bar,\n.progress .bar-warning {\n  background-color: #faa732;\n  background-image: -moz-linear-gradient(top, #fbb450, #f89406);\n  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));\n  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);\n  background-image: -o-linear-gradient(top, #fbb450, #f89406);\n  background-image: linear-gradient(to bottom, #fbb450, #f89406);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);\n}\n\n.progress-warning.progress-striped .bar,\n.progress-striped .bar-warning {\n  background-color: #fbb450;\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.accordion {\n  margin-bottom: 20px;\n}\n\n.accordion-group {\n  margin-bottom: 2px;\n  border: 1px solid #e5e5e5;\n  -webkit-border-radius: 4px;\n     -moz-border-radius: 4px;\n          border-radius: 4px;\n}\n\n.accordion-heading {\n  border-bottom: 0;\n}\n\n.accordion-heading .accordion-toggle {\n  display: block;\n  padding: 8px 15px;\n}\n\n.accordion-toggle {\n  cursor: pointer;\n}\n\n.accordion-inner {\n  padding: 9px 15px;\n  border-top: 1px solid #e5e5e5;\n}\n\n.carousel {\n  position: relative;\n  margin-bottom: 20px;\n  line-height: 1;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: 0.6s ease-in-out left;\n     -moz-transition: 0.6s ease-in-out left;\n       -o-transition: 0.6s ease-in-out left;\n          transition: 0.6s ease-in-out left;\n}\n\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  line-height: 1;\n}\n\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n\n.carousel-inner > .active {\n  left: 0;\n}\n\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.carousel-inner > .next {\n  left: 100%;\n}\n\n.carousel-inner > .prev {\n  left: -100%;\n}\n\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n\n.carousel-inner > .active.left {\n  left: -100%;\n}\n\n.carousel-inner > .active.right {\n  left: 100%;\n}\n\n.carousel-control {\n  position: absolute;\n  top: 40%;\n  left: 15px;\n  width: 40px;\n  height: 40px;\n  margin-top: -20px;\n  font-size: 60px;\n  font-weight: 100;\n  line-height: 30px;\n  color: #ffffff;\n  text-align: center;\n  background: #222222;\n  border: 3px solid #ffffff;\n  -webkit-border-radius: 23px;\n     -moz-border-radius: 23px;\n          border-radius: 23px;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.carousel-control.right {\n  right: 15px;\n  left: auto;\n}\n\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.carousel-indicators {\n  position: absolute;\n  top: 15px;\n  right: 15px;\n  z-index: 5;\n  margin: 0;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  display: block;\n  float: left;\n  width: 10px;\n  height: 10px;\n  margin-left: 5px;\n  text-indent: -999px;\n  background-color: #ccc;\n  background-color: rgba(255, 255, 255, 0.25);\n  border-radius: 5px;\n}\n\n.carousel-indicators .active {\n  background-color: #fff;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  padding: 15px;\n  background: #333333;\n  background: rgba(0, 0, 0, 0.75);\n}\n\n.carousel-caption h4,\n.carousel-caption p {\n  line-height: 20px;\n  color: #ffffff;\n}\n\n.carousel-caption h4 {\n  margin: 0 0 5px;\n}\n\n.carousel-caption p {\n  margin-bottom: 0;\n}\n\n.hero-unit {\n  padding: 60px;\n  margin-bottom: 30px;\n  font-size: 18px;\n  font-weight: 200;\n  line-height: 30px;\n  color: inherit;\n  background-color: #eeeeee;\n  -webkit-border-radius: 6px;\n     -moz-border-radius: 6px;\n          border-radius: 6px;\n}\n\n.hero-unit h1 {\n  margin-bottom: 0;\n  font-size: 60px;\n  line-height: 1;\n  letter-spacing: -1px;\n  color: inherit;\n}\n\n.hero-unit li {\n  line-height: 30px;\n}\n\n.pull-right {\n  float: right;\n}\n\n.pull-left {\n  float: left;\n}\n\n.hide {\n  display: none;\n}\n\n.show {\n  display: block;\n}\n\n.invisible {\n  visibility: hidden;\n}\n\n.affix {\n  position: fixed;\n}\n"
  },
  {
    "path": "examples/assets/bootstrap/js/bootstrap.js",
    "content": "/* ===================================================\n * bootstrap-transition.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#transitions\n * ===================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n  /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)\n   * ======================================================= */\n\n  $(function () {\n\n    $.support.transition = (function () {\n\n      var transitionEnd = (function () {\n\n        var el = document.createElement('bootstrap')\n          , transEndEventNames = {\n               'WebkitTransition' : 'webkitTransitionEnd'\n            ,  'MozTransition'    : 'transitionend'\n            ,  'OTransition'      : 'oTransitionEnd otransitionend'\n            ,  'transition'       : 'transitionend'\n            }\n          , name\n\n        for (name in transEndEventNames){\n          if (el.style[name] !== undefined) {\n            return transEndEventNames[name]\n          }\n        }\n\n      }())\n\n      return transitionEnd && {\n        end: transitionEnd\n      }\n\n    })()\n\n  })\n\n}(window.jQuery);/* ==========================================================\n * bootstrap-alert.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#alerts\n * ==========================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n /* ALERT CLASS DEFINITION\n  * ====================== */\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n    , Alert = function (el) {\n        $(el).on('click', dismiss, this.close)\n      }\n\n  Alert.prototype.close = function (e) {\n    var $this = $(this)\n      , selector = $this.attr('data-target')\n      , $parent\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    $parent = $(selector)\n\n    e && e.preventDefault()\n\n    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())\n\n    $parent.trigger(e = $.Event('close'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      $parent\n        .trigger('closed')\n        .remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent.on($.support.transition.end, removeElement) :\n      removeElement()\n  }\n\n /* ALERT PLUGIN DEFINITION\n  * ======================= */\n\n  var old = $.fn.alert\n\n  $.fn.alert = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('alert')\n      if (!data) $this.data('alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.alert.Constructor = Alert\n\n /* ALERT NO CONFLICT\n  * ================= */\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n /* ALERT DATA-API\n  * ============== */\n\n  $(document).on('click.alert.data-api', dismiss, Alert.prototype.close)\n\n}(window.jQuery);/* ============================================================\n * bootstrap-button.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#buttons\n * ============================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n /* BUTTON PUBLIC CLASS DEFINITION\n  * ============================== */\n\n  var Button = function (element, options) {\n    this.$element = $(element)\n    this.options = $.extend({}, $.fn.button.defaults, options)\n  }\n\n  Button.prototype.setState = function (state) {\n    var d = 'disabled'\n      , $el = this.$element\n      , data = $el.data()\n      , val = $el.is('input') ? 'val' : 'html'\n\n    state = state + 'Text'\n    data.resetText || $el.data('resetText', $el[val]())\n\n    $el[val](data[state] || this.options[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout(function () {\n      state == 'loadingText' ?\n        $el.addClass(d).attr(d, d) :\n        $el.removeClass(d).removeAttr(d)\n    }, 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var $parent = this.$element.closest('[data-toggle=\"buttons-radio\"]')\n\n    $parent && $parent\n      .find('.active')\n      .removeClass('active')\n\n    this.$element.toggleClass('active')\n  }\n\n /* BUTTON PLUGIN DEFINITION\n  * ======================== */\n\n  var old = $.fn.button\n\n  $.fn.button = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('button')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('button', (data = new Button(this, options)))\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  $.fn.button.defaults = {\n    loadingText: 'loading...'\n  }\n\n  $.fn.button.Constructor = Button\n\n /* BUTTON NO CONFLICT\n  * ================== */\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n /* BUTTON DATA-API\n  * =============== */\n\n  $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) {\n    var $btn = $(e.target)\n    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n    $btn.button('toggle')\n  })\n\n}(window.jQuery);/* ==========================================================\n * bootstrap-carousel.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#carousel\n * ==========================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n /* CAROUSEL CLASS DEFINITION\n  * ========================= */\n\n  var Carousel = function (element, options) {\n    this.$element = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options = options\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter', $.proxy(this.pause, this))\n      .on('mouseleave', $.proxy(this.cycle, this))\n  }\n\n  Carousel.prototype = {\n\n    cycle: function (e) {\n      if (!e) this.paused = false\n      if (this.interval) clearInterval(this.interval);\n      this.options.interval\n        && !this.paused\n        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n      return this\n    }\n\n  , getActiveIndex: function () {\n      this.$active = this.$element.find('.item.active')\n      this.$items = this.$active.parent().children()\n      return this.$items.index(this.$active)\n    }\n\n  , to: function (pos) {\n      var activeIndex = this.getActiveIndex()\n        , that = this\n\n      if (pos > (this.$items.length - 1) || pos < 0) return\n\n      if (this.sliding) {\n        return this.$element.one('slid', function () {\n          that.to(pos)\n        })\n      }\n\n      if (activeIndex == pos) {\n        return this.pause().cycle()\n      }\n\n      return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))\n    }\n\n  , pause: function (e) {\n      if (!e) this.paused = true\n      if (this.$element.find('.next, .prev').length && $.support.transition.end) {\n        this.$element.trigger($.support.transition.end)\n        this.cycle(true)\n      }\n      clearInterval(this.interval)\n      this.interval = null\n      return this\n    }\n\n  , next: function () {\n      if (this.sliding) return\n      return this.slide('next')\n    }\n\n  , prev: function () {\n      if (this.sliding) return\n      return this.slide('prev')\n    }\n\n  , slide: function (type, next) {\n      var $active = this.$element.find('.item.active')\n        , $next = next || $active[type]()\n        , isCycling = this.interval\n        , direction = type == 'next' ? 'left' : 'right'\n        , fallback  = type == 'next' ? 'first' : 'last'\n        , that = this\n        , e\n\n      this.sliding = true\n\n      isCycling && this.pause()\n\n      $next = $next.length ? $next : this.$element.find('.item')[fallback]()\n\n      e = $.Event('slide', {\n        relatedTarget: $next[0]\n      , direction: direction\n      })\n\n      if ($next.hasClass('active')) return\n\n      if (this.$indicators.length) {\n        this.$indicators.find('.active').removeClass('active')\n        this.$element.one('slid', function () {\n          var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])\n          $nextIndicator && $nextIndicator.addClass('active')\n        })\n      }\n\n      if ($.support.transition && this.$element.hasClass('slide')) {\n        this.$element.trigger(e)\n        if (e.isDefaultPrevented()) return\n        $next.addClass(type)\n        $next[0].offsetWidth // force reflow\n        $active.addClass(direction)\n        $next.addClass(direction)\n        this.$element.one($.support.transition.end, function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () { that.$element.trigger('slid') }, 0)\n        })\n      } else {\n        this.$element.trigger(e)\n        if (e.isDefaultPrevented()) return\n        $active.removeClass('active')\n        $next.addClass('active')\n        this.sliding = false\n        this.$element.trigger('slid')\n      }\n\n      isCycling && this.cycle()\n\n      return this\n    }\n\n  }\n\n /* CAROUSEL PLUGIN DEFINITION\n  * ========================== */\n\n  var old = $.fn.carousel\n\n  $.fn.carousel = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('carousel')\n        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)\n        , action = typeof option == 'string' ? option : options.slide\n      if (!data) $this.data('carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  $.fn.carousel.defaults = {\n    interval: 5000\n  , pause: 'hover'\n  }\n\n  $.fn.carousel.Constructor = Carousel\n\n /* CAROUSEL NO CONFLICT\n  * ==================== */\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n /* CAROUSEL DATA-API\n  * ================= */\n\n  $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {\n    var $this = $(this), href\n      , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      , options = $.extend({}, $target.data(), $this.data())\n      , slideIndex\n\n    $target.carousel(options)\n\n    if (slideIndex = $this.attr('data-slide-to')) {\n      $target.data('carousel').pause().to(slideIndex).cycle()\n    }\n\n    e.preventDefault()\n  })\n\n}(window.jQuery);/* =============================================================\n * bootstrap-collapse.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#collapse\n * =============================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n /* COLLAPSE PUBLIC CLASS DEFINITION\n  * ================================ */\n\n  var Collapse = function (element, options) {\n    this.$element = $(element)\n    this.options = $.extend({}, $.fn.collapse.defaults, options)\n\n    if (this.options.parent) {\n      this.$parent = $(this.options.parent)\n    }\n\n    this.options.toggle && this.toggle()\n  }\n\n  Collapse.prototype = {\n\n    constructor: Collapse\n\n  , dimension: function () {\n      var hasWidth = this.$element.hasClass('width')\n      return hasWidth ? 'width' : 'height'\n    }\n\n  , show: function () {\n      var dimension\n        , scroll\n        , actives\n        , hasData\n\n      if (this.transitioning || this.$element.hasClass('in')) return\n\n      dimension = this.dimension()\n      scroll = $.camelCase(['scroll', dimension].join('-'))\n      actives = this.$parent && this.$parent.find('> .accordion-group > .in')\n\n      if (actives && actives.length) {\n        hasData = actives.data('collapse')\n        if (hasData && hasData.transitioning) return\n        actives.collapse('hide')\n        hasData || actives.data('collapse', null)\n      }\n\n      this.$element[dimension](0)\n      this.transition('addClass', $.Event('show'), 'shown')\n      $.support.transition && this.$element[dimension](this.$element[0][scroll])\n    }\n\n  , hide: function () {\n      var dimension\n      if (this.transitioning || !this.$element.hasClass('in')) return\n      dimension = this.dimension()\n      this.reset(this.$element[dimension]())\n      this.transition('removeClass', $.Event('hide'), 'hidden')\n      this.$element[dimension](0)\n    }\n\n  , reset: function (size) {\n      var dimension = this.dimension()\n\n      this.$element\n        .removeClass('collapse')\n        [dimension](size || 'auto')\n        [0].offsetWidth\n\n      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')\n\n      return this\n    }\n\n  , transition: function (method, startEvent, completeEvent) {\n      var that = this\n        , complete = function () {\n            if (startEvent.type == 'show') that.reset()\n            that.transitioning = 0\n            that.$element.trigger(completeEvent)\n          }\n\n      this.$element.trigger(startEvent)\n\n      if (startEvent.isDefaultPrevented()) return\n\n      this.transitioning = 1\n\n      this.$element[method]('in')\n\n      $.support.transition && this.$element.hasClass('collapse') ?\n        this.$element.one($.support.transition.end, complete) :\n        complete()\n    }\n\n  , toggle: function () {\n      this[this.$element.hasClass('in') ? 'hide' : 'show']()\n    }\n\n  }\n\n /* COLLAPSE PLUGIN DEFINITION\n  * ========================== */\n\n  var old = $.fn.collapse\n\n  $.fn.collapse = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('collapse')\n        , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option)\n      if (!data) $this.data('collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.collapse.defaults = {\n    toggle: true\n  }\n\n  $.fn.collapse.Constructor = Collapse\n\n /* COLLAPSE NO CONFLICT\n  * ==================== */\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n /* COLLAPSE DATA-API\n  * ================= */\n\n  $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {\n    var $this = $(this), href\n      , target = $this.attr('data-target')\n        || e.preventDefault()\n        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') //strip for ie7\n      , option = $(target).data('collapse') ? 'toggle' : $this.data()\n    $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n    $(target).collapse(option)\n  })\n\n}(window.jQuery);/* ============================================================\n * bootstrap-dropdown.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#dropdowns\n * ============================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n /* DROPDOWN CLASS DEFINITION\n  * ========================= */\n\n  var toggle = '[data-toggle=dropdown]'\n    , Dropdown = function (element) {\n        var $el = $(element).on('click.dropdown.data-api', this.toggle)\n        $('html').on('click.dropdown.data-api', function () {\n          $el.parent().removeClass('open')\n        })\n      }\n\n  Dropdown.prototype = {\n\n    constructor: Dropdown\n\n  , toggle: function (e) {\n      var $this = $(this)\n        , $parent\n        , isActive\n\n      if ($this.is('.disabled, :disabled')) return\n\n      $parent = getParent($this)\n\n      isActive = $parent.hasClass('open')\n\n      clearMenus()\n\n      if (!isActive) {\n        if ('ontouchstart' in document.documentElement) {\n          // if mobile we we use a backdrop because click events don't delegate\n          $('<div class=\"dropdown-backdrop\"/>').insertBefore($(this)).on('click', clearMenus)\n        }\n        $parent.toggleClass('open')\n      }\n\n      $this.focus()\n\n      return false\n    }\n\n  , keydown: function (e) {\n      var $this\n        , $items\n        , $active\n        , $parent\n        , isActive\n        , index\n\n      if (!/(38|40|27)/.test(e.keyCode)) return\n\n      $this = $(this)\n\n      e.preventDefault()\n      e.stopPropagation()\n\n      if ($this.is('.disabled, :disabled')) return\n\n      $parent = getParent($this)\n\n      isActive = $parent.hasClass('open')\n\n      if (!isActive || (isActive && e.keyCode == 27)) {\n        if (e.which == 27) $parent.find(toggle).focus()\n        return $this.click()\n      }\n\n      $items = $('[role=menu] li:not(.divider):visible a', $parent)\n\n      if (!$items.length) return\n\n      index = $items.index($items.filter(':focus'))\n\n      if (e.keyCode == 38 && index > 0) index--                                        // up\n      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n      if (!~index) index = 0\n\n      $items\n        .eq(index)\n        .focus()\n    }\n\n  }\n\n  function clearMenus() {\n    $('.dropdown-backdrop').remove()\n    $(toggle).each(function () {\n      getParent($(this)).removeClass('open')\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n      , $parent\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    $parent = selector && $(selector)\n\n    if (!$parent || !$parent.length) $parent = $this.parent()\n\n    return $parent\n  }\n\n  /* DROPDOWN PLUGIN DEFINITION\n   * ========================== */\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('dropdown')\n      if (!data) $this.data('dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n /* DROPDOWN NO CONFLICT\n  * ==================== */\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n  /* APPLY TO STANDARD DROPDOWN ELEMENTS\n   * =================================== */\n\n  $(document)\n    .on('click.dropdown.data-api', clearMenus)\n    .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)\n    .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)\n\n}(window.jQuery);\n/* =========================================================\n * bootstrap-modal.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#modals\n * =========================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================= */\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n /* MODAL CLASS DEFINITION\n  * ====================== */\n\n  var Modal = function (element, options) {\n    this.options = options\n    this.$element = $(element)\n      .delegate('[data-dismiss=\"modal\"]', 'click.dismiss.modal', $.proxy(this.hide, this))\n    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)\n  }\n\n  Modal.prototype = {\n\n      constructor: Modal\n\n    , toggle: function () {\n        return this[!this.isShown ? 'show' : 'hide']()\n      }\n\n    , show: function () {\n        var that = this\n          , e = $.Event('show')\n\n        this.$element.trigger(e)\n\n        if (this.isShown || e.isDefaultPrevented()) return\n\n        this.isShown = true\n\n        this.escape()\n\n        this.backdrop(function () {\n          var transition = $.support.transition && that.$element.hasClass('fade')\n\n          if (!that.$element.parent().length) {\n            that.$element.appendTo(document.body) //don't move modals dom position\n          }\n\n          that.$element.show()\n\n          if (transition) {\n            that.$element[0].offsetWidth // force reflow\n          }\n\n          that.$element\n            .addClass('in')\n            .attr('aria-hidden', false)\n\n          that.enforceFocus()\n\n          transition ?\n            that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :\n            that.$element.focus().trigger('shown')\n\n        })\n      }\n\n    , hide: function (e) {\n        e && e.preventDefault()\n\n        var that = this\n\n        e = $.Event('hide')\n\n        this.$element.trigger(e)\n\n        if (!this.isShown || e.isDefaultPrevented()) return\n\n        this.isShown = false\n\n        this.escape()\n\n        $(document).off('focusin.modal')\n\n        this.$element\n          .removeClass('in')\n          .attr('aria-hidden', true)\n\n        $.support.transition && this.$element.hasClass('fade') ?\n          this.hideWithTransition() :\n          this.hideModal()\n      }\n\n    , enforceFocus: function () {\n        var that = this\n        $(document).on('focusin.modal', function (e) {\n          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {\n            that.$element.focus()\n          }\n        })\n      }\n\n    , escape: function () {\n        var that = this\n        if (this.isShown && this.options.keyboard) {\n          this.$element.on('keyup.dismiss.modal', function ( e ) {\n            e.which == 27 && that.hide()\n          })\n        } else if (!this.isShown) {\n          this.$element.off('keyup.dismiss.modal')\n        }\n      }\n\n    , hideWithTransition: function () {\n        var that = this\n          , timeout = setTimeout(function () {\n              that.$element.off($.support.transition.end)\n              that.hideModal()\n            }, 500)\n\n        this.$element.one($.support.transition.end, function () {\n          clearTimeout(timeout)\n          that.hideModal()\n        })\n      }\n\n    , hideModal: function () {\n        var that = this\n        this.$element.hide()\n        this.backdrop(function () {\n          that.removeBackdrop()\n          that.$element.trigger('hidden')\n        })\n      }\n\n    , removeBackdrop: function () {\n        this.$backdrop && this.$backdrop.remove()\n        this.$backdrop = null\n      }\n\n    , backdrop: function (callback) {\n        var that = this\n          , animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n        if (this.isShown && this.options.backdrop) {\n          var doAnimate = $.support.transition && animate\n\n          this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n            .appendTo(document.body)\n\n          this.$backdrop.click(\n            this.options.backdrop == 'static' ?\n              $.proxy(this.$element[0].focus, this.$element[0])\n            : $.proxy(this.hide, this)\n          )\n\n          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n          this.$backdrop.addClass('in')\n\n          if (!callback) return\n\n          doAnimate ?\n            this.$backdrop.one($.support.transition.end, callback) :\n            callback()\n\n        } else if (!this.isShown && this.$backdrop) {\n          this.$backdrop.removeClass('in')\n\n          $.support.transition && this.$element.hasClass('fade')?\n            this.$backdrop.one($.support.transition.end, callback) :\n            callback()\n\n        } else if (callback) {\n          callback()\n        }\n      }\n  }\n\n /* MODAL PLUGIN DEFINITION\n  * ======================= */\n\n  var old = $.fn.modal\n\n  $.fn.modal = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('modal')\n        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)\n      if (!data) $this.data('modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option]()\n      else if (options.show) data.show()\n    })\n  }\n\n  $.fn.modal.defaults = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  $.fn.modal.Constructor = Modal\n\n /* MODAL NO CONFLICT\n  * ================= */\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n /* MODAL DATA-API\n  * ============== */\n\n  $(document).on('click.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this = $(this)\n      , href = $this.attr('href')\n      , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\n      , option = $target.data('modal') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data())\n\n    e.preventDefault()\n\n    $target\n      .modal(option)\n      .one('hide', function () {\n        $this.focus()\n      })\n  })\n\n}(window.jQuery);\n/* ===========================================================\n * bootstrap-tooltip.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#tooltips\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ===========================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n /* TOOLTIP PUBLIC CLASS DEFINITION\n  * =============================== */\n\n  var Tooltip = function (element, options) {\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.prototype = {\n\n    constructor: Tooltip\n\n  , init: function (type, element, options) {\n      var eventIn\n        , eventOut\n        , triggers\n        , trigger\n        , i\n\n      this.type = type\n      this.$element = $(element)\n      this.options = this.getOptions(options)\n      this.enabled = true\n\n      triggers = this.options.trigger.split(' ')\n\n      for (i = triggers.length; i--;) {\n        trigger = triggers[i]\n        if (trigger == 'click') {\n          this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n        } else if (trigger != 'manual') {\n          eventIn = trigger == 'hover' ? 'mouseenter' : 'focus'\n          eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'\n          this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n          this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n        }\n      }\n\n      this.options.selector ?\n        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n        this.fixTitle()\n    }\n\n  , getOptions: function (options) {\n      options = $.extend({}, $.fn[this.type].defaults, this.$element.data(), options)\n\n      if (options.delay && typeof options.delay == 'number') {\n        options.delay = {\n          show: options.delay\n        , hide: options.delay\n        }\n      }\n\n      return options\n    }\n\n  , enter: function (e) {\n      var defaults = $.fn[this.type].defaults\n        , options = {}\n        , self\n\n      this._options && $.each(this._options, function (key, value) {\n        if (defaults[key] != value) options[key] = value\n      }, this)\n\n      self = $(e.currentTarget)[this.type](options).data(this.type)\n\n      if (!self.options.delay || !self.options.delay.show) return self.show()\n\n      clearTimeout(this.timeout)\n      self.hoverState = 'in'\n      this.timeout = setTimeout(function() {\n        if (self.hoverState == 'in') self.show()\n      }, self.options.delay.show)\n    }\n\n  , leave: function (e) {\n      var self = $(e.currentTarget)[this.type](this._options).data(this.type)\n\n      if (this.timeout) clearTimeout(this.timeout)\n      if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n      self.hoverState = 'out'\n      this.timeout = setTimeout(function() {\n        if (self.hoverState == 'out') self.hide()\n      }, self.options.delay.hide)\n    }\n\n  , show: function () {\n      var $tip\n        , pos\n        , actualWidth\n        , actualHeight\n        , placement\n        , tp\n        , e = $.Event('show')\n\n      if (this.hasContent() && this.enabled) {\n        this.$element.trigger(e)\n        if (e.isDefaultPrevented()) return\n        $tip = this.tip()\n        this.setContent()\n\n        if (this.options.animation) {\n          $tip.addClass('fade')\n        }\n\n        placement = typeof this.options.placement == 'function' ?\n          this.options.placement.call(this, $tip[0], this.$element[0]) :\n          this.options.placement\n\n        $tip\n          .detach()\n          .css({ top: 0, left: 0, display: 'block' })\n\n        this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n        pos = this.getPosition()\n\n        actualWidth = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n\n        switch (placement) {\n          case 'bottom':\n            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}\n            break\n          case 'top':\n            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}\n            break\n          case 'left':\n            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}\n            break\n          case 'right':\n            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}\n            break\n        }\n\n        this.applyPlacement(tp, placement)\n        this.$element.trigger('shown')\n      }\n    }\n\n  , applyPlacement: function(offset, placement){\n      var $tip = this.tip()\n        , width = $tip[0].offsetWidth\n        , height = $tip[0].offsetHeight\n        , actualWidth\n        , actualHeight\n        , delta\n        , replace\n\n      $tip\n        .offset(offset)\n        .addClass(placement)\n        .addClass('in')\n\n      actualWidth = $tip[0].offsetWidth\n      actualHeight = $tip[0].offsetHeight\n\n      if (placement == 'top' && actualHeight != height) {\n        offset.top = offset.top + height - actualHeight\n        replace = true\n      }\n\n      if (placement == 'bottom' || placement == 'top') {\n        delta = 0\n\n        if (offset.left < 0){\n          delta = offset.left * -2\n          offset.left = 0\n          $tip.offset(offset)\n          actualWidth = $tip[0].offsetWidth\n          actualHeight = $tip[0].offsetHeight\n        }\n\n        this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')\n      } else {\n        this.replaceArrow(actualHeight - height, actualHeight, 'top')\n      }\n\n      if (replace) $tip.offset(offset)\n    }\n\n  , replaceArrow: function(delta, dimension, position){\n      this\n        .arrow()\n        .css(position, delta ? (50 * (1 - delta / dimension) + \"%\") : '')\n    }\n\n  , setContent: function () {\n      var $tip = this.tip()\n        , title = this.getTitle()\n\n      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n      $tip.removeClass('fade in top bottom left right')\n    }\n\n  , hide: function () {\n      var that = this\n        , $tip = this.tip()\n        , e = $.Event('hide')\n\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n\n      $tip.removeClass('in')\n\n      function removeWithAnimation() {\n        var timeout = setTimeout(function () {\n          $tip.off($.support.transition.end).detach()\n        }, 500)\n\n        $tip.one($.support.transition.end, function () {\n          clearTimeout(timeout)\n          $tip.detach()\n        })\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        removeWithAnimation() :\n        $tip.detach()\n\n      this.$element.trigger('hidden')\n\n      return this\n    }\n\n  , fixTitle: function () {\n      var $e = this.$element\n      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {\n        $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n      }\n    }\n\n  , hasContent: function () {\n      return this.getTitle()\n    }\n\n  , getPosition: function () {\n      var el = this.$element[0]\n      return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {\n        width: el.offsetWidth\n      , height: el.offsetHeight\n      }, this.$element.offset())\n    }\n\n  , getTitle: function () {\n      var title\n        , $e = this.$element\n        , o = this.options\n\n      title = $e.attr('data-original-title')\n        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n      return title\n    }\n\n  , tip: function () {\n      return this.$tip = this.$tip || $(this.options.template)\n    }\n\n  , arrow: function(){\n      return this.$arrow = this.$arrow || this.tip().find(\".tooltip-arrow\")\n    }\n\n  , validate: function () {\n      if (!this.$element[0].parentNode) {\n        this.hide()\n        this.$element = null\n        this.options = null\n      }\n    }\n\n  , enable: function () {\n      this.enabled = true\n    }\n\n  , disable: function () {\n      this.enabled = false\n    }\n\n  , toggleEnabled: function () {\n      this.enabled = !this.enabled\n    }\n\n  , toggle: function (e) {\n      var self = e ? $(e.currentTarget)[this.type](this._options).data(this.type) : this\n      self.tip().hasClass('in') ? self.hide() : self.show()\n    }\n\n  , destroy: function () {\n      this.hide().$element.off('.' + this.type).removeData(this.type)\n    }\n\n  }\n\n /* TOOLTIP PLUGIN DEFINITION\n  * ========================= */\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('tooltip')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tooltip.Constructor = Tooltip\n\n  $.fn.tooltip.defaults = {\n    animation: true\n  , placement: 'top'\n  , selector: false\n  , template: '<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'\n  , trigger: 'hover focus'\n  , title: ''\n  , delay: 0\n  , html: false\n  , container: false\n  }\n\n /* TOOLTIP NO CONFLICT\n  * =================== */\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(window.jQuery);\n/* ===========================================================\n * bootstrap-popover.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#popovers\n * ===========================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =========================================================== */\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n /* POPOVER PUBLIC CLASS DEFINITION\n  * =============================== */\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js\n     ========================================== */\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {\n\n    constructor: Popover\n\n  , setContent: function () {\n      var $tip = this.tip()\n        , title = this.getTitle()\n        , content = this.getContent()\n\n      $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n      $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)\n\n      $tip.removeClass('fade top bottom left right in')\n    }\n\n  , hasContent: function () {\n      return this.getTitle() || this.getContent()\n    }\n\n  , getContent: function () {\n      var content\n        , $e = this.$element\n        , o = this.options\n\n      content = (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)\n        || $e.attr('data-content')\n\n      return content\n    }\n\n  , tip: function () {\n      if (!this.$tip) {\n        this.$tip = $(this.options.template)\n      }\n      return this.$tip\n    }\n\n  , destroy: function () {\n      this.hide().$element.off('.' + this.type).removeData(this.type)\n    }\n\n  })\n\n /* POPOVER PLUGIN DEFINITION\n  * ======================= */\n\n  var old = $.fn.popover\n\n  $.fn.popover = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('popover')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.popover.Constructor = Popover\n\n  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {\n    placement: 'right'\n  , trigger: 'click'\n  , content: ''\n  , template: '<div class=\"popover\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n /* POPOVER NO CONFLICT\n  * =================== */\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(window.jQuery);\n/* =============================================================\n * bootstrap-scrollspy.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#scrollspy\n * =============================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================== */\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n /* SCROLLSPY CLASS DEFINITION\n  * ========================== */\n\n  function ScrollSpy(element, options) {\n    var process = $.proxy(this.process, this)\n      , $element = $(element).is('body') ? $(window) : $(element)\n      , href\n    this.options = $.extend({}, $.fn.scrollspy.defaults, options)\n    this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)\n    this.selector = (this.options.target\n      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      || '') + ' .nav li > a'\n    this.$body = $('body')\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.prototype = {\n\n      constructor: ScrollSpy\n\n    , refresh: function () {\n        var self = this\n          , $targets\n\n        this.offsets = $([])\n        this.targets = $([])\n\n        $targets = this.$body\n          .find(this.selector)\n          .map(function () {\n            var $el = $(this)\n              , href = $el.data('target') || $el.attr('href')\n              , $href = /^#\\w/.test(href) && $(href)\n            return ( $href\n              && $href.length\n              && [[ $href.position().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]] ) || null\n          })\n          .sort(function (a, b) { return a[0] - b[0] })\n          .each(function () {\n            self.offsets.push(this[0])\n            self.targets.push(this[1])\n          })\n      }\n\n    , process: function () {\n        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset\n          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight\n          , maxScroll = scrollHeight - this.$scrollElement.height()\n          , offsets = this.offsets\n          , targets = this.targets\n          , activeTarget = this.activeTarget\n          , i\n\n        if (scrollTop >= maxScroll) {\n          return activeTarget != (i = targets.last()[0])\n            && this.activate ( i )\n        }\n\n        for (i = offsets.length; i--;) {\n          activeTarget != targets[i]\n            && scrollTop >= offsets[i]\n            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n            && this.activate( targets[i] )\n        }\n      }\n\n    , activate: function (target) {\n        var active\n          , selector\n\n        this.activeTarget = target\n\n        $(this.selector)\n          .parent('.active')\n          .removeClass('active')\n\n        selector = this.selector\n          + '[data-target=\"' + target + '\"],'\n          + this.selector + '[href=\"' + target + '\"]'\n\n        active = $(selector)\n          .parent('li')\n          .addClass('active')\n\n        if (active.parent('.dropdown-menu').length)  {\n          active = active.closest('li.dropdown').addClass('active')\n        }\n\n        active.trigger('activate')\n      }\n\n  }\n\n /* SCROLLSPY PLUGIN DEFINITION\n  * =========================== */\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('scrollspy')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n  $.fn.scrollspy.defaults = {\n    offset: 10\n  }\n\n /* SCROLLSPY NO CONFLICT\n  * ===================== */\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n /* SCROLLSPY DATA-API\n  * ================== */\n\n  $(window).on('load', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      $spy.scrollspy($spy.data())\n    })\n  })\n\n}(window.jQuery);/* ========================================================\n * bootstrap-tab.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#tabs\n * ========================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================== */\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n /* TAB CLASS DEFINITION\n  * ==================== */\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype = {\n\n    constructor: Tab\n\n  , show: function () {\n      var $this = this.element\n        , $ul = $this.closest('ul:not(.dropdown-menu)')\n        , selector = $this.attr('data-target')\n        , previous\n        , $target\n        , e\n\n      if (!selector) {\n        selector = $this.attr('href')\n        selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n      }\n\n      if ( $this.parent('li').hasClass('active') ) return\n\n      previous = $ul.find('.active:last a')[0]\n\n      e = $.Event('show', {\n        relatedTarget: previous\n      })\n\n      $this.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      $target = $(selector)\n\n      this.activate($this.parent('li'), $ul)\n      this.activate($target, $target.parent(), function () {\n        $this.trigger({\n          type: 'shown'\n        , relatedTarget: previous\n        })\n      })\n    }\n\n  , activate: function ( element, container, callback) {\n      var $active = container.find('> .active')\n        , transition = callback\n            && $.support.transition\n            && $active.hasClass('fade')\n\n      function next() {\n        $active\n          .removeClass('active')\n          .find('> .dropdown-menu > .active')\n          .removeClass('active')\n\n        element.addClass('active')\n\n        if (transition) {\n          element[0].offsetWidth // reflow for transition\n          element.addClass('in')\n        } else {\n          element.removeClass('fade')\n        }\n\n        if ( element.parent('.dropdown-menu') ) {\n          element.closest('li.dropdown').addClass('active')\n        }\n\n        callback && callback()\n      }\n\n      transition ?\n        $active.one($.support.transition.end, next) :\n        next()\n\n      $active.removeClass('in')\n    }\n  }\n\n /* TAB PLUGIN DEFINITION\n  * ===================== */\n\n  var old = $.fn.tab\n\n  $.fn.tab = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('tab')\n      if (!data) $this.data('tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tab.Constructor = Tab\n\n /* TAB NO CONFLICT\n  * =============== */\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n /* TAB DATA-API\n  * ============ */\n\n  $(document).on('click.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    $(this).tab('show')\n  })\n\n}(window.jQuery);/* =============================================================\n * bootstrap-typeahead.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#typeahead\n * =============================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ============================================================ */\n\n!function($){\n\n  \"use strict\"; // jshint ;_;\n\n /* TYPEAHEAD PUBLIC CLASS DEFINITION\n  * ================================= */\n\n  var Typeahead = function (element, options) {\n    this.$element = $(element)\n    this.options = $.extend({}, $.fn.typeahead.defaults, options)\n    this.matcher = this.options.matcher || this.matcher\n    this.sorter = this.options.sorter || this.sorter\n    this.highlighter = this.options.highlighter || this.highlighter\n    this.updater = this.options.updater || this.updater\n    this.source = this.options.source\n    this.$menu = $(this.options.menu)\n    this.shown = false\n    this.listen()\n  }\n\n  Typeahead.prototype = {\n\n    constructor: Typeahead\n\n  , select: function () {\n      var val = this.$menu.find('.active').attr('data-value')\n      this.$element\n        .val(this.updater(val))\n        .change()\n      return this.hide()\n    }\n\n  , updater: function (item) {\n      return item\n    }\n\n  , show: function () {\n      var pos = $.extend({}, this.$element.position(), {\n        height: this.$element[0].offsetHeight\n      })\n\n      this.$menu\n        .insertAfter(this.$element)\n        .css({\n          top: pos.top + pos.height\n        , left: pos.left\n        })\n        .show()\n\n      this.shown = true\n      return this\n    }\n\n  , hide: function () {\n      this.$menu.hide()\n      this.shown = false\n      return this\n    }\n\n  , lookup: function (event) {\n      var items\n\n      this.query = this.$element.val()\n\n      if (!this.query || this.query.length < this.options.minLength) {\n        return this.shown ? this.hide() : this\n      }\n\n      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source\n\n      return items ? this.process(items) : this\n    }\n\n  , process: function (items) {\n      var that = this\n\n      items = $.grep(items, function (item) {\n        return that.matcher(item)\n      })\n\n      items = this.sorter(items)\n\n      if (!items.length) {\n        return this.shown ? this.hide() : this\n      }\n\n      return this.render(items.slice(0, this.options.items)).show()\n    }\n\n  , matcher: function (item) {\n      return ~item.toLowerCase().indexOf(this.query.toLowerCase())\n    }\n\n  , sorter: function (items) {\n      var beginswith = []\n        , caseSensitive = []\n        , caseInsensitive = []\n        , item\n\n      while (item = items.shift()) {\n        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)\n        else if (~item.indexOf(this.query)) caseSensitive.push(item)\n        else caseInsensitive.push(item)\n      }\n\n      return beginswith.concat(caseSensitive, caseInsensitive)\n    }\n\n  , highlighter: function (item) {\n      var query = this.query.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, '\\\\$&')\n      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {\n        return '<strong>' + match + '</strong>'\n      })\n    }\n\n  , render: function (items) {\n      var that = this\n\n      items = $(items).map(function (i, item) {\n        i = $(that.options.item).attr('data-value', item)\n        i.find('a').html(that.highlighter(item))\n        return i[0]\n      })\n\n      items.first().addClass('active')\n      this.$menu.html(items)\n      return this\n    }\n\n  , next: function (event) {\n      var active = this.$menu.find('.active').removeClass('active')\n        , next = active.next()\n\n      if (!next.length) {\n        next = $(this.$menu.find('li')[0])\n      }\n\n      next.addClass('active')\n    }\n\n  , prev: function (event) {\n      var active = this.$menu.find('.active').removeClass('active')\n        , prev = active.prev()\n\n      if (!prev.length) {\n        prev = this.$menu.find('li').last()\n      }\n\n      prev.addClass('active')\n    }\n\n  , listen: function () {\n      this.$element\n        .on('focus',    $.proxy(this.focus, this))\n        .on('blur',     $.proxy(this.blur, this))\n        .on('keypress', $.proxy(this.keypress, this))\n        .on('keyup',    $.proxy(this.keyup, this))\n\n      if (this.eventSupported('keydown')) {\n        this.$element.on('keydown', $.proxy(this.keydown, this))\n      }\n\n      this.$menu\n        .on('click', $.proxy(this.click, this))\n        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))\n        .on('mouseleave', 'li', $.proxy(this.mouseleave, this))\n    }\n\n  , eventSupported: function(eventName) {\n      var isSupported = eventName in this.$element\n      if (!isSupported) {\n        this.$element.setAttribute(eventName, 'return;')\n        isSupported = typeof this.$element[eventName] === 'function'\n      }\n      return isSupported\n    }\n\n  , move: function (e) {\n      if (!this.shown) return\n\n      switch(e.keyCode) {\n        case 9: // tab\n        case 13: // enter\n        case 27: // escape\n          e.preventDefault()\n          break\n\n        case 38: // up arrow\n          e.preventDefault()\n          this.prev()\n          break\n\n        case 40: // down arrow\n          e.preventDefault()\n          this.next()\n          break\n      }\n\n      e.stopPropagation()\n    }\n\n  , keydown: function (e) {\n      this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40,38,9,13,27])\n      this.move(e)\n    }\n\n  , keypress: function (e) {\n      if (this.suppressKeyPressRepeat) return\n      this.move(e)\n    }\n\n  , keyup: function (e) {\n      switch(e.keyCode) {\n        case 40: // down arrow\n        case 38: // up arrow\n        case 16: // shift\n        case 17: // ctrl\n        case 18: // alt\n          break\n\n        case 9: // tab\n        case 13: // enter\n          if (!this.shown) return\n          this.select()\n          break\n\n        case 27: // escape\n          if (!this.shown) return\n          this.hide()\n          break\n\n        default:\n          this.lookup()\n      }\n\n      e.stopPropagation()\n      e.preventDefault()\n  }\n\n  , focus: function (e) {\n      this.focused = true\n    }\n\n  , blur: function (e) {\n      this.focused = false\n      if (!this.mousedover && this.shown) this.hide()\n    }\n\n  , click: function (e) {\n      e.stopPropagation()\n      e.preventDefault()\n      this.select()\n      this.$element.focus()\n    }\n\n  , mouseenter: function (e) {\n      this.mousedover = true\n      this.$menu.find('.active').removeClass('active')\n      $(e.currentTarget).addClass('active')\n    }\n\n  , mouseleave: function (e) {\n      this.mousedover = false\n      if (!this.focused && this.shown) this.hide()\n    }\n\n  }\n\n  /* TYPEAHEAD PLUGIN DEFINITION\n   * =========================== */\n\n  var old = $.fn.typeahead\n\n  $.fn.typeahead = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('typeahead')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.typeahead.defaults = {\n    source: []\n  , items: 8\n  , menu: '<ul class=\"typeahead dropdown-menu\"></ul>'\n  , item: '<li><a href=\"#\"></a></li>'\n  , minLength: 1\n  }\n\n  $.fn.typeahead.Constructor = Typeahead\n\n /* TYPEAHEAD NO CONFLICT\n  * =================== */\n\n  $.fn.typeahead.noConflict = function () {\n    $.fn.typeahead = old\n    return this\n  }\n\n /* TYPEAHEAD DATA-API\n  * ================== */\n\n  $(document).on('focus.typeahead.data-api', '[data-provide=\"typeahead\"]', function (e) {\n    var $this = $(this)\n    if ($this.data('typeahead')) return\n    $this.typeahead($this.data())\n  })\n\n}(window.jQuery);\n/* ==========================================================\n * bootstrap-affix.js v2.3.2\n * http://getbootstrap.com/2.3.2/javascript.html#affix\n * ==========================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ========================================================== */\n\n!function ($) {\n\n  \"use strict\"; // jshint ;_;\n\n /* AFFIX CLASS DEFINITION\n  * ====================== */\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, $.fn.affix.defaults, options)\n    this.$window = $(window)\n      .on('scroll.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.affix.data-api',  $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this))\n    this.$element = $(element)\n    this.checkPosition()\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n      , scrollTop = this.$window.scrollTop()\n      , position = this.$element.offset()\n      , offset = this.options.offset\n      , offsetBottom = offset.bottom\n      , offsetTop = offset.top\n      , reset = 'affix affix-top affix-bottom'\n      , affix\n\n    if (typeof offset != 'object') offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function') offsetTop = offset.top()\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\n\n    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?\n      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?\n      'bottom' : offsetTop != null && scrollTop <= offsetTop ?\n      'top'    : false\n\n    if (this.affixed === affix) return\n\n    this.affixed = affix\n    this.unpin = affix == 'bottom' ? position.top - scrollTop : null\n\n    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))\n  }\n\n /* AFFIX PLUGIN DEFINITION\n  * ======================= */\n\n  var old = $.fn.affix\n\n  $.fn.affix = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n        , data = $this.data('affix')\n        , options = typeof option == 'object' && option\n      if (!data) $this.data('affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.affix.Constructor = Affix\n\n  $.fn.affix.defaults = {\n    offset: 0\n  }\n\n /* AFFIX NO CONFLICT\n  * ================= */\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n /* AFFIX DATA-API\n  * ============== */\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n        , data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      data.offsetBottom && (data.offset.bottom = data.offsetBottom)\n      data.offsetTop && (data.offset.top = data.offsetTop)\n\n      $spy.affix(data)\n    })\n  })\n\n}(window.jQuery);\n"
  },
  {
    "path": "examples/assets/d3/LICENSE",
    "content": "Copyright (c) 2010-2014, Michael Bostock\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* The name Michael Bostock may not be used to endorse or promote products\n  derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT,\nINDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\nBUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\nOF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\nEVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "examples/assets/d3/d3.js",
    "content": "!function() {\n  var d3 = {\n    version: \"3.4.11\"\n  };\n  if (!Date.now) Date.now = function() {\n    return +new Date();\n  };\n  var d3_arraySlice = [].slice, d3_array = function(list) {\n    return d3_arraySlice.call(list);\n  };\n  var d3_document = document, d3_documentElement = d3_document.documentElement, d3_window = window;\n  try {\n    d3_array(d3_documentElement.childNodes)[0].nodeType;\n  } catch (e) {\n    d3_array = function(list) {\n      var i = list.length, array = new Array(i);\n      while (i--) array[i] = list[i];\n      return array;\n    };\n  }\n  try {\n    d3_document.createElement(\"div\").style.setProperty(\"opacity\", 0, \"\");\n  } catch (error) {\n    var d3_element_prototype = d3_window.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = d3_window.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;\n    d3_element_prototype.setAttribute = function(name, value) {\n      d3_element_setAttribute.call(this, name, value + \"\");\n    };\n    d3_element_prototype.setAttributeNS = function(space, local, value) {\n      d3_element_setAttributeNS.call(this, space, local, value + \"\");\n    };\n    d3_style_prototype.setProperty = function(name, value, priority) {\n      d3_style_setProperty.call(this, name, value + \"\", priority);\n    };\n  }\n  d3.ascending = d3_ascending;\n  function d3_ascending(a, b) {\n    return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n  }\n  d3.descending = function(a, b) {\n    return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n  };\n  d3.min = function(array, f) {\n    var i = -1, n = array.length, a, b;\n    if (arguments.length === 1) {\n      while (++i < n && !((a = array[i]) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = array[i]) != null && a > b) a = b;\n    } else {\n      while (++i < n && !((a = f.call(array, array[i], i)) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;\n    }\n    return a;\n  };\n  d3.max = function(array, f) {\n    var i = -1, n = array.length, a, b;\n    if (arguments.length === 1) {\n      while (++i < n && !((a = array[i]) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = array[i]) != null && b > a) a = b;\n    } else {\n      while (++i < n && !((a = f.call(array, array[i], i)) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;\n    }\n    return a;\n  };\n  d3.extent = function(array, f) {\n    var i = -1, n = array.length, a, b, c;\n    if (arguments.length === 1) {\n      while (++i < n && !((a = c = array[i]) != null && a <= a)) a = c = undefined;\n      while (++i < n) if ((b = array[i]) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    } else {\n      while (++i < n && !((a = c = f.call(array, array[i], i)) != null && a <= a)) a = undefined;\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    }\n    return [ a, c ];\n  };\n  d3.sum = function(array, f) {\n    var s = 0, n = array.length, a, i = -1;\n    if (arguments.length === 1) {\n      while (++i < n) if (!isNaN(a = +array[i])) s += a;\n    } else {\n      while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a;\n    }\n    return s;\n  };\n  function d3_number(x) {\n    return x != null && !isNaN(x);\n  }\n  d3.mean = function(array, f) {\n    var s = 0, n = array.length, a, i = -1, j = n;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_number(a = array[i])) s += a; else --j;\n    } else {\n      while (++i < n) if (d3_number(a = f.call(array, array[i], i))) s += a; else --j;\n    }\n    return j ? s / j : undefined;\n  };\n  d3.quantile = function(values, p) {\n    var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;\n    return e ? v + e * (values[h] - v) : v;\n  };\n  d3.median = function(array, f) {\n    if (arguments.length > 1) array = array.map(f);\n    array = array.filter(d3_number);\n    return array.length ? d3.quantile(array.sort(d3_ascending), .5) : undefined;\n  };\n  function d3_bisector(compare) {\n    return {\n      left: function(a, x, lo, hi) {\n        if (arguments.length < 3) lo = 0;\n        if (arguments.length < 4) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid;\n        }\n        return lo;\n      },\n      right: function(a, x, lo, hi) {\n        if (arguments.length < 3) lo = 0;\n        if (arguments.length < 4) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1;\n        }\n        return lo;\n      }\n    };\n  }\n  var d3_bisect = d3_bisector(d3_ascending);\n  d3.bisectLeft = d3_bisect.left;\n  d3.bisect = d3.bisectRight = d3_bisect.right;\n  d3.bisector = function(f) {\n    return d3_bisector(f.length === 1 ? function(d, x) {\n      return d3_ascending(f(d), x);\n    } : f);\n  };\n  d3.shuffle = function(array) {\n    var m = array.length, t, i;\n    while (m) {\n      i = Math.random() * m-- | 0;\n      t = array[m], array[m] = array[i], array[i] = t;\n    }\n    return array;\n  };\n  d3.permute = function(array, indexes) {\n    var i = indexes.length, permutes = new Array(i);\n    while (i--) permutes[i] = array[indexes[i]];\n    return permutes;\n  };\n  d3.pairs = function(array) {\n    var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n);\n    while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ];\n    return pairs;\n  };\n  d3.zip = function() {\n    if (!(n = arguments.length)) return [];\n    for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m; ) {\n      for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n; ) {\n        zip[j] = arguments[j][i];\n      }\n    }\n    return zips;\n  };\n  function d3_zipLength(d) {\n    return d.length;\n  }\n  d3.transpose = function(matrix) {\n    return d3.zip.apply(d3, matrix);\n  };\n  d3.keys = function(map) {\n    var keys = [];\n    for (var key in map) keys.push(key);\n    return keys;\n  };\n  d3.values = function(map) {\n    var values = [];\n    for (var key in map) values.push(map[key]);\n    return values;\n  };\n  d3.entries = function(map) {\n    var entries = [];\n    for (var key in map) entries.push({\n      key: key,\n      value: map[key]\n    });\n    return entries;\n  };\n  d3.merge = function(arrays) {\n    var n = arrays.length, m, i = -1, j = 0, merged, array;\n    while (++i < n) j += arrays[i].length;\n    merged = new Array(j);\n    while (--n >= 0) {\n      array = arrays[n];\n      m = array.length;\n      while (--m >= 0) {\n        merged[--j] = array[m];\n      }\n    }\n    return merged;\n  };\n  var abs = Math.abs;\n  d3.range = function(start, stop, step) {\n    if (arguments.length < 3) {\n      step = 1;\n      if (arguments.length < 2) {\n        stop = start;\n        start = 0;\n      }\n    }\n    if ((stop - start) / step === Infinity) throw new Error(\"infinite range\");\n    var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;\n    start *= k, stop *= k, step *= k;\n    if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);\n    return range;\n  };\n  function d3_range_integerScale(x) {\n    var k = 1;\n    while (x * k % 1) k *= 10;\n    return k;\n  }\n  function d3_class(ctor, properties) {\n    try {\n      for (var key in properties) {\n        Object.defineProperty(ctor.prototype, key, {\n          value: properties[key],\n          enumerable: false\n        });\n      }\n    } catch (e) {\n      ctor.prototype = properties;\n    }\n  }\n  d3.map = function(object) {\n    var map = new d3_Map();\n    if (object instanceof d3_Map) object.forEach(function(key, value) {\n      map.set(key, value);\n    }); else for (var key in object) map.set(key, object[key]);\n    return map;\n  };\n  function d3_Map() {}\n  d3_class(d3_Map, {\n    has: d3_map_has,\n    get: function(key) {\n      return this[d3_map_prefix + key];\n    },\n    set: function(key, value) {\n      return this[d3_map_prefix + key] = value;\n    },\n    remove: d3_map_remove,\n    keys: d3_map_keys,\n    values: function() {\n      var values = [];\n      this.forEach(function(key, value) {\n        values.push(value);\n      });\n      return values;\n    },\n    entries: function() {\n      var entries = [];\n      this.forEach(function(key, value) {\n        entries.push({\n          key: key,\n          value: value\n        });\n      });\n      return entries;\n    },\n    size: d3_map_size,\n    empty: d3_map_empty,\n    forEach: function(f) {\n      for (var key in this) if (key.charCodeAt(0) === d3_map_prefixCode) f.call(this, key.substring(1), this[key]);\n    }\n  });\n  var d3_map_prefix = \"\\x00\", d3_map_prefixCode = d3_map_prefix.charCodeAt(0);\n  function d3_map_has(key) {\n    return d3_map_prefix + key in this;\n  }\n  function d3_map_remove(key) {\n    key = d3_map_prefix + key;\n    return key in this && delete this[key];\n  }\n  function d3_map_keys() {\n    var keys = [];\n    this.forEach(function(key) {\n      keys.push(key);\n    });\n    return keys;\n  }\n  function d3_map_size() {\n    var size = 0;\n    for (var key in this) if (key.charCodeAt(0) === d3_map_prefixCode) ++size;\n    return size;\n  }\n  function d3_map_empty() {\n    for (var key in this) if (key.charCodeAt(0) === d3_map_prefixCode) return false;\n    return true;\n  }\n  d3.nest = function() {\n    var nest = {}, keys = [], sortKeys = [], sortValues, rollup;\n    function map(mapType, array, depth) {\n      if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;\n      var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values;\n      while (++i < n) {\n        if (values = valuesByKey.get(keyValue = key(object = array[i]))) {\n          values.push(object);\n        } else {\n          valuesByKey.set(keyValue, [ object ]);\n        }\n      }\n      if (mapType) {\n        object = mapType();\n        setter = function(keyValue, values) {\n          object.set(keyValue, map(mapType, values, depth));\n        };\n      } else {\n        object = {};\n        setter = function(keyValue, values) {\n          object[keyValue] = map(mapType, values, depth);\n        };\n      }\n      valuesByKey.forEach(setter);\n      return object;\n    }\n    function entries(map, depth) {\n      if (depth >= keys.length) return map;\n      var array = [], sortKey = sortKeys[depth++];\n      map.forEach(function(key, keyMap) {\n        array.push({\n          key: key,\n          values: entries(keyMap, depth)\n        });\n      });\n      return sortKey ? array.sort(function(a, b) {\n        return sortKey(a.key, b.key);\n      }) : array;\n    }\n    nest.map = function(array, mapType) {\n      return map(mapType, array, 0);\n    };\n    nest.entries = function(array) {\n      return entries(map(d3.map, array, 0), 0);\n    };\n    nest.key = function(d) {\n      keys.push(d);\n      return nest;\n    };\n    nest.sortKeys = function(order) {\n      sortKeys[keys.length - 1] = order;\n      return nest;\n    };\n    nest.sortValues = function(order) {\n      sortValues = order;\n      return nest;\n    };\n    nest.rollup = function(f) {\n      rollup = f;\n      return nest;\n    };\n    return nest;\n  };\n  d3.set = function(array) {\n    var set = new d3_Set();\n    if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);\n    return set;\n  };\n  function d3_Set() {}\n  d3_class(d3_Set, {\n    has: d3_map_has,\n    add: function(value) {\n      this[d3_map_prefix + value] = true;\n      return value;\n    },\n    remove: function(value) {\n      value = d3_map_prefix + value;\n      return value in this && delete this[value];\n    },\n    values: d3_map_keys,\n    size: d3_map_size,\n    empty: d3_map_empty,\n    forEach: function(f) {\n      for (var value in this) if (value.charCodeAt(0) === d3_map_prefixCode) f.call(this, value.substring(1));\n    }\n  });\n  d3.behavior = {};\n  d3.rebind = function(target, source) {\n    var i = 1, n = arguments.length, method;\n    while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);\n    return target;\n  };\n  function d3_rebind(target, source, method) {\n    return function() {\n      var value = method.apply(source, arguments);\n      return value === source ? target : value;\n    };\n  }\n  function d3_vendorSymbol(object, name) {\n    if (name in object) return name;\n    name = name.charAt(0).toUpperCase() + name.substring(1);\n    for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) {\n      var prefixName = d3_vendorPrefixes[i] + name;\n      if (prefixName in object) return prefixName;\n    }\n  }\n  var d3_vendorPrefixes = [ \"webkit\", \"ms\", \"moz\", \"Moz\", \"o\", \"O\" ];\n  function d3_noop() {}\n  d3.dispatch = function() {\n    var dispatch = new d3_dispatch(), i = -1, n = arguments.length;\n    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n    return dispatch;\n  };\n  function d3_dispatch() {}\n  d3_dispatch.prototype.on = function(type, listener) {\n    var i = type.indexOf(\".\"), name = \"\";\n    if (i >= 0) {\n      name = type.substring(i + 1);\n      type = type.substring(0, i);\n    }\n    if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);\n    if (arguments.length === 2) {\n      if (listener == null) for (type in this) {\n        if (this.hasOwnProperty(type)) this[type].on(name, null);\n      }\n      return this;\n    }\n  };\n  function d3_dispatch_event(dispatch) {\n    var listeners = [], listenerByName = new d3_Map();\n    function event() {\n      var z = listeners, i = -1, n = z.length, l;\n      while (++i < n) if (l = z[i].on) l.apply(this, arguments);\n      return dispatch;\n    }\n    event.on = function(name, listener) {\n      var l = listenerByName.get(name), i;\n      if (arguments.length < 2) return l && l.on;\n      if (l) {\n        l.on = null;\n        listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));\n        listenerByName.remove(name);\n      }\n      if (listener) listeners.push(listenerByName.set(name, {\n        on: listener\n      }));\n      return dispatch;\n    };\n    return event;\n  }\n  d3.event = null;\n  function d3_eventPreventDefault() {\n    d3.event.preventDefault();\n  }\n  function d3_eventSource() {\n    var e = d3.event, s;\n    while (s = e.sourceEvent) e = s;\n    return e;\n  }\n  function d3_eventDispatch(target) {\n    var dispatch = new d3_dispatch(), i = 0, n = arguments.length;\n    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n    dispatch.of = function(thiz, argumentz) {\n      return function(e1) {\n        try {\n          var e0 = e1.sourceEvent = d3.event;\n          e1.target = target;\n          d3.event = e1;\n          dispatch[e1.type].apply(thiz, argumentz);\n        } finally {\n          d3.event = e0;\n        }\n      };\n    };\n    return dispatch;\n  }\n  d3.requote = function(s) {\n    return s.replace(d3_requote_re, \"\\\\$&\");\n  };\n  var d3_requote_re = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\n  var d3_subclass = {}.__proto__ ? function(object, prototype) {\n    object.__proto__ = prototype;\n  } : function(object, prototype) {\n    for (var property in prototype) object[property] = prototype[property];\n  };\n  function d3_selection(groups) {\n    d3_subclass(groups, d3_selectionPrototype);\n    return groups;\n  }\n  var d3_select = function(s, n) {\n    return n.querySelector(s);\n  }, d3_selectAll = function(s, n) {\n    return n.querySelectorAll(s);\n  }, d3_selectMatcher = d3_documentElement.matches || d3_documentElement[d3_vendorSymbol(d3_documentElement, \"matchesSelector\")], d3_selectMatches = function(n, s) {\n    return d3_selectMatcher.call(n, s);\n  };\n  if (typeof Sizzle === \"function\") {\n    d3_select = function(s, n) {\n      return Sizzle(s, n)[0] || null;\n    };\n    d3_selectAll = Sizzle;\n    d3_selectMatches = Sizzle.matchesSelector;\n  }\n  d3.selection = function() {\n    return d3_selectionRoot;\n  };\n  var d3_selectionPrototype = d3.selection.prototype = [];\n  d3_selectionPrototype.select = function(selector) {\n    var subgroups = [], subgroup, subnode, group, node;\n    selector = d3_selection_selector(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = (group = this[j]).parentNode;\n      for (var i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroup.push(subnode = selector.call(node, node.__data__, i, j));\n          if (subnode && \"__data__\" in node) subnode.__data__ = node.__data__;\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_selector(selector) {\n    return typeof selector === \"function\" ? selector : function() {\n      return d3_select(selector, this);\n    };\n  }\n  d3_selectionPrototype.selectAll = function(selector) {\n    var subgroups = [], subgroup, node;\n    selector = d3_selection_selectorAll(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j)));\n          subgroup.parentNode = node;\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_selectorAll(selector) {\n    return typeof selector === \"function\" ? selector : function() {\n      return d3_selectAll(selector, this);\n    };\n  }\n  var d3_nsPrefix = {\n    svg: \"http://www.w3.org/2000/svg\",\n    xhtml: \"http://www.w3.org/1999/xhtml\",\n    xlink: \"http://www.w3.org/1999/xlink\",\n    xml: \"http://www.w3.org/XML/1998/namespace\",\n    xmlns: \"http://www.w3.org/2000/xmlns/\"\n  };\n  d3.ns = {\n    prefix: d3_nsPrefix,\n    qualify: function(name) {\n      var i = name.indexOf(\":\"), prefix = name;\n      if (i >= 0) {\n        prefix = name.substring(0, i);\n        name = name.substring(i + 1);\n      }\n      return d3_nsPrefix.hasOwnProperty(prefix) ? {\n        space: d3_nsPrefix[prefix],\n        local: name\n      } : name;\n    }\n  };\n  d3_selectionPrototype.attr = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") {\n        var node = this.node();\n        name = d3.ns.qualify(name);\n        return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);\n      }\n      for (value in name) this.each(d3_selection_attr(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_attr(name, value));\n  };\n  function d3_selection_attr(name, value) {\n    name = d3.ns.qualify(name);\n    function attrNull() {\n      this.removeAttribute(name);\n    }\n    function attrNullNS() {\n      this.removeAttributeNS(name.space, name.local);\n    }\n    function attrConstant() {\n      this.setAttribute(name, value);\n    }\n    function attrConstantNS() {\n      this.setAttributeNS(name.space, name.local, value);\n    }\n    function attrFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);\n    }\n    function attrFunctionNS() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);\n    }\n    return value == null ? name.local ? attrNullNS : attrNull : typeof value === \"function\" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;\n  }\n  function d3_collapse(s) {\n    return s.trim().replace(/\\s+/g, \" \");\n  }\n  d3_selectionPrototype.classed = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") {\n        var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1;\n        if (value = node.classList) {\n          while (++i < n) if (!value.contains(name[i])) return false;\n        } else {\n          value = node.getAttribute(\"class\");\n          while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;\n        }\n        return true;\n      }\n      for (value in name) this.each(d3_selection_classed(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_classed(name, value));\n  };\n  function d3_selection_classedRe(name) {\n    return new RegExp(\"(?:^|\\\\s+)\" + d3.requote(name) + \"(?:\\\\s+|$)\", \"g\");\n  }\n  function d3_selection_classes(name) {\n    return (name + \"\").trim().split(/^|\\s+/);\n  }\n  function d3_selection_classed(name, value) {\n    name = d3_selection_classes(name).map(d3_selection_classedName);\n    var n = name.length;\n    function classedConstant() {\n      var i = -1;\n      while (++i < n) name[i](this, value);\n    }\n    function classedFunction() {\n      var i = -1, x = value.apply(this, arguments);\n      while (++i < n) name[i](this, x);\n    }\n    return typeof value === \"function\" ? classedFunction : classedConstant;\n  }\n  function d3_selection_classedName(name) {\n    var re = d3_selection_classedRe(name);\n    return function(node, value) {\n      if (c = node.classList) return value ? c.add(name) : c.remove(name);\n      var c = node.getAttribute(\"class\") || \"\";\n      if (value) {\n        re.lastIndex = 0;\n        if (!re.test(c)) node.setAttribute(\"class\", d3_collapse(c + \" \" + name));\n      } else {\n        node.setAttribute(\"class\", d3_collapse(c.replace(re, \" \")));\n      }\n    };\n  }\n  d3_selectionPrototype.style = function(name, value, priority) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof name !== \"string\") {\n        if (n < 2) value = \"\";\n        for (priority in name) this.each(d3_selection_style(priority, name[priority], value));\n        return this;\n      }\n      if (n < 2) return d3_window.getComputedStyle(this.node(), null).getPropertyValue(name);\n      priority = \"\";\n    }\n    return this.each(d3_selection_style(name, value, priority));\n  };\n  function d3_selection_style(name, value, priority) {\n    function styleNull() {\n      this.style.removeProperty(name);\n    }\n    function styleConstant() {\n      this.style.setProperty(name, value, priority);\n    }\n    function styleFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);\n    }\n    return value == null ? styleNull : typeof value === \"function\" ? styleFunction : styleConstant;\n  }\n  d3_selectionPrototype.property = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") return this.node()[name];\n      for (value in name) this.each(d3_selection_property(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_property(name, value));\n  };\n  function d3_selection_property(name, value) {\n    function propertyNull() {\n      delete this[name];\n    }\n    function propertyConstant() {\n      this[name] = value;\n    }\n    function propertyFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) delete this[name]; else this[name] = x;\n    }\n    return value == null ? propertyNull : typeof value === \"function\" ? propertyFunction : propertyConstant;\n  }\n  d3_selectionPrototype.text = function(value) {\n    return arguments.length ? this.each(typeof value === \"function\" ? function() {\n      var v = value.apply(this, arguments);\n      this.textContent = v == null ? \"\" : v;\n    } : value == null ? function() {\n      this.textContent = \"\";\n    } : function() {\n      this.textContent = value;\n    }) : this.node().textContent;\n  };\n  d3_selectionPrototype.html = function(value) {\n    return arguments.length ? this.each(typeof value === \"function\" ? function() {\n      var v = value.apply(this, arguments);\n      this.innerHTML = v == null ? \"\" : v;\n    } : value == null ? function() {\n      this.innerHTML = \"\";\n    } : function() {\n      this.innerHTML = value;\n    }) : this.node().innerHTML;\n  };\n  d3_selectionPrototype.append = function(name) {\n    name = d3_selection_creator(name);\n    return this.select(function() {\n      return this.appendChild(name.apply(this, arguments));\n    });\n  };\n  function d3_selection_creator(name) {\n    return typeof name === \"function\" ? name : (name = d3.ns.qualify(name)).local ? function() {\n      return this.ownerDocument.createElementNS(name.space, name.local);\n    } : function() {\n      return this.ownerDocument.createElementNS(this.namespaceURI, name);\n    };\n  }\n  d3_selectionPrototype.insert = function(name, before) {\n    name = d3_selection_creator(name);\n    before = d3_selection_selector(before);\n    return this.select(function() {\n      return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);\n    });\n  };\n  d3_selectionPrototype.remove = function() {\n    return this.each(function() {\n      var parent = this.parentNode;\n      if (parent) parent.removeChild(this);\n    });\n  };\n  d3_selectionPrototype.data = function(value, key) {\n    var i = -1, n = this.length, group, node;\n    if (!arguments.length) {\n      value = new Array(n = (group = this[0]).length);\n      while (++i < n) {\n        if (node = group[i]) {\n          value[i] = node.__data__;\n        }\n      }\n      return value;\n    }\n    function bind(group, groupData) {\n      var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;\n      if (key) {\n        var nodeByKeyValue = new d3_Map(), dataByKeyValue = new d3_Map(), keyValues = [], keyValue;\n        for (i = -1; ++i < n; ) {\n          keyValue = key.call(node = group[i], node.__data__, i);\n          if (nodeByKeyValue.has(keyValue)) {\n            exitNodes[i] = node;\n          } else {\n            nodeByKeyValue.set(keyValue, node);\n          }\n          keyValues.push(keyValue);\n        }\n        for (i = -1; ++i < m; ) {\n          keyValue = key.call(groupData, nodeData = groupData[i], i);\n          if (node = nodeByKeyValue.get(keyValue)) {\n            updateNodes[i] = node;\n            node.__data__ = nodeData;\n          } else if (!dataByKeyValue.has(keyValue)) {\n            enterNodes[i] = d3_selection_dataNode(nodeData);\n          }\n          dataByKeyValue.set(keyValue, nodeData);\n          nodeByKeyValue.remove(keyValue);\n        }\n        for (i = -1; ++i < n; ) {\n          if (nodeByKeyValue.has(keyValues[i])) {\n            exitNodes[i] = group[i];\n          }\n        }\n      } else {\n        for (i = -1; ++i < n0; ) {\n          node = group[i];\n          nodeData = groupData[i];\n          if (node) {\n            node.__data__ = nodeData;\n            updateNodes[i] = node;\n          } else {\n            enterNodes[i] = d3_selection_dataNode(nodeData);\n          }\n        }\n        for (;i < m; ++i) {\n          enterNodes[i] = d3_selection_dataNode(groupData[i]);\n        }\n        for (;i < n; ++i) {\n          exitNodes[i] = group[i];\n        }\n      }\n      enterNodes.update = updateNodes;\n      enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;\n      enter.push(enterNodes);\n      update.push(updateNodes);\n      exit.push(exitNodes);\n    }\n    var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);\n    if (typeof value === \"function\") {\n      while (++i < n) {\n        bind(group = this[i], value.call(group, group.parentNode.__data__, i));\n      }\n    } else {\n      while (++i < n) {\n        bind(group = this[i], value);\n      }\n    }\n    update.enter = function() {\n      return enter;\n    };\n    update.exit = function() {\n      return exit;\n    };\n    return update;\n  };\n  function d3_selection_dataNode(data) {\n    return {\n      __data__: data\n    };\n  }\n  d3_selectionPrototype.datum = function(value) {\n    return arguments.length ? this.property(\"__data__\", value) : this.property(\"__data__\");\n  };\n  d3_selectionPrototype.filter = function(filter) {\n    var subgroups = [], subgroup, group, node;\n    if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = (group = this[j]).parentNode;\n      for (var i = 0, n = group.length; i < n; i++) {\n        if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n          subgroup.push(node);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_filter(selector) {\n    return function() {\n      return d3_selectMatches(this, selector);\n    };\n  }\n  d3_selectionPrototype.order = function() {\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {\n        if (node = group[i]) {\n          if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);\n          next = node;\n        }\n      }\n    }\n    return this;\n  };\n  d3_selectionPrototype.sort = function(comparator) {\n    comparator = d3_selection_sortComparator.apply(this, arguments);\n    for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);\n    return this.order();\n  };\n  function d3_selection_sortComparator(comparator) {\n    if (!arguments.length) comparator = d3_ascending;\n    return function(a, b) {\n      return a && b ? comparator(a.__data__, b.__data__) : !a - !b;\n    };\n  }\n  d3_selectionPrototype.each = function(callback) {\n    return d3_selection_each(this, function(node, i, j) {\n      callback.call(node, node.__data__, i, j);\n    });\n  };\n  function d3_selection_each(groups, callback) {\n    for (var j = 0, m = groups.length; j < m; j++) {\n      for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {\n        if (node = group[i]) callback(node, i, j);\n      }\n    }\n    return groups;\n  }\n  d3_selectionPrototype.call = function(callback) {\n    var args = d3_array(arguments);\n    callback.apply(args[0] = this, args);\n    return this;\n  };\n  d3_selectionPrototype.empty = function() {\n    return !this.node();\n  };\n  d3_selectionPrototype.node = function() {\n    for (var j = 0, m = this.length; j < m; j++) {\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        var node = group[i];\n        if (node) return node;\n      }\n    }\n    return null;\n  };\n  d3_selectionPrototype.size = function() {\n    var n = 0;\n    this.each(function() {\n      ++n;\n    });\n    return n;\n  };\n  function d3_selection_enter(selection) {\n    d3_subclass(selection, d3_selection_enterPrototype);\n    return selection;\n  }\n  var d3_selection_enterPrototype = [];\n  d3.selection.enter = d3_selection_enter;\n  d3.selection.enter.prototype = d3_selection_enterPrototype;\n  d3_selection_enterPrototype.append = d3_selectionPrototype.append;\n  d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;\n  d3_selection_enterPrototype.node = d3_selectionPrototype.node;\n  d3_selection_enterPrototype.call = d3_selectionPrototype.call;\n  d3_selection_enterPrototype.size = d3_selectionPrototype.size;\n  d3_selection_enterPrototype.select = function(selector) {\n    var subgroups = [], subgroup, subnode, upgroup, group, node;\n    for (var j = -1, m = this.length; ++j < m; ) {\n      upgroup = (group = this[j]).update;\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = group.parentNode;\n      for (var i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j));\n          subnode.__data__ = node.__data__;\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  d3_selection_enterPrototype.insert = function(name, before) {\n    if (arguments.length < 2) before = d3_selection_enterInsertBefore(this);\n    return d3_selectionPrototype.insert.call(this, name, before);\n  };\n  function d3_selection_enterInsertBefore(enter) {\n    var i0, j0;\n    return function(d, i, j) {\n      var group = enter[j].update, n = group.length, node;\n      if (j != j0) j0 = j, i0 = 0;\n      if (i >= i0) i0 = i + 1;\n      while (!(node = group[i0]) && ++i0 < n) ;\n      return node;\n    };\n  }\n  d3_selectionPrototype.transition = function() {\n    var id = d3_transitionInheritId || ++d3_transitionId, subgroups = [], subgroup, node, transition = d3_transitionInherit || {\n      time: Date.now(),\n      ease: d3_ease_cubicInOut,\n      delay: 0,\n      duration: 250\n    };\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) d3_transitionNode(node, i, id, transition);\n        subgroup.push(node);\n      }\n    }\n    return d3_transition(subgroups, id);\n  };\n  d3_selectionPrototype.interrupt = function() {\n    return this.each(d3_selection_interrupt);\n  };\n  function d3_selection_interrupt() {\n    var lock = this.__transition__;\n    if (lock) ++lock.active;\n  }\n  d3.select = function(node) {\n    var group = [ typeof node === \"string\" ? d3_select(node, d3_document) : node ];\n    group.parentNode = d3_documentElement;\n    return d3_selection([ group ]);\n  };\n  d3.selectAll = function(nodes) {\n    var group = d3_array(typeof nodes === \"string\" ? d3_selectAll(nodes, d3_document) : nodes);\n    group.parentNode = d3_documentElement;\n    return d3_selection([ group ]);\n  };\n  var d3_selectionRoot = d3.select(d3_documentElement);\n  d3_selectionPrototype.on = function(type, listener, capture) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof type !== \"string\") {\n        if (n < 2) listener = false;\n        for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));\n        return this;\n      }\n      if (n < 2) return (n = this.node()[\"__on\" + type]) && n._;\n      capture = false;\n    }\n    return this.each(d3_selection_on(type, listener, capture));\n  };\n  function d3_selection_on(type, listener, capture) {\n    var name = \"__on\" + type, i = type.indexOf(\".\"), wrap = d3_selection_onListener;\n    if (i > 0) type = type.substring(0, i);\n    var filter = d3_selection_onFilters.get(type);\n    if (filter) type = filter, wrap = d3_selection_onFilter;\n    function onRemove() {\n      var l = this[name];\n      if (l) {\n        this.removeEventListener(type, l, l.$);\n        delete this[name];\n      }\n    }\n    function onAdd() {\n      var l = wrap(listener, d3_array(arguments));\n      onRemove.call(this);\n      this.addEventListener(type, this[name] = l, l.$ = capture);\n      l._ = listener;\n    }\n    function removeAll() {\n      var re = new RegExp(\"^__on([^.]+)\" + d3.requote(type) + \"$\"), match;\n      for (var name in this) {\n        if (match = name.match(re)) {\n          var l = this[name];\n          this.removeEventListener(match[1], l, l.$);\n          delete this[name];\n        }\n      }\n    }\n    return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll;\n  }\n  var d3_selection_onFilters = d3.map({\n    mouseenter: \"mouseover\",\n    mouseleave: \"mouseout\"\n  });\n  d3_selection_onFilters.forEach(function(k) {\n    if (\"on\" + k in d3_document) d3_selection_onFilters.remove(k);\n  });\n  function d3_selection_onListener(listener, argumentz) {\n    return function(e) {\n      var o = d3.event;\n      d3.event = e;\n      argumentz[0] = this.__data__;\n      try {\n        listener.apply(this, argumentz);\n      } finally {\n        d3.event = o;\n      }\n    };\n  }\n  function d3_selection_onFilter(listener, argumentz) {\n    var l = d3_selection_onListener(listener, argumentz);\n    return function(e) {\n      var target = this, related = e.relatedTarget;\n      if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) {\n        l.call(target, e);\n      }\n    };\n  }\n  var d3_event_dragSelect = \"onselectstart\" in d3_document ? null : d3_vendorSymbol(d3_documentElement.style, \"userSelect\"), d3_event_dragId = 0;\n  function d3_event_dragSuppress() {\n    var name = \".dragsuppress-\" + ++d3_event_dragId, click = \"click\" + name, w = d3.select(d3_window).on(\"touchmove\" + name, d3_eventPreventDefault).on(\"dragstart\" + name, d3_eventPreventDefault).on(\"selectstart\" + name, d3_eventPreventDefault);\n    if (d3_event_dragSelect) {\n      var style = d3_documentElement.style, select = style[d3_event_dragSelect];\n      style[d3_event_dragSelect] = \"none\";\n    }\n    return function(suppressClick) {\n      w.on(name, null);\n      if (d3_event_dragSelect) style[d3_event_dragSelect] = select;\n      if (suppressClick) {\n        function off() {\n          w.on(click, null);\n        }\n        w.on(click, function() {\n          d3_eventPreventDefault();\n          off();\n        }, true);\n        setTimeout(off, 0);\n      }\n    };\n  }\n  d3.mouse = function(container) {\n    return d3_mousePoint(container, d3_eventSource());\n  };\n  var d3_mouse_bug44083 = /WebKit/.test(d3_window.navigator.userAgent) ? -1 : 0;\n  function d3_mousePoint(container, e) {\n    if (e.changedTouches) e = e.changedTouches[0];\n    var svg = container.ownerSVGElement || container;\n    if (svg.createSVGPoint) {\n      var point = svg.createSVGPoint();\n      if (d3_mouse_bug44083 < 0 && (d3_window.scrollX || d3_window.scrollY)) {\n        svg = d3.select(\"body\").append(\"svg\").style({\n          position: \"absolute\",\n          top: 0,\n          left: 0,\n          margin: 0,\n          padding: 0,\n          border: \"none\"\n        }, \"important\");\n        var ctm = svg[0][0].getScreenCTM();\n        d3_mouse_bug44083 = !(ctm.f || ctm.e);\n        svg.remove();\n      }\n      if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX,\n      point.y = e.clientY;\n      point = point.matrixTransform(container.getScreenCTM().inverse());\n      return [ point.x, point.y ];\n    }\n    var rect = container.getBoundingClientRect();\n    return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];\n  }\n  d3.touches = function(container, touches) {\n    if (arguments.length < 2) touches = d3_eventSource().touches;\n    return touches ? d3_array(touches).map(function(touch) {\n      var point = d3_mousePoint(container, touch);\n      point.identifier = touch.identifier;\n      return point;\n    }) : [];\n  };\n  d3.behavior.drag = function() {\n    var event = d3_eventDispatch(drag, \"drag\", \"dragstart\", \"dragend\"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_behavior_dragMouseSubject, \"mousemove\", \"mouseup\"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_behavior_dragTouchSubject, \"touchmove\", \"touchend\");\n    function drag() {\n      this.on(\"mousedown.drag\", mousedown).on(\"touchstart.drag\", touchstart);\n    }\n    function dragstart(id, position, subject, move, end) {\n      return function() {\n        var that = this, target = d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = \".drag\" + (dragId == null ? \"\" : \"-\" + dragId), dragOffset, dragSubject = d3.select(subject()).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(), position0 = position(parent, dragId);\n        if (origin) {\n          dragOffset = origin.apply(that, arguments);\n          dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ];\n        } else {\n          dragOffset = [ 0, 0 ];\n        }\n        dispatch({\n          type: \"dragstart\"\n        });\n        function moved() {\n          var position1 = position(parent, dragId), dx, dy;\n          if (!position1) return;\n          dx = position1[0] - position0[0];\n          dy = position1[1] - position0[1];\n          dragged |= dx | dy;\n          position0 = position1;\n          dispatch({\n            type: \"drag\",\n            x: position1[0] + dragOffset[0],\n            y: position1[1] + dragOffset[1],\n            dx: dx,\n            dy: dy\n          });\n        }\n        function ended() {\n          if (!position(parent, dragId)) return;\n          dragSubject.on(move + dragName, null).on(end + dragName, null);\n          dragRestore(dragged && d3.event.target === target);\n          dispatch({\n            type: \"dragend\"\n          });\n        }\n      };\n    }\n    drag.origin = function(x) {\n      if (!arguments.length) return origin;\n      origin = x;\n      return drag;\n    };\n    return d3.rebind(drag, event, \"on\");\n  };\n  function d3_behavior_dragTouchId() {\n    return d3.event.changedTouches[0].identifier;\n  }\n  function d3_behavior_dragTouchSubject() {\n    return d3.event.target;\n  }\n  function d3_behavior_dragMouseSubject() {\n    return d3_window;\n  }\n  var π = Math.PI, τ = 2 * π, halfπ = π / 2, ε = 1e-6, ε2 = ε * ε, d3_radians = π / 180, d3_degrees = 180 / π;\n  function d3_sgn(x) {\n    return x > 0 ? 1 : x < 0 ? -1 : 0;\n  }\n  function d3_cross2d(a, b, c) {\n    return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n  }\n  function d3_acos(x) {\n    return x > 1 ? 0 : x < -1 ? π : Math.acos(x);\n  }\n  function d3_asin(x) {\n    return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);\n  }\n  function d3_sinh(x) {\n    return ((x = Math.exp(x)) - 1 / x) / 2;\n  }\n  function d3_cosh(x) {\n    return ((x = Math.exp(x)) + 1 / x) / 2;\n  }\n  function d3_tanh(x) {\n    return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n  }\n  function d3_haversin(x) {\n    return (x = Math.sin(x / 2)) * x;\n  }\n  var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4;\n  d3.interpolateZoom = function(p0, p1) {\n    var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2];\n    var dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1), dr = r1 - r0, S = (dr || Math.log(w1 / w0)) / ρ;\n    function interpolate(t) {\n      var s = t * S;\n      if (dr) {\n        var coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0));\n        return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ];\n      }\n      return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * s) ];\n    }\n    interpolate.duration = S * 1e3;\n    return interpolate;\n  };\n  d3.behavior.zoom = function() {\n    var view = {\n      x: 0,\n      y: 0,\n      k: 1\n    }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, mousedown = \"mousedown.zoom\", mousemove = \"mousemove.zoom\", mouseup = \"mouseup.zoom\", mousewheelTimer, touchstart = \"touchstart.zoom\", touchtime, event = d3_eventDispatch(zoom, \"zoomstart\", \"zoom\", \"zoomend\"), x0, x1, y0, y1;\n    function zoom(g) {\n      g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + \".zoom\", mousewheeled).on(\"dblclick.zoom\", dblclicked).on(touchstart, touchstarted);\n    }\n    zoom.event = function(g) {\n      g.each(function() {\n        var dispatch = event.of(this, arguments), view1 = view;\n        if (d3_transitionInheritId) {\n          d3.select(this).transition().each(\"start.zoom\", function() {\n            view = this.__chart__ || {\n              x: 0,\n              y: 0,\n              k: 1\n            };\n            zoomstarted(dispatch);\n          }).tween(\"zoom:zoom\", function() {\n            var dx = size[0], dy = size[1], cx = dx / 2, cy = dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]);\n            return function(t) {\n              var l = i(t), k = dx / l[2];\n              this.__chart__ = view = {\n                x: cx - l[0] * k,\n                y: cy - l[1] * k,\n                k: k\n              };\n              zoomed(dispatch);\n            };\n          }).each(\"end.zoom\", function() {\n            zoomended(dispatch);\n          });\n        } else {\n          this.__chart__ = view;\n          zoomstarted(dispatch);\n          zoomed(dispatch);\n          zoomended(dispatch);\n        }\n      });\n    };\n    zoom.translate = function(_) {\n      if (!arguments.length) return [ view.x, view.y ];\n      view = {\n        x: +_[0],\n        y: +_[1],\n        k: view.k\n      };\n      rescale();\n      return zoom;\n    };\n    zoom.scale = function(_) {\n      if (!arguments.length) return view.k;\n      view = {\n        x: view.x,\n        y: view.y,\n        k: +_\n      };\n      rescale();\n      return zoom;\n    };\n    zoom.scaleExtent = function(_) {\n      if (!arguments.length) return scaleExtent;\n      scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.center = function(_) {\n      if (!arguments.length) return center;\n      center = _ && [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.size = function(_) {\n      if (!arguments.length) return size;\n      size = _ && [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.x = function(z) {\n      if (!arguments.length) return x1;\n      x1 = z;\n      x0 = z.copy();\n      view = {\n        x: 0,\n        y: 0,\n        k: 1\n      };\n      return zoom;\n    };\n    zoom.y = function(z) {\n      if (!arguments.length) return y1;\n      y1 = z;\n      y0 = z.copy();\n      view = {\n        x: 0,\n        y: 0,\n        k: 1\n      };\n      return zoom;\n    };\n    function location(p) {\n      return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ];\n    }\n    function point(l) {\n      return [ l[0] * view.k + view.x, l[1] * view.k + view.y ];\n    }\n    function scaleTo(s) {\n      view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));\n    }\n    function translateTo(p, l) {\n      l = point(l);\n      view.x += p[0] - l[0];\n      view.y += p[1] - l[1];\n    }\n    function rescale() {\n      if (x1) x1.domain(x0.range().map(function(x) {\n        return (x - view.x) / view.k;\n      }).map(x0.invert));\n      if (y1) y1.domain(y0.range().map(function(y) {\n        return (y - view.y) / view.k;\n      }).map(y0.invert));\n    }\n    function zoomstarted(dispatch) {\n      dispatch({\n        type: \"zoomstart\"\n      });\n    }\n    function zoomed(dispatch) {\n      rescale();\n      dispatch({\n        type: \"zoom\",\n        scale: view.k,\n        translate: [ view.x, view.y ]\n      });\n    }\n    function zoomended(dispatch) {\n      dispatch({\n        type: \"zoomend\"\n      });\n    }\n    function mousedowned() {\n      var that = this, target = d3.event.target, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress();\n      d3_selection_interrupt.call(that);\n      zoomstarted(dispatch);\n      function moved() {\n        dragged = 1;\n        translateTo(d3.mouse(that), location0);\n        zoomed(dispatch);\n      }\n      function ended() {\n        subject.on(mousemove, null).on(mouseup, null);\n        dragRestore(dragged && d3.event.target === target);\n        zoomended(dispatch);\n      }\n    }\n    function touchstarted() {\n      var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = \".zoom-\" + d3.event.changedTouches[0].identifier, touchmove = \"touchmove\" + zoomName, touchend = \"touchend\" + zoomName, targets = [], subject = d3.select(that).on(mousedown, null).on(touchstart, started), dragRestore = d3_event_dragSuppress();\n      d3_selection_interrupt.call(that);\n      started();\n      zoomstarted(dispatch);\n      function relocate() {\n        var touches = d3.touches(that);\n        scale0 = view.k;\n        touches.forEach(function(t) {\n          if (t.identifier in locations0) locations0[t.identifier] = location(t);\n        });\n        return touches;\n      }\n      function started() {\n        var target = d3.event.target;\n        d3.select(target).on(touchmove, moved).on(touchend, ended);\n        targets.push(target);\n        var changed = d3.event.changedTouches;\n        for (var i = 0, n = changed.length; i < n; ++i) {\n          locations0[changed[i].identifier] = null;\n        }\n        var touches = relocate(), now = Date.now();\n        if (touches.length === 1) {\n          if (now - touchtime < 500) {\n            var p = touches[0], l = locations0[p.identifier];\n            scaleTo(view.k * 2);\n            translateTo(p, l);\n            d3_eventPreventDefault();\n            zoomed(dispatch);\n          }\n          touchtime = now;\n        } else if (touches.length > 1) {\n          var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1];\n          distance0 = dx * dx + dy * dy;\n        }\n      }\n      function moved() {\n        var touches = d3.touches(that), p0, l0, p1, l1;\n        for (var i = 0, n = touches.length; i < n; ++i, l1 = null) {\n          p1 = touches[i];\n          if (l1 = locations0[p1.identifier]) {\n            if (l0) break;\n            p0 = p1, l0 = l1;\n          }\n        }\n        if (l1) {\n          var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0);\n          p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];\n          l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];\n          scaleTo(scale1 * scale0);\n        }\n        touchtime = null;\n        translateTo(p0, l0);\n        zoomed(dispatch);\n      }\n      function ended() {\n        if (d3.event.touches.length) {\n          var changed = d3.event.changedTouches;\n          for (var i = 0, n = changed.length; i < n; ++i) {\n            delete locations0[changed[i].identifier];\n          }\n          for (var identifier in locations0) {\n            return void relocate();\n          }\n        }\n        d3.selectAll(targets).on(zoomName, null);\n        subject.on(mousedown, mousedowned).on(touchstart, touchstarted);\n        dragRestore();\n        zoomended(dispatch);\n      }\n    }\n    function mousewheeled() {\n      var dispatch = event.of(this, arguments);\n      if (mousewheelTimer) clearTimeout(mousewheelTimer); else translate0 = location(center0 = center || d3.mouse(this)),\n      d3_selection_interrupt.call(this), zoomstarted(dispatch);\n      mousewheelTimer = setTimeout(function() {\n        mousewheelTimer = null;\n        zoomended(dispatch);\n      }, 50);\n      d3_eventPreventDefault();\n      scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k);\n      translateTo(center0, translate0);\n      zoomed(dispatch);\n    }\n    function dblclicked() {\n      var dispatch = event.of(this, arguments), p = d3.mouse(this), l = location(p), k = Math.log(view.k) / Math.LN2;\n      zoomstarted(dispatch);\n      scaleTo(Math.pow(2, d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1));\n      translateTo(p, l);\n      zoomed(dispatch);\n      zoomended(dispatch);\n    }\n    return d3.rebind(zoom, event, \"on\");\n  };\n  var d3_behavior_zoomInfinity = [ 0, Infinity ];\n  var d3_behavior_zoomDelta, d3_behavior_zoomWheel = \"onwheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n    return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);\n  }, \"wheel\") : \"onmousewheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n    return d3.event.wheelDelta;\n  }, \"mousewheel\") : (d3_behavior_zoomDelta = function() {\n    return -d3.event.detail;\n  }, \"MozMousePixelScroll\");\n  d3.color = d3_color;\n  function d3_color() {}\n  d3_color.prototype.toString = function() {\n    return this.rgb() + \"\";\n  };\n  d3.hsl = d3_hsl;\n  function d3_hsl(h, s, l) {\n    return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse(\"\" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l);\n  }\n  var d3_hslPrototype = d3_hsl.prototype = new d3_color();\n  d3_hslPrototype.brighter = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_hsl(this.h, this.s, this.l / k);\n  };\n  d3_hslPrototype.darker = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_hsl(this.h, this.s, k * this.l);\n  };\n  d3_hslPrototype.rgb = function() {\n    return d3_hsl_rgb(this.h, this.s, this.l);\n  };\n  function d3_hsl_rgb(h, s, l) {\n    var m1, m2;\n    h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;\n    s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;\n    l = l < 0 ? 0 : l > 1 ? 1 : l;\n    m2 = l <= .5 ? l * (1 + s) : l + s - l * s;\n    m1 = 2 * l - m2;\n    function v(h) {\n      if (h > 360) h -= 360; else if (h < 0) h += 360;\n      if (h < 60) return m1 + (m2 - m1) * h / 60;\n      if (h < 180) return m2;\n      if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;\n      return m1;\n    }\n    function vv(h) {\n      return Math.round(v(h) * 255);\n    }\n    return new d3_rgb(vv(h + 120), vv(h), vv(h - 120));\n  }\n  d3.hcl = d3_hcl;\n  function d3_hcl(h, c, l) {\n    return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l);\n  }\n  var d3_hclPrototype = d3_hcl.prototype = new d3_color();\n  d3_hclPrototype.brighter = function(k) {\n    return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));\n  };\n  d3_hclPrototype.darker = function(k) {\n    return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));\n  };\n  d3_hclPrototype.rgb = function() {\n    return d3_hcl_lab(this.h, this.c, this.l).rgb();\n  };\n  function d3_hcl_lab(h, c, l) {\n    if (isNaN(h)) h = 0;\n    if (isNaN(c)) c = 0;\n    return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);\n  }\n  d3.lab = d3_lab;\n  function d3_lab(l, a, b) {\n    return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.l, l.c, l.h) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b);\n  }\n  var d3_lab_K = 18;\n  var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;\n  var d3_labPrototype = d3_lab.prototype = new d3_color();\n  d3_labPrototype.brighter = function(k) {\n    return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n  };\n  d3_labPrototype.darker = function(k) {\n    return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n  };\n  d3_labPrototype.rgb = function() {\n    return d3_lab_rgb(this.l, this.a, this.b);\n  };\n  function d3_lab_rgb(l, a, b) {\n    var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;\n    x = d3_lab_xyz(x) * d3_lab_X;\n    y = d3_lab_xyz(y) * d3_lab_Y;\n    z = d3_lab_xyz(z) * d3_lab_Z;\n    return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));\n  }\n  function d3_lab_hcl(l, a, b) {\n    return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l);\n  }\n  function d3_lab_xyz(x) {\n    return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;\n  }\n  function d3_xyz_lab(x) {\n    return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;\n  }\n  function d3_xyz_rgb(r) {\n    return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));\n  }\n  d3.rgb = d3_rgb;\n  function d3_rgb(r, g, b) {\n    return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse(\"\" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b);\n  }\n  function d3_rgbNumber(value) {\n    return new d3_rgb(value >> 16, value >> 8 & 255, value & 255);\n  }\n  function d3_rgbString(value) {\n    return d3_rgbNumber(value) + \"\";\n  }\n  var d3_rgbPrototype = d3_rgb.prototype = new d3_color();\n  d3_rgbPrototype.brighter = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    var r = this.r, g = this.g, b = this.b, i = 30;\n    if (!r && !g && !b) return new d3_rgb(i, i, i);\n    if (r && r < i) r = i;\n    if (g && g < i) g = i;\n    if (b && b < i) b = i;\n    return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k));\n  };\n  d3_rgbPrototype.darker = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_rgb(k * this.r, k * this.g, k * this.b);\n  };\n  d3_rgbPrototype.hsl = function() {\n    return d3_rgb_hsl(this.r, this.g, this.b);\n  };\n  d3_rgbPrototype.toString = function() {\n    return \"#\" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);\n  };\n  function d3_rgb_hex(v) {\n    return v < 16 ? \"0\" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);\n  }\n  function d3_rgb_parse(format, rgb, hsl) {\n    var r = 0, g = 0, b = 0, m1, m2, color;\n    m1 = /([a-z]+)\\((.*)\\)/i.exec(format);\n    if (m1) {\n      m2 = m1[2].split(\",\");\n      switch (m1[1]) {\n       case \"hsl\":\n        {\n          return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);\n        }\n\n       case \"rgb\":\n        {\n          return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));\n        }\n      }\n    }\n    if (color = d3_rgb_names.get(format)) return rgb(color.r, color.g, color.b);\n    if (format != null && format.charAt(0) === \"#\" && !isNaN(color = parseInt(format.substring(1), 16))) {\n      if (format.length === 4) {\n        r = (color & 3840) >> 4;\n        r = r >> 4 | r;\n        g = color & 240;\n        g = g >> 4 | g;\n        b = color & 15;\n        b = b << 4 | b;\n      } else if (format.length === 7) {\n        r = (color & 16711680) >> 16;\n        g = (color & 65280) >> 8;\n        b = color & 255;\n      }\n    }\n    return rgb(r, g, b);\n  }\n  function d3_rgb_hsl(r, g, b) {\n    var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;\n    if (d) {\n      s = l < .5 ? d / (max + min) : d / (2 - max - min);\n      if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;\n      h *= 60;\n    } else {\n      h = NaN;\n      s = l > 0 && l < 1 ? 0 : h;\n    }\n    return new d3_hsl(h, s, l);\n  }\n  function d3_rgb_lab(r, g, b) {\n    r = d3_rgb_xyz(r);\n    g = d3_rgb_xyz(g);\n    b = d3_rgb_xyz(b);\n    var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);\n    return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));\n  }\n  function d3_rgb_xyz(r) {\n    return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);\n  }\n  function d3_rgb_parseNumber(c) {\n    var f = parseFloat(c);\n    return c.charAt(c.length - 1) === \"%\" ? Math.round(f * 2.55) : f;\n  }\n  var d3_rgb_names = d3.map({\n    aliceblue: 15792383,\n    antiquewhite: 16444375,\n    aqua: 65535,\n    aquamarine: 8388564,\n    azure: 15794175,\n    beige: 16119260,\n    bisque: 16770244,\n    black: 0,\n    blanchedalmond: 16772045,\n    blue: 255,\n    blueviolet: 9055202,\n    brown: 10824234,\n    burlywood: 14596231,\n    cadetblue: 6266528,\n    chartreuse: 8388352,\n    chocolate: 13789470,\n    coral: 16744272,\n    cornflowerblue: 6591981,\n    cornsilk: 16775388,\n    crimson: 14423100,\n    cyan: 65535,\n    darkblue: 139,\n    darkcyan: 35723,\n    darkgoldenrod: 12092939,\n    darkgray: 11119017,\n    darkgreen: 25600,\n    darkgrey: 11119017,\n    darkkhaki: 12433259,\n    darkmagenta: 9109643,\n    darkolivegreen: 5597999,\n    darkorange: 16747520,\n    darkorchid: 10040012,\n    darkred: 9109504,\n    darksalmon: 15308410,\n    darkseagreen: 9419919,\n    darkslateblue: 4734347,\n    darkslategray: 3100495,\n    darkslategrey: 3100495,\n    darkturquoise: 52945,\n    darkviolet: 9699539,\n    deeppink: 16716947,\n    deepskyblue: 49151,\n    dimgray: 6908265,\n    dimgrey: 6908265,\n    dodgerblue: 2003199,\n    firebrick: 11674146,\n    floralwhite: 16775920,\n    forestgreen: 2263842,\n    fuchsia: 16711935,\n    gainsboro: 14474460,\n    ghostwhite: 16316671,\n    gold: 16766720,\n    goldenrod: 14329120,\n    gray: 8421504,\n    green: 32768,\n    greenyellow: 11403055,\n    grey: 8421504,\n    honeydew: 15794160,\n    hotpink: 16738740,\n    indianred: 13458524,\n    indigo: 4915330,\n    ivory: 16777200,\n    khaki: 15787660,\n    lavender: 15132410,\n    lavenderblush: 16773365,\n    lawngreen: 8190976,\n    lemonchiffon: 16775885,\n    lightblue: 11393254,\n    lightcoral: 15761536,\n    lightcyan: 14745599,\n    lightgoldenrodyellow: 16448210,\n    lightgray: 13882323,\n    lightgreen: 9498256,\n    lightgrey: 13882323,\n    lightpink: 16758465,\n    lightsalmon: 16752762,\n    lightseagreen: 2142890,\n    lightskyblue: 8900346,\n    lightslategray: 7833753,\n    lightslategrey: 7833753,\n    lightsteelblue: 11584734,\n    lightyellow: 16777184,\n    lime: 65280,\n    limegreen: 3329330,\n    linen: 16445670,\n    magenta: 16711935,\n    maroon: 8388608,\n    mediumaquamarine: 6737322,\n    mediumblue: 205,\n    mediumorchid: 12211667,\n    mediumpurple: 9662683,\n    mediumseagreen: 3978097,\n    mediumslateblue: 8087790,\n    mediumspringgreen: 64154,\n    mediumturquoise: 4772300,\n    mediumvioletred: 13047173,\n    midnightblue: 1644912,\n    mintcream: 16121850,\n    mistyrose: 16770273,\n    moccasin: 16770229,\n    navajowhite: 16768685,\n    navy: 128,\n    oldlace: 16643558,\n    olive: 8421376,\n    olivedrab: 7048739,\n    orange: 16753920,\n    orangered: 16729344,\n    orchid: 14315734,\n    palegoldenrod: 15657130,\n    palegreen: 10025880,\n    paleturquoise: 11529966,\n    palevioletred: 14381203,\n    papayawhip: 16773077,\n    peachpuff: 16767673,\n    peru: 13468991,\n    pink: 16761035,\n    plum: 14524637,\n    powderblue: 11591910,\n    purple: 8388736,\n    red: 16711680,\n    rosybrown: 12357519,\n    royalblue: 4286945,\n    saddlebrown: 9127187,\n    salmon: 16416882,\n    sandybrown: 16032864,\n    seagreen: 3050327,\n    seashell: 16774638,\n    sienna: 10506797,\n    silver: 12632256,\n    skyblue: 8900331,\n    slateblue: 6970061,\n    slategray: 7372944,\n    slategrey: 7372944,\n    snow: 16775930,\n    springgreen: 65407,\n    steelblue: 4620980,\n    tan: 13808780,\n    teal: 32896,\n    thistle: 14204888,\n    tomato: 16737095,\n    turquoise: 4251856,\n    violet: 15631086,\n    wheat: 16113331,\n    white: 16777215,\n    whitesmoke: 16119285,\n    yellow: 16776960,\n    yellowgreen: 10145074\n  });\n  d3_rgb_names.forEach(function(key, value) {\n    d3_rgb_names.set(key, d3_rgbNumber(value));\n  });\n  function d3_functor(v) {\n    return typeof v === \"function\" ? v : function() {\n      return v;\n    };\n  }\n  d3.functor = d3_functor;\n  function d3_identity(d) {\n    return d;\n  }\n  d3.xhr = d3_xhrType(d3_identity);\n  function d3_xhrType(response) {\n    return function(url, mimeType, callback) {\n      if (arguments.length === 2 && typeof mimeType === \"function\") callback = mimeType,\n      mimeType = null;\n      return d3_xhr(url, mimeType, response, callback);\n    };\n  }\n  function d3_xhr(url, mimeType, response, callback) {\n    var xhr = {}, dispatch = d3.dispatch(\"beforesend\", \"progress\", \"load\", \"error\"), headers = {}, request = new XMLHttpRequest(), responseType = null;\n    if (d3_window.XDomainRequest && !(\"withCredentials\" in request) && /^(http(s)?:)?\\/\\//.test(url)) request = new XDomainRequest();\n    \"onload\" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() {\n      request.readyState > 3 && respond();\n    };\n    function respond() {\n      var status = request.status, result;\n      if (!status && request.responseText || status >= 200 && status < 300 || status === 304) {\n        try {\n          result = response.call(xhr, request);\n        } catch (e) {\n          dispatch.error.call(xhr, e);\n          return;\n        }\n        dispatch.load.call(xhr, result);\n      } else {\n        dispatch.error.call(xhr, request);\n      }\n    }\n    request.onprogress = function(event) {\n      var o = d3.event;\n      d3.event = event;\n      try {\n        dispatch.progress.call(xhr, request);\n      } finally {\n        d3.event = o;\n      }\n    };\n    xhr.header = function(name, value) {\n      name = (name + \"\").toLowerCase();\n      if (arguments.length < 2) return headers[name];\n      if (value == null) delete headers[name]; else headers[name] = value + \"\";\n      return xhr;\n    };\n    xhr.mimeType = function(value) {\n      if (!arguments.length) return mimeType;\n      mimeType = value == null ? null : value + \"\";\n      return xhr;\n    };\n    xhr.responseType = function(value) {\n      if (!arguments.length) return responseType;\n      responseType = value;\n      return xhr;\n    };\n    xhr.response = function(value) {\n      response = value;\n      return xhr;\n    };\n    [ \"get\", \"post\" ].forEach(function(method) {\n      xhr[method] = function() {\n        return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments)));\n      };\n    });\n    xhr.send = function(method, data, callback) {\n      if (arguments.length === 2 && typeof data === \"function\") callback = data, data = null;\n      request.open(method, url, true);\n      if (mimeType != null && !(\"accept\" in headers)) headers[\"accept\"] = mimeType + \",*/*\";\n      if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);\n      if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);\n      if (responseType != null) request.responseType = responseType;\n      if (callback != null) xhr.on(\"error\", callback).on(\"load\", function(request) {\n        callback(null, request);\n      });\n      dispatch.beforesend.call(xhr, request);\n      request.send(data == null ? null : data);\n      return xhr;\n    };\n    xhr.abort = function() {\n      request.abort();\n      return xhr;\n    };\n    d3.rebind(xhr, dispatch, \"on\");\n    return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));\n  }\n  function d3_xhr_fixCallback(callback) {\n    return callback.length === 1 ? function(error, request) {\n      callback(error == null ? request : null);\n    } : callback;\n  }\n  d3.dsv = function(delimiter, mimeType) {\n    var reFormat = new RegExp('[\"' + delimiter + \"\\n]\"), delimiterCode = delimiter.charCodeAt(0);\n    function dsv(url, row, callback) {\n      if (arguments.length < 3) callback = row, row = null;\n      var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback);\n      xhr.row = function(_) {\n        return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row;\n      };\n      return xhr;\n    }\n    function response(request) {\n      return dsv.parse(request.responseText);\n    }\n    function typedResponse(f) {\n      return function(request) {\n        return dsv.parse(request.responseText, f);\n      };\n    }\n    dsv.parse = function(text, f) {\n      var o;\n      return dsv.parseRows(text, function(row, i) {\n        if (o) return o(row, i - 1);\n        var a = new Function(\"d\", \"return {\" + row.map(function(name, i) {\n          return JSON.stringify(name) + \": d[\" + i + \"]\";\n        }).join(\",\") + \"}\");\n        o = f ? function(row, i) {\n          return f(a(row), i);\n        } : a;\n      });\n    };\n    dsv.parseRows = function(text, f) {\n      var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;\n      function token() {\n        if (I >= N) return EOF;\n        if (eol) return eol = false, EOL;\n        var j = I;\n        if (text.charCodeAt(j) === 34) {\n          var i = j;\n          while (i++ < N) {\n            if (text.charCodeAt(i) === 34) {\n              if (text.charCodeAt(i + 1) !== 34) break;\n              ++i;\n            }\n          }\n          I = i + 2;\n          var c = text.charCodeAt(i + 1);\n          if (c === 13) {\n            eol = true;\n            if (text.charCodeAt(i + 2) === 10) ++I;\n          } else if (c === 10) {\n            eol = true;\n          }\n          return text.substring(j + 1, i).replace(/\"\"/g, '\"');\n        }\n        while (I < N) {\n          var c = text.charCodeAt(I++), k = 1;\n          if (c === 10) eol = true; else if (c === 13) {\n            eol = true;\n            if (text.charCodeAt(I) === 10) ++I, ++k;\n          } else if (c !== delimiterCode) continue;\n          return text.substring(j, I - k);\n        }\n        return text.substring(j);\n      }\n      while ((t = token()) !== EOF) {\n        var a = [];\n        while (t !== EOL && t !== EOF) {\n          a.push(t);\n          t = token();\n        }\n        if (f && !(a = f(a, n++))) continue;\n        rows.push(a);\n      }\n      return rows;\n    };\n    dsv.format = function(rows) {\n      if (Array.isArray(rows[0])) return dsv.formatRows(rows);\n      var fieldSet = new d3_Set(), fields = [];\n      rows.forEach(function(row) {\n        for (var field in row) {\n          if (!fieldSet.has(field)) {\n            fields.push(fieldSet.add(field));\n          }\n        }\n      });\n      return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) {\n        return fields.map(function(field) {\n          return formatValue(row[field]);\n        }).join(delimiter);\n      })).join(\"\\n\");\n    };\n    dsv.formatRows = function(rows) {\n      return rows.map(formatRow).join(\"\\n\");\n    };\n    function formatRow(row) {\n      return row.map(formatValue).join(delimiter);\n    }\n    function formatValue(text) {\n      return reFormat.test(text) ? '\"' + text.replace(/\\\"/g, '\"\"') + '\"' : text;\n    }\n    return dsv;\n  };\n  d3.csv = d3.dsv(\",\", \"text/csv\");\n  d3.tsv = d3.dsv(\"\t\", \"text/tab-separated-values\");\n  d3.touch = function(container, touches, identifier) {\n    if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches;\n    if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) {\n      if ((touch = touches[i]).identifier === identifier) {\n        return d3_mousePoint(container, touch);\n      }\n    }\n  };\n  var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_active, d3_timer_frame = d3_window[d3_vendorSymbol(d3_window, \"requestAnimationFrame\")] || function(callback) {\n    setTimeout(callback, 17);\n  };\n  d3.timer = function(callback, delay, then) {\n    var n = arguments.length;\n    if (n < 2) delay = 0;\n    if (n < 3) then = Date.now();\n    var time = then + delay, timer = {\n      c: callback,\n      t: time,\n      f: false,\n      n: null\n    };\n    if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer;\n    d3_timer_queueTail = timer;\n    if (!d3_timer_interval) {\n      d3_timer_timeout = clearTimeout(d3_timer_timeout);\n      d3_timer_interval = 1;\n      d3_timer_frame(d3_timer_step);\n    }\n  };\n  function d3_timer_step() {\n    var now = d3_timer_mark(), delay = d3_timer_sweep() - now;\n    if (delay > 24) {\n      if (isFinite(delay)) {\n        clearTimeout(d3_timer_timeout);\n        d3_timer_timeout = setTimeout(d3_timer_step, delay);\n      }\n      d3_timer_interval = 0;\n    } else {\n      d3_timer_interval = 1;\n      d3_timer_frame(d3_timer_step);\n    }\n  }\n  d3.timer.flush = function() {\n    d3_timer_mark();\n    d3_timer_sweep();\n  };\n  function d3_timer_mark() {\n    var now = Date.now();\n    d3_timer_active = d3_timer_queueHead;\n    while (d3_timer_active) {\n      if (now >= d3_timer_active.t) d3_timer_active.f = d3_timer_active.c(now - d3_timer_active.t);\n      d3_timer_active = d3_timer_active.n;\n    }\n    return now;\n  }\n  function d3_timer_sweep() {\n    var t0, t1 = d3_timer_queueHead, time = Infinity;\n    while (t1) {\n      if (t1.f) {\n        t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;\n      } else {\n        if (t1.t < time) time = t1.t;\n        t1 = (t0 = t1).n;\n      }\n    }\n    d3_timer_queueTail = t0;\n    return time;\n  }\n  function d3_format_precision(x, p) {\n    return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);\n  }\n  d3.round = function(x, n) {\n    return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);\n  };\n  var d3_formatPrefixes = [ \"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\" ].map(d3_formatPrefix);\n  d3.formatPrefix = function(value, precision) {\n    var i = 0;\n    if (value) {\n      if (value < 0) value *= -1;\n      if (precision) value = d3.round(value, d3_format_precision(value, precision));\n      i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);\n      i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3));\n    }\n    return d3_formatPrefixes[8 + i / 3];\n  };\n  function d3_formatPrefix(d, i) {\n    var k = Math.pow(10, abs(8 - i) * 3);\n    return {\n      scale: i > 8 ? function(d) {\n        return d / k;\n      } : function(d) {\n        return d * k;\n      },\n      symbol: d\n    };\n  }\n  function d3_locale_numberFormat(locale) {\n    var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping ? function(value) {\n      var i = value.length, t = [], j = 0, g = locale_grouping[0];\n      while (i > 0 && g > 0) {\n        t.push(value.substring(i -= g, i + g));\n        g = locale_grouping[j = (j + 1) % locale_grouping.length];\n      }\n      return t.reverse().join(locale_thousands);\n    } : d3_identity;\n    return function(specifier) {\n      var match = d3_format_re.exec(specifier), fill = match[1] || \" \", align = match[2] || \">\", sign = match[3] || \"\", symbol = match[4] || \"\", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = \"\", suffix = \"\", integer = false;\n      if (precision) precision = +precision.substring(1);\n      if (zfill || fill === \"0\" && align === \"=\") {\n        zfill = fill = \"0\";\n        align = \"=\";\n        if (comma) width -= Math.floor((width - 1) / 4);\n      }\n      switch (type) {\n       case \"n\":\n        comma = true;\n        type = \"g\";\n        break;\n\n       case \"%\":\n        scale = 100;\n        suffix = \"%\";\n        type = \"f\";\n        break;\n\n       case \"p\":\n        scale = 100;\n        suffix = \"%\";\n        type = \"r\";\n        break;\n\n       case \"b\":\n       case \"o\":\n       case \"x\":\n       case \"X\":\n        if (symbol === \"#\") prefix = \"0\" + type.toLowerCase();\n\n       case \"c\":\n       case \"d\":\n        integer = true;\n        precision = 0;\n        break;\n\n       case \"s\":\n        scale = -1;\n        type = \"r\";\n        break;\n      }\n      if (symbol === \"$\") prefix = locale_currency[0], suffix = locale_currency[1];\n      if (type == \"r\" && !precision) type = \"g\";\n      if (precision != null) {\n        if (type == \"g\") precision = Math.max(1, Math.min(21, precision)); else if (type == \"e\" || type == \"f\") precision = Math.max(0, Math.min(20, precision));\n      }\n      type = d3_format_types.get(type) || d3_format_typeDefault;\n      var zcomma = zfill && comma;\n      return function(value) {\n        var fullSuffix = suffix;\n        if (integer && value % 1) return \"\";\n        var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, \"-\") : sign;\n        if (scale < 0) {\n          var unit = d3.formatPrefix(value, precision);\n          value = unit.scale(value);\n          fullSuffix = unit.symbol + suffix;\n        } else {\n          value *= scale;\n        }\n        value = type(value, precision);\n        var i = value.lastIndexOf(\".\"), before = i < 0 ? value : value.substring(0, i), after = i < 0 ? \"\" : locale_decimal + value.substring(i + 1);\n        if (!zfill && comma) before = formatGroup(before);\n        var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : \"\";\n        if (zcomma) before = formatGroup(padding + before);\n        negative += prefix;\n        value = before + after;\n        return (align === \"<\" ? negative + value + padding : align === \">\" ? padding + negative + value : align === \"^\" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix;\n      };\n    };\n  }\n  var d3_format_re = /(?:([^{])?([<>=^]))?([+\\- ])?([$#])?(0)?(\\d+)?(,)?(\\.-?\\d+)?([a-z%])?/i;\n  var d3_format_types = d3.map({\n    b: function(x) {\n      return x.toString(2);\n    },\n    c: function(x) {\n      return String.fromCharCode(x);\n    },\n    o: function(x) {\n      return x.toString(8);\n    },\n    x: function(x) {\n      return x.toString(16);\n    },\n    X: function(x) {\n      return x.toString(16).toUpperCase();\n    },\n    g: function(x, p) {\n      return x.toPrecision(p);\n    },\n    e: function(x, p) {\n      return x.toExponential(p);\n    },\n    f: function(x, p) {\n      return x.toFixed(p);\n    },\n    r: function(x, p) {\n      return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));\n    }\n  });\n  function d3_format_typeDefault(x) {\n    return x + \"\";\n  }\n  var d3_time = d3.time = {}, d3_date = Date;\n  function d3_date_utc() {\n    this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);\n  }\n  d3_date_utc.prototype = {\n    getDate: function() {\n      return this._.getUTCDate();\n    },\n    getDay: function() {\n      return this._.getUTCDay();\n    },\n    getFullYear: function() {\n      return this._.getUTCFullYear();\n    },\n    getHours: function() {\n      return this._.getUTCHours();\n    },\n    getMilliseconds: function() {\n      return this._.getUTCMilliseconds();\n    },\n    getMinutes: function() {\n      return this._.getUTCMinutes();\n    },\n    getMonth: function() {\n      return this._.getUTCMonth();\n    },\n    getSeconds: function() {\n      return this._.getUTCSeconds();\n    },\n    getTime: function() {\n      return this._.getTime();\n    },\n    getTimezoneOffset: function() {\n      return 0;\n    },\n    valueOf: function() {\n      return this._.valueOf();\n    },\n    setDate: function() {\n      d3_time_prototype.setUTCDate.apply(this._, arguments);\n    },\n    setDay: function() {\n      d3_time_prototype.setUTCDay.apply(this._, arguments);\n    },\n    setFullYear: function() {\n      d3_time_prototype.setUTCFullYear.apply(this._, arguments);\n    },\n    setHours: function() {\n      d3_time_prototype.setUTCHours.apply(this._, arguments);\n    },\n    setMilliseconds: function() {\n      d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);\n    },\n    setMinutes: function() {\n      d3_time_prototype.setUTCMinutes.apply(this._, arguments);\n    },\n    setMonth: function() {\n      d3_time_prototype.setUTCMonth.apply(this._, arguments);\n    },\n    setSeconds: function() {\n      d3_time_prototype.setUTCSeconds.apply(this._, arguments);\n    },\n    setTime: function() {\n      d3_time_prototype.setTime.apply(this._, arguments);\n    }\n  };\n  var d3_time_prototype = Date.prototype;\n  function d3_time_interval(local, step, number) {\n    function round(date) {\n      var d0 = local(date), d1 = offset(d0, 1);\n      return date - d0 < d1 - date ? d0 : d1;\n    }\n    function ceil(date) {\n      step(date = local(new d3_date(date - 1)), 1);\n      return date;\n    }\n    function offset(date, k) {\n      step(date = new d3_date(+date), k);\n      return date;\n    }\n    function range(t0, t1, dt) {\n      var time = ceil(t0), times = [];\n      if (dt > 1) {\n        while (time < t1) {\n          if (!(number(time) % dt)) times.push(new Date(+time));\n          step(time, 1);\n        }\n      } else {\n        while (time < t1) times.push(new Date(+time)), step(time, 1);\n      }\n      return times;\n    }\n    function range_utc(t0, t1, dt) {\n      try {\n        d3_date = d3_date_utc;\n        var utc = new d3_date_utc();\n        utc._ = t0;\n        return range(utc, t1, dt);\n      } finally {\n        d3_date = Date;\n      }\n    }\n    local.floor = local;\n    local.round = round;\n    local.ceil = ceil;\n    local.offset = offset;\n    local.range = range;\n    var utc = local.utc = d3_time_interval_utc(local);\n    utc.floor = utc;\n    utc.round = d3_time_interval_utc(round);\n    utc.ceil = d3_time_interval_utc(ceil);\n    utc.offset = d3_time_interval_utc(offset);\n    utc.range = range_utc;\n    return local;\n  }\n  function d3_time_interval_utc(method) {\n    return function(date, k) {\n      try {\n        d3_date = d3_date_utc;\n        var utc = new d3_date_utc();\n        utc._ = date;\n        return method(utc, k)._;\n      } finally {\n        d3_date = Date;\n      }\n    };\n  }\n  d3_time.year = d3_time_interval(function(date) {\n    date = d3_time.day(date);\n    date.setMonth(0, 1);\n    return date;\n  }, function(date, offset) {\n    date.setFullYear(date.getFullYear() + offset);\n  }, function(date) {\n    return date.getFullYear();\n  });\n  d3_time.years = d3_time.year.range;\n  d3_time.years.utc = d3_time.year.utc.range;\n  d3_time.day = d3_time_interval(function(date) {\n    var day = new d3_date(2e3, 0);\n    day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n    return day;\n  }, function(date, offset) {\n    date.setDate(date.getDate() + offset);\n  }, function(date) {\n    return date.getDate() - 1;\n  });\n  d3_time.days = d3_time.day.range;\n  d3_time.days.utc = d3_time.day.utc.range;\n  d3_time.dayOfYear = function(date) {\n    var year = d3_time.year(date);\n    return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);\n  };\n  [ \"sunday\", \"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\", \"saturday\" ].forEach(function(day, i) {\n    i = 7 - i;\n    var interval = d3_time[day] = d3_time_interval(function(date) {\n      (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);\n      return date;\n    }, function(date, offset) {\n      date.setDate(date.getDate() + Math.floor(offset) * 7);\n    }, function(date) {\n      var day = d3_time.year(date).getDay();\n      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);\n    });\n    d3_time[day + \"s\"] = interval.range;\n    d3_time[day + \"s\"].utc = interval.utc.range;\n    d3_time[day + \"OfYear\"] = function(date) {\n      var day = d3_time.year(date).getDay();\n      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7);\n    };\n  });\n  d3_time.week = d3_time.sunday;\n  d3_time.weeks = d3_time.sunday.range;\n  d3_time.weeks.utc = d3_time.sunday.utc.range;\n  d3_time.weekOfYear = d3_time.sundayOfYear;\n  function d3_locale_timeFormat(locale) {\n    var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;\n    function d3_time_format(template) {\n      var n = template.length;\n      function format(date) {\n        var string = [], i = -1, j = 0, c, p, f;\n        while (++i < n) {\n          if (template.charCodeAt(i) === 37) {\n            string.push(template.substring(j, i));\n            if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);\n            if (f = d3_time_formats[c]) c = f(date, p == null ? c === \"e\" ? \" \" : \"0\" : p);\n            string.push(c);\n            j = i + 1;\n          }\n        }\n        string.push(template.substring(j, i));\n        return string.join(\"\");\n      }\n      format.parse = function(string) {\n        var d = {\n          y: 1900,\n          m: 0,\n          d: 1,\n          H: 0,\n          M: 0,\n          S: 0,\n          L: 0,\n          Z: null\n        }, i = d3_time_parse(d, template, string, 0);\n        if (i != string.length) return null;\n        if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n        var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();\n        if (\"j\" in d) date.setFullYear(d.y, 0, d.j); else if (\"w\" in d && (\"W\" in d || \"U\" in d)) {\n          date.setFullYear(d.y, 0, 1);\n          date.setFullYear(d.y, 0, \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);\n        } else date.setFullYear(d.y, d.m, d.d);\n        date.setHours(d.H + Math.floor(d.Z / 100), d.M + d.Z % 100, d.S, d.L);\n        return localZ ? date._ : date;\n      };\n      format.toString = function() {\n        return template;\n      };\n      return format;\n    }\n    function d3_time_parse(date, template, string, j) {\n      var c, p, t, i = 0, n = template.length, m = string.length;\n      while (i < n) {\n        if (j >= m) return -1;\n        c = template.charCodeAt(i++);\n        if (c === 37) {\n          t = template.charAt(i++);\n          p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];\n          if (!p || (j = p(date, string, j)) < 0) return -1;\n        } else if (c != string.charCodeAt(j++)) {\n          return -1;\n        }\n      }\n      return j;\n    }\n    d3_time_format.utc = function(template) {\n      var local = d3_time_format(template);\n      function format(date) {\n        try {\n          d3_date = d3_date_utc;\n          var utc = new d3_date();\n          utc._ = date;\n          return local(utc);\n        } finally {\n          d3_date = Date;\n        }\n      }\n      format.parse = function(string) {\n        try {\n          d3_date = d3_date_utc;\n          var date = local.parse(string);\n          return date && date._;\n        } finally {\n          d3_date = Date;\n        }\n      };\n      format.toString = local.toString;\n      return format;\n    };\n    d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti;\n    var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths);\n    locale_periods.forEach(function(p, i) {\n      d3_time_periodLookup.set(p.toLowerCase(), i);\n    });\n    var d3_time_formats = {\n      a: function(d) {\n        return locale_shortDays[d.getDay()];\n      },\n      A: function(d) {\n        return locale_days[d.getDay()];\n      },\n      b: function(d) {\n        return locale_shortMonths[d.getMonth()];\n      },\n      B: function(d) {\n        return locale_months[d.getMonth()];\n      },\n      c: d3_time_format(locale_dateTime),\n      d: function(d, p) {\n        return d3_time_formatPad(d.getDate(), p, 2);\n      },\n      e: function(d, p) {\n        return d3_time_formatPad(d.getDate(), p, 2);\n      },\n      H: function(d, p) {\n        return d3_time_formatPad(d.getHours(), p, 2);\n      },\n      I: function(d, p) {\n        return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);\n      },\n      j: function(d, p) {\n        return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3);\n      },\n      L: function(d, p) {\n        return d3_time_formatPad(d.getMilliseconds(), p, 3);\n      },\n      m: function(d, p) {\n        return d3_time_formatPad(d.getMonth() + 1, p, 2);\n      },\n      M: function(d, p) {\n        return d3_time_formatPad(d.getMinutes(), p, 2);\n      },\n      p: function(d) {\n        return locale_periods[+(d.getHours() >= 12)];\n      },\n      S: function(d, p) {\n        return d3_time_formatPad(d.getSeconds(), p, 2);\n      },\n      U: function(d, p) {\n        return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2);\n      },\n      w: function(d) {\n        return d.getDay();\n      },\n      W: function(d, p) {\n        return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2);\n      },\n      x: d3_time_format(locale_date),\n      X: d3_time_format(locale_time),\n      y: function(d, p) {\n        return d3_time_formatPad(d.getFullYear() % 100, p, 2);\n      },\n      Y: function(d, p) {\n        return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);\n      },\n      Z: d3_time_zone,\n      \"%\": function() {\n        return \"%\";\n      }\n    };\n    var d3_time_parsers = {\n      a: d3_time_parseWeekdayAbbrev,\n      A: d3_time_parseWeekday,\n      b: d3_time_parseMonthAbbrev,\n      B: d3_time_parseMonth,\n      c: d3_time_parseLocaleFull,\n      d: d3_time_parseDay,\n      e: d3_time_parseDay,\n      H: d3_time_parseHour24,\n      I: d3_time_parseHour24,\n      j: d3_time_parseDayOfYear,\n      L: d3_time_parseMilliseconds,\n      m: d3_time_parseMonthNumber,\n      M: d3_time_parseMinutes,\n      p: d3_time_parseAmPm,\n      S: d3_time_parseSeconds,\n      U: d3_time_parseWeekNumberSunday,\n      w: d3_time_parseWeekdayNumber,\n      W: d3_time_parseWeekNumberMonday,\n      x: d3_time_parseLocaleDate,\n      X: d3_time_parseLocaleTime,\n      y: d3_time_parseYear,\n      Y: d3_time_parseFullYear,\n      Z: d3_time_parseZone,\n      \"%\": d3_time_parseLiteralPercent\n    };\n    function d3_time_parseWeekdayAbbrev(date, string, i) {\n      d3_time_dayAbbrevRe.lastIndex = 0;\n      var n = d3_time_dayAbbrevRe.exec(string.substring(i));\n      return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseWeekday(date, string, i) {\n      d3_time_dayRe.lastIndex = 0;\n      var n = d3_time_dayRe.exec(string.substring(i));\n      return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseMonthAbbrev(date, string, i) {\n      d3_time_monthAbbrevRe.lastIndex = 0;\n      var n = d3_time_monthAbbrevRe.exec(string.substring(i));\n      return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseMonth(date, string, i) {\n      d3_time_monthRe.lastIndex = 0;\n      var n = d3_time_monthRe.exec(string.substring(i));\n      return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseLocaleFull(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.c.toString(), string, i);\n    }\n    function d3_time_parseLocaleDate(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.x.toString(), string, i);\n    }\n    function d3_time_parseLocaleTime(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.X.toString(), string, i);\n    }\n    function d3_time_parseAmPm(date, string, i) {\n      var n = d3_time_periodLookup.get(string.substring(i, i += 2).toLowerCase());\n      return n == null ? -1 : (date.p = n, i);\n    }\n    return d3_time_format;\n  }\n  var d3_time_formatPads = {\n    \"-\": \"\",\n    _: \" \",\n    \"0\": \"0\"\n  }, d3_time_numberRe = /^\\s*\\d+/, d3_time_percentRe = /^%/;\n  function d3_time_formatPad(value, fill, width) {\n    var sign = value < 0 ? \"-\" : \"\", string = (sign ? -value : value) + \"\", length = string.length;\n    return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n  }\n  function d3_time_formatRe(names) {\n    return new RegExp(\"^(?:\" + names.map(d3.requote).join(\"|\") + \")\", \"i\");\n  }\n  function d3_time_formatLookup(names) {\n    var map = new d3_Map(), i = -1, n = names.length;\n    while (++i < n) map.set(names[i].toLowerCase(), i);\n    return map;\n  }\n  function d3_time_parseWeekdayNumber(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 1));\n    return n ? (date.w = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekNumberSunday(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i));\n    return n ? (date.U = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekNumberMonday(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i));\n    return n ? (date.W = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseFullYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 4));\n    return n ? (date.y = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n    return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;\n  }\n  function d3_time_parseZone(date, string, i) {\n    return /^[+-]\\d{4}$/.test(string = string.substring(i, i + 5)) ? (date.Z = -string,\n    i + 5) : -1;\n  }\n  function d3_time_expandYear(d) {\n    return d + (d > 68 ? 1900 : 2e3);\n  }\n  function d3_time_parseMonthNumber(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n    return n ? (date.m = n[0] - 1, i + n[0].length) : -1;\n  }\n  function d3_time_parseDay(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n    return n ? (date.d = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseDayOfYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 3));\n    return n ? (date.j = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseHour24(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n    return n ? (date.H = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseMinutes(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n    return n ? (date.M = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseSeconds(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 2));\n    return n ? (date.S = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseMilliseconds(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.substring(i, i + 3));\n    return n ? (date.L = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_zone(d) {\n    var z = d.getTimezoneOffset(), zs = z > 0 ? \"-\" : \"+\", zh = ~~(abs(z) / 60), zm = abs(z) % 60;\n    return zs + d3_time_formatPad(zh, \"0\", 2) + d3_time_formatPad(zm, \"0\", 2);\n  }\n  function d3_time_parseLiteralPercent(date, string, i) {\n    d3_time_percentRe.lastIndex = 0;\n    var n = d3_time_percentRe.exec(string.substring(i, i + 1));\n    return n ? i + n[0].length : -1;\n  }\n  function d3_time_formatMulti(formats) {\n    var n = formats.length, i = -1;\n    while (++i < n) formats[i][0] = this(formats[i][0]);\n    return function(date) {\n      var i = 0, f = formats[i];\n      while (!f[1](date)) f = formats[++i];\n      return f[0](date);\n    };\n  }\n  d3.locale = function(locale) {\n    return {\n      numberFormat: d3_locale_numberFormat(locale),\n      timeFormat: d3_locale_timeFormat(locale)\n    };\n  };\n  var d3_locale_enUS = d3.locale({\n    decimal: \".\",\n    thousands: \",\",\n    grouping: [ 3 ],\n    currency: [ \"$\", \"\" ],\n    dateTime: \"%a %b %e %X %Y\",\n    date: \"%m/%d/%Y\",\n    time: \"%H:%M:%S\",\n    periods: [ \"AM\", \"PM\" ],\n    days: [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ],\n    shortDays: [ \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" ],\n    months: [ \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\" ],\n    shortMonths: [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ]\n  });\n  d3.format = d3_locale_enUS.numberFormat;\n  d3.geo = {};\n  function d3_adder() {}\n  d3_adder.prototype = {\n    s: 0,\n    t: 0,\n    add: function(y) {\n      d3_adderSum(y, this.t, d3_adderTemp);\n      d3_adderSum(d3_adderTemp.s, this.s, this);\n      if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t;\n    },\n    reset: function() {\n      this.s = this.t = 0;\n    },\n    valueOf: function() {\n      return this.s;\n    }\n  };\n  var d3_adderTemp = new d3_adder();\n  function d3_adderSum(a, b, o) {\n    var x = o.s = a + b, bv = x - a, av = x - bv;\n    o.t = a - av + (b - bv);\n  }\n  d3.geo.stream = function(object, listener) {\n    if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {\n      d3_geo_streamObjectType[object.type](object, listener);\n    } else {\n      d3_geo_streamGeometry(object, listener);\n    }\n  };\n  function d3_geo_streamGeometry(geometry, listener) {\n    if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {\n      d3_geo_streamGeometryType[geometry.type](geometry, listener);\n    }\n  }\n  var d3_geo_streamObjectType = {\n    Feature: function(feature, listener) {\n      d3_geo_streamGeometry(feature.geometry, listener);\n    },\n    FeatureCollection: function(object, listener) {\n      var features = object.features, i = -1, n = features.length;\n      while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);\n    }\n  };\n  var d3_geo_streamGeometryType = {\n    Sphere: function(object, listener) {\n      listener.sphere();\n    },\n    Point: function(object, listener) {\n      object = object.coordinates;\n      listener.point(object[0], object[1], object[2]);\n    },\n    MultiPoint: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]);\n    },\n    LineString: function(object, listener) {\n      d3_geo_streamLine(object.coordinates, listener, 0);\n    },\n    MultiLineString: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);\n    },\n    Polygon: function(object, listener) {\n      d3_geo_streamPolygon(object.coordinates, listener);\n    },\n    MultiPolygon: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);\n    },\n    GeometryCollection: function(object, listener) {\n      var geometries = object.geometries, i = -1, n = geometries.length;\n      while (++i < n) d3_geo_streamGeometry(geometries[i], listener);\n    }\n  };\n  function d3_geo_streamLine(coordinates, listener, closed) {\n    var i = -1, n = coordinates.length - closed, coordinate;\n    listener.lineStart();\n    while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]);\n    listener.lineEnd();\n  }\n  function d3_geo_streamPolygon(coordinates, listener) {\n    var i = -1, n = coordinates.length;\n    listener.polygonStart();\n    while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);\n    listener.polygonEnd();\n  }\n  d3.geo.area = function(object) {\n    d3_geo_areaSum = 0;\n    d3.geo.stream(object, d3_geo_area);\n    return d3_geo_areaSum;\n  };\n  var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder();\n  var d3_geo_area = {\n    sphere: function() {\n      d3_geo_areaSum += 4 * π;\n    },\n    point: d3_noop,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: function() {\n      d3_geo_areaRingSum.reset();\n      d3_geo_area.lineStart = d3_geo_areaRingStart;\n    },\n    polygonEnd: function() {\n      var area = 2 * d3_geo_areaRingSum;\n      d3_geo_areaSum += area < 0 ? 4 * π + area : area;\n      d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;\n    }\n  };\n  function d3_geo_areaRingStart() {\n    var λ00, φ00, λ0, cosφ0, sinφ0;\n    d3_geo_area.point = function(λ, φ) {\n      d3_geo_area.point = nextPoint;\n      λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4),\n      sinφ0 = Math.sin(φ);\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      φ = φ * d3_radians / 2 + π / 4;\n      var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ);\n      d3_geo_areaRingSum.add(Math.atan2(v, u));\n      λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;\n    }\n    d3_geo_area.lineEnd = function() {\n      nextPoint(λ00, φ00);\n    };\n  }\n  function d3_geo_cartesian(spherical) {\n    var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ);\n    return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ];\n  }\n  function d3_geo_cartesianDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n  }\n  function d3_geo_cartesianCross(a, b) {\n    return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ];\n  }\n  function d3_geo_cartesianAdd(a, b) {\n    a[0] += b[0];\n    a[1] += b[1];\n    a[2] += b[2];\n  }\n  function d3_geo_cartesianScale(vector, k) {\n    return [ vector[0] * k, vector[1] * k, vector[2] * k ];\n  }\n  function d3_geo_cartesianNormalize(d) {\n    var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n    d[0] /= l;\n    d[1] /= l;\n    d[2] /= l;\n  }\n  function d3_geo_spherical(cartesian) {\n    return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ];\n  }\n  function d3_geo_sphericalEqual(a, b) {\n    return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;\n  }\n  d3.geo.bounds = function() {\n    var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range;\n    var bound = {\n      point: point,\n      lineStart: lineStart,\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        bound.point = ringPoint;\n        bound.lineStart = ringStart;\n        bound.lineEnd = ringEnd;\n        dλSum = 0;\n        d3_geo_area.polygonStart();\n      },\n      polygonEnd: function() {\n        d3_geo_area.polygonEnd();\n        bound.point = point;\n        bound.lineStart = lineStart;\n        bound.lineEnd = lineEnd;\n        if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90;\n        range[0] = λ0, range[1] = λ1;\n      }\n    };\n    function point(λ, φ) {\n      ranges.push(range = [ λ0 = λ, λ1 = λ ]);\n      if (φ < φ0) φ0 = φ;\n      if (φ > φ1) φ1 = φ;\n    }\n    function linePoint(λ, φ) {\n      var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]);\n      if (p0) {\n        var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal);\n        d3_geo_cartesianNormalize(inflection);\n        inflection = d3_geo_spherical(inflection);\n        var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180;\n        if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n          var φi = inflection[1] * d3_degrees;\n          if (φi > φ1) φ1 = φi;\n        } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n          var φi = -inflection[1] * d3_degrees;\n          if (φi < φ0) φ0 = φi;\n        } else {\n          if (φ < φ0) φ0 = φ;\n          if (φ > φ1) φ1 = φ;\n        }\n        if (antimeridian) {\n          if (λ < λ_) {\n            if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n          } else {\n            if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n          }\n        } else {\n          if (λ1 >= λ0) {\n            if (λ < λ0) λ0 = λ;\n            if (λ > λ1) λ1 = λ;\n          } else {\n            if (λ > λ_) {\n              if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n            } else {\n              if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n            }\n          }\n        }\n      } else {\n        point(λ, φ);\n      }\n      p0 = p, λ_ = λ;\n    }\n    function lineStart() {\n      bound.point = linePoint;\n    }\n    function lineEnd() {\n      range[0] = λ0, range[1] = λ1;\n      bound.point = point;\n      p0 = null;\n    }\n    function ringPoint(λ, φ) {\n      if (p0) {\n        var dλ = λ - λ_;\n        dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;\n      } else λ__ = λ, φ__ = φ;\n      d3_geo_area.point(λ, φ);\n      linePoint(λ, φ);\n    }\n    function ringStart() {\n      d3_geo_area.lineStart();\n    }\n    function ringEnd() {\n      ringPoint(λ__, φ__);\n      d3_geo_area.lineEnd();\n      if (abs(dλSum) > ε) λ0 = -(λ1 = 180);\n      range[0] = λ0, range[1] = λ1;\n      p0 = null;\n    }\n    function angle(λ0, λ1) {\n      return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1;\n    }\n    function compareRanges(a, b) {\n      return a[0] - b[0];\n    }\n    function withinRange(x, range) {\n      return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n    }\n    return function(feature) {\n      φ1 = λ1 = -(λ0 = φ0 = Infinity);\n      ranges = [];\n      d3.geo.stream(feature, bound);\n      var n = ranges.length;\n      if (n) {\n        ranges.sort(compareRanges);\n        for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {\n          b = ranges[i];\n          if (withinRange(b[0], a) || withinRange(b[1], a)) {\n            if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n            if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n          } else {\n            merged.push(a = b);\n          }\n        }\n        var best = -Infinity, dλ;\n        for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {\n          b = merged[i];\n          if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];\n        }\n      }\n      ranges = range = null;\n      return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];\n    };\n  }();\n  d3.geo.centroid = function(object) {\n    d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n    d3.geo.stream(object, d3_geo_centroid);\n    var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z;\n    if (m < ε2) {\n      x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1;\n      if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0;\n      m = x * x + y * y + z * z;\n      if (m < ε2) return [ NaN, NaN ];\n    }\n    return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ];\n  };\n  var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2;\n  var d3_geo_centroid = {\n    sphere: d3_noop,\n    point: d3_geo_centroidPoint,\n    lineStart: d3_geo_centroidLineStart,\n    lineEnd: d3_geo_centroidLineEnd,\n    polygonStart: function() {\n      d3_geo_centroid.lineStart = d3_geo_centroidRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_centroid.lineStart = d3_geo_centroidLineStart;\n    }\n  };\n  function d3_geo_centroidPoint(λ, φ) {\n    λ *= d3_radians;\n    var cosφ = Math.cos(φ *= d3_radians);\n    d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ));\n  }\n  function d3_geo_centroidPointXYZ(x, y, z) {\n    ++d3_geo_centroidW0;\n    d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0;\n    d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0;\n    d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0;\n  }\n  function d3_geo_centroidLineStart() {\n    var x0, y0, z0;\n    d3_geo_centroid.point = function(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians);\n      x0 = cosφ * Math.cos(λ);\n      y0 = cosφ * Math.sin(λ);\n      z0 = Math.sin(φ);\n      d3_geo_centroid.point = nextPoint;\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);\n      d3_geo_centroidW1 += w;\n      d3_geo_centroidX1 += w * (x0 + (x0 = x));\n      d3_geo_centroidY1 += w * (y0 + (y0 = y));\n      d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    }\n  }\n  function d3_geo_centroidLineEnd() {\n    d3_geo_centroid.point = d3_geo_centroidPoint;\n  }\n  function d3_geo_centroidRingStart() {\n    var λ00, φ00, x0, y0, z0;\n    d3_geo_centroid.point = function(λ, φ) {\n      λ00 = λ, φ00 = φ;\n      d3_geo_centroid.point = nextPoint;\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians);\n      x0 = cosφ * Math.cos(λ);\n      y0 = cosφ * Math.sin(λ);\n      z0 = Math.sin(φ);\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    };\n    d3_geo_centroid.lineEnd = function() {\n      nextPoint(λ00, φ00);\n      d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;\n      d3_geo_centroid.point = d3_geo_centroidPoint;\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u);\n      d3_geo_centroidX2 += v * cx;\n      d3_geo_centroidY2 += v * cy;\n      d3_geo_centroidZ2 += v * cz;\n      d3_geo_centroidW1 += w;\n      d3_geo_centroidX1 += w * (x0 + (x0 = x));\n      d3_geo_centroidY1 += w * (y0 + (y0 = y));\n      d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    }\n  }\n  function d3_true() {\n    return true;\n  }\n  function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) {\n    var subject = [], clip = [];\n    segments.forEach(function(segment) {\n      if ((n = segment.length - 1) <= 0) return;\n      var n, p0 = segment[0], p1 = segment[n];\n      if (d3_geo_sphericalEqual(p0, p1)) {\n        listener.lineStart();\n        for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);\n        listener.lineEnd();\n        return;\n      }\n      var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false);\n      a.o = b;\n      subject.push(a);\n      clip.push(b);\n      a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);\n      b = new d3_geo_clipPolygonIntersection(p1, null, a, true);\n      a.o = b;\n      subject.push(a);\n      clip.push(b);\n    });\n    clip.sort(compare);\n    d3_geo_clipPolygonLinkCircular(subject);\n    d3_geo_clipPolygonLinkCircular(clip);\n    if (!subject.length) return;\n    for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {\n      clip[i].e = entry = !entry;\n    }\n    var start = subject[0], points, point;\n    while (1) {\n      var current = start, isSubject = true;\n      while (current.v) if ((current = current.n) === start) return;\n      points = current.z;\n      listener.lineStart();\n      do {\n        current.v = current.o.v = true;\n        if (current.e) {\n          if (isSubject) {\n            for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);\n          } else {\n            interpolate(current.x, current.n.x, 1, listener);\n          }\n          current = current.n;\n        } else {\n          if (isSubject) {\n            points = current.p.z;\n            for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);\n          } else {\n            interpolate(current.x, current.p.x, -1, listener);\n          }\n          current = current.p;\n        }\n        current = current.o;\n        points = current.z;\n        isSubject = !isSubject;\n      } while (!current.v);\n      listener.lineEnd();\n    }\n  }\n  function d3_geo_clipPolygonLinkCircular(array) {\n    if (!(n = array.length)) return;\n    var n, i = 0, a = array[0], b;\n    while (++i < n) {\n      a.n = b = array[i];\n      b.p = a;\n      a = b;\n    }\n    a.n = b = array[0];\n    b.p = a;\n  }\n  function d3_geo_clipPolygonIntersection(point, points, other, entry) {\n    this.x = point;\n    this.z = points;\n    this.o = other;\n    this.e = entry;\n    this.v = false;\n    this.n = this.p = null;\n  }\n  function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {\n    return function(rotate, listener) {\n      var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]);\n      var clip = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          clip.point = pointRing;\n          clip.lineStart = ringStart;\n          clip.lineEnd = ringEnd;\n          segments = [];\n          polygon = [];\n        },\n        polygonEnd: function() {\n          clip.point = point;\n          clip.lineStart = lineStart;\n          clip.lineEnd = lineEnd;\n          segments = d3.merge(segments);\n          var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon);\n          if (segments.length) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener);\n          } else if (clipStartInside) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            listener.lineStart();\n            interpolate(null, null, 1, listener);\n            listener.lineEnd();\n          }\n          if (polygonStarted) listener.polygonEnd(), polygonStarted = false;\n          segments = polygon = null;\n        },\n        sphere: function() {\n          listener.polygonStart();\n          listener.lineStart();\n          interpolate(null, null, 1, listener);\n          listener.lineEnd();\n          listener.polygonEnd();\n        }\n      };\n      function point(λ, φ) {\n        var point = rotate(λ, φ);\n        if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ);\n      }\n      function pointLine(λ, φ) {\n        var point = rotate(λ, φ);\n        line.point(point[0], point[1]);\n      }\n      function lineStart() {\n        clip.point = pointLine;\n        line.lineStart();\n      }\n      function lineEnd() {\n        clip.point = point;\n        line.lineEnd();\n      }\n      var segments;\n      var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring;\n      function pointRing(λ, φ) {\n        ring.push([ λ, φ ]);\n        var point = rotate(λ, φ);\n        ringListener.point(point[0], point[1]);\n      }\n      function ringStart() {\n        ringListener.lineStart();\n        ring = [];\n      }\n      function ringEnd() {\n        pointRing(ring[0][0], ring[0][1]);\n        ringListener.lineEnd();\n        var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length;\n        ring.pop();\n        polygon.push(ring);\n        ring = null;\n        if (!n) return;\n        if (clean & 1) {\n          segment = ringSegments[0];\n          var n = segment.length - 1, i = -1, point;\n          if (n > 0) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            listener.lineStart();\n            while (++i < n) listener.point((point = segment[i])[0], point[1]);\n            listener.lineEnd();\n          }\n          return;\n        }\n        if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n        segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));\n      }\n      return clip;\n    };\n  }\n  function d3_geo_clipSegmentLength1(segment) {\n    return segment.length > 1;\n  }\n  function d3_geo_clipBufferListener() {\n    var lines = [], line;\n    return {\n      lineStart: function() {\n        lines.push(line = []);\n      },\n      point: function(λ, φ) {\n        line.push([ λ, φ ]);\n      },\n      lineEnd: d3_noop,\n      buffer: function() {\n        var buffer = lines;\n        lines = [];\n        line = null;\n        return buffer;\n      },\n      rejoin: function() {\n        if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n      }\n    };\n  }\n  function d3_geo_clipSort(a, b) {\n    return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);\n  }\n  function d3_geo_pointInPolygon(point, polygon) {\n    var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0;\n    d3_geo_areaRingSum.reset();\n    for (var i = 0, n = polygon.length; i < n; ++i) {\n      var ring = polygon[i], m = ring.length;\n      if (!m) continue;\n      var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1;\n      while (true) {\n        if (j === m) j = 0;\n        point = ring[j];\n        var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ;\n        d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ)));\n        polarAngle += antimeridian ? dλ + sdλ * τ : dλ;\n        if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {\n          var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));\n          d3_geo_cartesianNormalize(arc);\n          var intersection = d3_geo_cartesianCross(meridianNormal, arc);\n          d3_geo_cartesianNormalize(intersection);\n          var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]);\n          if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) {\n            winding += antimeridian ^ dλ >= 0 ? 1 : -1;\n          }\n        }\n        if (!j++) break;\n        λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point;\n      }\n    }\n    return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < 0) ^ winding & 1;\n  }\n  var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]);\n  function d3_geo_clipAntimeridianLine(listener) {\n    var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean;\n    return {\n      lineStart: function() {\n        listener.lineStart();\n        clean = 1;\n      },\n      point: function(λ1, φ1) {\n        var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0);\n        if (abs(dλ - π) < ε) {\n          listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);\n          listener.point(sλ0, φ0);\n          listener.lineEnd();\n          listener.lineStart();\n          listener.point(sλ1, φ0);\n          listener.point(λ1, φ0);\n          clean = 0;\n        } else if (sλ0 !== sλ1 && dλ >= π) {\n          if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;\n          if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;\n          φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);\n          listener.point(sλ0, φ0);\n          listener.lineEnd();\n          listener.lineStart();\n          listener.point(sλ1, φ0);\n          clean = 0;\n        }\n        listener.point(λ0 = λ1, φ0 = φ1);\n        sλ0 = sλ1;\n      },\n      lineEnd: function() {\n        listener.lineEnd();\n        λ0 = φ0 = NaN;\n      },\n      clean: function() {\n        return 2 - clean;\n      }\n    };\n  }\n  function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {\n    var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);\n    return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;\n  }\n  function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {\n    var φ;\n    if (from == null) {\n      φ = direction * halfπ;\n      listener.point(-π, φ);\n      listener.point(0, φ);\n      listener.point(π, φ);\n      listener.point(π, 0);\n      listener.point(π, -φ);\n      listener.point(0, -φ);\n      listener.point(-π, -φ);\n      listener.point(-π, 0);\n      listener.point(-π, φ);\n    } else if (abs(from[0] - to[0]) > ε) {\n      var s = from[0] < to[0] ? π : -π;\n      φ = direction * s / 2;\n      listener.point(-s, φ);\n      listener.point(0, φ);\n      listener.point(s, φ);\n    } else {\n      listener.point(to[0], to[1]);\n    }\n  }\n  function d3_geo_clipCircle(radius) {\n    var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);\n    return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]);\n    function visible(λ, φ) {\n      return Math.cos(λ) * Math.cos(φ) > cr;\n    }\n    function clipLine(listener) {\n      var point0, c0, v0, v00, clean;\n      return {\n        lineStart: function() {\n          v00 = v0 = false;\n          clean = 1;\n        },\n        point: function(λ, φ) {\n          var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;\n          if (!point0 && (v00 = v0 = v)) listener.lineStart();\n          if (v !== v0) {\n            point2 = intersect(point0, point1);\n            if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {\n              point1[0] += ε;\n              point1[1] += ε;\n              v = visible(point1[0], point1[1]);\n            }\n          }\n          if (v !== v0) {\n            clean = 0;\n            if (v) {\n              listener.lineStart();\n              point2 = intersect(point1, point0);\n              listener.point(point2[0], point2[1]);\n            } else {\n              point2 = intersect(point0, point1);\n              listener.point(point2[0], point2[1]);\n              listener.lineEnd();\n            }\n            point0 = point2;\n          } else if (notHemisphere && point0 && smallRadius ^ v) {\n            var t;\n            if (!(c & c0) && (t = intersect(point1, point0, true))) {\n              clean = 0;\n              if (smallRadius) {\n                listener.lineStart();\n                listener.point(t[0][0], t[0][1]);\n                listener.point(t[1][0], t[1][1]);\n                listener.lineEnd();\n              } else {\n                listener.point(t[1][0], t[1][1]);\n                listener.lineEnd();\n                listener.lineStart();\n                listener.point(t[0][0], t[0][1]);\n              }\n            }\n          }\n          if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {\n            listener.point(point1[0], point1[1]);\n          }\n          point0 = point1, v0 = v, c0 = c;\n        },\n        lineEnd: function() {\n          if (v0) listener.lineEnd();\n          point0 = null;\n        },\n        clean: function() {\n          return clean | (v00 && v0) << 1;\n        }\n      };\n    }\n    function intersect(a, b, two) {\n      var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b);\n      var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;\n      if (!determinant) return !two && a;\n      var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2);\n      d3_geo_cartesianAdd(A, B);\n      var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);\n      if (t2 < 0) return;\n      var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu);\n      d3_geo_cartesianAdd(q, A);\n      q = d3_geo_spherical(q);\n      if (!two) return q;\n      var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z;\n      if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;\n      var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε;\n      if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;\n      if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {\n        var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);\n        d3_geo_cartesianAdd(q1, A);\n        return [ q, d3_geo_spherical(q1) ];\n      }\n    }\n    function code(λ, φ) {\n      var r = smallRadius ? radius : π - radius, code = 0;\n      if (λ < -r) code |= 1; else if (λ > r) code |= 2;\n      if (φ < -r) code |= 4; else if (φ > r) code |= 8;\n      return code;\n    }\n  }\n  function d3_geom_clipLine(x0, y0, x1, y1) {\n    return function(line) {\n      var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;\n      r = x0 - ax;\n      if (!dx && r > 0) return;\n      r /= dx;\n      if (dx < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      } else if (dx > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      }\n      r = x1 - ax;\n      if (!dx && r < 0) return;\n      r /= dx;\n      if (dx < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      } else if (dx > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      }\n      r = y0 - ay;\n      if (!dy && r > 0) return;\n      r /= dy;\n      if (dy < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      } else if (dy > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      }\n      r = y1 - ay;\n      if (!dy && r < 0) return;\n      r /= dy;\n      if (dy < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      } else if (dy > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      }\n      if (t0 > 0) line.a = {\n        x: ax + t0 * dx,\n        y: ay + t0 * dy\n      };\n      if (t1 < 1) line.b = {\n        x: ax + t1 * dx,\n        y: ay + t1 * dy\n      };\n      return line;\n    };\n  }\n  var d3_geo_clipExtentMAX = 1e9;\n  d3.geo.clipExtent = function() {\n    var x0, y0, x1, y1, stream, clip, clipExtent = {\n      stream: function(output) {\n        if (stream) stream.valid = false;\n        stream = clip(output);\n        stream.valid = true;\n        return stream;\n      },\n      extent: function(_) {\n        if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n        clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]);\n        if (stream) stream.valid = false, stream = null;\n        return clipExtent;\n      }\n    };\n    return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]);\n  };\n  function d3_geo_clipExtent(x0, y0, x1, y1) {\n    return function(listener) {\n      var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring;\n      var clip = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          listener = bufferListener;\n          segments = [];\n          polygon = [];\n          clean = true;\n        },\n        polygonEnd: function() {\n          listener = listener_;\n          segments = d3.merge(segments);\n          var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length;\n          if (inside || visible) {\n            listener.polygonStart();\n            if (inside) {\n              listener.lineStart();\n              interpolate(null, null, 1, listener);\n              listener.lineEnd();\n            }\n            if (visible) {\n              d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener);\n            }\n            listener.polygonEnd();\n          }\n          segments = polygon = ring = null;\n        }\n      };\n      function insidePolygon(p) {\n        var wn = 0, n = polygon.length, y = p[1];\n        for (var i = 0; i < n; ++i) {\n          for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) {\n            b = v[j];\n            if (a[1] <= y) {\n              if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn;\n            } else {\n              if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn;\n            }\n            a = b;\n          }\n        }\n        return wn !== 0;\n      }\n      function interpolate(from, to, direction, listener) {\n        var a = 0, a1 = 0;\n        if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) {\n          do {\n            listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n          } while ((a = (a + direction + 4) % 4) !== a1);\n        } else {\n          listener.point(to[0], to[1]);\n        }\n      }\n      function pointVisible(x, y) {\n        return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n      }\n      function point(x, y) {\n        if (pointVisible(x, y)) listener.point(x, y);\n      }\n      var x__, y__, v__, x_, y_, v_, first, clean;\n      function lineStart() {\n        clip.point = linePoint;\n        if (polygon) polygon.push(ring = []);\n        first = true;\n        v_ = false;\n        x_ = y_ = NaN;\n      }\n      function lineEnd() {\n        if (segments) {\n          linePoint(x__, y__);\n          if (v__ && v_) bufferListener.rejoin();\n          segments.push(bufferListener.buffer());\n        }\n        clip.point = point;\n        if (v_) listener.lineEnd();\n      }\n      function linePoint(x, y) {\n        x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x));\n        y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y));\n        var v = pointVisible(x, y);\n        if (polygon) ring.push([ x, y ]);\n        if (first) {\n          x__ = x, y__ = y, v__ = v;\n          first = false;\n          if (v) {\n            listener.lineStart();\n            listener.point(x, y);\n          }\n        } else {\n          if (v && v_) listener.point(x, y); else {\n            var l = {\n              a: {\n                x: x_,\n                y: y_\n              },\n              b: {\n                x: x,\n                y: y\n              }\n            };\n            if (clipLine(l)) {\n              if (!v_) {\n                listener.lineStart();\n                listener.point(l.a.x, l.a.y);\n              }\n              listener.point(l.b.x, l.b.y);\n              if (!v) listener.lineEnd();\n              clean = false;\n            } else if (v) {\n              listener.lineStart();\n              listener.point(x, y);\n              clean = false;\n            }\n          }\n        }\n        x_ = x, y_ = y, v_ = v;\n      }\n      return clip;\n    };\n    function corner(p, direction) {\n      return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;\n    }\n    function compare(a, b) {\n      return comparePoints(a.x, b.x);\n    }\n    function comparePoints(a, b) {\n      var ca = corner(a, 1), cb = corner(b, 1);\n      return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];\n    }\n  }\n  function d3_geo_compose(a, b) {\n    function compose(x, y) {\n      return x = a(x, y), b(x[0], x[1]);\n    }\n    if (a.invert && b.invert) compose.invert = function(x, y) {\n      return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n    };\n    return compose;\n  }\n  function d3_geo_conic(projectAt) {\n    var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1);\n    p.parallels = function(_) {\n      if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ];\n      return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);\n    };\n    return p;\n  }\n  function d3_geo_conicEqualArea(φ0, φ1) {\n    var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;\n    function forward(λ, φ) {\n      var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;\n      return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = ρ0 - y;\n      return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ];\n    };\n    return forward;\n  }\n  (d3.geo.conicEqualArea = function() {\n    return d3_geo_conic(d3_geo_conicEqualArea);\n  }).raw = d3_geo_conicEqualArea;\n  d3.geo.albers = function() {\n    return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070);\n  };\n  d3.geo.albersUsa = function() {\n    var lower48 = d3.geo.albers();\n    var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]);\n    var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]);\n    var point, pointStream = {\n      point: function(x, y) {\n        point = [ x, y ];\n      }\n    }, lower48Point, alaskaPoint, hawaiiPoint;\n    function albersUsa(coordinates) {\n      var x = coordinates[0], y = coordinates[1];\n      point = null;\n      (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y);\n      return point;\n    }\n    albersUsa.invert = function(coordinates) {\n      var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;\n      return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates);\n    };\n    albersUsa.stream = function(stream) {\n      var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream);\n      return {\n        point: function(x, y) {\n          lower48Stream.point(x, y);\n          alaskaStream.point(x, y);\n          hawaiiStream.point(x, y);\n        },\n        sphere: function() {\n          lower48Stream.sphere();\n          alaskaStream.sphere();\n          hawaiiStream.sphere();\n        },\n        lineStart: function() {\n          lower48Stream.lineStart();\n          alaskaStream.lineStart();\n          hawaiiStream.lineStart();\n        },\n        lineEnd: function() {\n          lower48Stream.lineEnd();\n          alaskaStream.lineEnd();\n          hawaiiStream.lineEnd();\n        },\n        polygonStart: function() {\n          lower48Stream.polygonStart();\n          alaskaStream.polygonStart();\n          hawaiiStream.polygonStart();\n        },\n        polygonEnd: function() {\n          lower48Stream.polygonEnd();\n          alaskaStream.polygonEnd();\n          hawaiiStream.polygonEnd();\n        }\n      };\n    };\n    albersUsa.precision = function(_) {\n      if (!arguments.length) return lower48.precision();\n      lower48.precision(_);\n      alaska.precision(_);\n      hawaii.precision(_);\n      return albersUsa;\n    };\n    albersUsa.scale = function(_) {\n      if (!arguments.length) return lower48.scale();\n      lower48.scale(_);\n      alaska.scale(_ * .35);\n      hawaii.scale(_);\n      return albersUsa.translate(lower48.translate());\n    };\n    albersUsa.translate = function(_) {\n      if (!arguments.length) return lower48.translate();\n      var k = lower48.scale(), x = +_[0], y = +_[1];\n      lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point;\n      alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n      hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n      return albersUsa;\n    };\n    return albersUsa.scale(1070);\n  };\n  var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {\n    point: d3_noop,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: function() {\n      d3_geo_pathAreaPolygon = 0;\n      d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;\n      d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);\n    }\n  };\n  function d3_geo_pathAreaRingStart() {\n    var x00, y00, x0, y0;\n    d3_geo_pathArea.point = function(x, y) {\n      d3_geo_pathArea.point = nextPoint;\n      x00 = x0 = x, y00 = y0 = y;\n    };\n    function nextPoint(x, y) {\n      d3_geo_pathAreaPolygon += y0 * x - x0 * y;\n      x0 = x, y0 = y;\n    }\n    d3_geo_pathArea.lineEnd = function() {\n      nextPoint(x00, y00);\n    };\n  }\n  var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1;\n  var d3_geo_pathBounds = {\n    point: d3_geo_pathBoundsPoint,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: d3_noop,\n    polygonEnd: d3_noop\n  };\n  function d3_geo_pathBoundsPoint(x, y) {\n    if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x;\n    if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x;\n    if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y;\n    if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y;\n  }\n  function d3_geo_pathBuffer() {\n    var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = [];\n    var stream = {\n      point: point,\n      lineStart: function() {\n        stream.point = pointLineStart;\n      },\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        stream.lineEnd = lineEndPolygon;\n      },\n      polygonEnd: function() {\n        stream.lineEnd = lineEnd;\n        stream.point = point;\n      },\n      pointRadius: function(_) {\n        pointCircle = d3_geo_pathBufferCircle(_);\n        return stream;\n      },\n      result: function() {\n        if (buffer.length) {\n          var result = buffer.join(\"\");\n          buffer = [];\n          return result;\n        }\n      }\n    };\n    function point(x, y) {\n      buffer.push(\"M\", x, \",\", y, pointCircle);\n    }\n    function pointLineStart(x, y) {\n      buffer.push(\"M\", x, \",\", y);\n      stream.point = pointLine;\n    }\n    function pointLine(x, y) {\n      buffer.push(\"L\", x, \",\", y);\n    }\n    function lineEnd() {\n      stream.point = point;\n    }\n    function lineEndPolygon() {\n      buffer.push(\"Z\");\n    }\n    return stream;\n  }\n  function d3_geo_pathBufferCircle(radius) {\n    return \"m0,\" + radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius + \"z\";\n  }\n  var d3_geo_pathCentroid = {\n    point: d3_geo_pathCentroidPoint,\n    lineStart: d3_geo_pathCentroidLineStart,\n    lineEnd: d3_geo_pathCentroidLineEnd,\n    polygonStart: function() {\n      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;\n      d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;\n    }\n  };\n  function d3_geo_pathCentroidPoint(x, y) {\n    d3_geo_centroidX0 += x;\n    d3_geo_centroidY0 += y;\n    ++d3_geo_centroidZ0;\n  }\n  function d3_geo_pathCentroidLineStart() {\n    var x0, y0;\n    d3_geo_pathCentroid.point = function(x, y) {\n      d3_geo_pathCentroid.point = nextPoint;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    };\n    function nextPoint(x, y) {\n      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n      d3_geo_centroidX1 += z * (x0 + x) / 2;\n      d3_geo_centroidY1 += z * (y0 + y) / 2;\n      d3_geo_centroidZ1 += z;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    }\n  }\n  function d3_geo_pathCentroidLineEnd() {\n    d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n  }\n  function d3_geo_pathCentroidRingStart() {\n    var x00, y00, x0, y0;\n    d3_geo_pathCentroid.point = function(x, y) {\n      d3_geo_pathCentroid.point = nextPoint;\n      d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y);\n    };\n    function nextPoint(x, y) {\n      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n      d3_geo_centroidX1 += z * (x0 + x) / 2;\n      d3_geo_centroidY1 += z * (y0 + y) / 2;\n      d3_geo_centroidZ1 += z;\n      z = y0 * x - x0 * y;\n      d3_geo_centroidX2 += z * (x0 + x);\n      d3_geo_centroidY2 += z * (y0 + y);\n      d3_geo_centroidZ2 += z * 3;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    }\n    d3_geo_pathCentroid.lineEnd = function() {\n      nextPoint(x00, y00);\n    };\n  }\n  function d3_geo_pathContext(context) {\n    var pointRadius = 4.5;\n    var stream = {\n      point: point,\n      lineStart: function() {\n        stream.point = pointLineStart;\n      },\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        stream.lineEnd = lineEndPolygon;\n      },\n      polygonEnd: function() {\n        stream.lineEnd = lineEnd;\n        stream.point = point;\n      },\n      pointRadius: function(_) {\n        pointRadius = _;\n        return stream;\n      },\n      result: d3_noop\n    };\n    function point(x, y) {\n      context.moveTo(x, y);\n      context.arc(x, y, pointRadius, 0, τ);\n    }\n    function pointLineStart(x, y) {\n      context.moveTo(x, y);\n      stream.point = pointLine;\n    }\n    function pointLine(x, y) {\n      context.lineTo(x, y);\n    }\n    function lineEnd() {\n      stream.point = point;\n    }\n    function lineEndPolygon() {\n      context.closePath();\n    }\n    return stream;\n  }\n  function d3_geo_resample(project) {\n    var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16;\n    function resample(stream) {\n      return (maxDepth ? resampleRecursive : resampleNone)(stream);\n    }\n    function resampleNone(stream) {\n      return d3_geo_transformPoint(stream, function(x, y) {\n        x = project(x, y);\n        stream.point(x[0], x[1]);\n      });\n    }\n    function resampleRecursive(stream) {\n      var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0;\n      var resample = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          stream.polygonStart();\n          resample.lineStart = ringStart;\n        },\n        polygonEnd: function() {\n          stream.polygonEnd();\n          resample.lineStart = lineStart;\n        }\n      };\n      function point(x, y) {\n        x = project(x, y);\n        stream.point(x[0], x[1]);\n      }\n      function lineStart() {\n        x0 = NaN;\n        resample.point = linePoint;\n        stream.lineStart();\n      }\n      function linePoint(λ, φ) {\n        var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ);\n        resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n        stream.point(x0, y0);\n      }\n      function lineEnd() {\n        resample.point = point;\n        stream.lineEnd();\n      }\n      function ringStart() {\n        lineStart();\n        resample.point = ringPoint;\n        resample.lineEnd = ringEnd;\n      }\n      function ringPoint(λ, φ) {\n        linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n        resample.point = linePoint;\n      }\n      function ringEnd() {\n        resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);\n        resample.lineEnd = lineEnd;\n        lineEnd();\n      }\n      return resample;\n    }\n    function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {\n      var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;\n      if (d2 > 4 * δ2 && depth--) {\n        var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;\n        if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n          resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);\n          stream.point(x2, y2);\n          resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);\n        }\n      }\n    }\n    resample.precision = function(_) {\n      if (!arguments.length) return Math.sqrt(δ2);\n      maxDepth = (δ2 = _ * _) > 0 && 16;\n      return resample;\n    };\n    return resample;\n  }\n  d3.geo.path = function() {\n    var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream;\n    function path(object) {\n      if (object) {\n        if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n        if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream);\n        d3.geo.stream(object, cacheStream);\n      }\n      return contextStream.result();\n    }\n    path.area = function(object) {\n      d3_geo_pathAreaSum = 0;\n      d3.geo.stream(object, projectStream(d3_geo_pathArea));\n      return d3_geo_pathAreaSum;\n    };\n    path.centroid = function(object) {\n      d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n      d3.geo.stream(object, projectStream(d3_geo_pathCentroid));\n      return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ];\n    };\n    path.bounds = function(object) {\n      d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity);\n      d3.geo.stream(object, projectStream(d3_geo_pathBounds));\n      return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ];\n    };\n    path.projection = function(_) {\n      if (!arguments.length) return projection;\n      projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;\n      return reset();\n    };\n    path.context = function(_) {\n      if (!arguments.length) return context;\n      contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_);\n      if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n      return reset();\n    };\n    path.pointRadius = function(_) {\n      if (!arguments.length) return pointRadius;\n      pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n      return path;\n    };\n    function reset() {\n      cacheStream = null;\n      return path;\n    }\n    return path.projection(d3.geo.albersUsa()).context(null);\n  };\n  function d3_geo_pathProjectStream(project) {\n    var resample = d3_geo_resample(function(x, y) {\n      return project([ x * d3_degrees, y * d3_degrees ]);\n    });\n    return function(stream) {\n      return d3_geo_projectionRadians(resample(stream));\n    };\n  }\n  d3.geo.transform = function(methods) {\n    return {\n      stream: function(stream) {\n        var transform = new d3_geo_transform(stream);\n        for (var k in methods) transform[k] = methods[k];\n        return transform;\n      }\n    };\n  };\n  function d3_geo_transform(stream) {\n    this.stream = stream;\n  }\n  d3_geo_transform.prototype = {\n    point: function(x, y) {\n      this.stream.point(x, y);\n    },\n    sphere: function() {\n      this.stream.sphere();\n    },\n    lineStart: function() {\n      this.stream.lineStart();\n    },\n    lineEnd: function() {\n      this.stream.lineEnd();\n    },\n    polygonStart: function() {\n      this.stream.polygonStart();\n    },\n    polygonEnd: function() {\n      this.stream.polygonEnd();\n    }\n  };\n  function d3_geo_transformPoint(stream, point) {\n    return {\n      point: point,\n      sphere: function() {\n        stream.sphere();\n      },\n      lineStart: function() {\n        stream.lineStart();\n      },\n      lineEnd: function() {\n        stream.lineEnd();\n      },\n      polygonStart: function() {\n        stream.polygonStart();\n      },\n      polygonEnd: function() {\n        stream.polygonEnd();\n      }\n    };\n  }\n  d3.geo.projection = d3_geo_projection;\n  d3.geo.projectionMutator = d3_geo_projectionMutator;\n  function d3_geo_projection(project) {\n    return d3_geo_projectionMutator(function() {\n      return project;\n    })();\n  }\n  function d3_geo_projectionMutator(projectAt) {\n    var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) {\n      x = project(x, y);\n      return [ x[0] * k + δx, δy - x[1] * k ];\n    }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream;\n    function projection(point) {\n      point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);\n      return [ point[0] * k + δx, δy - point[1] * k ];\n    }\n    function invert(point) {\n      point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);\n      return point && [ point[0] * d3_degrees, point[1] * d3_degrees ];\n    }\n    projection.stream = function(output) {\n      if (stream) stream.valid = false;\n      stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output))));\n      stream.valid = true;\n      return stream;\n    };\n    projection.clipAngle = function(_) {\n      if (!arguments.length) return clipAngle;\n      preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);\n      return invalidate();\n    };\n    projection.clipExtent = function(_) {\n      if (!arguments.length) return clipExtent;\n      clipExtent = _;\n      postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity;\n      return invalidate();\n    };\n    projection.scale = function(_) {\n      if (!arguments.length) return k;\n      k = +_;\n      return reset();\n    };\n    projection.translate = function(_) {\n      if (!arguments.length) return [ x, y ];\n      x = +_[0];\n      y = +_[1];\n      return reset();\n    };\n    projection.center = function(_) {\n      if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ];\n      λ = _[0] % 360 * d3_radians;\n      φ = _[1] % 360 * d3_radians;\n      return reset();\n    };\n    projection.rotate = function(_) {\n      if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ];\n      δλ = _[0] % 360 * d3_radians;\n      δφ = _[1] % 360 * d3_radians;\n      δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;\n      return reset();\n    };\n    d3.rebind(projection, projectResample, \"precision\");\n    function reset() {\n      projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);\n      var center = project(λ, φ);\n      δx = x - center[0] * k;\n      δy = y + center[1] * k;\n      return invalidate();\n    }\n    function invalidate() {\n      if (stream) stream.valid = false, stream = null;\n      return projection;\n    }\n    return function() {\n      project = projectAt.apply(this, arguments);\n      projection.invert = project.invert && invert;\n      return reset();\n    };\n  }\n  function d3_geo_projectionRadians(stream) {\n    return d3_geo_transformPoint(stream, function(x, y) {\n      stream.point(x * d3_radians, y * d3_radians);\n    });\n  }\n  function d3_geo_equirectangular(λ, φ) {\n    return [ λ, φ ];\n  }\n  (d3.geo.equirectangular = function() {\n    return d3_geo_projection(d3_geo_equirectangular);\n  }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;\n  d3.geo.rotation = function(rotate) {\n    rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);\n    function forward(coordinates) {\n      coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n    }\n    forward.invert = function(coordinates) {\n      coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n    };\n    return forward;\n  };\n  function d3_geo_identityRotation(λ, φ) {\n    return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n  }\n  d3_geo_identityRotation.invert = d3_geo_equirectangular;\n  function d3_geo_rotation(δλ, δφ, δγ) {\n    return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation;\n  }\n  function d3_geo_forwardRotationλ(δλ) {\n    return function(λ, φ) {\n      return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n    };\n  }\n  function d3_geo_rotationλ(δλ) {\n    var rotation = d3_geo_forwardRotationλ(δλ);\n    rotation.invert = d3_geo_forwardRotationλ(-δλ);\n    return rotation;\n  }\n  function d3_geo_rotationφγ(δφ, δγ) {\n    var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ);\n    function rotation(λ, φ) {\n      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ;\n      return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ];\n    }\n    rotation.invert = function(λ, φ) {\n      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ;\n      return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ];\n    };\n    return rotation;\n  }\n  d3.geo.circle = function() {\n    var origin = [ 0, 0 ], angle, precision = 6, interpolate;\n    function circle() {\n      var center = typeof origin === \"function\" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = [];\n      interpolate(null, null, 1, {\n        point: function(x, y) {\n          ring.push(x = rotate(x, y));\n          x[0] *= d3_degrees, x[1] *= d3_degrees;\n        }\n      });\n      return {\n        type: \"Polygon\",\n        coordinates: [ ring ]\n      };\n    }\n    circle.origin = function(x) {\n      if (!arguments.length) return origin;\n      origin = x;\n      return circle;\n    };\n    circle.angle = function(x) {\n      if (!arguments.length) return angle;\n      interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);\n      return circle;\n    };\n    circle.precision = function(_) {\n      if (!arguments.length) return precision;\n      interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);\n      return circle;\n    };\n    return circle.angle(90);\n  };\n  function d3_geo_circleInterpolate(radius, precision) {\n    var cr = Math.cos(radius), sr = Math.sin(radius);\n    return function(from, to, direction, listener) {\n      var step = direction * precision;\n      if (from != null) {\n        from = d3_geo_circleAngle(cr, from);\n        to = d3_geo_circleAngle(cr, to);\n        if (direction > 0 ? from < to : from > to) from += direction * τ;\n      } else {\n        from = radius + direction * τ;\n        to = radius - .5 * step;\n      }\n      for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) {\n        listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]);\n      }\n    };\n  }\n  function d3_geo_circleAngle(cr, point) {\n    var a = d3_geo_cartesian(point);\n    a[0] -= cr;\n    d3_geo_cartesianNormalize(a);\n    var angle = d3_acos(-a[1]);\n    return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);\n  }\n  d3.geo.distance = function(a, b) {\n    var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t;\n    return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ);\n  };\n  d3.geo.graticule = function() {\n    var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5;\n    function graticule() {\n      return {\n        type: \"MultiLineString\",\n        coordinates: lines()\n      };\n    }\n    function lines() {\n      return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {\n        return abs(x % DX) > ε;\n      }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {\n        return abs(y % DY) > ε;\n      }).map(y));\n    }\n    graticule.lines = function() {\n      return lines().map(function(coordinates) {\n        return {\n          type: \"LineString\",\n          coordinates: coordinates\n        };\n      });\n    };\n    graticule.outline = function() {\n      return {\n        type: \"Polygon\",\n        coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ]\n      };\n    };\n    graticule.extent = function(_) {\n      if (!arguments.length) return graticule.minorExtent();\n      return graticule.majorExtent(_).minorExtent(_);\n    };\n    graticule.majorExtent = function(_) {\n      if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ];\n      X0 = +_[0][0], X1 = +_[1][0];\n      Y0 = +_[0][1], Y1 = +_[1][1];\n      if (X0 > X1) _ = X0, X0 = X1, X1 = _;\n      if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;\n      return graticule.precision(precision);\n    };\n    graticule.minorExtent = function(_) {\n      if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n      x0 = +_[0][0], x1 = +_[1][0];\n      y0 = +_[0][1], y1 = +_[1][1];\n      if (x0 > x1) _ = x0, x0 = x1, x1 = _;\n      if (y0 > y1) _ = y0, y0 = y1, y1 = _;\n      return graticule.precision(precision);\n    };\n    graticule.step = function(_) {\n      if (!arguments.length) return graticule.minorStep();\n      return graticule.majorStep(_).minorStep(_);\n    };\n    graticule.majorStep = function(_) {\n      if (!arguments.length) return [ DX, DY ];\n      DX = +_[0], DY = +_[1];\n      return graticule;\n    };\n    graticule.minorStep = function(_) {\n      if (!arguments.length) return [ dx, dy ];\n      dx = +_[0], dy = +_[1];\n      return graticule;\n    };\n    graticule.precision = function(_) {\n      if (!arguments.length) return precision;\n      precision = +_;\n      x = d3_geo_graticuleX(y0, y1, 90);\n      y = d3_geo_graticuleY(x0, x1, precision);\n      X = d3_geo_graticuleX(Y0, Y1, 90);\n      Y = d3_geo_graticuleY(X0, X1, precision);\n      return graticule;\n    };\n    return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]);\n  };\n  function d3_geo_graticuleX(y0, y1, dy) {\n    var y = d3.range(y0, y1 - ε, dy).concat(y1);\n    return function(x) {\n      return y.map(function(y) {\n        return [ x, y ];\n      });\n    };\n  }\n  function d3_geo_graticuleY(x0, x1, dx) {\n    var x = d3.range(x0, x1 - ε, dx).concat(x1);\n    return function(y) {\n      return x.map(function(x) {\n        return [ x, y ];\n      });\n    };\n  }\n  function d3_source(d) {\n    return d.source;\n  }\n  function d3_target(d) {\n    return d.target;\n  }\n  d3.geo.greatArc = function() {\n    var source = d3_source, source_, target = d3_target, target_;\n    function greatArc() {\n      return {\n        type: \"LineString\",\n        coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ]\n      };\n    }\n    greatArc.distance = function() {\n      return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments));\n    };\n    greatArc.source = function(_) {\n      if (!arguments.length) return source;\n      source = _, source_ = typeof _ === \"function\" ? null : _;\n      return greatArc;\n    };\n    greatArc.target = function(_) {\n      if (!arguments.length) return target;\n      target = _, target_ = typeof _ === \"function\" ? null : _;\n      return greatArc;\n    };\n    greatArc.precision = function() {\n      return arguments.length ? greatArc : 0;\n    };\n    return greatArc;\n  };\n  d3.geo.interpolate = function(source, target) {\n    return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians);\n  };\n  function d3_geo_interpolate(x0, y0, x1, y1) {\n    var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d);\n    var interpolate = d ? function(t) {\n      var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;\n      return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ];\n    } : function() {\n      return [ x0 * d3_degrees, y0 * d3_degrees ];\n    };\n    interpolate.distance = d;\n    return interpolate;\n  }\n  d3.geo.length = function(object) {\n    d3_geo_lengthSum = 0;\n    d3.geo.stream(object, d3_geo_length);\n    return d3_geo_lengthSum;\n  };\n  var d3_geo_lengthSum;\n  var d3_geo_length = {\n    sphere: d3_noop,\n    point: d3_noop,\n    lineStart: d3_geo_lengthLineStart,\n    lineEnd: d3_noop,\n    polygonStart: d3_noop,\n    polygonEnd: d3_noop\n  };\n  function d3_geo_lengthLineStart() {\n    var λ0, sinφ0, cosφ0;\n    d3_geo_length.point = function(λ, φ) {\n      λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ);\n      d3_geo_length.point = nextPoint;\n    };\n    d3_geo_length.lineEnd = function() {\n      d3_geo_length.point = d3_geo_length.lineEnd = d3_noop;\n    };\n    function nextPoint(λ, φ) {\n      var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t);\n      d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ);\n      λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ;\n    }\n  }\n  function d3_geo_azimuthal(scale, angle) {\n    function azimuthal(λ, φ) {\n      var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ);\n      return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ];\n    }\n    azimuthal.invert = function(x, y) {\n      var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c);\n      return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ];\n    };\n    return azimuthal;\n  }\n  var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {\n    return Math.sqrt(2 / (1 + cosλcosφ));\n  }, function(ρ) {\n    return 2 * Math.asin(ρ / 2);\n  });\n  (d3.geo.azimuthalEqualArea = function() {\n    return d3_geo_projection(d3_geo_azimuthalEqualArea);\n  }).raw = d3_geo_azimuthalEqualArea;\n  var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) {\n    var c = Math.acos(cosλcosφ);\n    return c && c / Math.sin(c);\n  }, d3_identity);\n  (d3.geo.azimuthalEquidistant = function() {\n    return d3_geo_projection(d3_geo_azimuthalEquidistant);\n  }).raw = d3_geo_azimuthalEquidistant;\n  function d3_geo_conicConformal(φ0, φ1) {\n    var cosφ0 = Math.cos(φ0), t = function(φ) {\n      return Math.tan(π / 4 + φ / 2);\n    }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n;\n    if (!n) return d3_geo_mercator;\n    function forward(λ, φ) {\n      if (F > 0) {\n        if (φ < -halfπ + ε) φ = -halfπ + ε;\n      } else {\n        if (φ > halfπ - ε) φ = halfπ - ε;\n      }\n      var ρ = F / Math.pow(t(φ), n);\n      return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y);\n      return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ];\n    };\n    return forward;\n  }\n  (d3.geo.conicConformal = function() {\n    return d3_geo_conic(d3_geo_conicConformal);\n  }).raw = d3_geo_conicConformal;\n  function d3_geo_conicEquidistant(φ0, φ1) {\n    var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0;\n    if (abs(n) < ε) return d3_geo_equirectangular;\n    function forward(λ, φ) {\n      var ρ = G - φ;\n      return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = G - y;\n      return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ];\n    };\n    return forward;\n  }\n  (d3.geo.conicEquidistant = function() {\n    return d3_geo_conic(d3_geo_conicEquidistant);\n  }).raw = d3_geo_conicEquidistant;\n  var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) {\n    return 1 / cosλcosφ;\n  }, Math.atan);\n  (d3.geo.gnomonic = function() {\n    return d3_geo_projection(d3_geo_gnomonic);\n  }).raw = d3_geo_gnomonic;\n  function d3_geo_mercator(λ, φ) {\n    return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ];\n  }\n  d3_geo_mercator.invert = function(x, y) {\n    return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ];\n  };\n  function d3_geo_mercatorProjection(project) {\n    var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto;\n    m.scale = function() {\n      var v = scale.apply(m, arguments);\n      return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n    };\n    m.translate = function() {\n      var v = translate.apply(m, arguments);\n      return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n    };\n    m.clipExtent = function(_) {\n      var v = clipExtent.apply(m, arguments);\n      if (v === m) {\n        if (clipAuto = _ == null) {\n          var k = π * scale(), t = translate();\n          clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]);\n        }\n      } else if (clipAuto) {\n        v = null;\n      }\n      return v;\n    };\n    return m.clipExtent(null);\n  }\n  (d3.geo.mercator = function() {\n    return d3_geo_mercatorProjection(d3_geo_mercator);\n  }).raw = d3_geo_mercator;\n  var d3_geo_orthographic = d3_geo_azimuthal(function() {\n    return 1;\n  }, Math.asin);\n  (d3.geo.orthographic = function() {\n    return d3_geo_projection(d3_geo_orthographic);\n  }).raw = d3_geo_orthographic;\n  var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) {\n    return 1 / (1 + cosλcosφ);\n  }, function(ρ) {\n    return 2 * Math.atan(ρ);\n  });\n  (d3.geo.stereographic = function() {\n    return d3_geo_projection(d3_geo_stereographic);\n  }).raw = d3_geo_stereographic;\n  function d3_geo_transverseMercator(λ, φ) {\n    return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ];\n  }\n  d3_geo_transverseMercator.invert = function(x, y) {\n    return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ];\n  };\n  (d3.geo.transverseMercator = function() {\n    var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate;\n    projection.center = function(_) {\n      return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]);\n    };\n    projection.rotate = function(_) {\n      return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(),\n      [ _[0], _[1], _[2] - 90 ]);\n    };\n    return rotate([ 0, 0, 90 ]);\n  }).raw = d3_geo_transverseMercator;\n  d3.geom = {};\n  function d3_geom_pointX(d) {\n    return d[0];\n  }\n  function d3_geom_pointY(d) {\n    return d[1];\n  }\n  d3.geom.hull = function(vertices) {\n    var x = d3_geom_pointX, y = d3_geom_pointY;\n    if (arguments.length) return hull(vertices);\n    function hull(data) {\n      if (data.length < 3) return [];\n      var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = [];\n      for (i = 0; i < n; i++) {\n        points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]);\n      }\n      points.sort(d3_geom_hullOrder);\n      for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]);\n      var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints);\n      var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = [];\n      for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]);\n      for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]);\n      return polygon;\n    }\n    hull.x = function(_) {\n      return arguments.length ? (x = _, hull) : x;\n    };\n    hull.y = function(_) {\n      return arguments.length ? (y = _, hull) : y;\n    };\n    return hull;\n  };\n  function d3_geom_hullUpper(points) {\n    var n = points.length, hull = [ 0, 1 ], hs = 2;\n    for (var i = 2; i < n; i++) {\n      while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs;\n      hull[hs++] = i;\n    }\n    return hull.slice(0, hs);\n  }\n  function d3_geom_hullOrder(a, b) {\n    return a[0] - b[0] || a[1] - b[1];\n  }\n  d3.geom.polygon = function(coordinates) {\n    d3_subclass(coordinates, d3_geom_polygonPrototype);\n    return coordinates;\n  };\n  var d3_geom_polygonPrototype = d3.geom.polygon.prototype = [];\n  d3_geom_polygonPrototype.area = function() {\n    var i = -1, n = this.length, a, b = this[n - 1], area = 0;\n    while (++i < n) {\n      a = b;\n      b = this[i];\n      area += a[1] * b[0] - a[0] * b[1];\n    }\n    return area * .5;\n  };\n  d3_geom_polygonPrototype.centroid = function(k) {\n    var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c;\n    if (!arguments.length) k = -1 / (6 * this.area());\n    while (++i < n) {\n      a = b;\n      b = this[i];\n      c = a[0] * b[1] - b[0] * a[1];\n      x += (a[0] + b[0]) * c;\n      y += (a[1] + b[1]) * c;\n    }\n    return [ x * k, y * k ];\n  };\n  d3_geom_polygonPrototype.clip = function(subject) {\n    var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d;\n    while (++i < n) {\n      input = subject.slice();\n      subject.length = 0;\n      b = this[i];\n      c = input[(m = input.length - closed) - 1];\n      j = -1;\n      while (++j < m) {\n        d = input[j];\n        if (d3_geom_polygonInside(d, a, b)) {\n          if (!d3_geom_polygonInside(c, a, b)) {\n            subject.push(d3_geom_polygonIntersect(c, d, a, b));\n          }\n          subject.push(d);\n        } else if (d3_geom_polygonInside(c, a, b)) {\n          subject.push(d3_geom_polygonIntersect(c, d, a, b));\n        }\n        c = d;\n      }\n      if (closed) subject.push(subject[0]);\n      a = b;\n    }\n    return subject;\n  };\n  function d3_geom_polygonInside(p, a, b) {\n    return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);\n  }\n  function d3_geom_polygonIntersect(c, d, a, b) {\n    var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);\n    return [ x1 + ua * x21, y1 + ua * y21 ];\n  }\n  function d3_geom_polygonClosed(coordinates) {\n    var a = coordinates[0], b = coordinates[coordinates.length - 1];\n    return !(a[0] - b[0] || a[1] - b[1]);\n  }\n  var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = [];\n  function d3_geom_voronoiBeach() {\n    d3_geom_voronoiRedBlackNode(this);\n    this.edge = this.site = this.circle = null;\n  }\n  function d3_geom_voronoiCreateBeach(site) {\n    var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach();\n    beach.site = site;\n    return beach;\n  }\n  function d3_geom_voronoiDetachBeach(beach) {\n    d3_geom_voronoiDetachCircle(beach);\n    d3_geom_voronoiBeaches.remove(beach);\n    d3_geom_voronoiBeachPool.push(beach);\n    d3_geom_voronoiRedBlackNode(beach);\n  }\n  function d3_geom_voronoiRemoveBeach(beach) {\n    var circle = beach.circle, x = circle.x, y = circle.cy, vertex = {\n      x: x,\n      y: y\n    }, previous = beach.P, next = beach.N, disappearing = [ beach ];\n    d3_geom_voronoiDetachBeach(beach);\n    var lArc = previous;\n    while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) {\n      previous = lArc.P;\n      disappearing.unshift(lArc);\n      d3_geom_voronoiDetachBeach(lArc);\n      lArc = previous;\n    }\n    disappearing.unshift(lArc);\n    d3_geom_voronoiDetachCircle(lArc);\n    var rArc = next;\n    while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) {\n      next = rArc.N;\n      disappearing.push(rArc);\n      d3_geom_voronoiDetachBeach(rArc);\n      rArc = next;\n    }\n    disappearing.push(rArc);\n    d3_geom_voronoiDetachCircle(rArc);\n    var nArcs = disappearing.length, iArc;\n    for (iArc = 1; iArc < nArcs; ++iArc) {\n      rArc = disappearing[iArc];\n      lArc = disappearing[iArc - 1];\n      d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);\n    }\n    lArc = disappearing[0];\n    rArc = disappearing[nArcs - 1];\n    rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex);\n    d3_geom_voronoiAttachCircle(lArc);\n    d3_geom_voronoiAttachCircle(rArc);\n  }\n  function d3_geom_voronoiAddBeach(site) {\n    var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._;\n    while (node) {\n      dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x;\n      if (dxl > ε) node = node.L; else {\n        dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix);\n        if (dxr > ε) {\n          if (!node.R) {\n            lArc = node;\n            break;\n          }\n          node = node.R;\n        } else {\n          if (dxl > -ε) {\n            lArc = node.P;\n            rArc = node;\n          } else if (dxr > -ε) {\n            lArc = node;\n            rArc = node.N;\n          } else {\n            lArc = rArc = node;\n          }\n          break;\n        }\n      }\n    }\n    var newArc = d3_geom_voronoiCreateBeach(site);\n    d3_geom_voronoiBeaches.insert(lArc, newArc);\n    if (!lArc && !rArc) return;\n    if (lArc === rArc) {\n      d3_geom_voronoiDetachCircle(lArc);\n      rArc = d3_geom_voronoiCreateBeach(lArc.site);\n      d3_geom_voronoiBeaches.insert(newArc, rArc);\n      newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n      d3_geom_voronoiAttachCircle(lArc);\n      d3_geom_voronoiAttachCircle(rArc);\n      return;\n    }\n    if (!rArc) {\n      newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n      return;\n    }\n    d3_geom_voronoiDetachCircle(lArc);\n    d3_geom_voronoiDetachCircle(rArc);\n    var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = {\n      x: (cy * hb - by * hc) / d + ax,\n      y: (bx * hc - cx * hb) / d + ay\n    };\n    d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex);\n    newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex);\n    rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex);\n    d3_geom_voronoiAttachCircle(lArc);\n    d3_geom_voronoiAttachCircle(rArc);\n  }\n  function d3_geom_voronoiLeftBreakPoint(arc, directrix) {\n    var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix;\n    if (!pby2) return rfocx;\n    var lArc = arc.P;\n    if (!lArc) return -Infinity;\n    site = lArc.site;\n    var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix;\n    if (!plby2) return lfocx;\n    var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2;\n    if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;\n    return (rfocx + lfocx) / 2;\n  }\n  function d3_geom_voronoiRightBreakPoint(arc, directrix) {\n    var rArc = arc.N;\n    if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix);\n    var site = arc.site;\n    return site.y === directrix ? site.x : Infinity;\n  }\n  function d3_geom_voronoiCell(site) {\n    this.site = site;\n    this.edges = [];\n  }\n  d3_geom_voronoiCell.prototype.prepare = function() {\n    var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge;\n    while (iHalfEdge--) {\n      edge = halfEdges[iHalfEdge].edge;\n      if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1);\n    }\n    halfEdges.sort(d3_geom_voronoiHalfEdgeOrder);\n    return halfEdges.length;\n  };\n  function d3_geom_voronoiCloseCells(extent) {\n    var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end;\n    while (iCell--) {\n      cell = cells[iCell];\n      if (!cell || !cell.prepare()) continue;\n      halfEdges = cell.edges;\n      nHalfEdges = halfEdges.length;\n      iHalfEdge = 0;\n      while (iHalfEdge < nHalfEdges) {\n        end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y;\n        start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y;\n        if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) {\n          halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? {\n            x: x0,\n            y: abs(x2 - x0) < ε ? y2 : y1\n          } : abs(y3 - y1) < ε && x1 - x3 > ε ? {\n            x: abs(y2 - y1) < ε ? x2 : x1,\n            y: y1\n          } : abs(x3 - x1) < ε && y3 - y0 > ε ? {\n            x: x1,\n            y: abs(x2 - x1) < ε ? y2 : y0\n          } : abs(y3 - y0) < ε && x3 - x0 > ε ? {\n            x: abs(y2 - y0) < ε ? x2 : x0,\n            y: y0\n          } : null), cell.site, null));\n          ++nHalfEdges;\n        }\n      }\n    }\n  }\n  function d3_geom_voronoiHalfEdgeOrder(a, b) {\n    return b.angle - a.angle;\n  }\n  function d3_geom_voronoiCircle() {\n    d3_geom_voronoiRedBlackNode(this);\n    this.x = this.y = this.arc = this.site = this.cy = null;\n  }\n  function d3_geom_voronoiAttachCircle(arc) {\n    var lArc = arc.P, rArc = arc.N;\n    if (!lArc || !rArc) return;\n    var lSite = lArc.site, cSite = arc.site, rSite = rArc.site;\n    if (lSite === rSite) return;\n    var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by;\n    var d = 2 * (ax * cy - ay * cx);\n    if (d >= -ε2) return;\n    var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by;\n    var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle();\n    circle.arc = arc;\n    circle.site = cSite;\n    circle.x = x + bx;\n    circle.y = cy + Math.sqrt(x * x + y * y);\n    circle.cy = cy;\n    arc.circle = circle;\n    var before = null, node = d3_geom_voronoiCircles._;\n    while (node) {\n      if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) {\n        if (node.L) node = node.L; else {\n          before = node.P;\n          break;\n        }\n      } else {\n        if (node.R) node = node.R; else {\n          before = node;\n          break;\n        }\n      }\n    }\n    d3_geom_voronoiCircles.insert(before, circle);\n    if (!before) d3_geom_voronoiFirstCircle = circle;\n  }\n  function d3_geom_voronoiDetachCircle(arc) {\n    var circle = arc.circle;\n    if (circle) {\n      if (!circle.P) d3_geom_voronoiFirstCircle = circle.N;\n      d3_geom_voronoiCircles.remove(circle);\n      d3_geom_voronoiCirclePool.push(circle);\n      d3_geom_voronoiRedBlackNode(circle);\n      arc.circle = null;\n    }\n  }\n  function d3_geom_voronoiClipEdges(extent) {\n    var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e;\n    while (i--) {\n      e = edges[i];\n      if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) {\n        e.a = e.b = null;\n        edges.splice(i, 1);\n      }\n    }\n  }\n  function d3_geom_voronoiConnectEdge(edge, extent) {\n    var vb = edge.b;\n    if (vb) return true;\n    var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb;\n    if (ry === ly) {\n      if (fx < x0 || fx >= x1) return;\n      if (lx > rx) {\n        if (!va) va = {\n          x: fx,\n          y: y0\n        }; else if (va.y >= y1) return;\n        vb = {\n          x: fx,\n          y: y1\n        };\n      } else {\n        if (!va) va = {\n          x: fx,\n          y: y1\n        }; else if (va.y < y0) return;\n        vb = {\n          x: fx,\n          y: y0\n        };\n      }\n    } else {\n      fm = (lx - rx) / (ry - ly);\n      fb = fy - fm * fx;\n      if (fm < -1 || fm > 1) {\n        if (lx > rx) {\n          if (!va) va = {\n            x: (y0 - fb) / fm,\n            y: y0\n          }; else if (va.y >= y1) return;\n          vb = {\n            x: (y1 - fb) / fm,\n            y: y1\n          };\n        } else {\n          if (!va) va = {\n            x: (y1 - fb) / fm,\n            y: y1\n          }; else if (va.y < y0) return;\n          vb = {\n            x: (y0 - fb) / fm,\n            y: y0\n          };\n        }\n      } else {\n        if (ly < ry) {\n          if (!va) va = {\n            x: x0,\n            y: fm * x0 + fb\n          }; else if (va.x >= x1) return;\n          vb = {\n            x: x1,\n            y: fm * x1 + fb\n          };\n        } else {\n          if (!va) va = {\n            x: x1,\n            y: fm * x1 + fb\n          }; else if (va.x < x0) return;\n          vb = {\n            x: x0,\n            y: fm * x0 + fb\n          };\n        }\n      }\n    }\n    edge.a = va;\n    edge.b = vb;\n    return true;\n  }\n  function d3_geom_voronoiEdge(lSite, rSite) {\n    this.l = lSite;\n    this.r = rSite;\n    this.a = this.b = null;\n  }\n  function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {\n    var edge = new d3_geom_voronoiEdge(lSite, rSite);\n    d3_geom_voronoiEdges.push(edge);\n    if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va);\n    if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb);\n    d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite));\n    d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite));\n    return edge;\n  }\n  function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {\n    var edge = new d3_geom_voronoiEdge(lSite, null);\n    edge.a = va;\n    edge.b = vb;\n    d3_geom_voronoiEdges.push(edge);\n    return edge;\n  }\n  function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {\n    if (!edge.a && !edge.b) {\n      edge.a = vertex;\n      edge.l = lSite;\n      edge.r = rSite;\n    } else if (edge.l === rSite) {\n      edge.b = vertex;\n    } else {\n      edge.a = vertex;\n    }\n  }\n  function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {\n    var va = edge.a, vb = edge.b;\n    this.edge = edge;\n    this.site = lSite;\n    this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y);\n  }\n  d3_geom_voronoiHalfEdge.prototype = {\n    start: function() {\n      return this.edge.l === this.site ? this.edge.a : this.edge.b;\n    },\n    end: function() {\n      return this.edge.l === this.site ? this.edge.b : this.edge.a;\n    }\n  };\n  function d3_geom_voronoiRedBlackTree() {\n    this._ = null;\n  }\n  function d3_geom_voronoiRedBlackNode(node) {\n    node.U = node.C = node.L = node.R = node.P = node.N = null;\n  }\n  d3_geom_voronoiRedBlackTree.prototype = {\n    insert: function(after, node) {\n      var parent, grandpa, uncle;\n      if (after) {\n        node.P = after;\n        node.N = after.N;\n        if (after.N) after.N.P = node;\n        after.N = node;\n        if (after.R) {\n          after = after.R;\n          while (after.L) after = after.L;\n          after.L = node;\n        } else {\n          after.R = node;\n        }\n        parent = after;\n      } else if (this._) {\n        after = d3_geom_voronoiRedBlackFirst(this._);\n        node.P = null;\n        node.N = after;\n        after.P = after.L = node;\n        parent = after;\n      } else {\n        node.P = node.N = null;\n        this._ = node;\n        parent = null;\n      }\n      node.L = node.R = null;\n      node.U = parent;\n      node.C = true;\n      after = node;\n      while (parent && parent.C) {\n        grandpa = parent.U;\n        if (parent === grandpa.L) {\n          uncle = grandpa.R;\n          if (uncle && uncle.C) {\n            parent.C = uncle.C = false;\n            grandpa.C = true;\n            after = grandpa;\n          } else {\n            if (after === parent.R) {\n              d3_geom_voronoiRedBlackRotateLeft(this, parent);\n              after = parent;\n              parent = after.U;\n            }\n            parent.C = false;\n            grandpa.C = true;\n            d3_geom_voronoiRedBlackRotateRight(this, grandpa);\n          }\n        } else {\n          uncle = grandpa.L;\n          if (uncle && uncle.C) {\n            parent.C = uncle.C = false;\n            grandpa.C = true;\n            after = grandpa;\n          } else {\n            if (after === parent.L) {\n              d3_geom_voronoiRedBlackRotateRight(this, parent);\n              after = parent;\n              parent = after.U;\n            }\n            parent.C = false;\n            grandpa.C = true;\n            d3_geom_voronoiRedBlackRotateLeft(this, grandpa);\n          }\n        }\n        parent = after.U;\n      }\n      this._.C = false;\n    },\n    remove: function(node) {\n      if (node.N) node.N.P = node.P;\n      if (node.P) node.P.N = node.N;\n      node.N = node.P = null;\n      var parent = node.U, sibling, left = node.L, right = node.R, next, red;\n      if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right);\n      if (parent) {\n        if (parent.L === node) parent.L = next; else parent.R = next;\n      } else {\n        this._ = next;\n      }\n      if (left && right) {\n        red = next.C;\n        next.C = node.C;\n        next.L = left;\n        left.U = next;\n        if (next !== right) {\n          parent = next.U;\n          next.U = node.U;\n          node = next.R;\n          parent.L = node;\n          next.R = right;\n          right.U = next;\n        } else {\n          next.U = parent;\n          parent = next;\n          node = next.R;\n        }\n      } else {\n        red = node.C;\n        node = next;\n      }\n      if (node) node.U = parent;\n      if (red) return;\n      if (node && node.C) {\n        node.C = false;\n        return;\n      }\n      do {\n        if (node === this._) break;\n        if (node === parent.L) {\n          sibling = parent.R;\n          if (sibling.C) {\n            sibling.C = false;\n            parent.C = true;\n            d3_geom_voronoiRedBlackRotateLeft(this, parent);\n            sibling = parent.R;\n          }\n          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n            if (!sibling.R || !sibling.R.C) {\n              sibling.L.C = false;\n              sibling.C = true;\n              d3_geom_voronoiRedBlackRotateRight(this, sibling);\n              sibling = parent.R;\n            }\n            sibling.C = parent.C;\n            parent.C = sibling.R.C = false;\n            d3_geom_voronoiRedBlackRotateLeft(this, parent);\n            node = this._;\n            break;\n          }\n        } else {\n          sibling = parent.L;\n          if (sibling.C) {\n            sibling.C = false;\n            parent.C = true;\n            d3_geom_voronoiRedBlackRotateRight(this, parent);\n            sibling = parent.L;\n          }\n          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n            if (!sibling.L || !sibling.L.C) {\n              sibling.R.C = false;\n              sibling.C = true;\n              d3_geom_voronoiRedBlackRotateLeft(this, sibling);\n              sibling = parent.L;\n            }\n            sibling.C = parent.C;\n            parent.C = sibling.L.C = false;\n            d3_geom_voronoiRedBlackRotateRight(this, parent);\n            node = this._;\n            break;\n          }\n        }\n        sibling.C = true;\n        node = parent;\n        parent = parent.U;\n      } while (!node.C);\n      if (node) node.C = false;\n    }\n  };\n  function d3_geom_voronoiRedBlackRotateLeft(tree, node) {\n    var p = node, q = node.R, parent = p.U;\n    if (parent) {\n      if (parent.L === p) parent.L = q; else parent.R = q;\n    } else {\n      tree._ = q;\n    }\n    q.U = parent;\n    p.U = q;\n    p.R = q.L;\n    if (p.R) p.R.U = p;\n    q.L = p;\n  }\n  function d3_geom_voronoiRedBlackRotateRight(tree, node) {\n    var p = node, q = node.L, parent = p.U;\n    if (parent) {\n      if (parent.L === p) parent.L = q; else parent.R = q;\n    } else {\n      tree._ = q;\n    }\n    q.U = parent;\n    p.U = q;\n    p.L = q.R;\n    if (p.L) p.L.U = p;\n    q.R = p;\n  }\n  function d3_geom_voronoiRedBlackFirst(node) {\n    while (node.L) node = node.L;\n    return node;\n  }\n  function d3_geom_voronoi(sites, bbox) {\n    var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle;\n    d3_geom_voronoiEdges = [];\n    d3_geom_voronoiCells = new Array(sites.length);\n    d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree();\n    d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree();\n    while (true) {\n      circle = d3_geom_voronoiFirstCircle;\n      if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) {\n        if (site.x !== x0 || site.y !== y0) {\n          d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site);\n          d3_geom_voronoiAddBeach(site);\n          x0 = site.x, y0 = site.y;\n        }\n        site = sites.pop();\n      } else if (circle) {\n        d3_geom_voronoiRemoveBeach(circle.arc);\n      } else {\n        break;\n      }\n    }\n    if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox);\n    var diagram = {\n      cells: d3_geom_voronoiCells,\n      edges: d3_geom_voronoiEdges\n    };\n    d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null;\n    return diagram;\n  }\n  function d3_geom_voronoiVertexOrder(a, b) {\n    return b.y - a.y || b.x - a.x;\n  }\n  d3.geom.voronoi = function(points) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent;\n    if (points) return voronoi(points);\n    function voronoi(data) {\n      var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1];\n      d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {\n        var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) {\n          var s = e.start();\n          return [ s.x, s.y ];\n        }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : [];\n        polygon.point = data[i];\n      });\n      return polygons;\n    }\n    function sites(data) {\n      return data.map(function(d, i) {\n        return {\n          x: Math.round(fx(d, i) / ε) * ε,\n          y: Math.round(fy(d, i) / ε) * ε,\n          i: i\n        };\n      });\n    }\n    voronoi.links = function(data) {\n      return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {\n        return edge.l && edge.r;\n      }).map(function(edge) {\n        return {\n          source: data[edge.l.i],\n          target: data[edge.r.i]\n        };\n      });\n    };\n    voronoi.triangles = function(data) {\n      var triangles = [];\n      d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {\n        var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l;\n        while (++j < m) {\n          e0 = e1;\n          s0 = s1;\n          e1 = edges[j].edge;\n          s1 = e1.l === site ? e1.r : e1.l;\n          if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {\n            triangles.push([ data[i], data[s0.i], data[s1.i] ]);\n          }\n        }\n      });\n      return triangles;\n    };\n    voronoi.x = function(_) {\n      return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;\n    };\n    voronoi.y = function(_) {\n      return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;\n    };\n    voronoi.clipExtent = function(_) {\n      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;\n      clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;\n      return voronoi;\n    };\n    voronoi.size = function(_) {\n      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];\n      return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]);\n    };\n    return voronoi;\n  };\n  var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ];\n  function d3_geom_voronoiTriangleArea(a, b, c) {\n    return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);\n  }\n  d3.geom.delaunay = function(vertices) {\n    return d3.geom.voronoi().triangles(vertices);\n  };\n  d3.geom.quadtree = function(points, x1, y1, x2, y2) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, compat;\n    if (compat = arguments.length) {\n      x = d3_geom_quadtreeCompatX;\n      y = d3_geom_quadtreeCompatY;\n      if (compat === 3) {\n        y2 = y1;\n        x2 = x1;\n        y1 = x1 = 0;\n      }\n      return quadtree(points);\n    }\n    function quadtree(data) {\n      var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_;\n      if (x1 != null) {\n        x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2;\n      } else {\n        x2_ = y2_ = -(x1_ = y1_ = Infinity);\n        xs = [], ys = [];\n        n = data.length;\n        if (compat) for (i = 0; i < n; ++i) {\n          d = data[i];\n          if (d.x < x1_) x1_ = d.x;\n          if (d.y < y1_) y1_ = d.y;\n          if (d.x > x2_) x2_ = d.x;\n          if (d.y > y2_) y2_ = d.y;\n          xs.push(d.x);\n          ys.push(d.y);\n        } else for (i = 0; i < n; ++i) {\n          var x_ = +fx(d = data[i], i), y_ = +fy(d, i);\n          if (x_ < x1_) x1_ = x_;\n          if (y_ < y1_) y1_ = y_;\n          if (x_ > x2_) x2_ = x_;\n          if (y_ > y2_) y2_ = y_;\n          xs.push(x_);\n          ys.push(y_);\n        }\n      }\n      var dx = x2_ - x1_, dy = y2_ - y1_;\n      if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy;\n      function insert(n, d, x, y, x1, y1, x2, y2) {\n        if (isNaN(x) || isNaN(y)) return;\n        if (n.leaf) {\n          var nx = n.x, ny = n.y;\n          if (nx != null) {\n            if (abs(nx - x) + abs(ny - y) < .01) {\n              insertChild(n, d, x, y, x1, y1, x2, y2);\n            } else {\n              var nPoint = n.point;\n              n.x = n.y = n.point = null;\n              insertChild(n, nPoint, nx, ny, x1, y1, x2, y2);\n              insertChild(n, d, x, y, x1, y1, x2, y2);\n            }\n          } else {\n            n.x = x, n.y = y, n.point = d;\n          }\n        } else {\n          insertChild(n, d, x, y, x1, y1, x2, y2);\n        }\n      }\n      function insertChild(n, d, x, y, x1, y1, x2, y2) {\n        var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, right = x >= sx, bottom = y >= sy, i = (bottom << 1) + right;\n        n.leaf = false;\n        n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());\n        if (right) x1 = sx; else x2 = sx;\n        if (bottom) y1 = sy; else y2 = sy;\n        insert(n, d, x, y, x1, y1, x2, y2);\n      }\n      var root = d3_geom_quadtreeNode();\n      root.add = function(d) {\n        insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_);\n      };\n      root.visit = function(f) {\n        d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_);\n      };\n      i = -1;\n      if (x1 == null) {\n        while (++i < n) {\n          insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_);\n        }\n        --i;\n      } else data.forEach(root.add);\n      xs = ys = data = d = null;\n      return root;\n    }\n    quadtree.x = function(_) {\n      return arguments.length ? (x = _, quadtree) : x;\n    };\n    quadtree.y = function(_) {\n      return arguments.length ? (y = _, quadtree) : y;\n    };\n    quadtree.extent = function(_) {\n      if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ];\n      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0],\n      y2 = +_[1][1];\n      return quadtree;\n    };\n    quadtree.size = function(_) {\n      if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ];\n      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1];\n      return quadtree;\n    };\n    return quadtree;\n  };\n  function d3_geom_quadtreeCompatX(d) {\n    return d.x;\n  }\n  function d3_geom_quadtreeCompatY(d) {\n    return d.y;\n  }\n  function d3_geom_quadtreeNode() {\n    return {\n      leaf: true,\n      nodes: [],\n      point: null,\n      x: null,\n      y: null\n    };\n  }\n  function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {\n    if (!f(node, x1, y1, x2, y2)) {\n      var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;\n      if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);\n      if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);\n      if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);\n      if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);\n    }\n  }\n  d3.interpolateRgb = d3_interpolateRgb;\n  function d3_interpolateRgb(a, b) {\n    a = d3.rgb(a);\n    b = d3.rgb(b);\n    var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;\n    return function(t) {\n      return \"#\" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));\n    };\n  }\n  d3.interpolateObject = d3_interpolateObject;\n  function d3_interpolateObject(a, b) {\n    var i = {}, c = {}, k;\n    for (k in a) {\n      if (k in b) {\n        i[k] = d3_interpolate(a[k], b[k]);\n      } else {\n        c[k] = a[k];\n      }\n    }\n    for (k in b) {\n      if (!(k in a)) {\n        c[k] = b[k];\n      }\n    }\n    return function(t) {\n      for (k in i) c[k] = i[k](t);\n      return c;\n    };\n  }\n  d3.interpolateNumber = d3_interpolateNumber;\n  function d3_interpolateNumber(a, b) {\n    b -= a = +a;\n    return function(t) {\n      return a + b * t;\n    };\n  }\n  d3.interpolateString = d3_interpolateString;\n  function d3_interpolateString(a, b) {\n    var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];\n    a = a + \"\", b = b + \"\";\n    while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) {\n      if ((bs = bm.index) > bi) {\n        bs = b.substring(bi, bs);\n        if (s[i]) s[i] += bs; else s[++i] = bs;\n      }\n      if ((am = am[0]) === (bm = bm[0])) {\n        if (s[i]) s[i] += bm; else s[++i] = bm;\n      } else {\n        s[++i] = null;\n        q.push({\n          i: i,\n          x: d3_interpolateNumber(am, bm)\n        });\n      }\n      bi = d3_interpolate_numberB.lastIndex;\n    }\n    if (bi < b.length) {\n      bs = b.substring(bi);\n      if (s[i]) s[i] += bs; else s[++i] = bs;\n    }\n    return s.length < 2 ? q[0] ? (b = q[0].x, function(t) {\n      return b(t) + \"\";\n    }) : function() {\n      return b;\n    } : (b = q.length, function(t) {\n      for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n      return s.join(\"\");\n    });\n  }\n  var d3_interpolate_numberA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, \"g\");\n  d3.interpolate = d3_interpolate;\n  function d3_interpolate(a, b) {\n    var i = d3.interpolators.length, f;\n    while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;\n    return f;\n  }\n  d3.interpolators = [ function(a, b) {\n    var t = typeof b;\n    return (t === \"string\" ? d3_rgb_names.has(b) || /^(#|rgb\\(|hsl\\()/.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === \"object\" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b);\n  } ];\n  d3.interpolateArray = d3_interpolateArray;\n  function d3_interpolateArray(a, b) {\n    var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;\n    for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));\n    for (;i < na; ++i) c[i] = a[i];\n    for (;i < nb; ++i) c[i] = b[i];\n    return function(t) {\n      for (i = 0; i < n0; ++i) c[i] = x[i](t);\n      return c;\n    };\n  }\n  var d3_ease_default = function() {\n    return d3_identity;\n  };\n  var d3_ease = d3.map({\n    linear: d3_ease_default,\n    poly: d3_ease_poly,\n    quad: function() {\n      return d3_ease_quad;\n    },\n    cubic: function() {\n      return d3_ease_cubic;\n    },\n    sin: function() {\n      return d3_ease_sin;\n    },\n    exp: function() {\n      return d3_ease_exp;\n    },\n    circle: function() {\n      return d3_ease_circle;\n    },\n    elastic: d3_ease_elastic,\n    back: d3_ease_back,\n    bounce: function() {\n      return d3_ease_bounce;\n    }\n  });\n  var d3_ease_mode = d3.map({\n    \"in\": d3_identity,\n    out: d3_ease_reverse,\n    \"in-out\": d3_ease_reflect,\n    \"out-in\": function(f) {\n      return d3_ease_reflect(d3_ease_reverse(f));\n    }\n  });\n  d3.ease = function(name) {\n    var i = name.indexOf(\"-\"), t = i >= 0 ? name.substring(0, i) : name, m = i >= 0 ? name.substring(i + 1) : \"in\";\n    t = d3_ease.get(t) || d3_ease_default;\n    m = d3_ease_mode.get(m) || d3_identity;\n    return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));\n  };\n  function d3_ease_clamp(f) {\n    return function(t) {\n      return t <= 0 ? 0 : t >= 1 ? 1 : f(t);\n    };\n  }\n  function d3_ease_reverse(f) {\n    return function(t) {\n      return 1 - f(1 - t);\n    };\n  }\n  function d3_ease_reflect(f) {\n    return function(t) {\n      return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));\n    };\n  }\n  function d3_ease_quad(t) {\n    return t * t;\n  }\n  function d3_ease_cubic(t) {\n    return t * t * t;\n  }\n  function d3_ease_cubicInOut(t) {\n    if (t <= 0) return 0;\n    if (t >= 1) return 1;\n    var t2 = t * t, t3 = t2 * t;\n    return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);\n  }\n  function d3_ease_poly(e) {\n    return function(t) {\n      return Math.pow(t, e);\n    };\n  }\n  function d3_ease_sin(t) {\n    return 1 - Math.cos(t * halfπ);\n  }\n  function d3_ease_exp(t) {\n    return Math.pow(2, 10 * (t - 1));\n  }\n  function d3_ease_circle(t) {\n    return 1 - Math.sqrt(1 - t * t);\n  }\n  function d3_ease_elastic(a, p) {\n    var s;\n    if (arguments.length < 2) p = .45;\n    if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4;\n    return function(t) {\n      return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p);\n    };\n  }\n  function d3_ease_back(s) {\n    if (!s) s = 1.70158;\n    return function(t) {\n      return t * t * ((s + 1) * t - s);\n    };\n  }\n  function d3_ease_bounce(t) {\n    return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;\n  }\n  d3.interpolateHcl = d3_interpolateHcl;\n  function d3_interpolateHcl(a, b) {\n    a = d3.hcl(a);\n    b = d3.hcl(b);\n    var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;\n    if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac;\n    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n    return function(t) {\n      return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + \"\";\n    };\n  }\n  d3.interpolateHsl = d3_interpolateHsl;\n  function d3_interpolateHsl(a, b) {\n    a = d3.hsl(a);\n    b = d3.hsl(b);\n    var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al;\n    if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as;\n    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n    return function(t) {\n      return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + \"\";\n    };\n  }\n  d3.interpolateLab = d3_interpolateLab;\n  function d3_interpolateLab(a, b) {\n    a = d3.lab(a);\n    b = d3.lab(b);\n    var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;\n    return function(t) {\n      return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + \"\";\n    };\n  }\n  d3.interpolateRound = d3_interpolateRound;\n  function d3_interpolateRound(a, b) {\n    b -= a;\n    return function(t) {\n      return Math.round(a + b * t);\n    };\n  }\n  d3.transform = function(string) {\n    var g = d3_document.createElementNS(d3.ns.prefix.svg, \"g\");\n    return (d3.transform = function(string) {\n      if (string != null) {\n        g.setAttribute(\"transform\", string);\n        var t = g.transform.baseVal.consolidate();\n      }\n      return new d3_transform(t ? t.matrix : d3_transformIdentity);\n    })(string);\n  };\n  function d3_transform(m) {\n    var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;\n    if (r0[0] * r1[1] < r1[0] * r0[1]) {\n      r0[0] *= -1;\n      r0[1] *= -1;\n      kx *= -1;\n      kz *= -1;\n    }\n    this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;\n    this.translate = [ m.e, m.f ];\n    this.scale = [ kx, ky ];\n    this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;\n  }\n  d3_transform.prototype.toString = function() {\n    return \"translate(\" + this.translate + \")rotate(\" + this.rotate + \")skewX(\" + this.skew + \")scale(\" + this.scale + \")\";\n  };\n  function d3_transformDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1];\n  }\n  function d3_transformNormalize(a) {\n    var k = Math.sqrt(d3_transformDot(a, a));\n    if (k) {\n      a[0] /= k;\n      a[1] /= k;\n    }\n    return k;\n  }\n  function d3_transformCombine(a, b, k) {\n    a[0] += k * b[0];\n    a[1] += k * b[1];\n    return a;\n  }\n  var d3_transformIdentity = {\n    a: 1,\n    b: 0,\n    c: 0,\n    d: 1,\n    e: 0,\n    f: 0\n  };\n  d3.interpolateTransform = d3_interpolateTransform;\n  function d3_interpolateTransform(a, b) {\n    var s = [], q = [], n, A = d3.transform(a), B = d3.transform(b), ta = A.translate, tb = B.translate, ra = A.rotate, rb = B.rotate, wa = A.skew, wb = B.skew, ka = A.scale, kb = B.scale;\n    if (ta[0] != tb[0] || ta[1] != tb[1]) {\n      s.push(\"translate(\", null, \",\", null, \")\");\n      q.push({\n        i: 1,\n        x: d3_interpolateNumber(ta[0], tb[0])\n      }, {\n        i: 3,\n        x: d3_interpolateNumber(ta[1], tb[1])\n      });\n    } else if (tb[0] || tb[1]) {\n      s.push(\"translate(\" + tb + \")\");\n    } else {\n      s.push(\"\");\n    }\n    if (ra != rb) {\n      if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;\n      q.push({\n        i: s.push(s.pop() + \"rotate(\", null, \")\") - 2,\n        x: d3_interpolateNumber(ra, rb)\n      });\n    } else if (rb) {\n      s.push(s.pop() + \"rotate(\" + rb + \")\");\n    }\n    if (wa != wb) {\n      q.push({\n        i: s.push(s.pop() + \"skewX(\", null, \")\") - 2,\n        x: d3_interpolateNumber(wa, wb)\n      });\n    } else if (wb) {\n      s.push(s.pop() + \"skewX(\" + wb + \")\");\n    }\n    if (ka[0] != kb[0] || ka[1] != kb[1]) {\n      n = s.push(s.pop() + \"scale(\", null, \",\", null, \")\");\n      q.push({\n        i: n - 4,\n        x: d3_interpolateNumber(ka[0], kb[0])\n      }, {\n        i: n - 2,\n        x: d3_interpolateNumber(ka[1], kb[1])\n      });\n    } else if (kb[0] != 1 || kb[1] != 1) {\n      s.push(s.pop() + \"scale(\" + kb + \")\");\n    }\n    n = q.length;\n    return function(t) {\n      var i = -1, o;\n      while (++i < n) s[(o = q[i]).i] = o.x(t);\n      return s.join(\"\");\n    };\n  }\n  function d3_uninterpolateNumber(a, b) {\n    b = b - (a = +a) ? 1 / (b - a) : 0;\n    return function(x) {\n      return (x - a) * b;\n    };\n  }\n  function d3_uninterpolateClamp(a, b) {\n    b = b - (a = +a) ? 1 / (b - a) : 0;\n    return function(x) {\n      return Math.max(0, Math.min(1, (x - a) * b));\n    };\n  }\n  d3.layout = {};\n  d3.layout.bundle = function() {\n    return function(links) {\n      var paths = [], i = -1, n = links.length;\n      while (++i < n) paths.push(d3_layout_bundlePath(links[i]));\n      return paths;\n    };\n  };\n  function d3_layout_bundlePath(link) {\n    var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];\n    while (start !== lca) {\n      start = start.parent;\n      points.push(start);\n    }\n    var k = points.length;\n    while (end !== lca) {\n      points.splice(k, 0, end);\n      end = end.parent;\n    }\n    return points;\n  }\n  function d3_layout_bundleAncestors(node) {\n    var ancestors = [], parent = node.parent;\n    while (parent != null) {\n      ancestors.push(node);\n      node = parent;\n      parent = parent.parent;\n    }\n    ancestors.push(node);\n    return ancestors;\n  }\n  function d3_layout_bundleLeastCommonAncestor(a, b) {\n    if (a === b) return a;\n    var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;\n    while (aNode === bNode) {\n      sharedNode = aNode;\n      aNode = aNodes.pop();\n      bNode = bNodes.pop();\n    }\n    return sharedNode;\n  }\n  d3.layout.chord = function() {\n    var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;\n    function relayout() {\n      var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;\n      chords = [];\n      groups = [];\n      k = 0, i = -1;\n      while (++i < n) {\n        x = 0, j = -1;\n        while (++j < n) {\n          x += matrix[i][j];\n        }\n        groupSums.push(x);\n        subgroupIndex.push(d3.range(n));\n        k += x;\n      }\n      if (sortGroups) {\n        groupIndex.sort(function(a, b) {\n          return sortGroups(groupSums[a], groupSums[b]);\n        });\n      }\n      if (sortSubgroups) {\n        subgroupIndex.forEach(function(d, i) {\n          d.sort(function(a, b) {\n            return sortSubgroups(matrix[i][a], matrix[i][b]);\n          });\n        });\n      }\n      k = (τ - padding * n) / k;\n      x = 0, i = -1;\n      while (++i < n) {\n        x0 = x, j = -1;\n        while (++j < n) {\n          var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;\n          subgroups[di + \"-\" + dj] = {\n            index: di,\n            subindex: dj,\n            startAngle: a0,\n            endAngle: a1,\n            value: v\n          };\n        }\n        groups[di] = {\n          index: di,\n          startAngle: x0,\n          endAngle: x,\n          value: (x - x0) / k\n        };\n        x += padding;\n      }\n      i = -1;\n      while (++i < n) {\n        j = i - 1;\n        while (++j < n) {\n          var source = subgroups[i + \"-\" + j], target = subgroups[j + \"-\" + i];\n          if (source.value || target.value) {\n            chords.push(source.value < target.value ? {\n              source: target,\n              target: source\n            } : {\n              source: source,\n              target: target\n            });\n          }\n        }\n      }\n      if (sortChords) resort();\n    }\n    function resort() {\n      chords.sort(function(a, b) {\n        return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);\n      });\n    }\n    chord.matrix = function(x) {\n      if (!arguments.length) return matrix;\n      n = (matrix = x) && matrix.length;\n      chords = groups = null;\n      return chord;\n    };\n    chord.padding = function(x) {\n      if (!arguments.length) return padding;\n      padding = x;\n      chords = groups = null;\n      return chord;\n    };\n    chord.sortGroups = function(x) {\n      if (!arguments.length) return sortGroups;\n      sortGroups = x;\n      chords = groups = null;\n      return chord;\n    };\n    chord.sortSubgroups = function(x) {\n      if (!arguments.length) return sortSubgroups;\n      sortSubgroups = x;\n      chords = null;\n      return chord;\n    };\n    chord.sortChords = function(x) {\n      if (!arguments.length) return sortChords;\n      sortChords = x;\n      if (chords) resort();\n      return chord;\n    };\n    chord.chords = function() {\n      if (!chords) relayout();\n      return chords;\n    };\n    chord.groups = function() {\n      if (!groups) relayout();\n      return groups;\n    };\n    return chord;\n  };\n  d3.layout.force = function() {\n    var force = {}, event = d3.dispatch(\"start\", \"tick\", \"end\"), size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges;\n    function repulse(node) {\n      return function(quad, x1, _, x2) {\n        if (quad.point !== node) {\n          var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy;\n          if (dw * dw / theta2 < dn) {\n            if (dn < chargeDistance2) {\n              var k = quad.charge / dn;\n              node.px -= dx * k;\n              node.py -= dy * k;\n            }\n            return true;\n          }\n          if (quad.point && dn && dn < chargeDistance2) {\n            var k = quad.pointCharge / dn;\n            node.px -= dx * k;\n            node.py -= dy * k;\n          }\n        }\n        return !quad.charge;\n      };\n    }\n    force.tick = function() {\n      if ((alpha *= .99) < .005) {\n        event.end({\n          type: \"end\",\n          alpha: alpha = 0\n        });\n        return true;\n      }\n      var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;\n      for (i = 0; i < m; ++i) {\n        o = links[i];\n        s = o.source;\n        t = o.target;\n        x = t.x - s.x;\n        y = t.y - s.y;\n        if (l = x * x + y * y) {\n          l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;\n          x *= l;\n          y *= l;\n          t.x -= x * (k = s.weight / (t.weight + s.weight));\n          t.y -= y * k;\n          s.x += x * (k = 1 - k);\n          s.y += y * k;\n        }\n      }\n      if (k = alpha * gravity) {\n        x = size[0] / 2;\n        y = size[1] / 2;\n        i = -1;\n        if (k) while (++i < n) {\n          o = nodes[i];\n          o.x += (x - o.x) * k;\n          o.y += (y - o.y) * k;\n        }\n      }\n      if (charge) {\n        d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);\n        i = -1;\n        while (++i < n) {\n          if (!(o = nodes[i]).fixed) {\n            q.visit(repulse(o));\n          }\n        }\n      }\n      i = -1;\n      while (++i < n) {\n        o = nodes[i];\n        if (o.fixed) {\n          o.x = o.px;\n          o.y = o.py;\n        } else {\n          o.x -= (o.px - (o.px = o.x)) * friction;\n          o.y -= (o.py - (o.py = o.y)) * friction;\n        }\n      }\n      event.tick({\n        type: \"tick\",\n        alpha: alpha\n      });\n    };\n    force.nodes = function(x) {\n      if (!arguments.length) return nodes;\n      nodes = x;\n      return force;\n    };\n    force.links = function(x) {\n      if (!arguments.length) return links;\n      links = x;\n      return force;\n    };\n    force.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return force;\n    };\n    force.linkDistance = function(x) {\n      if (!arguments.length) return linkDistance;\n      linkDistance = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.distance = force.linkDistance;\n    force.linkStrength = function(x) {\n      if (!arguments.length) return linkStrength;\n      linkStrength = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.friction = function(x) {\n      if (!arguments.length) return friction;\n      friction = +x;\n      return force;\n    };\n    force.charge = function(x) {\n      if (!arguments.length) return charge;\n      charge = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.chargeDistance = function(x) {\n      if (!arguments.length) return Math.sqrt(chargeDistance2);\n      chargeDistance2 = x * x;\n      return force;\n    };\n    force.gravity = function(x) {\n      if (!arguments.length) return gravity;\n      gravity = +x;\n      return force;\n    };\n    force.theta = function(x) {\n      if (!arguments.length) return Math.sqrt(theta2);\n      theta2 = x * x;\n      return force;\n    };\n    force.alpha = function(x) {\n      if (!arguments.length) return alpha;\n      x = +x;\n      if (alpha) {\n        if (x > 0) alpha = x; else alpha = 0;\n      } else if (x > 0) {\n        event.start({\n          type: \"start\",\n          alpha: alpha = x\n        });\n        d3.timer(force.tick);\n      }\n      return force;\n    };\n    force.start = function() {\n      var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;\n      for (i = 0; i < n; ++i) {\n        (o = nodes[i]).index = i;\n        o.weight = 0;\n      }\n      for (i = 0; i < m; ++i) {\n        o = links[i];\n        if (typeof o.source == \"number\") o.source = nodes[o.source];\n        if (typeof o.target == \"number\") o.target = nodes[o.target];\n        ++o.source.weight;\n        ++o.target.weight;\n      }\n      for (i = 0; i < n; ++i) {\n        o = nodes[i];\n        if (isNaN(o.x)) o.x = position(\"x\", w);\n        if (isNaN(o.y)) o.y = position(\"y\", h);\n        if (isNaN(o.px)) o.px = o.x;\n        if (isNaN(o.py)) o.py = o.y;\n      }\n      distances = [];\n      if (typeof linkDistance === \"function\") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;\n      strengths = [];\n      if (typeof linkStrength === \"function\") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;\n      charges = [];\n      if (typeof charge === \"function\") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;\n      function position(dimension, size) {\n        if (!neighbors) {\n          neighbors = new Array(n);\n          for (j = 0; j < n; ++j) {\n            neighbors[j] = [];\n          }\n          for (j = 0; j < m; ++j) {\n            var o = links[j];\n            neighbors[o.source.index].push(o.target);\n            neighbors[o.target.index].push(o.source);\n          }\n        }\n        var candidates = neighbors[i], j = -1, m = candidates.length, x;\n        while (++j < m) if (!isNaN(x = candidates[j][dimension])) return x;\n        return Math.random() * size;\n      }\n      return force.resume();\n    };\n    force.resume = function() {\n      return force.alpha(.1);\n    };\n    force.stop = function() {\n      return force.alpha(0);\n    };\n    force.drag = function() {\n      if (!drag) drag = d3.behavior.drag().origin(d3_identity).on(\"dragstart.force\", d3_layout_forceDragstart).on(\"drag.force\", dragmove).on(\"dragend.force\", d3_layout_forceDragend);\n      if (!arguments.length) return drag;\n      this.on(\"mouseover.force\", d3_layout_forceMouseover).on(\"mouseout.force\", d3_layout_forceMouseout).call(drag);\n    };\n    function dragmove(d) {\n      d.px = d3.event.x, d.py = d3.event.y;\n      force.resume();\n    }\n    return d3.rebind(force, event, \"on\");\n  };\n  function d3_layout_forceDragstart(d) {\n    d.fixed |= 2;\n  }\n  function d3_layout_forceDragend(d) {\n    d.fixed &= ~6;\n  }\n  function d3_layout_forceMouseover(d) {\n    d.fixed |= 4;\n    d.px = d.x, d.py = d.y;\n  }\n  function d3_layout_forceMouseout(d) {\n    d.fixed &= ~4;\n  }\n  function d3_layout_forceAccumulate(quad, alpha, charges) {\n    var cx = 0, cy = 0;\n    quad.charge = 0;\n    if (!quad.leaf) {\n      var nodes = quad.nodes, n = nodes.length, i = -1, c;\n      while (++i < n) {\n        c = nodes[i];\n        if (c == null) continue;\n        d3_layout_forceAccumulate(c, alpha, charges);\n        quad.charge += c.charge;\n        cx += c.charge * c.cx;\n        cy += c.charge * c.cy;\n      }\n    }\n    if (quad.point) {\n      if (!quad.leaf) {\n        quad.point.x += Math.random() - .5;\n        quad.point.y += Math.random() - .5;\n      }\n      var k = alpha * charges[quad.point.index];\n      quad.charge += quad.pointCharge = k;\n      cx += k * quad.point.x;\n      cy += k * quad.point.y;\n    }\n    quad.cx = cx / quad.charge;\n    quad.cy = cy / quad.charge;\n  }\n  var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity;\n  d3.layout.hierarchy = function() {\n    var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;\n    function hierarchy(root) {\n      var stack = [ root ], nodes = [], node;\n      root.depth = 0;\n      while ((node = stack.pop()) != null) {\n        nodes.push(node);\n        if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) {\n          var n, childs, child;\n          while (--n >= 0) {\n            stack.push(child = childs[n]);\n            child.parent = node;\n            child.depth = node.depth + 1;\n          }\n          if (value) node.value = 0;\n          node.children = childs;\n        } else {\n          if (value) node.value = +value.call(hierarchy, node, node.depth) || 0;\n          delete node.children;\n        }\n      }\n      d3_layout_hierarchyVisitAfter(root, function(node) {\n        var childs, parent;\n        if (sort && (childs = node.children)) childs.sort(sort);\n        if (value && (parent = node.parent)) parent.value += node.value;\n      });\n      return nodes;\n    }\n    hierarchy.sort = function(x) {\n      if (!arguments.length) return sort;\n      sort = x;\n      return hierarchy;\n    };\n    hierarchy.children = function(x) {\n      if (!arguments.length) return children;\n      children = x;\n      return hierarchy;\n    };\n    hierarchy.value = function(x) {\n      if (!arguments.length) return value;\n      value = x;\n      return hierarchy;\n    };\n    hierarchy.revalue = function(root) {\n      if (value) {\n        d3_layout_hierarchyVisitBefore(root, function(node) {\n          if (node.children) node.value = 0;\n        });\n        d3_layout_hierarchyVisitAfter(root, function(node) {\n          var parent;\n          if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0;\n          if (parent = node.parent) parent.value += node.value;\n        });\n      }\n      return root;\n    };\n    return hierarchy;\n  };\n  function d3_layout_hierarchyRebind(object, hierarchy) {\n    d3.rebind(object, hierarchy, \"sort\", \"children\", \"value\");\n    object.nodes = object;\n    object.links = d3_layout_hierarchyLinks;\n    return object;\n  }\n  function d3_layout_hierarchyVisitBefore(node, callback) {\n    var nodes = [ node ];\n    while ((node = nodes.pop()) != null) {\n      callback(node);\n      if ((children = node.children) && (n = children.length)) {\n        var n, children;\n        while (--n >= 0) nodes.push(children[n]);\n      }\n    }\n  }\n  function d3_layout_hierarchyVisitAfter(node, callback) {\n    var nodes = [ node ], nodes2 = [];\n    while ((node = nodes.pop()) != null) {\n      nodes2.push(node);\n      if ((children = node.children) && (n = children.length)) {\n        var i = -1, n, children;\n        while (++i < n) nodes.push(children[i]);\n      }\n    }\n    while ((node = nodes2.pop()) != null) {\n      callback(node);\n    }\n  }\n  function d3_layout_hierarchyChildren(d) {\n    return d.children;\n  }\n  function d3_layout_hierarchyValue(d) {\n    return d.value;\n  }\n  function d3_layout_hierarchySort(a, b) {\n    return b.value - a.value;\n  }\n  function d3_layout_hierarchyLinks(nodes) {\n    return d3.merge(nodes.map(function(parent) {\n      return (parent.children || []).map(function(child) {\n        return {\n          source: parent,\n          target: child\n        };\n      });\n    }));\n  }\n  d3.layout.partition = function() {\n    var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];\n    function position(node, x, dx, dy) {\n      var children = node.children;\n      node.x = x;\n      node.y = node.depth * dy;\n      node.dx = dx;\n      node.dy = dy;\n      if (children && (n = children.length)) {\n        var i = -1, n, c, d;\n        dx = node.value ? dx / node.value : 0;\n        while (++i < n) {\n          position(c = children[i], x, d = c.value * dx, dy);\n          x += d;\n        }\n      }\n    }\n    function depth(node) {\n      var children = node.children, d = 0;\n      if (children && (n = children.length)) {\n        var i = -1, n;\n        while (++i < n) d = Math.max(d, depth(children[i]));\n      }\n      return 1 + d;\n    }\n    function partition(d, i) {\n      var nodes = hierarchy.call(this, d, i);\n      position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));\n      return nodes;\n    }\n    partition.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return partition;\n    };\n    return d3_layout_hierarchyRebind(partition, hierarchy);\n  };\n  d3.layout.pie = function() {\n    var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ;\n    function pie(data) {\n      var values = data.map(function(d, i) {\n        return +value.call(pie, d, i);\n      });\n      var a = +(typeof startAngle === \"function\" ? startAngle.apply(this, arguments) : startAngle);\n      var k = ((typeof endAngle === \"function\" ? endAngle.apply(this, arguments) : endAngle) - a) / d3.sum(values);\n      var index = d3.range(data.length);\n      if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {\n        return values[j] - values[i];\n      } : function(i, j) {\n        return sort(data[i], data[j]);\n      });\n      var arcs = [];\n      index.forEach(function(i) {\n        var d;\n        arcs[i] = {\n          data: data[i],\n          value: d = values[i],\n          startAngle: a,\n          endAngle: a += d * k\n        };\n      });\n      return arcs;\n    }\n    pie.value = function(x) {\n      if (!arguments.length) return value;\n      value = x;\n      return pie;\n    };\n    pie.sort = function(x) {\n      if (!arguments.length) return sort;\n      sort = x;\n      return pie;\n    };\n    pie.startAngle = function(x) {\n      if (!arguments.length) return startAngle;\n      startAngle = x;\n      return pie;\n    };\n    pie.endAngle = function(x) {\n      if (!arguments.length) return endAngle;\n      endAngle = x;\n      return pie;\n    };\n    return pie;\n  };\n  var d3_layout_pieSortByValue = {};\n  d3.layout.stack = function() {\n    var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;\n    function stack(data, index) {\n      var series = data.map(function(d, i) {\n        return values.call(stack, d, i);\n      });\n      var points = series.map(function(d) {\n        return d.map(function(v, i) {\n          return [ x.call(stack, v, i), y.call(stack, v, i) ];\n        });\n      });\n      var orders = order.call(stack, points, index);\n      series = d3.permute(series, orders);\n      points = d3.permute(points, orders);\n      var offsets = offset.call(stack, points, index);\n      var n = series.length, m = series[0].length, i, j, o;\n      for (j = 0; j < m; ++j) {\n        out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);\n        for (i = 1; i < n; ++i) {\n          out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);\n        }\n      }\n      return data;\n    }\n    stack.values = function(x) {\n      if (!arguments.length) return values;\n      values = x;\n      return stack;\n    };\n    stack.order = function(x) {\n      if (!arguments.length) return order;\n      order = typeof x === \"function\" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;\n      return stack;\n    };\n    stack.offset = function(x) {\n      if (!arguments.length) return offset;\n      offset = typeof x === \"function\" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;\n      return stack;\n    };\n    stack.x = function(z) {\n      if (!arguments.length) return x;\n      x = z;\n      return stack;\n    };\n    stack.y = function(z) {\n      if (!arguments.length) return y;\n      y = z;\n      return stack;\n    };\n    stack.out = function(z) {\n      if (!arguments.length) return out;\n      out = z;\n      return stack;\n    };\n    return stack;\n  };\n  function d3_layout_stackX(d) {\n    return d.x;\n  }\n  function d3_layout_stackY(d) {\n    return d.y;\n  }\n  function d3_layout_stackOut(d, y0, y) {\n    d.y0 = y0;\n    d.y = y;\n  }\n  var d3_layout_stackOrders = d3.map({\n    \"inside-out\": function(data) {\n      var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {\n        return max[a] - max[b];\n      }), top = 0, bottom = 0, tops = [], bottoms = [];\n      for (i = 0; i < n; ++i) {\n        j = index[i];\n        if (top < bottom) {\n          top += sums[j];\n          tops.push(j);\n        } else {\n          bottom += sums[j];\n          bottoms.push(j);\n        }\n      }\n      return bottoms.reverse().concat(tops);\n    },\n    reverse: function(data) {\n      return d3.range(data.length).reverse();\n    },\n    \"default\": d3_layout_stackOrderDefault\n  });\n  var d3_layout_stackOffsets = d3.map({\n    silhouette: function(data) {\n      var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];\n      for (j = 0; j < m; ++j) {\n        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n        if (o > max) max = o;\n        sums.push(o);\n      }\n      for (j = 0; j < m; ++j) {\n        y0[j] = (max - sums[j]) / 2;\n      }\n      return y0;\n    },\n    wiggle: function(data) {\n      var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];\n      y0[0] = o = o0 = 0;\n      for (j = 1; j < m; ++j) {\n        for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];\n        for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {\n          for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {\n            s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;\n          }\n          s2 += s3 * data[i][j][1];\n        }\n        y0[j] = o -= s1 ? s2 / s1 * dx : 0;\n        if (o < o0) o0 = o;\n      }\n      for (j = 0; j < m; ++j) y0[j] -= o0;\n      return y0;\n    },\n    expand: function(data) {\n      var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];\n      for (j = 0; j < m; ++j) {\n        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n        if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;\n      }\n      for (j = 0; j < m; ++j) y0[j] = 0;\n      return y0;\n    },\n    zero: d3_layout_stackOffsetZero\n  });\n  function d3_layout_stackOrderDefault(data) {\n    return d3.range(data.length);\n  }\n  function d3_layout_stackOffsetZero(data) {\n    var j = -1, m = data[0].length, y0 = [];\n    while (++j < m) y0[j] = 0;\n    return y0;\n  }\n  function d3_layout_stackMaxIndex(array) {\n    var i = 1, j = 0, v = array[0][1], k, n = array.length;\n    for (;i < n; ++i) {\n      if ((k = array[i][1]) > v) {\n        j = i;\n        v = k;\n      }\n    }\n    return j;\n  }\n  function d3_layout_stackReduceSum(d) {\n    return d.reduce(d3_layout_stackSum, 0);\n  }\n  function d3_layout_stackSum(p, d) {\n    return p + d[1];\n  }\n  d3.layout.histogram = function() {\n    var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;\n    function histogram(data, i) {\n      var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;\n      while (++i < m) {\n        bin = bins[i] = [];\n        bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);\n        bin.y = 0;\n      }\n      if (m > 0) {\n        i = -1;\n        while (++i < n) {\n          x = values[i];\n          if (x >= range[0] && x <= range[1]) {\n            bin = bins[d3.bisect(thresholds, x, 1, m) - 1];\n            bin.y += k;\n            bin.push(data[i]);\n          }\n        }\n      }\n      return bins;\n    }\n    histogram.value = function(x) {\n      if (!arguments.length) return valuer;\n      valuer = x;\n      return histogram;\n    };\n    histogram.range = function(x) {\n      if (!arguments.length) return ranger;\n      ranger = d3_functor(x);\n      return histogram;\n    };\n    histogram.bins = function(x) {\n      if (!arguments.length) return binner;\n      binner = typeof x === \"number\" ? function(range) {\n        return d3_layout_histogramBinFixed(range, x);\n      } : d3_functor(x);\n      return histogram;\n    };\n    histogram.frequency = function(x) {\n      if (!arguments.length) return frequency;\n      frequency = !!x;\n      return histogram;\n    };\n    return histogram;\n  };\n  function d3_layout_histogramBinSturges(range, values) {\n    return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));\n  }\n  function d3_layout_histogramBinFixed(range, n) {\n    var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];\n    while (++x <= n) f[x] = m * x + b;\n    return f;\n  }\n  function d3_layout_histogramRange(values) {\n    return [ d3.min(values), d3.max(values) ];\n  }\n  d3.layout.pack = function() {\n    var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius;\n    function pack(d, i) {\n      var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === \"function\" ? radius : function() {\n        return radius;\n      };\n      root.x = root.y = 0;\n      d3_layout_hierarchyVisitAfter(root, function(d) {\n        d.r = +r(d.value);\n      });\n      d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n      if (padding) {\n        var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2;\n        d3_layout_hierarchyVisitAfter(root, function(d) {\n          d.r += dr;\n        });\n        d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n        d3_layout_hierarchyVisitAfter(root, function(d) {\n          d.r -= dr;\n        });\n      }\n      d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h));\n      return nodes;\n    }\n    pack.size = function(_) {\n      if (!arguments.length) return size;\n      size = _;\n      return pack;\n    };\n    pack.radius = function(_) {\n      if (!arguments.length) return radius;\n      radius = _ == null || typeof _ === \"function\" ? _ : +_;\n      return pack;\n    };\n    pack.padding = function(_) {\n      if (!arguments.length) return padding;\n      padding = +_;\n      return pack;\n    };\n    return d3_layout_hierarchyRebind(pack, hierarchy);\n  };\n  function d3_layout_packSort(a, b) {\n    return a.value - b.value;\n  }\n  function d3_layout_packInsert(a, b) {\n    var c = a._pack_next;\n    a._pack_next = b;\n    b._pack_prev = a;\n    b._pack_next = c;\n    c._pack_prev = b;\n  }\n  function d3_layout_packSplice(a, b) {\n    a._pack_next = b;\n    b._pack_prev = a;\n  }\n  function d3_layout_packIntersects(a, b) {\n    var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;\n    return .999 * dr * dr > dx * dx + dy * dy;\n  }\n  function d3_layout_packSiblings(node) {\n    if (!(nodes = node.children) || !(n = nodes.length)) return;\n    var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;\n    function bound(node) {\n      xMin = Math.min(node.x - node.r, xMin);\n      xMax = Math.max(node.x + node.r, xMax);\n      yMin = Math.min(node.y - node.r, yMin);\n      yMax = Math.max(node.y + node.r, yMax);\n    }\n    nodes.forEach(d3_layout_packLink);\n    a = nodes[0];\n    a.x = -a.r;\n    a.y = 0;\n    bound(a);\n    if (n > 1) {\n      b = nodes[1];\n      b.x = b.r;\n      b.y = 0;\n      bound(b);\n      if (n > 2) {\n        c = nodes[2];\n        d3_layout_packPlace(a, b, c);\n        bound(c);\n        d3_layout_packInsert(a, c);\n        a._pack_prev = c;\n        d3_layout_packInsert(c, b);\n        b = a._pack_next;\n        for (i = 3; i < n; i++) {\n          d3_layout_packPlace(a, b, c = nodes[i]);\n          var isect = 0, s1 = 1, s2 = 1;\n          for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {\n            if (d3_layout_packIntersects(j, c)) {\n              isect = 1;\n              break;\n            }\n          }\n          if (isect == 1) {\n            for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {\n              if (d3_layout_packIntersects(k, c)) {\n                break;\n              }\n            }\n          }\n          if (isect) {\n            if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);\n            i--;\n          } else {\n            d3_layout_packInsert(a, c);\n            b = c;\n            bound(c);\n          }\n        }\n      }\n    }\n    var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;\n    for (i = 0; i < n; i++) {\n      c = nodes[i];\n      c.x -= cx;\n      c.y -= cy;\n      cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));\n    }\n    node.r = cr;\n    nodes.forEach(d3_layout_packUnlink);\n  }\n  function d3_layout_packLink(node) {\n    node._pack_next = node._pack_prev = node;\n  }\n  function d3_layout_packUnlink(node) {\n    delete node._pack_next;\n    delete node._pack_prev;\n  }\n  function d3_layout_packTransform(node, x, y, k) {\n    var children = node.children;\n    node.x = x += k * node.x;\n    node.y = y += k * node.y;\n    node.r *= k;\n    if (children) {\n      var i = -1, n = children.length;\n      while (++i < n) d3_layout_packTransform(children[i], x, y, k);\n    }\n  }\n  function d3_layout_packPlace(a, b, c) {\n    var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;\n    if (db && (dx || dy)) {\n      var da = b.r + c.r, dc = dx * dx + dy * dy;\n      da *= da;\n      db *= db;\n      var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);\n      c.x = a.x + x * dx + y * dy;\n      c.y = a.y + x * dy - y * dx;\n    } else {\n      c.x = a.x + db;\n      c.y = a.y;\n    }\n  }\n  d3.layout.tree = function() {\n    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null;\n    function tree(d, i) {\n      var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0);\n      d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z;\n      d3_layout_hierarchyVisitBefore(root1, secondWalk);\n      if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else {\n        var left = root0, right = root0, bottom = root0;\n        d3_layout_hierarchyVisitBefore(root0, function(node) {\n          if (node.x < left.x) left = node;\n          if (node.x > right.x) right = node;\n          if (node.depth > bottom.depth) bottom = node;\n        });\n        var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1);\n        d3_layout_hierarchyVisitBefore(root0, function(node) {\n          node.x = (node.x + tx) * kx;\n          node.y = node.depth * ky;\n        });\n      }\n      return nodes;\n    }\n    function wrapTree(root0) {\n      var root1 = {\n        A: null,\n        children: [ root0 ]\n      }, queue = [ root1 ], node1;\n      while ((node1 = queue.pop()) != null) {\n        for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) {\n          queue.push((children[i] = child = {\n            _: children[i],\n            parent: node1,\n            children: (child = children[i].children) && child.slice() || [],\n            A: null,\n            a: null,\n            z: 0,\n            m: 0,\n            c: 0,\n            s: 0,\n            t: null,\n            i: i\n          }).a = child);\n        }\n      }\n      return root1.children[0];\n    }\n    function firstWalk(v) {\n      var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;\n      if (children.length) {\n        d3_layout_treeShift(v);\n        var midpoint = (children[0].z + children[children.length - 1].z) / 2;\n        if (w) {\n          v.z = w.z + separation(v._, w._);\n          v.m = v.z - midpoint;\n        } else {\n          v.z = midpoint;\n        }\n      } else if (w) {\n        v.z = w.z + separation(v._, w._);\n      }\n      v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\n    }\n    function secondWalk(v) {\n      v._.x = v.z + v.parent.m;\n      v.m += v.parent.m;\n    }\n    function apportion(v, w, ancestor) {\n      if (w) {\n        var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;\n        while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {\n          vom = d3_layout_treeLeft(vom);\n          vop = d3_layout_treeRight(vop);\n          vop.a = v;\n          shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n          if (shift > 0) {\n            d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift);\n            sip += shift;\n            sop += shift;\n          }\n          sim += vim.m;\n          sip += vip.m;\n          som += vom.m;\n          sop += vop.m;\n        }\n        if (vim && !d3_layout_treeRight(vop)) {\n          vop.t = vim;\n          vop.m += sim - sop;\n        }\n        if (vip && !d3_layout_treeLeft(vom)) {\n          vom.t = vip;\n          vom.m += sip - som;\n          ancestor = v;\n        }\n      }\n      return ancestor;\n    }\n    function sizeNode(node) {\n      node.x *= size[0];\n      node.y = node.depth * size[1];\n    }\n    tree.separation = function(x) {\n      if (!arguments.length) return separation;\n      separation = x;\n      return tree;\n    };\n    tree.size = function(x) {\n      if (!arguments.length) return nodeSize ? null : size;\n      nodeSize = (size = x) == null ? sizeNode : null;\n      return tree;\n    };\n    tree.nodeSize = function(x) {\n      if (!arguments.length) return nodeSize ? size : null;\n      nodeSize = (size = x) == null ? null : sizeNode;\n      return tree;\n    };\n    return d3_layout_hierarchyRebind(tree, hierarchy);\n  };\n  function d3_layout_treeSeparation(a, b) {\n    return a.parent == b.parent ? 1 : 2;\n  }\n  function d3_layout_treeLeft(v) {\n    var children = v.children;\n    return children.length ? children[0] : v.t;\n  }\n  function d3_layout_treeRight(v) {\n    var children = v.children, n;\n    return (n = children.length) ? children[n - 1] : v.t;\n  }\n  function d3_layout_treeMove(wm, wp, shift) {\n    var change = shift / (wp.i - wm.i);\n    wp.c -= change;\n    wp.s += shift;\n    wm.c += change;\n    wp.z += shift;\n    wp.m += shift;\n  }\n  function d3_layout_treeShift(v) {\n    var shift = 0, change = 0, children = v.children, i = children.length, w;\n    while (--i >= 0) {\n      w = children[i];\n      w.z += shift;\n      w.m += shift;\n      shift += w.s + (change += w.c);\n    }\n  }\n  function d3_layout_treeAncestor(vim, v, ancestor) {\n    return vim.a.parent === v.parent ? vim.a : ancestor;\n  }\n  d3.layout.cluster = function() {\n    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false;\n    function cluster(d, i) {\n      var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0;\n      d3_layout_hierarchyVisitAfter(root, function(node) {\n        var children = node.children;\n        if (children && children.length) {\n          node.x = d3_layout_clusterX(children);\n          node.y = d3_layout_clusterY(children);\n        } else {\n          node.x = previousNode ? x += separation(node, previousNode) : 0;\n          node.y = 0;\n          previousNode = node;\n        }\n      });\n      var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;\n      d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) {\n        node.x = (node.x - root.x) * size[0];\n        node.y = (root.y - node.y) * size[1];\n      } : function(node) {\n        node.x = (node.x - x0) / (x1 - x0) * size[0];\n        node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];\n      });\n      return nodes;\n    }\n    cluster.separation = function(x) {\n      if (!arguments.length) return separation;\n      separation = x;\n      return cluster;\n    };\n    cluster.size = function(x) {\n      if (!arguments.length) return nodeSize ? null : size;\n      nodeSize = (size = x) == null;\n      return cluster;\n    };\n    cluster.nodeSize = function(x) {\n      if (!arguments.length) return nodeSize ? size : null;\n      nodeSize = (size = x) != null;\n      return cluster;\n    };\n    return d3_layout_hierarchyRebind(cluster, hierarchy);\n  };\n  function d3_layout_clusterY(children) {\n    return 1 + d3.max(children, function(child) {\n      return child.y;\n    });\n  }\n  function d3_layout_clusterX(children) {\n    return children.reduce(function(x, child) {\n      return x + child.x;\n    }, 0) / children.length;\n  }\n  function d3_layout_clusterLeft(node) {\n    var children = node.children;\n    return children && children.length ? d3_layout_clusterLeft(children[0]) : node;\n  }\n  function d3_layout_clusterRight(node) {\n    var children = node.children, n;\n    return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;\n  }\n  d3.layout.treemap = function() {\n    var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = \"squarify\", ratio = .5 * (1 + Math.sqrt(5));\n    function scale(children, k) {\n      var i = -1, n = children.length, child, area;\n      while (++i < n) {\n        area = (child = children[i]).value * (k < 0 ? 0 : k);\n        child.area = isNaN(area) || area <= 0 ? 0 : area;\n      }\n    }\n    function squarify(node) {\n      var children = node.children;\n      if (children && children.length) {\n        var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === \"slice\" ? rect.dx : mode === \"dice\" ? rect.dy : mode === \"slice-dice\" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n;\n        scale(remaining, rect.dx * rect.dy / node.value);\n        row.area = 0;\n        while ((n = remaining.length) > 0) {\n          row.push(child = remaining[n - 1]);\n          row.area += child.area;\n          if (mode !== \"squarify\" || (score = worst(row, u)) <= best) {\n            remaining.pop();\n            best = score;\n          } else {\n            row.area -= row.pop().area;\n            position(row, u, rect, false);\n            u = Math.min(rect.dx, rect.dy);\n            row.length = row.area = 0;\n            best = Infinity;\n          }\n        }\n        if (row.length) {\n          position(row, u, rect, true);\n          row.length = row.area = 0;\n        }\n        children.forEach(squarify);\n      }\n    }\n    function stickify(node) {\n      var children = node.children;\n      if (children && children.length) {\n        var rect = pad(node), remaining = children.slice(), child, row = [];\n        scale(remaining, rect.dx * rect.dy / node.value);\n        row.area = 0;\n        while (child = remaining.pop()) {\n          row.push(child);\n          row.area += child.area;\n          if (child.z != null) {\n            position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);\n            row.length = row.area = 0;\n          }\n        }\n        children.forEach(stickify);\n      }\n    }\n    function worst(row, u) {\n      var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;\n      while (++i < n) {\n        if (!(r = row[i].area)) continue;\n        if (r < rmin) rmin = r;\n        if (r > rmax) rmax = r;\n      }\n      s *= s;\n      u *= u;\n      return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;\n    }\n    function position(row, u, rect, flush) {\n      var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;\n      if (u == rect.dx) {\n        if (flush || v > rect.dy) v = rect.dy;\n        while (++i < n) {\n          o = row[i];\n          o.x = x;\n          o.y = y;\n          o.dy = v;\n          x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);\n        }\n        o.z = true;\n        o.dx += rect.x + rect.dx - x;\n        rect.y += v;\n        rect.dy -= v;\n      } else {\n        if (flush || v > rect.dx) v = rect.dx;\n        while (++i < n) {\n          o = row[i];\n          o.x = x;\n          o.y = y;\n          o.dx = v;\n          y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);\n        }\n        o.z = false;\n        o.dy += rect.y + rect.dy - y;\n        rect.x += v;\n        rect.dx -= v;\n      }\n    }\n    function treemap(d) {\n      var nodes = stickies || hierarchy(d), root = nodes[0];\n      root.x = 0;\n      root.y = 0;\n      root.dx = size[0];\n      root.dy = size[1];\n      if (stickies) hierarchy.revalue(root);\n      scale([ root ], root.dx * root.dy / root.value);\n      (stickies ? stickify : squarify)(root);\n      if (sticky) stickies = nodes;\n      return nodes;\n    }\n    treemap.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return treemap;\n    };\n    treemap.padding = function(x) {\n      if (!arguments.length) return padding;\n      function padFunction(node) {\n        var p = x.call(treemap, node, node.depth);\n        return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === \"number\" ? [ p, p, p, p ] : p);\n      }\n      function padConstant(node) {\n        return d3_layout_treemapPad(node, x);\n      }\n      var type;\n      pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === \"function\" ? padFunction : type === \"number\" ? (x = [ x, x, x, x ],\n      padConstant) : padConstant;\n      return treemap;\n    };\n    treemap.round = function(x) {\n      if (!arguments.length) return round != Number;\n      round = x ? Math.round : Number;\n      return treemap;\n    };\n    treemap.sticky = function(x) {\n      if (!arguments.length) return sticky;\n      sticky = x;\n      stickies = null;\n      return treemap;\n    };\n    treemap.ratio = function(x) {\n      if (!arguments.length) return ratio;\n      ratio = x;\n      return treemap;\n    };\n    treemap.mode = function(x) {\n      if (!arguments.length) return mode;\n      mode = x + \"\";\n      return treemap;\n    };\n    return d3_layout_hierarchyRebind(treemap, hierarchy);\n  };\n  function d3_layout_treemapPadNull(node) {\n    return {\n      x: node.x,\n      y: node.y,\n      dx: node.dx,\n      dy: node.dy\n    };\n  }\n  function d3_layout_treemapPad(node, padding) {\n    var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];\n    if (dx < 0) {\n      x += dx / 2;\n      dx = 0;\n    }\n    if (dy < 0) {\n      y += dy / 2;\n      dy = 0;\n    }\n    return {\n      x: x,\n      y: y,\n      dx: dx,\n      dy: dy\n    };\n  }\n  d3.random = {\n    normal: function(µ, σ) {\n      var n = arguments.length;\n      if (n < 2) σ = 1;\n      if (n < 1) µ = 0;\n      return function() {\n        var x, y, r;\n        do {\n          x = Math.random() * 2 - 1;\n          y = Math.random() * 2 - 1;\n          r = x * x + y * y;\n        } while (!r || r > 1);\n        return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);\n      };\n    },\n    logNormal: function() {\n      var random = d3.random.normal.apply(d3, arguments);\n      return function() {\n        return Math.exp(random());\n      };\n    },\n    bates: function(m) {\n      var random = d3.random.irwinHall(m);\n      return function() {\n        return random() / m;\n      };\n    },\n    irwinHall: function(m) {\n      return function() {\n        for (var s = 0, j = 0; j < m; j++) s += Math.random();\n        return s;\n      };\n    }\n  };\n  d3.scale = {};\n  function d3_scaleExtent(domain) {\n    var start = domain[0], stop = domain[domain.length - 1];\n    return start < stop ? [ start, stop ] : [ stop, start ];\n  }\n  function d3_scaleRange(scale) {\n    return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());\n  }\n  function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {\n    var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);\n    return function(x) {\n      return i(u(x));\n    };\n  }\n  function d3_scale_nice(domain, nice) {\n    var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;\n    if (x1 < x0) {\n      dx = i0, i0 = i1, i1 = dx;\n      dx = x0, x0 = x1, x1 = dx;\n    }\n    domain[i0] = nice.floor(x0);\n    domain[i1] = nice.ceil(x1);\n    return domain;\n  }\n  function d3_scale_niceStep(step) {\n    return step ? {\n      floor: function(x) {\n        return Math.floor(x / step) * step;\n      },\n      ceil: function(x) {\n        return Math.ceil(x / step) * step;\n      }\n    } : d3_scale_niceIdentity;\n  }\n  var d3_scale_niceIdentity = {\n    floor: d3_identity,\n    ceil: d3_identity\n  };\n  function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {\n    var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;\n    if (domain[k] < domain[0]) {\n      domain = domain.slice().reverse();\n      range = range.slice().reverse();\n    }\n    while (++j <= k) {\n      u.push(uninterpolate(domain[j - 1], domain[j]));\n      i.push(interpolate(range[j - 1], range[j]));\n    }\n    return function(x) {\n      var j = d3.bisect(domain, x, 1, k) - 1;\n      return i[j](u[j](x));\n    };\n  }\n  d3.scale.linear = function() {\n    return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false);\n  };\n  function d3_scale_linear(domain, range, interpolate, clamp) {\n    var output, input;\n    function rescale() {\n      var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;\n      output = linear(domain, range, uninterpolate, interpolate);\n      input = linear(range, domain, uninterpolate, d3_interpolate);\n      return scale;\n    }\n    function scale(x) {\n      return output(x);\n    }\n    scale.invert = function(y) {\n      return input(y);\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(Number);\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.rangeRound = function(x) {\n      return scale.range(x).interpolate(d3_interpolateRound);\n    };\n    scale.clamp = function(x) {\n      if (!arguments.length) return clamp;\n      clamp = x;\n      return rescale();\n    };\n    scale.interpolate = function(x) {\n      if (!arguments.length) return interpolate;\n      interpolate = x;\n      return rescale();\n    };\n    scale.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    scale.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    scale.nice = function(m) {\n      d3_scale_linearNice(domain, m);\n      return rescale();\n    };\n    scale.copy = function() {\n      return d3_scale_linear(domain, range, interpolate, clamp);\n    };\n    return rescale();\n  }\n  function d3_scale_linearRebind(scale, linear) {\n    return d3.rebind(scale, linear, \"range\", \"rangeRound\", \"interpolate\", \"clamp\");\n  }\n  function d3_scale_linearNice(domain, m) {\n    return d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n  }\n  function d3_scale_linearTickRange(domain, m) {\n    if (m == null) m = 10;\n    var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;\n    if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;\n    extent[0] = Math.ceil(extent[0] / step) * step;\n    extent[1] = Math.floor(extent[1] / step) * step + step * .5;\n    extent[2] = step;\n    return extent;\n  }\n  function d3_scale_linearTicks(domain, m) {\n    return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));\n  }\n  function d3_scale_linearTickFormat(domain, m, format) {\n    var range = d3_scale_linearTickRange(domain, m);\n    if (format) {\n      var match = d3_format_re.exec(format);\n      match.shift();\n      if (match[8] === \"s\") {\n        var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1])));\n        if (!match[7]) match[7] = \".\" + d3_scale_linearPrecision(prefix.scale(range[2]));\n        match[8] = \"f\";\n        format = d3.format(match.join(\"\"));\n        return function(d) {\n          return format(prefix.scale(d)) + prefix.symbol;\n        };\n      }\n      if (!match[7]) match[7] = \".\" + d3_scale_linearFormatPrecision(match[8], range);\n      format = match.join(\"\");\n    } else {\n      format = \",.\" + d3_scale_linearPrecision(range[2]) + \"f\";\n    }\n    return d3.format(format);\n  }\n  var d3_scale_linearFormatSignificant = {\n    s: 1,\n    g: 1,\n    p: 1,\n    r: 1,\n    e: 1\n  };\n  function d3_scale_linearPrecision(value) {\n    return -Math.floor(Math.log(value) / Math.LN10 + .01);\n  }\n  function d3_scale_linearFormatPrecision(type, range) {\n    var p = d3_scale_linearPrecision(range[2]);\n    return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== \"e\") : p - (type === \"%\") * 2;\n  }\n  d3.scale.log = function() {\n    return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]);\n  };\n  function d3_scale_log(linear, base, positive, domain) {\n    function log(x) {\n      return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base);\n    }\n    function pow(x) {\n      return positive ? Math.pow(base, x) : -Math.pow(base, -x);\n    }\n    function scale(x) {\n      return linear(log(x));\n    }\n    scale.invert = function(x) {\n      return pow(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      positive = x[0] >= 0;\n      linear.domain((domain = x.map(Number)).map(log));\n      return scale;\n    };\n    scale.base = function(_) {\n      if (!arguments.length) return base;\n      base = +_;\n      linear.domain(domain.map(log));\n      return scale;\n    };\n    scale.nice = function() {\n      var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative);\n      linear.domain(niced);\n      domain = niced.map(pow);\n      return scale;\n    };\n    scale.ticks = function() {\n      var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base;\n      if (isFinite(j - i)) {\n        if (positive) {\n          for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k);\n          ticks.push(pow(i));\n        } else {\n          ticks.push(pow(i));\n          for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k);\n        }\n        for (i = 0; ticks[i] < u; i++) {}\n        for (j = ticks.length; ticks[j - 1] > v; j--) {}\n        ticks = ticks.slice(i, j);\n      }\n      return ticks;\n    };\n    scale.tickFormat = function(n, format) {\n      if (!arguments.length) return d3_scale_logFormat;\n      if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== \"function\") format = d3.format(format);\n      var k = Math.max(.1, n / scale.ticks().length), f = positive ? (e = 1e-12, Math.ceil) : (e = -1e-12,\n      Math.floor), e;\n      return function(d) {\n        return d / pow(f(log(d) + e)) <= k ? format(d) : \"\";\n      };\n    };\n    scale.copy = function() {\n      return d3_scale_log(linear.copy(), base, positive, domain);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  var d3_scale_logFormat = d3.format(\".0e\"), d3_scale_logNiceNegative = {\n    floor: function(x) {\n      return -Math.ceil(-x);\n    },\n    ceil: function(x) {\n      return -Math.floor(-x);\n    }\n  };\n  d3.scale.pow = function() {\n    return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]);\n  };\n  function d3_scale_pow(linear, exponent, domain) {\n    var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);\n    function scale(x) {\n      return linear(powp(x));\n    }\n    scale.invert = function(x) {\n      return powb(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      linear.domain((domain = x.map(Number)).map(powp));\n      return scale;\n    };\n    scale.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    scale.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    scale.nice = function(m) {\n      return scale.domain(d3_scale_linearNice(domain, m));\n    };\n    scale.exponent = function(x) {\n      if (!arguments.length) return exponent;\n      powp = d3_scale_powPow(exponent = x);\n      powb = d3_scale_powPow(1 / exponent);\n      linear.domain(domain.map(powp));\n      return scale;\n    };\n    scale.copy = function() {\n      return d3_scale_pow(linear.copy(), exponent, domain);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  function d3_scale_powPow(e) {\n    return function(x) {\n      return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);\n    };\n  }\n  d3.scale.sqrt = function() {\n    return d3.scale.pow().exponent(.5);\n  };\n  d3.scale.ordinal = function() {\n    return d3_scale_ordinal([], {\n      t: \"range\",\n      a: [ [] ]\n    });\n  };\n  function d3_scale_ordinal(domain, ranger) {\n    var index, range, rangeBand;\n    function scale(x) {\n      return range[((index.get(x) || (ranger.t === \"range\" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length];\n    }\n    function steps(start, step) {\n      return d3.range(domain.length).map(function(i) {\n        return start + step * i;\n      });\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = [];\n      index = new d3_Map();\n      var i = -1, n = x.length, xi;\n      while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));\n      return scale[ranger.t].apply(scale, ranger.a);\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      rangeBand = 0;\n      ranger = {\n        t: \"range\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangePoints = function(x, padding) {\n      if (arguments.length < 2) padding = 0;\n      var start = x[0], stop = x[1], step = (stop - start) / (Math.max(1, domain.length - 1) + padding);\n      range = steps(domain.length < 2 ? (start + stop) / 2 : start + step * padding / 2, step);\n      rangeBand = 0;\n      ranger = {\n        t: \"rangePoints\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeBands = function(x, padding, outerPadding) {\n      if (arguments.length < 2) padding = 0;\n      if (arguments.length < 3) outerPadding = padding;\n      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);\n      range = steps(start + step * outerPadding, step);\n      if (reverse) range.reverse();\n      rangeBand = step * (1 - padding);\n      ranger = {\n        t: \"rangeBands\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeRoundBands = function(x, padding, outerPadding) {\n      if (arguments.length < 2) padding = 0;\n      if (arguments.length < 3) outerPadding = padding;\n      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding)), error = stop - start - (domain.length - padding) * step;\n      range = steps(start + Math.round(error / 2), step);\n      if (reverse) range.reverse();\n      rangeBand = Math.round(step * (1 - padding));\n      ranger = {\n        t: \"rangeRoundBands\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeBand = function() {\n      return rangeBand;\n    };\n    scale.rangeExtent = function() {\n      return d3_scaleExtent(ranger.a[0]);\n    };\n    scale.copy = function() {\n      return d3_scale_ordinal(domain, ranger);\n    };\n    return scale.domain(domain);\n  }\n  d3.scale.category10 = function() {\n    return d3.scale.ordinal().range(d3_category10);\n  };\n  d3.scale.category20 = function() {\n    return d3.scale.ordinal().range(d3_category20);\n  };\n  d3.scale.category20b = function() {\n    return d3.scale.ordinal().range(d3_category20b);\n  };\n  d3.scale.category20c = function() {\n    return d3.scale.ordinal().range(d3_category20c);\n  };\n  var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString);\n  var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString);\n  var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString);\n  var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString);\n  d3.scale.quantile = function() {\n    return d3_scale_quantile([], []);\n  };\n  function d3_scale_quantile(domain, range) {\n    var thresholds;\n    function rescale() {\n      var k = 0, q = range.length;\n      thresholds = [];\n      while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);\n      return scale;\n    }\n    function scale(x) {\n      if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)];\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.filter(d3_number).sort(d3_ascending);\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.quantiles = function() {\n      return thresholds;\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ];\n    };\n    scale.copy = function() {\n      return d3_scale_quantile(domain, range);\n    };\n    return rescale();\n  }\n  d3.scale.quantize = function() {\n    return d3_scale_quantize(0, 1, [ 0, 1 ]);\n  };\n  function d3_scale_quantize(x0, x1, range) {\n    var kx, i;\n    function scale(x) {\n      return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];\n    }\n    function rescale() {\n      kx = range.length / (x1 - x0);\n      i = range.length - 1;\n      return scale;\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return [ x0, x1 ];\n      x0 = +x[0];\n      x1 = +x[x.length - 1];\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      y = y < 0 ? NaN : y / kx + x0;\n      return [ y, y + 1 / kx ];\n    };\n    scale.copy = function() {\n      return d3_scale_quantize(x0, x1, range);\n    };\n    return rescale();\n  }\n  d3.scale.threshold = function() {\n    return d3_scale_threshold([ .5 ], [ 0, 1 ]);\n  };\n  function d3_scale_threshold(domain, range) {\n    function scale(x) {\n      if (x <= x) return range[d3.bisect(domain, x)];\n    }\n    scale.domain = function(_) {\n      if (!arguments.length) return domain;\n      domain = _;\n      return scale;\n    };\n    scale.range = function(_) {\n      if (!arguments.length) return range;\n      range = _;\n      return scale;\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      return [ domain[y - 1], domain[y] ];\n    };\n    scale.copy = function() {\n      return d3_scale_threshold(domain, range);\n    };\n    return scale;\n  }\n  d3.scale.identity = function() {\n    return d3_scale_identity([ 0, 1 ]);\n  };\n  function d3_scale_identity(domain) {\n    function identity(x) {\n      return +x;\n    }\n    identity.invert = identity;\n    identity.domain = identity.range = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(identity);\n      return identity;\n    };\n    identity.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    identity.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    identity.copy = function() {\n      return d3_scale_identity(domain);\n    };\n    return identity;\n  }\n  d3.svg = {};\n  d3.svg.arc = function() {\n    var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;\n    function arc() {\n      var r0 = innerRadius.apply(this, arguments), r1 = outerRadius.apply(this, arguments), a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset, a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset, da = (a1 < a0 && (da = a0,\n      a0 = a1, a1 = da), a1 - a0), df = da < π ? \"0\" : \"1\", c0 = Math.cos(a0), s0 = Math.sin(a0), c1 = Math.cos(a1), s1 = Math.sin(a1);\n      return da >= d3_svg_arcMax ? r0 ? \"M0,\" + r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,1 0,\" + -r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,1 0,\" + r1 + \"M0,\" + r0 + \"A\" + r0 + \",\" + r0 + \" 0 1,0 0,\" + -r0 + \"A\" + r0 + \",\" + r0 + \" 0 1,0 0,\" + r0 + \"Z\" : \"M0,\" + r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,1 0,\" + -r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,1 0,\" + r1 + \"Z\" : r0 ? \"M\" + r1 * c0 + \",\" + r1 * s0 + \"A\" + r1 + \",\" + r1 + \" 0 \" + df + \",1 \" + r1 * c1 + \",\" + r1 * s1 + \"L\" + r0 * c1 + \",\" + r0 * s1 + \"A\" + r0 + \",\" + r0 + \" 0 \" + df + \",0 \" + r0 * c0 + \",\" + r0 * s0 + \"Z\" : \"M\" + r1 * c0 + \",\" + r1 * s0 + \"A\" + r1 + \",\" + r1 + \" 0 \" + df + \",1 \" + r1 * c1 + \",\" + r1 * s1 + \"L0,0\" + \"Z\";\n    }\n    arc.innerRadius = function(v) {\n      if (!arguments.length) return innerRadius;\n      innerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.outerRadius = function(v) {\n      if (!arguments.length) return outerRadius;\n      outerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.startAngle = function(v) {\n      if (!arguments.length) return startAngle;\n      startAngle = d3_functor(v);\n      return arc;\n    };\n    arc.endAngle = function(v) {\n      if (!arguments.length) return endAngle;\n      endAngle = d3_functor(v);\n      return arc;\n    };\n    arc.centroid = function() {\n      var r = (innerRadius.apply(this, arguments) + outerRadius.apply(this, arguments)) / 2, a = (startAngle.apply(this, arguments) + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset;\n      return [ Math.cos(a) * r, Math.sin(a) * r ];\n    };\n    return arc;\n  };\n  var d3_svg_arcOffset = -halfπ, d3_svg_arcMax = τ - ε;\n  function d3_svg_arcInnerRadius(d) {\n    return d.innerRadius;\n  }\n  function d3_svg_arcOuterRadius(d) {\n    return d.outerRadius;\n  }\n  function d3_svg_arcStartAngle(d) {\n    return d.startAngle;\n  }\n  function d3_svg_arcEndAngle(d) {\n    return d.endAngle;\n  }\n  function d3_svg_line(projection) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;\n    function line(data) {\n      var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);\n      function segment() {\n        segments.push(\"M\", interpolate(projection(points), tension));\n      }\n      while (++i < n) {\n        if (defined.call(this, d = data[i], i)) {\n          points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);\n        } else if (points.length) {\n          segment();\n          points = [];\n        }\n      }\n      if (points.length) segment();\n      return segments.length ? segments.join(\"\") : null;\n    }\n    line.x = function(_) {\n      if (!arguments.length) return x;\n      x = _;\n      return line;\n    };\n    line.y = function(_) {\n      if (!arguments.length) return y;\n      y = _;\n      return line;\n    };\n    line.defined = function(_) {\n      if (!arguments.length) return defined;\n      defined = _;\n      return line;\n    };\n    line.interpolate = function(_) {\n      if (!arguments.length) return interpolateKey;\n      if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n      return line;\n    };\n    line.tension = function(_) {\n      if (!arguments.length) return tension;\n      tension = _;\n      return line;\n    };\n    return line;\n  }\n  d3.svg.line = function() {\n    return d3_svg_line(d3_identity);\n  };\n  var d3_svg_lineInterpolators = d3.map({\n    linear: d3_svg_lineLinear,\n    \"linear-closed\": d3_svg_lineLinearClosed,\n    step: d3_svg_lineStep,\n    \"step-before\": d3_svg_lineStepBefore,\n    \"step-after\": d3_svg_lineStepAfter,\n    basis: d3_svg_lineBasis,\n    \"basis-open\": d3_svg_lineBasisOpen,\n    \"basis-closed\": d3_svg_lineBasisClosed,\n    bundle: d3_svg_lineBundle,\n    cardinal: d3_svg_lineCardinal,\n    \"cardinal-open\": d3_svg_lineCardinalOpen,\n    \"cardinal-closed\": d3_svg_lineCardinalClosed,\n    monotone: d3_svg_lineMonotone\n  });\n  d3_svg_lineInterpolators.forEach(function(key, value) {\n    value.key = key;\n    value.closed = /-closed$/.test(key);\n  });\n  function d3_svg_lineLinear(points) {\n    return points.join(\"L\");\n  }\n  function d3_svg_lineLinearClosed(points) {\n    return d3_svg_lineLinear(points) + \"Z\";\n  }\n  function d3_svg_lineStep(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"H\", (p[0] + (p = points[i])[0]) / 2, \"V\", p[1]);\n    if (n > 1) path.push(\"H\", p[0]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineStepBefore(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"V\", (p = points[i])[1], \"H\", p[0]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineStepAfter(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"H\", (p = points[i])[0], \"V\", p[1]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineCardinalOpen(points, tension) {\n    return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1), d3_svg_lineCardinalTangents(points, tension));\n  }\n  function d3_svg_lineCardinalClosed(points, tension) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite((points.push(points[0]),\n    points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));\n  }\n  function d3_svg_lineCardinal(points, tension) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));\n  }\n  function d3_svg_lineHermite(points, tangents) {\n    if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {\n      return d3_svg_lineLinear(points);\n    }\n    var quad = points.length != tangents.length, path = \"\", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;\n    if (quad) {\n      path += \"Q\" + (p[0] - t0[0] * 2 / 3) + \",\" + (p[1] - t0[1] * 2 / 3) + \",\" + p[0] + \",\" + p[1];\n      p0 = points[1];\n      pi = 2;\n    }\n    if (tangents.length > 1) {\n      t = tangents[1];\n      p = points[pi];\n      pi++;\n      path += \"C\" + (p0[0] + t0[0]) + \",\" + (p0[1] + t0[1]) + \",\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n      for (var i = 2; i < tangents.length; i++, pi++) {\n        p = points[pi];\n        t = tangents[i];\n        path += \"S\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n      }\n    }\n    if (quad) {\n      var lp = points[pi];\n      path += \"Q\" + (p[0] + t[0] * 2 / 3) + \",\" + (p[1] + t[1] * 2 / 3) + \",\" + lp[0] + \",\" + lp[1];\n    }\n    return path;\n  }\n  function d3_svg_lineCardinalTangents(points, tension) {\n    var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;\n    while (++i < n) {\n      p0 = p1;\n      p1 = p2;\n      p2 = points[i];\n      tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);\n    }\n    return tangents;\n  }\n  function d3_svg_lineBasis(points) {\n    if (points.length < 3) return d3_svg_lineLinear(points);\n    var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, \",\", y0, \"L\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n    points.push(points[n - 1]);\n    while (++i <= n) {\n      pi = points[i];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    points.pop();\n    path.push(\"L\", pi);\n    return path.join(\"\");\n  }\n  function d3_svg_lineBasisOpen(points) {\n    if (points.length < 4) return d3_svg_lineLinear(points);\n    var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];\n    while (++i < 3) {\n      pi = points[i];\n      px.push(pi[0]);\n      py.push(pi[1]);\n    }\n    path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + \",\" + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));\n    --i;\n    while (++i < n) {\n      pi = points[i];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    return path.join(\"\");\n  }\n  function d3_svg_lineBasisClosed(points) {\n    var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];\n    while (++i < 4) {\n      pi = points[i % n];\n      px.push(pi[0]);\n      py.push(pi[1]);\n    }\n    path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n    --i;\n    while (++i < m) {\n      pi = points[i % n];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    return path.join(\"\");\n  }\n  function d3_svg_lineBundle(points, tension) {\n    var n = points.length - 1;\n    if (n) {\n      var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;\n      while (++i <= n) {\n        p = points[i];\n        t = i / n;\n        p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);\n        p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);\n      }\n    }\n    return d3_svg_lineBasis(points);\n  }\n  function d3_svg_lineDot4(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n  }\n  var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];\n  function d3_svg_lineBasisBezier(path, x, y) {\n    path.push(\"C\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));\n  }\n  function d3_svg_lineSlope(p0, p1) {\n    return (p1[1] - p0[1]) / (p1[0] - p0[0]);\n  }\n  function d3_svg_lineFiniteDifferences(points) {\n    var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);\n    while (++i < j) {\n      m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;\n    }\n    m[i] = d;\n    return m;\n  }\n  function d3_svg_lineMonotoneTangents(points) {\n    var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;\n    while (++i < j) {\n      d = d3_svg_lineSlope(points[i], points[i + 1]);\n      if (abs(d) < ε) {\n        m[i] = m[i + 1] = 0;\n      } else {\n        a = m[i] / d;\n        b = m[i + 1] / d;\n        s = a * a + b * b;\n        if (s > 9) {\n          s = d * 3 / Math.sqrt(s);\n          m[i] = s * a;\n          m[i + 1] = s * b;\n        }\n      }\n    }\n    i = -1;\n    while (++i <= j) {\n      s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));\n      tangents.push([ s || 0, m[i] * s || 0 ]);\n    }\n    return tangents;\n  }\n  function d3_svg_lineMonotone(points) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));\n  }\n  d3.svg.line.radial = function() {\n    var line = d3_svg_line(d3_svg_lineRadial);\n    line.radius = line.x, delete line.x;\n    line.angle = line.y, delete line.y;\n    return line;\n  };\n  function d3_svg_lineRadial(points) {\n    var point, i = -1, n = points.length, r, a;\n    while (++i < n) {\n      point = points[i];\n      r = point[0];\n      a = point[1] + d3_svg_arcOffset;\n      point[0] = r * Math.cos(a);\n      point[1] = r * Math.sin(a);\n    }\n    return points;\n  }\n  function d3_svg_area(projection) {\n    var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = \"L\", tension = .7;\n    function area(data) {\n      var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {\n        return x;\n      } : d3_functor(x1), fy1 = y0 === y1 ? function() {\n        return y;\n      } : d3_functor(y1), x, y;\n      function segment() {\n        segments.push(\"M\", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), \"Z\");\n      }\n      while (++i < n) {\n        if (defined.call(this, d = data[i], i)) {\n          points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);\n          points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);\n        } else if (points0.length) {\n          segment();\n          points0 = [];\n          points1 = [];\n        }\n      }\n      if (points0.length) segment();\n      return segments.length ? segments.join(\"\") : null;\n    }\n    area.x = function(_) {\n      if (!arguments.length) return x1;\n      x0 = x1 = _;\n      return area;\n    };\n    area.x0 = function(_) {\n      if (!arguments.length) return x0;\n      x0 = _;\n      return area;\n    };\n    area.x1 = function(_) {\n      if (!arguments.length) return x1;\n      x1 = _;\n      return area;\n    };\n    area.y = function(_) {\n      if (!arguments.length) return y1;\n      y0 = y1 = _;\n      return area;\n    };\n    area.y0 = function(_) {\n      if (!arguments.length) return y0;\n      y0 = _;\n      return area;\n    };\n    area.y1 = function(_) {\n      if (!arguments.length) return y1;\n      y1 = _;\n      return area;\n    };\n    area.defined = function(_) {\n      if (!arguments.length) return defined;\n      defined = _;\n      return area;\n    };\n    area.interpolate = function(_) {\n      if (!arguments.length) return interpolateKey;\n      if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n      interpolateReverse = interpolate.reverse || interpolate;\n      L = interpolate.closed ? \"M\" : \"L\";\n      return area;\n    };\n    area.tension = function(_) {\n      if (!arguments.length) return tension;\n      tension = _;\n      return area;\n    };\n    return area;\n  }\n  d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;\n  d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;\n  d3.svg.area = function() {\n    return d3_svg_area(d3_identity);\n  };\n  d3.svg.area.radial = function() {\n    var area = d3_svg_area(d3_svg_lineRadial);\n    area.radius = area.x, delete area.x;\n    area.innerRadius = area.x0, delete area.x0;\n    area.outerRadius = area.x1, delete area.x1;\n    area.angle = area.y, delete area.y;\n    area.startAngle = area.y0, delete area.y0;\n    area.endAngle = area.y1, delete area.y1;\n    return area;\n  };\n  d3.svg.chord = function() {\n    var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;\n    function chord(d, i) {\n      var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);\n      return \"M\" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + \"Z\";\n    }\n    function subgroup(self, f, d, i) {\n      var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset, a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset;\n      return {\n        r: r,\n        a0: a0,\n        a1: a1,\n        p0: [ r * Math.cos(a0), r * Math.sin(a0) ],\n        p1: [ r * Math.cos(a1), r * Math.sin(a1) ]\n      };\n    }\n    function equals(a, b) {\n      return a.a0 == b.a0 && a.a1 == b.a1;\n    }\n    function arc(r, p, a) {\n      return \"A\" + r + \",\" + r + \" 0 \" + +(a > π) + \",1 \" + p;\n    }\n    function curve(r0, p0, r1, p1) {\n      return \"Q 0,0 \" + p1;\n    }\n    chord.radius = function(v) {\n      if (!arguments.length) return radius;\n      radius = d3_functor(v);\n      return chord;\n    };\n    chord.source = function(v) {\n      if (!arguments.length) return source;\n      source = d3_functor(v);\n      return chord;\n    };\n    chord.target = function(v) {\n      if (!arguments.length) return target;\n      target = d3_functor(v);\n      return chord;\n    };\n    chord.startAngle = function(v) {\n      if (!arguments.length) return startAngle;\n      startAngle = d3_functor(v);\n      return chord;\n    };\n    chord.endAngle = function(v) {\n      if (!arguments.length) return endAngle;\n      endAngle = d3_functor(v);\n      return chord;\n    };\n    return chord;\n  };\n  function d3_svg_chordRadius(d) {\n    return d.radius;\n  }\n  d3.svg.diagonal = function() {\n    var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection;\n    function diagonal(d, i) {\n      var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {\n        x: p0.x,\n        y: m\n      }, {\n        x: p3.x,\n        y: m\n      }, p3 ];\n      p = p.map(projection);\n      return \"M\" + p[0] + \"C\" + p[1] + \" \" + p[2] + \" \" + p[3];\n    }\n    diagonal.source = function(x) {\n      if (!arguments.length) return source;\n      source = d3_functor(x);\n      return diagonal;\n    };\n    diagonal.target = function(x) {\n      if (!arguments.length) return target;\n      target = d3_functor(x);\n      return diagonal;\n    };\n    diagonal.projection = function(x) {\n      if (!arguments.length) return projection;\n      projection = x;\n      return diagonal;\n    };\n    return diagonal;\n  };\n  function d3_svg_diagonalProjection(d) {\n    return [ d.x, d.y ];\n  }\n  d3.svg.diagonal.radial = function() {\n    var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;\n    diagonal.projection = function(x) {\n      return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;\n    };\n    return diagonal;\n  };\n  function d3_svg_diagonalRadialProjection(projection) {\n    return function() {\n      var d = projection.apply(this, arguments), r = d[0], a = d[1] + d3_svg_arcOffset;\n      return [ r * Math.cos(a), r * Math.sin(a) ];\n    };\n  }\n  d3.svg.symbol = function() {\n    var type = d3_svg_symbolType, size = d3_svg_symbolSize;\n    function symbol(d, i) {\n      return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));\n    }\n    symbol.type = function(x) {\n      if (!arguments.length) return type;\n      type = d3_functor(x);\n      return symbol;\n    };\n    symbol.size = function(x) {\n      if (!arguments.length) return size;\n      size = d3_functor(x);\n      return symbol;\n    };\n    return symbol;\n  };\n  function d3_svg_symbolSize() {\n    return 64;\n  }\n  function d3_svg_symbolType() {\n    return \"circle\";\n  }\n  function d3_svg_symbolCircle(size) {\n    var r = Math.sqrt(size / π);\n    return \"M0,\" + r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + -r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + r + \"Z\";\n  }\n  var d3_svg_symbols = d3.map({\n    circle: d3_svg_symbolCircle,\n    cross: function(size) {\n      var r = Math.sqrt(size / 5) / 2;\n      return \"M\" + -3 * r + \",\" + -r + \"H\" + -r + \"V\" + -3 * r + \"H\" + r + \"V\" + -r + \"H\" + 3 * r + \"V\" + r + \"H\" + r + \"V\" + 3 * r + \"H\" + -r + \"V\" + r + \"H\" + -3 * r + \"Z\";\n    },\n    diamond: function(size) {\n      var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;\n      return \"M0,\" + -ry + \"L\" + rx + \",0\" + \" 0,\" + ry + \" \" + -rx + \",0\" + \"Z\";\n    },\n    square: function(size) {\n      var r = Math.sqrt(size) / 2;\n      return \"M\" + -r + \",\" + -r + \"L\" + r + \",\" + -r + \" \" + r + \",\" + r + \" \" + -r + \",\" + r + \"Z\";\n    },\n    \"triangle-down\": function(size) {\n      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n      return \"M0,\" + ry + \"L\" + rx + \",\" + -ry + \" \" + -rx + \",\" + -ry + \"Z\";\n    },\n    \"triangle-up\": function(size) {\n      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n      return \"M0,\" + -ry + \"L\" + rx + \",\" + ry + \" \" + -rx + \",\" + ry + \"Z\";\n    }\n  });\n  d3.svg.symbolTypes = d3_svg_symbols.keys();\n  var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians);\n  function d3_transition(groups, id) {\n    d3_subclass(groups, d3_transitionPrototype);\n    groups.id = id;\n    return groups;\n  }\n  var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit;\n  d3_transitionPrototype.call = d3_selectionPrototype.call;\n  d3_transitionPrototype.empty = d3_selectionPrototype.empty;\n  d3_transitionPrototype.node = d3_selectionPrototype.node;\n  d3_transitionPrototype.size = d3_selectionPrototype.size;\n  d3.transition = function(selection) {\n    return arguments.length ? d3_transitionInheritId ? selection.transition() : selection : d3_selectionRoot.transition();\n  };\n  d3.transition.prototype = d3_transitionPrototype;\n  d3_transitionPrototype.select = function(selector) {\n    var id = this.id, subgroups = [], subgroup, subnode, node;\n    selector = d3_selection_selector(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) {\n          if (\"__data__\" in node) subnode.__data__ = node.__data__;\n          d3_transitionNode(subnode, i, id, node.__transition__[id]);\n          subgroup.push(subnode);\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_transition(subgroups, id);\n  };\n  d3_transitionPrototype.selectAll = function(selector) {\n    var id = this.id, subgroups = [], subgroup, subnodes, node, subnode, transition;\n    selector = d3_selection_selectorAll(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          transition = node.__transition__[id];\n          subnodes = selector.call(node, node.__data__, i, j);\n          subgroups.push(subgroup = []);\n          for (var k = -1, o = subnodes.length; ++k < o; ) {\n            if (subnode = subnodes[k]) d3_transitionNode(subnode, k, id, transition);\n            subgroup.push(subnode);\n          }\n        }\n      }\n    }\n    return d3_transition(subgroups, id);\n  };\n  d3_transitionPrototype.filter = function(filter) {\n    var subgroups = [], subgroup, group, node;\n    if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n          subgroup.push(node);\n        }\n      }\n    }\n    return d3_transition(subgroups, this.id);\n  };\n  d3_transitionPrototype.tween = function(name, tween) {\n    var id = this.id;\n    if (arguments.length < 2) return this.node().__transition__[id].tween.get(name);\n    return d3_selection_each(this, tween == null ? function(node) {\n      node.__transition__[id].tween.remove(name);\n    } : function(node) {\n      node.__transition__[id].tween.set(name, tween);\n    });\n  };\n  function d3_transition_tween(groups, name, value, tween) {\n    var id = groups.id;\n    return d3_selection_each(groups, typeof value === \"function\" ? function(node, i, j) {\n      node.__transition__[id].tween.set(name, tween(value.call(node, node.__data__, i, j)));\n    } : (value = tween(value), function(node) {\n      node.__transition__[id].tween.set(name, value);\n    }));\n  }\n  d3_transitionPrototype.attr = function(nameNS, value) {\n    if (arguments.length < 2) {\n      for (value in nameNS) this.attr(value, nameNS[value]);\n      return this;\n    }\n    var interpolate = nameNS == \"transform\" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS);\n    function attrNull() {\n      this.removeAttribute(name);\n    }\n    function attrNullNS() {\n      this.removeAttributeNS(name.space, name.local);\n    }\n    function attrTween(b) {\n      return b == null ? attrNull : (b += \"\", function() {\n        var a = this.getAttribute(name), i;\n        return a !== b && (i = interpolate(a, b), function(t) {\n          this.setAttribute(name, i(t));\n        });\n      });\n    }\n    function attrTweenNS(b) {\n      return b == null ? attrNullNS : (b += \"\", function() {\n        var a = this.getAttributeNS(name.space, name.local), i;\n        return a !== b && (i = interpolate(a, b), function(t) {\n          this.setAttributeNS(name.space, name.local, i(t));\n        });\n      });\n    }\n    return d3_transition_tween(this, \"attr.\" + nameNS, value, name.local ? attrTweenNS : attrTween);\n  };\n  d3_transitionPrototype.attrTween = function(nameNS, tween) {\n    var name = d3.ns.qualify(nameNS);\n    function attrTween(d, i) {\n      var f = tween.call(this, d, i, this.getAttribute(name));\n      return f && function(t) {\n        this.setAttribute(name, f(t));\n      };\n    }\n    function attrTweenNS(d, i) {\n      var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));\n      return f && function(t) {\n        this.setAttributeNS(name.space, name.local, f(t));\n      };\n    }\n    return this.tween(\"attr.\" + nameNS, name.local ? attrTweenNS : attrTween);\n  };\n  d3_transitionPrototype.style = function(name, value, priority) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof name !== \"string\") {\n        if (n < 2) value = \"\";\n        for (priority in name) this.style(priority, name[priority], value);\n        return this;\n      }\n      priority = \"\";\n    }\n    function styleNull() {\n      this.style.removeProperty(name);\n    }\n    function styleString(b) {\n      return b == null ? styleNull : (b += \"\", function() {\n        var a = d3_window.getComputedStyle(this, null).getPropertyValue(name), i;\n        return a !== b && (i = d3_interpolate(a, b), function(t) {\n          this.style.setProperty(name, i(t), priority);\n        });\n      });\n    }\n    return d3_transition_tween(this, \"style.\" + name, value, styleString);\n  };\n  d3_transitionPrototype.styleTween = function(name, tween, priority) {\n    if (arguments.length < 3) priority = \"\";\n    function styleTween(d, i) {\n      var f = tween.call(this, d, i, d3_window.getComputedStyle(this, null).getPropertyValue(name));\n      return f && function(t) {\n        this.style.setProperty(name, f(t), priority);\n      };\n    }\n    return this.tween(\"style.\" + name, styleTween);\n  };\n  d3_transitionPrototype.text = function(value) {\n    return d3_transition_tween(this, \"text\", value, d3_transition_text);\n  };\n  function d3_transition_text(b) {\n    if (b == null) b = \"\";\n    return function() {\n      this.textContent = b;\n    };\n  }\n  d3_transitionPrototype.remove = function() {\n    return this.each(\"end.transition\", function() {\n      var p;\n      if (this.__transition__.count < 2 && (p = this.parentNode)) p.removeChild(this);\n    });\n  };\n  d3_transitionPrototype.ease = function(value) {\n    var id = this.id;\n    if (arguments.length < 1) return this.node().__transition__[id].ease;\n    if (typeof value !== \"function\") value = d3.ease.apply(d3, arguments);\n    return d3_selection_each(this, function(node) {\n      node.__transition__[id].ease = value;\n    });\n  };\n  d3_transitionPrototype.delay = function(value) {\n    var id = this.id;\n    if (arguments.length < 1) return this.node().__transition__[id].delay;\n    return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n      node.__transition__[id].delay = +value.call(node, node.__data__, i, j);\n    } : (value = +value, function(node) {\n      node.__transition__[id].delay = value;\n    }));\n  };\n  d3_transitionPrototype.duration = function(value) {\n    var id = this.id;\n    if (arguments.length < 1) return this.node().__transition__[id].duration;\n    return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n      node.__transition__[id].duration = Math.max(1, value.call(node, node.__data__, i, j));\n    } : (value = Math.max(1, value), function(node) {\n      node.__transition__[id].duration = value;\n    }));\n  };\n  d3_transitionPrototype.each = function(type, listener) {\n    var id = this.id;\n    if (arguments.length < 2) {\n      var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId;\n      d3_transitionInheritId = id;\n      d3_selection_each(this, function(node, i, j) {\n        d3_transitionInherit = node.__transition__[id];\n        type.call(node, node.__data__, i, j);\n      });\n      d3_transitionInherit = inherit;\n      d3_transitionInheritId = inheritId;\n    } else {\n      d3_selection_each(this, function(node) {\n        var transition = node.__transition__[id];\n        (transition.event || (transition.event = d3.dispatch(\"start\", \"end\"))).on(type, listener);\n      });\n    }\n    return this;\n  };\n  d3_transitionPrototype.transition = function() {\n    var id0 = this.id, id1 = ++d3_transitionId, subgroups = [], subgroup, group, node, transition;\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        if (node = group[i]) {\n          transition = Object.create(node.__transition__[id0]);\n          transition.delay += transition.duration;\n          d3_transitionNode(node, i, id1, transition);\n        }\n        subgroup.push(node);\n      }\n    }\n    return d3_transition(subgroups, id1);\n  };\n  function d3_transitionNode(node, i, id, inherit) {\n    var lock = node.__transition__ || (node.__transition__ = {\n      active: 0,\n      count: 0\n    }), transition = lock[id];\n    if (!transition) {\n      var time = inherit.time;\n      transition = lock[id] = {\n        tween: new d3_Map(),\n        time: time,\n        ease: inherit.ease,\n        delay: inherit.delay,\n        duration: inherit.duration\n      };\n      ++lock.count;\n      d3.timer(function(elapsed) {\n        var d = node.__data__, ease = transition.ease, delay = transition.delay, duration = transition.duration, timer = d3_timer_active, tweened = [];\n        timer.t = delay + time;\n        if (delay <= elapsed) return start(elapsed - delay);\n        timer.c = start;\n        function start(elapsed) {\n          if (lock.active > id) return stop();\n          lock.active = id;\n          transition.event && transition.event.start.call(node, d, i);\n          transition.tween.forEach(function(key, value) {\n            if (value = value.call(node, d, i)) {\n              tweened.push(value);\n            }\n          });\n          d3.timer(function() {\n            timer.c = tick(elapsed || 1) ? d3_true : tick;\n            return 1;\n          }, 0, time);\n        }\n        function tick(elapsed) {\n          if (lock.active !== id) return stop();\n          var t = elapsed / duration, e = ease(t), n = tweened.length;\n          while (n > 0) {\n            tweened[--n].call(node, e);\n          }\n          if (t >= 1) {\n            transition.event && transition.event.end.call(node, d, i);\n            return stop();\n          }\n        }\n        function stop() {\n          if (--lock.count) delete lock[id]; else delete node.__transition__;\n          return 1;\n        }\n      }, 0, time);\n    }\n  }\n  d3.svg.axis = function() {\n    var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_;\n    function axis(g) {\n      g.each(function() {\n        var g = d3.select(this);\n        var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy();\n        var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(\".tick\").data(ticks, scale1), tickEnter = tick.enter().insert(\"g\", \".domain\").attr(\"class\", \"tick\").style(\"opacity\", ε), tickExit = d3.transition(tick.exit()).style(\"opacity\", ε).remove(), tickUpdate = d3.transition(tick.order()).style(\"opacity\", 1), tickTransform;\n        var range = d3_scaleRange(scale1), path = g.selectAll(\".domain\").data([ 0 ]), pathUpdate = (path.enter().append(\"path\").attr(\"class\", \"domain\"),\n        d3.transition(path));\n        tickEnter.append(\"line\");\n        tickEnter.append(\"text\");\n        var lineEnter = tickEnter.select(\"line\"), lineUpdate = tickUpdate.select(\"line\"), text = tick.select(\"text\").text(tickFormat), textEnter = tickEnter.select(\"text\"), textUpdate = tickUpdate.select(\"text\");\n        switch (orient) {\n         case \"bottom\":\n          {\n            tickTransform = d3_svg_axisX;\n            lineEnter.attr(\"y2\", innerTickSize);\n            textEnter.attr(\"y\", Math.max(innerTickSize, 0) + tickPadding);\n            lineUpdate.attr(\"x2\", 0).attr(\"y2\", innerTickSize);\n            textUpdate.attr(\"x\", 0).attr(\"y\", Math.max(innerTickSize, 0) + tickPadding);\n            text.attr(\"dy\", \".71em\").style(\"text-anchor\", \"middle\");\n            pathUpdate.attr(\"d\", \"M\" + range[0] + \",\" + outerTickSize + \"V0H\" + range[1] + \"V\" + outerTickSize);\n            break;\n          }\n\n         case \"top\":\n          {\n            tickTransform = d3_svg_axisX;\n            lineEnter.attr(\"y2\", -innerTickSize);\n            textEnter.attr(\"y\", -(Math.max(innerTickSize, 0) + tickPadding));\n            lineUpdate.attr(\"x2\", 0).attr(\"y2\", -innerTickSize);\n            textUpdate.attr(\"x\", 0).attr(\"y\", -(Math.max(innerTickSize, 0) + tickPadding));\n            text.attr(\"dy\", \"0em\").style(\"text-anchor\", \"middle\");\n            pathUpdate.attr(\"d\", \"M\" + range[0] + \",\" + -outerTickSize + \"V0H\" + range[1] + \"V\" + -outerTickSize);\n            break;\n          }\n\n         case \"left\":\n          {\n            tickTransform = d3_svg_axisY;\n            lineEnter.attr(\"x2\", -innerTickSize);\n            textEnter.attr(\"x\", -(Math.max(innerTickSize, 0) + tickPadding));\n            lineUpdate.attr(\"x2\", -innerTickSize).attr(\"y2\", 0);\n            textUpdate.attr(\"x\", -(Math.max(innerTickSize, 0) + tickPadding)).attr(\"y\", 0);\n            text.attr(\"dy\", \".32em\").style(\"text-anchor\", \"end\");\n            pathUpdate.attr(\"d\", \"M\" + -outerTickSize + \",\" + range[0] + \"H0V\" + range[1] + \"H\" + -outerTickSize);\n            break;\n          }\n\n         case \"right\":\n          {\n            tickTransform = d3_svg_axisY;\n            lineEnter.attr(\"x2\", innerTickSize);\n            textEnter.attr(\"x\", Math.max(innerTickSize, 0) + tickPadding);\n            lineUpdate.attr(\"x2\", innerTickSize).attr(\"y2\", 0);\n            textUpdate.attr(\"x\", Math.max(innerTickSize, 0) + tickPadding).attr(\"y\", 0);\n            text.attr(\"dy\", \".32em\").style(\"text-anchor\", \"start\");\n            pathUpdate.attr(\"d\", \"M\" + outerTickSize + \",\" + range[0] + \"H0V\" + range[1] + \"H\" + outerTickSize);\n            break;\n          }\n        }\n        if (scale1.rangeBand) {\n          var x = scale1, dx = x.rangeBand() / 2;\n          scale0 = scale1 = function(d) {\n            return x(d) + dx;\n          };\n        } else if (scale0.rangeBand) {\n          scale0 = scale1;\n        } else {\n          tickExit.call(tickTransform, scale1);\n        }\n        tickEnter.call(tickTransform, scale0);\n        tickUpdate.call(tickTransform, scale1);\n      });\n    }\n    axis.scale = function(x) {\n      if (!arguments.length) return scale;\n      scale = x;\n      return axis;\n    };\n    axis.orient = function(x) {\n      if (!arguments.length) return orient;\n      orient = x in d3_svg_axisOrients ? x + \"\" : d3_svg_axisDefaultOrient;\n      return axis;\n    };\n    axis.ticks = function() {\n      if (!arguments.length) return tickArguments_;\n      tickArguments_ = arguments;\n      return axis;\n    };\n    axis.tickValues = function(x) {\n      if (!arguments.length) return tickValues;\n      tickValues = x;\n      return axis;\n    };\n    axis.tickFormat = function(x) {\n      if (!arguments.length) return tickFormat_;\n      tickFormat_ = x;\n      return axis;\n    };\n    axis.tickSize = function(x) {\n      var n = arguments.length;\n      if (!n) return innerTickSize;\n      innerTickSize = +x;\n      outerTickSize = +arguments[n - 1];\n      return axis;\n    };\n    axis.innerTickSize = function(x) {\n      if (!arguments.length) return innerTickSize;\n      innerTickSize = +x;\n      return axis;\n    };\n    axis.outerTickSize = function(x) {\n      if (!arguments.length) return outerTickSize;\n      outerTickSize = +x;\n      return axis;\n    };\n    axis.tickPadding = function(x) {\n      if (!arguments.length) return tickPadding;\n      tickPadding = +x;\n      return axis;\n    };\n    axis.tickSubdivide = function() {\n      return arguments.length && axis;\n    };\n    return axis;\n  };\n  var d3_svg_axisDefaultOrient = \"bottom\", d3_svg_axisOrients = {\n    top: 1,\n    right: 1,\n    bottom: 1,\n    left: 1\n  };\n  function d3_svg_axisX(selection, x) {\n    selection.attr(\"transform\", function(d) {\n      return \"translate(\" + x(d) + \",0)\";\n    });\n  }\n  function d3_svg_axisY(selection, y) {\n    selection.attr(\"transform\", function(d) {\n      return \"translate(0,\" + y(d) + \")\";\n    });\n  }\n  d3.svg.brush = function() {\n    var event = d3_eventDispatch(brush, \"brushstart\", \"brush\", \"brushend\"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0];\n    function brush(g) {\n      g.each(function() {\n        var g = d3.select(this).style(\"pointer-events\", \"all\").style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\").on(\"mousedown.brush\", brushstart).on(\"touchstart.brush\", brushstart);\n        var background = g.selectAll(\".background\").data([ 0 ]);\n        background.enter().append(\"rect\").attr(\"class\", \"background\").style(\"visibility\", \"hidden\").style(\"cursor\", \"crosshair\");\n        g.selectAll(\".extent\").data([ 0 ]).enter().append(\"rect\").attr(\"class\", \"extent\").style(\"cursor\", \"move\");\n        var resize = g.selectAll(\".resize\").data(resizes, d3_identity);\n        resize.exit().remove();\n        resize.enter().append(\"g\").attr(\"class\", function(d) {\n          return \"resize \" + d;\n        }).style(\"cursor\", function(d) {\n          return d3_svg_brushCursor[d];\n        }).append(\"rect\").attr(\"x\", function(d) {\n          return /[ew]$/.test(d) ? -3 : null;\n        }).attr(\"y\", function(d) {\n          return /^[ns]/.test(d) ? -3 : null;\n        }).attr(\"width\", 6).attr(\"height\", 6).style(\"visibility\", \"hidden\");\n        resize.style(\"display\", brush.empty() ? \"none\" : null);\n        var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range;\n        if (x) {\n          range = d3_scaleRange(x);\n          backgroundUpdate.attr(\"x\", range[0]).attr(\"width\", range[1] - range[0]);\n          redrawX(gUpdate);\n        }\n        if (y) {\n          range = d3_scaleRange(y);\n          backgroundUpdate.attr(\"y\", range[0]).attr(\"height\", range[1] - range[0]);\n          redrawY(gUpdate);\n        }\n        redraw(gUpdate);\n      });\n    }\n    brush.event = function(g) {\n      g.each(function() {\n        var event_ = event.of(this, arguments), extent1 = {\n          x: xExtent,\n          y: yExtent,\n          i: xExtentDomain,\n          j: yExtentDomain\n        }, extent0 = this.__chart__ || extent1;\n        this.__chart__ = extent1;\n        if (d3_transitionInheritId) {\n          d3.select(this).transition().each(\"start.brush\", function() {\n            xExtentDomain = extent0.i;\n            yExtentDomain = extent0.j;\n            xExtent = extent0.x;\n            yExtent = extent0.y;\n            event_({\n              type: \"brushstart\"\n            });\n          }).tween(\"brush:brush\", function() {\n            var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y);\n            xExtentDomain = yExtentDomain = null;\n            return function(t) {\n              xExtent = extent1.x = xi(t);\n              yExtent = extent1.y = yi(t);\n              event_({\n                type: \"brush\",\n                mode: \"resize\"\n              });\n            };\n          }).each(\"end.brush\", function() {\n            xExtentDomain = extent1.i;\n            yExtentDomain = extent1.j;\n            event_({\n              type: \"brush\",\n              mode: \"resize\"\n            });\n            event_({\n              type: \"brushend\"\n            });\n          });\n        } else {\n          event_({\n            type: \"brushstart\"\n          });\n          event_({\n            type: \"brush\",\n            mode: \"resize\"\n          });\n          event_({\n            type: \"brushend\"\n          });\n        }\n      });\n    };\n    function redraw(g) {\n      g.selectAll(\".resize\").attr(\"transform\", function(d) {\n        return \"translate(\" + xExtent[+/e$/.test(d)] + \",\" + yExtent[+/^s/.test(d)] + \")\";\n      });\n    }\n    function redrawX(g) {\n      g.select(\".extent\").attr(\"x\", xExtent[0]);\n      g.selectAll(\".extent,.n>rect,.s>rect\").attr(\"width\", xExtent[1] - xExtent[0]);\n    }\n    function redrawY(g) {\n      g.select(\".extent\").attr(\"y\", yExtent[0]);\n      g.selectAll(\".extent,.e>rect,.w>rect\").attr(\"height\", yExtent[1] - yExtent[0]);\n    }\n    function brushstart() {\n      var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed(\"extent\"), dragRestore = d3_event_dragSuppress(), center, origin = d3.mouse(target), offset;\n      var w = d3.select(d3_window).on(\"keydown.brush\", keydown).on(\"keyup.brush\", keyup);\n      if (d3.event.changedTouches) {\n        w.on(\"touchmove.brush\", brushmove).on(\"touchend.brush\", brushend);\n      } else {\n        w.on(\"mousemove.brush\", brushmove).on(\"mouseup.brush\", brushend);\n      }\n      g.interrupt().selectAll(\"*\").interrupt();\n      if (dragging) {\n        origin[0] = xExtent[0] - origin[0];\n        origin[1] = yExtent[0] - origin[1];\n      } else if (resizing) {\n        var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);\n        offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ];\n        origin[0] = xExtent[ex];\n        origin[1] = yExtent[ey];\n      } else if (d3.event.altKey) center = origin.slice();\n      g.style(\"pointer-events\", \"none\").selectAll(\".resize\").style(\"display\", null);\n      d3.select(\"body\").style(\"cursor\", eventTarget.style(\"cursor\"));\n      event_({\n        type: \"brushstart\"\n      });\n      brushmove();\n      function keydown() {\n        if (d3.event.keyCode == 32) {\n          if (!dragging) {\n            center = null;\n            origin[0] -= xExtent[1];\n            origin[1] -= yExtent[1];\n            dragging = 2;\n          }\n          d3_eventPreventDefault();\n        }\n      }\n      function keyup() {\n        if (d3.event.keyCode == 32 && dragging == 2) {\n          origin[0] += xExtent[1];\n          origin[1] += yExtent[1];\n          dragging = 0;\n          d3_eventPreventDefault();\n        }\n      }\n      function brushmove() {\n        var point = d3.mouse(target), moved = false;\n        if (offset) {\n          point[0] += offset[0];\n          point[1] += offset[1];\n        }\n        if (!dragging) {\n          if (d3.event.altKey) {\n            if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ];\n            origin[0] = xExtent[+(point[0] < center[0])];\n            origin[1] = yExtent[+(point[1] < center[1])];\n          } else center = null;\n        }\n        if (resizingX && move1(point, x, 0)) {\n          redrawX(g);\n          moved = true;\n        }\n        if (resizingY && move1(point, y, 1)) {\n          redrawY(g);\n          moved = true;\n        }\n        if (moved) {\n          redraw(g);\n          event_({\n            type: \"brush\",\n            mode: dragging ? \"move\" : \"resize\"\n          });\n        }\n      }\n      function move1(point, scale, i) {\n        var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max;\n        if (dragging) {\n          r0 -= position;\n          r1 -= size + position;\n        }\n        min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i];\n        if (dragging) {\n          max = (min += position) + size;\n        } else {\n          if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));\n          if (position < min) {\n            max = min;\n            min = position;\n          } else {\n            max = position;\n          }\n        }\n        if (extent[0] != min || extent[1] != max) {\n          if (i) yExtentDomain = null; else xExtentDomain = null;\n          extent[0] = min;\n          extent[1] = max;\n          return true;\n        }\n      }\n      function brushend() {\n        brushmove();\n        g.style(\"pointer-events\", \"all\").selectAll(\".resize\").style(\"display\", brush.empty() ? \"none\" : null);\n        d3.select(\"body\").style(\"cursor\", null);\n        w.on(\"mousemove.brush\", null).on(\"mouseup.brush\", null).on(\"touchmove.brush\", null).on(\"touchend.brush\", null).on(\"keydown.brush\", null).on(\"keyup.brush\", null);\n        dragRestore();\n        event_({\n          type: \"brushend\"\n        });\n      }\n    }\n    brush.x = function(z) {\n      if (!arguments.length) return x;\n      x = z;\n      resizes = d3_svg_brushResizes[!x << 1 | !y];\n      return brush;\n    };\n    brush.y = function(z) {\n      if (!arguments.length) return y;\n      y = z;\n      resizes = d3_svg_brushResizes[!x << 1 | !y];\n      return brush;\n    };\n    brush.clamp = function(z) {\n      if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null;\n      if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z;\n      return brush;\n    };\n    brush.extent = function(z) {\n      var x0, x1, y0, y1, t;\n      if (!arguments.length) {\n        if (x) {\n          if (xExtentDomain) {\n            x0 = xExtentDomain[0], x1 = xExtentDomain[1];\n          } else {\n            x0 = xExtent[0], x1 = xExtent[1];\n            if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);\n            if (x1 < x0) t = x0, x0 = x1, x1 = t;\n          }\n        }\n        if (y) {\n          if (yExtentDomain) {\n            y0 = yExtentDomain[0], y1 = yExtentDomain[1];\n          } else {\n            y0 = yExtent[0], y1 = yExtent[1];\n            if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);\n            if (y1 < y0) t = y0, y0 = y1, y1 = t;\n          }\n        }\n        return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];\n      }\n      if (x) {\n        x0 = z[0], x1 = z[1];\n        if (y) x0 = x0[0], x1 = x1[0];\n        xExtentDomain = [ x0, x1 ];\n        if (x.invert) x0 = x(x0), x1 = x(x1);\n        if (x1 < x0) t = x0, x0 = x1, x1 = t;\n        if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ];\n      }\n      if (y) {\n        y0 = z[0], y1 = z[1];\n        if (x) y0 = y0[1], y1 = y1[1];\n        yExtentDomain = [ y0, y1 ];\n        if (y.invert) y0 = y(y0), y1 = y(y1);\n        if (y1 < y0) t = y0, y0 = y1, y1 = t;\n        if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ];\n      }\n      return brush;\n    };\n    brush.clear = function() {\n      if (!brush.empty()) {\n        xExtent = [ 0, 0 ], yExtent = [ 0, 0 ];\n        xExtentDomain = yExtentDomain = null;\n      }\n      return brush;\n    };\n    brush.empty = function() {\n      return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1];\n    };\n    return d3.rebind(brush, event, \"on\");\n  };\n  var d3_svg_brushCursor = {\n    n: \"ns-resize\",\n    e: \"ew-resize\",\n    s: \"ns-resize\",\n    w: \"ew-resize\",\n    nw: \"nwse-resize\",\n    ne: \"nesw-resize\",\n    se: \"nwse-resize\",\n    sw: \"nesw-resize\"\n  };\n  var d3_svg_brushResizes = [ [ \"n\", \"e\", \"s\", \"w\", \"nw\", \"ne\", \"se\", \"sw\" ], [ \"e\", \"w\" ], [ \"n\", \"s\" ], [] ];\n  var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat;\n  var d3_time_formatUtc = d3_time_format.utc;\n  var d3_time_formatIso = d3_time_formatUtc(\"%Y-%m-%dT%H:%M:%S.%LZ\");\n  d3_time_format.iso = Date.prototype.toISOString && +new Date(\"2000-01-01T00:00:00.000Z\") ? d3_time_formatIsoNative : d3_time_formatIso;\n  function d3_time_formatIsoNative(date) {\n    return date.toISOString();\n  }\n  d3_time_formatIsoNative.parse = function(string) {\n    var date = new Date(string);\n    return isNaN(date) ? null : date;\n  };\n  d3_time_formatIsoNative.toString = d3_time_formatIso.toString;\n  d3_time.second = d3_time_interval(function(date) {\n    return new d3_date(Math.floor(date / 1e3) * 1e3);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 1e3);\n  }, function(date) {\n    return date.getSeconds();\n  });\n  d3_time.seconds = d3_time.second.range;\n  d3_time.seconds.utc = d3_time.second.utc.range;\n  d3_time.minute = d3_time_interval(function(date) {\n    return new d3_date(Math.floor(date / 6e4) * 6e4);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 6e4);\n  }, function(date) {\n    return date.getMinutes();\n  });\n  d3_time.minutes = d3_time.minute.range;\n  d3_time.minutes.utc = d3_time.minute.utc.range;\n  d3_time.hour = d3_time_interval(function(date) {\n    var timezone = date.getTimezoneOffset() / 60;\n    return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 36e5);\n  }, function(date) {\n    return date.getHours();\n  });\n  d3_time.hours = d3_time.hour.range;\n  d3_time.hours.utc = d3_time.hour.utc.range;\n  d3_time.month = d3_time_interval(function(date) {\n    date = d3_time.day(date);\n    date.setDate(1);\n    return date;\n  }, function(date, offset) {\n    date.setMonth(date.getMonth() + offset);\n  }, function(date) {\n    return date.getMonth();\n  });\n  d3_time.months = d3_time.month.range;\n  d3_time.months.utc = d3_time.month.utc.range;\n  function d3_time_scale(linear, methods, format) {\n    function scale(x) {\n      return linear(x);\n    }\n    scale.invert = function(x) {\n      return d3_time_scaleDate(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return linear.domain().map(d3_time_scaleDate);\n      linear.domain(x);\n      return scale;\n    };\n    function tickMethod(extent, count) {\n      var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target);\n      return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) {\n        return d / 31536e6;\n      }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i];\n    }\n    scale.nice = function(interval, skip) {\n      var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" && tickMethod(extent, interval);\n      if (method) interval = method[0], skip = method[1];\n      function skipped(date) {\n        return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length;\n      }\n      return scale.domain(d3_scale_nice(domain, skip > 1 ? {\n        floor: function(date) {\n          while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1);\n          return date;\n        },\n        ceil: function(date) {\n          while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1);\n          return date;\n        }\n      } : interval));\n    };\n    scale.ticks = function(interval, skip) {\n      var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" ? tickMethod(extent, interval) : !interval.range && [ {\n        range: interval\n      }, skip ];\n      if (method) interval = method[0], skip = method[1];\n      return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip);\n    };\n    scale.tickFormat = function() {\n      return format;\n    };\n    scale.copy = function() {\n      return d3_time_scale(linear.copy(), methods, format);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  function d3_time_scaleDate(t) {\n    return new Date(t);\n  }\n  var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];\n  var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ];\n  var d3_time_scaleLocalFormat = d3_time_format.multi([ [ \".%L\", function(d) {\n    return d.getMilliseconds();\n  } ], [ \":%S\", function(d) {\n    return d.getSeconds();\n  } ], [ \"%I:%M\", function(d) {\n    return d.getMinutes();\n  } ], [ \"%I %p\", function(d) {\n    return d.getHours();\n  } ], [ \"%a %d\", function(d) {\n    return d.getDay() && d.getDate() != 1;\n  } ], [ \"%b %d\", function(d) {\n    return d.getDate() != 1;\n  } ], [ \"%B\", function(d) {\n    return d.getMonth();\n  } ], [ \"%Y\", d3_true ] ]);\n  var d3_time_scaleMilliseconds = {\n    range: function(start, stop, step) {\n      return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate);\n    },\n    floor: d3_identity,\n    ceil: d3_identity\n  };\n  d3_time_scaleLocalMethods.year = d3_time.year;\n  d3_time.scale = function() {\n    return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);\n  };\n  var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) {\n    return [ m[0].utc, m[1] ];\n  });\n  var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ \".%L\", function(d) {\n    return d.getUTCMilliseconds();\n  } ], [ \":%S\", function(d) {\n    return d.getUTCSeconds();\n  } ], [ \"%I:%M\", function(d) {\n    return d.getUTCMinutes();\n  } ], [ \"%I %p\", function(d) {\n    return d.getUTCHours();\n  } ], [ \"%a %d\", function(d) {\n    return d.getUTCDay() && d.getUTCDate() != 1;\n  } ], [ \"%b %d\", function(d) {\n    return d.getUTCDate() != 1;\n  } ], [ \"%B\", function(d) {\n    return d.getUTCMonth();\n  } ], [ \"%Y\", d3_true ] ]);\n  d3_time_scaleUtcMethods.year = d3_time.year.utc;\n  d3_time.scale.utc = function() {\n    return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat);\n  };\n  d3.text = d3_xhrType(function(request) {\n    return request.responseText;\n  });\n  d3.json = function(url, callback) {\n    return d3_xhr(url, \"application/json\", d3_json, callback);\n  };\n  function d3_json(request) {\n    return JSON.parse(request.responseText);\n  }\n  d3.html = function(url, callback) {\n    return d3_xhr(url, \"text/html\", d3_html, callback);\n  };\n  function d3_html(request) {\n    var range = d3_document.createRange();\n    range.selectNode(d3_document.body);\n    return range.createContextualFragment(request.responseText);\n  }\n  d3.xml = d3_xhrType(function(request) {\n    return request.responseXML;\n  });\n  if (typeof define === \"function\" && define.amd) define(d3); else if (typeof module === \"object\" && module.exports) module.exports = d3;\n  this.d3 = d3;\n}();\n"
  },
  {
    "path": "examples/autocomplete/autocomplete.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" >\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta charset=\"utf-8\">\n  <meta name=\"description\" content=\"\">\n  <meta name=\"author\" content=\"\">\n  <title>Rx for JavaScript Rocks!</title>\n  <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap.min.css\">\n  <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap-responsive.min.css\">\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"page-header\">\n      <h1>RxJS Autocomplete example</h1>\n      <p class=\"lead\">Example to show combining input events such as keyup with Ajax requests</p>\n    </div>\n    <div class=\"row-fluid\">\n      <form role=\"form\">\n        <div class=\"form-group\">\n          <label for=\"textInput\">Enter Query for Wikipedia</label>\n          <input type=\"text\" id=\"textInput\" class=\"form-control\" placeholder=\"Enter Query...\">\n        </div>\n      </form>\n    </div>\n    <div class=\"row-fluid\">\n      <ul id=\"results\"></ul>\n    </div>\n  </div>\n  <script src=\"../assets/jquery/jquery-1.10.2.min.js\"></script>\n  <script src=\"../../dist/rx.lite.compat.js\"></script>\n  <script src=\"autocomplete.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/autocomplete/autocomplete.js",
    "content": "(function (global, $, Rx) {\n\n  // Search Wikipedia for a given term\n  function searchWikipedia (term) {\n    return $.ajax({\n      url: 'http://en.wikipedia.org/w/api.php',\n      dataType: 'jsonp',\n      data: {\n        action: 'opensearch',\n        format: 'json',\n        search: term\n      }\n    }).promise();\n  }\n\n  function main() {\n    var $input = $('#textInput'),\n        $results = $('#results');\n\n    // Get all distinct key up events from the input and only fire if long enough and distinct\n    var keyup = Rx.Observable.fromEvent($input, 'keyup')\n      .map(function (e) {\n        return e.target.value; // Project the text from the input\n      })\n      .filter(function (text) {\n        return text.length > 2; // Only if the text is longer than 2 characters\n      })\n      .debounce(750 /* Pause for 750ms */ )\n      .distinctUntilChanged(); // Only if the value has changed\n\n    var searcher = keyup.flatMapLatest(searchWikipedia);\n\n    searcher.subscribe(\n      function (data) {\n        $results\n          .empty()\n          .append ($.map(data[1], function (v) { return $('<li>').text(v); }));\n      },\n      function (error) {\n        $results\n          .empty()\n          .append($('<li>'))\n          .text('Error:' + error);\n      });\n  }\n\n  $(main);\n\n}(window, jQuery, Rx));\n"
  },
  {
    "path": "examples/autocomplete/readme.md",
    "content": ""
  },
  {
    "path": "examples/backpressure/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" >\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta charset=\"utf-8\">\n  <meta name=\"description\" content=\"\">\n  <meta name=\"author\" content=\"\">\n  <title>Rx for JavaScript Rocks!</title>\n  <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap.min.css\">\n  <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap-responsive.min.css\">\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"page-header\">\n      <h1>RxJS Backpressure Example</h1>\n      <p class=\"lead\">Example to show backpressure with lossy and loss-less pausable observables</p>\n    </div>\n    <div class=\"row-fluid\">\n      <p>Lossy Pausable using .pauseableBuffered for mouse movements</p>\n      <label for=\"losslessToggle\">Lossless Toggle<label>\n      <input type=\"checkbox\" id=\"losslessToggle\" checked />\n      <ul id=\"losslessResults\"></ul>\n    </div>\n  </div>\n  <script src=\"../../dist/rx.lite.compat.js\"></script>\n  <script src=\"index.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/backpressure/index.js",
    "content": "(function () {\n\n  function main() {\n    var fromEvent = Rx.Observable.fromEvent;\n\n    function isChecked(x) { return x.checked; }\n    function notChecked(x) { return !x.checked; }\n\n    var losslessResults = document.getElementById('losslessResults');\n    var losslessToggle = document.getElementById('losslessToggle');\n\n    function logInput(text) {\n      var li = document.createElement('li');\n      li.innerHTML = text;\n      losslessResults.appendChild(li);\n    }\n\n    var mousemove = fromEvent(document, 'mousemove')\n      .map(function (e) {\n        return 'clientX: ' + e.clientX + ', clientY: ' + e.clientY;\n      })\n      .pausableBuffered();\n\n    // Lossless\n    var losslessClick = fromEvent(losslessToggle, 'click')\n      .map(function (e) { return e.target.checked; })\n\n    losslessClick.subscribe(function (checked) {\n      if (checked) {\n        mousemove.resume();\n      } else {\n        mousemove.pause();\n      }\n    })\n\n    mousemove.subscribe(function (text) {\n      logInput(text);\n    });\n  }\n\n  window.onload = main;\n\n}());\n"
  },
  {
    "path": "examples/backpressure/readme.md",
    "content": ""
  },
  {
    "path": "examples/canvaspaint/canvaspaint.css",
    "content": "canvas {\n    background-color: #cccccb;\n}\n\nhtml  {\n  -moz-user-select: none;\n  -khtml-user-select: none;\n  -webkit-user-select: none;\n  user-select: none;\n}\n"
  },
  {
    "path": "examples/canvaspaint/canvaspaint.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" >\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta charset=\"utf-8\">\n  <meta name=\"description\" content=\"\">\n  <meta name=\"author\" content=\"\">\n  <title>Rx for JavaScript Rocks!</title>\n  <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap.min.css\">\n  <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap-responsive.min.css\">\n  <link rel=\"stylesheet\" href=\"canvaspaint.css\">\n  <!--[if lt IE 9]>\n    <script type=\"text/javascript\" src=\"excanvas_src.js\"></script>\n  <![endif]-->\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"page-header\">\n      <h1>RxJS Canvas Paint Example</h1>\n      <p class=\"lead\">Example to show combining mouse events to draw on an HTML5 Canvas</p>\n    </div>\n    <div class=\"row\">\n      <canvas id=\"tutorial\" width=\"640\" height=\"480\"></canvas>\n    </div>\n    <div class=\"row\" style=\"padding-top: 10px;;\">\n      <table id=\"colorchart\" class=\"table\">\n       <tr><td bgColor=\"#FBEFEF\"></td><td bgColor=\"#FBF2EF\"></td><td bgColor=\"#FBF5EF\"></td><td bgColor=\"#FBF8EF\"></td><td bgColor=\"#FBFBEF\"></td><td bgColor=\"#F8FBEF\"></td><td bgColor=\"#F5FBEF\"></td><td bgColor=\"#F2FBEF\"></td><td bgColor=\"#EFFBEF\"></td><td bgColor=\"#EFFBF2\"></td><td bgColor=\"#EFFBF5\"></td><td bgColor=\"#EFFBF8\"></td><td bgColor=\"#EFFBFB\"></td><td bgColor=\"#EFF8FB\"></td><td bgColor=\"#EFF5FB\"></td><td bgColor=\"#EFF2FB\"></td><td bgColor=\"#EFEFFB\"></td><td bgColor=\"#F2EFFB\"></td><td bgColor=\"#F5EFFB\"></td><td bgColor=\"#F8EFFB\"></td><td bgColor=\"#FBEFFB\"></td><td bgColor=\"#FBEFF8\"></td><td bgColor=\"#FBEFF5\"></td><td bgColor=\"#FBEFF2\"></td><td bgColor=\"#FFFFFF\"></td></tr>\n       <tr><td bgColor=\"#F8E0E0\"></td><td bgColor=\"#F8E6E0\"></td><td bgColor=\"#F8ECE0\"></td><td bgColor=\"#F7F2E0\"></td><td bgColor=\"#F7F8E0\"></td><td bgColor=\"#F1F8E0\"></td><td bgColor=\"#ECF8E0\"></td><td bgColor=\"#E6F8E0\"></td><td bgColor=\"#E0F8E0\"></td><td bgColor=\"#E0F8E6\"></td><td bgColor=\"#E0F8EC\"></td><td bgColor=\"#E0F8F1\"></td><td bgColor=\"#E0F8F7\"></td><td bgColor=\"#E0F2F7\"></td><td bgColor=\"#E0ECF8\"></td><td bgColor=\"#E0E6F8\"></td><td bgColor=\"#E0E0F8\"></td><td bgColor=\"#E6E0F8\"></td><td bgColor=\"#ECE0F8\"></td><td bgColor=\"#F2E0F7\"></td><td bgColor=\"#F8E0F7\"></td><td bgColor=\"#F8E0F1\"></td><td bgColor=\"#F8E0EC\"></td><td bgColor=\"#F8E0E6\"></td><td bgColor=\"#FAFAFA\"></td></tr>\n       <tr><td bgColor=\"#F6CECE\"></td><td bgColor=\"#F6D8CE\"></td><td bgColor=\"#F6E3CE\"></td><td bgColor=\"#F5ECCE\"></td><td bgColor=\"#F5F6CE\"></td><td bgColor=\"#ECF6CE\"></td><td bgColor=\"#E3F6CE\"></td><td bgColor=\"#D8F6CE\"></td><td bgColor=\"#CEF6CE\"></td><td bgColor=\"#CEF6D8\"></td><td bgColor=\"#CEF6E3\"></td><td bgColor=\"#CEF6EC\"></td><td bgColor=\"#CEF6F5\"></td><td bgColor=\"#CEECF5\"></td><td bgColor=\"#CEE3F6\"></td><td bgColor=\"#CED8F6\"></td><td bgColor=\"#CECEF6\"></td><td bgColor=\"#D8CEF6\"></td><td bgColor=\"#E3CEF6\"></td><td bgColor=\"#ECCEF5\"></td><td bgColor=\"#F6CEF5\"></td><td bgColor=\"#F6CEEC\"></td><td bgColor=\"#F6CEE3\"></td><td bgColor=\"#F6CED8\"></td><td bgColor=\"#F2F2F2\"></td></tr>\n       <tr><td bgColor=\"#F5A9A9\"></td><td bgColor=\"#F5BCA9\"></td><td bgColor=\"#F5D0A9\"></td><td bgColor=\"#F3E2A9\"></td><td bgColor=\"#F2F5A9\"></td><td bgColor=\"#E1F5A9\"></td><td bgColor=\"#D0F5A9\"></td><td bgColor=\"#BCF5A9\"></td><td bgColor=\"#A9F5A9\"></td><td bgColor=\"#A9F5BC\"></td><td bgColor=\"#A9F5D0\"></td><td bgColor=\"#A9F5E1\"></td><td bgColor=\"#A9F5F2\"></td><td bgColor=\"#A9E2F3\"></td><td bgColor=\"#A9D0F5\"></td><td bgColor=\"#A9BCF5\"></td><td bgColor=\"#A9A9F5\"></td><td bgColor=\"#BCA9F5\"></td><td bgColor=\"#D0A9F5\"></td><td bgColor=\"#E2A9F3\"></td><td bgColor=\"#F5A9F2\"></td><td bgColor=\"#F5A9E1\"></td><td bgColor=\"#F5A9D0\"></td><td bgColor=\"#F5A9BC\"></td><td bgColor=\"#E6E6E6\"></td></tr>\n       <tr><td bgColor=\"#F78181\"></td><td bgColor=\"#F79F81\"></td><td bgColor=\"#F7BE81\"></td><td bgColor=\"#F5DA81\"></td><td bgColor=\"#F3F781\"></td><td bgColor=\"#D8F781\"></td><td bgColor=\"#BEF781\"></td><td bgColor=\"#9FF781\"></td><td bgColor=\"#81F781\"></td><td bgColor=\"#81F79F\"></td><td bgColor=\"#81F7BE\"></td><td bgColor=\"#81F7D8\"></td><td bgColor=\"#81F7F3\"></td><td bgColor=\"#81DAF5\"></td><td bgColor=\"#81BEF7\"></td><td bgColor=\"#819FF7\"></td><td bgColor=\"#8181F7\"></td><td bgColor=\"#9F81F7\"></td><td bgColor=\"#BE81F7\"></td><td bgColor=\"#DA81F5\"></td><td bgColor=\"#F781F3\"></td><td bgColor=\"#F781D8\"></td><td bgColor=\"#F781BE\"></td><td bgColor=\"#F7819F\"></td><td bgColor=\"#D8D8D8\"></td></tr>\n       <tr><td bgColor=\"#FA5858\"></td><td bgColor=\"#FA8258\"></td><td bgColor=\"#FAAC58\"></td><td bgColor=\"#F7D358\"></td><td bgColor=\"#F4FA58\"></td><td bgColor=\"#D0FA58\"></td><td bgColor=\"#ACFA58\"></td><td bgColor=\"#82FA58\"></td><td bgColor=\"#58FA58\"></td><td bgColor=\"#58FA82\"></td><td bgColor=\"#58FAAC\"></td><td bgColor=\"#58FAD0\"></td><td bgColor=\"#58FAF4\"></td><td bgColor=\"#58D3F7\"></td><td bgColor=\"#58ACFA\"></td><td bgColor=\"#5882FA\"></td><td bgColor=\"#5858FA\"></td><td bgColor=\"#8258FA\"></td><td bgColor=\"#AC58FA\"></td><td bgColor=\"#D358F7\"></td><td bgColor=\"#FA58F4\"></td><td bgColor=\"#FA58D0\"></td><td bgColor=\"#FA58AC\"></td><td bgColor=\"#FA5882\"></td><td bgColor=\"#BDBDBD\"></td></tr>\n       <tr><td bgColor=\"#FE2E2E\"></td><td bgColor=\"#FE642E\"></td><td bgColor=\"#FE9A2E\"></td><td bgColor=\"#FACC2E\"></td><td bgColor=\"#F7FE2E\"></td><td bgColor=\"#C8FE2E\"></td><td bgColor=\"#9AFE2E\"></td><td bgColor=\"#64FE2E\"></td><td bgColor=\"#2EFE2E\"></td><td bgColor=\"#2EFE64\"></td><td bgColor=\"#2EFE9A\"></td><td bgColor=\"#2EFEC8\"></td><td bgColor=\"#2EFEF7\"></td><td bgColor=\"#2ECCFA\"></td><td bgColor=\"#2E9AFE\"></td><td bgColor=\"#2E64FE\"></td><td bgColor=\"#2E2EFE\"></td><td bgColor=\"#642EFE\"></td><td bgColor=\"#9A2EFE\"></td><td bgColor=\"#CC2EFA\"></td><td bgColor=\"#FE2EF7\"></td><td bgColor=\"#FE2EC8\"></td><td bgColor=\"#FE2E9A\"></td><td bgColor=\"#FE2E64\"></td><td bgColor=\"#A4A4A4\"></td></tr>\n       <tr><td bgColor=\"#FF0000\"></td><td bgColor=\"#FF4000\"></td><td bgColor=\"#FF8000\"></td><td bgColor=\"#FFBF00\"></td><td bgColor=\"#FFFF00\"></td><td bgColor=\"#BFFF00\"></td><td bgColor=\"#80FF00\"></td><td bgColor=\"#40FF00\"></td><td bgColor=\"#00FF00\"></td><td bgColor=\"#00FF40\"></td><td bgColor=\"#00FF80\"></td><td bgColor=\"#00FFBF\"></td><td bgColor=\"#00FFFF\"></td><td bgColor=\"#00BFFF\"></td><td bgColor=\"#0080FF\"></td><td bgColor=\"#0040FF\"></td><td bgColor=\"#0000FF\"></td><td bgColor=\"#4000FF\"></td><td bgColor=\"#8000FF\"></td><td bgColor=\"#BF00FF\"></td><td bgColor=\"#FF00FF\"></td><td bgColor=\"#FF00BF\"></td><td bgColor=\"#FF0080\"></td><td bgColor=\"#FF0040\"></td><td bgColor=\"#848484\"></td></tr>\n       <tr><td bgColor=\"#DF0101\"></td><td bgColor=\"#DF3A01\"></td><td bgColor=\"#DF7401\"></td><td bgColor=\"#DBA901\"></td><td bgColor=\"#D7DF01\"></td><td bgColor=\"#A5DF00\"></td><td bgColor=\"#74DF00\"></td><td bgColor=\"#3ADF00\"></td><td bgColor=\"#01DF01\"></td><td bgColor=\"#01DF3A\"></td><td bgColor=\"#01DF74\"></td><td bgColor=\"#01DFA5\"></td><td bgColor=\"#01DFD7\"></td><td bgColor=\"#01A9DB\"></td><td bgColor=\"#0174DF\"></td><td bgColor=\"#013ADF\"></td><td bgColor=\"#0101DF\"></td><td bgColor=\"#3A01DF\"></td><td bgColor=\"#7401DF\"></td><td bgColor=\"#A901DB\"></td><td bgColor=\"#DF01D7\"></td><td bgColor=\"#DF01A5\"></td><td bgColor=\"#DF0174\"></td><td bgColor=\"#DF013A\"></td><td bgColor=\"#6E6E6E\"></td></tr>\n       <tr><td bgColor=\"#B40404\"></td><td bgColor=\"#B43104\"></td><td bgColor=\"#B45F04\"></td><td bgColor=\"#B18904\"></td><td bgColor=\"#AEB404\"></td><td bgColor=\"#86B404\"></td><td bgColor=\"#5FB404\"></td><td bgColor=\"#31B404\"></td><td bgColor=\"#04B404\"></td><td bgColor=\"#04B431\"></td><td bgColor=\"#04B45F\"></td><td bgColor=\"#04B486\"></td><td bgColor=\"#04B4AE\"></td><td bgColor=\"#0489B1\"></td><td bgColor=\"#045FB4\"></td><td bgColor=\"#0431B4\"></td><td bgColor=\"#0404B4\"></td><td bgColor=\"#3104B4\"></td><td bgColor=\"#5F04B4\"></td><td bgColor=\"#8904B1\"></td><td bgColor=\"#B404AE\"></td><td bgColor=\"#B40486\"></td><td bgColor=\"#B4045F\"></td><td bgColor=\"#B40431\"></td><td bgColor=\"#585858\"></td></tr>\n       <tr><td bgColor=\"#8A0808\"></td><td bgColor=\"#8A2908\"></td><td bgColor=\"#8A4B08\"></td><td bgColor=\"#886A08\"></td><td bgColor=\"#868A08\"></td><td bgColor=\"#688A08\"></td><td bgColor=\"#4B8A08\"></td><td bgColor=\"#298A08\"></td><td bgColor=\"#088A08\"></td><td bgColor=\"#088A29\"></td><td bgColor=\"#088A4B\"></td><td bgColor=\"#088A68\"></td><td bgColor=\"#088A85\"></td><td bgColor=\"#086A87\"></td><td bgColor=\"#084B8A\"></td><td bgColor=\"#08298A\"></td><td bgColor=\"#08088A\"></td><td bgColor=\"#29088A\"></td><td bgColor=\"#4B088A\"></td><td bgColor=\"#6A0888\"></td><td bgColor=\"#8A0886\"></td><td bgColor=\"#8A0868\"></td><td bgColor=\"#8A084B\"></td><td bgColor=\"#8A0829\"></td><td bgColor=\"#424242\"></td></tr>\n       <tr><td bgColor=\"#610B0B\"></td><td bgColor=\"#61210B\"></td><td bgColor=\"#61380B\"></td><td bgColor=\"#5F4C0B\"></td><td bgColor=\"#5E610B\"></td><td bgColor=\"#4B610B\"></td><td bgColor=\"#38610B\"></td><td bgColor=\"#21610B\"></td><td bgColor=\"#0B610B\"></td><td bgColor=\"#0B6121\"></td><td bgColor=\"#0B6138\"></td><td bgColor=\"#0B614B\"></td><td bgColor=\"#0B615E\"></td><td bgColor=\"#0B4C5F\"></td><td bgColor=\"#0B3861\"></td><td bgColor=\"#0B2161\"></td><td bgColor=\"#0B0B61\"></td><td bgColor=\"#210B61\"></td><td bgColor=\"#380B61\"></td><td bgColor=\"#4C0B5F\"></td><td bgColor=\"#610B5E\"></td><td bgColor=\"#610B4B\"></td><td bgColor=\"#610B38\"></td><td bgColor=\"#610B21\"></td><td bgColor=\"#2E2E2E\"></td></tr>\n       <tr><td bgColor=\"#3B0B0B\"></td><td bgColor=\"#3B170B\"></td><td bgColor=\"#3B240B\"></td><td bgColor=\"#3A2F0B\"></td><td bgColor=\"#393B0B\"></td><td bgColor=\"#2E3B0B\"></td><td bgColor=\"#243B0B\"></td><td bgColor=\"#173B0B\"></td><td bgColor=\"#0B3B0B\"></td><td bgColor=\"#0B3B17\"></td><td bgColor=\"#0B3B24\"></td><td bgColor=\"#0B3B2E\"></td><td bgColor=\"#0B3B39\"></td><td bgColor=\"#0B2F3A\"></td><td bgColor=\"#0B243B\"></td><td bgColor=\"#0B173B\"></td><td bgColor=\"#0B0B3B\"></td><td bgColor=\"#170B3B\"></td><td bgColor=\"#240B3B\"></td><td bgColor=\"#2F0B3A\"></td><td bgColor=\"#3B0B39\"></td><td bgColor=\"#3B0B2E\"></td><td bgColor=\"#3B0B24\"></td><td bgColor=\"#3B0B17\"></td><td bgColor=\"#1C1C1C\"></td></tr>\n       <tr><td bgColor=\"#2A0A0A\"></td><td bgColor=\"#2A120A\"></td><td bgColor=\"#2A1B0A\"></td><td bgColor=\"#29220A\"></td><td bgColor=\"#292A0A\"></td><td bgColor=\"#222A0A\"></td><td bgColor=\"#1B2A0A\"></td><td bgColor=\"#122A0A\"></td><td bgColor=\"#0A2A0A\"></td><td bgColor=\"#0A2A12\"></td><td bgColor=\"#0A2A1B\"></td><td bgColor=\"#0A2A22\"></td><td bgColor=\"#0A2A29\"></td><td bgColor=\"#0A2229\"></td><td bgColor=\"#0A1B2A\"></td><td bgColor=\"#0A122A\"></td><td bgColor=\"#0A0A2A\"></td><td bgColor=\"#120A2A\"></td><td bgColor=\"#1B0A2A\"></td><td bgColor=\"#220A29\"></td><td bgColor=\"#2A0A29\"></td><td bgColor=\"#2A0A22\"></td><td bgColor=\"#2A0A1B\"></td><td bgColor=\"#2A0A12\"></td><td bgColor=\"#151515\"></td></tr>\n       <tr><td bgColor=\"#190707\"></td><td bgColor=\"#190B07\"></td><td bgColor=\"#191007\"></td><td bgColor=\"#181407\"></td><td bgColor=\"#181907\"></td><td bgColor=\"#141907\"></td><td bgColor=\"#101907\"></td><td bgColor=\"#0B1907\"></td><td bgColor=\"#071907\"></td><td bgColor=\"#07190B\"></td><td bgColor=\"#071910\"></td><td bgColor=\"#071914\"></td><td bgColor=\"#071918\"></td><td bgColor=\"#071418\"></td><td bgColor=\"#071019\"></td><td bgColor=\"#070B19\"></td><td bgColor=\"#070719\"></td><td bgColor=\"#0B0719\"></td><td bgColor=\"#100719\"></td><td bgColor=\"#140718\"></td><td bgColor=\"#190718\"></td><td bgColor=\"#190714\"></td><td bgColor=\"#190710\"></td><td bgColor=\"#19070B\"></td><td bgColor=\"#000000\"></td></tr>\n      </table>\n    </div>\n  </div>\n  <!--[if lt IE 9]>\n  <script src=\"../../dist/rx.lite.compat.js\"></script>\n  <![endif]-->\n  <!--[if gte IE 9]><!-->\n  <script src=\"../../dist/rx.lite.js\"></script>\n  <!--<![endif]-->\n  <script src=\"canvaspaint.js\"></script>\n</html>\n"
  },
  {
    "path": "examples/canvaspaint/canvaspaint.js",
    "content": "(function (window, document, Rx) {\n\n  Rx.DOM = { };\n\n  ['mousemove', 'mouseup', 'mousedown', 'click'].forEach(function (name) {\n    Rx.DOM[name] = function (element, selector) {\n      return Rx.Observable.fromEvent(element, name, selector);\n    };\n  });\n\n  Rx.DOM.ready = function () {\n    return Rx.Observable.create(function (o) {\n      function handler() {\n        o.onNext();\n        o.onCompleted();\n      }\n\n      var added = false;\n      if (document.readyState === 'complete') {\n        handler();\n      } else {\n        document.addEventListener('DOMContentLoaded', handler, false);\n        added = true;\n        return Rx.Disposable.create(function () {\n          added && document.removeEventListener('DOMContentLoaded', handler, false);\n        });\n      }\n    }).take(1);\n  };\n\n  // Calcualte offset either layerX/Y or offsetX/Y\n  function getOffset(event) {\n    return {\n      offsetX: event.offsetX === undefined ? event.layerX : event.offsetX,\n      offsetY: event.offsetY === undefined ? event.layerY : event.offsetY\n    };\n  }\n\n  function intialize () {\n    var canvas = document.getElementById('tutorial');\n    var colorchart = document.querySelectorAll('#colorchart tr td');\n\n    var ctx = canvas.getContext('2d');\n    ctx.beginPath();\n\n    // Get mouse events\n    var mouseMoves = Rx.DOM.mousemove(canvas),\n        mouseDowns = Rx.DOM.mousedown(canvas),\n        mouseUps   = Rx.DOM.mouseup(canvas);\n\n    // Get the table events\n    var colorValues = Rx.DOM.click(colorchart)\n      .tap(function () { ctx.beginPath(); })\n      .map(function (e) { return e.target.bgColor; })\n      .startWith('#000000');\n\n    // Calculate difference between two mouse moves\n    var mouseDiffs = mouseMoves.zip(mouseMoves.skip(1), function (x, y) {\n      return { first: getOffset(x), second: getOffset(y) };\n    });\n\n    // Get merge together both mouse up and mouse down\n    var mouseButton = mouseDowns.map(true)\n      .merge(mouseUps.map(false));\n\n    // Paint if the mouse is down\n    var paint = mouseButton.flatMapLatest(function (down) { return down ? mouseDiffs : Rx.Observable.never(); })\n      .combineLatest(colorValues, function (pos, color) {\n        return { pos : pos, color: color };\n      });\n\n    // Update the canvas\n    paint.subscribe(function (x) {\n      ctx.strokeStyle = x.color;\n      ctx.moveTo(x.pos.first.offsetX, x.pos.first.offsetY);\n      ctx.lineTo(x.pos.second.offsetX, x.pos.second.offsetY);\n      ctx.stroke();\n    });\n  }\n\n  Rx.DOM.ready().subscribe(intialize);\n}(window, document, Rx));\n"
  },
  {
    "path": "examples/canvaspaint/excanvas_src.js",
    "content": "// Copyright 2006 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//   http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// Known Issues:\n//\n// * Patterns are not implemented.\n// * Radial gradient are not implemented. The VML version of these look very\n//   different from the canvas one.\n// * Clipping paths are not implemented.\n// * Coordsize. The width and height attribute have higher priority than the\n//   width and height style values which isn't correct.\n// * Painting mode isn't implemented.\n// * Canvas width/height should is using content-box by default. IE in\n//   Quirks mode will draw the canvas using border-box. Either change your\n//   doctype to HTML5\n//   (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype)\n//   or use Box Sizing Behavior from WebFX\n//   (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html)\n// * Non uniform scaling does not correctly scale strokes.\n// * Optimize. There is always room for speed improvements.\n\n// Only add this code if we do not already have a canvas implementation\nif (!document.createElement('canvas').getContext) {\n\n(function() {\n\n  // alias some functions to make (compiled) code shorter\n  var m = Math;\n  var mr = m.round;\n  var ms = m.sin;\n  var mc = m.cos;\n  var abs = m.abs;\n  var sqrt = m.sqrt;\n  var msie_ver = getIEVersion();\n\n  function getIEVersion() {\n\tvar ver = -1;\n\tif(navigator != null && navigator.appName == 'Microsoft Internet Explorer') {\n\t\tvar regEx = new RegExp(\"MSIE ([0-9]{1,}[\\.0-9]{0,})\");\n\t\tif(regEx.exec(navigator.userAgent) != null) ver = parseInt(RegExp.$1);\n\t}\n\treturn ver;\n  }\n\n  // this is used for sub pixel precision\n  var Z = 10;\n  var Z2 = Z / 2;\n\n  /**\n   * This funtion is assigned to the <canvas> elements as element.getContext().\n   * @this {HTMLElement}\n   * @return {CanvasRenderingContext2D_}\n   */\n  function getContext() {\n    return this.context_ ||\n        (this.context_ = new CanvasRenderingContext2D_(this));\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * Binds a function to an object. The returned function will always use the\n   * passed in {@code obj} as {@code this}.\n   *\n   * Example:\n   *\n   *   g = bind(f, obj, a, b)\n   *   g(c, d) // will do f.call(obj, a, b, c, d)\n   *\n   * @param {Function} f The function to bind the object to\n   * @param {Object} obj The object that should act as this when the function\n   *     is called\n   * @param {*} var_args Rest arguments that will be used as the initial\n   *     arguments when the function is called\n   * @return {Function} A new function that has bound this\n   */\n  function bind(f, obj, var_args) {\n    var a = slice.call(arguments, 2);\n    return function() {\n      return f.apply(obj, a.concat(slice.call(arguments)));\n    };\n  }\n\n  var G_vmlCanvasManager_ = {\n    init: function(opt_doc) {\n      if (/MSIE/.test(navigator.userAgent) && !window.opera) {\n        var doc = opt_doc || document;\n        // Create a dummy element so that IE will allow canvas elements to be\n        // recognized.\n        doc.createElement('canvas');\n        doc.attachEvent('onreadystatechange', bind(this.init_, this, doc));\n      }\n    },\n\n    init_: function(doc) {\n      // create xmlns\n      if (!doc.namespaces['g_vml_']) {\n        doc.namespaces.add('g_vml_', 'urn:schemas-microsoft-com:vml',\n                           '#default#VML');\n      }\n      if (!doc.namespaces['g_o_']) {\n        doc.namespaces.add('g_o_', 'urn:schemas-microsoft-com:office:office',\n                           '#default#VML');\n      }\n\n      // Setup default CSS.  Only add one style sheet per document\n      if (!doc.styleSheets['ex_canvas_']) {\n        var ss = doc.createStyleSheet();\n        ss.owningElement.id = 'ex_canvas_';\n        ss.cssText = 'canvas{display:inline-block;overflow:hidden;' +\n            // default size is 300x150 in Gecko and Opera\n            'text-align:left;width:300px;height:150px}' +\n            'g_vml_\\\\:fill{behavior:url(#default#VML)}' +\n            'g_vml_\\\\:group{behavior:url(#default#VML)}' +\n            'g_vml_\\\\:image{behavior:url(#default#VML)}' +\n            'g_vml_\\\\:shape{behavior:url(#default#VML)}' +\n            'g_vml_\\\\:stroke{behavior:url(#default#VML)}' +\n            'g_o_\\\\:fill{behavior:url(#default#VML)}' +\n            'g_o_\\\\:group{behavior:url(#default#VML)}' +\n            'g_o_\\\\:image{behavior:url(#default#VML)}' +\n            'g_o_\\\\:shape{behavior:url(#default#VML)}' +\n            'g_o_\\\\:stroke{behavior:url(#default#VML)}';\n\n      }\n\n      // find all canvas elements\n      var els = doc.getElementsByTagName('canvas');\n      for (var i = 0; i < els.length; i++) {\n        this.initElement(els[i]);\n      }\n    },\n\n    /**\n     * Public initializes a canvas element so that it can be used as canvas\n     * element from now on. This is called automatically before the page is\n     * loaded but if you are creating elements using createElement you need to\n     * make sure this is called on the element.\n     * @param {HTMLElement} el The canvas element to initialize.\n     * @return {HTMLElement} the element that was created.\n     */\n    initElement: function(el) {\n      if (!el.getContext) {\n\n        el.getContext = getContext;\n\n        // Remove fallback content. There is no way to hide text nodes so we\n        // just remove all childNodes. We could hide all elements and remove\n        // text nodes but who really cares about the fallback content.\n        el.innerHTML = '';\n\n        // do not use inline function because that will leak memory\n        el.attachEvent('onpropertychange', onPropertyChange);\n        el.attachEvent('onresize', onResize);\n\n        var attrs = el.attributes;\n        if (attrs.width && attrs.width.specified) {\n          // TODO: use runtimeStyle and coordsize\n          // el.getContext().setWidth_(attrs.width.nodeValue);\n          el.style.width = attrs.width.nodeValue + 'px';\n        } else {\n          el.width = el.clientWidth;\n        }\n        if (attrs.height && attrs.height.specified) {\n          // TODO: use runtimeStyle and coordsize\n          // el.getContext().setHeight_(attrs.height.nodeValue);\n          el.style.height = attrs.height.nodeValue + 'px';\n        } else {\n          el.height = el.clientHeight;\n        }\n        //el.getContext().setCoordsize_()\n      }\n      return el;\n    }\n  };\n\n  function onPropertyChange(e) {\n    var el = e.srcElement;\n\n    switch (e.propertyName) {\n      case 'width':\n        el.style.width = el.attributes.width.nodeValue + 'px';\n        el.getContext().clearRect();\n        break;\n      case 'height':\n        el.style.height = el.attributes.height.nodeValue + 'px';\n        el.getContext().clearRect();\n        break;\n    }\n  }\n\n  function onResize(e) {\n    var el = e.srcElement;\n    if (el.firstChild) {\n      el.firstChild.style.width =  el.clientWidth + 'px';\n      el.firstChild.style.height = el.clientHeight + 'px';\n    }\n  }\n\n  G_vmlCanvasManager_.init();\n\n  // precompute \"00\" to \"FF\"\n  var dec2hex = [];\n  for (var i = 0; i < 16; i++) {\n    for (var j = 0; j < 16; j++) {\n      dec2hex[i * 16 + j] = i.toString(16) + j.toString(16);\n    }\n  }\n\n  function createMatrixIdentity() {\n    return [\n      [1, 0, 0],\n      [0, 1, 0],\n      [0, 0, 1]\n    ];\n  }\n\n  function matrixMultiply(m1, m2) {\n    var result = createMatrixIdentity();\n\n    for (var x = 0; x < 3; x++) {\n      for (var y = 0; y < 3; y++) {\n        var sum = 0;\n\n        for (var z = 0; z < 3; z++) {\n          sum += m1[x][z] * m2[z][y];\n        }\n\n        result[x][y] = sum;\n      }\n    }\n    return result;\n  }\n\n  function copyState(o1, o2) {\n    o2.fillStyle     = o1.fillStyle;\n    o2.lineCap       = o1.lineCap;\n    o2.lineJoin      = o1.lineJoin;\n    o2.lineWidth     = o1.lineWidth;\n    o2.miterLimit    = o1.miterLimit;\n    o2.shadowBlur    = o1.shadowBlur;\n    o2.shadowColor   = o1.shadowColor;\n    o2.shadowOffsetX = o1.shadowOffsetX;\n    o2.shadowOffsetY = o1.shadowOffsetY;\n    o2.strokeStyle   = o1.strokeStyle;\n    o2.globalAlpha   = o1.globalAlpha;\n    o2.arcScaleX_    = o1.arcScaleX_;\n    o2.arcScaleY_    = o1.arcScaleY_;\n    o2.lineScale_    = o1.lineScale_;\n  }\n\n  function processStyle(styleString) {\n    var str, alpha = 1;\n\n    styleString = String(styleString);\n    if (styleString.substring(0, 3) == 'rgb') {\n      var start = styleString.indexOf('(', 3);\n      var end = styleString.indexOf(')', start + 1);\n      var guts = styleString.substring(start + 1, end).split(',');\n\n      str = '#';\n      for (var i = 0; i < 3; i++) {\n        str += dec2hex[Number(guts[i])];\n      }\n\n      if (guts.length == 4 && styleString.substr(3, 1) == 'a') {\n        alpha = guts[3];\n      }\n    } else {\n      str = styleString;\n    }\n\n    return {color: str, alpha: alpha};\n  }\n\n  function processLineCap(lineCap) {\n    switch (lineCap) {\n      case 'butt':\n        return 'flat';\n      case 'round':\n        return 'round';\n      case 'square':\n      default:\n        return 'square';\n    }\n  }\n\n  /**\n   * This class implements CanvasRenderingContext2D interface as described by\n   * the WHATWG.\n   * @param {HTMLElement} surfaceElement The element that the 2D context should\n   * be associated with\n   */\n  function CanvasRenderingContext2D_(surfaceElement) {\n    this.m_ = createMatrixIdentity();\n\n    this.mStack_ = [];\n    this.aStack_ = [];\n    this.currentPath_ = [];\n\n    // Canvas context properties\n    this.strokeStyle = '#000';\n    this.fillStyle = '#000';\n\n    this.lineWidth = 1;\n    this.lineJoin = 'miter';\n    this.lineCap = 'butt';\n    this.miterLimit = Z * 1;\n    this.globalAlpha = 1;\n    this.canvas = surfaceElement;\n\n    var el = surfaceElement.ownerDocument.createElement('div');\n    el.style.width =  surfaceElement.clientWidth + 'px';\n    el.style.height = surfaceElement.clientHeight + 'px';\n    if(msie_ver!=8) el.style.overflow = 'hidden';\n    el.style.position = 'absolute';\n    surfaceElement.appendChild(el);\n\n    this.element_ = el;\n    this.arcScaleX_ = 1;\n    this.arcScaleY_ = 1;\n    this.lineScale_ = 1;\n  }\n\n  var contextPrototype = CanvasRenderingContext2D_.prototype;\n  contextPrototype.clearRect = function() {\n    this.element_.innerHTML = '';\n  };\n\n  contextPrototype.beginPath = function() {\n    // TODO: Branch current matrix so that save/restore has no effect\n    //       as per safari docs.\n    this.currentPath_ = [];\n  };\n\n  contextPrototype.moveTo = function(aX, aY) {\n    var p = this.getCoords_(aX, aY);\n    this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y});\n    this.currentX_ = p.x;\n    this.currentY_ = p.y;\n  };\n\n  contextPrototype.lineTo = function(aX, aY) {\n    var p = this.getCoords_(aX, aY);\n    this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y});\n\n    this.currentX_ = p.x;\n    this.currentY_ = p.y;\n  };\n\n  contextPrototype.bezierCurveTo = function(aCP1x, aCP1y,\n                                            aCP2x, aCP2y,\n                                            aX, aY) {\n    var p = this.getCoords_(aX, aY);\n    var cp1 = this.getCoords_(aCP1x, aCP1y);\n    var cp2 = this.getCoords_(aCP2x, aCP2y);\n    bezierCurveTo(this, cp1, cp2, p);\n  };\n\n  // Helper function that takes the already fixed cordinates.\n  function bezierCurveTo(self, cp1, cp2, p) {\n    self.currentPath_.push({\n      type: 'bezierCurveTo',\n      cp1x: cp1.x,\n      cp1y: cp1.y,\n      cp2x: cp2.x,\n      cp2y: cp2.y,\n      x: p.x,\n      y: p.y\n    });\n    self.currentX_ = p.x;\n    self.currentY_ = p.y;\n  }\n\n  contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) {\n    // the following is lifted almost directly from\n    // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes\n\n    var cp = this.getCoords_(aCPx, aCPy);\n    var p = this.getCoords_(aX, aY);\n\n    var cp1 = {\n      x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_),\n      y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_)\n    };\n    var cp2 = {\n      x: cp1.x + (p.x - this.currentX_) / 3.0,\n      y: cp1.y + (p.y - this.currentY_) / 3.0\n    };\n\n    bezierCurveTo(this, cp1, cp2, p);\n  };\n\n  contextPrototype.arc = function(aX, aY, aRadius,\n                                  aStartAngle, aEndAngle, aClockwise) {\n    aRadius *= Z;\n    var arcType = aClockwise ? 'at' : 'wa';\n\n    var xStart = aX + mc(aStartAngle) * aRadius - Z2;\n    var yStart = aY + ms(aStartAngle) * aRadius - Z2;\n\n    var xEnd = aX + mc(aEndAngle) * aRadius - Z2;\n    var yEnd = aY + ms(aEndAngle) * aRadius - Z2;\n\n    // IE won't render arches drawn counter clockwise if xStart == xEnd.\n    if (xStart == xEnd && !aClockwise) {\n      xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something\n                       // that can be represented in binary\n    }\n\n    var p = this.getCoords_(aX, aY);\n    var pStart = this.getCoords_(xStart, yStart);\n    var pEnd = this.getCoords_(xEnd, yEnd);\n\n    this.currentPath_.push({type: arcType,\n                           x: p.x,\n                           y: p.y,\n                           radius: aRadius,\n                           xStart: pStart.x,\n                           yStart: pStart.y,\n                           xEnd: pEnd.x,\n                           yEnd: pEnd.y});\n\n  };\n\n  contextPrototype.rect = function(aX, aY, aWidth, aHeight) {\n    this.moveTo(aX, aY);\n    this.lineTo(aX + aWidth, aY);\n    this.lineTo(aX + aWidth, aY + aHeight);\n    this.lineTo(aX, aY + aHeight);\n    this.closePath();\n  };\n\n  contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) {\n    var oldPath = this.currentPath_;\n    this.beginPath();\n\n    this.moveTo(aX, aY);\n    this.lineTo(aX + aWidth, aY);\n    this.lineTo(aX + aWidth, aY + aHeight);\n    this.lineTo(aX, aY + aHeight);\n    this.closePath();\n    this.stroke();\n\n    this.currentPath_ = oldPath;\n  };\n\n  contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) {\n    var oldPath = this.currentPath_;\n    this.beginPath();\n\n    this.moveTo(aX, aY);\n    this.lineTo(aX + aWidth, aY);\n    this.lineTo(aX + aWidth, aY + aHeight);\n    this.lineTo(aX, aY + aHeight);\n    this.closePath();\n    this.fill();\n\n    this.currentPath_ = oldPath;\n  };\n\n  contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) {\n    var gradient = new CanvasGradient_('gradient');\n    gradient.x0_ = aX0;\n    gradient.y0_ = aY0;\n    gradient.x1_ = aX1;\n    gradient.y1_ = aY1;\n    return gradient;\n  };\n\n  contextPrototype.createRadialGradient = function(aX0, aY0, aR0,\n                                                   aX1, aY1, aR1) {\n    var gradient = new CanvasGradient_('gradientradial');\n    gradient.x0_ = aX0;\n    gradient.y0_ = aY0;\n    gradient.r0_ = aR0;\n    gradient.x1_ = aX1;\n    gradient.y1_ = aY1;\n    gradient.r1_ = aR1;\n    return gradient;\n  };\n\n  contextPrototype.drawImage = function(image, var_args) {\n    var dx, dy, dw, dh, sx, sy, sw, sh;\n\n    // to find the original width we overide the width and height\n    var oldRuntimeWidth = image.runtimeStyle.width;\n    var oldRuntimeHeight = image.runtimeStyle.height;\n    image.runtimeStyle.width = 'auto';\n    image.runtimeStyle.height = 'auto';\n\n    // get the original size\n    var w = image.width;\n    var h = image.height;\n\n    // and remove overides\n    image.runtimeStyle.width = oldRuntimeWidth;\n    image.runtimeStyle.height = oldRuntimeHeight;\n\n    if (arguments.length == 3) {\n      dx = arguments[1];\n      dy = arguments[2];\n      sx = sy = 0;\n      sw = dw = w;\n      sh = dh = h;\n    } else if (arguments.length == 5) {\n      dx = arguments[1];\n      dy = arguments[2];\n      dw = arguments[3];\n      dh = arguments[4];\n      sx = sy = 0;\n      sw = w;\n      sh = h;\n    } else if (arguments.length == 9) {\n      sx = arguments[1];\n      sy = arguments[2];\n      sw = arguments[3];\n      sh = arguments[4];\n      dx = arguments[5];\n      dy = arguments[6];\n      dw = arguments[7];\n      dh = arguments[8];\n    } else {\n      throw Error('Invalid number of arguments');\n    }\n\n    var d = this.getCoords_(dx, dy);\n\n    var w2 = sw / 2;\n    var h2 = sh / 2;\n\n    var vmlStr = [];\n\n    var W = 10;\n    var H = 10;\n\n    // For some reason that I've now forgotten, using divs didn't work\n    vmlStr.push(' <g_vml_:group',\n                ' coordsize=\"', Z * W, ',', Z * H, '\"',\n                ' coordorigin=\"0,0\"' ,\n                ' style=\"width:', W, 'px;height:', H, 'px;position:absolute;');\n\n    // If filters are necessary (rotation exists), create them\n    // filters are bog-slow, so only create them if abbsolutely necessary\n    // The following check doesn't account for skews (which don't exist\n    // in the canvas spec (yet) anyway.\n\n    if (this.m_[0][0] != 1 || this.m_[0][1]) {\n      var filter = [];\n\n      // Note the 12/21 reversal\n      filter.push('M11=', this.m_[0][0], ',',\n                  'M12=', this.m_[1][0], ',',\n                  'M21=', this.m_[0][1], ',',\n                  'M22=', this.m_[1][1], ',',\n                  'Dx=', mr(d.x / Z), ',',\n                  'Dy=', mr(d.y / Z), '');\n\n      // Bounding box calculation (need to minimize displayed area so that\n      // filters don't waste time on unused pixels.\n      var max = d;\n      var c2 = this.getCoords_(dx + dw, dy);\n      var c3 = this.getCoords_(dx, dy + dh);\n      var c4 = this.getCoords_(dx + dw, dy + dh);\n\n      max.x = m.max(max.x, c2.x, c3.x, c4.x);\n      max.y = m.max(max.y, c2.y, c3.y, c4.y);\n\n      vmlStr.push('padding:0 ', mr(max.x / Z), 'px ', mr(max.y / Z),\n                  'px 0;filter:progid:DXImageTransform.Microsoft.Matrix(',\n                  filter.join(''), \", sizingmethod='clip');\")\n    } else {\n      vmlStr.push('top:', mr(d.y / Z), 'px;left:', mr(d.x / Z), 'px;');\n    }\n\n    vmlStr.push(' \">' ,\n                '<g_vml_:image src=\"', image.src, '\"',\n                ' style=\"width:', Z * dw, 'px;',\n                ' height:', Z * dh, 'px;\"',\n                ' cropleft=\"', sx / w, '\"',\n                ' croptop=\"', sy / h, '\"',\n                ' cropright=\"', (w - sx - sw) / w, '\"',\n                ' cropbottom=\"', (h - sy - sh) / h, '\"',\n                ' />',\n                '</g_vml_:group>');\n\n    this.element_.insertAdjacentHTML('BeforeEnd',\n                                    vmlStr.join(''));\n  };\n\n  contextPrototype.stroke = function(aFill) {\n    var lineStr = [];\n    var lineOpen = false;\n    var a = processStyle(aFill ? this.fillStyle : this.strokeStyle);\n    var color = a.color;\n    var opacity = a.alpha * this.globalAlpha;\n\n    var W = 10;\n    var H = 10;\n\n    lineStr.push('<g_vml_:shape',\n                 ' filled=\"', !!aFill, '\"',\n                 ' style=\"position:absolute;width:', W, 'px;height:', H, 'px;\"',\n                 ' coordorigin=\"0 0\" coordsize=\"', Z * W, ' ', Z * H, '\"',\n                 ' stroked=\"', !aFill, '\"',\n                 ' path=\"');\n\n    var newSeq = false;\n    var min = {x: null, y: null};\n    var max = {x: null, y: null};\n\n    for (var i = 0; i < this.currentPath_.length; i++) {\n      var p = this.currentPath_[i];\n      var c;\n\n      switch (p.type) {\n        case 'moveTo':\n          c = p;\n          lineStr.push(' m ', mr(p.x), ',', mr(p.y));\n          break;\n        case 'lineTo':\n          lineStr.push(' l ', mr(p.x), ',', mr(p.y));\n          break;\n        case 'close':\n          lineStr.push(' x ');\n          p = null;\n          break;\n        case 'bezierCurveTo':\n          lineStr.push(' c ',\n                       mr(p.cp1x), ',', mr(p.cp1y), ',',\n                       mr(p.cp2x), ',', mr(p.cp2y), ',',\n                       mr(p.x), ',', mr(p.y));\n          break;\n        case 'at':\n        case 'wa':\n          lineStr.push(' ', p.type, ' ',\n                       mr(p.x - this.arcScaleX_ * p.radius), ',',\n                       mr(p.y - this.arcScaleY_ * p.radius), ' ',\n                       mr(p.x + this.arcScaleX_ * p.radius), ',',\n                       mr(p.y + this.arcScaleY_ * p.radius), ' ',\n                       mr(p.xStart), ',', mr(p.yStart), ' ',\n                       mr(p.xEnd), ',', mr(p.yEnd));\n          break;\n      }\n\n      // TODO: Following is broken for curves due to\n      //       move to proper paths.\n\n      // Figure out dimensions so we can do gradient fills\n      // properly\n      if (p) {\n        if (min.x == null || p.x < min.x) {\n          min.x = p.x;\n        }\n        if (max.x == null || p.x > max.x) {\n          max.x = p.x;\n        }\n        if (min.y == null || p.y < min.y) {\n          min.y = p.y;\n        }\n        if (max.y == null || p.y > max.y) {\n          max.y = p.y;\n        }\n      }\n    }\n    lineStr.push(' \">');\n\n    if (!aFill) {\n      var lineWidth = this.lineScale_ * this.lineWidth;\n\n      // VML cannot correctly render a line if the width is less than 1px.\n      // In that case, we dilute the color to make the line look thinner.\n      if (lineWidth < 1) {\n        opacity *= lineWidth;\n      }\n\n      lineStr.push(\n        '<g_vml_:stroke',\n        ' opacity=\"', opacity, '\"',\n        ' joinstyle=\"', this.lineJoin, '\"',\n        ' miterlimit=\"', this.miterLimit, '\"',\n        ' endcap=\"', processLineCap(this.lineCap), '\"',\n        ' weight=\"', lineWidth, 'px\"',\n        ' color=\"', color, '\" />'\n      );\n    } else if (typeof this.fillStyle == 'object') {\n      var fillStyle = this.fillStyle;\n      var angle = 0;\n      var focus = {x: 0, y: 0};\n\n      // additional offset\n      var shift = 0;\n      // scale factor for offset\n      var expansion = 1;\n\n      if (fillStyle.type_ == 'gradient') {\n        var x0 = fillStyle.x0_ / this.arcScaleX_;\n        var y0 = fillStyle.y0_ / this.arcScaleY_;\n        var x1 = fillStyle.x1_ / this.arcScaleX_;\n        var y1 = fillStyle.y1_ / this.arcScaleY_;\n        var p0 = this.getCoords_(x0, y0);\n        var p1 = this.getCoords_(x1, y1);\n        var dx = p1.x - p0.x;\n        var dy = p1.y - p0.y;\n        angle = Math.atan2(dx, dy) * 180 / Math.PI;\n\n        // The angle should be a non-negative number.\n        if (angle < 0) {\n          angle += 360;\n        }\n\n        // Very small angles produce an unexpected result because they are\n        // converted to a scientific notation string.\n        if (angle < 1e-6) {\n          angle = 0;\n        }\n      } else {\n        var p0 = this.getCoords_(fillStyle.x0_, fillStyle.y0_);\n        var width  = max.x - min.x;\n        var height = max.y - min.y;\n        focus = {\n          x: (p0.x - min.x) / width,\n          y: (p0.y - min.y) / height\n        };\n\n        width  /= this.arcScaleX_ * Z;\n        height /= this.arcScaleY_ * Z;\n        var dimension = m.max(width, height);\n        shift = 2 * fillStyle.r0_ / dimension;\n        expansion = 2 * fillStyle.r1_ / dimension - shift;\n      }\n\n      // We need to sort the color stops in ascending order by offset,\n      // otherwise IE won't interpret it correctly.\n      var stops = fillStyle.colors_;\n      stops.sort(function(cs1, cs2) {\n        return cs1.offset - cs2.offset;\n      });\n\n      var length = stops.length;\n      var color1 = stops[0].color;\n      var color2 = stops[length - 1].color;\n      var opacity1 = stops[0].alpha * this.globalAlpha;\n      var opacity2 = stops[length - 1].alpha * this.globalAlpha;\n\n      var colors = [];\n      for (var i = 0; i < length; i++) {\n        var stop = stops[i];\n        colors.push(stop.offset * expansion + shift + ' ' + stop.color);\n      }\n\n      // When colors attribute is used, the meanings of opacity and o:opacity2\n      // are reversed.\n      lineStr.push('<g_vml_:fill type=\"', fillStyle.type_, '\"',\n                   ' method=\"none\" focus=\"100%\"',\n                   ' color=\"', color1, '\"',\n                   ' color2=\"', color2, '\"',\n                   ' colors=\"', colors.join(','), '\"',\n                   ' opacity=\"', opacity2, '\"',\n                   ' g_o_:opacity2=\"', opacity1, '\"',\n                   ' angle=\"', angle, '\"',\n                   ' focusposition=\"', focus.x, ',', focus.y, '\" />');\n    } else {\n      lineStr.push('<g_vml_:fill color=\"', color, '\" opacity=\"', opacity,\n                   '\" />');\n    }\n\n    lineStr.push('</g_vml_:shape>');\n\n    this.element_.insertAdjacentHTML('beforeEnd', lineStr.join(''));\n  };\n\n  contextPrototype.fill = function() {\n    this.stroke(true);\n  }\n\n  contextPrototype.closePath = function() {\n    this.currentPath_.push({type: 'close'});\n  };\n\n  /**\n   * @private\n   */\n  contextPrototype.getCoords_ = function(aX, aY) {\n    var m = this.m_;\n    return {\n      x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2,\n      y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2\n    }\n  };\n\n  contextPrototype.save = function() {\n    var o = {};\n    copyState(this, o);\n    this.aStack_.push(o);\n    this.mStack_.push(this.m_);\n    this.m_ = matrixMultiply(createMatrixIdentity(), this.m_);\n  };\n\n  contextPrototype.restore = function() {\n    copyState(this.aStack_.pop(), this);\n    this.m_ = this.mStack_.pop();\n  };\n\n  function matrixIsFinite(m) {\n    for (var j = 0; j < 3; j++) {\n      for (var k = 0; k < 2; k++) {\n        if (!isFinite(m[j][k]) || isNaN(m[j][k])) {\n          return false;\n        }\n      }\n    }\n    return true;\n  }\n\n  function setM(ctx, m, updateLineScale) {\n    if (!matrixIsFinite(m)) {\n      return;\n    }\n    ctx.m_ = m;\n\n    if (updateLineScale) {\n      // Get the line scale.\n      // Determinant of this.m_ means how much the area is enlarged by the\n      // transformation. So its square root can be used as a scale factor\n      // for width.\n      var det = m[0][0] * m[1][1] - m[0][1] * m[1][0];\n      ctx.lineScale_ = sqrt(abs(det));\n    }\n  }\n\n  contextPrototype.translate = function(aX, aY) {\n    var m1 = [\n      [1,  0,  0],\n      [0,  1,  0],\n      [aX, aY, 1]\n    ];\n\n    setM(this, matrixMultiply(m1, this.m_), false);\n  };\n\n  contextPrototype.rotate = function(aRot) {\n    var c = mc(aRot);\n    var s = ms(aRot);\n\n    var m1 = [\n      [c,  s, 0],\n      [-s, c, 0],\n      [0,  0, 1]\n    ];\n\n    setM(this, matrixMultiply(m1, this.m_), false);\n  };\n\n  contextPrototype.scale = function(aX, aY) {\n    this.arcScaleX_ *= aX;\n    this.arcScaleY_ *= aY;\n    var m1 = [\n      [aX, 0,  0],\n      [0,  aY, 0],\n      [0,  0,  1]\n    ];\n\n    setM(this, matrixMultiply(m1, this.m_), true);\n  };\n\n  contextPrototype.transform = function(m11, m12, m21, m22, dx, dy) {\n    var m1 = [\n      [m11, m12, 0],\n      [m21, m22, 0],\n      [dx,  dy,  1]\n    ];\n\n    setM(this, matrixMultiply(m1, this.m_), true);\n  };\n\n  contextPrototype.setTransform = function(m11, m12, m21, m22, dx, dy) {\n    var m = [\n      [m11, m12, 0],\n      [m21, m22, 0],\n      [dx,  dy,  1]\n    ];\n\n    setM(this, m, true);\n  };\n\n  /******** STUBS ********/\n  contextPrototype.clip = function() {\n    // TODO: Implement\n  };\n\n  contextPrototype.arcTo = function() {\n    // TODO: Implement\n  };\n\n  contextPrototype.createPattern = function() {\n    return new CanvasPattern_;\n  };\n\n  // Gradient / Pattern Stubs\n  function CanvasGradient_(aType) {\n    this.type_ = aType;\n    this.x0_ = 0;\n    this.y0_ = 0;\n    this.r0_ = 0;\n    this.x1_ = 0;\n    this.y1_ = 0;\n    this.r1_ = 0;\n    this.colors_ = [];\n  }\n\n  CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) {\n    aColor = processStyle(aColor);\n    this.colors_.push({offset: aOffset,\n                       color: aColor.color,\n                       alpha: aColor.alpha});\n  };\n\n  function CanvasPattern_() {}\n\n  // set up externs\n  G_vmlCanvasManager = G_vmlCanvasManager_;\n  CanvasRenderingContext2D = CanvasRenderingContext2D_;\n  CanvasGradient = CanvasGradient_;\n  CanvasPattern = CanvasPattern_;\n\n})();\n\n} // if\n"
  },
  {
    "path": "examples/canvaspaint/readme.md",
    "content": ""
  },
  {
    "path": "examples/community.md",
    "content": "# RxJS Community Examples #\n\nBelow are samples using RxJS as provided by the community.\n\n- [React](http://facebook.github.io/react/)\n    - [Rx-React](https://github.com/fdecampredon/rx-react)\n    - [RxReact](https://github.com/AlexMost/RxReact)\n    - [cycle-react](https://github.com/pH200/cycle-react)\n    - [React RxJS Autocomplete](https://github.com/eliseumds/react-autocomplete)\n    - [React RxJS TODO MVC](https://github.com/fdecampredon/react-rxjs-todomvc)\n    - [Rx TODO MVC](https://github.com/footballradar/rx-todomvc)\n    - [React RxJS Router](https://github.com/kmcclosk/reactjs-rxjs-example)\n    - [React + RxJS + Angular 2.0 di.js TODO MVC](https://github.com/joelhooks/react-rxjs-angular-di-todomvc)\n    - [React + RxJS Reactive Cube](https://github.com/hugobessaa/cubactive)\n    - [Real-Time with React + RxJS + Meteor](https://medium.com/@bobiblazeski/functional-reactive-interfaces-e8de034de6bd)\n    - [React + RxJS Flow](https://github.com/justinwoo/react-rxjs-flow)\n    - [Reactive Widgets](https://github.com/zxbodya/reactive-widgets)\n    - [React RxJS Infinite Scroll](https://github.com/justinwoo/react-rxjs-scroll)\n    - [React RxJS Flux](https://github.com/xgrommx/react-rx-flux)\n    - [Real-Time TODOs using RethinkDB, React, RxJS and Socket.io](https://github.com/bobiblazeski/rio)\n    - [React RxJS and PureScript implementation of the Game of Life](https://github.com/EugeneN/pureGoL)\n    - [React + RxJs + React-Router + JSON](https://github.com/Cmdv/React-RxJS)\n    - [React + RxJs Translating Morse codes into letters and words](https://github.com/AlexMost/morse)\n\n- [Flux](http://facebook.github.io/flux/)\n    - [Rx-Flux](https://github.com/fdecampredon/rx-flux)\n    - [ReactiveFlux](https://github.com/codesuki/reactive-flux)\n    - [Thundercats.js](https://github.com/r3dm/thundercats)\n    - [Flurx](https://github.com/cell303/flurx)\n    - [RR](https://github.com/winsonwq/RR)\n    - [Loxe](https://github.com/ahomu/Loxe)\n    - [tanok](https://github.com/brabadu/tanok)\n\n- [Ember](http://emberjs.com/)\n    - [RxEmber](https://github.com/blesh/RxEmber)\n\n- [AngularJS](http://angularjs.org)\n    - [Ninya.io - Angular + RxJS + rx.angular.js](https://github.com/ninya-io/ninya.io) - [Site](http://stackwho.herokuapp.com/)\n    - [The Car Game](https://github.com/mikkark/TheCarGame) - [Site](https://thecargame.herokuapp.com/) - [Blog Post](https://allthingsarchitectural.wordpress.com/2014/11/24/game-programming-with-angular-rxjs-and-node-js/)\n\n- [Cycle](https://github.com/staltz/cycle)\n    - [Cycle TODO MVC](https://github.com/staltz/todomvc-cycle)\n\n- [Firebase](https://www.firebase.com/)\n    - [Firebase Promisified](https://github.com/nemanja-stanarevic/firebase-promisified)\n    - [Firebase + RxJS](http://blog.cryptoguru.com/2014/11/frp-using-rxjs-and-firebase.html)  \n\n\n- [WebRx](https://github.com/oliverw/webrx)\n- [Zorium](https://zorium.org/)\n\n- Everything else\n    - [RxJS Examples from Cmdv](https://github.com/Cmdv/RxJS-Examples)\n    - [RxVision](http://jaredly.github.io/rxvision/)\n    - [Mario Elm Example](http://fudini.github.io/rx/mario.html)\n    - [Reactive Trader](https://github.com/AdaptiveConsulting/ReactiveTrader) - [Site](https://reactivetrader.azurewebsites.net/)\n\n- [NPM Dependencies](https://www.npmjs.com/browse/depended/rx)\n"
  },
  {
    "path": "examples/crop/crop.css",
    "content": "#container {\n    position: relative;\n}\n\n.canvasoverlays {\n    position: absolute;\n}\n\n.handle {\n    position: absolute;\n    width: 20px;\n    height: 20px;\n    background-color: rgba(255,255,255,0.5);\n    border: 1px solid rgba(0,0,0,0.5);\n    user-select: none;\n}\n\n.handle#tr {\n    margin-left: -20px;\n}\n\n.handle#t, .handle#b {\n    margin-left: -10px;\n}\n\n.handle#r, .handle#l {\n    margin-top: -10px;\n}\n\n.handle#br {\n    margin-left: -20px;\n    margin-top: -20px;\n}\n\n.handle#bl {\n    margin-top: -20px;\n}\n"
  },
  {
    "path": "examples/crop/crop.html",
    "content": "﻿<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" >\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta charset=\"utf-8\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <title>Rx for JavaScript Rocks!</title>\n    <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap.min.css\">\n    <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap-responsive.min.css\">\n    <link href=\"crop.css\" rel=\"stylesheet\" >\n    <!--[if lt IE 9]>\n      <script type=\"text/javascript\" src=\"excanvas_src.js\"></script>\n    <![endif]-->\n</head>\n<body>\n    <div id=\"container\" style=\"margin-left: 120px;\">\n        <canvas id=\"buffer\" class=\"canvasoverlays\"></canvas>\n        <canvas id=\"overlay\" class=\"canvasoverlays\"></canvas>\n    </div>\n    <script src=\"../../dist/rx.lite.compat.js\"></script>\n    <script src=\"requestanimationframescheduler.js\"></script>\n    <script src=\"crop.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/crop/crop.js",
    "content": "(function (window) {\n\n  var // a model for the region of the image about to be cropped\n    boundingBox,\n    // an array of draggable elements that modify the crop region\n    handles = [],\n    // we need handles as a nodeList in order to add multiple event listeners at once\n    handleNodes,\n    // `overlay` is a canvas element that allows us to darken the portion  of the image that will be removed.\n    overlay,\n    // `ctx` will be the drawing context for `overlay`\n    ctx;\n\n  function loadImage () {\n      var // `buffer` is a canvas element that displays the actual image to crop\n        buffer = document.getElementById('buffer'),\n        // `img` is an img element we use to load the img, though we never add it to the DOM\n        img = document.createElement('img');\n\n      img.src = 'images/leaf twirl.jpg';\n\n      // Returns an observable which fires when the image is loaded\n      return Rx.Observable.fromEvent(img, 'load').map(function () {\n        overlay.width = img.width;\n        overlay.height = img.height;\n\n        buffer.width = img.width;\n        buffer.height = img.height;\n        buffer.getContext('2d').drawImage(img, 0, 0);\n\n        return {\n          width: img.width,\n          height: img.height\n        };\n      });\n  }\n\n  function initBoundingBox(size) {\n    boundingBox = {\n      x: 0,\n      y: 0,\n      x2: size.width,\n      y2: size.height\n    };\n  }\n\n  function createHandles () {\n    var container = document.querySelector('#container');\n\n    function createHandle (id, render, updateModel) {\n      var handle = document.createElement('div');\n      handle.className += ' handle';\n      handle.setAttribute('id', id);\n      container.appendChild(handle);\n\n      // `render` allows us to visually update the handle after it has been dragged\n      handle['render'] = render;\n      // `updateModel` allows us to modify the correct part of the crop region model\n      handle['updateModel'] = updateModel;\n\n      handles.push(handle);\n    }\n\n    // top left\n    createHandle('tl', function () {\n      this.style.top = boundingBox.y + 'px';\n      this.style.left = boundingBox.x + 'px';\n    }, function (x, y) {\n      boundingBox.x = x;\n      boundingBox.y = y;\n    });\n\n    //top right\n    createHandle('tr', function () {\n      this.style.top = boundingBox.y + 'px';\n      this.style.left = boundingBox.x2 + 'px';\n    }, function (x, y) {\n      boundingBox.y = y;\n      boundingBox.x2 = x;\n    });\n\n    // bottom left\n    createHandle('bl', function (s) {\n      this.style.top = boundingBox.y2 + 'px';\n      this.style.left = boundingBox.x + 'px';\n    }, function (x, y) {\n      boundingBox.x = x;\n      boundingBox.y2 = y;\n    });\n\n    // bottom right\n    createHandle('br', function (s) {\n      this.style.top = boundingBox.y2 + 'px';\n      this.style.left = boundingBox.x2 + 'px';\n    }, function (x, y) {\n      boundingBox.y2 = y;\n      boundingBox.x2 = x;\n    });\n\n    // render the handles in their initial positiions\n    handles.forEach(function (element) { element['render'](); });\n\n    // grab handles in a nodeList so we can add mousedown listeners to all of them at once\n    handleNodes = document.querySelectorAll('.handle');\n  }\n\n  function respondToGestures() {\n    // Check for pointer events\n    var moves = 'mousemove', downs = 'mousedown', ups = 'mouseup';\n    if (window.navigator.pointerEnabled) {\n      moves = 'pointermove';\n      downs = 'pointerdown';\n      ups = 'pointerup';\n    }\n\n    var fromEvent = Rx.Observable.fromEvent,\n        move = fromEvent(overlay, moves),\n        up   = fromEvent(document, ups),\n        down = fromEvent(handleNodes, downs);\n\n    // When the mouse is down on a handle, return the handle element\n    return down.flatMap(function (handle) {\n      handle.preventDefault();\n\n      return move\n        // We combine the handle element with the position data from the move event\n        .map(function (pos) {\n          return {\n            element: handle.target,\n            offsetX: pos.offsetX,\n            offsetY: pos.offsetY\n          };\n        })\n        // However, when the mouse is up (anywhere on the document) then stop the stream\n        .takeUntil(up);\n    });\n  }\n\n  function drawOverlay() {\n    var x = boundingBox.x,\n        y = boundingBox.y,\n        w = boundingBox.x2 - boundingBox.x,\n        h = boundingBox.y2 - boundingBox.y;\n\n    ctx.globalCompositeOperation = 'source-over';\n\n    ctx.clearRect(0, 0, overlay.width, overlay.height);\n\n    ctx.fillStyle = 'rgba(0,0,0,0.7)';\n    ctx.fillRect(0, 0, overlay.width, overlay.height);\n\n    ctx.globalCompositeOperation = 'destination-out';\n    ctx.fillStyle = 'rgba(0,0,0,1)';\n    ctx.fillRect(x, y, w, h);\n    ctx.fill();\n\n    handles.forEach(function (tool) { tool['render'](); });\n  }\n\n  function main () {\n    overlay = document.getElementById('overlay');\n    ctx = overlay.getContext('2d');\n\n    var subscription = loadImage()\n      .flatMap(function (size) {\n\n        // Initialize after load\n        initBoundingBox(size);\n        createHandles();\n\n        return respondToGestures();\n      })\n      .subscribe(function (data) {\n\n        // Update model and redraw via an async operation\n        data.element.updateModel(data.offsetX, data.offsetY);\n\n        Rx.Scheduler.requestAnimationFrame.schedule(null, drawOverlay);\n      });\n  }\n\n  main();\n\n}(window));\n"
  },
  {
    "path": "examples/crop/images/attribution.txt",
    "content": "leaf twirl\nhttp://www.flickr.com/photos/prince_tigereye/1775945938/\n"
  },
  {
    "path": "examples/crop/readme.md",
    "content": ""
  },
  {
    "path": "examples/crop/requestanimationframescheduler.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n(function (root, factory) {\n  var freeExports = typeof exports == 'object' && exports,\n    freeModule = typeof module == 'object' && module && module.exports == freeExports && module,\n    freeGlobal = typeof global == 'object' && global;\n  if (freeGlobal.global === freeGlobal) {\n    window = freeGlobal;\n  }\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['rx', 'exports'], function (Rx, exports) {\n      root.Rx = factory(root, exports, Rx);\n      return root.Rx;\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('./rx'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}(this, function (window, exp, Rx, undefined) {\n\n  var Scheduler = Rx.Scheduler,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    Disposable = Rx.Disposable,\n    inherits = Rx.internals.inherits;\n\n  // Get the right animation frame method\n  var requestAnimFrame, cancelAnimFrame;\n  if (window.requestAnimationFrame) {\n    requestAnimFrame = window.requestAnimationFrame;\n    cancelAnimFrame = window.cancelAnimationFrame;\n  } else if (window.mozRequestAnimationFrame) {\n    requestAnimFrame = window.mozRequestAnimationFrame;\n    cancelAnimFrame = window.mozCancelAnimationFrame;\n  } else if (window.webkitRequestAnimationFrame) {\n    requestAnimFrame = window.webkitRequestAnimationFrame;\n    cancelAnimFrame = window.webkitCancelAnimationFrame;\n  } else if (window.msRequestAnimationFrame) {\n    requestAnimFrame = window.msRequestAnimationFrame;\n    cancelAnimFrame = window.msCancelAnimationFrame;\n  } else if (window.oRequestAnimationFrame) {\n    requestAnimFrame = window.oRequestAnimationFrame;\n    cancelAnimFrame = window.oCancelAnimationFrame;\n  } else {\n    requestAnimFrame = function(cb) { window.setTimeout(cb, 1000 / 60); };\n    cancelAnimFrame = window.clearTimeout;\n  }\n\n  /**\n   * Gets a scheduler that schedules schedules work on the requestAnimationFrame for immediate actions.\n   */\n  Scheduler.requestAnimationFrame = (function () {\n    var RequestAnimationFrameScheduler = (function (__super__) {\n      inherits(RequestAnimationFrameScheduler, __super__);\n      function RequestAnimationFrameScheduler() {\n        __super__.call(this);\n      }\n\n      function scheduleAction(disposable, action, scheduler, state) {\n        return function schedule() {\n          disposable.setDisposable(Disposable._fixup(action(scheduler, state)));\n        };\n      }\n\n      function ClearDisposable(method, id) {\n        this._id = id;\n        this._method = method;\n        this.isDisposed = false;\n      }\n\n      ClearDisposable.prototype.dispose = function () {\n        if (!this.isDisposed) {\n          this.isDisposed = true;\n          this._method.call(null, this._id);\n        }\n      };\n\n      RequestAnimationFrameScheduler.prototype.schedule = function (state, action) {\n        var disposable = new SingleAssignmentDisposable(),\n            id = requestAnimFrame(scheduleAction(disposable, action, this, state));\n        return new BinaryDisposable(disposable, new ClearDisposable(cancelAnimFrame, id));\n      };\n\n      RequestAnimationFrameScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n        if (dueTime === 0) { return this.schedule(state, action); }\n        var disposable = new SingleAssignmentDisposable(),\n            id = root.setTimeout(scheduleAction(disposable, action, this, state), dueTime);\n        return new BinaryDisposable(disposable, new ClearDisposable(root.clearTimeout, id));\n      };\n\n      return RequestAnimationFrameScheduler;\n    }(Scheduler));\n\n    return new RequestAnimationFrameScheduler();\n  }());\n\n  return Rx;\n}));\n"
  },
  {
    "path": "examples/d3/index.css",
    "content": "/* Originally from https://github.com/DanGorst/frp-with-bacon */\nh1 {\n  font-family: 'Helvetica';\n  font-size: 32px;\n}\n\nh3 {\n  font-family: 'Helvetica';\n  font-size: 20px;\n}\n\ntext {\n  font-family: 'Helvetica';\n  font-size: 16px;\n}\n\n.axis path, .axis line {\n    fill: none;\n    stroke: #777;\n    shape-rendering: crispEdges;\n}\n\n.axis text {\n    font-family: 'Helvetica';\n    font-size: 14px;\n}\n"
  },
  {
    "path": "examples/d3/index.html",
    "content": "<!DOCTYPE html>\n<head>\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta charset=\"utf-8\">\n  <title>D3 and RxJS</title>\n  <meta name=\"description\" content=\"\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n  <link href=\"index.css\" rel=\"stylesheet\">\n</head>\n<body>\n    <h1>Wikipedia Updates using RxJS</h1>\n    <h3>Originally from <a href=\"https://github.com/DanGorst/frp-with-bacon\">https://github.com/DanGorst/frp-with-bacon</a>\n    <svg></svg>\n\n    <script src=\"../../dist/rx.all.js\"></script>\n    <script src=\"../assets/d3/d3.js\"></script>\n    <script src=\"index.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/d3/index.js",
    "content": "// Originally from https://github.com/DanGorst/frp-with-bacon\n(function (window, d3, Rx) {\n  \"use strict\";\n\n  var fromEvent = Rx.Observable.fromEvent;\n\n  var updatesOverTime = [];\n\n  var width = 960,\n      height = 600,\n      margins = {\n          top: 20,\n          bottom: 50,\n          left: 70,\n          right: 20\n      };\n\n  var svg = d3.select(\"svg\")\n      .attr(\"width\", width)\n      .attr(\"height\", height + 200);\n\n  var xRange = d3.time.scale().range([margins.left, width - margins.right])\n      .domain([new Date(), new Date()]);\n  var yRange = d3.scale.linear().range([height - margins.bottom, margins.top])\n      .domain([0, 0]);\n  var xAxis = d3.svg.axis()\n      .scale(xRange)\n      .tickSize(5)\n      .tickSubdivide(true)\n      .tickFormat(d3.time.format(\"%X\"));\n  var yAxis = d3.svg.axis()\n      .scale(yRange)\n      .tickSize(5)\n      .orient(\"left\")\n      .tickSubdivide(true);\n\n  var xAxisElement = svg.append(\"g\")\n      .attr(\"class\", \"x axis\")\n      .attr(\"transform\", \"translate(0,\" + (height - margins.bottom) + \")\")\n      .call(xAxis);\n\n  // Add a label to the middle of the x axis\n  var xAxisWidth = ((width - margins.right) - margins.left) / 2;\n  xAxisElement.append(\"text\")\n      .attr(\"x\", margins.left + xAxisWidth)\n      .attr(\"y\", 0)\n      .attr(\"dy\", \"3em\")\n      .style(\"text-anchor\", \"middle\")\n      .text(\"Time\");\n\n  var yAxisElement = svg.append(\"g\")\n      .attr(\"class\", \"y axis\")\n      .attr(\"transform\", \"translate(\" + margins.left + \",0)\")\n      .call(yAxis);\n\n  // Add a label to the middle of the y axis\n  var yAxisHeight = ((height - margins.bottom) - margins.top) / 2;\n  yAxisElement.append(\"text\")\n      .attr(\"transform\", \"rotate(-90)\")\n      .attr(\"y\", 0)\n      .attr(\"x\", -(margins.top + yAxisHeight))\n      .attr(\"dy\", \"-3.5em\")\n      .style(\"text-anchor\", \"middle\")\n      .text(\"Updates per second\");\n\n  // Define our line series\n  var lineFunc = d3.svg.line()\n      .x(function(d) { return xRange(d.x); })\n      .y(function(d) { return yRange(d.y); })\n      .interpolate(\"linear\");\n\n  svg.append(\"defs\").append(\"clipPath\")\n      .attr(\"id\", \"clip\")\n      .append(\"rect\")\n      .attr(\"x\", margins.left)\n      .attr(\"y\", margins.top)\n      .attr(\"width\", width)\n      .attr(\"height\", height);\n\n  var line = svg.append(\"g\")\n      .attr(\"clip-path\", \"url(#clip)\")\n      .append(\"path\")\n      .attr(\"stroke\", \"blue\")\n      .attr(\"fill\", \"none\");\n\n  // Add a text element below the chart, which will display the subject of new edits\n  svg.append(\"text\")\n      .attr(\"class\", \"edit-text\")\n      .attr(\"transform\", \"translate(\" + margins.left + \",\" + (height + 20)  + \")\")\n      .attr(\"width\", width - margins.left);\n\n  // Add a text element below the chart, which will display the times that new users\n  // are added\n  var newUserTextWidth = 150;\n  svg.append(\"text\")\n      .attr(\"class\", \"new-user-text\")\n      .attr(\"fill\", \"green\")\n      .attr(\"transform\", \"translate(\" + (width - margins.right - newUserTextWidth) + \",\" + (height + 20)  + \")\")\n      .attr(\"width\", newUserTextWidth);\n\n  var samplingTime = 2000;\n  var maxNumberOfDataPoints = 20;\n\n  function update(updates) {\n      // Update the ranges of the chart to reflect the new data\n      if (updates.length > 0)   {\n          xRange.domain(d3.extent(updates, function(d) { return d.x; }));\n          yRange.domain([d3.min(updates, function(d) { return d.y; }),\n                         d3.max(updates, function(d) { return d.y; })]);\n      }\n\n      // Until we have filled up our data window, we just keep adding data\n      // points to the end of the chart.\n      if (updates.length < maxNumberOfDataPoints) {\n          line.transition()\n              .ease(\"linear\")\n              .attr(\"d\", lineFunc(updates));\n\n          svg.selectAll(\"g.x.axis\")\n              .transition()\n              .ease(\"linear\")\n              .call(xAxis);\n      }\n      // Once we have filled up the window, we then remove points from the\n      // start of the chart, and move the data over so the chart looks\n      // like it is scrolling forwards in time\n      else    {\n          // Calculate the amount of translation on the x axis which equates to the\n          // time between two samples\n          var xTranslation = xRange(updates[0].x) - xRange(updates[1].x);\n\n          // Transform our line series immediately, then translate it from\n          // right to left. This gives the effect of our chart scrolling\n          // forwards in time\n          line\n              .attr(\"d\", lineFunc(updates))\n              .attr(\"transform\", null)\n              .transition()\n              .duration(samplingTime - 20)\n              .ease(\"linear\")\n              .attr(\"transform\", \"translate(\" + xTranslation + \", 0)\");\n\n          svg.selectAll(\"g.x.axis\")\n              .transition()\n              .duration(samplingTime - 20)\n              .ease(\"linear\")\n              .call(xAxis);\n      }\n\n      svg.selectAll(\"g.y.axis\")\n          .transition()\n          .call(yAxis);\n  }\n\n  var textUpdateTransitionDuration = 550;\n  var updateNewUser = function(newUser)   {\n    var text = svg.selectAll(\"text.new-user-text\").data(newUser);\n\n    text.transition()\n      .duration(textUpdateTransitionDuration)\n      .style(\"fill-opacity\", 1e-6)\n      .transition()\n      .duration(textUpdateTransitionDuration)\n      .style(\"fill-opacity\", 1)\n      .text(function (d) { return d; });\n  };\n\n  var updateEditText = function(latestEdit)   {\n      var text = svg.selectAll(\"text.edit-text\").data(latestEdit);\n\n      text.transition()\n          .duration(textUpdateTransitionDuration)\n          .style(\"fill-opacity\", 1e-6)\n          .transition()\n          .duration(textUpdateTransitionDuration)\n          .style(\"fill-opacity\", 1)\n          .text(function (d) { return d; });\n  };\n\n  // Create our websocket to get wiki updates\n  var ws = new window.WebSocket(\"ws://wiki-update-sockets.herokuapp.com/\");\n\n  var openStream = fromEvent(ws, 'open');\n  var closeStream = fromEvent(ws,'close');\n\n  var messageStream = fromEvent(ws, 'message').delaySubscription(openStream).takeUntil(closeStream);\n\n  openStream.subscribe(function () {\n    console.log(\"Connection opened\");\n  });\n\n  closeStream.subscribe(function () {\n    console.log(\"Connection is closed...\");\n  });\n\n  var updateStream = messageStream.map(function(event) {\n      var dataString = event.data;\n      return JSON.parse(dataString);\n  });\n\n  // Filter the update stream for newuser events\n  var newUserStream = updateStream.filter(function(update) {\n      return update.type === \"newuser\";\n  });\n  newUserStream.subscribe(function() {\n    var format = d3.time.format(\"%X\");\n    updateNewUser([\"New user at: \" + format(new Date())]);\n  });\n\n  // Filter the update stream for unspecified events, which we're taking to mean\n  // edits in this case\n  var editStream = updateStream.filter(function(update) {\n      return update.type === \"unspecified\";\n  });\n  editStream.subscribe(function(results) {\n      updateEditText([\"Last edit: \" + results.content]);\n  });\n\n  // Calculate the rate of updates over time\n  var updateCount = updateStream.scan(function(value) {\n      return ++value;\n  }, 0);\n\n  var sampledUpdates = updateCount.sample(samplingTime);\n  var totalUpdatesBeforeLastSample = 0;\n  sampledUpdates.subscribe(function(value) {\n      updatesOverTime.push({\n          x: new Date(),\n          y:(value - totalUpdatesBeforeLastSample) /\n              (samplingTime / 1000)\n      });\n      if (updatesOverTime.length > maxNumberOfDataPoints)  {\n          updatesOverTime.shift();\n      }\n      totalUpdatesBeforeLastSample = value;\n      update(updatesOverTime);\n  });\n}(window, d3, Rx));\n"
  },
  {
    "path": "examples/d3/readme.md",
    "content": ""
  },
  {
    "path": "examples/databinding/binding.css",
    "content": ".tko-example {\n  border-left: 2px solid #ace;\n  border-radius: 5px;\n  padding-left: 8px;\n  position: relative;\n  left: -10px;\n}\n\n.tko-example .tko-example-code {\n  display: none;\n}\n\n.tko-list-pills {\n  margin: 10px;\n}\n\n.tko-list-pills li {\n  border: 1px solid #999;\n  border-radius: 5px;\n  padding: 0px 7px;\n  margin: 2px;\n  display: inline-block;\n}\n\n.tko-list-pills li:hover {\n  color: white;\n  background: black;\n  border-color: white;\n  cursor: pointer;\n}\n"
  },
  {
    "path": "examples/databinding/binding.html",
    "content": "<!DOCTYPE html>\n<html language=\"en\">\n<head>\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta charset=\"utf-8\">\n  <title>TKO knocks you out technically!</title>\n  <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap.min.css\">\n  <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap-responsive.min.css\">\n  <link rel=\"stylesheet\" href=\"binding.css\">\n</head>\n<body>\n  <script src=\"../assets/jquery/jquery-1.10.2.min.js\"></script>\n  <script src=\"../../dist/rx.lite.compat.js\"></script>\n  <script src=\"../../dist/rx.time.js\"></script>\n  <script src=\"binding.js\"></script>\n\n  <div class=\"container\">\n    <h1>TKO - Technical Knockout</h1>\n    <p class=\"lead\">Inspired by <a href=\"https://github.com/cwharris/rxjs-splash\">RxJS-Splash</a> and <a href=\"http://knockoutjs.com/\">Knockout.js</a></p>\n\n    <div class=\"row\">\n      <div class=\"well\" id=\"textRow\">\n        <label>First Name</label>\n        <input type=\"text\" data-tko=\"value: { source: firstName, on: 'keyup' }\"/>\n        <span class=\"help-block\" data-tko=\"text: firstName\"></span>\n\n        <label>Last Name</label>\n        <input type=\"text\" data-tko=\"value: { source: lastName, on: 'keyup' }\"/>\n        <span class=\"help-block\" data-tko=\"text: lastName\"></span>\n\n        <span class=\"help-block\" data-tko=\"text: fullName\"></span>\n      </div>\n    </div>\n    <script>\n    $(function () {\n\n      function ViewModel () {\n        this.firstName = tko.behavior('Reactive');\n        this.lastName = tko.behavior('Extensions');\n        this.fullName = tko.computed({\n          params: {\n            firstName: this.firstName,\n            lastName: this.lastName\n          },\n          read: function (params) {\n            return params.firstName + ' ' + params.lastName;\n          }\n        });\n      }\n\n      var vm = new ViewModel();\n\n      tko.applyBindings(vm, $('#textRow'));\n    });\n    </script>\n\n    <div class=\"row\">\n      <h2>Button Click Example</h2>\n      <div class=\"well\" id=\"buttonRow\">\n\n        <div class=\"navbar\">\n          <div class=\"navbar-inner\">\n            <div class=\"nav\">\n              <button class=\"btn btn-primary\" data-tko=\"click: click\">\n                  Click\n              </button>\n            </div>\n          </div>\n        </div>\n\n        <label>Times Clicked</label>\n        <span class=\"help-block\" data-tko=\"text: value\"></span>\n\n        <label>Time between clicks</label>\n        <span class=\"help-block\" data-tko=\"text: interval\"></span>\n      </div>\n    </div>\n  </div>\n\n  <script>\n\n  $(function () {\n    function ViewModel () {\n\n      var count = 0,\n          self = this;\n\n      this.value = tko.behavior(0);\n\n      this.click = function () {\n        self.value.onNext(++count);\n      };\n\n      this.interval = this.value.timeInterval().map(function (x) { return x.interval; });\n    }\n\n    var vm = new ViewModel();\n\n    tko.applyBindings(vm, $('#buttonRow'));\n  });\n  </script>\n\n</body>\n</html>\n"
  },
  {
    "path": "examples/databinding/binding.js",
    "content": "/**\n* Inspired by Knockout.js and RxJS-Splash\n*/\n(function (root, factory) {\n  var freeExports = typeof exports == 'object' && exports,\n      freeModule = typeof module == 'object' && module && module.exports == freeExports && module,\n      freeGlobal = typeof global == 'object' && global;\n  if (freeGlobal.global === freeGlobal) {\n    window = freeGlobal;\n  }\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['rx', 'exports'], function (Rx, exports) {\n      root.tko = factory(root, exports, Rx);\n      return root.tko;\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx'));\n  } else {\n    root.tko = factory(root, {}, root.Rx);\n  }\n}(this, function (global, exp, Rx, undefined) {\n\n  var Observer = Rx.Observer,\n    Observable = Rx.Observable,\n    observableCreate = Rx.Observable.create,\n    fromEvent = Rx.Observable.fromEvent,\n    BehaviorSubject = Rx.BehaviorSubject,\n    Subject = Rx.Subject,\n    CompositeDisposable = Rx.CompositeDisposable,\n    disposableCreate = Rx.Disposable.create,\n    disposableEmpty = Rx.Disposable.empty,\n    timeoutScheduler = Rx.Scheduler.timeout,\n    inherits = Rx.internals.inherits,\n    splice = Array.prototype.splice;\n\n  var sub = 'subscribe',\n      fn = 'function',\n      onNext = 'onNext';\n\n  function noop () { }\n\n  var tko = { };\n\n  var ObservableArray = (function (__super__) {\n\n      function ObservableArray(items) {\n        this.values = [];\n        this.lifetimes = [];\n        for (var i = 0, len = items.length; i < len; i++) {\n          this.push(items[i]);\n        }\n\n        __super__.call(this);\n      }\n\n      inherits(ObservableArray, __super__);\n\n      var observableArrayPrototype = ObservableArray.prototype;\n\n      observableArrayPrototype.subscribe = function (observerOrOnNext) {\n        observerOrOnNext || (observerOrOnNext = noop);\n        var subscription = __super__.prototype.subscribe.apply(this, arguments);\n\n        this.purge();\n        var obsFunc = typeof observerOrOnNext === fn ?\n          observerOrOnNext :\n          observerOrOnNext.onNext;\n\n        for(var i = 0, len = this.lifetimes.length; i < len; i++) {\n          obsFunc(this.lifetimes[i]);\n        }\n\n        return subscription;\n      };\n\n      observableArrayPrototype.push = function (value) {\n        this.values.push(value);\n        var lifetime = new BehaviorSubject(value);\n        this.lifetimes.push(lifetime);\n        this.onNext(lifetime);\n\n        return this.values.length;\n      };\n\n      observableArrayPrototype.remove = function (value) {\n        var index = this.values.indexOf(value);\n        this.splice(index, 1);\n        return index !== -1;\n      };\n\n      observableArrayPrototype.splice = function () {\n        splice.apply(this.values, arguments);\n        var removed = splice.apply(this.lifetimes, arguments);\n\n        for (var i = 0, len = removed.length; i < len; i++) {\n          removed[i].onCompleted();\n        }\n      };\n\n      observableArrayPrototype.dispose = function () {\n        for (var i = 0, len = this.lifetimes.length; i < len; i++) {\n          this.lifetimes[i].onCompleted();\n        }\n      };\n\n      observableArrayPrototype.purge = function () {\n        for (var i = 0, len = this.lifetimes.length; i < len; i++) {\n          var lifetime = this.lifetimes[i];\n          if (lifetime.isStopped) { this.remove(lifetime); }\n        }\n    };\n\n    return ObservableArray;\n  }(Subject));\n\n  tko.binders = {\n    attr: function (target, context, options) {\n        var disposable = new CompositeDisposable();\n\n      for (var key in options) {\n        (function (key) {\n          var obsOrValue = options[key];\n          disposable.add(tko.utils.applyBindings(obsOrValue, function (x) {\n            target.attr(key, x);\n          }));\n        }(key));\n      }\n\n      return disposable;\n    },\n    checked: function (target, context, obsOrValue) {\n      var disposable = new CompositeDisposable();\n      if (onNext in obsOrValue) {\n        var observer = obsOrValue;\n\n        disposable.add(fromEvent(target, 'change')\n          .map(function () { return target.prop('checked'); })\n          .subscribe(observer.onNext.bind(observer)));\n      }\n      disposable.add(tko.utils.applyBindings(obsOrValue, function (x) {\n        target.prop('checked', x);\n      }));\n\n      return disposable;\n    },\n    click: function (target, context, options) {\n      return tko.binders.event(target, context, options, 'click');\n    },\n    css: function (target, context, options) {\n      var disposable = new CompositeDisposable();\n\n      for (var key in options) {\n        (function (key) {\n          disposable.add(tko.utils.applyBindings(options[key], function (x) {\n            target.toggleClass(css, x);\n          }));\n        }(key));\n      }\n\n      return disposable;\n    },\n    event: function (target, context, options, type) {\n      type || (type = options.type);\n      var obs = fromEvent(target, type);\n\n      return obs.subscribe(function (e) {\n        var opts = {\n            target: target,\n            context: context,\n            e: e\n        };\n        if (typeof options === fn) {\n          options(opts);\n        } else {\n          options.onNext(opts);\n        }\n      });\n    },\n    foreach: function (target, context, obsArray) {\n      var disposable = new CompositeDisposable();\n\n      var template = target.html().trim();\n\n      disposable.add(disposableCreate(function () {\n        target.empty().append(template);\n      }));\n\n      timeoutScheduler.schedule(function () {\n        disposable.add(obsArray.subscribe(function (lifetime) {\n          var sub,\n            disposer,\n            child = $(template).appendTo(target),\n            binding = tko.internal.applyBindings(child, {\n                viewModel: lifetime.value,\n                viewModelRoot: context. viewModelRoot,\n                viewModelParent: context.viewModel\n            }),\n\n            dispose = function () {\n                child.remove();\n                disposable.remove(binding);\n                disposable.remove(disposer);\n                disposable.remove(sub);\n            },\n\n            disposer = disposableCreate(dispose),\n\n            sub = lifetime.subscribe(noop, dispose, dispose);\n\n          disposable.add(binding);\n          disposable.add(disposer);\n          disposable.add(sub);\n        }));\n      });\n\n      return disposable;\n    },\n    html: function (target, context, obsOrValue) {\n      return tko.utils.applyBindings(obsOrValue, target.html.bind(target));\n    },\n    text: function (target, context, obsOrValue) {\n      return tko.utils.applyBindings(obsOrValue, target.text.bind(target));\n    },\n    value: function (target, context, options) {\n      var disposable = new CompositeDisposable();\n\n      var options = tko.utils.parseBindingOptions(options);\n      if (options.on && options.on.indexOf('after') === 0) {\n        options.on = options.on.slice(5);\n        options.delay = true;\n      }\n      if (typeof options.source.onNext === fn) {\n        var observer = options.source,\n          getObs = fromEvent(target, options.on || 'change');\n\n        if (options.delay)  { getObs = getObs.delay(0); }\n\n        disposable.add(getObs\n          .map(function () { return target.val(); })\n          .subscribe(observer.onNext.bind(observer)));\n      }\n\n      if (options.source instanceof Observable) {\n        var focus = fromEvent(target, 'focus'),\n          blur = fromEvent(target,'blur');\n\n        options.source = options.source.takeUntil(focus).concat(blur.take(1)).repeat();\n      }\n\n      disposable.add(tko.utils.applyBindings(options.source, target.val.bind(target)));\n\n      return disposable;\n    },\n    visible: function (target, context, options) {\n      return tko.utils.applyBindings(options, function (x) {\n        target.css('display', x ? '' : 'none');\n      });\n    }\n  };\n\n  tko.utils = {\n    applyBindings: function (obsOrValue, cb) {\n      if (sub in obsOrValue) {\n        return obsOrValue.subscribe(cb);\n      }\n      cb(obsOrValue);\n      return disposableEmpty;\n    },\n    wrap: function (valueOrBehavior) {\n      return sub in valueOrBehavior ?\n        valueOrBehavior :\n        new BehaviorSubject(valueOrBehavior);\n    },\n    parseBindingOptions: function (param, options) {\n      options || (options = {});\n      if (typeof param === sub || onNext in param || sub in param) {\n        options.source = param;\n        return options;\n      }\n      for (var prop in param) {\n        options[prop] = param[prop];\n      }\n      return options;\n    },\n    toJSON: function (obj) {\n      return JSON.stringify(function (s, field) {\n        if (field instanceof ObservableArray) {\n          return field.values;\n        }\n        if (field instanceof Observable) {\n          return field.value;\n        }\n        if (field instanceof Observer) {\n          return undefined;\n        }\n        return field;\n      });\n    },\n    unwrap: function (valueOrBehavior) {\n      return 'value' in valueOrBehavior && sub in valueOrBehavior ?\n        valueOrBehavior.value :\n        valueOrBehavior;\n    }\n  };\n\n  tko.internal = {\n    applyBindings: function (target, context) {\n      var bindings = tko.internal.parseBindings(target, context),\n        disposable = new CompositeDisposable();\n      for (var binder in bindings) {\n        disposable.add(tko.binders[binder](target, context, bindings[binder]));\n      }\n\n      target.children().each(function () {\n        disposable.add(tko.internal.applyBindings($(this), context));\n      });\n\n      return disposable;\n    },\n    parseBindings: function (target, context) {\n      var binding = target.attr('data-tko');\n      if (!binding) { return null; }\n      var keys = ['$data', '$root', '$parent'],\n        values = [context.viewModel, context.viewModelRoot, context.viewModelParent];\n      for (var key in context.viewModel) {\n        keys.push(key);\n        values.push(context.viewModel[key]);\n      }\n\n      return new Function(keys, 'return { ' + binding + ' };').apply(null, values);\n    }\n  };\n\n  tko.applyBindings = function (vm, target) {\n    target || (target = $(window.document.body));\n    return tko.internal.applyBindings(target, {\n      viewModel: vm,\n      viewModelRoot: vm,\n      viewModelParent: null\n    });\n  };\n\n  tko.observableArray = function (items) {\n    !arguments.length && (items = []);\n    return new ObservableArray(items);\n  };\n\n  tko.behavior = function (value) {\n      return new Rx.BehaviorSubject(value);\n  };\n\n  /**\n   *   var obs = tko.computed({\n   *       params: {\n   *           a: Rx.Observable.interval(100),\n   *           b: Rx.Observable.interval(250),\n   *           c: Rx.Observable.interval(75),\n   *           d: Rx.Observable.interval(650)\n   *       },\n   *       read: function (params) {\n   *           return params.a + \":\" + params.b + \":\" + params.c + \":\" + params.d;\n   *       }\n   *   });\n   *\n   *   obs.subscribe(function (x) {\n   *       console.log(x);\n   *   });\n  */\n  tko.computed = function (options) {\n    var keys = [], values = [];\n    for (var prop in options.params) {\n      keys.push(prop);\n      values.push(tko.utils.wrap(options.params[prop]));\n    }\n\n    var source = Rx.Observable.combineLatest(values, function () {\n      var args = arguments, params = {};\n      for (var i = 0, len = keys.length; i < len; i++) {\n        params[keys[i]] = args[i];\n      }\n      return params;\n    });\n\n    return observableCreate(function (o) {\n      return source.map(options.read).subscribe(o);\n    });\n  };\n\n  return tko;\n\n}));\n"
  },
  {
    "path": "examples/databinding/readme.md",
    "content": ""
  },
  {
    "path": "examples/dragndrop/dragndrop.css",
    "content": "#dragTarget {\n    background-image: url(logo.png);\n    background-repeat: no-repeat;\n    background-position: center;\n    background-size: contain;\n    height: 200px;\n    width: 200px;\n    background-color: #000000;\n    border: 1px solid #666666;\n    color: #ffffff;\n    padding: 10px;\n    position: absolute;\n    cursor: move;\n}\n"
  },
  {
    "path": "examples/dragndrop/dragndrop.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" >\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta charset=\"utf-8\">\n  <meta name=\"description\" content=\"\">\n  <meta name=\"author\" content=\"\">\n  <title>Rx for JavaScript Rocks!</title>\n  <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap.min.css\">\n  <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap-responsive.min.css\">\n  <link rel=\"stylesheet\" href=\"dragndrop.css\">\n</head>\n<body>\n  <div id=\"dragTarget\">Drag Me!</div>\n  <div class=\"container\">\n    <div class=\"page-header\">\n      <h1>RxJS  Drag and Drop Example</h1>\n      <p class=\"lead\">Example to show coordinating events to perform drag and drop</p>\n    </div>\n  </div>\n\n  <script src=\"../../dist/rx.lite.js\"></script>\n  <script src=\"dragndrop.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/dragndrop/dragndrop.js",
    "content": "(function (global) {\n\n  function main () {\n    var dragTarget = document.getElementById('dragTarget');\n\n    // Get the three major events\n    var mouseup   = Rx.Observable.fromEvent(dragTarget, 'mouseup');\n    var mousemove = Rx.Observable.fromEvent(document,   'mousemove');\n    var mousedown = Rx.Observable.fromEvent(dragTarget, 'mousedown');\n\n    var mousedrag = mousedown.flatMap(function (md) {\n\n      // calculate offsets when mouse down\n      var startX = md.offsetX, startY = md.offsetY;\n\n      // Calculate delta with mousemove until mouseup\n      return mousemove.map(function (mm) {\n        mm.preventDefault();\n\n        return {\n          left: mm.clientX - startX,\n          top: mm.clientY - startY\n        };\n      }).takeUntil(mouseup);\n    });\n\n    // Update position\n    var subscription = mousedrag.subscribe(function (pos) {\n      dragTarget.style.top = pos.top + 'px';\n      dragTarget.style.left = pos.left + 'px';\n    });\n  }\n\n  main();\n\n}(window));\n"
  },
  {
    "path": "examples/dragndrop/readme.md",
    "content": ""
  },
  {
    "path": "examples/followthemouse/followthemouse.css",
    "content": "body {\n  background-color: #ffffff;\n  padding: 10px;\n  font-family: sans-serif;\n}\n\nli {\n  padding: 5px;\n}\n\n.contrastBlock {\n  background-color: #000000;\n  border: 1px solid #666666;\n  color: #ffffff;\n  padding: 10px;\n}\n\nlabel {\n  display: block;\n  padding: 5px;\n}\nfieldset {\n  border-style: solid;\n  border-width: 3px;\n}\n"
  },
  {
    "path": "examples/followthemouse/followthemouse.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" >\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta charset=\"utf-8\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <title>Rx for JavaScript Rocks!</title>\n    <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap.min.css\">\n    <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap-responsive.min.css\">\n    <link rel=\"stylesheet\" href=\"followthemouse.css\">\n</head>\n<body>\n\n    <div id=\"themouse\" class=\"contrastBlock\" style=\"position: absolute;\">the mouse!</div>\n    <div id=\"thetail\" class=\"contrastBlock\" style=\"position: absolute; color: #FF0000;\">its tail!</div>\n    <div id=\"wagging\" class=\"contrastBlock\" style=\"position: absolute; color: #FFFF00;\">is happy!</div>\n\n    <div class=\"container\">\n        <div class=\"page-header\">\n            <h1>RxJS Follow the Mouse Example</h1>\n            <p class=\"lead\">Example to show coordinating delayed mouse movements and adding a wag.</p>\n        </div>\n    </div>\n\n    <script src=\"../../dist/rx.lite.js\"></script>\n    <script src=\"followthemouse.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/followthemouse/followthemouse.js",
    "content": "(function () {\n\n  function extractClientX(e) { return e.clientX; }\n  function extractClientY(e) { return e.clientY; }\n  function setLeft(x) { this.style.left = x + 'px'; }\n  function setTop(y) { this.style.top = y + 'px'; }\n  function add(x, y) { return x + y; }\n  function partialAdd(x) { return add.bind(null, x); };\n  function randomize() { return Math.round(10 * Math.random() - 5); }\n\n  var delay = 300;\n\n  var mousemove = Rx.Observable.fromEvent(document, 'mousemove');\n  var left = mousemove.map(extractClientX);\n  var top = mousemove.map(extractClientY);\n\n  // Update the mouse\n  var themouse = document.querySelector('#themouse');\n  left.subscribe(setLeft.bind(themouse));\n  top.subscribe(setTop.bind(themouse));\n\n  // Update the tail\n  var mouseoffset = themouse.offsetWidth;\n  var thetail = document.querySelector('#thetail');\n  left\n    .map(partialAdd(mouseoffset))\n    .delay(delay)\n    .subscribe(setLeft.bind(thetail));\n  top\n    .delay(delay)\n    .subscribe(setTop.bind(thetail));\n\n  // Update wagging\n  var wagDelay = delay * 1.5;\n  var wagging = document.querySelector('#wagging');\n  var mouseandtailoffset = mouseoffset + thetail.offsetWidth;\n  left\n    .map(partialAdd(mouseandtailoffset))\n    .delay(wagDelay)\n    .subscribe(setLeft.bind(wagging));\n\n  var waggingDelay = Rx.Observable\n    .interval(100)\n    .map(randomize);\n\n  top.delay(wagDelay)\n    .combineLatest(waggingDelay, add)\n    .subscribe(setTop.bind(wagging));\n}());\n"
  },
  {
    "path": "examples/followthemouse/readme.md",
    "content": ""
  },
  {
    "path": "examples/keyboard-shortcuts/app.js",
    "content": "requirejs.config({\n    paths: {\n        'rx.all': '../../dist/rx.all',\n        'jquery': 'https://code.jquery.com/jquery-3.1.0.min'\n    }\n});\n\n// Load the main app module to start the app\nrequirejs(['jquery', 'keyboard-shortcuts'], function($, kbShortcuts) {\n\n\tvar shortuctSequences = Rx.Observable\n\t\t.fromEvent(document.querySelector(\"button\"), 'click')\n\t\t.map( click => document.querySelector(\"input\").value )\n\t    .startWith('Ctrl+Alt+D', 'Ctrl+Shift+S', 'Trash')\n\t    .map( text => {\n\t      return {\n\t        id: text.replace(/\\+/g,'_'),\n\t        text: text\n\t      }\n\t    });\n\n  var validShortcuts = shortuctSequences.filter( seq => kbShortcuts.validate(seq.text) );\n\n  var invalidShortcuts = shortuctSequences.filter( seq => !kbShortcuts.validate(seq.text) );\n\n  var shortCutPrompts = validShortcuts\n    .flatMap( obj => {\n      return kbShortcuts.create(obj.text)\n        .scan((acc, x, seed) => acc + 1, 0)\n        .map( count => {\n          return {\n            id: obj.id,\n            count: count\n          }\n        })\n      }\n    );\n\n\n  // Subscriptions for Side Effects\n \n  validShortcuts.subscribe(\n    seq => {\n      var tmpl = '<li id=\"' + seq.id + '\"><span>' + seq.text + ': </span><span>0</span></li>';\n      var li = $(tmpl);\n      $('ul').append(li);\n    }\n  );\n\n  invalidShortcuts.subscribe( seq => {\n      var tmpl = '<li style=\"color: red\">Invalid sequence ' + seq.text + '</li>';\n      var li = $(tmpl);\n      $('ul').append(li);\n    }\n  );\n\n  shortCutPrompts.subscribe(\n    obj => $('ul > li#' + obj.id + ' > span').eq(1).text(obj.count)\n  );\n\n});\n"
  },
  {
    "path": "examples/keyboard-shortcuts/keyCodeMap.js",
    "content": "define([], function (Rx) {\n\n\tvar map = {\n\t\t'backspace':\t8,\n\t\t'tab': 9,\n\t\t'enter':\t13,\n\t\t'shift':\t16,\n\t\t'ctrl':\t17,\n\t\t'alt':\t18,\n\t\t'pause/break':\t19,\n\t\t'caps lock':\t20,\n\t\t'escape':\t27,\n\t\t'page up':\t33,\n\t\t'page down':\t34,\n\t\t'end':\t35,\n\t\t'home':\t36,\n\t\t'left arrow':\t37,\n\t\t'up arrow':\t38,\n\t\t'right arrow':\t39,\n\t\t'down arrow':\t40,\n\t\t'insert':\t45,\n\t\t'delete':\t46,\n\t\t'0':\t48,\n\t\t'1':\t49,\n\t\t'2':\t50,\n\t\t'3':\t51,\n\t\t'4':\t52,\n\t\t'5':\t53,\n\t\t'6':\t54,\n\t\t'7':\t55,\n\t\t'8':\t56,\n\t\t'9':\t57,\n\t\t'a':\t65,\n\t\t'b':\t66,\n\t\t'c':\t67,\n\t\t'd':\t68,\n\t\t'e':\t69,\n\t\t'f':\t70,\n\t\t'g':\t71,\n\t\t'h':\t72,\n\t\t'i':\t73,\n\t\t'j':\t74,\n\t\t'k':\t75,\n\t\t'l':\t76,\n\t\t'm':\t77,\n\t\t'n':\t78,\n\t\t'o':\t79,\n\t\t'p':\t80,\n\t\t'q':\t81,\n\t\t'r':\t82,\n\t\t's':\t83,\n\t\t't':\t84,\n\t\t'u':\t85,\n\t\t'v':\t86,\n\t\t'w':\t87,\n\t\t'x':\t88,\n\t\t'y':\t89,\n\t\t'z':\t90,\n\t\t'left window key':\t91,\n\t\t'right window key':\t92,\n\t\t'select key':\t93,\n\t\t'numpad 0':\t96,\n\t\t'numpad 1':\t97,\n\t\t'numpad 2':\t98,\n\t\t'numpad 3':\t99,\n\t\t'numpad 4':\t100,\n\t\t'numpad 5':\t101,\n\t\t'numpad 6':\t102,\n\t\t'numpad 7':\t103,\n\t\t'numpad 8':\t104,\n\t\t'numpad 9':\t105,\n\t\t'multiply':\t106,\n\t\t'add':\t107,\n\t\t'subtract':\t109,\n\t\t'decimal point':\t110,\n\t\t'divide':\t111,\n\t\t'f1':\t112,\n\t\t'f2':\t113,\n\t\t'f3':\t114,\n\t\t'f4':\t115,\n\t\t'f5':\t116,\n\t\t'f6':\t117,\n\t\t'f7':\t118,\n\t\t'f8':\t119,\n\t\t'f9':\t120,\n\t\t'f10':\t121,\n\t\t'f11':\t122,\n\t\t'f12':\t123,\n\t\t'num lock':\t144,\n\t\t'scroll lock':\t145,\n\t\t'semi-colon':\t186,\n\t\t'equal sign':\t187,\n\t\t'comma':\t188,\n\t\t'dash':\t189,\n\t\t'period':\t190,\n\t\t'forward slash':\t191,\n\t\t'grave accent':\t192,\n\t\t'open bracket':\t219,\n\t\t'back slash':\t220,\n\t\t'close braket':\t221,\n\t\t'single quote':\t222,\n\t};\n\t\n    return map;\n\n});\n\n"
  },
  {
    "path": "examples/keyboard-shortcuts/keyboard-shortcuts.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n        <title>Keyboarb Shortcuts</title>\n        <script data-main=\"app\" src=\"https://cdnjs.cloudflare.com/ajax/libs/require.js/2.2.0/require.min.js\"></script>\n    </head>\n    <body>\n    \t<label>Keyboard shortcut sequence</label>\n    \t<input type=\"text\" placeholder=\"Ctrl+Alt+D\">\n    \t<button>Add</button>\n        <p>Keyboard shortcuts:</p>\n        <ul>\n        </ul>\n    </body>\n</html>\n"
  },
  {
    "path": "examples/keyboard-shortcuts/keyboard-shortcuts.js",
    "content": "define(['rx.all', 'keyCodeMap'], function (Rx, keyCodeMap) {\n\n\tvar keyDowns = Rx.Observable.fromEvent(document, 'keydown');\n\n\tvar keyUps = Rx.Observable.fromEvent(document, 'keyup');\n\n\tvar keyEvents = Rx.Observable\n\t\t.merge(keyDowns, keyUps)\n\t\t.distinctUntilChanged(\n\t\t\tnull,\n\t\t\t(a,b) => {\n\t\t\t\treturn a.keyCode === b.keyCode && a.type === b.type;\n\t\t\t}\n\t\t)\n\t\t.share();\n\n\tvar createKeyPressStream = (charCode) => {\n\t\treturn {\n\t\t    char: charCode,\n\t\t    stream: keyEvents\n\t\t\t\t.filter((event) => \tevent.keyCode === charCode)\n\t\t\t\t.map(function(e) {\n\t\t\t\t\treturn e.type;\n\t\t\t\t})\n\t\t};\n\t}\n\n\tvar createShortcutStream = (text) => {\n\n\treturn Rx.Observable\n\t\t.from(text.split('+'))\n\t\t.map( c => {\n\t\t\tvar code = keyCodeMap[c.toLowerCase()];\n\t\t\tif(code === undefined) {\n\t\t\t\tthrow new Error('Invalid sequence ' + text);\n\t\t\t}\n\t\t\treturn code;\n\t\t})\n\t\t.map(createKeyPressStream)\n\t\t.map( obj => obj.stream)\n\t\t.toArray()\n\t\t.flatMap( arr => {\n\t\t\treturn Rx.Observable.combineLatest(arr);\n\t\t})\n\t\t.filter( arr => {\n\t\t\tvar isDown = true;\n\t\t\tfor (var i = 0; i < arr.length; i++) {\n\t\t\t\tisDown = isDown && (arr[i] === 'keydown');\n\t\t\t}\n\t\t\treturn isDown;\n\t\t})\n\t\t.map( x => text);\n\n\t}\n\n\tvar validateSeq = text => {\n\t\tvar arr = text.split('+');\n\t\tfor (var i = 0; i < arr.length; i++) {\n\t\t\tif(keyCodeMap[arr[i].toLowerCase()] === undefined) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n  return  {\n\t\tcreate: createShortcutStream,\n\t\tvalidate: validateSeq\n\t};\n\n});\n"
  },
  {
    "path": "examples/keyboard-shortcuts/readme.md",
    "content": "Keyboard shorcuts is an Observable that emit events when a specified sequence of characters are pressed at the same time.\n\nThere is a function to create those Observables, which receives a text as parameter.\n\nAlso it has a simple UI to create a and display keyboard shortcut occurrences, which shows usage of several Observables operators.    "
  },
  {
    "path": "examples/konamicode/konamicode.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" >\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta charset=\"utf-8\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <title>Rx for JavaScript Rocks!</title>\n    <link rel=\"stylesheet\" href=\"http://ajax.aspnetcdn.com/ajax/bootstrap/2.3.1/css/bootstrap.min.css\">\n    <link rel=\"stylesheet\" href=\"http://ajax.aspnetcdn.com/ajax/bootstrap/2.3.1/css/bootstrap-responsive.min.css\">\n\n    <style>\n        kbd.keyboard-key {\n            border: 1px solid #aaa;\n            -moz-border-radius: 2px;\n            -webkit-border-radius: 2px;\n            border-radius: 2px;\n            -moz-box-shadow: 1px 2px 2px #ddd;\n            -webkit-box-shadow: 1px 2px 2px #ddd;\n            box-shadow: 1px 2px 2px #ddd;\n            background-color: #f9f9f9;\n            background-image: -moz-linear-gradient(top, #eee, #f9f9f9, #eee);\n            background-image: -ms-linear-gradient(top, #eee, #f9f9f9, #eee);\n            background-image: -o-linear-gradient(top, #eee, #f9f9f9, #eee);\n            background-image: -webkit-linear-gradient(top, #eee, #f9f9f9, #eee);\n            background-image: linear-gradient(top, #eee, #f9f9f9, #eee);\n            padding: 4px 10px;\n            font-family: inherit;\n            font-size: 1em;\n            margin-left: 5px;\n        }\n    </style>\n</head>\n<body>\n    <div class=\"container\">\n        <div class=\"page-header\">\n            <h1>RxJS Konami Code example</h1>\n            <p class=\"lead\">Example to show the Konami Code in action!</p>\n        </div>\n        <div class=\"row-fluid\">\n            <h3>Enter the Konami Code</h3>\n            <p><kbd class=\"keyboard-key nowrap\">↑</kbd><kbd class=\"keyboard-key nowrap\">↑</kbd><kbd class=\"keyboard-key nowrap\">↓</kbd><kbd class=\"keyboard-key nowrap\">↓</kbd><kbd class=\"keyboard-key nowrap\">←</kbd><kbd class=\"keyboard-key nowrap\">→</kbd><kbd class=\"keyboard-key nowrap\">←</kbd><kbd class=\"keyboard-key nowrap\">→</kbd><kbd class=\"keyboard-key nowrap\">B</kbd><kbd class=\"keyboard-key nowrap\">A</kbd></p>\n        </div>\n        <div class=\"row-fluid\">\n            <h1 id=\"result\"></h1>\n        </div>\n    </div>\n    <script src=\"http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.10.2.min.js\"></script>\n    <script src=\"../../dist/rx.js\"></script>\n    <script src=\"../../dist/rx.aggregates.js\"></script>\n    <script src=\"../../dist/rx.binding.js\"></script>\n    <script src=\"http://cdnjs.cloudflare.com/ajax/libs/rxjs-jquery/1.1.3/rx.jquery.js\"></script>\n    <script src=\"konamicode.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/konamicode/konamicode.js",
    "content": "$(function () {\n    var codes = [\n        38, // up\n        38, // up\n        40, // down\n        40, // down\n        37, // left\n        39, // right\n        37, // left\n        39, // right\n        66, // b\n        65  // a\n    ];\n    var konami = Rx.Observable.fromArray(codes);\n    var result = $('#result');\n\n    $(document).keyupAsObservable()\n        .map(function (e) { return e.keyCode; }) // get the key code\n        .windowWithCount(10, 1)                     // get the last 10 keys\n        .selectMany(function (x) {                  // compare to known konami code sequence\n            return x.sequenceEqual(konami);\n        })\n        .filter(function (equal) { return equal; })  // where we match\n        .subscribe(function () {\n            result.html('KONAMI!').show().fadeOut(2000);   // print the result\n        });\n});\n"
  },
  {
    "path": "examples/konamicode/readme.md",
    "content": ""
  },
  {
    "path": "examples/letterrcount/lettercount.css",
    "content": "body {\n  padding: 10px;\n  font-family: sans-serif;\n  text-align: center;\n  background-color: #CCFFCC;\n  color: #006600;}\n}\n"
  },
  {
    "path": "examples/letterrcount/lettercount.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" >\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta charset=\"utf-8\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <title>Rx for JavaScript Rocks!</title>\n    <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap.min.css\">\n    <link rel=\"stylesheet\" href=\"lettercount.css\">\n</head>\n<body>\n    <div class=\"container-fluid\">\n        <div class=\"page-header\">\n            <h1>RxJS Letter Counting Example</h1>\n            <p class=\"lead\">Example to show getting the current length of the input.</p>\n        </div>\n        <div class=\"row\">\n            <p>Text buffer: <input type=\"text\" id=\"toCount\"></p>\n            <p id=\"result\">Start Typing!</p>\n        </div>\n    </div>\n    <script src=\"../../dist/rx.lite.js\"></script>\n    <script src=\"lettercount.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/letterrcount/lettercount.js",
    "content": "(function () {\n  var $toCount = document.querySelector('#toCount');\n  var $result = document.querySelector('#result');\n\n  var source = Rx.Observable.fromEvent($toCount, 'keyup')\n    .map(function (e) { return 'length: ' + e.target.value.length; })\n    .distinctUntilChanged();\n\n  function setHtml(text) {\n    console.log(text);\n    this.innerHTML = text;\n  }\n\n  source.subscribe(setHtml.bind($result));\n}());\n"
  },
  {
    "path": "examples/letterrcount/readme.md",
    "content": ""
  },
  {
    "path": "examples/longstacktraces/longstacktraces.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" >\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta charset=\"utf-8\">\n    <meta name=\"description\" content=\"RxJS Long Stack Traces Example\">\n    <meta name=\"author\" content=\"Rx Team\">\n    <title>Long Stack Traces Example</title>\n    <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap.min.css\">\n</head>\n<body>\n  <div class=\"container-fluid\">\n      <div class=\"page-header\">\n          <h1>RxJS Long Stack Traces Example</h1>\n          <p class=\"lead\">Example to show getting only the user code stack trace.</p>\n      </div>\n      <div class=\"row\">\n        <code>\n          <pre>\n            var results = document.getElementById('results');\n\n            Rx.config.longStackSupport = true;\n\n            var source = Rx.Observable.of(1,2,3);\n            source\n              .flatMap(function () {\n                return Rx.Observable.throwError(new Error());\n              })\n              .subscribe(\n                function (x) { results.innerHTML = x; },\n                function (err) { results.innerHTML = err.stack; }\n              );\n          </pre>\n        </code>\n        <div id=\"results\"></div>\n      </div>\n    </div>\n  </div>\n\n  <script src=\"../../dist/rx.lite.compat.js\"></script>\n  <script>\n  function ready(callback) {\n    if (document.readyState === 'complete') {\n      setTimeout(callback, 0);\n    } else {\n      document.addEventListener( 'DOMContentLoaded', callback, false );\n      window.addEventListener( 'load', callback, false );\n    }\n  }\n\n  ready(function () {\n    var results = document.getElementById('results');\n\n    Rx.config.longStackSupport = true;\n\n    var source = Rx.Observable.of(1,2,3);\n    source.flatMap(function () {\n      return Rx.Observable.throwError(new Error());\n    }).subscribe(\n      function (x) { results.innerHTML = x; },\n      function (err) { results.innerHTML = err.stack; }\n    );\n  });\n  </script>\n</body>\n"
  },
  {
    "path": "examples/longstacktraces/readme.md",
    "content": ""
  },
  {
    "path": "examples/mario/index.css",
    "content": "body {\n  font-family: Arial;\n  font-size: 14px;\n  color: #555;\n  padding: 20px;\n  margin: 0;\n  background-color: rgba(174, 238, 238, 1);\n}\n\nnav ul {\n  list-style: none;\n  margin: 0;\n  padding: 0;\n}\n\nnav ul li {\n  margin: 4px 0;\n}\n\na {\n  text-decoration: none;\n  color: inherit;\n  font-weight: bold;\n}\n\n#grass {\n  position: fixed;\n  background-color: rgba(74, 163, 41, 1);\n  left: 0;\n  right: 0;\n  bottom: 0;\n  height: 60px;\n}\n\n#mario {\n  position: fixed;\n}\n"
  },
  {
    "path": "examples/mario/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" >\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta charset=\"utf-8\">\n    <meta name=\"description\" content=\"Super Mario Brothers RxJS example\">\n    <meta name=\"author\" content=\"Rx Team\">\n    <title>Mario in RxJS Rocks!</title>\n    <link rel=\"stylesheet\" href=\"index.css\">\n</head>\n<body>\n  <div id=\"content\">\n    <h3>RxJS - Mario</h3>\n    <p>Originally developed by <a href=\"https://twitter.com/fudalalala\">Daniel Fudala</a> on <a href=\"https://github.com/fudini/fudini.github.io/blob/master/rx/mario.html\">GitHub</a></p>\n    <p>This is the RxJS version of <a href=\"http://elm-lang.org/edit/examples/Intermediate/Mario.elm\">Mario.elm</a></p>\n    <p>Use arrow keys to move.</p><p><a href=\"https://github.com/fudini/fudini.github.io/blob/master/rx/mario.html\">Source</a></p>\n    <div id=\"grass\"></div>\n    <img id=\"mario\">\n  </div>\n  <script src=\"polyfills.js\"></script>\n  <script src=\"../../dist/rx.lite.compat.js\"></script>\n  <script src=\"../../dist/rx.lite.extras.js\"></script>\n  <script src=\"../../dist/rx.time.js\"></script>\n  <script src=\"index.js\"></script>\n</body>\n"
  },
  {
    "path": "examples/mario/index.js",
    "content": "// Sample originally from here: http://fudini.github.io/rx/mario.html\n(function () {\n  var slice = Array.prototype.slice,\n      Observable = Rx.Observable;\n\n  var dom = {};\n  ['resize','keyup','keydown'].forEach(function (event) {\n    dom[event] = function (element) {\n      return Observable.fromEvent(element, event);\n    };\n  });\n\n  // compose functions\n  function compose() {\n    return slice.call(arguments, 0).reduce(function(f, g) {\n      return function () {\n        return f(g.apply(null, arguments));\n      };\n    });\n  }\n\n  // update record\n  function update(r, u) {\n    return typeof u === 'function' ?\n      update(r, u(r)) :\n      Object.assign({}, r, u);\n  }\n\n  // Environment functions\n\n  function jump(dt) {\n    return function (m) {\n      return dt.y > 0 && m.y === 0 ?\n        update(m, {vy: 5}) :\n        m;\n    };\n  }\n\n  function gravity(t) {\n    return function (m) {\n      return m.y > 0 ?\n        update(m, {vy: m.vy - t / 4}) :\n        m;\n    };\n  }\n\n  function physics(t) {\n    return function (m) {\n      return update(m, {\n        x: m.x + t * m.vx,\n        y: Math.max(0, m.y + t * m.vy)\n      });\n    };\n  }\n\n  function walk(dt) {\n    return function (m) {\n      var dir = m.dir;\n      if (dt.x < 0) {\n        dir = 'left';\n      } else if (dt.x > 0) {\n        dir = 'right';\n      }\n\n      return update(m, {\n        vx: dt.x,\n        dir: dir\n      });\n    };\n  }\n\n  function step(dt, keys) {\n    return compose(jump(keys), gravity(dt), walk(keys), physics(dt));\n  }\n\n  // Render\n  function render(dimensions, mario, marioImage) {\n    var verb = 'stand';\n    if (mario.y > 0) {\n      verb = 'jump';\n    } else if (mario.vx !== 0) {\n      verb = 'walk';\n    }\n\n    var src = 'img/' + verb + '-' + mario.dir + '.gif';\n\n    // gif animations reset on src assignment\n    if(marioImage.name !== src) {\n      marioImage.src = src;\n      marioImage.name = src;\n    }\n\n    marioImage.style.left = (mario.x + dimensions.width / 2) + 'px';\n    marioImage.style.top = (dimensions.height - 91 - mario.y) + 'px';\n  }\n\n  // Elm's FPS\n  function fps(v) {\n    return Observable.interval(1000 / v)\n      .timestamp()\n      .bufferWithCount(2, 1)\n      .map(function (w) { return w[1].timestamp - w[0].timestamp; })\n      .share();\n  }\n\n  function keysBuffer(buffer, e) {\n    var result = buffer.slice(0);\n    if (e.type === 'keydown') {\n      if(buffer.indexOf(e.keyCode) === -1) {\n        result.push(e.keyCode);\n      }\n    } else {\n      result = buffer.filter(function (keyCode) {return keyCode !== e.keyCode; });\n    }\n\n    return result;\n  }\n\n  // Set up the environment\n\n  var dimensions = dom.resize(window)\n    .map(function (e) {\n      return {\n        width: e.target.innerWidth,\n        height: e.target.innerHeight\n      };\n    })\n    .shareValue({\n      width: window.innerWidth,\n      height: window.innerHeight\n    });\n\n  var keyDowns = dom.keydown(document);\n  var keyUps   = dom.keyup(document);\n\n  // array of currently pressed keys\n  var keyboard = keyDowns\n    .merge(keyUps)\n    .scan(keysBuffer, [])\n    .distinctUntilChanged()\n    .shareValue([]);\n\n  // LEFT: 37\n  // UP: 38\n  // RIGHT: 39\n  // UP: 40\n  var arrowsMap = {\n    37: {x: -1, y: 0},\n    39: {x: 1, y: 0},\n    38: {x: 0, y: 1},\n    40: {x: 0, y: -1}\n  };\n\n  // Elm's Keyboard.arrows\n  var arrows = keyboard\n    .map(function (keys) {\n      return keys\n        .filter(function (key) { return key in arrowsMap; })\n        .reduce(function (agg, key) {\n          return update(agg, function (prev) {\n            return {\n              x: prev.x + arrowsMap[key].x,\n              y: prev.y + arrowsMap[key].y\n            };\n          });\n        }, {x: 0, y: 0});\n    });\n\n  var deltas = fps(60).map(function (t) { return t / 20; });\n  var input = deltas\n    .combineLatest(arrows, function (dt, keys) { return { dt: dt, keys: keys }; })\n    .sample(deltas);\n\n  var marioImage = document.getElementById('mario');\n\n  // mario\n  var mario = {\n    x: 0,\n    y: 0,\n    vx: 0,\n    vy: 0,\n    dir: 'right'\n  };\n\n  var marios = input.scan(function (m, c) {\n    return step(c.dt, c.keys)(m);\n  }, mario);\n\n  marios\n    .combineLatest(dimensions, function (mario, dimensions) {\n      return { mario: mario, dimensions: dimensions };\n    })\n    .subscribe(\n      function (c) { render(c.dimensions, c.mario, marioImage); },\n      function (err) { console.log(err); }\n    );\n}());\n"
  },
  {
    "path": "examples/mario/polyfills.js",
    "content": "(function () {\n  if (!Object.assign) {\n    Object.defineProperty(Object, \"assign\", {\n      enumerable: false,\n      configurable: true,\n      writable: true,\n      value: function(target, firstSource) {\n        \"use strict\";\n        if (target === undefined || target === null) {\n          throw new TypeError(\"Cannot convert first argument to object\");\n        }\n        var to = Object(target);\n        for (var i = 1; i < arguments.length; i++) {\n          var nextSource = arguments[i];\n          if (nextSource === undefined || nextSource === null) continue;\n          var keysArray = Object.keys(Object(nextSource));\n          for (var nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex++) {\n            var nextKey = keysArray[nextIndex];\n            var desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n            if (desc !== undefined && desc.enumerable) { to[nextKey] = nextSource[nextKey]; }\n          }\n        }\n        return to;\n      }\n    });\n  }\n}());\n"
  },
  {
    "path": "examples/mario/readme.md",
    "content": ""
  },
  {
    "path": "examples/pacman-unicode/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" >\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta charset=\"utf-8\">\n  <meta name=\"description\" content=\"Pacman Example\">\n  <meta name=\"author\" content=\"Rx Team\">\n  <title>Mario in RxJS Rocks!</title>\n  <link rel=\"stylesheet\" href=\"main.css\">\n  <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap.min.css\">\n  <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap-responsive.min.css\">\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"page-header\">\n      <h1>RxJS Pacman Game</h1>\n      <p class=\"lead\">Original demo from <a href=\"http://www.eguneys.com/games/pacman-unicode/index.html\">http://www.eguneys.com/games/pacman-unicode/index.html</a></p>\n    </div>\n    <div class=\"row-fluid\">\n      <p>Use WASD to Move Pacman</p>\n      <div class=\"hero-unit\">\n        <div class=\"game-area\">\n      </div>\n    </div>\n  </div>\n  <script src=\"../../dist/rx.lite.compat.js\"></script>\n\n  <script src=\"unicodetiles/unicodetiles.js\"></script>\n  <script src=\"unicodetiles/ut.WebGLRenderer.js\"></script>\n  <script src=\"unicodetiles/ut.CanvasRenderer.js\"></script>\n  <script src=\"unicodetiles/ut.DOMRenderer.js\"></script>\n  <script src=\"unicodetiles/input.js\"></script>\n\n  <script src=\"pacman.js\"></script>\n  <script src=\"index.js\"></script>\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "examples/pacman-unicode/index.js",
    "content": "// Originally from https://github.com/eguneys/pacman-unicode/blob/master/app/scripts/main.js\n(function () {\n\n  function ready() {\n    return Rx.Observable.create(function (observer) {\n      var addedHandlers = false;\n\n      function handler () {\n        observer.onNext();\n        observer.onCompleted();\n      }\n\n      if (document.readyState === 'complete') {\n        setTimeout(handler, 0);\n      } else {\n        addedHandlers = true;\n        document.addEventListener( 'DOMContentLoaded', handler, false );\n      }\n\n      return function () {\n        if (!addedHandlers) { return; }\n        document.removeEventListener( 'DOMContentLoaded', handler, false );\n      };\n    });\n  };\n\n  ready().subscribe(function() {\n    restartGame(document.querySelector('.game-area'));\n  });\n\n  function restartGame(parent, hs) {\n    var game = new PacmanGame(parent, hs);\n\n    var moveStream = Rx.Observable.create(function(observer) {\n      game.onPacmanMove = function(moveV) {\n        observer.onNext(moveV);\n      };\n    }).publish().refCount();\n\n    moveStream.subscribe(function(moveV) {\n      if (!moveV) {\n        restartGame(parent, game.highScore);\n        return;\n      }\n\n      game.movePacman(moveV);\n    });\n\n    var spawnStream = Rx.Observable.of(\n      PacmanGame.GhostColors.ORANGE,\n      PacmanGame.GhostColors.BLUE,\n      PacmanGame.GhostColors.GREEN,\n      PacmanGame.GhostColors.PURPLE,\n      PacmanGame.GhostColors.WHITE\n    )\n    .flatMap(function (x) { return Rx.Observable.timer(800).map(x); })\n    .delay(2500);\n\n    spawnStream.subscribe(function(ghost) {\n      game.spawnGhost(ghost);\n    });\n\n    var ghostStream = Rx.Observable.interval(1000);\n\n    ghostStream.subscribe(function() {\n      game.updateGhosts();\n    });\n\n    Rx.Observable.merge(moveStream, ghostStream).subscribe(function() {\n      game.tick();\n    });\n\n    game.start();\n  }\n\n}());\n"
  },
  {
    "path": "examples/pacman-unicode/main.css",
    "content": "body{\n  background:#fafafa;\n  font-family:\"Helvetica Neue\",Helvetica,Arial,sans-serif;color:#333}\n.hero-unit{margin:50px auto 0;width:300px;font-size:18px;font-weight:200;line-height:30px;background-color:#eee;border-radius:6px;padding:60px}\n.hero-unit h1{font-size:60px;line-height:1;letter-spacing:-1px}\n.browsehappy{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}\n"
  },
  {
    "path": "examples/pacman-unicode/pacman.js",
    "content": "// Originally from https://github.com/eguneys/pacman-unicode/blob/master/app/scripts/pacman.js\n(function () {\n'use strict';\n\n  function PacmanGame(parent, hs) {\n    this.parent = parent;\n\n    this.term = null;\n\n    this.termConfig = {\n      hud: { x: 3, y: 1 },\n      gameArea: { x: 3, y: 3 }\n    };\n\n    this.gameOver = true;\n\n    this.score = 0;\n    this.highScore = hs || 0;\n\n    this.totalPoints = 0;\n    this.countPoints = 0;\n\n    this.p1 = null;\n    this.ghosts = null;\n    this.map = null;\n\n    this.TilePacmanLeft = [new ut.Tile('>', 255, 255, 0), new ut.Tile('-', 255, 255, 0)];\n    this.TilePacmanRight = [new ut.Tile('<', 255, 255, 0), new ut.Tile('-', 255, 255, 0)];\n    this.TilePacmanUp = [new ut.Tile('V', 255, 255, 0), new ut.Tile('|', 255, 255, 0)];\n    this.TilePacmanDown = [new ut.Tile('^', 255, 255, 0), new ut.Tile('|', 255, 255, 0)];\n\n\n    this.TilePoint = new ut.Tile('▪', 150, 0, 150);\n    this.TileBigP = new ut.Tile('O', 150, 0, 150);\n\n    this.TileWall = new ut.Tile(' ', 0, 0, 0, 100, 100, 100);\n\n    this.TileEmpty = new ut.Tile(' ', 100, 100, 100);\n\n    var hudbg = PacmanGame.HudColors.BG;\n    this.TileHudBG = new ut.Tile(' ', 0, 0, 0, hudbg.r, hudbg.g, hudbg.b);\n\n    this.onPacmanMove = null;\n  }\n\n  PacmanGame.HudColors = {\n    BG: { r: 94, g: 39, b: 40 }\n  };\n\n  PacmanGame.GhostColors = {\n    ORANGE: 1,\n    BLUE: 2,\n    GREEN: 3,\n    PURPLE: 4,\n    WHITE: 5\n  };\n\n  PacmanGame.PacmanTiles = {\n    WALL: '#',\n    POINT: '.',\n    BIGP: 'o',\n    'EMPTY': ' '\n  };\n\n\n  PacmanGame.prototype.generateMap = function() {\n    this.p1 = { x: 14, y: 12,\n                tile: this.TilePacmanLeft[0]\n              };\n\n    this.ghosts = [];\n\n    this.map = [\n      '############################',\n      '#o...........##...........o#',\n      '#.####.#####.##.#####.####.#',\n      '#.####.#####.##.#####.####.#',\n      '#..........................#',\n      '#.####.#.##########.#.####.#',\n      '#......#.....##.....#......#',\n      '######.#####.##.#####.######',\n      '     #.#............#.#     ',\n      '######.#.####  ####.#.######',\n      '.........#        #.........',\n      '######.#.##########.#.######',\n      '     #.#............#.#     ',\n      '######.#.##########.#.######',\n      '#............##............#',\n      '#.####.#####.##.#####.####.#',\n      '#...##................##...#',\n      '###.##.#.##########.#.##.###',\n      '#......#.....##.....#......#',\n      '#.##########.##.##########.#',\n      '#o........................o#',\n      '############################'\n    ];\n\n    var totalPoints = 0;\n    this.map.forEach(function(s) {\n      totalPoints += s.split('.').length - 1;\n    });\n\n    this.totalPoints = totalPoints;\n\n    this.wrapPos = [\n      { x: -1, y: 10,\n        wrapTo: { x: 27, y: 10 }\n      },\n      { x: 28, y: 10,\n        wrapTo: { x: 0, y: 10 }\n      }\n    ];\n  };\n\n  PacmanGame.prototype.getGhostTile = function(color) {\n    var tileChar = 'X';\n    var tile;\n\n    switch (color) {\n    case PacmanGame.GhostColors.ORANGE:\n      tile = new ut.Tile(tileChar, 150, 75, 0);\n      break;\n    case PacmanGame.GhostColors.BLUE:\n      tile = new ut.Tile(tileChar, 0, 0, 100);\n      break;\n    case PacmanGame.GhostColors.GREEN:\n      tile = new ut.Tile(tileChar, 0, 100, 0);\n      break;\n    case PacmanGame.GhostColors.PURPLE:\n      tile = new ut.Tile(tileChar, 100, 0, 100);\n      break;\n    case PacmanGame.GhostColors.WHITE:\n      tile = new ut.Tile(tileChar, 255, 255, 255);\n      break;\n    }\n    return tile;\n  };\n\n  PacmanGame.prototype.getPacmanTile = function(x, y) {\n    var t = '';\n    try { t = this.map[y][x]; }\n    catch(err) { return ut.NULLTILE; }\n    switch(t) {\n    case PacmanGame.PacmanTiles.POINT:\n      return this.TilePoint;\n    case PacmanGame.PacmanTiles.BIGP:\n      return this.TileBigP;\n    case PacmanGame.PacmanTiles.WALL:\n      return this.TileWall;\n    case PacmanGame.PacmanTiles.EMPTY:\n      return this.TileEmpty;\n    default:\n      return ut.NULLTILE;\n    }\n\n  };\n\n  PacmanGame.prototype.setPacmanTile = function(x, y, tile) {\n    var row = this.map[y];\n\n    this.map[y] = row.substr(0, x) + tile + row.substr(x + 1);\n  };\n\n  PacmanGame.prototype.setGameOver = function() {\n    this.p1.tile = new ut.Tile('Ⴖ', 255, 255, 255);\n    this.gameOver = true;\n    this.highScore = Math.max(this.highScore, this.score);\n  };\n\n  PacmanGame.prototype.putHud = function() {\n    var base = this.termConfig.hud;\n\n    for (var x = 0; x < this.map[0].length; x++) {\n      for (var y = 0; y < 2; y++) {\n        this.term.put(this.TileHudBG, base.x + x, base.y + y);\n      }\n    }\n\n    var hudbg = PacmanGame.HudColors.BG;\n    var halfLength = this.map[0].length / 2;\n\n    this.term.putString(\"High Score\", base.x + halfLength, base.y, 255, 255, 255, hudbg.r, hudbg.g, hudbg.b);\n\n    this.term.putString(this.score.toString(), base.x + 2, base.y + 1, 255, 255, 255, hudbg.r, hudbg.g, hudbg.b);\n\n    this.term.putString(this.highScore.toString(), base.x + halfLength, base.y + 1, 255, 255, 255, hudbg.r, hudbg.g, hudbg.b);\n\n\n    if (this.gameOver) {\n      var mapLength = this.map.length;\n      this.term.putString(\"Game Over\", base.x, base.y + mapLength + 2, 255, 255, 255, hudbg.r, hudbg.g, hudbg.b);\n      this.term.putString(\"Space to Restart\", base.x, base.y + mapLength + 3, 255, 255, 255, hudbg.r, hudbg.g, hudbg.b);\n    }\n  };\n\n  PacmanGame.prototype.putTiles = function() {\n    var base = this.termConfig.gameArea;\n\n    for (var y = 0; y < this.map.length; y++) {\n      for (var x = 0; x< this.map[0].length; x++) {\n        this.term.put(this.getPacmanTile(x, y), base.x + x, base.y + y);\n      }\n    }\n  };\n\n  PacmanGame.prototype.putMovables = function() {\n    var base = this.termConfig.gameArea;\n\n    this.term.put(this.p1.tile, base.x + this.p1.x, base.y + this.p1.y);\n\n    for (var i in this.ghosts) {\n      var ghost = this.ghosts[i];\n\n      this.term.put(ghost.tile, base.x + ghost.x, base.y + ghost.y);\n    }\n  };\n\n  PacmanGame.prototype.movePacman = function(p1V) {\n\n    var p1 = { x: this.p1.x + p1V.x, y: this.p1.y + p1V.y,\n               tile: this.TilePacmanDown\n             };\n\n    if (this.gameOver) {\n      return;\n    }\n\n    if (!this.canMoveTo(p1.x, p1.y)) {\n      var wrapPos = this.findWrapPos(p1.x, p1.y);\n\n      if (wrapPos) {\n        p1.x = wrapPos.x;\n        p1.y = wrapPos.y;\n      } else {\n        return;\n      }\n    }\n\n    if (p1V.x < 0) {\n      p1.tile = this.TilePacmanLeft;\n    } else if (p1V.x > 0) {\n      p1.tile = this.TilePacmanRight;\n    } else if (p1V.y < 0) {\n      p1.tile = this.TilePacmanUp;\n    }\n\n    if (p1.tile[0] === this.p1.tile) {\n      p1.tile = p1.tile[1];\n    } else {\n      p1.tile = p1.tile[0];\n    }\n\n    this.p1 = p1;\n  };\n\n  PacmanGame.prototype.spawnGhost = function(color) {\n    var ghost = {\n      x: 14, y: 10,\n      tile: this.getGhostTile(color),\n      v: { x: 0, y: -1 }\n    };\n\n    this.ghosts.push(ghost);\n  };\n\n  PacmanGame.prototype.moveGhost = function(ghost) {\n    var wrapPos = this.findWrapPos(ghost.x + ghost.v.x, ghost.y + ghost.v.y);\n\n    if (wrapPos) {\n      ghost.x = wrapPos.x;\n      ghost.y = wrapPos.y;\n      return;\n    }\n\n    var nextVs = this.availableDirections(ghost.x, ghost.y);\n\n    // protect against going backwards\n    var backwardsV = { x: ghost.v.x * -1, y: ghost.v.y * -1};\n    if (nextVs.length > 1) {\n      nextVs = nextVs\n        .filter(function(v) {\n          return v.x  !==  backwardsV.x  || v.y !== backwardsV.y;\n        });\n    }\n\n    var nextV = Math.floor(Math.random() * (nextVs.length - 1));\n\n    ghost.v = nextVs[nextV];\n\n    ghost.x += ghost.v.x;\n    ghost.y += ghost.v.y;\n  };\n\n  PacmanGame.prototype.availableDirections = function(x, y) {\n    var res = [];\n\n    [{x: 0, y: 1}, {x : 0, y: -1}, { x: 1, y: 0 }, {x: -1, y: 0}]\n      .forEach(function(v) {\n        if (this.canMoveTo(x + v.x, y + v.y)) {\n          res.push(v);\n        }\n      }, this);\n\n    return res;\n  };\n\n  PacmanGame.prototype.canMoveTo = function(x, y) {\n    var tile = this.getPacmanTile(x, y);\n\n    return (tile === this.TilePoint ||\n            tile === this.TileBigP ||\n            tile === this.TileEmpty);\n  };\n\n  PacmanGame.prototype.findWrapPos = function(x, y) {\n    var wrapPos = this.wrapPos\n          .filter(function(p) {\n            return p.x === x && p.y === y;\n          });\n\n    if (wrapPos.length > 0) {\n      return wrapPos[0].wrapTo;\n    } else {\n      return null;\n    }\n  };\n\n  PacmanGame.prototype.checkPacmanEat = function() {\n    var p1Tile = this.getPacmanTile(this.p1.x, this.p1.y);\n\n    if (p1Tile === this.TilePoint) {\n      this.setPacmanTile(this.p1.x, this.p1.y, PacmanGame.PacmanTiles.EMPTY);\n      this.score++;\n      this.countPoints++;\n\n      if (this.countPoints === this.totalPoints) {\n        this.score += 100;\n        this.setGameOver();\n      }\n    } else if (p1Tile === this.TileBigP) {\n      this.setPacmanTile(this.p1.x, this.p1.y, PacmanGame.PacmanTiles.EMPTY);\n      this.score += 10;\n    }\n  };\n\n  PacmanGame.prototype.checkPacmanCaught = function() {\n    var game = this;\n\n    var p1 = this.p1;\n\n    this.ghosts.forEach(function(g) {\n      if (g.x === p1.x && g.y === p1.y) {\n        game.setGameOver();\n      }\n    });\n  };\n\n  PacmanGame.prototype.updateGhosts = function() {\n    this.ghosts.forEach(function(g) { this.moveGhost(g); }, this);\n  };\n\n  PacmanGame.prototype.tick = function() {\n\n    if (!this.gameOver) {\n      this.checkPacmanEat();\n      this.checkPacmanCaught();\n    }\n\n    this.putHud();\n    this.putTiles();\n    this.putMovables();\n\n    this.term.render();\n  };\n\n  PacmanGame.prototype.onKeyDown = function(k) {\n    var moveV = { x: 0, y: 0 };\n    switch (k) {\n    case ut.KEY_W:\n      moveV.y--;\n      break;\n    case ut.KEY_A:\n      moveV.x--;\n      break;\n    case ut.KEY_S:\n      moveV.y++;\n      break;\n    case ut.KEY_D:\n      moveV.x++;\n      break;\n    case ut.KEY_SPACE:\n      if (this.gameOver)\n        moveV = null;\n      break;\n    }\n    if (typeof this.onPacmanMove === 'function') {\n      this.onPacmanMove(moveV);\n    }\n  };\n\n\n  PacmanGame.prototype.start = function() {\n    this.gameOver = false;\n\n    this.generateMap();\n\n    this.term = new ut.Viewport(this.parent, 50, 30);\n    ut.initInput(this.onKeyDown.bind(this));\n\n    this.tick();\n  };\n\n  window.PacmanGame = PacmanGame;\n}());\n"
  },
  {
    "path": "examples/pacman-unicode/readme.md",
    "content": ""
  },
  {
    "path": "examples/pacman-unicode/unicodetiles/input.js",
    "content": "/// File: input.js\n/// This file contains a very simple input system.\n\n/*jshint browser:true */\n\n/// Namespace: ut\n/// Container namespace.\nvar ut = ut || {};\n\n/// Constants: Keycodes\n/// KEY_BACKSPACE - 8\n/// KEY_TAB - 9\n/// KEY_ENTER - 13\n/// KEY_SHIFT - 16\n/// KEY_CTRL - 17\n/// KEY_ALT - 18\n/// KEY_ESCAPE - 27\n/// KEY_SPACE - 32\n/// KEY_LEFT - 37\n/// KEY_UP - 38\n/// KEY_RIGHT - 39\n/// KEY_DOWN - 40\n/// KEY_0 - 48\n/// KEY_1 - 49\n/// KEY_2 - 50\n/// KEY_3 - 51\n/// KEY_4 - 52\n/// KEY_5 - 53\n/// KEY_6 - 54\n/// KEY_7 - 55\n/// KEY_8 - 56\n/// KEY_9 - 57\n/// KEY_A - 65\n/// KEY_B - 66\n/// KEY_C - 67\n/// KEY_D - 68\n/// KEY_E - 69\n/// KEY_F - 70\n/// KEY_G - 71\n/// KEY_H - 72\n/// KEY_I - 73\n/// KEY_J - 74\n/// KEY_K - 75\n/// KEY_L - 76\n/// KEY_M - 77\n/// KEY_N - 78\n/// KEY_O - 79\n/// KEY_P - 80\n/// KEY_Q - 81\n/// KEY_R - 82\n/// KEY_S - 83\n/// KEY_T - 84\n/// KEY_U - 85\n/// KEY_V - 86\n/// KEY_W - 87\n/// KEY_X - 88\n/// KEY_Y - 89\n/// KEY_Z - 90\n/// KEY_NUMPAD0 - 96\n/// KEY_NUMPAD1 - 97\n/// KEY_NUMPAD2 - 98\n/// KEY_NUMPAD3 - 99\n/// KEY_NUMPAD4 - 100\n/// KEY_NUMPAD5 - 101\n/// KEY_NUMPAD6 - 102\n/// KEY_NUMPAD7 - 103\n/// KEY_NUMPAD8 - 104\n/// KEY_NUMPAD9 - 105\n/// KEY_F1 - 112\n/// KEY_F2 - 113\n/// KEY_F3 - 114\n/// KEY_F4 - 115\n/// KEY_F5 - 116\n/// KEY_F6 - 117\n/// KEY_F7 - 118\n/// KEY_F8 - 119\n/// KEY_F9 - 120\n/// KEY_F10 - 121\n/// KEY_F11 - 122\n/// KEY_F12 - 123\n/// KEY_COMMA - 188\n/// KEY_DASH - 189\n/// KEY_PERIOD - 190\n\nut.KEY_BACKSPACE = 8;\nut.KEY_TAB = 9;\nut.KEY_ENTER = 13;\nut.KEY_SHIFT = 16;\nut.KEY_CTRL = 17;\nut.KEY_ALT = 18;\nut.KEY_ESCAPE = 27;\nut.KEY_SPACE = 32;\nut.KEY_LEFT = 37;\nut.KEY_UP = 38;\nut.KEY_RIGHT = 39;\nut.KEY_DOWN = 40;\n\nut.KEY_0 = 48;\nut.KEY_1 = 49;\nut.KEY_2 = 50;\nut.KEY_3 = 51;\nut.KEY_4 = 52;\nut.KEY_5 = 53;\nut.KEY_6 = 54;\nut.KEY_7 = 55;\nut.KEY_8 = 56;\nut.KEY_9 = 57;\nut.KEY_A = 65;\nut.KEY_B = 66;\nut.KEY_C = 67;\nut.KEY_D = 68;\nut.KEY_E = 69;\nut.KEY_F = 70;\nut.KEY_G = 71;\nut.KEY_H = 72;\nut.KEY_I = 73;\nut.KEY_J = 74;\nut.KEY_K = 75;\nut.KEY_L = 76;\nut.KEY_M = 77;\nut.KEY_N = 78;\nut.KEY_O = 79;\nut.KEY_P = 80;\nut.KEY_Q = 81;\nut.KEY_R = 82;\nut.KEY_S = 83;\nut.KEY_T = 84;\nut.KEY_U = 85;\nut.KEY_V = 86;\nut.KEY_W = 87;\nut.KEY_X = 88;\nut.KEY_Y = 89;\nut.KEY_Z = 90;\nut.KEY_NUMPAD0 = 96;\nut.KEY_NUMPAD1 = 97;\nut.KEY_NUMPAD2 = 98;\nut.KEY_NUMPAD3 = 99;\nut.KEY_NUMPAD4 = 100;\nut.KEY_NUMPAD5 = 101;\nut.KEY_NUMPAD6 = 102;\nut.KEY_NUMPAD7 = 103;\nut.KEY_NUMPAD8 = 104;\nut.KEY_NUMPAD9 = 105;\nut.KEY_F1 = 112;\nut.KEY_F2 = 113;\nut.KEY_F3 = 114;\nut.KEY_F4 = 115;\nut.KEY_F5 = 116;\nut.KEY_F6 = 117;\nut.KEY_F7 = 118;\nut.KEY_F8 = 119;\nut.KEY_F9 = 120;\nut.KEY_F10 = 121;\nut.KEY_F11 = 122;\nut.KEY_F12 = 123;\n\nut.KEY_COMMA = 188;\nut.KEY_DASH = 189;\nut.KEY_PERIOD = 190;\n\n\nut.pressedKeys = {};\nut.keyRepeatDelay = 150;\n\n/// Function: isKeyPressed\n/// Checks if given key is pressed down. You must call <ut.initInput> first.\n///\n/// Parameters:\n///   key - key code to check\n///\n/// Returns:\n///    True if the key is pressed down, false otherwise.\nut.isKeyPressed = function(key) {\n\t\"use strict\";\n\tif (ut.pressedKeys[key]) return true;\n\telse return false;\n};\n\n/// Function: setKeyRepeatInterval\n/// Sets the interval when user's onKeyDown handler is called when a key is held down.\n/// <ut.initInput> must be called with a handler for this to work.\n///\n/// Parameters:\n///   milliseconds - the interval delay in milliseconds (1 second = 1000 milliseconds)\nut.setKeyRepeatInterval = function(milliseconds) {\n\t\"use strict\";\n\tut.keyRepeatDelay = milliseconds;\n};\n\n/// Function: initInput\n/// Initilizes input by assigning default key handlers and optional user's handlers.\n/// This must be called in order to <ut.isKeyPressed> to work.\n///\n/// Parameters:\n///   onkeydown - (optional) function(keyCode) for key down event handler\n///   onkeyup - (optional) function(keyCode) for key up event handler\nut.initInput = function(onKeyDown, onKeyUp) {\n\tut.onkeydown = onKeyDown;\n\tut.onkeyup = onKeyUp;\n\t// Attach default onkeydown handler that updates pressedKeys\n\tdocument.onkeydown = function(event) {\n\t\t\"use strict\";\n\t\tvar k = event.keyCode;\n\t\tif (ut.pressedKeys[k] !== null && ut.pressedKeys[k] !== undefined) return false;\n\t\tut.pressedKeys[k] = true;\n\t\tif (ut.onkeydown) {\n\t\t\tut.onkeydown(k); // User event handler\n\t\t\t// Setup keyrepeat\n\t\t\tut.pressedKeys[k] = setInterval(\"ut.onkeydown(\"+k+\")\", ut.keyRepeatDelay);\n\t\t}\n\t\tif (ut.pressedKeys[ut.KEY_CTRL] || ut.pressedKeys[ut.KEY_ALT])\n\t\t\treturn true; // CTRL/ALT for browser hotkeys\n\t\telse return false;\n\t};\n\t// Attach default onkeyup handler that updates pressedKeys\n\tdocument.onkeyup = function(event) {\n\t\t\"use strict\";\n\t\tvar k = event.keyCode;\n\t\tif (ut.onkeydown && ut.pressedKeys[k] !== null && ut.pressedKeys[k] !== undefined)\n\t\t\tclearInterval(ut.pressedKeys[k]);\n\t\tut.pressedKeys[k] = null;\n\t\tif (ut.onkeyup) ut.onkeyup(k); // User event handler\n\t\treturn false;\n\t};\n\t// Avoid keys getting stuck at down\n\twindow.onblur = function() {\n\t\t\"use strict\";\n\t\tfor (var k in ut.pressedKeys)\n\t\t\tif (ut.onkeydown && ut.pressedKeys[k] !== null)\n\t\t\t\tclearInterval(ut.pressedKeys[k]);\n\t\tut.pressedKeys = {};\n\t};\n};\n\n"
  },
  {
    "path": "examples/pacman-unicode/unicodetiles/unicodetiles.css",
    "content": "@charset \"utf-8\";\n\n@font-face {\n\tfont-family: 'DejaVuSansMono';\n\tsrc: url('DejaVuSansMono.eot');\n\tsrc: url('DejaVuSansMono.eot?#iefix') format('eot'),\n\t\t url('DejaVuSansMono.woff') format('woff'),\n\t\t url('DejaVuSansMono.ttf') format('truetype');\n}\n\n.unicodetiles {\n\tfont-family: \"DejaVuSansMono\", \"DejaVu Sans Mono\", monospace;\n\twhite-space: pre;\n\ttext-align: center;\n\tline-height: 1;\n\tletter-spacing: 0px;\n\tdisplay: inline-block;\n}\n\n.unicodetiles div {\n\tfloat: left;\n\theight: 1em;\n}\n\n.unicodetiles br {\n\tclear: both;\n}\n"
  },
  {
    "path": "examples/pacman-unicode/unicodetiles/unicodetiles.js",
    "content": "/// File: unicodetiles.js\n/// This file contains the main tile engine namespace.\n/// All coordinates are assumed to be integers - behaviour is undefined\n/// if you feed in floats (or anything other) as x and y (or similar) parameters.\n\n/*jshint browser:true devel:true trailing:true latedef:true undef:true unused:true newcap:true */\n\nif (!window.console) {\n\twindow.console = { log: function(){}, warn: function(){}, error: function(){} }\n}\n\n/// Namespace: ut\n/// Container namespace.\nvar ut = ut || {};\n\n/// Constants: Semi-internal constants for ut namespace\n/// VERSION  - Version of the library as string.\n/// NULLCHAR - Character used when none is specified otherwise.\n/// CSSCLASS - The CSS class name used for the tile engine element.\n/// NULLTILE - The tile used as placeholder for empty tile.\nut.VERSION = \"2.1\";\nut.NULLCHAR = \" \";\nut.CSSCLASS = \"unicodetiles\";\nut.NULLTILE = {}; // Initialized properly after ut.Tile is defined\n\n/// Class: Tile\n/// Represents a unicode character tile with various attributes.\n\n/// Constructor: Tile\n/// Constructs a new Tile object.\n///\n/// Parameters:\n///   ch - a character to display for this tile\n///   r - (optional) red foregorund color component 0-255\n///   g - (optional) green foreground color component 0-255\n///   b - (optional) blue foreground color component 0-255\n///   br - (optional) red background color component 0-255\n///   bg - (optional) green background color component 0-255\n///   bb - (optional) blue background color component 0-255\nut.Tile = function(ch, r, g, b, br, bg, bb) {\n\t\"use strict\";\n\tthis.ch = ch || ut.NULLCHAR;\n\tthis.r = r;\n\tthis.g = g;\n\tthis.b = b;\n\tthis.br = br;\n\tthis.bg = bg;\n\tthis.bb = bb;\n};\n\n\t/// Function: getChar\n\t/// Returns the character of this tile.\n\tut.Tile.prototype.getChar = function() { return this.ch; };\n\t/// Function: setChar\n\t/// Sets the character of this tile.\n\tut.Tile.prototype.setChar = function(ch) { this.ch = ch; };\n\t/// Function: setColor\n\t/// Sets the foreground color of this tile.\n\tut.Tile.prototype.setColor = function(r, g, b) { this.r = r; this.g = g; this.b = b; };\n\t/// Function: setGrey\n\t/// Sets the foreground color to the given shade (0-255) of grey.\n\tut.Tile.prototype.setGrey = function(grey) { this.r = grey; this.g = grey; this.b = grey; };\n\t/// Function: setBackground\n\t/// Sets the background color of this tile.\n\tut.Tile.prototype.setBackground = function(r, g, b) { this.br = r; this.bg = g; this.bb = b; };\n\t/// Function: resetColor\n\t/// Clears the color of this tile / assigns default color.\n\tut.Tile.prototype.resetColor = function() { this.r = this.g = this.b = undefined; };\n\t/// Function: resetBackground\n\t/// Clears the background color of this tile.\n\tut.Tile.prototype.resetBackground = function() { this.br = this.bg = this.bb = undefined; };\n\t/// Function: getColorHex\n\t/// Returns the hexadecimal representation of the color\n\tut.Tile.prototype.getColorHex = function() {\n\t\tif (this.r !== undefined && this.g !== undefined && this.b !== undefined)\n\t\t\treturn \"#\" + this.r.toString(16) + this.g.toString(16) + this.b.toString(16);\n\t\telse return \"\";\n\t};\n\t/// Function: getBackgroundHex\n\t/// Returns the hexadecimal representation of the background color\n\tut.Tile.prototype.getBackgroundHex = function() {\n\t\tif (this.br !== undefined && this.bg !== undefined && this.bb !== undefined)\n\t\t\treturn \"#\" + this.br.toString(16) + this.bg.toString(16) + this.bb.toString(16);\n\t\telse return \"\";\n\t};\n\t/// Function: getColorRGB\n\t/// Returns the CSS rgb(r,g,b) representation of the color\n\tut.Tile.prototype.getColorRGB = function() {\n\t\tif (this.r !== undefined && this.g !== undefined && this.b !== undefined)\n\t\t\treturn 'rgb('+this.r+','+this.g+','+this.b+')';\n\t\telse return \"\";\n\t};\n\t/// Function: getBackgroundRGB\n\t/// Returns the CSS rgb(r,g,b) representation of the background color\n\tut.Tile.prototype.getBackgroundRGB = function() {\n\t\tif (this.br !== undefined && this.bg !== undefined && this.bb !== undefined)\n\t\t\treturn 'rgb('+this.br+','+this.bg+','+this.bb+')';\n\t\telse return \"\";\n\t};\n\t/// Function: getColorJSON\n\t/// Returns the JSON representation of the color, i.e. object { r, g, b }\n\tut.Tile.prototype.getColorJSON = function() {\n\t\tif (this.r !== undefined && this.g !== undefined && this.b !== undefined)\n\t\t\treturn { \"r\": this.r, \"g\": this.g, \"b\": this.b };\n\t\telse return {};\n\t};\n\t/// Function: getBackgroundJSON\n\t/// Returns the JSON representation of the background color, i.e. object { r, g, b }\n\tut.Tile.prototype.getBackgroundJSON = function() {\n\t\tif (this.r !== undefined && this.g !== undefined && this.b !== undefined)\n\t\t\treturn { \"r\": this.br, \"g\": this.bg, \"b\": this.bb };\n\t\telse return {};\n\t};\n\t/// Function: copy\n\t/// Makes this tile identical to the one supplied. Custom properties are not copied.\n\tut.Tile.prototype.copy = function(other) {\n\t\tthis.ch = other.ch;\n\t\tthis.r = other.r; this.g = other.g; this.b = other.b;\n\t\tthis.br = other.br; this.bg = other.bg; this.bb = other.bb;\n\t};\n\t/// Function: clone\n\t/// Returns a new copy of this tile. Custom properties are not cloned.\n\tut.Tile.prototype.clone = function() {\n\t\treturn new ut.Tile(this.ch, this.r, this.g, this.b, this.br, this.bg, this.bb);\n\t};\n\nut.NULLTILE = new ut.Tile();\n\n\n/// Class: Viewport\n/// The tile engine viewport / window. Takes care of initializing a proper renderer.\n\n/// Constructor: Viewport\n/// Constructs a new Viewport object.\n/// If you wish to display a player character at the center, you should use odd sizes.\n///\n/// Parameters:\n///   elem - the DOM element which shall be transformed into the tile engine\n///   w - (integer) width in tiles\n///   h - (integer) height in tiles\n///   renderer - (optional) choose rendering engine, see <Viewport.setRenderer>, defaults to \"auto\".\n///   squarify - (optional) set to true to force the tiles square; may break some box drawing\nut.Viewport = function(elem, w, h, renderer, squarify) {\n\t\"use strict\";\n\tthis.elem = elem;\n\tthis.elem.innerHTML = \"\";\n\tthis.w = w;\n\tthis.h = h;\n\tthis.renderer = null; // setRenderer() is called later\n\tthis.squarify = squarify;\n\tthis.cx = Math.floor(w/2);\n\tthis.cy = Math.floor(h/2);\n\n\t// Add CSS class if not added already\n\tif (elem.className.indexOf(ut.CSSCLASS) === -1) {\n\t\tif (elem.className.length === 0) elem.className = ut.CSSCLASS;\n\t\telse elem.className += \" \" + ut.CSSCLASS;\n\t}\n\n\t// Create two 2-dimensional array to hold the viewport tiles\n\tthis.buffer = new Array(h);\n\tfor (var j = 0; j < h; ++j) {\n\t\tthis.buffer[j] = new Array(w);\n\t\tfor (var i = 0; i < w; ++i) {\n\t\t\tthis.buffer[j][i] = new ut.Tile();\n\t\t}\n\t}\n\n\t/// Function: updateStyle\n\t/// If the style of the parent element is modified, this needs to be called.\n\tthis.updateStyle = function(updateRenderer) {\n\t\tvar s = window.getComputedStyle(this.elem, null);\n\t\tthis.defaultColor = s.color;\n\t\tthis.defaultBackground = s.backgroundColor;\n\t\tif (updateRenderer !== false)\n\t\t\tthis.renderer.updateStyle(s);\n\t};\n\n\t/// Function: setRenderer\n\t/// Switch renderer at runtime. All methods fallback to \"dom\" if unsuccesful.\n\t/// Possible values:\n\t///   * \"webgl\" - Use WebGL with an HTML5 <canvas> element\n\t///   * \"canvas\" - Use HTML5 <canvas> element\n\t///   * \"dom\" - Use regular HTML element manipulation through DOM\n\t///   * \"auto\" - Use best available, i.e. try the above in order, picking the first that works\n\tthis.setRenderer = function(newrenderer) {\n\t\tthis.elem.innerHTML = \"\";\n\t\tif (newrenderer === \"auto\" || newrenderer === \"webgl\") {\n\t\t\ttry {\n\t\t\t\tthis.renderer = new ut.WebGLRenderer(this);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t\tnewrenderer = \"canvas\";\n\t\t\t\tthis.elem.innerHTML = \"\";\n\t\t\t}\n\t\t}\n\t\tif (newrenderer === \"canvas\") {\n\t\t\ttry {\n\t\t\t\tthis.renderer = new ut.CanvasRenderer(this);\n\t\t\t} catch (e) {\n\t\t\t\tconsole.error(e);\n\t\t\t\tnewrenderer = \"dom\";\n\t\t\t\tthis.elem.innerHTML = \"\";\n\t\t\t}\n\t\t}\n\t\tif (newrenderer === \"dom\") {\n\t\t\tthis.renderer = new ut.DOMRenderer(this);\n\t\t}\n\t\tthis.updateStyle(false);\n\t};\n\n\tthis.setRenderer(renderer || \"auto\");\n};\n\n\t/// Function: getRendererString\n\t/// Gets the currently used renderer.\n\t///\n\t/// Returns:\n\t///   One of \"webgl\", \"canvas\", \"dom\", \"\".\n\tut.Viewport.prototype.getRendererString = function() {\n\t\tif (this.renderer instanceof ut.WebGLRenderer) return \"webgl\";\n\t\tif (this.renderer instanceof ut.CanvasRenderer) return \"canvas\";\n\t\tif (this.renderer instanceof ut.DOMRenderer) return \"dom\";\n\t\treturn \"\";\n\t};\n\n\t/// Function: put\n\t/// Puts a tile to the given coordinates.\n\t/// Checks bounds and does nothing if invalid coordinates are given.\n\t///\n\t/// Parameters:\n\t///   tile - the tile to put\n\t///   x - (integer) x coordinate\n\t///   y - (integer) y coordinate\n\tut.Viewport.prototype.put = function(tile, x, y) {\n\t\tif (x < 0 || y < 0 || x >= this.w || y >= this.h) return;\n\t\tthis.buffer[y][x] = tile;\n\t};\n\n\t/// Function: unsafePut\n\t/// Puts a tile to the given coordinates.\n\t/// Does *not* check bounds; throws exception if invalid coordinates are given.\n\t///\n\t/// Parameters:\n\t///   tile - the tile to put\n\t///   x - (integer) x coordinate\n\t///   y - (integer) y coordinate\n\tut.Viewport.prototype.unsafePut = function(tile, x, y) {\n\t\tthis.buffer[y][x] = tile;\n\t};\n\n\t/// Function: putString\n\t/// Creates a row of tiles with the chars of the given string.\n\t/// Wraps to next line if it can't fit the chars on one line.\n\t///\n\t/// Parameters:\n\t///   str - (string) the string to put\n\t///   x - (integer) x coordinate (column)\n\t///   y - (integer) y coordinate (row)\n\t///   r - (optional) red foregorund color component 0-255\n\t///   g - (optional) green foreground color component 0-255\n\t///   b - (optional) blue foreground color component 0-255\n\t///   br - (optional) red background color component 0-255\n\t///   bg - (optional) green background color component 0-255\n\t///   bb - (optional) blue background color component 0-255\n\tut.Viewport.prototype.putString = function(str, x, y, r, g, b, br, bg, bb) {\n\t\tvar len = str.length;\n\t\tvar tile;\n\t\tif (x < 0 || y < 0) return;\n\t\tfor (var i = 0; i < len; ++i) {\n\t\t\tif (x >= this.w) { x = 0; ++y;}\n\t\t\tif (y >= this.h) return;\n\t\t\ttile = new ut.Tile(str[i], r, g, b, br, bg, bb);\n\t\t\tthis.unsafePut(tile, x, y);\n\t\t\t++x;\n\t\t}\n\t};\n\n\t/// Function: get\n\t/// Returns the tile in the given coordinates.\n\t/// Checks bounds and returns empty tile if invalid coordinates are given.\n\t///\n\t/// Parameters:\n\t///   x - (integer) x coordinate\n\t///   y - (integer) y coordinate\n\t///\n\t/// Returns:\n\t///   The tile.\n\tut.Viewport.prototype.get = function(x, y) {\n\t\tif (x < 0 || y < 0 || x >= this.w || y >= this.h) return ut.NULLTILE;\n\t\treturn this.buffer[y][x];\n\t};\n\n\t/// Function: clear\n\t/// Clears the viewport buffer by assigning empty tiles.\n\tut.Viewport.prototype.clear = function() {\n\t\tfor (var j = 0; j < this.h; ++j) {\n\t\t\tfor (var i = 0; i < this.w; ++i) {\n\t\t\t\tthis.buffer[j][i] = ut.NULLTILE;\n\t\t\t}\n\t\t}\n\t\tthis.renderer.clear();\n\t};\n\n\t/// Function: render\n\t/// Renders the buffer as html to the element specified at construction.\n\tut.Viewport.prototype.render = function() {\n\t\tthis.renderer.render();\n\t};\n\n\n/// Class: Engine\n/// The tile engine itself.\n\n/// Constructor: Engine\n/// Constructs a new Engine object. If width or height is given,\n/// it will not attempt to fetch tiles outside the boundaries.\n/// In that case 0,0 is assumed as the upper-left corner of the world,\n/// but if no width/height is given also negative coords are valid.\n///\n/// Parameters:\n///   vp - the <Viewport> instance to use as the viewport\n///   func - the function used for fetching tiles\n///   w - (integer) (optional) world width in tiles\n///   h - (integer) (optional) world height in tiles\nut.Engine = function(vp, func, w, h) {\n\t\"use strict\";\n\tthis.viewport = vp;\n\tthis.tileFunc = func;\n\tthis.w = w;\n\tthis.h = h;\n\tthis.refreshCache = true;\n\tthis.cacheEnabled = false;\n\tthis.transitionTimer = null;\n\tthis.transitionDuration = 0;\n\tthis.transition = null;\n\tthis.cachex = 0;\n\tthis.cachey = 0;\n\tthis.tileCache = new Array(vp.h);\n\tthis.tileCache2 = new Array(vp.h);\n\tfor (var j = 0; j < vp.h; ++j) {\n\t\tthis.tileCache[j] = new Array(vp.w);\n\t\tthis.tileCache2[j] = new Array(vp.w);\n\t}\n};\n\n\t/// Function: setTileFunc\n\t/// Sets the function to be called with coordinates to fetch each tile.\n\t/// Optionally can apply a transition effect. Effects are:\n\t/// \"boxin\", \"boxout\", \"circlein\", \"circleout\", \"random\"\n\t///\n\t/// Parameters:\n\t///   func - function taking parameters (x, y) and returning an ut.Tile\n\t///   effect - (string) (optional) name of effect to use (see above for legal values)\n\t///   duration - (integer) (optional) how many milliseconds the transition effect should last\n\tut.Engine.prototype.setTileFunc = function(func, effect, duration) {\n\t\t\"use strict\";\n\t\tif (effect) {\n\t\t\tthis.transition = undefined;\n\t\t\tif (typeof effect === \"string\") {\n\t\t\t\tif (effect === \"boxin\") this.transition = function(x, y, w, h, new_t, old_t, factor) {\n\t\t\t\t\tvar halfw = w * 0.5, halfh = h * 0.5;\n\t\t\t\t\tx -= halfw; y -= halfh;\n\t\t\t\t\tif (Math.abs(x) < halfw * factor && Math.abs(y) < halfh * factor) return new_t;\n\t\t\t\t\telse return old_t;\n\t\t\t\t};\n\t\t\t\telse if (effect === \"boxout\") this.transition = function(x, y, w, h, new_t, old_t, factor) {\n\t\t\t\t\tvar halfw = w * 0.5, halfh = h * 0.5;\n\t\t\t\t\tx -= halfw; y -= halfh;\n\t\t\t\t\tfactor = 1.0 - factor;\n\t\t\t\t\tif (Math.abs(x) < halfw * factor && Math.abs(y) < halfh * factor) return old_t;\n\t\t\t\t\telse return new_t;\n\t\t\t\t};\n\t\t\t\telse if (effect === \"circlein\") this.transition = function(x, y, w, h, new_t, old_t, factor) {\n\t\t\t\t\tvar halfw = w * 0.5, halfh = h * 0.5;\n\t\t\t\t\tx -= halfw; y -= halfh;\n\t\t\t\t\tif (x*x + y*y < (halfw*halfw + halfh*halfh) * factor) return new_t;\n\t\t\t\t\telse return old_t;\n\t\t\t\t};\n\t\t\t\telse if (effect === \"circleout\") this.transition = function(x, y, w, h, new_t, old_t, factor) {\n\t\t\t\t\tvar halfw = w * 0.5, halfh = h * 0.5;\n\t\t\t\t\tx -= halfw; y -= halfh;\n\t\t\t\t\tfactor = 1.0 - factor;\n\t\t\t\t\tif (x*x + y*y > (halfw*halfw + halfh*halfh) * factor) return new_t;\n\t\t\t\t\telse return old_t;\n\t\t\t\t};\n\t\t\t\telse if (effect === \"random\") this.transition = function(x, y, w, h, new_t, old_t, factor) {\n\t\t\t\t\tif (Math.random() > factor) return old_t;\n\t\t\t\t\telse return new_t;\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (this.transition) {\n\t\t\t\tthis.transitionTimer = (new Date()).getTime();\n\t\t\t\tthis.transitionDuration = duration || 500;\n\t\t\t}\n\t\t}\n\t\tthis.tileFunc = func;\n\t};\n\n\t/// Function: setMaskFunc\n\t/// Sets the function to be called to fetch mask information according to coordinates.\n\t/// If mask function returns false to some coordinates, then that tile is not rendered.\n\t///\n\t/// Parameters:\n\t///   func - function taking parameters (x, y) and returning a true if the tile is visible\n\tut.Engine.prototype.setMaskFunc = function(func) { this.maskFunc = func; };\n\n\t/// Function: setShaderFunc\n\t/// Sets the function to be called to post-process / shade each visible tile.\n\t/// Shader function is called even if caching is enabled, see <Engine.setCacheEnabled>.\n\t///\n\t/// Parameters:\n\t///   func - function taking parameters (tile, x, y) and returning an ut.Tile\n\tut.Engine.prototype.setShaderFunc = function(func) { this.shaderFunc = func; };\n\n\t/// Function: setWorldSize\n\t/// Tiles outside of the range x = [0,width[; y = [0,height[ are not fetched.\n\t/// Set to undefined in order to make the world infinite.\n\t///\n\t/// Parameters:\n\t///   width - (integer) new world width\n\t///   height - (integer) new world height\n\tut.Engine.prototype.setWorldSize = function(width, height) { this.w = width; this.h = height; };\n\n\t/// Function: setCacheEnabled\n\t/// Enables or disables the usage of tile cache. This means that\n\t/// extra measures are taken to not call the tile function unnecessarily.\n\t/// This means that all animating must be done in a shader function,\n\t/// see <Engine.setShaderFunc>.\n\t/// Cache is off by default, but should be enabled if the tile function\n\t/// does more computation than a simple array look-up.\n\t///\n\t/// Parameters:\n\t///   mode - true to enable, false to disable\n\tut.Engine.prototype.setCacheEnabled = function(mode) { this.cacheEnabled = mode; this.refreshCache = true; };\n\n\t/// Function: update\n\t/// Updates the viewport according to the given player coordinates.\n\t/// The algorithm goes as follows:\n\t///   * Record the current time\n\t///   * For each viewport tile:\n\t///   * Check if the tile is visible by testing the mask\n\t///   * If not visible, continue to the next tile in the viewport\n\t///   * Otherwise, if cache is enabled try to fetch the tile from there\n\t///   * Otherwise, call the tile function and check for shader function presence\n\t///   * If there is shader function, apply it to the tile, passing the recorded time\n\t///   * Put the tile to viewport\n\t///\n\t/// Parameters:\n\t///   x - (integer) viewport center x coordinate in the tile world\n\t///   y - (integer) viewport center y coordinate in the tile world\n\tut.Engine.prototype.update = function(x, y) {\n\t\t\"use strict\";\n\t\tx = x || 0;\n\t\ty = y || 0;\n\t\t// World coords of upper left corner of the viewport\n\t\tvar xx = x - this.viewport.cx;\n\t\tvar yy = y - this.viewport.cy;\n\t\tvar timeNow = (new Date()).getTime(); // For passing to shaderFunc\n\t\tvar transTime;\n\t\tif (this.transition) transTime = (timeNow - this.transitionTimer) / this.transitionDuration;\n\t\tif (transTime >= 1.0) this.transition = undefined;\n\t\tvar tile;\n\t\t// For each tile in viewport...\n\t\tfor (var j = 0; j < this.viewport.h; ++j) {\n\t\t\tfor (var i = 0; i < this.viewport.w; ++i) {\n\t\t\t\tvar ixx = i+xx, jyy = j+yy;\n\t\t\t\t// Check horizontal bounds if requested\n\t\t\t\tif (this.w && (ixx < 0 || ixx >= this.w)) {\n\t\t\t\t\ttile = ut.NULLTILE;\n\t\t\t\t// Check vertical bounds if requested\n\t\t\t\t} else if (this.h && (jyy < 0 || jyy >= this.w)) {\n\t\t\t\t\ttile = ut.NULLTILE;\n\t\t\t\t// Check mask\n\t\t\t\t} else if (this.maskFunc && !this.maskFunc(ixx, jyy)) {\n\t\t\t\t\ttile = ut.NULLTILE;\n\t\t\t\t// Check transition effect\n\t\t\t\t} else if (this.transition && !this.refreshCache) {\n\t\t\t\t\ttile = this.transition(i, j, this.viewport.w, this.viewport.h,\n\t\t\t\t\t\tthis.tileFunc(ixx, jyy), this.tileCache[j][i], transTime);\n\t\t\t\t// Check cache\n\t\t\t\t} else if (this.cacheEnabled && !this.refreshCache) {\n\t\t\t\t\tvar lookupx = ixx - this.cachex;\n\t\t\t\t\tvar lookupy = jyy - this.cachey;\n\t\t\t\t\tif (lookupx >= 0 && lookupx < this.viewport.w && lookupy >= 0 && lookupy < this.viewport.h) {\n\t\t\t\t\t\ttile = this.tileCache[lookupy][lookupx];\n\t\t\t\t\t\tif (tile === ut.NULLTILE) tile = this.tileFunc(ixx, jyy);\n\t\t\t\t\t} else // Cache miss\n\t\t\t\t\t\ttile = this.tileFunc(ixx, jyy);\n\t\t\t\t// If all else fails, call tileFunc\n\t\t\t\t} else tile = this.tileFunc(ixx, jyy);\n\t\t\t\t// Save the tile to cache (always due to transition effects)\n\t\t\t\tthis.tileCache2[j][i] = tile;\n\t\t\t\t// Apply shader function\n\t\t\t\tif (this.shaderFunc && tile !== ut.NULLTILE)\n\t\t\t\t\ttile = this.shaderFunc(tile, ixx, jyy, timeNow);\n\t\t\t\t// Put shaded tile to viewport\n\t\t\t\tthis.viewport.unsafePut(tile, i, j);\n\t\t\t}\n\t\t}\n\t\t// Cache stuff is enabled always, because it is also required by transitions\n\t\t// Save the new cache origin\n\t\tthis.cachex = xx;\n\t\tthis.cachey = yy;\n\t\t// Swap cache buffers\n\t\tvar tempCache = this.tileCache;\n\t\tthis.tileCache = this.tileCache2;\n\t\tthis.tileCache2 = tempCache;\n\t\tthis.refreshCache = false;\n\t};\n"
  },
  {
    "path": "examples/pacman-unicode/unicodetiles/ut.CanvasRenderer.js",
    "content": "/*global ut */\n\n/// Class: CanvasRenderer\n/// Renders the <Viewport> into an HTML5 <canvas> element.\n///\n/// *Note:* This is an internal class used by <Viewport>\nut.CanvasRenderer = function(view) {\n\t\"use strict\";\n\tthis.view = view;\n\tthis.canvas = document.createElement(\"canvas\");\n\tif (!this.canvas.getContext) throw(\"Canvas not supported\");\n\tthis.ctx2 = this.canvas.getContext(\"2d\");\n\tif (!this.ctx2 || !this.ctx2.fillText) throw(\"Canvas not supported\");\n\tview.elem.appendChild(this.canvas);\n\n\t// Create an offscreen canvas for rendering\n\tthis.offscreen = document.createElement(\"canvas\");\n\tthis.ctx = this.offscreen.getContext(\"2d\");\n\tthis.updateStyle();\n\tthis.canvas.width = (view.squarify ? this.th : this.tw) * view.w;\n\tthis.canvas.height = this.th * view.h;\n\tthis.offscreen.width = this.canvas.width;\n\tthis.offscreen.height = this.canvas.height;\n\t// Doing this again since setting canvas w/h resets the state\n\tthis.updateStyle();\n};\n\nut.CanvasRenderer.prototype.updateStyle = function(s) {\n\t\"use strict\";\n\ts = s || window.getComputedStyle(this.view.elem, null);\n\tthis.ctx.font = s.fontSize + \"/\" + s.lineHeight + \" \" + s.fontFamily;\n\tthis.ctx.textBaseline = \"middle\";\n\tthis.tw = this.ctx.measureText(\"M\").width;\n\tthis.th = parseInt(s.fontSize, 10);\n\tthis.gap = this.view.squarify ? (this.th - this.tw) : 0;\n\tif (this.view.squarify) this.tw = this.th;\n};\n\nut.CanvasRenderer.prototype.clear = function() { /* No op */ };\n\nut.CanvasRenderer.prototype.render = function() {\n\t\"use strict\";\n\tvar tile, ch, fg, bg, x, y;\n\tvar view = this.view, buffer = this.view.buffer;\n\tvar w = view.w, h = view.h;\n\tvar hth = 0.5 * this.th;\n\tvar hgap = 0.5 * this.gap; // Squarification\n\t// Clearing with one big rect is much faster than with individual char rects\n\tthis.ctx.fillStyle = view.defaultBackground;\n\tthis.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n\ty = hth; // half because textBaseline is middle\n\tfor (var j = 0; j < h; ++j) {\n\t\tx = 0;\n\t\tfor (var i = 0; i < w; ++i) {\n\t\t\ttile = buffer[j][i];\n\t\t\tch = tile.ch;\n\t\t\tfg = tile.getColorRGB();\n\t\t\tbg = tile.getBackgroundRGB();\n\t\t\t// Only render background if the color is non-default\n\t\t\tif (bg.length && bg !== view.defaultBackground) {\n\t\t\t\tthis.ctx.fillStyle = bg;\n\t\t\t\tthis.ctx.fillRect(x, y-hth, this.tw, this.th);\n\t\t\t}\n\t\t\t// Do not attempt to render empty char\n\t\t\tif (ch.length) {\n\t\t\t\tif (!fg.length) fg = view.defaultColor;\n\t\t\t\tthis.ctx.fillStyle = fg;\n\t\t\t\tthis.ctx.fillText(ch, x+hgap, y);\n\t\t\t}\n\t\t\tx += this.tw;\n\t\t}\n\t\ty += this.th;\n\t}\n\tthis.ctx2.drawImage(this.offscreen, 0, 0);\n};\n"
  },
  {
    "path": "examples/pacman-unicode/unicodetiles/ut.DOMRenderer.js",
    "content": "/*global ut */\n\n/// Class: DOMRenderer\n/// Renders the <Viewport> into DOM elements.\n///\n/// *Note:* This is an internal class used by <Viewport>\nut.DOMRenderer = function(view) {\n\t\"use strict\";\n\tthis.view = view;\n\n\t// Create a matrix of <span> elements, cache references\n\tthis.spans = new Array(view.h);\n\tthis.colors = new Array(view.h);\n\tfor (var j = 0; j < view.h; ++j) {\n\t\tthis.spans[j] = new Array(view.w);\n\t\tthis.colors[j] = new Array(view.w);\n\t\tfor (var i = 0; i < view.w; ++i) {\n\t\t\tthis.spans[j][i] = document.createElement(\"div\");\n\t\t\tview.elem.appendChild(this.spans[j][i]);\n\t\t}\n\t\t// Line break\n\t\tthis.spans[j].push(document.createElement(\"br\"));\n\t\tview.elem.appendChild(this.spans[j][view.w]);\n\t}\n\tut.viewportStyleUpdaterHack = this;\n\tsetTimeout(function() { ut.viewportStyleUpdaterHack.updateStyle(); }, 0);\n};\n\nut.DOMRenderer.prototype.updateStyle = function(s) {\n\t\"use strict\";\n\ts = window.getComputedStyle(this.spans[0][0], null);\n\tthis.tw = parseInt(s.width, 10);\n\tif (this.tw === 0 || isNaN(this.tw)) return; // Nothing to do, exit\n\tthis.th = parseInt(s.height, 10);\n\tif (this.view.squarify) this.tw = this.th;\n\tvar w = this.view.w, h = this.view.h;\n\tfor (var j = 0; j < h; ++j) {\n\t\tfor (var i = 0; i < w; ++i) {\n\t\t\tthis.spans[j][i].style.width = this.tw + \"px\";\n\t\t}\n\t}\n};\n\nut.DOMRenderer.prototype.clear = function() {\n\t\"use strict\";\n\tfor (var j = 0; j < this.view.h; ++j) {\n\t\tfor (var i = 0; i < this.view.w; ++i) {\n\t\t\tthis.colors[j][i] = \"\";\n\t\t}\n\t}\n};\n\nut.DOMRenderer.prototype.render = function() {\n\t\"use strict\";\n\tvar w = this.view.w, h = this.view.h;\n\tvar buffer = this.view.buffer;\n\tvar defaultColor = this.view.defaultColor;\n\tvar defaultBackground = this.view.defaultBackground;\n\tfor (var j = 0; j < h; ++j) {\n\t\tfor (var i = 0; i < w; ++i) {\n\t\t\tvar tile = buffer[j][i];\n\t\t\tvar span = this.spans[j][i];\n\t\t\t// Check and update colors\n\t\t\tvar fg = tile.r === undefined ? defaultColor : tile.getColorRGB();\n\t\t\tvar bg = tile.br === undefined ? defaultBackground : tile.getBackgroundRGB();\n\t\t\tvar colorHash = fg + bg;\n\t\t\tif (colorHash !== this.colors[j][i]) {\n\t\t\t\tthis.colors[j][i] = colorHash;\n\t\t\t\tspan.style.color = fg;\n\t\t\t\tspan.style.backgroundColor = bg;\n\t\t\t}\n\t\t\t// Check and update character\n\t\t\tvar ch = tile.getChar();\n\t\t\tif (ch !== span.innerHTML)\n\t\t\t\tspan.innerHTML = ch;\n\t\t}\n\t}\n};\n\nut.viewportStyleUpdaterHack = null;\n"
  },
  {
    "path": "examples/pacman-unicode/unicodetiles/ut.WebGLRenderer.js",
    "content": "/*global ut */\n\n/// Class: WebGLRenderer\n/// Renders the <Viewport> with WebGL.\n/// Given decent GPU drivers and browser support, this is the fastest renderer.\n///\n/// *Note:* This is an internal class used by <Viewport>\nut.WebGLRenderer = function(view) {\n\t\"use strict\";\n\tthis.view = view;\n\tthis.canvas = document.createElement(\"canvas\");\n\t// Try to fetch the context\n\tif (!this.canvas.getContext) throw(\"Canvas not supported\");\n\tthis.gl = this.canvas.getContext(\"experimental-webgl\");\n\tif (!this.gl) throw(\"WebGL not supported\");\n\tvar gl = this.gl;\n\tview.elem.appendChild(this.canvas);\n\n\tthis.charMap = {};\n\tthis.charArray = [];\n\tthis.defaultColors = { r: 1.0, g: 1.0, b: 1.0, br: 0.0, bg: 0.0, bb: 0.0 };\n\n\tthis.attribs = {\n\t\tposition:  { buffer: null, data: null, itemSize: 2, location: null, hint: gl.STATIC_DRAW },\n\t\ttexCoord:  { buffer: null, data: null, itemSize: 2, location: null, hint: gl.STATIC_DRAW },\n\t\tcolor:     { buffer: null, data: null, itemSize: 3, location: null, hint: gl.DYNAMIC_DRAW },\n\t\tbgColor:   { buffer: null, data: null, itemSize: 3, location: null, hint: gl.DYNAMIC_DRAW },\n\t\tcharIndex: { buffer: null, data: null, itemSize: 1, location: null, hint: gl.DYNAMIC_DRAW }\n\t};\n\n\tfunction insertQuad(arr, i, x, y, w, h) {\n\t\tvar x1 = x, y1 = y, x2 = x + w, y2 = y + h;\n\t\tarr[  i] = x1; arr[++i] = y1;\n\t\tarr[++i] = x2; arr[++i] = y1;\n\t\tarr[++i] = x1; arr[++i] = y2;\n\t\tarr[++i] = x1; arr[++i] = y2;\n\t\tarr[++i] = x2; arr[++i] = y1;\n\t\tarr[++i] = x2; arr[++i] = y2;\n\t}\n\n\tthis.initBuffers = function() {\n\t\tvar a, attrib, attribs = this.attribs;\n\t\tvar w = this.view.w, h = this.view.h;\n\t\t// Allocate data arrays\n\t\tfor (a in this.attribs) {\n\t\t\tattrib = attribs[a];\n\t\t\tattrib.data = new Float32Array(attrib.itemSize * 6 * w * h);\n\t\t}\n\t\t// Generate static data\n\t\tfor (var j = 0; j < h; ++j) {\n\t\t\tfor (var i = 0; i < w; ++i) {\n\t\t\t\t// Position & texCoords\n\t\t\t\tvar k = attribs.position.itemSize * 6 * (j * w + i);\n\t\t\t\tinsertQuad(attribs.position.data, k, i * this.tw, j * this.th, this.tw, this.th);\n\t\t\t\tinsertQuad(attribs.texCoord.data, k, 0.0, 0.0, 1.0, 1.0);\n\t\t\t}\n\t\t}\n\t\t// Upload\n\t\tfor (a in this.attribs) {\n\t\t\tattrib = attribs[a];\n\t\t\tif (attrib.buffer) gl.deleteBuffer(attrib.buffer);\n\t\t\tattrib.buffer = gl.createBuffer();\n\t\t\tgl.bindBuffer(gl.ARRAY_BUFFER, attrib.buffer);\n\t\t\tgl.bufferData(gl.ARRAY_BUFFER, attrib.data, attrib.hint);\n\t\t\tgl.enableVertexAttribArray(attrib.location);\n\t\t\tgl.vertexAttribPointer(attrib.location, attrib.itemSize, gl.FLOAT, false, 0, 0);\n\t\t}\n\t};\n\n\t// Create an offscreen canvas for rendering text to texture\n\tif (!this.offscreen)\n\t\tthis.offscreen = document.createElement(\"canvas\");\n\tthis.offscreen.style.position = \"absolute\";\n\tthis.offscreen.style.top = \"0px\";\n\tthis.offscreen.style.left = \"0px\";\n\tthis.ctx = this.offscreen.getContext(\"2d\");\n\tif (!this.ctx) throw \"Failed to acquire offscreen canvas drawing context\";\n\t// WebGL drawing canvas\n\tthis.updateStyle();\n\tthis.canvas.width = (view.squarify ? this.th : this.tw) * view.w;\n\tthis.canvas.height = this.th * view.h;\n\tthis.offscreen.width = 0;\n\tthis.offscreen.height = 0;\n\t// Doing this again since setting canvas w/h resets the state\n\tthis.updateStyle();\n\n\tgl.viewport(0, 0, this.canvas.width, this.canvas.height);\n\n\t// Setup GLSL\n\tfunction compileShader(type, source) {\n\t\tvar shader = gl.createShader(type);\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\tvar ok = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n\t\tif (!ok) {\n\t\t\tvar msg = \"Error compiling shader: \" + gl.getShaderInfoLog(shader);\n\t\t\tgl.deleteShader(shader);\n\t\t\tthrow msg;\n\t\t}\n\t\treturn shader;\n\t}\n\tvar vertexShader = compileShader(gl.VERTEX_SHADER, ut.WebGLRenderer.VERTEX_SHADER);\n\tvar fragmentShader = compileShader(gl.FRAGMENT_SHADER, ut.WebGLRenderer.FRAGMENT_SHADER);\n\tvar program = gl.createProgram();\n\tgl.attachShader(program, vertexShader);\n\tgl.attachShader(program, fragmentShader);\n\tgl.linkProgram(program);\n\tgl.deleteShader(vertexShader);\n\tgl.deleteShader(fragmentShader);\n\tvar ok = gl.getProgramParameter(program, gl.LINK_STATUS);\n\tif (!ok) {\n\t\tvar msg = \"Error linking program: \" + gl.getProgramInfoLog(program);\n\t\tgl.deleteProgram(program);\n\t\tthrow msg;\n\t}\n\tgl.useProgram(program);\n\n\t// Get attribute locations\n\tthis.attribs.position.location  = gl.getAttribLocation(program, \"position\");\n\tthis.attribs.texCoord.location  = gl.getAttribLocation(program, \"texCoord\");\n\tthis.attribs.color.location     = gl.getAttribLocation(program, \"color\");\n\tthis.attribs.bgColor.location   = gl.getAttribLocation(program, \"bgColor\");\n\tthis.attribs.charIndex.location = gl.getAttribLocation(program, \"charIndex\");\n\n\t// Setup buffers and uniforms\n\tthis.initBuffers();\n\tvar resolutionLocation = gl.getUniformLocation(program, \"uResolution\");\n\tgl.uniform2f(resolutionLocation, this.canvas.width, this.canvas.height);\n\tthis.tileCountsLocation = gl.getUniformLocation(program, \"uTileCounts\");\n\tgl.uniform2f(this.tileCountsLocation, this.view.w, this.view.h);\n\tthis.paddingLocation = gl.getUniformLocation(program, \"uPadding\");\n\tgl.uniform2f(this.paddingLocation, 0.0, 0.0);\n\n\t// Setup texture\n\t//view.elem.appendChild(this.offscreen); // Debug offscreen\n\tvar texture = gl.createTexture();\n\tgl.bindTexture(gl.TEXTURE_2D, texture);\n\tthis.cacheChars(\" !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\");\n\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\tgl.activeTexture(gl.TEXTURE0);\n\n\tvar _this = this;\n\tsetTimeout(function() { _this.updateStyle(); _this.buildTexture(); _this.render(); }, 100);\n};\n\n\n/////////////////\n// Build texture\nut.WebGLRenderer.prototype.buildTexture = function() {\n\t\"use strict\";\n\tvar gl = this.gl;\n\tvar w = this.offscreen.width / (this.tw + this.pad), h = this.offscreen.height / (this.th + this.pad);\n\t// Check if need to resize the canvas\n\tvar charCount = this.charArray.length;\n\tif (charCount > Math.floor(w) * Math.floor(h)) {\n\t\tw = Math.ceil(Math.sqrt(charCount));\n\t\th = w + 2; // Allocate some extra space too\n\t\tthis.offscreen.width = w * (this.tw + this.pad);\n\t\tthis.offscreen.height = h * (this.th + this.pad);\n\t\tthis.updateStyle();\n\t\tgl.uniform2f(this.tileCountsLocation, w, h);\n\t}\n\tgl.uniform2f(this.paddingLocation, this.pad / this.offscreen.width, this.pad / this.offscreen.height);\n\n\tvar c = 0, ch;\n\tvar halfGap = 0.5 * this.gap; // Squarification\n\tthis.ctx.fillStyle = \"#000000\";\n\tthis.ctx.fillRect(0, 0, this.offscreen.width, this.offscreen.height);\n\tthis.ctx.fillStyle = \"#ffffff\";\n\tvar tw = this.tw + this.pad;\n\tvar th = this.th + this.pad;\n\tvar y = 0.5 * th; // Half because textBaseline is middle\n\tfor (var j = 0; j < h; ++j) {\n\t\tvar x = this.pad * 0.5;\n\t\tfor (var i = 0; i < w; ++i, ++c) {\n\t\t\tch = this.charArray[c];\n\t\t\tif (ch === undefined) break;\n\t\t\tthis.ctx.fillText(ch, x + halfGap, y);\n\t\t\tx += tw;\n\t\t}\n\t\tif (!ch) break;\n\t\ty += th;\n\t}\n\tgl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.offscreen);\n};\n\n\n///////////////\n// Cache chars\nut.WebGLRenderer.prototype.cacheChars = function(chars, build) {\n\t\"use strict\";\n\tif (!this.gl) return; // Nothing to do if not using WebGL renderer\n\tvar changed = false;\n\tfor (var i = 0; i < chars.length; ++i) {\n\t\tif (!this.charMap[chars[i]]) {\n\t\t\tchanged = true;\n\t\t\tthis.charArray.push(chars[i]);\n\t\t\tthis.charMap[chars[i]] = this.charArray.length-1;\n\t\t}\n\t}\n\n\tif (changed && build !== false) this.buildTexture();\n};\n\n\n////////////////\n// Update style\nut.WebGLRenderer.prototype.updateStyle = function(s) {\n\t\"use strict\";\n\ts = s || window.getComputedStyle(this.view.elem, null);\n\tthis.ctx.font = s.fontSize + \"/\" + s.lineHeight + \" \" + s.fontFamily;\n\tthis.ctx.textBaseline = \"middle\";\n\tthis.ctx.fillStyle = \"#ffffff\";\n\tthis.tw = this.ctx.measureText(\"M\").width;\n\tthis.th = parseInt(s.fontSize, 10);\n\tthis.gap = this.view.squarify ? (this.th - this.tw) : 0;\n\tif (this.view.squarify) this.tw = this.th;\n\tthis.pad = Math.ceil(this.th * 0.2) * 2.0; // Must be even number\n\tvar color = s.color.match(/\\d+/g);\n\tvar bgColor = s.backgroundColor.match(/\\d+/g);\n\tthis.defaultColors.r = parseInt(color[0], 10) / 255;\n\tthis.defaultColors.g = parseInt(color[1], 10) / 255;\n\tthis.defaultColors.b = parseInt(color[2], 10) / 255;\n\tthis.defaultColors.br = parseInt(bgColor[0], 10) / 255;\n\tthis.defaultColors.bg = parseInt(bgColor[1], 10) / 255;\n\tthis.defaultColors.bb = parseInt(bgColor[2], 10) / 255;\n};\n\nut.WebGLRenderer.prototype.clear = function() { /* No op */ };\n\n\n//////////\n// Render\nut.WebGLRenderer.prototype.render = function() {\n\t\"use strict\";\n\tvar gl = this.gl;\n\tgl.clear(gl.COLOR_BUFFER_BIT);\n\tvar attribs = this.attribs;\n\tvar w = this.view.w, h = this.view.h;\n\t// Create new tile data\n\tvar tiles = this.view.buffer;\n\tvar defaultColor = this.view.defaultColor;\n\tvar defaultBgColor = this.view.defaultBackground;\n\tvar newChars = false;\n\tfor (var j = 0; j < h; ++j) {\n\t\tfor (var i = 0; i < w; ++i) {\n\t\t\tvar tile = tiles[j][i];\n\t\t\tvar ch = this.charMap[tile.ch];\n\t\t\tif (ch === undefined) { // Auto-cache new characters\n\t\t\t\tthis.cacheChars(tile.ch, false);\n\t\t\t\tnewChars = true;\n\t\t\t\tch = this.charMap[tile.ch];\n\t\t\t}\n\t\t\tvar k = attribs.color.itemSize * 6 * (j * w + i);\n\t\t\tvar kk = attribs.charIndex.itemSize * 6 * (j * w + i);\n\t\t\tvar r = tile.r === undefined ? this.defaultColors.r : tile.r / 255;\n\t\t\tvar g = tile.g === undefined ? this.defaultColors.g : tile.g / 255;\n\t\t\tvar b = tile.b === undefined ? this.defaultColors.b : tile.b / 255;\n\t\t\tvar br = tile.br === undefined ? this.defaultColors.br : tile.br / 255;\n\t\t\tvar bg = tile.bg === undefined ? this.defaultColors.bg : tile.bg / 255;\n\t\t\tvar bb = tile.bb === undefined ? this.defaultColors.bb : tile.bb / 255;\n\t\t\tfor (var m = 0; m < 6; ++m) {\n\t\t\t\tvar n = k + m * attribs.color.itemSize;\n\t\t\t\tattribs.color.data[n+0] = r;\n\t\t\t\tattribs.color.data[n+1] = g;\n\t\t\t\tattribs.color.data[n+2] = b;\n\t\t\t\tattribs.bgColor.data[n+0] = br;\n\t\t\t\tattribs.bgColor.data[n+1] = bg;\n\t\t\t\tattribs.bgColor.data[n+2] = bb;\n\t\t\t\tattribs.charIndex.data[kk+m] = ch;\n\t\t\t}\n\t\t}\n\t}\n\t// Upload\n\tif (newChars) this.buildTexture();\n\tgl.bindBuffer(gl.ARRAY_BUFFER, attribs.color.buffer);\n\tgl.bufferData(gl.ARRAY_BUFFER, attribs.color.data, attribs.color.hint);\n\tgl.bindBuffer(gl.ARRAY_BUFFER, attribs.bgColor.buffer);\n\tgl.bufferData(gl.ARRAY_BUFFER, attribs.bgColor.data, attribs.bgColor.hint);\n\tgl.bindBuffer(gl.ARRAY_BUFFER, attribs.charIndex.buffer);\n\tgl.bufferData(gl.ARRAY_BUFFER, attribs.charIndex.data, attribs.charIndex.hint);\n\n\tvar attrib = this.attribs.position;\n\tgl.drawArrays(gl.TRIANGLES, 0, attrib.data.length / attrib.itemSize);\n};\n\n\nut.WebGLRenderer.VERTEX_SHADER = [\n\t\"attribute vec2 position;\",\n\t\"attribute vec2 texCoord;\",\n\t\"attribute vec3 color;\",\n\t\"attribute vec3 bgColor;\",\n\t\"attribute float charIndex;\",\n\t\"uniform vec2 uResolution;\",\n\t\"uniform vec2 uTileCounts;\",\n\t\"uniform vec2 uPadding;\",\n\t\"varying vec2 vTexCoord;\",\n\t\"varying vec3 vColor;\",\n\t\"varying vec3 vBgColor;\",\n\n\t\"void main() {\",\n\t\t\"vec2 tileCoords = floor(vec2(mod(charIndex, uTileCounts.x), charIndex / uTileCounts.x));\",\n\t\t\"vTexCoord = (texCoord + tileCoords) / uTileCounts;\",\n\t\t\"vTexCoord += (0.5 - texCoord) * uPadding;\",\n\t\t\"vColor = color;\",\n\t\t\"vBgColor = bgColor;\",\n\t\t\"vec2 pos = position / uResolution * 2.0 - 1.0;\",\n\t\t\"gl_Position = vec4(pos.x, -pos.y, 0.0, 1.0);\",\n\t\"}\"\n].join('\\n');\n\nut.WebGLRenderer.FRAGMENT_SHADER = [\n\t\"precision mediump float;\",\n\t\"uniform sampler2D uFont;\",\n\t\"varying vec2 vTexCoord;\",\n\t\"varying vec3 vColor;\",\n\t\"varying vec3 vBgColor;\",\n\n\t\"void main() {\",\n\t\t\"vec4 color = texture2D(uFont, vTexCoord);\",\n\t\t\"color.rgb = mix(vBgColor, vColor, color.rgb);\",\n\t\t\"gl_FragColor = color;\",\n\t\"}\"\n].join('\\n');\n"
  },
  {
    "path": "examples/presentations.md",
    "content": "# RxJS Presentations #\n\nThe following are presentations about RxJS\n\n- Don't Cross the Streams - Cascadia.js 2012 [slides/demos](http://www.slideshare.net/mattpodwysocki/cascadiajs-dont-cross-the-streams) | [video](http://www.youtube.com/watch?v=FqBq4uoiG0M)\n- Curing Your Asynchronous Blues - Strange Loop 2013 [slides/demos](https://github.com/Reactive-Extensions/StrangeLoop2013) | [video](http://www.infoq.com/presentations/rx-event-processing)\n- Streaming and event-based programming using FRP and RxJS - FutureJS 2014 [slides/demos](https://github.com/Reactive-Extensions/FutureJS) | [video](https://www.youtube.com/watch?v=zlERo_JMGCw)\n- [Tyrannosaurus Rx](http://yobriefca.se/presentations/tyrannosaurus-rx.pdf) - [James Hughes](http://twitter.com/kouphax)\n- Taming Asynchronous Workflows with Functional Reactive Programming - EuroClojure - [Leonardo Borges](https://twitter.com/leonardo_borges) [slides](http://www.slideshare.net/borgesleonardo/functional-reactive-programming-compositional-event-systems) | [video](http://www.slideshare.net/borgesleonardo/functional-reactive-programming-compositional-event-systems)\n- Reactive All the Things - ng-conf 2015 - [Martin Gontovnikas](https://twitter.com/mgonto/) & [Ben Lesh](https://twitter.com/BenLesh)\n  - [Slides](http://mgonto.github.io/reactive-all-the-things-talk/#1)\n  - [Video](https://www.youtube.com/watch?v=zbBVG8bOoXk&feature=youtu.be&app=desktop)\n- The Reactive Loop - Functional JS London 2015\n  - [Slides](http://slides.com/theefer/reactive-loop-funjs#/)\n  - [Code](https://github.com/theefer/funjs-reactive-loop)\n- Reactive Functions with RxJS - Leeds JS 2015\n  - [Slides](https://www.icloud.com/keynote/AwBWCAESEIf9pea2IykiVtOZFiXflDsaKj9lVsSLP_OtPU29v7fNpMs78DK7tvXz4bFBkb6BXFKjxqt4G5B_UlM6TwMCUCAQEEIGVYVFig5qOTdorTOd2ERMJDtn6dvDFY58zqBiVzZmtN#RxJS_talk)\n"
  },
  {
    "path": "examples/readme.md",
    "content": "# The Reactive Extensions for JavaScript (RxJS) Examples #\n\nThe Reactive Extensions for JavaScript have a number of examples that highlight the unique capabilities of the library.\n"
  },
  {
    "path": "examples/requirejs/js/app/main.js",
    "content": "require(['rx', 'rx.binding', 'rx.time', 'rx.dom'], function (Rx) {\n\n    var coords = document.querySelector('#coordinates');\n    var delta = document.querySelector('#delta');\n    var buffer = document.querySelector('#buffer');\n\n    // One and only one subscription\n    var mousemove = Rx.DOM.fromEvent(document, 'mousemove');\n\n    // Simple coordinates\n    var d1 = mousemove.subscribe(function (e) {\n      coords.innerHTML = e.clientX + ',' + e.clientY;\n    });\n\n    // Calculate deltas between two mouse movements\n    var d2 = mousemove.zip(\n      mousemove.skip(1),\n      function (l, r) {\n        return { clientX: r.clientX - l.clientX, clientY: r.clientY - l.clientY };\n      })\n      .subscribe(function (e) {\n        delta.innerHTML = e.clientX + ',' + e.clientY;\n      }\n    );\n\n    // Get the last 500ms worth of mouse moves or 10, whichever comes first\n    var d3 = mousemove.bufferWithTimeOrCount(500, 10).subscribe(function (e) {\n      while(buffer.firstChild) {\n          buffer.removeChild(buffer.firstChild);\n      }\n\n      var node, elem, i, len;\n      for(i = 0, len = e.length; i < len; i++) {\n          elem = e[i];\n          node = document.createElement('li');\n          node.innerHTML = elem.clientX + ',' + elem.clientY;\n          buffer.appendChild(node);\n      }\n\n    });\n});\n"
  },
  {
    "path": "examples/requirejs/js/app.js",
    "content": "requirejs.config({\n    \"baseUrl\": \"js/lib\",\n    \"paths\": {\n      \"app\": \"../app\",\n      \"rx\": \"http://cdnjs.cloudflare.com/ajax/libs/rxjs/2.1.18/rx\",\n      \"rx.binding\": \"http://cdnjs.cloudflare.com/ajax/libs/rxjs/2.1.18/rx.binding\",\n      \"rx.time\": \"http://cdnjs.cloudflare.com/ajax/libs/rxjs/2.1.18/rx.time\",\n      \"rx.dom\": \"http://cdnjs.cloudflare.com/ajax/libs/rxjs-dom/2.0.7/rx.dom\"\n    }\n});\n\n// Load the main app module to start the app\nrequirejs([\"app/main\"]);\n"
  },
  {
    "path": "examples/requirejs/js/lib/require.js",
    "content": "/** vim: et:ts=4:sw=4:sts=4\n * @license RequireJS 2.0.6 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\n * Available via the MIT or new BSD license.\n * see: http://github.com/jrburke/requirejs for details\n */\n//Not using strict: uneven strict support in browsers, #392, and causes\n//problems with requirejs.exec()/transpiler plugins that may not be strict.\n/*jslint regexp: true, nomen: true, sloppy: true */\n/*global window, navigator, document, importScripts, jQuery, setTimeout, opera */\n\nvar requirejs, require, define;\n(function (global) {\n    var req, s, head, baseElement, dataMain, src,\n        interactiveScript, currentlyAddingScript, mainScript, subPath,\n        version = '2.0.6',\n        commentRegExp = /(\\/\\*([\\s\\S]*?)\\*\\/|([^:]|^)\\/\\/(.*)$)/mg,\n        cjsRequireRegExp = /[^.]\\s*require\\s*\\(\\s*[\"']([^'\"\\s]+)[\"']\\s*\\)/g,\n        jsSuffixRegExp = /\\.js$/,\n        currDirRegExp = /^\\.\\//,\n        op = Object.prototype,\n        ostring = op.toString,\n        hasOwn = op.hasOwnProperty,\n        ap = Array.prototype,\n        aps = ap.slice,\n        apsp = ap.splice,\n        isBrowser = !!(typeof window !== 'undefined' && navigator && document),\n        isWebWorker = !isBrowser && typeof importScripts !== 'undefined',\n        //PS3 indicates loaded and complete, but need to wait for complete\n        //specifically. Sequence is 'loading', 'loaded', execution,\n        // then 'complete'. The UA check is unfortunate, but not sure how\n        //to feature test w/o causing perf issues.\n        readyRegExp = isBrowser && navigator.platform === 'PLAYSTATION 3' ?\n                      /^complete$/ : /^(complete|loaded)$/,\n        defContextName = '_',\n        //Oh the tragedy, detecting opera. See the usage of isOpera for reason.\n        isOpera = typeof opera !== 'undefined' && opera.toString() === '[object Opera]',\n        contexts = {},\n        cfg = {},\n        globalDefQueue = [],\n        useInteractive = false;\n\n    function isFunction(it) {\n        return ostring.call(it) === '[object Function]';\n    }\n\n    function isArray(it) {\n        return ostring.call(it) === '[object Array]';\n    }\n\n    /**\n     * Helper function for iterating over an array. If the func returns\n     * a true value, it will break out of the loop.\n     */\n    function each(ary, func) {\n        if (ary) {\n            var i;\n            for (i = 0; i < ary.length; i += 1) {\n                if (ary[i] && func(ary[i], i, ary)) {\n                    break;\n                }\n            }\n        }\n    }\n\n    /**\n     * Helper function for iterating over an array backwards. If the func\n     * returns a true value, it will break out of the loop.\n     */\n    function eachReverse(ary, func) {\n        if (ary) {\n            var i;\n            for (i = ary.length - 1; i > -1; i -= 1) {\n                if (ary[i] && func(ary[i], i, ary)) {\n                    break;\n                }\n            }\n        }\n    }\n\n    function hasProp(obj, prop) {\n        return hasOwn.call(obj, prop);\n    }\n\n    /**\n     * Cycles over properties in an object and calls a function for each\n     * property value. If the function returns a truthy value, then the\n     * iteration is stopped.\n     */\n    function eachProp(obj, func) {\n        var prop;\n        for (prop in obj) {\n            if (obj.hasOwnProperty(prop)) {\n                if (func(obj[prop], prop)) {\n                    break;\n                }\n            }\n        }\n    }\n\n    /**\n     * Simple function to mix in properties from source into target,\n     * but only if target does not already have a property of the same name.\n     * This is not robust in IE for transferring methods that match\n     * Object.prototype names, but the uses of mixin here seem unlikely to\n     * trigger a problem related to that.\n     */\n    function mixin(target, source, force, deepStringMixin) {\n        if (source) {\n            eachProp(source, function (value, prop) {\n                if (force || !hasProp(target, prop)) {\n                    if (deepStringMixin && typeof value !== 'string') {\n                        if (!target[prop]) {\n                            target[prop] = {};\n                        }\n                        mixin(target[prop], value, force, deepStringMixin);\n                    } else {\n                        target[prop] = value;\n                    }\n                }\n            });\n        }\n        return target;\n    }\n\n    //Similar to Function.prototype.bind, but the 'this' object is specified\n    //first, since it is easier to read/figure out what 'this' will be.\n    function bind(obj, fn) {\n        return function () {\n            return fn.apply(obj, arguments);\n        };\n    }\n\n    function scripts() {\n        return document.getElementsByTagName('script');\n    }\n\n    //Allow getting a global that expressed in\n    //dot notation, like 'a.b.c'.\n    function getGlobal(value) {\n        if (!value) {\n            return value;\n        }\n        var g = global;\n        each(value.split('.'), function (part) {\n            g = g[part];\n        });\n        return g;\n    }\n\n    function makeContextModuleFunc(func, relMap, enableBuildCallback) {\n        return function () {\n            //A version of a require function that passes a moduleName\n            //value for items that may need to\n            //look up paths relative to the moduleName\n            var args = aps.call(arguments, 0), lastArg;\n            if (enableBuildCallback &&\n                    isFunction((lastArg = args[args.length - 1]))) {\n                lastArg.__requireJsBuild = true;\n            }\n            args.push(relMap);\n            return func.apply(null, args);\n        };\n    }\n\n    function addRequireMethods(req, context, relMap) {\n        each([\n            ['toUrl'],\n            ['undef'],\n            ['defined', 'requireDefined'],\n            ['specified', 'requireSpecified']\n        ], function (item) {\n            var prop = item[1] || item[0];\n            req[item[0]] = context ? makeContextModuleFunc(context[prop], relMap) :\n                    //If no context, then use default context. Reference from\n                    //contexts instead of early binding to default context, so\n                    //that during builds, the latest instance of the default\n                    //context with its config gets used.\n                    function () {\n                        var ctx = contexts[defContextName];\n                        return ctx[prop].apply(ctx, arguments);\n                    };\n        });\n    }\n\n    /**\n     * Constructs an error with a pointer to an URL with more information.\n     * @param {String} id the error ID that maps to an ID on a web page.\n     * @param {String} message human readable error.\n     * @param {Error} [err] the original error, if there is one.\n     *\n     * @returns {Error}\n     */\n    function makeError(id, msg, err, requireModules) {\n        var e = new Error(msg + '\\nhttp://requirejs.org/docs/errors.html#' + id);\n        e.requireType = id;\n        e.requireModules = requireModules;\n        if (err) {\n            e.originalError = err;\n        }\n        return e;\n    }\n\n    if (typeof define !== 'undefined') {\n        //If a define is already in play via another AMD loader,\n        //do not overwrite.\n        return;\n    }\n\n    if (typeof requirejs !== 'undefined') {\n        if (isFunction(requirejs)) {\n            //Do not overwrite and existing requirejs instance.\n            return;\n        }\n        cfg = requirejs;\n        requirejs = undefined;\n    }\n\n    //Allow for a require config object\n    if (typeof require !== 'undefined' && !isFunction(require)) {\n        //assume it is a config object.\n        cfg = require;\n        require = undefined;\n    }\n\n    function newContext(contextName) {\n        var inCheckLoaded, Module, context, handlers,\n            checkLoadedTimeoutId,\n            config = {\n                waitSeconds: 7,\n                baseUrl: './',\n                paths: {},\n                pkgs: {},\n                shim: {}\n            },\n            registry = {},\n            undefEvents = {},\n            defQueue = [],\n            defined = {},\n            urlFetched = {},\n            requireCounter = 1,\n            unnormalizedCounter = 1,\n            //Used to track the order in which modules\n            //should be executed, by the order they\n            //load. Important for consistent cycle resolution\n            //behavior.\n            waitAry = [];\n\n        /**\n         * Trims the . and .. from an array of path segments.\n         * It will keep a leading path segment if a .. will become\n         * the first path segment, to help with module name lookups,\n         * which act like paths, but can be remapped. But the end result,\n         * all paths that use this function should look normalized.\n         * NOTE: this method MODIFIES the input array.\n         * @param {Array} ary the array of path segments.\n         */\n        function trimDots(ary) {\n            var i, part;\n            for (i = 0; ary[i]; i += 1) {\n                part = ary[i];\n                if (part === '.') {\n                    ary.splice(i, 1);\n                    i -= 1;\n                } else if (part === '..') {\n                    if (i === 1 && (ary[2] === '..' || ary[0] === '..')) {\n                        //End of the line. Keep at least one non-dot\n                        //path segment at the front so it can be mapped\n                        //correctly to disk. Otherwise, there is likely\n                        //no path mapping for a path starting with '..'.\n                        //This can still fail, but catches the most reasonable\n                        //uses of ..\n                        break;\n                    } else if (i > 0) {\n                        ary.splice(i - 1, 2);\n                        i -= 2;\n                    }\n                }\n            }\n        }\n\n        /**\n         * Given a relative module name, like ./something, normalize it to\n         * a real name that can be mapped to a path.\n         * @param {String} name the relative name\n         * @param {String} baseName a real name that the name arg is relative\n         * to.\n         * @param {Boolean} applyMap apply the map config to the value. Should\n         * only be done if this normalization is for a dependency ID.\n         * @returns {String} normalized name\n         */\n        function normalize(name, baseName, applyMap) {\n            var pkgName, pkgConfig, mapValue, nameParts, i, j, nameSegment,\n                foundMap, foundI, foundStarMap, starI,\n                baseParts = baseName && baseName.split('/'),\n                normalizedBaseParts = baseParts,\n                map = config.map,\n                starMap = map && map['*'];\n\n            //Adjust any relative paths.\n            if (name && name.charAt(0) === '.') {\n                //If have a base name, try to normalize against it,\n                //otherwise, assume it is a top-level require that will\n                //be relative to baseUrl in the end.\n                if (baseName) {\n                    if (config.pkgs[baseName]) {\n                        //If the baseName is a package name, then just treat it as one\n                        //name to concat the name with.\n                        normalizedBaseParts = baseParts = [baseName];\n                    } else {\n                        //Convert baseName to array, and lop off the last part,\n                        //so that . matches that 'directory' and not name of the baseName's\n                        //module. For instance, baseName of 'one/two/three', maps to\n                        //'one/two/three.js', but we want the directory, 'one/two' for\n                        //this normalization.\n                        normalizedBaseParts = baseParts.slice(0, baseParts.length - 1);\n                    }\n\n                    name = normalizedBaseParts.concat(name.split('/'));\n                    trimDots(name);\n\n                    //Some use of packages may use a . path to reference the\n                    //'main' module name, so normalize for that.\n                    pkgConfig = config.pkgs[(pkgName = name[0])];\n                    name = name.join('/');\n                    if (pkgConfig && name === pkgName + '/' + pkgConfig.main) {\n                        name = pkgName;\n                    }\n                } else if (name.indexOf('./') === 0) {\n                    // No baseName, so this is ID is resolved relative\n                    // to baseUrl, pull off the leading dot.\n                    name = name.substring(2);\n                }\n            }\n\n            //Apply map config if available.\n            if (applyMap && (baseParts || starMap) && map) {\n                nameParts = name.split('/');\n\n                for (i = nameParts.length; i > 0; i -= 1) {\n                    nameSegment = nameParts.slice(0, i).join('/');\n\n                    if (baseParts) {\n                        //Find the longest baseName segment match in the config.\n                        //So, do joins on the biggest to smallest lengths of baseParts.\n                        for (j = baseParts.length; j > 0; j -= 1) {\n                            mapValue = map[baseParts.slice(0, j).join('/')];\n\n                            //baseName segment has config, find if it has one for\n                            //this name.\n                            if (mapValue) {\n                                mapValue = mapValue[nameSegment];\n                                if (mapValue) {\n                                    //Match, update name to the new value.\n                                    foundMap = mapValue;\n                                    foundI = i;\n                                    break;\n                                }\n                            }\n                        }\n                    }\n\n                    if (foundMap) {\n                        break;\n                    }\n\n                    //Check for a star map match, but just hold on to it,\n                    //if there is a shorter segment match later in a matching\n                    //config, then favor over this star map.\n                    if (!foundStarMap && starMap && starMap[nameSegment]) {\n                        foundStarMap = starMap[nameSegment];\n                        starI = i;\n                    }\n                }\n\n                if (!foundMap && foundStarMap) {\n                    foundMap = foundStarMap;\n                    foundI = starI;\n                }\n\n                if (foundMap) {\n                    nameParts.splice(0, foundI, foundMap);\n                    name = nameParts.join('/');\n                }\n            }\n\n            return name;\n        }\n\n        function removeScript(name) {\n            if (isBrowser) {\n                each(scripts(), function (scriptNode) {\n                    if (scriptNode.getAttribute('data-requiremodule') === name &&\n                            scriptNode.getAttribute('data-requirecontext') === context.contextName) {\n                        scriptNode.parentNode.removeChild(scriptNode);\n                        return true;\n                    }\n                });\n            }\n        }\n\n        function hasPathFallback(id) {\n            var pathConfig = config.paths[id];\n            if (pathConfig && isArray(pathConfig) && pathConfig.length > 1) {\n                removeScript(id);\n                //Pop off the first array value, since it failed, and\n                //retry\n                pathConfig.shift();\n                context.undef(id);\n                context.require([id]);\n                return true;\n            }\n        }\n\n        /**\n         * Creates a module mapping that includes plugin prefix, module\n         * name, and path. If parentModuleMap is provided it will\n         * also normalize the name via require.normalize()\n         *\n         * @param {String} name the module name\n         * @param {String} [parentModuleMap] parent module map\n         * for the module name, used to resolve relative names.\n         * @param {Boolean} isNormalized: is the ID already normalized.\n         * This is true if this call is done for a define() module ID.\n         * @param {Boolean} applyMap: apply the map config to the ID.\n         * Should only be true if this map is for a dependency.\n         *\n         * @returns {Object}\n         */\n        function makeModuleMap(name, parentModuleMap, isNormalized, applyMap) {\n            var url, pluginModule, suffix,\n                index = name ? name.indexOf('!') : -1,\n                prefix = null,\n                parentName = parentModuleMap ? parentModuleMap.name : null,\n                originalName = name,\n                isDefine = true,\n                normalizedName = '';\n\n            //If no name, then it means it is a require call, generate an\n            //internal name.\n            if (!name) {\n                isDefine = false;\n                name = '_@r' + (requireCounter += 1);\n            }\n\n            if (index !== -1) {\n                prefix = name.substring(0, index);\n                name = name.substring(index + 1, name.length);\n            }\n\n            if (prefix) {\n                prefix = normalize(prefix, parentName, applyMap);\n                pluginModule = defined[prefix];\n            }\n\n            //Account for relative paths if there is a base name.\n            if (name) {\n                if (prefix) {\n                    if (pluginModule && pluginModule.normalize) {\n                        //Plugin is loaded, use its normalize method.\n                        normalizedName = pluginModule.normalize(name, function (name) {\n                            return normalize(name, parentName, applyMap);\n                        });\n                    } else {\n                        normalizedName = normalize(name, parentName, applyMap);\n                    }\n                } else {\n                    //A regular module.\n                    normalizedName = normalize(name, parentName, applyMap);\n                    url = context.nameToUrl(normalizedName);\n                }\n            }\n\n            //If the id is a plugin id that cannot be determined if it needs\n            //normalization, stamp it with a unique ID so two matching relative\n            //ids that may conflict can be separate.\n            suffix = prefix && !pluginModule && !isNormalized ?\n                     '_unnormalized' + (unnormalizedCounter += 1) :\n                     '';\n\n            return {\n                prefix: prefix,\n                name: normalizedName,\n                parentMap: parentModuleMap,\n                unnormalized: !!suffix,\n                url: url,\n                originalName: originalName,\n                isDefine: isDefine,\n                id: (prefix ?\n                        prefix + '!' + normalizedName :\n                        normalizedName) + suffix\n            };\n        }\n\n        function getModule(depMap) {\n            var id = depMap.id,\n                mod = registry[id];\n\n            if (!mod) {\n                mod = registry[id] = new context.Module(depMap);\n            }\n\n            return mod;\n        }\n\n        function on(depMap, name, fn) {\n            var id = depMap.id,\n                mod = registry[id];\n\n            if (hasProp(defined, id) &&\n                    (!mod || mod.defineEmitComplete)) {\n                if (name === 'defined') {\n                    fn(defined[id]);\n                }\n            } else {\n                getModule(depMap).on(name, fn);\n            }\n        }\n\n        function onError(err, errback) {\n            var ids = err.requireModules,\n                notified = false;\n\n            if (errback) {\n                errback(err);\n            } else {\n                each(ids, function (id) {\n                    var mod = registry[id];\n                    if (mod) {\n                        //Set error on module, so it skips timeout checks.\n                        mod.error = err;\n                        if (mod.events.error) {\n                            notified = true;\n                            mod.emit('error', err);\n                        }\n                    }\n                });\n\n                if (!notified) {\n                    req.onError(err);\n                }\n            }\n        }\n\n        /**\n         * Internal method to transfer globalQueue items to this context's\n         * defQueue.\n         */\n        function takeGlobalQueue() {\n            //Push all the globalDefQueue items into the context's defQueue\n            if (globalDefQueue.length) {\n                //Array splice in the values since the context code has a\n                //local var ref to defQueue, so cannot just reassign the one\n                //on context.\n                apsp.apply(defQueue,\n                           [defQueue.length - 1, 0].concat(globalDefQueue));\n                globalDefQueue = [];\n            }\n        }\n\n        /**\n         * Helper function that creates a require function object to give to\n         * modules that ask for it as a dependency. It needs to be specific\n         * per module because of the implication of path mappings that may\n         * need to be relative to the module name.\n         */\n        function makeRequire(mod, enableBuildCallback, altRequire) {\n            var relMap = mod && mod.map,\n                modRequire = makeContextModuleFunc(altRequire || context.require,\n                                                   relMap,\n                                                   enableBuildCallback);\n\n            addRequireMethods(modRequire, context, relMap);\n            modRequire.isBrowser = isBrowser;\n\n            return modRequire;\n        }\n\n        handlers = {\n            'require': function (mod) {\n                return makeRequire(mod);\n            },\n            'exports': function (mod) {\n                mod.usingExports = true;\n                if (mod.map.isDefine) {\n                    return (mod.exports = defined[mod.map.id] = {});\n                }\n            },\n            'module': function (mod) {\n                return (mod.module = {\n                    id: mod.map.id,\n                    uri: mod.map.url,\n                    config: function () {\n                        return (config.config && config.config[mod.map.id]) || {};\n                    },\n                    exports: defined[mod.map.id]\n                });\n            }\n        };\n\n        function removeWaiting(id) {\n            //Clean up machinery used for waiting modules.\n            delete registry[id];\n\n            each(waitAry, function (mod, i) {\n                if (mod.map.id === id) {\n                    waitAry.splice(i, 1);\n                    if (!mod.defined) {\n                        context.waitCount -= 1;\n                    }\n                    return true;\n                }\n            });\n        }\n\n        function findCycle(mod, traced, processed) {\n            var id = mod.map.id,\n                depArray = mod.depMaps,\n                foundModule;\n\n            //Do not bother with unitialized modules or not yet enabled\n            //modules.\n            if (!mod.inited) {\n                return;\n            }\n\n            //Found the cycle.\n            if (traced[id]) {\n                return mod;\n            }\n\n            traced[id] = true;\n\n            //Trace through the dependencies.\n            each(depArray, function (depMap) {\n                var depId = depMap.id,\n                    depMod = registry[depId];\n\n                if (!depMod || processed[depId] ||\n                        !depMod.inited || !depMod.enabled) {\n                    return;\n                }\n\n                return (foundModule = findCycle(depMod, traced, processed));\n            });\n\n            processed[id] = true;\n\n            return foundModule;\n        }\n\n        function forceExec(mod, traced, uninited) {\n            var id = mod.map.id,\n                depArray = mod.depMaps;\n\n            if (!mod.inited || !mod.map.isDefine) {\n                return;\n            }\n\n            if (traced[id]) {\n                return defined[id];\n            }\n\n            traced[id] = mod;\n\n            each(depArray, function (depMap) {\n                var depId = depMap.id,\n                    depMod = registry[depId],\n                    value;\n\n                if (handlers[depId]) {\n                    return;\n                }\n\n                if (depMod) {\n                    if (!depMod.inited || !depMod.enabled) {\n                        //Dependency is not inited,\n                        //so this module cannot be\n                        //given a forced value yet.\n                        uninited[id] = true;\n                        return;\n                    }\n\n                    //Get the value for the current dependency\n                    value = forceExec(depMod, traced, uninited);\n\n                    //Even with forcing it may not be done,\n                    //in particular if the module is waiting\n                    //on a plugin resource.\n                    if (!uninited[depId]) {\n                        mod.defineDepById(depId, value);\n                    }\n                }\n            });\n\n            mod.check(true);\n\n            return defined[id];\n        }\n\n        function modCheck(mod) {\n            mod.check();\n        }\n\n        function checkLoaded() {\n            var map, modId, err, usingPathFallback,\n                waitInterval = config.waitSeconds * 1000,\n                //It is possible to disable the wait interval by using waitSeconds of 0.\n                expired = waitInterval && (context.startTime + waitInterval) < new Date().getTime(),\n                noLoads = [],\n                stillLoading = false,\n                needCycleCheck = true;\n\n            //Do not bother if this call was a result of a cycle break.\n            if (inCheckLoaded) {\n                return;\n            }\n\n            inCheckLoaded = true;\n\n            //Figure out the state of all the modules.\n            eachProp(registry, function (mod) {\n                map = mod.map;\n                modId = map.id;\n\n                //Skip things that are not enabled or in error state.\n                if (!mod.enabled) {\n                    return;\n                }\n\n                if (!mod.error) {\n                    //If the module should be executed, and it has not\n                    //been inited and time is up, remember it.\n                    if (!mod.inited && expired) {\n                        if (hasPathFallback(modId)) {\n                            usingPathFallback = true;\n                            stillLoading = true;\n                        } else {\n                            noLoads.push(modId);\n                            removeScript(modId);\n                        }\n                    } else if (!mod.inited && mod.fetched && map.isDefine) {\n                        stillLoading = true;\n                        if (!map.prefix) {\n                            //No reason to keep looking for unfinished\n                            //loading. If the only stillLoading is a\n                            //plugin resource though, keep going,\n                            //because it may be that a plugin resource\n                            //is waiting on a non-plugin cycle.\n                            return (needCycleCheck = false);\n                        }\n                    }\n                }\n            });\n\n            if (expired && noLoads.length) {\n                //If wait time expired, throw error of unloaded modules.\n                err = makeError('timeout', 'Load timeout for modules: ' + noLoads, null, noLoads);\n                err.contextName = context.contextName;\n                return onError(err);\n            }\n\n            //Not expired, check for a cycle.\n            if (needCycleCheck) {\n\n                each(waitAry, function (mod) {\n                    if (mod.defined) {\n                        return;\n                    }\n\n                    var cycleMod = findCycle(mod, {}, {}),\n                        traced = {};\n\n                    if (cycleMod) {\n                        forceExec(cycleMod, traced, {});\n\n                        //traced modules may have been\n                        //removed from the registry, but\n                        //their listeners still need to\n                        //be called.\n                        eachProp(traced, modCheck);\n                    }\n                });\n\n                //Now that dependencies have\n                //been satisfied, trigger the\n                //completion check that then\n                //notifies listeners.\n                eachProp(registry, modCheck);\n            }\n\n            //If still waiting on loads, and the waiting load is something\n            //other than a plugin resource, or there are still outstanding\n            //scripts, then just try back later.\n            if ((!expired || usingPathFallback) && stillLoading) {\n                //Something is still waiting to load. Wait for it, but only\n                //if a timeout is not already in effect.\n                if ((isBrowser || isWebWorker) && !checkLoadedTimeoutId) {\n                    checkLoadedTimeoutId = setTimeout(function () {\n                        checkLoadedTimeoutId = 0;\n                        checkLoaded();\n                    }, 50);\n                }\n            }\n\n            inCheckLoaded = false;\n        }\n\n        Module = function (map) {\n            this.events = undefEvents[map.id] || {};\n            this.map = map;\n            this.shim = config.shim[map.id];\n            this.depExports = [];\n            this.depMaps = [];\n            this.depMatched = [];\n            this.pluginMaps = {};\n            this.depCount = 0;\n\n            /* this.exports this.factory\n               this.depMaps = [],\n               this.enabled, this.fetched\n            */\n        };\n\n        Module.prototype = {\n            init: function (depMaps, factory, errback, options) {\n                options = options || {};\n\n                //Do not do more inits if already done. Can happen if there\n                //are multiple define calls for the same module. That is not\n                //a normal, common case, but it is also not unexpected.\n                if (this.inited) {\n                    return;\n                }\n\n                this.factory = factory;\n\n                if (errback) {\n                    //Register for errors on this module.\n                    this.on('error', errback);\n                } else if (this.events.error) {\n                    //If no errback already, but there are error listeners\n                    //on this module, set up an errback to pass to the deps.\n                    errback = bind(this, function (err) {\n                        this.emit('error', err);\n                    });\n                }\n\n                //Do a copy of the dependency array, so that\n                //source inputs are not modified. For example\n                //\"shim\" deps are passed in here directly, and\n                //doing a direct modification of the depMaps array\n                //would affect that config.\n                this.depMaps = depMaps && depMaps.slice(0);\n                this.depMaps.rjsSkipMap = depMaps.rjsSkipMap;\n\n                this.errback = errback;\n\n                //Indicate this module has be initialized\n                this.inited = true;\n\n                this.ignore = options.ignore;\n\n                //Could have option to init this module in enabled mode,\n                //or could have been previously marked as enabled. However,\n                //the dependencies are not known until init is called. So\n                //if enabled previously, now trigger dependencies as enabled.\n                if (options.enabled || this.enabled) {\n                    //Enable this module and dependencies.\n                    //Will call this.check()\n                    this.enable();\n                } else {\n                    this.check();\n                }\n            },\n\n            defineDepById: function (id, depExports) {\n                var i;\n\n                //Find the index for this dependency.\n                each(this.depMaps, function (map, index) {\n                    if (map.id === id) {\n                        i = index;\n                        return true;\n                    }\n                });\n\n                return this.defineDep(i, depExports);\n            },\n\n            defineDep: function (i, depExports) {\n                //Because of cycles, defined callback for a given\n                //export can be called more than once.\n                if (!this.depMatched[i]) {\n                    this.depMatched[i] = true;\n                    this.depCount -= 1;\n                    this.depExports[i] = depExports;\n                }\n            },\n\n            fetch: function () {\n                if (this.fetched) {\n                    return;\n                }\n                this.fetched = true;\n\n                context.startTime = (new Date()).getTime();\n\n                var map = this.map;\n\n                //If the manager is for a plugin managed resource,\n                //ask the plugin to load it now.\n                if (this.shim) {\n                    makeRequire(this, true)(this.shim.deps || [], bind(this, function () {\n                        return map.prefix ? this.callPlugin() : this.load();\n                    }));\n                } else {\n                    //Regular dependency.\n                    return map.prefix ? this.callPlugin() : this.load();\n                }\n            },\n\n            load: function () {\n                var url = this.map.url;\n\n                //Regular dependency.\n                if (!urlFetched[url]) {\n                    urlFetched[url] = true;\n                    context.load(this.map.id, url);\n                }\n            },\n\n            /**\n             * Checks is the module is ready to define itself, and if so,\n             * define it. If the silent argument is true, then it will just\n             * define, but not notify listeners, and not ask for a context-wide\n             * check of all loaded modules. That is useful for cycle breaking.\n             */\n            check: function (silent) {\n                if (!this.enabled || this.enabling) {\n                    return;\n                }\n\n                var err, cjsModule,\n                    id = this.map.id,\n                    depExports = this.depExports,\n                    exports = this.exports,\n                    factory = this.factory;\n\n                if (!this.inited) {\n                    this.fetch();\n                } else if (this.error) {\n                    this.emit('error', this.error);\n                } else if (!this.defining) {\n                    //The factory could trigger another require call\n                    //that would result in checking this module to\n                    //define itself again. If already in the process\n                    //of doing that, skip this work.\n                    this.defining = true;\n\n                    if (this.depCount < 1 && !this.defined) {\n                        if (isFunction(factory)) {\n                            //If there is an error listener, favor passing\n                            //to that instead of throwing an error.\n                            if (this.events.error) {\n                                try {\n                                    exports = context.execCb(id, factory, depExports, exports);\n                                } catch (e) {\n                                    err = e;\n                                }\n                            } else {\n                                exports = context.execCb(id, factory, depExports, exports);\n                            }\n\n                            if (this.map.isDefine) {\n                                //If setting exports via 'module' is in play,\n                                //favor that over return value and exports. After that,\n                                //favor a non-undefined return value over exports use.\n                                cjsModule = this.module;\n                                if (cjsModule &&\n                                        cjsModule.exports !== undefined &&\n                                        //Make sure it is not already the exports value\n                                        cjsModule.exports !== this.exports) {\n                                    exports = cjsModule.exports;\n                                } else if (exports === undefined && this.usingExports) {\n                                    //exports already set the defined value.\n                                    exports = this.exports;\n                                }\n                            }\n\n                            if (err) {\n                                err.requireMap = this.map;\n                                err.requireModules = [this.map.id];\n                                err.requireType = 'define';\n                                return onError((this.error = err));\n                            }\n\n                        } else {\n                            //Just a literal value\n                            exports = factory;\n                        }\n\n                        this.exports = exports;\n\n                        if (this.map.isDefine && !this.ignore) {\n                            defined[id] = exports;\n\n                            if (req.onResourceLoad) {\n                                req.onResourceLoad(context, this.map, this.depMaps);\n                            }\n                        }\n\n                        //Clean up\n                        delete registry[id];\n\n                        this.defined = true;\n                        context.waitCount -= 1;\n                        if (context.waitCount === 0) {\n                            //Clear the wait array used for cycles.\n                            waitAry = [];\n                        }\n                    }\n\n                    //Finished the define stage. Allow calling check again\n                    //to allow define notifications below in the case of a\n                    //cycle.\n                    this.defining = false;\n\n                    if (!silent) {\n                        if (this.defined && !this.defineEmitted) {\n                            this.defineEmitted = true;\n                            this.emit('defined', this.exports);\n                            this.defineEmitComplete = true;\n                        }\n                    }\n                }\n            },\n\n            callPlugin: function () {\n                var map = this.map,\n                    id = map.id,\n                    pluginMap = makeModuleMap(map.prefix, null, false, true);\n\n                on(pluginMap, 'defined', bind(this, function (plugin) {\n                    var load, normalizedMap, normalizedMod,\n                        name = this.map.name,\n                        parentName = this.map.parentMap ? this.map.parentMap.name : null;\n\n                    //If current map is not normalized, wait for that\n                    //normalized name to load instead of continuing.\n                    if (this.map.unnormalized) {\n                        //Normalize the ID if the plugin allows it.\n                        if (plugin.normalize) {\n                            name = plugin.normalize(name, function (name) {\n                                return normalize(name, parentName, true);\n                            }) || '';\n                        }\n\n                        normalizedMap = makeModuleMap(map.prefix + '!' + name,\n                                                      this.map.parentMap,\n                                                      false,\n                                                      true);\n                        on(normalizedMap,\n                            'defined', bind(this, function (value) {\n                                this.init([], function () { return value; }, null, {\n                                    enabled: true,\n                                    ignore: true\n                                });\n                            }));\n                        normalizedMod = registry[normalizedMap.id];\n                        if (normalizedMod) {\n                            if (this.events.error) {\n                                normalizedMod.on('error', bind(this, function (err) {\n                                    this.emit('error', err);\n                                }));\n                            }\n                            normalizedMod.enable();\n                        }\n\n                        return;\n                    }\n\n                    load = bind(this, function (value) {\n                        this.init([], function () { return value; }, null, {\n                            enabled: true\n                        });\n                    });\n\n                    load.error = bind(this, function (err) {\n                        this.inited = true;\n                        this.error = err;\n                        err.requireModules = [id];\n\n                        //Remove temp unnormalized modules for this module,\n                        //since they will never be resolved otherwise now.\n                        eachProp(registry, function (mod) {\n                            if (mod.map.id.indexOf(id + '_unnormalized') === 0) {\n                                removeWaiting(mod.map.id);\n                            }\n                        });\n\n                        onError(err);\n                    });\n\n                    //Allow plugins to load other code without having to know the\n                    //context or how to 'complete' the load.\n                    load.fromText = function (moduleName, text) {\n                        /*jslint evil: true */\n                        var hasInteractive = useInteractive;\n\n                        //Turn off interactive script matching for IE for any define\n                        //calls in the text, then turn it back on at the end.\n                        if (hasInteractive) {\n                            useInteractive = false;\n                        }\n\n                        //Prime the system by creating a module instance for\n                        //it.\n                        getModule(makeModuleMap(moduleName));\n\n                        req.exec(text);\n\n                        if (hasInteractive) {\n                            useInteractive = true;\n                        }\n\n                        //Support anonymous modules.\n                        context.completeLoad(moduleName);\n                    };\n\n                    //Use parentName here since the plugin's name is not reliable,\n                    //could be some weird string with no path that actually wants to\n                    //reference the parentName's path.\n                    plugin.load(map.name, makeRequire(map.parentMap, true, function (deps, cb, er) {\n                        deps.rjsSkipMap = true;\n                        return context.require(deps, cb, er);\n                    }), load, config);\n                }));\n\n                context.enable(pluginMap, this);\n                this.pluginMaps[pluginMap.id] = pluginMap;\n            },\n\n            enable: function () {\n                this.enabled = true;\n\n                if (!this.waitPushed) {\n                    waitAry.push(this);\n                    context.waitCount += 1;\n                    this.waitPushed = true;\n                }\n\n                //Set flag mentioning that the module is enabling,\n                //so that immediate calls to the defined callbacks\n                //for dependencies do not trigger inadvertent load\n                //with the depCount still being zero.\n                this.enabling = true;\n\n                //Enable each dependency\n                each(this.depMaps, bind(this, function (depMap, i) {\n                    var id, mod, handler;\n\n                    if (typeof depMap === 'string') {\n                        //Dependency needs to be converted to a depMap\n                        //and wired up to this module.\n                        depMap = makeModuleMap(depMap,\n                                               (this.map.isDefine ? this.map : this.map.parentMap),\n                                               false,\n                                               !this.depMaps.rjsSkipMap);\n                        this.depMaps[i] = depMap;\n\n                        handler = handlers[depMap.id];\n\n                        if (handler) {\n                            this.depExports[i] = handler(this);\n                            return;\n                        }\n\n                        this.depCount += 1;\n\n                        on(depMap, 'defined', bind(this, function (depExports) {\n                            this.defineDep(i, depExports);\n                            this.check();\n                        }));\n\n                        if (this.errback) {\n                            on(depMap, 'error', this.errback);\n                        }\n                    }\n\n                    id = depMap.id;\n                    mod = registry[id];\n\n                    //Skip special modules like 'require', 'exports', 'module'\n                    //Also, don't call enable if it is already enabled,\n                    //important in circular dependency cases.\n                    if (!handlers[id] && mod && !mod.enabled) {\n                        context.enable(depMap, this);\n                    }\n                }));\n\n                //Enable each plugin that is used in\n                //a dependency\n                eachProp(this.pluginMaps, bind(this, function (pluginMap) {\n                    var mod = registry[pluginMap.id];\n                    if (mod && !mod.enabled) {\n                        context.enable(pluginMap, this);\n                    }\n                }));\n\n                this.enabling = false;\n\n                this.check();\n            },\n\n            on: function (name, cb) {\n                var cbs = this.events[name];\n                if (!cbs) {\n                    cbs = this.events[name] = [];\n                }\n                cbs.push(cb);\n            },\n\n            emit: function (name, evt) {\n                each(this.events[name], function (cb) {\n                    cb(evt);\n                });\n                if (name === 'error') {\n                    //Now that the error handler was triggered, remove\n                    //the listeners, since this broken Module instance\n                    //can stay around for a while in the registry/waitAry.\n                    delete this.events[name];\n                }\n            }\n        };\n\n        function callGetModule(args) {\n            getModule(makeModuleMap(args[0], null, true)).init(args[1], args[2]);\n        }\n\n        function removeListener(node, func, name, ieName) {\n            //Favor detachEvent because of IE9\n            //issue, see attachEvent/addEventListener comment elsewhere\n            //in this file.\n            if (node.detachEvent && !isOpera) {\n                //Probably IE. If not it will throw an error, which will be\n                //useful to know.\n                if (ieName) {\n                    node.detachEvent(ieName, func);\n                }\n            } else {\n                node.removeEventListener(name, func, false);\n            }\n        }\n\n        /**\n         * Given an event from a script node, get the requirejs info from it,\n         * and then removes the event listeners on the node.\n         * @param {Event} evt\n         * @returns {Object}\n         */\n        function getScriptData(evt) {\n            //Using currentTarget instead of target for Firefox 2.0's sake. Not\n            //all old browsers will be supported, but this one was easy enough\n            //to support and still makes sense.\n            var node = evt.currentTarget || evt.srcElement;\n\n            //Remove the listeners once here.\n            removeListener(node, context.onScriptLoad, 'load', 'onreadystatechange');\n            removeListener(node, context.onScriptError, 'error');\n\n            return {\n                node: node,\n                id: node && node.getAttribute('data-requiremodule')\n            };\n        }\n\n        return (context = {\n            config: config,\n            contextName: contextName,\n            registry: registry,\n            defined: defined,\n            urlFetched: urlFetched,\n            waitCount: 0,\n            defQueue: defQueue,\n            Module: Module,\n            makeModuleMap: makeModuleMap,\n\n            /**\n             * Set a configuration for the context.\n             * @param {Object} cfg config object to integrate.\n             */\n            configure: function (cfg) {\n                //Make sure the baseUrl ends in a slash.\n                if (cfg.baseUrl) {\n                    if (cfg.baseUrl.charAt(cfg.baseUrl.length - 1) !== '/') {\n                        cfg.baseUrl += '/';\n                    }\n                }\n\n                //Save off the paths and packages since they require special processing,\n                //they are additive.\n                var pkgs = config.pkgs,\n                    shim = config.shim,\n                    paths = config.paths,\n                    map = config.map;\n\n                //Mix in the config values, favoring the new values over\n                //existing ones in context.config.\n                mixin(config, cfg, true);\n\n                //Merge paths.\n                config.paths = mixin(paths, cfg.paths, true);\n\n                //Merge map\n                if (cfg.map) {\n                    config.map = mixin(map || {}, cfg.map, true, true);\n                }\n\n                //Merge shim\n                if (cfg.shim) {\n                    eachProp(cfg.shim, function (value, id) {\n                        //Normalize the structure\n                        if (isArray(value)) {\n                            value = {\n                                deps: value\n                            };\n                        }\n                        if (value.exports && !value.exports.__buildReady) {\n                            value.exports = context.makeShimExports(value.exports);\n                        }\n                        shim[id] = value;\n                    });\n                    config.shim = shim;\n                }\n\n                //Adjust packages if necessary.\n                if (cfg.packages) {\n                    each(cfg.packages, function (pkgObj) {\n                        var location;\n\n                        pkgObj = typeof pkgObj === 'string' ? { name: pkgObj } : pkgObj;\n                        location = pkgObj.location;\n\n                        //Create a brand new object on pkgs, since currentPackages can\n                        //be passed in again, and config.pkgs is the internal transformed\n                        //state for all package configs.\n                        pkgs[pkgObj.name] = {\n                            name: pkgObj.name,\n                            location: location || pkgObj.name,\n                            //Remove leading dot in main, so main paths are normalized,\n                            //and remove any trailing .js, since different package\n                            //envs have different conventions: some use a module name,\n                            //some use a file name.\n                            main: (pkgObj.main || 'main')\n                                  .replace(currDirRegExp, '')\n                                  .replace(jsSuffixRegExp, '')\n                        };\n                    });\n\n                    //Done with modifications, assing packages back to context config\n                    config.pkgs = pkgs;\n                }\n\n                //If there are any \"waiting to execute\" modules in the registry,\n                //update the maps for them, since their info, like URLs to load,\n                //may have changed.\n                eachProp(registry, function (mod, id) {\n                    //If module already has init called, since it is too\n                    //late to modify them, and ignore unnormalized ones\n                    //since they are transient.\n                    if (!mod.inited && !mod.map.unnormalized) {\n                        mod.map = makeModuleMap(id);\n                    }\n                });\n\n                //If a deps array or a config callback is specified, then call\n                //require with those args. This is useful when require is defined as a\n                //config object before require.js is loaded.\n                if (cfg.deps || cfg.callback) {\n                    context.require(cfg.deps || [], cfg.callback);\n                }\n            },\n\n            makeShimExports: function (exports) {\n                var func;\n                if (typeof exports === 'string') {\n                    func = function () {\n                        return getGlobal(exports);\n                    };\n                    //Save the exports for use in nodefine checking.\n                    func.exports = exports;\n                    return func;\n                } else {\n                    return function () {\n                        return exports.apply(global, arguments);\n                    };\n                }\n            },\n\n            requireDefined: function (id, relMap) {\n                return hasProp(defined, makeModuleMap(id, relMap, false, true).id);\n            },\n\n            requireSpecified: function (id, relMap) {\n                id = makeModuleMap(id, relMap, false, true).id;\n                return hasProp(defined, id) || hasProp(registry, id);\n            },\n\n            require: function (deps, callback, errback, relMap) {\n                var moduleName, id, map, requireMod, args;\n                if (typeof deps === 'string') {\n                    if (isFunction(callback)) {\n                        //Invalid call\n                        return onError(makeError('requireargs', 'Invalid require call'), errback);\n                    }\n\n                    //Synchronous access to one module. If require.get is\n                    //available (as in the Node adapter), prefer that.\n                    //In this case deps is the moduleName and callback is\n                    //the relMap\n                    if (req.get) {\n                        return req.get(context, deps, callback);\n                    }\n\n                    //Just return the module wanted. In this scenario, the\n                    //second arg (if passed) is just the relMap.\n                    moduleName = deps;\n                    relMap = callback;\n\n                    //Normalize module name, if it contains . or ..\n                    map = makeModuleMap(moduleName, relMap, false, true);\n                    id = map.id;\n\n                    if (!hasProp(defined, id)) {\n                        return onError(makeError('notloaded', 'Module name \"' +\n                                    id +\n                                    '\" has not been loaded yet for context: ' +\n                                    contextName));\n                    }\n                    return defined[id];\n                }\n\n                //Callback require. Normalize args. if callback or errback is\n                //not a function, it means it is a relMap. Test errback first.\n                if (errback && !isFunction(errback)) {\n                    relMap = errback;\n                    errback = undefined;\n                }\n                if (callback && !isFunction(callback)) {\n                    relMap = callback;\n                    callback = undefined;\n                }\n\n                //Any defined modules in the global queue, intake them now.\n                takeGlobalQueue();\n\n                //Make sure any remaining defQueue items get properly processed.\n                while (defQueue.length) {\n                    args = defQueue.shift();\n                    if (args[0] === null) {\n                        return onError(makeError('mismatch', 'Mismatched anonymous define() module: ' + args[args.length - 1]));\n                    } else {\n                        //args are id, deps, factory. Should be normalized by the\n                        //define() function.\n                        callGetModule(args);\n                    }\n                }\n\n                //Mark all the dependencies as needing to be loaded.\n                requireMod = getModule(makeModuleMap(null, relMap));\n\n                requireMod.init(deps, callback, errback, {\n                    enabled: true\n                });\n\n                checkLoaded();\n\n                return context.require;\n            },\n\n            undef: function (id) {\n                //Bind any waiting define() calls to this context,\n                //fix for #408\n                takeGlobalQueue();\n\n                var map = makeModuleMap(id, null, true),\n                    mod = registry[id];\n\n                delete defined[id];\n                delete urlFetched[map.url];\n                delete undefEvents[id];\n\n                if (mod) {\n                    //Hold on to listeners in case the\n                    //module will be attempted to be reloaded\n                    //using a different config.\n                    if (mod.events.defined) {\n                        undefEvents[id] = mod.events;\n                    }\n\n                    removeWaiting(id);\n                }\n            },\n\n            /**\n             * Called to enable a module if it is still in the registry\n             * awaiting enablement. parent module is passed in for context,\n             * used by the optimizer.\n             */\n            enable: function (depMap, parent) {\n                var mod = registry[depMap.id];\n                if (mod) {\n                    getModule(depMap).enable();\n                }\n            },\n\n            /**\n             * Internal method used by environment adapters to complete a load event.\n             * A load event could be a script load or just a load pass from a synchronous\n             * load call.\n             * @param {String} moduleName the name of the module to potentially complete.\n             */\n            completeLoad: function (moduleName) {\n                var found, args, mod,\n                    shim = config.shim[moduleName] || {},\n                    shExports = shim.exports && shim.exports.exports;\n\n                takeGlobalQueue();\n\n                while (defQueue.length) {\n                    args = defQueue.shift();\n                    if (args[0] === null) {\n                        args[0] = moduleName;\n                        //If already found an anonymous module and bound it\n                        //to this name, then this is some other anon module\n                        //waiting for its completeLoad to fire.\n                        if (found) {\n                            break;\n                        }\n                        found = true;\n                    } else if (args[0] === moduleName) {\n                        //Found matching define call for this script!\n                        found = true;\n                    }\n\n                    callGetModule(args);\n                }\n\n                //Do this after the cycle of callGetModule in case the result\n                //of those calls/init calls changes the registry.\n                mod = registry[moduleName];\n\n                if (!found && !defined[moduleName] && mod && !mod.inited) {\n                    if (config.enforceDefine && (!shExports || !getGlobal(shExports))) {\n                        if (hasPathFallback(moduleName)) {\n                            return;\n                        } else {\n                            return onError(makeError('nodefine',\n                                             'No define call for ' + moduleName,\n                                             null,\n                                             [moduleName]));\n                        }\n                    } else {\n                        //A script that does not call define(), so just simulate\n                        //the call for it.\n                        callGetModule([moduleName, (shim.deps || []), shim.exports]);\n                    }\n                }\n\n                checkLoaded();\n            },\n\n            /**\n             * Converts a module name + .extension into an URL path.\n             * *Requires* the use of a module name. It does not support using\n             * plain URLs like nameToUrl.\n             */\n            toUrl: function (moduleNamePlusExt, relModuleMap) {\n                var index = moduleNamePlusExt.lastIndexOf('.'),\n                    ext = null;\n\n                if (index !== -1) {\n                    ext = moduleNamePlusExt.substring(index, moduleNamePlusExt.length);\n                    moduleNamePlusExt = moduleNamePlusExt.substring(0, index);\n                }\n\n                return context.nameToUrl(normalize(moduleNamePlusExt, relModuleMap && relModuleMap.id, true),\n                                         ext);\n            },\n\n            /**\n             * Converts a module name to a file path. Supports cases where\n             * moduleName may actually be just an URL.\n             * Note that it **does not** call normalize on the moduleName,\n             * it is assumed to have already been normalized. This is an\n             * internal API, not a public one. Use toUrl for the public API.\n             */\n            nameToUrl: function (moduleName, ext) {\n                var paths, pkgs, pkg, pkgPath, syms, i, parentModule, url,\n                    parentPath;\n\n                //If a colon is in the URL, it indicates a protocol is used and it is just\n                //an URL to a file, or if it starts with a slash, contains a query arg (i.e. ?)\n                //or ends with .js, then assume the user meant to use an url and not a module id.\n                //The slash is important for protocol-less URLs as well as full paths.\n                if (req.jsExtRegExp.test(moduleName)) {\n                    //Just a plain path, not module name lookup, so just return it.\n                    //Add extension if it is included. This is a bit wonky, only non-.js things pass\n                    //an extension, this method probably needs to be reworked.\n                    url = moduleName + (ext || '');\n                } else {\n                    //A module that needs to be converted to a path.\n                    paths = config.paths;\n                    pkgs = config.pkgs;\n\n                    syms = moduleName.split('/');\n                    //For each module name segment, see if there is a path\n                    //registered for it. Start with most specific name\n                    //and work up from it.\n                    for (i = syms.length; i > 0; i -= 1) {\n                        parentModule = syms.slice(0, i).join('/');\n                        pkg = pkgs[parentModule];\n                        parentPath = paths[parentModule];\n                        if (parentPath) {\n                            //If an array, it means there are a few choices,\n                            //Choose the one that is desired\n                            if (isArray(parentPath)) {\n                                parentPath = parentPath[0];\n                            }\n                            syms.splice(0, i, parentPath);\n                            break;\n                        } else if (pkg) {\n                            //If module name is just the package name, then looking\n                            //for the main module.\n                            if (moduleName === pkg.name) {\n                                pkgPath = pkg.location + '/' + pkg.main;\n                            } else {\n                                pkgPath = pkg.location;\n                            }\n                            syms.splice(0, i, pkgPath);\n                            break;\n                        }\n                    }\n\n                    //Join the path parts together, then figure out if baseUrl is needed.\n                    url = syms.join('/');\n                    url += (ext || (/\\?/.test(url) ? '' : '.js'));\n                    url = (url.charAt(0) === '/' || url.match(/^[\\w\\+\\.\\-]+:/) ? '' : config.baseUrl) + url;\n                }\n\n                return config.urlArgs ? url +\n                                        ((url.indexOf('?') === -1 ? '?' : '&') +\n                                         config.urlArgs) : url;\n            },\n\n            //Delegates to req.load. Broken out as a separate function to\n            //allow overriding in the optimizer.\n            load: function (id, url) {\n                req.load(context, id, url);\n            },\n\n            /**\n             * Executes a module callack function. Broken out as a separate function\n             * solely to allow the build system to sequence the files in the built\n             * layer in the right sequence.\n             *\n             * @private\n             */\n            execCb: function (name, callback, args, exports) {\n                return callback.apply(exports, args);\n            },\n\n            /**\n             * callback for script loads, used to check status of loading.\n             *\n             * @param {Event} evt the event from the browser for the script\n             * that was loaded.\n             */\n            onScriptLoad: function (evt) {\n                //Using currentTarget instead of target for Firefox 2.0's sake. Not\n                //all old browsers will be supported, but this one was easy enough\n                //to support and still makes sense.\n                if (evt.type === 'load' ||\n                        (readyRegExp.test((evt.currentTarget || evt.srcElement).readyState))) {\n                    //Reset interactive script so a script node is not held onto for\n                    //to long.\n                    interactiveScript = null;\n\n                    //Pull out the name of the module and the context.\n                    var data = getScriptData(evt);\n                    context.completeLoad(data.id);\n                }\n            },\n\n            /**\n             * Callback for script errors.\n             */\n            onScriptError: function (evt) {\n                var data = getScriptData(evt);\n                if (!hasPathFallback(data.id)) {\n                    return onError(makeError('scripterror', 'Script error', evt, [data.id]));\n                }\n            }\n        });\n    }\n\n    /**\n     * Main entry point.\n     *\n     * If the only argument to require is a string, then the module that\n     * is represented by that string is fetched for the appropriate context.\n     *\n     * If the first argument is an array, then it will be treated as an array\n     * of dependency string names to fetch. An optional function callback can\n     * be specified to execute when all of those dependencies are available.\n     *\n     * Make a local req variable to help Caja compliance (it assumes things\n     * on a require that are not standardized), and to give a short\n     * name for minification/local scope use.\n     */\n    req = requirejs = function (deps, callback, errback, optional) {\n\n        //Find the right context, use default\n        var context, config,\n            contextName = defContextName;\n\n        // Determine if have config object in the call.\n        if (!isArray(deps) && typeof deps !== 'string') {\n            // deps is a config object\n            config = deps;\n            if (isArray(callback)) {\n                // Adjust args if there are dependencies\n                deps = callback;\n                callback = errback;\n                errback = optional;\n            } else {\n                deps = [];\n            }\n        }\n\n        if (config && config.context) {\n            contextName = config.context;\n        }\n\n        context = contexts[contextName];\n        if (!context) {\n            context = contexts[contextName] = req.s.newContext(contextName);\n        }\n\n        if (config) {\n            context.configure(config);\n        }\n\n        return context.require(deps, callback, errback);\n    };\n\n    /**\n     * Support require.config() to make it easier to cooperate with other\n     * AMD loaders on globally agreed names.\n     */\n    req.config = function (config) {\n        return req(config);\n    };\n\n    /**\n     * Export require as a global, but only if it does not already exist.\n     */\n    if (!require) {\n        require = req;\n    }\n\n    req.version = version;\n\n    //Used to filter out dependencies that are already paths.\n    req.jsExtRegExp = /^\\/|:|\\?|\\.js$/;\n    req.isBrowser = isBrowser;\n    s = req.s = {\n        contexts: contexts,\n        newContext: newContext\n    };\n\n    //Create default context.\n    req({});\n\n    //Exports some context-sensitive methods on global require, using\n    //default context if no context specified.\n    addRequireMethods(req);\n\n    if (isBrowser) {\n        head = s.head = document.getElementsByTagName('head')[0];\n        //If BASE tag is in play, using appendChild is a problem for IE6.\n        //When that browser dies, this can be removed. Details in this jQuery bug:\n        //http://dev.jquery.com/ticket/2709\n        baseElement = document.getElementsByTagName('base')[0];\n        if (baseElement) {\n            head = s.head = baseElement.parentNode;\n        }\n    }\n\n    /**\n     * Any errors that require explicitly generates will be passed to this\n     * function. Intercept/override it if you want custom error handling.\n     * @param {Error} err the error object.\n     */\n    req.onError = function (err) {\n        throw err;\n    };\n\n    /**\n     * Does the request to load a module for the browser case.\n     * Make this a separate function to allow other environments\n     * to override it.\n     *\n     * @param {Object} context the require context to find state.\n     * @param {String} moduleName the name of the module.\n     * @param {Object} url the URL to the module.\n     */\n    req.load = function (context, moduleName, url) {\n        var config = (context && context.config) || {},\n            node;\n        if (isBrowser) {\n            //In the browser so use a script tag\n            node = config.xhtml ?\n                    document.createElementNS('http://www.w3.org/1999/xhtml', 'html:script') :\n                    document.createElement('script');\n            node.type = config.scriptType || 'text/javascript';\n            node.charset = 'utf-8';\n            node.async = true;\n\n            node.setAttribute('data-requirecontext', context.contextName);\n            node.setAttribute('data-requiremodule', moduleName);\n\n            //Set up load listener. Test attachEvent first because IE9 has\n            //a subtle issue in its addEventListener and script onload firings\n            //that do not match the behavior of all other browsers with\n            //addEventListener support, which fire the onload event for a\n            //script right after the script execution. See:\n            //https://connect.microsoft.com/IE/feedback/details/648057/script-onload-event-is-not-fired-immediately-after-script-execution\n            //UNFORTUNATELY Opera implements attachEvent but does not follow the script\n            //script execution mode.\n            if (node.attachEvent &&\n                    //Check if node.attachEvent is artificially added by custom script or\n                    //natively supported by browser\n                    //read https://github.com/jrburke/requirejs/issues/187\n                    //if we can NOT find [native code] then it must NOT natively supported.\n                    //in IE8, node.attachEvent does not have toString()\n                    //Note the test for \"[native code\" with no closing brace, see:\n                    //https://github.com/jrburke/requirejs/issues/273\n                    !(node.attachEvent.toString && node.attachEvent.toString().indexOf('[native code') < 0) &&\n                    !isOpera) {\n                //Probably IE. IE (at least 6-8) do not fire\n                //script onload right after executing the script, so\n                //we cannot tie the anonymous define call to a name.\n                //However, IE reports the script as being in 'interactive'\n                //readyState at the time of the define call.\n                useInteractive = true;\n\n                node.attachEvent('onreadystatechange', context.onScriptLoad);\n                //It would be great to add an error handler here to catch\n                //404s in IE9+. However, onreadystatechange will fire before\n                //the error handler, so that does not help. If addEvenListener\n                //is used, then IE will fire error before load, but we cannot\n                //use that pathway given the connect.microsoft.com issue\n                //mentioned above about not doing the 'script execute,\n                //then fire the script load event listener before execute\n                //next script' that other browsers do.\n                //Best hope: IE10 fixes the issues,\n                //and then destroys all installs of IE 6-9.\n                //node.attachEvent('onerror', context.onScriptError);\n            } else {\n                node.addEventListener('load', context.onScriptLoad, false);\n                node.addEventListener('error', context.onScriptError, false);\n            }\n            node.src = url;\n\n            //For some cache cases in IE 6-8, the script executes before the end\n            //of the appendChild execution, so to tie an anonymous define\n            //call to the module name (which is stored on the node), hold on\n            //to a reference to this node, but clear after the DOM insertion.\n            currentlyAddingScript = node;\n            if (baseElement) {\n                head.insertBefore(node, baseElement);\n            } else {\n                head.appendChild(node);\n            }\n            currentlyAddingScript = null;\n\n            return node;\n        } else if (isWebWorker) {\n            //In a web worker, use importScripts. This is not a very\n            //efficient use of importScripts, importScripts will block until\n            //its script is downloaded and evaluated. However, if web workers\n            //are in play, the expectation that a build has been done so that\n            //only one script needs to be loaded anyway. This may need to be\n            //reevaluated if other use cases become common.\n            importScripts(url);\n\n            //Account for anonymous modules\n            context.completeLoad(moduleName);\n        }\n    };\n\n    function getInteractiveScript() {\n        if (interactiveScript && interactiveScript.readyState === 'interactive') {\n            return interactiveScript;\n        }\n\n        eachReverse(scripts(), function (script) {\n            if (script.readyState === 'interactive') {\n                return (interactiveScript = script);\n            }\n        });\n        return interactiveScript;\n    }\n\n    //Look for a data-main script attribute, which could also adjust the baseUrl.\n    if (isBrowser) {\n        //Figure out baseUrl. Get it from the script tag with require.js in it.\n        eachReverse(scripts(), function (script) {\n            //Set the 'head' where we can append children by\n            //using the script's parent.\n            if (!head) {\n                head = script.parentNode;\n            }\n\n            //Look for a data-main attribute to set main script for the page\n            //to load. If it is there, the path to data main becomes the\n            //baseUrl, if it is not already set.\n            dataMain = script.getAttribute('data-main');\n            if (dataMain) {\n                //Set final baseUrl if there is not already an explicit one.\n                if (!cfg.baseUrl) {\n                    //Pull off the directory of data-main for use as the\n                    //baseUrl.\n                    src = dataMain.split('/');\n                    mainScript = src.pop();\n                    subPath = src.length ? src.join('/')  + '/' : './';\n\n                    cfg.baseUrl = subPath;\n                    dataMain = mainScript;\n                }\n\n                //Strip off any trailing .js since dataMain is now\n                //like a module name.\n                dataMain = dataMain.replace(jsSuffixRegExp, '');\n\n                //Put the data-main script in the files to load.\n                cfg.deps = cfg.deps ? cfg.deps.concat(dataMain) : [dataMain];\n\n                return true;\n            }\n        });\n    }\n\n    /**\n     * The function that handles definitions of modules. Differs from\n     * require() in that a string for the module should be the first argument,\n     * and the function to execute after dependencies are loaded should\n     * return a value to define the module corresponding to the first argument's\n     * name.\n     */\n    define = function (name, deps, callback) {\n        var node, context;\n\n        //Allow for anonymous functions\n        if (typeof name !== 'string') {\n            //Adjust args appropriately\n            callback = deps;\n            deps = name;\n            name = null;\n        }\n\n        //This module may not have dependencies\n        if (!isArray(deps)) {\n            callback = deps;\n            deps = [];\n        }\n\n        //If no name, and callback is a function, then figure out if it a\n        //CommonJS thing with dependencies.\n        if (!deps.length && isFunction(callback)) {\n            //Remove comments from the callback string,\n            //look for require calls, and pull them into the dependencies,\n            //but only if there are function args.\n            if (callback.length) {\n                callback\n                    .toString()\n                    .replace(commentRegExp, '')\n                    .replace(cjsRequireRegExp, function (match, dep) {\n                        deps.push(dep);\n                    });\n\n                //May be a CommonJS thing even without require calls, but still\n                //could use exports, and module. Avoid doing exports and module\n                //work though if it just needs require.\n                //REQUIRES the function to expect the CommonJS variables in the\n                //order listed below.\n                deps = (callback.length === 1 ? ['require'] : ['require', 'exports', 'module']).concat(deps);\n            }\n        }\n\n        //If in IE 6-8 and hit an anonymous define() call, do the interactive\n        //work.\n        if (useInteractive) {\n            node = currentlyAddingScript || getInteractiveScript();\n            if (node) {\n                if (!name) {\n                    name = node.getAttribute('data-requiremodule');\n                }\n                context = contexts[node.getAttribute('data-requirecontext')];\n            }\n        }\n\n        //Always save off evaluating the def call until the script onload handler.\n        //This allows multiple modules to be in a file without prematurely\n        //tracing dependencies, and allows for anonymous module support,\n        //where the module name is not known until the script onload event\n        //occurs. If no context, use the global queue, and get it processed\n        //in the onscript load callback.\n        (context ? context.defQueue : globalDefQueue).push([name, deps, callback]);\n    };\n\n    define.amd = {\n        jQuery: true\n    };\n\n    /**\n     * Executes the text. Normally just uses eval, but can be modified\n     * to use a better, environment-specific call. Only used for transpiling\n     * loader plugins, not for plain JS modules.\n     * @param {String} text the text to execute/evaluate.\n     */\n    req.exec = function (text) {\n        /*jslint evil: true */\n        return eval(text);\n    };\n\n    //Set up with config info.\n    req(cfg);\n}(this));\n"
  },
  {
    "path": "examples/requirejs/readme.md",
    "content": ""
  },
  {
    "path": "examples/requirejs/require-example.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n        <title>RequireJS</title>\n        <script data-main=\"js/app\" src=\"js/lib/require.js\"></script>\n    </head>\n    <body>\n        <div id=\"coordinates\">0,0</div>\n        <div id=\"delta\">0</div>\n        <ul id=\"buffer\"></ul>\n    </body>\n</html>\n"
  },
  {
    "path": "examples/simpledatabinding/readme.md",
    "content": ""
  },
  {
    "path": "examples/simpledatabinding/simpledatabinding.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" >\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta charset=\"utf-8\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <title>Rx for JavaScript Rocks!</title>\n    <link rel=\"stylesheet\" href=\"http://ajax.aspnetcdn.com/ajax/bootstrap/2.3.2/css/bootstrap.min.css\">\n    <link rel=\"stylesheet\" href=\"http://ajax.aspnetcdn.com/ajax/bootstrap/2.3.2/css/bootstrap-responsive.min.css\">\n</head>\n<body>\n    <div class=\"container\">\n        <div class=\"page-header\">\n            <h1>Simple Data Binding Example</h1>\n            <p class=\"lead\">Show simple concepts of data binding!</p>\n        </div>\n        <div class=\"row-fluid\">\n            <form>\n                <fieldset>\n                    <legend>First Example Using Simple Binds</legend>\n                    <label id=\"label1\"></label>\n                    <label for=\"firstName1\">First Name</label>\n                    <input id=\"firstName1\" type=\"text\" placeholder=\"Enter First Name...\">\n                    <label for=\"lastName1\">Last Name</label>\n                    <input id=\"lastName1\" type=\"text\" placeholder=\"Enter Last Name...\">\n                    <label for=\"fullName1\">Full Name</label>\n                    <input id=\"fullName1\" type=\"text\" readonly>\n                </fieldset>\n            </form>\n        </div>\n    </div>\n    <script src=\"http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.10.2.min.js\"></script>\n    <script src=\"../../dist/rx.lite.js\"></script>\n    <script src=\"simpledatabinding.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/simpledatabinding/simpledatabinding.js",
    "content": "$(function () {\n\n    // Make a simple binding\n    var label1 = document.querySelector('#label1');\n    var hello = new Rx.BehaviorSubject('Hello');\n    hello.subscribe(function (text) {\n        label1.textContent = text;\n    });\n\n    // Create simple bindings for first and last name\n    var firstName1 = new Rx.BehaviorSubject('');\n    var lastName1 = new Rx.BehaviorSubject('');\n\n    // Create first and last name composite\n    var fullName1 = firstName1.combineLatest(lastName1, function (first, last) {\n        return first + ' ' + last;\n    });\n\n    // Subscribe to them all\n    var fn1 = document.querySelector('#firstName1');\n    firstName1.subscribe(function (text) { fn1.value = text });\n\n    var ln1 = document.querySelector('#lastName1');\n    lastName1.subscribe(function (text) { ln1.value = text });\n\n    var full1 = document.querySelector('#fullName1');\n    fullName1.subscribe(function (text) { full1.value = text });\n\n    // Create two way bindings for both first name and last name\n    Rx.Observable.fromEvent(fn1, 'keyup')\n        .subscribe(function (e) { firstName1.onNext(e.target.value); })\n\n    Rx.Observable.fromEvent(ln1, 'keyup')\n        .subscribe(function (e) { lastName1.onNext(e.target.value); })\n\n});\n"
  },
  {
    "path": "examples/speech/readme.md",
    "content": ""
  },
  {
    "path": "examples/speech/speech.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" >\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta charset=\"utf-8\">\n  <meta name=\"description\" content=\"\">\n  <meta name=\"author\" content=\"\">\n  <title>Rx for JavaScript Rocks!</title>\n  <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap.min.css\">\n  <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap-responsive.min.css\">\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"page-header\">\n      <h1>RxJS Speech Detection Example</h1>\n      <p class=\"lead\">Example to show combining speech recognition and sythesis using RxJS</p>\n    </div>\n    <div class=\"row-fluid\">\n      <ul id=\"results\"></ul>\n    </div>\n  </div>\n  <script src=\"../../dist/rx.lite.js\"></script>\n  <script src=\"speech.js\"></script>\n</html>\n"
  },
  {
    "path": "examples/speech/speech.js",
    "content": "(function (root) {\n  var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n  function extend(a, b) {\n    for(var prop in b) {\n      if(hasOwnProperty.call(b, prop)) {\n        a[prop] = b[prop];\n      }\n    }\n    return a;\n  }\n\n  var SpeechRecognition = root.SpeechRecognition ||\n                          root.webkitSpeechRecognition ||\n                          root.mozSpeechRecognition ||\n                          root.msSpeechRecognition ||\n                          root.oSpeechRecognition;\n\n  function fromSpeechRecognition(options) {\n    if(!SpeechRecognition) {\n      throw new Error('speech recognition not supported');\n    }\n\n    options || (options = {});\n    var config = extend({\n      continuous: false,\n      maxAlternatives: 5,\n      lang: 'en-US'\n    }, options);\n\n    return Rx.Observable.create(function (observer) {\n      var recognition = new SpeechRecognition();\n      recognition.continuous = config.continuous;\n\n      recognition.onresult = observer.onNext.bind(observer);\n      recognition.onerror = observer.onError.bind(observer);\n      recognition.onend = observer.onCompleted.bind(observer);\n\n      recognition.start();\n\n      return recognition.stop.bind(recognition);\n    });\n  }\n\n  function fromSpeechUtterance(text) {\n    if (!SpeechSynthesisUtterance) {\n      throw new Error('SpeechSynthesisUtterance is not supported');\n    }\n\n    return Observable.create(function (observer) {\n      var msg = new SpeechSynthesisUtterance(text);\n\n      speechSynthesis.speak(msg);\n\n      msg.onend = function (e) {\n        obs.onNext(msg);\n        obs.onCompleted();\n      };\n    });\n  }\n\n  function main() {\n    var results = document.querySelector('#results');\n\n    var voice = fromSpeechRecognition({ continuous: true })\n      .map(function (e) { return e.results[e.resultIndex][0].transcript; })\n      .flatMap(fromSpeechUtterance)\n      .subscribe(\n        function (uttered) {\n          var li = document.createElement('li');\n          li.innerText = uttered.text;\n          results.appendChild(li);\n        },\n        function (error) {\n          var li = document.createElement('li');\n          li.innerText = error.error;\n          results.appendChild(li);\n        });\n  }\n\n  main();\n\n}(window));\n"
  },
  {
    "path": "examples/stockserver/AAPL.csv",
    "content": "﻿Date,Open,High,Low,Close,Volume\n9-Jul-12,605.30,613.90,604.11,613.89,13550032\n6-Jul-12,607.09,608.44,601.58,605.88,14965308\n5-Jul-12,600.56,614.34,599.65,609.94,17299303\n3-Jul-12,594.88,600.00,594.00,599.41,8632595\n2-Jul-12,584.73,593.47,583.60,592.52,14288968\n29-Jun-12,578.00,584.00,574.25,584.00,15051433\n28-Jun-12,571.67,574.00,565.61,569.05,10108649\n27-Jun-12,575.00,576.74,571.92,574.50,7252110\n26-Jun-12,571.33,574.49,567.33,572.02,9883929\n25-Jun-12,577.30,579.80,570.37,570.76,10869808\n22-Jun-12,579.04,582.19,575.42,582.10,10169473\n21-Jun-12,585.44,588.22,577.44,577.67,11660894\n20-Jun-12,588.21,589.25,580.80,585.74,12827092\n19-Jun-12,583.40,590.00,583.10,587.41,12907276\n18-Jun-12,570.96,587.89,570.37,585.78,15728970\n15-Jun-12,571.00,574.62,569.55,574.13,11973340\n14-Jun-12,571.24,573.50,567.26,571.53,12351469\n13-Jun-12,574.52,578.48,570.38,572.16,10491890\n12-Jun-12,574.46,576.62,566.70,576.16,15556423\n11-Jun-12,587.72,588.50,570.63,571.17,21116528\n8-Jun-12,571.60,580.58,569.00,580.32,12410410\n7-Jun-12,577.29,577.32,570.50,571.72,13570452\n6-Jun-12,567.77,573.85,565.50,571.46,14337466\n5-Jun-12,561.27,566.47,558.33,562.83,13864768\n4-Jun-12,561.50,567.50,548.50,564.29,19892447\n1-Jun-12,569.16,572.65,560.52,560.99,18606442\n31-May-12,580.74,581.50,571.46,577.73,17568229\n30-May-12,569.20,579.99,566.56,579.17,18907887\n29-May-12,570.90,574.00,565.31,572.27,13589478\n25-May-12,564.59,565.85,558.47,562.29,11730936\n24-May-12,575.87,576.50,561.23,565.32,17721358\n23-May-12,557.50,572.80,553.23,570.56,20889195\n22-May-12,569.55,573.88,552.58,556.97,24813822\n21-May-12,534.50,561.54,534.05,561.28,22538970\n18-May-12,533.96,543.41,522.18,530.38,26153209\n17-May-12,545.31,547.50,530.12,530.12,25614959\n16-May-12,554.05,556.89,541.04,546.08,20031982\n15-May-12,561.45,563.22,551.75,553.17,17010954\n14-May-12,562.57,567.51,557.60,558.22,12593729\n11-May-12,565.00,574.47,564.35,566.71,14269476\n10-May-12,574.58,575.88,568.44,570.52,11902536\n9-May-12,563.70,573.98,560.85,569.18,17167989\n8-May-12,569.58,571.50,558.73,568.18,17758960\n7-May-12,561.50,572.77,561.23,569.48,16439031\n4-May-12,577.08,578.36,565.17,565.25,18928203\n3-May-12,590.50,591.40,580.30,581.82,13948151\n2-May-12,580.24,587.40,578.86,585.98,15272288\n1-May-12,584.90,596.76,581.23,582.13,21821359\n30-Apr-12,597.80,598.40,583.00,583.98,18076434\n27-Apr-12,605.07,606.18,600.50,603.00,14527500\n26-Apr-12,614.27,614.69,602.13,607.70,19145182\n25-Apr-12,615.64,618.00,606.00,610.00,32346810\n24-Apr-12,562.61,567.69,555.00,560.28,38442834\n23-Apr-12,570.61,576.67,556.62,571.70,34518497\n20-Apr-12,591.38,594.62,570.42,572.98,36820544\n19-Apr-12,600.22,604.73,584.52,587.44,29811195\n18-Apr-12,613.72,620.25,602.71,608.34,34090353\n17-Apr-12,578.94,610.00,571.91,609.70,36624496\n16-Apr-12,610.06,610.28,578.25,580.13,37528008\n13-Apr-12,624.11,624.70,603.51,605.23,30701581\n12-Apr-12,625.00,631.33,620.50,622.77,21940309\n11-Apr-12,636.20,636.87,623.34,626.20,24878967\n10-Apr-12,639.93,644.00,626.00,628.44,31774636\n9-Apr-12,626.13,639.84,625.30,636.23,21340578\n5-Apr-12,626.98,634.66,623.40,633.68,22902694\n4-Apr-12,624.35,625.86,617.00,624.31,20463585\n3-Apr-12,627.30,632.21,622.51,629.32,29714508\n2-Apr-12,601.83,618.77,600.38,618.63,21369494\n30-Mar-12,608.77,610.56,597.94,599.55,26108485\n29-Mar-12,612.78,616.56,607.23,609.86,21722776\n28-Mar-12,618.38,621.45,610.31,617.62,23409267\n27-Mar-12,606.18,616.28,606.06,614.48,21683163\n26-Mar-12,599.79,607.15,595.26,606.98,21276317\n23-Mar-12,600.49,601.80,594.40,596.05,15374545\n22-Mar-12,597.78,604.50,595.53,599.34,22290414\n21-Mar-12,602.74,609.65,601.41,602.50,23001482\n20-Mar-12,599.51,606.90,582.00,605.96,29166719\n19-Mar-12,598.37,601.77,589.05,601.10,32186970\n16-Mar-12,584.72,589.20,578.00,585.57,29481697\n15-Mar-12,599.61,600.01,578.55,585.56,41416824\n14-Mar-12,578.05,594.72,575.40,589.58,50672821\n13-Mar-12,557.54,568.18,555.75,568.10,24673237\n12-Mar-12,548.98,552.00,547.00,552.00,14545717\n9-Mar-12,544.21,547.74,543.11,545.17,14960676\n8-Mar-12,534.69,542.99,532.12,541.99,18444389\n7-Mar-12,536.80,537.78,523.30,530.69,28518507\n6-Mar-12,523.66,533.69,516.22,530.26,28937093\n5-Mar-12,545.42,547.48,526.00,533.16,28897169\n2-Mar-12,544.24,546.80,542.52,545.18,15418227\n1-Mar-12,548.17,548.21,538.77,544.47,24401884\n29-Feb-12,541.56,547.61,535.70,542.44,34000054\n28-Feb-12,527.96,535.41,525.85,535.41,21442354\n27-Feb-12,521.31,528.50,516.28,525.76,19556472\n24-Feb-12,519.67,522.90,518.64,522.41,14831415\n23-Feb-12,515.08,517.83,509.50,516.39,20286616\n22-Feb-12,513.08,515.49,509.07,513.04,17260544\n21-Feb-12,506.88,514.85,504.12,514.85,21628057\n17-Feb-12,503.11,507.77,500.30,502.12,19135313\n16-Feb-12,491.50,504.89,486.63,502.21,33733915\n15-Feb-12,514.26,526.29,496.89,497.67,53789720\n14-Feb-12,504.66,509.56,502.00,509.46,16497573\n13-Feb-12,499.53,503.83,497.09,502.60,18471658\n10-Feb-12,490.96,497.62,488.55,493.42,22546425\n9-Feb-12,480.76,496.75,480.56,493.17,31579086\n8-Feb-12,470.50,476.79,469.70,476.68,14567040\n7-Feb-12,465.25,469.75,464.58,468.83,11293609\n6-Feb-12,458.38,464.98,458.20,463.97,8917228\n3-Feb-12,457.30,460.00,455.56,459.68,10245287\n2-Feb-12,455.90,457.17,453.98,455.12,6671221\n1-Feb-12,458.41,458.99,455.55,456.19,9644366\n31-Jan-12,455.59,458.24,453.07,456.48,13996855\n30-Jan-12,445.71,453.90,445.39,453.01,13547439\n27-Jan-12,444.34,448.48,443.77,447.28,10710233\n26-Jan-12,448.36,448.79,443.14,444.63,11579673\n25-Jan-12,454.44,454.45,443.73,446.66,34223691\n24-Jan-12,425.10,425.10,419.55,420.41,19558473\n23-Jan-12,422.67,428.45,422.30,427.41,10930778\n20-Jan-12,427.49,427.50,419.75,420.30,14784607\n19-Jan-12,430.15,431.37,426.51,427.75,9347779\n18-Jan-12,426.96,429.47,426.30,429.11,9885394\n17-Jan-12,424.20,425.99,422.96,424.70,8674865\n13-Jan-12,419.81,419.81,419.81,419.81,0\n12-Jan-12,422.28,422.90,418.75,421.39,7597273\n11-Jan-12,422.68,422.85,419.31,422.55,7685437\n10-Jan-12,425.91,426.00,421.50,423.24,9225966\n9-Jan-12,425.50,427.75,421.35,421.73,14072256\n6-Jan-12,419.77,422.75,419.22,422.40,11370916\n5-Jan-12,414.95,418.55,412.67,418.03,9688115\n4-Jan-12,410.00,414.68,409.28,413.44,9294444\n3-Jan-12,409.40,412.50,409.00,411.23,10794957\n30-Dec-11,405.00,405.00,405.00,405.00,0\n29-Dec-11,403.40,405.65,400.51,405.12,7719863\n28-Dec-11,406.89,408.25,401.34,402.64,8173461\n27-Dec-11,403.10,409.09,403.02,406.53,9472659\n23-Dec-11,403.43,403.43,403.43,403.43,0\n22-Dec-11,397.00,399.13,396.10,398.55,7227016\n21-Dec-11,396.69,397.30,392.01,396.44,9390954\n20-Dec-11,387.76,396.10,387.26,395.95,12050104\n19-Dec-11,382.47,384.85,380.48,382.21,8411702\n16-Dec-11,380.36,384.15,379.57,381.02,15056343\n15-Dec-11,383.33,383.74,378.31,378.94,9158875\n14-Dec-11,386.70,387.38,377.68,380.19,14541240\n13-Dec-11,393.00,395.40,387.10,388.81,12112029\n12-Dec-11,391.68,393.90,389.45,391.84,10752338\n9-Dec-11,392.85,394.04,391.03,393.62,10612255\n8-Dec-11,391.45,395.50,390.23,390.66,13441293\n7-Dec-11,389.93,390.94,386.76,389.09,10892847\n6-Dec-11,392.51,394.63,389.38,390.95,10135859\n5-Dec-11,393.49,396.41,390.39,393.01,12763161\n2-Dec-11,389.83,393.63,388.58,389.70,13545470\n1-Dec-11,382.54,389.00,380.75,387.93,13827834\n30-Nov-11,381.29,382.28,378.30,382.20,14502386\n29-Nov-11,375.84,378.83,370.20,373.20,13429694\n28-Nov-11,372.35,376.72,370.33,376.12,12380122\n25-Nov-11,368.42,371.15,363.32,363.57,9098543\n23-Nov-11,366.99,366.99,366.99,366.99,0\n22-Nov-11,371.02,377.93,370.94,376.51,14617763\n21-Nov-11,370.40,371.68,365.91,369.01,16007227\n18-Nov-11,378.92,379.99,374.88,374.94,13288395\n17-Nov-11,383.98,384.58,375.50,377.41,17147164\n16-Nov-11,389.25,391.14,384.32,384.77,12471716\n15-Nov-11,380.80,389.50,379.45,388.83,15392116\n14-Nov-11,383.52,385.25,378.20,379.26,15466501\n11-Nov-11,386.61,388.70,380.26,384.62,23349431\n10-Nov-11,397.03,397.21,382.15,385.22,26606467\n9-Nov-11,396.97,400.89,394.23,395.28,19952990\n8-Nov-11,402.21,408.00,401.56,406.23,14301406\n7-Nov-11,399.91,400.00,396.13,399.73,9652257\n4-Nov-11,402.03,403.44,399.16,400.24,10793856\n3-Nov-11,399.07,403.40,395.36,403.07,15768725\n2-Nov-11,400.09,400.44,395.11,397.41,11723381\n1-Nov-11,397.41,399.50,393.22,396.51,18992411\n31-Oct-11,402.42,409.33,401.05,404.78,13772329\n28-Oct-11,403.00,406.35,402.51,404.95,11529964\n27-Oct-11,407.56,409.00,401.89,404.69,17673331\n26-Oct-11,401.76,402.55,393.15,400.60,16296426\n25-Oct-11,405.03,406.55,397.38,397.77,15378600\n24-Oct-11,396.18,406.50,395.40,405.77,17941292\n21-Oct-11,398.10,399.14,390.75,392.87,22187216\n20-Oct-11,400.00,400.35,394.21,395.31,19626042\n19-Oct-11,401.35,408.42,397.80,398.62,39428299\n18-Oct-11,421.76,424.81,415.99,422.24,31485728\n17-Oct-11,421.74,426.70,415.94,419.99,24501528\n14-Oct-11,416.83,422.00,415.27,422.00,20477390\n13-Oct-11,404.98,408.43,402.85,408.43,15220825\n12-Oct-11,407.34,409.25,400.14,402.19,22224426\n11-Oct-11,392.57,403.18,391.50,400.29,21631495\n10-Oct-11,379.09,388.81,378.21,388.81,15804041\n7-Oct-11,375.78,377.74,368.49,369.80,19129166\n6-Oct-11,373.33,384.78,371.80,377.37,29020722\n5-Oct-11,367.86,379.82,360.30,378.25,28088194\n4-Oct-11,374.57,381.80,354.24,372.50,44059841\n3-Oct-11,380.37,382.64,373.17,374.60,23895573\n30-Sep-11,387.12,388.89,381.18,381.32,19579889\n29-Sep-11,401.92,402.21,386.21,390.57,23263021\n28-Sep-11,400.19,403.74,396.51,397.01,15351883\n27-Sep-11,408.73,409.25,398.06,399.26,22589196\n26-Sep-11,399.86,403.98,391.30,403.17,29031266\n23-Sep-11,400.28,406.74,399.85,404.30,19517230\n22-Sep-11,401.03,409.82,396.70,401.82,34588591\n21-Sep-11,419.64,421.59,412.00,412.14,21641965\n20-Sep-11,415.25,422.86,411.19,413.45,27705327\n19-Sep-11,397.00,413.23,395.20,411.63,29423540\n16-Sep-11,395.54,400.50,395.03,400.50,24946023\n15-Sep-11,391.43,393.66,389.90,392.96,14922083\n14-Sep-11,387.02,392.21,385.76,389.30,19097264\n13-Sep-11,382.14,386.21,380.25,384.62,15740641\n12-Sep-11,373.00,380.88,371.90,379.94,16708284\n9-Sep-11,383.93,386.00,375.02,377.48,20181344\n8-Sep-11,382.40,388.61,382.31,384.14,14862780\n7-Sep-11,385.56,385.60,382.00,383.93,12520542\n6-Sep-11,367.37,380.33,366.48,379.74,18203447\n2-Sep-11,374.74,378.00,371.83,374.05,15684502\n1-Sep-11,385.82,387.34,380.72,381.03,12275815\n31-Aug-11,390.57,392.08,381.86,384.83,18669842\n30-Aug-11,388.25,391.84,386.21,389.99,14925752\n29-Aug-11,388.18,391.50,388.00,389.97,14473307\n26-Aug-11,371.17,383.80,370.80,383.58,22909823\n25-Aug-11,365.08,375.45,365.00,373.72,31117868\n24-Aug-11,373.47,378.96,370.60,376.18,22366701\n23-Aug-11,360.30,373.64,357.00,373.60,23458368\n22-Aug-11,364.51,364.88,355.09,356.44,19118030\n19-Aug-11,362.17,367.00,356.00,356.03,27710078\n18-Aug-11,370.84,372.65,361.37,366.05,30408327\n17-Aug-11,382.31,384.52,378.00,380.44,15787849\n16-Aug-11,381.52,383.37,376.06,380.48,17817446\n15-Aug-11,379.63,384.97,378.09,383.41,16447924\n12-Aug-11,378.02,379.64,374.23,376.99,18891915\n11-Aug-11,370.52,375.45,364.72,373.70,26498730\n10-Aug-11,371.15,374.65,362.50,363.69,31380328\n9-Aug-11,0.00,374.61,355.00,374.01,38663672\n8-Aug-11,361.69,367.77,353.02,353.21,40850172\n5-Aug-11,380.44,383.50,362.57,373.62,43020050\n4-Aug-11,389.41,391.32,377.35,377.37,31121632\n3-Aug-11,388.22,393.55,382.24,392.57,26160828\n2-Aug-11,397.65,397.90,388.35,388.91,22840680\n1-Aug-11,397.78,399.50,392.37,396.75,21886851\n29-Jul-11,387.64,395.15,384.00,390.48,22592270\n28-Jul-11,391.62,396.99,388.13,391.82,21215156\n27-Jul-11,400.59,402.64,392.15,392.59,23547210\n26-Jul-11,400.00,404.50,399.68,403.41,17020718\n25-Jul-11,390.35,400.00,389.62,398.50,21064442\n22-Jul-11,388.32,395.05,387.75,393.30,18454555\n21-Jul-11,386.95,390.06,383.90,387.29,18804148\n20-Jul-11,396.12,396.27,386.00,386.90,33618816\n19-Jul-11,378.00,378.65,373.32,376.85,29255192\n18-Jul-11,365.43,374.65,365.28,373.80,20451089\n15-Jul-11,361.17,365.00,359.17,364.92,17302334\n14-Jul-11,361.01,361.61,356.34,357.77,15376165\n13-Jul-11,358.33,360.00,356.38,358.02,13987074\n12-Jul-11,353.53,357.68,348.62,353.75,16128813\n11-Jul-11,356.34,359.77,352.82,354.00,15816282\n8-Jul-11,353.34,360.00,352.20,359.71,17497377\n7-Jul-11,354.67,358.00,354.00,357.20,14273617\n6-Jul-11,348.95,354.10,346.71,351.76,15879463\n5-Jul-11,343.00,349.83,342.50,349.43,12688374\n1-Jul-11,343.26,343.26,343.26,343.26,0\n30-Jun-11,334.70,336.13,332.84,335.67,11543913\n29-Jun-11,336.04,336.37,331.88,334.04,12597010\n28-Jun-11,333.65,336.70,333.44,335.26,10510701\n27-Jun-11,327.59,333.90,327.25,332.04,12141419\n24-Jun-11,331.37,333.15,325.09,326.35,15711616\n23-Jun-11,318.94,331.69,318.12,331.23,19991322\n22-Jun-11,325.16,328.90,322.38,322.61,13949348\n21-Jun-11,316.68,325.80,315.20,325.30,17620502\n20-Jun-11,317.36,317.70,310.50,315.32,22880182\n17-Jun-11,328.99,329.25,319.36,320.26,21981807\n16-Jun-11,326.90,328.68,318.33,325.16,18235334\n15-Jun-11,329.75,330.30,324.88,326.75,14264555\n14-Jun-11,330.00,333.25,329.31,332.44,11948843\n13-Jun-11,327.20,328.31,325.07,326.60,11773444\n10-Jun-11,330.55,331.66,325.51,325.90,15504200\n9-Jun-11,333.25,333.67,330.75,331.49,9834457\n8-Jun-11,331.78,334.80,330.65,332.24,11924511\n7-Jun-11,338.17,338.22,331.90,332.04,18927580\n6-Jun-11,345.96,347.05,337.81,338.04,16497811\n3-Jun-11,343.18,345.33,342.01,343.44,11194395\n2-Jun-11,346.50,347.98,344.30,346.10,12103016\n1-Jun-11,348.87,352.13,344.65,345.51,19810086\n31-May-11,341.10,347.83,341.00,347.83,14919162\n27-May-11,337.41,337.41,337.41,337.41,0\n26-May-11,335.97,336.89,334.44,335.00,7953393\n25-May-11,333.43,338.56,332.85,336.78,10507919\n24-May-11,335.50,335.90,331.34,332.19,11502950\n23-May-11,329.97,335.98,329.42,334.40,13661031\n20-May-11,339.56,340.95,335.02,335.22,12078244\n19-May-11,342.08,342.41,338.67,340.53,9327330\n18-May-11,336.47,341.05,336.00,339.87,11956181\n17-May-11,332.00,336.14,330.73,336.14,16170951\n16-May-11,339.20,341.22,332.60,333.30,16076482\n13-May-11,345.66,346.25,340.35,340.50,11649708\n12-May-11,346.12,347.12,342.27,346.57,11462799\n11-May-11,349.02,350.00,345.24,347.23,12002669\n10-May-11,348.89,349.69,346.66,349.45,10074567\n9-May-11,347.86,349.20,346.53,347.60,7312593\n6-May-11,349.69,350.00,346.21,346.66,10008755\n5-May-11,348.40,350.95,346.05,346.75,12009336\n4-May-11,348.26,351.83,321.87,349.57,13901747\n3-May-11,347.99,349.89,345.62,348.20,11198607\n2-May-11,349.74,350.47,345.50,346.28,15811178\n29-Apr-11,346.78,353.95,346.67,350.13,35940847\n28-Apr-11,346.19,349.75,345.52,346.75,12899589\n27-Apr-11,352.24,352.35,347.10,350.15,12721841\n26-Apr-11,353.62,354.99,349.35,350.42,12057235\n25-Apr-11,350.34,353.75,350.30,353.01,9519470\n21-Apr-11,350.70,350.70,350.70,350.70,0\n20-Apr-11,343.51,345.75,341.50,342.41,25023406\n19-Apr-11,333.10,337.98,331.71,337.86,14977749\n18-Apr-11,326.10,332.23,320.16,331.85,21782061\n15-Apr-11,333.30,333.64,326.80,327.46,16208321\n14-Apr-11,334.80,336.00,332.06,332.42,10785343\n13-Apr-11,335.02,336.14,332.52,336.13,12372709\n12-Apr-11,330.49,333.73,330.20,332.40,15232440\n11-Apr-11,334.06,335.67,330.02,330.80,14255374\n8-Apr-11,339.92,340.15,333.95,335.06,13483331\n7-Apr-11,338.10,340.43,336.03,338.08,13337360\n6-Apr-11,341.22,343.90,337.14,338.04,14376383\n5-Apr-11,336.99,342.25,336.00,338.89,17248687\n4-Apr-11,344.31,344.60,338.40,341.19,16431506\n1-Apr-11,351.11,351.59,343.30,344.56,14952200\n31-Mar-11,346.36,349.80,346.06,348.51,9798858\n30-Mar-11,350.64,350.88,347.44,348.63,11764467\n29-Mar-11,347.66,350.96,346.06,350.96,12603565\n28-Mar-11,353.15,354.32,350.44,350.44,11048201\n25-Mar-11,348.07,352.06,347.02,351.54,16041828\n24-Mar-11,341.85,346.00,338.86,344.97,14453960\n23-Mar-11,339.28,340.22,335.95,339.19,13321214\n22-Mar-11,342.56,342.62,339.14,341.20,11651166\n21-Mar-11,335.99,339.74,335.26,339.30,14621080\n18-Mar-11,337.13,338.20,330.00,330.67,26900372\n17-Mar-11,336.83,339.61,330.66,334.64,23550711\n16-Mar-11,342.00,343.00,326.26,330.01,41312518\n15-Mar-11,342.10,347.84,340.10,345.43,25735619\n14-Mar-11,353.18,356.48,351.31,353.56,15587670\n11-Mar-11,345.33,352.32,345.00,351.99,16824288\n10-Mar-11,349.12,349.77,344.90,346.67,18138865\n9-Mar-11,354.69,354.76,350.60,352.47,16192719\n8-Mar-11,354.91,357.40,352.25,355.76,12725565\n7-Mar-11,361.40,361.67,351.31,355.36,19504307\n4-Mar-11,360.07,360.29,357.75,360.00,16188069\n3-Mar-11,357.19,359.79,355.92,359.56,17885252\n2-Mar-11,349.96,354.35,348.40,352.12,21521027\n1-Mar-11,355.47,355.72,347.68,349.31,16290309\n28-Feb-11,351.24,355.05,351.12,353.21,14395497\n25-Feb-11,345.26,348.43,344.80,348.16,13572069\n24-Feb-11,344.02,345.15,338.37,342.88,17853502\n23-Feb-11,338.77,344.64,338.61,342.62,23994706\n22-Feb-11,342.15,345.40,337.72,338.61,31162223\n18-Feb-11,350.56,350.56,350.56,350.56,0\n17-Feb-11,357.25,360.27,356.52,358.30,18949072\n16-Feb-11,360.80,364.90,360.50,363.13,17184119\n15-Feb-11,359.19,359.97,357.55,359.90,10149063\n14-Feb-11,356.79,359.48,356.71,359.18,11086213\n11-Feb-11,354.75,357.80,353.54,356.85,13127564\n10-Feb-11,357.39,360.00,348.00,354.54,33162480\n9-Feb-11,355.19,359.00,354.87,358.16,17240870\n8-Feb-11,353.68,355.52,352.15,355.20,13608558\n7-Feb-11,347.89,353.25,347.64,351.88,17322130\n4-Feb-11,343.64,346.70,343.51,346.50,11494225\n3-Feb-11,343.80,344.24,338.55,343.44,14064164\n2-Feb-11,344.45,345.25,343.55,344.32,9248401\n1-Feb-11,341.30,345.65,340.98,345.03,15236849\n31-Jan-11,335.80,340.04,334.30,339.32,13473086\n28-Jan-11,344.17,344.40,333.53,336.10,21144878\n27-Jan-11,343.78,344.69,342.83,343.21,10179423\n26-Jan-11,342.96,345.60,341.50,343.85,18102397\n25-Jan-11,336.33,341.44,334.57,341.40,19530950\n24-Jan-11,326.87,337.45,326.72,337.45,20524364\n21-Jan-11,333.77,334.88,326.63,326.72,26942816\n20-Jan-11,336.43,338.30,330.12,332.68,27313899\n19-Jan-11,348.35,348.60,336.88,338.84,40557457\n18-Jan-11,329.52,344.76,326.00,340.65,67178100\n14-Jan-11,348.48,348.48,348.48,348.48,0\n13-Jan-11,345.16,346.64,343.85,345.68,10648026\n12-Jan-11,343.25,344.43,342.00,344.42,10806330\n11-Jan-11,344.88,344.96,339.47,341.64,15859999\n10-Jan-11,338.83,343.23,337.17,342.46,16019926\n7-Jan-11,333.99,336.35,331.90,336.12,11140316\n6-Jan-11,334.72,335.25,332.90,333.73,10729518\n5-Jan-11,329.55,334.34,329.50,334.00,9125599\n4-Jan-11,332.44,332.50,328.15,331.29,11048143\n3-Jan-11,325.64,330.26,324.84,329.57,15897201\n31-Dec-10,322.95,323.48,321.31,322.56,6916261\n30-Dec-10,325.48,325.51,323.05,323.66,5630713\n29-Dec-10,326.22,326.45,325.10,325.29,5831096\n28-Dec-10,325.91,326.66,325.06,325.47,6282971\n27-Dec-10,322.85,325.44,321.52,324.68,8921957\n23-Dec-10,323.60,323.60,323.60,323.60,0\n22-Dec-10,324.36,325.72,323.55,325.16,9505147\n21-Dec-10,323.00,324.39,322.05,324.20,9155412\n20-Dec-10,321.60,323.25,318.23,322.21,13771742\n17-Dec-10,321.63,321.79,320.23,320.61,13826724\n16-Dec-10,321.09,322.61,320.10,321.25,11501014\n15-Dec-10,320.00,323.00,319.19,320.36,14903902\n14-Dec-10,321.73,322.54,319.00,320.29,12555966\n13-Dec-10,324.37,325.06,321.00,321.67,15707619\n10-Dec-10,319.65,321.05,318.60,320.56,9377749\n9-Dec-10,322.13,322.50,319.02,319.76,10505218\n8-Dec-10,319.63,321.02,317.11,321.01,11497643\n7-Dec-10,323.80,323.99,318.12,318.21,13980495\n6-Dec-10,318.64,322.33,318.42,320.15,16017161\n3-Dec-10,317.01,318.65,316.34,317.44,12227469\n2-Dec-10,317.53,319.00,314.89,318.15,16558988\n1-Dec-10,315.27,317.75,315.00,316.40,16491096\n30-Nov-10,313.54,314.36,310.87,311.15,17923329\n29-Nov-10,315.50,317.48,311.38,316.87,15919985\n26-Nov-10,313.74,317.70,312.94,315.00,8490891\n24-Nov-10,314.80,314.80,314.80,314.80,0\n23-Nov-10,310.45,311.75,306.56,308.73,18551612\n22-Nov-10,306.68,313.36,305.87,313.36,14038356\n19-Nov-10,307.97,308.40,305.24,306.73,13744399\n18-Nov-10,305.20,309.67,304.69,308.43,17660349\n17-Nov-10,301.20,303.99,297.76,300.50,17123201\n16-Nov-10,305.72,307.60,299.32,301.59,23533906\n15-Nov-10,308.46,310.54,306.27,307.04,14414422\n12-Nov-10,316.00,316.50,303.63,308.03,28423066\n11-Nov-10,315.00,318.40,314.25,316.66,12902919\n10-Nov-10,316.64,318.77,313.55,318.03,13722339\n9-Nov-10,321.05,321.30,314.50,316.08,13704115\n8-Nov-10,319.36,319.77,316.76,318.62,10061901\n5-Nov-10,317.99,319.57,316.75,317.13,12901895\n4-Nov-10,315.45,320.18,315.03,318.27,22945997\n3-Nov-10,311.37,312.88,308.53,312.80,18155264\n2-Nov-10,307.00,310.19,307.00,309.36,15497491\n1-Nov-10,302.22,305.60,302.20,304.18,15138893\n29-Oct-10,304.23,305.88,300.87,300.98,15375304\n28-Oct-10,307.95,308.00,300.90,305.24,19680220\n27-Oct-10,307.65,309.90,305.60,307.83,14250010\n26-Oct-10,306.87,309.74,305.65,308.05,14033191\n25-Oct-10,309.09,311.60,308.44,308.84,14015428\n22-Oct-10,309.07,310.04,306.30,307.47,13313408\n21-Oct-10,312.36,314.74,306.80,309.52,19694903\n20-Oct-10,309.00,314.25,306.87,310.53,25772290\n19-Oct-10,303.40,313.77,300.02,309.49,44027119\n18-Oct-10,318.47,319.00,314.29,318.00,39444913\n15-Oct-10,307.44,315.00,304.91,314.74,32935492\n14-Oct-10,301.69,302.47,300.40,302.31,15546275\n13-Oct-10,300.20,301.96,299.80,300.14,22503227\n12-Oct-10,295.41,299.50,292.49,298.54,19947809\n11-Oct-10,294.74,297.24,294.60,295.36,15276819\n8-Oct-10,291.71,294.50,290.00,294.07,23514402\n7-Oct-10,290.34,290.48,286.91,289.22,14585611\n6-Oct-10,289.59,291.99,285.26,289.19,23959502\n5-Oct-10,282.00,289.45,281.82,288.94,17927350\n4-Oct-10,281.60,282.90,277.77,278.64,15546424\n1-Oct-10,286.15,286.58,281.35,282.52,16014492\n30-Sep-10,289.00,290.00,281.25,283.75,24049636\n29-Sep-10,287.23,289.81,286.00,287.37,16772944\n28-Sep-10,291.77,291.77,275.00,286.86,36965773\n27-Sep-10,293.98,294.73,291.01,291.16,17253559\n24-Sep-10,292.10,293.53,290.55,292.32,23195972\n23-Sep-10,286.33,292.76,286.00,288.92,28075553\n22-Sep-10,282.71,287.98,282.41,287.75,20907682\n21-Sep-10,283.86,287.35,282.79,283.77,23916983\n20-Sep-10,276.08,283.78,275.85,283.23,23546119\n17-Sep-10,277.69,277.96,273.68,275.37,22659813\n16-Sep-10,270.24,276.67,269.50,276.57,23289341\n15-Sep-10,268.17,270.38,267.84,270.22,15334510\n14-Sep-10,266.21,269.17,265.52,268.06,14576759\n13-Sep-10,265.82,268.28,265.76,267.04,13884995\n10-Sep-10,263.19,264.50,261.40,263.41,13848617\n9-Sep-10,265.04,266.52,262.92,263.07,15663371\n8-Sep-10,259.78,264.39,259.10,262.92,18805302\n7-Sep-10,256.64,259.53,256.25,257.81,12243759\n6-Sep-10,258.77,258.77,258.77,258.77,0\n3-Sep-10,258.77,258.77,258.77,258.77,0\n2-Sep-10,251.26,252.17,248.57,252.17,14836614\n1-Sep-10,247.47,251.46,246.28,250.33,24894115\n31-Aug-10,241.85,244.56,240.35,243.10,15028086\n30-Aug-10,240.76,245.75,240.69,242.50,13688842\n27-Aug-10,241.75,241.76,240.20,241.62,19592368\n26-Aug-10,245.45,245.75,240.28,240.28,16660829\n25-Aug-10,238.04,243.99,237.41,242.89,21316604\n24-Aug-10,242.67,243.00,240.11,239.93,21519744\n23-Aug-10,251.79,252.00,245.25,245.80,14788116\n20-Aug-10,249.39,253.92,249.00,249.64,13722458\n19-Aug-10,252.84,253.48,248.68,249.88,15239461\n18-Aug-10,252.36,254.67,251.58,253.07,12131989\n17-Aug-10,250.08,254.63,250.00,251.97,15094603\n16-Aug-10,247.58,250.01,246.62,247.64,11372407\n13-Aug-10,251.65,251.65,249.09,249.10,12673805\n12-Aug-10,246.69,253.10,246.60,251.79,19104262\n11-Aug-10,255.40,255.69,249.81,250.19,22144724\n10-Aug-10,259.85,260.45,257.55,259.41,16139915\n9-Aug-10,261.48,262.15,259.57,261.75,10825908\n6-Aug-10,259.78,261.49,257.63,260.09,15893330\n5-Aug-10,261.73,263.18,260.55,261.70,10334374\n4-Aug-10,262.84,264.28,260.31,262.98,15019868\n3-Aug-10,261.01,263.26,259.42,261.93,14916174\n2-Aug-10,260.44,262.59,259.62,261.85,15288718\n30-Jul-10,255.89,259.70,254.90,257.25,16016280\n29-Jul-10,260.71,262.65,256.10,258.11,22993055\n28-Jul-10,263.67,265.99,260.25,260.96,18570870\n27-Jul-10,260.87,264.80,260.30,264.08,20884663\n26-Jul-10,260.00,260.10,257.71,259.28,15019636\n23-Jul-10,257.09,260.38,256.28,259.94,19049523\n22-Jul-10,257.68,260.00,255.31,259.02,23047046\n21-Jul-10,265.09,265.15,254.00,254.24,42345346\n20-Jul-10,242.90,252.90,240.01,251.89,38391073\n19-Jul-10,249.88,249.88,239.60,245.58,36589212\n16-Jul-10,253.18,254.97,248.41,249.90,37137768\n15-Jul-10,248.23,256.97,247.30,251.45,29459407\n14-Jul-10,249.38,255.80,249.00,252.73,29006112\n13-Jul-10,256.32,256.40,246.43,251.80,42534094\n12-Jul-10,258.53,261.85,254.86,257.28,20102748\n9-Jul-10,256.89,259.90,255.16,259.62,15484791\n8-Jul-10,262.48,262.90,254.89,258.09,26362523\n7-Jul-10,250.49,258.77,249.75,258.66,23377116\n6-Jul-10,251.00,252.80,246.16,248.63,21972668\n5-Jul-10,246.94,246.94,246.94,246.94,0\n2-Jul-10,246.94,246.94,246.94,246.94,0\n1-Jul-10,254.30,254.80,243.22,248.48,36534020\n30-Jun-10,256.71,257.97,250.01,251.53,26409580\n29-Jun-10,264.12,264.39,254.30,256.17,40476590\n28-Jun-10,266.93,269.75,264.52,268.30,20908322\n25-Jun-10,270.06,270.27,265.81,266.70,19640753\n24-Jun-10,271.00,273.20,268.10,269.00,25540402\n23-Jun-10,274.58,274.66,267.90,270.97,27444819\n22-Jun-10,272.16,275.97,271.50,273.85,25616428\n21-Jun-10,277.69,279.01,268.73,270.17,27731779\n18-Jun-10,272.25,275.00,271.42,274.07,28022135\n17-Jun-10,270.60,272.90,269.50,271.87,31195033\n16-Jun-10,261.10,267.75,260.63,267.25,27988910\n15-Jun-10,255.64,259.85,255.50,259.69,20895471\n14-Jun-10,255.96,259.15,254.01,254.28,21534300\n11-Jun-10,248.22,253.86,247.37,253.51,19491412\n10-Jun-10,244.84,250.98,242.20,250.51,27726991\n9-Jun-10,251.47,251.90,242.49,243.20,30522453\n8-Jun-10,253.24,253.80,245.65,249.33,35741717\n7-Jun-10,258.29,259.15,250.55,250.94,31677934\n4-Jun-10,258.21,261.90,254.63,255.96,27087206\n3-Jun-10,265.18,265.55,260.41,263.12,23219902\n2-Jun-10,264.54,264.80,260.34,263.95,24590932\n1-Jun-10,259.69,265.94,258.96,260.83,31302626\n31-May-10,256.88,256.88,256.88,256.88,0\n28-May-10,256.88,256.88,256.88,256.88,0\n27-May-10,250.60,253.89,249.11,253.35,23796477\n26-May-10,250.08,252.13,243.75,244.11,30380592\n25-May-10,239.35,246.76,237.16,245.22,37429051\n24-May-10,247.28,250.90,246.26,246.76,26937337\n21-May-10,232.82,244.50,231.35,242.32,43710965\n20-May-10,241.88,243.85,236.21,237.76,45818391\n19-May-10,249.50,252.92,244.85,248.34,36633058\n18-May-10,256.98,258.55,250.26,252.36,27952708\n17-May-10,254.70,256.18,247.71,254.22,27244036\n14-May-10,255.16,256.48,249.50,253.82,27120051\n13-May-10,263.22,265.00,256.40,258.36,21418218\n12-May-10,259.24,263.13,258.70,262.09,23370625\n11-May-10,251.84,259.89,250.50,256.52,30369687\n10-May-10,250.25,254.65,248.53,253.99,35153744\n7-May-10,243.71,246.57,225.21,235.86,59857756\n6-May-10,253.83,258.25,199.25,246.25,45923556\n5-May-10,253.03,258.14,248.73,255.98,31539398\n4-May-10,263.03,263.29,256.75,258.68,25850690\n3-May-10,263.84,267.88,262.88,266.35,16226433\n30-Apr-10,269.31,270.57,261.00,261.09,19373668\n29-Apr-10,263.02,270.00,262.01,268.64,19958535\n28-Apr-10,263.25,264.00,256.41,261.60,27085710\n27-Apr-10,267.27,267.84,260.52,262.04,25333632\n26-Apr-10,271.88,272.46,268.19,269.50,17109573\n23-Apr-10,267.99,272.18,267.00,270.83,28462622\n22-Apr-10,258.24,266.75,256.20,266.47,28336545\n21-Apr-10,258.80,260.25,255.73,259.22,35085400\n20-Apr-10,248.54,249.25,242.96,244.59,26368711\n19-Apr-10,247.03,247.89,241.77,247.07,20247213\n16-Apr-10,248.57,251.14,244.55,247.40,26805138\n15-Apr-10,245.78,249.03,245.51,248.92,13456560\n14-Apr-10,245.28,245.81,244.07,245.69,14431222\n13-Apr-10,241.86,242.80,241.11,242.43,10936075\n12-Apr-10,242.20,243.07,241.81,242.29,11900548\n9-Apr-10,241.43,241.89,240.46,241.79,11935092\n8-Apr-10,240.44,241.54,238.04,239.95,20463803\n7-Apr-10,239.72,241.92,238.66,240.60,22446433\n6-Apr-10,238.20,240.24,237.00,239.54,15964884\n5-Apr-10,234.98,238.51,234.77,238.49,24446617\n2-Apr-10,235.97,235.97,235.97,235.97,0\n1-Apr-10,235.97,235.97,235.97,235.97,0\n31-Mar-10,235.49,236.61,234.46,235.00,15380651\n30-Mar-10,236.60,237.48,234.25,235.84,18832475\n29-Mar-10,233.00,233.87,231.62,232.39,19312255\n26-Mar-10,228.95,231.95,228.55,230.90,22888305\n25-Mar-10,230.92,230.97,226.25,226.65,19402382\n24-Mar-10,227.64,230.20,227.51,229.37,21367176\n23-Mar-10,225.64,228.78,224.10,228.36,21515311\n22-Mar-10,220.47,226.00,220.15,224.75,16300662\n19-Mar-10,224.79,225.24,221.23,222.25,19980164\n18-Mar-10,224.10,225.00,222.61,224.65,12218159\n17-Mar-10,224.90,226.45,223.27,224.12,16105571\n16-Mar-10,224.18,224.98,222.51,224.45,15960948\n15-Mar-10,225.38,225.50,220.25,223.84,17625013\n12-Mar-10,227.37,227.73,225.75,226.60,14868660\n11-Mar-10,223.91,225.50,223.32,225.50,14489234\n10-Mar-10,223.83,225.48,223.20,224.84,21293449\n9-Mar-10,218.31,225.00,217.89,223.02,32866380\n8-Mar-10,220.01,220.09,218.25,219.08,15353177\n5-Mar-10,214.94,219.70,214.63,218.95,32129229\n4-Mar-10,209.28,210.92,208.63,210.71,13072848\n3-Mar-10,208.94,209.87,207.94,209.33,13294242\n2-Mar-10,209.93,210.83,207.74,208.85,20233736\n1-Mar-10,205.75,209.50,205.45,208.99,19646169\n26-Feb-10,202.38,205.17,202.00,204.62,18123580\n25-Feb-10,197.38,202.86,196.89,202.00,23764153\n24-Feb-10,198.23,201.44,197.84,200.66,16448768\n23-Feb-10,200.00,201.33,195.71,197.06,20546889\n22-Feb-10,202.34,202.50,199.19,200.42,13958024\n19-Feb-10,201.86,203.20,201.11,201.67,14847638\n18-Feb-10,201.63,203.89,200.92,202.93,15100873\n17-Feb-10,204.19,204.31,200.86,202.55,15585530\n16-Feb-10,201.94,203.69,201.52,203.40,19426823\n15-Feb-10,200.38,200.38,200.38,200.38,0\n12-Feb-10,200.38,200.38,200.38,200.38,0\n11-Feb-10,194.88,199.75,194.06,198.67,19655129\n10-Feb-10,195.89,196.60,194.26,195.12,13227174\n9-Feb-10,196.42,197.50,194.75,196.19,22603004\n8-Feb-10,195.69,197.88,194.00,194.12,17081017\n5-Feb-10,192.62,196.00,190.85,195.46,30368050\n4-Feb-10,196.73,198.37,191.57,192.05,27058966\n3-Feb-10,195.17,200.20,194.42,199.23,21975967\n2-Feb-10,195.91,196.32,193.38,195.86,24940759\n1-Feb-10,192.37,196.00,191.30,194.73,26781203\n29-Jan-10,201.08,202.20,190.25,192.06,44498255\n28-Jan-10,204.93,205.50,198.70,199.29,41910768\n27-Jan-10,206.85,210.58,199.53,207.88,61520290\n26-Jan-10,205.95,213.71,202.58,205.94,66682498\n25-Jan-10,202.51,204.70,200.19,203.08,38060686\n22-Jan-10,206.78,207.50,197.16,197.75,31491696\n21-Jan-10,212.08,213.31,207.21,208.07,21719795\n20-Jan-10,214.91,215.55,209.50,211.72,21862556\n19-Jan-10,208.33,215.19,207.24,215.04,26071660\n18-Jan-10,205.93,205.93,205.93,205.93,0\n15-Jan-10,205.93,205.93,205.93,205.93,0\n14-Jan-10,210.11,210.46,209.02,209.43,15469773\n13-Jan-10,207.87,210.93,204.10,210.65,21638905\n12-Jan-10,209.19,209.77,206.42,207.72,21230682\n11-Jan-10,212.80,213.00,208.45,210.11,16508195\n8-Jan-10,210.30,212.00,209.06,211.98,15995583\n7-Jan-10,211.75,212.00,209.05,210.58,17040332\n6-Jan-10,214.38,215.23,210.75,210.97,19719942\n5-Jan-10,214.60,215.59,213.25,214.38,21496572\n4-Jan-10,213.43,214.50,212.38,214.01,17633150\n1-Jan-10,210.73,210.73,210.73,210.73,0\n31-Dec-09,210.73,210.73,210.73,210.73,0\n30-Dec-09,208.83,212.00,208.31,211.64,14717244\n29-Dec-09,212.63,212.72,208.73,209.10,15900153\n28-Dec-09,211.72,213.95,209.61,211.61,23020150\n25-Dec-09,209.04,209.04,209.04,209.04,0\n24-Dec-09,203.55,209.35,203.35,209.04,17888855\n23-Dec-09,201.25,202.38,200.81,202.10,12340141\n22-Dec-09,199.44,200.85,198.66,200.36,12482649\n21-Dec-09,196.05,199.75,195.67,198.23,21870444\n18-Dec-09,193.17,195.50,192.60,195.43,21741788\n17-Dec-09,194.26,195.00,191.00,191.86,13887008\n16-Dec-09,195.10,196.50,194.55,195.03,12611382\n15-Dec-09,195.83,197.51,193.27,194.17,14989779\n14-Dec-09,195.37,197.43,192.56,196.98,17706732\n11-Dec-09,197.78,198.00,193.43,194.67,15349054\n10-Dec-09,199.50,199.70,196.12,196.43,17488165\n9-Dec-09,191.28,198.16,190.31,197.80,24456455\n8-Dec-09,189.36,192.35,188.70,189.87,24657040\n7-Dec-09,193.32,193.77,188.68,188.95,25527094\n4-Dec-09,199.70,199.88,190.28,193.32,29539524\n3-Dec-09,197.42,198.98,196.27,196.48,16025654\n2-Dec-09,198.96,201.42,195.75,196.23,25544958\n1-Dec-09,202.24,202.77,196.83,196.97,16634369\n30-Nov-09,201.11,201.68,198.77,199.91,15173418\n27-Nov-09,199.22,202.96,198.37,200.59,10544892\n26-Nov-09,204.19,204.19,204.19,204.19,0\n25-Nov-09,205.40,205.65,203.76,204.19,10237473\n24-Nov-09,205.33,205.88,202.90,204.44,11372742\n23-Nov-09,203.00,206.00,202.95,205.88,16970533\n20-Nov-09,199.15,200.39,197.76,199.92,14531795\n19-Nov-09,204.61,204.61,199.80,200.51,19368789\n18-Nov-09,206.54,207.00,204.00,205.96,13368552\n17-Nov-09,206.08,207.44,205.00,207.00,14161152\n16-Nov-09,205.48,208.00,205.01,206.63,17328717\n13-Nov-09,202.87,204.83,202.07,204.45,12261823\n12-Nov-09,203.14,204.87,201.43,201.99,12996979\n11-Nov-09,204.56,205.00,201.83,203.25,15859930\n10-Nov-09,201.02,204.98,201.01,202.98,14328340\n9-Nov-09,196.94,201.90,196.26,201.46,18887669\n6-Nov-09,192.51,195.19,192.40,194.34,10543909\n5-Nov-09,192.40,195.00,191.82,194.03,13747257\n4-Nov-09,190.73,193.85,190.23,190.81,17419357\n3-Nov-09,187.85,189.52,185.92,188.75,18662202\n2-Nov-09,189.80,192.88,185.57,189.31,24271033\n30-Oct-09,196.06,196.80,186.07,188.50,25625842\n29-Oct-09,195.00,196.81,192.14,196.35,20371723\n28-Oct-09,197.71,198.02,191.10,192.40,29228031\n27-Oct-09,201.66,202.81,196.45,197.37,27019639\n26-Oct-09,203.67,206.75,200.10,202.48,17297769\n23-Oct-09,205.70,205.80,203.23,203.94,15028062\n22-Oct-09,204.70,207.85,202.51,205.20,28263975\n21-Oct-09,199.52,208.71,199.23,204.92,42633075\n20-Oct-09,200.60,201.75,197.85,198.76,40751402\n19-Oct-09,187.85,190.00,185.55,189.86,33651048\n16-Oct-09,189.35,190.36,187.84,188.05,15408027\n15-Oct-09,189.63,190.92,189.53,190.56,13341246\n14-Oct-09,192.25,192.32,190.23,191.29,13420377\n13-Oct-09,190.63,191.17,189.70,190.02,12429226\n12-Oct-09,191.02,191.51,189.64,190.81,10291108\n9-Oct-09,188.97,190.70,188.62,190.47,10478335\n8-Oct-09,190.66,191.45,188.89,189.27,15650328\n7-Oct-09,189.76,190.55,189.03,190.25,16630987\n6-Oct-09,187.74,190.01,187.30,190.01,21610125\n5-Oct-09,186.20,186.86,184.27,186.02,15111866\n2-Oct-09,181.41,185.94,181.35,184.90,19765524\n1-Oct-09,185.35,186.22,180.70,180.86,18739677\n30-Sep-09,186.13,186.45,182.61,185.35,19270805\n29-Sep-09,186.73,187.40,184.31,185.38,12335197\n28-Sep-09,183.87,186.68,183.33,186.15,12058857\n25-Sep-09,182.01,185.50,181.44,182.37,15910266\n24-Sep-09,187.20,187.70,182.77,183.82,19674213\n23-Sep-09,185.40,188.90,185.03,185.50,21109053\n22-Sep-09,185.19,185.38,182.85,184.48,12748713\n21-Sep-09,184.29,185.16,181.62,184.02,15632701\n18-Sep-09,185.83,186.55,184.76,185.02,21490980\n17-Sep-09,181.98,186.79,181.97,184.55,28948952\n16-Sep-09,177.99,182.75,177.88,181.87,26929357\n15-Sep-09,174.04,175.65,173.59,175.16,15231079\n14-Sep-09,170.83,173.90,170.25,173.72,11500373\n11-Sep-09,172.91,173.18,170.87,172.16,12462884\n10-Sep-09,172.06,173.25,170.81,172.56,17540478\n9-Sep-09,172.78,174.47,169.70,171.14,28974698\n8-Sep-09,172.98,173.14,172.00,172.93,11251661\n4-Sep-09,167.28,170.70,167.09,170.31,13379522\n3-Sep-09,166.44,167.10,165.00,166.55,10503673\n2-Sep-09,164.62,167.61,164.11,165.18,13014301\n1-Sep-09,167.99,170.00,164.94,165.30,16750905\n31-Aug-09,168.16,168.85,166.50,168.21,11126441\n28-Aug-09,172.27,172.49,168.53,170.05,16209204\n27-Aug-09,168.75,169.57,164.83,169.45,16042118\n26-Aug-09,168.92,169.55,166.76,167.41,10857067\n25-Aug-09,169.46,170.94,169.13,169.40,11584049\n24-Aug-09,170.12,170.71,168.27,169.06,14533168\n21-Aug-09,167.65,169.37,166.80,169.22,14859756\n20-Aug-09,164.98,166.72,164.61,166.33,12221390\n19-Aug-09,162.75,165.30,162.45,164.60,14759695\n18-Aug-09,161.63,164.24,161.41,164.00,15398221\n17-Aug-09,163.55,163.59,159.42,159.59,18727893\n14-Aug-09,167.94,168.23,165.53,166.78,10930325\n13-Aug-09,166.65,168.67,166.50,168.42,15720085\n12-Aug-09,162.55,166.71,162.46,165.31,15895377\n10-Aug-09,165.66,166.60,163.66,164.72,10729827\n7-Aug-09,165.49,166.60,164.80,165.51,13838704\n6-Aug-09,165.58,166.51,163.09,163.91,12206233\n5-Aug-09,165.75,167.39,164.21,165.11,15113619\n4-Aug-09,164.93,165.57,164.21,165.55,14136053\n3-Aug-09,165.21,166.64,164.87,166.43,14079982\n31-Jul-09,162.99,165.00,162.91,163.39,15096136\n30-Jul-09,161.70,164.72,161.50,162.79,16771544\n29-Jul-09,158.90,160.45,158.25,160.03,13658150\n28-Jul-09,158.88,160.10,157.60,160.00,12984019\n27-Jul-09,160.17,160.88,157.26,160.10,15475401\n24-Jul-09,156.95,160.00,156.50,159.99,15655702\n23-Jul-09,156.63,158.44,155.56,157.82,18820054\n22-Jul-09,157.79,158.73,156.11,156.74,31217976\n21-Jul-09,153.29,153.43,149.75,151.51,31242187\n20-Jul-09,153.27,155.04,150.89,152.91,26268741\n17-Jul-09,149.08,152.02,148.63,151.75,21505493\n16-Jul-09,145.76,148.02,145.57,147.52,14056023\n15-Jul-09,145.04,147.00,144.32,146.88,17342302\n14-Jul-09,142.03,143.18,141.16,142.27,12410774\n13-Jul-09,139.54,142.34,137.53,142.34,17277642\n10-Jul-09,136.34,138.97,136.32,138.52,15902608\n9-Jul-09,137.76,137.99,135.93,136.36,12255205\n8-Jul-09,135.92,138.04,134.42,137.22,20568864\n7-Jul-09,138.48,139.68,135.18,135.40,16492156\n6-Jul-09,138.70,138.99,136.25,138.61,17810219\n3-Jul-09,140.02,140.02,140.02,140.02,0\n2-Jul-09,141.25,142.83,139.79,140.02,13236264\n1-Jul-09,143.50,144.66,142.52,142.83,14795450\n30-Jun-09,142.58,143.80,141.80,142.43,15508920\n29-Jun-09,143.46,143.95,141.54,141.97,20273642\n26-Jun-09,139.79,143.56,139.74,142.44,15695426\n25-Jun-09,135.75,140.20,135.21,139.86,21006317\n24-Jun-09,135.42,137.50,134.86,136.22,17340169\n23-Jun-09,136.40,136.95,132.88,134.01,25233210\n22-Jun-09,140.67,141.56,136.33,137.37,22675441\n19-Jun-09,138.07,139.50,136.90,139.48,25780518\n18-Jun-09,136.11,138.00,135.59,135.88,15274289\n17-Jun-09,136.67,137.45,134.53,135.58,20407596\n16-Jun-09,136.66,138.47,136.10,136.35,18385891\n15-Jun-09,136.01,136.93,134.89,136.09,19283873\n12-Jun-09,138.81,139.10,136.04,136.97,20110176\n11-Jun-09,139.55,141.56,138.55,139.95,18743693\n10-Jun-09,142.28,142.35,138.30,140.25,24599961\n9-Jun-09,143.81,144.56,140.55,142.72,24177268\n8-Jun-09,143.82,144.23,139.43,143.85,33273239\n5-Jun-09,145.31,146.40,143.21,144.67,22596982\n4-Jun-09,140.13,144.18,140.04,143.74,19665427\n3-Jun-09,140.00,141.11,139.07,140.95,20185656\n2-Jun-09,138.99,141.34,138.35,139.49,16293676\n1-Jun-09,136.47,139.99,136.00,139.35,16166712\n29-May-09,135.39,135.90,133.85,135.81,16309086\n28-May-09,133.45,135.39,132.03,135.07,17412504\n27-May-09,131.78,134.98,130.91,133.05,23105810\n26-May-09,124.76,130.83,124.55,130.78,22747347\n22-May-09,124.05,124.18,121.75,122.50,10645315\n21-May-09,125.15,126.78,122.89,124.18,14577894\n20-May-09,127.63,129.21,125.30,125.87,13884720\n19-May-09,126.82,129.31,125.74,127.45,13300787\n18-May-09,123.73,126.70,121.57,126.65,16395908\n15-May-09,122.32,124.62,121.61,122.42,13127320\n14-May-09,119.78,123.53,119.70,122.95,15996710\n13-May-09,123.21,124.02,119.38,119.49,21284603\n12-May-09,129.56,129.71,123.25,124.42,21767115\n11-May-09,127.37,130.96,127.12,129.57,14456531\n8-May-09,129.04,131.23,126.26,129.19,16715152\n7-May-09,132.33,132.39,127.90,129.06,18996275\n6-May-09,133.33,133.50,130.22,132.50,16915788\n5-May-09,131.75,132.86,131.12,132.71,14228616\n4-May-09,128.24,132.25,127.68,132.07,21770742\n1-May-09,125.80,127.95,125.80,127.24,14199605\n30-Apr-09,126.22,127.00,124.92,125.83,17803154\n29-Apr-09,124.85,126.85,123.83,125.14,16366365\n28-Apr-09,123.35,126.21,123.26,123.90,16280594\n27-Apr-09,122.90,125.00,122.66,124.73,17171919\n24-Apr-09,124.64,125.14,122.97,123.90,19319523\n23-Apr-09,126.62,127.20,123.51,125.40,33755599\n22-Apr-09,122.63,125.35,121.20,121.51,33527396\n21-Apr-09,118.89,122.14,118.60,121.76,16810144\n20-Apr-09,121.73,122.99,119.16,120.50,16666217\n17-Apr-09,121.18,124.25,120.25,123.42,17774382\n16-Apr-09,119.19,123.15,118.79,121.45,21199366\n15-Apr-09,117.20,118.25,115.76,117.64,14750970\n14-Apr-09,119.57,120.17,117.25,118.31,16241275\n13-Apr-09,120.01,120.98,119.00,120.22,13909579\n10-Apr-09,119.57,119.57,119.57,119.57,0\n9-Apr-09,118.42,120.00,117.96,119.57,18962010\n8-Apr-09,115.43,116.79,114.58,116.32,16272481\n7-Apr-09,116.53,116.67,114.19,115.00,19170924\n6-Apr-09,114.94,118.75,113.28,118.45,23502232\n3-Apr-09,114.19,116.13,113.52,115.99,22590248\n2-Apr-09,110.14,114.75,109.78,112.71,29013066\n1-Apr-09,104.09,109.00,103.89,108.69,21056938\n31-Mar-09,105.45,107.45,105.00,105.12,20359987\n30-Mar-09,104.51,105.01,102.61,104.49,17959335\n27-Mar-09,108.23,108.53,106.40,106.85,17608669\n26-Mar-09,107.83,109.98,107.58,109.87,22008968\n25-Mar-09,107.58,108.36,103.86,106.49,23094698\n24-Mar-09,106.36,109.44,105.39,106.50,22979535\n23-Mar-09,102.71,108.16,101.75,107.66,23805871\n20-Mar-09,102.09,103.11,100.57,101.59,24846589\n19-Mar-09,101.85,103.20,100.25,101.62,17868495\n18-Mar-09,99.91,103.48,99.72,101.52,28435765\n17-Mar-09,95.24,99.69,95.07,99.66,28143586\n16-Mar-09,96.53,97.39,94.18,95.42,28483820\n13-Mar-09,96.30,97.20,95.01,95.93,21474296\n12-Mar-09,92.90,96.58,92.00,96.35,27457620\n11-Mar-09,89.81,94.07,89.58,92.68,30246584\n10-Mar-09,84.87,89.17,84.36,88.63,30160893\n9-Mar-09,84.18,87.60,82.57,83.11,24945622\n6-Mar-09,88.34,88.40,82.33,85.30,36112366\n5-Mar-09,90.46,91.87,88.45,88.84,25246234\n4-Mar-09,90.18,92.77,89.45,91.17,26483089\n3-Mar-09,88.93,90.74,87.88,88.37,25869274\n2-Mar-09,88.12,91.20,87.67,87.94,27534710\n27-Feb-09,87.93,91.30,87.67,89.31,25240864\n26-Feb-09,92.00,92.92,88.96,89.19,22501991\n25-Feb-09,89.86,92.92,89.25,91.16,29761143\n24-Feb-09,87.45,90.89,87.00,90.25,28824737\n23-Feb-09,91.65,92.00,86.51,86.95,28106145\n20-Feb-09,89.40,92.40,89.00,91.20,26794037\n19-Feb-09,93.37,94.25,90.11,90.64,32957221\n18-Feb-09,95.05,95.85,92.72,94.37,24448863\n17-Feb-09,96.87,97.04,94.28,94.53,24222626\n13-Feb-09,98.99,99.94,98.12,99.16,21752370\n12-Feb-09,95.83,99.75,95.83,99.27,29190809\n11-Feb-09,96.37,98.31,95.77,96.82,24110999\n10-Feb-09,101.33,102.51,97.06,97.83,30332806\n9-Feb-09,100.00,103.00,99.50,102.51,25535704\n6-Feb-09,97.02,100.00,97.00,99.72,24540631\n5-Feb-09,92.77,97.25,92.62,96.46,26764791\n4-Feb-09,93.22,96.25,93.10,93.55,28871894\n3-Feb-09,91.92,93.38,90.28,92.98,21408688\n2-Feb-09,89.10,92.00,88.90,91.51,19943336\n30-Jan-09,92.60,93.62,90.01,90.13,23272372\n29-Jan-09,93.09,94.34,92.60,93.00,21185715\n28-Jan-09,92.12,95.00,91.50,94.20,31385983\n27-Jan-09,90.19,91.55,89.74,90.73,22090209\n26-Jan-09,88.86,90.97,88.30,89.64,24979122\n23-Jan-09,86.82,89.87,86.50,88.36,27277482\n22-Jan-09,88.04,90.00,85.82,88.36,50340261\n21-Jan-09,79.39,82.88,79.31,82.83,39287517\n20-Jan-09,81.93,82.00,78.20,78.20,32886821\n16-Jan-09,84.30,84.38,80.40,82.33,37445787\n15-Jan-09,80.57,84.12,80.05,83.38,65824311\n14-Jan-09,86.24,87.25,84.72,85.33,38285202\n13-Jan-09,88.24,89.74,86.35,87.71,28532683\n12-Jan-09,90.46,90.99,87.55,88.66,22075734\n9-Jan-09,93.21,93.38,90.14,90.58,19635107\n8-Jan-09,90.43,93.15,90.04,92.70,24052284\n7-Jan-09,91.81,92.50,90.26,91.01,27042958\n6-Jan-09,95.95,97.17,92.39,93.02,46149129\n5-Jan-09,93.17,96.18,92.71,94.58,42458779\n2-Jan-09,85.88,91.04,85.16,90.75,26964210\n1-Jan-09,85.35,85.35,85.35,85.35,0\n31-Dec-08,85.97,87.74,85.34,85.35,21715763\n30-Dec-08,87.42,88.05,84.72,86.29,34579620\n29-Dec-08,86.52,87.62,85.07,86.61,24567225\n26-Dec-08,86.64,87.42,85.24,85.81,11043071\n25-Dec-08,85.04,85.04,85.04,85.04,0\n24-Dec-08,86.14,86.25,84.55,85.04,9694994\n23-Dec-08,86.87,87.87,85.90,86.38,22917026\n22-Dec-08,90.02,90.03,84.69,85.74,30182216\n19-Dec-08,89.94,90.94,88.80,90.00,29105844\n18-Dec-08,89.31,90.83,88.44,89.43,30633639\n17-Dec-08,91.03,91.10,88.02,89.16,46406490\n16-Dec-08,93.98,96.48,92.75,95.43,40159758\n15-Dec-08,95.99,96.21,93.00,94.75,31858968\n12-Dec-08,92.80,99.00,92.53,98.27,37243348\n11-Dec-08,97.35,101.24,94.83,95.00,37260007\n10-Dec-08,97.87,99.49,96.50,98.21,33517137\n9-Dec-08,98.09,103.60,97.21,100.06,43004198\n8-Dec-08,97.28,100.80,95.80,99.72,42346166\n5-Dec-08,90.35,94.49,88.86,94.00,37294882\n4-Dec-08,94.43,95.21,89.06,91.41,38988771\n3-Dec-08,89.40,96.23,88.80,95.90,47864908\n2-Dec-08,90.03,92.65,86.50,92.47,41050587\n1-Dec-08,91.30,92.27,88.92,88.93,33005789\n28-Nov-08,94.70,94.76,91.86,92.67,10757337\n27-Nov-08,95.00,95.00,95.00,95.00,0\n26-Nov-08,89.92,95.25,89.85,95.00,32160801\n25-Nov-08,94.63,94.71,88.16,90.80,44127030\n24-Nov-08,85.21,94.79,84.84,92.95,51524734\n21-Nov-08,81.93,84.12,79.14,82.58,56056064\n20-Nov-08,85.24,86.45,80.00,80.49,61312137\n19-Nov-08,89.44,91.58,86.21,86.29,41866901\n18-Nov-08,89.64,90.99,86.86,89.91,43226932\n17-Nov-08,88.48,90.55,87.26,88.14,41532997\n14-Nov-08,93.76,93.99,90.00,90.24,50188530\n13-Nov-08,89.87,96.44,86.02,96.44,66262918\n12-Nov-08,92.43,93.24,90.01,90.12,42104581\n11-Nov-08,94.81,97.17,92.26,94.77,43749871\n10-Nov-08,100.17,100.40,94.50,95.88,40210214\n7-Nov-08,99.24,99.85,95.72,98.24,38552700\n6-Nov-08,101.05,102.78,98.00,99.10,46492200\n5-Nov-08,108.91,109.72,102.99,103.30,44417100\n4-Nov-08,109.99,111.79,106.67,110.99,49366100\n3-Nov-08,105.93,109.10,104.86,106.96,36865000\n31-Oct-08,107.40,110.78,105.14,107.59,57862700\n30-Oct-08,108.23,112.19,107.61,111.04,57904700\n29-Oct-08,100.86,109.54,99.94,104.55,69002300\n28-Oct-08,95.43,100.50,92.37,99.91,57165600\n27-Oct-08,95.07,97.63,91.86,92.09,42139100\n24-Oct-08,90.33,97.90,90.11,96.38,55281400\n23-Oct-08,96.51,99.25,91.90,98.23,59210800\n22-Oct-08,97.37,101.25,92.93,96.87,76461400\n21-Oct-08,96.95,97.90,91.16,91.49,63593100\n20-Oct-08,99.78,100.03,93.64,98.44,54675800\n17-Oct-08,99.60,102.04,85.88,97.40,62172300\n16-Oct-08,99.77,103.43,91.74,101.89,69384300\n15-Oct-08,103.84,107.00,97.89,97.95,55336200\n14-Oct-08,116.26,116.40,103.14,104.08,68112500\n13-Oct-08,104.55,110.53,101.02,110.26,53571800\n10-Oct-08,85.70,100.00,85.00,96.80,77878400\n9-Oct-08,93.35,95.80,86.60,88.74,56980900\n8-Oct-08,85.91,96.33,85.68,89.79,77577200\n7-Oct-08,100.48,101.50,88.95,89.16,65451300\n6-Oct-08,91.96,98.78,87.54,98.14,73754900\n3-Oct-08,104.00,106.50,94.65,97.07,81028900\n2-Oct-08,108.01,108.79,100.00,100.10,56869800\n1-Oct-08,111.92,112.36,107.39,109.12,45821600\n30-Sep-08,108.25,115.00,106.30,113.66,56103400\n29-Sep-08,119.62,119.68,100.59,105.26,91958100\n26-Sep-08,124.91,129.80,123.00,128.24,39387300\n25-Sep-08,129.80,134.79,128.52,131.93,34118200\n24-Sep-08,127.27,130.95,125.15,128.71,36768900\n23-Sep-08,131.85,135.80,126.66,126.84,45050900\n22-Sep-08,139.94,140.25,130.66,131.05,30199900\n19-Sep-08,142.60,144.20,136.31,140.91,44206000\n18-Sep-08,130.57,140.00,120.68,134.09,59010000\n17-Sep-08,138.49,138.51,127.83,127.83,41564700\n16-Sep-08,133.86,142.50,132.15,139.88,41036300\n15-Sep-08,142.03,147.69,140.36,140.36,32160100\n12-Sep-08,150.91,150.91,146.50,148.94,28110700\n11-Sep-08,148.18,152.99,146.00,152.65,34136700\n10-Sep-08,152.32,154.99,148.80,151.61,34092400\n9-Sep-08,156.86,159.96,149.79,151.68,43793600\n8-Sep-08,164.57,164.89,151.46,157.92,36775700\n5-Sep-08,158.59,162.40,157.65,160.18,27573100\n4-Sep-08,165.86,167.91,160.81,161.22,26324200\n3-Sep-08,166.84,168.68,164.00,166.96,25974300\n2-Sep-08,172.40,173.50,165.00,166.19,27293400\n29-Aug-08,172.96,173.50,169.04,169.53,20971000\n28-Aug-08,175.28,176.25,172.75,173.74,15085600\n27-Aug-08,173.31,175.76,172.19,174.67,16700000\n26-Aug-08,172.76,174.88,172.61,173.64,14714300\n25-Aug-08,176.15,176.23,171.66,172.55,16894300\n22-Aug-08,175.82,177.50,175.57,176.79,15444300\n21-Aug-08,174.47,175.45,171.89,174.29,19073400\n20-Aug-08,174.77,176.94,173.61,175.84,17918500\n19-Aug-08,174.54,177.07,171.81,173.53,21536300\n18-Aug-08,175.57,177.81,173.82,175.39,19246100\n15-Aug-08,179.04,179.75,175.05,175.74,25085700\n14-Aug-08,178.33,180.45,177.84,179.32,25127100\n13-Aug-08,177.98,180.00,175.90,179.30,29727800\n12-Aug-08,173.52,179.29,173.51,176.73,29500500\n11-Aug-08,170.07,176.50,169.67,173.56,31477300\n8-Aug-08,163.86,169.65,163.75,169.55,25211000\n7-Aug-08,162.71,166.15,161.50,163.57,23629200\n6-Aug-08,159.97,167.40,158.00,164.19,27937900\n5-Aug-08,155.42,160.80,154.82,160.64,23958700\n4-Aug-08,156.60,157.90,152.91,153.23,20825400\n1-Aug-08,159.90,159.99,155.75,156.66,18369300\n31-Jul-08,157.54,162.20,156.98,158.95,22440100\n30-Jul-08,157.78,160.49,156.08,159.88,25511500\n29-Jul-08,155.41,159.45,153.65,157.08,23678000\n28-Jul-08,162.34,162.47,154.02,154.40,27511700\n25-Jul-08,160.40,163.00,158.65,162.12,22080000\n24-Jul-08,164.32,165.26,158.45,159.03,29415200\n23-Jul-08,164.99,168.37,161.56,166.26,36770100\n22-Jul-08,149.00,162.76,146.53,162.02,64350900\n21-Jul-08,166.90,167.50,161.12,166.29,35718700\n18-Jul-08,168.52,169.65,165.00,165.15,30157300\n17-Jul-08,174.10,174.98,171.39,171.81,24585300\n16-Jul-08,170.20,172.93,168.60,172.81,26386200\n15-Jul-08,172.48,173.74,166.39,169.64,36552600\n14-Jul-08,179.24,179.30,173.08,173.88,30221200\n11-Jul-08,175.47,177.11,171.00,172.58,32567400\n10-Jul-08,174.92,177.34,171.37,176.63,29365700\n9-Jul-08,180.20,180.91,174.14,174.25,30951400\n8-Jul-08,175.40,179.70,172.74,179.55,31309500\n7-Jul-08,173.16,177.13,171.90,175.16,28832700\n3-Jul-08,169.59,172.17,165.75,170.12,18325100\n2-Jul-08,175.20,177.45,168.18,168.18,29266400\n1-Jul-08,164.23,174.72,164.00,174.68,39037400\n30-Jun-08,170.19,172.00,166.62,167.44,24008500\n27-Jun-08,166.51,170.57,164.15,170.09,35671000\n26-Jun-08,174.07,174.84,168.01,168.26,30335200\n25-Jun-08,174.61,178.83,173.88,177.39,22375500\n24-Jun-08,172.37,175.78,171.63,173.25,21937800\n23-Jun-08,174.74,175.88,171.56,173.16,22678500\n20-Jun-08,179.35,181.00,175.00,175.27,30784000\n19-Jun-08,178.55,182.34,176.80,180.90,27982400\n18-Jun-08,181.12,182.20,177.35,178.75,28604400\n17-Jun-08,178.10,181.99,177.41,181.43,31675700\n16-Jun-08,171.30,177.90,169.07,176.84,37188300\n13-Jun-08,171.64,174.16,165.31,172.37,47360500\n12-Jun-08,181.49,182.60,171.20,173.26,45884700\n11-Jun-08,184.34,186.00,179.59,180.81,33635700\n10-Jun-08,180.51,186.78,179.02,185.64,39769000\n9-Jun-08,184.79,184.94,175.75,181.61,66228300\n6-Jun-08,188.00,189.95,185.55,185.64,33571600\n5-Jun-08,186.34,189.84,185.70,189.43,26591900\n4-Jun-08,184.02,187.09,183.23,185.19,25584900\n3-Jun-08,186.86,188.20,182.34,185.37,26560800\n2-Jun-08,188.60,189.65,184.53,186.10,23489700\n30-May-08,187.45,189.54,187.38,188.75,21305600\n29-May-08,186.76,188.20,185.50,186.69,22686300\n28-May-08,187.41,187.95,183.72,187.01,26082000\n27-May-08,182.75,186.43,181.84,186.43,27792600\n23-May-08,180.77,181.99,177.80,181.17,31495400\n22-May-08,179.26,181.33,172.00,177.05,42587400\n21-May-08,185.67,188.00,176.25,178.19,40847500\n20-May-08,181.82,186.16,180.12,185.90,34150800\n19-May-08,187.86,188.69,181.30,183.60,33345500\n16-May-08,190.11,190.30,187.00,187.62,26974400\n15-May-08,186.81,189.90,184.20,189.73,30689600\n14-May-08,191.23,192.24,185.57,186.26,32279900\n13-May-08,188.61,191.45,187.86,189.96,29049200\n12-May-08,185.21,188.87,182.85,188.16,28699100\n9-May-08,183.16,184.25,181.37,183.45,23684600\n8-May-08,183.77,186.50,183.07,185.06,31435900\n7-May-08,186.05,188.20,180.54,182.59,40851800\n6-May-08,184.66,187.12,182.18,186.66,31867800\n5-May-08,181.92,185.31,181.05,184.73,29671600\n2-May-08,180.19,181.92,178.55,180.94,34366200\n1-May-08,174.96,180.00,174.86,180.00,31620900\n30-Apr-08,176.19,180.00,172.92,173.95,39992800\n29-Apr-08,171.11,175.66,170.25,175.05,32642400\n28-Apr-08,169.75,173.75,169.13,172.24,27733600\n25-Apr-08,170.70,171.10,166.42,169.73,34284900\n24-Apr-08,165.34,169.98,159.19,168.94,57011700\n23-Apr-08,164.05,164.84,161.08,162.89,39283900\n22-Apr-08,167.40,168.00,158.09,160.20,50439700\n21-Apr-08,162.21,168.50,161.76,168.16,36320800\n18-Apr-08,159.12,162.26,158.38,161.04,34624300\n17-Apr-08,154.17,156.00,153.35,154.49,24272300\n16-Apr-08,151.72,154.10,150.62,153.70,27359800\n15-Apr-08,149.40,149.72,145.72,148.38,23933800\n14-Apr-08,146.77,149.25,144.54,147.78,29677700\n11-Apr-08,152.72,153.30,146.40,147.14,42563600\n10-Apr-08,151.13,155.42,150.60,154.55,33778600\n9-Apr-08,153.31,153.89,150.46,151.44,30953600\n8-Apr-08,153.55,156.45,152.32,152.84,35111200\n7-Apr-08,156.13,159.69,155.11,155.89,40797800\n4-Apr-08,152.19,154.72,150.75,153.08,29732100\n3-Apr-08,147.06,153.63,147.00,151.61,37023400\n2-Apr-08,148.78,151.20,145.85,147.49,35677500\n1-Apr-08,146.30,149.66,143.61,149.53,36027300\n31-Mar-08,143.27,145.71,142.52,143.50,26947400\n28-Mar-08,141.80,144.65,141.60,143.01,25067500\n27-Mar-08,144.95,145.31,139.99,140.25,35206100\n26-Mar-08,140.87,145.74,140.64,145.06,40626200\n25-Mar-08,139.96,143.10,137.33,140.98,37194400\n24-Mar-08,134.01,140.85,133.64,139.53,37681900\n20-Mar-08,131.12,133.29,129.18,133.27,31321100\n19-Mar-08,133.12,134.29,129.67,129.67,35019600\n18-Mar-08,129.18,133.00,128.67,132.82,42361700\n17-Mar-08,122.55,128.59,122.55,126.73,37770100\n14-Mar-08,129.88,130.30,124.20,126.61,40303700\n13-Mar-08,124.10,129.50,123.00,127.94,44330100\n12-Mar-08,127.04,128.68,125.17,126.03,37386300\n11-Mar-08,124.10,127.48,122.00,127.35,40283200\n10-Mar-08,121.98,123.46,119.37,119.69,35273300\n7-Mar-08,120.41,122.98,119.05,122.25,43060100\n6-Mar-08,124.62,127.50,120.81,120.93,51831900\n5-Mar-08,123.58,125.14,122.25,124.49,42465800\n4-Mar-08,121.99,124.88,120.40,124.62,63109200\n3-Mar-08,124.44,125.98,118.00,121.73,56455700\n29-Feb-08,129.29,130.21,124.80,125.02,43932600\n28-Feb-08,127.20,132.20,125.77,129.91,56186500\n27-Feb-08,118.23,123.05,118.09,122.96,49698700\n26-Feb-08,117.64,121.09,115.44,119.15,52497900\n25-Feb-08,118.59,120.17,116.66,119.74,44355200\n22-Feb-08,122.48,122.51,115.87,119.46,53967400\n21-Feb-08,126.05,126.47,120.86,121.54,32504400\n20-Feb-08,122.20,124.60,121.68,123.82,34047400\n19-Feb-08,125.99,126.75,121.44,122.18,35129800\n15-Feb-08,126.27,127.08,124.06,124.63,30367800\n14-Feb-08,129.40,130.80,127.01,127.46,33721600\n13-Feb-08,126.68,129.78,125.63,129.40,33813000\n12-Feb-08,130.70,131.00,123.62,124.86,43214000\n11-Feb-08,128.01,129.98,127.20,129.45,41873100\n8-Feb-08,122.08,125.70,121.60,125.48,47867700\n7-Feb-08,119.97,124.78,117.27,121.24,73048900\n6-Feb-08,130.83,131.92,121.77,122.00,54990500\n5-Feb-08,130.43,134.00,128.90,129.36,39921800\n4-Feb-08,134.21,135.90,131.42,131.65,31265400\n1-Feb-08,136.24,136.59,132.18,133.75,34967500\n31-Jan-08,129.45,136.65,129.40,135.36,46444000\n30-Jan-08,131.37,135.45,130.00,132.18,43684900\n29-Jan-08,131.15,132.79,129.05,131.54,38022600\n28-Jan-08,128.16,133.20,126.45,130.01,50978300\n25-Jan-08,138.99,139.09,129.61,130.01,54468700\n24-Jan-08,139.99,140.70,132.01,135.60,68069000\n23-Jan-08,136.19,140.00,126.14,139.07,17008800\n22-Jan-08,148.06,159.98,146.00,155.64,69530400\n18-Jan-08,161.71,165.75,159.61,161.36,57983700\n17-Jan-08,161.51,165.36,158.42,160.89,61237600\n16-Jan-08,165.23,169.01,156.70,159.64,77804500\n15-Jan-08,177.72,179.22,164.66,169.04,81723300\n14-Jan-08,177.52,179.42,175.17,178.78,36688700\n11-Jan-08,176.00,177.85,170.00,172.69,43219400\n10-Jan-08,177.58,181.00,175.41,178.02,52015700\n9-Jan-08,171.30,179.50,168.30,179.40,63762300\n8-Jan-08,180.14,182.46,170.80,171.25,53470100\n7-Jan-08,181.25,183.60,170.23,177.64,72691000\n4-Jan-08,191.45,193.00,178.89,180.05,50834900\n3-Jan-08,195.41,197.39,192.69,194.93,29442500\n2-Jan-08,199.27,200.26,192.55,194.84,38017600\n31-Dec-07,199.50,200.50,197.75,198.08,18747500\n28-Dec-07,200.59,201.56,196.88,199.83,23879100\n27-Dec-07,198.95,202.96,197.80,198.57,27802400\n26-Dec-07,199.01,200.96,196.82,198.95,24247200\n24-Dec-07,195.03,199.33,194.79,198.80,15535900\n21-Dec-07,190.12,193.91,189.89,193.91,32836100\n20-Dec-07,185.43,187.83,183.33,187.21,26688500\n19-Dec-07,182.98,184.64,180.90,183.12,29144200\n18-Dec-07,186.52,187.33,178.60,182.98,43134200\n17-Dec-07,190.72,192.65,182.98,184.40,36048300\n14-Dec-07,190.37,200.00,189.54,190.39,22899700\n13-Dec-07,190.19,192.12,187.82,191.83,30420300\n12-Dec-07,193.44,194.48,185.76,190.86,41927400\n11-Dec-07,194.75,196.83,187.39,188.54,39218800\n10-Dec-07,193.59,195.66,192.69,194.21,24900000\n7-Dec-07,190.54,194.99,188.04,194.30,37052600\n6-Dec-07,186.19,190.10,186.12,189.95,31407800\n5-Dec-07,182.89,186.00,182.41,185.50,31225000\n4-Dec-07,177.15,180.90,176.99,179.81,27000500\n3-Dec-07,181.86,184.14,177.70,178.86,33616600\n30-Nov-07,187.34,187.70,179.70,182.22,41498000\n29-Nov-07,179.43,185.17,179.15,184.29,36614700\n28-Nov-07,176.82,180.60,175.35,180.22,40194300\n27-Nov-07,175.22,175.79,170.01,174.81,46278200\n26-Nov-07,173.59,177.27,172.35,172.54,45097000\n23-Nov-07,172.00,172.05,169.75,171.54,15054100\n21-Nov-07,165.84,172.35,164.67,168.46,42785700\n20-Nov-07,165.67,171.79,163.53,168.85,54473400\n19-Nov-07,166.10,168.20,162.10,163.95,40415600\n16-Nov-07,165.30,167.02,159.33,166.39,48345300\n15-Nov-07,166.39,169.59,160.30,164.30,51683900\n14-Nov-07,177.16,177.57,163.74,166.11,49444700\n13-Nov-07,160.85,170.98,160.14,169.96,59708900\n12-Nov-07,165.28,167.70,150.63,153.76,61857200\n9-Nov-07,171.15,175.12,165.21,165.37,53096500\n8-Nov-07,186.67,186.90,167.77,175.47,66759900\n7-Nov-07,190.61,192.68,186.13,186.30,34619900\n6-Nov-07,187.05,192.00,185.27,191.79,33352400\n5-Nov-07,185.29,188.96,184.24,186.18,27928500\n2-Nov-07,189.16,189.44,183.49,187.87,34984100\n1-Nov-07,188.60,190.10,180.00,187.44,27502900\n31-Oct-07,187.63,190.12,184.95,189.95,28580500\n30-Oct-07,186.18,189.37,184.73,187.00,32363400\n29-Oct-07,185.45,186.59,184.70,185.09,18823800\n26-Oct-07,185.29,185.37,182.88,184.70,24774000\n25-Oct-07,184.87,185.90,181.66,182.78,32944600\n24-Oct-07,185.81,187.21,179.24,185.93,45179700\n23-Oct-07,188.56,188.60,182.76,186.16,60070000\n22-Oct-07,170.35,174.90,169.96,174.36,42811100\n19-Oct-07,174.24,174.63,170.00,170.42,44411700\n18-Oct-07,171.50,174.19,171.05,173.50,28349200\n17-Oct-07,172.69,173.04,169.18,172.75,38518000\n16-Oct-07,165.54,170.18,165.15,169.58,36882900\n15-Oct-07,167.98,169.57,163.50,166.98,37615600\n12-Oct-07,163.01,167.28,161.80,167.25,34194800\n11-Oct-07,169.49,171.88,153.21,162.23,57309200\n10-Oct-07,167.55,167.88,165.60,166.79,23339800\n9-Oct-07,170.20,171.11,166.68,167.86,38157900\n8-Oct-07,163.49,167.91,162.97,167.91,29110400\n5-Oct-07,158.37,161.58,157.70,161.45,32178600\n4-Oct-07,158.00,158.08,153.50,156.24,22875200\n3-Oct-07,157.78,159.18,157.01,157.92,24047500\n2-Oct-07,156.55,158.59,155.89,158.45,27353000\n1-Oct-07,154.59,157.41,152.93,156.34,29343500\n28-Sep-07,153.44,154.60,152.75,153.47,21521700\n27-Sep-07,153.77,154.52,152.32,154.50,22880400\n26-Sep-07,154.47,155.00,151.25,152.77,33357800\n25-Sep-07,146.84,153.22,146.82,153.18,41588600\n24-Sep-07,146.73,149.85,146.65,148.28,35756600\n21-Sep-07,141.14,144.65,140.31,144.15,38964600\n20-Sep-07,140.15,141.79,139.32,140.31,24004200\n19-Sep-07,143.02,143.16,139.40,140.77,35183400\n18-Sep-07,139.06,142.85,137.83,140.92,36821700\n17-Sep-07,138.99,140.59,137.60,138.41,27444100\n14-Sep-07,136.57,138.98,136.20,138.81,21111300\n13-Sep-07,138.83,139.00,136.65,137.20,22739600\n12-Sep-07,135.99,139.40,135.75,136.85,35750600\n11-Sep-07,137.90,138.30,133.75,135.49,33959600\n10-Sep-07,137.00,138.04,133.95,136.71,50096800\n7-Sep-07,132.01,132.30,130.00,131.77,49536700\n6-Sep-07,135.56,137.57,132.71,135.01,65584300\n5-Sep-07,144.97,145.84,136.10,136.76,80728600\n4-Sep-07,139.94,145.73,139.84,144.16,45997200\n31-Aug-07,139.49,139.65,137.41,138.48,29892800\n30-Aug-07,132.67,138.25,132.30,136.25,50471600\n29-Aug-07,129.88,134.18,129.54,134.08,40001700\n28-Aug-07,130.99,132.41,126.63,126.82,40781700\n27-Aug-07,133.39,134.66,132.10,132.25,24431300\n24-Aug-07,130.53,135.37,129.81,135.30,31906500\n23-Aug-07,133.09,133.34,129.76,131.07,30033800\n22-Aug-07,131.22,132.75,130.33,132.51,35510900\n21-Aug-07,122.21,128.96,121.00,127.57,45843300\n20-Aug-07,123.96,124.50,120.50,122.22,27750200\n17-Aug-07,122.01,123.50,119.82,122.06,39869500\n16-Aug-07,117.01,118.50,111.62,117.05,65398300\n15-Aug-07,122.74,124.86,119.65,119.90,34812100\n14-Aug-07,128.29,128.30,123.71,124.03,25674600\n13-Aug-07,128.32,129.35,126.50,127.79,25913900\n10-Aug-07,123.12,127.75,120.30,125.00,48415200\n9-Aug-07,131.11,133.00,125.09,126.39,39302800\n8-Aug-07,136.76,136.86,132.00,134.01,28072300\n7-Aug-07,134.94,137.24,132.63,135.03,33453800\n6-Aug-07,132.90,135.27,128.30,135.25,32205800\n3-Aug-07,135.26,135.95,131.50,131.85,23382000\n2-Aug-07,136.65,136.96,134.15,136.49,29429800\n1-Aug-07,133.64,135.38,127.77,135.00,60456600\n31-Jul-07,142.97,143.48,131.52,131.76,60764300\n30-Jul-07,144.33,145.45,139.57,141.43,38558100\n27-Jul-07,146.19,148.92,143.78,143.85,40256700\n26-Jul-07,145.91,148.50,136.96,146.00,73347700\n25-Jul-07,137.35,138.36,135.00,137.26,41019200\n24-Jul-07,138.88,141.00,134.15,134.89,59442800\n23-Jul-07,143.31,145.22,140.93,143.70,36084300\n20-Jul-07,141.65,144.18,140.00,143.75,37791900\n19-Jul-07,140.30,140.81,139.65,140.00,24236600\n18-Jul-07,138.19,138.44,136.04,138.12,25949100\n17-Jul-07,138.30,139.60,137.50,138.91,24908700\n16-Jul-07,138.39,139.98,137.50,138.10,32982400\n13-Jul-07,135.03,137.85,134.52,137.73,30844600\n12-Jul-07,133.85,134.24,132.39,134.07,24697300\n11-Jul-07,132.07,133.70,131.31,132.39,28704800\n10-Jul-07,128.88,134.50,128.81,132.35,44139900\n9-Jul-07,132.38,132.90,129.18,130.33,34886300\n6-Jul-07,133.13,133.34,130.40,132.30,29590700\n5-Jul-07,128.80,132.97,128.69,132.75,49919400\n3-Jul-07,122.00,127.40,121.50,127.17,40886900\n2-Jul-07,121.05,122.09,119.30,121.26,33007200\n29-Jun-07,121.97,124.00,121.09,122.04,39640400\n28-Jun-07,122.36,122.49,120.00,120.56,28360000\n27-Jun-07,120.61,122.04,119.26,121.89,33874200\n26-Jun-07,123.98,124.00,118.72,119.65,46168900\n25-Jun-07,124.19,125.09,121.06,122.34,34041100\n22-Jun-07,123.85,124.45,122.38,123.00,21595500\n21-Jun-07,121.70,124.29,120.72,123.90,30348200\n20-Jun-07,123.87,124.66,121.50,121.55,31323400\n19-Jun-07,124.69,125.01,122.91,123.66,32424900\n18-Jun-07,123.28,125.18,122.54,125.09,30561000\n15-Jun-07,120.62,120.67,119.86,120.50,23729200\n14-Jun-07,117.20,119.45,116.42,118.75,33942300\n13-Jun-07,121.15,121.19,115.40,117.50,60556900\n12-Jun-07,119.35,121.71,118.31,120.38,49181400\n11-Jun-07,126.00,126.15,119.54,120.19,65552500\n8-Jun-07,125.82,125.83,122.29,124.49,43060300\n7-Jun-07,124.99,127.61,123.19,124.07,66829300\n6-Jun-07,122.30,124.05,121.95,123.64,39116500\n5-Jun-07,121.41,122.69,120.50,122.67,32009600\n4-Jun-07,118.63,121.73,117.90,121.33,30889200\n1-Jun-07,121.10,121.19,118.29,118.40,30837500\n31-May-07,120.07,122.17,119.54,121.19,44641600\n30-May-07,114.30,118.88,113.53,118.77,51317200\n29-May-07,114.45,114.86,112.69,114.35,22548100\n25-May-07,112.00,113.78,111.50,113.62,21801100\n24-May-07,112.81,114.46,110.37,110.69,31066700\n23-May-07,114.02,115.00,112.59,112.89,30914800\n22-May-07,112.49,113.75,112.01,113.54,20100000\n21-May-07,110.31,112.45,110.05,111.98,22513100\n18-May-07,110.23,110.64,109.77,110.02,19436200\n17-May-07,107.15,109.87,107.15,109.44,25979000\n16-May-07,108.53,108.83,103.42,107.34,39111000\n15-May-07,109.57,110.20,106.48,107.52,33826100\n14-May-07,109.62,110.00,108.25,109.36,22304700\n11-May-07,107.74,109.13,106.78,108.74,22931600\n10-May-07,106.63,108.84,105.92,107.34,42536800\n9-May-07,104.91,106.96,104.89,106.88,23890400\n8-May-07,103.47,105.15,103.42,105.06,27159700\n7-May-07,101.08,104.35,101.01,103.92,29926100\n4-May-07,100.80,101.60,100.50,100.81,13382200\n3-May-07,100.73,101.45,100.01,100.40,20095800\n2-May-07,99.65,100.54,99.47,100.39,17136400\n1-May-07,99.59,100.35,98.55,99.47,18377700\n30-Apr-07,100.09,101.00,99.67,99.80,21409100\n27-Apr-07,98.18,99.95,97.69,99.92,24114400\n26-Apr-07,101.58,102.50,98.30,98.84,56366700\n25-Apr-07,94.23,95.40,93.80,95.35,29692400\n24-Apr-07,93.96,96.39,91.30,93.24,37001300\n23-Apr-07,91.58,93.80,91.42,93.51,26453800\n20-Apr-07,90.89,91.18,90.55,90.97,18037600\n19-Apr-07,90.19,91.25,89.83,90.27,14887100\n18-Apr-07,90.16,90.85,89.60,90.40,16140200\n17-Apr-07,92.00,92.30,89.70,90.35,26218900\n16-Apr-07,90.57,91.50,90.25,91.43,20911700\n13-Apr-07,90.90,91.40,90.06,90.24,24722300\n12-Apr-07,92.04,92.31,90.72,92.19,20651700\n11-Apr-07,93.90,93.95,92.33,92.59,19001800\n10-Apr-07,93.67,94.26,93.41,94.25,12331700\n9-Apr-07,95.21,95.30,93.04,93.65,14392000\n5-Apr-07,94.12,94.68,93.52,94.68,12429100\n4-Apr-07,94.94,95.14,94.13,94.27,16299000\n3-Apr-07,94.14,95.23,93.76,94.50,20442300\n2-Apr-07,94.14,94.25,93.02,93.65,17284700\n30-Mar-07,94.28,94.68,92.75,92.91,20771800\n29-Mar-07,94.19,94.19,92.23,93.75,24903800\n28-Mar-07,94.88,95.40,93.15,93.24,32985300\n27-Mar-07,95.71,96.83,95.00,95.46,32597700\n26-Mar-07,93.99,95.90,93.30,95.85,30234500\n23-Mar-07,93.35,94.07,93.30,93.52,15625900\n22-Mar-07,93.73,94.36,93.00,93.96,19146800\n21-Mar-07,91.99,94.00,91.65,93.87,23699600\n20-Mar-07,91.35,91.84,91.06,91.48,17171900\n19-Mar-07,90.24,91.55,89.59,91.13,24994500\n16-Mar-07,89.54,89.99,89.32,89.59,19092200\n15-Mar-07,89.96,90.36,89.31,89.57,18430000\n14-Mar-07,88.60,90.00,87.92,90.00,27563300\n13-Mar-07,89.41,90.60,88.40,88.40,30633400\n12-Mar-07,88.07,89.99,87.99,89.87,25734100\n9-Mar-07,88.80,88.85,87.40,87.97,15515300\n8-Mar-07,88.59,88.72,87.46,88.00,17807200\n7-Mar-07,88.05,88.97,87.45,87.72,21664400\n6-Mar-07,87.80,88.31,87.40,88.19,25288400\n5-Mar-07,85.89,88.65,85.76,86.32,28684900\n2-Mar-07,86.77,87.54,85.21,85.41,30326100\n1-Mar-07,84.03,88.31,83.75,87.06,49473400\n28-Feb-07,83.00,85.60,83.00,84.61,32452200\n27-Feb-07,86.30,87.08,83.41,83.93,40202200\n26-Feb-07,89.84,90.00,87.61,88.65,21592400\n23-Feb-07,89.16,90.34,88.85,89.07,18363400\n22-Feb-07,90.80,90.81,88.53,89.51,28893000\n21-Feb-07,85.96,89.49,85.96,89.20,40840400\n20-Feb-07,84.65,86.16,84.16,85.90,21588400\n16-Feb-07,85.25,85.41,84.66,84.83,13311800\n15-Feb-07,85.44,85.62,84.78,85.21,12873600\n14-Feb-07,84.63,85.64,84.57,85.30,17940500\n13-Feb-07,85.16,85.29,84.30,84.70,20374000\n12-Feb-07,84.43,85.18,83.63,84.88,25227300\n9-Feb-07,85.88,86.20,83.21,83.27,29905700\n8-Feb-07,85.43,86.51,85.41,86.18,23775100\n7-Feb-07,84.48,86.38,83.55,86.15,36826500\n6-Feb-07,84.45,84.47,82.86,84.15,30463700\n5-Feb-07,84.30,85.23,83.94,83.94,20412400\n2-Feb-07,84.06,85.25,83.70,84.75,21639600\n1-Feb-07,86.23,86.27,84.74,84.74,23362600\n31-Jan-07,84.86,86.00,84.35,85.73,30044700\n30-Jan-07,86.45,86.49,85.25,85.55,20268800\n29-Jan-07,86.30,86.65,85.53,85.94,31489200\n26-Jan-07,87.12,87.37,84.99,85.38,34955000\n25-Jan-07,87.11,88.50,86.03,86.25,32119900\n24-Jan-07,86.66,87.15,86.08,86.70,32838200\n23-Jan-07,85.73,87.51,85.51,85.70,42350800\n22-Jan-07,89.14,89.16,85.65,86.79,51024000\n19-Jan-07,88.63,89.65,88.12,88.50,46897200\n18-Jan-07,92.10,92.11,89.05,89.07,79688000\n17-Jan-07,97.56,97.60,94.82,94.95,44892100\n16-Jan-07,95.68,97.25,95.45,97.10,42947000\n12-Jan-07,94.59,95.06,93.23,94.62,45876200\n11-Jan-07,95.94,96.78,95.10,95.80,50330300\n10-Jan-07,94.75,97.80,93.45,97.00,98946900\n9-Jan-07,86.45,92.98,85.15,92.57,18471000\n8-Jan-07,85.96,86.53,85.28,85.47,28089100\n5-Jan-07,85.77,86.20,84.40,85.05,29335400\n4-Jan-07,84.05,85.95,83.82,85.66,30032100\n3-Jan-07,86.29,86.58,81.90,83.80,43223900\n29-Dec-06,83.95,85.40,83.36,84.84,35922200\n28-Dec-06,80.22,81.25,79.65,80.87,37492500\n27-Dec-06,78.15,82.00,76.77,81.52,65086400\n26-Dec-06,82.15,82.57,80.89,81.51,17404800\n22-Dec-06,83.46,84.04,81.60,82.20,21698900\n21-Dec-06,84.70,85.48,82.20,82.90,31854900\n20-Dec-06,86.47,86.67,84.74,84.76,20109800\n19-Dec-06,84.73,86.68,83.62,86.31,32160300\n18-Dec-06,87.62,88.00,84.59,85.47,25407100\n15-Dec-06,89.02,89.22,87.33,87.72,25627400\n14-Dec-06,89.05,90.00,88.26,88.55,29328000\n13-Dec-06,87.95,89.07,87.15,89.05,29652400\n12-Dec-06,88.61,88.84,85.53,86.14,36721400\n11-Dec-06,88.90,89.30,88.05,88.75,17518500\n8-Dec-06,87.23,89.39,87.00,88.26,27620600\n7-Dec-06,90.02,90.50,86.90,87.04,35616100\n6-Dec-06,90.64,91.39,89.67,89.83,22311000\n5-Dec-06,91.66,92.33,90.87,91.27,23345300\n4-Dec-06,91.88,92.05,90.50,91.12,25102700\n1-Dec-06,91.80,92.33,90.10,91.32,28181000\n30-Nov-06,92.22,92.68,91.06,91.66,30450300\n29-Nov-06,93.00,93.15,90.25,91.80,40496500\n28-Nov-06,90.36,91.97,89.91,91.81,36208200\n27-Nov-06,92.51,93.16,89.50,89.54,37680900\n24-Nov-06,89.53,93.08,89.50,91.63,18132500\n22-Nov-06,88.99,90.75,87.85,90.31,23713100\n21-Nov-06,87.42,88.60,87.11,88.60,21783100\n20-Nov-06,85.40,87.00,85.20,86.47,20084400\n17-Nov-06,85.14,85.94,85.00,85.85,16437000\n16-Nov-06,84.87,86.30,84.62,85.61,23989700\n15-Nov-06,85.05,85.90,84.00,84.05,22779300\n14-Nov-06,84.80,85.00,83.90,85.00,20444600\n13-Nov-06,83.22,84.45,82.64,84.35,15994400\n10-Nov-06,83.55,83.60,82.50,83.12,13046100\n9-Nov-06,82.90,84.69,82.12,83.34,32643600\n8-Nov-06,80.02,82.69,79.89,82.45,23950500\n7-Nov-06,80.45,81.00,80.13,80.51,18512500\n6-Nov-06,78.95,80.06,78.43,79.71,15086800\n3-Nov-06,79.36,79.53,77.79,78.29,15229800\n2-Nov-06,78.92,79.32,78.50,78.98,16350700\n1-Nov-06,81.10,81.38,78.36,79.16,21500800\n31-Oct-06,81.45,81.68,80.23,81.08,17515300\n30-Oct-06,79.98,80.90,79.50,80.42,17040800\n27-Oct-06,81.75,82.45,80.01,80.41,21135900\n26-Oct-06,81.90,82.60,81.13,82.19,15351200\n25-Oct-06,81.35,82.00,81.01,81.68,16899900\n24-Oct-06,81.21,81.68,80.20,81.05,16394100\n23-Oct-06,79.99,81.90,79.75,81.46,27137200\n20-Oct-06,78.97,79.99,78.67,79.95,22534200\n19-Oct-06,79.26,79.95,78.16,78.99,51422600\n18-Oct-06,74.75,78.59,73.91,74.53,27870400\n17-Oct-06,75.04,75.27,74.04,74.29,17014300\n16-Oct-06,75.19,75.88,74.79,75.40,16536900\n13-Oct-06,75.63,76.88,74.74,75.02,24130200\n12-Oct-06,73.61,75.39,73.60,75.26,20879700\n11-Oct-06,73.42,73.98,72.60,73.23,20286800\n10-Oct-06,74.54,74.58,73.08,73.81,18782700\n9-Oct-06,73.80,75.08,73.53,74.63,15390400\n6-Oct-06,74.42,75.04,73.81,74.22,16562300\n5-Oct-06,74.53,76.16,74.13,74.83,22806900\n4-Oct-06,74.10,75.46,73.16,75.38,28905900\n3-Oct-06,74.45,74.95,73.19,74.08,27915900\n2-Oct-06,75.10,75.87,74.30,74.86,24922400\n29-Sep-06,77.11,77.52,76.68,76.98,14299000\n28-Sep-06,77.02,77.48,75.95,77.01,25504600\n27-Sep-06,77.17,77.47,75.82,76.41,28366300\n26-Sep-06,76.18,77.78,76.10,77.61,38874100\n25-Sep-06,73.81,75.86,73.72,75.75,30338100\n22-Sep-06,74.29,74.34,72.58,73.00,23709800\n21-Sep-06,75.25,76.06,74.02,74.65,28252900\n20-Sep-06,74.37,75.68,74.22,75.26,29205400\n19-Sep-06,74.10,74.36,72.80,73.77,24712600\n18-Sep-06,73.80,74.86,73.30,73.89,24973400\n15-Sep-06,74.60,74.98,73.29,74.10,34498500\n14-Sep-06,73.72,74.67,73.46,74.17,28521200\n13-Sep-06,72.85,74.32,72.30,74.20,40812700\n12-Sep-06,72.81,73.45,71.45,72.63,59984900\n11-Sep-06,72.43,73.73,71.42,72.50,33725100\n8-Sep-06,73.37,73.57,71.91,72.52,31990600\n7-Sep-06,70.60,73.48,70.25,72.80,45148700\n6-Sep-06,71.08,71.69,69.70,70.03,34028500\n5-Sep-06,68.97,71.50,68.55,71.48,35919400\n1-Sep-06,68.48,68.65,67.82,68.38,14509600\n31-Aug-06,67.28,68.30,66.66,67.85,20451900\n30-Aug-06,67.34,67.82,66.68,66.96,24233300\n29-Aug-06,66.99,67.26,65.12,66.48,33615900\n28-Aug-06,68.50,68.61,66.68,66.98,26300300\n25-Aug-06,67.34,69.05,67.31,68.75,19338600\n24-Aug-06,67.89,68.19,66.27,67.81,23274900\n23-Aug-06,68.00,68.65,66.94,67.31,18992400\n22-Aug-06,66.68,68.32,66.50,67.62,20071300\n21-Aug-06,67.30,67.31,66.15,66.56,18655800\n18-Aug-06,67.71,68.40,67.26,67.91,19060100\n17-Aug-06,68.00,68.66,67.18,67.59,20335400\n16-Aug-06,67.10,68.07,66.33,67.98,27494000\n15-Aug-06,65.34,66.50,64.80,66.45,30574000\n14-Aug-06,64.05,65.22,63.60,63.94,25585400\n11-Aug-06,63.23,64.13,62.58,63.65,27559100\n10-Aug-06,63.25,64.81,62.70,64.07,24898300\n9-Aug-06,65.43,65.60,63.40,63.59,33906600\n8-Aug-06,67.09,67.11,64.51,64.78,35382700\n7-Aug-06,67.72,69.60,66.31,67.21,44404600\n4-Aug-06,67.05,68.61,64.96,68.30,65807700\n3-Aug-06,67.91,70.00,67.81,69.59,29917900\n2-Aug-06,67.65,68.68,67.51,68.16,19443600\n1-Aug-06,67.22,67.93,65.94,67.18,25299800\n31-Jul-06,66.83,68.63,66.28,67.96,31317800\n28-Jul-06,63.94,65.68,63.50,65.59,24602500\n27-Jul-06,64.50,65.02,62.86,63.40,26177200\n26-Jul-06,62.00,64.64,61.68,63.87,31856500\n25-Jul-06,61.78,62.09,60.78,61.93,20966100\n24-Jul-06,61.26,62.10,60.43,61.42,25214500\n21-Jul-06,59.82,61.15,59.64,60.72,31776600\n20-Jul-06,60.96,61.59,59.72,60.50,69899500\n19-Jul-06,52.96,55.08,52.36,54.10,40074700\n18-Jul-06,53.16,53.85,51.85,52.90,35594200\n17-Jul-06,51.73,53.11,51.65,52.37,36515800\n14-Jul-06,52.50,52.89,50.16,50.67,35322000\n13-Jul-06,52.03,54.12,51.41,52.25,44460000\n12-Jul-06,55.17,55.24,52.92,52.96,32832100\n"
  },
  {
    "path": "examples/stockserver/AMZN.csv",
    "content": "﻿Date,Open,High,Low,Close,Volume\n9-Jul-12,225.00,226.00,223.45,225.05,1921979\n6-Jul-12,226.35,228.90,224.18,225.05,3203230\n5-Jul-12,228.62,230.50,226.53,227.06,2683610\n3-Jul-12,229.14,229.53,227.59,229.53,1335952\n2-Jul-12,229.30,229.34,226.34,229.32,2330930\n29-Jun-12,224.70,228.35,223.71,228.35,3615572\n28-Jun-12,223.92,224.62,218.75,221.31,2995338\n27-Jun-12,225.01,227.50,223.30,225.62,2799580\n26-Jun-12,221.45,226.39,221.45,225.61,3755034\n25-Jun-12,220.30,221.59,218.00,220.07,2382265\n22-Jun-12,221.83,222.51,219.35,222.16,2188063\n21-Jun-12,223.84,226.03,220.52,220.58,2843130\n20-Jun-12,224.51,224.74,220.84,223.02,2445774\n19-Jun-12,223.26,225.20,221.66,224.03,2716819\n18-Jun-12,217.28,223.76,216.73,222.66,3371446\n15-Jun-12,215.29,219.33,214.46,218.35,3788005\n14-Jun-12,215.26,216.50,212.56,214.45,3060973\n13-Jun-12,215.52,217.38,213.52,214.73,2326254\n12-Jun-12,217.65,218.00,214.52,216.42,2833765\n11-Jun-12,217.49,220.87,215.20,216.50,3749085\n8-Jun-12,218.61,219.42,216.66,218.48,2876904\n7-Jun-12,219.65,221.49,218.11,218.80,3505416\n6-Jun-12,214.63,218.40,214.52,217.64,2715054\n5-Jun-12,213.85,216.86,211.16,213.21,3546441\n4-Jun-12,207.40,215.35,206.37,214.57,4302341\n1-Jun-12,208.44,211.23,207.30,208.22,3953691\n31-May-12,209.48,213.79,207.11,212.91,4944924\n30-May-12,212.14,212.98,207.75,209.23,4085414\n29-May-12,214.30,216.55,212.29,214.75,2695938\n25-May-12,214.99,215.98,212.22,212.89,2171364\n24-May-12,216.98,217.66,212.70,215.24,3141496\n23-May-12,214.71,217.55,211.18,217.28,4243774\n22-May-12,218.31,218.87,213.96,215.33,3733844\n21-May-12,214.03,219.98,212.82,218.11,3580096\n18-May-12,219.41,219.63,212.81,213.85,5233522\n17-May-12,225.05,226.00,218.09,218.36,4507911\n16-May-12,225.00,228.00,222.50,224.06,5261956\n15-May-12,226.50,230.61,223.00,224.39,5716858\n14-May-12,225.60,227.29,222.51,222.93,3096794\n11-May-12,225.95,230.68,225.73,227.68,4195541\n10-May-12,223.91,229.08,221.95,226.69,4648359\n9-May-12,220.59,225.78,220.16,222.98,3713431\n8-May-12,223.15,225.39,218.20,223.90,4523044\n7-May-12,222.36,226.87,222.29,225.16,3314226\n4-May-12,227.80,229.72,223.74,223.99,4587893\n3-May-12,229.74,232.53,228.03,229.45,4057859\n2-May-12,227.82,231.44,227.40,230.25,4593971\n1-May-12,229.40,232.97,228.40,230.04,6757217\n30-Apr-12,223.95,233.84,223.05,231.90,9766512\n27-Apr-12,224.83,228.69,220.22,226.85,22112329\n26-Apr-12,193.57,196.36,193.02,195.99,10233980\n25-Apr-12,191.67,194.80,191.60,194.42,3958413\n24-Apr-12,188.68,190.70,186.51,190.33,3381850\n23-Apr-12,188.99,188.99,185.51,188.24,3481356\n20-Apr-12,192.34,193.48,189.80,189.98,3243745\n19-Apr-12,192.93,194.55,189.75,191.10,4003037\n18-Apr-12,188.82,193.45,188.74,191.07,4003095\n17-Apr-12,187.21,190.04,186.87,188.39,2829460\n16-Apr-12,189.01,189.47,183.65,185.50,4044271\n13-Apr-12,189.90,189.94,186.26,188.46,3432203\n12-Apr-12,188.06,192.26,185.61,190.69,4028910\n11-Apr-12,189.63,191.97,186.79,187.97,4338218\n10-Apr-12,192.75,193.52,186.57,186.98,4455491\n9-Apr-12,192.02,194.20,190.50,191.87,3136878\n5-Apr-12,193.55,196.03,193.55,194.39,3217777\n4-Apr-12,196.95,197.68,192.36,193.99,5459483\n3-Apr-12,198.24,202.39,197.50,199.66,5000080\n2-Apr-12,198.02,199.90,197.00,198.05,6430730\n30-Mar-12,205.02,206.85,201.87,202.51,4440996\n29-Mar-12,201.28,205.31,200.63,204.61,5711525\n28-Mar-12,206.14,207.00,200.31,201.16,6246236\n27-Mar-12,203.59,209.85,202.88,205.44,9600734\n26-Mar-12,196.48,202.97,195.50,202.87,7620695\n23-Mar-12,192.01,196.20,191.80,195.04,5984094\n22-Mar-12,190.54,194.06,190.26,192.40,3740279\n21-Mar-12,192.50,194.28,191.26,191.73,4215499\n20-Mar-12,184.88,194.41,182.88,192.33,9167308\n19-Mar-12,183.45,186.68,183.00,185.52,3904019\n16-Mar-12,183.28,185.68,182.35,185.05,4934824\n15-Mar-12,182.02,184.43,180.30,184.43,4160618\n14-Mar-12,183.65,184.32,181.14,182.26,3699734\n13-Mar-12,183.92,184.87,180.77,184.59,4404299\n12-Mar-12,184.13,185.40,182.20,183.39,2588002\n9-Mar-12,186.79,187.20,183.44,184.32,4510556\n8-Mar-12,184.17,188.38,183.80,187.64,4223589\n7-Mar-12,182.65,185.50,182.40,183.77,4951927\n6-Mar-12,178.68,183.50,178.04,181.09,5614085\n5-Mar-12,179.00,181.82,178.18,180.26,4684257\n2-Mar-12,179.48,181.84,178.92,179.30,3658009\n1-Mar-12,179.89,180.49,176.58,180.04,4938425\n29-Feb-12,183.89,184.00,179.01,179.69,5302508\n28-Feb-12,178.90,184.29,177.95,183.80,5764907\n27-Feb-12,177.54,179.19,176.50,178.53,3707942\n24-Feb-12,179.70,180.74,178.37,179.13,3669165\n23-Feb-12,179.64,180.75,176.96,178.89,5157465\n22-Feb-12,181.95,182.99,180.29,180.58,5786428\n21-Feb-12,182.65,184.75,180.58,182.26,6758962\n17-Feb-12,180.09,183.41,179.36,182.50,7418563\n16-Feb-12,177.79,181.68,175.14,179.93,12565470\n15-Feb-12,191.29,191.54,183.26,184.47,7802059\n14-Feb-12,191.08,193.57,186.10,191.30,9534544\n13-Feb-12,187.17,192.50,185.68,191.59,6073565\n10-Feb-12,183.42,187.63,182.52,185.54,5798484\n9-Feb-12,184.50,185.69,181.76,184.98,7189994\n8-Feb-12,184.95,186.49,182.91,185.48,5477425\n7-Feb-12,182.65,184.94,182.06,184.19,5104453\n6-Feb-12,186.28,186.56,182.92,183.14,5311645\n3-Feb-12,182.83,187.90,181.89,187.68,8122732\n2-Feb-12,179.65,181.94,176.80,181.72,8738896\n1-Feb-12,173.81,179.95,172.00,179.46,21341033\n31-Jan-12,194.00,195.63,189.70,194.44,12772139\n30-Jan-12,193.68,195.00,190.13,192.15,5430039\n27-Jan-12,193.09,196.50,192.33,195.37,4663070\n26-Jan-12,189.30,194.85,188.73,193.32,5878847\n25-Jan-12,186.99,188.17,184.61,187.80,4308183\n24-Jan-12,185.00,188.41,183.82,187.00,4681086\n23-Jan-12,190.79,191.73,185.23,186.09,4587694\n20-Jan-12,190.71,192.90,189.04,190.93,5610542\n19-Jan-12,190.88,195.94,190.36,194.45,7100003\n18-Jan-12,181.94,190.25,181.12,189.44,7477287\n17-Jan-12,180.15,183.30,178.51,181.66,5645244\n13-Jan-12,178.42,178.42,178.42,178.42,0\n12-Jan-12,179.42,179.49,175.75,175.93,5388353\n11-Jan-12,179.64,180.77,178.19,178.90,3102877\n10-Jan-12,181.10,182.40,177.10,179.34,3986102\n9-Jan-12,182.76,184.37,177.00,178.56,5058542\n6-Jan-12,178.07,184.65,177.50,182.61,7010139\n5-Jan-12,175.94,178.25,174.05,177.61,3810496\n4-Jan-12,179.21,180.50,176.06,177.51,4206624\n3-Jan-12,175.89,179.48,175.55,179.03,5111970\n30-Dec-11,173.10,173.10,173.10,173.10,0\n29-Dec-11,169.62,174.55,166.97,173.86,8212559\n28-Dec-11,176.39,176.65,172.28,173.89,3660008\n27-Dec-11,177.73,178.59,176.16,176.27,2951104\n23-Dec-11,177.34,177.34,177.34,177.34,0\n22-Dec-11,175.09,179.67,174.21,179.03,4696272\n21-Dec-11,181.92,183.50,172.49,174.35,8068732\n20-Dec-11,182.69,183.17,180.54,182.52,4600597\n19-Dec-11,182.00,183.17,179.00,179.33,4535016\n16-Dec-11,182.42,184.41,180.31,181.26,6665197\n15-Dec-11,182.05,184.80,179.53,181.26,7260281\n14-Dec-11,179.00,180.75,170.25,180.21,11616875\n13-Dec-11,188.56,189.68,178.50,180.51,9306288\n12-Dec-11,190.03,191.15,187.63,189.52,4344146\n9-Dec-11,191.21,193.95,188.40,193.03,5159276\n8-Dec-11,193.57,195.89,190.08,190.48,4361514\n7-Dec-11,191.03,196.71,189.12,195.32,6428567\n6-Dec-11,195.98,198.32,190.11,191.99,5203688\n5-Dec-11,198.86,199.00,193.67,196.24,5922598\n2-Dec-11,197.07,199.66,195.18,196.03,7526348\n1-Dec-11,191.85,198.08,191.59,197.13,7330072\n30-Nov-11,194.76,195.30,188.75,192.29,7718451\n29-Nov-11,194.78,195.50,187.30,188.39,6577462\n28-Nov-11,191.65,194.62,190.54,194.15,7207253\n25-Nov-11,190.41,190.83,181.51,182.40,4971977\n23-Nov-11,188.99,188.99,188.99,188.99,0\n22-Nov-11,186.95,194.04,183.58,192.34,9919367\n21-Nov-11,193.29,193.36,185.05,189.25,11323532\n18-Nov-11,205.33,205.34,197.11,197.14,8438477\n17-Nov-11,212.51,212.90,202.10,204.52,7985182\n16-Nov-11,216.27,216.97,211.23,211.99,5510208\n15-Nov-11,218.00,220.33,214.26,217.83,5739106\n14-Nov-11,215.65,222.35,214.25,218.93,6522901\n11-Nov-11,212.52,217.88,210.31,217.39,5165571\n10-Nov-11,213.50,214.06,208.10,210.79,5044864\n9-Nov-11,214.95,215.70,210.60,211.22,4685124\n8-Nov-11,219.20,219.35,215.21,217.99,3917258\n7-Nov-11,216.84,220.20,214.00,217.00,3860758\n4-Nov-11,217.65,218.23,214.33,216.48,4066890\n3-Nov-11,216.30,218.50,213.02,218.29,5317497\n2-Nov-11,215.55,216.79,212.72,215.62,6133127\n1-Nov-11,208.11,216.21,207.43,212.10,8516210\n31-Oct-11,215.79,218.89,213.04,213.51,7352676\n28-Oct-11,206.53,218.40,205.75,217.32,9886256\n27-Oct-11,204.26,208.60,201.10,206.78,10776025\n26-Oct-11,203.69,207.58,196.51,198.40,24140922\n25-Oct-11,238.59,239.01,225.89,227.15,14012593\n24-Oct-11,236.02,240.47,234.00,237.61,4976877\n21-Oct-11,236.91,237.00,230.60,234.78,4572980\n20-Oct-11,232.13,234.74,229.80,233.61,4526838\n19-Oct-11,240.67,243.33,229.25,231.53,6715807\n18-Oct-11,242.31,244.61,236.62,243.88,4612859\n17-Oct-11,244.29,246.71,240.67,242.33,4778929\n14-Oct-11,240.87,246.71,240.18,246.71,5927282\n13-Oct-11,237.00,239.68,235.23,236.15,4841536\n12-Oct-11,236.64,241.84,234.33,236.81,6511045\n11-Oct-11,230.60,236.75,229.00,235.48,5005722\n10-Oct-11,226.23,232.80,224.10,231.32,5145525\n7-Oct-11,222.48,227.90,218.41,224.74,6786465\n6-Oct-11,220.28,223.62,217.55,221.51,6850357\n5-Oct-11,212.53,220.17,208.48,219.50,6512936\n4-Oct-11,209.62,215.00,200.43,212.50,8715811\n3-Oct-11,217.01,221.60,211.39,211.98,6625118\n30-Sep-11,218.19,223.00,215.21,216.23,6553621\n29-Sep-11,234.17,234.30,216.29,222.44,9380228\n28-Sep-11,226.35,235.81,225.60,229.71,14439111\n27-Sep-11,234.22,234.75,222.40,224.21,7840914\n26-Sep-11,227.48,230.24,221.40,229.85,5794703\n23-Sep-11,220.51,224.49,219.06,223.61,6469239\n22-Sep-11,224.72,228.79,219.00,223.23,8255563\n21-Sep-11,234.51,240.52,231.81,231.87,5884096\n20-Sep-11,240.80,241.05,231.03,233.25,7385251\n19-Sep-11,237.11,244.00,232.88,241.69,8223270\n16-Sep-11,227.57,240.44,226.74,239.30,11760132\n15-Sep-11,223.99,227.20,221.25,226.78,5610172\n14-Sep-11,220.22,224.99,216.72,222.57,5884384\n13-Sep-11,217.79,219.95,215.01,219.53,4836596\n12-Sep-11,208.75,216.66,208.65,216.56,5343529\n9-Sep-11,215.05,216.96,209.75,211.39,4576477\n8-Sep-11,218.30,220.64,216.34,217.26,4405196\n7-Sep-11,218.80,220.19,214.22,219.90,5302955\n6-Sep-11,204.77,216.60,204.47,216.18,6217185\n2-Sep-11,208.94,210.69,207.00,210.00,4237270\n1-Sep-11,215.28,217.64,211.62,212.54,5276688\n31-Aug-11,212.27,216.17,211.35,215.23,7406344\n30-Aug-11,205.78,212.49,204.32,210.92,5919660\n29-Aug-11,202.82,206.67,202.55,206.53,4515202\n26-Aug-11,191.24,199.72,189.60,199.27,5310620\n25-Aug-11,194.41,196.99,191.07,192.03,3760329\n24-Aug-11,193.89,196.31,190.17,193.73,6252998\n23-Aug-11,178.92,194.84,178.52,193.55,7352930\n22-Aug-11,182.83,184.20,177.10,177.54,5314812\n19-Aug-11,180.29,190.00,177.55,178.93,7248437\n18-Aug-11,191.21,191.34,179.72,182.52,8280385\n17-Aug-11,198.53,199.60,193.74,195.93,3991541\n16-Aug-11,201.14,201.39,194.75,197.68,5209051\n15-Aug-11,202.06,205.28,198.32,202.95,4785864\n12-Aug-11,200.28,204.56,197.21,202.30,5620580\n11-Aug-11,197.01,200.85,191.36,198.36,7404618\n10-Aug-11,200.76,202.40,193.60,194.13,8757585\n9-Aug-11,0.00,205.09,190.46,205.09,10497215\n8-Aug-11,196.40,200.39,190.05,193.70,10431184\n5-Aug-11,204.67,207.32,194.84,202.70,10024461\n4-Aug-11,206.73,208.00,201.45,201.48,6584935\n3-Aug-11,209.48,214.83,205.54,209.96,8199706\n2-Aug-11,220.32,222.43,211.30,211.70,6588846\n1-Aug-11,225.00,227.45,217.66,221.32,5792926\n29-Jul-11,221.29,225.75,219.51,222.52,5170390\n28-Jul-11,223.27,225.95,220.23,223.90,5355607\n27-Jul-11,224.39,227.20,219.62,222.52,12956323\n26-Jul-11,214.99,215.60,210.35,214.18,9863579\n25-Jul-11,215.49,216.08,213.00,213.49,3346669\n22-Jul-11,213.86,217.95,211.11,216.52,3599944\n21-Jul-11,216.74,217.09,211.07,213.21,4546082\n20-Jul-11,220.05,220.20,214.41,215.55,3375432\n19-Jul-11,213.77,218.40,213.77,218.06,4438956\n18-Jul-11,212.53,213.39,208.29,211.53,2900565\n15-Jul-11,213.08,214.53,209.29,212.87,4075383\n14-Jul-11,213.58,215.91,209.38,210.38,3904926\n13-Jul-11,214.70,216.83,212.14,213.50,4231702\n12-Jul-11,214.64,215.65,211.12,211.23,3987227\n11-Jul-11,216.74,217.50,211.00,212.55,4034763\n8-Jul-11,214.30,218.32,213.25,218.28,3708086\n7-Jul-11,215.09,217.80,215.09,216.74,3145960\n6-Jul-11,212.12,214.40,211.01,214.19,2607964\n5-Jul-11,208.76,214.45,208.73,213.19,3586281\n1-Jul-11,209.49,209.49,209.49,209.49,0\n30-Jun-11,200.78,205.20,200.50,204.49,4451250\n29-Jun-11,202.67,206.25,201.03,204.18,4609723\n28-Jun-11,201.92,202.88,200.60,202.35,3825988\n27-Jun-11,194.50,202.58,194.03,201.25,6101849\n24-Jun-11,193.88,194.92,191.35,192.55,3616647\n23-Jun-11,189.50,194.46,188.30,194.16,4615173\n22-Jun-11,193.96,195.20,191.32,191.63,3134854\n21-Jun-11,188.30,195.00,187.12,194.23,4183501\n20-Jun-11,185.96,188.85,185.57,187.72,2834166\n17-Jun-11,186.51,187.39,184.64,186.37,6328369\n16-Jun-11,185.74,187.00,181.59,183.65,6032134\n15-Jun-11,188.04,192.45,185.30,185.98,6318168\n14-Jun-11,188.99,190.72,187.07,189.96,3960596\n13-Jun-11,186.81,189.31,184.86,186.29,3870110\n10-Jun-11,189.25,190.77,186.28,186.53,3763319\n9-Jun-11,189.74,191.76,185.71,189.68,4187248\n8-Jun-11,187.45,189.81,186.32,188.05,3717299\n7-Jun-11,185.72,190.63,185.52,187.55,4867038\n6-Jun-11,188.66,189.85,185.18,185.69,3713215\n3-Jun-11,191.23,193.21,187.62,188.32,4975621\n2-Jun-11,192.28,194.44,190.56,193.65,3045560\n1-Jun-11,196.06,197.26,192.05,192.40,3449408\n31-May-11,195.94,198.44,195.03,196.69,3412945\n27-May-11,194.13,194.13,194.13,194.13,0\n26-May-11,191.24,196.45,190.88,195.00,4075276\n25-May-11,193.57,194.35,191.14,192.26,4661207\n24-May-11,197.00,197.00,193.00,193.27,2972667\n23-May-11,195.56,197.29,192.02,196.22,4230523\n20-May-11,197.95,199.80,197.24,198.65,3382021\n19-May-11,198.33,199.95,197.55,198.80,3702622\n18-May-11,194.13,198.28,193.25,197.09,4958993\n17-May-11,191.82,195.98,191.76,194.81,7077636\n16-May-11,200.54,200.90,191.37,192.51,9389688\n13-May-11,205.70,206.39,202.36,202.56,4126181\n12-May-11,204.22,206.19,200.62,206.07,4820690\n11-May-11,203.12,205.50,202.25,204.38,4813424\n10-May-11,201.94,205.29,201.56,203.94,5891767\n9-May-11,198.34,202.36,196.78,200.80,5826058\n6-May-11,199.10,199.56,196.56,197.60,4017937\n5-May-11,198.66,201.00,196.12,197.11,4638222\n4-May-11,198.25,201.86,195.37,199.97,6551399\n3-May-11,201.00,202.59,196.69,198.45,6053289\n2-May-11,196.57,203.42,196.18,201.19,9399303\n29-Apr-11,194.38,196.59,193.78,195.81,6640873\n28-Apr-11,195.96,196.79,192.27,195.07,7277475\n27-Apr-11,183.20,197.80,182.75,196.63,23622949\n26-Apr-11,186.27,186.42,180.74,182.30,11240571\n25-Apr-11,185.65,186.35,183.77,185.42,3439714\n21-Apr-11,185.89,185.89,185.89,185.89,0\n20-Apr-11,181.62,185.00,181.59,183.87,4068097\n19-Apr-11,178.35,179.47,176.60,178.82,2647483\n18-Apr-11,178.38,178.91,175.37,178.34,4617288\n15-Apr-11,181.00,181.78,179.02,180.01,4272899\n14-Apr-11,181.39,182.08,179.36,181.82,3589689\n13-Apr-11,180.83,182.88,179.80,182.29,4228310\n12-Apr-11,183.06,184.59,179.42,180.48,5340273\n11-Apr-11,183.76,183.76,183.76,183.76,0\n8-Apr-11,185.26,186.22,182.78,184.71,3727206\n7-Apr-11,182.78,185.17,181.76,184.91,4565547\n6-Apr-11,182.97,182.97,182.97,182.97,0\n5-Apr-11,182.10,186.36,181.80,185.29,5570058\n4-Apr-11,181.04,181.04,181.04,181.04,0\n1-Apr-11,181.58,183.25,178.59,180.13,5686427\n31-Mar-11,179.31,181.57,178.50,180.13,4828345\n30-Mar-11,177.78,181.16,177.66,179.42,6860586\n29-Mar-11,170.73,174.84,170.07,174.62,4887443\n28-Mar-11,171.80,172.50,169.25,169.35,3400936\n25-Mar-11,171.64,173.49,170.30,170.98,4294302\n24-Mar-11,168.21,172.00,167.36,171.10,6286823\n23-Mar-11,162.30,166.26,160.82,165.32,4723630\n22-Mar-11,164.07,164.44,162.25,162.60,3612926\n21-Mar-11,164.62,164.62,164.62,164.62,0\n18-Mar-11,161.19,163.54,160.59,161.82,7449926\n17-Mar-11,165.91,166.30,160.78,160.97,6472880\n16-Mar-11,164.70,168.14,162.87,164.70,5214642\n15-Mar-11,161.39,166.88,160.76,165.08,4937326\n14-Mar-11,166.60,168.08,164.57,166.73,4023987\n11-Mar-11,165.50,169.20,164.12,168.07,4607082\n10-Mar-11,167.07,168.47,164.82,166.14,6000454\n9-Mar-11,166.67,169.75,163.90,169.05,7109627\n8-Mar-11,169.39,169.71,166.72,166.89,4223893\n7-Mar-11,171.92,172.09,166.24,169.08,5933430\n4-Mar-11,172.62,172.75,169.51,171.67,4924495\n3-Mar-11,173.71,174.46,172.05,172.79,4139104\n2-Mar-11,169.09,173.30,168.35,172.02,5186388\n1-Mar-11,173.53,173.96,168.67,169.44,5847443\n28-Feb-11,173.91,175.89,172.15,173.29,6788009\n25-Feb-11,178.95,180.75,177.10,177.24,4194514\n24-Feb-11,176.86,179.75,174.56,177.75,4661140\n23-Feb-11,180.25,181.15,174.39,176.68,5487837\n22-Feb-11,183.68,184.72,179.32,180.42,5639604\n18-Feb-11,186.50,186.50,186.50,186.50,0\n17-Feb-11,185.77,189.09,185.31,187.76,3426374\n16-Feb-11,189.77,190.00,186.35,186.62,4633082\n15-Feb-11,189.56,189.56,189.56,189.56,0\n14-Feb-11,189.25,191.40,188.35,190.42,4070689\n11-Feb-11,185.56,189.50,185.37,189.25,4497699\n10-Feb-11,184.39,187.24,183.60,186.21,5332604\n9-Feb-11,183.15,186.47,182.26,185.30,8315841\n8-Feb-11,176.66,183.11,176.59,183.06,7802311\n7-Feb-11,176.15,177.55,174.77,176.43,5256698\n4-Feb-11,174.00,177.19,173.75,175.93,4352491\n3-Feb-11,173.50,174.67,171.95,173.71,3681259\n2-Feb-11,171.42,175.20,170.87,173.53,4551448\n1-Feb-11,170.52,173.10,169.51,172.11,5089748\n31-Jan-11,170.16,171.44,167.41,169.64,6721545\n28-Jan-11,171.45,173.71,166.90,171.14,19914851\n27-Jan-11,177.48,185.00,177.31,184.45,14594320\n26-Jan-11,177.51,177.89,174.63,175.39,3762167\n25-Jan-11,175.50,176.75,174.28,176.70,4653276\n24-Jan-11,177.95,178.49,174.15,176.85,5602345\n21-Jan-11,181.22,181.22,181.22,181.22,0\n20-Jan-11,185.29,186.85,181.00,181.96,5717568\n19-Jan-11,190.90,191.00,186.21,186.87,3889410\n18-Jan-11,191.42,191.42,191.42,191.42,0\n14-Jan-11,188.75,188.75,188.75,188.75,0\n13-Jan-11,183.60,186.45,183.51,185.53,3368768\n12-Jan-11,185.36,185.38,183.30,184.08,2679087\n11-Jan-11,185.42,186.00,183.21,184.34,2815814\n10-Jan-11,185.04,185.29,182.51,184.68,3376678\n7-Jan-11,187.88,188.45,183.74,185.49,5222815\n6-Jan-11,186.50,187.41,185.25,185.86,3179610\n5-Jan-11,185.86,185.86,185.86,185.86,0\n4-Jan-11,186.15,187.70,183.78,185.01,5034775\n3-Jan-11,181.37,186.00,181.21,184.22,5333813\n31-Dec-10,180.80,180.80,180.80,180.80,0\n30-Dec-10,183.92,184.55,182.75,182.75,1961549\n29-Dec-10,181.80,184.35,180.41,183.37,3122379\n28-Dec-10,182.10,182.77,181.05,181.09,1975718\n27-Dec-10,181.90,183.14,180.45,182.14,2249734\n23-Dec-10,182.59,182.59,182.59,182.59,0\n22-Dec-10,185.00,185.45,184.11,184.76,2580840\n21-Dec-10,183.88,185.65,182.60,184.75,5112753\n20-Dec-10,179.27,183.98,178.04,183.29,8735272\n17-Dec-10,178.41,178.75,177.02,177.58,4508074\n16-Dec-10,175.58,178.30,175.04,178.04,4123222\n15-Dec-10,173.72,179.00,173.59,175.57,5817620\n14-Dec-10,174.28,175.76,173.09,173.94,3689528\n13-Dec-10,176.33,177.94,173.73,174.25,4206511\n10-Dec-10,174.88,175.95,173.36,175.62,3566523\n9-Dec-10,177.77,178.11,173.80,174.85,4555974\n8-Dec-10,177.49,178.16,175.20,176.29,3735998\n7-Dec-10,180.50,181.47,176.57,176.77,5079928\n6-Dec-10,175.52,178.43,174.60,178.05,5663482\n3-Dec-10,175.50,176.40,174.05,175.68,4909659\n2-Dec-10,176.86,177.45,173.92,176.53,5541683\n1-Dec-10,179.16,179.32,176.00,176.55,5778757\n30-Nov-10,176.95,177.70,174.90,175.40,6767225\n29-Nov-10,179.99,181.84,177.57,179.49,9699540\n26-Nov-10,177.36,178.38,176.16,177.20,4272138\n24-Nov-10,177.25,177.25,177.25,177.25,0\n23-Nov-10,168.61,168.81,164.62,168.20,6472593\n22-Nov-10,165.10,170.60,165.00,170.39,6149610\n19-Nov-10,163.95,164.99,162.84,164.82,4466200\n18-Nov-10,160.74,165.00,160.74,164.17,6230844\n17-Nov-10,157.84,160.85,157.55,158.35,4527206\n16-Nov-10,158.74,160.91,156.77,157.78,6573783\n15-Nov-10,165.16,165.35,158.56,158.90,9648534\n12-Nov-10,170.12,171.26,165.05,165.68,7167318\n11-Nov-10,171.00,172.05,169.42,170.37,5697867\n10-Nov-10,170.59,173.37,169.41,173.33,5450045\n9-Nov-10,172.67,173.14,169.06,170.27,3980867\n8-Nov-10,170.01,173.20,168.78,171.99,5710955\n5-Nov-10,169.35,171.65,168.59,170.77,5218668\n4-Nov-10,169.86,172.53,168.40,168.93,7402048\n3-Nov-10,165.40,168.61,162.29,168.47,6119680\n2-Nov-10,163.75,165.94,163.36,164.61,4264710\n1-Nov-10,164.45,164.58,161.52,162.58,5245249\n29-Oct-10,165.80,168.50,164.81,165.23,4998465\n28-Oct-10,168.31,168.49,165.05,166.84,4688210\n27-Oct-10,168.91,169.75,166.54,167.51,5729134\n26-Oct-10,167.57,171.00,167.50,169.95,4693643\n25-Oct-10,171.57,171.99,168.32,169.00,6534224\n22-Oct-10,162.45,170.17,162.27,169.13,16322252\n21-Oct-10,162.67,166.13,161.29,164.97,13585342\n20-Oct-10,158.78,159.87,156.57,158.67,5790387\n19-Oct-10,160.68,162.80,157.00,158.67,7531854\n18-Oct-10,165.00,165.19,161.82,163.56,6338544\n15-Oct-10,158.42,164.88,156.75,164.64,10135456\n14-Oct-10,155.16,156.95,154.23,155.53,4032909\n13-Oct-10,156.69,156.79,153.85,155.17,5637813\n12-Oct-10,152.51,156.95,151.40,156.48,5289793\n11-Oct-10,154.89,156.63,152.34,153.03,4486390\n8-Oct-10,155.18,156.28,152.78,155.55,6922014\n7-Oct-10,156.51,157.40,153.39,156.27,4635900\n6-Oct-10,160.60,160.68,154.60,155.40,6060796\n5-Oct-10,157.08,161.21,157.01,160.87,5620928\n4-Oct-10,153.95,155.96,152.79,155.39,5354314\n1-Oct-10,157.08,157.44,152.20,153.71,8691126\n30-Sep-10,160.01,160.93,155.60,157.06,7606104\n29-Sep-10,159.03,161.78,157.75,158.99,7290539\n28-Sep-10,159.84,160.88,154.89,159.70,8494910\n27-Sep-10,160.22,161.20,157.88,159.37,6453678\n24-Sep-10,155.43,160.89,155.42,160.73,10590503\n23-Sep-10,151.20,155.92,150.97,152.85,7066939\n22-Sep-10,149.84,152.70,149.10,151.83,6618751\n21-Sep-10,150.76,153.31,149.60,150.73,7546662\n20-Sep-10,148.70,151.95,147.35,151.30,6456145\n17-Sep-10,148.90,148.98,146.50,148.32,7262649\n16-Sep-10,145.40,148.23,145.16,148.13,5826973\n15-Sep-10,144.88,145.62,143.56,145.45,4905675\n14-Sep-10,144.50,146.70,143.83,145.75,4323591\n13-Sep-10,144.07,145.74,143.76,145.07,5083219\n10-Sep-10,140.75,142.60,140.04,142.44,5044666\n9-Sep-10,140.39,141.37,139.26,140.38,4966544\n8-Sep-10,137.93,139.70,136.45,139.14,5832513\n7-Sep-10,137.56,138.60,136.89,137.22,3887333\n6-Sep-10,138.79,138.79,138.79,138.79,0\n3-Sep-10,138.79,138.79,138.79,138.79,0\n2-Sep-10,132.17,135.21,132.05,135.21,5407347\n1-Sep-10,126.36,132.60,126.17,132.49,7138237\n31-Aug-10,122.85,125.90,122.50,124.83,4226620\n30-Aug-10,126.03,126.95,123.69,123.79,3430965\n27-Aug-10,125.46,126.64,123.68,126.64,5080505\n26-Aug-10,127.15,127.49,124.82,124.86,4699222\n25-Aug-10,123.85,127.37,123.83,126.85,5346447\n24-Aug-10,125.41,125.44,123.75,124.53,5369619\n23-Aug-10,127.86,129.22,126.50,126.60,3867811\n20-Aug-10,127.20,128.04,126.02,127.76,4172548\n19-Aug-10,129.22,130.02,126.82,127.57,5582487\n18-Aug-10,129.25,130.81,128.87,129.65,7902371\n17-Aug-10,127.34,129.98,127.02,128.86,5045092\n16-Aug-10,123.61,127.37,123.61,126.07,4027614\n13-Aug-10,126.06,126.88,124.26,124.69,3983580\n12-Aug-10,123.76,127.00,123.75,126.56,4368459\n11-Aug-10,128.10,128.12,125.20,125.89,5542390\n10-Aug-10,127.95,130.00,127.38,130.00,5706813\n9-Aug-10,128.46,129.93,127.85,128.83,5087069\n6-Aug-10,126.72,128.40,125.90,128.32,5065977\n5-Aug-10,126.77,128.00,125.82,127.83,4282297\n4-Aug-10,123.06,128.47,123.00,127.58,9275063\n3-Aug-10,120.00,122.87,119.68,122.42,5962926\n2-Aug-10,119.15,120.38,117.57,120.07,5482619\n30-Jul-10,115.53,118.74,114.51,117.89,7083180\n29-Jul-10,117.99,118.87,115.52,116.86,6184850\n28-Jul-10,117.00,118.20,116.40,117.13,5472256\n27-Jul-10,118.43,118.50,115.07,117.13,7796020\n26-Jul-10,118.26,118.60,114.88,118.40,11137741\n23-Jul-10,105.92,119.28,105.80,118.87,42421074\n22-Jul-10,118.71,120.87,118.02,120.07,15003327\n21-Jul-10,120.62,121.25,117.26,117.43,5011618\n20-Jul-10,120.61,120.71,117.51,120.10,6785727\n19-Jul-10,118.38,120.74,117.00,119.94,5030817\n16-Jul-10,121.28,121.92,118.01,118.49,6227899\n15-Jul-10,120.13,122.48,119.26,122.06,6051125\n14-Jul-10,123.03,123.75,121.47,123.30,5257540\n13-Jul-10,120.69,124.88,120.30,123.65,7091088\n12-Jul-10,117.81,119.70,117.32,119.51,4783737\n9-Jul-10,116.55,117.40,114.65,117.26,4065036\n8-Jul-10,115.02,117.48,114.07,116.22,6776483\n7-Jul-10,109.84,113.63,109.81,113.43,4944961\n6-Jul-10,110.65,112.53,109.00,110.06,5219408\n5-Jul-10,109.14,109.14,109.14,109.14,0\n2-Jul-10,109.14,109.14,109.14,109.14,0\n1-Jul-10,108.90,111.69,106.70,110.96,8530344\n30-Jun-10,108.58,112.68,108.11,109.26,9740934\n29-Jun-10,116.26,116.48,106.01,108.61,12866217\n28-Jun-10,118.85,120.04,117.10,117.80,5612525\n25-Jun-10,118.14,121.76,117.63,121.00,5770282\n24-Jun-10,120.61,120.85,116.80,118.33,7771960\n23-Jun-10,122.11,123.22,120.04,121.45,5455131\n22-Jun-10,122.65,125.23,121.55,122.31,6207395\n21-Jun-10,126.79,127.48,121.41,122.55,5327679\n18-Jun-10,126.48,127.48,125.07,125.83,3840699\n17-Jun-10,126.74,127.80,124.69,125.89,3480029\n16-Jun-10,125.39,127.98,125.36,126.90,3964437\n15-Jun-10,123.20,126.92,122.50,126.84,4541551\n14-Jun-10,124.24,125.70,123.50,123.83,3922912\n11-Jun-10,121.39,123.53,120.29,123.03,4205811\n10-Jun-10,120.00,123.50,119.20,123.21,6061755\n9-Jun-10,120.31,121.47,117.36,117.91,7371717\n8-Jun-10,122.00,122.00,115.80,118.84,11517726\n7-Jun-10,125.84,126.61,121.67,122.01,6574503\n4-Jun-10,126.33,128.20,122.18,122.77,5497625\n3-Jun-10,126.25,129.15,124.85,128.76,5277304\n2-Jun-10,124.02,126.43,121.65,126.31,4764623\n1-Jun-10,124.97,126.57,123.02,123.24,3659489\n31-May-10,125.46,125.46,125.46,125.46,0\n28-May-10,125.46,125.46,125.46,125.46,0\n27-May-10,124.98,126.85,120.60,126.70,4748544\n26-May-10,125.05,125.79,122.30,123.21,6968764\n25-May-10,118.54,125.19,118.50,124.86,7121633\n24-May-10,122.57,124.50,120.65,122.12,4544265\n21-May-10,117.90,124.97,117.52,122.72,7968396\n20-May-10,122.64,125.00,118.78,119.71,8594302\n19-May-10,125.51,127.93,123.80,124.59,6464521\n18-May-10,130.14,131.25,125.51,126.28,5258767\n17-May-10,128.24,129.95,125.80,128.91,5642751\n14-May-10,130.36,131.00,126.76,128.53,5277824\n13-May-10,133.93,136.99,131.00,131.47,5940987\n12-May-10,131.41,134.13,129.68,133.87,5905373\n11-May-10,129.95,133.08,128.47,130.46,6047677\n10-May-10,129.73,132.21,129.26,131.29,6806846\n7-May-10,127.97,131.18,123.76,124.98,11936041\n6-May-10,130.00,132.33,120.60,128.71,10195596\n5-May-10,128.00,131.61,127.55,130.93,9462155\n4-May-10,135.62,135.81,128.38,129.83,12670239\n3-May-10,137.20,139.44,136.11,137.49,5662833\n30-Apr-10,141.40,141.40,136.91,137.10,6113453\n29-Apr-10,140.09,142.45,139.79,141.73,6314873\n28-Apr-10,142.59,142.75,138.69,139.35,9236364\n27-Apr-10,145.55,146.44,141.11,142.02,8641245\n26-Apr-10,143.20,147.73,142.90,147.11,9319997\n23-Apr-10,145.38,149.09,142.42,143.63,18981078\n22-Apr-10,147.01,151.09,145.88,150.09,15165734\n21-Apr-10,145.17,149.00,143.52,146.43,7374343\n20-Apr-10,143.83,144.64,142.10,144.20,4314512\n19-Apr-10,142.35,143.67,139.13,142.43,6023117\n16-Apr-10,144.88,147.17,141.45,142.17,8401062\n15-Apr-10,144.55,147.09,144.00,145.82,7831717\n14-Apr-10,140.34,144.50,139.20,144.28,7900274\n13-Apr-10,141.23,141.98,139.12,140.16,4787008\n12-Apr-10,140.00,142.92,139.68,141.20,5446461\n9-Apr-10,140.72,141.33,139.07,140.06,6014526\n8-Apr-10,134.71,141.25,134.71,140.96,12694329\n7-Apr-10,135.96,136.08,133.86,134.87,5947297\n6-Apr-10,131.23,136.00,131.18,135.56,7950439\n5-Apr-10,132.85,133.74,130.78,131.49,5817409\n2-Apr-10,131.81,131.81,131.81,131.81,0\n1-Apr-10,131.81,131.81,131.81,131.81,0\n31-Mar-10,136.00,136.80,134.48,135.77,4602196\n30-Mar-10,135.74,138.19,135.36,136.58,6202284\n29-Mar-10,135.37,136.63,134.33,135.12,4627668\n26-Mar-10,134.90,136.99,133.76,135.06,6575480\n25-Mar-10,129.14,136.91,128.04,134.73,16212627\n24-Mar-10,128.64,129.40,127.20,128.04,4703238\n23-Mar-10,130.89,130.94,128.07,129.26,4213607\n22-Mar-10,130.20,130.96,128.64,130.47,5383302\n19-Mar-10,133.71,133.71,129.66,130.35,8906225\n18-Mar-10,131.02,132.85,130.44,132.76,5024120\n17-Mar-10,132.41,132.69,131.22,131.34,4358962\n16-Mar-10,131.24,132.29,130.50,131.79,4136434\n15-Mar-10,131.70,132.00,128.63,131.13,6329310\n12-Mar-10,134.20,134.20,131.18,131.82,6151927\n11-Mar-10,130.45,133.62,130.36,133.58,7244668\n10-Mar-10,129.11,131.17,128.48,130.51,5627431\n9-Mar-10,129.59,130.81,127.97,128.82,6071029\n8-Mar-10,128.30,130.85,127.71,130.11,5607327\n5-Mar-10,129.13,129.45,127.07,128.91,6771126\n4-Mar-10,125.96,128.85,125.57,128.53,7509644\n3-Mar-10,125.40,126.94,124.43,125.89,6443021\n2-Mar-10,125.01,127.35,124.80,125.53,12098298\n1-Mar-10,118.85,124.66,117.53,124.54,13300501\n26-Feb-10,117.88,119.43,117.00,118.40,5721864\n25-Feb-10,118.17,118.34,115.85,118.20,9535889\n24-Feb-10,117.96,119.80,117.15,119.72,7393039\n23-Feb-10,118.01,119.25,116.51,117.24,7069011\n22-Feb-10,117.37,118.97,116.18,118.01,6809386\n19-Feb-10,117.91,119.09,117.00,117.52,7117494\n18-Feb-10,115.84,118.51,114.82,118.08,9807497\n17-Feb-10,117.08,117.13,115.55,116.31,8947449\n16-Feb-10,120.06,120.50,117.18,117.53,8938494\n15-Feb-10,119.66,119.66,119.66,119.66,0\n12-Feb-10,119.66,119.66,119.66,119.66,0\n11-Feb-10,117.21,120.42,116.50,120.09,8344469\n10-Feb-10,118.00,118.61,116.00,117.36,6236250\n9-Feb-10,118.20,119.09,117.00,118.03,9227158\n8-Feb-10,119.38,121.00,116.56,116.83,9898391\n5-Feb-10,115.88,117.65,114.10,117.39,11027086\n4-Feb-10,118.64,120.33,115.74,115.94,12783912\n3-Feb-10,117.12,119.61,116.56,119.10,12409012\n2-Feb-10,118.79,118.98,114.40,118.12,23084986\n1-Feb-10,123.18,124.86,113.82,118.87,37774317\n29-Jan-10,129.77,131.85,124.14,125.41,29478976\n28-Jan-10,124.43,127.20,122.80,126.03,27293062\n27-Jan-10,121.03,123.33,118.80,122.75,14765273\n26-Jan-10,120.56,122.98,119.06,119.48,9567607\n25-Jan-10,122.10,122.28,118.12,120.31,12031053\n22-Jan-10,125.60,127.67,120.76,121.43,11577818\n21-Jan-10,127.26,128.15,125.00,126.62,9976146\n20-Jan-10,127.13,129.20,125.08,125.78,9081533\n19-Jan-10,126.20,128.00,124.33,127.61,8900116\n18-Jan-10,127.14,127.14,127.14,127.14,0\n15-Jan-10,127.14,127.14,127.14,127.14,0\n14-Jan-10,129.14,130.38,126.40,127.35,9788435\n13-Jan-10,127.90,129.71,125.75,129.11,10727856\n12-Jan-10,128.99,129.82,126.55,127.35,9098190\n11-Jan-10,132.62,132.80,129.21,130.31,8786668\n8-Jan-10,130.56,133.68,129.03,133.52,9833829\n7-Jan-10,132.01,132.32,128.80,130.00,11030124\n6-Jan-10,134.60,134.73,131.65,132.25,7180977\n5-Jan-10,133.43,135.48,131.81,134.69,8856456\n4-Jan-10,136.25,136.61,133.14,133.90,7600543\n1-Jan-10,134.52,134.52,134.52,134.52,0\n31-Dec-09,134.52,134.52,134.52,134.52,0\n30-Dec-09,138.40,138.40,135.28,136.49,6917416\n29-Dec-09,141.29,142.58,138.55,139.41,8405872\n28-Dec-09,139.75,141.98,138.53,139.31,8769639\n25-Dec-09,138.47,138.47,138.47,138.47,0\n24-Dec-09,139.20,139.70,137.54,138.47,5128777\n23-Dec-09,134.80,139.05,134.35,138.94,9550603\n22-Dec-09,133.76,135.99,132.65,133.75,8257493\n21-Dec-09,130.48,133.20,130.19,132.79,9480258\n18-Dec-09,127.91,128.79,125.65,128.48,9605358\n17-Dec-09,129.36,130.08,126.90,126.91,8482959\n16-Dec-09,130.93,131.45,127.65,128.36,10261207\n15-Dec-09,130.76,132.46,129.59,130.23,7434131\n14-Dec-09,132.50,132.61,129.35,131.38,10022856\n11-Dec-09,136.07,136.29,133.20,134.15,8051364\n10-Dec-09,132.41,136.19,132.40,135.38,11349588\n9-Dec-09,134.60,134.71,129.82,131.31,12632819\n8-Dec-09,134.30,136.08,132.87,134.11,8006894\n7-Dec-09,138.00,139.00,133.84,134.21,7842080\n4-Dec-09,143.42,143.45,135.11,137.58,14830864\n3-Dec-09,143.62,145.91,140.77,141.17,16523480\n2-Dec-09,139.15,142.67,138.96,142.25,11797944\n1-Dec-09,136.94,139.35,135.75,138.50,9657579\n30-Nov-09,132.19,136.08,132.16,135.91,10127170\n27-Nov-09,130.30,133.00,129.88,131.74,4422567\n26-Nov-09,134.03,134.03,134.03,134.03,0\n25-Nov-09,133.31,134.20,132.40,134.03,5076447\n24-Nov-09,133.57,134.33,132.22,132.94,7319683\n23-Nov-09,131.05,133.00,131.00,133.00,6878046\n20-Nov-09,127.76,129.99,127.41,129.66,6655545\n19-Nov-09,130.54,130.54,128.48,128.99,6000582\n18-Nov-09,130.90,131.41,129.53,131.29,5217567\n17-Nov-09,131.40,131.85,129.32,131.25,7750892\n16-Nov-09,132.12,134.56,130.98,131.59,9018242\n13-Nov-09,131.16,132.99,129.75,132.97,7383213\n12-Nov-09,129.98,132.15,129.98,130.53,7212653\n11-Nov-09,131.08,131.31,128.33,129.91,7435623\n10-Nov-09,126.80,130.61,126.00,130.15,10532558\n9-Nov-09,127.11,128.32,125.59,126.67,8633579\n6-Nov-09,123.00,126.98,122.67,126.20,13229961\n5-Nov-09,117.46,120.95,116.25,120.61,9091150\n4-Nov-09,119.00,119.25,116.76,117.10,7617909\n3-Nov-09,117.67,118.88,116.63,118.37,9481397\n2-Nov-09,118.66,119.50,116.71,118.84,11281917\n30-Oct-09,121.97,122.90,118.21,118.81,13316374\n29-Oct-09,123.90,124.30,120.12,122.58,12820836\n28-Oct-09,121.57,125.12,120.76,121.64,16887612\n27-Oct-09,122.93,124.26,119.42,122.07,20304181\n26-Oct-09,119.21,125.68,118.49,124.64,32271172\n23-Oct-09,111.05,119.65,110.62,118.49,58305777\n22-Oct-09,93.66,94.10,91.70,93.45,16518488\n21-Oct-09,95.27,96.63,92.91,93.42,7761183\n20-Oct-09,95.91,96.10,94.27,94.98,7779453\n19-Oct-09,95.35,96.28,94.25,94.68,6019074\n16-Oct-09,95.30,96.12,93.61,95.32,7040171\n15-Oct-09,95.13,97.06,95.08,96.01,6247458\n14-Oct-09,96.22,97.82,96.02,97.46,5556728\n13-Oct-09,93.83,95.25,93.68,94.83,4721887\n12-Oct-09,96.17,96.25,93.07,93.60,5592819\n9-Oct-09,95.00,95.95,94.26,95.71,4696040\n8-Oct-09,94.80,96.72,94.23,95.22,9679473\n7-Oct-09,91.50,94.48,91.15,93.97,7446537\n6-Oct-09,89.33,91.08,88.40,90.91,6964194\n5-Oct-09,90.25,90.93,88.27,88.67,7030859\n2-Oct-09,90.05,91.14,89.58,89.85,5040763\n1-Oct-09,92.50,92.90,90.37,91.04,6645100\n30-Sep-09,92.26,94.17,91.43,93.36,8539171\n29-Sep-09,91.96,92.33,90.10,91.72,4395119\n28-Sep-09,91.04,92.81,90.60,92.21,3508883\n25-Sep-09,91.44,92.25,89.75,90.52,4257438\n24-Sep-09,92.00,92.71,90.77,92.11,5078653\n23-Sep-09,92.82,94.50,92.22,92.38,5667819\n22-Sep-09,91.46,94.19,91.10,93.75,8268508\n21-Sep-09,89.69,90.76,88.48,90.56,4211826\n18-Sep-09,90.74,91.00,89.47,90.28,6770503\n17-Sep-09,90.75,91.19,89.00,90.44,7873925\n16-Sep-09,85.91,90.98,85.90,90.70,13114218\n15-Sep-09,84.17,84.41,82.79,83.55,4453318\n14-Sep-09,83.81,84.57,83.46,83.86,3572198\n11-Sep-09,84.44,84.90,83.76,84.54,6008763\n10-Sep-09,82.33,84.07,82.30,83.85,7024878\n9-Sep-09,80.60,82.63,80.50,82.24,6776288\n8-Sep-09,79.86,81.04,78.87,80.90,7037954\n4-Sep-09,78.27,79.78,77.63,78.87,4672738\n3-Sep-09,78.39,78.96,77.51,78.46,4140403\n2-Sep-09,79.04,80.15,77.80,78.14,6521511\n1-Sep-09,80.74,82.42,79.00,79.16,6246458\n31-Aug-09,81.93,81.95,80.35,81.19,5263745\n28-Aug-09,84.78,84.99,82.57,82.76,4620727\n27-Aug-09,84.01,84.85,83.14,84.31,3998522\n26-Aug-09,84.10,84.76,83.38,84.00,3613748\n25-Aug-09,84.66,86.34,83.95,84.19,4794573\n24-Aug-09,85.17,85.59,84.24,84.50,4723379\n21-Aug-09,84.78,85.06,83.54,85.00,6131243\n20-Aug-09,82.98,84.35,82.66,84.09,5375542\n19-Aug-09,80.91,83.00,80.49,83.00,5173178\n18-Aug-09,81.41,82.69,80.79,82.12,5884830\n17-Aug-09,81.16,81.78,80.25,81.06,6890795\n14-Aug-09,84.11,84.17,82.78,83.58,4925497\n13-Aug-09,85.72,86.37,84.07,84.60,5714438\n12-Aug-09,83.42,86.60,83.38,85.96,5619570\n10-Aug-09,85.01,85.47,83.27,84.44,4440909\n7-Aug-09,84.10,85.96,84.10,85.32,5628191\n6-Aug-09,84.31,84.84,83.05,84.47,4693999\n5-Aug-09,85.64,85.75,83.02,84.29,7281546\n4-Aug-09,87.48,87.48,84.93,85.80,6180160\n3-Aug-09,86.56,88.20,86.56,87.44,6665594\n31-Jul-09,85.76,86.75,84.62,85.76,5887769\n30-Jul-09,85.64,87.25,85.17,86.09,7257205\n29-Jul-09,84.47,85.50,83.52,84.34,6504208\n28-Jul-09,83.84,85.64,82.60,84.98,8774874\n27-Jul-09,86.24,86.49,83.56,84.24,11282175\n24-Jul-09,87.60,88.90,85.50,86.49,19213472\n23-Jul-09,89.84,94.40,89.59,93.87,19162086\n22-Jul-09,88.65,89.23,87.78,88.79,5329527\n21-Jul-09,88.52,89.01,87.40,89.01,7728517\n20-Jul-09,86.27,88.88,86.26,88.23,6059709\n17-Jul-09,85.80,86.50,85.20,85.85,5061142\n16-Jul-09,84.42,86.24,83.72,86.11,5362602\n15-Jul-09,83.00,84.64,82.78,84.55,6340817\n14-Jul-09,81.48,82.42,80.42,81.95,4550911\n13-Jul-09,78.07,81.65,78.01,81.47,8051114\n10-Jul-09,77.52,78.82,76.17,77.63,5976111\n9-Jul-09,78.25,78.54,76.82,78.10,6359553\n8-Jul-09,76.46,77.93,75.70,77.36,8541112\n7-Jul-09,78.53,78.69,75.41,75.63,6491924\n6-Jul-09,78.45,78.89,76.54,78.10,7369682\n3-Jul-09,79.32,79.32,79.32,79.32,0\n2-Jul-09,81.11,81.37,78.51,79.32,7219034\n1-Jul-09,84.42,84.50,81.37,81.60,6981982\n30-Jun-09,83.62,84.92,82.47,83.66,7985047\n29-Jun-09,83.87,84.20,82.41,83.03,6271127\n26-Jun-09,81.90,84.14,81.13,83.88,8775789\n25-Jun-09,79.10,82.23,79.03,82.20,7359943\n24-Jun-09,78.00,80.53,77.80,79.27,6081398\n23-Jun-09,78.97,79.10,76.25,77.68,7415651\n22-Jun-09,82.41,82.43,78.56,79.15,9745956\n19-Jun-09,82.15,83.46,81.50,82.96,5441504\n18-Jun-09,82.81,82.95,81.00,81.60,5453159\n17-Jun-09,82.50,84.30,80.64,82.65,7785114\n16-Jun-09,83.70,83.95,81.28,82.15,5466890\n15-Jun-09,82.83,83.30,81.00,83.18,5401783\n12-Jun-09,85.03,85.20,82.01,84.08,6223054\n11-Jun-09,86.30,87.49,85.05,85.69,5013239\n10-Jun-09,87.58,88.56,84.83,86.59,6073764\n9-Jun-09,86.93,87.67,86.17,87.08,4476843\n8-Jun-09,86.75,87.18,85.11,86.36,5602729\n5-Jun-09,86.29,87.95,85.30,87.56,8263699\n4-Jun-09,85.42,86.40,84.57,85.52,5465857\n3-Jun-09,83.31,85.71,83.13,85.68,7604819\n2-Jun-09,82.42,85.45,82.10,84.93,9397696\n1-Jun-09,78.21,84.80,77.49,83.05,10799647\n29-May-09,77.72,78.01,76.40,77.99,5073328\n28-May-09,77.70,79.10,75.88,77.65,4943146\n27-May-09,78.51,79.50,76.75,77.10,5568781\n26-May-09,75.03,78.48,74.55,78.39,6705208\n22-May-09,76.10,77.04,75.02,75.64,3485111\n21-May-09,76.75,77.97,75.40,75.96,5641004\n20-May-09,78.50,81.11,77.42,77.97,7351038\n19-May-09,75.43,78.96,75.12,77.87,8028819\n18-May-09,73.96,75.96,73.10,75.95,6829332\n15-May-09,74.54,76.21,73.42,73.60,8011614\n14-May-09,73.79,76.06,73.31,75.11,9344465\n13-May-09,76.25,76.65,74.01,74.19,8773677\n12-May-09,78.70,78.97,76.53,77.93,5551172\n11-May-09,76.80,79.85,76.01,78.61,6874522\n8-May-09,79.69,80.23,76.31,77.95,8194521\n7-May-09,82.73,82.75,77.88,79.28,9634072\n6-May-09,82.88,83.60,79.66,81.99,8604502\n5-May-09,81.01,82.00,80.19,81.90,5874620\n4-May-09,80.26,81.35,78.85,79.77,7027040\n1-May-09,80.38,80.38,77.85,78.96,6122810\n30-Apr-09,80.93,82.67,79.89,80.52,8542850\n29-Apr-09,82.99,82.99,79.26,79.79,9735101\n28-Apr-09,82.68,85.35,82.40,82.40,7926273\n27-Apr-09,83.88,84.98,82.21,83.12,9708383\n24-Apr-09,82.03,86.68,80.73,84.46,23485530\n23-Apr-09,81.33,82.06,79.08,80.61,16187647\n22-Apr-09,78.17,82.18,77.81,79.20,8775429\n21-Apr-09,77.33,79.10,77.29,78.74,7163121\n20-Apr-09,78.44,79.79,76.83,77.57,8690862\n17-Apr-09,76.78,78.72,75.88,78.05,7428739\n16-Apr-09,75.33,77.48,75.16,77.25,7469329\n15-Apr-09,75.50,75.81,73.51,74.71,9414387\n14-Apr-09,78.00,79.46,76.94,77.22,6165530\n13-Apr-09,79.84,79.97,77.85,78.94,6214392\n10-Apr-09,79.77,79.77,79.77,79.77,0\n9-Apr-09,77.51,80.00,77.26,79.77,7082960\n8-Apr-09,75.93,77.11,74.57,76.98,5653014\n7-Apr-09,76.97,77.08,74.88,75.51,5751060\n6-Apr-09,77.26,78.36,76.00,77.99,5758168\n3-Apr-09,76.42,78.32,75.50,78.17,5799105\n2-Apr-09,73.63,77.24,73.44,76.34,11069015\n1-Apr-09,73.02,75.09,71.71,73.50,7048900\n31-Mar-09,72.61,74.50,72.12,73.44,8923797\n30-Mar-09,70.40,71.67,69.75,71.44,8378604\n27-Mar-09,71.61,72.29,70.10,70.52,8571349\n26-Mar-09,73.47,74.98,72.64,73.69,6659748\n25-Mar-09,73.09,73.95,69.84,72.40,7897334\n24-Mar-09,74.85,75.00,72.31,72.81,7459484\n23-Mar-09,71.36,75.61,70.70,75.58,8613864\n20-Mar-09,70.39,70.89,69.08,69.96,8469588\n19-Mar-09,71.40,71.91,69.24,70.10,8819453\n18-Mar-09,70.97,73.91,70.13,71.25,10404576\n17-Mar-09,67.37,71.70,67.00,71.35,11910404\n16-Mar-09,68.56,69.30,66.68,66.98,9437238\n13-Mar-09,69.64,69.74,67.53,68.63,8903580\n12-Mar-09,68.35,69.87,67.25,69.58,11351809\n11-Mar-09,66.24,69.37,65.27,68.54,13891363\n10-Mar-09,62.49,65.90,61.78,65.71,15437461\n9-Mar-09,62.20,64.03,60.15,60.49,13564557\n6-Mar-09,65.20,65.50,59.82,61.69,15094727\n5-Mar-09,64.12,65.80,63.60,64.77,11771989\n4-Mar-09,62.80,65.79,62.40,64.81,11960837\n3-Mar-09,62.75,63.29,61.30,61.70,9697477\n2-Mar-09,63.94,65.52,61.51,61.99,10513858\n27-Feb-09,61.26,65.08,60.94,64.79,11494196\n26-Feb-09,64.12,64.73,62.34,62.34,7276619\n25-Feb-09,64.90,65.75,62.82,63.71,9122419\n24-Feb-09,61.97,66.10,61.89,65.60,10273856\n23-Feb-09,64.16,64.91,61.52,61.71,7336458\n20-Feb-09,61.07,64.15,60.84,63.86,9354463\n19-Feb-09,62.84,64.18,61.67,61.95,6771257\n18-Feb-09,62.27,62.78,60.52,62.35,7367266\n17-Feb-09,61.67,62.65,61.18,61.67,7126838\n13-Feb-09,63.97,64.68,62.87,63.26,4131523\n12-Feb-09,63.25,64.25,61.71,63.96,8098434\n11-Feb-09,63.10,64.90,62.25,64.35,8350896\n10-Feb-09,66.15,67.23,63.07,63.31,10702601\n9-Feb-09,66.56,67.36,65.38,66.71,9445965\n6-Feb-09,63.18,67.00,63.18,66.55,12051276\n5-Feb-09,61.15,63.81,60.63,63.18,10172002\n4-Feb-09,63.38,63.44,60.83,61.06,13730438\n3-Feb-09,60.87,64.20,60.00,63.59,14696983\n2-Feb-09,58.57,62.00,58.13,61.15,19326536\n30-Jan-09,57.36,59.74,57.24,58.82,39789443\n29-Jan-09,49.96,51.85,49.14,50.00,18147983\n28-Jan-09,49.72,51.49,48.97,50.36,8060898\n27-Jan-09,49.30,50.42,47.72,48.44,8740421\n26-Jan-09,50.18,50.89,48.52,49.63,7156982\n23-Jan-09,48.90,51.42,48.45,50.63,5801524\n22-Jan-09,49.42,50.88,48.26,49.94,7133910\n21-Jan-09,49.31,50.69,48.25,50.54,5831711\n20-Jan-09,50.75,51.70,48.27,48.44,6767347\n16-Jan-09,51.80,52.33,49.53,51.59,8259583\n15-Jan-09,48.56,52.23,47.63,51.44,11619769\n14-Jan-09,50.10,50.10,48.14,48.49,10452769\n13-Jan-09,50.96,53.29,50.75,51.45,7884933\n12-Jan-09,54.12,54.30,50.87,51.92,9557314\n9-Jan-09,56.92,57.00,54.70,55.51,6685301\n8-Jan-09,54.99,57.32,54.58,57.16,6580585\n7-Jan-09,56.29,56.95,55.35,56.20,7942750\n6-Jan-09,54.55,58.22,53.75,57.36,11084415\n5-Jan-09,55.73,55.74,53.03,54.06,9511716\n2-Jan-09,51.35,54.53,51.07,54.36,7296667\n1-Jan-09,51.28,51.28,51.28,51.28,0\n31-Dec-08,50.74,51.69,49.91,51.28,7792434\n30-Dec-08,49.51,51.21,48.74,50.76,6601901\n29-Dec-08,51.43,51.77,48.56,49.40,6508845\n26-Dec-08,53.79,53.95,51.55,51.78,6850793\n25-Dec-08,51.44,51.44,51.44,51.44,0\n24-Dec-08,51.66,51.95,51.01,51.44,1649848\n23-Dec-08,50.12,51.61,50.12,51.08,5847245\n22-Dec-08,51.60,52.15,48.47,49.84,8926146\n19-Dec-08,51.59,52.99,50.92,51.56,11058816\n18-Dec-08,53.00,54.85,51.20,52.08,7518601\n17-Dec-08,52.26,54.77,51.53,53.18,9186920\n16-Dec-08,49.62,52.96,49.29,52.63,8864253\n15-Dec-08,50.65,50.95,48.15,48.85,7286552\n12-Dec-08,47.52,51.38,47.52,51.25,8667005\n11-Dec-08,49.33,50.49,48.17,48.25,7586764\n10-Dec-08,51.46,51.50,48.34,49.70,7755032\n9-Dec-08,49.81,54.48,49.70,51.25,13321434\n8-Dec-08,49.15,52.14,47.36,51.41,10943820\n5-Dec-08,45.89,48.49,43.30,48.26,14610244\n4-Dec-08,45.94,50.50,45.75,47.32,19790396\n3-Dec-08,40.16,45.88,40.05,45.21,15678965\n2-Dec-08,41.39,41.71,38.82,41.19,8726257\n1-Dec-08,42.00,43.26,40.38,40.47,11180495\n28-Nov-08,44.03,44.10,42.22,42.70,3687472\n27-Nov-08,43.96,43.96,43.96,43.96,0\n26-Nov-08,40.87,44.00,40.29,43.96,13444906\n25-Nov-08,42.09,42.89,39.61,42.19,13015730\n24-Nov-08,38.79,43.44,38.70,42.50,14552647\n21-Nov-08,36.39,39.00,35.72,37.87,15045084\n20-Nov-08,35.29,39.72,34.68,35.03,18425739\n19-Nov-08,37.97,39.00,35.75,35.84,12522743\n18-Nov-08,39.73,40.66,36.08,38.44,15055101\n17-Nov-08,39.91,41.26,39.07,39.69,10713611\n14-Nov-08,43.61,44.50,41.50,41.75,11949631\n13-Nov-08,41.40,45.00,38.48,44.93,16938805\n12-Nov-08,43.99,45.44,40.90,41.56,14773108\n11-Nov-08,47.10,48.06,44.81,46.30,9940491\n10-Nov-08,49.98,50.68,46.86,48.46,8986388\n7-Nov-08,47.76,49.79,47.01,49.21,7352100\n6-Nov-08,49.80,51.04,46.30,47.22,13993700\n5-Nov-08,57.47,58.00,51.62,51.98,11423500\n4-Nov-08,57.16,58.73,55.22,58.45,7499300\n3-Nov-08,56.35,57.25,55.02,55.77,5941200\n31-Oct-08,56.01,57.25,55.01,57.24,8354200\n30-Oct-08,58.76,59.89,55.08,56.71,11034100\n29-Oct-08,55.53,59.79,54.52,56.89,15101600\n28-Oct-08,51.50,56.30,49.07,56.04,14601800\n27-Oct-08,49.00,52.59,48.43,49.58,11609700\n24-Oct-08,44.75,52.32,44.50,48.96,19333000\n23-Oct-08,43.37,50.91,43.31,50.32,31995000\n22-Oct-08,50.05,52.47,47.90,49.99,15742300\n21-Oct-08,51.86,52.95,49.92,50.23,8518600\n20-Oct-08,52.17,53.10,49.91,52.97,8355700\n17-Oct-08,48.83,62.33,48.41,50.65,12743200\n16-Oct-08,46.40,50.70,43.39,50.29,21758300\n15-Oct-08,54.46,54.69,48.35,48.72,15822100\n14-Oct-08,63.50,64.00,54.80,55.86,16892400\n13-Oct-08,58.96,62.21,57.37,62.02,11033200\n10-Oct-08,52.99,59.75,51.05,56.25,17550300\n9-Oct-08,61.97,63.50,56.00,56.00,13827500\n8-Oct-08,55.64,62.75,55.35,61.02,14140800\n7-Oct-08,65.79,66.43,58.50,58.52,12394200\n6-Oct-08,64.06,65.89,60.47,65.23,13213800\n3-Oct-08,69.42,70.95,66.59,67.00,10956300\n2-Oct-08,67.63,68.96,65.41,67.36,8544100\n1-Oct-08,71.78,71.99,68.41,69.58,9468000\n30-Sep-08,65.84,73.12,65.32,72.76,12682600\n29-Sep-08,68.41,69.37,61.32,63.35,11683400\n26-Sep-08,69.52,71.05,68.08,70.70,6684000\n25-Sep-08,70.66,72.75,70.01,72.08,5964800\n24-Sep-08,72.30,73.65,68.94,69.96,9245700\n23-Sep-08,75.79,76.29,70.77,71.76,8486500\n22-Sep-08,81.13,81.63,74.32,74.93,6807600\n19-Sep-08,80.12,86.77,76.50,81.00,13242700\n18-Sep-08,73.08,77.50,70.08,76.50,12275700\n17-Sep-08,77.68,78.24,71.24,71.54,13097500\n16-Sep-08,76.80,79.63,76.67,78.73,12930800\n15-Sep-08,76.86,79.88,76.30,77.34,8878700\n12-Sep-08,78.81,79.60,76.62,78.30,6384300\n11-Sep-08,75.27,79.80,75.10,79.51,7657100\n10-Sep-08,80.01,80.22,76.15,76.74,9286400\n9-Sep-08,80.76,81.96,78.99,79.04,5734900\n8-Sep-08,82.25,83.75,78.85,81.16,9323100\n5-Sep-08,77.34,80.72,77.08,79.19,8006800\n4-Sep-08,80.60,80.81,78.02,78.03,8286400\n3-Sep-08,81.40,82.00,80.02,80.77,5710500\n2-Sep-08,83.16,84.50,81.21,81.41,5907100\n29-Aug-08,82.90,82.90,80.50,80.81,4603500\n28-Aug-08,82.21,83.65,81.80,83.42,7777800\n27-Aug-08,81.44,82.74,81.00,81.73,5515400\n26-Aug-08,82.74,83.12,81.25,81.76,3449500\n25-Aug-08,84.63,84.64,82.45,82.85,4262200\n22-Aug-08,84.27,85.46,83.93,85.26,4530900\n21-Aug-08,81.41,83.77,80.98,83.26,6073300\n20-Aug-08,82.00,83.25,81.20,82.13,5825200\n19-Aug-08,83.09,83.51,81.06,81.29,6557800\n18-Aug-08,86.09,86.28,83.04,83.11,6415000\n15-Aug-08,88.28,89.53,86.26,86.40,6830000\n14-Aug-08,85.71,88.75,85.22,88.03,6689100\n13-Aug-08,86.28,88.25,84.54,86.69,7197100\n12-Aug-08,87.32,88.48,86.10,87.25,7868500\n11-Aug-08,80.18,91.75,79.78,88.09,24926400\n8-Aug-08,76.78,81.21,76.29,80.51,9072200\n7-Aug-08,77.01,78.05,76.00,76.95,5341700\n6-Aug-08,78.55,78.63,76.73,78.09,6210500\n5-Aug-08,76.92,79.52,76.52,79.11,7718800\n4-Aug-08,75.99,77.30,75.01,75.71,4379500\n1-Aug-08,76.36,76.49,74.05,75.75,4660700\n31-Jul-08,76.75,78.17,76.10,76.34,5162400\n30-Jul-08,78.36,79.85,76.42,78.21,7533700\n29-Jul-08,76.49,78.80,76.16,78.21,6582600\n28-Jul-08,77.09,78.31,74.86,75.98,10239200\n25-Jul-08,79.63,80.94,78.12,78.31,8689300\n24-Jul-08,76.30,82.38,76.29,78.72,29706900\n23-Jul-08,67.46,72.07,67.46,70.54,10528200\n22-Jul-08,67.09,69.14,65.88,67.97,8522900\n21-Jul-08,69.52,69.80,66.30,68.48,6801600\n18-Jul-08,69.94,70.84,68.40,69.12,7832600\n17-Jul-08,71.20,72.38,67.74,72.11,9283200\n16-Jul-08,66.94,72.75,66.84,71.84,11688600\n15-Jul-08,65.87,68.62,62.99,67.03,11114900\n14-Jul-08,69.31,69.50,65.59,66.28,8977000\n11-Jul-08,69.40,69.99,66.74,68.54,7858000\n10-Jul-08,70.70,71.77,67.99,70.63,9760800\n9-Jul-08,74.56,74.90,70.48,70.61,6764800\n8-Jul-08,72.38,75.49,71.75,75.04,7741800\n7-Jul-08,72.37,74.40,70.76,72.49,7220000\n3-Jul-08,72.51,73.84,70.52,72.00,4223100\n2-Jul-08,74.16,74.41,71.38,71.44,6662600\n1-Jul-08,72.24,74.23,70.52,73.62,10121500\n30-Jun-08,75.03,76.12,73.21,73.33,6889600\n27-Jun-08,75.59,76.07,72.62,74.66,11347700\n26-Jun-08,79.10,79.89,76.00,76.30,10399100\n25-Jun-08,80.45,82.15,79.52,80.51,6892400\n24-Jun-08,79.55,80.79,77.63,79.64,7081100\n23-Jun-08,81.30,82.15,79.55,80.68,7303900\n20-Jun-08,83.10,83.46,80.51,81.10,5802000\n19-Jun-08,82.21,84.47,81.50,84.26,6680200\n18-Jun-08,82.00,83.17,81.32,82.52,6753300\n17-Jun-08,83.15,84.30,82.80,82.97,8683200\n16-Jun-08,78.42,82.53,78.41,81.70,5674900\n13-Jun-08,76.70,80.00,76.70,79.17,5851000\n12-Jun-08,78.02,79.05,75.01,76.15,6076300\n11-Jun-08,79.35,80.00,77.03,77.28,5821600\n10-Jun-08,78.20,81.04,78.20,79.62,5867900\n9-Jun-08,81.19,81.53,78.12,79.43,5934500\n6-Jun-08,83.24,83.64,80.56,80.63,7819500\n5-Jun-08,82.11,84.88,81.80,84.51,8833400\n4-Jun-08,80.11,81.82,79.72,81.50,6404900\n3-Jun-08,80.71,81.89,79.26,80.11,5792700\n2-Jun-08,81.15,81.57,80.05,80.23,6117900\n30-May-08,80.58,81.77,80.30,81.62,5136500\n29-May-08,80.61,81.96,80.17,80.35,6707800\n28-May-08,80.73,80.79,78.99,80.08,6626500\n27-May-08,78.26,80.90,77.97,80.62,9939100\n23-May-08,78.55,78.87,77.43,78.35,6026200\n22-May-08,78.68,79.69,78.00,79.26,5353700\n21-May-08,80.37,81.15,77.50,78.30,6971400\n20-May-08,82.17,82.70,80.03,80.72,7769900\n19-May-08,79.01,84.75,78.86,82.29,18285600\n16-May-08,76.42,76.83,74.86,76.46,6135500\n15-May-08,73.89,76.32,73.55,76.12,6871500\n14-May-08,74.92,75.75,73.98,74.20,4474000\n13-May-08,74.57,74.96,73.31,74.56,4923300\n12-May-08,73.00,74.93,71.78,74.53,7142900\n9-May-08,72.20,73.34,71.66,72.41,4163700\n8-May-08,73.73,74.16,71.56,72.79,8069700\n7-May-08,75.26,76.64,73.09,73.18,8152100\n6-May-08,75.51,76.77,75.05,75.71,6346500\n5-May-08,77.27,77.77,75.87,75.92,5528000\n2-May-08,80.30,81.20,76.40,77.31,8054400\n1-May-08,78.40,80.01,77.97,79.36,7153000\n30-Apr-08,80.90,81.34,77.92,78.63,7712400\n29-Apr-08,81.42,81.77,79.86,80.74,6641600\n28-Apr-08,80.64,82.50,80.12,81.97,10714300\n25-Apr-08,77.81,81.32,77.26,80.86,9353400\n24-Apr-08,77.71,80.53,76.93,77.69,19892800\n23-Apr-08,80.30,82.64,78.74,81.00,12962000\n22-Apr-08,79.94,79.94,77.54,79.60,6944800\n21-Apr-08,80.03,81.34,79.06,80.18,9239300\n18-Apr-08,76.48,82.00,76.32,80.10,16542200\n17-Apr-08,74.18,75.02,73.61,74.04,6062400\n16-Apr-08,73.02,75.00,72.94,74.59,6643800\n15-Apr-08,72.97,73.98,70.65,72.50,6709500\n14-Apr-08,71.70,74.00,71.29,72.61,4299700\n11-Apr-08,73.84,74.30,71.62,71.99,5343200\n10-Apr-08,74.48,75.49,72.73,74.83,6150600\n9-Apr-08,76.56,76.67,73.66,74.39,6594400\n8-Apr-08,76.40,77.61,75.50,77.30,4850600\n7-Apr-08,77.36,78.43,76.00,76.90,6474600\n4-Apr-08,75.26,77.83,74.28,76.87,6936000\n3-Apr-08,75.15,76.01,73.81,74.94,7970800\n2-Apr-08,77.08,79.00,76.12,77.37,8377600\n1-Apr-08,72.99,77.09,72.76,76.70,9612500\n31-Mar-08,70.25,71.64,69.63,71.30,5416700\n28-Mar-08,71.00,72.21,69.26,69.76,5075000\n27-Mar-08,74.37,74.69,70.80,70.80,7893900\n26-Mar-08,74.14,75.12,73.24,73.80,5950700\n25-Mar-08,75.83,76.29,74.05,75.17,6224600\n24-Mar-08,73.82,76.93,72.75,75.95,8382200\n20-Mar-08,70.17,73.49,69.38,73.19,10950800\n19-Mar-08,71.10,74.00,70.17,70.17,10712700\n18-Mar-08,68.25,71.93,67.59,71.70,9427400\n17-Mar-08,65.72,67.79,64.92,66.53,9588500\n14-Mar-08,68.61,70.68,66.06,68.22,12356800\n13-Mar-08,65.11,69.55,64.37,68.32,10451800\n12-Mar-08,66.77,68.23,65.64,66.51,7659500\n11-Mar-08,65.95,67.17,63.71,67.15,9592100\n10-Mar-08,63.90,65.15,62.91,63.47,8789000\n7-Mar-08,62.20,64.87,62.01,64.09,10318000\n6-Mar-08,64.75,65.46,62.50,62.74,8269900\n5-Mar-08,65.66,66.34,63.82,64.99,10996000\n4-Mar-08,61.67,66.60,61.23,65.34,16476200\n3-Mar-08,63.59,64.49,61.20,62.43,13545300\n29-Feb-08,67.01,67.50,63.97,64.47,11521900\n28-Feb-08,70.30,70.60,67.11,67.85,13097800\n27-Feb-08,70.68,71.48,69.57,70.87,8834700\n26-Feb-08,71.91,73.50,70.28,71.69,9279500\n25-Feb-08,72.35,73.50,71.41,73.27,7745100\n22-Feb-08,70.54,72.21,69.86,72.08,12208700\n21-Feb-08,73.94,74.21,69.37,69.90,12180500\n20-Feb-08,71.90,73.88,71.10,73.64,6363300\n19-Feb-08,73.54,74.00,71.55,72.08,6829900\n15-Feb-08,75.00,75.19,71.94,72.96,11029100\n14-Feb-08,77.73,77.88,75.18,75.80,7374800\n13-Feb-08,74.99,78.85,73.27,77.73,10925100\n12-Feb-08,75.43,77.05,73.79,74.45,9291800\n11-Feb-08,73.14,75.96,72.77,75.19,7617500\n8-Feb-08,73.40,74.60,72.52,73.50,11249300\n7-Feb-08,67.37,72.71,67.22,70.91,14374100\n6-Feb-08,72.30,72.43,68.17,68.49,12311200\n5-Feb-08,72.80,74.21,72.00,72.09,9321400\n4-Feb-08,74.50,76.66,73.90,73.95,8932600\n1-Feb-08,79.02,79.40,73.37,74.63,15904700\n31-Jan-08,68.91,78.87,68.84,77.70,39850500\n30-Jan-08,73.54,77.42,73.25,74.21,13325200\n29-Jan-08,75.77,75.90,72.06,73.95,9796500\n28-Jan-08,76.91,77.40,74.34,75.82,8326200\n25-Jan-08,78.69,81.43,76.33,77.60,9944600\n24-Jan-08,74.53,77.88,74.19,77.67,9754000\n23-Jan-08,75.60,76.80,69.95,73.97,20100300\n22-Jan-08,73.58,79.72,72.22,78.48,12384900\n18-Jan-08,79.93,82.31,78.04,79.76,13159800\n17-Jan-08,80.16,82.25,79.54,80.12,9791200\n16-Jan-08,79.58,82.36,78.44,80.35,11630300\n15-Jan-08,80.48,81.01,78.51,80.24,9215500\n14-Jan-08,82.18,83.32,78.87,82.87,8938300\n11-Jan-08,84.03,84.03,80.29,81.08,10523900\n10-Jan-08,83.98,85.97,82.97,84.26,10826000\n9-Jan-08,87.56,87.80,80.24,85.22,15983700\n8-Jan-08,87.55,91.83,86.93,87.88,12171900\n7-Jan-08,88.62,90.57,85.47,88.82,9668800\n4-Jan-08,93.26,93.40,88.50,88.79,10157100\n3-Jan-08,96.06,97.25,94.52,95.21,8785600\n2-Jan-08,95.35,97.43,94.70,96.25,13637700\n31-Dec-07,93.81,94.37,92.45,92.64,5674800\n28-Dec-07,95.27,95.90,92.10,94.45,7465700\n27-Dec-07,92.67,95.29,92.50,94.25,7071900\n26-Dec-07,91.48,93.94,90.50,92.85,5306200\n24-Dec-07,91.05,91.56,90.30,91.01,1992500\n21-Dec-07,91.47,92.28,90.39,91.26,6269500\n20-Dec-07,90.14,90.75,89.09,90.58,5755200\n19-Dec-07,86.94,89.95,86.83,89.38,7434400\n18-Dec-07,85.83,87.46,83.86,86.89,7121600\n17-Dec-07,89.01,89.06,84.99,85.09,7391500\n14-Dec-07,90.77,91.24,88.93,89.08,5915200\n13-Dec-07,91.05,93.00,90.63,92.40,6001800\n12-Dec-07,92.84,93.75,89.32,91.28,6819000\n11-Dec-07,93.10,95.94,90.75,90.75,8787100\n10-Dec-07,94.31,94.35,92.30,93.02,4530500\n7-Dec-07,94.56,94.68,92.91,94.31,3877600\n6-Dec-07,93.28,95.00,92.83,94.21,5401700\n5-Dec-07,94.99,94.99,91.98,93.19,6452200\n4-Dec-07,90.04,94.56,90.04,94.41,7235400\n3-Dec-07,90.03,92.25,89.77,90.91,5822700\n30-Nov-07,90.56,91.08,88.32,90.56,6737400\n29-Nov-07,89.89,91.47,88.68,89.15,6772100\n28-Nov-07,87.55,90.57,86.75,90.30,11008600\n27-Nov-07,82.92,85.65,82.21,85.59,8432400\n26-Nov-07,82.30,84.49,81.14,81.30,8400700\n23-Nov-07,80.11,81.45,78.98,81.43,2730200\n21-Nov-07,79.24,80.86,78.65,79.76,6613400\n20-Nov-07,79.86,82.00,78.31,80.39,10506200\n19-Nov-07,78.83,79.75,77.94,79.18,8322800\n16-Nov-07,77.01,78.99,76.63,78.60,6984200\n15-Nov-07,79.43,79.73,76.70,77.85,7598900\n14-Nov-07,80.40,81.15,78.15,78.51,8110600\n13-Nov-07,77.91,80.05,77.80,79.86,9414100\n12-Nov-07,78.26,80.09,76.50,77.00,9153300\n9-Nov-07,82.42,82.42,78.84,78.89,10143000\n8-Nov-07,86.80,86.96,81.40,83.58,10388000\n7-Nov-07,86.41,89.16,86.16,87.04,8178300\n6-Nov-07,84.61,87.50,84.37,87.27,7631300\n5-Nov-07,84.35,86.02,82.76,84.37,6362700\n2-Nov-07,87.95,88.12,83.50,85.98,10104300\n1-Nov-07,87.75,89.58,86.50,87.65,8034900\n31-Oct-07,88.05,89.60,87.00,89.15,6834400\n30-Oct-07,89.67,90.65,88.05,88.24,5338900\n29-Oct-07,90.41,91.47,89.48,90.10,6880200\n26-Oct-07,89.00,90.88,87.70,90.00,8725400\n25-Oct-07,88.23,89.50,86.32,88.21,11411800\n24-Oct-07,90.87,90.88,83.27,88.73,39843400\n23-Oct-07,95.28,101.09,94.21,100.82,29476600\n22-Oct-07,89.25,91.69,89.02,91.29,8670400\n19-Oct-07,89.93,90.65,89.32,89.76,8810300\n18-Oct-07,89.37,90.43,89.15,89.85,4958300\n17-Oct-07,91.90,91.90,89.06,90.55,7051800\n16-Oct-07,88.69,90.05,88.50,89.53,7640900\n15-Oct-07,91.80,92.12,90.10,90.53,5480300\n12-Oct-07,89.42,92.39,88.92,92.37,8238500\n11-Oct-07,95.33,95.74,88.13,89.34,9491900\n10-Oct-07,95.50,95.75,94.37,94.66,5445500\n9-Oct-07,96.59,96.73,94.75,95.32,6817000\n8-Oct-07,94.22,95.85,94.00,95.85,7271700\n5-Oct-07,93.55,93.71,92.34,93.43,5400900\n4-Oct-07,92.55,92.57,91.45,92.26,3221400\n3-Oct-07,92.19,92.80,91.78,92.46,4950000\n2-Oct-07,93.86,93.90,91.40,92.36,4814700\n1-Oct-07,93.42,94.10,92.83,93.41,5193200\n28-Sep-07,92.77,93.60,91.70,93.15,4569100\n27-Sep-07,94.07,94.11,93.10,93.38,2707200\n26-Sep-07,94.04,94.26,92.29,93.43,5309500\n25-Sep-07,91.99,93.50,90.95,93.48,5533800\n24-Sep-07,91.30,93.75,90.81,92.59,5254700\n21-Sep-07,90.29,91.90,89.65,91.30,6258100\n20-Sep-07,88.90,90.42,88.82,89.65,5651400\n19-Sep-07,89.52,89.82,88.26,89.00,6257000\n18-Sep-07,87.38,91.60,86.71,88.75,8700000\n17-Sep-07,86.98,87.34,85.98,86.91,4333200\n14-Sep-07,86.41,88.09,86.31,87.77,3847500\n13-Sep-07,87.95,88.07,86.50,87.26,5887500\n12-Sep-07,86.07,88.89,85.97,87.30,8709300\n11-Sep-07,84.17,86.61,83.53,86.28,6788900\n10-Sep-07,84.93,85.16,82.51,83.34,5292900\n7-Sep-07,84.70,84.97,83.21,84.52,8102200\n6-Sep-07,84.50,86.46,82.85,86.21,8698900\n5-Sep-07,82.24,84.89,82.22,83.75,8887400\n4-Sep-07,79.90,83.53,79.73,82.70,8099600\n31-Aug-07,80.00,80.53,79.70,79.91,5991500\n30-Aug-07,78.40,80.11,78.30,78.68,4330900\n29-Aug-07,76.96,79.05,76.86,79.05,4805900\n28-Aug-07,77.86,78.65,76.08,76.22,5432500\n27-Aug-07,80.56,80.80,78.42,78.65,6645700\n24-Aug-07,76.80,79.40,76.69,79.25,5584600\n23-Aug-07,78.94,79.00,76.51,77.30,5632000\n22-Aug-07,78.24,79.49,77.84,78.50,6473000\n21-Aug-07,74.21,77.83,74.09,77.49,8188100\n20-Aug-07,74.98,75.28,73.80,74.70,5760700\n17-Aug-07,74.49,75.04,73.11,75.02,6865400\n16-Aug-07,72.00,73.24,70.05,72.79,10581100\n15-Aug-07,73.02,75.15,72.26,72.38,6321500\n14-Aug-07,74.79,74.79,72.92,73.45,5821300\n13-Aug-07,76.09,76.32,74.70,74.87,5951300\n10-Aug-07,73.15,76.50,72.37,74.78,8810300\n9-Aug-07,76.40,77.26,74.11,74.11,7999300\n8-Aug-07,79.77,79.88,76.56,77.78,7657800\n7-Aug-07,78.55,80.00,77.89,79.14,7937300\n6-Aug-07,77.06,79.00,76.60,79.00,8664000\n3-Aug-07,79.54,80.75,76.71,76.80,7688400\n2-Aug-07,77.86,79.76,76.12,79.71,10044300\n1-Aug-07,78.10,78.15,75.06,77.31,16583100\n31-Jul-07,83.70,83.73,78.00,78.54,13765400\n30-Jul-07,83.00,84.05,81.51,82.70,11907400\n27-Jul-07,84.27,85.33,82.48,84.04,13632500\n26-Jul-07,85.02,89.00,83.43,84.01,22839500\n25-Jul-07,84.66,88.80,83.65,86.18,60442200\n24-Jul-07,71.04,72.16,68.85,69.25,13369400\n23-Jul-07,71.78,72.67,70.85,71.74,8745000\n20-Jul-07,72.62,72.96,70.50,71.63,8186900\n19-Jul-07,74.24,74.32,73.12,73.35,4935000\n18-Jul-07,73.27,73.49,72.25,73.32,6143600\n17-Jul-07,74.39,74.52,73.59,73.79,5986500\n16-Jul-07,74.73,74.84,73.00,73.69,7969000\n13-Jul-07,73.08,75.35,72.97,75.10,12016600\n12-Jul-07,71.31,73.57,70.73,72.79,11173500\n11-Jul-07,70.58,71.65,70.15,70.73,6406900\n10-Jul-07,71.65,71.94,70.07,70.28,8454600\n9-Jul-07,69.38,72.35,69.02,72.07,14364600\n6-Jul-07,68.75,69.30,68.01,68.97,4455700\n5-Jul-07,69.36,69.65,68.06,68.73,4398700\n3-Jul-07,70.04,70.05,69.02,69.45,2144700\n2-Jul-07,68.81,69.71,68.20,69.61,4664800\n29-Jun-07,69.03,69.19,68.15,68.41,5191200\n28-Jun-07,68.46,70.23,68.15,68.89,9393000\n27-Jun-07,66.96,68.21,66.71,68.14,8072800\n26-Jun-07,68.53,68.63,67.38,67.48,10566200\n25-Jun-07,69.35,69.63,68.30,68.66,7338100\n22-Jun-07,69.55,69.88,68.42,68.86,7688600\n21-Jun-07,69.16,69.77,68.66,69.67,7447200\n20-Jun-07,70.25,70.50,69.05,69.10,8669800\n19-Jun-07,71.55,71.66,69.68,69.81,8719700\n18-Jun-07,72.34,72.64,71.40,71.83,7290900\n15-Jun-07,72.85,72.87,71.19,72.40,9530700\n14-Jun-07,70.90,72.12,70.80,71.94,7973600\n13-Jun-07,70.90,71.89,69.25,70.89,11387500\n12-Jun-07,70.44,70.76,69.42,70.07,11195800\n11-Jun-07,73.00,73.05,71.00,71.17,10999700\n8-Jun-07,72.47,73.24,71.05,73.24,9969500\n7-Jun-07,72.57,74.72,70.88,72.04,23902300\n6-Jun-07,73.14,73.75,71.86,72.29,15285100\n5-Jun-07,71.10,74.24,70.86,73.65,30013700\n4-Jun-07,68.25,70.65,67.65,70.42,11229700\n1-Jun-07,68.90,69.30,68.35,68.58,6859000\n31-May-07,70.68,70.74,68.57,69.14,9043500\n30-May-07,69.06,70.08,68.86,69.86,10327800\n29-May-07,68.43,69.78,67.72,69.63,11495300\n25-May-07,69.69,69.70,68.25,68.55,9864800\n24-May-07,69.04,70.42,67.71,69.35,23289300\n23-May-07,69.21,73.31,68.79,69.00,42106600\n22-May-07,68.48,69.07,67.21,68.88,16809800\n21-May-07,63.58,68.68,63.30,68.30,35999000\n18-May-07,62.48,63.30,62.28,63.30,9352900\n17-May-07,62.88,63.52,62.02,62.17,11662900\n16-May-07,61.02,63.34,60.10,63.22,13613600\n15-May-07,61.40,61.97,60.52,60.58,8484800\n14-May-07,61.68,61.74,60.60,61.70,7403900\n11-May-07,60.96,61.60,60.56,61.56,7751300\n10-May-07,62.44,62.65,60.85,60.92,9849400\n9-May-07,62.00,62.95,61.30,62.85,8615100\n8-May-07,60.54,61.84,59.70,61.83,12981900\n7-May-07,62.43,63.23,60.71,60.82,14000000\n4-May-07,62.39,63.75,62.35,63.23,13897400\n3-May-07,61.08,62.54,60.76,62.19,13145900\n2-May-07,61.68,62.25,60.90,61.18,13733400\n1-May-07,61.12,62.04,60.28,61.18,17788100\n30-Apr-07,61.91,62.44,61.18,61.33,23070700\n27-Apr-07,61.24,63.84,60.62,62.60,46081500\n26-Apr-07,56.50,63.04,56.07,62.78,60502500\n25-Apr-07,53.12,57.18,52.95,56.81,4307000\n24-Apr-07,44.75,45.00,44.43,44.75,7896400\n23-Apr-07,44.27,44.81,44.16,44.77,6914900\n20-Apr-07,45.09,45.17,44.52,44.95,5742900\n19-Apr-07,44.61,45.15,44.41,44.64,4700200\n18-Apr-07,44.80,45.15,44.63,44.99,4848300\n17-Apr-07,45.28,45.32,44.75,45.07,7042500\n16-Apr-07,43.77,45.30,43.67,45.20,12957300\n13-Apr-07,42.19,42.50,41.93,42.41,3509500\n12-Apr-07,41.73,42.37,41.40,42.27,4553300\n11-Apr-07,41.73,41.87,41.24,41.68,4735500\n10-Apr-07,41.57,41.96,41.46,41.86,3211500\n9-Apr-07,41.72,42.14,41.61,41.66,4085900\n5-Apr-07,41.57,41.76,41.44,41.68,2990900\n4-Apr-07,41.22,41.55,40.92,41.53,3852400\n3-Apr-07,40.42,41.38,40.40,41.19,5798800\n2-Apr-07,39.85,40.47,39.55,40.42,6830100\n30-Mar-07,39.75,40.24,39.42,39.79,5787800\n29-Mar-07,39.65,39.92,39.30,39.81,6012000\n28-Mar-07,39.09,39.51,38.74,39.34,5844200\n27-Mar-07,38.82,39.42,38.76,39.37,3746600\n26-Mar-07,38.98,39.05,38.43,39.01,3386200\n23-Mar-07,39.56,39.60,38.98,38.98,2868600\n22-Mar-07,39.48,39.72,38.91,39.49,5179600\n21-Mar-07,38.55,39.80,38.31,39.80,4928500\n20-Mar-07,38.53,38.69,38.23,38.58,3721700\n19-Mar-07,38.00,38.54,38.00,38.45,4111300\n16-Mar-07,37.72,38.08,37.52,37.85,6568700\n15-Mar-07,38.10,38.29,37.55,37.78,7017500\n14-Mar-07,37.76,38.22,37.26,38.08,8536500\n13-Mar-07,38.30,38.88,37.69,37.82,5122200\n12-Mar-07,38.64,39.05,38.38,38.81,4553500\n9-Mar-07,38.48,38.89,38.00,38.84,6097900\n8-Mar-07,38.77,39.22,37.98,38.10,7440400\n7-Mar-07,38.68,39.32,38.28,38.36,8543400\n6-Mar-07,37.69,38.66,37.41,38.58,12066000\n5-Mar-07,37.15,38.32,37.04,37.05,9071200\n2-Mar-07,38.32,38.87,37.69,37.69,7752800\n1-Mar-07,39.32,39.32,38.05,38.85,9101600\n28-Feb-07,38.91,39.58,38.08,39.14,7671900\n27-Feb-07,40.19,40.54,38.78,38.83,8794400\n26-Feb-07,40.86,41.20,40.40,40.88,4023000\n23-Feb-07,41.00,41.20,40.74,40.78,5348600\n22-Feb-07,41.40,42.00,40.89,41.00,4907600\n21-Feb-07,41.18,41.32,40.92,41.26,4409500\n20-Feb-07,40.13,41.74,40.00,41.51,8865200\n16-Feb-07,39.90,40.44,39.87,40.33,4624100\n15-Feb-07,40.14,40.32,39.86,40.06,5050500\n14-Feb-07,39.23,40.28,39.14,40.14,6671400\n13-Feb-07,38.85,39.61,38.85,39.31,4476500\n12-Feb-07,38.79,38.99,38.36,38.85,3818300\n9-Feb-07,39.19,39.31,38.66,38.72,5688600\n8-Feb-07,38.95,39.51,38.67,39.10,5461300\n7-Feb-07,38.49,39.52,38.40,38.98,10445500\n6-Feb-07,37.20,38.41,37.08,38.27,8572200\n5-Feb-07,37.25,37.42,36.77,37.16,6091700\n2-Feb-07,37.23,37.74,36.68,37.39,23900300\n1-Feb-07,37.95,39.30,37.85,38.70,14968600\n31-Jan-07,36.95,38.19,36.76,37.67,7121300\n30-Jan-07,37.29,37.42,36.63,37.05,4796200\n29-Jan-07,36.70,37.45,36.54,37.43,7390300\n26-Jan-07,37.26,37.26,36.30,36.85,4126000\n25-Jan-07,38.08,38.23,36.78,37.08,6712300\n24-Jan-07,36.51,37.36,36.50,37.26,4992300\n23-Jan-07,36.90,37.07,36.30,36.43,5295900\n22-Jan-07,37.65,37.90,36.80,36.95,8196300\n19-Jan-07,36.69,37.48,36.60,37.02,6012900\n18-Jan-07,37.50,37.65,36.72,36.98,8958300\n17-Jan-07,38.70,39.00,37.78,37.88,4971400\n16-Jan-07,38.40,38.89,37.97,38.66,5625300\n12-Jan-07,37.36,38.21,37.27,38.20,4414000\n11-Jan-07,37.17,38.00,37.17,37.40,6429500\n10-Jan-07,37.49,37.70,37.07,37.15,6469200\n9-Jan-07,37.60,38.06,37.34,37.78,5690900\n8-Jan-07,38.22,38.31,37.17,37.50,6692800\n5-Jan-07,38.72,38.79,37.60,38.37,6576200\n4-Jan-07,38.59,39.14,38.26,38.90,6205000\n3-Jan-07,38.68,39.06,38.05,38.70,12149800\n29-Dec-06,40.06,40.25,39.35,39.46,4173100\n28-Dec-06,40.38,40.63,39.92,40.21,4524900\n27-Dec-06,39.86,40.47,39.80,40.29,3519600\n26-Dec-06,40.13,40.13,39.42,39.80,4468900\n22-Dec-06,39.98,40.51,39.91,40.24,5567400\n21-Dec-06,39.87,40.34,39.65,39.89,6337400\n20-Dec-06,39.43,40.30,39.39,40.01,7779700\n19-Dec-06,38.78,39.72,38.23,39.42,7476700\n18-Dec-06,40.20,40.64,38.86,39.26,6281700\n15-Dec-06,39.38,40.19,39.23,40.01,8001700\n14-Dec-06,38.74,39.54,38.60,39.02,6279200\n13-Dec-06,38.61,39.19,38.19,38.50,4547800\n12-Dec-06,38.44,38.94,38.15,38.46,5084900\n11-Dec-06,38.22,39.15,38.08,38.69,4844000\n8-Dec-06,37.92,38.95,37.70,38.46,5105000\n7-Dec-06,38.93,39.09,38.05,38.12,6607400\n6-Dec-06,38.77,39.58,38.64,38.90,5753600\n5-Dec-06,39.13,39.30,38.72,38.98,5584900\n4-Dec-06,39.31,39.48,38.87,39.10,9670800\n1-Dec-06,40.26,40.54,39.09,39.41,8255400\n30-Nov-06,40.42,40.64,39.85,40.34,6309800\n29-Nov-06,40.48,41.10,40.00,40.63,7669300\n28-Nov-06,40.75,41.07,40.30,40.92,7071600\n27-Nov-06,42.18,42.80,40.72,40.85,8903200\n24-Nov-06,42.56,42.94,42.31,42.41,2214500\n22-Nov-06,42.50,42.98,42.18,42.96,4511800\n21-Nov-06,42.55,43.25,42.12,42.54,6954200\n20-Nov-06,42.35,42.55,41.94,42.44,5740200\n17-Nov-06,42.55,42.67,42.22,42.55,6437400\n16-Nov-06,42.44,42.95,42.40,42.84,10619500\n15-Nov-06,41.50,43.10,41.50,42.60,13464400\n14-Nov-06,40.11,41.67,39.62,41.51,10845000\n13-Nov-06,39.23,40.00,39.13,39.99,6911700\n10-Nov-06,38.79,39.36,38.76,39.26,4470200\n9-Nov-06,39.50,39.77,38.81,38.84,5783000\n8-Nov-06,38.58,39.48,38.46,39.47,8127100\n7-Nov-06,38.20,39.00,38.04,38.77,7637500\n6-Nov-06,37.64,38.35,37.53,38.21,4512200\n3-Nov-06,37.61,37.71,36.87,37.46,5099900\n2-Nov-06,37.33,37.77,37.11,37.45,5396200\n1-Nov-06,38.12,38.20,37.46,37.56,6599200\n31-Oct-06,38.22,38.59,37.80,38.09,6090800\n30-Oct-06,38.05,38.34,37.68,38.15,6818800\n27-Oct-06,38.15,38.38,37.66,38.24,9699400\n26-Oct-06,37.25,38.49,37.18,38.30,16795200\n25-Oct-06,37.30,37.98,36.04,37.68,43784800\n24-Oct-06,32.87,38.00,32.86,33.63,14649000\n23-Oct-06,32.47,32.91,32.14,32.88,7991300\n20-Oct-06,32.69,32.69,32.21,32.57,5705600\n19-Oct-06,32.17,32.84,32.10,32.54,3997100\n18-Oct-06,32.57,32.78,32.00,32.31,5309000\n17-Oct-06,32.20,32.61,31.75,32.47,6582200\n16-Oct-06,32.85,33.20,32.55,32.60,6161500\n13-Oct-06,33.35,33.58,33.08,33.32,4035000\n12-Oct-06,33.10,33.71,32.63,33.55,5946200\n11-Oct-06,32.61,33.15,32.27,32.91,6667600\n10-Oct-06,33.27,33.58,32.49,32.62,6226000\n9-Oct-06,32.49,33.48,32.45,33.38,5217500\n6-Oct-06,33.15,33.22,32.50,32.59,4191300\n5-Oct-06,32.68,33.40,32.40,33.32,8388300\n4-Oct-06,31.75,32.83,31.30,32.76,7050700\n3-Oct-06,30.90,32.00,30.58,31.70,8003300\n2-Oct-06,31.98,32.03,30.83,30.87,6769400\n29-Sep-06,32.01,32.34,31.54,32.12,5212600\n28-Sep-06,32.27,32.33,31.22,31.84,7468000\n27-Sep-06,32.28,32.46,31.93,32.33,5440200\n26-Sep-06,31.89,32.59,31.80,32.50,6576800\n25-Sep-06,31.05,31.97,30.74,31.79,6582900\n22-Sep-06,30.22,30.95,29.90,30.84,7246200\n21-Sep-06,32.24,32.56,30.07,30.22,15508100\n20-Sep-06,31.81,32.81,31.80,32.12,8503200\n19-Sep-06,32.24,32.30,30.82,31.58,8541400\n18-Sep-06,32.44,32.67,31.88,32.08,5120600\n15-Sep-06,31.90,32.74,31.58,32.52,10108700\n14-Sep-06,31.54,31.87,31.18,31.65,3226100\n13-Sep-06,31.73,31.96,31.37,31.67,4353600\n12-Sep-06,30.87,31.94,30.53,31.72,6518700\n11-Sep-06,30.23,31.13,29.72,30.79,7400700\n8-Sep-06,30.19,30.66,29.94,30.51,5168000\n7-Sep-06,30.57,30.64,29.68,29.73,8816300\n6-Sep-06,31.76,31.98,30.65,30.80,9132300\n5-Sep-06,31.61,32.30,31.24,32.23,7439600\n1-Sep-06,30.85,31.80,30.85,31.76,6552600\n31-Aug-06,30.76,30.99,30.47,30.83,5909600\n30-Aug-06,29.57,30.85,29.48,30.67,11255900\n29-Aug-06,28.97,29.72,28.75,29.52,7381600\n28-Aug-06,28.40,29.00,28.27,28.91,6053500\n25-Aug-06,27.79,28.23,27.62,28.03,3540600\n24-Aug-06,28.24,28.25,27.54,27.97,4460400\n23-Aug-06,28.56,28.89,27.77,28.14,4677800\n22-Aug-06,28.14,28.89,28.05,28.37,4572600\n21-Aug-06,28.70,28.98,27.97,28.13,5301200\n18-Aug-06,29.09,29.23,28.22,29.12,5988200\n17-Aug-06,27.96,29.75,27.83,29.09,9466800\n16-Aug-06,27.97,28.14,27.52,27.95,7564700\n15-Aug-06,26.97,27.86,26.62,27.77,8188900\n14-Aug-06,26.22,27.06,26.18,26.53,5120500\n11-Aug-06,26.43,26.43,25.76,26.07,5109700\n10-Aug-06,26.20,26.52,25.88,26.49,6365500\n9-Aug-06,26.54,26.70,26.00,26.21,6895900\n8-Aug-06,26.80,27.02,26.19,26.36,7243100\n7-Aug-06,27.19,27.29,26.59,26.78,5466800\n4-Aug-06,26.94,27.59,26.80,27.29,10224300\n3-Aug-06,26.09,26.90,25.90,26.69,6858900\n2-Aug-06,26.15,26.30,25.89,26.09,7789400\n1-Aug-06,26.55,26.64,25.84,26.32,13087100\n31-Jul-06,27.02,27.29,26.74,26.89,7715200\n28-Jul-06,26.71,27.18,26.57,27.17,12390900\n27-Jul-06,26.45,26.80,26.00,26.56,26354100\n26-Jul-06,28.76,29.00,25.96,26.26,76989000\n25-Jul-06,34.00,34.16,33.39,33.59,11042600\n24-Jul-06,33.35,34.68,33.34,34.31,7347600\n21-Jul-06,33.85,33.97,32.92,33.19,7105400\n20-Jul-06,34.39,34.81,33.83,34.18,5788100\n19-Jul-06,33.50,34.77,33.39,34.48,8848500\n18-Jul-06,33.65,34.29,32.96,33.49,5195300\n17-Jul-06,32.79,33.93,32.79,33.67,7156900\n14-Jul-06,33.51,33.73,32.80,32.92,8013500\n13-Jul-06,34.33,34.63,33.71,33.73,6373200\n12-Jul-06,35.60,35.90,34.57,34.63,4705800\n"
  },
  {
    "path": "examples/stockserver/CSCO.csv",
    "content": "﻿Date,Open,High,Low,Close,Volume\n9-Jul-12,16.73,16.77,16.59,16.65,25581319\n6-Jul-12,16.88,16.94,16.67,16.77,27190755\n5-Jul-12,16.99,17.03,16.88,16.94,26300776\n3-Jul-12,17.02,17.23,17.01,17.15,15823670\n2-Jul-12,17.11,17.16,16.96,17.08,20020591\n29-Jun-12,16.79,17.17,16.72,17.17,51020155\n28-Jun-12,16.63,16.63,16.22,16.48,56591318\n27-Jun-12,16.87,16.96,16.64,16.73,43506962\n26-Jun-12,16.97,16.99,16.65,16.82,31871596\n25-Jun-12,17.01,17.03,16.78,16.94,33220413\n22-Jun-12,16.98,17.19,16.95,17.13,46489633\n21-Jun-12,17.51,17.54,16.87,16.92,44128788\n20-Jun-12,17.37,17.63,17.30,17.51,46247558\n19-Jun-12,17.28,17.36,17.11,17.18,41828144\n18-Jun-12,17.08,17.25,17.03,17.14,35403523\n15-Jun-12,16.97,17.17,16.93,17.10,42611022\n14-Jun-12,16.68,17.04,16.60,16.92,39582973\n13-Jun-12,16.74,16.85,16.56,16.66,39122800\n12-Jun-12,16.57,16.84,16.51,16.79,32713457\n11-Jun-12,16.87,16.88,16.45,16.48,31131582\n8-Jun-12,16.56,16.78,16.49,16.73,29774055\n7-Jun-12,16.88,16.92,16.53,16.58,34271359\n6-Jun-12,16.29,16.69,16.23,16.68,33226034\n5-Jun-12,16.06,16.28,15.98,16.12,34650033\n4-Jun-12,15.98,16.13,15.92,16.11,29750741\n1-Jun-12,16.08,16.15,15.94,15.96,48496285\n31-May-12,16.36,16.52,16.26,16.33,51975483\n30-May-12,16.46,16.48,16.35,16.39,36489870\n29-May-12,16.51,16.64,16.39,16.59,37092111\n25-May-12,16.46,16.56,16.32,16.33,41844792\n24-May-12,16.69,16.70,16.35,16.39,52604223\n23-May-12,16.56,16.76,16.43,16.69,42459136\n22-May-12,16.66,16.82,16.62,16.73,43016431\n21-May-12,16.51,16.70,16.37,16.67,37632738\n18-May-12,16.61,16.64,16.37,16.47,57521858\n17-May-12,16.69,16.80,16.55,16.55,41625010\n16-May-12,16.83,16.89,16.61,16.69,57803782\n15-May-12,16.74,16.76,16.51,16.54,66147940\n14-May-12,16.40,16.83,16.37,16.70,57502189\n11-May-12,16.76,16.99,16.50,16.50,75215296\n10-May-12,17.17,17.32,16.76,16.81,198450536\n9-May-12,18.58,18.89,18.48,18.78,78274068\n8-May-12,18.90,18.90,18.62,18.71,52277917\n7-May-12,19.02,19.26,19.00,19.08,34077286\n4-May-12,19.52,19.53,19.03,19.12,41737248\n3-May-12,19.92,19.95,19.65,19.72,29629109\n2-May-12,19.91,19.94,19.63,19.84,32170036\n1-May-12,20.11,20.16,19.98,19.98,31765923\n30-Apr-12,19.85,20.17,19.82,20.16,36405468\n27-Apr-12,19.64,20.03,19.58,19.98,47506436\n26-Apr-12,19.48,19.67,19.37,19.60,43039620\n25-Apr-12,19.59,19.69,19.27,19.49,48462443\n24-Apr-12,19.76,19.85,19.35,19.42,67526570\n23-Apr-12,19.77,19.78,19.58,19.68,27407012\n20-Apr-12,19.93,20.04,19.84,19.91,34259698\n19-Apr-12,20.02,20.31,19.78,19.90,34592986\n18-Apr-12,19.95,20.15,19.88,20.06,27563369\n17-Apr-12,19.81,20.15,19.75,20.08,28779665\n16-Apr-12,19.92,19.96,19.57,19.72,35250893\n13-Apr-12,20.02,20.04,19.79,19.85,27910857\n12-Apr-12,20.09,20.28,19.98,20.06,32047552\n11-Apr-12,19.68,20.04,19.62,20.02,40612745\n10-Apr-12,19.94,20.10,19.52,19.55,44897937\n9-Apr-12,19.97,20.16,19.87,19.96,26418904\n5-Apr-12,20.18,20.37,20.07,20.22,30616155\n4-Apr-12,20.64,20.77,20.25,20.36,43849468\n3-Apr-12,21.11,21.19,20.63,20.82,64101573\n2-Apr-12,21.14,21.30,21.05,21.19,30716442\n30-Mar-12,21.12,21.19,20.98,21.15,35675182\n29-Mar-12,20.96,21.24,20.85,21.03,36521150\n28-Mar-12,20.85,21.11,20.73,21.08,39840538\n27-Mar-12,20.93,21.05,20.88,20.91,44476323\n26-Mar-12,20.70,20.86,20.65,20.84,29100860\n23-Mar-12,20.34,20.59,20.25,20.53,27646958\n22-Mar-12,20.35,20.57,20.27,20.38,32213127\n21-Mar-12,20.56,20.65,20.35,20.50,39135454\n20-Mar-12,20.04,20.64,20.01,20.57,61659559\n19-Mar-12,19.94,20.28,19.94,20.14,30278764\n16-Mar-12,20.01,20.05,19.90,20.03,56366857\n15-Mar-12,20.06,20.20,19.80,19.91,55020542\n14-Mar-12,20.16,20.38,20.06,20.20,41192828\n13-Mar-12,19.90,20.22,19.89,20.22,33325974\n12-Mar-12,19.82,19.88,19.66,19.83,26319377\n9-Mar-12,19.73,19.89,19.68,19.80,26278766\n8-Mar-12,19.57,19.78,19.53,19.68,36655483\n7-Mar-12,19.50,19.53,19.40,19.41,34754296\n6-Mar-12,19.43,19.53,19.32,19.48,36744129\n5-Mar-12,19.73,19.75,19.46,19.60,31971220\n2-Mar-12,19.84,19.89,19.71,19.76,27450272\n1-Mar-12,19.91,19.96,19.74,19.88,43149293\n29-Feb-12,20.18,20.20,19.84,19.88,46235612\n28-Feb-12,20.16,20.22,20.02,20.20,34352454\n27-Feb-12,19.99,20.26,19.97,20.17,37170181\n24-Feb-12,20.27,20.33,20.11,20.14,27224098\n23-Feb-12,20.08,20.25,19.92,20.23,30009911\n22-Feb-12,20.41,20.46,20.05,20.12,36222575\n21-Feb-12,20.30,20.49,20.17,20.36,41223836\n17-Feb-12,20.20,20.35,20.00,20.29,54252249\n16-Feb-12,19.98,20.27,19.91,20.19,42558766\n15-Feb-12,20.09,20.21,19.85,19.91,44889551\n14-Feb-12,19.90,20.07,19.83,20.07,31859473\n13-Feb-12,20.01,20.06,19.90,20.03,50426575\n10-Feb-12,19.79,20.06,19.73,19.90,63115187\n9-Feb-12,20.23,20.49,19.87,20.00,131157192\n8-Feb-12,20.22,20.45,20.09,20.43,91349111\n7-Feb-12,20.09,20.33,20.00,20.20,61427311\n6-Feb-12,20.04,20.20,19.92,20.19,37141820\n3-Feb-12,19.99,20.20,19.91,20.09,54490923\n2-Feb-12,19.83,19.98,19.80,19.80,36412718\n1-Feb-12,19.84,19.95,19.70,19.80,57083909\n31-Jan-12,19.69,19.73,19.44,19.64,40629526\n30-Jan-12,19.40,19.63,19.27,19.56,31384772\n27-Jan-12,19.58,19.69,19.36,19.56,43541146\n26-Jan-12,19.97,19.99,19.71,19.83,36827222\n25-Jan-12,19.80,19.87,19.48,19.83,37213252\n24-Jan-12,19.75,19.86,19.56,19.82,30831062\n23-Jan-12,19.85,20.07,19.56,19.83,50013636\n20-Jan-12,19.75,19.93,19.67,19.92,42052599\n19-Jan-12,19.68,19.95,19.60,19.79,52482052\n18-Jan-12,19.37,19.63,19.33,19.54,56573407\n17-Jan-12,19.23,19.32,19.11,19.30,40409210\n13-Jan-12,19.06,19.06,19.06,19.06,0\n12-Jan-12,19.12,19.20,18.96,19.15,31101675\n11-Jan-12,18.94,19.14,18.87,19.07,32482186\n10-Jan-12,19.08,19.25,18.77,18.83,45488277\n9-Jan-12,18.87,19.10,18.79,18.97,37811418\n6-Jan-12,18.95,19.00,18.83,18.85,27797622\n5-Jan-12,18.93,19.00,18.67,18.92,37865567\n4-Jan-12,18.44,19.00,18.35,18.99,52932879\n3-Jan-12,18.55,18.86,18.48,18.63,41240172\n30-Dec-11,18.08,18.08,18.08,18.08,0\n29-Dec-11,18.15,18.27,18.14,18.25,17641213\n28-Dec-11,18.52,18.59,18.11,18.16,26741362\n27-Dec-11,18.48,18.64,18.46,18.58,22939340\n23-Dec-11,18.46,18.46,18.46,18.46,0\n22-Dec-11,18.01,18.22,17.97,18.13,37604359\n21-Dec-11,18.23,18.35,17.82,17.92,57677616\n20-Dec-11,17.92,18.48,17.91,18.40,44835090\n19-Dec-11,17.96,18.01,17.62,17.69,39711535\n16-Dec-11,18.19,18.53,17.94,17.94,94965686\n15-Dec-11,18.17,18.25,17.93,18.04,39810809\n14-Dec-11,18.46,18.50,17.88,17.98,59677007\n13-Dec-11,18.57,18.85,18.34,18.47,48006880\n12-Dec-11,18.62,18.70,18.26,18.53,44118525\n9-Dec-11,18.58,18.96,18.49,18.88,44022673\n8-Dec-11,18.87,19.07,18.45,18.57,47302730\n7-Dec-11,18.76,19.05,18.57,18.99,54878156\n6-Dec-11,18.78,18.88,18.71,18.73,29138023\n5-Dec-11,18.84,18.89,18.66,18.79,43530121\n2-Dec-11,18.68,18.98,18.53,18.55,46255335\n1-Dec-11,18.68,18.72,18.32,18.58,41444404\n30-Nov-11,18.24,18.79,18.16,18.64,74536560\n29-Nov-11,18.01,18.15,17.66,17.68,53298581\n28-Nov-11,17.92,18.10,17.84,18.01,45999135\n25-Nov-11,17.25,17.80,17.22,17.50,24466202\n23-Nov-11,17.40,17.40,17.40,17.40,0\n22-Nov-11,17.90,18.13,17.70,17.92,39707790\n21-Nov-11,18.13,18.31,17.78,18.00,54365731\n18-Nov-11,18.46,18.63,18.22,18.42,38222235\n17-Nov-11,18.80,18.82,18.22,18.48,55373711\n16-Nov-11,18.95,19.15,18.77,18.80,54567517\n15-Nov-11,18.81,19.19,18.79,19.12,45568412\n14-Nov-11,18.95,19.10,18.86,18.94,46652170\n11-Nov-11,18.79,19.15,18.76,19.02,80558353\n10-Nov-11,18.69,18.91,18.42,18.61,148101819\n9-Nov-11,18.04,18.04,17.44,17.61,80049427\n8-Nov-11,18.15,18.34,17.96,18.31,50448165\n7-Nov-11,18.00,18.24,17.79,18.01,44480961\n4-Nov-11,18.08,18.10,17.75,18.03,39823512\n3-Nov-11,17.98,18.20,17.71,18.18,39658437\n2-Nov-11,17.74,17.94,17.59,17.85,38992092\n1-Nov-11,18.05,18.05,17.53,17.59,67821539\n31-Oct-11,18.34,18.55,18.21,18.53,50718108\n28-Oct-11,18.28,18.60,18.21,18.56,47742448\n27-Oct-11,18.04,18.58,17.99,18.44,105736729\n26-Oct-11,17.76,17.89,17.30,17.61,44781660\n25-Oct-11,17.54,17.74,17.49,17.62,44041807\n24-Oct-11,17.38,17.67,17.26,17.54,37800334\n21-Oct-11,17.33,17.60,17.19,17.38,46178989\n20-Oct-11,17.20,17.26,16.80,17.19,39740329\n19-Oct-11,17.40,17.54,17.05,17.16,35836589\n18-Oct-11,17.18,17.66,16.97,17.51,42790001\n17-Oct-11,17.37,17.47,17.02,17.17,37621669\n14-Oct-11,17.54,17.67,17.35,17.55,43861691\n13-Oct-11,17.17,17.43,17.16,17.42,44237947\n12-Oct-11,17.13,17.40,17.01,17.25,70257893\n11-Oct-11,17.00,17.10,16.86,16.99,53683070\n10-Oct-11,16.91,17.14,16.85,17.09,48939921\n7-Oct-11,16.76,16.94,16.50,16.66,58376119\n6-Oct-11,16.21,16.76,16.17,16.75,74775093\n5-Oct-11,15.57,16.52,15.50,16.16,119801962\n4-Oct-11,14.95,15.62,14.93,15.58,80847153\n3-Oct-11,15.30,15.47,15.17,15.19,79210739\n30-Sep-11,15.63,15.77,15.48,15.50,50463408\n29-Sep-11,16.09,16.25,15.53,15.85,59527490\n28-Sep-11,16.18,16.36,15.81,15.84,47967982\n27-Sep-11,16.16,16.36,15.97,16.07,64908155\n26-Sep-11,15.65,16.02,15.50,15.99,53217221\n23-Sep-11,15.16,15.84,15.12,15.61,66118106\n22-Sep-11,15.49,15.71,14.96,15.33,92159632\n21-Sep-11,16.53,16.60,15.83,15.84,70842441\n20-Sep-11,16.45,16.67,16.33,16.53,48834995\n19-Sep-11,16.45,16.58,16.16,16.51,42149303\n16-Sep-11,16.72,16.84,16.53,16.62,62298535\n15-Sep-11,16.47,16.70,16.32,16.67,47652310\n14-Sep-11,16.39,16.66,16.31,16.33,79447465\n13-Sep-11,16.08,16.50,15.94,16.35,82625219\n12-Sep-11,15.55,16.10,15.55,16.09,53942563\n9-Sep-11,16.15,16.18,15.72,15.82,79002779\n8-Sep-11,15.85,16.45,15.82,16.29,103787312\n7-Sep-11,15.42,15.91,15.41,15.88,58514911\n6-Sep-11,15.10,15.29,15.01,15.28,62391301\n2-Sep-11,15.51,15.72,15.30,15.41,55499617\n1-Sep-11,15.69,16.00,15.61,15.82,73756451\n31-Aug-11,15.73,15.95,15.54,15.67,50689562\n30-Aug-11,15.67,15.78,15.39,15.63,51036757\n29-Aug-11,15.51,15.76,15.40,15.74,39188133\n26-Aug-11,15.08,15.54,15.02,15.32,49953054\n25-Aug-11,15.52,15.54,15.02,15.08,54369204\n24-Aug-11,15.36,15.56,15.16,15.46,59278850\n23-Aug-11,15.01,15.44,15.01,15.44,57778413\n22-Aug-11,15.23,15.40,14.95,15.01,68733846\n19-Aug-11,14.92,15.46,14.90,15.08,90584294\n18-Aug-11,15.39,15.47,14.90,15.01,104626560\n17-Aug-11,15.97,16.07,15.65,15.85,54515014\n16-Aug-11,15.86,16.06,15.70,16.00,58994013\n15-Aug-11,16.01,16.07,15.83,16.03,65125882\n12-Aug-11,15.94,16.20,15.64,15.99,95554292\n11-Aug-11,15.45,16.24,15.36,15.92,286920002\n10-Aug-11,13.93,14.23,13.70,13.73,146475080\n9-Aug-11,0.00,0.00,13.30,14.06,144579225\n8-Aug-11,14.41,14.63,13.94,13.94,125325983\n5-Aug-11,14.91,15.28,14.36,14.94,122398068\n4-Aug-11,15.27,15.32,14.81,14.82,92196432\n3-Aug-11,15.34,15.54,15.18,15.49,70377578\n2-Aug-11,15.61,15.81,15.45,15.46,56227117\n1-Aug-11,16.08,16.25,15.55,15.83,60650540\n29-Jul-11,15.90,16.13,15.80,15.97,66850157\n28-Jul-11,15.96,16.30,15.83,16.01,79457728\n27-Jul-11,15.92,16.01,15.58,15.69,80761871\n26-Jul-11,16.26,16.39,16.20,16.29,40153908\n25-Jul-11,16.34,16.38,16.16,16.28,33874992\n22-Jul-11,16.44,16.50,16.25,16.46,48364746\n21-Jul-11,15.82,16.47,15.82,16.35,93220530\n20-Jul-11,15.64,15.95,15.58,15.82,60146326\n19-Jul-11,15.55,15.70,15.42,15.66,58285752\n18-Jul-11,15.49,15.54,15.27,15.44,45271132\n15-Jul-11,15.52,15.70,15.45,15.59,54800187\n14-Jul-11,15.56,15.76,15.40,15.43,50153289\n13-Jul-11,15.70,15.85,15.50,15.57,47732605\n12-Jul-11,15.43,15.96,15.42,15.60,88250087\n11-Jul-11,15.55,15.62,15.33,15.43,44415754\n8-Jul-11,15.76,15.90,15.56,15.74,50356962\n7-Jul-11,15.64,15.99,15.61,15.90,70178784\n6-Jul-11,15.62,15.68,15.45,15.56,43221634\n5-Jul-11,15.87,15.92,15.55,15.67,44364510\n1-Jul-11,15.86,15.86,15.86,15.86,0\n30-Jun-11,15.36,15.66,15.34,15.61,52618459\n29-Jun-11,15.18,15.40,15.12,15.34,47462136\n28-Jun-11,15.08,15.14,14.96,15.13,52428608\n27-Jun-11,14.94,15.15,14.94,15.05,76915155\n24-Jun-11,15.44,15.44,14.92,14.93,177861556\n23-Jun-11,15.18,15.49,15.08,15.47,63981414\n22-Jun-11,15.48,15.64,15.33,15.36,48404252\n21-Jun-11,15.20,15.57,15.15,15.51,85430683\n20-Jun-11,14.94,15.17,14.93,15.14,54052538\n17-Jun-11,15.18,15.20,14.90,14.97,80912885\n16-Jun-11,14.84,15.10,14.80,15.05,73024219\n15-Jun-11,14.96,14.99,14.78,14.84,92323100\n14-Jun-11,15.11,15.22,14.92,15.08,91534534\n13-Jun-11,15.14,15.28,15.04,15.06,63586044\n10-Jun-11,15.31,15.36,15.01,15.12,78257754\n9-Jun-11,15.32,15.47,15.25,15.31,67591170\n8-Jun-11,15.41,15.58,15.21,15.30,100248362\n7-Jun-11,16.04,16.04,15.49,15.51,107881030\n6-Jun-11,16.04,16.17,15.88,15.99,58219738\n3-Jun-11,16.14,16.19,15.98,16.01,74861021\n2-Jun-11,16.31,16.52,16.23,16.25,62685151\n1-Jun-11,16.76,16.77,16.36,16.38,61885899\n31-May-11,16.59,16.82,16.51,16.80,56637467\n27-May-11,16.46,16.46,16.46,16.46,0\n26-May-11,16.16,16.37,16.15,16.25,64706469\n25-May-11,16.15,16.26,16.11,16.19,59601864\n24-May-11,16.40,16.46,16.25,16.27,42476550\n23-May-11,16.41,16.44,16.22,16.35,68265450\n20-May-11,16.68,16.72,16.51,16.53,50894173\n19-May-11,16.75,16.83,16.56,16.66,68259864\n18-May-11,16.64,16.66,16.34,16.65,92724663\n17-May-11,16.50,16.72,16.46,16.64,78206612\n16-May-11,16.82,16.87,16.60,16.60,81626357\n13-May-11,16.86,16.96,16.78,16.88,80195326\n12-May-11,16.96,17.08,16.64,16.93,238334305\n11-May-11,17.82,17.99,17.65,17.78,129229938\n10-May-11,17.65,17.94,17.65,17.79,68806102\n9-May-11,17.53,17.67,17.47,17.60,46986881\n6-May-11,17.63,17.70,17.50,17.56,60439423\n5-May-11,17.48,17.68,17.45,17.48,67929254\n4-May-11,17.37,17.56,17.28,17.47,58190483\n3-May-11,17.53,17.57,17.29,17.41,56884525\n2-May-11,17.51,17.60,17.39,17.58,46838717\n29-Apr-11,17.32,17.56,17.26,17.52,137455282\n28-Apr-11,17.20,17.38,17.18,17.29,52918574\n27-Apr-11,17.60,17.64,17.08,17.19,97724097\n26-Apr-11,17.21,17.64,17.14,17.52,81649533\n25-Apr-11,16.93,17.16,16.90,17.10,42745359\n21-Apr-11,16.94,16.94,16.94,16.94,0\n20-Apr-11,16.90,16.96,16.79,16.93,86372585\n19-Apr-11,16.65,16.76,16.52,16.61,76497993\n18-Apr-11,16.88,16.90,16.59,16.73,86550320\n15-Apr-11,17.19,17.30,16.97,17.03,82667624\n14-Apr-11,17.15,17.22,17.05,17.17,58256338\n13-Apr-11,17.50,17.50,17.22,17.25,60956267\n12-Apr-11,17.50,17.58,17.36,17.44,65895068\n11-Apr-11,17.71,17.76,17.36,17.47,56427828\n8-Apr-11,17.97,17.99,17.53,17.65,82734604\n7-Apr-11,18.16,18.29,17.72,17.91,119269194\n6-Apr-11,17.44,18.19,17.38,18.07,176814153\n5-Apr-11,17.16,17.49,17.12,17.22,103519787\n4-Apr-11,17.01,17.14,17.00,17.06,57644273\n1-Apr-11,17.29,17.30,16.99,17.04,62747101\n31-Mar-11,17.32,17.45,17.15,17.15,65036578\n30-Mar-11,17.58,17.60,17.30,17.33,60260839\n29-Mar-11,17.21,17.45,17.19,17.44,57191828\n28-Mar-11,17.36,17.54,17.17,17.19,63408295\n25-Mar-11,17.38,17.41,17.20,17.28,53222852\n24-Mar-11,17.62,17.64,17.35,17.36,57829006\n23-Mar-11,17.42,17.60,17.34,17.58,52156908\n22-Mar-11,17.42,17.61,17.29,17.45,63936008\n21-Mar-11,17.34,17.55,17.30,17.39,57429369\n18-Mar-11,17.35,17.42,17.07,17.14,125170907\n17-Mar-11,17.13,17.20,16.97,17.00,83343474\n16-Mar-11,17.33,17.57,17.01,17.05,93486561\n15-Mar-11,17.31,17.48,17.25,17.39,97010773\n14-Mar-11,17.81,17.88,17.74,17.85,45149943\n11-Mar-11,17.81,18.01,17.76,17.95,68254368\n10-Mar-11,18.04,18.07,17.90,17.92,63914609\n9-Mar-11,18.11,18.20,18.02,18.12,53213764\n8-Mar-11,18.17,18.30,18.02,18.22,54964242\n7-Mar-11,18.36,18.37,18.03,18.20,70862459\n4-Mar-11,18.53,18.59,18.31,18.40,57402965\n3-Mar-11,18.63,18.65,18.50,18.53,57031268\n2-Mar-11,18.49,18.62,18.44,18.50,63392601\n1-Mar-11,18.67,18.79,18.50,18.56,61976873\n28-Feb-11,18.62,18.75,18.51,18.56,62256274\n25-Feb-11,18.51,18.70,18.47,18.64,49209546\n24-Feb-11,18.39,18.51,18.23,18.36,71863619\n23-Feb-11,18.57,18.66,18.29,18.40,89184620\n22-Feb-11,18.73,18.74,18.55,18.59,74954416\n18-Feb-11,18.85,18.85,18.85,18.85,0\n17-Feb-11,18.63,18.76,18.58,18.68,89097589\n16-Feb-11,18.77,18.79,18.56,18.58,101531791\n15-Feb-11,18.89,18.92,18.63,18.67,90320436\n14-Feb-11,18.84,18.95,18.68,18.81,109308307\n11-Feb-11,19.11,19.14,18.61,18.70,189326315\n10-Feb-11,19.65,19.70,18.79,18.92,560038939\n9-Feb-11,21.92,22.15,21.90,22.04,125425536\n8-Feb-11,21.95,22.01,21.71,21.99,73162835\n7-Feb-11,22.11,22.34,22.03,22.03,52408390\n4-Feb-11,21.90,22.15,21.81,22.05,60134728\n3-Feb-11,21.70,21.97,21.65,21.91,54001956\n2-Feb-11,21.52,21.69,21.42,21.62,41287380\n1-Feb-11,21.27,21.56,21.26,21.47,40519766\n31-Jan-11,20.93,21.18,20.71,21.15,40390731\n28-Jan-11,21.49,21.57,20.86,20.93,46540420\n27-Jan-11,21.37,21.49,21.26,21.44,36827190\n26-Jan-11,21.48,21.61,21.26,21.42,65524948\n25-Jan-11,21.16,21.57,21.08,21.54,72726380\n24-Jan-11,20.84,21.18,20.73,21.17,44068334\n21-Jan-11,20.97,20.98,20.68,20.72,40172323\n20-Jan-11,20.61,20.91,20.50,20.77,53291633\n19-Jan-11,21.32,21.33,20.70,20.82,53574597\n18-Jan-11,21.22,21.33,21.21,21.22,46668310\n14-Jan-11,21.21,21.21,21.21,21.21,0\n13-Jan-11,21.18,21.23,21.01,21.08,35030203\n12-Jan-11,21.00,21.14,20.96,21.12,40646018\n11-Jan-11,20.90,20.96,20.79,20.88,38352360\n10-Jan-11,20.94,20.95,20.70,20.79,40679682\n7-Jan-11,20.86,21.00,20.83,20.97,67738111\n6-Jan-11,20.91,20.96,20.76,20.95,65845317\n5-Jan-11,20.58,20.85,20.53,20.77,69378545\n4-Jan-11,20.51,20.60,20.40,20.52,46273788\n3-Jan-11,20.45,20.62,20.38,20.49,54310117\n31-Dec-10,20.24,20.24,20.08,20.23,28712415\n30-Dec-10,20.32,20.35,20.21,20.23,25581990\n29-Dec-10,20.49,20.51,20.25,20.25,32976811\n28-Dec-10,20.37,20.51,20.28,20.35,57275349\n27-Dec-10,19.84,20.40,19.81,20.16,62054576\n23-Dec-10,19.69,19.69,19.69,19.69,0\n22-Dec-10,19.54,19.57,19.51,19.56,42787073\n21-Dec-10,19.64,19.77,19.50,19.53,62386087\n20-Dec-10,19.58,19.72,19.52,19.62,49113499\n17-Dec-10,19.70,19.78,19.50,19.55,115524969\n16-Dec-10,19.44,19.76,19.43,19.75,61252967\n15-Dec-10,19.58,19.67,19.43,19.47,57939296\n14-Dec-10,19.65,19.87,19.52,19.54,57054594\n13-Dec-10,19.85,19.92,19.56,19.58,62987119\n10-Dec-10,19.75,19.76,19.51,19.70,64813048\n9-Dec-10,19.49,19.82,19.39,19.70,91965368\n8-Dec-10,19.37,19.45,19.31,19.35,53976865\n7-Dec-10,19.70,19.70,19.36,19.39,74980252\n6-Dec-10,19.31,19.60,19.27,19.43,79017386\n3-Dec-10,19.16,19.17,19.00,19.07,89384937\n2-Dec-10,19.36,19.40,19.12,19.22,113701390\n1-Dec-10,19.34,19.39,19.26,19.32,79322759\n30-Nov-10,19.24,19.35,19.13,19.16,63406657\n29-Nov-10,19.47,19.54,19.23,19.44,51959107\n26-Nov-10,19.49,19.72,19.41,19.49,26258169\n24-Nov-10,19.46,19.46,19.46,19.46,0\n23-Nov-10,19.44,19.44,19.18,19.20,91969472\n22-Nov-10,19.65,19.68,19.38,19.56,65401945\n19-Nov-10,19.83,19.84,19.50,19.61,100759489\n18-Nov-10,19.73,19.80,19.53,19.61,102255826\n17-Nov-10,19.62,19.68,19.39,19.40,112435922\n16-Nov-10,19.88,19.94,19.34,19.44,212576442\n15-Nov-10,20.37,20.37,19.92,19.95,137860795\n12-Nov-10,20.62,20.67,20.03,20.15,234765374\n11-Nov-10,20.46,20.96,20.25,20.52,553078278\n10-Nov-10,24.29,24.51,23.99,24.49,115576157\n9-Nov-10,24.49,24.60,24.18,24.35,51216109\n8-Nov-10,24.54,24.58,24.28,24.39,40378093\n5-Nov-10,24.26,24.34,23.88,24.26,41012289\n4-Nov-10,23.92,24.34,23.89,24.21,55897795\n3-Nov-10,23.29,23.74,23.18,23.71,53861120\n2-Nov-10,23.17,23.30,23.06,23.17,37381022\n1-Nov-10,22.95,23.30,22.88,22.92,49174226\n29-Oct-10,23.12,23.22,22.82,22.86,44587820\n28-Oct-10,23.43,23.49,23.07,23.19,33695074\n27-Oct-10,23.25,23.36,23.03,23.29,39164377\n26-Oct-10,23.49,23.75,23.36,23.40,37679966\n25-Oct-10,23.63,23.90,23.57,23.61,37085774\n22-Oct-10,23.25,23.49,23.18,23.48,23676566\n21-Oct-10,23.48,23.54,22.98,23.26,38537219\n20-Oct-10,22.91,23.58,22.91,23.40,44947212\n19-Oct-10,23.10,23.18,22.76,22.97,53769368\n18-Oct-10,23.35,23.50,23.23,23.30,40615236\n15-Oct-10,23.24,23.40,23.00,23.36,50265795\n14-Oct-10,23.26,23.30,22.85,23.07,38847138\n13-Oct-10,22.93,23.40,22.83,23.18,66127091\n12-Oct-10,22.38,22.75,22.27,22.62,35299050\n11-Oct-10,22.48,22.65,22.38,22.47,28434493\n8-Oct-10,22.37,22.52,22.09,22.48,37806362\n7-Oct-10,22.47,22.50,22.11,22.39,37864547\n6-Oct-10,22.03,22.40,22.01,22.30,52793004\n5-Oct-10,22.02,22.12,21.77,21.98,59683703\n4-Oct-10,21.81,22.00,21.50,21.76,31731136\n1-Oct-10,22.12,22.22,21.78,21.91,42192694\n30-Sep-10,22.05,22.28,21.67,21.90,56850332\n29-Sep-10,21.63,21.91,21.56,21.87,46307240\n28-Sep-10,22.00,22.11,21.45,21.86,64748304\n27-Sep-10,22.01,22.31,21.86,22.11,48671792\n24-Sep-10,21.84,22.25,21.75,22.09,54235014\n23-Sep-10,21.55,21.81,21.43,21.53,36039034\n22-Sep-10,21.67,21.89,21.40,21.67,49272150\n21-Sep-10,21.78,21.96,21.37,21.64,69776145\n20-Sep-10,21.97,21.99,21.64,21.75,55744883\n17-Sep-10,22.07,22.12,21.77,21.86,54755960\n16-Sep-10,21.58,21.96,21.52,21.93,47579140\n15-Sep-10,21.54,21.86,21.49,21.59,60902383\n14-Sep-10,21.36,22.17,21.21,21.45,109222307\n13-Sep-10,20.92,21.34,20.86,21.26,62445813\n10-Sep-10,20.63,20.68,20.32,20.62,48400542\n9-Sep-10,20.96,21.05,20.58,20.61,43600967\n8-Sep-10,20.68,20.89,20.55,20.64,40612920\n7-Sep-10,20.90,20.99,20.53,20.58,60556771\n6-Sep-10,21.04,21.04,21.04,21.04,0\n3-Sep-10,21.04,21.04,21.04,21.04,0\n2-Sep-10,20.48,20.70,20.31,20.52,59438997\n1-Sep-10,20.35,20.70,20.25,20.26,80172983\n31-Aug-10,20.11,20.37,19.82,19.98,94449389\n30-Aug-10,20.80,20.89,20.29,20.32,58982939\n27-Aug-10,20.84,20.89,20.67,20.81,62258927\n26-Aug-10,21.18,21.30,20.69,20.70,53499631\n25-Aug-10,20.99,21.35,20.82,21.21,54310986\n24-Aug-10,21.43,21.45,21.10,21.13,74401814\n23-Aug-10,22.47,22.48,21.65,21.68,49308860\n20-Aug-10,22.19,22.41,22.13,22.23,54662666\n19-Aug-10,22.34,22.50,22.01,22.22,71331723\n18-Aug-10,22.04,22.51,22.03,22.41,73169165\n17-Aug-10,22.07,22.29,21.95,22.05,82948625\n16-Aug-10,21.24,22.12,21.22,21.91,88628302\n13-Aug-10,21.51,21.58,21.25,21.36,67924079\n12-Aug-10,21.42,21.61,21.39,21.36,227308153\n11-Aug-10,23.86,23.95,23.45,23.73,71535679\n10-Aug-10,24.46,24.59,24.16,24.31,59163669\n9-Aug-10,24.21,24.87,24.20,24.77,64011003\n6-Aug-10,23.92,24.17,23.60,24.07,40448587\n5-Aug-10,24.03,24.18,23.83,24.17,30216444\n4-Aug-10,23.79,24.25,23.78,24.14,48335001\n3-Aug-10,23.84,23.89,23.62,23.82,27135880\n2-Aug-10,23.43,23.94,23.40,23.80,43032193\n30-Jul-10,23.02,23.40,22.88,23.07,42185306\n29-Jul-10,23.53,26.00,22.96,23.21,37489144\n28-Jul-10,23.29,23.62,23.25,23.39,41763317\n27-Jul-10,23.68,23.72,23.20,23.30,47987843\n26-Jul-10,23.32,23.61,23.20,23.61,38334855\n23-Jul-10,23.16,23.41,23.01,23.35,39345335\n22-Jul-10,22.73,23.36,22.73,23.27,57954474\n21-Jul-10,23.06,23.22,22.40,22.56,45752008\n20-Jul-10,22.27,23.08,22.05,23.05,66166871\n19-Jul-10,22.87,23.03,22.55,22.73,54701821\n16-Jul-10,23.87,23.87,22.61,22.75,77068973\n15-Jul-10,23.70,23.96,23.42,23.92,51771266\n14-Jul-10,23.43,23.89,23.39,23.74,61469602\n13-Jul-10,23.04,23.28,22.99,23.09,45007656\n12-Jul-10,22.61,22.98,22.61,22.86,30564542\n9-Jul-10,22.55,22.81,22.43,22.70,41492409\n8-Jul-10,22.67,22.79,22.15,22.55,55312636\n7-Jul-10,21.49,22.49,21.45,22.48,70562838\n6-Jul-10,21.42,21.67,21.05,21.34,51189136\n5-Jul-10,21.13,21.13,21.13,21.13,0\n2-Jul-10,21.13,21.13,21.13,21.13,0\n1-Jul-10,21.20,21.49,20.93,21.26,66347865\n30-Jun-10,21.52,21.73,21.24,21.31,57127979\n29-Jun-10,22.15,22.19,21.40,21.62,68955137\n28-Jun-10,22.30,22.75,22.29,22.42,43405084\n25-Jun-10,22.59,22.67,22.11,22.18,76908892\n24-Jun-10,22.68,22.98,22.47,22.57,58022758\n23-Jun-10,23.11,23.14,22.64,22.86,54088268\n22-Jun-10,23.32,23.65,22.92,22.97,42148144\n21-Jun-10,23.84,23.94,23.12,23.34,54836676\n18-Jun-10,23.28,23.65,23.15,23.49,52422473\n17-Jun-10,23.49,23.50,23.05,23.17,52819627\n16-Jun-10,23.11,23.78,23.09,23.29,73637987\n15-Jun-10,22.82,23.45,22.80,23.33,77844187\n14-Jun-10,23.08,23.28,22.73,22.76,57279195\n11-Jun-10,22.53,22.99,22.52,22.91,56325401\n10-Jun-10,23.00,23.10,22.51,22.77,98936096\n9-Jun-10,23.02,23.45,22.74,22.78,47727653\n8-Jun-10,22.91,23.00,22.52,22.96,71580712\n7-Jun-10,23.01,23.29,22.68,22.76,50264802\n4-Jun-10,23.32,23.55,22.76,22.96,60603858\n3-Jun-10,23.49,23.77,23.27,23.72,49011801\n2-Jun-10,23.07,23.37,22.74,23.35,45755800\n1-Jun-10,22.94,23.48,22.92,23.00,56347864\n31-May-10,23.16,23.16,23.16,23.16,0\n28-May-10,23.16,23.16,23.16,23.16,0\n27-May-10,23.39,23.68,23.02,23.67,59790326\n26-May-10,23.56,23.75,22.84,22.89,72466092\n25-May-10,22.73,23.31,22.60,23.31,64858977\n24-May-10,23.46,23.70,23.13,23.37,48173256\n21-May-10,22.67,23.51,22.56,23.46,88187275\n20-May-10,23.56,23.89,23.13,23.31,97381316\n19-May-10,24.23,24.52,23.97,24.26,62398375\n18-May-10,25.00,25.02,24.18,24.36,59688862\n17-May-10,24.97,24.98,24.26,24.87,72486600\n14-May-10,25.26,25.30,24.69,24.94,82159544\n13-May-10,26.09,26.10,25.37,25.53,143656254\n12-May-10,26.22,26.80,26.19,26.74,66161698\n11-May-10,26.06,26.77,25.82,25.96,53764962\n10-May-10,26.12,26.53,25.90,26.13,74912109\n7-May-10,25.52,25.64,24.33,24.71,95894494\n6-May-10,26.40,26.65,23.23,25.49,97907977\n5-May-10,26.30,26.82,26.15,26.55,49889219\n4-May-10,27.24,27.25,26.40,26.56,52356974\n3-May-10,27.03,27.69,27.01,27.54,44976901\n30-Apr-10,27.68,27.74,26.92,26.93,41896141\n29-Apr-10,27.10,27.64,27.10,27.53,41867386\n28-Apr-10,27.11,27.38,26.82,27.04,54476828\n27-Apr-10,27.41,27.58,26.73,27.01,57168820\n26-Apr-10,27.58,27.70,27.48,27.57,35668511\n23-Apr-10,27.38,27.51,27.21,27.47,39306783\n22-Apr-10,27.08,27.37,26.72,27.32,44845750\n21-Apr-10,27.17,27.40,27.12,27.24,42738482\n20-Apr-10,27.19,27.45,27.06,27.18,47169807\n19-Apr-10,26.93,27.11,26.55,27.07,43890768\n16-Apr-10,27.15,27.44,26.79,26.98,68529424\n15-Apr-10,27.00,27.25,26.95,27.21,47016475\n14-Apr-10,26.63,26.93,26.56,26.88,44610066\n13-Apr-10,26.45,26.50,26.17,26.44,42863803\n12-Apr-10,26.57,26.74,26.49,26.53,28374334\n9-Apr-10,26.28,26.64,26.22,26.60,34613451\n8-Apr-10,26.28,26.39,26.00,26.28,38623382\n7-Apr-10,26.10,26.59,26.10,26.34,43840982\n6-Apr-10,26.13,26.38,26.05,26.22,31124212\n5-Apr-10,25.87,26.24,25.80,26.17,34806121\n2-Apr-10,25.83,25.83,25.83,25.83,0\n1-Apr-10,25.83,25.83,25.83,25.83,0\n31-Mar-10,26.52,26.61,25.96,26.03,54749425\n30-Mar-10,26.64,26.71,26.34,26.65,32976160\n29-Mar-10,26.61,26.69,26.45,26.51,30388646\n26-Mar-10,26.44,26.75,26.34,26.47,37528221\n25-Mar-10,26.66,26.85,26.42,26.43,35142599\n24-Mar-10,26.56,26.62,26.44,26.45,35299217\n23-Mar-10,26.19,26.75,26.17,26.64,48863070\n22-Mar-10,25.92,26.38,25.89,26.28,31906705\n19-Mar-10,26.37,26.44,26.07,26.15,55661784\n18-Mar-10,26.24,26.42,26.22,26.34,27087994\n17-Mar-10,26.20,26.40,26.18,26.26,32465840\n16-Mar-10,26.03,26.34,26.01,26.15,53894258\n15-Mar-10,25.76,26.09,25.74,26.08,36768501\n12-Mar-10,26.00,26.03,25.78,25.88,31167192\n11-Mar-10,25.79,25.98,25.72,25.97,37340472\n10-Mar-10,25.85,26.06,25.75,25.87,69660735\n9-Mar-10,26.33,26.48,25.70,26.13,160887564\n8-Mar-10,25.31,26.36,25.26,26.13,116178158\n5-Mar-10,24.97,25.24,24.92,25.21,57060394\n4-Mar-10,24.84,24.98,24.66,24.95,40261904\n3-Mar-10,24.70,24.93,24.60,24.84,50695027\n2-Mar-10,24.66,24.75,24.44,24.61,51404889\n1-Mar-10,24.33,24.65,24.32,24.60,41782570\n26-Feb-10,24.36,24.46,24.21,24.33,30727510\n25-Feb-10,24.00,24.39,23.87,24.33,37112486\n24-Feb-10,24.09,24.45,24.08,24.34,33183888\n23-Feb-10,24.16,24.23,23.83,24.05,36289256\n22-Feb-10,24.39,24.46,24.15,24.30,31379801\n19-Feb-10,24.13,24.38,24.06,24.36,38782047\n18-Feb-10,24.05,24.36,23.90,24.28,41154603\n17-Feb-10,23.99,24.09,23.74,24.07,48507156\n16-Feb-10,23.96,24.00,23.80,24.00,46760215\n15-Feb-10,23.76,23.76,23.76,23.76,0\n12-Feb-10,23.76,23.76,23.76,23.76,0\n11-Feb-10,23.67,23.99,23.54,23.93,42462558\n10-Feb-10,23.86,24.00,23.62,23.76,50574101\n9-Feb-10,23.80,24.00,23.58,23.89,60339781\n8-Feb-10,23.78,23.90,23.48,23.50,69908952\n5-Feb-10,23.30,23.88,23.16,23.70,99148510\n4-Feb-10,23.41,23.77,23.10,23.16,126098577\n3-Feb-10,23.16,23.25,22.85,23.07,80035486\n2-Feb-10,22.81,23.11,22.51,23.02,54108901\n1-Feb-10,22.65,22.94,22.38,22.73,54386091\n29-Jan-10,22.95,23.13,22.44,22.47,73431860\n28-Jan-10,23.18,23.22,22.35,22.52,63623264\n27-Jan-10,22.89,23.26,22.76,23.15,51807879\n26-Jan-10,22.80,23.20,22.64,22.90,55316794\n25-Jan-10,23.10,23.18,22.74,22.99,51293508\n22-Jan-10,23.84,23.93,22.87,22.97,70431639\n21-Jan-10,24.51,24.65,23.86,23.98,54767434\n20-Jan-10,24.62,24.73,24.12,24.41,42135001\n19-Jan-10,24.54,24.88,24.50,24.85,37607446\n18-Jan-10,24.40,24.40,24.40,24.40,0\n15-Jan-10,24.40,24.40,24.40,24.40,0\n14-Jan-10,24.58,25.08,24.52,24.95,52307589\n13-Jan-10,24.28,24.70,24.20,24.64,43683890\n12-Jan-10,24.44,24.50,24.08,24.20,35780391\n11-Jan-10,24.64,24.89,24.41,24.59,35852823\n8-Jan-10,24.38,24.70,24.25,24.66,39115841\n7-Jan-10,24.30,24.57,24.17,24.53,31540614\n6-Jan-10,24.54,24.74,24.34,24.42,35716784\n5-Jan-10,24.60,24.73,24.38,24.58,45128409\n4-Jan-10,24.11,24.84,24.01,24.69,59859189\n1-Jan-10,23.94,23.94,23.94,23.94,0\n31-Dec-09,23.94,23.94,23.94,23.94,0\n30-Dec-09,24.01,24.20,24.00,24.18,17203288\n29-Dec-09,24.03,24.17,24.00,24.10,21897234\n28-Dec-09,23.89,24.10,23.81,24.08,20191853\n25-Dec-09,23.96,23.96,23.96,23.96,0\n24-Dec-09,23.80,23.99,23.79,23.96,9900539\n23-Dec-09,23.79,23.93,23.70,23.78,23857577\n22-Dec-09,23.63,23.87,23.57,23.75,27145022\n21-Dec-09,23.52,23.82,23.48,23.64,35589842\n18-Dec-09,23.13,23.37,23.02,23.33,67228025\n17-Dec-09,23.46,23.47,23.14,23.18,33439130\n16-Dec-09,23.57,23.69,23.35,23.45,41819323\n15-Dec-09,23.81,23.90,23.47,23.48,52394647\n14-Dec-09,24.01,24.15,23.84,23.84,35444320\n11-Dec-09,24.04,24.07,23.67,23.77,27739068\n10-Dec-09,24.00,24.20,23.81,23.94,33704770\n9-Dec-09,23.78,23.89,23.44,23.86,38453421\n8-Dec-09,24.02,24.21,23.75,23.81,44130071\n7-Dec-09,24.11,24.40,24.10,24.21,33098619\n4-Dec-09,24.08,24.42,23.91,24.16,49539542\n3-Dec-09,23.98,24.19,23.83,23.83,35485393\n2-Dec-09,23.84,24.10,23.74,23.87,30990562\n1-Dec-09,23.43,24.00,23.39,23.92,39947105\n30-Nov-09,23.31,23.54,23.19,23.40,34349778\n27-Nov-09,23.10,23.52,23.02,23.38,21773858\n26-Nov-09,23.74,23.74,23.74,23.74,0\n25-Nov-09,23.76,23.87,23.65,23.74,27084230\n24-Nov-09,23.83,23.90,23.56,23.74,29988291\n23-Nov-09,23.69,23.91,23.65,23.90,29301116\n20-Nov-09,23.50,23.57,23.30,23.46,36322671\n19-Nov-09,23.87,23.88,23.41,23.68,38106293\n18-Nov-09,24.01,24.04,23.79,24.00,27236996\n17-Nov-09,23.92,24.11,23.82,24.09,37209226\n16-Nov-09,23.77,24.10,23.64,23.87,47598135\n13-Nov-09,23.51,23.80,23.45,23.71,35803979\n12-Nov-09,23.74,23.84,23.17,23.40,63814362\n11-Nov-09,23.73,24.00,23.71,23.92,39237490\n10-Nov-09,23.70,23.87,23.55,23.65,43081820\n9-Nov-09,23.93,24.00,23.72,23.99,46894337\n6-Nov-09,23.71,24.00,23.66,23.82,36619392\n5-Nov-09,24.05,24.07,23.62,23.93,87742264\n4-Nov-09,23.31,23.43,23.00,23.29,65580804\n3-Nov-09,22.82,23.04,22.55,22.91,46384002\n2-Nov-09,22.87,23.20,22.62,23.00,55071942\n30-Oct-09,23.46,23.48,22.64,22.81,61218215\n29-Oct-09,23.11,23.58,23.06,23.52,40057526\n28-Oct-09,23.37,23.53,22.97,23.02,47534441\n27-Oct-09,23.72,23.95,23.40,23.54,42703527\n26-Oct-09,24.15,24.40,23.63,23.70,45681938\n23-Oct-09,24.52,24.52,24.03,24.17,42528768\n22-Oct-09,23.90,24.25,23.83,24.18,33914772\n21-Oct-09,24.12,24.50,23.85,23.96,41883824\n20-Oct-09,24.37,24.55,23.96,24.11,52460423\n19-Oct-09,24.13,24.82,23.96,24.25,30644644\n16-Oct-09,24.10,24.13,23.70,24.02,38028021\n15-Oct-09,24.25,24.37,24.06,24.37,35860662\n14-Oct-09,24.26,24.50,24.18,24.38,49212738\n13-Oct-09,23.58,24.13,23.57,23.89,45600471\n12-Oct-09,24.07,24.22,23.62,23.78,32801618\n9-Oct-09,23.64,24.08,23.50,24.03,45654147\n8-Oct-09,23.83,23.92,23.55,23.67,45906865\n7-Oct-09,23.48,23.78,23.41,23.61,43260013\n6-Oct-09,23.16,23.57,23.07,23.35,41395885\n5-Oct-09,22.91,23.11,22.58,22.94,38749031\n2-Oct-09,22.86,23.08,22.62,22.67,42038580\n1-Oct-09,23.35,23.58,23.07,23.09,63043841\n30-Sep-09,23.55,23.79,22.96,23.54,64480047\n29-Sep-09,23.62,23.74,23.21,23.30,40230435\n28-Sep-09,23.29,23.87,23.27,23.61,68947038\n25-Sep-09,22.57,22.92,22.57,22.62,41075669\n24-Sep-09,22.84,22.99,22.46,22.65,39005374\n23-Sep-09,23.52,23.53,22.75,22.78,68053913\n22-Sep-09,23.71,23.72,23.30,23.41,34928475\n21-Sep-09,23.20,23.85,23.18,23.63,51081211\n18-Sep-09,23.50,23.61,23.24,23.40,53797478\n17-Sep-09,23.22,23.49,23.16,23.39,40431630\n16-Sep-09,23.07,23.45,23.00,23.36,53658457\n15-Sep-09,22.83,23.19,22.66,22.98,50926889\n14-Sep-09,22.85,22.99,22.61,22.79,60622743\n11-Sep-09,22.92,23.13,22.61,23.09,53498121\n10-Sep-09,22.15,23.05,22.01,23.01,76624178\n9-Sep-09,21.97,22.52,21.96,22.23,45121195\n8-Sep-09,22.00,22.21,21.79,21.92,39951465\n4-Sep-09,21.59,21.96,21.40,21.84,28952320\n3-Sep-09,21.73,21.90,21.34,21.49,33835239\n2-Sep-09,21.09,21.73,21.07,21.55,40254299\n1-Sep-09,21.46,21.87,21.08,21.17,48754043\n31-Aug-09,21.74,21.84,21.51,21.60,31409836\n28-Aug-09,22.15,22.35,21.80,22.00,35945809\n27-Aug-09,21.67,21.91,21.47,21.88,30293756\n26-Aug-09,21.91,22.00,21.81,21.93,33585013\n25-Aug-09,22.16,22.25,21.85,22.00,28409753\n24-Aug-09,22.22,22.64,21.93,22.06,52702738\n21-Aug-09,22.08,22.27,21.77,22.19,56593433\n20-Aug-09,21.25,21.96,21.20,21.89,55777105\n19-Aug-09,20.76,21.44,20.74,21.24,39237165\n18-Aug-09,20.82,21.15,20.79,21.01,33340937\n17-Aug-09,20.94,20.96,20.68,20.73,32440102\n14-Aug-09,21.47,21.55,21.00,21.31,35178631\n13-Aug-09,21.54,21.65,21.34,21.51,38935602\n12-Aug-09,21.23,21.61,21.18,21.43,49475202\n10-Aug-09,21.98,22.12,21.50,21.64,46640039\n7-Aug-09,22.49,22.74,22.15,22.19,46924767\n6-Aug-09,22.04,22.41,21.68,22.31,83321940\n5-Aug-09,22.55,22.57,22.01,22.17,79003196\n4-Aug-09,22.45,22.55,22.19,22.44,55890023\n3-Aug-09,22.21,22.61,22.19,22.57,61219731\n31-Jul-09,21.94,22.18,21.85,22.01,41674379\n30-Jul-09,21.98,22.40,21.84,21.98,52888965\n29-Jul-09,21.80,21.87,21.50,21.72,33626743\n28-Jul-09,21.62,21.99,21.37,21.93,40081691\n27-Jul-09,21.85,21.95,21.67,21.84,31608064\n24-Jul-09,21.48,21.97,21.42,21.88,40640018\n23-Jul-09,21.44,22.07,21.28,21.90,62820665\n22-Jul-09,21.44,21.83,21.27,21.45,52608661\n21-Jul-09,21.27,21.59,20.88,21.59,72575041\n20-Jul-09,20.82,21.27,20.80,21.15,78891886\n17-Jul-09,20.18,20.58,19.98,20.51,69179972\n16-Jul-09,19.74,20.20,19.71,20.12,57779333\n15-Jul-09,19.32,19.88,19.16,19.81,87952328\n14-Jul-09,18.43,18.94,18.43,18.73,46985796\n13-Jul-09,18.41,18.58,17.92,18.57,62382429\n10-Jul-09,18.08,18.45,18.02,18.34,46642839\n9-Jul-09,18.27,18.51,18.06,18.17,52949357\n8-Jul-09,18.25,18.33,17.82,18.13,53555533\n7-Jul-09,18.54,18.62,18.19,18.24,41560357\n6-Jul-09,18.32,18.70,18.30,18.53,35302300\n3-Jul-09,18.50,18.50,18.50,18.50,0\n2-Jul-09,18.67,18.73,18.45,18.50,41562541\n1-Jul-09,18.84,19.10,18.76,18.80,36649954\n30-Jun-09,18.94,19.07,18.53,18.65,53796486\n29-Jun-09,19.00,19.05,18.79,18.99,49234504\n26-Jun-09,18.92,19.16,18.85,18.91,47178080\n25-Jun-09,18.59,19.19,18.50,19.03,43402368\n24-Jun-09,18.74,19.00,18.52,18.61,47142283\n23-Jun-09,18.43,18.71,18.25,18.57,42678110\n22-Jun-09,18.75,18.80,18.35,18.41,46186450\n19-Jun-09,19.18,19.20,18.80,18.92,71703553\n18-Jun-09,19.23,19.29,18.92,18.99,37569822\n17-Jun-09,19.04,19.49,18.97,19.20,48812257\n16-Jun-09,19.42,19.48,19.03,19.08,45361326\n15-Jun-09,19.68,19.70,19.10,19.36,47975950\n12-Jun-09,19.93,20.00,19.63,19.91,41372311\n11-Jun-09,19.93,20.35,19.90,20.10,44784698\n10-Jun-09,20.19,20.24,19.60,19.95,58391441\n9-Jun-09,19.95,20.20,19.68,20.08,49764170\n8-Jun-09,19.74,20.06,19.53,19.87,42854962\n5-Jun-09,19.94,20.02,19.52,19.87,86048235\n4-Jun-09,19.46,19.81,19.30,19.67,40588573\n3-Jun-09,19.55,19.61,19.10,19.36,55122869\n2-Jun-09,19.57,19.86,19.41,19.61,53783622\n1-Jun-09,19.15,19.77,19.01,19.50,103321405\n29-May-09,18.54,18.60,18.09,18.50,61034747\n28-May-09,18.35,18.66,18.06,18.51,53072710\n27-May-09,18.41,18.71,18.11,18.22,40025403\n26-May-09,17.66,18.67,17.61,18.49,48660341\n22-May-09,18.09,18.15,17.66,17.90,33247857\n21-May-09,18.43,18.50,17.85,18.10,63317389\n20-May-09,19.02,19.06,18.46,18.60,49039766\n19-May-09,18.71,19.35,18.64,18.88,53827481\n18-May-09,18.14,18.81,18.06,18.72,67491222\n15-May-09,18.14,18.21,17.77,17.92,72110052\n14-May-09,18.07,18.29,18.05,18.09,43087893\n13-May-09,18.49,18.60,18.03,18.05,50714941\n12-May-09,18.67,18.82,18.55,18.72,39761786\n11-May-09,18.45,18.83,18.27,18.61,44324800\n8-May-09,19.00,19.22,18.55,18.73,65450933\n7-May-09,20.00,20.00,18.60,18.95,92373283\n6-May-09,19.76,19.85,19.03,19.61,93198816\n5-May-09,19.50,19.63,19.28,19.63,46395411\n4-May-09,19.82,19.87,19.26,19.50,63902242\n1-May-09,19.24,19.78,19.06,19.58,40342351\n30-Apr-09,19.69,19.93,19.10,19.32,60350794\n29-Apr-09,18.83,19.53,18.73,19.25,48502092\n28-Apr-09,18.30,18.96,18.15,18.67,47826175\n27-Apr-09,18.10,18.59,18.01,18.37,42312865\n24-Apr-09,18.12,18.50,17.97,18.42,55667021\n23-Apr-09,17.52,17.64,17.13,17.62,44000231\n22-Apr-09,17.45,18.02,17.43,17.44,54731375\n21-Apr-09,17.20,17.79,17.14,17.69,45752146\n20-Apr-09,17.71,17.79,17.20,17.31,55170924\n17-Apr-09,18.10,18.17,17.83,17.99,55985073\n16-Apr-09,17.82,18.18,17.65,18.08,51388170\n15-Apr-09,17.75,18.00,17.34,17.56,51890519\n14-Apr-09,17.80,18.18,17.61,17.93,42821461\n13-Apr-09,17.85,18.05,17.76,17.89,33973122\n10-Apr-09,17.82,17.82,17.82,17.82,0\n9-Apr-09,17.67,18.08,17.58,17.82,53098137\n8-Apr-09,17.29,17.33,16.94,17.13,45389036\n7-Apr-09,17.20,17.25,16.58,16.85,59902590\n6-Apr-09,17.56,17.64,17.07,17.53,63363139\n3-Apr-09,18.30,18.54,17.95,18.16,59424245\n2-Apr-09,17.83,18.61,17.79,18.14,88346092\n1-Apr-09,16.51,17.54,16.30,17.46,73415210\n31-Mar-09,16.53,17.01,16.37,16.77,59050133\n30-Mar-09,16.57,16.57,16.08,16.31,45060454\n27-Mar-09,17.00,17.17,16.85,16.95,37833604\n26-Mar-09,16.80,17.39,16.76,17.31,58051616\n25-Mar-09,16.50,17.05,16.28,16.57,64207766\n24-Mar-09,16.70,17.04,16.58,16.68,44614408\n23-Mar-09,16.31,17.00,15.90,16.98,64336343\n20-Mar-09,16.37,16.57,15.75,15.91,66078961\n19-Mar-09,16.68,16.68,16.06,16.23,56673233\n18-Mar-09,16.03,16.94,16.02,16.50,85030630\n17-Mar-09,15.72,16.15,15.57,16.14,52248877\n16-Mar-09,15.79,15.88,15.35,15.45,50267705\n13-Mar-09,15.46,15.69,15.25,15.51,43124501\n12-Mar-09,15.00,15.51,14.77,15.51,49618488\n11-Mar-09,14.79,15.20,14.52,15.02,55011942\n10-Mar-09,14.04,14.79,13.92,14.64,71743253\n9-Mar-09,14.00,14.43,13.61,13.62,78305971\n6-Mar-09,14.58,14.93,13.98,14.18,113692164\n5-Mar-09,14.94,15.09,14.51,14.55,67034454\n4-Mar-09,14.64,15.52,14.63,15.25,69582246\n3-Mar-09,14.49,14.73,14.36,14.39,62326519\n2-Mar-09,14.33,14.78,14.27,14.32,59924533\n27-Feb-09,14.30,14.82,14.30,14.57,76737766\n26-Feb-09,15.05,15.21,14.49,14.49,51015815\n25-Feb-09,14.92,15.13,14.37,14.77,56286282\n24-Feb-09,14.39,15.05,14.38,14.99,55486802\n23-Feb-09,15.20,15.35,14.31,14.36,51689452\n20-Feb-09,14.96,15.34,14.88,15.08,59378961\n19-Feb-09,15.46,15.52,15.01,15.04,42983526\n18-Feb-09,15.45,15.73,15.15,15.37,40633586\n17-Feb-09,15.68,15.76,15.28,15.29,47981089\n13-Feb-09,16.20,16.46,15.95,16.10,43643260\n12-Feb-09,15.97,16.22,15.63,16.20,57651617\n11-Feb-09,16.18,16.27,15.85,16.17,46280125\n10-Feb-09,16.59,16.93,15.92,16.05,69148864\n9-Feb-09,16.99,17.05,16.62,16.85,37633485\n6-Feb-09,16.42,17.09,16.21,17.04,62909898\n5-Feb-09,15.54,16.65,15.45,16.35,115570196\n4-Feb-09,15.72,16.16,15.38,15.84,95750520\n3-Feb-09,15.48,15.75,15.01,15.62,65941509\n2-Feb-09,14.86,15.46,14.83,15.31,55291653\n30-Jan-09,15.91,16.09,14.91,14.97,75294786\n29-Jan-09,16.70,16.70,15.80,15.93,53240926\n28-Jan-09,17.06,17.19,16.69,16.88,60150939\n27-Jan-09,16.43,17.00,16.29,16.73,50351536\n26-Jan-09,15.85,16.50,15.78,16.30,44640243\n23-Jan-09,15.04,16.02,15.00,15.89,56556867\n22-Jan-09,15.38,15.59,15.00,15.37,56676908\n21-Jan-09,15.32,15.76,15.05,15.70,56241601\n20-Jan-09,15.81,15.93,15.01,15.01,57814652\n16-Jan-09,16.22,16.33,15.50,15.82,66935323\n15-Jan-09,15.62,15.95,15.19,15.81,61817850\n14-Jan-09,16.10,16.22,15.60,15.74,50175827\n13-Jan-09,16.29,16.54,16.11,16.45,51936878\n12-Jan-09,16.68,16.78,16.03,16.40,54975603\n9-Jan-09,17.24,17.26,16.61,16.70,68240432\n8-Jan-09,17.23,17.57,17.00,17.54,46489622\n7-Jan-09,17.37,17.58,17.11,17.32,50263537\n6-Jan-09,17.33,17.98,17.26,17.79,58276394\n5-Jan-09,16.85,17.30,16.75,17.11,45480551\n2-Jan-09,16.41,17.00,16.25,16.96,40983122\n1-Jan-09,16.30,16.30,16.30,16.30,0\n31-Dec-08,16.18,16.55,16.12,16.30,37515383\n30-Dec-08,16.04,16.25,15.94,16.23,31098990\n29-Dec-08,16.16,16.25,15.73,16.01,33256904\n26-Dec-08,16.36,16.42,16.09,16.27,15164159\n25-Dec-08,16.35,16.35,16.35,16.35,0\n24-Dec-08,16.25,16.43,16.21,16.35,11595802\n23-Dec-08,16.42,16.65,16.07,16.24,30390977\n22-Dec-08,16.61,16.71,15.99,16.37,38809151\n19-Dec-08,16.64,16.95,16.60,16.64,63309238\n18-Dec-08,16.87,16.91,16.44,16.66,52402767\n17-Dec-08,17.17,17.34,16.71,16.84,62819566\n16-Dec-08,17.04,17.45,16.69,17.42,77777045\n15-Dec-08,16.88,17.02,16.51,16.84,40175450\n12-Dec-08,16.53,17.19,16.51,16.99,47023550\n11-Dec-08,17.13,17.64,16.83,16.91,56291368\n10-Dec-08,17.30,17.76,17.08,17.33,50813686\n9-Dec-08,16.91,17.93,16.75,17.16,67344280\n8-Dec-08,16.50,17.45,16.45,17.25,82288251\n5-Dec-08,15.16,16.10,14.72,15.94,67565857\n4-Dec-08,15.65,16.09,15.02,15.33,59179694\n3-Dec-08,14.91,16.03,14.86,16.01,69605904\n2-Dec-08,15.17,15.39,14.75,15.32,65682840\n1-Dec-08,16.16,16.16,14.93,14.96,62933254\n28-Nov-08,16.19,16.55,16.16,16.54,22481674\n27-Nov-08,16.39,16.39,16.39,16.39,0\n26-Nov-08,15.20,16.49,15.17,16.39,54906107\n25-Nov-08,16.49,16.49,15.28,15.42,82917961\n24-Nov-08,15.44,16.46,15.28,16.40,79851617\n21-Nov-08,14.81,15.30,14.20,15.17,104238437\n20-Nov-08,15.00,16.23,14.43,14.47,119465310\n19-Nov-08,16.18,16.23,15.00,15.08,72612588\n18-Nov-08,16.35,16.46,15.58,16.45,69155778\n17-Nov-08,16.47,16.81,16.11,16.21,47055886\n14-Nov-08,16.89,17.43,16.33,16.62,68821506\n13-Nov-08,16.37,17.30,15.60,17.26,90304835\n12-Nov-08,16.84,17.03,16.50,16.55,52608009\n11-Nov-08,17.38,17.45,16.94,17.18,49773549\n10-Nov-08,17.95,17.98,17.10,17.57,47958559\n7-Nov-08,17.18,17.73,17.13,17.58,64138800\n6-Nov-08,16.69,17.48,16.67,16.94,17902000\n5-Nov-08,18.05,18.30,17.29,17.39,80550700\n4-Nov-08,17.58,18.46,17.37,18.33,79029600\n3-Nov-08,17.68,17.70,17.00,17.20,54646800\n31-Oct-08,17.79,17.98,17.32,17.77,79869800\n30-Oct-08,18.29,18.32,17.50,17.79,66703500\n29-Oct-08,17.97,18.70,17.60,17.87,71958900\n28-Oct-08,16.76,18.35,16.45,18.31,83840600\n27-Oct-08,16.09,17.19,16.02,16.09,64833500\n24-Oct-08,16.08,16.93,15.90,16.31,87045300\n23-Oct-08,17.25,17.88,16.46,17.24,84196700\n22-Oct-08,17.34,17.84,16.81,17.41,75025100\n21-Oct-08,18.70,18.89,17.75,17.86,72945700\n20-Oct-08,18.35,19.01,17.81,18.96,65358700\n17-Oct-08,17.32,19.55,16.93,17.91,82501800\n16-Oct-08,16.72,17.75,16.20,17.75,3842400\n15-Oct-08,18.17,18.21,16.50,16.57,92789800\n14-Oct-08,19.91,20.15,18.03,18.54,83756300\n13-Oct-08,18.27,19.30,17.80,19.27,71249400\n10-Oct-08,16.49,18.22,16.29,17.23,32660400\n9-Oct-08,18.83,18.89,16.94,17.19,97882800\n8-Oct-08,18.02,19.60,17.80,18.34,28220400\n7-Oct-08,20.57,20.91,18.75,18.84,1724000\n6-Oct-08,20.39,20.97,19.31,20.46,4203400\n3-Oct-08,21.14,22.40,21.13,21.25,72790300\n2-Oct-08,21.95,21.99,21.05,21.20,61470900\n1-Oct-08,22.25,22.44,21.75,21.95,51559400\n30-Sep-08,22.25,22.61,21.84,22.56,58878300\n29-Sep-08,23.28,23.54,21.43,21.79,85368500\n26-Sep-08,22.92,24.00,22.87,23.82,58658400\n25-Sep-08,23.06,23.90,22.95,23.48,56642100\n24-Sep-08,22.82,23.21,22.58,22.80,42209800\n23-Sep-08,23.31,23.50,22.66,22.73,45319200\n22-Sep-08,23.90,24.20,23.04,23.11,51740900\n19-Sep-08,23.78,24.30,11.78,24.29,76223700\n18-Sep-08,22.24,23.25,21.85,22.80,82116200\n17-Sep-08,22.49,23.04,21.77,21.80,68151400\n16-Sep-08,21.80,23.14,21.74,22.80,77017600\n15-Sep-08,22.61,23.33,22.36,22.38,55129300\n12-Sep-08,22.87,23.59,22.61,23.46,50457700\n11-Sep-08,22.68,23.06,22.39,23.05,45179100\n10-Sep-08,23.22,23.32,22.97,22.99,38058000\n9-Sep-08,23.42,23.58,22.91,22.97,70371500\n8-Sep-08,22.78,23.44,22.43,23.37,65549500\n5-Sep-08,22.09,22.67,22.07,22.26,45373400\n4-Sep-08,22.79,22.80,22.16,22.28,63693400\n3-Sep-08,23.74,23.74,23.15,23.31,44166000\n2-Sep-08,24.35,24.50,23.55,23.75,46279000\n29-Aug-08,24.35,24.35,23.91,24.05,30836200\n28-Aug-08,24.48,24.78,24.41,24.66,27944700\n27-Aug-08,24.24,24.59,24.15,24.37,28130100\n26-Aug-08,24.29,24.34,23.88,24.11,27691600\n25-Aug-08,24.50,24.73,24.11,24.21,27625500\n22-Aug-08,24.38,24.82,24.28,24.71,27845700\n21-Aug-08,24.05,24.34,23.87,24.23,23039700\n20-Aug-08,24.34,24.48,24.01,24.23,31801000\n19-Aug-08,24.29,24.51,24.07,24.24,26696300\n18-Aug-08,24.95,25.08,24.27,24.49,30855200\n15-Aug-08,24.75,25.25,24.68,24.91,44999600\n14-Aug-08,24.16,24.86,24.12,24.67,37390800\n13-Aug-08,24.38,24.50,24.01,24.31,35041300\n12-Aug-08,24.68,24.78,24.35,24.50,40911600\n11-Aug-08,24.16,24.84,24.14,24.62,42604800\n8-Aug-08,23.75,24.44,23.70,24.25,52938400\n7-Aug-08,23.68,24.31,23.44,23.58,75065600\n6-Aug-08,23.94,24.25,23.46,23.93,15715200\n5-Aug-08,22.26,22.65,22.02,22.65,66068900\n4-Aug-08,22.05,22.17,21.72,21.99,49508500\n1-Aug-08,22.20,22.35,21.66,21.99,42987800\n31-Jul-08,22.06,22.60,21.98,21.99,55578400\n30-Jul-08,22.60,22.69,21.80,22.17,52086900\n29-Jul-08,22.19,22.52,22.07,22.42,41350200\n28-Jul-08,22.32,22.81,21.94,21.98,42190300\n25-Jul-08,22.33,22.58,21.93,22.43,61576800\n24-Jul-08,22.04,22.06,21.69,21.76,45329000\n23-Jul-08,21.97,22.61,21.80,22.17,46682500\n22-Jul-08,21.60,21.94,21.46,21.90,53694600\n21-Jul-08,21.80,22.39,21.74,21.84,44153600\n18-Jul-08,21.47,21.82,21.25,21.66,51493200\n17-Jul-08,21.35,21.88,20.93,21.52,63827000\n16-Jul-08,20.70,21.33,20.56,21.10,62921600\n15-Jul-08,21.04,21.43,20.72,21.04,62803900\n14-Jul-08,22.02,22.13,21.13,21.30,51991500\n11-Jul-08,21.82,22.13,21.54,21.82,62112200\n10-Jul-08,21.58,22.18,21.51,22.13,65852200\n9-Jul-08,22.22,22.36,21.54,21.58,96390200\n8-Jul-08,22.58,22.90,22.42,22.88,52179300\n7-Jul-08,23.22,23.39,22.36,22.57,70018200\n3-Jul-08,22.98,23.35,22.84,23.12,30198100\n2-Jul-08,23.14,23.19,22.67,22.84,58436900\n1-Jul-08,23.05,23.40,22.94,23.15,56880100\n30-Jun-08,23.46,23.73,23.16,23.26,47855400\n27-Jun-08,23.75,23.87,23.37,23.61,46041300\n26-Jun-08,24.34,24.50,23.82,23.82,43887200\n25-Jun-08,24.54,25.11,24.35,24.70,43610500\n24-Jun-08,24.33,24.85,24.20,24.48,35110600\n23-Jun-08,24.83,24.99,24.39,24.55,44319200\n20-Jun-08,25.35,25.36,24.47,24.64,66956600\n19-Jun-08,25.24,25.74,24.81,25.52,43241800\n18-Jun-08,25.79,25.89,25.23,25.28,49281800\n17-Jun-08,26.36,26.63,25.91,25.97,38279200\n16-Jun-08,26.17,26.44,25.97,26.27,31043000\n13-Jun-08,26.24,26.70,25.91,26.37,48151200\n12-Jun-08,25.94,26.32,25.64,25.96,42756300\n11-Jun-08,26.35,26.43,25.52,25.65,52697200\n10-Jun-08,26.16,26.58,26.08,26.36,36934700\n9-Jun-08,26.72,26.74,26.03,26.43,44742900\n6-Jun-08,27.32,27.45,26.50,26.54,68582800\n5-Jun-08,26.76,27.72,26.75,27.54,77406200\n4-Jun-08,26.22,26.98,26.21,26.76,59874600\n3-Jun-08,26.35,26.80,26.22,26.34,46207400\n2-Jun-08,26.72,26.82,26.24,26.35,58453100\n30-May-08,26.15,26.92,26.13,26.72,58590700\n29-May-08,25.58,26.35,25.52,26.21,58014100\n28-May-08,26.01,26.04,25.32,25.54,44732400\n27-May-08,25.06,25.69,25.04,25.59,36524000\n23-May-08,25.40,25.43,24.90,25.10,41220600\n22-May-08,25.36,25.80,25.19,25.58,34623700\n21-May-08,25.85,26.12,25.16,25.37,41811300\n20-May-08,26.13,26.46,25.66,25.85,40739000\n19-May-08,26.51,26.90,26.15,26.37,40793500\n16-May-08,26.53,26.65,26.03,26.51,56825500\n15-May-08,25.68,26.56,25.64,26.50,55328300\n14-May-08,26.00,26.34,25.72,25.75,48980000\n13-May-08,25.86,26.05,25.65,25.89,35828100\n12-May-08,25.45,25.87,25.40,25.84,37671400\n9-May-08,25.40,25.64,25.26,25.49,37706500\n8-May-08,25.99,26.00,25.30,25.70,47943200\n7-May-08,26.25,27.00,25.65,25.78,88920500\n6-May-08,26.05,26.49,25.78,26.33,79573700\n5-May-08,26.46,26.71,26.15,26.28,61713200\n2-May-08,26.97,27.00,26.42,26.75,66713300\n1-May-08,25.64,26.87,25.50,26.67,71031000\n30-Apr-08,25.69,25.97,25.51,25.64,50846300\n29-Apr-08,25.26,25.82,25.25,25.51,37581200\n28-Apr-08,25.64,25.76,25.30,25.35,33600400\n25-Apr-08,26.11,26.13,25.10,25.60,52672700\n24-Apr-08,25.56,26.29,25.28,26.03,53395000\n23-Apr-08,25.36,25.56,25.16,25.44,50151700\n22-Apr-08,24.73,24.96,24.55,24.92,46363700\n21-Apr-08,24.35,25.00,24.26,24.89,42356600\n18-Apr-08,24.53,24.80,24.21,24.51,53716400\n17-Apr-08,23.98,24.01,23.58,23.89,37424900\n16-Apr-08,23.46,24.00,23.33,23.83,50316200\n15-Apr-08,23.41,23.47,22.91,23.11,47511400\n14-Apr-08,23.28,23.59,23.15,23.31,31133500\n11-Apr-08,23.65,23.78,23.35,23.38,48135500\n10-Apr-08,23.75,24.21,23.36,24.04,60958000\n9-Apr-08,23.95,24.14,23.34,23.53,60352000\n8-Apr-08,23.82,24.16,23.75,23.96,45064000\n7-Apr-08,24.56,24.58,23.87,23.94,54020800\n4-Apr-08,24.36,24.82,24.06,24.39,47729800\n3-Apr-08,24.09,24.40,24.01,24.23,61691700\n2-Apr-08,25.04,25.55,24.79,24.96,51282300\n1-Apr-08,24.52,25.01,24.38,24.98,52399300\n31-Mar-08,24.08,24.41,23.96,24.09,48845100\n28-Mar-08,24.28,24.58,24.00,24.08,44754900\n27-Mar-08,24.63,24.76,24.12,24.18,53451400\n26-Mar-08,25.30,25.43,24.55,24.78,75015000\n25-Mar-08,25.73,25.88,25.37,25.75,45214900\n24-Mar-08,24.92,25.99,24.90,25.64,54610900\n20-Mar-08,24.60,24.93,24.33,24.77,66780700\n19-Mar-08,25.47,25.58,24.46,24.47,63383300\n18-Mar-08,24.69,25.61,24.63,25.58,70391700\n17-Mar-08,23.59,24.69,23.54,24.29,64109600\n14-Mar-08,25.05,25.14,24.04,24.32,73497200\n13-Mar-08,24.84,25.12,24.40,24.95,75503400\n12-Mar-08,25.17,25.60,25.00,25.14,55465700\n11-Mar-08,24.55,25.16,24.43,25.15,65066200\n10-Mar-08,24.12,24.49,23.99,23.99,46398000\n7-Mar-08,23.90,24.70,23.78,24.11,69492700\n6-Mar-08,24.32,24.40,23.92,23.94,71020500\n5-Mar-08,24.46,24.57,24.05,24.27,74261600\n4-Mar-08,24.09,24.48,23.74,24.29,95370000\n3-Mar-08,24.35,24.56,24.14,24.40,52103700\n29-Feb-08,24.30,24.77,24.28,24.39,71169300\n28-Feb-08,24.72,25.01,24.55,24.66,67197400\n27-Feb-08,23.92,25.15,23.83,24.95,87037000\n26-Feb-08,23.80,24.23,23.69,24.07,58433100\n25-Feb-08,23.52,23.89,23.19,23.80,55681900\n22-Feb-08,23.46,23.60,22.90,23.60,52986400\n21-Feb-08,23.81,23.99,23.09,23.19,61606400\n20-Feb-08,22.78,23.33,22.71,23.20,48882800\n19-Feb-08,23.56,23.69,22.78,22.88,64131400\n15-Feb-08,23.38,23.56,23.21,23.30,50611100\n14-Feb-08,24.02,24.09,23.48,23.53,54404200\n13-Feb-08,23.62,24.20,23.52,24.06,62547300\n12-Feb-08,23.67,24.00,23.25,23.43,55923700\n11-Feb-08,23.65,23.70,23.30,23.52,68082300\n8-Feb-08,23.26,23.75,23.00,23.54,94124700\n7-Feb-08,21.85,23.43,21.77,23.38,39606500\n6-Feb-08,23.43,24.02,23.06,23.08,18099400\n5-Feb-08,23.51,23.69,23.22,23.26,94360000\n4-Feb-08,25.04,25.05,23.62,23.82,91675600\n1-Feb-08,24.62,25.13,24.00,24.94,56623100\n31-Jan-08,23.98,24.70,23.89,24.50,72463500\n30-Jan-08,23.99,24.93,23.81,24.36,61541400\n29-Jan-08,24.27,24.30,23.69,24.06,70370900\n28-Jan-08,24.29,24.66,23.80,24.10,58129700\n25-Jan-08,26.05,26.09,24.10,24.20,77619600\n24-Jan-08,24.14,25.16,24.11,25.11,67849400\n23-Jan-08,22.57,24.43,22.30,24.03,13562900\n22-Jan-08,22.39,24.05,22.31,23.42,5994000\n18-Jan-08,24.23,25.15,24.06,24.30,91469900\n17-Jan-08,25.14,25.32,23.98,24.33,8749500\n16-Jan-08,25.60,25.61,24.79,25.15,88530800\n15-Jan-08,26.12,26.19,25.00,25.85,49790200\n14-Jan-08,26.61,26.67,26.20,26.29,51889500\n11-Jan-08,25.96,26.25,25.65,25.87,51193200\n10-Jan-08,26.06,26.45,25.80,26.24,53840900\n9-Jan-08,25.59,26.30,25.53,26.24,62704600\n8-Jan-08,26.36,26.79,25.42,25.43,57981400\n7-Jan-08,26.10,26.38,25.68,26.13,53931500\n4-Jan-08,26.37,26.93,26.01,26.12,55947400\n3-Jan-08,26.40,27.02,26.30,26.75,48193700\n2-Jan-08,27.00,27.30,26.21,26.54,62868200\n31-Dec-07,27.25,27.50,27.00,27.07,59511700\n28-Dec-07,27.95,28.20,27.23,27.56,43475200\n27-Dec-07,28.16,28.38,27.68,27.79,44098600\n26-Dec-07,28.65,28.69,28.20,28.38,35094600\n24-Dec-07,28.68,28.95,28.62,28.72,16299400\n21-Dec-07,28.66,29.00,28.42,28.60,67841700\n20-Dec-07,28.60,28.62,28.16,28.28,45860200\n19-Dec-07,28.14,28.50,27.97,28.19,33089000\n18-Dec-07,28.14,28.47,27.58,28.15,49260200\n17-Dec-07,28.59,28.65,27.92,27.95,42364000\n14-Dec-07,28.99,29.64,28.51,28.65,50094200\n13-Dec-07,28.88,29.54,28.82,29.06,54437400\n12-Dec-07,28.92,29.44,28.37,28.80,81231000\n11-Dec-07,27.82,28.99,27.80,28.02,88666900\n10-Dec-07,27.68,28.00,27.42,27.66,57335400\n7-Dec-07,27.98,28.03,27.44,27.45,53475500\n6-Dec-07,27.65,27.95,27.50,27.79,51994200\n5-Dec-07,27.44,27.81,27.12,27.48,64312900\n4-Dec-07,27.46,27.50,26.82,26.96,70532600\n3-Dec-07,28.00,28.24,27.53,27.57,52314800\n30-Nov-07,28.40,28.41,27.68,28.02,62650100\n29-Nov-07,27.81,28.28,27.79,28.15,41605900\n28-Nov-07,27.90,28.44,27.80,28.05,69366700\n27-Nov-07,27.63,27.98,26.92,27.49,69554500\n26-Nov-07,28.76,28.79,27.42,27.50,83909400\n23-Nov-07,28.44,28.78,28.14,28.69,21665300\n21-Nov-07,28.38,28.75,28.11,28.25,53297400\n20-Nov-07,29.44,29.84,28.49,29.04,61874300\n19-Nov-07,29.76,29.99,29.28,29.43,42596700\n16-Nov-07,29.85,30.10,29.45,29.94,52925300\n15-Nov-07,29.50,29.68,29.06,29.30,59423100\n14-Nov-07,30.42,30.44,29.55,29.71,60156700\n13-Nov-07,29.61,30.15,29.17,30.14,62831800\n12-Nov-07,28.83,29.79,28.79,29.11,88257700\n9-Nov-07,29.06,29.28,28.15,28.58,10374900\n8-Nov-07,30.40,31.09,29.51,29.63,82510300\n7-Nov-07,34.04,34.09,32.54,32.75,14812800\n6-Nov-07,33.45,34.24,33.41,34.08,88366300\n5-Nov-07,32.64,33.25,32.38,33.08,67728500\n2-Nov-07,32.40,32.71,32.11,32.51,52014400\n1-Nov-07,32.84,33.25,32.13,32.18,47830500\n31-Oct-07,32.94,33.19,32.49,33.06,51751800\n30-Oct-07,32.26,32.95,32.13,32.61,39390400\n29-Oct-07,32.25,32.49,32.00,32.41,33590200\n26-Oct-07,31.81,32.10,31.31,31.90,41066900\n25-Oct-07,31.37,31.88,31.05,31.18,40445000\n24-Oct-07,31.17,31.36,30.52,31.26,47742100\n23-Oct-07,31.35,31.58,30.09,31.54,49158200\n22-Oct-07,31.10,31.47,30.95,31.37,41252700\n19-Oct-07,32.62,32.63,31.40,31.50,56910500\n18-Oct-07,32.19,32.93,32.18,32.68,31227200\n17-Oct-07,32.70,32.74,31.91,32.46,37495800\n16-Oct-07,32.41,32.50,31.85,32.29,48931300\n15-Oct-07,32.92,33.14,32.51,32.79,33345300\n12-Oct-07,32.83,33.12,32.75,32.92,28023800\n11-Oct-07,33.38,33.60,32.60,32.80,44564200\n10-Oct-07,33.39,33.50,33.15,33.27,34922900\n9-Oct-07,32.80,33.09,32.65,33.08,31744200\n8-Oct-07,32.54,32.90,32.51,32.71,19142300\n5-Oct-07,32.34,32.81,32.26,32.65,34528100\n4-Oct-07,32.65,32.68,31.88,32.15,49655300\n3-Oct-07,32.90,32.97,32.43,32.45,36473000\n2-Oct-07,33.00,33.13,32.87,33.01,31030200\n1-Oct-07,33.06,33.33,32.97,32.99,39168100\n28-Sep-07,33.14,33.38,32.97,33.13,30573200\n27-Sep-07,33.02,33.29,32.85,33.23,37558200\n26-Sep-07,32.65,33.00,32.60,32.99,62116000\n25-Sep-07,31.75,32.53,31.65,32.44,46168500\n24-Sep-07,32.22,32.43,31.75,31.88,37760100\n21-Sep-07,32.56,32.56,32.19,32.30,52505500\n20-Sep-07,31.99,32.39,31.91,32.21,32748800\n19-Sep-07,32.23,32.48,32.05,32.09,48144700\n18-Sep-07,31.58,32.04,31.41,32.04,52961800\n17-Sep-07,31.33,31.75,31.25,31.50,28417900\n14-Sep-07,31.43,31.69,31.15,31.56,30729900\n13-Sep-07,31.96,32.04,31.40,31.51,32718800\n12-Sep-07,32.07,32.12,31.73,31.78,33710800\n11-Sep-07,31.96,32.17,31.73,32.16,32754100\n10-Sep-07,31.69,32.00,31.22,31.74,39744600\n7-Sep-07,31.43,31.77,31.09,31.52,60036200\n6-Sep-07,32.37,32.44,31.73,31.84,44748500\n5-Sep-07,32.10,32.29,31.92,32.22,51415000\n4-Sep-07,31.94,32.50,31.75,32.32,52730400\n31-Aug-07,31.87,31.98,31.67,31.92,37082500\n30-Aug-07,30.82,31.97,30.76,31.43,55024700\n29-Aug-07,30.54,31.02,30.49,31.00,37413500\n28-Aug-07,30.86,31.10,30.39,30.41,37019200\n27-Aug-07,30.51,31.25,30.51,31.10,42625300\n24-Aug-07,30.20,30.75,30.07,30.73,32880400\n23-Aug-07,30.49,30.62,30.06,30.27,37536600\n22-Aug-07,30.45,30.47,29.91,30.26,37184000\n21-Aug-07,29.76,30.30,29.69,30.10,38137600\n20-Aug-07,29.93,30.31,29.52,29.76,47956800\n17-Aug-07,30.01,30.46,29.56,29.99,74385400\n16-Aug-07,29.78,30.05,28.58,29.30,243500\n15-Aug-07,30.15,30.74,29.89,29.92,65502000\n14-Aug-07,30.98,31.17,30.08,30.26,84250800\n13-Aug-07,31.57,31.60,30.78,30.83,69920000\n10-Aug-07,31.00,31.50,30.84,31.39,80776700\n9-Aug-07,31.20,32.47,31.18,31.40,99361000\n8-Aug-07,31.13,32.25,31.00,31.68,84037000\n7-Aug-07,29.52,29.86,28.93,29.69,65989900\n6-Aug-07,29.59,29.70,28.90,29.50,69624900\n3-Aug-07,30.00,30.13,29.44,29.46,48985100\n2-Aug-07,29.72,30.21,29.67,30.13,56486700\n1-Aug-07,28.77,29.82,28.75,29.77,57235000\n31-Jul-07,29.82,29.86,28.91,28.91,49725700\n30-Jul-07,29.00,29.56,28.63,29.49,43132800\n27-Jul-07,29.73,29.85,28.94,28.97,64745500\n26-Jul-07,29.49,29.95,29.08,29.67,73630400\n25-Jul-07,30.00,30.24,29.65,29.91,50918500\n24-Jul-07,29.95,30.36,29.58,29.76,66440600\n23-Jul-07,29.73,30.39,29.68,30.26,61163800\n20-Jul-07,29.94,29.94,29.40,29.59,36723400\n19-Jul-07,29.85,30.00,29.81,29.94,51220300\n18-Jul-07,29.45,29.55,28.88,29.44,45113900\n17-Jul-07,29.84,29.98,29.60,29.73,35911000\n16-Jul-07,29.72,30.00,29.72,29.89,42283200\n13-Jul-07,29.52,29.96,29.50,29.89,54769300\n12-Jul-07,28.89,29.97,27.56,29.80,90407000\n11-Jul-07,28.14,28.80,28.13,28.76,40521300\n10-Jul-07,28.18,28.48,28.10,28.31,37153100\n9-Jul-07,28.42,28.50,28.35,28.45,30998400\n6-Jul-07,28.34,28.50,28.24,28.47,30002900\n5-Jul-07,28.06,28.38,27.94,28.37,35427400\n3-Jul-07,27.97,28.10,27.81,28.10,21675900\n2-Jul-07,28.02,28.06,27.79,27.89,31907000\n29-Jun-07,27.98,28.06,27.65,27.85,43649200\n28-Jun-07,27.71,28.40,27.57,27.85,75913100\n27-Jun-07,26.95,27.30,26.85,27.27,36823200\n26-Jun-07,27.29,27.49,26.99,27.15,50243300\n25-Jun-07,26.84,27.35,26.75,27.03,42857200\n22-Jun-07,27.17,27.49,26.85,26.92,44941900\n21-Jun-07,27.18,27.44,26.91,27.32,46487500\n20-Jun-07,27.38,27.70,27.14,27.20,61236500\n19-Jun-07,27.10,27.40,26.88,27.30,41327800\n18-Jun-07,27.39,27.40,27.04,27.21,44216100\n15-Jun-07,27.04,27.40,26.88,27.39,58468300\n14-Jun-07,26.53,26.97,26.51,26.83,37204200\n13-Jun-07,26.22,26.53,25.86,26.53,41349800\n12-Jun-07,26.12,26.53,26.03,26.06,47256600\n11-Jun-07,26.29,26.53,26.27,26.32,23601800\n8-Jun-07,25.88,26.51,25.84,26.48,46199700\n7-Jun-07,26.45,26.60,25.84,25.85,66134500\n6-Jun-07,26.98,27.08,26.47,26.60,41500000\n5-Jun-07,26.86,27.30,26.86,27.20,58076800\n4-Jun-07,26.72,27.05,26.65,27.01,31801300\n1-Jun-07,26.95,27.40,26.83,26.86,46454600\n31-May-07,26.74,26.99,26.49,26.92,71534000\n30-May-07,25.69,26.40,25.60,26.39,53715400\n29-May-07,25.59,26.00,25.55,25.90,39615200\n25-May-07,25.54,25.68,25.40,25.52,40755800\n24-May-07,26.01,26.06,25.33,25.40,67022200\n23-May-07,26.41,26.43,25.88,25.97,52789300\n22-May-07,26.38,26.50,26.26,26.37,38845000\n21-May-07,26.21,26.54,26.19,26.40,41393100\n18-May-07,26.36,26.41,26.16,26.21,38549300\n17-May-07,26.30,26.62,26.25,26.28,36103500\n16-May-07,26.30,26.49,26.13,26.48,37023000\n15-May-07,26.36,26.49,26.08,26.13,41806200\n14-May-07,26.62,26.65,26.12,26.29,49899800\n11-May-07,26.44,26.65,26.35,26.63,38151600\n10-May-07,26.37,26.77,26.26,26.29,58006400\n9-May-07,27.02,27.09,26.44,26.51,45068300\n8-May-07,27.78,28.48,27.64,28.36,82295000\n7-May-07,27.96,27.97,27.76,27.81,45532500\n4-May-07,27.94,28.00,27.80,27.91,45004100\n3-May-07,27.76,27.94,27.56,27.70,35398100\n2-May-07,27.03,27.75,27.02,27.67,55502000\n1-May-07,26.87,27.03,26.56,26.86,45563100\n30-Apr-07,27.00,27.20,26.74,26.74,46931200\n27-Apr-07,26.51,27.05,26.49,27.03,44402000\n26-Apr-07,26.82,27.16,26.54,26.55,49867100\n25-Apr-07,26.53,26.87,26.22,26.78,44097500\n24-Apr-07,26.65,26.66,26.06,26.33,51852000\n23-Apr-07,26.91,26.94,26.50,26.58,37072400\n20-Apr-07,27.05,27.10,26.75,26.99,41204300\n19-Apr-07,26.59,26.75,26.47,26.68,28143300\n18-Apr-07,26.66,26.99,26.50,26.87,31512400\n17-Apr-07,26.68,27.12,26.56,26.84,55884200\n16-Apr-07,26.67,26.93,26.48,26.62,50216200\n13-Apr-07,25.92,26.95,25.64,26.68,82064300\n12-Apr-07,25.78,26.07,25.63,25.97,27753300\n11-Apr-07,25.97,26.14,25.64,25.79,42112000\n10-Apr-07,26.10,26.18,25.78,25.99,38168300\n9-Apr-07,26.12,26.35,26.11,26.20,27655100\n5-Apr-07,26.02,26.17,25.90,26.06,29043500\n4-Apr-07,25.95,26.22,25.88,26.10,38982400\n3-Apr-07,25.54,26.07,25.44,25.85,44319000\n2-Apr-07,25.66,25.73,25.31,25.40,32783700\n30-Mar-07,25.43,25.65,25.11,25.53,35853500\n29-Mar-07,25.92,25.97,25.16,25.43,55349500\n28-Mar-07,25.79,27.00,25.57,25.70,40578900\n27-Mar-07,26.15,26.24,25.85,25.93,35665600\n26-Mar-07,26.23,26.35,25.81,26.34,43421500\n23-Mar-07,26.45,26.58,26.19,26.19,30279300\n22-Mar-07,26.76,26.79,26.36,26.37,35808300\n21-Mar-07,26.40,26.79,26.06,26.79,43588500\n20-Mar-07,26.33,26.48,26.10,26.34,41863500\n19-Mar-07,26.19,26.37,26.00,26.30,35761600\n16-Mar-07,25.79,26.07,25.73,25.99,48629000\n15-Mar-07,25.70,25.93,25.62,25.81,34221800\n14-Mar-07,25.50,25.88,25.26,25.85,52633300\n13-Mar-07,26.00,26.23,25.47,25.50,55048200\n12-Mar-07,25.98,26.25,25.89,26.17,27390600\n9-Mar-07,26.42,26.49,25.94,26.08,36638200\n8-Mar-07,26.17,26.43,26.07,26.15,43176800\n7-Mar-07,25.91,26.12,25.58,25.87,64152500\n6-Mar-07,25.79,26.07,25.70,25.96,50164400\n5-Mar-07,25.02,25.75,24.82,25.46,58148500\n2-Mar-07,25.69,25.97,25.15,25.30,68103300\n1-Mar-07,25.40,26.25,25.07,25.85,69831600\n28-Feb-07,25.83,26.25,25.75,25.94,62240000\n27-Feb-07,26.75,26.95,25.44,25.71,76402500\n26-Feb-07,27.64,27.70,27.02,27.24,37462100\n23-Feb-07,27.35,27.67,27.35,27.51,40115800\n22-Feb-07,27.52,27.61,27.22,27.40,39919200\n21-Feb-07,27.32,27.61,27.30,27.38,34933300\n20-Feb-07,27.56,28.00,27.28,27.66,40301200\n16-Feb-07,27.48,27.55,27.36,27.52,32492300\n15-Feb-07,27.59,27.81,27.45,27.56,36093400\n14-Feb-07,27.26,27.65,27.15,27.46,48105700\n13-Feb-07,27.66,27.73,27.01,27.18,58590500\n12-Feb-07,27.62,27.75,27.42,27.54,38881200\n9-Feb-07,28.06,28.15,27.48,27.71,50184000\n8-Feb-07,27.90,28.35,27.80,28.14,54608100\n7-Feb-07,28.62,28.85,28.08,28.09,23824200\n6-Feb-07,27.75,27.78,27.12,27.28,82322100\n5-Feb-07,27.42,27.67,27.23,27.51,60131200\n2-Feb-07,26.91,27.18,26.60,27.14,58199300\n1-Feb-07,26.67,26.99,26.36,26.59,54959000\n31-Jan-07,26.19,26.81,26.05,26.62,59766800\n30-Jan-07,26.29,26.34,26.03,26.25,44356100\n29-Jan-07,26.29,26.47,26.00,26.21,50662100\n26-Jan-07,26.16,26.54,25.76,26.35,64137000\n25-Jan-07,26.93,26.95,26.16,26.22,54155800\n24-Jan-07,26.23,26.95,26.19,26.89,62921800\n23-Jan-07,26.37,26.72,26.03,26.04,66637500\n22-Jan-07,26.75,26.80,26.15,26.53,65616600\n19-Jan-07,26.45,26.85,26.42,26.70,60314800\n18-Jan-07,27.13,27.15,26.27,26.45,80080200\n17-Jan-07,27.86,28.00,26.89,26.98,6687600\n16-Jan-07,28.59,28.59,28.00,28.04,74656100\n12-Jan-07,28.54,28.97,28.45,28.92,54333000\n11-Jan-07,28.77,28.99,28.61,28.69,54159500\n10-Jan-07,28.27,28.73,28.21,28.68,49874400\n9-Jan-07,28.72,28.75,28.31,28.47,50158500\n8-Jan-07,28.54,28.74,28.32,28.63,47164500\n5-Jan-07,28.44,28.57,28.05,28.47,61977400\n4-Jan-07,27.68,28.49,27.54,28.46,71901900\n3-Jan-07,27.46,27.98,27.33,27.73,63224800\n29-Dec-06,27.33,27.63,27.29,27.33,26775100\n28-Dec-06,27.28,27.58,27.25,27.42,34644100\n27-Dec-06,27.30,27.50,26.83,27.30,25487000\n26-Dec-06,27.04,27.33,26.85,27.19,18066200\n22-Dec-06,27.34,27.42,26.93,26.93,27202200\n21-Dec-06,27.50,27.60,27.22,27.29,29233300\n20-Dec-06,27.68,27.70,27.38,27.39,31726800\n19-Dec-06,27.47,27.76,27.30,27.63,38217800\n18-Dec-06,27.60,27.96,27.43,27.61,46090500\n15-Dec-06,27.43,27.77,27.33,27.56,52272500\n14-Dec-06,27.22,27.44,27.18,27.31,37588500\n13-Dec-06,27.34,27.35,26.93,27.25,42606400\n12-Dec-06,27.12,27.40,26.76,27.08,43249300\n11-Dec-06,26.90,27.48,26.85,27.11,42778200\n8-Dec-06,26.88,27.15,26.75,26.98,29205400\n7-Dec-06,27.20,27.30,26.88,26.88,31083000\n6-Dec-06,27.12,27.27,26.95,27.09,33661000\n5-Dec-06,27.40,27.44,27.00,27.04,41985500\n4-Dec-06,26.94,27.57,26.86,27.25,68047000\n1-Dec-06,26.95,27.08,26.45,26.69,46776600\n30-Nov-06,27.02,27.05,26.80,26.91,44750500\n29-Nov-06,27.05,27.30,26.90,27.08,65612300\n28-Nov-06,25.62,27.13,25.59,27.03,8058600\n27-Nov-06,26.76,26.89,25.73,25.80,63218000\n24-Nov-06,26.70,26.88,26.24,26.84,13315600\n22-Nov-06,26.93,26.99,26.75,26.91,26618900\n21-Nov-06,27.17,27.18,26.73,26.80,43396200\n20-Nov-06,26.98,27.14,26.72,27.11,41595800\n17-Nov-06,26.99,27.06,26.79,26.93,43458600\n16-Nov-06,26.74,27.32,26.73,27.15,65113000\n15-Nov-06,26.62,26.75,26.50,26.60,46335200\n14-Nov-06,26.70,26.74,26.41,26.64,46848200\n13-Nov-06,26.74,26.80,26.52,26.68,49021800\n10-Nov-06,26.67,26.98,26.56,26.74,57918600\n9-Nov-06,27.44,27.44,26.65,26.71,86031300\n8-Nov-06,24.67,25.39,24.50,25.10,1642900\n7-Nov-06,24.82,25.01,24.57,24.84,75452700\n6-Nov-06,24.14,24.85,24.12,24.68,73792000\n3-Nov-06,24.01,24.03,23.56,23.77,39032900\n2-Nov-06,23.98,24.14,23.90,24.05,37938300\n1-Nov-06,24.34,24.45,23.95,24.10,48116700\n31-Oct-06,24.16,24.39,24.02,24.13,44549200\n30-Oct-06,23.52,24.03,23.27,23.90,42524200\n27-Oct-06,24.11,24.19,23.63,23.72,42641100\n26-Oct-06,24.34,24.36,23.96,24.19,34132300\n25-Oct-06,24.23,24.42,24.09,24.29,38647000\n24-Oct-06,24.36,24.54,24.16,24.34,29724000\n23-Oct-06,24.45,24.64,24.27,24.43,48035300\n20-Oct-06,24.20,24.58,23.95,24.55,47683000\n19-Oct-06,24.01,24.24,23.73,24.16,48139900\n18-Oct-06,24.43,24.64,24.10,24.18,35886400\n17-Oct-06,24.45,24.56,24.12,24.48,39231400\n16-Oct-06,24.64,24.78,24.55,24.59,35156000\n13-Oct-06,24.40,24.62,24.36,24.53,35545600\n12-Oct-06,24.40,24.53,24.12,24.45,41189200\n11-Oct-06,24.21,24.55,24.17,24.40,39999400\n10-Oct-06,24.24,24.39,24.00,24.33,40651000\n9-Oct-06,24.25,24.40,24.12,24.31,36954400\n6-Oct-06,23.79,24.20,23.74,24.09,48578300\n5-Oct-06,23.91,24.00,23.74,23.90,49402200\n4-Oct-06,23.28,23.98,23.26,23.93,55468300\n3-Oct-06,22.87,23.49,22.80,23.41,37989000\n2-Oct-06,23.05,23.24,22.96,22.98,32832700\n29-Sep-06,23.44,23.53,22.96,22.98,36963500\n28-Sep-06,23.23,23.50,23.12,23.48,39762800\n27-Sep-06,23.31,23.48,23.12,23.35,37073700\n26-Sep-06,23.13,23.50,23.00,23.50,55446400\n25-Sep-06,22.97,23.25,22.67,23.23,39894900\n22-Sep-06,22.85,23.04,22.57,22.88,45110300\n21-Sep-06,23.35,23.47,22.94,23.01,56114400\n20-Sep-06,22.95,23.34,22.83,23.27,76011100\n19-Sep-06,22.80,22.98,22.44,22.76,55340100\n18-Sep-06,22.77,23.00,22.67,22.84,46919100\n15-Sep-06,22.86,23.28,22.60,22.72,60556600\n14-Sep-06,22.55,22.78,22.54,22.70,40171000\n13-Sep-06,22.62,22.89,22.55,22.65,43186500\n12-Sep-06,21.97,22.65,21.89,22.65,65844600\n11-Sep-06,21.56,22.14,21.52,21.96,42533900\n8-Sep-06,21.64,21.76,21.32,21.75,33145800\n7-Sep-06,21.53,21.80,21.18,21.54,55875200\n6-Sep-06,21.79,22.29,21.60,21.69,65397400\n5-Sep-06,22.13,22.27,22.02,22.09,65355100\n1-Sep-06,22.05,22.35,21.85,22.27,67114700\n31-Aug-06,21.65,22.15,21.65,21.99,85049700\n30-Aug-06,21.64,21.75,21.50,21.67,35867600\n29-Aug-06,21.34,21.69,21.19,21.68,43274600\n28-Aug-06,20.96,21.48,20.89,21.41,35030000\n25-Aug-06,21.03,21.27,20.96,21.05,28937800\n24-Aug-06,21.31,21.42,20.97,21.09,36077100\n23-Aug-06,21.20,21.33,20.83,21.05,36340100\n22-Aug-06,20.90,21.34,20.84,21.24,49374700\n21-Aug-06,20.61,21.00,20.57,20.91,28744500\n18-Aug-06,20.82,20.90,20.47,20.86,35015200\n17-Aug-06,20.99,21.14,20.72,20.85,43187100\n16-Aug-06,20.80,21.14,20.59,21.10,65026600\n15-Aug-06,20.45,20.85,20.29,20.65,71660500\n14-Aug-06,19.88,20.22,19.77,20.09,63444100\n11-Aug-06,19.51,19.73,19.37,19.54,42123300\n10-Aug-06,19.60,19.78,19.32,19.56,52115000\n9-Aug-06,19.41,19.95,19.35,19.78,19592900\n8-Aug-06,17.64,17.65,17.15,17.29,64530100\n7-Aug-06,17.28,17.59,17.19,17.41,34138900\n4-Aug-06,17.65,17.66,17.10,17.24,66553700\n3-Aug-06,17.32,17.64,17.15,17.56,58446300\n2-Aug-06,17.57,17.69,17.28,17.48,57521800\n1-Aug-06,17.85,17.87,17.48,17.48,40610700\n31-Jul-06,17.99,18.36,17.85,17.88,46805200\n28-Jul-06,17.84,18.08,17.79,18.08,36459000\n27-Jul-06,18.06,18.12,17.60,17.69,33044500\n26-Jul-06,17.98,18.18,17.86,17.94,32367500\n25-Jul-06,17.99,18.20,17.72,18.07,33532700\n24-Jul-06,17.67,18.02,17.55,17.95,43631200\n21-Jul-06,17.80,17.85,17.45,17.46,54934600\n20-Jul-06,18.07,18.09,17.61,17.88,60846100\n19-Jul-06,17.89,18.43,17.79,18.00,67869100\n18-Jul-06,18.03,18.17,17.51,17.88,47626900\n17-Jul-06,17.97,18.27,17.86,17.97,41537200\n14-Jul-06,18.02,18.22,17.77,17.94,39620300\n13-Jul-06,18.10,18.42,17.88,18.02,49693100\n12-Jul-06,18.58,18.66,18.20,18.26,37284500\n"
  },
  {
    "path": "examples/stockserver/DELL.csv",
    "content": "﻿Date,Open,High,Low,Close,Volume\n9-Jul-12,12.51,12.60,12.16,12.27,17266074\n6-Jul-12,12.58,12.63,12.35,12.56,15415621\n5-Jul-12,12.67,12.73,12.55,12.63,11150381\n3-Jul-12,12.42,12.69,12.35,12.68,10701626\n2-Jul-12,12.54,12.60,12.31,12.38,13075203\n29-Jun-12,12.16,12.60,12.15,12.51,20735627\n28-Jun-12,12.18,12.19,11.76,11.95,21747404\n27-Jun-12,11.96,12.36,11.95,12.33,23345904\n26-Jun-12,11.97,12.06,11.75,11.92,22628968\n25-Jun-12,12.09,12.10,11.85,11.94,21144372\n22-Jun-12,12.01,12.23,12.01,12.20,37018138\n21-Jun-12,12.27,12.30,11.96,12.00,21904276\n20-Jun-12,12.20,12.31,12.12,12.30,21403033\n19-Jun-12,12.43,12.44,12.04,12.18,34717833\n18-Jun-12,12.25,12.45,12.16,12.42,15743521\n15-Jun-12,12.35,12.41,12.18,12.30,25100053\n14-Jun-12,12.30,12.39,12.20,12.34,19283847\n13-Jun-12,12.35,12.59,12.21,12.28,42142268\n12-Jun-12,11.91,12.01,11.68,11.97,17608166\n11-Jun-12,12.15,12.20,11.82,11.86,16931978\n8-Jun-12,12.13,12.22,12.02,12.12,18155683\n7-Jun-12,12.32,12.41,12.12,12.13,20074035\n6-Jun-12,12.20,12.28,12.09,12.22,20779977\n5-Jun-12,11.95,12.24,11.95,12.16,15620917\n4-Jun-12,12.11,12.11,11.80,12.00,17015779\n1-Jun-12,12.15,12.30,12.04,12.07,19397658\n31-May-12,12.53,12.54,12.33,12.33,19955689\n30-May-12,12.59,12.70,12.46,12.56,19787882\n29-May-12,12.58,12.84,12.58,12.66,24174980\n25-May-12,12.43,12.70,12.42,12.46,20311911\n24-May-12,12.54,12.63,12.35,12.45,29707219\n23-May-12,12.87,13.10,12.31,12.49,109242617\n22-May-12,15.01,15.29,14.75,15.08,27540744\n21-May-12,14.80,15.00,14.60,14.97,14991377\n18-May-12,15.02,15.02,14.66,14.74,21887932\n17-May-12,15.03,15.31,14.94,14.94,23329161\n16-May-12,15.35,15.41,15.00,15.02,18569870\n15-May-12,15.46,15.62,15.29,15.34,14885123\n14-May-12,15.25,15.54,15.24,15.44,13875744\n11-May-12,15.52,15.65,15.42,15.42,11615796\n10-May-12,15.69,15.81,15.48,15.55,20608954\n9-May-12,15.55,15.72,15.36,15.67,13302768\n8-May-12,15.71,15.76,15.51,15.71,13159175\n7-May-12,15.65,15.92,15.55,15.82,10423785\n4-May-12,16.07,16.12,15.77,15.81,15351854\n3-May-12,16.23,16.38,16.17,16.23,15063013\n2-May-12,16.27,16.40,16.12,16.18,15642325\n1-May-12,16.39,16.59,16.31,16.40,10697226\n30-Apr-12,16.37,16.45,16.28,16.37,7286332\n27-Apr-12,16.61,16.61,16.35,16.44,10173125\n26-Apr-12,16.32,16.57,16.28,16.53,10240619\n25-Apr-12,16.31,16.45,16.23,16.42,13919879\n24-Apr-12,16.16,16.22,16.06,16.18,14084129\n23-Apr-12,16.07,16.18,15.92,16.10,13823701\n20-Apr-12,16.22,16.34,16.00,16.16,14546810\n19-Apr-12,16.06,16.42,15.96,16.16,17728773\n18-Apr-12,16.24,16.32,16.13,16.16,10798374\n17-Apr-12,16.23,16.43,16.14,16.38,15149973\n16-Apr-12,16.20,16.27,16.00,16.13,14338056\n13-Apr-12,16.17,16.34,16.05,16.11,14642142\n12-Apr-12,16.25,16.32,16.11,16.26,15210246\n11-Apr-12,16.36,16.42,16.19,16.26,12616005\n10-Apr-12,16.52,16.70,16.16,16.25,29207203\n9-Apr-12,16.25,16.32,16.11,16.22,11679772\n5-Apr-12,16.33,16.58,16.33,16.49,11782727\n4-Apr-12,16.48,16.51,16.32,16.46,15106746\n3-Apr-12,16.59,16.77,16.44,16.61,20310809\n2-Apr-12,16.52,16.85,16.51,16.77,13366078\n30-Mar-12,16.68,16.78,16.57,16.60,19722431\n29-Mar-12,16.54,16.61,16.34,16.60,14268903\n28-Mar-12,16.63,16.76,16.32,16.52,24309951\n27-Mar-12,16.72,16.75,16.60,16.66,17940049\n26-Mar-12,16.64,16.74,16.46,16.70,18132403\n23-Mar-12,16.82,16.84,16.40,16.48,27710403\n22-Mar-12,17.12,17.15,16.97,17.02,15352046\n21-Mar-12,17.18,17.27,17.03,17.22,12651437\n20-Mar-12,17.25,17.30,17.12,17.16,9210707\n19-Mar-12,17.28,17.46,17.21,17.37,10739451\n16-Mar-12,17.34,17.38,17.11,17.30,22590600\n15-Mar-12,17.33,17.42,17.23,17.35,12771510\n14-Mar-12,17.22,17.44,17.18,17.42,19732244\n13-Mar-12,17.08,17.29,16.98,17.23,15126332\n12-Mar-12,16.86,17.01,16.75,16.96,13693820\n9-Mar-12,17.21,17.26,16.85,16.93,17857652\n8-Mar-12,17.10,17.31,17.06,17.21,13369283\n7-Mar-12,16.85,17.04,16.82,17.00,15628591\n6-Mar-12,16.91,17.04,16.63,16.81,18392898\n5-Mar-12,17.29,17.46,17.01,17.11,14549288\n2-Mar-12,17.30,17.49,17.24,17.36,13265020\n1-Mar-12,17.43,17.48,17.31,17.38,14238625\n29-Feb-12,17.57,17.70,17.27,17.30,19063878\n28-Feb-12,17.50,17.66,17.39,17.58,16861185\n27-Feb-12,17.32,17.67,17.18,17.52,20940428\n24-Feb-12,17.47,17.64,17.37,17.43,17539854\n23-Feb-12,17.08,17.56,17.05,17.40,26794905\n22-Feb-12,16.98,17.30,16.86,17.15,51445830\n21-Feb-12,18.20,18.36,18.05,18.21,31656009\n17-Feb-12,18.14,18.24,17.92,18.16,32178340\n16-Feb-12,17.89,18.33,17.89,18.32,21442220\n15-Feb-12,17.76,18.19,17.71,17.99,24737348\n14-Feb-12,18.03,18.14,17.83,18.04,13559743\n13-Feb-12,17.93,18.12,17.84,17.98,11805420\n10-Feb-12,17.84,17.97,17.72,17.75,16158282\n9-Feb-12,18.09,18.20,17.91,18.06,14594663\n8-Feb-12,17.75,18.12,17.74,18.05,17557363\n7-Feb-12,17.63,17.92,17.60,17.83,16085732\n6-Feb-12,17.66,17.77,17.61,17.65,14870199\n3-Feb-12,17.78,17.84,17.59,17.66,25803229\n2-Feb-12,17.65,17.88,17.54,17.60,29291094\n1-Feb-12,17.30,17.65,17.29,17.40,22483019\n31-Jan-12,17.09,17.23,17.02,17.23,20273623\n30-Jan-12,16.54,17.11,16.50,16.98,17166102\n27-Jan-12,16.58,16.80,16.55,16.74,11615155\n26-Jan-12,16.89,16.92,16.55,16.69,15625765\n25-Jan-12,16.75,16.90,16.50,16.79,15188026\n24-Jan-12,16.82,17.00,16.76,16.85,16394033\n23-Jan-12,16.72,16.98,16.65,16.87,12180224\n20-Jan-12,16.49,16.71,16.45,16.67,12294367\n19-Jan-12,16.44,16.62,16.37,16.57,17663893\n18-Jan-12,16.14,16.50,16.08,16.39,18643303\n17-Jan-12,16.00,16.20,15.96,16.08,17045943\n13-Jan-12,15.88,15.88,15.88,15.88,0\n12-Jan-12,15.86,15.96,15.72,15.94,14138321\n11-Jan-12,15.68,15.86,15.51,15.80,16333016\n10-Jan-12,15.72,15.95,15.71,15.82,17036642\n9-Jan-12,15.37,15.67,15.32,15.58,21813511\n6-Jan-12,15.16,15.44,15.13,15.36,7131304\n5-Jan-12,15.02,15.21,14.96,15.17,15587994\n4-Jan-12,14.96,15.08,14.78,15.02,11012390\n3-Jan-12,14.98,15.20,14.92,14.98,14532300\n30-Dec-11,14.63,14.63,14.63,14.63,0\n29-Dec-11,14.70,14.78,14.67,14.76,7450838\n28-Dec-11,14.86,14.87,14.63,14.68,8347018\n27-Dec-11,14.86,14.97,14.83,14.86,6529226\n23-Dec-11,14.90,14.90,14.90,14.90,0\n22-Dec-11,14.80,14.85,14.73,14.76,27024383\n21-Dec-11,15.00,15.14,14.51,14.70,19184356\n20-Dec-11,14.95,15.34,14.92,15.15,14838908\n19-Dec-11,15.03,15.19,14.64,14.68,14961551\n16-Dec-11,15.10,15.36,15.00,15.03,21286841\n15-Dec-11,15.21,15.29,14.95,15.05,19056940\n14-Dec-11,15.20,15.23,14.95,15.05,19268659\n13-Dec-11,15.56,15.67,15.10,15.19,20617159\n12-Dec-11,15.49,15.63,15.20,15.42,14880918\n9-Dec-11,15.36,15.95,15.12,15.79,15822329\n8-Dec-11,15.79,15.86,15.45,15.50,16449712\n7-Dec-11,15.76,15.98,15.58,15.90,14382514\n6-Dec-11,15.92,16.01,15.78,15.86,17417244\n5-Dec-11,16.00,16.00,15.82,15.93,16651965\n2-Dec-11,15.89,16.00,15.70,15.70,14972896\n1-Dec-11,15.63,15.86,15.54,15.80,18000917\n30-Nov-11,15.26,15.79,15.23,15.76,29382996\n29-Nov-11,15.00,15.22,14.84,14.94,16647529\n28-Nov-11,14.58,15.03,14.51,14.98,20926029\n25-Nov-11,14.20,14.48,14.15,14.22,7123491\n23-Nov-11,14.30,14.30,14.30,14.30,0\n22-Nov-11,14.75,14.90,14.64,14.83,21420979\n21-Nov-11,14.69,15.00,14.63,14.87,27446085\n18-Nov-11,14.91,15.16,14.85,14.90,25881878\n17-Nov-11,15.05,15.12,14.65,14.92,27191886\n16-Nov-11,15.33,15.54,15.04,15.13,36940759\n15-Nov-11,15.25,15.76,15.21,15.63,30900192\n14-Nov-11,15.30,15.53,15.19,15.32,21435009\n11-Nov-11,15.14,15.47,15.11,15.35,17805307\n10-Nov-11,14.92,15.09,14.75,14.96,17888344\n9-Nov-11,15.25,15.34,14.69,14.80,27778199\n8-Nov-11,15.69,15.70,15.30,15.59,16439838\n7-Nov-11,15.38,15.57,15.15,15.55,20063774\n4-Nov-11,15.55,15.55,15.15,15.36,18164067\n3-Nov-11,15.57,15.72,15.12,15.67,22290933\n2-Nov-11,15.28,15.56,15.15,15.45,19278804\n1-Nov-11,15.36,15.42,15.04,15.13,25200390\n31-Oct-11,16.10,16.12,15.80,15.81,15759067\n28-Oct-11,16.23,16.34,16.03,16.31,18834869\n27-Oct-11,16.25,16.43,16.04,16.32,26380226\n26-Oct-11,15.83,16.01,15.45,15.91,21221103\n25-Oct-11,15.67,15.81,15.44,15.61,22416894\n24-Oct-11,15.28,15.75,15.27,15.70,35158422\n21-Oct-11,15.29,15.59,15.10,15.24,32842863\n20-Oct-11,15.55,15.62,14.70,15.05,63168188\n19-Oct-11,16.37,16.59,15.85,15.90,26861374\n18-Oct-11,15.91,16.53,15.62,16.37,18302508\n17-Oct-11,16.33,16.49,15.88,15.97,19112887\n14-Oct-11,16.46,16.65,16.29,16.62,16880537\n13-Oct-11,15.99,16.45,15.97,16.36,21644283\n12-Oct-11,16.28,16.39,16.12,16.24,17460881\n11-Oct-11,15.96,16.32,15.90,16.18,16360859\n10-Oct-11,15.49,16.11,15.45,16.10,23598835\n7-Oct-11,15.55,15.67,15.20,15.28,22272718\n6-Oct-11,15.28,15.56,15.11,15.55,25765757\n5-Oct-11,14.58,15.45,14.45,15.38,43638249\n4-Oct-11,13.70,14.60,13.61,14.53,33032442\n3-Oct-11,14.01,14.40,13.90,13.91,26406156\n30-Sep-11,14.71,14.82,14.14,14.14,25331183\n29-Sep-11,15.13,15.19,14.58,14.87,24880182\n28-Sep-11,15.20,15.48,14.85,14.90,19047474\n27-Sep-11,15.05,15.46,14.98,15.17,25018260\n26-Sep-11,14.44,14.76,14.24,14.75,23226143\n23-Sep-11,13.91,14.51,13.85,14.40,21153341\n22-Sep-11,14.25,14.44,13.78,14.00,32840572\n21-Sep-11,14.88,15.27,14.69,14.69,26093358\n20-Sep-11,14.97,15.22,14.85,14.88,21491429\n19-Sep-11,14.99,14.99,14.68,14.87,20098490\n16-Sep-11,15.32,15.39,15.05,15.20,45401233\n15-Sep-11,15.02,15.35,14.89,15.31,23806477\n14-Sep-11,14.64,15.05,14.48,14.86,27559913\n13-Sep-11,14.26,14.50,14.22,14.38,20933020\n12-Sep-11,13.75,14.22,13.72,14.19,20037048\n9-Sep-11,14.20,14.23,13.91,13.97,25654899\n8-Sep-11,14.47,14.70,14.28,14.34,14543734\n7-Sep-11,14.50,14.59,14.34,14.55,15831019\n6-Sep-11,13.85,14.29,13.75,14.25,20945266\n2-Sep-11,14.40,14.56,14.18,14.24,12658462\n1-Sep-11,14.93,15.02,14.70,14.70,15463158\n31-Aug-11,14.97,15.13,14.76,14.86,21561403\n30-Aug-11,14.87,14.98,14.62,14.86,20682670\n29-Aug-11,14.86,14.99,14.78,14.97,22260422\n26-Aug-11,14.21,14.87,14.15,14.69,24420706\n25-Aug-11,14.72,14.76,14.20,14.21,25217162\n24-Aug-11,14.60,14.73,14.25,14.68,19766910\n23-Aug-11,14.11,14.68,14.08,14.68,30359002\n22-Aug-11,14.30,14.30,13.91,14.02,37460950\n19-Aug-11,13.79,14.62,13.75,14.00,48899840\n18-Aug-11,13.87,13.88,13.29,13.76,53215655\n17-Aug-11,14.60,14.88,14.08,14.20,75709908\n16-Aug-11,15.52,15.96,15.40,15.80,51542875\n15-Aug-11,15.02,15.51,15.00,15.50,29817238\n12-Aug-11,14.67,15.04,14.48,14.87,25233164\n11-Aug-11,13.78,14.90,13.73,14.72,38406050\n10-Aug-11,14.15,14.36,13.62,13.65,43984498\n9-Aug-11,0.00,14.43,13.46,14.42,47212454\n8-Aug-11,14.49,14.76,13.95,13.95,40931298\n5-Aug-11,15.30,15.35,14.50,15.06,41848974\n4-Aug-11,15.62,15.79,14.96,15.00,39949704\n3-Aug-11,15.67,15.95,15.32,15.89,27619291\n2-Aug-11,16.05,16.28,15.78,15.78,17682702\n1-Aug-11,16.37,16.59,15.99,16.24,19252655\n29-Jul-11,16.39,16.60,16.14,16.24,22432333\n28-Jul-11,16.41,16.77,16.40,16.56,14443159\n27-Jul-11,16.90,16.96,16.41,16.44,23822836\n26-Jul-11,17.10,17.28,17.07,17.12,15505293\n25-Jul-11,16.90,17.22,16.82,17.13,15223965\n22-Jul-11,17.16,17.26,16.98,17.04,18813647\n21-Jul-11,17.48,17.50,17.08,17.11,34754040\n20-Jul-11,17.39,17.60,17.26,17.52,20160768\n19-Jul-11,16.93,17.44,16.93,17.42,24130448\n18-Jul-11,16.83,16.99,16.67,16.79,19252243\n15-Jul-11,16.70,16.99,16.66,16.97,19068630\n14-Jul-11,16.61,17.07,16.56,16.69,24893588\n13-Jul-11,16.61,16.80,16.48,16.53,13814126\n12-Jul-11,16.56,16.80,16.40,16.55,16753523\n11-Jul-11,16.98,17.05,16.55,16.65,17649453\n8-Jul-11,16.98,17.15,16.84,17.14,14499732\n7-Jul-11,17.01,17.22,16.94,17.15,13811274\n6-Jul-11,16.97,16.98,16.59,16.91,15415406\n5-Jul-11,16.94,17.15,16.93,16.98,18686788\n1-Jul-11,16.98,16.98,16.98,16.98,0\n30-Jun-11,16.50,16.75,16.39,16.67,17322093\n29-Jun-11,16.11,16.50,15.90,16.42,36446859\n28-Jun-11,15.97,16.11,15.91,16.01,19675828\n27-Jun-11,15.86,16.04,15.72,15.94,26825543\n24-Jun-11,16.19,16.29,15.91,15.93,38479862\n23-Jun-11,16.02,16.30,15.95,16.27,24199159\n22-Jun-11,16.31,16.42,16.18,16.21,13980334\n21-Jun-11,16.28,16.39,16.02,16.33,20053024\n20-Jun-11,15.97,16.23,15.93,16.19,17412657\n17-Jun-11,16.15,16.19,15.89,16.02,30686412\n16-Jun-11,16.00,16.25,15.96,16.00,26107272\n15-Jun-11,15.96,16.22,15.89,15.99,25729464\n14-Jun-11,15.87,16.12,15.75,16.12,28633784\n13-Jun-11,15.47,15.87,15.47,15.78,23574248\n10-Jun-11,15.65,15.79,15.43,15.46,22726334\n9-Jun-11,15.63,15.78,15.50,15.67,17310075\n8-Jun-11,15.73,15.93,15.61,15.64,22213398\n7-Jun-11,15.99,16.09,15.80,15.90,32668203\n6-Jun-11,15.89,16.09,15.53,15.90,42102170\n3-Jun-11,15.57,15.82,15.52,15.59,20612515\n2-Jun-11,15.59,15.86,15.54,15.76,27776930\n1-Jun-11,15.97,16.06,15.46,15.60,41726338\n31-May-11,15.91,16.08,15.89,16.08,23616476\n27-May-11,15.79,15.79,15.79,15.79,0\n26-May-11,15.44,15.87,15.43,15.80,30764386\n25-May-11,15.48,15.60,15.41,15.51,19688993\n24-May-11,15.49,15.76,15.41,15.45,24198188\n23-May-11,15.76,15.92,15.49,15.49,35470394\n20-May-11,16.35,16.35,16.00,16.01,30817637\n19-May-11,16.70,16.70,16.26,16.34,28954065\n18-May-11,16.82,16.96,16.52,16.75,66645397\n17-May-11,15.81,16.28,15.77,15.90,49633468\n16-May-11,16.37,16.40,15.92,16.00,30582448\n13-May-11,16.54,16.65,16.32,16.37,25491398\n12-May-11,16.68,16.80,16.38,16.66,30951373\n11-May-11,16.43,16.80,16.27,16.73,29593643\n10-May-11,16.25,16.48,16.20,16.41,18362658\n9-May-11,15.96,16.33,15.91,16.19,17290534\n6-May-11,16.09,16.44,15.91,16.01,29443531\n5-May-11,15.72,16.36,15.70,15.88,32649424\n4-May-11,15.77,15.95,15.68,15.84,24373894\n3-May-11,15.36,15.80,15.34,15.80,21485527\n2-May-11,15.54,15.69,15.36,15.44,16280247\n29-Apr-11,15.72,15.73,15.18,15.47,61524868\n28-Apr-11,15.69,15.98,15.65,15.83,28003934\n27-Apr-11,15.75,15.83,15.55,15.67,20135944\n26-Apr-11,15.45,15.96,15.33,15.75,35278177\n25-Apr-11,15.24,15.42,15.20,15.38,12765186\n21-Apr-11,15.27,15.27,15.27,15.27,0\n20-Apr-11,15.07,15.31,15.06,15.18,22784505\n19-Apr-11,14.71,14.90,14.46,14.88,15306259\n18-Apr-11,14.69,14.73,14.44,14.71,18404354\n15-Apr-11,14.99,14.99,14.81,14.92,18241434\n14-Apr-11,15.20,15.25,14.87,14.95,30451172\n13-Apr-11,14.85,15.57,14.84,15.42,46676805\n12-Apr-11,14.43,14.74,14.40,14.70,19774976\n11-Apr-11,14.58,14.68,14.49,14.60,14264114\n8-Apr-11,14.85,14.92,14.51,14.57,14836596\n7-Apr-11,14.75,14.95,14.61,14.84,20266351\n6-Apr-11,14.57,14.78,14.48,14.78,22649440\n5-Apr-11,14.24,14.69,14.20,14.43,22121911\n4-Apr-11,14.35,14.40,14.13,14.25,16738802\n1-Apr-11,14.68,14.68,14.22,14.34,23516776\n31-Mar-11,14.57,14.65,14.44,14.51,17476164\n30-Mar-11,14.61,14.73,14.46,14.64,23185753\n29-Mar-11,14.73,14.90,14.61,14.77,16611012\n28-Mar-11,15.11,15.15,14.78,14.79,13882397\n25-Mar-11,15.00,15.29,14.81,15.06,19707935\n24-Mar-11,15.13,15.29,14.94,15.14,19655990\n23-Mar-11,14.76,15.14,14.68,15.08,21097798\n22-Mar-11,14.69,14.82,14.58,14.71,13582748\n21-Mar-11,14.68,15.02,14.68,14.71,21967419\n18-Mar-11,14.27,14.52,14.22,14.51,28746372\n17-Mar-11,14.41,14.41,14.06,14.11,29406509\n16-Mar-11,14.61,14.62,14.09,14.22,33387407\n15-Mar-11,14.45,14.77,14.31,14.70,24761117\n14-Mar-11,15.14,15.24,14.86,14.97,19460397\n11-Mar-11,15.09,15.34,15.04,15.28,19181428\n10-Mar-11,15.06,15.31,14.75,15.24,24161331\n9-Mar-11,15.45,15.57,15.29,15.43,15718824\n8-Mar-11,15.45,15.61,15.30,15.53,15973781\n7-Mar-11,15.73,15.74,15.10,15.39,23211724\n4-Mar-11,15.77,15.80,15.45,15.60,31644655\n3-Mar-11,15.58,15.83,15.56,15.73,22108463\n2-Mar-11,15.38,15.68,15.25,15.44,20200751\n1-Mar-11,15.93,15.93,15.34,15.40,26001993\n28-Feb-11,15.19,15.89,15.18,15.83,36173422\n25-Feb-11,15.18,15.28,14.83,15.13,20253817\n24-Feb-11,15.06,15.25,14.79,15.05,22267693\n23-Feb-11,15.11,15.19,14.89,15.11,31599989\n22-Feb-11,15.20,15.50,15.09,15.14,23880612\n18-Feb-11,15.43,15.43,15.43,15.43,0\n17-Feb-11,15.40,15.53,15.25,15.34,27853809\n16-Feb-11,14.79,15.89,14.61,15.56,108670530\n15-Feb-11,13.96,14.05,13.80,13.91,35944066\n14-Feb-11,14.00,14.18,13.92,14.09,21946328\n11-Feb-11,13.79,13.98,13.76,13.97,15359029\n10-Feb-11,13.82,13.97,13.70,13.85,13139083\n9-Feb-11,13.83,14.00,13.75,13.90,13176792\n8-Feb-11,13.95,14.17,13.83,13.87,17274829\n7-Feb-11,13.94,14.10,13.92,13.99,12081155\n4-Feb-11,13.82,13.92,13.69,13.89,12910524\n3-Feb-11,13.70,13.83,13.56,13.80,11278755\n2-Feb-11,13.41,13.78,13.39,13.72,15832499\n1-Feb-11,13.24,13.57,13.19,13.45,18006429\n31-Jan-11,13.15,13.21,12.99,13.16,19967611\n28-Jan-11,13.47,13.50,13.06,13.15,22676447\n27-Jan-11,13.81,13.83,13.43,13.44,25105541\n26-Jan-11,13.72,13.97,13.70,13.77,13713747\n25-Jan-11,13.70,13.81,13.63,13.74,15547838\n24-Jan-11,13.49,13.77,13.39,13.72,15207013\n21-Jan-11,13.70,13.71,13.46,13.47,16185734\n20-Jan-11,13.83,13.88,13.57,13.60,22205125\n19-Jan-11,14.08,14.15,13.70,13.78,21537590\n18-Jan-11,14.12,14.18,14.04,14.10,19028130\n14-Jan-11,14.05,14.05,14.05,14.05,0\n13-Jan-11,14.33,14.46,13.98,14.17,25589160\n12-Jan-11,14.17,14.42,14.03,14.39,16548409\n11-Jan-11,14.11,14.19,13.96,14.08,14988149\n10-Jan-11,13.93,14.23,13.92,14.01,15106721\n7-Jan-11,14.24,14.24,13.95,13.98,18862750\n6-Jan-11,13.87,14.28,13.80,14.26,21923309\n5-Jan-11,13.70,13.91,13.56,13.87,19500901\n4-Jan-11,13.84,13.87,13.61,13.69,13918717\n3-Jan-11,13.64,13.80,13.57,13.69,15678698\n31-Dec-10,13.59,13.63,13.49,13.55,8352503\n30-Dec-10,13.64,13.70,13.55,13.65,7789036\n29-Dec-10,13.70,13.80,13.64,13.65,7630358\n28-Dec-10,13.83,13.83,13.66,13.69,9468575\n27-Dec-10,13.72,13.82,13.65,13.77,5573508\n23-Dec-10,13.79,13.79,13.79,13.79,0\n22-Dec-10,13.79,13.90,13.74,13.88,13662740\n21-Dec-10,13.47,13.89,13.42,13.84,25829430\n20-Dec-10,13.65,13.66,13.35,13.36,27679694\n17-Dec-10,13.25,13.68,13.24,13.64,40684155\n16-Dec-10,13.31,13.41,13.22,13.33,15282246\n15-Dec-10,13.27,13.49,13.20,13.29,26326511\n14-Dec-10,13.35,13.45,13.23,13.31,24299968\n13-Dec-10,13.74,13.74,13.34,13.36,30828469\n10-Dec-10,13.69,14.02,13.66,13.89,17675011\n9-Dec-10,13.74,13.77,13.59,13.65,17163254\n8-Dec-10,13.70,13.71,13.48,13.68,11967708\n7-Dec-10,13.82,13.84,13.54,13.60,18687383\n6-Dec-10,13.63,13.75,13.55,13.70,14480153\n3-Dec-10,13.56,13.71,13.49,13.69,15884415\n2-Dec-10,13.46,13.68,13.35,13.65,37881702\n1-Dec-10,13.47,13.59,13.39,13.41,19656224\n30-Nov-10,13.40,13.40,13.12,13.22,20750165\n29-Nov-10,13.53,13.66,13.32,13.57,18183609\n26-Nov-10,13.72,13.84,13.62,13.65,5388146\n24-Nov-10,13.88,13.88,13.88,13.88,0\n23-Nov-10,13.78,13.88,13.74,13.82,22660673\n22-Nov-10,13.88,14.09,13.76,13.96,20908372\n19-Nov-10,14.12,14.15,13.55,13.90,71459351\n18-Nov-10,13.46,13.79,13.46,13.66,36813150\n17-Nov-10,13.47,13.57,13.28,13.35,18496884\n16-Nov-10,13.44,13.67,13.26,13.40,20197843\n15-Nov-10,13.53,13.85,13.51,13.51,19729341\n12-Nov-10,13.80,13.84,13.34,13.42,29109011\n11-Nov-10,13.98,14.01,13.71,13.93,39786468\n10-Nov-10,14.35,14.51,14.18,14.49,14301186\n9-Nov-10,14.26,14.61,14.25,14.41,17166139\n8-Nov-10,14.45,14.45,14.24,14.29,14420799\n5-Nov-10,14.52,14.59,14.19,14.46,28480217\n4-Nov-10,14.65,14.69,14.43,14.52,17237365\n3-Nov-10,14.40,14.51,14.23,14.48,15056547\n2-Nov-10,14.59,14.60,14.10,14.36,20066878\n1-Nov-10,14.54,14.70,14.28,14.41,18325356\n29-Oct-10,14.47,14.78,14.19,14.40,25605548\n28-Oct-10,14.77,14.77,14.46,14.59,16432171\n27-Oct-10,14.51,14.69,14.45,14.67,16312208\n26-Oct-10,14.64,14.70,14.48,14.51,17469823\n25-Oct-10,14.73,14.85,14.65,14.71,13180971\n22-Oct-10,14.71,14.71,14.51,14.58,13761703\n21-Oct-10,14.88,14.89,14.47,14.60,17300249\n20-Oct-10,14.54,14.77,14.49,14.69,17508837\n19-Oct-10,14.44,14.79,14.40,14.49,25135623\n18-Oct-10,14.53,14.73,14.38,14.66,24205318\n15-Oct-10,14.22,14.52,14.10,14.49,28182464\n14-Oct-10,14.20,14.30,14.12,14.27,29510896\n13-Oct-10,13.99,14.20,13.95,14.13,25951341\n12-Oct-10,13.64,14.14,13.55,13.92,43002380\n11-Oct-10,13.71,13.80,13.52,13.73,16233388\n8-Oct-10,13.30,13.74,13.25,13.69,26694503\n7-Oct-10,13.30,13.38,13.19,13.27,17875295\n6-Oct-10,13.29,13.38,13.15,13.22,20712551\n5-Oct-10,13.09,13.48,13.06,13.40,27420262\n4-Oct-10,12.95,13.00,12.77,12.90,29326685\n1-Oct-10,12.96,13.15,12.90,13.04,25912028\n30-Sep-10,13.08,13.17,12.68,12.97,32731670\n29-Sep-10,12.70,13.00,12.62,12.99,28835357\n28-Sep-10,12.71,12.77,12.51,12.71,25025724\n27-Sep-10,12.65,12.79,12.58,12.64,19962801\n24-Sep-10,12.38,12.69,12.34,12.65,24294787\n23-Sep-10,12.26,12.36,12.12,12.15,29439332\n22-Sep-10,12.54,12.66,12.25,12.38,35999948\n21-Sep-10,12.65,12.81,12.55,12.60,19767808\n20-Sep-10,12.41,12.73,12.34,12.67,18307980\n17-Sep-10,12.43,12.58,12.31,12.45,27718664\n16-Sep-10,12.28,12.46,12.21,12.42,21144563\n15-Sep-10,12.38,12.42,12.20,12.30,24259557\n14-Sep-10,12.36,12.55,12.26,12.38,24515679\n13-Sep-10,12.24,12.40,12.16,12.31,25357138\n10-Sep-10,12.18,12.21,11.93,12.06,37108558\n9-Sep-10,12.70,12.70,12.36,12.38,18600823\n8-Sep-10,12.40,12.72,12.28,12.54,25924936\n7-Sep-10,12.43,12.54,12.30,12.32,19613407\n6-Sep-10,12.59,12.59,12.59,12.59,0\n3-Sep-10,12.59,12.59,12.59,12.59,0\n2-Sep-10,12.04,12.45,11.88,12.36,26218739\n1-Sep-10,11.92,12.15,11.79,12.12,21486661\n31-Aug-10,11.92,11.95,11.61,11.77,33767201\n30-Aug-10,11.85,12.22,11.85,12.02,31246150\n27-Aug-10,11.80,12.10,11.70,11.89,34007958\n26-Aug-10,11.89,11.95,11.75,11.75,17945187\n25-Aug-10,11.46,11.86,11.40,11.78,22248131\n24-Aug-10,11.70,11.75,11.66,11.58,34068565\n23-Aug-10,12.23,12.24,11.86,11.94,22201055\n20-Aug-10,11.80,12.06,11.80,12.07,50257924\n19-Aug-10,12.11,12.18,12.06,12.04,30025806\n18-Aug-10,12.09,12.31,12.04,12.19,35715461\n17-Aug-10,12.08,12.20,12.00,12.06,24060304\n16-Aug-10,11.90,12.03,11.86,11.96,13141551\n13-Aug-10,12.03,12.09,12.01,12.01,17641381\n12-Aug-10,11.76,12.12,11.76,11.99,20853016\n11-Aug-10,12.25,12.27,11.84,12.10,29880327\n10-Aug-10,12.76,12.81,12.37,12.45,37344048\n9-Aug-10,13.21,13.24,12.91,12.98,17950763\n6-Aug-10,12.91,13.12,12.87,13.12,16292032\n5-Aug-10,13.05,13.22,12.87,13.13,25334792\n4-Aug-10,13.52,13.53,13.07,13.21,20385472\n3-Aug-10,13.51,13.60,13.34,13.42,9123516\n2-Aug-10,13.42,13.68,13.35,13.61,10405995\n30-Jul-10,13.04,13.37,13.01,13.24,14130270\n29-Jul-10,13.50,13.69,13.02,13.16,23633230\n28-Jul-10,13.66,13.73,13.42,13.50,8625889\n27-Jul-10,13.83,13.95,13.62,13.66,10701401\n26-Jul-10,13.46,13.76,13.45,13.74,10234337\n23-Jul-10,13.46,13.53,13.27,13.51,12947059\n22-Jul-10,13.30,13.52,13.18,13.40,21163208\n21-Jul-10,13.27,13.45,13.05,13.07,25929540\n20-Jul-10,13.19,13.38,13.01,13.36,20822715\n19-Jul-10,13.08,13.48,13.04,13.44,16382503\n16-Jul-10,13.64,13.74,13.04,13.06,23227749\n15-Jul-10,13.59,13.73,13.32,13.64,22906943\n14-Jul-10,13.41,13.86,13.40,13.52,28858379\n13-Jul-10,12.86,13.29,12.76,13.20,23360072\n12-Jul-10,12.73,13.03,12.70,12.84,15055715\n9-Jul-10,12.80,12.91,12.63,12.85,18855718\n8-Jul-10,12.56,12.79,12.47,12.78,26123319\n7-Jul-10,11.91,12.48,11.83,12.46,26439886\n6-Jul-10,12.26,12.32,11.72,11.90,29040046\n5-Jul-10,12.03,12.03,12.03,12.03,0\n2-Jul-10,12.03,12.03,12.03,12.03,0\n1-Jul-10,12.21,12.41,11.90,12.03,36671588\n30-Jun-10,12.23,12.46,12.00,12.06,27344019\n29-Jun-10,12.65,12.65,12.20,12.27,38501609\n28-Jun-10,13.02,13.12,12.87,12.95,30359983\n25-Jun-10,13.07,13.12,12.65,12.93,48794190\n24-Jun-10,13.81,13.81,12.88,12.93,64912116\n23-Jun-10,13.88,13.96,13.61,13.82,21411438\n22-Jun-10,13.99,14.20,13.76,13.80,20189419\n21-Jun-10,14.18,14.28,13.86,13.95,22607933\n18-Jun-10,14.27,14.28,13.94,14.04,20564089\n17-Jun-10,14.18,14.26,13.81,14.20,30126517\n16-Jun-10,13.89,14.06,13.77,13.99,22661187\n15-Jun-10,13.33,14.11,13.20,14.00,41873211\n14-Jun-10,13.36,13.44,13.04,13.09,20586600\n11-Jun-10,12.80,13.22,12.78,13.15,19105437\n10-Jun-10,13.03,13.10,12.87,13.07,22500851\n9-Jun-10,12.81,13.07,12.42,12.78,42461227\n8-Jun-10,12.95,13.02,12.56,12.68,38850189\n7-Jun-10,13.23,13.34,12.93,12.93,22439273\n4-Jun-10,13.33,13.52,13.15,13.24,30029792\n3-Jun-10,13.26,13.96,13.23,13.76,54310910\n2-Jun-10,13.15,13.28,12.93,13.12,29340825\n1-Jun-10,13.23,13.51,13.08,13.09,21115075\n31-May-10,13.33,13.33,13.33,13.33,0\n28-May-10,13.33,13.33,13.33,13.33,0\n27-May-10,13.52,13.71,13.32,13.40,31548566\n26-May-10,13.43,13.63,13.24,13.25,34699297\n25-May-10,13.05,13.34,12.84,13.33,40231914\n24-May-10,13.42,13.87,13.36,13.44,43986842\n21-May-10,13.50,15.00,13.12,13.35,101512483\n20-May-10,14.57,14.65,14.27,14.32,45553308\n19-May-10,15.03,15.20,14.67,14.98,21600331\n18-May-10,15.30,15.45,14.90,15.00,21303310\n17-May-10,15.17,15.31,14.87,15.22,26894177\n14-May-10,15.32,15.39,14.93,15.15,21882151\n13-May-10,15.64,15.96,15.41,15.44,21080952\n12-May-10,15.56,15.80,15.51,15.72,22956890\n11-May-10,15.18,15.83,15.14,15.48,24821971\n10-May-10,15.46,15.79,15.26,15.38,31548418\n7-May-10,15.08,15.40,14.62,15.01,44416214\n6-May-10,15.73,15.95,14.28,15.20,38718773\n5-May-10,15.56,15.98,15.48,15.77,27100292\n4-May-10,16.26,16.28,15.46,15.66,37927627\n3-May-10,16.28,16.46,16.21,16.38,23540528\n30-Apr-10,16.60,16.75,16.18,16.20,30624289\n29-Apr-10,16.51,16.70,16.44,16.65,19760607\n28-Apr-10,16.33,16.58,16.17,16.51,35871362\n27-Apr-10,16.86,16.98,16.50,16.53,30764263\n26-Apr-10,17.37,17.41,16.96,17.02,33580024\n23-Apr-10,17.37,17.52,17.24,17.50,22071800\n22-Apr-10,16.95,17.50,16.77,17.46,34748364\n21-Apr-10,17.10,17.20,16.95,17.17,24100194\n20-Apr-10,16.94,17.04,16.61,17.01,25432419\n19-Apr-10,16.68,16.92,16.59,16.90,22775093\n16-Apr-10,16.92,17.00,16.63,16.76,42023991\n15-Apr-10,16.51,16.93,16.50,16.86,37747791\n14-Apr-10,15.97,16.68,15.96,16.56,57684765\n13-Apr-10,15.86,15.91,15.61,15.72,18975927\n12-Apr-10,15.78,15.99,15.77,15.93,22115289\n9-Apr-10,15.71,15.85,15.44,15.83,23056001\n8-Apr-10,15.52,15.78,15.42,15.76,22361741\n7-Apr-10,15.58,15.97,15.55,15.69,34241940\n6-Apr-10,15.10,15.63,15.10,15.57,29599165\n5-Apr-10,15.04,15.31,15.00,15.20,18090071\n2-Apr-10,15.05,15.05,15.05,15.05,0\n1-Apr-10,15.05,15.05,15.05,15.05,0\n31-Mar-10,14.97,15.18,14.94,15.02,15049806\n30-Mar-10,14.93,15.07,14.83,14.97,12461296\n29-Mar-10,15.10,15.20,14.92,14.96,12052088\n26-Mar-10,14.91,15.00,14.70,14.99,21902545\n25-Mar-10,15.16,15.16,14.86,14.87,19224121\n24-Mar-10,15.00,15.12,14.91,14.99,29830939\n23-Mar-10,14.62,15.25,14.60,15.22,49473501\n22-Mar-10,14.26,14.72,14.25,14.62,22089900\n19-Mar-10,14.61,14.63,14.23,14.41,29703896\n18-Mar-10,14.59,14.65,14.35,14.55,52924678\n17-Mar-10,14.26,14.82,14.22,14.59,32908414\n16-Mar-10,14.30,14.33,14.11,14.30,17821816\n15-Mar-10,14.22,14.33,14.11,14.26,15477159\n12-Mar-10,14.29,14.36,14.11,14.26,19891259\n11-Mar-10,14.25,14.27,14.02,14.21,17682355\n10-Mar-10,14.24,14.51,14.18,14.31,34314153\n9-Mar-10,13.95,14.40,13.86,14.18,28946883\n8-Mar-10,14.00,14.07,13.86,14.01,20608117\n5-Mar-10,13.68,13.97,13.60,13.88,19357054\n4-Mar-10,13.72,13.75,13.52,13.67,22496263\n3-Mar-10,13.69,13.79,13.57,13.71,20190027\n2-Mar-10,13.75,13.99,13.60,13.68,38410180\n1-Mar-10,13.35,13.65,13.28,13.57,21976719\n26-Feb-10,13.25,13.31,13.10,13.24,17143385\n25-Feb-10,13.19,13.30,13.10,13.29,21405860\n24-Feb-10,13.32,13.40,13.26,13.39,28409345\n23-Feb-10,13.34,13.40,13.15,13.21,21330433\n22-Feb-10,13.48,13.50,13.35,13.36,29241590\n19-Feb-10,13.70,13.71,13.27,13.47,99363817\n18-Feb-10,14.22,14.48,14.11,14.43,45300796\n17-Feb-10,14.23,14.36,14.05,14.11,21767306\n16-Feb-10,13.99,14.22,13.99,14.14,20302866\n15-Feb-10,13.84,13.84,13.84,13.84,0\n12-Feb-10,13.84,13.84,13.84,13.84,0\n11-Feb-10,13.73,14.00,13.65,13.95,21790743\n10-Feb-10,13.78,13.96,13.67,13.75,28788529\n9-Feb-10,13.58,13.69,13.39,13.55,21068022\n8-Feb-10,13.28,13.73,13.16,13.39,34710189\n5-Feb-10,13.11,13.31,12.92,13.24,38256071\n4-Feb-10,13.17,13.36,12.98,13.01,24749482\n3-Feb-10,13.27,13.44,13.22,13.36,13242329\n2-Feb-10,13.30,13.38,13.03,13.30,23782925\n1-Feb-10,12.99,13.29,12.98,13.22,26477520\n29-Jan-10,13.37,13.47,12.75,12.90,35716703\n28-Jan-10,13.60,13.64,13.03,13.28,33810104\n27-Jan-10,13.52,13.70,13.29,13.53,28521175\n26-Jan-10,13.80,13.94,13.54,13.58,26288489\n25-Jan-10,13.75,14.10,13.74,13.89,26823534\n22-Jan-10,14.30,14.41,13.58,13.64,28526046\n21-Jan-10,14.51,14.76,14.35,14.39,22137903\n20-Jan-10,14.74,14.74,14.38,14.51,23367282\n19-Jan-10,14.30,14.85,14.30,14.81,17907622\n18-Jan-10,14.40,14.40,14.40,14.40,0\n15-Jan-10,14.40,14.40,14.40,14.40,0\n14-Jan-10,14.94,15.16,14.63,14.70,37817269\n13-Jan-10,15.11,15.15,14.81,15.07,19695988\n12-Jan-10,14.82,15.20,14.80,15.06,28240324\n11-Jan-10,14.87,15.00,14.70,14.86,18758416\n8-Jan-10,14.84,14.92,14.71,14.85,17641537\n7-Jan-10,14.60,14.80,14.53,14.72,19705925\n6-Jan-10,14.87,14.88,14.50,14.58,25146852\n5-Jan-10,14.76,14.94,14.59,14.87,20109821\n4-Jan-10,14.50,14.70,14.36,14.54,14488879\n1-Jan-10,14.36,14.36,14.36,14.36,0\n31-Dec-09,14.36,14.36,14.36,14.36,0\n30-Dec-09,14.30,14.79,14.24,14.79,20538141\n29-Dec-09,14.62,14.67,14.28,14.32,15132776\n28-Dec-09,14.79,14.81,14.44,14.60,14575441\n25-Dec-09,14.79,14.79,14.79,14.79,0\n24-Dec-09,14.27,14.80,14.27,14.79,12874621\n23-Dec-09,14.08,14.50,14.07,14.34,17579789\n22-Dec-09,14.15,14.32,14.07,14.11,21519542\n21-Dec-09,13.85,14.22,13.83,14.11,28353769\n18-Dec-09,13.81,13.87,13.54,13.74,26635585\n17-Dec-09,13.64,13.85,13.54,13.74,34590212\n16-Dec-09,13.50,13.82,13.49,13.70,38775157\n15-Dec-09,13.14,13.65,13.09,13.51,41117497\n14-Dec-09,13.24,13.28,13.09,13.18,26596190\n11-Dec-09,13.36,13.39,13.11,13.12,21637941\n10-Dec-09,13.23,13.43,13.15,13.23,32074006\n9-Dec-09,12.95,13.19,12.74,13.11,41600848\n8-Dec-09,13.21,13.22,12.81,12.81,47307070\n7-Dec-09,13.49,13.53,13.27,13.29,22307267\n4-Dec-09,13.60,13.71,13.37,13.46,40493423\n3-Dec-09,13.77,13.84,13.43,13.46,27544018\n2-Dec-09,13.89,14.02,13.61,13.66,41867766\n1-Dec-09,14.13,14.23,13.80,13.84,38378371\n30-Nov-09,14.12,14.28,13.96,14.12,21228612\n27-Nov-09,14.03,14.30,14.02,14.14,15853728\n26-Nov-09,14.36,14.36,14.36,14.36,0\n25-Nov-09,14.36,14.44,14.32,14.36,16679196\n24-Nov-09,14.59,14.79,14.28,14.32,33650808\n23-Nov-09,14.52,14.85,14.38,14.79,41161166\n20-Nov-09,14.65,14.69,14.24,14.29,94527955\n19-Nov-09,15.98,16.00,15.65,15.87,38973173\n18-Nov-09,16.01,16.10,15.80,16.06,19720324\n17-Nov-09,15.94,15.98,15.66,15.95,14848491\n16-Nov-09,15.70,16.00,15.66,15.96,22678597\n13-Nov-09,15.46,15.63,15.27,15.40,16075115\n12-Nov-09,15.44,15.65,15.39,15.45,15123375\n11-Nov-09,15.66,15.72,15.43,15.59,10533618\n10-Nov-09,15.50,15.61,15.36,15.40,15236084\n9-Nov-09,15.02,15.55,14.97,15.54,17285772\n6-Nov-09,14.72,14.97,14.68,14.86,11775809\n5-Nov-09,14.76,14.95,14.55,14.91,13916896\n4-Nov-09,14.66,14.81,14.56,14.58,13758791\n3-Nov-09,14.25,14.60,14.22,14.59,17497650\n2-Nov-09,14.41,14.59,14.21,14.44,19657314\n30-Oct-09,14.89,14.95,14.36,14.45,23682736\n29-Oct-09,14.64,15.01,14.63,14.93,17205452\n28-Oct-09,15.15,15.17,14.53,14.59,29332195\n27-Oct-09,15.36,15.44,15.04,15.29,20183599\n26-Oct-09,15.38,15.68,15.17,15.37,18388384\n23-Oct-09,15.91,16.10,15.41,15.48,27610898\n22-Oct-09,15.15,15.51,15.01,15.43,17521126\n21-Oct-09,15.22,15.62,15.15,15.15,17845730\n20-Oct-09,15.38,15.50,14.47,15.35,17312315\n19-Oct-09,15.44,15.47,15.22,15.36,13855469\n16-Oct-09,15.33,15.38,15.06,15.28,20058474\n15-Oct-09,15.63,15.65,15.22,15.43,23065917\n14-Oct-09,15.76,15.76,15.51,15.63,24480505\n13-Oct-09,15.42,15.46,15.25,15.31,24089711\n12-Oct-09,15.92,15.98,15.29,15.42,24735899\n9-Oct-09,15.76,16.20,15.75,15.81,25308048\n8-Oct-09,15.55,15.94,15.37,15.82,25445298\n7-Oct-09,15.43,15.56,15.17,15.36,20968217\n6-Oct-09,15.31,15.51,15.16,15.51,20842187\n5-Oct-09,15.11,15.41,15.01,15.15,29005315\n2-Oct-09,15.02,15.25,14.80,15.04,19031989\n1-Oct-09,15.24,15.31,15.10,15.14,27131052\n30-Sep-09,15.26,15.40,15.05,15.26,28668187\n29-Sep-09,15.62,15.74,15.17,15.17,28665179\n28-Sep-09,15.50,15.76,15.49,15.67,12089415\n25-Sep-09,15.56,15.60,15.26,15.34,23630285\n24-Sep-09,16.00,16.14,15.66,15.77,17417582\n23-Sep-09,15.79,16.34,15.68,15.96,27300513\n22-Sep-09,15.83,15.90,15.66,15.73,33792794\n21-Sep-09,15.88,16.20,15.67,16.01,43057975\n18-Sep-09,17.02,17.04,16.62,16.69,27701984\n17-Sep-09,16.92,17.13,16.82,16.86,19316110\n16-Sep-09,16.71,17.04,16.69,16.92,20698933\n15-Sep-09,16.51,16.79,16.45,16.57,23684382\n14-Sep-09,16.45,16.55,16.29,16.39,16564841\n11-Sep-09,16.59,16.75,16.44,16.60,35576099\n10-Sep-09,15.85,16.60,15.85,16.56,35128695\n9-Sep-09,15.90,16.04,15.66,15.92,18975127\n8-Sep-09,15.74,15.97,15.64,15.96,25310260\n4-Sep-09,15.32,15.74,15.32,15.69,17801077\n3-Sep-09,15.47,15.69,15.16,15.25,17409562\n2-Sep-09,15.17,15.56,15.13,15.35,21221161\n1-Sep-09,15.72,15.90,15.06,15.21,34731243\n31-Aug-09,15.77,15.86,15.40,15.83,27605688\n28-Aug-09,16.53,17.26,15.65,15.93,81532509\n27-Aug-09,14.76,15.76,14.43,15.65,67171906\n26-Aug-09,14.65,14.77,14.47,14.67,19192274\n25-Aug-09,14.97,14.98,14.50,14.57,26195800\n24-Aug-09,14.77,15.27,14.69,14.78,36591813\n21-Aug-09,14.71,14.76,14.41,14.49,29185844\n20-Aug-09,14.48,14.57,14.32,14.55,14367554\n19-Aug-09,14.04,14.56,13.87,14.45,26053563\n18-Aug-09,13.98,14.56,13.97,14.43,28810066\n17-Aug-09,13.87,14.00,13.73,13.93,24814007\n14-Aug-09,14.26,14.34,13.94,14.20,18916689\n13-Aug-09,13.90,14.30,13.72,14.29,28903726\n12-Aug-09,13.48,13.97,13.45,13.84,23389349\n10-Aug-09,13.33,13.72,13.29,13.59,20699301\n7-Aug-09,13.36,13.42,13.13,13.20,19418045\n6-Aug-09,13.60,13.79,13.07,13.16,28736447\n5-Aug-09,13.72,13.90,13.36,13.63,18388905\n4-Aug-09,13.54,13.80,13.40,13.70,16794117\n3-Aug-09,13.52,13.70,13.37,13.60,15626665\n31-Jul-09,13.62,13.62,13.22,13.38,25735693\n30-Jul-09,13.96,14.00,13.51,13.57,24907452\n29-Jul-09,13.97,14.03,13.52,13.72,18742395\n28-Jul-09,13.65,14.24,13.62,13.97,28191800\n27-Jul-09,13.52,13.79,13.44,13.71,16807962\n24-Jul-09,13.34,13.57,13.22,13.50,22203113\n23-Jul-09,13.25,13.88,13.15,13.47,40164980\n22-Jul-09,13.33,13.43,13.00,13.30,28451897\n21-Jul-09,13.00,13.38,12.97,13.36,29925970\n20-Jul-09,12.73,12.97,12.66,12.94,30653558\n17-Jul-09,12.76,12.89,12.55,12.67,36514219\n16-Jul-09,12.26,12.83,12.20,12.75,50496026\n15-Jul-09,12.18,12.39,11.85,12.32,72017460\n14-Jul-09,12.67,12.69,11.84,11.97,105281146\n13-Jul-09,13.19,13.22,12.65,13.02,41314953\n10-Jul-09,13.34,13.50,12.93,13.22,58538431\n9-Jul-09,13.12,13.22,12.95,13.15,18372709\n8-Jul-09,13.05,13.14,12.76,12.95,27373677\n7-Jul-09,13.38,13.57,12.94,13.00,42583362\n6-Jul-09,12.96,13.47,12.94,13.42,26080387\n3-Jul-09,12.97,12.97,12.97,12.97,0\n2-Jul-09,13.12,13.23,12.90,12.97,40196433\n1-Jul-09,13.76,13.81,13.35,13.39,28254906\n30-Jun-09,13.88,13.93,13.62,13.73,23035280\n29-Jun-09,13.80,13.96,13.72,13.86,15841273\n26-Jun-09,13.62,13.88,13.41,13.68,25840983\n25-Jun-09,13.13,13.75,13.07,13.65,29894541\n24-Jun-09,13.19,13.35,13.06,13.28,24075881\n23-Jun-09,13.00,13.12,12.74,12.98,23517757\n22-Jun-09,13.18,13.49,12.93,12.98,25788642\n19-Jun-09,12.76,13.44,12.71,13.29,48554650\n18-Jun-09,12.78,12.85,12.58,12.61,16899576\n17-Jun-09,12.71,12.88,12.47,12.76,21150584\n16-Jun-09,12.94,13.17,12.73,12.77,20363770\n15-Jun-09,13.42,13.49,12.75,12.87,25525948\n12-Jun-09,13.22,13.40,13.05,13.39,25270320\n11-Jun-09,12.94,13.32,12.90,13.27,32442643\n10-Jun-09,12.79,12.97,12.49,12.94,30407392\n9-Jun-09,12.42,12.79,12.40,12.60,24105922\n8-Jun-09,11.88,12.40,11.76,12.28,25612511\n5-Jun-09,12.27,12.32,11.92,12.08,21318022\n4-Jun-09,11.59,12.21,11.56,12.10,26017528\n3-Jun-09,11.92,12.02,11.45,11.62,30095125\n2-Jun-09,12.16,12.38,11.84,11.94,20336803\n1-Jun-09,11.70,12.25,11.68,12.18,26123996\n29-May-09,11.87,11.96,11.33,11.57,50197200\n28-May-09,11.23,11.55,11.18,11.48,33756652\n27-May-09,11.18,11.43,11.02,11.12,20393069\n26-May-09,10.72,11.20,10.62,11.14,21202153\n22-May-09,10.81,11.06,10.66,10.85,16615288\n21-May-09,10.89,10.98,10.59,10.83,33934410\n20-May-09,11.41,11.55,11.13,11.18,29225824\n19-May-09,11.30,11.74,11.22,11.56,22835336\n18-May-09,11.11,11.30,11.00,11.30,17903897\n15-May-09,10.86,11.12,10.80,10.98,26947782\n14-May-09,10.94,11.23,10.82,10.93,27409386\n13-May-09,11.09,11.31,10.87,10.94,30560792\n12-May-09,11.08,11.36,10.83,11.21,36545576\n11-May-09,10.58,11.17,10.57,11.02,28437481\n8-May-09,11.12,11.14,10.39,10.81,51971383\n7-May-09,11.90,11.94,10.75,11.07,40730515\n6-May-09,11.90,12.00,11.38,11.89,28599188\n5-May-09,12.12,12.31,11.71,11.86,24865026\n4-May-09,11.99,12.32,11.92,12.28,23570689\n1-May-09,11.63,11.91,11.45,11.85,20219787\n30-Apr-09,11.59,12.05,11.40,11.62,30856455\n29-Apr-09,11.02,11.50,10.89,11.25,20719608\n28-Apr-09,11.03,11.05,10.76,10.88,19876228\n27-Apr-09,10.85,11.30,10.85,11.09,25809097\n24-Apr-09,10.80,11.10,10.54,11.05,32658888\n23-Apr-09,10.60,10.74,10.34,10.72,25404387\n22-Apr-09,10.42,10.90,10.35,10.63,20216704\n21-Apr-09,10.25,10.73,10.22,10.55,20913628\n20-Apr-09,10.80,10.85,10.29,10.31,29589441\n17-Apr-09,10.90,11.10,10.54,11.06,29708308\n16-Apr-09,10.30,10.97,10.05,10.88,37830533\n15-Apr-09,10.31,10.53,10.03,10.20,28273123\n14-Apr-09,10.46,10.90,10.29,10.47,35495333\n13-Apr-09,10.65,10.70,10.34,10.45,20895689\n10-Apr-09,10.76,10.76,10.76,10.76,0\n9-Apr-09,10.46,10.96,10.38,10.76,31234240\n8-Apr-09,9.91,10.34,9.89,10.20,22645307\n7-Apr-09,10.10,10.12,9.73,9.83,20275952\n6-Apr-09,10.19,10.33,9.91,10.33,23838907\n3-Apr-09,9.65,10.38,9.53,10.32,45599454\n2-Apr-09,9.67,9.90,9.38,9.50,45243384\n1-Apr-09,9.33,9.66,9.22,9.52,29270894\n31-Mar-09,9.56,9.78,9.38,9.48,25212461\n30-Mar-09,9.79,9.79,9.20,9.49,22122894\n27-Mar-09,10.13,10.20,9.85,9.95,20407420\n26-Mar-09,10.35,10.44,10.01,10.35,34336481\n25-Mar-09,10.50,10.86,9.88,10.17,33553030\n24-Mar-09,10.30,10.83,10.26,10.41,25281622\n23-Mar-09,10.20,10.45,9.94,10.45,27326510\n20-Mar-09,10.12,10.44,9.73,9.88,36525539\n19-Mar-09,9.83,10.13,9.63,10.04,34708111\n18-Mar-09,9.29,9.84,9.22,9.62,29600738\n17-Mar-09,9.07,9.36,8.93,9.34,19910124\n16-Mar-09,9.49,9.55,8.84,8.90,33322141\n13-Mar-09,9.52,9.76,9.15,9.37,29912311\n12-Mar-09,8.94,9.47,8.80,9.44,31067253\n11-Mar-09,8.80,9.13,8.77,8.98,25804517\n10-Mar-09,8.25,8.76,8.20,8.76,32496416\n9-Mar-09,8.35,8.67,8.00,8.04,27891816\n6-Mar-09,8.44,8.60,8.13,8.37,33112983\n5-Mar-09,8.70,8.94,8.39,8.39,30938537\n4-Mar-09,9.17,9.20,8.72,8.88,40415940\n3-Mar-09,8.70,9.20,8.43,9.15,44629974\n2-Mar-09,8.53,9.03,8.43,8.43,39292978\n27-Feb-09,8.26,8.75,8.15,8.53,48700786\n26-Feb-09,8.54,8.56,8.18,8.21,42127150\n25-Feb-09,8.28,8.47,7.93,8.36,38272026\n24-Feb-09,8.06,8.36,7.94,8.26,32810655\n23-Feb-09,8.57,8.59,7.95,7.99,30908367\n20-Feb-09,7.99,8.44,7.84,8.41,66915456\n19-Feb-09,8.53,8.58,8.06,8.12,43819044\n18-Feb-09,8.95,8.96,8.58,8.65,36315943\n17-Feb-09,8.71,9.08,8.70,8.88,29355954\n13-Feb-09,9.19,9.35,9.06,9.12,27340559\n12-Feb-09,8.89,9.21,8.73,9.17,38543929\n11-Feb-09,9.29,9.33,8.78,9.02,28160869\n10-Feb-09,9.59,9.77,9.12,9.16,31020375\n9-Feb-09,9.43,9.73,9.21,9.64,40634662\n6-Feb-09,9.45,9.75,9.28,9.46,30797680\n5-Feb-09,9.27,9.56,9.10,9.43,31971321\n4-Feb-09,9.83,10.12,9.62,9.79,22667720\n3-Feb-09,9.30,9.81,9.16,9.77,23598168\n2-Feb-09,9.38,9.41,9.10,9.31,22669236\n30-Jan-09,10.12,10.15,9.45,9.50,27143013\n29-Jan-09,10.61,10.67,9.89,9.95,36705848\n28-Jan-09,10.35,11.00,10.18,10.88,23179536\n27-Jan-09,10.30,10.36,9.99,10.07,21752867\n26-Jan-09,10.11,10.53,9.96,10.31,14294405\n23-Jan-09,9.67,10.46,9.58,10.14,25993474\n22-Jan-09,9.76,10.11,9.52,9.98,27704007\n21-Jan-09,10.00,10.32,9.70,10.20,24124615\n20-Jan-09,10.24,10.45,9.80,9.85,24487580\n16-Jan-09,10.79,10.79,9.83,10.27,30075989\n15-Jan-09,10.33,10.82,10.14,10.54,35030389\n14-Jan-09,10.56,10.67,10.25,10.31,17385151\n13-Jan-09,10.54,10.91,10.50,10.76,21757441\n12-Jan-09,10.91,11.02,10.43,10.65,25827138\n9-Jan-09,11.23,11.38,10.59,11.12,36530389\n8-Jan-09,11.01,11.28,10.84,11.27,23691272\n7-Jan-09,10.83,11.43,10.81,11.15,30496429\n6-Jan-09,10.83,11.34,10.65,11.05,37185368\n5-Jan-09,10.82,10.90,10.53,10.61,19582272\n2-Jan-09,10.31,10.76,10.26,10.75,16263339\n1-Jan-09,10.24,10.24,10.24,10.24,0\n31-Dec-08,10.19,10.46,10.07,10.24,20524825\n30-Dec-08,10.34,10.44,10.11,10.23,16869644\n29-Dec-08,10.66,10.74,10.16,10.34,15977928\n26-Dec-08,10.61,10.78,10.59,10.65,5616687\n25-Dec-08,10.65,10.65,10.65,10.65,0\n24-Dec-08,10.88,10.91,10.57,10.65,4567966\n23-Dec-08,10.90,11.10,10.76,10.83,9239509\n22-Dec-08,11.14,11.21,10.75,10.96,15791084\n19-Dec-08,11.47,11.60,11.06,11.09,21509348\n18-Dec-08,11.80,11.82,11.20,11.36,14867224\n17-Dec-08,11.65,11.84,11.35,11.68,20385496\n16-Dec-08,11.17,11.88,11.15,11.79,21712047\n15-Dec-08,11.48,11.58,10.95,11.13,15491373\n12-Dec-08,11.64,11.64,10.90,11.48,24217809\n11-Dec-08,11.93,12.29,11.65,11.69,20658805\n10-Dec-08,11.99,12.14,11.73,12.02,19014779\n9-Dec-08,11.62,12.29,11.41,11.86,25036803\n8-Dec-08,11.01,12.25,11.01,12.00,31650982\n5-Dec-08,10.25,10.76,9.92,10.71,23011123\n4-Dec-08,10.40,10.48,10.08,10.27,18678879\n3-Dec-08,10.19,10.55,9.94,10.55,19428838\n2-Dec-08,10.24,10.53,9.89,10.52,25073311\n1-Dec-08,10.94,10.94,9.74,10.05,28116569\n28-Nov-08,10.90,11.27,10.90,11.17,9158295\n27-Nov-08,11.05,11.05,11.05,11.05,0\n26-Nov-08,10.28,11.20,10.16,11.05,22783329\n25-Nov-08,10.20,10.63,10.00,10.42,33282091\n24-Nov-08,9.55,10.28,9.00,10.14,38730835\n21-Nov-08,10.39,10.47,8.72,9.30,58476183\n20-Nov-08,10.04,10.60,9.80,9.81,49331784\n19-Nov-08,10.29,10.69,10.14,10.35,27342282\n18-Nov-08,10.91,11.10,10.14,10.60,27842406\n17-Nov-08,10.47,11.18,10.27,10.52,27682883\n14-Nov-08,9.97,11.51,9.92,10.89,48097352\n13-Nov-08,10.12,10.42,8.85,10.27,63104681\n12-Nov-08,11.10,11.11,10.50,10.50,21280632\n11-Nov-08,11.56,11.61,11.01,11.33,19217375\n10-Nov-08,12.93,12.96,11.64,11.86,21678791\n7-Nov-08,12.12,12.65,12.03,12.55,16272000\n6-Nov-08,12.52,12.72,11.89,12.03,20269300\n5-Nov-08,12.60,13.20,12.60,12.77,28186600\n4-Nov-08,12.95,13.32,12.66,12.93,21884900\n3-Nov-08,12.25,12.81,12.24,12.61,16428900\n31-Oct-08,12.32,12.54,11.85,12.20,23634900\n30-Oct-08,12.47,12.85,12.07,12.25,29435000\n29-Oct-08,12.97,13.01,11.93,12.13,30852800\n28-Oct-08,12.04,13.16,11.71,13.15,27059800\n27-Oct-08,11.42,12.25,11.27,11.74,20375700\n24-Oct-08,10.74,12.05,10.59,11.50,35338000\n23-Oct-08,12.00,12.49,11.49,11.99,36968500\n22-Oct-08,12.47,12.73,11.47,11.98,32744000\n21-Oct-08,12.97,13.24,12.46,12.58,22366700\n20-Oct-08,13.29,13.49,12.80,13.37,27676800\n17-Oct-08,13.02,14.26,12.74,13.04,35764900\n16-Oct-08,12.90,13.29,12.27,13.21,39569500\n15-Oct-08,13.77,13.79,12.58,12.58,36277200\n14-Oct-08,15.69,15.70,14.00,14.08,37913800\n13-Oct-08,13.68,15.21,13.56,15.21,36815700\n10-Oct-08,12.80,13.98,12.46,13.29,48332100\n9-Oct-08,13.91,14.03,13.29,13.43,38838700\n8-Oct-08,13.37,14.30,13.23,13.50,41886300\n7-Oct-08,15.09,15.12,13.55,13.55,33995500\n6-Oct-08,14.88,15.49,14.29,14.86,38838300\n3-Oct-08,16.04,16.55,15.16,15.25,34447100\n2-Oct-08,16.15,16.15,15.08,15.79,31377800\n1-Oct-08,16.22,16.60,15.99,16.15,21739300\n30-Sep-08,15.73,16.60,15.50,16.48,29178600\n29-Sep-08,16.69,16.94,15.41,15.41,38552500\n26-Sep-08,16.61,17.11,16.57,17.00,16756900\n25-Sep-08,16.70,17.11,16.50,16.93,24062600\n24-Sep-08,16.60,16.84,16.28,16.70,29264600\n23-Sep-08,16.81,17.34,16.33,16.33,34437400\n22-Sep-08,16.69,17.24,16.50,16.57,26938900\n19-Sep-08,18.44,18.44,14.50,16.63,83131900\n18-Sep-08,16.38,18.09,16.28,17.25,54027700\n17-Sep-08,15.88,16.69,15.43,16.19,71255100\n16-Sep-08,16.16,16.50,15.68,15.98,98778800\n15-Sep-08,18.36,18.96,17.93,17.99,41184300\n12-Sep-08,19.06,19.26,18.82,19.04,24650300\n11-Sep-08,19.05,19.39,18.82,19.18,26511700\n10-Sep-08,19.50,19.53,19.20,19.31,27863700\n9-Sep-08,20.59,20.59,19.27,19.30,43436400\n8-Sep-08,20.61,20.68,19.85,20.17,36156100\n5-Sep-08,20.20,20.83,20.19,20.41,35222300\n4-Sep-08,20.32,20.63,20.00,20.36,41729900\n3-Sep-08,20.80,21.08,20.27,20.31,33976000\n2-Sep-08,21.91,21.98,20.80,20.83,50512600\n29-Aug-08,22.26,22.93,21.72,21.73,94193900\n28-Aug-08,25.97,26.04,24.95,25.21,37230800\n27-Aug-08,25.25,25.81,25.08,25.63,22442600\n26-Aug-08,25.19,25.42,24.96,25.17,20795000\n25-Aug-08,25.14,25.51,24.95,25.04,15984100\n22-Aug-08,25.50,25.60,24.94,25.27,18511000\n21-Aug-08,24.69,25.34,24.65,25.21,15013100\n20-Aug-08,24.86,25.03,24.50,24.97,22453100\n19-Aug-08,24.50,24.78,24.33,24.44,17948500\n18-Aug-08,25.22,25.25,24.46,24.63,18017100\n15-Aug-08,25.29,25.60,25.01,25.06,18022100\n14-Aug-08,24.96,25.60,24.91,25.30,19320400\n13-Aug-08,25.12,25.39,24.91,25.13,18537500\n12-Aug-08,25.26,25.41,24.88,25.33,29294900\n11-Aug-08,25.09,25.46,24.85,25.19,20154100\n8-Aug-08,24.99,25.50,24.90,25.00,24813900\n7-Aug-08,24.86,25.38,24.86,24.99,22232000\n6-Aug-08,25.25,25.36,24.81,25.25,25246900\n5-Aug-08,25.68,25.75,24.85,25.11,32917000\n4-Aug-08,24.60,25.65,24.27,25.39,29100700\n1-Aug-08,24.65,24.82,24.00,24.41,17969800\n31-Jul-08,24.09,25.26,23.97,24.57,26636500\n30-Jul-08,24.16,24.49,23.79,24.00,22099400\n29-Jul-08,23.25,24.20,23.21,24.01,18228200\n28-Jul-08,23.44,23.66,23.11,23.24,17761200\n25-Jul-08,23.54,23.66,23.05,23.47,15524600\n24-Jul-08,23.27,23.89,23.20,23.42,16803500\n23-Jul-08,23.81,23.98,23.20,23.81,22496900\n22-Jul-08,23.43,23.77,23.26,23.76,20897100\n21-Jul-08,24.42,24.57,23.56,23.98,20106600\n18-Jul-08,24.44,24.57,24.00,24.23,25788500\n17-Jul-08,23.19,24.48,23.10,24.37,33264300\n16-Jul-08,22.67,23.19,22.25,23.10,28061300\n15-Jul-08,21.91,22.83,21.79,22.64,36483700\n14-Jul-08,22.58,22.80,22.01,22.20,22617900\n11-Jul-08,21.79,22.84,21.78,22.31,28561700\n10-Jul-08,21.59,22.60,21.44,22.35,35785900\n9-Jul-08,22.52,22.60,21.60,21.60,28092600\n8-Jul-08,22.84,23.11,22.18,22.63,30895400\n7-Jul-08,22.79,23.45,22.51,22.97,30605000\n3-Jul-08,22.35,23.10,22.35,22.81,15183100\n2-Jul-08,22.76,23.18,22.69,22.70,37321200\n1-Jul-08,21.56,22.34,21.50,22.18,28934800\n30-Jun-08,22.14,22.30,21.87,21.88,21946100\n27-Jun-08,22.45,22.58,22.03,22.25,36616800\n26-Jun-08,23.17,23.24,22.52,22.52,22997200\n25-Jun-08,23.17,23.85,23.11,23.55,20329100\n24-Jun-08,23.23,23.50,22.98,23.04,24709500\n23-Jun-08,23.41,23.74,23.36,23.41,17409800\n20-Jun-08,24.20,24.29,23.40,23.40,36587800\n19-Jun-08,23.76,24.50,23.76,24.34,22585000\n18-Jun-08,24.00,24.14,23.77,23.89,19923900\n17-Jun-08,24.60,24.66,24.07,24.15,19809700\n16-Jun-08,24.33,24.52,24.15,24.45,15882400\n13-Jun-08,23.93,24.57,23.77,24.42,25577100\n12-Jun-08,23.60,24.05,23.54,23.78,28088800\n11-Jun-08,23.53,23.77,23.41,23.45,28507700\n10-Jun-08,23.85,23.99,23.51,23.60,37645300\n9-Jun-08,23.76,24.33,23.32,24.15,33372500\n6-Jun-08,23.82,24.23,23.73,23.74,34208400\n5-Jun-08,23.93,24.12,23.82,24.02,27493800\n4-Jun-08,23.34,24.05,23.26,23.89,35343900\n3-Jun-08,23.18,23.69,22.98,23.47,41598600\n2-Jun-08,22.99,23.19,22.40,22.79,35517900\n30-May-08,23.50,23.94,23.05,23.06,74517900\n29-May-08,21.59,21.89,21.47,21.81,26422000\n28-May-08,21.66,21.90,21.33,21.69,22955900\n27-May-08,21.27,21.66,21.14,21.49,20036100\n23-May-08,21.35,21.55,21.12,21.19,24557100\n22-May-08,20.12,21.00,20.07,20.89,25098100\n21-May-08,20.53,20.55,19.90,20.01,25419200\n20-May-08,21.06,21.11,20.43,20.57,24436500\n19-May-08,21.37,21.59,21.09,21.20,25173400\n16-May-08,20.74,21.44,20.61,21.31,33773100\n15-May-08,20.17,20.73,20.00,20.63,25239100\n14-May-08,20.15,20.40,20.00,20.06,19307500\n13-May-08,19.44,20.10,19.41,20.00,30147500\n12-May-08,19.02,19.48,18.92,19.37,20531200\n9-May-08,18.70,19.23,18.66,19.03,17984800\n8-May-08,19.01,19.16,18.70,18.84,29136300\n7-May-08,19.23,19.38,18.80,18.90,22677400\n6-May-08,18.93,19.29,18.88,19.19,16353200\n5-May-08,19.16,19.39,19.10,19.10,17693700\n2-May-08,19.25,19.40,19.11,19.32,21586400\n1-May-08,18.69,19.14,18.69,19.08,26770900\n30-Apr-08,18.90,19.02,18.56,18.63,32236500\n29-Apr-08,18.84,19.17,18.82,18.97,18700400\n28-Apr-08,19.02,19.10,18.85,18.87,17589000\n25-Apr-08,19.12,19.23,18.87,19.11,17496800\n24-Apr-08,19.10,19.28,18.86,19.14,14948900\n23-Apr-08,19.12,19.20,18.84,19.05,15757000\n22-Apr-08,19.39,19.60,18.90,19.05,18165000\n21-Apr-08,19.02,19.69,18.98,19.56,14518600\n18-Apr-08,19.47,19.70,19.19,19.47,20726700\n17-Apr-08,18.95,19.21,18.63,19.05,27677900\n16-Apr-08,18.60,18.76,18.35,18.72,17042800\n15-Apr-08,18.27,18.49,18.13,18.28,16625700\n14-Apr-08,18.50,18.53,18.17,18.24,14191400\n11-Apr-08,18.66,18.74,18.44,18.50,26647900\n10-Apr-08,18.65,19.05,18.63,18.77,30135200\n9-Apr-08,19.01,19.04,18.53,18.69,69763500\n8-Apr-08,19.15,19.32,18.96,19.00,28556300\n7-Apr-08,19.78,19.78,19.17,19.23,25719300\n4-Apr-08,19.91,19.94,19.43,19.53,31237800\n3-Apr-08,19.73,20.30,19.66,20.12,22429500\n2-Apr-08,20.33,20.34,19.73,19.95,20371700\n1-Apr-08,20.28,20.34,20.02,20.33,21966700\n31-Mar-08,19.55,20.07,19.49,19.92,18485400\n28-Mar-08,19.60,19.87,19.53,19.61,15562300\n27-Mar-08,20.01,20.02,19.42,19.47,24646300\n26-Mar-08,20.27,20.55,19.99,20.16,15001700\n25-Mar-08,20.54,20.70,20.26,20.42,20224100\n24-Mar-08,19.92,20.81,19.76,20.56,26185000\n20-Mar-08,19.77,20.03,19.50,20.01,28667600\n19-Mar-08,20.12,20.50,19.49,19.51,26464900\n18-Mar-08,19.80,20.37,19.72,20.32,28016900\n17-Mar-08,19.00,19.68,18.91,19.39,25014800\n14-Mar-08,19.84,20.04,19.24,19.40,26145400\n13-Mar-08,19.39,20.10,19.36,19.85,26524500\n12-Mar-08,19.95,20.09,19.64,19.69,17856500\n11-Mar-08,19.48,19.97,19.37,19.83,30661400\n10-Mar-08,19.35,19.62,19.06,19.12,24667300\n7-Mar-08,19.30,19.91,19.19,19.35,28482800\n6-Mar-08,19.77,19.96,19.35,19.43,24571200\n5-Mar-08,19.70,20.12,19.60,19.79,19840400\n4-Mar-08,19.84,19.89,19.21,19.67,26032000\n3-Mar-08,19.84,20.16,19.73,19.94,27940200\n29-Feb-08,20.72,21.18,19.66,19.90,69437200\n28-Feb-08,20.67,21.06,20.62,20.87,35805400\n27-Feb-08,20.26,20.93,20.16,20.77,29935300\n26-Feb-08,20.04,20.84,19.97,20.48,26949800\n25-Feb-08,19.60,20.25,19.55,20.14,29425900\n22-Feb-08,19.26,19.54,19.01,19.54,21425300\n21-Feb-08,19.89,19.96,19.21,19.27,29360000\n20-Feb-08,19.40,20.05,19.23,19.75,30453500\n19-Feb-08,19.76,19.88,19.25,19.28,26087000\n15-Feb-08,19.54,19.85,19.51,19.57,19307300\n14-Feb-08,20.30,20.35,19.70,19.81,23423700\n13-Feb-08,19.94,20.50,19.94,20.31,21080000\n12-Feb-08,20.05,20.18,19.61,19.71,25225400\n11-Feb-08,19.50,20.09,19.42,19.93,28393000\n8-Feb-08,19.30,19.89,19.27,19.45,32302100\n7-Feb-08,18.95,19.56,18.87,19.43,39072100\n6-Feb-08,19.35,19.51,19.00,19.07,25148200\n5-Feb-08,19.79,19.98,19.05,19.12,36239700\n4-Feb-08,20.29,20.43,19.90,20.02,22485400\n1-Feb-08,20.12,20.42,19.81,20.35,27404700\n31-Jan-08,20.10,20.30,19.90,20.04,31341900\n30-Jan-08,20.53,20.95,20.20,20.43,30358300\n29-Jan-08,20.37,20.74,20.01,20.56,31968900\n28-Jan-08,19.81,20.50,19.81,20.35,35070200\n25-Jan-08,21.55,21.82,20.00,20.06,41479900\n24-Jan-08,20.15,21.28,20.14,21.09,39061600\n23-Jan-08,19.80,20.26,18.87,20.12,55146300\n22-Jan-08,19.94,20.49,19.85,20.25,53241400\n18-Jan-08,21.00,21.50,20.86,21.08,34941600\n17-Jan-08,21.09,21.64,20.82,20.86,38748800\n16-Jan-08,20.32,21.33,20.05,20.68,40303900\n15-Jan-08,21.20,21.23,20.70,20.90,28711300\n14-Jan-08,21.25,21.70,21.13,21.45,32487800\n11-Jan-08,21.04,21.28,20.69,20.76,34933300\n10-Jan-08,20.61,21.26,20.53,20.94,31576500\n9-Jan-08,20.61,21.30,20.44,20.93,40816400\n8-Jan-08,21.26,21.83,20.70,20.74,40265900\n7-Jan-08,21.59,21.81,20.84,21.26,56939700\n4-Jan-08,22.79,23.00,22.01,22.09,47601800\n3-Jan-08,24.23,24.39,23.51,23.71,32110600\n2-Jan-08,24.36,24.65,24.02,24.39,27820400\n31-Dec-07,24.67,24.77,24.33,24.51,14472100\n28-Dec-07,25.07,25.18,24.82,24.95,10938300\n27-Dec-07,24.72,25.20,24.68,24.93,17710600\n26-Dec-07,24.89,25.02,24.69,24.99,13576100\n24-Dec-07,24.88,25.23,24.63,25.15,7130300\n21-Dec-07,25.00,25.19,24.79,24.88,37383200\n20-Dec-07,24.60,25.03,24.42,24.89,25374500\n19-Dec-07,24.33,24.86,24.21,24.36,24348300\n18-Dec-07,23.61,24.28,23.61,24.02,24772500\n17-Dec-07,23.39,23.93,23.34,23.65,26157200\n14-Dec-07,23.41,23.95,23.22,23.57,29605300\n13-Dec-07,23.87,23.92,23.15,23.60,46424300\n12-Dec-07,24.74,24.85,23.81,24.00,43620000\n11-Dec-07,25.06,25.30,24.28,24.36,29119700\n10-Dec-07,25.05,25.38,24.71,25.21,24391100\n7-Dec-07,24.88,25.24,24.50,25.07,28091400\n6-Dec-07,24.35,24.98,24.11,24.95,29673800\n5-Dec-07,23.99,24.35,23.75,24.31,29813700\n4-Dec-07,24.29,24.32,23.58,23.60,43232600\n3-Dec-07,24.60,24.71,23.85,23.94,44989300\n30-Nov-07,25.15,25.17,23.92,24.54,4814800\n29-Nov-07,28.00,28.40,27.57,28.14,35980300\n28-Nov-07,26.99,27.97,26.99,27.69,27719700\n27-Nov-07,26.05,26.67,25.81,26.64,23411300\n26-Nov-07,26.00,26.48,25.68,25.71,17583100\n23-Nov-07,25.66,26.15,25.46,26.13,7969000\n21-Nov-07,25.78,26.14,25.56,25.56,20615800\n20-Nov-07,26.91,27.12,25.75,26.31,23756100\n19-Nov-07,26.76,27.16,26.52,26.62,15678100\n16-Nov-07,26.93,27.15,26.21,26.91,28643100\n15-Nov-07,27.32,27.70,26.76,26.83,22996500\n14-Nov-07,28.31,28.32,27.47,27.61,17483100\n13-Nov-07,27.42,28.21,27.20,28.21,23987100\n12-Nov-07,27.35,27.58,26.85,27.17,23436900\n9-Nov-07,27.53,27.73,27.09,27.31,24279400\n8-Nov-07,29.25,29.42,27.90,28.54,28615300\n7-Nov-07,29.97,30.06,29.17,29.31,25371500\n6-Nov-07,30.20,30.37,29.69,30.25,15608700\n5-Nov-07,29.51,30.11,29.50,29.97,18865100\n2-Nov-07,29.96,30.22,29.51,30.05,24300500\n1-Nov-07,30.28,30.54,29.62,29.70,25902800\n31-Oct-07,30.56,30.77,30.24,30.60,48170900\n30-Oct-07,29.45,29.97,29.40,29.80,28588700\n29-Oct-07,29.66,30.03,29.46,29.47,30768200\n26-Oct-07,29.03,29.15,28.43,28.98,18757700\n25-Oct-07,28.08,28.51,27.65,27.92,23336600\n24-Oct-07,28.47,28.81,27.90,28.49,15401500\n23-Oct-07,28.25,28.79,28.19,28.79,14797300\n22-Oct-07,27.70,28.19,27.60,28.18,15981700\n19-Oct-07,29.06,29.13,27.81,27.92,31795100\n18-Oct-07,28.42,29.32,28.30,29.13,21709300\n17-Oct-07,28.49,28.90,28.20,28.62,23350900\n16-Oct-07,28.05,28.22,27.79,27.85,14715400\n15-Oct-07,28.50,28.53,27.90,28.18,10578300\n12-Oct-07,28.10,28.83,28.10,28.53,12395700\n11-Oct-07,28.15,28.63,27.96,28.01,15991000\n10-Oct-07,27.86,28.19,27.76,28.04,8977200\n9-Oct-07,28.00,28.07,27.64,27.91,10400700\n8-Oct-07,27.83,28.09,27.69,27.95,10773500\n5-Oct-07,27.73,27.87,27.29,27.85,14113700\n4-Oct-07,27.58,27.68,27.35,27.62,10196300\n3-Oct-07,27.57,27.61,27.30,27.58,10524000\n2-Oct-07,27.75,27.80,27.14,27.76,17837700\n1-Oct-07,27.60,27.98,27.54,27.95,15347200\n28-Sep-07,27.70,27.89,27.09,27.60,16033500\n27-Sep-07,28.09,28.09,27.66,27.75,13319300\n26-Sep-07,28.20,28.34,27.88,27.98,17349500\n25-Sep-07,27.85,28.21,27.83,28.16,11145900\n24-Sep-07,28.10,28.25,27.75,27.87,15655600\n21-Sep-07,28.18,28.18,27.61,27.76,17739900\n20-Sep-07,27.88,28.20,27.68,27.85,14725800\n19-Sep-07,27.36,27.95,27.15,27.74,26022000\n18-Sep-07,26.52,27.18,26.40,27.10,18571000\n17-Sep-07,26.23,26.60,26.23,26.30,16041700\n14-Sep-07,26.40,26.59,26.23,26.39,22488000\n13-Sep-07,26.87,27.05,26.75,26.89,17063100\n12-Sep-07,26.87,27.25,26.66,26.76,18703800\n11-Sep-07,26.70,26.97,26.41,26.94,21416100\n10-Sep-07,27.29,27.30,26.21,26.55,30362600\n7-Sep-07,27.89,27.95,27.02,27.16,27322700\n6-Sep-07,28.47,28.57,28.26,28.46,19447300\n5-Sep-07,28.25,28.49,28.03,28.30,17033400\n4-Sep-07,28.20,28.77,28.00,28.51,16922100\n31-Aug-07,29.02,29.12,27.62,28.25,39278200\n30-Aug-07,27.72,28.66,27.58,28.46,26455100\n29-Aug-07,27.37,27.92,26.98,27.86,17168300\n28-Aug-07,27.48,27.59,26.86,26.89,15729600\n27-Aug-07,27.83,27.91,27.50,27.59,10134600\n24-Aug-07,27.12,27.82,27.06,27.74,15405200\n23-Aug-07,27.16,27.31,26.70,27.24,20246500\n22-Aug-07,26.37,27.17,25.39,26.96,27165600\n21-Aug-07,26.25,26.40,25.71,26.17,22495300\n20-Aug-07,26.27,26.82,26.26,26.53,14594900\n17-Aug-07,26.74,26.90,25.90,26.32,29793900\n16-Aug-07,26.02,26.25,24.96,25.93,32738600\n15-Aug-07,26.30,27.16,26.24,26.30,20902600\n14-Aug-07,26.70,27.17,26.26,26.46,16686900\n13-Aug-07,26.77,27.43,26.68,26.70,18388100\n10-Aug-07,26.13,26.83,25.81,26.45,23809900\n9-Aug-07,27.50,27.60,26.34,26.43,26965600\n8-Aug-07,27.58,28.00,27.40,27.78,26590000\n7-Aug-07,27.40,27.56,26.62,27.22,21876900\n6-Aug-07,27.22,27.40,26.58,27.39,24622700\n3-Aug-07,28.19,28.22,27.14,27.15,22521900\n2-Aug-07,28.00,28.30,28.00,28.18,23584500\n1-Aug-07,27.64,28.19,27.24,27.76,27241200\n31-Jul-07,28.08,28.47,27.74,27.97,22734900\n30-Jul-07,27.88,28.10,27.20,27.78,23855600\n27-Jul-07,28.48,28.83,27.82,27.82,22663700\n26-Jul-07,28.84,29.44,28.13,28.49,31000100\n25-Jul-07,28.70,29.15,28.39,28.98,18761000\n24-Jul-07,29.20,29.52,28.61,28.74,15913200\n23-Jul-07,29.18,29.60,29.13,29.34,15403500\n20-Jul-07,29.29,29.36,28.92,29.18,18652800\n19-Jul-07,29.12,29.40,28.94,29.19,20480400\n18-Jul-07,28.99,29.25,28.71,28.99,21080500\n17-Jul-07,29.19,29.61,29.09,29.19,18213600\n16-Jul-07,28.81,29.32,28.71,28.95,15942100\n13-Jul-07,28.68,28.89,28.47,28.82,10202100\n12-Jul-07,28.42,28.85,27.89,28.83,33609200\n11-Jul-07,28.61,28.70,28.19,28.37,17186700\n10-Jul-07,28.80,29.02,28.57,28.65,13885700\n9-Jul-07,28.86,29.24,28.77,29.01,13663000\n6-Jul-07,28.91,29.14,28.80,29.01,12911200\n5-Jul-07,28.80,29.05,28.52,28.99,14306600\n3-Jul-07,28.91,28.93,28.58,28.71,7738200\n2-Jul-07,28.81,28.98,28.76,28.93,18409000\n29-Jun-07,28.34,28.86,28.34,28.55,21184800\n28-Jun-07,28.02,28.73,28.00,28.45,25578800\n27-Jun-07,27.29,28.00,27.26,27.96,18230900\n26-Jun-07,27.34,27.75,27.28,27.56,13399000\n25-Jun-07,27.10,27.63,27.03,27.09,17580900\n22-Jun-07,27.75,27.77,27.04,27.09,18159200\n21-Jun-07,27.39,27.99,27.37,27.85,13181900\n20-Jun-07,27.83,28.00,27.44,27.53,12879800\n19-Jun-07,27.74,27.95,27.54,27.82,11199300\n18-Jun-07,27.77,28.00,27.75,27.85,8042200\n15-Jun-07,27.86,27.97,27.69,27.81,20651300\n14-Jun-07,27.20,27.70,27.11,27.64,17668800\n13-Jun-07,27.05,27.31,26.92,27.25,14869900\n12-Jun-07,27.48,27.49,26.92,26.92,20746700\n11-Jun-07,27.34,27.77,27.26,27.60,15860300\n8-Jun-07,27.05,27.42,26.74,27.34,13793600\n7-Jun-07,27.11,27.50,26.99,26.99,19296700\n6-Jun-07,27.09,27.47,27.07,27.35,15066200\n5-Jun-07,27.27,27.49,27.10,27.26,15159500\n4-Jun-07,27.20,27.49,27.11,27.32,13879100\n1-Jun-07,27.98,28.04,27.28,27.30,51196500\n31-May-07,26.31,26.97,26.22,26.91,29454900\n30-May-07,25.93,26.55,25.84,26.22,22937900\n29-May-07,26.05,26.33,25.99,26.11,11883100\n25-May-07,26.09,26.10,25.76,25.99,10737000\n24-May-07,26.27,26.71,25.78,25.89,19468500\n23-May-07,26.35,26.40,26.11,26.26,11894700\n22-May-07,25.95,26.52,25.90,26.38,12864400\n21-May-07,25.80,26.16,25.80,25.94,10085500\n18-May-07,26.25,26.25,25.79,26.07,20843000\n17-May-07,25.98,26.61,25.94,26.06,33007700\n16-May-07,25.04,25.98,24.99,25.92,29500600\n15-May-07,25.20,25.50,24.64,24.67,25233400\n14-May-07,25.77,25.85,25.11,25.27,15425000\n11-May-07,25.47,25.85,25.41,25.81,10281500\n10-May-07,25.95,25.97,25.32,25.44,13378400\n9-May-07,25.88,26.15,25.80,26.04,9013300\n8-May-07,26.17,26.20,25.57,26.02,11626400\n7-May-07,25.75,26.06,25.66,25.90,10911000\n4-May-07,25.77,25.95,25.58,25.66,13448100\n3-May-07,25.19,25.88,25.11,25.75,18558100\n2-May-07,25.18,25.39,25.00,25.15,16446200\n1-May-07,25.21,25.25,24.75,25.22,16893500\n30-Apr-07,25.16,25.87,25.15,25.21,21145400\n27-Apr-07,24.85,25.29,24.73,25.23,14850000\n26-Apr-07,24.79,25.01,24.66,24.91,9574100\n25-Apr-07,24.73,25.01,24.62,24.97,12089100\n24-Apr-07,24.91,24.98,24.73,24.79,11101800\n23-Apr-07,25.05,25.08,24.73,24.84,11974200\n20-Apr-07,25.04,25.28,24.88,24.99,18704200\n19-Apr-07,24.79,25.04,24.73,24.94,11811000\n18-Apr-07,25.20,25.30,24.87,25.04,19418900\n17-Apr-07,25.44,25.54,25.13,25.47,15592600\n16-Apr-07,25.49,25.58,25.23,25.53,18831200\n13-Apr-07,24.80,25.53,24.65,25.36,39814200\n12-Apr-07,24.30,24.83,24.23,24.65,22470000\n11-Apr-07,24.15,24.34,23.97,24.25,22110700\n10-Apr-07,23.57,24.04,23.51,23.91,17115400\n9-Apr-07,23.59,23.86,23.51,23.71,14066300\n5-Apr-07,23.31,23.53,23.25,23.51,10082900\n4-Apr-07,23.10,23.39,22.98,23.36,13544300\n3-Apr-07,23.10,23.32,22.86,23.07,20287600\n2-Apr-07,23.09,23.20,22.91,23.02,15519500\n30-Mar-07,22.73,23.40,22.65,23.21,36136800\n29-Mar-07,23.50,23.59,23.22,23.39,14879100\n28-Mar-07,23.58,23.70,23.34,23.35,16059300\n27-Mar-07,23.60,23.88,23.57,23.75,24046900\n26-Mar-07,23.53,23.64,23.09,23.62,33628300\n23-Mar-07,22.91,23.08,22.78,22.83,11927800\n22-Mar-07,22.99,23.11,22.84,22.93,16750600\n21-Mar-07,22.59,23.05,22.44,22.95,17986700\n20-Mar-07,22.42,22.79,22.41,22.53,16318600\n19-Mar-07,22.60,22.75,22.42,22.46,16167200\n16-Mar-07,22.41,22.61,22.33,22.50,22763500\n15-Mar-07,22.30,22.50,22.20,22.46,15775300\n14-Mar-07,21.82,22.51,21.62,22.32,33536000\n13-Mar-07,22.12,22.21,21.61,21.79,27065600\n12-Mar-07,22.35,22.45,22.24,22.35,12294400\n9-Mar-07,22.33,22.58,22.24,22.43,21392600\n8-Mar-07,22.50,22.55,22.00,22.26,22824800\n7-Mar-07,22.80,22.80,22.25,22.30,21623700\n6-Mar-07,22.62,22.81,22.47,22.67,21956100\n5-Mar-07,23.00,23.13,22.52,22.53,23447000\n2-Mar-07,22.67,23.54,22.64,23.18,55793100\n1-Mar-07,22.51,23.42,22.18,23.01,38437900\n28-Feb-07,23.02,23.32,22.51,22.85,29094000\n27-Feb-07,23.23,23.62,22.61,22.88,27760700\n26-Feb-07,24.25,24.32,23.61,23.80,19410100\n23-Feb-07,24.23,24.41,24.10,24.19,14343500\n22-Feb-07,24.19,24.52,24.10,24.34,16077400\n21-Feb-07,24.31,24.36,24.10,24.31,17618800\n20-Feb-07,24.40,24.67,24.35,24.53,14727200\n16-Feb-07,24.27,24.58,23.85,24.39,18672000\n15-Feb-07,24.00,24.57,23.90,24.38,19631800\n14-Feb-07,23.61,24.07,23.56,23.90,19041200\n13-Feb-07,23.62,23.66,23.45,23.61,12846300\n12-Feb-07,23.75,23.76,23.31,23.51,15005800\n9-Feb-07,23.86,23.89,23.60,23.72,19889600\n8-Feb-07,23.62,23.96,23.59,23.85,15928400\n7-Feb-07,23.85,23.98,23.60,23.82,22767400\n6-Feb-07,24.08,24.08,23.49,23.65,23628800\n5-Feb-07,23.80,24.18,23.61,23.90,34267900\n2-Feb-07,23.94,24.00,23.42,23.52,39414200\n1-Feb-07,25.36,25.51,23.78,23.80,65164200\n31-Jan-07,24.26,24.46,23.94,24.22,15824600\n30-Jan-07,23.98,24.47,23.86,24.29,20770200\n29-Jan-07,23.70,24.14,23.57,23.85,17939300\n26-Jan-07,23.91,24.36,23.73,23.73,17979800\n25-Jan-07,24.55,24.77,24.03,24.15,19008800\n24-Jan-07,24.44,24.60,24.16,24.46,15087900\n23-Jan-07,24.46,24.74,24.29,24.29,13645200\n22-Jan-07,24.85,24.86,24.26,24.49,25724700\n19-Jan-07,25.07,25.20,24.82,25.02,22950800\n18-Jan-07,25.49,25.80,24.94,25.21,25935900\n17-Jan-07,26.20,26.30,25.60,25.84,26469100\n16-Jan-07,26.62,26.70,26.35,26.51,13865500\n12-Jan-07,26.76,26.84,26.36,26.62,18229800\n11-Jan-07,27.25,27.48,26.73,26.93,21826900\n10-Jan-07,26.50,27.48,26.47,27.26,25385200\n9-Jan-07,26.35,26.91,26.26,26.84,21297800\n8-Jan-07,26.05,26.55,26.02,26.17,17452400\n5-Jan-07,25.78,26.53,25.76,26.16,33378800\n4-Jan-07,25.64,26.42,25.50,26.24,27514300\n3-Jan-07,25.35,26.09,25.20,25.49,23183800\n29-Dec-06,25.12,25.50,25.04,25.09,13777100\n28-Dec-06,25.51,25.51,25.19,25.24,9992900\n27-Dec-06,25.61,26.00,25.44,25.46,10175900\n26-Dec-06,25.60,25.60,25.29,25.49,8172700\n22-Dec-06,25.60,25.86,25.45,25.45,11949200\n21-Dec-06,25.67,25.95,25.42,25.46,15035800\n20-Dec-06,26.09,26.23,25.71,25.77,15095300\n19-Dec-06,26.21,26.30,25.75,26.13,20822000\n18-Dec-06,26.66,26.83,26.20,26.39,11367200\n15-Dec-06,26.87,27.00,26.40,26.53,23991700\n14-Dec-06,26.09,27.05,26.04,26.87,24413900\n13-Dec-06,26.50,26.50,26.01,26.07,16637400\n12-Dec-06,26.61,26.70,26.05,26.20,22759400\n11-Dec-06,26.16,27.00,26.12,26.73,15647000\n8-Dec-06,26.27,26.95,26.18,26.32,15597300\n7-Dec-06,26.65,26.69,26.03,26.42,21979000\n6-Dec-06,26.86,26.94,26.51,26.58,15366600\n5-Dec-06,27.04,27.14,26.72,26.90,16429100\n4-Dec-06,27.20,27.58,26.77,26.84,23352700\n1-Dec-06,27.08,27.52,26.90,27.27,19546600\n30-Nov-06,27.72,27.89,27.00,27.24,19389100\n29-Nov-06,26.95,27.88,26.95,27.62,28318300\n28-Nov-06,26.84,27.20,26.73,26.95,18914900\n27-Nov-06,27.28,27.39,26.73,27.01,22131400\n24-Nov-06,26.94,27.70,26.50,27.33,14010100\n22-Nov-06,27.27,27.74,26.99,27.13,78888100\n21-Nov-06,24.84,25.04,24.70,24.82,25435800\n20-Nov-06,24.94,25.05,24.00,24.65,18121800\n17-Nov-06,24.89,25.34,24.75,25.02,21190100\n16-Nov-06,24.90,25.18,24.40,25.10,48600500\n15-Nov-06,25.52,26.10,25.52,25.75,28247200\n14-Nov-06,25.52,25.81,25.03,25.59,21700500\n13-Nov-06,24.89,25.82,24.85,25.49,24213000\n10-Nov-06,24.90,25.18,24.76,24.89,16537600\n9-Nov-06,24.33,25.35,24.30,24.98,31547400\n8-Nov-06,24.45,24.45,23.41,24.18,24849800\n7-Nov-06,24.67,24.96,24.40,24.56,19912100\n6-Nov-06,24.46,24.87,24.24,24.47,20121800\n3-Nov-06,24.89,25.00,24.18,24.24,23271700\n2-Nov-06,24.23,25.00,24.19,24.80,36320600\n1-Nov-06,24.38,24.93,23.92,24.02,35748100\n31-Oct-06,23.18,24.43,23.10,24.33,35492300\n30-Oct-06,22.94,23.46,22.90,23.37,11658300\n27-Oct-06,23.30,23.54,22.90,23.11,16764900\n26-Oct-06,23.10,23.50,22.89,23.37,14027000\n25-Oct-06,23.22,23.31,22.80,23.07,19809800\n24-Oct-06,23.42,23.56,23.18,23.28,15336100\n23-Oct-06,23.43,23.93,23.37,23.60,12552900\n20-Oct-06,23.36,23.65,22.97,23.54,19113400\n19-Oct-06,23.70,23.70,23.05,23.12,39004700\n18-Oct-06,24.68,24.95,24.18,24.70,18039000\n17-Oct-06,24.33,24.72,24.22,24.54,21658000\n16-Oct-06,24.09,24.73,24.00,24.62,20115900\n13-Oct-06,23.88,24.33,23.71,23.95,16877900\n12-Oct-06,23.12,23.97,23.10,23.87,19327600\n11-Oct-06,23.36,23.69,22.82,22.97,32517500\n10-Oct-06,23.53,23.94,23.40,23.52,15622100\n9-Oct-06,23.11,23.87,23.11,23.56,13423500\n6-Oct-06,23.17,23.45,22.95,23.25,16392100\n5-Oct-06,23.51,23.56,22.93,23.29,25842300\n4-Oct-06,22.56,23.25,22.48,23.14,24623800\n3-Oct-06,22.83,22.99,22.55,22.70,21697100\n2-Oct-06,22.70,23.39,22.65,23.04,22338100\n29-Sep-06,22.88,23.10,22.65,22.84,21426400\n28-Sep-06,22.36,22.98,22.08,22.97,27320200\n27-Sep-06,22.55,22.75,22.24,22.45,16735600\n26-Sep-06,22.06,22.75,21.87,22.72,32380600\n25-Sep-06,21.48,22.30,21.41,22.16,26981500\n22-Sep-06,21.13,21.48,20.99,21.44,26081000\n21-Sep-06,21.57,21.57,21.00,21.18,23009000\n20-Sep-06,21.50,21.55,21.30,21.50,19902000\n19-Sep-06,21.63,21.90,21.20,21.61,15314400\n18-Sep-06,21.38,21.82,21.26,21.46,16803700\n15-Sep-06,21.73,21.90,21.21,21.35,26880900\n14-Sep-06,21.54,21.95,21.44,21.61,19501300\n13-Sep-06,21.70,21.84,21.50,21.61,19769500\n12-Sep-06,21.16,21.98,21.04,21.87,26860500\n11-Sep-06,20.62,21.67,20.52,21.19,52710300\n8-Sep-06,21.79,21.95,21.50,21.65,16078600\n7-Sep-06,22.05,22.09,21.59,21.73,18826100\n6-Sep-06,22.40,22.68,22.05,22.10,19122800\n5-Sep-06,22.60,22.88,22.30,22.71,14175100\n1-Sep-06,22.80,22.85,22.41,22.55,14309200\n31-Aug-06,22.85,23.31,22.45,22.55,25334000\n30-Aug-06,22.37,22.86,22.11,22.75,21455700\n29-Aug-06,22.26,22.32,21.83,22.25,14875900\n28-Aug-06,21.85,22.39,21.83,22.21,18328300\n25-Aug-06,21.71,22.00,21.60,21.76,12098400\n24-Aug-06,21.77,21.86,21.44,21.78,16427700\n23-Aug-06,21.73,21.96,21.41,21.64,15265700\n22-Aug-06,21.62,21.88,21.28,21.72,20447500\n21-Aug-06,21.96,22.29,21.62,21.62,34604400\n18-Aug-06,20.84,22.36,20.65,22.16,87560800\n17-Aug-06,22.65,23.35,22.25,22.80,32140900\n16-Aug-06,22.13,22.88,21.80,22.73,31191500\n15-Aug-06,21.41,22.20,21.39,22.08,26176200\n14-Aug-06,21.37,21.95,21.11,21.24,23380100\n11-Aug-06,20.90,21.30,20.74,21.07,21677800\n10-Aug-06,21.06,21.25,20.88,20.99,17825400\n9-Aug-06,21.82,21.91,21.02,21.14,22002000\n8-Aug-06,22.11,22.14,21.45,21.59,23484300\n7-Aug-06,22.11,22.19,21.92,22.04,13369500\n4-Aug-06,22.34,22.52,21.92,22.45,21125000\n3-Aug-06,21.83,22.27,21.29,22.09,19907000\n2-Aug-06,21.74,22.14,21.64,21.99,24149600\n1-Aug-06,21.44,21.71,21.23,21.65,17981400\n31-Jul-06,22.17,22.22,21.58,21.68,27382700\n28-Jul-06,21.70,22.34,21.39,22.22,34516700\n27-Jul-06,21.39,21.74,21.20,21.55,22619200\n26-Jul-06,20.85,21.59,20.83,21.22,20483200\n25-Jul-06,20.72,21.14,20.61,20.91,28962700\n24-Jul-06,20.39,20.88,20.12,20.75,43076500\n21-Jul-06,19.10,20.15,18.95,19.91,22757100\n20-Jul-06,22.25,22.46,21.93,22.10,17109700\n19-Jul-06,21.41,22.59,21.34,22.47,34351000\n18-Jul-06,21.54,21.55,20.97,21.34,29445300\n17-Jul-06,21.78,21.96,21.45,21.57,20788300\n14-Jul-06,21.79,22.14,21.43,21.90,30813500\n13-Jul-06,22.22,22.68,21.67,21.70,42322400\n12-Jul-06,23.11,23.17,22.16,22.38,32052800\n"
  },
  {
    "path": "examples/stockserver/EMC.csv",
    "content": "﻿Date,Open,High,Low,Close,Volume\n9-Jul-12,23.98,24.04,23.59,23.69,18521684\n6-Jul-12,24.36,24.60,23.62,24.07,25445718\n5-Jul-12,25.52,25.58,25.10,25.24,10870800\n3-Jul-12,25.31,25.65,25.19,25.63,8660914\n2-Jul-12,25.52,25.63,25.12,25.23,14765901\n29-Jun-12,24.43,25.65,24.41,25.63,29073418\n28-Jun-12,24.19,24.26,23.45,23.71,16683939\n27-Jun-12,23.85,24.30,23.75,24.20,11702498\n26-Jun-12,23.85,24.14,23.69,23.95,18806983\n25-Jun-12,24.43,24.45,23.62,23.81,17125220\n22-Jun-12,24.38,24.79,24.16,24.71,16645856\n21-Jun-12,25.36,25.43,24.09,24.18,25266662\n20-Jun-12,25.40,25.45,24.98,25.35,17908511\n19-Jun-12,24.96,25.55,24.86,25.46,23799531\n18-Jun-12,24.51,25.29,24.30,24.68,30867185\n15-Jun-12,24.15,25.00,24.07,24.70,31722497\n14-Jun-12,24.30,24.34,23.68,23.98,24937297\n13-Jun-12,24.51,24.54,24.15,24.30,11987343\n12-Jun-12,24.39,24.58,23.94,24.55,19969159\n11-Jun-12,25.00,25.00,24.31,24.34,15887512\n8-Jun-12,24.61,24.78,24.33,24.64,18363280\n7-Jun-12,24.68,24.79,24.34,24.58,24584111\n6-Jun-12,23.67,24.39,23.57,24.38,20600231\n5-Jun-12,22.82,23.47,22.80,23.38,20977686\n4-Jun-12,23.21,23.45,22.77,22.85,27797787\n1-Jun-12,23.35,23.46,23.12,23.18,20595338\n31-May-12,23.97,24.00,23.53,23.85,20790794\n30-May-12,24.02,24.15,23.87,24.03,20916469\n29-May-12,24.41,24.63,24.13,24.22,26960640\n25-May-12,24.21,24.64,24.19,24.24,28491814\n24-May-12,25.29,25.38,23.94,24.23,72932889\n23-May-12,25.19,25.54,24.79,25.46,27798566\n22-May-12,26.07,26.07,25.44,25.59,21049827\n21-May-12,25.12,25.79,24.89,25.75,16274989\n18-May-12,25.66,25.71,24.84,24.94,21071404\n17-May-12,25.59,25.78,25.43,25.48,15031416\n16-May-12,26.25,26.32,25.55,25.57,18206911\n15-May-12,26.18,26.45,26.01,26.11,13126087\n14-May-12,26.09,26.35,25.89,26.10,13561999\n11-May-12,26.10,26.49,25.88,26.36,24342761\n10-May-12,27.05,27.15,26.04,26.14,31481312\n9-May-12,27.03,27.61,26.83,27.47,13867205\n8-May-12,27.53,27.56,27.01,27.37,13565474\n7-May-12,27.63,27.88,27.49,27.71,8443629\n4-May-12,28.08,28.08,27.67,27.80,11630227\n3-May-12,28.56,28.64,28.14,28.22,10495431\n2-May-12,28.58,28.58,28.32,28.51,10402911\n1-May-12,28.16,28.75,28.11,28.67,14911933\n30-Apr-12,28.23,28.37,28.05,28.21,8657583\n27-Apr-12,28.66,28.66,28.31,28.32,10690428\n26-Apr-12,28.07,28.53,28.07,28.49,15227458\n25-Apr-12,27.83,28.23,27.76,28.17,17789944\n24-Apr-12,27.60,27.78,27.37,27.50,17038466\n23-Apr-12,27.70,27.73,27.34,27.66,16905534\n20-Apr-12,28.21,28.24,27.88,27.90,23264323\n19-Apr-12,28.29,28.63,27.46,28.10,51563561\n18-Apr-12,29.25,29.26,28.93,29.14,14266779\n17-Apr-12,29.04,29.40,28.97,29.33,12780931\n16-Apr-12,29.28,29.38,28.62,28.81,18006675\n13-Apr-12,29.20,29.38,28.83,28.87,14353726\n12-Apr-12,28.68,29.24,27.14,29.20,18340025\n11-Apr-12,28.03,28.64,27.93,28.60,22809842\n10-Apr-12,28.75,29.11,28.24,28.24,18688119\n9-Apr-12,28.43,28.87,28.35,28.64,22376033\n5-Apr-12,29.03,29.25,28.93,28.94,20108897\n4-Apr-12,29.66,29.69,29.03,29.18,17190274\n3-Apr-12,29.72,29.99,29.59,29.85,20611650\n2-Apr-12,29.83,29.93,29.64,29.71,15430458\n30-Mar-12,29.72,29.98,29.50,29.88,17538255\n29-Mar-12,29.32,29.60,29.03,29.58,15944710\n28-Mar-12,29.81,30.00,29.48,29.55,17302504\n27-Mar-12,29.65,29.79,29.52,29.55,13777061\n26-Mar-12,29.37,29.62,29.20,29.61,15070476\n23-Mar-12,29.11,29.20,28.89,29.15,10936511\n22-Mar-12,29.10,29.27,28.87,29.13,14119238\n21-Mar-12,28.96,29.36,28.88,29.19,15937641\n20-Mar-12,28.81,28.95,28.50,28.86,15534098\n19-Mar-12,28.91,29.09,28.75,29.00,15526544\n16-Mar-12,29.11,29.11,28.83,28.89,19895205\n15-Mar-12,29.04,29.13,28.85,29.01,20263887\n14-Mar-12,29.33,29.62,28.97,29.10,25455500\n13-Mar-12,29.14,29.68,29.10,29.62,23253538\n12-Mar-12,28.99,29.10,28.70,29.03,16370931\n9-Mar-12,28.58,29.07,28.50,29.01,23982096\n8-Mar-12,28.37,28.61,28.29,28.52,18767812\n7-Mar-12,27.64,28.12,27.59,28.03,20733344\n6-Mar-12,27.11,27.78,27.07,27.68,28959071\n5-Mar-12,28.30,28.45,27.90,28.12,20585844\n2-Mar-12,28.32,28.74,28.25,28.58,21784980\n1-Mar-12,27.72,28.35,27.72,28.28,23550949\n29-Feb-12,28.05,28.31,27.63,27.69,24973922\n28-Feb-12,27.82,28.13,27.72,27.98,21039064\n27-Feb-12,27.25,27.94,27.22,27.83,22461023\n24-Feb-12,27.46,27.79,27.40,27.52,16491632\n23-Feb-12,26.84,27.36,26.76,27.25,19627598\n22-Feb-12,27.14,27.54,27.04,27.07,16910871\n21-Feb-12,27.13,27.51,27.10,27.25,15990950\n17-Feb-12,27.70,27.70,27.03,27.10,20417101\n16-Feb-12,26.70,27.56,26.66,27.52,33515138\n15-Feb-12,26.39,27.14,26.34,26.66,27604683\n14-Feb-12,26.12,26.40,25.96,26.40,16034413\n13-Feb-12,26.34,26.45,26.19,26.45,13668191\n10-Feb-12,26.00,26.25,25.81,26.20,14990278\n9-Feb-12,26.28,26.43,26.08,26.38,12369805\n8-Feb-12,26.25,26.40,26.07,26.33,13212298\n7-Feb-12,26.21,26.25,25.89,26.15,17082959\n6-Feb-12,26.29,26.40,26.13,26.26,12596632\n3-Feb-12,26.14,26.49,26.09,26.39,15868573\n2-Feb-12,25.84,26.07,25.73,26.01,18758715\n1-Feb-12,25.90,26.09,25.59,25.72,23010833\n31-Jan-12,25.86,25.96,25.58,25.76,15838604\n30-Jan-12,25.50,25.83,25.38,25.75,16603107\n27-Jan-12,25.53,25.92,25.46,25.83,16566003\n26-Jan-12,25.77,25.87,25.41,25.64,25868484\n25-Jan-12,25.06,25.94,25.05,25.69,51021577\n24-Jan-12,24.31,25.17,24.24,25.14,57415530\n23-Jan-12,23.35,23.64,23.16,23.44,27462818\n20-Jan-12,23.30,23.32,23.03,23.25,26963807\n19-Jan-12,22.92,23.26,22.84,23.16,23251691\n18-Jan-12,22.27,22.77,22.22,22.70,25289565\n17-Jan-12,22.42,22.61,22.13,22.22,21102743\n13-Jan-12,22.25,22.25,22.25,22.25,0\n12-Jan-12,22.75,22.80,22.35,22.48,26361603\n11-Jan-12,21.85,22.18,21.77,22.09,19467748\n10-Jan-12,22.25,22.26,21.80,21.88,23500443\n9-Jan-12,22.00,22.10,21.84,21.99,11970428\n6-Jan-12,21.97,22.09,21.74,22.01,18984247\n5-Jan-12,21.67,22.06,21.65,21.90,21065723\n4-Jan-12,21.77,22.01,21.59,21.83,25539410\n3-Jan-12,21.92,22.00,21.65,21.72,27841962\n30-Dec-11,21.54,21.54,21.54,21.54,0\n29-Dec-11,21.49,21.61,21.43,21.59,19267454\n28-Dec-11,21.69,21.87,21.39,21.43,18670901\n27-Dec-11,21.74,21.88,21.61,21.64,17401832\n23-Dec-11,21.83,21.83,21.83,21.83,0\n22-Dec-11,21.69,22.06,21.62,21.70,32956111\n21-Dec-11,22.11,22.14,21.25,21.53,36153196\n20-Dec-11,22.26,22.57,22.25,22.44,21760139\n19-Dec-11,22.43,22.45,21.84,21.95,21678524\n16-Dec-11,22.53,22.64,22.25,22.30,25027887\n15-Dec-11,22.42,22.71,22.06,22.29,21630258\n14-Dec-11,22.55,22.73,22.10,22.18,27074513\n13-Dec-11,23.29,23.40,22.50,22.68,24280889\n12-Dec-11,23.36,23.36,22.90,23.10,18437907\n9-Dec-11,23.25,23.66,23.19,23.55,19283058\n8-Dec-11,23.49,23.51,23.11,23.24,24125653\n7-Dec-11,23.44,23.73,23.19,23.60,18937677\n6-Dec-11,23.57,23.99,23.56,23.58,23140184\n5-Dec-11,23.56,23.87,23.43,23.56,14437053\n2-Dec-11,23.46,23.64,23.25,23.26,13970571\n1-Dec-11,22.82,23.33,22.80,23.17,15643285\n30-Nov-11,23.03,23.31,22.91,23.01,25897742\n29-Nov-11,22.67,23.63,22.31,22.39,37378229\n28-Nov-11,22.43,22.74,22.31,22.54,19838427\n25-Nov-11,21.91,22.13,21.81,21.88,7967039\n23-Nov-11,22.06,22.06,22.06,22.06,0\n22-Nov-11,22.59,22.69,22.22,22.47,24895560\n21-Nov-11,22.72,22.86,22.48,22.74,16888723\n18-Nov-11,23.45,23.48,22.95,23.07,18167047\n17-Nov-11,23.92,23.98,22.88,23.37,34286230\n16-Nov-11,24.23,24.61,24.11,24.21,13610440\n15-Nov-11,24.27,24.73,24.25,24.55,8813260\n14-Nov-11,24.55,24.88,24.42,24.46,10296584\n11-Nov-11,24.42,24.89,24.31,24.64,15796137\n10-Nov-11,24.37,24.45,23.85,24.06,19411859\n9-Nov-11,24.46,24.50,23.94,24.08,18922912\n8-Nov-11,24.72,25.06,24.51,24.97,19659361\n7-Nov-11,24.59,24.66,24.24,24.60,12739860\n4-Nov-11,24.72,24.87,24.43,24.67,20561945\n3-Nov-11,24.56,25.09,24.26,25.00,19149507\n2-Nov-11,24.07,24.50,23.95,24.31,26156969\n1-Nov-11,23.83,24.13,23.58,23.78,27264435\n31-Oct-11,24.47,24.77,24.45,24.51,20587457\n28-Oct-11,24.73,25.07,24.71,25.03,17984093\n27-Oct-11,24.50,25.13,24.37,25.04,31220962\n26-Oct-11,24.10,24.15,23.46,23.79,22505187\n25-Oct-11,24.17,24.28,23.80,23.87,18760022\n24-Oct-11,24.01,24.47,23.88,24.32,17926337\n21-Oct-11,24.07,24.37,23.84,24.03,22975711\n20-Oct-11,23.63,23.94,23.37,23.81,20475264\n19-Oct-11,23.68,24.34,23.59,23.72,26799186\n18-Oct-11,23.61,24.26,23.22,23.99,52336811\n17-Oct-11,22.98,23.09,22.47,22.68,22154099\n14-Oct-11,23.11,23.44,23.00,23.09,24263806\n13-Oct-11,22.68,23.05,22.56,22.72,19582714\n12-Oct-11,23.28,23.35,22.85,22.85,21978362\n11-Oct-11,22.70,23.19,22.61,23.04,16607907\n10-Oct-11,22.70,23.04,22.60,22.90,16419810\n7-Oct-11,22.37,22.85,22.24,22.39,24103997\n6-Oct-11,21.63,22.44,21.61,22.32,23374578\n5-Oct-11,21.03,21.74,20.93,21.61,23014301\n4-Oct-11,20.05,21.00,19.99,20.94,32202271\n3-Oct-11,20.68,21.03,20.36,20.37,30283324\n30-Sep-11,21.06,21.62,20.87,20.99,19859831\n29-Sep-11,21.79,22.09,20.96,21.33,20701985\n28-Sep-11,21.67,21.92,21.28,21.33,19731023\n27-Sep-11,21.86,22.35,21.46,21.58,22356989\n26-Sep-11,20.79,21.34,20.71,21.30,23349271\n23-Sep-11,20.25,21.03,20.20,20.62,23985849\n22-Sep-11,20.06,20.64,20.06,20.51,37059805\n21-Sep-11,21.87,22.01,21.31,21.34,24597965\n20-Sep-11,22.55,22.62,21.80,21.81,25816346\n19-Sep-11,22.21,22.60,22.06,22.50,16387243\n16-Sep-11,22.97,22.99,22.47,22.76,18478510\n15-Sep-11,22.33,22.75,22.15,22.69,22751882\n14-Sep-11,22.11,22.41,21.71,22.03,25104835\n13-Sep-11,21.64,22.11,21.53,21.87,22248826\n12-Sep-11,20.99,21.66,20.94,21.63,16283737\n9-Sep-11,21.53,21.82,21.12,21.29,18525118\n8-Sep-11,22.03,22.31,21.56,21.76,23271530\n7-Sep-11,21.81,22.20,21.67,22.12,17893846\n6-Sep-11,20.68,21.48,20.59,21.41,20200075\n2-Sep-11,21.60,21.72,21.22,21.43,17099954\n1-Sep-11,22.56,22.99,22.05,22.11,20063489\n31-Aug-11,22.35,22.97,22.32,22.59,31163844\n30-Aug-11,22.13,22.27,21.70,21.99,26988589\n29-Aug-11,21.85,22.27,21.81,22.23,18047575\n26-Aug-11,20.85,21.69,20.62,21.61,20711453\n25-Aug-11,21.56,21.99,21.02,21.10,24330235\n24-Aug-11,21.20,21.43,20.93,21.43,19353728\n23-Aug-11,20.76,21.22,20.32,21.21,33627624\n22-Aug-11,20.86,20.95,20.49,20.63,27939040\n19-Aug-11,20.27,20.88,20.21,20.28,26381060\n18-Aug-11,20.74,20.97,19.84,20.59,76848496\n17-Aug-11,23.09,23.12,22.27,22.51,28478196\n16-Aug-11,23.14,23.27,22.65,23.00,17420830\n15-Aug-11,23.29,23.50,23.02,23.34,15364361\n12-Aug-11,22.84,23.55,22.69,23.14,29310006\n11-Aug-11,21.82,22.93,21.76,22.66,39299577\n10-Aug-11,22.13,22.25,21.50,21.59,46571702\n9-Aug-11,22.30,22.57,21.40,22.56,46501428\n8-Aug-11,22.20,22.81,21.79,22.00,51108040\n5-Aug-11,23.46,23.56,22.11,22.99,66307205\n4-Aug-11,24.71,24.77,23.44,23.54,46650668\n3-Aug-11,25.10,25.15,24.42,25.04,47338557\n2-Aug-11,25.89,25.91,25.06,25.08,26789359\n1-Aug-11,26.42,26.50,25.66,26.10,19712716\n29-Jul-11,26.20,26.44,25.87,26.08,22496125\n28-Jul-11,26.54,27.03,26.38,26.59,25741629\n27-Jul-11,27.24,27.25,26.51,26.60,16752967\n26-Jul-11,27.41,27.59,27.04,27.44,12628802\n25-Jul-11,27.44,27.75,27.31,27.45,10270443\n22-Jul-11,27.32,28.01,27.27,27.76,13850922\n21-Jul-11,27.36,27.69,27.13,27.34,18500493\n20-Jul-11,28.10,28.25,27.14,27.37,25520641\n19-Jul-11,26.97,27.49,26.95,27.38,17233186\n18-Jul-11,26.65,26.80,26.43,26.64,12684276\n15-Jul-11,26.94,27.05,26.55,26.81,19123579\n14-Jul-11,27.15,27.49,26.68,26.82,14635962\n13-Jul-11,27.09,27.40,26.96,27.00,14309360\n12-Jul-11,27.08,27.28,26.91,26.93,16941073\n11-Jul-11,27.54,27.72,27.07,27.21,13539273\n8-Jul-11,27.59,27.87,27.38,27.87,10112179\n7-Jul-11,28.03,28.24,27.85,27.89,13731055\n6-Jul-11,27.92,27.95,27.52,27.84,15717220\n5-Jul-11,27.72,27.94,27.56,27.88,11441709\n1-Jul-11,27.83,27.83,27.83,27.83,0\n30-Jun-11,27.22,27.74,27.14,27.55,21006569\n29-Jun-11,27.02,27.17,26.95,27.10,16353092\n28-Jun-11,26.56,27.17,26.49,26.87,20040130\n27-Jun-11,25.49,26.83,25.39,26.50,25237099\n24-Jun-11,26.44,26.53,25.56,25.64,22475341\n23-Jun-11,26.15,26.62,25.77,26.59,26020343\n22-Jun-11,26.51,26.74,26.44,26.44,12507658\n21-Jun-11,26.21,27.01,26.11,26.65,20699147\n20-Jun-11,25.72,26.18,25.58,26.03,13089895\n17-Jun-11,26.27,26.27,25.79,25.83,22050838\n16-Jun-11,26.45,26.71,25.92,26.05,28029327\n15-Jun-11,26.71,27.07,26.40,26.49,15810079\n14-Jun-11,26.60,27.33,26.52,27.09,17943384\n13-Jun-11,26.37,26.47,26.07,26.26,23456301\n10-Jun-11,26.84,26.90,26.26,26.32,16275621\n9-Jun-11,27.07,27.08,26.75,26.91,12653212\n8-Jun-11,26.85,27.06,26.55,26.99,17063743\n7-Jun-11,27.35,27.43,26.97,27.06,18511823\n6-Jun-11,27.79,27.88,27.22,27.32,15865058\n3-Jun-11,28.01,28.25,27.84,27.93,17235667\n2-Jun-11,28.10,28.40,27.98,28.36,15048965\n1-Jun-11,28.23,28.57,28.06,28.06,18551623\n31-May-11,28.54,28.60,28.10,28.47,14680155\n27-May-11,28.43,28.43,28.43,28.43,0\n26-May-11,27.56,28.31,27.49,28.21,24174423\n25-May-11,27.23,27.77,27.18,27.59,9849664\n24-May-11,27.48,27.58,27.25,27.32,14988851\n23-May-11,27.69,27.76,27.28,27.44,21133902\n20-May-11,27.87,28.15,27.87,28.06,14464992\n19-May-11,27.87,28.09,27.77,27.99,13744469\n18-May-11,27.42,27.92,27.37,27.76,10725118\n17-May-11,27.28,27.50,27.15,27.42,16397335\n16-May-11,27.41,27.62,27.30,27.42,17439605\n13-May-11,27.75,28.02,27.56,27.60,17939296\n12-May-11,27.25,27.81,27.13,27.73,13843465\n11-May-11,27.41,27.51,26.95,27.30,14195407\n10-May-11,27.40,27.56,27.19,27.44,21188428\n9-May-11,27.30,27.37,27.05,27.15,20566608\n6-May-11,27.25,27.63,27.10,27.12,15509381\n5-May-11,27.14,27.37,26.78,27.00,28887711\n4-May-11,27.93,27.99,27.20,27.37,21988471\n3-May-11,28.08,28.11,27.53,27.99,19680124\n2-May-11,28.64,28.70,28.08,28.11,25801681\n29-Apr-11,28.27,28.50,28.15,28.34,10445817\n28-Apr-11,27.98,28.36,27.95,28.32,10817646\n27-Apr-11,28.41,28.46,27.81,28.15,20706745\n26-Apr-11,28.38,28.46,28.06,28.32,13642717\n25-Apr-11,28.26,28.42,28.06,28.29,15112883\n21-Apr-11,28.45,28.45,28.45,28.45,0\n20-Apr-11,27.10,28.32,27.00,27.96,48970088\n19-Apr-11,26.57,26.81,26.31,26.72,18753438\n18-Apr-11,26.39,26.65,26.21,26.55,22331514\n15-Apr-11,26.73,27.02,26.63,26.91,24798741\n14-Apr-11,26.67,26.89,26.50,26.63,22830802\n13-Apr-11,26.04,26.80,25.92,26.69,25667102\n12-Apr-11,26.12,26.23,25.59,25.85,19275700\n11-Apr-11,26.04,26.39,26.00,26.38,15966943\n8-Apr-11,26.47,26.49,26.00,26.13,13184681\n7-Apr-11,26.19,26.33,25.94,26.23,21378831\n6-Apr-11,26.05,26.16,25.79,26.09,13279334\n5-Apr-11,26.07,26.21,25.82,25.93,14710946\n4-Apr-11,26.64,26.64,25.85,26.02,20309725\n1-Apr-11,26.94,26.94,26.36,26.55,17739237\n31-Mar-11,26.58,26.91,26.52,26.56,21486282\n30-Mar-11,27.53,27.53,26.73,26.93,28006308\n29-Mar-11,27.15,27.36,27.02,27.28,12811404\n28-Mar-11,27.43,27.59,27.19,27.20,17173745\n25-Mar-11,27.25,27.40,27.05,27.33,19293648\n24-Mar-11,26.81,27.11,26.65,27.05,17143919\n23-Mar-11,26.25,26.64,26.20,26.48,12646128\n22-Mar-11,26.58,26.70,26.31,26.36,17609868\n21-Mar-11,26.43,26.79,26.10,26.58,22050847\n18-Mar-11,25.91,26.04,25.51,25.63,22817162\n17-Mar-11,25.84,25.99,25.44,25.56,22581474\n16-Mar-11,25.79,26.02,25.23,25.31,32762314\n15-Mar-11,25.25,26.10,25.00,25.99,27730328\n14-Mar-11,26.31,26.53,25.92,26.21,18205334\n11-Mar-11,25.96,26.71,25.91,26.59,19016474\n10-Mar-11,26.34,26.47,25.95,26.17,20811347\n9-Mar-11,26.88,26.90,26.55,26.76,16898987\n8-Mar-11,26.75,26.98,26.50,26.86,20692444\n7-Mar-11,27.30,27.43,26.61,26.79,23112513\n4-Mar-11,27.38,27.47,27.08,27.32,21999445\n3-Mar-11,26.94,27.40,26.87,27.35,25412936\n2-Mar-11,26.49,27.16,26.39,26.69,29022207\n1-Mar-11,27.34,27.34,26.46,26.58,22343388\n28-Feb-11,26.91,27.31,26.90,27.21,22741469\n25-Feb-11,26.72,26.97,26.62,26.90,15112437\n24-Feb-11,26.17,26.66,26.00,26.55,20773691\n23-Feb-11,26.34,26.45,25.84,26.33,29929210\n22-Feb-11,26.74,26.86,26.35,26.58,23991647\n18-Feb-11,27.18,27.18,27.18,27.18,0\n17-Feb-11,26.91,27.28,26.80,27.22,16354223\n16-Feb-11,27.05,27.25,26.86,27.12,18302503\n15-Feb-11,27.22,27.38,26.77,26.91,22302382\n14-Feb-11,27.05,27.30,27.03,27.27,24657203\n11-Feb-11,27.07,27.23,26.82,27.04,16441528\n10-Feb-11,26.67,27.22,26.47,27.19,45822773\n9-Feb-11,26.08,27.10,26.08,27.08,47117039\n8-Feb-11,26.05,26.30,25.97,26.16,27195552\n7-Feb-11,25.93,26.09,25.78,26.00,33681239\n4-Feb-11,25.60,25.69,25.38,25.69,22246101\n3-Feb-11,25.16,25.57,25.16,25.49,21654065\n2-Feb-11,25.16,25.60,25.06,25.47,21879995\n1-Feb-11,24.98,25.43,24.98,25.24,23851614\n31-Jan-11,24.32,24.90,24.30,24.89,21025172\n28-Jan-11,24.94,25.05,24.42,24.48,23076513\n27-Jan-11,24.73,25.03,24.65,24.96,26226895\n26-Jan-11,24.41,24.86,24.32,24.73,35866916\n25-Jan-11,23.69,24.39,23.37,24.39,52258616\n24-Jan-11,23.90,23.97,23.46,23.83,31716531\n21-Jan-11,24.15,24.19,23.93,23.98,25178153\n20-Jan-11,23.88,23.89,23.47,23.84,31984898\n19-Jan-11,24.74,24.80,24.12,24.24,22799385\n18-Jan-11,24.68,24.95,24.48,24.71,26463621\n14-Jan-11,24.54,24.54,24.54,24.54,0\n13-Jan-11,23.67,24.17,23.57,23.98,37469864\n12-Jan-11,23.88,23.88,23.45,23.45,25770145\n11-Jan-11,23.82,23.84,23.57,23.74,12428320\n10-Jan-11,23.29,23.85,23.28,23.72,20974190\n7-Jan-11,23.61,23.69,23.20,23.47,21694939\n6-Jan-11,23.45,23.73,23.32,23.67,33899376\n5-Jan-11,23.00,23.62,22.93,23.43,18339414\n4-Jan-11,23.12,23.28,22.84,23.10,14136651\n3-Jan-11,22.90,23.43,22.90,23.11,18508094\n31-Dec-10,22.90,22.99,22.73,22.90,7103919\n30-Dec-10,22.90,23.05,22.85,22.90,9343285\n29-Dec-10,23.01,23.09,22.88,22.93,7684385\n28-Dec-10,23.12,23.19,22.95,23.00,6851661\n27-Dec-10,22.88,23.20,22.85,23.09,8233201\n23-Dec-10,23.02,23.02,23.02,23.02,0\n22-Dec-10,22.91,23.00,22.78,22.89,9923398\n21-Dec-10,22.94,23.00,22.80,22.93,10937103\n20-Dec-10,22.92,22.99,22.63,22.81,11827948\n17-Dec-10,22.73,23.11,22.62,22.96,29881295\n16-Dec-10,22.65,22.80,22.44,22.73,12152262\n15-Dec-10,22.67,22.80,22.50,22.54,16392382\n14-Dec-10,22.53,22.78,22.47,22.66,16936638\n13-Dec-10,22.53,22.89,22.42,22.49,29392170\n10-Dec-10,22.07,22.30,21.89,22.25,12939484\n9-Dec-10,22.14,22.19,21.93,22.11,12965690\n8-Dec-10,21.93,22.08,21.74,22.07,13129424\n7-Dec-10,22.19,22.22,21.84,21.89,13842856\n6-Dec-10,21.97,22.11,21.79,21.99,13938795\n3-Dec-10,21.78,22.20,21.77,22.13,11370889\n2-Dec-10,21.76,22.10,21.74,22.02,19926599\n1-Dec-10,21.73,22.07,21.73,21.90,18018943\n30-Nov-10,21.39,21.69,21.26,21.49,16379471\n29-Nov-10,21.65,21.75,21.34,21.66,14095892\n26-Nov-10,21.69,21.86,21.60,21.70,5200149\n24-Nov-10,21.86,21.86,21.86,21.86,0\n23-Nov-10,21.50,21.80,21.20,21.33,18468280\n22-Nov-10,21.68,21.85,21.51,21.68,17744160\n19-Nov-10,21.59,21.96,21.54,21.82,22283649\n18-Nov-10,21.25,21.69,21.20,21.51,26460871\n17-Nov-10,20.93,21.38,20.54,20.84,41888419\n16-Nov-10,21.26,21.41,20.71,21.03,23419932\n15-Nov-10,21.69,21.81,21.41,21.45,18642953\n12-Nov-10,21.81,22.10,21.52,21.72,22333799\n11-Nov-10,21.69,21.99,21.40,21.89,28655739\n10-Nov-10,21.98,22.26,21.75,22.14,21476656\n9-Nov-10,21.96,22.35,21.85,22.02,25957607\n8-Nov-10,21.45,21.99,21.39,21.88,21498519\n5-Nov-10,21.69,21.69,21.43,21.57,21311337\n4-Nov-10,21.62,21.82,21.50,21.66,24866716\n3-Nov-10,21.42,21.53,21.18,21.46,13367563\n2-Nov-10,21.49,21.62,21.35,21.35,12812612\n1-Nov-10,21.08,21.50,21.08,21.29,15192277\n29-Oct-10,20.90,21.19,20.86,21.02,14608171\n28-Oct-10,21.34,21.36,20.89,20.98,15125660\n27-Oct-10,21.04,21.34,20.95,21.15,18842629\n26-Oct-10,21.16,21.22,20.94,21.18,17895765\n25-Oct-10,21.25,21.53,21.21,21.28,16979753\n22-Oct-10,21.27,21.58,21.04,21.44,15651929\n21-Oct-10,21.33,21.62,21.21,21.36,23692334\n20-Oct-10,21.00,21.33,20.92,21.19,26585850\n19-Oct-10,20.65,21.18,20.49,20.83,54266554\n18-Oct-10,21.08,21.11,20.49,20.80,31972771\n15-Oct-10,21.35,21.38,20.86,21.09,33987362\n14-Oct-10,20.94,21.58,20.75,21.21,97424171\n13-Oct-10,20.32,20.54,20.30,20.30,27745123\n12-Oct-10,19.92,20.31,19.81,20.20,19043726\n11-Oct-10,20.01,20.38,19.99,20.06,23515187\n8-Oct-10,19.72,19.97,19.42,19.87,17960008\n7-Oct-10,19.84,19.86,19.39,19.61,30249781\n6-Oct-10,20.40,20.47,19.55,19.70,37999064\n5-Oct-10,20.16,20.46,20.15,20.41,23211303\n4-Oct-10,20.27,20.36,19.77,20.01,25838179\n1-Oct-10,20.48,20.48,20.13,20.34,29084236\n30-Sep-10,20.55,20.78,20.06,20.31,46421383\n29-Sep-10,20.79,20.90,20.61,20.67,47545472\n28-Sep-10,21.49,21.60,21.16,21.18,35935366\n27-Sep-10,21.71,21.77,21.46,21.50,27303272\n24-Sep-10,20.97,21.83,20.96,21.64,44108268\n23-Sep-10,20.57,20.98,20.49,20.80,30401841\n22-Sep-10,20.52,20.78,20.41,20.76,27296178\n21-Sep-10,20.85,20.85,20.51,20.71,17633310\n20-Sep-10,20.60,20.90,20.50,20.81,14427424\n17-Sep-10,20.71,20.75,20.41,20.57,20621751\n16-Sep-10,20.61,20.72,20.43,20.56,16903850\n15-Sep-10,20.48,20.76,20.42,20.67,23458125\n14-Sep-10,20.28,20.94,20.20,20.58,27162999\n13-Sep-10,20.12,20.46,20.12,20.40,21274862\n10-Sep-10,19.94,20.05,19.76,19.98,14025969\n9-Sep-10,20.25,20.34,19.90,19.92,19171938\n8-Sep-10,19.78,20.17,19.64,20.09,22865493\n7-Sep-10,19.82,19.94,19.65,19.73,12891921\n6-Sep-10,19.91,19.91,19.91,19.91,0\n3-Sep-10,19.91,19.91,19.91,19.91,0\n2-Sep-10,19.14,19.62,19.14,19.57,23689167\n1-Sep-10,18.43,19.23,18.41,19.15,31432754\n31-Aug-10,18.30,18.46,18.06,18.24,26541433\n30-Aug-10,18.41,18.68,18.35,18.38,18979836\n27-Aug-10,18.12,18.47,17.99,18.37,18606003\n26-Aug-10,18.17,18.40,17.99,18.05,17438235\n25-Aug-10,18.01,18.22,17.90,18.12,21254924\n24-Aug-10,18.18,18.36,18.10,18.12,23214380\n23-Aug-10,18.80,18.96,18.52,18.53,19645825\n20-Aug-10,18.48,18.76,18.43,18.69,26550750\n19-Aug-10,18.67,18.87,18.40,18.55,33756078\n18-Aug-10,18.93,18.99,18.67,18.94,21294733\n17-Aug-10,18.96,19.08,18.69,18.92,28652991\n16-Aug-10,18.51,18.87,18.35,18.77,19732113\n13-Aug-10,18.72,18.95,18.64,18.76,25134099\n12-Aug-10,19.10,19.22,18.48,18.69,57102301\n11-Aug-10,19.82,19.84,19.50,19.66,25963879\n10-Aug-10,20.24,20.33,19.99,20.15,27705563\n9-Aug-10,20.33,20.51,20.19,20.47,18272535\n6-Aug-10,20.50,20.71,19.95,20.24,38089091\n5-Aug-10,20.65,20.81,20.51,20.70,14560295\n4-Aug-10,20.52,20.97,20.45,20.82,24350777\n3-Aug-10,20.37,20.56,20.31,20.47,19029421\n2-Aug-10,20.05,20.53,20.05,20.41,25342092\n30-Jul-10,19.72,20.00,19.67,19.79,20142328\n29-Jul-10,20.21,20.28,19.70,19.92,24424159\n28-Jul-10,20.20,20.35,19.95,20.09,14183656\n27-Jul-10,20.45,20.53,20.16,20.29,19430671\n26-Jul-10,20.17,20.39,20.09,20.35,18762913\n23-Jul-10,19.77,20.32,19.77,20.21,31065618\n22-Jul-10,19.67,19.99,19.46,19.87,34644140\n21-Jul-10,19.85,19.89,19.30,19.48,57460947\n20-Jul-10,20.01,20.26,19.61,20.24,50702873\n19-Jul-10,20.23,20.59,20.16,20.46,22784571\n16-Jul-10,20.48,20.49,20.05,20.15,35471388\n15-Jul-10,20.49,20.65,20.32,20.58,36840599\n14-Jul-10,19.98,20.65,19.95,20.51,41122572\n13-Jul-10,19.82,20.00,19.67,19.99,24906457\n12-Jul-10,19.42,19.75,19.36,19.66,20465459\n9-Jul-10,19.27,19.50,19.26,19.45,15809954\n8-Jul-10,19.27,19.39,19.08,19.37,22983793\n7-Jul-10,18.38,19.14,18.28,19.11,32794281\n6-Jul-10,18.27,18.48,17.98,18.16,20960944\n5-Jul-10,18.04,18.04,18.04,18.04,0\n2-Jul-10,18.04,18.04,18.04,18.04,0\n1-Jul-10,18.27,18.35,17.87,18.18,34802847\n30-Jun-10,18.55,18.82,18.23,18.30,30297226\n29-Jun-10,18.75,18.85,18.45,18.59,33595763\n28-Jun-10,19.19,19.28,18.97,19.07,21616927\n25-Jun-10,18.83,19.34,18.65,19.24,54946585\n24-Jun-10,19.00,19.08,18.53,18.65,30250678\n23-Jun-10,19.08,19.28,18.99,19.10,20255589\n22-Jun-10,19.28,19.48,18.98,19.05,21700678\n21-Jun-10,19.53,19.65,19.12,19.24,17154453\n18-Jun-10,19.37,19.45,19.28,19.35,16374163\n17-Jun-10,19.36,19.40,19.12,19.35,20712343\n16-Jun-10,19.03,19.25,18.93,19.21,20740432\n15-Jun-10,18.78,19.16,18.74,19.14,22308789\n14-Jun-10,18.82,18.86,18.54,18.57,13912362\n11-Jun-10,18.32,18.68,18.27,18.67,12904597\n10-Jun-10,18.16,18.56,18.12,18.54,20521554\n9-Jun-10,18.04,18.30,17.79,17.88,18447136\n8-Jun-10,18.01,18.10,17.72,18.05,22003517\n7-Jun-10,18.44,18.58,17.99,18.03,22155343\n4-Jun-10,18.68,18.91,18.30,18.38,20523358\n3-Jun-10,18.75,19.12,18.61,19.06,23733467\n2-Jun-10,18.60,18.69,18.38,18.69,23764426\n1-Jun-10,18.46,18.84,18.35,18.49,26994499\n31-May-10,18.62,18.62,18.62,18.62,0\n28-May-10,18.62,18.62,18.62,18.62,0\n27-May-10,18.32,18.78,18.24,18.78,32744560\n26-May-10,18.02,18.35,17.73,17.79,27609132\n25-May-10,17.31,17.88,17.26,17.85,39330041\n24-May-10,18.02,18.34,17.92,18.06,26341811\n21-May-10,17.12,17.99,17.11,17.96,37805694\n20-May-10,17.80,18.00,17.55,17.68,26420564\n19-May-10,18.22,18.43,17.96,18.20,24478128\n18-May-10,18.69,18.85,18.24,18.38,23902059\n17-May-10,18.57,18.85,18.36,18.67,21086314\n14-May-10,18.68,18.74,18.28,18.57,23411830\n13-May-10,19.04,19.22,18.79,18.84,21546910\n12-May-10,18.81,19.12,18.68,19.08,25062744\n11-May-10,18.56,19.09,18.48,18.75,22349064\n10-May-10,18.69,18.93,18.58,18.76,32971379\n7-May-10,18.46,18.62,17.66,18.08,39411224\n6-May-10,19.00,19.20,17.10,18.57,41426445\n5-May-10,18.76,19.13,18.69,19.07,28904029\n4-May-10,19.20,19.20,18.80,19.00,24276015\n3-May-10,19.08,19.57,19.05,19.44,24010785\n30-Apr-10,19.62,19.63,18.99,19.01,29625144\n29-Apr-10,19.65,19.74,19.47,19.63,20786495\n28-Apr-10,19.48,19.58,19.21,19.55,21754304\n27-Apr-10,19.90,19.95,19.31,19.35,27155107\n26-Apr-10,19.90,20.00,19.90,19.98,14686674\n23-Apr-10,19.80,19.98,19.63,19.98,19264982\n22-Apr-10,19.62,19.88,19.51,19.84,23098858\n21-Apr-10,19.85,19.95,19.53,19.85,37637617\n20-Apr-10,19.35,19.50,19.24,19.41,18795446\n19-Apr-10,19.27,19.31,18.91,19.25,21655148\n16-Apr-10,19.28,19.55,19.15,19.36,37003210\n15-Apr-10,19.29,19.40,19.20,19.35,18011537\n14-Apr-10,19.04,19.28,19.01,19.27,20674763\n13-Apr-10,19.11,19.17,18.92,19.02,23231054\n12-Apr-10,18.71,19.26,18.68,19.17,38654886\n9-Apr-10,18.47,18.56,18.38,18.54,12181659\n8-Apr-10,18.25,18.48,18.10,18.40,25825092\n7-Apr-10,18.80,18.85,18.50,18.53,21172414\n6-Apr-10,18.55,18.77,18.44,18.70,16208409\n5-Apr-10,18.31,18.71,18.27,18.62,20064695\n2-Apr-10,18.18,18.18,18.18,18.18,0\n1-Apr-10,18.18,18.18,18.18,18.18,0\n31-Mar-10,18.00,18.18,17.97,18.04,16775923\n30-Mar-10,18.12,18.20,17.80,18.04,29224607\n29-Mar-10,18.60,18.69,17.87,18.06,44224948\n26-Mar-10,18.76,18.89,18.48,18.56,17411465\n25-Mar-10,18.97,19.04,18.72,18.73,18714541\n24-Mar-10,18.84,18.98,18.72,18.82,18005481\n23-Mar-10,18.74,18.98,18.54,18.94,28023996\n22-Mar-10,18.40,18.88,18.38,18.83,16530992\n19-Mar-10,18.71,18.83,18.50,18.61,20158646\n18-Mar-10,18.61,18.80,18.56,18.64,17704407\n17-Mar-10,18.73,18.82,18.62,18.70,20422184\n16-Mar-10,18.80,18.82,18.69,18.78,18249038\n15-Mar-10,18.76,18.86,18.65,18.82,18127053\n12-Mar-10,18.94,18.94,18.71,18.88,14558944\n11-Mar-10,18.59,18.81,18.54,18.80,16630134\n10-Mar-10,18.55,18.92,18.50,18.72,23986302\n9-Mar-10,18.36,18.73,18.28,18.54,30508423\n8-Mar-10,17.90,18.46,17.87,18.42,42152404\n5-Mar-10,17.58,17.95,17.48,17.87,19906954\n4-Mar-10,17.57,17.58,17.31,17.47,14866171\n3-Mar-10,17.70,17.83,17.47,17.55,15981901\n2-Mar-10,17.72,17.93,17.62,17.65,22095497\n1-Mar-10,17.48,17.75,17.48,17.75,16544984\n26-Feb-10,17.28,17.57,17.17,17.49,16948509\n25-Feb-10,17.06,17.34,16.92,17.32,21653038\n24-Feb-10,17.30,17.49,17.24,17.39,15902544\n23-Feb-10,17.64,17.68,17.12,17.25,20990369\n22-Feb-10,17.89,17.89,17.61,17.71,12624099\n19-Feb-10,17.60,17.91,17.60,17.81,13031433\n18-Feb-10,17.35,17.79,17.35,17.74,17926476\n17-Feb-10,17.46,17.49,17.32,17.40,12586646\n16-Feb-10,17.21,17.43,17.15,17.43,13432533\n15-Feb-10,17.12,17.12,17.12,17.12,0\n12-Feb-10,17.12,17.12,17.12,17.12,0\n11-Feb-10,16.70,17.19,16.66,17.13,24280130\n10-Feb-10,16.95,16.95,16.63,16.76,17007260\n9-Feb-10,16.99,17.12,16.86,16.95,21683373\n8-Feb-10,16.79,17.06,16.68,16.84,24040365\n5-Feb-10,16.63,16.86,16.45,16.82,30926208\n4-Feb-10,16.92,16.96,16.60,16.63,26623714\n3-Feb-10,16.99,17.14,16.87,17.06,20312891\n2-Feb-10,17.04,17.17,16.80,17.09,23472560\n1-Feb-10,16.67,17.06,16.60,17.04,28384493\n29-Jan-10,17.21,17.23,16.56,16.67,33460958\n28-Jan-10,17.56,17.63,16.89,17.04,37796425\n27-Jan-10,17.55,17.66,17.27,17.58,37540868\n26-Jan-10,17.50,17.79,17.06,17.61,64876801\n25-Jan-10,17.01,17.07,16.78,16.94,29909142\n22-Jan-10,17.64,17.64,16.74,16.76,40470160\n21-Jan-10,17.95,18.00,17.37,17.53,41416933\n20-Jan-10,17.97,18.02,17.70,17.78,30120159\n19-Jan-10,17.92,18.24,17.86,18.09,29275097\n18-Jan-10,17.94,17.94,17.94,17.94,0\n15-Jan-10,17.94,17.94,17.94,17.94,0\n14-Jan-10,17.62,18.21,17.61,18.17,43084189\n13-Jan-10,17.49,17.70,17.35,17.60,19502825\n12-Jan-10,17.51,17.73,17.31,17.47,23841714\n11-Jan-10,17.76,17.80,17.26,17.51,20380138\n8-Jan-10,17.63,17.71,17.48,17.66,22145930\n7-Jan-10,17.77,17.89,17.47,17.56,22985556\n6-Jan-10,18.07,18.15,17.64,17.86,25964334\n5-Jan-10,17.97,18.10,17.84,18.06,19429639\n4-Jan-10,17.72,17.98,17.64,17.90,28138897\n1-Jan-10,17.47,17.47,17.47,17.47,0\n31-Dec-09,17.47,17.47,17.47,17.47,0\n30-Dec-09,17.46,17.70,17.40,17.67,8672929\n29-Dec-09,17.55,17.64,17.43,17.50,7686677\n28-Dec-09,17.82,17.85,17.52,17.60,13719742\n25-Dec-09,17.85,17.85,17.85,17.85,0\n24-Dec-09,17.58,17.88,17.56,17.85,7688328\n23-Dec-09,17.52,17.66,17.43,17.58,9199097\n22-Dec-09,17.54,17.60,17.39,17.49,11906861\n21-Dec-09,17.37,17.70,17.36,17.47,28843067\n18-Dec-09,17.21,17.36,17.01,17.34,36073812\n17-Dec-09,16.80,16.96,16.68,16.87,17751962\n16-Dec-09,16.73,17.06,16.60,16.91,18818730\n15-Dec-09,16.56,16.78,16.44,16.67,14962699\n14-Dec-09,16.76,16.76,16.54,16.63,19061773\n11-Dec-09,16.63,16.75,16.55,16.65,17105335\n10-Dec-09,16.87,16.96,16.51,16.58,23330734\n9-Dec-09,16.71,16.91,16.55,16.89,17715414\n8-Dec-09,16.77,16.81,16.60,16.67,20186681\n7-Dec-09,17.04,17.13,16.86,16.90,20407658\n4-Dec-09,16.78,17.16,16.69,17.13,39440501\n3-Dec-09,16.84,17.06,16.62,16.64,28735151\n2-Dec-09,17.05,17.10,16.68,16.74,23304089\n1-Dec-09,16.88,17.22,16.88,16.98,22341239\n30-Nov-09,16.64,16.84,16.57,16.83,11414259\n27-Nov-09,16.40,16.82,16.31,16.75,6419950\n26-Nov-09,16.91,16.91,16.91,16.91,0\n25-Nov-09,16.85,16.98,16.80,16.91,13181070\n24-Nov-09,17.11,17.14,16.89,16.94,11757761\n23-Nov-09,17.20,17.38,17.01,17.14,11764642\n20-Nov-09,17.08,17.15,16.79,17.04,16351250\n19-Nov-09,17.32,17.46,17.02,17.17,15390705\n18-Nov-09,17.14,17.50,17.06,17.38,22949992\n17-Nov-09,17.19,17.30,16.89,17.24,29508561\n16-Nov-09,16.95,17.25,16.95,17.24,18707178\n13-Nov-09,16.70,16.99,16.64,16.88,13024644\n12-Nov-09,16.93,17.05,16.67,16.75,24513295\n11-Nov-09,17.20,17.31,16.95,16.99,20008145\n10-Nov-09,17.11,17.24,16.97,17.05,22068388\n9-Nov-09,17.02,17.09,16.88,17.01,24131225\n6-Nov-09,16.70,16.84,16.52,16.73,17676656\n5-Nov-09,16.70,16.96,16.68,16.81,34149124\n4-Nov-09,16.63,16.76,16.32,16.52,17409839\n3-Nov-09,16.34,16.60,16.12,16.55,19455540\n2-Nov-09,16.49,16.72,16.22,16.43,24685546\n30-Oct-09,16.82,16.97,16.45,16.47,28455915\n29-Oct-09,16.61,16.92,16.45,16.92,23035263\n28-Oct-09,16.70,16.80,16.38,16.45,37288872\n27-Oct-09,17.30,17.39,16.79,16.81,23758202\n26-Oct-09,17.48,17.75,17.22,17.28,23271476\n23-Oct-09,17.24,17.54,17.15,17.49,26443975\n22-Oct-09,17.33,17.43,16.82,17.33,38962041\n21-Oct-09,17.69,17.91,17.48,17.51,29590486\n20-Oct-09,18.25,18.28,17.65,17.72,24710111\n19-Oct-09,18.05,18.23,18.01,18.20,13511603\n16-Oct-09,18.32,18.38,17.75,17.96,21370830\n15-Oct-09,18.16,18.44,18.11,18.44,16338338\n14-Oct-09,18.25,18.33,18.05,18.16,25792896\n13-Oct-09,17.97,18.04,17.73,17.92,20031809\n12-Oct-09,18.19,18.20,17.75,17.83,19107474\n9-Oct-09,17.54,18.22,17.54,18.15,24642127\n8-Oct-09,17.50,17.87,17.49,17.80,18307014\n7-Oct-09,17.40,17.53,17.32,17.47,19826835\n6-Oct-09,17.24,17.54,17.16,17.45,30947412\n5-Oct-09,16.81,17.07,16.68,17.00,17614650\n2-Oct-09,16.39,16.86,16.35,16.76,21127389\n1-Oct-09,16.95,16.95,16.49,16.51,16360216\n30-Sep-09,17.13,17.30,16.82,17.04,18712703\n29-Sep-09,17.09,17.34,16.97,17.02,17419519\n28-Sep-09,16.87,17.22,16.84,17.13,13506507\n25-Sep-09,17.04,17.13,16.64,16.80,21649198\n24-Sep-09,17.19,17.32,16.97,17.16,21207605\n23-Sep-09,17.19,17.48,17.04,17.10,17127950\n22-Sep-09,17.00,17.20,16.94,17.16,18908601\n21-Sep-09,16.74,16.88,16.62,16.85,19219524\n18-Sep-09,17.04,17.10,16.82,17.00,18523112\n17-Sep-09,16.97,17.06,16.83,16.98,20695377\n16-Sep-09,16.96,17.30,16.84,17.02,26372223\n15-Sep-09,16.92,17.00,16.72,16.90,14693462\n14-Sep-09,16.69,16.95,16.68,16.92,12484965\n11-Sep-09,16.89,17.07,16.57,16.90,30754738\n10-Sep-09,16.55,17.00,16.48,16.99,24677980\n9-Sep-09,16.25,16.67,16.20,16.60,18909763\n8-Sep-09,16.16,16.31,16.05,16.31,15732496\n4-Sep-09,15.79,16.09,15.68,16.07,15287288\n3-Sep-09,15.60,15.81,15.39,15.81,21482542\n2-Sep-09,15.44,15.74,15.42,15.54,20086527\n1-Sep-09,15.85,16.16,15.47,15.54,37718313\n31-Aug-09,15.83,15.97,15.70,15.90,14685272\n28-Aug-09,16.15,16.48,16.02,16.13,24244748\n27-Aug-09,15.73,16.11,15.47,16.04,34025475\n26-Aug-09,15.14,15.71,15.14,15.68,27212411\n25-Aug-09,15.11,15.26,15.09,15.19,15059417\n24-Aug-09,15.24,15.40,15.03,15.11,15786547\n21-Aug-09,15.24,15.32,15.06,15.29,21752377\n20-Aug-09,15.03,15.19,14.99,15.13,14566250\n19-Aug-09,14.75,15.18,14.72,15.08,17088127\n18-Aug-09,14.82,14.95,14.78,14.92,13989454\n17-Aug-09,14.90,15.00,14.75,14.78,13114412\n14-Aug-09,15.19,15.29,15.02,15.17,14349115\n13-Aug-09,15.17,15.38,15.08,15.23,18445952\n12-Aug-09,14.87,15.39,14.87,15.19,17975405\n10-Aug-09,15.00,15.22,14.97,15.06,24043795\n7-Aug-09,15.33,15.40,15.10,15.24,21342956\n6-Aug-09,15.17,15.30,14.97,15.23,28336802\n5-Aug-09,15.21,15.40,15.04,15.16,15118491\n4-Aug-09,15.30,15.37,15.13,15.31,16911149\n3-Aug-09,15.36,15.42,15.13,15.31,17084187\n31-Jul-09,15.19,15.36,15.03,15.06,23852736\n30-Jul-09,15.39,15.72,15.32,15.34,29145510\n29-Jul-09,15.15,15.38,15.02,15.35,21347850\n28-Jul-09,15.05,15.39,14.96,15.30,24771642\n27-Jul-09,14.98,15.18,14.83,15.13,25158963\n24-Jul-09,14.83,15.18,14.83,14.95,38082922\n23-Jul-09,15.11,15.46,14.85,15.00,63923918\n22-Jul-09,14.45,14.60,14.16,14.41,36034087\n21-Jul-09,14.28,14.66,14.21,14.60,49600940\n20-Jul-09,13.98,14.18,13.73,14.16,27195637\n17-Jul-09,13.74,13.92,13.59,13.92,19345802\n16-Jul-09,13.40,13.81,13.31,13.74,21489358\n15-Jul-09,13.09,13.39,13.05,13.36,28360976\n14-Jul-09,13.01,13.09,12.80,12.88,17309714\n13-Jul-09,12.80,13.02,12.59,13.02,18819502\n10-Jul-09,12.65,12.98,12.65,12.80,14387661\n9-Jul-09,12.61,12.88,12.52,12.76,24007175\n8-Jul-09,12.53,12.65,12.31,12.52,21447200\n7-Jul-09,12.70,12.94,12.47,12.49,27697453\n6-Jul-09,12.71,12.98,12.70,12.89,22764922\n3-Jul-09,12.78,12.78,12.78,12.78,0\n2-Jul-09,12.97,13.14,12.73,12.78,19448491\n1-Jul-09,12.96,13.43,12.90,13.14,19389591\n30-Jun-09,13.33,13.45,13.00,13.10,30560260\n29-Jun-09,13.52,13.71,13.30,13.44,23334873\n26-Jun-09,13.40,13.74,13.28,13.51,32601620\n25-Jun-09,13.10,13.50,12.89,13.49,23924461\n24-Jun-09,12.91,13.24,12.85,13.00,34334145\n23-Jun-09,12.67,12.69,12.43,12.58,21131684\n22-Jun-09,12.94,12.97,12.56,12.63,23138694\n19-Jun-09,12.93,13.24,12.89,13.10,24378244\n18-Jun-09,12.71,13.01,12.55,12.88,19650161\n17-Jun-09,12.72,12.80,12.45,12.68,15961600\n16-Jun-09,13.13,13.13,12.62,12.62,18555957\n15-Jun-09,13.09,13.27,12.86,12.98,19295818\n12-Jun-09,13.01,13.28,12.74,13.26,21410091\n11-Jun-09,12.83,13.23,12.80,13.08,20073297\n10-Jun-09,12.83,12.96,12.63,12.88,16629419\n9-Jun-09,12.80,13.10,12.77,12.86,19967888\n8-Jun-09,12.64,12.94,12.55,12.83,14531353\n5-Jun-09,12.94,12.99,12.60,12.88,21577118\n4-Jun-09,12.52,12.86,12.50,12.84,24137171\n3-Jun-09,12.51,12.86,12.29,12.48,23858495\n2-Jun-09,12.21,12.95,12.19,12.85,54292684\n1-Jun-09,11.82,12.46,11.82,12.42,37306428\n29-May-09,11.85,11.85,11.57,11.75,25087806\n28-May-09,12.16,12.24,11.61,11.76,38352746\n27-May-09,12.06,12.39,11.98,12.08,28600264\n26-May-09,11.51,12.08,11.51,12.02,25353128\n25-May-09,11.61,11.61,11.61,11.61,0\n22-May-09,11.78,11.89,11.56,11.61,19517450\n21-May-09,11.73,11.81,11.52,11.78,25505912\n20-May-09,12.30,12.30,11.78,11.83,27745653\n19-May-09,11.97,12.38,11.92,12.19,25978434\n18-May-09,12.02,12.09,11.79,12.03,19811886\n15-May-09,11.93,12.10,11.85,11.94,18764984\n14-May-09,11.79,12.00,11.58,11.88,27345148\n13-May-09,12.05,12.05,11.65,11.77,22545234\n12-May-09,12.49,12.49,12.05,12.12,16656354\n11-May-09,12.47,12.73,12.31,12.34,20604760\n8-May-09,12.45,12.75,12.30,12.64,30782472\n7-May-09,12.90,12.90,12.17,12.33,34384011\n6-May-09,12.90,13.00,12.54,12.78,27082470\n5-May-09,12.77,12.92,12.63,12.80,18523766\n4-May-09,12.41,12.84,12.26,12.84,20927366\n1-May-09,12.54,12.60,12.15,12.45,18867922\n30-Apr-09,12.36,12.70,12.31,12.53,22781348\n29-Apr-09,12.11,12.50,11.74,12.28,28508567\n28-Apr-09,11.66,12.16,11.63,12.03,20136209\n27-Apr-09,11.65,12.23,11.55,11.80,32849142\n24-Apr-09,12.23,12.23,11.51,11.96,50126445\n23-Apr-09,12.24,12.59,11.93,12.17,47658045\n22-Apr-09,12.44,12.95,12.26,12.70,28792123\n21-Apr-09,12.14,12.50,12.07,12.47,26307133\n20-Apr-09,12.42,12.60,12.26,12.47,18850596\n17-Apr-09,12.87,12.93,12.70,12.81,24695252\n16-Apr-09,12.74,12.93,12.55,12.86,24286042\n15-Apr-09,12.65,12.84,12.25,12.50,23629425\n14-Apr-09,12.79,13.02,12.60,12.75,22409526\n13-Apr-09,12.90,13.10,12.70,12.71,36657481\n10-Apr-09,13.25,13.25,13.25,13.25,0\n9-Apr-09,12.57,13.40,12.21,13.25,44990447\n8-Apr-09,12.43,12.91,12.30,12.61,37628295\n7-Apr-09,12.17,12.36,11.88,11.88,26611987\n6-Apr-09,12.37,12.40,12.01,12.37,23248542\n3-Apr-09,12.15,12.63,12.00,12.49,23071903\n2-Apr-09,11.98,12.43,11.91,12.12,32033670\n1-Apr-09,11.20,11.91,10.91,11.67,38014674\n31-Mar-09,11.36,11.72,11.26,11.40,26237643\n30-Mar-09,11.26,11.41,11.05,11.21,25163826\n27-Mar-09,11.86,11.93,11.57,11.57,20071400\n26-Mar-09,11.66,12.05,11.55,12.01,35338528\n25-Mar-09,11.93,12.06,11.32,11.54,36264548\n24-Mar-09,11.71,11.99,11.58,11.85,24567144\n23-Mar-09,11.52,11.87,11.36,11.87,33671949\n20-Mar-09,11.50,11.92,11.21,11.29,31291357\n19-Mar-09,11.46,11.66,11.18,11.48,36820373\n18-Mar-09,10.81,11.63,10.71,11.34,44369976\n17-Mar-09,10.70,10.98,10.50,10.98,21409937\n16-Mar-09,10.74,10.88,10.50,10.61,20322056\n13-Mar-09,10.70,10.88,10.60,10.68,32822836\n12-Mar-09,10.58,11.02,10.38,10.96,31110976\n11-Mar-09,10.72,10.76,10.31,10.63,33935672\n10-Mar-09,10.10,10.73,9.98,10.66,33522893\n9-Mar-09,9.61,10.00,9.61,9.85,25705531\n6-Mar-09,10.12,10.28,9.68,9.93,25281042\n5-Mar-09,10.32,10.60,10.00,10.05,28977989\n4-Mar-09,10.28,10.85,9.94,10.60,33586727\n3-Mar-09,10.10,10.44,10.05,10.15,26358537\n2-Mar-09,10.31,10.58,10.01,10.14,26879216\n27-Feb-09,10.59,10.79,10.50,10.50,23038821\n26-Feb-09,11.17,11.26,10.78,10.80,23865869\n25-Feb-09,10.74,11.31,10.63,11.07,29594504\n24-Feb-09,10.72,10.95,10.52,10.82,24082556\n23-Feb-09,11.15,11.19,10.60,10.65,27004141\n20-Feb-09,10.99,11.31,10.80,11.01,32416975\n19-Feb-09,11.94,12.00,11.15,11.19,38275864\n18-Feb-09,11.76,11.97,11.67,11.86,29722068\n17-Feb-09,11.80,11.95,11.66,11.71,27498281\n13-Feb-09,11.89,12.22,11.83,12.06,28288716\n12-Feb-09,11.89,12.00,11.50,11.95,50909209\n11-Feb-09,11.96,12.31,11.89,12.05,29267740\n10-Feb-09,12.36,12.52,11.80,11.92,28069533\n9-Feb-09,11.93,12.59,11.77,12.51,34339333\n6-Feb-09,11.64,12.10,11.64,11.95,26657054\n5-Feb-09,11.18,11.87,11.10,11.77,25753760\n4-Feb-09,10.63,11.70,10.63,11.32,21797036\n3-Feb-09,11.38,11.43,11.00,11.38,23302283\n2-Feb-09,10.94,11.42,10.91,11.26,23070448\n30-Jan-09,11.51,11.52,11.00,11.04,19817694\n29-Jan-09,11.44,11.50,11.19,11.43,19679674\n28-Jan-09,10.91,11.67,10.82,11.60,32730780\n27-Jan-09,10.65,11.13,10.56,10.69,46890048\n26-Jan-09,11.39,11.62,10.87,10.99,31314965\n23-Jan-09,10.66,11.31,10.56,11.16,23157723\n22-Jan-09,10.69,11.05,10.69,10.90,26518901\n21-Jan-09,10.68,10.98,10.48,10.96,20321297\n20-Jan-09,11.05,11.22,10.43,10.51,28828838\n16-Jan-09,11.50,11.60,10.92,11.27,28326958\n15-Jan-09,11.16,11.46,10.93,11.23,31202811\n14-Jan-09,11.00,11.49,10.96,11.21,26665479\n13-Jan-09,11.42,11.65,11.16,11.28,28428303\n12-Jan-09,11.73,11.73,11.41,11.57,18514341\n9-Jan-09,11.90,11.98,11.55,11.75,19054941\n8-Jan-09,11.74,12.05,11.45,11.89,46849867\n7-Jan-09,11.12,11.45,10.98,11.18,21744881\n6-Jan-09,10.82,11.54,10.72,11.33,31811667\n5-Jan-09,10.73,11.00,10.58,10.70,25037126\n2-Jan-09,10.34,10.90,10.20,10.86,14849190\n1-Jan-09,10.47,10.47,10.47,10.47,0\n31-Dec-08,10.27,10.59,10.25,10.47,11073013\n30-Dec-08,10.22,10.46,10.22,10.40,12226065\n29-Dec-08,10.25,10.29,9.99,10.29,12998071\n26-Dec-08,10.17,10.43,10.16,10.31,7113646\n25-Dec-08,10.16,10.16,10.16,10.16,0\n24-Dec-08,10.15,10.19,10.05,10.16,3283774\n23-Dec-08,10.54,10.54,10.08,10.15,13189975\n22-Dec-08,10.99,11.11,10.04,10.32,26300349\n19-Dec-08,10.90,11.09,10.73,10.94,24481439\n18-Dec-08,11.00,11.25,10.74,10.83,22950601\n17-Dec-08,11.00,11.29,10.70,11.19,23000448\n16-Dec-08,10.76,11.11,10.62,11.09,24851273\n15-Dec-08,10.78,10.94,10.60,10.79,22783857\n12-Dec-08,10.27,10.88,10.27,10.77,26802034\n11-Dec-08,10.34,10.84,10.31,10.52,26313103\n10-Dec-08,10.67,10.73,10.25,10.43,28906698\n9-Dec-08,10.83,11.43,10.56,10.61,25945196\n8-Dec-08,11.00,11.33,10.68,11.17,28815827\n5-Dec-08,10.20,10.90,10.02,10.81,32043696\n4-Dec-08,10.44,10.65,10.13,10.30,28401216\n3-Dec-08,10.16,10.75,10.06,10.65,28884670\n2-Dec-08,10.43,10.60,10.14,10.40,33002147\n1-Dec-08,10.34,10.43,10.03,10.13,26311654\n28-Nov-08,10.12,10.58,10.12,10.57,7985756\n27-Nov-08,10.50,10.50,10.50,10.50,0\n26-Nov-08,9.67,10.55,9.51,10.50,23302950\n25-Nov-08,10.01,10.15,9.54,9.79,28957407\n24-Nov-08,9.45,10.28,9.20,10.13,32522657\n21-Nov-08,9.02,9.38,8.25,9.30,59032577\n20-Nov-08,9.68,10.12,8.75,8.85,50053149\n19-Nov-08,10.15,10.27,9.75,9.80,27415810\n18-Nov-08,9.97,10.24,9.77,10.20,31674573\n17-Nov-08,9.87,10.24,9.61,9.86,21182126\n14-Nov-08,10.12,10.46,9.93,9.98,24533754\n13-Nov-08,9.85,10.47,9.31,10.43,38085279\n12-Nov-08,10.05,10.20,9.74,9.86,24889695\n11-Nov-08,10.56,10.64,10.07,10.25,22412876\n10-Nov-08,11.15,11.15,10.54,10.69,25796304\n7-Nov-08,10.57,11.05,10.33,10.89,20462900\n6-Nov-08,10.65,11.00,10.32,10.47,27141100\n5-Nov-08,11.42,11.59,10.94,11.01,27336100\n4-Nov-08,11.80,11.80,11.42,11.74,26552100\n3-Nov-08,11.78,11.86,11.35,11.53,21892500\n31-Oct-08,11.44,12.06,11.04,11.78,41282200\n30-Oct-08,11.30,11.50,10.88,11.46,52844300\n29-Oct-08,11.07,11.11,10.50,10.51,33884600\n28-Oct-08,10.25,11.10,10.02,11.07,40213900\n27-Oct-08,9.62,10.58,9.61,10.01,31831800\n24-Oct-08,8.45,10.20,8.35,9.93,50080100\n23-Oct-08,10.08,10.15,9.00,9.41,44781500\n22-Oct-08,10.17,10.63,9.64,9.98,56867400\n21-Oct-08,9.99,10.19,9.64,9.69,22904200\n20-Oct-08,10.00,10.19,9.58,10.17,26965600\n17-Oct-08,9.78,10.28,9.49,9.69,35956600\n16-Oct-08,10.00,10.19,9.40,9.97,58216000\n15-Oct-08,10.45,10.56,9.68,9.77,34310600\n14-Oct-08,11.82,11.89,10.38,10.71,38895300\n13-Oct-08,10.70,11.60,10.65,11.31,37968100\n10-Oct-08,10.09,11.02,9.35,10.12,50563400\n9-Oct-08,10.68,11.00,10.35,10.44,43006600\n8-Oct-08,10.11,11.00,10.10,10.57,47062100\n7-Oct-08,10.50,10.88,10.12,10.72,49168400\n6-Oct-08,11.17,11.49,10.22,10.74,40821300\n3-Oct-08,11.83,12.25,11.50,11.58,28828500\n2-Oct-08,11.84,11.89,11.50,11.76,31369400\n1-Oct-08,12.00,12.25,11.67,11.97,32752400\n30-Sep-08,11.57,12.09,11.54,11.96,28453300\n29-Sep-08,12.42,12.50,11.22,11.47,42957500\n26-Sep-08,12.44,12.93,12.44,12.72,24264000\n25-Sep-08,12.28,13.09,12.10,13.04,45133800\n24-Sep-08,12.27,12.35,11.89,12.20,33221700\n23-Sep-08,12.25,12.48,11.65,12.18,62063100\n22-Sep-08,12.96,13.04,12.19,12.24,35576200\n19-Sep-08,13.30,13.64,12.42,13.04,45832700\n18-Sep-08,12.91,12.91,11.50,12.41,62841800\n17-Sep-08,13.11,13.19,12.55,12.84,44565000\n16-Sep-08,12.90,13.43,12.61,13.37,37820700\n15-Sep-08,13.84,13.86,13.13,13.33,36713200\n12-Sep-08,13.81,14.17,13.64,14.10,30302000\n11-Sep-08,13.68,14.00,13.44,13.96,33648400\n10-Sep-08,13.82,14.15,13.59,14.00,28590000\n9-Sep-08,14.18,14.44,13.60,13.67,30394400\n8-Sep-08,14.32,14.42,13.78,14.30,26989400\n5-Sep-08,13.85,14.14,13.72,14.04,23117900\n4-Sep-08,14.75,14.86,13.80,13.94,47430600\n3-Sep-08,14.68,15.02,14.67,14.87,24021600\n2-Sep-08,15.45,15.69,14.67,14.75,31865800\n29-Aug-08,15.62,15.62,15.26,15.28,14968400\n28-Aug-08,15.70,15.78,15.52,15.73,20685800\n27-Aug-08,15.29,15.69,15.01,15.60,23413800\n26-Aug-08,15.34,15.54,15.15,15.31,15771000\n25-Aug-08,15.61,15.75,15.31,15.32,16901700\n22-Aug-08,15.40,15.78,15.33,15.74,18984900\n21-Aug-08,14.98,15.43,14.91,15.29,22260000\n20-Aug-08,15.18,15.57,15.09,15.18,22799100\n19-Aug-08,14.99,15.31,14.98,15.18,29809500\n18-Aug-08,15.34,15.34,14.92,15.18,19765100\n15-Aug-08,15.20,15.42,14.90,15.32,23601500\n14-Aug-08,14.99,15.15,14.77,15.02,16990200\n13-Aug-08,15.14,15.22,14.75,14.99,21359300\n12-Aug-08,15.19,15.42,15.10,15.15,19235900\n11-Aug-08,15.05,15.52,14.85,15.26,28126600\n8-Aug-08,14.63,15.15,14.59,15.02,26146500\n7-Aug-08,14.46,14.80,14.27,14.36,24223300\n6-Aug-08,14.86,14.88,14.12,14.79,39385800\n5-Aug-08,15.02,15.09,14.65,14.94,21283800\n4-Aug-08,15.09,15.13,14.78,14.80,16641400\n1-Aug-08,15.20,15.20,14.60,15.04,20853100\n31-Jul-08,15.14,15.52,14.84,15.01,51299900\n30-Jul-08,14.13,15.14,13.98,15.04,60532300\n29-Jul-08,13.99,14.26,13.85,14.03,26800700\n28-Jul-08,13.97,14.07,13.65,13.91,25860700\n25-Jul-08,14.10,14.18,13.88,14.01,18818700\n24-Jul-08,14.36,14.45,13.91,14.09,51707100\n23-Jul-08,12.86,14.27,12.70,14.17,2009200\n22-Jul-08,12.19,12.61,12.06,12.44,42839900\n21-Jul-08,12.65,12.67,12.22,12.30,27289400\n18-Jul-08,12.69,12.79,12.44,12.57,30021000\n17-Jul-08,12.63,12.95,12.47,12.77,29811700\n16-Jul-08,12.58,12.77,12.36,12.57,29496000\n15-Jul-08,12.50,12.75,12.25,12.53,26360300\n14-Jul-08,12.94,12.95,12.60,12.65,21913300\n11-Jul-08,13.17,13.17,12.56,12.73,44169900\n10-Jul-08,13.13,13.41,12.96,13.38,47382200\n9-Jul-08,13.50,13.59,12.98,13.10,49684300\n8-Jul-08,13.73,14.18,13.18,13.39,40824400\n7-Jul-08,15.33,15.75,14.95,15.14,40949500\n3-Jul-08,14.96,15.15,14.75,15.05,14520100\n2-Jul-08,14.79,15.14,14.65,14.98,35072200\n1-Jul-08,14.56,14.69,14.33,14.65,33742200\n30-Jun-08,14.68,14.82,14.49,14.69,30555100\n27-Jun-08,15.30,15.40,14.65,14.77,45418500\n26-Jun-08,16.08,16.08,15.46,15.48,28207400\n25-Jun-08,15.93,16.48,15.90,16.32,25185700\n24-Jun-08,15.90,16.09,15.75,15.93,16262600\n23-Jun-08,16.14,16.21,15.86,16.01,14905300\n20-Jun-08,16.40,16.61,15.98,16.10,32259800\n19-Jun-08,16.40,16.65,16.25,16.58,19155800\n18-Jun-08,16.33,16.46,16.23,16.37,19868100\n17-Jun-08,16.64,16.67,16.43,16.48,21668300\n16-Jun-08,16.44,16.54,16.24,16.50,18015200\n13-Jun-08,16.33,16.50,16.16,16.49,18163800\n12-Jun-08,16.43,16.49,16.12,16.26,26686300\n11-Jun-08,16.52,16.68,16.26,16.29,24332900\n10-Jun-08,16.51,16.75,16.33,16.58,24834900\n9-Jun-08,17.16,17.16,16.44,16.79,32158000\n6-Jun-08,17.30,17.49,17.08,17.12,28200500\n5-Jun-08,17.51,17.58,17.40,17.44,29800900\n4-Jun-08,17.39,17.63,17.25,17.40,29830000\n3-Jun-08,17.33,17.78,17.30,17.47,27473800\n2-Jun-08,17.40,17.40,17.12,17.30,25131800\n30-May-08,17.64,17.64,17.40,17.44,20841900\n29-May-08,17.29,17.56,17.16,17.53,26362400\n28-May-08,17.41,17.58,17.09,17.25,17443900\n27-May-08,17.10,17.33,17.00,17.27,20794500\n23-May-08,17.21,17.24,16.96,17.06,22562300\n22-May-08,17.32,17.42,17.03,17.27,33504800\n21-May-08,17.19,17.63,17.16,17.29,40380700\n20-May-08,17.50,17.75,17.04,17.28,62914000\n19-May-08,17.80,18.50,17.66,17.97,50225500\n16-May-08,17.75,17.80,17.43,17.72,64351600\n15-May-08,16.76,17.85,16.70,17.80,82732200\n14-May-08,16.05,16.75,15.98,16.68,56273900\n13-May-08,16.12,16.15,15.94,15.98,23584800\n12-May-08,16.00,16.33,15.85,16.09,24918600\n9-May-08,15.88,16.07,15.78,15.96,12922900\n8-May-08,15.82,16.11,15.80,16.01,17677100\n7-May-08,16.00,16.12,15.73,15.82,21079100\n6-May-08,15.89,16.10,15.72,15.99,25485500\n5-May-08,16.10,16.10,15.83,15.91,17979200\n2-May-08,16.29,16.31,15.98,16.10,27392600\n1-May-08,15.40,16.14,15.40,16.09,37246100\n30-Apr-08,15.72,15.87,15.38,15.40,26988200\n29-Apr-08,15.74,15.79,15.55,15.72,20103800\n28-Apr-08,15.60,15.89,15.50,15.75,20898900\n25-Apr-08,15.59,15.64,15.28,15.54,23032100\n24-Apr-08,15.82,16.60,15.25,15.56,42978100\n23-Apr-08,16.34,16.36,15.82,15.89,54314800\n22-Apr-08,15.86,15.89,15.41,15.59,26374100\n21-Apr-08,15.79,16.05,15.62,15.89,34692300\n18-Apr-08,15.08,15.67,15.02,15.52,36242500\n17-Apr-08,14.62,14.92,14.55,14.82,32265800\n16-Apr-08,14.41,14.65,14.29,14.63,22380600\n15-Apr-08,14.39,14.54,14.05,14.17,37318200\n14-Apr-08,14.78,14.88,14.56,14.64,22829300\n11-Apr-08,15.00,15.35,14.87,14.88,24177900\n10-Apr-08,14.71,15.29,14.71,15.21,30527700\n9-Apr-08,14.90,14.96,14.67,14.72,23032800\n8-Apr-08,14.75,15.01,14.69,14.84,26434200\n7-Apr-08,15.06,15.13,14.81,14.90,17612200\n4-Apr-08,14.89,15.01,14.62,14.98,29460800\n3-Apr-08,14.74,15.08,14.62,14.90,23783000\n2-Apr-08,14.88,15.14,14.68,14.85,32936700\n1-Apr-08,14.55,14.88,14.51,14.84,38031000\n31-Mar-08,14.32,14.53,14.25,14.34,24504100\n28-Mar-08,14.40,14.46,14.25,14.30,20334400\n27-Mar-08,14.63,14.63,14.26,14.33,35566400\n26-Mar-08,14.85,14.89,14.50,14.57,35799400\n25-Mar-08,14.95,15.18,14.66,14.94,32220800\n24-Mar-08,14.70,15.10,14.56,14.91,26695300\n20-Mar-08,14.28,14.63,14.01,14.63,41077500\n19-Mar-08,14.98,15.00,14.21,14.24,36521700\n18-Mar-08,14.76,15.00,14.55,14.94,34320700\n17-Mar-08,14.39,14.65,14.11,14.47,43037800\n14-Mar-08,15.26,15.30,14.63,14.79,34389900\n13-Mar-08,14.78,15.30,14.70,15.16,37610700\n12-Mar-08,15.00,15.20,14.84,14.89,38346300\n11-Mar-08,15.00,15.10,14.73,15.03,30950700\n10-Mar-08,15.01,15.03,14.69,14.70,32960200\n7-Mar-08,15.01,15.22,14.85,15.03,37513500\n6-Mar-08,15.36,15.47,15.05,15.06,26009400\n5-Mar-08,15.46,15.60,15.30,15.44,35495300\n4-Mar-08,15.42,15.50,15.08,15.36,28443000\n3-Mar-08,15.54,15.62,15.30,15.53,27135800\n29-Feb-08,15.57,15.67,15.36,15.54,52389000\n28-Feb-08,15.95,15.98,15.62,15.73,23307800\n27-Feb-08,15.96,16.30,15.87,16.06,28571300\n26-Feb-08,15.77,16.21,15.70,16.03,37103800\n25-Feb-08,15.21,15.68,15.13,15.61,32761000\n22-Feb-08,15.33,15.43,14.87,15.28,38635700\n21-Feb-08,15.55,15.63,15.35,15.42,24663600\n20-Feb-08,15.21,15.49,15.03,15.43,32645000\n19-Feb-08,16.05,16.05,15.25,15.31,32189100\n15-Feb-08,15.99,16.08,15.76,15.90,23407900\n14-Feb-08,15.84,16.24,15.70,16.09,44991000\n13-Feb-08,15.87,15.94,15.53,15.81,46761000\n12-Feb-08,15.74,16.07,15.62,15.74,32294900\n11-Feb-08,15.61,15.74,15.42,15.65,30863200\n8-Feb-08,15.19,15.60,15.06,15.48,25052400\n7-Feb-08,15.25,15.47,14.94,15.24,52593700\n6-Feb-08,15.66,15.79,15.40,15.44,32893500\n5-Feb-08,15.81,16.00,15.49,15.52,36505100\n4-Feb-08,16.23,16.31,15.91,16.01,34343400\n1-Feb-08,16.00,16.25,15.88,16.13,41662000\n31-Jan-08,15.57,16.01,15.44,15.83,41503500\n30-Jan-08,15.95,16.39,15.58,15.81,78904800\n29-Jan-08,15.42,16.08,15.30,15.89,24369500\n28-Jan-08,16.65,16.95,16.46,16.91,54103500\n25-Jan-08,17.07,17.19,16.60,16.72,44285600\n24-Jan-08,16.16,16.79,15.80,16.55,46318200\n23-Jan-08,15.85,16.13,15.08,15.99,72553900\n22-Jan-08,15.80,16.56,15.50,16.30,67826600\n18-Jan-08,17.27,17.29,16.81,16.98,42468500\n17-Jan-08,16.94,17.24,16.82,16.89,61074600\n16-Jan-08,16.48,17.22,16.25,16.80,56571500\n15-Jan-08,16.95,17.33,16.57,16.68,61640800\n14-Jan-08,16.57,16.85,16.39,16.80,43707900\n11-Jan-08,16.43,16.43,15.93,16.00,42940900\n10-Jan-08,16.40,16.80,16.12,16.62,44735300\n9-Jan-08,16.10,16.58,16.01,16.55,49763500\n8-Jan-08,16.23,16.80,15.96,16.03,60682500\n7-Jan-08,17.14,17.14,15.76,16.04,66393700\n4-Jan-08,17.43,17.56,16.93,16.99,50660100\n3-Jan-08,18.10,18.10,17.57,17.83,37549200\n2-Jan-08,18.55,18.60,17.83,18.02,37006900\n31-Dec-07,18.36,18.65,18.27,18.53,16487100\n28-Dec-07,18.55,18.58,18.16,18.44,15950700\n27-Dec-07,18.81,18.90,18.41,18.50,18753000\n26-Dec-07,18.89,18.99,18.72,18.96,13308900\n24-Dec-07,19.10,19.22,18.90,19.06,6427900\n21-Dec-07,19.00,19.19,18.76,19.03,29895300\n20-Dec-07,19.15,19.27,18.53,18.83,38674300\n19-Dec-07,18.48,18.96,18.40,18.82,23734900\n18-Dec-07,18.83,18.83,17.88,18.44,30545200\n17-Dec-07,18.91,19.19,18.46,18.54,26662400\n14-Dec-07,18.87,19.37,18.71,18.98,29401400\n13-Dec-07,19.43,19.65,18.85,19.18,31393500\n12-Dec-07,19.88,20.19,19.41,19.68,42461100\n11-Dec-07,19.65,20.18,19.29,19.37,32174800\n10-Dec-07,19.57,19.70,19.37,19.52,21841200\n7-Dec-07,19.60,19.76,19.32,19.55,17170000\n6-Dec-07,19.49,19.77,19.26,19.52,40066400\n5-Dec-07,19.67,19.98,19.24,19.44,38468600\n4-Dec-07,18.82,19.58,18.76,19.19,30566900\n3-Dec-07,19.09,19.30,18.75,19.04,36033100\n30-Nov-07,19.99,20.00,18.94,19.27,37173200\n29-Nov-07,19.35,19.67,19.17,19.46,42650100\n28-Nov-07,18.59,19.41,18.52,19.11,55929200\n27-Nov-07,17.55,18.23,17.50,18.19,44777800\n26-Nov-07,18.45,18.45,17.36,17.37,58446000\n23-Nov-07,18.59,18.63,18.26,18.45,8462300\n21-Nov-07,18.44,18.64,18.13,18.25,37488900\n20-Nov-07,19.34,19.46,18.36,18.82,54905700\n19-Nov-07,19.49,19.69,19.02,19.16,32886300\n16-Nov-07,19.58,19.76,19.26,19.64,37584500\n15-Nov-07,19.75,19.79,19.11,19.32,59396800\n14-Nov-07,20.38,20.45,19.41,19.57,56689200\n13-Nov-07,19.20,20.01,19.01,19.72,72567900\n12-Nov-07,19.94,20.10,18.50,18.83,65668500\n9-Nov-07,20.00,20.25,19.38,19.91,91723600\n8-Nov-07,22.11,22.11,19.91,20.67,4534200\n7-Nov-07,22.78,23.04,22.23,22.24,64476300\n6-Nov-07,23.47,23.85,22.81,23.40,45203600\n5-Nov-07,23.99,24.12,22.59,23.49,54674100\n2-Nov-07,25.00,25.04,24.21,24.55,41707600\n1-Nov-07,25.09,25.20,24.68,24.79,47230600\n31-Oct-07,25.20,25.46,24.93,25.39,37010300\n30-Oct-07,25.14,25.16,24.65,25.12,44283600\n29-Oct-07,24.67,25.47,24.48,25.37,54103500\n26-Oct-07,24.58,24.85,24.24,24.53,49768100\n25-Oct-07,23.98,24.61,23.40,24.45,18668500\n24-Oct-07,23.21,23.30,22.29,22.53,55233500\n23-Oct-07,22.86,23.44,22.64,23.36,40286900\n22-Oct-07,22.08,22.75,21.69,22.59,31295500\n19-Oct-07,22.85,22.89,22.33,22.38,37273400\n18-Oct-07,22.58,22.90,22.50,22.88,29124300\n17-Oct-07,22.65,22.87,22.43,22.85,37032700\n16-Oct-07,22.43,22.45,22.06,22.27,34145400\n15-Oct-07,22.98,23.10,22.40,22.56,45038200\n12-Oct-07,22.96,23.19,22.20,22.81,49764900\n11-Oct-07,22.96,23.75,22.32,22.75,89802200\n10-Oct-07,21.98,22.70,21.76,22.57,71828300\n9-Oct-07,21.36,21.91,21.22,21.81,51919500\n8-Oct-07,20.78,21.20,20.76,21.17,26725200\n5-Oct-07,21.16,21.20,20.74,20.99,40437500\n4-Oct-07,21.09,21.15,20.83,21.05,27110100\n3-Oct-07,21.35,21.46,21.01,21.13,29000200\n2-Oct-07,20.81,21.41,20.80,21.37,44796700\n1-Oct-07,20.80,20.97,20.68,20.81,37137000\n28-Sep-07,20.43,20.87,20.39,20.80,30719600\n27-Sep-07,20.73,20.91,20.52,20.55,29812100\n26-Sep-07,21.08,21.10,20.51,20.66,46521600\n25-Sep-07,20.30,21.06,20.20,20.91,69577300\n24-Sep-07,19.81,20.55,19.60,20.51,80772500\n21-Sep-07,19.19,19.24,18.93,19.03,33826400\n20-Sep-07,19.07,19.23,18.87,19.03,28992000\n19-Sep-07,19.44,19.50,18.81,19.10,49822700\n18-Sep-07,18.83,19.32,18.70,19.23,33415800\n17-Sep-07,19.10,19.25,18.52,18.75,43796800\n14-Sep-07,19.10,19.41,19.00,19.28,17596200\n13-Sep-07,19.60,19.73,19.17,19.26,29421000\n12-Sep-07,19.61,19.91,19.34,19.42,34269100\n11-Sep-07,19.31,19.75,19.27,19.50,54775000\n10-Sep-07,19.17,19.29,18.52,19.14,37680800\n7-Sep-07,19.05,19.07,18.77,18.97,34204400\n6-Sep-07,19.44,19.64,19.26,19.39,19795400\n5-Sep-07,19.73,19.75,19.36,19.44,29790100\n4-Sep-07,19.67,19.98,19.62,19.85,25514000\n31-Aug-07,19.82,19.83,19.56,19.66,19923700\n30-Aug-07,19.40,19.75,19.40,19.58,20900000\n29-Aug-07,19.32,19.65,19.24,19.63,29399700\n28-Aug-07,19.49,19.54,19.05,19.09,39947600\n27-Aug-07,19.95,19.95,19.51,19.65,36439800\n24-Aug-07,19.52,20.00,19.40,19.98,37988700\n23-Aug-07,19.96,19.99,19.28,19.45,37600200\n22-Aug-07,19.68,20.00,19.41,19.84,62872500\n21-Aug-07,18.64,19.57,18.64,19.29,51915300\n20-Aug-07,18.55,18.80,18.41,18.65,30249000\n17-Aug-07,18.59,18.84,18.01,18.29,33411700\n16-Aug-07,18.40,18.45,17.39,18.19,62124900\n15-Aug-07,18.34,18.88,17.98,18.14,59747000\n14-Aug-07,19.56,19.89,18.27,18.34,19804900\n13-Aug-07,18.56,19.10,18.30,19.05,65353800\n10-Aug-07,17.50,18.02,16.89,17.72,56997700\n9-Aug-07,18.11,18.25,17.65,17.74,43366500\n8-Aug-07,18.45,18.75,18.10,18.40,37612500\n7-Aug-07,18.53,18.60,17.60,18.15,59846200\n6-Aug-07,18.77,18.87,18.19,18.49,46448200\n3-Aug-07,19.08,19.20,18.62,18.68,35510900\n2-Aug-07,19.19,19.24,18.87,19.15,34516200\n1-Aug-07,18.87,19.13,18.53,19.09,34142300\n31-Jul-07,19.12,19.18,18.42,18.51,34252200\n30-Jul-07,18.61,18.84,18.35,18.82,26720300\n27-Jul-07,18.39,18.69,18.20,18.35,57222800\n26-Jul-07,18.52,18.90,17.97,18.39,61620900\n25-Jul-07,19.25,19.45,18.81,18.91,43161800\n24-Jul-07,19.21,19.45,18.75,19.05,58861600\n23-Jul-07,19.46,19.66,19.40,19.51,32519700\n20-Jul-07,19.58,19.74,19.17,19.44,32339800\n19-Jul-07,19.49,19.84,19.42,19.72,45214400\n18-Jul-07,18.88,19.35,18.85,19.25,30143700\n17-Jul-07,19.20,19.23,18.94,19.02,29714100\n16-Jul-07,19.32,19.37,19.08,19.13,22052300\n13-Jul-07,19.25,19.34,18.97,19.19,40184400\n12-Jul-07,19.38,19.60,18.92,19.25,71119200\n11-Jul-07,18.81,18.97,18.72,18.92,27599400\n10-Jul-07,18.54,18.86,18.30,18.72,32746000\n9-Jul-07,18.75,18.88,18.56,18.59,35959900\n6-Jul-07,18.37,18.74,18.34,18.66,20476100\n5-Jul-07,18.40,18.52,18.24,18.40,30668400\n3-Jul-07,18.61,18.86,18.32,18.39,26563400\n2-Jul-07,18.15,18.55,18.02,18.55,28378500\n29-Jun-07,17.96,18.16,17.81,18.10,29615100\n28-Jun-07,17.96,18.10,17.76,17.83,23471600\n27-Jun-07,17.34,17.95,17.23,17.93,35380300\n26-Jun-07,17.79,17.84,17.39,17.52,25635100\n25-Jun-07,17.88,17.94,17.55,17.65,31782500\n22-Jun-07,17.90,18.03,17.85,17.95,34687300\n21-Jun-07,17.64,18.11,17.57,17.99,30075600\n20-Jun-07,18.00,18.05,17.51,17.58,33373000\n19-Jun-07,17.75,18.15,17.72,17.99,32502000\n18-Jun-07,17.46,17.80,17.46,17.79,28814300\n15-Jun-07,17.19,17.47,17.16,17.35,31320400\n14-Jun-07,16.50,17.11,16.49,17.01,34183900\n13-Jun-07,16.45,16.63,16.33,16.59,29780900\n12-Jun-07,16.59,16.59,16.27,16.30,24253100\n11-Jun-07,16.65,16.75,16.50,16.63,17212100\n8-Jun-07,16.44,16.70,16.26,16.70,24089900\n7-Jun-07,16.87,16.89,16.42,16.43,35525600\n6-Jun-07,16.92,17.09,16.85,16.93,28455300\n5-Jun-07,17.00,17.10,16.95,17.00,29470900\n4-Jun-07,16.88,17.24,16.71,17.05,31545200\n1-Jun-07,16.93,17.08,16.57,16.83,28607100\n31-May-07,16.90,17.15,16.89,16.89,40715200\n30-May-07,16.37,17.00,16.30,17.00,50064700\n29-May-07,16.48,16.66,16.21,16.48,28935800\n25-May-07,16.35,16.60,16.31,16.46,32848000\n24-May-07,16.13,16.85,16.05,16.30,80283500\n23-May-07,15.91,16.05,15.78,16.05,28166300\n22-May-07,15.88,15.94,15.74,15.82,24588600\n21-May-07,15.52,15.89,15.52,15.83,27081500\n18-May-07,15.68,15.74,15.56,15.69,18465600\n17-May-07,15.69,15.80,15.54,15.65,19375500\n16-May-07,15.49,15.78,15.49,15.77,32874900\n15-May-07,15.47,15.61,15.40,15.43,31425400\n14-May-07,15.33,15.68,15.33,15.44,29632300\n11-May-07,15.22,15.46,15.19,15.33,18544200\n10-May-07,15.57,15.60,15.12,15.21,32581400\n9-May-07,15.68,15.68,15.51,15.63,18815900\n8-May-07,15.54,15.83,15.32,15.68,29684500\n7-May-07,15.34,15.62,15.34,15.61,23314700\n4-May-07,15.38,15.45,15.23,15.32,10549900\n3-May-07,15.26,15.49,15.20,15.35,20532800\n2-May-07,15.09,15.30,15.05,15.19,28171700\n1-May-07,15.25,15.29,14.92,15.06,33182700\n30-Apr-07,15.64,15.70,15.14,15.18,36951700\n27-Apr-07,15.50,15.69,15.44,15.64,22228700\n26-Apr-07,15.97,16.00,15.43,15.57,36827900\n25-Apr-07,15.60,15.85,15.54,15.74,27238800\n24-Apr-07,15.52,15.62,15.37,15.50,21387900\n23-Apr-07,15.35,15.65,15.24,15.51,29283500\n20-Apr-07,15.48,15.54,15.32,15.37,30081400\n19-Apr-07,15.25,15.49,15.15,15.40,24856200\n18-Apr-07,15.12,15.37,15.04,15.35,26399500\n17-Apr-07,15.30,15.38,15.05,15.22,62819100\n16-Apr-07,14.59,14.78,14.55,14.76,33465500\n13-Apr-07,14.24,14.65,14.17,14.60,28063300\n12-Apr-07,14.05,14.22,13.96,14.21,15741500\n11-Apr-07,14.17,14.20,14.03,14.09,25970400\n10-Apr-07,14.35,14.43,14.13,14.19,25086000\n9-Apr-07,14.46,14.50,14.31,14.38,13554100\n5-Apr-07,14.35,14.44,14.22,14.44,13892500\n4-Apr-07,14.27,14.40,14.18,14.35,22475100\n3-Apr-07,14.13,14.39,14.12,14.29,30740800\n2-Apr-07,13.90,14.11,13.85,14.09,30746200\n30-Mar-07,13.73,13.93,13.67,13.85,27880800\n29-Mar-07,13.56,13.76,13.50,13.66,22211500\n28-Mar-07,13.50,13.60,13.42,13.49,20951900\n27-Mar-07,13.57,13.69,13.48,13.61,16756100\n26-Mar-07,13.72,13.90,13.49,13.66,19777800\n23-Mar-07,13.70,13.90,13.61,13.70,27783500\n22-Mar-07,13.42,13.56,13.29,13.53,24896000\n21-Mar-07,13.02,13.36,12.95,13.26,28610800\n20-Mar-07,13.02,13.23,12.96,13.02,20888100\n19-Mar-07,13.08,13.13,12.99,13.05,13220800\n16-Mar-07,12.94,13.11,12.88,12.99,36677200\n15-Mar-07,13.01,13.09,12.91,12.93,17222900\n14-Mar-07,13.00,13.02,12.74,13.00,30711800\n13-Mar-07,13.01,13.20,12.87,12.99,29364400\n12-Mar-07,13.05,13.18,12.97,13.09,16574100\n9-Mar-07,13.08,13.26,12.93,13.05,36409700\n8-Mar-07,13.20,13.29,13.08,13.12,26982300\n7-Mar-07,13.25,13.37,13.01,13.05,41899100\n6-Mar-07,13.55,13.60,13.28,13.40,36037700\n5-Mar-07,13.45,13.70,13.35,13.39,25409900\n2-Mar-07,13.73,13.83,13.40,13.56,26806900\n1-Mar-07,13.70,14.10,13.61,13.84,35866000\n28-Feb-07,13.91,14.08,13.74,13.96,30262100\n27-Feb-07,14.30,14.30,13.72,13.75,33390000\n26-Feb-07,14.59,14.59,14.21,14.30,19151000\n23-Feb-07,14.61,14.68,14.34,14.49,18023200\n22-Feb-07,14.79,14.88,14.52,14.64,19303900\n21-Feb-07,14.52,14.89,14.51,14.79,32415800\n20-Feb-07,14.52,14.64,14.49,14.60,12441500\n16-Feb-07,14.69,14.69,14.46,14.60,22744700\n15-Feb-07,14.67,14.79,14.62,14.70,14250400\n14-Feb-07,14.56,14.77,14.40,14.70,23260900\n13-Feb-07,14.67,14.72,14.42,14.49,19490700\n12-Feb-07,14.55,14.65,14.45,14.62,23946400\n9-Feb-07,14.50,14.68,14.38,14.56,36033800\n8-Feb-07,14.66,14.79,14.38,14.50,87955000\n7-Feb-07,13.64,13.69,13.47,13.60,19348500\n6-Feb-07,13.73,13.75,13.54,13.62,17604000\n5-Feb-07,13.80,13.80,13.58,13.69,22654100\n2-Feb-07,13.83,13.92,13.68,13.74,18575200\n1-Feb-07,13.95,14.00,13.49,13.76,35896100\n31-Jan-07,13.90,14.03,13.76,13.99,17189600\n30-Jan-07,13.96,14.03,13.86,13.96,16317400\n29-Jan-07,13.67,14.08,13.67,13.96,25873000\n26-Jan-07,13.96,14.00,13.73,13.74,26102400\n25-Jan-07,13.96,14.15,13.87,13.97,25762300\n24-Jan-07,13.66,14.06,13.65,13.96,37078300\n23-Jan-07,13.66,13.69,13.18,13.55,43958100\n22-Jan-07,13.56,13.65,13.40,13.47,27537200\n19-Jan-07,13.54,13.77,13.50,13.59,26551400\n18-Jan-07,13.87,13.97,13.56,13.75,28257000\n17-Jan-07,14.20,14.24,14.00,14.04,21859000\n16-Jan-07,14.11,14.23,14.04,14.17,24468500\n12-Jan-07,14.28,14.31,14.12,14.26,16354000\n11-Jan-07,14.39,14.48,14.21,14.31,20972400\n10-Jan-07,14.16,14.54,14.10,14.36,47359400\n9-Jan-07,14.14,14.23,13.96,14.16,41423000\n8-Jan-07,13.78,14.23,13.75,14.08,73974100\n5-Jan-07,13.75,13.75,13.42,13.61,24383500\n4-Jan-07,13.14,13.62,13.13,13.53,29308200\n3-Jan-07,13.20,13.39,13.07,13.20,42670400\n29-Dec-06,13.40,13.40,13.20,13.20,24947200\n28-Dec-06,13.40,13.48,13.36,13.37,22298700\n27-Dec-06,13.49,13.55,13.39,13.47,22455400\n26-Dec-06,13.38,13.49,13.37,13.44,13299000\n22-Dec-06,13.50,13.60,13.42,13.42,16315000\n21-Dec-06,13.58,13.79,13.53,13.56,26271800\n20-Dec-06,13.42,13.61,13.39,13.58,31677800\n19-Dec-06,13.23,13.47,13.22,13.42,28804000\n18-Dec-06,13.39,13.52,13.36,13.40,27499900\n15-Dec-06,13.45,13.52,13.30,13.46,42928600\n14-Dec-06,13.10,13.49,13.08,13.36,37229900\n13-Dec-06,13.08,13.18,13.03,13.15,19026300\n12-Dec-06,13.17,13.22,12.86,13.03,27500200\n11-Dec-06,13.13,13.32,13.02,13.22,22410700\n8-Dec-06,13.21,13.27,13.10,13.18,16149900\n7-Dec-06,13.37,13.54,13.15,13.21,27097000\n6-Dec-06,13.50,13.72,13.36,13.41,31646800\n5-Dec-06,13.36,13.55,13.32,13.54,28086200\n4-Dec-06,13.20,13.38,13.15,13.36,18110300\n1-Dec-06,13.22,13.33,13.03,13.18,31609800\n30-Nov-06,12.95,13.22,12.85,13.11,36757700\n29-Nov-06,12.83,13.03,12.81,12.88,18215200\n28-Nov-06,12.84,12.96,12.67,12.89,24184800\n27-Nov-06,13.01,13.09,12.75,12.84,23921800\n24-Nov-06,13.03,13.20,12.99,13.08,4423400\n22-Nov-06,12.90,13.32,12.90,13.20,42866800\n21-Nov-06,12.62,12.97,12.58,12.84,31762900\n20-Nov-06,12.63,12.73,12.57,12.68,19473600\n17-Nov-06,12.75,12.84,12.59,12.72,21274200\n16-Nov-06,12.75,12.91,12.62,12.84,23326400\n15-Nov-06,12.64,12.79,12.60,12.70,23697800\n14-Nov-06,12.61,12.77,12.52,12.69,95405400\n13-Nov-06,12.69,12.90,12.60,12.61,21189000\n10-Nov-06,12.51,12.75,12.43,12.70,15782000\n9-Nov-06,12.20,12.66,12.18,12.43,28609900\n8-Nov-06,12.05,12.19,12.01,12.09,10685000\n7-Nov-06,12.16,12.31,12.06,12.12,17436200\n6-Nov-06,12.14,12.29,12.09,12.16,15980200\n3-Nov-06,12.17,12.25,12.04,12.12,9608800\n2-Nov-06,12.14,12.27,12.01,12.16,10415100\n1-Nov-06,12.34,12.38,12.16,12.21,10811900\n31-Oct-06,12.28,12.38,12.14,12.25,17402000\n30-Oct-06,12.34,12.46,12.25,12.27,17982400\n27-Oct-06,12.50,12.60,12.35,12.42,13855900\n26-Oct-06,12.56,12.79,12.54,12.60,18198200\n25-Oct-06,12.30,12.71,12.23,12.62,20113300\n24-Oct-06,12.22,12.32,12.15,12.27,15963800\n23-Oct-06,12.29,12.37,12.23,12.32,17255000\n20-Oct-06,12.37,12.46,12.10,12.39,17982400\n19-Oct-06,12.50,12.50,12.09,12.35,17035300\n18-Oct-06,12.50,12.52,12.08,12.18,29317800\n17-Oct-06,12.46,12.82,11.93,12.70,50299100\n16-Oct-06,12.64,12.96,12.58,12.83,26483200\n13-Oct-06,12.50,12.81,12.49,12.69,13821500\n12-Oct-06,12.45,12.71,12.44,12.65,14728000\n11-Oct-06,12.41,12.59,12.33,12.44,14299400\n10-Oct-06,12.51,12.63,12.47,12.52,7876100\n9-Oct-06,12.49,12.66,12.41,12.55,9706100\n6-Oct-06,12.20,12.60,12.15,12.55,22209600\n5-Oct-06,12.24,12.39,12.12,12.25,13865600\n4-Oct-06,11.89,12.31,11.86,12.22,19124700\n3-Oct-06,11.75,12.02,11.69,11.89,15587700\n2-Oct-06,11.91,12.04,11.82,11.86,13559200\n29-Sep-06,11.82,12.09,11.80,11.98,14547500\n28-Sep-06,11.90,11.90,11.72,11.87,11775600\n27-Sep-06,11.64,11.91,11.61,11.84,25292800\n26-Sep-06,11.45,11.79,11.40,11.75,22470700\n25-Sep-06,11.30,11.53,11.25,11.46,14051700\n22-Sep-06,11.45,11.46,11.13,11.20,16808400\n21-Sep-06,11.49,11.63,11.39,11.47,17147200\n20-Sep-06,11.20,11.56,11.20,11.49,17346300\n19-Sep-06,11.13,11.20,10.98,11.13,13402500\n18-Sep-06,11.24,11.32,11.07,11.13,22589700\n15-Sep-06,11.43,11.48,11.15,11.25,20913400\n14-Sep-06,11.42,11.49,11.36,11.37,17856200\n13-Sep-06,11.77,11.82,11.46,11.51,21056700\n12-Sep-06,11.70,11.85,11.56,11.77,16166300\n11-Sep-06,11.25,11.71,11.23,11.70,17621200\n8-Sep-06,11.46,11.50,11.22,11.42,12151400\n7-Sep-06,11.32,11.59,11.19,11.34,15438900\n6-Sep-06,11.58,11.69,11.36,11.38,16870200\n5-Sep-06,11.80,11.86,11.64,11.72,19316600\n1-Sep-06,11.68,11.90,11.60,11.85,16709700\n31-Aug-06,11.64,11.73,11.49,11.65,14869800\n30-Aug-06,11.47,11.71,11.36,11.64,18133900\n29-Aug-06,11.28,11.48,11.18,11.43,14432000\n28-Aug-06,11.17,11.38,11.17,11.33,14623200\n25-Aug-06,11.16,11.25,11.14,11.23,7860100\n24-Aug-06,11.10,11.24,11.07,11.22,11587000\n23-Aug-06,11.10,11.18,11.01,11.10,14409000\n22-Aug-06,11.06,11.24,11.03,11.14,14816700\n21-Aug-06,10.97,11.20,10.89,11.12,15360300\n18-Aug-06,11.18,11.18,10.89,11.09,15130500\n17-Aug-06,11.07,11.22,10.81,11.13,25781500\n16-Aug-06,10.98,11.02,10.73,10.97,21993000\n15-Aug-06,10.79,11.00,10.72,10.94,30145000\n14-Aug-06,10.33,10.75,10.24,10.67,37049000\n11-Aug-06,9.93,10.16,9.92,10.15,32481600\n10-Aug-06,9.60,9.95,9.53,9.90,26927300\n9-Aug-06,9.70,9.84,9.63,9.65,13208600\n8-Aug-06,9.70,9.79,9.58,9.67,17248500\n7-Aug-06,9.90,9.93,9.64,9.70,16159100\n4-Aug-06,9.86,9.99,9.75,9.93,21428900\n3-Aug-06,9.58,9.83,9.57,9.75,23567500\n2-Aug-06,9.70,9.76,9.56,9.68,26223100\n1-Aug-06,10.06,10.06,9.66,9.72,37809600\n31-Jul-06,10.17,10.37,10.14,10.15,13175800\n28-Jul-06,10.14,10.30,10.11,10.24,16879500\n27-Jul-06,10.23,10.35,10.14,10.14,11628100\n26-Jul-06,10.17,10.31,10.09,10.23,16704600\n25-Jul-06,10.19,10.37,10.15,10.25,15385000\n24-Jul-06,10.31,10.39,10.10,10.31,14748900\n21-Jul-06,10.44,10.44,10.10,10.30,27488000\n20-Jul-06,10.44,10.52,10.26,10.43,36526800\n19-Jul-06,10.16,10.34,10.06,10.34,24213500\n18-Jul-06,10.10,10.20,10.00,10.15,27501100\n17-Jul-06,9.67,10.20,9.67,10.09,41306000\n14-Jul-06,9.86,9.88,9.44,9.83,56753200\n13-Jul-06,10.44,10.44,9.84,9.98,31843500\n12-Jul-06,10.52,10.52,10.05,10.09,29280700\n"
  },
  {
    "path": "examples/stockserver/F.csv",
    "content": "﻿Date,Open,High,Low,Close,Volume\n9-Jul-12,9.46,9.47,9.31,9.45,37441545\n6-Jul-12,9.47,9.52,9.40,9.50,30362984\n5-Jul-12,9.67,9.74,9.53,9.57,31783831\n3-Jul-12,9.53,9.79,9.49,9.60,49629310\n2-Jul-12,9.50,9.60,9.30,9.39,63406824\n29-Jun-12,9.95,9.98,9.46,9.59,138158551\n28-Jun-12,9.93,10.09,9.93,10.09,38649023\n27-Jun-12,10.05,10.10,9.97,10.02,33283364\n26-Jun-12,10.06,10.08,9.96,10.01,31895220\n25-Jun-12,10.13,10.18,9.95,10.01,44299189\n22-Jun-12,10.35,10.40,10.18,10.19,56547095\n21-Jun-12,10.65,10.68,10.25,10.27,40062708\n20-Jun-12,10.58,10.74,10.52,10.65,40811691\n19-Jun-12,10.37,10.64,10.35,10.56,37162157\n18-Jun-12,10.35,10.40,10.26,10.34,27379767\n15-Jun-12,10.40,10.42,10.26,10.35,39461393\n14-Jun-12,10.27,10.45,10.21,10.41,37539824\n13-Jun-12,10.39,10.48,10.22,10.30,41384185\n12-Jun-12,10.47,10.55,10.31,10.50,35145470\n11-Jun-12,10.77,10.80,10.45,10.45,35811381\n8-Jun-12,10.48,10.68,10.38,10.66,30816637\n7-Jun-12,10.73,10.78,10.52,10.55,33846133\n6-Jun-12,10.29,10.58,10.27,10.57,50461111\n5-Jun-12,10.01,10.24,9.97,10.19,38326250\n4-Jun-12,10.15,10.18,9.91,10.04,57311499\n1-Jun-12,10.33,10.46,10.06,10.12,68237494\n31-May-12,10.62,10.68,10.40,10.56,54328730\n30-May-12,10.73,10.75,10.52,10.66,44601645\n29-May-12,10.69,10.88,10.68,10.84,43785520\n25-May-12,10.61,10.68,10.51,10.60,30441198\n24-May-12,10.50,10.62,10.38,10.59,45334026\n23-May-12,10.32,10.45,10.22,10.41,75648861\n22-May-12,10.25,10.40,10.15,10.19,44295612\n21-May-12,10.02,10.23,10.00,10.20,38137132\n18-May-12,10.08,10.18,9.96,10.01,50571952\n17-May-12,10.16,10.25,10.01,10.01,49660696\n16-May-12,10.23,10.43,10.15,10.16,44321448\n15-May-12,10.34,10.34,10.10,10.15,41923652\n14-May-12,10.41,10.52,10.30,10.32,50225126\n11-May-12,10.61,10.83,10.56,10.58,36568171\n10-May-12,10.83,10.86,10.66,10.71,42526056\n9-May-12,10.48,10.81,10.41,10.69,54512461\n8-May-12,10.60,10.64,10.40,10.61,46195523\n7-May-12,10.53,10.79,10.52,10.66,33246708\n4-May-12,10.84,10.87,10.63,10.67,53268320\n3-May-12,11.13,11.15,10.85,10.92,40243341\n2-May-12,11.16,11.17,11.00,11.10,48572883\n1-May-12,11.25,11.34,11.11,11.23,44020268\n30-Apr-12,11.42,11.57,11.15,11.28,46156263\n27-Apr-12,12.03,12.04,11.52,11.60,76455981\n26-Apr-12,11.71,11.93,11.67,11.87,40894070\n25-Apr-12,11.51,11.75,11.43,11.73,45185958\n24-Apr-12,11.61,11.61,11.36,11.39,38656280\n23-Apr-12,11.15,11.40,11.15,11.35,31311920\n20-Apr-12,11.71,11.72,11.39,11.41,52630916\n19-Apr-12,11.81,11.88,11.58,11.66,48172028\n18-Apr-12,11.81,11.85,11.72,11.79,32328832\n17-Apr-12,11.98,12.00,11.88,11.91,35994575\n16-Apr-12,12.01,12.05,11.83,11.88,31903489\n13-Apr-12,11.98,12.03,11.84,11.92,39707255\n12-Apr-12,11.94,12.13,11.86,12.07,26988802\n11-Apr-12,11.99,12.02,11.88,11.91,34757940\n10-Apr-12,12.19,12.28,11.65,11.79,77373157\n9-Apr-12,12.26,12.29,12.11,12.22,42515285\n5-Apr-12,12.38,12.58,12.38,12.47,37939405\n4-Apr-12,12.46,12.52,12.32,12.50,51507181\n3-Apr-12,12.71,12.95,12.46,12.64,97001437\n2-Apr-12,12.50,12.65,12.44,12.62,43966846\n30-Mar-12,12.55,12.58,12.40,12.48,36391766\n29-Mar-12,12.33,12.52,12.24,12.50,51039792\n28-Mar-12,12.35,12.36,12.18,12.32,41051696\n27-Mar-12,12.51,12.61,12.30,12.32,35070612\n26-Mar-12,12.45,12.50,12.39,12.48,26756784\n23-Mar-12,12.31,12.37,12.18,12.32,44759245\n22-Mar-12,12.48,12.54,12.24,12.32,50125146\n21-Mar-12,12.59,12.67,12.54,12.57,27528439\n20-Mar-12,12.48,12.61,12.39,12.54,40217366\n19-Mar-12,12.52,12.68,12.48,12.63,52445624\n16-Mar-12,12.86,12.90,12.51,12.51,77123724\n15-Mar-12,12.90,13.04,12.83,12.90,55316864\n14-Mar-12,12.64,12.90,12.63,12.88,47578407\n13-Mar-12,12.48,12.72,12.40,12.70,42783564\n12-Mar-12,12.57,12.59,12.37,12.43,30275688\n9-Mar-12,12.53,12.73,12.48,12.58,36162779\n8-Mar-12,12.41,12.55,12.32,12.46,37130354\n7-Mar-12,12.21,12.30,12.15,12.24,28440851\n6-Mar-12,12.23,12.25,12.00,12.09,57374495\n5-Mar-12,12.67,12.68,12.41,12.46,28438485\n2-Mar-12,12.74,12.94,12.68,12.72,49064351\n1-Mar-12,12.48,12.77,12.45,12.66,68263200\n29-Feb-12,12.28,12.55,12.25,12.38,62093651\n28-Feb-12,12.34,12.35,12.20,12.25,30789403\n27-Feb-12,12.11,12.36,11.99,12.30,38703322\n24-Feb-12,12.43,12.46,12.19,12.23,31399272\n23-Feb-12,12.27,12.44,12.16,12.40,36747504\n22-Feb-12,12.49,12.51,12.22,12.28,43325932\n21-Feb-12,12.74,12.76,12.46,12.53,38436319\n17-Feb-12,12.84,12.88,12.71,12.75,30777978\n16-Feb-12,12.38,12.77,12.38,12.74,49166921\n15-Feb-12,12.47,12.57,12.33,12.38,38174730\n14-Feb-12,12.46,12.58,12.34,12.48,39641904\n13-Feb-12,12.74,12.74,12.51,12.54,34474395\n10-Feb-12,12.52,12.66,12.37,12.44,52507996\n9-Feb-12,12.89,12.90,12.67,12.69,52290479\n8-Feb-12,12.91,12.96,12.80,12.84,35352410\n7-Feb-12,12.93,12.97,12.83,12.88,39413408\n6-Feb-12,12.85,13.00,12.71,12.96,46363233\n3-Feb-12,12.47,12.84,12.39,12.79,78851121\n2-Feb-12,12.40,12.43,12.20,12.26,48347559\n1-Feb-12,12.73,12.75,12.29,12.33,71668979\n31-Jan-12,12.47,12.51,12.20,12.42,46425332\n30-Jan-12,12.06,12.44,12.00,12.29,57752526\n27-Jan-12,11.96,12.53,11.79,12.21,142155259\n26-Jan-12,13.03,13.05,12.66,12.79,75470624\n25-Jan-12,12.80,12.98,12.70,12.93,54021553\n24-Jan-12,12.56,12.86,12.46,12.82,45768308\n23-Jan-12,12.69,12.84,12.55,12.66,49388566\n20-Jan-12,12.55,12.64,12.45,12.59,43705665\n19-Jan-12,12.48,12.72,12.43,12.61,70894167\n18-Jan-12,12.03,12.37,12.00,12.34,47102604\n17-Jan-12,12.20,12.26,11.96,12.02,44398472\n13-Jan-12,12.04,12.04,12.04,12.04,0\n12-Jan-12,12.16,12.18,11.89,12.14,48687666\n11-Jan-12,11.74,12.18,11.65,12.07,63806007\n10-Jan-12,12.00,12.05,11.63,11.80,121750545\n9-Jan-12,11.83,11.95,11.70,11.80,53981467\n6-Jan-12,11.74,11.80,11.52,11.71,59840605\n5-Jan-12,11.33,11.63,11.24,11.59,67877467\n4-Jan-12,11.15,11.53,11.07,11.30,79725188\n3-Jan-12,11.00,11.25,10.99,11.13,45709811\n30-Dec-11,10.76,10.76,10.76,10.76,0\n29-Dec-11,10.56,10.75,10.50,10.68,34317002\n28-Dec-11,10.82,10.84,10.43,10.52,33450929\n27-Dec-11,10.87,10.98,10.76,10.81,25444771\n23-Dec-11,10.95,10.95,10.95,10.95,0\n22-Dec-11,10.78,10.98,10.66,10.94,43983068\n21-Dec-11,10.38,10.74,10.33,10.66,56203034\n20-Dec-11,10.21,10.38,10.18,10.33,45235037\n19-Dec-11,10.25,10.39,9.99,10.02,45068191\n16-Dec-11,10.32,10.40,10.16,10.25,45999138\n15-Dec-11,10.31,10.42,10.19,10.25,46640203\n14-Dec-11,10.33,10.41,10.10,10.15,53224204\n13-Dec-11,10.92,11.04,10.36,10.48,67905531\n12-Dec-11,10.87,10.89,10.68,10.85,40785391\n9-Dec-11,10.94,11.11,10.87,11.03,48326563\n8-Dec-11,10.96,11.11,9.84,10.75,82552211\n7-Dec-11,11.00,11.15,10.88,11.08,45168739\n6-Dec-11,11.10,11.19,11.00,11.05,39786084\n5-Dec-11,11.16,11.42,11.02,11.11,65924650\n2-Dec-11,10.79,11.10,10.75,10.90,67252566\n1-Dec-11,10.51,10.81,10.41,10.59,61396936\n30-Nov-11,10.33,10.60,10.17,10.60,66922269\n29-Nov-11,10.03,10.13,9.92,9.99,40449900\n28-Nov-11,10.15,10.19,9.90,10.00,57953210\n25-Nov-11,9.81,9.95,9.75,9.75,20118455\n23-Nov-11,9.83,9.83,9.83,9.83,0\n22-Nov-11,10.02,10.15,9.90,10.09,43750609\n21-Nov-11,9.99,10.12,9.80,10.05,60890045\n18-Nov-11,10.28,10.30,10.07,10.10,44421981\n17-Nov-11,10.54,10.56,10.07,10.17,69670657\n16-Nov-11,10.80,10.82,10.50,10.56,49001246\n15-Nov-11,10.93,11.00,10.82,10.87,43972803\n14-Nov-11,11.12,11.16,10.98,11.02,30530087\n11-Nov-11,11.15,11.18,11.05,11.14,32872316\n10-Nov-11,11.17,11.19,10.90,10.99,50555142\n9-Nov-11,11.20,11.38,10.98,11.04,72025962\n8-Nov-11,11.27,11.68,11.18,11.61,60893327\n7-Nov-11,11.20,11.30,11.06,11.22,39924288\n4-Nov-11,11.28,11.39,11.12,11.27,43133079\n3-Nov-11,11.29,11.39,11.02,11.32,57802143\n2-Nov-11,11.26,11.28,11.04,11.15,52811744\n1-Nov-11,11.33,11.39,11.03,11.08,108259896\n31-Oct-11,11.80,11.91,11.68,11.68,41740335\n28-Oct-11,11.97,12.07,11.86,12.00,60363193\n27-Oct-11,12.29,12.29,11.71,11.97,132558720\n26-Oct-11,12.09,12.20,11.54,11.87,159678574\n25-Oct-11,12.58,12.59,12.14,12.43,77049052\n24-Oct-11,12.31,12.65,12.30,12.51,68986825\n21-Oct-11,11.86,12.32,11.84,12.26,86635929\n20-Oct-11,11.66,11.75,11.47,11.70,62145692\n19-Oct-11,11.77,11.92,11.46,11.56,69510092\n18-Oct-11,11.41,11.93,11.27,11.78,66804196\n17-Oct-11,11.71,11.76,11.32,11.40,53715553\n14-Oct-11,11.58,11.67,11.34,11.56,54535671\n13-Oct-11,11.39,11.46,11.04,11.34,60021259\n12-Oct-11,11.40,11.80,11.38,11.38,82907451\n11-Oct-11,11.17,11.29,11.02,11.24,61331924\n10-Oct-11,10.93,11.23,10.90,11.21,57668189\n7-Oct-11,11.04,11.20,10.63,10.69,87812390\n6-Oct-11,10.61,11.00,10.56,10.99,86277475\n5-Oct-11,10.06,10.59,9.83,10.56,96318030\n4-Oct-11,9.22,10.13,9.05,10.08,103876086\n3-Oct-11,9.66,9.92,9.36,9.37,72828062\n30-Sep-11,9.89,10.01,9.65,9.67,56819921\n29-Sep-11,10.14,10.15,9.75,10.00,52634778\n28-Sep-11,10.18,10.22,9.90,9.93,43567629\n27-Sep-11,10.32,10.35,10.09,10.12,65062161\n26-Sep-11,9.96,10.09,9.70,10.08,54424782\n23-Sep-11,9.46,9.98,9.32,9.86,70702512\n22-Sep-11,9.79,10.14,9.43,9.62,115851051\n21-Sep-11,10.40,10.51,9.97,9.97,62309204\n20-Sep-11,10.61,10.65,10.41,10.42,37706895\n19-Sep-11,10.34,10.62,10.30,10.54,41663812\n16-Sep-11,10.62,10.69,10.35,10.62,46859485\n15-Sep-11,10.45,10.64,10.32,10.63,53843175\n14-Sep-11,10.25,10.50,10.04,10.32,70810171\n13-Sep-11,10.16,10.23,10.00,10.17,44205212\n12-Sep-11,9.86,10.14,9.85,10.11,58351992\n9-Sep-11,10.11,10.29,9.98,10.05,69911239\n8-Sep-11,10.49,10.64,10.27,10.34,45105413\n7-Sep-11,10.44,10.58,10.32,10.56,45052705\n6-Sep-11,10.02,10.27,10.00,10.22,65565561\n2-Sep-11,10.53,10.68,10.26,10.42,62020998\n1-Sep-11,11.14,11.27,10.81,10.85,64030914\n31-Aug-11,11.03,11.30,10.98,11.12,69283535\n30-Aug-11,10.87,10.96,10.64,10.87,50354267\n29-Aug-11,10.64,10.95,10.61,10.93,48857873\n26-Aug-11,10.18,10.53,10.06,10.40,59398645\n25-Aug-11,10.53,10.72,10.22,10.28,50165968\n24-Aug-11,10.31,10.46,10.13,10.45,53035499\n23-Aug-11,10.16,10.32,10.01,10.31,52107590\n22-Aug-11,10.39,10.39,9.81,10.01,73424426\n19-Aug-11,10.05,10.45,9.90,9.99,87207193\n18-Aug-11,10.67,10.70,10.22,10.38,87187860\n17-Aug-11,11.34,11.40,10.92,11.11,52261955\n16-Aug-11,11.23,11.45,11.05,11.22,53398182\n15-Aug-11,11.29,11.37,11.17,11.35,46295976\n12-Aug-11,11.29,11.31,11.00,11.06,79279260\n11-Aug-11,10.48,11.12,10.43,10.94,114926740\n10-Aug-11,10.82,10.87,10.32,10.41,119886418\n9-Aug-11,10.50,10.95,10.13,10.91,177330887\n8-Aug-11,10.02,10.42,9.87,9.93,202155836\n5-Aug-11,11.05,11.23,10.32,10.84,139254160\n4-Aug-11,11.49,11.51,10.77,10.86,153368729\n3-Aug-11,11.92,11.92,11.36,11.65,127291409\n2-Aug-11,12.28,12.35,11.82,11.85,97171075\n1-Aug-11,12.75,12.81,12.21,12.35,73793512\n29-Jul-11,12.11,12.42,12.00,12.21,68621558\n28-Jul-11,12.40,12.65,12.30,12.32,69884577\n27-Jul-11,12.80,12.85,12.30,12.37,113808513\n26-Jul-11,13.30,13.44,12.85,12.94,109165793\n25-Jul-11,13.04,13.24,13.01,13.17,45334208\n22-Jul-11,13.29,13.34,13.15,13.31,26480521\n21-Jul-11,13.16,13.32,13.08,13.28,43706220\n20-Jul-11,13.19,13.19,12.92,13.08,33450613\n19-Jul-11,13.00,13.18,12.86,13.09,53892574\n18-Jul-11,13.02,13.06,12.63,12.90,66084747\n15-Jul-11,13.14,13.20,13.00,13.09,41225026\n14-Jul-11,13.33,13.40,13.04,13.09,45988916\n13-Jul-11,13.30,13.43,13.23,13.27,44328129\n12-Jul-11,13.13,13.38,13.12,13.12,57768853\n11-Jul-11,13.64,13.69,13.26,13.32,61376128\n8-Jul-11,13.86,13.90,13.61,13.88,68554677\n7-Jul-11,14.13,14.22,13.90,14.12,66182741\n6-Jul-11,14.13,14.13,13.89,13.96,46235125\n5-Jul-11,14.07,14.18,13.91,14.10,47019360\n1-Jul-11,14.02,14.02,14.02,14.02,0\n30-Jun-11,13.46,13.97,13.36,13.79,74123979\n29-Jun-11,13.41,13.51,13.32,13.42,54119696\n28-Jun-11,13.55,13.55,13.25,13.33,54017533\n27-Jun-11,13.35,13.55,13.08,13.46,50006278\n24-Jun-11,13.52,13.60,13.14,13.24,82743569\n23-Jun-11,13.12,13.50,13.06,13.47,59361890\n22-Jun-11,13.39,13.50,13.33,13.36,42589488\n21-Jun-11,13.08,13.53,13.04,13.32,72508028\n20-Jun-11,12.66,13.03,12.65,12.94,51392723\n17-Jun-11,12.94,12.95,12.68,12.77,81066976\n16-Jun-11,13.05,13.18,12.68,12.83,91842138\n15-Jun-11,13.30,13.36,13.05,13.15,88736541\n14-Jun-11,13.29,13.56,13.25,13.43,61363130\n13-Jun-11,13.14,13.26,12.78,13.14,110748300\n10-Jun-11,13.68,13.74,13.33,13.35,96683964\n9-Jun-11,13.74,13.87,13.58,13.80,55365380\n8-Jun-11,13.96,14.01,13.65,13.70,77161619\n7-Jun-11,14.17,14.19,13.94,13.95,73293864\n6-Jun-11,13.99,14.12,13.86,13.91,54183566\n3-Jun-11,13.88,14.22,13.81,14.01,57295847\n2-Jun-11,14.26,14.36,14.08,14.18,58588036\n1-Jun-11,14.78,14.90,14.20,14.23,91509302\n31-May-11,14.75,14.92,14.64,14.92,66438849\n27-May-11,14.60,14.60,14.60,14.60,0\n26-May-11,14.51,14.60,14.40,14.56,45970450\n25-May-11,14.54,14.66,14.35,14.58,93974517\n24-May-11,14.84,14.85,14.56,14.66,48890244\n23-May-11,14.70,14.93,14.65,14.80,49541838\n20-May-11,15.05,15.11,14.96,15.00,39287519\n19-May-11,15.10,15.17,15.01,15.12,38719619\n18-May-11,15.01,15.16,14.87,15.12,41282699\n17-May-11,15.06,15.18,14.82,14.97,65269787\n16-May-11,15.21,15.32,15.10,15.13,51708487\n13-May-11,15.22,15.30,15.03,15.08,43326601\n12-May-11,15.14,15.34,15.12,15.26,48857713\n11-May-11,15.11,15.35,15.06,15.15,55013859\n10-May-11,15.13,15.20,15.08,15.15,36654647\n9-May-11,15.12,15.20,15.02,15.08,33380688\n6-May-11,15.26,15.37,15.08,15.11,58410707\n5-May-11,14.97,15.30,14.88,15.08,62569512\n4-May-11,15.42,15.45,14.97,15.15,71777920\n3-May-11,15.42,15.56,15.26,15.38,68681528\n2-May-11,15.52,15.69,15.41,15.45,42187417\n29-Apr-11,15.49,15.68,15.40,15.47,40215803\n28-Apr-11,15.47,15.70,15.42,15.50,48148279\n27-Apr-11,15.85,15.87,15.42,15.58,84395991\n26-Apr-11,16.04,16.18,15.66,15.66,166852661\n25-Apr-11,15.51,15.59,15.35,15.54,54777113\n21-Apr-11,15.43,15.43,15.43,15.43,0\n20-Apr-11,14.95,15.20,14.84,15.09,71006212\n19-Apr-11,14.65,14.79,14.54,14.66,33587928\n18-Apr-11,14.51,14.74,14.48,14.62,49845385\n15-Apr-11,14.86,14.90,14.61,14.71,47501401\n14-Apr-11,14.74,14.85,14.61,14.81,62386526\n13-Apr-11,15.04,15.05,14.80,14.98,58745733\n12-Apr-11,14.59,15.00,14.50,14.91,82765424\n11-Apr-11,15.27,15.40,14.74,14.86,85631643\n8-Apr-11,15.65,15.68,15.16,15.33,51197794\n7-Apr-11,15.71,15.82,15.45,15.53,51336115\n6-Apr-11,15.91,15.98,15.61,15.73,62322453\n5-Apr-11,15.65,15.81,15.55,15.79,72461668\n4-Apr-11,15.39,15.74,15.39,15.55,99126393\n1-Apr-11,15.03,15.42,14.92,15.16,116309235\n31-Mar-11,14.82,14.95,14.71,14.91,41975807\n30-Mar-11,14.88,14.97,14.74,14.86,40931267\n29-Mar-11,14.83,14.94,14.73,14.84,33304615\n28-Mar-11,14.99,15.09,14.83,14.86,41290304\n25-Mar-11,15.20,15.20,14.90,15.01,58966447\n24-Mar-11,14.40,15.12,14.39,15.04,128208211\n23-Mar-11,14.26,14.45,14.02,14.31,64447276\n22-Mar-11,14.52,14.57,14.32,14.34,44832909\n21-Mar-11,14.70,14.72,14.48,14.59,46489639\n18-Mar-11,14.58,14.67,14.43,14.49,64591395\n17-Mar-11,14.56,14.58,14.18,14.26,78692268\n16-Mar-11,14.73,14.79,13.89,14.18,127903799\n15-Mar-11,13.80,14.80,13.75,14.67,109083449\n14-Mar-11,14.47,14.64,14.20,14.30,65186535\n11-Mar-11,13.90,14.46,13.87,14.36,72258870\n10-Mar-11,14.10,14.28,14.01,14.06,107253551\n9-Mar-11,14.59,14.60,14.25,14.29,68056849\n8-Mar-11,14.02,14.55,14.01,14.47,106709696\n7-Mar-11,14.34,14.42,13.98,14.01,105402075\n4-Mar-11,14.79,14.79,14.28,14.42,81624975\n3-Mar-11,14.90,14.95,14.66,14.76,66722161\n2-Mar-11,14.66,14.89,14.62,14.66,67126967\n1-Mar-11,15.10,15.12,14.60,14.66,74339127\n28-Feb-11,15.29,15.29,14.89,15.05,54120693\n25-Feb-11,14.94,15.11,14.85,15.07,78341802\n24-Feb-11,14.56,14.99,14.50,14.70,120283515\n23-Feb-11,15.02,15.04,14.49,14.86,159528736\n22-Feb-11,15.36,15.52,15.08,15.23,97449876\n18-Feb-11,15.77,15.77,15.77,15.77,0\n17-Feb-11,16.01,16.03,15.83,15.97,53727532\n16-Feb-11,16.16,16.18,16.00,16.05,59843528\n15-Feb-11,16.03,16.16,15.95,16.10,51612779\n14-Feb-11,16.38,16.39,16.02,16.09,69632700\n11-Feb-11,16.06,16.51,15.99,16.38,94736828\n10-Feb-11,15.99,16.11,15.90,15.95,65334899\n9-Feb-11,16.13,16.30,16.02,16.09,61896699\n8-Feb-11,16.17,16.26,16.02,16.24,59674450\n7-Feb-11,15.84,16.36,15.80,16.11,118132832\n4-Feb-11,15.91,15.95,15.64,15.72,79198641\n3-Feb-11,15.38,15.78,15.10,15.76,153131241\n2-Feb-11,15.91,15.98,15.31,15.40,187008426\n1-Feb-11,16.14,16.24,15.85,15.89,178894220\n31-Jan-11,16.56,16.64,15.45,15.95,275198179\n28-Jan-11,17.79,17.88,15.98,16.27,480879432\n27-Jan-11,18.52,18.88,18.33,18.79,67711652\n26-Jan-11,17.97,18.43,17.90,18.37,66834054\n25-Jan-11,17.86,18.02,17.66,17.89,47155738\n24-Jan-11,18.02,18.02,17.75,17.93,51698556\n21-Jan-11,17.99,18.11,17.87,17.95,48717631\n20-Jan-11,17.77,18.00,17.35,17.78,93501514\n19-Jan-11,18.71,18.72,17.77,17.90,89216412\n18-Jan-11,18.66,18.77,18.61,18.70,39737433\n14-Jan-11,18.65,18.65,18.65,18.65,0\n13-Jan-11,18.81,18.97,18.55,18.68,100531394\n12-Jan-11,18.36,18.75,18.29,18.71,66841388\n11-Jan-11,18.48,18.49,18.13,18.28,61312456\n10-Jan-11,18.42,18.49,18.16,18.31,65348361\n7-Jan-11,18.42,18.42,18.08,18.27,99029495\n6-Jan-11,18.03,18.29,17.95,18.22,96284315\n5-Jan-11,17.31,18.09,17.22,17.89,112377964\n4-Jan-11,17.39,17.66,16.96,17.38,106477140\n3-Jan-11,17.02,17.31,17.00,17.25,70794151\n31-Dec-10,16.65,16.83,16.61,16.79,22425965\n30-Dec-10,16.72,16.85,16.65,16.69,24055098\n29-Dec-10,16.67,16.80,16.65,16.74,25556654\n28-Dec-10,16.83,16.85,16.65,16.73,28413190\n27-Dec-10,16.72,16.87,16.60,16.87,27710072\n23-Dec-10,16.78,16.78,16.78,16.78,0\n22-Dec-10,17.00,17.03,16.85,16.99,31602612\n21-Dec-10,16.89,17.00,16.84,16.99,35603998\n20-Dec-10,16.85,16.90,16.63,16.85,41879929\n17-Dec-10,16.76,16.85,16.68,16.80,51948040\n16-Dec-10,16.52,16.77,16.44,16.77,49567513\n15-Dec-10,16.37,16.66,16.35,16.55,44901192\n14-Dec-10,16.50,16.58,16.39,16.42,43069921\n13-Dec-10,16.65,16.72,16.47,16.47,53899674\n10-Dec-10,16.68,16.77,16.65,16.73,38195991\n9-Dec-10,16.82,16.85,16.66,16.76,47280901\n8-Dec-10,16.66,16.73,16.35,16.69,106699902\n7-Dec-10,16.91,16.92,16.55,16.56,64104224\n6-Dec-10,16.66,16.78,16.52,16.65,57290297\n3-Dec-10,16.63,16.83,16.60,16.80,67399413\n2-Dec-10,16.72,16.86,16.63,16.78,82484417\n1-Dec-10,16.24,16.50,16.14,16.46,100724326\n30-Nov-10,15.92,15.99,15.83,15.94,71737337\n29-Nov-10,16.12,16.12,15.86,16.06,61577444\n26-Nov-10,15.81,16.18,15.75,16.10,31557182\n24-Nov-10,15.95,15.95,15.95,15.95,0\n23-Nov-10,16.01,16.16,15.62,15.70,96689061\n22-Nov-10,16.26,16.54,16.11,16.20,91288839\n19-Nov-10,16.02,16.38,15.83,16.28,130323560\n18-Nov-10,16.77,16.87,16.05,16.12,256937875\n17-Nov-10,16.76,16.90,16.52,16.68,127748531\n16-Nov-10,17.19,17.42,16.36,16.51,234693760\n15-Nov-10,16.81,17.41,16.68,17.00,233268384\n12-Nov-10,16.46,16.53,16.04,16.30,91657062\n11-Nov-10,16.54,16.66,16.20,16.61,94746122\n10-Nov-10,16.32,16.71,16.08,16.63,139738159\n9-Nov-10,16.53,16.58,15.88,16.07,133717281\n8-Nov-10,16.36,16.49,16.06,16.41,127385974\n5-Nov-10,15.98,16.26,15.81,16.21,141539803\n4-Nov-10,15.51,15.98,15.40,15.86,193231920\n3-Nov-10,14.48,15.20,14.44,15.18,185668472\n2-Nov-10,14.32,14.46,14.22,14.43,54691083\n1-Nov-10,14.32,14.37,14.16,14.23,56605930\n29-Oct-10,14.18,14.23,14.10,14.13,52281827\n28-Oct-10,14.29,14.32,14.06,14.22,51719343\n27-Oct-10,14.34,14.35,14.09,14.23,81025687\n26-Oct-10,13.97,14.47,13.76,14.36,214814344\n25-Oct-10,14.05,14.20,14.01,14.15,77370708\n22-Oct-10,13.86,14.01,13.83,13.95,38003004\n21-Oct-10,13.78,14.16,13.66,13.81,85364910\n20-Oct-10,13.45,13.73,13.35,13.64,60800122\n19-Oct-10,13.63,13.64,13.18,13.32,84613958\n18-Oct-10,13.75,13.90,13.64,13.88,34938390\n15-Oct-10,14.00,14.04,13.61,13.80,61337649\n14-Oct-10,13.88,14.01,13.78,13.91,78814036\n13-Oct-10,13.90,13.91,13.64,13.64,59061809\n12-Oct-10,13.71,13.85,13.51,13.78,50056386\n11-Oct-10,13.72,13.90,13.68,13.78,48002802\n8-Oct-10,13.30,13.72,13.28,13.66,71857622\n7-Oct-10,13.32,13.38,13.19,13.32,53526635\n6-Oct-10,13.06,13.45,13.04,13.24,92325959\n5-Oct-10,13.00,13.07,12.92,13.01,74701900\n4-Oct-10,12.57,12.92,12.53,12.84,95949136\n1-Oct-10,12.35,12.41,12.12,12.26,54565409\n30-Sep-10,12.44,12.46,12.20,12.24,42679587\n29-Sep-10,12.45,12.50,12.28,12.33,45211770\n28-Sep-10,12.48,12.53,12.27,12.52,42674616\n27-Sep-10,12.57,12.60,12.46,12.48,28805227\n24-Sep-10,12.42,12.57,12.38,12.56,42647786\n23-Sep-10,12.26,12.45,12.15,12.31,46873328\n22-Sep-10,12.43,12.54,12.29,12.38,53190343\n21-Sep-10,12.53,12.75,12.51,12.55,59130813\n20-Sep-10,12.55,12.60,12.38,12.57,49864507\n17-Sep-10,12.53,12.54,12.34,12.49,68954533\n16-Sep-10,12.12,12.53,12.10,12.44,141408427\n15-Sep-10,11.93,11.96,11.76,11.87,54102615\n14-Sep-10,11.96,12.05,11.89,11.98,39772203\n13-Sep-10,11.93,12.00,11.84,11.99,36689671\n10-Sep-10,11.81,11.98,11.75,11.79,37858737\n9-Sep-10,11.96,12.04,11.64,11.75,48528444\n8-Sep-10,11.81,11.95,11.70,11.80,40798682\n7-Sep-10,12.01,12.07,11.78,11.80,42497553\n6-Sep-10,12.07,12.07,12.07,12.07,0\n3-Sep-10,12.07,12.07,12.07,12.07,0\n2-Sep-10,11.68,11.83,11.57,11.71,39943541\n1-Sep-10,11.53,11.89,11.46,11.61,81988740\n31-Aug-10,11.27,11.46,11.13,11.28,64987238\n30-Aug-10,11.58,11.68,11.35,11.35,33651452\n27-Aug-10,11.26,11.72,11.05,11.56,63568930\n26-Aug-10,11.40,11.56,11.14,11.17,56953578\n25-Aug-10,11.04,11.40,10.95,11.32,78587068\n24-Aug-10,11.28,11.49,11.09,11.24,86304094\n23-Aug-10,11.84,11.90,11.60,11.61,42449574\n20-Aug-10,11.85,11.90,11.60,11.77,50814381\n19-Aug-10,12.13,12.20,11.83,11.89,61058938\n18-Aug-10,12.17,12.29,11.80,12.20,54218032\n17-Aug-10,12.20,12.38,12.06,12.16,61043477\n16-Aug-10,11.96,12.15,11.88,11.99,59316046\n13-Aug-10,12.25,12.37,12.13,12.15,41635476\n12-Aug-10,12.03,12.39,11.90,12.27,68017892\n11-Aug-10,12.65,12.67,12.33,12.41,68132071\n10-Aug-10,12.94,13.03,12.80,12.92,50265042\n9-Aug-10,13.12,13.12,12.92,13.05,39071979\n6-Aug-10,12.83,13.05,12.80,13.04,54704554\n5-Aug-10,13.05,13.05,12.90,12.98,51574777\n4-Aug-10,13.00,13.21,12.95,13.11,60874915\n3-Aug-10,13.08,13.24,12.77,12.91,115202546\n2-Aug-10,13.06,13.20,12.94,13.16,77124699\n30-Jul-10,12.81,13.01,12.58,12.77,79539674\n29-Jul-10,13.03,13.11,12.72,12.97,88544652\n28-Jul-10,12.99,13.08,12.86,12.91,59746681\n27-Jul-10,13.16,13.18,12.85,13.03,97305386\n26-Jul-10,12.82,13.15,12.75,12.94,125629576\n23-Jul-10,12.55,12.75,12.35,12.72,161608161\n22-Jul-10,11.76,12.22,11.75,12.09,102031465\n21-Jul-10,11.82,11.88,11.43,11.55,67645077\n20-Jul-10,11.30,11.76,11.25,11.75,53134811\n19-Jul-10,11.44,11.57,11.23,11.48,49909940\n16-Jul-10,11.75,11.78,11.30,11.34,68905417\n15-Jul-10,11.86,11.90,11.51,11.86,66020324\n14-Jul-10,11.62,11.92,11.54,11.81,68051369\n13-Jul-10,11.47,11.81,11.26,11.66,103923173\n12-Jul-10,10.84,11.13,10.83,11.10,56354088\n9-Jul-10,10.58,10.94,10.54,10.85,50732694\n8-Jul-10,10.72,10.83,10.45,10.62,62355431\n7-Jul-10,10.21,10.63,10.17,10.59,72565217\n6-Jul-10,10.42,10.57,10.04,10.16,81246930\n5-Jul-10,10.28,10.28,10.28,10.28,0\n2-Jul-10,10.28,10.28,10.28,10.28,0\n1-Jul-10,10.23,10.63,10.02,10.57,153382992\n30-Jun-10,10.10,10.52,10.04,10.08,182831251\n29-Jun-10,10.12,10.14,9.75,9.88,124866691\n28-Jun-10,10.72,10.76,10.43,10.43,58047664\n25-Jun-10,10.75,10.77,10.42,10.75,148168302\n24-Jun-10,10.99,11.03,10.64,10.78,74491022\n23-Jun-10,11.23,11.28,11.00,11.03,83134347\n22-Jun-10,11.54,11.60,11.18,11.22,73508927\n21-Jun-10,11.68,11.80,11.50,11.53,67814207\n18-Jun-10,11.56,11.62,11.40,11.46,55417627\n17-Jun-10,11.61,11.69,11.33,11.48,69430015\n16-Jun-10,11.65,11.77,11.50,11.63,61954013\n15-Jun-10,11.55,11.76,11.52,11.70,51790894\n14-Jun-10,11.48,11.72,11.40,11.46,58144434\n11-Jun-10,11.23,11.47,11.21,11.40,50280574\n10-Jun-10,11.21,11.40,11.10,11.39,64799501\n9-Jun-10,11.36,11.40,11.00,11.05,74947546\n8-Jun-10,11.14,11.37,10.89,11.22,81494388\n7-Jun-10,11.45,11.50,11.06,11.09,76228961\n4-Jun-10,11.69,11.88,11.39,11.50,83480811\n3-Jun-10,12.01,12.15,11.81,11.96,79568677\n2-Jun-10,11.66,11.87,11.45,11.85,87265270\n1-Jun-10,11.50,11.88,11.38,11.41,80977225\n31-May-10,11.73,11.73,11.73,11.73,0\n28-May-10,11.73,11.73,11.73,11.73,0\n27-May-10,11.85,12.00,11.66,11.99,90700767\n26-May-10,11.45,11.82,11.35,11.39,146871969\n25-May-10,10.47,11.05,10.42,11.02,137858602\n24-May-10,11.29,11.44,11.01,11.01,91090354\n21-May-10,10.25,11.30,10.17,11.26,174455038\n20-May-10,11.04,11.30,10.76,10.80,156449148\n19-May-10,11.30,11.66,11.11,11.55,132864329\n18-May-10,12.15,12.18,11.45,11.54,101318746\n17-May-10,12.08,12.18,11.49,11.95,108686652\n14-May-10,12.25,12.35,11.87,12.11,105855905\n13-May-10,12.87,12.87,12.32,12.42,100159960\n12-May-10,12.57,12.71,12.49,12.68,102656959\n11-May-10,11.99,12.56,11.85,12.31,125738941\n10-May-10,12.54,12.56,12.02,12.15,134388670\n7-May-10,11.95,11.97,10.95,11.51,261066492\n6-May-10,12.17,12.51,10.59,11.78,237086247\n5-May-10,12.32,12.70,11.59,12.34,198525532\n4-May-10,13.07,13.08,12.75,12.85,123207308\n3-May-10,13.18,13.49,13.18,13.30,106416777\n30-Apr-10,13.64,13.73,12.96,13.02,146322816\n29-Apr-10,13.45,13.70,13.38,13.58,110114356\n28-Apr-10,13.39,13.45,12.90,13.25,208023452\n27-Apr-10,14.44,14.50,13.15,13.57,292667383\n26-Apr-10,14.39,14.57,14.28,14.46,123029116\n23-Apr-10,14.22,14.39,14.11,14.21,92002193\n22-Apr-10,14.00,14.23,13.85,14.20,93331069\n21-Apr-10,14.02,14.15,13.92,14.13,120393065\n20-Apr-10,13.72,13.94,13.67,13.91,75630699\n19-Apr-10,13.38,13.75,13.36,13.60,95855052\n16-Apr-10,13.84,13.92,13.30,13.42,149644441\n15-Apr-10,13.42,13.88,13.41,13.76,159110456\n14-Apr-10,12.92,13.43,12.86,13.35,153602044\n13-Apr-10,12.75,12.89,12.71,12.79,71008470\n12-Apr-10,12.72,12.81,12.64,12.77,50783053\n9-Apr-10,12.73,12.84,12.61,12.72,60408583\n8-Apr-10,12.55,12.71,12.34,12.63,77491353\n7-Apr-10,12.69,12.82,12.53,12.58,88112383\n6-Apr-10,12.78,12.88,12.60,12.70,76423715\n5-Apr-10,12.89,12.92,12.76,12.77,88957147\n2-Apr-10,12.63,12.63,12.63,12.63,0\n1-Apr-10,12.63,12.63,12.63,12.63,0\n31-Mar-10,12.82,12.95,12.42,12.57,433659040\n30-Mar-10,13.55,13.64,13.18,13.28,142055129\n29-Mar-10,13.70,13.88,13.39,13.57,158224973\n26-Mar-10,13.89,13.98,13.76,13.86,60400334\n25-Mar-10,14.05,14.12,13.76,13.80,88909207\n24-Mar-10,13.77,14.05,13.76,13.90,91820854\n23-Mar-10,14.17,14.30,13.81,13.90,167002341\n22-Mar-10,12.98,14.00,12.81,13.99,170576031\n19-Mar-10,13.91,13.92,13.04,13.29,252413612\n18-Mar-10,14.23,14.54,13.65,13.73,235094317\n17-Mar-10,13.55,14.15,13.55,14.10,137318668\n16-Mar-10,13.49,13.51,13.32,13.49,74692616\n15-Mar-10,13.46,13.63,13.32,13.40,95198188\n12-Mar-10,13.02,13.37,12.98,13.34,104770909\n11-Mar-10,12.79,12.97,12.75,12.91,59385985\n10-Mar-10,12.88,12.95,12.80,12.82,56850540\n9-Mar-10,12.83,13.03,12.73,12.80,83934217\n8-Mar-10,12.94,12.96,12.79,12.93,78903174\n5-Mar-10,12.92,13.04,12.83,13.00,106920602\n4-Mar-10,12.78,12.80,12.52,12.79,89836710\n3-Mar-10,12.46,12.83,12.35,12.69,157004555\n2-Mar-10,12.62,12.68,12.18,12.22,193706534\n1-Mar-10,11.81,12.42,11.75,12.41,142605445\n26-Feb-10,11.83,11.85,11.61,11.74,72368345\n25-Feb-10,11.53,11.83,11.40,11.78,83114433\n24-Feb-10,11.72,11.88,11.65,11.73,84200733\n23-Feb-10,11.18,11.63,11.15,11.60,114688393\n22-Feb-10,11.36,11.38,11.18,11.21,41993070\n19-Feb-10,11.35,11.40,11.26,11.29,46989996\n18-Feb-10,11.41,11.48,11.29,11.38,53406735\n17-Feb-10,11.43,11.52,11.35,11.49,65983124\n16-Feb-10,11.21,11.38,11.11,11.32,62537480\n15-Feb-10,11.12,11.12,11.12,11.12,0\n12-Feb-10,11.12,11.12,11.12,11.12,0\n11-Feb-10,11.00,11.18,10.88,11.18,65116156\n10-Feb-10,11.12,11.14,10.90,10.94,73395561\n9-Feb-10,11.18,11.22,11.02,11.15,83207091\n8-Feb-10,11.09,11.32,10.88,10.97,92031327\n5-Feb-10,10.97,11.11,10.49,10.91,181535182\n4-Feb-10,11.49,11.53,11.00,11.06,129792142\n3-Feb-10,11.49,11.66,11.42,11.64,90125495\n2-Feb-10,11.26,11.52,11.19,11.39,119785377\n1-Feb-10,11.14,11.18,10.93,11.12,82748130\n29-Jan-10,11.60,11.61,10.70,10.84,159741164\n28-Jan-10,11.90,11.95,11.27,11.41,203466724\n27-Jan-10,11.57,11.62,11.22,11.55,105091531\n26-Jan-10,11.17,11.46,11.07,11.19,108250462\n25-Jan-10,10.73,11.10,10.61,11.03,121621423\n22-Jan-10,11.01,11.12,10.41,10.52,161530010\n21-Jan-10,11.53,11.62,11.01,11.18,121451396\n20-Jan-10,11.68,11.69,11.50,11.51,71649459\n19-Jan-10,11.51,11.83,11.46,11.75,65933944\n18-Jan-10,11.60,11.60,11.60,11.60,0\n15-Jan-10,11.60,11.60,11.60,11.60,0\n14-Jan-10,11.65,11.86,11.51,11.76,116572673\n13-Jan-10,11.91,11.93,11.47,11.68,154527028\n12-Jan-10,11.98,12.03,11.72,11.87,162995898\n11-Jan-10,11.90,12.14,11.78,12.11,170626174\n8-Jan-10,11.67,11.74,11.46,11.69,130462912\n7-Jan-10,11.46,11.69,11.32,11.66,130201626\n6-Jan-10,11.21,11.46,11.13,11.37,200070554\n5-Jan-10,10.45,11.24,10.40,10.96,215620138\n4-Jan-10,10.17,10.28,10.05,10.28,60855796\n1-Jan-10,10.00,10.00,10.00,10.00,0\n31-Dec-09,10.00,10.00,10.00,10.00,0\n30-Dec-09,10.05,10.08,9.89,9.99,46699554\n29-Dec-09,10.27,10.29,10.09,10.11,40821576\n28-Dec-09,10.18,10.37,10.15,10.20,53979864\n25-Dec-09,10.13,10.13,10.13,10.13,0\n24-Dec-09,10.17,10.20,10.06,10.13,24895639\n23-Dec-09,10.01,10.11,9.93,10.08,64814927\n22-Dec-09,9.79,9.90,9.71,9.90,50860278\n21-Dec-09,9.77,9.80,9.63,9.67,53385672\n18-Dec-09,9.56,9.73,9.47,9.68,88033030\n17-Dec-09,9.49,9.56,9.33,9.39,55724548\n16-Dec-09,9.44,9.64,9.41,9.49,71460489\n15-Dec-09,9.04,9.46,9.03,9.39,109417839\n14-Dec-09,9.00,9.10,8.97,9.08,37983689\n11-Dec-09,9.09,9.10,8.98,9.00,63474681\n10-Dec-09,8.94,9.09,8.90,9.05,63643648\n9-Dec-09,8.87,9.01,8.80,8.86,52861849\n8-Dec-09,8.87,8.89,8.76,8.82,57472929\n7-Dec-09,8.90,9.00,8.80,8.91,41476233\n4-Dec-09,9.10,9.14,8.78,8.94,79533465\n3-Dec-09,9.05,9.11,8.89,8.94,57935316\n2-Dec-09,8.94,9.07,8.91,9.01,63656537\n1-Dec-09,9.01,9.07,8.81,8.88,104011657\n30-Nov-09,8.78,8.92,8.67,8.89,58900088\n27-Nov-09,8.50,8.81,8.40,8.73,42185217\n26-Nov-09,8.81,8.81,8.81,8.81,0\n25-Nov-09,8.87,8.90,8.76,8.81,26922516\n24-Nov-09,8.80,8.83,8.65,8.81,47088333\n23-Nov-09,8.84,8.91,8.67,8.73,61341703\n20-Nov-09,8.63,8.78,8.58,8.64,59314667\n19-Nov-09,8.82,8.82,8.55,8.73,90625717\n18-Nov-09,9.00,9.14,8.80,8.94,120432736\n17-Nov-09,8.78,9.00,8.75,8.98,126809573\n16-Nov-09,8.51,8.79,8.50,8.71,121769201\n13-Nov-09,8.25,8.45,8.24,8.41,86202117\n12-Nov-09,8.25,8.44,8.17,8.20,86560227\n11-Nov-09,8.33,8.40,8.26,8.33,89389979\n10-Nov-09,8.15,8.35,8.04,8.24,136649746\n9-Nov-09,7.78,8.18,7.75,8.18,203287873\n6-Nov-09,7.40,7.75,7.34,7.75,159975746\n5-Nov-09,7.36,7.50,7.32,7.45,125050122\n4-Nov-09,7.35,7.43,7.24,7.27,240095189\n3-Nov-09,7.35,7.67,7.31,7.44,193783084\n2-Nov-09,7.73,7.84,7.35,7.58,208718310\n30-Oct-09,7.28,7.30,6.81,7.00,95737431\n29-Oct-09,7.14,7.35,7.06,7.30,69469866\n28-Oct-09,7.27,7.34,6.89,6.96,94665297\n27-Oct-09,7.48,7.53,7.17,7.33,72986774\n26-Oct-09,7.70,7.84,7.40,7.47,60580330\n23-Oct-09,7.82,7.84,7.55,7.63,47705550\n22-Oct-09,7.73,7.87,7.62,7.76,53432370\n21-Oct-09,7.69,7.98,7.65,7.78,69777123\n20-Oct-09,7.66,7.83,7.65,7.71,50103971\n19-Oct-09,7.54,7.68,7.42,7.57,62833886\n16-Oct-09,7.56,7.59,7.40,7.42,47371252\n15-Oct-09,7.61,7.74,7.61,7.66,40371193\n14-Oct-09,7.80,7.81,7.61,7.66,58858113\n13-Oct-09,7.58,7.88,7.51,7.62,100372000\n12-Oct-09,7.19,7.83,7.16,7.62,152372678\n9-Oct-09,7.15,7.16,7.05,7.12,32612893\n8-Oct-09,7.19,7.27,7.11,7.18,78354923\n7-Oct-09,7.11,7.14,7.00,7.13,33868949\n6-Oct-09,7.18,7.22,7.04,7.14,48500778\n5-Oct-09,6.94,7.08,6.84,7.05,42701533\n2-Oct-09,6.81,6.99,6.61,6.84,55825095\n1-Oct-09,7.18,7.25,6.97,6.97,101530880\n30-Sep-09,7.48,7.50,7.14,7.21,95959517\n29-Sep-09,7.49,7.50,7.36,7.45,46727701\n28-Sep-09,7.36,7.50,7.33,7.49,45883894\n25-Sep-09,7.34,7.46,7.20,7.29,61908850\n24-Sep-09,7.53,7.55,7.21,7.33,88410591\n23-Sep-09,7.20,7.59,7.18,7.36,138851234\n22-Sep-09,6.92,7.09,6.90,7.01,55581966\n21-Sep-09,6.88,6.92,6.75,6.83,52822145\n18-Sep-09,6.99,7.06,6.93,6.94,53331227\n17-Sep-09,7.05,7.25,6.85,6.92,103372275\n16-Sep-09,7.34,7.36,7.02,7.15,107442579\n15-Sep-09,7.39,7.44,7.20,7.20,50771439\n14-Sep-09,7.30,7.40,7.18,7.39,34524390\n11-Sep-09,7.46,7.54,7.30,7.33,48787877\n10-Sep-09,7.43,7.48,7.35,7.44,34041147\n9-Sep-09,7.32,7.52,7.25,7.39,47496027\n8-Sep-09,7.53,7.55,7.27,7.30,45510090\n4-Sep-09,7.49,7.55,7.27,7.43,42539791\n3-Sep-09,7.14,7.52,6.97,7.48,87169894\n2-Sep-09,7.18,7.21,6.87,7.03,65920189\n1-Sep-09,7.51,7.77,7.13,7.24,102771203\n31-Aug-09,7.60,7.64,7.47,7.60,43810449\n28-Aug-09,7.73,7.80,7.69,7.73,44250359\n27-Aug-09,7.66,7.71,7.46,7.67,62564719\n26-Aug-09,7.61,7.64,7.41,7.61,44502175\n25-Aug-09,7.43,7.65,7.43,7.59,53545620\n24-Aug-09,7.75,7.81,7.31,7.41,93581451\n21-Aug-09,7.79,7.83,7.62,7.74,55283244\n20-Aug-09,7.70,7.74,7.66,7.68,29608277\n19-Aug-09,7.50,7.75,7.50,7.65,47417521\n18-Aug-09,7.52,7.75,7.48,7.64,72395448\n17-Aug-09,7.51,7.62,7.13,7.37,78689235\n14-Aug-09,7.98,8.01,7.75,7.83,58019353\n13-Aug-09,7.85,7.92,7.70,7.90,88102814\n12-Aug-09,7.85,7.97,7.69,7.70,73805206\n10-Aug-09,7.94,7.96,7.62,7.72,90356662\n7-Aug-09,8.33,8.34,8.00,8.01,95391787\n6-Aug-09,8.52,8.55,7.91,8.07,132528962\n5-Aug-09,8.51,8.58,8.32,8.44,97215256\n4-Aug-09,8.40,8.51,8.09,8.30,122641576\n3-Aug-09,8.65,8.86,8.30,8.33,246431689\n31-Jul-09,7.46,8.00,7.43,8.00,156355280\n30-Jul-09,7.28,7.48,7.18,7.39,88740944\n29-Jul-09,7.08,7.32,6.99,7.12,74129659\n28-Jul-09,7.20,7.28,7.05,7.14,68800899\n27-Jul-09,6.83,7.29,6.72,7.27,104813229\n24-Jul-09,6.90,6.92,6.70,6.78,99700484\n23-Jul-09,6.94,7.10,6.65,6.98,269099668\n22-Jul-09,6.17,6.48,6.13,6.38,91812915\n21-Jul-09,6.28,6.30,6.04,6.20,57398750\n20-Jul-09,6.20,6.30,6.13,6.19,64037745\n17-Jul-09,6.15,6.22,6.03,6.14,62832170\n16-Jul-09,5.98,6.14,5.84,6.13,66541256\n15-Jul-09,5.98,6.06,5.91,6.05,64814074\n14-Jul-09,5.69,5.89,5.60,5.84,56107596\n13-Jul-09,5.72,5.74,5.51,5.69,46062772\n10-Jul-09,5.53,5.75,5.52,5.72,47272696\n9-Jul-09,5.46,5.76,5.32,5.63,60243555\n8-Jul-09,5.55,5.61,5.24,5.35,67379801\n7-Jul-09,5.74,5.75,5.51,5.53,68321902\n6-Jul-09,5.87,6.05,5.68,5.75,73705166\n3-Jul-09,5.89,5.89,5.89,5.89,0\n2-Jul-09,5.83,6.08,5.55,5.89,73694752\n1-Jul-09,6.12,6.25,5.89,5.91,95888244\n30-Jun-09,5.96,6.16,5.86,6.07,85531307\n29-Jun-09,5.66,5.96,5.60,5.78,73552274\n26-Jun-09,5.65,5.80,5.55,5.61,68303903\n25-Jun-09,5.57,5.75,5.37,5.68,62874580\n24-Jun-09,5.66,5.90,5.51,5.63,72264766\n23-Jun-09,5.43,5.59,5.21,5.53,60592604\n22-Jun-09,5.67,5.79,5.37,5.38,57635989\n19-Jun-09,5.73,5.96,5.69,5.72,69582710\n18-Jun-09,5.78,5.81,5.52,5.68,57600260\n17-Jun-09,5.64,5.85,5.30,5.71,87747771\n16-Jun-09,5.94,5.95,5.52,5.67,87214030\n15-Jun-09,6.02,6.04,5.80,5.93,65242733\n12-Jun-09,6.01,6.15,5.92,6.11,54584184\n11-Jun-09,6.15,6.24,5.75,5.98,133040782\n10-Jun-09,6.32,6.43,6.11,6.19,90297052\n9-Jun-09,6.38,6.44,6.18,6.26,84569314\n8-Jun-09,6.21,6.46,6.06,6.38,85590342\n5-Jun-09,6.47,6.53,6.22,6.36,85658871\n4-Jun-09,6.18,6.40,6.17,6.36,83850689\n3-Jun-09,6.30,6.31,5.96,6.18,111423581\n2-Jun-09,6.17,6.46,6.03,6.41,134751890\n1-Jun-09,5.95,6.23,5.88,6.13,111714469\n29-May-09,5.58,5.75,5.41,5.75,99306463\n28-May-09,5.41,5.56,5.25,5.56,63255006\n27-May-09,5.48,5.53,5.25,5.34,55326945\n26-May-09,5.16,5.41,5.10,5.40,66383208\n25-May-09,5.26,5.26,5.26,5.26,0\n22-May-09,5.37,5.37,5.10,5.26,50026686\n21-May-09,5.25,5.39,5.06,5.33,78529358\n20-May-09,5.66,5.75,5.33,5.41,95526132\n19-May-09,5.49,5.69,5.33,5.63,92782419\n18-May-09,5.69,5.70,5.29,5.50,121707257\n15-May-09,5.22,5.50,5.22,5.49,128733282\n14-May-09,5.16,5.36,4.99,5.16,207354321\n13-May-09,4.77,4.97,4.71,4.96,541175530\n12-May-09,5.74,5.77,5.01,5.01,217074096\n11-May-09,6.09,6.26,5.88,6.08,64849072\n8-May-09,6.19,6.30,6.03,6.24,63884406\n7-May-09,6.51,6.54,5.65,6.06,95031049\n6-May-09,5.91,6.29,5.90,6.26,95547218\n5-May-09,5.82,5.91,5.60,5.85,70388719\n4-May-09,5.90,5.94,5.75,5.88,58157906\n1-May-09,5.99,6.00,5.56,5.69,102853312\n30-Apr-09,5.58,5.99,5.57,5.98,186983688\n29-Apr-09,5.32,5.45,5.28,5.45,70786225\n28-Apr-09,5.08,5.40,5.01,5.19,73138908\n27-Apr-09,5.07,5.42,5.02,5.11,111424427\n24-Apr-09,5.33,5.45,4.96,5.00,287772534\n23-Apr-09,4.43,4.51,4.31,4.49,115727921\n22-Apr-09,4.10,4.42,4.05,4.28,145386480\n21-Apr-09,3.53,3.84,3.27,3.80,93851803\n20-Apr-09,3.91,3.91,3.61,3.69,57797588\n17-Apr-09,4.19,4.21,3.97,4.00,55084224\n16-Apr-09,4.12,4.20,3.95,4.16,59376416\n15-Apr-09,4.23,4.25,3.75,4.04,88312498\n14-Apr-09,4.28,4.33,4.15,4.30,64229267\n13-Apr-09,4.25,4.32,4.03,4.26,73962419\n10-Apr-09,4.24,4.24,4.24,4.24,0\n9-Apr-09,4.22,4.41,4.03,4.24,131505419\n8-Apr-09,3.67,4.05,3.53,3.95,261067506\n7-Apr-09,3.70,3.74,3.36,3.49,112627081\n6-Apr-09,3.27,4.00,3.25,3.77,231439161\n3-Apr-09,2.93,3.25,2.91,3.25,111587531\n2-Apr-09,2.89,2.95,2.83,2.91,68130454\n1-Apr-09,2.56,2.80,2.40,2.74,68271453\n31-Mar-09,2.84,2.87,2.63,2.63,45913518\n30-Mar-09,2.73,2.88,2.38,2.76,63985223\n27-Mar-09,2.96,2.98,2.82,2.84,32080904\n26-Mar-09,2.90,2.94,2.81,2.94,38805631\n25-Mar-09,2.90,2.99,2.76,2.77,51463046\n24-Mar-09,2.83,2.95,2.76,2.86,40527169\n23-Mar-09,2.88,2.90,2.80,2.90,45330876\n20-Mar-09,2.70,2.75,2.52,2.75,57246609\n19-Mar-09,2.77,2.78,2.28,2.51,61261324\n18-Mar-09,2.28,2.65,2.28,2.47,92835391\n17-Mar-09,2.17,2.30,2.11,2.28,43203282\n16-Mar-09,2.28,2.30,2.09,2.10,44227987\n13-Mar-09,2.19,2.25,2.12,2.19,53675892\n12-Mar-09,1.98,2.10,1.98,2.10,46703776\n11-Mar-09,1.91,2.00,1.87,1.96,43525667\n10-Mar-09,1.85,1.89,1.81,1.85,31181579\n9-Mar-09,1.78,1.85,1.70,1.74,32278803\n6-Mar-09,1.83,1.91,1.65,1.70,35136630\n5-Mar-09,1.75,2.00,1.73,1.81,47498158\n4-Mar-09,1.90,1.90,1.83,1.87,22404150\n3-Mar-09,1.91,1.91,1.80,1.81,15442650\n2-Mar-09,1.91,1.94,1.83,1.88,19605521\n27-Feb-09,1.93,2.00,1.80,2.00,31515462\n26-Feb-09,2.08,2.09,1.81,1.98,32316487\n25-Feb-09,2.10,2.16,2.00,2.01,54369658\n24-Feb-09,1.80,2.00,1.80,2.00,35167886\n23-Feb-09,1.65,1.91,1.61,1.73,44460533\n20-Feb-09,1.60,1.61,1.50,1.58,37892730\n19-Feb-09,1.69,1.70,1.61,1.63,19034198\n18-Feb-09,1.78,1.79,1.63,1.67,25058470\n17-Feb-09,1.70,1.75,1.61,1.69,32860216\n13-Feb-09,1.82,1.83,1.72,1.76,23009386\n12-Feb-09,1.83,1.85,1.75,1.79,23422542\n11-Feb-09,1.85,1.88,1.80,1.85,30225031\n10-Feb-09,1.91,1.92,1.82,1.82,28273774\n9-Feb-09,1.96,1.96,1.84,1.90,27266803\n6-Feb-09,1.94,1.99,1.90,1.94,21389566\n5-Feb-09,1.94,1.97,1.86,1.93,17335008\n4-Feb-09,1.98,2.02,1.92,1.95,24203630\n3-Feb-09,1.92,1.97,1.81,1.96,34119474\n2-Feb-09,1.86,1.93,1.81,1.88,32303708\n30-Jan-09,1.99,1.99,1.85,1.87,35468282\n29-Jan-09,2.03,2.03,1.95,1.95,30993274\n28-Jan-09,2.04,2.06,1.98,2.03,34912285\n27-Jan-09,2.02,2.04,1.94,1.97,31192678\n26-Jan-09,1.99,2.06,1.87,1.94,50932860\n23-Jan-09,1.90,1.93,1.80,1.80,71025660\n22-Jan-09,2.04,2.07,1.90,1.94,52683389\n21-Jan-09,2.18,2.19,2.00,2.09,75365149\n20-Jan-09,2.22,2.25,2.05,2.13,51661919\n16-Jan-09,2.34,2.36,2.06,2.19,60093180\n15-Jan-09,2.27,2.35,2.05,2.23,69599551\n14-Jan-09,2.41,2.43,2.19,2.26,56700170\n13-Jan-09,2.60,2.64,2.42,2.48,40498572\n12-Jan-09,2.69,2.69,2.52,2.64,47710677\n9-Jan-09,2.63,2.73,2.59,2.63,39852167\n8-Jan-09,2.62,2.70,2.50,2.69,51174470\n7-Jan-09,2.72,2.82,2.62,2.69,43956910\n6-Jan-09,2.64,2.85,2.63,2.76,58984189\n5-Jan-09,2.42,2.64,2.31,2.58,73093177\n2-Jan-09,2.30,2.49,2.28,2.46,42108590\n1-Jan-09,2.29,2.29,2.29,2.29,0\n31-Dec-08,2.29,2.30,2.20,2.29,39815483\n30-Dec-08,2.34,2.34,2.20,2.29,39314907\n29-Dec-08,2.41,2.45,2.12,2.22,47049614\n26-Dec-08,2.23,2.35,2.21,2.29,40804252\n25-Dec-08,2.11,2.11,2.11,2.11,0\n24-Dec-08,2.21,2.25,2.07,2.11,37181733\n23-Dec-08,2.48,2.51,2.13,2.19,103763828\n22-Dec-08,2.90,2.90,2.55,2.59,67680560\n19-Dec-08,3.20,3.25,2.75,2.95,143961708\n18-Dec-08,3.14,3.14,2.69,2.84,109048094\n17-Dec-08,3.13,3.17,3.08,3.14,52213205\n16-Dec-08,3.25,3.25,3.10,3.13,60155399\n15-Dec-08,3.18,3.25,3.07,3.18,69780388\n12-Dec-08,2.19,3.21,2.12,3.04,211193476\n11-Dec-08,3.12,3.14,2.82,2.90,93237945\n10-Dec-08,3.38,3.42,3.01,3.25,141351201\n9-Dec-08,3.28,3.32,3.02,3.23,137983612\n8-Dec-08,3.20,3.54,2.81,3.38,268401535\n5-Dec-08,2.70,2.88,2.62,2.72,98998380\n4-Dec-08,2.82,2.96,2.51,2.66,141082437\n3-Dec-08,2.78,2.97,2.68,2.85,152719110\n2-Dec-08,2.70,2.90,2.58,2.70,198491174\n1-Dec-08,3.00,3.01,2.02,2.55,291967726\n28-Nov-08,2.47,2.74,2.32,2.69,119912658\n27-Nov-08,2.15,2.15,2.15,2.15,0\n26-Nov-08,1.72,2.23,1.69,2.15,173058038\n25-Nov-08,1.69,1.72,1.58,1.66,79939136\n24-Nov-08,1.78,1.85,1.40,1.56,131274094\n21-Nov-08,1.47,1.55,1.25,1.43,132068343\n20-Nov-08,1.31,1.87,1.01,1.39,198780999\n19-Nov-08,1.65,1.71,1.21,1.26,127843389\n18-Nov-08,1.76,1.77,1.56,1.68,51758575\n17-Nov-08,1.86,1.88,1.72,1.72,39364456\n14-Nov-08,1.86,1.89,1.79,1.80,35717475\n13-Nov-08,1.90,1.93,1.74,1.90,47116921\n12-Nov-08,1.99,2.00,1.83,1.84,50057415\n11-Nov-08,1.94,2.00,1.72,1.80,72504418\n10-Nov-08,2.08,2.12,1.90,1.93,58269478\n7-Nov-08,2.03,2.10,1.84,2.02,93357400\n6-Nov-08,2.11,2.12,1.87,1.98,90215700\n5-Nov-08,2.23,2.23,2.06,2.09,51207200\n4-Nov-08,2.22,2.23,2.13,2.16,62463800\n3-Nov-08,2.25,2.25,2.11,2.13,46341500\n31-Oct-08,2.21,2.30,2.17,2.19,64421500\n30-Oct-08,2.27,2.28,2.11,2.28,64311800\n29-Oct-08,2.19,2.28,2.10,2.16,77286700\n28-Oct-08,2.20,2.24,2.08,2.10,57904400\n27-Oct-08,2.05,2.09,1.94,2.03,35500200\n24-Oct-08,1.84,2.08,1.80,2.01,65223200\n23-Oct-08,2.16,2.16,1.92,2.00,71459700\n22-Oct-08,2.19,2.21,2.07,2.10,43516500\n21-Oct-08,2.22,2.31,2.13,2.17,50044400\n20-Oct-08,2.55,2.61,2.32,2.33,44665600\n17-Oct-08,2.25,2.54,2.16,2.43,58501600\n16-Oct-08,2.48,2.48,2.05,2.27,68122200\n15-Oct-08,2.52,2.55,2.29,2.30,53384100\n14-Oct-08,2.97,2.97,2.40,2.45,79274800\n13-Oct-08,2.98,2.98,2.31,2.39,19557600\n10-Oct-08,2.07,2.55,1.88,1.99,95830200\n9-Oct-08,2.88,3.00,2.03,2.08,24611900\n8-Oct-08,2.96,5.47,2.10,2.66,27960200\n7-Oct-08,3.79,3.90,2.92,2.92,68223600\n6-Oct-08,3.99,4.02,3.32,3.69,64483600\n3-Oct-08,4.47,4.47,4.05,4.05,42015500\n2-Oct-08,4.51,4.61,4.35,4.35,28357400\n1-Oct-08,4.75,4.95,4.49,4.55,37844200\n30-Sep-08,4.55,5.20,4.40,5.20,37963700\n29-Sep-08,4.80,4.90,4.17,4.17,33980700\n26-Sep-08,4.85,5.00,4.72,4.81,36133700\n25-Sep-08,5.05,5.20,4.92,4.98,27345900\n24-Sep-08,4.96,5.03,4.81,5.03,22095300\n23-Sep-08,5.05,5.05,4.81,4.86,21207200\n22-Sep-08,5.34,5.34,4.86,4.95,50930600\n19-Sep-08,5.66,5.70,5.15,5.29,89779000\n18-Sep-08,4.99,5.35,4.76,5.28,4845400\n17-Sep-08,5.00,5.04,4.60,4.78,17997400\n16-Sep-08,4.60,5.18,4.55,5.07,98470400\n15-Sep-08,4.61,5.07,4.50,4.74,3266700\n12-Sep-08,4.72,4.99,4.60,4.91,27520800\n11-Sep-08,4.38,4.75,4.36,4.68,83278300\n10-Sep-08,4.44,4.50,4.38,4.47,38572100\n9-Sep-08,4.58,4.67,4.39,4.40,51385000\n8-Sep-08,4.61,4.69,4.32,4.55,71766800\n5-Sep-08,4.37,4.42,4.26,4.41,59554800\n4-Sep-08,4.54,4.65,4.39,4.39,87332400\n3-Sep-08,4.55,4.69,4.49,4.57,83591300\n2-Sep-08,4.67,4.81,4.45,4.51,52993200\n29-Aug-08,4.38,4.59,4.35,4.46,36881500\n28-Aug-08,4.30,4.44,4.25,4.43,52311200\n27-Aug-08,4.35,4.42,4.24,4.26,69587100\n26-Aug-08,4.40,4.43,4.27,4.35,48903100\n25-Aug-08,4.46,4.52,4.25,4.41,69981500\n22-Aug-08,4.53,4.60,4.35,4.47,54846300\n21-Aug-08,4.54,4.58,4.40,4.42,60296100\n20-Aug-08,4.80,4.83,4.52,4.61,49055500\n19-Aug-08,4.90,4.90,4.70,4.72,39225400\n18-Aug-08,5.13,5.13,4.88,4.89,36158100\n15-Aug-08,5.20,5.22,5.04,5.11,32536400\n14-Aug-08,4.94,5.20,4.93,5.10,38060300\n13-Aug-08,5.27,5.27,4.82,4.88,67322900\n12-Aug-08,5.24,5.45,5.16,5.19,36382600\n11-Aug-08,5.24,5.50,5.12,5.16,40910900\n8-Aug-08,4.92,5.36,4.85,5.26,44202400\n7-Aug-08,4.91,5.05,4.83,4.86,35586900\n6-Aug-08,5.10,5.10,4.90,4.94,58731300\n5-Aug-08,4.94,5.09,4.87,5.09,51525900\n4-Aug-08,4.67,4.90,4.66,4.81,30766300\n1-Aug-08,4.80,4.93,4.60,4.65,54104300\n31-Jul-08,4.74,5.00,4.74,4.80,42674300\n30-Jul-08,5.12,5.21,4.76,4.84,57508100\n29-Jul-08,4.83,5.02,4.72,5.02,56630700\n28-Jul-08,5.05,5.14,4.60,4.75,71019600\n25-Jul-08,5.22,5.28,4.97,5.05,57285300\n24-Jul-08,5.78,5.85,5.03,5.11,91337200\n23-Jul-08,5.95,6.33,5.91,6.03,69082000\n22-Jul-08,5.32,5.92,5.28,5.84,54066500\n21-Jul-08,5.47,5.56,5.34,5.48,39473400\n18-Jul-08,5.43,5.54,5.28,5.44,37611400\n17-Jul-08,5.56,5.62,5.13,5.49,68958300\n16-Jul-08,4.71,5.53,4.60,5.49,96123100\n15-Jul-08,4.60,4.93,4.35,4.65,74807400\n14-Jul-08,4.97,5.00,4.63,4.66,39383000\n11-Jul-08,4.45,5.07,4.40,4.86,74447300\n10-Jul-08,5.06,5.06,4.47,4.58,76676600\n9-Jul-08,4.95,5.17,4.95,4.95,74531500\n8-Jul-08,4.53,4.97,4.44,4.90,72562400\n7-Jul-08,4.60,4.67,4.43,4.47,50139800\n3-Jul-08,4.42,4.53,4.30,4.42,31894500\n2-Jul-08,4.74,4.81,4.36,4.36,61879200\n1-Jul-08,4.71,4.95,4.41,4.71,24650000\n30-Jun-08,4.99,5.28,4.46,4.81,74528900\n27-Jun-08,5.07,5.12,4.90,4.98,45824400\n26-Jun-08,5.07,5.16,4.94,5.07,79529300\n25-Jun-08,5.36,5.47,5.22,5.24,39509100\n24-Jun-08,5.32,5.49,5.25,5.32,4069900\n23-Jun-08,5.89,5.89,5.28,5.28,71404800\n20-Jun-08,6.24,6.29,5.74,5.81,92222900\n19-Jun-08,6.32,6.35,6.13,6.32,39641200\n18-Jun-08,6.50,6.51,6.09,6.22,86792200\n17-Jun-08,6.59,6.75,6.52,6.60,56259700\n16-Jun-08,6.25,6.55,6.21,6.50,62701500\n13-Jun-08,6.14,6.30,6.10,6.27,59292300\n12-Jun-08,6.05,6.15,5.91,6.00,32347400\n11-Jun-08,6.13,6.15,5.97,5.97,42591400\n10-Jun-08,6.25,6.25,6.02,6.12,33567200\n9-Jun-08,6.14,6.36,6.07,6.36,48273600\n6-Jun-08,6.35,6.35,5.97,6.04,57902000\n5-Jun-08,6.48,6.50,6.26,6.40,45504100\n4-Jun-08,6.64,6.69,6.42,6.46,55059300\n3-Jun-08,6.69,6.75,6.59,6.68,43103300\n2-Jun-08,6.85,6.93,6.60,6.64,35970100\n30-May-08,6.88,6.92,6.70,6.80,33629800\n29-May-08,6.79,6.82,6.70,6.71,28321900\n28-May-08,6.93,7.02,6.69,6.78,42998800\n27-May-08,6.79,7.00,6.59,6.80,60880300\n23-May-08,6.99,7.00,6.73,6.87,63282900\n22-May-08,7.49,7.49,7.04,7.16,1220400\n21-May-08,8.03,8.03,7.76,7.80,40115800\n20-May-08,8.02,8.03,7.87,8.00,42038000\n19-May-08,8.12,8.18,8.00,8.02,30499600\n16-May-08,8.21,8.25,8.03,8.11,41236700\n15-May-08,8.18,8.24,8.10,8.17,39543200\n14-May-08,8.25,8.37,8.11,8.14,36094500\n13-May-08,8.16,8.29,8.15,8.23,35810700\n12-May-08,8.17,8.22,8.12,8.15,25194800\n9-May-08,8.20,8.33,8.05,8.10,35137700\n8-May-08,8.05,8.22,7.90,8.20,48357700\n7-May-08,8.28,8.31,7.91,7.96,56233900\n6-May-08,8.27,8.30,8.19,8.27,37247400\n5-May-08,8.27,8.38,8.16,8.33,38131200\n2-May-08,8.55,8.68,8.15,8.27,72880700\n1-May-08,8.28,8.54,8.22,8.48,62398600\n30-Apr-08,8.21,8.42,8.17,8.26,66180300\n29-Apr-08,8.22,8.38,8.08,8.12,61032400\n28-Apr-08,8.15,8.42,8.10,8.21,53468700\n25-Apr-08,8.20,8.23,7.49,7.50,16147500\n24-Apr-08,8.02,8.79,7.81,8.40,33206400\n23-Apr-08,7.76,7.83,7.36,7.52,81799100\n22-Apr-08,7.70,7.86,7.52,7.65,62261900\n21-Apr-08,7.50,7.77,7.46,7.73,75033500\n18-Apr-08,7.32,7.50,7.31,7.45,93904000\n17-Apr-08,7.14,7.31,7.08,7.26,63945800\n16-Apr-08,6.95,7.21,6.92,7.19,63054100\n15-Apr-08,6.83,6.91,6.67,6.88,42498900\n14-Apr-08,6.69,6.83,6.69,6.78,39510000\n11-Apr-08,6.59,6.78,6.57,6.69,44701700\n10-Apr-08,6.72,6.82,6.60,6.74,46630200\n9-Apr-08,6.94,7.00,6.65,6.72,54605800\n8-Apr-08,6.69,7.02,6.67,6.91,2168800\n7-Apr-08,6.75,6.87,6.60,6.73,68652000\n4-Apr-08,6.43,6.52,6.20,6.49,65159600\n3-Apr-08,6.07,6.46,6.05,6.46,65417000\n2-Apr-08,5.95,6.33,5.93,6.13,61231800\n1-Apr-08,5.77,5.98,5.77,5.97,53225900\n31-Mar-08,5.60,5.76,5.60,5.72,41653100\n28-Mar-08,5.89,5.90,5.58,5.59,39612200\n27-Mar-08,5.93,5.96,5.75,5.83,61552600\n26-Mar-08,6.09,6.09,5.83,5.87,50459700\n25-Mar-08,6.03,6.10,5.86,6.00,55925900\n24-Mar-08,5.69,6.02,5.68,5.96,53529700\n20-Mar-08,5.51,5.73,5.29,5.62,73181700\n19-Mar-08,5.39,5.54,5.27,5.45,69105500\n18-Mar-08,5.32,5.42,5.03,5.29,62386700\n17-Mar-08,5.02,5.26,4.95,5.11,67765300\n14-Mar-08,5.45,5.49,5.25,5.29,77596600\n13-Mar-08,5.64,5.64,5.12,5.39,24887800\n12-Mar-08,5.89,5.91,5.66,5.70,59939800\n11-Mar-08,5.74,5.93,5.56,5.90,72113200\n10-Mar-08,5.85,6.00,5.58,5.60,44104500\n7-Mar-08,5.88,6.02,5.72,5.78,40618800\n6-Mar-08,6.08,6.11,5.91,5.94,33877400\n5-Mar-08,6.17,6.23,6.04,6.12,37265900\n4-Mar-08,6.10,6.19,6.02,6.13,38236600\n3-Mar-08,6.42,6.42,6.12,6.18,44090000\n29-Feb-08,6.57,6.62,6.49,6.53,46756500\n28-Feb-08,6.53,6.68,6.52,6.62,42032500\n27-Feb-08,6.49,6.60,6.40,6.60,39069100\n26-Feb-08,6.44,6.55,6.33,6.52,31044200\n25-Feb-08,6.26,6.51,6.16,6.46,32469600\n22-Feb-08,6.24,6.26,6.04,6.25,31239200\n21-Feb-08,6.42,6.44,6.13,6.23,56417100\n20-Feb-08,6.43,6.45,6.35,6.41,24500800\n19-Feb-08,6.50,6.58,6.42,6.48,28097400\n15-Feb-08,6.44,6.47,6.36,6.45,18600300\n14-Feb-08,6.56,6.59,6.43,6.46,23619100\n13-Feb-08,6.52,6.62,6.48,6.58,28728200\n12-Feb-08,6.36,6.73,6.34,6.46,59110300\n11-Feb-08,6.11,6.51,6.04,6.39,51552300\n8-Feb-08,6.14,6.18,6.01,6.08,29469400\n7-Feb-08,6.26,6.30,6.07,6.17,56321000\n6-Feb-08,6.36,6.42,6.25,6.31,39197700\n5-Feb-08,6.60,6.62,6.35,6.43,35948800\n4-Feb-08,6.85,6.93,6.65,6.68,36798300\n1-Feb-08,6.69,6.90,6.60,6.85,37547200\n31-Jan-08,6.68,6.75,6.58,6.64,45737900\n30-Jan-08,6.67,6.94,6.63,6.75,36844000\n29-Jan-08,6.80,6.80,6.56,6.69,38023400\n28-Jan-08,6.50,6.78,6.41,6.67,46656700\n25-Jan-08,6.31,6.70,6.31,6.58,81891300\n24-Jan-08,6.40,6.40,6.11,6.26,63508900\n23-Jan-08,5.83,6.31,5.74,6.30,73746600\n22-Jan-08,5.53,6.03,5.50,5.93,77546600\n18-Jan-08,5.81,6.00,5.80,5.92,54304200\n17-Jan-08,5.90,5.92,5.68,5.76,77599600\n16-Jan-08,6.02,6.02,5.81,5.86,64102100\n15-Jan-08,6.12,6.12,5.91,5.97,42519200\n14-Jan-08,6.12,6.21,6.09,6.18,29178500\n11-Jan-08,6.18,6.24,6.05,6.06,31585900\n10-Jan-08,6.00,6.30,5.84,6.25,60058100\n9-Jan-08,6.11,6.14,5.76,6.07,72911300\n8-Jan-08,6.25,6.35,6.09,6.10,47735100\n7-Jan-08,6.21,6.30,6.10,6.16,46340700\n4-Jan-08,6.38,6.38,6.00,6.13,55820000\n3-Jan-08,6.66,6.66,6.41,6.45,44647700\n2-Jan-08,6.73,6.77,6.51,6.60,32940400\n31-Dec-07,6.67,6.75,6.65,6.73,25614900\n28-Dec-07,6.85,6.87,6.68,6.70,23903500\n27-Dec-07,6.87,6.94,6.80,6.84,24613200\n26-Dec-07,6.71,6.92,6.68,6.89,27447400\n24-Dec-07,6.75,6.79,6.71,6.75,12073100\n21-Dec-07,6.80,6.85,6.72,6.79,37897200\n20-Dec-07,6.76,6.84,6.68,6.79,29315900\n19-Dec-07,6.80,6.84,6.68,6.76,30124500\n18-Dec-07,6.85,6.89,6.71,6.81,43764800\n17-Dec-07,6.88,6.93,6.75,6.80,32585200\n14-Dec-07,6.92,6.96,6.86,6.89,35281100\n13-Dec-07,7.00,7.05,6.90,6.99,46695400\n12-Dec-07,7.10,7.16,6.94,7.06,50601800\n11-Dec-07,7.14,7.32,6.94,6.97,50952900\n10-Dec-07,7.10,7.47,7.04,7.14,44570100\n7-Dec-07,7.05,7.19,7.02,7.06,32525200\n6-Dec-07,7.04,7.08,6.97,7.06,43091100\n5-Dec-07,7.13,7.20,6.97,6.98,49930500\n4-Dec-07,7.20,7.24,6.93,6.97,55296800\n3-Dec-07,7.52,7.52,7.23,7.25,34509100\n30-Nov-07,7.41,7.57,7.38,7.51,43403300\n29-Nov-07,7.36,7.38,7.24,7.29,31031500\n28-Nov-07,7.14,7.39,7.11,7.36,42280800\n27-Nov-07,7.11,7.11,6.91,7.07,35081600\n26-Nov-07,7.28,7.28,7.00,7.03,35082800\n23-Nov-07,7.14,7.23,7.02,7.19,23811100\n21-Nov-07,7.05,7.15,6.87,6.95,71263500\n20-Nov-07,7.46,7.46,7.01,7.24,62458700\n19-Nov-07,7.65,7.66,7.33,7.34,49202500\n16-Nov-07,7.94,7.94,7.62,7.70,43206900\n15-Nov-07,7.98,8.05,7.75,7.78,40939700\n14-Nov-07,8.07,8.15,7.86,7.98,47595200\n13-Nov-07,8.07,8.07,7.87,8.00,48045200\n12-Nov-07,8.29,8.29,7.74,7.87,68476100\n9-Nov-07,8.39,8.50,8.20,8.20,49468200\n8-Nov-07,8.55,8.63,8.10,8.48,69191900\n7-Nov-07,8.50,8.60,8.24,8.24,47814600\n6-Nov-07,8.75,8.75,8.50,8.63,29040900\n5-Nov-07,8.99,8.99,8.52,8.67,43539500\n2-Nov-07,8.65,8.96,8.52,8.95,52471800\n1-Nov-07,8.77,8.82,8.49,8.50,39578400\n31-Oct-07,8.82,8.88,8.70,8.87,51854000\n30-Oct-07,8.77,8.88,8.68,8.80,26313100\n29-Oct-07,8.70,8.84,8.64,8.77,39698100\n26-Oct-07,8.67,8.70,8.45,8.67,34402000\n25-Oct-07,8.60,8.72,8.48,8.60,35588700\n24-Oct-07,8.57,8.61,8.40,8.59,35644300\n23-Oct-07,8.48,8.65,8.41,8.65,32619600\n22-Oct-07,8.26,8.52,8.25,8.34,44018200\n19-Oct-07,8.73,8.75,8.34,8.37,52381100\n18-Oct-07,8.67,8.84,8.64,8.76,26045900\n17-Oct-07,8.92,8.95,8.57,8.69,39952700\n16-Oct-07,8.90,9.12,8.75,8.78,49641500\n15-Oct-07,9.20,9.20,8.96,8.99,49123300\n12-Oct-07,8.81,9.24,8.81,9.20,85978100\n11-Oct-07,8.32,8.81,8.31,8.76,88086700\n10-Oct-07,8.31,8.35,8.19,8.23,33409600\n9-Oct-07,8.22,8.32,8.13,8.32,40554100\n8-Oct-07,8.39,8.39,8.17,8.19,31353700\n5-Oct-07,8.38,8.40,8.24,8.37,36188500\n4-Oct-07,8.47,8.51,8.23,8.26,39289200\n3-Oct-07,8.54,8.60,8.38,8.43,45040500\n2-Oct-07,8.39,8.60,8.37,8.57,52676600\n1-Oct-07,8.56,8.58,8.19,8.23,54307100\n28-Sep-07,8.63,8.73,8.48,8.49,43767900\n27-Sep-07,8.90,8.93,8.61,8.63,48368500\n26-Sep-07,8.68,9.00,8.53,8.88,82528700\n25-Sep-07,8.40,8.42,8.25,8.34,25989400\n24-Sep-07,8.47,8.61,8.36,8.48,55663400\n21-Sep-07,8.34,8.34,8.18,8.23,32609900\n20-Sep-07,8.25,8.40,8.16,8.25,29154600\n19-Sep-07,8.45,8.52,8.28,8.40,48082200\n18-Sep-07,8.36,8.49,8.18,8.42,45817500\n17-Sep-07,8.09,8.38,8.09,8.28,52940700\n14-Sep-07,7.83,8.09,7.75,8.03,40074500\n13-Sep-07,7.64,7.96,7.62,7.92,59759700\n12-Sep-07,7.55,7.67,7.50,7.50,32308200\n11-Sep-07,7.55,7.70,7.53,7.58,36711300\n10-Sep-07,7.60,7.62,7.50,7.52,32213800\n7-Sep-07,7.65,7.70,7.50,7.52,43291700\n6-Sep-07,7.80,7.83,7.64,7.78,27449100\n5-Sep-07,7.90,7.97,7.73,7.77,19765700\n4-Sep-07,7.78,8.03,7.76,7.99,31755000\n31-Aug-07,7.80,7.87,7.68,7.81,31430600\n30-Aug-07,7.63,7.77,7.58,7.67,28217200\n29-Aug-07,7.60,7.77,7.53,7.72,29682600\n28-Aug-07,7.75,7.80,7.51,7.51,30447200\n27-Aug-07,7.91,7.91,7.80,7.80,15364200\n24-Aug-07,7.73,7.92,7.61,7.90,31741500\n23-Aug-07,7.88,7.91,7.65,7.75,37977800\n22-Aug-07,8.00,8.00,7.78,7.85,50383900\n21-Aug-07,7.97,8.00,7.90,7.92,20110100\n20-Aug-07,7.89,8.00,7.80,8.00,29124300\n17-Aug-07,7.92,7.98,7.58,7.83,43394600\n16-Aug-07,7.92,8.01,7.49,7.70,71159300\n15-Aug-07,8.11,8.26,7.99,8.00,46463000\n14-Aug-07,8.40,8.45,8.05,8.07,43092300\n13-Aug-07,8.38,8.43,8.27,8.37,30589100\n10-Aug-07,8.34,8.40,8.14,8.23,39278500\n9-Aug-07,8.59,8.72,8.34,8.38,56507700\n8-Aug-07,8.40,8.87,8.37,8.87,77857900\n7-Aug-07,8.16,8.35,8.08,8.30,33624800\n6-Aug-07,8.12,8.31,8.01,8.19,41444100\n3-Aug-07,8.40,8.49,8.06,8.06,40273200\n2-Aug-07,8.45,8.51,8.28,8.40,31614300\n1-Aug-07,8.48,8.55,8.30,8.43,38849400\n31-Jul-07,8.92,8.97,8.51,8.51,73900200\n30-Jul-07,8.33,8.75,8.25,8.74,82991200\n27-Jul-07,8.18,8.37,8.08,8.23,97189500\n26-Jul-07,8.11,8.33,7.90,8.09,52405500\n25-Jul-07,8.32,8.32,7.95,7.97,7722700\n24-Jul-07,8.40,8.42,8.26,8.26,39172300\n23-Jul-07,8.46,8.53,8.35,8.46,34932800\n20-Jul-07,8.62,8.63,8.34,8.40,53217900\n19-Jul-07,8.75,8.75,8.55,8.63,34264500\n18-Jul-07,8.68,8.69,8.51,8.63,40314100\n17-Jul-07,8.88,8.93,8.71,8.73,30817100\n16-Jul-07,9.01,9.04,8.84,8.86,28727700\n13-Jul-07,8.98,9.01,8.84,8.97,31464800\n12-Jul-07,8.93,9.05,8.87,8.96,47144100\n11-Jul-07,9.10,9.14,8.81,8.90,60976700\n10-Jul-07,9.15,9.30,9.08,9.09,50533000\n9-Jul-07,9.16,9.24,9.07,9.08,51064100\n6-Jul-07,9.20,9.23,9.08,9.11,37908200\n5-Jul-07,9.36,9.36,9.06,9.15,59886800\n3-Jul-07,9.48,9.48,9.26,9.42,63967800\n2-Jul-07,9.57,9.64,9.43,9.64,23280700\n29-Jun-07,9.60,9.70,9.33,9.42,48057900\n28-Jun-07,9.34,9.65,9.32,9.49,68317600\n27-Jun-07,8.97,9.32,8.86,9.28,45852600\n26-Jun-07,9.09,9.15,8.95,8.96,31990300\n25-Jun-07,9.24,9.45,8.98,9.03,52164900\n22-Jun-07,8.80,9.23,8.78,9.13,77991800\n21-Jun-07,8.86,8.91,8.79,8.91,32176800\n20-Jun-07,8.71,8.88,8.63,8.86,46916900\n19-Jun-07,8.78,8.79,8.64,8.65,34535200\n18-Jun-07,8.92,8.93,8.73,8.85,37139100\n15-Jun-07,8.76,8.97,8.68,8.92,55214500\n14-Jun-07,8.58,8.70,8.58,8.66,35438600\n13-Jun-07,8.39,8.59,8.36,8.56,33315400\n12-Jun-07,8.39,8.49,8.32,8.32,30858500\n11-Jun-07,8.39,8.42,8.30,8.40,24911600\n8-Jun-07,8.06,8.30,8.06,8.24,31821200\n7-Jun-07,8.28,8.36,8.05,8.06,38870400\n6-Jun-07,8.26,8.32,8.20,8.26,25174500\n5-Jun-07,8.28,8.39,8.27,8.31,40792300\n4-Jun-07,8.34,8.40,8.23,8.27,20382500\n1-Jun-07,8.37,8.44,8.27,8.35,35835600\n31-May-07,8.54,8.55,8.26,8.34,31301900\n30-May-07,8.35,8.54,8.32,8.50,26613400\n29-May-07,8.53,8.59,8.38,8.40,25132400\n25-May-07,8.56,8.59,8.41,8.45,30366700\n24-May-07,8.77,8.82,8.48,8.49,46111300\n23-May-07,8.68,8.82,8.68,8.76,32045600\n22-May-07,8.78,8.83,8.67,8.68,23841700\n21-May-07,8.73,8.93,8.68,8.78,33843800\n18-May-07,8.86,8.86,8.68,8.69,15314100\n17-May-07,8.78,8.87,8.69,8.76,22849900\n16-May-07,8.93,8.95,8.73,8.76,30237400\n15-May-07,8.72,8.98,8.71,8.91,63001100\n14-May-07,8.55,8.97,8.52,8.71,64600300\n11-May-07,8.26,8.42,8.26,8.37,24293200\n10-May-07,8.36,8.42,8.20,8.24,25825700\n9-May-07,8.37,8.48,8.30,8.35,39622900\n8-May-07,8.15,8.40,8.15,8.37,56824500\n7-May-07,8.19,8.22,8.15,8.16,12425000\n4-May-07,8.19,8.22,8.11,8.22,21376900\n3-May-07,8.12,8.23,8.12,8.19,17374100\n2-May-07,8.08,8.20,8.07,8.17,24322300\n1-May-07,8.04,8.10,7.96,8.05,25214900\n30-Apr-07,8.06,8.23,8.04,8.04,26065300\n27-Apr-07,8.20,8.23,7.99,8.05,34094500\n26-Apr-07,8.37,8.38,8.15,8.20,72143900\n25-Apr-07,7.80,7.91,7.80,7.88,22534300\n24-Apr-07,7.84,7.85,7.72,7.82,24808800\n23-Apr-07,7.73,7.93,7.73,7.83,24939500\n20-Apr-07,7.81,7.87,7.67,7.75,44006900\n19-Apr-07,7.82,7.86,7.69,7.74,28641300\n18-Apr-07,7.85,7.89,7.79,7.82,25371700\n17-Apr-07,8.00,8.03,7.82,7.85,42677600\n16-Apr-07,8.05,8.08,7.99,8.03,19281300\n13-Apr-07,8.11,8.11,7.98,8.02,33996000\n12-Apr-07,8.11,8.16,8.06,8.09,27895800\n11-Apr-07,8.14,8.18,8.05,8.13,24450000\n10-Apr-07,8.09,8.21,8.09,8.19,26601000\n9-Apr-07,8.05,8.13,8.04,8.08,17696400\n5-Apr-07,8.02,8.07,7.89,8.01,39784300\n4-Apr-07,8.04,8.17,8.03,8.04,29286100\n3-Apr-07,8.09,8.19,8.05,8.08,40523200\n2-Apr-07,7.90,8.10,7.87,8.09,42834100\n30-Mar-07,7.97,8.02,7.88,7.89,32028500\n29-Mar-07,8.02,8.03,7.88,7.95,48954400\n28-Mar-07,7.84,8.04,7.80,7.98,48255200\n27-Mar-07,7.88,7.90,7.80,7.85,23945100\n26-Mar-07,7.94,8.06,7.80,7.87,26947900\n23-Mar-07,8.06,8.23,7.71,7.89,42496700\n22-Mar-07,8.03,8.10,8.00,8.08,40667300\n21-Mar-07,7.91,8.04,7.84,8.01,32689100\n20-Mar-07,7.77,7.90,7.70,7.88,30662300\n19-Mar-07,7.58,7.82,7.57,7.82,43949300\n16-Mar-07,7.63,7.65,7.52,7.55,27185500\n15-Mar-07,7.55,7.66,7.51,7.59,32067700\n14-Mar-07,7.61,7.64,7.44,7.51,55784500\n13-Mar-07,7.84,7.87,7.61,7.64,36766000\n12-Mar-07,7.95,8.01,7.82,7.82,36248800\n9-Mar-07,8.05,8.13,7.91,7.93,35635000\n8-Mar-07,7.81,8.00,7.75,7.93,72892200\n7-Mar-07,7.71,7.71,7.61,7.62,38277300\n6-Mar-07,7.67,7.70,7.48,7.64,79311100\n5-Mar-07,7.52,7.65,7.45,7.58,47084600\n2-Mar-07,7.75,7.77,7.59,7.59,43606300\n1-Mar-07,7.77,7.95,7.64,7.77,59408500\n28-Feb-07,7.90,8.00,7.75,7.91,54763100\n27-Feb-07,8.12,8.16,7.60,7.78,79596000\n26-Feb-07,8.31,8.34,8.15,8.26,26756100\n23-Feb-07,8.35,8.36,8.21,8.30,27670100\n22-Feb-07,8.48,8.53,8.32,8.35,26375600\n21-Feb-07,8.67,8.68,8.41,8.47,35874000\n20-Feb-07,8.56,8.69,8.54,8.65,27054800\n16-Feb-07,8.54,8.74,8.51,8.53,30962800\n15-Feb-07,8.55,8.64,8.51,8.60,23932000\n14-Feb-07,8.45,8.65,8.44,8.51,53559100\n13-Feb-07,8.47,8.50,8.36,8.45,56760500\n12-Feb-07,8.72,8.75,8.50,8.65,27325200\n9-Feb-07,8.82,8.97,8.69,8.73,82190600\n8-Feb-07,8.50,8.57,8.49,8.55,23470400\n7-Feb-07,8.56,8.64,8.46,8.56,27589600\n6-Feb-07,8.33,8.55,8.30,8.54,44673300\n5-Feb-07,8.20,8.38,8.19,8.33,27379500\n2-Feb-07,8.29,8.29,8.16,8.23,23730700\n1-Feb-07,8.17,8.30,8.13,8.29,26204200\n31-Jan-07,8.17,8.20,8.04,8.13,52442000\n30-Jan-07,8.38,8.42,8.19,8.20,27687700\n29-Jan-07,8.44,8.51,8.35,8.37,34547100\n26-Jan-07,8.15,8.48,8.14,8.42,53412200\n25-Jan-07,8.15,8.52,8.00,8.22,91401300\n24-Jan-07,8.31,8.35,8.11,8.20,73227400\n23-Jan-07,8.39,8.62,8.24,8.30,4870300\n22-Jan-07,8.33,8.43,8.25,8.41,53030500\n19-Jan-07,8.24,8.32,8.17,8.30,64219200\n18-Jan-07,8.06,8.24,8.06,8.18,74310400\n17-Jan-07,7.97,8.10,7.97,8.04,55566000\n16-Jan-07,7.89,8.01,7.87,7.94,64805600\n12-Jan-07,7.77,7.92,7.76,7.89,56276200\n11-Jan-07,7.73,7.80,7.68,7.77,35853800\n10-Jan-07,7.79,7.79,7.67,7.73,41390100\n9-Jan-07,7.75,7.86,7.73,7.79,55578600\n8-Jan-07,7.63,7.75,7.62,7.73,43758900\n5-Jan-07,7.72,7.75,7.57,7.62,40416400\n4-Jan-07,7.56,7.72,7.43,7.70,60570400\n3-Jan-07,7.56,7.67,7.44,7.51,77213400\n29-Dec-06,7.47,7.57,7.45,7.51,33525700\n28-Dec-06,7.64,7.64,7.47,7.50,29684900\n27-Dec-06,7.60,7.65,7.52,7.58,42961400\n26-Dec-06,7.45,7.57,7.37,7.49,31983700\n22-Dec-06,7.33,7.47,7.26,7.42,49805900\n21-Dec-06,7.35,7.42,7.27,7.31,58339100\n20-Dec-06,7.22,7.34,7.20,7.33,87609200\n19-Dec-06,7.12,7.20,7.08,7.18,93202100\n18-Dec-06,7.12,7.12,6.98,7.03,46306100\n15-Dec-06,7.15,7.22,7.04,7.08,83058200\n14-Dec-06,6.92,7.11,6.85,7.11,11191400\n13-Dec-06,7.13,7.17,6.85,6.88,66275600\n12-Dec-06,7.23,7.29,7.08,7.09,77530200\n11-Dec-06,7.27,7.32,7.17,7.24,72475700\n8-Dec-06,7.15,7.24,6.98,7.23,86979800\n7-Dec-06,7.32,7.40,7.15,7.16,4511300\n6-Dec-06,7.64,7.65,7.28,7.36,69369000\n5-Dec-06,7.63,7.83,7.42,7.68,5984000\n4-Dec-06,7.97,8.07,7.88,7.89,36565400\n1-Dec-06,8.10,8.15,7.95,8.04,32223100\n30-Nov-06,8.19,8.32,8.13,8.13,22781900\n29-Nov-06,8.37,8.38,8.10,8.17,28870600\n28-Nov-06,8.15,8.21,8.00,8.15,35389300\n27-Nov-06,8.55,8.55,8.14,8.16,33502600\n24-Nov-06,8.56,8.65,8.52,8.52,6309200\n22-Nov-06,8.57,8.73,8.49,8.61,14790500\n21-Nov-06,8.62,8.68,8.51,8.56,18237300\n20-Nov-06,8.89,8.94,8.66,8.67,14534200\n17-Nov-06,8.99,9.03,8.87,8.89,17090900\n16-Nov-06,9.05,9.19,8.95,9.03,22753300\n15-Nov-06,8.79,9.03,8.78,9.00,24267500\n14-Nov-06,8.90,8.94,8.68,8.80,25663900\n13-Nov-06,8.60,8.90,8.52,8.87,17873500\n10-Nov-06,8.62,8.64,8.54,8.58,6743400\n9-Nov-06,8.64,8.67,8.55,8.56,9056600\n8-Nov-06,8.73,8.79,8.59,8.63,17614300\n7-Nov-06,8.73,8.79,8.60,8.73,17123600\n6-Nov-06,8.44,8.69,8.44,8.66,16178600\n3-Nov-06,8.58,8.58,8.37,8.38,12701100\n2-Nov-06,8.52,8.58,8.28,8.56,22319600\n1-Nov-06,8.33,8.52,8.32,8.52,24341400\n31-Oct-06,8.30,8.45,8.15,8.28,14212600\n30-Oct-06,8.30,8.30,8.08,8.25,19053100\n27-Oct-06,8.49,8.49,8.27,8.29,18614800\n26-Oct-06,8.59,8.67,8.45,8.48,27399700\n25-Oct-06,8.37,8.65,8.32,8.49,41272300\n24-Oct-06,8.02,8.31,7.95,8.30,37719400\n23-Oct-06,7.86,8.03,7.81,7.90,34432000\n20-Oct-06,8.07,8.07,7.93,8.01,25905400\n19-Oct-06,8.01,8.07,7.97,8.03,12252100\n18-Oct-06,8.05,8.15,8.02,8.05,21757500\n17-Oct-06,7.99,8.03,7.85,8.03,28250100\n16-Oct-06,8.17,8.18,8.08,8.08,12892800\n13-Oct-06,8.23,8.24,8.13,8.17,16230800\n12-Oct-06,8.30,8.33,8.17,8.23,16574100\n11-Oct-06,8.17,8.34,8.11,8.27,25058900\n10-Oct-06,8.23,8.29,8.11,8.19,23120700\n9-Oct-06,8.30,8.31,8.17,8.19,16394400\n6-Oct-06,8.34,8.43,8.26,8.31,29012800\n5-Oct-06,8.48,8.52,8.26,8.33,26035100\n4-Oct-06,8.12,8.60,8.11,8.56,56286000\n3-Oct-06,8.16,8.35,8.08,8.23,31774200\n2-Oct-06,8.10,8.22,8.05,8.13,15485500\n29-Sep-06,8.25,8.25,8.04,8.09,29274400\n28-Sep-06,8.08,8.24,8.04,8.16,32933500\n27-Sep-06,8.50,8.52,7.97,8.00,58851100\n26-Sep-06,8.21,8.41,8.16,8.41,32872800\n25-Sep-06,8.00,8.21,7.97,8.15,32708600\n22-Sep-06,7.81,8.01,7.80,8.00,31977300\n21-Sep-06,7.82,7.95,7.73,7.76,27062600\n20-Sep-06,7.71,7.83,7.65,7.75,30836800\n19-Sep-06,7.90,7.92,7.63,7.66,44363600\n18-Sep-06,7.97,8.00,7.62,7.82,70538500\n15-Sep-06,8.48,8.49,7.75,8.02,78244600\n14-Sep-06,8.97,9.20,8.75,9.09,64882800\n13-Sep-06,9.21,9.48,9.13,9.19,69265600\n12-Sep-06,8.70,9.11,8.70,9.06,42915200\n11-Sep-06,8.78,8.84,8.64,8.71,29629300\n8-Sep-06,8.65,8.81,8.52,8.77,25405300\n7-Sep-06,8.56,8.64,8.40,8.58,25197100\n6-Sep-06,8.64,9.20,8.49,8.55,61959500\n5-Sep-06,8.28,8.41,8.20,8.39,23581500\n1-Sep-06,8.42,8.43,8.14,8.27,30574300\n31-Aug-06,8.25,8.47,8.25,8.37,28453400\n30-Aug-06,8.27,8.32,8.18,8.27,31792600\n29-Aug-06,8.06,8.29,7.98,8.26,34044400\n28-Aug-06,8.10,8.10,7.97,8.05,20730600\n25-Aug-06,7.97,8.10,7.86,8.00,37880100\n24-Aug-06,8.07,8.12,7.71,7.76,44715100\n23-Aug-06,7.61,7.86,7.58,7.76,49073900\n22-Aug-06,7.45,7.48,7.31,7.42,46988700\n21-Aug-06,7.78,7.78,7.47,7.47,67225200\n18-Aug-06,8.18,8.18,7.82,8.00,46667300\n17-Aug-06,8.26,8.42,8.01,8.17,44176100\n16-Aug-06,7.95,8.29,7.93,8.26,51082100\n15-Aug-06,7.94,7.96,7.72,7.92,28577900\n14-Aug-06,7.55,7.85,7.55,7.83,41962700\n11-Aug-06,7.42,7.67,7.34,7.37,38233000\n10-Aug-06,7.33,7.43,7.13,7.39,26714200\n9-Aug-06,7.49,7.50,7.32,7.33,31127400\n8-Aug-06,7.21,7.45,7.20,7.37,47157500\n7-Aug-06,7.12,7.21,7.01,7.17,26329700\n4-Aug-06,6.90,7.13,6.87,7.13,33270900\n3-Aug-06,6.77,6.98,6.73,6.86,27888400\n2-Aug-06,6.79,6.96,6.69,6.96,39908100\n1-Aug-06,6.68,6.68,6.47,6.58,22597900\n31-Jul-06,6.84,6.86,6.58,6.67,24647800\n28-Jul-06,6.89,6.90,6.74,6.89,16843800\n27-Jul-06,6.82,6.91,6.77,6.83,30629000\n26-Jul-06,6.75,6.90,6.66,6.75,35464800\n25-Jul-06,6.36,6.70,6.36,6.59,38435000\n24-Jul-06,6.35,6.41,6.33,6.36,17993300\n21-Jul-06,6.21,6.38,6.06,6.28,36545400\n20-Jul-06,6.32,6.33,6.17,6.19,31564300\n19-Jul-06,6.48,6.50,6.26,6.33,45545800\n18-Jul-06,6.41,6.50,6.40,6.44,14033200\n17-Jul-06,6.38,6.51,6.37,6.41,23944000\n14-Jul-06,6.55,6.57,6.28,6.38,27195700\n13-Jul-06,6.83,6.88,6.55,6.56,35771200\n12-Jul-06,6.89,6.93,6.85,6.88,19876700\n"
  },
  {
    "path": "examples/stockserver/GE.csv",
    "content": "﻿Date,Open,High,Low,Close,Volume\n9-Jul-12,19.99,20.04,19.91,20.04,32981135\n6-Jul-12,20.16,20.26,19.95,20.00,56250877\n5-Jul-12,20.34,20.48,20.29,20.33,29047342\n3-Jul-12,20.38,20.50,20.33,20.43,21247371\n2-Jul-12,20.74,20.82,20.28,20.49,61728049\n29-Jun-12,20.42,20.84,20.42,20.84,73025632\n28-Jun-12,19.92,20.20,19.87,20.20,56876039\n27-Jun-12,19.91,20.19,19.89,20.13,53796906\n26-Jun-12,19.54,19.90,19.51,19.80,58739769\n25-Jun-12,19.48,19.60,19.29,19.52,44663795\n22-Jun-12,19.68,19.91,19.51,19.81,51395151\n21-Jun-12,19.99,20.07,19.46,19.53,60933560\n20-Jun-12,20.00,20.15,19.85,20.10,46746988\n19-Jun-12,19.87,20.14,19.85,20.00,43183158\n18-Jun-12,19.88,19.98,19.75,19.75,41976725\n15-Jun-12,19.87,20.00,19.75,20.00,59803390\n14-Jun-12,19.36,19.77,19.24,19.72,62343806\n13-Jun-12,19.25,19.54,19.20,19.37,40217491\n12-Jun-12,19.16,19.48,19.09,19.48,47105771\n11-Jun-12,19.35,19.43,19.07,19.11,51452761\n8-Jun-12,18.98,19.25,18.90,19.20,107938072\n7-Jun-12,19.09,19.20,18.90,19.00,139356677\n6-Jun-12,18.39,18.88,18.31,18.88,42885177\n5-Jun-12,18.08,18.30,18.02,18.24,38446883\n4-Jun-12,18.44,18.51,18.05,18.15,66598068\n1-Jun-12,18.82,18.99,18.41,18.54,60949390\n31-May-12,19.01,19.22,18.87,19.09,49057830\n30-May-12,19.19,19.20,18.99,19.04,41845686\n29-May-12,19.29,19.43,19.20,19.35,35650328\n25-May-12,19.29,19.42,19.12,19.20,26849640\n24-May-12,19.15,19.39,19.02,19.25,41881328\n23-May-12,19.12,19.21,18.75,19.18,63503762\n22-May-12,19.16,19.29,19.06,19.18,47194608\n21-May-12,18.99,19.19,18.95,19.12,38608815\n18-May-12,18.95,19.16,18.85,18.95,61139528\n17-May-12,18.95,19.13,18.87,18.88,52169485\n16-May-12,18.89,19.26,18.71,19.00,85034893\n15-May-12,18.55,18.67,18.32,18.40,47568505\n14-May-12,18.82,18.84,18.55,18.60,46978276\n11-May-12,18.92,19.27,18.91,19.01,26289275\n10-May-12,19.12,19.23,19.01,19.09,35334510\n9-May-12,19.00,19.04,18.74,18.91,61707192\n8-May-12,19.23,19.33,19.02,19.25,40305127\n7-May-12,19.15,19.48,19.14,19.32,35750954\n4-May-12,19.56,19.59,19.25,19.34,34798925\n3-May-12,19.80,19.80,19.57,19.61,24201229\n2-May-12,19.72,19.78,19.52,19.77,33670431\n1-May-12,19.58,19.95,19.46,19.80,35021613\n30-Apr-12,19.68,19.75,19.44,19.58,32881668\n27-Apr-12,19.69,19.87,19.60,19.78,34210054\n26-Apr-12,19.43,19.71,19.40,19.62,34593929\n25-Apr-12,19.77,19.81,19.42,19.45,48353673\n24-Apr-12,19.19,19.60,19.11,19.54,49572581\n23-Apr-12,19.06,19.12,18.94,19.07,52049515\n20-Apr-12,19.43,19.64,19.25,19.36,67938316\n19-Apr-12,19.17,19.25,18.97,19.14,52169001\n18-Apr-12,19.23,19.34,19.04,19.10,33336130\n17-Apr-12,19.03,19.36,18.92,19.34,35526349\n16-Apr-12,18.98,19.13,18.85,18.90,30066742\n13-Apr-12,19.18,19.18,18.86,18.88,40319656\n12-Apr-12,19.01,19.32,18.96,19.30,28225802\n11-Apr-12,19.02,19.15,18.98,19.01,37828061\n10-Apr-12,19.12,19.13,18.70,18.74,54454478\n9-Apr-12,19.10,19.27,19.07,19.20,36361276\n5-Apr-12,19.61,19.71,19.46,19.49,39963753\n4-Apr-12,19.65,19.81,19.62,19.74,43699532\n3-Apr-12,19.97,20.02,19.80,19.96,43586752\n2-Apr-12,20.03,20.11,19.90,20.02,44170565\n30-Mar-12,20.07,20.13,19.95,20.07,40989510\n29-Mar-12,19.82,19.97,19.71,19.95,40666279\n28-Mar-12,20.02,21.00,19.76,20.01,55433074\n27-Mar-12,20.12,20.14,20.01,20.04,38323251\n26-Mar-12,19.98,20.11,19.92,20.05,42967920\n23-Mar-12,19.79,19.91,19.70,19.78,34213925\n22-Mar-12,19.95,19.96,19.69,19.85,50758849\n21-Mar-12,20.16,20.32,20.04,20.07,51106012\n20-Mar-12,20.02,20.21,19.98,20.07,47538067\n19-Mar-12,20.08,20.36,20.06,20.21,42727109\n16-Mar-12,20.26,20.30,20.01,20.20,79245321\n15-Mar-12,19.87,20.20,19.86,20.16,76328140\n14-Mar-12,19.63,19.89,19.58,19.79,71357915\n13-Mar-12,19.20,19.66,19.09,19.59,63925163\n12-Mar-12,19.09,19.19,19.04,19.13,35353860\n9-Mar-12,19.02,19.18,18.92,19.04,37487053\n8-Mar-12,18.98,19.09,18.92,19.03,35984877\n7-Mar-12,18.58,18.85,18.55,18.77,54451185\n6-Mar-12,18.60,18.61,18.32,18.42,56253542\n5-Mar-12,18.95,18.98,18.73,18.85,35572550\n2-Mar-12,19.14,19.14,18.90,18.97,36230486\n1-Mar-12,19.15,19.19,19.03,19.12,37339079\n29-Feb-12,19.18,19.25,19.01,19.05,44669877\n28-Feb-12,19.12,19.19,18.99,19.16,35027597\n27-Feb-12,19.02,19.31,18.98,19.07,37531231\n24-Feb-12,19.36,19.37,19.14,19.24,23927033\n23-Feb-12,19.07,19.37,19.00,19.31,45633119\n22-Feb-12,19.43,19.47,19.18,19.39,40883111\n21-Feb-12,19.42,19.50,19.32,19.41,41931202\n17-Feb-12,19.18,19.32,19.11,19.28,58083491\n16-Feb-12,18.86,19.03,18.80,19.01,40517282\n15-Feb-12,19.01,19.02,18.70,18.76,41438747\n14-Feb-12,18.93,19.08,18.80,18.94,39234324\n13-Feb-12,19.03,19.08,18.89,19.07,104299088\n10-Feb-12,18.99,19.01,18.77,18.88,109554509\n9-Feb-12,19.31,19.35,19.11,19.13,44183420\n8-Feb-12,19.19,19.31,19.08,19.24,33680798\n7-Feb-12,19.02,19.20,18.91,19.18,36048838\n6-Feb-12,18.99,19.15,18.95,19.05,42739078\n3-Feb-12,19.00,19.10,18.92,19.02,44886568\n2-Feb-12,18.85,18.93,18.70,18.75,37818773\n1-Feb-12,18.94,19.06,18.75,18.77,52023967\n31-Jan-12,18.98,19.01,18.69,18.71,46257767\n30-Jan-12,18.83,18.92,18.70,18.90,37731086\n27-Jan-12,19.00,19.13,18.92,19.03,32617690\n26-Jan-12,19.26,19.27,18.98,19.07,42493452\n25-Jan-12,18.83,19.16,18.79,19.13,51250162\n24-Jan-12,18.84,18.86,18.75,18.84,39736682\n23-Jan-12,19.09,19.24,18.90,18.94,50584572\n20-Jan-12,18.81,19.20,18.68,19.15,92432222\n19-Jan-12,19.03,19.19,18.93,19.15,53907545\n18-Jan-12,18.58,19.05,18.56,19.02,52912600\n17-Jan-12,18.99,19.10,18.68,18.74,49214839\n13-Jan-12,18.84,18.84,18.84,18.84,0\n12-Jan-12,18.96,19.00,18.76,18.93,38958098\n11-Jan-12,18.55,18.95,18.50,18.88,47868240\n10-Jan-12,19.01,19.05,18.62,18.72,59345419\n9-Jan-12,18.74,18.88,18.56,18.86,46987399\n6-Jan-12,18.73,18.79,18.56,18.65,51077228\n5-Jan-12,18.46,18.60,18.29,18.55,45819130\n4-Jan-12,18.31,18.60,18.28,18.56,42756809\n3-Jan-12,18.23,18.50,18.23,18.36,58713133\n30-Dec-11,17.91,17.91,17.91,17.91,0\n29-Dec-11,17.81,18.12,17.79,18.07,43269658\n28-Dec-11,18.00,18.02,17.72,17.83,39272556\n27-Dec-11,18.18,18.20,18.01,18.01,42257429\n23-Dec-11,18.23,18.23,18.23,18.23,0\n22-Dec-11,17.70,18.14,17.65,18.05,95632535\n21-Dec-11,17.32,17.77,17.15,17.69,80290090\n20-Dec-11,17.05,17.39,17.04,17.28,61471272\n19-Dec-11,16.97,17.10,16.79,16.86,66302819\n16-Dec-11,16.94,17.09,16.91,17.01,96493257\n15-Dec-11,16.82,16.87,16.59,16.79,61438304\n14-Dec-11,16.34,16.77,16.30,16.61,89095068\n13-Dec-11,16.56,16.72,16.30,16.42,73866341\n12-Dec-11,16.71,16.86,16.32,16.46,179405440\n9-Dec-11,16.38,16.98,16.36,16.84,85737912\n8-Dec-11,16.58,16.65,16.25,16.31,79725093\n7-Dec-11,16.68,16.83,16.53,16.74,65335139\n6-Dec-11,16.50,16.92,16.47,16.72,83017287\n5-Dec-11,16.35,16.50,16.18,16.33,61584932\n2-Dec-11,16.04,16.30,16.04,16.09,68438348\n1-Dec-11,15.89,16.00,15.73,15.91,58202724\n30-Nov-11,15.31,15.91,15.26,15.91,98619778\n29-Nov-11,14.91,15.15,14.82,14.92,80462539\n28-Nov-11,15.23,15.25,14.68,14.80,77629580\n25-Nov-11,14.76,15.02,14.70,14.70,23163628\n23-Nov-11,14.73,14.73,14.73,14.73,0\n22-Nov-11,15.29,15.29,14.98,14.99,74944684\n21-Nov-11,15.48,15.49,15.20,15.24,67277835\n18-Nov-11,15.77,15.85,15.62,15.65,46847150\n17-Nov-11,15.98,16.05,15.50,15.64,67472809\n16-Nov-11,16.07,16.25,15.92,15.95,52940381\n15-Nov-11,16.03,16.32,16.03,16.20,39777017\n14-Nov-11,16.22,16.28,16.02,16.10,40157999\n11-Nov-11,16.24,16.47,16.23,16.30,50227784\n10-Nov-11,16.08,16.19,15.97,16.06,59277683\n9-Nov-11,16.15,16.19,15.75,15.85,78632083\n8-Nov-11,16.44,16.49,16.26,16.48,53907852\n7-Nov-11,16.37,16.43,16.11,16.39,41221682\n4-Nov-11,16.55,16.56,16.23,16.39,41678462\n3-Nov-11,16.52,16.69,16.36,16.67,54881753\n2-Nov-11,16.37,16.52,16.16,16.25,48168409\n1-Nov-11,16.13,16.35,15.97,16.02,89785921\n31-Oct-11,16.98,17.01,16.70,16.71,49912931\n28-Oct-11,17.18,17.34,17.11,17.25,57773691\n27-Oct-11,16.96,17.50,16.81,17.22,110525900\n26-Oct-11,16.41,16.51,16.22,16.35,66600565\n25-Oct-11,16.46,16.49,16.05,16.22,82365056\n24-Oct-11,16.37,16.69,16.32,16.45,67050379\n21-Oct-11,16.37,16.53,16.13,16.31,113734359\n20-Oct-11,16.57,16.80,16.33,16.63,55091334\n19-Oct-11,16.71,16.87,16.41,16.52,51901813\n18-Oct-11,16.25,16.98,16.24,16.71,65456947\n17-Oct-11,16.49,16.60,16.19,16.23,46871676\n14-Oct-11,16.42,16.65,16.40,16.60,45142652\n13-Oct-11,16.23,16.31,16.02,16.22,46136083\n12-Oct-11,16.25,16.58,16.25,16.40,61761082\n11-Oct-11,15.98,16.22,15.96,16.14,46005456\n10-Oct-11,15.79,16.14,15.76,16.14,56216314\n7-Oct-11,15.70,15.74,15.24,15.50,65570877\n6-Oct-11,15.27,15.54,14.96,15.53,64951115\n5-Oct-11,14.94,15.33,14.75,15.27,79545845\n4-Oct-11,14.49,14.91,14.02,14.86,111980094\n3-Oct-11,15.10,15.39,14.68,14.69,92701596\n30-Sep-11,15.65,15.73,15.19,15.22,76368361\n29-Sep-11,15.82,15.95,15.50,15.86,60698965\n28-Sep-11,15.75,16.00,15.42,15.45,57403030\n27-Sep-11,15.81,16.07,15.67,15.76,80397287\n26-Sep-11,15.40,15.62,15.07,15.57,93908558\n23-Sep-11,14.90,15.25,14.86,15.21,65518622\n22-Sep-11,14.96,15.22,14.82,15.04,113698390\n21-Sep-11,15.97,16.07,15.36,15.38,74391261\n20-Sep-11,16.25,16.45,16.04,16.04,56239906\n19-Sep-11,15.98,16.27,15.87,16.18,54153527\n16-Sep-11,16.22,16.40,16.07,16.33,89204906\n15-Sep-11,15.90,16.10,15.84,16.08,67335512\n14-Sep-11,15.48,16.04,15.20,15.79,91340508\n13-Sep-11,15.02,15.46,14.86,15.41,83300620\n12-Sep-11,15.01,15.28,14.72,15.01,169797179\n9-Sep-11,15.38,15.70,15.03,15.09,144440926\n8-Sep-11,15.69,15.83,15.49,15.59,117920781\n7-Sep-11,15.50,15.85,15.44,15.80,60239307\n6-Sep-11,15.25,15.29,15.00,15.25,97476276\n2-Sep-11,15.85,15.92,15.55,15.76,61748844\n1-Sep-11,16.31,16.45,16.15,16.20,61219114\n31-Aug-11,16.24,16.49,16.16,16.31,62878746\n30-Aug-11,15.95,16.24,15.75,16.12,48565087\n29-Aug-11,15.79,16.06,15.75,16.04,47765612\n26-Aug-11,15.40,15.68,15.10,15.54,62374609\n25-Aug-11,15.94,16.05,15.34,15.45,67824937\n24-Aug-11,15.48,15.75,15.42,15.72,65400212\n23-Aug-11,15.17,15.54,15.11,15.54,70120992\n22-Aug-11,15.55,15.55,15.05,15.11,69430678\n19-Aug-11,15.10,20.00,15.03,15.09,79709833\n18-Aug-11,15.74,15.78,15.20,15.34,118459958\n17-Aug-11,16.30,16.54,16.08,16.23,50792524\n16-Aug-11,16.24,16.27,15.95,16.15,59329119\n15-Aug-11,16.17,16.41,16.08,16.39,65284738\n12-Aug-11,16.04,16.12,15.79,15.88,74809495\n11-Aug-11,15.15,15.92,15.00,15.68,131813030\n10-Aug-11,15.85,15.89,15.01,15.09,134859282\n9-Aug-11,15.59,15.96,14.82,15.96,198450895\n8-Aug-11,15.67,16.13,15.30,15.43,173633756\n5-Aug-11,16.66,16.95,16.10,16.51,124296268\n4-Aug-11,17.19,17.27,16.42,16.47,128116413\n3-Aug-11,17.25,17.50,17.06,17.47,86173870\n2-Aug-11,17.74,17.88,17.16,17.21,96869840\n1-Aug-11,18.39,18.42,17.68,17.97,69111109\n29-Jul-11,17.99,18.11,17.78,17.91,70172918\n28-Jul-11,18.14,18.46,18.09,18.11,48679934\n27-Jul-11,18.47,18.51,18.05,18.11,78142279\n26-Jul-11,19.00,19.04,18.50,18.56,68361605\n25-Jul-11,18.97,19.14,18.85,18.96,43822773\n22-Jul-11,19.43,19.53,18.95,19.04,82155363\n21-Jul-11,18.98,19.28,18.86,19.16,67148168\n20-Jul-11,18.75,18.91,18.60,18.79,48563407\n19-Jul-11,18.40,18.64,18.35,18.58,45677678\n18-Jul-11,18.33,18.39,18.16,18.29,39561266\n15-Jul-11,18.55,18.68,18.29,18.41,50543068\n14-Jul-11,18.65,18.80,18.47,18.53,43748929\n13-Jul-11,18.53,18.83,18.50,18.51,57145838\n12-Jul-11,18.43,18.66,18.38,18.38,47154080\n11-Jul-11,18.72,18.78,18.50,18.63,46560445\n8-Jul-11,19.08,19.10,18.85,18.99,54661280\n7-Jul-11,19.23,19.45,19.14,19.30,44971734\n6-Jul-11,18.97,19.10,18.96,19.05,31582030\n5-Jul-11,19.22,19.25,18.91,19.04,41907174\n1-Jul-11,19.20,19.20,19.20,19.20,0\n30-Jun-11,18.59,18.90,18.56,18.86,45061757\n29-Jun-11,18.54,18.61,18.40,18.56,38790857\n28-Jun-11,18.33,18.44,18.16,18.44,38701467\n27-Jun-11,18.01,18.42,18.00,18.28,46446016\n24-Jun-11,18.42,18.43,17.97,17.97,80830864\n23-Jun-11,18.34,18.39,18.01,18.38,69354457\n22-Jun-11,18.69,18.81,18.56,18.56,48098834\n21-Jun-11,18.60,18.94,18.56,18.81,58789290\n20-Jun-11,18.34,18.56,18.30,18.48,38905532\n17-Jun-11,18.63,18.90,18.34,18.49,56599993\n16-Jun-11,18.21,18.61,18.20,18.44,55091130\n15-Jun-11,18.47,18.67,18.32,18.39,58468779\n14-Jun-11,18.53,18.75,18.50,18.60,49365627\n13-Jun-11,18.31,18.52,18.22,18.39,42454178\n10-Jun-11,18.51,18.52,18.14,18.32,55838205\n9-Jun-11,18.55,18.76,18.49,18.58,39397030\n8-Jun-11,18.49,18.67,18.40,18.51,52221746\n7-Jun-11,18.54,18.70,18.47,18.48,52971736\n6-Jun-11,18.71,18.80,18.39,18.46,60470273\n3-Jun-11,18.83,18.99,18.75,18.82,49115094\n2-Jun-11,19.16,19.28,18.94,19.09,40266335\n1-Jun-11,19.47,19.60,19.10,19.13,65019974\n31-May-11,19.68,19.72,19.48,19.64,53174978\n27-May-11,19.44,19.44,19.44,19.44,0\n26-May-11,19.13,19.49,19.13,19.42,41627200\n25-May-11,19.00,19.36,18.97,19.22,43037267\n24-May-11,19.43,19.52,19.05,19.10,45704545\n23-May-11,19.32,19.48,19.13,19.39,39042352\n20-May-11,19.93,19.94,19.58,19.62,45538961\n19-May-11,19.87,20.05,19.84,19.96,43108170\n18-May-11,19.59,19.87,19.41,19.76,46127152\n17-May-11,19.62,19.73,19.46,19.59,47745039\n16-May-11,19.85,19.99,19.68,19.76,45778660\n13-May-11,20.12,20.14,19.76,19.89,42217816\n12-May-11,20.00,20.18,19.90,20.14,38362491\n11-May-11,20.21,20.41,20.00,20.09,38521909\n10-May-11,20.14,20.42,20.12,20.30,38194202\n9-May-11,19.97,20.11,19.90,20.07,38152473\n6-May-11,20.19,20.25,19.95,20.01,43688628\n5-May-11,20.23,20.30,19.81,19.90,57317849\n4-May-11,20.56,20.66,20.15,20.27,57941680\n3-May-11,20.36,20.65,20.35,20.64,40083007\n2-May-11,20.70,20.71,20.43,20.48,36148889\n29-Apr-11,20.72,20.74,20.40,20.45,41510013\n28-Apr-11,20.69,20.77,20.47,20.60,42122548\n27-Apr-11,20.19,20.85,20.15,20.65,88366249\n26-Apr-11,20.04,20.33,20.00,20.10,52475938\n25-Apr-11,20.14,20.15,19.89,19.89,55824252\n21-Apr-11,19.95,19.95,19.95,19.95,0\n20-Apr-11,20.52,20.54,20.28,20.40,55640378\n19-Apr-11,19.99,20.34,19.93,20.27,63535034\n18-Apr-11,19.77,20.00,19.51,19.98,63659660\n15-Apr-11,20.05,20.30,19.99,20.04,50148014\n14-Apr-11,19.85,20.08,19.60,20.00,44006005\n13-Apr-11,20.05,20.11,19.87,19.94,40061071\n12-Apr-11,20.02,20.16,19.80,20.01,48789643\n11-Apr-11,20.24,20.37,20.08,20.18,29311193\n8-Apr-11,20.48,20.52,20.07,20.19,48538067\n7-Apr-11,20.49,20.50,20.19,20.35,52159681\n6-Apr-11,20.57,20.62,20.37,20.55,50884417\n5-Apr-11,20.48,20.63,20.30,20.33,41616511\n4-Apr-11,20.73,20.75,20.44,20.53,45419960\n1-Apr-11,20.14,20.50,20.12,20.34,48432557\n31-Mar-11,20.08,20.15,19.96,20.05,40971918\n30-Mar-11,19.98,20.28,19.93,20.11,46982663\n29-Mar-11,19.66,19.91,19.53,19.86,36047799\n28-Mar-11,19.81,19.88,19.66,19.75,35462325\n25-Mar-11,19.85,19.93,19.69,19.75,40089875\n24-Mar-11,19.68,19.80,19.48,19.78,43829124\n23-Mar-11,19.45,19.56,19.25,19.53,44288216\n22-Mar-11,19.77,19.77,19.47,19.49,46578907\n21-Mar-11,19.68,19.80,19.55,19.72,53032950\n18-Mar-11,19.64,19.75,19.22,19.25,80025569\n17-Mar-11,19.27,19.63,19.06,19.22,83587563\n16-Mar-11,19.38,19.51,18.71,18.95,132139364\n15-Mar-11,18.84,19.76,18.60,19.61,133592280\n14-Mar-11,19.96,20.09,19.45,19.92,91171442\n11-Mar-11,19.95,20.48,19.94,20.36,56197193\n10-Mar-11,20.26,20.53,20.03,20.10,80867647\n9-Mar-11,20.58,20.71,20.30,20.63,49736667\n8-Mar-11,20.43,20.79,20.26,20.63,50355789\n7-Mar-11,20.40,20.59,20.01,20.38,66409045\n4-Mar-11,20.85,20.86,20.19,20.37,61163898\n3-Mar-11,20.88,20.93,20.70,20.75,46224475\n2-Mar-11,20.18,20.64,20.16,20.32,49115148\n1-Mar-11,21.12,21.17,20.24,20.25,62007638\n28-Feb-11,20.95,21.07,20.82,20.92,42664253\n25-Feb-11,20.71,20.88,20.50,20.82,45692478\n24-Feb-11,20.12,20.65,20.10,20.58,65331492\n23-Feb-11,20.52,20.69,20.08,20.37,84955972\n22-Feb-11,20.88,21.21,20.66,20.82,72520228\n18-Feb-11,21.44,21.44,21.44,21.44,0\n17-Feb-11,21.28,21.58,21.26,21.52,36659210\n16-Feb-11,21.42,21.49,21.25,21.44,39009490\n15-Feb-11,21.45,21.49,21.24,21.46,39618914\n14-Feb-11,21.51,21.65,21.45,21.50,43403958\n11-Feb-11,21.04,21.44,21.03,21.33,40655423\n10-Feb-11,21.17,21.31,20.94,21.27,50215326\n9-Feb-11,21.30,21.43,21.06,21.31,61056506\n8-Feb-11,20.96,21.31,20.91,21.28,54940281\n7-Feb-11,20.77,21.00,20.73,20.87,45386840\n4-Feb-11,20.79,20.80,20.40,20.56,43108075\n3-Feb-11,20.65,20.76,20.42,20.75,41179156\n2-Feb-11,20.84,20.96,20.65,20.71,42276241\n1-Feb-11,20.38,20.90,20.30,20.80,68304274\n31-Jan-11,20.13,20.29,20.10,20.14,51723309\n28-Jan-11,20.39,20.74,20.12,20.20,102189607\n27-Jan-11,19.96,20.33,19.90,20.28,67840508\n26-Jan-11,20.18,20.20,19.92,19.92,67753579\n25-Jan-11,19.98,20.28,19.80,19.98,100987036\n24-Jan-11,19.93,20.12,19.74,20.04,98547256\n21-Jan-11,19.31,19.97,19.25,19.74,229080105\n20-Jan-11,18.46,18.59,18.17,18.43,67732722\n19-Jan-11,18.61,18.64,18.19,18.33,82190096\n18-Jan-11,18.98,18.99,18.56,18.60,70505854\n14-Jan-11,18.82,18.82,18.82,18.82,0\n13-Jan-11,18.73,18.80,18.56,18.60,44815304\n12-Jan-11,18.57,18.73,18.48,18.67,61221148\n11-Jan-11,18.70,18.81,18.58,18.63,46593287\n10-Jan-11,18.61,18.75,18.46,18.51,62996490\n7-Jan-11,18.58,18.66,18.20,18.43,57336477\n6-Jan-11,18.69,18.72,18.42,18.56,39640066\n5-Jan-11,18.52,18.72,18.42,18.64,51322385\n4-Jan-11,18.34,18.61,18.12,18.61,79019457\n3-Jan-11,18.49,18.50,18.22,18.28,52828125\n31-Dec-10,18.15,18.35,18.13,18.29,27077170\n30-Dec-10,18.28,18.35,18.16,18.19,28898512\n29-Dec-10,18.37,18.49,18.26,18.27,34569273\n28-Dec-10,18.21,18.41,18.16,18.32,47723979\n27-Dec-10,17.92,18.23,17.92,18.19,33320094\n23-Dec-10,18.04,18.04,18.04,18.04,0\n22-Dec-10,17.83,18.08,17.82,18.06,42981603\n21-Dec-10,17.78,18.00,17.74,17.90,41836986\n20-Dec-10,17.77,17.80,17.65,17.70,40548515\n17-Dec-10,17.73,17.77,17.57,17.70,65250598\n16-Dec-10,17.53,17.87,17.47,17.77,53921536\n15-Dec-10,17.64,17.71,17.37,17.49,70756440\n14-Dec-10,17.66,17.90,17.58,17.69,76366580\n13-Dec-10,17.89,17.90,17.55,17.62,67875510\n10-Dec-10,17.22,17.88,17.20,17.72,125890688\n9-Dec-10,17.21,17.23,17.06,17.13,39089612\n8-Dec-10,17.01,17.13,16.86,17.04,47551146\n7-Dec-10,16.92,17.28,16.88,17.03,96459865\n6-Dec-10,16.70,16.86,16.63,16.70,58776382\n3-Dec-10,16.49,16.80,16.46,16.78,50259319\n2-Dec-10,16.29,16.68,16.28,16.68,80788064\n1-Dec-10,16.03,16.30,16.03,16.30,68945167\n30-Nov-10,15.75,15.95,15.72,15.83,53884776\n29-Nov-10,15.73,16.05,15.68,15.97,56513537\n26-Nov-10,15.78,15.88,15.75,15.80,17445694\n24-Nov-10,15.94,15.94,15.94,15.94,0\n23-Nov-10,15.83,15.89,15.63,15.76,55948985\n22-Nov-10,16.14,16.14,15.78,16.03,65706676\n19-Nov-10,16.06,16.23,15.95,16.22,49265775\n18-Nov-10,16.00,16.20,16.00,16.04,50090403\n17-Nov-10,15.87,15.92,15.76,15.81,36296458\n16-Nov-10,16.14,16.16,15.76,15.86,74113678\n15-Nov-10,16.23,16.43,16.18,16.20,39185841\n12-Nov-10,16.25,16.39,16.11,16.25,48318955\n11-Nov-10,16.44,16.52,16.22,16.35,46624537\n10-Nov-10,16.64,16.67,16.37,16.55,49697606\n9-Nov-10,16.82,16.82,16.54,16.62,49927676\n8-Nov-10,16.62,16.84,16.62,16.71,47818066\n5-Nov-10,16.52,16.86,16.51,16.73,69827369\n4-Nov-10,16.20,16.59,16.18,16.51,87208452\n3-Nov-10,15.96,16.10,15.88,16.06,65760383\n2-Nov-10,16.00,16.07,15.88,15.94,50545325\n1-Nov-10,16.09,16.18,15.88,15.95,52855390\n29-Oct-10,16.07,16.13,15.98,16.02,38174397\n28-Oct-10,16.22,16.30,16.03,16.08,44263355\n27-Oct-10,16.06,16.14,15.99,16.11,50622921\n26-Oct-10,16.06,16.32,16.03,16.16,49392679\n25-Oct-10,16.26,16.32,16.06,16.06,53601750\n22-Oct-10,16.11,16.20,16.01,16.06,31321487\n21-Oct-10,16.09,16.37,16.02,16.10,59504060\n20-Oct-10,16.19,16.20,15.88,16.05,69654539\n19-Oct-10,16.10,16.26,15.98,16.07,74162574\n18-Oct-10,16.31,16.34,16.10,16.25,67526781\n15-Oct-10,16.78,16.79,16.15,16.30,205160868\n14-Oct-10,17.39,17.39,16.97,17.16,57885946\n13-Oct-10,17.30,17.49,17.18,17.28,60806897\n12-Oct-10,16.97,17.30,16.94,17.19,64773486\n11-Oct-10,17.24,17.26,16.92,16.96,52275300\n8-Oct-10,17.13,17.29,17.03,17.12,51548319\n7-Oct-10,17.00,17.12,16.85,17.05,58598362\n6-Oct-10,16.49,17.00,16.46,16.90,74000037\n5-Oct-10,16.25,16.58,16.19,16.51,62611857\n4-Oct-10,16.31,16.37,16.00,16.10,45834517\n1-Oct-10,16.40,16.53,16.26,16.36,48433357\n30-Sep-10,16.46,16.69,16.15,16.25,59002411\n29-Sep-10,16.34,16.46,16.24,16.36,44123858\n28-Sep-10,16.43,16.52,16.14,16.44,53932793\n27-Sep-10,16.65,16.65,16.40,16.43,40569076\n24-Sep-10,16.33,16.66,16.30,16.66,85029830\n23-Sep-10,16.27,16.39,16.05,16.14,53181604\n22-Sep-10,16.51,16.67,16.40,16.50,47441823\n21-Sep-10,16.52,16.70,16.42,16.52,54155459\n20-Sep-10,16.27,16.60,16.23,16.55,46249065\n17-Sep-10,16.31,16.42,16.08,16.29,72500507\n16-Sep-10,16.18,16.31,16.11,16.23,47071978\n15-Sep-10,16.07,16.47,15.97,16.34,68557402\n14-Sep-10,16.18,16.28,16.11,16.16,48159510\n13-Sep-10,16.19,16.31,16.05,16.25,56310491\n10-Sep-10,15.96,16.08,15.81,15.98,46637735\n9-Sep-10,15.91,16.00,15.82,15.91,60506184\n8-Sep-10,15.39,15.79,15.32,15.70,75069811\n7-Sep-10,15.28,15.50,15.21,15.44,55365717\n6-Sep-10,15.39,15.39,15.39,15.39,0\n3-Sep-10,15.39,15.39,15.39,15.39,0\n2-Sep-10,15.10,15.20,14.94,15.15,54433594\n1-Sep-10,14.73,15.10,14.60,15.01,78042647\n31-Aug-10,14.36,14.58,14.31,14.43,59267945\n30-Aug-10,14.67,14.72,14.51,14.52,36583245\n27-Aug-10,14.61,14.76,14.37,14.71,46479690\n26-Aug-10,14.66,14.81,14.44,14.50,58288818\n25-Aug-10,14.46,14.68,14.25,14.57,76793219\n24-Aug-10,14.74,14.75,14.41,14.57,89672537\n23-Aug-10,15.22,15.27,14.85,14.89,55580935\n20-Aug-10,15.18,15.18,14.89,15.03,65408590\n19-Aug-10,15.56,15.64,15.05,15.25,82336793\n18-Aug-10,15.58,15.74,15.51,15.70,42305006\n17-Aug-10,15.66,15.74,15.50,15.58,60908201\n16-Aug-10,15.29,15.49,15.15,15.46,56429557\n13-Aug-10,15.34,15.52,15.34,15.38,41650721\n12-Aug-10,15.42,15.68,15.34,15.50,58243251\n11-Aug-10,15.98,16.03,15.54,15.70,77163949\n10-Aug-10,16.19,16.34,15.96,16.25,53236314\n9-Aug-10,16.42,16.46,16.30,16.38,39918748\n6-Aug-10,16.32,16.45,16.09,16.45,58955428\n5-Aug-10,16.35,16.54,16.27,16.52,46596850\n4-Aug-10,16.41,16.51,16.37,16.48,46123956\n3-Aug-10,16.39,16.52,16.36,16.40,55092889\n2-Aug-10,16.32,16.47,16.31,16.41,67411959\n30-Jul-10,15.92,16.24,15.91,16.12,60268043\n29-Jul-10,16.15,16.24,15.94,16.15,69921035\n28-Jul-10,16.10,16.18,15.95,16.05,52479011\n27-Jul-10,16.30,16.57,16.10,16.18,69942084\n26-Jul-10,15.91,16.16,15.70,16.14,80900461\n23-Jul-10,15.21,15.85,15.03,15.71,112735297\n22-Jul-10,15.08,15.29,14.97,15.21,64306318\n21-Jul-10,15.11,15.20,14.64,14.84,65021870\n20-Jul-10,14.36,15.01,14.36,14.94,67284756\n19-Jul-10,14.64,14.74,14.47,14.62,49072920\n16-Jul-10,15.00,15.06,14.50,14.55,125414928\n15-Jul-10,15.16,15.28,14.88,15.25,79328939\n14-Jul-10,15.26,15.30,15.06,15.20,45725156\n13-Jul-10,15.22,15.35,15.16,15.21,57860706\n12-Jul-10,14.90,14.99,14.78,14.93,38390802\n9-Jul-10,14.95,14.99,14.75,14.95,46094126\n8-Jul-10,14.87,15.17,14.57,14.83,88427044\n7-Jul-10,13.99,14.66,13.96,14.62,91711381\n6-Jul-10,14.11,14.31,13.81,13.97,77162144\n5-Jul-10,13.88,13.88,13.88,13.88,0\n2-Jul-10,13.88,13.88,13.88,13.88,0\n1-Jul-10,14.33,14.43,13.87,14.12,107077611\n30-Jun-10,14.47,14.69,14.35,14.42,81575331\n29-Jun-10,14.75,14.79,14.27,14.48,114918460\n28-Jun-10,14.96,15.20,14.91,15.00,60458288\n25-Jun-10,15.12,15.15,14.82,14.91,134229529\n24-Jun-10,15.38,15.45,15.00,15.08,96315696\n23-Jun-10,15.76,15.89,15.37,15.39,97574036\n22-Jun-10,16.09,16.17,15.77,15.79,64982605\n21-Jun-10,16.21,16.45,16.03,16.10,71221411\n18-Jun-10,16.00,16.05,15.86,15.95,59328741\n17-Jun-10,15.87,15.93,15.65,15.91,57041089\n16-Jun-10,15.71,16.09,15.62,15.85,86654923\n15-Jun-10,15.52,15.85,15.36,15.78,79088321\n14-Jun-10,15.77,15.88,15.35,15.39,75734324\n11-Jun-10,15.53,15.61,15.37,15.56,70851680\n10-Jun-10,15.59,15.87,15.52,15.68,78615829\n9-Jun-10,15.58,15.70,15.22,15.32,66853556\n8-Jun-10,15.46,15.55,15.05,15.48,89376550\n7-Jun-10,15.73,15.75,15.37,15.41,73216071\n4-Jun-10,16.08,16.08,15.56,15.71,114420039\n3-Jun-10,16.41,16.48,16.23,16.45,51842311\n2-Jun-10,16.16,16.39,15.95,16.35,62855841\n1-Jun-10,16.24,16.51,15.93,15.98,73127998\n31-May-10,16.35,16.35,16.35,16.35,0\n28-May-10,16.35,16.35,16.35,16.35,0\n27-May-10,16.42,16.68,16.14,16.66,70118296\n26-May-10,16.34,16.49,15.97,16.01,83279498\n25-May-10,15.50,15.97,15.25,15.95,122232845\n24-May-10,16.32,16.39,15.97,16.01,74174424\n21-May-10,15.70,16.43,15.65,16.42,146480615\n20-May-10,16.81,16.82,16.25,16.26,154437290\n19-May-10,17.07,17.38,16.75,17.26,134952218\n18-May-10,17.72,17.87,17.05,17.23,79499801\n17-May-10,17.61,17.72,17.09,17.56,78755091\n14-May-10,17.97,18.04,17.41,17.64,83715625\n13-May-10,18.41,18.43,17.96,18.05,64324914\n12-May-10,18.09,18.50,18.07,18.44,67914803\n11-May-10,17.85,18.34,17.82,18.00,83503793\n10-May-10,18.04,18.37,17.88,18.04,138171294\n7-May-10,17.51,17.69,16.52,16.88,165465888\n6-May-10,18.00,18.15,15.00,17.31,182119318\n5-May-10,18.22,18.49,17.93,18.10,106999583\n4-May-10,19.06,19.07,18.35,18.58,94123631\n3-May-10,18.97,19.34,18.96,19.26,60157638\n30-Apr-10,19.46,19.70,18.79,18.86,112133024\n29-Apr-10,19.04,19.49,19.03,19.49,70066312\n28-Apr-10,18.67,19.09,18.65,18.95,85008015\n27-Apr-10,19.24,19.49,18.59,18.70,109630022\n26-Apr-10,19.19,19.37,19.10,19.30,65712857\n23-Apr-10,18.86,19.10,18.80,19.07,57783904\n22-Apr-10,18.91,19.01,18.61,18.95,73044576\n21-Apr-10,19.10,19.18,18.89,19.03,58422093\n20-Apr-10,19.04,19.20,18.98,19.00,57666466\n19-Apr-10,18.64,18.97,18.64,18.94,78156195\n16-Apr-10,19.44,19.45,18.65,18.97,172384480\n15-Apr-10,19.45,19.69,19.37,19.50,103121896\n14-Apr-10,19.21,19.40,19.01,19.35,81958971\n13-Apr-10,18.75,19.13,18.72,18.95,92585051\n12-Apr-10,18.56,18.98,18.54,18.71,71700426\n9-Apr-10,18.59,18.67,18.40,18.52,54612664\n8-Apr-10,18.39,18.65,18.25,18.56,60592814\n7-Apr-10,18.57,18.75,18.39,18.50,60464146\n6-Apr-10,18.45,18.65,18.41,18.60,54106414\n5-Apr-10,18.42,18.65,18.33,18.53,55884338\n2-Apr-10,18.33,18.33,18.33,18.33,0\n1-Apr-10,18.33,18.33,18.33,18.33,0\n31-Mar-10,18.21,18.36,18.13,18.20,59216423\n30-Mar-10,18.47,18.48,18.25,18.30,53168618\n29-Mar-10,18.52,18.56,18.24,18.40,83921046\n26-Mar-10,18.32,18.63,18.18,18.34,84380439\n25-Mar-10,18.71,18.76,18.26,18.30,97668366\n24-Mar-10,18.36,18.94,18.27,18.45,124256121\n23-Mar-10,18.16,18.45,18.15,18.33,107580018\n22-Mar-10,17.86,18.13,17.80,18.07,64948924\n19-Mar-10,18.32,18.34,17.93,18.07,114796601\n18-Mar-10,18.09,18.26,17.91,18.19,88515375\n17-Mar-10,18.32,18.40,17.97,18.04,160499789\n16-Mar-10,17.49,18.16,17.45,18.07,228571003\n15-Mar-10,17.02,17.35,16.94,17.29,117962947\n12-Mar-10,16.58,17.06,16.50,17.04,112875358\n11-Mar-10,16.49,16.55,16.32,16.48,64907693\n10-Mar-10,16.49,16.61,16.42,16.51,67850897\n9-Mar-10,16.30,16.62,16.25,16.49,83685538\n8-Mar-10,16.37,16.47,16.24,16.27,53676899\n5-Mar-10,16.19,16.37,16.15,16.35,65191939\n4-Mar-10,16.07,16.16,15.97,16.11,47138628\n3-Mar-10,15.98,16.29,15.95,16.03,83827015\n2-Mar-10,15.92,15.95,15.83,15.90,52592566\n1-Mar-10,16.10,16.15,15.83,15.90,62798241\n26-Feb-10,16.00,16.15,15.95,16.06,60564391\n25-Feb-10,15.76,15.95,15.71,15.92,63364411\n24-Feb-10,15.98,16.14,15.88,16.12,56650528\n23-Feb-10,16.19,16.32,15.86,15.95,63371026\n22-Feb-10,16.23,16.34,16.16,16.25,44987983\n19-Feb-10,16.14,16.25,16.00,16.17,65206105\n18-Feb-10,16.10,16.29,16.08,16.24,47333498\n17-Feb-10,16.19,16.22,16.06,16.15,60553867\n16-Feb-10,15.70,16.12,15.68,16.04,69444725\n15-Feb-10,15.55,15.55,15.55,15.55,0\n12-Feb-10,15.55,15.55,15.55,15.55,0\n11-Feb-10,15.62,15.79,15.48,15.77,66896741\n10-Feb-10,15.57,15.87,15.50,15.69,68377072\n9-Feb-10,15.76,15.89,15.43,15.60,97580270\n8-Feb-10,15.83,15.84,15.47,15.60,70486995\n5-Feb-10,16.04,16.19,15.25,15.79,143503147\n4-Feb-10,16.48,16.50,16.01,16.04,110098604\n3-Feb-10,16.79,17.03,16.62,16.68,70778151\n2-Feb-10,16.27,16.95,16.24,16.85,115769504\n1-Feb-10,16.20,16.34,16.10,16.25,56940458\n29-Jan-10,16.22,16.50,16.07,16.08,81161558\n28-Jan-10,16.43,16.45,16.01,16.16,79162619\n27-Jan-10,16.29,16.39,16.03,16.30,76850502\n26-Jan-10,16.33,16.70,16.26,16.35,78026855\n25-Jan-10,16.46,16.53,16.22,16.37,75160360\n22-Jan-10,16.55,16.76,16.09,16.11,162677615\n21-Jan-10,16.47,16.48,15.95,16.02,99151179\n20-Jan-10,16.50,16.68,16.33,16.50,64495581\n19-Jan-10,16.35,16.75,16.34,16.54,60697341\n18-Jan-10,16.44,16.44,16.44,16.44,0\n15-Jan-10,16.44,16.44,16.44,16.44,0\n14-Jan-10,16.79,16.87,16.68,16.70,57380879\n13-Jan-10,16.76,16.92,16.57,16.83,65342374\n12-Jan-10,16.58,16.84,16.57,16.77,64622722\n11-Jan-10,16.83,16.88,16.54,16.76,76675382\n8-Jan-10,16.31,16.69,16.27,16.60,115112545\n7-Jan-10,15.48,16.48,15.43,16.25,185472210\n6-Jan-10,15.53,15.62,15.44,15.45,55464835\n5-Jan-10,15.46,15.67,15.45,15.53,64550557\n4-Jan-10,15.22,15.64,15.15,15.45,67079850\n1-Jan-10,15.13,15.13,15.13,15.13,0\n31-Dec-09,15.13,15.13,15.13,15.13,0\n30-Dec-09,15.30,15.37,15.26,15.35,44950008\n29-Dec-09,15.36,15.53,15.30,15.44,48394160\n28-Dec-09,15.38,15.43,15.26,15.34,45744797\n25-Dec-09,15.44,15.44,15.44,15.44,0\n24-Dec-09,15.38,15.48,15.36,15.44,18580143\n23-Dec-09,15.46,15.48,15.31,15.41,42340794\n22-Dec-09,15.57,15.69,15.43,15.48,48167278\n21-Dec-09,15.69,15.79,15.54,15.57,53145327\n18-Dec-09,15.91,15.91,15.59,15.59,79202456\n17-Dec-09,15.59,15.95,15.55,15.79,68273681\n16-Dec-09,15.80,15.85,15.66,15.69,72544429\n15-Dec-09,15.83,16.02,15.65,15.75,79241257\n14-Dec-09,15.98,16.07,15.92,15.95,43857464\n11-Dec-09,15.72,16.00,15.69,15.92,56448641\n10-Dec-09,15.81,15.85,15.55,15.61,55782077\n9-Dec-09,15.73,15.79,15.52,15.66,58696523\n8-Dec-09,15.90,15.93,15.65,15.72,78852160\n7-Dec-09,16.07,16.24,16.01,16.08,64417310\n4-Dec-09,16.34,16.49,16.06,16.20,88410930\n3-Dec-09,16.12,16.31,16.00,16.00,74555795\n2-Dec-09,16.12,16.22,15.96,16.07,65324649\n1-Dec-09,16.27,16.35,15.96,16.17,98034256\n30-Nov-09,15.82,16.06,15.81,16.02,70168497\n27-Nov-09,15.49,16.08,15.30,15.94,60917551\n26-Nov-09,16.18,16.18,16.18,16.18,0\n25-Nov-09,16.24,16.25,16.04,16.18,48170990\n24-Nov-09,16.08,16.20,15.92,16.12,80705378\n23-Nov-09,15.83,16.04,15.83,16.02,73905423\n20-Nov-09,15.66,15.72,15.45,15.59,63915925\n19-Nov-09,15.92,15.96,15.57,15.76,69771297\n18-Nov-09,16.01,16.14,15.95,16.09,47568793\n17-Nov-09,15.96,16.08,15.89,16.02,52038492\n16-Nov-09,15.80,16.19,15.77,16.00,98247874\n13-Nov-09,15.76,15.80,15.56,15.66,65431896\n12-Nov-09,15.80,15.94,15.66,15.75,65681917\n11-Nov-09,15.94,15.97,15.65,15.83,71297376\n10-Nov-09,15.95,15.99,15.48,15.78,73600035\n9-Nov-09,15.70,15.92,15.60,15.85,102908879\n6-Nov-09,14.98,15.49,14.83,15.33,165053340\n5-Nov-09,14.28,14.55,14.21,14.43,70544027\n4-Nov-09,14.44,14.59,14.15,14.19,80303530\n3-Nov-09,14.20,14.47,14.17,14.32,77081643\n2-Nov-09,14.30,14.59,14.19,14.47,101151035\n30-Oct-09,14.93,14.94,14.15,14.26,129847056\n29-Oct-09,14.54,14.99,14.46,14.87,83654135\n28-Oct-09,14.77,14.82,14.35,14.42,107272783\n27-Oct-09,15.07,15.14,14.86,14.93,87465137\n26-Oct-09,15.24,15.45,14.83,15.01,96270803\n23-Oct-09,15.37,15.40,15.11,15.20,88086658\n22-Oct-09,15.50,15.58,15.11,15.34,125121313\n21-Oct-09,15.51,15.95,15.50,15.53,96683541\n20-Oct-09,15.80,15.82,15.47,15.58,101087440\n19-Oct-09,16.05,16.13,15.80,15.84,99245638\n16-Oct-09,16.35,16.41,15.85,16.08,182334764\n15-Oct-09,16.79,16.84,16.48,16.79,92328869\n14-Oct-09,16.77,16.87,16.56,16.84,92569413\n13-Oct-09,16.32,16.54,16.08,16.39,70642934\n12-Oct-09,16.36,16.49,16.27,16.33,58627280\n9-Oct-09,16.20,16.37,16.10,16.18,70406854\n8-Oct-09,16.46,16.55,16.20,16.22,77369435\n7-Oct-09,16.03,16.32,15.91,16.16,60911488\n6-Oct-09,16.14,16.40,16.00,16.08,95697993\n5-Oct-09,15.59,15.91,15.51,15.83,74099074\n2-Oct-09,15.45,15.66,15.15,15.36,133091756\n1-Oct-09,16.31,16.39,15.95,15.97,113494015\n30-Sep-09,16.83,16.86,16.31,16.42,120763556\n29-Sep-09,16.91,17.09,16.67,16.71,80778157\n28-Sep-09,16.47,16.91,16.44,16.76,73786579\n25-Sep-09,16.35,16.57,16.06,16.37,103735735\n24-Sep-09,17.06,17.17,16.34,16.58,123229219\n23-Sep-09,17.17,17.50,16.95,17.00,133961830\n22-Sep-09,17.06,17.19,16.91,17.01,95910499\n21-Sep-09,16.43,16.89,16.24,16.76,109299091\n18-Sep-09,16.88,16.88,16.43,16.50,123024011\n17-Sep-09,16.97,17.52,16.35,16.66,255066597\n16-Sep-09,16.39,17.18,16.33,17.00,268968105\n15-Sep-09,15.49,16.15,15.48,16.00,209198570\n14-Sep-09,14.55,15.41,14.40,15.35,139284055\n11-Sep-09,14.87,14.98,14.63,14.67,101219050\n10-Sep-09,14.92,14.94,14.52,14.80,119880059\n9-Sep-09,14.78,15.03,14.61,14.87,154055453\n8-Sep-09,14.52,14.69,14.36,14.50,142985929\n4-Sep-09,13.48,13.90,13.30,13.87,77231239\n3-Sep-09,13.35,13.48,13.29,13.45,54457534\n2-Sep-09,13.21,13.32,13.03,13.20,70407149\n1-Sep-09,13.74,13.88,13.29,13.34,103474448\n31-Aug-09,13.94,13.98,13.75,13.90,67097540\n28-Aug-09,14.35,14.37,13.98,14.08,73884191\n27-Aug-09,14.11,14.25,13.95,14.19,63817002\n26-Aug-09,14.24,14.30,14.01,14.11,66641431\n25-Aug-09,14.23,14.44,14.20,14.30,77119208\n24-Aug-09,14.36,14.50,14.05,14.20,85597938\n21-Aug-09,14.16,14.28,14.00,14.21,90618252\n20-Aug-09,13.66,13.88,13.57,13.81,63880759\n19-Aug-09,13.33,13.62,13.29,13.53,60359806\n18-Aug-09,13.53,13.65,13.45,13.59,60136475\n17-Aug-09,13.35,13.42,13.16,13.36,81281080\n14-Aug-09,14.11,14.15,13.77,13.92,65673315\n13-Aug-09,14.38,14.42,13.94,14.10,83782321\n12-Aug-09,13.80,14.34,13.68,14.13,92351495\n10-Aug-09,14.62,14.83,14.39,14.57,85713074\n7-Aug-09,14.53,14.88,14.39,14.70,95800379\n6-Aug-09,14.19,14.43,14.02,14.31,120219534\n5-Aug-09,13.85,14.10,13.83,13.99,99715558\n4-Aug-09,13.66,13.82,13.39,13.82,114349462\n3-Aug-09,13.65,13.84,13.45,13.72,99030622\n31-Jul-09,13.24,13.45,13.15,13.40,109292157\n30-Jul-09,13.01,13.37,12.97,13.11,169052781\n29-Jul-09,12.44,12.44,12.11,12.26,80036296\n28-Jul-09,12.25,12.70,12.18,12.52,105512858\n27-Jul-09,12.17,12.38,12.03,12.32,77109009\n24-Jul-09,11.89,12.05,11.78,12.03,59733744\n23-Jul-09,11.65,12.08,11.57,11.95,102342437\n22-Jul-09,11.36,11.74,11.25,11.63,78154863\n21-Jul-09,11.78,11.81,11.32,11.47,101207956\n20-Jul-09,11.71,11.93,11.58,11.67,94415442\n17-Jul-09,11.91,11.98,11.55,11.65,180910101\n16-Jul-09,12.07,12.50,11.90,12.40,92452360\n15-Jul-09,11.92,12.28,11.86,12.24,92244871\n14-Jul-09,11.57,11.73,11.46,11.64,71587291\n13-Jul-09,10.88,11.50,10.87,11.46,101759137\n10-Jul-09,10.74,10.85,10.60,10.78,70115058\n9-Jul-09,10.94,10.99,10.63,10.86,81580715\n8-Jul-09,10.99,11.06,10.50,10.71,139675588\n7-Jul-09,11.47,11.54,10.96,11.01,99265387\n6-Jul-09,11.37,11.52,11.27,11.48,65476969\n3-Jul-09,11.46,11.46,11.46,11.46,0\n2-Jul-09,11.64,11.78,11.46,11.46,71625404\n1-Jul-09,11.76,11.90,11.64,11.78,64177587\n30-Jun-09,11.84,11.94,11.55,11.72,87682598\n29-Jun-09,11.82,11.83,11.64,11.76,52697210\n26-Jun-09,11.90,12.00,11.70,11.75,68111841\n25-Jun-09,11.62,11.93,11.52,11.86,75724868\n24-Jun-09,11.77,12.03,11.62,11.70,82638802\n23-Jun-09,11.53,11.66,11.25,11.60,86975149\n22-Jun-09,11.86,11.90,11.50,11.52,102436805\n19-Jun-09,12.13,12.27,11.93,12.10,124480951\n18-Jun-09,12.19,12.24,11.46,11.97,176125962\n17-Jun-09,12.71,12.73,12.14,12.25,129681427\n16-Jun-09,13.18,13.23,12.72,12.78,91392643\n15-Jun-09,13.36,13.36,13.01,13.15,75502442\n12-Jun-09,13.45,13.52,13.29,13.51,57438407\n11-Jun-09,13.43,13.75,13.34,13.46,71429611\n10-Jun-09,13.72,13.77,13.12,13.40,81913359\n9-Jun-09,13.56,13.69,13.40,13.57,54367363\n8-Jun-09,13.50,13.69,13.34,13.56,58481137\n5-Jun-09,13.96,13.98,13.51,13.54,75656003\n4-Jun-09,13.62,13.75,13.43,13.75,58371604\n3-Jun-09,13.65,13.70,13.30,13.50,68342938\n2-Jun-09,13.70,13.85,13.55,13.80,66116068\n1-Jun-09,13.82,13.99,13.51,13.86,86398604\n29-May-09,13.33,13.53,12.22,13.48,84888255\n28-May-09,13.23,13.28,12.81,13.19,82480027\n27-May-09,13.47,13.50,12.86,12.99,107521447\n26-May-09,13.02,13.61,12.85,13.39,95920365\n25-May-09,13.10,13.10,13.10,13.10,0\n22-May-09,13.36,13.40,13.02,13.10,54029750\n21-May-09,13.51,13.53,13.05,13.24,105432562\n20-May-09,14.03,14.38,13.74,13.77,113598933\n19-May-09,13.64,13.96,13.49,13.70,92104147\n18-May-09,13.11,13.50,13.08,13.47,76849633\n15-May-09,13.07,13.26,12.70,12.86,83378305\n14-May-09,12.77,13.18,12.50,13.04,90244434\n13-May-09,13.21,13.25,12.75,12.91,106630441\n12-May-09,14.24,14.31,13.26,13.68,118114493\n11-May-09,14.38,14.42,14.10,14.19,93490705\n8-May-09,14.38,14.55,14.14,14.53,128026140\n7-May-09,14.30,14.39,13.77,13.96,142137394\n6-May-09,13.47,13.80,13.31,13.67,128908384\n5-May-09,13.25,13.49,13.00,13.10,105501267\n4-May-09,12.96,13.17,12.81,13.10,117408153\n1-May-09,12.74,12.85,12.50,12.69,80027284\n30-Apr-09,12.53,12.81,12.52,12.65,114419151\n29-Apr-09,12.17,12.57,12.11,12.22,101896519\n28-Apr-09,11.95,12.28,11.78,12.00,82536500\n27-Apr-09,12.13,12.35,11.85,12.09,81725371\n24-Apr-09,12.03,12.35,11.95,12.11,97434081\n23-Apr-09,12.16,12.19,11.57,11.88,94889996\n22-Apr-09,11.66,12.48,11.52,11.80,130202761\n21-Apr-09,10.99,11.89,10.85,11.70,123408351\n20-Apr-09,12.00,12.12,11.25,11.35,143579125\n17-Apr-09,12.40,12.73,11.75,12.39,223472721\n16-Apr-09,12.06,12.43,11.71,12.27,132513500\n15-Apr-09,11.49,11.95,11.14,11.83,120205466\n14-Apr-09,12.49,12.50,11.42,11.51,183572367\n13-Apr-09,11.44,12.42,11.25,12.13,190532130\n10-Apr-09,11.33,11.33,11.33,11.33,0\n9-Apr-09,11.24,11.63,11.09,11.33,150453465\n8-Apr-09,10.73,10.77,10.41,10.64,95852785\n7-Apr-09,10.90,10.91,10.57,10.65,107503059\n6-Apr-09,10.85,11.23,10.66,11.19,131579863\n3-Apr-09,10.81,10.99,10.71,10.94,123519813\n2-Apr-09,10.75,11.00,10.57,10.74,146649831\n1-Apr-09,9.91,10.26,9.80,10.17,113956495\n31-Mar-09,10.33,10.46,9.93,10.11,132740205\n30-Mar-09,10.33,11.17,9.78,9.93,154240751\n27-Mar-09,10.77,11.03,10.65,10.78,104650060\n26-Mar-09,10.85,11.00,10.65,10.90,160903050\n25-Mar-09,10.74,11.09,10.09,10.49,209634451\n24-Mar-09,10.22,10.91,10.05,10.41,196566219\n23-Mar-09,10.28,10.45,9.78,10.43,212923298\n20-Mar-09,10.05,10.07,9.26,9.54,252823603\n19-Mar-09,11.20,11.35,9.95,10.13,287814092\n18-Mar-09,9.93,10.69,9.70,10.32,199587241\n17-Mar-09,9.85,10.05,9.44,10.00,150545253\n16-Mar-09,9.97,10.36,9.60,9.66,226291460\n13-Mar-09,9.90,9.98,9.30,9.62,216297410\n12-Mar-09,8.73,9.78,8.43,9.57,355141242\n11-Mar-09,9.23,9.36,8.31,8.49,251451845\n10-Mar-09,8.01,8.99,7.95,8.87,368767365\n9-Mar-09,6.95,7.83,6.88,7.41,265045990\n6-Mar-09,7.00,7.25,6.66,7.06,319471894\n5-Mar-09,6.75,7.17,6.52,6.66,445327128\n4-Mar-09,7.24,7.25,5.73,6.69,752906054\n3-Mar-09,7.84,7.89,6.85,7.01,414437124\n2-Mar-09,8.29,8.30,7.51,7.60,295778423\n27-Feb-09,8.60,9.20,8.40,8.51,320709654\n26-Feb-09,9.28,9.75,9.01,9.10,155333206\n25-Feb-09,9.09,9.46,8.71,9.01,191834683\n24-Feb-09,8.95,9.26,8.43,9.08,261491684\n23-Feb-09,9.58,9.60,8.78,8.85,224012693\n20-Feb-09,9.71,9.84,8.98,9.38,324876598\n19-Feb-09,10.94,10.98,9.95,10.06,156970343\n18-Feb-09,11.07,11.15,10.68,10.86,95281881\n17-Feb-09,11.20,11.20,10.71,10.81,133781058\n13-Feb-09,11.55,11.74,11.35,11.44,86594997\n12-Feb-09,11.75,11.75,11.20,11.68,132083894\n11-Feb-09,11.95,12.05,11.71,11.94,87572853\n10-Feb-09,12.54,12.64,11.36,11.62,196305906\n9-Feb-09,11.34,12.90,11.12,12.64,232937330\n6-Feb-09,10.90,11.45,10.75,11.10,218787549\n5-Feb-09,11.09,11.28,10.66,10.85,194796255\n4-Feb-09,11.56,11.78,11.19,11.26,103156253\n3-Feb-09,11.88,11.88,11.32,11.37,125994810\n2-Feb-09,12.03,12.03,11.51,11.62,140563792\n30-Jan-09,12.72,12.80,12.01,12.13,111418400\n29-Jan-09,13.33,13.35,12.69,12.72,79788186\n28-Jan-09,13.31,13.75,13.17,13.50,115454608\n27-Jan-09,12.73,13.19,12.65,13.06,119524153\n26-Jan-09,12.48,12.65,12.17,12.42,124298715\n23-Jan-09,12.69,13.19,11.87,12.03,326452811\n22-Jan-09,12.39,13.56,12.07,13.48,151556624\n21-Jan-09,11.88,13.23,11.88,13.03,147489718\n20-Jan-09,13.95,14.09,12.80,12.93,118805282\n16-Jan-09,14.20,14.34,13.06,13.96,129003918\n15-Jan-09,14.08,14.14,13.25,13.77,140611696\n14-Jan-09,14.59,14.64,14.02,14.11,100896917\n13-Jan-09,15.65,15.69,14.72,14.94,129126761\n12-Jan-09,15.96,16.20,15.68,15.83,65377025\n9-Jan-09,16.21,16.39,15.83,16.00,53162754\n8-Jan-09,16.05,16.20,15.72,16.14,62139490\n7-Jan-09,16.67,16.70,16.01,16.11,70864684\n6-Jan-09,16.86,16.98,16.46,16.86,71201034\n5-Jan-09,17.17,17.24,16.50,16.63,72545568\n2-Jan-09,16.51,17.07,16.27,17.07,57151376\n1-Jan-09,16.20,16.20,16.20,16.20,0\n31-Dec-08,15.82,16.34,15.77,16.20,60305337\n30-Dec-08,15.80,15.85,15.55,15.82,58436507\n29-Dec-08,15.95,16.00,15.35,15.66,55911865\n26-Dec-08,16.05,16.13,15.78,15.97,29675260\n25-Dec-08,16.11,16.11,16.11,16.11,0\n24-Dec-08,16.10,16.23,15.92,16.11,23410087\n23-Dec-08,16.27,16.50,16.18,16.43,65265052\n22-Dec-08,16.56,16.63,15.75,16.07,72551082\n19-Dec-08,16.16,16.55,16.00,16.50,136375044\n18-Dec-08,17.54,17.56,15.77,15.96,153694478\n17-Dec-08,17.62,17.79,16.48,17.49,101677279\n16-Dec-08,17.13,18.13,17.01,17.92,118834181\n15-Dec-08,16.95,17.11,16.66,16.95,63736632\n12-Dec-08,16.60,17.29,16.40,17.11,72101592\n11-Dec-08,17.40,17.60,16.99,17.05,80669589\n10-Dec-08,18.03,18.45,17.67,18.00,76964559\n9-Dec-08,18.28,18.66,17.59,17.78,110800971\n8-Dec-08,18.42,19.30,18.35,18.88,131428515\n5-Dec-08,17.38,18.30,16.98,17.85,107208927\n4-Dec-08,17.83,18.21,17.12,17.55,112163192\n3-Dec-08,17.07,18.27,16.86,18.13,157214628\n2-Dec-08,16.14,17.79,15.77,17.61,219136535\n1-Dec-08,16.36,16.38,15.42,15.50,104567108\n28-Nov-08,16.37,17.19,16.20,17.17,59027426\n27-Nov-08,16.19,16.19,16.19,16.19,0\n26-Nov-08,15.44,16.25,15.20,16.19,82853845\n25-Nov-08,15.94,16.08,15.09,15.77,122308617\n24-Nov-08,14.63,15.91,14.26,15.26,159236163\n21-Nov-08,13.56,14.06,12.80,14.03,172478743\n20-Nov-08,14.10,14.45,12.58,12.84,235124248\n19-Nov-08,15.87,16.20,14.45,14.45,181577941\n18-Nov-08,16.03,16.35,15.27,16.06,135139996\n17-Nov-08,15.95,16.50,15.40,16.11,97501087\n14-Nov-08,16.36,17.09,15.95,16.02,128296298\n13-Nov-08,16.41,16.93,14.58,16.86,300915599\n12-Nov-08,17.48,17.55,16.05,16.29,177128849\n11-Nov-08,18.17,18.30,17.36,17.81,104038271\n10-Nov-08,19.34,19.39,18.10,18.45,82203140\n7-Nov-08,18.62,19.10,18.28,18.86,78146500\n6-Nov-08,19.75,19.75,18.00,18.34,25762100\n5-Nov-08,20.69,20.98,19.80,19.93,84915900\n4-Nov-08,19.83,21.04,19.75,20.77,14545400\n3-Nov-08,19.78,19.88,19.20,19.30,55148700\n31-Oct-08,19.27,19.80,19.12,19.51,90057900\n30-Oct-08,19.79,19.97,18.93,19.35,90600600\n29-Oct-08,19.54,20.00,18.70,19.20,32386500\n28-Oct-08,18.37,19.60,17.73,19.49,32934200\n27-Oct-08,18.04,18.85,17.52,17.73,18811900\n24-Oct-08,17.46,18.23,17.27,17.83,27092200\n23-Oct-08,19.24,19.24,17.97,18.00,49040600\n22-Oct-08,20.04,20.20,18.50,18.96,17226500\n21-Oct-08,19.93,21.03,19.90,20.35,94184200\n20-Oct-08,20.26,20.37,19.43,20.14,92967100\n17-Oct-08,19.35,20.53,19.00,19.63,22294900\n16-Oct-08,19.51,19.96,18.31,19.89,50074800\n15-Oct-08,20.46,20.66,19.05,19.25,12503600\n14-Oct-08,22.31,22.39,19.75,20.85,50067000\n13-Oct-08,22.27,22.33,20.35,21.00,34254200\n10-Oct-08,18.70,21.50,18.40,21.50,64631200\n9-Oct-08,21.40,21.62,19.00,19.01,55495200\n8-Oct-08,20.02,21.99,19.90,20.65,36911000\n7-Oct-08,22.28,22.65,20.19,20.30,47661400\n6-Oct-08,20.54,21.87,19.69,21.38,77199500\n3-Oct-08,22.70,23.00,21.49,21.57,1894500\n2-Oct-08,22.83,22.89,22.01,22.15,70268900\n1-Oct-08,24.00,25.75,21.65,24.50,76132900\n30-Sep-08,23.87,26.05,23.87,25.50,74913800\n29-Sep-08,25.12,25.64,23.10,23.10,68623700\n26-Sep-08,24.75,25.81,24.52,25.25,46641400\n25-Sep-08,23.66,26.24,23.50,25.68,1468200\n24-Sep-08,25.08,25.08,23.81,24.59,59505000\n23-Sep-08,25.36,25.64,24.66,24.95,63596300\n22-Sep-08,27.38,27.48,25.65,26.15,55219400\n19-Sep-08,29.12,29.20,25.52,26.62,190000\n18-Sep-08,23.74,25.53,22.19,24.79,5957400\n17-Sep-08,23.99,24.38,22.30,23.39,24734100\n16-Sep-08,22.17,25.43,22.16,25.06,76966200\n15-Sep-08,24.82,26.05,23.91,24.60,70028800\n12-Sep-08,27.73,27.74,26.33,26.75,53174300\n11-Sep-08,27.70,28.33,26.85,28.16,77978000\n10-Sep-08,28.37,28.43,27.75,28.09,55305900\n9-Sep-08,28.96,29.28,28.06,28.12,71862900\n8-Sep-08,28.88,29.17,28.25,29.09,82003400\n5-Sep-08,27.49,27.93,27.39,27.88,49440100\n4-Sep-08,28.39,28.49,27.60,27.70,58907100\n3-Sep-08,28.45,28.69,28.30,28.57,35389400\n2-Sep-08,28.54,29.15,28.44,28.53,51562500\n29-Aug-08,28.78,28.88,28.08,28.10,39469400\n28-Aug-08,28.35,28.91,28.30,28.83,34077000\n27-Aug-08,28.27,28.59,28.06,28.22,33281000\n26-Aug-08,28.49,28.49,27.98,28.27,35170400\n25-Aug-08,29.04,29.04,28.18,28.32,41047600\n22-Aug-08,28.91,29.24,28.85,29.12,29463300\n21-Aug-08,28.30,28.82,28.20,28.75,34872600\n20-Aug-08,28.74,28.93,28.09,28.65,40120400\n19-Aug-08,29.20,29.25,28.44,28.71,41955600\n18-Aug-08,29.97,30.31,29.15,29.35,41493600\n15-Aug-08,29.66,30.05,29.52,29.80,39999700\n14-Aug-08,29.12,29.89,29.01,29.52,35589400\n13-Aug-08,29.58,29.66,29.08,29.31,38373400\n12-Aug-08,29.92,30.18,29.57,29.74,37373400\n11-Aug-08,29.62,30.39,29.47,29.95,48754100\n8-Aug-08,28.58,29.74,28.57,29.64,60508700\n7-Aug-08,28.77,29.08,28.49,28.57,39703200\n6-Aug-08,29.17,29.18,28.73,29.00,38137700\n5-Aug-08,28.38,29.25,28.38,29.25,51633700\n4-Aug-08,28.14,28.43,27.76,28.17,35939000\n1-Aug-08,28.43,28.70,28.10,28.21,33245700\n31-Jul-08,28.70,28.96,28.29,28.29,54253600\n30-Jul-08,28.73,29.35,28.56,28.97,54169500\n29-Jul-08,27.78,28.40,27.75,28.40,42848100\n28-Jul-08,28.70,28.95,27.65,27.69,48782300\n25-Jul-08,28.95,29.23,28.35,28.71,47866900\n24-Jul-08,29.74,29.89,28.68,28.71,60227900\n23-Jul-08,28.78,29.39,28.55,29.33,77069500\n22-Jul-08,27.82,28.53,27.60,28.50,70997000\n21-Jul-08,28.12,28.18,27.61,27.69,40724300\n18-Jul-08,28.12,28.19,27.58,28.00,54873500\n17-Jul-08,28.10,28.42,27.69,28.00,72183600\n16-Jul-08,26.80,27.83,26.42,27.68,81043200\n15-Jul-08,27.05,27.20,25.60,26.65,93011200\n14-Jul-08,28.13,28.13,27.02,27.18,55436600\n11-Jul-08,27.60,28.25,27.30,27.66,95319000\n10-Jul-08,27.55,27.73,27.07,27.64,84528700\n9-Jul-08,28.14,28.34,27.14,27.19,65052900\n8-Jul-08,27.18,28.22,27.11,28.06,87274000\n7-Jul-08,27.10,27.47,26.84,27.10,77311900\n3-Jul-08,26.75,27.09,26.50,26.91,38525900\n2-Jul-08,27.20,27.26,26.46,26.51,57029600\n1-Jul-08,26.42,27.21,26.30,27.12,88559200\n30-Jun-08,26.35,26.76,26.31,26.69,72928500\n27-Jun-08,26.81,26.83,26.15,26.26,81937300\n26-Jun-08,27.59,27.66,26.51,26.53,84943500\n25-Jun-08,27.74,28.64,27.65,27.99,79257100\n24-Jun-08,27.37,27.86,27.20,27.59,56768900\n23-Jun-08,27.59,27.80,27.28,27.40,60475600\n20-Jun-08,27.86,28.02,27.27,27.38,87973100\n19-Jun-08,28.17,28.23,27.80,27.91,55823800\n18-Jun-08,28.70,28.77,28.16,28.21,87211800\n17-Jun-08,29.18,29.24,28.77,28.86,62063400\n16-Jun-08,28.69,29.25,28.38,28.97,81446100\n13-Jun-08,29.36,29.40,28.49,29.15,15313000\n12-Jun-08,29.97,30.31,28.89,29.05,94782400\n11-Jun-08,30.38,30.45,29.80,29.83,66576200\n10-Jun-08,29.93,30.74,29.78,30.33,49125900\n9-Jun-08,30.23,30.35,29.88,30.06,55204700\n6-Jun-08,30.86,30.86,30.00,30.02,69202600\n5-Jun-08,30.56,31.14,30.46,31.06,47461300\n4-Jun-08,30.46,30.73,30.30,30.45,44645300\n3-Jun-08,30.56,30.80,30.25,30.46,51868700\n2-Jun-08,30.75,30.89,30.18,30.41,50584500\n30-May-08,30.79,30.93,30.57,30.72,48895200\n29-May-08,30.45,30.98,30.26,30.64,59448300\n28-May-08,30.57,30.68,30.21,30.55,63203000\n27-May-08,30.42,30.79,30.21,30.40,61860400\n23-May-08,30.96,30.97,30.35,30.43,61971300\n22-May-08,31.01,31.25,30.80,31.01,52992000\n21-May-08,31.77,31.78,30.91,30.99,93476100\n20-May-08,32.25,32.27,31.55,31.72,68011800\n19-May-08,32.13,32.70,32.00,32.40,57519200\n16-May-08,32.45,32.46,31.97,32.13,56429300\n15-May-08,32.66,32.71,32.17,32.37,53417200\n14-May-08,32.42,32.72,32.33,32.51,35377800\n13-May-08,32.53,32.70,32.26,32.33,33072900\n12-May-08,32.33,32.53,32.20,32.40,30478900\n9-May-08,32.46,32.46,32.14,32.27,38474400\n8-May-08,32.72,32.80,32.45,32.59,34326400\n7-May-08,33.01,33.10,32.50,32.57,37606400\n6-May-08,33.07,33.17,32.62,33.00,40335900\n5-May-08,33.36,33.36,32.96,33.18,26381600\n2-May-08,33.41,33.62,33.17,33.34,39057400\n1-May-08,32.80,33.29,32.64,33.12,41761400\n30-Apr-08,32.85,33.28,32.60,32.70,39537100\n29-Apr-08,33.19,33.26,32.75,32.82,39768900\n28-Apr-08,33.47,33.66,33.03,33.17,36581300\n25-Apr-08,33.01,33.39,32.81,33.33,41278200\n24-Apr-08,32.44,33.37,32.43,32.81,54083400\n23-Apr-08,32.49,32.72,32.28,32.36,41763100\n22-Apr-08,32.50,32.70,32.20,32.33,40796400\n21-Apr-08,32.70,32.74,32.38,32.46,33144000\n18-Apr-08,32.42,32.97,32.27,32.69,71571900\n17-Apr-08,32.11,32.40,32.00,32.02,60637100\n16-Apr-08,32.34,32.35,32.02,32.23,74501800\n15-Apr-08,32.04,32.11,31.55,31.98,63771600\n14-Apr-08,32.38,32.42,31.75,31.75,96570200\n11-Apr-08,32.50,33.01,31.81,32.05,41086600\n10-Apr-08,36.40,37.07,36.16,36.75,44135400\n9-Apr-08,36.90,36.90,36.21,36.44,31311600\n8-Apr-08,36.90,37.08,36.55,36.95,36631000\n7-Apr-08,37.87,37.90,37.10,37.26,36457900\n4-Apr-08,37.82,37.88,37.32,37.56,30201200\n3-Apr-08,37.74,38.03,37.57,37.84,32116900\n2-Apr-08,38.26,38.52,37.71,38.02,35922300\n1-Apr-08,37.36,38.43,37.32,38.43,50438000\n31-Mar-08,36.58,37.28,36.54,37.01,39251900\n28-Mar-08,36.87,37.06,36.51,36.61,34146200\n27-Mar-08,37.26,37.35,36.72,36.83,36957100\n26-Mar-08,37.02,37.25,36.79,37.13,37452700\n25-Mar-08,37.25,37.53,36.92,37.27,44500200\n24-Mar-08,37.63,37.67,37.04,37.40,46723200\n20-Mar-08,36.54,37.74,35.59,37.49,8086400\n19-Mar-08,36.20,36.63,35.55,35.59,64301000\n18-Mar-08,34.91,36.22,34.71,36.14,82319400\n17-Mar-08,32.99,34.73,32.83,34.33,79584000\n14-Mar-08,34.52,34.57,33.06,33.82,72596400\n13-Mar-08,33.51,34.51,33.31,34.25,64337500\n12-Mar-08,33.45,34.46,33.45,33.96,70079300\n11-Mar-08,32.41,33.40,32.31,33.40,66531200\n10-Mar-08,32.44,32.45,31.65,31.70,55229400\n7-Mar-08,32.67,32.95,32.01,32.23,56084200\n6-Mar-08,33.54,33.59,32.80,32.86,51380600\n5-Mar-08,33.73,33.95,33.29,33.67,42885100\n4-Mar-08,33.17,33.60,33.14,33.52,43469400\n3-Mar-08,33.34,33.50,33.14,33.40,34277600\n29-Feb-08,33.74,33.75,33.09,33.14,51226800\n28-Feb-08,33.98,34.00,33.62,33.85,32620800\n27-Feb-08,33.80,34.28,33.73,34.02,32561300\n26-Feb-08,34.07,34.15,33.77,33.94,46510700\n25-Feb-08,33.55,34.27,33.55,34.21,38973800\n22-Feb-08,33.71,33.80,33.15,33.55,39824400\n21-Feb-08,34.36,34.36,33.47,33.69,53862000\n20-Feb-08,34.05,34.45,33.80,34.36,34846100\n19-Feb-08,34.56,34.87,34.11,34.28,32672900\n15-Feb-08,34.36,34.51,34.10,34.37,35644800\n14-Feb-08,34.99,35.01,34.27,34.39,36491600\n13-Feb-08,34.65,35.10,34.59,34.98,35895200\n12-Feb-08,34.25,34.65,34.10,34.37,33412800\n11-Feb-08,33.94,34.19,33.55,34.01,32040900\n8-Feb-08,34.11,34.19,33.54,33.84,40900200\n7-Feb-08,34.08,34.49,34.02,34.23,31786700\n6-Feb-08,34.46,34.62,34.00,34.20,36786900\n5-Feb-08,35.09,35.09,34.18,34.21,55056200\n4-Feb-08,36.17,36.25,35.19,35.37,41993900\n1-Feb-08,35.59,36.48,35.36,36.16,56046300\n31-Jan-08,34.61,35.67,34.50,35.36,54271500\n30-Jan-08,34.68,35.72,34.57,34.94,51130500\n29-Jan-08,34.97,35.07,34.50,34.76,34857900\n28-Jan-08,34.31,34.75,34.14,34.72,35046400\n25-Jan-08,34.95,35.09,33.87,34.00,49974100\n24-Jan-08,34.65,34.76,33.95,34.65,50940300\n23-Jan-08,33.75,34.70,33.25,34.59,78644600\n22-Jan-08,33.20,34.70,33.19,34.05,71449100\n18-Jan-08,33.92,34.98,33.80,34.31,91050300\n17-Jan-08,34.74,34.80,32.92,33.21,81484800\n16-Jan-08,34.33,35.08,34.31,34.56,56106000\n15-Jan-08,35.26,35.27,34.35,34.53,53395600\n14-Jan-08,35.76,35.76,35.25,35.46,33959800\n11-Jan-08,35.56,35.60,34.98,35.17,45941500\n10-Jan-08,35.60,36.23,35.37,35.92,42376800\n9-Jan-08,35.48,35.94,35.15,35.80,40067200\n8-Jan-08,36.43,36.43,35.20,35.40,44612200\n7-Jan-08,36.21,36.50,35.91,36.18,36257800\n4-Jan-08,36.54,36.67,35.98,36.04,39329500\n3-Jan-08,36.81,37.22,36.70,36.80,25904800\n2-Jan-08,37.10,37.45,36.55,36.76,38298700\n31-Dec-07,37.30,37.30,36.96,37.07,20794900\n28-Dec-07,37.35,37.58,37.06,37.34,22239700\n27-Dec-07,37.40,37.54,37.11,37.19,22843400\n26-Dec-07,37.41,37.69,37.40,37.55,21309600\n24-Dec-07,37.40,37.77,37.15,37.53,16264600\n21-Dec-07,36.71,37.60,36.65,37.14,73651300\n20-Dec-07,36.60,36.65,36.22,36.52,32864500\n19-Dec-07,36.78,37.02,36.32,36.57,38091700\n18-Dec-07,36.68,36.93,36.24,36.80,37100000\n17-Dec-07,36.82,36.90,36.28,36.48,38848600\n14-Dec-07,37.48,37.51,36.87,36.91,39521400\n13-Dec-07,37.00,37.79,36.75,37.58,35740600\n12-Dec-07,37.95,38.14,36.85,37.25,50457900\n11-Dec-07,37.40,37.95,36.15,37.03,65372300\n10-Dec-07,37.26,37.49,37.05,37.41,37618400\n7-Dec-07,37.25,37.50,36.95,37.23,31044400\n6-Dec-07,36.70,37.29,36.54,37.26,34845100\n5-Dec-07,36.60,36.84,36.24,36.71,54747400\n4-Dec-07,36.72,36.82,36.07,36.25,58312600\n3-Dec-07,38.20,38.20,36.60,36.93,63052000\n30-Nov-07,38.67,38.67,37.65,38.29,52424400\n29-Nov-07,38.29,38.32,37.80,38.14,35174900\n28-Nov-07,37.69,38.66,37.56,38.46,50046900\n27-Nov-07,36.85,37.67,36.80,37.45,43866300\n26-Nov-07,37.75,37.75,36.52,36.73,41576700\n23-Nov-07,37.37,37.87,37.16,37.67,22829400\n21-Nov-07,37.65,37.99,36.94,37.17,64147800\n20-Nov-07,38.15,38.61,37.50,38.04,42643400\n19-Nov-07,38.48,38.51,38.00,38.16,34580500\n16-Nov-07,38.50,38.67,37.87,38.65,49423000\n15-Nov-07,38.93,38.93,38.13,38.31,41505400\n14-Nov-07,39.90,39.95,38.82,39.01,38827400\n13-Nov-07,38.50,39.25,38.25,39.21,41656200\n12-Nov-07,38.24,39.04,38.17,38.25,36583600\n9-Nov-07,38.52,38.75,38.11,38.38,42491500\n8-Nov-07,39.20,39.32,37.50,39.02,52774300\n7-Nov-07,39.90,39.92,38.99,39.08,46552000\n6-Nov-07,40.20,40.49,39.97,40.18,41953300\n5-Nov-07,39.95,40.54,39.95,40.20,28887600\n2-Nov-07,40.50,40.53,39.97,40.33,36347400\n1-Nov-07,40.89,40.98,40.17,40.34,37869000\n31-Oct-07,40.62,41.22,40.46,41.16,33693600\n30-Oct-07,40.49,40.65,40.31,40.48,25450100\n29-Oct-07,40.47,40.68,40.32,40.56,26178000\n26-Oct-07,40.35,40.50,39.96,40.38,24525700\n25-Oct-07,40.38,40.55,39.72,40.16,38252900\n24-Oct-07,40.42,40.48,39.40,40.23,39809800\n23-Oct-07,40.26,40.59,40.02,40.48,26862700\n22-Oct-07,39.84,40.24,39.68,40.17,28189900\n19-Oct-07,40.53,40.79,39.87,40.04,54560100\n18-Oct-07,40.93,41.00,40.52,40.79,31049700\n17-Oct-07,40.93,41.14,40.77,41.00,39913600\n16-Oct-07,40.78,40.86,40.58,40.77,29549400\n15-Oct-07,40.90,40.94,40.41,40.82,36210100\n12-Oct-07,40.86,41.04,40.12,41.03,50007600\n11-Oct-07,41.95,42.09,41.37,41.60,29538100\n10-Oct-07,41.92,42.08,41.70,41.81,18776900\n9-Oct-07,41.51,42.03,41.50,42.02,17992800\n8-Oct-07,41.74,41.80,41.41,41.53,14372600\n5-Oct-07,41.93,42.05,41.69,41.77,21554600\n4-Oct-07,41.71,41.87,41.45,41.70,15887500\n3-Oct-07,41.95,42.11,41.50,41.55,24850700\n2-Oct-07,42.03,42.15,41.80,42.12,19089900\n1-Oct-07,41.28,42.09,41.28,42.02,30302900\n28-Sep-07,41.26,41.50,41.10,41.40,29170500\n27-Sep-07,41.40,41.53,41.13,41.39,22022100\n26-Sep-07,41.18,41.50,40.96,41.27,28507700\n25-Sep-07,40.75,41.34,40.56,41.10,26335900\n24-Sep-07,41.25,41.34,40.77,40.85,28198200\n21-Sep-07,41.61,41.73,41.18,41.25,38058000\n20-Sep-07,41.50,41.50,41.05,41.24,31893400\n19-Sep-07,41.77,42.07,41.64,41.77,43303200\n18-Sep-07,40.36,41.75,40.20,41.68,50130900\n17-Sep-07,40.08,40.35,40.04,40.18,21770400\n14-Sep-07,40.24,40.63,39.94,40.35,33193600\n13-Sep-07,40.01,40.80,39.94,40.51,43079400\n12-Sep-07,39.39,40.25,39.31,39.90,39377100\n11-Sep-07,39.20,39.74,39.05,39.50,33163400\n10-Sep-07,38.80,39.53,38.51,39.19,37849700\n7-Sep-07,38.91,39.00,38.61,38.75,43521900\n6-Sep-07,38.81,39.45,38.51,39.40,38144100\n5-Sep-07,38.77,38.97,38.45,38.75,34103200\n4-Sep-07,38.84,39.30,38.51,39.04,30881200\n31-Aug-07,38.80,39.09,38.49,38.87,32902800\n30-Aug-07,38.32,38.72,38.25,38.40,22315000\n29-Aug-07,38.24,38.75,38.15,38.71,28508300\n28-Aug-07,38.83,38.92,38.05,38.05,33887500\n27-Aug-07,39.26,39.26,38.90,39.00,22676400\n24-Aug-07,39.04,39.47,38.98,39.41,34486500\n23-Aug-07,39.21,39.42,38.60,39.12,32518100\n22-Aug-07,38.65,39.28,38.50,39.14,37224800\n21-Aug-07,38.10,38.77,37.98,38.35,31136700\n20-Aug-07,38.49,38.50,37.75,38.22,40109300\n17-Aug-07,38.11,38.64,37.72,38.45,58425500\n16-Aug-07,36.51,37.29,36.20,37.20,55361600\n15-Aug-07,37.58,37.93,36.72,36.90,51960400\n14-Aug-07,38.17,38.19,37.51,37.68,40540700\n13-Aug-07,38.57,38.80,38.00,38.17,38444500\n10-Aug-07,38.50,38.63,37.19,38.23,75199700\n9-Aug-07,39.67,40.13,38.87,38.94,59222600\n8-Aug-07,39.50,40.46,39.46,40.46,42465400\n7-Aug-07,38.89,39.73,38.74,39.48,41931500\n6-Aug-07,38.23,39.23,38.01,39.10,52292500\n3-Aug-07,38.85,39.09,38.06,38.06,46842000\n2-Aug-07,39.00,39.18,38.64,39.03,33882900\n1-Aug-07,38.60,39.29,38.45,38.95,46007700\n31-Jul-07,39.54,39.75,38.73,38.76,38470000\n30-Jul-07,39.03,39.44,38.65,39.27,37218800\n27-Jul-07,39.61,39.74,38.79,38.79,47194400\n26-Jul-07,40.01,40.64,39.35,39.53,62011200\n25-Jul-07,40.57,40.72,39.94,40.42,38745400\n24-Jul-07,40.63,40.98,40.15,40.22,44921700\n23-Jul-07,40.30,40.96,40.30,40.82,32106400\n20-Jul-07,40.44,40.82,40.00,40.12,47194800\n19-Jul-07,40.58,40.79,40.48,40.71,28702600\n18-Jul-07,40.32,40.78,39.93,40.45,44554300\n17-Jul-07,40.01,40.95,40.00,40.71,54731100\n16-Jul-07,39.60,40.20,39.54,40.12,39027700\n13-Jul-07,39.63,40.17,39.50,39.50,73998100\n12-Jul-07,38.44,39.00,38.20,39.00,44581900\n11-Jul-07,37.80,38.24,37.73,38.20,31920500\n10-Jul-07,38.45,38.49,37.89,37.90,38901300\n9-Jul-07,38.56,38.68,38.37,38.62,29953900\n6-Jul-07,38.48,38.60,38.37,38.48,23154400\n5-Jul-07,38.58,38.67,38.37,38.54,25612700\n3-Jul-07,38.36,38.79,38.36,38.70,17446000\n2-Jul-07,38.42,38.54,38.02,38.26,26561100\n29-Jun-07,38.23,38.70,38.00,38.28,38603400\n28-Jun-07,38.15,38.38,37.78,38.12,32566200\n27-Jun-07,37.82,38.09,37.64,38.06,40490400\n26-Jun-07,38.30,38.32,37.87,38.02,40602200\n25-Jun-07,38.33,38.60,37.93,38.21,47601300\n22-Jun-07,38.71,39.15,38.24,38.24,62333400\n21-Jun-07,38.95,38.95,38.50,38.80,40402100\n20-Jun-07,39.45,39.77,38.96,39.07,56706200\n19-Jun-07,37.95,39.60,37.91,39.29,73903300\n18-Jun-07,38.18,38.18,37.96,38.07,24299600\n15-Jun-07,37.96,38.16,37.96,38.12,46602200\n14-Jun-07,37.60,37.98,37.60,37.80,33075400\n13-Jun-07,37.25,37.66,37.10,37.64,32450300\n12-Jun-07,37.35,37.49,37.05,37.05,31295900\n11-Jun-07,37.07,37.62,37.05,37.46,25610000\n8-Jun-07,36.80,37.34,36.65,37.32,28943200\n7-Jun-07,37.21,37.37,36.73,36.76,38265600\n6-Jun-07,37.30,37.40,37.12,37.29,30368700\n5-Jun-07,37.81,37.81,37.37,37.40,35453700\n4-Jun-07,37.79,38.02,37.68,37.81,32056500\n1-Jun-07,37.68,37.75,37.24,37.45,29137300\n31-May-07,37.78,37.79,37.51,37.58,30050800\n30-May-07,37.19,37.75,37.16,37.73,25383900\n29-May-07,37.61,37.69,37.14,37.40,28815000\n25-May-07,37.43,37.63,37.32,37.56,23577700\n24-May-07,37.74,37.81,37.28,37.38,29915200\n23-May-07,37.50,37.80,37.34,37.60,33851300\n22-May-07,37.22,37.56,37.11,37.34,30103000\n21-May-07,37.31,37.45,37.00,37.10,39555600\n18-May-07,36.80,37.27,36.70,36.96,37285800\n17-May-07,36.75,36.83,36.45,36.53,23480800\n16-May-07,36.72,36.89,36.52,36.83,25340300\n15-May-07,36.67,37.20,36.61,36.64,27373500\n14-May-07,37.00,37.00,36.50,36.60,27455200\n11-May-07,36.80,37.04,36.80,36.97,20563400\n10-May-07,37.10,37.10,36.70,36.78,27204400\n9-May-07,36.92,37.33,36.86,37.26,29236000\n8-May-07,37.09,37.19,36.95,37.08,26145900\n7-May-07,37.23,37.43,37.15,37.24,20408900\n4-May-07,37.44,37.44,37.06,37.15,29543800\n3-May-07,37.34,37.42,37.13,37.34,26751000\n2-May-07,37.12,37.56,37.12,37.31,38574700\n1-May-07,36.82,37.18,36.72,37.10,42857500\n30-Apr-07,36.90,37.24,36.61,36.86,45916900\n27-Apr-07,36.10,37.22,36.02,36.84,90131100\n26-Apr-07,35.46,35.85,35.46,35.84,45500800\n25-Apr-07,34.98,35.45,34.91,35.41,44808400\n24-Apr-07,34.80,34.94,34.55,34.76,36878800\n23-Apr-07,35.13,35.15,34.78,34.80,33150400\n20-Apr-07,35.23,35.24,34.93,35.13,57547900\n19-Apr-07,35.05,35.38,34.90,35.00,40227300\n18-Apr-07,35.16,35.25,34.90,35.13,37048900\n17-Apr-07,35.37,35.37,35.06,35.20,35656700\n16-Apr-07,35.50,35.60,35.20,35.36,33208700\n13-Apr-07,35.60,35.60,35.25,35.38,34107200\n12-Apr-07,35.16,35.24,34.86,35.18,30677800\n11-Apr-07,35.00,35.20,34.86,34.95,30415000\n10-Apr-07,34.80,34.99,34.75,34.88,29037300\n9-Apr-07,35.10,35.15,34.75,34.78,26255800\n5-Apr-07,35.13,35.19,34.94,35.02,26395400\n4-Apr-07,35.37,35.38,35.07,35.11,30991300\n3-Apr-07,35.43,35.60,35.17,35.32,30581200\n2-Apr-07,35.36,35.53,35.11,35.29,21131200\n30-Mar-07,35.56,35.58,35.00,35.36,33571900\n29-Mar-07,35.60,35.73,35.34,35.55,26656800\n28-Mar-07,35.70,35.73,35.30,35.55,32003900\n27-Mar-07,35.80,35.90,35.66,35.79,26411800\n26-Mar-07,35.85,36.00,35.44,36.00,29105200\n23-Mar-07,35.79,35.91,35.60,35.82,33258500\n22-Mar-07,35.44,35.84,35.40,35.81,33220600\n21-Mar-07,34.75,35.70,34.73,35.48,40268700\n20-Mar-07,34.63,34.85,34.50,34.77,26101300\n19-Mar-07,34.50,34.67,34.43,34.67,26180600\n16-Mar-07,34.60,34.84,34.25,34.36,44366500\n15-Mar-07,34.20,34.68,34.11,34.52,33816500\n14-Mar-07,34.09,34.40,33.90,34.31,35166400\n13-Mar-07,34.27,34.38,34.01,34.09,37693400\n12-Mar-07,34.28,34.63,34.01,34.44,30074100\n9-Mar-07,34.57,34.64,34.22,34.32,33668200\n8-Mar-07,34.60,34.64,34.35,34.45,28986300\n7-Mar-07,34.74,34.75,34.32,34.33,34025900\n6-Mar-07,34.73,34.84,34.52,34.72,33399500\n5-Mar-07,34.74,34.97,34.52,34.55,31890400\n2-Mar-07,34.93,35.15,34.70,34.87,44922200\n1-Mar-07,34.61,36.84,34.32,35.00,50050800\n28-Feb-07,34.80,35.08,34.65,34.91,50410900\n27-Feb-07,35.30,36.60,34.50,34.66,59085400\n26-Feb-07,35.26,35.38,35.15,35.34,26139400\n23-Feb-07,35.33,35.35,35.09,35.10,35393100\n22-Feb-07,35.82,35.88,35.31,35.40,35855900\n21-Feb-07,35.99,36.10,35.82,35.91,26042800\n20-Feb-07,35.86,36.13,35.75,36.11,23529000\n16-Feb-07,36.04,36.10,35.87,35.87,30544800\n15-Feb-07,36.36,36.47,36.06,36.14,22526300\n14-Feb-07,35.93,36.50,35.79,36.47,31404300\n13-Feb-07,35.70,36.59,35.64,35.77,21967500\n12-Feb-07,35.55,35.88,35.55,35.64,16118700\n9-Feb-07,35.71,35.84,35.48,35.53,29575700\n8-Feb-07,36.06,36.06,35.60,35.74,33654300\n7-Feb-07,36.31,36.35,36.06,36.10,19994400\n6-Feb-07,36.40,36.44,36.23,36.31,21869800\n5-Feb-07,36.27,36.48,36.20,36.37,26069000\n2-Feb-07,36.23,36.40,36.12,36.27,24949400\n1-Feb-07,36.18,36.24,35.76,36.23,37609400\n31-Jan-07,36.00,36.22,35.83,36.05,35449500\n30-Jan-07,36.20,36.34,35.76,36.03,42792600\n29-Jan-07,36.07,36.35,36.03,36.19,24764100\n26-Jan-07,36.45,36.55,36.01,36.07,25754600\n25-Jan-07,36.65,36.70,36.26,36.34,25741000\n24-Jan-07,36.70,36.75,36.52,36.64,20952800\n23-Jan-07,36.68,36.74,36.38,36.55,32115900\n22-Jan-07,37.13,37.33,36.59,36.75,35675400\n19-Jan-07,37.15,37.50,36.85,36.95,61281000\n18-Jan-07,38.01,38.17,37.26,38.00,39305700\n17-Jan-07,38.18,38.28,37.85,37.98,23666000\n16-Jan-07,38.00,38.25,37.93,38.11,31062700\n12-Jan-07,37.84,38.00,37.67,37.89,25299900\n11-Jan-07,37.50,37.96,37.42,37.92,30335400\n10-Jan-07,37.38,37.61,37.34,37.56,19456000\n9-Jan-07,37.78,37.99,37.36,37.55,24583600\n8-Jan-07,37.45,37.67,37.25,37.55,22365300\n5-Jan-07,37.57,37.76,37.31,37.56,26819800\n4-Jan-07,37.97,38.00,37.45,37.75,30924000\n3-Jan-07,37.41,38.15,37.38,37.97,42881900\n29-Dec-06,37.48,37.52,37.16,37.21,24649900\n28-Dec-06,37.65,37.76,37.45,37.48,16768700\n27-Dec-06,37.79,38.03,37.57,37.79,15889900\n26-Dec-06,37.60,37.74,37.43,37.71,11979900\n22-Dec-06,37.89,37.90,37.51,37.57,15413100\n21-Dec-06,38.05,38.06,37.63,37.77,24770700\n20-Dec-06,38.13,38.49,38.01,38.15,35788000\n19-Dec-06,37.75,38.07,37.75,38.01,30312600\n18-Dec-06,37.45,38.13,37.41,38.00,49729700\n15-Dec-06,36.28,37.51,36.21,37.36,87111000\n14-Dec-06,35.49,36.33,35.36,36.21,43187000\n13-Dec-06,35.85,35.92,35.40,35.50,38701200\n12-Dec-06,35.21,35.92,35.07,35.64,49696400\n11-Dec-06,35.24,35.52,35.05,35.22,29507900\n8-Dec-06,35.15,35.36,35.00,35.27,22245200\n7-Dec-06,35.16,35.39,35.09,35.16,24927100\n6-Dec-06,35.35,35.45,35.07,35.11,39828200\n5-Dec-06,35.41,35.50,35.13,35.27,30079100\n4-Dec-06,35.43,35.50,35.27,35.39,18711200\n1-Dec-06,35.38,35.40,34.96,35.28,23954400\n30-Nov-06,35.41,35.50,35.16,35.28,22615500\n29-Nov-06,35.25,35.44,35.19,35.35,18127500\n28-Nov-06,35.30,35.36,35.05,35.20,24875400\n27-Nov-06,35.57,35.75,35.28,35.45,24552300\n24-Nov-06,35.85,35.88,35.69,35.69,7250100\n22-Nov-06,35.80,36.09,35.72,35.99,18273500\n21-Nov-06,35.98,36.00,35.72,35.80,24983800\n20-Nov-06,36.17,36.28,35.93,35.98,19894100\n17-Nov-06,35.85,36.27,35.78,36.25,28631100\n16-Nov-06,35.87,36.13,35.87,35.96,22877200\n15-Nov-06,35.51,35.92,35.49,35.79,23600900\n14-Nov-06,35.46,35.75,35.18,35.59,28429000\n13-Nov-06,35.28,35.66,35.28,35.36,20721500\n10-Nov-06,35.30,35.31,35.12,35.17,17967800\n9-Nov-06,35.51,35.66,35.25,35.29,18697900\n8-Nov-06,35.45,35.75,35.40,35.58,17841800\n7-Nov-06,35.35,35.65,35.27,35.54,24158700\n6-Nov-06,35.02,35.41,34.90,35.27,26798800\n3-Nov-06,34.78,35.00,34.69,34.77,18729300\n2-Nov-06,34.88,34.91,34.62,34.71,23047700\n1-Nov-06,35.20,35.20,34.85,34.90,24143000\n31-Oct-06,35.28,35.35,34.92,35.11,26110500\n30-Oct-06,35.22,35.41,35.11,35.20,16379100\n27-Oct-06,35.46,35.50,35.17,35.21,29479200\n26-Oct-06,35.75,35.79,35.42,35.59,19946000\n25-Oct-06,35.55,35.65,35.35,35.61,21628900\n24-Oct-06,35.45,35.58,35.34,35.42,21674400\n23-Oct-06,35.28,35.69,35.27,35.53,25367800\n20-Oct-06,35.40,35.58,35.26,35.47,25501300\n19-Oct-06,35.40,35.49,35.14,35.28,26092000\n18-Oct-06,35.82,35.84,35.46,35.56,24114500\n17-Oct-06,35.35,35.60,35.24,35.56,24249000\n16-Oct-06,35.73,35.73,35.34,35.56,31671000\n13-Oct-06,35.93,36.11,35.47,35.98,40976500\n12-Oct-06,36.25,36.32,36.10,36.22,22945800\n11-Oct-06,36.20,36.40,36.03,36.17,19334100\n10-Oct-06,36.10,36.36,36.06,36.30,23319600\n9-Oct-06,36.14,36.24,35.86,36.16,18208400\n6-Oct-06,36.08,36.30,35.88,36.14,18598200\n5-Oct-06,36.01,36.48,35.94,36.29,23896200\n4-Oct-06,35.67,36.12,35.56,36.10,27035400\n3-Oct-06,35.51,35.88,35.46,35.71,22801800\n2-Oct-06,35.40,35.71,35.28,35.50,20363800\n29-Sep-06,35.42,35.51,35.20,35.30,20397700\n28-Sep-06,35.40,35.61,35.22,35.48,19443500\n27-Sep-06,35.33,35.65,35.17,35.34,24825200\n26-Sep-06,34.90,35.62,34.89,35.44,35526800\n25-Sep-06,34.33,34.94,34.33,34.89,22411600\n22-Sep-06,34.36,34.50,34.27,34.40,17523300\n21-Sep-06,34.90,34.90,34.25,34.44,26322000\n20-Sep-06,34.87,35.07,34.65,35.02,22865800\n19-Sep-06,34.85,34.87,34.60,34.85,18497600\n18-Sep-06,34.65,34.96,34.61,34.87,22896200\n15-Sep-06,34.90,35.00,34.72,34.85,32907100\n14-Sep-06,34.55,34.86,34.50,34.78,19838100\n13-Sep-06,34.70,34.84,31.61,34.84,23162300\n12-Sep-06,34.43,34.73,34.38,34.67,20546300\n11-Sep-06,33.85,34.43,33.76,34.43,20852000\n8-Sep-06,33.90,34.05,33.88,34.01,11388500\n7-Sep-06,33.85,34.15,33.83,34.04,26742600\n6-Sep-06,33.87,34.05,33.85,33.95,17191500\n5-Sep-06,34.08,34.13,33.92,33.97,17928900\n1-Sep-06,34.18,34.27,34.02,34.14,17846400\n31-Aug-06,34.29,34.32,34.01,34.06,18383400\n30-Aug-06,34.20,34.44,34.19,34.27,13653800\n29-Aug-06,33.90,34.24,33.90,34.19,17289200\n28-Aug-06,33.70,34.00,33.70,33.93,13269600\n25-Aug-06,33.72,33.92,33.71,33.84,11473400\n24-Aug-06,33.94,34.01,33.75,33.85,13973300\n23-Aug-06,33.75,33.87,33.60,33.79,18090700\n22-Aug-06,33.90,34.19,33.68,33.96,15845300\n21-Aug-06,34.00,34.10,33.77,33.96,12676300\n18-Aug-06,33.71,34.00,33.71,34.00,17046800\n17-Aug-06,33.70,34.00,33.65,33.92,17400200\n16-Aug-06,33.37,33.84,33.32,33.71,23760800\n15-Aug-06,33.19,33.28,33.04,33.20,20223100\n14-Aug-06,32.71,33.39,32.63,32.82,24925200\n11-Aug-06,32.62,32.78,32.42,32.50,15342300\n10-Aug-06,32.35,32.78,32.24,32.67,23385200\n9-Aug-06,32.48,32.72,32.24,32.28,18092400\n8-Aug-06,32.80,32.80,32.20,32.34,23730700\n7-Aug-06,32.68,32.83,32.51,32.69,15272200\n4-Aug-06,32.91,32.99,32.60,32.80,15986700\n3-Aug-06,32.55,32.88,32.43,32.73,19360600\n2-Aug-06,32.55,32.81,32.42,32.60,16594800\n1-Aug-06,32.65,32.80,32.48,32.56,16596800\n31-Jul-06,32.80,32.91,32.68,32.69,20312800\n28-Jul-06,32.80,33.23,32.74,33.02,20904800\n27-Jul-06,32.75,32.88,32.54,32.65,17734600\n26-Jul-06,32.74,32.77,32.48,32.68,20638500\n25-Jul-06,32.80,32.81,32.45,32.70,21159800\n24-Jul-06,32.48,32.76,32.29,32.62,22294600\n21-Jul-06,32.61,32.61,32.20,32.25,29354900\n20-Jul-06,32.85,32.94,32.48,32.48,19692200\n19-Jul-06,32.58,33.04,32.49,32.88,25459800\n18-Jul-06,32.36,32.48,32.25,32.46,26238900\n17-Jul-06,32.08,32.46,32.08,32.36,22697100\n14-Jul-06,32.29,32.37,32.06,32.11,46721400\n13-Jul-06,33.01,33.06,32.56,32.67,31357800\n12-Jul-06,33.21,33.22,33.00,33.06,21480400\n"
  },
  {
    "path": "examples/stockserver/GOOG.csv",
    "content": "﻿Date,Open,High,Low,Close,Volume\n9-Jul-12,584.95,588.60,581.25,586.01,1715020\n6-Jul-12,592.45,593.52,582.82,585.98,2162328\n5-Jul-12,588.76,600.06,588.54,595.92,2345901\n3-Jul-12,580.01,588.41,578.00,587.83,1190525\n2-Jul-12,581.82,583.00,576.50,580.47,1655563\n29-Jun-12,574.96,580.13,572.20,580.07,2522562\n28-Jun-12,565.90,566.23,557.21,564.31,1922064\n27-Jun-12,567.70,573.99,566.02,569.30,1692446\n26-Jun-12,562.76,566.60,559.48,564.68,1351151\n25-Jun-12,567.33,568.09,557.35,560.70,1582036\n22-Jun-12,568.00,571.48,565.82,571.48,2229125\n21-Jun-12,579.84,579.84,563.73,565.21,2011322\n20-Jun-12,579.81,580.00,573.51,577.51,2346698\n19-Jun-12,573.59,584.28,573.12,581.53,2076629\n18-Jun-12,562.62,574.21,559.25,570.85,2497864\n15-Jun-12,560.34,564.52,557.09,564.51,3002511\n14-Jun-12,561.30,565.07,556.52,559.05,2345107\n13-Jun-12,561.72,567.00,558.68,561.09,1954607\n12-Jun-12,569.77,570.30,558.58,565.10,3224142\n11-Jun-12,584.21,585.32,566.69,568.50,2662269\n8-Jun-12,575.85,581.00,574.58,580.45,1410366\n7-Jun-12,587.60,587.89,577.25,578.23,1759532\n6-Jun-12,576.48,581.97,573.61,580.57,2096173\n5-Jun-12,575.45,578.13,566.47,570.41,2340477\n4-Jun-12,570.22,580.49,570.01,578.59,2433786\n1-Jun-12,571.79,572.65,568.35,570.98,3058314\n31-May-12,588.72,590.00,579.00,580.86,2969455\n30-May-12,588.16,591.90,583.53,588.23,1906629\n29-May-12,595.81,599.13,588.32,594.34,2606651\n25-May-12,601.00,601.73,588.28,591.53,3582472\n24-May-12,609.16,611.92,598.87,603.66,1892185\n23-May-12,601.65,609.60,597.12,609.46,3178016\n22-May-12,613.44,613.81,596.00,600.80,3052748\n21-May-12,600.51,615.69,600.00,614.11,3075829\n18-May-12,625.10,632.42,596.70,600.40,5976129\n17-May-12,633.83,637.85,621.23,623.05,3354518\n16-May-12,617.96,630.10,615.94,628.93,4837424\n15-May-12,605.35,615.00,603.75,611.11,2102339\n14-May-12,600.78,608.50,600.58,604.00,1824733\n11-May-12,610.35,614.55,604.77,605.23,2099726\n10-May-12,612.96,616.19,610.23,613.66,1535877\n9-May-12,606.82,616.38,601.81,609.15,2329546\n8-May-12,605.53,616.90,600.70,612.79,2678485\n7-May-12,595.00,610.57,595.00,607.55,1994515\n4-May-12,605.92,607.89,596.81,596.97,2207360\n3-May-12,609.62,614.83,608.95,611.02,1868187\n2-May-12,601.20,608.11,600.61,607.26,1611434\n1-May-12,603.79,611.60,600.19,604.43,2002424\n30-Apr-12,612.99,616.08,600.61,604.85,2407213\n27-Apr-12,615.02,616.74,610.60,614.98,1636399\n26-Apr-12,610.91,618.00,609.70,615.47,2093733\n25-Apr-12,604.00,611.35,602.88,609.72,1821042\n24-Apr-12,598.24,606.63,597.32,601.27,1933303\n23-Apr-12,592.90,598.45,590.20,597.60,2197933\n20-Apr-12,604.25,608.85,595.83,596.06,3058961\n19-Apr-12,605.69,616.26,599.00,599.30,3295787\n18-Apr-12,608.05,612.80,602.81,607.45,2670380\n17-Apr-12,608.56,617.69,607.01,609.57,3024414\n16-Apr-12,623.00,623.81,601.66,606.07,5693458\n13-Apr-12,647.55,648.99,623.54,624.60,8163012\n12-Apr-12,642.35,653.14,640.26,651.01,5756582\n11-Apr-12,633.97,636.00,631.30,635.96,2200268\n10-Apr-12,633.52,634.50,624.55,626.86,2485078\n9-Apr-12,628.48,635.33,625.29,630.84,2183535\n5-Apr-12,632.24,636.43,628.57,632.32,2319712\n4-Apr-12,638.45,639.00,631.10,635.15,1628272\n3-Apr-12,645.41,647.95,638.64,642.62,2044362\n2-Apr-12,640.77,647.50,634.84,646.92,2284338\n30-Mar-12,651.75,653.49,641.00,641.24,2312245\n29-Mar-12,653.44,656.59,644.30,648.41,1924315\n28-Mar-12,652.03,658.59,651.08,655.76,2538808\n27-Mar-12,647.03,653.50,644.80,647.02,2008804\n26-Mar-12,645.00,649.49,639.54,649.33,1821467\n23-Mar-12,646.60,648.50,640.90,642.59,1940335\n22-Mar-12,638.50,648.80,631.00,646.05,2410320\n21-Mar-12,634.61,647.39,632.51,639.98,2469637\n20-Mar-12,630.92,636.06,627.27,633.49,1540778\n19-Mar-12,623.12,637.27,621.24,633.98,2172971\n16-Mar-12,620.89,625.91,620.05,625.04,3050457\n15-Mar-12,616.60,623.50,614.83,621.13,2435340\n14-Mar-12,615.00,622.78,613.46,615.99,2936857\n13-Mar-12,608.75,617.85,605.55,617.78,2247354\n12-Mar-12,600.00,607.00,599.26,605.15,1669376\n9-Mar-12,607.95,611.90,600.00,600.25,2671524\n8-Mar-12,610.04,611.50,606.35,607.14,1345428\n7-Mar-12,609.05,611.19,605.86,606.80,1264892\n6-Mar-12,608.05,608.81,593.84,604.96,3175216\n5-Mar-12,620.43,622.49,611.38,614.25,1593250\n2-Mar-12,622.00,624.00,620.32,621.25,1573214\n1-Mar-12,622.26,625.70,618.15,622.40,2238010\n29-Feb-12,618.60,625.60,615.50,618.25,3136837\n28-Feb-12,610.00,619.77,607.68,618.39,2847797\n27-Feb-12,606.59,612.36,605.06,609.31,1814618\n24-Feb-12,607.35,611.65,605.51,609.90,1937074\n23-Feb-12,607.00,607.94,600.35,606.11,2055030\n22-Feb-12,611.96,616.78,606.71,607.94,1967855\n21-Feb-12,603.87,617.88,602.88,614.00,2481110\n17-Feb-12,604.97,607.63,602.40,604.64,2449229\n16-Feb-12,602.82,608.81,597.73,606.52,2530861\n15-Feb-12,612.93,612.93,602.56,605.56,2426960\n14-Feb-12,611.54,612.00,604.76,609.76,1803851\n13-Feb-12,610.50,613.84,610.02,612.20,1816551\n10-Feb-12,607.88,608.13,604.00,605.91,2325443\n9-Feb-12,612.02,614.50,609.00,611.46,2265433\n8-Feb-12,609.70,609.70,609.70,609.70,0\n7-Feb-12,607.15,609.39,603.76,606.77,2092035\n6-Feb-12,595.01,610.83,594.01,609.09,3679755\n3-Feb-12,590.66,597.07,588.05,596.33,3169260\n2-Feb-12,584.87,586.41,582.08,585.11,2414672\n1-Feb-12,584.94,585.50,579.14,580.83,2320950\n31-Jan-12,583.00,584.00,575.15,580.11,2142716\n30-Jan-12,578.05,580.00,573.40,577.69,2330967\n27-Jan-12,570.78,580.32,569.33,579.98,3618815\n26-Jan-12,571.98,574.48,564.55,568.10,3228004\n25-Jan-12,577.51,578.71,566.38,569.49,4988196\n24-Jan-12,586.32,587.68,578.00,580.93,3056391\n23-Jan-12,586.00,588.66,583.16,585.52,3413040\n20-Jan-12,590.53,591.00,581.70,585.99,10576774\n19-Jan-12,640.99,640.99,631.46,639.57,6305274\n18-Jan-12,626.63,634.00,622.12,632.91,2763190\n17-Jan-12,631.98,631.98,625.68,628.58,1909394\n13-Jan-12,624.99,624.99,624.99,624.99,0\n12-Jan-12,631.22,632.89,626.50,629.64,1875854\n11-Jan-12,623.50,629.39,621.12,625.96,2400582\n10-Jan-12,629.75,633.80,616.91,623.14,4395615\n9-Jan-12,646.50,647.00,621.23,622.46,5825720\n6-Jan-12,659.15,660.00,651.76,652.73,1524820\n5-Jan-12,662.13,663.97,656.23,659.01,3283277\n4-Jan-12,665.03,670.25,660.62,668.28,2864365\n3-Jan-12,652.94,668.15,652.37,665.41,3677850\n30-Dec-11,645.90,645.90,645.90,645.90,0\n29-Dec-11,641.49,643.00,635.20,642.40,1575595\n28-Dec-11,642.75,645.00,638.10,639.70,2127130\n27-Dec-11,632.05,644.49,632.00,640.25,1609052\n23-Dec-11,631.88,631.88,631.88,631.88,0\n22-Dec-11,627.95,631.73,627.01,629.70,1824156\n21-Dec-11,630.01,631.82,618.96,625.82,2498154\n20-Dec-11,628.00,631.84,627.99,630.37,2388184\n19-Dec-11,628.01,628.50,620.00,621.83,2144189\n16-Dec-11,624.32,629.32,621.47,625.96,4459782\n15-Dec-11,622.52,624.00,618.69,619.54,2409785\n14-Dec-11,621.85,624.32,612.49,618.07,3904882\n13-Dec-11,628.76,636.56,622.85,625.63,4028638\n12-Dec-11,621.88,626.18,620.29,625.39,2185234\n9-Dec-11,618.00,629.13,617.01,627.42,2768503\n8-Dec-11,621.04,627.45,615.30,616.05,2414400\n7-Dec-11,621.68,625.66,618.10,623.39,2257980\n6-Dec-11,622.99,628.62,620.24,623.77,2326518\n5-Dec-11,627.64,631.90,622.40,625.65,3198026\n2-Dec-11,617.05,624.00,616.26,620.36,4085965\n1-Dec-11,600.00,616.00,599.00,613.77,3621293\n30-Nov-11,597.95,599.51,592.09,599.39,3397279\n29-Nov-11,587.88,590.36,581.33,582.93,1832619\n28-Nov-11,579.37,588.82,576.50,588.19,2828967\n25-Nov-11,565.19,574.27,561.33,563.00,1562341\n23-Nov-11,570.11,570.11,570.11,570.11,0\n22-Nov-11,580.00,584.97,575.24,580.00,2405579\n21-Nov-11,587.76,588.50,572.09,580.94,3001666\n18-Nov-11,602.00,604.50,593.75,594.88,3287618\n17-Nov-11,610.05,612.29,596.78,600.87,3493472\n16-Nov-11,612.08,618.30,610.61,611.47,2610280\n15-Nov-11,612.80,618.08,610.50,616.56,2675961\n14-Nov-11,608.00,618.08,607.78,613.00,3188932\n11-Nov-11,601.30,612.09,598.60,608.35,3977320\n10-Nov-11,605.94,605.95,591.56,595.08,2868599\n9-Nov-11,604.26,609.39,598.66,600.95,3711062\n8-Nov-11,609.00,614.37,603.60,612.34,3029383\n7-Nov-11,593.32,608.78,592.23,608.33,3358867\n4-Nov-11,593.50,599.74,592.43,596.14,2835379\n3-Nov-11,587.00,597.50,583.72,597.50,2669745\n2-Nov-11,584.90,587.96,580.48,584.82,2121899\n1-Nov-11,580.10,585.51,576.75,578.65,3125199\n31-Oct-11,595.09,599.69,591.67,592.64,2557738\n28-Oct-11,594.52,602.30,594.25,600.14,2508147\n27-Oct-11,598.42,602.70,593.30,598.67,3780722\n26-Oct-11,589.55,590.18,572.86,586.31,2873690\n25-Oct-11,593.10,595.00,582.85,583.16,2540445\n24-Oct-11,586.72,599.97,586.50,596.42,3427548\n21-Oct-11,589.51,592.75,586.70,590.49,3394233\n20-Oct-11,581.90,588.89,579.51,583.67,3379069\n19-Oct-11,587.34,592.06,579.22,580.70,2931804\n18-Oct-11,580.19,592.56,577.40,590.51,3802493\n17-Oct-11,583.72,591.83,578.00,582.41,4008302\n14-Oct-11,599.47,599.60,587.57,591.68,8532242\n13-Oct-11,550.03,559.00,548.02,558.99,5687512\n12-Oct-11,548.13,555.23,544.63,548.50,3178044\n11-Oct-11,533.46,546.80,533.46,543.18,2853777\n10-Oct-11,525.18,537.47,523.20,537.17,2322903\n7-Oct-11,516.83,520.50,510.30,515.12,2856047\n6-Oct-11,507.50,515.23,502.60,514.71,3424623\n5-Oct-11,496.35,507.80,480.77,504.70,4534752\n4-Oct-11,490.03,503.44,480.60,501.90,4159130\n3-Oct-11,509.85,512.00,495.00,495.52,4473863\n30-Sep-11,520.21,524.00,514.38,515.04,2724908\n29-Sep-11,536.04,537.30,519.41,527.50,2907381\n28-Sep-11,541.50,544.02,527.70,528.84,2263403\n27-Sep-11,538.20,547.05,536.05,539.34,3010925\n26-Sep-11,527.25,532.93,513.25,531.89,2634234\n23-Sep-11,516.56,526.42,514.50,525.51,2778870\n22-Sep-11,526.25,528.78,514.00,520.66,4400586\n21-Sep-11,547.69,555.00,538.86,539.20,2516138\n20-Sep-11,549.40,558.52,542.67,546.62,2779078\n19-Sep-11,540.35,549.90,535.38,546.67,2471190\n16-Sep-11,544.80,546.84,543.14,546.68,3534779\n15-Sep-11,535.50,544.98,534.56,542.56,2961967\n14-Sep-11,532.59,536.95,525.82,532.07,2694739\n13-Sep-11,532.00,533.88,523.40,529.52,2354150\n12-Sep-11,517.96,531.99,517.50,530.12,2670471\n9-Sep-11,531.40,534.65,521.19,524.85,3269069\n8-Sep-11,533.80,539.10,531.90,534.96,2381025\n7-Sep-11,530.45,535.94,527.40,534.03,2758545\n6-Sep-11,510.80,522.76,510.50,522.18,2715977\n2-Sep-11,524.47,527.92,520.73,524.84,2402024\n1-Sep-11,540.75,543.83,531.22,532.50,2415607\n31-Aug-11,544.74,546.30,536.00,540.96,2693390\n30-Aug-11,538.19,542.99,530.81,540.70,2990176\n29-Aug-11,534.56,539.45,533.56,539.08,2338106\n26-Aug-11,519.99,530.45,513.14,526.86,3597309\n25-Aug-11,530.38,537.27,518.30,520.04,3297297\n24-Aug-11,519.33,530.00,517.23,523.29,3598264\n23-Aug-11,503.50,521.41,499.06,518.82,4347823\n22-Aug-11,504.00,507.00,494.53,498.17,4907175\n19-Aug-11,499.34,514.87,490.86,490.92,5411586\n18-Aug-11,523.47,524.89,500.49,504.88,6291368\n17-Aug-11,540.03,543.69,530.77,533.15,4079101\n16-Aug-11,552.43,552.44,530.30,539.00,6940503\n15-Aug-11,553.43,564.99,546.05,557.23,7145020\n12-Aug-11,569.50,570.50,560.40,563.77,3155376\n11-Aug-11,553.82,568.50,548.41,562.13,4832119\n10-Aug-11,561.38,564.12,547.73,549.01,5373697\n9-Aug-11,0.00,574.61,541.01,573.41,6470475\n8-Aug-11,562.98,569.00,544.35,546.02,7497701\n5-Aug-11,582.54,590.00,562.00,579.04,5930780\n4-Aug-11,594.50,598.85,577.47,577.52,4916432\n3-Aug-11,594.08,603.00,583.63,601.17,3825910\n2-Aug-11,606.00,609.67,591.57,592.40,3201303\n1-Aug-11,611.22,615.50,599.18,606.77,3968312\n29-Jul-11,604.23,614.96,603.69,603.69,4138101\n28-Jul-11,605.19,615.98,603.00,610.94,3109115\n27-Jul-11,617.18,620.95,604.75,607.22,3934890\n26-Jul-11,618.05,627.50,617.22,622.52,2343370\n25-Jul-11,613.36,625.41,613.00,618.98,3131952\n22-Jul-11,605.39,619.50,604.27,618.23,3531622\n21-Jul-11,594.03,608.06,594.01,606.99,3469850\n20-Jul-11,602.18,602.83,595.35,595.35,2229023\n19-Jul-11,596.14,604.68,595.53,602.55,2967816\n18-Jul-11,592.49,602.05,592.00,594.94,4469225\n15-Jul-11,597.50,600.25,588.16,597.62,13735983\n14-Jul-11,539.12,542.00,526.73,528.94,6649410\n13-Jul-11,537.00,544.00,536.48,538.26,2790771\n12-Jul-11,528.16,539.42,526.00,534.01,2841532\n11-Jul-11,528.18,535.98,525.50,527.28,2839996\n8-Jul-11,532.95,537.65,527.27,531.99,4770170\n7-Jul-11,541.00,550.68,535.88,546.60,3935660\n6-Jul-11,533.50,538.51,533.04,535.36,2695681\n5-Jul-11,525.30,535.40,525.30,532.44,3847351\n1-Jul-11,521.03,521.03,521.03,521.03,0\n30-Jun-11,501.99,506.67,501.50,506.38,2428510\n29-Jun-11,496.54,500.25,492.38,497.57,2342920\n28-Jun-11,484.02,496.21,484.02,493.65,2717364\n27-Jun-11,474.00,488.40,473.60,482.80,3444633\n24-Jun-11,480.68,480.75,473.02,474.88,3806587\n23-Jun-11,482.13,482.86,473.73,480.22,4802302\n22-Jun-11,491.45,492.35,486.73,487.00,2407972\n21-Jun-11,487.19,493.94,484.73,493.00,2765357\n20-Jun-11,485.00,486.23,479.23,484.58,3028639\n17-Jun-11,506.18,506.69,484.80,485.02,5251546\n16-Jun-11,502.81,508.13,496.67,500.37,2757216\n15-Jun-11,505.03,508.35,500.61,502.95,2073301\n14-Jun-11,508.15,514.08,506.99,508.37,2341461\n13-Jun-11,505.00,505.00,505.00,505.00,0\n10-Jun-11,514.08,516.69,509.29,509.50,2440475\n9-Jun-11,520.00,520.00,515.64,516.73,1689086\n8-Jun-11,516.53,521.24,515.78,519.17,1654097\n7-Jun-11,522.89,524.63,518.99,519.03,1907509\n6-Jun-11,525.84,526.82,519.25,521.06,1942088\n3-Jun-11,526.35,526.35,526.35,526.35,0\n2-Jun-11,527.57,530.30,522.48,528.06,2204422\n1-Jun-11,528.04,533.20,525.31,525.60,2957172\n31-May-11,525.00,529.05,523.50,529.02,2687858\n27-May-11,520.90,520.90,520.90,520.90,0\n26-May-11,517.70,522.12,515.00,518.13,2118981\n25-May-11,517.33,522.77,517.25,519.67,1301567\n24-May-11,520.37,523.96,518.15,518.26,1888538\n23-May-11,516.60,520.00,513.40,518.39,2252638\n20-May-11,531.80,531.99,523.13,524.03,2318873\n19-May-11,532.73,536.54,529.72,531.25,2471136\n18-May-11,529.54,530.33,525.70,529.81,1954293\n17-May-11,515.43,531.22,515.03,530.46,3304874\n16-May-11,526.31,527.27,516.40,518.42,2956554\n13-May-11,534.61,535.92,529.05,529.55,2107641\n12-May-11,536.20,536.20,536.20,536.20,0\n11-May-11,540.14,543.55,533.69,535.45,2338875\n10-May-11,540.00,544.43,537.54,542.66,2041355\n9-May-11,535.00,538.49,531.10,537.68,1947419\n6-May-11,538.15,541.46,535.18,535.30,2056186\n5-May-11,533.86,539.42,531.50,534.27,1997054\n4-May-11,535.17,539.00,533.02,535.79,2116955\n3-May-11,536.08,536.08,536.08,536.08,0\n2-May-11,545.70,545.73,537.12,538.56,2133972\n29-Apr-11,540.00,544.10,538.51,544.10,4228467\n28-Apr-11,538.06,539.25,534.08,537.97,2037378\n27-Apr-11,538.00,538.11,534.35,537.76,2297840\n26-Apr-11,526.52,537.44,525.21,532.82,3530591\n25-Apr-11,525.25,527.00,522.01,525.05,1629933\n21-Apr-11,525.10,525.10,525.10,525.10,0\n20-Apr-11,525.90,526.82,521.39,525.73,3059160\n19-Apr-11,529.95,530.88,520.90,521.53,2685395\n18-Apr-11,526.42,527.66,519.00,526.84,5041089\n15-Apr-11,533.31,533.31,533.31,533.31,0\n14-Apr-11,575.19,579.45,572.10,578.51,5456289\n13-Apr-11,575.51,577.60,571.75,576.28,2071646\n12-Apr-11,575.00,576.92,568.05,570.61,2085766\n11-Apr-11,576.20,578.10,573.00,577.37,1858382\n8-Apr-11,584.89,584.89,578.06,578.16,1902581\n7-Apr-11,575.73,580.64,574.19,580.00,2531975\n6-Apr-11,574.20,574.20,574.20,574.20,0\n5-Apr-11,581.08,581.49,565.68,569.09,6048187\n4-Apr-11,593.00,594.74,583.10,587.68,2054817\n1-Apr-11,588.76,595.19,588.76,591.80,2613266\n31-Mar-11,583.00,588.16,581.74,586.76,2031385\n30-Mar-11,584.38,585.50,580.58,581.84,1422475\n29-Mar-11,576.00,581.89,573.01,581.73,1605138\n28-Mar-11,582.07,584.99,574.71,575.36,2218910\n25-Mar-11,586.88,586.91,579.24,579.74,2859497\n24-Mar-11,585.43,588.39,578.80,586.89,2097978\n23-Mar-11,580.30,580.30,580.30,580.30,0\n22-Mar-11,577.27,579.23,572.51,577.32,1887185\n21-Mar-11,570.22,579.80,569.02,576.50,3022174\n18-Mar-11,564.64,567.99,559.74,561.06,3302850\n17-Mar-11,564.48,569.00,560.54,561.36,2899727\n16-Mar-11,568.01,569.79,551.28,557.10,3800712\n15-Mar-11,557.50,571.00,555.50,569.56,4006021\n14-Mar-11,572.80,578.29,568.02,569.99,2813969\n11-Mar-11,578.22,580.00,573.33,576.71,3029401\n10-Mar-11,579.65,579.65,579.65,579.65,0\n9-Mar-11,591.00,594.51,585.75,591.77,2150991\n8-Mar-11,592.93,597.98,590.20,592.31,2287771\n7-Mar-11,600.55,603.69,587.00,591.66,3461738\n4-Mar-11,601.40,601.40,601.40,601.40,0\n3-Mar-11,606.38,611.49,605.00,609.56,1949335\n2-Mar-11,599.80,606.00,595.19,600.79,2026933\n1-Mar-11,617.78,619.22,599.30,600.76,3323575\n28-Feb-11,610.00,616.49,608.01,613.40,2284336\n25-Feb-11,611.86,614.72,609.50,610.04,1935852\n24-Feb-11,603.27,603.27,603.27,603.27,0\n23-Feb-11,610.33,614.70,604.00,611.32,2891878\n22-Feb-11,620.03,624.93,607.77,610.21,3642208\n18-Feb-11,629.11,629.11,629.11,629.11,0\n17-Feb-11,621.25,627.25,620.28,625.26,1479175\n16-Feb-11,625.63,626.50,622.10,624.22,1686963\n15-Feb-11,627.32,630.09,623.10,624.15,2092614\n14-Feb-11,623.63,623.63,623.63,623.63,0\n11-Feb-11,613.79,625.00,613.00,624.50,2593390\n10-Feb-11,613.90,617.50,611.56,616.44,2336117\n9-Feb-11,616.87,619.45,612.34,616.50,1843394\n8-Feb-11,614.93,619.63,614.51,618.38,1696452\n7-Feb-11,610.16,618.39,609.21,614.30,1802017\n4-Feb-11,610.15,611.44,606.61,610.98,1552505\n3-Feb-11,609.48,611.45,606.13,610.15,1497474\n2-Feb-11,611.00,614.34,607.53,612.00,1760755\n1-Feb-11,604.49,613.36,603.11,611.04,2745862\n31-Jan-11,603.60,604.47,595.55,600.36,2810069\n28-Jan-11,619.07,620.36,599.76,600.99,4233962\n27-Jan-11,617.89,619.70,613.25,616.79,2019427\n26-Jan-11,616.84,616.84,616.84,616.84,0\n25-Jan-11,608.20,620.69,606.52,619.91,3647644\n24-Jan-11,607.57,612.49,601.23,611.08,4604997\n21-Jan-11,639.58,641.73,611.36,611.83,8904357\n20-Jan-11,626.99,626.99,626.99,626.99,0\n19-Jan-11,642.12,642.96,629.66,631.75,3412573\n18-Jan-11,626.06,641.99,625.27,639.63,3620063\n14-Jan-11,624.18,624.18,624.18,624.18,0\n13-Jan-11,616.97,619.67,614.16,616.69,1333947\n12-Jan-11,617.13,617.13,617.13,617.13,0\n11-Jan-11,617.71,618.80,614.50,616.01,1440991\n10-Jan-11,613.96,613.96,613.96,613.96,0\n7-Jan-11,615.91,618.25,610.13,616.44,2101270\n6-Jan-11,610.68,618.43,610.05,613.50,2058176\n5-Jan-11,600.59,600.59,600.59,600.59,0\n4-Jan-11,605.62,606.18,600.12,602.12,1825499\n3-Jan-11,596.48,605.59,596.48,604.35,2366286\n31-Dec-10,596.74,598.42,592.03,593.97,1541459\n30-Dec-10,598.00,601.33,597.39,598.86,989479\n29-Dec-10,602.00,602.41,598.92,601.00,1019823\n28-Dec-10,602.05,603.87,598.01,598.92,1064746\n27-Dec-10,602.74,603.78,599.50,602.38,1208128\n23-Dec-10,604.23,604.23,604.23,604.23,0\n22-Dec-10,604.00,607.00,603.28,605.49,1207929\n21-Dec-10,598.57,604.72,597.62,603.07,1881688\n20-Dec-10,594.65,597.88,588.66,595.06,1973768\n17-Dec-10,591.00,592.56,587.67,590.80,3089328\n16-Dec-10,592.85,593.77,588.07,591.71,1596820\n15-Dec-10,594.20,596.45,589.15,590.30,2168131\n14-Dec-10,597.09,598.29,592.48,594.91,1643253\n13-Dec-10,597.12,603.00,594.09,594.62,2403442\n10-Dec-10,593.14,593.99,590.29,592.21,1705121\n9-Dec-10,593.88,595.58,589.00,591.50,1868972\n8-Dec-10,591.97,592.52,583.69,590.54,1757126\n7-Dec-10,591.27,593.00,586.00,587.14,3047879\n6-Dec-10,580.57,582.00,576.61,578.36,2095525\n3-Dec-10,569.45,576.48,568.00,573.00,2633126\n2-Dec-10,568.66,573.33,565.35,571.82,2550572\n1-Dec-10,563.00,571.57,562.40,564.35,3757609\n30-Nov-10,574.32,574.32,553.31,555.71,7117385\n29-Nov-10,589.17,589.80,579.95,582.11,2859953\n26-Nov-10,590.46,592.98,587.00,590.00,1311038\n24-Nov-10,594.97,594.97,594.97,594.97,0\n23-Nov-10,587.01,589.01,578.20,583.01,2166947\n22-Nov-10,587.47,593.44,582.75,591.22,2186511\n19-Nov-10,597.00,597.89,590.34,590.83,2298978\n18-Nov-10,589.00,599.98,588.56,596.56,2590876\n17-Nov-10,585.00,589.50,581.37,583.55,2442412\n16-Nov-10,592.76,597.89,583.45,583.72,3308665\n15-Nov-10,603.08,604.00,594.05,595.47,3480120\n12-Nov-10,613.99,616.90,601.21,603.29,3395209\n11-Nov-10,619.70,619.85,614.21,617.19,2262019\n10-Nov-10,622.08,623.00,617.51,622.88,2499828\n9-Nov-10,630.00,630.85,620.51,624.82,2240293\n8-Nov-10,625.12,629.49,623.13,626.77,2102262\n5-Nov-10,623.18,625.49,621.11,625.08,1766546\n4-Nov-10,624.64,629.92,622.10,624.27,3571173\n3-Nov-10,617.50,621.83,613.50,620.18,3382183\n2-Nov-10,618.67,620.00,614.58,615.60,1999774\n1-Nov-10,615.73,620.66,611.21,615.00,3088417\n29-Oct-10,617.07,619.00,612.99,613.70,2281279\n28-Oct-10,620.05,621.00,613.30,618.58,2187396\n27-Oct-10,615.77,620.00,612.33,616.47,2242414\n26-Oct-10,613.10,621.23,611.03,618.60,2513633\n25-Oct-10,615.59,624.74,614.97,616.50,3158700\n22-Oct-10,611.92,614.82,610.05,612.53,2256598\n21-Oct-10,611.51,616.00,606.00,611.99,2923627\n20-Oct-10,608.14,617.38,607.50,607.98,3526976\n19-Oct-10,608.85,614.82,602.86,607.83,4591178\n18-Oct-10,600.55,619.69,600.55,617.71,7109313\n15-Oct-10,599.27,601.64,591.60,601.45,14824722\n14-Oct-10,544.18,545.25,537.11,540.93,6634018\n13-Oct-10,547.00,547.49,542.33,543.30,3060836\n12-Oct-10,540.12,545.99,537.79,541.39,3757178\n11-Oct-10,538.48,544.60,537.17,538.84,2631310\n8-Oct-10,532.77,537.60,527.62,536.35,2863473\n7-Oct-10,536.21,537.20,529.14,530.01,2398910\n6-Oct-10,539.26,539.95,529.94,534.35,2766690\n5-Oct-10,528.38,540.00,526.55,538.23,3507302\n4-Oct-10,524.95,528.25,518.85,522.35,1940494\n1-Oct-10,530.00,530.62,523.00,525.62,2226112\n30-Sep-10,529.16,531.87,518.92,525.79,3244626\n29-Sep-10,527.85,532.94,524.71,527.69,2173878\n28-Sep-10,533.48,533.59,518.45,527.17,3654832\n27-Sep-10,528.85,536.85,528.85,530.41,3107622\n24-Sep-10,521.74,527.83,518.26,527.29,3363247\n23-Sep-10,514.61,519.69,511.30,513.48,2317644\n22-Sep-10,512.86,517.78,511.68,516.00,2537779\n21-Sep-10,509.68,519.98,508.91,513.46,4467227\n20-Sep-10,492.50,510.41,492.06,508.28,4413416\n17-Sep-10,483.75,491.20,481.18,490.15,5649448\n16-Sep-10,479.95,482.45,479.41,481.06,1972569\n15-Sep-10,479.95,481.89,478.50,480.64,2403545\n14-Sep-10,482.01,484.75,480.08,480.43,2218739\n13-Sep-10,480.90,484.35,479.53,482.27,2245650\n10-Sep-10,479.02,479.79,475.08,476.14,1974340\n9-Sep-10,477.83,480.40,470.58,476.18,2435299\n8-Sep-10,465.19,472.50,464.51,470.58,2409028\n7-Sep-10,464.50,467.59,463.02,464.40,1711335\n6-Sep-10,470.30,470.30,470.30,470.30,0\n3-Sep-10,470.30,470.30,470.30,470.30,0\n2-Sep-10,462.84,464.43,460.31,463.18,1685384\n1-Sep-10,454.98,464.94,452.50,460.34,3237824\n31-Aug-10,450.11,454.87,448.00,450.02,1946998\n30-Aug-10,459.15,459.76,452.42,452.69,1236219\n27-Aug-10,452.56,459.99,448.31,458.83,2313147\n26-Aug-10,456.06,457.26,450.44,450.98,1781767\n25-Aug-10,450.00,457.81,450.00,454.62,2592104\n24-Aug-10,457.70,457.70,450.92,451.39,2763814\n23-Aug-10,461.50,468.25,457.73,464.07,2989159\n20-Aug-10,467.97,471.59,462.18,462.02,3923319\n19-Aug-10,481.01,482.51,467.25,467.97,3925513\n18-Aug-10,490.44,490.44,481.55,482.15,2686374\n17-Aug-10,488.53,494.70,486.10,490.52,1890646\n16-Aug-10,483.68,489.87,483.68,485.59,1306685\n13-Aug-10,489.00,491.19,486.01,486.35,1940047\n12-Aug-10,483.94,494.75,483.94,492.01,2205032\n11-Aug-10,497.73,498.00,491.50,491.74,2226003\n10-Aug-10,502.35,506.00,498.57,503.71,2075569\n9-Aug-10,502.25,505.50,501.36,505.35,1873209\n6-Aug-10,505.40,505.74,496.05,500.22,3321695\n5-Aug-10,505.89,508.60,503.56,508.10,2426460\n4-Aug-10,492.18,507.00,491.05,506.32,3814120\n3-Aug-10,490.50,492.46,486.76,489.83,1803185\n2-Aug-10,488.99,493.28,486.94,490.41,1867475\n30-Jul-10,479.65,487.36,479.14,484.85,2144492\n29-Jul-10,485.95,488.88,479.33,484.99,2675420\n28-Jul-10,494.94,495.25,482.67,484.35,2502447\n27-Jul-10,490.58,497.50,490.17,492.63,2451984\n26-Jul-10,489.09,490.75,484.88,488.97,1996691\n23-Jul-10,480.77,490.59,480.01,490.06,2267180\n22-Jul-10,483.23,488.98,482.48,484.81,2148487\n21-Jul-10,484.00,485.70,475.43,477.50,3285364\n20-Jul-10,461.03,482.99,460.60,481.59,4056832\n19-Jul-10,461.01,469.65,457.52,466.18,4549465\n16-Jul-10,469.12,470.56,459.52,459.60,7824721\n15-Jul-10,491.73,494.70,482.68,494.02,4858782\n14-Jul-10,489.88,493.83,486.46,491.34,3118534\n13-Jul-10,482.25,492.99,480.28,489.20,3976281\n12-Jul-10,472.37,479.44,471.08,475.83,3334411\n9-Jul-10,471.96,473.26,462.78,467.49,4332702\n8-Jul-10,453.55,457.33,449.66,456.56,2670490\n7-Jul-10,438.31,451.29,435.38,450.20,3131936\n6-Jul-10,444.00,447.67,433.63,436.07,2561426\n5-Jul-10,436.55,436.55,436.55,436.55,0\n2-Jul-10,436.55,436.55,436.55,436.55,0\n1-Jul-10,445.29,448.40,433.63,439.49,3513877\n30-Jun-10,454.96,457.83,444.72,444.95,3603698\n29-Jun-10,463.44,464.55,451.12,454.26,3502108\n28-Jun-10,472.59,477.55,469.01,472.08,1762594\n25-Jun-10,477.06,477.65,470.56,472.68,2245289\n24-Jun-10,479.66,482.75,473.26,475.10,1893761\n23-Jun-10,486.89,486.89,478.16,482.05,2029650\n22-Jun-10,489.90,496.60,485.73,486.25,2219930\n21-Jun-10,499.90,500.97,484.89,488.56,2989344\n18-Jun-10,502.51,503.47,498.13,500.03,2878739\n17-Jun-10,503.45,505.87,496.69,500.08,1977894\n16-Jun-10,496.17,504.00,496.11,501.27,2291967\n15-Jun-10,483.08,500.40,482.18,497.99,4261561\n14-Jun-10,494.48,494.50,483.19,483.19,2040942\n11-Jun-10,482.50,488.71,481.62,488.50,1784318\n10-Jun-10,480.37,488.50,475.84,487.01,2585930\n9-Jun-10,487.22,488.88,472.00,474.02,2732731\n8-Jun-10,487.85,488.84,477.54,484.78,2685052\n7-Jun-10,499.06,500.91,483.15,485.52,3637036\n4-Jun-10,499.72,509.25,496.70,498.72,3923904\n3-Jun-10,495.11,508.00,494.70,505.60,3651897\n2-Jun-10,486.68,493.87,481.46,493.37,2540721\n1-Jun-10,480.43,491.06,480.12,482.37,2666997\n31-May-10,485.63,485.63,485.63,485.63,0\n28-May-10,485.63,485.63,485.63,485.63,0\n27-May-10,484.86,492.31,481.05,490.46,2810047\n26-May-10,482.07,489.76,475.00,475.47,3484042\n25-May-10,468.16,477.45,464.01,477.07,3021908\n24-May-10,480.73,489.79,476.80,477.16,4350322\n21-May-10,469.06,485.00,464.40,472.05,9693537\n20-May-10,485.07,485.58,473.80,475.01,4917963\n19-May-10,496.26,499.44,487.74,494.43,3446369\n18-May-10,510.00,510.97,497.07,498.37,2830286\n17-May-10,506.78,508.36,498.35,507.97,2796534\n14-May-10,509.77,510.99,496.25,507.53,4123922\n13-May-10,516.50,522.00,510.37,510.88,3328146\n12-May-10,512.04,512.04,502.00,505.39,3852157\n11-May-10,515.67,519.88,508.22,509.05,3324317\n10-May-10,513.97,522.82,512.60,521.65,4127928\n7-May-10,499.97,505.32,481.33,493.14,5093752\n6-May-10,508.75,517.52,460.00,498.67,5000043\n5-May-10,500.98,515.72,500.47,509.76,4582120\n4-May-10,526.52,526.74,504.21,506.37,6078530\n3-May-10,526.50,532.92,525.08,530.60,1860317\n30-Apr-10,531.13,537.68,525.44,525.70,2440207\n29-Apr-10,533.37,536.50,526.67,532.00,3058815\n28-Apr-10,532.10,534.83,521.03,529.19,3409197\n27-Apr-10,528.94,538.33,527.24,529.06,3844727\n26-Apr-10,544.97,544.99,529.21,531.64,4373614\n23-Apr-10,547.25,549.32,542.27,544.99,2089882\n22-Apr-10,552.00,552.50,543.35,547.06,3283651\n21-Apr-10,556.46,560.25,552.16,554.30,2392748\n20-Apr-10,554.17,559.66,551.06,555.04,2979333\n19-Apr-10,548.75,553.99,545.00,550.10,3895772\n16-Apr-10,563.00,568.81,549.63,550.14,12239411\n15-Apr-10,592.17,597.84,588.29,595.30,6761708\n14-Apr-10,590.06,592.34,584.01,589.00,3403800\n13-Apr-10,572.53,588.88,571.13,586.77,3912262\n12-Apr-10,567.35,574.00,566.22,572.73,2353551\n9-Apr-10,568.00,568.77,564.00,566.22,2056835\n8-Apr-10,563.32,569.85,560.05,567.49,1951735\n7-Apr-10,567.30,568.75,561.86,563.54,2581016\n6-Apr-10,569.46,570.89,565.40,568.22,2060014\n5-Apr-10,570.90,574.88,569.00,571.01,1902063\n2-Apr-10,568.80,568.80,568.80,568.80,0\n1-Apr-10,568.80,568.80,568.80,568.80,0\n31-Mar-10,565.05,569.74,562.81,567.12,3030869\n30-Mar-10,562.83,567.63,560.28,566.71,1987571\n29-Mar-10,563.00,564.72,560.57,562.45,3105180\n26-Mar-10,565.27,567.39,560.02,562.69,2696461\n25-Mar-10,559.02,572.00,558.66,562.88,3931664\n24-Mar-10,545.51,559.85,539.70,557.33,6569358\n23-Mar-10,557.04,558.31,542.00,549.00,5501283\n22-Mar-10,556.11,566.85,554.28,557.50,4005472\n19-Mar-10,566.23,568.00,557.28,560.00,4794128\n18-Mar-10,564.72,568.44,562.96,566.40,1777117\n17-Mar-10,568.30,571.45,564.25,565.56,3322497\n16-Mar-10,561.83,568.42,560.76,565.20,3432853\n15-Mar-10,566.68,569.45,556.00,563.18,4656570\n12-Mar-10,588.14,588.28,579.16,579.54,2756215\n11-Mar-10,574.26,586.21,574.20,581.14,4235226\n10-Mar-10,563.76,578.50,562.21,576.45,5659067\n9-Mar-10,559.85,564.66,556.50,560.19,3177588\n8-Mar-10,564.78,565.18,561.01,562.48,2386506\n5-Mar-10,561.35,567.67,559.90,564.21,3913364\n4-Mar-10,546.50,556.13,546.20,554.59,3184077\n3-Mar-10,542.36,548.12,539.25,545.32,3090124\n2-Mar-10,535.48,545.66,535.01,541.06,4357461\n1-Mar-10,529.20,533.29,527.74,532.69,2238334\n26-Feb-10,527.42,531.75,523.48,526.80,2049372\n25-Feb-10,527.12,528.49,520.00,526.43,3309373\n24-Feb-10,534.39,538.44,530.51,531.47,2326901\n23-Feb-10,543.00,543.63,532.29,535.07,2874790\n22-Feb-10,547.35,547.50,541.00,542.80,2144741\n19-Feb-10,541.00,544.03,539.70,540.76,2555348\n18-Feb-10,537.54,545.01,536.14,543.22,2339250\n17-Feb-10,542.00,543.40,537.61,538.21,2030680\n16-Feb-10,537.14,544.13,534.30,541.30,3654824\n15-Feb-10,533.12,533.12,533.12,533.12,0\n12-Feb-10,533.12,533.12,533.12,533.12,0\n11-Feb-10,532.25,540.49,529.50,536.40,2411090\n10-Feb-10,534.07,537.79,527.69,534.44,2675794\n9-Feb-10,539.54,541.53,535.07,536.44,2828685\n8-Feb-10,532.50,542.00,531.53,533.47,2695412\n5-Feb-10,528.40,533.50,522.46,531.29,3157048\n4-Feb-10,537.00,538.00,525.56,526.78,3382732\n3-Feb-10,528.67,542.10,528.23,540.82,2999890\n2-Feb-10,534.96,534.96,527.61,531.12,4096305\n1-Feb-10,534.60,535.81,530.30,533.02,2253021\n29-Jan-10,538.49,540.99,525.61,529.94,4141196\n28-Jan-10,544.49,547.00,530.60,534.29,3231041\n27-Jan-10,541.27,547.65,535.31,542.10,3965467\n26-Jan-10,537.97,549.60,536.29,542.42,4356767\n25-Jan-10,546.59,549.88,535.51,540.00,4421012\n22-Jan-10,564.50,570.60,534.86,550.01,6807653\n21-Jan-10,583.44,586.82,572.25,582.98,6307634\n20-Jan-10,585.98,585.98,575.29,580.41,3253498\n19-Jan-10,581.49,590.42,576.29,587.62,4317143\n18-Jan-10,580.00,580.00,580.00,580.00,0\n15-Jan-10,580.00,580.00,580.00,580.00,0\n14-Jan-10,583.90,594.20,582.81,589.85,4241570\n13-Jan-10,576.49,588.38,573.90,587.09,6499074\n12-Jan-10,598.08,598.16,588.00,590.48,4853249\n11-Jan-10,604.46,604.46,594.04,601.11,7216804\n8-Jan-10,592.00,603.25,589.11,602.02,4724735\n7-Jan-10,609.40,610.00,592.65,594.10,6418020\n6-Jan-10,625.86,625.86,606.36,608.26,3980628\n5-Jan-10,627.18,627.84,621.54,623.99,3007857\n4-Jan-10,626.95,629.51,624.24,626.75,1957963\n1-Jan-10,619.98,619.98,619.98,619.98,0\n31-Dec-09,619.98,619.98,619.98,619.98,0\n30-Dec-09,618.50,622.73,618.01,622.73,1466379\n29-Dec-09,624.74,624.84,618.29,619.40,1427712\n28-Dec-09,621.66,625.99,618.48,622.87,1698015\n25-Dec-09,618.48,618.48,618.48,618.48,0\n24-Dec-09,612.93,619.52,612.27,618.48,858620\n23-Dec-09,603.50,612.87,602.85,611.68,2075311\n22-Dec-09,601.34,601.50,598.85,601.12,1884290\n21-Dec-09,597.95,599.84,595.67,598.68,2571981\n18-Dec-09,596.03,598.93,595.00,596.42,3532540\n17-Dec-09,596.44,597.64,593.76,593.94,2640762\n16-Dec-09,598.91,600.37,596.64,597.76,2809751\n15-Dec-09,593.30,596.38,590.99,593.14,2280340\n14-Dec-09,595.24,597.31,592.61,595.73,1913572\n11-Dec-09,594.68,594.75,587.73,590.51,1723378\n10-Dec-09,590.44,594.71,590.41,591.50,1669525\n9-Dec-09,587.50,589.33,583.58,589.02,1781288\n8-Dec-09,583.50,590.66,582.00,587.05,1525524\n7-Dec-09,584.23,588.69,581.00,586.25,1636587\n4-Dec-09,593.02,594.83,579.18,585.01,2514042\n3-Dec-09,589.04,591.45,585.00,585.74,1429399\n2-Dec-09,590.98,593.01,586.22,587.51,1665225\n1-Dec-09,588.13,591.22,583.00,589.87,2321273\n30-Nov-09,580.63,583.67,577.11,583.00,1725231\n27-Nov-09,572.00,582.46,570.97,579.76,1384523\n26-Nov-09,585.74,585.74,585.74,585.74,0\n25-Nov-09,586.41,587.06,582.69,585.74,1461405\n24-Nov-09,582.50,584.29,576.54,583.09,1608648\n23-Nov-09,576.49,586.60,575.86,582.35,2548562\n20-Nov-09,569.50,571.60,569.40,569.96,2006202\n19-Nov-09,573.77,574.00,570.00,572.99,2168302\n18-Nov-09,576.65,578.78,572.07,576.65,1550127\n17-Nov-09,574.87,577.50,573.72,577.49,1920765\n16-Nov-09,575.00,576.99,572.78,576.28,2199136\n13-Nov-09,569.29,572.51,566.61,572.05,1668092\n12-Nov-09,569.56,572.90,565.50,567.85,1886395\n11-Nov-09,570.48,573.50,565.86,570.56,2321856\n10-Nov-09,562.73,568.78,562.00,566.76,2231476\n9-Nov-09,555.45,562.58,554.23,562.51,2651426\n6-Nov-09,547.72,551.78,545.50,551.10,1826705\n5-Nov-09,543.49,549.77,542.66,548.65,1848039\n4-Nov-09,540.80,545.50,536.42,540.33,2333629\n3-Nov-09,530.01,537.50,528.30,537.29,2382892\n2-Nov-09,537.08,539.46,528.24,533.99,3202875\n30-Oct-09,550.00,550.17,534.24,536.12,3469738\n29-Oct-09,543.01,551.83,541.00,551.05,2518762\n28-Oct-09,547.87,550.00,538.25,540.30,2568660\n27-Oct-09,550.97,554.56,544.16,548.29,3218033\n26-Oct-09,555.75,561.64,550.89,554.21,2973706\n23-Oct-09,555.25,557.89,551.20,553.69,2393191\n22-Oct-09,550.00,555.00,548.00,554.09,2337087\n21-Oct-09,549.91,559.35,549.00,551.10,3673168\n20-Oct-09,551.64,552.95,540.70,551.72,4044439\n19-Oct-09,552.69,553.60,548.73,552.09,3220167\n16-Oct-09,547.33,554.75,544.53,549.85,8845714\n15-Oct-09,533.75,536.90,527.27,529.91,6100353\n14-Oct-09,532.46,535.58,530.00,535.32,3265055\n13-Oct-09,524.39,527.46,521.38,526.11,3042242\n12-Oct-09,523.42,525.76,519.32,524.04,3324320\n9-Oct-09,516.65,521.51,514.50,516.25,2739892\n8-Oct-09,519.57,523.25,513.34,514.18,4306504\n7-Oct-09,499.00,518.99,497.81,517.54,4877683\n6-Oct-09,491.70,499.37,491.70,498.74,2732977\n5-Oct-09,487.65,492.43,483.34,488.52,2144652\n2-Oct-09,483.74,491.74,482.60,484.58,2600805\n1-Oct-09,493.00,496.47,487.00,487.20,2816234\n30-Sep-09,500.00,500.14,487.24,495.85,3141701\n29-Sep-09,499.53,499.75,493.01,498.53,2099379\n28-Sep-09,494.84,501.50,493.30,498.53,1843168\n25-Sep-09,494.29,499.93,492.00,492.48,2052014\n24-Sep-09,500.47,501.41,493.00,496.77,2528646\n23-Sep-09,500.78,507.00,497.71,498.81,2700820\n22-Sep-09,500.92,501.99,497.81,499.06,3041830\n21-Sep-09,487.74,498.90,486.22,497.00,2117567\n18-Sep-09,496.77,496.98,491.23,491.46,3284248\n17-Sep-09,490.57,497.37,487.15,491.72,4483447\n16-Sep-09,479.80,489.37,478.48,488.29,2587367\n15-Sep-09,475.08,478.91,472.71,477.54,2398607\n14-Sep-09,470.51,476.80,470.05,475.12,1977667\n11-Sep-09,470.40,473.30,467.63,472.14,1902811\n10-Sep-09,466.65,470.94,462.00,470.94,2535304\n9-Sep-09,459.06,466.27,458.80,463.97,2195496\n8-Sep-09,464.29,466.99,455.84,458.62,2656609\n4-Sep-09,457.57,462.60,455.78,461.30,1499873\n3-Sep-09,455.82,458.25,455.00,457.52,1646354\n2-Sep-09,455.82,458.33,452.59,453.01,1806518\n1-Sep-09,459.68,466.82,454.42,455.76,2595091\n31-Aug-09,459.79,461.86,458.00,461.67,1957955\n28-Aug-09,469.26,472.37,463.38,464.75,1771808\n27-Aug-09,468.58,468.58,460.73,466.06,2000000\n26-Aug-09,472.76,473.00,466.70,468.00,1988449\n25-Aug-09,469.13,474.35,468.72,471.37,2343030\n24-Aug-09,467.35,470.09,464.42,468.73,2459325\n21-Aug-09,465.54,466.09,462.65,465.24,3564367\n20-Aug-09,452.00,462.18,451.23,460.41,4002454\n19-Aug-09,439.99,445.00,438.56,443.97,2260091\n18-Aug-09,445.10,447.70,442.32,445.28,2357493\n17-Aug-09,451.50,451.99,443.12,444.89,2620304\n14-Aug-09,462.78,463.18,456.89,460.00,1676559\n13-Aug-09,462.15,464.72,458.91,462.28,1995640\n12-Aug-09,455.41,461.75,454.92,458.58,2341768\n10-Aug-09,455.14,458.41,453.79,456.61,1741979\n7-Aug-09,455.67,459.42,454.99,457.10,2543392\n6-Aug-09,454.30,454.88,448.53,450.36,2111395\n5-Aug-09,456.00,456.91,447.88,451.14,2342227\n4-Aug-09,449.37,454.00,448.43,453.73,2390098\n3-Aug-09,448.74,453.90,447.64,452.21,2591173\n31-Jul-09,449.98,452.70,442.43,443.05,2861550\n30-Jul-09,442.61,451.47,442.61,445.64,3200547\n29-Jul-09,437.23,437.80,431.88,436.24,1987216\n28-Jul-09,441.00,442.81,436.10,439.85,2541052\n27-Jul-09,446.04,446.75,437.61,444.80,2505329\n24-Jul-09,435.81,450.49,435.00,446.72,3629454\n23-Jul-09,428.68,441.21,425.50,437.34,3479378\n22-Jul-09,428.00,430.20,423.50,427.69,2586960\n21-Jul-09,430.94,431.90,425.72,427.90,2969146\n20-Jul-09,429.88,432.85,426.25,430.17,3154002\n17-Jul-09,433.00,435.48,426.70,430.25,6854734\n16-Jul-09,436.68,445.75,434.10,442.60,6554412\n15-Jul-09,429.66,438.68,428.49,438.17,3779342\n14-Jul-09,423.71,426.73,420.87,424.69,2896461\n13-Jul-09,416.17,424.52,415.18,424.30,4047557\n10-Jul-09,409.58,417.37,408.70,414.40,2929559\n9-Jul-09,406.12,414.45,405.80,410.39,3275816\n8-Jul-09,400.00,406.00,398.06,402.49,3441854\n7-Jul-09,408.24,409.19,395.98,396.63,3260307\n6-Jul-09,406.50,410.64,401.66,409.61,2262557\n3-Jul-09,408.49,408.49,408.49,408.49,0\n2-Jul-09,415.41,415.41,406.81,408.49,2517630\n1-Jul-09,424.20,426.40,418.15,418.99,2310768\n30-Jun-09,424.00,427.21,418.22,421.59,2594683\n29-Jun-09,426.00,427.80,422.24,424.14,2169518\n26-Jun-09,413.68,428.23,413.11,425.32,3257482\n25-Jun-09,407.00,415.90,406.51,415.77,3042038\n24-Jun-09,408.74,412.23,406.56,409.29,2457992\n23-Jun-09,406.65,408.99,402.55,405.68,2899710\n22-Jun-09,416.95,417.49,401.89,407.35,4124360\n19-Jun-09,418.21,420.46,414.58,420.09,4261008\n18-Jun-09,415.68,418.69,413.00,414.06,3087653\n17-Jun-09,416.19,419.72,411.56,415.16,3490947\n16-Jun-09,419.31,421.09,415.42,416.00,3050261\n15-Jun-09,421.50,421.50,414.00,416.77,3737299\n12-Jun-09,426.86,427.70,421.21,424.84,2918429\n11-Jun-09,431.77,433.73,428.37,429.00,2866040\n10-Jun-09,436.23,437.89,426.67,432.60,3358870\n9-Jun-09,438.58,440.50,431.76,435.62,3255945\n8-Jun-09,439.50,440.92,434.12,438.77,3098931\n5-Jun-09,445.07,447.34,439.46,444.32,3681002\n4-Jun-09,435.30,441.24,434.50,440.28,3639434\n3-Jun-09,426.00,432.46,424.00,431.65,3535593\n2-Jun-09,426.25,429.96,423.40,428.40,2626012\n1-Jun-09,418.73,429.60,418.53,426.56,3323431\n29-May-09,412.11,417.23,410.70,417.23,2649405\n28-May-09,408.68,411.62,404.61,410.40,2668993\n27-May-09,405.64,411.86,404.81,405.56,3035892\n26-May-09,391.95,405.00,390.00,404.36,3104776\n22-May-09,396.66,398.65,392.00,393.50,1718843\n21-May-09,396.30,402.84,393.84,396.50,2720300\n20-May-09,402.09,405.67,395.00,397.18,2284191\n19-May-09,396.10,401.64,393.00,398.88,2837823\n18-May-09,394.73,397.31,385.40,396.84,3352055\n15-May-09,391.10,394.11,389.09,390.00,3016859\n14-May-09,388.80,392.21,384.69,387.50,2937904\n13-May-09,394.09,396.39,388.35,389.54,2852384\n12-May-09,410.01,410.99,395.11,399.01,3796453\n11-May-09,402.80,412.00,401.20,407.98,2560736\n8-May-09,402.85,410.13,395.00,407.33,3865597\n7-May-09,404.10,404.99,392.50,396.61,3000724\n6-May-09,406.79,408.28,401.00,403.47,2633743\n5-May-09,399.98,405.00,397.25,402.99,2401096\n4-May-09,398.17,402.40,394.79,401.98,3204843\n1-May-09,395.03,397.59,391.55,393.69,2428611\n30-Apr-09,395.76,403.75,394.80,395.97,4361069\n29-Apr-09,385.97,394.97,385.83,391.47,3610160\n28-Apr-09,383.75,389.05,381.54,383.71,2943938\n27-Apr-09,384.34,389.49,382.75,385.95,2291125\n24-Apr-09,386.05,393.18,380.50,389.49,3386147\n23-Apr-09,387.51,389.75,381.11,384.69,2611240\n22-Apr-09,381.75,390.00,379.01,383.86,3503616\n21-Apr-09,376.17,384.30,376.10,381.47,3697301\n20-Apr-09,386.15,390.65,375.89,379.30,4429555\n17-Apr-09,386.02,399.82,384.81,392.24,10734963\n16-Apr-09,381.50,392.90,381.02,388.74,10185094\n15-Apr-09,367.10,381.06,364.16,379.50,4935003\n14-Apr-09,376.94,376.99,365.60,368.91,3429359\n13-Apr-09,371.33,379.10,370.30,378.11,3050081\n10-Apr-09,372.50,372.50,372.50,372.50,0\n9-Apr-09,369.50,374.35,366.25,372.50,3383146\n8-Apr-09,363.50,365.00,356.21,362.00,2765142\n7-Apr-09,362.60,363.75,355.31,358.65,3681433\n6-Apr-09,367.00,369.82,361.40,368.24,3281760\n3-Apr-09,364.50,371.72,358.00,369.78,3770328\n2-Apr-09,363.31,369.76,360.32,362.50,4489367\n1-Apr-09,343.78,355.24,340.61,354.09,3303042\n31-Mar-09,348.93,353.51,346.18,348.06,3658421\n30-Mar-09,342.55,343.81,336.06,342.69,3096702\n27-Mar-09,350.00,352.00,345.47,347.70,3323401\n26-Mar-09,353.13,359.16,348.50,353.29,6004769\n25-Mar-09,350.40,351.34,336.25,344.07,4337117\n24-Mar-09,346.50,353.84,344.00,347.16,3821808\n23-Mar-09,333.56,349.45,333.03,348.60,4272085\n20-Mar-09,330.30,332.99,326.34,330.16,4738590\n19-Mar-09,331.68,336.00,327.38,329.94,4111476\n18-Mar-09,334.81,340.00,328.05,333.10,5013619\n17-Mar-09,320.18,335.34,319.09,335.34,4715786\n16-Mar-09,325.99,329.73,318.59,319.69,4947256\n13-Mar-09,326.10,327.46,319.03,324.42,3907609\n12-Mar-09,317.54,325.00,313.65,323.53,5026330\n11-Mar-09,310.10,320.00,305.71,317.91,5927178\n10-Mar-09,298.25,310.50,294.25,308.17,6731733\n9-Mar-09,299.98,306.57,289.45,290.89,6929592\n6-Mar-09,307.22,310.19,294.25,308.57,7238087\n5-Mar-09,316.48,319.08,302.64,305.64,6530631\n4-Mar-09,323.16,329.00,315.38,318.92,7820133\n3-Mar-09,330.07,333.69,322.35,325.48,6524207\n2-Mar-09,333.33,340.70,326.00,327.16,5789674\n27-Feb-09,332.95,343.82,331.11,337.99,5420892\n26-Feb-09,345.96,352.49,337.16,337.18,5607758\n25-Feb-09,342.15,352.30,338.92,341.64,6440776\n24-Feb-09,331.02,349.62,330.89,345.45,6101985\n23-Feb-09,347.00,349.80,329.55,330.06,5220506\n20-Feb-09,338.05,348.92,335.00,346.45,6217692\n19-Feb-09,357.47,359.80,341.41,342.64,4989553\n18-Feb-09,347.24,353.38,340.52,353.11,6025999\n17-Feb-09,346.51,347.09,339.69,342.66,5680732\n13-Feb-09,362.19,362.99,355.23,357.68,4147107\n12-Feb-09,353.16,363.62,351.48,363.05,5551383\n11-Feb-09,358.95,365.00,353.00,358.04,5232088\n10-Feb-09,375.98,377.50,357.89,358.51,7105831\n9-Feb-09,371.28,381.00,367.30,378.77,4983224\n6-Feb-09,356.46,373.81,355.44,371.28,7041797\n5-Feb-09,340.91,355.38,337.00,353.72,7265283\n4-Feb-09,340.07,354.44,339.17,343.00,6817851\n3-Feb-09,342.57,343.00,333.83,340.45,6561634\n2-Feb-09,334.29,345.00,332.00,340.57,5206915\n30-Jan-09,344.69,348.80,336.00,338.53,4672843\n29-Jan-09,344.54,345.05,340.11,343.32,7284342\n28-Jan-09,337.98,352.33,336.31,348.67,7693202\n27-Jan-09,326.45,333.87,324.27,331.48,4929544\n26-Jan-09,324.85,328.00,320.56,323.87,4611581\n23-Jan-09,309.27,331.96,304.22,324.70,10732775\n22-Jan-09,298.04,309.35,295.15,306.50,8266320\n21-Jan-09,288.35,303.50,288.35,303.08,4927534\n20-Jan-09,299.14,299.50,282.75,282.75,5050088\n16-Jan-09,305.02,308.25,295.70,299.67,5225959\n15-Jan-09,297.57,303.58,286.79,298.99,5936381\n14-Jan-09,310.00,313.80,297.75,300.97,5577379\n13-Jan-09,311.77,320.60,310.39,314.32,4433603\n12-Jan-09,316.31,318.95,310.23,312.69,3304863\n9-Jan-09,327.50,327.50,313.40,315.07,4341085\n8-Jan-09,318.28,325.19,317.34,325.19,3601466\n7-Jan-09,328.32,330.91,318.75,322.01,4495295\n6-Jan-09,332.98,340.80,326.39,334.06,6426845\n5-Jan-09,321.00,331.24,315.00,328.05,4891063\n2-Jan-09,308.60,321.82,305.50,321.32,3617574\n1-Jan-09,307.65,307.65,307.65,307.65,0\n31-Dec-08,304.20,311.00,302.61,307.65,2887334\n30-Dec-08,300.80,306.81,298.71,303.11,3845369\n29-Dec-08,300.22,301.38,291.58,297.42,3702166\n26-Dec-08,304.07,305.26,298.31,300.36,1961122\n25-Dec-08,302.95,302.95,302.95,302.95,0\n24-Dec-08,301.48,306.34,298.38,302.95,1921757\n23-Dec-08,300.43,303.31,296.67,298.02,3783790\n22-Dec-08,308.56,309.50,290.63,297.11,3919429\n19-Dec-08,310.99,317.79,309.00,310.17,5670140\n18-Dec-08,316.70,320.35,309.11,310.28,4764056\n17-Dec-08,318.64,322.13,312.42,315.24,5789689\n16-Dec-08,314.52,329.50,311.27,325.28,7199994\n15-Dec-08,314.01,318.49,305.11,310.67,6738806\n12-Dec-08,295.71,316.47,294.00,315.76,5722856\n11-Dec-08,304.17,312.88,297.80,300.22,6181078\n10-Dec-08,309.24,314.90,304.51,308.82,5239603\n9-Dec-08,297.69,318.00,297.01,305.97,6891773\n8-Dec-08,289.99,309.44,282.00,302.11,8145300\n5-Dec-08,271.02,284.24,264.02,283.99,6523543\n4-Dec-08,276.53,283.49,268.77,274.34,4887799\n3-Dec-08,269.85,281.36,265.34,279.43,5906616\n2-Dec-08,269.73,277.78,262.58,275.11,5841927\n1-Dec-08,286.68,287.38,265.98,265.99,5711464\n28-Nov-08,290.58,296.45,288.28,292.96,2566368\n27-Nov-08,292.09,292.09,292.09,292.09,0\n26-Nov-08,280.28,295.46,276.20,292.09,6359179\n25-Nov-08,268.68,286.66,267.32,282.05,10774259\n24-Nov-08,269.26,269.95,249.01,257.44,10059557\n21-Nov-08,262.51,269.37,247.30,262.43,10246338\n20-Nov-08,274.89,282.94,259.04,259.56,9780746\n19-Nov-08,295.39,300.19,278.58,280.18,7841605\n18-Nov-08,301.57,303.73,285.35,297.42,8348791\n17-Nov-08,303.00,310.16,297.95,300.12,7544451\n14-Nov-08,303.25,324.99,302.56,310.02,9518466\n13-Nov-08,291.77,313.00,280.00,312.08,13239068\n12-Nov-08,302.05,312.49,287.76,291.00,10054453\n11-Nov-08,308.69,316.30,300.52,311.46,10148785\n10-Nov-08,328.00,329.44,309.47,318.78,8097595\n7-Nov-08,333.12,341.15,325.33,331.14,4622900\n6-Nov-08,339.97,344.42,325.81,331.22,8186900\n5-Nov-08,362.15,368.88,341.31,342.24,6902100\n4-Nov-08,353.44,372.36,345.50,366.94,7277700\n3-Nov-08,357.58,362.99,341.43,346.49,5642900\n31-Oct-08,356.16,371.96,354.27,359.36,7299400\n30-Oct-08,368.46,372.00,358.37,359.69,7894700\n29-Oct-08,365.79,371.00,352.37,358.00,9656600\n28-Oct-08,339.05,369.31,328.51,368.75,7964800\n27-Oct-08,334.81,343.00,325.60,329.49,6134700\n24-Oct-08,326.47,350.47,324.74,339.29,7221800\n23-Oct-08,353.65,358.00,337.99,352.32,6404700\n22-Oct-08,356.99,369.69,344.00,355.67,6445200\n21-Oct-08,372.39,383.78,362.00,362.75,5628300\n20-Oct-08,379.75,380.98,359.59,379.32,6649600\n17-Oct-08,378.96,386.00,363.55,372.54,13881200\n16-Oct-08,332.76,356.50,309.44,353.02,13980400\n15-Oct-08,354.65,359.00,338.83,339.17,6614000\n14-Oct-08,393.53,394.50,357.00,362.71,7515800\n13-Oct-08,355.79,381.95,345.75,381.02,8733100\n10-Oct-08,313.16,341.89,310.30,332.00,10402000\n9-Oct-08,344.52,348.57,321.67,328.98,7982100\n8-Oct-08,330.16,358.99,326.11,338.11,11668000\n7-Oct-08,373.33,374.98,345.37,346.01,10807000\n6-Oct-08,373.98,375.99,357.16,371.21,11084200\n3-Oct-08,397.35,412.50,383.07,386.91,7925900\n2-Oct-08,409.79,409.98,386.00,390.49,5936400\n1-Oct-08,411.15,416.98,403.10,411.72,6082700\n30-Sep-08,396.00,489.36,392.32,400.52,9451900\n29-Sep-08,419.51,423.51,380.71,381.00,10623400\n26-Sep-08,428.00,437.16,421.03,431.04,5252400\n25-Sep-08,438.84,450.00,435.98,439.60,4919500\n24-Sep-08,430.34,445.00,430.11,435.11,4186300\n23-Sep-08,433.25,440.79,425.72,429.27,5106300\n22-Sep-08,454.13,454.13,429.00,430.14,4321000\n19-Sep-08,461.00,462.07,443.28,449.15,9552700\n18-Sep-08,422.64,439.18,410.50,439.08,8395600\n17-Sep-08,438.48,439.14,413.44,414.49,8953200\n16-Sep-08,425.96,449.28,425.49,442.93,6888400\n15-Sep-08,424.00,441.97,423.71,433.86,6490000\n12-Sep-08,430.21,441.99,429.00,437.66,5983600\n11-Sep-08,408.35,435.09,406.38,433.75,6401000\n10-Sep-08,424.47,424.48,409.68,414.16,6141100\n9-Sep-08,423.17,432.38,415.00,418.66,7143600\n8-Sep-08,452.02,452.94,417.55,419.95,8890500\n5-Sep-08,445.49,452.46,440.08,444.25,4470900\n4-Sep-08,460.00,463.24,449.40,450.26,4792700\n3-Sep-08,468.73,474.29,459.58,464.41,4281600\n2-Sep-08,476.77,482.18,461.42,465.25,6020400\n29-Aug-08,469.75,471.01,462.33,463.29,3768100\n28-Aug-08,472.49,476.45,470.33,473.78,3004500\n27-Aug-08,473.73,474.83,464.84,468.58,4354700\n26-Aug-08,483.46,483.46,470.59,474.16,3182200\n25-Aug-08,486.11,497.00,481.50,483.01,1975500\n22-Aug-08,491.50,494.88,489.48,490.59,2264900\n21-Aug-08,482.92,489.90,479.27,486.53,3437900\n20-Aug-08,494.72,496.69,482.57,485.00,3969700\n19-Aug-08,490.43,498.28,486.63,490.50,2970000\n18-Aug-08,509.84,510.00,495.51,498.30,3264000\n15-Aug-08,506.99,510.66,505.50,510.15,3487200\n14-Aug-08,497.70,507.61,496.29,505.49,2888200\n13-Aug-08,501.60,503.54,493.88,500.03,3602700\n12-Aug-08,502.00,506.13,498.00,502.61,2731100\n11-Aug-08,492.47,508.88,491.78,500.84,4199600\n8-Aug-08,480.15,495.75,475.69,495.01,3700900\n7-Aug-08,482.00,484.00,476.41,479.12,2711600\n6-Aug-08,478.37,489.77,472.51,486.34,3346000\n5-Aug-08,467.59,480.08,466.33,479.85,3510200\n4-Aug-08,468.12,473.01,461.90,463.00,2459100\n1-Aug-08,472.51,473.22,462.50,467.86,2969000\n31-Jul-08,474.56,480.89,471.44,473.75,2827400\n30-Jul-08,485.50,486.02,472.81,482.70,3459200\n29-Jul-08,479.30,487.26,478.00,483.11,2711800\n28-Jul-08,492.09,492.09,475.13,477.12,3121800\n25-Jul-08,486.49,493.13,481.50,491.98,3064300\n24-Jul-08,496.70,496.87,475.62,475.62,3466300\n23-Jul-08,481.61,497.23,478.10,489.22,4695400\n22-Jul-08,466.72,480.25,465.60,477.11,4619400\n21-Jul-08,480.88,484.09,465.70,468.80,5802900\n18-Jul-08,498.35,498.98,478.19,481.32,10783800\n17-Jul-08,534.16,537.05,524.50,533.44,5491200\n16-Jul-08,514.04,536.50,510.60,535.60,4674700\n15-Jul-08,516.28,527.50,501.10,516.09,6015000\n14-Jul-08,539.00,540.06,515.45,521.62,4398500\n11-Jul-08,536.50,539.50,519.43,533.80,4822900\n10-Jul-08,545.00,549.50,530.72,540.57,4263500\n9-Jul-08,550.76,555.68,540.73,541.55,4081100\n8-Jul-08,545.99,555.19,540.00,554.53,4406200\n7-Jul-08,542.30,549.00,535.60,543.91,4198600\n3-Jul-08,530.88,539.23,527.50,537.00,2368800\n2-Jul-08,536.51,540.38,526.06,527.04,4148700\n1-Jul-08,519.58,536.72,517.00,534.73,4874800\n30-Jun-08,532.47,538.00,523.06,526.42,3683000\n27-Jun-08,527.68,530.00,515.09,528.07,5073700\n26-Jun-08,544.10,544.93,528.26,528.82,5549400\n25-Jun-08,544.97,557.80,543.67,551.00,3911100\n24-Jun-08,545.14,551.19,535.10,542.30,4637000\n23-Jun-08,545.36,553.15,542.02,545.21,3597200\n20-Jun-08,556.98,556.98,544.51,546.43,5830600\n19-Jun-08,555.35,563.78,550.81,560.20,5587600\n18-Jun-08,564.51,568.99,559.16,562.38,3285800\n17-Jun-08,576.35,578.07,568.38,569.46,3434600\n16-Jun-08,566.50,579.10,566.50,572.81,3506400\n13-Jun-08,561.49,575.70,561.34,571.51,6060500\n12-Jun-08,548.76,558.00,546.88,552.95,5390700\n11-Jun-08,556.24,557.34,544.46,545.20,3776700\n10-Jun-08,549.56,558.82,546.78,554.17,3620100\n9-Jun-08,568.06,570.00,545.40,557.87,5267200\n6-Jun-08,579.75,580.72,567.00,567.00,4679900\n5-Jun-08,577.08,588.04,576.21,586.30,3897400\n4-Jun-08,565.33,578.00,564.55,572.22,3344000\n3-Jun-08,576.50,580.50,560.61,567.30,4268700\n2-Jun-08,582.50,583.89,571.27,575.00,3615700\n30-May-08,583.47,589.92,581.30,585.80,3136900\n29-May-08,574.79,585.88,573.20,583.00,4754900\n28-May-08,567.94,571.49,561.10,568.24,3976800\n27-May-08,544.96,562.60,543.85,560.90,3610700\n23-May-08,546.96,553.00,537.81,544.62,4394600\n22-May-08,551.95,554.21,540.25,549.46,4312200\n21-May-08,578.52,581.41,547.89,549.99,6301600\n20-May-08,574.63,582.48,572.91,578.60,3246600\n19-May-08,578.55,588.88,573.52,577.52,5565300\n16-May-08,581.43,584.68,578.32,580.07,4022100\n15-May-08,579.00,582.95,575.61,581.00,4296000\n14-May-08,586.49,591.19,575.25,576.30,4326600\n13-May-08,586.23,587.95,578.55,583.00,5061600\n12-May-08,574.75,586.75,568.91,584.94,4821300\n9-May-08,579.00,585.00,571.30,573.20,4446100\n8-May-08,586.20,589.30,578.91,583.01,5051200\n7-May-08,590.27,599.49,576.43,579.00,6541200\n6-May-08,591.00,592.00,583.00,586.36,4537100\n5-May-08,598.86,599.00,587.13,594.90,6091000\n2-May-08,598.49,602.45,579.30,581.29,6879300\n1-May-08,578.31,594.93,576.97,593.08,6555200\n30-Apr-08,562.21,584.86,558.47,574.29,7784100\n29-Apr-08,550.83,563.40,550.01,558.47,4276200\n28-Apr-08,545.88,556.81,539.00,552.12,3954200\n25-Apr-08,549.02,553.00,542.73,544.06,4022900\n24-Apr-08,551.29,554.49,540.02,543.04,4068400\n23-Apr-08,557.94,559.31,540.95,546.49,4798100\n22-Apr-08,537.57,560.83,537.56,555.00,7843800\n21-Apr-08,539.39,542.59,530.29,537.79,7254200\n18-Apr-08,535.21,547.70,524.77,539.41,16860300\n17-Apr-08,455.63,459.37,446.52,449.54,7133100\n16-Apr-08,444.40,458.28,441.00,455.03,7453000\n15-Apr-08,458.13,459.72,443.72,446.84,4436400\n14-Apr-08,457.16,457.45,450.15,451.66,3766400\n11-Apr-08,464.07,467.26,455.01,457.45,3791600\n10-Apr-08,464.96,473.86,461.85,469.08,5049400\n9-Apr-08,469.13,472.00,457.54,464.19,5961200\n8-Apr-08,473.04,474.14,462.01,467.81,4493800\n7-Apr-08,477.03,485.44,473.53,476.82,5800900\n4-Apr-08,457.01,477.83,456.20,471.09,5843300\n3-Apr-08,461.73,463.29,448.13,455.12,6391200\n2-Apr-08,469.90,475.74,460.39,465.70,5940600\n1-Apr-08,447.74,466.50,446.87,465.71,6027000\n31-Mar-08,435.64,442.69,432.01,440.47,4368800\n28-Mar-08,447.46,453.57,434.31,438.08,4322700\n27-Mar-08,446.00,448.61,440.49,444.08,5665800\n26-Mar-08,452.59,462.87,449.29,458.19,4919500\n25-Mar-08,457.46,457.47,446.00,450.78,5710500\n24-Mar-08,438.43,465.78,437.72,460.56,6714900\n20-Mar-08,427.32,435.70,417.50,433.55,9522900\n19-Mar-08,441.11,447.50,431.67,432.00,6062400\n18-Mar-08,428.98,440.84,425.53,439.16,7103700\n17-Mar-08,427.99,433.71,412.11,419.87,7794500\n14-Mar-08,442.98,449.34,430.62,437.92,6448000\n13-Mar-08,432.67,446.98,428.78,443.01,7647300\n12-Mar-08,440.01,447.88,438.07,440.18,6481500\n11-Mar-08,425.26,440.15,424.65,439.84,8520100\n10-Mar-08,428.83,431.00,413.04,413.62,7871400\n7-Mar-08,428.88,440.00,426.24,433.35,7930200\n6-Mar-08,447.69,453.30,431.18,432.70,7348000\n5-Mar-08,445.25,454.17,444.00,447.70,7288500\n4-Mar-08,450.95,453.36,435.78,444.60,13472400\n3-Mar-08,471.51,472.72,450.11,457.02,7495200\n29-Feb-08,471.87,479.74,464.65,471.18,9281700\n28-Feb-08,470.50,479.09,467.36,475.39,6308700\n27-Feb-08,460.13,475.49,459.64,472.86,9992200\n26-Feb-08,461.20,466.47,446.85,464.19,22296900\n25-Feb-08,505.95,506.50,485.74,486.44,8188300\n22-Feb-08,502.06,509.00,497.55,507.80,5445500\n21-Feb-08,512.85,513.21,499.50,502.86,5527300\n20-Feb-08,503.51,511.01,498.82,509.00,6556700\n19-Feb-08,534.94,535.06,506.50,508.95,6259400\n15-Feb-08,528.31,532.66,524.33,529.64,5080100\n14-Feb-08,538.35,541.04,531.00,532.25,6400800\n13-Feb-08,522.50,534.99,518.69,534.62,6090200\n12-Feb-08,523.39,530.60,513.03,518.09,6576800\n11-Feb-08,520.52,523.71,513.40,521.16,5758900\n8-Feb-08,509.41,517.73,508.70,516.69,6739400\n7-Feb-08,496.86,514.19,494.76,504.95,7830900\n6-Feb-08,511.14,511.17,497.93,501.71,7492300\n5-Feb-08,489.43,509.00,488.52,506.80,11023400\n4-Feb-08,509.07,512.78,492.55,495.43,12923200\n1-Feb-08,528.67,536.67,510.00,515.90,16711900\n31-Jan-08,539.01,573.00,534.29,564.30,10447200\n30-Jan-08,549.19,560.43,543.51,548.27,7817400\n29-Jan-08,560.47,561.33,540.67,550.52,6028300\n28-Jan-08,570.97,572.24,548.60,555.98,5752900\n25-Jan-08,591.81,595.00,566.18,566.40,6831100\n24-Jan-08,558.80,579.69,554.14,574.49,9156200\n23-Jan-08,560.71,568.00,519.00,548.62,16687700\n22-Jan-08,562.03,597.50,561.20,584.35,9000100\n18-Jan-08,608.36,609.99,598.45,600.25,8265800\n17-Jan-08,620.76,625.74,598.01,600.79,8104500\n16-Jan-08,628.97,639.99,601.93,615.95,10478800\n15-Jan-08,645.90,649.05,635.38,637.65,5290800\n14-Jan-08,651.14,657.40,645.25,653.82,4355600\n11-Jan-08,642.70,649.47,630.11,638.25,4946700\n10-Jan-08,645.01,657.20,640.11,646.73,6207900\n9-Jan-08,630.04,653.34,622.51,653.20,6677200\n8-Jan-08,653.00,659.96,631.00,631.68,5248700\n7-Jan-08,653.94,662.28,637.35,649.25,6282100\n4-Jan-08,679.69,680.96,655.00,657.00,5273500\n3-Jan-08,685.26,686.85,676.52,685.33,3202600\n2-Jan-08,692.87,697.37,677.73,685.19,4247000\n31-Dec-07,698.57,702.49,690.58,691.48,2336300\n28-Dec-07,704.93,707.95,696.54,702.53,2503100\n27-Dec-07,707.07,716.00,700.74,700.74,2921800\n26-Dec-07,698.99,713.22,698.21,710.84,2500600\n24-Dec-07,694.99,700.73,693.06,700.73,1503500\n21-Dec-07,697.88,699.26,693.24,696.69,5103700\n20-Dec-07,685.83,691.00,680.61,689.69,4295200\n19-Dec-07,674.21,679.50,669.00,677.37,4397100\n18-Dec-07,674.16,676.71,652.50,673.35,7029600\n17-Dec-07,688.00,695.42,663.67,669.23,5453000\n14-Dec-07,687.51,699.70,687.26,689.96,3636600\n13-Dec-07,696.31,697.62,681.21,694.05,5013900\n12-Dec-07,714.00,714.32,688.50,699.35,5991000\n11-Dec-07,719.94,720.99,698.78,699.20,5414700\n10-Dec-07,715.99,724.80,714.00,718.42,3184500\n7-Dec-07,714.99,718.00,710.50,714.87,3785200\n6-Dec-07,697.80,716.56,697.01,715.26,4850900\n5-Dec-07,692.73,698.93,687.50,698.51,4117400\n4-Dec-07,678.31,692.00,677.12,684.16,4157500\n3-Dec-07,691.01,695.00,681.14,681.53,4269900\n30-Nov-07,711.00,711.06,682.11,693.00,7697600\n29-Nov-07,690.75,702.79,687.77,697.00,6167400\n28-Nov-07,682.11,694.30,672.14,692.26,7750600\n27-Nov-07,674.80,676.43,650.26,673.57,8805500\n26-Nov-07,680.20,693.40,665.00,666.00,6420500\n23-Nov-07,670.00,678.28,668.11,676.70,2558000\n21-Nov-07,643.77,669.97,642.08,660.52,6931900\n20-Nov-07,636.48,659.10,632.87,648.54,9527300\n19-Nov-07,629.59,636.77,618.50,625.85,5459400\n16-Nov-07,633.94,635.49,616.02,633.63,8813800\n15-Nov-07,638.57,647.50,624.00,629.65,6871200\n14-Nov-07,673.28,675.49,636.27,641.68,7739800\n13-Nov-07,644.99,660.92,642.00,660.55,8181000\n12-Nov-07,657.74,669.93,626.21,632.07,10060700\n9-Nov-07,675.78,681.88,661.21,663.97,10487700\n8-Nov-07,734.60,734.89,677.18,693.84,15612500\n7-Nov-07,741.13,747.24,723.14,732.94,7997400\n6-Nov-07,737.56,741.79,725.00,741.79,8267700\n5-Nov-07,706.99,730.23,706.07,725.65,8778300\n2-Nov-07,710.51,713.58,697.34,711.25,5639100\n1-Nov-07,702.59,713.72,701.78,703.21,6407200\n31-Oct-07,700.69,707.00,696.04,707.00,6525900\n30-Oct-07,677.51,699.91,677.51,694.77,6798600\n29-Oct-07,677.77,680.00,672.09,679.23,3008400\n26-Oct-07,674.03,676.54,668.06,674.60,3258600\n25-Oct-07,678.68,678.97,663.55,668.51,5687900\n24-Oct-07,672.71,677.47,659.56,675.82,7324000\n23-Oct-07,661.25,677.60,660.00,675.77,6575800\n22-Oct-07,638.67,655.00,636.28,650.75,6490000\n19-Oct-07,654.56,658.49,643.23,644.71,14154000\n18-Oct-07,635.41,641.37,628.50,639.62,8650500\n17-Oct-07,630.45,634.00,621.59,633.48,5784700\n16-Oct-07,618.49,625.92,611.99,616.00,5661300\n15-Oct-07,638.47,639.86,615.55,620.11,6838600\n12-Oct-07,623.98,638.40,618.24,637.39,6652800\n11-Oct-07,633.64,641.41,609.00,622.00,11509700\n10-Oct-07,621.36,625.68,616.80,625.39,5190300\n9-Oct-07,615.11,623.78,608.39,615.18,8533500\n8-Oct-07,595.00,610.26,593.95,609.62,4980400\n5-Oct-07,587.11,596.00,587.01,594.05,4895400\n4-Oct-07,585.09,585.09,577.06,579.03,2931500\n3-Oct-07,586.25,588.99,580.36,584.02,3806000\n2-Oct-07,583.38,596.81,580.01,584.39,6838000\n1-Oct-07,569.97,584.35,569.61,582.55,4640000\n28-Sep-07,567.00,569.55,564.12,567.27,2448000\n27-Sep-07,571.73,571.74,565.78,567.50,1980100\n26-Sep-07,570.40,571.79,563.81,568.16,3234400\n25-Sep-07,564.00,569.56,562.86,569.00,2647400\n24-Sep-07,561.00,571.46,560.00,568.02,5210800\n21-Sep-07,556.34,560.79,552.83,560.10,6957000\n20-Sep-07,547.00,556.80,546.03,552.83,5485600\n19-Sep-07,539.27,549.45,538.86,546.85,5477500\n18-Sep-07,526.52,537.25,524.27,535.27,4107700\n17-Sep-07,526.53,529.28,524.07,525.30,2140600\n14-Sep-07,523.20,530.27,522.22,528.75,2723500\n13-Sep-07,524.06,527.21,523.22,524.78,1873300\n12-Sep-07,520.53,527.98,519.00,522.65,2946000\n11-Sep-07,516.99,521.65,515.73,521.33,2680300\n10-Sep-07,521.28,522.07,510.88,514.48,3198900\n7-Sep-07,517.86,521.24,516.80,519.35,3590700\n6-Sep-07,529.36,529.83,518.24,523.52,3576700\n5-Sep-07,523.40,529.48,522.25,527.80,3241700\n4-Sep-07,515.02,528.00,514.62,525.15,3633900\n31-Aug-07,513.10,516.50,511.47,515.25,2681700\n30-Aug-07,512.36,515.40,510.58,511.40,2583400\n29-Aug-07,507.84,513.30,507.23,512.88,2476800\n28-Aug-07,511.53,514.98,505.79,506.40,2889400\n27-Aug-07,514.43,517.45,511.40,513.26,2271800\n24-Aug-07,512.61,515.55,508.50,515.00,2447200\n23-Aug-07,516.00,516.13,507.00,512.19,2995400\n22-Aug-07,509.96,516.25,509.25,512.75,3076000\n21-Aug-07,498.94,508.16,497.77,506.61,3546200\n20-Aug-07,502.46,502.56,496.00,497.92,2589800\n17-Aug-07,497.44,501.00,491.65,500.04,5236600\n16-Aug-07,492.02,496.43,480.46,491.52,8438400\n15-Aug-07,509.00,511.69,496.71,497.55,5337100\n14-Aug-07,515.17,517.40,508.00,508.60,3574300\n13-Aug-07,519.54,519.75,513.03,515.50,3022500\n10-Aug-07,510.18,518.72,505.63,515.75,5000100\n9-Aug-07,520.80,526.82,514.63,514.73,4764500\n8-Aug-07,519.34,525.78,517.09,525.78,3955500\n7-Aug-07,509.75,519.88,509.04,516.02,4191400\n6-Aug-07,503.00,510.15,502.50,510.00,3582100\n3-Aug-07,510.05,513.20,503.00,503.00,3090600\n2-Aug-07,513.72,514.99,509.00,511.01,3117100\n1-Aug-07,510.50,516.51,508.14,512.94,4329800\n31-Jul-07,520.23,520.44,510.00,510.00,4159100\n30-Jul-07,512.92,519.34,510.50,516.11,3798800\n27-Jul-07,508.53,516.62,505.50,511.89,5361400\n26-Jul-07,508.74,512.59,498.88,508.00,6779400\n25-Jul-07,516.98,517.02,505.56,509.76,5453500\n24-Jul-07,509.30,518.69,507.11,514.00,5346600\n23-Jul-07,519.01,520.00,512.15,512.51,6227900\n20-Jul-07,511.90,523.18,509.50,520.12,16026500\n19-Jul-07,553.46,553.52,542.24,548.59,6477800\n18-Jul-07,553.89,554.50,543.81,549.50,5973900\n17-Jul-07,555.04,557.73,552.38,555.00,4211200\n16-Jul-07,550.30,558.58,549.31,552.99,6550000\n13-Jul-07,547.91,552.67,547.25,552.16,5033300\n12-Jul-07,545.86,547.32,540.22,545.33,3404000\n11-Jul-07,543.61,546.50,540.01,544.47,3267200\n10-Jul-07,543.79,547.00,541.65,543.34,3760000\n9-Jul-07,543.00,548.74,540.26,542.56,3617000\n6-Jul-07,541.25,543.87,538.73,539.40,2705900\n5-Jul-07,535.56,544.40,532.15,541.63,4867300\n3-Jul-07,531.06,534.40,527.50,534.34,1827000\n2-Jul-07,525.49,531.85,524.20,530.38,3362800\n29-Jun-07,526.02,527.40,519.46,522.70,3813400\n28-Jun-07,524.88,529.50,523.80,525.01,3814400\n27-Jun-07,525.00,527.99,519.56,526.29,6023400\n26-Jun-07,532.73,533.20,526.24,530.26,5488700\n25-Jun-07,528.98,534.99,523.38,527.42,7791000\n22-Jun-07,516.42,524.99,516.10,524.98,6768200\n21-Jun-07,510.98,515.29,506.28,514.11,4350100\n20-Jun-07,516.96,518.75,509.06,509.97,4256300\n19-Jun-07,514.01,517.25,511.54,514.31,4263400\n18-Jun-07,506.18,516.00,504.24,515.20,4763800\n15-Jun-07,508.19,509.00,501.23,505.89,5944900\n14-Jun-07,505.38,505.88,501.70,502.84,4523500\n13-Jun-07,507.09,508.54,498.69,505.24,6943300\n12-Jun-07,508.71,511.67,503.17,504.77,6147700\n11-Jun-07,514.02,518.25,510.00,511.34,4539500\n8-Jun-07,516.20,519.64,509.46,515.49,6232600\n7-Jun-07,519.75,526.50,512.51,515.06,10488400\n6-Jun-07,516.75,520.78,515.26,518.25,7690300\n5-Jun-07,509.75,519.00,506.61,518.84,10149600\n4-Jun-07,497.91,510.51,497.59,507.07,7036300\n1-Jun-07,501.00,505.02,497.93,500.40,4657400\n31-May-07,500.56,508.78,497.06,497.91,8599800\n30-May-07,484.50,498.84,483.00,498.60,6862700\n29-May-07,485.00,491.80,484.00,487.11,5147500\n25-May-07,479.70,484.95,477.27,483.52,5246400\n24-May-07,475.15,479.20,471.50,474.33,4117800\n23-May-07,480.82,483.41,473.75,473.97,4842400\n22-May-07,473.00,479.01,473.00,475.86,3770000\n21-May-07,469.53,479.20,466.72,470.60,6065000\n18-May-07,472.03,472.70,469.75,470.32,3297900\n17-May-07,472.46,475.22,470.81,470.96,4570400\n16-May-07,462.00,473.14,459.02,472.61,6296800\n15-May-07,461.96,462.54,457.41,458.00,4063800\n14-May-07,465.48,467.51,460.00,461.78,3014400\n11-May-07,461.83,467.00,461.00,466.74,2793400\n10-May-07,467.04,469.49,461.02,461.47,3654800\n9-May-07,466.15,471.73,463.88,469.25,3867800\n8-May-07,466.13,468.17,464.73,466.81,2869700\n7-May-07,472.14,472.82,466.47,467.27,2994900\n4-May-07,470.12,474.84,465.88,471.12,3769300\n3-May-07,466.22,474.07,465.29,473.23,3528800\n2-May-07,468.65,471.08,465.73,465.78,2981100\n1-May-07,472.19,472.81,464.17,469.00,3571300\n30-Apr-07,479.15,481.35,471.38,471.38,3538700\n27-Apr-07,480.07,482.40,478.33,479.01,2890800\n26-Apr-07,478.10,484.45,477.11,481.18,4010900\n25-Apr-07,480.00,481.37,476.11,477.99,3860800\n24-Apr-07,478.61,479.98,475.55,477.53,3648500\n23-Apr-07,480.10,485.00,478.26,479.08,5440400\n20-Apr-07,490.52,492.50,482.02,482.48,11352600\n19-Apr-07,474.50,481.95,469.59,471.65,7656400\n18-Apr-07,471.26,479.90,469.53,476.01,5495900\n17-Apr-07,473.80,476.39,471.60,472.80,3064500\n16-Apr-07,468.46,476.99,468.15,474.27,4980400\n13-Apr-07,468.45,468.77,463.36,466.29,2652800\n12-Apr-07,464.00,468.00,462.24,467.39,2670000\n11-Apr-07,466.06,469.40,462.61,464.53,3751400\n10-Apr-07,467.09,470.79,465.16,466.50,2946100\n9-Apr-07,472.98,473.00,465.59,468.21,2997000\n5-Apr-07,471.30,472.09,469.62,471.51,2679600\n4-Apr-07,472.14,473.00,469.58,471.02,3703800\n3-Apr-07,464.05,474.25,464.00,472.60,6328700\n2-Apr-07,457.76,458.53,452.12,458.53,3394400\n30-Mar-07,462.10,463.40,456.14,458.16,3264400\n29-Mar-07,464.55,466.00,455.00,460.92,3884400\n28-Mar-07,461.87,465.44,460.15,461.88,4450800\n27-Mar-07,463.55,465.23,460.34,463.62,3201200\n26-Mar-07,460.55,465.00,455.62,465.00,4633100\n23-Mar-07,461.45,463.39,457.08,461.83,4025500\n22-Mar-07,455.61,462.17,452.53,462.04,5528300\n21-Mar-07,445.30,456.57,445.22,456.55,5711000\n20-Mar-07,445.79,447.60,443.60,445.28,3291000\n19-Mar-07,443.25,448.50,440.63,447.23,5049000\n16-Mar-07,445.65,446.70,439.89,440.85,5252200\n15-Mar-07,447.86,449.82,443.94,446.19,3740000\n14-Mar-07,443.23,448.66,439.00,448.00,7882300\n13-Mar-07,450.11,451.93,442.83,443.03,6240700\n12-Mar-07,452.57,455.25,451.11,454.75,3366500\n9-Mar-07,458.00,458.40,450.10,452.96,4812300\n8-Mar-07,459.22,465.50,454.10,454.72,5271300\n7-Mar-07,462.69,463.14,454.29,455.64,6332900\n6-Mar-07,447.47,459.00,447.38,457.55,7311100\n5-Mar-07,437.02,445.50,437.00,440.95,6116300\n2-Mar-07,445.11,448.70,438.68,438.68,6527600\n1-Mar-07,442.67,452.42,440.00,448.23,8536200\n28-Feb-07,450.41,453.67,443.04,449.45,7884600\n27-Feb-07,455.00,459.80,447.17,448.77,9134700\n26-Feb-07,472.83,475.25,463.75,464.93,3911300\n23-Feb-07,475.75,476.95,467.80,470.62,3838200\n22-Feb-07,478.69,484.24,474.39,475.85,5668500\n21-Feb-07,469.84,478.68,467.74,475.86,5581000\n20-Feb-07,468.47,472.75,464.71,472.10,3978200\n16-Feb-07,462.80,470.15,462.06,469.94,5987000\n15-Feb-07,466.00,466.13,460.72,461.47,3996300\n14-Feb-07,460.00,469.13,459.22,465.93,5547300\n13-Feb-07,459.16,462.78,457.26,459.10,4008400\n12-Feb-07,460.68,462.39,455.02,458.29,5706700\n9-Feb-07,471.65,472.68,461.50,461.89,4825300\n8-Feb-07,468.05,473.75,465.15,471.03,4037100\n7-Feb-07,473.82,474.35,468.78,470.01,3781100\n6-Feb-07,468.10,473.30,467.26,471.48,5231700\n5-Feb-07,477.50,478.00,466.19,467.16,7117800\n2-Feb-07,482.61,485.00,477.81,481.50,6195000\n1-Feb-07,506.00,506.01,481.53,481.75,14373800\n31-Jan-07,496.49,505.00,495.51,501.50,8642900\n30-Jan-07,494.00,498.00,491.22,494.32,4112000\n29-Jan-07,498.00,498.75,490.50,492.47,4679300\n26-Jan-07,490.93,497.90,487.03,495.84,5415600\n25-Jan-07,501.00,504.50,485.66,488.09,6253100\n24-Jan-07,484.45,499.54,483.29,499.07,5862000\n23-Jan-07,480.79,484.75,477.29,479.05,4539600\n22-Jan-07,492.50,492.65,478.50,480.84,5305200\n19-Jan-07,487.98,490.76,486.74,489.75,4809500\n18-Jan-07,494.52,496.48,487.43,487.83,5858800\n17-Jan-07,503.40,507.77,494.38,497.28,6574900\n16-Jan-07,507.55,513.00,503.30,504.28,7446800\n12-Jan-07,501.99,505.00,500.00,505.00,4333000\n11-Jan-07,497.20,501.75,496.18,499.72,7001500\n10-Jan-07,484.43,493.55,482.04,489.46,5857600\n9-Jan-07,485.45,488.25,481.20,485.50,5339800\n8-Jan-07,487.69,489.87,482.20,483.58,4686900\n5-Jan-07,482.50,487.50,478.11,487.19,6769400\n4-Jan-07,469.00,483.95,468.35,483.26,7787700\n3-Jan-07,466.00,476.66,461.11,467.59,7527500\n29-Dec-06,462.10,464.47,459.86,460.48,2507700\n28-Dec-06,467.12,468.58,462.25,462.56,3063100\n27-Dec-06,460.00,468.08,459.10,468.03,4123500\n26-Dec-06,456.52,459.47,454.59,457.53,2024900\n22-Dec-06,457.50,458.64,452.73,455.58,3941900\n21-Dec-06,464.18,465.25,452.34,456.20,6864800\n20-Dec-06,470.00,471.50,462.33,462.90,4189500\n19-Dec-06,461.72,469.31,458.50,468.63,6428300\n18-Dec-06,482.51,482.74,460.72,462.80,7820000\n15-Dec-06,482.64,484.11,479.84,480.30,4244900\n14-Dec-06,480.25,483.75,477.26,482.12,4638000\n13-Dec-06,484.69,485.50,477.02,478.99,4591400\n12-Dec-06,483.85,486.36,480.28,481.78,4169900\n11-Dec-06,484.92,488.90,483.80,483.93,3215200\n8-Dec-06,481.94,488.60,480.00,484.11,3889900\n7-Dec-06,490.23,491.80,482.42,482.64,4597500\n6-Dec-06,486.96,492.40,484.52,488.71,4390200\n5-Dec-06,487.40,489.44,484.89,487.00,4020300\n4-Dec-06,483.00,487.43,479.35,484.85,4822600\n1-Dec-06,485.98,488.39,478.50,480.80,5545900\n30-Nov-06,484.19,490.40,481.55,484.81,5493900\n29-Nov-06,494.24,494.74,482.25,484.65,6157200\n28-Nov-06,481.13,489.86,477.03,489.50,7654400\n27-Nov-06,501.37,501.78,484.75,484.75,7194200\n24-Nov-06,504.50,507.50,504.00,505.00,1657700\n22-Nov-06,510.97,513.00,505.78,508.01,4381300\n21-Nov-06,496.54,510.00,495.83,509.65,8317200\n20-Nov-06,498.40,498.40,492.65,495.05,5002600\n17-Nov-06,493.25,499.66,493.00,498.79,5237900\n16-Nov-06,495.00,497.68,492.56,495.90,4893900\n15-Nov-06,493.43,499.85,491.93,491.93,8056600\n14-Nov-06,480.70,489.95,480.50,489.30,7053200\n13-Nov-06,474.90,481.17,474.14,481.03,4293600\n10-Nov-06,473.78,474.72,470.29,473.55,2742300\n9-Nov-06,476.50,479.49,471.86,472.63,4811700\n8-Nov-06,470.35,481.74,468.60,475.00,7872700\n7-Nov-06,476.96,479.02,471.77,472.57,4833900\n6-Nov-06,473.77,479.66,472.33,476.95,4934600\n3-Nov-06,472.23,473.75,465.06,471.80,4844200\n2-Nov-06,467.50,473.73,466.38,469.91,5040900\n1-Nov-06,478.76,479.13,465.26,467.50,5318200\n31-Oct-06,478.06,482.16,473.84,476.39,6197200\n30-Oct-06,474.82,480.46,470.01,476.57,6484600\n27-Oct-06,483.90,485.24,472.49,475.20,6495900\n26-Oct-06,487.68,491.96,484.20,485.10,6894000\n25-Oct-06,477.49,488.50,475.11,486.60,8973900\n24-Oct-06,476.28,477.86,471.41,473.31,8349200\n23-Oct-06,462.28,484.64,460.37,480.78,14367700\n20-Oct-06,458.99,460.10,453.59,459.67,10872800\n19-Oct-06,420.23,454.91,419.57,426.06,7594600\n18-Oct-06,423.00,424.75,417.50,419.31,5880800\n17-Oct-06,420.30,423.75,416.70,420.64,4763600\n16-Oct-06,427.70,429.20,421.34,421.75,4271100\n13-Oct-06,427.76,429.50,425.56,427.30,3594100\n12-Oct-06,428.56,429.68,424.00,427.44,4801800\n11-Oct-06,425.02,429.91,423.76,426.50,5586000\n10-Oct-06,431.56,437.85,422.39,426.65,9524400\n9-Oct-06,424.80,431.95,423.42,429.00,7013200\n6-Oct-06,410.22,421.91,409.75,420.50,7271300\n5-Oct-06,414.70,418.24,410.86,411.81,5533400\n4-Oct-06,404.97,415.77,403.05,415.70,6493200\n3-Oct-06,401.29,406.46,398.19,404.04,5432700\n2-Oct-06,401.90,406.00,400.80,401.44,3629800\n29-Sep-06,405.12,405.62,401.41,401.90,3275600\n28-Sep-06,404.08,406.98,400.54,403.58,5061400\n27-Sep-06,406.30,411.22,402.37,402.92,5805700\n26-Sep-06,405.50,407.68,401.77,406.87,5250300\n25-Sep-06,405.58,409.45,402.50,403.98,5588200\n22-Sep-06,404.98,407.45,401.36,403.78,4638400\n21-Sep-06,400.35,408.45,399.86,406.85,10653500\n20-Sep-06,407.10,407.39,394.62,397.00,9086800\n19-Sep-06,415.46,415.49,392.74,403.81,14181600\n18-Sep-06,409.78,418.69,409.47,414.69,7076700\n15-Sep-06,407.48,410.05,406.74,409.88,7488000\n14-Sep-06,404.30,406.28,401.93,403.98,5337400\n13-Sep-06,395.15,406.76,395.10,406.57,9644400\n12-Sep-06,385.00,392.73,384.88,391.90,5427400\n11-Sep-06,378.26,384.69,377.77,384.09,4500000\n8-Sep-06,376.72,380.79,376.72,377.85,3066000\n7-Sep-06,379.39,381.75,377.40,378.49,3719600\n6-Sep-06,382.10,383.19,379.66,380.14,3712600\n5-Sep-06,379.87,385.40,377.44,384.36,4062400\n1-Sep-06,381.00,381.28,377.19,378.60,2660000\n31-Aug-06,381.49,382.15,378.20,378.53,2916400\n30-Aug-06,379.21,384.65,378.51,380.75,4069100\n29-Aug-06,380.78,382.32,377.20,378.95,4007800\n28-Aug-06,375.61,380.95,375.00,380.95,4151800\n25-Aug-06,373.08,375.32,372.50,373.26,2461300\n24-Aug-06,374.44,376.40,372.26,373.73,3466200\n23-Aug-06,377.64,378.27,372.66,373.43,3611300\n22-Aug-06,377.73,379.26,374.84,378.29,4144500\n21-Aug-06,378.10,379.00,375.22,377.30,4000900\n18-Aug-06,386.31,387.09,380.75,383.36,4911000\n17-Aug-06,386.99,390.00,383.92,385.80,5060200\n16-Aug-06,383.48,388.45,382.12,387.72,5814600\n15-Aug-06,374.11,381.67,372.60,380.97,6607100\n14-Aug-06,371.50,375.13,368.67,369.43,4946400\n11-Aug-06,374.40,375.28,368.00,368.50,3744300\n10-Aug-06,374.36,377.67,372.46,374.20,4247000\n9-Aug-06,383.71,384.68,376.36,376.94,4249100\n8-Aug-06,382.82,384.50,379.09,381.00,5690900\n7-Aug-06,371.50,379.73,371.15,377.95,3789100\n4-Aug-06,379.56,380.68,371.75,373.85,5080700\n3-Aug-06,364.98,377.91,363.36,375.39,6303500\n2-Aug-06,375.60,377.17,365.20,367.23,7008100\n1-Aug-06,385.11,385.77,375.51,375.51,5397400\n31-Jul-06,388.00,389.17,383.31,386.60,4477200\n28-Jul-06,382.00,389.56,381.73,388.12,4075700\n27-Jul-06,387.37,387.49,377.95,382.40,5617900\n26-Jul-06,388.20,391.91,383.00,385.50,5401700\n25-Jul-06,385.02,391.31,383.80,389.36,5722200\n24-Jul-06,392.82,393.89,381.21,390.90,7857100\n21-Jul-06,386.14,391.75,377.69,390.11,11524300\n20-Jul-06,404.28,404.44,385.66,387.12,9075200\n19-Jul-06,395.01,401.14,394.66,399.00,8180600\n18-Jul-06,409.75,410.57,397.74,403.05,7373500\n17-Jul-06,404.62,411.00,403.72,407.89,5798600\n14-Jul-06,410.33,411.49,398.61,403.50,7430500\n13-Jul-06,414.00,418.34,406.83,408.83,6894400\n12-Jul-06,422.09,422.74,416.73,417.25,4867700\n"
  },
  {
    "path": "examples/stockserver/HP.csv",
    "content": "﻿Date,Open,High,Low,Close,Volume\n9-Jul-12,19.53,19.58,19.25,19.43,12427811\n6-Jul-12,19.95,20.14,19.45,19.57,16535131\n5-Jul-12,20.27,20.42,20.13,20.28,10525961\n3-Jul-12,19.92,20.37,19.88,20.36,7340675\n2-Jul-12,20.11,20.24,19.87,20.16,14849233\n29-Jun-12,19.85,20.15,19.76,20.11,18848345\n28-Jun-12,19.33,19.40,19.12,19.36,15942276\n27-Jun-12,19.36,19.60,19.33,19.51,11518056\n26-Jun-12,19.55,19.69,19.24,19.36,21255152\n25-Jun-12,20.18,20.27,19.47,19.54,22615775\n22-Jun-12,20.38,20.72,20.28,20.37,16099180\n21-Jun-12,21.08,21.15,20.22,20.30,19642828\n20-Jun-12,20.85,21.22,20.65,21.16,17342431\n19-Jun-12,21.17,21.21,20.75,20.81,21721159\n18-Jun-12,21.50,21.61,20.97,21.05,21350416\n15-Jun-12,21.73,21.99,21.57,21.64,17449781\n14-Jun-12,21.48,21.74,21.39,21.59,10875090\n13-Jun-12,21.51,21.71,21.34,21.48,11557072\n12-Jun-12,21.47,21.80,21.39,21.70,11203800\n11-Jun-12,22.36,22.43,21.38,21.41,14401504\n8-Jun-12,22.12,22.35,21.94,22.31,11429187\n7-Jun-12,22.50,22.75,22.01,22.06,14333402\n6-Jun-12,21.70,22.36,21.69,22.35,14728043\n5-Jun-12,21.10,21.75,21.06,21.68,20204258\n4-Jun-12,21.29,21.42,20.87,21.06,18208090\n1-Jun-12,21.87,22.00,21.20,21.25,31344218\n31-May-12,22.81,22.88,22.34,22.68,21902523\n30-May-12,22.56,22.80,22.45,22.74,20886937\n29-May-12,22.38,22.87,22.38,22.80,22777829\n25-May-12,21.47,22.36,21.40,22.33,23610857\n24-May-12,22.62,22.66,21.32,21.77,58995690\n23-May-12,21.15,21.20,20.57,21.08,53778833\n22-May-12,21.89,21.91,21.54,21.78,15810063\n21-May-12,21.42,21.97,21.40,21.89,16143943\n18-May-12,22.11,22.18,21.28,21.46,25561265\n17-May-12,22.03,22.27,21.82,22.06,16733311\n16-May-12,22.46,22.75,22.01,22.03,16263363\n15-May-12,22.97,23.05,22.37,22.40,16066918\n14-May-12,23.00,23.18,22.80,22.96,16821897\n11-May-12,23.34,23.50,23.13,23.15,16302238\n10-May-12,23.29,23.61,23.10,23.51,16117447\n9-May-12,23.10,23.53,22.92,23.33,14037929\n8-May-12,23.64,23.69,23.00,23.32,24605393\n7-May-12,24.19,24.23,23.79,23.87,13193453\n4-May-12,24.38,24.59,24.20,24.27,14031655\n3-May-12,25.25,25.33,24.45,24.48,14760996\n2-May-12,25.06,25.26,24.87,25.25,13610632\n1-May-12,24.73,25.40,24.73,25.17,15578580\n30-Apr-12,24.66,24.80,24.53,24.76,9249897\n27-Apr-12,24.90,24.99,24.66,24.75,8861104\n26-Apr-12,24.75,24.97,24.69,24.87,9861599\n25-Apr-12,24.62,24.85,24.40,24.83,17869434\n24-Apr-12,24.29,24.52,24.22,24.44,11966652\n23-Apr-12,24.26,24.47,24.06,24.27,16796135\n20-Apr-12,24.77,24.94,24.45,24.51,19645838\n19-Apr-12,24.86,25.15,24.48,24.71,18077856\n18-Apr-12,24.56,25.08,24.52,24.93,18103007\n17-Apr-12,24.40,25.07,24.36,24.72,15919506\n16-Apr-12,24.78,24.82,24.17,24.31,15134222\n13-Apr-12,24.93,25.05,24.33,24.57,24483292\n12-Apr-12,23.99,25.14,23.96,25.10,43412474\n11-Apr-12,23.51,23.58,23.24,23.41,16611294\n10-Apr-12,23.17,23.61,23.10,23.27,25849768\n9-Apr-12,22.89,23.32,22.85,23.14,15265197\n5-Apr-12,23.15,23.37,23.08,23.11,14733179\n4-Apr-12,23.22,23.38,23.15,23.27,15361671\n3-Apr-12,23.83,24.06,23.35,23.45,15854594\n2-Apr-12,23.88,23.99,23.69,23.88,13918384\n30-Mar-12,23.63,23.92,23.55,23.83,16903949\n29-Mar-12,23.41,23.61,23.37,23.51,17345263\n28-Mar-12,23.70,23.81,23.45,23.58,20502103\n27-Mar-12,23.96,23.97,23.62,23.62,18366751\n26-Mar-12,23.86,23.93,23.55,23.89,23853049\n23-Mar-12,23.09,23.64,22.92,23.63,20691793\n22-Mar-12,23.16,23.28,22.91,23.03,34291853\n21-Mar-12,24.10,24.14,23.36,23.46,45513231\n20-Mar-12,24.36,24.37,23.97,23.98,24145936\n19-Mar-12,24.53,24.60,24.31,24.34,11763930\n16-Mar-12,24.26,24.55,24.21,24.49,20823721\n15-Mar-12,24.12,24.59,24.08,24.40,20441953\n14-Mar-12,24.27,24.54,24.18,24.34,21666133\n13-Mar-12,24.07,24.64,23.91,24.57,23335954\n12-Mar-12,23.97,24.29,23.95,24.04,16613858\n9-Mar-12,24.59,24.67,24.04,24.18,23427549\n8-Mar-12,24.44,24.74,24.34,24.64,13984563\n7-Mar-12,24.23,24.52,24.19,24.36,16433662\n6-Mar-12,24.58,24.79,24.02,24.17,32284685\n5-Mar-12,25.18,25.23,24.72,25.01,24717217\n2-Mar-12,25.25,25.57,25.17,25.32,22613893\n1-Mar-12,25.35,25.65,25.19,25.25,25214079\n29-Feb-12,26.23,26.25,25.28,25.31,38840885\n28-Feb-12,26.19,26.38,26.01,26.18,23096513\n27-Feb-12,26.32,26.61,26.11,26.25,28237147\n24-Feb-12,27.00,27.09,26.57,26.64,27874901\n23-Feb-12,27.60,27.87,26.85,27.05,71378856\n22-Feb-12,29.15,29.22,28.78,28.94,28629782\n21-Feb-12,29.52,29.72,29.17,29.35,14343381\n17-Feb-12,29.95,30.00,29.53,29.59,18530951\n16-Feb-12,28.94,29.98,28.93,29.88,20625644\n15-Feb-12,29.46,29.55,28.96,29.12,15741753\n14-Feb-12,28.70,29.08,28.63,29.08,10977712\n13-Feb-12,28.87,29.00,28.42,28.75,9160625\n10-Feb-12,28.90,28.99,28.49,28.70,10024459\n9-Feb-12,29.38,29.49,29.03,29.11,16034276\n8-Feb-12,28.97,29.56,28.89,29.46,13190540\n7-Feb-12,28.73,29.17,28.59,28.95,14586158\n6-Feb-12,28.98,29.11,28.74,28.76,12803961\n3-Feb-12,28.88,29.21,28.80,29.07,11630340\n2-Feb-12,28.72,28.85,28.38,28.50,12708698\n1-Feb-12,28.23,28.91,28.17,28.76,14960991\n31-Jan-12,28.19,28.23,27.47,27.98,13751595\n30-Jan-12,27.26,28.04,27.23,27.88,12122371\n27-Jan-12,27.66,28.08,27.60,27.88,11903378\n26-Jan-12,28.21,28.47,27.85,27.99,11408234\n25-Jan-12,28.41,28.54,28.04,28.32,13320370\n24-Jan-12,28.23,28.84,28.20,28.52,14887610\n23-Jan-12,27.94,28.88,27.94,28.68,22237220\n20-Jan-12,27.12,28.18,27.05,28.13,22492008\n19-Jan-12,27.02,27.25,26.88,27.15,11182870\n18-Jan-12,26.40,27.00,26.40,27.00,11468311\n17-Jan-12,26.74,26.88,26.40,26.46,11196319\n13-Jan-12,26.49,26.49,26.49,26.49,0\n12-Jan-12,26.73,26.99,26.65,26.95,10433800\n11-Jan-12,26.50,26.67,26.33,26.64,13599980\n10-Jan-12,26.69,26.90,26.58,26.69,12600341\n9-Jan-12,26.39,26.61,26.33,26.44,11058397\n6-Jan-12,26.57,26.61,26.30,26.40,11705636\n5-Jan-12,26.32,26.59,26.25,26.50,13847358\n4-Jan-12,26.52,26.80,26.44,26.60,11116328\n3-Jan-12,26.32,26.83,26.32,26.62,13391325\n30-Dec-11,25.76,25.76,25.76,25.76,0\n29-Dec-11,25.13,25.67,25.13,25.62,9160694\n28-Dec-11,25.54,25.73,25.14,25.20,10469037\n27-Dec-11,25.67,25.98,25.62,25.65,11949804\n23-Dec-11,25.88,25.88,25.88,25.88,0\n22-Dec-11,25.53,25.99,25.44,25.86,12945676\n21-Dec-11,25.76,25.88,25.04,25.44,19700673\n20-Dec-11,25.53,26.17,25.53,25.91,14771702\n19-Dec-11,25.95,26.08,25.02,25.13,16845672\n16-Dec-11,26.34,26.67,25.83,25.84,33111365\n15-Dec-11,26.64,26.70,26.12,26.16,17911286\n14-Dec-11,26.63,26.76,25.95,26.38,22320278\n13-Dec-11,27.41,27.85,26.65,26.80,18241770\n12-Dec-11,27.07,27.46,27.07,27.34,19599240\n9-Dec-11,27.61,28.43,27.52,27.90,19312726\n8-Dec-11,28.17,28.67,27.56,27.66,21688006\n7-Dec-11,27.87,28.58,27.68,28.41,17918952\n6-Dec-11,27.74,28.44,27.71,28.18,17255016\n5-Dec-11,27.98,28.40,27.87,28.12,18506520\n2-Dec-11,28.49,28.50,27.62,27.68,20454475\n1-Dec-11,27.44,28.44,27.44,28.22,22169050\n30-Nov-11,27.44,28.15,27.44,27.95,36176803\n29-Nov-11,27.01,27.50,26.61,26.90,27206436\n28-Nov-11,25.99,26.62,25.62,26.53,19858527\n25-Nov-11,25.60,25.86,25.37,25.39,9018980\n23-Nov-11,25.78,25.78,25.78,25.78,0\n22-Nov-11,26.26,27.75,25.25,26.65,49900337\n21-Nov-11,27.04,27.39,26.28,26.86,34503774\n18-Nov-11,27.78,28.40,27.64,27.99,29280202\n17-Nov-11,27.84,27.87,26.82,27.29,18327197\n16-Nov-11,28.09,28.59,27.64,27.93,20176758\n15-Nov-11,27.19,28.42,27.10,28.24,20089336\n14-Nov-11,27.56,27.70,27.10,27.32,11363772\n11-Nov-11,27.23,27.79,27.15,27.58,13163867\n10-Nov-11,26.54,26.92,26.31,26.76,15048985\n9-Nov-11,27.17,27.21,26.25,26.33,18654569\n8-Nov-11,28.11,28.11,27.40,27.84,17413287\n7-Nov-11,27.05,27.90,26.83,27.88,17891128\n4-Nov-11,26.70,26.98,26.34,26.97,12635182\n3-Nov-11,26.20,26.98,25.84,26.84,16111309\n2-Nov-11,25.93,26.36,25.79,25.91,16355246\n1-Nov-11,25.90,26.07,25.35,25.64,19230971\n31-Oct-11,27.40,27.56,26.61,26.61,16621435\n28-Oct-11,27.72,28.57,27.56,27.94,27476534\n27-Oct-11,26.48,27.44,26.43,27.09,26263096\n26-Oct-11,25.12,25.88,24.84,25.75,20334323\n25-Oct-11,25.92,25.94,25.00,25.05,15099605\n24-Oct-11,25.60,26.16,25.47,26.02,12633868\n21-Oct-11,25.05,25.58,24.98,25.38,14973375\n20-Oct-11,24.89,25.02,24.25,24.74,18703720\n19-Oct-11,25.36,25.50,24.84,24.98,13776780\n18-Oct-11,24.73,25.81,24.55,25.61,20584930\n17-Oct-11,25.84,25.94,24.70,24.86,16739325\n14-Oct-11,26.02,26.34,25.91,26.11,11979869\n13-Oct-11,25.92,25.95,25.14,25.63,15492820\n12-Oct-11,26.12,26.29,25.67,25.87,20651473\n11-Oct-11,25.59,26.03,25.48,25.92,17651482\n10-Oct-11,25.33,25.98,25.29,25.74,21722125\n7-Oct-11,25.10,25.63,24.54,24.88,30192258\n6-Oct-11,24.14,25.06,23.87,25.05,28482210\n5-Oct-11,22.98,24.13,22.85,23.86,31037914\n4-Oct-11,21.93,23.07,21.84,23.02,30969210\n3-Oct-11,22.68,23.22,22.18,22.20,28506500\n30-Sep-11,23.57,23.75,22.42,22.45,40146916\n29-Sep-11,23.81,24.46,23.34,23.78,26828558\n28-Sep-11,23.94,23.98,23.11,23.19,23822183\n27-Sep-11,23.36,24.50,23.20,23.59,39530129\n26-Sep-11,22.59,23.07,22.43,22.71,31930566\n23-Sep-11,22.52,22.62,19.92,22.32,68905479\n22-Sep-11,23.05,23.71,22.26,22.80,64315651\n21-Sep-11,22.58,25.10,22.21,23.98,88388616\n20-Sep-11,22.87,23.08,22.44,22.47,25847555\n19-Sep-11,23.10,23.21,22.62,22.91,16879325\n16-Sep-11,23.41,23.59,23.15,23.53,23419456\n15-Sep-11,23.22,23.34,22.73,23.27,15821193\n14-Sep-11,22.69,23.13,22.38,22.93,22527643\n13-Sep-11,22.63,22.78,22.43,22.70,24348169\n12-Sep-11,22.13,22.65,22.13,22.58,28234453\n9-Sep-11,23.55,23.66,22.50,22.65,36902755\n8-Sep-11,24.35,24.67,23.85,23.87,21517617\n7-Sep-11,23.97,24.32,23.70,24.14,20451389\n6-Sep-11,23.28,23.68,22.90,23.63,28162457\n2-Sep-11,25.05,25.10,24.32,24.34,18738765\n1-Sep-11,26.20,26.46,25.66,25.67,16366658\n31-Aug-11,26.27,26.41,25.94,26.03,22640422\n30-Aug-11,25.98,26.19,25.72,26.05,23413098\n29-Aug-11,24.95,26.15,24.90,26.12,23076159\n26-Aug-11,24.62,25.33,24.42,24.82,22842458\n25-Aug-11,25.14,25.25,24.48,25.03,25557283\n24-Aug-11,24.54,25.30,24.25,25.21,28907424\n23-Aug-11,24.53,24.73,24.05,24.54,34149274\n22-Aug-11,24.16,25.23,24.13,24.45,61133990\n19-Aug-11,23.60,24.01,22.75,23.60,128945447\n18-Aug-11,29.86,34.00,28.64,29.51,96009410\n17-Aug-11,31.98,32.20,30.97,31.39,24472142\n16-Aug-11,31.93,32.98,31.90,32.61,18159198\n15-Aug-11,32.35,32.77,32.23,32.43,17292432\n12-Aug-11,31.86,32.36,31.56,32.32,23720550\n11-Aug-11,29.75,31.43,29.75,31.05,26863479\n10-Aug-11,30.90,31.02,29.78,29.86,27708911\n9-Aug-11,30.98,31.55,29.75,31.53,32971054\n8-Aug-11,31.13,31.90,30.73,30.81,33823970\n5-Aug-11,32.83,32.99,31.52,32.63,31567099\n4-Aug-11,33.73,33.74,32.50,32.54,25202339\n3-Aug-11,34.30,34.51,33.72,34.28,21103128\n2-Aug-11,34.84,35.11,34.34,34.35,16070322\n1-Aug-11,35.40,35.50,34.67,35.20,15745359\n29-Jul-11,35.80,35.88,35.10,35.17,20456759\n28-Jul-11,36.67,36.88,36.12,36.23,14704665\n27-Jul-11,36.93,37.21,36.45,36.80,18945760\n26-Jul-11,37.09,37.70,37.04,37.47,14617910\n25-Jul-11,36.27,37.40,36.22,37.09,19147579\n22-Jul-11,36.42,37.12,36.36,36.70,16045861\n21-Jul-11,35.34,36.37,34.92,36.23,18119660\n20-Jul-11,35.78,35.82,35.11,35.28,15009028\n19-Jul-11,35.24,35.71,34.93,35.61,15971047\n18-Jul-11,34.98,35.10,34.80,35.02,15329464\n15-Jul-11,35.28,35.39,34.97,35.09,15167109\n14-Jul-11,35.54,35.69,35.01,35.13,15441720\n13-Jul-11,35.40,35.80,35.30,35.44,11064935\n12-Jul-11,35.16,35.71,35.10,35.27,15174099\n11-Jul-11,36.00,36.00,35.17,35.29,18265379\n8-Jul-11,36.13,36.44,35.80,36.43,15076357\n7-Jul-11,36.47,36.59,36.33,36.45,16039674\n6-Jul-11,36.46,36.59,36.10,36.20,16403450\n5-Jul-11,36.78,37.00,36.27,36.47,16386995\n1-Jul-11,37.05,37.05,37.05,37.05,0\n30-Jun-11,36.30,37.24,36.23,36.40,27377820\n29-Jun-11,35.17,35.60,35.09,35.55,13512863\n28-Jun-11,35.07,35.20,34.96,35.09,14237592\n27-Jun-11,35.05,35.35,34.91,34.98,15242656\n24-Jun-11,35.18,35.21,34.88,34.90,36850510\n23-Jun-11,34.82,35.29,34.55,35.23,19499100\n22-Jun-11,35.32,35.50,35.11,35.12,12834494\n21-Jun-11,35.13,35.65,35.03,35.30,16958726\n20-Jun-11,34.79,35.32,34.79,34.99,16631612\n17-Jun-11,35.22,35.32,34.94,35.00,39362235\n16-Jun-11,34.09,35.11,34.06,34.97,28169352\n15-Jun-11,34.53,34.56,33.95,34.26,24950993\n14-Jun-11,34.85,35.28,34.64,34.73,20123539\n13-Jun-11,35.13,35.18,34.60,34.65,21740193\n10-Jun-11,35.51,35.53,35.14,35.25,14320633\n9-Jun-11,35.51,35.73,35.36,35.46,11590822\n8-Jun-11,35.23,35.75,35.20,35.36,16012405\n7-Jun-11,36.13,36.15,35.57,35.57,16969539\n6-Jun-11,35.99,36.24,35.91,35.96,15407616\n3-Jun-11,36.05,36.38,36.00,36.11,15964876\n2-Jun-11,36.58,36.66,36.31,36.42,16660259\n1-Jun-11,37.20,37.31,36.50,36.63,19318017\n31-May-11,37.28,37.52,37.18,37.38,27370407\n27-May-11,36.96,36.96,36.96,36.96,0\n26-May-11,35.99,36.74,35.96,36.55,27188559\n25-May-11,35.68,36.15,35.68,36.01,25483687\n24-May-11,35.62,36.16,35.58,35.98,27331910\n23-May-11,35.58,36.00,35.44,35.81,26503560\n20-May-11,36.01,36.35,35.91,35.98,23010065\n19-May-11,36.43,36.67,36.00,36.13,31177222\n18-May-11,36.63,36.64,35.99,36.49,44644963\n17-May-11,37.57,37.66,36.04,36.91,100359683\n16-May-11,40.20,40.34,39.66,39.80,18332022\n13-May-11,40.80,40.86,40.22,40.41,14071606\n12-May-11,40.88,41.18,40.71,40.88,14171576\n11-May-11,41.48,41.56,40.76,41.06,16932494\n10-May-11,41.08,41.74,41.00,41.57,9014218\n9-May-11,40.79,41.36,40.75,41.02,9308865\n6-May-11,41.05,41.52,40.68,40.81,12841465\n5-May-11,40.65,41.33,40.61,40.80,12879615\n4-May-11,40.38,41.12,40.21,40.94,15381565\n3-May-11,39.86,40.38,39.80,40.33,14878045\n2-May-11,40.69,40.78,39.97,40.08,14269008\n29-Apr-11,40.64,40.66,39.99,40.37,14448133\n28-Apr-11,41.22,41.30,40.38,40.53,19633874\n27-Apr-11,40.84,41.19,40.71,41.04,13110051\n26-Apr-11,40.42,40.96,40.06,40.69,21243146\n25-Apr-11,41.06,41.17,40.44,40.53,13927333\n21-Apr-11,40.99,40.99,40.99,40.99,0\n20-Apr-11,40.66,41.19,40.65,40.89,14196187\n19-Apr-11,39.83,40.05,39.35,39.99,13508179\n18-Apr-11,39.96,40.04,39.16,39.75,18540167\n15-Apr-11,40.38,40.67,40.20,40.26,14691560\n14-Apr-11,40.50,40.73,40.12,40.36,16919385\n13-Apr-11,41.01,41.55,40.85,41.13,12715814\n12-Apr-11,40.68,41.18,40.53,41.08,13185358\n11-Apr-11,40.71,41.28,40.66,41.05,12809410\n8-Apr-11,41.00,41.04,40.52,40.70,13267874\n7-Apr-11,41.35,41.80,41.06,41.08,16702857\n6-Apr-11,40.38,41.35,40.33,41.18,19694308\n5-Apr-11,40.37,40.78,40.21,40.29,16155460\n4-Apr-11,40.65,40.88,40.20,40.34,21852437\n1-Apr-11,41.08,41.08,40.50,40.98,19217637\n31-Mar-11,41.31,41.48,40.96,40.97,15975164\n30-Mar-11,41.18,41.48,40.80,41.30,17369268\n29-Mar-11,41.87,42.01,37.60,41.11,26131737\n28-Mar-11,42.42,42.83,42.11,42.14,11376169\n25-Mar-11,42.84,43.28,42.33,42.53,15530861\n24-Mar-11,42.31,43.14,42.26,43.10,18581313\n23-Mar-11,41.54,42.28,41.51,42.07,15194270\n22-Mar-11,41.73,41.84,41.35,41.74,14356113\n21-Mar-11,41.85,42.10,41.65,41.76,14426801\n18-Mar-11,41.93,42.13,41.28,41.32,28941233\n17-Mar-11,40.73,41.83,40.72,41.43,26618142\n16-Mar-11,40.81,41.32,40.10,40.14,25800461\n15-Mar-11,40.62,41.19,40.34,40.93,22244879\n14-Mar-11,41.31,42.15,41.28,41.49,17447053\n11-Mar-11,41.42,41.87,41.36,41.73,16484199\n10-Mar-11,41.75,41.90,41.26,41.48,19910761\n9-Mar-11,42.40,42.40,41.76,42.05,15270720\n8-Mar-11,42.21,42.71,41.95,42.40,15675677\n7-Mar-11,42.90,43.05,41.94,41.98,17799437\n4-Mar-11,43.26,43.45,42.06,42.61,27721502\n3-Mar-11,43.66,43.86,43.12,43.20,21081735\n2-Mar-11,42.85,43.52,42.78,43.24,14628033\n1-Mar-11,43.64,43.84,42.84,42.91,19570742\n28-Feb-11,43.06,43.83,42.95,43.63,27700323\n25-Feb-11,42.42,42.80,42.30,42.68,26784926\n24-Feb-11,43.16,43.25,42.08,42.17,56825397\n23-Feb-11,43.68,43.72,42.57,43.59,96705509\n22-Feb-11,47.57,48.55,47.27,48.23,30831656\n18-Feb-11,48.67,48.67,48.67,48.67,0\n17-Feb-11,48.67,48.79,48.27,48.62,9831136\n16-Feb-11,48.49,49.12,48.36,48.99,15005830\n15-Feb-11,47.62,48.18,47.54,47.99,12573143\n14-Feb-11,48.45,48.68,48.06,48.31,11991641\n11-Feb-11,48.39,48.81,48.24,48.64,14349064\n10-Feb-11,48.46,49.39,48.15,48.54,23146947\n9-Feb-11,48.06,48.94,47.99,48.94,19301463\n8-Feb-11,48.09,48.24,47.76,48.14,9900080\n7-Feb-11,47.71,48.42,47.61,48.14,17392382\n4-Feb-11,47.28,47.52,47.08,47.43,11214027\n3-Feb-11,46.77,47.48,46.46,47.32,15619054\n2-Feb-11,46.45,47.05,46.43,46.89,11741595\n1-Feb-11,46.08,46.60,45.90,46.52,14490651\n31-Jan-11,45.41,45.72,45.13,45.69,21410297\n28-Jan-11,46.66,46.69,45.36,45.51,20649618\n27-Jan-11,46.98,46.98,46.58,46.74,14394086\n26-Jan-11,46.96,47.28,46.57,46.88,14404159\n25-Jan-11,47.76,47.83,46.88,47.08,17668031\n24-Jan-11,46.69,47.59,46.66,47.55,16950456\n21-Jan-11,46.95,47.64,46.83,47.23,29811382\n20-Jan-11,46.08,46.79,45.76,46.78,21533171\n19-Jan-11,46.23,46.48,46.08,46.32,16520558\n18-Jan-11,46.14,46.42,46.08,46.34,14758342\n14-Jan-11,46.25,46.25,46.25,46.25,0\n13-Jan-11,45.47,45.84,45.31,45.65,13119541\n12-Jan-11,45.49,45.71,45.27,45.64,14379933\n11-Jan-11,45.22,46.06,45.20,45.43,24987585\n10-Jan-11,44.86,45.05,44.57,44.86,12977152\n7-Jan-11,44.71,45.39,44.71,45.09,22271113\n6-Jan-11,44.22,44.96,44.18,44.88,19205886\n5-Jan-11,43.53,44.22,43.40,44.20,19749810\n4-Jan-11,43.27,43.77,43.01,43.63,19420376\n3-Jan-11,42.22,43.49,42.22,42.74,19373539\n31-Dec-10,42.19,42.38,41.84,42.10,7473404\n30-Dec-10,42.37,42.46,42.16,42.26,6774221\n29-Dec-10,42.29,42.62,42.25,42.32,8650420\n28-Dec-10,41.99,42.49,41.94,42.25,10405323\n27-Dec-10,41.49,41.98,41.47,41.82,6554035\n23-Dec-10,41.74,41.74,41.74,41.74,0\n22-Dec-10,41.72,41.82,41.40,41.48,14702190\n21-Dec-10,41.76,42.10,41.74,41.91,15003308\n20-Dec-10,41.73,42.10,41.72,41.89,15423663\n17-Dec-10,41.95,42.19,41.68,41.96,24232872\n16-Dec-10,41.13,42.01,41.00,41.95,22671597\n15-Dec-10,41.45,41.61,41.22,41.23,13308123\n14-Dec-10,41.69,41.86,41.27,41.54,14152282\n13-Dec-10,42.06,42.18,41.53,41.65,25978138\n10-Dec-10,42.44,42.66,42.19,42.62,16845769\n9-Dec-10,42.78,42.78,42.20,42.54,16667000\n8-Dec-10,42.30,42.72,42.16,42.66,12238769\n7-Dec-10,43.15,43.21,42.09,42.19,22008499\n6-Dec-10,42.54,43.25,42.51,42.85,11975605\n3-Dec-10,42.52,43.27,42.52,43.03,17660570\n2-Dec-10,42.45,43.17,42.42,43.11,16612703\n1-Dec-10,42.50,42.94,42.33,42.57,20673741\n30-Nov-10,41.82,42.43,41.80,41.93,23370872\n29-Nov-10,42.58,42.76,42.08,42.60,20623005\n26-Nov-10,43.06,43.40,43.03,43.20,9897432\n24-Nov-10,43.74,43.74,43.74,43.74,0\n23-Nov-10,43.98,44.44,43.11,44.19,51532638\n22-Nov-10,42.95,43.29,42.15,43.25,33275353\n19-Nov-10,41.77,42.54,41.70,42.49,20291334\n18-Nov-10,41.14,41.86,41.03,41.69,19897226\n17-Nov-10,41.78,42.12,40.77,40.97,28672318\n16-Nov-10,42.25,42.39,41.44,41.80,22384471\n15-Nov-10,42.32,43.01,42.24,42.54,14463042\n12-Nov-10,42.72,42.98,42.02,42.21,18229625\n11-Nov-10,43.79,43.97,42.73,43.10,24431295\n10-Nov-10,44.51,44.52,43.74,44.16,13265999\n9-Nov-10,44.64,44.65,43.94,44.12,15222669\n8-Nov-10,43.63,44.48,43.51,44.25,15721043\n5-Nov-10,43.93,44.10,43.36,43.72,15618327\n4-Nov-10,44.13,44.56,43.81,44.07,21613433\n3-Nov-10,42.85,44.00,42.83,43.81,22232490\n2-Nov-10,42.75,42.99,42.63,42.91,11560660\n1-Nov-10,42.17,42.75,42.07,42.49,12897812\n29-Oct-10,42.44,42.68,41.88,42.04,18187411\n28-Oct-10,42.57,42.80,42.16,42.66,15160795\n27-Oct-10,42.55,42.84,41.96,42.39,18750077\n26-Oct-10,42.37,43.06,42.16,42.95,14494409\n25-Oct-10,42.96,43.23,42.56,42.88,13187344\n22-Oct-10,42.37,42.96,42.29,42.87,10305705\n21-Oct-10,42.87,42.97,41.92,42.40,19923619\n20-Oct-10,43.00,43.25,42.76,42.82,18368261\n19-Oct-10,42.88,43.15,42.54,42.83,20787264\n18-Oct-10,42.69,43.47,42.50,43.32,18472000\n15-Oct-10,42.39,42.84,42.12,42.82,23638955\n14-Oct-10,42.20,42.34,41.80,42.13,14963155\n13-Oct-10,41.55,42.54,41.55,42.21,24626398\n12-Oct-10,41.18,41.55,40.89,41.35,14980961\n11-Oct-10,41.25,41.39,40.82,41.20,12905359\n8-Oct-10,40.85,41.30,40.68,41.15,18830220\n7-Oct-10,40.88,40.98,40.46,40.81,18988038\n6-Oct-10,41.05,41.22,40.44,40.74,25891849\n5-Oct-10,41.04,41.07,40.36,40.81,30354662\n4-Oct-10,40.86,41.24,40.40,40.64,22997703\n1-Oct-10,41.21,41.29,40.25,40.77,62986304\n30-Sep-10,42.96,43.15,41.72,42.07,28162572\n29-Sep-10,41.97,42.74,41.90,42.53,31308473\n28-Sep-10,41.38,41.84,41.00,41.62,26574581\n27-Sep-10,41.16,41.76,40.91,41.26,23055667\n24-Sep-10,41.16,41.70,40.87,40.98,24550959\n23-Sep-10,39.11,40.67,39.09,40.15,22948423\n22-Sep-10,39.69,39.83,39.00,39.55,21478129\n21-Sep-10,39.55,40.52,39.40,39.92,25986327\n20-Sep-10,39.25,39.56,39.16,39.39,22196643\n17-Sep-10,40.38,40.62,39.10,39.14,35399826\n16-Sep-10,39.71,40.49,39.63,40.35,23331251\n15-Sep-10,39.30,40.04,39.14,39.62,24139528\n14-Sep-10,38.15,40.06,38.15,39.29,40924738\n13-Sep-10,38.45,38.54,37.97,38.28,33830182\n10-Sep-10,38.78,38.83,38.08,38.28,22786033\n9-Sep-10,39.30,39.34,38.58,38.82,17872634\n8-Sep-10,39.28,39.60,38.25,38.81,32778043\n7-Sep-10,39.75,40.16,39.71,39.92,20739058\n6-Sep-10,40.34,40.34,40.34,40.34,0\n3-Sep-10,40.34,40.34,40.34,40.34,0\n2-Sep-10,39.16,39.68,39.10,39.68,17780961\n1-Sep-10,39.00,39.25,38.73,39.21,22331522\n31-Aug-10,38.37,38.98,38.03,38.39,30209861\n30-Aug-10,38.88,39.49,38.55,38.56,29391602\n27-Aug-10,38.30,38.55,37.32,38.00,37177598\n26-Aug-10,38.54,38.65,38.09,38.22,18336495\n25-Aug-10,38.14,38.57,38.03,38.24,26249254\n24-Aug-10,38.49,38.86,38.34,38.39,30244565\n23-Aug-10,39.94,40.00,38.61,39.04,37415753\n20-Aug-10,40.49,40.59,39.33,39.85,38855049\n19-Aug-10,41.62,41.70,40.33,40.76,25349698\n18-Aug-10,41.15,41.61,40.89,41.36,22174562\n17-Aug-10,40.99,41.35,40.72,40.82,23626251\n16-Aug-10,40.51,41.09,40.35,40.55,22883281\n13-Aug-10,40.45,40.98,40.25,40.45,29473465\n12-Aug-10,40.23,40.47,39.95,40.14,52656378\n11-Aug-10,42.08,42.15,40.66,40.77,57825826\n10-Aug-10,42.85,42.98,42.16,42.33,73334006\n9-Aug-10,43.47,43.84,42.43,42.60,200732115\n6-Aug-10,45.97,46.32,41.85,46.30,29283256\n5-Aug-10,46.69,46.69,46.02,46.35,13488775\n4-Aug-10,47.42,47.70,46.65,46.77,15745673\n3-Aug-10,47.46,47.64,47.08,47.36,9654245\n2-Aug-10,46.59,47.80,46.40,47.56,12805270\n30-Jul-10,45.98,46.62,45.71,46.04,12608148\n29-Jul-10,47.61,47.67,46.32,46.41,17449042\n28-Jul-10,47.33,47.70,46.93,47.13,11207844\n27-Jul-10,47.11,47.83,46.78,47.57,16485949\n26-Jul-10,46.10,46.58,46.02,46.57,16208701\n23-Jul-10,45.98,46.44,45.72,46.15,18933580\n22-Jul-10,45.83,46.16,45.73,46.07,17153461\n21-Jul-10,46.61,46.75,45.27,45.48,17718792\n20-Jul-10,45.80,46.67,45.58,46.61,15881368\n19-Jul-10,46.40,46.95,46.13,46.68,10611641\n16-Jul-10,47.11,47.39,46.10,46.20,13366546\n15-Jul-10,47.22,47.53,46.65,47.42,11971209\n14-Jul-10,47.06,47.97,47.02,47.34,13782718\n13-Jul-10,46.13,47.02,45.91,46.77,14506516\n12-Jul-10,45.02,45.78,45.02,45.68,10529660\n9-Jul-10,45.44,45.50,44.99,45.25,12749596\n8-Jul-10,45.42,45.59,44.89,45.48,13222416\n7-Jul-10,43.23,45.06,43.15,44.96,18318548\n6-Jul-10,43.37,44.07,42.79,43.17,17190453\n5-Jul-10,42.81,42.81,42.81,42.81,0\n2-Jul-10,42.81,42.81,42.81,42.81,0\n1-Jul-10,43.15,43.55,42.42,42.89,21393274\n30-Jun-10,44.23,44.23,43.13,43.28,23707100\n29-Jun-10,45.35,45.68,44.02,44.30,22156077\n28-Jun-10,45.89,46.46,45.61,46.07,13095950\n25-Jun-10,45.78,46.38,45.35,45.92,24021666\n24-Jun-10,46.55,46.79,45.76,45.89,15088123\n23-Jun-10,46.85,47.40,46.50,46.89,12816146\n22-Jun-10,47.52,48.00,46.70,46.77,13248810\n21-Jun-10,48.37,48.50,47.21,47.51,12684731\n18-Jun-10,48.25,48.62,47.94,47.98,18864046\n17-Jun-10,48.19,48.42,47.19,48.24,16346801\n16-Jun-10,47.67,48.17,47.18,48.01,18115799\n15-Jun-10,47.11,48.07,47.02,47.98,15805327\n14-Jun-10,47.87,48.22,46.83,46.88,14370824\n11-Jun-10,46.21,47.28,46.12,47.19,11498051\n10-Jun-10,46.02,46.62,45.92,46.50,15893586\n9-Jun-10,46.06,46.49,45.21,45.41,19089513\n8-Jun-10,45.34,45.97,45.03,45.88,19926265\n7-Jun-10,46.18,46.45,45.21,45.24,15493158\n4-Jun-10,46.69,47.10,45.79,46.05,18693864\n3-Jun-10,47.45,47.72,47.07,47.48,16839002\n2-Jun-10,46.16,47.34,46.00,47.27,24743266\n1-Jun-10,45.85,46.57,45.50,45.58,17766995\n31-May-10,46.01,46.01,46.01,46.01,0\n28-May-10,46.01,46.01,46.01,46.01,0\n27-May-10,46.37,47.09,46.35,46.94,17941237\n26-May-10,46.26,46.75,45.59,45.72,21561184\n25-May-10,44.54,45.90,44.17,45.85,22718487\n24-May-10,46.28,46.98,45.64,45.69,18084718\n21-May-10,44.96,46.81,44.80,46.58,27823580\n20-May-10,45.84,46.76,45.11,45.95,33169334\n19-May-10,47.91,48.15,46.34,47.00,32335770\n18-May-10,48.25,48.28,46.66,46.79,21439309\n17-May-10,47.45,47.69,46.64,47.52,16969077\n14-May-10,48.15,48.20,46.59,47.43,25960819\n13-May-10,49.54,50.00,48.61,48.72,15447149\n12-May-10,48.69,49.86,48.62,49.56,17684228\n11-May-10,48.58,49.47,48.22,48.42,17319154\n10-May-10,49.02,50.33,48.80,49.10,23499996\n7-May-10,48.10,48.30,45.61,46.73,38633071\n6-May-10,50.53,51.99,41.94,48.33,37937189\n5-May-10,50.30,51.12,50.05,50.93,14031539\n4-May-10,52.20,52.25,50.30,50.64,19988504\n3-May-10,52.04,52.95,51.99,52.71,11667943\n30-Apr-10,53.00,53.38,51.92,51.97,15732194\n29-Apr-10,52.61,53.00,52.55,52.88,19525586\n28-Apr-10,53.11,53.54,53.10,53.28,16103260\n27-Apr-10,54.02,54.25,53.11,53.25,14552983\n26-Apr-10,53.93,54.60,53.82,54.26,12098248\n23-Apr-10,53.36,53.91,53.03,53.90,9783822\n22-Apr-10,53.32,53.52,52.51,53.31,12391930\n21-Apr-10,53.38,54.03,53.25,53.70,11586498\n20-Apr-10,53.85,53.99,53.36,53.56,12252123\n19-Apr-10,53.45,53.73,53.04,53.64,10731134\n16-Apr-10,54.05,54.75,53.53,53.75,15628514\n15-Apr-10,54.20,54.31,53.55,54.23,14140151\n14-Apr-10,54.02,54.64,53.95,54.52,12032584\n13-Apr-10,53.89,53.98,53.56,53.78,8112032\n12-Apr-10,53.79,54.00,53.77,53.88,8456152\n9-Apr-10,53.64,53.87,53.40,53.87,7485554\n8-Apr-10,53.17,53.75,52.77,53.63,9007097\n7-Apr-10,53.74,53.84,52.96,53.29,12077255\n6-Apr-10,53.68,53.97,53.36,53.86,9684561\n5-Apr-10,53.28,53.95,53.19,53.87,9883171\n2-Apr-10,53.24,53.24,53.24,53.24,0\n1-Apr-10,53.24,53.24,53.24,53.24,0\n31-Mar-10,52.89,53.39,52.82,53.15,12855733\n30-Mar-10,52.93,53.37,52.93,53.26,10143164\n29-Mar-10,53.42,53.63,52.90,52.97,10235401\n26-Mar-10,53.58,53.69,53.24,53.42,14226297\n25-Mar-10,53.34,53.79,53.17,53.50,16817524\n24-Mar-10,52.97,53.22,52.79,53.06,15121443\n23-Mar-10,53.01,53.16,52.71,53.15,9652704\n22-Mar-10,52.13,53.04,52.13,52.95,15691109\n19-Mar-10,52.81,52.95,52.21,52.49,20920251\n18-Mar-10,52.22,52.83,52.11,52.73,14130482\n17-Mar-10,52.41,52.75,52.18,52.23,14205729\n16-Mar-10,52.30,52.46,52.09,52.35,11305994\n15-Mar-10,52.16,52.43,51.91,52.42,10278220\n12-Mar-10,52.07,52.43,51.82,52.36,11759443\n11-Mar-10,51.74,52.03,51.38,52.02,9571583\n10-Mar-10,51.86,52.09,51.61,51.78,11688536\n9-Mar-10,51.58,52.23,51.47,51.88,10230516\n8-Mar-10,51.65,51.98,51.58,51.73,12883702\n5-Mar-10,51.72,52.25,51.66,52.03,15449833\n4-Mar-10,51.13,51.57,51.04,51.51,8080565\n3-Mar-10,51.11,51.35,51.00,51.10,11452972\n2-Mar-10,51.56,51.74,50.93,51.12,15013092\n1-Mar-10,50.68,51.66,50.68,51.54,14151015\n26-Feb-10,50.92,50.99,50.61,50.79,11018256\n25-Feb-10,50.20,50.96,49.93,50.92,12836032\n24-Feb-10,50.04,51.00,50.02,50.79,15016202\n23-Feb-10,50.37,50.74,49.98,50.12,12060050\n22-Feb-10,50.71,50.89,50.26,50.56,12437623\n19-Feb-10,50.42,51.00,50.20,50.79,16661065\n18-Feb-10,50.38,50.96,49.87,50.81,23479583\n17-Feb-10,49.77,50.25,49.70,50.12,23481276\n16-Feb-10,48.94,49.60,48.79,49.44,14687885\n15-Feb-10,48.46,48.46,48.46,48.46,0\n12-Feb-10,48.46,48.46,48.46,48.46,0\n11-Feb-10,48.00,48.85,47.82,48.62,12855398\n10-Feb-10,48.53,48.72,47.75,48.02,13873773\n9-Feb-10,48.10,48.84,47.86,48.12,17621970\n8-Feb-10,47.15,48.13,47.05,47.59,17616488\n5-Feb-10,46.91,47.49,46.46,47.32,19731345\n4-Feb-10,48.19,48.72,46.98,47.03,21656210\n3-Feb-10,48.47,48.89,48.26,48.73,11359627\n2-Feb-10,48.30,48.82,47.98,48.59,17464039\n1-Feb-10,47.37,47.90,47.20,47.83,15741102\n29-Jan-10,48.37,48.45,46.80,47.07,23487717\n28-Jan-10,49.40,49.43,47.51,47.79,26580723\n27-Jan-10,49.77,49.77,48.51,49.45,18009299\n26-Jan-10,50.10,50.50,49.58,49.74,15729932\n25-Jan-10,49.55,50.42,49.41,50.06,13477316\n22-Jan-10,51.01,51.20,49.25,49.29,20256693\n21-Jan-10,52.41,52.47,50.89,51.29,18487508\n20-Jan-10,52.26,52.43,51.49,52.21,13900616\n19-Jan-10,52.10,52.79,52.10,52.75,11377438\n18-Jan-10,52.47,52.47,52.47,52.47,0\n15-Jan-10,52.47,52.47,52.47,52.47,0\n14-Jan-10,52.23,52.94,52.13,52.51,16115900\n13-Jan-10,52.20,52.41,51.65,52.22,11789723\n12-Jan-10,52.03,52.56,51.79,51.97,12331370\n11-Jan-10,52.58,52.72,51.94,52.43,10143383\n8-Jan-10,52.10,52.64,52.03,52.59,10240066\n7-Jan-10,52.19,52.59,52.00,52.20,10224624\n6-Jan-10,52.53,52.73,52.05,52.18,11748132\n5-Jan-10,52.14,52.74,52.10,52.67,13093427\n4-Jan-10,51.54,52.50,51.32,52.45,12698023\n1-Jan-10,51.51,51.51,51.51,51.51,0\n31-Dec-09,51.51,51.51,51.51,51.51,0\n30-Dec-09,52.28,52.93,52.28,52.93,6646999\n29-Dec-09,52.62,52.83,52.53,52.57,6967213\n28-Dec-09,52.88,52.88,52.45,52.76,11146758\n25-Dec-09,52.87,52.87,52.87,52.87,0\n24-Dec-09,52.26,52.94,52.16,52.87,4161747\n23-Dec-09,52.47,52.50,52.02,52.49,8059577\n22-Dec-09,51.94,52.61,51.90,52.46,12190392\n21-Dec-09,51.49,52.26,51.45,51.99,15835115\n18-Dec-09,50.90,51.61,50.70,51.50,21455011\n17-Dec-09,50.94,51.09,50.26,50.56,14025184\n16-Dec-09,50.90,51.54,50.89,51.36,15635026\n15-Dec-09,50.52,51.25,50.33,50.99,18517556\n14-Dec-09,49.95,50.76,49.93,50.68,12478094\n11-Dec-09,50.09,50.21,49.89,50.05,11834527\n10-Dec-09,49.97,50.23,49.79,50.14,18760717\n9-Dec-09,49.03,50.00,48.81,49.95,17533684\n8-Dec-09,49.08,49.15,48.82,48.94,11579201\n7-Dec-09,49.48,49.88,49.15,49.21,13037354\n4-Dec-09,49.12,49.90,49.10,49.79,18895962\n3-Dec-09,49.23,49.42,48.88,48.96,15758727\n2-Dec-09,49.37,49.60,48.90,48.98,14756335\n1-Dec-09,49.39,49.80,49.35,49.59,18314840\n30-Nov-09,48.97,49.31,48.81,49.06,16360523\n27-Nov-09,48.94,49.37,48.60,49.07,9948935\n26-Nov-09,50.05,50.05,50.05,50.05,0\n25-Nov-09,50.34,50.35,49.96,50.05,12745904\n24-Nov-09,50.60,51.02,49.84,50.19,17270400\n23-Nov-09,50.43,51.03,50.35,51.02,15775597\n20-Nov-09,49.58,50.27,49.51,50.04,14391054\n19-Nov-09,50.19,50.35,49.32,49.82,15078978\n18-Nov-09,51.03,51.05,50.27,50.48,16524183\n17-Nov-09,50.36,51.43,50.25,51.32,15817012\n16-Nov-09,49.89,50.88,49.86,50.81,20621054\n13-Nov-09,49.71,49.95,49.40,49.91,13858709\n12-Nov-09,49.65,49.96,49.52,49.70,21985470\n11-Nov-09,49.82,50.00,49.71,50.00,14234357\n10-Nov-09,49.81,49.97,49.65,49.96,10614755\n9-Nov-09,49.07,50.00,48.82,49.99,15566324\n6-Nov-09,48.68,49.16,48.52,49.16,10807946\n5-Nov-09,48.37,48.89,48.01,48.85,11386985\n4-Nov-09,47.96,48.64,47.69,47.76,15569522\n3-Nov-09,47.79,48.00,47.30,47.51,14733826\n2-Nov-09,47.43,48.28,47.16,48.16,15416232\n30-Oct-09,48.23,49.00,47.28,47.46,16738914\n29-Oct-09,46.99,48.39,46.99,48.35,15560105\n28-Oct-09,47.19,47.56,46.85,46.93,11803852\n27-Oct-09,47.73,48.00,47.12,47.30,10076001\n26-Oct-09,48.47,48.90,47.57,47.86,11216353\n23-Oct-09,49.08,49.20,48.25,48.56,13551799\n22-Oct-09,48.07,48.49,47.73,48.32,9189592\n21-Oct-09,48.60,49.05,48.16,48.22,12381071\n20-Oct-09,48.53,48.90,48.35,48.74,12312584\n19-Oct-09,48.23,48.54,48.14,48.47,11220679\n16-Oct-09,47.83,48.41,47.45,48.37,19489517\n15-Oct-09,47.67,48.00,47.63,48.00,11924319\n14-Oct-09,47.50,47.98,47.37,47.89,14554602\n13-Oct-09,46.76,46.96,46.55,46.69,12536062\n12-Oct-09,47.44,47.50,46.85,47.04,8511732\n9-Oct-09,46.40,47.48,46.38,47.38,14300152\n8-Oct-09,46.89,47.16,46.35,46.46,15004797\n7-Oct-09,46.79,46.87,46.26,46.56,10923906\n6-Oct-09,46.40,47.10,46.11,47.01,15706558\n5-Oct-09,45.48,46.44,45.33,46.07,14597925\n2-Oct-09,45.59,45.96,45.20,45.28,18153704\n1-Oct-09,47.02,47.32,45.81,45.96,20121141\n30-Sep-09,47.26,47.63,46.67,47.21,21394326\n29-Sep-09,47.66,47.95,47.26,47.44,19650464\n28-Sep-09,46.97,48.00,46.85,47.88,16677093\n25-Sep-09,46.41,47.23,46.36,47.02,19979527\n24-Sep-09,47.04,47.48,46.51,46.87,13256415\n23-Sep-09,46.89,47.86,46.82,46.93,15969487\n22-Sep-09,46.95,47.17,46.80,47.01,14339698\n21-Sep-09,45.63,46.48,45.51,46.35,11515389\n18-Sep-09,45.95,46.50,45.73,46.15,19919296\n17-Sep-09,45.54,46.24,45.39,45.71,12168366\n16-Sep-09,45.75,45.96,45.43,45.64,13891341\n15-Sep-09,45.72,45.85,45.26,45.64,11088040\n14-Sep-09,45.33,46.00,45.32,45.70,12916717\n11-Sep-09,46.48,46.53,45.87,46.10,12840574\n10-Sep-09,45.87,46.50,45.77,46.50,14844259\n9-Sep-09,45.29,45.98,45.01,45.98,16482701\n8-Sep-09,45.11,45.48,44.98,45.47,10493915\n4-Sep-09,44.50,45.15,44.47,45.10,8786545\n3-Sep-09,44.32,44.79,44.16,44.45,11230666\n2-Sep-09,43.65,44.50,43.60,44.25,16169584\n1-Sep-09,44.64,45.10,43.65,43.87,16519049\n31-Aug-09,44.11,44.95,43.92,44.89,12862227\n28-Aug-09,45.26,45.55,44.58,44.76,19588659\n27-Aug-09,44.43,44.88,44.19,44.81,15023342\n26-Aug-09,44.58,44.75,44.10,44.48,14264058\n25-Aug-09,44.95,45.16,44.50,44.68,18093561\n24-Aug-09,44.83,45.12,44.53,44.79,15122331\n21-Aug-09,44.20,44.84,43.83,44.78,18936048\n20-Aug-09,43.48,44.08,43.41,43.98,12548736\n19-Aug-09,42.58,44.00,42.52,43.83,25324570\n18-Aug-09,43.32,44.11,42.97,43.96,24618179\n17-Aug-09,43.63,43.72,42.89,43.11,12522947\n14-Aug-09,44.33,44.47,43.65,44.09,11629173\n13-Aug-09,44.21,44.49,43.78,44.35,11571609\n12-Aug-09,43.20,44.50,43.17,44.18,13791805\n10-Aug-09,43.37,43.75,43.18,43.67,12179605\n7-Aug-09,42.85,43.73,42.47,43.54,19271005\n6-Aug-09,43.14,43.39,42.14,42.21,17016026\n5-Aug-09,43.41,43.42,42.74,43.26,13490206\n4-Aug-09,43.08,43.50,43.00,43.42,14373109\n3-Aug-09,43.37,43.60,42.96,43.38,13355682\n31-Jul-09,42.55,43.55,42.43,43.30,21089591\n30-Jul-09,42.41,43.29,42.38,42.71,19014530\n29-Jul-09,41.53,42.24,41.24,42.19,13486003\n28-Jul-09,41.68,41.98,41.20,41.98,11606287\n27-Jul-09,41.64,41.89,41.15,41.84,10692864\n24-Jul-09,41.22,41.78,40.90,41.72,11268491\n23-Jul-09,40.66,41.93,40.63,41.64,19050538\n22-Jul-09,40.31,41.00,40.29,40.80,14795503\n21-Jul-09,40.09,40.58,39.75,40.57,14145002\n20-Jul-09,40.16,40.50,39.84,40.43,11944137\n17-Jul-09,39.83,40.00,39.64,39.98,14568817\n16-Jul-09,38.51,39.89,38.40,39.67,20123018\n15-Jul-09,38.00,38.85,37.80,38.82,17475719\n14-Jul-09,36.92,37.28,36.67,37.14,13854826\n13-Jul-09,37.27,37.42,36.71,37.30,13352464\n10-Jul-09,37.21,37.73,36.78,37.24,11391534\n9-Jul-09,37.43,37.50,37.00,37.30,9845417\n8-Jul-09,36.86,37.41,36.80,37.21,15107358\n7-Jul-09,37.61,37.80,36.78,36.84,14073798\n6-Jul-09,37.55,38.20,37.41,37.73,12165759\n3-Jul-09,37.85,37.85,37.85,37.85,0\n2-Jul-09,38.26,38.68,37.85,37.85,11991788\n1-Jul-09,38.80,39.62,38.54,38.68,19494225\n30-Jun-09,38.85,39.24,38.35,38.65,16528458\n29-Jun-09,37.85,39.03,37.81,38.98,24796022\n26-Jun-09,38.11,38.32,37.53,37.61,23012304\n25-Jun-09,37.00,38.31,37.00,38.12,15978094\n24-Jun-09,37.63,37.96,36.99,37.22,17353637\n23-Jun-09,37.96,37.96,37.30,37.36,12621803\n22-Jun-09,37.91,38.58,37.55,37.74,19469795\n19-Jun-09,37.82,38.44,37.78,38.35,26179179\n18-Jun-09,37.40,37.64,36.73,37.55,18119355\n17-Jun-09,36.66,37.50,36.61,37.42,16909004\n16-Jun-09,37.24,37.33,36.67,36.84,14026777\n15-Jun-09,37.32,37.55,36.72,37.08,13021871\n12-Jun-09,37.13,37.80,37.05,37.76,13490870\n11-Jun-09,36.77,37.73,36.77,37.23,15672698\n10-Jun-09,37.13,37.24,36.31,36.79,14162361\n9-Jun-09,37.41,37.48,36.65,36.84,15483335\n8-Jun-09,36.86,37.63,36.50,37.41,17483891\n5-Jun-09,36.46,37.50,36.45,37.35,25956111\n4-Jun-09,35.73,36.28,35.48,36.09,18912443\n3-Jun-09,35.72,35.85,35.16,35.63,13944177\n2-Jun-09,35.96,36.55,35.62,35.84,16568896\n1-Jun-09,34.80,36.13,34.70,36.00,17784521\n29-May-09,34.34,34.86,33.85,34.35,19508689\n28-May-09,34.35,35.08,34.20,34.70,16607377\n27-May-09,34.50,35.25,34.25,34.34,16842692\n26-May-09,33.86,35.07,33.75,34.47,20061594\n25-May-09,34.14,34.14,34.14,34.14,0\n22-May-09,34.32,34.66,33.85,34.14,12004911\n21-May-09,34.31,34.39,33.55,34.22,25410853\n20-May-09,35.24,35.50,34.43,34.67,47462757\n19-May-09,35.97,36.98,35.61,36.58,26129049\n18-May-09,35.20,35.76,34.62,35.73,17634412\n15-May-09,34.95,35.64,34.84,35.01,16973999\n14-May-09,34.41,35.07,34.10,34.93,14713440\n13-May-09,34.61,34.82,33.93,34.21,14147601\n12-May-09,35.11,35.24,34.68,34.99,13806155\n11-May-09,34.04,35.35,34.03,35.03,14206609\n8-May-09,34.84,34.85,33.40,34.68,23950545\n7-May-09,36.46,36.46,34.26,34.53,27434211\n6-May-09,36.67,36.80,35.89,36.33,15414882\n5-May-09,36.58,36.97,36.46,36.80,12900459\n4-May-09,36.75,37.24,36.29,37.14,12897369\n1-May-09,35.95,36.58,35.53,36.52,13118212\n30-Apr-09,36.78,37.40,35.72,35.98,19422570\n29-Apr-09,35.58,37.00,35.49,36.45,14044965\n28-Apr-09,35.08,35.88,34.94,35.42,11026184\n27-Apr-09,35.13,36.19,35.06,35.45,14197291\n24-Apr-09,34.97,36.00,34.83,35.80,17841479\n23-Apr-09,34.75,34.91,33.96,34.76,14734069\n22-Apr-09,34.74,35.54,34.60,34.68,15354895\n21-Apr-09,34.50,35.50,34.28,35.43,14277858\n20-Apr-09,35.36,35.58,34.59,34.68,16222706\n17-Apr-09,36.44,36.58,35.29,36.30,21236210\n16-Apr-09,35.50,36.87,35.46,36.60,21160486\n15-Apr-09,33.79,34.96,33.77,34.85,18675547\n14-Apr-09,33.84,34.35,33.75,34.12,13833561\n13-Apr-09,33.81,34.80,33.47,34.52,13061416\n10-Apr-09,34.43,34.43,34.43,34.43,0\n9-Apr-09,33.90,34.65,33.58,34.43,15875924\n8-Apr-09,33.50,33.81,32.63,33.06,14346059\n7-Apr-09,33.13,33.57,32.79,33.31,13899851\n6-Apr-09,34.02,34.09,32.92,33.76,15919639\n3-Apr-09,33.66,34.91,33.66,34.15,20080030\n2-Apr-09,33.56,34.92,33.50,33.69,23047534\n1-Apr-09,31.36,33.05,30.98,32.88,20937811\n31-Mar-09,32.50,32.81,32.02,32.06,19193210\n30-Mar-09,32.26,32.40,31.48,32.12,28471190\n27-Mar-09,32.80,33.64,32.50,33.33,28460711\n26-Mar-09,31.79,33.32,31.59,33.20,35442467\n25-Mar-09,30.99,31.50,30.14,31.01,24936806\n24-Mar-09,30.90,31.22,30.50,30.62,18394635\n23-Mar-09,29.65,31.19,29.29,31.19,26873593\n20-Mar-09,29.31,29.99,28.70,28.85,28253333\n19-Mar-09,29.51,29.75,28.99,29.10,19194582\n18-Mar-09,29.35,29.84,28.34,28.99,32067072\n17-Mar-09,29.26,29.79,28.90,29.75,19598593\n16-Mar-09,29.64,29.88,28.90,29.02,17665834\n13-Mar-09,29.60,30.00,29.13,29.45,23675011\n12-Mar-09,28.50,29.45,28.06,29.34,24029562\n11-Mar-09,27.87,28.91,27.60,28.61,27941873\n10-Mar-09,26.06,27.11,25.59,27.04,35677432\n9-Mar-09,26.47,27.03,25.39,25.53,30630876\n6-Mar-09,26.19,27.38,25.70,26.98,33507817\n5-Mar-09,28.11,28.29,26.81,27.08,30225367\n4-Mar-09,28.99,29.18,28.25,28.65,26669333\n3-Mar-09,27.71,28.74,27.71,28.17,27310237\n2-Mar-09,28.75,29.06,27.90,28.07,27972127\n27-Feb-09,29.72,29.96,28.95,29.03,39284781\n26-Feb-09,30.37,31.09,30.08,30.24,21254946\n25-Feb-09,29.56,30.65,29.20,30.12,28095159\n24-Feb-09,29.15,29.93,28.75,29.62,40929086\n23-Feb-09,31.29,31.48,29.17,29.28,32505716\n20-Feb-09,30.86,31.84,30.69,31.24,26073635\n19-Feb-09,32.79,32.92,30.67,31.39,57042656\n18-Feb-09,34.61,34.97,33.53,34.08,28653349\n17-Feb-09,35.07,35.21,34.32,34.34,20797655\n13-Feb-09,35.07,36.24,34.88,35.87,20768342\n12-Feb-09,34.26,35.28,33.76,35.24,19713132\n11-Feb-09,35.46,35.55,34.55,35.08,17118470\n10-Feb-09,35.97,36.69,35.00,35.21,17230801\n9-Feb-09,36.45,36.76,36.10,36.33,14083822\n6-Feb-09,35.23,37.20,35.05,36.85,23288432\n5-Feb-09,35.45,35.47,34.76,35.09,27497610\n4-Feb-09,36.05,37.00,35.87,36.03,14539078\n3-Feb-09,34.98,36.25,34.43,36.10,14390625\n2-Feb-09,34.15,35.29,34.00,34.66,15696078\n30-Jan-09,36.13,36.33,34.50,34.75,17359641\n29-Jan-09,36.52,37.00,35.82,35.93,14781128\n28-Jan-09,36.46,37.72,36.23,37.41,17637993\n27-Jan-09,35.83,36.09,35.30,35.89,11867800\n26-Jan-09,35.78,35.97,35.04,35.57,17410904\n23-Jan-09,34.85,36.68,34.55,35.79,19159187\n22-Jan-09,34.42,35.97,34.00,35.49,21281121\n21-Jan-09,34.18,35.15,33.44,35.11,18023168\n20-Jan-09,34.43,34.68,33.18,33.34,17729476\n16-Jan-09,36.20,36.20,34.18,34.77,28838889\n15-Jan-09,35.49,36.11,34.96,35.75,23700961\n14-Jan-09,35.51,35.80,34.89,35.39,19925608\n13-Jan-09,36.50,36.73,35.72,35.83,19803701\n12-Jan-09,37.45,37.60,36.52,36.98,14955919\n9-Jan-09,37.81,38.22,36.94,37.49,17030770\n8-Jan-09,37.70,37.75,36.86,37.64,15505825\n7-Jan-09,38.46,38.71,37.25,37.84,24913506\n6-Jan-09,37.08,39.53,36.99,39.31,30633850\n5-Jan-09,36.80,36.80,36.05,36.33,14602662\n2-Jan-09,36.25,36.94,35.46,36.81,14593734\n1-Jan-09,36.29,36.29,36.29,36.29,0\n31-Dec-08,36.14,36.96,35.94,36.29,12818375\n30-Dec-08,35.74,36.26,35.29,36.19,10776541\n29-Dec-08,35.38,35.63,34.97,35.58,10659759\n26-Dec-08,34.71,35.12,34.71,34.97,4479139\n25-Dec-08,34.68,34.68,34.68,34.68,0\n24-Dec-08,34.52,34.91,34.35,34.68,4530897\n23-Dec-08,35.02,35.43,34.36,34.55,10360266\n22-Dec-08,35.45,35.46,34.04,34.75,13210616\n19-Dec-08,35.30,36.02,34.87,35.40,22116042\n18-Dec-08,36.68,36.68,34.69,35.37,18243815\n17-Dec-08,36.06,37.19,35.31,37.09,16693607\n16-Dec-08,35.33,36.55,34.94,36.32,19482223\n15-Dec-08,36.06,36.10,34.41,34.82,15192555\n12-Dec-08,34.06,36.10,34.00,35.97,17575546\n11-Dec-08,34.34,36.26,34.24,34.78,17168556\n10-Dec-08,34.10,35.51,34.10,35.10,14191655\n9-Dec-08,34.54,36.07,34.38,34.51,18334742\n8-Dec-08,34.40,35.84,33.97,35.23,19889801\n5-Dec-08,32.89,34.27,31.82,33.53,21395628\n4-Dec-08,34.71,34.99,32.83,33.39,18623676\n3-Dec-08,33.28,34.90,33.05,34.82,21811638\n2-Dec-08,33.85,34.54,33.08,34.27,21657936\n1-Dec-08,34.08,34.82,33.44,33.44,21056233\n28-Nov-08,34.83,35.35,34.55,35.28,7394044\n27-Nov-08,35.21,35.21,35.21,35.21,0\n26-Nov-08,33.37,35.25,33.02,35.21,22116817\n25-Nov-08,35.58,35.62,32.88,33.60,37646593\n24-Nov-08,35.10,36.00,33.46,35.70,33568008\n21-Nov-08,32.56,34.82,32.31,34.64,38498013\n20-Nov-08,32.77,34.45,31.43,31.83,40477662\n19-Nov-08,33.20,34.84,32.95,33.03,36223138\n18-Nov-08,33.56,33.84,31.75,33.59,68000554\n17-Nov-08,29.79,30.60,29.17,29.34,15798753\n14-Nov-08,30.72,32.00,30.00,30.46,22114194\n13-Nov-08,30.65,31.86,28.23,31.71,38206847\n12-Nov-08,32.18,32.64,31.00,31.14,20338695\n11-Nov-08,33.68,33.99,32.21,33.25,16085531\n10-Nov-08,35.32,35.76,33.56,34.17,16012517\n7-Nov-08,33.84,34.99,33.55,34.64,17926700\n6-Nov-08,35.17,35.42,33.38,33.64,28928500\n5-Nov-08,37.89,37.95,35.97,36.25,22216100\n4-Nov-08,39.14,39.14,37.41,38.24,25559200\n3-Nov-08,38.05,39.39,38.05,38.61,21616500\n31-Oct-08,37.14,39.26,37.14,38.28,28258400\n30-Oct-08,36.58,38.28,36.22,37.69,29251200\n29-Oct-08,35.02,36.70,34.70,35.40,27938200\n28-Oct-08,31.75,35.19,30.78,35.09,27111400\n27-Oct-08,31.71,32.76,31.01,31.18,23812300\n24-Oct-08,30.25,33.32,30.03,32.44,27161700\n23-Oct-08,35.22,35.51,31.75,33.15,37338100\n22-Oct-08,37.36,37.36,34.29,35.23,30457700\n21-Oct-08,40.21,40.70,37.87,38.05,27951200\n20-Oct-08,40.30,41.27,39.10,41.01,21407400\n17-Oct-08,39.45,41.30,38.22,39.71,21659700\n16-Oct-08,38.64,39.84,37.06,39.66,28797500\n15-Oct-08,39.38,40.60,38.35,38.61,28396700\n14-Oct-08,42.04,43.00,39.88,40.47,27209600\n13-Oct-08,38.50,41.90,37.85,41.40,25680200\n10-Oct-08,36.23,40.65,35.50,37.00,48182300\n9-Oct-08,40.83,41.12,38.50,38.50,33473500\n8-Oct-08,37.76,42.00,37.14,40.00,40982400\n7-Oct-08,40.76,41.80,39.59,39.68,26387100\n6-Oct-08,42.26,43.00,39.31,40.95,29213600\n3-Oct-08,43.09,45.11,42.62,43.00,22388700\n2-Oct-08,44.27,44.30,41.95,43.26,28257300\n1-Oct-08,46.16,46.72,44.44,44.97,21898700\n30-Sep-08,45.23,46.49,44.98,46.24,21896900\n29-Sep-08,47.16,47.40,44.28,44.55,25867500\n26-Sep-08,46.93,48.58,46.93,47.81,19365900\n25-Sep-08,46.66,48.45,46.16,47.70,21994800\n24-Sep-08,46.96,47.38,46.12,46.78,19864700\n23-Sep-08,47.53,48.46,46.65,46.88,19495100\n22-Sep-08,48.70,48.87,46.91,47.16,21715200\n19-Sep-08,48.87,49.20,47.71,48.26,29969300\n18-Sep-08,46.48,47.69,46.04,47.14,35774600\n17-Sep-08,47.61,47.90,45.69,45.75,31494500\n16-Sep-08,44.78,49.00,44.04,48.41,52492800\n15-Sep-08,45.77,46.58,45.33,45.33,25036600\n12-Sep-08,46.75,47.18,46.29,46.97,16549700\n11-Sep-08,46.23,47.44,46.16,47.19,24707700\n10-Sep-08,46.18,47.12,46.02,46.76,21021700\n9-Sep-08,46.51,47.28,46.01,46.01,25794000\n8-Sep-08,45.56,45.85,44.84,45.74,18643300\n5-Sep-08,44.11,45.14,43.98,44.96,17490500\n4-Sep-08,44.99,45.09,44.10,44.46,15482300\n3-Sep-08,45.81,46.26,44.54,45.09,18626000\n2-Sep-08,47.18,47.79,45.70,46.00,19472800\n29-Aug-08,46.75,47.34,46.67,46.92,13179500\n28-Aug-08,46.81,47.33,46.56,47.33,12623700\n27-Aug-08,46.65,47.22,46.55,46.80,13076900\n26-Aug-08,46.70,47.00,46.56,46.86,10086100\n25-Aug-08,46.65,47.24,46.51,46.81,11907000\n22-Aug-08,46.49,47.22,46.30,47.06,13330200\n21-Aug-08,45.70,46.55,45.61,46.45,14205100\n20-Aug-08,45.00,46.36,44.80,46.16,32542600\n19-Aug-08,44.40,44.40,43.33,43.69,19302700\n18-Aug-08,45.67,45.75,43.85,44.60,17935000\n15-Aug-08,45.62,45.84,45.12,45.59,11474200\n14-Aug-08,45.30,45.76,45.14,45.50,11005100\n13-Aug-08,45.79,46.06,45.26,45.61,9005400\n12-Aug-08,45.63,45.99,45.08,45.68,8291000\n11-Aug-08,45.83,46.33,45.30,45.73,10411800\n8-Aug-08,45.34,45.95,44.80,45.82,14569700\n7-Aug-08,45.00,45.86,44.60,45.51,12059700\n6-Aug-08,44.78,45.48,44.63,45.15,11044400\n5-Aug-08,44.15,45.19,43.97,45.00,12942900\n4-Aug-08,43.71,44.45,43.64,43.94,9463900\n1-Aug-08,44.80,45.00,43.70,43.96,10931700\n31-Jul-08,44.85,45.39,44.51,44.80,14515000\n30-Jul-08,44.49,45.17,44.25,45.06,15938100\n29-Jul-08,43.22,44.50,43.02,44.13,16464200\n28-Jul-08,43.47,43.83,42.69,43.00,10876900\n25-Jul-08,43.42,44.00,43.05,43.71,11701700\n24-Jul-08,44.42,44.42,43.32,43.38,13432000\n23-Jul-08,43.41,44.68,43.41,44.28,16185100\n22-Jul-08,42.90,43.56,42.63,43.53,15075700\n21-Jul-08,43.60,43.70,42.79,43.35,10936400\n18-Jul-08,42.99,43.95,42.93,43.42,13988200\n17-Jul-08,43.00,43.65,42.30,43.23,18448000\n16-Jul-08,41.31,42.45,41.00,42.34,18321000\n15-Jul-08,41.07,42.08,40.83,41.65,21766100\n14-Jul-08,41.91,42.12,41.07,41.79,16900100\n11-Jul-08,41.19,42.04,41.04,41.59,18554200\n10-Jul-08,42.39,42.48,41.05,41.45,26418100\n9-Jul-08,43.61,43.61,42.14,42.21,16250700\n8-Jul-08,43.81,43.94,42.73,43.45,17926300\n7-Jul-08,43.61,44.95,43.39,44.00,14782700\n3-Jul-08,43.60,43.79,42.66,43.44,13601900\n2-Jul-08,44.12,44.45,43.51,43.61,10320600\n1-Jul-08,43.54,44.37,43.17,44.00,19082900\n30-Jun-08,44.89,45.43,43.84,44.21,15015000\n27-Jun-08,44.60,44.83,44.03,44.58,14047500\n26-Jun-08,45.25,45.25,44.26,44.67,17363900\n25-Jun-08,45.14,46.20,45.14,45.60,11698500\n24-Jun-08,45.21,45.47,44.86,45.04,16480000\n23-Jun-08,45.87,45.98,45.34,45.51,10951300\n20-Jun-08,46.05,46.58,45.14,45.64,19693600\n19-Jun-08,46.15,46.94,45.79,46.59,14044800\n18-Jun-08,46.82,47.05,46.06,46.59,15527800\n17-Jun-08,47.89,48.00,47.09,47.34,12367400\n16-Jun-08,47.05,48.03,47.00,47.58,10147300\n13-Jun-08,47.14,48.08,47.09,47.45,13955500\n12-Jun-08,46.76,47.38,46.68,46.97,10893300\n11-Jun-08,47.50,47.52,46.31,46.48,13791600\n10-Jun-08,47.20,48.17,47.20,47.57,12499700\n9-Jun-08,47.68,47.86,47.18,47.63,10523600\n6-Jun-08,48.09,48.45,47.50,47.63,16581700\n5-Jun-08,47.12,48.74,46.94,48.51,21770300\n4-Jun-08,46.02,47.17,46.02,46.81,13096000\n3-Jun-08,46.57,46.97,46.05,46.24,14410500\n2-Jun-08,46.86,47.01,45.75,46.25,14392500\n30-May-08,47.05,47.60,46.92,47.06,17304800\n29-May-08,46.48,47.09,46.15,46.91,14519300\n28-May-08,46.00,46.65,45.94,46.52,17845000\n27-May-08,45.03,45.96,45.01,45.70,15480600\n23-May-08,44.79,45.15,44.71,44.96,16511700\n22-May-08,45.21,45.32,44.70,44.90,29159500\n21-May-08,46.20,46.35,44.40,44.80,33941500\n20-May-08,46.68,46.83,45.88,46.46,21006500\n19-May-08,47.32,48.05,46.44,46.71,16373100\n16-May-08,47.07,47.52,46.31,47.29,24586200\n15-May-08,45.87,47.07,45.28,46.73,28490400\n14-May-08,44.92,46.48,44.27,44.27,54743600\n13-May-08,44.39,45.85,43.27,44.27,31396000\n12-May-08,49.39,49.97,45.85,46.83,39983900\n9-May-08,48.85,49.35,48.60,49.13,9555500\n8-May-08,48.87,49.45,48.46,49.06,9948700\n7-May-08,48.57,49.87,48.37,48.65,18665700\n6-May-08,48.24,48.86,47.54,48.64,11089500\n5-May-08,48.08,48.59,47.80,48.28,8594200\n2-May-08,48.29,48.52,47.75,48.36,11532100\n1-May-08,46.35,48.18,46.25,48.03,16110300\n30-Apr-08,48.03,48.03,46.11,46.35,16111600\n29-Apr-08,47.59,48.03,47.32,47.84,9413100\n28-Apr-08,47.45,47.90,47.25,47.59,7984100\n25-Apr-08,48.30,48.30,46.77,47.45,12293900\n24-Apr-08,48.02,48.95,47.85,48.35,10354800\n23-Apr-08,48.18,48.58,47.74,48.02,10473600\n22-Apr-08,48.35,48.46,47.72,48.17,9739900\n21-Apr-08,47.95,48.53,47.60,48.45,8041500\n18-Apr-08,47.82,48.50,47.73,48.18,16604100\n17-Apr-08,47.36,47.50,46.72,47.31,9314100\n16-Apr-08,46.50,47.24,46.34,47.10,12095600\n15-Apr-08,46.04,46.13,45.29,45.82,8481500\n14-Apr-08,45.37,46.25,45.22,45.82,8660900\n11-Apr-08,46.27,46.35,45.35,45.47,10260400\n10-Apr-08,45.90,46.83,45.90,46.57,10820700\n9-Apr-08,46.06,46.23,45.26,46.09,11855700\n8-Apr-08,45.55,46.20,45.19,46.07,12256700\n7-Apr-08,46.45,46.93,45.73,45.92,13026700\n4-Apr-08,46.94,47.25,46.19,46.40,12220200\n3-Apr-08,46.86,47.27,46.37,46.96,15102800\n2-Apr-08,47.55,48.00,46.79,47.23,12881400\n1-Apr-08,46.11,47.86,46.11,47.59,17009300\n31-Mar-08,46.00,46.60,45.66,45.66,21004900\n28-Mar-08,46.95,47.20,45.93,46.09,10154900\n27-Mar-08,47.12,47.34,46.43,46.64,11984300\n26-Mar-08,48.01,48.24,46.67,47.34,12892700\n25-Mar-08,47.85,48.47,47.60,48.26,10428600\n24-Mar-08,46.71,48.48,46.29,47.93,15825800\n20-Mar-08,46.65,47.34,46.20,46.50,26082900\n19-Mar-08,47.50,47.84,46.55,46.59,20675100\n18-Mar-08,47.07,47.93,46.81,47.93,14830600\n17-Mar-08,44.92,46.98,44.50,46.42,16185900\n14-Mar-08,47.34,47.35,45.10,45.92,18105700\n13-Mar-08,46.59,47.52,46.09,47.02,15607600\n12-Mar-08,47.66,47.99,47.11,47.27,12122400\n11-Mar-08,47.67,48.00,46.61,47.92,14467200\n10-Mar-08,47.26,47.42,46.61,46.71,11294600\n7-Mar-08,47.31,48.17,46.74,47.31,12501300\n6-Mar-08,48.02,48.80,47.69,47.78,15814600\n5-Mar-08,48.59,48.85,47.80,48.31,12148600\n4-Mar-08,47.30,48.52,46.99,48.45,15788700\n3-Mar-08,47.62,47.88,47.14,47.60,11916200\n29-Feb-08,48.11,48.62,47.61,47.77,13631000\n28-Feb-08,48.61,48.80,48.16,48.55,15756800\n27-Feb-08,49.00,49.49,48.65,48.94,14373000\n26-Feb-08,47.90,49.69,47.64,49.20,20331600\n25-Feb-08,47.34,48.33,47.15,48.13,16736400\n22-Feb-08,46.93,47.49,46.35,47.40,14035700\n21-Feb-08,47.45,47.84,46.54,46.83,18832400\n20-Feb-08,45.86,47.73,45.50,47.44,39363600\n19-Feb-08,44.41,45.17,43.95,43.95,29029200\n15-Feb-08,43.15,44.29,42.81,43.87,18757300\n14-Feb-08,43.55,43.62,42.79,43.26,19581000\n13-Feb-08,43.12,44.48,43.12,44.05,17244500\n12-Feb-08,42.78,43.41,42.33,42.88,19453800\n11-Feb-08,42.24,42.63,41.93,42.63,13428800\n8-Feb-08,40.74,42.20,40.56,41.88,22334100\n7-Feb-08,41.80,41.80,40.16,40.50,48657400\n6-Feb-08,43.19,43.45,42.06,42.16,18541900\n5-Feb-08,43.95,43.95,42.81,42.98,17757200\n4-Feb-08,44.25,44.69,43.86,44.06,12294600\n1-Feb-08,43.78,44.45,43.46,44.42,18037400\n31-Jan-08,42.94,44.23,42.30,43.72,21987800\n30-Jan-08,43.13,44.29,42.84,43.54,19660100\n29-Jan-08,44.05,44.05,42.85,43.38,20890900\n28-Jan-08,43.75,44.80,43.41,43.80,14041300\n25-Jan-08,45.76,45.77,43.60,43.74,21060000\n24-Jan-08,43.28,45.18,42.48,44.89,22260600\n23-Jan-08,41.60,43.22,39.99,43.19,33575700\n22-Jan-08,40.50,43.50,40.50,42.72,31560000\n18-Jan-08,43.80,44.29,43.01,43.75,25026200\n17-Jan-08,44.45,44.80,42.50,43.00,23494400\n16-Jan-08,43.80,45.20,43.64,44.34,27601800\n15-Jan-08,45.60,45.74,45.00,45.05,15723200\n14-Jan-08,46.67,46.90,45.88,46.13,18274000\n11-Jan-08,45.50,45.65,44.85,45.00,18148700\n10-Jan-08,44.02,45.95,44.02,45.34,24590300\n9-Jan-08,43.12,44.62,42.76,44.44,30407000\n8-Jan-08,45.51,46.02,43.02,43.19,41574600\n7-Jan-08,47.06,47.15,44.21,45.35,31399800\n4-Jan-08,48.80,49.19,46.56,46.87,24006000\n3-Jan-08,49.46,49.83,49.08,49.65,10032000\n2-Jan-08,50.48,50.98,49.24,49.65,13786700\n31-Dec-07,51.29,51.30,50.40,50.48,7854500\n28-Dec-07,51.53,52.00,51.25,51.36,6053200\n27-Dec-07,52.15,52.63,51.51,51.61,7426800\n26-Dec-07,52.30,52.90,51.97,52.77,5935500\n24-Dec-07,51.98,52.48,51.83,52.32,3848700\n21-Dec-07,51.50,52.17,51.48,52.03,16175000\n20-Dec-07,51.42,51.90,50.78,51.16,8893700\n19-Dec-07,50.99,51.55,50.74,51.15,9124600\n18-Dec-07,51.20,51.76,50.88,51.02,11933000\n17-Dec-07,51.81,52.05,50.79,50.93,11170400\n14-Dec-07,51.93,52.85,51.93,52.14,12860700\n13-Dec-07,51.20,52.45,51.20,52.37,12095300\n12-Dec-07,51.82,52.20,51.11,51.53,14062100\n11-Dec-07,51.60,52.27,50.64,50.78,13400400\n10-Dec-07,52.09,52.20,51.23,51.97,11595200\n7-Dec-07,52.41,52.67,51.68,51.84,8826300\n6-Dec-07,51.64,52.24,51.18,52.21,10285000\n5-Dec-07,51.08,51.76,51.04,51.66,11084000\n4-Dec-07,50.04,51.46,50.01,50.71,11355200\n3-Dec-07,50.52,51.21,50.27,50.44,9659500\n30-Nov-07,51.56,51.77,50.18,51.16,19165000\n29-Nov-07,50.38,51.50,50.35,51.05,10439700\n28-Nov-07,49.17,51.00,48.88,50.73,16539200\n27-Nov-07,48.31,49.02,48.11,48.71,15374800\n26-Nov-07,49.15,49.60,48.04,48.16,15736100\n23-Nov-07,49.44,49.48,48.90,49.17,4525700\n21-Nov-07,48.46,49.92,48.46,48.88,13993200\n20-Nov-07,50.58,50.69,48.62,49.56,30033800\n19-Nov-07,50.87,51.51,49.25,49.44,24121600\n16-Nov-07,50.12,50.75,49.48,50.75,21409500\n15-Nov-07,48.80,49.60,48.57,48.90,13562000\n14-Nov-07,50.21,50.21,48.87,49.07,12957200\n13-Nov-07,48.25,49.55,48.08,49.50,16492300\n12-Nov-07,47.93,48.94,47.45,47.54,15357600\n9-Nov-07,49.18,49.43,47.87,48.39,18977700\n8-Nov-07,51.88,52.10,48.50,49.94,24539000\n7-Nov-07,52.86,53.40,51.75,51.84,14135100\n6-Nov-07,52.51,53.48,52.51,53.41,13567300\n5-Nov-07,52.03,52.84,51.79,52.54,11777700\n2-Nov-07,51.90,52.47,51.50,52.40,13931200\n1-Nov-07,51.22,52.30,51.16,51.50,15835900\n31-Oct-07,51.72,51.95,51.04,51.68,12341900\n30-Oct-07,51.64,51.97,51.50,51.59,8348900\n29-Oct-07,52.36,52.47,51.55,51.77,11882600\n26-Oct-07,52.19,52.64,51.96,52.47,11767500\n25-Oct-07,51.48,51.97,50.95,51.39,11743100\n24-Oct-07,51.69,51.85,50.43,51.60,12547000\n23-Oct-07,51.78,52.00,51.03,51.86,9612400\n22-Oct-07,50.83,51.45,50.25,51.29,11094300\n19-Oct-07,52.50,52.90,51.30,51.40,13813000\n18-Oct-07,52.49,53.00,52.02,52.87,8587400\n17-Oct-07,52.38,52.75,52.09,52.54,12094300\n16-Oct-07,51.08,51.89,51.07,51.51,7470800\n15-Oct-07,51.55,51.90,50.81,51.24,7230800\n12-Oct-07,51.42,51.97,51.30,51.55,8766300\n11-Oct-07,52.48,52.64,51.16,51.61,10993800\n10-Oct-07,52.37,52.72,52.00,52.25,8994200\n9-Oct-07,52.20,52.49,51.73,52.46,9630100\n8-Oct-07,50.92,52.18,50.91,52.03,12483600\n5-Oct-07,50.66,51.23,50.55,50.90,11501900\n4-Oct-07,50.41,50.57,50.01,50.47,6329300\n3-Oct-07,50.74,50.84,50.13,50.36,9751500\n2-Oct-07,50.88,51.08,50.32,51.04,8433300\n1-Oct-07,49.81,51.15,49.78,50.98,10698000\n28-Sep-07,50.21,50.32,49.55,49.79,10449600\n27-Sep-07,50.77,51.05,50.17,50.27,11156800\n26-Sep-07,50.99,51.09,50.46,50.62,13023000\n25-Sep-07,50.04,51.00,50.04,50.98,12676100\n24-Sep-07,50.73,50.98,50.17,50.24,10922300\n21-Sep-07,50.42,50.96,50.10,50.53,23298700\n20-Sep-07,49.55,50.30,49.55,50.10,11268100\n19-Sep-07,50.25,50.53,49.40,49.78,16239400\n18-Sep-07,49.45,50.36,48.15,50.17,13329200\n17-Sep-07,48.27,49.52,48.21,49.14,12440700\n14-Sep-07,48.50,48.75,47.70,48.38,16384100\n13-Sep-07,48.70,49.24,48.39,48.77,12081900\n12-Sep-07,49.82,49.88,48.55,48.76,14089800\n11-Sep-07,49.30,50.05,49.14,49.87,11216200\n10-Sep-07,49.00,49.40,48.34,49.00,8604200\n7-Sep-07,49.55,49.85,48.45,48.85,14925900\n6-Sep-07,50.15,50.42,49.84,50.19,12111700\n5-Sep-07,49.75,50.15,49.60,50.10,15411000\n4-Sep-07,49.06,50.47,49.05,50.14,21091700\n31-Aug-07,48.97,49.72,48.69,49.35,16248300\n30-Aug-07,48.05,48.99,47.96,48.44,10480200\n29-Aug-07,46.95,48.76,46.95,48.42,13171100\n28-Aug-07,47.60,47.98,46.82,46.88,10467200\n27-Aug-07,48.00,48.22,47.77,47.79,9031200\n24-Aug-07,47.50,48.17,47.40,48.10,10759200\n23-Aug-07,46.51,47.84,46.30,47.65,14499000\n22-Aug-07,46.54,46.64,45.82,46.42,15159100\n21-Aug-07,46.61,46.85,45.83,46.01,14177900\n20-Aug-07,47.32,47.45,45.90,46.58,16406500\n17-Aug-07,47.80,48.25,46.32,47.15,27160200\n16-Aug-07,46.24,46.31,43.64,46.05,26260400\n15-Aug-07,47.00,47.59,45.95,46.15,15286200\n14-Aug-07,48.69,48.76,46.92,47.28,17176400\n13-Aug-07,47.98,48.88,47.79,48.43,16660500\n10-Aug-07,46.56,48.19,46.48,47.21,15866700\n9-Aug-07,48.44,49.20,47.02,47.02,22690500\n8-Aug-07,48.89,49.84,48.70,49.40,21490600\n7-Aug-07,48.35,48.99,47.96,48.48,14414200\n6-Aug-07,47.56,48.52,47.55,48.46,18212100\n3-Aug-07,48.07,48.85,46.00,47.41,16869700\n2-Aug-07,47.05,48.42,47.05,48.23,16892900\n1-Aug-07,46.04,46.92,45.60,46.73,13218000\n31-Jul-07,46.55,47.09,45.97,46.03,13127500\n30-Jul-07,46.47,46.69,45.76,46.14,12117800\n27-Jul-07,47.20,47.42,46.46,46.46,13023700\n26-Jul-07,47.45,48.13,46.36,47.10,21263300\n25-Jul-07,47.90,48.54,47.15,47.54,10478600\n24-Jul-07,48.40,48.67,47.52,47.61,10130200\n23-Jul-07,48.51,49.00,48.31,48.43,10473500\n20-Jul-07,48.50,48.93,48.13,48.54,14429000\n19-Jul-07,47.73,49.09,47.52,48.40,16940200\n18-Jul-07,47.14,47.55,46.62,47.14,9301300\n17-Jul-07,47.38,47.88,47.02,47.51,11761700\n16-Jul-07,47.00,47.49,46.89,47.44,11758600\n13-Jul-07,47.05,47.34,46.60,47.25,12802900\n12-Jul-07,45.80,47.63,45.50,47.35,24605800\n11-Jul-07,44.80,45.65,44.69,45.65,14822400\n10-Jul-07,45.30,45.56,44.90,44.94,11834200\n9-Jul-07,45.84,45.84,45.33,45.36,10347600\n6-Jul-07,45.81,46.00,45.51,45.98,8221000\n5-Jul-07,45.36,45.97,45.15,45.90,8665300\n3-Jul-07,45.25,45.63,45.17,45.58,5208800\n2-Jul-07,45.25,45.36,44.82,45.19,8204100\n29-Jun-07,44.80,45.42,44.26,44.62,13790600\n28-Jun-07,44.95,45.34,44.45,44.61,10973200\n27-Jun-07,44.56,45.29,44.55,45.19,11194000\n26-Jun-07,45.14,45.34,44.45,44.64,13924100\n25-Jun-07,45.08,45.55,44.76,44.94,13430000\n22-Jun-07,45.50,45.80,45.07,45.18,21683600\n21-Jun-07,45.16,45.61,44.90,45.50,14839100\n20-Jun-07,46.00,46.00,45.03,45.04,13494400\n19-Jun-07,45.80,46.07,45.53,45.90,12056000\n18-Jun-07,45.64,45.95,45.55,45.89,11935300\n15-Jun-07,45.81,46.03,45.71,45.71,18432200\n14-Jun-07,45.70,45.90,45.32,45.67,11136300\n13-Jun-07,45.17,45.50,44.81,45.50,15624400\n12-Jun-07,45.58,45.91,45.03,45.06,14223800\n11-Jun-07,45.80,46.29,45.46,45.89,12665600\n8-Jun-07,45.32,45.80,45.04,45.78,13274100\n7-Jun-07,45.75,46.18,45.36,45.41,17101400\n6-Jun-07,45.80,46.19,45.53,46.03,15352600\n5-Jun-07,45.73,46.07,45.52,45.92,13657800\n4-Jun-07,45.76,46.00,45.27,45.98,11192100\n1-Jun-07,45.76,46.00,45.70,45.81,15391300\n31-May-07,45.61,45.86,45.51,45.71,14983600\n30-May-07,45.20,45.70,45.15,45.67,10822200\n29-May-07,45.51,45.86,45.23,45.56,14030200\n25-May-07,45.50,45.87,45.32,45.62,15979800\n24-May-07,45.47,45.87,45.25,45.40,17449700\n23-May-07,45.80,46.11,45.58,45.63,19229700\n22-May-07,45.18,45.76,45.00,45.58,14640300\n21-May-07,44.44,45.52,44.35,45.22,18749600\n18-May-07,45.04,45.04,44.15,44.58,17587100\n17-May-07,45.48,45.61,44.41,44.87,22008100\n16-May-07,45.19,45.23,44.31,45.21,15177000\n15-May-07,44.81,45.35,44.67,44.75,11851300\n14-May-07,45.30,45.30,44.81,45.02,9234600\n11-May-07,44.55,45.28,44.50,45.24,9873600\n10-May-07,44.65,44.84,44.38,44.67,13447000\n9-May-07,44.83,45.21,44.50,44.93,15989000\n8-May-07,44.81,45.13,43.98,45.01,35793200\n7-May-07,43.70,43.95,43.60,43.80,9915100\n4-May-07,43.37,43.86,43.11,43.79,16261900\n3-May-07,42.99,43.20,42.78,42.83,8838900\n2-May-07,42.78,43.09,42.78,42.93,10017200\n1-May-07,42.14,43.00,42.14,42.92,16892500\n30-Apr-07,42.14,42.59,42.10,42.14,10327100\n27-Apr-07,42.00,42.38,41.95,42.29,9839100\n26-Apr-07,41.65,42.25,41.54,42.04,14139300\n25-Apr-07,41.80,41.99,41.65,41.87,10038200\n24-Apr-07,41.64,42.00,41.15,41.65,12093600\n23-Apr-07,41.20,41.70,41.00,41.41,10566400\n20-Apr-07,41.45,41.61,41.10,41.37,11341200\n19-Apr-07,40.98,41.55,40.92,41.15,11883300\n18-Apr-07,41.00,41.12,40.46,40.98,12352800\n17-Apr-07,41.08,41.21,40.70,41.21,11709700\n16-Apr-07,41.18,41.26,40.79,41.19,10125300\n13-Apr-07,41.12,41.39,40.73,41.18,10399700\n12-Apr-07,40.62,41.21,40.44,41.12,10118900\n11-Apr-07,40.80,40.89,40.32,40.73,9705900\n10-Apr-07,41.39,41.88,40.35,40.72,14848200\n9-Apr-07,41.71,41.77,41.28,41.34,8435900\n5-Apr-07,40.98,41.88,40.82,41.80,12353300\n4-Apr-07,41.00,41.12,40.75,41.10,11685300\n3-Apr-07,40.35,40.99,40.34,40.89,11766800\n2-Apr-07,40.37,40.42,40.05,40.31,11209600\n30-Mar-07,40.10,40.37,39.49,40.14,13789000\n29-Mar-07,39.95,40.14,39.66,40.00,11092400\n28-Mar-07,40.00,40.18,39.53,39.79,11933000\n27-Mar-07,40.20,40.37,40.10,40.23,9064100\n26-Mar-07,40.44,40.55,40.00,40.44,10316800\n23-Mar-07,40.26,40.60,40.05,40.43,13660700\n22-Mar-07,40.50,40.55,39.87,40.45,12632800\n21-Mar-07,39.73,40.46,39.57,40.19,15204600\n20-Mar-07,40.07,40.25,39.56,39.61,16944200\n19-Mar-07,40.00,40.32,39.92,40.21,10721100\n16-Mar-07,40.20,40.30,39.85,39.91,23515300\n15-Mar-07,39.68,39.86,39.46,39.70,12379200\n14-Mar-07,39.70,39.98,39.28,39.79,17096900\n13-Mar-07,40.05,40.37,39.45,39.55,13859700\n12-Mar-07,39.92,40.48,39.90,40.37,10890400\n9-Mar-07,40.42,40.52,39.52,40.11,16922600\n8-Mar-07,40.50,40.52,40.15,40.27,13326200\n7-Mar-07,39.53,40.40,39.50,40.17,20973100\n6-Mar-07,39.10,39.81,39.02,39.43,17436000\n5-Mar-07,38.47,39.44,38.15,38.75,14215900\n2-Mar-07,38.93,39.20,38.55,38.67,14470000\n1-Mar-07,38.65,39.40,38.15,38.93,21867500\n28-Feb-07,38.66,39.60,38.51,39.35,25705200\n27-Feb-07,39.55,39.80,38.47,38.92,24080300\n26-Feb-07,40.91,40.93,40.24,40.29,12883300\n23-Feb-07,40.89,41.08,40.59,40.82,14421200\n22-Feb-07,41.22,41.30,40.21,40.78,25251100\n21-Feb-07,42.11,42.11,41.08,41.10,36027200\n20-Feb-07,42.56,43.24,42.50,43.13,15204200\n16-Feb-07,42.55,42.80,42.48,42.77,10229000\n15-Feb-07,42.72,42.98,42.57,42.68,9538400\n14-Feb-07,42.59,42.99,42.37,42.83,8252500\n13-Feb-07,42.38,42.77,42.06,42.59,8364600\n12-Feb-07,42.47,42.50,42.06,42.10,7837800\n9-Feb-07,42.65,42.74,42.10,42.23,7935200\n8-Feb-07,42.54,42.80,42.31,42.47,9362500\n7-Feb-07,42.00,42.69,42.00,42.30,9789500\n6-Feb-07,42.77,42.77,41.77,42.01,16819300\n5-Feb-07,42.05,43.00,42.01,42.81,10008700\n2-Feb-07,42.46,42.69,41.94,42.07,11444500\n1-Feb-07,42.60,43.12,42.23,42.36,16224400\n31-Jan-07,43.00,43.46,42.85,43.28,10510100\n30-Jan-07,42.50,43.22,42.34,43.11,13592900\n29-Jan-07,41.90,42.89,41.78,42.42,15534200\n26-Jan-07,41.75,42.10,41.36,41.69,9512700\n25-Jan-07,42.39,42.60,41.64,41.71,13314200\n24-Jan-07,42.31,42.78,42.25,42.39,9168800\n23-Jan-07,41.99,42.63,41.80,42.31,10450300\n22-Jan-07,42.05,42.18,41.42,42.02,11322700\n19-Jan-07,42.34,42.46,41.48,42.00,13542300\n18-Jan-07,42.70,42.70,41.84,42.34,15106900\n17-Jan-07,42.98,43.19,42.30,42.49,12184100\n16-Jan-07,43.35,43.49,43.05,43.20,10016900\n12-Jan-07,42.58,43.72,42.58,43.53,22505500\n11-Jan-07,42.05,42.79,41.95,42.64,11360700\n10-Jan-07,41.97,42.28,41.94,42.20,8727900\n9-Jan-07,42.08,42.39,41.89,42.20,11808900\n8-Jan-07,42.25,42.30,41.94,41.97,11451400\n5-Jan-07,41.64,42.27,41.48,42.20,17315400\n4-Jan-07,41.40,41.82,41.25,41.68,11896100\n3-Jan-07,41.05,41.75,41.05,41.62,17890400\n29-Dec-06,41.36,41.65,41.16,41.19,6257800\n28-Dec-06,41.42,41.65,41.28,41.36,7509100\n27-Dec-06,40.94,41.70,40.93,41.60,8855300\n26-Dec-06,40.57,41.03,40.56,40.93,6310900\n22-Dec-06,40.50,41.12,40.50,40.63,7131800\n21-Dec-06,41.10,41.23,40.50,40.80,13251700\n20-Dec-06,40.35,41.46,40.35,41.34,21073900\n19-Dec-06,40.05,40.50,40.00,40.43,14355300\n18-Dec-06,39.93,40.24,39.90,40.03,9639200\n15-Dec-06,39.96,40.27,39.86,39.94,15587200\n14-Dec-06,39.67,39.96,39.49,39.91,14290200\n13-Dec-06,39.90,39.95,39.47,39.67,15685000\n12-Dec-06,40.25,40.29,39.55,39.83,20333900\n11-Dec-06,39.56,40.18,39.43,40.01,18408800\n8-Dec-06,39.93,40.19,39.45,39.64,11620900\n7-Dec-06,40.05,40.22,39.77,39.86,11705800\n6-Dec-06,39.91,40.26,39.89,40.14,16968200\n5-Dec-06,39.75,40.01,39.73,39.91,13183600\n4-Dec-06,39.44,39.92,39.27,39.86,9423300\n1-Dec-06,39.46,39.80,39.21,39.44,10443400\n30-Nov-06,39.26,39.80,39.05,39.46,11974600\n29-Nov-06,39.15,39.45,39.05,39.39,11477400\n28-Nov-06,38.47,38.96,38.37,38.87,12418800\n27-Nov-06,39.39,39.45,38.62,38.64,15621400\n24-Nov-06,39.35,39.79,39.30,39.56,3928200\n22-Nov-06,39.92,39.96,39.45,39.72,12170200\n21-Nov-06,39.67,40.00,39.67,39.99,12100300\n20-Nov-06,39.69,40.05,39.44,39.71,19951500\n17-Nov-06,40.06,40.06,39.01,39.77,28452400\n16-Nov-06,40.00,40.25,39.72,40.13,26958000\n15-Nov-06,40.68,40.85,39.76,39.79,17797700\n14-Nov-06,40.13,40.75,39.90,40.67,12494100\n13-Nov-06,40.00,40.27,39.93,40.22,13436200\n10-Nov-06,39.74,40.00,39.53,39.99,12317200\n9-Nov-06,39.12,39.92,39.11,39.56,22887800\n8-Nov-06,38.70,39.00,38.51,38.88,11735400\n7-Nov-06,38.83,38.99,38.63,38.70,10704600\n6-Nov-06,38.22,38.80,38.22,38.73,9638600\n3-Nov-06,38.59,38.87,38.15,38.22,9584300\n2-Nov-06,38.56,38.83,38.45,38.59,7354900\n1-Nov-06,39.01,39.13,38.49,38.55,10071600\n31-Oct-06,38.90,39.10,38.50,38.74,12180100\n30-Oct-06,38.20,39.10,38.14,38.92,10262700\n27-Oct-06,38.90,39.22,38.25,38.46,13259600\n26-Oct-06,39.19,39.48,39.04,39.17,12117700\n25-Oct-06,39.56,39.68,38.92,39.17,14601500\n24-Oct-06,39.65,39.97,39.06,39.44,11505600\n23-Oct-06,39.20,40.10,39.20,39.87,14591200\n20-Oct-06,39.72,39.72,39.01,39.38,11549300\n19-Oct-06,38.96,39.68,38.76,39.56,14340600\n18-Oct-06,39.12,39.49,38.62,39.01,9461500\n17-Oct-06,38.52,39.15,38.27,39.06,11678200\n16-Oct-06,38.86,39.11,38.69,38.76,8714100\n13-Oct-06,38.22,39.00,38.22,38.86,12614600\n12-Oct-06,38.04,38.57,38.00,38.42,15553600\n11-Oct-06,37.93,38.33,37.78,37.87,15745300\n10-Oct-06,38.05,38.15,37.61,37.93,10504700\n9-Oct-06,37.57,38.00,37.44,38.00,11127800\n6-Oct-06,37.55,38.05,37.48,37.72,13692500\n5-Oct-06,37.62,37.84,37.47,37.84,11561500\n4-Oct-06,37.10,38.14,37.10,38.02,14999200\n3-Oct-06,37.20,37.50,36.85,37.42,15089300\n2-Oct-06,36.84,37.74,36.70,37.66,21047700\n29-Sep-06,36.50,37.11,36.50,36.69,23197700\n28-Sep-06,35.20,36.02,35.01,35.97,14901900\n27-Sep-06,35.40,35.75,35.15,35.39,15390500\n26-Sep-06,35.82,35.98,35.52,35.70,13918900\n25-Sep-06,35.20,35.87,34.93,35.71,20478200\n22-Sep-06,34.40,35.22,34.15,35.11,22522000\n21-Sep-06,36.05,36.25,34.55,34.87,41166700\n20-Sep-06,36.35,36.84,36.26,36.78,12025300\n19-Sep-06,36.18,36.49,36.01,36.35,9041200\n18-Sep-06,36.00,36.59,35.79,36.40,8892600\n15-Sep-06,36.48,36.88,36.11,36.18,14306300\n14-Sep-06,36.05,36.49,36.05,36.25,9789600\n13-Sep-06,36.75,36.75,35.87,36.37,15092300\n12-Sep-06,36.21,37.25,36.21,36.92,20316600\n11-Sep-06,35.75,36.62,35.71,36.36,12106500\n8-Sep-06,35.22,36.18,35.20,36.17,13302400\n7-Sep-06,35.45,35.75,35.21,35.42,12078600\n6-Sep-06,35.90,36.16,35.84,35.84,10427800\n5-Sep-06,36.50,36.54,36.20,36.46,9064200\n1-Sep-06,36.60,36.73,36.41,36.53,7334700\n31-Aug-06,35.80,36.70,35.80,36.56,14269100\n30-Aug-06,35.62,36.09,35.62,36.00,12183300\n29-Aug-06,35.33,35.82,35.25,35.76,7671600\n28-Aug-06,34.90,35.50,34.80,35.28,9823300\n25-Aug-06,35.20,35.45,35.13,35.23,6419500\n24-Aug-06,35.27,35.45,35.17,35.38,8438900\n23-Aug-06,35.20,35.48,35.01,35.26,8944500\n22-Aug-06,34.90,35.40,34.82,35.02,9600400\n21-Aug-06,35.27,35.35,34.87,34.89,11876300\n18-Aug-06,35.27,35.68,35.09,35.52,26969600\n17-Aug-06,36.59,36.73,34.75,35.15,55208800\n16-Aug-06,34.20,35.00,34.08,34.43,20476600\n15-Aug-06,33.70,34.14,33.56,33.99,16613900\n14-Aug-06,33.25,33.85,33.22,33.29,10170800\n11-Aug-06,32.80,33.08,32.68,33.05,7630000\n10-Aug-06,32.90,33.20,32.65,33.01,10190800\n9-Aug-06,33.26,33.55,32.97,33.06,9999600\n8-Aug-06,33.01,33.45,32.88,32.89,13180800\n7-Aug-06,32.26,33.08,32.14,32.74,10279100\n4-Aug-06,33.00,33.06,32.23,32.44,12197900\n3-Aug-06,32.45,32.89,32.08,32.59,7324300\n2-Aug-06,31.57,32.74,31.55,32.50,12526200\n1-Aug-06,31.57,31.90,31.30,31.67,9688100\n31-Jul-06,31.86,32.09,31.79,31.91,8925200\n28-Jul-06,32.28,32.41,31.92,32.11,10631100\n27-Jul-06,31.76,32.58,31.65,32.19,15834000\n26-Jul-06,30.57,32.19,30.30,31.75,20848000\n25-Jul-06,31.15,31.57,30.90,31.33,11840200\n24-Jul-06,30.48,31.41,30.48,31.07,12579000\n21-Jul-06,31.03,31.10,29.98,30.52,22549300\n20-Jul-06,32.15,32.76,31.77,31.80,10033200\n19-Jul-06,31.15,32.32,30.95,32.25,17744500\n18-Jul-06,30.80,31.28,30.44,30.95,14104700\n17-Jul-06,30.78,31.47,30.62,31.20,10861700\n14-Jul-06,31.00,31.27,30.71,30.76,15729900\n13-Jul-06,31.67,31.79,30.80,31.22,14122500\n12-Jul-06,32.32,32.52,31.56,31.67,12682800\n"
  },
  {
    "path": "examples/stockserver/IBM.csv",
    "content": "﻿Date,Open,High,Low,Close,Volume\n9-Jul-12,190.76,191.00,188.05,189.67,3988256\n6-Jul-12,193.92,193.94,189.74,191.41,4952950\n5-Jul-12,194.88,196.85,193.63,195.29,2690781\n3-Jul-12,195.46,196.34,194.91,195.93,1451425\n2-Jul-12,196.36,197.20,194.85,195.83,2831680\n29-Jun-12,194.55,195.81,192.41,195.58,5262273\n28-Jun-12,191.23,192.08,188.90,191.40,3967265\n27-Jun-12,192.14,193.70,190.90,193.00,2762612\n26-Jun-12,193.54,193.68,190.75,191.95,3436150\n25-Jun-12,192.48,193.39,191.68,192.86,3211529\n22-Jun-12,193.87,194.88,193.22,193.70,8833353\n21-Jun-12,199.07,199.45,193.19,193.39,4316544\n20-Jun-12,198.70,199.74,197.50,198.78,3378824\n19-Jun-12,198.83,199.99,198.80,198.93,3297517\n18-Jun-12,197.57,199.64,197.17,198.29,3378912\n15-Jun-12,196.08,199.27,195.40,199.10,6390633\n14-Jun-12,193.00,195.83,192.74,195.10,3584945\n13-Jun-12,194.36,195.19,192.34,193.10,3247653\n12-Jun-12,192.14,194.67,192.14,194.55,3023630\n11-Jun-12,196.60,196.70,192.37,192.51,3273511\n8-Jun-12,193.71,195.14,192.70,195.14,2476647\n7-Jun-12,195.28,195.83,193.94,194.44,3701066\n6-Jun-12,190.78,194.00,190.02,193.99,3645267\n5-Jun-12,187.92,189.85,187.56,189.20,3556762\n4-Jun-12,188.34,189.38,187.00,188.54,4625073\n1-Jun-12,190.12,191.72,188.60,189.08,5206323\n31-May-12,194.10,194.93,192.00,192.90,9290067\n30-May-12,194.80,195.47,193.77,194.53,3602417\n29-May-12,195.22,198.08,195.22,196.46,3618533\n25-May-12,195.11,196.00,194.00,194.30,2903063\n24-May-12,195.99,196.28,194.00,196.09,3569476\n23-May-12,195.53,196.49,193.20,196.12,4066664\n22-May-12,198.04,198.26,196.06,196.82,3567786\n21-May-12,195.98,197.93,194.63,197.76,3831863\n18-May-12,198.78,198.78,195.16,195.88,5737095\n17-May-12,199.67,200.79,197.64,197.89,5627456\n16-May-12,199.42,201.35,198.18,199.73,5001087\n15-May-12,199.44,201.47,198.76,199.04,2987339\n14-May-12,199.92,200.71,198.56,199.44,3029639\n11-May-12,199.96,202.12,199.95,201.17,2391580\n10-May-12,201.00,203.25,200.02,200.60,3831076\n9-May-12,199.99,203.00,199.06,201.23,3743290\n8-May-12,202.44,203.06,199.72,201.48,3881592\n7-May-12,203.96,204.77,202.90,203.75,3375923\n4-May-12,206.47,207.11,204.40,204.99,4024251\n3-May-12,208.27,208.92,206.55,207.24,2826568\n2-May-12,206.97,208.27,206.91,208.06,2360257\n1-May-12,207.18,208.93,206.71,208.00,2715870\n30-Apr-12,206.71,207.96,206.32,207.08,2773199\n27-Apr-12,206.47,208.17,205.91,206.81,3311119\n26-Apr-12,203.40,206.21,203.40,205.58,3304328\n25-Apr-12,202.02,203.69,201.80,203.57,4003311\n24-Apr-12,199.06,202.48,198.87,200.00,5631646\n23-Apr-12,197.89,199.10,196.79,198.62,3618928\n20-Apr-12,199.83,200.12,199.09,199.60,4758663\n19-Apr-12,200.03,201.26,197.52,199.51,5763201\n18-Apr-12,202.43,204.07,200.00,200.13,10155310\n17-Apr-12,204.57,207.64,204.15,207.45,6073651\n16-Apr-12,204.74,205.97,202.72,202.72,3827191\n13-Apr-12,204.32,204.65,202.80,202.80,3768117\n12-Apr-12,202.80,205.56,202.35,205.32,2929585\n11-Apr-12,203.99,204.32,202.46,202.58,3367363\n10-Apr-12,204.94,205.74,202.17,202.33,4132997\n9-Apr-12,204.40,206.17,203.37,204.94,3326810\n5-Apr-12,205.15,205.68,204.46,205.47,3809119\n4-Apr-12,206.22,206.98,205.19,206.05,4404078\n3-Apr-12,209.31,210.69,208.54,209.50,4091291\n2-Apr-12,208.96,209.69,208.09,209.47,3388035\n30-Mar-12,208.74,209.12,208.01,208.65,3217344\n29-Mar-12,206.09,208.50,206.02,208.27,3403665\n28-Mar-12,207.44,208.69,206.27,207.29,3265696\n27-Mar-12,208.46,208.66,207.00,207.18,2705065\n26-Mar-12,206.45,207.92,206.32,207.77,3418255\n23-Mar-12,205.89,205.96,204.56,205.48,3036189\n22-Mar-12,204.00,205.99,203.96,205.49,3308534\n21-Mar-12,204.32,205.77,204.30,204.69,3330241\n20-Mar-12,204.74,205.00,203.70,204.25,3695026\n19-Mar-12,205.71,206.53,204.50,205.72,3763177\n16-Mar-12,207.03,207.52,206.01,206.01,9638129\n15-Mar-12,204.94,206.18,204.74,206.00,3621170\n14-Mar-12,203.78,205.15,203.64,204.72,4602609\n13-Mar-12,201.72,203.90,201.61,203.78,4864835\n12-Mar-12,200.93,201.57,200.23,201.00,3119666\n9-Mar-12,199.98,201.10,199.72,200.62,3178143\n8-Mar-12,199.24,199.99,198.65,199.81,3145893\n7-Mar-12,198.09,198.57,197.31,197.77,3346878\n6-Mar-12,199.14,199.64,196.81,197.26,5215871\n5-Mar-12,198.36,201.19,198.30,200.66,6938659\n2-Mar-12,197.10,198.89,197.06,198.81,3727970\n1-Mar-12,197.23,198.47,196.93,197.53,3560706\n29-Feb-12,197.86,199.17,196.45,196.73,5120543\n28-Feb-12,197.75,198.96,197.43,197.98,3167481\n27-Feb-12,196.78,198.71,196.10,197.53,3758585\n24-Feb-12,198.38,198.56,196.61,197.76,3353242\n23-Feb-12,193.87,199.23,193.28,197.61,8034535\n22-Feb-12,193.03,194.74,192.75,193.87,3276029\n21-Feb-12,193.73,194.24,192.46,193.39,3294073\n17-Feb-12,193.71,193.86,192.30,193.42,3746679\n16-Feb-12,192.61,193.25,192.00,193.02,3525728\n15-Feb-12,192.31,193.44,191.26,192.25,4021139\n14-Feb-12,191.76,192.60,190.83,192.22,3398364\n13-Feb-12,193.31,193.69,191.74,192.62,2458889\n10-Feb-12,191.76,192.43,191.28,192.42,3391177\n9-Feb-12,193.03,194.46,192.55,193.13,3876530\n8-Feb-12,192.78,193.58,191.73,192.95,3804288\n7-Feb-12,192.45,194.14,191.97,193.35,3432953\n6-Feb-12,192.48,193.76,192.00,192.82,3639807\n3-Feb-12,192.93,194.13,192.54,193.64,4521636\n2-Feb-12,192.72,193.33,191.33,191.53,3907360\n1-Feb-12,193.21,194.81,192.41,192.62,5089251\n31-Jan-12,193.09,193.10,191.00,192.60,4827924\n30-Jan-12,189.39,192.73,188.22,192.50,4359045\n27-Jan-12,190.01,191.77,189.81,190.46,3360521\n26-Jan-12,191.79,192.79,190.47,190.98,4004615\n25-Jan-12,191.33,192.24,189.61,191.73,4360603\n24-Jan-12,188.63,192.30,188.52,191.93,5349750\n23-Jan-12,187.91,190.52,187.67,189.98,5751748\n20-Jan-12,185.77,188.97,184.75,188.52,12850227\n19-Jan-12,181.79,182.36,180.35,180.52,8575901\n18-Jan-12,179.83,181.60,179.50,181.07,4601271\n17-Jan-12,180.36,182.00,179.32,180.00,6003399\n13-Jan-12,179.16,179.16,179.16,179.16,0\n12-Jan-12,181.86,181.91,178.38,180.55,6880962\n11-Jan-12,180.73,182.81,180.50,182.32,4110952\n10-Jan-12,183.23,183.72,181.20,181.31,5161696\n9-Jan-12,182.20,182.27,180.27,181.59,5201266\n6-Jan-12,184.39,184.48,182.31,182.54,4897057\n5-Jan-12,184.81,185.03,183.10,184.66,4463267\n4-Jan-12,185.57,186.33,184.94,185.54,4346651\n3-Jan-12,186.73,188.71,186.00,186.30,5645999\n30-Dec-11,183.88,183.88,183.88,183.88,0\n29-Dec-11,184.07,186.23,184.01,186.18,2941990\n28-Dec-11,185.19,185.40,183.34,183.99,2873438\n27-Dec-11,184.97,185.85,184.39,184.95,2775314\n23-Dec-11,184.75,184.75,184.75,184.75,0\n22-Dec-11,182.71,182.80,181.00,182.04,5052410\n21-Dec-11,183.22,183.50,179.04,181.47,9284370\n20-Dec-11,185.50,187.33,184.76,187.24,4742825\n19-Dec-11,184.51,184.69,182.25,182.89,5039846\n16-Dec-11,188.01,188.01,181.91,183.57,11849737\n15-Dec-11,190.48,191.20,186.89,187.48,4475149\n14-Dec-11,189.84,190.28,188.00,188.72,5058143\n13-Dec-11,193.46,194.30,190.64,191.15,5009540\n12-Dec-11,193.64,193.90,191.22,192.18,3797497\n9-Dec-11,192.91,194.87,192.40,194.56,4848770\n8-Dec-11,192.48,193.80,191.07,191.58,4369089\n7-Dec-11,191.99,194.90,191.28,194.05,5083228\n6-Dec-11,190.65,193.53,190.32,192.94,4145053\n5-Dec-11,191.18,193.61,190.38,190.84,5699392\n2-Dec-11,189.92,191.33,189.45,189.66,4962414\n1-Dec-11,187.01,189.99,186.77,189.45,4862618\n30-Nov-11,184.57,188.35,184.21,188.00,7836882\n29-Nov-11,182.02,183.31,180.84,180.94,3662066\n28-Nov-11,182.71,182.93,180.67,182.21,4524289\n25-Nov-11,178.01,179.56,177.06,177.06,2232713\n23-Nov-11,177.95,177.95,177.95,177.95,0\n22-Nov-11,182.22,182.98,180.29,181.31,4179063\n21-Nov-11,183.37,183.96,180.00,181.48,5145072\n18-Nov-11,186.71,186.97,184.66,185.24,4441334\n17-Nov-11,186.81,188.83,183.39,185.73,5840520\n16-Nov-11,187.82,189.90,186.30,186.62,4619536\n15-Nov-11,187.49,189.97,185.64,188.75,4585232\n14-Nov-11,189.17,189.84,186.85,187.35,6047079\n11-Nov-11,185.27,187.83,185.14,187.38,3665309\n10-Nov-11,183.58,184.77,181.87,183.35,3881958\n9-Nov-11,184.20,185.24,181.16,182.24,5495014\n8-Nov-11,187.48,187.88,185.51,187.25,4331568\n7-Nov-11,186.22,187.73,184.75,187.32,3531095\n4-Nov-11,186.27,187.14,184.74,186.38,3237874\n3-Nov-11,185.13,187.78,184.02,187.30,4953637\n2-Nov-11,184.00,185.25,183.03,183.92,4136703\n1-Nov-11,181.55,183.26,180.74,181.35,5883336\n31-Oct-11,185.59,186.91,184.63,184.63,4709968\n28-Oct-11,185.57,188.07,185.28,187.45,5009820\n27-Oct-11,184.99,187.00,183.18,186.34,7057876\n26-Oct-11,181.74,182.28,179.03,181.97,5387883\n25-Oct-11,181.66,182.97,180.01,180.36,5374054\n24-Oct-11,181.51,183.39,180.62,182.25,5891258\n21-Oct-11,179.11,181.67,178.75,181.63,8055801\n20-Oct-11,178.13,179.24,176.17,177.25,7514283\n19-Oct-11,179.68,179.81,177.01,177.39,6708371\n18-Oct-11,178.00,179.38,176.25,178.90,15729689\n17-Oct-11,189.71,190.16,185.90,186.59,8790278\n14-Oct-11,188.19,190.53,187.73,190.53,5368616\n13-Oct-11,184.97,187.50,184.50,186.82,4399267\n12-Oct-11,186.08,188.00,185.65,186.12,5338149\n11-Oct-11,184.59,186.00,184.11,185.00,5330581\n10-Oct-11,183.00,186.63,182.90,186.62,5786341\n7-Oct-11,182.32,183.72,181.64,182.39,6842567\n6-Oct-11,176.81,181.99,175.66,181.69,7181124\n5-Oct-11,174.57,177.30,172.68,176.85,5851856\n4-Oct-11,171.54,175.07,168.88,174.74,9175346\n3-Oct-11,174.36,177.92,173.04,173.29,9043214\n30-Sep-11,176.01,178.27,174.75,174.87,7851584\n29-Sep-11,179.69,180.91,175.53,179.17,6944293\n28-Sep-11,177.97,180.75,177.08,177.55,7732274\n27-Sep-11,176.82,179.62,176.43,177.71,7640243\n26-Sep-11,170.96,174.70,169.86,174.51,6745650\n23-Sep-11,166.99,169.54,165.76,169.34,5586589\n22-Sep-11,168.33,169.97,166.50,168.62,8195806\n21-Sep-11,175.00,177.67,172.62,173.02,7043250\n20-Sep-11,173.57,177.43,172.70,174.72,6209893\n19-Sep-11,169.50,173.87,169.43,173.13,4757407\n16-Sep-11,171.33,172.99,169.74,172.99,11049058\n15-Sep-11,168.64,170.16,167.23,170.09,5464433\n14-Sep-11,164.01,169.66,161.99,167.24,6981043\n13-Sep-11,163.64,163.92,161.54,163.43,4723740\n12-Sep-11,160.04,162.44,158.76,162.42,5247581\n9-Sep-11,164.57,165.19,160.81,161.37,6743810\n8-Sep-11,167.00,169.58,165.10,165.25,6028321\n7-Sep-11,167.28,167.90,166.16,167.31,6798585\n6-Sep-11,163.06,165.55,162.20,165.11,5761373\n2-Sep-11,167.69,168.93,166.00,166.98,4979011\n1-Sep-11,172.71,173.68,170.12,170.33,5463880\n31-Aug-11,173.29,173.72,170.71,171.91,6074660\n30-Aug-11,172.06,173.51,170.88,172.51,4478665\n29-Aug-11,170.58,172.72,170.36,172.62,5294197\n26-Aug-11,164.85,169.33,163.28,169.14,6438785\n25-Aug-11,167.52,168.53,164.85,165.58,6759181\n24-Aug-11,164.13,166.83,163.35,166.76,6427240\n23-Aug-11,160.65,164.59,159.53,164.32,6924129\n22-Aug-11,161.35,161.68,157.62,158.98,7253910\n19-Aug-11,162.17,163.94,157.13,157.54,14072336\n18-Aug-11,166.32,166.46,160.16,163.83,15083690\n17-Aug-11,171.57,172.99,169.89,171.48,5130785\n16-Aug-11,172.19,172.19,169.00,171.24,5585496\n15-Aug-11,171.32,174.00,170.39,172.99,7645358\n12-Aug-11,168.50,169.38,165.83,168.20,5186931\n11-Aug-11,164.10,168.77,162.94,166.73,9176528\n10-Aug-11,168.18,169.23,161.85,162.54,13994800\n9-Aug-11,167.46,171.05,162.00,170.61,12517923\n8-Aug-11,168.83,172.61,166.00,166.22,15805887\n5-Aug-11,172.10,174.22,166.52,172.98,11872201\n4-Aug-11,176.50,177.92,171.18,171.48,11023189\n3-Aug-11,177.67,179.23,175.41,178.83,6724029\n2-Aug-11,179.95,182.29,177.86,178.05,5770372\n1-Aug-11,182.60,183.69,178.44,180.75,5845944\n29-Jul-11,180.26,183.43,179.73,181.85,6667438\n28-Jul-11,181.06,183.27,180.88,181.80,4478779\n27-Jul-11,182.01,182.91,180.93,181.35,5806806\n26-Jul-11,182.94,184.05,182.65,182.93,4356291\n25-Jul-11,183.89,184.96,183.28,183.70,4988243\n22-Jul-11,184.64,185.63,184.26,185.18,4517396\n21-Jul-11,183.59,185.50,182.90,184.90,4959316\n20-Jul-11,183.84,184.42,183.00,183.65,5902862\n19-Jul-11,178.74,185.21,178.65,185.21,13248767\n18-Jul-11,174.73,176.46,173.58,175.28,8879640\n15-Jul-11,175.08,175.94,174.07,175.54,5350142\n14-Jul-11,174.40,176.10,173.84,174.23,4613459\n13-Jul-11,174.90,176.32,174.00,174.32,4074888\n12-Jul-11,174.93,175.37,173.89,174.05,5036955\n11-Jul-11,174.90,176.15,174.61,174.99,4766847\n8-Jul-11,175.49,176.49,175.01,176.49,4400429\n7-Jul-11,176.78,177.27,176.12,176.48,5907150\n6-Jul-11,175.19,177.77,175.09,177.71,5887048\n5-Jul-11,173.52,175.43,173.52,175.43,4586423\n1-Jul-11,174.54,174.54,174.54,174.54,0\n30-Jun-11,171.11,172.45,170.75,171.55,5105362\n29-Jun-11,170.61,170.86,169.82,170.54,3817296\n28-Jun-11,168.33,170.70,168.01,170.01,4850127\n27-Jun-11,165.74,168.24,165.21,167.62,4446954\n24-Jun-11,165.85,165.94,164.57,165.07,4405237\n23-Jun-11,164.06,166.73,163.80,166.12,5271671\n22-Jun-11,165.59,166.81,165.10,165.68,3963254\n21-Jun-11,165.20,166.75,164.00,166.22,5388285\n20-Jun-11,163.70,165.61,163.59,165.02,3956099\n17-Jun-11,164.24,165.10,163.58,164.44,7153383\n16-Jun-11,162.06,163.63,161.78,162.67,4861065\n15-Jun-11,162.75,163.41,161.52,162.33,5225995\n14-Jun-11,163.87,164.57,163.65,164.12,7050074\n13-Jun-11,164.44,164.46,162.73,163.17,5099508\n10-Jun-11,164.57,164.84,162.87,163.18,4686370\n9-Jun-11,165.01,165.96,164.76,164.84,4299799\n8-Jun-11,163.27,164.85,163.26,164.34,3850732\n7-Jun-11,165.11,165.24,163.61,163.69,4189497\n6-Jun-11,164.76,165.58,164.27,164.75,3619681\n3-Jun-11,164.30,165.89,164.13,165.05,5230500\n2-Jun-11,166.44,167.10,165.71,166.09,3854020\n1-Jun-11,168.90,169.58,166.50,166.56,5134779\n31-May-11,168.44,169.89,167.82,168.93,9130673\n27-May-11,167.50,167.50,167.50,167.50,0\n26-May-11,167.46,167.50,165.90,167.18,5775929\n25-May-11,167.63,168.40,167.51,167.75,3884049\n24-May-11,168.50,168.67,167.51,167.99,4643753\n23-May-11,168.58,168.69,167.07,168.26,5150032\n20-May-11,170.40,171.15,169.38,170.16,4873602\n19-May-11,170.86,171.40,169.32,170.59,3540005\n18-May-11,170.10,171.19,169.46,170.44,4157195\n17-May-11,167.85,171.41,166.53,170.50,8793885\n16-May-11,169.81,170.64,168.31,168.86,4662973\n13-May-11,171.70,172.15,169.44,169.92,5168995\n12-May-11,169.65,172.77,168.65,172.24,5142809\n11-May-11,170.30,170.52,167.82,169.50,4665303\n10-May-11,169.25,170.90,169.22,170.38,4936698\n9-May-11,168.39,169.85,168.31,169.10,3591728\n6-May-11,169.03,170.15,168.24,168.89,4839438\n5-May-11,170.47,170.87,167.50,168.46,7338670\n4-May-11,172.36,172.62,169.59,170.62,6894585\n3-May-11,172.00,173.48,171.23,172.87,5009923\n2-May-11,172.11,173.54,171.49,172.15,5397951\n29-Apr-11,171.10,173.00,170.48,170.58,5588010\n28-Apr-11,169.99,171.38,169.70,170.78,5090377\n27-Apr-11,168.61,170.59,168.46,170.37,5299720\n26-Apr-11,167.99,169.20,167.40,168.49,7267376\n25-Apr-11,167.65,168.77,167.23,167.67,3584142\n21-Apr-11,168.28,168.28,168.28,168.28,0\n20-Apr-11,163.10,165.89,162.19,164.75,10901117\n19-Apr-11,165.71,166.38,164.44,165.40,6597435\n18-Apr-11,164.64,166.16,162.86,165.94,6164069\n15-Apr-11,165.00,166.34,164.87,166.21,5291077\n14-Apr-11,163.84,165.36,163.16,164.97,4702262\n13-Apr-11,163.97,164.93,163.66,163.95,4185429\n12-Apr-11,163.36,163.77,162.30,163.25,3863367\n11-Apr-11,163.44,164.00,163.11,163.95,4141248\n8-Apr-11,164.35,164.38,163.16,164.05,3326158\n7-Apr-11,164.10,164.55,163.28,164.38,3670064\n6-Apr-11,164.34,164.75,163.81,164.04,3776524\n5-Apr-11,163.81,164.70,163.62,163.99,3616188\n4-Apr-11,164.42,164.73,163.58,164.25,3226474\n1-Apr-11,163.70,164.42,163.04,164.27,4388206\n31-Mar-11,163.40,164.06,163.07,163.07,3862368\n30-Mar-11,163.55,163.99,163.02,163.60,3396852\n29-Mar-11,161.34,163.09,161.15,162.88,3460830\n28-Mar-11,161.54,162.58,161.12,161.37,3973680\n25-Mar-11,160.98,162.74,160.76,162.18,5351526\n24-Mar-11,160.23,160.71,158.84,160.04,5150081\n23-Mar-11,158.00,160.08,157.53,159.53,4783305\n22-Mar-11,158.56,158.61,157.52,158.00,4312353\n21-Mar-11,157.64,159.63,157.07,157.68,5784527\n18-Mar-11,156.50,156.95,154.32,155.89,11454323\n17-Mar-11,154.00,154.50,152.70,154.18,7378767\n16-Mar-11,156.52,156.98,151.71,153.00,12204867\n15-Mar-11,157.35,159.64,156.88,159.02,6484954\n14-Mar-11,161.16,161.98,160.09,161.39,4304870\n11-Mar-11,162.40,163.24,160.84,162.43,4271968\n10-Mar-11,164.64,164.67,161.38,162.02,7052811\n9-Mar-11,163.47,167.72,163.28,165.86,9084892\n8-Mar-11,159.70,163.43,159.21,162.28,5392122\n7-Mar-11,161.60,162.98,158.85,159.93,5318064\n4-Mar-11,163.40,164.31,160.65,161.83,4913666\n3-Mar-11,161.42,164.00,161.27,163.48,4065346\n2-Mar-11,159.43,161.11,159.41,160.16,3413127\n1-Mar-11,163.15,163.15,159.88,159.97,4383043\n28-Feb-11,162.36,162.99,161.24,161.88,4773936\n25-Feb-11,161.06,162.34,160.86,162.28,4522003\n24-Feb-11,159.63,161.27,159.03,160.77,5709476\n23-Feb-11,161.81,162.68,160.14,160.18,6001475\n22-Feb-11,163.57,164.26,161.78,161.95,5210857\n18-Feb-11,164.84,164.84,164.84,164.84,0\n17-Feb-11,163.30,164.67,162.85,164.24,3231171\n16-Feb-11,163.33,163.60,162.75,163.40,3221301\n15-Feb-11,162.89,163.57,162.52,162.84,3768703\n14-Feb-11,164.18,164.38,162.85,163.22,4131438\n11-Feb-11,163.98,165.01,163.31,163.85,5185697\n10-Feb-11,163.90,165.00,163.18,164.09,5737806\n9-Feb-11,165.62,165.97,164.10,164.65,4635303\n8-Feb-11,164.82,166.25,164.32,166.05,5615348\n7-Feb-11,164.08,164.99,164.02,164.82,4932599\n4-Feb-11,163.48,164.14,163.22,164.00,3755814\n3-Feb-11,163.16,164.20,162.81,163.53,4685095\n2-Feb-11,163.40,163.60,162.61,163.30,3904892\n1-Feb-11,162.11,163.94,162.00,163.56,5834162\n31-Jan-11,159.18,162.00,158.68,162.00,7197200\n28-Jan-11,161.05,161.92,158.67,159.21,6725708\n27-Jan-11,161.43,162.18,160.86,161.07,4879977\n26-Jan-11,161.67,161.90,160.42,161.04,5353895\n25-Jan-11,159.21,164.35,159.00,161.44,8262242\n24-Jan-11,155.42,159.79,155.33,159.63,7288661\n21-Jan-11,156.40,156.78,154.96,155.50,7009010\n20-Jan-11,154.53,155.96,154.45,155.80,7441447\n19-Jan-11,153.26,156.13,152.83,155.69,12143645\n18-Jan-11,149.82,151.46,149.38,150.65,9176829\n14-Jan-11,150.00,150.00,150.00,150.00,0\n13-Jan-11,149.24,149.29,148.25,148.82,3445785\n12-Jan-11,147.99,149.29,147.67,149.10,4091442\n11-Jan-11,148.20,148.35,146.75,147.28,4164771\n10-Jan-11,147.58,148.06,147.23,147.64,3633350\n7-Jan-11,148.79,148.86,146.94,147.93,4136379\n6-Jan-11,147.13,148.79,146.82,148.66,5032270\n5-Jan-11,147.34,147.48,146.73,147.05,4659195\n4-Jan-11,147.56,148.22,146.64,147.64,5060088\n3-Jan-11,147.21,148.20,147.14,147.48,4604911\n31-Dec-10,146.73,147.07,145.96,146.76,2969933\n30-Dec-10,146.36,147.11,146.25,146.67,3039004\n29-Dec-10,146.00,147.50,145.71,146.52,3662739\n28-Dec-10,145.31,146.15,145.06,145.71,2700968\n27-Dec-10,145.12,145.70,145.00,145.34,2314687\n23-Dec-10,145.89,145.89,145.89,145.89,0\n22-Dec-10,145.66,146.40,145.58,145.95,3388801\n21-Dec-10,144.99,145.99,144.33,145.74,3779240\n20-Dec-10,145.39,145.54,144.39,144.51,3994963\n17-Dec-10,144.69,145.50,144.40,145.00,10026946\n16-Dec-10,144.84,145.32,144.15,144.55,4178664\n15-Dec-10,145.13,145.72,144.31,144.72,4447397\n14-Dec-10,144.26,146.01,144.26,145.82,4804172\n13-Dec-10,145.14,145.40,144.21,144.28,4741876\n10-Dec-10,144.88,144.95,143.73,144.82,3503880\n9-Dec-10,145.94,145.94,143.52,144.30,4406114\n8-Dec-10,144.35,145.65,143.84,144.98,4962115\n7-Dec-10,146.02,146.30,143.87,144.02,4830430\n6-Dec-10,144.54,145.87,144.52,144.99,3321951\n3-Dec-10,144.25,145.68,144.25,145.38,3710884\n2-Dec-10,144.33,145.85,144.30,145.18,5375523\n1-Dec-10,143.61,145.13,143.51,144.41,6826974\n30-Nov-10,142.24,142.76,141.28,141.46,7676320\n29-Nov-10,143.53,143.67,141.50,142.89,5040206\n26-Nov-10,145.30,145.30,143.57,143.90,2081260\n24-Nov-10,145.81,145.81,145.81,145.81,0\n23-Nov-10,144.24,144.53,142.33,143.18,4573145\n22-Nov-10,144.00,145.43,143.56,145.39,3730686\n19-Nov-10,144.38,145.35,143.99,145.05,5015957\n18-Nov-10,143.04,144.99,142.75,144.36,4238874\n17-Nov-10,142.49,142.49,141.39,141.95,4787048\n16-Nov-10,142.93,143.38,141.18,142.24,6350519\n15-Nov-10,143.89,144.75,143.27,143.64,3828151\n12-Nov-10,144.59,145.77,143.55,143.74,4732937\n11-Nov-10,144.70,145.50,143.35,145.43,4752261\n10-Nov-10,146.09,146.79,145.63,146.55,5175737\n9-Nov-10,146.70,147.53,145.63,146.14,5701284\n8-Nov-10,145.35,146.58,145.25,146.46,4459904\n5-Nov-10,145.94,146.93,145.67,146.92,4996376\n4-Nov-10,144.82,146.84,144.71,146.79,6626305\n3-Nov-10,144.24,144.46,142.63,144.17,5182447\n2-Nov-10,143.85,144.71,143.71,143.84,4626496\n1-Nov-10,143.64,144.26,142.32,143.32,5676036\n29-Oct-10,140.90,144.00,140.75,143.60,8444096\n28-Oct-10,141.84,141.95,140.42,140.90,5482601\n27-Oct-10,139.52,141.57,139.00,141.43,6467113\n26-Oct-10,139.29,142.00,138.53,140.67,7328198\n25-Oct-10,140.42,141.40,139.81,139.84,4870212\n22-Oct-10,140.15,140.75,139.46,139.67,4105312\n21-Oct-10,139.81,140.49,138.40,139.83,6230393\n20-Oct-10,138.28,139.87,138.13,139.07,6954831\n19-Oct-10,137.30,139.34,136.70,138.03,14160546\n18-Oct-10,140.90,143.03,140.84,142.83,10341157\n15-Oct-10,142.10,142.10,140.54,141.06,7224057\n14-Oct-10,140.35,141.50,139.69,141.50,5658943\n13-Oct-10,139.91,141.48,139.78,140.37,8788326\n12-Oct-10,138.40,139.99,138.27,139.85,5639174\n11-Oct-10,138.79,139.94,138.64,139.66,4009658\n8-Oct-10,138.40,139.09,138.06,138.85,4543943\n7-Oct-10,137.92,138.88,137.52,138.72,6440718\n6-Oct-10,136.88,137.96,136.83,137.84,4782906\n5-Oct-10,136.18,137.90,136.12,137.66,6202496\n4-Oct-10,135.23,135.92,134.39,135.25,4063858\n1-Oct-10,135.51,136.28,135.09,135.64,5621197\n30-Sep-10,135.50,136.11,133.67,134.14,6432129\n29-Sep-10,134.40,135.80,134.34,135.48,5151624\n28-Sep-10,134.67,135.14,133.71,134.89,7484022\n27-Sep-10,133.51,135.00,133.51,134.65,6155512\n24-Sep-10,132.42,134.15,132.34,134.11,7122325\n23-Sep-10,131.42,132.78,131.22,131.67,3898904\n22-Sep-10,131.61,132.58,131.40,132.57,4922526\n21-Sep-10,131.45,132.80,130.78,131.98,5268605\n20-Sep-10,130.24,132.09,130.11,131.79,7214702\n17-Sep-10,129.92,130.60,129.70,130.19,10397659\n16-Sep-10,129.20,129.95,128.80,129.67,4685578\n15-Sep-10,128.65,129.96,128.54,129.43,4762454\n14-Sep-10,128.43,129.92,128.43,128.85,4851469\n13-Sep-10,128.63,130.00,128.52,129.61,5272370\n10-Sep-10,126.99,128.29,126.26,127.99,4419379\n9-Sep-10,127.27,127.57,126.15,126.36,3437612\n8-Sep-10,126.02,126.52,125.39,126.08,4486438\n7-Sep-10,126.99,127.36,125.88,125.95,4353927\n6-Sep-10,127.58,127.58,127.58,127.58,0\n3-Sep-10,127.58,127.58,127.58,127.58,0\n2-Sep-10,126.03,126.23,124.65,125.04,5104538\n1-Sep-10,125.31,126.31,124.52,125.77,5624070\n31-Aug-10,123.31,123.99,122.28,123.05,5659755\n30-Aug-10,125.08,125.27,123.40,123.40,3603963\n27-Aug-10,123.83,124.80,122.42,124.73,6214197\n26-Aug-10,125.78,125.78,122.78,122.78,7748597\n25-Aug-10,124.57,125.60,124.00,125.27,5239579\n24-Aug-10,125.21,126.02,124.57,124.90,5624039\n23-Aug-10,127.57,128.03,126.44,126.47,4034693\n20-Aug-10,128.72,128.98,126.96,127.50,6246279\n19-Aug-10,128.67,129.59,128.02,128.90,5402547\n18-Aug-10,128.87,130.20,127.80,129.39,4883300\n17-Aug-10,128.83,129.85,127.90,128.45,4298556\n16-Aug-10,127.47,128.23,126.96,127.77,4009130\n13-Aug-10,127.96,128.46,127.33,127.87,4670519\n12-Aug-10,127.69,128.78,127.52,128.30,5132391\n11-Aug-10,130.69,130.69,129.46,129.83,6318083\n10-Aug-10,131.18,132.49,130.77,131.84,5471688\n9-Aug-10,130.79,132.34,130.40,132.00,6135341\n6-Aug-10,130.41,130.48,128.76,130.14,6137850\n5-Aug-10,130.73,131.98,130.53,131.83,4523103\n4-Aug-10,130.46,131.50,129.85,131.27,4573074\n3-Aug-10,130.03,131.04,129.33,130.37,5091953\n2-Aug-10,129.25,131.20,129.25,130.76,6437441\n30-Jul-10,127.43,128.98,127.04,128.40,6025837\n29-Jul-10,129.06,129.50,127.14,128.02,8997318\n28-Jul-10,128.67,129.35,127.88,128.43,4252631\n27-Jul-10,128.78,129.17,127.89,128.63,4648527\n26-Jul-10,128.18,128.43,127.14,128.41,5172270\n23-Jul-10,127.30,128.80,127.00,128.38,5077974\n22-Jul-10,126.32,127.78,126.05,127.47,6909088\n21-Jul-10,126.44,126.50,124.62,125.27,8615430\n20-Jul-10,122.97,126.56,122.93,126.55,16340314\n19-Jul-10,128.67,130.38,128.37,129.79,8388587\n16-Jul-10,129.96,130.15,127.85,128.03,7002854\n15-Jul-10,129.87,130.92,129.55,130.72,6187523\n14-Jul-10,129.32,131.60,129.14,130.72,6607133\n13-Jul-10,128.97,130.98,128.69,130.48,6687660\n12-Jul-10,127.37,128.83,127.16,128.67,4206871\n9-Jul-10,127.90,128.20,127.29,127.96,3898464\n8-Jul-10,127.37,128.15,126.74,127.97,5439963\n7-Jul-10,123.47,127.12,123.47,127.00,7090291\n6-Jul-10,123.58,124.63,122.17,123.46,6348708\n5-Jul-10,121.86,121.86,121.86,121.86,0\n2-Jul-10,121.86,121.86,121.86,121.86,0\n1-Jul-10,123.55,124.21,121.61,122.57,9742208\n30-Jun-10,124.83,125.22,123.00,123.48,8017939\n29-Jun-10,127.35,128.40,124.12,125.09,9378799\n28-Jun-10,127.65,129.47,127.22,128.98,6335135\n25-Jun-10,128.34,129.10,127.12,127.12,10420671\n24-Jun-10,129.57,129.73,127.70,128.19,5565558\n23-Jun-10,129.25,131.47,129.09,130.11,6855741\n22-Jun-10,130.37,131.47,129.07,129.30,6030623\n21-Jun-10,131.42,131.94,130.22,130.65,6857800\n18-Jun-10,131.02,131.25,130.13,130.15,9581587\n17-Jun-10,130.07,131.03,129.86,130.98,5575129\n16-Jun-10,128.34,130.68,128.34,130.35,6400971\n15-Jun-10,128.93,129.95,128.37,129.79,6652612\n14-Jun-10,128.50,129.97,128.49,128.50,6753113\n11-Jun-10,126.73,128.80,126.44,128.45,5827093\n10-Jun-10,125.99,128.22,125.80,127.68,7479610\n9-Jun-10,124.83,125.84,123.58,123.90,7800309\n8-Jun-10,124.26,124.46,122.82,123.72,8399126\n7-Jun-10,125.57,125.86,124.13,124.13,6951325\n4-Jun-10,126.37,127.10,124.67,125.28,9669111\n3-Jun-10,127.75,128.22,126.46,127.96,6645219\n2-Jun-10,124.85,127.50,124.35,127.41,7705556\n1-Jun-10,124.69,126.88,124.20,124.34,7136082\n31-May-10,125.26,125.26,125.26,125.26,0\n28-May-10,125.26,125.26,125.26,125.26,0\n27-May-10,125.05,126.39,124.77,126.39,7726560\n26-May-10,124.89,125.94,123.00,123.23,9085936\n25-May-10,121.47,124.95,121.47,124.52,9498873\n24-May-10,125.26,126.02,124.04,124.45,6876074\n21-May-10,122.16,125.61,121.40,125.42,12639577\n20-May-10,127.22,127.96,123.68,123.80,13178148\n19-May-10,129.37,130.50,127.82,128.86,8669840\n18-May-10,131.26,131.99,129.90,129.95,9332110\n17-May-10,130.68,131.76,128.70,130.44,8924745\n14-May-10,131.06,131.67,129.41,131.19,9920567\n13-May-10,130.93,133.10,130.85,131.48,10498358\n12-May-10,127.16,132.85,127.01,132.68,16629704\n11-May-10,125.21,128.42,125.15,126.89,6499773\n10-May-10,126.27,126.67,125.06,126.27,8464250\n7-May-10,123.36,124.39,120.00,122.10,10585340\n6-May-10,126.29,127.93,116.00,123.92,13169697\n5-May-10,127.12,128.23,126.87,127.46,6072834\n4-May-10,128.89,128.93,126.58,128.12,8285289\n3-May-10,129.39,130.14,128.80,129.60,4992019\n30-Apr-10,130.43,130.64,128.84,129.00,6266689\n29-Apr-10,130.55,131.21,130.15,130.46,5786888\n28-Apr-10,129.40,130.47,129.03,130.10,7123602\n27-Apr-10,129.90,132.00,128.71,128.82,10917510\n26-Apr-10,129.76,131.04,129.54,130.73,5285484\n23-Apr-10,129.08,130.10,128.71,129.99,6197382\n22-Apr-10,128.64,129.36,127.77,129.13,6018690\n21-Apr-10,129.87,130.27,128.50,128.99,7560015\n20-Apr-10,129.20,130.33,128.26,129.69,15218573\n19-Apr-10,130.38,132.28,130.38,132.23,11353679\n16-Apr-10,130.68,132.17,130.25,130.63,9549798\n15-Apr-10,130.53,131.14,130.19,130.89,6425399\n14-Apr-10,129.73,131.42,129.46,131.25,8545857\n13-Apr-10,128.26,129.44,127.84,129.03,6821802\n12-Apr-10,128.57,128.96,128.24,128.36,3994168\n9-Apr-10,127.88,128.87,127.12,128.76,5186516\n8-Apr-10,128.04,128.23,127.20,127.61,6006833\n7-Apr-10,128.53,129.27,128.01,128.48,5157358\n6-Apr-10,128.68,129.30,128.05,128.93,3926409\n5-Apr-10,128.38,129.80,128.14,129.35,4118884\n2-Apr-10,128.25,128.25,128.25,128.25,0\n1-Apr-10,128.25,128.25,128.25,128.25,0\n31-Mar-10,128.23,128.75,127.65,128.25,4904711\n30-Mar-10,128.90,129.13,128.25,128.77,3426538\n29-Mar-10,129.30,129.95,128.26,128.59,4643265\n26-Mar-10,128.93,129.78,128.72,129.26,5550705\n25-Mar-10,129.36,130.73,129.13,129.24,7605394\n24-Mar-10,128.63,129.95,128.47,128.53,6669246\n23-Mar-10,127.94,129.43,127.64,129.37,5979298\n22-Mar-10,127.11,128.39,126.57,127.98,5651866\n19-Mar-10,128.84,128.93,126.78,127.71,10744286\n18-Mar-10,127.46,128.75,127.45,128.38,4954633\n17-Mar-10,128.90,128.93,127.36,127.76,6348995\n16-Mar-10,128.00,128.88,127.45,128.67,6135031\n15-Mar-10,127.40,128.34,127.28,127.83,4544089\n12-Mar-10,127.91,128.37,127.51,127.94,5170094\n11-Mar-10,125.71,127.81,125.71,127.60,7929401\n10-Mar-10,125.98,126.36,125.21,125.62,6917512\n9-Mar-10,126.27,126.29,125.20,125.55,7529306\n8-Mar-10,127.06,127.50,126.36,126.41,6199570\n5-Mar-10,127.17,127.55,127.04,127.25,6140472\n4-Mar-10,127.07,127.07,125.47,126.72,6032328\n3-Mar-10,127.73,128.02,126.68,126.88,6389967\n2-Mar-10,128.70,129.09,127.13,127.42,6013437\n1-Mar-10,127.50,128.83,127.47,128.57,4577715\n26-Feb-10,127.01,128.00,126.74,127.16,4784139\n25-Feb-10,126.05,127.24,125.57,127.07,5658776\n24-Feb-10,127.02,128.27,126.81,127.59,4782100\n23-Feb-10,126.48,127.66,126.00,126.46,4594376\n22-Feb-10,127.30,127.43,126.31,126.85,3808077\n19-Feb-10,127.35,128.06,126.87,127.19,6303678\n18-Feb-10,126.13,128.00,126.00,127.81,5527576\n17-Feb-10,125.50,126.53,125.21,126.33,5827357\n16-Feb-10,124.91,125.23,124.11,125.23,6777265\n15-Feb-10,124.00,124.00,124.00,124.00,0\n12-Feb-10,124.00,124.00,124.00,124.00,0\n11-Feb-10,122.58,124.20,122.06,123.73,5091096\n10-Feb-10,122.94,123.65,122.21,122.81,5219260\n9-Feb-10,122.65,124.20,122.46,123.21,6044966\n8-Feb-10,123.15,123.22,121.74,121.88,5719389\n5-Feb-10,123.04,123.72,121.83,123.52,8618019\n4-Feb-10,125.19,125.44,122.90,123.00,9129991\n3-Feb-10,125.16,126.07,125.07,125.66,4177981\n2-Feb-10,124.79,125.81,123.95,125.53,5900187\n1-Feb-10,123.23,124.95,122.78,124.67,7249873\n29-Jan-10,124.32,125.00,121.90,122.39,11572387\n28-Jan-10,127.03,127.04,123.05,123.75,9622829\n27-Jan-10,125.82,126.96,125.04,126.33,8719447\n26-Jan-10,125.92,127.75,125.41,125.75,7136640\n25-Jan-10,126.33,126.90,125.71,126.12,5738920\n22-Jan-10,128.67,128.89,125.37,125.50,10089325\n21-Jan-10,130.47,130.69,128.06,129.00,9608696\n20-Jan-10,130.46,131.15,128.95,130.25,15201857\n19-Jan-10,131.63,134.25,131.56,134.14,13916168\n18-Jan-10,131.78,131.78,131.78,131.78,0\n15-Jan-10,131.78,131.78,131.78,131.78,0\n14-Jan-10,130.55,132.71,129.91,132.31,7114544\n13-Jan-10,130.39,131.12,129.16,130.23,6458302\n12-Jan-10,129.03,131.33,129.00,130.51,8083354\n11-Jan-10,131.06,131.06,128.67,129.48,5731177\n8-Jan-10,129.07,130.92,129.05,130.85,4197105\n7-Jan-10,129.87,130.25,128.91,129.55,5840569\n6-Jan-10,130.68,131.49,129.81,130.00,5605290\n5-Jan-10,131.68,131.85,130.10,130.85,6842471\n4-Jan-10,131.18,132.97,130.85,132.45,6155846\n1-Jan-10,130.90,130.90,130.90,130.90,0\n31-Dec-09,130.90,130.90,130.90,130.90,0\n30-Dec-09,131.23,132.68,130.68,132.57,3867291\n29-Dec-09,132.28,132.37,131.80,131.85,4184782\n28-Dec-09,130.99,132.31,130.72,132.31,5801087\n25-Dec-09,130.57,130.57,130.57,130.57,0\n24-Dec-09,129.89,130.57,129.48,130.57,4265079\n23-Dec-09,129.70,130.00,129.30,130.00,4129112\n22-Dec-09,129.30,129.98,129.19,129.93,5535651\n21-Dec-09,127.80,128.94,127.68,128.65,4775164\n18-Dec-09,127.97,128.39,127.00,127.91,9106601\n17-Dec-09,128.00,128.56,127.12,127.40,5910454\n16-Dec-09,128.74,129.60,128.35,128.71,6372736\n15-Dec-09,129.46,129.86,127.94,128.49,8033372\n14-Dec-09,129.65,129.98,129.60,129.93,5202187\n11-Dec-09,129.01,129.77,128.71,129.68,6599285\n10-Dec-09,128.13,129.47,128.09,129.34,7077907\n9-Dec-09,126.70,128.39,126.11,128.39,6071919\n8-Dec-09,126.97,127.35,126.16,126.80,5351458\n7-Dec-09,126.88,127.53,126.59,127.04,4144680\n4-Dec-09,128.40,128.90,126.00,127.25,7068967\n3-Dec-09,127.60,128.47,127.25,127.55,5759913\n2-Dec-09,127.32,128.39,127.16,127.21,4599675\n1-Dec-09,127.29,128.39,126.85,127.94,6578504\n30-Nov-09,125.12,126.60,124.92,126.35,6302942\n27-Nov-09,124.59,126.62,124.26,125.70,3319189\n26-Nov-09,127.28,127.28,127.28,127.28,0\n25-Nov-09,127.88,128.22,127.08,127.28,3970966\n24-Nov-09,127.90,128.32,127.14,127.93,4822106\n23-Nov-09,127.70,128.94,127.65,128.20,7003414\n20-Nov-09,127.17,127.69,126.46,126.96,5354701\n19-Nov-09,127.28,127.84,126.51,127.54,5309025\n18-Nov-09,128.05,128.35,127.55,128.15,3970158\n17-Nov-09,127.43,128.66,127.40,128.63,7910332\n16-Nov-09,127.17,128.24,127.03,128.21,7975416\n13-Nov-09,126.41,127.80,126.27,127.03,4986825\n12-Nov-09,126.61,127.65,126.11,126.26,5345379\n11-Nov-09,126.55,127.30,125.94,127.19,6531368\n10-Nov-09,125.30,127.05,125.17,126.91,6444507\n9-Nov-09,123.92,126.00,123.49,126.00,7767199\n6-Nov-09,122.51,123.49,122.23,123.49,4979517\n5-Nov-09,122.12,123.50,122.00,123.10,6703852\n4-Nov-09,121.46,122.50,121.16,121.29,6353648\n3-Nov-09,119.53,121.19,119.53,121.16,5720434\n2-Nov-09,120.77,121.93,119.50,120.56,7050252\n30-Oct-09,122.63,124.30,120.48,120.61,7716347\n29-Oct-09,122.15,123.03,121.60,122.87,6309369\n28-Oct-09,120.47,121.68,119.87,121.50,8782409\n27-Oct-09,120.18,122.14,119.15,120.65,9445982\n26-Oct-09,120.61,122.44,119.55,120.11,6539803\n23-Oct-09,122.95,123.06,120.00,120.36,6799823\n22-Oct-09,120.75,123.00,120.34,122.69,6029228\n21-Oct-09,122.18,124.11,120.86,120.87,7175154\n20-Oct-09,123.36,123.50,121.50,122.82,8780912\n19-Oct-09,121.76,123.36,121.61,123.06,7514034\n16-Oct-09,123.15,123.70,121.25,121.64,19218945\n15-Oct-09,127.56,128.00,126.32,127.98,11952990\n14-Oct-09,127.71,128.61,126.60,128.35,9558486\n13-Oct-09,126.22,127.39,126.20,127.02,7582436\n12-Oct-09,125.44,127.10,125.20,127.04,7730425\n9-Oct-09,122.43,126.00,122.30,125.93,13123483\n8-Oct-09,122.52,122.98,121.85,122.29,6501378\n7-Oct-09,121.12,122.85,120.94,122.78,5967677\n6-Oct-09,120.39,121.59,120.22,121.35,6659151\n5-Oct-09,118.90,120.18,118.13,119.75,5673472\n2-Oct-09,117.40,119.66,117.26,119.02,7585296\n1-Oct-09,119.39,119.61,117.56,117.90,7070015\n30-Sep-09,119.18,120.00,117.55,119.61,7733205\n29-Sep-09,119.36,119.94,118.60,118.81,6748992\n28-Sep-09,120.52,122.00,118.94,119.33,8250073\n25-Sep-09,120.27,121.65,120.10,121.08,5187894\n24-Sep-09,120.69,121.65,120.40,120.94,5427378\n23-Sep-09,121.26,122.74,120.71,120.82,5529770\n22-Sep-09,122.09,122.11,120.98,121.61,5564648\n21-Sep-09,121.03,122.08,120.88,121.57,4516477\n18-Sep-09,122.45,122.88,121.62,122.11,9936586\n17-Sep-09,121.14,122.78,121.05,121.88,8394048\n16-Sep-09,119.50,122.00,119.30,121.82,11239737\n15-Sep-09,118.78,119.45,118.16,119.35,6535919\n14-Sep-09,117.00,118.99,116.94,118.88,4760207\n11-Sep-09,117.80,119.25,117.47,118.05,5893678\n10-Sep-09,116.99,117.83,116.75,117.67,4889568\n9-Sep-09,117.03,117.67,116.16,116.76,5248477\n8-Sep-09,117.94,118.17,116.63,117.16,5797728\n4-Sep-09,116.58,117.50,116.21,117.46,3451667\n3-Sep-09,116.55,116.73,115.15,116.33,4937002\n2-Sep-09,116.34,117.24,116.00,116.09,5178727\n1-Sep-09,117.67,118.93,116.50,116.69,6305084\n31-Aug-09,117.10,118.06,116.92,118.05,5440174\n28-Aug-09,120.10,120.23,117.77,118.22,6236128\n27-Aug-09,118.73,119.59,117.85,119.43,4356903\n26-Aug-09,118.64,119.85,117.51,119.47,4516257\n25-Aug-09,119.25,120.15,118.71,118.83,4653733\n24-Aug-09,119.92,120.88,119.10,119.32,6365021\n21-Aug-09,119.65,120.01,118.55,119.90,8307764\n20-Aug-09,118.44,119.41,118.10,118.95,4842029\n19-Aug-09,116.36,118.77,116.12,118.57,4837844\n18-Aug-09,116.81,118.00,116.73,117.63,4286472\n17-Aug-09,116.69,117.44,116.21,116.86,5351307\n14-Aug-09,119.29,119.74,117.62,118.57,4797051\n13-Aug-09,119.28,119.78,118.63,119.58,5489981\n12-Aug-09,117.60,119.96,117.42,119.29,6291557\n10-Aug-09,118.17,119.19,117.97,118.70,4041305\n7-Aug-09,118.11,119.91,118.11,119.33,5763172\n6-Aug-09,118.31,118.40,116.70,117.38,6003237\n5-Aug-09,118.52,119.00,117.86,118.47,5026291\n4-Aug-09,119.17,119.80,119.02,119.60,4994676\n3-Aug-09,118.88,119.96,118.69,119.92,6112018\n31-Jul-09,117.56,118.99,117.56,117.93,5329586\n30-Jul-09,118.00,119.37,117.67,117.86,6805957\n29-Jul-09,116.36,117.28,116.05,117.26,5101397\n28-Jul-09,116.63,117.52,116.34,117.28,5783139\n27-Jul-09,116.95,117.92,116.57,117.63,5070160\n24-Jul-09,116.68,118.15,116.63,117.64,6262750\n23-Jul-09,115.06,118.00,115.06,117.06,8464024\n22-Jul-09,116.18,117.20,115.09,115.57,8813331\n21-Jul-09,115.87,117.04,115.38,117.04,8303777\n20-Jul-09,114.53,116.88,114.39,116.44,10683485\n17-Jul-09,113.41,115.53,113.16,115.42,20190163\n16-Jul-09,106.84,110.97,106.79,110.64,15048197\n15-Jul-09,104.75,107.22,104.60,107.22,8707266\n14-Jul-09,103.42,103.62,102.52,103.25,5416082\n13-Jul-09,101.28,103.65,100.19,103.62,9494417\n10-Jul-09,100.97,101.72,99.80,100.83,7470894\n9-Jul-09,101.12,102.78,100.85,102.08,6153127\n8-Jul-09,100.29,101.17,99.50,100.68,7380719\n7-Jul-09,101.34,101.96,100.03,100.19,6685957\n6-Jul-09,101.57,102.23,100.47,101.65,6523090\n3-Jul-09,101.73,101.73,101.73,101.73,0\n2-Jul-09,103.80,103.91,101.73,101.73,7027779\n1-Jul-09,105.00,106.27,104.73,104.84,5537276\n30-Jun-09,105.69,106.03,103.81,104.42,7512588\n29-Jun-09,105.99,106.18,105.16,105.83,4681817\n26-Jun-09,106.50,106.50,105.05,105.68,5128668\n25-Jun-09,103.70,106.78,103.51,106.06,6898378\n24-Jun-09,105.39,106.48,103.72,104.15,6395356\n23-Jun-09,104.75,104.87,103.79,104.44,5154084\n22-Jun-09,105.18,105.88,104.23,104.52,7296198\n19-Jun-09,106.31,106.65,105.50,105.89,13562225\n18-Jun-09,106.93,107.53,106.12,106.33,6207156\n17-Jun-09,107.46,107.88,106.88,107.00,7366166\n16-Jun-09,108.47,109.14,107.27,107.32,7231444\n15-Jun-09,107.63,108.83,107.24,107.62,8567686\n12-Jun-09,108.40,109.28,107.75,108.21,7250917\n11-Jun-09,108.75,110.64,108.56,109.40,9136089\n10-Jun-09,109.20,109.28,107.05,108.35,7578705\n9-Jun-09,108.15,109.14,107.99,108.14,8592752\n8-Jun-09,106.64,107.98,105.50,107.49,6364301\n5-Jun-09,107.33,108.40,106.75,107.24,7665350\n4-Jun-09,106.17,106.87,105.60,106.33,5468792\n3-Jun-09,106.53,106.60,105.11,106.49,7688214\n2-Jun-09,107.51,108.80,106.66,106.83,7046035\n1-Jun-09,106.94,108.67,106.67,108.37,7725911\n29-May-09,104.47,106.50,103.95,106.28,6871876\n28-May-09,103.34,105.14,102.68,104.69,6127885\n27-May-09,104.34,105.17,102.91,102.93,7121132\n26-May-09,101.32,105.63,101.02,105.02,7211942\n25-May-09,101.89,101.89,101.89,101.89,0\n22-May-09,102.67,103.31,101.75,101.89,5596474\n21-May-09,103.07,103.25,101.74,102.82,7411431\n20-May-09,105.51,105.98,103.81,104.05,7083138\n19-May-09,104.33,106.12,104.00,105.51,7079435\n18-May-09,102.00,104.71,101.94,104.58,7429409\n15-May-09,100.90,103.07,100.57,101.37,8367739\n14-May-09,101.72,102.71,100.77,101.05,9445455\n13-May-09,102.88,103.10,101.35,102.26,8202724\n12-May-09,102.98,104.38,102.37,103.94,7963605\n11-May-09,101.09,103.88,100.95,102.90,8253824\n8-May-09,103.58,103.75,99.83,101.49,11575755\n7-May-09,104.65,104.80,101.83,102.59,8524436\n6-May-09,105.23,105.50,103.71,104.62,7535537\n5-May-09,106.00,106.82,105.51,105.85,6751973\n4-May-09,105.26,106.75,104.61,106.19,8314968\n1-May-09,103.78,104.86,102.94,104.61,6237185\n30-Apr-09,104.55,106.05,102.85,103.21,10664488\n29-Apr-09,101.98,105.00,101.67,104.04,9786690\n28-Apr-09,99.36,102.73,99.25,101.94,11111494\n27-Apr-09,99.61,101.69,99.29,99.95,8612348\n24-Apr-09,101.17,101.58,99.50,100.08,10157513\n23-Apr-09,102.65,102.78,99.80,101.42,9440413\n22-Apr-09,101.17,103.86,101.06,102.55,12120548\n21-Apr-09,98.41,102.48,98.20,102.31,15230878\n20-Apr-09,100.29,101.19,99.21,100.43,12588576\n17-Apr-09,101.18,102.04,99.69,101.27,10218764\n16-Apr-09,99.74,101.92,99.18,101.43,9260106\n15-Apr-09,98.23,99.06,96.44,98.85,8164390\n14-Apr-09,99.08,99.95,98.27,99.27,6277538\n13-Apr-09,100.28,101.65,99.04,99.95,7797542\n10-Apr-09,101.70,101.70,101.70,101.70,0\n9-Apr-09,102.01,102.45,100.25,101.70,8014029\n8-Apr-09,99.45,101.55,99.00,101.19,7311817\n7-Apr-09,100.17,100.50,98.52,98.75,8768491\n6-Apr-09,100.90,101.85,100.00,101.56,8821996\n3-Apr-09,99.73,102.66,99.71,102.22,10890563\n2-Apr-09,99.15,101.99,98.38,100.82,16226813\n1-Apr-09,96.13,98.00,95.70,97.61,12212834\n31-Mar-09,94.96,98.66,94.85,96.89,14553959\n30-Mar-09,92.00,94.74,91.80,94.52,10973033\n27-Mar-09,95.99,96.00,92.75,94.15,15746911\n26-Mar-09,98.47,99.20,97.75,98.78,11440812\n25-Mar-09,98.47,99.86,96.09,97.95,12017509\n24-Mar-09,97.69,99.55,97.52,98.30,9347238\n23-Mar-09,93.70,98.71,93.70,98.71,12408203\n20-Mar-09,93.16,95.00,92.18,92.51,12194884\n19-Mar-09,92.84,93.35,91.51,92.66,9899994\n18-Mar-09,89.46,92.90,89.41,91.95,17956511\n17-Mar-09,91.11,92.91,90.45,92.91,11490142\n16-Mar-09,91.65,93.00,90.54,91.22,11796373\n13-Mar-09,90.40,90.65,89.29,90.36,9112201\n12-Mar-09,88.59,90.60,87.49,90.40,11829250\n11-Mar-09,87.51,89.54,86.72,88.62,11824127\n10-Mar-09,85.11,87.25,83.64,87.25,15915749\n9-Mar-09,84.70,86.80,83.02,83.48,13153048\n6-Mar-09,87.47,88.25,83.81,85.81,15187919\n5-Mar-09,88.13,90.16,87.02,87.48,14933403\n4-Mar-09,88.97,91.24,87.60,89.49,15391882\n3-Mar-09,90.16,90.18,87.19,87.77,13745837\n2-Mar-09,91.17,91.90,88.75,89.05,15231919\n27-Feb-09,88.12,93.28,88.01,92.03,21312536\n26-Feb-09,86.85,90.20,86.33,88.97,17424011\n25-Feb-09,86.00,87.12,82.85,85.90,12646705\n24-Feb-09,84.63,87.08,84.10,86.40,12916040\n23-Feb-09,89.30,89.33,84.19,84.37,13509701\n20-Feb-09,88.05,89.90,87.34,88.79,12401112\n19-Feb-09,91.06,92.16,88.45,88.93,12624634\n18-Feb-09,91.17,92.25,90.44,91.51,8492665\n17-Feb-09,91.73,92.49,90.50,90.67,8906784\n13-Feb-09,94.79,95.18,93.57,93.84,6742532\n12-Feb-09,94.41,95.20,92.20,95.07,9918736\n11-Feb-09,93.48,95.77,93.00,95.16,10765873\n10-Feb-09,95.58,96.82,92.96,93.27,13541935\n9-Feb-09,95.93,96.98,94.72,96.82,8165954\n6-Feb-09,92.51,97.10,91.65,96.14,13063843\n5-Feb-09,92.13,93.20,91.22,92.41,11622861\n4-Feb-09,93.74,94.91,91.82,92.83,10191929\n3-Feb-09,91.07,93.73,90.16,93.48,8866773\n2-Feb-09,90.60,91.86,89.69,90.93,9926980\n30-Jan-09,92.23,93.48,91.25,91.65,9616963\n29-Jan-09,93.58,94.58,92.02,92.51,9234105\n28-Jan-09,92.70,94.94,91.91,94.82,13412453\n27-Jan-09,91.77,91.97,90.50,91.66,8721601\n26-Jan-09,89.77,92.67,89.52,91.60,9841875\n23-Jan-09,88.40,90.70,87.81,89.49,10256388\n22-Jan-09,89.83,90.74,88.11,90.07,12351422\n21-Jan-09,86.29,91.60,86.00,91.42,24908525\n20-Jan-09,84.76,84.92,81.76,81.98,13840227\n16-Jan-09,84.61,85.74,83.08,84.92,11245580\n15-Jan-09,83.61,84.83,82.26,84.12,11735223\n14-Jan-09,84.20,84.82,82.11,83.19,9470642\n13-Jan-09,85.50,86.59,84.79,85.34,7657127\n12-Jan-09,84.57,86.60,84.42,85.71,8072871\n9-Jan-09,87.05,87.50,84.25,84.70,7440555\n8-Jan-09,87.81,88.14,85.98,87.18,7231753\n7-Jan-09,87.83,88.80,87.12,87.79,8455680\n6-Jan-09,87.11,90.41,86.37,89.23,9653234\n5-Jan-09,86.42,87.67,86.18,86.82,8316217\n2-Jan-09,83.89,87.59,83.89,87.37,7558627\n1-Jan-09,84.16,84.16,84.16,84.16,0\n31-Dec-08,83.50,85.00,83.50,84.16,6667617\n30-Dec-08,81.83,83.64,81.52,83.55,5774769\n29-Dec-08,81.72,81.72,79.68,81.25,6064693\n26-Dec-08,80.93,81.80,80.55,81.33,3102677\n25-Dec-08,80.52,80.52,80.52,80.52,0\n24-Dec-08,80.55,81.22,79.92,80.52,2419543\n23-Dec-08,82.35,82.81,80.13,80.60,6386299\n22-Dec-08,83.27,83.45,80.32,81.99,7084949\n19-Dec-08,85.22,85.22,82.97,83.52,13099430\n18-Dec-08,85.77,86.64,82.96,84.00,8030144\n17-Dec-08,85.44,87.27,84.66,86.92,8666864\n16-Dec-08,83.11,86.84,82.87,86.40,11574083\n15-Dec-08,82.51,83.54,80.00,82.77,8848400\n12-Dec-08,78.68,82.94,78.06,82.20,10383397\n11-Dec-08,81.50,82.86,79.77,80.58,10687044\n10-Dec-08,83.95,84.99,81.83,82.86,8187311\n9-Dec-08,83.82,85.43,82.20,82.69,9359474\n8-Dec-08,82.57,85.88,81.73,84.86,11178250\n5-Dec-08,76.78,81.50,75.31,80.59,11211940\n4-Dec-08,80.03,80.83,76.18,77.44,10914611\n3-Dec-08,78.62,81.00,76.99,80.67,9757965\n2-Dec-08,77.80,80.00,76.14,79.84,9305487\n1-Dec-08,80.95,81.36,76.79,76.90,10264956\n28-Nov-08,81.00,81.90,80.10,81.60,3908651\n27-Nov-08,81.67,81.67,81.67,81.67,0\n26-Nov-08,79.52,81.79,78.61,81.67,8240531\n25-Nov-08,81.37,82.40,78.22,80.65,12519638\n24-Nov-08,75.74,82.09,75.00,79.89,15023725\n21-Nov-08,72.74,76.98,69.50,74.88,19804617\n20-Nov-08,75.00,78.39,70.51,71.74,17634937\n19-Nov-08,79.93,81.00,75.73,75.97,12606807\n18-Nov-08,79.13,80.93,77.00,80.08,13051229\n17-Nov-08,79.40,79.74,77.16,77.48,10324195\n14-Nov-08,82.63,85.40,79.50,80.33,12025365\n13-Nov-08,79.62,84.39,75.40,84.21,15105250\n12-Nov-08,80.73,82.40,79.57,79.74,11369331\n11-Nov-08,83.24,84.29,80.25,82.74,10018762\n10-Nov-08,87.99,88.10,82.74,83.87,9849063\n7-Nov-08,85.78,86.71,84.25,86.27,7783400\n6-Nov-08,87.68,88.83,84.28,85.15,12130100\n5-Nov-08,92.93,93.40,89.70,89.94,8614600\n4-Nov-08,94.76,94.76,92.07,93.40,10005000\n3-Nov-08,92.64,94.67,92.17,92.68,7432800\n31-Oct-08,90.90,94.19,89.03,92.97,10278400\n30-Oct-08,91.01,92.40,88.90,90.69,11938500\n29-Oct-08,87.74,91.00,86.25,88.20,12599900\n28-Oct-08,81.40,87.61,79.52,87.28,12810700\n27-Oct-08,80.27,84.50,79.01,79.66,10938600\n24-Oct-08,79.27,84.31,78.82,82.07,12100800\n23-Oct-08,84.09,85.89,81.00,84.35,12173700\n22-Oct-08,87.00,87.59,80.80,83.60,14002100\n21-Oct-08,92.22,92.46,88.57,88.86,9656200\n20-Oct-08,92.21,93.31,89.33,92.51,9451600\n17-Oct-08,91.75,95.91,87.71,90.78,14230900\n16-Oct-08,89.38,92.00,84.35,91.52,15979000\n15-Oct-08,92.77,95.29,87.71,88.29,11030700\n14-Oct-08,96.42,99.00,92.00,93.60,14280000\n13-Oct-08,90.44,93.61,86.95,92.21,16472800\n10-Oct-08,87.41,91.66,83.51,87.75,23835100\n9-Oct-08,95.29,95.31,88.23,89.00,20895100\n8-Oct-08,91.51,97.48,89.98,90.55,17622400\n7-Oct-08,101.50,102.62,94.24,95.65,11097700\n6-Oct-08,101.21,103.00,96.60,100.62,11505300\n3-Oct-08,105.16,110.95,103.03,103.44,9500200\n2-Oct-08,108.48,109.97,103.04,104.74,11399300\n1-Oct-08,115.51,116.80,107.75,110.13,13066000\n30-Sep-08,115.83,116.96,111.81,116.96,18594900\n29-Sep-08,118.43,118.43,109.95,114.46,9475100\n26-Sep-08,117.21,121.01,117.01,119.42,4663300\n25-Sep-08,117.75,121.99,116.12,120.11,6521400\n24-Sep-08,116.93,118.17,114.26,116.46,6348700\n23-Sep-08,116.21,118.17,114.14,115.36,7975100\n22-Sep-08,118.45,120.14,116.02,116.21,8805800\n19-Sep-08,119.59,124.00,117.50,118.85,13989000\n18-Sep-08,112.91,118.59,111.04,115.12,15604500\n17-Sep-08,114.79,115.50,110.61,111.47,11972600\n16-Sep-08,113.73,117.64,113.32,116.05,12826700\n15-Sep-08,116.86,118.41,115.19,115.19,9800200\n12-Sep-08,118.66,119.28,116.82,118.97,6516900\n11-Sep-08,116.60,119.37,116.11,119.20,9040500\n10-Sep-08,116.40,119.95,116.10,118.04,11303700\n9-Sep-08,117.78,118.10,115.00,115.04,7838000\n8-Sep-08,118.00,118.28,115.14,117.29,10285300\n5-Sep-08,114.15,115.09,113.17,114.33,8750400\n4-Sep-08,117.99,118.90,114.90,115.00,9998800\n3-Sep-08,118.34,118.65,115.15,118.34,10621800\n2-Sep-08,122.87,124.00,117.90,118.41,11684200\n29-Aug-08,123.71,123.99,121.63,121.73,6719100\n28-Aug-08,124.06,125.45,123.58,124.58,5322900\n27-Aug-08,122.42,124.85,122.18,123.38,5527800\n26-Aug-08,122.58,122.85,121.50,122.50,5542500\n25-Aug-08,124.48,124.93,122.70,122.86,5585700\n22-Aug-08,123.30,125.35,122.80,124.93,5837500\n21-Aug-08,121.58,123.43,121.55,122.99,6224300\n20-Aug-08,123.50,123.97,122.01,122.51,6813100\n19-Aug-08,123.63,124.79,122.01,122.56,9254200\n18-Aug-08,126.49,127.00,123.68,124.59,5867300\n15-Aug-08,127.07,127.19,125.35,126.36,5557200\n14-Aug-08,125.01,128.25,124.80,126.94,6748500\n13-Aug-08,125.00,126.99,124.75,125.80,5817000\n12-Aug-08,126.01,126.50,124.40,125.22,6890300\n11-Aug-08,128.43,128.43,125.75,126.60,7391900\n8-Aug-08,128.50,129.88,127.63,128.81,8000300\n7-Aug-08,128.30,129.97,127.90,129.05,6383200\n6-Aug-08,128.45,129.50,127.75,129.16,6195000\n5-Aug-08,128.20,128.90,127.08,128.87,6950700\n4-Aug-08,126.77,128.10,126.25,127.56,5787000\n1-Aug-08,128.52,129.30,126.28,126.64,4891700\n31-Jul-08,128.10,129.50,127.74,127.98,5771400\n30-Jul-08,128.12,129.00,127.09,128.86,5763100\n29-Jul-08,126.54,128.17,126.25,127.66,5611400\n28-Jul-08,127.69,128.44,126.13,126.25,5994700\n25-Jul-08,129.00,129.90,128.00,128.53,7321400\n24-Jul-08,129.06,130.93,128.80,130.00,8772100\n23-Jul-08,129.78,130.33,128.29,129.52,10141800\n22-Jul-08,127.50,130.00,127.26,130.00,10574700\n21-Jul-08,129.83,129.90,127.64,128.66,7705100\n18-Jul-08,125.81,130.00,125.42,129.89,18088700\n17-Jul-08,126.39,126.96,124.00,126.52,11574500\n16-Jul-08,122.81,126.89,122.25,125.94,9729200\n15-Jul-08,121.00,124.50,119.90,123.20,10482800\n14-Jul-08,123.51,124.25,121.24,121.54,8230000\n11-Jul-08,121.80,123.74,120.57,122.12,8724600\n10-Jul-08,120.66,123.54,120.66,123.18,9981800\n9-Jul-08,124.21,124.50,120.40,120.40,9313500\n8-Jul-08,120.55,123.99,120.55,123.88,9714700\n7-Jul-08,119.62,122.64,119.62,121.50,8986900\n3-Jul-08,119.95,120.78,117.89,119.54,5590400\n2-Jul-08,118.41,120.55,118.12,119.10,7903400\n1-Jul-08,117.50,119.36,116.60,119.27,9924800\n30-Jun-08,120.03,120.22,118.15,118.53,8232800\n27-Jun-08,121.02,122.05,118.26,120.05,10631800\n26-Jun-08,123.43,123.82,120.76,121.13,9536000\n25-Jun-08,123.67,125.83,123.20,124.58,7075400\n24-Jun-08,123.08,124.25,121.90,123.46,7486800\n23-Jun-08,123.00,124.50,122.40,123.46,5761400\n20-Jun-08,124.81,125.02,122.50,122.74,9301600\n19-Jun-08,123.67,125.62,122.36,125.02,7425900\n18-Jun-08,124.55,125.43,123.70,124.16,6432000\n17-Jun-08,127.10,127.10,124.62,125.10,5237000\n16-Jun-08,125.46,127.14,124.65,126.71,6213900\n13-Jun-08,124.42,126.57,124.15,126.15,6362500\n12-Jun-08,123.85,125.09,123.13,123.85,6668500\n11-Jun-08,125.90,125.90,122.86,123.25,7135100\n10-Jun-08,124.88,126.72,124.63,125.94,5315100\n9-Jun-08,125.38,126.18,124.06,125.86,5568400\n6-Jun-08,127.77,128.14,124.74,124.94,7792400\n5-Jun-08,127.41,129.04,127.20,128.47,6021200\n4-Jun-08,127.87,128.50,126.45,127.55,6417300\n3-Jun-08,127.47,129.00,127.46,127.84,7144500\n2-Jun-08,128.49,129.37,126.70,127.36,7400700\n30-May-08,129.22,129.99,128.80,129.43,8536000\n29-May-08,128.76,129.99,128.66,129.71,7365900\n28-May-08,127.50,129.54,126.99,129.54,9808200\n27-May-08,124.01,127.38,124.00,127.32,6890200\n23-May-08,124.35,124.91,123.77,124.20,4612100\n22-May-08,123.55,125.35,123.55,124.70,4985900\n21-May-08,125.05,126.40,123.02,123.62,7618700\n20-May-08,126.05,126.05,124.45,125.18,6620000\n19-May-08,127.68,128.21,126.05,126.49,6303500\n16-May-08,128.46,128.48,126.80,127.82,6341300\n15-May-08,127.33,128.68,126.90,128.46,7209500\n14-May-08,126.52,128.83,126.20,127.52,8839200\n13-May-08,125.12,126.70,125.03,126.58,9393200\n12-May-08,123.82,125.99,123.56,125.24,8490600\n9-May-08,124.37,124.65,123.63,124.06,5479700\n8-May-08,124.20,125.17,123.70,124.92,9776600\n7-May-08,122.78,124.98,122.41,124.14,10954600\n6-May-08,121.50,123.34,120.78,122.82,5663300\n5-May-08,122.29,123.25,121.74,122.03,5779500\n2-May-08,123.30,124.00,121.76,123.18,6886100\n1-May-08,121.06,124.43,121.06,123.61,8148800\n30-Apr-08,123.34,123.50,120.50,120.70,8035600\n29-Apr-08,122.04,123.20,122.04,122.85,7140300\n28-Apr-08,122.61,123.05,121.64,121.69,5314600\n25-Apr-08,124.50,124.50,122.06,123.08,6311200\n24-Apr-08,123.38,124.90,122.73,124.19,5939100\n23-Apr-08,123.69,124.78,122.64,123.60,7542100\n22-Apr-08,123.87,124.35,123.01,123.67,5393200\n21-Apr-08,123.62,124.51,122.05,124.35,6926600\n18-Apr-08,123.92,125.00,123.15,124.40,12402500\n17-Apr-08,122.39,123.72,120.70,123.08,18064900\n16-Apr-08,118.15,120.47,117.17,120.47,15449600\n15-Apr-08,117.10,117.67,115.54,117.17,8597300\n14-Apr-08,116.20,117.94,115.95,117.28,7695100\n11-Apr-08,117.31,117.80,115.51,116.00,9434100\n10-Apr-08,116.93,119.22,116.88,118.78,9108400\n9-Apr-08,116.50,117.72,115.72,116.77,6776200\n8-Apr-08,115.72,116.88,115.28,116.27,7096000\n7-Apr-08,116.37,117.37,115.82,116.31,6140100\n4-Apr-08,116.05,116.58,114.60,115.76,5428200\n3-Apr-08,114.35,116.82,113.86,116.02,6723100\n2-Apr-08,116.84,116.88,113.98,114.81,7901000\n1-Apr-08,115.20,118.37,114.97,116.49,11160700\n31-Mar-08,114.15,115.87,113.34,115.14,9543800\n28-Mar-08,115.86,116.75,114.21,114.57,6578700\n27-Mar-08,116.02,116.20,114.51,115.52,7948000\n26-Mar-08,117.59,117.97,114.96,116.91,9381600\n25-Mar-08,119.10,119.10,117.15,117.97,7954000\n24-Mar-08,118.57,119.79,118.13,119.06,8385800\n20-Mar-08,117.09,118.48,116.65,118.33,10925200\n19-Mar-08,118.29,118.50,116.65,116.94,9289500\n18-Mar-08,116.60,118.43,113.81,118.41,9875900\n17-Mar-08,113.00,117.04,113.00,115.55,9118900\n14-Mar-08,116.07,116.52,112.69,115.23,9660200\n13-Mar-08,115.69,116.78,113.64,115.91,9382200\n12-Mar-08,116.44,118.00,115.11,117.07,9068000\n11-Mar-08,115.80,116.56,114.04,116.49,10441200\n10-Mar-08,113.12,115.99,113.12,114.01,9682400\n7-Mar-08,111.85,114.75,111.80,113.94,7961700\n6-Mar-08,115.06,115.15,112.25,112.52,7927800\n5-Mar-08,116.41,116.41,114.25,115.39,8420500\n4-Mar-08,113.40,115.72,112.75,115.71,8515900\n3-Mar-08,113.86,114.81,113.48,114.23,6298200\n29-Feb-08,114.04,115.14,113.35,113.86,8422800\n28-Feb-08,115.60,115.90,114.56,115.24,7196100\n27-Feb-08,113.84,116.63,112.91,116.46,11586500\n26-Feb-08,109.52,114.99,109.05,114.38,18437500\n25-Feb-08,107.43,110.32,107.43,110.08,7548700\n22-Feb-08,107.14,108.48,105.71,108.07,7902600\n21-Feb-08,108.10,109.60,106.43,106.93,8249800\n20-Feb-08,105.43,108.21,104.53,107.85,7608600\n19-Feb-08,106.94,107.62,104.64,105.00,7309600\n15-Feb-08,105.27,106.25,105.00,106.16,6063400\n14-Feb-08,107.94,108.50,105.50,106.13,7226700\n13-Feb-08,107.13,108.93,106.80,108.42,5912800\n12-Feb-08,105.16,107.33,104.70,106.53,7591100\n11-Feb-08,103.05,105.55,102.87,105.14,6057400\n8-Feb-08,102.19,103.67,102.07,103.27,6033200\n7-Feb-08,102.89,104.00,100.60,102.34,11050500\n6-Feb-08,105.05,106.49,103.58,103.59,8210300\n5-Feb-08,107.06,108.05,104.68,105.02,9013600\n4-Feb-08,108.67,109.00,106.46,107.93,5910900\n1-Feb-08,107.16,109.40,105.86,109.08,7970600\n31-Jan-08,104.21,107.97,103.70,107.11,8880900\n30-Jan-08,105.85,107.65,104.86,105.65,7412500\n29-Jan-08,105.50,106.80,104.60,106.10,6420000\n28-Jan-08,104.44,105.77,103.83,104.98,7839100\n25-Jan-08,107.79,107.79,104.10,104.52,9959700\n24-Jan-08,106.38,107.51,104.68,106.91,12441100\n23-Jan-08,99.63,106.34,98.50,106.10,19297500\n22-Jan-08,98.55,103.09,98.55,101.22,14693200\n18-Jan-08,106.72,106.72,102.50,103.40,22365900\n17-Jan-08,102.00,103.45,100.05,101.10,10922300\n16-Jan-08,100.14,102.86,100.14,101.63,12546200\n15-Jan-08,102.03,104.64,101.23,101.83,11369500\n14-Jan-08,105.01,105.59,101.33,102.93,16710600\n11-Jan-08,99.20,99.46,97.04,97.67,8846600\n10-Jan-08,97.39,100.86,97.15,99.92,10007500\n9-Jan-08,97.76,99.15,97.16,98.31,10839400\n8-Jan-08,100.05,100.38,97.17,97.59,9362700\n7-Jan-08,100.25,101.00,99.03,100.05,11256000\n4-Jan-08,103.95,103.95,100.48,101.13,9595400\n3-Jan-08,104.83,105.57,103.98,104.90,7357300\n2-Jan-08,108.99,108.99,104.17,104.69,9361400\n31-Dec-07,109.51,110.00,107.26,108.10,5624600\n28-Dec-07,110.76,110.76,109.11,110.09,5043500\n27-Dec-07,110.53,111.30,109.49,109.60,4414200\n26-Dec-07,110.90,112.19,110.90,111.56,3789600\n24-Dec-07,111.20,112.00,110.55,111.65,2320300\n21-Dec-07,109.90,111.16,109.15,111.05,13080800\n20-Dec-07,107.78,109.49,107.61,108.84,7407800\n19-Dec-07,106.54,108.38,105.87,107.14,7012100\n18-Dec-07,105.08,106.97,104.13,106.31,7945300\n17-Dec-07,105.37,105.99,104.00,104.53,6838800\n14-Dec-07,107.31,107.56,104.10,105.77,9597500\n13-Dec-07,108.00,108.64,106.94,108.18,6245000\n12-Dec-07,109.17,110.20,107.38,108.47,7807500\n11-Dec-07,109.34,110.40,106.46,106.99,8299500\n10-Dec-07,109.38,110.26,109.00,109.39,4423000\n7-Dec-07,109.68,110.00,107.95,108.86,5659500\n6-Dec-07,108.00,110.00,107.93,109.70,5301900\n5-Dec-07,107.83,108.52,106.98,108.16,6013800\n4-Dec-07,105.41,107.42,104.72,106.63,6325200\n3-Dec-07,105.55,107.14,104.58,105.83,7843500\n30-Nov-07,108.57,109.19,103.93,105.18,12500300\n29-Nov-07,107.24,107.87,106.25,107.50,7477800\n28-Nov-07,104.82,108.27,104.36,107.37,8978000\n27-Nov-07,102.70,104.58,101.50,103.83,9064800\n26-Nov-07,104.26,105.15,101.72,101.97,6744000\n23-Nov-07,103.10,104.14,102.32,104.05,2727000\n21-Nov-07,101.41,104.09,101.41,102.22,7017400\n20-Nov-07,102.59,104.97,101.38,103.42,8296600\n19-Nov-07,104.34,105.39,101.34,102.22,9342900\n16-Nov-07,104.51,105.00,103.25,104.79,9110800\n15-Nov-07,103.24,105.64,103.05,103.60,7981500\n14-Nov-07,106.12,106.42,102.84,103.44,8285300\n13-Nov-07,102.73,105.74,102.50,105.27,10407200\n12-Nov-07,101.89,104.19,100.70,101.45,13444100\n9-Nov-07,104.92,104.92,99.27,100.25,17807300\n8-Nov-07,110.10,110.32,103.99,106.11,18995400\n7-Nov-07,113.56,113.64,110.90,111.08,7041100\n6-Nov-07,113.49,113.95,111.67,113.17,7164300\n5-Nov-07,113.94,115.11,112.83,113.40,6659600\n2-Nov-07,114.42,115.15,113.57,114.59,6064800\n1-Nov-07,115.50,116.09,113.32,113.65,7548100\n31-Oct-07,114.75,116.25,113.28,116.12,7153700\n30-Oct-07,114.50,114.90,113.75,114.12,3955600\n29-Oct-07,113.90,115.01,113.85,114.80,5011400\n26-Oct-07,113.00,114.00,112.07,113.73,5003600\n25-Oct-07,113.32,114.40,111.69,112.81,6477500\n24-Oct-07,114.20,114.45,111.68,112.95,7984500\n23-Oct-07,113.78,114.80,113.50,114.68,5516300\n22-Oct-07,110.97,113.88,110.96,113.37,7440400\n19-Oct-07,113.98,114.93,111.80,112.28,10105000\n18-Oct-07,114.82,116.41,114.44,114.80,7663700\n17-Oct-07,118.01,118.01,114.15,115.78,17414700\n16-Oct-07,118.02,119.94,117.50,119.60,9870500\n15-Oct-07,117.95,118.37,116.75,118.03,5978300\n12-Oct-07,118.50,118.89,117.28,117.81,5595500\n11-Oct-07,118.99,121.46,117.37,118.05,13001700\n10-Oct-07,118.00,118.80,117.68,118.62,5900700\n9-Oct-07,117.85,118.50,116.42,118.30,5581500\n8-Oct-07,116.10,118.23,115.88,117.77,4798800\n5-Oct-07,116.17,116.71,115.47,116.30,5681900\n4-Oct-07,116.20,116.75,115.00,115.69,6157900\n3-Oct-07,117.65,117.84,116.28,116.40,7786100\n2-Oct-07,119.31,119.60,118.14,118.36,6738300\n1-Oct-07,117.61,119.50,117.50,119.03,6500300\n28-Sep-07,117.14,118.50,117.10,117.80,6673400\n27-Sep-07,117.50,118.21,117.04,117.71,5608600\n26-Sep-07,116.94,118.08,116.75,117.30,6404500\n25-Sep-07,116.02,117.59,115.79,116.51,6587500\n24-Sep-07,116.90,117.43,115.85,116.25,5700700\n21-Sep-07,117.89,118.10,116.35,116.78,9032600\n20-Sep-07,116.27,117.65,116.20,116.86,5790200\n19-Sep-07,116.90,117.19,115.78,116.67,9688100\n18-Sep-07,115.00,116.78,114.83,116.63,7636900\n17-Sep-07,114.70,115.25,114.30,114.52,4575700\n14-Sep-07,115.05,116.00,114.65,115.13,6827500\n13-Sep-07,116.30,117.00,115.74,115.95,4638300\n12-Sep-07,116.95,117.40,115.69,116.00,6252100\n11-Sep-07,116.35,117.78,116.04,117.35,7259800\n10-Sep-07,116.15,117.50,115.32,115.80,5979600\n7-Sep-07,116.20,116.97,115.33,115.55,7454200\n6-Sep-07,117.92,118.75,116.24,117.62,6597400\n5-Sep-07,117.48,118.15,116.55,117.88,6240600\n4-Sep-07,116.34,118.89,116.15,118.19,7843300\n31-Aug-07,115.99,117.35,115.55,116.69,6289000\n30-Aug-07,113.62,116.00,113.62,115.37,7210400\n29-Aug-07,112.88,114.98,112.07,114.57,6365900\n28-Aug-07,112.90,113.59,111.63,112.00,5518100\n27-Aug-07,113.00,113.85,112.80,113.44,4716500\n24-Aug-07,111.45,113.25,110.81,113.24,6740900\n23-Aug-07,110.40,111.68,110.01,111.45,8124000\n22-Aug-07,110.09,110.50,109.15,110.00,6223900\n21-Aug-07,108.90,110.11,108.08,109.04,7816700\n20-Aug-07,110.90,111.10,109.13,109.22,8259400\n17-Aug-07,111.87,112.67,108.66,110.90,11496700\n16-Aug-07,110.98,111.42,103.70,109.69,13603700\n15-Aug-07,111.00,112.85,109.91,111.23,10807100\n14-Aug-07,112.83,113.15,111.74,112.05,5116500\n13-Aug-07,112.92,113.95,112.31,112.71,5560600\n10-Aug-07,109.75,113.50,109.70,112.64,8316200\n9-Aug-07,110.77,114.49,110.73,110.73,8869900\n8-Aug-07,114.30,114.60,112.26,112.98,6883100\n7-Aug-07,113.02,114.17,112.25,113.53,7226500\n6-Aug-07,111.97,113.89,111.70,113.89,7161700\n3-Aug-07,113.24,114.18,111.70,111.89,9383500\n2-Aug-07,112.10,114.05,111.50,113.23,7908100\n1-Aug-07,110.39,112.73,110.06,112.04,10547700\n31-Jul-07,114.72,114.72,110.02,110.65,14088000\n30-Jul-07,115.00,115.75,113.52,114.52,11738200\n27-Jul-07,116.62,117.95,115.62,115.62,12398700\n26-Jul-07,117.01,118.82,115.52,116.53,16666900\n25-Jul-07,116.19,118.38,115.24,118.10,10556400\n24-Jul-07,115.32,117.00,115.02,116.17,10470500\n23-Jul-07,114.88,116.43,114.85,116.38,7764500\n20-Jul-07,114.85,115.86,113.94,114.81,11294300\n19-Jul-07,115.00,116.48,114.65,115.86,16522500\n18-Jul-07,110.25,111.88,110.04,111.08,8876200\n17-Jul-07,109.66,111.47,109.45,110.77,7509600\n16-Jul-07,108.57,110.04,108.42,109.66,8644100\n13-Jul-07,108.75,109.20,108.10,108.60,6908800\n12-Jul-07,109.35,109.65,108.22,109.28,8816900\n11-Jul-07,108.30,109.60,108.25,109.10,5141200\n10-Jul-07,108.55,109.15,108.25,108.63,5980800\n9-Jul-07,108.73,109.35,108.20,108.97,5915600\n6-Jul-07,107.79,109.66,107.66,109.03,7329500\n5-Jul-07,106.31,108.39,105.98,108.05,6569000\n3-Jul-07,105.50,107.08,105.24,106.58,4145000\n2-Jul-07,105.39,105.80,104.58,105.01,4370500\n29-Jun-07,105.96,106.58,104.10,105.25,6989900\n28-Jun-07,105.52,106.92,105.22,105.95,5178500\n27-Jun-07,104.75,105.47,104.40,105.43,5283300\n26-Jun-07,105.10,106.06,104.82,105.33,5132000\n25-Jun-07,104.73,105.77,104.50,105.10,8007800\n22-Jun-07,105.96,106.44,104.44,104.44,10527100\n21-Jun-07,105.77,107.00,105.61,106.60,5531500\n20-Jun-07,106.50,107.02,105.95,106.00,6165300\n19-Jun-07,104.93,106.66,104.90,106.50,5719300\n18-Jun-07,105.27,105.65,104.89,105.33,6231700\n15-Jun-07,104.22,105.19,103.88,105.09,9169400\n14-Jun-07,103.10,104.24,102.81,103.85,5028900\n13-Jun-07,102.85,103.26,102.10,103.12,6290700\n12-Jun-07,103.11,103.18,102.15,102.34,5454900\n11-Jun-07,102.87,104.00,102.50,103.22,5091700\n8-Jun-07,101.80,103.21,101.75,103.07,7866800\n7-Jun-07,102.46,103.17,101.56,101.80,12194700\n6-Jun-07,105.50,105.51,102.39,102.41,22074800\n5-Jun-07,106.55,106.55,105.54,105.84,5034300\n4-Jun-07,106.50,106.59,105.58,106.23,4514300\n1-Jun-07,106.62,107.24,106.02,106.54,5210500\n31-May-07,107.26,107.67,106.00,106.60,5027100\n30-May-07,105.40,107.10,105.21,106.93,7073300\n29-May-07,105.57,106.63,105.30,105.91,5222500\n25-May-07,103.90,105.43,103.85,105.18,4643100\n24-May-07,105.45,105.98,103.57,103.95,6342900\n23-May-07,106.80,107.00,105.25,105.58,4195800\n22-May-07,106.95,107.25,106.01,106.70,5133600\n21-May-07,107.67,108.00,106.87,107.04,7144000\n18-May-07,105.84,108.05,105.60,107.99,9627300\n17-May-07,105.61,106.23,104.73,105.31,7499800\n16-May-07,105.10,105.89,104.53,105.87,5403000\n15-May-07,105.40,105.80,104.70,104.83,5979600\n14-May-07,105.81,106.25,104.79,105.57,5016200\n11-May-07,104.69,105.99,104.67,105.98,5981100\n10-May-07,103.82,105.11,103.71,104.68,8920800\n9-May-07,103.93,104.75,103.70,104.38,8174800\n8-May-07,102.42,103.39,102.21,103.29,5753800\n7-May-07,102.76,103.17,102.40,103.16,5476500\n4-May-07,102.75,103.03,102.25,102.96,5364800\n3-May-07,101.75,103.00,101.35,102.80,7056400\n2-May-07,102.80,103.14,102.13,102.22,6688100\n1-May-07,102.06,103.17,102.05,103.17,8165600\n30-Apr-07,101.11,103.00,100.97,102.21,9906800\n27-Apr-07,100.30,101.17,100.06,101.17,5746300\n26-Apr-07,101.00,101.50,100.21,100.90,8355600\n25-Apr-07,98.74,101.70,98.73,101.46,14122300\n24-Apr-07,97.23,99.90,97.23,98.49,20869500\n23-Apr-07,95.16,95.73,95.05,95.21,7159400\n20-Apr-07,95.02,95.15,93.91,94.58,9171100\n19-Apr-07,94.50,94.87,94.00,94.29,9215400\n18-Apr-07,94.80,95.91,94.40,94.80,15182800\n17-Apr-07,96.30,97.66,96.02,97.12,9008300\n16-Apr-07,94.99,96.30,94.72,96.18,6813200\n13-Apr-07,95.75,95.75,94.59,94.93,5944600\n12-Apr-07,95.03,95.82,94.53,95.67,6382100\n11-Apr-07,96.51,96.70,94.95,95.16,5923800\n10-Apr-07,96.40,96.80,96.16,96.46,3580800\n9-Apr-07,96.43,96.94,96.12,96.62,4809900\n5-Apr-07,95.98,96.75,95.75,96.52,3298400\n4-Apr-07,95.80,96.45,95.57,96.21,4218900\n3-Apr-07,95.45,96.23,95.33,96.10,5507600\n2-Apr-07,94.51,95.50,94.06,95.21,5720900\n30-Mar-07,94.24,94.75,93.57,94.26,7533400\n29-Mar-07,94.66,95.11,93.96,94.57,6847900\n28-Mar-07,93.90,95.02,93.80,94.26,8072800\n27-Mar-07,94.71,95.03,94.20,94.73,4468200\n26-Mar-07,95.00,95.25,94.32,95.00,6364200\n23-Mar-07,94.82,95.22,94.65,95.03,4382600\n22-Mar-07,95.10,95.44,94.65,95.19,5617200\n21-Mar-07,94.50,95.81,93.83,95.36,7486600\n20-Mar-07,94.00,94.53,93.55,94.50,4521700\n19-Mar-07,93.95,94.32,93.39,93.99,4495700\n16-Mar-07,94.45,94.45,93.02,93.25,8704400\n15-Mar-07,93.40,93.97,93.10,93.45,5691700\n14-Mar-07,92.65,94.03,92.10,93.76,8284200\n13-Mar-07,93.86,94.47,92.62,92.71,7522700\n12-Mar-07,93.29,94.17,92.97,94.11,5302300\n9-Mar-07,93.48,94.00,92.82,93.28,6147600\n8-Mar-07,94.50,94.82,92.52,93.00,7389500\n7-Mar-07,93.97,94.85,93.62,93.94,9366100\n6-Mar-07,92.40,93.89,92.26,93.80,9074700\n5-Mar-07,90.25,92.15,90.10,91.81,10118900\n2-Mar-07,92.00,92.37,90.84,90.90,9226300\n1-Mar-07,90.25,93.05,88.77,92.27,12807500\n28-Feb-07,93.71,94.09,92.47,92.94,11685500\n27-Feb-07,96.00,96.01,92.88,93.96,11831200\n26-Feb-07,97.86,97.86,96.46,96.91,5744600\n23-Feb-07,98.26,98.44,97.41,97.73,6321300\n22-Feb-07,98.80,99.50,97.77,98.50,5847600\n21-Feb-07,98.90,99.37,98.70,99.09,4000100\n20-Feb-07,98.66,99.46,98.55,99.35,3979500\n16-Feb-07,99.12,99.25,98.63,98.99,4787400\n15-Feb-07,99.06,99.52,98.48,98.92,5562800\n14-Feb-07,98.50,99.43,98.25,99.20,5628800\n13-Feb-07,98.60,98.74,97.80,98.29,5613900\n12-Feb-07,98.80,99.20,98.22,98.58,5078500\n9-Feb-07,99.52,99.70,97.81,98.55,6015700\n8-Feb-07,98.90,99.74,98.65,99.62,6072800\n7-Feb-07,99.80,100.36,99.12,99.54,7231000\n6-Feb-07,100.00,100.40,99.54,99.85,6283800\n5-Feb-07,99.17,100.44,98.90,100.38,8130100\n2-Feb-07,99.10,99.73,98.88,99.17,6637600\n1-Feb-07,98.97,99.18,97.96,99.00,6545200\n31-Jan-07,98.80,99.48,98.35,99.15,6176800\n30-Jan-07,98.57,99.45,98.50,99.37,6498400\n29-Jan-07,97.70,98.66,97.45,98.54,6584700\n26-Jan-07,97.52,97.83,96.84,97.45,5599000\n25-Jan-07,97.22,97.92,97.22,97.51,6124800\n24-Jan-07,97.08,97.58,96.58,97.40,5641800\n23-Jan-07,96.91,97.38,96.20,97.08,10218300\n22-Jan-07,96.42,97.23,96.12,97.11,13170300\n19-Jan-07,95.00,96.85,94.55,96.17,25128700\n18-Jan-07,99.80,99.95,98.91,99.45,9938700\n17-Jan-07,100.69,100.90,99.90,100.02,8061500\n16-Jan-07,99.40,100.84,99.30,100.82,9434900\n12-Jan-07,98.99,99.69,98.50,99.34,6453200\n11-Jan-07,99.00,99.90,98.50,98.65,7789300\n10-Jan-07,98.50,99.05,97.93,98.89,8683300\n9-Jan-07,99.08,100.33,99.07,100.07,10947000\n8-Jan-07,98.50,99.50,98.35,98.90,10226600\n5-Jan-07,97.60,97.95,96.91,97.42,7161800\n4-Jan-07,97.25,98.79,96.88,98.31,10459900\n3-Jan-07,97.18,98.40,96.26,97.27,9093700\n29-Dec-06,97.00,97.88,96.83,97.15,4385700\n28-Dec-06,97.11,97.40,96.87,96.97,4456300\n27-Dec-06,96.30,97.23,96.27,97.20,4476200\n26-Dec-06,95.00,95.81,94.92,95.66,2252200\n22-Dec-06,95.75,95.98,95.24,95.25,3001600\n21-Dec-06,95.78,96.50,95.53,95.91,4349100\n20-Dec-06,96.10,96.50,95.70,96.00,3577800\n19-Dec-06,95.10,96.39,94.91,96.00,4902000\n18-Dec-06,94.95,96.16,94.80,95.44,7921500\n15-Dec-06,95.61,95.80,95.05,95.30,8065600\n14-Dec-06,94.97,95.72,94.54,95.36,4581600\n13-Dec-06,94.78,95.33,94.50,94.77,6385500\n12-Dec-06,93.60,94.85,93.30,94.12,7758700\n11-Dec-06,93.72,94.35,93.56,93.64,3417600\n8-Dec-06,93.65,94.39,93.47,93.86,4083900\n7-Dec-06,94.00,94.43,93.55,94.23,4282500\n6-Dec-06,94.48,94.87,94.01,94.12,5823000\n5-Dec-06,93.51,94.64,93.44,94.48,6814000\n4-Dec-06,92.50,93.95,92.25,93.51,7426600\n1-Dec-06,91.90,91.91,90.55,91.25,5416600\n30-Nov-06,91.35,92.48,91.25,91.92,6283700\n29-Nov-06,91.35,91.66,91.01,91.52,4392700\n28-Nov-06,90.65,91.57,90.43,91.35,4904200\n27-Nov-06,92.71,93.24,91.12,91.45,6267100\n24-Nov-06,93.05,93.75,92.98,93.35,1889300\n22-Nov-06,92.90,93.74,92.80,93.52,3329400\n21-Nov-06,93.01,93.43,92.85,93.08,2873200\n20-Nov-06,93.60,93.80,93.01,93.25,4484100\n17-Nov-06,93.42,94.05,93.31,93.81,5138400\n16-Nov-06,93.07,93.60,92.60,93.47,4036900\n15-Nov-06,93.08,93.28,92.54,93.11,4136900\n14-Nov-06,92.00,93.29,91.65,93.29,4710200\n13-Nov-06,91.55,92.43,91.41,92.07,4337400\n10-Nov-06,92.30,92.35,91.63,91.76,5227400\n9-Nov-06,92.59,93.19,92.37,92.42,4458500\n8-Nov-06,92.25,92.92,92.01,92.59,5958700\n7-Nov-06,92.42,93.40,92.41,92.75,7215300\n6-Nov-06,91.50,92.74,91.50,92.60,5868800\n3-Nov-06,91.76,92.34,91.18,91.41,4469500\n2-Nov-06,91.80,91.95,91.25,91.68,4769300\n1-Nov-06,92.50,92.68,91.50,91.80,5734700\n31-Oct-06,91.50,92.68,91.50,92.33,9224000\n30-Oct-06,89.80,92.00,89.80,91.50,5499700\n27-Oct-06,90.91,91.89,90.58,90.76,5590600\n26-Oct-06,91.83,91.93,91.25,91.54,4934000\n25-Oct-06,91.21,91.99,90.94,91.83,5722700\n24-Oct-06,90.91,91.95,90.80,91.49,8926100\n23-Oct-06,90.05,92.00,90.01,91.56,8769400\n20-Oct-06,90.04,90.70,89.55,90.48,7171300\n19-Oct-06,89.80,90.98,89.31,89.86,10351100\n18-Oct-06,90.51,92.04,89.73,89.82,26380600\n17-Oct-06,86.33,87.94,86.22,86.95,10592200\n16-Oct-06,86.08,87.60,85.75,86.71,8438500\n13-Oct-06,84.45,86.21,84.44,86.08,7766500\n12-Oct-06,84.20,84.90,84.10,84.70,4622600\n11-Oct-06,84.15,84.69,83.79,84.19,5172600\n10-Oct-06,83.71,84.63,83.56,84.19,4635100\n9-Oct-06,83.14,84.08,83.00,84.00,4446000\n6-Oct-06,82.93,83.78,82.50,83.14,5294300\n5-Oct-06,82.81,83.21,82.60,82.92,4833900\n4-Oct-06,81.65,83.25,81.63,83.10,6077800\n3-Oct-06,81.88,82.26,81.56,81.65,4766000\n2-Oct-06,81.76,82.47,81.58,81.87,4441100\n29-Sep-06,81.90,82.79,81.77,81.94,4758300\n28-Sep-06,81.85,82.35,81.72,81.99,4477900\n27-Sep-06,82.00,82.67,81.71,82.09,5772600\n26-Sep-06,81.90,82.66,81.70,82.50,4676300\n25-Sep-06,81.65,82.28,81.28,82.00,5631400\n22-Sep-06,81.75,82.12,81.01,81.21,4348500\n21-Sep-06,82.61,83.25,81.35,81.61,8823200\n20-Sep-06,82.37,83.79,82.20,83.42,7390900\n19-Sep-06,81.97,82.09,81.42,81.87,5070500\n18-Sep-06,82.56,83.21,82.17,82.24,4330100\n15-Sep-06,83.21,83.59,82.79,82.94,8179900\n14-Sep-06,81.90,83.00,81.74,82.47,4188800\n13-Sep-06,82.25,82.70,81.84,82.21,4782900\n12-Sep-06,81.14,82.50,81.06,82.28,5292800\n11-Sep-06,80.60,81.20,80.25,80.93,4287100\n8-Sep-06,79.60,80.86,79.35,80.66,4438100\n7-Sep-06,79.90,80.38,79.31,79.40,3878500\n6-Sep-06,80.29,80.69,80.17,80.28,3672700\n5-Sep-06,81.19,81.54,80.60,80.85,3846900\n1-Sep-06,81.13,81.57,80.81,81.41,3216500\n31-Aug-06,81.30,81.50,80.78,80.97,3696200\n30-Aug-06,81.26,81.68,80.84,81.22,4405100\n29-Aug-06,80.06,81.48,80.06,81.40,5139500\n28-Aug-06,79.91,80.47,79.76,80.32,4933400\n25-Aug-06,79.20,80.00,79.14,79.88,3406800\n24-Aug-06,78.90,79.50,78.87,79.38,3450600\n23-Aug-06,78.95,79.47,78.42,78.67,3298600\n22-Aug-06,79.28,79.55,78.61,78.95,4032600\n21-Aug-06,79.51,79.88,78.87,79.28,3547500\n18-Aug-06,79.38,79.97,78.63,79.90,5361400\n17-Aug-06,78.93,79.56,78.53,79.37,5423600\n16-Aug-06,77.48,79.28,77.35,79.09,7017600\n15-Aug-06,76.90,77.14,76.31,77.08,5911100\n14-Aug-06,76.05,77.49,75.60,76.68,4964400\n11-Aug-06,75.34,75.78,75.20,75.48,3675800\n10-Aug-06,75.20,76.08,75.05,75.74,3199500\n9-Aug-06,75.56,76.28,75.39,75.39,4468700\n8-Aug-06,75.63,76.26,75.11,75.33,3725800\n7-Aug-06,75.63,76.20,75.28,75.52,3398200\n4-Aug-06,76.65,76.77,75.32,75.91,4557100\n3-Aug-06,76.00,76.73,74.90,76.33,2746300\n2-Aug-06,76.21,76.93,76.20,76.32,3220500\n1-Aug-06,76.65,77.38,75.75,76.14,4077900\n31-Jul-06,76.44,77.50,76.15,77.41,4943300\n28-Jul-06,76.38,77.30,76.26,76.96,3836500\n27-Jul-06,75.83,77.29,75.75,76.15,6405900\n26-Jul-06,75.48,76.30,75.36,75.83,3828400\n25-Jul-06,75.99,76.41,75.31,75.89,5560600\n24-Jul-06,74.92,76.15,74.92,75.99,5251100\n21-Jul-06,75.49,75.50,74.50,74.86,8128600\n20-Jul-06,75.73,75.88,75.20,75.48,12043700\n19-Jul-06,76.00,77.06,76.00,76.07,12735200\n18-Jul-06,73.70,74.42,72.73,74.26,7631500\n17-Jul-06,73.35,73.94,73.20,73.70,5977900\n14-Jul-06,74.24,74.30,73.37,73.57,6926900\n13-Jul-06,75.01,75.28,73.83,74.24,8704400\n12-Jul-06,76.07,76.30,74.82,75.48,8369400\n"
  },
  {
    "path": "examples/stockserver/MSFT.csv",
    "content": "﻿Date,Open,High,Low,Close,Volume\n9-Jul-12,30.12,30.23,29.78,30.00,30682552\n6-Jul-12,30.61,30.70,29.95,30.18,38297403\n5-Jul-12,30.59,30.78,30.38,30.70,28802821\n3-Jul-12,30.23,30.76,30.17,30.76,20941442\n2-Jul-12,30.62,30.62,30.21,30.56,30589039\n29-Jun-12,30.45,30.69,30.14,30.59,55227108\n28-Jun-12,29.98,30.05,29.42,29.91,45333920\n27-Jun-12,30.19,30.50,30.03,30.17,33783977\n26-Jun-12,30.00,30.27,29.94,30.02,38422237\n25-Jun-12,30.30,30.32,29.62,29.86,42225199\n22-Jun-12,30.30,30.73,30.03,30.70,45098017\n21-Jun-12,30.96,31.14,30.06,30.14,48461283\n20-Jun-12,30.93,31.05,30.64,30.93,36257101\n19-Jun-12,30.19,31.11,30.05,30.70,75725717\n18-Jun-12,29.99,30.03,29.71,29.84,58679618\n15-Jun-12,29.59,30.08,29.49,30.02,62314362\n14-Jun-12,29.33,29.46,28.88,29.34,39460156\n13-Jun-12,29.22,29.44,29.05,29.13,32984515\n12-Jun-12,29.10,29.30,28.84,29.29,35338135\n11-Jun-12,29.73,29.81,28.82,28.90,46365066\n8-Jun-12,29.21,29.68,29.05,29.65,42554321\n7-Jun-12,29.64,29.70,29.17,29.23,37794901\n6-Jun-12,28.88,29.37,28.81,29.35,46860486\n5-Jun-12,28.51,28.75,28.39,28.50,45715327\n4-Jun-12,28.62,28.78,28.32,28.55,47928161\n1-Jun-12,28.76,28.96,28.44,28.45,56641282\n31-May-12,29.30,29.42,28.94,29.19,39142318\n30-May-12,29.35,29.48,29.12,29.34,41590049\n29-May-12,29.38,29.72,29.22,29.56,37758958\n25-May-12,29.20,29.36,29.01,29.06,29508245\n24-May-12,29.16,29.30,28.76,29.07,52576022\n23-May-12,29.35,29.40,28.64,29.11,65170962\n22-May-12,29.69,29.88,29.50,29.76,39508257\n21-May-12,29.10,29.79,29.06,29.75,38794203\n18-May-12,29.79,29.81,29.17,29.27,56205262\n17-May-12,29.99,30.21,29.71,29.72,48487178\n16-May-12,30.31,30.32,29.74,29.90,60083687\n15-May-12,30.64,30.80,30.15,30.21,61830348\n14-May-12,30.82,31.04,30.64,30.68,40528885\n11-May-12,30.69,31.54,30.69,31.16,43460342\n10-May-12,30.86,31.02,30.45,30.74,43839116\n9-May-12,30.19,30.83,30.10,30.76,50309301\n8-May-12,30.48,30.78,30.17,30.50,46337430\n7-May-12,30.70,30.86,30.57,30.65,48644875\n4-May-12,31.45,31.57,30.92,30.98,57928336\n3-May-12,31.88,31.90,31.61,31.76,31504327\n2-May-12,31.85,31.92,31.64,31.80,37387978\n1-May-12,32.05,32.34,31.95,32.01,43833208\n30-Apr-12,31.98,32.11,31.92,32.02,35706696\n27-Apr-12,32.12,32.22,31.88,31.98,41423609\n26-Apr-12,32.12,32.23,31.92,32.11,40312879\n25-Apr-12,31.92,32.32,31.87,32.20,62496907\n24-Apr-12,32.21,32.52,31.83,31.92,40871061\n23-Apr-12,32.31,32.50,32.03,32.12,61403840\n20-Apr-12,32.15,32.89,32.05,32.42,106052027\n19-Apr-12,31.13,31.68,30.94,31.01,54781106\n18-Apr-12,31.28,31.31,31.04,31.14,40555467\n17-Apr-12,31.27,31.61,31.20,31.44,34361728\n16-Apr-12,30.99,31.19,30.77,31.08,38130098\n13-Apr-12,30.89,31.16,30.72,30.81,39749525\n12-Apr-12,30.48,31.04,30.42,30.98,38306010\n11-Apr-12,30.43,30.53,30.23,30.34,43016353\n10-Apr-12,31.06,31.19,30.30,30.47,54137247\n9-Apr-12,31.22,31.40,30.97,31.10,31062811\n5-Apr-12,31.15,31.63,31.05,31.52,50342719\n4-Apr-12,31.66,31.69,31.05,31.21,49455870\n3-Apr-12,32.16,32.19,31.66,31.94,42709273\n2-Apr-12,32.22,32.46,31.95,32.29,35850785\n30-Mar-12,32.40,32.41,32.04,32.26,31754740\n29-Mar-12,32.06,32.19,31.81,32.12,37038894\n28-Mar-12,32.52,32.70,32.04,32.19,41350041\n27-Mar-12,32.65,32.70,32.40,32.52,36274889\n26-Mar-12,32.19,32.61,32.16,32.59,36758279\n23-Mar-12,32.10,32.11,31.72,32.01,35912885\n22-Mar-12,31.81,32.09,31.79,32.00,31749516\n21-Mar-12,31.96,32.15,31.82,31.91,37935484\n20-Mar-12,32.10,32.15,31.74,31.99,41566788\n19-Mar-12,32.54,32.61,32.15,32.20,44797109\n16-Mar-12,32.91,32.95,32.50,32.60,65626398\n15-Mar-12,32.79,32.94,32.58,32.85,49070794\n14-Mar-12,32.53,32.88,32.49,32.77,41987743\n13-Mar-12,32.24,32.69,32.15,32.67,48951650\n12-Mar-12,31.97,32.20,31.82,32.04,34076755\n9-Mar-12,32.10,32.16,31.92,31.99,34628398\n8-Mar-12,32.04,32.21,31.90,32.01,36752011\n7-Mar-12,31.67,31.92,31.53,31.84,34340619\n6-Mar-12,31.54,31.98,31.49,31.56,51938950\n5-Mar-12,32.01,32.05,31.62,31.80,45239832\n2-Mar-12,32.31,32.44,32.00,32.08,47318927\n1-Mar-12,31.93,32.39,31.85,32.29,77348930\n29-Feb-12,31.88,32.00,31.61,31.74,59326545\n28-Feb-12,31.41,31.93,31.38,31.87,45230573\n27-Feb-12,31.24,31.50,31.10,31.35,34575391\n24-Feb-12,31.48,31.50,31.24,31.48,35577833\n23-Feb-12,31.20,31.59,31.00,31.37,35035609\n22-Feb-12,31.45,31.68,31.18,31.27,49253117\n21-Feb-12,31.18,31.61,31.15,31.44,50832547\n17-Feb-12,31.20,31.32,30.95,31.25,70040830\n16-Feb-12,30.31,31.55,30.30,31.28,94705078\n15-Feb-12,30.33,30.39,30.03,30.05,43316117\n14-Feb-12,30.33,30.46,29.85,30.25,59662711\n13-Feb-12,30.63,30.77,30.43,30.58,33322516\n10-Feb-12,30.64,30.80,30.36,30.50,44606751\n9-Feb-12,30.68,30.80,30.48,30.77,50481549\n8-Feb-12,30.26,30.67,30.22,30.66,49662740\n7-Feb-12,30.15,30.48,30.05,30.35,39242529\n6-Feb-12,30.04,30.22,29.97,30.20,28040378\n3-Feb-12,30.14,30.40,30.09,30.24,41845397\n2-Feb-12,29.90,30.17,29.71,29.95,52226255\n1-Feb-12,29.79,30.05,29.76,29.89,67413817\n31-Jan-12,29.66,29.70,29.23,29.53,50572372\n30-Jan-12,28.97,29.62,28.83,29.61,51114661\n27-Jan-12,29.45,29.53,29.17,29.23,44190573\n26-Jan-12,29.61,29.70,29.40,29.50,49107458\n25-Jan-12,29.07,29.65,29.07,29.56,59236267\n24-Jan-12,29.47,29.57,29.18,29.34,51711367\n23-Jan-12,29.55,29.95,29.35,29.73,76081814\n20-Jan-12,28.82,29.74,28.75,29.71,165902897\n19-Jan-12,28.16,28.44,28.03,28.12,74053427\n18-Jan-12,28.31,28.40,27.97,28.23,64860509\n17-Jan-12,28.40,28.65,28.17,28.26,72395252\n13-Jan-12,28.25,28.25,28.25,28.25,0\n12-Jan-12,27.87,28.02,27.64,28.00,49375477\n11-Jan-12,27.43,27.98,27.37,27.72,65586477\n10-Jan-12,27.93,28.15,27.75,27.84,60014333\n9-Jan-12,28.05,28.10,27.72,27.74,59708266\n6-Jan-12,27.53,28.19,27.52,28.10,99459469\n5-Jan-12,27.38,27.73,27.29,27.68,56082205\n4-Jan-12,26.82,27.47,26.78,27.40,80519402\n3-Jan-12,26.55,26.96,26.39,26.76,64735391\n30-Dec-11,25.96,25.96,25.96,25.96,0\n29-Dec-11,25.95,26.05,25.86,26.02,22616883\n28-Dec-11,25.80,25.80,25.80,25.80,0\n27-Dec-11,25.96,26.14,25.93,26.04,21287332\n23-Dec-11,26.02,26.02,26.02,26.02,0\n22-Dec-11,25.82,25.86,25.48,25.81,35794085\n21-Dec-11,26.01,26.19,25.44,25.76,64134140\n20-Dec-11,26.04,26.04,26.04,26.04,0\n19-Dec-11,26.02,26.12,25.46,25.53,52258284\n16-Dec-11,25.67,26.17,25.63,26.00,101410082\n15-Dec-11,25.72,25.88,25.54,25.56,46217486\n14-Dec-11,25.72,25.86,25.57,25.59,47927107\n13-Dec-11,25.75,26.10,25.65,25.76,54581003\n12-Dec-11,25.41,25.57,25.29,25.51,38945867\n9-Dec-11,25.52,25.87,25.50,25.70,53790403\n8-Dec-11,25.48,25.72,25.37,25.40,60522185\n7-Dec-11,25.67,25.76,25.34,25.60,62669835\n6-Dec-11,25.81,25.87,25.61,25.66,46175294\n5-Dec-11,25.78,25.80,25.50,25.70,56818367\n2-Dec-11,25.59,25.62,25.16,25.22,52295245\n1-Dec-11,25.56,25.63,25.20,25.28,48545338\n30-Nov-11,25.37,25.58,25.14,25.58,81353522\n29-Nov-11,24.82,25.04,24.75,24.84,40920907\n28-Nov-11,24.94,24.97,24.69,24.87,46771878\n25-Nov-11,24.38,24.67,24.30,24.30,26164410\n23-Nov-11,24.47,24.47,24.47,24.47,0\n22-Nov-11,24.89,24.96,24.65,24.79,49204488\n21-Nov-11,25.24,25.25,24.90,25.00,61882819\n18-Nov-11,25.48,25.50,25.15,25.30,47627157\n17-Nov-11,26.01,26.04,25.44,25.54,70977495\n16-Nov-11,26.47,26.51,26.04,26.07,53262743\n15-Nov-11,26.56,26.94,26.40,26.74,43877075\n14-Nov-11,26.88,27.00,26.65,26.76,34199146\n11-Nov-11,26.58,27.08,26.57,26.91,37903971\n10-Nov-11,26.47,26.50,26.12,26.28,32517281\n9-Nov-11,26.59,26.75,26.06,26.20,62950825\n8-Nov-11,27.01,27.20,26.68,27.16,47825636\n7-Nov-11,26.21,26.82,26.13,26.80,42586043\n4-Nov-11,26.38,26.40,26.00,26.25,36553269\n3-Nov-11,26.24,26.58,25.98,26.53,65837011\n2-Nov-11,26.10,26.20,25.70,26.01,53536398\n1-Nov-11,26.19,26.32,25.86,25.99,61186956\n31-Oct-11,26.76,27.00,26.62,26.63,46798951\n28-Oct-11,27.14,27.19,26.79,26.98,57712077\n27-Oct-11,27.13,27.40,26.65,27.25,74515622\n26-Oct-11,27.03,27.06,26.10,26.59,63029830\n25-Oct-11,27.08,27.23,26.72,26.81,53554554\n24-Oct-11,27.06,27.40,27.04,27.19,56897791\n21-Oct-11,27.15,27.19,26.80,27.16,76620533\n20-Oct-11,27.26,27.34,26.40,27.04,76300104\n19-Oct-11,27.37,27.47,27.01,27.13,42881648\n18-Oct-11,26.94,27.40,26.80,27.31,52491969\n17-Oct-11,27.11,27.42,26.85,26.98,39453241\n14-Oct-11,27.31,27.50,27.02,27.27,50949439\n13-Oct-11,26.76,27.20,26.62,27.18,43830076\n12-Oct-11,27.18,27.31,26.90,26.96,52493454\n11-Oct-11,26.86,27.07,26.72,27.00,38826791\n10-Oct-11,26.58,26.97,26.47,26.94,41822239\n7-Oct-11,26.34,26.51,26.20,26.25,52748451\n6-Oct-11,25.90,26.40,25.70,26.34,55113496\n5-Oct-11,25.42,26.16,25.16,25.89,94061244\n4-Oct-11,24.30,25.39,24.26,25.34,83485396\n3-Oct-11,24.72,25.34,24.52,24.53,64596171\n30-Sep-11,25.20,25.50,24.88,24.89,54086654\n29-Sep-11,25.98,26.17,25.09,25.45,63411976\n28-Sep-11,25.93,26.37,25.51,25.58,60740399\n27-Sep-11,25.66,25.92,25.45,25.67,55623705\n26-Sep-11,25.19,25.52,24.73,25.44,51057571\n23-Sep-11,24.90,25.15,24.69,25.06,64769019\n22-Sep-11,25.30,25.65,24.60,25.06,96285920\n21-Sep-11,27.05,27.06,25.97,25.99,72750701\n20-Sep-11,27.31,27.50,26.93,26.98,49211857\n19-Sep-11,26.80,27.31,26.60,27.21,52324841\n16-Sep-11,27.05,27.27,26.83,27.12,89685212\n15-Sep-11,26.73,27.03,26.31,26.99,67809210\n14-Sep-11,26.17,26.80,25.89,26.50,66742534\n13-Sep-11,25.92,26.18,25.81,26.04,48794446\n12-Sep-11,25.44,25.93,25.27,25.89,55047244\n9-Sep-11,26.00,26.18,25.50,25.74,64531339\n8-Sep-11,26.00,26.66,25.95,26.22,65818212\n7-Sep-11,25.69,26.00,25.57,26.00,41960917\n6-Sep-11,25.20,25.59,25.11,25.51,54931986\n2-Sep-11,25.78,26.00,25.66,25.80,43897065\n1-Sep-11,26.46,26.86,26.21,26.21,60511548\n31-Aug-11,26.29,26.71,26.26,26.60,59301724\n30-Aug-11,25.73,26.43,25.70,26.23,57341367\n29-Aug-11,25.53,25.86,25.37,25.84,38863136\n26-Aug-11,24.51,25.34,24.42,25.25,71959200\n25-Aug-11,25.08,25.16,24.50,24.57,48191924\n24-Aug-11,24.65,24.93,24.42,24.90,45329610\n23-Aug-11,24.03,24.75,24.03,24.72,59671022\n22-Aug-11,24.42,24.49,23.79,23.98,54720967\n19-Aug-11,24.41,24.62,23.91,24.05,77402319\n18-Aug-11,24.57,25.09,24.03,24.67,105715509\n17-Aug-11,25.25,25.70,24.93,25.24,50923682\n16-Aug-11,25.22,25.59,25.05,25.35,54256723\n15-Aug-11,25.24,25.58,25.15,25.51,56529388\n12-Aug-11,25.13,25.34,24.65,25.10,64791784\n11-Aug-11,24.50,25.38,24.40,25.19,90697205\n10-Aug-11,24.95,25.09,24.10,24.20,127819718\n9-Aug-11,0.00,25.62,24.03,25.58,126278864\n8-Aug-11,25.02,25.60,24.39,24.48,134257113\n5-Aug-11,25.97,26.10,25.23,25.68,112072491\n4-Aug-11,26.53,26.87,25.93,25.94,92953765\n3-Aug-11,26.64,27.00,26.48,26.92,64583238\n2-Aug-11,26.98,27.45,26.76,26.80,63883018\n1-Aug-11,27.51,27.68,26.75,27.27,61846218\n29-Jul-11,27.52,27.71,27.26,27.40,104394739\n28-Jul-11,27.29,28.07,27.21,27.72,83766901\n27-Jul-11,27.88,27.98,27.20,27.33,71492139\n26-Jul-11,27.82,28.14,27.78,28.08,74643391\n25-Jul-11,27.26,28.09,27.19,27.91,108486590\n22-Jul-11,26.86,27.55,26.68,27.53,76380505\n21-Jul-11,27.04,27.31,26.65,27.10,81737342\n20-Jul-11,27.28,27.35,26.98,27.06,49795352\n19-Jul-11,26.81,27.64,26.78,27.54,86730600\n18-Jul-11,26.63,26.90,26.26,26.59,44506711\n15-Jul-11,26.47,26.93,26.47,26.78,49134401\n14-Jul-11,26.62,27.01,26.36,26.47,46385928\n13-Jul-11,26.60,26.96,26.51,26.63,40869336\n12-Jul-11,26.55,26.79,26.34,26.54,47320989\n11-Jul-11,26.62,26.80,26.49,26.63,44000715\n8-Jul-11,26.54,26.98,26.51,26.92,58332434\n7-Jul-11,26.49,26.88,26.36,26.77,51950943\n6-Jul-11,25.97,26.37,25.96,26.33,48748894\n5-Jul-11,26.10,26.15,25.90,26.03,37803059\n1-Jul-11,26.02,26.02,26.02,26.02,0\n30-Jun-11,25.74,26.00,25.66,26.00,52536288\n29-Jun-11,25.71,25.71,25.36,25.62,66052078\n28-Jun-11,25.30,25.92,25.16,25.80,81032018\n27-Jun-11,24.23,25.46,24.23,25.20,92044114\n24-Jun-11,24.51,24.54,24.19,24.30,101387157\n23-Jun-11,24.44,24.65,24.20,24.63,59472060\n22-Jun-11,24.60,24.81,24.59,24.65,44290814\n21-Jun-11,24.52,24.86,24.40,24.76,49712104\n20-Jun-11,24.17,24.66,24.16,24.47,54344045\n17-Jun-11,24.22,24.30,23.98,24.26,83352877\n16-Jun-11,23.75,24.10,23.65,24.00,57190388\n15-Jun-11,24.00,24.01,23.67,23.74,49410128\n14-Jun-11,24.30,24.45,24.19,24.22,42902699\n13-Jun-11,23.79,29.05,23.70,24.04,47574074\n10-Jun-11,24.02,24.02,23.69,23.70,49327104\n9-Jun-11,24.01,24.04,23.82,23.96,42882262\n8-Jun-11,23.90,24.02,23.86,23.94,42206806\n7-Jun-11,24.09,24.17,23.90,24.06,41112524\n6-Jun-11,23.90,24.25,23.77,24.01,54778670\n3-Jun-11,24.05,24.14,23.84,23.90,60697662\n2-Jun-11,24.49,24.65,24.18,24.22,51487738\n1-Jun-11,24.99,25.10,24.37,24.43,74036467\n31-May-11,24.96,25.06,24.70,25.01,60196203\n27-May-11,24.76,24.76,24.76,24.76,0\n26-May-11,24.35,25.03,24.32,24.67,78016538\n25-May-11,24.17,24.31,24.16,24.19,34903112\n24-May-11,24.20,24.29,24.04,24.15,47692976\n23-May-11,24.21,24.25,24.03,24.17,52703425\n20-May-11,24.72,24.87,24.44,24.49,45451462\n19-May-11,24.85,24.88,24.50,24.72,37783590\n18-May-11,24.53,24.74,24.25,24.69,53931025\n17-May-11,24.40,24.70,24.27,24.52,82894458\n16-May-11,24.96,25.07,24.50,24.57,91402408\n13-May-11,25.28,25.32,24.95,25.03,66819290\n12-May-11,25.35,25.39,25.10,25.32,77366952\n11-May-11,25.65,25.66,25.21,25.36,78604669\n10-May-11,25.38,25.85,25.25,25.67,120806139\n9-May-11,25.80,25.96,25.67,25.83,38696376\n6-May-11,26.07,26.22,25.75,25.87,55993642\n5-May-11,26.05,26.08,25.68,25.79,55626793\n4-May-11,25.85,26.25,25.79,26.06,73292270\n3-May-11,25.60,25.85,25.49,25.81,71909361\n2-May-11,25.94,26.00,25.48,25.66,89834099\n29-Apr-11,26.55,26.64,25.36,25.92,319317852\n28-Apr-11,26.46,26.87,26.40,26.71,80158577\n27-Apr-11,26.30,26.39,26.13,26.38,52688981\n26-Apr-11,25.74,26.44,25.67,26.19,69199457\n25-Apr-11,25.56,25.62,25.34,25.61,33525057\n21-Apr-11,25.52,25.52,25.52,25.52,0\n20-Apr-11,25.54,26.00,25.51,25.76,61608587\n19-Apr-11,25.00,25.17,24.87,25.15,38892333\n18-Apr-11,25.10,25.28,24.72,25.08,58046281\n15-Apr-11,25.46,25.56,25.18,25.37,65080348\n14-Apr-11,25.42,25.44,25.09,25.42,55245529\n13-Apr-11,25.65,25.87,25.56,25.63,38144621\n12-Apr-11,25.83,25.85,25.55,25.64,36936975\n11-Apr-11,26.19,26.25,25.80,25.98,34286211\n8-Apr-11,26.17,26.28,25.96,26.07,39890629\n7-Apr-11,26.19,26.26,25.97,26.20,46134637\n6-Apr-11,25.98,26.31,25.86,26.15,65589617\n5-Apr-11,25.82,26.18,25.74,25.78,73693937\n4-Apr-11,25.45,25.66,25.41,25.55,35441052\n1-Apr-11,25.53,25.53,25.31,25.48,63114201\n31-Mar-11,25.60,25.68,25.34,25.39,63281785\n30-Mar-11,25.60,25.72,25.50,25.61,42000178\n29-Mar-11,25.34,25.52,25.30,25.49,40772423\n28-Mar-11,25.66,25.72,25.38,25.41,48975380\n25-Mar-11,25.93,25.95,25.59,25.62,57031023\n24-Mar-11,25.60,25.87,25.50,25.81,38696661\n23-Mar-11,25.23,25.61,25.18,25.54,44018832\n22-Mar-11,25.30,25.46,25.23,25.30,30903641\n21-Mar-11,25.18,25.58,25.15,25.33,46895059\n18-Mar-11,25.06,25.18,24.80,24.80,85486688\n17-Mar-11,25.06,25.22,24.75,24.78,62506557\n16-Mar-11,25.22,25.28,24.68,24.79,100718988\n15-Mar-11,25.08,25.47,25.00,25.39,76047451\n14-Mar-11,25.49,25.76,25.35,25.69,54456558\n11-Mar-11,25.41,25.85,25.36,25.68,49906849\n10-Mar-11,25.62,25.71,25.35,25.41,66557502\n9-Mar-11,25.81,25.98,25.66,25.89,39792379\n8-Mar-11,25.77,26.02,25.65,25.91,50555383\n7-Mar-11,26.13,26.27,25.55,25.72,64987131\n4-Mar-11,26.22,26.24,25.80,25.95,70437154\n3-Mar-11,26.26,26.40,26.18,26.20,68271500\n2-Mar-11,26.11,26.37,26.04,26.08,48658193\n1-Mar-11,26.60,26.78,26.15,26.16,60054986\n28-Feb-11,26.69,26.86,26.51,26.58,51379675\n25-Feb-11,26.91,26.95,26.50,26.55,53006263\n24-Feb-11,26.64,27.06,26.50,26.77,64499005\n23-Feb-11,26.53,26.86,26.43,26.59,60234083\n22-Feb-11,26.78,27.10,26.52,26.59,60888998\n18-Feb-11,27.06,27.06,27.06,27.06,0\n17-Feb-11,26.97,27.37,26.91,27.21,57211558\n16-Feb-11,27.05,27.07,26.60,27.02,70817867\n15-Feb-11,27.04,27.33,26.95,26.96,44120592\n14-Feb-11,27.20,27.27,26.95,27.23,56766112\n11-Feb-11,27.76,27.81,27.07,27.25,83939643\n10-Feb-11,27.93,27.94,27.29,27.50,76672349\n9-Feb-11,28.19,28.26,27.91,27.97,52905018\n8-Feb-11,28.10,28.34,28.05,28.28,34910467\n7-Feb-11,27.80,28.34,27.79,28.20,68980871\n4-Feb-11,27.70,27.84,27.51,27.77,40416627\n3-Feb-11,27.96,27.97,27.54,27.65,60340059\n2-Feb-11,27.93,28.11,27.88,27.94,45836488\n1-Feb-11,27.80,28.06,27.61,27.99,62810661\n31-Jan-11,27.77,27.90,27.42,27.72,65028938\n28-Jan-11,28.90,28.93,27.45,27.75,141259158\n27-Jan-11,28.75,29.46,28.49,28.87,146938589\n26-Jan-11,28.51,28.99,28.50,28.78,74628760\n25-Jan-11,28.14,28.45,28.12,28.45,42436532\n24-Jan-11,28.02,28.56,27.99,28.38,52055812\n21-Jan-11,28.40,28.43,28.02,28.02,58080269\n20-Jan-11,28.50,28.55,28.13,28.35,58621931\n19-Jan-11,28.46,28.68,28.27,28.47,50005830\n18-Jan-11,28.16,28.74,28.14,28.66,53332616\n14-Jan-11,28.30,28.30,28.30,28.30,0\n13-Jan-11,28.33,28.39,28.01,28.19,67082768\n12-Jan-11,28.12,28.59,28.07,28.55,52636699\n11-Jan-11,28.20,28.25,28.05,28.11,50308414\n10-Jan-11,28.26,28.40,28.04,28.22,57573450\n7-Jan-11,28.64,28.74,28.25,28.60,73761979\n6-Jan-11,28.04,28.85,27.86,28.82,88026271\n5-Jan-11,27.90,28.01,27.77,28.00,58998239\n4-Jan-11,27.94,28.17,27.85,28.09,54409555\n3-Jan-11,28.05,28.18,27.92,27.98,53450110\n31-Dec-10,27.80,27.92,27.63,27.91,24791329\n30-Dec-10,27.92,28.00,27.78,27.85,20790442\n29-Dec-10,27.94,28.12,27.88,27.97,19505935\n28-Dec-10,27.97,28.17,27.96,28.01,23049217\n27-Dec-10,28.12,28.20,27.88,28.07,21654880\n23-Dec-10,28.30,28.30,28.30,28.30,0\n22-Dec-10,28.01,28.40,27.98,28.19,42255763\n21-Dec-10,27.85,28.14,27.76,28.07,38152996\n20-Dec-10,27.95,27.99,27.68,27.81,52810910\n17-Dec-10,27.92,28.09,27.75,27.90,87456444\n16-Dec-10,27.76,27.99,27.66,27.99,57680104\n15-Dec-10,27.53,27.99,27.53,27.85,69634200\n14-Dec-10,27.31,27.75,27.26,27.62,64095005\n13-Dec-10,27.27,27.45,27.17,27.24,47943855\n10-Dec-10,27.19,27.40,27.11,27.34,37629009\n9-Dec-10,27.28,27.34,27.01,27.08,47148284\n8-Dec-10,26.83,27.24,26.80,27.23,41666716\n7-Dec-10,27.08,27.13,26.85,26.87,57860447\n6-Dec-10,26.93,26.98,26.76,26.84,36273877\n3-Dec-10,26.81,27.06,26.78,27.02,52621910\n2-Dec-10,26.24,26.98,26.20,26.89,91798687\n1-Dec-10,25.57,26.25,25.56,26.04,74123490\n30-Nov-10,25.05,25.47,25.00,25.26,75282094\n29-Nov-10,25.19,25.42,24.93,25.31,56608148\n26-Nov-10,25.21,25.41,25.17,25.25,21356527\n24-Nov-10,25.37,25.37,25.37,25.37,0\n23-Nov-10,25.57,25.60,25.09,25.12,69806770\n22-Nov-10,25.65,25.74,25.44,25.73,53350441\n19-Nov-10,25.80,25.83,25.60,25.69,52423174\n18-Nov-10,25.71,26.08,25.61,25.84,59518954\n17-Nov-10,25.90,25.91,25.55,25.57,58299609\n16-Nov-10,26.04,26.04,25.65,25.81,65339110\n15-Nov-10,26.33,26.50,26.17,26.20,51794559\n12-Nov-10,26.47,26.52,26.10,26.27,64962139\n11-Nov-10,26.68,26.72,26.28,26.68,62076710\n10-Nov-10,27.01,27.08,26.81,26.94,52277301\n9-Nov-10,26.81,27.11,26.71,26.95,58594443\n8-Nov-10,26.96,27.05,26.58,26.81,71670771\n5-Nov-10,27.17,27.19,26.53,26.85,110953685\n4-Nov-10,27.41,27.43,27.01,27.14,93599285\n3-Nov-10,27.46,27.49,26.96,27.03,110255273\n2-Nov-10,27.06,27.42,27.02,27.39,54402096\n1-Nov-10,26.88,27.22,26.70,26.95,61916183\n29-Oct-10,27.15,27.20,26.48,26.66,114193191\n28-Oct-10,26.21,26.38,25.92,26.28,80730261\n27-Oct-10,25.79,26.11,25.62,26.05,64805406\n26-Oct-10,25.12,25.97,25.06,25.90,69304104\n25-Oct-10,25.24,25.35,25.17,25.19,50912304\n22-Oct-10,25.52,25.54,25.27,25.38,25844141\n21-Oct-10,25.40,25.54,25.05,25.42,50032354\n20-Oct-10,25.26,25.40,25.10,25.31,56283551\n19-Oct-10,25.27,25.37,24.95,25.10,66150875\n18-Oct-10,25.59,25.95,25.45,25.82,48396780\n15-Oct-10,25.36,25.55,25.23,25.54,68954747\n14-Oct-10,25.29,25.34,25.00,25.23,51985403\n13-Oct-10,25.02,25.54,24.89,25.34,75336441\n12-Oct-10,24.65,24.93,24.43,24.83,50141421\n11-Oct-10,24.74,24.74,24.50,24.59,27587722\n8-Oct-10,24.62,24.65,24.37,24.57,41328991\n7-Oct-10,24.62,24.75,24.28,24.53,50096043\n6-Oct-10,24.32,24.54,24.13,24.43,50489603\n5-Oct-10,24.06,24.45,23.91,24.35,78152892\n4-Oct-10,23.96,23.99,23.78,23.91,98143158\n1-Oct-10,24.77,24.82,24.30,24.38,62672276\n30-Sep-10,24.61,24.83,24.36,24.49,61271057\n29-Sep-10,24.63,24.66,24.40,24.50,44318896\n28-Sep-10,24.80,24.90,24.35,24.68,56041120\n27-Sep-10,24.85,24.99,24.59,24.73,43732859\n24-Sep-10,24.64,24.80,24.58,24.78,51948788\n23-Sep-10,24.51,24.59,24.36,24.43,46210109\n22-Sep-10,24.89,24.97,24.36,24.61,94299353\n21-Sep-10,25.42,25.42,25.08,25.15,52924157\n20-Sep-10,25.28,25.52,25.11,25.43,49877219\n17-Sep-10,25.40,25.53,25.08,25.22,70341518\n16-Sep-10,25.06,25.37,25.05,25.33,44548260\n15-Sep-10,25.10,25.22,24.92,25.12,56204376\n14-Sep-10,25.04,25.35,24.89,25.03,87160392\n13-Sep-10,24.20,25.29,24.09,25.11,114680387\n10-Sep-10,23.98,24.03,23.79,23.85,58293790\n9-Sep-10,24.19,24.21,23.99,24.01,46028831\n8-Sep-10,24.07,24.20,23.74,23.93,65512329\n7-Sep-10,24.10,24.30,23.92,23.96,51928618\n6-Sep-10,24.29,24.29,24.29,24.29,0\n3-Sep-10,24.29,24.29,24.29,24.29,0\n2-Sep-10,23.88,23.95,23.71,23.94,48837044\n1-Sep-10,23.67,23.95,23.54,23.90,65235852\n31-Aug-10,23.60,23.73,23.32,23.46,66083495\n30-Aug-10,23.74,23.82,23.60,23.64,45453037\n27-Aug-10,23.88,23.93,23.51,23.93,60944493\n26-Aug-10,24.09,24.19,23.79,23.82,49105276\n25-Aug-10,24.00,24.22,23.87,24.10,47404767\n24-Aug-10,24.09,24.35,24.02,24.04,66532358\n23-Aug-10,24.44,24.56,24.24,24.28,51728126\n20-Aug-10,24.31,24.40,24.20,24.23,49565732\n19-Aug-10,24.62,24.74,24.21,24.44,54069035\n18-Aug-10,24.68,24.95,24.41,24.82,46818826\n17-Aug-10,24.71,24.96,24.60,24.71,52935026\n16-Aug-10,24.36,24.61,24.30,24.50,40968392\n13-Aug-10,24.35,24.67,24.25,24.40,45263430\n12-Aug-10,24.42,24.61,24.40,24.49,70240460\n11-Aug-10,24.68,24.90,24.56,24.86,76745824\n10-Aug-10,25.33,25.34,24.88,25.07,87257683\n9-Aug-10,25.55,25.73,25.37,25.61,57102542\n6-Aug-10,25.18,25.56,25.02,25.55,55985489\n5-Aug-10,25.49,25.58,25.21,25.37,64922012\n4-Aug-10,26.15,26.24,25.44,25.73,78531804\n3-Aug-10,26.20,26.35,25.97,26.16,56877663\n2-Aug-10,25.99,26.38,25.75,26.33,55044515\n30-Jul-10,25.75,25.84,25.35,25.81,83534777\n29-Jul-10,26.13,26.41,25.60,26.03,69446188\n28-Jul-10,26.07,26.19,25.83,25.95,69704731\n27-Jul-10,26.14,26.24,25.96,26.16,60682484\n26-Jul-10,25.86,26.20,25.80,26.10,67249812\n23-Jul-10,25.84,26.02,25.25,25.81,108520012\n22-Jul-10,25.51,25.99,25.47,25.84,73016369\n21-Jul-10,25.60,25.65,24.98,25.12,73297593\n20-Jul-10,24.86,25.48,24.70,25.48,45530162\n19-Jul-10,24.96,25.30,24.91,25.23,38181760\n16-Jul-10,25.51,25.64,24.88,24.89,65064760\n15-Jul-10,25.50,25.59,24.98,25.51,56934631\n14-Jul-10,25.50,25.61,25.12,25.44,72808022\n13-Jul-10,25.14,25.30,24.90,25.13,61928666\n12-Jul-10,24.43,24.89,24.42,24.83,49862201\n9-Jul-10,24.33,24.41,24.15,24.27,53811348\n8-Jul-10,24.60,24.62,23.97,24.41,50768072\n7-Jul-10,23.82,24.32,23.61,24.30,81967278\n6-Jul-10,23.70,24.09,23.58,23.82,73594554\n5-Jul-10,23.27,23.27,23.27,23.27,0\n2-Jul-10,23.27,23.27,23.27,23.27,0\n1-Jul-10,23.09,23.32,22.73,23.16,92239399\n30-Jun-10,23.30,23.68,22.95,23.01,81057995\n29-Jun-10,24.13,24.20,23.11,23.31,119885791\n28-Jun-10,24.51,24.61,24.12,24.31,73787879\n25-Jun-10,25.05,25.11,24.31,24.53,156256672\n24-Jun-10,25.46,25.72,24.93,25.00,85252196\n23-Jun-10,25.78,25.78,25.22,25.31,61468282\n22-Jun-10,26.16,26.45,25.76,25.77,55986386\n21-Jun-10,26.78,26.89,25.89,25.95,54625218\n18-Jun-10,26.37,26.53,26.17,26.44,52079257\n17-Jun-10,26.56,26.67,26.04,26.37,47998692\n16-Jun-10,26.47,26.58,26.23,26.32,48699364\n15-Jun-10,25.75,26.65,25.74,26.58,81644277\n14-Jun-10,25.86,25.96,25.47,25.50,50972363\n11-Jun-10,25.04,25.72,24.77,25.66,68057774\n10-Jun-10,25.13,25.15,24.78,25.00,78950407\n9-Jun-10,25.22,25.52,24.75,24.79,87808432\n8-Jun-10,25.25,25.26,24.65,25.11,87354921\n7-Jun-10,25.82,25.83,25.24,25.29,80456154\n4-Jun-10,26.10,26.57,25.62,25.79,89833275\n3-Jun-10,26.55,26.93,26.41,26.86,67839372\n2-Jun-10,26.06,26.48,25.73,26.46,65718772\n1-Jun-10,25.53,26.31,25.52,25.89,76155453\n31-May-10,25.80,25.80,25.80,25.80,0\n28-May-10,25.80,25.80,25.80,25.80,0\n27-May-10,25.73,26.36,25.72,26.00,136434525\n26-May-10,26.23,26.60,24.56,25.01,176684012\n25-May-10,25.65,26.33,25.38,26.07,98373509\n24-May-10,26.85,26.86,26.26,26.27,73712018\n21-May-10,26.63,27.11,26.44,26.84,117600229\n20-May-10,27.65,27.84,27.04,27.11,87991056\n19-May-10,28.52,28.69,27.79,28.24,61754173\n18-May-10,28.87,29.00,28.40,28.60,52772107\n17-May-10,29.12,29.23,28.45,28.94,46055496\n14-May-10,29.20,29.21,28.64,28.93,63333959\n13-May-10,29.26,29.73,29.18,29.24,45291598\n12-May-10,28.98,29.58,28.92,29.44,47152462\n11-May-10,28.68,29.65,28.57,28.88,63803037\n10-May-10,29.01,29.48,28.71,28.94,86656268\n7-May-10,28.88,28.95,27.32,28.21,173718024\n6-May-10,29.59,29.88,27.91,28.98,128612951\n5-May-10,29.77,30.09,29.69,29.85,66833778\n4-May-10,30.52,30.55,29.75,30.13,82085579\n3-May-10,30.67,31.06,30.58,30.86,43990036\n30-Apr-10,31.07,31.08,30.52,30.54,63220209\n29-Apr-10,30.93,31.43,30.67,31.00,52671781\n28-Apr-10,30.92,31.00,30.62,30.91,64557901\n27-Apr-10,30.95,31.25,30.75,30.84,68732315\n26-Apr-10,31.00,31.28,30.86,31.11,63652231\n23-Apr-10,31.12,31.58,30.65,30.96,126766583\n22-Apr-10,31.04,31.53,30.90,31.39,84847551\n21-Apr-10,31.33,31.50,31.23,31.33,55343086\n20-Apr-10,31.22,31.44,31.13,31.36,52206093\n19-Apr-10,30.77,31.25,30.76,31.04,64970248\n16-Apr-10,30.79,30.98,30.60,30.67,88707802\n15-Apr-10,30.82,30.95,30.71,30.87,52748075\n14-Apr-10,30.79,31.00,30.66,30.82,68941186\n13-Apr-10,30.15,30.50,30.13,30.45,41374514\n12-Apr-10,30.25,30.49,30.20,30.32,37074279\n9-Apr-10,29.95,30.41,29.90,30.34,54755457\n8-Apr-10,29.32,29.98,29.30,29.92,63713716\n7-Apr-10,29.16,29.56,29.14,29.35,58320552\n6-Apr-10,29.15,29.58,28.98,29.32,47366786\n5-Apr-10,29.13,29.42,29.03,29.27,34338235\n2-Apr-10,29.16,29.16,29.16,29.16,0\n1-Apr-10,29.16,29.16,29.16,29.16,0\n31-Mar-10,29.64,29.72,29.17,29.29,63762620\n30-Mar-10,29.63,29.86,29.50,29.77,34955871\n29-Mar-10,29.71,29.82,29.55,29.59,33340722\n26-Mar-10,30.09,30.20,29.59,29.66,55604731\n25-Mar-10,29.83,30.57,29.80,30.01,73176624\n24-Mar-10,29.72,29.85,29.60,29.65,33993584\n23-Mar-10,29.59,29.90,29.41,29.88,42026555\n22-Mar-10,29.50,29.70,29.39,29.60,37718162\n19-Mar-10,29.76,29.90,29.35,29.59,81341090\n18-Mar-10,29.63,29.72,29.50,29.61,43845199\n17-Mar-10,29.50,29.87,29.40,29.63,50386698\n16-Mar-10,29.42,29.49,29.20,29.37,36732935\n15-Mar-10,29.18,29.37,29.01,29.29,37516750\n12-Mar-10,29.32,29.38,29.04,29.27,31709321\n11-Mar-10,28.89,29.19,28.85,29.18,35353651\n10-Mar-10,28.86,29.11,28.80,28.97,44898608\n9-Mar-10,28.56,29.11,28.55,28.80,50278457\n8-Mar-10,28.52,28.93,28.50,28.63,39421396\n5-Mar-10,28.66,28.68,28.42,28.59,56005054\n4-Mar-10,28.46,28.65,28.27,28.63,42894184\n3-Mar-10,28.51,28.61,28.35,28.46,48442081\n2-Mar-10,29.08,29.30,28.24,28.46,93129838\n1-Mar-10,28.77,29.05,28.53,29.02,43805302\n26-Feb-10,28.65,28.85,28.51,28.67,40372889\n25-Feb-10,28.27,28.65,28.02,28.60,48735294\n24-Feb-10,28.52,28.79,28.38,28.63,43166875\n23-Feb-10,28.68,28.83,28.09,28.33,52270044\n22-Feb-10,28.84,28.94,28.65,28.73,36710350\n19-Feb-10,28.79,28.92,28.69,28.77,44461634\n18-Feb-10,28.59,29.03,28.51,28.97,42856501\n17-Feb-10,28.53,28.65,28.36,28.59,45882842\n16-Feb-10,28.13,28.37,28.02,28.35,51938098\n15-Feb-10,27.93,27.93,27.93,27.93,0\n12-Feb-10,27.93,27.93,27.93,27.93,0\n11-Feb-10,27.93,28.40,27.70,28.12,65995913\n10-Feb-10,28.03,28.24,27.84,27.99,48591246\n9-Feb-10,27.97,28.34,27.75,28.01,59195742\n8-Feb-10,28.01,28.08,27.57,27.72,52826474\n5-Feb-10,28.00,28.28,27.57,28.02,80960063\n4-Feb-10,28.38,28.50,27.81,27.84,77849968\n3-Feb-10,28.26,28.79,28.12,28.63,61397848\n2-Feb-10,28.37,28.50,28.14,28.46,54413654\n1-Feb-10,28.39,28.48,27.92,28.41,85931099\n29-Jan-10,29.90,29.92,27.66,28.18,193888424\n28-Jan-10,29.84,29.87,28.89,29.16,117513692\n27-Jan-10,29.35,29.82,29.02,29.67,63949492\n26-Jan-10,29.20,29.85,29.09,29.50,66647676\n25-Jan-10,29.24,29.66,29.10,29.32,63381173\n22-Jan-10,30.00,30.20,28.84,28.96,102004573\n21-Jan-10,30.61,30.72,30.00,30.01,73086701\n20-Jan-10,30.81,30.94,30.31,30.58,54857712\n19-Jan-10,30.75,31.24,30.68,31.10,46582886\n18-Jan-10,30.86,30.86,30.86,30.86,0\n15-Jan-10,30.86,30.86,30.86,30.86,0\n14-Jan-10,30.31,31.10,30.26,30.96,63244767\n13-Jan-10,30.26,30.52,30.01,30.35,51863463\n12-Jan-10,30.15,30.40,29.91,30.07,65913228\n11-Jan-10,30.71,30.76,30.12,30.27,68754648\n8-Jan-10,30.28,30.88,30.24,30.66,51201289\n7-Jan-10,30.63,30.70,30.19,30.45,50564285\n6-Jan-10,30.88,31.08,30.52,30.77,58182332\n5-Jan-10,30.85,31.10,30.64,30.96,49758862\n4-Jan-10,30.62,31.10,30.59,30.95,38414185\n1-Jan-10,30.48,30.48,30.48,30.48,0\n31-Dec-09,30.48,30.48,30.48,30.48,0\n30-Dec-09,31.15,31.29,30.80,30.96,42007597\n29-Dec-09,31.35,31.50,31.23,31.39,29722450\n28-Dec-09,31.00,31.18,30.89,31.17,25385575\n25-Dec-09,31.00,31.00,31.00,31.00,0\n24-Dec-09,30.88,31.00,30.76,31.00,11083867\n23-Dec-09,30.71,30.95,30.69,30.92,28362689\n22-Dec-09,30.60,30.93,30.54,30.82,36320920\n21-Dec-09,30.40,30.84,30.37,30.52,40132875\n18-Dec-09,29.84,30.45,29.80,30.36,94117968\n17-Dec-09,29.95,29.96,29.57,29.60,43691182\n16-Dec-09,30.07,30.41,30.04,30.10,55741169\n15-Dec-09,29.89,30.21,29.88,30.02,49473151\n14-Dec-09,29.91,30.16,29.90,30.11,34651154\n11-Dec-09,29.97,30.00,29.79,29.85,43746588\n10-Dec-09,29.71,29.96,29.66,29.87,45940703\n9-Dec-09,29.47,29.81,29.25,29.71,44719350\n8-Dec-09,29.52,29.74,29.38,29.57,37407912\n7-Dec-09,29.78,30.08,29.68,29.79,38082612\n4-Dec-09,30.05,30.37,29.83,29.98,58819960\n3-Dec-09,29.84,30.20,29.76,29.83,43096326\n2-Dec-09,29.90,29.99,29.65,29.78,36308524\n1-Dec-09,29.52,30.05,29.41,30.01,49907182\n30-Nov-09,29.15,29.45,29.00,29.41,44174645\n27-Nov-09,29.11,29.39,28.75,29.22,29357892\n26-Nov-09,29.79,29.79,29.79,29.79,0\n25-Nov-09,29.81,29.86,29.58,29.79,32036164\n24-Nov-09,29.95,29.99,29.75,29.91,37341362\n23-Nov-09,29.84,30.01,29.70,29.94,41836365\n20-Nov-09,29.66,29.77,29.43,29.62,42648018\n19-Nov-09,29.99,30.00,29.70,29.78,51967660\n18-Nov-09,30.00,30.14,29.81,30.11,59440915\n17-Nov-09,29.50,30.00,29.47,30.00,75648887\n16-Nov-09,29.61,29.80,29.37,29.54,54129501\n13-Nov-09,29.47,29.79,29.37,29.63,53044975\n12-Nov-09,29.01,29.49,29.00,29.36,55360706\n11-Nov-09,29.08,29.30,29.02,29.12,49693320\n10-Nov-09,28.90,29.28,28.81,29.01,65881036\n9-Nov-09,28.62,29.00,28.53,28.99,57522019\n6-Nov-09,28.38,28.63,28.20,28.52,38909997\n5-Nov-09,28.52,28.74,28.28,28.47,52683314\n4-Nov-09,27.69,28.39,27.62,28.06,63898306\n3-Nov-09,27.64,27.74,27.43,27.53,50294715\n2-Nov-09,27.70,28.05,27.41,27.88,62432606\n30-Oct-09,28.03,28.40,27.66,27.73,73371734\n29-Oct-09,28.07,28.41,27.85,28.22,65232886\n28-Oct-09,28.24,28.77,27.95,28.02,73542323\n27-Oct-09,28.73,28.88,28.44,28.59,69685783\n26-Oct-09,28.12,29.02,28.11,28.68,124149662\n23-Oct-09,29.20,29.35,27.88,28.02,281760947\n22-Oct-09,26.56,26.72,26.13,26.59,61599926\n21-Oct-09,26.46,26.75,26.39,26.58,61672603\n20-Oct-09,26.42,26.51,25.94,26.37,54613476\n19-Oct-09,26.49,26.58,26.25,26.36,48143163\n16-Oct-09,26.45,26.63,26.10,26.50,56500866\n15-Oct-09,25.90,26.71,25.90,26.71,65620101\n14-Oct-09,26.14,26.20,25.82,25.96,45365489\n13-Oct-09,25.59,25.94,25.52,25.81,37748964\n12-Oct-09,25.66,25.89,25.55,25.72,29153569\n9-Oct-09,25.57,25.79,25.46,25.55,39522259\n8-Oct-09,25.44,25.90,25.22,25.67,60521239\n7-Oct-09,24.99,25.18,24.88,25.10,38473856\n6-Oct-09,24.68,25.21,24.66,25.11,48795241\n5-Oct-09,24.98,25.06,24.52,24.64,60809818\n2-Oct-09,24.46,25.09,24.43,24.96,51226259\n1-Oct-09,25.40,25.47,24.80,24.88,75958097\n30-Sep-09,25.76,25.99,25.38,25.72,63537684\n29-Sep-09,25.91,25.96,25.69,25.75,39050278\n28-Sep-09,25.60,26.16,25.60,25.83,44363585\n25-Sep-09,25.69,25.82,25.52,25.55,50161051\n24-Sep-09,25.92,26.11,25.66,25.94,56310695\n23-Sep-09,25.92,26.25,25.64,25.69,60544519\n22-Sep-09,25.40,25.82,25.29,25.77,61378342\n21-Sep-09,25.11,25.37,25.10,25.30,28878663\n18-Sep-09,25.46,25.48,25.10,25.26,68016403\n17-Sep-09,25.06,25.38,25.06,25.30,42431643\n16-Sep-09,25.25,25.35,24.95,25.20,50055778\n15-Sep-09,24.97,25.27,24.86,25.20,44718408\n14-Sep-09,24.65,25.09,24.64,25.00,42810156\n11-Sep-09,24.93,25.17,24.81,24.86,54304284\n10-Sep-09,24.80,25.05,24.65,25.00,46258757\n9-Sep-09,24.74,24.95,24.66,24.78,49900235\n8-Sep-09,24.62,24.84,24.41,24.82,53738665\n4-Sep-09,24.09,24.80,24.08,24.62,44999631\n3-Sep-09,23.91,24.14,23.76,24.11,34120376\n2-Sep-09,23.82,24.14,23.78,23.86,40771253\n1-Sep-09,24.35,24.74,23.90,24.00,62608465\n31-Aug-09,24.57,24.85,24.29,24.65,49597146\n28-Aug-09,25.07,25.49,24.61,24.68,55807969\n27-Aug-09,24.41,24.78,24.30,24.69,45495600\n26-Aug-09,24.59,24.75,24.42,24.55,41079001\n25-Aug-09,24.60,24.82,24.46,24.64,43980206\n24-Aug-09,24.41,24.73,24.28,24.64,54180889\n21-Aug-09,23.93,24.42,23.77,24.41,69018918\n20-Aug-09,23.60,23.87,23.54,23.67,39508124\n19-Aug-09,23.25,23.72,23.25,23.65,41827419\n18-Aug-09,23.29,23.65,23.27,23.58,38878900\n17-Aug-09,23.32,23.60,23.23,23.25,42482887\n14-Aug-09,23.62,23.80,23.51,23.69,46331960\n13-Aug-09,23.63,23.85,23.40,23.62,38955807\n12-Aug-09,23.13,23.90,23.03,23.53,61972277\n10-Aug-09,23.46,23.55,23.30,23.42,35268300\n7-Aug-09,23.75,23.82,23.50,23.56,46174325\n6-Aug-09,23.93,23.98,23.27,23.46,59694624\n5-Aug-09,23.84,24.25,23.79,23.81,53310241\n4-Aug-09,23.68,23.79,23.53,23.77,49218228\n3-Aug-09,23.82,23.86,23.50,23.83,46902837\n31-Jul-09,23.77,24.07,23.50,23.52,54265278\n30-Jul-09,24.20,24.43,23.71,23.81,67819964\n29-Jul-09,23.73,23.91,23.34,23.80,73626862\n28-Jul-09,22.99,23.55,22.90,23.47,70288380\n27-Jul-09,23.44,23.45,22.90,23.11,80949924\n24-Jul-09,23.61,23.89,22.81,23.45,215135609\n23-Jul-09,24.93,25.72,24.84,25.56,106060477\n22-Jul-09,24.70,24.90,24.51,24.80,66192409\n21-Jul-09,24.69,24.83,24.37,24.83,52028399\n20-Jul-09,24.44,24.53,24.15,24.53,47797971\n17-Jul-09,24.40,24.45,24.10,24.29,52860096\n16-Jul-09,23.93,24.44,23.86,24.44,64560963\n15-Jul-09,23.75,24.12,23.56,24.12,67241887\n14-Jul-09,23.20,23.22,22.86,23.11,45448634\n13-Jul-09,22.42,23.29,22.14,23.23,67585958\n10-Jul-09,22.19,22.54,22.15,22.39,43238698\n9-Jul-09,22.65,22.81,22.37,22.44,46981174\n8-Jul-09,22.31,22.69,22.00,22.56,73023306\n7-Jul-09,23.08,23.14,22.46,22.53,52842412\n6-Jul-09,23.21,23.28,22.87,23.20,49207638\n3-Jul-09,23.37,23.37,23.37,23.37,0\n2-Jul-09,23.76,24.04,23.21,23.37,65427699\n1-Jul-09,24.05,24.30,23.96,24.04,54915127\n30-Jun-09,23.97,24.24,23.63,23.77,66452303\n29-Jun-09,23.60,24.03,23.55,23.86,62864396\n26-Jun-09,23.57,23.69,23.32,23.35,65126363\n25-Jun-09,23.43,23.92,23.20,23.79,57722555\n24-Jun-09,23.45,23.75,23.36,23.47,54287632\n23-Jun-09,23.38,23.66,23.21,23.34,56753482\n22-Jun-09,23.95,23.95,23.25,23.28,71296464\n19-Jun-09,24.04,24.34,23.75,24.07,115458922\n18-Jun-09,23.62,23.69,23.30,23.50,58852177\n17-Jun-09,23.50,23.82,23.17,23.68,86483075\n16-Jun-09,23.47,24.11,23.44,23.45,105295558\n15-Jun-09,23.23,23.54,23.02,23.42,69089588\n12-Jun-09,22.90,23.38,22.74,23.33,50963461\n11-Jun-09,22.59,23.26,22.57,22.83,65128974\n10-Jun-09,22.17,22.62,22.12,22.55,61297117\n9-Jun-09,22.06,22.32,21.88,22.08,50887629\n8-Jun-09,21.98,22.32,21.63,22.05,49008050\n5-Jun-09,21.96,22.31,21.81,22.14,59585285\n4-Jun-09,21.77,21.90,21.58,21.83,42332565\n3-Jun-09,21.31,21.76,21.29,21.73,56047439\n2-Jun-09,21.36,21.98,21.20,21.40,48941777\n1-Jun-09,21.00,21.50,20.86,21.40,57322905\n29-May-09,20.56,20.94,20.30,20.89,46139533\n28-May-09,20.32,20.63,20.05,20.45,45484759\n27-May-09,20.25,20.60,20.07,20.13,42898438\n26-May-09,19.54,20.45,19.45,20.34,44996741\n22-May-09,19.93,20.17,19.47,19.75,37325792\n21-May-09,20.14,20.23,19.51,19.82,58241500\n20-May-09,20.41,20.69,20.22,20.38,47452295\n19-May-09,20.51,20.74,20.25,20.31,51368251\n18-May-09,20.36,20.60,20.24,20.60,46077725\n15-May-09,20.13,20.50,19.98,20.22,61289838\n14-May-09,19.83,20.23,19.80,20.06,54544880\n13-May-09,19.92,20.00,19.67,19.75,49288225\n12-May-09,19.51,20.06,19.47,19.89,71966786\n11-May-09,19.20,19.73,19.01,19.32,63769338\n8-May-09,19.46,19.64,19.14,19.42,67604246\n7-May-09,19.96,19.99,19.14,19.32,68727152\n6-May-09,20.06,20.07,19.61,19.79,59639015\n5-May-09,20.14,20.24,19.64,19.79,67242977\n4-May-09,20.37,20.40,19.98,20.19,54313367\n1-May-09,20.19,20.35,19.86,20.24,63224473\n30-Apr-09,20.60,21.10,20.01,20.26,87439809\n29-Apr-09,20.11,20.89,20.06,20.25,79301588\n28-Apr-09,20.25,20.27,19.79,19.93,76688300\n27-Apr-09,20.55,20.82,20.28,20.40,68219574\n24-Apr-09,19.82,21.20,19.50,20.91,168478498\n23-Apr-09,18.92,18.94,18.47,18.92,86116273\n22-Apr-09,18.76,19.19,18.70,18.78,59400937\n21-Apr-09,18.59,19.08,18.57,18.97,60928280\n20-Apr-09,18.89,18.95,18.57,18.61,62943434\n17-Apr-09,19.68,19.69,19.00,19.20,61398450\n16-Apr-09,19.16,19.78,18.99,19.76,67691952\n15-Apr-09,19.21,19.25,18.51,18.83,72725459\n14-Apr-09,19.44,19.55,19.00,19.35,63796243\n13-Apr-09,19.69,19.85,19.37,19.59,44450425\n10-Apr-09,19.67,19.67,19.67,19.67,0\n9-Apr-09,19.45,19.70,19.22,19.67,55759562\n8-Apr-09,18.97,19.62,18.96,19.19,56408826\n7-Apr-09,18.76,19.14,18.63,18.76,65815169\n6-Apr-09,18.54,18.76,18.26,18.76,47478684\n3-Apr-09,19.13,19.15,18.43,18.75,81367063\n2-Apr-09,19.50,19.89,19.00,19.29,99082236\n1-Apr-09,18.23,19.36,18.18,19.31,96438844\n31-Mar-09,17.83,18.79,17.78,18.37,92423291\n30-Mar-09,17.74,17.76,17.27,17.48,49640619\n27-Mar-09,18.54,18.62,18.05,18.13,47673696\n26-Mar-09,18.17,18.88,18.12,18.83,63780075\n25-Mar-09,17.98,18.31,17.52,17.88,73932163\n24-Mar-09,18.04,18.21,17.84,17.93,50090354\n23-Mar-09,17.37,18.59,17.31,18.33,71607826\n20-Mar-09,17.32,17.65,16.88,17.06,81742575\n19-Mar-09,17.37,17.45,16.92,17.14,58998888\n18-Mar-09,17.03,17.22,16.60,16.96,70733199\n17-Mar-09,16.32,16.90,16.26,16.90,62669277\n16-Mar-09,16.82,16.96,16.24,16.25,67038412\n13-Mar-09,16.98,17.05,16.18,16.65,82974543\n12-Mar-09,17.01,17.04,16.48,17.01,93719791\n11-Mar-09,16.63,17.20,16.43,17.11,84582532\n10-Mar-09,15.37,16.62,15.25,16.48,95191803\n9-Mar-09,15.20,15.74,15.10,15.15,66514260\n6-Mar-09,15.35,15.62,14.87,15.28,92853699\n5-Mar-09,15.86,15.88,15.27,15.27,89704742\n4-Mar-09,16.12,16.40,15.89,16.12,69290013\n3-Mar-09,16.03,16.24,15.64,15.88,80476554\n2-Mar-09,15.96,16.25,15.72,15.79,80597104\n27-Feb-09,16.29,16.52,16.10,16.15,93434279\n26-Feb-09,17.05,17.08,16.42,16.42,83219416\n25-Feb-09,17.01,17.24,16.46,16.96,105894560\n24-Feb-09,17.03,17.35,16.36,17.17,122673954\n23-Feb-09,18.02,18.15,17.16,17.21,70803342\n20-Feb-09,17.77,18.19,17.66,18.00,69415921\n19-Feb-09,18.30,18.38,17.81,17.91,49197636\n18-Feb-09,18.22,18.45,18.00,18.12,54955158\n17-Feb-09,18.49,18.50,17.89,18.09,75853206\n13-Feb-09,19.27,19.47,19.04,19.09,47419392\n12-Feb-09,18.97,19.32,18.54,19.26,75323479\n11-Feb-09,18.94,19.49,18.92,19.21,58599423\n10-Feb-09,19.25,19.80,18.70,18.80,83958715\n9-Feb-09,19.64,19.77,19.26,19.44,52196149\n6-Feb-09,19.16,19.93,19.06,19.66,86745927\n5-Feb-09,18.51,19.14,18.25,19.04,75197935\n4-Feb-09,18.54,19.00,18.50,18.63,75617853\n3-Feb-09,17.85,18.61,17.60,18.50,86881249\n2-Feb-09,17.03,18.13,17.00,17.83,88882500\n30-Jan-09,17.74,17.79,17.10,17.10,62378208\n29-Jan-09,17.78,17.96,17.56,17.59,49209360\n28-Jan-09,17.80,18.31,17.76,18.04,64702531\n27-Jan-09,17.78,17.97,17.43,17.66,61707540\n26-Jan-09,17.29,17.81,17.23,17.63,93115480\n23-Jan-09,16.97,17.49,16.75,17.20,117020593\n22-Jan-09,18.05,18.18,17.07,17.11,222435525\n21-Jan-09,18.87,19.45,18.46,19.38,68358085\n20-Jan-09,19.46,19.62,18.37,18.48,89891855\n16-Jan-09,19.63,19.91,19.15,19.71,79640268\n15-Jan-09,19.07,19.30,18.52,19.24,96214587\n14-Jan-09,19.53,19.68,19.01,19.09,80341720\n13-Jan-09,19.52,19.99,19.52,19.82,65847793\n12-Jan-09,19.71,19.79,19.30,19.47,52204130\n9-Jan-09,20.17,20.30,19.41,19.52,49828297\n8-Jan-09,19.63,20.19,19.55,20.12,70255018\n7-Jan-09,20.19,20.29,19.48,19.51,72747158\n6-Jan-09,20.75,21.00,20.61,20.76,58085878\n5-Jan-09,20.20,20.67,20.06,20.52,61476552\n2-Jan-09,19.53,20.40,19.37,20.33,50121849\n1-Jan-09,19.44,19.44,19.44,19.44,0\n31-Dec-08,19.31,19.68,19.27,19.44,46424902\n30-Dec-08,19.01,19.49,19.00,19.34,43228892\n29-Dec-08,19.15,19.21,18.64,18.96,58886322\n26-Dec-08,19.20,19.33,19.09,19.13,23104614\n25-Dec-08,19.17,19.17,19.17,19.17,0\n24-Dec-08,19.26,19.45,19.10,19.17,16894070\n23-Dec-08,19.28,19.57,19.01,19.28,47535826\n22-Dec-08,19.24,19.29,18.89,19.18,58577826\n19-Dec-08,19.42,19.80,19.11,19.12,115432039\n18-Dec-08,19.86,20.02,18.99,19.30,80765009\n17-Dec-08,19.81,20.05,19.50,19.66,79049035\n16-Dec-08,19.21,20.18,19.00,20.11,97707493\n15-Dec-08,19.34,19.44,18.89,19.04,59936439\n12-Dec-08,19.15,19.85,18.70,19.36,78130797\n11-Dec-08,20.11,20.12,19.31,19.45,83624211\n10-Dec-08,20.82,20.96,20.30,20.61,61501699\n9-Dec-08,20.62,21.25,20.46,20.60,80499585\n8-Dec-08,20.35,21.25,20.14,21.01,107229949\n5-Dec-08,18.91,19.98,18.47,19.87,91996769\n4-Dec-08,19.40,19.92,18.79,19.11,78724702\n3-Dec-08,18.65,19.90,18.60,19.87,80970409\n2-Dec-08,18.99,19.31,18.56,19.15,79692371\n1-Dec-08,19.88,19.95,18.60,18.61,79873774\n28-Nov-08,20.23,20.31,20.02,20.22,31371936\n27-Nov-08,20.49,20.49,20.49,20.49,0\n26-Nov-08,19.73,20.68,19.73,20.49,79682260\n25-Nov-08,20.86,20.93,19.55,19.99,92971983\n24-Nov-08,19.89,20.94,19.87,20.69,125298897\n21-Nov-08,18.02,19.70,17.98,19.68,157245554\n20-Nov-08,18.12,18.84,17.50,17.53,139532692\n19-Nov-08,19.63,19.95,18.25,18.29,103048823\n18-Nov-08,19.50,19.66,18.75,19.62,108984798\n17-Nov-08,19.74,20.24,19.15,19.32,97297036\n14-Nov-08,20.56,21.34,19.65,20.06,96626994\n13-Nov-08,20.15,21.25,18.74,21.25,148503311\n12-Nov-08,20.89,21.00,20.28,20.30,90159844\n11-Nov-08,21.29,21.30,20.79,21.20,78032704\n10-Nov-08,21.84,21.97,21.19,21.30,67602599\n7-Nov-08,21.32,21.54,21.00,21.50,69882100\n6-Nov-08,21.87,22.08,20.86,20.88,93242700\n5-Nov-08,23.33,23.34,22.05,22.08,80402000\n4-Nov-08,23.13,23.66,22.87,23.53,71322500\n3-Nov-08,22.48,22.91,22.21,22.62,59735700\n31-Oct-08,22.53,22.91,22.12,22.33,88045000\n30-Oct-08,23.69,23.88,22.39,22.63,93429300\n29-Oct-08,23.13,23.97,22.70,23.00,10495100\n28-Oct-08,21.64,23.21,21.34,23.10,27045500\n27-Oct-08,21.67,21.96,21.02,21.18,15319300\n24-Oct-08,21.06,22.86,20.95,21.96,49517700\n23-Oct-08,21.55,22.59,20.89,22.32,42690400\n22-Oct-08,23.04,23.06,20.90,21.53,46670700\n21-Oct-08,24.30,25.01,23.27,23.36,99511500\n20-Oct-08,24.20,24.75,23.01,24.72,92505200\n17-Oct-08,23.56,25.11,23.31,23.93,30506300\n16-Oct-08,22.94,24.19,21.31,24.19,59369900\n15-Oct-08,23.78,24.25,22.48,22.66,10169800\n14-Oct-08,25.64,25.73,23.60,24.10,59001500\n13-Oct-08,22.86,25.50,22.63,25.50,39340200\n10-Oct-08,21.79,22.35,20.65,21.50,22531200\n9-Oct-08,23.76,23.91,22.07,22.30,29418200\n8-Oct-08,22.90,24.30,22.50,23.01,69134200\n7-Oct-08,24.98,25.21,23.14,23.23,38633700\n6-Oct-08,25.63,25.99,24.14,24.91,42468200\n3-Oct-08,26.36,27.47,26.24,26.32,9560600\n2-Oct-08,26.18,26.53,25.70,26.25,92308400\n1-Oct-08,26.38,26.99,26.28,26.48,82441100\n30-Sep-08,25.77,26.69,25.54,26.69,2950200\n29-Sep-08,26.94,27.66,25.01,25.01,27857700\n26-Sep-08,26.17,27.56,26.14,27.40,99176700\n25-Sep-08,25.82,26.88,25.74,26.61,93988900\n24-Sep-08,25.58,26.09,25.46,25.72,73815800\n23-Sep-08,25.66,26.17,25.34,25.44,90064300\n22-Sep-08,26.22,26.32,25.32,25.40,98239800\n19-Sep-08,26.37,26.40,23.50,25.16,30373500\n18-Sep-08,24.80,25.35,24.01,25.26,27810100\n17-Sep-08,25.73,25.87,24.50,24.57,2573600\n16-Sep-08,26.09,26.49,25.52,25.99,6222700\n15-Sep-08,26.92,27.49,26.73,26.82,81460500\n12-Sep-08,27.14,27.74,26.94,27.62,75039500\n11-Sep-08,26.10,27.46,26.03,27.34,71218300\n10-Sep-08,26.52,26.86,26.25,26.44,73099700\n9-Sep-08,26.20,26.60,26.05,26.10,84321000\n8-Sep-08,26.21,26.33,25.67,26.12,60794100\n5-Sep-08,26.03,26.22,25.63,25.65,80595200\n4-Sep-08,26.74,26.89,26.35,26.35,64569500\n3-Sep-08,27.00,27.18,26.84,26.90,55545200\n2-Sep-08,27.66,27.76,27.06,27.10,65548200\n29-Aug-08,27.68,27.78,27.29,27.29,47427800\n28-Aug-08,27.61,28.01,27.60,27.94,47687600\n27-Aug-08,27.34,27.79,27.13,27.56,32285200\n26-Aug-08,27.58,27.72,27.17,27.27,39789200\n25-Aug-08,27.61,27.84,27.46,27.66,50389500\n22-Aug-08,27.23,27.88,27.22,27.84,47297800\n21-Aug-08,27.10,27.23,26.86,27.18,42745000\n20-Aug-08,27.54,27.58,27.17,27.29,40803300\n19-Aug-08,27.54,27.75,27.27,27.32,38976500\n18-Aug-08,27.78,28.05,27.55,27.69,35526900\n15-Aug-08,27.98,28.15,27.58,27.81,46231000\n14-Aug-08,27.82,28.28,27.56,27.91,47938800\n13-Aug-08,28.07,28.50,27.76,27.91,49559400\n12-Aug-08,27.78,28.36,27.58,28.12,61908800\n11-Aug-08,27.86,28.40,27.66,27.90,68084900\n8-Aug-08,27.35,28.23,27.19,28.13,79758500\n7-Aug-08,26.90,27.75,26.73,27.39,80676900\n6-Aug-08,26.73,27.16,26.38,27.02,93141000\n5-Aug-08,25.64,26.28,25.50,26.21,83435600\n4-Aug-08,25.39,25.54,25.11,25.28,55635700\n1-Aug-08,25.92,25.95,25.07,25.44,78639100\n31-Jul-08,25.85,26.28,25.71,25.72,59042200\n30-Jul-08,26.20,26.49,25.90,26.23,51419000\n29-Jul-08,25.52,26.19,25.40,26.11,59558100\n28-Jul-08,26.06,26.11,25.34,25.50,58227600\n25-Jul-08,25.64,26.22,25.50,26.16,57432500\n24-Jul-08,26.09,26.17,25.44,25.44,78787000\n23-Jul-08,25.86,26.84,25.85,26.43,76086700\n22-Jul-08,25.54,25.94,25.48,25.80,87769600\n21-Jul-08,25.66,26.17,25.53,25.64,74220300\n18-Jul-08,26.36,26.47,25.11,25.86,44703500\n17-Jul-08,27.58,27.91,27.11,27.52,87407700\n16-Jul-08,26.13,27.29,25.92,27.26,78982200\n15-Jul-08,24.93,26.64,24.93,26.15,91697600\n14-Jul-08,25.48,25.81,25.07,25.15,50790700\n11-Jul-08,25.16,25.64,24.87,25.25,67105100\n10-Jul-08,25.20,25.67,24.98,25.45,55598000\n9-Jul-08,25.78,25.85,25.18,25.23,52965900\n8-Jul-08,25.92,26.20,25.51,25.85,64933400\n7-Jul-08,26.11,26.39,25.45,26.03,69505000\n3-Jul-08,25.97,26.10,25.60,25.98,35213800\n2-Jul-08,26.90,27.00,25.88,25.88,82098100\n1-Jul-08,27.26,27.38,23.19,26.87,92057100\n30-Jun-08,27.73,27.98,27.49,27.51,56270100\n27-Jun-08,27.68,27.91,27.46,27.63,65599400\n26-Jun-08,28.03,28.20,27.74,27.75,62968300\n25-Jun-08,27.81,28.67,27.76,28.35,62461800\n24-Jun-08,27.92,28.01,27.51,27.73,64473600\n23-Jun-08,28.30,28.41,27.79,27.97,56493900\n20-Jun-08,28.90,28.92,28.10,28.23,93218500\n19-Jun-08,28.55,29.19,28.33,28.93,60862600\n18-Jun-08,28.55,28.86,28.46,28.46,48595000\n17-Jun-08,29.04,29.12,28.79,28.80,43309100\n16-Jun-08,29.02,29.11,28.64,28.93,70928300\n13-Jun-08,28.63,29.57,28.50,29.07,27509000\n12-Jun-08,27.40,28.55,27.19,28.24,12083900\n11-Jun-08,27.85,27.94,27.11,27.12,56533600\n10-Jun-08,27.36,28.29,27.32,27.89,75927900\n9-Jun-08,27.65,27.91,27.30,27.71,66484000\n6-Jun-08,27.99,28.17,27.49,27.49,77389200\n5-Jun-08,27.72,28.30,27.60,28.30,73743200\n4-Jun-08,27.28,27.64,27.20,27.54,78312300\n3-Jun-08,27.91,28.31,27.27,27.31,81776600\n2-Jun-08,28.24,28.36,27.55,27.80,76591800\n30-May-08,28.38,28.70,28.20,28.32,59716400\n29-May-08,28.21,28.68,28.14,28.31,47102200\n28-May-08,28.56,28.57,28.04,28.18,51598100\n27-May-08,28.11,28.50,28.05,28.44,46177500\n23-May-08,28.26,28.33,27.95,28.05,48195500\n22-May-08,28.28,28.70,28.18,28.47,51665100\n21-May-08,28.81,29.05,28.19,28.25,58177400\n20-May-08,29.30,29.31,28.63,28.76,75128600\n19-May-08,29.87,29.89,29.31,29.46,58486800\n16-May-08,30.47,30.48,29.92,29.99,73242600\n15-May-08,29.98,30.53,29.94,30.45,52765700\n14-May-08,29.89,30.26,29.73,29.93,66331900\n13-May-08,30.00,30.13,29.53,29.78,69783500\n12-May-08,29.40,30.06,29.35,29.99,63305700\n9-May-08,29.21,29.55,28.95,29.39,51117700\n8-May-08,29.28,29.39,29.00,29.27,67980300\n7-May-08,29.69,30.14,29.08,29.21,88132800\n6-May-08,29.00,29.86,28.93,29.70,88534400\n5-May-08,29.93,30.23,28.99,29.08,5581200\n2-May-08,29.59,29.62,28.86,29.24,64503200\n1-May-08,28.50,29.49,28.48,29.40,70561700\n30-Apr-08,28.74,29.21,28.51,28.52,71063300\n29-Apr-08,28.80,28.90,28.45,28.64,83431100\n28-Apr-08,29.80,29.84,28.82,28.99,96583600\n25-Apr-08,30.05,30.39,29.60,29.83,40388800\n24-Apr-08,31.63,32.10,31.16,31.80,4044300\n23-Apr-08,30.45,31.46,30.30,31.45,96236800\n22-Apr-08,30.64,30.70,29.97,30.25,66134100\n21-Apr-08,30.19,30.60,30.12,30.42,53251400\n18-Apr-08,30.01,30.10,29.61,30.00,70651200\n17-Apr-08,29.12,29.34,28.90,29.22,46947000\n16-Apr-08,28.57,29.05,28.38,28.95,53146000\n15-Apr-08,28.12,28.48,28.03,28.25,31267200\n14-Apr-08,28.24,28.31,27.93,28.06,43040100\n11-Apr-08,28.87,29.01,28.21,28.28,48384700\n10-Apr-08,28.83,29.40,28.80,29.11,64374500\n9-Apr-08,28.72,29.04,28.54,28.89,40280000\n8-Apr-08,28.94,29.00,28.54,28.75,43917200\n7-Apr-08,29.55,29.59,29.03,29.16,43600500\n4-Apr-08,29.13,29.26,28.74,29.16,42185200\n3-Apr-08,29.00,29.32,28.80,29.00,38241900\n2-Apr-08,29.56,29.58,29.00,29.16,48996300\n1-Apr-08,28.83,29.54,28.63,29.50,64524200\n31-Mar-08,27.88,28.59,27.84,28.38,44805500\n28-Mar-08,28.23,28.43,27.83,27.91,47429700\n27-Mar-08,28.48,28.49,28.00,28.05,46753900\n26-Mar-08,29.03,29.07,28.38,28.56,43459400\n25-Mar-08,29.33,29.37,28.94,29.14,48434000\n24-Mar-08,29.33,29.40,29.06,29.17,46864700\n20-Mar-08,28.74,29.22,28.59,29.18,58340600\n19-Mar-08,29.38,29.59,28.62,28.62,60585100\n18-Mar-08,28.67,29.48,28.67,29.42,81582300\n17-Mar-08,27.30,28.73,27.28,28.30,81765900\n14-Mar-08,28.72,29.01,27.64,27.96,3765800\n13-Mar-08,28.54,28.99,28.16,28.62,83537300\n12-Mar-08,29.43,29.49,28.54,28.63,73110800\n11-Mar-08,28.40,29.34,28.38,29.28,93596900\n10-Mar-08,27.83,28.26,27.75,28.05,71148800\n7-Mar-08,27.34,28.07,27.32,27.87,76707100\n6-Mar-08,28.06,28.17,27.50,27.57,90379900\n5-Mar-08,27.75,28.41,27.70,28.12,3695700\n4-Mar-08,27.02,27.63,26.96,27.59,84548900\n3-Mar-08,27.24,27.39,26.87,26.99,72007500\n29-Feb-08,27.69,27.83,27.02,27.20,12960600\n28-Feb-08,28.02,28.27,27.80,27.93,80901000\n27-Feb-08,28.19,28.68,28.10,28.26,74433800\n26-Feb-08,27.74,28.86,27.67,28.38,98503400\n25-Feb-08,27.65,28.24,27.48,27.84,9265500\n22-Feb-08,28.24,28.39,27.20,27.68,23972200\n21-Feb-08,28.62,28.96,27.96,28.10,93929500\n20-Feb-08,28.15,28.26,27.92,28.22,91906600\n19-Feb-08,28.80,28.84,28.07,28.17,65959100\n15-Feb-08,28.31,28.64,28.25,28.42,64352200\n14-Feb-08,28.88,29.04,28.46,28.50,66801900\n13-Feb-08,28.62,29.05,28.53,28.96,86135900\n12-Feb-08,28.43,28.62,28.11,28.34,82828900\n11-Feb-08,28.52,28.61,27.91,28.21,52674300\n8-Feb-08,28.29,29.08,28.24,28.56,22963100\n7-Feb-08,28.34,28.78,27.90,28.12,62828100\n6-Feb-08,29.28,29.35,28.29,28.52,34683000\n5-Feb-08,29.91,29.94,28.89,29.07,35043600\n4-Feb-08,30.49,30.72,30.11,30.19,12444400\n1-Feb-08,31.06,33.25,30.25,30.45,63665700\n31-Jan-08,31.91,32.74,31.72,32.60,98739900\n30-Jan-08,32.56,32.80,32.05,32.20,5061000\n29-Jan-08,32.85,32.89,32.35,32.60,66145900\n28-Jan-08,33.02,33.10,32.42,32.72,79929100\n25-Jan-08,34.90,35.00,32.87,32.94,91890600\n24-Jan-08,32.35,33.36,32.12,33.25,37356300\n23-Jan-08,31.48,32.05,31.04,31.93,35086200\n22-Jan-08,31.54,32.53,31.50,31.99,5730000\n18-Jan-08,33.16,34.00,32.97,33.01,11523300\n17-Jan-08,33.54,33.80,32.97,33.11,92438500\n16-Jan-08,33.42,33.65,32.51,33.23,13814600\n15-Jan-08,34.03,34.38,34.00,34.00,59461900\n14-Jan-08,34.46,34.57,34.08,34.39,50871200\n11-Jan-08,34.14,34.24,33.72,33.91,54995500\n10-Jan-08,34.35,34.50,33.78,34.33,70076500\n9-Jan-08,33.36,34.54,33.35,34.44,73496500\n8-Jan-08,34.71,34.71,33.40,33.45,77424900\n7-Jan-08,34.55,34.80,34.25,34.61,79467700\n4-Jan-08,35.19,35.20,34.09,34.38,70404700\n3-Jan-08,35.22,35.65,34.86,35.37,48449400\n2-Jan-08,35.79,35.96,35.00,35.22,61350600\n31-Dec-07,35.90,35.99,35.52,35.60,32211700\n28-Dec-07,36.10,36.23,35.67,36.12,31547500\n27-Dec-07,36.35,36.55,35.94,35.97,30672200\n26-Dec-07,36.41,36.64,36.26,36.61,27555700\n24-Dec-07,36.13,36.72,36.05,36.58,23886300\n21-Dec-07,35.90,36.06,35.75,36.06,68666200\n20-Dec-07,35.29,35.79,35.08,35.52,57315700\n19-Dec-07,34.69,35.14,34.38,34.79,56687400\n18-Dec-07,34.64,35.00,34.21,34.74,51094200\n17-Dec-07,35.03,35.13,34.36,34.39,54891500\n14-Dec-07,35.05,35.84,35.01,35.31,63345100\n13-Dec-07,34.48,35.45,34.28,35.22,70649100\n12-Dec-07,34.61,35.09,33.93,34.47,59617700\n11-Dec-07,34.73,34.99,33.93,34.10,53469000\n10-Dec-07,34.64,34.95,34.47,34.76,35662300\n7-Dec-07,34.61,34.70,34.22,34.53,35847700\n6-Dec-07,34.26,34.61,33.87,34.55,48734400\n5-Dec-07,33.14,34.52,33.03,34.15,82520100\n4-Dec-07,32.74,33.24,32.63,32.77,48964500\n3-Dec-07,33.50,33.64,32.68,32.92,60475900\n30-Nov-07,33.92,34.12,33.19,33.60,66885500\n29-Nov-07,33.58,33.93,33.31,33.59,51576500\n28-Nov-07,33.38,33.89,32.90,33.70,85853000\n27-Nov-07,33.27,33.60,32.68,33.06,83201700\n26-Nov-07,34.09,34.37,32.93,32.97,79477500\n23-Nov-07,34.36,34.44,33.71,34.11,32226900\n21-Nov-07,34.40,34.73,34.18,34.23,88642900\n20-Nov-07,34.23,34.97,34.10,34.58,97035900\n19-Nov-07,33.96,34.24,33.87,33.96,62077100\n16-Nov-07,33.86,34.26,33.71,34.09,69874400\n15-Nov-07,33.76,34.10,33.55,33.76,61000800\n14-Nov-07,34.62,34.75,33.75,33.93,80553300\n13-Nov-07,33.54,34.67,33.44,34.46,2614300\n12-Nov-07,33.32,33.71,33.02,33.38,81932500\n9-Nov-07,34.18,34.54,33.65,33.73,23657200\n8-Nov-07,35.60,35.90,34.40,34.74,21314700\n7-Nov-07,36.04,36.16,35.45,35.52,72863500\n6-Nov-07,36.59,36.66,35.87,36.41,97569000\n5-Nov-07,36.76,37.10,36.63,36.73,69148700\n2-Nov-07,37.22,37.50,36.42,37.06,94408500\n1-Nov-07,36.53,37.49,36.36,37.06,48435400\n31-Oct-07,35.52,37.00,35.51,36.81,80628100\n30-Oct-07,34.37,35.59,34.35,35.57,4888100\n29-Oct-07,34.85,35.29,34.45,34.57,5848800\n26-Oct-07,36.01,36.03,34.56,35.03,67622500\n25-Oct-07,31.57,32.22,31.49,31.99,33881600\n24-Oct-07,30.85,31.30,30.50,31.25,74830100\n23-Oct-07,30.71,31.12,30.71,30.90,48052000\n22-Oct-07,30.12,30.70,30.12,30.51,53781500\n19-Oct-07,31.09,31.09,30.11,30.17,60885100\n18-Oct-07,31.22,31.23,30.63,31.16,45729800\n17-Oct-07,30.75,31.23,30.65,31.08,82566700\n16-Oct-07,30.24,30.58,30.23,30.32,52266000\n15-Oct-07,30.10,30.33,30.00,30.04,45690000\n12-Oct-07,30.03,30.40,29.95,30.17,30056300\n11-Oct-07,30.30,30.63,29.79,29.91,49108500\n10-Oct-07,30.04,30.37,30.03,30.23,31776400\n9-Oct-07,30.03,30.39,30.00,30.10,60009300\n8-Oct-07,29.66,29.85,29.60,29.84,29955300\n5-Oct-07,29.89,29.99,29.73,29.84,43365600\n4-Oct-07,29.56,29.77,29.44,29.71,36996100\n3-Oct-07,29.71,29.85,29.29,29.45,36147200\n2-Oct-07,29.70,29.85,29.57,29.70,32076600\n1-Oct-07,29.46,29.79,29.41,29.77,41565100\n28-Sep-07,29.49,29.69,29.23,29.46,43213600\n27-Sep-07,29.70,29.72,29.44,29.49,40336200\n26-Sep-07,29.68,29.85,29.48,29.50,55512700\n25-Sep-07,29.14,29.56,29.11,29.56,73044100\n24-Sep-07,28.81,29.61,28.80,29.08,99206000\n21-Sep-07,28.69,28.81,28.44,28.65,13121600\n20-Sep-07,28.48,28.58,28.34,28.42,64292500\n19-Sep-07,28.87,28.91,28.30,28.67,91815900\n18-Sep-07,28.70,28.96,28.27,28.93,71149800\n17-Sep-07,28.79,28.88,28.62,28.72,36841200\n14-Sep-07,28.98,29.11,28.88,29.04,32491000\n13-Sep-07,29.12,29.26,28.96,29.16,31968000\n12-Sep-07,28.81,29.17,28.80,28.93,36889000\n11-Sep-07,28.63,28.95,28.58,28.93,33050700\n10-Sep-07,28.67,28.75,28.41,28.48,35436200\n7-Sep-07,28.62,28.83,28.32,28.44,42033800\n6-Sep-07,28.56,29.01,28.55,28.91,44278900\n5-Sep-07,28.65,28.73,28.42,28.48,43335900\n4-Sep-07,28.50,29.10,28.48,28.81,43686700\n31-Aug-07,28.70,28.92,28.36,28.73,39040800\n30-Aug-07,28.42,28.93,28.32,28.45,32169200\n29-Aug-07,28.13,28.61,27.82,28.59,40544200\n28-Aug-07,28.30,28.49,27.91,27.93,39539000\n27-Aug-07,28.61,28.77,28.40,28.49,26000100\n24-Aug-07,28.21,28.84,28.07,28.81,42783900\n23-Aug-07,28.28,28.33,28.10,28.30,33219900\n22-Aug-07,28.27,28.32,28.01,28.22,37808000\n21-Aug-07,28.10,28.32,27.87,28.07,46932800\n20-Aug-07,28.18,28.49,28.08,28.26,44090400\n17-Aug-07,28.09,28.25,27.82,28.25,69146100\n16-Aug-07,27.88,28.35,27.51,27.81,72632500\n15-Aug-07,28.24,28.99,28.05,28.10,45689500\n14-Aug-07,28.77,28.89,28.20,28.27,38819900\n13-Aug-07,28.94,28.99,28.44,28.63,45332400\n10-Aug-07,28.90,29.05,28.26,28.71,74908000\n9-Aug-07,29.64,30.10,28.92,29.30,71265200\n8-Aug-07,29.72,30.01,29.21,30.00,44751700\n7-Aug-07,29.33,29.79,29.05,29.55,44712100\n6-Aug-07,29.05,29.54,28.75,29.54,56775400\n3-Aug-07,29.45,29.78,28.90,28.96,55186900\n2-Aug-07,29.19,29.79,29.02,29.52,46255000\n1-Aug-07,28.95,29.55,28.82,29.30,70018300\n31-Jul-07,29.71,29.72,28.98,28.99,53228700\n30-Jul-07,29.40,29.49,28.95,29.40,59058000\n27-Jul-07,29.93,30.00,29.36,29.39,56074400\n26-Jul-07,30.24,30.53,29.51,29.98,75216000\n25-Jul-07,30.99,31.30,30.37,30.71,52407400\n24-Jul-07,31.01,31.48,30.71,30.80,49759100\n23-Jul-07,31.36,31.52,31.12,31.19,47644100\n20-Jul-07,31.15,31.20,30.79,31.16,91796700\n19-Jul-07,31.05,31.84,30.93,31.51,2914900\n18-Jul-07,30.51,30.97,30.50,30.92,60887800\n17-Jul-07,30.02,30.88,30.01,30.78,73946800\n16-Jul-07,29.76,30.24,29.72,30.03,35057700\n13-Jul-07,29.94,30.02,29.66,29.82,40567500\n12-Jul-07,29.56,30.11,29.44,30.07,52651500\n11-Jul-07,29.24,29.65,29.21,29.49,41390600\n10-Jul-07,29.70,29.99,29.18,29.33,62561200\n9-Jul-07,29.86,29.95,29.81,29.87,32194800\n6-Jul-07,29.91,30.04,29.66,29.97,48328200\n5-Jul-07,30.05,30.22,29.83,29.99,43663700\n3-Jul-07,29.78,30.22,29.78,30.02,29579000\n2-Jul-07,29.67,29.80,29.49,29.74,41397300\n29-Jun-07,29.87,29.93,29.04,29.47,67546500\n28-Jun-07,29.86,29.97,29.68,29.83,39647800\n27-Jun-07,29.36,29.95,29.36,29.87,44272500\n26-Jun-07,29.55,29.80,29.50,29.52,43536700\n25-Jun-07,29.47,29.77,29.38,29.49,47268800\n22-Jun-07,30.00,30.10,29.45,29.49,71228000\n21-Jun-07,29.98,30.30,29.91,30.22,54856400\n20-Jun-07,30.44,30.51,29.96,30.01,45269300\n19-Jun-07,30.48,30.66,30.38,30.46,44459900\n18-Jun-07,30.69,30.72,30.42,30.51,43603800\n15-Jun-07,30.86,30.88,30.43,30.49,72329300\n14-Jun-07,30.35,30.71,30.30,30.52,53493900\n13-Jun-07,29.97,30.41,29.85,30.39,63048800\n12-Jun-07,29.96,30.24,29.77,29.85,51386100\n11-Jun-07,29.94,30.25,29.93,30.02,42024700\n8-Jun-07,29.58,30.06,29.41,30.05,59838700\n7-Jun-07,30.02,30.29,29.59,29.62,67750200\n6-Jun-07,30.37,30.53,30.25,30.29,36626800\n5-Jun-07,30.62,30.63,30.33,30.58,41329800\n4-Jun-07,30.42,30.76,30.40,30.72,38615400\n1-Jun-07,30.79,30.90,30.55,30.59,37569500\n31-May-07,31.12,31.16,30.61,30.69,65965500\n30-May-07,30.55,31.13,30.51,31.11,51033400\n29-May-07,30.49,30.83,30.39,30.79,40804200\n25-May-07,30.28,30.66,30.18,30.48,45591800\n24-May-07,30.54,30.80,29.96,30.17,62154600\n23-May-07,30.84,30.84,30.57,30.58,43857100\n22-May-07,30.90,30.93,30.66,30.69,37527900\n21-May-07,30.73,31.16,30.73,31.05,38781500\n18-May-07,30.97,30.99,30.58,30.83,54370000\n17-May-07,31.03,31.14,30.96,30.98,39305000\n16-May-07,31.00,31.09,30.81,31.07,43953800\n15-May-07,30.90,31.09,30.84,30.90,71655600\n14-May-07,30.84,30.99,30.81,30.97,48279000\n11-May-07,30.57,30.98,30.55,30.89,43150800\n10-May-07,30.68,30.93,30.53,30.58,54086700\n9-May-07,30.70,30.93,30.57,30.78,50680300\n8-May-07,30.68,30.94,30.58,30.75,47216000\n7-May-07,30.52,30.76,30.48,30.71,58131600\n4-May-07,30.68,30.70,30.29,30.56,96288900\n3-May-07,30.60,31.00,30.53,30.97,80382600\n2-May-07,30.39,30.69,30.30,30.61,70637800\n1-May-07,29.94,30.42,29.90,30.19,69397700\n30-Apr-07,30.13,30.37,29.94,29.94,55304700\n27-Apr-07,30.17,30.74,30.00,30.12,17268700\n26-Apr-07,29.09,29.35,28.91,29.10,56044600\n25-Apr-07,28.86,29.00,28.69,28.99,37025000\n24-Apr-07,28.79,28.96,28.59,28.79,30167300\n23-Apr-07,28.96,28.99,28.67,28.78,36639200\n20-Apr-07,28.98,29.10,28.70,29.02,48871000\n19-Apr-07,28.34,28.89,28.26,28.69,41374600\n18-Apr-07,28.61,28.67,28.36,28.60,40188200\n17-Apr-07,28.63,28.89,28.56,28.85,32148100\n16-Apr-07,28.60,28.75,28.21,28.73,28354300\n13-Apr-07,28.43,28.70,28.10,28.61,35239200\n12-Apr-07,28.06,28.62,28.04,28.54,42885200\n11-Apr-07,28.30,28.57,27.99,28.11,42450300\n10-Apr-07,28.50,28.64,28.22,28.40,36081000\n9-Apr-07,28.58,28.72,28.39,28.57,31101800\n5-Apr-07,28.32,28.65,28.30,28.55,29741200\n4-Apr-07,28.01,28.78,27.90,28.50,54516700\n3-Apr-07,27.86,28.06,27.75,27.87,38895900\n2-Apr-07,27.89,27.93,27.56,27.74,37392600\n30-Mar-07,27.75,27.95,27.50,27.87,43620800\n29-Mar-07,27.84,27.84,27.49,27.75,40935900\n28-Mar-07,27.58,28.00,27.40,27.64,44992600\n27-Mar-07,28.04,28.16,27.65,27.72,53301900\n26-Mar-07,27.94,28.22,27.70,28.22,44181700\n23-Mar-07,28.22,28.27,27.80,28.02,48594400\n22-Mar-07,28.52,28.55,28.01,28.27,45997900\n21-Mar-07,27.90,28.52,27.56,28.52,61475400\n20-Mar-07,27.93,28.16,27.76,27.84,46187600\n19-Mar-07,27.34,27.83,27.20,27.83,44774400\n16-Mar-07,27.35,27.48,27.20,27.33,62144100\n15-Mar-07,27.32,27.47,27.20,27.28,47871000\n14-Mar-07,26.82,27.40,26.73,27.40,74198600\n13-Mar-07,27.25,27.40,26.71,26.72,72260400\n12-Mar-07,27.18,27.48,27.13,27.44,35377200\n9-Mar-07,27.42,27.48,27.03,27.28,55522400\n8-Mar-07,27.72,27.85,26.60,27.32,69723600\n7-Mar-07,27.76,27.90,27.55,27.61,48983900\n6-Mar-07,27.80,27.94,27.65,27.83,45470300\n5-Mar-07,27.49,27.91,27.41,27.55,44732900\n2-Mar-07,28.02,28.16,27.76,27.76,62920800\n1-Mar-07,27.82,28.33,27.73,28.09,79257500\n28-Feb-07,27.95,28.25,27.92,28.17,78443100\n27-Feb-07,28.71,28.97,27.79,27.87,85720900\n26-Feb-07,28.96,29.12,28.82,29.07,58052200\n23-Feb-07,29.22,29.28,28.89,28.90,63604000\n22-Feb-07,29.30,29.54,29.16,29.39,55259000\n21-Feb-07,28.75,29.39,28.74,29.35,64642900\n20-Feb-07,28.63,28.86,28.47,28.83,52107500\n16-Feb-07,28.90,28.94,28.65,28.74,3610000\n15-Feb-07,29.58,29.65,29.22,29.46,52000300\n14-Feb-07,29.17,29.69,29.15,29.40,55204300\n13-Feb-07,29.04,29.20,28.96,29.01,48756600\n12-Feb-07,28.89,29.09,28.83,28.94,47931400\n9-Feb-07,29.35,29.40,28.93,28.98,68660400\n8-Feb-07,29.24,29.80,29.20,29.26,47455700\n7-Feb-07,29.64,29.70,29.25,29.37,64182300\n6-Feb-07,29.59,29.75,29.22,29.51,77599600\n5-Feb-07,29.97,30.02,29.41,29.61,78787900\n2-Feb-07,30.82,30.84,30.13,30.19,56878500\n1-Feb-07,30.84,30.94,30.37,30.56,53223300\n31-Jan-07,30.41,31.10,30.35,30.86,73471900\n30-Jan-07,30.57,30.64,30.14,30.48,61068700\n29-Jan-07,30.65,30.78,30.34,30.53,55960200\n26-Jan-07,31.22,31.23,30.60,30.60,93443200\n25-Jan-07,31.08,31.48,30.45,30.45,82441800\n24-Jan-07,30.78,31.30,30.65,31.09,57787500\n23-Jan-07,30.63,30.96,30.52,30.74,49022700\n22-Jan-07,31.06,31.12,30.51,30.72,51760200\n19-Jan-07,30.73,31.11,30.69,31.11,74778000\n18-Jan-07,31.15,31.37,30.80,31.00,54250400\n17-Jan-07,31.26,31.44,31.01,31.10,54928100\n16-Jan-07,31.26,31.45,31.03,31.16,61880700\n12-Jan-07,30.65,31.39,30.64,31.21,2680000\n11-Jan-07,29.76,30.75,29.65,30.70,97705900\n10-Jan-07,29.80,29.89,29.43,29.66,54193400\n9-Jan-07,30.00,30.18,29.73,29.96,44316100\n8-Jan-07,29.65,30.10,29.53,29.93,48037000\n5-Jan-07,29.63,29.75,29.45,29.64,44075600\n4-Jan-07,29.70,29.97,29.44,29.81,44525600\n3-Jan-07,29.91,30.25,29.40,29.86,75950900\n29-Dec-06,29.86,30.15,29.83,29.86,40871500\n28-Dec-06,29.86,30.03,29.81,29.98,26452400\n27-Dec-06,29.99,30.13,29.91,30.02,30462800\n26-Dec-06,29.53,30.00,29.40,29.99,36818500\n22-Dec-06,29.82,29.86,29.62,29.64,37299500\n21-Dec-06,30.13,30.14,29.89,29.98,31986700\n20-Dec-06,29.99,30.24,29.97,30.09,30753300\n19-Dec-06,29.71,30.17,29.53,29.99,49719400\n18-Dec-06,30.19,30.26,29.78,29.89,51160300\n15-Dec-06,30.14,30.23,30.03,30.19,71198700\n14-Dec-06,29.54,30.08,29.52,30.07,83409200\n13-Dec-06,29.60,29.60,29.32,29.55,44708600\n12-Dec-06,29.56,29.63,29.22,29.43,67690200\n11-Dec-06,29.19,29.75,29.11,29.54,6639000\n8-Dec-06,28.82,29.40,28.80,29.40,1224600\n7-Dec-06,28.96,29.07,28.81,28.85,44611600\n6-Dec-06,29.10,29.13,28.87,28.99,46616800\n5-Dec-06,29.36,29.40,29.03,29.13,45199700\n4-Dec-06,29.23,29.52,29.17,29.33,54550300\n1-Dec-06,29.23,29.30,28.90,29.12,71750300\n30-Nov-06,29.42,29.57,29.33,29.36,51013000\n29-Nov-06,29.44,29.78,29.43,29.57,55972000\n28-Nov-06,29.34,29.42,29.13,29.39,52030700\n27-Nov-06,29.69,29.74,29.33,29.48,72288600\n24-Nov-06,29.66,29.84,29.64,29.76,19745700\n22-Nov-06,29.97,30.00,29.82,29.92,43145800\n21-Nov-06,29.91,30.00,29.79,29.92,65484400\n20-Nov-06,29.52,30.00,29.50,29.89,82020600\n17-Nov-06,29.31,29.54,29.28,29.40,45256300\n16-Nov-06,29.14,29.64,29.13,29.47,64099900\n15-Nov-06,29.12,29.36,29.11,29.12,61360500\n14-Nov-06,29.28,29.42,29.07,29.23,61255700\n13-Nov-06,29.19,29.46,29.16,29.35,44002400\n10-Nov-06,29.17,29.29,29.15,29.24,35002900\n9-Nov-06,29.11,29.40,29.00,29.26,88906600\n8-Nov-06,28.78,29.23,28.66,28.98,74942000\n7-Nov-06,28.86,29.07,28.80,28.95,55965400\n6-Nov-06,28.77,29.05,28.76,28.84,59735200\n3-Nov-06,28.85,28.93,28.61,28.73,39491500\n2-Nov-06,28.71,28.86,28.58,28.77,58095800\n1-Nov-06,28.78,28.99,28.70,28.81,65050800\n31-Oct-06,28.66,28.85,28.56,28.71,58352000\n30-Oct-06,28.35,28.84,28.32,28.53,46774100\n27-Oct-06,28.49,28.79,28.25,28.34,87280800\n26-Oct-06,28.33,28.41,28.04,28.35,63066800\n25-Oct-06,28.28,28.46,28.14,28.31,40216700\n24-Oct-06,28.43,28.43,28.13,28.28,60737900\n23-Oct-06,28.30,28.69,28.18,28.45,46483300\n20-Oct-06,28.48,28.49,28.17,28.43,46933000\n19-Oct-06,28.35,28.45,28.12,28.29,44009600\n18-Oct-06,28.50,28.70,28.26,28.52,39824000\n17-Oct-06,28.24,28.51,28.17,28.44,38918300\n16-Oct-06,28.48,28.60,28.33,28.45,48875100\n13-Oct-06,28.34,28.69,28.31,28.37,28599200\n12-Oct-06,27.58,28.29,27.54,28.22,19361100\n11-Oct-06,27.46,27.67,27.42,27.54,35905600\n10-Oct-06,27.69,27.75,27.44,27.69,34377300\n9-Oct-06,27.80,27.93,27.62,27.72,30951700\n6-Oct-06,27.76,28.00,27.65,27.87,36175800\n5-Oct-06,27.92,28.11,27.78,27.92,77835900\n4-Oct-06,27.39,27.96,27.37,27.94,81374600\n3-Oct-06,27.37,27.48,27.21,27.37,39226500\n2-Oct-06,27.32,27.49,27.15,27.36,52168700\n29-Sep-06,27.35,27.42,27.21,27.35,33225200\n28-Sep-06,27.47,27.52,27.26,27.40,43784400\n27-Sep-06,27.18,27.47,27.12,27.44,64787800\n26-Sep-06,26.91,27.32,26.88,27.20,54158100\n25-Sep-06,26.81,27.19,26.79,26.95,67066800\n22-Sep-06,26.84,26.85,26.48,26.66,47402500\n21-Sep-06,27.24,27.25,26.85,26.90,57970100\n20-Sep-06,27.01,27.23,26.99,27.18,71281400\n19-Sep-06,26.75,26.94,26.72,26.86,42473500\n18-Sep-06,26.74,27.04,26.67,26.79,48797800\n15-Sep-06,26.58,26.94,26.49,26.85,21536600\n14-Sep-06,25.99,26.50,25.98,26.33,73255300\n13-Sep-06,25.82,26.10,25.49,25.98,36431900\n12-Sep-06,25.90,25.98,25.72,25.93,49428900\n11-Sep-06,25.43,25.95,25.42,25.91,55446800\n8-Sep-06,25.53,25.79,25.46,25.60,36754100\n7-Sep-06,25.48,25.70,25.39,25.43,49956600\n6-Sep-06,25.51,25.72,25.51,25.61,39976100\n5-Sep-06,25.69,25.96,25.56,25.61,43935100\n1-Sep-06,25.89,25.97,25.64,25.84,31508300\n31-Aug-06,25.87,25.98,25.68,25.70,26184600\n30-Aug-06,25.85,25.89,25.64,25.80,28623000\n29-Aug-06,25.92,25.98,25.63,25.84,42498400\n28-Aug-06,25.84,26.00,25.69,25.95,34064800\n25-Aug-06,25.71,26.00,25.69,25.85,32122200\n24-Aug-06,25.82,25.86,25.50,25.74,34688600\n23-Aug-06,25.64,25.95,25.52,25.67,43767600\n22-Aug-06,26.01,26.25,25.62,25.62,87375300\n21-Aug-06,25.66,26.13,25.56,26.12,87366800\n18-Aug-06,25.05,25.80,24.98,25.79,24930600\n17-Aug-06,24.70,24.75,24.61,24.70,44865100\n16-Aug-06,24.61,24.73,24.47,24.70,52134600\n15-Aug-06,24.55,24.65,24.44,24.62,48014200\n14-Aug-06,24.52,24.60,24.35,24.53,45563100\n11-Aug-06,24.43,24.45,24.20,24.43,29680000\n10-Aug-06,24.37,24.60,24.34,24.46,30398100\n9-Aug-06,24.49,24.64,24.34,24.44,43972100\n8-Aug-06,24.39,24.52,24.20,24.34,48097100\n7-Aug-06,24.28,24.48,24.19,24.22,35272300\n4-Aug-06,24.40,24.49,24.15,24.29,42231300\n3-Aug-06,24.18,24.48,24.15,24.21,42942700\n2-Aug-06,24.12,24.40,24.03,24.30,46079000\n1-Aug-06,24.02,24.20,23.85,23.99,48351000\n31-Jul-06,24.07,24.42,24.01,24.06,38609600\n28-Jul-06,24.08,24.28,24.06,24.25,51198900\n27-Jul-06,24.58,24.60,23.77,23.87,85182100\n26-Jul-06,24.12,24.53,24.10,24.37,53951600\n25-Jul-06,24.00,24.29,23.90,24.22,59125000\n24-Jul-06,24.01,24.11,23.79,24.00,55975900\n21-Jul-06,24.08,24.15,23.00,23.87,70610700\n20-Jul-06,23.44,23.45,22.78,22.85,61032200\n19-Jul-06,22.82,23.46,22.72,23.40,81138500\n18-Jul-06,22.59,22.76,22.48,22.74,64866600\n17-Jul-06,22.29,22.61,22.26,22.48,36267800\n14-Jul-06,22.28,22.55,22.23,22.29,66998800\n13-Jul-06,22.37,22.61,22.25,22.26,72525400\n12-Jul-06,22.79,22.88,22.62,22.64,76941100\n"
  },
  {
    "path": "examples/stockserver/ORCL.csv",
    "content": "﻿Date,Open,High,Low,Close,Volume\n9-Jul-12,29.23,29.36,29.02,29.10,21878858\n6-Jul-12,29.37,29.48,28.94,29.18,25260620\n5-Jul-12,29.83,29.93,29.71,29.72,19246449\n3-Jul-12,29.63,29.98,29.61,29.97,14468399\n2-Jul-12,29.53,29.80,29.15,29.80,24449556\n29-Jun-12,28.81,29.71,28.79,29.70,35545233\n28-Jun-12,28.03,28.26,27.73,28.17,27178878\n27-Jun-12,27.76,28.46,27.76,28.17,19391535\n26-Jun-12,27.63,27.94,27.52,27.83,20614164\n25-Jun-12,27.54,27.75,27.24,27.62,24919359\n22-Jun-12,27.91,28.14,27.79,28.00,22166986\n21-Jun-12,28.49,28.64,27.75,27.81,32721808\n20-Jun-12,28.04,28.58,27.94,28.49,29282359\n19-Jun-12,28.38,28.75,27.53,27.96,81054694\n18-Jun-12,27.42,27.43,26.69,27.12,38321948\n15-Jun-12,27.11,27.76,26.99,27.70,40136399\n14-Jun-12,27.09,27.35,26.51,26.91,34312058\n13-Jun-12,26.88,27.38,26.79,27.02,19639522\n12-Jun-12,27.00,27.15,26.73,27.03,26186847\n11-Jun-12,27.38,27.42,26.77,26.81,20471013\n8-Jun-12,27.04,27.27,26.80,27.16,22343155\n7-Jun-12,27.75,27.76,27.18,27.18,32898572\n6-Jun-12,26.99,27.57,26.88,27.53,27642035\n5-Jun-12,26.07,26.94,26.07,26.70,28412958\n4-Jun-12,26.04,26.34,25.84,26.20,28950191\n1-Jun-12,25.98,26.28,25.90,26.00,30740652\n31-May-12,26.22,26.72,26.17,26.47,32192248\n30-May-12,26.19,26.34,25.98,26.17,21538769\n29-May-12,26.41,26.78,26.16,26.46,24140779\n25-May-12,26.18,26.32,26.04,26.14,18645415\n24-May-12,26.62,26.65,25.90,26.12,34231940\n23-May-12,26.12,26.85,26.04,26.68,33179548\n22-May-12,26.33,26.49,26.07,26.36,22123830\n21-May-12,25.54,26.46,25.53,26.26,30714299\n18-May-12,26.29,26.29,25.32,25.61,68184658\n17-May-12,26.70,26.72,26.25,26.25,29443634\n16-May-12,27.16,27.41,26.68,26.72,29675291\n15-May-12,27.02,27.52,26.94,27.06,26393270\n14-May-12,26.73,27.30,26.66,26.96,22485147\n11-May-12,26.97,27.31,26.77,27.00,25588873\n10-May-12,27.70,27.75,26.74,27.02,52653299\n9-May-12,27.62,27.91,27.41,27.78,25524406\n8-May-12,27.71,28.02,27.53,27.93,24661466\n7-May-12,28.34,28.45,27.85,27.92,33671329\n4-May-12,29.10,29.15,28.41,28.41,33934954\n3-May-12,29.74,29.82,29.34,29.38,19176518\n2-May-12,29.42,29.79,29.19,29.71,22582294\n1-May-12,29.45,29.78,29.29,29.57,19970376\n30-Apr-12,29.23,29.42,29.20,29.40,18568419\n27-Apr-12,29.06,29.44,29.06,29.24,16847952\n26-Apr-12,28.84,29.22,28.74,29.02,20550528\n25-Apr-12,28.68,28.99,28.60,28.87,26902797\n24-Apr-12,28.53,28.85,28.52,28.69,20489271\n23-Apr-12,28.60,28.66,28.26,28.48,23047057\n20-Apr-12,29.12,29.53,28.88,28.88,35730690\n19-Apr-12,28.99,29.46,28.67,29.01,26462407\n18-Apr-12,29.13,29.35,29.10,29.12,21155055\n17-Apr-12,28.72,29.44,28.70,29.28,24985835\n16-Apr-12,28.58,28.77,28.31,28.64,21476739\n13-Apr-12,28.70,28.77,28.49,28.50,31477884\n12-Apr-12,28.32,28.72,28.16,28.70,29414323\n11-Apr-12,28.49,28.55,28.04,28.14,30390104\n10-Apr-12,28.88,28.96,28.08,28.35,41175000\n9-Apr-12,29.10,29.25,29.00,29.01,21528479\n5-Apr-12,29.15,29.63,29.13,29.56,43264831\n4-Apr-12,29.19,29.48,28.93,29.16,31153973\n3-Apr-12,29.60,29.70,29.12,29.39,29991407\n2-Apr-12,29.12,29.68,29.00,29.53,28525303\n30-Mar-12,29.46,29.49,29.04,29.16,32006118\n29-Mar-12,29.21,29.58,29.10,29.30,34035472\n28-Mar-12,29.38,29.54,29.14,29.36,29405386\n27-Mar-12,29.17,29.52,29.00,29.35,31710037\n26-Mar-12,28.78,29.19,28.65,29.16,30044384\n23-Mar-12,28.69,28.89,28.52,28.55,36696375\n22-Mar-12,29.33,29.33,28.56,28.63,59763260\n21-Mar-12,30.87,31.15,29.34,29.41,94678022\n20-Mar-12,29.70,30.14,29.54,30.10,46126480\n19-Mar-12,29.59,29.89,29.43,29.76,32519431\n16-Mar-12,30.11,30.16,29.58,29.74,38651267\n15-Mar-12,29.96,30.13,29.74,30.06,35528530\n14-Mar-12,30.00,30.16,29.69,29.84,30994431\n13-Mar-12,29.99,30.23,29.91,30.13,32329221\n12-Mar-12,29.72,29.92,29.20,29.71,40933953\n9-Mar-12,30.05,30.29,29.90,30.13,30056385\n8-Mar-12,30.40,30.44,29.85,30.07,30927328\n7-Mar-12,30.05,30.28,29.83,30.22,23691184\n6-Mar-12,29.94,30.40,29.71,29.94,28971690\n5-Mar-12,30.24,30.42,29.92,30.24,33786655\n2-Mar-12,29.85,30.25,29.76,29.96,28177256\n1-Mar-12,29.40,29.97,29.23,29.83,32909666\n29-Feb-12,29.40,29.44,29.02,29.26,33160710\n28-Feb-12,29.24,29.39,29.00,29.39,29889422\n27-Feb-12,29.00,29.38,28.76,29.26,30419499\n24-Feb-12,29.06,29.54,28.84,29.25,24952431\n23-Feb-12,28.61,28.88,28.32,28.81,25319159\n22-Feb-12,28.72,29.08,28.50,28.55,25207654\n21-Feb-12,28.80,28.98,28.49,28.74,20612299\n17-Feb-12,29.03,29.03,28.64,28.79,34061098\n16-Feb-12,28.16,29.00,28.13,28.95,36380671\n15-Feb-12,28.10,28.35,27.92,27.98,34620659\n14-Feb-12,28.32,28.45,28.03,28.24,30267990\n13-Feb-12,28.59,28.67,28.35,28.43,20015250\n10-Feb-12,28.55,28.64,28.28,28.50,30232002\n9-Feb-12,28.85,28.90,28.35,28.89,31795315\n8-Feb-12,28.92,28.99,28.38,28.73,29842639\n7-Feb-12,28.91,29.00,28.75,28.95,20291706\n6-Feb-12,29.03,29.07,28.81,29.00,16582606\n3-Feb-12,29.13,29.22,28.78,29.11,26277243\n2-Feb-12,28.87,29.25,28.71,28.81,27334432\n1-Feb-12,28.48,28.94,28.11,28.88,38240801\n31-Jan-12,28.73,28.74,28.05,28.21,32744064\n30-Jan-12,28.19,28.69,28.02,28.60,23294936\n27-Jan-12,28.24,28.63,28.13,28.42,24561589\n26-Jan-12,28.56,28.84,28.15,28.29,34646490\n25-Jan-12,28.26,28.64,27.96,28.51,39274586\n24-Jan-12,28.33,28.74,28.25,28.51,23700924\n23-Jan-12,28.73,28.91,28.28,28.39,27438499\n20-Jan-12,28.39,28.95,28.27,28.71,37014044\n19-Jan-12,28.48,28.80,28.25,28.56,36353194\n18-Jan-12,27.71,28.45,27.61,28.34,35343838\n17-Jan-12,27.68,27.88,27.48,27.66,35769421\n13-Jan-12,27.34,27.34,27.34,27.34,0\n12-Jan-12,27.02,27.26,26.62,27.17,31775711\n11-Jan-12,26.99,27.10,26.75,26.89,30836038\n10-Jan-12,27.18,27.60,26.85,26.97,48976351\n9-Jan-12,26.90,27.12,26.66,27.03,38481182\n6-Jan-12,26.67,27.15,26.36,26.93,55685031\n5-Jan-12,26.01,26.90,25.91,26.59,50873452\n4-Jan-12,25.95,26.23,25.55,26.01,45418546\n3-Jan-12,26.33,26.66,25.83,25.86,37911817\n30-Dec-11,25.65,25.65,25.65,25.65,0\n29-Dec-11,25.67,25.84,25.50,25.80,19249815\n28-Dec-11,25.53,25.53,25.53,25.53,0\n27-Dec-11,26.06,26.20,25.56,25.62,21312429\n23-Dec-11,26.07,26.07,26.07,26.07,0\n22-Dec-11,25.86,25.87,25.38,25.69,44203783\n21-Dec-11,25.67,25.99,24.91,25.77,183503963\n20-Dec-11,29.06,29.49,28.87,29.17,46428315\n19-Dec-11,29.41,29.44,28.50,28.62,24849761\n16-Dec-11,29.26,30.07,28.96,29.21,46100675\n15-Dec-11,30.14,30.20,28.81,29.03,43170326\n14-Dec-11,30.67,30.75,29.75,29.87,26644687\n13-Dec-11,31.69,31.90,30.60,30.83,25309961\n12-Dec-11,31.32,31.32,31.32,31.32,0\n9-Dec-11,30.84,31.85,30.81,31.69,22621042\n8-Dec-11,31.24,31.50,30.65,30.74,24494352\n7-Dec-11,31.29,31.81,30.82,31.54,31366071\n6-Dec-11,32.04,32.11,31.54,31.73,21049997\n5-Dec-11,31.81,32.24,31.55,31.90,19992252\n2-Dec-11,32.00,32.05,31.20,31.20,22391244\n1-Dec-11,31.40,31.78,31.14,31.67,22197012\n30-Nov-11,30.69,31.46,30.65,31.35,31879532\n29-Nov-11,29.93,30.16,29.69,29.74,20155857\n28-Nov-11,29.45,30.06,29.36,29.87,21067255\n25-Nov-11,28.68,29.33,28.61,28.74,13641476\n23-Nov-11,29.00,29.00,29.00,29.00,0\n22-Nov-11,29.58,29.92,29.27,29.81,25437497\n21-Nov-11,30.19,30.35,29.54,29.91,25360435\n18-Nov-11,30.73,30.89,30.29,30.60,26601067\n17-Nov-11,31.85,32.00,30.47,30.82,41500411\n16-Nov-11,32.60,33.06,31.99,31.99,24295297\n15-Nov-11,32.21,33.16,32.14,32.96,21397300\n14-Nov-11,32.30,32.51,32.08,32.30,16781628\n11-Nov-11,32.02,32.76,32.00,32.37,21664788\n10-Nov-11,31.94,32.03,31.30,31.73,25303831\n9-Nov-11,32.84,32.84,31.44,31.59,36933068\n8-Nov-11,33.13,33.76,32.85,33.61,30171408\n7-Nov-11,32.39,32.92,31.80,32.87,23980094\n4-Nov-11,32.82,32.88,32.12,32.55,23837878\n3-Nov-11,32.26,33.15,32.18,33.11,27467144\n2-Nov-11,31.96,32.64,31.80,32.28,26470873\n1-Nov-11,31.96,32.20,31.62,31.69,31480143\n31-Oct-11,33.25,33.37,32.76,32.77,28859958\n28-Oct-11,33.50,33.80,33.40,33.69,26333827\n27-Oct-11,33.09,33.81,32.95,33.66,35578870\n26-Oct-11,32.73,32.76,31.56,32.40,33683545\n25-Oct-11,32.92,32.95,32.27,32.37,30540901\n24-Oct-11,32.01,32.92,32.01,32.87,27941907\n21-Oct-11,31.94,32.25,31.82,32.12,32837704\n20-Oct-11,31.59,31.75,30.88,31.53,25102395\n19-Oct-11,31.83,32.18,31.25,31.49,25586382\n18-Oct-11,31.14,32.00,30.77,31.88,29754803\n17-Oct-11,31.59,31.75,30.95,31.23,25074769\n14-Oct-11,31.56,31.86,31.27,31.85,23613246\n13-Oct-11,30.96,31.30,30.57,31.14,27161512\n12-Oct-11,31.37,31.55,31.08,31.11,30322878\n11-Oct-11,30.90,31.20,30.73,30.93,25382716\n10-Oct-11,30.43,31.03,30.22,30.97,27708202\n7-Oct-11,30.05,30.34,29.55,29.91,37977057\n6-Oct-11,29.46,30.10,28.98,30.07,34994173\n5-Oct-11,28.65,29.59,28.39,29.51,43277156\n4-Oct-11,27.44,28.77,27.00,28.69,50300254\n3-Oct-11,28.59,29.01,27.92,27.94,45214631\n30-Sep-11,29.26,29.74,28.74,28.74,42188035\n29-Sep-11,29.98,30.62,29.08,29.65,44358810\n28-Sep-11,30.24,30.41,29.42,29.46,31357126\n27-Sep-11,30.25,30.58,29.76,30.13,38514401\n26-Sep-11,29.06,29.79,28.65,29.71,37762634\n23-Sep-11,28.10,29.08,27.81,28.90,43991708\n22-Sep-11,28.74,29.03,27.83,28.34,61371439\n21-Sep-11,29.81,30.96,29.47,29.54,83318442\n20-Sep-11,29.24,29.36,28.22,28.35,50913489\n19-Sep-11,28.74,29.24,28.17,29.02,34514349\n16-Sep-11,29.04,29.30,28.80,29.23,58059570\n15-Sep-11,28.61,29.00,28.26,28.95,28846435\n14-Sep-11,28.02,28.58,27.66,28.15,34972017\n13-Sep-11,26.82,27.79,26.76,27.72,42359418\n12-Sep-11,25.92,26.77,25.90,26.75,37358292\n9-Sep-11,26.42,26.60,25.77,26.00,38961673\n8-Sep-11,27.45,27.53,26.37,26.72,50386391\n7-Sep-11,26.98,27.63,26.75,27.63,26106253\n6-Sep-11,26.03,26.82,25.71,26.49,30907766\n2-Sep-11,27.23,27.45,26.78,26.97,30297522\n1-Sep-11,28.03,28.67,27.75,27.84,34199159\n31-Aug-11,27.86,28.61,27.71,28.07,31444603\n30-Aug-11,27.81,28.04,27.46,27.87,29944369\n29-Aug-11,27.05,27.96,27.02,27.91,28945469\n26-Aug-11,25.88,26.83,25.48,26.65,34449391\n25-Aug-11,26.85,27.05,25.73,25.90,38264022\n24-Aug-11,26.11,26.73,26.01,26.68,31588814\n23-Aug-11,25.19,26.21,25.16,26.20,36867487\n22-Aug-11,25.41,25.62,24.81,25.06,37825107\n19-Aug-11,24.82,25.60,24.75,24.78,46790691\n18-Aug-11,26.46,26.49,24.72,25.19,78449745\n17-Aug-11,27.65,28.05,27.07,27.47,34073840\n16-Aug-11,27.42,27.96,27.23,27.57,37615100\n15-Aug-11,27.42,27.86,27.16,27.64,38334130\n12-Aug-11,27.83,27.83,26.99,27.39,43238506\n11-Aug-11,26.50,28.04,26.37,27.70,58279392\n10-Aug-11,26.80,27.51,26.11,26.48,82821627\n9-Aug-11,0.00,27.60,25.81,27.60,82425604\n8-Aug-11,27.47,28.04,25.96,26.02,80848563\n5-Aug-11,29.33,29.42,27.50,28.35,82201324\n4-Aug-11,29.84,29.87,28.84,28.88,49433419\n3-Aug-11,29.67,30.35,29.15,30.19,44046221\n2-Aug-11,29.79,30.40,29.52,29.55,40691074\n1-Aug-11,30.97,31.21,29.56,30.11,38566123\n29-Jul-11,30.52,31.19,30.26,30.58,38200618\n28-Jul-11,30.70,31.15,30.63,30.66,29323182\n27-Jul-11,31.81,31.84,30.62,30.71,43084506\n26-Jul-11,32.25,32.52,31.84,32.14,33568327\n25-Jul-11,32.25,32.44,32.04,32.21,20806153\n22-Jul-11,32.37,32.66,32.10,32.55,21378121\n21-Jul-11,32.19,32.75,32.06,32.47,24516255\n20-Jul-11,32.44,32.60,32.06,32.08,23074781\n19-Jul-11,31.91,32.67,31.89,32.64,26835586\n18-Jul-11,31.83,31.94,31.20,31.49,25253346\n15-Jul-11,32.15,32.26,31.84,32.09,25404620\n14-Jul-11,32.80,33.10,31.86,32.05,32194598\n13-Jul-11,32.86,33.29,32.59,32.69,36497831\n12-Jul-11,33.32,33.48,32.52,32.60,35092496\n11-Jul-11,33.61,33.66,32.90,33.14,21943316\n8-Jul-11,33.74,33.94,33.42,33.94,23909649\n7-Jul-11,33.47,34.13,33.40,34.09,29886051\n6-Jul-11,33.00,33.25,32.87,33.21,22363986\n5-Jul-11,33.01,33.21,32.79,33.06,21406499\n1-Jul-11,33.05,33.05,33.05,33.05,0\n30-Jun-11,32.63,32.94,32.51,32.91,22182469\n29-Jun-11,32.40,32.68,32.21,32.43,27305751\n28-Jun-11,31.69,32.37,31.37,32.34,32746881\n27-Jun-11,30.98,31.83,30.86,31.58,29585650\n24-Jun-11,31.49,31.71,30.96,31.14,75120929\n23-Jun-11,31.90,32.55,31.33,32.46,54354674\n22-Jun-11,32.58,32.58,32.14,32.20,25940808\n21-Jun-11,32.09,32.71,31.75,32.65,26941651\n20-Jun-11,31.35,31.99,31.25,31.91,23408376\n17-Jun-11,31.35,31.81,31.18,31.18,42812447\n16-Jun-11,31.16,31.27,30.65,30.80,29868570\n15-Jun-11,31.73,31.98,31.06,31.16,34512699\n14-Jun-11,31.99,32.20,31.83,32.08,23067472\n13-Jun-11,31.25,31.85,31.12,31.63,26716642\n10-Jun-11,31.42,31.65,31.12,31.18,23747018\n9-Jun-11,31.36,31.93,31.28,31.63,21647171\n8-Jun-11,31.75,31.85,31.14,31.25,36607591\n7-Jun-11,32.24,32.30,31.84,31.84,28218774\n6-Jun-11,32.23,32.58,32.07,32.19,21677609\n3-Jun-11,32.24,32.76,32.21,32.33,23808258\n2-Jun-11,32.87,32.88,32.08,32.72,38255535\n1-Jun-11,34.23,34.30,32.83,32.88,31762611\n31-May-11,33.91,34.23,33.32,34.22,30783354\n27-May-11,33.70,33.70,33.70,33.70,0\n26-May-11,33.14,33.59,33.01,33.40,20948172\n25-May-11,33.00,33.38,32.93,32.99,23042318\n24-May-11,33.27,33.42,32.92,33.04,21893434\n23-May-11,33.68,33.74,32.96,33.16,29985813\n20-May-11,34.46,34.60,34.04,34.27,16484160\n19-May-11,34.05,34.57,33.99,34.50,22741425\n18-May-11,34.00,34.23,33.55,33.91,30005918\n17-May-11,34.03,34.29,33.71,33.94,27856160\n16-May-11,35.08,35.09,34.02,34.18,31350379\n13-May-11,35.77,35.92,35.14,35.19,20438875\n12-May-11,34.90,35.75,34.81,35.73,23096990\n11-May-11,35.53,35.70,34.72,34.98,20854345\n10-May-11,35.49,35.66,35.23,35.62,17015621\n9-May-11,34.89,35.45,34.81,35.20,16272571\n6-May-11,35.12,35.56,34.83,34.87,23885408\n5-May-11,35.05,35.37,34.57,34.67,23245444\n4-May-11,36.12,36.17,34.95,35.25,38886498\n3-May-11,36.45,36.50,35.86,36.14,24946205\n2-May-11,35.84,36.44,35.83,36.37,30058601\n29-Apr-11,35.29,36.05,35.21,35.96,94242107\n28-Apr-11,35.03,35.35,34.71,35.29,22995713\n27-Apr-11,35.05,35.29,34.83,35.25,21990292\n26-Apr-11,34.81,35.28,34.72,34.97,30391056\n25-Apr-11,34.70,34.86,34.56,34.83,12163037\n21-Apr-11,34.75,34.75,34.75,34.75,0\n20-Apr-11,34.18,34.37,33.83,34.11,24798472\n19-Apr-11,33.54,33.84,33.48,33.67,20452445\n18-Apr-11,33.67,33.78,33.28,33.63,20226587\n15-Apr-11,33.98,34.30,33.68,34.18,25468440\n14-Apr-11,33.33,33.88,33.20,33.80,17962190\n13-Apr-11,33.57,33.97,33.49,33.70,24345558\n12-Apr-11,33.57,33.63,33.08,33.40,16948611\n11-Apr-11,33.54,33.85,33.54,33.78,15960356\n8-Apr-11,33.88,33.93,33.31,33.54,16136588\n7-Apr-11,33.60,34.07,33.30,33.72,22723604\n6-Apr-11,34.20,34.20,33.49,33.58,24782239\n5-Apr-11,34.29,34.40,33.91,33.92,30286173\n4-Apr-11,34.09,34.43,34.01,34.14,26743013\n1-Apr-11,33.70,34.10,33.61,34.02,43176882\n31-Mar-11,33.00,33.63,32.95,33.43,38234271\n30-Mar-11,33.27,33.43,33.00,33.05,25718235\n29-Mar-11,32.40,33.16,32.36,33.16,29950329\n28-Mar-11,32.83,32.89,32.40,32.56,31399511\n25-Mar-11,33.74,34.10,32.58,32.64,64967633\n24-Mar-11,31.78,32.33,31.50,32.14,38277538\n23-Mar-11,31.22,31.71,30.83,31.41,23159769\n22-Mar-11,31.39,31.54,31.06,31.12,20051941\n21-Mar-11,31.45,31.85,31.30,31.42,23199418\n18-Mar-11,30.98,31.19,30.61,30.76,34862169\n17-Mar-11,30.69,31.05,30.34,30.55,31529597\n16-Mar-11,30.92,31.06,29.62,30.20,45026258\n15-Mar-11,30.24,31.30,29.82,31.17,34884597\n14-Mar-11,31.52,31.86,31.27,31.59,18656522\n11-Mar-11,31.73,32.40,31.34,31.91,23705909\n10-Mar-11,32.37,32.46,31.51,31.80,29054231\n9-Mar-11,32.63,33.14,32.42,32.79,17217849\n8-Mar-11,32.34,33.01,32.19,32.74,21891848\n7-Mar-11,32.97,33.06,31.89,32.10,20474357\n4-Mar-11,32.99,33.10,32.22,32.76,19148979\n3-Mar-11,32.47,33.19,32.43,33.03,24169857\n2-Mar-11,31.58,32.36,31.55,32.12,23091502\n1-Mar-11,33.02,33.08,31.61,31.66,30423280\n28-Feb-11,33.06,33.23,32.68,32.90,19406701\n25-Feb-11,32.29,33.08,32.27,32.95,20850410\n24-Feb-11,32.10,32.41,31.64,32.25,23416224\n23-Feb-11,32.55,32.66,32.02,32.18,22154129\n22-Feb-11,33.29,33.66,32.52,32.53,24887871\n18-Feb-11,33.68,33.68,33.68,33.68,0\n17-Feb-11,32.97,33.20,32.76,33.01,14568960\n16-Feb-11,32.85,33.14,32.61,33.11,15829042\n15-Feb-11,33.12,33.15,32.61,32.76,19332153\n14-Feb-11,33.29,33.54,33.24,33.29,16438097\n11-Feb-11,33.07,33.59,33.03,33.47,17402397\n10-Feb-11,32.78,33.26,32.66,33.26,17237692\n9-Feb-11,33.04,33.10,32.61,32.89,17112792\n8-Feb-11,33.02,33.16,32.72,33.03,15418481\n7-Feb-11,32.70,33.29,32.55,32.98,22785169\n4-Feb-11,32.92,32.98,32.53,32.62,38691879\n3-Feb-11,32.98,33.16,32.72,32.99,17600987\n2-Feb-11,33.09,33.56,33.00,33.14,19358200\n1-Feb-11,32.17,33.43,32.11,33.24,32573451\n31-Jan-11,31.95,32.20,31.84,32.03,20820103\n28-Jan-11,33.20,33.30,31.83,32.00,30820313\n27-Jan-11,32.62,33.09,32.16,32.92,25635635\n26-Jan-11,32.31,32.73,32.16,32.56,21485637\n25-Jan-11,32.39,32.44,31.94,32.29,25926684\n24-Jan-11,32.58,32.65,32.07,32.40,20170273\n21-Jan-11,32.47,32.68,32.34,32.51,34482158\n20-Jan-11,31.47,32.35,31.47,32.30,47750759\n19-Jan-11,31.36,31.61,31.28,31.60,26939099\n18-Jan-11,31.26,31.55,31.23,31.53,26975997\n14-Jan-11,31.24,31.24,31.24,31.24,0\n13-Jan-11,30.97,31.39,30.90,31.18,43412450\n12-Jan-11,31.22,31.23,30.94,30.94,33963735\n11-Jan-11,31.08,31.10,30.86,30.99,26395340\n10-Jan-11,30.85,31.22,30.80,31.04,29719660\n7-Jan-11,31.24,31.34,30.93,31.03,27697931\n6-Jan-11,31.19,31.20,31.02,31.17,21859443\n5-Jan-11,31.32,31.44,30.98,31.04,36339656\n4-Jan-11,31.60,31.75,31.14,31.48,22870887\n3-Jan-11,31.59,31.94,31.52,31.62,20970477\n31-Dec-10,31.22,31.33,30.93,31.30,11716389\n30-Dec-10,31.45,31.58,31.21,31.29,12989495\n29-Dec-10,31.53,31.69,31.42,31.50,9769083\n28-Dec-10,31.66,31.76,31.41,31.57,9736065\n27-Dec-10,31.40,31.80,31.24,31.66,13822144\n23-Dec-10,31.54,31.54,31.54,31.54,0\n22-Dec-10,31.68,31.88,31.56,31.66,14019207\n21-Dec-10,31.65,32.00,31.59,31.76,20002851\n20-Dec-10,31.54,31.94,31.11,31.68,33568197\n17-Dec-10,31.92,32.27,31.37,31.46,92487136\n16-Dec-10,30.70,30.77,30.25,30.27,47435665\n15-Dec-10,30.59,30.70,30.26,30.49,30537611\n14-Dec-10,30.36,30.75,30.36,30.51,25351848\n13-Dec-10,29.99,30.72,29.57,30.42,45575213\n10-Dec-10,29.44,29.98,29.42,29.94,28562054\n9-Dec-10,29.35,29.49,29.04,29.26,18260216\n8-Dec-10,29.26,29.28,29.00,29.23,14874810\n7-Dec-10,29.06,29.37,28.94,29.05,32190556\n6-Dec-10,28.85,28.96,28.64,28.73,21150359\n3-Dec-10,28.08,28.90,28.06,28.81,34454687\n2-Dec-10,27.81,28.18,27.69,28.10,32129940\n1-Dec-10,27.54,27.70,27.41,27.65,34781314\n30-Nov-10,26.92,27.13,26.81,27.04,38931022\n29-Nov-10,27.17,27.34,26.91,27.22,32610717\n26-Nov-10,27.58,27.62,27.34,27.49,12887512\n24-Nov-10,27.74,27.74,27.74,27.74,0\n23-Nov-10,27.75,27.82,27.08,27.19,31294273\n22-Nov-10,27.89,28.09,27.79,28.05,27618007\n19-Nov-10,28.32,28.37,28.03,28.15,25890933\n18-Nov-10,28.37,28.60,28.16,28.31,32649298\n17-Nov-10,27.51,28.11,27.49,27.91,24642718\n16-Nov-10,28.01,28.10,27.50,27.58,31206641\n15-Nov-10,28.35,28.77,28.28,28.40,21636757\n12-Nov-10,28.50,28.61,28.09,28.32,25818801\n11-Nov-10,28.19,28.58,27.68,28.57,37211048\n10-Nov-10,28.64,28.84,28.36,28.69,27841029\n9-Nov-10,29.06,29.25,28.61,28.74,34625805\n8-Nov-10,29.01,29.19,28.84,29.04,27179059\n5-Nov-10,29.30,29.50,28.98,29.25,28312759\n4-Nov-10,29.61,29.82,29.10,29.47,35709770\n3-Nov-10,29.55,29.57,28.99,29.20,30003895\n2-Nov-10,29.49,29.57,29.26,29.53,24201936\n1-Nov-10,29.52,29.55,28.94,29.13,21100029\n29-Oct-10,29.36,29.71,29.30,29.38,35074373\n28-Oct-10,28.82,29.48,28.50,29.36,35130673\n27-Oct-10,28.55,28.82,28.36,28.70,33890193\n26-Oct-10,28.71,28.84,28.54,28.63,28045410\n25-Oct-10,29.15,29.29,28.81,28.84,30650473\n22-Oct-10,28.84,29.03,28.73,28.99,16499803\n21-Oct-10,28.80,29.14,28.57,28.82,30191157\n20-Oct-10,29.01,29.18,28.60,28.64,39081789\n19-Oct-10,28.94,29.24,28.45,29.13,44673675\n18-Oct-10,28.73,29.23,28.58,29.23,35810373\n15-Oct-10,28.47,28.91,28.16,28.90,54775560\n14-Oct-10,28.66,28.70,28.11,28.33,38136014\n13-Oct-10,28.00,28.91,26.98,28.60,49145331\n12-Oct-10,27.75,28.00,27.41,27.95,27552559\n11-Oct-10,27.90,28.10,27.73,27.85,22649501\n8-Oct-10,27.59,28.08,27.31,28.00,33162910\n7-Oct-10,27.63,27.89,27.54,27.69,40611462\n6-Oct-10,27.30,27.86,27.24,27.58,50631689\n5-Oct-10,27.21,27.35,27.06,27.30,42520100\n4-Oct-10,27.02,27.36,26.89,26.90,36791994\n1-Oct-10,27.18,27.61,27.14,27.24,33690444\n30-Sep-10,27.28,27.41,26.81,26.85,42880923\n29-Sep-10,27.07,27.30,26.93,27.17,36626838\n28-Sep-10,27.06,27.40,26.79,27.19,43256725\n27-Sep-10,26.86,27.12,26.78,26.95,34142971\n24-Sep-10,27.44,27.50,26.74,26.96,58136207\n23-Sep-10,26.96,27.49,26.96,27.12,33123304\n22-Sep-10,26.66,27.33,26.64,27.20,51969191\n21-Sep-10,27.33,27.36,26.70,26.82,82733990\n20-Sep-10,27.35,27.57,27.03,27.49,49729891\n17-Sep-10,26.44,27.62,26.40,27.48,150976599\n16-Sep-10,25.68,25.71,25.21,25.36,52951027\n15-Sep-10,25.27,25.79,25.17,25.74,37563655\n14-Sep-10,25.04,25.58,25.04,25.38,31261814\n13-Sep-10,25.14,25.42,25.11,25.11,46816759\n10-Sep-10,24.42,25.15,24.38,25.05,44266742\n9-Sep-10,24.32,24.50,24.21,24.33,25963744\n8-Sep-10,24.07,24.23,23.88,24.14,54705550\n7-Sep-10,24.56,24.69,24.01,24.26,113824415\n6-Sep-10,22.92,22.92,22.92,22.92,0\n3-Sep-10,22.92,22.92,22.92,22.92,0\n2-Sep-10,22.61,22.72,22.35,22.48,18057866\n1-Sep-10,22.15,22.64,22.10,22.62,29085466\n31-Aug-10,21.92,21.93,21.66,21.84,41712407\n30-Aug-10,22.34,22.62,22.00,22.02,23318381\n27-Aug-10,22.38,22.55,22.15,22.51,21375283\n26-Aug-10,22.54,22.73,22.19,22.25,18884758\n25-Aug-10,22.22,22.55,22.03,22.42,18685971\n24-Aug-10,22.61,22.79,22.38,22.41,23293471\n23-Aug-10,23.06,23.30,22.83,22.84,18250249\n20-Aug-10,22.95,23.08,22.77,23.02,21985406\n19-Aug-10,22.86,23.16,22.82,23.00,26754866\n18-Aug-10,22.91,23.25,22.90,23.09,18984243\n17-Aug-10,22.86,23.24,22.84,23.04,22483034\n16-Aug-10,22.51,23.00,22.49,22.72,19511715\n13-Aug-10,22.76,22.85,22.51,22.66,29793466\n12-Aug-10,23.24,23.35,22.72,22.94,33737353\n11-Aug-10,23.91,23.94,23.56,23.66,25666347\n10-Aug-10,24.10,24.43,23.92,24.29,28063433\n9-Aug-10,24.40,24.59,24.24,24.26,20551404\n6-Aug-10,24.01,24.40,23.90,24.38,33734395\n5-Aug-10,24.28,24.44,24.14,24.29,18723644\n4-Aug-10,24.29,24.59,24.17,24.49,19989613\n3-Aug-10,24.31,24.34,24.06,24.21,16366160\n2-Aug-10,23.87,24.39,23.72,24.29,26652047\n30-Jul-10,23.57,23.84,23.40,23.64,48321737\n29-Jul-10,24.25,24.39,23.63,23.70,39976704\n28-Jul-10,24.55,24.59,24.17,24.28,21200132\n27-Jul-10,24.60,24.68,24.32,24.57,23800680\n26-Jul-10,24.45,24.67,24.35,24.64,27093008\n23-Jul-10,24.20,24.58,24.15,24.50,29755559\n22-Jul-10,23.72,24.41,23.70,24.31,32726517\n21-Jul-10,23.86,23.97,23.46,23.56,38740000\n20-Jul-10,23.27,23.97,23.04,23.92,38192737\n19-Jul-10,23.48,23.68,23.40,23.59,19688291\n16-Jul-10,23.80,23.95,23.25,23.27,30343062\n15-Jul-10,23.83,23.90,23.50,23.83,26060744\n14-Jul-10,23.85,24.19,23.72,23.94,34781896\n13-Jul-10,23.50,23.86,23.46,23.71,22207761\n12-Jul-10,23.21,23.48,23.11,23.38,19312293\n9-Jul-10,23.25,23.39,23.14,23.37,16258801\n8-Jul-10,23.14,23.34,22.96,23.22,27335612\n7-Jul-10,22.70,23.12,22.60,23.09,36663528\n6-Jul-10,22.00,22.71,22.00,22.32,39642478\n5-Jul-10,21.83,21.83,21.83,21.83,0\n2-Jul-10,21.83,21.83,21.83,21.83,0\n1-Jul-10,21.46,21.68,21.24,21.55,38318285\n30-Jun-10,21.64,21.96,21.39,21.46,35301612\n29-Jun-10,22.02,22.10,21.58,21.75,34229013\n28-Jun-10,22.84,22.85,22.39,22.45,24643105\n25-Jun-10,23.14,23.25,22.56,22.66,62583804\n24-Jun-10,22.49,22.70,22.14,22.22,30313510\n23-Jun-10,22.97,23.01,22.63,22.68,23533604\n22-Jun-10,23.24,23.49,22.88,22.89,19107897\n21-Jun-10,23.37,23.66,22.98,23.09,19526126\n18-Jun-10,23.26,23.26,22.97,23.20,29538932\n17-Jun-10,23.11,23.18,22.92,23.07,22376609\n16-Jun-10,23.06,23.22,22.88,23.18,20702042\n15-Jun-10,22.79,23.24,22.66,23.20,24304540\n14-Jun-10,23.02,23.08,22.66,22.69,22318673\n11-Jun-10,22.03,22.75,21.99,22.69,30179691\n10-Jun-10,21.88,22.24,21.73,22.20,25018289\n9-Jun-10,21.77,22.09,21.48,21.54,22198348\n8-Jun-10,21.65,21.78,21.30,21.76,29552686\n7-Jun-10,22.13,22.29,21.69,21.70,25656903\n4-Jun-10,22.54,22.96,22.04,22.13,35094757\n3-Jun-10,22.71,22.95,22.54,22.84,28583662\n2-Jun-10,22.30,22.67,21.90,22.64,28371692\n1-Jun-10,22.42,22.84,22.15,22.20,32336274\n31-May-10,22.57,22.57,22.57,22.57,0\n28-May-10,22.57,22.57,22.57,22.57,0\n27-May-10,22.35,22.61,22.27,22.58,29881443\n26-May-10,22.32,22.62,21.75,21.91,43317602\n25-May-10,21.77,22.20,21.63,22.20,41173900\n24-May-10,22.04,22.67,21.85,22.28,32817416\n21-May-10,21.62,22.36,21.55,22.16,63119784\n20-May-10,22.95,23.03,22.34,22.35,40313313\n19-May-10,23.22,23.50,23.02,23.19,29806551\n18-May-10,23.80,23.95,23.31,23.43,29926212\n17-May-10,23.89,23.89,23.33,23.74,22401244\n14-May-10,24.10,24.12,23.54,23.78,28736696\n13-May-10,24.42,24.55,24.20,24.24,22780363\n12-May-10,24.21,24.70,24.19,24.60,27116362\n11-May-10,24.24,24.61,24.11,24.19,29469847\n10-May-10,24.03,25.13,23.99,24.39,38947216\n7-May-10,23.92,24.26,23.11,23.41,63592928\n6-May-10,24.86,24.97,22.20,23.91,56242030\n5-May-10,24.85,25.12,24.63,24.94,33663623\n4-May-10,25.58,25.67,24.71,24.97,48382790\n3-May-10,26.05,26.15,25.71,26.01,19357065\n30-Apr-10,26.07,26.10,25.69,25.87,25567452\n29-Apr-10,25.99,26.14,25.71,25.97,18620120\n28-Apr-10,26.02,26.11,25.78,25.86,31820370\n27-Apr-10,26.34,26.52,25.90,25.98,26235759\n26-Apr-10,26.50,26.61,26.25,26.47,20080534\n23-Apr-10,26.17,26.52,26.16,26.48,27478931\n22-Apr-10,26.14,26.31,25.86,26.24,27275816\n21-Apr-10,26.12,26.33,25.98,26.29,24276804\n20-Apr-10,26.38,26.41,26.02,26.15,23703408\n19-Apr-10,25.98,26.30,25.87,26.19,27078852\n16-Apr-10,26.09,26.37,25.91,25.95,42289324\n15-Apr-10,26.29,26.40,26.14,26.20,23828265\n14-Apr-10,26.34,26.50,26.20,26.38,27920042\n13-Apr-10,26.01,26.63,26.00,26.35,33933012\n12-Apr-10,26.06,26.28,25.85,26.20,24773310\n9-Apr-10,25.80,26.14,25.65,26.13,19663719\n8-Apr-10,25.88,26.08,25.72,25.83,28266107\n7-Apr-10,25.76,25.99,25.75,25.91,29833233\n6-Apr-10,25.37,25.94,25.30,25.83,26937661\n5-Apr-10,25.51,25.74,25.35,25.58,19390264\n2-Apr-10,25.46,25.46,25.46,25.46,0\n1-Apr-10,25.46,25.46,25.46,25.46,0\n31-Mar-10,25.33,25.79,25.30,25.71,27196425\n30-Mar-10,25.48,25.58,25.22,25.54,29819413\n29-Mar-10,25.64,25.85,25.41,25.57,28975323\n26-Mar-10,25.70,26.00,25.37,25.69,58562219\n25-Mar-10,25.95,26.25,25.72,26.04,54350942\n24-Mar-10,25.98,26.00,25.70,25.76,28837083\n23-Mar-10,25.67,26.00,25.54,25.99,25834259\n22-Mar-10,25.19,25.70,25.16,25.56,24945522\n19-Mar-10,25.55,25.73,24.95,25.19,45881001\n18-Mar-10,25.43,25.60,25.27,25.38,29185819\n17-Mar-10,25.23,25.70,25.14,25.47,30309440\n16-Mar-10,25.38,25.41,24.90,25.21,25478343\n15-Mar-10,24.92,25.38,24.88,25.28,22025392\n12-Mar-10,25.12,25.19,24.73,25.05,35344747\n11-Mar-10,24.80,25.25,24.80,25.14,24214659\n10-Mar-10,24.79,25.02,24.68,24.87,23095911\n9-Mar-10,24.60,25.10,24.56,24.88,21835899\n8-Mar-10,24.97,24.97,24.68,24.70,16843697\n5-Mar-10,24.86,25.00,24.84,24.95,19312905\n4-Mar-10,24.47,24.86,24.28,24.76,20925554\n3-Mar-10,24.51,24.69,24.40,24.50,20726486\n2-Mar-10,24.79,24.95,24.52,24.58,23535069\n1-Mar-10,24.60,24.91,24.54,24.74,19744360\n26-Feb-10,24.96,24.96,24.54,24.65,21048757\n25-Feb-10,24.45,24.90,24.21,24.87,29145287\n24-Feb-10,24.63,24.83,24.46,24.77,24530405\n23-Feb-10,24.81,24.89,24.38,24.48,25098393\n22-Feb-10,24.59,24.98,24.44,24.81,37081879\n19-Feb-10,24.41,24.54,24.18,24.32,25941068\n18-Feb-10,24.11,24.57,24.06,24.52,31679175\n17-Feb-10,23.95,24.28,23.94,24.18,26147249\n16-Feb-10,23.69,23.85,23.44,23.81,21582226\n15-Feb-10,23.41,23.41,23.41,23.41,0\n12-Feb-10,23.41,23.41,23.41,23.41,0\n11-Feb-10,23.06,23.52,22.83,23.35,28159092\n10-Feb-10,23.51,23.61,22.92,23.11,40139227\n9-Feb-10,23.47,23.72,23.25,23.51,34084108\n8-Feb-10,23.54,23.65,23.10,23.12,32929218\n5-Feb-10,23.35,23.67,23.07,23.55,45919653\n4-Feb-10,23.61,23.78,23.10,23.11,33254915\n3-Feb-10,23.75,23.84,23.52,23.75,23101141\n2-Feb-10,23.33,23.85,23.24,23.76,32150616\n1-Feb-10,23.36,23.38,22.86,23.22,29572851\n29-Jan-10,23.65,23.83,22.98,23.06,49957833\n28-Jan-10,24.08,24.18,23.29,23.47,41245792\n27-Jan-10,23.90,24.05,23.54,23.86,28819387\n26-Jan-10,23.93,24.13,23.70,23.88,28746010\n25-Jan-10,24.24,24.27,23.82,24.03,26366658\n22-Jan-10,24.94,25.05,24.11,24.15,33681573\n21-Jan-10,25.19,25.54,24.59,24.83,41756104\n20-Jan-10,25.05,25.13,24.51,25.06,39971574\n19-Jan-10,25.32,25.50,25.12,25.33,22732255\n18-Jan-10,25.24,25.24,25.24,25.24,0\n15-Jan-10,25.24,25.24,25.24,25.24,0\n14-Jan-10,25.13,25.58,25.05,25.34,44685267\n13-Jan-10,24.63,24.99,24.55,24.80,24912305\n12-Jan-10,24.56,24.61,24.31,24.56,26204637\n11-Jan-10,24.69,24.80,24.37,24.69,19002408\n8-Jan-10,24.28,24.75,24.25,24.68,23542432\n7-Jan-10,24.46,24.61,24.08,24.38,30469731\n6-Jan-10,24.77,24.92,24.38,24.46,24560772\n5-Jan-10,24.72,24.85,24.35,24.82,28669970\n4-Jan-10,24.66,25.19,24.66,24.85,26795074\n1-Jan-10,24.53,24.53,24.53,24.53,0\n31-Dec-09,24.53,24.53,24.53,24.53,0\n30-Dec-09,24.92,25.05,24.70,24.93,18697425\n29-Dec-09,25.01,25.11,24.91,25.01,16214164\n28-Dec-09,24.83,24.99,24.72,24.97,15927565\n25-Dec-09,24.95,24.95,24.95,24.95,0\n24-Dec-09,24.72,24.96,24.67,24.95,7782730\n23-Dec-09,24.46,24.75,24.36,24.73,19257842\n22-Dec-09,24.51,24.63,24.24,24.46,23847254\n21-Dec-09,24.39,24.57,24.22,24.43,26935597\n18-Dec-09,24.01,24.74,23.98,24.34,88246415\n17-Dec-09,23.07,23.19,22.77,22.88,35972611\n16-Dec-09,23.35,23.46,23.08,23.12,30037163\n15-Dec-09,23.11,23.46,23.06,23.16,24653729\n14-Dec-09,22.96,23.44,22.91,23.31,32293989\n11-Dec-09,22.70,22.86,22.49,22.78,26741952\n10-Dec-09,22.33,22.67,22.23,22.59,34877366\n9-Dec-09,21.99,22.02,21.62,21.95,28550469\n8-Dec-09,22.31,22.36,21.89,21.91,27902709\n7-Dec-09,22.72,22.89,22.35,22.48,24138154\n4-Dec-09,22.81,23.00,22.55,22.83,27814255\n3-Dec-09,22.66,22.91,22.60,22.64,22492587\n2-Dec-09,22.53,22.74,22.41,22.66,21160810\n1-Dec-09,22.16,22.57,22.08,22.44,28447952\n30-Nov-09,22.01,22.15,21.80,22.08,26291701\n27-Nov-09,22.16,22.30,22.00,22.09,12569138\n26-Nov-09,22.60,22.60,22.60,22.60,0\n25-Nov-09,22.34,22.72,22.20,22.60,24123523\n24-Nov-09,22.70,22.70,22.09,22.14,24232633\n23-Nov-09,22.58,22.72,22.45,22.60,22713686\n20-Nov-09,22.27,22.39,22.18,22.34,24493905\n19-Nov-09,22.69,22.71,22.23,22.39,17651840\n18-Nov-09,22.66,22.82,22.54,22.80,14827644\n17-Nov-09,22.71,22.80,22.60,22.80,26126662\n16-Nov-09,22.36,22.89,22.30,22.83,33383020\n13-Nov-09,22.05,22.36,21.95,22.34,24660766\n12-Nov-09,22.01,22.13,21.94,22.04,24305171\n11-Nov-09,21.83,22.05,21.75,21.90,19488240\n10-Nov-09,21.64,21.88,21.60,21.80,22687165\n9-Nov-09,21.61,21.87,21.50,21.83,22678174\n6-Nov-09,21.17,21.58,21.11,21.42,22995164\n5-Nov-09,21.18,21.52,21.11,21.32,22058870\n4-Nov-09,20.82,21.20,20.65,20.90,32398344\n3-Nov-09,21.00,21.06,20.65,20.89,20646048\n2-Nov-09,21.06,21.22,20.80,21.09,27906968\n30-Oct-09,21.32,21.61,21.05,21.10,37101832\n29-Oct-09,21.42,21.47,21.20,21.45,32212041\n28-Oct-09,21.29,21.50,20.87,21.30,30525613\n27-Oct-09,21.87,22.23,21.80,21.87,28669712\n26-Oct-09,22.13,22.38,21.85,21.99,28175935\n23-Oct-09,22.26,22.47,21.95,22.05,31577913\n22-Oct-09,21.95,22.26,21.83,22.19,27044951\n21-Oct-09,22.10,22.40,22.00,22.03,31267527\n20-Oct-09,22.23,22.34,21.90,22.19,35900354\n19-Oct-09,22.02,22.49,21.87,22.42,51697466\n16-Oct-09,21.20,22.03,21.18,21.81,65051667\n15-Oct-09,21.05,21.32,20.99,21.32,30361371\n14-Oct-09,21.17,21.50,21.12,21.19,41225410\n13-Oct-09,20.75,20.98,20.65,20.91,27852348\n12-Oct-09,20.73,20.92,20.60,20.72,32400929\n9-Oct-09,20.74,21.03,20.66,20.74,39813320\n8-Oct-09,20.65,21.06,20.59,20.80,46644509\n7-Oct-09,20.52,20.95,20.47,20.57,41754079\n6-Oct-09,20.47,20.60,20.30,20.54,37202707\n5-Oct-09,20.46,20.68,20.16,20.39,34471756\n2-Oct-09,20.25,20.64,20.24,20.34,41680589\n1-Oct-09,20.73,20.75,20.10,20.36,45924832\n30-Sep-09,21.17,21.20,20.65,20.84,44303992\n29-Sep-09,21.12,21.38,21.10,21.12,23280949\n28-Sep-09,20.87,21.34,20.83,21.17,28379528\n25-Sep-09,21.10,21.20,20.83,20.86,35144473\n24-Sep-09,21.16,21.35,21.06,21.17,28392878\n23-Sep-09,21.47,21.47,21.05,21.11,40643137\n22-Sep-09,21.59,21.71,21.35,21.41,34159397\n21-Sep-09,21.56,21.82,21.50,21.57,25487496\n18-Sep-09,21.72,21.87,21.57,21.62,70094479\n17-Sep-09,21.42,21.76,21.32,21.52,92155421\n16-Sep-09,22.60,22.61,21.98,22.13,86377141\n15-Sep-09,22.73,22.88,22.60,22.66,24791137\n14-Sep-09,22.78,22.93,22.60,22.72,24067848\n11-Sep-09,22.82,22.95,22.67,22.86,22601255\n10-Sep-09,22.57,22.80,22.46,22.76,23557107\n9-Sep-09,21.97,22.58,21.88,22.52,31035166\n8-Sep-09,22.12,22.12,21.77,21.88,24532564\n4-Sep-09,21.57,22.10,21.54,21.97,17831843\n3-Sep-09,21.57,21.60,21.22,21.56,28597141\n2-Sep-09,21.83,22.03,21.68,21.77,21034539\n1-Sep-09,21.77,22.31,21.67,21.94,34860284\n31-Aug-09,22.00,22.19,21.73,21.88,26421901\n28-Aug-09,22.30,22.61,22.10,22.16,23965258\n27-Aug-09,22.16,22.21,21.78,22.16,20012361\n26-Aug-09,22.17,22.26,22.00,22.20,18779363\n25-Aug-09,22.49,22.55,22.20,22.23,30600494\n24-Aug-09,22.13,22.49,22.04,22.32,22218767\n21-Aug-09,22.14,22.14,21.74,22.11,29644247\n20-Aug-09,21.72,22.05,21.61,21.94,21178633\n19-Aug-09,21.32,21.84,21.20,21.78,22257434\n18-Aug-09,21.45,21.96,21.31,21.58,16120105\n17-Aug-09,21.65,21.75,21.37,21.40,19838490\n14-Aug-09,21.89,22.08,21.66,21.96,24254722\n13-Aug-09,21.94,22.03,21.77,21.99,25740383\n12-Aug-09,21.30,22.10,21.25,21.88,34000135\n10-Aug-09,21.21,21.41,21.03,21.25,19521645\n7-Aug-09,21.43,21.84,21.37,21.43,25561425\n6-Aug-09,21.42,21.94,21.09,21.21,28036027\n5-Aug-09,21.83,21.85,21.18,21.44,36001860\n4-Aug-09,22.24,22.28,21.68,21.89,28735058\n3-Aug-09,22.32,22.38,22.00,22.30,24046223\n31-Jul-09,22.16,22.42,22.07,22.13,24391110\n30-Jul-09,22.24,22.47,21.91,22.14,28861865\n29-Jul-09,22.13,22.28,21.83,22.01,21026561\n28-Jul-09,21.86,22.32,21.72,22.24,26375311\n27-Jul-09,22.29,22.31,21.75,21.98,23778651\n24-Jul-09,21.94,22.48,21.91,22.33,24623769\n23-Jul-09,21.65,22.40,21.59,22.20,33195622\n22-Jul-09,21.84,21.98,21.63,21.75,26150569\n21-Jul-09,21.97,22.00,21.43,21.93,36397121\n20-Jul-09,21.70,21.83,21.34,21.51,28079299\n17-Jul-09,21.69,21.74,21.40,21.74,21094886\n16-Jul-09,21.57,21.77,21.34,21.64,24399572\n15-Jul-09,20.82,21.53,20.77,21.51,32308872\n14-Jul-09,20.64,20.72,20.28,20.63,22065799\n13-Jul-09,20.52,20.73,20.12,20.72,26523056\n10-Jul-09,20.20,20.63,20.19,20.49,22410482\n9-Jul-09,20.54,20.77,20.18,20.32,31907089\n8-Jul-09,20.21,20.79,19.79,20.57,55776856\n7-Jul-09,20.67,20.78,20.12,20.18,35542783\n6-Jul-09,20.92,21.04,20.50,20.67,37209163\n3-Jul-09,21.04,21.04,21.04,21.04,0\n2-Jul-09,21.33,21.34,20.86,21.04,27417856\n1-Jul-09,21.63,22.00,21.62,21.74,28169727\n30-Jun-09,21.50,21.75,21.28,21.42,32109674\n29-Jun-09,21.34,21.71,21.22,21.50,28022211\n26-Jun-09,21.54,21.54,21.15,21.24,37033541\n25-Jun-09,21.25,21.71,21.13,21.63,49506029\n24-Jun-09,20.86,21.75,20.78,21.26,99417883\n23-Jun-09,20.21,20.21,19.73,19.87,39341260\n22-Jun-09,20.42,20.75,19.93,19.97,38852582\n19-Jun-09,20.42,20.92,20.37,20.66,51092929\n18-Jun-09,20.17,20.46,19.98,20.25,34591566\n17-Jun-09,19.72,20.17,19.70,19.94,33324243\n16-Jun-09,20.18,20.27,19.68,19.69,41410975\n15-Jun-09,20.64,20.65,20.00,20.22,40579162\n12-Jun-09,20.85,21.00,19.47,20.85,23154762\n11-Jun-09,20.66,21.20,20.66,20.94,26073639\n10-Jun-09,21.06,21.19,20.43,20.74,33270970\n9-Jun-09,20.95,21.20,20.83,20.99,23790088\n8-Jun-09,20.60,21.07,20.53,20.87,34885662\n5-Jun-09,20.82,20.90,20.51,20.71,26652002\n4-Jun-09,20.34,20.66,20.26,20.61,30251818\n3-Jun-09,20.24,20.51,20.09,20.34,27013563\n2-Jun-09,19.77,20.44,19.77,20.35,31008523\n1-Jun-09,19.75,20.02,19.60,19.92,31616350\n29-May-09,19.28,19.60,19.16,19.59,42625202\n28-May-09,19.01,19.37,18.83,19.21,25588921\n27-May-09,18.98,19.45,18.91,18.99,27633269\n26-May-09,18.46,19.20,18.28,19.07,28315951\n22-May-09,18.58,19.09,18.44,18.65,24378676\n21-May-09,18.76,18.83,18.35,18.57,26281294\n20-May-09,19.08,19.40,18.88,18.94,29082675\n19-May-09,18.79,19.21,18.77,18.97,23414235\n18-May-09,18.69,18.94,18.47,18.92,22953399\n15-May-09,18.59,18.74,18.35,18.42,22884508\n14-May-09,18.24,18.58,18.10,18.46,26242707\n13-May-09,18.15,18.34,17.97,18.07,29146076\n12-May-09,18.64,18.67,18.08,18.38,33700100\n11-May-09,18.15,18.83,18.04,18.56,32102385\n8-May-09,18.60,18.78,18.12,18.32,41125944\n7-May-09,18.99,19.15,18.19,18.42,54151136\n6-May-09,19.15,19.19,18.69,19.06,27110321\n5-May-09,19.17,19.19,18.68,19.01,29366537\n4-May-09,19.40,19.44,18.96,18.97,38586593\n1-May-09,19.35,19.44,19.12,19.34,20402295\n30-Apr-09,19.75,19.94,19.04,19.34,49416974\n29-Apr-09,19.46,19.80,19.41,19.60,28310819\n28-Apr-09,19.57,19.93,19.51,19.74,25051802\n27-Apr-09,19.59,20.28,19.52,19.77,29389758\n24-Apr-09,19.75,20.18,19.65,19.79,42970202\n23-Apr-09,19.40,19.71,19.14,19.68,36144672\n22-Apr-09,19.52,19.75,19.09,19.35,40035174\n21-Apr-09,18.78,19.85,18.64,19.53,66973897\n20-Apr-09,17.76,19.08,17.73,18.82,84059515\n17-Apr-09,19.24,19.45,18.73,19.06,32850143\n16-Apr-09,18.81,19.29,18.58,19.18,30286847\n15-Apr-09,18.69,18.74,18.11,18.59,28350554\n14-Apr-09,18.77,19.01,18.61,18.87,30604490\n13-Apr-09,18.87,19.23,18.86,19.06,21743244\n10-Apr-09,19.11,19.11,19.11,19.11,0\n9-Apr-09,18.83,19.20,18.79,19.11,25806123\n8-Apr-09,18.69,18.76,18.33,18.57,25522400\n7-Apr-09,18.79,18.86,18.36,18.54,29049282\n6-Apr-09,19.00,19.11,18.69,19.11,29302186\n3-Apr-09,18.88,19.45,18.87,19.29,40954392\n2-Apr-09,18.93,19.30,18.65,18.82,46061523\n1-Apr-09,17.86,18.68,17.73,18.58,37135984\n31-Mar-09,17.93,18.39,17.82,18.07,34583425\n30-Mar-09,17.66,17.70,17.25,17.66,33143994\n27-Mar-09,18.45,18.45,17.93,18.01,34232850\n26-Mar-09,18.25,18.68,18.18,18.68,34216094\n25-Mar-09,18.03,18.34,17.70,18.09,34714277\n24-Mar-09,17.90,18.22,17.70,17.91,32228133\n23-Mar-09,17.34,18.25,17.26,18.25,46048340\n20-Mar-09,17.50,17.71,17.00,17.10,75071786\n19-Mar-09,17.56,18.09,17.35,17.37,112624473\n18-Mar-09,15.15,16.09,15.07,15.83,58521331\n17-Mar-09,14.93,15.60,14.65,15.40,52106449\n16-Mar-09,15.54,15.80,14.83,14.90,39883775\n13-Mar-09,15.65,15.70,15.28,15.56,30867306\n12-Mar-09,15.35,15.68,15.08,15.63,27419945\n11-Mar-09,15.28,15.46,14.73,15.34,46562060\n10-Mar-09,14.17,15.19,14.00,15.09,58945965\n9-Mar-09,14.31,14.70,13.80,13.85,60034786\n6-Mar-09,14.60,14.86,14.14,14.47,52932432\n5-Mar-09,14.94,15.28,14.52,14.53,67101447\n4-Mar-09,15.40,15.48,14.85,14.96,71256571\n3-Mar-09,15.40,15.45,14.97,15.01,39128518\n2-Mar-09,15.21,15.69,15.14,15.20,47340690\n27-Feb-09,15.50,15.83,15.41,15.54,52301334\n26-Feb-09,16.37,16.37,15.78,15.78,36230909\n25-Feb-09,16.38,16.57,16.01,16.24,33469735\n24-Feb-09,15.77,16.50,15.75,16.44,37697996\n23-Feb-09,16.52,16.68,15.82,15.86,32342459\n20-Feb-09,16.64,16.75,16.34,16.56,46459999\n19-Feb-09,17.34,17.37,16.80,16.83,32818263\n18-Feb-09,17.07,17.51,17.00,17.24,41327975\n17-Feb-09,17.15,17.34,16.81,16.96,41029563\n13-Feb-09,17.51,17.96,17.43,17.72,27489897\n12-Feb-09,17.55,17.61,16.94,17.55,42572570\n11-Feb-09,17.65,18.01,17.57,17.80,28637958\n10-Feb-09,17.82,18.09,17.24,17.58,44734519\n9-Feb-09,17.95,18.09,17.82,18.05,23314631\n6-Feb-09,17.69,18.07,17.48,17.97,29569092\n5-Feb-09,16.86,17.70,16.74,17.62,35402876\n4-Feb-09,17.15,17.63,17.05,17.21,26574105\n3-Feb-09,16.85,17.06,16.50,17.05,31190729\n2-Feb-09,16.60,17.10,16.51,16.90,25466321\n30-Jan-09,17.62,17.76,16.79,16.83,33537053\n29-Jan-09,17.67,17.87,17.26,17.59,27538677\n28-Jan-09,17.71,18.01,17.44,17.84,32607648\n27-Jan-09,17.02,17.43,16.98,17.28,27379284\n26-Jan-09,16.82,17.36,16.78,16.96,27890060\n23-Jan-09,16.43,17.02,16.39,16.78,34362542\n22-Jan-09,16.43,16.93,16.41,16.65,36650862\n21-Jan-09,16.40,16.92,16.25,16.89,56144812\n20-Jan-09,16.90,16.98,16.05,16.10,34055295\n16-Jan-09,16.74,17.06,16.41,16.91,38250397\n15-Jan-09,16.33,16.68,15.87,16.53,45101439\n14-Jan-09,16.87,16.92,16.18,16.36,39968420\n13-Jan-09,17.00,17.32,16.91,17.14,32780475\n12-Jan-09,17.41,17.47,16.84,17.05,34575230\n9-Jan-09,17.71,17.71,17.25,17.36,32028469\n8-Jan-09,17.50,17.67,17.31,17.62,35148739\n7-Jan-09,18.06,18.25,17.48,17.65,38635794\n6-Jan-09,18.17,18.70,18.03,18.39,29856606\n5-Jan-09,18.19,18.25,17.86,18.09,28309422\n2-Jan-09,17.64,18.48,17.62,18.41,27833631\n1-Jan-09,17.73,17.73,17.73,17.73,0\n31-Dec-08,17.81,17.99,17.68,17.73,23404570\n30-Dec-08,17.35,17.86,17.25,17.83,24498320\n29-Dec-08,17.32,17.40,17.02,17.22,21226981\n26-Dec-08,17.40,17.46,17.26,17.43,9496008\n25-Dec-08,17.32,17.32,17.32,17.32,0\n24-Dec-08,17.35,17.45,17.18,17.32,8337136\n23-Dec-08,17.53,17.76,17.08,17.30,26611804\n22-Dec-08,17.79,17.79,17.17,17.52,32738507\n19-Dec-08,17.44,18.16,16.61,17.78,90125890\n18-Dec-08,16.83,16.97,16.34,16.61,45269973\n17-Dec-08,16.97,17.04,16.68,16.74,38944723\n16-Dec-08,16.62,17.40,16.51,17.27,57317727\n15-Dec-08,16.40,16.64,16.13,16.45,37179395\n12-Dec-08,16.11,16.94,16.07,16.84,33021707\n11-Dec-08,17.29,17.29,16.40,16.46,36833571\n10-Dec-08,17.14,17.59,16.89,17.39,36795074\n9-Dec-08,16.74,17.67,16.60,16.94,44413435\n8-Dec-08,16.51,17.32,16.35,17.04,49736756\n5-Dec-08,15.23,16.40,15.17,16.32,57183729\n4-Dec-08,15.82,15.99,15.20,15.44,48105975\n3-Dec-08,15.92,16.15,15.62,16.13,72210249\n2-Dec-08,15.61,16.02,15.26,15.79,41701014\n1-Dec-08,15.71,16.04,15.38,15.47,51362321\n28-Nov-08,16.10,16.15,15.75,16.09,19899141\n27-Nov-08,16.14,16.14,16.14,16.14,0\n26-Nov-08,15.65,16.25,15.64,16.14,52962915\n25-Nov-08,16.84,16.85,15.72,15.98,73396607\n24-Nov-08,16.57,16.99,16.32,16.64,75407969\n21-Nov-08,15.44,16.49,15.10,16.38,73239039\n20-Nov-08,16.02,16.76,15.32,15.40,67199335\n19-Nov-08,16.90,17.30,15.97,16.00,65869174\n18-Nov-08,16.52,17.03,15.92,17.02,55664239\n17-Nov-08,16.61,16.99,16.30,16.41,41318507\n14-Nov-08,17.26,17.79,16.66,16.90,51944110\n13-Nov-08,16.33,17.75,15.63,17.72,62134497\n12-Nov-08,16.82,17.04,16.40,16.47,44447657\n11-Nov-08,17.38,17.52,16.79,17.29,35681043\n10-Nov-08,17.84,17.84,17.36,17.56,24816845\n7-Nov-08,17.08,17.66,16.97,17.53,34590500\n6-Nov-08,17.43,17.58,16.65,16.85,53546000\n5-Nov-08,18.65,18.76,17.71,17.82,36433000\n4-Nov-08,18.50,19.00,18.32,18.90,38311400\n3-Nov-08,18.11,18.41,18.04,18.33,27768400\n31-Oct-08,17.86,18.62,17.81,18.29,53549600\n30-Oct-08,18.13,18.61,17.79,18.32,70857800\n29-Oct-08,17.36,18.37,16.77,17.29,58133800\n28-Oct-08,16.40,17.68,15.57,17.62,46174500\n27-Oct-08,15.99,16.77,15.31,15.77,62180900\n24-Oct-08,15.71,16.71,15.48,16.20,51215800\n23-Oct-08,16.98,17.47,16.01,16.95,60587900\n22-Oct-08,17.26,17.50,16.61,17.17,46398400\n21-Oct-08,17.90,18.41,17.59,17.69,46734700\n20-Oct-08,17.36,18.16,17.10,18.16,41447200\n17-Oct-08,16.41,17.99,16.21,17.02,51738500\n16-Oct-08,16.16,16.99,15.31,16.99,70401100\n15-Oct-08,17.40,17.73,15.94,15.95,53985800\n14-Oct-08,19.34,19.44,17.37,17.69,56260200\n13-Oct-08,17.52,18.87,17.04,18.86,53262000\n10-Oct-08,15.70,17.03,15.28,16.68,94685900\n9-Oct-08,17.22,17.56,16.00,16.21,57555700\n8-Oct-08,16.31,17.63,16.01,16.88,74161800\n7-Oct-08,18.29,18.50,16.78,16.78,62313500\n6-Oct-08,18.89,19.30,17.25,18.30,78701000\n3-Oct-08,19.67,20.54,19.48,19.48,52912900\n2-Oct-08,19.84,19.99,19.36,19.49,43722900\n1-Oct-08,20.19,20.19,19.55,19.86,34487200\n30-Sep-08,19.11,20.41,19.10,20.31,48800900\n29-Sep-08,20.34,20.53,18.00,18.77,57760100\n26-Sep-08,19.99,20.85,19.98,20.62,38790100\n25-Sep-08,20.34,20.82,20.21,20.47,39251300\n24-Sep-08,19.90,20.50,19.77,19.95,31626000\n23-Sep-08,19.82,20.55,19.64,19.69,40863800\n22-Sep-08,19.98,20.76,19.60,19.75,38979100\n19-Sep-08,20.99,21.00,15.00,20.07,72759800\n18-Sep-08,18.37,18.95,17.84,18.75,72537200\n17-Sep-08,18.69,18.82,18.07,18.10,49498200\n16-Sep-08,18.60,19.05,18.40,18.96,60195600\n15-Sep-08,19.05,19.49,18.92,19.01,39798700\n12-Sep-08,19.22,19.67,19.04,19.61,38793500\n11-Sep-08,19.03,19.40,18.89,19.35,49499700\n10-Sep-08,19.35,19.40,19.03,19.16,51248800\n9-Sep-08,19.40,19.85,19.02,19.17,61541800\n8-Sep-08,20.37,20.65,18.94,19.26,93033000\n5-Sep-08,19.72,20.32,19.70,20.07,46641100\n4-Sep-08,20.84,20.89,19.92,19.93,78672300\n3-Sep-08,21.52,21.57,21.01,21.19,39007400\n2-Sep-08,22.30,22.37,21.50,21.55,43079200\n29-Aug-08,22.40,22.43,21.70,21.93,34094500\n28-Aug-08,22.29,22.73,22.27,22.64,17992800\n27-Aug-08,22.20,22.57,22.13,22.34,20448500\n26-Aug-08,22.16,22.38,22.01,22.15,15952200\n25-Aug-08,22.54,22.71,22.19,22.21,19502800\n22-Aug-08,22.52,22.82,22.39,22.70,17744500\n21-Aug-08,22.39,22.45,22.16,22.30,22221600\n20-Aug-08,22.68,22.95,22.50,22.66,21648900\n19-Aug-08,22.68,22.77,22.45,22.56,22326200\n18-Aug-08,23.05,23.23,22.55,22.77,22097100\n15-Aug-08,23.33,23.45,22.92,23.06,26198900\n14-Aug-08,22.78,23.40,22.75,23.19,31744000\n13-Aug-08,22.79,23.15,22.57,23.01,25755700\n12-Aug-08,22.98,23.01,22.68,22.90,29549900\n11-Aug-08,23.41,23.52,22.92,23.08,33441200\n8-Aug-08,22.75,23.62,22.64,23.52,46700700\n7-Aug-08,22.63,23.02,22.46,22.75,38233500\n6-Aug-08,22.08,22.91,22.03,22.86,41258800\n5-Aug-08,21.42,22.22,21.31,22.21,41535700\n4-Aug-08,21.49,21.59,21.14,21.25,25353100\n1-Aug-08,21.58,21.69,21.27,21.50,24834000\n31-Jul-08,21.06,21.90,20.98,21.53,36855100\n30-Jul-08,21.41,21.45,20.97,21.31,31229700\n29-Jul-08,20.86,21.57,20.84,21.43,30239100\n28-Jul-08,20.73,21.10,20.69,20.72,20264200\n25-Jul-08,20.97,20.98,20.64,20.95,22267200\n24-Jul-08,21.19,21.39,20.85,20.95,29672800\n23-Jul-08,21.54,21.59,21.14,21.50,31666100\n22-Jul-08,21.16,21.62,21.15,21.59,32351500\n21-Jul-08,21.20,21.42,21.02,21.09,20901400\n18-Jul-08,20.89,21.25,20.65,21.18,35137900\n17-Jul-08,20.50,21.04,20.37,20.86,36784600\n16-Jul-08,20.22,20.55,20.09,20.44,36526500\n15-Jul-08,20.25,20.45,19.98,20.25,50508500\n14-Jul-08,21.10,21.19,20.26,20.45,38646600\n11-Jul-08,21.07,21.25,20.70,20.96,36308500\n10-Jul-08,21.17,21.42,20.93,21.29,31260600\n9-Jul-08,21.48,21.61,21.07,21.11,40525400\n8-Jul-08,21.09,21.60,20.97,21.58,37554700\n7-Jul-08,20.78,21.33,20.61,21.09,33882500\n3-Jul-08,21.04,21.19,20.69,20.73,21372700\n2-Jul-08,21.27,21.40,20.80,20.82,31618600\n1-Jul-08,20.79,21.34,20.65,21.31,46331000\n30-Jun-08,21.08,21.35,21.00,21.00,33935600\n27-Jun-08,21.39,21.71,20.97,21.29,37786300\n26-Jun-08,21.68,22.22,21.42,21.42,66219700\n25-Jun-08,22.41,22.85,22.19,22.55,56689500\n24-Jun-08,21.94,22.44,21.82,22.23,28328400\n23-Jun-08,22.31,22.41,21.83,22.08,32313800\n20-Jun-08,22.64,22.68,21.91,22.10,50878500\n19-Jun-08,22.33,23.00,22.27,22.70,40936500\n18-Jun-08,22.35,22.68,22.22,22.44,22424800\n17-Jun-08,23.02,23.02,22.50,22.53,26876600\n16-Jun-08,22.49,23.00,22.33,22.94,31962700\n13-Jun-08,22.09,22.66,21.95,22.63,31155000\n12-Jun-08,22.13,22.26,21.73,21.86,34493400\n11-Jun-08,22.56,22.78,22.05,22.07,28461200\n10-Jun-08,22.31,22.67,22.12,22.50,27730500\n9-Jun-08,22.64,22.67,22.25,22.55,26037400\n6-Jun-08,23.00,23.06,22.46,22.46,41219200\n5-Jun-08,22.85,23.21,22.71,23.18,30980200\n4-Jun-08,22.71,23.15,22.71,22.91,34708000\n3-Jun-08,22.74,23.57,22.70,22.91,49871000\n2-Jun-08,22.77,22.77,22.35,22.68,31496900\n30-May-08,22.81,22.94,22.68,22.84,24191000\n29-May-08,22.84,23.00,22.48,22.79,31956100\n28-May-08,22.79,22.95,22.64,22.79,26530700\n27-May-08,22.05,22.75,22.02,22.66,28794200\n23-May-08,22.29,22.30,21.89,21.98,19508700\n22-May-08,22.07,22.47,22.06,22.31,23862300\n21-May-08,22.24,22.71,21.94,22.01,29847700\n20-May-08,22.24,22.44,22.05,22.16,25657600\n19-May-08,22.04,22.75,21.87,22.43,40646100\n16-May-08,21.90,21.97,21.41,21.68,33691200\n15-May-08,21.62,21.91,21.54,21.87,21585800\n14-May-08,21.73,22.14,21.60,21.78,26199900\n13-May-08,21.55,21.72,21.31,21.67,20308300\n12-May-08,21.13,21.63,21.08,21.51,24061700\n9-May-08,20.84,21.10,20.70,21.00,20587400\n8-May-08,21.15,21.28,21.00,21.10,25800500\n7-May-08,21.43,21.50,20.91,20.99,37558200\n6-May-08,21.41,21.77,21.25,21.50,29733900\n5-May-08,21.50,21.68,21.34,21.55,29773800\n2-May-08,22.06,22.07,21.29,21.51,36429900\n1-May-08,21.01,21.85,20.96,21.82,35497900\n30-Apr-08,21.49,21.58,20.80,20.85,41071100\n29-Apr-08,21.41,21.88,21.33,21.76,25550300\n28-Apr-08,21.58,21.80,21.38,21.51,24155900\n25-Apr-08,21.96,21.98,21.25,21.59,27496600\n24-Apr-08,21.92,22.28,21.54,22.01,35033900\n23-Apr-08,21.79,21.96,21.69,21.91,25001400\n22-Apr-08,21.54,21.88,21.50,21.78,29765300\n21-Apr-08,21.64,21.91,21.41,21.76,25092100\n18-Apr-08,21.54,21.93,21.23,21.80,43223200\n17-Apr-08,20.83,21.22,20.69,21.20,35794200\n16-Apr-08,20.30,20.94,20.29,20.77,46321800\n15-Apr-08,19.95,20.24,19.93,20.18,24491000\n14-Apr-08,19.83,20.15,19.80,19.86,21201400\n11-Apr-08,20.09,20.14,19.81,19.84,27711600\n10-Apr-08,20.19,20.80,20.16,20.45,46848000\n9-Apr-08,19.92,20.26,19.87,20.22,31311600\n8-Apr-08,20.03,20.15,19.84,19.92,34386100\n7-Apr-08,20.45,20.56,20.20,20.23,22595300\n4-Apr-08,20.61,20.69,20.31,20.35,53735100\n3-Apr-08,20.40,20.70,20.27,20.68,36306600\n2-Apr-08,20.41,20.76,20.26,20.49,32113700\n1-Apr-08,19.91,20.42,19.72,20.41,43939000\n31-Mar-08,19.48,19.63,19.39,19.56,30806900\n28-Mar-08,19.55,19.86,19.32,19.37,37178000\n27-Mar-08,19.45,19.70,19.25,19.43,12216900\n26-Mar-08,21.29,21.30,20.63,20.94,69062100\n25-Mar-08,21.03,21.16,20.72,21.08,42060400\n24-Mar-08,20.42,20.91,20.37,20.77,33971600\n20-Mar-08,19.86,20.17,19.56,20.08,42936800\n19-Mar-08,20.26,20.49,19.55,19.56,42892500\n18-Mar-08,19.64,20.05,19.39,20.02,37841400\n17-Mar-08,18.93,19.49,18.93,19.28,40165300\n14-Mar-08,20.01,20.05,19.27,19.52,43034700\n13-Mar-08,19.57,19.99,19.36,19.84,43508300\n12-Mar-08,19.58,20.17,19.43,19.68,48006500\n11-Mar-08,19.65,19.95,19.10,19.51,47860700\n10-Mar-08,19.17,19.50,19.08,19.28,34763500\n7-Mar-08,19.13,19.55,18.87,19.00,46022400\n6-Mar-08,19.09,19.60,19.07,19.23,66955400\n5-Mar-08,18.71,18.98,18.62,18.80,56645500\n4-Mar-08,18.82,18.98,18.20,18.44,70246200\n3-Mar-08,18.76,19.18,18.66,18.95,41576300\n29-Feb-08,19.18,19.20,18.73,18.80,41998600\n28-Feb-08,19.10,19.60,18.92,19.41,41310000\n27-Feb-08,19.12,19.45,18.81,19.19,37457200\n26-Feb-08,18.90,19.35,18.87,19.21,45946700\n25-Feb-08,18.85,19.12,18.61,18.97,55052100\n22-Feb-08,18.93,19.02,18.18,18.90,61325300\n21-Feb-08,19.49,19.60,18.81,18.89,54454000\n20-Feb-08,19.02,19.50,18.98,19.43,36075800\n19-Feb-08,19.31,19.40,18.99,19.02,33639500\n15-Feb-08,19.02,19.22,18.94,19.09,23100500\n14-Feb-08,19.65,19.72,19.00,19.09,33927900\n13-Feb-08,19.70,19.93,19.46,19.66,28937100\n12-Feb-08,19.55,19.89,19.30,19.41,35282800\n11-Feb-08,19.21,19.57,19.17,19.44,42680100\n8-Feb-08,19.16,19.39,18.94,19.19,36399000\n7-Feb-08,19.26,19.60,19.03,19.20,57184600\n6-Feb-08,19.54,20.09,19.40,19.68,49043900\n5-Feb-08,19.78,19.88,19.21,19.26,53477500\n4-Feb-08,20.68,20.68,20.15,20.20,25299400\n1-Feb-08,20.78,20.78,20.22,20.68,40254700\n31-Jan-08,19.95,20.73,19.88,20.55,48963700\n30-Jan-08,20.02,20.60,19.81,20.27,40714900\n29-Jan-08,20.23,20.28,19.69,20.07,33491200\n28-Jan-08,20.13,20.40,20.01,20.26,27969700\n25-Jan-08,21.00,21.08,20.22,20.28,40075900\n24-Jan-08,20.52,20.97,20.15,20.61,42286100\n23-Jan-08,19.58,20.68,19.52,20.61,54362700\n22-Jan-08,20.28,20.79,19.68,20.22,64671000\n18-Jan-08,21.35,21.83,21.17,21.58,49279200\n17-Jan-08,21.90,55.02,21.30,21.41,50613100\n16-Jan-08,21.03,22.33,20.85,21.92,73497100\n15-Jan-08,21.76,22.05,21.30,21.31,36669400\n14-Jan-08,21.44,22.12,21.10,22.06,45930200\n11-Jan-08,21.53,21.69,21.06,21.10,44496000\n10-Jan-08,21.46,21.80,21.07,21.68,40740400\n9-Jan-08,21.34,21.69,21.15,21.61,46662900\n8-Jan-08,22.24,22.32,21.14,21.15,40293800\n7-Jan-08,21.96,22.48,21.79,22.25,38404400\n4-Jan-08,22.77,22.88,21.79,22.03,42968700\n3-Jan-08,22.43,23.11,22.43,23.11,40219300\n2-Jan-08,22.55,22.82,22.38,22.49,40238600\n31-Dec-07,22.69,22.96,22.50,22.58,17261500\n28-Dec-07,23.11,23.29,22.90,22.97,19468200\n27-Dec-07,23.05,23.31,22.91,23.04,32104400\n26-Dec-07,22.56,23.00,22.55,23.00,23028300\n24-Dec-07,22.64,22.80,22.42,22.76,13689100\n21-Dec-07,22.30,22.76,22.25,22.71,54439100\n20-Dec-07,22.43,22.50,22.04,22.10,71647400\n19-Dec-07,21.33,21.40,20.56,20.76,59345900\n18-Dec-07,21.08,21.26,20.62,21.25,37293200\n17-Dec-07,21.15,21.16,20.82,20.94,34211400\n14-Dec-07,21.36,21.44,21.12,21.20,23612900\n13-Dec-07,21.34,21.77,21.26,21.61,29130500\n12-Dec-07,21.41,21.81,21.06,21.37,37741600\n11-Dec-07,21.70,21.70,21.01,21.07,28655300\n10-Dec-07,21.29,21.69,21.23,21.64,23779300\n7-Dec-07,21.50,21.54,21.06,21.14,23060000\n6-Dec-07,21.10,21.45,20.94,21.42,27912200\n5-Dec-07,20.22,21.46,20.19,21.22,55095400\n4-Dec-07,19.75,20.19,19.68,20.03,31829800\n3-Dec-07,20.23,20.46,20.10,20.24,35441100\n30-Nov-07,20.78,20.78,19.78,20.18,45898400\n29-Nov-07,20.48,20.69,20.31,20.48,23811600\n28-Nov-07,20.08,20.62,20.01,20.51,26694200\n27-Nov-07,19.75,20.18,19.50,19.89,31485400\n26-Nov-07,20.38,20.50,19.69,19.70,25473400\n23-Nov-07,20.24,20.43,20.06,20.31,10007900\n21-Nov-07,20.25,20.63,20.02,20.21,27216100\n20-Nov-07,20.44,20.94,20.23,20.69,33178700\n19-Nov-07,20.65,20.88,20.32,20.53,27538500\n16-Nov-07,20.42,21.06,20.19,20.80,43362000\n15-Nov-07,19.92,20.62,19.72,20.42,53401100\n14-Nov-07,20.83,20.93,19.99,20.18,45574000\n13-Nov-07,19.80,20.53,19.78,20.52,46227100\n12-Nov-07,19.25,19.92,19.06,19.44,53622500\n9-Nov-07,19.93,20.07,19.32,19.36,75583100\n8-Nov-07,21.90,22.05,19.82,20.35,92916700\n7-Nov-07,22.50,22.69,22.07,22.10,35853800\n6-Nov-07,22.53,22.89,22.34,22.83,32154800\n5-Nov-07,21.83,22.21,21.76,22.07,25012800\n2-Nov-07,21.86,22.10,21.68,22.03,29578700\n1-Nov-07,22.00,22.19,21.75,21.76,32064300\n31-Oct-07,21.64,22.24,21.63,22.17,28541000\n30-Oct-07,21.68,21.74,21.48,21.63,24431300\n29-Oct-07,21.49,21.82,21.30,21.77,28193200\n26-Oct-07,21.32,21.35,20.99,21.35,29153500\n25-Oct-07,21.33,21.45,20.78,21.00,37822900\n24-Oct-07,21.26,21.35,20.85,21.18,30509100\n23-Oct-07,21.40,21.49,21.12,21.45,27856200\n22-Oct-07,20.60,21.34,20.51,21.20,29589900\n19-Oct-07,21.43,21.47,20.67,20.75,37407000\n18-Oct-07,21.54,21.58,21.11,21.43,29964500\n17-Oct-07,21.95,21.95,21.14,21.49,39056900\n16-Oct-07,22.00,22.06,21.71,21.75,27491800\n15-Oct-07,22.55,22.58,21.82,22.07,32272500\n12-Oct-07,22.40,22.65,22.11,22.44,37492800\n11-Oct-07,22.95,23.00,22.39,22.46,33329400\n10-Oct-07,22.59,22.95,22.53,22.92,29843200\n9-Oct-07,22.54,22.68,22.36,22.58,22837500\n8-Oct-07,22.04,22.55,22.03,22.51,21783300\n5-Oct-07,21.86,22.32,21.81,22.18,29774400\n4-Oct-07,21.65,21.79,21.51,21.76,17094100\n3-Oct-07,21.74,21.88,21.45,21.57,22894900\n2-Oct-07,21.98,21.98,21.71,21.85,21152400\n1-Oct-07,21.64,21.99,21.61,21.97,21553200\n28-Sep-07,21.65,21.83,21.56,21.65,17686400\n27-Sep-07,21.84,21.88,21.53,21.63,19780600\n26-Sep-07,22.01,22.02,21.50,21.77,29659800\n25-Sep-07,21.62,21.98,21.50,21.94,28060900\n24-Sep-07,22.00,22.12,21.55,21.79,36813500\n21-Sep-07,21.57,22.17,21.04,21.98,92207200\n20-Sep-07,20.82,21.31,20.63,21.04,49031400\n19-Sep-07,20.94,21.13,20.61,20.84,45498100\n18-Sep-07,20.08,20.73,20.05,20.73,27071100\n17-Sep-07,19.96,20.23,19.88,20.02,22220500\n14-Sep-07,20.39,20.42,20.01,20.07,34911700\n13-Sep-07,20.70,20.70,20.34,20.45,24263900\n12-Sep-07,20.35,20.62,20.30,20.54,30163000\n11-Sep-07,20.23,20.52,20.15,20.46,20792800\n10-Sep-07,20.34,20.46,19.98,20.17,24459100\n7-Sep-07,20.22,20.40,19.97,20.16,28720900\n6-Sep-07,20.72,20.74,20.33,20.54,26042300\n5-Sep-07,20.49,20.85,20.46,20.73,29520700\n4-Sep-07,20.24,20.88,20.20,20.72,35862700\n31-Aug-07,20.43,20.48,20.15,20.28,23088200\n30-Aug-07,19.96,20.42,19.81,20.21,29437000\n29-Aug-07,19.41,20.15,19.37,20.13,30099800\n28-Aug-07,19.80,19.86,19.33,19.36,19952600\n27-Aug-07,19.95,20.02,19.75,19.86,17533600\n24-Aug-07,19.30,19.97,19.30,19.94,25877800\n23-Aug-07,19.38,19.69,19.22,19.37,30860200\n22-Aug-07,19.39,19.42,19.07,19.32,21460400\n21-Aug-07,18.96,19.34,18.96,19.27,22497000\n20-Aug-07,19.25,19.41,18.95,19.11,22014900\n17-Aug-07,19.31,19.55,19.01,19.35,34601000\n16-Aug-07,19.11,19.48,18.81,19.14,40867100\n15-Aug-07,19.25,19.71,19.13,19.18,26534100\n14-Aug-07,19.80,19.81,19.32,19.35,21284900\n13-Aug-07,19.93,19.96,19.65,19.72,20697400\n10-Aug-07,19.75,20.25,19.67,19.99,35426900\n9-Aug-07,19.94,20.30,19.87,20.09,31868500\n8-Aug-07,19.96,20.21,19.80,20.20,25619800\n7-Aug-07,19.86,20.08,19.50,19.68,32481400\n6-Aug-07,19.82,20.10,19.73,20.08,28184300\n3-Aug-07,20.09,20.19,19.66,19.66,34378900\n2-Aug-07,19.76,20.21,19.67,20.09,31039100\n1-Aug-07,18.93,19.82,18.83,19.79,53713500\n31-Jul-07,19.79,19.82,19.11,19.12,32959600\n30-Jul-07,19.56,19.67,19.34,19.58,21593500\n27-Jul-07,20.00,20.22,19.60,19.62,31739700\n26-Jul-07,20.21,20.46,19.74,20.01,40715900\n25-Jul-07,20.70,20.74,20.40,20.58,28470500\n24-Jul-07,20.78,20.98,20.54,20.64,35415700\n23-Jul-07,20.81,20.91,20.64,20.78,28735400\n20-Jul-07,20.89,20.94,20.38,20.61,42916100\n19-Jul-07,20.56,20.72,20.52,20.60,27967900\n18-Jul-07,20.20,20.42,20.16,20.41,29388600\n17-Jul-07,20.25,20.47,20.21,20.38,21181000\n16-Jul-07,20.29,20.47,20.17,20.20,19362700\n13-Jul-07,20.50,20.50,20.25,20.40,22527400\n12-Jul-07,20.05,20.51,19.97,20.50,34897500\n11-Jul-07,19.77,20.00,19.72,19.98,28101900\n10-Jul-07,20.01,20.15,19.70,19.72,27947100\n9-Jul-07,20.24,20.24,20.07,20.16,25107400\n6-Jul-07,20.45,20.49,20.25,20.40,25693500\n5-Jul-07,20.06,20.50,19.96,20.49,34555800\n3-Jul-07,19.97,20.07,19.90,20.07,18398600\n2-Jul-07,19.88,19.99,19.72,19.92,21397800\n29-Jun-07,19.95,20.02,19.54,19.71,29972200\n28-Jun-07,19.62,20.06,19.61,19.85,43987000\n27-Jun-07,19.32,19.77,19.27,19.69,71743700\n26-Jun-07,19.62,19.68,19.02,19.16,41653400\n25-Jun-07,19.45,19.66,19.21,19.48,27990600\n22-Jun-07,19.60,19.65,19.39,19.39,32491900\n21-Jun-07,19.57,19.73,19.46,19.68,27389600\n20-Jun-07,19.96,19.96,19.52,19.53,34327500\n19-Jun-07,19.79,19.94,19.63,19.88,23635500\n18-Jun-07,19.92,19.94,19.62,19.79,35280100\n15-Jun-07,19.91,19.95,19.75,19.86,30145900\n14-Jun-07,19.55,19.69,19.49,19.64,38619000\n13-Jun-07,18.87,19.30,18.72,19.30,29144400\n12-Jun-07,19.21,19.37,18.81,18.84,32990500\n11-Jun-07,18.93,19.32,18.90,19.21,24322800\n8-Jun-07,18.73,19.10,18.73,19.06,34554800\n7-Jun-07,19.15,19.35,18.73,18.73,37712100\n6-Jun-07,19.37,19.40,19.11,19.35,30750100\n5-Jun-07,19.60,19.64,19.33,19.48,25092800\n4-Jun-07,19.55,19.69,19.39,19.67,20897300\n1-Jun-07,19.38,19.70,19.38,19.66,25376500\n31-May-07,19.39,19.60,19.26,19.38,30385700\n30-May-07,19.25,19.42,19.11,19.42,27101100\n29-May-07,19.29,19.49,19.19,19.31,26441900\n25-May-07,18.89,19.30,18.84,19.24,24024100\n24-May-07,19.14,19.29,18.67,18.75,31929300\n23-May-07,19.38,19.47,19.15,19.16,22182600\n22-May-07,19.39,19.46,19.20,19.37,21316900\n21-May-07,19.20,19.32,19.11,19.32,17474100\n18-May-07,19.07,19.25,19.01,19.25,24653300\n17-May-07,18.86,19.11,18.81,19.05,20318100\n16-May-07,18.86,18.99,18.65,18.99,23024300\n15-May-07,18.89,19.17,18.83,18.84,23203700\n14-May-07,18.94,19.08,18.77,18.94,16428300\n11-May-07,18.60,19.04,18.52,18.98,30557100\n10-May-07,18.69,18.91,18.48,18.49,30203100\n9-May-07,18.91,18.91,18.57,18.83,22329300\n8-May-07,18.93,19.04,18.88,18.95,16565900\n7-May-07,19.02,19.15,18.99,19.05,15523400\n4-May-07,19.04,19.05,18.77,19.03,22972100\n3-May-07,18.91,19.04,18.80,19.02,17757200\n2-May-07,18.70,18.98,18.61,18.86,21305900\n1-May-07,18.75,18.82,18.55,18.59,32929400\n30-Apr-07,19.10,19.15,18.80,18.80,25221400\n27-Apr-07,18.96,19.29,18.88,19.10,24552100\n26-Apr-07,18.77,19.00,18.76,18.95,16176000\n25-Apr-07,18.89,18.99,18.70,18.90,23831500\n24-Apr-07,19.04,19.05,18.75,18.82,20663000\n23-Apr-07,18.97,19.09,18.90,18.94,23795800\n20-Apr-07,18.98,19.06,18.82,19.00,36246000\n19-Apr-07,18.55,18.85,18.55,18.76,30729300\n18-Apr-07,18.80,18.88,18.70,18.73,31306500\n17-Apr-07,18.80,19.00,18.80,18.89,25321500\n16-Apr-07,18.68,18.95,18.66,18.90,25787000\n13-Apr-07,18.79,18.85,18.46,18.63,31545200\n12-Apr-07,18.57,18.71,18.44,18.70,20894200\n11-Apr-07,18.90,18.91,18.46,18.59,29004800\n10-Apr-07,18.78,18.88,18.68,18.85,23659900\n9-Apr-07,18.66,18.70,18.54,18.57,19190600\n5-Apr-07,18.50,18.67,18.39,18.67,21612600\n4-Apr-07,18.35,18.57,18.33,18.56,21862600\n3-Apr-07,18.23,18.47,18.17,18.36,31166200\n2-Apr-07,18.08,18.18,17.99,18.14,20256700\n30-Mar-07,18.15,18.27,17.89,18.13,18495200\n29-Mar-07,18.33,18.33,17.95,18.16,27992500\n28-Mar-07,18.34,18.50,18.15,18.17,31524300\n27-Mar-07,18.35,18.50,18.35,18.49,32278100\n26-Mar-07,18.22,18.43,18.02,18.39,30179600\n23-Mar-07,18.46,18.59,18.18,18.24,32999400\n22-Mar-07,18.02,18.55,17.95,18.49,46835900\n21-Mar-07,18.31,18.39,17.78,18.17,90416000\n20-Mar-07,17.25,17.70,17.14,17.55,55424000\n19-Mar-07,16.83,17.23,16.83,17.18,28527800\n16-Mar-07,16.71,16.85,16.62,16.70,32429500\n15-Mar-07,16.85,16.94,16.65,16.72,21833500\n14-Mar-07,16.74,16.94,16.66,16.88,33215000\n13-Mar-07,16.93,17.21,16.65,16.65,30623800\n12-Mar-07,16.61,17.09,16.60,17.07,29760300\n9-Mar-07,16.81,16.95,16.57,16.63,23655500\n8-Mar-07,16.70,16.92,16.63,16.69,29969500\n7-Mar-07,16.77,16.85,16.46,16.49,29978800\n6-Mar-07,16.52,16.92,16.48,16.88,36938000\n5-Mar-07,16.52,17.00,16.34,16.37,32570100\n2-Mar-07,16.63,16.89,16.53,16.71,36913400\n1-Mar-07,16.11,17.04,15.97,16.77,80967100\n28-Feb-07,16.37,16.84,16.31,16.43,46822600\n27-Feb-07,16.65,16.80,16.29,16.29,38998700\n26-Feb-07,16.91,17.02,16.00,16.82,25249100\n23-Feb-07,17.24,17.26,16.71,16.82,54052200\n22-Feb-07,17.26,17.30,17.01,17.27,32944100\n21-Feb-07,16.97,17.28,16.95,17.20,50295800\n20-Feb-07,16.69,16.98,16.57,16.98,31544600\n16-Feb-07,16.89,16.98,16.70,16.70,33958400\n15-Feb-07,16.84,16.92,16.68,16.91,33443000\n14-Feb-07,16.74,16.94,16.68,16.77,41999600\n13-Feb-07,16.71,16.71,16.53,16.62,26301600\n12-Feb-07,16.65,16.71,16.51,16.65,31695300\n9-Feb-07,16.79,16.94,16.54,16.70,41279800\n8-Feb-07,16.87,16.92,16.66,16.71,45606600\n7-Feb-07,17.11,17.12,16.85,16.91,44962800\n6-Feb-07,17.13,17.19,16.86,17.02,31270300\n5-Feb-07,17.35,17.43,17.08,17.16,28178900\n2-Feb-07,17.14,17.44,17.11,17.42,40627400\n1-Feb-07,17.22,17.34,17.03,17.05,28905400\n31-Jan-07,17.11,17.20,16.80,17.16,39265800\n30-Jan-07,17.32,17.50,17.09,17.16,42259300\n29-Jan-07,17.09,17.30,17.03,17.27,33226400\n26-Jan-07,17.04,17.30,17.03,17.15,35856800\n25-Jan-07,17.13,17.22,16.93,16.98,35713800\n24-Jan-07,17.11,17.29,17.09,17.14,30992600\n23-Jan-07,17.01,17.31,17.01,17.12,32912400\n22-Jan-07,17.25,17.81,16.77,17.00,44443300\n19-Jan-07,17.06,17.45,17.01,17.27,28438300\n18-Jan-07,17.48,17.52,17.10,17.12,61176200\n17-Jan-07,17.29,17.71,17.28,17.52,30908600\n16-Jan-07,17.39,17.48,17.26,17.30,35534500\n12-Jan-07,17.35,17.55,17.28,17.50,42184800\n11-Jan-07,17.79,17.81,17.35,17.39,50677000\n10-Jan-07,17.66,17.80,17.55,17.77,27181600\n9-Jan-07,17.93,17.98,17.65,17.82,31218200\n8-Jan-07,17.63,17.93,17.45,17.86,30907900\n5-Jan-07,17.62,17.76,17.44,17.64,33572200\n4-Jan-07,17.55,17.87,17.30,17.68,33165300\n3-Jan-07,17.22,17.78,17.10,17.51,50206700\n29-Dec-06,17.12,17.38,17.08,17.14,23237800\n28-Dec-06,17.13,17.25,17.04,17.20,19399300\n27-Dec-06,17.23,17.24,17.07,17.10,16424600\n26-Dec-06,17.02,17.25,16.99,17.13,14993100\n22-Dec-06,17.11,17.25,17.05,17.11,19674000\n21-Dec-06,17.14,17.20,17.09,17.10,26724900\n20-Dec-06,17.09,17.22,17.03,17.10,48381000\n19-Dec-06,17.15,17.26,16.93,17.10,387500\n18-Dec-06,17.87,18.17,17.65,17.91,52121400\n15-Dec-06,18.01,18.03,17.59,17.68,49413900\n14-Dec-06,18.07,18.25,17.94,18.02,26907100\n13-Dec-06,18.22,18.25,17.88,18.02,33244700\n12-Dec-06,18.21,18.22,17.83,17.99,41445000\n11-Dec-06,17.77,18.25,17.71,18.07,43699900\n8-Dec-06,17.59,17.88,17.53,17.80,37148300\n7-Dec-06,17.62,17.70,17.32,17.50,89206900\n6-Dec-06,18.39,18.42,17.78,17.88,93650700\n5-Dec-06,19.32,19.33,18.78,18.86,54418500\n4-Dec-06,18.88,19.34,18.75,19.28,42710600\n1-Dec-06,19.11,19.11,18.63,18.81,34684200\n30-Nov-06,19.13,19.31,19.03,19.05,31106000\n29-Nov-06,19.04,19.34,18.91,19.15,22891400\n28-Nov-06,18.78,19.03,18.72,18.90,37202400\n27-Nov-06,19.48,19.55,18.83,18.92,36554900\n24-Nov-06,19.46,19.73,19.38,19.60,7831300\n22-Nov-06,19.49,19.75,19.48,19.66,22417300\n21-Nov-06,19.46,19.49,19.22,19.48,20199900\n20-Nov-06,19.33,19.58,19.32,19.48,23722200\n17-Nov-06,19.00,19.47,18.98,19.46,33864100\n16-Nov-06,19.16,19.20,18.89,19.10,22035800\n15-Nov-06,19.14,19.27,19.07,19.12,18668600\n14-Nov-06,19.18,19.22,18.92,19.17,33276600\n13-Nov-06,18.79,19.21,18.75,19.18,34253700\n10-Nov-06,18.65,18.87,18.61,18.78,23855400\n9-Nov-06,18.40,18.80,18.29,18.54,40224600\n8-Nov-06,18.16,18.43,18.05,18.36,24699700\n7-Nov-06,18.12,18.25,17.99,18.20,27151000\n6-Nov-06,17.90,18.23,17.82,18.10,36418600\n3-Nov-06,18.32,18.34,17.67,17.78,46796600\n2-Nov-06,18.45,18.47,18.05,18.27,34297500\n1-Nov-06,18.56,18.65,18.34,18.47,31688400\n31-Oct-06,18.54,18.68,18.41,18.47,27939900\n30-Oct-06,17.94,18.59,17.77,18.52,29113300\n27-Oct-06,18.59,18.59,18.06,18.10,41496400\n26-Oct-06,18.71,18.88,18.47,18.72,29883800\n25-Oct-06,18.91,18.98,18.55,18.62,35668100\n24-Oct-06,19.06,19.15,18.74,18.89,30317400\n23-Oct-06,18.97,19.25,18.87,19.15,28998600\n20-Oct-06,18.95,19.02,18.68,18.98,23400300\n19-Oct-06,18.66,18.96,18.37,18.87,33093100\n18-Oct-06,18.84,18.95,18.69,18.74,26193700\n17-Oct-06,18.84,18.99,18.60,18.63,26668800\n16-Oct-06,19.10,19.13,18.98,18.99,24279300\n13-Oct-06,18.97,19.14,18.78,19.07,36067300\n12-Oct-06,18.65,19.00,18.52,18.99,44529000\n11-Oct-06,18.68,18.79,18.48,18.58,37556400\n10-Oct-06,18.56,18.74,18.47,18.74,48928000\n9-Oct-06,18.16,18.59,18.07,18.55,32812400\n6-Oct-06,18.15,18.46,18.13,18.19,33025000\n5-Oct-06,18.18,18.31,18.14,18.26,43617700\n4-Oct-06,17.88,18.20,17.79,18.17,45240100\n3-Oct-06,17.57,18.05,17.52,17.90,53159000\n2-Oct-06,17.91,17.96,17.59,17.66,40023400\n29-Sep-06,17.95,18.03,17.74,17.74,33296800\n28-Sep-06,17.97,18.15,17.81,17.99,43357600\n27-Sep-06,18.08,18.19,17.90,17.93,33594400\n26-Sep-06,17.87,18.24,17.87,18.19,62272300\n25-Sep-06,17.58,17.99,17.39,17.97,54035600\n22-Sep-06,17.83,17.90,17.53,17.54,49409900\n21-Sep-06,17.93,18.15,17.91,18.08,67585400\n20-Sep-06,18.09,18.29,17.84,17.93,1780000\n19-Sep-06,16.31,16.60,16.07,16.13,73580100\n18-Sep-06,16.45,16.45,16.10,16.25,59221300\n15-Sep-06,16.52,16.64,16.10,16.33,75786300\n14-Sep-06,16.28,16.49,16.20,16.47,27601000\n13-Sep-06,16.31,16.48,16.18,16.39,39848800\n12-Sep-06,16.30,16.38,16.15,16.30,44162100\n11-Sep-06,15.79,16.35,15.75,16.29,42616200\n8-Sep-06,16.05,16.18,15.76,15.91,46274200\n7-Sep-06,15.64,16.20,15.58,16.01,75912600\n6-Sep-06,15.68,15.81,15.57,15.62,44541700\n5-Sep-06,15.60,15.89,15.59,15.84,40136600\n1-Sep-06,15.80,15.83,15.45,15.50,24560400\n31-Aug-06,15.68,15.75,15.50,15.66,27301000\n30-Aug-06,15.56,15.83,15.50,15.76,27257300\n29-Aug-06,15.53,15.64,15.40,15.52,28115000\n28-Aug-06,15.42,15.65,15.36,15.54,28081300\n25-Aug-06,15.36,15.63,15.31,15.41,28841800\n24-Aug-06,15.39,15.50,15.23,15.38,41520900\n23-Aug-06,15.48,15.49,15.23,15.32,36897500\n22-Aug-06,15.63,15.65,15.37,15.48,39329800\n21-Aug-06,15.59,15.79,15.45,15.64,28260600\n18-Aug-06,15.76,15.81,15.40,15.71,33087800\n17-Aug-06,15.42,15.95,15.41,15.81,45449900\n16-Aug-06,15.74,15.75,15.41,15.54,49513200\n15-Aug-06,15.47,15.75,15.43,15.72,47626800\n14-Aug-06,15.11,15.50,15.06,15.29,36270200\n11-Aug-06,15.10,15.16,14.89,14.99,19262800\n10-Aug-06,14.88,15.27,14.86,15.13,34165900\n9-Aug-06,14.95,15.25,14.85,14.95,50490500\n8-Aug-06,14.66,15.00,14.66,14.80,41978200\n7-Aug-06,14.64,14.69,14.50,14.62,31465600\n4-Aug-06,14.84,14.87,14.49,14.62,35888300\n3-Aug-06,14.80,15.03,14.73,14.77,31731100\n2-Aug-06,14.70,14.94,14.55,14.81,33340700\n1-Aug-06,14.90,14.94,14.55,14.73,33751500\n31-Jul-06,14.93,15.03,14.82,14.97,33827800\n28-Jul-06,14.93,15.12,14.85,15.07,25777000\n27-Jul-06,15.08,15.19,14.79,14.87,37150700\n26-Jul-06,14.94,15.19,14.76,15.02,35575000\n25-Jul-06,14.94,15.06,14.80,14.93,36801000\n24-Jul-06,15.08,15.17,14.92,14.98,47478500\n21-Jul-06,15.03,15.29,14.96,15.12,56774200\n20-Jul-06,15.06,15.24,14.91,15.12,48099500\n19-Jul-06,14.81,15.21,14.73,15.07,63990200\n18-Jul-06,14.39,14.81,14.35,14.72,52339000\n17-Jul-06,14.24,14.47,14.22,14.42,32398000\n14-Jul-06,14.05,14.39,13.93,14.29,39946400\n13-Jul-06,13.88,14.27,13.77,14.10,52810200\n12-Jul-06,14.51,14.59,14.15,14.22,26497000\n"
  },
  {
    "path": "examples/stockserver/RHT.csv",
    "content": "﻿Date,Open,High,Low,Close,Volume\n9-Jul-12,53.04,53.51,51.01,51.16,3270056\n6-Jul-12,55.10,55.54,52.38,52.94,2872859\n5-Jul-12,56.21,57.10,56.00,56.67,1258647\n3-Jul-12,55.82,57.02,55.71,56.67,636062\n2-Jul-12,56.40,56.77,55.39,55.84,1873798\n29-Jun-12,53.76,56.52,53.76,56.48,2822045\n28-Jun-12,54.17,54.80,51.87,52.68,1986401\n27-Jun-12,54.68,55.06,53.95,54.42,1959105\n26-Jun-12,54.04,54.84,53.59,54.62,2172021\n25-Jun-12,54.07,54.98,53.20,53.74,3077549\n22-Jun-12,53.43,55.60,52.33,55.01,4604538\n21-Jun-12,51.13,54.23,51.02,53.00,10776384\n20-Jun-12,57.00,57.17,55.55,56.50,5461883\n19-Jun-12,57.30,58.64,56.64,56.92,2668767\n18-Jun-12,55.89,56.91,54.76,56.56,2653913\n15-Jun-12,54.34,56.80,54.17,56.49,3005705\n14-Jun-12,53.29,54.40,52.51,54.15,1877218\n13-Jun-12,53.41,54.05,52.82,53.10,1472926\n12-Jun-12,54.04,54.34,52.83,53.72,2072115\n11-Jun-12,56.04,56.22,53.72,53.77,1798710\n8-Jun-12,54.31,55.79,54.07,55.76,1610882\n7-Jun-12,55.85,56.07,54.47,54.63,1718618\n6-Jun-12,53.46,55.37,53.16,55.27,2628374\n5-Jun-12,50.12,53.17,50.12,52.96,3087233\n4-Jun-12,49.56,50.67,49.45,50.48,2769051\n1-Jun-12,50.03,51.26,49.86,49.90,2571398\n31-May-12,51.69,51.78,50.18,51.38,2814836\n30-May-12,51.47,51.78,50.98,51.53,1630451\n29-May-12,53.10,53.35,51.62,52.20,1888246\n25-May-12,52.65,52.78,51.90,52.09,1701422\n24-May-12,54.71,54.71,51.70,52.62,3134252\n23-May-12,55.20,55.20,52.60,54.43,3600707\n22-May-12,55.37,56.95,55.24,56.32,2703354\n21-May-12,53.48,55.50,52.88,55.28,1785044\n18-May-12,55.01,55.21,52.75,53.53,2517545\n17-May-12,55.78,56.10,54.28,54.48,2136297\n16-May-12,57.47,57.56,55.62,55.69,2007604\n15-May-12,56.01,58.13,56.01,56.82,1604456\n14-May-12,56.01,56.56,55.56,55.91,1154426\n11-May-12,55.84,57.45,55.84,56.67,1617867\n10-May-12,58.16,58.41,55.85,56.04,2865675\n9-May-12,56.69,58.26,56.25,57.90,2109780\n8-May-12,58.15,58.15,55.90,57.48,2039937\n7-May-12,58.07,59.00,57.19,58.64,1757672\n4-May-12,60.57,60.74,58.12,58.70,2235832\n3-May-12,61.72,62.41,60.45,60.80,2257848\n2-May-12,59.86,62.25,59.76,61.95,2058948\n1-May-12,59.70,61.11,59.52,60.39,1442192\n30-Apr-12,60.59,60.81,59.52,59.61,1297098\n27-Apr-12,59.96,61.03,59.00,60.91,1858946\n26-Apr-12,59.26,60.15,59.00,59.79,1289068\n25-Apr-12,57.93,59.29,57.66,59.23,2016463\n24-Apr-12,59.07,59.13,57.00,57.11,2068096\n23-Apr-12,59.72,59.81,57.84,58.87,2649769\n20-Apr-12,60.22,61.06,60.08,60.55,2014387\n19-Apr-12,60.23,62.75,59.62,60.13,2881103\n18-Apr-12,59.54,60.45,59.24,60.21,1537706\n17-Apr-12,60.17,60.35,59.83,59.94,2356770\n16-Apr-12,60.29,60.64,59.20,60.06,1638189\n13-Apr-12,60.65,61.36,59.92,60.20,1598866\n12-Apr-12,59.74,60.96,59.51,60.81,1729550\n11-Apr-12,58.92,59.78,58.25,59.53,2422650\n10-Apr-12,59.46,60.04,58.16,58.56,2710859\n9-Apr-12,59.90,60.23,59.11,59.73,1995977\n5-Apr-12,60.46,61.15,60.06,60.95,1537104\n4-Apr-12,61.07,61.92,59.65,60.67,2766031\n3-Apr-12,60.82,62.24,60.00,61.74,3653803\n2-Apr-12,59.67,61.05,58.86,60.80,3398239\n30-Mar-12,60.97,61.51,59.40,59.89,5263540\n29-Mar-12,54.94,61.71,54.55,61.43,15521466\n28-Mar-12,52.58,52.83,51.22,51.39,4334210\n27-Mar-12,53.27,54.01,51.90,51.90,3073635\n26-Mar-12,52.51,53.19,52.41,53.13,1628305\n23-Mar-12,51.54,51.95,51.02,51.87,1321497\n22-Mar-12,51.67,51.71,51.03,51.54,1242461\n21-Mar-12,50.91,52.57,50.89,52.03,1448307\n20-Mar-12,50.60,50.70,50.00,50.69,1272079\n19-Mar-12,50.56,51.31,50.56,51.03,924247\n16-Mar-12,49.64,50.98,49.35,50.64,1762906\n15-Mar-12,50.31,50.77,50.11,50.73,1645319\n14-Mar-12,51.39,51.51,50.16,50.33,1882012\n13-Mar-12,51.34,51.38,50.78,51.06,1753090\n12-Mar-12,50.58,51.12,50.47,50.94,1446949\n9-Mar-12,50.72,51.04,50.23,50.57,1385807\n8-Mar-12,50.10,51.15,50.02,50.67,1146710\n7-Mar-12,48.81,49.77,48.68,49.62,1200804\n6-Mar-12,48.71,48.86,48.25,48.70,1228480\n5-Mar-12,50.11,50.26,49.02,49.30,1590273\n2-Mar-12,50.70,50.85,50.05,50.23,1235737\n1-Mar-12,49.74,50.82,49.67,50.72,1143289\n29-Feb-12,49.70,50.29,49.32,49.46,1145165\n28-Feb-12,49.54,49.72,49.28,49.68,932598\n27-Feb-12,49.49,50.07,48.86,49.58,1074343\n24-Feb-12,49.43,50.61,49.30,50.01,1402197\n23-Feb-12,48.52,49.04,48.01,48.90,866250\n22-Feb-12,48.21,49.25,48.21,48.69,1365641\n21-Feb-12,48.71,48.79,47.82,48.27,1186315\n17-Feb-12,49.33,49.45,48.58,48.61,1190759\n16-Feb-12,48.24,49.15,48.14,49.08,1099532\n15-Feb-12,49.01,49.28,47.98,48.15,1115655\n14-Feb-12,48.79,49.15,48.36,48.81,1127587\n13-Feb-12,48.45,49.04,48.17,48.84,1176546\n10-Feb-12,48.29,48.72,47.68,47.97,1225541\n9-Feb-12,48.24,48.83,47.82,48.78,1145599\n8-Feb-12,48.03,48.14,47.45,48.08,1159848\n7-Feb-12,47.97,48.22,47.72,48.01,1143624\n6-Feb-12,48.58,48.71,48.19,48.25,1180057\n3-Feb-12,48.09,49.00,48.02,48.95,1919785\n2-Feb-12,47.27,48.00,47.14,47.48,1278843\n1-Feb-12,46.89,47.67,46.16,47.07,1855071\n31-Jan-12,47.00,47.00,46.18,46.37,1694810\n30-Jan-12,47.14,47.16,46.13,46.65,2064583\n27-Jan-12,47.15,47.87,47.09,47.50,2101930\n26-Jan-12,47.82,48.49,47.08,47.40,2357401\n25-Jan-12,47.53,48.00,47.19,47.77,1348116\n24-Jan-12,47.05,47.74,46.96,47.51,1947486\n23-Jan-12,46.29,47.09,46.17,47.00,2022070\n20-Jan-12,46.84,47.20,46.05,46.24,1948608\n19-Jan-12,45.84,47.00,45.84,46.90,2718338\n18-Jan-12,43.18,45.70,43.13,45.48,3304287\n17-Jan-12,42.94,43.50,42.80,43.22,1612650\n13-Jan-12,42.43,42.43,42.43,42.43,0\n12-Jan-12,43.18,43.19,42.24,43.11,1297304\n11-Jan-12,42.66,43.25,42.55,43.04,1441487\n10-Jan-12,42.73,43.23,42.62,42.96,1390474\n9-Jan-12,43.19,43.29,42.03,42.34,1729970\n6-Jan-12,42.83,43.50,42.57,43.04,1901013\n5-Jan-12,42.38,43.02,42.25,42.70,2798418\n4-Jan-12,41.76,42.46,41.30,42.40,2523982\n3-Jan-12,42.17,42.97,41.59,41.65,2455234\n30-Dec-11,41.29,41.29,41.29,41.29,0\n29-Dec-11,41.25,41.65,40.82,41.59,1430817\n28-Dec-11,41.48,41.60,40.82,41.00,1784031\n27-Dec-11,41.60,41.85,41.24,41.62,1862054\n23-Dec-11,41.59,41.59,41.59,41.59,0\n22-Dec-11,39.94,40.97,39.57,40.81,4982768\n21-Dec-11,41.31,41.33,39.19,39.90,10380245\n20-Dec-11,42.95,44.55,41.71,41.95,14844329\n19-Dec-11,48.25,48.25,45.83,46.05,3456390\n16-Dec-11,46.66,48.54,46.55,47.64,3108340\n15-Dec-11,46.91,47.00,45.70,46.23,2274429\n14-Dec-11,46.98,47.13,44.97,45.98,3710190\n13-Dec-11,49.34,49.55,46.67,46.98,2514791\n12-Dec-11,49.29,49.54,48.37,48.99,1545948\n9-Dec-11,49.02,49.95,48.94,49.70,2304955\n8-Dec-11,49.35,49.73,48.72,48.81,1987895\n7-Dec-11,50.31,50.32,48.96,49.60,3740193\n6-Dec-11,51.77,51.97,50.30,50.55,2836697\n5-Dec-11,51.21,52.95,51.16,51.80,1609602\n2-Dec-11,51.14,51.35,50.13,50.22,1264244\n1-Dec-11,49.87,50.73,49.43,50.54,1548303\n30-Nov-11,48.62,50.61,48.62,50.08,2792560\n29-Nov-11,47.69,48.22,46.92,47.15,1034995\n28-Nov-11,46.24,47.94,46.21,47.48,2036266\n25-Nov-11,45.52,46.02,44.89,44.93,865935\n23-Nov-11,45.51,45.51,45.51,45.51,0\n22-Nov-11,47.55,48.14,47.08,47.47,1504187\n21-Nov-11,48.09,48.21,47.01,47.73,2662372\n18-Nov-11,49.78,49.87,48.99,49.04,1947742\n17-Nov-11,51.80,51.80,49.21,49.58,1965528\n16-Nov-11,52.18,53.42,51.79,51.89,1910265\n15-Nov-11,50.15,53.09,50.05,52.72,3045977\n14-Nov-11,49.81,50.80,49.78,50.20,1366507\n11-Nov-11,49.91,50.69,49.82,50.05,1239872\n10-Nov-11,49.46,49.51,47.98,49.07,940581\n9-Nov-11,49.36,50.02,48.58,48.67,2220987\n8-Nov-11,50.03,50.88,49.26,50.53,1615291\n7-Nov-11,50.42,50.66,49.37,50.58,933470\n4-Nov-11,50.17,50.65,49.39,50.59,1411314\n3-Nov-11,49.30,50.77,48.60,50.61,1838184\n2-Nov-11,49.08,49.50,47.67,48.73,2013237\n1-Nov-11,47.70,48.87,47.23,48.28,2619185\n31-Oct-11,50.87,51.20,49.64,49.65,1944648\n28-Oct-11,49.93,52.00,49.93,51.86,1836004\n27-Oct-11,48.94,51.54,48.73,49.56,3535549\n26-Oct-11,47.09,48.57,46.00,48.23,3401171\n25-Oct-11,47.22,47.73,46.35,46.46,1808637\n24-Oct-11,46.30,47.57,46.27,47.42,1565003\n21-Oct-11,45.82,46.32,45.48,46.29,1623653\n20-Oct-11,45.51,45.68,44.33,45.37,1741505\n19-Oct-11,46.54,46.54,45.25,45.55,2621083\n18-Oct-11,45.38,47.07,44.75,46.82,2641581\n17-Oct-11,46.96,47.27,45.85,46.22,2218425\n14-Oct-11,46.69,47.69,46.60,47.44,2172000\n13-Oct-11,45.38,46.49,45.20,46.18,2219850\n12-Oct-11,45.23,46.29,44.88,45.68,2769553\n11-Oct-11,43.81,45.26,43.62,44.98,2467522\n10-Oct-11,43.66,44.35,43.29,44.17,1967903\n7-Oct-11,42.39,43.51,41.86,42.88,3324490\n6-Oct-11,40.67,42.09,40.08,42.04,2332212\n5-Oct-11,39.96,40.82,39.38,40.64,4677336\n4-Oct-11,38.76,40.03,37.85,39.89,5936850\n3-Oct-11,42.23,42.48,40.42,40.46,2665678\n30-Sep-11,43.16,43.70,42.23,42.26,3544410\n29-Sep-11,44.42,44.80,42.75,43.93,3628957\n28-Sep-11,44.70,45.07,43.21,43.65,4438561\n27-Sep-11,44.00,44.99,43.00,44.72,4240967\n26-Sep-11,42.72,43.56,41.52,43.49,3475292\n23-Sep-11,41.27,42.56,40.91,42.32,3283837\n22-Sep-11,42.18,42.55,40.32,41.49,8954799\n21-Sep-11,41.04,41.38,40.25,40.29,4102414\n20-Sep-11,41.14,41.68,39.95,40.09,2333280\n19-Sep-11,40.45,41.17,39.77,40.94,2277860\n16-Sep-11,41.47,41.56,40.59,41.21,2180434\n15-Sep-11,40.30,41.34,40.26,41.24,2758491\n14-Sep-11,39.00,40.40,38.42,39.68,2025064\n13-Sep-11,38.11,38.96,37.89,38.84,2190811\n12-Sep-11,36.64,38.03,36.61,38.01,2186944\n9-Sep-11,37.76,38.33,36.71,37.23,2096945\n8-Sep-11,38.48,39.10,38.16,38.28,1843318\n7-Sep-11,37.69,38.60,37.49,38.60,1739577\n6-Sep-11,35.92,37.02,35.65,36.95,1843029\n2-Sep-11,37.57,37.76,36.91,37.27,1932612\n1-Sep-11,39.53,39.99,38.25,38.50,2525363\n31-Aug-11,38.41,39.70,38.28,39.54,4091172\n30-Aug-11,36.93,38.08,36.69,37.86,2184117\n29-Aug-11,36.35,37.24,36.22,37.19,1577311\n26-Aug-11,34.29,36.08,34.06,35.90,2153198\n25-Aug-11,35.56,35.57,34.34,34.49,1994945\n24-Aug-11,34.58,35.48,34.16,35.44,3711863\n23-Aug-11,32.56,34.88,32.27,34.81,4512540\n22-Aug-11,32.77,33.20,32.17,32.26,3949995\n19-Aug-11,33.02,33.89,31.77,31.87,5738835\n18-Aug-11,35.44,35.45,32.95,33.33,5761615\n17-Aug-11,37.97,38.18,36.23,36.58,2875687\n16-Aug-11,38.16,38.19,37.23,37.80,2435971\n15-Aug-11,37.73,38.64,37.51,38.62,2409243\n12-Aug-11,37.97,38.08,37.06,37.42,3663012\n11-Aug-11,35.66,38.18,35.18,37.68,4331385\n10-Aug-11,35.66,36.86,35.22,35.32,4439710\n9-Aug-11,35.30,36.82,34.03,36.70,5387262\n8-Aug-11,36.62,37.12,34.94,34.96,4666298\n5-Aug-11,38.96,39.20,36.67,37.75,4654011\n4-Aug-11,40.01,40.05,38.58,38.63,3309114\n3-Aug-11,40.28,40.88,39.42,40.52,2913852\n2-Aug-11,40.86,41.33,40.07,40.25,3750650\n1-Aug-11,42.59,42.81,40.64,41.29,3181102\n29-Jul-11,42.12,42.69,41.54,42.08,1747945\n28-Jul-11,42.57,43.11,42.12,42.66,1702369\n27-Jul-11,43.87,43.87,42.40,42.60,2713665\n26-Jul-11,44.00,44.65,43.69,44.22,1897692\n25-Jul-11,44.00,44.46,43.85,43.95,1645613\n22-Jul-11,43.88,44.92,43.88,44.55,2363958\n21-Jul-11,43.90,44.22,43.26,43.82,2627853\n20-Jul-11,44.52,44.52,43.55,43.70,1700717\n19-Jul-11,43.06,44.71,43.04,44.47,3028262\n18-Jul-11,43.25,43.28,42.23,43.05,2007853\n15-Jul-11,43.06,43.32,42.29,43.30,3792165\n14-Jul-11,43.92,44.39,42.30,42.68,2960692\n13-Jul-11,44.24,44.77,43.72,43.87,1703534\n12-Jul-11,45.39,45.39,43.75,43.78,2014657\n11-Jul-11,45.86,46.19,45.09,45.31,1940196\n8-Jul-11,46.15,46.55,45.94,46.51,1005851\n7-Jul-11,46.91,47.10,46.52,46.67,1215849\n6-Jul-11,46.17,46.58,45.89,46.49,1409366\n5-Jul-11,46.29,46.46,45.79,46.06,1879322\n1-Jul-11,46.40,46.40,46.40,46.40,0\n30-Jun-11,45.24,46.07,45.00,45.90,2024301\n29-Jun-11,45.82,45.82,44.87,45.19,2359359\n28-Jun-11,45.30,45.73,45.01,45.65,1798671\n27-Jun-11,44.80,45.83,44.69,45.19,2456431\n24-Jun-11,45.31,45.49,44.70,45.03,2541459\n23-Jun-11,45.74,46.48,44.40,45.27,10098379\n22-Jun-11,43.37,44.31,42.80,43.72,3584174\n21-Jun-11,42.05,43.89,41.99,43.75,2864773\n20-Jun-11,41.13,42.21,41.00,41.95,2544417\n17-Jun-11,41.63,42.01,40.99,41.20,2705293\n16-Jun-11,41.38,41.53,40.27,40.94,2333426\n15-Jun-11,41.71,42.34,41.39,41.41,1474226\n14-Jun-11,42.12,42.60,41.97,42.26,1488249\n13-Jun-11,41.49,41.96,41.30,41.63,1706325\n10-Jun-11,42.20,42.40,41.44,41.49,1609307\n9-Jun-11,41.92,42.59,41.64,42.49,1354077\n8-Jun-11,42.18,42.59,41.57,41.81,1924633\n7-Jun-11,42.56,42.98,42.08,42.47,1957647\n6-Jun-11,42.77,42.95,42.25,42.38,1880234\n3-Jun-11,42.41,42.81,42.02,42.12,1759713\n2-Jun-11,42.86,43.47,42.54,43.03,1641230\n1-Jun-11,43.49,44.08,42.90,42.91,2860558\n31-May-11,43.68,43.91,43.18,43.60,2332173\n27-May-11,43.35,43.35,43.35,43.35,0\n26-May-11,43.07,43.53,42.72,43.45,1679636\n25-May-11,42.77,43.36,42.50,43.07,1513300\n24-May-11,44.08,44.23,42.94,42.98,2797338\n23-May-11,44.92,44.92,43.86,44.03,1981749\n20-May-11,45.62,46.09,45.21,45.74,1443881\n19-May-11,45.70,45.85,45.08,45.64,948897\n18-May-11,45.21,45.79,44.83,45.59,1038341\n17-May-11,45.35,45.40,44.57,45.20,1413906\n16-May-11,46.64,46.69,45.44,45.50,1938770\n13-May-11,47.35,47.79,46.77,46.87,1459207\n12-May-11,46.13,47.55,45.80,47.44,1698669\n11-May-11,46.87,47.26,46.08,46.35,1599653\n10-May-11,46.25,47.04,46.05,46.86,1114671\n9-May-11,45.96,46.20,45.58,46.10,893604\n6-May-11,46.20,46.67,45.38,45.79,1765405\n5-May-11,45.52,47.35,44.59,45.60,2242113\n4-May-11,47.00,47.12,45.31,45.84,3013943\n3-May-11,47.12,47.27,46.23,47.00,2506744\n2-May-11,47.66,47.71,46.44,47.27,2444354\n29-Apr-11,46.80,47.55,46.44,47.47,1446019\n28-Apr-11,46.52,46.95,46.26,46.74,1013331\n27-Apr-11,46.69,46.72,45.73,46.72,1049843\n26-Apr-11,47.30,47.56,46.19,46.48,1773313\n25-Apr-11,47.52,47.73,47.02,47.22,839937\n21-Apr-11,47.59,47.59,47.59,47.59,0\n20-Apr-11,46.55,48.15,46.43,47.71,3792317\n19-Apr-11,45.18,45.37,44.55,45.11,1422028\n18-Apr-11,45.28,45.39,44.34,45.26,1690524\n15-Apr-11,45.45,46.04,45.11,45.92,1822028\n14-Apr-11,45.16,45.63,44.65,45.49,2040315\n13-Apr-11,45.01,46.03,44.96,45.70,2200542\n12-Apr-11,44.53,45.14,44.21,44.59,2096186\n11-Apr-11,45.10,45.59,44.66,45.04,1464455\n8-Apr-11,45.56,45.57,44.79,45.20,1377984\n7-Apr-11,45.11,45.84,44.59,45.12,1663896\n6-Apr-11,46.49,46.59,44.77,45.17,2723507\n5-Apr-11,46.80,46.84,46.11,46.38,2589698\n4-Apr-11,46.31,47.20,46.27,47.03,3345517\n1-Apr-11,45.86,46.43,45.41,46.31,2893603\n31-Mar-11,45.94,46.05,45.18,45.39,2065434\n30-Mar-11,47.10,47.26,45.53,46.10,2576069\n29-Mar-11,45.89,47.00,45.79,46.91,2266827\n28-Mar-11,46.41,46.82,45.72,46.09,3540893\n25-Mar-11,47.29,47.68,46.14,46.34,4227377\n24-Mar-11,45.33,47.88,44.76,47.26,18030002\n23-Mar-11,39.17,40.25,38.75,39.97,2894239\n22-Mar-11,39.84,39.84,39.02,39.56,1920315\n21-Mar-11,39.61,40.18,39.14,39.81,1776287\n18-Mar-11,39.94,40.21,38.90,39.11,2733245\n17-Mar-11,40.35,40.35,39.24,39.29,2067595\n16-Mar-11,39.88,40.77,39.49,39.58,2124562\n15-Mar-11,38.84,40.34,38.47,40.11,2180681\n14-Mar-11,40.59,41.17,39.93,40.21,1311308\n11-Mar-11,40.04,41.17,39.98,41.06,1087404\n10-Mar-11,40.71,40.92,39.96,40.35,1451403\n9-Mar-11,41.10,41.60,40.78,41.34,1408694\n8-Mar-11,40.42,41.60,40.23,41.30,2015066\n7-Mar-11,41.31,41.36,39.81,40.35,1515073\n4-Mar-11,41.75,41.98,40.80,40.96,1536770\n3-Mar-11,41.19,41.91,40.98,41.86,1576908\n2-Mar-11,40.21,41.02,40.13,40.71,1252941\n1-Mar-11,41.43,41.59,40.12,40.35,1738437\n28-Feb-11,41.50,41.55,40.68,41.28,1858972\n25-Feb-11,41.01,41.67,40.72,41.34,2066060\n24-Feb-11,39.74,41.12,39.42,40.59,6254869\n23-Feb-11,42.94,43.15,40.56,40.58,4959564\n22-Feb-11,44.75,44.81,42.86,43.03,1894734\n18-Feb-11,45.43,45.43,45.43,45.43,0\n17-Feb-11,45.52,45.89,45.17,45.58,1113563\n16-Feb-11,45.52,45.77,45.13,45.66,1206929\n15-Feb-11,45.27,45.55,45.13,45.29,1266309\n14-Feb-11,44.77,45.62,44.70,45.56,1330542\n11-Feb-11,44.44,45.36,44.27,44.88,1466255\n10-Feb-11,44.03,45.00,43.84,44.72,1468542\n9-Feb-11,44.31,44.75,44.15,44.39,1827006\n8-Feb-11,44.03,44.89,43.75,44.46,2289097\n7-Feb-11,43.59,44.54,43.49,44.11,1629535\n4-Feb-11,43.02,43.73,42.70,43.57,2164558\n3-Feb-11,42.65,43.26,42.28,43.07,2756098\n2-Feb-11,41.68,42.79,41.58,42.58,2653034\n1-Feb-11,41.30,42.27,41.19,41.99,2432201\n31-Jan-11,41.10,41.37,40.92,41.32,2784702\n28-Jan-11,41.43,41.75,40.51,41.06,3073669\n27-Jan-11,42.16,43.00,41.26,41.38,3611163\n26-Jan-11,41.14,42.40,41.13,42.19,4529483\n25-Jan-11,41.68,41.80,39.84,40.00,5131621\n24-Jan-11,42.72,42.72,41.94,42.08,2729841\n21-Jan-11,43.47,43.75,42.60,42.76,2052159\n20-Jan-11,45.13,45.15,42.95,43.28,3275578\n19-Jan-11,45.87,46.46,45.21,45.57,1791418\n18-Jan-11,45.65,46.18,45.30,45.73,890750\n14-Jan-11,45.86,45.86,45.86,45.86,0\n13-Jan-11,46.06,46.12,45.36,45.54,1037750\n12-Jan-11,46.66,46.66,45.94,46.06,1296301\n11-Jan-11,46.62,46.76,46.02,46.30,1025413\n10-Jan-11,45.34,46.52,44.84,46.50,1397697\n7-Jan-11,46.20,46.35,45.08,45.71,1682227\n6-Jan-11,46.44,46.71,46.02,46.25,1141682\n5-Jan-11,46.02,46.83,45.75,46.55,980268\n4-Jan-11,46.59,46.77,45.98,46.15,1981378\n3-Jan-11,46.06,46.89,46.05,46.56,1707437\n31-Dec-10,46.24,46.24,45.50,45.65,945369\n30-Dec-10,46.39,46.58,46.19,46.25,747280\n29-Dec-10,46.24,46.76,45.95,46.62,968792\n28-Dec-10,46.21,46.28,45.67,46.07,1077802\n27-Dec-10,46.47,46.57,45.57,46.12,1093639\n23-Dec-10,46.51,46.51,46.51,46.51,0\n22-Dec-10,47.15,47.83,45.27,46.70,5796793\n21-Dec-10,48.01,48.30,47.50,47.88,3522359\n20-Dec-10,48.44,48.48,47.48,47.92,3089423\n17-Dec-10,48.10,48.50,47.80,47.83,4196121\n16-Dec-10,47.28,48.31,47.05,48.19,2546314\n15-Dec-10,47.75,48.09,47.17,47.25,1899146\n14-Dec-10,48.41,48.51,47.54,47.68,2136924\n13-Dec-10,48.42,48.78,48.01,48.45,1702143\n10-Dec-10,47.89,48.49,47.64,48.27,1994320\n9-Dec-10,48.51,48.51,47.51,47.71,2273825\n8-Dec-10,48.28,48.44,47.55,47.99,1821055\n7-Dec-10,48.27,49.00,47.17,47.50,2721134\n6-Dec-10,47.27,47.39,46.71,46.92,1364561\n3-Dec-10,46.59,47.64,46.45,47.45,1825020\n2-Dec-10,46.44,47.07,46.27,46.93,3026391\n1-Dec-10,44.33,46.25,44.21,46.23,3673455\n30-Nov-10,42.59,43.63,42.39,43.50,2324956\n29-Nov-10,43.09,43.17,42.25,43.04,1806684\n26-Nov-10,42.90,43.43,42.76,43.32,887882\n24-Nov-10,43.31,43.31,43.31,43.31,0\n23-Nov-10,42.71,43.31,41.94,42.25,2143623\n22-Nov-10,41.96,42.73,41.69,42.67,1926435\n19-Nov-10,41.95,42.92,41.74,41.87,2202326\n18-Nov-10,41.49,42.22,41.34,41.76,1146804\n17-Nov-10,40.92,41.75,40.47,40.93,2125842\n16-Nov-10,41.03,41.15,40.47,40.91,2364243\n15-Nov-10,42.17,42.51,41.25,41.31,1743013\n12-Nov-10,43.27,43.27,41.80,41.96,2041711\n11-Nov-10,43.27,43.74,42.57,43.57,1628265\n10-Nov-10,42.90,43.79,42.55,43.68,1299116\n9-Nov-10,43.15,43.39,42.73,42.94,1808467\n8-Nov-10,42.97,43.47,42.79,43.01,2088952\n5-Nov-10,43.32,43.48,42.80,43.10,1224317\n4-Nov-10,43.44,43.59,42.88,43.43,1622160\n3-Nov-10,43.38,43.39,42.14,42.98,2149306\n2-Nov-10,42.81,43.47,42.70,43.16,1508850\n1-Nov-10,42.40,42.95,42.12,42.56,1598626\n29-Oct-10,42.24,42.49,41.94,42.26,1533799\n28-Oct-10,42.72,42.73,41.22,42.22,2933577\n27-Oct-10,41.01,42.50,41.00,42.46,3163755\n26-Oct-10,40.76,41.58,40.17,41.27,2820268\n25-Oct-10,40.72,41.33,40.58,41.08,1822710\n22-Oct-10,39.17,40.68,39.03,40.66,2879960\n21-Oct-10,39.13,39.50,38.74,39.15,2130070\n20-Oct-10,38.75,39.22,38.55,38.92,2095915\n19-Oct-10,38.38,39.20,38.00,38.68,3660321\n18-Oct-10,40.03,40.28,39.32,39.82,2521761\n15-Oct-10,39.89,40.51,39.56,40.40,4113011\n14-Oct-10,39.50,39.68,39.05,39.67,1692664\n13-Oct-10,39.44,40.03,39.17,39.41,1711298\n12-Oct-10,38.08,39.35,37.88,39.15,2656890\n11-Oct-10,38.66,39.83,38.30,38.41,2993885\n8-Oct-10,37.99,38.85,37.95,38.67,2371627\n7-Oct-10,38.60,38.75,37.51,38.17,5192940\n6-Oct-10,41.40,41.50,37.33,38.32,10011007\n5-Oct-10,40.94,41.60,40.89,41.50,3582277\n4-Oct-10,41.04,41.20,40.24,40.62,2118702\n1-Oct-10,41.07,41.71,40.95,41.27,2792961\n30-Sep-10,41.37,41.60,40.50,41.00,3015516\n29-Sep-10,41.22,41.28,40.37,41.03,3598312\n28-Sep-10,40.83,41.33,40.16,41.27,3112026\n27-Sep-10,41.20,41.24,40.34,40.82,2869528\n24-Sep-10,40.77,41.74,40.54,41.26,4279616\n23-Sep-10,39.33,41.48,39.33,40.07,13076681\n22-Sep-10,38.30,38.72,36.66,36.75,5705242\n21-Sep-10,38.96,39.04,38.00,38.43,3469438\n20-Sep-10,38.45,39.48,38.36,38.98,3925383\n17-Sep-10,37.72,38.46,37.72,38.34,3992780\n16-Sep-10,38.98,38.99,36.95,37.44,5826188\n15-Sep-10,38.35,38.79,38.01,38.74,2321532\n14-Sep-10,38.39,38.95,38.03,38.60,3278428\n13-Sep-10,37.91,39.08,37.91,38.95,3625948\n10-Sep-10,37.06,37.60,36.98,37.41,1297791\n9-Sep-10,37.51,37.61,36.78,36.98,1229791\n8-Sep-10,37.18,37.53,36.92,37.08,2554007\n7-Sep-10,36.59,37.15,36.49,36.93,2320478\n6-Sep-10,36.98,36.98,36.98,36.98,0\n3-Sep-10,36.98,36.98,36.98,36.98,0\n2-Sep-10,35.79,36.58,35.68,36.54,2531155\n1-Sep-10,35.04,36.44,35.04,35.65,3961955\n31-Aug-10,34.24,34.90,34.22,34.52,2106503\n30-Aug-10,35.04,35.26,34.52,34.52,1677524\n27-Aug-10,34.74,35.27,34.24,35.16,2922733\n26-Aug-10,33.44,34.75,33.44,34.54,6130643\n25-Aug-10,32.64,33.36,32.55,33.25,3178032\n24-Aug-10,32.25,33.13,31.88,33.01,4523952\n23-Aug-10,32.69,33.50,32.56,32.77,3952340\n20-Aug-10,31.14,32.72,31.05,32.54,3822961\n19-Aug-10,31.82,32.10,31.14,31.41,2667945\n18-Aug-10,31.81,31.90,31.38,31.79,1901498\n17-Aug-10,31.28,32.08,31.20,31.88,2418782\n16-Aug-10,30.68,31.06,30.29,31.02,2127146\n13-Aug-10,30.74,31.46,30.62,30.93,1933142\n12-Aug-10,31.36,31.36,30.63,30.85,3695488\n11-Aug-10,32.49,32.49,31.73,31.95,2009967\n10-Aug-10,33.02,33.21,32.59,33.13,2427108\n9-Aug-10,33.63,33.81,33.42,33.49,1675316\n6-Aug-10,32.97,33.64,32.57,33.45,2328929\n5-Aug-10,33.54,33.63,32.97,33.25,2477881\n4-Aug-10,32.06,33.99,32.05,33.83,4461782\n3-Aug-10,32.50,32.53,31.88,32.04,2130080\n2-Aug-10,32.49,32.80,32.37,32.62,2156058\n30-Jul-10,31.69,32.30,31.35,32.15,3120177\n29-Jul-10,32.07,32.23,31.27,32.01,4094604\n28-Jul-10,32.24,32.60,31.65,31.80,2924757\n27-Jul-10,33.57,33.57,32.29,32.40,3265296\n26-Jul-10,33.17,33.64,32.97,33.22,2826794\n23-Jul-10,32.04,33.21,31.87,33.21,5200732\n22-Jul-10,31.98,32.45,31.78,32.34,2400664\n21-Jul-10,32.26,32.50,31.50,31.61,3159463\n20-Jul-10,31.27,32.06,31.06,32.03,2983953\n19-Jul-10,31.75,31.97,31.37,31.82,2031064\n16-Jul-10,32.14,32.35,31.53,31.58,3795995\n15-Jul-10,32.14,32.60,31.93,32.47,4049851\n14-Jul-10,31.66,32.23,31.53,32.22,2877041\n13-Jul-10,31.12,31.86,31.00,31.59,2780382\n12-Jul-10,30.42,31.04,30.37,30.86,1770093\n9-Jul-10,30.60,30.82,30.34,30.64,1197411\n8-Jul-10,30.91,30.99,30.13,30.55,2879034\n7-Jul-10,29.54,30.74,29.45,30.71,2811836\n6-Jul-10,29.41,29.68,29.19,29.44,3423795\n5-Jul-10,28.91,28.91,28.91,28.91,0\n2-Jul-10,28.91,28.91,28.91,28.91,0\n1-Jul-10,28.90,29.39,28.20,29.20,3702545\n30-Jun-10,29.35,29.73,28.82,28.94,2486622\n29-Jun-10,30.24,30.55,29.16,29.39,2894848\n28-Jun-10,31.10,31.34,30.75,30.99,2182777\n25-Jun-10,30.86,31.31,30.48,31.07,3056580\n24-Jun-10,31.19,31.39,30.63,30.78,2922759\n23-Jun-10,31.86,32.52,30.99,31.36,4978625\n22-Jun-10,31.71,31.88,30.81,30.86,3792499\n21-Jun-10,32.25,32.48,31.40,31.58,2066812\n18-Jun-10,32.17,32.32,31.72,31.92,2253358\n17-Jun-10,32.25,32.45,31.76,32.13,2547021\n16-Jun-10,31.90,32.34,31.69,32.23,3568391\n15-Jun-10,31.43,32.08,31.43,32.00,3102382\n14-Jun-10,31.45,31.76,31.17,31.25,3145232\n11-Jun-10,29.56,31.37,29.56,31.35,4083669\n10-Jun-10,29.60,30.09,29.28,30.07,3068291\n9-Jun-10,28.82,29.65,28.65,29.02,2960771\n8-Jun-10,28.11,28.75,27.82,28.70,3679498\n7-Jun-10,28.80,28.97,27.94,27.96,2557092\n4-Jun-10,29.57,29.71,28.50,28.62,2668236\n3-Jun-10,29.01,30.18,28.82,30.07,2837469\n2-Jun-10,28.48,28.97,28.30,28.84,5018930\n1-Jun-10,28.84,29.53,28.43,28.43,3508774\n31-May-10,29.31,29.31,29.31,29.31,0\n28-May-10,29.31,29.31,29.31,29.31,0\n27-May-10,29.52,29.93,29.24,29.93,1726028\n26-May-10,29.08,29.94,28.73,28.92,2823474\n25-May-10,28.47,28.93,28.02,28.92,2422951\n24-May-10,29.18,29.67,28.90,29.22,2076023\n21-May-10,27.71,29.46,27.58,29.22,3733642\n20-May-10,28.57,28.73,27.92,28.26,4529671\n19-May-10,29.85,29.93,28.62,29.36,2715082\n18-May-10,30.74,30.88,29.68,30.05,2131163\n17-May-10,30.45,30.80,29.90,30.52,2128801\n14-May-10,30.50,30.60,30.00,30.40,3850274\n13-May-10,29.98,31.17,29.98,30.76,3859846\n12-May-10,29.45,30.17,29.30,30.12,2474211\n11-May-10,29.20,29.82,29.01,29.33,2638620\n10-May-10,28.74,29.24,28.50,28.90,3135025\n7-May-10,28.13,28.28,26.69,27.49,4536681\n6-May-10,29.34,30.00,26.81,28.20,3453194\n5-May-10,29.39,29.72,29.32,29.51,1832026\n4-May-10,30.22,30.22,29.43,29.70,1877817\n3-May-10,30.06,30.70,30.01,30.60,1332833\n30-Apr-10,30.78,30.83,29.82,29.87,2131914\n29-Apr-10,30.75,30.88,30.55,30.78,1351189\n28-Apr-10,31.00,31.02,30.23,30.62,1596358\n27-Apr-10,31.31,31.63,30.66,30.75,2358835\n26-Apr-10,31.48,31.70,31.30,31.54,1648382\n23-Apr-10,30.98,31.47,30.93,31.46,1432289\n22-Apr-10,30.84,31.35,30.30,31.29,1966508\n21-Apr-10,31.16,31.22,30.73,31.10,1684551\n20-Apr-10,30.85,31.20,30.81,31.03,2411313\n19-Apr-10,30.89,31.22,30.25,30.70,2440036\n16-Apr-10,31.49,31.67,30.93,31.10,3397950\n15-Apr-10,31.95,32.11,31.49,31.67,3573498\n14-Apr-10,32.00,32.19,31.78,32.09,4067827\n13-Apr-10,30.96,31.25,30.82,31.16,2674290\n12-Apr-10,30.77,31.00,30.57,30.81,2169531\n9-Apr-10,30.47,30.84,30.28,30.81,2243656\n8-Apr-10,30.17,30.50,30.00,30.48,3204345\n7-Apr-10,30.28,30.43,30.07,30.34,2964363\n6-Apr-10,30.12,30.72,30.08,30.39,2581447\n5-Apr-10,29.94,30.39,29.94,30.36,3186006\n2-Apr-10,29.94,29.94,29.94,29.94,0\n1-Apr-10,29.94,29.94,29.94,29.94,0\n31-Mar-10,28.89,29.45,28.85,29.27,4173892\n30-Mar-10,28.24,29.07,27.90,28.93,6204989\n29-Mar-10,28.50,28.61,28.15,28.16,3461970\n26-Mar-10,28.84,28.99,28.20,28.39,5293221\n25-Mar-10,29.99,30.02,28.45,28.90,13764879\n24-Mar-10,30.29,31.14,30.10,30.70,6900892\n23-Mar-10,30.00,30.38,29.66,30.17,3802206\n22-Mar-10,29.95,30.20,29.87,30.00,3730828\n19-Mar-10,30.20,30.34,29.80,29.97,2982607\n18-Mar-10,30.62,30.69,30.12,30.20,2701756\n17-Mar-10,30.72,30.86,30.49,30.72,1877240\n16-Mar-10,30.73,30.92,30.47,30.61,1883760\n15-Mar-10,30.65,30.78,30.45,30.76,1421234\n12-Mar-10,30.72,30.90,30.57,30.76,1950268\n11-Mar-10,30.36,30.64,30.17,30.62,2179772\n10-Mar-10,30.13,30.42,30.08,30.36,1413260\n9-Mar-10,29.90,30.45,29.76,30.21,1351954\n8-Mar-10,30.15,30.24,29.83,30.01,2377991\n5-Mar-10,30.00,30.72,29.86,30.27,2864055\n4-Mar-10,29.37,30.02,29.28,29.88,2269713\n3-Mar-10,28.87,29.74,28.80,29.35,2214760\n2-Mar-10,28.81,28.97,28.62,28.75,1261833\n1-Mar-10,28.16,28.82,28.01,28.63,1377774\n26-Feb-10,28.11,28.31,27.82,28.05,1119007\n25-Feb-10,27.89,28.21,27.36,28.14,1717975\n24-Feb-10,28.16,28.53,28.01,28.28,1290877\n23-Feb-10,28.99,29.00,27.92,27.99,2747081\n22-Feb-10,29.28,29.28,28.85,29.01,1553707\n19-Feb-10,28.95,29.56,28.93,29.12,1734814\n18-Feb-10,28.79,29.22,28.66,29.18,1217366\n17-Feb-10,28.67,28.85,28.47,28.78,1483014\n16-Feb-10,28.14,28.64,28.11,28.54,1661398\n15-Feb-10,27.86,27.86,27.86,27.86,0\n12-Feb-10,27.86,27.86,27.86,27.86,0\n11-Feb-10,27.64,28.10,27.00,28.03,2094879\n10-Feb-10,27.36,27.49,27.00,27.19,1097421\n9-Feb-10,27.50,27.81,27.01,27.41,1691699\n8-Feb-10,27.20,27.74,26.99,27.19,1461067\n5-Feb-10,26.88,27.31,26.51,27.24,1926230\n4-Feb-10,28.07,28.10,26.92,27.00,2183540\n3-Feb-10,28.30,28.75,28.18,28.44,1140367\n2-Feb-10,28.32,28.70,28.15,28.48,2565145\n1-Feb-10,27.21,28.35,26.87,28.33,3926032\n29-Jan-10,27.40,27.74,27.10,27.22,2412687\n28-Jan-10,27.87,27.96,26.94,27.36,1738437\n27-Jan-10,28.05,28.24,27.41,27.97,2570347\n26-Jan-10,27.77,28.74,27.74,28.15,2930999\n25-Jan-10,27.94,28.06,27.39,27.69,2164697\n22-Jan-10,29.02,29.11,27.63,27.73,2944012\n21-Jan-10,29.17,29.94,28.95,29.06,3001708\n20-Jan-10,29.40,29.48,28.80,29.16,1949868\n19-Jan-10,28.93,29.69,28.86,29.61,1979595\n18-Jan-10,29.08,29.08,29.08,29.08,0\n15-Jan-10,29.08,29.08,29.08,29.08,0\n14-Jan-10,29.61,30.00,29.44,29.77,2076706\n13-Jan-10,29.16,29.75,28.56,29.49,2834099\n12-Jan-10,29.51,29.64,28.72,29.09,2971405\n11-Jan-10,30.15,30.24,29.56,29.74,2429204\n8-Jan-10,30.42,30.42,29.92,30.14,2764424\n7-Jan-10,30.98,31.00,30.34,30.39,1899957\n6-Jan-10,30.95,31.42,30.78,30.97,2164140\n5-Jan-10,31.17,31.35,30.77,30.97,2116686\n4-Jan-10,31.23,31.50,31.03,31.12,2061341\n1-Jan-10,30.90,30.90,30.90,30.90,0\n31-Dec-09,30.90,30.90,30.90,30.90,0\n30-Dec-09,30.87,31.40,30.79,31.26,1239609\n29-Dec-09,30.97,31.14,30.79,31.00,1179429\n28-Dec-09,31.33,31.33,30.61,30.97,2270428\n25-Dec-09,31.36,31.36,31.36,31.36,0\n24-Dec-09,31.45,31.49,31.16,31.36,747977\n23-Dec-09,31.62,31.76,30.95,31.43,5003891\n22-Dec-09,29.93,30.00,29.57,29.87,3206511\n21-Dec-09,29.50,30.00,29.29,29.74,2206529\n18-Dec-09,29.14,29.68,29.08,29.27,3489404\n17-Dec-09,28.58,29.07,28.58,28.94,2092466\n16-Dec-09,29.13,29.49,28.76,28.88,2558717\n15-Dec-09,29.28,29.38,28.76,29.13,1820468\n14-Dec-09,28.48,29.44,28.33,29.30,2625673\n11-Dec-09,27.72,28.38,27.72,28.22,1800035\n10-Dec-09,27.30,27.80,27.25,27.66,1851440\n9-Dec-09,27.63,27.64,26.98,27.13,2376731\n8-Dec-09,28.02,28.14,27.50,27.73,839955\n7-Dec-09,27.99,28.44,27.76,28.13,1343335\n4-Dec-09,28.01,28.27,27.57,27.91,1369775\n3-Dec-09,27.68,28.15,27.57,27.62,1109639\n2-Dec-09,27.61,28.03,27.57,27.71,1685768\n1-Dec-09,26.81,27.64,26.81,27.45,2019043\n30-Nov-09,26.79,26.79,25.92,26.70,2368864\n27-Nov-09,27.12,27.17,26.65,26.80,757763\n26-Nov-09,27.62,27.62,27.62,27.62,0\n25-Nov-09,27.56,27.69,27.35,27.62,1213422\n24-Nov-09,27.55,27.85,27.36,27.50,1208031\n23-Nov-09,27.30,27.82,27.30,27.60,1942624\n20-Nov-09,27.71,27.78,26.87,27.09,2018033\n19-Nov-09,28.18,28.29,27.58,27.87,1098149\n18-Nov-09,28.64,28.68,28.20,28.36,1219646\n17-Nov-09,28.55,28.87,28.47,28.65,1410814\n16-Nov-09,28.39,28.80,28.27,28.61,1811190\n13-Nov-09,27.98,28.28,27.75,28.18,1904411\n12-Nov-09,27.93,28.08,27.80,27.97,2609785\n11-Nov-09,27.65,28.08,27.53,27.85,1582981\n10-Nov-09,27.00,27.65,27.00,27.56,1259382\n9-Nov-09,27.06,27.44,26.85,27.27,2693798\n6-Nov-09,27.35,27.85,27.25,27.59,1424067\n5-Nov-09,27.42,27.64,27.21,27.56,1497316\n4-Nov-09,26.67,27.62,26.42,27.08,2876754\n3-Nov-09,25.59,26.45,25.45,26.38,1832922\n2-Nov-09,25.80,26.25,25.50,25.76,1988869\n30-Oct-09,26.65,26.75,25.78,25.81,1704526\n29-Oct-09,26.09,26.77,25.99,26.65,1527034\n28-Oct-09,27.18,27.18,25.95,26.05,2089473\n27-Oct-09,27.74,27.89,26.87,27.24,2121866\n26-Oct-09,27.81,28.60,27.57,27.70,2668010\n23-Oct-09,28.03,28.03,27.32,27.49,2516053\n22-Oct-09,27.36,27.79,27.22,27.75,2488031\n21-Oct-09,27.70,28.00,27.38,27.44,1656611\n20-Oct-09,28.66,28.68,27.58,27.75,2012531\n19-Oct-09,28.61,28.87,28.06,28.46,1643205\n16-Oct-09,28.65,28.74,28.18,28.63,2149560\n15-Oct-09,28.42,28.94,28.36,28.84,2306367\n14-Oct-09,28.27,28.64,27.90,28.64,3335602\n13-Oct-09,27.93,28.11,27.65,28.02,2022504\n12-Oct-09,28.27,28.42,27.53,27.86,1599167\n9-Oct-09,27.50,28.21,27.50,28.16,2164712\n8-Oct-09,27.98,27.98,27.53,27.60,1852876\n7-Oct-09,27.96,27.96,27.47,27.91,1319059\n6-Oct-09,27.87,28.07,27.30,27.96,2545874\n5-Oct-09,26.95,27.71,26.70,27.62,3404903\n2-Oct-09,26.61,27.24,26.52,26.73,3994868\n1-Oct-09,27.60,28.38,26.91,26.97,6175100\n30-Sep-09,27.94,27.99,27.28,27.64,3923114\n29-Sep-09,27.75,27.99,27.48,27.74,3207767\n28-Sep-09,27.75,27.99,27.38,27.85,3732805\n25-Sep-09,27.62,28.35,27.43,27.80,3616519\n24-Sep-09,27.06,28.68,27.06,27.95,12486165\n23-Sep-09,25.57,25.70,24.78,24.88,3232807\n22-Sep-09,25.82,25.95,25.12,25.40,2560325\n21-Sep-09,25.74,26.32,25.57,25.72,1793754\n18-Sep-09,25.55,26.06,25.38,25.84,2582432\n17-Sep-09,25.04,25.59,24.92,25.46,1925329\n16-Sep-09,25.03,25.29,24.73,25.19,1810489\n15-Sep-09,25.35,25.38,24.80,24.98,2210535\n14-Sep-09,25.10,25.39,25.06,25.35,1505881\n11-Sep-09,25.42,25.65,25.13,25.39,1751690\n10-Sep-09,24.85,25.64,24.84,25.48,2746541\n9-Sep-09,24.82,25.00,24.65,24.97,2898243\n8-Sep-09,24.30,24.89,24.26,24.83,3792217\n4-Sep-09,23.10,23.89,23.07,23.63,3200918\n3-Sep-09,22.78,23.13,22.52,23.11,2029910\n2-Sep-09,22.67,22.84,22.19,22.76,2093503\n1-Sep-09,22.90,23.25,22.23,22.60,2384706\n31-Aug-09,22.70,23.23,22.52,22.96,2155020\n28-Aug-09,22.84,23.25,22.59,22.90,1896545\n27-Aug-09,22.41,22.69,22.25,22.69,1194037\n26-Aug-09,22.35,22.58,22.15,22.42,1178684\n25-Aug-09,22.45,22.52,22.09,22.37,1178883\n24-Aug-09,22.35,22.44,22.05,22.27,1045028\n21-Aug-09,22.12,22.55,21.84,22.28,1327853\n20-Aug-09,21.26,21.98,21.11,21.94,2235443\n19-Aug-09,20.67,21.33,20.58,21.23,1614277\n18-Aug-09,20.99,21.08,20.76,20.84,1417243\n17-Aug-09,21.14,21.39,20.85,20.91,1413632\n14-Aug-09,22.22,22.31,21.51,21.62,1727574\n13-Aug-09,22.30,22.50,22.03,22.37,1270217\n12-Aug-09,21.57,22.42,21.54,22.18,1943655\n10-Aug-09,21.79,22.07,21.65,22.03,1679539\n7-Aug-09,22.18,22.30,21.72,21.84,1778366\n6-Aug-09,22.37,22.50,21.78,21.93,1938834\n5-Aug-09,22.29,22.51,21.93,22.28,1822429\n4-Aug-09,22.14,22.37,22.05,22.28,2534512\n3-Aug-09,22.77,22.79,22.24,22.30,3054823\n31-Jul-09,22.52,22.96,22.52,22.83,2693775\n30-Jul-09,22.78,22.99,22.50,22.58,2879346\n29-Jul-09,22.41,22.54,22.18,22.52,2162398\n28-Jul-09,22.58,22.69,22.24,22.63,3305702\n27-Jul-09,22.91,23.00,22.43,22.71,4334737\n24-Jul-09,23.04,23.72,22.54,23.00,44501298\n23-Jul-09,22.44,23.48,22.35,23.24,4885037\n22-Jul-09,22.23,22.95,22.15,22.87,3427222\n21-Jul-09,22.25,22.43,22.02,22.43,3478030\n20-Jul-09,21.98,22.91,21.80,22.32,10006764\n17-Jul-09,20.75,20.98,20.53,20.60,1723506\n16-Jul-09,20.42,20.92,20.22,20.86,1990072\n15-Jul-09,19.71,20.52,19.66,20.48,1646051\n14-Jul-09,19.40,19.56,19.27,19.52,1051263\n13-Jul-09,19.11,19.37,18.79,19.29,1862876\n10-Jul-09,19.12,19.38,19.00,19.20,1007252\n9-Jul-09,19.06,19.55,19.04,19.35,1167753\n8-Jul-09,19.20,19.28,18.69,19.05,2355032\n7-Jul-09,19.60,19.66,18.97,19.04,1581887\n6-Jul-09,20.15,20.21,19.41,19.66,2614769\n3-Jul-09,20.42,20.42,20.42,20.42,0\n2-Jul-09,20.42,20.50,20.00,20.42,1311832\n1-Jul-09,20.15,20.86,20.03,20.63,2470910\n30-Jun-09,20.18,20.25,19.84,20.13,3627709\n29-Jun-09,20.06,20.43,19.66,19.99,3136979\n26-Jun-09,19.00,20.06,18.85,19.87,2781884\n25-Jun-09,18.15,19.32,18.11,19.29,8124734\n24-Jun-09,19.71,20.25,19.49,20.13,3534485\n23-Jun-09,18.84,19.64,18.51,19.63,3649815\n22-Jun-09,19.79,19.79,18.77,18.83,2274863\n19-Jun-09,20.23,20.42,19.68,19.99,2858239\n18-Jun-09,20.19,20.30,19.88,20.23,1852973\n17-Jun-09,20.21,20.41,19.60,20.13,2177500\n16-Jun-09,21.09,21.09,20.14,20.17,2573360\n15-Jun-09,20.58,20.84,20.12,20.59,2511589\n12-Jun-09,20.99,20.99,20.22,20.79,1673135\n11-Jun-09,20.19,20.65,20.13,20.52,1490314\n10-Jun-09,20.49,20.73,19.94,20.26,1501834\n9-Jun-09,19.86,20.65,19.85,20.50,2475621\n8-Jun-09,19.80,20.03,19.31,19.84,1826081\n5-Jun-09,20.40,20.62,19.75,19.92,2696727\n4-Jun-09,19.84,20.20,19.72,20.03,1844994\n3-Jun-09,20.49,20.59,19.63,19.88,3058833\n2-Jun-09,20.73,20.99,20.47,20.56,2604857\n1-Jun-09,20.11,20.84,19.78,20.77,2807377\n29-May-09,19.82,20.11,19.40,19.95,6556965\n28-May-09,19.67,20.18,19.51,19.98,2904110\n27-May-09,19.90,20.39,19.65,19.74,2751535\n26-May-09,19.25,19.99,19.01,19.73,3311717\n25-May-09,19.41,19.41,19.41,19.41,0\n22-May-09,19.20,19.55,18.69,19.41,1833264\n21-May-09,18.82,19.38,18.61,18.99,3835819\n20-May-09,19.36,19.60,18.75,18.93,3166332\n19-May-09,19.55,19.95,19.27,19.36,3635761\n18-May-09,20.04,20.04,18.85,19.62,3568695\n15-May-09,18.29,20.10,18.28,19.86,6436485\n14-May-09,17.54,18.25,17.54,18.12,2271642\n13-May-09,17.54,17.84,17.44,17.61,2289135\n12-May-09,18.14,18.22,17.42,17.94,1953933\n11-May-09,17.32,18.29,17.10,18.07,2089664\n8-May-09,17.64,17.93,17.28,17.60,1561476\n7-May-09,18.08,18.10,17.36,17.57,1658689\n6-May-09,18.30,18.30,17.54,18.07,2022153\n5-May-09,17.80,18.20,17.50,18.16,1880195\n4-May-09,18.00,18.30,17.60,17.94,2778654\n1-May-09,17.31,17.32,16.65,17.12,2866815\n30-Apr-09,18.02,18.05,17.06,17.27,2939061\n29-Apr-09,17.47,17.88,17.39,17.77,1876299\n28-Apr-09,17.60,17.75,17.26,17.35,1834293\n27-Apr-09,17.98,18.25,17.71,17.90,2055403\n24-Apr-09,18.14,18.33,17.73,18.16,2918776\n23-Apr-09,18.40,18.71,17.55,17.96,3335567\n22-Apr-09,17.38,18.90,17.06,18.37,5092751\n21-Apr-09,17.22,17.58,17.11,17.57,1714099\n20-Apr-09,17.88,17.91,17.17,17.33,2414279\n17-Apr-09,18.19,18.48,18.06,18.32,1251855\n16-Apr-09,17.85,18.45,17.85,18.28,2470033\n15-Apr-09,18.20,18.30,17.54,17.82,1968134\n14-Apr-09,18.69,18.80,18.13,18.22,1579988\n13-Apr-09,18.99,19.16,18.35,18.82,1605337\n10-Apr-09,19.00,19.00,19.00,19.00,0\n9-Apr-09,18.78,19.02,18.42,19.00,1817143\n8-Apr-09,18.15,18.60,17.99,18.50,1538489\n7-Apr-09,17.93,18.40,17.81,18.12,1836696\n6-Apr-09,18.47,18.55,17.78,18.41,3230288\n3-Apr-09,17.80,18.78,17.80,18.62,2922649\n2-Apr-09,17.93,18.20,17.78,17.88,4887170\n1-Apr-09,17.76,18.07,17.44,17.68,5338977\n31-Mar-09,17.98,18.43,17.55,17.84,4751675\n30-Mar-09,16.90,17.83,16.47,17.81,4473719\n27-Mar-09,17.18,17.70,16.95,16.99,4094065\n26-Mar-09,16.73,17.80,16.40,17.60,10206863\n25-Mar-09,15.31,15.69,14.43,15.00,5403710\n24-Mar-09,16.25,16.25,15.14,15.27,5130489\n23-Mar-09,15.29,17.73,14.96,16.37,9783417\n20-Mar-09,15.51,15.65,14.89,14.89,1372908\n19-Mar-09,15.88,15.99,15.59,15.65,1120428\n18-Mar-09,15.63,15.99,15.26,15.76,2743946\n17-Mar-09,14.85,15.64,14.76,15.64,1434216\n16-Mar-09,15.12,15.38,14.74,14.79,1583138\n13-Mar-09,15.34,15.48,14.85,15.07,2539768\n12-Mar-09,14.76,15.57,14.61,15.21,2397343\n11-Mar-09,14.35,15.10,14.27,14.92,2158747\n10-Mar-09,13.34,14.31,13.29,14.29,2173092\n9-Mar-09,13.28,13.76,13.10,13.20,1551503\n6-Mar-09,13.75,13.98,12.98,13.43,2558096\n5-Mar-09,14.24,14.45,13.67,13.69,1956182\n4-Mar-09,13.92,14.63,13.81,14.42,2795274\n3-Mar-09,13.61,14.04,13.41,13.74,3079350\n2-Mar-09,13.50,13.84,13.29,13.53,2890797\n27-Feb-09,13.77,14.18,13.35,13.69,3433772\n26-Feb-09,14.44,14.50,13.92,13.95,2383202\n25-Feb-09,14.66,14.66,13.98,14.19,2600240\n24-Feb-09,13.97,14.69,13.70,14.54,2454955\n23-Feb-09,14.31,14.54,13.89,13.95,2079123\n20-Feb-09,13.90,14.41,13.72,14.33,3313720\n19-Feb-09,14.41,14.41,13.97,14.08,2309543\n18-Feb-09,14.41,14.57,13.99,14.04,2232367\n17-Feb-09,15.05,15.05,14.36,14.42,1999065\n13-Feb-09,15.47,15.74,15.23,15.29,1513307\n12-Feb-09,15.36,15.56,14.69,15.47,2269237\n11-Feb-09,16.10,16.10,15.28,15.31,2889962\n10-Feb-09,15.60,16.25,15.59,15.80,2741047\n9-Feb-09,16.04,16.45,15.83,15.90,2574911\n6-Feb-09,15.62,16.30,15.49,16.19,1876835\n5-Feb-09,15.21,15.84,15.10,15.66,1959420\n4-Feb-09,15.32,15.65,15.20,15.34,3239205\n3-Feb-09,14.87,15.42,14.63,15.37,3683771\n2-Feb-09,14.26,14.94,14.20,14.87,1958029\n30-Jan-09,14.77,15.08,14.50,14.65,1885129\n29-Jan-09,15.18,15.21,14.68,14.75,1521654\n28-Jan-09,15.07,15.64,14.85,15.31,2372764\n27-Jan-09,14.79,15.11,14.66,14.90,3022740\n26-Jan-09,14.30,14.78,14.30,14.62,2530971\n23-Jan-09,13.82,14.35,13.41,14.28,2466119\n22-Jan-09,13.80,14.22,13.44,14.00,2562976\n21-Jan-09,13.81,14.03,13.53,13.95,2783016\n20-Jan-09,14.78,14.78,13.52,13.52,2373182\n16-Jan-09,15.00,15.00,14.09,14.82,3272627\n15-Jan-09,14.52,14.80,13.90,14.75,3855243\n14-Jan-09,15.11,15.41,14.32,14.66,3554183\n13-Jan-09,15.50,15.81,15.03,15.54,3690717\n12-Jan-09,15.30,15.97,15.30,15.50,3641238\n9-Jan-09,14.61,15.57,14.14,15.46,3331406\n8-Jan-09,14.69,14.87,14.40,14.66,1581767\n7-Jan-09,15.54,15.54,14.75,14.92,2773764\n6-Jan-09,14.16,16.13,14.16,15.69,3193940\n5-Jan-09,13.97,14.30,13.72,14.14,1735059\n2-Jan-09,13.06,14.07,13.06,13.99,1500312\n1-Jan-09,13.22,13.22,13.22,13.22,0\n31-Dec-08,13.20,13.43,13.05,13.22,2343754\n30-Dec-08,12.86,13.24,12.75,13.19,1439747\n29-Dec-08,13.21,13.21,12.85,12.99,1769586\n26-Dec-08,13.12,13.19,12.84,13.13,752454\n25-Dec-08,13.00,13.00,13.00,13.00,0\n24-Dec-08,13.14,13.24,12.84,13.00,885039\n23-Dec-08,13.60,13.99,12.75,12.99,6443651\n22-Dec-08,12.49,12.56,11.62,11.97,2042157\n19-Dec-08,11.73,12.60,11.60,12.37,2205508\n18-Dec-08,12.50,12.50,11.54,11.84,1421575\n17-Dec-08,12.17,12.78,11.94,12.44,2145192\n16-Dec-08,11.18,12.30,11.14,12.21,2391949\n15-Dec-08,11.55,11.63,10.95,11.14,1906114\n12-Dec-08,11.24,11.69,10.98,11.65,1538992\n11-Dec-08,11.63,12.28,11.22,11.38,1309187\n10-Dec-08,12.33,12.35,11.70,11.91,2250822\n9-Dec-08,12.43,13.00,12.00,12.36,2153029\n8-Dec-08,12.23,12.91,12.08,12.43,2135943\n5-Dec-08,10.78,12.24,10.78,12.18,2888424\n4-Dec-08,10.78,11.68,10.62,10.93,5189881\n3-Dec-08,9.02,10.53,8.83,10.46,3508522\n2-Dec-08,8.84,9.41,8.30,9.38,6114991\n1-Dec-08,8.99,9.04,8.50,8.58,3220058\n28-Nov-08,9.56,9.56,9.01,9.25,1404218\n27-Nov-08,9.48,9.48,9.48,9.48,0\n26-Nov-08,8.94,9.79,8.83,9.48,4120782\n25-Nov-08,9.81,10.00,9.13,9.25,3413730\n24-Nov-08,8.74,10.98,8.45,9.84,5542935\n21-Nov-08,8.16,8.59,7.50,8.56,5462566\n20-Nov-08,8.75,8.97,7.75,7.89,4750281\n19-Nov-08,9.67,9.93,8.91,8.92,3125379\n18-Nov-08,10.24,10.25,9.53,9.89,2776841\n17-Nov-08,10.54,11.00,10.08,10.16,2676294\n14-Nov-08,11.47,11.47,10.49,10.49,2253553\n13-Nov-08,10.98,11.67,10.00,11.60,2922990\n12-Nov-08,11.26,11.70,10.75,10.91,2130133\n11-Nov-08,12.04,12.10,11.56,11.61,2486425\n10-Nov-08,12.94,13.00,12.09,12.20,1383093\n7-Nov-08,12.57,13.15,12.33,12.82,1325200\n6-Nov-08,13.30,13.54,12.47,12.57,1332600\n5-Nov-08,13.88,14.29,13.57,13.59,984500\n4-Nov-08,14.05,14.29,13.63,14.21,2066300\n3-Nov-08,13.41,13.84,13.21,13.73,1316600\n31-Oct-08,12.29,13.55,12.24,13.31,2093400\n30-Oct-08,12.06,12.52,11.96,12.42,1348500\n29-Oct-08,11.58,12.38,11.16,11.96,1737800\n28-Oct-08,10.92,11.58,10.57,11.58,1948300\n27-Oct-08,11.45,11.45,10.57,10.57,1715200\n24-Oct-08,10.91,11.79,10.72,11.37,1160700\n23-Oct-08,12.17,12.33,11.32,11.77,1315800\n22-Oct-08,12.90,12.90,11.89,12.28,1643500\n21-Oct-08,14.00,14.07,12.92,12.94,1326900\n20-Oct-08,13.04,14.23,13.03,14.15,2028500\n17-Oct-08,12.44,13.32,12.16,12.97,2264900\n16-Oct-08,12.39,12.68,11.34,12.54,2166500\n15-Oct-08,13.42,13.53,12.20,12.38,1667800\n14-Oct-08,15.06,15.43,13.20,13.35,3631500\n13-Oct-08,13.21,14.77,13.21,14.77,3330500\n10-Oct-08,13.10,13.76,12.41,12.80,4247500\n9-Oct-08,14.61,15.00,13.09,13.55,2971200\n8-Oct-08,13.18,14.89,12.51,14.65,3728400\n7-Oct-08,14.48,14.67,13.44,13.47,2843500\n6-Oct-08,14.49,14.67,13.57,14.49,3488100\n3-Oct-08,15.49,15.67,14.65,14.65,2045500\n2-Oct-08,15.60,15.93,15.27,15.29,3102800\n1-Oct-08,14.91,15.68,14.89,15.59,3066200\n30-Sep-08,15.38,15.83,14.74,15.07,4818300\n29-Sep-08,16.17,16.17,15.05,15.33,2752600\n26-Sep-08,16.04,16.48,15.49,16.41,5663400\n25-Sep-08,16.85,17.35,16.37,16.37,6130900\n24-Sep-08,17.84,18.08,17.35,17.90,3825300\n23-Sep-08,17.87,18.22,17.50,17.95,2729800\n22-Sep-08,18.55,18.57,17.79,17.85,1121500\n19-Sep-08,18.88,21.62,18.15,18.55,5716500\n18-Sep-08,17.33,18.19,17.30,18.16,3816000\n17-Sep-08,17.90,18.04,17.20,17.26,3337300\n16-Sep-08,17.70,18.21,17.50,18.12,2935800\n15-Sep-08,17.99,18.27,17.80,17.83,2477800\n12-Sep-08,18.30,18.51,18.25,18.42,3940600\n11-Sep-08,18.63,18.65,18.30,18.45,2204700\n10-Sep-08,18.71,18.95,18.69,18.79,1278400\n9-Sep-08,19.24,19.31,18.63,18.75,3024700\n8-Sep-08,19.57,19.57,18.62,19.27,3058700\n5-Sep-08,19.72,19.84,18.90,19.01,4497600\n4-Sep-08,20.28,20.48,19.83,19.93,2254900\n3-Sep-08,20.73,21.00,20.38,20.44,1326000\n2-Sep-08,21.10,21.20,20.66,20.85,1534700\n29-Aug-08,20.70,21.09,20.61,21.00,1179500\n28-Aug-08,20.72,20.95,20.63,20.88,1203000\n27-Aug-08,20.86,21.01,20.67,20.78,1981800\n26-Aug-08,21.18,21.42,20.75,20.88,1639600\n25-Aug-08,21.54,21.82,21.23,21.29,1059000\n22-Aug-08,21.70,21.93,21.50,21.72,1162300\n21-Aug-08,21.78,21.83,21.42,21.60,1725400\n20-Aug-08,22.27,22.53,21.72,21.94,3051900\n19-Aug-08,22.40,22.68,22.27,22.33,1072000\n18-Aug-08,22.76,22.78,22.29,22.59,1144800\n15-Aug-08,23.00,23.05,22.68,22.75,959700\n14-Aug-08,23.02,23.11,22.82,22.97,1609400\n13-Aug-08,23.08,23.33,22.81,23.00,2309200\n12-Aug-08,23.04,23.38,22.96,23.23,2186400\n11-Aug-08,22.95,23.31,22.77,23.11,2114800\n8-Aug-08,22.45,23.00,22.45,22.88,2385300\n7-Aug-08,21.75,22.79,21.75,22.59,3454300\n6-Aug-08,21.52,22.10,21.14,22.00,1683700\n5-Aug-08,21.51,21.67,21.38,21.55,1088200\n4-Aug-08,21.34,21.60,20.96,21.44,1106400\n1-Aug-08,21.50,21.59,20.98,21.23,795400\n31-Jul-08,21.69,21.83,21.26,21.38,1414000\n30-Jul-08,21.46,21.60,21.25,21.57,949400\n29-Jul-08,20.92,21.44,20.87,21.33,927100\n28-Jul-08,20.80,21.29,20.60,20.74,2338800\n25-Jul-08,20.76,21.12,20.52,21.06,1154200\n24-Jul-08,21.40,21.40,20.70,20.76,1445400\n23-Jul-08,21.13,21.66,21.09,21.43,1552700\n22-Jul-08,20.61,21.34,20.59,21.23,1134600\n21-Jul-08,21.23,21.43,20.85,20.96,1141600\n18-Jul-08,20.40,21.34,20.40,21.19,1742400\n17-Jul-08,20.36,20.98,20.30,20.86,1236900\n16-Jul-08,20.12,20.53,20.02,20.42,1721000\n15-Jul-08,19.12,20.49,19.00,20.21,4088600\n14-Jul-08,19.78,19.89,19.27,19.36,1725100\n11-Jul-08,19.61,19.99,19.43,19.72,2033700\n10-Jul-08,20.37,20.57,19.57,19.83,2526000\n9-Jul-08,20.71,21.22,20.29,20.37,2241100\n8-Jul-08,20.45,20.70,20.04,20.64,2109100\n7-Jul-08,21.04,21.19,20.33,20.53,2181100\n3-Jul-08,21.09,21.13,20.55,21.04,1327600\n2-Jul-08,20.97,21.74,20.84,21.05,4820000\n1-Jul-08,20.44,21.03,20.03,20.96,4628200\n30-Jun-08,21.18,21.18,20.65,20.69,2253200\n27-Jun-08,21.46,21.50,20.92,21.17,3879200\n26-Jun-08,21.44,21.66,20.85,21.51,7582300\n25-Jun-08,21.62,22.64,21.46,22.30,4651200\n24-Jun-08,21.76,21.87,21.36,21.49,1709900\n23-Jun-08,22.52,22.52,21.57,21.75,2267500\n20-Jun-08,22.66,22.71,22.15,22.24,2030200\n19-Jun-08,21.92,23.01,21.92,22.84,2637100\n18-Jun-08,22.47,22.49,22.00,22.03,1741900\n17-Jun-08,22.65,22.72,22.35,22.48,1792200\n16-Jun-08,22.08,22.58,22.02,22.41,1341100\n13-Jun-08,22.31,22.68,22.16,22.25,1766500\n12-Jun-08,22.23,22.61,22.06,22.18,1792200\n11-Jun-08,22.82,23.11,22.00,22.10,3425900\n10-Jun-08,22.16,23.24,22.16,23.10,4077200\n9-Jun-08,22.70,22.87,22.28,22.48,3414700\n6-Jun-08,22.84,23.15,22.74,22.76,2836300\n5-Jun-08,22.78,23.21,22.75,23.15,3010900\n4-Jun-08,23.30,23.30,22.67,22.72,4255400\n3-Jun-08,24.24,24.24,23.04,23.32,7010100\n2-Jun-08,24.39,24.84,24.11,24.12,2811400\n30-May-08,24.10,24.42,24.07,24.36,3606600\n29-May-08,24.24,24.42,23.96,24.11,3135000\n28-May-08,24.00,24.20,23.74,24.15,1930200\n27-May-08,23.57,23.96,23.39,23.85,1872400\n23-May-08,23.31,23.61,23.20,23.50,1959200\n22-May-08,23.27,23.48,23.14,23.42,1638900\n21-May-08,23.46,23.63,22.75,23.42,3556100\n20-May-08,23.43,23.67,23.06,23.58,2797800\n19-May-08,22.84,23.64,22.76,23.49,4354000\n16-May-08,23.00,23.00,22.33,22.63,2242400\n15-May-08,22.41,23.06,22.29,22.96,1670000\n14-May-08,22.10,22.82,22.06,22.42,1594600\n13-May-08,22.04,22.14,21.76,22.10,948700\n12-May-08,21.88,22.05,21.65,21.98,1390500\n9-May-08,21.75,22.10,21.57,21.86,1179100\n8-May-08,22.01,22.10,21.62,21.96,2593900\n7-May-08,22.39,22.39,21.72,21.84,2089400\n6-May-08,21.61,22.31,21.40,22.31,2771400\n5-May-08,21.20,21.81,21.20,21.75,2566300\n2-May-08,21.25,21.50,21.03,21.21,1025200\n1-May-08,20.41,21.25,20.41,21.20,1640300\n30-Apr-08,21.10,21.14,20.49,20.57,1694600\n29-Apr-08,20.52,21.14,20.52,21.11,1726600\n28-Apr-08,20.59,20.87,20.47,20.66,1031100\n25-Apr-08,20.53,20.70,20.23,20.61,1089500\n24-Apr-08,20.21,20.80,20.10,20.61,1403000\n23-Apr-08,19.84,20.70,19.77,20.35,1681400\n22-Apr-08,19.61,19.87,19.43,19.85,1906800\n21-Apr-08,19.68,19.69,19.14,19.52,1300900\n18-Apr-08,19.86,20.00,19.67,19.69,1433900\n17-Apr-08,19.22,19.68,19.15,19.63,1141300\n16-Apr-08,19.02,19.46,18.94,19.36,1437500\n15-Apr-08,19.18,19.24,18.76,18.96,1655800\n14-Apr-08,19.40,19.65,19.14,19.17,1263900\n11-Apr-08,19.62,19.83,19.15,19.34,1169600\n10-Apr-08,19.72,20.00,19.70,19.97,1530700\n9-Apr-08,20.12,20.38,19.57,19.81,3019800\n8-Apr-08,20.12,20.59,19.90,20.28,1437700\n7-Apr-08,20.27,20.45,20.04,20.14,1536900\n4-Apr-08,20.13,20.47,19.87,20.32,1302800\n3-Apr-08,20.29,20.60,20.02,20.20,2118500\n2-Apr-08,19.98,20.76,19.86,20.22,4169200\n1-Apr-08,18.54,20.10,18.37,20.04,4913500\n31-Mar-08,18.34,18.66,17.97,18.39,2669300\n28-Mar-08,18.48,18.93,18.00,18.49,5141600\n27-Mar-08,18.13,18.13,17.50,17.53,2512200\n26-Mar-08,18.10,18.19,17.66,18.05,2062300\n25-Mar-08,18.29,18.44,17.50,18.20,2909700\n24-Mar-08,17.04,18.41,17.00,18.35,4640400\n20-Mar-08,16.82,17.10,16.69,17.06,3044300\n19-Mar-08,17.04,17.28,16.78,16.82,3463600\n18-Mar-08,16.66,17.13,16.66,17.04,6497000\n17-Mar-08,16.77,17.05,16.53,16.58,3127900\n14-Mar-08,17.57,17.57,17.00,17.05,2629100\n13-Mar-08,17.01,17.53,16.89,17.42,2863700\n12-Mar-08,17.22,17.48,17.13,17.15,2429000\n11-Mar-08,17.55,17.96,17.02,17.28,3787800\n10-Mar-08,17.24,17.64,17.24,17.32,1681500\n7-Mar-08,17.24,17.74,17.19,17.32,1589400\n6-Mar-08,17.75,17.90,17.39,17.46,1077000\n5-Mar-08,17.43,17.82,17.24,17.70,1647400\n4-Mar-08,17.33,17.50,17.09,17.43,1375300\n3-Mar-08,17.73,17.79,17.15,17.37,2168700\n29-Feb-08,17.98,17.98,17.60,17.83,1613800\n28-Feb-08,18.26,18.31,17.78,17.89,1527700\n27-Feb-08,18.10,18.54,18.10,18.34,1092300\n26-Feb-08,18.12,18.53,18.12,18.28,1334800\n25-Feb-08,18.20,18.40,18.04,18.31,1447300\n22-Feb-08,18.27,18.37,17.92,18.24,1451800\n21-Feb-08,18.11,18.62,18.04,18.18,2228800\n20-Feb-08,18.03,18.18,17.86,18.08,2466100\n19-Feb-08,18.21,18.53,18.00,18.13,2304500\n15-Feb-08,18.01,18.22,18.00,18.12,1503800\n14-Feb-08,18.54,18.55,18.01,18.12,1352200\n13-Feb-08,18.10,18.79,18.10,18.61,1295400\n12-Feb-08,18.35,18.47,17.89,18.10,1668900\n11-Feb-08,18.18,18.42,18.08,18.24,1306100\n8-Feb-08,18.04,18.64,18.00,18.20,1671800\n7-Feb-08,18.17,18.37,17.97,18.18,1612300\n6-Feb-08,18.82,18.86,18.18,18.26,1696100\n5-Feb-08,19.09,19.17,18.60,18.68,2316900\n4-Feb-08,19.13,19.50,19.04,19.33,1631700\n1-Feb-08,18.93,19.35,18.80,19.14,2373900\n31-Jan-08,17.70,19.06,17.70,18.67,3193600\n30-Jan-08,17.72,18.57,17.51,18.04,3061700\n29-Jan-08,17.92,18.29,17.56,17.58,2761200\n28-Jan-08,17.73,18.01,17.49,17.85,2392400\n25-Jan-08,18.27,18.50,17.88,17.95,3790800\n24-Jan-08,17.86,18.23,17.62,18.16,3427900\n23-Jan-08,16.98,17.85,16.82,17.81,4207000\n22-Jan-08,17.54,18.21,17.32,17.68,3398100\n18-Jan-08,18.43,18.78,17.97,18.17,4477800\n17-Jan-08,18.70,19.01,18.07,18.27,3016400\n16-Jan-08,19.02,19.42,18.59,18.68,5077600\n15-Jan-08,19.67,19.85,19.19,19.26,2162300\n14-Jan-08,19.66,20.00,19.45,19.85,1794800\n11-Jan-08,19.53,19.80,19.53,19.65,1428100\n10-Jan-08,20.00,20.20,19.52,19.85,3816500\n9-Jan-08,19.84,20.46,19.76,19.95,4048800\n8-Jan-08,20.08,20.54,19.88,19.89,2425700\n7-Jan-08,20.45,20.51,19.97,20.18,3323500\n4-Jan-08,20.55,20.75,20.25,20.34,3356500\n3-Jan-08,20.51,20.87,20.51,20.71,1519100\n2-Jan-08,20.84,21.05,20.42,20.60,2240600\n31-Dec-07,21.00,21.21,20.74,20.84,1416200\n28-Dec-07,20.95,21.25,20.95,21.12,1783200\n27-Dec-07,21.00,21.32,20.95,21.04,1633900\n26-Dec-07,21.03,21.23,20.85,21.15,1290600\n24-Dec-07,20.87,21.14,20.66,21.14,863400\n21-Dec-07,20.17,20.95,20.00,20.71,7804300\n20-Dec-07,18.30,18.93,18.30,18.79,4802000\n19-Dec-07,18.18,18.80,18.04,18.26,2582200\n18-Dec-07,18.80,18.90,18.28,18.35,1705100\n17-Dec-07,18.98,18.98,18.58,18.70,2827500\n14-Dec-07,18.90,19.27,18.75,18.85,2022700\n13-Dec-07,18.75,19.20,18.69,19.03,1917500\n12-Dec-07,19.35,19.60,19.05,19.33,2288400\n11-Dec-07,19.20,19.78,19.11,19.14,1238600\n10-Dec-07,19.28,19.75,19.19,19.47,1371700\n7-Dec-07,20.01,20.19,19.81,20.01,638100\n6-Dec-07,19.89,20.14,19.81,20.07,675200\n5-Dec-07,19.66,20.20,19.66,20.03,1563000\n4-Dec-07,20.00,20.24,19.61,19.69,1469100\n3-Dec-07,20.06,20.14,19.68,19.84,1358000\n30-Nov-07,20.05,20.46,19.88,20.02,1503300\n29-Nov-07,19.34,20.07,19.34,20.03,1874000\n28-Nov-07,18.75,19.78,18.75,19.56,1897000\n27-Nov-07,18.70,19.27,18.49,18.78,2141100\n26-Nov-07,18.70,19.13,18.51,18.78,1718800\n23-Nov-07,18.69,18.75,18.20,18.62,577600\n21-Nov-07,18.57,18.88,18.45,18.65,994100\n20-Nov-07,19.15,19.15,18.48,18.90,1630000\n19-Nov-07,19.14,19.50,18.71,18.91,2526100\n16-Nov-07,19.52,19.75,19.23,19.47,1631700\n15-Nov-07,19.70,19.97,19.35,19.58,2394400\n14-Nov-07,20.07,20.36,19.90,19.98,1003700\n13-Nov-07,19.87,20.27,19.72,20.14,1538700\n12-Nov-07,19.70,21.00,19.70,19.90,2507300\n9-Nov-07,20.69,20.99,20.21,20.23,2273900\n8-Nov-07,22.25,22.25,20.56,21.00,2914600\n7-Nov-07,21.98,22.67,21.98,22.11,1635600\n6-Nov-07,21.90,22.48,21.82,22.43,2239000\n5-Nov-07,21.50,21.97,21.16,21.88,1642800\n2-Nov-07,21.47,21.67,21.26,21.50,1252500\n1-Nov-07,21.22,21.60,21.02,21.34,949700\n31-Oct-07,20.91,21.74,20.77,21.59,1820400\n30-Oct-07,21.30,21.34,20.84,20.91,1276100\n29-Oct-07,21.13,21.66,20.85,21.35,1472000\n26-Oct-07,20.91,21.21,20.80,21.16,2216200\n25-Oct-07,20.93,20.98,20.66,20.85,1596500\n24-Oct-07,20.84,21.00,20.55,20.99,1278000\n23-Oct-07,21.00,21.15,20.61,21.00,1724500\n22-Oct-07,20.54,21.05,20.52,20.98,996500\n19-Oct-07,20.88,21.03,20.64,20.82,1665300\n18-Oct-07,20.72,21.11,20.69,21.05,1097800\n17-Oct-07,21.03,21.21,20.68,20.86,1762800\n16-Oct-07,20.91,21.24,20.76,21.00,1797900\n15-Oct-07,21.23,21.30,20.82,21.00,1388700\n12-Oct-07,21.35,21.43,20.84,21.39,1806200\n11-Oct-07,21.65,21.65,21.33,21.38,1747700\n10-Oct-07,21.48,21.67,21.38,21.52,3134500\n9-Oct-07,20.62,21.57,20.62,21.42,3711900\n8-Oct-07,20.65,20.72,20.42,20.61,1195100\n5-Oct-07,19.80,20.60,19.80,20.57,3652300\n4-Oct-07,19.51,19.84,19.40,19.75,2260200\n3-Oct-07,19.36,19.50,19.25,19.50,2972200\n2-Oct-07,19.57,19.72,19.38,19.43,1833300\n1-Oct-07,19.67,19.86,19.09,19.70,3787500\n28-Sep-07,19.79,19.94,19.63,19.87,3027600\n27-Sep-07,19.89,20.00,19.72,19.95,2377800\n26-Sep-07,20.33,20.39,19.52,19.89,8516700\n25-Sep-07,19.00,19.51,18.65,18.89,5146300\n24-Sep-07,19.37,19.45,18.74,19.00,6258500\n21-Sep-07,20.20,20.46,19.70,19.77,2964300\n20-Sep-07,19.85,20.38,19.81,20.18,2400500\n19-Sep-07,19.97,20.10,19.65,19.90,1353700\n18-Sep-07,19.33,19.75,19.11,19.72,1755100\n17-Sep-07,19.00,19.39,18.31,19.25,2788600\n14-Sep-07,19.02,19.18,18.91,19.08,1176200\n13-Sep-07,19.12,19.22,19.01,19.13,884500\n12-Sep-07,19.26,19.38,19.01,19.05,1659600\n11-Sep-07,19.21,19.45,19.05,19.43,1424200\n10-Sep-07,19.67,19.68,18.76,19.01,1999400\n7-Sep-07,19.45,19.58,19.21,19.41,1896100\n6-Sep-07,19.73,19.73,19.38,19.54,1511500\n5-Sep-07,19.96,19.96,19.46,19.56,1998800\n4-Sep-07,19.49,19.94,19.49,19.81,1540500\n31-Aug-07,19.28,19.55,19.06,19.45,1476400\n30-Aug-07,19.19,19.66,19.04,19.30,2360000\n29-Aug-07,18.50,19.29,18.50,19.12,3559600\n28-Aug-07,19.01,19.19,18.57,18.67,3046900\n27-Aug-07,19.59,19.77,19.00,19.11,2681200\n24-Aug-07,19.19,19.77,19.17,19.69,2294900\n23-Aug-07,19.86,19.86,19.08,19.24,2215600\n22-Aug-07,19.80,20.00,19.31,19.56,3169500\n21-Aug-07,20.33,20.37,19.64,19.81,2030500\n20-Aug-07,20.56,20.56,19.75,20.06,1920900\n17-Aug-07,20.60,20.94,19.90,20.38,2081600\n16-Aug-07,20.47,21.06,19.97,20.46,3518600\n15-Aug-07,21.14,22.10,20.81,21.01,1740300\n14-Aug-07,21.69,22.04,20.97,21.05,1496200\n13-Aug-07,22.19,22.19,21.23,21.77,1486100\n10-Aug-07,21.83,22.92,21.65,21.98,2718300\n9-Aug-07,22.53,23.82,22.22,22.30,3619400\n8-Aug-07,21.35,22.69,21.18,22.69,2999100\n7-Aug-07,21.25,21.46,20.65,21.25,2142600\n6-Aug-07,19.90,21.35,19.72,21.25,2588700\n3-Aug-07,20.70,20.86,19.99,19.99,2340100\n2-Aug-07,21.02,21.22,20.63,20.83,2508000\n1-Aug-07,20.74,20.85,19.82,20.79,3321800\n31-Jul-07,21.14,21.24,20.75,20.82,1826000\n30-Jul-07,21.66,21.66,20.90,21.05,2212200\n27-Jul-07,21.87,22.25,21.42,21.50,2001400\n26-Jul-07,22.00,22.43,21.30,21.82,2082900\n25-Jul-07,22.00,22.23,21.80,22.08,1634400\n24-Jul-07,21.71,22.35,21.59,22.15,2942600\n23-Jul-07,22.08,22.19,21.51,21.72,2002900\n20-Jul-07,21.86,22.20,21.73,22.18,2191100\n19-Jul-07,21.73,21.77,21.38,21.70,1876000\n18-Jul-07,21.65,21.67,21.35,21.50,1584100\n17-Jul-07,21.52,21.95,21.35,21.84,1853200\n16-Jul-07,21.86,21.86,21.11,21.55,1697600\n13-Jul-07,21.72,21.72,21.31,21.38,1978600\n12-Jul-07,21.40,21.70,21.26,21.70,2351000\n11-Jul-07,21.24,21.37,20.95,21.26,1836500\n10-Jul-07,20.97,21.22,20.88,21.15,1894100\n9-Jul-07,21.39,21.44,20.87,20.97,2944700\n6-Jul-07,21.55,21.60,21.31,21.48,1264400\n5-Jul-07,21.75,21.76,21.41,21.60,1540200\n3-Jul-07,21.71,21.86,21.71,21.83,834400\n2-Jul-07,22.00,22.07,21.68,21.75,2860900\n29-Jun-07,22.45,22.68,22.00,22.28,2515600\n28-Jun-07,23.75,23.75,22.19,22.37,8913500\n27-Jun-07,23.15,24.50,23.11,24.19,3210900\n26-Jun-07,23.42,23.75,23.17,23.36,2055000\n25-Jun-07,23.78,24.11,23.41,23.44,956600\n22-Jun-07,24.35,24.35,23.64,23.86,1020800\n21-Jun-07,23.80,24.22,23.71,24.22,1133200\n20-Jun-07,23.40,24.37,23.40,23.80,1923600\n19-Jun-07,23.13,23.58,23.05,23.42,2578900\n18-Jun-07,23.24,23.46,23.16,23.27,778700\n15-Jun-07,23.50,23.75,23.22,23.28,1169400\n14-Jun-07,23.45,23.98,23.28,23.35,2422700\n13-Jun-07,23.35,23.98,22.79,23.34,1930400\n12-Jun-07,23.50,23.83,23.03,23.23,2591500\n11-Jun-07,23.85,24.39,23.50,23.64,1493400\n8-Jun-07,23.58,23.94,23.53,23.74,1143100\n7-Jun-07,24.34,24.55,23.55,23.66,2535700\n6-Jun-07,24.21,24.59,24.13,24.17,1990900\n5-Jun-07,24.38,24.74,24.25,24.33,3102200\n4-Jun-07,24.58,24.79,24.10,24.42,2493400\n1-Jun-07,24.88,25.25,24.40,24.57,7406600\n31-May-07,23.75,24.73,23.60,24.56,4910700\n30-May-07,22.26,23.05,22.26,22.95,2575800\n29-May-07,22.05,22.50,22.05,22.26,1053200\n25-May-07,22.01,22.28,21.71,21.91,1368100\n24-May-07,22.96,22.96,21.83,21.93,2227300\n23-May-07,23.30,23.44,22.97,23.05,1183600\n22-May-07,23.30,23.50,22.90,23.28,3748500\n21-May-07,22.58,22.76,22.45,22.53,2085100\n18-May-07,22.12,22.57,22.12,22.57,2159200\n17-May-07,22.18,22.28,21.91,22.16,895600\n16-May-07,21.94,22.19,21.71,22.17,1101500\n15-May-07,22.49,22.50,21.95,21.95,1532400\n14-May-07,22.65,22.93,22.39,22.49,3207700\n11-May-07,22.28,22.83,22.17,22.75,1272000\n10-May-07,22.16,22.75,21.90,22.30,2575600\n9-May-07,22.10,22.45,21.84,22.30,1403000\n8-May-07,22.52,22.70,21.91,22.20,2347400\n7-May-07,21.48,22.54,21.43,22.39,2753500\n4-May-07,21.29,21.66,21.14,21.60,1495100\n3-May-07,21.00,21.28,20.79,21.28,1964600\n2-May-07,20.56,20.85,20.45,20.81,2377100\n1-May-07,21.11,21.12,20.50,20.59,2618200\n30-Apr-07,21.74,21.94,21.11,21.14,1427700\n27-Apr-07,21.77,21.93,21.55,21.80,1190000\n26-Apr-07,22.02,22.12,21.70,21.88,1320800\n25-Apr-07,21.86,22.16,21.79,22.14,1255000\n24-Apr-07,22.10,22.22,21.67,21.85,1987800\n23-Apr-07,22.23,22.35,22.08,22.20,1237900\n20-Apr-07,22.28,22.36,22.01,22.17,1360100\n19-Apr-07,23.00,23.00,22.10,22.17,2045200\n18-Apr-07,22.65,22.93,22.43,22.70,1541700\n17-Apr-07,22.32,22.68,22.27,22.66,1763100\n16-Apr-07,22.34,22.34,22.05,22.19,2367900\n13-Apr-07,22.50,22.50,22.02,22.35,1840000\n12-Apr-07,21.40,22.43,21.38,22.40,3327300\n11-Apr-07,21.70,21.91,21.34,21.46,1478900\n10-Apr-07,21.88,21.89,21.35,21.70,2833500\n9-Apr-07,22.10,22.12,21.60,21.87,2042400\n5-Apr-07,22.10,22.14,21.95,22.00,1216600\n4-Apr-07,22.03,22.45,22.01,22.15,1486200\n3-Apr-07,22.33,22.50,22.04,22.12,2604900\n2-Apr-07,22.93,22.93,22.31,22.31,2126900\n30-Mar-07,23.90,24.05,22.08,22.93,7091000\n29-Mar-07,23.70,23.70,22.75,23.14,2553900\n28-Mar-07,23.63,23.63,23.14,23.52,1660800\n27-Mar-07,23.97,23.97,23.66,23.70,2279400\n26-Mar-07,24.22,24.37,23.74,23.78,1693600\n23-Mar-07,24.16,24.41,23.92,24.24,1277300\n22-Mar-07,23.77,24.48,23.64,24.15,1908500\n21-Mar-07,23.10,24.08,22.89,23.83,2533800\n20-Mar-07,22.91,23.10,22.56,22.98,1462500\n19-Mar-07,22.67,23.04,22.53,22.91,1014400\n16-Mar-07,22.52,22.82,22.51,22.64,1080100\n15-Mar-07,22.40,22.83,22.27,22.52,2071800\n14-Mar-07,22.70,22.88,22.37,22.52,2002100\n13-Mar-07,21.99,22.92,21.99,22.71,1150100\n12-Mar-07,22.68,23.15,22.60,22.94,1170300\n9-Mar-07,22.32,22.77,22.25,22.67,1575200\n8-Mar-07,21.87,22.50,21.87,22.30,1644300\n7-Mar-07,22.23,22.35,21.55,21.70,2767600\n6-Mar-07,22.15,22.36,21.71,22.12,1686400\n5-Mar-07,21.25,21.90,21.22,21.71,1803400\n2-Mar-07,22.52,22.72,21.87,22.01,1532500\n1-Mar-07,21.89,22.79,21.30,22.71,1558900\n28-Feb-07,22.81,22.95,22.36,22.45,2005900\n27-Feb-07,23.49,23.72,22.50,22.85,1990100\n26-Feb-07,24.07,24.50,23.75,23.79,2559600\n23-Feb-07,23.67,24.29,23.00,23.60,1702200\n22-Feb-07,23.76,24.13,23.59,23.65,1279100\n21-Feb-07,24.27,24.48,23.92,23.95,1158000\n20-Feb-07,24.00,24.71,23.96,24.37,1772000\n16-Feb-07,23.67,24.00,23.55,24.00,1872400\n15-Feb-07,24.24,24.54,23.77,23.81,2634500\n14-Feb-07,24.29,25.00,24.02,24.23,2697600\n13-Feb-07,25.00,25.15,24.16,24.27,2939200\n12-Feb-07,24.00,24.75,23.84,24.58,3607200\n9-Feb-07,24.19,24.34,23.74,24.00,3934300\n8-Feb-07,23.24,24.22,23.13,24.10,2551200\n7-Feb-07,22.84,23.73,22.70,23.35,3420400\n6-Feb-07,22.98,22.98,22.48,22.83,2614500\n5-Feb-07,22.78,22.87,22.53,22.54,2456800\n2-Feb-07,22.79,22.95,22.49,22.68,2061900\n1-Feb-07,22.89,22.89,22.57,22.80,1844000\n31-Jan-07,22.22,22.75,22.05,22.73,2327000\n30-Jan-07,22.14,22.80,22.14,22.72,2409600\n29-Jan-07,22.34,22.53,21.93,22.20,1662100\n26-Jan-07,22.30,22.39,22.00,22.24,1159700\n25-Jan-07,22.00,22.27,21.96,22.25,2039000\n24-Jan-07,21.74,22.19,21.74,22.05,1299000\n23-Jan-07,21.80,21.94,21.54,21.73,2548500\n22-Jan-07,21.69,22.00,21.58,21.79,2457400\n19-Jan-07,21.46,21.81,21.30,21.69,3927000\n18-Jan-07,22.48,22.48,20.71,20.96,5122400\n17-Jan-07,22.36,22.59,22.22,22.48,1820700\n16-Jan-07,21.96,22.44,21.95,22.18,1257000\n12-Jan-07,22.45,22.45,21.88,22.16,2026300\n11-Jan-07,22.00,22.65,22.00,22.37,2908500\n10-Jan-07,22.02,22.34,21.96,22.11,2055900\n9-Jan-07,22.09,22.39,21.90,22.11,2803000\n8-Jan-07,22.23,22.59,22.00,22.34,2688200\n5-Jan-07,22.37,22.50,22.10,22.24,2000200\n4-Jan-07,22.88,22.88,21.61,22.67,2896300\n3-Jan-07,22.91,23.10,21.76,22.17,3681700\n29-Dec-06,23.00,23.05,22.80,23.00,2162900\n28-Dec-06,22.45,23.15,22.44,22.96,3052700\n27-Dec-06,22.45,22.85,22.31,22.70,4339500\n26-Dec-06,22.46,23.20,22.29,22.79,5604300\n22-Dec-06,20.75,22.50,20.37,22.46,19397100\n21-Dec-06,18.75,18.85,17.96,17.96,3135700\n20-Dec-06,18.37,19.00,18.27,18.74,3567200\n19-Dec-06,17.95,18.49,17.82,18.37,3088600\n18-Dec-06,17.25,18.00,17.25,17.94,6211500\n15-Dec-06,17.30,17.62,17.01,17.62,3694000\n14-Dec-06,16.75,17.37,16.60,17.30,3323400\n13-Dec-06,16.35,16.69,16.00,16.58,3172100\n12-Dec-06,16.12,16.55,15.53,16.44,2955200\n11-Dec-06,16.53,16.53,16.11,16.22,11031000\n8-Dec-06,16.40,16.81,16.20,16.51,3545300\n7-Dec-06,16.78,16.93,16.37,16.46,5772500\n6-Dec-06,16.90,17.00,16.74,16.82,3116100\n5-Dec-06,17.18,17.24,16.95,17.04,3189900\n4-Dec-06,17.25,17.45,17.07,17.13,3637100\n1-Dec-06,17.35,17.46,17.00,17.18,4379300\n30-Nov-06,17.02,17.49,16.93,17.40,4367200\n29-Nov-06,17.35,17.61,16.59,17.07,6926000\n28-Nov-06,16.87,17.28,16.71,17.11,4814400\n27-Nov-06,17.50,17.62,16.85,16.98,4350600\n24-Nov-06,17.90,17.90,17.30,17.48,2608200\n22-Nov-06,16.96,17.62,16.93,17.59,5626900\n21-Nov-06,16.97,17.38,16.77,16.89,6953600\n20-Nov-06,16.69,16.70,16.36,16.50,5072600\n17-Nov-06,16.68,16.75,16.41,16.67,3764400\n16-Nov-06,17.02,17.70,16.35,16.79,12881400\n15-Nov-06,16.95,17.26,16.70,16.93,7525400\n14-Nov-06,17.37,17.50,16.51,16.88,11913600\n13-Nov-06,17.83,17.89,17.49,17.53,5471000\n10-Nov-06,17.16,17.92,17.12,17.85,6079300\n9-Nov-06,17.50,17.83,17.10,17.16,7103400\n8-Nov-06,16.73,17.25,16.73,17.20,5226100\n7-Nov-06,16.68,17.17,16.58,16.90,6945700\n6-Nov-06,16.55,16.85,16.29,16.75,6529900\n3-Nov-06,15.88,16.82,15.75,16.67,12855700\n2-Nov-06,16.36,16.47,15.53,16.10,17433400\n1-Nov-06,16.59,16.59,16.31,16.43,5361000\n31-Oct-06,16.53,16.78,16.22,16.38,10998300\n30-Oct-06,15.71,16.74,15.68,16.51,18258500\n27-Oct-06,15.00,16.20,14.89,15.63,48797200\n26-Oct-06,15.75,15.80,13.70,14.83,3446900\n25-Oct-06,19.40,19.52,19.13,19.51,8353000\n24-Oct-06,18.85,19.53,18.51,19.41,8837000\n23-Oct-06,18.72,19.11,18.60,18.87,8381000\n20-Oct-06,18.67,18.68,18.13,18.27,6623800\n19-Oct-06,19.00,19.00,18.44,18.62,7098900\n18-Oct-06,19.24,19.52,18.93,19.07,7074600\n17-Oct-06,19.78,19.82,19.01,19.02,7886800\n16-Oct-06,19.85,20.05,19.72,19.84,5944800\n13-Oct-06,20.97,21.00,19.71,19.90,22624300\n12-Oct-06,21.71,22.00,21.41,21.49,7166700\n11-Oct-06,21.51,22.06,21.50,21.60,3686800\n10-Oct-06,21.54,21.78,21.50,21.65,2994500\n9-Oct-06,21.70,22.00,21.50,21.51,3547500\n6-Oct-06,21.88,22.13,21.75,21.78,2725300\n5-Oct-06,22.43,22.43,21.79,22.08,5520900\n4-Oct-06,21.44,22.20,21.09,22.15,7070100\n3-Oct-06,20.60,21.25,20.41,21.20,7051500\n2-Oct-06,21.15,21.40,20.58,20.59,5857900\n29-Sep-06,20.73,21.44,20.61,21.08,8647100\n28-Sep-06,20.62,20.82,20.29,20.59,8438300\n27-Sep-06,20.87,20.93,19.82,20.21,62795800\n26-Sep-06,26.32,26.40,25.40,26.32,6686200\n25-Sep-06,25.27,26.24,25.14,26.07,6084300\n22-Sep-06,25.00,25.13,24.67,25.03,2603300\n21-Sep-06,25.23,25.26,24.69,24.93,2612000\n20-Sep-06,24.66,25.40,24.65,25.07,4280400\n19-Sep-06,24.45,24.64,23.75,24.00,2515900\n18-Sep-06,23.62,24.75,23.61,24.23,4468900\n15-Sep-06,23.57,23.80,23.00,23.47,3759000\n14-Sep-06,23.77,23.77,23.15,23.39,3163600\n13-Sep-06,22.69,24.07,22.61,23.72,5528700\n12-Sep-06,22.05,22.91,21.90,22.62,4289100\n11-Sep-06,22.36,22.53,22.00,22.15,5191300\n8-Sep-06,22.87,22.93,22.12,22.55,6626000\n7-Sep-06,23.74,23.78,22.60,22.68,4210000\n6-Sep-06,24.75,24.93,23.79,23.85,2614500\n5-Sep-06,24.14,24.87,24.05,24.63,3060900\n1-Sep-06,23.29,24.40,23.15,24.19,3912100\n31-Aug-06,24.44,24.47,23.18,23.20,4763800\n30-Aug-06,24.82,25.10,24.25,24.50,2432900\n29-Aug-06,24.43,25.03,24.07,24.84,3009700\n28-Aug-06,24.90,25.03,23.90,24.56,3965000\n25-Aug-06,25.02,25.65,24.85,25.46,2197700\n24-Aug-06,25.50,25.62,24.79,24.93,1728900\n23-Aug-06,25.44,25.68,24.92,25.30,2088800\n22-Aug-06,24.70,25.49,24.70,25.36,2493000\n21-Aug-06,25.38,25.55,24.55,24.70,3815400\n18-Aug-06,25.62,25.87,25.05,25.46,3706900\n17-Aug-06,23.02,25.85,22.93,25.71,11816600\n16-Aug-06,23.31,23.85,22.80,23.05,7349100\n15-Aug-06,22.95,23.27,22.22,23.03,4969800\n14-Aug-06,22.70,23.27,22.58,22.92,3421400\n11-Aug-06,22.70,22.70,21.90,22.47,4197700\n10-Aug-06,22.71,22.96,22.45,22.69,3988200\n9-Aug-06,22.31,22.88,22.03,22.31,3777100\n8-Aug-06,22.46,22.46,21.74,21.98,3400200\n7-Aug-06,22.69,22.90,22.14,22.37,3277600\n4-Aug-06,23.48,23.83,22.51,22.78,3457400\n3-Aug-06,23.12,23.41,22.19,23.10,5282800\n2-Aug-06,22.95,23.72,22.79,23.37,4486800\n1-Aug-06,23.70,23.70,22.52,22.96,3761800\n31-Jul-06,24.00,24.01,23.13,23.68,3316100\n28-Jul-06,23.96,24.25,23.71,24.13,2241800\n27-Jul-06,23.87,24.35,23.78,23.87,2424500\n26-Jul-06,24.25,24.25,23.70,23.77,3635600\n25-Jul-06,24.43,24.89,23.92,24.38,2956000\n24-Jul-06,23.37,24.47,23.34,24.44,2588000\n21-Jul-06,23.43,23.90,22.77,23.37,3960000\n20-Jul-06,24.11,24.29,23.48,23.62,3014800\n19-Jul-06,23.34,24.30,23.25,24.19,2875300\n18-Jul-06,23.27,23.80,22.83,23.21,3429600\n17-Jul-06,23.30,23.50,22.97,23.27,2824400\n14-Jul-06,22.91,23.50,22.73,23.36,4692200\n13-Jul-06,21.95,23.59,21.85,23.00,8605000\n12-Jul-06,21.92,22.45,21.68,22.06,5589200\n"
  },
  {
    "path": "examples/stockserver/YHOO.csv",
    "content": "﻿Date,Open,High,Low,Close,Volume\n9-Jul-12,15.78,15.84,15.70,15.75,10375997\n6-Jul-12,15.80,15.91,15.68,15.78,12152459\n5-Jul-12,15.90,15.99,15.81,15.85,11440727\n3-Jul-12,15.83,15.99,15.82,15.98,8149095\n2-Jul-12,15.80,15.94,15.76,15.84,7226555\n29-Jun-12,15.61,15.83,15.53,15.83,13503678\n28-Jun-12,15.41,15.48,15.29,15.45,12479185\n27-Jun-12,15.41,15.63,15.38,15.52,11262245\n26-Jun-12,15.40,16.35,15.19,15.34,13640323\n25-Jun-12,15.51,15.55,15.31,15.44,13383517\n22-Jun-12,15.53,15.70,15.52,15.61,11042683\n21-Jun-12,15.74,15.80,15.47,15.52,13102879\n20-Jun-12,15.69,15.75,15.58,15.74,11260690\n19-Jun-12,15.52,15.69,15.51,15.65,10638148\n18-Jun-12,15.33,15.54,15.27,15.49,9659149\n15-Jun-12,15.44,15.44,15.33,15.36,11716895\n14-Jun-12,15.30,15.46,15.25,15.36,11612611\n13-Jun-12,15.47,15.49,15.27,15.34,16456268\n12-Jun-12,15.35,15.52,15.26,15.47,17012443\n11-Jun-12,15.73,15.73,15.27,15.30,17147687\n8-Jun-12,15.52,15.68,15.40,15.65,16422357\n7-Jun-12,15.47,15.50,15.33,15.36,12643619\n6-Jun-12,15.14,15.41,15.14,15.36,18300693\n5-Jun-12,15.00,15.14,14.91,15.10,9725441\n4-Jun-12,14.90,15.03,14.81,15.01,15479055\n1-Jun-12,15.04,15.12,14.85,14.92,16202329\n31-May-12,15.23,15.37,15.12,15.24,17161481\n30-May-12,15.30,15.34,15.16,15.25,14925544\n29-May-12,15.40,15.55,15.28,15.47,18465318\n25-May-12,15.40,15.48,15.28,15.36,13629383\n24-May-12,15.34,15.51,15.22,15.35,13879511\n23-May-12,15.19,15.43,15.14,15.38,18115269\n22-May-12,15.58,15.61,15.19,15.29,33543631\n21-May-12,16.00,16.00,15.10,15.58,51152115\n18-May-12,15.78,15.87,15.36,15.42,32684254\n17-May-12,15.26,15.37,14.85,14.87,17347626\n16-May-12,15.40,15.57,15.26,15.28,17247303\n15-May-12,15.47,15.55,15.34,15.40,13743166\n14-May-12,15.48,15.77,15.40,15.50,30819739\n11-May-12,14.88,15.44,14.80,15.19,21134710\n10-May-12,15.40,15.54,15.30,15.44,11175681\n9-May-12,15.17,15.45,15.03,15.30,19009078\n8-May-12,15.31,15.44,15.09,15.36,18604517\n7-May-12,15.34,15.49,15.16,15.35,13467153\n4-May-12,15.25,15.29,15.09,15.15,13771297\n3-May-12,15.64,15.64,15.32,15.40,10934219\n2-May-12,15.58,15.77,15.54,15.67,10840951\n1-May-12,15.51,15.72,15.50,15.63,9799226\n30-Apr-12,15.55,15.57,15.45,15.54,10895462\n27-Apr-12,15.51,15.62,15.49,15.57,9711543\n26-Apr-12,15.44,15.55,15.38,15.53,12543229\n25-Apr-12,15.43,15.51,15.38,15.50,13236914\n24-Apr-12,15.33,15.52,15.33,15.43,12140621\n23-Apr-12,15.41,15.47,15.29,15.33,21683640\n20-Apr-12,15.41,15.70,15.39,15.60,24560459\n19-Apr-12,15.44,15.57,15.36,15.40,18436172\n18-Apr-12,15.40,15.57,15.30,15.49,36562348\n17-Apr-12,14.82,15.18,14.82,15.01,20558906\n16-Apr-12,15.00,15.04,14.73,14.78,13639142\n13-Apr-12,14.99,15.18,14.86,14.87,15336610\n12-Apr-12,14.90,15.10,14.84,15.06,9487715\n11-Apr-12,15.08,15.08,14.84,14.88,11208690\n10-Apr-12,15.08,15.18,14.91,14.99,15287467\n9-Apr-12,15.00,15.25,14.96,15.10,11335915\n5-Apr-12,15.14,15.26,15.00,15.06,11719364\n4-Apr-12,15.15,15.34,15.00,15.27,20958443\n3-Apr-12,15.36,15.43,15.06,15.18,18205919\n2-Apr-12,15.19,15.51,15.11,15.46,14423746\n30-Mar-12,15.37,15.42,15.18,15.22,15516149\n29-Mar-12,15.19,15.34,15.11,15.30,9934764\n28-Mar-12,15.45,15.48,15.14,15.32,18835377\n27-Mar-12,15.53,15.55,15.41,15.43,11893220\n26-Mar-12,15.46,15.56,15.36,15.54,11500800\n23-Mar-12,15.52,15.59,15.31,15.38,8495792\n22-Mar-12,15.51,15.56,15.38,15.48,14619861\n21-Mar-12,15.42,15.61,15.17,15.51,25025789\n20-Mar-12,15.00,15.61,14.92,15.41,22189645\n19-Mar-12,15.08,15.22,14.92,15.15,16650135\n16-Mar-12,14.95,15.18,14.92,15.18,28343137\n15-Mar-12,14.64,14.98,14.57,14.88,19810763\n14-Mar-12,14.54,14.64,14.42,14.63,14767830\n13-Mar-12,14.54,14.62,14.39,14.55,17134337\n12-Mar-12,14.66,14.76,14.48,14.49,11309159\n9-Mar-12,14.63,14.70,14.61,14.63,9772432\n8-Mar-12,14.70,14.77,14.52,14.62,11273272\n7-Mar-12,14.48,14.71,14.44,14.62,10623336\n6-Mar-12,14.61,14.69,14.35,14.42,12696860\n5-Mar-12,14.66,14.95,14.52,14.62,11753807\n2-Mar-12,14.88,14.92,14.66,14.72,9168834\n1-Mar-12,14.89,14.96,14.79,14.93,12286079\n29-Feb-12,14.89,14.93,14.78,14.83,19616656\n28-Feb-12,14.93,14.99,14.76,14.90,15399842\n27-Feb-12,14.74,14.91,14.72,14.86,13434112\n24-Feb-12,14.86,14.97,14.83,14.89,12111859\n23-Feb-12,14.55,14.81,14.37,14.78,15695712\n22-Feb-12,14.68,14.75,14.43,14.50,27189767\n21-Feb-12,15.04,15.07,14.75,14.75,29698052\n17-Feb-12,15.41,15.44,15.00,15.01,22898691\n16-Feb-12,15.25,15.38,15.10,15.36,15377354\n15-Feb-12,15.23,15.30,15.08,15.12,25318327\n14-Feb-12,16.07,16.10,14.92,15.36,88675936\n13-Feb-12,16.13,16.24,16.05,16.12,10067290\n10-Feb-12,16.02,16.31,16.00,16.14,27796352\n9-Feb-12,16.10,16.10,15.90,16.00,22550991\n8-Feb-12,15.96,15.97,15.72,15.78,13448816\n7-Feb-12,15.84,15.89,15.74,15.83,13504418\n6-Feb-12,15.94,15.95,15.76,15.82,11291206\n3-Feb-12,15.94,15.98,15.83,15.92,13659221\n2-Feb-12,15.76,15.82,15.69,15.72,9948709\n1-Feb-12,15.57,15.80,15.53,15.73,13223197\n31-Jan-12,15.54,15.62,15.41,15.47,10731010\n30-Jan-12,15.61,15.65,15.50,15.55,11076828\n27-Jan-12,15.50,15.80,15.46,15.74,10866737\n26-Jan-12,15.63,15.69,15.42,15.53,15409950\n25-Jan-12,15.60,15.70,15.46,15.56,23352777\n24-Jan-12,15.57,15.81,15.55,15.69,17152110\n23-Jan-12,15.85,15.93,15.64,15.68,17872169\n20-Jan-12,16.11,16.11,15.85,15.96,22008252\n19-Jan-12,15.90,16.15,15.89,16.12,22646529\n18-Jan-12,15.87,16.00,15.69,15.92,35701899\n17-Jan-12,15.63,15.66,15.39,15.43,15334125\n13-Jan-12,15.48,15.48,15.48,15.48,0\n12-Jan-12,15.58,15.73,15.45,15.66,12665998\n11-Jan-12,15.56,15.62,15.35,15.53,10805281\n10-Jan-12,15.52,15.52,15.52,15.52,0\n9-Jan-12,15.59,15.61,15.35,15.46,13194246\n6-Jan-12,15.64,15.66,15.40,15.52,13313562\n5-Jan-12,15.60,15.69,15.44,15.64,19423687\n4-Jan-12,16.12,16.16,15.74,15.78,35655206\n3-Jan-12,16.27,16.39,16.20,16.28,19712161\n30-Dec-11,16.13,16.13,16.13,16.13,0\n29-Dec-11,15.95,16.23,15.80,16.13,15284347\n28-Dec-11,15.77,15.77,15.77,15.77,0\n27-Dec-11,16.16,16.17,16.01,16.09,9739471\n23-Dec-11,16.19,16.19,16.19,16.19,0\n22-Dec-11,16.36,16.40,15.95,16.00,33812755\n21-Dec-11,15.15,16.24,14.74,15.99,47127515\n20-Dec-11,15.11,15.11,15.11,15.11,0\n19-Dec-11,14.95,15.00,14.57,14.62,21455793\n16-Dec-11,15.05,15.26,14.92,14.96,32625191\n15-Dec-11,15.21,15.29,15.01,15.16,14830947\n14-Dec-11,15.19,15.28,14.80,15.02,27251044\n13-Dec-11,15.54,15.74,15.35,15.42,15584324\n12-Dec-11,15.49,15.49,15.49,15.49,0\n9-Dec-11,15.61,15.96,15.60,15.94,13454360\n8-Dec-11,15.60,15.76,15.53,15.61,18132201\n7-Dec-11,15.82,15.86,15.56,15.62,19755597\n6-Dec-11,15.90,16.05,15.84,15.84,17340776\n5-Dec-11,16.11,16.14,15.83,15.89,19896492\n2-Dec-11,16.31,16.41,16.03,16.05,22714425\n1-Dec-11,16.42,16.46,16.09,16.23,47059601\n30-Nov-11,15.90,16.04,15.65,15.71,34718122\n29-Nov-11,15.60,15.94,15.45,15.70,29293943\n28-Nov-11,15.24,15.47,15.21,15.35,19028944\n25-Nov-11,15.00,15.25,14.90,15.10,10781728\n23-Nov-11,14.94,14.94,14.94,14.94,0\n22-Nov-11,14.88,15.08,14.75,14.97,14840160\n21-Nov-11,15.19,15.19,14.77,14.99,23678060\n18-Nov-11,15.56,15.69,15.36,15.38,17163991\n17-Nov-11,15.69,15.77,15.20,15.34,17446292\n16-Nov-11,15.80,16.10,15.70,15.72,14367517\n15-Nov-11,15.93,16.05,15.70,15.93,17654973\n14-Nov-11,16.17,16.31,15.93,16.00,14282098\n11-Nov-11,15.96,16.31,15.91,16.27,14546140\n10-Nov-11,16.18,16.22,15.84,15.95,15370968\n9-Nov-11,16.17,16.50,15.87,15.92,45328226\n8-Nov-11,15.87,16.18,15.81,15.97,25079636\n7-Nov-11,15.26,15.70,15.25,15.69,22390612\n4-Nov-11,15.39,15.54,14.95,15.24,41852983\n3-Nov-11,15.20,15.50,15.03,15.48,16818633\n2-Nov-11,15.10,15.30,15.00,15.10,20763401\n1-Nov-11,14.95,15.08,14.75,14.93,41840623\n31-Oct-11,16.06,16.07,15.45,15.64,39763681\n28-Oct-11,16.41,16.70,16.25,16.56,20286809\n27-Oct-11,16.56,16.70,16.45,16.63,19772114\n26-Oct-11,16.33,16.44,15.86,16.30,23638309\n25-Oct-11,16.66,16.70,16.18,16.24,24059657\n24-Oct-11,16.57,16.75,16.31,16.71,29863977\n21-Oct-11,16.38,16.39,16.06,16.12,29739367\n20-Oct-11,16.20,16.49,15.97,16.18,40816828\n19-Oct-11,16.04,16.79,15.73,15.94,54264451\n18-Oct-11,15.72,15.74,15.11,15.47,31377900\n17-Oct-11,15.95,16.04,15.65,15.70,21203976\n14-Oct-11,16.13,16.15,15.66,15.91,23520095\n13-Oct-11,15.76,16.37,15.54,15.93,32487269\n12-Oct-11,15.93,15.95,15.67,15.77,20585382\n11-Oct-11,15.79,15.95,15.59,15.86,18050274\n10-Oct-11,15.86,16.04,15.62,15.84,33084934\n7-Oct-11,15.64,15.75,15.38,15.47,27953928\n6-Oct-11,15.16,15.80,14.92,15.65,49961022\n5-Oct-11,14.66,16.15,14.39,15.92,97330173\n4-Oct-11,14.00,14.48,13.87,14.46,44487200\n3-Oct-11,13.70,14.04,13.37,13.53,43196239\n30-Sep-11,13.21,13.44,13.11,13.17,30536073\n29-Sep-11,14.34,14.39,13.15,13.42,45782189\n28-Sep-11,14.61,14.62,14.15,14.19,21284688\n27-Sep-11,14.92,15.00,14.44,14.54,25093844\n26-Sep-11,14.79,14.80,14.23,14.75,24472226\n23-Sep-11,14.23,14.83,14.12,14.71,49333116\n22-Sep-11,14.20,14.25,13.69,13.99,60456273\n21-Sep-11,14.38,14.60,13.96,13.96,32018137\n20-Sep-11,14.53,14.66,14.28,14.36,21773998\n19-Sep-11,14.76,14.79,14.40,14.61,27290058\n16-Sep-11,15.09,15.34,14.94,14.97,56827817\n15-Sep-11,14.73,15.40,14.51,14.89,58585016\n14-Sep-11,14.47,14.94,14.34,14.55,37389606\n13-Sep-11,14.30,14.34,14.12,14.26,19930223\n12-Sep-11,14.12,14.28,13.92,14.26,32700733\n9-Sep-11,14.36,14.57,14.07,14.48,60031868\n8-Sep-11,13.57,14.49,13.37,14.44,93971939\n7-Sep-11,13.75,14.00,13.24,13.61,77329448\n6-Sep-11,12.52,12.95,12.45,12.91,54455285\n2-Sep-11,13.12,13.13,12.86,12.87,20509323\n1-Sep-11,13.67,13.78,13.32,13.35,17962631\n31-Aug-11,13.91,13.94,13.54,13.61,25391661\n30-Aug-11,13.30,13.98,13.23,13.84,29165003\n29-Aug-11,12.90,13.68,12.69,13.68,31000622\n26-Aug-11,12.80,12.89,12.52,12.74,35884143\n25-Aug-11,13.12,13.21,12.81,12.87,21811729\n24-Aug-11,13.28,13.30,12.79,13.15,24968556\n23-Aug-11,12.91,13.35,12.75,13.35,17187326\n22-Aug-11,13.16,13.23,12.77,12.84,14199711\n19-Aug-11,12.75,13.08,12.72,12.92,26185753\n18-Aug-11,13.02,13.09,12.80,12.96,30448815\n17-Aug-11,13.49,13.62,13.32,13.47,17008048\n16-Aug-11,13.34,13.57,13.18,13.48,25583139\n15-Aug-11,13.63,13.69,13.27,13.46,25686333\n12-Aug-11,12.81,13.62,12.76,13.58,48476111\n11-Aug-11,11.89,12.92,11.88,12.86,51100217\n10-Aug-11,11.77,12.14,11.62,11.77,48033973\n9-Aug-11,0.00,12.09,11.25,12.08,47486551\n8-Aug-11,11.43,11.80,11.09,11.09,59577539\n5-Aug-11,12.08,12.12,11.41,11.74,47067433\n4-Aug-11,12.80,12.86,11.99,12.00,39442225\n3-Aug-11,12.84,13.07,12.52,13.02,26163350\n2-Aug-11,12.96,13.18,12.75,12.76,25800256\n1-Aug-11,13.24,13.34,12.95,13.10,26879954\n29-Jul-11,13.89,14.07,13.04,13.10,67798407\n28-Jul-11,13.60,13.71,13.43,13.50,20636427\n27-Jul-11,13.87,13.90,13.57,13.58,20560126\n26-Jul-11,13.70,13.99,13.65,13.94,20935946\n25-Jul-11,13.84,13.88,13.68,13.69,16733449\n22-Jul-11,13.65,14.05,13.57,13.98,30144780\n21-Jul-11,13.50,13.62,13.36,13.59,30493456\n20-Jul-11,14.15,14.15,13.45,13.48,63098312\n19-Jul-11,14.57,14.69,14.45,14.59,30168131\n18-Jul-11,14.68,14.69,14.36,14.42,24504779\n15-Jul-11,14.75,14.94,14.61,14.69,19746861\n14-Jul-11,14.88,14.99,14.60,14.63,27086009\n13-Jul-11,15.01,15.10,14.87,14.91,16646489\n12-Jul-11,15.01,15.18,14.85,14.86,22793682\n11-Jul-11,15.43,15.44,14.99,15.05,21487664\n8-Jul-11,15.62,15.69,15.44,15.61,14366237\n7-Jul-11,15.78,15.95,15.70,15.81,20992401\n6-Jul-11,15.53,15.81,15.52,15.72,18290651\n5-Jul-11,15.40,15.67,15.25,15.49,20482062\n1-Jul-11,15.45,15.45,15.45,15.45,0\n30-Jun-11,14.98,15.10,14.64,15.04,34906399\n29-Jun-11,14.96,15.05,14.68,14.89,25468150\n28-Jun-11,14.95,15.18,14.88,14.95,16059227\n27-Jun-11,14.87,14.98,14.77,14.88,13837583\n24-Jun-11,15.08,15.16,14.85,14.88,25343733\n23-Jun-11,15.08,15.09,14.72,15.08,32524673\n22-Jun-11,15.29,15.53,15.19,15.22,30154648\n21-Jun-11,15.03,15.38,14.91,15.35,17508751\n20-Jun-11,14.66,15.42,14.66,14.99,32653383\n17-Jun-11,14.98,14.98,14.56,14.70,23004121\n16-Jun-11,15.01,15.09,14.65,14.78,24453688\n15-Jun-11,15.01,15.05,14.50,14.81,41286143\n14-Jun-11,15.26,15.56,15.19,15.20,21995251\n13-Jun-11,15.20,15.34,15.10,15.16,14582698\n10-Jun-11,15.27,15.73,15.11,15.20,19455054\n9-Jun-11,15.18,15.33,14.94,15.22,18682381\n8-Jun-11,15.37,15.38,15.08,15.10,21989431\n7-Jun-11,15.54,15.65,15.32,15.44,16516039\n6-Jun-11,15.73,15.85,15.41,15.45,18203316\n3-Jun-11,15.82,16.00,15.63,15.68,22245115\n2-Jun-11,16.00,16.11,15.87,16.02,21009877\n1-Jun-11,16.34,16.43,15.79,15.84,40295512\n31-May-11,16.17,16.59,16.12,16.55,30266543\n27-May-11,16.02,16.02,16.02,16.02,0\n26-May-11,16.18,16.22,15.88,15.98,24006941\n25-May-11,16.19,16.99,16.10,16.15,34172563\n24-May-11,16.11,16.41,16.05,16.14,23153010\n23-May-11,16.05,16.17,16.00,16.06,19252089\n20-May-11,16.32,16.44,16.15,16.30,23582606\n19-May-11,16.05,16.49,16.04,16.35,40356311\n18-May-11,16.07,16.16,15.75,15.96,25880177\n17-May-11,15.88,16.07,15.72,16.00,31576416\n16-May-11,16.68,16.69,15.63,15.81,62094516\n13-May-11,16.14,16.84,15.96,16.55,120057586\n12-May-11,17.12,17.81,16.93,17.17,52984629\n11-May-11,18.45,18.61,16.74,17.20,131204310\n10-May-11,18.67,18.70,18.42,18.55,18475072\n9-May-11,18.60,18.84,18.54,18.56,15597465\n6-May-11,18.59,18.80,18.38,18.65,29694530\n5-May-11,18.12,18.56,18.05,18.43,30757348\n4-May-11,17.99,18.38,17.96,18.20,23586923\n3-May-11,18.23,18.64,17.88,17.92,32627501\n2-May-11,17.79,18.34,17.57,18.14,44036368\n29-Apr-11,17.46,17.77,17.36,17.70,30793842\n28-Apr-11,17.22,17.53,17.17,17.51,14415572\n27-Apr-11,17.30,17.43,17.18,17.26,16642364\n26-Apr-11,17.11,17.37,17.02,17.28,20041256\n25-Apr-11,17.01,17.30,16.90,17.11,17775506\n21-Apr-11,16.85,16.85,16.85,16.85,0\n20-Apr-11,16.70,17.23,16.59,16.87,34319601\n19-Apr-11,16.21,16.36,16.08,16.12,31547353\n18-Apr-11,16.35,16.44,16.06,16.34,21940555\n15-Apr-11,16.64,16.78,16.54,16.62,14757143\n14-Apr-11,16.55,16.82,16.43,16.69,16599422\n13-Apr-11,16.43,16.69,16.43,16.64,16700363\n12-Apr-11,16.55,16.64,16.29,16.36,20169513\n11-Apr-11,16.91,16.96,16.37,16.59,34843436\n8-Apr-11,17.08,17.11,16.77,16.77,13118860\n7-Apr-11,16.91,17.10,16.78,17.00,12780605\n6-Apr-11,17.17,17.20,16.94,17.05,13301365\n5-Apr-11,16.81,17.29,16.79,17.11,18465120\n4-Apr-11,16.90,17.05,16.81,16.87,9568617\n1-Apr-11,16.83,16.98,16.72,16.84,12487345\n31-Mar-11,16.71,16.88,16.65,16.68,15343678\n30-Mar-11,16.83,16.92,16.68,16.74,12947119\n29-Mar-11,16.60,16.78,16.53,16.75,10041057\n28-Mar-11,17.01,17.06,16.58,16.58,16070924\n25-Mar-11,16.94,17.05,16.70,16.96,21047284\n24-Mar-11,16.19,16.91,16.17,16.83,20124174\n23-Mar-11,16.30,16.34,15.98,16.13,30842481\n22-Mar-11,16.29,16.48,16.16,16.36,30699780\n21-Mar-11,16.18,16.50,16.16,16.29,20617035\n18-Mar-11,16.10,16.19,16.01,16.03,26660302\n17-Mar-11,16.16,16.42,15.81,15.86,37553865\n16-Mar-11,16.33,16.48,15.85,15.91,38378465\n15-Mar-11,16.66,16.68,16.04,16.33,51522051\n14-Mar-11,17.24,17.44,17.09,17.31,21584294\n11-Mar-11,17.00,17.54,17.00,17.42,19455986\n10-Mar-11,17.30,17.39,16.93,17.06,25673067\n9-Mar-11,16.89,17.70,16.85,17.65,33807594\n8-Mar-11,16.74,17.02,16.72,16.94,12720392\n7-Mar-11,17.07,17.15,16.49,16.70,18772057\n4-Mar-11,16.75,17.20,16.72,17.08,20275511\n3-Mar-11,16.85,17.04,16.76,16.86,35202055\n2-Mar-11,16.65,16.85,16.60,16.63,24529436\n1-Mar-11,16.46,16.49,16.08,16.10,16702757\n28-Feb-11,16.37,16.60,16.28,16.40,20210206\n25-Feb-11,16.39,16.77,16.38,16.50,16939515\n24-Feb-11,16.66,16.73,16.04,16.37,31570331\n23-Feb-11,17.03,17.10,16.35,16.58,35225045\n22-Feb-11,17.08,17.39,16.87,16.90,34768084\n18-Feb-11,17.66,17.66,17.66,17.66,0\n17-Feb-11,17.75,17.82,17.50,17.77,23566561\n16-Feb-11,17.23,17.82,17.21,17.76,41824091\n15-Feb-11,16.80,17.39,16.78,17.20,31404844\n14-Feb-11,16.84,16.93,16.72,16.89,14502978\n11-Feb-11,16.58,16.86,16.54,16.85,15386260\n10-Feb-11,16.39,16.72,16.35,16.62,15430411\n9-Feb-11,16.54,16.70,16.35,16.43,17785773\n8-Feb-11,16.83,16.85,16.48,16.60,17931945\n7-Feb-11,16.81,17.00,16.77,16.80,16046409\n4-Feb-11,16.74,16.91,16.45,16.78,19127852\n3-Feb-11,16.48,16.91,16.40,16.69,33314581\n2-Feb-11,16.25,16.66,16.25,16.57,21106744\n1-Feb-11,16.33,16.46,16.23,16.38,26938822\n31-Jan-11,15.82,16.20,15.79,16.12,22911363\n28-Jan-11,16.15,16.21,15.68,15.83,24736190\n27-Jan-11,15.58,16.36,15.58,16.20,39066928\n26-Jan-11,15.93,16.05,15.41,15.57,49690763\n25-Jan-11,16.17,16.19,15.85,16.02,26673037\n24-Jan-11,16.00,16.24,15.76,16.09,23375261\n21-Jan-11,16.27,16.31,15.93,15.96,23372818\n20-Jan-11,16.29,16.33,16.09,16.23,14622699\n19-Jan-11,16.49,16.55,16.23,16.31,17129910\n18-Jan-11,16.62,16.68,16.42,16.50,21393613\n14-Jan-11,16.81,16.81,16.81,16.81,0\n13-Jan-11,16.64,16.92,16.57,16.75,15967199\n12-Jan-11,16.71,16.81,16.59,16.65,15073536\n11-Jan-11,16.70,16.73,16.53,16.58,14615651\n10-Jan-11,16.78,16.80,16.50,16.60,16176687\n7-Jan-11,17.03,17.17,16.65,16.90,19872124\n6-Jan-11,16.90,17.34,16.77,17.06,30666738\n5-Jan-11,16.55,16.91,16.34,16.91,23447604\n4-Jan-11,16.71,16.83,16.57,16.59,11098025\n3-Jan-11,16.81,16.94,16.67,16.75,17689296\n31-Dec-10,16.74,16.76,16.47,16.63,7760301\n30-Dec-10,16.60,16.77,16.52,16.76,8320832\n29-Dec-10,16.50,16.77,16.43,16.61,7668537\n28-Dec-10,16.47,16.54,16.33,16.43,8394174\n27-Dec-10,16.62,16.63,16.40,16.48,7492301\n23-Dec-10,16.72,16.72,16.72,16.72,0\n22-Dec-10,16.67,16.78,16.56,16.63,6769290\n21-Dec-10,16.31,16.68,16.20,16.60,11394674\n20-Dec-10,16.38,16.42,16.15,16.28,17566329\n17-Dec-10,16.51,16.66,16.32,16.38,24896080\n16-Dec-10,16.45,16.70,16.44,16.51,12943978\n15-Dec-10,16.55,16.73,16.42,16.45,10944181\n14-Dec-10,16.77,16.84,16.57,16.63,11601566\n13-Dec-10,16.90,16.99,16.69,16.70,12755317\n10-Dec-10,16.97,17.05,16.91,17.01,8985247\n9-Dec-10,17.12,17.19,16.80,16.95,8676910\n8-Dec-10,17.01,17.22,16.96,17.02,21773286\n7-Dec-10,16.50,17.07,16.50,16.94,29062471\n6-Dec-10,16.47,16.60,16.30,16.33,12063757\n3-Dec-10,16.27,16.37,16.20,16.35,9227938\n2-Dec-10,16.20,16.41,16.12,16.33,13349228\n1-Dec-10,16.00,16.40,16.00,16.15,17435891\n30-Nov-10,16.20,16.34,15.77,15.82,24981083\n29-Nov-10,16.10,16.45,15.95,16.38,14655612\n26-Nov-10,16.25,16.40,16.22,16.22,4953838\n24-Nov-10,16.41,16.41,16.41,16.41,0\n23-Nov-10,16.34,16.43,16.04,16.19,22947788\n22-Nov-10,16.43,16.65,16.25,16.56,14316867\n19-Nov-10,16.97,16.97,16.52,16.57,24036919\n18-Nov-10,16.40,17.17,16.29,16.99,46508945\n17-Nov-10,16.21,16.33,16.11,16.15,10311449\n16-Nov-10,16.45,16.49,16.10,16.24,23493653\n15-Nov-10,16.56,16.89,16.33,16.60,18934576\n12-Nov-10,16.65,16.75,16.40,16.55,17703316\n11-Nov-10,16.63,16.86,16.52,16.80,15312871\n10-Nov-10,17.00,17.01,16.75,16.94,17012581\n9-Nov-10,17.22,17.60,16.86,16.97,56225700\n8-Nov-10,16.47,16.50,16.25,16.44,15569519\n5-Nov-10,16.18,16.40,16.18,16.26,13413950\n4-Nov-10,16.31,16.35,16.02,16.20,26488258\n3-Nov-10,16.21,16.23,16.01,16.17,17325434\n2-Nov-10,16.29,16.40,16.18,16.19,9966887\n1-Nov-10,16.50,16.52,16.08,16.15,14362454\n29-Oct-10,16.37,16.52,16.33,16.49,16013622\n28-Oct-10,16.45,16.45,16.31,16.40,12689468\n27-Oct-10,16.40,16.43,16.20,16.42,13771586\n26-Oct-10,16.22,16.48,16.20,16.46,22348956\n25-Oct-10,16.30,16.44,16.15,16.40,17256584\n22-Oct-10,15.90,16.41,15.86,16.30,24268983\n21-Oct-10,15.90,16.00,15.73,15.97,26935486\n20-Oct-10,15.79,16.25,15.78,15.80,37790173\n19-Oct-10,15.73,15.80,15.37,15.49,32678524\n18-Oct-10,16.20,16.28,15.75,15.92,36320900\n15-Oct-10,16.17,16.73,15.90,16.25,58481713\n14-Oct-10,16.75,16.76,15.75,15.93,123448885\n13-Oct-10,14.57,15.48,14.50,15.25,50773328\n12-Oct-10,14.36,14.47,14.27,14.43,12465695\n11-Oct-10,14.45,14.58,14.38,14.41,8348179\n8-Oct-10,14.21,14.56,14.18,14.49,16102825\n7-Oct-10,14.60,14.61,14.14,14.23,18068508\n6-Oct-10,14.60,14.70,14.34,14.52,20296970\n5-Oct-10,14.45,14.77,14.40,14.61,23991894\n4-Oct-10,14.20,14.32,14.13,14.28,20557468\n1-Oct-10,14.19,14.35,14.13,14.27,16096442\n30-Sep-10,14.26,14.35,13.99,14.17,20376105\n29-Sep-10,14.36,14.39,14.06,14.34,24475653\n28-Sep-10,14.33,14.45,14.14,14.39,16074055\n27-Sep-10,14.46,14.52,14.25,14.28,20678053\n24-Sep-10,14.30,14.51,14.24,14.50,24154784\n23-Sep-10,13.93,14.24,13.93,14.17,16931677\n22-Sep-10,14.19,14.25,13.96,14.04,18567436\n21-Sep-10,13.94,14.26,13.92,14.18,32428794\n20-Sep-10,13.95,14.06,13.84,13.86,26684166\n17-Sep-10,14.33,14.33,13.88,13.89,79565378\n16-Sep-10,14.20,14.23,13.98,14.19,27281440\n15-Sep-10,14.03,14.35,13.77,14.27,90037963\n14-Sep-10,13.76,13.76,13.60,13.63,23071935\n13-Sep-10,13.83,13.88,13.61,13.73,24261381\n10-Sep-10,13.68,13.77,13.54,13.68,18590129\n9-Sep-10,13.88,13.92,13.57,13.65,17735433\n8-Sep-10,13.66,13.82,13.62,13.75,12102685\n7-Sep-10,13.56,13.62,13.50,13.53,10240564\n6-Sep-10,13.62,13.62,13.62,13.62,0\n3-Sep-10,13.62,13.62,13.62,13.62,0\n2-Sep-10,13.33,13.54,13.26,13.51,18190184\n1-Sep-10,13.20,13.41,13.13,13.37,24616666\n31-Aug-10,13.11,13.14,12.94,13.11,16489625\n30-Aug-10,13.27,13.42,13.18,13.18,7120822\n27-Aug-10,13.24,13.47,13.16,13.43,12705926\n26-Aug-10,13.36,13.40,13.21,13.21,14602686\n25-Aug-10,13.29,13.31,13.14,13.26,15560748\n24-Aug-10,13.53,13.64,13.39,13.40,13426732\n23-Aug-10,13.81,13.84,13.54,13.65,12297592\n20-Aug-10,13.85,13.95,13.74,13.79,17192752\n19-Aug-10,13.85,14.00,13.80,13.85,14100653\n18-Aug-10,13.98,14.05,13.85,13.99,15540269\n17-Aug-10,13.84,14.00,13.75,13.94,13298852\n16-Aug-10,13.75,13.90,13.70,13.79,11416375\n13-Aug-10,13.81,13.96,13.76,13.83,7845583\n12-Aug-10,13.77,13.99,13.75,13.85,11662419\n11-Aug-10,14.14,14.20,13.84,13.87,13243119\n10-Aug-10,14.26,14.46,14.20,14.35,9657902\n9-Aug-10,14.34,14.52,14.34,14.40,12204084\n6-Aug-10,14.06,14.38,14.00,14.34,13394783\n5-Aug-10,14.16,14.25,14.02,14.16,13076154\n4-Aug-10,14.00,14.20,13.92,14.18,14298334\n3-Aug-10,13.95,14.07,13.91,13.94,14098558\n2-Aug-10,14.01,14.08,13.96,14.00,14167113\n30-Jul-10,13.69,13.98,13.68,13.88,18380348\n29-Jul-10,13.90,13.96,13.75,13.76,16702993\n28-Jul-10,13.91,13.99,13.85,13.87,13522529\n27-Jul-10,14.07,14.10,13.89,13.95,20973423\n26-Jul-10,13.96,14.22,13.95,14.15,23247802\n23-Jul-10,13.78,14.04,13.52,13.99,34318352\n22-Jul-10,13.89,14.17,13.81,13.88,42677531\n21-Jul-10,14.27,14.28,13.75,13.91,78035738\n20-Jul-10,14.99,15.28,14.80,15.20,29578247\n19-Jul-10,15.23,15.38,15.02,15.10,16168200\n16-Jul-10,15.33,15.37,13.86,14.90,16829741\n15-Jul-10,15.31,15.39,15.04,15.37,12626558\n14-Jul-10,15.32,15.42,15.20,15.37,12255690\n13-Jul-10,15.06,15.60,14.99,15.52,22328766\n12-Jul-10,14.93,15.21,14.78,14.94,15587186\n9-Jul-10,14.60,14.93,14.59,14.89,12683147\n8-Jul-10,14.43,14.77,14.40,14.60,17089452\n7-Jul-10,14.18,14.42,14.12,14.40,17421765\n6-Jul-10,14.23,14.46,14.00,14.13,17337419\n5-Jul-10,14.07,14.07,14.07,14.07,0\n2-Jul-10,14.07,14.07,14.07,14.07,0\n1-Jul-10,13.99,14.15,13.75,14.09,33223141\n30-Jun-10,13.95,14.22,13.79,13.84,23920621\n29-Jun-10,14.53,14.54,13.88,14.04,31829700\n28-Jun-10,14.83,14.86,14.58,14.73,8252794\n25-Jun-10,14.86,14.92,14.57,14.81,29818499\n24-Jun-10,15.11,15.19,14.70,14.83,18300774\n23-Jun-10,15.14,15.39,14.95,15.23,13374351\n22-Jun-10,15.24,15.51,15.07,15.09,22419941\n21-Jun-10,15.71,15.84,15.09,15.21,20412770\n18-Jun-10,15.66,15.67,15.47,15.54,12767019\n17-Jun-10,15.72,15.72,15.44,15.60,10769222\n16-Jun-10,15.58,15.65,15.34,15.49,15922252\n15-Jun-10,15.29,15.69,15.23,15.65,13891667\n14-Jun-10,15.46,15.49,15.15,15.17,12498282\n11-Jun-10,15.02,15.35,14.98,15.29,14056715\n10-Jun-10,14.94,15.14,14.87,15.10,21249060\n9-Jun-10,14.93,15.06,14.65,14.69,18110456\n8-Jun-10,15.05,15.12,14.62,14.79,35500617\n7-Jun-10,15.19,15.36,14.94,14.94,19153152\n4-Jun-10,15.12,15.38,14.96,15.00,23606399\n3-Jun-10,15.32,15.50,15.16,15.43,28401931\n2-Jun-10,15.04,15.20,14.96,15.18,24996434\n1-Jun-10,15.31,15.55,14.98,15.02,30475455\n31-May-10,15.34,15.34,15.34,15.34,0\n28-May-10,15.34,15.34,15.34,15.34,0\n27-May-10,15.83,15.84,15.36,15.69,31095264\n26-May-10,15.60,15.83,15.43,15.45,33663236\n25-May-10,15.04,15.31,14.89,15.31,27856298\n24-May-10,15.42,15.79,15.36,15.54,20116748\n21-May-10,14.81,15.90,14.63,15.48,31215253\n20-May-10,15.45,15.49,15.06,15.10,33788983\n19-May-10,15.83,16.00,15.51,15.79,20485791\n18-May-10,16.27,16.44,15.95,16.03,16189395\n17-May-10,16.41,16.47,15.96,16.27,21951966\n14-May-10,16.51,16.66,16.14,16.39,28111343\n13-May-10,16.49,16.50,16.08,16.14,15363798\n12-May-10,16.45,16.50,16.33,16.47,16405838\n11-May-10,15.95,16.64,15.91,16.41,27796495\n10-May-10,16.04,16.83,16.00,16.33,28108743\n7-May-10,15.77,15.95,15.25,15.29,43940960\n6-May-10,16.34,16.51,15.43,15.92,32125771\n5-May-10,16.17,16.70,16.11,16.49,23004199\n4-May-10,16.63,16.90,16.25,16.32,31382682\n3-May-10,16.68,16.98,16.56,16.95,18162340\n30-Apr-10,17.11,17.13,16.53,16.53,19688119\n29-Apr-10,16.82,17.05,16.78,16.97,16792947\n28-Apr-10,16.98,17.00,16.63,16.75,26462001\n27-Apr-10,17.28,17.36,16.88,16.92,22851487\n26-Apr-10,17.69,17.72,17.34,17.39,17369309\n23-Apr-10,17.71,17.83,17.50,17.64,18902572\n22-Apr-10,17.37,17.78,17.15,17.72,36235595\n21-Apr-10,17.58,17.78,17.30,17.45,71686144\n20-Apr-10,18.50,18.52,18.22,18.38,39171899\n19-Apr-10,18.01,18.40,17.99,18.39,26973420\n16-Apr-10,18.67,18.68,17.96,18.17,51429557\n15-Apr-10,18.30,19.12,18.13,18.97,60024643\n14-Apr-10,18.15,18.47,18.06,18.38,41028485\n13-Apr-10,17.51,18.30,17.40,18.18,47517352\n12-Apr-10,17.52,17.88,17.41,17.64,22832954\n9-Apr-10,17.42,18.07,17.24,17.52,47732998\n8-Apr-10,16.91,17.41,16.90,17.35,45369131\n7-Apr-10,16.78,16.92,16.76,16.87,19926465\n6-Apr-10,16.55,16.98,16.42,16.92,25696677\n5-Apr-10,16.39,16.56,16.30,16.51,9226094\n2-Apr-10,16.29,16.29,16.29,16.29,0\n1-Apr-10,16.29,16.29,16.29,16.29,0\n31-Mar-10,16.45,16.58,16.42,16.53,11997247\n30-Mar-10,16.55,16.69,16.39,16.61,16204015\n29-Mar-10,16.48,16.68,16.47,16.56,14903382\n26-Mar-10,16.34,16.57,16.31,16.54,23224833\n25-Mar-10,16.17,16.59,16.14,16.32,27488975\n24-Mar-10,16.10,16.20,15.92,16.09,32722173\n23-Mar-10,16.34,16.34,15.97,16.03,31882415\n22-Mar-10,16.37,16.54,16.32,16.34,18748282\n19-Mar-10,16.62,16.81,16.34,16.44,17870954\n18-Mar-10,16.46,16.57,16.32,16.56,12628443\n17-Mar-10,16.28,16.63,16.28,16.50,13754520\n16-Mar-10,16.47,16.59,16.23,16.36,18312751\n15-Mar-10,16.35,16.64,16.28,16.46,18967703\n12-Mar-10,16.51,16.59,16.26,16.32,23107144\n11-Mar-10,16.57,16.65,16.10,16.53,21732897\n10-Mar-10,16.51,16.94,16.51,16.79,33089430\n9-Mar-10,16.41,16.72,16.40,16.53,20760273\n8-Mar-10,16.32,16.61,16.30,16.52,30559715\n5-Mar-10,15.89,16.38,15.89,16.06,21423373\n4-Mar-10,15.55,15.85,15.52,15.81,22906138\n3-Mar-10,15.85,15.85,15.55,15.57,20614299\n2-Mar-10,15.87,15.96,15.67,15.73,20102047\n1-Mar-10,15.43,15.83,15.40,15.79,17239356\n26-Feb-10,15.27,15.41,15.16,15.31,14975622\n25-Feb-10,15.32,15.35,15.13,15.24,20128844\n24-Feb-10,15.48,15.71,15.33,15.59,19285254\n23-Feb-10,15.45,15.51,15.14,15.38,18347050\n22-Feb-10,15.61,15.68,15.44,15.49,10463698\n19-Feb-10,15.49,15.71,15.32,15.58,15409017\n18-Feb-10,15.40,15.60,15.32,15.54,13704778\n17-Feb-10,15.50,15.52,15.32,15.44,12732860\n16-Feb-10,15.23,15.48,15.18,15.41,21453147\n15-Feb-10,15.17,15.17,15.17,15.17,0\n12-Feb-10,15.17,15.17,15.17,15.17,0\n11-Feb-10,14.87,15.25,14.76,15.22,24510127\n10-Feb-10,15.02,15.02,14.48,14.80,36518008\n9-Feb-10,15.20,15.24,14.94,15.07,16716845\n8-Feb-10,15.18,15.47,14.95,14.99,19856359\n5-Feb-10,15.01,15.25,14.92,15.19,20713744\n4-Feb-10,15.34,15.52,14.99,15.01,27668017\n3-Feb-10,15.12,15.60,15.12,15.46,24730564\n2-Feb-10,15.10,15.32,15.03,15.17,27556624\n1-Feb-10,15.14,15.30,14.87,15.05,29865661\n29-Jan-10,15.51,15.67,14.90,15.01,39667312\n28-Jan-10,15.93,15.96,15.44,15.44,30159437\n27-Jan-10,16.46,16.49,15.77,15.98,41700911\n26-Jan-10,15.82,16.17,15.70,15.99,43979302\n25-Jan-10,16.07,16.11,15.74,15.86,19683693\n22-Jan-10,16.08,16.21,15.81,15.88,25135493\n21-Jan-10,16.39,16.58,16.10,16.20,21860505\n20-Jan-10,16.65,16.68,16.25,16.38,14421141\n19-Jan-10,16.78,16.96,16.64,16.75,15182984\n18-Jan-10,16.82,16.82,16.82,16.82,0\n15-Jan-10,16.82,16.82,16.82,16.82,0\n14-Jan-10,16.81,17.23,16.80,17.12,16717061\n13-Jan-10,16.88,16.98,16.65,16.90,16961731\n12-Jan-10,16.65,16.86,16.60,16.68,15674461\n11-Jan-10,16.77,16.83,16.48,16.74,16185267\n8-Jan-10,16.68,16.76,16.62,16.70,15471074\n7-Jan-10,16.81,16.90,16.57,16.70,31816301\n6-Jan-10,17.17,17.30,17.07,17.17,16421960\n5-Jan-10,17.22,17.23,17.00,17.23,11718126\n4-Jan-10,16.94,17.20,16.88,17.10,16588957\n1-Jan-10,16.78,16.78,16.78,16.78,0\n31-Dec-09,16.78,16.78,16.78,16.78,0\n30-Dec-09,16.83,16.99,16.81,16.98,8188504\n29-Dec-09,16.84,16.97,16.68,16.92,13450109\n28-Dec-09,16.74,16.94,16.68,16.88,11504227\n25-Dec-09,16.72,16.72,16.72,16.72,0\n24-Dec-09,16.69,16.75,16.65,16.72,4736535\n23-Dec-09,16.35,16.70,16.00,16.67,23584894\n22-Dec-09,15.88,16.08,15.82,15.98,10634595\n21-Dec-09,16.11,16.17,15.85,15.88,17809025\n18-Dec-09,15.94,16.14,15.78,16.14,30021013\n17-Dec-09,15.72,15.96,15.64,15.82,26156659\n16-Dec-09,15.57,15.82,15.47,15.79,20640271\n15-Dec-09,15.77,15.88,15.65,15.74,13278173\n14-Dec-09,15.90,15.97,15.64,15.81,18087089\n11-Dec-09,15.85,15.90,15.62,15.74,22607415\n10-Dec-09,15.34,15.57,15.24,15.49,18743964\n9-Dec-09,15.52,15.54,15.12,15.18,25397825\n8-Dec-09,15.45,15.90,15.23,15.45,31160553\n7-Dec-09,15.36,15.65,15.32,15.45,18036602\n4-Dec-09,15.32,15.38,15.00,15.19,17578467\n3-Dec-09,15.33,15.38,15.10,15.11,17196452\n2-Dec-09,15.17,15.50,15.16,15.31,17807755\n1-Dec-09,15.03,15.19,14.85,15.13,17096457\n30-Nov-09,14.90,15.10,14.80,14.97,17589238\n27-Nov-09,15.04,15.09,14.88,15.00,11452844\n26-Nov-09,15.30,15.30,15.30,15.30,0\n25-Nov-09,15.29,15.35,15.17,15.30,21370526\n24-Nov-09,15.38,15.49,15.20,15.24,19773958\n23-Nov-09,15.58,15.65,15.34,15.45,24502832\n20-Nov-09,15.60,15.74,15.36,15.38,16129962\n19-Nov-09,15.83,15.85,15.52,15.61,26890975\n18-Nov-09,16.02,16.13,15.84,15.98,12776236\n17-Nov-09,15.89,16.11,15.73,16.05,22256204\n16-Nov-09,16.08,16.19,15.92,16.07,26125285\n13-Nov-09,16.04,16.10,15.92,15.93,26453749\n12-Nov-09,16.10,16.28,15.97,16.00,10210238\n11-Nov-09,16.00,16.16,15.92,16.09,16352278\n10-Nov-09,16.08,16.36,16.01,16.04,24103570\n9-Nov-09,16.13,16.19,15.97,16.02,14837481\n6-Nov-09,15.89,16.03,15.76,15.94,13564585\n5-Nov-09,15.80,16.00,15.74,15.90,27738669\n4-Nov-09,15.90,15.90,15.66,15.69,18698223\n3-Nov-09,15.71,15.78,15.63,15.70,17242904\n2-Nov-09,15.75,15.90,15.59,15.85,15259155\n30-Oct-09,16.06,16.37,15.80,15.90,22321660\n29-Oct-09,16.19,16.38,15.74,16.13,39146661\n28-Oct-09,16.69,16.77,16.02,16.04,25048248\n27-Oct-09,16.69,16.87,16.35,16.69,19917748\n26-Oct-09,17.05,17.20,16.67,16.87,21215853\n23-Oct-09,17.71,17.75,17.09,17.22,17760359\n22-Oct-09,17.54,17.75,17.30,17.67,16018021\n21-Oct-09,17.98,18.02,17.57,17.66,46204426\n20-Oct-09,17.37,17.41,16.87,17.17,38320395\n19-Oct-09,16.80,17.29,16.70,17.22,17878001\n16-Oct-09,16.61,16.85,16.40,16.81,20486260\n15-Oct-09,16.84,16.89,16.46,16.52,24343376\n14-Oct-09,16.93,17.03,16.82,16.95,17511688\n13-Oct-09,16.95,17.00,16.81,16.88,19492421\n12-Oct-09,16.96,17.11,16.66,16.75,16913600\n9-Oct-09,17.43,17.48,16.84,16.87,29015624\n8-Oct-09,17.63,17.86,17.54,17.58,27966814\n7-Oct-09,17.22,17.49,17.15,17.49,12463817\n6-Oct-09,16.96,17.35,16.95,17.30,21430235\n5-Oct-09,16.85,17.12,16.66,16.80,22225889\n2-Oct-09,17.23,17.35,16.78,16.84,32685224\n1-Oct-09,17.65,17.72,17.20,17.39,24880103\n30-Sep-09,17.48,17.94,17.24,17.81,39880782\n29-Sep-09,17.50,17.66,17.21,17.45,31602212\n28-Sep-09,16.98,17.47,16.95,17.47,26415897\n25-Sep-09,16.80,17.15,16.75,17.08,20701373\n24-Sep-09,17.31,17.32,16.65,16.89,26502552\n23-Sep-09,17.10,17.60,16.97,17.20,36289226\n22-Sep-09,17.17,17.22,16.75,16.86,30592801\n21-Sep-09,17.23,17.23,16.96,17.04,26826877\n18-Sep-09,17.70,17.70,16.85,17.39,86412574\n17-Sep-09,17.00,17.79,16.96,17.50,62009941\n16-Sep-09,16.57,17.11,16.52,16.99,53594701\n15-Sep-09,16.01,16.49,15.87,16.41,64668146\n14-Sep-09,15.45,15.58,15.28,15.57,19451186\n11-Sep-09,15.53,15.68,15.41,15.59,26862553\n10-Sep-09,15.28,15.63,15.15,15.45,49083235\n9-Sep-09,14.45,14.86,14.42,14.78,19096259\n8-Sep-09,14.65,14.66,14.37,14.49,17714746\n4-Sep-09,14.26,14.64,14.23,14.50,17003839\n3-Sep-09,14.36,14.43,14.16,14.28,14663635\n2-Sep-09,14.08,14.33,13.97,14.23,23591415\n1-Sep-09,14.50,14.68,14.15,14.18,30623369\n31-Aug-09,14.74,14.80,14.56,14.61,15420443\n28-Aug-09,14.98,15.08,14.80,14.85,33924252\n27-Aug-09,14.92,15.00,14.71,14.93,30410988\n26-Aug-09,15.09,15.14,14.86,14.93,15845241\n25-Aug-09,15.12,15.21,14.94,15.07,22850538\n24-Aug-09,14.89,15.19,14.83,14.99,26170903\n21-Aug-09,14.88,14.96,14.73,14.79,23545970\n20-Aug-09,14.75,14.90,14.70,14.77,15586211\n19-Aug-09,14.58,14.91,14.55,14.79,15507192\n18-Aug-09,14.64,14.78,14.56,14.75,14799689\n17-Aug-09,14.69,14.78,14.51,14.56,29268240\n14-Aug-09,14.98,15.14,14.85,15.04,28817005\n13-Aug-09,14.74,15.07,14.61,15.04,40192992\n12-Aug-09,14.47,14.76,14.41,14.68,24256175\n10-Aug-09,14.66,14.68,14.49,14.63,18359171\n7-Aug-09,14.86,14.90,14.56,14.62,28276698\n6-Aug-09,14.76,14.86,14.63,14.74,35659431\n5-Aug-09,14.76,14.91,14.61,14.67,50910089\n4-Aug-09,14.44,14.68,14.37,14.51,43084746\n3-Aug-09,14.56,14.62,14.30,14.34,43976838\n31-Jul-09,14.72,14.89,14.29,14.32,62659854\n30-Jul-09,15.13,15.14,14.24,14.60,100888920\n29-Jul-09,16.00,16.20,15.05,15.14,126807667\n28-Jul-09,16.97,17.49,16.52,17.22,36152567\n27-Jul-09,17.37,17.48,16.85,17.00,19951723\n24-Jul-09,17.43,17.59,17.02,17.48,19944657\n23-Jul-09,17.41,17.68,17.16,17.36,37524869\n22-Jul-09,16.19,17.48,16.12,17.37,53615437\n21-Jul-09,17.05,17.11,16.44,16.75,33601771\n20-Jul-09,17.18,17.43,16.65,17.01,27760787\n17-Jul-09,16.75,16.91,16.45,16.84,32514656\n16-Jul-09,15.80,16.25,15.78,16.19,21928540\n15-Jul-09,15.23,15.74,15.15,15.71,18816735\n14-Jul-09,15.07,15.22,14.98,15.18,13039836\n13-Jul-09,14.95,15.06,14.64,15.01,13179573\n10-Jul-09,14.78,15.18,14.75,14.93,23061132\n9-Jul-09,14.48,14.68,14.25,14.55,15601730\n8-Jul-09,14.44,14.69,14.22,14.38,15353613\n7-Jul-09,14.92,14.93,14.36,14.44,22027011\n6-Jul-09,14.83,14.93,14.55,14.91,13691597\n3-Jul-09,14.99,14.99,14.99,14.99,0\n2-Jul-09,15.24,15.28,14.88,14.99,16920572\n1-Jul-09,15.49,15.69,15.35,15.41,12723625\n30-Jun-09,15.85,15.90,15.35,15.66,16039642\n29-Jun-09,15.86,16.01,15.60,15.90,12323984\n26-Jun-09,15.60,15.80,15.48,15.74,26456759\n25-Jun-09,15.44,15.67,15.24,15.53,19775031\n24-Jun-09,14.76,15.60,14.76,15.45,30986117\n23-Jun-09,14.75,14.90,14.55,14.68,15871209\n22-Jun-09,15.55,15.61,14.71,14.71,26495683\n19-Jun-09,15.50,15.84,15.40,15.80,20326040\n18-Jun-09,15.62,15.64,15.23,15.34,16189293\n17-Jun-09,15.91,16.03,15.46,15.60,16521210\n16-Jun-09,16.33,16.38,15.90,15.96,15122429\n15-Jun-09,16.56,16.68,16.13,16.40,23261700\n12-Jun-09,16.17,16.47,16.10,16.40,16971672\n11-Jun-09,16.26,16.46,16.15,16.19,15042278\n10-Jun-09,16.70,16.72,16.10,16.32,15771103\n9-Jun-09,16.23,16.50,16.18,16.40,13091109\n8-Jun-09,16.47,16.49,16.04,16.19,13692513\n5-Jun-09,16.77,16.99,16.30,16.64,17317653\n4-Jun-09,16.40,16.71,16.04,16.65,19003422\n3-Jun-09,16.50,16.50,15.67,16.30,26367679\n2-Jun-09,16.60,16.75,16.25,16.62,15288130\n1-Jun-09,16.17,16.65,16.13,16.58,27930696\n29-May-09,15.19,15.84,15.11,15.84,29560527\n28-May-09,15.09,15.24,14.69,15.09,19131516\n27-May-09,15.27,15.53,14.88,14.94,19014266\n26-May-09,14.68,15.44,14.67,15.28,19954446\n22-May-09,14.89,15.17,14.75,14.98,19150470\n21-May-09,14.92,15.12,14.62,14.87,15189453\n20-May-09,15.08,15.31,14.80,14.96,15787480\n19-May-09,15.06,15.34,15.02,15.18,13675966\n18-May-09,15.10,15.18,14.74,15.17,18629457\n15-May-09,15.00,15.10,14.86,14.91,22525850\n14-May-09,14.50,14.86,14.40,14.76,20841712\n13-May-09,14.92,14.95,14.50,14.52,23585317\n12-May-09,15.50,15.50,14.90,15.10,31403299\n11-May-09,14.90,15.83,14.81,15.54,39492329\n8-May-09,14.88,15.30,14.70,15.15,22464694\n7-May-09,15.03,15.10,14.38,14.80,24328416\n6-May-09,14.80,15.00,14.52,14.85,19105745\n5-May-09,14.55,14.99,14.18,14.74,35239690\n4-May-09,14.20,14.25,13.96,14.18,25094513\n1-May-09,14.50,14.50,13.91,14.14,23724750\n30-Apr-09,14.12,14.60,14.12,14.29,25883251\n29-Apr-09,13.70,14.35,13.70,14.02,16570838\n28-Apr-09,13.74,14.05,13.60,13.64,18861105\n27-Apr-09,14.48,14.55,13.88,13.89,22640555\n24-Apr-09,14.79,14.94,14.36,14.73,25802914\n23-Apr-09,14.56,14.74,14.11,14.55,32943107\n22-Apr-09,14.62,15.39,14.41,14.48,65407723\n21-Apr-09,13.94,14.59,13.71,14.38,54237647\n20-Apr-09,14.16,14.25,13.60,13.66,13477019\n17-Apr-09,14.43,14.52,14.03,14.39,19804602\n16-Apr-09,14.15,14.53,14.05,14.43,19156404\n15-Apr-09,13.93,14.09,13.77,14.02,12385282\n14-Apr-09,14.40,14.42,14.00,14.07,15160649\n13-Apr-09,14.02,14.54,13.86,14.42,35076505\n10-Apr-09,13.47,13.47,13.47,13.47,0\n9-Apr-09,13.14,13.59,13.07,13.47,17286715\n8-Apr-09,12.90,13.01,12.75,12.92,11245081\n7-Apr-09,13.00,13.10,12.68,12.81,12306396\n6-Apr-09,13.08,13.24,12.99,13.23,11935651\n3-Apr-09,12.95,13.39,12.78,13.34,17821128\n2-Apr-09,13.04,13.14,12.80,12.95,28823034\n1-Apr-09,12.70,13.12,12.60,12.75,14542683\n31-Mar-09,12.76,13.10,12.67,12.81,12065933\n30-Mar-09,12.92,13.14,12.51,12.70,16561739\n27-Mar-09,13.17,13.61,13.12,13.18,22430236\n26-Mar-09,13.55,13.61,13.00,13.35,24230289\n25-Mar-09,13.69,13.88,13.35,13.55,16758515\n24-Mar-09,13.98,14.02,13.56,13.61,17439714\n23-Mar-09,13.79,14.12,13.62,14.09,18202651\n20-Mar-09,13.63,13.87,13.51,13.60,22081704\n19-Mar-09,13.68,14.14,13.60,13.74,25959109\n18-Mar-09,13.81,13.95,13.23,13.42,26331039\n17-Mar-09,13.35,14.04,13.22,13.99,17553386\n16-Mar-09,13.66,13.66,13.20,13.22,19452380\n13-Mar-09,13.58,13.64,13.27,13.51,12524502\n12-Mar-09,13.35,13.60,13.10,13.60,16684508\n11-Mar-09,13.31,13.50,13.03,13.39,17512327\n10-Mar-09,12.81,13.40,12.75,13.23,22733789\n9-Mar-09,12.85,13.45,12.55,12.66,23125091\n6-Mar-09,12.60,13.18,12.52,13.05,30997807\n5-Mar-09,12.77,13.07,12.48,12.53,18477409\n4-Mar-09,12.72,13.49,12.51,13.16,24083874\n3-Mar-09,12.79,12.87,12.31,12.50,16509694\n2-Mar-09,12.85,12.97,12.47,12.58,20932695\n27-Feb-09,12.66,13.33,12.61,13.23,20397659\n26-Feb-09,12.88,13.39,12.74,12.98,26573957\n25-Feb-09,12.45,12.79,12.30,12.48,16197381\n24-Feb-09,12.57,12.86,12.27,12.75,22528906\n23-Feb-09,12.20,12.35,11.83,11.97,16518466\n20-Feb-09,11.90,12.27,11.75,12.14,16468507\n19-Feb-09,12.35,12.59,11.93,11.98,12538054\n18-Feb-09,12.12,12.53,12.07,12.22,12434257\n17-Feb-09,12.31,12.58,12.01,12.02,15709768\n13-Feb-09,12.67,12.99,12.59,12.84,11134047\n12-Feb-09,12.50,12.66,12.14,12.66,15452612\n11-Feb-09,12.87,12.91,12.38,12.63,13729006\n10-Feb-09,13.54,13.90,12.72,12.75,24157045\n9-Feb-09,13.59,14.00,13.47,13.90,15686194\n6-Feb-09,13.41,13.84,13.20,13.63,17594185\n5-Feb-09,12.93,13.52,12.85,13.51,17574570\n4-Feb-09,12.67,13.23,12.55,13.00,22932775\n3-Feb-09,12.30,12.71,12.01,12.68,18673128\n2-Feb-09,11.50,12.32,11.49,12.15,21231852\n30-Jan-09,11.86,12.15,11.51,11.73,21517068\n29-Jan-09,12.02,12.24,11.73,11.74,24796263\n28-Jan-09,12.23,12.38,11.92,12.24,37038661\n27-Jan-09,11.20,11.37,10.85,11.34,33902972\n26-Jan-09,11.26,11.28,10.81,11.17,16699773\n23-Jan-09,10.90,11.55,10.86,11.32,15863989\n22-Jan-09,11.35,11.51,10.90,11.28,17199517\n21-Jan-09,11.17,11.59,11.08,11.59,15917576\n20-Jan-09,11.72,11.80,11.01,11.01,18700653\n16-Jan-09,11.87,11.97,11.44,11.59,24812398\n15-Jan-09,12.32,12.35,11.22,11.61,26150129\n14-Jan-09,12.26,12.53,11.81,12.41,24936727\n13-Jan-09,12.09,12.79,11.78,12.10,25769365\n12-Jan-09,13.09,13.10,12.08,12.22,19982579\n9-Jan-09,13.42,13.56,12.90,13.13,19317389\n8-Jan-09,12.37,13.07,12.31,13.07,14348008\n7-Jan-09,12.71,13.16,12.45,12.71,25302285\n6-Jan-09,12.96,13.24,12.88,13.00,10173926\n5-Jan-09,12.72,13.01,12.39,12.86,12029058\n2-Jan-09,12.17,12.85,12.12,12.85,10213787\n1-Jan-09,12.20,12.20,12.20,12.20,0\n31-Dec-08,11.95,12.30,11.92,12.20,9090875\n30-Dec-08,11.91,12.00,11.72,11.97,7488864\n29-Dec-08,12.46,12.46,11.45,11.88,10472129\n26-Dec-08,12.30,12.38,12.18,12.34,3908236\n25-Dec-08,12.32,12.32,12.32,12.32,0\n24-Dec-08,12.41,12.48,12.29,12.32,2507850\n23-Dec-08,12.47,12.65,12.25,12.42,7706839\n22-Dec-08,13.03,13.08,12.00,12.35,12958323\n19-Dec-08,12.92,13.32,12.72,13.03,17818719\n18-Dec-08,13.13,13.27,12.70,12.72,15012415\n17-Dec-08,13.00,13.43,12.83,13.11,12782927\n16-Dec-08,12.88,13.48,12.88,13.36,18551653\n15-Dec-08,13.10,13.29,12.55,12.73,20132017\n12-Dec-08,12.31,13.23,12.15,13.15,25069562\n11-Dec-08,13.16,13.36,12.57,12.73,27253771\n10-Dec-08,12.67,13.57,12.35,13.40,48058085\n9-Dec-08,11.90,12.54,11.77,12.19,28998182\n8-Dec-08,12.17,12.49,11.79,12.20,33785147\n5-Dec-08,10.96,11.70,10.62,11.66,20902155\n4-Dec-08,11.38,11.48,10.70,11.05,18458289\n3-Dec-08,11.12,11.50,10.74,11.50,24107924\n2-Dec-08,10.81,12.50,10.50,11.50,46296302\n1-Dec-08,11.82,11.98,10.73,10.74,26257579\n28-Nov-08,10.76,11.59,10.65,11.51,12453526\n27-Nov-08,10.58,10.58,10.58,10.58,0\n26-Nov-08,9.93,10.58,9.92,10.58,13654705\n25-Nov-08,10.12,10.20,9.83,10.07,17614807\n24-Nov-08,9.56,10.27,9.42,10.21,22460258\n21-Nov-08,9.28,9.48,8.95,9.39,29909652\n20-Nov-08,9.10,10.01,8.94,8.95,37316961\n19-Nov-08,11.54,11.58,9.07,9.14,57696967\n18-Nov-08,11.93,12.40,11.00,11.55,51686506\n17-Nov-08,10.50,10.94,10.32,10.63,14625723\n14-Nov-08,10.84,11.50,10.63,10.82,19072373\n13-Nov-08,10.32,11.17,9.76,11.15,25228350\n12-Nov-08,11.01,11.34,10.02,10.34,29046620\n11-Nov-08,11.56,11.67,11.06,11.35,33299442\n10-Nov-08,12.37,12.40,11.57,11.87,16798879\n7-Nov-08,12.45,12.50,11.65,12.20,45406800\n6-Nov-08,14.84,14.89,13.75,13.96,41295900\n5-Nov-08,13.21,14.84,13.15,13.92,70132400\n4-Nov-08,13.05,13.49,12.84,13.35,24456900\n3-Nov-08,12.74,12.89,12.55,12.75,9958700\n31-Oct-08,13.09,13.36,12.71,12.82,23451500\n30-Oct-08,12.53,13.18,12.25,12.93,25968200\n29-Oct-08,12.20,12.61,11.92,12.14,21185700\n28-Oct-08,11.89,12.40,11.25,12.36,22205300\n27-Oct-08,11.82,12.19,11.50,11.58,16149300\n24-Oct-08,11.31,12.33,11.31,12.10,26208800\n23-Oct-08,12.15,12.70,11.55,12.65,27118500\n22-Oct-08,12.36,12.84,12.35,12.39,33770300\n21-Oct-08,12.62,12.74,12.04,12.07,24958100\n20-Oct-08,13.03,13.03,12.33,12.86,23914700\n17-Oct-08,12.88,13.50,12.68,12.90,38396500\n16-Oct-08,11.90,13.73,11.37,12.99,7075200\n15-Oct-08,12.49,12.55,11.75,11.75,27111500\n14-Oct-08,13.78,13.93,12.37,12.65,26130200\n13-Oct-08,13.14,13.51,12.56,13.49,25351100\n10-Oct-08,12.22,12.92,11.96,12.29,37789300\n9-Oct-08,13.90,13.90,12.47,12.65,40212000\n8-Oct-08,13.80,14.58,13.20,13.76,31030700\n7-Oct-08,15.19,15.49,14.53,14.58,27041300\n6-Oct-08,15.27,16.07,14.55,15.31,42461700\n3-Oct-08,15.81,16.44,15.75,16.00,25415500\n2-Oct-08,16.77,16.85,15.54,15.58,23065200\n1-Oct-08,17.17,17.31,16.80,16.96,13535700\n30-Sep-08,17.15,17.62,17.00,17.30,17753100\n29-Sep-08,18.77,18.92,16.88,16.88,36630100\n26-Sep-08,18.75,19.25,18.65,18.92,14605400\n25-Sep-08,19.09,19.56,18.97,19.20,14178300\n24-Sep-08,18.90,19.19,18.82,19.15,12553800\n23-Sep-08,18.71,19.13,18.67,18.93,19519200\n22-Sep-08,19.60,19.60,18.64,18.68,16645200\n19-Sep-08,20.58,20.79,19.27,19.89,31015400\n18-Sep-08,18.79,20.82,18.49,20.82,36341400\n17-Sep-08,18.97,19.08,18.20,18.82,28466900\n16-Sep-08,18.25,19.35,18.24,19.26,33149400\n15-Sep-08,18.27,19.14,18.25,18.85,32321000\n12-Sep-08,18.43,19.17,18.34,19.08,21091600\n11-Sep-08,17.40,18.57,17.33,18.55,27495200\n10-Sep-08,17.63,17.79,17.25,17.70,19333900\n9-Sep-08,18.14,18.19,17.53,17.58,25066800\n8-Sep-08,18.33,18.37,17.87,18.26,16223200\n5-Sep-08,17.92,18.34,17.80,18.08,16848000\n4-Sep-08,18.71,18.81,17.75,17.75,23751500\n3-Sep-08,18.85,19.00,18.70,18.76,11468300\n2-Sep-08,19.63,19.77,18.74,18.75,16635700\n29-Aug-08,19.54,19.60,19.28,19.38,10508800\n28-Aug-08,19.48,19.76,19.38,19.65,11562100\n27-Aug-08,19.08,19.45,18.93,19.37,9228500\n26-Aug-08,19.12,19.20,19.00,19.09,8556500\n25-Aug-08,19.34,19.40,19.05,19.09,13510300\n22-Aug-08,19.11,19.68,19.10,19.53,10793000\n21-Aug-08,19.06,19.18,18.86,19.11,16715000\n20-Aug-08,19.57,19.65,19.10,19.17,16192400\n19-Aug-08,19.78,19.91,19.41,19.42,12614400\n18-Aug-08,20.47,20.52,19.66,19.73,13532900\n15-Aug-08,20.27,20.82,20.27,20.44,14768600\n14-Aug-08,20.20,20.57,20.14,20.28,11006200\n13-Aug-08,20.33,20.48,20.06,20.36,11880800\n12-Aug-08,20.21,20.60,20.04,20.43,13732700\n11-Aug-08,19.89,20.28,19.65,20.26,12705300\n8-Aug-08,20.19,20.19,19.87,19.90,13428400\n7-Aug-08,19.80,20.25,19.64,20.19,13844700\n6-Aug-08,19.77,20.18,19.53,20.00,14633300\n5-Aug-08,19.70,19.91,19.53,19.82,14147800\n4-Aug-08,19.77,19.77,19.21,19.38,13943900\n1-Aug-08,20.09,20.12,19.53,19.80,19654700\n31-Jul-08,19.89,20.15,19.85,19.89,16493700\n30-Jul-08,20.18,20.18,19.96,20.03,24816700\n29-Jul-08,20.01,20.34,19.68,20.15,15878200\n28-Jul-08,20.99,21.17,20.06,20.12,13543100\n25-Jul-08,20.55,21.19,20.28,21.13,19687300\n24-Jul-08,20.61,21.06,20.05,20.53,24044300\n23-Jul-08,21.91,22.48,20.00,20.39,43758200\n22-Jul-08,21.39,21.70,20.85,21.40,26301300\n21-Jul-08,21.66,22.19,21.65,21.67,21666300\n18-Jul-08,22.55,22.55,21.86,22.45,21035900\n17-Jul-08,23.49,23.49,22.41,22.44,30050600\n16-Jul-08,21.70,22.60,21.59,22.48,20320600\n15-Jul-08,21.79,22.08,21.18,21.54,24938800\n14-Jul-08,23.12,23.24,22.22,22.57,22339100\n11-Jul-08,23.00,23.89,22.64,23.57,22473800\n10-Jul-08,23.76,24.10,23.04,23.50,17447100\n9-Jul-08,24.74,24.80,23.82,23.82,20826200\n8-Jul-08,23.83,24.66,23.81,24.64,32595200\n7-Jul-08,23.40,24.25,22.92,23.91,78338700\n3-Jul-08,21.35,21.75,21.03,21.35,21444700\n2-Jul-08,21.89,21.90,20.67,20.88,51339800\n1-Jul-08,20.48,20.49,19.59,20.20,36174200\n30-Jun-08,21.12,21.20,20.60,20.66,15960000\n27-Jun-08,21.29,21.46,20.70,21.33,24731900\n26-Jun-08,21.59,21.89,21.28,21.37,23258600\n25-Jun-08,22.00,22.24,21.86,22.01,19070900\n24-Jun-08,21.17,23.71,20.60,22.04,84633300\n23-Jun-08,22.07,22.12,21.30,21.45,29596300\n20-Jun-08,22.49,22.53,21.90,21.99,32866800\n19-Jun-08,22.78,22.87,22.37,22.73,18523700\n18-Jun-08,23.22,23.22,22.63,22.91,14028700\n17-Jun-08,23.58,23.58,22.90,23.25,22487400\n16-Jun-08,22.95,23.58,22.71,23.54,44416600\n13-Jun-08,22.82,23.48,21.75,23.47,15041200\n12-Jun-08,26.33,26.33,22.50,23.52,20761100\n11-Jun-08,26.42,26.46,26.00,26.15,13101200\n10-Jun-08,26.32,26.58,26.25,26.40,11682100\n9-Jun-08,26.50,26.86,26.10,26.58,17139700\n6-Jun-08,26.50,27.08,26.03,26.44,37258000\n5-Jun-08,26.46,26.64,25.97,26.36,29752400\n4-Jun-08,26.25,27.05,26.16,26.85,29472700\n3-Jun-08,26.36,26.60,25.78,26.15,25241700\n2-Jun-08,26.80,26.81,26.03,26.40,26004100\n30-May-08,27.07,27.10,26.63,26.76,17474600\n29-May-08,27.34,27.36,27.00,27.07,17750400\n28-May-08,27.42,27.48,26.95,27.16,20067700\n27-May-08,27.50,27.63,26.98,27.00,19731400\n23-May-08,27.48,27.74,27.26,27.72,23504100\n22-May-08,27.30,27.61,26.95,27.53,18361500\n21-May-08,27.34,27.95,26.80,27.33,37726800\n20-May-08,27.68,28.20,27.32,27.48,28810500\n19-May-08,27.90,28.33,27.42,27.68,47851900\n16-May-08,27.73,27.95,27.41,27.66,52549000\n15-May-08,27.54,27.98,26.85,27.75,76036200\n14-May-08,26.95,27.36,26.20,27.14,61304800\n13-May-08,25.15,26.84,24.39,26.56,80191500\n12-May-08,25.80,25.88,25.02,25.26,40932500\n9-May-08,26.01,26.19,25.75,25.93,29623700\n8-May-08,25.66,26.44,25.51,26.22,59741800\n7-May-08,25.57,25.71,25.03,25.64,83140300\n6-May-08,25.54,26.25,24.20,25.72,68337100\n5-May-08,23.05,24.93,22.97,24.37,42047200\n2-May-08,27.65,29.73,27.21,28.67,76574600\n1-May-08,27.69,28.34,26.50,26.82,51110900\n30-Apr-08,27.17,27.78,26.76,27.41,28284800\n29-Apr-08,26.35,27.48,25.81,27.36,36252100\n28-Apr-08,27.00,27.09,26.25,26.43,20319700\n25-Apr-08,26.85,26.93,26.08,26.80,48859200\n24-Apr-08,28.01,28.08,27.24,27.30,25444400\n23-Apr-08,28.24,28.35,27.71,28.08,30443300\n22-Apr-08,28.73,28.88,28.44,28.54,24586100\n21-Apr-08,28.52,28.68,28.22,28.55,18125100\n18-Apr-08,28.44,28.67,28.17,28.43,24872100\n17-Apr-08,28.40,28.40,27.96,28.03,9765000\n16-Apr-08,28.11,28.40,28.11,28.31,9153700\n15-Apr-08,28.05,28.25,27.77,28.17,11980100\n14-Apr-08,28.18,28.34,27.79,27.80,13195300\n11-Apr-08,28.41,28.61,28.09,28.34,18258500\n10-Apr-08,28.39,28.69,28.28,28.59,29664700\n9-Apr-08,27.80,27.95,27.13,27.77,21706900\n8-Apr-08,27.72,27.82,27.49,27.70,17715400\n7-Apr-08,27.80,28.15,27.57,27.70,27740100\n4-Apr-08,28.00,28.45,27.59,28.36,20423800\n3-Apr-08,27.65,28.22,27.58,28.13,14377500\n2-Apr-08,28.57,28.60,27.49,27.82,29404600\n1-Apr-08,28.07,28.62,28.02,28.50,19439200\n31-Mar-08,28.56,29.12,28.27,28.93,16845800\n28-Mar-08,28.32,29.09,28.15,28.99,33723800\n27-Mar-08,28.49,28.50,27.90,28.09,15404300\n26-Mar-08,28.63,28.78,28.19,28.49,14448200\n25-Mar-08,28.14,28.75,27.70,28.73,30415600\n24-Mar-08,27.56,28.07,27.45,27.52,17142500\n20-Mar-08,27.36,27.91,26.98,27.66,28373700\n19-Mar-08,27.56,27.79,26.91,27.07,22866600\n18-Mar-08,26.94,27.72,26.25,27.66,36740200\n17-Mar-08,26.50,26.64,25.72,25.85,32794000\n14-Mar-08,27.85,27.96,26.50,26.71,43693200\n13-Mar-08,28.07,28.27,27.38,27.50,74654600\n12-Mar-08,28.89,29.02,28.39,28.45,17317800\n11-Mar-08,28.91,29.16,28.43,29.00,21850500\n10-Mar-08,28.87,28.98,28.51,28.51,28430300\n7-Mar-08,28.58,29.18,28.50,29.03,28017300\n6-Mar-08,28.64,28.98,28.44,28.70,33239600\n5-Mar-08,28.00,28.78,28.00,28.67,28602000\n4-Mar-08,27.80,28.07,27.43,28.06,27994000\n3-Mar-08,27.73,28.08,27.66,27.77,22566200\n29-Feb-08,27.94,28.41,27.50,27.78,23530500\n28-Feb-08,27.98,28.82,27.96,28.15,28444900\n27-Feb-08,28.33,28.49,27.75,28.37,27536300\n26-Feb-08,27.93,28.55,27.81,28.22,25540500\n25-Feb-08,28.42,28.57,27.75,28.13,32373200\n22-Feb-08,28.36,28.64,27.98,28.42,25632800\n21-Feb-08,28.76,29.17,28.25,28.42,32406900\n20-Feb-08,28.71,29.04,28.39,28.83,28821900\n19-Feb-08,29.34,29.42,28.75,29.01,37260600\n15-Feb-08,29.94,30.15,29.43,29.66,38717100\n14-Feb-08,29.98,30.25,29.75,29.98,37393700\n13-Feb-08,29.78,30.07,29.60,29.88,55684900\n12-Feb-08,29.81,29.84,29.40,29.57,41304800\n11-Feb-08,29.89,30.05,29.32,29.87,62475100\n8-Feb-08,28.98,29.22,28.71,29.20,54916900\n7-Feb-08,28.63,29.19,28.60,29.04,43825400\n6-Feb-08,29.11,29.33,28.53,28.57,52525500\n5-Feb-08,28.78,29.57,28.75,28.98,66785600\n4-Feb-08,28.33,29.50,28.33,29.33,33515600\n1-Feb-08,28.68,29.83,27.34,28.38,47425500\n31-Jan-08,18.87,19.35,18.72,19.18,39872800\n30-Jan-08,18.62,20.81,18.58,19.05,5909500\n29-Jan-08,20.87,20.90,20.05,20.81,56397300\n28-Jan-08,21.56,21.90,20.42,20.78,31730100\n25-Jan-08,22.24,22.37,21.32,21.94,27749600\n24-Jan-08,20.44,21.75,20.42,21.69,39134200\n23-Jan-08,19.25,20.34,18.72,20.01,40304000\n22-Jan-08,19.29,21.03,19.26,19.92,36993100\n18-Jan-08,21.27,21.61,20.07,20.78,40832700\n17-Jan-08,22.00,22.17,21.14,21.22,28100900\n16-Jan-08,22.20,22.75,21.73,21.95,37570200\n15-Jan-08,23.00,23.48,22.57,22.91,31196800\n14-Jan-08,23.51,23.76,23.18,23.70,18104000\n11-Jan-08,23.81,24.13,22.98,23.36,26430500\n10-Jan-08,23.19,24.57,22.83,24.09,48128300\n9-Jan-08,22.47,22.80,21.37,22.56,46069500\n8-Jan-08,23.28,23.65,22.50,22.61,21823000\n7-Jan-08,23.12,23.56,22.73,23.18,22388000\n4-Jan-08,23.81,23.81,23.10,23.16,20199200\n3-Jan-08,23.86,24.19,23.70,23.84,19833900\n2-Jan-08,23.80,24.15,23.60,23.72,24334400\n31-Dec-07,23.22,23.43,23.11,23.26,14328100\n28-Dec-07,23.66,23.71,23.21,23.45,13393700\n27-Dec-07,23.60,24.15,23.57,23.71,15744300\n26-Dec-07,23.85,24.25,23.85,23.96,9464500\n24-Dec-07,24.01,24.19,23.94,24.05,7950300\n21-Dec-07,23.88,24.10,23.74,24.01,22568300\n20-Dec-07,23.50,23.80,23.24,23.64,20387600\n19-Dec-07,22.92,23.69,22.92,23.31,26422500\n18-Dec-07,23.22,23.35,22.80,23.02,27345200\n17-Dec-07,23.80,24.03,22.94,23.04,35062400\n14-Dec-07,24.13,24.47,24.00,24.06,14988200\n13-Dec-07,24.39,24.75,24.19,24.38,23473300\n12-Dec-07,24.82,25.00,24.11,24.54,13523800\n11-Dec-07,25.15,25.65,24.36,24.47,28161200\n10-Dec-07,25.51,25.57,24.92,25.20,25401500\n7-Dec-07,25.86,26.11,25.50,25.63,11306200\n6-Dec-07,25.88,26.02,25.39,25.96,18284100\n5-Dec-07,26.63,26.73,25.73,25.98,20840300\n4-Dec-07,26.14,26.73,26.11,26.42,14344900\n3-Dec-07,26.64,27.20,26.56,26.61,15141100\n30-Nov-07,26.96,27.33,26.51,26.81,23035600\n29-Nov-07,26.01,26.71,25.91,26.63,17685100\n28-Nov-07,26.03,26.70,25.93,26.20,22462700\n27-Nov-07,25.18,26.00,25.17,25.59,19047000\n26-Nov-07,26.08,26.25,25.20,25.22,23944300\n23-Nov-07,25.98,26.40,25.76,26.13,9016400\n21-Nov-07,26.11,26.58,25.52,25.71,22899200\n20-Nov-07,26.93,27.25,25.98,26.72,25363900\n19-Nov-07,27.11,27.35,26.35,26.76,32136400\n16-Nov-07,25.66,27.13,25.10,26.82,51775000\n15-Nov-07,24.94,25.75,24.90,25.42,27156000\n14-Nov-07,26.42,26.44,25.00,25.07,37137900\n13-Nov-07,25.53,26.24,25.30,26.10,33435300\n12-Nov-07,25.80,26.20,24.69,24.78,30782500\n9-Nov-07,26.13,26.38,25.40,25.79,44810800\n8-Nov-07,28.11,28.24,25.82,26.70,57352100\n7-Nov-07,29.27,29.30,27.56,27.63,55387900\n6-Nov-07,31.76,31.79,29.00,29.93,59764400\n5-Nov-07,30.71,32.37,30.35,31.36,42039500\n2-Nov-07,30.54,31.21,29.64,31.11,33595000\n1-Nov-07,30.85,31.10,30.04,30.22,26208400\n31-Oct-07,31.50,31.75,30.50,31.10,33723500\n30-Oct-07,31.55,31.64,30.12,30.83,51143600\n29-Oct-07,34.07,34.08,31.18,31.79,79596700\n26-Oct-07,32.43,33.99,31.61,33.63,64227900\n25-Oct-07,30.75,31.62,30.50,31.34,38299800\n24-Oct-07,30.68,30.98,30.00,30.68,33314900\n23-Oct-07,30.12,30.88,30.03,30.64,44168100\n22-Oct-07,28.93,30.00,28.80,29.85,26276000\n19-Oct-07,29.36,29.96,28.85,29.03,41002200\n18-Oct-07,28.59,29.60,28.47,29.35,27127300\n17-Oct-07,29.10,29.20,28.00,28.82,68565900\n16-Oct-07,27.37,27.48,26.55,26.69,39646800\n15-Oct-07,28.32,28.40,27.46,27.86,21492500\n12-Oct-07,27.76,28.51,27.65,28.48,20806900\n11-Oct-07,28.44,28.68,27.50,27.65,24946100\n10-Oct-07,28.43,28.70,27.90,28.36,14496900\n9-Oct-07,28.35,28.76,27.94,28.37,19359200\n8-Oct-07,28.01,28.17,27.75,28.05,14726800\n5-Oct-07,27.78,28.16,27.75,27.88,26876000\n4-Oct-07,27.19,27.29,26.90,27.15,13902100\n3-Oct-07,27.16,27.38,26.82,27.17,17453100\n2-Oct-07,27.20,27.24,26.62,26.95,14411600\n1-Oct-07,26.76,27.10,26.73,27.04,16434200\n28-Sep-07,26.49,26.89,26.20,26.84,21052000\n27-Sep-07,26.95,26.95,26.17,26.27,20048700\n26-Sep-07,26.70,27.07,26.50,26.70,17847200\n25-Sep-07,25.70,26.65,25.63,26.51,32250000\n24-Sep-07,26.13,26.40,25.51,25.73,25550600\n21-Sep-07,25.54,26.21,25.29,26.05,43986700\n20-Sep-07,25.28,25.61,25.16,25.29,16617500\n19-Sep-07,25.09,25.37,24.81,25.29,25084400\n18-Sep-07,25.06,25.21,24.53,25.06,22545700\n17-Sep-07,24.50,25.10,24.38,24.95,19933900\n14-Sep-07,23.69,25.00,23.65,24.73,27958700\n13-Sep-07,23.60,23.96,23.60,23.72,9869200\n12-Sep-07,23.64,23.94,23.53,23.56,16407000\n11-Sep-07,23.31,23.84,23.31,23.71,10965400\n10-Sep-07,23.85,23.85,23.10,23.30,14811700\n7-Sep-07,23.76,24.05,23.60,23.76,11930500\n6-Sep-07,24.22,24.32,23.62,24.15,13595800\n5-Sep-07,24.10,24.40,23.91,24.10,22440300\n4-Sep-07,23.30,24.50,23.20,23.97,41495600\n31-Aug-07,22.81,22.83,22.51,22.73,11613600\n30-Aug-07,22.49,22.91,22.38,22.61,17836200\n29-Aug-07,22.60,22.69,22.27,22.55,23588800\n28-Aug-07,22.95,23.10,22.50,22.52,16982200\n27-Aug-07,23.59,23.76,23.01,23.03,16278400\n24-Aug-07,23.03,23.73,23.03,23.59,10671900\n23-Aug-07,23.35,23.36,22.95,23.13,14200200\n22-Aug-07,23.22,23.52,23.18,23.23,17700000\n21-Aug-07,23.25,23.48,22.91,23.04,23740000\n20-Aug-07,23.64,23.74,23.18,23.34,12937200\n17-Aug-07,23.26,23.63,22.76,23.54,18975400\n16-Aug-07,23.00,23.15,22.50,22.76,28733900\n15-Aug-07,23.56,24.00,23.25,23.32,18261500\n14-Aug-07,24.69,24.70,23.69,23.72,18379800\n13-Aug-07,24.21,24.74,24.01,24.57,20421900\n10-Aug-07,23.93,24.22,23.52,23.94,22532400\n9-Aug-07,23.67,24.45,23.51,23.80,23636300\n8-Aug-07,23.46,23.87,23.43,23.87,16726100\n7-Aug-07,22.75,23.70,22.69,23.44,19758100\n6-Aug-07,23.03,23.15,22.44,22.97,28633600\n3-Aug-07,23.20,23.39,22.87,22.92,19025400\n2-Aug-07,22.65,23.70,22.65,23.36,20532200\n1-Aug-07,23.17,23.40,22.85,23.25,21816700\n31-Jul-07,23.88,23.93,23.24,23.25,20685200\n30-Jul-07,23.55,23.88,23.38,23.62,20445500\n27-Jul-07,23.98,24.49,23.47,23.49,35232900\n26-Jul-07,24.40,24.49,23.62,24.03,32982200\n25-Jul-07,25.01,25.32,24.59,24.68,21724800\n24-Jul-07,24.80,25.34,24.73,24.84,28445300\n23-Jul-07,25.43,25.46,24.98,24.99,20417700\n20-Jul-07,25.70,25.89,25.20,25.35,35051500\n19-Jul-07,26.32,26.34,25.92,26.03,28823000\n18-Jul-07,26.07,26.72,26.02,26.20,60976900\n17-Jul-07,26.74,27.80,26.70,27.53,43227100\n16-Jul-07,26.48,26.74,26.13,26.70,29783900\n13-Jul-07,26.87,26.97,26.50,26.58,18035300\n12-Jul-07,26.70,26.97,26.34,26.96,19864600\n11-Jul-07,27.03,27.05,26.55,26.69,21571300\n10-Jul-07,27.09,27.57,26.96,26.97,24018600\n9-Jul-07,26.92,27.33,26.82,27.20,17233400\n6-Jul-07,27.01,27.14,26.93,27.10,11314500\n5-Jul-07,26.92,27.14,26.90,26.99,15734600\n3-Jul-07,26.95,27.25,26.90,27.00,11344100\n2-Jul-07,27.19,27.27,26.76,26.86,20147200\n29-Jun-07,27.21,27.38,26.93,27.13,13526100\n28-Jun-07,27.44,27.49,27.12,27.25,16782300\n27-Jun-07,27.51,27.66,27.40,27.58,13558500\n26-Jun-07,27.73,28.18,27.36,27.71,24742800\n25-Jun-07,27.60,27.77,27.34,27.64,20455100\n22-Jun-07,27.68,27.79,27.31,27.38,27540600\n21-Jun-07,27.69,27.94,27.55,27.67,17117000\n20-Jun-07,27.89,28.17,27.66,27.66,32494300\n19-Jun-07,29.40,29.40,27.54,27.63,56118000\n18-Jun-07,27.72,28.34,27.50,28.12,55355400\n15-Jun-07,27.49,27.52,27.19,27.31,23127500\n14-Jun-07,27.38,27.64,27.15,27.30,18394900\n13-Jun-07,27.12,27.41,26.61,27.38,31002500\n12-Jun-07,27.30,27.66,26.98,27.05,21460300\n11-Jun-07,27.27,27.52,27.15,27.35,11759300\n8-Jun-07,27.02,27.45,26.96,27.39,18256100\n7-Jun-07,27.34,27.73,26.98,26.98,33867000\n6-Jun-07,28.05,28.11,27.30,27.44,33096600\n5-Jun-07,28.40,28.59,28.10,28.23,20147500\n4-Jun-07,28.60,28.78,28.40,28.59,13231000\n1-Jun-07,28.90,29.13,28.61,28.78,11946900\n31-May-07,28.76,28.85,28.49,28.70,14944600\n30-May-07,28.19,28.38,28.00,28.38,15358500\n29-May-07,28.36,28.73,28.20,28.40,13641300\n25-May-07,28.44,28.73,28.34,28.58,10109100\n24-May-07,28.65,28.88,28.25,28.41,18580600\n23-May-07,29.10,29.37,28.53,28.61,27540600\n22-May-07,29.33,29.35,28.78,28.92,18009400\n21-May-07,29.62,29.86,29.32,29.35,17035700\n18-May-07,28.90,29.80,28.78,29.75,33286400\n17-May-07,28.99,29.13,28.49,28.57,22818200\n16-May-07,28.89,29.37,28.25,29.21,32343100\n15-May-07,29.16,29.42,28.75,28.81,21097700\n14-May-07,29.79,30.00,29.08,29.31,19583900\n11-May-07,29.62,30.08,29.53,30.05,12738000\n10-May-07,30.52,30.69,29.61,29.70,24663100\n9-May-07,30.16,30.44,29.95,30.22,21975000\n8-May-07,30.24,31.10,30.21,30.41,27704200\n7-May-07,30.13,30.98,29.86,30.38,38528200\n4-May-07,33.27,33.61,29.58,30.98,98243400\n3-May-07,28.25,28.50,28.01,28.18,19735200\n2-May-07,27.72,28.26,27.72,28.12,16297400\n1-May-07,28.25,28.35,27.53,27.60,17545700\n30-Apr-07,28.32,28.50,28.00,28.04,16789400\n27-Apr-07,28.35,28.86,28.17,28.34,20613600\n26-Apr-07,27.98,28.65,27.73,28.49,31876400\n25-Apr-07,28.22,28.27,27.68,28.06,34594400\n24-Apr-07,28.03,28.26,27.69,28.02,25198100\n23-Apr-07,27.53,28.14,27.37,27.88,26369600\n20-Apr-07,27.86,27.86,27.37,27.46,37696400\n19-Apr-07,28.10,28.23,27.46,27.51,44950300\n18-Apr-07,28.42,28.90,27.89,28.31,21868200\n17-Apr-07,31.98,32.14,31.71,32.09,27662700\n16-Apr-07,31.68,31.79,31.24,31.61,13760400\n13-Apr-07,31.15,31.50,30.96,31.41,11122500\n12-Apr-07,31.26,31.42,31.10,31.21,13185100\n11-Apr-07,31.65,31.73,30.90,31.17,15782900\n10-Apr-07,31.64,32.02,31.60,31.69,12471400\n9-Apr-07,32.01,32.24,31.60,31.64,12009400\n5-Apr-07,32.00,32.09,31.72,31.96,13630000\n4-Apr-07,31.61,31.87,31.48,31.62,7461900\n3-Apr-07,31.41,32.00,31.41,31.72,11998500\n2-Apr-07,31.22,31.40,30.93,31.28,8565000\n30-Mar-07,31.21,31.60,31.02,31.29,9022800\n29-Mar-07,31.71,31.73,30.83,31.34,12586100\n28-Mar-07,31.45,31.70,31.25,31.41,12783900\n27-Mar-07,31.56,31.66,31.24,31.55,8947500\n26-Mar-07,31.25,31.74,31.24,31.66,12519000\n23-Mar-07,31.33,31.70,31.16,31.36,12542000\n22-Mar-07,31.36,31.44,30.85,31.26,12337000\n21-Mar-07,30.33,31.39,30.21,31.29,25697600\n20-Mar-07,30.00,30.35,29.94,30.33,11808700\n19-Mar-07,30.00,30.19,29.92,30.03,9726100\n16-Mar-07,30.02,30.11,29.72,29.88,19002500\n15-Mar-07,29.81,30.07,29.78,30.06,13668100\n14-Mar-07,29.63,30.04,29.26,29.86,22854200\n13-Mar-07,29.77,30.24,29.42,29.56,17772600\n12-Mar-07,29.30,30.11,29.28,29.99,33546300\n9-Mar-07,29.85,30.15,28.79,29.12,65503200\n8-Mar-07,30.82,31.04,30.58,30.71,13531700\n7-Mar-07,30.95,31.03,30.33,30.39,15706500\n6-Mar-07,30.89,31.06,30.52,30.80,32698000\n5-Mar-07,30.18,31.90,30.14,30.31,20424800\n2-Mar-07,30.54,30.89,30.28,30.42,18040700\n1-Mar-07,30.13,31.23,30.00,30.86,23866500\n28-Feb-07,30.86,31.47,30.09,30.86,29812900\n27-Feb-07,31.38,31.64,30.24,30.95,30784800\n26-Feb-07,32.84,32.84,30.85,32.12,27484600\n23-Feb-07,31.60,32.18,31.41,32.10,21233200\n22-Feb-07,31.60,32.08,31.32,31.60,15410300\n21-Feb-07,31.74,31.77,31.22,31.65,27492400\n20-Feb-07,31.80,32.21,31.39,32.01,19697800\n16-Feb-07,31.00,32.00,31.00,31.91,36661100\n15-Feb-07,30.82,31.65,30.69,31.25,27831800\n14-Feb-07,29.69,30.86,29.64,30.66,30569800\n13-Feb-07,29.37,29.68,29.26,29.56,12586400\n12-Feb-07,29.29,29.77,29.05,29.17,18245000\n9-Feb-07,30.07,30.16,29.51,29.74,18114500\n8-Feb-07,29.75,30.24,29.73,30.08,15485600\n7-Feb-07,29.35,30.15,29.12,29.89,28805500\n6-Feb-07,28.61,29.56,28.60,29.35,24433400\n5-Feb-07,28.67,28.80,28.36,28.56,11102800\n2-Feb-07,28.57,28.92,28.45,28.77,16137000\n1-Feb-07,28.68,28.71,28.15,28.35,17568200\n31-Jan-07,28.04,28.48,27.82,28.31,13891200\n30-Jan-07,27.87,28.39,27.61,28.04,13428500\n29-Jan-07,28.05,28.21,27.73,27.87,16797400\n26-Jan-07,28.32,28.52,27.96,28.04,19661800\n25-Jan-07,28.68,29.05,28.13,28.21,27822900\n24-Jan-07,28.34,29.20,28.22,28.94,75434500\n23-Jan-07,27.42,27.54,26.88,26.96,28453700\n22-Jan-07,27.85,27.90,27.18,27.42,22444700\n19-Jan-07,27.93,28.34,27.55,27.64,24649400\n18-Jan-07,28.92,28.99,27.82,28.12,23720200\n17-Jan-07,29.40,29.40,28.81,29.05,17666900\n16-Jan-07,29.88,29.88,28.79,29.29,24343800\n12-Jan-07,28.98,29.50,28.49,29.45,20898800\n11-Jan-07,28.76,29.37,28.70,29.20,28156300\n10-Jan-07,27.48,28.92,27.44,28.70,39472600\n9-Jan-07,28.00,28.05,27.41,27.58,25507900\n8-Jan-07,27.70,28.04,27.43,27.92,25567600\n5-Jan-07,26.70,27.87,26.66,27.74,64076600\n4-Jan-07,25.64,26.92,25.52,26.85,32348900\n3-Jan-07,25.85,26.26,25.26,25.61,26177100\n29-Dec-06,25.42,25.82,25.33,25.54,16171100\n28-Dec-06,25.62,25.72,25.30,25.36,11846000\n27-Dec-06,25.47,25.88,25.45,25.75,12240600\n26-Dec-06,25.49,25.61,25.34,25.45,8375400\n22-Dec-06,25.67,25.88,25.45,25.55,14437300\n21-Dec-06,25.71,25.75,25.13,25.48,26831500\n20-Dec-06,26.24,26.31,25.54,25.59,24317700\n19-Dec-06,26.05,26.50,25.91,26.41,18722400\n18-Dec-06,26.89,26.97,26.07,26.30,19147600\n15-Dec-06,27.00,27.22,26.76,26.90,22642500\n14-Dec-06,26.63,26.97,26.50,26.87,14322500\n13-Dec-06,27.04,27.23,26.51,26.60,20193600\n12-Dec-06,26.63,27.38,26.60,26.75,30994100\n11-Dec-06,26.37,26.70,26.12,26.49,12861200\n8-Dec-06,26.65,26.78,26.27,26.34,19112400\n7-Dec-06,26.95,27.16,26.60,26.63,22321300\n6-Dec-06,27.25,27.45,26.60,26.86,33866400\n5-Dec-06,26.86,27.61,26.86,27.43,26864700\n4-Dec-06,26.49,27.30,26.49,26.89,27757300\n1-Dec-06,27.00,27.25,26.00,26.49,19842600\n30-Nov-06,27.00,27.15,26.73,27.01,14720800\n29-Nov-06,27.40,27.40,26.71,27.04,19228400\n28-Nov-06,27.02,27.24,26.85,27.00,14785300\n27-Nov-06,27.50,28.50,27.17,27.27,19836000\n24-Nov-06,28.22,28.49,27.70,28.03,9319800\n22-Nov-06,27.51,28.56,27.29,28.49,31756800\n21-Nov-06,26.50,27.34,26.50,27.14,21053700\n20-Nov-06,26.96,27.04,26.63,26.72,19795800\n17-Nov-06,26.68,27.05,26.63,26.91,17380800\n16-Nov-06,27.31,27.33,26.20,26.64,38259500\n15-Nov-06,27.18,27.50,27.03,27.15,21794200\n14-Nov-06,27.40,27.50,27.11,27.24,19922100\n13-Nov-06,27.17,27.62,27.15,27.40,16762300\n10-Nov-06,27.40,27.50,27.03,27.39,20149600\n9-Nov-06,27.18,27.65,26.96,27.45,27175900\n8-Nov-06,26.36,27.25,26.31,26.90,23282100\n7-Nov-06,26.68,27.15,26.58,26.61,27746400\n6-Nov-06,26.34,26.70,26.10,26.59,22476500\n3-Nov-06,26.62,26.70,26.04,26.18,15111100\n2-Nov-06,25.94,26.60,25.77,26.53,34095100\n1-Nov-06,26.50,26.62,25.82,25.99,25987000\n31-Oct-06,26.44,26.70,26.10,26.34,32871200\n30-Oct-06,25.87,26.40,25.66,25.95,34231500\n27-Oct-06,25.23,25.60,24.90,25.34,29378200\n26-Oct-06,24.70,25.33,24.36,25.28,38107000\n25-Oct-06,23.73,24.64,23.69,24.49,39805100\n24-Oct-06,23.34,23.64,23.15,23.53,31089600\n23-Oct-06,23.14,23.50,23.10,23.37,26108600\n20-Oct-06,23.22,23.27,22.65,23.21,49572600\n19-Oct-06,23.02,23.59,23.00,23.14,41511500\n18-Oct-06,24.57,24.75,22.88,22.99,5183600\n17-Oct-06,23.74,24.35,23.68,24.15,49405600\n16-Oct-06,24.34,24.52,23.75,24.18,36025300\n13-Oct-06,23.90,24.50,23.57,24.42,50548400\n12-Oct-06,24.32,24.38,24.10,24.12,25505200\n11-Oct-06,24.29,24.64,23.80,24.24,38866100\n10-Oct-06,24.94,25.03,24.32,24.47,30179300\n9-Oct-06,25.45,25.72,25.00,25.03,15479200\n6-Oct-06,25.09,25.50,25.01,25.47,20791400\n5-Oct-06,25.16,25.25,24.88,25.18,17560800\n4-Oct-06,24.89,25.26,24.74,25.21,21502900\n3-Oct-06,24.80,25.00,24.70,24.84,20916100\n2-Oct-06,25.45,25.46,24.75,24.88,19438600\n29-Sep-06,25.50,25.59,25.24,25.28,18701500\n28-Sep-06,24.87,25.50,24.84,25.33,35206900\n27-Sep-06,25.00,25.01,24.60,24.65,28936800\n26-Sep-06,25.44,25.48,24.81,25.05,34668600\n25-Sep-06,25.64,25.87,25.20,25.29,19843600\n22-Sep-06,25.33,25.69,25.18,25.52,20314800\n21-Sep-06,25.53,25.95,25.21,25.34,28007600\n20-Sep-06,26.04,26.09,25.38,25.64,55135400\n19-Sep-06,29.09,29.13,25.10,25.75,26345800\n18-Sep-06,29.37,29.39,28.58,29.00,15673600\n15-Sep-06,29.30,29.57,29.22,29.32,18179300\n14-Sep-06,29.10,29.24,28.89,29.03,9554600\n13-Sep-06,29.06,29.37,28.80,29.17,15121600\n12-Sep-06,28.55,29.22,28.46,29.09,9879000\n11-Sep-06,28.05,28.73,27.67,28.61,12776700\n8-Sep-06,28.04,28.32,27.97,28.14,9768900\n7-Sep-06,28.40,28.51,27.82,27.86,17573800\n6-Sep-06,28.94,29.01,28.49,28.50,12807200\n5-Sep-06,29.45,29.48,28.95,29.07,11366000\n1-Sep-06,28.91,29.53,28.91,29.49,11562000\n31-Aug-06,28.98,29.02,28.59,28.83,8797100\n30-Aug-06,29.00,29.14,28.71,29.02,12970500\n29-Aug-06,28.86,29.01,28.51,28.96,9858000\n28-Aug-06,28.75,29.25,28.70,28.91,10351800\n25-Aug-06,28.95,29.28,28.74,28.77,6164200\n24-Aug-06,28.75,29.13,28.70,28.99,8724800\n23-Aug-06,29.34,29.47,28.68,28.70,8721700\n22-Aug-06,28.84,29.65,28.80,29.26,10881500\n21-Aug-06,29.22,29.52,28.83,28.90,11380900\n18-Aug-06,28.90,29.97,28.77,29.78,19513100\n17-Aug-06,28.38,29.32,28.34,28.91,16858500\n16-Aug-06,28.35,28.46,27.97,28.39,12547500\n15-Aug-06,27.58,28.20,27.48,28.17,14820500\n14-Aug-06,27.71,27.80,27.00,27.26,9537500\n11-Aug-06,27.52,27.72,27.40,27.50,9203800\n10-Aug-06,26.95,27.80,26.85,27.49,12537500\n9-Aug-06,27.75,27.85,27.00,27.22,14687400\n8-Aug-06,26.95,27.70,26.63,27.44,19103700\n7-Aug-06,26.92,27.11,26.58,27.08,12619400\n4-Aug-06,27.20,27.58,26.83,26.99,11504700\n3-Aug-06,26.50,27.05,26.40,26.90,15221400\n2-Aug-06,27.01,27.10,26.45,26.63,17777800\n1-Aug-06,27.06,27.12,26.74,26.94,18513500\n31-Jul-06,27.46,27.55,26.99,27.14,16376600\n28-Jul-06,26.90,27.50,26.33,27.47,21440900\n27-Jul-06,27.35,27.50,26.64,26.70,24959300\n26-Jul-06,26.78,27.51,26.57,27.08,19976000\n25-Jul-06,26.75,27.19,26.57,26.95,19980200\n24-Jul-06,26.24,27.23,25.89,26.94,42452400\n21-Jul-06,24.99,26.06,24.91,25.89,35855000\n20-Jul-06,25.55,26.21,24.91,25.27,53974400\n19-Jul-06,26.41,26.70,25.04,25.20,2832000\n18-Jul-06,32.08,32.26,31.25,32.24,28222200\n17-Jul-06,31.98,32.40,31.69,31.84,16235900\n14-Jul-06,32.34,32.48,31.85,32.08,12446900\n13-Jul-06,32.85,33.16,32.07,32.23,19303200\n12-Jul-06,33.03,33.74,32.99,33.38,18289100\n"
  },
  {
    "path": "examples/stockserver/fileserver.js",
    "content": "var path = require('path');\nvar fs = require('fs');\n\nfunction getFiles() {\n\tvar dir = process.cwd();\n\tvar symbols = [\n\t\t'AAPL',\n\t\t'AMZN',\n\t\t'CSCO',\n\t\t'DELL',\n\t\t'EMC',\n\t\t'F',\n\t\t'GE',\n\t\t'GOOG',\n\t\t'HP',\n\t\t'IBM',\n\t\t'MSFT',\n\t\t'ORCL',\n\t\t'RHT',\n\t\t'YHOO'\n\t];\n\tvar files = symbols.map(function (s) {\n\t\treturn path.join(dir, s + '.csv');\n\t});\n\n\treturn files;\n}\n\nfunction processFile(symbol, data) {\n\tvar lines = data.split('\\n');\n\tvar results = [];\n\tfor (var i = 1, len = lines.length; i < len; i++) {\n\t\tvar columns = lines[i].split(',');\n\t\tif (columns.length === 6) {\n\t\t\tresults.push( {\n\t\t\t\tsymbol: symbol,\n\t\t\t\tdate: new Date(Date.parse(columns[0])).toJSON(),\n\t\t\t\topen: columns[1],\n\t\t\t\thigh: columns[2],\n\t\t\t\tlow: columns[3],\n\t\t\t\tclose: columns[4],\n\t\t\t\tvolume: columns[5]\n\t\t\t});\n\t\t}\n\t}\n\n\treturn results;\n}\n\nfunction processFiles(fileNames) {\n\tvar records = fileNames.map(function (fileName) {\n\t\tvar symbol = path.basename(fileName, '.csv');\n\t\tvar contents = fs.readFileSync(fileName, 'utf8');\n\n\t\treturn processFile(symbol, contents);\n\t});\n\n\treturn records;\n}\n\nfunction loadData() {\n\tvar files = getFiles();\n\treturn processFiles(files);\n}\n\nexports.loadData = loadData;\n"
  },
  {
    "path": "examples/stockserver/index.js",
    "content": "var Rx = require('../../.');\nvar Observable = Rx.Observable;\nvar fileserver = require('./fileserver');\n\nfunction getStockData(data, scheduler) {\n  var dataLength = data.length;\n  var rowLength = data[0].length;\n  scheduler || (scheduler = Rx.Scheduler['default']);\n  return Observable.create(function (observer) {\n    return scheduler.scheduleRecursiveFuture(rowLength - 1, 1000, function (currentRow, recurse) {\n      var results = [];\n      for (var i = 0; i < dataLength; i++) {\n        results.push(data[i][currentRow]);\n      }\n      currentRow--;\n      observer.onNext(results);\n      if (currentRow === 0) {\n        observer.onCompleted();\n      } else {\n        recurse(currentRow, 1000);\n      }\n    });\n  });\n}\n\nvar source = getStockData(fileserver.loadData()).share();\n\nvar groupedTickStream = source\n  .flatMap(function (value) {\n    var date = new Date().getTime();\n\n    return Observable.from(value).tap(function(x) {\n      x.timestamp = date;\n    });\n  })\n  .groupBy(function (quote) {\n    return quote.symbol;\n  })\n  .share();\n\n// if there is a spike in the price, render that as a circle\ngroupedTickStream\n  .flatMap(\n    function (stockStream) {\n      // Get the previous day and current day\n      return stockStream.bufferWithCount(2, 1);\n    },\n    function (stockStream, buffer) {\n      // Project forward the symbol, timestamp and buffer\n      var len = buffer.length;\n      return {\n        symbol: stockStream.key,\n        timestamp: buffer[len - 1].timestamp,\n        buffer: buffer\n      };\n  })\n  .filter(function (x) {\n    return x.buffer.length === 2;\n  })\n  .tap(function (x) {\n    // Project forward the first close, last close and spike\n    x.firstClose = x.buffer[0].close;\n    x.lastClose = x.buffer[1].close;\n    x.spike = (x.lastClose - x.firstClose) / x.firstClose;\n  })\n  .filter(function (x) {\n    return Math.abs(x.spike) >= 0.1;\n  })\n  .subscribe(function (x) {\n    console.log('Symbol:' , x.symbol , 'had a price spike of ',\n      Math.round(x.spike * 100) , '% on',\n      new Date(x.timestamp) , 'with close of $' , x.lastClose);\n  }, function (err) {\n    console.log(err.stack);\n  });\n"
  },
  {
    "path": "examples/stockserver/readme.md",
    "content": ""
  },
  {
    "path": "examples/tessel/blinky.js",
    "content": "// Run with \"tessel run blinky.js\"\n\n// Import the interface to Tessel hardware\nvar tessel = require('tessel');\n\n// Must use lite compat due to https://github.com/tessel/runtime/issues/658\nvar Observable = require('../../dist/rx.lite.compat').Observable;\n\n// Set the led pins as outputs with initial states\n// Truthy initial state sets the pin high\n// Falsy sets it low.\nvar led1 = tessel.led[0].output(1);\nvar led2 = tessel.led[1].output(0);\n\nObservable.interval(100)\n  .subscribe(function () {\n    console.log('first blinks');\n    led1.toggle();\n  });\n\nObservable.interval(150)\n  .subscribe(function () {\n    console.log('second blinks');\n    led2.toggle();\n  });\n"
  },
  {
    "path": "examples/tessel/readme.md",
    "content": ""
  },
  {
    "path": "examples/testing/jasmine/SpecRunner.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"\n  \"http://www.w3.org/TR/html4/loose.dtd\">\n<html>\n<head>\n  <title>Jasmine Spec Runner</title>\n\n  <link rel=\"shortcut icon\" type=\"image/png\" href=\"lib/jasmine-1.3.1/jasmine_favicon.png\">\n  <link rel=\"stylesheet\" type=\"text/css\" href=\"lib/jasmine-1.3.1/jasmine.css\">\n  <script type=\"text/javascript\" src=\"lib/jasmine-1.3.1/jasmine.js\"></script>\n  <script type=\"text/javascript\" src=\"lib/jasmine-1.3.1/jasmine-html.js\"></script>\n\n  <!-- include source files here... -->\n  <script type=\"text/javascript\" src=\"../../../dist/rx.js\"></script>\n  <script type=\"text/javascript\" src=\"../../../dist/rx.virtualtime.js\"></script>\n  <script type=\"text/javascript\" src=\"../../../dist/rx.time.js\"></script>\n  <script type=\"text/javascript\" src=\"../../../dist/rx.testing.js\"></script>\n\n  <!-- include spec files here... -->\n  <script type=\"text/javascript\" src=\"spec/SpecHelper.js\"></script>\n  <script type=\"text/javascript\" src=\"spec/SelectSpec.js\"></script>\n\n  <script type=\"text/javascript\">\n    (function() {\n      var jasmineEnv = jasmine.getEnv();\n      jasmineEnv.updateInterval = 1000;\n\n      var htmlReporter = new jasmine.HtmlReporter();\n\n      jasmineEnv.addReporter(htmlReporter);\n\n      jasmineEnv.specFilter = function(spec) {\n        return htmlReporter.specFilter(spec);\n      };\n\n      var currentWindowOnload = window.onload;\n\n      window.onload = function() {\n        if (currentWindowOnload) {\n          currentWindowOnload();\n        }\n        execJasmine();\n      };\n\n      function execJasmine() {\n        jasmineEnv.execute();\n      }\n\n    })();\n  </script>\n\n</head>\n\n<body>\n</body>\n</html>\n"
  },
  {
    "path": "examples/testing/jasmine/lib/jasmine-1.3.1/MIT.LICENSE",
    "content": "Copyright (c) 2008-2011 Pivotal Labs\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "examples/testing/jasmine/lib/jasmine-1.3.1/jasmine-html.js",
    "content": "jasmine.HtmlReporterHelpers = {};\n\njasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) {\n  var el = document.createElement(type);\n\n  for (var i = 2; i < arguments.length; i++) {\n    var child = arguments[i];\n\n    if (typeof child === 'string') {\n      el.appendChild(document.createTextNode(child));\n    } else {\n      if (child) {\n        el.appendChild(child);\n      }\n    }\n  }\n\n  for (var attr in attrs) {\n    if (attr == \"className\") {\n      el[attr] = attrs[attr];\n    } else {\n      el.setAttribute(attr, attrs[attr]);\n    }\n  }\n\n  return el;\n};\n\njasmine.HtmlReporterHelpers.getSpecStatus = function(child) {\n  var results = child.results();\n  var status = results.passed() ? 'passed' : 'failed';\n  if (results.skipped) {\n    status = 'skipped';\n  }\n\n  return status;\n};\n\njasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) {\n  var parentDiv = this.dom.summary;\n  var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite';\n  var parent = child[parentSuite];\n\n  if (parent) {\n    if (typeof this.views.suites[parent.id] == 'undefined') {\n      this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views);\n    }\n    parentDiv = this.views.suites[parent.id].element;\n  }\n\n  parentDiv.appendChild(childElement);\n};\n\njasmine.HtmlReporterHelpers.addHelpers = function(ctor) {\n  for(var fn in jasmine.HtmlReporterHelpers) {\n    ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn];\n  }\n};\n\njasmine.HtmlReporter = function(_doc) {\n  var self = this;\n  var doc = _doc || window.document;\n\n  var reporterView;\n\n  var dom = {};\n\n  // Jasmine Reporter Public Interface\n  self.logRunningSpecs = false;\n\n  self.reportRunnerStarting = function(runner) {\n    var specs = runner.specs() || [];\n\n    if (specs.length == 0) {\n      return;\n    }\n\n    createReporterDom(runner.env.versionString());\n    doc.body.appendChild(dom.reporter);\n    setExceptionHandling();\n\n    reporterView = new jasmine.HtmlReporter.ReporterView(dom);\n    reporterView.addSpecs(specs, self.specFilter);\n  };\n\n  self.reportRunnerResults = function(runner) {\n    reporterView && reporterView.complete();\n  };\n\n  self.reportSuiteResults = function(suite) {\n    reporterView.suiteComplete(suite);\n  };\n\n  self.reportSpecStarting = function(spec) {\n    if (self.logRunningSpecs) {\n      self.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');\n    }\n  };\n\n  self.reportSpecResults = function(spec) {\n    reporterView.specComplete(spec);\n  };\n\n  self.log = function() {\n    var console = jasmine.getGlobal().console;\n    if (console && console.log) {\n      if (console.log.apply) {\n        console.log.apply(console, arguments);\n      } else {\n        console.log(arguments); // ie fix: console.log.apply doesn't exist on ie\n      }\n    }\n  };\n\n  self.specFilter = function(spec) {\n    if (!focusedSpecName()) {\n      return true;\n    }\n\n    return spec.getFullName().indexOf(focusedSpecName()) === 0;\n  };\n\n  return self;\n\n  function focusedSpecName() {\n    var specName;\n\n    (function memoizeFocusedSpec() {\n      if (specName) {\n        return;\n      }\n\n      var paramMap = [];\n      var params = jasmine.HtmlReporter.parameters(doc);\n\n      for (var i = 0; i < params.length; i++) {\n        var p = params[i].split('=');\n        paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);\n      }\n\n      specName = paramMap.spec;\n    })();\n\n    return specName;\n  }\n\n  function createReporterDom(version) {\n    dom.reporter = self.createDom('div', { id: 'HTMLReporter', className: 'jasmine_reporter' },\n      dom.banner = self.createDom('div', { className: 'banner' },\n        self.createDom('span', { className: 'title' }, \"Jasmine \"),\n        self.createDom('span', { className: 'version' }, version)),\n\n      dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}),\n      dom.alert = self.createDom('div', {className: 'alert'},\n        self.createDom('span', { className: 'exceptions' },\n          self.createDom('label', { className: 'label', 'for': 'no_try_catch' }, 'No try/catch'),\n          self.createDom('input', { id: 'no_try_catch', type: 'checkbox' }))),\n      dom.results = self.createDom('div', {className: 'results'},\n        dom.summary = self.createDom('div', { className: 'summary' }),\n        dom.details = self.createDom('div', { id: 'details' }))\n    );\n  }\n\n  function noTryCatch() {\n    return window.location.search.match(/catch=false/);\n  }\n\n  function searchWithCatch() {\n    var params = jasmine.HtmlReporter.parameters(window.document);\n    var removed = false;\n    var i = 0;\n\n    while (!removed && i < params.length) {\n      if (params[i].match(/catch=/)) {\n        params.splice(i, 1);\n        removed = true;\n      }\n      i++;\n    }\n    if (jasmine.CATCH_EXCEPTIONS) {\n      params.push(\"catch=false\");\n    }\n\n    return params.join(\"&\");\n  }\n\n  function setExceptionHandling() {\n    var chxCatch = document.getElementById('no_try_catch');\n\n    if (noTryCatch()) {\n      chxCatch.setAttribute('checked', true);\n      jasmine.CATCH_EXCEPTIONS = false;\n    }\n    chxCatch.onclick = function() {\n      window.location.search = searchWithCatch();\n    };\n  }\n};\njasmine.HtmlReporter.parameters = function(doc) {\n  var paramStr = doc.location.search.substring(1);\n  var params = [];\n\n  if (paramStr.length > 0) {\n    params = paramStr.split('&');\n  }\n  return params;\n}\njasmine.HtmlReporter.sectionLink = function(sectionName) {\n  var link = '?';\n  var params = [];\n\n  if (sectionName) {\n    params.push('spec=' + encodeURIComponent(sectionName));\n  }\n  if (!jasmine.CATCH_EXCEPTIONS) {\n    params.push(\"catch=false\");\n  }\n  if (params.length > 0) {\n    link += params.join(\"&\");\n  }\n\n  return link;\n};\njasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter);\njasmine.HtmlReporter.ReporterView = function(dom) {\n  this.startedAt = new Date();\n  this.runningSpecCount = 0;\n  this.completeSpecCount = 0;\n  this.passedCount = 0;\n  this.failedCount = 0;\n  this.skippedCount = 0;\n\n  this.createResultsMenu = function() {\n    this.resultsMenu = this.createDom('span', {className: 'resultsMenu bar'},\n      this.summaryMenuItem = this.createDom('a', {className: 'summaryMenuItem', href: \"#\"}, '0 specs'),\n      ' | ',\n      this.detailsMenuItem = this.createDom('a', {className: 'detailsMenuItem', href: \"#\"}, '0 failing'));\n\n    this.summaryMenuItem.onclick = function() {\n      dom.reporter.className = dom.reporter.className.replace(/ showDetails/g, '');\n    };\n\n    this.detailsMenuItem.onclick = function() {\n      showDetails();\n    };\n  };\n\n  this.addSpecs = function(specs, specFilter) {\n    this.totalSpecCount = specs.length;\n\n    this.views = {\n      specs: {},\n      suites: {}\n    };\n\n    for (var i = 0; i < specs.length; i++) {\n      var spec = specs[i];\n      this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom, this.views);\n      if (specFilter(spec)) {\n        this.runningSpecCount++;\n      }\n    }\n  };\n\n  this.specComplete = function(spec) {\n    this.completeSpecCount++;\n\n    if (isUndefined(this.views.specs[spec.id])) {\n      this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom);\n    }\n\n    var specView = this.views.specs[spec.id];\n\n    switch (specView.status()) {\n      case 'passed':\n        this.passedCount++;\n        break;\n\n      case 'failed':\n        this.failedCount++;\n        break;\n\n      case 'skipped':\n        this.skippedCount++;\n        break;\n    }\n\n    specView.refresh();\n    this.refresh();\n  };\n\n  this.suiteComplete = function(suite) {\n    var suiteView = this.views.suites[suite.id];\n    if (isUndefined(suiteView)) {\n      return;\n    }\n    suiteView.refresh();\n  };\n\n  this.refresh = function() {\n\n    if (isUndefined(this.resultsMenu)) {\n      this.createResultsMenu();\n    }\n\n    // currently running UI\n    if (isUndefined(this.runningAlert)) {\n      this.runningAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: \"runningAlert bar\" });\n      dom.alert.appendChild(this.runningAlert);\n    }\n    this.runningAlert.innerHTML = \"Running \" + this.completeSpecCount + \" of \" + specPluralizedFor(this.totalSpecCount);\n\n    // skipped specs UI\n    if (isUndefined(this.skippedAlert)) {\n      this.skippedAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: \"skippedAlert bar\" });\n    }\n\n    this.skippedAlert.innerHTML = \"Skipping \" + this.skippedCount + \" of \" + specPluralizedFor(this.totalSpecCount) + \" - run all\";\n\n    if (this.skippedCount === 1 && isDefined(dom.alert)) {\n      dom.alert.appendChild(this.skippedAlert);\n    }\n\n    // passing specs UI\n    if (isUndefined(this.passedAlert)) {\n      this.passedAlert = this.createDom('span', { href: jasmine.HtmlReporter.sectionLink(), className: \"passingAlert bar\" });\n    }\n    this.passedAlert.innerHTML = \"Passing \" + specPluralizedFor(this.passedCount);\n\n    // failing specs UI\n    if (isUndefined(this.failedAlert)) {\n      this.failedAlert = this.createDom('span', {href: \"?\", className: \"failingAlert bar\"});\n    }\n    this.failedAlert.innerHTML = \"Failing \" + specPluralizedFor(this.failedCount);\n\n    if (this.failedCount === 1 && isDefined(dom.alert)) {\n      dom.alert.appendChild(this.failedAlert);\n      dom.alert.appendChild(this.resultsMenu);\n    }\n\n    // summary info\n    this.summaryMenuItem.innerHTML = \"\" + specPluralizedFor(this.runningSpecCount);\n    this.detailsMenuItem.innerHTML = \"\" + this.failedCount + \" failing\";\n  };\n\n  this.complete = function() {\n    dom.alert.removeChild(this.runningAlert);\n\n    this.skippedAlert.innerHTML = \"Ran \" + this.runningSpecCount + \" of \" + specPluralizedFor(this.totalSpecCount) + \" - run all\";\n\n    if (this.failedCount === 0) {\n      dom.alert.appendChild(this.createDom('span', {className: 'passingAlert bar'}, \"Passing \" + specPluralizedFor(this.passedCount)));\n    } else {\n      showDetails();\n    }\n\n    dom.banner.appendChild(this.createDom('span', {className: 'duration'}, \"finished in \" + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + \"s\"));\n  };\n\n  return this;\n\n  function showDetails() {\n    if (dom.reporter.className.search(/showDetails/) === -1) {\n      dom.reporter.className += \" showDetails\";\n    }\n  }\n\n  function isUndefined(obj) {\n    return typeof obj === 'undefined';\n  }\n\n  function isDefined(obj) {\n    return !isUndefined(obj);\n  }\n\n  function specPluralizedFor(count) {\n    var str = count + \" spec\";\n    if (count > 1) {\n      str += \"s\"\n    }\n    return str;\n  }\n\n};\n\njasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView);\n\njasmine.HtmlReporter.SpecView = function(spec, dom, views) {\n  this.spec = spec;\n  this.dom = dom;\n  this.views = views;\n\n  this.symbol = this.createDom('li', { className: 'pending' });\n  this.dom.symbolSummary.appendChild(this.symbol);\n\n  this.summary = this.createDom('div', { className: 'specSummary' },\n    this.createDom('a', {\n      className: 'description',\n      href: jasmine.HtmlReporter.sectionLink(this.spec.getFullName()),\n      title: this.spec.getFullName()\n    }, this.spec.description)\n  );\n\n  this.detail = this.createDom('div', { className: 'specDetail' },\n      this.createDom('a', {\n        className: 'description',\n        href: '?spec=' + encodeURIComponent(this.spec.getFullName()),\n        title: this.spec.getFullName()\n      }, this.spec.getFullName())\n  );\n};\n\njasmine.HtmlReporter.SpecView.prototype.status = function() {\n  return this.getSpecStatus(this.spec);\n};\n\njasmine.HtmlReporter.SpecView.prototype.refresh = function() {\n  this.symbol.className = this.status();\n\n  switch (this.status()) {\n    case 'skipped':\n      break;\n\n    case 'passed':\n      this.appendSummaryToSuiteDiv();\n      break;\n\n    case 'failed':\n      this.appendSummaryToSuiteDiv();\n      this.appendFailureDetail();\n      break;\n  }\n};\n\njasmine.HtmlReporter.SpecView.prototype.appendSummaryToSuiteDiv = function() {\n  this.summary.className += ' ' + this.status();\n  this.appendToSummary(this.spec, this.summary);\n};\n\njasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() {\n  this.detail.className += ' ' + this.status();\n\n  var resultItems = this.spec.results().getItems();\n  var messagesDiv = this.createDom('div', { className: 'messages' });\n\n  for (var i = 0; i < resultItems.length; i++) {\n    var result = resultItems[i];\n\n    if (result.type == 'log') {\n      messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));\n    } else if (result.type == 'expect' && result.passed && !result.passed()) {\n      messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));\n\n      if (result.trace.stack) {\n        messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));\n      }\n    }\n  }\n\n  if (messagesDiv.childNodes.length > 0) {\n    this.detail.appendChild(messagesDiv);\n    this.dom.details.appendChild(this.detail);\n  }\n};\n\njasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView);jasmine.HtmlReporter.SuiteView = function(suite, dom, views) {\n  this.suite = suite;\n  this.dom = dom;\n  this.views = views;\n\n  this.element = this.createDom('div', { className: 'suite' },\n    this.createDom('a', { className: 'description', href: jasmine.HtmlReporter.sectionLink(this.suite.getFullName()) }, this.suite.description)\n  );\n\n  this.appendToSummary(this.suite, this.element);\n};\n\njasmine.HtmlReporter.SuiteView.prototype.status = function() {\n  return this.getSpecStatus(this.suite);\n};\n\njasmine.HtmlReporter.SuiteView.prototype.refresh = function() {\n  this.element.className += \" \" + this.status();\n};\n\njasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView);\n\n/* @deprecated Use jasmine.HtmlReporter instead\n */\njasmine.TrivialReporter = function(doc) {\n  this.document = doc || document;\n  this.suiteDivs = {};\n  this.logRunningSpecs = false;\n};\n\njasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) {\n  var el = document.createElement(type);\n\n  for (var i = 2; i < arguments.length; i++) {\n    var child = arguments[i];\n\n    if (typeof child === 'string') {\n      el.appendChild(document.createTextNode(child));\n    } else {\n      if (child) { el.appendChild(child); }\n    }\n  }\n\n  for (var attr in attrs) {\n    if (attr == \"className\") {\n      el[attr] = attrs[attr];\n    } else {\n      el.setAttribute(attr, attrs[attr]);\n    }\n  }\n\n  return el;\n};\n\njasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {\n  var showPassed, showSkipped;\n\n  this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' },\n      this.createDom('div', { className: 'banner' },\n        this.createDom('div', { className: 'logo' },\n            this.createDom('span', { className: 'title' }, \"Jasmine\"),\n            this.createDom('span', { className: 'version' }, runner.env.versionString())),\n        this.createDom('div', { className: 'options' },\n            \"Show \",\n            showPassed = this.createDom('input', { id: \"__jasmine_TrivialReporter_showPassed__\", type: 'checkbox' }),\n            this.createDom('label', { \"for\": \"__jasmine_TrivialReporter_showPassed__\" }, \" passed \"),\n            showSkipped = this.createDom('input', { id: \"__jasmine_TrivialReporter_showSkipped__\", type: 'checkbox' }),\n            this.createDom('label', { \"for\": \"__jasmine_TrivialReporter_showSkipped__\" }, \" skipped\")\n            )\n          ),\n\n      this.runnerDiv = this.createDom('div', { className: 'runner running' },\n          this.createDom('a', { className: 'run_spec', href: '?' }, \"run all\"),\n          this.runnerMessageSpan = this.createDom('span', {}, \"Running...\"),\n          this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, \"\"))\n      );\n\n  this.document.body.appendChild(this.outerDiv);\n\n  var suites = runner.suites();\n  for (var i = 0; i < suites.length; i++) {\n    var suite = suites[i];\n    var suiteDiv = this.createDom('div', { className: 'suite' },\n        this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, \"run\"),\n        this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description));\n    this.suiteDivs[suite.id] = suiteDiv;\n    var parentDiv = this.outerDiv;\n    if (suite.parentSuite) {\n      parentDiv = this.suiteDivs[suite.parentSuite.id];\n    }\n    parentDiv.appendChild(suiteDiv);\n  }\n\n  this.startedAt = new Date();\n\n  var self = this;\n  showPassed.onclick = function(evt) {\n    if (showPassed.checked) {\n      self.outerDiv.className += ' show-passed';\n    } else {\n      self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, '');\n    }\n  };\n\n  showSkipped.onclick = function(evt) {\n    if (showSkipped.checked) {\n      self.outerDiv.className += ' show-skipped';\n    } else {\n      self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, '');\n    }\n  };\n};\n\njasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) {\n  var results = runner.results();\n  var className = (results.failedCount > 0) ? \"runner failed\" : \"runner passed\";\n  this.runnerDiv.setAttribute(\"class\", className);\n  //do it twice for IE\n  this.runnerDiv.setAttribute(\"className\", className);\n  var specs = runner.specs();\n  var specCount = 0;\n  for (var i = 0; i < specs.length; i++) {\n    if (this.specFilter(specs[i])) {\n      specCount++;\n    }\n  }\n  var message = \"\" + specCount + \" spec\" + (specCount == 1 ? \"\" : \"s\" ) + \", \" + results.failedCount + \" failure\" + ((results.failedCount == 1) ? \"\" : \"s\");\n  message += \" in \" + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + \"s\";\n  this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild);\n\n  this.finishedAtSpan.appendChild(document.createTextNode(\"Finished at \" + new Date().toString()));\n};\n\njasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) {\n  var results = suite.results();\n  var status = results.passed() ? 'passed' : 'failed';\n  if (results.totalCount === 0) { // todo: change this to check results.skipped\n    status = 'skipped';\n  }\n  this.suiteDivs[suite.id].className += \" \" + status;\n};\n\njasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) {\n  if (this.logRunningSpecs) {\n    this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');\n  }\n};\n\njasmine.TrivialReporter.prototype.reportSpecResults = function(spec) {\n  var results = spec.results();\n  var status = results.passed() ? 'passed' : 'failed';\n  if (results.skipped) {\n    status = 'skipped';\n  }\n  var specDiv = this.createDom('div', { className: 'spec '  + status },\n      this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, \"run\"),\n      this.createDom('a', {\n        className: 'description',\n        href: '?spec=' + encodeURIComponent(spec.getFullName()),\n        title: spec.getFullName()\n      }, spec.description));\n\n  var resultItems = results.getItems();\n  var messagesDiv = this.createDom('div', { className: 'messages' });\n  for (var i = 0; i < resultItems.length; i++) {\n    var result = resultItems[i];\n\n    if (result.type == 'log') {\n      messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));\n    } else if (result.type == 'expect' && result.passed && !result.passed()) {\n      messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));\n\n      if (result.trace.stack) {\n        messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));\n      }\n    }\n  }\n\n  if (messagesDiv.childNodes.length > 0) {\n    specDiv.appendChild(messagesDiv);\n  }\n\n  this.suiteDivs[spec.suite.id].appendChild(specDiv);\n};\n\njasmine.TrivialReporter.prototype.log = function() {\n  var console = jasmine.getGlobal().console;\n  if (console && console.log) {\n    if (console.log.apply) {\n      console.log.apply(console, arguments);\n    } else {\n      console.log(arguments); // ie fix: console.log.apply doesn't exist on ie\n    }\n  }\n};\n\njasmine.TrivialReporter.prototype.getLocation = function() {\n  return this.document.location;\n};\n\njasmine.TrivialReporter.prototype.specFilter = function(spec) {\n  var paramMap = {};\n  var params = this.getLocation().search.substring(1).split('&');\n  for (var i = 0; i < params.length; i++) {\n    var p = params[i].split('=');\n    paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);\n  }\n\n  if (!paramMap.spec) {\n    return true;\n  }\n  return spec.getFullName().indexOf(paramMap.spec) === 0;\n};\n"
  },
  {
    "path": "examples/testing/jasmine/lib/jasmine-1.3.1/jasmine.css",
    "content": "body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; }\n\n#HTMLReporter { font-size: 11px; font-family: Monaco, \"Lucida Console\", monospace; line-height: 14px; color: #333333; }\n#HTMLReporter a { text-decoration: none; }\n#HTMLReporter a:hover { text-decoration: underline; }\n#HTMLReporter p, #HTMLReporter h1, #HTMLReporter h2, #HTMLReporter h3, #HTMLReporter h4, #HTMLReporter h5, #HTMLReporter h6 { margin: 0; line-height: 14px; }\n#HTMLReporter .banner, #HTMLReporter .symbolSummary, #HTMLReporter .summary, #HTMLReporter .resultMessage, #HTMLReporter .specDetail .description, #HTMLReporter .alert .bar, #HTMLReporter .stackTrace { padding-left: 9px; padding-right: 9px; }\n#HTMLReporter #jasmine_content { position: fixed; right: 100%; }\n#HTMLReporter .version { color: #aaaaaa; }\n#HTMLReporter .banner { margin-top: 14px; }\n#HTMLReporter .duration { color: #aaaaaa; float: right; }\n#HTMLReporter .symbolSummary { overflow: hidden; *zoom: 1; margin: 14px 0; }\n#HTMLReporter .symbolSummary li { display: block; float: left; height: 7px; width: 14px; margin-bottom: 7px; font-size: 16px; }\n#HTMLReporter .symbolSummary li.passed { font-size: 14px; }\n#HTMLReporter .symbolSummary li.passed:before { color: #5e7d00; content: \"\\02022\"; }\n#HTMLReporter .symbolSummary li.failed { line-height: 9px; }\n#HTMLReporter .symbolSummary li.failed:before { color: #b03911; content: \"x\"; font-weight: bold; margin-left: -1px; }\n#HTMLReporter .symbolSummary li.skipped { font-size: 14px; }\n#HTMLReporter .symbolSummary li.skipped:before { color: #bababa; content: \"\\02022\"; }\n#HTMLReporter .symbolSummary li.pending { line-height: 11px; }\n#HTMLReporter .symbolSummary li.pending:before { color: #aaaaaa; content: \"-\"; }\n#HTMLReporter .exceptions { color: #fff; float: right; margin-top: 5px; margin-right: 5px; }\n#HTMLReporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; }\n#HTMLReporter .runningAlert { background-color: #666666; }\n#HTMLReporter .skippedAlert { background-color: #aaaaaa; }\n#HTMLReporter .skippedAlert:first-child { background-color: #333333; }\n#HTMLReporter .skippedAlert:hover { text-decoration: none; color: white; text-decoration: underline; }\n#HTMLReporter .passingAlert { background-color: #a6b779; }\n#HTMLReporter .passingAlert:first-child { background-color: #5e7d00; }\n#HTMLReporter .failingAlert { background-color: #cf867e; }\n#HTMLReporter .failingAlert:first-child { background-color: #b03911; }\n#HTMLReporter .results { margin-top: 14px; }\n#HTMLReporter #details { display: none; }\n#HTMLReporter .resultsMenu, #HTMLReporter .resultsMenu a { background-color: #fff; color: #333333; }\n#HTMLReporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; }\n#HTMLReporter.showDetails .summaryMenuItem:hover { text-decoration: underline; }\n#HTMLReporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; }\n#HTMLReporter.showDetails .summary { display: none; }\n#HTMLReporter.showDetails #details { display: block; }\n#HTMLReporter .summaryMenuItem { font-weight: bold; text-decoration: underline; }\n#HTMLReporter .summary { margin-top: 14px; }\n#HTMLReporter .summary .suite .suite, #HTMLReporter .summary .specSummary { margin-left: 14px; }\n#HTMLReporter .summary .specSummary.passed a { color: #5e7d00; }\n#HTMLReporter .summary .specSummary.failed a { color: #b03911; }\n#HTMLReporter .description + .suite { margin-top: 0; }\n#HTMLReporter .suite { margin-top: 14px; }\n#HTMLReporter .suite a { color: #333333; }\n#HTMLReporter #details .specDetail { margin-bottom: 28px; }\n#HTMLReporter #details .specDetail .description { display: block; color: white; background-color: #b03911; }\n#HTMLReporter .resultMessage { padding-top: 14px; color: #333333; }\n#HTMLReporter .resultMessage span.result { display: block; }\n#HTMLReporter .stackTrace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; }\n\n#TrivialReporter { padding: 8px 13px; position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow-y: scroll; background-color: white; font-family: \"Helvetica Neue Light\", \"Lucida Grande\", \"Calibri\", \"Arial\", sans-serif; /*.resultMessage {*/ /*white-space: pre;*/ /*}*/ }\n#TrivialReporter a:visited, #TrivialReporter a { color: #303; }\n#TrivialReporter a:hover, #TrivialReporter a:active { color: blue; }\n#TrivialReporter .run_spec { float: right; padding-right: 5px; font-size: .8em; text-decoration: none; }\n#TrivialReporter .banner { color: #303; background-color: #fef; padding: 5px; }\n#TrivialReporter .logo { float: left; font-size: 1.1em; padding-left: 5px; }\n#TrivialReporter .logo .version { font-size: .6em; padding-left: 1em; }\n#TrivialReporter .runner.running { background-color: yellow; }\n#TrivialReporter .options { text-align: right; font-size: .8em; }\n#TrivialReporter .suite { border: 1px outset gray; margin: 5px 0; padding-left: 1em; }\n#TrivialReporter .suite .suite { margin: 5px; }\n#TrivialReporter .suite.passed { background-color: #dfd; }\n#TrivialReporter .suite.failed { background-color: #fdd; }\n#TrivialReporter .spec { margin: 5px; padding-left: 1em; clear: both; }\n#TrivialReporter .spec.failed, #TrivialReporter .spec.passed, #TrivialReporter .spec.skipped { padding-bottom: 5px; border: 1px solid gray; }\n#TrivialReporter .spec.failed { background-color: #fbb; border-color: red; }\n#TrivialReporter .spec.passed { background-color: #bfb; border-color: green; }\n#TrivialReporter .spec.skipped { background-color: #bbb; }\n#TrivialReporter .messages { border-left: 1px dashed gray; padding-left: 1em; padding-right: 1em; }\n#TrivialReporter .passed { background-color: #cfc; display: none; }\n#TrivialReporter .failed { background-color: #fbb; }\n#TrivialReporter .skipped { color: #777; background-color: #eee; display: none; }\n#TrivialReporter .resultMessage span.result { display: block; line-height: 2em; color: black; }\n#TrivialReporter .resultMessage .mismatch { color: black; }\n#TrivialReporter .stackTrace { white-space: pre; font-size: .8em; margin-left: 10px; max-height: 5em; overflow: auto; border: 1px inset red; padding: 1em; background: #eef; }\n#TrivialReporter .finished-at { padding-left: 1em; font-size: .6em; }\n#TrivialReporter.show-passed .passed, #TrivialReporter.show-skipped .skipped { display: block; }\n#TrivialReporter #jasmine_content { position: fixed; right: 100%; }\n#TrivialReporter .runner { border: 1px solid gray; display: block; margin: 5px 0; padding: 2px 0 2px 10px; }\n"
  },
  {
    "path": "examples/testing/jasmine/lib/jasmine-1.3.1/jasmine.js",
    "content": "var isCommonJS = typeof window == \"undefined\" && typeof exports == \"object\";\n\n/**\n * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework.\n *\n * @namespace\n */\nvar jasmine = {};\nif (isCommonJS) exports.jasmine = jasmine;\n/**\n * @private\n */\njasmine.unimplementedMethod_ = function() {\n  throw new Error(\"unimplemented method\");\n};\n\n/**\n * Use <code>jasmine.undefined</code> instead of <code>undefined</code>, since <code>undefined</code> is just\n * a plain old variable and may be redefined by somebody else.\n *\n * @private\n */\njasmine.undefined = jasmine.___undefined___;\n\n/**\n * Show diagnostic messages in the console if set to true\n *\n */\njasmine.VERBOSE = false;\n\n/**\n * Default interval in milliseconds for event loop yields (e.g. to allow network activity or to refresh the screen with the HTML-based runner). Small values here may result in slow test running. Zero means no updates until all tests have completed.\n *\n */\njasmine.DEFAULT_UPDATE_INTERVAL = 250;\n\n/**\n * Maximum levels of nesting that will be included when an object is pretty-printed\n */\njasmine.MAX_PRETTY_PRINT_DEPTH = 40;\n\n/**\n * Default timeout interval in milliseconds for waitsFor() blocks.\n */\njasmine.DEFAULT_TIMEOUT_INTERVAL = 5000;\n\n/**\n * By default exceptions thrown in the context of a test are caught by jasmine so that it can run the remaining tests in the suite.\n * Set to false to let the exception bubble up in the browser.\n *\n */\njasmine.CATCH_EXCEPTIONS = true;\n\njasmine.getGlobal = function() {\n  function getGlobal() {\n    return this;\n  }\n\n  return getGlobal();\n};\n\n/**\n * Allows for bound functions to be compared.  Internal use only.\n *\n * @ignore\n * @private\n * @param base {Object} bound 'this' for the function\n * @param name {Function} function to find\n */\njasmine.bindOriginal_ = function(base, name) {\n  var original = base[name];\n  if (original.apply) {\n    return function() {\n      return original.apply(base, arguments);\n    };\n  } else {\n    // IE support\n    return jasmine.getGlobal()[name];\n  }\n};\n\njasmine.setTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'setTimeout');\njasmine.clearTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearTimeout');\njasmine.setInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'setInterval');\njasmine.clearInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearInterval');\n\njasmine.MessageResult = function(values) {\n  this.type = 'log';\n  this.values = values;\n  this.trace = new Error(); // todo: test better\n};\n\njasmine.MessageResult.prototype.toString = function() {\n  var text = \"\";\n  for (var i = 0; i < this.values.length; i++) {\n    if (i > 0) text += \" \";\n    if (jasmine.isString_(this.values[i])) {\n      text += this.values[i];\n    } else {\n      text += jasmine.pp(this.values[i]);\n    }\n  }\n  return text;\n};\n\njasmine.ExpectationResult = function(params) {\n  this.type = 'expect';\n  this.matcherName = params.matcherName;\n  this.passed_ = params.passed;\n  this.expected = params.expected;\n  this.actual = params.actual;\n  this.message = this.passed_ ? 'Passed.' : params.message;\n\n  var trace = (params.trace || new Error(this.message));\n  this.trace = this.passed_ ? '' : trace;\n};\n\njasmine.ExpectationResult.prototype.toString = function () {\n  return this.message;\n};\n\njasmine.ExpectationResult.prototype.passed = function () {\n  return this.passed_;\n};\n\n/**\n * Getter for the Jasmine environment. Ensures one gets created\n */\njasmine.getEnv = function() {\n  var env = jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env();\n  return env;\n};\n\n/**\n * @ignore\n * @private\n * @param value\n * @returns {Boolean}\n */\njasmine.isArray_ = function(value) {\n  return jasmine.isA_(\"Array\", value);\n};\n\n/**\n * @ignore\n * @private\n * @param value\n * @returns {Boolean}\n */\njasmine.isString_ = function(value) {\n  return jasmine.isA_(\"String\", value);\n};\n\n/**\n * @ignore\n * @private\n * @param value\n * @returns {Boolean}\n */\njasmine.isNumber_ = function(value) {\n  return jasmine.isA_(\"Number\", value);\n};\n\n/**\n * @ignore\n * @private\n * @param {String} typeName\n * @param value\n * @returns {Boolean}\n */\njasmine.isA_ = function(typeName, value) {\n  return Object.prototype.toString.apply(value) === '[object ' + typeName + ']';\n};\n\n/**\n * Pretty printer for expecations.  Takes any object and turns it into a human-readable string.\n *\n * @param value {Object} an object to be outputted\n * @returns {String}\n */\njasmine.pp = function(value) {\n  var stringPrettyPrinter = new jasmine.StringPrettyPrinter();\n  stringPrettyPrinter.format(value);\n  return stringPrettyPrinter.string;\n};\n\n/**\n * Returns true if the object is a DOM Node.\n *\n * @param {Object} obj object to check\n * @returns {Boolean}\n */\njasmine.isDomNode = function(obj) {\n  return obj.nodeType > 0;\n};\n\n/**\n * Returns a matchable 'generic' object of the class type.  For use in expecations of type when values don't matter.\n *\n * @example\n * // don't care about which function is passed in, as long as it's a function\n * expect(mySpy).toHaveBeenCalledWith(jasmine.any(Function));\n *\n * @param {Class} clazz\n * @returns matchable object of the type clazz\n */\njasmine.any = function(clazz) {\n  return new jasmine.Matchers.Any(clazz);\n};\n\n/**\n * Returns a matchable subset of a JSON object. For use in expectations when you don't care about all of the\n * attributes on the object.\n *\n * @example\n * // don't care about any other attributes than foo.\n * expect(mySpy).toHaveBeenCalledWith(jasmine.objectContaining({foo: \"bar\"});\n *\n * @param sample {Object} sample\n * @returns matchable object for the sample\n */\njasmine.objectContaining = function (sample) {\n    return new jasmine.Matchers.ObjectContaining(sample);\n};\n\n/**\n * Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks.\n *\n * Spies should be created in test setup, before expectations.  They can then be checked, using the standard Jasmine\n * expectation syntax. Spies can be checked if they were called or not and what the calling params were.\n *\n * A Spy has the following fields: wasCalled, callCount, mostRecentCall, and argsForCall (see docs).\n *\n * Spies are torn down at the end of every spec.\n *\n * Note: Do <b>not</b> call new jasmine.Spy() directly - a spy must be created using spyOn, jasmine.createSpy or jasmine.createSpyObj.\n *\n * @example\n * // a stub\n * var myStub = jasmine.createSpy('myStub');  // can be used anywhere\n *\n * // spy example\n * var foo = {\n *   not: function(bool) { return !bool; }\n * }\n *\n * // actual foo.not will not be called, execution stops\n * spyOn(foo, 'not');\n\n // foo.not spied upon, execution will continue to implementation\n * spyOn(foo, 'not').andCallThrough();\n *\n * // fake example\n * var foo = {\n *   not: function(bool) { return !bool; }\n * }\n *\n * // foo.not(val) will return val\n * spyOn(foo, 'not').andCallFake(function(value) {return value;});\n *\n * // mock example\n * foo.not(7 == 7);\n * expect(foo.not).toHaveBeenCalled();\n * expect(foo.not).toHaveBeenCalledWith(true);\n *\n * @constructor\n * @see spyOn, jasmine.createSpy, jasmine.createSpyObj\n * @param {String} name\n */\njasmine.Spy = function(name) {\n  /**\n   * The name of the spy, if provided.\n   */\n  this.identity = name || 'unknown';\n  /**\n   *  Is this Object a spy?\n   */\n  this.isSpy = true;\n  /**\n   * The actual function this spy stubs.\n   */\n  this.plan = function() {\n  };\n  /**\n   * Tracking of the most recent call to the spy.\n   * @example\n   * var mySpy = jasmine.createSpy('foo');\n   * mySpy(1, 2);\n   * mySpy.mostRecentCall.args = [1, 2];\n   */\n  this.mostRecentCall = {};\n\n  /**\n   * Holds arguments for each call to the spy, indexed by call count\n   * @example\n   * var mySpy = jasmine.createSpy('foo');\n   * mySpy(1, 2);\n   * mySpy(7, 8);\n   * mySpy.mostRecentCall.args = [7, 8];\n   * mySpy.argsForCall[0] = [1, 2];\n   * mySpy.argsForCall[1] = [7, 8];\n   */\n  this.argsForCall = [];\n  this.calls = [];\n};\n\n/**\n * Tells a spy to call through to the actual implemenatation.\n *\n * @example\n * var foo = {\n *   bar: function() { // do some stuff }\n * }\n *\n * // defining a spy on an existing property: foo.bar\n * spyOn(foo, 'bar').andCallThrough();\n */\njasmine.Spy.prototype.andCallThrough = function() {\n  this.plan = this.originalValue;\n  return this;\n};\n\n/**\n * For setting the return value of a spy.\n *\n * @example\n * // defining a spy from scratch: foo() returns 'baz'\n * var foo = jasmine.createSpy('spy on foo').andReturn('baz');\n *\n * // defining a spy on an existing property: foo.bar() returns 'baz'\n * spyOn(foo, 'bar').andReturn('baz');\n *\n * @param {Object} value\n */\njasmine.Spy.prototype.andReturn = function(value) {\n  this.plan = function() {\n    return value;\n  };\n  return this;\n};\n\n/**\n * For throwing an exception when a spy is called.\n *\n * @example\n * // defining a spy from scratch: foo() throws an exception w/ message 'ouch'\n * var foo = jasmine.createSpy('spy on foo').andThrow('baz');\n *\n * // defining a spy on an existing property: foo.bar() throws an exception w/ message 'ouch'\n * spyOn(foo, 'bar').andThrow('baz');\n *\n * @param {String} exceptionMsg\n */\njasmine.Spy.prototype.andThrow = function(exceptionMsg) {\n  this.plan = function() {\n    throw exceptionMsg;\n  };\n  return this;\n};\n\n/**\n * Calls an alternate implementation when a spy is called.\n *\n * @example\n * var baz = function() {\n *   // do some stuff, return something\n * }\n * // defining a spy from scratch: foo() calls the function baz\n * var foo = jasmine.createSpy('spy on foo').andCall(baz);\n *\n * // defining a spy on an existing property: foo.bar() calls an anonymnous function\n * spyOn(foo, 'bar').andCall(function() { return 'baz';} );\n *\n * @param {Function} fakeFunc\n */\njasmine.Spy.prototype.andCallFake = function(fakeFunc) {\n  this.plan = fakeFunc;\n  return this;\n};\n\n/**\n * Resets all of a spy's the tracking variables so that it can be used again.\n *\n * @example\n * spyOn(foo, 'bar');\n *\n * foo.bar();\n *\n * expect(foo.bar.callCount).toEqual(1);\n *\n * foo.bar.reset();\n *\n * expect(foo.bar.callCount).toEqual(0);\n */\njasmine.Spy.prototype.reset = function() {\n  this.wasCalled = false;\n  this.callCount = 0;\n  this.argsForCall = [];\n  this.calls = [];\n  this.mostRecentCall = {};\n};\n\njasmine.createSpy = function(name) {\n\n  var spyObj = function() {\n    spyObj.wasCalled = true;\n    spyObj.callCount++;\n    var args = jasmine.util.argsToArray(arguments);\n    spyObj.mostRecentCall.object = this;\n    spyObj.mostRecentCall.args = args;\n    spyObj.argsForCall.push(args);\n    spyObj.calls.push({object: this, args: args});\n    return spyObj.plan.apply(this, arguments);\n  };\n\n  var spy = new jasmine.Spy(name);\n\n  for (var prop in spy) {\n    spyObj[prop] = spy[prop];\n  }\n\n  spyObj.reset();\n\n  return spyObj;\n};\n\n/**\n * Determines whether an object is a spy.\n *\n * @param {jasmine.Spy|Object} putativeSpy\n * @returns {Boolean}\n */\njasmine.isSpy = function(putativeSpy) {\n  return putativeSpy && putativeSpy.isSpy;\n};\n\n/**\n * Creates a more complicated spy: an Object that has every property a function that is a spy.  Used for stubbing something\n * large in one call.\n *\n * @param {String} baseName name of spy class\n * @param {Array} methodNames array of names of methods to make spies\n */\njasmine.createSpyObj = function(baseName, methodNames) {\n  if (!jasmine.isArray_(methodNames) || methodNames.length === 0) {\n    throw new Error('createSpyObj requires a non-empty array of method names to create spies for');\n  }\n  var obj = {};\n  for (var i = 0; i < methodNames.length; i++) {\n    obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]);\n  }\n  return obj;\n};\n\n/**\n * All parameters are pretty-printed and concatenated together, then written to the current spec's output.\n *\n * Be careful not to leave calls to <code>jasmine.log</code> in production code.\n */\njasmine.log = function() {\n  var spec = jasmine.getEnv().currentSpec;\n  spec.log.apply(spec, arguments);\n};\n\n/**\n * Function that installs a spy on an existing object's method name.  Used within a Spec to create a spy.\n *\n * @example\n * // spy example\n * var foo = {\n *   not: function(bool) { return !bool; }\n * }\n * spyOn(foo, 'not'); // actual foo.not will not be called, execution stops\n *\n * @see jasmine.createSpy\n * @param obj\n * @param methodName\n * @return {jasmine.Spy} a Jasmine spy that can be chained with all spy methods\n */\nvar spyOn = function(obj, methodName) {\n  return jasmine.getEnv().currentSpec.spyOn(obj, methodName);\n};\nif (isCommonJS) exports.spyOn = spyOn;\n\n/**\n * Creates a Jasmine spec that will be added to the current suite.\n *\n * // TODO: pending tests\n *\n * @example\n * it('should be true', function() {\n *   expect(true).toEqual(true);\n * });\n *\n * @param {String} desc description of this specification\n * @param {Function} func defines the preconditions and expectations of the spec\n */\nvar it = function(desc, func) {\n  return jasmine.getEnv().it(desc, func);\n};\nif (isCommonJS) exports.it = it;\n\n/**\n * Creates a <em>disabled</em> Jasmine spec.\n *\n * A convenience method that allows existing specs to be disabled temporarily during development.\n *\n * @param {String} desc description of this specification\n * @param {Function} func defines the preconditions and expectations of the spec\n */\nvar xit = function(desc, func) {\n  return jasmine.getEnv().xit(desc, func);\n};\nif (isCommonJS) exports.xit = xit;\n\n/**\n * Starts a chain for a Jasmine expectation.\n *\n * It is passed an Object that is the actual value and should chain to one of the many\n * jasmine.Matchers functions.\n *\n * @param {Object} actual Actual value to test against and expected value\n * @return {jasmine.Matchers}\n */\nvar expect = function(actual) {\n  return jasmine.getEnv().currentSpec.expect(actual);\n};\nif (isCommonJS) exports.expect = expect;\n\n/**\n * Defines part of a jasmine spec.  Used in cominbination with waits or waitsFor in asynchrnous specs.\n *\n * @param {Function} func Function that defines part of a jasmine spec.\n */\nvar runs = function(func) {\n  jasmine.getEnv().currentSpec.runs(func);\n};\nif (isCommonJS) exports.runs = runs;\n\n/**\n * Waits a fixed time period before moving to the next block.\n *\n * @deprecated Use waitsFor() instead\n * @param {Number} timeout milliseconds to wait\n */\nvar waits = function(timeout) {\n  jasmine.getEnv().currentSpec.waits(timeout);\n};\nif (isCommonJS) exports.waits = waits;\n\n/**\n * Waits for the latchFunction to return true before proceeding to the next block.\n *\n * @param {Function} latchFunction\n * @param {String} optional_timeoutMessage\n * @param {Number} optional_timeout\n */\nvar waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {\n  jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments);\n};\nif (isCommonJS) exports.waitsFor = waitsFor;\n\n/**\n * A function that is called before each spec in a suite.\n *\n * Used for spec setup, including validating assumptions.\n *\n * @param {Function} beforeEachFunction\n */\nvar beforeEach = function(beforeEachFunction) {\n  jasmine.getEnv().beforeEach(beforeEachFunction);\n};\nif (isCommonJS) exports.beforeEach = beforeEach;\n\n/**\n * A function that is called after each spec in a suite.\n *\n * Used for restoring any state that is hijacked during spec execution.\n *\n * @param {Function} afterEachFunction\n */\nvar afterEach = function(afterEachFunction) {\n  jasmine.getEnv().afterEach(afterEachFunction);\n};\nif (isCommonJS) exports.afterEach = afterEach;\n\n/**\n * Defines a suite of specifications.\n *\n * Stores the description and all defined specs in the Jasmine environment as one suite of specs. Variables declared\n * are accessible by calls to beforeEach, it, and afterEach. Describe blocks can be nested, allowing for specialization\n * of setup in some tests.\n *\n * @example\n * // TODO: a simple suite\n *\n * // TODO: a simple suite with a nested describe block\n *\n * @param {String} description A string, usually the class under test.\n * @param {Function} specDefinitions function that defines several specs.\n */\nvar describe = function(description, specDefinitions) {\n  return jasmine.getEnv().describe(description, specDefinitions);\n};\nif (isCommonJS) exports.describe = describe;\n\n/**\n * Disables a suite of specifications.  Used to disable some suites in a file, or files, temporarily during development.\n *\n * @param {String} description A string, usually the class under test.\n * @param {Function} specDefinitions function that defines several specs.\n */\nvar xdescribe = function(description, specDefinitions) {\n  return jasmine.getEnv().xdescribe(description, specDefinitions);\n};\nif (isCommonJS) exports.xdescribe = xdescribe;\n\n// Provide the XMLHttpRequest class for IE 5.x-6.x:\njasmine.XmlHttpRequest = (typeof XMLHttpRequest == \"undefined\") ? function() {\n  function tryIt(f) {\n    try {\n      return f();\n    } catch(e) {\n    }\n    return null;\n  }\n\n  var xhr = tryIt(function() {\n    return new ActiveXObject(\"Msxml2.XMLHTTP.6.0\");\n  }) ||\n    tryIt(function() {\n      return new ActiveXObject(\"Msxml2.XMLHTTP.3.0\");\n    }) ||\n    tryIt(function() {\n      return new ActiveXObject(\"Msxml2.XMLHTTP\");\n    }) ||\n    tryIt(function() {\n      return new ActiveXObject(\"Microsoft.XMLHTTP\");\n    });\n\n  if (!xhr) throw new Error(\"This browser does not support XMLHttpRequest.\");\n\n  return xhr;\n} : XMLHttpRequest;\n/**\n * @namespace\n */\njasmine.util = {};\n\n/**\n * Declare that a child class inherit it's prototype from the parent class.\n *\n * @private\n * @param {Function} childClass\n * @param {Function} parentClass\n */\njasmine.util.inherit = function(childClass, parentClass) {\n  /**\n   * @private\n   */\n  var subclass = function() {\n  };\n  subclass.prototype = parentClass.prototype;\n  childClass.prototype = new subclass();\n};\n\njasmine.util.formatException = function(e) {\n  var lineNumber;\n  if (e.line) {\n    lineNumber = e.line;\n  }\n  else if (e.lineNumber) {\n    lineNumber = e.lineNumber;\n  }\n\n  var file;\n\n  if (e.sourceURL) {\n    file = e.sourceURL;\n  }\n  else if (e.fileName) {\n    file = e.fileName;\n  }\n\n  var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString();\n\n  if (file && lineNumber) {\n    message += ' in ' + file + ' (line ' + lineNumber + ')';\n  }\n\n  return message;\n};\n\njasmine.util.htmlEscape = function(str) {\n  if (!str) return str;\n  return str.replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;');\n};\n\njasmine.util.argsToArray = function(args) {\n  var arrayOfArgs = [];\n  for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]);\n  return arrayOfArgs;\n};\n\njasmine.util.extend = function(destination, source) {\n  for (var property in source) destination[property] = source[property];\n  return destination;\n};\n\n/**\n * Environment for Jasmine\n *\n * @constructor\n */\njasmine.Env = function() {\n  this.currentSpec = null;\n  this.currentSuite = null;\n  this.currentRunner_ = new jasmine.Runner(this);\n\n  this.reporter = new jasmine.MultiReporter();\n\n  this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL;\n  this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL;\n  this.lastUpdate = 0;\n  this.specFilter = function() {\n    return true;\n  };\n\n  this.nextSpecId_ = 0;\n  this.nextSuiteId_ = 0;\n  this.equalityTesters_ = [];\n\n  // wrap matchers\n  this.matchersClass = function() {\n    jasmine.Matchers.apply(this, arguments);\n  };\n  jasmine.util.inherit(this.matchersClass, jasmine.Matchers);\n\n  jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass);\n};\n\njasmine.Env.prototype.setTimeout = jasmine.setTimeout;\njasmine.Env.prototype.clearTimeout = jasmine.clearTimeout;\njasmine.Env.prototype.setInterval = jasmine.setInterval;\njasmine.Env.prototype.clearInterval = jasmine.clearInterval;\n\n/**\n * @returns an object containing jasmine version build info, if set.\n */\njasmine.Env.prototype.version = function () {\n  if (jasmine.version_) {\n    return jasmine.version_;\n  } else {\n    throw new Error('Version not set');\n  }\n};\n\n/**\n * @returns string containing jasmine version build info, if set.\n */\njasmine.Env.prototype.versionString = function() {\n  if (!jasmine.version_) {\n    return \"version unknown\";\n  }\n\n  var version = this.version();\n  var versionString = version.major + \".\" + version.minor + \".\" + version.build;\n  if (version.release_candidate) {\n    versionString += \".rc\" + version.release_candidate;\n  }\n  versionString += \" revision \" + version.revision;\n  return versionString;\n};\n\n/**\n * @returns a sequential integer starting at 0\n */\njasmine.Env.prototype.nextSpecId = function () {\n  return this.nextSpecId_++;\n};\n\n/**\n * @returns a sequential integer starting at 0\n */\njasmine.Env.prototype.nextSuiteId = function () {\n  return this.nextSuiteId_++;\n};\n\n/**\n * Register a reporter to receive status updates from Jasmine.\n * @param {jasmine.Reporter} reporter An object which will receive status updates.\n */\njasmine.Env.prototype.addReporter = function(reporter) {\n  this.reporter.addReporter(reporter);\n};\n\njasmine.Env.prototype.execute = function() {\n  this.currentRunner_.execute();\n};\n\njasmine.Env.prototype.describe = function(description, specDefinitions) {\n  var suite = new jasmine.Suite(this, description, specDefinitions, this.currentSuite);\n\n  var parentSuite = this.currentSuite;\n  if (parentSuite) {\n    parentSuite.add(suite);\n  } else {\n    this.currentRunner_.add(suite);\n  }\n\n  this.currentSuite = suite;\n\n  var declarationError = null;\n  try {\n    specDefinitions.call(suite);\n  } catch(e) {\n    declarationError = e;\n  }\n\n  if (declarationError) {\n    this.it(\"encountered a declaration exception\", function() {\n      throw declarationError;\n    });\n  }\n\n  this.currentSuite = parentSuite;\n\n  return suite;\n};\n\njasmine.Env.prototype.beforeEach = function(beforeEachFunction) {\n  if (this.currentSuite) {\n    this.currentSuite.beforeEach(beforeEachFunction);\n  } else {\n    this.currentRunner_.beforeEach(beforeEachFunction);\n  }\n};\n\njasmine.Env.prototype.currentRunner = function () {\n  return this.currentRunner_;\n};\n\njasmine.Env.prototype.afterEach = function(afterEachFunction) {\n  if (this.currentSuite) {\n    this.currentSuite.afterEach(afterEachFunction);\n  } else {\n    this.currentRunner_.afterEach(afterEachFunction);\n  }\n\n};\n\njasmine.Env.prototype.xdescribe = function(desc, specDefinitions) {\n  return {\n    execute: function() {\n    }\n  };\n};\n\njasmine.Env.prototype.it = function(description, func) {\n  var spec = new jasmine.Spec(this, this.currentSuite, description);\n  this.currentSuite.add(spec);\n  this.currentSpec = spec;\n\n  if (func) {\n    spec.runs(func);\n  }\n\n  return spec;\n};\n\njasmine.Env.prototype.xit = function(desc, func) {\n  return {\n    id: this.nextSpecId(),\n    runs: function() {\n    }\n  };\n};\n\njasmine.Env.prototype.compareRegExps_ = function(a, b, mismatchKeys, mismatchValues) {\n  if (a.source != b.source)\n    mismatchValues.push(\"expected pattern /\" + b.source + \"/ is not equal to the pattern /\" + a.source + \"/\");\n\n  if (a.ignoreCase != b.ignoreCase)\n    mismatchValues.push(\"expected modifier i was\" + (b.ignoreCase ? \" \" : \" not \") + \"set and does not equal the origin modifier\");\n\n  if (a.global != b.global)\n    mismatchValues.push(\"expected modifier g was\" + (b.global ? \" \" : \" not \") + \"set and does not equal the origin modifier\");\n\n  if (a.multiline != b.multiline)\n    mismatchValues.push(\"expected modifier m was\" + (b.multiline ? \" \" : \" not \") + \"set and does not equal the origin modifier\");\n\n  if (a.sticky != b.sticky)\n    mismatchValues.push(\"expected modifier y was\" + (b.sticky ? \" \" : \" not \") + \"set and does not equal the origin modifier\");\n\n  return (mismatchValues.length === 0);\n};\n\njasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) {\n  if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) {\n    return true;\n  }\n\n  a.__Jasmine_been_here_before__ = b;\n  b.__Jasmine_been_here_before__ = a;\n\n  var hasKey = function(obj, keyName) {\n    return obj !== null && obj[keyName] !== jasmine.undefined;\n  };\n\n  for (var property in b) {\n    if (!hasKey(a, property) && hasKey(b, property)) {\n      mismatchKeys.push(\"expected has key '\" + property + \"', but missing from actual.\");\n    }\n  }\n  for (property in a) {\n    if (!hasKey(b, property) && hasKey(a, property)) {\n      mismatchKeys.push(\"expected missing key '\" + property + \"', but present in actual.\");\n    }\n  }\n  for (property in b) {\n    if (property == '__Jasmine_been_here_before__') continue;\n    if (!this.equals_(a[property], b[property], mismatchKeys, mismatchValues)) {\n      mismatchValues.push(\"'\" + property + \"' was '\" + (b[property] ? jasmine.util.htmlEscape(b[property].toString()) : b[property]) + \"' in expected, but was '\" + (a[property] ? jasmine.util.htmlEscape(a[property].toString()) : a[property]) + \"' in actual.\");\n    }\n  }\n\n  if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) {\n    mismatchValues.push(\"arrays were not the same length\");\n  }\n\n  delete a.__Jasmine_been_here_before__;\n  delete b.__Jasmine_been_here_before__;\n  return (mismatchKeys.length === 0 && mismatchValues.length === 0);\n};\n\njasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) {\n  mismatchKeys = mismatchKeys || [];\n  mismatchValues = mismatchValues || [];\n\n  for (var i = 0; i < this.equalityTesters_.length; i++) {\n    var equalityTester = this.equalityTesters_[i];\n    var result = equalityTester(a, b, this, mismatchKeys, mismatchValues);\n    if (result !== jasmine.undefined) return result;\n  }\n\n  if (a === b) return true;\n\n  if (a === jasmine.undefined || a === null || b === jasmine.undefined || b === null) {\n    return (a == jasmine.undefined && b == jasmine.undefined);\n  }\n\n  if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) {\n    return a === b;\n  }\n\n  if (a instanceof Date && b instanceof Date) {\n    return a.getTime() == b.getTime();\n  }\n\n  if (a.jasmineMatches) {\n    return a.jasmineMatches(b);\n  }\n\n  if (b.jasmineMatches) {\n    return b.jasmineMatches(a);\n  }\n\n  if (a instanceof jasmine.Matchers.ObjectContaining) {\n    return a.matches(b);\n  }\n\n  if (b instanceof jasmine.Matchers.ObjectContaining) {\n    return b.matches(a);\n  }\n\n  if (jasmine.isString_(a) && jasmine.isString_(b)) {\n    return (a == b);\n  }\n\n  if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) {\n    return (a == b);\n  }\n\n  if (a instanceof RegExp && b instanceof RegExp) {\n    return this.compareRegExps_(a, b, mismatchKeys, mismatchValues);\n  }\n\n  if (typeof a === \"object\" && typeof b === \"object\") {\n    return this.compareObjects_(a, b, mismatchKeys, mismatchValues);\n  }\n\n  //Straight check\n  return (a === b);\n};\n\njasmine.Env.prototype.contains_ = function(haystack, needle) {\n  if (jasmine.isArray_(haystack)) {\n    for (var i = 0; i < haystack.length; i++) {\n      if (this.equals_(haystack[i], needle)) return true;\n    }\n    return false;\n  }\n  return haystack.indexOf(needle) >= 0;\n};\n\njasmine.Env.prototype.addEqualityTester = function(equalityTester) {\n  this.equalityTesters_.push(equalityTester);\n};\n/** No-op base class for Jasmine reporters.\n *\n * @constructor\n */\njasmine.Reporter = function() {\n};\n\n//noinspection JSUnusedLocalSymbols\njasmine.Reporter.prototype.reportRunnerStarting = function(runner) {\n};\n\n//noinspection JSUnusedLocalSymbols\njasmine.Reporter.prototype.reportRunnerResults = function(runner) {\n};\n\n//noinspection JSUnusedLocalSymbols\njasmine.Reporter.prototype.reportSuiteResults = function(suite) {\n};\n\n//noinspection JSUnusedLocalSymbols\njasmine.Reporter.prototype.reportSpecStarting = function(spec) {\n};\n\n//noinspection JSUnusedLocalSymbols\njasmine.Reporter.prototype.reportSpecResults = function(spec) {\n};\n\n//noinspection JSUnusedLocalSymbols\njasmine.Reporter.prototype.log = function(str) {\n};\n\n/**\n * Blocks are functions with executable code that make up a spec.\n *\n * @constructor\n * @param {jasmine.Env} env\n * @param {Function} func\n * @param {jasmine.Spec} spec\n */\njasmine.Block = function(env, func, spec) {\n  this.env = env;\n  this.func = func;\n  this.spec = spec;\n};\n\njasmine.Block.prototype.execute = function(onComplete) {\n  if (!jasmine.CATCH_EXCEPTIONS) {\n    this.func.apply(this.spec);\n  }\n  else {\n    try {\n      this.func.apply(this.spec);\n    } catch (e) {\n      this.spec.fail(e);\n    }\n  }\n  onComplete();\n};\n/** JavaScript API reporter.\n *\n * @constructor\n */\njasmine.JsApiReporter = function() {\n  this.started = false;\n  this.finished = false;\n  this.suites_ = [];\n  this.results_ = {};\n};\n\njasmine.JsApiReporter.prototype.reportRunnerStarting = function(runner) {\n  this.started = true;\n  var suites = runner.topLevelSuites();\n  for (var i = 0; i < suites.length; i++) {\n    var suite = suites[i];\n    this.suites_.push(this.summarize_(suite));\n  }\n};\n\njasmine.JsApiReporter.prototype.suites = function() {\n  return this.suites_;\n};\n\njasmine.JsApiReporter.prototype.summarize_ = function(suiteOrSpec) {\n  var isSuite = suiteOrSpec instanceof jasmine.Suite;\n  var summary = {\n    id: suiteOrSpec.id,\n    name: suiteOrSpec.description,\n    type: isSuite ? 'suite' : 'spec',\n    children: []\n  };\n\n  if (isSuite) {\n    var children = suiteOrSpec.children();\n    for (var i = 0; i < children.length; i++) {\n      summary.children.push(this.summarize_(children[i]));\n    }\n  }\n  return summary;\n};\n\njasmine.JsApiReporter.prototype.results = function() {\n  return this.results_;\n};\n\njasmine.JsApiReporter.prototype.resultsForSpec = function(specId) {\n  return this.results_[specId];\n};\n\n//noinspection JSUnusedLocalSymbols\njasmine.JsApiReporter.prototype.reportRunnerResults = function(runner) {\n  this.finished = true;\n};\n\n//noinspection JSUnusedLocalSymbols\njasmine.JsApiReporter.prototype.reportSuiteResults = function(suite) {\n};\n\n//noinspection JSUnusedLocalSymbols\njasmine.JsApiReporter.prototype.reportSpecResults = function(spec) {\n  this.results_[spec.id] = {\n    messages: spec.results().getItems(),\n    result: spec.results().failedCount > 0 ? \"failed\" : \"passed\"\n  };\n};\n\n//noinspection JSUnusedLocalSymbols\njasmine.JsApiReporter.prototype.log = function(str) {\n};\n\njasmine.JsApiReporter.prototype.resultsForSpecs = function(specIds){\n  var results = {};\n  for (var i = 0; i < specIds.length; i++) {\n    var specId = specIds[i];\n    results[specId] = this.summarizeResult_(this.results_[specId]);\n  }\n  return results;\n};\n\njasmine.JsApiReporter.prototype.summarizeResult_ = function(result){\n  var summaryMessages = [];\n  var messagesLength = result.messages.length;\n  for (var messageIndex = 0; messageIndex < messagesLength; messageIndex++) {\n    var resultMessage = result.messages[messageIndex];\n    summaryMessages.push({\n      text: resultMessage.type == 'log' ? resultMessage.toString() : jasmine.undefined,\n      passed: resultMessage.passed ? resultMessage.passed() : true,\n      type: resultMessage.type,\n      message: resultMessage.message,\n      trace: {\n        stack: resultMessage.passed && !resultMessage.passed() ? resultMessage.trace.stack : jasmine.undefined\n      }\n    });\n  }\n\n  return {\n    result : result.result,\n    messages : summaryMessages\n  };\n};\n\n/**\n * @constructor\n * @param {jasmine.Env} env\n * @param actual\n * @param {jasmine.Spec} spec\n */\njasmine.Matchers = function(env, actual, spec, opt_isNot) {\n  this.env = env;\n  this.actual = actual;\n  this.spec = spec;\n  this.isNot = opt_isNot || false;\n  this.reportWasCalled_ = false;\n};\n\n// todo: @deprecated as of Jasmine 0.11, remove soon [xw]\njasmine.Matchers.pp = function(str) {\n  throw new Error(\"jasmine.Matchers.pp() is no longer supported, please use jasmine.pp() instead!\");\n};\n\n// todo: @deprecated Deprecated as of Jasmine 0.10. Rewrite your custom matchers to return true or false. [xw]\njasmine.Matchers.prototype.report = function(result, failing_message, details) {\n  throw new Error(\"As of jasmine 0.11, custom matchers must be implemented differently -- please see jasmine docs\");\n};\n\njasmine.Matchers.wrapInto_ = function(prototype, matchersClass) {\n  for (var methodName in prototype) {\n    if (methodName == 'report') continue;\n    var orig = prototype[methodName];\n    matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig);\n  }\n};\n\njasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) {\n  return function() {\n    var matcherArgs = jasmine.util.argsToArray(arguments);\n    var result = matcherFunction.apply(this, arguments);\n\n    if (this.isNot) {\n      result = !result;\n    }\n\n    if (this.reportWasCalled_) return result;\n\n    var message;\n    if (!result) {\n      if (this.message) {\n        message = this.message.apply(this, arguments);\n        if (jasmine.isArray_(message)) {\n          message = message[this.isNot ? 1 : 0];\n        }\n      } else {\n        var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); });\n        message = \"Expected \" + jasmine.pp(this.actual) + (this.isNot ? \" not \" : \" \") + englishyPredicate;\n        if (matcherArgs.length > 0) {\n          for (var i = 0; i < matcherArgs.length; i++) {\n            if (i > 0) message += \",\";\n            message += \" \" + jasmine.pp(matcherArgs[i]);\n          }\n        }\n        message += \".\";\n      }\n    }\n    var expectationResult = new jasmine.ExpectationResult({\n      matcherName: matcherName,\n      passed: result,\n      expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0],\n      actual: this.actual,\n      message: message\n    });\n    this.spec.addMatcherResult(expectationResult);\n    return jasmine.undefined;\n  };\n};\n\n/**\n * toBe: compares the actual to the expected using ===\n * @param expected\n */\njasmine.Matchers.prototype.toBe = function(expected) {\n  return this.actual === expected;\n};\n\n/**\n * toNotBe: compares the actual to the expected using !==\n * @param expected\n * @deprecated as of 1.0. Use not.toBe() instead.\n */\njasmine.Matchers.prototype.toNotBe = function(expected) {\n  return this.actual !== expected;\n};\n\n/**\n * toEqual: compares the actual to the expected using common sense equality. Handles Objects, Arrays, etc.\n *\n * @param expected\n */\njasmine.Matchers.prototype.toEqual = function(expected) {\n  return this.env.equals_(this.actual, expected);\n};\n\n/**\n * toNotEqual: compares the actual to the expected using the ! of jasmine.Matchers.toEqual\n * @param expected\n * @deprecated as of 1.0. Use not.toEqual() instead.\n */\njasmine.Matchers.prototype.toNotEqual = function(expected) {\n  return !this.env.equals_(this.actual, expected);\n};\n\n/**\n * Matcher that compares the actual to the expected using a regular expression.  Constructs a RegExp, so takes\n * a pattern or a String.\n *\n * @param expected\n */\njasmine.Matchers.prototype.toMatch = function(expected) {\n  return new RegExp(expected).test(this.actual);\n};\n\n/**\n * Matcher that compares the actual to the expected using the boolean inverse of jasmine.Matchers.toMatch\n * @param expected\n * @deprecated as of 1.0. Use not.toMatch() instead.\n */\njasmine.Matchers.prototype.toNotMatch = function(expected) {\n  return !(new RegExp(expected).test(this.actual));\n};\n\n/**\n * Matcher that compares the actual to jasmine.undefined.\n */\njasmine.Matchers.prototype.toBeDefined = function() {\n  return (this.actual !== jasmine.undefined);\n};\n\n/**\n * Matcher that compares the actual to jasmine.undefined.\n */\njasmine.Matchers.prototype.toBeUndefined = function() {\n  return (this.actual === jasmine.undefined);\n};\n\n/**\n * Matcher that compares the actual to null.\n */\njasmine.Matchers.prototype.toBeNull = function() {\n  return (this.actual === null);\n};\n\n/**\n * Matcher that compares the actual to NaN.\n */\njasmine.Matchers.prototype.toBeNaN = function() {\n\tthis.message = function() {\n\t\treturn [ \"Expected \" + jasmine.pp(this.actual) + \" to be NaN.\" ];\n\t};\n\n\treturn (this.actual !== this.actual);\n};\n\n/**\n * Matcher that boolean not-nots the actual.\n */\njasmine.Matchers.prototype.toBeTruthy = function() {\n  return !!this.actual;\n};\n\n/**\n * Matcher that boolean nots the actual.\n */\njasmine.Matchers.prototype.toBeFalsy = function() {\n  return !this.actual;\n};\n\n/**\n * Matcher that checks to see if the actual, a Jasmine spy, was called.\n */\njasmine.Matchers.prototype.toHaveBeenCalled = function() {\n  if (arguments.length > 0) {\n    throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith');\n  }\n\n  if (!jasmine.isSpy(this.actual)) {\n    throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');\n  }\n\n  this.message = function() {\n    return [\n      \"Expected spy \" + this.actual.identity + \" to have been called.\",\n      \"Expected spy \" + this.actual.identity + \" not to have been called.\"\n    ];\n  };\n\n  return this.actual.wasCalled;\n};\n\n/** @deprecated Use expect(xxx).toHaveBeenCalled() instead */\njasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled;\n\n/**\n * Matcher that checks to see if the actual, a Jasmine spy, was not called.\n *\n * @deprecated Use expect(xxx).not.toHaveBeenCalled() instead\n */\njasmine.Matchers.prototype.wasNotCalled = function() {\n  if (arguments.length > 0) {\n    throw new Error('wasNotCalled does not take arguments');\n  }\n\n  if (!jasmine.isSpy(this.actual)) {\n    throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');\n  }\n\n  this.message = function() {\n    return [\n      \"Expected spy \" + this.actual.identity + \" to not have been called.\",\n      \"Expected spy \" + this.actual.identity + \" to have been called.\"\n    ];\n  };\n\n  return !this.actual.wasCalled;\n};\n\n/**\n * Matcher that checks to see if the actual, a Jasmine spy, was called with a set of parameters.\n *\n * @example\n *\n */\njasmine.Matchers.prototype.toHaveBeenCalledWith = function() {\n  var expectedArgs = jasmine.util.argsToArray(arguments);\n  if (!jasmine.isSpy(this.actual)) {\n    throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');\n  }\n  this.message = function() {\n    var invertedMessage = \"Expected spy \" + this.actual.identity + \" not to have been called with \" + jasmine.pp(expectedArgs) + \" but it was.\";\n    var positiveMessage = \"\";\n    if (this.actual.callCount === 0) {\n      positiveMessage = \"Expected spy \" + this.actual.identity + \" to have been called with \" + jasmine.pp(expectedArgs) + \" but it was never called.\";\n    } else {\n      positiveMessage = \"Expected spy \" + this.actual.identity + \" to have been called with \" + jasmine.pp(expectedArgs) + \" but actual calls were \" + jasmine.pp(this.actual.argsForCall).replace(/^\\[ | \\]$/g, '')\n    }\n    return [positiveMessage, invertedMessage];\n  };\n\n  return this.env.contains_(this.actual.argsForCall, expectedArgs);\n};\n\n/** @deprecated Use expect(xxx).toHaveBeenCalledWith() instead */\njasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith;\n\n/** @deprecated Use expect(xxx).not.toHaveBeenCalledWith() instead */\njasmine.Matchers.prototype.wasNotCalledWith = function() {\n  var expectedArgs = jasmine.util.argsToArray(arguments);\n  if (!jasmine.isSpy(this.actual)) {\n    throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');\n  }\n\n  this.message = function() {\n    return [\n      \"Expected spy not to have been called with \" + jasmine.pp(expectedArgs) + \" but it was\",\n      \"Expected spy to have been called with \" + jasmine.pp(expectedArgs) + \" but it was\"\n    ];\n  };\n\n  return !this.env.contains_(this.actual.argsForCall, expectedArgs);\n};\n\n/**\n * Matcher that checks that the expected item is an element in the actual Array.\n *\n * @param {Object} expected\n */\njasmine.Matchers.prototype.toContain = function(expected) {\n  return this.env.contains_(this.actual, expected);\n};\n\n/**\n * Matcher that checks that the expected item is NOT an element in the actual Array.\n *\n * @param {Object} expected\n * @deprecated as of 1.0. Use not.toContain() instead.\n */\njasmine.Matchers.prototype.toNotContain = function(expected) {\n  return !this.env.contains_(this.actual, expected);\n};\n\njasmine.Matchers.prototype.toBeLessThan = function(expected) {\n  return this.actual < expected;\n};\n\njasmine.Matchers.prototype.toBeGreaterThan = function(expected) {\n  return this.actual > expected;\n};\n\n/**\n * Matcher that checks that the expected item is equal to the actual item\n * up to a given level of decimal precision (default 2).\n *\n * @param {Number} expected\n * @param {Number} precision, as number of decimal places\n */\njasmine.Matchers.prototype.toBeCloseTo = function(expected, precision) {\n  if (!(precision === 0)) {\n    precision = precision || 2;\n  }\n  return Math.abs(expected - this.actual) < (Math.pow(10, -precision) / 2);\n};\n\n/**\n * Matcher that checks that the expected exception was thrown by the actual.\n *\n * @param {String} [expected]\n */\njasmine.Matchers.prototype.toThrow = function(expected) {\n  var result = false;\n  var exception;\n  if (typeof this.actual != 'function') {\n    throw new Error('Actual is not a function');\n  }\n  try {\n    this.actual();\n  } catch (e) {\n    exception = e;\n  }\n  if (exception) {\n    result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected));\n  }\n\n  var not = this.isNot ? \"not \" : \"\";\n\n  this.message = function() {\n    if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) {\n      return [\"Expected function \" + not + \"to throw\", expected ? expected.message || expected : \"an exception\", \", but it threw\", exception.message || exception].join(' ');\n    } else {\n      return \"Expected function to throw an exception.\";\n    }\n  };\n\n  return result;\n};\n\njasmine.Matchers.Any = function(expectedClass) {\n  this.expectedClass = expectedClass;\n};\n\njasmine.Matchers.Any.prototype.jasmineMatches = function(other) {\n  if (this.expectedClass == String) {\n    return typeof other == 'string' || other instanceof String;\n  }\n\n  if (this.expectedClass == Number) {\n    return typeof other == 'number' || other instanceof Number;\n  }\n\n  if (this.expectedClass == Function) {\n    return typeof other == 'function' || other instanceof Function;\n  }\n\n  if (this.expectedClass == Object) {\n    return typeof other == 'object';\n  }\n\n  return other instanceof this.expectedClass;\n};\n\njasmine.Matchers.Any.prototype.jasmineToString = function() {\n  return '<jasmine.any(' + this.expectedClass + ')>';\n};\n\njasmine.Matchers.ObjectContaining = function (sample) {\n  this.sample = sample;\n};\n\njasmine.Matchers.ObjectContaining.prototype.jasmineMatches = function(other, mismatchKeys, mismatchValues) {\n  mismatchKeys = mismatchKeys || [];\n  mismatchValues = mismatchValues || [];\n\n  var env = jasmine.getEnv();\n\n  var hasKey = function(obj, keyName) {\n    return obj != null && obj[keyName] !== jasmine.undefined;\n  };\n\n  for (var property in this.sample) {\n    if (!hasKey(other, property) && hasKey(this.sample, property)) {\n      mismatchKeys.push(\"expected has key '\" + property + \"', but missing from actual.\");\n    }\n    else if (!env.equals_(this.sample[property], other[property], mismatchKeys, mismatchValues)) {\n      mismatchValues.push(\"'\" + property + \"' was '\" + (other[property] ? jasmine.util.htmlEscape(other[property].toString()) : other[property]) + \"' in expected, but was '\" + (this.sample[property] ? jasmine.util.htmlEscape(this.sample[property].toString()) : this.sample[property]) + \"' in actual.\");\n    }\n  }\n\n  return (mismatchKeys.length === 0 && mismatchValues.length === 0);\n};\n\njasmine.Matchers.ObjectContaining.prototype.jasmineToString = function () {\n  return \"<jasmine.objectContaining(\" + jasmine.pp(this.sample) + \")>\";\n};\n// Mock setTimeout, clearTimeout\n// Contributed by Pivotal Computer Systems, www.pivotalsf.com\n\njasmine.FakeTimer = function() {\n  this.reset();\n\n  var self = this;\n  self.setTimeout = function(funcToCall, millis) {\n    self.timeoutsMade++;\n    self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false);\n    return self.timeoutsMade;\n  };\n\n  self.setInterval = function(funcToCall, millis) {\n    self.timeoutsMade++;\n    self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true);\n    return self.timeoutsMade;\n  };\n\n  self.clearTimeout = function(timeoutKey) {\n    self.scheduledFunctions[timeoutKey] = jasmine.undefined;\n  };\n\n  self.clearInterval = function(timeoutKey) {\n    self.scheduledFunctions[timeoutKey] = jasmine.undefined;\n  };\n\n};\n\njasmine.FakeTimer.prototype.reset = function() {\n  this.timeoutsMade = 0;\n  this.scheduledFunctions = {};\n  this.nowMillis = 0;\n};\n\njasmine.FakeTimer.prototype.tick = function(millis) {\n  var oldMillis = this.nowMillis;\n  var newMillis = oldMillis + millis;\n  this.runFunctionsWithinRange(oldMillis, newMillis);\n  this.nowMillis = newMillis;\n};\n\njasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) {\n  var scheduledFunc;\n  var funcsToRun = [];\n  for (var timeoutKey in this.scheduledFunctions) {\n    scheduledFunc = this.scheduledFunctions[timeoutKey];\n    if (scheduledFunc != jasmine.undefined &&\n        scheduledFunc.runAtMillis >= oldMillis &&\n        scheduledFunc.runAtMillis <= nowMillis) {\n      funcsToRun.push(scheduledFunc);\n      this.scheduledFunctions[timeoutKey] = jasmine.undefined;\n    }\n  }\n\n  if (funcsToRun.length > 0) {\n    funcsToRun.sort(function(a, b) {\n      return a.runAtMillis - b.runAtMillis;\n    });\n    for (var i = 0; i < funcsToRun.length; ++i) {\n      try {\n        var funcToRun = funcsToRun[i];\n        this.nowMillis = funcToRun.runAtMillis;\n        funcToRun.funcToCall();\n        if (funcToRun.recurring) {\n          this.scheduleFunction(funcToRun.timeoutKey,\n              funcToRun.funcToCall,\n              funcToRun.millis,\n              true);\n        }\n      } catch(e) {\n      }\n    }\n    this.runFunctionsWithinRange(oldMillis, nowMillis);\n  }\n};\n\njasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) {\n  this.scheduledFunctions[timeoutKey] = {\n    runAtMillis: this.nowMillis + millis,\n    funcToCall: funcToCall,\n    recurring: recurring,\n    timeoutKey: timeoutKey,\n    millis: millis\n  };\n};\n\n/**\n * @namespace\n */\njasmine.Clock = {\n  defaultFakeTimer: new jasmine.FakeTimer(),\n\n  reset: function() {\n    jasmine.Clock.assertInstalled();\n    jasmine.Clock.defaultFakeTimer.reset();\n  },\n\n  tick: function(millis) {\n    jasmine.Clock.assertInstalled();\n    jasmine.Clock.defaultFakeTimer.tick(millis);\n  },\n\n  runFunctionsWithinRange: function(oldMillis, nowMillis) {\n    jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis);\n  },\n\n  scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) {\n    jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring);\n  },\n\n  useMock: function() {\n    if (!jasmine.Clock.isInstalled()) {\n      var spec = jasmine.getEnv().currentSpec;\n      spec.after(jasmine.Clock.uninstallMock);\n\n      jasmine.Clock.installMock();\n    }\n  },\n\n  installMock: function() {\n    jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer;\n  },\n\n  uninstallMock: function() {\n    jasmine.Clock.assertInstalled();\n    jasmine.Clock.installed = jasmine.Clock.real;\n  },\n\n  real: {\n    setTimeout: jasmine.getGlobal().setTimeout,\n    clearTimeout: jasmine.getGlobal().clearTimeout,\n    setInterval: jasmine.getGlobal().setInterval,\n    clearInterval: jasmine.getGlobal().clearInterval\n  },\n\n  assertInstalled: function() {\n    if (!jasmine.Clock.isInstalled()) {\n      throw new Error(\"Mock clock is not installed, use jasmine.Clock.useMock()\");\n    }\n  },\n\n  isInstalled: function() {\n    return jasmine.Clock.installed == jasmine.Clock.defaultFakeTimer;\n  },\n\n  installed: null\n};\njasmine.Clock.installed = jasmine.Clock.real;\n\n//else for IE support\njasmine.getGlobal().setTimeout = function(funcToCall, millis) {\n  if (jasmine.Clock.installed.setTimeout.apply) {\n    return jasmine.Clock.installed.setTimeout.apply(this, arguments);\n  } else {\n    return jasmine.Clock.installed.setTimeout(funcToCall, millis);\n  }\n};\n\njasmine.getGlobal().setInterval = function(funcToCall, millis) {\n  if (jasmine.Clock.installed.setInterval.apply) {\n    return jasmine.Clock.installed.setInterval.apply(this, arguments);\n  } else {\n    return jasmine.Clock.installed.setInterval(funcToCall, millis);\n  }\n};\n\njasmine.getGlobal().clearTimeout = function(timeoutKey) {\n  if (jasmine.Clock.installed.clearTimeout.apply) {\n    return jasmine.Clock.installed.clearTimeout.apply(this, arguments);\n  } else {\n    return jasmine.Clock.installed.clearTimeout(timeoutKey);\n  }\n};\n\njasmine.getGlobal().clearInterval = function(timeoutKey) {\n  if (jasmine.Clock.installed.clearTimeout.apply) {\n    return jasmine.Clock.installed.clearInterval.apply(this, arguments);\n  } else {\n    return jasmine.Clock.installed.clearInterval(timeoutKey);\n  }\n};\n\n/**\n * @constructor\n */\njasmine.MultiReporter = function() {\n  this.subReporters_ = [];\n};\njasmine.util.inherit(jasmine.MultiReporter, jasmine.Reporter);\n\njasmine.MultiReporter.prototype.addReporter = function(reporter) {\n  this.subReporters_.push(reporter);\n};\n\n(function() {\n  var functionNames = [\n    \"reportRunnerStarting\",\n    \"reportRunnerResults\",\n    \"reportSuiteResults\",\n    \"reportSpecStarting\",\n    \"reportSpecResults\",\n    \"log\"\n  ];\n  for (var i = 0; i < functionNames.length; i++) {\n    var functionName = functionNames[i];\n    jasmine.MultiReporter.prototype[functionName] = (function(functionName) {\n      return function() {\n        for (var j = 0; j < this.subReporters_.length; j++) {\n          var subReporter = this.subReporters_[j];\n          if (subReporter[functionName]) {\n            subReporter[functionName].apply(subReporter, arguments);\n          }\n        }\n      };\n    })(functionName);\n  }\n})();\n/**\n * Holds results for a set of Jasmine spec. Allows for the results array to hold another jasmine.NestedResults\n *\n * @constructor\n */\njasmine.NestedResults = function() {\n  /**\n   * The total count of results\n   */\n  this.totalCount = 0;\n  /**\n   * Number of passed results\n   */\n  this.passedCount = 0;\n  /**\n   * Number of failed results\n   */\n  this.failedCount = 0;\n  /**\n   * Was this suite/spec skipped?\n   */\n  this.skipped = false;\n  /**\n   * @ignore\n   */\n  this.items_ = [];\n};\n\n/**\n * Roll up the result counts.\n *\n * @param result\n */\njasmine.NestedResults.prototype.rollupCounts = function(result) {\n  this.totalCount += result.totalCount;\n  this.passedCount += result.passedCount;\n  this.failedCount += result.failedCount;\n};\n\n/**\n * Adds a log message.\n * @param values Array of message parts which will be concatenated later.\n */\njasmine.NestedResults.prototype.log = function(values) {\n  this.items_.push(new jasmine.MessageResult(values));\n};\n\n/**\n * Getter for the results: message & results.\n */\njasmine.NestedResults.prototype.getItems = function() {\n  return this.items_;\n};\n\n/**\n * Adds a result, tracking counts (total, passed, & failed)\n * @param {jasmine.ExpectationResult|jasmine.NestedResults} result\n */\njasmine.NestedResults.prototype.addResult = function(result) {\n  if (result.type != 'log') {\n    if (result.items_) {\n      this.rollupCounts(result);\n    } else {\n      this.totalCount++;\n      if (result.passed()) {\n        this.passedCount++;\n      } else {\n        this.failedCount++;\n      }\n    }\n  }\n  this.items_.push(result);\n};\n\n/**\n * @returns {Boolean} True if <b>everything</b> below passed\n */\njasmine.NestedResults.prototype.passed = function() {\n  return this.passedCount === this.totalCount;\n};\n/**\n * Base class for pretty printing for expectation results.\n */\njasmine.PrettyPrinter = function() {\n  this.ppNestLevel_ = 0;\n};\n\n/**\n * Formats a value in a nice, human-readable string.\n *\n * @param value\n */\njasmine.PrettyPrinter.prototype.format = function(value) {\n  this.ppNestLevel_++;\n  try {\n    if (value === jasmine.undefined) {\n      this.emitScalar('undefined');\n    } else if (value === null) {\n      this.emitScalar('null');\n    } else if (value === jasmine.getGlobal()) {\n      this.emitScalar('<global>');\n    } else if (value.jasmineToString) {\n      this.emitScalar(value.jasmineToString());\n    } else if (typeof value === 'string') {\n      this.emitString(value);\n    } else if (jasmine.isSpy(value)) {\n      this.emitScalar(\"spy on \" + value.identity);\n    } else if (value instanceof RegExp) {\n      this.emitScalar(value.toString());\n    } else if (typeof value === 'function') {\n      this.emitScalar('Function');\n    } else if (typeof value.nodeType === 'number') {\n      this.emitScalar('HTMLNode');\n    } else if (value instanceof Date) {\n      this.emitScalar('Date(' + value + ')');\n    } else if (value.__Jasmine_been_here_before__) {\n      this.emitScalar('<circular reference: ' + (jasmine.isArray_(value) ? 'Array' : 'Object') + '>');\n    } else if (jasmine.isArray_(value) || typeof value == 'object') {\n      value.__Jasmine_been_here_before__ = true;\n      if (jasmine.isArray_(value)) {\n        this.emitArray(value);\n      } else {\n        this.emitObject(value);\n      }\n      delete value.__Jasmine_been_here_before__;\n    } else {\n      this.emitScalar(value.toString());\n    }\n  } finally {\n    this.ppNestLevel_--;\n  }\n};\n\njasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) {\n  for (var property in obj) {\n    if (!obj.hasOwnProperty(property)) continue;\n    if (property == '__Jasmine_been_here_before__') continue;\n    fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property) !== jasmine.undefined &&\n                                         obj.__lookupGetter__(property) !== null) : false);\n  }\n};\n\njasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_;\njasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_;\njasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_;\njasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_;\n\njasmine.StringPrettyPrinter = function() {\n  jasmine.PrettyPrinter.call(this);\n\n  this.string = '';\n};\njasmine.util.inherit(jasmine.StringPrettyPrinter, jasmine.PrettyPrinter);\n\njasmine.StringPrettyPrinter.prototype.emitScalar = function(value) {\n  this.append(value);\n};\n\njasmine.StringPrettyPrinter.prototype.emitString = function(value) {\n  this.append(\"'\" + value + \"'\");\n};\n\njasmine.StringPrettyPrinter.prototype.emitArray = function(array) {\n  if (this.ppNestLevel_ > jasmine.MAX_PRETTY_PRINT_DEPTH) {\n    this.append(\"Array\");\n    return;\n  }\n\n  this.append('[ ');\n  for (var i = 0; i < array.length; i++) {\n    if (i > 0) {\n      this.append(', ');\n    }\n    this.format(array[i]);\n  }\n  this.append(' ]');\n};\n\njasmine.StringPrettyPrinter.prototype.emitObject = function(obj) {\n  if (this.ppNestLevel_ > jasmine.MAX_PRETTY_PRINT_DEPTH) {\n    this.append(\"Object\");\n    return;\n  }\n\n  var self = this;\n  this.append('{ ');\n  var first = true;\n\n  this.iterateObject(obj, function(property, isGetter) {\n    if (first) {\n      first = false;\n    } else {\n      self.append(', ');\n    }\n\n    self.append(property);\n    self.append(' : ');\n    if (isGetter) {\n      self.append('<getter>');\n    } else {\n      self.format(obj[property]);\n    }\n  });\n\n  this.append(' }');\n};\n\njasmine.StringPrettyPrinter.prototype.append = function(value) {\n  this.string += value;\n};\njasmine.Queue = function(env) {\n  this.env = env;\n\n  // parallel to blocks. each true value in this array means the block will\n  // get executed even if we abort\n  this.ensured = [];\n  this.blocks = [];\n  this.running = false;\n  this.index = 0;\n  this.offset = 0;\n  this.abort = false;\n};\n\njasmine.Queue.prototype.addBefore = function(block, ensure) {\n  if (ensure === jasmine.undefined) {\n    ensure = false;\n  }\n\n  this.blocks.unshift(block);\n  this.ensured.unshift(ensure);\n};\n\njasmine.Queue.prototype.add = function(block, ensure) {\n  if (ensure === jasmine.undefined) {\n    ensure = false;\n  }\n\n  this.blocks.push(block);\n  this.ensured.push(ensure);\n};\n\njasmine.Queue.prototype.insertNext = function(block, ensure) {\n  if (ensure === jasmine.undefined) {\n    ensure = false;\n  }\n\n  this.ensured.splice((this.index + this.offset + 1), 0, ensure);\n  this.blocks.splice((this.index + this.offset + 1), 0, block);\n  this.offset++;\n};\n\njasmine.Queue.prototype.start = function(onComplete) {\n  this.running = true;\n  this.onComplete = onComplete;\n  this.next_();\n};\n\njasmine.Queue.prototype.isRunning = function() {\n  return this.running;\n};\n\njasmine.Queue.LOOP_DONT_RECURSE = true;\n\njasmine.Queue.prototype.next_ = function() {\n  var self = this;\n  var goAgain = true;\n\n  while (goAgain) {\n    goAgain = false;\n\n    if (self.index < self.blocks.length && !(this.abort && !this.ensured[self.index])) {\n      var calledSynchronously = true;\n      var completedSynchronously = false;\n\n      var onComplete = function () {\n        if (jasmine.Queue.LOOP_DONT_RECURSE && calledSynchronously) {\n          completedSynchronously = true;\n          return;\n        }\n\n        if (self.blocks[self.index].abort) {\n          self.abort = true;\n        }\n\n        self.offset = 0;\n        self.index++;\n\n        var now = new Date().getTime();\n        if (self.env.updateInterval && now - self.env.lastUpdate > self.env.updateInterval) {\n          self.env.lastUpdate = now;\n          self.env.setTimeout(function() {\n            self.next_();\n          }, 0);\n        } else {\n          if (jasmine.Queue.LOOP_DONT_RECURSE && completedSynchronously) {\n            goAgain = true;\n          } else {\n            self.next_();\n          }\n        }\n      };\n      self.blocks[self.index].execute(onComplete);\n\n      calledSynchronously = false;\n      if (completedSynchronously) {\n        onComplete();\n      }\n\n    } else {\n      self.running = false;\n      if (self.onComplete) {\n        self.onComplete();\n      }\n    }\n  }\n};\n\njasmine.Queue.prototype.results = function() {\n  var results = new jasmine.NestedResults();\n  for (var i = 0; i < this.blocks.length; i++) {\n    if (this.blocks[i].results) {\n      results.addResult(this.blocks[i].results());\n    }\n  }\n  return results;\n};\n\n/**\n * Runner\n *\n * @constructor\n * @param {jasmine.Env} env\n */\njasmine.Runner = function(env) {\n  var self = this;\n  self.env = env;\n  self.queue = new jasmine.Queue(env);\n  self.before_ = [];\n  self.after_ = [];\n  self.suites_ = [];\n};\n\njasmine.Runner.prototype.execute = function() {\n  var self = this;\n  if (self.env.reporter.reportRunnerStarting) {\n    self.env.reporter.reportRunnerStarting(this);\n  }\n  self.queue.start(function () {\n    self.finishCallback();\n  });\n};\n\njasmine.Runner.prototype.beforeEach = function(beforeEachFunction) {\n  beforeEachFunction.typeName = 'beforeEach';\n  this.before_.splice(0,0,beforeEachFunction);\n};\n\njasmine.Runner.prototype.afterEach = function(afterEachFunction) {\n  afterEachFunction.typeName = 'afterEach';\n  this.after_.splice(0,0,afterEachFunction);\n};\n\njasmine.Runner.prototype.finishCallback = function() {\n  this.env.reporter.reportRunnerResults(this);\n};\n\njasmine.Runner.prototype.addSuite = function(suite) {\n  this.suites_.push(suite);\n};\n\njasmine.Runner.prototype.add = function(block) {\n  if (block instanceof jasmine.Suite) {\n    this.addSuite(block);\n  }\n  this.queue.add(block);\n};\n\njasmine.Runner.prototype.specs = function () {\n  var suites = this.suites();\n  var specs = [];\n  for (var i = 0; i < suites.length; i++) {\n    specs = specs.concat(suites[i].specs());\n  }\n  return specs;\n};\n\njasmine.Runner.prototype.suites = function() {\n  return this.suites_;\n};\n\njasmine.Runner.prototype.topLevelSuites = function() {\n  var topLevelSuites = [];\n  for (var i = 0; i < this.suites_.length; i++) {\n    if (!this.suites_[i].parentSuite) {\n      topLevelSuites.push(this.suites_[i]);\n    }\n  }\n  return topLevelSuites;\n};\n\njasmine.Runner.prototype.results = function() {\n  return this.queue.results();\n};\n/**\n * Internal representation of a Jasmine specification, or test.\n *\n * @constructor\n * @param {jasmine.Env} env\n * @param {jasmine.Suite} suite\n * @param {String} description\n */\njasmine.Spec = function(env, suite, description) {\n  if (!env) {\n    throw new Error('jasmine.Env() required');\n  }\n  if (!suite) {\n    throw new Error('jasmine.Suite() required');\n  }\n  var spec = this;\n  spec.id = env.nextSpecId ? env.nextSpecId() : null;\n  spec.env = env;\n  spec.suite = suite;\n  spec.description = description;\n  spec.queue = new jasmine.Queue(env);\n\n  spec.afterCallbacks = [];\n  spec.spies_ = [];\n\n  spec.results_ = new jasmine.NestedResults();\n  spec.results_.description = description;\n  spec.matchersClass = null;\n};\n\njasmine.Spec.prototype.getFullName = function() {\n  return this.suite.getFullName() + ' ' + this.description + '.';\n};\n\njasmine.Spec.prototype.results = function() {\n  return this.results_;\n};\n\n/**\n * All parameters are pretty-printed and concatenated together, then written to the spec's output.\n *\n * Be careful not to leave calls to <code>jasmine.log</code> in production code.\n */\njasmine.Spec.prototype.log = function() {\n  return this.results_.log(arguments);\n};\n\njasmine.Spec.prototype.runs = function (func) {\n  var block = new jasmine.Block(this.env, func, this);\n  this.addToQueue(block);\n  return this;\n};\n\njasmine.Spec.prototype.addToQueue = function (block) {\n  if (this.queue.isRunning()) {\n    this.queue.insertNext(block);\n  } else {\n    this.queue.add(block);\n  }\n};\n\n/**\n * @param {jasmine.ExpectationResult} result\n */\njasmine.Spec.prototype.addMatcherResult = function(result) {\n  this.results_.addResult(result);\n};\n\njasmine.Spec.prototype.expect = function(actual) {\n  var positive = new (this.getMatchersClass_())(this.env, actual, this);\n  positive.not = new (this.getMatchersClass_())(this.env, actual, this, true);\n  return positive;\n};\n\n/**\n * Waits a fixed time period before moving to the next block.\n *\n * @deprecated Use waitsFor() instead\n * @param {Number} timeout milliseconds to wait\n */\njasmine.Spec.prototype.waits = function(timeout) {\n  var waitsFunc = new jasmine.WaitsBlock(this.env, timeout, this);\n  this.addToQueue(waitsFunc);\n  return this;\n};\n\n/**\n * Waits for the latchFunction to return true before proceeding to the next block.\n *\n * @param {Function} latchFunction\n * @param {String} optional_timeoutMessage\n * @param {Number} optional_timeout\n */\njasmine.Spec.prototype.waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {\n  var latchFunction_ = null;\n  var optional_timeoutMessage_ = null;\n  var optional_timeout_ = null;\n\n  for (var i = 0; i < arguments.length; i++) {\n    var arg = arguments[i];\n    switch (typeof arg) {\n      case 'function':\n        latchFunction_ = arg;\n        break;\n      case 'string':\n        optional_timeoutMessage_ = arg;\n        break;\n      case 'number':\n        optional_timeout_ = arg;\n        break;\n    }\n  }\n\n  var waitsForFunc = new jasmine.WaitsForBlock(this.env, optional_timeout_, latchFunction_, optional_timeoutMessage_, this);\n  this.addToQueue(waitsForFunc);\n  return this;\n};\n\njasmine.Spec.prototype.fail = function (e) {\n  var expectationResult = new jasmine.ExpectationResult({\n    passed: false,\n    message: e ? jasmine.util.formatException(e) : 'Exception',\n    trace: { stack: e.stack }\n  });\n  this.results_.addResult(expectationResult);\n};\n\njasmine.Spec.prototype.getMatchersClass_ = function() {\n  return this.matchersClass || this.env.matchersClass;\n};\n\njasmine.Spec.prototype.addMatchers = function(matchersPrototype) {\n  var parent = this.getMatchersClass_();\n  var newMatchersClass = function() {\n    parent.apply(this, arguments);\n  };\n  jasmine.util.inherit(newMatchersClass, parent);\n  jasmine.Matchers.wrapInto_(matchersPrototype, newMatchersClass);\n  this.matchersClass = newMatchersClass;\n};\n\njasmine.Spec.prototype.finishCallback = function() {\n  this.env.reporter.reportSpecResults(this);\n};\n\njasmine.Spec.prototype.finish = function(onComplete) {\n  this.removeAllSpies();\n  this.finishCallback();\n  if (onComplete) {\n    onComplete();\n  }\n};\n\njasmine.Spec.prototype.after = function(doAfter) {\n  if (this.queue.isRunning()) {\n    this.queue.add(new jasmine.Block(this.env, doAfter, this), true);\n  } else {\n    this.afterCallbacks.unshift(doAfter);\n  }\n};\n\njasmine.Spec.prototype.execute = function(onComplete) {\n  var spec = this;\n  if (!spec.env.specFilter(spec)) {\n    spec.results_.skipped = true;\n    spec.finish(onComplete);\n    return;\n  }\n\n  this.env.reporter.reportSpecStarting(this);\n\n  spec.env.currentSpec = spec;\n\n  spec.addBeforesAndAftersToQueue();\n\n  spec.queue.start(function () {\n    spec.finish(onComplete);\n  });\n};\n\njasmine.Spec.prototype.addBeforesAndAftersToQueue = function() {\n  var runner = this.env.currentRunner();\n  var i;\n\n  for (var suite = this.suite; suite; suite = suite.parentSuite) {\n    for (i = 0; i < suite.before_.length; i++) {\n      this.queue.addBefore(new jasmine.Block(this.env, suite.before_[i], this));\n    }\n  }\n  for (i = 0; i < runner.before_.length; i++) {\n    this.queue.addBefore(new jasmine.Block(this.env, runner.before_[i], this));\n  }\n  for (i = 0; i < this.afterCallbacks.length; i++) {\n    this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this), true);\n  }\n  for (suite = this.suite; suite; suite = suite.parentSuite) {\n    for (i = 0; i < suite.after_.length; i++) {\n      this.queue.add(new jasmine.Block(this.env, suite.after_[i], this), true);\n    }\n  }\n  for (i = 0; i < runner.after_.length; i++) {\n    this.queue.add(new jasmine.Block(this.env, runner.after_[i], this), true);\n  }\n};\n\njasmine.Spec.prototype.explodes = function() {\n  throw 'explodes function should not have been called';\n};\n\njasmine.Spec.prototype.spyOn = function(obj, methodName, ignoreMethodDoesntExist) {\n  if (obj == jasmine.undefined) {\n    throw \"spyOn could not find an object to spy upon for \" + methodName + \"()\";\n  }\n\n  if (!ignoreMethodDoesntExist && obj[methodName] === jasmine.undefined) {\n    throw methodName + '() method does not exist';\n  }\n\n  if (!ignoreMethodDoesntExist && obj[methodName] && obj[methodName].isSpy) {\n    throw new Error(methodName + ' has already been spied upon');\n  }\n\n  var spyObj = jasmine.createSpy(methodName);\n\n  this.spies_.push(spyObj);\n  spyObj.baseObj = obj;\n  spyObj.methodName = methodName;\n  spyObj.originalValue = obj[methodName];\n\n  obj[methodName] = spyObj;\n\n  return spyObj;\n};\n\njasmine.Spec.prototype.removeAllSpies = function() {\n  for (var i = 0; i < this.spies_.length; i++) {\n    var spy = this.spies_[i];\n    spy.baseObj[spy.methodName] = spy.originalValue;\n  }\n  this.spies_ = [];\n};\n\n/**\n * Internal representation of a Jasmine suite.\n *\n * @constructor\n * @param {jasmine.Env} env\n * @param {String} description\n * @param {Function} specDefinitions\n * @param {jasmine.Suite} parentSuite\n */\njasmine.Suite = function(env, description, specDefinitions, parentSuite) {\n  var self = this;\n  self.id = env.nextSuiteId ? env.nextSuiteId() : null;\n  self.description = description;\n  self.queue = new jasmine.Queue(env);\n  self.parentSuite = parentSuite;\n  self.env = env;\n  self.before_ = [];\n  self.after_ = [];\n  self.children_ = [];\n  self.suites_ = [];\n  self.specs_ = [];\n};\n\njasmine.Suite.prototype.getFullName = function() {\n  var fullName = this.description;\n  for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) {\n    fullName = parentSuite.description + ' ' + fullName;\n  }\n  return fullName;\n};\n\njasmine.Suite.prototype.finish = function(onComplete) {\n  this.env.reporter.reportSuiteResults(this);\n  this.finished = true;\n  if (typeof(onComplete) == 'function') {\n    onComplete();\n  }\n};\n\njasmine.Suite.prototype.beforeEach = function(beforeEachFunction) {\n  beforeEachFunction.typeName = 'beforeEach';\n  this.before_.unshift(beforeEachFunction);\n};\n\njasmine.Suite.prototype.afterEach = function(afterEachFunction) {\n  afterEachFunction.typeName = 'afterEach';\n  this.after_.unshift(afterEachFunction);\n};\n\njasmine.Suite.prototype.results = function() {\n  return this.queue.results();\n};\n\njasmine.Suite.prototype.add = function(suiteOrSpec) {\n  this.children_.push(suiteOrSpec);\n  if (suiteOrSpec instanceof jasmine.Suite) {\n    this.suites_.push(suiteOrSpec);\n    this.env.currentRunner().addSuite(suiteOrSpec);\n  } else {\n    this.specs_.push(suiteOrSpec);\n  }\n  this.queue.add(suiteOrSpec);\n};\n\njasmine.Suite.prototype.specs = function() {\n  return this.specs_;\n};\n\njasmine.Suite.prototype.suites = function() {\n  return this.suites_;\n};\n\njasmine.Suite.prototype.children = function() {\n  return this.children_;\n};\n\njasmine.Suite.prototype.execute = function(onComplete) {\n  var self = this;\n  this.queue.start(function () {\n    self.finish(onComplete);\n  });\n};\njasmine.WaitsBlock = function(env, timeout, spec) {\n  this.timeout = timeout;\n  jasmine.Block.call(this, env, null, spec);\n};\n\njasmine.util.inherit(jasmine.WaitsBlock, jasmine.Block);\n\njasmine.WaitsBlock.prototype.execute = function (onComplete) {\n  if (jasmine.VERBOSE) {\n    this.env.reporter.log('>> Jasmine waiting for ' + this.timeout + ' ms...');\n  }\n  this.env.setTimeout(function () {\n    onComplete();\n  }, this.timeout);\n};\n/**\n * A block which waits for some condition to become true, with timeout.\n *\n * @constructor\n * @extends jasmine.Block\n * @param {jasmine.Env} env The Jasmine environment.\n * @param {Number} timeout The maximum time in milliseconds to wait for the condition to become true.\n * @param {Function} latchFunction A function which returns true when the desired condition has been met.\n * @param {String} message The message to display if the desired condition hasn't been met within the given time period.\n * @param {jasmine.Spec} spec The Jasmine spec.\n */\njasmine.WaitsForBlock = function(env, timeout, latchFunction, message, spec) {\n  this.timeout = timeout || env.defaultTimeoutInterval;\n  this.latchFunction = latchFunction;\n  this.message = message;\n  this.totalTimeSpentWaitingForLatch = 0;\n  jasmine.Block.call(this, env, null, spec);\n};\njasmine.util.inherit(jasmine.WaitsForBlock, jasmine.Block);\n\njasmine.WaitsForBlock.TIMEOUT_INCREMENT = 10;\n\njasmine.WaitsForBlock.prototype.execute = function(onComplete) {\n  if (jasmine.VERBOSE) {\n    this.env.reporter.log('>> Jasmine waiting for ' + (this.message || 'something to happen'));\n  }\n  var latchFunctionResult;\n  try {\n    latchFunctionResult = this.latchFunction.apply(this.spec);\n  } catch (e) {\n    this.spec.fail(e);\n    onComplete();\n    return;\n  }\n\n  if (latchFunctionResult) {\n    onComplete();\n  } else if (this.totalTimeSpentWaitingForLatch >= this.timeout) {\n    var message = 'timed out after ' + this.timeout + ' msec waiting for ' + (this.message || 'something to happen');\n    this.spec.fail({\n      name: 'timeout',\n      message: message\n    });\n\n    this.abort = true;\n    onComplete();\n  } else {\n    this.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT;\n    var self = this;\n    this.env.setTimeout(function() {\n      self.execute(onComplete);\n    }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT);\n  }\n};\n\njasmine.version_= {\n  \"major\": 1,\n  \"minor\": 3,\n  \"build\": 1,\n  \"revision\": 1354556913\n};\n"
  },
  {
    "path": "examples/testing/jasmine/spec/SelectSpec.js",
    "content": "describe(\"Map\", function() {\n\n    // Aliases\n    var TestScheduler = Rx.TestScheduler,\n        onNext = Rx.ReactiveTest.onNext,\n        onError = Rx.ReactiveTest.onError,\n        onCompleted = Rx.ReactiveTest.onCompleted,\n        subscribe = Rx.ReactiveTest.subscribe;\n\n    var scheduler,\n        xs,\n        results;\n\n    beforeEach(function() {\n        scheduler = new TestScheduler();\n    });\n\n    it(\"should be able to complete\", function() {\n        var invoked = 0;\n        xs = scheduler.createHotObservable(\n            onNext(180, 1),\n            onNext(210, 2),\n            onNext(240, 3),\n            onNext(290, 4),\n            onNext(350, 5),\n            onCompleted(400),\n            onNext(410, -1),\n            onCompleted(420),\n            onError(430, 'ex')\n        );\n\n        results = scheduler.startScheduler(function () {\n            return xs.map(function (x) {\n                invoked++;\n                return x + 1;\n            });\n        });\n\n        expect(results.messages).toHaveEqualElements(\n            onNext(210, 3),\n            onNext(240, 4),\n            onNext(290, 5),\n            onNext(350, 6),\n            onCompleted(400)\n        );\n\n        expect(xs.subscriptions).toHaveEqualElements(subscribe(200, 400));\n\n        expect(invoked).toEqual(4);\n    });\n});\n"
  },
  {
    "path": "examples/testing/jasmine/spec/SpecHelper.js",
    "content": "function areElementsEqual(expected, actual, comparer) {\n  comparer || (comparer = Rx.internals.isEqual);\n  if (expected.length !== actual.length) {\n    return false;\n  }\n  for (var i = 0; i < expected.length; i++) {\n    if (!comparer(expected[i], actual[i])) { return false; }\n  }\n  return true;\n}\n\nbeforeEach(function() {\n  this.addMatchers({\n    toHaveEqualElements: function() {\n      var obs = this.actual;\n      var len = arguments.length, expected = new Array(len);\n      for (var i = 0; i < len; i++) { expected[i] = arguments[i]; }\n      return areElementsEqual(expected, obs);\n    }\n  });\n});\n"
  },
  {
    "path": "examples/testing/nodejs/collectionassert.js",
    "content": "var assert = require('assert'),\n    Rx = require('../../../rx.node'); // Use require('rx') outside this project\n\nfunction createMessage(actual, expected) {\n    return 'Expected: [' + expected.toString() + ']\\r\\nActual: [' + actual.toString() + ']';\n}\n\nvar collectionAssert = {\n    /* Assertion for collections of notification messages */\n    assertEqual: function (expected, actual, comparer, message) {\n        comparer || (comparer = Rx.internals.isEqual);\n        var isOk = true, i, len;\n\n        if (expected.length !== actual.length) {\n            assert.ok(false, 'Not equal length. Expected: ' + expected.length + ' Actual: ' + actual.length);\n            return;\n        }\n\n        for(i = 0, len = expected.length; i < len; i++) {\n            isOk = comparer(expected[i], actual[i]);\n            if (!isOk) {\n                break;\n            }\n        }\n\n        assert.ok(isOk, message || createMessage(expected, actual));\n    }\n};\n\nmodule.exports = collectionAssert;\n"
  },
  {
    "path": "examples/testing/nodejs/tests.js",
    "content": "var collectionAssert = require('./collectionassert'),\n    Rx = require('../../../rx.node'); // Use require('rx') outside this project\n\nvar TestScheduler = Rx.TestScheduler,\n    Observable = Rx.Observable,\n\n    // Shortcuts for onNext/onError/onCompleted\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe;\n\ndescribe('Observable', function () {\n\n    /* Observable.return tests */\n    describe('.return', function () {\n\n        /* Tests returnValue basic behavior */\n        it('should return single value and complete', function () {\n\n            var scheduler = new TestScheduler();\n\n            // Returns 42 at one tick after subscribe (200)\n            var results = scheduler.startScheduler(function () {\n                return Observable.return(42, scheduler);\n            });\n\n            // Expect a single onNext with 42 and an oncompleted one tick from subscribe\n            var expectedMessages = [\n                onNext(201, 42),\n                onCompleted(201)\n            ];\n\n            collectionAssert.assertEqual(expectedMessages, results.messages);\n        });\n    });\n\n    /* Observable#map tests */\n    describe('#map', function () {\n        it('should project single item and complete', function () {\n            var scheduler = new TestScheduler();\n\n            // Creates a hot observable with two messages after subscribe\n            var xs = scheduler.createHotObservable(\n                onNext(150, 1),\n                onNext(210, 2),\n                onCompleted(220)\n            );\n\n            // Project the hot observable via select without index\n            var results = scheduler.startScheduler(function () {\n                return xs.map(function (x) { return x + x; });\n            });\n\n            // Should get one onNext with 4 and a completed\n            var expectedMessages = [\n                onNext(210, 4),\n                onCompleted(220)\n            ];\n\n            collectionAssert.assertEqual(expectedMessages, results.messages);\n\n            // Should subscribe at 200 and unsubscribe at 220 at last message\n            var expectedSubscriptions = [\n                subscribe(200, 220)\n            ];\n\n            collectionAssert.assertEqual(expectedSubscriptions, xs.subscriptions);\n        });\n\n        it('should project multiple items and then complete', function () {\n            var scheduler = new TestScheduler();\n\n            // Project forward two onNext messages after subscribe and one completed at 220\n            var xs = scheduler.createHotObservable(\n                onNext(150, 1),\n                onNext(210, 2),\n                onNext(215, 3),\n                onCompleted(220)\n            );\n\n            // Project the hot observable via select without index\n            var results = scheduler.startScheduler(function () {\n                return xs.map(function (x) { return x + x; });\n            });\n\n            // Should get one at 210 for 4 and one at 215 for 6 until completed at 220\n            var expectedMessages = [\n                onNext(210, 4),\n                onNext(215, 6),\n                onCompleted(220)\n            ];\n\n            collectionAssert.assertEqual(expectedMessages, results.messages);\n\n            // Should subscribe at 200 and unsubscribe at 220 at last message\n            var expectedSubscriptions = [\n                subscribe(200, 220)\n            ];\n\n            collectionAssert.assertEqual(expectedSubscriptions, xs.subscriptions);\n        });\n\n        it('should project complete if empty', function () {\n            var scheduler = new TestScheduler();\n\n            // Project forward one onNext after subscribe and one completed at 220\n            var xs = scheduler.createHotObservable(\n                onNext(150, 1),\n                onCompleted(220)\n            );\n\n            // Project the hot observable via select without index\n            var results = scheduler.startScheduler(function () {\n                return xs.map(function (x) { return x + x; });\n            });\n\n            var expectedMessages = [\n                onCompleted(220)\n            ];\n\n            collectionAssert.assertEqual(expectedMessages, results.messages);\n\n            // Should subscribe at 200 and unsubscribe at 220 at last message\n            var expectedSubscriptions = [\n                subscribe(200, 220)\n            ];\n\n            collectionAssert.assertEqual(expectedSubscriptions, xs.subscriptions);\n        });\n\n        it('should never project if no messages', function () {\n            var scheduler = new TestScheduler();\n\n            // Project no messages after subscribe at 200\n            var xs = scheduler.createHotObservable(\n                onNext(150, 1)\n            );\n\n            // Project the hot observable via select without index\n            var results = scheduler.startScheduler(function () {\n                return xs.map(function (x) { return x + x; });\n            });\n\n            // Should expect no messages\n            var expectedMessages = [\n            ];\n\n            collectionAssert.assertEqual(expectedMessages, results.messages);\n\n            // Should subscribe at 200 and unsubscribe at 1000 (infinity)\n            var expectedSubscriptions = [\n                subscribe(200, 1000)\n            ];\n\n            collectionAssert.assertEqual(expectedSubscriptions, xs.subscriptions);\n        });\n\n        it('should project an error if sequence has an error', function () {\n            var error = new Error('woops');\n            var scheduler = new TestScheduler();\n\n            // Project forward one onError after subscribe\n            var xs = scheduler.createHotObservable(\n                onNext(150, 1),\n                onError(210, error)\n            );\n\n            var results = scheduler.startScheduler(function () {\n                return xs.map(function (x) { return x + x; });\n            });\n\n            // Should expect only one message with an error at 210\n            var expectedMessages = [\n                onError(210, error)\n            ];\n\n            collectionAssert.assertEqual(expectedMessages, results.messages);\n\n            // Should subscribe at 200 and unsubscribe at 210 at point of error\n            var expectedSubscriptions = [\n                subscribe(200, 210)\n            ];\n\n            collectionAssert.assertEqual(expectedSubscriptions, xs.subscriptions);\n        });\n\n        it('should project an error if the selector throws', function () {\n            var error = new Error('woops');\n            var scheduler = new TestScheduler();\n\n            // Project forward one onNext after subscribe and one completed at 220\n            var xs = scheduler.createHotObservable(\n                onNext(150, 1),\n                onNext(210, 2)\n            );\n\n            var results = scheduler.startScheduler(function () {\n                return xs.map(function (x) { throw error; });\n            });\n\n            // Should expect only one message with an error at 210\n            var expectedMessages = [\n                onError(210, error)\n            ];\n\n            collectionAssert.assertEqual(expectedMessages, results.messages);\n\n            // Should subscribe at 200 and unsubscribe at 210 at point of error\n            var expectedSubscriptions = [\n                subscribe(200, 210)\n            ];\n\n            collectionAssert.assertEqual(expectedSubscriptions, xs.subscriptions);\n        });\n\n        it('should project a single value with index and then complete', function () {\n            var scheduler = new TestScheduler();\n\n            // Project forward one onNext after subscribe and one completed at 220\n            var xs = scheduler.createHotObservable(\n                onNext(150, 1),\n                onNext(210, 2),\n                onCompleted(220)\n            );\n\n            var results = scheduler.startScheduler(function () {\n                return xs.map(function (x, i) { return (x + x) * i; });\n            });\n\n            // Should expect one message with 0 and then complettion\n            var expectedMessages = [\n                onNext(210, 0),\n                onCompleted(220)\n            ];\n\n            collectionAssert.assertEqual(expectedMessages, results.messages);\n\n            // Should subscribe at 200 and unsubscribe at 220 at last message\n            var expectedSubscriptions = [\n                subscribe(200, 220)\n            ];\n\n            collectionAssert.assertEqual(expectedSubscriptions, xs.subscriptions);\n        });\n    });\n});\n"
  },
  {
    "path": "examples/testing/qunit/customassertions.js",
    "content": "(function (global) {\n\n    var root = global.Rx;\n\n    /* Creates a message based upon actual/expected */\n    function createMessage(actual, expected) {\n        return 'Expected: [' + expected.toString() + ']\\r\\nActual: [' + actual.toString() + ']';\n    }\n\n    root.CollectionAssert = {\n        /* Assertion for collections of notification messages */\n        assertEqual: function (expected, actual, comparer, message) {\n            comparer || (comparer = Rx.internals.isEqual);\n            var isOk = true, i, len;\n\n            if (expected.length !== actual.length) {\n                ok(false, 'Not equal length. Expected: ' + expected.length + ' Actual: ' + actual.length);\n                return;\n            }\n\n            for(i = 0, len = expected.length; i < len; i++) {\n                isOk = comparer(expected[i], actual[i]);\n                if (!isOk) {\n                    break;\n                }\n            }\n\n            ok(isOk, message || createMessage(expected, actual));\n        }\n    };\n\n}(window));\n"
  },
  {
    "path": "examples/testing/qunit/qunit.css",
    "content": "/**\n * QUnit v1.10.0 - A JavaScript Unit Testing Framework\n *\n * http://qunitjs.com\n *\n * Copyright 2012 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n/** Font Family and Sizes */\n\n#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {\n\tfont-family: \"Helvetica Neue Light\", \"HelveticaNeue-Light\", \"Helvetica Neue\", Calibri, Helvetica, Arial, sans-serif;\n}\n\n#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }\n#qunit-tests { font-size: smaller; }\n\n/** Resets */\n\n#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n/** Header */\n\n#qunit-header {\n\tpadding: 0.5em 0 0.5em 1em;\n\n\tcolor: #8699a4;\n\tbackground-color: #0d3349;\n\n\tfont-size: 1.5em;\n\tline-height: 1em;\n\tfont-weight: normal;\n\n\tborder-radius: 5px 5px 0 0;\n\t-moz-border-radius: 5px 5px 0 0;\n\t-webkit-border-top-right-radius: 5px;\n\t-webkit-border-top-left-radius: 5px;\n}\n\n#qunit-header a {\n\ttext-decoration: none;\n\tcolor: #c2ccd1;\n}\n\n#qunit-header a:hover,\n#qunit-header a:focus {\n\tcolor: #fff;\n}\n\n#qunit-testrunner-toolbar label {\n\tdisplay: inline-block;\n\tpadding: 0 .5em 0 .1em;\n}\n\n#qunit-banner {\n\theight: 5px;\n}\n\n#qunit-testrunner-toolbar {\n\tpadding: 0.5em 0 0.5em 2em;\n\tcolor: #5E740B;\n\tbackground-color: #eee;\n\toverflow: hidden;\n}\n\n#qunit-userAgent {\n\tpadding: 0.5em 0 0.5em 2.5em;\n\tbackground-color: #2b81af;\n\tcolor: #fff;\n\ttext-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;\n}\n\n#qunit-modulefilter-container {\n\tfloat: right;\n}\n\n/** Tests: Pass/Fail */\n\n#qunit-tests {\n\tlist-style-position: inside;\n}\n\n#qunit-tests li {\n\tpadding: 0.4em 0.5em 0.4em 2.5em;\n\tborder-bottom: 1px solid #fff;\n\tlist-style-position: inside;\n}\n\n#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running  {\n\tdisplay: none;\n}\n\n#qunit-tests li strong {\n\tcursor: pointer;\n}\n\n#qunit-tests li a {\n\tpadding: 0.5em;\n\tcolor: #c2ccd1;\n\ttext-decoration: none;\n}\n#qunit-tests li a:hover,\n#qunit-tests li a:focus {\n\tcolor: #000;\n}\n\n#qunit-tests ol {\n\tmargin-top: 0.5em;\n\tpadding: 0.5em;\n\n\tbackground-color: #fff;\n\n\tborder-radius: 5px;\n\t-moz-border-radius: 5px;\n\t-webkit-border-radius: 5px;\n}\n\n#qunit-tests table {\n\tborder-collapse: collapse;\n\tmargin-top: .2em;\n}\n\n#qunit-tests th {\n\ttext-align: right;\n\tvertical-align: top;\n\tpadding: 0 .5em 0 0;\n}\n\n#qunit-tests td {\n\tvertical-align: top;\n}\n\n#qunit-tests pre {\n\tmargin: 0;\n\twhite-space: pre-wrap;\n\tword-wrap: break-word;\n}\n\n#qunit-tests del {\n\tbackground-color: #e0f2be;\n\tcolor: #374e0c;\n\ttext-decoration: none;\n}\n\n#qunit-tests ins {\n\tbackground-color: #ffcaca;\n\tcolor: #500;\n\ttext-decoration: none;\n}\n\n/*** Test Counts */\n\n#qunit-tests b.counts                       { color: black; }\n#qunit-tests b.passed                       { color: #5E740B; }\n#qunit-tests b.failed                       { color: #710909; }\n\n#qunit-tests li li {\n\tpadding: 5px;\n\tbackground-color: #fff;\n\tborder-bottom: none;\n\tlist-style-position: inside;\n}\n\n/*** Passing Styles */\n\n#qunit-tests li li.pass {\n\tcolor: #3c510c;\n\tbackground-color: #fff;\n\tborder-left: 10px solid #C6E746;\n}\n\n#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }\n#qunit-tests .pass .test-name               { color: #366097; }\n\n#qunit-tests .pass .test-actual,\n#qunit-tests .pass .test-expected           { color: #999999; }\n\n#qunit-banner.qunit-pass                    { background-color: #C6E746; }\n\n/*** Failing Styles */\n\n#qunit-tests li li.fail {\n\tcolor: #710909;\n\tbackground-color: #fff;\n\tborder-left: 10px solid #EE5757;\n\twhite-space: pre;\n}\n\n#qunit-tests > li:last-child {\n\tborder-radius: 0 0 5px 5px;\n\t-moz-border-radius: 0 0 5px 5px;\n\t-webkit-border-bottom-right-radius: 5px;\n\t-webkit-border-bottom-left-radius: 5px;\n}\n\n#qunit-tests .fail                          { color: #000000; background-color: #EE5757; }\n#qunit-tests .fail .test-name,\n#qunit-tests .fail .module-name             { color: #000000; }\n\n#qunit-tests .fail .test-actual             { color: #EE5757; }\n#qunit-tests .fail .test-expected           { color: green;   }\n\n#qunit-banner.qunit-fail                    { background-color: #EE5757; }\n\n/** Result */\n\n#qunit-testresult {\n\tpadding: 0.5em 0.5em 0.5em 2.5em;\n\n\tcolor: #2b81af;\n\tbackground-color: #D2E0E6;\n\n\tborder-bottom: 1px solid white;\n}\n#qunit-testresult .module-name {\n\tfont-weight: bold;\n}\n\n/** Fixture */\n\n#qunit-fixture {\n\tposition: absolute;\n\ttop: -10000px;\n\tleft: -10000px;\n\twidth: 1000px;\n\theight: 1000px;\n}\n"
  },
  {
    "path": "examples/testing/qunit/qunit.js",
    "content": "/**\n * QUnit v1.10.0 - A JavaScript Unit Testing Framework\n *\n * http://qunitjs.com\n *\n * Copyright 2012 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n(function( window ) {\n\nvar QUnit,\n\tconfig,\n\tonErrorFnPrev,\n\ttestId = 0,\n\tfileName = (sourceFromStacktrace( 0 ) || \"\" ).replace(/(:\\d+)+\\)?/, \"\").replace(/.+\\//, \"\"),\n\ttoString = Object.prototype.toString,\n\thasOwn = Object.prototype.hasOwnProperty,\n\t// Keep a local reference to Date (GH-283)\n\tDate = window.Date,\n\tdefined = {\n\tsetTimeout: typeof window.setTimeout !== \"undefined\",\n\tsessionStorage: (function() {\n\t\tvar x = \"qunit-test-string\";\n\t\ttry {\n\t\t\tsessionStorage.setItem( x, x );\n\t\t\tsessionStorage.removeItem( x );\n\t\t\treturn true;\n\t\t} catch( e ) {\n\t\t\treturn false;\n\t\t}\n\t}())\n};\n\nfunction Test( settings ) {\n\textend( this, settings );\n\tthis.assertions = [];\n\tthis.testNumber = ++Test.count;\n}\n\nTest.count = 0;\n\nTest.prototype = {\n\tinit: function() {\n\t\tvar a, b, li,\n        tests = id( \"qunit-tests\" );\n\n\t\tif ( tests ) {\n\t\t\tb = document.createElement( \"strong\" );\n\t\t\tb.innerHTML = this.name;\n\n\t\t\t// `a` initialized at top of scope\n\t\t\ta = document.createElement( \"a\" );\n\t\t\ta.innerHTML = \"Rerun\";\n\t\t\ta.href = QUnit.url({ testNumber: this.testNumber });\n\n\t\t\tli = document.createElement( \"li\" );\n\t\t\tli.appendChild( b );\n\t\t\tli.appendChild( a );\n\t\t\tli.className = \"running\";\n\t\t\tli.id = this.id = \"qunit-test-output\" + testId++;\n\n\t\t\ttests.appendChild( li );\n\t\t}\n\t},\n\tsetup: function() {\n\t\tif ( this.module !== config.previousModule ) {\n\t\t\tif ( config.previousModule ) {\n\t\t\t\trunLoggingCallbacks( \"moduleDone\", QUnit, {\n\t\t\t\t\tname: config.previousModule,\n\t\t\t\t\tfailed: config.moduleStats.bad,\n\t\t\t\t\tpassed: config.moduleStats.all - config.moduleStats.bad,\n\t\t\t\t\ttotal: config.moduleStats.all\n\t\t\t\t});\n\t\t\t}\n\t\t\tconfig.previousModule = this.module;\n\t\t\tconfig.moduleStats = { all: 0, bad: 0 };\n\t\t\trunLoggingCallbacks( \"moduleStart\", QUnit, {\n\t\t\t\tname: this.module\n\t\t\t});\n\t\t} else if ( config.autorun ) {\n\t\t\trunLoggingCallbacks( \"moduleStart\", QUnit, {\n\t\t\t\tname: this.module\n\t\t\t});\n\t\t}\n\n\t\tconfig.current = this;\n\n\t\tthis.testEnvironment = extend({\n\t\t\tsetup: function() {},\n\t\t\tteardown: function() {}\n\t\t}, this.moduleTestEnvironment );\n\n\t\trunLoggingCallbacks( \"testStart\", QUnit, {\n\t\t\tname: this.testName,\n\t\t\tmodule: this.module\n\t\t});\n\n\t\t// allow utility functions to access the current test environment\n\t\t// TODO why??\n\t\tQUnit.current_testEnvironment = this.testEnvironment;\n\n\t\tif ( !config.pollution ) {\n\t\t\tsaveGlobal();\n\t\t}\n\t\tif ( config.notrycatch ) {\n\t\t\tthis.testEnvironment.setup.call( this.testEnvironment );\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tthis.testEnvironment.setup.call( this.testEnvironment );\n\t\t} catch( e ) {\n\t\t\tQUnit.pushFailure( \"Setup failed on \" + this.testName + \": \" + e.message, extractStacktrace( e, 1 ) );\n\t\t}\n\t},\n\trun: function() {\n\t\tconfig.current = this;\n\n\t\tvar running = id( \"qunit-testresult\" );\n\n\t\tif ( running ) {\n\t\t\trunning.innerHTML = \"Running: <br/>\" + this.name;\n\t\t}\n\n\t\tif ( this.async ) {\n\t\t\tQUnit.stop();\n\t\t}\n\n\t\tif ( config.notrycatch ) {\n\t\t\tthis.callback.call( this.testEnvironment, QUnit.assert );\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tthis.callback.call( this.testEnvironment, QUnit.assert );\n\t\t} catch( e ) {\n\t\t\tQUnit.pushFailure( \"Died on test #\" + (this.assertions.length + 1) + \" \" + this.stack + \": \" + e.message, extractStacktrace( e, 0 ) );\n\t\t\t// else next test will carry the responsibility\n\t\t\tsaveGlobal();\n\n\t\t\t// Restart the tests if they're blocking\n\t\t\tif ( config.blocking ) {\n\t\t\t\tQUnit.start();\n\t\t\t}\n\t\t}\n\t},\n\tteardown: function() {\n\t\tconfig.current = this;\n\t\tif ( config.notrycatch ) {\n\t\t\tthis.testEnvironment.teardown.call( this.testEnvironment );\n\t\t\treturn;\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tthis.testEnvironment.teardown.call( this.testEnvironment );\n\t\t\t} catch( e ) {\n\t\t\t\tQUnit.pushFailure( \"Teardown failed on \" + this.testName + \": \" + e.message, extractStacktrace( e, 1 ) );\n\t\t\t}\n\t\t}\n\t\tcheckPollution();\n\t},\n\tfinish: function() {\n\t\tconfig.current = this;\n\t\tif ( config.requireExpects && this.expected == null ) {\n\t\t\tQUnit.pushFailure( \"Expected number of assertions to be defined, but expect() was not called.\", this.stack );\n\t\t} else if ( this.expected != null && this.expected != this.assertions.length ) {\n\t\t\tQUnit.pushFailure( \"Expected \" + this.expected + \" assertions, but \" + this.assertions.length + \" were run\", this.stack );\n\t\t} else if ( this.expected == null && !this.assertions.length ) {\n\t\t\tQUnit.pushFailure( \"Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.\", this.stack );\n\t\t}\n\n\t\tvar assertion, a, b, i, li, ol,\n\t\t\ttest = this,\n\t\t\tgood = 0,\n\t\t\tbad = 0,\n\t\t\ttests = id( \"qunit-tests\" );\n\n\t\tconfig.stats.all += this.assertions.length;\n\t\tconfig.moduleStats.all += this.assertions.length;\n\n\t\tif ( tests ) {\n\t\t\tol = document.createElement( \"ol\" );\n\n\t\t\tfor ( i = 0; i < this.assertions.length; i++ ) {\n\t\t\t\tassertion = this.assertions[i];\n\n\t\t\t\tli = document.createElement( \"li\" );\n\t\t\t\tli.className = assertion.result ? \"pass\" : \"fail\";\n\t\t\t\tli.innerHTML = assertion.message || ( assertion.result ? \"okay\" : \"failed\" );\n\t\t\t\tol.appendChild( li );\n\n\t\t\t\tif ( assertion.result ) {\n\t\t\t\t\tgood++;\n\t\t\t\t} else {\n\t\t\t\t\tbad++;\n\t\t\t\t\tconfig.stats.bad++;\n\t\t\t\t\tconfig.moduleStats.bad++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// store result when possible\n\t\t\tif ( QUnit.config.reorder && defined.sessionStorage ) {\n\t\t\t\tif ( bad ) {\n\t\t\t\t\tsessionStorage.setItem( \"qunit-test-\" + this.module + \"-\" + this.testName, bad );\n\t\t\t\t} else {\n\t\t\t\t\tsessionStorage.removeItem( \"qunit-test-\" + this.module + \"-\" + this.testName );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( bad === 0 ) {\n\t\t\t\tol.style.display = \"none\";\n\t\t\t}\n\n\t\t\t// `b` initialized at top of scope\n\t\t\tb = document.createElement( \"strong\" );\n\t\t\tb.innerHTML = this.name + \" <b class='counts'>(<b class='failed'>\" + bad + \"</b>, <b class='passed'>\" + good + \"</b>, \" + this.assertions.length + \")</b>\";\n\n\t\t\taddEvent(b, \"click\", function() {\n\t\t\t\tvar next = b.nextSibling.nextSibling,\n\t\t\t\t\tdisplay = next.style.display;\n\t\t\t\tnext.style.display = display === \"none\" ? \"block\" : \"none\";\n\t\t\t});\n\n\t\t\taddEvent(b, \"dblclick\", function( e ) {\n\t\t\t\tvar target = e && e.target ? e.target : window.event.srcElement;\n\t\t\t\tif ( target.nodeName.toLowerCase() == \"span\" || target.nodeName.toLowerCase() == \"b\" ) {\n\t\t\t\t\ttarget = target.parentNode;\n\t\t\t\t}\n\t\t\t\tif ( window.location && target.nodeName.toLowerCase() === \"strong\" ) {\n\t\t\t\t\twindow.location = QUnit.url({ testNumber: test.testNumber });\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// `li` initialized at top of scope\n\t\t\tli = id( this.id );\n\t\t\tli.className = bad ? \"fail\" : \"pass\";\n\t\t\tli.removeChild( li.firstChild );\n\t\t\ta = li.firstChild;\n\t\t\tli.appendChild( b );\n\t\t\tli.appendChild ( a );\n\t\t\tli.appendChild( ol );\n\n\t\t} else {\n\t\t\tfor ( i = 0; i < this.assertions.length; i++ ) {\n\t\t\t\tif ( !this.assertions[i].result ) {\n\t\t\t\t\tbad++;\n\t\t\t\t\tconfig.stats.bad++;\n\t\t\t\t\tconfig.moduleStats.bad++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\trunLoggingCallbacks( \"testDone\", QUnit, {\n\t\t\tname: this.testName,\n\t\t\tmodule: this.module,\n\t\t\tfailed: bad,\n\t\t\tpassed: this.assertions.length - bad,\n\t\t\ttotal: this.assertions.length\n\t\t});\n\n\t\tQUnit.reset();\n\n\t\tconfig.current = undefined;\n\t},\n\n\tqueue: function() {\n\t\tvar bad,\n\t\t\ttest = this;\n\n\t\tsynchronize(function() {\n\t\t\ttest.init();\n\t\t});\n\t\tfunction run() {\n\t\t\t// each of these can by async\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.setup();\n\t\t\t});\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.run();\n\t\t\t});\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.teardown();\n\t\t\t});\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.finish();\n\t\t\t});\n\t\t}\n\n\t\t// `bad` initialized at top of scope\n\t\t// defer when previous test run passed, if storage is available\n\t\tbad = QUnit.config.reorder && defined.sessionStorage &&\n\t\t\t\t\t\t+sessionStorage.getItem( \"qunit-test-\" + this.module + \"-\" + this.testName );\n\n\t\tif ( bad ) {\n\t\t\trun();\n\t\t} else {\n\t\t\tsynchronize( run, true );\n\t\t}\n\t}\n};\n\n// Root QUnit object.\n// `QUnit` initialized at top of scope\nQUnit = {\n\n\t// call on start of module test to prepend name to all tests\n\tmodule: function( name, testEnvironment ) {\n\t\tconfig.currentModule = name;\n\t\tconfig.currentModuleTestEnvironment = testEnvironment;\n\t\tconfig.modules[name] = true;\n\t},\n\n\tasyncTest: function( testName, expected, callback ) {\n\t\tif ( arguments.length === 2 ) {\n\t\t\tcallback = expected;\n\t\t\texpected = null;\n\t\t}\n\n\t\tQUnit.test( testName, expected, callback, true );\n\t},\n\n\ttest: function( testName, expected, callback, async ) {\n\t\tvar test,\n\t\t\tname = \"<span class='test-name'>\" + escapeInnerText( testName ) + \"</span>\";\n\n\t\tif ( arguments.length === 2 ) {\n\t\t\tcallback = expected;\n\t\t\texpected = null;\n\t\t}\n\n\t\tif ( config.currentModule ) {\n\t\t\tname = \"<span class='module-name'>\" + config.currentModule + \"</span>: \" + name;\n\t\t}\n\n\t\ttest = new Test({\n\t\t\tname: name,\n\t\t\ttestName: testName,\n\t\t\texpected: expected,\n\t\t\tasync: async,\n\t\t\tcallback: callback,\n\t\t\tmodule: config.currentModule,\n\t\t\tmoduleTestEnvironment: config.currentModuleTestEnvironment,\n\t\t\tstack: sourceFromStacktrace( 2 )\n\t\t});\n\n\t\tif ( !validTest( test ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttest.queue();\n\t},\n\n\t// Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.\n\texpect: function( asserts ) {\n\t\tif (arguments.length === 1) {\n\t\t\tconfig.current.expected = asserts;\n\t\t} else {\n\t\t\treturn config.current.expected;\n\t\t}\n\t},\n\n\tstart: function( count ) {\n\t\tconfig.semaphore -= count || 1;\n\t\t// don't start until equal number of stop-calls\n\t\tif ( config.semaphore > 0 ) {\n\t\t\treturn;\n\t\t}\n\t\t// ignore if start is called more often then stop\n\t\tif ( config.semaphore < 0 ) {\n\t\t\tconfig.semaphore = 0;\n\t\t}\n\t\t// A slight delay, to avoid any current callbacks\n\t\tif ( defined.setTimeout ) {\n\t\t\twindow.setTimeout(function() {\n\t\t\t\tif ( config.semaphore > 0 ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( config.timeout ) {\n\t\t\t\t\tclearTimeout( config.timeout );\n\t\t\t\t}\n\n\t\t\t\tconfig.blocking = false;\n\t\t\t\tprocess( true );\n\t\t\t}, 13);\n\t\t} else {\n\t\t\tconfig.blocking = false;\n\t\t\tprocess( true );\n\t\t}\n\t},\n\n\tstop: function( count ) {\n\t\tconfig.semaphore += count || 1;\n\t\tconfig.blocking = true;\n\n\t\tif ( config.testTimeout && defined.setTimeout ) {\n\t\t\tclearTimeout( config.timeout );\n\t\t\tconfig.timeout = window.setTimeout(function() {\n\t\t\t\tQUnit.ok( false, \"Test timed out\" );\n\t\t\t\tconfig.semaphore = 1;\n\t\t\t\tQUnit.start();\n\t\t\t}, config.testTimeout );\n\t\t}\n\t}\n};\n\n// Asssert helpers\n// All of these must call either QUnit.push() or manually do:\n// - runLoggingCallbacks( \"log\", .. );\n// - config.current.assertions.push({ .. });\nQUnit.assert = {\n\t/**\n\t * Asserts rough true-ish result.\n\t * @name ok\n\t * @function\n\t * @example ok( \"asdfasdf\".length > 5, \"There must be at least 5 chars\" );\n\t */\n\tok: function( result, msg ) {\n\t\tif ( !config.current ) {\n\t\t\tthrow new Error( \"ok() assertion outside test context, was \" + sourceFromStacktrace(2) );\n\t\t}\n\t\tresult = !!result;\n\n\t\tvar source,\n\t\t\tdetails = {\n\t\t\t\tmodule: config.current.module,\n\t\t\t\tname: config.current.testName,\n\t\t\t\tresult: result,\n\t\t\t\tmessage: msg\n\t\t\t};\n\n\t\tmsg = escapeInnerText( msg || (result ? \"okay\" : \"failed\" ) );\n\t\tmsg = \"<span class='test-message'>\" + msg + \"</span>\";\n\n\t\tif ( !result ) {\n\t\t\tsource = sourceFromStacktrace( 2 );\n\t\t\tif ( source ) {\n\t\t\t\tdetails.source = source;\n\t\t\t\tmsg += \"<table><tr class='test-source'><th>Source: </th><td><pre>\" + escapeInnerText( source ) + \"</pre></td></tr></table>\";\n\t\t\t}\n\t\t}\n\t\trunLoggingCallbacks( \"log\", QUnit, details );\n\t\tconfig.current.assertions.push({\n\t\t\tresult: result,\n\t\t\tmessage: msg\n\t\t});\n\t},\n\n\t/**\n\t * Assert that the first two arguments are equal, with an optional message.\n\t * Prints out both actual and expected values.\n\t * @name equal\n\t * @function\n\t * @example equal( format( \"Received {0} bytes.\", 2), \"Received 2 bytes.\", \"format() replaces {0} with next argument\" );\n\t */\n\tequal: function( actual, expected, message ) {\n\t\tQUnit.push( expected == actual, actual, expected, message );\n\t},\n\n\t/**\n\t * @name notEqual\n\t * @function\n\t */\n\tnotEqual: function( actual, expected, message ) {\n\t\tQUnit.push( expected != actual, actual, expected, message );\n\t},\n\n\t/**\n\t * @name deepEqual\n\t * @function\n\t */\n\tdeepEqual: function( actual, expected, message ) {\n\t\tQUnit.push( QUnit.equiv(actual, expected), actual, expected, message );\n\t},\n\n\t/**\n\t * @name notDeepEqual\n\t * @function\n\t */\n\tnotDeepEqual: function( actual, expected, message ) {\n\t\tQUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );\n\t},\n\n\t/**\n\t * @name strictEqual\n\t * @function\n\t */\n\tstrictEqual: function( actual, expected, message ) {\n\t\tQUnit.push( expected === actual, actual, expected, message );\n\t},\n\n\t/**\n\t * @name notStrictEqual\n\t * @function\n\t */\n\tnotStrictEqual: function( actual, expected, message ) {\n\t\tQUnit.push( expected !== actual, actual, expected, message );\n\t},\n\n\tthrows: function( block, expected, message ) {\n\t\tvar actual,\n\t\t\tok = false;\n\n\t\t// 'expected' is optional\n\t\tif ( typeof expected === \"string\" ) {\n\t\t\tmessage = expected;\n\t\t\texpected = null;\n\t\t}\n\n\t\tconfig.current.ignoreGlobalErrors = true;\n\t\ttry {\n\t\t\tblock.call( config.current.testEnvironment );\n\t\t} catch (e) {\n\t\t\tactual = e;\n\t\t}\n\t\tconfig.current.ignoreGlobalErrors = false;\n\n\t\tif ( actual ) {\n\t\t\t// we don't want to validate thrown error\n\t\t\tif ( !expected ) {\n\t\t\t\tok = true;\n\t\t\t// expected is a regexp\n\t\t\t} else if ( QUnit.objectType( expected ) === \"regexp\" ) {\n\t\t\t\tok = expected.test( actual );\n\t\t\t// expected is a constructor\n\t\t\t} else if ( actual instanceof expected ) {\n\t\t\t\tok = true;\n\t\t\t// expected is a validation function which returns true is validation passed\n\t\t\t} else if ( expected.call( {}, actual ) === true ) {\n\t\t\t\tok = true;\n\t\t\t}\n\n\t\t\tQUnit.push( ok, actual, null, message );\n\t\t} else {\n\t\t\tQUnit.pushFailure( message, null, 'No exception was thrown.' );\n\t\t}\n\t}\n};\n\n/**\n * @deprecate since 1.8.0\n * Kept assertion helpers in root for backwards compatibility\n */\nextend( QUnit, QUnit.assert );\n\n/**\n * @deprecated since 1.9.0\n * Kept global \"raises()\" for backwards compatibility\n */\nQUnit.raises = QUnit.assert.throws;\n\n/**\n * @deprecated since 1.0.0, replaced with error pushes since 1.3.0\n * Kept to avoid TypeErrors for undefined methods.\n */\nQUnit.equals = function() {\n\tQUnit.push( false, false, false, \"QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead\" );\n};\nQUnit.same = function() {\n\tQUnit.push( false, false, false, \"QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead\" );\n};\n\n// We want access to the constructor's prototype\n(function() {\n\tfunction F() {}\n\tF.prototype = QUnit;\n\tQUnit = new F();\n\t// Make F QUnit's constructor so that we can add to the prototype later\n\tQUnit.constructor = F;\n}());\n\n/**\n * Config object: Maintain internal state\n * Later exposed as QUnit.config\n * `config` initialized at top of scope\n */\nconfig = {\n\t// The queue of tests to run\n\tqueue: [],\n\n\t// block until document ready\n\tblocking: true,\n\n\t// when enabled, show only failing tests\n\t// gets persisted through sessionStorage and can be changed in UI via checkbox\n\thidepassed: false,\n\n\t// by default, run previously failed tests first\n\t// very useful in combination with \"Hide passed tests\" checked\n\treorder: true,\n\n\t// by default, modify document.title when suite is done\n\taltertitle: true,\n\n\t// when enabled, all tests must call expect()\n\trequireExpects: false,\n\n\t// add checkboxes that are persisted in the query-string\n\t// when enabled, the id is set to `true` as a `QUnit.config` property\n\turlConfig: [\n\t\t{\n\t\t\tid: \"noglobals\",\n\t\t\tlabel: \"Check for Globals\",\n\t\t\ttooltip: \"Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings.\"\n\t\t},\n\t\t{\n\t\t\tid: \"notrycatch\",\n\t\t\tlabel: \"No try-catch\",\n\t\t\ttooltip: \"Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings.\"\n\t\t}\n\t],\n\n\t// Set of all modules.\n\tmodules: {},\n\n\t// logging callback queues\n\tbegin: [],\n\tdone: [],\n\tlog: [],\n\ttestStart: [],\n\ttestDone: [],\n\tmoduleStart: [],\n\tmoduleDone: []\n};\n\n// Initialize more QUnit.config and QUnit.urlParams\n(function() {\n\tvar i,\n\t\tlocation = window.location || { search: \"\", protocol: \"file:\" },\n\t\tparams = location.search.slice( 1 ).split( \"&\" ),\n\t\tlength = params.length,\n\t\turlParams = {},\n\t\tcurrent;\n\n\tif ( params[ 0 ] ) {\n\t\tfor ( i = 0; i < length; i++ ) {\n\t\t\tcurrent = params[ i ].split( \"=\" );\n\t\t\tcurrent[ 0 ] = decodeURIComponent( current[ 0 ] );\n\t\t\t// allow just a key to turn on a flag, e.g., test.html?noglobals\n\t\t\tcurrent[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;\n\t\t\turlParams[ current[ 0 ] ] = current[ 1 ];\n\t\t}\n\t}\n\n\tQUnit.urlParams = urlParams;\n\n\t// String search anywhere in moduleName+testName\n\tconfig.filter = urlParams.filter;\n\n\t// Exact match of the module name\n\tconfig.module = urlParams.module;\n\n\tconfig.testNumber = parseInt( urlParams.testNumber, 10 ) || null;\n\n\t// Figure out if we're running the tests from a server or not\n\tQUnit.isLocal = location.protocol === \"file:\";\n}());\n\n// Export global variables, unless an 'exports' object exists,\n// in that case we assume we're in CommonJS (dealt with on the bottom of the script)\nif ( typeof exports === \"undefined\" ) {\n\textend( window, QUnit );\n\n\t// Expose QUnit object\n\twindow.QUnit = QUnit;\n}\n\n// Extend QUnit object,\n// these after set here because they should not be exposed as global functions\nextend( QUnit, {\n\tconfig: config,\n\n\t// Initialize the configuration options\n\tinit: function() {\n\t\textend( config, {\n\t\t\tstats: { all: 0, bad: 0 },\n\t\t\tmoduleStats: { all: 0, bad: 0 },\n\t\t\tstarted: +new Date(),\n\t\t\tupdateRate: 1000,\n\t\t\tblocking: false,\n\t\t\tautostart: true,\n\t\t\tautorun: false,\n\t\t\tfilter: \"\",\n\t\t\tqueue: [],\n\t\t\tsemaphore: 0\n\t\t});\n\n\t\tvar tests, banner, result,\n\t\t\tqunit = id( \"qunit\" );\n\n\t\tif ( qunit ) {\n\t\t\tqunit.innerHTML =\n\t\t\t\t\"<h1 id='qunit-header'>\" + escapeInnerText( document.title ) + \"</h1>\" +\n\t\t\t\t\"<h2 id='qunit-banner'></h2>\" +\n\t\t\t\t\"<div id='qunit-testrunner-toolbar'></div>\" +\n\t\t\t\t\"<h2 id='qunit-userAgent'></h2>\" +\n\t\t\t\t\"<ol id='qunit-tests'></ol>\";\n\t\t}\n\n\t\ttests = id( \"qunit-tests\" );\n\t\tbanner = id( \"qunit-banner\" );\n\t\tresult = id( \"qunit-testresult\" );\n\n\t\tif ( tests ) {\n\t\t\ttests.innerHTML = \"\";\n\t\t}\n\n\t\tif ( banner ) {\n\t\t\tbanner.className = \"\";\n\t\t}\n\n\t\tif ( result ) {\n\t\t\tresult.parentNode.removeChild( result );\n\t\t}\n\n\t\tif ( tests ) {\n\t\t\tresult = document.createElement( \"p\" );\n\t\t\tresult.id = \"qunit-testresult\";\n\t\t\tresult.className = \"result\";\n\t\t\ttests.parentNode.insertBefore( result, tests );\n\t\t\tresult.innerHTML = \"Running...<br/>&nbsp;\";\n\t\t}\n\t},\n\n\t// Resets the test setup. Useful for tests that modify the DOM.\n\treset: function() {\n\t\tvar fixture = id( \"qunit-fixture\" );\n\t\tif ( fixture ) {\n\t\t\tfixture.innerHTML = config.fixture;\n\t\t}\n\t},\n\n\t// Trigger an event on an element.\n\t// @example triggerEvent( document.body, \"click\" );\n\ttriggerEvent: function( elem, type, event ) {\n\t\tif ( document.createEvent ) {\n\t\t\tevent = document.createEvent( \"MouseEvents\" );\n\t\t\tevent.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,\n\t\t\t\t0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\n\t\t\telem.dispatchEvent( event );\n\t\t} else if ( elem.fireEvent ) {\n\t\t\telem.fireEvent( \"on\" + type );\n\t\t}\n\t},\n\n\t// Safe object type checking\n\tis: function( type, obj ) {\n\t\treturn QUnit.objectType( obj ) == type;\n\t},\n\n\tobjectType: function( obj ) {\n\t\tif ( typeof obj === \"undefined\" ) {\n\t\t\t\treturn \"undefined\";\n\t\t// consider: typeof null === object\n\t\t}\n\t\tif ( obj === null ) {\n\t\t\t\treturn \"null\";\n\t\t}\n\n\t\tvar type = toString.call( obj ).match(/^\\[object\\s(.*)\\]$/)[1] || \"\";\n\n\t\tswitch ( type ) {\n\t\t\tcase \"Number\":\n\t\t\t\tif ( isNaN(obj) ) {\n\t\t\t\t\treturn \"nan\";\n\t\t\t\t}\n\t\t\t\treturn \"number\";\n\t\t\tcase \"String\":\n\t\t\tcase \"Boolean\":\n\t\t\tcase \"Array\":\n\t\t\tcase \"Date\":\n\t\t\tcase \"RegExp\":\n\t\t\tcase \"Function\":\n\t\t\t\treturn type.toLowerCase();\n\t\t}\n\t\tif ( typeof obj === \"object\" ) {\n\t\t\treturn \"object\";\n\t\t}\n\t\treturn undefined;\n\t},\n\n\tpush: function( result, actual, expected, message ) {\n\t\tif ( !config.current ) {\n\t\t\tthrow new Error( \"assertion outside test context, was \" + sourceFromStacktrace() );\n\t\t}\n\n\t\tvar output, source,\n\t\t\tdetails = {\n\t\t\t\tmodule: config.current.module,\n\t\t\t\tname: config.current.testName,\n\t\t\t\tresult: result,\n\t\t\t\tmessage: message,\n\t\t\t\tactual: actual,\n\t\t\t\texpected: expected\n\t\t\t};\n\n\t\tmessage = escapeInnerText( message ) || ( result ? \"okay\" : \"failed\" );\n\t\tmessage = \"<span class='test-message'>\" + message + \"</span>\";\n\t\toutput = message;\n\n\t\tif ( !result ) {\n\t\t\texpected = escapeInnerText( QUnit.jsDump.parse(expected) );\n\t\t\tactual = escapeInnerText( QUnit.jsDump.parse(actual) );\n\t\t\toutput += \"<table><tr class='test-expected'><th>Expected: </th><td><pre>\" + expected + \"</pre></td></tr>\";\n\n\t\t\tif ( actual != expected ) {\n\t\t\t\toutput += \"<tr class='test-actual'><th>Result: </th><td><pre>\" + actual + \"</pre></td></tr>\";\n\t\t\t\toutput += \"<tr class='test-diff'><th>Diff: </th><td><pre>\" + QUnit.diff( expected, actual ) + \"</pre></td></tr>\";\n\t\t\t}\n\n\t\t\tsource = sourceFromStacktrace();\n\n\t\t\tif ( source ) {\n\t\t\t\tdetails.source = source;\n\t\t\t\toutput += \"<tr class='test-source'><th>Source: </th><td><pre>\" + escapeInnerText( source ) + \"</pre></td></tr>\";\n\t\t\t}\n\n\t\t\toutput += \"</table>\";\n\t\t}\n\n\t\trunLoggingCallbacks( \"log\", QUnit, details );\n\n\t\tconfig.current.assertions.push({\n\t\t\tresult: !!result,\n\t\t\tmessage: output\n\t\t});\n\t},\n\n\tpushFailure: function( message, source, actual ) {\n\t\tif ( !config.current ) {\n\t\t\tthrow new Error( \"pushFailure() assertion outside test context, was \" + sourceFromStacktrace(2) );\n\t\t}\n\n\t\tvar output,\n\t\t\tdetails = {\n\t\t\t\tmodule: config.current.module,\n\t\t\t\tname: config.current.testName,\n\t\t\t\tresult: false,\n\t\t\t\tmessage: message\n\t\t\t};\n\n\t\tmessage = escapeInnerText( message ) || \"error\";\n\t\tmessage = \"<span class='test-message'>\" + message + \"</span>\";\n\t\toutput = message;\n\n\t\toutput += \"<table>\";\n\n\t\tif ( actual ) {\n\t\t\toutput += \"<tr class='test-actual'><th>Result: </th><td><pre>\" + escapeInnerText( actual ) + \"</pre></td></tr>\";\n\t\t}\n\n\t\tif ( source ) {\n\t\t\tdetails.source = source;\n\t\t\toutput += \"<tr class='test-source'><th>Source: </th><td><pre>\" + escapeInnerText( source ) + \"</pre></td></tr>\";\n\t\t}\n\n\t\toutput += \"</table>\";\n\n\t\trunLoggingCallbacks( \"log\", QUnit, details );\n\n\t\tconfig.current.assertions.push({\n\t\t\tresult: false,\n\t\t\tmessage: output\n\t\t});\n\t},\n\n\turl: function( params ) {\n\t\tparams = extend( extend( {}, QUnit.urlParams ), params );\n\t\tvar key,\n\t\t\tquerystring = \"?\";\n\n\t\tfor ( key in params ) {\n\t\t\tif ( !hasOwn.call( params, key ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tquerystring += encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( params[ key ] ) + \"&\";\n\t\t}\n\t\treturn window.location.pathname + querystring.slice( 0, -1 );\n\t},\n\n\textend: extend,\n\tid: id,\n\taddEvent: addEvent\n\t// load, equiv, jsDump, diff: Attached later\n});\n\n/**\n * @deprecated: Created for backwards compatibility with test runner that set the hook function\n * into QUnit.{hook}, instead of invoking it and passing the hook function.\n * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here.\n * Doing this allows us to tell if the following methods have been overwritten on the actual\n * QUnit object.\n */\nextend( QUnit.constructor.prototype, {\n\n\t// Logging callbacks; all receive a single argument with the listed properties\n\t// run test/logs.html for any related changes\n\tbegin: registerLoggingCallback( \"begin\" ),\n\n\t// done: { failed, passed, total, runtime }\n\tdone: registerLoggingCallback( \"done\" ),\n\n\t// log: { result, actual, expected, message }\n\tlog: registerLoggingCallback( \"log\" ),\n\n\t// testStart: { name }\n\ttestStart: registerLoggingCallback( \"testStart\" ),\n\n\t// testDone: { name, failed, passed, total }\n\ttestDone: registerLoggingCallback( \"testDone\" ),\n\n\t// moduleStart: { name }\n\tmoduleStart: registerLoggingCallback( \"moduleStart\" ),\n\n\t// moduleDone: { name, failed, passed, total }\n\tmoduleDone: registerLoggingCallback( \"moduleDone\" )\n});\n\nif ( typeof document === \"undefined\" || document.readyState === \"complete\" ) {\n\tconfig.autorun = true;\n}\n\nQUnit.load = function() {\n\trunLoggingCallbacks( \"begin\", QUnit, {} );\n\n\t// Initialize the config, saving the execution queue\n\tvar banner, filter, i, label, len, main, ol, toolbar, userAgent, val, urlConfigCheckboxes, moduleFilter,\n\t    numModules = 0,\n\t    moduleFilterHtml = \"\",\n\t\turlConfigHtml = \"\",\n\t\toldconfig = extend( {}, config );\n\n\tQUnit.init();\n\textend(config, oldconfig);\n\n\tconfig.blocking = false;\n\n\tlen = config.urlConfig.length;\n\n\tfor ( i = 0; i < len; i++ ) {\n\t\tval = config.urlConfig[i];\n\t\tif ( typeof val === \"string\" ) {\n\t\t\tval = {\n\t\t\t\tid: val,\n\t\t\t\tlabel: val,\n\t\t\t\ttooltip: \"[no tooltip available]\"\n\t\t\t};\n\t\t}\n\t\tconfig[ val.id ] = QUnit.urlParams[ val.id ];\n\t\turlConfigHtml += \"<input id='qunit-urlconfig-\" + val.id + \"' name='\" + val.id + \"' type='checkbox'\" + ( config[ val.id ] ? \" checked='checked'\" : \"\" ) + \" title='\" + val.tooltip + \"'><label for='qunit-urlconfig-\" + val.id + \"' title='\" + val.tooltip + \"'>\" + val.label + \"</label>\";\n\t}\n\n\tmoduleFilterHtml += \"<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' \" + ( config.module === undefined  ? \"selected\" : \"\" ) + \">< All Modules ></option>\";\n\tfor ( i in config.modules ) {\n\t\tif ( config.modules.hasOwnProperty( i ) ) {\n\t\t\tnumModules += 1;\n\t\t\tmoduleFilterHtml += \"<option value='\" + encodeURIComponent(i) + \"' \" + ( config.module === i ? \"selected\" : \"\" ) + \">\" + i + \"</option>\";\n\t\t}\n\t}\n\tmoduleFilterHtml += \"</select>\";\n\n\t// `userAgent` initialized at top of scope\n\tuserAgent = id( \"qunit-userAgent\" );\n\tif ( userAgent ) {\n\t\tuserAgent.innerHTML = navigator.userAgent;\n\t}\n\n\t// `banner` initialized at top of scope\n\tbanner = id( \"qunit-header\" );\n\tif ( banner ) {\n\t\tbanner.innerHTML = \"<a href='\" + QUnit.url({ filter: undefined, module: undefined, testNumber: undefined }) + \"'>\" + banner.innerHTML + \"</a> \";\n\t}\n\n\t// `toolbar` initialized at top of scope\n\ttoolbar = id( \"qunit-testrunner-toolbar\" );\n\tif ( toolbar ) {\n\t\t// `filter` initialized at top of scope\n\t\tfilter = document.createElement( \"input\" );\n\t\tfilter.type = \"checkbox\";\n\t\tfilter.id = \"qunit-filter-pass\";\n\n\t\taddEvent( filter, \"click\", function() {\n\t\t\tvar tmp,\n\t\t\t\tol = document.getElementById( \"qunit-tests\" );\n\n\t\t\tif ( filter.checked ) {\n\t\t\t\tol.className = ol.className + \" hidepass\";\n\t\t\t} else {\n\t\t\t\ttmp = \" \" + ol.className.replace( /[\\n\\t\\r]/g, \" \" ) + \" \";\n\t\t\t\tol.className = tmp.replace( / hidepass /, \" \" );\n\t\t\t}\n\t\t\tif ( defined.sessionStorage ) {\n\t\t\t\tif (filter.checked) {\n\t\t\t\t\tsessionStorage.setItem( \"qunit-filter-passed-tests\", \"true\" );\n\t\t\t\t} else {\n\t\t\t\t\tsessionStorage.removeItem( \"qunit-filter-passed-tests\" );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( \"qunit-filter-passed-tests\" ) ) {\n\t\t\tfilter.checked = true;\n\t\t\t// `ol` initialized at top of scope\n\t\t\tol = document.getElementById( \"qunit-tests\" );\n\t\t\tol.className = ol.className + \" hidepass\";\n\t\t}\n\t\ttoolbar.appendChild( filter );\n\n\t\t// `label` initialized at top of scope\n\t\tlabel = document.createElement( \"label\" );\n\t\tlabel.setAttribute( \"for\", \"qunit-filter-pass\" );\n\t\tlabel.setAttribute( \"title\", \"Only show tests and assertons that fail. Stored in sessionStorage.\" );\n\t\tlabel.innerHTML = \"Hide passed tests\";\n\t\ttoolbar.appendChild( label );\n\n\t\turlConfigCheckboxes = document.createElement( 'span' );\n\t\turlConfigCheckboxes.innerHTML = urlConfigHtml;\n\t\taddEvent( urlConfigCheckboxes, \"change\", function( event ) {\n\t\t\tvar params = {};\n\t\t\tparams[ event.target.name ] = event.target.checked ? true : undefined;\n\t\t\twindow.location = QUnit.url( params );\n\t\t});\n\t\ttoolbar.appendChild( urlConfigCheckboxes );\n\n\t\tif (numModules > 1) {\n\t\t\tmoduleFilter = document.createElement( 'span' );\n\t\t\tmoduleFilter.setAttribute( 'id', 'qunit-modulefilter-container' );\n\t\t\tmoduleFilter.innerHTML = moduleFilterHtml;\n\t\t\taddEvent( moduleFilter, \"change\", function() {\n\t\t\t\tvar selectBox = moduleFilter.getElementsByTagName(\"select\")[0],\n\t\t\t\t    selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);\n\n\t\t\t\twindow.location = QUnit.url( { module: ( selectedModule === \"\" ) ? undefined : selectedModule } );\n\t\t\t});\n\t\t\ttoolbar.appendChild(moduleFilter);\n\t\t}\n\t}\n\n\t// `main` initialized at top of scope\n\tmain = id( \"qunit-fixture\" );\n\tif ( main ) {\n\t\tconfig.fixture = main.innerHTML;\n\t}\n\n\tif ( config.autostart ) {\n\t\tQUnit.start();\n\t}\n};\n\naddEvent( window, \"load\", QUnit.load );\n\n// `onErrorFnPrev` initialized at top of scope\n// Preserve other handlers\nonErrorFnPrev = window.onerror;\n\n// Cover uncaught exceptions\n// Returning true will surpress the default browser handler,\n// returning false will let it run.\nwindow.onerror = function ( error, filePath, linerNr ) {\n\tvar ret = false;\n\tif ( onErrorFnPrev ) {\n\t\tret = onErrorFnPrev( error, filePath, linerNr );\n\t}\n\n\t// Treat return value as window.onerror itself does,\n\t// Only do our handling if not surpressed.\n\tif ( ret !== true ) {\n\t\tif ( QUnit.config.current ) {\n\t\t\tif ( QUnit.config.current.ignoreGlobalErrors ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tQUnit.pushFailure( error, filePath + \":\" + linerNr );\n\t\t} else {\n\t\t\tQUnit.test( \"global failure\", extend( function() {\n\t\t\t\tQUnit.pushFailure( error, filePath + \":\" + linerNr );\n\t\t\t}, { validTest: validTest } ) );\n\t\t}\n\t\treturn false;\n\t}\n\n\treturn ret;\n};\n\nfunction done() {\n\tconfig.autorun = true;\n\n\t// Log the last module results\n\tif ( config.currentModule ) {\n\t\trunLoggingCallbacks( \"moduleDone\", QUnit, {\n\t\t\tname: config.currentModule,\n\t\t\tfailed: config.moduleStats.bad,\n\t\t\tpassed: config.moduleStats.all - config.moduleStats.bad,\n\t\t\ttotal: config.moduleStats.all\n\t\t});\n\t}\n\n\tvar i, key,\n\t\tbanner = id( \"qunit-banner\" ),\n\t\ttests = id( \"qunit-tests\" ),\n\t\truntime = +new Date() - config.started,\n\t\tpassed = config.stats.all - config.stats.bad,\n\t\thtml = [\n\t\t\t\"Tests completed in \",\n\t\t\truntime,\n\t\t\t\" milliseconds.<br/>\",\n\t\t\t\"<span class='passed'>\",\n\t\t\tpassed,\n\t\t\t\"</span> tests of <span class='total'>\",\n\t\t\tconfig.stats.all,\n\t\t\t\"</span> passed, <span class='failed'>\",\n\t\t\tconfig.stats.bad,\n\t\t\t\"</span> failed.\"\n\t\t].join( \"\" );\n\n\tif ( banner ) {\n\t\tbanner.className = ( config.stats.bad ? \"qunit-fail\" : \"qunit-pass\" );\n\t}\n\n\tif ( tests ) {\n\t\tid( \"qunit-testresult\" ).innerHTML = html;\n\t}\n\n\tif ( config.altertitle && typeof document !== \"undefined\" && document.title ) {\n\t\t// show ✖ for good, ✔ for bad suite result in title\n\t\t// use escape sequences in case file gets loaded with non-utf-8-charset\n\t\tdocument.title = [\n\t\t\t( config.stats.bad ? \"\\u2716\" : \"\\u2714\" ),\n\t\t\tdocument.title.replace( /^[\\u2714\\u2716] /i, \"\" )\n\t\t].join( \" \" );\n\t}\n\n\t// clear own sessionStorage items if all tests passed\n\tif ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) {\n\t\t// `key` & `i` initialized at top of scope\n\t\tfor ( i = 0; i < sessionStorage.length; i++ ) {\n\t\t\tkey = sessionStorage.key( i++ );\n\t\t\tif ( key.indexOf( \"qunit-test-\" ) === 0 ) {\n\t\t\t\tsessionStorage.removeItem( key );\n\t\t\t}\n\t\t}\n\t}\n\n\t// scroll back to top to show results\n\tif ( window.scrollTo ) {\n\t\twindow.scrollTo(0, 0);\n\t}\n\n\trunLoggingCallbacks( \"done\", QUnit, {\n\t\tfailed: config.stats.bad,\n\t\tpassed: passed,\n\t\ttotal: config.stats.all,\n\t\truntime: runtime\n\t});\n}\n\n/** @return Boolean: true if this test should be ran */\nfunction validTest( test ) {\n\tvar include,\n\t\tfilter = config.filter && config.filter.toLowerCase(),\n\t\tmodule = config.module && config.module.toLowerCase(),\n\t\tfullName = (test.module + \": \" + test.testName).toLowerCase();\n\n\t// Internally-generated tests are always valid\n\tif ( test.callback && test.callback.validTest === validTest ) {\n\t\tdelete test.callback.validTest;\n\t\treturn true;\n\t}\n\n\tif ( config.testNumber ) {\n\t\treturn test.testNumber === config.testNumber;\n\t}\n\n\tif ( module && ( !test.module || test.module.toLowerCase() !== module ) ) {\n\t\treturn false;\n\t}\n\n\tif ( !filter ) {\n\t\treturn true;\n\t}\n\n\tinclude = filter.charAt( 0 ) !== \"!\";\n\tif ( !include ) {\n\t\tfilter = filter.slice( 1 );\n\t}\n\n\t// If the filter matches, we need to honour include\n\tif ( fullName.indexOf( filter ) !== -1 ) {\n\t\treturn include;\n\t}\n\n\t// Otherwise, do the opposite\n\treturn !include;\n}\n\n// so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions)\n// Later Safari and IE10 are supposed to support error.stack as well\n// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack\nfunction extractStacktrace( e, offset ) {\n\toffset = offset === undefined ? 3 : offset;\n\n\tvar stack, include, i, regex;\n\n\tif ( e.stacktrace ) {\n\t\t// Opera\n\t\treturn e.stacktrace.split( \"\\n\" )[ offset + 3 ];\n\t} else if ( e.stack ) {\n\t\t// Firefox, Chrome\n\t\tstack = e.stack.split( \"\\n\" );\n\t\tif (/^error$/i.test( stack[0] ) ) {\n\t\t\tstack.shift();\n\t\t}\n\t\tif ( fileName ) {\n\t\t\tinclude = [];\n\t\t\tfor ( i = offset; i < stack.length; i++ ) {\n\t\t\t\tif ( stack[ i ].indexOf( fileName ) != -1 ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tinclude.push( stack[ i ] );\n\t\t\t}\n\t\t\tif ( include.length ) {\n\t\t\t\treturn include.join( \"\\n\" );\n\t\t\t}\n\t\t}\n\t\treturn stack[ offset ];\n\t} else if ( e.sourceURL ) {\n\t\t// Safari, PhantomJS\n\t\t// hopefully one day Safari provides actual stacktraces\n\t\t// exclude useless self-reference for generated Error objects\n\t\tif ( /qunit.js$/.test( e.sourceURL ) ) {\n\t\t\treturn;\n\t\t}\n\t\t// for actual exceptions, this is useful\n\t\treturn e.sourceURL + \":\" + e.line;\n\t}\n}\nfunction sourceFromStacktrace( offset ) {\n\ttry {\n\t\tthrow new Error();\n\t} catch ( e ) {\n\t\treturn extractStacktrace( e, offset );\n\t}\n}\n\nfunction escapeInnerText( s ) {\n\tif ( !s ) {\n\t\treturn \"\";\n\t}\n\ts = s + \"\";\n\treturn s.replace( /[\\&<>]/g, function( s ) {\n\t\tswitch( s ) {\n\t\t\tcase \"&\": return \"&amp;\";\n\t\t\tcase \"<\": return \"&lt;\";\n\t\t\tcase \">\": return \"&gt;\";\n\t\t\tdefault: return s;\n\t\t}\n\t});\n}\n\nfunction synchronize( callback, last ) {\n\tconfig.queue.push( callback );\n\n\tif ( config.autorun && !config.blocking ) {\n\t\tprocess( last );\n\t}\n}\n\nfunction process( last ) {\n\tfunction next() {\n\t\tprocess( last );\n\t}\n\tvar start = new Date().getTime();\n\tconfig.depth = config.depth ? config.depth + 1 : 1;\n\n\twhile ( config.queue.length && !config.blocking ) {\n\t\tif ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {\n\t\t\tconfig.queue.shift()();\n\t\t} else {\n\t\t\twindow.setTimeout( next, 13 );\n\t\t\tbreak;\n\t\t}\n\t}\n\tconfig.depth--;\n\tif ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {\n\t\tdone();\n\t}\n}\n\nfunction saveGlobal() {\n\tconfig.pollution = [];\n\n\tif ( config.noglobals ) {\n\t\tfor ( var key in window ) {\n\t\t\t// in Opera sometimes DOM element ids show up here, ignore them\n\t\t\tif ( !hasOwn.call( window, key ) || /^qunit-test-output/.test( key ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconfig.pollution.push( key );\n\t\t}\n\t}\n}\n\nfunction checkPollution( name ) {\n\tvar newGlobals,\n\t\tdeletedGlobals,\n\t\told = config.pollution;\n\n\tsaveGlobal();\n\n\tnewGlobals = diff( config.pollution, old );\n\tif ( newGlobals.length > 0 ) {\n\t\tQUnit.pushFailure( \"Introduced global variable(s): \" + newGlobals.join(\", \") );\n\t}\n\n\tdeletedGlobals = diff( old, config.pollution );\n\tif ( deletedGlobals.length > 0 ) {\n\t\tQUnit.pushFailure( \"Deleted global variable(s): \" + deletedGlobals.join(\", \") );\n\t}\n}\n\n// returns a new Array with the elements that are in a but not in b\nfunction diff( a, b ) {\n\tvar i, j,\n\t\tresult = a.slice();\n\n\tfor ( i = 0; i < result.length; i++ ) {\n\t\tfor ( j = 0; j < b.length; j++ ) {\n\t\t\tif ( result[i] === b[j] ) {\n\t\t\t\tresult.splice( i, 1 );\n\t\t\t\ti--;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction extend( a, b ) {\n\tfor ( var prop in b ) {\n\t\tif ( b[ prop ] === undefined ) {\n\t\t\tdelete a[ prop ];\n\n\t\t// Avoid \"Member not found\" error in IE8 caused by setting window.constructor\n\t\t} else if ( prop !== \"constructor\" || a !== window ) {\n\t\t\ta[ prop ] = b[ prop ];\n\t\t}\n\t}\n\n\treturn a;\n}\n\nfunction addEvent( elem, type, fn ) {\n\tif ( elem.addEventListener ) {\n\t\telem.addEventListener( type, fn, false );\n\t} else if ( elem.attachEvent ) {\n\t\telem.attachEvent( \"on\" + type, fn );\n\t} else {\n\t\tfn();\n\t}\n}\n\nfunction id( name ) {\n\treturn !!( typeof document !== \"undefined\" && document && document.getElementById ) &&\n\t\tdocument.getElementById( name );\n}\n\nfunction registerLoggingCallback( key ) {\n\treturn function( callback ) {\n\t\tconfig[key].push( callback );\n\t};\n}\n\n// Supports deprecated method of completely overwriting logging callbacks\nfunction runLoggingCallbacks( key, scope, args ) {\n\t//debugger;\n\tvar i, callbacks;\n\tif ( QUnit.hasOwnProperty( key ) ) {\n\t\tQUnit[ key ].call(scope, args );\n\t} else {\n\t\tcallbacks = config[ key ];\n\t\tfor ( i = 0; i < callbacks.length; i++ ) {\n\t\t\tcallbacks[ i ].call( scope, args );\n\t\t}\n\t}\n}\n\n// Test for equality any JavaScript type.\n// Author: Philippe Rathé <prathe@gmail.com>\nQUnit.equiv = (function() {\n\n\t// Call the o related callback with the given arguments.\n\tfunction bindCallbacks( o, callbacks, args ) {\n\t\tvar prop = QUnit.objectType( o );\n\t\tif ( prop ) {\n\t\t\tif ( QUnit.objectType( callbacks[ prop ] ) === \"function\" ) {\n\t\t\t\treturn callbacks[ prop ].apply( callbacks, args );\n\t\t\t} else {\n\t\t\t\treturn callbacks[ prop ]; // or undefined\n\t\t\t}\n\t\t}\n\t}\n\n\t// the real equiv function\n\tvar innerEquiv,\n\t\t// stack to decide between skip/abort functions\n\t\tcallers = [],\n\t\t// stack to avoiding loops from circular referencing\n\t\tparents = [],\n\n\t\tgetProto = Object.getPrototypeOf || function ( obj ) {\n\t\t\treturn obj.__proto__;\n\t\t},\n\t\tcallbacks = (function () {\n\n\t\t\t// for string, boolean, number and null\n\t\t\tfunction useStrictEquality( b, a ) {\n\t\t\t\tif ( b instanceof a.constructor || a instanceof b.constructor ) {\n\t\t\t\t\t// to catch short annotaion VS 'new' annotation of a\n\t\t\t\t\t// declaration\n\t\t\t\t\t// e.g. var i = 1;\n\t\t\t\t\t// var j = new Number(1);\n\t\t\t\t\treturn a == b;\n\t\t\t\t} else {\n\t\t\t\t\treturn a === b;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t\"string\": useStrictEquality,\n\t\t\t\t\"boolean\": useStrictEquality,\n\t\t\t\t\"number\": useStrictEquality,\n\t\t\t\t\"null\": useStrictEquality,\n\t\t\t\t\"undefined\": useStrictEquality,\n\n\t\t\t\t\"nan\": function( b ) {\n\t\t\t\t\treturn isNaN( b );\n\t\t\t\t},\n\n\t\t\t\t\"date\": function( b, a ) {\n\t\t\t\t\treturn QUnit.objectType( b ) === \"date\" && a.valueOf() === b.valueOf();\n\t\t\t\t},\n\n\t\t\t\t\"regexp\": function( b, a ) {\n\t\t\t\t\treturn QUnit.objectType( b ) === \"regexp\" &&\n\t\t\t\t\t\t// the regex itself\n\t\t\t\t\t\ta.source === b.source &&\n\t\t\t\t\t\t// and its modifers\n\t\t\t\t\t\ta.global === b.global &&\n\t\t\t\t\t\t// (gmi) ...\n\t\t\t\t\t\ta.ignoreCase === b.ignoreCase &&\n\t\t\t\t\t\ta.multiline === b.multiline &&\n\t\t\t\t\t\ta.sticky === b.sticky;\n\t\t\t\t},\n\n\t\t\t\t// - skip when the property is a method of an instance (OOP)\n\t\t\t\t// - abort otherwise,\n\t\t\t\t// initial === would have catch identical references anyway\n\t\t\t\t\"function\": function() {\n\t\t\t\t\tvar caller = callers[callers.length - 1];\n\t\t\t\t\treturn caller !== Object && typeof caller !== \"undefined\";\n\t\t\t\t},\n\n\t\t\t\t\"array\": function( b, a ) {\n\t\t\t\t\tvar i, j, len, loop;\n\n\t\t\t\t\t// b could be an object literal here\n\t\t\t\t\tif ( QUnit.objectType( b ) !== \"array\" ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tlen = a.length;\n\t\t\t\t\tif ( len !== b.length ) {\n\t\t\t\t\t\t// safe and faster\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\t// track reference to avoid circular references\n\t\t\t\t\tparents.push( a );\n\t\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\t\tloop = false;\n\t\t\t\t\t\tfor ( j = 0; j < parents.length; j++ ) {\n\t\t\t\t\t\t\tif ( parents[j] === a[i] ) {\n\t\t\t\t\t\t\t\tloop = true;// dont rewalk array\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( !loop && !innerEquiv(a[i], b[i]) ) {\n\t\t\t\t\t\t\tparents.pop();\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tparents.pop();\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\n\t\t\t\t\"object\": function( b, a ) {\n\t\t\t\t\tvar i, j, loop,\n\t\t\t\t\t\t// Default to true\n\t\t\t\t\t\teq = true,\n\t\t\t\t\t\taProperties = [],\n\t\t\t\t\t\tbProperties = [];\n\n\t\t\t\t\t// comparing constructors is more strict than using\n\t\t\t\t\t// instanceof\n\t\t\t\t\tif ( a.constructor !== b.constructor ) {\n\t\t\t\t\t\t// Allow objects with no prototype to be equivalent to\n\t\t\t\t\t\t// objects with Object as their constructor.\n\t\t\t\t\t\tif ( !(( getProto(a) === null && getProto(b) === Object.prototype ) ||\n\t\t\t\t\t\t\t( getProto(b) === null && getProto(a) === Object.prototype ) ) ) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// stack constructor before traversing properties\n\t\t\t\t\tcallers.push( a.constructor );\n\t\t\t\t\t// track reference to avoid circular references\n\t\t\t\t\tparents.push( a );\n\n\t\t\t\t\tfor ( i in a ) { // be strict: don't ensures hasOwnProperty\n\t\t\t\t\t\t\t\t\t// and go deep\n\t\t\t\t\t\tloop = false;\n\t\t\t\t\t\tfor ( j = 0; j < parents.length; j++ ) {\n\t\t\t\t\t\t\tif ( parents[j] === a[i] ) {\n\t\t\t\t\t\t\t\t// don't go down the same path twice\n\t\t\t\t\t\t\t\tloop = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\taProperties.push(i); // collect a's properties\n\n\t\t\t\t\t\tif (!loop && !innerEquiv( a[i], b[i] ) ) {\n\t\t\t\t\t\t\teq = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallers.pop(); // unstack, we are done\n\t\t\t\t\tparents.pop();\n\n\t\t\t\t\tfor ( i in b ) {\n\t\t\t\t\t\tbProperties.push( i ); // collect b's properties\n\t\t\t\t\t}\n\n\t\t\t\t\t// Ensures identical properties name\n\t\t\t\t\treturn eq && innerEquiv( aProperties.sort(), bProperties.sort() );\n\t\t\t\t}\n\t\t\t};\n\t\t}());\n\n\tinnerEquiv = function() { // can take multiple arguments\n\t\tvar args = [].slice.apply( arguments );\n\t\tif ( args.length < 2 ) {\n\t\t\treturn true; // end transition\n\t\t}\n\n\t\treturn (function( a, b ) {\n\t\t\tif ( a === b ) {\n\t\t\t\treturn true; // catch the most you can\n\t\t\t} else if ( a === null || b === null || typeof a === \"undefined\" ||\n\t\t\t\t\ttypeof b === \"undefined\" ||\n\t\t\t\t\tQUnit.objectType(a) !== QUnit.objectType(b) ) {\n\t\t\t\treturn false; // don't lose time with error prone cases\n\t\t\t} else {\n\t\t\t\treturn bindCallbacks(a, callbacks, [ b, a ]);\n\t\t\t}\n\n\t\t\t// apply transition with (1..n) arguments\n\t\t}( args[0], args[1] ) && arguments.callee.apply( this, args.splice(1, args.length - 1 )) );\n\t};\n\n\treturn innerEquiv;\n}());\n\n/**\n * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |\n * http://flesler.blogspot.com Licensed under BSD\n * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008\n *\n * @projectDescription Advanced and extensible data dumping for Javascript.\n * @version 1.0.0\n * @author Ariel Flesler\n * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}\n */\nQUnit.jsDump = (function() {\n\tfunction quote( str ) {\n\t\treturn '\"' + str.toString().replace( /\"/g, '\\\\\"' ) + '\"';\n\t}\n\tfunction literal( o ) {\n\t\treturn o + \"\";\n\t}\n\tfunction join( pre, arr, post ) {\n\t\tvar s = jsDump.separator(),\n\t\t\tbase = jsDump.indent(),\n\t\t\tinner = jsDump.indent(1);\n\t\tif ( arr.join ) {\n\t\t\tarr = arr.join( \",\" + s + inner );\n\t\t}\n\t\tif ( !arr ) {\n\t\t\treturn pre + post;\n\t\t}\n\t\treturn [ pre, inner + arr, base + post ].join(s);\n\t}\n\tfunction array( arr, stack ) {\n\t\tvar i = arr.length, ret = new Array(i);\n\t\tthis.up();\n\t\twhile ( i-- ) {\n\t\t\tret[i] = this.parse( arr[i] , undefined , stack);\n\t\t}\n\t\tthis.down();\n\t\treturn join( \"[\", ret, \"]\" );\n\t}\n\n\tvar reName = /^function (\\w+)/,\n\t\tjsDump = {\n\t\t\tparse: function( obj, type, stack ) { //type is used mostly internally, you can fix a (custom)type in advance\n\t\t\t\tstack = stack || [ ];\n\t\t\t\tvar inStack, res,\n\t\t\t\t\tparser = this.parsers[ type || this.typeOf(obj) ];\n\n\t\t\t\ttype = typeof parser;\n\t\t\t\tinStack = inArray( obj, stack );\n\n\t\t\t\tif ( inStack != -1 ) {\n\t\t\t\t\treturn \"recursion(\" + (inStack - stack.length) + \")\";\n\t\t\t\t}\n\t\t\t\t//else\n\t\t\t\tif ( type == \"function\" )  {\n\t\t\t\t\tstack.push( obj );\n\t\t\t\t\tres = parser.call( this, obj, stack );\n\t\t\t\t\tstack.pop();\n\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t\t// else\n\t\t\t\treturn ( type == \"string\" ) ? parser : this.parsers.error;\n\t\t\t},\n\t\t\ttypeOf: function( obj ) {\n\t\t\t\tvar type;\n\t\t\t\tif ( obj === null ) {\n\t\t\t\t\ttype = \"null\";\n\t\t\t\t} else if ( typeof obj === \"undefined\" ) {\n\t\t\t\t\ttype = \"undefined\";\n\t\t\t\t} else if ( QUnit.is( \"regexp\", obj) ) {\n\t\t\t\t\ttype = \"regexp\";\n\t\t\t\t} else if ( QUnit.is( \"date\", obj) ) {\n\t\t\t\t\ttype = \"date\";\n\t\t\t\t} else if ( QUnit.is( \"function\", obj) ) {\n\t\t\t\t\ttype = \"function\";\n\t\t\t\t} else if ( typeof obj.setInterval !== undefined && typeof obj.document !== \"undefined\" && typeof obj.nodeType === \"undefined\" ) {\n\t\t\t\t\ttype = \"window\";\n\t\t\t\t} else if ( obj.nodeType === 9 ) {\n\t\t\t\t\ttype = \"document\";\n\t\t\t\t} else if ( obj.nodeType ) {\n\t\t\t\t\ttype = \"node\";\n\t\t\t\t} else if (\n\t\t\t\t\t// native arrays\n\t\t\t\t\ttoString.call( obj ) === \"[object Array]\" ||\n\t\t\t\t\t// NodeList objects\n\t\t\t\t\t( typeof obj.length === \"number\" && typeof obj.item !== \"undefined\" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === \"undefined\" ) ) )\n\t\t\t\t) {\n\t\t\t\t\ttype = \"array\";\n\t\t\t\t} else {\n\t\t\t\t\ttype = typeof obj;\n\t\t\t\t}\n\t\t\t\treturn type;\n\t\t\t},\n\t\t\tseparator: function() {\n\t\t\t\treturn this.multiline ?\tthis.HTML ? \"<br />\" : \"\\n\" : this.HTML ? \"&nbsp;\" : \" \";\n\t\t\t},\n\t\t\tindent: function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing\n\t\t\t\tif ( !this.multiline ) {\n\t\t\t\t\treturn \"\";\n\t\t\t\t}\n\t\t\t\tvar chr = this.indentChar;\n\t\t\t\tif ( this.HTML ) {\n\t\t\t\t\tchr = chr.replace( /\\t/g, \"   \" ).replace( / /g, \"&nbsp;\" );\n\t\t\t\t}\n\t\t\t\treturn new Array( this._depth_ + (extra||0) ).join(chr);\n\t\t\t},\n\t\t\tup: function( a ) {\n\t\t\t\tthis._depth_ += a || 1;\n\t\t\t},\n\t\t\tdown: function( a ) {\n\t\t\t\tthis._depth_ -= a || 1;\n\t\t\t},\n\t\t\tsetParser: function( name, parser ) {\n\t\t\t\tthis.parsers[name] = parser;\n\t\t\t},\n\t\t\t// The next 3 are exposed so you can use them\n\t\t\tquote: quote,\n\t\t\tliteral: literal,\n\t\t\tjoin: join,\n\t\t\t//\n\t\t\t_depth_: 1,\n\t\t\t// This is the list of parsers, to modify them, use jsDump.setParser\n\t\t\tparsers: {\n\t\t\t\twindow: \"[Window]\",\n\t\t\t\tdocument: \"[Document]\",\n\t\t\t\terror: \"[ERROR]\", //when no parser is found, shouldn\"t happen\n\t\t\t\tunknown: \"[Unknown]\",\n\t\t\t\t\"null\": \"null\",\n\t\t\t\t\"undefined\": \"undefined\",\n\t\t\t\t\"function\": function( fn ) {\n\t\t\t\t\tvar ret = \"function\",\n\t\t\t\t\t\tname = \"name\" in fn ? fn.name : (reName.exec(fn) || [])[1];//functions never have name in IE\n\n\t\t\t\t\tif ( name ) {\n\t\t\t\t\t\tret += \" \" + name;\n\t\t\t\t\t}\n\t\t\t\t\tret += \"( \";\n\n\t\t\t\t\tret = [ ret, QUnit.jsDump.parse( fn, \"functionArgs\" ), \"){\" ].join( \"\" );\n\t\t\t\t\treturn join( ret, QUnit.jsDump.parse(fn,\"functionCode\" ), \"}\" );\n\t\t\t\t},\n\t\t\t\tarray: array,\n\t\t\t\tnodelist: array,\n\t\t\t\t\"arguments\": array,\n\t\t\t\tobject: function( map, stack ) {\n\t\t\t\t\tvar ret = [ ], keys, key, val, i;\n\t\t\t\t\tQUnit.jsDump.up();\n\t\t\t\t\tif ( Object.keys ) {\n\t\t\t\t\t\tkeys = Object.keys( map );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tkeys = [];\n\t\t\t\t\t\tfor ( key in map ) {\n\t\t\t\t\t\t\tkeys.push( key );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tkeys.sort();\n\t\t\t\t\tfor ( i = 0; i < keys.length; i++ ) {\n\t\t\t\t\t\tkey = keys[ i ];\n\t\t\t\t\t\tval = map[ key ];\n\t\t\t\t\t\tret.push( QUnit.jsDump.parse( key, \"key\" ) + \": \" + QUnit.jsDump.parse( val, undefined, stack ) );\n\t\t\t\t\t}\n\t\t\t\t\tQUnit.jsDump.down();\n\t\t\t\t\treturn join( \"{\", ret, \"}\" );\n\t\t\t\t},\n\t\t\t\tnode: function( node ) {\n\t\t\t\t\tvar a, val,\n\t\t\t\t\t\topen = QUnit.jsDump.HTML ? \"&lt;\" : \"<\",\n\t\t\t\t\t\tclose = QUnit.jsDump.HTML ? \"&gt;\" : \">\",\n\t\t\t\t\t\ttag = node.nodeName.toLowerCase(),\n\t\t\t\t\t\tret = open + tag;\n\n\t\t\t\t\tfor ( a in QUnit.jsDump.DOMAttrs ) {\n\t\t\t\t\t\tval = node[ QUnit.jsDump.DOMAttrs[a] ];\n\t\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\t\tret += \" \" + a + \"=\" + QUnit.jsDump.parse( val, \"attribute\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn ret + close + open + \"/\" + tag + close;\n\t\t\t\t},\n\t\t\t\tfunctionArgs: function( fn ) {//function calls it internally, it's the arguments part of the function\n\t\t\t\t\tvar args,\n\t\t\t\t\t\tl = fn.length;\n\n\t\t\t\t\tif ( !l ) {\n\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t}\n\n\t\t\t\t\targs = new Array(l);\n\t\t\t\t\twhile ( l-- ) {\n\t\t\t\t\t\targs[l] = String.fromCharCode(97+l);//97 is 'a'\n\t\t\t\t\t}\n\t\t\t\t\treturn \" \" + args.join( \", \" ) + \" \";\n\t\t\t\t},\n\t\t\t\tkey: quote, //object calls it internally, the key part of an item in a map\n\t\t\t\tfunctionCode: \"[code]\", //function calls it internally, it's the content of the function\n\t\t\t\tattribute: quote, //node calls it internally, it's an html attribute value\n\t\t\t\tstring: quote,\n\t\t\t\tdate: quote,\n\t\t\t\tregexp: literal, //regex\n\t\t\t\tnumber: literal,\n\t\t\t\t\"boolean\": literal\n\t\t\t},\n\t\t\tDOMAttrs: {\n\t\t\t\t//attributes to dump from nodes, name=>realName\n\t\t\t\tid: \"id\",\n\t\t\t\tname: \"name\",\n\t\t\t\t\"class\": \"className\"\n\t\t\t},\n\t\t\tHTML: false,//if true, entities are escaped ( <, >, \\t, space and \\n )\n\t\t\tindentChar: \"  \",//indentation unit\n\t\t\tmultiline: true //if true, items in a collection, are separated by a \\n, else just a space.\n\t\t};\n\n\treturn jsDump;\n}());\n\n// from Sizzle.js\nfunction getText( elems ) {\n\tvar i, elem,\n\t\tret = \"\";\n\n\tfor ( i = 0; elems[i]; i++ ) {\n\t\telem = elems[i];\n\n\t\t// Get the text from text nodes and CDATA nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\tret += elem.nodeValue;\n\n\t\t// Traverse everything else, except comment nodes\n\t\t} else if ( elem.nodeType !== 8 ) {\n\t\t\tret += getText( elem.childNodes );\n\t\t}\n\t}\n\n\treturn ret;\n}\n\n// from jquery.js\nfunction inArray( elem, array ) {\n\tif ( array.indexOf ) {\n\t\treturn array.indexOf( elem );\n\t}\n\n\tfor ( var i = 0, length = array.length; i < length; i++ ) {\n\t\tif ( array[ i ] === elem ) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n/*\n * Javascript Diff Algorithm\n *  By John Resig (http://ejohn.org/)\n *  Modified by Chu Alan \"sprite\"\n *\n * Released under the MIT license.\n *\n * More Info:\n *  http://ejohn.org/projects/javascript-diff-algorithm/\n *\n * Usage: QUnit.diff(expected, actual)\n *\n * QUnit.diff( \"the quick brown fox jumped over\", \"the quick fox jumps over\" ) == \"the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over\"\n */\nQUnit.diff = (function() {\n\tfunction diff( o, n ) {\n\t\tvar i,\n\t\t\tns = {},\n\t\t\tos = {};\n\n\t\tfor ( i = 0; i < n.length; i++ ) {\n\t\t\tif ( ns[ n[i] ] == null ) {\n\t\t\t\tns[ n[i] ] = {\n\t\t\t\t\trows: [],\n\t\t\t\t\to: null\n\t\t\t\t};\n\t\t\t}\n\t\t\tns[ n[i] ].rows.push( i );\n\t\t}\n\n\t\tfor ( i = 0; i < o.length; i++ ) {\n\t\t\tif ( os[ o[i] ] == null ) {\n\t\t\t\tos[ o[i] ] = {\n\t\t\t\t\trows: [],\n\t\t\t\t\tn: null\n\t\t\t\t};\n\t\t\t}\n\t\t\tos[ o[i] ].rows.push( i );\n\t\t}\n\n\t\tfor ( i in ns ) {\n\t\t\tif ( !hasOwn.call( ns, i ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ( ns[i].rows.length == 1 && typeof os[i] != \"undefined\" && os[i].rows.length == 1 ) {\n\t\t\t\tn[ ns[i].rows[0] ] = {\n\t\t\t\t\ttext: n[ ns[i].rows[0] ],\n\t\t\t\t\trow: os[i].rows[0]\n\t\t\t\t};\n\t\t\t\to[ os[i].rows[0] ] = {\n\t\t\t\t\ttext: o[ os[i].rows[0] ],\n\t\t\t\t\trow: ns[i].rows[0]\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = 0; i < n.length - 1; i++ ) {\n\t\t\tif ( n[i].text != null && n[ i + 1 ].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null &&\n\t\t\t\t\t\tn[ i + 1 ] == o[ n[i].row + 1 ] ) {\n\n\t\t\t\tn[ i + 1 ] = {\n\t\t\t\t\ttext: n[ i + 1 ],\n\t\t\t\t\trow: n[i].row + 1\n\t\t\t\t};\n\t\t\t\to[ n[i].row + 1 ] = {\n\t\t\t\t\ttext: o[ n[i].row + 1 ],\n\t\t\t\t\trow: i + 1\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = n.length - 1; i > 0; i-- ) {\n\t\t\tif ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null &&\n\t\t\t\t\t\tn[ i - 1 ] == o[ n[i].row - 1 ]) {\n\n\t\t\t\tn[ i - 1 ] = {\n\t\t\t\t\ttext: n[ i - 1 ],\n\t\t\t\t\trow: n[i].row - 1\n\t\t\t\t};\n\t\t\t\to[ n[i].row - 1 ] = {\n\t\t\t\t\ttext: o[ n[i].row - 1 ],\n\t\t\t\t\trow: i - 1\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\to: o,\n\t\t\tn: n\n\t\t};\n\t}\n\n\treturn function( o, n ) {\n\t\to = o.replace( /\\s+$/, \"\" );\n\t\tn = n.replace( /\\s+$/, \"\" );\n\n\t\tvar i, pre,\n\t\t\tstr = \"\",\n\t\t\tout = diff( o === \"\" ? [] : o.split(/\\s+/), n === \"\" ? [] : n.split(/\\s+/) ),\n\t\t\toSpace = o.match(/\\s+/g),\n\t\t\tnSpace = n.match(/\\s+/g);\n\n\t\tif ( oSpace == null ) {\n\t\t\toSpace = [ \" \" ];\n\t\t}\n\t\telse {\n\t\t\toSpace.push( \" \" );\n\t\t}\n\n\t\tif ( nSpace == null ) {\n\t\t\tnSpace = [ \" \" ];\n\t\t}\n\t\telse {\n\t\t\tnSpace.push( \" \" );\n\t\t}\n\n\t\tif ( out.n.length === 0 ) {\n\t\t\tfor ( i = 0; i < out.o.length; i++ ) {\n\t\t\t\tstr += \"<del>\" + out.o[i] + oSpace[i] + \"</del>\";\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif ( out.n[0].text == null ) {\n\t\t\t\tfor ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) {\n\t\t\t\t\tstr += \"<del>\" + out.o[n] + oSpace[n] + \"</del>\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( i = 0; i < out.n.length; i++ ) {\n\t\t\t\tif (out.n[i].text == null) {\n\t\t\t\t\tstr += \"<ins>\" + out.n[i] + nSpace[i] + \"</ins>\";\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// `pre` initialized at top of scope\n\t\t\t\t\tpre = \"\";\n\n\t\t\t\t\tfor ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) {\n\t\t\t\t\t\tpre += \"<del>\" + out.o[n] + oSpace[n] + \"</del>\";\n\t\t\t\t\t}\n\t\t\t\t\tstr += \" \" + out.n[i].text + nSpace[i] + pre;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn str;\n\t};\n}());\n\n// for CommonJS enviroments, export everything\nif ( typeof exports !== \"undefined\" ) {\n\textend(exports, QUnit);\n}\n\n// get at whatever the global object is, like window in browsers\n}( (function() {return this;}.call()) ));\n"
  },
  {
    "path": "examples/testing/qunit/tests.html",
    "content": "<!DOCTYPE html>\n<html>\n    <head>\n        <title>QUnit Testing Example</title>\n        <link rel=\"stylesheet\" href=\"qunit.css\">\n    </head>\n    <body>\n        <div id=\"qunit\"></div>\n        <script src=\"qunit.js\"></script>\n        <script src=\"../../../dist/rx.js\"></script>\n        <script src=\"../../../dist/rx.virtualtime.js\"></script>\n        <script src=\"../../../dist/rx.time.js\"></script>\n        <script src=\"../../../dist/rx.testing.js\"></script>\n        <script src=\"customassertions.js\"></script>\n        <script src=\"tests.js\"></script>\n    </body>\n</html>\n"
  },
  {
    "path": "examples/testing/qunit/tests.js",
    "content": "(function (global) {\n\n  var root = global.Rx,\n      TestScheduler = root.TestScheduler,\n      Observable = root.Observable,\n\n      // Assertions\n      CollectionAssert = root.CollectionAssert,\n\n      // Shortcuts for onNext/onError/onCompleted\n      onNext = root.ReactiveTest.onNext,\n      onError = root.ReactiveTest.onError,\n      onCompleted = root.ReactiveTest.onCompleted,\n      subscribe = root.ReactiveTest.subscribe;\n\n  /* Tests just basic behavior */\n  test('just Basic', function () {\n      var scheduler = new TestScheduler();\n\n      // Returns 42 at one tick after subscribe (200)\n      var results = scheduler.startScheduler(function () {\n          return Observable.just(42, scheduler);\n      });\n\n      // Expect a single onNext with 42 and an oncompleted one tick from subscribe\n      var expectedMessages = [\n          onNext(201, 42),\n          onCompleted(201)\n      ];\n\n      CollectionAssert.assertEqual(expectedMessages, results.messages);\n  });\n\n  /* Tests select method basic behavior */\n  test('map Basic', function () {\n\n      var scheduler = new TestScheduler();\n\n      // Creates a hot observable with two messages after subscribe\n      var xs = scheduler.createHotObservable(\n          onNext(150, 1),\n          onNext(210, 2),\n          onCompleted(220)\n      );\n\n      // Project the hot observable via select without index\n      var results = scheduler.startScheduler(function () {\n          return xs.map(function (x) { return x + x; });\n      });\n\n      // Should get one onNext with 4 and a completed\n      var expectedMessages = [\n          onNext(210, 4),\n          onCompleted(220)\n      ];\n\n      CollectionAssert.assertEqual(expectedMessages, results.messages);\n\n      // Should subscribe at 200 and unsubscribe at 220 at last message\n      var expectedSubscriptions = [\n          subscribe(200, 220)\n      ];\n\n      CollectionAssert.assertEqual(expectedSubscriptions, xs.subscriptions);\n  });\n\n  /* Tests select method basic behavior */\n  test('map Multiple', function () {\n\n    var scheduler = new TestScheduler();\n\n    // Project forward two onNext messages after subscribe and one completed at 220\n    var xs = scheduler.createHotObservable(\n        onNext(150, 1),\n        onNext(210, 2),\n        onNext(215, 3),\n        onCompleted(220)\n    );\n\n    // Project the hot observable via select without index\n    var results = scheduler.startScheduler(function () {\n      return xs.map(function (x) { return x + x; });\n    });\n\n    // Should get one at 210 for 4 and one at 215 for 6 until completed at 220\n    var expectedMessages = [\n      onNext(210, 4),\n      onNext(215, 6),\n      onCompleted(220)\n    ];\n\n    CollectionAssert.assertEqual(expectedMessages, results.messages);\n\n    // Should subscribe at 200 and unsubscribe at 220 at last message\n    var expectedSubscriptions = [\n      subscribe(200, 220)\n    ];\n\n    CollectionAssert.assertEqual(expectedSubscriptions, xs.subscriptions);\n  });\n\n  /* Tests select method empty behavior */\n  test('map Empty', function () {\n\n    var scheduler = new TestScheduler();\n\n    // Project forward one onNext after subscribe and one completed at 220\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(220)\n    );\n\n    // Project the hot observable via select without index\n    var results = scheduler.startScheduler(function () {\n      return xs.map(function (x) { return x + x; });\n    });\n\n    var expectedMessages = [\n      onCompleted(220)\n    ];\n\n    CollectionAssert.assertEqual(expectedMessages, results.messages);\n\n    // Should subscribe at 200 and unsubscribe at 220 at last message\n    var expectedSubscriptions = [\n      subscribe(200, 220)\n    ];\n\n    CollectionAssert.assertEqual(expectedSubscriptions, xs.subscriptions);\n  });\n\n  /* Tests select method never firing behavior */\n  test('map Never', function () {\n    var scheduler = new TestScheduler();\n\n    // Project no messages after subscribe at 200\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    // Project the hot observable via select without index\n    var results = scheduler.startScheduler(function () {\n      return xs.map(function (x) { return x + x; });\n    });\n\n    // Should expect no messages\n    var expectedMessages = [\n    ];\n\n    CollectionAssert.assertEqual(expectedMessages, results.messages);\n\n    // Should subscribe at 200 and unsubscribe at 1000 (infinity)\n    var expectedSubscriptions = [\n      subscribe(200, 1000)\n    ];\n\n    CollectionAssert.assertEqual(expectedSubscriptions, xs.subscriptions);\n  });\n\n  /* Tests select method where the observable throws an exception */\n  test('map Throws', function () {\n      var error = new Error('woops');\n      var scheduler = new TestScheduler();\n\n      // Project forward one onError after subscribe\n      var xs = scheduler.createHotObservable(\n          onNext(150, 1),\n          onError(210, error)\n      );\n\n      var results = scheduler.startScheduler(function () {\n          return xs.map(function (x) { return x + x; });\n      });\n\n      // Should expect only one message with an error at 210\n      var expectedMessages = [\n          onError(210, error)\n      ];\n\n      CollectionAssert.assertEqual(expectedMessages, results.messages);\n\n      // Should subscribe at 200 and unsubscribe at 210 at point of error\n      var expectedSubscriptions = [\n          subscribe(200, 210)\n      ];\n\n      CollectionAssert.assertEqual(expectedSubscriptions, xs.subscriptions);\n  });\n\n  /* Tests select method where the observable throws an exception */\n  test('map Selector Throws', function () {\n      var error = new Error('woops');\n      var scheduler = new TestScheduler();\n\n      // Project forward one onNext after subscribe and one completed at 220\n      var xs = scheduler.createHotObservable(\n          onNext(150, 1),\n          onNext(210, 2)\n      );\n\n      var results = scheduler.startScheduler(function () {\n          return xs.map(function (x) { throw error; });\n      });\n\n      // Should expect only one message with an error at 210\n      var expectedMessages = [\n          onError(210, error)\n      ];\n\n      CollectionAssert.assertEqual(expectedMessages, results.messages);\n\n      // Should subscribe at 200 and unsubscribe at 210 at point of error\n      var expectedSubscriptions = [\n          subscribe(200, 210)\n      ];\n\n      CollectionAssert.assertEqual(expectedSubscriptions, xs.subscriptions);\n  });\n\n  /* Tests select method basic behavior */\n  test('map With Index Basic', function () {\n\n      var scheduler = new TestScheduler();\n\n      // Project forward one onNext after subscribe and one completed at 220\n      var xs = scheduler.createHotObservable(\n          onNext(150, 1),\n          onNext(210, 2),\n          onCompleted(220)\n      );\n\n      var results = scheduler.startScheduler(function () {\n          return xs.map(function (x, i) { return (x + x) * i; });\n      });\n\n      // Should expect one message with 0 and then complettion\n      var expectedMessages = [\n          onNext(210, 0),\n          onCompleted(220)\n      ];\n\n      CollectionAssert.assertEqual(expectedMessages, results.messages);\n\n      // Should subscribe at 200 and unsubscribe at 220 at last message\n      var expectedSubscriptions = [\n          subscribe(200, 220)\n      ];\n\n      CollectionAssert.assertEqual(expectedSubscriptions, xs.subscriptions);\n  });\n\n}(window));\n"
  },
  {
    "path": "examples/testing/readme.md",
    "content": ""
  },
  {
    "path": "examples/timeflies/readme.md",
    "content": ""
  },
  {
    "path": "examples/timeflies/timeflies.css",
    "content": "#container {\n    font-family: Consolas, monospace;\n    overflow: hidden;\n}\n"
  },
  {
    "path": "examples/timeflies/timeflies.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" >\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta charset=\"utf-8\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <title>Rx for JavaScript Rocks!</title>\n  <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap.min.css\">\n  <link rel=\"stylesheet\" href=\"../assets/bootstrap/css/bootstrap-responsive.min.css\">\n    <link rel=\"stylesheet\" href=\"timeflies.css\">\n</head>\n\n<body>\n    <div id=\"textContainer\"></div>\n    <div id=\"container\" class=\"container\">\n        <div class=\"page-header\">\n            <h1>RxJS for jQuery Bindings Time Flies Example</h1>\n            <p class=\"lead\">Example to show effects with delaying each character</p>\n        </div>\n    </div>\n    <script src=\"../../dist/rx.lite.compat.js\"></script>\n    <script src=\"timeflies.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/timeflies/timeflies.js",
    "content": "(function (window, undefined) {\n\n  function getOffset(element) {\n    var doc = element.ownerDocument,\n        docElem = doc.documentElement,\n        body = doc.body,\n        clientTop  = docElem.clientTop  || body.clientTop  || 0,\n        clientLeft = docElem.clientLeft || body.clientLeft || 0,\n        scrollTop  = window.pageYOffset,\n        scrollLeft = window.pageXOffset;\n\n    return { top : scrollTop  - clientTop, left: scrollLeft - clientLeft };\n  }\n\n  function main() {\n\n    var text = 'TIME FLIES LIKE AN ARROW',\n        container = document.querySelector('#container'),\n        mousemove = Rx.Observable.fromEvent(document, 'mousemove');\n\n    // Get the offset on mousemove from the container\n    var mouseMoveOffset = mousemove.map(function (e) {\n      var offset = getOffset(container);\n      return {\n        offsetX : e.clientX - offset.left + document.documentElement.scrollLeft,\n        offsetY : e.clientY - offset.top + document.documentElement.scrollTop\n      };\n    });\n\n    Rx.Observable.from(text).flatMap(\n      function (letter, i) {\n        // Add an element for each letter\n        var s = document.createElement('span');\n        s.innerHTML = letter;\n        s.style.position = 'absolute';\n        container.appendChild(s);\n\n        // move each letter with a delay based upon overall position\n        return mouseMoveOffset.delay(i * 100).map(function (pos) {\n          return { pos: pos, element: s, index: i };\n        });\n      })\n    .subscribe(function (data) {\n      data.element.style.top = data.pos.offsetY + 'px';\n      data.element.style.left = data.pos.offsetX + data.index * 10 + 15 + 'px';\n    });\n  }\n\n  main();\n}(window));\n"
  },
  {
    "path": "examples/videos.md",
    "content": "# RxJS Videos #\n\nBelow are videos either of tutorials or of presentations about RxJS\n\n## Videos ##\n\n- [Practical Rx with Matthew Podwysocki, Bart de Smet and Jafar Husain](http://channel9.msdn.com/posts/Bart-De-Smet-Jafar-Hussain-Matthew-Podwysocki-Pragmatic-Rx)\n- [Netflix and RxJS](http://channel9.msdn.com/posts/Rx-and-Netflix)\n- [Hello RxJS - Channel 9](http://channel9.msdn.com/Blogs/Charles/Introducing-RxJS-Reactive-Extensions-for-JavaScript)\n- [MIX 2011](http://channel9.msdn.com/events/MIX/MIX11/HTM07)\n- [RxJS Today and Tomorrow - Channel 9](http://channel9.msdn.com/Blogs/Charles/Matthew-Podwysocki-and-Bart-J-F-De-Smet-RxJS-Today-and-Tomorrow)\n- [Reactive Extensions Videos on Channel 9](http://channel9.msdn.com/Tags/reactive+extensions)\n- [Asynchronous JavaScript at Netflix - Netflix JavaScript Talks - Jafar Husain](https://www.youtube.com/watch?v=XRYN2xt11Ek)\n- [Asynchronous JavaScript at Netflix - MountainWest JavaScript 2014 - Jafar Husain](https://www.youtube.com/watch?v=XE692Clb5LU)\n- [Asynchronous JavaScript at Netflix - HTML5DevConf - Jafar Husain](https://www.youtube.com/watch?v=5uxSu-F5Kj0)\n- [Adding Even More Fun to Functional Programming With RXJS - Ryan Anklam](https://www.youtube.com/watch?v=8EExNfm0gt4)\n- [Reactive Angular - Devoxx France 2014 - Martin Gontovnikas](http://parleys.com/play/53677646e4b0593229b85841/chapter0/about)\n- [Reactive Game Programming for the Discerning Hipster - JSConf 2014 - Bodil Stokke](https://www.youtube.com/watch?v=x8mmAu7ZR9Y)\n\n## Podcasts ##\n\n- [.NET Rocks #907](http://dotnetrocks.com/default.aspx?showNum=907)\n- [JavaScript Jabber #83](http://javascriptjabber.com/083-jsj-frp-and-rxjs-with-matthew-podwysocki/)\n- [Software Engineering Daily](http://softwareengineeringdaily.com/2016/10/25/reactive-javascript-with-ben-lesh/)\n"
  },
  {
    "path": "examples/worzone/asciigraphic.js",
    "content": "(function (Game) {\n\n  function AsciiGraphic(data, blockSize, wall, position) {\n    wall || (wall = blockSize);\n    position || (position = new Game.Point(0, 0));\n    var width = data[0].length,\n        height = data.length,\n        fullBlock = blockSize + wall;\n\n    function charAt(blockPos) {\n      if (blockPos.y >= height || blockPos.x >= width || blockPos.x < 0 || blockPos.y < 0) { return 'X'; }\n      return data[blockPos.y][blockPos.x];\n    }\n\n    function isChar(blockPos, chars) { return chars.indexOf(charAt(blockPos)) >= 0; }\n\n    function isWall(blockPos) { return isChar(blockPos, '*'); }\n\n    function isFree(blockPos) { return isChar(blockPos, 'C '); }\n\n    function blockCorner(blockPos) {\n      function blockToPixel(block) {\n        var fullBlocks = Math.floor(block / 2);\n        return fullBlocks * fullBlock + ((block % 2 == 1) ? wall : 0);\n      }\n      return Game.Point(blockToPixel(blockPos.x) + position.x, blockToPixel(blockPos.y) + position.y);\n    }\n\n    function blockCenter(blockPos) {\n      return blockCorner(blockPos).add(sizeOf(blockPos).times(.5))\n    }\n\n    function sizeOf(blockPos) {\n      function size(x) { return ( x % 2 == 0) ? wall : blockSize; }\n      return Game.Point(size(blockPos.x), size(blockPos.y));\n    }\n\n    function toBlock(x) {\n      var fullBlocks = Math.floor(x / fullBlock),\n          remainder = x - (fullBlocks * fullBlock),\n          wallToAdd = ((remainder >= wall) ? 1 : 0);\n      return fullBlocks * 2 + wallToAdd;\n    }\n\n    function toBlockX(x) {\n      return toBlock(x - position.x)\n    }\n\n    function toBlockY(y) {\n      return toBlock(y - position.y)\n    }\n\n    function toBlocks(pixelPos) {\n      return Point(toBlockX(pixelPos.x), toBlockY(pixelPos.y))\n    }\n\n    function forEachBlock(fn) {\n      for (var x = 0; x < width; x++) {\n        for (var y = 0; y < height; y++) {\n          var result = fn(Point(x, y));\n          if (result) { return result; }\n        }\n      }\n    }\n\n    function randomBlock() {\n      return Point(randomInt(width), randomInt(height));\n    }\n\n    function render(r) {\n      return renderWith(r, function(block) {\n        if (!isChar(block, ' ')) {\n          return r\n            .text(blockCenter(block).x, blockCenter(block).y, charAt(block))\n            .attr({ fill : '#f00', 'font-family' : 'Courier New, Courier', 'font-size' : blockSize * 1.7});\n        }\n      });\n    }\n\n    function renderWith(r, blockRenderer) {\n      var elements = r.set()\n      forEachBlock(function(block) {\n        var element = blockRenderer(block);\n        element && elements.push(element);\n      })\n      return elements\n    }\n\n    return { isChar : isChar,\n      toBlockX : toBlockX,\n      toBlockY : toBlockY,\n      blockCorner : blockCorner,\n      blockCenter : blockCenter,\n      forEachBlock : forEachBlock,\n      sizeOf : sizeOf,\n      randomBlock : randomBlock,\n      render : render,\n      renderWith : renderWith\n    };\n  }\n\n  Game.AsciiGraphic = AsciiGraphic;\n}(window.Game));\n"
  },
  {
    "path": "examples/worzone/audio.js",
    "content": "(function (Game) {\n  function Audio () {\n    var on = false,\n    sounds = {};\n\n    function loadSound(soundName) {\n      var audioElement = document.createElement('audio');\n      audioElement.setAttribute('src', 'audio/' + soundName + '.ogg');\n      return audioElement;\n    }\n\n    function getSound(soundName) {\n      sounds[soundName] || (sounds[soundName] = loadSound(soundName));\n      return sounds[soundName];\n    }\n\n    function play(soundName) {\n      on && getSound(soundName).play();\n    }\n\n    return {\n      playSound : function(soundName) { return function() { play(soundName) }},\n      toggle : function() { on = !on; }\n    };\n  }\n\n  Game.Audio = Audio;\n}(window.Game));\n"
  },
  {
    "path": "examples/worzone/figureimage.js",
    "content": "(function (Game) {\n  function FigureImage(imgPrefix, animCount, animCycle) {\n    imgPrefix = imgPath + imgPrefix\n    function flip(img, f) {\n      var x = img.attrs.x,\n          y = img.attrs.y;\n      img.scale(f, 1);\n      img.attr({x:x, y:y});\n    }\n    function rotate(img, absoluteRotation) {\n      img.rotate(absoluteRotation, img.attrs.x + img.attrs.width/2, img.attrs.y + img.attrs.height/2);\n    }\n    return {\n      create : function(startPos, radius, r) {\n        return r.image(imgPrefix + \"-left-1.png\", startPos.x - radius, startPos.y - radius, radius * 2, radius * 2)\n      },\n      animate : function(figure, status) {\n        var animationSequence = status\n          .bufferWithCount(animCycle)\n          .scan(1, function(prev) { return prev % animCount + 1; });\n\n        var animation = status.combineLatest(animationSequence, function(status, index) {\n          return { image :  imgPrefix + \"-left-\" + index + \".png\", dir : status.dir }\n        });\n\n        animation.subscribe(function(anim) {\n          if(figure.removed) { return; }\n          figure.attr({src : anim.image})\n          if(anim.dir == left) {\n            // when facing left, use the pic as is\n            flip(figure, 1)\n            rotate(figure, 0)\n          } else {\n            // when facing any other way, flip the pic and then rotate it\n            flip(figure, -1)\n            rotate(figure, anim.dir.getAngleDeg())\n          }\n        })\n      }\n    }\n  }\n\n  Game.FigureImage = FigureImage;\n}(window.Game));"
  },
  {
    "path": "examples/worzone/index.css",
    "content": "body { font-family : Courier; background: #000; color: #0f0; }\nli { list-style:none;}\nul { padding:0;}\n#sidebar { position:absolute; left:520px; top:20px; padding : 10px;}\n"
  },
  {
    "path": "examples/worzone/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" >\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <meta charset=\"utf-8\">\n  <meta name=\"description\" content=\"Worzone written in RxJS\">\n  <meta name=\"author\" content=\"Rx Team\">\n  <title>Worzone</title>\n  <link rel=\"stylesheet\" href=\"index.css\">\n</head>\n<body>\n  <div id=\"sidebar\">\n    <div id=\"instructions\">\n      <p>Left: a,s,d,w,f</p>\n      <p>Right: arrow keys, -</p>\n    </div>\n    <div id=\"controls\">\n      <label for=\"sound\">sound</label>\n      <input type=\"checkbox\" value=\"sound\" id=\"sound\"/>\n    </div>\n  </div>\n  <script src=\"lib/raphael-min.js\"></script>\n  <script src=\"../../dist/rx.lite.js\"></script>\n  <script src=\"rx.dom.lite.js\"></script>\n  <script src=\"vector.js\"></script>\n  <script src=\"asciigraphic.js\"></script>\n  <script src=\"audio.js\"></script>\n  <script src=\"figureimage.js\"></script>\n  <script src=\"keyboard.js\"></script>\n  <script src=\"maze.js\"></script>\n  <script src=\"rectangle.js\"></script>\n  <script src=\"index.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "examples/worzone/index.js",
    "content": "// Originally from https://github.com/raimohanska/worzone\n\n;(function (Game, undefined) {\n\n  dom.ready().subscribe(function () {\n    var bounds = Game.Rectangle(0, 0, 500, 450)\n    var r = Raphael(20, 20, bounds.width, bounds.height);\n\n    var audio = Game.Audio();\n\n    dom.click(document.querySelector('#sound'))\n      .subscribeOnNext(function () { audio.toggle(); });\n  });\n\n}(window.Game));\n"
  },
  {
    "path": "examples/worzone/keyboard.js",
    "content": "(function (Game) {\n  var Observable = Rx.Observable;\n\n  function Keyboard() {\n    var allKeyUps = dom.keyup(document),\n        allKeyDowns = dom.keydown(document);\n\n    function keyCodeIs(keyCode) {\n      return function(event) { return event.keyCode === keyCode; };\n    }\n\n    function keyCodeIsOneOf(keyCodes) {\n      return function(event) { return keyCodes.indexOf(event.keyCode) >= 0; };\n    }\n\n    function keyUps(keyCode) {\n      return allKeyUps.filter(keyCodeIs(keyCode));\n    }\n\n    function keyDowns(keyCodes) {\n      return allKeyDowns.filter(keyCodeIsOneOf(toArray(keyCodes)));\n    }\n\n    function keyState(keyCode, value) {\n      return keyDowns(keyCode)\n        .map([value])\n        .merge(keyUps(keyCode).map([]))\n        .shareValue([])\n        .distinctUntilChanged();\n    }\n\n    function multiKeyState(keyMap) {\n      var streams = keyMap.map(function(pair) { return keyState(pair[0], pair[1]); });\n      return Observable.zipArray(streams);\n    }\n\n    return {\n      multiKeyState : multiKeyState,\n      keyDowns : keyDowns,\n      anyKey : allKeyDowns\n    };\n  }\n\n  Game.Keyboard = Keyboard;\n}(window.Game));\n"
  },
  {
    "path": "examples/worzone/lib/raphael-min.js",
    "content": "// ┌────────────────────────────────────────────────────────────────────┐ \\\\\n// │ Raphaël 2.1.2 - JavaScript Vector Library                          │ \\\\\n// ├────────────────────────────────────────────────────────────────────┤ \\\\\n// │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com)    │ \\\\\n// │ Copyright © 2008-2012 Sencha Labs (http://sencha.com)              │ \\\\\n// ├────────────────────────────────────────────────────────────────────┤ \\\\\n// │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\\\\n// └────────────────────────────────────────────────────────────────────┘ \\\\\n!function(a){var b,c,d=\"0.4.2\",e=\"hasOwnProperty\",f=/[\\.\\/]/,g=\"*\",h=function(){},i=function(a,b){return a-b},j={n:{}},k=function(a,d){a=String(a);var e,f=c,g=Array.prototype.slice.call(arguments,2),h=k.listeners(a),j=0,l=[],m={},n=[],o=b;b=a,c=0;for(var p=0,q=h.length;q>p;p++)\"zIndex\"in h[p]&&(l.push(h[p].zIndex),h[p].zIndex<0&&(m[h[p].zIndex]=h[p]));for(l.sort(i);l[j]<0;)if(e=m[l[j++]],n.push(e.apply(d,g)),c)return c=f,n;for(p=0;q>p;p++)if(e=h[p],\"zIndex\"in e)if(e.zIndex==l[j]){if(n.push(e.apply(d,g)),c)break;do if(j++,e=m[l[j]],e&&n.push(e.apply(d,g)),c)break;while(e)}else m[e.zIndex]=e;else if(n.push(e.apply(d,g)),c)break;return c=f,b=o,n.length?n:null};k._events=j,k.listeners=function(a){var b,c,d,e,h,i,k,l,m=a.split(f),n=j,o=[n],p=[];for(e=0,h=m.length;h>e;e++){for(l=[],i=0,k=o.length;k>i;i++)for(n=o[i].n,c=[n[m[e]],n[g]],d=2;d--;)b=c[d],b&&(l.push(b),p=p.concat(b.f||[]));o=l}return p},k.on=function(a,b){if(a=String(a),\"function\"!=typeof b)return function(){};for(var c=a.split(f),d=j,e=0,g=c.length;g>e;e++)d=d.n,d=d.hasOwnProperty(c[e])&&d[c[e]]||(d[c[e]]={n:{}});for(d.f=d.f||[],e=0,g=d.f.length;g>e;e++)if(d.f[e]==b)return h;return d.f.push(b),function(a){+a==+a&&(b.zIndex=+a)}},k.f=function(a){var b=[].slice.call(arguments,1);return function(){k.apply(null,[a,null].concat(b).concat([].slice.call(arguments,0)))}},k.stop=function(){c=1},k.nt=function(a){return a?new RegExp(\"(?:\\\\.|\\\\/|^)\"+a+\"(?:\\\\.|\\\\/|$)\").test(b):b},k.nts=function(){return b.split(f)},k.off=k.unbind=function(a,b){if(!a)return void(k._events=j={n:{}});var c,d,h,i,l,m,n,o=a.split(f),p=[j];for(i=0,l=o.length;l>i;i++)for(m=0;m<p.length;m+=h.length-2){if(h=[m,1],c=p[m].n,o[i]!=g)c[o[i]]&&h.push(c[o[i]]);else for(d in c)c[e](d)&&h.push(c[d]);p.splice.apply(p,h)}for(i=0,l=p.length;l>i;i++)for(c=p[i];c.n;){if(b){if(c.f){for(m=0,n=c.f.length;n>m;m++)if(c.f[m]==b){c.f.splice(m,1);break}!c.f.length&&delete c.f}for(d in c.n)if(c.n[e](d)&&c.n[d].f){var q=c.n[d].f;for(m=0,n=q.length;n>m;m++)if(q[m]==b){q.splice(m,1);break}!q.length&&delete c.n[d].f}}else{delete c.f;for(d in c.n)c.n[e](d)&&c.n[d].f&&delete c.n[d].f}c=c.n}},k.once=function(a,b){var c=function(){return k.unbind(a,c),b.apply(this,arguments)};return k.on(a,c)},k.version=d,k.toString=function(){return\"You are running Eve \"+d},\"undefined\"!=typeof module&&module.exports?module.exports=k:\"undefined\"!=typeof define?define(\"eve\",[],function(){return k}):a.eve=k}(window||this),function(a,b){\"function\"==typeof define&&define.amd?define([\"eve\"],function(c){return b(a,c)}):b(a,a.eve)}(this,function(a,b){function c(a){if(c.is(a,\"function\"))return u?a():b.on(\"raphael.DOMload\",a);if(c.is(a,V))return c._engine.create[D](c,a.splice(0,3+c.is(a[0],T))).add(a);var d=Array.prototype.slice.call(arguments,0);if(c.is(d[d.length-1],\"function\")){var e=d.pop();return u?e.call(c._engine.create[D](c,d)):b.on(\"raphael.DOMload\",function(){e.call(c._engine.create[D](c,d))})}return c._engine.create[D](c,arguments)}function d(a){if(\"function\"==typeof a||Object(a)!==a)return a;var b=new a.constructor;for(var c in a)a[z](c)&&(b[c]=d(a[c]));return b}function e(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function f(a,b,c){function d(){var f=Array.prototype.slice.call(arguments,0),g=f.join(\"␀\"),h=d.cache=d.cache||{},i=d.count=d.count||[];return h[z](g)?(e(i,g),c?c(h[g]):h[g]):(i.length>=1e3&&delete h[i.shift()],i.push(g),h[g]=a[D](b,f),c?c(h[g]):h[g])}return d}function g(){return this.hex}function h(a,b){for(var c=[],d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push([\"C\",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}function i(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function j(a,b,c,d,e,f,g,h,j){null==j&&(j=1),j=j>1?1:0>j?0:j;for(var k=j/2,l=12,m=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],n=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],o=0,p=0;l>p;p++){var q=k*m[p]+k,r=i(q,a,c,e,g),s=i(q,b,d,f,h),t=r*r+s*s;o+=n[p]*N.sqrt(t)}return k*o}function k(a,b,c,d,e,f,g,h,i){if(!(0>i||j(a,b,c,d,e,f,g,h)<i)){var k,l=1,m=l/2,n=l-m,o=.01;for(k=j(a,b,c,d,e,f,g,h,n);Q(k-i)>o;)m/=2,n+=(i>k?1:-1)*m,k=j(a,b,c,d,e,f,g,h,n);return n}}function l(a,b,c,d,e,f,g,h){if(!(O(a,c)<P(e,g)||P(a,c)>O(e,g)||O(b,d)<P(f,h)||P(b,d)>O(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(k){var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(!(n<+P(a,c).toFixed(2)||n>+O(a,c).toFixed(2)||n<+P(e,g).toFixed(2)||n>+O(e,g).toFixed(2)||o<+P(b,d).toFixed(2)||o>+O(b,d).toFixed(2)||o<+P(f,h).toFixed(2)||o>+O(f,h).toFixed(2)))return{x:l,y:m}}}}function m(a,b,d){var e=c.bezierBBox(a),f=c.bezierBBox(b);if(!c.isBBoxIntersect(e,f))return d?0:[];for(var g=j.apply(0,a),h=j.apply(0,b),i=O(~~(g/5),1),k=O(~~(h/5),1),m=[],n=[],o={},p=d?0:[],q=0;i+1>q;q++){var r=c.findDotsAtSegment.apply(c,a.concat(q/i));m.push({x:r.x,y:r.y,t:q/i})}for(q=0;k+1>q;q++)r=c.findDotsAtSegment.apply(c,b.concat(q/k)),n.push({x:r.x,y:r.y,t:q/k});for(q=0;i>q;q++)for(var s=0;k>s;s++){var t=m[q],u=m[q+1],v=n[s],w=n[s+1],x=Q(u.x-t.x)<.001?\"y\":\"x\",y=Q(w.x-v.x)<.001?\"y\":\"x\",z=l(t.x,t.y,u.x,u.y,v.x,v.y,w.x,w.y);if(z){if(o[z.x.toFixed(4)]==z.y.toFixed(4))continue;o[z.x.toFixed(4)]=z.y.toFixed(4);var A=t.t+Q((z[x]-t[x])/(u[x]-t[x]))*(u.t-t.t),B=v.t+Q((z[y]-v[y])/(w[y]-v[y]))*(w.t-v.t);A>=0&&1.001>=A&&B>=0&&1.001>=B&&(d?p++:p.push({x:z.x,y:z.y,t1:P(A,1),t2:P(B,1)}))}}return p}function n(a,b,d){a=c._path2curve(a),b=c._path2curve(b);for(var e,f,g,h,i,j,k,l,n,o,p=d?0:[],q=0,r=a.length;r>q;q++){var s=a[q];if(\"M\"==s[0])e=i=s[1],f=j=s[2];else{\"C\"==s[0]?(n=[e,f].concat(s.slice(1)),e=n[6],f=n[7]):(n=[e,f,e,f,i,j,i,j],e=i,f=j);for(var t=0,u=b.length;u>t;t++){var v=b[t];if(\"M\"==v[0])g=k=v[1],h=l=v[2];else{\"C\"==v[0]?(o=[g,h].concat(v.slice(1)),g=o[6],h=o[7]):(o=[g,h,g,h,k,l,k,l],g=k,h=l);var w=m(n,o,d);if(d)p+=w;else{for(var x=0,y=w.length;y>x;x++)w[x].segment1=q,w[x].segment2=t,w[x].bez1=n,w[x].bez2=o;p=p.concat(w)}}}}}return p}function o(a,b,c,d,e,f){null!=a?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function p(){return this.x+H+this.y+H+this.width+\" × \"+this.height}function q(a,b,c,d,e,f){function g(a){return((l*a+k)*a+j)*a}function h(a,b){var c=i(a,b);return((o*c+n)*c+m)*c}function i(a,b){var c,d,e,f,h,i;for(e=a,i=0;8>i;i++){if(f=g(e)-a,Q(f)<b)return e;if(h=(3*l*e+2*k)*e+j,Q(h)<1e-6)break;e-=f/h}if(c=0,d=1,e=a,c>e)return c;if(e>d)return d;for(;d>c;){if(f=g(e),Q(f-a)<b)return e;a>f?c=e:d=e,e=(d-c)/2+c}return e}var j=3*b,k=3*(d-b)-j,l=1-j-k,m=3*c,n=3*(e-c)-m,o=1-m-n;return h(a,1/(200*f))}function r(a,b){var c=[],d={};if(this.ms=b,this.times=1,a){for(var e in a)a[z](e)&&(d[_(e)]=a[e],c.push(_(e)));c.sort(lb)}this.anim=d,this.top=c[c.length-1],this.percents=c}function s(a,d,e,f,g,h){e=_(e);var i,j,k,l,m,n,p=a.ms,r={},s={},t={};if(f)for(v=0,x=ic.length;x>v;v++){var u=ic[v];if(u.el.id==d.id&&u.anim==a){u.percent!=e?(ic.splice(v,1),k=1):j=u,d.attr(u.totalOrigin);break}}else f=+s;for(var v=0,x=a.percents.length;x>v;v++){if(a.percents[v]==e||a.percents[v]>f*a.top){e=a.percents[v],m=a.percents[v-1]||0,p=p/a.top*(e-m),l=a.percents[v+1],i=a.anim[e];break}f&&d.attr(a.anim[a.percents[v]])}if(i){if(j)j.initstatus=f,j.start=new Date-j.ms*f;else{for(var y in i)if(i[z](y)&&(db[z](y)||d.paper.customAttributes[z](y)))switch(r[y]=d.attr(y),null==r[y]&&(r[y]=cb[y]),s[y]=i[y],db[y]){case T:t[y]=(s[y]-r[y])/p;break;case\"colour\":r[y]=c.getRGB(r[y]);var A=c.getRGB(s[y]);t[y]={r:(A.r-r[y].r)/p,g:(A.g-r[y].g)/p,b:(A.b-r[y].b)/p};break;case\"path\":var B=Kb(r[y],s[y]),C=B[1];for(r[y]=B[0],t[y]=[],v=0,x=r[y].length;x>v;v++){t[y][v]=[0];for(var D=1,F=r[y][v].length;F>D;D++)t[y][v][D]=(C[v][D]-r[y][v][D])/p}break;case\"transform\":var G=d._,H=Pb(G[y],s[y]);if(H)for(r[y]=H.from,s[y]=H.to,t[y]=[],t[y].real=!0,v=0,x=r[y].length;x>v;v++)for(t[y][v]=[r[y][v][0]],D=1,F=r[y][v].length;F>D;D++)t[y][v][D]=(s[y][v][D]-r[y][v][D])/p;else{var K=d.matrix||new o,L={_:{transform:G.transform},getBBox:function(){return d.getBBox(1)}};r[y]=[K.a,K.b,K.c,K.d,K.e,K.f],Nb(L,s[y]),s[y]=L._.transform,t[y]=[(L.matrix.a-K.a)/p,(L.matrix.b-K.b)/p,(L.matrix.c-K.c)/p,(L.matrix.d-K.d)/p,(L.matrix.e-K.e)/p,(L.matrix.f-K.f)/p]}break;case\"csv\":var M=I(i[y])[J](w),N=I(r[y])[J](w);if(\"clip-rect\"==y)for(r[y]=N,t[y]=[],v=N.length;v--;)t[y][v]=(M[v]-r[y][v])/p;s[y]=M;break;default:for(M=[][E](i[y]),N=[][E](r[y]),t[y]=[],v=d.paper.customAttributes[y].length;v--;)t[y][v]=((M[v]||0)-(N[v]||0))/p}var O=i.easing,P=c.easing_formulas[O];if(!P)if(P=I(O).match(Z),P&&5==P.length){var Q=P;P=function(a){return q(a,+Q[1],+Q[2],+Q[3],+Q[4],p)}}else P=nb;if(n=i.start||a.start||+new Date,u={anim:a,percent:e,timestamp:n,start:n+(a.del||0),status:0,initstatus:f||0,stop:!1,ms:p,easing:P,from:r,diff:t,to:s,el:d,callback:i.callback,prev:m,next:l,repeat:h||a.times,origin:d.attr(),totalOrigin:g},ic.push(u),f&&!j&&!k&&(u.stop=!0,u.start=new Date-p*f,1==ic.length))return kc();k&&(u.start=new Date-u.ms*f),1==ic.length&&jc(kc)}b(\"raphael.anim.start.\"+d.id,d,a)}}function t(a){for(var b=0;b<ic.length;b++)ic[b].el.paper==a&&ic.splice(b--,1)}c.version=\"2.1.2\",c.eve=b;var u,v,w=/[, ]+/,x={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},y=/\\{(\\d+)\\}/g,z=\"hasOwnProperty\",A={doc:document,win:a},B={was:Object.prototype[z].call(A.win,\"Raphael\"),is:A.win.Raphael},C=function(){this.ca=this.customAttributes={}},D=\"apply\",E=\"concat\",F=\"ontouchstart\"in A.win||A.win.DocumentTouch&&A.doc instanceof DocumentTouch,G=\"\",H=\" \",I=String,J=\"split\",K=\"click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel\"[J](H),L={mousedown:\"touchstart\",mousemove:\"touchmove\",mouseup:\"touchend\"},M=I.prototype.toLowerCase,N=Math,O=N.max,P=N.min,Q=N.abs,R=N.pow,S=N.PI,T=\"number\",U=\"string\",V=\"array\",W=Object.prototype.toString,X=(c._ISURL=/^url\\(['\"]?([^\\)]+?)['\"]?\\)$/i,/^\\s*((#[a-f\\d]{6})|(#[a-f\\d]{3})|rgba?\\(\\s*([\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?(?:\\s*,\\s*[\\d\\.]+%?)?)\\s*\\)|hsba?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?)%?\\s*\\)|hsla?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?)%?\\s*\\))\\s*$/i),Y={NaN:1,Infinity:1,\"-Infinity\":1},Z=/^(?:cubic-)?bezier\\(([^,]+),([^,]+),([^,]+),([^\\)]+)\\)/,$=N.round,_=parseFloat,ab=parseInt,bb=I.prototype.toUpperCase,cb=c._availableAttrs={\"arrow-end\":\"none\",\"arrow-start\":\"none\",blur:0,\"clip-rect\":\"0 0 1e9 1e9\",cursor:\"default\",cx:0,cy:0,fill:\"#fff\",\"fill-opacity\":1,font:'10px \"Arial\"',\"font-family\":'\"Arial\"',\"font-size\":\"10\",\"font-style\":\"normal\",\"font-weight\":400,gradient:0,height:0,href:\"http://raphaeljs.com/\",\"letter-spacing\":0,opacity:1,path:\"M0,0\",r:0,rx:0,ry:0,src:\"\",stroke:\"#000\",\"stroke-dasharray\":\"\",\"stroke-linecap\":\"butt\",\"stroke-linejoin\":\"butt\",\"stroke-miterlimit\":0,\"stroke-opacity\":1,\"stroke-width\":1,target:\"_blank\",\"text-anchor\":\"middle\",title:\"Raphael\",transform:\"\",width:0,x:0,y:0},db=c._availableAnimAttrs={blur:T,\"clip-rect\":\"csv\",cx:T,cy:T,fill:\"colour\",\"fill-opacity\":T,\"font-size\":T,height:T,opacity:T,path:\"path\",r:T,rx:T,ry:T,stroke:\"colour\",\"stroke-opacity\":T,\"stroke-width\":T,transform:\"transform\",width:T,x:T,y:T},eb=/[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*/,fb={hs:1,rg:1},gb=/,?([achlmqrstvxz]),?/gi,hb=/([achlmrqstvz])[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*)+)/gi,ib=/([rstm])[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*)+)/gi,jb=/(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*/gi,kb=(c._radial_gradient=/^r(?:\\(([^,]+?)[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*([^\\)]+?)\\))?/,{}),lb=function(a,b){return _(a)-_(b)},mb=function(){},nb=function(a){return a},ob=c._rectPath=function(a,b,c,d,e){return e?[[\"M\",a+e,b],[\"l\",c-2*e,0],[\"a\",e,e,0,0,1,e,e],[\"l\",0,d-2*e],[\"a\",e,e,0,0,1,-e,e],[\"l\",2*e-c,0],[\"a\",e,e,0,0,1,-e,-e],[\"l\",0,2*e-d],[\"a\",e,e,0,0,1,e,-e],[\"z\"]]:[[\"M\",a,b],[\"l\",c,0],[\"l\",0,d],[\"l\",-c,0],[\"z\"]]},pb=function(a,b,c,d){return null==d&&(d=c),[[\"M\",a,b],[\"m\",0,-d],[\"a\",c,d,0,1,1,0,2*d],[\"a\",c,d,0,1,1,0,-2*d],[\"z\"]]},qb=c._getPath={path:function(a){return a.attr(\"path\")},circle:function(a){var b=a.attrs;return pb(b.cx,b.cy,b.r)},ellipse:function(a){var b=a.attrs;return pb(b.cx,b.cy,b.rx,b.ry)},rect:function(a){var b=a.attrs;return ob(b.x,b.y,b.width,b.height,b.r)},image:function(a){var b=a.attrs;return ob(b.x,b.y,b.width,b.height)},text:function(a){var b=a._getBBox();return ob(b.x,b.y,b.width,b.height)},set:function(a){var b=a._getBBox();return ob(b.x,b.y,b.width,b.height)}},rb=c.mapPath=function(a,b){if(!b)return a;var c,d,e,f,g,h,i;for(a=Kb(a),e=0,g=a.length;g>e;e++)for(i=a[e],f=1,h=i.length;h>f;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d;return a};if(c._g=A,c.type=A.win.SVGAngle||A.doc.implementation.hasFeature(\"http://www.w3.org/TR/SVG11/feature#BasicStructure\",\"1.1\")?\"SVG\":\"VML\",\"VML\"==c.type){var sb,tb=A.doc.createElement(\"div\");if(tb.innerHTML='<v:shape adj=\"1\"/>',sb=tb.firstChild,sb.style.behavior=\"url(#default#VML)\",!sb||\"object\"!=typeof sb.adj)return c.type=G;tb=null}c.svg=!(c.vml=\"VML\"==c.type),c._Paper=C,c.fn=v=C.prototype=c.prototype,c._id=0,c._oid=0,c.is=function(a,b){return b=M.call(b),\"finite\"==b?!Y[z](+a):\"array\"==b?a instanceof Array:\"null\"==b&&null===a||b==typeof a&&null!==a||\"object\"==b&&a===Object(a)||\"array\"==b&&Array.isArray&&Array.isArray(a)||W.call(a).slice(8,-1).toLowerCase()==b},c.angle=function(a,b,d,e,f,g){if(null==f){var h=a-d,i=b-e;return h||i?(180+180*N.atan2(-i,-h)/S+360)%360:0}return c.angle(a,b,f,g)-c.angle(d,e,f,g)},c.rad=function(a){return a%360*S/180},c.deg=function(a){return 180*a/S%360},c.snapTo=function(a,b,d){if(d=c.is(d,\"finite\")?d:10,c.is(a,V)){for(var e=a.length;e--;)if(Q(a[e]-b)<=d)return a[e]}else{a=+a;var f=b%a;if(d>f)return b-f;if(f>a-d)return b-f+a}return b};c.createUUID=function(a,b){return function(){return\"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=16*N.random()|0,c=\"x\"==a?b:3&b|8;return c.toString(16)});c.setWindow=function(a){b(\"raphael.setWindow\",c,A.win,a),A.win=a,A.doc=A.win.document,c._engine.initWin&&c._engine.initWin(A.win)};var ub=function(a){if(c.vml){var b,d=/^\\s+|\\s+$/g;try{var e=new ActiveXObject(\"htmlfile\");e.write(\"<body>\"),e.close(),b=e.body}catch(g){b=createPopup().document.body}var h=b.createTextRange();ub=f(function(a){try{b.style.color=I(a).replace(d,G);var c=h.queryCommandValue(\"ForeColor\");return c=(255&c)<<16|65280&c|(16711680&c)>>>16,\"#\"+(\"000000\"+c.toString(16)).slice(-6)}catch(e){return\"none\"}})}else{var i=A.doc.createElement(\"i\");i.title=\"Raphaël Colour Picker\",i.style.display=\"none\",A.doc.body.appendChild(i),ub=f(function(a){return i.style.color=a,A.doc.defaultView.getComputedStyle(i,G).getPropertyValue(\"color\")})}return ub(a)},vb=function(){return\"hsb(\"+[this.h,this.s,this.b]+\")\"},wb=function(){return\"hsl(\"+[this.h,this.s,this.l]+\")\"},xb=function(){return this.hex},yb=function(a,b,d){if(null==b&&c.is(a,\"object\")&&\"r\"in a&&\"g\"in a&&\"b\"in a&&(d=a.b,b=a.g,a=a.r),null==b&&c.is(a,U)){var e=c.getRGB(a);a=e.r,b=e.g,d=e.b}return(a>1||b>1||d>1)&&(a/=255,b/=255,d/=255),[a,b,d]},zb=function(a,b,d,e){a*=255,b*=255,d*=255;var f={r:a,g:b,b:d,hex:c.rgb(a,b,d),toString:xb};return c.is(e,\"finite\")&&(f.opacity=e),f};c.color=function(a){var b;return c.is(a,\"object\")&&\"h\"in a&&\"s\"in a&&\"b\"in a?(b=c.hsb2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.hex=b.hex):c.is(a,\"object\")&&\"h\"in a&&\"s\"in a&&\"l\"in a?(b=c.hsl2rgb(a),a.r=b.r,a.g=b.g,a.b=b.b,a.hex=b.hex):(c.is(a,\"string\")&&(a=c.getRGB(a)),c.is(a,\"object\")&&\"r\"in a&&\"g\"in a&&\"b\"in a?(b=c.rgb2hsl(a),a.h=b.h,a.s=b.s,a.l=b.l,b=c.rgb2hsb(a),a.v=b.b):(a={hex:\"none\"},a.r=a.g=a.b=a.h=a.s=a.v=a.l=-1)),a.toString=xb,a},c.hsb2rgb=function(a,b,c,d){this.is(a,\"object\")&&\"h\"in a&&\"s\"in a&&\"b\"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;return a=a%360/60,i=c*b,h=i*(1-Q(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],zb(e,f,g,d)},c.hsl2rgb=function(a,b,c,d){this.is(a,\"object\")&&\"h\"in a&&\"s\"in a&&\"l\"in a&&(c=a.l,b=a.s,a=a.h),(a>1||b>1||c>1)&&(a/=360,b/=100,c/=100),a*=360;var e,f,g,h,i;return a=a%360/60,i=2*b*(.5>c?c:1-c),h=i*(1-Q(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],zb(e,f,g,d)},c.rgb2hsb=function(a,b,c){c=yb(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;return f=O(a,b,c),g=f-P(a,b,c),d=0==g?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=0==g?0:g/f,{h:d,s:e,b:f,toString:vb}},c.rgb2hsl=function(a,b,c){c=yb(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;return g=O(a,b,c),h=P(a,b,c),i=g-h,d=0==i?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=0==i?0:.5>f?i/(2*f):i/(2-2*f),{h:d,s:e,l:f,toString:wb}},c._path2string=function(){return this.join(\",\").replace(gb,\"$1\")};c._preload=function(a,b){var c=A.doc.createElement(\"img\");c.style.cssText=\"position:absolute;left:-9999em;top:-9999em\",c.onload=function(){b.call(this),this.onload=null,A.doc.body.removeChild(this)},c.onerror=function(){A.doc.body.removeChild(this)},A.doc.body.appendChild(c),c.src=a};c.getRGB=f(function(a){if(!a||(a=I(a)).indexOf(\"-\")+1)return{r:-1,g:-1,b:-1,hex:\"none\",error:1,toString:g};if(\"none\"==a)return{r:-1,g:-1,b:-1,hex:\"none\",toString:g};!(fb[z](a.toLowerCase().substring(0,2))||\"#\"==a.charAt())&&(a=ub(a));var b,d,e,f,h,i,j=a.match(X);return j?(j[2]&&(e=ab(j[2].substring(5),16),d=ab(j[2].substring(3,5),16),b=ab(j[2].substring(1,3),16)),j[3]&&(e=ab((h=j[3].charAt(3))+h,16),d=ab((h=j[3].charAt(2))+h,16),b=ab((h=j[3].charAt(1))+h,16)),j[4]&&(i=j[4][J](eb),b=_(i[0]),\"%\"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),\"%\"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),\"%\"==i[2].slice(-1)&&(e*=2.55),\"rgba\"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&\"%\"==i[3].slice(-1)&&(f/=100)),j[5]?(i=j[5][J](eb),b=_(i[0]),\"%\"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),\"%\"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),\"%\"==i[2].slice(-1)&&(e*=2.55),(\"deg\"==i[0].slice(-3)||\"°\"==i[0].slice(-1))&&(b/=360),\"hsba\"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&\"%\"==i[3].slice(-1)&&(f/=100),c.hsb2rgb(b,d,e,f)):j[6]?(i=j[6][J](eb),b=_(i[0]),\"%\"==i[0].slice(-1)&&(b*=2.55),d=_(i[1]),\"%\"==i[1].slice(-1)&&(d*=2.55),e=_(i[2]),\"%\"==i[2].slice(-1)&&(e*=2.55),(\"deg\"==i[0].slice(-3)||\"°\"==i[0].slice(-1))&&(b/=360),\"hsla\"==j[1].toLowerCase().slice(0,4)&&(f=_(i[3])),i[3]&&\"%\"==i[3].slice(-1)&&(f/=100),c.hsl2rgb(b,d,e,f)):(j={r:b,g:d,b:e,toString:g},j.hex=\"#\"+(16777216|e|d<<8|b<<16).toString(16).slice(1),c.is(f,\"finite\")&&(j.opacity=f),j)):{r:-1,g:-1,b:-1,hex:\"none\",error:1,toString:g}},c),c.hsb=f(function(a,b,d){return c.hsb2rgb(a,b,d).hex}),c.hsl=f(function(a,b,d){return c.hsl2rgb(a,b,d).hex}),c.rgb=f(function(a,b,c){return\"#\"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),c.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);return b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b})),c.hex},c.getColor.reset=function(){delete this.start},c.parsePathString=function(a){if(!a)return null;var b=Ab(a);if(b.arr)return Cb(b.arr);var d={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},e=[];return c.is(a,V)&&c.is(a[0],V)&&(e=Cb(a)),e.length||I(a).replace(hb,function(a,b,c){var f=[],g=b.toLowerCase();if(c.replace(jb,function(a,b){b&&f.push(+b)}),\"m\"==g&&f.length>2&&(e.push([b][E](f.splice(0,2))),g=\"l\",b=\"m\"==b?\"l\":\"L\"),\"r\"==g)e.push([b][E](f));else for(;f.length>=d[g]&&(e.push([b][E](f.splice(0,d[g]))),d[g]););}),e.toString=c._path2string,b.arr=Cb(e),e},c.parseTransformString=f(function(a){if(!a)return null;var b=[];return c.is(a,V)&&c.is(a[0],V)&&(b=Cb(a)),b.length||I(a).replace(ib,function(a,c,d){{var e=[];M.call(c)}d.replace(jb,function(a,b){b&&e.push(+b)}),b.push([c][E](e))}),b.toString=c._path2string,b});var Ab=function(a){var b=Ab.ps=Ab.ps||{};return b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[z](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])}),b[a]};c.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=R(j,3),l=R(j,2),m=i*i,n=m*i,o=k*a+3*l*i*c+3*j*i*i*e+n*g,p=k*b+3*l*i*d+3*j*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,w=j*e+i*g,x=j*f+i*h,y=90-180*N.atan2(q-s,r-t)/S;return(q>s||t>r)&&(y+=180),{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:w,y:x},alpha:y}},c.bezierBBox=function(a,b,d,e,f,g,h,i){c.is(a,\"array\")||(a=[a,b,d,e,f,g,h,i]);var j=Jb.apply(null,a);return{x:j.min.x,y:j.min.y,x2:j.max.x,y2:j.max.y,width:j.max.x-j.min.x,height:j.max.y-j.min.y}},c.isPointInsideBBox=function(a,b,c){return b>=a.x&&b<=a.x2&&c>=a.y&&c<=a.y2},c.isBBoxIntersect=function(a,b){var d=c.isPointInsideBBox;return d(b,a.x,a.y)||d(b,a.x2,a.y)||d(b,a.x,a.y2)||d(b,a.x2,a.y2)||d(a,b.x,b.y)||d(a,b.x2,b.y)||d(a,b.x,b.y2)||d(a,b.x2,b.y2)||(a.x<b.x2&&a.x>b.x||b.x<a.x2&&b.x>a.x)&&(a.y<b.y2&&a.y>b.y||b.y<a.y2&&b.y>a.y)},c.pathIntersection=function(a,b){return n(a,b)},c.pathIntersectionNumber=function(a,b){return n(a,b,1)},c.isPointInsidePath=function(a,b,d){var e=c.pathBBox(a);return c.isPointInsideBBox(e,b,d)&&n(a,[[\"M\",b,d],[\"H\",e.x2+10]],1)%2==1},c._removedFactory=function(a){return function(){b(\"raphael.log\",null,\"Raphaël: you are calling to method “\"+a+\"” of removed object\",a)}};var Bb=c.pathBBox=function(a){var b=Ab(a);if(b.bbox)return d(b.bbox);if(!a)return{x:0,y:0,width:0,height:0,x2:0,y2:0};a=Kb(a);for(var c,e=0,f=0,g=[],h=[],i=0,j=a.length;j>i;i++)if(c=a[i],\"M\"==c[0])e=c[1],f=c[2],g.push(e),h.push(f);else{var k=Jb(e,f,c[1],c[2],c[3],c[4],c[5],c[6]);g=g[E](k.min.x,k.max.x),h=h[E](k.min.y,k.max.y),e=c[5],f=c[6]}var l=P[D](0,g),m=P[D](0,h),n=O[D](0,g),o=O[D](0,h),p=n-l,q=o-m,r={x:l,y:m,x2:n,y2:o,width:p,height:q,cx:l+p/2,cy:m+q/2};return b.bbox=d(r),r},Cb=function(a){var b=d(a);return b.toString=c._path2string,b},Db=c._pathToRelative=function(a){var b=Ab(a);if(b.rel)return Cb(b.rel);c.is(a,V)&&c.is(a&&a[0],V)||(a=c.parsePathString(a));var d=[],e=0,f=0,g=0,h=0,i=0;\"M\"==a[0][0]&&(e=a[0][1],f=a[0][2],g=e,h=f,i++,d.push([\"M\",e,f]));for(var j=i,k=a.length;k>j;j++){var l=d[j]=[],m=a[j];if(m[0]!=M.call(m[0]))switch(l[0]=M.call(m[0]),l[0]){case\"a\":l[1]=m[1],l[2]=m[2],l[3]=m[3],l[4]=m[4],l[5]=m[5],l[6]=+(m[6]-e).toFixed(3),l[7]=+(m[7]-f).toFixed(3);break;case\"v\":l[1]=+(m[1]-f).toFixed(3);break;case\"m\":g=m[1],h=m[2];default:for(var n=1,o=m.length;o>n;n++)l[n]=+(m[n]-(n%2?e:f)).toFixed(3)}else{l=d[j]=[],\"m\"==m[0]&&(g=m[1]+e,h=m[2]+f);for(var p=0,q=m.length;q>p;p++)d[j][p]=m[p]}var r=d[j].length;switch(d[j][0]){case\"z\":e=g,f=h;break;case\"h\":e+=+d[j][r-1];break;case\"v\":f+=+d[j][r-1];break;default:e+=+d[j][r-2],f+=+d[j][r-1]}}return d.toString=c._path2string,b.rel=Cb(d),d},Eb=c._pathToAbsolute=function(a){var b=Ab(a);if(b.abs)return Cb(b.abs);if(c.is(a,V)&&c.is(a&&a[0],V)||(a=c.parsePathString(a)),!a||!a.length)return[[\"M\",0,0]];var d=[],e=0,f=0,g=0,i=0,j=0;\"M\"==a[0][0]&&(e=+a[0][1],f=+a[0][2],g=e,i=f,j++,d[0]=[\"M\",e,f]);for(var k,l,m=3==a.length&&\"M\"==a[0][0]&&\"R\"==a[1][0].toUpperCase()&&\"Z\"==a[2][0].toUpperCase(),n=j,o=a.length;o>n;n++){if(d.push(k=[]),l=a[n],l[0]!=bb.call(l[0]))switch(k[0]=bb.call(l[0]),k[0]){case\"A\":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+e),k[7]=+(l[7]+f);break;case\"V\":k[1]=+l[1]+f;break;case\"H\":k[1]=+l[1]+e;break;case\"R\":for(var p=[e,f][E](l.slice(1)),q=2,r=p.length;r>q;q++)p[q]=+p[q]+e,p[++q]=+p[q]+f;d.pop(),d=d[E](h(p,m));break;case\"M\":g=+l[1]+e,i=+l[2]+f;default:for(q=1,r=l.length;r>q;q++)k[q]=+l[q]+(q%2?e:f)}else if(\"R\"==l[0])p=[e,f][E](l.slice(1)),d.pop(),d=d[E](h(p,m)),k=[\"R\"][E](l.slice(-2));else for(var s=0,t=l.length;t>s;s++)k[s]=l[s];switch(k[0]){case\"Z\":e=g,f=i;break;case\"H\":e=k[1];break;case\"V\":f=k[1];break;case\"M\":g=k[k.length-2],i=k[k.length-1];default:e=k[k.length-2],f=k[k.length-1]}}return d.toString=c._path2string,b.abs=Cb(d),d},Fb=function(a,b,c,d){return[a,b,c,d,c,d]},Gb=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},Hb=function(a,b,c,d,e,g,h,i,j,k){var l,m=120*S/180,n=S/180*(+e||0),o=[],p=f(function(a,b,c){var d=a*N.cos(c)-b*N.sin(c),e=a*N.sin(c)+b*N.cos(c);return{x:d,y:e}});if(k)y=k[0],z=k[1],w=k[2],x=k[3];else{l=p(a,b,-n),a=l.x,b=l.y,l=p(i,j,-n),i=l.x,j=l.y;var q=(N.cos(S/180*e),N.sin(S/180*e),(a-i)/2),r=(b-j)/2,s=q*q/(c*c)+r*r/(d*d);s>1&&(s=N.sqrt(s),c=s*c,d=s*d);var t=c*c,u=d*d,v=(g==h?-1:1)*N.sqrt(Q((t*u-t*r*r-u*q*q)/(t*r*r+u*q*q))),w=v*c*r/d+(a+i)/2,x=v*-d*q/c+(b+j)/2,y=N.asin(((b-x)/d).toFixed(9)),z=N.asin(((j-x)/d).toFixed(9));y=w>a?S-y:y,z=w>i?S-z:z,0>y&&(y=2*S+y),0>z&&(z=2*S+z),h&&y>z&&(y-=2*S),!h&&z>y&&(z-=2*S)}var A=z-y;if(Q(A)>m){var B=z,C=i,D=j;z=y+m*(h&&z>y?1:-1),i=w+c*N.cos(z),j=x+d*N.sin(z),o=Hb(i,j,c,d,e,0,h,C,D,[z,B,w,x])}A=z-y;var F=N.cos(y),G=N.sin(y),H=N.cos(z),I=N.sin(z),K=N.tan(A/4),L=4/3*c*K,M=4/3*d*K,O=[a,b],P=[a+L*G,b-M*F],R=[i+L*I,j-M*H],T=[i,j];if(P[0]=2*O[0]-P[0],P[1]=2*O[1]-P[1],k)return[P,R,T][E](o);o=[P,R,T][E](o).join()[J](\",\");for(var U=[],V=0,W=o.length;W>V;V++)U[V]=V%2?p(o[V-1],o[V],n).y:p(o[V],o[V+1],n).x;return U},Ib=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:R(j,3)*a+3*R(j,2)*i*c+3*j*i*i*e+R(i,3)*g,y:R(j,3)*b+3*R(j,2)*i*d+3*j*i*i*f+R(i,3)*h}},Jb=f(function(a,b,c,d,e,f,g,h){var i,j=e-2*c+a-(g-2*e+c),k=2*(c-a)-2*(e-c),l=a-c,m=(-k+N.sqrt(k*k-4*j*l))/2/j,n=(-k-N.sqrt(k*k-4*j*l))/2/j,o=[b,h],p=[a,g];return Q(m)>\"1e12\"&&(m=.5),Q(n)>\"1e12\"&&(n=.5),m>0&&1>m&&(i=Ib(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ib(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),j=f-2*d+b-(h-2*f+d),k=2*(d-b)-2*(f-d),l=b-d,m=(-k+N.sqrt(k*k-4*j*l))/2/j,n=(-k-N.sqrt(k*k-4*j*l))/2/j,Q(m)>\"1e12\"&&(m=.5),Q(n)>\"1e12\"&&(n=.5),m>0&&1>m&&(i=Ib(a,b,c,d,e,f,g,h,m),p.push(i.x),o.push(i.y)),n>0&&1>n&&(i=Ib(a,b,c,d,e,f,g,h,n),p.push(i.x),o.push(i.y)),{min:{x:P[D](0,p),y:P[D](0,o)},max:{x:O[D](0,p),y:O[D](0,o)}}}),Kb=c._path2curve=f(function(a,b){var c=!b&&Ab(a);if(!b&&c.curve)return Cb(c.curve);for(var d=Eb(a),e=b&&Eb(b),f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},h=(function(a,b,c){var d,e,f={T:1,Q:1};if(!a)return[\"C\",b.x,b.y,b.x,b.y,b.x,b.y];switch(!(a[0]in f)&&(b.qx=b.qy=null),a[0]){case\"M\":b.X=a[1],b.Y=a[2];break;case\"A\":a=[\"C\"][E](Hb[D](0,[b.x,b.y][E](a.slice(1))));break;case\"S\":\"C\"==c||\"S\"==c?(d=2*b.x-b.bx,e=2*b.y-b.by):(d=b.x,e=b.y),a=[\"C\",d,e][E](a.slice(1));break;case\"T\":\"Q\"==c||\"T\"==c?(b.qx=2*b.x-b.qx,b.qy=2*b.y-b.qy):(b.qx=b.x,b.qy=b.y),a=[\"C\"][E](Gb(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case\"Q\":b.qx=a[1],b.qy=a[2],a=[\"C\"][E](Gb(b.x,b.y,a[1],a[2],a[3],a[4]));break;case\"L\":a=[\"C\"][E](Fb(b.x,b.y,a[1],a[2]));break;case\"H\":a=[\"C\"][E](Fb(b.x,b.y,a[1],b.y));break;case\"V\":a=[\"C\"][E](Fb(b.x,b.y,b.x,a[1]));break;case\"Z\":a=[\"C\"][E](Fb(b.x,b.y,b.X,b.Y))}return a}),i=function(a,b){if(a[b].length>7){a[b].shift();for(var c=a[b];c.length;)a.splice(b++,0,[\"C\"][E](c.splice(0,6)));a.splice(b,1),l=O(d.length,e&&e.length||0)}},j=function(a,b,c,f,g){a&&b&&\"M\"==a[g][0]&&\"M\"!=b[g][0]&&(b.splice(g,0,[\"M\",f.x,f.y]),c.bx=0,c.by=0,c.x=a[g][1],c.y=a[g][2],l=O(d.length,e&&e.length||0))},k=0,l=O(d.length,e&&e.length||0);l>k;k++){d[k]=h(d[k],f),i(d,k),e&&(e[k]=h(e[k],g)),e&&i(e,k),j(d,e,f,g,k),j(e,d,g,f,k);var m=d[k],n=e&&e[k],o=m.length,p=e&&n.length;f.x=m[o-2],f.y=m[o-1],f.bx=_(m[o-4])||f.x,f.by=_(m[o-3])||f.y,g.bx=e&&(_(n[p-4])||g.x),g.by=e&&(_(n[p-3])||g.y),g.x=e&&n[p-2],g.y=e&&n[p-1]}return e||(c.curve=Cb(d)),e?[d,e]:d},null,Cb),Lb=(c._parseDots=f(function(a){for(var b=[],d=0,e=a.length;e>d;d++){var f={},g=a[d].match(/^([^:]*):?([\\d\\.]*)/);if(f.color=c.getRGB(g[1]),f.color.error)return null;f.color=f.color.hex,g[2]&&(f.offset=g[2]+\"%\"),b.push(f)}for(d=1,e=b.length-1;e>d;d++)if(!b[d].offset){for(var h=_(b[d-1].offset||0),i=0,j=d+1;e>j;j++)if(b[j].offset){i=b[j].offset;break}i||(i=100,j=e),i=_(i);for(var k=(i-h)/(j-d+1);j>d;d++)h+=k,b[d].offset=h+\"%\"}return b}),c._tear=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)}),Mb=(c._tofront=function(a,b){b.top!==a&&(Lb(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},c._toback=function(a,b){b.bottom!==a&&(Lb(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},c._insertafter=function(a,b,c){Lb(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},c._insertbefore=function(a,b,c){Lb(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},c.toMatrix=function(a,b){var c=Bb(a),d={_:{transform:G},getBBox:function(){return c}};return Nb(d,b),d.matrix}),Nb=(c.transformPath=function(a,b){return rb(a,Mb(a,b))},c._extractTransform=function(a,b){if(null==b)return a._.transform;b=I(b).replace(/\\.{3}|\\u2026/g,a._.transform||G);var d=c.parseTransformString(b),e=0,f=0,g=0,h=1,i=1,j=a._,k=new o;if(j.transform=d||[],d)for(var l=0,m=d.length;m>l;l++){var n,p,q,r,s,t=d[l],u=t.length,v=I(t[0]).toLowerCase(),w=t[0]!=v,x=w?k.invert():0;\"t\"==v&&3==u?w?(n=x.x(0,0),p=x.y(0,0),q=x.x(t[1],t[2]),r=x.y(t[1],t[2]),k.translate(q-n,r-p)):k.translate(t[1],t[2]):\"r\"==v?2==u?(s=s||a.getBBox(1),k.rotate(t[1],s.x+s.width/2,s.y+s.height/2),e+=t[1]):4==u&&(w?(q=x.x(t[2],t[3]),r=x.y(t[2],t[3]),k.rotate(t[1],q,r)):k.rotate(t[1],t[2],t[3]),e+=t[1]):\"s\"==v?2==u||3==u?(s=s||a.getBBox(1),k.scale(t[1],t[u-1],s.x+s.width/2,s.y+s.height/2),h*=t[1],i*=t[u-1]):5==u&&(w?(q=x.x(t[3],t[4]),r=x.y(t[3],t[4]),k.scale(t[1],t[2],q,r)):k.scale(t[1],t[2],t[3],t[4]),h*=t[1],i*=t[2]):\"m\"==v&&7==u&&k.add(t[1],t[2],t[3],t[4],t[5],t[6]),j.dirtyT=1,a.matrix=k}a.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.e,j.dy=g=k.f,1==h&&1==i&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1}),Ob=function(a){var b=a[0];switch(b.toLowerCase()){case\"t\":return[b,0,0];case\"m\":return[b,1,0,0,1,0,0];case\"r\":return 4==a.length?[b,0,a[2],a[3]]:[b,0];case\"s\":return 5==a.length?[b,1,1,a[3],a[4]]:3==a.length?[b,1,1]:[b,1]}},Pb=c._equaliseTransform=function(a,b){b=I(b).replace(/\\.{3}|\\u2026/g,a),a=c.parseTransformString(a)||[],b=c.parseTransformString(b)||[];for(var d,e,f,g,h=O(a.length,b.length),i=[],j=[],k=0;h>k;k++){if(f=a[k]||Ob(b[k]),g=b[k]||Ob(f),f[0]!=g[0]||\"r\"==f[0].toLowerCase()&&(f[2]!=g[2]||f[3]!=g[3])||\"s\"==f[0].toLowerCase()&&(f[3]!=g[3]||f[4]!=g[4]))return;for(i[k]=[],j[k]=[],d=0,e=O(f.length,g.length);e>d;d++)d in f&&(i[k][d]=f[d]),d in g&&(j[k][d]=g[d])\n}return{from:i,to:j}};c._getContainer=function(a,b,d,e){var f;return f=null!=e||c.is(a,\"object\")?a:A.doc.getElementById(a),null!=f?f.tagName?null==b?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:b,height:d}:{container:1,x:a,y:b,width:d,height:e}:void 0},c.pathToRelative=Db,c._engine={},c.path2curve=Kb,c.matrix=function(a,b,c,d,e,f){return new o(a,b,c,d,e,f)},function(a){function b(a){return a[0]*a[0]+a[1]*a[1]}function d(a){var c=N.sqrt(b(a));a[0]&&(a[0]/=c),a[1]&&(a[1]/=c)}a.add=function(a,b,c,d,e,f){var g,h,i,j,k=[[],[],[]],l=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],m=[[a,c,e],[b,d,f],[0,0,1]];for(a&&a instanceof o&&(m=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]),g=0;3>g;g++)for(h=0;3>h;h++){for(j=0,i=0;3>i;i++)j+=l[g][i]*m[i][h];k[g][h]=j}this.a=k[0][0],this.b=k[1][0],this.c=k[0][1],this.d=k[1][1],this.e=k[0][2],this.f=k[1][2]},a.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new o(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},a.clone=function(){return new o(this.a,this.b,this.c,this.d,this.e,this.f)},a.translate=function(a,b){this.add(1,0,0,1,a,b)},a.scale=function(a,b,c,d){null==b&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d)},a.rotate=function(a,b,d){a=c.rad(a),b=b||0,d=d||0;var e=+N.cos(a).toFixed(9),f=+N.sin(a).toFixed(9);this.add(e,f,-f,e,b,d),this.add(1,0,0,1,-b,-d)},a.x=function(a,b){return a*this.a+b*this.c+this.e},a.y=function(a,b){return a*this.b+b*this.d+this.f},a.get=function(a){return+this[I.fromCharCode(97+a)].toFixed(4)},a.toString=function(){return c.svg?\"matrix(\"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+\")\":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},a.toFilter=function(){return\"progid:DXImageTransform.Microsoft.Matrix(M11=\"+this.get(0)+\", M12=\"+this.get(2)+\", M21=\"+this.get(1)+\", M22=\"+this.get(3)+\", Dx=\"+this.get(4)+\", Dy=\"+this.get(5)+\", sizingmethod='auto expand')\"},a.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},a.split=function(){var a={};a.dx=this.e,a.dy=this.f;var e=[[this.a,this.c],[this.b,this.d]];a.scalex=N.sqrt(b(e[0])),d(e[0]),a.shear=e[0][0]*e[1][0]+e[0][1]*e[1][1],e[1]=[e[1][0]-e[0][0]*a.shear,e[1][1]-e[0][1]*a.shear],a.scaley=N.sqrt(b(e[1])),d(e[1]),a.shear/=a.scaley;var f=-e[0][1],g=e[1][1];return 0>g?(a.rotate=c.deg(N.acos(g)),0>f&&(a.rotate=360-a.rotate)):a.rotate=c.deg(N.asin(f)),a.isSimple=!(+a.shear.toFixed(9)||a.scalex.toFixed(9)!=a.scaley.toFixed(9)&&a.rotate),a.isSuperSimple=!+a.shear.toFixed(9)&&a.scalex.toFixed(9)==a.scaley.toFixed(9)&&!a.rotate,a.noRotation=!+a.shear.toFixed(9)&&!a.rotate,a},a.toTransformString=function(a){var b=a||this[J]();return b.isSimple?(b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4),(b.dx||b.dy?\"t\"+[b.dx,b.dy]:G)+(1!=b.scalex||1!=b.scaley?\"s\"+[b.scalex,b.scaley,0,0]:G)+(b.rotate?\"r\"+[b.rotate,0,0]:G)):\"m\"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(o.prototype);var Qb=navigator.userAgent.match(/Version\\/(.*?)\\s/)||navigator.userAgent.match(/Chrome\\/(\\d+)/);v.safari=\"Apple Computer, Inc.\"==navigator.vendor&&(Qb&&Qb[1]<4||\"iP\"==navigator.platform.slice(0,2))||\"Google Inc.\"==navigator.vendor&&Qb&&Qb[1]<8?function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:\"none\"});setTimeout(function(){a.remove()})}:mb;for(var Rb=function(){this.returnValue=!1},Sb=function(){return this.originalEvent.preventDefault()},Tb=function(){this.cancelBubble=!0},Ub=function(){return this.originalEvent.stopPropagation()},Vb=function(a){var b=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,c=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;return{x:a.clientX+c,y:a.clientY+b}},Wb=function(){return A.doc.addEventListener?function(a,b,c,d){var e=function(a){var b=Vb(a);return c.call(d,a,b.x,b.y)};if(a.addEventListener(b,e,!1),F&&L[b]){var f=function(b){for(var e=Vb(b),f=b,g=0,h=b.targetTouches&&b.targetTouches.length;h>g;g++)if(b.targetTouches[g].target==a){b=b.targetTouches[g],b.originalEvent=f,b.preventDefault=Sb,b.stopPropagation=Ub;break}return c.call(d,b,e.x,e.y)};a.addEventListener(L[b],f,!1)}return function(){return a.removeEventListener(b,e,!1),F&&L[b]&&a.removeEventListener(L[b],e,!1),!0}}:A.doc.attachEvent?function(a,b,c,d){var e=function(a){a=a||A.win.event;var b=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,e=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,f=a.clientX+e,g=a.clientY+b;return a.preventDefault=a.preventDefault||Rb,a.stopPropagation=a.stopPropagation||Tb,c.call(d,a,f,g)};a.attachEvent(\"on\"+b,e);var f=function(){return a.detachEvent(\"on\"+b,e),!0};return f}:void 0}(),Xb=[],Yb=function(a){for(var c,d=a.clientX,e=a.clientY,f=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,g=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft,h=Xb.length;h--;){if(c=Xb[h],F&&a.touches){for(var i,j=a.touches.length;j--;)if(i=a.touches[j],i.identifier==c.el._drag.id){d=i.clientX,e=i.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}else a.preventDefault();var k,l=c.el.node,m=l.nextSibling,n=l.parentNode,o=l.style.display;A.win.opera&&n.removeChild(l),l.style.display=\"none\",k=c.el.paper.getElementByPoint(d,e),l.style.display=o,A.win.opera&&(m?n.insertBefore(l,m):n.appendChild(l)),k&&b(\"raphael.drag.over.\"+c.el.id,c.el,k),d+=g,e+=f,b(\"raphael.drag.move.\"+c.el.id,c.move_scope||c.el,d-c.el._drag.x,e-c.el._drag.y,d,e,a)}},Zb=function(a){c.unmousemove(Yb).unmouseup(Zb);for(var d,e=Xb.length;e--;)d=Xb[e],d.el._drag={},b(\"raphael.drag.end.\"+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,a);Xb=[]},$b=c.el={},_b=K.length;_b--;)!function(a){c[a]=$b[a]=function(b,d){return c.is(b,\"function\")&&(this.events=this.events||[],this.events.push({name:a,f:b,unbind:Wb(this.shape||this.node||A.doc,a,b,d||this)})),this},c[\"un\"+a]=$b[\"un\"+a]=function(b){for(var d=this.events||[],e=d.length;e--;)d[e].name!=a||!c.is(b,\"undefined\")&&d[e].f!=b||(d[e].unbind(),d.splice(e,1),!d.length&&delete this.events);return this}}(K[_b]);$b.data=function(a,d){var e=kb[this.id]=kb[this.id]||{};if(0==arguments.length)return e;if(1==arguments.length){if(c.is(a,\"object\")){for(var f in a)a[z](f)&&this.data(f,a[f]);return this}return b(\"raphael.data.get.\"+this.id,this,e[a],a),e[a]}return e[a]=d,b(\"raphael.data.set.\"+this.id,this,d,a),this},$b.removeData=function(a){return null==a?kb[this.id]={}:kb[this.id]&&delete kb[this.id][a],this},$b.getData=function(){return d(kb[this.id]||{})},$b.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},$b.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var ac=[];$b.drag=function(a,d,e,f,g,h){function i(i){(i.originalEvent||i).preventDefault();var j=i.clientX,k=i.clientY,l=A.doc.documentElement.scrollTop||A.doc.body.scrollTop,m=A.doc.documentElement.scrollLeft||A.doc.body.scrollLeft;if(this._drag.id=i.identifier,F&&i.touches)for(var n,o=i.touches.length;o--;)if(n=i.touches[o],this._drag.id=n.identifier,n.identifier==this._drag.id){j=n.clientX,k=n.clientY;break}this._drag.x=j+m,this._drag.y=k+l,!Xb.length&&c.mousemove(Yb).mouseup(Zb),Xb.push({el:this,move_scope:f,start_scope:g,end_scope:h}),d&&b.on(\"raphael.drag.start.\"+this.id,d),a&&b.on(\"raphael.drag.move.\"+this.id,a),e&&b.on(\"raphael.drag.end.\"+this.id,e),b(\"raphael.drag.start.\"+this.id,g||f||this,i.clientX+m,i.clientY+l,i)}return this._drag={},ac.push({el:this,start:i}),this.mousedown(i),this},$b.onDragOver=function(a){a?b.on(\"raphael.drag.over.\"+this.id,a):b.unbind(\"raphael.drag.over.\"+this.id)},$b.undrag=function(){for(var a=ac.length;a--;)ac[a].el==this&&(this.unmousedown(ac[a].start),ac.splice(a,1),b.unbind(\"raphael.drag.*.\"+this.id));!ac.length&&c.unmousemove(Yb).unmouseup(Zb),Xb=[]},v.circle=function(a,b,d){var e=c._engine.circle(this,a||0,b||0,d||0);return this.__set__&&this.__set__.push(e),e},v.rect=function(a,b,d,e,f){var g=c._engine.rect(this,a||0,b||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},v.ellipse=function(a,b,d,e){var f=c._engine.ellipse(this,a||0,b||0,d||0,e||0);return this.__set__&&this.__set__.push(f),f},v.path=function(a){a&&!c.is(a,U)&&!c.is(a[0],V)&&(a+=G);var b=c._engine.path(c.format[D](c,arguments),this);return this.__set__&&this.__set__.push(b),b},v.image=function(a,b,d,e,f){var g=c._engine.image(this,a||\"about:blank\",b||0,d||0,e||0,f||0);return this.__set__&&this.__set__.push(g),g},v.text=function(a,b,d){var e=c._engine.text(this,a||0,b||0,I(d));return this.__set__&&this.__set__.push(e),e},v.set=function(a){!c.is(a,\"array\")&&(a=Array.prototype.splice.call(arguments,0,arguments.length));var b=new mc(a);return this.__set__&&this.__set__.push(b),b.paper=this,b.type=\"set\",b},v.setStart=function(a){this.__set__=a||this.set()},v.setFinish=function(){var a=this.__set__;return delete this.__set__,a},v.setSize=function(a,b){return c._engine.setSize.call(this,a,b)},v.setViewBox=function(a,b,d,e,f){return c._engine.setViewBox.call(this,a,b,d,e,f)},v.top=v.bottom=null,v.raphael=c;var bc=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,g=e.clientLeft||d.clientLeft||0,h=b.top+(A.win.pageYOffset||e.scrollTop||d.scrollTop)-f,i=b.left+(A.win.pageXOffset||e.scrollLeft||d.scrollLeft)-g;return{y:h,x:i}};v.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=A.doc.elementFromPoint(a,b);if(A.win.opera&&\"svg\"==e.tagName){var f=bc(d),g=d.createSVGRect();g.x=a-f.x,g.y=b-f.y,g.width=g.height=1;var h=d.getIntersectionList(g,null);h.length&&(e=h[h.length-1])}if(!e)return null;for(;e.parentNode&&e!=d.parentNode&&!e.raphael;)e=e.parentNode;return e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null},v.getElementsByBBox=function(a){var b=this.set();return this.forEach(function(d){c.isBBoxIntersect(d.getBBox(),a)&&b.push(d)}),b},v.getById=function(a){for(var b=this.bottom;b;){if(b.id==a)return b;b=b.next}return null},v.forEach=function(a,b){for(var c=this.bottom;c;){if(a.call(b,c)===!1)return this;c=c.next}return this},v.getElementsByPoint=function(a,b){var c=this.set();return this.forEach(function(d){d.isPointInside(a,b)&&c.push(d)}),c},$b.isPointInside=function(a,b){var d=this.realPath=qb[this.type](this);return this.attr(\"transform\")&&this.attr(\"transform\").length&&(d=c.transformPath(d,this.attr(\"transform\"))),c.isPointInsidePath(d,a,b)},$b.getBBox=function(a){if(this.removed)return{};var b=this._;return a?((b.dirty||!b.bboxwt)&&(this.realPath=qb[this.type](this),b.bboxwt=Bb(this.realPath),b.bboxwt.toString=p,b.dirty=0),b.bboxwt):((b.dirty||b.dirtyT||!b.bbox)&&((b.dirty||!this.realPath)&&(b.bboxwt=0,this.realPath=qb[this.type](this)),b.bbox=Bb(rb(this.realPath,this.matrix)),b.bbox.toString=p,b.dirty=b.dirtyT=0),b.bbox)},$b.clone=function(){if(this.removed)return null;var a=this.paper[this.type]().attr(this.attr());return this.__set__&&this.__set__.push(a),a},$b.glow=function(a){if(\"text\"==this.type)return null;a=a||{};var b={width:(a.width||10)+(+this.attr(\"stroke-width\")||1),fill:a.fill||!1,opacity:a.opacity||.5,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||\"#000\"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||qb[this.type](this);f=this.matrix?rb(f,this.matrix):f;for(var g=1;c+1>g;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:\"none\",\"stroke-linejoin\":\"round\",\"stroke-linecap\":\"round\",\"stroke-width\":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var cc=function(a,b,d,e,f,g,h,i,l){return null==l?j(a,b,d,e,f,g,h,i):c.findDotsAtSegment(a,b,d,e,f,g,h,i,k(a,b,d,e,f,g,h,i,l))},dc=function(a,b){return function(d,e,f){d=Kb(d);for(var g,h,i,j,k,l=\"\",m={},n=0,o=0,p=d.length;p>o;o++){if(i=d[o],\"M\"==i[0])g=+i[1],h=+i[2];else{if(j=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6]),n+j>e){if(b&&!m.start){if(k=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),l+=[\"C\"+k.start.x,k.start.y,k.m.x,k.m.y,k.x,k.y],f)return l;m.start=l,l=[\"M\"+k.x,k.y+\"C\"+k.n.x,k.n.y,k.end.x,k.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!a&&!b)return k=cc(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),{x:k.x,y:k.y,alpha:k.alpha}}n+=j,g=+i[5],h=+i[6]}l+=i.shift()+i}return m.end=l,k=a?n:b?m:c.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),k.alpha&&(k={x:k.x,y:k.y,alpha:k.alpha}),k}},ec=dc(1),fc=dc(),gc=dc(0,1);c.getTotalLength=ec,c.getPointAtLength=fc,c.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return gc(a,b).end;var d=gc(a,c,1);return b?gc(d,b).end:d},$b.getTotalLength=function(){var a=this.getPath();if(a)return this.node.getTotalLength?this.node.getTotalLength():ec(a)},$b.getPointAtLength=function(a){var b=this.getPath();if(b)return fc(b,a)},$b.getPath=function(){var a,b=c._getPath[this.type];if(\"text\"!=this.type&&\"set\"!=this.type)return b&&(a=b(this)),a},$b.getSubpath=function(a,b){var d=this.getPath();if(d)return c.getSubpath(d,a,b)};var hc=c.easing_formulas={linear:function(a){return a},\"<\":function(a){return R(a,1.7)},\">\":function(a){return R(a,.48)},\"<>\":function(a){var b=.48-a/1.04,c=N.sqrt(.1734+b*b),d=c-b,e=R(Q(d),1/3)*(0>d?-1:1),f=-c-b,g=R(Q(f),1/3)*(0>f?-1:1),h=e+g+.5;return 3*(1-h)*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a-=1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){return a==!!a?a:R(2,-10*a)*N.sin(2*(a-.075)*S/.3)+1},bounce:function(a){var b,c=7.5625,d=2.75;return 1/d>a?b=c*a*a:2/d>a?(a-=1.5/d,b=c*a*a+.75):2.5/d>a?(a-=2.25/d,b=c*a*a+.9375):(a-=2.625/d,b=c*a*a+.984375),b}};hc.easeIn=hc[\"ease-in\"]=hc[\"<\"],hc.easeOut=hc[\"ease-out\"]=hc[\">\"],hc.easeInOut=hc[\"ease-in-out\"]=hc[\"<>\"],hc[\"back-in\"]=hc.backIn,hc[\"back-out\"]=hc.backOut;var ic=[],jc=a.requestAnimationFrame||a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame||a.msRequestAnimationFrame||function(a){setTimeout(a,16)},kc=function(){for(var a=+new Date,d=0;d<ic.length;d++){var e=ic[d];if(!e.el.removed&&!e.paused){var f,g,h=a-e.start,i=e.ms,j=e.easing,k=e.from,l=e.diff,m=e.to,n=(e.t,e.el),o={},p={};if(e.initstatus?(h=(e.initstatus*e.anim.top-e.prev)/(e.percent-e.prev)*i,e.status=e.initstatus,delete e.initstatus,e.stop&&ic.splice(d--,1)):e.status=(e.prev+(e.percent-e.prev)*(h/i))/e.anim.top,!(0>h))if(i>h){var q=j(h/i);for(var r in k)if(k[z](r)){switch(db[r]){case T:f=+k[r]+q*i*l[r];break;case\"colour\":f=\"rgb(\"+[lc($(k[r].r+q*i*l[r].r)),lc($(k[r].g+q*i*l[r].g)),lc($(k[r].b+q*i*l[r].b))].join(\",\")+\")\";break;case\"path\":f=[];for(var t=0,u=k[r].length;u>t;t++){f[t]=[k[r][t][0]];for(var v=1,w=k[r][t].length;w>v;v++)f[t][v]=+k[r][t][v]+q*i*l[r][t][v];f[t]=f[t].join(H)}f=f.join(H);break;case\"transform\":if(l[r].real)for(f=[],t=0,u=k[r].length;u>t;t++)for(f[t]=[k[r][t][0]],v=1,w=k[r][t].length;w>v;v++)f[t][v]=k[r][t][v]+q*i*l[r][t][v];else{var x=function(a){return+k[r][a]+q*i*l[r][a]};f=[[\"m\",x(0),x(1),x(2),x(3),x(4),x(5)]]}break;case\"csv\":if(\"clip-rect\"==r)for(f=[],t=4;t--;)f[t]=+k[r][t]+q*i*l[r][t];break;default:var y=[][E](k[r]);for(f=[],t=n.paper.customAttributes[r].length;t--;)f[t]=+y[t]+q*i*l[r][t]}o[r]=f}n.attr(o),function(a,c,d){setTimeout(function(){b(\"raphael.anim.frame.\"+a,c,d)})}(n.id,n,e.anim)}else{if(function(a,d,e){setTimeout(function(){b(\"raphael.anim.frame.\"+d.id,d,e),b(\"raphael.anim.finish.\"+d.id,d,e),c.is(a,\"function\")&&a.call(d)})}(e.callback,n,e.anim),n.attr(m),ic.splice(d--,1),e.repeat>1&&!e.next){for(g in m)m[z](g)&&(p[g]=e.totalOrigin[g]);e.el.attr(p),s(e.anim,e.el,e.anim.percents[0],null,e.totalOrigin,e.repeat-1)}e.next&&!e.stop&&s(e.anim,e.el,e.next,null,e.totalOrigin,e.repeat)}}}c.svg&&n&&n.paper&&n.paper.safari(),ic.length&&jc(kc)},lc=function(a){return a>255?255:0>a?0:a};$b.animateWith=function(a,b,d,e,f,g){var h=this;if(h.removed)return g&&g.call(h),h;var i=d instanceof r?d:c.animation(d,e,f,g);s(i,h,i.percents[0],null,h.attr());for(var j=0,k=ic.length;k>j;j++)if(ic[j].anim==b&&ic[j].el==a){ic[k-1].start=ic[j].start;break}return h},$b.onAnimation=function(a){return a?b.on(\"raphael.anim.frame.\"+this.id,a):b.unbind(\"raphael.anim.frame.\"+this.id),this},r.prototype.delay=function(a){var b=new r(this.anim,this.ms);return b.times=this.times,b.del=+a||0,b},r.prototype.repeat=function(a){var b=new r(this.anim,this.ms);return b.del=this.del,b.times=N.floor(O(a,0))||1,b},c.animation=function(a,b,d,e){if(a instanceof r)return a;(c.is(d,\"function\")||!d)&&(e=e||d||null,d=null),a=Object(a),b=+b||0;var f,g,h={};for(g in a)a[z](g)&&_(g)!=g&&_(g)+\"%\"!=g&&(f=!0,h[g]=a[g]);return f?(d&&(h.easing=d),e&&(h.callback=e),new r({100:h},b)):new r(a,b)},$b.animate=function(a,b,d,e){var f=this;if(f.removed)return e&&e.call(f),f;var g=a instanceof r?a:c.animation(a,b,d,e);return s(g,f,g.percents[0],null,f.attr()),f},$b.setTime=function(a,b){return a&&null!=b&&this.status(a,P(b,a.ms)/a.ms),this},$b.status=function(a,b){var c,d,e=[],f=0;if(null!=b)return s(a,this,-1,P(b,1)),this;for(c=ic.length;c>f;f++)if(d=ic[f],d.el.id==this.id&&(!a||d.anim==a)){if(a)return d.status;e.push({anim:d.anim,status:d.status})}return a?0:e},$b.pause=function(a){for(var c=0;c<ic.length;c++)ic[c].el.id!=this.id||a&&ic[c].anim!=a||b(\"raphael.anim.pause.\"+this.id,this,ic[c].anim)!==!1&&(ic[c].paused=!0);return this},$b.resume=function(a){for(var c=0;c<ic.length;c++)if(ic[c].el.id==this.id&&(!a||ic[c].anim==a)){var d=ic[c];b(\"raphael.anim.resume.\"+this.id,this,d.anim)!==!1&&(delete d.paused,this.status(d.anim,d.status))}return this},$b.stop=function(a){for(var c=0;c<ic.length;c++)ic[c].el.id!=this.id||a&&ic[c].anim!=a||b(\"raphael.anim.stop.\"+this.id,this,ic[c].anim)!==!1&&ic.splice(c--,1);return this},b.on(\"raphael.remove\",t),b.on(\"raphael.clear\",t),$b.toString=function(){return\"Raphaël’s object\"};var mc=function(a){if(this.items=[],this.length=0,this.type=\"set\",a)for(var b=0,c=a.length;c>b;b++)!a[b]||a[b].constructor!=$b.constructor&&a[b].constructor!=mc||(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},nc=mc.prototype;nc.push=function(){for(var a,b,c=0,d=arguments.length;d>c;c++)a=arguments[c],!a||a.constructor!=$b.constructor&&a.constructor!=mc||(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},nc.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},nc.forEach=function(a,b){for(var c=0,d=this.items.length;d>c;c++)if(a.call(b,this.items[c],c)===!1)return this;return this};for(var oc in $b)$b[z](oc)&&(nc[oc]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][D](c,b)})}}(oc));return nc.attr=function(a,b){if(a&&c.is(a,V)&&c.is(a[0],\"object\"))for(var d=0,e=a.length;e>d;d++)this.items[d].attr(a[d]);else for(var f=0,g=this.items.length;g>f;f++)this.items[f].attr(a,b);return this},nc.clear=function(){for(;this.length;)this.pop()},nc.splice=function(a,b){a=0>a?O(this.length+a,0):a,b=O(0,P(this.length-a,b));var c,d=[],e=[],f=[];for(c=2;c<arguments.length;c++)f.push(arguments[c]);for(c=0;b>c;c++)e.push(this[a+c]);for(;c<this.length-a;c++)d.push(this[a+c]);var g=f.length;for(c=0;c<g+d.length;c++)this.items[a+c]=this[a+c]=g>c?f[c]:d[c-g];for(c=this.items.length=this.length-=b-g;this[c];)delete this[c++];return new mc(e)},nc.exclude=function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]==a)return this.splice(b,1),!0},nc.animate=function(a,b,d,e){(c.is(d,\"function\")||!d)&&(e=d||null);var f,g,h=this.items.length,i=h,j=this;if(!h)return this;e&&(g=function(){!--h&&e.call(j)}),d=c.is(d,U)?d:g;var k=c.animation(a,b,d,g);for(f=this.items[--i].animate(k);i--;)this.items[i]&&!this.items[i].removed&&this.items[i].animateWith(f,k,k),this.items[i]&&!this.items[i].removed||h--;return this},nc.insertAfter=function(a){for(var b=this.items.length;b--;)this.items[b].insertAfter(a);return this},nc.getBBox=function(){for(var a=[],b=[],c=[],d=[],e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}return a=P[D](0,a),b=P[D](0,b),c=O[D](0,c),d=O[D](0,d),{x:a,y:b,x2:c,y2:d,width:c-a,height:d-b}},nc.clone=function(a){a=this.paper.set();for(var b=0,c=this.items.length;c>b;b++)a.push(this.items[b].clone());return a},nc.toString=function(){return\"Raphaël‘s set\"},nc.glow=function(a){var b=this.paper.set();return this.forEach(function(c){var d=c.glow(a);null!=d&&d.forEach(function(a){b.push(a)})}),b},nc.isPointInside=function(a,b){var c=!1;return this.forEach(function(d){return d.isPointInside(a,b)?(c=!0,!1):void 0}),c},c.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face[\"font-family\"];for(var d in a.face)a.face[z](d)&&(b.face[d]=a.face[d]);if(this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b],!a.svg){b.face[\"units-per-em\"]=ab(a.face[\"units-per-em\"],10);for(var e in a.glyphs)if(a.glyphs[z](e)){var f=a.glyphs[e];if(b.glyphs[e]={w:f.w,k:{},d:f.d&&\"M\"+f.d.replace(/[mlcxtrv]/g,function(a){return{l:\"L\",c:\"C\",x:\"z\",t:\"m\",r:\"l\",v:\"c\"}[a]||\"M\"})+\"z\"},f.k)for(var g in f.k)f[z](g)&&(b.glyphs[e].k[g]=f.k[g])}}return a},v.getFont=function(a,b,d,e){if(e=e||\"normal\",d=d||\"normal\",b=+b||{normal:400,bold:700,lighter:300,bolder:800}[b]||400,c.fonts){var f=c.fonts[a];if(!f){var g=new RegExp(\"(^|\\\\s)\"+a.replace(/[^\\w\\d\\s+!~.:_-]/g,G)+\"(\\\\s|$)\",\"i\");for(var h in c.fonts)if(c.fonts[z](h)&&g.test(h)){f=c.fonts[h];break}}var i;if(f)for(var j=0,k=f.length;k>j&&(i=f[j],i.face[\"font-weight\"]!=b||i.face[\"font-style\"]!=d&&i.face[\"font-style\"]||i.face[\"font-stretch\"]!=e);j++);return i}},v.print=function(a,b,d,e,f,g,h,i){g=g||\"middle\",h=O(P(h||0,1),-1),i=O(P(i||1,3),1);var j,k=I(d)[J](G),l=0,m=0,n=G;if(c.is(e,\"string\")&&(e=this.getFont(e)),e){j=(f||16)/e.face[\"units-per-em\"];for(var o=e.face.bbox[J](w),p=+o[0],q=o[3]-o[1],r=0,s=+o[1]+(\"baseline\"==g?q+ +e.face.descent:q/2),t=0,u=k.length;u>t;t++){if(\"\\n\"==k[t])l=0,x=0,m=0,r+=q*i;else{var v=m&&e.glyphs[k[t-1]]||{},x=e.glyphs[k[t]];l+=m?(v.w||e.w)+(v.k&&v.k[k[t]]||0)+e.w*h:0,m=1}x&&x.d&&(n+=c.transformPath(x.d,[\"t\",l*j,r*j,\"s\",j,j,p,s,\"t\",(a-p)/j,(b-s)/j]))}}return this.path(n).attr({fill:\"#000\",stroke:\"none\"})},v.add=function(a){if(c.is(a,\"array\"))for(var b,d=this.set(),e=0,f=a.length;f>e;e++)b=a[e]||{},x[z](b.type)&&d.push(this[b.type]().attr(b));return d},c.format=function(a,b){var d=c.is(b,V)?[0][E](b):arguments;return a&&c.is(a,U)&&d.length-1&&(a=a.replace(y,function(a,b){return null==d[++b]?G:d[b]})),a||G},c.fullfill=function(){var a=/\\{([^\\}]+)\\}/g,b=/(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g,c=function(a,c,d){var e=d;return c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),\"function\"==typeof e&&f&&(e=e()))}),e=(null==e||e==d?a:e)+\"\"};return function(b,d){return String(b).replace(a,function(a,b){return c(a,b,d)})}}(),c.ninja=function(){return B.was?A.win.Raphael=B.is:delete Raphael,c},c.st=nc,function(a,b,d){function e(){/in/.test(a.readyState)?setTimeout(e,9):c.eve(\"raphael.DOMload\")}null==a.readyState&&a.addEventListener&&(a.addEventListener(b,d=function(){a.removeEventListener(b,d,!1),a.readyState=\"complete\"},!1),a.readyState=\"loading\"),e()}(document,\"DOMContentLoaded\"),b.on(\"raphael.DOMload\",function(){u=!0}),function(){if(c.svg){var a=\"hasOwnProperty\",b=String,d=parseFloat,e=parseInt,f=Math,g=f.max,h=f.abs,i=f.pow,j=/[, ]+/,k=c.eve,l=\"\",m=\" \",n=\"http://www.w3.org/1999/xlink\",o={block:\"M5,0 0,2.5 5,5z\",classic:\"M5,0 0,2.5 5,5 3.5,3 3.5,2z\",diamond:\"M2.5,0 5,2.5 2.5,5 0,2.5z\",open:\"M6,1 1,3.5 6,6\",oval:\"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z\"},p={};c.toString=function(){return\"Your browser supports SVG.\\nYou are running Raphaël \"+this.version};var q=function(d,e){if(e){\"string\"==typeof d&&(d=q(d));for(var f in e)e[a](f)&&(\"xlink:\"==f.substring(0,6)?d.setAttributeNS(n,f.substring(6),b(e[f])):d.setAttribute(f,b(e[f])))}else d=c._g.doc.createElementNS(\"http://www.w3.org/2000/svg\",d),d.style&&(d.style.webkitTapHighlightColor=\"rgba(0,0,0,0)\");return d},r=function(a,e){var j=\"linear\",k=a.id+e,m=.5,n=.5,o=a.node,p=a.paper,r=o.style,s=c._g.doc.getElementById(k);if(!s){if(e=b(e).replace(c._radial_gradient,function(a,b,c){if(j=\"radial\",b&&c){m=d(b),n=d(c);var e=2*(n>.5)-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&.5!=n&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\\s*\\-\\s*/),\"linear\"==j){var t=e.shift();if(t=-d(t),isNaN(t))return null;var u=[0,0,f.cos(c.rad(t)),f.sin(c.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=c._parseDots(e);if(!w)return null;if(k=k.replace(/[\\(\\)\\s,\\xb0#]/g,\"_\"),a.gradient&&k!=a.gradient.id&&(p.defs.removeChild(a.gradient),delete a.gradient),!a.gradient){s=q(j+\"Gradient\",{id:k}),a.gradient=s,q(s,\"radial\"==j?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:a.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;y>x;x++)s.appendChild(q(\"stop\",{offset:w[x].offset?w[x].offset:x?\"100%\":\"0%\",\"stop-color\":w[x].color||\"#fff\"}))}}return q(o,{fill:\"url(#\"+k+\")\",opacity:1,\"fill-opacity\":1}),r.fill=l,r.opacity=1,r.fillOpacity=1,1},s=function(a){var b=a.getBBox(1);q(a.pattern,{patternTransform:a.matrix.invert()+\" translate(\"+b.x+\",\"+b.y+\")\"})},t=function(d,e,f){if(\"path\"==d.type){for(var g,h,i,j,k,m=b(e).toLowerCase().split(\"-\"),n=d.paper,r=f?\"end\":\"start\",s=d.node,t=d.attrs,u=t[\"stroke-width\"],v=m.length,w=\"classic\",x=3,y=3,z=5;v--;)switch(m[v]){case\"block\":case\"classic\":case\"oval\":case\"diamond\":case\"open\":case\"none\":w=m[v];break;case\"wide\":y=5;break;case\"narrow\":y=2;break;case\"long\":x=5;break;case\"short\":x=2}if(\"open\"==w?(x+=2,y+=2,z+=2,i=1,j=f?4:1,k={fill:\"none\",stroke:t.stroke}):(j=i=x/2,k={fill:t.stroke,stroke:\"none\"}),d._.arrows?f?(d._.arrows.endPath&&p[d._.arrows.endPath]--,d._.arrows.endMarker&&p[d._.arrows.endMarker]--):(d._.arrows.startPath&&p[d._.arrows.startPath]--,d._.arrows.startMarker&&p[d._.arrows.startMarker]--):d._.arrows={},\"none\"!=w){var A=\"raphael-marker-\"+w,B=\"raphael-marker-\"+r+w+x+y;c._g.doc.getElementById(A)?p[A]++:(n.defs.appendChild(q(q(\"path\"),{\"stroke-linecap\":\"round\",d:o[w],id:A})),p[A]=1);var C,D=c._g.doc.getElementById(B);D?(p[B]++,C=D.getElementsByTagName(\"use\")[0]):(D=q(q(\"marker\"),{id:B,markerHeight:y,markerWidth:x,orient:\"auto\",refX:j,refY:y/2}),C=q(q(\"use\"),{\"xlink:href\":\"#\"+A,transform:(f?\"rotate(180 \"+x/2+\" \"+y/2+\") \":l)+\"scale(\"+x/z+\",\"+y/z+\")\",\"stroke-width\":(1/((x/z+y/z)/2)).toFixed(4)}),D.appendChild(C),n.defs.appendChild(D),p[B]=1),q(C,k);var E=i*(\"diamond\"!=w&&\"oval\"!=w);f?(g=d._.arrows.startdx*u||0,h=c.getTotalLength(t.path)-E*u):(g=E*u,h=c.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),k={},k[\"marker-\"+r]=\"url(#\"+B+\")\",(h||g)&&(k.d=c.getSubpath(t.path,g,h)),q(s,k),d._.arrows[r+\"Path\"]=A,d._.arrows[r+\"Marker\"]=B,d._.arrows[r+\"dx\"]=E,d._.arrows[r+\"Type\"]=w,d._.arrows[r+\"String\"]=e}else f?(g=d._.arrows.startdx*u||0,h=c.getTotalLength(t.path)-g):(g=0,h=c.getTotalLength(t.path)-(d._.arrows.enddx*u||0)),d._.arrows[r+\"Path\"]&&q(s,{d:c.getSubpath(t.path,g,h)}),delete d._.arrows[r+\"Path\"],delete d._.arrows[r+\"Marker\"],delete d._.arrows[r+\"dx\"],delete d._.arrows[r+\"Type\"],delete d._.arrows[r+\"String\"];for(k in p)if(p[a](k)&&!p[k]){var F=c._g.doc.getElementById(k);F&&F.parentNode.removeChild(F)}}},u={\"\":[0],none:[0],\"-\":[3,1],\".\":[1,1],\"-.\":[3,1,1,1],\"-..\":[3,1,1,1,1,1],\". \":[1,3],\"- \":[4,3],\"--\":[8,3],\"- .\":[4,3,1,3],\"--.\":[8,3,1,3],\"--..\":[8,3,1,3,1,3]},v=function(a,c,d){if(c=u[b(c).toLowerCase()]){for(var e=a.attrs[\"stroke-width\"]||\"1\",f={round:e,square:e,butt:0}[a.attrs[\"stroke-linecap\"]||d[\"stroke-linecap\"]]||0,g=[],h=c.length;h--;)g[h]=c[h]*e+(h%2?1:-1)*f;q(a.node,{\"stroke-dasharray\":g.join(\",\")})}},w=function(d,f){var i=d.node,k=d.attrs,m=i.style.visibility;i.style.visibility=\"hidden\";for(var o in f)if(f[a](o)){if(!c._availableAttrs[a](o))continue;var p=f[o];switch(k[o]=p,o){case\"blur\":d.blur(p);break;case\"title\":var u=i.getElementsByTagName(\"title\");if(u.length&&(u=u[0]))u.firstChild.nodeValue=p;else{u=q(\"title\");var w=c._g.doc.createTextNode(p);u.appendChild(w),i.appendChild(u)}break;case\"href\":case\"target\":var x=i.parentNode;if(\"a\"!=x.tagName.toLowerCase()){var z=q(\"a\");x.insertBefore(z,i),z.appendChild(i),x=z}\"target\"==o?x.setAttributeNS(n,\"show\",\"blank\"==p?\"new\":p):x.setAttributeNS(n,o,p);break;case\"cursor\":i.style.cursor=p;break;case\"transform\":d.transform(p);break;case\"arrow-start\":t(d,p);break;case\"arrow-end\":t(d,p,1);break;case\"clip-rect\":var A=b(p).split(j);if(4==A.length){d.clip&&d.clip.parentNode.parentNode.removeChild(d.clip.parentNode);var B=q(\"clipPath\"),C=q(\"rect\");B.id=c.createUUID(),q(C,{x:A[0],y:A[1],width:A[2],height:A[3]}),B.appendChild(C),d.paper.defs.appendChild(B),q(i,{\"clip-path\":\"url(#\"+B.id+\")\"}),d.clip=C}if(!p){var D=i.getAttribute(\"clip-path\");if(D){var E=c._g.doc.getElementById(D.replace(/(^url\\(#|\\)$)/g,l));E&&E.parentNode.removeChild(E),q(i,{\"clip-path\":l}),delete d.clip}}break;case\"path\":\"path\"==d.type&&(q(i,{d:p?k.path=c._pathToAbsolute(p):\"M0,0\"}),d._.dirty=1,d._.arrows&&(\"startString\"in d._.arrows&&t(d,d._.arrows.startString),\"endString\"in d._.arrows&&t(d,d._.arrows.endString,1)));break;case\"width\":if(i.setAttribute(o,p),d._.dirty=1,!k.fx)break;o=\"x\",p=k.x;case\"x\":k.fx&&(p=-k.x-(k.width||0));case\"rx\":if(\"rx\"==o&&\"rect\"==d.type)break;case\"cx\":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case\"height\":if(i.setAttribute(o,p),d._.dirty=1,!k.fy)break;o=\"y\",p=k.y;case\"y\":k.fy&&(p=-k.y-(k.height||0));case\"ry\":if(\"ry\"==o&&\"rect\"==d.type)break;case\"cy\":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case\"r\":\"rect\"==d.type?q(i,{rx:p,ry:p}):i.setAttribute(o,p),d._.dirty=1;break;case\"src\":\"image\"==d.type&&i.setAttributeNS(n,\"href\",p);break;case\"stroke-width\":(1!=d._.sx||1!=d._.sy)&&(p/=g(h(d._.sx),h(d._.sy))||1),d.paper._vbSize&&(p*=d.paper._vbSize),i.setAttribute(o,p),k[\"stroke-dasharray\"]&&v(d,k[\"stroke-dasharray\"],f),d._.arrows&&(\"startString\"in d._.arrows&&t(d,d._.arrows.startString),\"endString\"in d._.arrows&&t(d,d._.arrows.endString,1));break;case\"stroke-dasharray\":v(d,p,f);break;case\"fill\":var F=b(p).match(c._ISURL);if(F){B=q(\"pattern\");var G=q(\"image\");B.id=c.createUUID(),q(B,{x:0,y:0,patternUnits:\"userSpaceOnUse\",height:1,width:1}),q(G,{x:0,y:0,\"xlink:href\":F[1]}),B.appendChild(G),function(a){c._preload(F[1],function(){var b=this.offsetWidth,c=this.offsetHeight;q(a,{width:b,height:c}),q(G,{width:b,height:c}),d.paper.safari()})}(B),d.paper.defs.appendChild(B),q(i,{fill:\"url(#\"+B.id+\")\"}),d.pattern=B,d.pattern&&s(d);break}var H=c.getRGB(p);if(H.error){if((\"circle\"==d.type||\"ellipse\"==d.type||\"r\"!=b(p).charAt())&&r(d,p)){if(\"opacity\"in k||\"fill-opacity\"in k){var I=c._g.doc.getElementById(i.getAttribute(\"fill\").replace(/^url\\(#|\\)$/g,l));if(I){var J=I.getElementsByTagName(\"stop\");q(J[J.length-1],{\"stop-opacity\":(\"opacity\"in k?k.opacity:1)*(\"fill-opacity\"in k?k[\"fill-opacity\"]:1)})}}k.gradient=p,k.fill=\"none\";break}}else delete f.gradient,delete k.gradient,!c.is(k.opacity,\"undefined\")&&c.is(f.opacity,\"undefined\")&&q(i,{opacity:k.opacity}),!c.is(k[\"fill-opacity\"],\"undefined\")&&c.is(f[\"fill-opacity\"],\"undefined\")&&q(i,{\"fill-opacity\":k[\"fill-opacity\"]});H[a](\"opacity\")&&q(i,{\"fill-opacity\":H.opacity>1?H.opacity/100:H.opacity});case\"stroke\":H=c.getRGB(p),i.setAttribute(o,H.hex),\"stroke\"==o&&H[a](\"opacity\")&&q(i,{\"stroke-opacity\":H.opacity>1?H.opacity/100:H.opacity}),\"stroke\"==o&&d._.arrows&&(\"startString\"in d._.arrows&&t(d,d._.arrows.startString),\"endString\"in d._.arrows&&t(d,d._.arrows.endString,1));break;case\"gradient\":(\"circle\"==d.type||\"ellipse\"==d.type||\"r\"!=b(p).charAt())&&r(d,p);break;case\"opacity\":k.gradient&&!k[a](\"stroke-opacity\")&&q(i,{\"stroke-opacity\":p>1?p/100:p});case\"fill-opacity\":if(k.gradient){I=c._g.doc.getElementById(i.getAttribute(\"fill\").replace(/^url\\(#|\\)$/g,l)),I&&(J=I.getElementsByTagName(\"stop\"),q(J[J.length-1],{\"stop-opacity\":p}));break}default:\"font-size\"==o&&(p=e(p,10)+\"px\");var K=o.replace(/(\\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[K]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if(\"text\"==d.type&&(f[a](\"text\")||f[a](\"font\")||f[a](\"font-size\")||f[a](\"x\")||f[a](\"y\"))){var g=d.attrs,h=d.node,i=h.firstChild?e(c._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue(\"font-size\"),10):10;\nif(f[a](\"text\")){for(g.text=f.text;h.firstChild;)h.removeChild(h.firstChild);for(var j,k=b(f.text).split(\"\\n\"),m=[],n=0,o=k.length;o>n;n++)j=q(\"tspan\"),n&&q(j,{dy:i*x,x:g.x}),j.appendChild(c._g.doc.createTextNode(k[n])),h.appendChild(j),m[n]=j}else for(m=h.getElementsByTagName(\"tspan\"),n=0,o=m.length;o>n;n++)n?q(m[n],{dy:i*x,x:g.x}):q(m[0],{dy:0});q(h,{x:g.x,y:g.y}),d._.dirty=1;var p=d._getBBox(),r=g.y-(p.y+p.height/2);r&&c.is(r,\"finite\")&&q(m[0],{dy:r})}},z=function(a,b){this[0]=this.node=a,a.raphael=!0,this.id=c._oid++,a.raphaelid=this.id,this.matrix=c.matrix(),this.realPath=null,this.paper=b,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!b.bottom&&(b.bottom=this),this.prev=b.top,b.top&&(b.top.next=this),b.top=this,this.next=null},A=c.el;z.prototype=A,A.constructor=z,c._engine.path=function(a,b){var c=q(\"path\");b.canvas&&b.canvas.appendChild(c);var d=new z(c,b);return d.type=\"path\",w(d,{fill:\"none\",stroke:\"#000\",path:a}),d},A.rotate=function(a,c,e){if(this.removed)return this;if(a=b(a).split(j),a.length-1&&(c=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(c=e),null==c||null==e){var f=this.getBBox(1);c=f.x+f.width/2,e=f.y+f.height/2}return this.transform(this._.transform.concat([[\"r\",a,c,e]])),this},A.scale=function(a,c,e,f){if(this.removed)return this;if(a=b(a).split(j),a.length-1&&(c=d(a[1]),e=d(a[2]),f=d(a[3])),a=d(a[0]),null==c&&(c=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([[\"s\",a,c,e,f]])),this},A.translate=function(a,c){return this.removed?this:(a=b(a).split(j),a.length-1&&(c=d(a[1])),a=d(a[0])||0,c=+c||0,this.transform(this._.transform.concat([[\"t\",a,c]])),this)},A.transform=function(b){var d=this._;if(null==b)return d.transform;if(c._extractTransform(this,b),this.clip&&q(this.clip,{transform:this.matrix.invert()}),this.pattern&&s(this),this.node&&q(this.node,{transform:this.matrix}),1!=d.sx||1!=d.sy){var e=this.attrs[a](\"stroke-width\")?this.attrs[\"stroke-width\"]:1;this.attr({\"stroke-width\":e})}return this},A.hide=function(){return!this.removed&&this.paper.safari(this.node.style.display=\"none\"),this},A.show=function(){return!this.removed&&this.paper.safari(this.node.style.display=\"\"),this},A.remove=function(){if(!this.removed&&this.node.parentNode){var a=this.paper;a.__set__&&a.__set__.exclude(this),k.unbind(\"raphael.*.*.\"+this.id),this.gradient&&a.defs.removeChild(this.gradient),c._tear(this,a),\"a\"==this.node.parentNode.tagName.toLowerCase()?this.node.parentNode.parentNode.removeChild(this.node.parentNode):this.node.parentNode.removeChild(this.node);for(var b in this)this[b]=\"function\"==typeof this[b]?c._removedFactory(b):null;this.removed=!0}},A._getBBox=function(){if(\"none\"==this.node.style.display){this.show();var a=!0}var b={};try{b=this.node.getBBox()}catch(c){}finally{b=b||{}}return a&&this.hide(),b},A.attr=function(b,d){if(this.removed)return this;if(null==b){var e={};for(var f in this.attrs)this.attrs[a](f)&&(e[f]=this.attrs[f]);return e.gradient&&\"none\"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&c.is(b,\"string\")){if(\"fill\"==b&&\"none\"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;if(\"transform\"==b)return this._.transform;for(var g=b.split(j),h={},i=0,l=g.length;l>i;i++)b=g[i],h[b]=b in this.attrs?this.attrs[b]:c.is(this.paper.customAttributes[b],\"function\")?this.paper.customAttributes[b].def:c._availableAttrs[b];return l-1?h:h[g[0]]}if(null==d&&c.is(b,\"array\")){for(h={},i=0,l=b.length;l>i;i++)h[b[i]]=this.attr(b[i]);return h}if(null!=d){var m={};m[b]=d}else null!=b&&c.is(b,\"object\")&&(m=b);for(var n in m)k(\"raphael.attr.\"+n+\".\"+this.id,this,m[n]);for(n in this.paper.customAttributes)if(this.paper.customAttributes[a](n)&&m[a](n)&&c.is(this.paper.customAttributes[n],\"function\")){var o=this.paper.customAttributes[n].apply(this,[].concat(m[n]));this.attrs[n]=m[n];for(var p in o)o[a](p)&&(m[p]=o[p])}return w(this,m),this},A.toFront=function(){if(this.removed)return this;\"a\"==this.node.parentNode.tagName.toLowerCase()?this.node.parentNode.parentNode.appendChild(this.node.parentNode):this.node.parentNode.appendChild(this.node);var a=this.paper;return a.top!=this&&c._tofront(this,a),this},A.toBack=function(){if(this.removed)return this;var a=this.node.parentNode;\"a\"==a.tagName.toLowerCase()?a.parentNode.insertBefore(this.node.parentNode,this.node.parentNode.parentNode.firstChild):a.firstChild!=this.node&&a.insertBefore(this.node,this.node.parentNode.firstChild),c._toback(this,this.paper);this.paper;return this},A.insertAfter=function(a){if(this.removed)return this;var b=a.node||a[a.length-1].node;return b.nextSibling?b.parentNode.insertBefore(this.node,b.nextSibling):b.parentNode.appendChild(this.node),c._insertafter(this,a,this.paper),this},A.insertBefore=function(a){if(this.removed)return this;var b=a.node||a[0].node;return b.parentNode.insertBefore(this.node,b),c._insertbefore(this,a,this.paper),this},A.blur=function(a){var b=this;if(0!==+a){var d=q(\"filter\"),e=q(\"feGaussianBlur\");b.attrs.blur=a,d.id=c.createUUID(),q(e,{stdDeviation:+a||1.5}),d.appendChild(e),b.paper.defs.appendChild(d),b._blur=d,q(b.node,{filter:\"url(#\"+d.id+\")\"})}else b._blur&&(b._blur.parentNode.removeChild(b._blur),delete b._blur,delete b.attrs.blur),b.node.removeAttribute(\"filter\");return b},c._engine.circle=function(a,b,c,d){var e=q(\"circle\");a.canvas&&a.canvas.appendChild(e);var f=new z(e,a);return f.attrs={cx:b,cy:c,r:d,fill:\"none\",stroke:\"#000\"},f.type=\"circle\",q(e,f.attrs),f},c._engine.rect=function(a,b,c,d,e,f){var g=q(\"rect\");a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);return h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:\"none\",stroke:\"#000\"},h.type=\"rect\",q(g,h.attrs),h},c._engine.ellipse=function(a,b,c,d,e){var f=q(\"ellipse\");a.canvas&&a.canvas.appendChild(f);var g=new z(f,a);return g.attrs={cx:b,cy:c,rx:d,ry:e,fill:\"none\",stroke:\"#000\"},g.type=\"ellipse\",q(f,g.attrs),g},c._engine.image=function(a,b,c,d,e,f){var g=q(\"image\");q(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:\"none\"}),g.setAttributeNS(n,\"href\",b),a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);return h.attrs={x:c,y:d,width:e,height:f,src:b},h.type=\"image\",h},c._engine.text=function(a,b,d,e){var f=q(\"text\");a.canvas&&a.canvas.appendChild(f);var g=new z(f,a);return g.attrs={x:b,y:d,\"text-anchor\":\"middle\",text:e,font:c._availableAttrs.font,stroke:\"none\",fill:\"#000\"},g.type=\"text\",w(g,g.attrs),g},c._engine.setSize=function(a,b){return this.width=a||this.width,this.height=b||this.height,this.canvas.setAttribute(\"width\",this.width),this.canvas.setAttribute(\"height\",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox),this},c._engine.create=function(){var a=c._getContainer.apply(0,arguments),b=a&&a.container,d=a.x,e=a.y,f=a.width,g=a.height;if(!b)throw new Error(\"SVG container not found.\");var h,i=q(\"svg\"),j=\"overflow:hidden;\";return d=d||0,e=e||0,f=f||512,g=g||342,q(i,{height:g,version:1.1,width:f,xmlns:\"http://www.w3.org/2000/svg\"}),1==b?(i.style.cssText=j+\"position:absolute;left:\"+d+\"px;top:\"+e+\"px\",c._g.doc.body.appendChild(i),h=1):(i.style.cssText=j+\"position:relative\",b.firstChild?b.insertBefore(i,b.firstChild):b.appendChild(i)),b=new c._Paper,b.width=f,b.height=g,b.canvas=i,b.clear(),b._left=b._top=0,h&&(b.renderfix=function(){}),b.renderfix(),b},c._engine.setViewBox=function(a,b,c,d,e){k(\"raphael.setViewBox\",this,this._viewBox,[a,b,c,d,e]);var f,h,i=g(c/this.width,d/this.height),j=this.top,l=e?\"xMidYMid meet\":\"xMinYMin\";for(null==a?(this._vbSize&&(i=1),delete this._vbSize,f=\"0 0 \"+this.width+m+this.height):(this._vbSize=i,f=a+m+b+m+c+m+d),q(this.canvas,{viewBox:f,preserveAspectRatio:l});i&&j;)h=\"stroke-width\"in j.attrs?j.attrs[\"stroke-width\"]:1,j.attr({\"stroke-width\":h}),j._.dirty=1,j._.dirtyT=1,j=j.prev;return this._viewBox=[a,b,c,d,!!e],this},c.prototype.renderfix=function(){var a,b=this.canvas,c=b.style;try{a=b.getScreenCTM()||b.createSVGMatrix()}catch(d){a=b.createSVGMatrix()}var e=-a.e%1,f=-a.f%1;(e||f)&&(e&&(this._left=(this._left+e)%1,c.left=this._left+\"px\"),f&&(this._top=(this._top+f)%1,c.top=this._top+\"px\"))},c.prototype.clear=function(){c.eve(\"raphael.clear\",this);for(var a=this.canvas;a.firstChild;)a.removeChild(a.firstChild);this.bottom=this.top=null,(this.desc=q(\"desc\")).appendChild(c._g.doc.createTextNode(\"Created with Raphaël \"+c.version)),a.appendChild(this.desc),a.appendChild(this.defs=q(\"defs\"))},c.prototype.remove=function(){k(\"raphael.remove\",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=\"function\"==typeof this[a]?c._removedFactory(a):null};var B=c.st;for(var C in A)A[a](C)&&!B[a](C)&&(B[C]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(C))}}(),function(){if(c.vml){var a=\"hasOwnProperty\",b=String,d=parseFloat,e=Math,f=e.round,g=e.max,h=e.min,i=e.abs,j=\"fill\",k=/[, ]+/,l=c.eve,m=\" progid:DXImageTransform.Microsoft\",n=\" \",o=\"\",p={M:\"m\",L:\"l\",C:\"c\",Z:\"x\",m:\"t\",l:\"r\",c:\"v\",z:\"x\"},q=/([clmz]),?([^clmz]*)/gi,r=/ progid:\\S+Blur\\([^\\)]+\\)/g,s=/-?[^,\\s-]+/g,t=\"position:absolute;left:0;top:0;width:1px;height:1px\",u=21600,v={path:1,rect:1,image:1},w={circle:1,ellipse:1},x=function(a){var d=/[ahqstv]/gi,e=c._pathToAbsolute;if(b(a).match(d)&&(e=c._path2curve),d=/[clmz]/g,e==c._pathToAbsolute&&!b(a).match(d)){var g=b(a).replace(q,function(a,b,c){var d=[],e=\"m\"==b.toLowerCase(),g=p[b];return c.replace(s,function(a){e&&2==d.length&&(g+=d+p[\"m\"==b?\"l\":\"L\"],d=[]),d.push(f(a*u))}),g+d});return g}var h,i,j=e(a);g=[];for(var k=0,l=j.length;l>k;k++){h=j[k],i=j[k][0].toLowerCase(),\"z\"==i&&(i=\"x\");for(var m=1,r=h.length;r>m;m++)i+=f(h[m]*u)+(m!=r-1?\",\":o);g.push(i)}return g.join(n)},y=function(a,b,d){var e=c.matrix();return e.rotate(-a,.5,.5),{dx:e.x(b,d),dy:e.y(b,d)}},z=function(a,b,c,d,e,f){var g=a._,h=a.matrix,k=g.fillpos,l=a.node,m=l.style,o=1,p=\"\",q=u/b,r=u/c;if(m.visibility=\"hidden\",b&&c){if(l.coordsize=i(q)+n+i(r),m.rotation=f*(0>b*c?-1:1),f){var s=y(f,d,e);d=s.dx,e=s.dy}if(0>b&&(p+=\"x\"),0>c&&(p+=\" y\")&&(o=-1),m.flip=p,l.coordorigin=d*-q+n+e*-r,k||g.fillsize){var t=l.getElementsByTagName(j);t=t&&t[0],l.removeChild(t),k&&(s=y(f,h.x(k[0],k[1]),h.y(k[0],k[1])),t.position=s.dx*o+n+s.dy*o),g.fillsize&&(t.size=g.fillsize[0]*i(b)+n+g.fillsize[1]*i(c)),l.appendChild(t)}m.visibility=\"visible\"}};c.toString=function(){return\"Your browser doesn’t support SVG. Falling down to VML.\\nYou are running Raphaël \"+this.version};var A=function(a,c,d){for(var e=b(c).toLowerCase().split(\"-\"),f=d?\"end\":\"start\",g=e.length,h=\"classic\",i=\"medium\",j=\"medium\";g--;)switch(e[g]){case\"block\":case\"classic\":case\"oval\":case\"diamond\":case\"open\":case\"none\":h=e[g];break;case\"wide\":case\"narrow\":j=e[g];break;case\"long\":case\"short\":i=e[g]}var k=a.node.getElementsByTagName(\"stroke\")[0];k[f+\"arrow\"]=h,k[f+\"arrowlength\"]=i,k[f+\"arrowwidth\"]=j},B=function(e,i){e.attrs=e.attrs||{};var l=e.node,m=e.attrs,p=l.style,q=v[e.type]&&(i.x!=m.x||i.y!=m.y||i.width!=m.width||i.height!=m.height||i.cx!=m.cx||i.cy!=m.cy||i.rx!=m.rx||i.ry!=m.ry||i.r!=m.r),r=w[e.type]&&(m.cx!=i.cx||m.cy!=i.cy||m.r!=i.r||m.rx!=i.rx||m.ry!=i.ry),s=e;for(var t in i)i[a](t)&&(m[t]=i[t]);if(q&&(m.path=c._getPath[e.type](e),e._.dirty=1),i.href&&(l.href=i.href),i.title&&(l.title=i.title),i.target&&(l.target=i.target),i.cursor&&(p.cursor=i.cursor),\"blur\"in i&&e.blur(i.blur),(i.path&&\"path\"==e.type||q)&&(l.path=x(~b(m.path).toLowerCase().indexOf(\"r\")?c._pathToAbsolute(m.path):m.path),\"image\"==e.type&&(e._.fillpos=[m.x,m.y],e._.fillsize=[m.width,m.height],z(e,1,1,0,0,0))),\"transform\"in i&&e.transform(i.transform),r){var y=+m.cx,B=+m.cy,D=+m.rx||+m.r||0,E=+m.ry||+m.r||0;l.path=c.format(\"ar{0},{1},{2},{3},{4},{1},{4},{1}x\",f((y-D)*u),f((B-E)*u),f((y+D)*u),f((B+E)*u),f(y*u)),e._.dirty=1}if(\"clip-rect\"in i){var G=b(i[\"clip-rect\"]).split(k);if(4==G.length){G[2]=+G[2]+ +G[0],G[3]=+G[3]+ +G[1];var H=l.clipRect||c._g.doc.createElement(\"div\"),I=H.style;I.clip=c.format(\"rect({1}px {2}px {3}px {0}px)\",G),l.clipRect||(I.position=\"absolute\",I.top=0,I.left=0,I.width=e.paper.width+\"px\",I.height=e.paper.height+\"px\",l.parentNode.insertBefore(H,l),H.appendChild(l),l.clipRect=H)}i[\"clip-rect\"]||l.clipRect&&(l.clipRect.style.clip=\"auto\")}if(e.textpath){var J=e.textpath.style;i.font&&(J.font=i.font),i[\"font-family\"]&&(J.fontFamily='\"'+i[\"font-family\"].split(\",\")[0].replace(/^['\"]+|['\"]+$/g,o)+'\"'),i[\"font-size\"]&&(J.fontSize=i[\"font-size\"]),i[\"font-weight\"]&&(J.fontWeight=i[\"font-weight\"]),i[\"font-style\"]&&(J.fontStyle=i[\"font-style\"])}if(\"arrow-start\"in i&&A(s,i[\"arrow-start\"]),\"arrow-end\"in i&&A(s,i[\"arrow-end\"],1),null!=i.opacity||null!=i[\"stroke-width\"]||null!=i.fill||null!=i.src||null!=i.stroke||null!=i[\"stroke-width\"]||null!=i[\"stroke-opacity\"]||null!=i[\"fill-opacity\"]||null!=i[\"stroke-dasharray\"]||null!=i[\"stroke-miterlimit\"]||null!=i[\"stroke-linejoin\"]||null!=i[\"stroke-linecap\"]){var K=l.getElementsByTagName(j),L=!1;if(K=K&&K[0],!K&&(L=K=F(j)),\"image\"==e.type&&i.src&&(K.src=i.src),i.fill&&(K.on=!0),(null==K.on||\"none\"==i.fill||null===i.fill)&&(K.on=!1),K.on&&i.fill){var M=b(i.fill).match(c._ISURL);if(M){K.parentNode==l&&l.removeChild(K),K.rotate=!0,K.src=M[1],K.type=\"tile\";var N=e.getBBox(1);K.position=N.x+n+N.y,e._.fillpos=[N.x,N.y],c._preload(M[1],function(){e._.fillsize=[this.offsetWidth,this.offsetHeight]})}else K.color=c.getRGB(i.fill).hex,K.src=o,K.type=\"solid\",c.getRGB(i.fill).error&&(s.type in{circle:1,ellipse:1}||\"r\"!=b(i.fill).charAt())&&C(s,i.fill,K)&&(m.fill=\"none\",m.gradient=i.fill,K.rotate=!1)}if(\"fill-opacity\"in i||\"opacity\"in i){var O=((+m[\"fill-opacity\"]+1||2)-1)*((+m.opacity+1||2)-1)*((+c.getRGB(i.fill).o+1||2)-1);O=h(g(O,0),1),K.opacity=O,K.src&&(K.color=\"none\")}l.appendChild(K);var P=l.getElementsByTagName(\"stroke\")&&l.getElementsByTagName(\"stroke\")[0],Q=!1;!P&&(Q=P=F(\"stroke\")),(i.stroke&&\"none\"!=i.stroke||i[\"stroke-width\"]||null!=i[\"stroke-opacity\"]||i[\"stroke-dasharray\"]||i[\"stroke-miterlimit\"]||i[\"stroke-linejoin\"]||i[\"stroke-linecap\"])&&(P.on=!0),(\"none\"==i.stroke||null===i.stroke||null==P.on||0==i.stroke||0==i[\"stroke-width\"])&&(P.on=!1);var R=c.getRGB(i.stroke);P.on&&i.stroke&&(P.color=R.hex),O=((+m[\"stroke-opacity\"]+1||2)-1)*((+m.opacity+1||2)-1)*((+R.o+1||2)-1);var S=.75*(d(i[\"stroke-width\"])||1);if(O=h(g(O,0),1),null==i[\"stroke-width\"]&&(S=m[\"stroke-width\"]),i[\"stroke-width\"]&&(P.weight=S),S&&1>S&&(O*=S)&&(P.weight=1),P.opacity=O,i[\"stroke-linejoin\"]&&(P.joinstyle=i[\"stroke-linejoin\"]||\"miter\"),P.miterlimit=i[\"stroke-miterlimit\"]||8,i[\"stroke-linecap\"]&&(P.endcap=\"butt\"==i[\"stroke-linecap\"]?\"flat\":\"square\"==i[\"stroke-linecap\"]?\"square\":\"round\"),\"stroke-dasharray\"in i){var T={\"-\":\"shortdash\",\".\":\"shortdot\",\"-.\":\"shortdashdot\",\"-..\":\"shortdashdotdot\",\". \":\"dot\",\"- \":\"dash\",\"--\":\"longdash\",\"- .\":\"dashdot\",\"--.\":\"longdashdot\",\"--..\":\"longdashdotdot\"};P.dashstyle=T[a](i[\"stroke-dasharray\"])?T[i[\"stroke-dasharray\"]]:o}Q&&l.appendChild(P)}if(\"text\"==s.type){s.paper.canvas.style.display=o;var U=s.paper.span,V=100,W=m.font&&m.font.match(/\\d+(?:\\.\\d*)?(?=px)/);p=U.style,m.font&&(p.font=m.font),m[\"font-family\"]&&(p.fontFamily=m[\"font-family\"]),m[\"font-weight\"]&&(p.fontWeight=m[\"font-weight\"]),m[\"font-style\"]&&(p.fontStyle=m[\"font-style\"]),W=d(m[\"font-size\"]||W&&W[0])||10,p.fontSize=W*V+\"px\",s.textpath.string&&(U.innerHTML=b(s.textpath.string).replace(/</g,\"&#60;\").replace(/&/g,\"&#38;\").replace(/\\n/g,\"<br>\"));var X=U.getBoundingClientRect();s.W=m.w=(X.right-X.left)/V,s.H=m.h=(X.bottom-X.top)/V,s.X=m.x,s.Y=m.y+s.H/2,(\"x\"in i||\"y\"in i)&&(s.path.v=c.format(\"m{0},{1}l{2},{1}\",f(m.x*u),f(m.y*u),f(m.x*u)+1));for(var Y=[\"x\",\"y\",\"text\",\"font\",\"font-family\",\"font-weight\",\"font-style\",\"font-size\"],Z=0,$=Y.length;$>Z;Z++)if(Y[Z]in i){s._.dirty=1;break}switch(m[\"text-anchor\"]){case\"start\":s.textpath.style[\"v-text-align\"]=\"left\",s.bbx=s.W/2;break;case\"end\":s.textpath.style[\"v-text-align\"]=\"right\",s.bbx=-s.W/2;break;default:s.textpath.style[\"v-text-align\"]=\"center\",s.bbx=0}s.textpath.style[\"v-text-kern\"]=!0}},C=function(a,f,g){a.attrs=a.attrs||{};var h=(a.attrs,Math.pow),i=\"linear\",j=\".5 .5\";if(a.attrs.gradient=f,f=b(f).replace(c._radial_gradient,function(a,b,c){return i=\"radial\",b&&c&&(b=d(b),c=d(c),h(b-.5,2)+h(c-.5,2)>.25&&(c=e.sqrt(.25-h(b-.5,2))*(2*(c>.5)-1)+.5),j=b+n+c),o}),f=f.split(/\\s*\\-\\s*/),\"linear\"==i){var k=f.shift();if(k=-d(k),isNaN(k))return null}var l=c._parseDots(f);if(!l)return null;if(a=a.shape||a.node,l.length){a.removeChild(g),g.on=!0,g.method=\"none\",g.color=l[0].color,g.color2=l[l.length-1].color;for(var m=[],p=0,q=l.length;q>p;p++)l[p].offset&&m.push(l[p].offset+n+l[p].color);g.colors=m.length?m.join():\"0% \"+g.color,\"radial\"==i?(g.type=\"gradientTitle\",g.focus=\"100%\",g.focussize=\"0 0\",g.focusposition=j,g.angle=0):(g.type=\"gradient\",g.angle=(270-k)%360),a.appendChild(g)}return 1},D=function(a,b){this[0]=this.node=a,a.raphael=!0,this.id=c._oid++,a.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=b,this.matrix=c.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!b.bottom&&(b.bottom=this),this.prev=b.top,b.top&&(b.top.next=this),b.top=this,this.next=null},E=c.el;D.prototype=E,E.constructor=D,E.transform=function(a){if(null==a)return this._.transform;var d,e=this.paper._viewBoxShift,f=e?\"s\"+[e.scale,e.scale]+\"-1-1t\"+[e.dx,e.dy]:o;e&&(d=a=b(a).replace(/\\.{3}|\\u2026/g,this._.transform||o)),c._extractTransform(this,f+a);var g,h=this.matrix.clone(),i=this.skew,j=this.node,k=~b(this.attrs.fill).indexOf(\"-\"),l=!b(this.attrs.fill).indexOf(\"url(\");if(h.translate(1,1),l||k||\"image\"==this.type)if(i.matrix=\"1 0 0 1\",i.offset=\"0 0\",g=h.split(),k&&g.noRotation||!g.isSimple){j.style.filter=h.toFilter();var m=this.getBBox(),p=this.getBBox(1),q=m.x-p.x,r=m.y-p.y;j.coordorigin=q*-u+n+r*-u,z(this,1,1,q,r,0)}else j.style.filter=o,z(this,g.scalex,g.scaley,g.dx,g.dy,g.rotate);else j.style.filter=o,i.matrix=b(h),i.offset=h.offset();return d&&(this._.transform=d),this},E.rotate=function(a,c,e){if(this.removed)return this;if(null!=a){if(a=b(a).split(k),a.length-1&&(c=d(a[1]),e=d(a[2])),a=d(a[0]),null==e&&(c=e),null==c||null==e){var f=this.getBBox(1);c=f.x+f.width/2,e=f.y+f.height/2}return this._.dirtyT=1,this.transform(this._.transform.concat([[\"r\",a,c,e]])),this}},E.translate=function(a,c){return this.removed?this:(a=b(a).split(k),a.length-1&&(c=d(a[1])),a=d(a[0])||0,c=+c||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=c),this.transform(this._.transform.concat([[\"t\",a,c]])),this)},E.scale=function(a,c,e,f){if(this.removed)return this;if(a=b(a).split(k),a.length-1&&(c=d(a[1]),e=d(a[2]),f=d(a[3]),isNaN(e)&&(e=null),isNaN(f)&&(f=null)),a=d(a[0]),null==c&&(c=a),null==f&&(e=f),null==e||null==f)var g=this.getBBox(1);return e=null==e?g.x+g.width/2:e,f=null==f?g.y+g.height/2:f,this.transform(this._.transform.concat([[\"s\",a,c,e,f]])),this._.dirtyT=1,this},E.hide=function(){return!this.removed&&(this.node.style.display=\"none\"),this},E.show=function(){return!this.removed&&(this.node.style.display=o),this},E._getBBox=function(){return this.removed?{}:{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed&&this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),c.eve.unbind(\"raphael.*.*.\"+this.id),c._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var a in this)this[a]=\"function\"==typeof this[a]?c._removedFactory(a):null;this.removed=!0}},E.attr=function(b,d){if(this.removed)return this;if(null==b){var e={};for(var f in this.attrs)this.attrs[a](f)&&(e[f]=this.attrs[f]);return e.gradient&&\"none\"==e.fill&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform,e}if(null==d&&c.is(b,\"string\")){if(b==j&&\"none\"==this.attrs.fill&&this.attrs.gradient)return this.attrs.gradient;for(var g=b.split(k),h={},i=0,m=g.length;m>i;i++)b=g[i],h[b]=b in this.attrs?this.attrs[b]:c.is(this.paper.customAttributes[b],\"function\")?this.paper.customAttributes[b].def:c._availableAttrs[b];return m-1?h:h[g[0]]}if(this.attrs&&null==d&&c.is(b,\"array\")){for(h={},i=0,m=b.length;m>i;i++)h[b[i]]=this.attr(b[i]);return h}var n;null!=d&&(n={},n[b]=d),null==d&&c.is(b,\"object\")&&(n=b);for(var o in n)l(\"raphael.attr.\"+o+\".\"+this.id,this,n[o]);if(n){for(o in this.paper.customAttributes)if(this.paper.customAttributes[a](o)&&n[a](o)&&c.is(this.paper.customAttributes[o],\"function\")){var p=this.paper.customAttributes[o].apply(this,[].concat(n[o]));this.attrs[o]=n[o];for(var q in p)p[a](q)&&(n[q]=p[q])}n.text&&\"text\"==this.type&&(this.textpath.string=n.text),B(this,n)}return this},E.toFront=function(){return!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&c._tofront(this,this.paper),this},E.toBack=function(){return this.removed?this:(this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),c._toback(this,this.paper)),this)},E.insertAfter=function(a){return this.removed?this:(a.constructor==c.st.constructor&&(a=a[a.length-1]),a.node.nextSibling?a.node.parentNode.insertBefore(this.node,a.node.nextSibling):a.node.parentNode.appendChild(this.node),c._insertafter(this,a,this.paper),this)},E.insertBefore=function(a){return this.removed?this:(a.constructor==c.st.constructor&&(a=a[0]),a.node.parentNode.insertBefore(this.node,a.node),c._insertbefore(this,a,this.paper),this)},E.blur=function(a){var b=this.node.runtimeStyle,d=b.filter;return d=d.replace(r,o),0!==+a?(this.attrs.blur=a,b.filter=d+n+m+\".Blur(pixelradius=\"+(+a||1.5)+\")\",b.margin=c.format(\"-{0}px 0 0 -{0}px\",f(+a||1.5))):(b.filter=d,b.margin=0,delete this.attrs.blur),this},c._engine.path=function(a,b){var c=F(\"shape\");c.style.cssText=t,c.coordsize=u+n+u,c.coordorigin=b.coordorigin;var d=new D(c,b),e={fill:\"none\",stroke:\"#000\"};a&&(e.path=a),d.type=\"path\",d.path=[],d.Path=o,B(d,e),b.canvas.appendChild(c);var f=F(\"skew\");return f.on=!0,c.appendChild(f),d.skew=f,d.transform(o),d},c._engine.rect=function(a,b,d,e,f,g){var h=c._rectPath(b,d,e,f,g),i=a.path(h),j=i.attrs;return i.X=j.x=b,i.Y=j.y=d,i.W=j.width=e,i.H=j.height=f,j.r=g,j.path=h,i.type=\"rect\",i},c._engine.ellipse=function(a,b,c,d,e){{var f=a.path();f.attrs}return f.X=b-d,f.Y=c-e,f.W=2*d,f.H=2*e,f.type=\"ellipse\",B(f,{cx:b,cy:c,rx:d,ry:e}),f},c._engine.circle=function(a,b,c,d){{var e=a.path();e.attrs}return e.X=b-d,e.Y=c-d,e.W=e.H=2*d,e.type=\"circle\",B(e,{cx:b,cy:c,r:d}),e},c._engine.image=function(a,b,d,e,f,g){var h=c._rectPath(d,e,f,g),i=a.path(h).attr({stroke:\"none\"}),k=i.attrs,l=i.node,m=l.getElementsByTagName(j)[0];return k.src=b,i.X=k.x=d,i.Y=k.y=e,i.W=k.width=f,i.H=k.height=g,k.path=h,i.type=\"image\",m.parentNode==l&&l.removeChild(m),m.rotate=!0,m.src=b,m.type=\"tile\",i._.fillpos=[d,e],i._.fillsize=[f,g],l.appendChild(m),z(i,1,1,0,0,0),i},c._engine.text=function(a,d,e,g){var h=F(\"shape\"),i=F(\"path\"),j=F(\"textpath\");d=d||0,e=e||0,g=g||\"\",i.v=c.format(\"m{0},{1}l{2},{1}\",f(d*u),f(e*u),f(d*u)+1),i.textpathok=!0,j.string=b(g),j.on=!0,h.style.cssText=t,h.coordsize=u+n+u,h.coordorigin=\"0 0\";var k=new D(h,a),l={fill:\"#000\",stroke:\"none\",font:c._availableAttrs.font,text:g};k.shape=h,k.path=i,k.textpath=j,k.type=\"text\",k.attrs.text=b(g),k.attrs.x=d,k.attrs.y=e,k.attrs.w=1,k.attrs.h=1,B(k,l),h.appendChild(j),h.appendChild(i),a.canvas.appendChild(h);var m=F(\"skew\");return m.on=!0,h.appendChild(m),k.skew=m,k.transform(o),k},c._engine.setSize=function(a,b){var d=this.canvas.style;return this.width=a,this.height=b,a==+a&&(a+=\"px\"),b==+b&&(b+=\"px\"),d.width=a,d.height=b,d.clip=\"rect(0 \"+a+\" \"+b+\" 0)\",this._viewBox&&c._engine.setViewBox.apply(this,this._viewBox),this},c._engine.setViewBox=function(a,b,d,e,f){c.eve(\"raphael.setViewBox\",this,this._viewBox,[a,b,d,e,f]);var h,i,j=this.width,k=this.height,l=1/g(d/j,e/k);return f&&(h=k/e,i=j/d,j>d*h&&(a-=(j-d*h)/2/h),k>e*i&&(b-=(k-e*i)/2/i)),this._viewBox=[a,b,d,e,!!f],this._viewBoxShift={dx:-a,dy:-b,scale:l},this.forEach(function(a){a.transform(\"...\")}),this};var F;c._engine.initWin=function(a){var b=a.document;b.createStyleSheet().addRule(\".rvml\",\"behavior:url(#default#VML)\");try{!b.namespaces.rvml&&b.namespaces.add(\"rvml\",\"urn:schemas-microsoft-com:vml\"),F=function(a){return b.createElement(\"<rvml:\"+a+' class=\"rvml\">')}}catch(c){F=function(a){return b.createElement(\"<\"+a+' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"rvml\">')}}},c._engine.initWin(c._g.win),c._engine.create=function(){var a=c._getContainer.apply(0,arguments),b=a.container,d=a.height,e=a.width,f=a.x,g=a.y;if(!b)throw new Error(\"VML container not found.\");var h=new c._Paper,i=h.canvas=c._g.doc.createElement(\"div\"),j=i.style;return f=f||0,g=g||0,e=e||512,d=d||342,h.width=e,h.height=d,e==+e&&(e+=\"px\"),d==+d&&(d+=\"px\"),h.coordsize=1e3*u+n+1e3*u,h.coordorigin=\"0 0\",h.span=c._g.doc.createElement(\"span\"),h.span.style.cssText=\"position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;\",i.appendChild(h.span),j.cssText=c.format(\"top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden\",e,d),1==b?(c._g.doc.body.appendChild(i),j.left=f+\"px\",j.top=g+\"px\",j.position=\"absolute\"):b.firstChild?b.insertBefore(i,b.firstChild):b.appendChild(i),h.renderfix=function(){},h},c.prototype.clear=function(){c.eve(\"raphael.clear\",this),this.canvas.innerHTML=o,this.span=c._g.doc.createElement(\"span\"),this.span.style.cssText=\"position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;\",this.canvas.appendChild(this.span),this.bottom=this.top=null},c.prototype.remove=function(){c.eve(\"raphael.remove\",this),this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=\"function\"==typeof this[a]?c._removedFactory(a):null;return!0};var G=c.st;for(var H in E)E[a](H)&&!G[a](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}}(),B.was?A.win.Raphael=c:Raphael=c,c});"
  },
  {
    "path": "examples/worzone/maze.js",
    "content": "(function (Game) {\n  var mazes = [\n    [ \"*******************\",\n    \"* *\",\n    \"* ******* ****** *\",\n    \"* * * *\",\n    \"* * ******* * *\",\n    \"* * * * * *\",\n    \"* * * *\",\n    \"* C *\",\n    \"* * ******* * *\",\n    \"* * * *\",\n    \"* * * *\",\n    \"* * * *\",\n    \"* ******* ****** *\",\n    \"* *\",\n    \"* *************** *\",\n    \"*1*5XXXXXLXXXX60*2*\",\n    \"***XXXXXXXXXXXXX***\" ],\n    [ \"*******************\",\n    \"* *\",\n    \"* ******* ****** *\",\n    \"* * * *\",\n    \"* * * ******* * * *\",\n    \"* * * * * * * *\",\n    \"* * * * * * * *\",\n    \"* * * C * *\",\n    \"* * * *** *** *****\",\n    \"* * * * * * * *\",\n    \"* * * * * * * * * *\",\n    \"* * * * *\",\n    \"***** *** * ***** *\",\n    \"* * * *\",\n    \"* *************** *\",\n    \"*1*5XXXXXLXXXX60*2*\",\n    \"***XXXXXXXXXXXXX***\" ]\n  ];\n\n\n  function Maze(level) {\n\n    var data = mazes[(level + 1) % 2],\n        blockSize = 50,\n        wall = 5,\n        ascii = new Game.AsciiGraphic(data, blockSize, wall);\n\n    function isWall(blockPos) { return ascii.isChar(blockPos, \"*\"); }\n\n    function isFree(blockPos) { return ascii.isChar(blockPos, \"C \"); }\n\n    function findMazePos(character) {\n      function blockThat(predicate) {\n        return ascii.forEachBlock(function(blockPos) {\n          if (predicate(blockPos)) { return blockPos; }\n        });\n      }\n      return blockThat(function(blockPos) { return ascii.isChar(blockPos, character)});\n    }\n\n    function accessible(pos, objectRadiusX, objectRadiusY, predicate) {\n      objectRadiusY || (objectRadiusY = objectRadiusX);\n\n      var radiusX = objectRadiusX,\n          radiusY = objectRadiusY;\n\n      for (var x = ascii.toBlockX(pos.x - radiusX); x <= ascii.toBlockX(pos.x + radiusX); x++) {\n        for (var y = ascii.toBlockY(pos.y - radiusY); y <= ascii.toBlockY(pos.y + radiusY); y++) {\n          if (!predicate(new Point(x, y))) { return false; }\n        }\n      }\n      return true;\n    }\n    return {\n      levelNumberPos : function() {\n        return ascii.blockCenter(findMazePos(\"L\"))\n      },\n      centerMessagePos : function() {\n        return ascii.blockCenter(findMazePos(\"C\"))\n      },\n      playerStartPos : function(player) {\n        return ascii.blockCenter(findMazePos(\"\" + player.id))\n      },\n      playerScorePos : function(player) {\n        var number = Number(player.id) + 4\n        return ascii.blockCenter(findMazePos(\"\" + number))\n      },\n      isAccessible : function(pos, objectRadiusX, objectRadiusY) {\n        return accessible(pos, objectRadiusX, objectRadiusY, function(blockPos) { return !isWall(blockPos) })\n      },\n      isAccessibleByMonster : function(pos, objectRadiusX, objectRadiusY) {\n        return accessible(pos, objectRadiusX, objectRadiusY, function(blockPos) { return isFree(blockPos) })\n      },\n      randomFreePos : function(filter) {\n        while(true) {\n          var pixelPos = ascii.blockCenter(ascii.randomBlock());\n          if (filter(pixelPos)) { return pixelPos; }\n        }\n      },\n      draw : function(levelEnd, raphael) {\n        var elements = ascii.renderWith(raphael, function(block) {\n          if (isWall(block)) {\n            var corner = ascii.blockCorner(block),\n                size = ascii.sizeOf(block);\n            return raphael.rect(corner.x, corner.y, size.x, size.y).attr({ stroke : \"#008\", fill : \"#008\"});\n          }\n        });\n\n        levelEnd.subscribeOnNext(function() {\n          elements.remove()\n        });\n      }\n    }\n  }\n\n  Game.Maze = Maze;\n}(window.Game));\n"
  },
  {
    "path": "examples/worzone/readme.md",
    "content": ""
  },
  {
    "path": "examples/worzone/rectangle.js",
    "content": "(function (Game) {\n  \n  function Rectangle(x, y, width, height) {\n    return {x : x, y : y, width : width, height : height}\n  }\n\n  Game.Rectangle = Rectangle;\n}(window.Game));\n"
  },
  {
    "path": "examples/worzone/rx.dom.lite.js",
    "content": ";(function (factory) {\n  var objectTypes = {\n    'boolean': false,\n    'function': true,\n    'object': true,\n    'number': false,\n    'string': false,\n    'undefined': false\n  };\n\n  var root = (objectTypes[typeof window] && window) || this,\n  freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n  freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n  moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n  freeGlobal = objectTypes[typeof global] && global;\n\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n    root = freeGlobal;\n  }\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['rx'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('./rx'));\n  } else {\n    root.dom = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Header values\n  var AnonymousObservable = Rx.AnonymousObservable,\n      fromEvent = Rx.Observable.fromEvent;\n\n  function noop () { }\n\n  var dom = {\n    ready: function () {\n      return new AnonymousObservable(function (observer) {\n        function handler () {\n          observer.onNext();\n          observer.onCompleted();\n        }\n        function createListener() {\n          if (document.addEventListener) {\n            document.addEventListener( 'DOMContentLoaded', handler, false );\n            root.addEventListener( 'load', handler, false );\n            return function () {\n              document.removeEventListener( 'DOMContentLoaded', handler, false );\n              root.removeEventListener( 'load', handler, false );\n            };\n          } else if (document.attachEvent) {\n            document.attachEvent( 'onDOMContentLoaded', handler );\n            root.attachEvent( 'onload', handler );\n            return function () {\n              document.attachEvent( 'DOMContentLoaded', handler );\n              root.attachEvent( 'load', handler );\n            };\n          } else {\n            document['onload'] = handler;\n            root['onDOMContentLoaded'] = handler;\n            return function () {\n              document['onload'] = null;\n              root['onDOMContentLoaded'] = null;\n            };\n          }\n        }\n        var returnFn = noop;\n        if (document.readyState === \"complete\") {\n          setTimeout(handler, 0);\n        } else {\n          returnFn = createListener();\n        }\n        return returnFn;\n      }).publish().refCount();\n    }\n  };\n\n  // Add every event possible to dom\n  (function () {\n    var events = \"blur focus focusin focusout load resize scroll unload click dblclick \" +\n    \"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n    \"change select submit keydown keypress keyup error contextmenu\";\n\n    if (root.PointerEvent) {\n      events += \" pointerdown pointerup pointermove pointerover pointerout pointerenter pointerleave\";\n    }\n\n    if (root.TouchEvent) {\n      events += \" touchstart touchend touchmove touchcancel\";\n    }\n\n    events = events.split(' ');\n\n    for(var i = 0, len = events.length; i < len; i++) {\n      (function (e) {\n        dom[e] = function (element, selector) {\n          return fromEvent(element, e, selector);\n        };\n      }(events[i]))\n    }\n  }());\n\n  return dom;\n}));\n"
  },
  {
    "path": "examples/worzone/vector.js",
    "content": "// Originally from https://github.com/raimohanska/worzone\n\n;(function (global) {\n\n  function Point(x, y) {\n    return new Vector2D(x, y);\n  }\n\n  // Number -> Number -> Vector2D\n  function Vector2D(x, y) {\n    this.x = x;\n    this.y = y;\n  }\n\n  Vector2D.prototype = {\n    // Vector2D -> Vector2D\n    add : function(other) { return new Vector2D(this.x + other.x, this.y + other.y); },\n    // Vector2D -> Vector2D\n    subtract : function(other) { return new Vector2D(this.x - other.x, this.y - other.y); },\n    // Unit -> Number\n    getLength : function() { return Math.sqrt(this.x * this.x + this.y * this.y); },\n    // Number -> Vector2D\n    times : function(multiplier) { return new Vector2D(this.x * multiplier, this.y * multiplier); },\n    // Unit -> Vector2D\n    invert : function() { return new Vector2D(-this.x, -this.y); },\n    // Number -> Vector2D\n    withLength : function(newLength) { return this.times(newLength / this.getLength()); },\n\n    rotateRad : function(radians) {\n      var length = this.getLength(),\n          currentRadians = this.getAngle(),\n          resultRadians = radians + currentRadians,\n          rotatedUnit = new Vector2D(Math.cos(resultRadians), Math.sin(resultRadians));\n      return rotatedUnit.withLength(length);\n    },\n\n    // Number -> Vector2D\n    rotateDeg : function(degrees) {\n      var radians = degrees * 2 * Math.PI / 360;\n      return this.rotateRad(radians);\n    },\n\n    // Unit -> Number\n    getAngle : function() {\n      var length = this.getLength(),\n          unit = this.withLength(1);\n      return Math.atan2(unit.y, unit.x);\n    },\n\n    getAngleDeg : function() {\n      return this.getAngle() * 360 / (2 * Math.PI);\n    },\n\n    floor : function() {\n      return new Vector2D(Math.floor(this.x), Math.floor(this.y));\n    },\n\n    toString : function() {\n      return '(' + x + ', ' + y + ')';\n    }\n  };\n\n  global.Game = {\n    Point: Point,\n    Vector2D: Vector2D\n  };\n\n}(window));\n"
  },
  {
    "path": "examples/wsh/example1.js",
    "content": "function include(jsFile) {\n  var fso = new ActiveXObject(\"Scripting.FileSystemObject\"),\n    f = fso.OpenTextFile(jsFile, 1),\n    s = f.ReadAll();\n  f.Close();\n  return s;\n}\n\neval(include(\"..\\\\..\\\\dist\\\\rx.all.js\"));\n\nfunction next(x) {\n  WScript.Echo(x);\n}\n\nRx.Observable.timer(500).subscribe(next);\n"
  },
  {
    "path": "examples/wsh/readme.md",
    "content": ""
  },
  {
    "path": "index.js",
    "content": "var Rx = require('./dist/rx');\nrequire('./dist/rx.aggregates');\nrequire('./dist/rx.async');\nrequire('./dist/rx.backpressure');\nrequire('./dist/rx.binding');\nrequire('./dist/rx.coincidence');\nrequire('./dist/rx.experimental');\nrequire('./dist/rx.joinpatterns');\nrequire('./dist/rx.sorting');\nrequire('./dist/rx.virtualtime');\nrequire('./dist/rx.testing');\nrequire('./dist/rx.time');\n\nmodule.exports = Rx;\n"
  },
  {
    "path": "lib/anonymousobserver.js",
    "content": "'use strict';\n\nvar AnonymousSafeObserver = require('./anonymousobserver');\nvar ObserverBase = require('./observerbase');\nvar inherits = require('inherits');\n\nfunction AnonymousObserver(next, error, complete) {\n  this._next = next;\n  this._error = error;\n  this._complete = complete;\n  ObserverBase.call(this);\n}\n\ninherits(AnonymousObserver, ObserverBase);\n\nAnonymousObserver.prototype.makeSafe = function (d) {\n  return new AnonymousSafeObserver(this._next.bind(this), this._error.bind(this), this._complete.bind(this), d);\n};\n\nmodule.exports = AnonymousObserver;"
  },
  {
    "path": "lib/anonymoussafeobserver.js",
    "content": "'use strict';\n\nfunction AnonymousSafeObserver(next, error, complete, disposable) {\n  this._next = next;\n  this._error = error;\n  this._complete = complete;\n  this._disposable = disposable;\n  this._stopped = false;\n}\n\nAnonymousSafeObserver.prototype.next = function (x) {\n  if (this._stopped) { return; }\n  var noError = false;\n  try {\n    this._next(x);\n    noError = true;\n  } finally {\n    !noError && this._disposable.dispose();\n  }\n};\n\nAnonymousSafeObserver.prototype.error = function (e) {\n  if (!this._stopped) {\n    try {\n      this._error(e);\n    } finally {\n      this._disposable.dispose();\n    }\n  }\n};\n\nAnonymousSafeObserver.prototype.complete = function () {\n  if (!this._stopped) {\n    try {\n      this._complete();\n    } finally {\n      this._disposable.dispose();\n    }\n  }  \n};\n\nmodule.exports = AnonymousSafeObserver;"
  },
  {
    "path": "lib/concurrency/queuescheduler.js",
    "content": "'use strict';\n\nvar Scheduler = require('./scheduler');\nvar ScheduledItem = require('./scheduleditem');\nvar PriorityQueue = require('../internal/priorityqueue');\nvar inherits = require('inherits');\n\nfunction QueueScheduler() {\n  Scheduler.call(this);\n}\n\nQueueScheduler.queue = null;\n\ninherits(QueueScheduler, Scheduler);\n\nfunction runTrampoline () {\n  while (QueueScheduler.queue.length > 0) {\n    var item = QueueScheduler.queue.dequeue();\n    !item.isCancelled() && item.invoke();\n  }\n}\n\nQueueScheduler.prototype.schedule = function (state, action) {\n  var si = new ScheduledItem(this, state, action, this.now());\n\n  if (!QueueScheduler.queue) {\n    QueueScheduler.queue = new PriorityQueue(4);\n    QueueScheduler.queue.enqueue(si);\n\n    try {\n      runTrampoline();\n    } finally {\n      QueueScheduler.queue = null;\n    }\n  } else {\n    QueueScheduler.queue.enqueue(si);\n  }\n  return si.disposable;\n};\n\nQueueScheduler.prototype.scheduleRequired = function () { return !QueueScheduler.queue; };\n\nmodule.exports = QueueScheduler;\n"
  },
  {
    "path": "lib/concurrency/scheduler.js",
    "content": "'use strict';\n\nvar Disposable = require('../disposables/disposable');\nvar CompositeDisposable = require('../disposables/compositedisposable');\n\nfunction Scheduler() { }\n\n/** Determines whether the given object is a scheduler */\nScheduler.isScheduler = function (s) {\n  return s instanceof Scheduler;\n};\n\n/**\n* Schedules an action to be executed.\n* @param state State passed to the action to be executed.\n* @param {Function} action Action to be executed.\n* @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n*/\nScheduler.prototype.schedule = function (state, action) { };\n\n/**\n* Schedules an action to be executed after dueTime.\n* @param state State passed to the action to be executed.\n* @param {Function} action Action to be executed.\n* @param {Number} dueTime Relative time after which to execute the action.\n* @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n*/\nScheduler.prototype.scheduleFuture = function (state, dueTime, action) {\n  var dt = dueTime;\n  dt instanceof Date && (dt = dt - this.now());\n  dt = Scheduler.normalize(dt);\n\n  if (dt === 0) { return this.schedule(state, action); }\n\n  return this._scheduleFuture(state, dt, action);\n};\n\nScheduler.prototype._scheduleFuture = function (state, dueTime, action) { };\n\nfunction PeriodicDisposable(id) {\n  this._id = id;\n  this.isDisposed = false;\n}\n\nPeriodicDisposable.prototype.dispose = function () {\n  if (!this.isDisposed) {\n    this.isDisposed = true;\n    global.clearInterval(this._id);\n  }\n};\n\n/**\n * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n * @param {Mixed} state Initial state passed to the action upon the first iteration.\n * @param {Number} period Period for running the work periodically.\n * @param {Function} action Action to be executed, potentially updating the state.\n * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n */\nScheduler.prototype.schedulePeriodic = function(state, period, action) {\n  if (typeof global.setInterval === 'undefined') { throw new Error('setInterval not supported'); }\n  period = Scheduler.normalize(period);\n  var s = state, id = global.setInterval(function () { s = action(s); }, period);\n  return new PeriodicDisposable(id);\n};\n\nfunction invokeRecImmediate(scheduler, pair) {\n  var state = pair[0], action = pair[1], group = new CompositeDisposable();\n  action(state, innerAction);\n  return group;\n\n  function innerAction(state2) {\n    var isAdded = false, isDone = false;\n\n    var d = scheduler.schedule(state2, scheduleWork);\n    if (!isDone) {\n      group.add(d);\n      isAdded = true;\n    }\n\n    function scheduleWork(_, state3) {\n      if (isAdded) {\n        group.remove(d);\n      } else {\n        isDone = true;\n      }\n      action(state3, innerAction);\n      return Disposable.empty;\n    }\n  }\n}\n\nfunction invokeRecDate(scheduler, pair) {\n  var state = pair[0], action = pair[1], group = new CompositeDisposable();\n  action(state, innerAction);\n  return group;\n\n  function innerAction(state2, dueTime1) {\n    var isAdded = false, isDone = false;\n\n    var d = scheduler.scheduleFuture(state2, dueTime1, scheduleWork);\n    if (!isDone) {\n      group.add(d);\n      isAdded = true;\n    }\n\n    function scheduleWork(_, state3) {\n      if (isAdded) {\n        group.remove(d);\n      } else {\n        isDone = true;\n      }\n      action(state3, innerAction);\n      return Disposable.empty;\n    }\n  }\n}\n\n/**\n * Schedules an action to be executed recursively.\n * @param {Mixed} state State passed to the action to be executed.\n * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n */\nScheduler.prototype.scheduleRecursive = function (state, action) {\n  return this.schedule([state, action], invokeRecImmediate);\n};\n\n/**\n * Schedules an action to be executed recursively after a specified relative or absolute due time.\n * @param {Mixed} state State passed to the action to be executed.\n * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n * @param {Number | Date} dueTime Relative or absolute time after which to execute the action for the first time.\n * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n */\nScheduler.prototype.scheduleRecursiveFuture = function (state, dueTime, action) {\n  return this.scheduleFuture([state, action], dueTime, invokeRecDate);\n};\n\nvar defaultNow = (function () { return !!Date.now ? Date.now : function () { return +new Date(); }; }());\n\n/** Gets the current time according to the local machine's system clock. */\nScheduler.now = defaultNow;\n\n/** Gets the current time according to the local machine's system clock. */\nScheduler.prototype.now = defaultNow;\n\n/**\n * Normalizes the specified TimeSpan value to a positive value.\n * @param {Number} timeSpan The time span value to normalize.\n * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n */\nScheduler.normalize = function (timeSpan) {\n  timeSpan < 0 && (timeSpan = 0);\n  return timeSpan;\n};\n\nmodule.exports = Scheduler;\n\nvar CurrentThreadScheduler = require('./scheduler/currentthreadscheduler');\nvar ImmediateScheduler = require('./scheduler/immediatescheduler');\nvar DefaultScheduler = require('./scheduler/defaultscheduler');\nvar CatchScheduler = require('./scheduler/catchscheduler');\n\nScheduler.queue = Scheduler.currentThread = new CurrentThreadScheduler();\nScheduler.async = Scheduler['default'] = Scheduler.timeout = new DefaultScheduler();\nScheduler.immediate = new ImmediateScheduler();\n\n/**\n * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n */\nScheduler.prototype['catch'] = function (handler) {\n  return new CatchScheduler(this, handler);\n};\n"
  },
  {
    "path": "lib/disposables/binarydisposable.js",
    "content": "'use strict';\n\nfunction BinaryDisposable(first, second) {\n  this._first = first;\n  this._second = second;\n  this.isDisposed = false;\n}\n\nBinaryDisposable.prototype.dispose = BinaryDisposable.prototype.unsubscribe = function () {\n  if (!this.isDisposed) {\n    this.isDisposed = true;\n    var old1 = this._first;\n    this._first = null;\n    old1 && old1.dispose();\n    var old2 = this._second;\n    this._second = null;\n    old2 && old2.dispose();\n  }\n};\n\nmodule.exports = BinaryDisposable;\n"
  },
  {
    "path": "lib/disposables/compositedisposable.js",
    "content": "'use strict';\n\n/**\n * Represents a group of disposable resources that are disposed together.\n * @constructor\n */\nfunction CompositeDisposable () {\n  var args = [], i, len;\n  if (Array.isArray(arguments[0])) {\n    args = arguments[0];\n    len = args.length;\n  } else {\n    len = arguments.length;\n    args = new Array(len);\n    for(i = 0; i < len; i++) { args[i] = arguments[i]; }\n  }\n  this.disposables = args;\n  this.isDisposed = false;\n  this.length = args.length;\n}\n\n/**\n * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n * @param {Mixed} item Disposable to add.\n */\nCompositeDisposable.prototype.add = function (item) {\n  if (this.isDisposed) {\n    item.dispose();\n  } else {\n    this.disposables.push(item);\n    this.length++;\n  }\n};\n\n/**\n * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n * @param {Mixed} item Disposable to remove.\n * @returns {Boolean} true if found; false otherwise.\n */\nCompositeDisposable.prototype.remove = function (item) {\n  var shouldDispose = false;\n  if (!this.isDisposed) {\n    var idx = this.disposables.indexOf(item);\n    if (idx !== -1) {\n      shouldDispose = true;\n      this.disposables.splice(idx, 1);\n      this.length--;\n      item.dispose();\n    }\n  }\n  return shouldDispose;\n};\n\n/**\n *  Disposes all disposables in the group and removes them from the group.\n */\nCompositeDisposable.prototype.dispose = CompositeDisposable.prototype.unsubscribe = function () {\n  if (!this.isDisposed) {\n    this.isDisposed = true;\n    var len = this.disposables.length, currentDisposables = new Array(len);\n    for(var i = 0; i < len; i++) { currentDisposables[i] = this.disposables[i]; }\n    this.disposables = [];\n    this.length = 0;\n\n    for (i = 0; i < len; i++) {\n      currentDisposables[i].dispose();\n    }\n  }\n};\n\nmodule.exports = CompositeDisposable;\n"
  },
  {
    "path": "lib/disposables/disposable.js",
    "content": "'use strict';\n\nvar noop = require('../internal/noop');\nvar isFunction = require('../internal/isfunction');\nvar ObjectDisposedError = require('../internal/errors').ObjectDisposedError;\n\n/**\n * Provides a set of static methods for creating Disposables.\n * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n */\nfunction Disposable (action) {\n  this.isDisposed = false;\n  this.action = action || noop;\n}\n\n/** Performs the task of cleaning up resources. */\nDisposable.prototype.dispose = Disposable.prototype.unsubscribe = function () {\n  if (!this.isDisposed) {\n    this.action();\n    this.isDisposed = true;\n  }\n};\n\n/**\n * Creates a disposable object that invokes the specified action when disposed.\n * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n * @return {Disposable} The disposable object that runs the given action upon disposal.\n */\nDisposable.create = function (action) { return new Disposable(action); };\n\n/**\n * Gets the disposable that does nothing when disposed.\n */\nDisposable.empty = { dispose: noop };\n\n/**\n * Validates whether the given object is a disposable\n * @param {Object} Object to test whether it has a dispose method\n * @returns {Boolean} true if a disposable object, else false.\n */\nDisposable.isDisposable = function (d) {\n  return d && isFunction(d.dispose);\n};\n\nDisposable.checkDisposed = function (disposable) {\n  if (disposable.isDisposed) { throw new ObjectDisposedError(); }\n};\n\nDisposable._fixup = function (result) {\n  return Disposable.isDisposable(result) ? result : Disposable.empty;\n};\n\nmodule.exports = Disposable;\n"
  },
  {
    "path": "lib/disposables/singleassignmentdisposable.js",
    "content": "'use strict';\n\nfunction SingleAssignmentDisposable () {\n  this.isDisposed = false;\n  this._current = null;\n}\n\nSingleAssignmentDisposable.prototype.getDisposable = function () {\n  return this._current;\n};\n\nSingleAssignmentDisposable.prototype.setDisposable = function (value) {\n  if (this._current) { throw new Error('Disposable has already been assigned'); }\n  var shouldDispose = this.isDisposed;\n  !shouldDispose && (this._current = value);\n  shouldDispose && value && value.dispose();\n};\n\nSingleAssignmentDisposable.prototype.dispose = SingleAssignmentDisposable.prototype.unsubscribe = function () {\n  if (!this.isDisposed) {\n    this.isDisposed = true;\n    var old = this._current;\n    this._current = null;\n    old && old.dispose();\n  }\n};\n\nmodule.exports = SingleAssignmentDisposable;\n"
  },
  {
    "path": "lib/internal/errors.js",
    "content": "'use strict';\n\nfunction EmptyError () {\n  this.message = 'Sequence contains no elements.';\n  Error.call(this);\n}\nEmptyError.prototype = Object.create(Error.prototype);\nEmptyError.prototype.name = 'EmptyError';\n\nfunction ObjectDisposedError() {\n  this.message = 'Object has been disposed';\n  Error.call(this);\n}\nObjectDisposedError.prototype = Object.create(Error.prototype);\nObjectDisposedError.prototype.name = 'ObjectDisposedError';\n\nfunction ArgumentOutOfRangeError() {\n  this.message = 'Argument out of range';\n  Error.call(this);\n}\nArgumentOutOfRangeError.prototype = Object.create(Error.prototype);\nArgumentOutOfRangeError.prototype.name = 'ArgumentOutOfRangeError';\n\nfunction NotSupportedError(message) {\n  this.message = message || 'This operation is not supported';\n  Error.call(this);\n}\nNotSupportedError.prototype = Object.create(Error.prototype);\nNotSupportedError.prototype.name = 'NotSupportedError';\n\nfunction NotImplementedError(message) {\n  this.message = message || 'This operation is not implemented';\n  Error.call(this);\n}\nNotImplementedError.prototype = Object.create(Error.prototype);\nNotImplementedError.prototype.name = 'NotImplementedError';\n\nfunction CompositeError (errors) {\n  this.innerErrors = errors;\n  this.message = 'This contains multiple errors. Check the innerErrors';\n  Error.call(this);\n}\n\nCompositeError.prototype = Object.create(Error.prototype);\nCompositeError.prototype.name = 'CompositeError';\n\nmodule.exports = {\n  CompositeError: CompositeError,\n  EmptyError: EmptyError,\n  ObjectDisposedError: ObjectDisposedError,\n  ArgumentOutOfRangeError: ArgumentOutOfRangeError,\n  NotSupportedError: NotSupportedError,\n  NotImplementedError: NotImplementedError\n};\n"
  },
  {
    "path": "lib/internal/isfunction.js",
    "content": "'use strict';\n\nmodule.exports = (function () {\n  var isFn = function (value) {\n    return typeof value === 'function' || false;\n  };\n\n  // fallback for older versions of Chrome and Safari\n  if (isFn(/x/)) {\n    isFn = function(value) {\n      return typeof value === 'function' &&\n        Object.prototype.toString.call(value) === '[object Function]';\n    };\n  }\n  return isFn;\n}());\n"
  },
  {
    "path": "lib/internal/noop.js",
    "content": "'use strict';\n\nmodule.exports = function noop () { };\n"
  },
  {
    "path": "lib/internal/priorityqueue.js",
    "content": "'use strict';\n\nfunction IndexedItem(id, value) {\n  this.id = id;\n  this.value = value;\n}\n\nIndexedItem.prototype.compareTo = function (other) {\n  var c = this.value.compareTo(other.value);\n  c === 0 && (c = this.id - other.id);\n  return c;\n};\n\nfunction PriorityQueue (capacity) {\n  this.items = new Array(capacity);\n  this.length = 0;\n}\n\nPriorityQueue.prototype.isHigherPriority = function (left, right) {\n  return this.items[left].compareTo(this.items[right]) < 0;\n};\n\nPriorityQueue.prototype.percolate = function (index) {\n  if (index >= this.length || index < 0) { return; }\n  var parent = index - 1 >> 1;\n  if (parent < 0 || parent === index) { return; }\n  if (this.isHigherPriority(index, parent)) {\n    var temp = this.items[index];\n    this.items[index] = this.items[parent];\n    this.items[parent] = temp;\n    this.percolate(parent);\n  }\n};\n\nPriorityQueue.prototype.heapify = function (index) {\n  +index || (index = 0);\n  if (index >= this.length || index < 0) { return; }\n  var left = 2 * index + 1,\n      right = 2 * index + 2,\n      first = index;\n  if (left < this.length && this.isHigherPriority(left, first)) {\n    first = left;\n  }\n  if (right < this.length && this.isHigherPriority(right, first)) {\n    first = right;\n  }\n  if (first !== index) {\n    var temp = this.items[index];\n    this.items[index] = this.items[first];\n    this.items[first] = temp;\n    this.heapify(first);\n  }\n};\n\nPriorityQueue.prototype.peek = function () { return this.items[0].value; };\n\nPriorityQueue.prototype.removeAt = function (index) {\n  this.items[index] = this.items[--this.length];\n  this.items[this.length] = undefined;\n  this.heapify();\n};\n\nPriorityQueue.prototype.dequeue = function () {\n  var result = this.peek();\n  this.removeAt(0);\n  return result;\n};\n\nPriorityQueue.prototype.enqueue = function (item) {\n  var index = this.length++;\n  this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n  this.percolate(index);\n};\n\nPriorityQueue.prototype.remove = function (item) {\n  for (var i = 0; i < this.length; i++) {\n    if (this.items[i].value === item) {\n      this.removeAt(i);\n      return true;\n    }\n  }\n  return false;\n};\n\nPriorityQueue.count = 0;\n\nmodule.exports = PriorityQueue;\n"
  },
  {
    "path": "lib/internal/producer.js",
    "content": "'use strict';\n\nvar BinaryDisposable = require('../disposables/binarydisposable');\nvar Disposable = require('../disposables/disposable');\nvar SingleAssignmentDisposable = require('../disposables/singleassignmentdisposable');\nvar SafeObserver = require('./safeobserver');\nvar Scheduler = require('../concurrency/scheduler');\n\nfunction Producer () {\n  \n}\n\nProducer.prototype.subscribe = function (o) {\n  this._subscribeRaw(o);\n};\n\nProducer.prototype._subscribeRaw = function (o, enableSafeguard) {\n  var state = {\n    observer: o,\n    sink: new SingleAssignmentDisposable(),\n    subscription: new SingleAssignmentDisposable(),\n    assign: function (s) { this.sink.setDisposable(s); }\n  };\n  \n  var d = new BinaryDisposable(state.sink, state.subscription);\n  \n  if (enableSafeguard) {\n    state.observer = SafeObserver.create(state.observer, d);\n  }\n  \n  if (Scheduler.queue.isScheduleRequired) {\n    Scheduler.queue.schedule(state, this.run.bind(this));\n  } else {\n    state.subscription.setDisposable(this._run(state.observer, state.subscription, state.assign.bind(state)));\n  }\n};\n\nProducer.prototype.run = function (s, x) {\n  x.subscription.setDisposable(this._run(x.observer, x.subscription, x.assign.bind(x)));\n  return Disposable.empty;\n};\n\nProducer.prototype._run = function (o, cancel, setSink) { };\n\nmodule.exports = Producer;"
  },
  {
    "path": "lib/internal/safeobserver.js",
    "content": "'use strict';\n\nvar AnonymousObserver = require('../anonymousobserver');\n\nfunction SafeObserver(o, disposable) {\n  this._o = o;\n  this._disposable = disposable;\n}\n\nSafeObserver.create = function (o, disposable) {\n  if (o instanceof AnonymousObserver) {\n    return o.makeSafe(disposable);\n  }\n  return new SafeObserver(o, disposable);\n};\n\nSafeObserver.prototype.next = function (x) {\n  var noError = false;\n  try {\n    this._o.next(x);\n    noError = true;\n  } finally {\n    !noError && this._disposable.dispose();\n  }\n};\n\nSafeObserver.prototype.error = function (e) {\n  try {\n    this._o.error(e);\n  } finally {\n    this._disposable.dispose();\n  }\n};\n\nSafeObserver.prototype.complete = function () {\n  try {\n    this._o.complete();\n  } finally {\n    this._disposable.dispose();\n  }\n};\n\nmodule.exports = SafeObserver;"
  },
  {
    "path": "lib/internal/sink.js",
    "content": "'use strict';\n\nvar noop = require('./noop');\n\nvar NoOpObserver = {\n  next: noop,\n  error: noop,\n  complete: noop\n};\n\nfunction Forwarder(fwd) {\n  this._fwd = fwd;\n}\n\nForwarder.prototype.next = function (x) {\n  this._fwd._o.next(x);\n};\n\nForwarder.prototype.error = function (e) {\n  this._fwd._o.error(e);\n};\n\nForwarder.prototype.complete = function () {\n  this._fwd._o.complete();\n  this._fwd.dispose();\n};\n\nfunction Sink(o, cancel) {\n  this._o = o;\n  this._cancel = cancel;\n}\n\nSink.prototype.dispose = function () {\n  this._o = NoOpObserver;\n  var cancel = this._cancel;\n  this._cancel = null;\n  cancel && cancel.dispose();\n};\n\nSink.prototype.getForwarder = function () {\n  return new Forwarder(this);\n};\n\nmodule.exports = Sink;"
  },
  {
    "path": "lib/internal/throwerror.js",
    "content": "'use strict';\n\nmodule.exports = function throwError (e) { throw e; };"
  },
  {
    "path": "lib/observable.js",
    "content": "'use strict';\n\nvar AnonymousObserver = require('./anonymousobserver');\nvar noop = require('../internal/noop');\nvar throwError = require('../internal/throwError');\n\nfunction Observable() { }\n\nObservable.subscribe = function (oOrNext, error, complete) {\n  if (typeof oOrNext === 'object') {\n    return this._subscribe(oOrNext);\n  }\n  return this._subscribe(new AnonymousObserver(oOrNext || noop, error || throwError, complete || noop));\n};\n\nmodule.exports = Observable;"
  },
  {
    "path": "lib/observablebase.js",
    "content": "'use strict';\n\nvar AutoDetachObserver = require('./internal/autodetachobserver');\nvar Observable = require('./observable');\nvar Disposable = require('../disposables/disposable');\nvar Scheduler = require('../concurrency/scheduler');\nvar inherits = require('inherits');\n\nfunction ObservableBase() { \n  Observable.call(this);\n}\n\ninherits(ObservableBase, Observable);\n\nfunction scheduledSubscribe(_, state) {\n  var self = state.self, ado = state.ado;\n  try {\n    ado.setDisposable(self._subscribeCore(ado));\n  } catch (e) {\n    if (!ado.fail(e)) { throw e; }\n  }\n  return Disposable.empty;\n}\n\nObservableBase.prototype._subscribe = function (o) {\n  var ado = new AutoDetachObserver(o);\n  \n  var state = { self: this, ado: ado };\n  \n  if (Scheduler.queue.isScheduleRequired()) {\n    ado.setDisposable(Scheduler.queue.schedule(state, scheduledSubscribe));\n  } else {\n    scheduledSubscribe(null, state);\n  }\n  \n  return ado;\n};\n\nObservableBase.prototype._subscribeCore = function (o) { };\n\nmodule.exports = ObservableBase;"
  },
  {
    "path": "lib/observerbase.js",
    "content": "'use strict';\n\nfunction ObserverBase() {\n  this._stopped = false;\n}\n\nObserverBase.prototype.next = function (x) {\n  !this._stopped && this._next(x);\n};\n\nObserverBase.prototype._next = function (x) { };\n\nObserverBase.prototype.error = function (e) {\n  if (!this._stopped) {\n    this._stopped = true;\n    this._error(e);\n  }\n};\n\nObserverBase.prototype._error = function (e) { };\n\nObserverBase.prototype.complete = function () {\n  if (!this._stopped) {\n    this._stopped = true;\n    this._complete();\n  }\n};\n\nObserverBase.prototype._complete = function () { };\n\nObserverBase.prototype.dispose = ObserverBase.prototype.unsubscribe = function () {\n  this._stopped = true;\n};\n\nObserverBase.prototype.fail = function (e) {\n  if (!this._stopped) {\n    this._stopped = true;\n    this._error(e);\n    return true;\n  }\n  return false;\n};\n\nmodule.exports = ObserverBase;"
  },
  {
    "path": "license.txt",
    "content": "Copyright (c) Microsoft.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at http://rx.codeplex.com/wikipage?title=Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/publish.js",
    "content": "var fs = require('fs');\nvar execSync = require('child_process').execSync;\n\nvar files = fs.readdirSync(process.cwd());\nfor (var i = 0; i < files.length; i++) {\n  var file = files[i];\n  var stat = fs.statSync(file);\n  if (stat.isDirectory()) {\n    console.log('publishing %s', file);\n    execSync('npm publish ' + file);\n    console.log('published %s', file);\n  }\n}\n"
  },
  {
    "path": "modules/rx-core/package.json",
    "content": "{\n  \"name\": \"rx-core\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Core\",\n  \"description\": \"Core library for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.core.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.core.js\"\n  },\n  \"dependencies\": {},\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.core.js\"\n}\n"
  },
  {
    "path": "modules/rx-core/readme.md",
    "content": "# RxJS Core Module #\n\nThe Reactive Extensions for JavaScript's core functionality for conforming to the RxJS contract can be found here.  This module contains only the bare essentials including Disposables, Schedulers, Observer and Observable.  This is made available with the `rx.core.js` file.  The primary use case for this file is for those who want to implement a minimal implementation of RxJS for their own usage.\n\n## Details ##\n\nFiles:\n- [`rx.core.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.core.js)\n\nNPM Packages:\n- [`rx-core`](https://www.npmjs.com/package/rx-core)\n\nNuGet Packages:\n- _None_\n\n## Included Classes ##\n\n### Core Objects\n\n- [`Rx.Observer`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observer.md)\n- [`Rx.Observable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md)\n\n### `Observable Methods`\n- [`create`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/create.md)\n\n### Schedulers\n\n- [`Rx.Scheduler`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/schedulers/scheduler.md)\n\n### Disposables\n\n- [`Rx.CompositeDisposable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/disposables/compositedisposable.md)\n- [`Rx.Disposable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/disposables/disposable.md)\n- [`Rx.SerialDisposable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/disposables/serialdisposable.md)\n- [`Rx.SingleAssignmentDisposable`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/disposables/singleassignmentdisposable.md)\n"
  },
  {
    "path": "modules/rx-core/rx.core.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (undefined) {\n\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  var Rx = {\n    internals: {},\n    config: {\n      Promise: root.Promise\n    },\n    helpers: { }\n  };\n\n// Defaults\nvar\n  noop = Rx.helpers.noop = function () { },\n  defaultNow = Rx.helpers.defaultNow = (function () { return !!Date.now ? Date.now : function () { return +new Date; }; }()),\n  defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n  isPromise = Rx.helpers.isPromise = function (p) { return !!p && !isFunction(p.subscribe) && isFunction(p.then); },\n  defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); }\n  isFunction = Rx.helpers.isFunction = (function () {\n    var isFn = function (value) {\n      return typeof value == 'function' || false;\n    };\n\n    // fallback for older versions of Chrome and Safari\n    if (isFn(/x/)) {\n      isFn = function(value) {\n        return typeof value == 'function' && toString.call(value) == '[object Function]';\n      };\n    }\n    return isFn;\n  }());\n\n  var NotImplementedError = Rx.NotImplementedError = function (message) {\n    this.message = message || 'This operation is not implemented';\n    Error.call(this);\n  };\n  NotImplementedError.prototype = Error.prototype;\n\n  var NotSupportedError = Rx.NotSupportedError = function (message) {\n    this.message = message || 'This operation is not supported';\n    Error.call(this);\n  };\n  NotSupportedError.prototype = Error.prototype;\n\n  var notImplemented = Rx.helpers.notImplemented = function () {\n    throw new NotImplementedError();\n  };\n\n  var notSupported = Rx.helpers.notSupported = function () {\n    throw new NotSupportedError();\n  };\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  Rx.config.longStackSupport = false;\n  var hasStacks = false, stacks = tryCatch(function () { throw new Error(); })();\n  hasStacks = !!stacks.e && !!stacks.e.stack;\n\n  // All code after this point will be filtered from stack traces reported by RxJS\n  var rStartingLine = captureLine(), rFileName;\n\n  var STACK_JUMP_SEPARATOR = 'From previous event:';\n\n  function makeStackTraceLong(error, observable) {\n    // If possible, transform the error stack trace by removing Node and RxJS\n    // cruft, then concatenating with the stack trace of `observable`.\n    if (hasStacks &&\n        observable.stack &&\n        typeof error === 'object' &&\n        error !== null &&\n        error.stack &&\n        error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n    ) {\n      var stacks = [];\n      for (var o = observable; !!o; o = o.source) {\n        if (o.stack) {\n          stacks.unshift(o.stack);\n        }\n      }\n      stacks.unshift(error.stack);\n\n      var concatedStacks = stacks.join('\\n' + STACK_JUMP_SEPARATOR + '\\n');\n      error.stack = filterStackString(concatedStacks);\n    }\n  }\n\n  function filterStackString(stackString) {\n    var lines = stackString.split('\\n'), desiredLines = [];\n    for (var i = 0, len = lines.length; i < len; i++) {\n      var line = lines[i];\n\n      if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n        desiredLines.push(line);\n      }\n    }\n    return desiredLines.join('\\n');\n  }\n\n  function isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n    if (!fileNameAndLineNumber) {\n      return false;\n    }\n    var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === rFileName &&\n      lineNumber >= rStartingLine &&\n      lineNumber <= rEndingLine;\n  }\n\n  function isNodeFrame(stackLine) {\n    return stackLine.indexOf('(module.js:') !== -1 ||\n      stackLine.indexOf('(node.js:') !== -1;\n  }\n\n  function captureLine() {\n    if (!hasStacks) { return; }\n\n    try {\n      throw new Error();\n    } catch (e) {\n      var lines = e.stack.split('\\n');\n      var firstLine = lines[0].indexOf('@') > 0 ? lines[1] : lines[2];\n      var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n      if (!fileNameAndLineNumber) { return; }\n\n      rFileName = fileNameAndLineNumber[0];\n      return fileNameAndLineNumber[1];\n    }\n  }\n\n  function getFileNameAndLineNumber(stackLine) {\n    // Named functions: 'at functionName (filename:lineNumber:columnNumber)'\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }\n\n    // Anonymous functions: 'at filename:lineNumber:columnNumber'\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }\n\n    // Firefox style: 'function@filename:lineNumber or @filename:lineNumber'\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }\n  }\n\n  var hasProp = {}.hasOwnProperty,\n      slice = Array.prototype.slice;\n\n  var inherits = Rx.internals.inherits = function (child, parent) {\n    function __() { this.constructor = child; }\n    __.prototype = parent.prototype;\n    child.prototype = new __();\n  };\n\n  var addProperties = Rx.internals.addProperties = function (obj) {\n    for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n      var source = sources[idx];\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n  };\n\n  // Rx Utils\n  var addRef = Rx.internals.addRef = function (xs, r) {\n    return new AnonymousObservable(function (observer) {\n      return new BinaryDisposable(r.getDisposable(), xs.subscribe(observer));\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n\n  /**\n   * Represents a group of disposable resources that are disposed together.\n   * @constructor\n   */\n  var CompositeDisposable = Rx.CompositeDisposable = function () {\n    var args = [], i, len;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      len = arguments.length;\n      args = new Array(len);\n      for(i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    this.disposables = args;\n    this.isDisposed = false;\n    this.length = args.length;\n  };\n\n  var CompositeDisposablePrototype = CompositeDisposable.prototype;\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Mixed} item Disposable to add.\n   */\n  CompositeDisposablePrototype.add = function (item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n      this.length++;\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Mixed} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n  CompositeDisposablePrototype.remove = function (item) {\n    var shouldDispose = false;\n    if (!this.isDisposed) {\n      var idx = this.disposables.indexOf(item);\n      if (idx !== -1) {\n        shouldDispose = true;\n        this.disposables.splice(idx, 1);\n        this.length--;\n        item.dispose();\n      }\n    }\n    return shouldDispose;\n  };\n\n  /**\n   *  Disposes all disposables in the group and removes them from the group.\n   */\n  CompositeDisposablePrototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var len = this.disposables.length, currentDisposables = new Array(len);\n      for(var i = 0; i < len; i++) { currentDisposables[i] = this.disposables[i]; }\n      this.disposables = [];\n      this.length = 0;\n\n      for (i = 0; i < len; i++) {\n        currentDisposables[i].dispose();\n      }\n    }\n  };\n\n  /**\n   * Provides a set of static methods for creating Disposables.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   */\n  var Disposable = Rx.Disposable = function (action) {\n    this.isDisposed = false;\n    this.action = action || noop;\n  };\n\n  /** Performs the task of cleaning up resources. */\n  Disposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.action();\n      this.isDisposed = true;\n    }\n  };\n\n  /**\n   * Creates a disposable object that invokes the specified action when disposed.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   * @return {Disposable} The disposable object that runs the given action upon disposal.\n   */\n  var disposableCreate = Disposable.create = function (action) { return new Disposable(action); };\n\n  /**\n   * Gets the disposable that does nothing when disposed.\n   */\n  var disposableEmpty = Disposable.empty = { dispose: noop };\n\n  /**\n   * Validates whether the given object is a disposable\n   * @param {Object} Object to test whether it has a dispose method\n   * @returns {Boolean} true if a disposable object, else false.\n   */\n  var isDisposable = Disposable.isDisposable = function (d) {\n    return d && isFunction(d.dispose);\n  };\n\n  var checkDisposed = Disposable.checkDisposed = function (disposable) {\n    if (disposable.isDisposed) { throw new ObjectDisposedError(); }\n  };\n\n  var disposableFixup = Disposable._fixup = function (result) {\n    return isDisposable(result) ? result : disposableEmpty;\n  };\n\n  // Single assignment\n  var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SingleAssignmentDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SingleAssignmentDisposable.prototype.setDisposable = function (value) {\n    if (this.current) { throw new Error('Disposable has already been assigned'); }\n    var shouldDispose = this.isDisposed;\n    !shouldDispose && (this.current = value);\n    shouldDispose && value && value.dispose();\n  };\n  SingleAssignmentDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n      old && old.dispose();\n    }\n  };\n\n  // Multiple assignment disposable\n  var SerialDisposable = Rx.SerialDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SerialDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SerialDisposable.prototype.setDisposable = function (value) {\n    var shouldDispose = this.isDisposed;\n    if (!shouldDispose) {\n      var old = this.current;\n      this.current = value;\n    }\n    old && old.dispose();\n    shouldDispose && value && value.dispose();\n  };\n  SerialDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n    }\n    old && old.dispose();\n  };\n\n  var BinaryDisposable = Rx.BinaryDisposable = function (first, second) {\n    this._first = first;\n    this._second = second;\n    this.isDisposed = false;\n  };\n\n  BinaryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old1 = this._first;\n      this._first = null;\n      old1 && old1.dispose();\n      var old2 = this._second;\n      this._second = null;\n      old2 && old2.dispose();\n    }\n  };\n\n  var NAryDisposable = Rx.NAryDisposable = function (disposables) {\n    this._disposables = disposables;\n    this.isDisposed = false;\n  };\n\n  NAryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      for (var i = 0, len = this._disposables.length; i < len; i++) {\n        this._disposables[i].dispose();\n      }\n      this._disposables.length = 0;\n    }\n  };\n\n  var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) {\n    this.scheduler = scheduler;\n    this.state = state;\n    this.action = action;\n    this.dueTime = dueTime;\n    this.comparer = comparer || defaultSubComparer;\n    this.disposable = new SingleAssignmentDisposable();\n  };\n\n  ScheduledItem.prototype.invoke = function () {\n    this.disposable.setDisposable(this.invokeCore());\n  };\n\n  ScheduledItem.prototype.compareTo = function (other) {\n    return this.comparer(this.dueTime, other.dueTime);\n  };\n\n  ScheduledItem.prototype.isCancelled = function () {\n    return this.disposable.isDisposed;\n  };\n\n  ScheduledItem.prototype.invokeCore = function () {\n    return disposableFixup(this.action(this.scheduler, this.state));\n  };\n\n  /** Provides a set of static properties to access commonly used schedulers. */\n  var Scheduler = Rx.Scheduler = (function () {\n\n    function Scheduler() { }\n\n    /** Determines whether the given object is a scheduler */\n    Scheduler.isScheduler = function (s) {\n      return s instanceof Scheduler;\n    };\n\n    var schedulerProto = Scheduler.prototype;\n\n    /**\n   * Schedules an action to be executed.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.schedule = function (state, action) {\n      throw new NotImplementedError();\n    };\n\n  /**\n   * Schedules an action to be executed after dueTime.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @param {Number} dueTime Relative time after which to execute the action.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime;\n      dt instanceof Date && (dt = dt - this.now());\n      dt = Scheduler.normalize(dt);\n\n      if (dt === 0) { return this.schedule(state, action); }\n\n      return this._scheduleFuture(state, dt, action);\n    };\n\n    schedulerProto._scheduleFuture = function (state, dueTime, action) {\n      throw new NotImplementedError();\n    };\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.now = defaultNow;\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.prototype.now = defaultNow;\n\n    /**\n     * Normalizes the specified TimeSpan value to a positive value.\n     * @param {Number} timeSpan The time span value to normalize.\n     * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n     */\n    Scheduler.normalize = function (timeSpan) {\n      timeSpan < 0 && (timeSpan = 0);\n      return timeSpan;\n    };\n\n    return Scheduler;\n  }());\n\n  var normalizeTime = Scheduler.normalize, isScheduler = Scheduler.isScheduler;\n\n  (function (schedulerProto) {\n\n    function invokeRecImmediate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.schedule(state2, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    function invokeRecDate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2, dueTime1) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.scheduleFuture(state2, dueTime1, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursive = function (state, action) {\n      return this.schedule([state, action], invokeRecImmediate);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative or absolute due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number | Date} dueTime Relative or absolute time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveFuture = function (state, dueTime, action) {\n      return this.scheduleFuture([state, action], dueTime, invokeRecDate);\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    schedulerProto.schedulePeriodic = function(state, period, action) {\n      if (typeof root.setInterval === 'undefined') { throw new NotSupportedError(); }\n      period = normalizeTime(period);\n      var s = state, id = root.setInterval(function () { s = action(s); }, period);\n      return disposableCreate(function () { root.clearInterval(id); });\n    };\n\n  }(Scheduler.prototype));\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function createTick(self) {\n      return function tick(command, recurse) {\n        recurse(0, self._period);\n        var state = tryCatch(self._action)(self._state);\n        if (state === errorObj) {\n          self._cancel.dispose();\n          thrower(state.e);\n        }\n        self._state = state;\n      };\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveFuture(0, this._period, createTick(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  /** Gets a scheduler that schedules work immediately on the current thread. */\n   var ImmediateScheduler = (function (__super__) {\n    inherits(ImmediateScheduler, __super__);\n    function ImmediateScheduler() {\n      __super__.call(this);\n    }\n\n    ImmediateScheduler.prototype.schedule = function (state, action) {\n      return disposableFixup(action(this, state));\n    };\n\n    return ImmediateScheduler;\n  }(Scheduler));\n\n  var immediateScheduler = Scheduler.immediate = new ImmediateScheduler();\n\n  /**\n   * Gets a scheduler that schedules work as soon as possible on the current thread.\n   */\n  var CurrentThreadScheduler = (function (__super__) {\n    var queue;\n\n    function runTrampoline () {\n      while (queue.length > 0) {\n        var item = queue.dequeue();\n        !item.isCancelled() && item.invoke();\n      }\n    }\n\n    inherits(CurrentThreadScheduler, __super__);\n    function CurrentThreadScheduler() {\n      __super__.call(this);\n    }\n\n    CurrentThreadScheduler.prototype.schedule = function (state, action) {\n      var si = new ScheduledItem(this, state, action, this.now());\n\n      if (!queue) {\n        queue = new PriorityQueue(4);\n        queue.enqueue(si);\n\n        var result = tryCatch(runTrampoline)();\n        queue = null;\n        if (result === errorObj) { thrower(result.e); }\n      } else {\n        queue.enqueue(si);\n      }\n      return si.disposable;\n    };\n\n    CurrentThreadScheduler.prototype.scheduleRequired = function () { return !queue; };\n\n    return CurrentThreadScheduler;\n  }(Scheduler));\n\n  var currentThreadScheduler = Scheduler.currentThread = new CurrentThreadScheduler();\n\n  var scheduleMethod, clearMethod;\n\n  var localTimer = (function () {\n    var localSetTimeout, localClearTimeout = noop;\n    if (!!root.setTimeout) {\n      localSetTimeout = root.setTimeout;\n      localClearTimeout = root.clearTimeout;\n    } else if (!!root.WScript) {\n      localSetTimeout = function (fn, time) {\n        root.WScript.Sleep(time);\n        fn();\n      };\n    } else {\n      throw new NotSupportedError();\n    }\n\n    return {\n      setTimeout: localSetTimeout,\n      clearTimeout: localClearTimeout\n    };\n  }());\n  var localSetTimeout = localTimer.setTimeout,\n    localClearTimeout = localTimer.clearTimeout;\n\n  (function () {\n\n    var nextHandle = 1, tasksByHandle = {}, currentlyRunning = false;\n\n    clearMethod = function (handle) {\n      delete tasksByHandle[handle];\n    };\n\n    function runTask(handle) {\n      if (currentlyRunning) {\n        localSetTimeout(function () { runTask(handle); }, 0);\n      } else {\n        var task = tasksByHandle[handle];\n        if (task) {\n          currentlyRunning = true;\n          var result = tryCatch(task)();\n          clearMethod(handle);\n          currentlyRunning = false;\n          if (result === errorObj) { thrower(result.e); }\n        }\n      }\n    }\n\n    var reNative = new RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&\n      !reNative.test(setImmediate) && setImmediate;\n\n    function postMessageSupported () {\n      // Ensure not in a worker\n      if (!root.postMessage || root.importScripts) { return false; }\n      var isAsync = false, oldHandler = root.onmessage;\n      // Test for async\n      root.onmessage = function () { isAsync = true; };\n      root.postMessage('', '*');\n      root.onmessage = oldHandler;\n\n      return isAsync;\n    }\n\n    // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n    if (isFunction(setImmediate)) {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        setImmediate(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        process.nextTick(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (postMessageSupported()) {\n      var MSG_PREFIX = 'ms.rx.schedule' + Math.random();\n\n      var onGlobalPostMessage = function (event) {\n        // Only if we're a match to avoid any other global events\n        if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n          runTask(event.data.substring(MSG_PREFIX.length));\n        }\n      };\n\n      root.addEventListener('message', onGlobalPostMessage, false);\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        root.postMessage(MSG_PREFIX + id, '*');\n        return id;\n      };\n    } else if (!!root.MessageChannel) {\n      var channel = new root.MessageChannel();\n\n      channel.port1.onmessage = function (e) { runTask(e.data); };\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        channel.port2.postMessage(id);\n        return id;\n      };\n    } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {\n\n      scheduleMethod = function (action) {\n        var scriptElement = root.document.createElement('script');\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n\n        scriptElement.onreadystatechange = function () {\n          runTask(id);\n          scriptElement.onreadystatechange = null;\n          scriptElement.parentNode.removeChild(scriptElement);\n          scriptElement = null;\n        };\n        root.document.documentElement.appendChild(scriptElement);\n        return id;\n      };\n\n    } else {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        localSetTimeout(function () {\n          runTask(id);\n        }, 0);\n\n        return id;\n      };\n    }\n  }());\n\n  /**\n   * Gets a scheduler that schedules work via a timed callback based upon platform.\n   */\n   var DefaultScheduler = (function (__super__) {\n     inherits(DefaultScheduler, __super__);\n     function DefaultScheduler() {\n       __super__.call(this);\n     }\n\n     function scheduleAction(disposable, action, scheduler, state) {\n       return function schedule() {\n         disposable.setDisposable(Disposable._fixup(action(scheduler, state)));\n       };\n     }\n\n     function ClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     ClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         clearMethod(this._id);\n       }\n     };\n\n     function LocalClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     LocalClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         localClearTimeout(this._id);\n       }\n     };\n\n    DefaultScheduler.prototype.schedule = function (state, action) {\n      var disposable = new SingleAssignmentDisposable(),\n          id = scheduleMethod(scheduleAction(disposable, action, this, state));\n      return new BinaryDisposable(disposable, new ClearDisposable(id));\n    };\n\n    DefaultScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      if (dueTime === 0) { return this.schedule(state, action); }\n      var disposable = new SingleAssignmentDisposable(),\n          id = localSetTimeout(scheduleAction(disposable, action, this, state), dueTime);\n      return new BinaryDisposable(disposable, new LocalClearDisposable(id));\n    };\n\n    function scheduleLongRunning(state, action, disposable) {\n      return function () { action(state, disposable); };\n    }\n\n    DefaultScheduler.prototype.scheduleLongRunning = function (state, action) {\n      var disposable = disposableCreate(noop);\n      scheduleMethod(scheduleLongRunning(state, action, disposable));\n      return disposable;\n    };\n\n    return DefaultScheduler;\n  }(Scheduler));\n\n  var defaultScheduler = Scheduler['default'] = Scheduler.async = new DefaultScheduler();\n\n  function IndexedItem(id, value) {\n    this.id = id;\n    this.value = value;\n  }\n\n  IndexedItem.prototype.compareTo = function (other) {\n    var c = this.value.compareTo(other.value);\n    c === 0 && (c = this.id - other.id);\n    return c;\n  };\n\n  var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) {\n    this.items = new Array(capacity);\n    this.length = 0;\n  };\n\n  var priorityProto = PriorityQueue.prototype;\n  priorityProto.isHigherPriority = function (left, right) {\n    return this.items[left].compareTo(this.items[right]) < 0;\n  };\n\n  priorityProto.percolate = function (index) {\n    if (index >= this.length || index < 0) { return; }\n    var parent = index - 1 >> 1;\n    if (parent < 0 || parent === index) { return; }\n    if (this.isHigherPriority(index, parent)) {\n      var temp = this.items[index];\n      this.items[index] = this.items[parent];\n      this.items[parent] = temp;\n      this.percolate(parent);\n    }\n  };\n\n  priorityProto.heapify = function (index) {\n    +index || (index = 0);\n    if (index >= this.length || index < 0) { return; }\n    var left = 2 * index + 1,\n        right = 2 * index + 2,\n        first = index;\n    if (left < this.length && this.isHigherPriority(left, first)) {\n      first = left;\n    }\n    if (right < this.length && this.isHigherPriority(right, first)) {\n      first = right;\n    }\n    if (first !== index) {\n      var temp = this.items[index];\n      this.items[index] = this.items[first];\n      this.items[first] = temp;\n      this.heapify(first);\n    }\n  };\n\n  priorityProto.peek = function () { return this.items[0].value; };\n\n  priorityProto.removeAt = function (index) {\n    this.items[index] = this.items[--this.length];\n    this.items[this.length] = undefined;\n    this.heapify();\n  };\n\n  priorityProto.dequeue = function () {\n    var result = this.peek();\n    this.removeAt(0);\n    return result;\n  };\n\n  priorityProto.enqueue = function (item) {\n    var index = this.length++;\n    this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n    this.percolate(index);\n  };\n\n  priorityProto.remove = function (item) {\n    for (var i = 0; i < this.length; i++) {\n      if (this.items[i].value === item) {\n        this.removeAt(i);\n        return true;\n      }\n    }\n    return false;\n  };\n  PriorityQueue.count = 0;\n\n  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n\n  /**\n   * Abstract base class for implementations of the Observer class.\n   * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n   */\n  var AbstractObserver = Rx.internals.AbstractObserver = (function (__super__) {\n    inherits(AbstractObserver, __super__);\n\n    /**\n     * Creates a new observer in a non-stopped state.\n     */\n    function AbstractObserver() {\n      this.isStopped = false;\n    }\n\n    // Must be implemented by other observers\n    AbstractObserver.prototype.next = notImplemented;\n    AbstractObserver.prototype.error = notImplemented;\n    AbstractObserver.prototype.completed = notImplemented;\n\n    /**\n     * Notifies the observer of a new element in the sequence.\n     * @param {Any} value Next element in the sequence.\n     */\n    AbstractObserver.prototype.onNext = function (value) {\n      !this.isStopped && this.next(value);\n    };\n\n    /**\n     * Notifies the observer that an exception has occurred.\n     * @param {Any} error The error that has occurred.\n     */\n    AbstractObserver.prototype.onError = function (error) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(error);\n      }\n    };\n\n    /**\n     * Notifies the observer of the end of the sequence.\n     */\n    AbstractObserver.prototype.onCompleted = function () {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.completed();\n      }\n    };\n\n    /**\n     * Disposes the observer, causing it to transition to the stopped state.\n     */\n    AbstractObserver.prototype.dispose = function () { this.isStopped = true; };\n\n    AbstractObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return AbstractObserver;\n  }(Observer));\n\n  /**\n   * Class to create an Observer instance from delegate-based implementations of the on* methods.\n   */\n  var AnonymousObserver = Rx.AnonymousObserver = (function (__super__) {\n    inherits(AnonymousObserver, __super__);\n\n    /**\n     * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n     * @param {Any} onNext Observer's OnNext action implementation.\n     * @param {Any} onError Observer's OnError action implementation.\n     * @param {Any} onCompleted Observer's OnCompleted action implementation.\n     */\n    function AnonymousObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    /**\n     * Calls the onNext action.\n     * @param {Any} value Next element in the sequence.\n     */\n    AnonymousObserver.prototype.next = function (value) {\n      this._onNext(value);\n    };\n\n    /**\n     * Calls the onError action.\n     * @param {Any} error The error that has occurred.\n     */\n    AnonymousObserver.prototype.error = function (error) {\n      this._onError(error);\n    };\n\n    /**\n     *  Calls the onCompleted action.\n     */\n    AnonymousObserver.prototype.completed = function () {\n      this._onCompleted();\n    };\n\n    return AnonymousObserver;\n  }(AbstractObserver));\n\n  var observableProto;\n\n  /**\n   * Represents a push-style collection.\n   */\n  var Observable = Rx.Observable = (function () {\n\n    function makeSubscribe(self, subscribe) {\n      return function (o) {\n        var oldOnError = o.onError;\n        o.onError = function (e) {\n          makeStackTraceLong(e, self);\n          oldOnError.call(o, e);\n        };\n\n        return subscribe.call(self, o);\n      };\n    }\n\n    function Observable() {\n      if (Rx.config.longStackSupport && hasStacks) {\n        var oldSubscribe = this._subscribe;\n        var e = tryCatch(thrower)(new Error()).e;\n        this.stack = e.stack.substring(e.stack.indexOf('\\n') + 1);\n        this._subscribe = makeSubscribe(this, oldSubscribe);\n      }\n    }\n\n    observableProto = Observable.prototype;\n\n    /**\n    * Determines whether the given object is an Observable\n    * @param {Any} An object to determine whether it is an Observable\n    * @returns {Boolean} true if an Observable, else false.\n    */\n    Observable.isObservable = function (o) {\n      return o && isFunction(o.subscribe);\n    };\n\n    /**\n     *  Subscribes an o to the observable sequence.\n     *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n     *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n     *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n     *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribe = observableProto.forEach = function (oOrOnNext, onError, onCompleted) {\n      return this._subscribe(typeof oOrOnNext === 'object' ?\n        oOrOnNext :\n        observerCreate(oOrOnNext, onError, onCompleted));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onNext The function to invoke on each element in the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnNext = function (onNext, thisArg) {\n      return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n    };\n\n    /**\n     * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n     * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnError = function (onError, thisArg) {\n      return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnCompleted = function (onCompleted, thisArg) {\n      return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n    };\n\n    return Observable;\n  })();\n\n  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {\n    inherits(AnonymousObservable, __super__);\n\n    // Fix subscriber to check for undefined or function returned to decorate as Disposable\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.__subscribe).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function AnonymousObservable(subscribe, parent) {\n      this.source = parent;\n      this.__subscribe = subscribe;\n      __super__.call(this);\n    }\n\n    AnonymousObservable.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    return AnonymousObservable;\n\n  }(Observable));\n\n  var ObservableBase = Rx.ObservableBase = (function (__super__) {\n    inherits(ObservableBase, __super__);\n\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.subscribeCore).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function ObservableBase() {\n      __super__.call(this);\n    }\n\n    ObservableBase.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    ObservableBase.prototype.subscribeCore = notImplemented;\n\n    return ObservableBase;\n  }(Observable));\n\n  var AutoDetachObserver = (function (__super__) {\n    inherits(AutoDetachObserver, __super__);\n\n    function AutoDetachObserver(observer) {\n      __super__.call(this);\n      this.observer = observer;\n      this.m = new SingleAssignmentDisposable();\n    }\n\n    var AutoDetachObserverPrototype = AutoDetachObserver.prototype;\n\n    AutoDetachObserverPrototype.next = function (value) {\n      var result = tryCatch(this.observer.onNext).call(this.observer, value);\n      if (result === errorObj) {\n        this.dispose();\n        thrower(result.e);\n      }\n    };\n\n    AutoDetachObserverPrototype.error = function (err) {\n      var result = tryCatch(this.observer.onError).call(this.observer, err);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.completed = function () {\n      var result = tryCatch(this.observer.onCompleted).call(this.observer);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };\n    AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };\n\n    AutoDetachObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.m.dispose();\n    };\n\n    return AutoDetachObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Creates an observable sequence from a specified subscribe method implementation.\n   * @example\n   *  var res = Rx.Observable.create(function (observer) { return function () { } );\n   *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n   *  var res = Rx.Observable.create(function (observer) { } );\n   * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n   * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n   */\n  Observable.create = function (subscribe, parent) {\n    return new AnonymousObservable(subscribe, parent);\n  };\n\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    root.Rx = Rx;\n\n    define(function() {\n      return Rx;\n    });\n  } else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = Rx).Rx = Rx;\n    } else {\n      freeExports.Rx = Rx;\n    }\n  } else {\n    // in a browser or Rhino\n    root.Rx = Rx;\n  }\n\n  // All code before this point will be filtered from stack traces.\n  var rEndingLine = captureLine();\n\n}.call(this));\n"
  },
  {
    "path": "modules/rx-core-binding/package.json",
    "content": "{\n  \"name\": \"rx-core-binding\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Core\",\n  \"description\": \"Core binding library for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.core.binding.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.core.binding.js\"\n  },\n  \"dependencies\": {\n    \"rx-core\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.core.binding.js\"\n}\n"
  },
  {
    "path": "modules/rx-core-binding/readme.md",
    "content": "# RxJS Core Binding Module #\n\nThe Reactive Extensions for JavaScript has a notion of hot and cold observables.  Hot observables fire whether you are listening to them or not, such as mouse movements.  Cold observables on the other hand, such as a sequence created from an array will fire the same sequence to all subscribers.  The Core Binding module gives you the ability to replay events for hot observables, and to turn cold observables into hot observables.  The primary use case is for those who are implementing libraries compatible with RxJS to be able to handle hot and cold observables.\n\n## Details ##\n\nFiles:\n- [`rx.core.binding.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.core.binding.js)\n\nNPM Packages:\n- [`rx-core-binding`](https://www.npmjs.com/package/rx-core-binding)\n\nNuGet Packages:\n- _None_\n\nFile Dependencies:\n- [`rx.core.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.core.js)\n\nNuGet Dependencies:\n- _None_\n\n## Included Observable Operators ##\n\n### `Observable Instance Methods`\n- [`connect`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/connect.md)\n- [`publish`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/publish.md)\n- [`publishLast`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/publishlast.md)\n- [`publishValue`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/publishvalue.md)\n- [`refCount`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/refcount.md)\n- [`replay`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/replay.md)\n- [`share`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/share.md)\n- [`shareLast`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sharelast.md)\n- [`shareReplay`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sharereplay.md)\n- [`shareValue`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/sharevalue.md)\n- [`singleInstance`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/singleinstance.md)\n\n## Included Classes ##\n\n### Subjects\n\n- [`Rx.AsyncSubject`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/asyncsubject.md)\n- [`Rx.Subject`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/subject.md)\n- [`Rx.BehaviorSubject`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.mdapi/subjects/behaviorsubject.md)\n- [`Rx.ReplaySubject`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.mdapi/subjects/replaysubject.md)\n"
  },
  {
    "path": "modules/rx-core-binding/rx.core.binding.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n    // Because of build optimizers\n    if (typeof define === 'function' && define.amd) {\n        define(['./rx.core'], function (Rx, exports) {\n            return factory(root, exports, Rx);\n        });\n    } else if (typeof module === 'object' && module && module.exports === freeExports) {\n        module.exports = factory(root, module.exports, require('./rx.core'));\n    } else {\n        root.Rx = factory(root, {}, root.Rx);\n    }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    ObservableBase = Rx.ObservableBase,\n    Observer = Rx.Observer,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    disposableCreate = Rx.Disposable.create,\n    disposableEmpty = Rx.Disposable.empty,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    currentThreadScheduler = Rx.Scheduler.currentThread,\n    isFunction = Rx.helpers.isFunction,\n    inherits = Rx.internals.inherits,\n    addProperties = Rx.internals.addProperties,\n    checkDisposed = Rx.Disposable.checkDisposed;\n\n  // Utilities\n  function cloneArray(arr) {\n    var len = arr.length, a = new Array(len);\n    for(var i = 0; i < len; i++) { a[i] = arr[i]; }\n    return a;\n  }\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  var MulticastObservable = (function (__super__) {\n    inherits(MulticastObservable, __super__);\n    function MulticastObservable(source, fn1, fn2) {\n      this.source = source;\n      this._fn1 = fn1;\n      this._fn2 = fn2;\n      __super__.call(this);\n    }\n\n    MulticastObservable.prototype.subscribeCore = function (o) {\n      var connectable = this.source.multicast(this._fn1());\n      return new BinaryDisposable(this._fn2(connectable).subscribe(o), connectable.connect());\n    };\n\n    return MulticastObservable;\n  }(ObservableBase));\n\n  /**\n   * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n   * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n   * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n   *\n   * @example\n   * 1 - res = source.multicast(observable);\n   * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n   *\n   * @param {Function|Subject} subjectOrSubjectSelector\n   * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n   * Or:\n   * Subject to push source elements into.\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.multicast = function (subjectOrSubjectSelector, selector) {\n    return isFunction(subjectOrSubjectSelector) ?\n      new MulticastObservable(this, subjectOrSubjectSelector, selector) :\n      new ConnectableObservable(this, subjectOrSubjectSelector);\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of Multicast using a regular Subject.\n   *\n   * @example\n   * var resres = source.publish();\n   * var res = source.publish(function (x) { return x; });\n   *\n   * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publish = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new Subject(); }, selector) :\n      this.multicast(new Subject());\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.share = function () {\n    return this.publish().refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n   * This operator is a specialization of Multicast using a AsyncSubject.\n   *\n   * @example\n   * var res = source.publishLast();\n   * var res = source.publishLast(function (x) { return x; });\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishLast = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new AsyncSubject(); }, selector) :\n      this.multicast(new AsyncSubject());\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n   * This operator is a specialization of Multicast using a BehaviorSubject.\n   *\n   * @example\n   * var res = source.publishValue(42);\n   * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishValue = function (initialValueOrSelector, initialValue) {\n    return arguments.length === 2 ?\n      this.multicast(function () {\n        return new BehaviorSubject(initialValue);\n      }, initialValueOrSelector) :\n      this.multicast(new BehaviorSubject(initialValueOrSelector));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n   * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareValue = function (initialValue) {\n    return this.publishValue(initialValue).refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of Multicast using a ReplaySubject.\n   *\n   * @example\n   * var res = source.replay(null, 3);\n   * var res = source.replay(null, 3, 500);\n   * var res = source.replay(null, 3, 500, scheduler);\n   * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param windowSize [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.replay = function (selector, bufferSize, windowSize, scheduler) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new ReplaySubject(bufferSize, windowSize, scheduler); }, selector) :\n      this.multicast(new ReplaySubject(bufferSize, windowSize, scheduler));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   *\n   * @example\n   * var res = source.shareReplay(3);\n   * var res = source.shareReplay(3, 500);\n   * var res = source.shareReplay(3, 500, scheduler);\n   *\n\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareReplay = function (bufferSize, windowSize, scheduler) {\n    return this.replay(null, bufferSize, windowSize, scheduler).refCount();\n  };\n\n  var ScheduledObserver = Rx.internals.ScheduledObserver = (function (__super__) {\n    inherits(ScheduledObserver, __super__);\n\n    function ScheduledObserver(scheduler, observer) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.observer = observer;\n      this.isAcquired = false;\n      this.hasFaulted = false;\n      this.queue = [];\n      this.disposable = new SerialDisposable();\n    }\n\n    function enqueueNext(observer, x) { return function () { observer.onNext(x); }; }\n    function enqueueError(observer, e) { return function () { observer.onError(e); }; }\n    function enqueueCompleted(observer) { return function () { observer.onCompleted(); }; }\n\n    ScheduledObserver.prototype.next = function (x) {\n      this.queue.push(enqueueNext(this.observer, x));\n    };\n\n    ScheduledObserver.prototype.error = function (e) {\n      this.queue.push(enqueueError(this.observer, e));\n    };\n\n    ScheduledObserver.prototype.completed = function () {\n      this.queue.push(enqueueCompleted(this.observer));\n    };\n\n\n    function scheduleMethod(state, recurse) {\n      var work;\n      if (state.queue.length > 0) {\n        work = state.queue.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var res = tryCatch(work)();\n      if (res === errorObj) {\n        state.queue = [];\n        state.hasFaulted = true;\n        return thrower(res.e);\n      }\n      recurse(state);\n    }\n\n    ScheduledObserver.prototype.ensureActive = function () {\n      var isOwner = false;\n      if (!this.hasFaulted && this.queue.length > 0) {\n        isOwner = !this.isAcquired;\n        this.isAcquired = true;\n      }\n      isOwner &&\n        this.disposable.setDisposable(this.scheduler.scheduleRecursive(this, scheduleMethod));\n    };\n\n    ScheduledObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.disposable.dispose();\n    };\n\n    return ScheduledObserver;\n  }(AbstractObserver));\n\n  var InnerSubscription = function (s, o) {\n    this._s = s;\n    this._o = o;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this._s.isDisposed && this._o !== null) {\n      var idx = this._s.observers.indexOf(this._o);\n      this._s.observers.splice(idx, 1);\n      this._o = null;\n    }\n  };\n\n  /**\n   *  Represents an object that is both an observable sequence as well as an observer.\n   *  Each notification is broadcasted to all subscribed observers.\n   */\n  var Subject = Rx.Subject = (function (__super__) {\n    inherits(Subject, __super__);\n    function Subject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(Subject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n          return disposableEmpty;\n        }\n        o.onCompleted();\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onCompleted();\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.error = error;\n          this.hasError = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onNext(value);\n          }\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    /**\n     * Creates a subject from the specified observer and observable.\n     * @param {Observer} observer The observer used to send messages to the subject.\n     * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n     * @returns {Subject} Subject implemented using the given observer and observable.\n     */\n    Subject.create = function (observer, observable) {\n      return new AnonymousSubject(observer, observable);\n    };\n\n    return Subject;\n  }(Observable));\n\n  var AnonymousSubject = Rx.AnonymousSubject = (function (__super__) {\n    inherits(AnonymousSubject, __super__);\n    function AnonymousSubject(observer, observable) {\n      this.observer = observer;\n      this.observable = observable;\n      __super__.call(this);\n    }\n\n    addProperties(AnonymousSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        return this.observable.subscribe(o);\n      },\n      onCompleted: function () {\n        this.observer.onCompleted();\n      },\n      onError: function (error) {\n        this.observer.onError(error);\n      },\n      onNext: function (value) {\n        this.observer.onNext(value);\n      }\n    });\n\n    return AnonymousSubject;\n  }(Observable));\n\n  /**\n   *  Represents the result of an asynchronous operation.\n   *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n   */\n  var AsyncSubject = Rx.AsyncSubject = (function (__super__) {\n    inherits(AsyncSubject, __super__);\n\n    /**\n     * Creates a subject that can only receive one value and that value is cached for all future observations.\n     * @constructor\n     */\n    function AsyncSubject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasValue = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(AsyncSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n\n        if (this.hasError) {\n          o.onError(this.error);\n        } else if (this.hasValue) {\n          o.onNext(this.value);\n          o.onCompleted();\n        } else {\n          o.onCompleted();\n        }\n\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n       */\n      onCompleted: function () {\n        var i, len;\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          var os = cloneArray(this.observers), len = os.length;\n\n          if (this.hasValue) {\n            for (i = 0; i < len; i++) {\n              var o = os[i];\n              o.onNext(this.value);\n              o.onCompleted();\n            }\n          } else {\n            for (i = 0; i < len; i++) {\n              os[i].onCompleted();\n            }\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the error.\n       * @param {Mixed} error The Error to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.hasError = true;\n          this.error = error;\n\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n       * @param {Mixed} value The value to store in the subject.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        this.hasValue = true;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.error = null;\n        this.value = null;\n      }\n    });\n\n    return AsyncSubject;\n  }(Observable));\n\n  /**\n   *  Represents a value that changes over time.\n   *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n   */\n  var BehaviorSubject = Rx.BehaviorSubject = (function (__super__) {\n    inherits(BehaviorSubject, __super__);\n    function BehaviorSubject(value) {\n      __super__.call(this);\n      this.value = value;\n      this.observers = [];\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasError = false;\n    }\n\n    addProperties(BehaviorSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          o.onNext(this.value);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n        } else {\n          o.onCompleted();\n        }\n        return disposableEmpty;\n      },\n      /**\n       * Gets the current value or throws an exception.\n       * Value is frozen after onCompleted is called.\n       * After onError is called always throws the specified exception.\n       * An exception is always thrown after dispose is called.\n       * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n       */\n      getValue: function () {\n        checkDisposed(this);\n        if (this.hasError) { thrower(this.error); }\n        return this.value;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onCompleted();\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.hasError = true;\n        this.error = error;\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onError(error);\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onNext(value);\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.value = null;\n        this.error = null;\n      }\n    });\n\n    return BehaviorSubject;\n  }(Observable));\n\n  /**\n   * Represents an object that is both an observable sequence as well as an observer.\n   * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n   */\n  var ReplaySubject = Rx.ReplaySubject = (function (__super__) {\n\n    var maxSafeInteger = Math.pow(2, 53) - 1;\n\n    function createRemovableDisposable(subject, observer) {\n      return disposableCreate(function () {\n        observer.dispose();\n        !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n      });\n    }\n\n    inherits(ReplaySubject, __super__);\n\n    /**\n     *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n     *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n     *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n     *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n     */\n    function ReplaySubject(bufferSize, windowSize, scheduler) {\n      this.bufferSize = bufferSize == null ? maxSafeInteger : bufferSize;\n      this.windowSize = windowSize == null ? maxSafeInteger : windowSize;\n      this.scheduler = scheduler || currentThreadScheduler;\n      this.q = [];\n      this.observers = [];\n      this.isStopped = false;\n      this.isDisposed = false;\n      this.hasError = false;\n      this.error = null;\n      __super__.call(this);\n    }\n\n    addProperties(ReplaySubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        var so = new ScheduledObserver(this.scheduler, o), subscription = createRemovableDisposable(this, so);\n\n        this._trim(this.scheduler.now());\n        this.observers.push(so);\n\n        for (var i = 0, len = this.q.length; i < len; i++) {\n          so.onNext(this.q[i].value);\n        }\n\n        if (this.hasError) {\n          so.onError(this.error);\n        } else if (this.isStopped) {\n          so.onCompleted();\n        }\n\n        so.ensureActive();\n        return subscription;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      _trim: function (now) {\n        while (this.q.length > this.bufferSize) {\n          this.q.shift();\n        }\n        while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {\n          this.q.shift();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        var now = this.scheduler.now();\n        this.q.push({ interval: now, value: value });\n        this._trim(now);\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onNext(value);\n          observer.ensureActive();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.error = error;\n        this.hasError = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onError(error);\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onCompleted();\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    return ReplaySubject;\n  }(Observable));\n\n  var RefCountObservable = (function (__super__) {\n    inherits(RefCountObservable, __super__);\n    function RefCountObservable(source) {\n      this.source = source;\n      this._count = 0;\n      this._connectableSubscription = null;\n      __super__.call(this);\n    }\n\n    RefCountObservable.prototype.subscribeCore = function (o) {\n      var subscription = this.source.subscribe(o);\n      ++this._count === 1 && (this._connectableSubscription = this.source.connect());\n      return new RefCountDisposable(this, subscription);\n    };\n\n    function RefCountDisposable(p, s) {\n      this._p = p;\n      this._s = s;\n      this.isDisposed = false;\n    }\n\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this._s.dispose();\n        --this._p._count === 0 && this._p._connectableSubscription.dispose();\n      }\n    };\n\n    return RefCountObservable;\n  }(ObservableBase));\n\n  var ConnectableObservable = Rx.ConnectableObservable = (function (__super__) {\n    inherits(ConnectableObservable, __super__);\n    function ConnectableObservable(source, subject) {\n      this.source = source;\n      this._connection = null;\n      this._source = source.asObservable();\n      this._subject = subject;\n      __super__.call(this);\n    }\n\n    function ConnectDisposable(parent, subscription) {\n      this._p = parent;\n      this._s = subscription;\n    }\n\n    ConnectDisposable.prototype.dispose = function () {\n      if (this._s) {\n        this._s.dispose();\n        this._s = null;\n        this._p._connection = null;\n      }\n    };\n\n    ConnectableObservable.prototype.connect = function () {\n      if (!this._connection) {\n        if (this._subject.isStopped) {\n          return disposableEmpty;\n        }\n        var subscription = this._source.subscribe(this._subject);\n        this._connection = new ConnectDisposable(this, subscription);\n      }\n      return this._connection;\n    };\n\n    ConnectableObservable.prototype._subscribe = function (o) {\n      return this._subject.subscribe(o);\n    };\n\n    ConnectableObservable.prototype.refCount = function () {\n      return new RefCountObservable(this);\n    };\n\n    return ConnectableObservable;\n  }(Observable));\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-core-testing/package.json",
    "content": "{\n  \"name\": \"rx-core-testing\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Core\",\n  \"description\": \"Core testing library for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.core.testing.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.core.testing.js\"\n  },\n  \"dependencies\": {\n    \"rx-core\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.core.testing.js\"\n}\n"
  },
  {
    "path": "modules/rx-core-testing/readme.md",
    "content": "# RxJS Core Testing Module #\n\nThe Reactive Extensions for JavaScript has a built-in mechanism for testing all operators which allows for mocking absolute and relative time with ease for use with `rx.core.js` and `rx.core.binding.js`\n\n## Details ##\n\nFiles:\n- [`rx.testing.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.core.testing.js)\n\nNPM Packages:\n- [`rx-core-testing`](https://www.npmjs.com/package/rx-core-testing)\n\nNuGet Packages:\n- _None_\n\nFile Dependencies:\n- [`rx.core.js`](https://github.com/Reactive-Extensions/RxJS/blob/master/dist/rx.core.js)\n\nNuGet Dependencies:\n- _None_\n\n## Included Classes ##\n\n### Core Objects\n\n- [`Rx.Notification`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/notification.md)\n\n### Schedulers\n\n- [`Rx.TestScheduler`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/testing/testscheduler.md)\n- [`Rx.VirtualTimeScheduler`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/schedulers/virtualtimescheduler.md)\n\n### Testing Classes\n\n- [`Rx.ReactiveTest`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/testing/reactivetest.md)\n- [`Rx.Recorded`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/testing/recorded.md)\n- [`Rx.Subscription`](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/testing/subscription.md)\n"
  },
  {
    "path": "modules/rx-core-testing/rx.core.testing.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n    // Because of build optimizers\n    if (typeof define === 'function' && define.amd) {\n        define(['./rx.core'], function (Rx, exports) {\n            return factory(root, exports, Rx);\n        });\n    } else if (typeof module === 'object' && module && module.exports === freeExports) {\n        module.exports = factory(root, module.exports, require('./rx.core'));\n    } else {\n        root.Rx = factory(root, {}, root.Rx);\n    }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Defaults\n  var Observer = Rx.Observer,\n    Observable = Rx.Observable,\n    Disposable = Rx.Disposable,\n    disposableEmpty = Disposable.empty,\n    disposableCreate = Disposable.create,\n    CompositeDisposable = Rx.CompositeDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    Scheduler = Rx.Scheduler,\n    ScheduledItem = Rx.internals.ScheduledItem,\n    SchedulePeriodicRecursive  = Rx.internals.SchedulePeriodicRecursive,\n    PriorityQueue = Rx.internals.PriorityQueue,\n    inherits = Rx.internals.inherits,\n    notImplemented = Rx.helpers.notImplemented,\n    defaultComparer = Rx.helpers.defaultComparer = function (a, b) { return isEqual(a, b); };\n\n  /**\n   *  Represents a notification to an observer.\n   */\n  var Notification = Rx.Notification = (function () {\n    function Notification() {\n\n    }\n\n    Notification.prototype._accept = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    Notification.prototype._acceptObserver = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    /**\n     * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n     * @param {Function | Observer} observerOrOnNext Function to invoke for an OnNext notification or Observer to invoke the notification on..\n     * @param {Function} onError Function to invoke for an OnError notification.\n     * @param {Function} onCompleted Function to invoke for an OnCompleted notification.\n     * @returns {Any} Result produced by the observation.\n     */\n    Notification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n      return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n        this._acceptObserver(observerOrOnNext) :\n        this._accept(observerOrOnNext, onError, onCompleted);\n    };\n\n    /**\n     * Returns an observable sequence with a single notification.\n     *\n     * @memberOf Notifications\n     * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n     * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n     */\n    Notification.prototype.toObservable = function (scheduler) {\n      var self = this;\n      isScheduler(scheduler) || (scheduler = immediateScheduler);\n      return new AnonymousObservable(function (o) {\n        return scheduler.schedule(self, function (_, notification) {\n          notification._acceptObserver(o);\n          notification.kind === 'N' && o.onCompleted();\n        });\n      });\n    };\n\n    return Notification;\n  })();\n\n  var OnNextNotification = (function (__super__) {\n    inherits(OnNextNotification, __super__);\n    function OnNextNotification(value) {\n      this.value = value;\n      this.kind = 'N';\n    }\n\n    OnNextNotification.prototype._accept = function (onNext) {\n      return onNext(this.value);\n    };\n\n    OnNextNotification.prototype._acceptObserver = function (o) {\n      return o.onNext(this.value);\n    };\n\n    OnNextNotification.prototype.toString = function () {\n      return 'OnNext(' + this.value + ')';\n    };\n\n    return OnNextNotification;\n  }(Notification));\n\n  var OnErrorNotification = (function (__super__) {\n    inherits(OnErrorNotification, __super__);\n    function OnErrorNotification(error) {\n      this.error = error;\n      this.kind = 'E';\n    }\n\n    OnErrorNotification.prototype._accept = function (onNext, onError) {\n      return onError(this.error);\n    };\n\n    OnErrorNotification.prototype._acceptObserver = function (o) {\n      return o.onError(this.error);\n    };\n\n    OnErrorNotification.prototype.toString = function () {\n      return 'OnError(' + this.error + ')';\n    };\n\n    return OnErrorNotification;\n  }(Notification));\n\n  var OnCompletedNotification = (function (__super__) {\n    inherits(OnCompletedNotification, __super__);\n    function OnCompletedNotification() {\n      this.kind = 'C';\n    }\n\n    OnCompletedNotification.prototype._accept = function (onNext, onError, onCompleted) {\n      return onCompleted();\n    };\n\n    OnCompletedNotification.prototype._acceptObserver = function (o) {\n      return o.onCompleted();\n    };\n\n    OnCompletedNotification.prototype.toString = function () {\n      return 'OnCompleted()';\n    };\n\n    return OnCompletedNotification;\n  }(Notification));\n\n  /**\n   * Creates an object that represents an OnNext notification to an observer.\n   * @param {Any} value The value contained in the notification.\n   * @returns {Notification} The OnNext notification containing the value.\n   */\n  var notificationCreateOnNext = Notification.createOnNext = function (value) {\n    return new OnNextNotification(value);\n  };\n\n  /**\n   * Creates an object that represents an OnError notification to an observer.\n   * @param {Any} error The exception contained in the notification.\n   * @returns {Notification} The OnError notification containing the exception.\n   */\n  var notificationCreateOnError = Notification.createOnError = function (error) {\n    return new OnErrorNotification(error);\n  };\n\n  /**\n   * Creates an object that represents an OnCompleted notification to an observer.\n   * @returns {Notification} The OnCompleted notification.\n   */\n  var notificationCreateOnCompleted = Notification.createOnCompleted = function () {\n    return new OnCompletedNotification();\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var dontEnums = ['toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'],\n  dontEnumsLength = dontEnums.length;\n\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\nvar objectProto = Object.prototype,\n    hasOwnProperty = objectProto.hasOwnProperty,\n    objToString = objectProto.toString,\n    MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\nvar keys = Object.keys || (function() {\n    var hasOwnProperty = Object.prototype.hasOwnProperty,\n        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),\n        dontEnums = [\n          'toString',\n          'toLocaleString',\n          'valueOf',\n          'hasOwnProperty',\n          'isPrototypeOf',\n          'propertyIsEnumerable',\n          'constructor'\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    return function(obj) {\n      if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n        throw new TypeError('Object.keys called on non-object');\n      }\n\n      var result = [], prop, i;\n\n      for (prop in obj) {\n        if (hasOwnProperty.call(obj, prop)) {\n          result.push(prop);\n        }\n      }\n\n      if (hasDontEnumBug) {\n        for (i = 0; i < dontEnumsLength; i++) {\n          if (hasOwnProperty.call(obj, dontEnums[i])) {\n            result.push(dontEnums[i]);\n          }\n        }\n      }\n      return result;\n    };\n  }());\n\nfunction equalObjects(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objProps = keys(object),\n      objLength = objProps.length,\n      othProps = keys(other),\n      othLength = othProps.length;\n\n  if (objLength !== othLength && !isLoose) {\n    return false;\n  }\n  var index = objLength, key;\n  while (index--) {\n    key = objProps[index];\n    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  var skipCtor = isLoose;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key],\n        result;\n\n    if (!(result === undefined ? equalFunc(objValue, othValue, isLoose, stackA, stackB) : result)) {\n      return false;\n    }\n    skipCtor || (skipCtor = key === 'constructor');\n  }\n  if (!skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    if (objCtor !== othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor === 'function' && objCtor instanceof objCtor &&\n          typeof othCtor === 'function' && othCtor instanceof othCtor)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction equalByTag(object, other, tag) {\n  switch (tag) {\n    case boolTag:\n    case dateTag:\n      return +object === +other;\n\n    case errorTag:\n      return object.name === other.name && object.message === other.message;\n\n    case numberTag:\n      return (object !== +object) ?\n        other !== +other :\n        object === +other;\n\n    case regexpTag:\n    case stringTag:\n      return object === (other + '');\n  }\n  return false;\n}\n\nvar isObject = Rx.internals.isObject = function(value) {\n  var type = typeof value;\n  return !!value && (type === 'object' || type === 'function');\n};\n\nfunction isObjectLike(value) {\n  return !!value && typeof value === 'object';\n}\n\nfunction isLength(value) {\n  return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nvar isHostObject = (function() {\n  try {\n    Object({ 'toString': 0 } + '');\n  } catch(e) {\n    return function() { return false; };\n  }\n  return function(value) {\n    return typeof value.toString !== 'function' && typeof (value + '') === 'string';\n  };\n}());\n\nfunction isTypedArray(value) {\n  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nvar isArray = Array.isArray || function(value) {\n  return isObjectLike(value) && isLength(value.length) && objToString.call(value) === arrayTag;\n};\n\nfunction arraySome (array, predicate) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction equalArrays(array, other, equalFunc, isLoose, stackA, stackB) {\n  var index = -1,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength !== othLength && !(isLoose && othLength > arrLength)) {\n    return false;\n  }\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index],\n        result;\n\n    if (result !== undefined) {\n      if (result) {\n        continue;\n      }\n      return false;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (isLoose) {\n      if (!arraySome(other, function(othValue) {\n            return arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB);\n          })) {\n        return false;\n      }\n    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB))) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction baseIsEqualDeep(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = arrayTag,\n      othTag = arrayTag;\n\n  if (!objIsArr) {\n    objTag = objToString.call(object);\n    if (objTag === argsTag) {\n      objTag = objectTag;\n    } else if (objTag !== objectTag) {\n      objIsArr = isTypedArray(object);\n    }\n  }\n  if (!othIsArr) {\n    othTag = objToString.call(other);\n    if (othTag === argsTag) {\n      othTag = objectTag;\n    }\n  }\n  var objIsObj = objTag === objectTag && !isHostObject(object),\n      othIsObj = othTag === objectTag && !isHostObject(other),\n      isSameTag = objTag === othTag;\n\n  if (isSameTag && !(objIsArr || objIsObj)) {\n    return equalByTag(object, other, objTag);\n  }\n  if (!isLoose) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, isLoose, stackA, stackB);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  // For more information on detecting circular references see https://es5.github.io/#JO.\n  stackA || (stackA = []);\n  stackB || (stackB = []);\n\n  var length = stackA.length;\n  while (length--) {\n    if (stackA[length] === object) {\n      return stackB[length] === other;\n    }\n  }\n  // Add `object` and `other` to the stack of traversed objects.\n  stackA.push(object);\n  stackB.push(other);\n\n  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, isLoose, stackA, stackB);\n\n  stackA.pop();\n  stackB.pop();\n\n  return result;\n}\n\nfunction baseIsEqual(value, other, isLoose, stackA, stackB) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, baseIsEqual, isLoose, stackA, stackB);\n}\n\nvar isEqual = Rx.internals.isEqual = function (value, other) {\n  return baseIsEqual(value, other);\n};\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function createTick(self) {\n      return function tick(command, recurse) {\n        recurse(0, self._period);\n        var state = tryCatch(self._action)(self._state);\n        if (state === errorObj) {\n          self._cancel.dispose();\n          thrower(state.e);\n        }\n        self._state = state;\n      };\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveFuture(0, this._period, createTick(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  /** Provides a set of extension methods for virtual time scheduling. */\n  var VirtualTimeScheduler = Rx.VirtualTimeScheduler = (function (__super__) {\n    inherits(VirtualTimeScheduler, __super__);\n\n    /**\n     * Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer.\n     *\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function VirtualTimeScheduler(initialClock, comparer) {\n      this.clock = initialClock;\n      this.comparer = comparer;\n      this.isEnabled = false;\n      this.queue = new PriorityQueue(1024);\n      __super__.call(this);\n    }\n\n    var VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype;\n\n    VirtualTimeSchedulerPrototype.now = function () {\n      return this.toAbsoluteTime(this.clock);\n    };\n\n    VirtualTimeSchedulerPrototype.schedule = function (state, action) {\n      return this.scheduleAbsolute(state, this.clock, action);\n    };\n\n    VirtualTimeSchedulerPrototype.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime instanceof Date ?\n        this.toRelativeTime(dueTime - this.now()) :\n        this.toRelativeTime(dueTime);\n\n      return this.scheduleRelative(state, dt, action);\n    };\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    VirtualTimeSchedulerPrototype.add = notImplemented;\n\n    /**\n     * Converts an absolute time to a number\n     * @param {Any} The absolute time.\n     * @returns {Number} The absolute time in ms\n     */\n    VirtualTimeSchedulerPrototype.toAbsoluteTime = notImplemented;\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    VirtualTimeSchedulerPrototype.toRelativeTime = notImplemented;\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be emulated using recursive scheduling.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.schedulePeriodic = function (state, period, action) {\n      var s = new SchedulePeriodicRecursive(this, state, period, action);\n      return s.start();\n    };\n\n    /**\n     * Schedules an action to be executed after dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleRelative = function (state, dueTime, action) {\n      var runAt = this.add(this.clock, dueTime);\n      return this.scheduleAbsolute(state, runAt, action);\n    };\n\n    /**\n     * Starts the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.start = function () {\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n      }\n    };\n\n    /**\n     * Stops the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.stop = function () {\n      this.isEnabled = false;\n    };\n\n    /**\n     * Advances the scheduler's clock to the specified time, running all work till that point.\n     * @param {Number} time Absolute time to advance the scheduler's clock to.\n     */\n    VirtualTimeSchedulerPrototype.advanceTo = function (time) {\n      var dueToClock = this.comparer(this.clock, time);\n      if (this.comparer(this.clock, time) > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) { return; }\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null && this.comparer(next.dueTime, time) <= 0) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n        this.clock = time;\n      }\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.advanceBy = function (time) {\n      var dt = this.add(this.clock, time),\n          dueToClock = this.comparer(this.clock, dt);\n      if (dueToClock > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) {  return; }\n\n      this.advanceTo(dt);\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.sleep = function (time) {\n      var dt = this.add(this.clock, time);\n      if (this.comparer(this.clock, dt) >= 0) { throw new ArgumentOutOfRangeError(); }\n\n      this.clock = dt;\n    };\n\n    /**\n     * Gets the next scheduled item to be executed.\n     * @returns {ScheduledItem} The next scheduled item.\n     */\n    VirtualTimeSchedulerPrototype.getNext = function () {\n      while (this.queue.length > 0) {\n        var next = this.queue.peek();\n        if (next.isCancelled()) {\n          this.queue.dequeue();\n        } else {\n          return next;\n        }\n      }\n      return null;\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleAbsolute = function (state, dueTime, action) {\n      var self = this;\n\n      function run(scheduler, state1) {\n        self.queue.remove(si);\n        return action(scheduler, state1);\n      }\n\n      var si = new ScheduledItem(this, state, run, dueTime, this.comparer);\n      this.queue.enqueue(si);\n\n      return si.disposable;\n    };\n\n    return VirtualTimeScheduler;\n  }(Scheduler));\n\nfunction OnNextPredicate(predicate) {\n    this.predicate = predicate;\n}\n\nOnNextPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'N') { return false; }\n  return this.predicate(other.value);\n};\n\nfunction OnErrorPredicate(predicate) {\n  this.predicate = predicate;\n}\n\nOnErrorPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'E') { return false; }\n  return this.predicate(other.error);\n};\n\nvar ReactiveTest = Rx.ReactiveTest = {\n  /** Default virtual time used for creation of observable sequences in unit tests. */\n  created: 100,\n  /** Default virtual time used to subscribe to observable sequences in unit tests. */\n  subscribed: 200,\n  /** Default virtual time used to dispose subscriptions in unit tests. */\n  disposed: 1000,\n\n  /**\n   * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n   *\n   * 1 - ReactiveTest.onNext(200, 42);\n   * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n   *\n   * @param ticks Recorded virtual time the OnNext notification occurs.\n   * @param value Recorded value stored in the OnNext notification or a predicate.\n   * @return Recorded OnNext notification.\n   */\n  onNext: function (ticks, value) {\n    return typeof value === 'function' ?\n      new Recorded(ticks, new OnNextPredicate(value)) :\n      new Recorded(ticks, Notification.createOnNext(value));\n  },\n  /**\n   * Factory method for an OnError notification record at a given time with a given error.\n   *\n   * 1 - ReactiveTest.onNext(200, new Error('error'));\n   * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n   *\n   * @param ticks Recorded virtual time the OnError notification occurs.\n   * @param exception Recorded exception stored in the OnError notification.\n   * @return Recorded OnError notification.\n   */\n  onError: function (ticks, error) {\n    return typeof error === 'function' ?\n      new Recorded(ticks, new OnErrorPredicate(error)) :\n      new Recorded(ticks, Notification.createOnError(error));\n  },\n  /**\n   * Factory method for an OnCompleted notification record at a given time.\n   *\n   * @param ticks Recorded virtual time the OnCompleted notification occurs.\n   * @return Recorded OnCompleted notification.\n   */\n  onCompleted: function (ticks) {\n    return new Recorded(ticks, Notification.createOnCompleted());\n  },\n  /**\n   * Factory method for a subscription record based on a given subscription and disposal time.\n   *\n   * @param start Virtual time indicating when the subscription was created.\n   * @param end Virtual time indicating when the subscription was disposed.\n   * @return Subscription object.\n   */\n  subscribe: function (start, end) {\n    return new Subscription(start, end);\n  }\n};\n\n  /**\n   * Creates a new object recording the production of the specified value at the given virtual time.\n   *\n   * @constructor\n   * @param {Number} time Virtual time the value was produced on.\n   * @param {Mixed} value Value that was produced.\n   * @param {Function} comparer An optional comparer.\n   */\n  var Recorded = Rx.Recorded = function (time, value, comparer) {\n    this.time = time;\n    this.value = value;\n    this.comparer = comparer || defaultComparer;\n  };\n\n  /**\n   * Checks whether the given recorded object is equal to the current instance.\n   *\n   * @param {Recorded} other Recorded object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Recorded.prototype.equals = function (other) {\n    return this.time === other.time && this.comparer(this.value, other.value);\n  };\n\n  /**\n   * Returns a string representation of the current Recorded value.\n   *\n   * @returns {String} String representation of the current Recorded value.\n   */\n  Recorded.prototype.toString = function () {\n    return this.value.toString() + '@' + this.time;\n  };\n\n  /**\n   * Creates a new subscription object with the given virtual subscription and unsubscription time.\n   *\n   * @constructor\n   * @param {Number} subscribe Virtual time at which the subscription occurred.\n   * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n   */\n  var Subscription = Rx.Subscription = function (start, end) {\n    this.subscribe = start;\n    this.unsubscribe = end || Number.MAX_VALUE;\n  };\n\n  /**\n   * Checks whether the given subscription is equal to the current instance.\n   * @param other Subscription object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Subscription.prototype.equals = function (other) {\n    return this.subscribe === other.subscribe && this.unsubscribe === other.unsubscribe;\n  };\n\n  /**\n   * Returns a string representation of the current Subscription value.\n   * @returns {String} String representation of the current Subscription value.\n   */\n  Subscription.prototype.toString = function () {\n    return '(' + this.subscribe + ', ' + (this.unsubscribe === Number.MAX_VALUE ? 'Infinite' : this.unsubscribe) + ')';\n  };\n\n  var MockDisposable = Rx.MockDisposable = function (scheduler) {\n    this.scheduler = scheduler;\n    this.disposes = [];\n    this.disposes.push(this.scheduler.clock);\n  };\n\n  MockDisposable.prototype.dispose = function () {\n    this.disposes.push(this.scheduler.clock);\n  };\n\n  var MockObserver = (function (__super__) {\n    inherits(MockObserver, __super__);\n\n    function MockObserver(scheduler) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = [];\n    }\n\n    var MockObserverPrototype = MockObserver.prototype;\n\n    MockObserverPrototype.onNext = function (value) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnNext(value)));\n    };\n\n    MockObserverPrototype.onError = function (e) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnError(e)));\n    };\n\n    MockObserverPrototype.onCompleted = function () {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnCompleted()));\n    };\n\n    return MockObserver;\n  })(Observer);\n\n  function MockPromise(scheduler, messages) {\n    var self = this;\n    this.scheduler = scheduler;\n    this.messages = messages;\n    this.subscriptions = [];\n    this.observers = [];\n    for (var i = 0, len = this.messages.length; i < len; i++) {\n      var message = this.messages[i],\n          notification = message.value;\n      (function (innerNotification) {\n        scheduler.scheduleAbsolute(null, message.time, function () {\n          var obs = self.observers.slice(0);\n\n          for (var j = 0, jLen = obs.length; j < jLen; j++) {\n            innerNotification.accept(obs[j]);\n          }\n          return disposableEmpty;\n        });\n      })(notification);\n    }\n  }\n\n  MockPromise.prototype.then = function (onResolved, onRejected) {\n    var self = this;\n\n    this.subscriptions.push(new Subscription(this.scheduler.clock));\n    var index = this.subscriptions.length - 1;\n\n    var newPromise;\n\n    var observer = Rx.Observer.create(\n      function (x) {\n        var retValue = onResolved(x);\n        if (retValue && typeof retValue.then === 'function') {\n          newPromise = retValue;\n        } else {\n          var ticks = self.scheduler.clock;\n          newPromise = new MockPromise(self.scheduler, [Rx.ReactiveTest.onNext(ticks, undefined), Rx.ReactiveTest.onCompleted(ticks)]);\n        }\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      },\n      function (err) {\n        onRejected(err);\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      }\n    );\n    this.observers.push(observer);\n\n    return newPromise || new MockPromise(this.scheduler, this.messages);\n  };\n\n  var HotObservable = (function (__super__) {\n    inherits(HotObservable, __super__);\n\n    function HotObservable(scheduler, messages) {\n      __super__.call(this);\n      var message, notification, observable = this;\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n      this.observers = [];\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          scheduler.scheduleAbsolute(null, message.time, function () {\n            var obs = observable.observers.slice(0);\n\n            for (var j = 0, jLen = obs.length; j < jLen; j++) {\n              innerNotification.accept(obs[j]);\n            }\n            return disposableEmpty;\n          });\n        })(notification);\n      }\n    }\n\n    HotObservable.prototype._subscribe = function (o) {\n      var observable = this;\n      this.observers.push(o);\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      return disposableCreate(function () {\n        var idx = observable.observers.indexOf(o);\n        observable.observers.splice(idx, 1);\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n      });\n    };\n\n    return HotObservable;\n  })(Observable);\n\n  var ColdObservable = (function (__super__) {\n    inherits(ColdObservable, __super__);\n\n    function ColdObservable(scheduler, messages) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n    }\n\n    ColdObservable.prototype._subscribe = function (o) {\n      var message, notification, observable = this;\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      var d = new CompositeDisposable();\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          d.add(observable.scheduler.scheduleRelative(null, message.time, function () {\n            innerNotification.accept(o);\n            return disposableEmpty;\n          }));\n        })(notification);\n      }\n      return disposableCreate(function () {\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n        d.dispose();\n      });\n    };\n\n    return ColdObservable;\n  })(Observable);\n\n  /** Virtual time scheduler used for testing applications and libraries built using Reactive Extensions. */\n  Rx.TestScheduler = (function (__super__) {\n    inherits(TestScheduler, __super__);\n\n    function baseComparer(x, y) {\n      return x > y ? 1 : (x < y ? -1 : 0);\n    }\n\n    function TestScheduler() {\n      __super__.call(this, 0, baseComparer);\n    }\n\n    /**\n     * Schedules an action to be executed at the specified virtual time.\n     *\n     * @param state State passed to the action to be executed.\n     * @param dueTime Absolute virtual time at which to execute the action.\n     * @param action Action to be executed.\n     * @return Disposable object used to cancel the scheduled action (best effort).\n     */\n    TestScheduler.prototype.scheduleAbsolute = function (state, dueTime, action) {\n      dueTime <= this.clock && (dueTime = this.clock + 1);\n      return __super__.prototype.scheduleAbsolute.call(this, state, dueTime, action);\n    };\n    /**\n     * Adds a relative virtual time to an absolute virtual time value.\n     *\n     * @param absolute Absolute virtual time value.\n     * @param relative Relative virtual time value to add.\n     * @return Resulting absolute virtual time sum value.\n     */\n    TestScheduler.prototype.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n    /**\n     * Converts the absolute virtual time value to a DateTimeOffset value.\n     *\n     * @param absolute Absolute virtual time value to convert.\n     * @return Corresponding DateTimeOffset value.\n     */\n    TestScheduler.prototype.toAbsoluteTime = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     *\n     * @param timeSpan TimeSpan value to convert.\n     * @return Corresponding relative virtual time value.\n     */\n    TestScheduler.prototype.toRelativeTime = function (timeSpan) {\n      return timeSpan;\n    };\n    /**\n     * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n     *\n     * @param create Factory method to create an observable sequence.\n     * @param created Virtual time at which to invoke the factory to create an observable sequence.\n     * @param subscribed Virtual time at which to subscribe to the created observable sequence.\n     * @param disposed Virtual time at which to dispose the subscription.\n     * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n     */\n    TestScheduler.prototype.startScheduler = function (createFn, settings) {\n      settings || (settings = {});\n      settings.created == null && (settings.created = ReactiveTest.created);\n      settings.subscribed == null && (settings.subscribed = ReactiveTest.subscribed);\n      settings.disposed == null && (settings.disposed = ReactiveTest.disposed);\n\n      var observer = this.createObserver(), source, subscription;\n\n      this.scheduleAbsolute(null, settings.created, function () {\n        source = createFn();\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.subscribed, function () {\n        subscription = source.subscribe(observer);\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.disposed, function () {\n        subscription.dispose();\n        return disposableEmpty;\n      });\n\n      this.start();\n\n      return observer;\n    };\n\n    /**\n     * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n     * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createHotObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new HotObservable(this, args);\n    };\n\n    /**\n     * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n     * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createColdObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new ColdObservable(this, args);\n    };\n\n    /**\n     * Creates a resolved promise with the given value and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} value The value to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which fulfills with the given value.\n     */\n    TestScheduler.prototype.createResolvedPromise = function (ticks, value) {\n      return new MockPromise(this, [Rx.ReactiveTest.onNext(ticks, value), Rx.ReactiveTest.onCompleted(ticks)]);\n    };\n\n    /**\n     * Creates a rejected promise with the given reason and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} reason The reason for rejection to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which rejects with the given reason.\n     */\n    TestScheduler.prototype.createRejectedPromise = function (ticks, reason) {\n      return new MockPromise(this, [Rx.ReactiveTest.onError(ticks, reason)]);\n    };\n\n    /**\n     * Creates an observer that records received notification messages and timestamps those.\n     * @return Observer that can be used to assert the timing of received notifications.\n     */\n    TestScheduler.prototype.createObserver = function () {\n      return new MockObserver(this);\n    };\n\n    return TestScheduler;\n  })(VirtualTimeScheduler);\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite/package.json",
    "content": "{\n  \"name\": \"rx-lite\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Lite\",\n  \"description\": \"Lightweight library for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.js\"\n  },\n  \"dependencies\": {},\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite/readme.md",
    "content": "# RxJS Lite Module #\n\nThe Reactive Extensions for JavaScript Lite version is a lightweight version of the Reactive Extensions for JavaScript which covers most of the day to day operators you might use all in a single library.  Functionality such as bridging to events, promises, callbacks, Node.js-style callbacks, time-based operations and more are built right in.  This comes with `rx.lite.js` which is for use in modern development environments such as > IE9 and server-side environments such as Node.js.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite\n$ npm install -g rx-lite\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.js\"></script>\n```\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`catch | catchException`](../../doc/api/core/operators/catch.md)\n- [`concat`](../../doc/api/core/operators/concat.md)\n- [`create | createWithDisposable`](../../doc/api/core/operators/create.md)\n- [`defer`](../../doc/api/core/operators/defer.md)\n- [`empty`](../../doc/api/core/operators/empty.md)\n- [`from`](../../doc/api/core/operators/from.md)\n- [`fromArray`](../../doc/api/core/operators/fromarray.md)\n- [`fromCallback`](../../doc/api/core/operators/fromcallback.md)\n- [`fromEvent`](../../doc/api/core/operators/fromevent.md)\n- [`fromEventPattern`](../../doc/api/core/operators/fromeventpattern.md)\n- [`fromNodeCallback`](../../doc/api/core/operators/fromnodecallback.md)\n- [`fromPromise`](../../doc/api/core/operators/frompromise.md)\n- [`interval`](../../doc/api/core/operators/interval.md)\n- [`just`](../../doc/api/core/operators/return.md)\n- [`merge`](../../doc/api/core/operators/merge.md)\n- [`mergeDelayError`](../../doc/api/core/operators/mergedelayerror.md)\n- [`never`](../../doc/api/core/operators/never.md)\n- [`of`](../../doc/api/core/operators/of.md)\n- [`ofWithScheduler`](../../doc/api/core/operators/ofwithscheduler.md)\n- [`range`](../../doc/api/core/operators/range.md)\n- [`repeat`](../../doc/api/core/operators/repeat.md)\n- [`return | returnValue`](../../doc/api/core/operators/return.md)\n- [`throw | throwError | throwException`](../../doc/api/core/operators/throw.md)\n- [`timer`](../../doc/api/core/operators/timer.md)\n- [`zip`](../../doc/api/core/operators/zip.md)\n- [`zipArray`](../../doc/api/core/operators/ziparray.md)\n\n### `Observable Instance Methods`\n- [`asObservable`](../../doc/api/core/operators/asobservable.md)\n- [`catch | catchException`](../../doc/api/core/operators/catchproto.md)\n- [`combineLatest`](../../doc/api/core/operators/combinelatest.md)\n- [`concat`](../../doc/api/core/operators/concatproto.md)\n- [`concatMap`](../../doc/api/core/operators/concatmap.md)\n- [`connect`](../../doc/api/core/operators/connect.md)\n- [`debounce`](../../doc/api/core/operators/debounce.md)  \n- [`defaultIfEmpty`](../../doc/api/core/operators/defaultifempty.md)\n- [`delay`](../../doc/api/core/operators/delay.md)\n- [`dematerialize`](../../doc/api/core/operators/dematerialize.md)\n- [`distinctUntilChanged`](../../doc/api/core/operators/distinctuntilchanged.md)\n- [`do | doAction`](../../doc/api/core/operators/do.md)\n- [`doOnNext`](../../doc/api/core/operators/doonnext.md)\n- [`doOnError`](../../doc/api/core/operators/doonerror.md)\n- [`doOnCompleted`](../../doc/api/core/operators/dooncompleted.md)\n- [`filter`](../../doc/api/core/operators/where.md)\n- [`finally | finallyAction`](../../doc/api/core/operators/finally.md)\n- [`flatMap`](../../doc/api/core/operators/selectmany.md)\n- [`flatMapLatest`](../../doc/api/core/operators/flatmaplatest.md)\n- [`ignoreElements`](../../doc/api/core/operators/ignoreelements.md)\n- [`map`](../../doc/api/core/operators/select.md)\n- [`merge`](../../doc/api/core/operators/mergeproto.md)\n- [`mergeObservable | mergeAll`](../../doc/api/core/operators/mergeall.md)\n- [`multicast`](../../doc/api/core/operators/multicast.md)\n- [`publish`](../../doc/api/core/operators/publish.md)\n- [`publishLast`](../../doc/api/core/operators/publishlast.md)\n- [`publishValue`](../../doc/api/core/operators/publishvalue.md)\n- [`refCount`](../../doc/api/core/operators/refcount.md)\n- [`repeat`](../../doc/api/core/operators/repeat.md)\n- [`replay`](../../doc/api/core/operators/replay.md)\n- [`retry`](../../doc/api/core/operators/retry.md)\n- [`retryWhen`](../../doc/api/core/operators/retrywhen.md)\n- [`sample`](../../doc/api/core/operators/sample.md)\n- [`scan`](../../doc/api/core/operators/scan.md)\n- [`select`](../../doc/api/core/operators/select.md)\n- [`selectConcat`](../../doc/api/core/operators/concatmap.md)\n- [`selectMany`](../../doc/api/core/operators/selectmany.md)\n- [`selectSwitch`](../../doc/api/core/operators/flatmaplatest.md)\n- [`singleInstance`](../../doc/api/core/operators/singleinstance.md)\n- [`skip`](../../doc/api/core/operators/skip.md)\n- [`skipLast`](../../doc/api/core/operators/skiplast.md)\n- [`skipUntil`](../../doc/api/core/operators/skipuntil.md)\n- [`skipWhile`](../../doc/api/core/operators/skipwhile.md)\n- [`startWith`](../../doc/api/core/operators/startwith.md)\n- [`subscribe | forEach`](../../doc/api/core/operators/subscribe.md)\n- [`subscribeOnNext`](../../doc/api/core/operators/subscribeonnext.md)\n- [`subscribeOnError`](../../doc/api/core/operators/subscribeonerror.md)\n- [`subscribeOnCompleted`](../../doc/api/core/operators/subscribeoncompleted.md)\n- [`switch | switchLatest`](../../doc/api/core/operators/switch.md)\n- [`take`](../../doc/api/core/operators/take.md)\n- [`takeLast`](../../doc/api/core/operators/takelast.md)\n- [`takeUntil`](../../doc/api/core/operators/takeuntil.md)\n- [`takeWhile`](../../doc/api/core/operators/takewhile.md)\n- [`tap`](../../doc/api/core/operators/do.md)\n- [`tapOnNext`](../../doc/api/core/operators/doonnext.md)\n- [`tapOnError`](../../doc/api/core/operators/doonerror.md)\n- [`tapOnCompleted`](../../doc/api/core/operators/dooncompleted.md)\n- [`throttle`](../../doc/api/core/operators/throttle.md)\n- [`timeout`](../../doc/api/core/operators/timeout.md)\n- [`timestamp`](../../doc/api/core/operators/timestamp.md)\n- [`toArray`](../../doc/api/core/operators/toarray.md)\n- [`transduce`](../../doc/api/core/operators/transduce.md)\n- [`where`](../../doc/api/core/operators/where.md)\n- [`withLatestFrom`](../../doc/api/core/operators/withlatestfrom.md)\n- [`zip`](../../doc/api/core/operators/zipproto.md)\n\n## Included Classes ##\n\n### Core Objects\n- [`Rx.Observer`](../../doc/api/core/observer.md)\n- [`Rx.Notification`](../../doc/api/core/notification.md)\n\n### Subjects\n\n- [`Rx.AsyncSubject`](../../doc/api/subjects/asyncsubject.md)\n- [`Rx.BehaviorSubject`](../../doc/api/subjects/behaviorsubject.md)\n- [`Rx.ReplaySubject`](../../doc/api/subjects/replaysubject.md)\n- [`Rx.Subject`](../../doc/api/subjects/subject.md)\n\n### Schedulers\n\n- [`Rx.Scheduler`](../../doc/api/schedulers/scheduler.md)\n\n### Disposables\n\n- [`Rx.CompositeDisposable`](../../doc/api/disposables/compositedisposable.md)\n- [`Rx.Disposable`](../../doc/api/disposables/disposable.md)\n- [`Rx.RefCountDisposable`](../../doc/api/disposables/refcountdisposable.md)\n- [`Rx.SerialDisposable`](../../doc/api/disposables/serialdisposable.md)\n- [`Rx.SingleAssignmentDisposable`](../../doc/api/disposables/singleassignmentdisposable.md)\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite/rx.lite.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (undefined) {\n\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  var Rx = {\n    internals: {},\n    config: {\n      Promise: root.Promise\n    },\n    helpers: { }\n  };\n\n  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    defaultNow = Rx.helpers.defaultNow = Date.now,\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.subscribe !== 'function' && typeof p.then === 'function'; },\n    isFunction = Rx.helpers.isFunction = (function () {\n\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      };\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n\n      return isFn;\n    }());\n\n    function cloneArray(arr) {\n      var len = arr.length, a = new Array(len);\n      for(var i = 0; i < len; i++) { a[i] = arr[i]; }\n      return a;\n    }\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  Rx.config.longStackSupport = false;\n  var hasStacks = false, stacks = tryCatch(function () { throw new Error(); })();\n  hasStacks = !!stacks.e && !!stacks.e.stack;\n\n  // All code after this point will be filtered from stack traces reported by RxJS\n  var rStartingLine = captureLine(), rFileName;\n\n  var STACK_JUMP_SEPARATOR = 'From previous event:';\n\n  function makeStackTraceLong(error, observable) {\n    // If possible, transform the error stack trace by removing Node and RxJS\n    // cruft, then concatenating with the stack trace of `observable`.\n    if (hasStacks &&\n        observable.stack &&\n        typeof error === 'object' &&\n        error !== null &&\n        error.stack &&\n        error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n    ) {\n      var stacks = [];\n      for (var o = observable; !!o; o = o.source) {\n        if (o.stack) {\n          stacks.unshift(o.stack);\n        }\n      }\n      stacks.unshift(error.stack);\n\n      var concatedStacks = stacks.join('\\n' + STACK_JUMP_SEPARATOR + '\\n');\n      error.stack = filterStackString(concatedStacks);\n    }\n  }\n\n  function filterStackString(stackString) {\n    var lines = stackString.split('\\n'), desiredLines = [];\n    for (var i = 0, len = lines.length; i < len; i++) {\n      var line = lines[i];\n\n      if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n        desiredLines.push(line);\n      }\n    }\n    return desiredLines.join('\\n');\n  }\n\n  function isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n    if (!fileNameAndLineNumber) {\n      return false;\n    }\n    var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === rFileName &&\n      lineNumber >= rStartingLine &&\n      lineNumber <= rEndingLine;\n  }\n\n  function isNodeFrame(stackLine) {\n    return stackLine.indexOf('(module.js:') !== -1 ||\n      stackLine.indexOf('(node.js:') !== -1;\n  }\n\n  function captureLine() {\n    if (!hasStacks) { return; }\n\n    try {\n      throw new Error();\n    } catch (e) {\n      var lines = e.stack.split('\\n');\n      var firstLine = lines[0].indexOf('@') > 0 ? lines[1] : lines[2];\n      var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n      if (!fileNameAndLineNumber) { return; }\n\n      rFileName = fileNameAndLineNumber[0];\n      return fileNameAndLineNumber[1];\n    }\n  }\n\n  function getFileNameAndLineNumber(stackLine) {\n    // Named functions: 'at functionName (filename:lineNumber:columnNumber)'\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }\n\n    // Anonymous functions: 'at filename:lineNumber:columnNumber'\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }\n\n    // Firefox style: 'function@filename:lineNumber or @filename:lineNumber'\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }\n  }\n\n  var EmptyError = Rx.EmptyError = function() {\n    this.message = 'Sequence contains no elements.';\n    Error.call(this);\n  };\n  EmptyError.prototype = Object.create(Error.prototype);\n  EmptyError.prototype.name = 'EmptyError';\n\n  var ObjectDisposedError = Rx.ObjectDisposedError = function() {\n    this.message = 'Object has been disposed';\n    Error.call(this);\n  };\n  ObjectDisposedError.prototype = Object.create(Error.prototype);\n  ObjectDisposedError.prototype.name = 'ObjectDisposedError';\n\n  var ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError = function () {\n    this.message = 'Argument out of range';\n    Error.call(this);\n  };\n  ArgumentOutOfRangeError.prototype = Object.create(Error.prototype);\n  ArgumentOutOfRangeError.prototype.name = 'ArgumentOutOfRangeError';\n\n  var NotSupportedError = Rx.NotSupportedError = function (message) {\n    this.message = message || 'This operation is not supported';\n    Error.call(this);\n  };\n  NotSupportedError.prototype = Object.create(Error.prototype);\n  NotSupportedError.prototype.name = 'NotSupportedError';\n\n  var NotImplementedError = Rx.NotImplementedError = function (message) {\n    this.message = message || 'This operation is not implemented';\n    Error.call(this);\n  };\n  NotImplementedError.prototype = Object.create(Error.prototype);\n  NotImplementedError.prototype.name = 'NotImplementedError';\n\n  var notImplemented = Rx.helpers.notImplemented = function () {\n    throw new NotImplementedError();\n  };\n\n  var notSupported = Rx.helpers.notSupported = function () {\n    throw new NotSupportedError();\n  };\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o && o[$iterator$] !== undefined;\n  };\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  };\n\n  Rx.helpers.iterator = $iterator$;\n\n  var bindCallback = Rx.internals.bindCallback = function (func, thisArg, argCount) {\n    if (typeof thisArg === 'undefined') { return func; }\n    switch(argCount) {\n      case 0:\n        return function() {\n          return func.call(thisArg)\n        };\n      case 1:\n        return function(arg) {\n          return func.call(thisArg, arg);\n        };\n      case 2:\n        return function(value, index) {\n          return func.call(thisArg, value, index);\n        };\n      case 3:\n        return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n    }\n\n    return function() {\n      return func.apply(thisArg, arguments);\n    };\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var dontEnums = ['toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'],\n  dontEnumsLength = dontEnums.length;\n\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\nvar objectProto = Object.prototype,\n    hasOwnProperty = objectProto.hasOwnProperty,\n    objToString = objectProto.toString,\n    MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\nvar keys = Object.keys || (function() {\n    var hasOwnProperty = Object.prototype.hasOwnProperty,\n        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),\n        dontEnums = [\n          'toString',\n          'toLocaleString',\n          'valueOf',\n          'hasOwnProperty',\n          'isPrototypeOf',\n          'propertyIsEnumerable',\n          'constructor'\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    return function(obj) {\n      if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n        throw new TypeError('Object.keys called on non-object');\n      }\n\n      var result = [], prop, i;\n\n      for (prop in obj) {\n        if (hasOwnProperty.call(obj, prop)) {\n          result.push(prop);\n        }\n      }\n\n      if (hasDontEnumBug) {\n        for (i = 0; i < dontEnumsLength; i++) {\n          if (hasOwnProperty.call(obj, dontEnums[i])) {\n            result.push(dontEnums[i]);\n          }\n        }\n      }\n      return result;\n    };\n  }());\n\nfunction equalObjects(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objProps = keys(object),\n      objLength = objProps.length,\n      othProps = keys(other),\n      othLength = othProps.length;\n\n  if (objLength !== othLength && !isLoose) {\n    return false;\n  }\n  var index = objLength, key;\n  while (index--) {\n    key = objProps[index];\n    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  var skipCtor = isLoose;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key],\n        result;\n\n    if (!(result === undefined ? equalFunc(objValue, othValue, isLoose, stackA, stackB) : result)) {\n      return false;\n    }\n    skipCtor || (skipCtor = key === 'constructor');\n  }\n  if (!skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    if (objCtor !== othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor === 'function' && objCtor instanceof objCtor &&\n          typeof othCtor === 'function' && othCtor instanceof othCtor)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction equalByTag(object, other, tag) {\n  switch (tag) {\n    case boolTag:\n    case dateTag:\n      return +object === +other;\n\n    case errorTag:\n      return object.name === other.name && object.message === other.message;\n\n    case numberTag:\n      return (object !== +object) ?\n        other !== +other :\n        object === +other;\n\n    case regexpTag:\n    case stringTag:\n      return object === (other + '');\n  }\n  return false;\n}\n\nvar isObject = Rx.internals.isObject = function(value) {\n  var type = typeof value;\n  return !!value && (type === 'object' || type === 'function');\n};\n\nfunction isObjectLike(value) {\n  return !!value && typeof value === 'object';\n}\n\nfunction isLength(value) {\n  return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nvar isHostObject = (function() {\n  try {\n    Object({ 'toString': 0 } + '');\n  } catch(e) {\n    return function() { return false; };\n  }\n  return function(value) {\n    return typeof value.toString !== 'function' && typeof (value + '') === 'string';\n  };\n}());\n\nfunction isTypedArray(value) {\n  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nvar isArray = Array.isArray || function(value) {\n  return isObjectLike(value) && isLength(value.length) && objToString.call(value) === arrayTag;\n};\n\nfunction arraySome (array, predicate) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction equalArrays(array, other, equalFunc, isLoose, stackA, stackB) {\n  var index = -1,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength !== othLength && !(isLoose && othLength > arrLength)) {\n    return false;\n  }\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index],\n        result;\n\n    if (result !== undefined) {\n      if (result) {\n        continue;\n      }\n      return false;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (isLoose) {\n      if (!arraySome(other, function(othValue) {\n            return arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB);\n          })) {\n        return false;\n      }\n    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB))) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction baseIsEqualDeep(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = arrayTag,\n      othTag = arrayTag;\n\n  if (!objIsArr) {\n    objTag = objToString.call(object);\n    if (objTag === argsTag) {\n      objTag = objectTag;\n    } else if (objTag !== objectTag) {\n      objIsArr = isTypedArray(object);\n    }\n  }\n  if (!othIsArr) {\n    othTag = objToString.call(other);\n    if (othTag === argsTag) {\n      othTag = objectTag;\n    }\n  }\n  var objIsObj = objTag === objectTag && !isHostObject(object),\n      othIsObj = othTag === objectTag && !isHostObject(other),\n      isSameTag = objTag === othTag;\n\n  if (isSameTag && !(objIsArr || objIsObj)) {\n    return equalByTag(object, other, objTag);\n  }\n  if (!isLoose) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, isLoose, stackA, stackB);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  // For more information on detecting circular references see https://es5.github.io/#JO.\n  stackA || (stackA = []);\n  stackB || (stackB = []);\n\n  var length = stackA.length;\n  while (length--) {\n    if (stackA[length] === object) {\n      return stackB[length] === other;\n    }\n  }\n  // Add `object` and `other` to the stack of traversed objects.\n  stackA.push(object);\n  stackB.push(other);\n\n  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, isLoose, stackA, stackB);\n\n  stackA.pop();\n  stackB.pop();\n\n  return result;\n}\n\nfunction baseIsEqual(value, other, isLoose, stackA, stackB) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, baseIsEqual, isLoose, stackA, stackB);\n}\n\nvar isEqual = Rx.internals.isEqual = function (value, other) {\n  return baseIsEqual(value, other);\n};\n\n  var hasProp = {}.hasOwnProperty,\n      slice = Array.prototype.slice;\n\n  var inherits = Rx.internals.inherits = function (child, parent) {\n    function __() { this.constructor = child; }\n    __.prototype = parent.prototype;\n    child.prototype = new __();\n  };\n\n  var addProperties = Rx.internals.addProperties = function (obj) {\n    for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n      var source = sources[idx];\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n  };\n\n  // Rx Utils\n  var addRef = Rx.internals.addRef = function (xs, r) {\n    return new AnonymousObservable(function (observer) {\n      return new BinaryDisposable(r.getDisposable(), xs.subscribe(observer));\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n\n  /**\n   * Represents a group of disposable resources that are disposed together.\n   * @constructor\n   */\n  var CompositeDisposable = Rx.CompositeDisposable = function () {\n    var args = [], i, len;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      len = arguments.length;\n      args = new Array(len);\n      for(i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    this.disposables = args;\n    this.isDisposed = false;\n    this.length = args.length;\n  };\n\n  var CompositeDisposablePrototype = CompositeDisposable.prototype;\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Mixed} item Disposable to add.\n   */\n  CompositeDisposablePrototype.add = function (item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n      this.length++;\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Mixed} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n  CompositeDisposablePrototype.remove = function (item) {\n    var shouldDispose = false;\n    if (!this.isDisposed) {\n      var idx = this.disposables.indexOf(item);\n      if (idx !== -1) {\n        shouldDispose = true;\n        this.disposables.splice(idx, 1);\n        this.length--;\n        item.dispose();\n      }\n    }\n    return shouldDispose;\n  };\n\n  /**\n   *  Disposes all disposables in the group and removes them from the group.\n   */\n  CompositeDisposablePrototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var len = this.disposables.length, currentDisposables = new Array(len);\n      for(var i = 0; i < len; i++) { currentDisposables[i] = this.disposables[i]; }\n      this.disposables = [];\n      this.length = 0;\n\n      for (i = 0; i < len; i++) {\n        currentDisposables[i].dispose();\n      }\n    }\n  };\n\n  /**\n   * Provides a set of static methods for creating Disposables.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   */\n  var Disposable = Rx.Disposable = function (action) {\n    this.isDisposed = false;\n    this.action = action || noop;\n  };\n\n  /** Performs the task of cleaning up resources. */\n  Disposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.action();\n      this.isDisposed = true;\n    }\n  };\n\n  /**\n   * Creates a disposable object that invokes the specified action when disposed.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   * @return {Disposable} The disposable object that runs the given action upon disposal.\n   */\n  var disposableCreate = Disposable.create = function (action) { return new Disposable(action); };\n\n  /**\n   * Gets the disposable that does nothing when disposed.\n   */\n  var disposableEmpty = Disposable.empty = { dispose: noop };\n\n  /**\n   * Validates whether the given object is a disposable\n   * @param {Object} Object to test whether it has a dispose method\n   * @returns {Boolean} true if a disposable object, else false.\n   */\n  var isDisposable = Disposable.isDisposable = function (d) {\n    return d && isFunction(d.dispose);\n  };\n\n  var checkDisposed = Disposable.checkDisposed = function (disposable) {\n    if (disposable.isDisposed) { throw new ObjectDisposedError(); }\n  };\n\n  var disposableFixup = Disposable._fixup = function (result) {\n    return isDisposable(result) ? result : disposableEmpty;\n  };\n\n  // Single assignment\n  var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SingleAssignmentDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SingleAssignmentDisposable.prototype.setDisposable = function (value) {\n    if (this.current) { throw new Error('Disposable has already been assigned'); }\n    var shouldDispose = this.isDisposed;\n    !shouldDispose && (this.current = value);\n    shouldDispose && value && value.dispose();\n  };\n  SingleAssignmentDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n      old && old.dispose();\n    }\n  };\n\n  // Multiple assignment disposable\n  var SerialDisposable = Rx.SerialDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SerialDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SerialDisposable.prototype.setDisposable = function (value) {\n    var shouldDispose = this.isDisposed;\n    if (!shouldDispose) {\n      var old = this.current;\n      this.current = value;\n    }\n    old && old.dispose();\n    shouldDispose && value && value.dispose();\n  };\n  SerialDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n    }\n    old && old.dispose();\n  };\n\n  var BinaryDisposable = Rx.BinaryDisposable = function (first, second) {\n    this._first = first;\n    this._second = second;\n    this.isDisposed = false;\n  };\n\n  BinaryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old1 = this._first;\n      this._first = null;\n      old1 && old1.dispose();\n      var old2 = this._second;\n      this._second = null;\n      old2 && old2.dispose();\n    }\n  };\n\n  var NAryDisposable = Rx.NAryDisposable = function (disposables) {\n    this._disposables = disposables;\n    this.isDisposed = false;\n  };\n\n  NAryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      for (var i = 0, len = this._disposables.length; i < len; i++) {\n        this._disposables[i].dispose();\n      }\n      this._disposables.length = 0;\n    }\n  };\n\n  /**\n   * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n   */\n  var RefCountDisposable = Rx.RefCountDisposable = (function () {\n\n    function InnerDisposable(disposable) {\n      this.disposable = disposable;\n      this.disposable.count++;\n      this.isInnerDisposed = false;\n    }\n\n    InnerDisposable.prototype.dispose = function () {\n      if (!this.disposable.isDisposed && !this.isInnerDisposed) {\n        this.isInnerDisposed = true;\n        this.disposable.count--;\n        if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {\n          this.disposable.isDisposed = true;\n          this.disposable.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Initializes a new instance of the RefCountDisposable with the specified disposable.\n     * @constructor\n     * @param {Disposable} disposable Underlying disposable.\n      */\n    function RefCountDisposable(disposable) {\n      this.underlyingDisposable = disposable;\n      this.isDisposed = false;\n      this.isPrimaryDisposed = false;\n      this.count = 0;\n    }\n\n    /**\n     * Disposes the underlying disposable only when all dependent disposables have been disposed\n     */\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed && !this.isPrimaryDisposed) {\n        this.isPrimaryDisposed = true;\n        if (this.count === 0) {\n          this.isDisposed = true;\n          this.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n     * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n     */\n    RefCountDisposable.prototype.getDisposable = function () {\n      return this.isDisposed ? disposableEmpty : new InnerDisposable(this);\n    };\n\n    return RefCountDisposable;\n  })();\n\n  var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) {\n    this.scheduler = scheduler;\n    this.state = state;\n    this.action = action;\n    this.dueTime = dueTime;\n    this.comparer = comparer || defaultSubComparer;\n    this.disposable = new SingleAssignmentDisposable();\n  };\n\n  ScheduledItem.prototype.invoke = function () {\n    this.disposable.setDisposable(this.invokeCore());\n  };\n\n  ScheduledItem.prototype.compareTo = function (other) {\n    return this.comparer(this.dueTime, other.dueTime);\n  };\n\n  ScheduledItem.prototype.isCancelled = function () {\n    return this.disposable.isDisposed;\n  };\n\n  ScheduledItem.prototype.invokeCore = function () {\n    return disposableFixup(this.action(this.scheduler, this.state));\n  };\n\n  /** Provides a set of static properties to access commonly used schedulers. */\n  var Scheduler = Rx.Scheduler = (function () {\n\n    function Scheduler() { }\n\n    /** Determines whether the given object is a scheduler */\n    Scheduler.isScheduler = function (s) {\n      return s instanceof Scheduler;\n    };\n\n    var schedulerProto = Scheduler.prototype;\n\n    /**\n   * Schedules an action to be executed.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.schedule = function (state, action) {\n      throw new NotImplementedError();\n    };\n\n  /**\n   * Schedules an action to be executed after dueTime.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @param {Number} dueTime Relative time after which to execute the action.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime;\n      dt instanceof Date && (dt = dt - this.now());\n      dt = Scheduler.normalize(dt);\n\n      if (dt === 0) { return this.schedule(state, action); }\n\n      return this._scheduleFuture(state, dt, action);\n    };\n\n    schedulerProto._scheduleFuture = function (state, dueTime, action) {\n      throw new NotImplementedError();\n    };\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.now = defaultNow;\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.prototype.now = defaultNow;\n\n    /**\n     * Normalizes the specified TimeSpan value to a positive value.\n     * @param {Number} timeSpan The time span value to normalize.\n     * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n     */\n    Scheduler.normalize = function (timeSpan) {\n      timeSpan < 0 && (timeSpan = 0);\n      return timeSpan;\n    };\n\n    return Scheduler;\n  }());\n\n  var normalizeTime = Scheduler.normalize, isScheduler = Scheduler.isScheduler;\n\n  (function (schedulerProto) {\n\n    function invokeRecImmediate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.schedule(state2, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    function invokeRecDate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2, dueTime1) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.scheduleFuture(state2, dueTime1, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursive = function (state, action) {\n      return this.schedule([state, action], invokeRecImmediate);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative or absolute due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number | Date} dueTime Relative or absolute time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveFuture = function (state, dueTime, action) {\n      return this.scheduleFuture([state, action], dueTime, invokeRecDate);\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    schedulerProto.schedulePeriodic = function(state, period, action) {\n      if (typeof root.setInterval === 'undefined') { throw new NotSupportedError(); }\n      period = normalizeTime(period);\n      var s = state, id = root.setInterval(function () { s = action(s); }, period);\n      return disposableCreate(function () { root.clearInterval(id); });\n    };\n\n  }(Scheduler.prototype));\n\n  /** Gets a scheduler that schedules work immediately on the current thread. */\n   var ImmediateScheduler = (function (__super__) {\n    inherits(ImmediateScheduler, __super__);\n    function ImmediateScheduler() {\n      __super__.call(this);\n    }\n\n    ImmediateScheduler.prototype.schedule = function (state, action) {\n      return disposableFixup(action(this, state));\n    };\n\n    return ImmediateScheduler;\n  }(Scheduler));\n\n  var immediateScheduler = Scheduler.immediate = new ImmediateScheduler();\n\n  /**\n   * Gets a scheduler that schedules work as soon as possible on the current thread.\n   */\n  var CurrentThreadScheduler = (function (__super__) {\n    var queue;\n\n    function runTrampoline () {\n      while (queue.length > 0) {\n        var item = queue.dequeue();\n        !item.isCancelled() && item.invoke();\n      }\n    }\n\n    inherits(CurrentThreadScheduler, __super__);\n    function CurrentThreadScheduler() {\n      __super__.call(this);\n    }\n\n    CurrentThreadScheduler.prototype.schedule = function (state, action) {\n      var si = new ScheduledItem(this, state, action, this.now());\n\n      if (!queue) {\n        queue = new PriorityQueue(4);\n        queue.enqueue(si);\n\n        var result = tryCatch(runTrampoline)();\n        queue = null;\n        if (result === errorObj) { thrower(result.e); }\n      } else {\n        queue.enqueue(si);\n      }\n      return si.disposable;\n    };\n\n    CurrentThreadScheduler.prototype.scheduleRequired = function () { return !queue; };\n\n    return CurrentThreadScheduler;\n  }(Scheduler));\n\n  var currentThreadScheduler = Scheduler.currentThread = new CurrentThreadScheduler();\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function createTick(self) {\n      return function tick(command, recurse) {\n        recurse(0, self._period);\n        var state = tryCatch(self._action)(self._state);\n        if (state === errorObj) {\n          self._cancel.dispose();\n          thrower(state.e);\n        }\n        self._state = state;\n      };\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveFuture(0, this._period, createTick(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  var scheduleMethod, clearMethod;\n\n  var localTimer = (function () {\n    var localSetTimeout, localClearTimeout = noop;\n    if (!!root.setTimeout) {\n      localSetTimeout = root.setTimeout;\n      localClearTimeout = root.clearTimeout;\n    } else if (!!root.WScript) {\n      localSetTimeout = function (fn, time) {\n        root.WScript.Sleep(time);\n        fn();\n      };\n    } else {\n      throw new NotSupportedError();\n    }\n\n    return {\n      setTimeout: localSetTimeout,\n      clearTimeout: localClearTimeout\n    };\n  }());\n  var localSetTimeout = localTimer.setTimeout,\n    localClearTimeout = localTimer.clearTimeout;\n\n  (function () {\n\n    var nextHandle = 1, tasksByHandle = {}, currentlyRunning = false;\n\n    clearMethod = function (handle) {\n      delete tasksByHandle[handle];\n    };\n\n    function runTask(handle) {\n      if (currentlyRunning) {\n        localSetTimeout(function () { runTask(handle); }, 0);\n      } else {\n        var task = tasksByHandle[handle];\n        if (task) {\n          currentlyRunning = true;\n          var result = tryCatch(task)();\n          clearMethod(handle);\n          currentlyRunning = false;\n          if (result === errorObj) { thrower(result.e); }\n        }\n      }\n    }\n\n    var reNative = new RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&\n      !reNative.test(setImmediate) && setImmediate;\n\n    function postMessageSupported () {\n      // Ensure not in a worker\n      if (!root.postMessage || root.importScripts) { return false; }\n      var isAsync = false, oldHandler = root.onmessage;\n      // Test for async\n      root.onmessage = function () { isAsync = true; };\n      root.postMessage('', '*');\n      root.onmessage = oldHandler;\n\n      return isAsync;\n    }\n\n    // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n    if (isFunction(setImmediate)) {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        setImmediate(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        process.nextTick(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (postMessageSupported()) {\n      var MSG_PREFIX = 'ms.rx.schedule' + Math.random();\n\n      var onGlobalPostMessage = function (event) {\n        // Only if we're a match to avoid any other global events\n        if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n          runTask(event.data.substring(MSG_PREFIX.length));\n        }\n      };\n\n      root.addEventListener('message', onGlobalPostMessage, false);\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        root.postMessage(MSG_PREFIX + id, '*');\n        return id;\n      };\n    } else if (!!root.MessageChannel) {\n      var channel = new root.MessageChannel();\n\n      channel.port1.onmessage = function (e) { runTask(e.data); };\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        channel.port2.postMessage(id);\n        return id;\n      };\n    } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {\n\n      scheduleMethod = function (action) {\n        var scriptElement = root.document.createElement('script');\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n\n        scriptElement.onreadystatechange = function () {\n          runTask(id);\n          scriptElement.onreadystatechange = null;\n          scriptElement.parentNode.removeChild(scriptElement);\n          scriptElement = null;\n        };\n        root.document.documentElement.appendChild(scriptElement);\n        return id;\n      };\n\n    } else {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        localSetTimeout(function () {\n          runTask(id);\n        }, 0);\n\n        return id;\n      };\n    }\n  }());\n\n  /**\n   * Gets a scheduler that schedules work via a timed callback based upon platform.\n   */\n   var DefaultScheduler = (function (__super__) {\n     inherits(DefaultScheduler, __super__);\n     function DefaultScheduler() {\n       __super__.call(this);\n     }\n\n     function scheduleAction(disposable, action, scheduler, state) {\n       return function schedule() {\n         disposable.setDisposable(Disposable._fixup(action(scheduler, state)));\n       };\n     }\n\n     function ClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     ClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         clearMethod(this._id);\n       }\n     };\n\n     function LocalClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     LocalClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         localClearTimeout(this._id);\n       }\n     };\n\n    DefaultScheduler.prototype.schedule = function (state, action) {\n      var disposable = new SingleAssignmentDisposable(),\n          id = scheduleMethod(scheduleAction(disposable, action, this, state));\n      return new BinaryDisposable(disposable, new ClearDisposable(id));\n    };\n\n    DefaultScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      if (dueTime === 0) { return this.schedule(state, action); }\n      var disposable = new SingleAssignmentDisposable(),\n          id = localSetTimeout(scheduleAction(disposable, action, this, state), dueTime);\n      return new BinaryDisposable(disposable, new LocalClearDisposable(id));\n    };\n\n    function scheduleLongRunning(state, action, disposable) {\n      return function () { action(state, disposable); };\n    }\n\n    DefaultScheduler.prototype.scheduleLongRunning = function (state, action) {\n      var disposable = disposableCreate(noop);\n      scheduleMethod(scheduleLongRunning(state, action, disposable));\n      return disposable;\n    };\n\n    return DefaultScheduler;\n  }(Scheduler));\n\n  var defaultScheduler = Scheduler['default'] = Scheduler.async = new DefaultScheduler();\n\n  function IndexedItem(id, value) {\n    this.id = id;\n    this.value = value;\n  }\n\n  IndexedItem.prototype.compareTo = function (other) {\n    var c = this.value.compareTo(other.value);\n    c === 0 && (c = this.id - other.id);\n    return c;\n  };\n\n  var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) {\n    this.items = new Array(capacity);\n    this.length = 0;\n  };\n\n  var priorityProto = PriorityQueue.prototype;\n  priorityProto.isHigherPriority = function (left, right) {\n    return this.items[left].compareTo(this.items[right]) < 0;\n  };\n\n  priorityProto.percolate = function (index) {\n    if (index >= this.length || index < 0) { return; }\n    var parent = index - 1 >> 1;\n    if (parent < 0 || parent === index) { return; }\n    if (this.isHigherPriority(index, parent)) {\n      var temp = this.items[index];\n      this.items[index] = this.items[parent];\n      this.items[parent] = temp;\n      this.percolate(parent);\n    }\n  };\n\n  priorityProto.heapify = function (index) {\n    +index || (index = 0);\n    if (index >= this.length || index < 0) { return; }\n    var left = 2 * index + 1,\n        right = 2 * index + 2,\n        first = index;\n    if (left < this.length && this.isHigherPriority(left, first)) {\n      first = left;\n    }\n    if (right < this.length && this.isHigherPriority(right, first)) {\n      first = right;\n    }\n    if (first !== index) {\n      var temp = this.items[index];\n      this.items[index] = this.items[first];\n      this.items[first] = temp;\n      this.heapify(first);\n    }\n  };\n\n  priorityProto.peek = function () { return this.items[0].value; };\n\n  priorityProto.removeAt = function (index) {\n    this.items[index] = this.items[--this.length];\n    this.items[this.length] = undefined;\n    this.heapify();\n  };\n\n  priorityProto.dequeue = function () {\n    var result = this.peek();\n    this.removeAt(0);\n    return result;\n  };\n\n  priorityProto.enqueue = function (item) {\n    var index = this.length++;\n    this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n    this.percolate(index);\n  };\n\n  priorityProto.remove = function (item) {\n    for (var i = 0; i < this.length; i++) {\n      if (this.items[i].value === item) {\n        this.removeAt(i);\n        return true;\n      }\n    }\n    return false;\n  };\n  PriorityQueue.count = 0;\n\n  /**\n   *  Represents a notification to an observer.\n   */\n  var Notification = Rx.Notification = (function () {\n    function Notification() {\n\n    }\n\n    Notification.prototype._accept = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    Notification.prototype._acceptObserver = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    /**\n     * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n     * @param {Function | Observer} observerOrOnNext Function to invoke for an OnNext notification or Observer to invoke the notification on..\n     * @param {Function} onError Function to invoke for an OnError notification.\n     * @param {Function} onCompleted Function to invoke for an OnCompleted notification.\n     * @returns {Any} Result produced by the observation.\n     */\n    Notification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n      return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n        this._acceptObserver(observerOrOnNext) :\n        this._accept(observerOrOnNext, onError, onCompleted);\n    };\n\n    /**\n     * Returns an observable sequence with a single notification.\n     *\n     * @memberOf Notifications\n     * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n     * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n     */\n    Notification.prototype.toObservable = function (scheduler) {\n      var self = this;\n      isScheduler(scheduler) || (scheduler = immediateScheduler);\n      return new AnonymousObservable(function (o) {\n        return scheduler.schedule(self, function (_, notification) {\n          notification._acceptObserver(o);\n          notification.kind === 'N' && o.onCompleted();\n        });\n      });\n    };\n\n    return Notification;\n  })();\n\n  var OnNextNotification = (function (__super__) {\n    inherits(OnNextNotification, __super__);\n    function OnNextNotification(value) {\n      this.value = value;\n      this.kind = 'N';\n    }\n\n    OnNextNotification.prototype._accept = function (onNext) {\n      return onNext(this.value);\n    };\n\n    OnNextNotification.prototype._acceptObserver = function (o) {\n      return o.onNext(this.value);\n    };\n\n    OnNextNotification.prototype.toString = function () {\n      return 'OnNext(' + this.value + ')';\n    };\n\n    return OnNextNotification;\n  }(Notification));\n\n  var OnErrorNotification = (function (__super__) {\n    inherits(OnErrorNotification, __super__);\n    function OnErrorNotification(error) {\n      this.error = error;\n      this.kind = 'E';\n    }\n\n    OnErrorNotification.prototype._accept = function (onNext, onError) {\n      return onError(this.error);\n    };\n\n    OnErrorNotification.prototype._acceptObserver = function (o) {\n      return o.onError(this.error);\n    };\n\n    OnErrorNotification.prototype.toString = function () {\n      return 'OnError(' + this.error + ')';\n    };\n\n    return OnErrorNotification;\n  }(Notification));\n\n  var OnCompletedNotification = (function (__super__) {\n    inherits(OnCompletedNotification, __super__);\n    function OnCompletedNotification() {\n      this.kind = 'C';\n    }\n\n    OnCompletedNotification.prototype._accept = function (onNext, onError, onCompleted) {\n      return onCompleted();\n    };\n\n    OnCompletedNotification.prototype._acceptObserver = function (o) {\n      return o.onCompleted();\n    };\n\n    OnCompletedNotification.prototype.toString = function () {\n      return 'OnCompleted()';\n    };\n\n    return OnCompletedNotification;\n  }(Notification));\n\n  /**\n   * Creates an object that represents an OnNext notification to an observer.\n   * @param {Any} value The value contained in the notification.\n   * @returns {Notification} The OnNext notification containing the value.\n   */\n  var notificationCreateOnNext = Notification.createOnNext = function (value) {\n    return new OnNextNotification(value);\n  };\n\n  /**\n   * Creates an object that represents an OnError notification to an observer.\n   * @param {Any} error The exception contained in the notification.\n   * @returns {Notification} The OnError notification containing the exception.\n   */\n  var notificationCreateOnError = Notification.createOnError = function (error) {\n    return new OnErrorNotification(error);\n  };\n\n  /**\n   * Creates an object that represents an OnCompleted notification to an observer.\n   * @returns {Notification} The OnCompleted notification.\n   */\n  var notificationCreateOnCompleted = Notification.createOnCompleted = function () {\n    return new OnCompletedNotification();\n  };\n\n  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n\n  /**\n   * Abstract base class for implementations of the Observer class.\n   * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n   */\n  var AbstractObserver = Rx.internals.AbstractObserver = (function (__super__) {\n    inherits(AbstractObserver, __super__);\n\n    /**\n     * Creates a new observer in a non-stopped state.\n     */\n    function AbstractObserver() {\n      this.isStopped = false;\n    }\n\n    // Must be implemented by other observers\n    AbstractObserver.prototype.next = notImplemented;\n    AbstractObserver.prototype.error = notImplemented;\n    AbstractObserver.prototype.completed = notImplemented;\n\n    /**\n     * Notifies the observer of a new element in the sequence.\n     * @param {Any} value Next element in the sequence.\n     */\n    AbstractObserver.prototype.onNext = function (value) {\n      !this.isStopped && this.next(value);\n    };\n\n    /**\n     * Notifies the observer that an exception has occurred.\n     * @param {Any} error The error that has occurred.\n     */\n    AbstractObserver.prototype.onError = function (error) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(error);\n      }\n    };\n\n    /**\n     * Notifies the observer of the end of the sequence.\n     */\n    AbstractObserver.prototype.onCompleted = function () {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.completed();\n      }\n    };\n\n    /**\n     * Disposes the observer, causing it to transition to the stopped state.\n     */\n    AbstractObserver.prototype.dispose = function () { this.isStopped = true; };\n\n    AbstractObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return AbstractObserver;\n  }(Observer));\n\n  /**\n   * Class to create an Observer instance from delegate-based implementations of the on* methods.\n   */\n  var AnonymousObserver = Rx.AnonymousObserver = (function (__super__) {\n    inherits(AnonymousObserver, __super__);\n\n    /**\n     * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n     * @param {Any} onNext Observer's OnNext action implementation.\n     * @param {Any} onError Observer's OnError action implementation.\n     * @param {Any} onCompleted Observer's OnCompleted action implementation.\n     */\n    function AnonymousObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    /**\n     * Calls the onNext action.\n     * @param {Any} value Next element in the sequence.\n     */\n    AnonymousObserver.prototype.next = function (value) {\n      this._onNext(value);\n    };\n\n    /**\n     * Calls the onError action.\n     * @param {Any} error The error that has occurred.\n     */\n    AnonymousObserver.prototype.error = function (error) {\n      this._onError(error);\n    };\n\n    /**\n     *  Calls the onCompleted action.\n     */\n    AnonymousObserver.prototype.completed = function () {\n      this._onCompleted();\n    };\n\n    return AnonymousObserver;\n  }(AbstractObserver));\n\n  var observableProto;\n\n  /**\n   * Represents a push-style collection.\n   */\n  var Observable = Rx.Observable = (function () {\n\n    function makeSubscribe(self, subscribe) {\n      return function (o) {\n        var oldOnError = o.onError;\n        o.onError = function (e) {\n          makeStackTraceLong(e, self);\n          oldOnError.call(o, e);\n        };\n\n        return subscribe.call(self, o);\n      };\n    }\n\n    function Observable() {\n      if (Rx.config.longStackSupport && hasStacks) {\n        var oldSubscribe = this._subscribe;\n        var e = tryCatch(thrower)(new Error()).e;\n        this.stack = e.stack.substring(e.stack.indexOf('\\n') + 1);\n        this._subscribe = makeSubscribe(this, oldSubscribe);\n      }\n    }\n\n    observableProto = Observable.prototype;\n\n    /**\n    * Determines whether the given object is an Observable\n    * @param {Any} An object to determine whether it is an Observable\n    * @returns {Boolean} true if an Observable, else false.\n    */\n    Observable.isObservable = function (o) {\n      return o && isFunction(o.subscribe);\n    };\n\n    /**\n     *  Subscribes an o to the observable sequence.\n     *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n     *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n     *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n     *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribe = observableProto.forEach = function (oOrOnNext, onError, onCompleted) {\n      return this._subscribe(typeof oOrOnNext === 'object' ?\n        oOrOnNext :\n        observerCreate(oOrOnNext, onError, onCompleted));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onNext The function to invoke on each element in the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnNext = function (onNext, thisArg) {\n      return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n    };\n\n    /**\n     * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n     * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnError = function (onError, thisArg) {\n      return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnCompleted = function (onCompleted, thisArg) {\n      return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n    };\n\n    return Observable;\n  })();\n\n  var ScheduledObserver = Rx.internals.ScheduledObserver = (function (__super__) {\n    inherits(ScheduledObserver, __super__);\n\n    function ScheduledObserver(scheduler, observer) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.observer = observer;\n      this.isAcquired = false;\n      this.hasFaulted = false;\n      this.queue = [];\n      this.disposable = new SerialDisposable();\n    }\n\n    function enqueueNext(observer, x) { return function () { observer.onNext(x); }; }\n    function enqueueError(observer, e) { return function () { observer.onError(e); }; }\n    function enqueueCompleted(observer) { return function () { observer.onCompleted(); }; }\n\n    ScheduledObserver.prototype.next = function (x) {\n      this.queue.push(enqueueNext(this.observer, x));\n    };\n\n    ScheduledObserver.prototype.error = function (e) {\n      this.queue.push(enqueueError(this.observer, e));\n    };\n\n    ScheduledObserver.prototype.completed = function () {\n      this.queue.push(enqueueCompleted(this.observer));\n    };\n\n\n    function scheduleMethod(state, recurse) {\n      var work;\n      if (state.queue.length > 0) {\n        work = state.queue.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var res = tryCatch(work)();\n      if (res === errorObj) {\n        state.queue = [];\n        state.hasFaulted = true;\n        return thrower(res.e);\n      }\n      recurse(state);\n    }\n\n    ScheduledObserver.prototype.ensureActive = function () {\n      var isOwner = false;\n      if (!this.hasFaulted && this.queue.length > 0) {\n        isOwner = !this.isAcquired;\n        this.isAcquired = true;\n      }\n      isOwner &&\n        this.disposable.setDisposable(this.scheduler.scheduleRecursive(this, scheduleMethod));\n    };\n\n    ScheduledObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.disposable.dispose();\n    };\n\n    return ScheduledObserver;\n  }(AbstractObserver));\n\n  var ObservableBase = Rx.ObservableBase = (function (__super__) {\n    inherits(ObservableBase, __super__);\n\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.subscribeCore).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function ObservableBase() {\n      __super__.call(this);\n    }\n\n    ObservableBase.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    ObservableBase.prototype.subscribeCore = notImplemented;\n\n    return ObservableBase;\n  }(Observable));\n\nvar FlatMapObservable = Rx.FlatMapObservable = (function(__super__) {\n\n    inherits(FlatMapObservable, __super__);\n\n    function FlatMapObservable(source, selector, resultSelector, thisArg) {\n      this.resultSelector = isFunction(resultSelector) ? resultSelector : null;\n      this.selector = bindCallback(isFunction(selector) ? selector : function() { return selector; }, thisArg, 3);\n      this.source = source;\n      __super__.call(this);\n    }\n\n    FlatMapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this.resultSelector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(observer, selector, resultSelector, source) {\n      this.i = 0;\n      this.selector = selector;\n      this.resultSelector = resultSelector;\n      this.source = source;\n      this.o = observer;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype._wrapResult = function(result, x, i) {\n      return this.resultSelector ?\n        result.map(function(y, i2) { return this.resultSelector(x, y, i, i2); }, this) :\n        result;\n    };\n\n    InnerObserver.prototype.next = function(x) {\n      var i = this.i++;\n      var result = tryCatch(this.selector)(x, i, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = Observable.from(result));\n      this.o.onNext(this._wrapResult(result, x, i));\n    };\n\n    InnerObserver.prototype.error = function(e) { this.o.onError(e); };\n\n    InnerObserver.prototype.completed = function() { this.o.onCompleted(); };\n\n    return FlatMapObservable;\n\n}(ObservableBase));\n\n  var Enumerable = Rx.internals.Enumerable = function () { };\n\n  function IsDisposedDisposable(state) {\n    this._s = state;\n    this.isDisposed = false;\n  }\n\n  IsDisposedDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      this._s.isDisposed = true;\n    }\n  };\n\n  var ConcatEnumerableObservable = (function(__super__) {\n    inherits(ConcatEnumerableObservable, __super__);\n    function ConcatEnumerableObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    ConcatEnumerableObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        o: o,\n        subscription: subscription,\n        e: this.sources[$iterator$]()\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.o.onError(e); };\n    InnerObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return ConcatEnumerableObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.concat = function () {\n    return new ConcatEnumerableObservable(this);\n  };\n\n  var CatchErrorObservable = (function(__super__) {\n    function CatchErrorObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    inherits(CatchErrorObservable, __super__);\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.lastError !== null ? state.o.onError(state.lastError) : state.o.onCompleted(); }\n\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    CatchErrorObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        e: this.sources[$iterator$](),\n        subscription: subscription,\n        lastError: null,\n        o: o\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.lastError = e; this._recurse(this._state); };\n    InnerObserver.prototype.completed = function () { this._state.o.onCompleted(); };\n\n    return CatchErrorObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.catchError = function () {\n    return new CatchErrorObservable(this);\n  };\n\n  var RepeatEnumerable = (function (__super__) {\n    inherits(RepeatEnumerable, __super__);\n    function RepeatEnumerable(v, c) {\n      this.v = v;\n      this.c = c == null ? -1 : c;\n    }\n\n    RepeatEnumerable.prototype[$iterator$] = function () {\n      return new RepeatEnumerator(this);\n    };\n\n    function RepeatEnumerator(p) {\n      this.v = p.v;\n      this.l = p.c;\n    }\n\n    RepeatEnumerator.prototype.next = function () {\n      if (this.l === 0) { return doneEnumerator; }\n      if (this.l > 0) { this.l--; }\n      return { done: false, value: this.v };\n    };\n\n    return RepeatEnumerable;\n  }(Enumerable));\n\n  var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) {\n    return new RepeatEnumerable(value, repeatCount);\n  };\n\n  var OfEnumerable = (function(__super__) {\n    inherits(OfEnumerable, __super__);\n    function OfEnumerable(s, fn, thisArg) {\n      this.s = s;\n      this.fn = fn ? bindCallback(fn, thisArg, 3) : null;\n    }\n    OfEnumerable.prototype[$iterator$] = function () {\n      return new OfEnumerator(this);\n    };\n\n    function OfEnumerator(p) {\n      this.i = -1;\n      this.s = p.s;\n      this.l = this.s.length;\n      this.fn = p.fn;\n    }\n\n    OfEnumerator.prototype.next = function () {\n     return ++this.i < this.l ?\n       { done: false, value: !this.fn ? this.s[this.i] : this.fn(this.s[this.i], this.i, this.s) } :\n       doneEnumerator;\n    };\n\n    return OfEnumerable;\n  }(Enumerable));\n\n  var enumerableOf = Enumerable.of = function (source, selector, thisArg) {\n    return new OfEnumerable(source, selector, thisArg);\n  };\n\n  var ToArrayObservable = (function(__super__) {\n    inherits(ToArrayObservable, __super__);\n    function ToArrayObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    ToArrayObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o) {\n      this.o = o;\n      this.a = [];\n      AbstractObserver.call(this);\n    }\n    \n    InnerObserver.prototype.next = function (x) { this.a.push(x); };\n    InnerObserver.prototype.error = function (e) { this.o.onError(e);  };\n    InnerObserver.prototype.completed = function () { this.o.onNext(this.a); this.o.onCompleted(); };\n\n    return ToArrayObservable;\n  }(ObservableBase));\n\n  /**\n  * Creates an array from an observable sequence.\n  * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n  */\n  observableProto.toArray = function () {\n    return new ToArrayObservable(this);\n  };\n\n  /**\n   *  Creates an observable sequence from a specified subscribe method implementation.\n   * @example\n   *  var res = Rx.Observable.create(function (observer) { return function () { } );\n   *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n   *  var res = Rx.Observable.create(function (observer) { } );\n   * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n   * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n   */\n  Observable.create = function (subscribe, parent) {\n    return new AnonymousObservable(subscribe, parent);\n  };\n\n  var Defer = (function(__super__) {\n    inherits(Defer, __super__);\n    function Defer(factory) {\n      this._f = factory;\n      __super__.call(this);\n    }\n\n    Defer.prototype.subscribeCore = function (o) {\n      var result = tryCatch(this._f)();\n      if (result === errorObj) { return observableThrow(result.e).subscribe(o);}\n      isPromise(result) && (result = observableFromPromise(result));\n      return result.subscribe(o);\n    };\n\n    return Defer;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n   *\n   * @example\n   *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n   * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n   * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n   */\n  var observableDefer = Observable.defer = function (observableFactory) {\n    return new Defer(observableFactory);\n  };\n\n  var EmptyObservable = (function(__super__) {\n    inherits(EmptyObservable, __super__);\n    function EmptyObservable(scheduler) {\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    EmptyObservable.prototype.subscribeCore = function (observer) {\n      var sink = new EmptySink(observer, this.scheduler);\n      return sink.run();\n    };\n\n    function EmptySink(observer, scheduler) {\n      this.observer = observer;\n      this.scheduler = scheduler;\n    }\n\n    function scheduleItem(s, state) {\n      state.onCompleted();\n      return disposableEmpty;\n    }\n\n    EmptySink.prototype.run = function () {\n      var state = this.observer;\n      return this.scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this.scheduler.schedule(state, scheduleItem);\n    };\n\n    return EmptyObservable;\n  }(ObservableBase));\n\n  var EMPTY_OBSERVABLE = new EmptyObservable(immediateScheduler);\n\n  /**\n   *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n   *\n   * @example\n   *  var res = Rx.Observable.empty();\n   *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n   * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n   * @returns {Observable} An observable sequence with no elements.\n   */\n  var observableEmpty = Observable.empty = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return scheduler === immediateScheduler ? EMPTY_OBSERVABLE : new EmptyObservable(scheduler);\n  };\n\n  var FromObservable = (function(__super__) {\n    inherits(FromObservable, __super__);\n    function FromObservable(iterable, fn, scheduler) {\n      this._iterable = iterable;\n      this._fn = fn;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function createScheduleMethod(o, it, fn) {\n      return function loopRecursive(i, recurse) {\n        var next = tryCatch(it.next).call(it);\n        if (next === errorObj) { return o.onError(next.e); }\n        if (next.done) { return o.onCompleted(); }\n\n        var result = next.value;\n\n        if (isFunction(fn)) {\n          result = tryCatch(fn)(result, i);\n          if (result === errorObj) { return o.onError(result.e); }\n        }\n\n        o.onNext(result);\n        recurse(i + 1);\n      };\n    }\n\n    FromObservable.prototype.subscribeCore = function (o) {\n      var list = Object(this._iterable),\n          it = getIterable(list);\n\n      return this._scheduler.scheduleRecursive(0, createScheduleMethod(o, it, this._fn));\n    };\n\n    return FromObservable;\n  }(ObservableBase));\n\n  var maxSafeInteger = Math.pow(2, 53) - 1;\n\n  function StringIterable(s) {\n    this._s = s;\n  }\n\n  StringIterable.prototype[$iterator$] = function () {\n    return new StringIterator(this._s);\n  };\n\n  function StringIterator(s) {\n    this._s = s;\n    this._l = s.length;\n    this._i = 0;\n  }\n\n  StringIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  StringIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._s.charAt(this._i++) } : doneEnumerator;\n  };\n\n  function ArrayIterable(a) {\n    this._a = a;\n  }\n\n  ArrayIterable.prototype[$iterator$] = function () {\n    return new ArrayIterator(this._a);\n  };\n\n  function ArrayIterator(a) {\n    this._a = a;\n    this._l = toLength(a);\n    this._i = 0;\n  }\n\n  ArrayIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  ArrayIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._a[this._i++] } : doneEnumerator;\n  };\n\n  function numberIsFinite(value) {\n    return typeof value === 'number' && root.isFinite(value);\n  }\n\n  function isNan(n) {\n    return n !== n;\n  }\n\n  function getIterable(o) {\n    var i = o[$iterator$], it;\n    if (!i && typeof o === 'string') {\n      it = new StringIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i && o.length !== undefined) {\n      it = new ArrayIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i) { throw new TypeError('Object is not iterable'); }\n    return o[$iterator$]();\n  }\n\n  function sign(value) {\n    var number = +value;\n    if (number === 0) { return number; }\n    if (isNaN(number)) { return number; }\n    return number < 0 ? -1 : 1;\n  }\n\n  function toLength(o) {\n    var len = +o.length;\n    if (isNaN(len)) { return 0; }\n    if (len === 0 || !numberIsFinite(len)) { return len; }\n    len = sign(len) * Math.floor(Math.abs(len));\n    if (len <= 0) { return 0; }\n    if (len > maxSafeInteger) { return maxSafeInteger; }\n    return len;\n  }\n\n  /**\n  * This method creates a new Observable sequence from an array-like or iterable object.\n  * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n  * @param {Function} [mapFn] Map function to call on every element of the array.\n  * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n  * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n  */\n  var observableFrom = Observable.from = function (iterable, mapFn, thisArg, scheduler) {\n    if (iterable == null) {\n      throw new Error('iterable cannot be null.')\n    }\n    if (mapFn && !isFunction(mapFn)) {\n      throw new Error('mapFn when provided must be a function');\n    }\n    if (mapFn) {\n      var mapper = bindCallback(mapFn, thisArg, 2);\n    }\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromObservable(iterable, mapper, scheduler);\n  }\n\n  var FromArrayObservable = (function(__super__) {\n    inherits(FromArrayObservable, __super__);\n    function FromArrayObservable(args, scheduler) {\n      this._args = args;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, args) {\n      var len = args.length;\n      return function loopRecursive (i, recurse) {\n        if (i < len) {\n          o.onNext(args[i]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    FromArrayObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._args));\n    };\n\n    return FromArrayObservable;\n  }(ObservableBase));\n\n  /**\n  *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n  * @deprecated use Observable.from or Observable.of\n  * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n  */\n  var observableFromArray = Observable.fromArray = function (array, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler)\n  };\n\n  var NeverObservable = (function(__super__) {\n    inherits(NeverObservable, __super__);\n    function NeverObservable() {\n      __super__.call(this);\n    }\n\n    NeverObservable.prototype.subscribeCore = function (observer) {\n      return disposableEmpty;\n    };\n\n    return NeverObservable;\n  }(ObservableBase));\n\n  var NEVER_OBSERVABLE = new NeverObservable();\n\n  /**\n   * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n   * @returns {Observable} An observable sequence whose observers will never get called.\n   */\n  var observableNever = Observable.never = function () {\n    return NEVER_OBSERVABLE;\n  };\n\n  function observableOf (scheduler, array) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler);\n  }\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.of = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return new FromArrayObservable(args, currentThreadScheduler);\n  };\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.ofWithScheduler = function (scheduler) {\n    var len = arguments.length, args = new Array(len - 1);\n    for(var i = 1; i < len; i++) { args[i - 1] = arguments[i]; }\n    return new FromArrayObservable(args, scheduler);\n  };\n\n  var PairsObservable = (function(__super__) {\n    inherits(PairsObservable, __super__);\n    function PairsObservable(o, scheduler) {\n      this._o = o;\n      this._keys = Object.keys(o);\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, obj, keys) {\n      return function loopRecursive(i, recurse) {\n        if (i < keys.length) {\n          var key = keys[i];\n          o.onNext([key, obj[key]]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    PairsObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._o, this._keys));\n    };\n\n    return PairsObservable;\n  }(ObservableBase));\n\n  /**\n   * Convert an object into an observable sequence of [key, value] pairs.\n   * @param {Object} obj The object to inspect.\n   * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n   * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n   */\n  Observable.pairs = function (obj, scheduler) {\n    scheduler || (scheduler = currentThreadScheduler);\n    return new PairsObservable(obj, scheduler);\n  };\n\n    var RangeObservable = (function(__super__) {\n    inherits(RangeObservable, __super__);\n    function RangeObservable(start, count, scheduler) {\n      this.start = start;\n      this.rangeCount = count;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function loopRecursive(start, count, o) {\n      return function loop (i, recurse) {\n        if (i < count) {\n          o.onNext(start + i);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    RangeObservable.prototype.subscribeCore = function (o) {\n      return this.scheduler.scheduleRecursive(\n        0,\n        loopRecursive(this.start, this.rangeCount, o)\n      );\n    };\n\n    return RangeObservable;\n  }(ObservableBase));\n\n  /**\n  *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n  * @param {Number} start The value of the first integer in the sequence.\n  * @param {Number} count The number of sequential integers to generate.\n  * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n  * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n  */\n  Observable.range = function (start, count, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RangeObservable(start, count, scheduler);\n  };\n\n  var RepeatObservable = (function(__super__) {\n    inherits(RepeatObservable, __super__);\n    function RepeatObservable(value, repeatCount, scheduler) {\n      this.value = value;\n      this.repeatCount = repeatCount == null ? -1 : repeatCount;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    RepeatObservable.prototype.subscribeCore = function (observer) {\n      var sink = new RepeatSink(observer, this);\n      return sink.run();\n    };\n\n    return RepeatObservable;\n  }(ObservableBase));\n\n  function RepeatSink(observer, parent) {\n    this.observer = observer;\n    this.parent = parent;\n  }\n\n  RepeatSink.prototype.run = function () {\n    var observer = this.observer, value = this.parent.value;\n    function loopRecursive(i, recurse) {\n      if (i === -1 || i > 0) {\n        observer.onNext(value);\n        i > 0 && i--;\n      }\n      if (i === 0) { return observer.onCompleted(); }\n      recurse(i);\n    }\n\n    return this.parent.scheduler.scheduleRecursive(this.parent.repeatCount, loopRecursive);\n  };\n\n  /**\n   *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n   * @param {Mixed} value Element to repeat.\n   * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n   * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n   */\n  Observable.repeat = function (value, repeatCount, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RepeatObservable(value, repeatCount, scheduler);\n  };\n\n  var JustObservable = (function(__super__) {\n    inherits(JustObservable, __super__);\n    function JustObservable(value, scheduler) {\n      this._value = value;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    JustObservable.prototype.subscribeCore = function (o) {\n      var state = [this._value, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var value = state[0], observer = state[1];\n      observer.onNext(value);\n      observer.onCompleted();\n      return disposableEmpty;\n    }\n\n    return JustObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n   *  There is an alias called 'just' or browsers <IE9.\n   * @param {Mixed} value Single element in the resulting observable sequence.\n   * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence containing the single specified element.\n   */\n  var observableReturn = Observable['return'] = Observable.just = function (value, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new JustObservable(value, scheduler);\n  };\n\n  var ThrowObservable = (function(__super__) {\n    inherits(ThrowObservable, __super__);\n    function ThrowObservable(error, scheduler) {\n      this._error = error;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    ThrowObservable.prototype.subscribeCore = function (o) {\n      var state = [this._error, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var e = state[0], o = state[1];\n      o.onError(e);\n      return disposableEmpty;\n    }\n\n    return ThrowObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n   *  There is an alias to this method called 'throwError' for browsers <IE9.\n   * @param {Mixed} error An object used for the sequence's termination.\n   * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n   */\n  var observableThrow = Observable['throw'] = function (error, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new ThrowObservable(error, scheduler);\n  };\n\n  var CatchObservable = (function (__super__) {\n    inherits(CatchObservable, __super__);\n    function CatchObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObservable.prototype.subscribeCore = function (o) {\n      var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();\n      subscription.setDisposable(d1);\n      d1.setDisposable(this.source.subscribe(new CatchObserver(o, subscription, this._fn)));\n      return subscription;\n    };\n\n    return CatchObservable;\n  }(ObservableBase));\n\n  var CatchObserver = (function(__super__) {\n    inherits(CatchObserver, __super__);\n    function CatchObserver(o, s, fn) {\n      this._o = o;\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObserver.prototype.next = function (x) { this._o.onNext(x); };\n    CatchObserver.prototype.completed = function () { return this._o.onCompleted(); };\n    CatchObserver.prototype.error = function (e) {\n      var result = tryCatch(this._fn)(e);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      isPromise(result) && (result = observableFromPromise(result));\n\n      var d = new SingleAssignmentDisposable();\n      this._s.setDisposable(d);\n      d.setDisposable(result.subscribe(this._o));\n    };\n\n    return CatchObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n   * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n   */\n  observableProto['catch'] = function (handlerOrSecond) {\n    return isFunction(handlerOrSecond) ? new CatchObservable(this, handlerOrSecond) : observableCatch([this, handlerOrSecond]);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n   * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n   */\n  var observableCatch = Observable['catch'] = function () {\n    var items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(len);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    return enumerableOf(items).catchError();\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   * This can be in the form of an argument list of observables or an array.\n   *\n   * @example\n   * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return combineLatest.apply(this, args);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var CombineLatestObservable = (function(__super__) {\n    inherits(CombineLatestObservable, __super__);\n    function CombineLatestObservable(params, cb) {\n      this._params = params;\n      this._cb = cb;\n      __super__.call(this);\n    }\n\n    CombineLatestObservable.prototype.subscribeCore = function(observer) {\n      var len = this._params.length,\n          subscriptions = new Array(len);\n\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        isDone: arrayInitialize(len, falseFactory),\n        values: new Array(len)\n      };\n\n      for (var i = 0; i < len; i++) {\n        var source = this._params[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new CombineLatestObserver(observer, i, this._cb, state)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return CombineLatestObservable;\n  }(ObservableBase));\n\n  var CombineLatestObserver = (function (__super__) {\n    inherits(CombineLatestObserver, __super__);\n    function CombineLatestObserver(o, i, cb, state) {\n      this._o = o;\n      this._i = i;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    CombineLatestObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      if (this._state.hasValueAll || (this._state.hasValueAll = this._state.hasValue.every(identity))) {\n        var res = tryCatch(this._cb).apply(null, this._state.values);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._state.isDone.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    CombineLatestObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    CombineLatestObserver.prototype.completed = function () {\n      this._state.isDone[this._i] = true;\n      this._state.isDone.every(identity) && this._o.onCompleted();\n    };\n\n    return CombineLatestObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n  *\n  * @example\n  * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n  * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n  * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n  */\n  var combineLatest = Observable.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n    return new CombineLatestObservable(args, resultSelector);\n  };\n\n  /**\n   * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  observableProto.concat = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    args.unshift(this);\n    return observableConcat.apply(null, args);\n  };\n\n  var ConcatObserver = (function(__super__) {\n    inherits(ConcatObserver, __super__);\n    function ConcatObserver(s, fn) {\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    ConcatObserver.prototype.next = function (x) { this._s.o.onNext(x); };\n    ConcatObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    ConcatObserver.prototype.completed = function () { this._s.i++; this._fn(this._s); };\n\n    return ConcatObserver;\n  }(AbstractObserver));\n\n  var ConcatObservable = (function(__super__) {\n    inherits(ConcatObservable, __super__);\n    function ConcatObservable(sources) {\n      this._sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive (state, recurse) {\n      if (state.disposable.isDisposed) { return; }\n      if (state.i === state.sources.length) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = state.sources[state.i];\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new ConcatObserver(state, recurse)));\n    }\n\n    ConcatObservable.prototype.subscribeCore = function(o) {\n      var subscription = new SerialDisposable();\n      var disposable = disposableCreate(noop);\n      var state = {\n        o: o,\n        i: 0,\n        subscription: subscription,\n        disposable: disposable,\n        sources: this._sources\n      };\n\n      var cancelable = immediateScheduler.scheduleRecursive(state, scheduleRecursive);\n      return new NAryDisposable([subscription, disposable, cancelable]);\n    };\n\n    return ConcatObservable;\n  }(ObservableBase));\n\n  /**\n   * Concatenates all the observable sequences.\n   * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  var observableConcat = Observable.concat = function () {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      args = new Array(arguments.length);\n      for(var i = 0, len = arguments.length; i < len; i++) { args[i] = arguments[i]; }\n    }\n    return new ConcatObservable(args);\n  };\n\n  /**\n   * Concatenates an observable sequence of observable sequences.\n   * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n   */\n  observableProto.concatAll = function () {\n    return this.merge(1);\n  };\n\n  var MergeObservable = (function (__super__) {\n    inherits(MergeObservable, __super__);\n\n    function MergeObservable(source, maxConcurrent) {\n      this.source = source;\n      this.maxConcurrent = maxConcurrent;\n      __super__.call(this);\n    }\n\n    MergeObservable.prototype.subscribeCore = function(observer) {\n      var g = new CompositeDisposable();\n      g.add(this.source.subscribe(new MergeObserver(observer, this.maxConcurrent, g)));\n      return g;\n    };\n\n    return MergeObservable;\n\n  }(ObservableBase));\n\n  var MergeObserver = (function (__super__) {\n    function MergeObserver(o, max, g) {\n      this.o = o;\n      this.max = max;\n      this.g = g;\n      this.done = false;\n      this.q = [];\n      this.activeCount = 0;\n      __super__.call(this);\n    }\n\n    inherits(MergeObserver, __super__);\n\n    MergeObserver.prototype.handleSubscribe = function (xs) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(xs) && (xs = observableFromPromise(xs));\n      sad.setDisposable(xs.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeObserver.prototype.next = function (innerSource) {\n      if(this.activeCount < this.max) {\n        this.activeCount++;\n        this.handleSubscribe(innerSource);\n      } else {\n        this.q.push(innerSource);\n      }\n    };\n    MergeObserver.prototype.error = function (e) { this.o.onError(e); };\n    MergeObserver.prototype.completed = function () { this.done = true; this.activeCount === 0 && this.o.onCompleted(); };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) { this.parent.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this.parent.o.onError(e); };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      if (this.parent.q.length > 0) {\n        this.parent.handleSubscribe(this.parent.q.shift());\n      } else {\n        this.parent.activeCount--;\n        this.parent.done && this.parent.activeCount === 0 && this.parent.o.onCompleted();\n      }\n    };\n\n    return MergeObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n  * Or merges two observable sequences into a single observable sequence.\n  * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.merge = function (maxConcurrentOrOther) {\n    return typeof maxConcurrentOrOther !== 'number' ?\n      observableMerge(this, maxConcurrentOrOther) :\n      new MergeObservable(this, maxConcurrentOrOther);\n  };\n\n  /**\n   * Merges all the observable sequences into a single observable sequence.\n   * The scheduler is optional and if not specified, the immediate scheduler is used.\n   * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n   */\n  var observableMerge = Observable.merge = function () {\n    var scheduler, sources = [], i, len = arguments.length;\n    if (!arguments[0]) {\n      scheduler = immediateScheduler;\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else if (isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else {\n      scheduler = immediateScheduler;\n      for(i = 0; i < len; i++) { sources.push(arguments[i]); }\n    }\n    if (Array.isArray(sources[0])) {\n      sources = sources[0];\n    }\n    return observableOf(scheduler, sources).mergeAll();\n  };\n\n  var CompositeError = Rx.CompositeError = function(errors) {\n    this.innerErrors = errors;\n    this.message = 'This contains multiple errors. Check the innerErrors';\n    Error.call(this);\n  };\n  CompositeError.prototype = Object.create(Error.prototype);\n  CompositeError.prototype.name = 'CompositeError';\n\n  var MergeDelayErrorObservable = (function(__super__) {\n    inherits(MergeDelayErrorObservable, __super__);\n    function MergeDelayErrorObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeDelayErrorObservable.prototype.subscribeCore = function (o) {\n      var group = new CompositeDisposable(),\n        m = new SingleAssignmentDisposable(),\n        state = { isStopped: false, errors: [], o: o };\n\n      group.add(m);\n      m.setDisposable(this.source.subscribe(new MergeDelayErrorObserver(group, state)));\n\n      return group;\n    };\n\n    return MergeDelayErrorObservable;\n  }(ObservableBase));\n\n  var MergeDelayErrorObserver = (function(__super__) {\n    inherits(MergeDelayErrorObserver, __super__);\n    function MergeDelayErrorObserver(group, state) {\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function setCompletion(o, errors) {\n      if (errors.length === 0) {\n        o.onCompleted();\n      } else if (errors.length === 1) {\n        o.onError(errors[0]);\n      } else {\n        o.onError(new CompositeError(errors));\n      }\n    }\n\n    MergeDelayErrorObserver.prototype.next = function (x) {\n      var inner = new SingleAssignmentDisposable();\n      this._group.add(inner);\n\n      // Check for promises support\n      isPromise(x) && (x = observableFromPromise(x));\n      inner.setDisposable(x.subscribe(new InnerObserver(inner, this._group, this._state)));\n    };\n\n    MergeDelayErrorObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    MergeDelayErrorObserver.prototype.completed = function () {\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    inherits(InnerObserver, __super__);\n    function InnerObserver(inner, group, state) {\n      this._inner = inner;\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n    InnerObserver.prototype.completed = function () {\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    return MergeDelayErrorObserver;\n  }(AbstractObserver));\n\n  /**\n  * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n  * receive all successfully emitted items from all of the source Observables without being interrupted by\n  * an error notification from one of them.\n  *\n  * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n  * error via the Observer's onError, mergeDelayError will refrain from propagating that\n  * error notification until all of the merged Observables have finished emitting items.\n  * @param {Array | Arguments} args Arguments or an array to merge.\n  * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n  */\n  Observable.mergeDelayError = function() {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      var len = arguments.length;\n      args = new Array(len);\n      for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    var source = observableOf(null, args);\n    return new MergeDelayErrorObservable(source);\n  };\n\n  var MergeAllObservable = (function (__super__) {\n    inherits(MergeAllObservable, __super__);\n\n    function MergeAllObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeAllObservable.prototype.subscribeCore = function (o) {\n      var g = new CompositeDisposable(), m = new SingleAssignmentDisposable();\n      g.add(m);\n      m.setDisposable(this.source.subscribe(new MergeAllObserver(o, g)));\n      return g;\n    };\n\n    return MergeAllObservable;\n  }(ObservableBase));\n\n  var MergeAllObserver = (function (__super__) {\n    function MergeAllObserver(o, g) {\n      this.o = o;\n      this.g = g;\n      this.done = false;\n      __super__.call(this);\n    }\n\n    inherits(MergeAllObserver, __super__);\n\n    MergeAllObserver.prototype.next = function(innerSource) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      sad.setDisposable(innerSource.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeAllObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    MergeAllObserver.prototype.completed = function () {\n      this.done = true;\n      this.g.length === 1 && this.o.onCompleted();\n    };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) {\n      this.parent.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function (e) {\n      this.parent.o.onError(e);\n    };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      this.parent.done && this.parent.g.length === 1 && this.parent.o.onCompleted();\n    };\n\n    return MergeAllObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.mergeAll = function () {\n    return new MergeAllObservable(this);\n  };\n\n  var SkipUntilObservable = (function(__super__) {\n    inherits(SkipUntilObservable, __super__);\n\n    function SkipUntilObservable(source, other) {\n      this._s = source;\n      this._o = isPromise(other) ? observableFromPromise(other) : other;\n      this._open = false;\n      __super__.call(this);\n    }\n\n    SkipUntilObservable.prototype.subscribeCore = function(o) {\n      var leftSubscription = new SingleAssignmentDisposable();\n      leftSubscription.setDisposable(this._s.subscribe(new SkipUntilSourceObserver(o, this)));\n\n      isPromise(this._o) && (this._o = observableFromPromise(this._o));\n\n      var rightSubscription = new SingleAssignmentDisposable();\n      rightSubscription.setDisposable(this._o.subscribe(new SkipUntilOtherObserver(o, this, rightSubscription)));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    };\n\n    return SkipUntilObservable;\n  }(ObservableBase));\n\n  var SkipUntilSourceObserver = (function(__super__) {\n    inherits(SkipUntilSourceObserver, __super__);\n    function SkipUntilSourceObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipUntilSourceObserver.prototype.next = function (x) {\n      this._p._open && this._o.onNext(x);\n    };\n\n    SkipUntilSourceObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilSourceObserver.prototype.onCompleted = function () {\n      this._p._open && this._o.onCompleted();\n    };\n\n    return SkipUntilSourceObserver;\n  }(AbstractObserver));\n\n  var SkipUntilOtherObserver = (function(__super__) {\n    inherits(SkipUntilOtherObserver, __super__);\n    function SkipUntilOtherObserver(o, p, r) {\n      this._o = o;\n      this._p = p;\n      this._r = r;\n      __super__.call(this);\n    }\n\n    SkipUntilOtherObserver.prototype.next = function () {\n      this._p._open = true;\n      this._r.dispose();\n    };\n\n    SkipUntilOtherObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilOtherObserver.prototype.onCompleted = function () {\n      this._r.dispose();\n    };\n\n    return SkipUntilOtherObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n   * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n   */\n  observableProto.skipUntil = function (other) {\n    return new SkipUntilObservable(this, other);\n  };\n\n  var SwitchObservable = (function(__super__) {\n    inherits(SwitchObservable, __super__);\n    function SwitchObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    SwitchObservable.prototype.subscribeCore = function (o) {\n      var inner = new SerialDisposable(), s = this.source.subscribe(new SwitchObserver(o, inner));\n      return new BinaryDisposable(s, inner);\n    };\n\n    inherits(SwitchObserver, AbstractObserver);\n    function SwitchObserver(o, inner) {\n      this.o = o;\n      this.inner = inner;\n      this.stopped = false;\n      this.latest = 0;\n      this.hasLatest = false;\n      AbstractObserver.call(this);\n    }\n\n    SwitchObserver.prototype.next = function (innerSource) {\n      var d = new SingleAssignmentDisposable(), id = ++this.latest;\n      this.hasLatest = true;\n      this.inner.setDisposable(d);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      d.setDisposable(innerSource.subscribe(new InnerObserver(this, id)));\n    };\n\n    SwitchObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    SwitchObserver.prototype.completed = function () {\n      this.stopped = true;\n      !this.hasLatest && this.o.onCompleted();\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(parent, id) {\n      this.parent = parent;\n      this.id = id;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function (x) {\n      this.parent.latest === this.id && this.parent.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.parent.latest === this.id && this.parent.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      if (this.parent.latest === this.id) {\n        this.parent.hasLatest = false;\n        this.parent.stopped && this.parent.o.onCompleted();\n      }\n    };\n\n    return SwitchObservable;\n  }(ObservableBase));\n\n  /**\n  * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n  * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n  */\n  observableProto['switch'] = observableProto.switchLatest = function () {\n    return new SwitchObservable(this);\n  };\n\n  var TakeUntilObservable = (function(__super__) {\n    inherits(TakeUntilObservable, __super__);\n\n    function TakeUntilObservable(source, other) {\n      this.source = source;\n      this.other = isPromise(other) ? observableFromPromise(other) : other;\n      __super__.call(this);\n    }\n\n    TakeUntilObservable.prototype.subscribeCore = function(o) {\n      return new BinaryDisposable(\n        this.source.subscribe(o),\n        this.other.subscribe(new TakeUntilObserver(o))\n      );\n    };\n\n    return TakeUntilObservable;\n  }(ObservableBase));\n\n  var TakeUntilObserver = (function(__super__) {\n    inherits(TakeUntilObserver, __super__);\n    function TakeUntilObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    TakeUntilObserver.prototype.next = function () {\n      this._o.onCompleted();\n    };\n\n    TakeUntilObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    TakeUntilObserver.prototype.onCompleted = noop;\n\n    return TakeUntilObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence until the other observable sequence produces a value.\n   * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n   */\n  observableProto.takeUntil = function (other) {\n    return new TakeUntilObservable(this, other);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var WithLatestFromObservable = (function(__super__) {\n    inherits(WithLatestFromObservable, __super__);\n    function WithLatestFromObservable(source, sources, resultSelector) {\n      this._s = source;\n      this._ss = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    WithLatestFromObservable.prototype.subscribeCore = function (o) {\n      var len = this._ss.length;\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        values: new Array(len)\n      };\n\n      var n = this._ss.length, subscriptions = new Array(n + 1);\n      for (var i = 0; i < n; i++) {\n        var other = this._ss[i], sad = new SingleAssignmentDisposable();\n        isPromise(other) && (other = observableFromPromise(other));\n        sad.setDisposable(other.subscribe(new WithLatestFromOtherObserver(o, i, state)));\n        subscriptions[i] = sad;\n      }\n\n      var outerSad = new SingleAssignmentDisposable();\n      outerSad.setDisposable(this._s.subscribe(new WithLatestFromSourceObserver(o, this._cb, state)));\n      subscriptions[n] = outerSad;\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return WithLatestFromObservable;\n  }(ObservableBase));\n\n  var WithLatestFromOtherObserver = (function (__super__) {\n    inherits(WithLatestFromOtherObserver, __super__);\n    function WithLatestFromOtherObserver(o, i, state) {\n      this._o = o;\n      this._i = i;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromOtherObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      this._state.hasValueAll = this._state.hasValue.every(identity);\n    };\n\n    WithLatestFromOtherObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromOtherObserver.prototype.completed = noop;\n\n    return WithLatestFromOtherObserver;\n  }(AbstractObserver));\n\n  var WithLatestFromSourceObserver = (function (__super__) {\n    inherits(WithLatestFromSourceObserver, __super__);\n    function WithLatestFromSourceObserver(o, cb, state) {\n      this._o = o;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromSourceObserver.prototype.next = function (x) {\n      var allValues = [x].concat(this._state.values);\n      if (!this._state.hasValueAll) { return; }\n      var res = tryCatch(this._cb).apply(null, allValues);\n      if (res === errorObj) { return this._o.onError(res.e); }\n      this._o.onNext(res);\n    };\n\n    WithLatestFromSourceObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromSourceObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return WithLatestFromSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.withLatestFrom = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    return new WithLatestFromObservable(this, args, resultSelector);\n  };\n\n  function falseFactory() { return false; }\n  function emptyArrayFactory() { return []; }\n\n  var ZipObservable = (function(__super__) {\n    inherits(ZipObservable, __super__);\n    function ZipObservable(sources, resultSelector) {\n      this._s = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    ZipObservable.prototype.subscribeCore = function(observer) {\n      var n = this._s.length,\n          subscriptions = new Array(n),\n          done = arrayInitialize(n, falseFactory),\n          q = arrayInitialize(n, emptyArrayFactory);\n\n      for (var i = 0; i < n; i++) {\n        var source = this._s[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new ZipObserver(observer, i, this, q, done)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return ZipObservable;\n  }(ObservableBase));\n\n  var ZipObserver = (function (__super__) {\n    inherits(ZipObserver, __super__);\n    function ZipObserver(o, i, p, q, d) {\n      this._o = o;\n      this._i = i;\n      this._p = p;\n      this._q = q;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    function notEmpty(x) { return x.length > 0; }\n    function shiftEach(x) { return x.shift(); }\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    ZipObserver.prototype.next = function (x) {\n      this._q[this._i].push(x);\n      if (this._q.every(notEmpty)) {\n        var queuedValues = this._q.map(shiftEach);\n        var res = tryCatch(this._p._cb).apply(null, queuedValues);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._d.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    ZipObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ZipObserver.prototype.completed = function () {\n      this._d[this._i] = true;\n      this._d.every(identity) && this._o.onCompleted();\n    };\n\n    return ZipObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n   * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n   */\n  observableProto.zip = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    var parent = this;\n    args.unshift(parent);\n\n    return new ZipObservable(args, resultSelector);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n   * @param arguments Observable sources.\n   * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  Observable.zip = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args = isFunction(args[1]) ? args[0].concat(args[1]) : args[0];\n    }\n    var first = args.shift();\n    return first.zip.apply(first, args);\n  };\n\nfunction falseFactory() { return false; }\nfunction emptyArrayFactory() { return []; }\nfunction argumentsToArray() {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return args;\n}\n\nvar ZipIterableObservable = (function(__super__) {\n  inherits(ZipIterableObservable, __super__);\n  function ZipIterableObservable(sources, cb) {\n    this.sources = sources;\n    this._cb = cb;\n    __super__.call(this);\n  }\n\n  ZipIterableObservable.prototype.subscribeCore = function (o) {\n    var sources = this.sources, len = sources.length, subscriptions = new Array(len);\n\n    var state = {\n      q: arrayInitialize(len, emptyArrayFactory),\n      done: arrayInitialize(len, falseFactory),\n      cb: this._cb,\n      o: o\n    };\n\n    for (var i = 0; i < len; i++) {\n      (function (i) {\n        var source = sources[i], sad = new SingleAssignmentDisposable();\n        (isArrayLike(source) || isIterable(source)) && (source = observableFrom(source));\n\n        subscriptions[i] = sad;\n        sad.setDisposable(source.subscribe(new ZipIterableObserver(state, i)));\n      }(i));\n    }\n\n    return new NAryDisposable(subscriptions);\n  };\n\n  return ZipIterableObservable;\n}(ObservableBase));\n\nvar ZipIterableObserver = (function (__super__) {\n  inherits(ZipIterableObserver, __super__);\n  function ZipIterableObserver(s, i) {\n    this._s = s;\n    this._i = i;\n    __super__.call(this);\n  }\n\n  function notEmpty(x) { return x.length > 0; }\n  function shiftEach(x) { return x.shift(); }\n  function notTheSame(i) {\n    return function (x, j) {\n      return j !== i;\n    };\n  }\n\n  ZipIterableObserver.prototype.next = function (x) {\n    this._s.q[this._i].push(x);\n    if (this._s.q.every(notEmpty)) {\n      var queuedValues = this._s.q.map(shiftEach),\n          res = tryCatch(this._s.cb).apply(null, queuedValues);\n      if (res === errorObj) { return this._s.o.onError(res.e); }\n      this._s.o.onNext(res);\n    } else if (this._s.done.filter(notTheSame(this._i)).every(identity)) {\n      this._s.o.onCompleted();\n    }\n  };\n\n  ZipIterableObserver.prototype.error = function (e) { this._s.o.onError(e); };\n\n  ZipIterableObserver.prototype.completed = function () {\n    this._s.done[this._i] = true;\n    this._s.done.every(identity) && this._s.o.onCompleted();\n  };\n\n  return ZipIterableObserver;\n}(AbstractObserver));\n\n/**\n * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n */\nobservableProto.zipIterable = function () {\n  if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n\n  var parent = this;\n  args.unshift(parent);\n  return new ZipIterableObservable(args, resultSelector);\n};\n\n  function asObservable(source) {\n    return function subscribe(o) { return source.subscribe(o); };\n  }\n\n  /**\n   *  Hides the identity of an observable sequence.\n   * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n   */\n  observableProto.asObservable = function () {\n    return new AnonymousObservable(asObservable(this), this);\n  };\n\n  var DematerializeObservable = (function (__super__) {\n    inherits(DematerializeObservable, __super__);\n    function DematerializeObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    DematerializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DematerializeObserver(o));\n    };\n\n    return DematerializeObservable;\n  }(ObservableBase));\n\n  var DematerializeObserver = (function (__super__) {\n    inherits(DematerializeObserver, __super__);\n\n    function DematerializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    DematerializeObserver.prototype.next = function (x) { x.accept(this._o); };\n    DematerializeObserver.prototype.error = function (e) { this._o.onError(e); };\n    DematerializeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DematerializeObserver;\n  }(AbstractObserver));\n\n  /**\n   * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n   * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n   */\n  observableProto.dematerialize = function () {\n    return new DematerializeObservable(this);\n  };\n\n  var DistinctUntilChangedObservable = (function(__super__) {\n    inherits(DistinctUntilChangedObservable, __super__);\n    function DistinctUntilChangedObservable(source, keyFn, comparer) {\n      this.source = source;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctUntilChangedObserver(o, this.keyFn, this.comparer));\n    };\n\n    return DistinctUntilChangedObservable;\n  }(ObservableBase));\n\n  var DistinctUntilChangedObserver = (function(__super__) {\n    inherits(DistinctUntilChangedObserver, __super__);\n    function DistinctUntilChangedObserver(o, keyFn, comparer) {\n      this.o = o;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      this.hasCurrentKey = false;\n      this.currentKey = null;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObserver.prototype.next = function (x) {\n      var key = x, comparerEquals;\n      if (isFunction(this.keyFn)) {\n        key = tryCatch(this.keyFn)(x);\n        if (key === errorObj) { return this.o.onError(key.e); }\n      }\n      if (this.hasCurrentKey) {\n        comparerEquals = tryCatch(this.comparer)(this.currentKey, key);\n        if (comparerEquals === errorObj) { return this.o.onError(comparerEquals.e); }\n      }\n      if (!this.hasCurrentKey || !comparerEquals) {\n        this.hasCurrentKey = true;\n        this.currentKey = key;\n        this.o.onNext(x);\n      }\n    };\n    DistinctUntilChangedObserver.prototype.error = function(e) {\n      this.o.onError(e);\n    };\n    DistinctUntilChangedObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return DistinctUntilChangedObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Returns an observable sequence that contains only distinct contiguous elements according to the keyFn and the comparer.\n  * @param {Function} [keyFn] A function to compute the comparison key for each element. If not provided, it projects the value.\n  * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n  * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n  */\n  observableProto.distinctUntilChanged = function (keyFn, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctUntilChangedObservable(this, keyFn, comparer);\n  };\n\n  var TapObservable = (function(__super__) {\n    inherits(TapObservable,__super__);\n    function TapObservable(source, observerOrOnNext, onError, onCompleted) {\n      this.source = source;\n      this._oN = observerOrOnNext;\n      this._oE = onError;\n      this._oC = onCompleted;\n      __super__.call(this);\n    }\n\n    TapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, p) {\n      this.o = o;\n      this.t = !p._oN || isFunction(p._oN) ?\n        observerCreate(p._oN || noop, p._oE || noop, p._oC || noop) :\n        p._oN;\n      this.isStopped = false;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function(x) {\n      var res = tryCatch(this.t.onNext).call(this.t, x);\n      if (res === errorObj) { this.o.onError(res.e); }\n      this.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function(err) {\n      var res = tryCatch(this.t.onError).call(this.t, err);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onError(err);\n    };\n    InnerObserver.prototype.completed = function() {\n      var res = tryCatch(this.t.onCompleted).call(this.t);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onCompleted();\n    };\n\n    return TapObservable;\n  }(ObservableBase));\n\n  /**\n  *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an o.\n  * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto['do'] = observableProto.tap = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) {\n    return new TapObservable(this, observerOrOnNext, onError, onCompleted);\n  };\n\n  /**\n  *  Invokes an action for each element in the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onNext Action to invoke for each element in the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnNext = observableProto.tapOnNext = function (onNext, thisArg) {\n    return this.tap(typeof thisArg !== 'undefined' ? function (x) { onNext.call(thisArg, x); } : onNext);\n  };\n\n  /**\n  *  Invokes an action upon exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnError = observableProto.tapOnError = function (onError, thisArg) {\n    return this.tap(noop, typeof thisArg !== 'undefined' ? function (e) { onError.call(thisArg, e); } : onError);\n  };\n\n  /**\n  *  Invokes an action upon graceful termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnCompleted = observableProto.tapOnCompleted = function (onCompleted, thisArg) {\n    return this.tap(noop, null, typeof thisArg !== 'undefined' ? function () { onCompleted.call(thisArg); } : onCompleted);\n  };\n\n  var FinallyObservable = (function (__super__) {\n    inherits(FinallyObservable, __super__);\n    function FinallyObservable(source, fn, thisArg) {\n      this.source = source;\n      this._fn = bindCallback(fn, thisArg, 0);\n      __super__.call(this);\n    }\n\n    FinallyObservable.prototype.subscribeCore = function (o) {\n      var d = tryCatch(this.source.subscribe).call(this.source, o);\n      if (d === errorObj) {\n        this._fn();\n        thrower(d.e);\n      }\n\n      return new FinallyDisposable(d, this._fn);\n    };\n\n    function FinallyDisposable(s, fn) {\n      this.isDisposed = false;\n      this._s = s;\n      this._fn = fn;\n    }\n    FinallyDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        var res = tryCatch(this._s.dispose).call(this._s);\n        this._fn();\n        res === errorObj && thrower(res.e);\n      }\n    };\n\n    return FinallyObservable;\n\n  }(ObservableBase));\n\n  /**\n   *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n   * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n   * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n   */\n  observableProto['finally'] = function (action, thisArg) {\n    return new FinallyObservable(this, action, thisArg);\n  };\n\n  var IgnoreElementsObservable = (function(__super__) {\n    inherits(IgnoreElementsObservable, __super__);\n\n    function IgnoreElementsObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    IgnoreElementsObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    function InnerObserver(o) {\n      this.o = o;\n      this.isStopped = false;\n    }\n    InnerObserver.prototype.onNext = noop;\n    InnerObserver.prototype.onError = function (err) {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onError(err);\n      }\n    };\n    InnerObserver.prototype.onCompleted = function () {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onCompleted();\n      }\n    };\n    InnerObserver.prototype.dispose = function() { this.isStopped = true; };\n    InnerObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.observer.onError(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return IgnoreElementsObservable;\n  }(ObservableBase));\n\n  /**\n   *  Ignores all elements in an observable sequence leaving only the termination messages.\n   * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n   */\n  observableProto.ignoreElements = function () {\n    return new IgnoreElementsObservable(this);\n  };\n\n  var MaterializeObservable = (function (__super__) {\n    inherits(MaterializeObservable, __super__);\n    function MaterializeObservable(source, fn) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MaterializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new MaterializeObserver(o));\n    };\n\n    return MaterializeObservable;\n  }(ObservableBase));\n\n  var MaterializeObserver = (function (__super__) {\n    inherits(MaterializeObserver, __super__);\n\n    function MaterializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    MaterializeObserver.prototype.next = function (x) { this._o.onNext(notificationCreateOnNext(x)) };\n    MaterializeObserver.prototype.error = function (e) { this._o.onNext(notificationCreateOnError(e)); this._o.onCompleted(); };\n    MaterializeObserver.prototype.completed = function () { this._o.onNext(notificationCreateOnCompleted()); this._o.onCompleted(); };\n\n    return MaterializeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n   * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n   */\n  observableProto.materialize = function () {\n    return new MaterializeObservable(this);\n  };\n\n  /**\n   *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n   * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n   * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n   */\n  observableProto.repeat = function (repeatCount) {\n    return enumerableRepeat(this, repeatCount).concat();\n  };\n\n  /**\n   *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n   *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n   *\n   * @example\n   *  var res = retried = retry.repeat();\n   *  var res = retried = retry.repeat(2);\n   * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retry = function (retryCount) {\n    return enumerableRepeat(this, retryCount).catchError();\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RetryWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RetryWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RetryWhenObservable, __super__);\n\n    RetryWhenObservable.prototype.subscribeCore = function (o) {\n      var exceptions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(exceptions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            exceptions.onNext(exn);\n            outer.dispose();\n          },\n          function() { o.onCompleted(); }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RetryWhenObservable;\n  }(ObservableBase));\n\n  observableProto.retryWhen = function (notifier) {\n    return new RetryWhenObservable(repeat(this), notifier);\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RepeatWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RepeatWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RepeatWhenObservable, __super__);\n\n    RepeatWhenObservable.prototype.subscribeCore = function (o) {\n      var completions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(completions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) { o.onError(exn); },\n          function() {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            completions.onNext(null);\n            outer.dispose();\n          }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RepeatWhenObservable;\n  }(ObservableBase));\n\n  observableProto.repeatWhen = function (notifier) {\n    return new RepeatWhenObservable(repeat(this), notifier);\n  };\n\n  var ScanObservable = (function(__super__) {\n    inherits(ScanObservable, __super__);\n    function ScanObservable(source, accumulator, hasSeed, seed) {\n      this.source = source;\n      this.accumulator = accumulator;\n      this.hasSeed = hasSeed;\n      this.seed = seed;\n      __super__.call(this);\n    }\n\n    ScanObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new ScanObserver(o,this));\n    };\n\n    return ScanObservable;\n  }(ObservableBase));\n\n  var ScanObserver = (function (__super__) {\n    inherits(ScanObserver, __super__);\n    function ScanObserver(o, parent) {\n      this._o = o;\n      this._p = parent;\n      this._fn = parent.accumulator;\n      this._hs = parent.hasSeed;\n      this._s = parent.seed;\n      this._ha = false;\n      this._a = null;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    ScanObserver.prototype.next = function (x) {\n      !this._hv && (this._hv = true);\n      if (this._ha) {\n        this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n      } else {\n        this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n        this._ha = true;\n      }\n      if (this._a === errorObj) { return this._o.onError(this._a.e); }\n      this._o.onNext(this._a);\n      this._i++;\n    };\n\n    ScanObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ScanObserver.prototype.completed = function () {\n      !this._hv && this._hs && this._o.onNext(this._s);\n      this._o.onCompleted();\n    };\n\n    return ScanObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n  *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n  * @param {Mixed} [seed] The initial accumulator value.\n  * @param {Function} accumulator An accumulator function to be invoked on each element.\n  * @returns {Observable} An observable sequence containing the accumulated values.\n  */\n  observableProto.scan = function () {\n    var hasSeed = false, seed, accumulator = arguments[0];\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new ScanObservable(this, accumulator, hasSeed, seed);\n  };\n\n  var SkipLastObservable = (function (__super__) {\n    inherits(SkipLastObservable, __super__);\n    function SkipLastObservable(source, c) {\n      this.source = source;\n      this._c = c;\n      __super__.call(this);\n    }\n\n    SkipLastObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipLastObserver(o, this._c));\n    };\n\n    return SkipLastObservable;\n  }(ObservableBase));\n\n  var SkipLastObserver = (function (__super__) {\n    inherits(SkipLastObserver, __super__);\n    function SkipLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    SkipLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._o.onNext(this._q.shift());\n    };\n\n    SkipLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    SkipLastObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return SkipLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses a specified number of elements at the end of an observable sequence.\n   * @description\n   *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n   *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n   * @param count Number of elements to bypass at the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n   */\n  observableProto.skipLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipLastObservable(this, count);\n  };\n\n  /**\n   *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n   *  @example\n   *  var res = source.startWith(1, 2, 3);\n   *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n   * @param {Arguments} args The specified values to prepend to the observable sequence\n   * @returns {Observable} The source sequence prepended with the specified values.\n   */\n  observableProto.startWith = function () {\n    var values, scheduler, start = 0;\n    if (!!arguments.length && isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      start = 1;\n    } else {\n      scheduler = immediateScheduler;\n    }\n    for(var args = [], i = start, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableConcat.apply(null, [observableFromArray(args, scheduler), this]);\n  };\n\n  var TakeLastObserver = (function (__super__) {\n    inherits(TakeLastObserver, __super__);\n    function TakeLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastObserver.prototype.completed = function () {\n      while (this._q.length > 0) { this._o.onNext(this._q.shift()); }\n      this._o.onCompleted();\n    };\n\n    return TakeLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns a specified number of contiguous elements from the end of an observable sequence.\n   * @description\n   *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n   *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastObserver(o, count));\n    }, source);\n  };\n\nobservableProto.flatMapConcat = observableProto.concatMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).merge(1);\n};\n  var MapObservable = (function (__super__) {\n    inherits(MapObservable, __super__);\n\n    function MapObservable(source, selector, thisArg) {\n      this.source = source;\n      this.selector = bindCallback(selector, thisArg, 3);\n      __super__.call(this);\n    }\n\n    function innerMap(selector, self) {\n      return function (x, i, o) { return selector.call(this, self.selector(x, i, o), i, o); };\n    }\n\n    MapObservable.prototype.internalMap = function (selector, thisArg) {\n      return new MapObservable(this.source, innerMap(selector, this), thisArg);\n    };\n\n    MapObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, selector, source) {\n      this.o = o;\n      this.selector = selector;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var result = tryCatch(this.selector)(x, this.i++, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n      this.o.onNext(result);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return MapObservable;\n\n  }(ObservableBase));\n\n  /**\n  * Projects each element of an observable sequence into a new form by incorporating the element's index.\n  * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n  */\n  observableProto.map = observableProto.select = function (selector, thisArg) {\n    var selectorFn = typeof selector === 'function' ? selector : function () { return selector; };\n    return this instanceof MapObservable ?\n      this.internalMap(selectorFn, thisArg) :\n      new MapObservable(this, selectorFn, thisArg);\n  };\n\n  function plucker(args, len) {\n    return function mapper(x) {\n      var currentProp = x;\n      for (var i = 0; i < len; i++) {\n        var p = currentProp[args[i]];\n        if (typeof p !== 'undefined') {\n          currentProp = p;\n        } else {\n          return undefined;\n        }\n      }\n      return currentProp;\n    };\n  }\n\n  /**\n   * Retrieves the value of a specified nested property from all elements in\n   * the Observable sequence.\n   * @param {Arguments} arguments The nested properties to pluck.\n   * @returns {Observable} Returns a new Observable sequence of property values.\n   */\n  observableProto.pluck = function () {\n    var len = arguments.length, args = new Array(len);\n    if (len === 0) { throw new Error('List of properties cannot be empty.'); }\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return this.map(plucker(args, len));\n  };\n\nobservableProto.flatMap = observableProto.selectMany = observableProto.mergeMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).mergeAll();\n};\n\nobservableProto.flatMapLatest = observableProto.switchMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).switchLatest();\n};\n\n  var SkipObservable = (function(__super__) {\n    inherits(SkipObservable, __super__);\n    function SkipObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    SkipObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipObserver(o, this._count));\n    };\n\n    function SkipObserver(o, c) {\n      this._o = o;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(SkipObserver, AbstractObserver);\n\n    SkipObserver.prototype.next = function (x) {\n      if (this._r <= 0) {\n        this._o.onNext(x);\n      } else {\n        this._r--;\n      }\n    };\n    SkipObserver.prototype.error = function(e) { this._o.onError(e); };\n    SkipObserver.prototype.completed = function() { this._o.onCompleted(); };\n\n    return SkipObservable;\n  }(ObservableBase));\n\n  /**\n   * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n   * @param {Number} count The number of elements to skip before returning the remaining elements.\n   * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n   */\n  observableProto.skip = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipObservable(this, count);\n  };\n\n  var SkipWhileObservable = (function (__super__) {\n    inherits(SkipWhileObservable, __super__);\n    function SkipWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SkipWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipWhileObserver(o, this));\n    };\n\n    return SkipWhileObservable;\n  }(ObservableBase));\n\n  var SkipWhileObserver = (function (__super__) {\n    inherits(SkipWhileObserver, __super__);\n\n    function SkipWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = false;\n      __super__.call(this);\n    }\n\n    SkipWhileObserver.prototype.next = function (x) {\n      if (!this._r) {\n        var res = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._r = !res;\n      }\n      this._r && this._o.onNext(x);\n    };\n    SkipWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n   *  The element's index is used in the logic of the predicate function.\n   *\n   *  var res = source.skipWhile(function (value) { return value < 10; });\n   *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n   */\n  observableProto.skipWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new SkipWhileObservable(this, fn);\n  };\n\n  var TakeObservable = (function(__super__) {\n    inherits(TakeObservable, __super__);\n    function TakeObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    TakeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeObserver(o, this._count));\n    };\n\n    function TakeObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(TakeObserver, AbstractObserver);\n\n    TakeObserver.prototype.next = function (x) {\n      if (this._r-- > 0) {\n        this._o.onNext(x);\n        this._r <= 0 && this._o.onCompleted();\n      }\n    };\n\n    TakeObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n   * @param {Number} count The number of elements to return.\n   * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n   * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n   */\n  observableProto.take = function (count, scheduler) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    if (count === 0) { return observableEmpty(scheduler); }\n    return new TakeObservable(this, count);\n  };\n\n  var TakeWhileObservable = (function (__super__) {\n    inherits(TakeWhileObservable, __super__);\n    function TakeWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    TakeWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeWhileObserver(o, this));\n    };\n\n    return TakeWhileObservable;\n  }(ObservableBase));\n\n  var TakeWhileObserver = (function (__super__) {\n    inherits(TakeWhileObserver, __super__);\n\n    function TakeWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = true;\n      __super__.call(this);\n    }\n\n    TakeWhileObserver.prototype.next = function (x) {\n      if (this._r) {\n        this._r = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (this._r === errorObj) { return this._o.onError(this._r.e); }\n      }\n      if (this._r) {\n        this._o.onNext(x);\n      } else {\n        this._o.onCompleted();\n      }\n    };\n    TakeWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns elements from an observable sequence as long as a specified condition is true.\n   *  The element's index is used in the logic of the predicate function.\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n   */\n  observableProto.takeWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new TakeWhileObservable(this, fn);\n  };\n\n  var FilterObservable = (function (__super__) {\n    inherits(FilterObservable, __super__);\n\n    function FilterObservable(source, predicate, thisArg) {\n      this.source = source;\n      this.predicate = bindCallback(predicate, thisArg, 3);\n      __super__.call(this);\n    }\n\n    FilterObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.predicate, this));\n    };\n\n    function innerPredicate(predicate, self) {\n      return function(x, i, o) { return self.predicate(x, i, o) && predicate.call(this, x, i, o); }\n    }\n\n    FilterObservable.prototype.internalFilter = function(predicate, thisArg) {\n      return new FilterObservable(this.source, innerPredicate(predicate, this), thisArg);\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, predicate, source) {\n      this.o = o;\n      this.predicate = predicate;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var shouldYield = tryCatch(this.predicate)(x, this.i++, this.source);\n      if (shouldYield === errorObj) {\n        return this.o.onError(shouldYield.e);\n      }\n      shouldYield && this.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return FilterObservable;\n\n  }(ObservableBase));\n\n  /**\n  *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n  * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n  */\n  observableProto.filter = observableProto.where = function (predicate, thisArg) {\n    return this instanceof FilterObservable ? this.internalFilter(predicate, thisArg) :\n      new FilterObservable(this, predicate, thisArg);\n  };\n\nfunction createCbObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createCbHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createCbHandler(o, ctx, selector) {\n  return function handler () {\n    var len = arguments.length, results = new Array(len);\n    for(var i = 0; i < len; i++) { results[i] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a callback function to an observable sequence.\n *\n * @param {Function} fn Function with a callback as the last parameter to convert to an Observable sequence.\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n */\nObservable.fromCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n\n    var len = arguments.length, args = new Array(len)\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createCbObservable(fn, ctx, selector, args);\n  };\n};\n\nfunction createNodeObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createNodeHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createNodeHandler(o, ctx, selector) {\n  return function handler () {\n    var err = arguments[0];\n    if (err) { return o.onError(err); }\n\n    var len = arguments.length, results = [];\n    for(var i = 1; i < len; i++) { results[i - 1] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      var results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n * @param {Function} fn The function to call\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n */\nObservable.fromNodeCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createNodeObservable(fn, ctx, selector, args);\n  };\n};\n\n  function isNodeList(el) {\n    if (root.StaticNodeList) {\n      // IE8 Specific\n      // instanceof is slower than Object#toString, but Object#toString will not work as intended in IE8\n      return el instanceof root.StaticNodeList || el instanceof root.NodeList;\n    } else {\n      return Object.prototype.toString.call(el) === '[object NodeList]';\n    }\n  }\n\n  function ListenDisposable(e, n, fn) {\n    this._e = e;\n    this._n = n;\n    this._fn = fn;\n    this._e.addEventListener(this._n, this._fn, false);\n    this.isDisposed = false;\n  }\n  ListenDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this._e.removeEventListener(this._n, this._fn, false);\n      this.isDisposed = true;\n    }\n  };\n\n  function createEventListener (el, eventName, handler) {\n    var disposables = new CompositeDisposable();\n\n    // Asume NodeList or HTMLCollection\n    var elemToString = Object.prototype.toString.call(el);\n    if (isNodeList(el) || elemToString === '[object HTMLCollection]') {\n      for (var i = 0, len = el.length; i < len; i++) {\n        disposables.add(createEventListener(el.item(i), eventName, handler));\n      }\n    } else if (el) {\n      disposables.add(new ListenDisposable(el, eventName, handler));\n    }\n\n    return disposables;\n  }\n\n  /**\n   * Configuration option to determine whether to use native events only\n   */\n  Rx.config.useNativeEvents = false;\n\n  var EventObservable = (function(__super__) {\n    inherits(EventObservable, __super__);\n    function EventObservable(el, name, fn) {\n      this._el = el;\n      this._n = name;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventObservable.prototype.subscribeCore = function (o) {\n      return createEventListener(\n        this._el,\n        this._n,\n        createHandler(o, this._fn));\n    };\n\n    return EventObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n   * @param {Object} element The DOMElement or NodeList to attach a listener.\n   * @param {String} eventName The event name to attach the observable sequence.\n   * @param {Object} eventListenerOptions An object describing EventListenerOptions\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n   */\n  Observable.fromEvent = function (element, eventName, selector, eventListenerOptions) {\n    // Node.js specific\n    if (element.addListener) {\n      return fromEventPattern(\n        function (h) { element.addListener(eventName, h, eventListenerOptions); },\n        function (h) { element.removeListener(eventName, h, eventListenerOptions); },\n        selector);\n    }\n\n    // Use only if non-native events are allowed\n    if (!Rx.config.useNativeEvents) {\n      // Handles jq, Angular.js, Zepto, Marionette, Ember.js\n      if (typeof element.on === 'function' && typeof element.off === 'function') {\n        return fromEventPattern(\n          function (h) { element.on(eventName, h, eventListenerOptions); },\n          function (h) { element.off(eventName, h, eventListenerOptions); },\n          selector);\n      }\n    }\n\n    return new EventObservable(element, eventName, selector).publish().refCount();\n  };\n\n  var EventPatternObservable = (function(__super__) {\n    inherits(EventPatternObservable, __super__);\n    function EventPatternObservable(add, del, fn) {\n      this._add = add;\n      this._del = del;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventPatternObservable.prototype.subscribeCore = function (o) {\n      var fn = createHandler(o, this._fn);\n      var returnValue = this._add(fn);\n      return new EventPatternDisposable(this._del, fn, returnValue);\n    };\n\n    function EventPatternDisposable(del, fn, ret) {\n      this._del = del;\n      this._fn = fn;\n      this._ret = ret;\n      this.isDisposed = false;\n    }\n\n    EventPatternDisposable.prototype.dispose = function () {\n      if(!this.isDisposed) {\n        isFunction(this._del) && this._del(this._fn, this._ret);\n        this.isDisposed = true;\n      }\n    };\n\n    return EventPatternObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n   * @param {Function} addHandler The function to add a handler to the emitter.\n   * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence which wraps an event from an event emitter\n   */\n  var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) {\n    return new EventPatternObservable(addHandler, removeHandler, selector).publish().refCount();\n  };\n\n  var FromPromiseObservable = (function(__super__) {\n    inherits(FromPromiseObservable, __super__);\n    function FromPromiseObservable(p, s) {\n      this._p = p;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleNext(s, state) {\n      var o = state[0], data = state[1];\n      o.onNext(data);\n      o.onCompleted();\n    }\n\n    function scheduleError(s, state) {\n      var o = state[0], err = state[1];\n      o.onError(err);\n    }\n\n    FromPromiseObservable.prototype.subscribeCore = function(o) {\n      var sad = new SingleAssignmentDisposable(), self = this, p = this._p;\n\n      if (isFunction(p)) {\n        p = tryCatch(p)();\n        if (p === errorObj) {\n          o.onError(p.e);\n          return sad;\n        }\n      }\n\n      p\n        .then(function (data) {\n          sad.setDisposable(self._s.schedule([o, data], scheduleNext));\n        }, function (err) {\n          sad.setDisposable(self._s.schedule([o, err], scheduleError));\n        });\n\n      return sad;\n    };\n\n    return FromPromiseObservable;\n  }(ObservableBase));\n\n  /**\n  * Converts a Promise to an Observable sequence\n  * @param {Promise} An ES6 Compliant promise.\n  * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n  */\n  var observableFromPromise = Observable.fromPromise = function (promise, scheduler) {\n    scheduler || (scheduler = defaultScheduler);\n    return new FromPromiseObservable(promise, scheduler);\n  };\n\n  /*\n   * Converts an existing observable sequence to an ES6 Compatible Promise\n   * @example\n   * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n   *\n   * // With config\n   * Rx.config.Promise = RSVP.Promise;\n   * var promise = Rx.Observable.return(42).toPromise();\n   * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n   * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n   */\n  observableProto.toPromise = function (promiseCtor) {\n    promiseCtor || (promiseCtor = Rx.config.Promise);\n    if (!promiseCtor) { throw new NotSupportedError('Promise type not provided nor in Rx.config.Promise'); }\n    var source = this;\n    return new promiseCtor(function (resolve, reject) {\n      // No cancellation can be done\n      var value;\n      source.subscribe(function (v) {\n        value = v;\n      }, reject, function () {\n        resolve(value);\n      });\n    });\n  };\n\n  /**\n   * Invokes the asynchronous function, surfacing the result through an observable sequence.\n   * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   */\n  Observable.startAsync = function (functionAsync) {\n    var promise = tryCatch(functionAsync)();\n    if (promise === errorObj) { return observableThrow(promise.e); }\n    return observableFromPromise(promise);\n  };\n\n  var MulticastObservable = (function (__super__) {\n    inherits(MulticastObservable, __super__);\n    function MulticastObservable(source, fn1, fn2) {\n      this.source = source;\n      this._fn1 = fn1;\n      this._fn2 = fn2;\n      __super__.call(this);\n    }\n\n    MulticastObservable.prototype.subscribeCore = function (o) {\n      var connectable = this.source.multicast(this._fn1());\n      return new BinaryDisposable(this._fn2(connectable).subscribe(o), connectable.connect());\n    };\n\n    return MulticastObservable;\n  }(ObservableBase));\n\n  /**\n   * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n   * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n   * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n   *\n   * @example\n   * 1 - res = source.multicast(observable);\n   * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n   *\n   * @param {Function|Subject} subjectOrSubjectSelector\n   * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n   * Or:\n   * Subject to push source elements into.\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.multicast = function (subjectOrSubjectSelector, selector) {\n    return isFunction(subjectOrSubjectSelector) ?\n      new MulticastObservable(this, subjectOrSubjectSelector, selector) :\n      new ConnectableObservable(this, subjectOrSubjectSelector);\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of Multicast using a regular Subject.\n   *\n   * @example\n   * var resres = source.publish();\n   * var res = source.publish(function (x) { return x; });\n   *\n   * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publish = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new Subject(); }, selector) :\n      this.multicast(new Subject());\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.share = function () {\n    return this.publish().refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n   * This operator is a specialization of Multicast using a AsyncSubject.\n   *\n   * @example\n   * var res = source.publishLast();\n   * var res = source.publishLast(function (x) { return x; });\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishLast = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new AsyncSubject(); }, selector) :\n      this.multicast(new AsyncSubject());\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n   * This operator is a specialization of Multicast using a BehaviorSubject.\n   *\n   * @example\n   * var res = source.publishValue(42);\n   * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishValue = function (initialValueOrSelector, initialValue) {\n    return arguments.length === 2 ?\n      this.multicast(function () {\n        return new BehaviorSubject(initialValue);\n      }, initialValueOrSelector) :\n      this.multicast(new BehaviorSubject(initialValueOrSelector));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n   * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareValue = function (initialValue) {\n    return this.publishValue(initialValue).refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of Multicast using a ReplaySubject.\n   *\n   * @example\n   * var res = source.replay(null, 3);\n   * var res = source.replay(null, 3, 500);\n   * var res = source.replay(null, 3, 500, scheduler);\n   * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param windowSize [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.replay = function (selector, bufferSize, windowSize, scheduler) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new ReplaySubject(bufferSize, windowSize, scheduler); }, selector) :\n      this.multicast(new ReplaySubject(bufferSize, windowSize, scheduler));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   *\n   * @example\n   * var res = source.shareReplay(3);\n   * var res = source.shareReplay(3, 500);\n   * var res = source.shareReplay(3, 500, scheduler);\n   *\n\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareReplay = function (bufferSize, windowSize, scheduler) {\n    return this.replay(null, bufferSize, windowSize, scheduler).refCount();\n  };\n\n  var RefCountObservable = (function (__super__) {\n    inherits(RefCountObservable, __super__);\n    function RefCountObservable(source) {\n      this.source = source;\n      this._count = 0;\n      this._connectableSubscription = null;\n      __super__.call(this);\n    }\n\n    RefCountObservable.prototype.subscribeCore = function (o) {\n      var subscription = this.source.subscribe(o);\n      ++this._count === 1 && (this._connectableSubscription = this.source.connect());\n      return new RefCountDisposable(this, subscription);\n    };\n\n    function RefCountDisposable(p, s) {\n      this._p = p;\n      this._s = s;\n      this.isDisposed = false;\n    }\n\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this._s.dispose();\n        --this._p._count === 0 && this._p._connectableSubscription.dispose();\n      }\n    };\n\n    return RefCountObservable;\n  }(ObservableBase));\n\n  var ConnectableObservable = Rx.ConnectableObservable = (function (__super__) {\n    inherits(ConnectableObservable, __super__);\n    function ConnectableObservable(source, subject) {\n      this.source = source;\n      this._connection = null;\n      this._source = source.asObservable();\n      this._subject = subject;\n      __super__.call(this);\n    }\n\n    function ConnectDisposable(parent, subscription) {\n      this._p = parent;\n      this._s = subscription;\n    }\n\n    ConnectDisposable.prototype.dispose = function () {\n      if (this._s) {\n        this._s.dispose();\n        this._s = null;\n        this._p._connection = null;\n      }\n    };\n\n    ConnectableObservable.prototype.connect = function () {\n      if (!this._connection) {\n        if (this._subject.isStopped) {\n          return disposableEmpty;\n        }\n        var subscription = this._source.subscribe(this._subject);\n        this._connection = new ConnectDisposable(this, subscription);\n      }\n      return this._connection;\n    };\n\n    ConnectableObservable.prototype._subscribe = function (o) {\n      return this._subject.subscribe(o);\n    };\n\n    ConnectableObservable.prototype.refCount = function () {\n      return new RefCountObservable(this);\n    };\n\n    return ConnectableObservable;\n  }(Observable));\n\n  var TimerObservable = (function(__super__) {\n    inherits(TimerObservable, __super__);\n    function TimerObservable(dt, s) {\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimerObservable.prototype.subscribeCore = function (o) {\n      return this._s.scheduleFuture(o, this._dt, scheduleMethod);\n    };\n\n    function scheduleMethod(s, o) {\n      o.onNext(0);\n      o.onCompleted();\n    }\n\n    return TimerObservable;\n  }(ObservableBase));\n\n  function _observableTimer(dueTime, scheduler) {\n    return new TimerObservable(dueTime, scheduler);\n  }\n\n  function observableTimerDateAndPeriod(dueTime, period, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var d = dueTime, p = normalizeTime(period);\n      return scheduler.scheduleRecursiveFuture(0, d, function (count, self) {\n        if (p > 0) {\n          var now = scheduler.now();\n          d = new Date(d.getTime() + p);\n          d.getTime() <= now && (d = new Date(now + p));\n        }\n        observer.onNext(count);\n        self(count + 1, new Date(d));\n      });\n    });\n  }\n\n  function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) {\n    return dueTime === period ?\n      new AnonymousObservable(function (observer) {\n        return scheduler.schedulePeriodic(0, period, function (count) {\n          observer.onNext(count);\n          return count + 1;\n        });\n      }) :\n      observableDefer(function () {\n        return observableTimerDateAndPeriod(new Date(scheduler.now() + dueTime), period, scheduler);\n      });\n  }\n\n  /**\n   *  Returns an observable sequence that produces a value after each period.\n   *\n   * @example\n   *  1 - res = Rx.Observable.interval(1000);\n   *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n   *\n   * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n   * @returns {Observable} An observable sequence that produces a value after each period.\n   */\n  var observableinterval = Observable.interval = function (period, scheduler) {\n    return observableTimerTimeSpanAndPeriod(period, period, isScheduler(scheduler) ? scheduler : defaultScheduler);\n  };\n\n  /**\n   *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n   * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n   */\n  var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) {\n    var period;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    if (periodOrScheduler != null && typeof periodOrScheduler === 'number') {\n      period = periodOrScheduler;\n    } else if (isScheduler(periodOrScheduler)) {\n      scheduler = periodOrScheduler;\n    }\n    if ((dueTime instanceof Date || typeof dueTime === 'number') && period === undefined) {\n      return _observableTimer(dueTime, scheduler);\n    }\n    if (dueTime instanceof Date && period !== undefined) {\n      return observableTimerDateAndPeriod(dueTime, periodOrScheduler, scheduler);\n    }\n    return observableTimerTimeSpanAndPeriod(dueTime, period, scheduler);\n  };\n\n  function observableDelayRelative(source, dueTime, scheduler) {\n    return new AnonymousObservable(function (o) {\n      var active = false,\n        cancelable = new SerialDisposable(),\n        exception = null,\n        q = [],\n        running = false,\n        subscription;\n      subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) {\n        var d, shouldRun;\n        if (notification.value.kind === 'E') {\n          q = [];\n          q.push(notification);\n          exception = notification.value.error;\n          shouldRun = !running;\n        } else {\n          q.push({ value: notification.value, timestamp: notification.timestamp + dueTime });\n          shouldRun = !active;\n          active = true;\n        }\n        if (shouldRun) {\n          if (exception !== null) {\n            o.onError(exception);\n          } else {\n            d = new SingleAssignmentDisposable();\n            cancelable.setDisposable(d);\n            d.setDisposable(scheduler.scheduleRecursiveFuture(null, dueTime, function (_, self) {\n              var e, recurseDueTime, result, shouldRecurse;\n              if (exception !== null) {\n                return;\n              }\n              running = true;\n              do {\n                result = null;\n                if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) {\n                  result = q.shift().value;\n                }\n                if (result !== null) {\n                  result.accept(o);\n                }\n              } while (result !== null);\n              shouldRecurse = false;\n              recurseDueTime = 0;\n              if (q.length > 0) {\n                shouldRecurse = true;\n                recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now());\n              } else {\n                active = false;\n              }\n              e = exception;\n              running = false;\n              if (e !== null) {\n                o.onError(e);\n              } else if (shouldRecurse) {\n                self(null, recurseDueTime);\n              }\n            }));\n          }\n        }\n      });\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  function observableDelayAbsolute(source, dueTime, scheduler) {\n    return observableDefer(function () {\n      return observableDelayRelative(source, dueTime - scheduler.now(), scheduler);\n    });\n  }\n\n  function delayWithSelector(source, subscriptionDelay, delayDurationSelector) {\n    var subDelay, selector;\n    if (isFunction(subscriptionDelay)) {\n      selector = subscriptionDelay;\n    } else {\n      subDelay = subscriptionDelay;\n      selector = delayDurationSelector;\n    }\n    return new AnonymousObservable(function (o) {\n      var delays = new CompositeDisposable(), atEnd = false, subscription = new SerialDisposable();\n\n      function start() {\n        subscription.setDisposable(source.subscribe(\n          function (x) {\n            var delay = tryCatch(selector)(x);\n            if (delay === errorObj) { return o.onError(delay.e); }\n            var d = new SingleAssignmentDisposable();\n            delays.add(d);\n            d.setDisposable(delay.subscribe(\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              },\n              function (e) { o.onError(e); },\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              }\n            ));\n          },\n          function (e) { o.onError(e); },\n          function () {\n            atEnd = true;\n            subscription.dispose();\n            done();\n          }\n        ));\n      }\n\n      function done () {\n        atEnd && delays.length === 0 && o.onCompleted();\n      }\n\n      if (!subDelay) {\n        start();\n      } else {\n        subscription.setDisposable(subDelay.subscribe(start, function (e) { o.onError(e); }, start));\n      }\n\n      return new BinaryDisposable(subscription, delays);\n    }, source);\n  }\n\n  /**\n   *  Time shifts the observable sequence by dueTime.\n   *  The relative time intervals between the values are preserved.\n   *\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n   * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delay = function () {\n    var firstArg = arguments[0];\n    if (typeof firstArg === 'number' || firstArg instanceof Date) {\n      var dueTime = firstArg, scheduler = arguments[1];\n      isScheduler(scheduler) || (scheduler = defaultScheduler);\n      return dueTime instanceof Date ?\n        observableDelayAbsolute(this, dueTime, scheduler) :\n        observableDelayRelative(this, dueTime, scheduler);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return delayWithSelector(this, firstArg, arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  var DebounceObservable = (function (__super__) {\n    inherits(DebounceObservable, __super__);\n    function DebounceObservable(source, dt, s) {\n      isScheduler(s) || (s = defaultScheduler);\n      this.source = source;\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    DebounceObservable.prototype.subscribeCore = function (o) {\n      var cancelable = new SerialDisposable();\n      return new BinaryDisposable(\n        this.source.subscribe(new DebounceObserver(o, this._dt, this._s, cancelable)),\n        cancelable);\n    };\n\n    return DebounceObservable;\n  }(ObservableBase));\n\n  var DebounceObserver = (function (__super__) {\n    inherits(DebounceObserver, __super__);\n    function DebounceObserver(observer, dueTime, scheduler, cancelable) {\n      this._o = observer;\n      this._d = dueTime;\n      this._scheduler = scheduler;\n      this._c = cancelable;\n      this._v = null;\n      this._hv = false;\n      this._id = 0;\n      __super__.call(this);\n    }\n\n    function scheduleFuture(s, state) {\n      state.self._hv && state.self._id === state.currentId && state.self._o.onNext(state.x);\n      state.self._hv = false;\n    }\n\n    DebounceObserver.prototype.next = function (x) {\n      this._hv = true;\n      this._v = x;\n      var currentId = ++this._id, d = new SingleAssignmentDisposable();\n      this._c.setDisposable(d);\n      d.setDisposable(this._scheduler.scheduleFuture(this, this._d, function (_, self) {\n        self._hv && self._id === currentId && self._o.onNext(x);\n        self._hv = false;\n      }));\n    };\n\n    DebounceObserver.prototype.error = function (e) {\n      this._c.dispose();\n      this._o.onError(e);\n      this._hv = false;\n      this._id++;\n    };\n\n    DebounceObserver.prototype.completed = function () {\n      this._c.dispose();\n      this._hv && this._o.onNext(this._v);\n      this._o.onCompleted();\n      this._hv = false;\n      this._id++;\n    };\n\n    return DebounceObserver;\n  }(AbstractObserver));\n\n  function debounceWithSelector(source, durationSelector) {\n    return new AnonymousObservable(function (o) {\n      var value, hasValue = false, cancelable = new SerialDisposable(), id = 0;\n      var subscription = source.subscribe(\n        function (x) {\n          var throttle = tryCatch(durationSelector)(x);\n          if (throttle === errorObj) { return o.onError(throttle.e); }\n\n          isPromise(throttle) && (throttle = observableFromPromise(throttle));\n\n          hasValue = true;\n          value = x;\n          id++;\n          var currentid = id, d = new SingleAssignmentDisposable();\n          cancelable.setDisposable(d);\n          d.setDisposable(throttle.subscribe(\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            },\n            function (e) { o.onError(e); },\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            }\n          ));\n        },\n        function (e) {\n          cancelable.dispose();\n          o.onError(e);\n          hasValue = false;\n          id++;\n        },\n        function () {\n          cancelable.dispose();\n          hasValue && o.onNext(value);\n          o.onCompleted();\n          hasValue = false;\n          id++;\n        }\n      );\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  observableProto.debounce = function () {\n    if (isFunction (arguments[0])) {\n      return debounceWithSelector(this, arguments[0]);\n    } else if (typeof arguments[0] === 'number') {\n      return new DebounceObservable(this, arguments[0], arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  var TimestampObservable = (function (__super__) {\n    inherits(TimestampObservable, __super__);\n    function TimestampObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TimestampObserver(o, this._s));\n    };\n\n    return TimestampObservable;\n  }(ObservableBase));\n\n  var TimestampObserver = (function (__super__) {\n    inherits(TimestampObserver, __super__);\n    function TimestampObserver(o, s) {\n      this._o = o;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObserver.prototype.next = function (x) {\n      this._o.onNext({ value: x, timestamp: this._s.now() });\n    };\n\n    TimestampObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TimestampObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return TimestampObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Records the timestamp for each value in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n   *  2 - res = source.timestamp(Rx.Scheduler.default);\n   *\n   * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the default scheduler is used.\n   * @returns {Observable} An observable sequence with timestamp information on values.\n   */\n  observableProto.timestamp = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TimestampObservable(this, scheduler);\n  };\n\n  var SampleObservable = (function(__super__) {\n    inherits(SampleObservable, __super__);\n    function SampleObservable(source, sampler) {\n      this.source = source;\n      this._sampler = sampler;\n      __super__.call(this);\n    }\n\n    SampleObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        atEnd: false,\n        value: null,\n        hasValue: false,\n        sourceSubscription: new SingleAssignmentDisposable()\n      };\n\n      state.sourceSubscription.setDisposable(this.source.subscribe(new SampleSourceObserver(state)));\n      return new BinaryDisposable(\n        state.sourceSubscription,\n        this._sampler.subscribe(new SamplerObserver(state))\n      );\n    };\n\n    return SampleObservable;\n  }(ObservableBase));\n\n  var SamplerObserver = (function(__super__) {\n    inherits(SamplerObserver, __super__);\n    function SamplerObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SamplerObserver.prototype._handleMessage = function () {\n      if (this._s.hasValue) {\n        this._s.hasValue = false;\n        this._s.o.onNext(this._s.value);\n      }\n      this._s.atEnd && this._s.o.onCompleted();\n    };\n\n    SamplerObserver.prototype.next = function () { this._handleMessage(); };\n    SamplerObserver.prototype.error = function (e) { this._s.onError(e); };\n    SamplerObserver.prototype.completed = function () { this._handleMessage(); };\n\n    return SamplerObserver;\n  }(AbstractObserver));\n\n  var SampleSourceObserver = (function(__super__) {\n    inherits(SampleSourceObserver, __super__);\n    function SampleSourceObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SampleSourceObserver.prototype.next = function (x) {\n      this._s.hasValue = true;\n      this._s.value = x;\n    };\n    SampleSourceObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    SampleSourceObserver.prototype.completed = function () {\n      this._s.atEnd = true;\n      this._s.sourceSubscription.dispose();\n    };\n\n    return SampleSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Samples the observable sequence at each interval.\n   *\n   * @example\n   *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n   *  2 - res = source.sample(5000); // 5 seconds\n   *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n   *\n   * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n   * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Sampled observable sequence.\n   */\n  observableProto.sample = function (intervalOrSampler, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return typeof intervalOrSampler === 'number' ?\n      new SampleObservable(this, observableinterval(intervalOrSampler, scheduler)) :\n      new SampleObservable(this, intervalOrSampler);\n  };\n\n  var TimeoutError = Rx.TimeoutError = function(message) {\n    this.message = message || 'Timeout has occurred';\n    this.name = 'TimeoutError';\n    Error.call(this);\n  };\n  TimeoutError.prototype = Object.create(Error.prototype);\n\n  function timeoutWithSelector(source, firstTimeout, timeoutDurationSelector, other) {\n    if (isFunction(firstTimeout)) {\n      other = timeoutDurationSelector;\n      timeoutDurationSelector = firstTimeout;\n      firstTimeout = observableNever();\n    }\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var subscription = new SerialDisposable(),\n        timer = new SerialDisposable(),\n        original = new SingleAssignmentDisposable();\n\n      subscription.setDisposable(original);\n\n      var id = 0, switched = false;\n\n      function setTimer(timeout) {\n        var myId = id, d = new SingleAssignmentDisposable();\n\n        function timerWins() {\n          switched = (myId === id);\n          return switched;\n        }\n\n        timer.setDisposable(d);\n        d.setDisposable(timeout.subscribe(function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n          d.dispose();\n        }, function (e) {\n          timerWins() && o.onError(e);\n        }, function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n        }));\n      };\n\n      setTimer(firstTimeout);\n\n      function oWins() {\n        var res = !switched;\n        if (res) { id++; }\n        return res;\n      }\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (oWins()) {\n          o.onNext(x);\n          var timeout = tryCatch(timeoutDurationSelector)(x);\n          if (timeout === errorObj) { return o.onError(timeout.e); }\n          setTimer(isPromise(timeout) ? observableFromPromise(timeout) : timeout);\n        }\n      }, function (e) {\n        oWins() && o.onError(e);\n      }, function () {\n        oWins() && o.onCompleted();\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  function timeout(source, dueTime, other, scheduler) {\n    if (isScheduler(other)) {\n      scheduler = other;\n      other = observableThrow(new TimeoutError());\n    }\n    if (other instanceof Error) { other = observableThrow(other); }\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var id = 0,\n        original = new SingleAssignmentDisposable(),\n        subscription = new SerialDisposable(),\n        switched = false,\n        timer = new SerialDisposable();\n\n      subscription.setDisposable(original);\n\n      function createTimer() {\n        var myId = id;\n        timer.setDisposable(scheduler.scheduleFuture(null, dueTime, function () {\n          switched = id === myId;\n          if (switched) {\n            isPromise(other) && (other = observableFromPromise(other));\n            subscription.setDisposable(other.subscribe(o));\n          }\n        }));\n      }\n\n      createTimer();\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (!switched) {\n          id++;\n          o.onNext(x);\n          createTimer();\n        }\n      }, function (e) {\n        if (!switched) {\n          id++;\n          o.onError(e);\n        }\n      }, function () {\n        if (!switched) {\n          id++;\n          o.onCompleted();\n        }\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  observableProto.timeout = function () {\n    var firstArg = arguments[0];\n    if (firstArg instanceof Date || typeof firstArg === 'number') {\n      return timeout(this, firstArg, arguments[1], arguments[2]);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return timeoutWithSelector(this, firstArg, arguments[1], arguments[2]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  /**\n   * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n   * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n   * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n   * @returns {Observable} An Observable that performs the throttle operation.\n   */\n  observableProto.throttle = function (windowDuration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    var duration = +windowDuration || 0;\n    if (duration <= 0) { throw new RangeError('windowDuration cannot be less or equal zero.'); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var lastOnNext = 0;\n      return source.subscribe(\n        function (x) {\n          var now = scheduler.now();\n          if (lastOnNext === 0 || now - lastOnNext >= duration) {\n            lastOnNext = now;\n            o.onNext(x);\n          }\n        },function (e) { o.onError(e); }, function () { o.onCompleted(); }\n      );\n    }, source);\n  };\n\n  var PausableObservable = (function (__super__) {\n    inherits(PausableObservable, __super__);\n    function PausableObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableObservable.prototype._subscribe = function (o) {\n      var conn = this.source.publish(),\n        subscription = conn.subscribe(o),\n        connection = disposableEmpty;\n\n      var pausable = this.pauser.startWith(!this.paused).distinctUntilChanged().subscribe(function (b) {\n        if (b) {\n          connection = conn.connect();\n        } else {\n          connection.dispose();\n          connection = disposableEmpty;\n        }\n      });\n\n      return new NAryDisposable([subscription, connection, pausable]);\n    };\n\n    PausableObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausable(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausable = function (pauser) {\n    return new PausableObservable(this, pauser);\n  };\n\n  function combineLatestSource(source, subject, resultSelector) {\n    return new AnonymousObservable(function (o) {\n      var hasValue = [false, false],\n        hasValueAll = false,\n        isDone = false,\n        values = new Array(2),\n        err;\n\n      function next(x, i) {\n        values[i] = x;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          if (err) { return o.onError(err); }\n          var res = tryCatch(resultSelector).apply(null, values);\n          if (res === errorObj) { return o.onError(res.e); }\n          o.onNext(res);\n        }\n        isDone && values[1] && o.onCompleted();\n      }\n\n      return new BinaryDisposable(\n        source.subscribe(\n          function (x) {\n            next(x, 0);\n          },\n          function (e) {\n            if (values[1]) {\n              o.onError(e);\n            } else {\n              err = e;\n            }\n          },\n          function () {\n            isDone = true;\n            values[1] && o.onCompleted();\n          }),\n        subject.subscribe(\n          function (x) {\n            next(x, 1);\n          },\n          function (e) { o.onError(e); },\n          function () {\n            isDone = true;\n            next(true, 1);\n          })\n        );\n    }, source);\n  }\n\n  var PausableBufferedObservable = (function (__super__) {\n    inherits(PausableBufferedObservable, __super__);\n    function PausableBufferedObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableBufferedObservable.prototype._subscribe = function (o) {\n      var q = [], previousShouldFire;\n\n      function drainQueue() { while (q.length > 0) { o.onNext(q.shift()); } }\n\n      var subscription =\n        combineLatestSource(\n          this.source,\n          this.pauser.startWith(!this.paused).distinctUntilChanged(),\n          function (data, shouldFire) {\n            return { data: data, shouldFire: shouldFire };\n          })\n          .subscribe(\n            function (results) {\n              if (previousShouldFire !== undefined && results.shouldFire !== previousShouldFire) {\n                previousShouldFire = results.shouldFire;\n                // change in shouldFire\n                if (results.shouldFire) { drainQueue(); }\n              } else {\n                previousShouldFire = results.shouldFire;\n                // new data\n                if (results.shouldFire) {\n                  o.onNext(results.data);\n                } else {\n                  q.push(results.data);\n                }\n              }\n            },\n            function (err) {\n              drainQueue();\n              o.onError(err);\n            },\n            function () {\n              drainQueue();\n              o.onCompleted();\n            }\n          );\n      return subscription;      \n    };\n\n    PausableBufferedObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableBufferedObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableBufferedObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n   * and yields the values that were buffered while paused.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausableBuffered = function (pauser) {\n    return new PausableBufferedObservable(this, pauser);\n  };\n\n  var ControlledObservable = (function (__super__) {\n    inherits(ControlledObservable, __super__);\n    function ControlledObservable (source, enableQueue, scheduler) {\n      __super__.call(this);\n      this.subject = new ControlledSubject(enableQueue, scheduler);\n      this.source = source.multicast(this.subject).refCount();\n    }\n\n    ControlledObservable.prototype._subscribe = function (o) {\n      return this.source.subscribe(o);\n    };\n\n    ControlledObservable.prototype.request = function (numberOfItems) {\n      return this.subject.request(numberOfItems == null ? -1 : numberOfItems);\n    };\n\n    return ControlledObservable;\n\n  }(Observable));\n\n  var ControlledSubject = (function (__super__) {\n    inherits(ControlledSubject, __super__);\n    function ControlledSubject(enableQueue, scheduler) {\n      enableQueue == null && (enableQueue = true);\n\n      __super__.call(this);\n      this.subject = new Subject();\n      this.enableQueue = enableQueue;\n      this.queue = enableQueue ? [] : null;\n      this.requestedCount = 0;\n      this.requestedDisposable = null;\n      this.error = null;\n      this.hasFailed = false;\n      this.hasCompleted = false;\n      this.scheduler = scheduler || currentThreadScheduler;\n    }\n\n    addProperties(ControlledSubject.prototype, Observer, {\n      _subscribe: function (o) {\n        return this.subject.subscribe(o);\n      },\n      onCompleted: function () {\n        this.hasCompleted = true;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onCompleted();\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnCompleted());\n        }\n      },\n      onError: function (error) {\n        this.hasFailed = true;\n        this.error = error;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onError(error);\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnError(error));\n        }\n      },\n      onNext: function (value) {\n        if (this.requestedCount <= 0) {\n          this.enableQueue && this.queue.push(Notification.createOnNext(value));\n        } else {\n          (this.requestedCount-- === 0) && this.disposeCurrentRequest();\n          this.subject.onNext(value);\n        }\n      },\n      _processRequest: function (numberOfItems) {\n        if (this.enableQueue) {\n          while (this.queue.length > 0 && (numberOfItems > 0 || this.queue[0].kind !== 'N')) {\n            var first = this.queue.shift();\n            first.accept(this.subject);\n            if (first.kind === 'N') {\n              numberOfItems--;\n            } else {\n              this.disposeCurrentRequest();\n              this.queue = [];\n            }\n          }\n        }\n\n        return numberOfItems;\n      },\n      request: function (number) {\n        this.disposeCurrentRequest();\n        var self = this;\n\n        this.requestedDisposable = this.scheduler.schedule(number,\n        function(s, i) {\n          var remaining = self._processRequest(i);\n          var stopped = self.hasCompleted || self.hasFailed;\n          if (!stopped && remaining > 0) {\n            self.requestedCount = remaining;\n\n            return disposableCreate(function () {\n              self.requestedCount = 0;\n            });\n              // Scheduled item is still in progress. Return a new\n              // disposable to allow the request to be interrupted\n              // via dispose.\n          }\n        });\n\n        return this.requestedDisposable;\n      },\n      disposeCurrentRequest: function () {\n        if (this.requestedDisposable) {\n          this.requestedDisposable.dispose();\n          this.requestedDisposable = null;\n        }\n      }\n    });\n\n    return ControlledSubject;\n  }(Observable));\n\n  /**\n   * Attaches a controller to the observable sequence with the ability to queue.\n   * @example\n   * var source = Rx.Observable.interval(100).controlled();\n   * source.request(3); // Reads 3 values\n   * @param {bool} enableQueue truthy value to determine if values should be queued pending the next request\n   * @param {Scheduler} scheduler determines how the requests will be scheduled\n   * @returns {Observable} The observable sequence which only propagates values on request.\n   */\n  observableProto.controlled = function (enableQueue, scheduler) {\n\n    if (enableQueue && isScheduler(enableQueue)) {\n      scheduler = enableQueue;\n      enableQueue = true;\n    }\n\n    if (enableQueue == null) {  enableQueue = true; }\n    return new ControlledObservable(this, enableQueue, scheduler);\n  };\n\n  /**\n   * Pipes the existing Observable sequence into a Node.js Stream.\n   * @param {Stream} dest The destination Node.js stream.\n   * @returns {Stream} The destination stream.\n   */\n  observableProto.pipe = function (dest) {\n    var source = this.pausableBuffered();\n\n    function onDrain() {\n      source.resume();\n    }\n\n    dest.addListener('drain', onDrain);\n\n    source.subscribe(\n      function (x) {\n        !dest.write(x) && source.pause();\n      },\n      function (err) {\n        dest.emit('error', err);\n      },\n      function () {\n        // Hack check because STDIO is not closable\n        !dest._isStdio && dest.end();\n        dest.removeListener('drain', onDrain);\n      });\n\n    source.resume();\n\n    return dest;\n  };\n\n  var TransduceObserver = (function (__super__) {\n    inherits(TransduceObserver, __super__);\n    function TransduceObserver(o, xform) {\n      this._o = o;\n      this._xform = xform;\n      __super__.call(this);\n    }\n\n    TransduceObserver.prototype.next = function (x) {\n      var res = tryCatch(this._xform['@@transducer/step']).call(this._xform, this._o, x);\n      if (res === errorObj) { this._o.onError(res.e); }\n    };\n\n    TransduceObserver.prototype.error = function (e) { this._o.onError(e); };\n\n    TransduceObserver.prototype.completed = function () {\n      this._xform['@@transducer/result'](this._o);\n    };\n\n    return TransduceObserver;\n  }(AbstractObserver));\n\n  function transformForObserver(o) {\n    return {\n      '@@transducer/init': function() {\n        return o;\n      },\n      '@@transducer/step': function(obs, input) {\n        return obs.onNext(input);\n      },\n      '@@transducer/result': function(obs) {\n        return obs.onCompleted();\n      }\n    };\n  }\n\n  /**\n   * Executes a transducer to transform the observable sequence\n   * @param {Transducer} transducer A transducer to execute\n   * @returns {Observable} An Observable sequence containing the results from the transducer.\n   */\n  observableProto.transduce = function(transducer) {\n    var source = this;\n    return new AnonymousObservable(function(o) {\n      var xform = transducer(transformForObserver(o));\n      return source.subscribe(new TransduceObserver(o, xform));\n    }, source);\n  };\n\n  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {\n    inherits(AnonymousObservable, __super__);\n\n    // Fix subscriber to check for undefined or function returned to decorate as Disposable\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.__subscribe).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function AnonymousObservable(subscribe, parent) {\n      this.source = parent;\n      this.__subscribe = subscribe;\n      __super__.call(this);\n    }\n\n    AnonymousObservable.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    return AnonymousObservable;\n\n  }(Observable));\n\n  var AutoDetachObserver = (function (__super__) {\n    inherits(AutoDetachObserver, __super__);\n\n    function AutoDetachObserver(observer) {\n      __super__.call(this);\n      this.observer = observer;\n      this.m = new SingleAssignmentDisposable();\n    }\n\n    var AutoDetachObserverPrototype = AutoDetachObserver.prototype;\n\n    AutoDetachObserverPrototype.next = function (value) {\n      var result = tryCatch(this.observer.onNext).call(this.observer, value);\n      if (result === errorObj) {\n        this.dispose();\n        thrower(result.e);\n      }\n    };\n\n    AutoDetachObserverPrototype.error = function (err) {\n      var result = tryCatch(this.observer.onError).call(this.observer, err);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.completed = function () {\n      var result = tryCatch(this.observer.onCompleted).call(this.observer);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };\n    AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };\n\n    AutoDetachObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.m.dispose();\n    };\n\n    return AutoDetachObserver;\n  }(AbstractObserver));\n\n  var InnerSubscription = function (s, o) {\n    this._s = s;\n    this._o = o;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this._s.isDisposed && this._o !== null) {\n      var idx = this._s.observers.indexOf(this._o);\n      this._s.observers.splice(idx, 1);\n      this._o = null;\n    }\n  };\n\n  /**\n   *  Represents an object that is both an observable sequence as well as an observer.\n   *  Each notification is broadcasted to all subscribed observers.\n   */\n  var Subject = Rx.Subject = (function (__super__) {\n    inherits(Subject, __super__);\n    function Subject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(Subject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n          return disposableEmpty;\n        }\n        o.onCompleted();\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onCompleted();\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.error = error;\n          this.hasError = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onNext(value);\n          }\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    /**\n     * Creates a subject from the specified observer and observable.\n     * @param {Observer} observer The observer used to send messages to the subject.\n     * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n     * @returns {Subject} Subject implemented using the given observer and observable.\n     */\n    Subject.create = function (observer, observable) {\n      return new AnonymousSubject(observer, observable);\n    };\n\n    return Subject;\n  }(Observable));\n\n  /**\n   *  Represents the result of an asynchronous operation.\n   *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n   */\n  var AsyncSubject = Rx.AsyncSubject = (function (__super__) {\n    inherits(AsyncSubject, __super__);\n\n    /**\n     * Creates a subject that can only receive one value and that value is cached for all future observations.\n     * @constructor\n     */\n    function AsyncSubject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasValue = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(AsyncSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n\n        if (this.hasError) {\n          o.onError(this.error);\n        } else if (this.hasValue) {\n          o.onNext(this.value);\n          o.onCompleted();\n        } else {\n          o.onCompleted();\n        }\n\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n       */\n      onCompleted: function () {\n        var i, len;\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          var os = cloneArray(this.observers), len = os.length;\n\n          if (this.hasValue) {\n            for (i = 0; i < len; i++) {\n              var o = os[i];\n              o.onNext(this.value);\n              o.onCompleted();\n            }\n          } else {\n            for (i = 0; i < len; i++) {\n              os[i].onCompleted();\n            }\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the error.\n       * @param {Mixed} error The Error to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.hasError = true;\n          this.error = error;\n\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n       * @param {Mixed} value The value to store in the subject.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        this.hasValue = true;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.error = null;\n        this.value = null;\n      }\n    });\n\n    return AsyncSubject;\n  }(Observable));\n\n  var AnonymousSubject = Rx.AnonymousSubject = (function (__super__) {\n    inherits(AnonymousSubject, __super__);\n    function AnonymousSubject(observer, observable) {\n      this.observer = observer;\n      this.observable = observable;\n      __super__.call(this);\n    }\n\n    addProperties(AnonymousSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        return this.observable.subscribe(o);\n      },\n      onCompleted: function () {\n        this.observer.onCompleted();\n      },\n      onError: function (error) {\n        this.observer.onError(error);\n      },\n      onNext: function (value) {\n        this.observer.onNext(value);\n      }\n    });\n\n    return AnonymousSubject;\n  }(Observable));\n\n  /**\n   *  Represents a value that changes over time.\n   *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n   */\n  var BehaviorSubject = Rx.BehaviorSubject = (function (__super__) {\n    inherits(BehaviorSubject, __super__);\n    function BehaviorSubject(value) {\n      __super__.call(this);\n      this.value = value;\n      this.observers = [];\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasError = false;\n    }\n\n    addProperties(BehaviorSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          o.onNext(this.value);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n        } else {\n          o.onCompleted();\n        }\n        return disposableEmpty;\n      },\n      /**\n       * Gets the current value or throws an exception.\n       * Value is frozen after onCompleted is called.\n       * After onError is called always throws the specified exception.\n       * An exception is always thrown after dispose is called.\n       * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n       */\n      getValue: function () {\n        checkDisposed(this);\n        if (this.hasError) { thrower(this.error); }\n        return this.value;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onCompleted();\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.hasError = true;\n        this.error = error;\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onError(error);\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onNext(value);\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.value = null;\n        this.error = null;\n      }\n    });\n\n    return BehaviorSubject;\n  }(Observable));\n\n  /**\n   * Represents an object that is both an observable sequence as well as an observer.\n   * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n   */\n  var ReplaySubject = Rx.ReplaySubject = (function (__super__) {\n\n    var maxSafeInteger = Math.pow(2, 53) - 1;\n\n    function createRemovableDisposable(subject, observer) {\n      return disposableCreate(function () {\n        observer.dispose();\n        !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n      });\n    }\n\n    inherits(ReplaySubject, __super__);\n\n    /**\n     *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n     *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n     *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n     *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n     */\n    function ReplaySubject(bufferSize, windowSize, scheduler) {\n      this.bufferSize = bufferSize == null ? maxSafeInteger : bufferSize;\n      this.windowSize = windowSize == null ? maxSafeInteger : windowSize;\n      this.scheduler = scheduler || currentThreadScheduler;\n      this.q = [];\n      this.observers = [];\n      this.isStopped = false;\n      this.isDisposed = false;\n      this.hasError = false;\n      this.error = null;\n      __super__.call(this);\n    }\n\n    addProperties(ReplaySubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        var so = new ScheduledObserver(this.scheduler, o), subscription = createRemovableDisposable(this, so);\n\n        this._trim(this.scheduler.now());\n        this.observers.push(so);\n\n        for (var i = 0, len = this.q.length; i < len; i++) {\n          so.onNext(this.q[i].value);\n        }\n\n        if (this.hasError) {\n          so.onError(this.error);\n        } else if (this.isStopped) {\n          so.onCompleted();\n        }\n\n        so.ensureActive();\n        return subscription;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      _trim: function (now) {\n        while (this.q.length > this.bufferSize) {\n          this.q.shift();\n        }\n        while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {\n          this.q.shift();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        var now = this.scheduler.now();\n        this.q.push({ interval: now, value: value });\n        this._trim(now);\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onNext(value);\n          observer.ensureActive();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.error = error;\n        this.hasError = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onError(error);\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onCompleted();\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    return ReplaySubject;\n  }(Observable));\n\n  /**\n  * Used to pause and resume streams.\n  */\n  Rx.Pauser = (function (__super__) {\n    inherits(Pauser, __super__);\n    function Pauser() {\n      __super__.call(this);\n    }\n\n    /**\n     * Pauses the underlying sequence.\n     */\n    Pauser.prototype.pause = function () { this.onNext(false); };\n\n    /**\n    * Resumes the underlying sequence.\n    */\n    Pauser.prototype.resume = function () { this.onNext(true); };\n\n    return Pauser;\n  }(Subject));\n\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    root.Rx = Rx;\n\n    define(function() {\n      return Rx;\n    });\n  } else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = Rx).Rx = Rx;\n    } else {\n      freeExports.Rx = Rx;\n    }\n  } else {\n    // in a browser or Rhino\n    root.Rx = Rx;\n  }\n\n  // All code before this point will be filtered from stack traces.\n  var rEndingLine = captureLine();\n\n}.call(this));\n"
  },
  {
    "path": "modules/rx-lite-aggregates/package.json",
    "content": "{\n  \"name\": \"rx-lite-aggregates\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Aggregates\",\n  \"description\": \"Lightweight library with aggregate functions for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.aggregates.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.aggregates.js\"\n  },\n  \"dependencies\": {\n    \"rx-lite\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.aggregates.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-aggregates/readme.md",
    "content": "# RxJS Aggregates Module #\n\nThe Reactive Extensions for JavaScript has a number of aggregation operators including those you might already know from the Array#extras and the upcoming ES6 standard such as `reduce`, `find` and `findIndex`.  This module is used exclusively for aggregation operations used on finite observable sequences.  In addition to the aforementioned operators, there are many useful operators such as `count`, `sum`, `average` and determining whether two sequences are equal via the `sequenceEqual` method.  This requires `rx.lite.js` from the [`rx-lite`](https://www.npmjs.com/package/rx-lite) NPM module.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-aggregates\n$ npm install -g rx-lite-aggregates\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-aggregates');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.js\"></script>\n<script src=\"path/to/rx.lite.aggregates.js\"></script>\n```\n\n## Included Observable Operators ##\n\n### `Observable Instance Methods`\n- [`aggregate`](../../doc/api/core/operators/reduce.md)\n- [`all`](../../doc/api/core/operators/every.md)\n- [`any`](../../doc/api/core/operators/some.md)\n- [`average`](../../doc/api/core/operators/average.md)\n- [`includes`](../../doc/api/core/operators/includes.md)\n- [`count`](../../doc/api/core/operators/count.md)\n- [`elementAt`](../../doc/api/core/operators/elementat.md)\n- [`elementAtOrDefault`](../../doc/api/core/operators/elementatordefault.md)\n- [`every`](../../doc/api/core/operators/every.md)\n- [`find`](../../doc/api/core/operators/find.md)\n- [`findIndex`](../../doc/api/core/operators/findindex.md)\n- [`first`](../../doc/api/core/operators/first.md)\n- [`firstOrDefault`](../../doc/api/core/operators/firstordefault.md)\n- [`indexOf`](../../doc/api/core/operators/indexof.md)\n- [`isEmpty`](../../doc/api/core/operators/isempty.md)\n- [`last`](../../doc/api/core/operators/last.md)\n- [`lastOrDefault`](../../doc/api/core/operators/lastordefault.md)\n- [`max`](../../doc/api/core/operators/max.md)\n- [`maxBy`](../../doc/api/core/operators/maxby.md)\n- [`min`](../../doc/api/core/operators/min.md)\n- [`minBy`](../../doc/api/core/operators/minby.md)\n- [`reduce`](../../doc/api/core/operators/reduce.md)\n- [`sequenceEqual`](../../doc/api/core/operators/sequenceequal.md)\n- [`single`](../../doc/api/core/operators/single.md)\n- [`singleOrDefault`](../../doc/api/core/operators/singleordefault.md)\n- [`some`](../../doc/api/core/operators/some.md)\n- [`sum`](../../doc/api/core/operators/sum.md)\n- [`toMap`](../../doc/api/core/operators/tomap.md)\n- [`toSet`](../../doc/api/core/operators/toset.md)\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-aggregates/rx.lite.aggregates.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // References\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    BinaryDisposable = Rx.BinaryDisposable,\n    AnonymousObservable = Rx.AnonymousObservable,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    disposableEmpty = Rx.Disposable.empty,\n    helpers = Rx.helpers,\n    defaultComparer = helpers.defaultComparer,\n    identity = helpers.identity,\n    defaultSubComparer = helpers.defaultSubComparer,\n    isFunction = helpers.isFunction,\n    isPromise = helpers.isPromise,\n    isArrayLike = helpers.isArrayLike,\n    isIterable = helpers.isIterable,\n    inherits = Rx.internals.inherits,\n    observableFromPromise = Observable.fromPromise,\n    observableFrom = Observable.from,\n    bindCallback = Rx.internals.bindCallback,\n    EmptyError = Rx.EmptyError,\n    ObservableBase = Rx.ObservableBase,\n    ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  var ExtremaByObservable = (function (__super__) {\n    inherits(ExtremaByObservable, __super__);\n    function ExtremaByObservable(source, k, c) {\n      this.source = source;\n      this._k = k;\n      this._c = c;\n      __super__.call(this);\n    }\n\n    ExtremaByObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ExtremaByObserver(o, this._k, this._c));\n    };\n\n    return ExtremaByObservable;\n  }(ObservableBase));\n\n  var ExtremaByObserver = (function (__super__) {\n    inherits(ExtremaByObserver, __super__);\n    function ExtremaByObserver(o, k, c) {\n      this._o = o;\n      this._k = k;\n      this._c = c;\n      this._v = null;\n      this._hv = false;\n      this._l = [];\n      __super__.call(this);\n    }\n\n    ExtremaByObserver.prototype.next = function (x) {\n      var key = tryCatch(this._k)(x);\n      if (key === errorObj) { return this._o.onError(key.e); }\n      var comparison = 0;\n      if (!this._hv) {\n        this._hv = true;\n        this._v = key;\n      } else {\n        comparison = tryCatch(this._c)(key, this._v);\n        if (comparison === errorObj) { return this._o.onError(comparison.e); }\n      }\n      if (comparison > 0) {\n        this._v = key;\n        this._l = [];\n      }\n      if (comparison >= 0) { this._l.push(x); }\n    };\n\n    ExtremaByObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ExtremaByObserver.prototype.completed = function () {\n      this._o.onNext(this._l);\n      this._o.onCompleted();\n    };\n\n    return ExtremaByObserver;\n  }(AbstractObserver));\n\n  function firstOnly(x) {\n    if (x.length === 0) { throw new EmptyError(); }\n    return x[0];\n  }\n\n  var ReduceObservable = (function(__super__) {\n    inherits(ReduceObservable, __super__);\n    function ReduceObservable(source, accumulator, hasSeed, seed) {\n      this.source = source;\n      this.accumulator = accumulator;\n      this.hasSeed = hasSeed;\n      this.seed = seed;\n      __super__.call(this);\n    }\n\n    ReduceObservable.prototype.subscribeCore = function(observer) {\n      return this.source.subscribe(new ReduceObserver(observer,this));\n    };\n\n    return ReduceObservable;\n  }(ObservableBase));\n\n  var ReduceObserver = (function (__super__) {\n    inherits(ReduceObserver, __super__);\n    function ReduceObserver(o, parent) {\n      this._o = o;\n      this._p = parent;\n      this._fn = parent.accumulator;\n      this._hs = parent.hasSeed;\n      this._s = parent.seed;\n      this._ha = false;\n      this._a = null;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    ReduceObserver.prototype.next = function (x) {\n      !this._hv && (this._hv = true);\n      if (this._ha) {\n        this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n      } else {\n        this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n        this._ha = true;\n      }\n      if (this._a === errorObj) { return this._o.onError(this._a.e); }\n      this._i++;\n    };\n\n    ReduceObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ReduceObserver.prototype.completed = function () {\n      this._hv && this._o.onNext(this._a);\n      !this._hv && this._hs && this._o.onNext(this._s);\n      !this._hv && !this._hs && this._o.onError(new EmptyError());\n      this._o.onCompleted();\n    };\n\n    return ReduceObserver;\n  }(AbstractObserver));\n\n  /**\n  * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n  * For aggregation behavior with incremental intermediate results, see Observable.scan.\n  * @param {Function} accumulator An accumulator function to be invoked on each element.\n  * @param {Any} [seed] The initial accumulator value.\n  * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n  */\n  observableProto.reduce = function () {\n    var hasSeed = false, seed, accumulator = arguments[0];\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new ReduceObservable(this, accumulator, hasSeed, seed);\n  };\n\n  var SomeObservable = (function (__super__) {\n    inherits(SomeObservable, __super__);\n    function SomeObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SomeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SomeObserver(o, this._fn, this.source));\n    };\n\n    return SomeObservable;\n  }(ObservableBase));\n\n  var SomeObserver = (function (__super__) {\n    inherits(SomeObserver, __super__);\n\n    function SomeObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    SomeObserver.prototype.next = function (x) {\n      var result = tryCatch(this._fn)(x, this._i++, this._s);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      if (Boolean(result)) {\n        this._o.onNext(true);\n        this._o.onCompleted();\n      }\n    };\n    SomeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SomeObserver.prototype.completed = function () {\n      this._o.onNext(false);\n      this._o.onCompleted();\n    };\n\n    return SomeObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether any element of an observable sequence satisfies a condition if present, else if any items are in the sequence.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @returns {Observable} An observable sequence containing a single element determining whether any elements in the source sequence pass the test in the specified predicate if given, else if any items are in the sequence.\n   */\n  observableProto.some = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new SomeObservable(this, fn);\n  };\n\n  var IsEmptyObservable = (function (__super__) {\n    inherits(IsEmptyObservable, __super__);\n    function IsEmptyObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    IsEmptyObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new IsEmptyObserver(o));\n    };\n\n    return IsEmptyObservable;\n  }(ObservableBase));\n\n  var IsEmptyObserver = (function(__super__) {\n    inherits(IsEmptyObserver, __super__);\n    function IsEmptyObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    IsEmptyObserver.prototype.next = function () {\n      this._o.onNext(false);\n      this._o.onCompleted();\n    };\n    IsEmptyObserver.prototype.error = function (e) { this._o.onError(e); };\n    IsEmptyObserver.prototype.completed = function () {\n      this._o.onNext(true);\n      this._o.onCompleted();\n    };\n\n    return IsEmptyObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether an observable sequence is empty.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence is empty.\n   */\n  observableProto.isEmpty = function () {\n    return new IsEmptyObservable(this);\n  };\n\n  var EveryObservable = (function (__super__) {\n    inherits(EveryObservable, __super__);\n    function EveryObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    EveryObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new EveryObserver(o, this._fn, this.source));\n    };\n\n    return EveryObservable;\n  }(ObservableBase));\n\n  var EveryObserver = (function (__super__) {\n    inherits(EveryObserver, __super__);\n\n    function EveryObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    EveryObserver.prototype.next = function (x) {\n      var result = tryCatch(this._fn)(x, this._i++, this._s);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      if (!Boolean(result)) {\n        this._o.onNext(false);\n        this._o.onCompleted();\n      }\n    };\n    EveryObserver.prototype.error = function (e) { this._o.onError(e); };\n    EveryObserver.prototype.completed = function () {\n      this._o.onNext(true);\n      this._o.onCompleted();\n    };\n\n    return EveryObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether all elements of an observable sequence satisfy a condition.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element determining whether all elements in the source sequence pass the test in the specified predicate.\n   */\n  observableProto.every = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new EveryObservable(this, fn);\n  };\n\n  var IncludesObservable = (function (__super__) {\n    inherits(IncludesObservable, __super__);\n    function IncludesObservable(source, elem, idx) {\n      var n = +idx || 0;\n      Math.abs(n) === Infinity && (n = 0);\n\n      this.source = source;\n      this._elem = elem;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    IncludesObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(false);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new IncludesObserver(o, this._elem, this._n));\n    };\n\n    return IncludesObservable;\n  }(ObservableBase));\n\n  var IncludesObserver = (function (__super__) {\n    inherits(IncludesObserver, __super__);\n    function IncludesObserver(o, elem, n) {\n      this._o = o;\n      this._elem = elem;\n      this._n = n;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    function comparer(a, b) {\n      return (a === 0 && b === 0) || (a === b || (isNaN(a) && isNaN(b)));\n    }\n\n    IncludesObserver.prototype.next = function (x) {\n      if (this._i++ >= this._n && comparer(x, this._elem)) {\n        this._o.onNext(true);\n        this._o.onCompleted();\n      }\n    };\n    IncludesObserver.prototype.error = function (e) { this._o.onError(e); };\n    IncludesObserver.prototype.completed = function () { this._o.onNext(false); this._o.onCompleted(); };\n\n    return IncludesObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether an observable sequence includes a specified element with an optional equality comparer.\n   * @param searchElement The value to locate in the source sequence.\n   * @param {Number} [fromIndex] An equality comparer to compare elements.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence includes an element that has the specified value from the given index.\n   */\n  observableProto.includes = function (searchElement, fromIndex) {\n    return new IncludesObservable(this, searchElement, fromIndex);\n  };\n\n  var CountObservable = (function (__super__) {\n    inherits(CountObservable, __super__);\n    function CountObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CountObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new CountObserver(o, this._fn, this.source));\n    };\n\n    return CountObservable;\n  }(ObservableBase));\n\n  var CountObserver = (function (__super__) {\n    inherits(CountObserver, __super__);\n\n    function CountObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      this._c = 0;\n      __super__.call(this);\n    }\n\n    CountObserver.prototype.next = function (x) {\n      if (this._fn) {\n        var result = tryCatch(this._fn)(x, this._i++, this._s);\n        if (result === errorObj) { return this._o.onError(result.e); }\n        Boolean(result) && (this._c++);\n      } else {\n        this._c++;\n      }\n    };\n    CountObserver.prototype.error = function (e) { this._o.onError(e); };\n    CountObserver.prototype.completed = function () {\n      this._o.onNext(this._c);\n      this._o.onCompleted();\n    };\n\n    return CountObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns an observable sequence containing a value that represents how many elements in the specified observable sequence satisfy a condition if provided, else the count of items.\n   * @example\n   * res = source.count();\n   * res = source.count(function (x) { return x > 3; });\n   * @param {Function} [predicate]A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with a number that represents how many elements in the input sequence satisfy the condition in the predicate function if provided, else the count of items in the sequence.\n   */\n  observableProto.count = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new CountObservable(this, fn);\n  };\n\n  var IndexOfObservable = (function (__super__) {\n    inherits(IndexOfObservable, __super__);\n    function IndexOfObservable(source, e, n) {\n      this.source = source;\n      this._e = e;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    IndexOfObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(-1);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new IndexOfObserver(o, this._e, this._n));\n    };\n\n    return IndexOfObservable;\n  }(ObservableBase));\n\n  var IndexOfObserver = (function (__super__) {\n    inherits(IndexOfObserver, __super__);\n    function IndexOfObserver(o, e, n) {\n      this._o = o;\n      this._e = e;\n      this._n = n;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    IndexOfObserver.prototype.next = function (x) {\n      if (this._i >= this._n && x === this._e) {\n        this._o.onNext(this._i);\n        this._o.onCompleted();\n      }\n      this._i++;\n    };\n    IndexOfObserver.prototype.error = function (e) { this._o.onError(e); };\n    IndexOfObserver.prototype.completed = function () { this._o.onNext(-1); this._o.onCompleted(); };\n\n    return IndexOfObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   * @param {Any} searchElement Element to locate in the array.\n   * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n   * @returns {Observable} And observable sequence containing the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   */\n  observableProto.indexOf = function(searchElement, fromIndex) {\n    var n = +fromIndex || 0;\n    Math.abs(n) === Infinity && (n = 0);\n    return new IndexOfObservable(this, searchElement, n);\n  };\n\n  var SumObservable = (function (__super__) {\n    inherits(SumObservable, __super__);\n    function SumObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SumObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SumObserver(o, this._fn, this.source));\n    };\n\n    return SumObservable;\n  }(ObservableBase));\n\n  var SumObserver = (function (__super__) {\n    inherits(SumObserver, __super__);\n\n    function SumObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      this._c = 0;\n      __super__.call(this);\n    }\n\n    SumObserver.prototype.next = function (x) {\n      if (this._fn) {\n        var result = tryCatch(this._fn)(x, this._i++, this._s);\n        if (result === errorObj) { return this._o.onError(result.e); }\n        this._c += result;\n      } else {\n        this._c += x;\n      }\n    };\n    SumObserver.prototype.error = function (e) { this._o.onError(e); };\n    SumObserver.prototype.completed = function () {\n      this._o.onNext(this._c);\n      this._o.onCompleted();\n    };\n\n    return SumObserver;\n  }(AbstractObserver));\n\n  /**\n   * Computes the sum of a sequence of values that are obtained by invoking an optional transform function on each element of the input sequence, else if not specified computes the sum on each item in the sequence.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the sum of the values in the source sequence.\n   */\n  observableProto.sum = function (keySelector, thisArg) {\n    var fn = bindCallback(keySelector, thisArg, 3);\n    return new SumObservable(this, fn);\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n   * @example\n   * var res = source.minBy(function (x) { return x.value; });\n   * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer] Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n   */\n  observableProto.minBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return new ExtremaByObservable(this, keySelector, function (x, y) { return comparer(x, y) * -1; });\n  };\n\n  /**\n   * Returns the minimum element in an observable sequence according to the optional comparer else a default greater than less than check.\n   * @example\n   * var res = source.min();\n   * var res = source.min(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the minimum element in the source sequence.\n   */\n  observableProto.min = function (comparer) {\n    return this.minBy(identity, comparer).map(firstOnly);\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n   * @example\n   * var res = source.maxBy(function (x) { return x.value; });\n   * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer]  Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n   */\n  observableProto.maxBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return new ExtremaByObservable(this, keySelector, comparer);\n  };\n\n  /**\n   * Returns the maximum value in an observable sequence according to the specified comparer.\n   * @example\n   * var res = source.max();\n   * var res = source.max(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the maximum element in the source sequence.\n   */\n  observableProto.max = function (comparer) {\n    return this.maxBy(identity, comparer).map(firstOnly);\n  };\n\n  var AverageObservable = (function (__super__) {\n    inherits(AverageObservable, __super__);\n    function AverageObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    AverageObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new AverageObserver(o, this._fn, this.source));\n    };\n\n    return AverageObservable;\n  }(ObservableBase));\n\n  var AverageObserver = (function(__super__) {\n    inherits(AverageObserver, __super__);\n    function AverageObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._c = 0;\n      this._t = 0;\n      __super__.call(this);\n    }\n\n    AverageObserver.prototype.next = function (x) {\n      if(this._fn) {\n        var r = tryCatch(this._fn)(x, this._c++, this._s);\n        if (r === errorObj) { return this._o.onError(r.e); }\n        this._t += r;\n      } else {\n        this._c++;\n        this._t += x;\n      }\n    };\n    AverageObserver.prototype.error = function (e) { this._o.onError(e); };\n    AverageObserver.prototype.completed = function () {\n      if (this._c === 0) { return this._o.onError(new EmptyError()); }\n      this._o.onNext(this._t / this._c);\n      this._o.onCompleted();\n    };\n\n    return AverageObserver;\n  }(AbstractObserver));\n\n  /**\n   * Computes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the average of the sequence of values.\n   */\n  observableProto.average = function (keySelector, thisArg) {\n    var source = this, fn;\n    if (isFunction(keySelector)) {\n      fn = bindCallback(keySelector, thisArg, 3);\n    }\n    return new AverageObservable(source, fn);\n  };\n\n  /**\n   *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n   *\n   * @example\n   * var res = res = source.sequenceEqual([1,2,3]);\n   * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n   * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n   * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n   * @param {Observable} second Second observable sequence or array to compare.\n   * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n   * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n   */\n  observableProto.sequenceEqual = function (second, comparer) {\n    var first = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var donel = false, doner = false, ql = [], qr = [];\n      var subscription1 = first.subscribe(function (x) {\n        if (qr.length > 0) {\n          var v = qr.shift();\n          var equal = tryCatch(comparer)(v, x);\n          if (equal === errorObj) { return o.onError(equal.e); }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (doner) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          ql.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        donel = true;\n        if (ql.length === 0) {\n          if (qr.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (doner) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n\n      (isArrayLike(second) || isIterable(second)) && (second = observableFrom(second));\n      isPromise(second) && (second = observableFromPromise(second));\n      var subscription2 = second.subscribe(function (x) {\n        if (ql.length > 0) {\n          var v = ql.shift();\n          var equal = tryCatch(comparer)(v, x);\n          if (equal === errorObj) { return o.onError(equal.e); }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (donel) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          qr.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        doner = true;\n        if (qr.length === 0) {\n          if (ql.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (donel) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n      return new BinaryDisposable(subscription1, subscription2);\n    }, first);\n  };\n\n  var ElementAtObservable = (function (__super__) {\n    inherits(ElementAtObservable, __super__);\n    function ElementAtObservable(source, i, d) {\n      this.source = source;\n      this._i = i;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    ElementAtObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ElementAtObserver(o, this._i, this._d));\n    };\n\n    return ElementAtObservable;\n  }(ObservableBase));\n\n  var ElementAtObserver = (function (__super__) {\n    inherits(ElementAtObserver, __super__);\n\n    function ElementAtObserver(o, i, d) {\n      this._o = o;\n      this._i = i;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    ElementAtObserver.prototype.next = function (x) {\n      if (this._i-- === 0) {\n        this._o.onNext(x);\n        this._o.onCompleted();\n      }\n    };\n    ElementAtObserver.prototype.error = function (e) { this._o.onError(e); };\n    ElementAtObserver.prototype.completed = function () {\n      if (this._d === undefined) {\n        this._o.onError(new ArgumentOutOfRangeError());\n      } else {\n        this._o.onNext(this._d);\n        this._o.onCompleted();\n      }\n    };\n\n    return ElementAtObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the element at a specified index in a sequence or default value if not found.\n   * @param {Number} index The zero-based index of the element to retrieve.\n   * @param {Any} [defaultValue] The default value to use if elementAt does not find a value.\n   * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence.\n   */\n  observableProto.elementAt =  function (index, defaultValue) {\n    if (index < 0) { throw new ArgumentOutOfRangeError(); }\n    return new ElementAtObservable(this, index, defaultValue);\n  };\n\n  var SingleObserver = (function(__super__) {\n    inherits(SingleObserver, __super__);\n    function SingleObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      this._hv = false;\n      this._v = null;\n      __super__.call(this);\n    }\n\n    SingleObserver.prototype.next = function (x) {\n      var shouldYield = false;\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        Boolean(res) && (shouldYield = true);\n      } else if (!this._obj.predicate) {\n        shouldYield = true;\n      }\n      if (shouldYield) {\n        if (this._hv) {\n          return this._o.onError(new Error('Sequence contains more than one matching element'));\n        }\n        this._hv = true;\n        this._v = x;\n      }\n    };\n    SingleObserver.prototype.error = function (e) { this._o.onError(e); };\n    SingleObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n        this._o.onCompleted();\n      }\n      else if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return SingleObserver;\n  }(AbstractObserver));\n\n\n    /**\n     * Returns the only element of an observable sequence that satisfies the condition in the optional predicate, and reports an exception if there is not exactly one element in the observable sequence.\n     * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate.\n     */\n    observableProto.single = function (predicate, thisArg) {\n      var obj = {}, source = this;\n      if (typeof arguments[0] === 'object') {\n        obj = arguments[0];\n      } else {\n        obj = {\n          predicate: arguments[0],\n          thisArg: arguments[1],\n          defaultValue: arguments[2]\n        };\n      }\n      if (isFunction (obj.predicate)) {\n        var fn = obj.predicate;\n        obj.predicate = bindCallback(fn, obj.thisArg, 3);\n      }\n      return new AnonymousObservable(function (o) {\n        return source.subscribe(new SingleObserver(o, obj, source));\n      }, source);\n    };\n\n  var FirstObservable = (function (__super__) {\n    inherits(FirstObservable, __super__);\n    function FirstObservable(source, obj) {\n      this.source = source;\n      this._obj = obj;\n      __super__.call(this);\n    }\n\n    FirstObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new FirstObserver(o, this._obj, this.source));\n    };\n\n    return FirstObservable;\n  }(ObservableBase));\n\n  var FirstObserver = (function(__super__) {\n    inherits(FirstObserver, __super__);\n    function FirstObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    FirstObserver.prototype.next = function (x) {\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        if (Boolean(res)) {\n          this._o.onNext(x);\n          this._o.onCompleted();\n        }\n      } else if (!this._obj.predicate) {\n        this._o.onNext(x);\n        this._o.onCompleted();\n      }\n    };\n    FirstObserver.prototype.error = function (e) { this._o.onError(e); };\n    FirstObserver.prototype.completed = function () {\n      if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return FirstObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the first element of an observable sequence that satisfies the condition in the predicate if present else the first item in the sequence.\n   * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate if provided, else the first item in the sequence.\n   */\n  observableProto.first = function () {\n    var obj = {}, source = this;\n    if (typeof arguments[0] === 'object') {\n      obj = arguments[0];\n    } else {\n      obj = {\n        predicate: arguments[0],\n        thisArg: arguments[1],\n        defaultValue: arguments[2]\n      };\n    }\n    if (isFunction (obj.predicate)) {\n      var fn = obj.predicate;\n      obj.predicate = bindCallback(fn, obj.thisArg, 3);\n    }\n    return new FirstObservable(this, obj);\n  };\n\n  var LastObservable = (function (__super__) {\n    inherits(LastObservable, __super__);\n    function LastObservable(source, obj) {\n      this.source = source;\n      this._obj = obj;\n      __super__.call(this);\n    }\n\n    LastObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new LastObserver(o, this._obj, this.source));\n    };\n\n    return LastObservable;\n  }(ObservableBase));\n\n  var LastObserver = (function(__super__) {\n    inherits(LastObserver, __super__);\n    function LastObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      this._hv = false;\n      this._v = null;\n      __super__.call(this);\n    }\n\n    LastObserver.prototype.next = function (x) {\n      var shouldYield = false;\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        Boolean(res) && (shouldYield = true);\n      } else if (!this._obj.predicate) {\n        shouldYield = true;\n      }\n      if (shouldYield) {\n        this._hv = true;\n        this._v = x;\n      }\n    };\n    LastObserver.prototype.error = function (e) { this._o.onError(e); };\n    LastObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n        this._o.onCompleted();\n      }\n      else if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return LastObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the last element of an observable sequence that satisfies the condition in the predicate if specified, else the last element.\n   * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate.\n   */\n  observableProto.last = function () {\n    var obj = {}, source = this;\n    if (typeof arguments[0] === 'object') {\n      obj = arguments[0];\n    } else {\n      obj = {\n        predicate: arguments[0],\n        thisArg: arguments[1],\n        defaultValue: arguments[2]\n      };\n    }\n    if (isFunction (obj.predicate)) {\n      var fn = obj.predicate;\n      obj.predicate = bindCallback(fn, obj.thisArg, 3);\n    }\n    return new LastObservable(this, obj);\n  };\n\n  var FindValueObserver = (function(__super__) {\n    inherits(FindValueObserver, __super__);\n    function FindValueObserver(observer, source, callback, yieldIndex) {\n      this._o = observer;\n      this._s = source;\n      this._cb = callback;\n      this._y = yieldIndex;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    FindValueObserver.prototype.next = function (x) {\n      var shouldRun = tryCatch(this._cb)(x, this._i, this._s);\n      if (shouldRun === errorObj) { return this._o.onError(shouldRun.e); }\n      if (shouldRun) {\n        this._o.onNext(this._y ? this._i : x);\n        this._o.onCompleted();\n      } else {\n        this._i++;\n      }\n    };\n\n    FindValueObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    FindValueObserver.prototype.completed = function () {\n      this._y && this._o.onNext(-1);\n      this._o.onCompleted();\n    };\n\n    return FindValueObserver;\n  }(AbstractObserver));\n\n  function findValue (source, predicate, thisArg, yieldIndex) {\n    var callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new FindValueObserver(o, source, callback, yieldIndex));\n    }, source);\n  }\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the first element that matches the conditions defined by the specified predicate, if found; otherwise, undefined.\n   */\n  observableProto.find = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, false);\n  };\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns\n   * an Observable sequence with the zero-based index of the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the zero-based index of the first occurrence of an element that matches the conditions defined by match, if found; otherwise, –1.\n  */\n  observableProto.findIndex = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, true);\n  };\n\n  var ToSetObservable = (function (__super__) {\n    inherits(ToSetObservable, __super__);\n    function ToSetObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    ToSetObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ToSetObserver(o));\n    };\n\n    return ToSetObservable;\n  }(ObservableBase));\n\n  var ToSetObserver = (function (__super__) {\n    inherits(ToSetObserver, __super__);\n    function ToSetObserver(o) {\n      this._o = o;\n      this._s = new root.Set();\n      __super__.call(this);\n    }\n\n    ToSetObserver.prototype.next = function (x) {\n      this._s.add(x);\n    };\n\n    ToSetObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ToSetObserver.prototype.completed = function () {\n      this._o.onNext(this._s);\n      this._o.onCompleted();\n    };\n\n    return ToSetObserver;\n  }(AbstractObserver));\n\n  /**\n   * Converts the observable sequence to a Set if it exists.\n   * @returns {Observable} An observable sequence with a single value of a Set containing the values from the observable sequence.\n   */\n  observableProto.toSet = function () {\n    if (typeof root.Set === 'undefined') { throw new TypeError(); }\n    return new ToSetObservable(this);\n  };\n\n  var ToMapObservable = (function (__super__) {\n    inherits(ToMapObservable, __super__);\n    function ToMapObservable(source, k, e) {\n      this.source = source;\n      this._k = k;\n      this._e = e;\n      __super__.call(this);\n    }\n\n    ToMapObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ToMapObserver(o, this._k, this._e));\n    };\n\n    return ToMapObservable;\n  }(ObservableBase));\n\n  var ToMapObserver = (function (__super__) {\n    inherits(ToMapObserver, __super__);\n    function ToMapObserver(o, k, e) {\n      this._o = o;\n      this._k = k;\n      this._e = e;\n      this._m = new root.Map();\n      __super__.call(this);\n    }\n\n    ToMapObserver.prototype.next = function (x) {\n      var key = tryCatch(this._k)(x);\n      if (key === errorObj) { return this._o.onError(key.e); }\n      var elem = x;\n      if (this._e) {\n        elem = tryCatch(this._e)(x);\n        if (elem === errorObj) { return this._o.onError(elem.e); }\n      }\n\n      this._m.set(key, elem);\n    };\n\n    ToMapObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ToMapObserver.prototype.completed = function () {\n      this._o.onNext(this._m);\n      this._o.onCompleted();\n    };\n\n    return ToMapObserver;\n  }(AbstractObserver));\n\n  /**\n  * Converts the observable sequence to a Map if it exists.\n  * @param {Function} keySelector A function which produces the key for the Map.\n  * @param {Function} [elementSelector] An optional function which produces the element for the Map. If not present, defaults to the value from the observable sequence.\n  * @returns {Observable} An observable sequence with a single value of a Map containing the values from the observable sequence.\n  */\n  observableProto.toMap = function (keySelector, elementSelector) {\n    if (typeof root.Map === 'undefined') { throw new TypeError(); }\n    return new ToMapObservable(this, keySelector, elementSelector);\n  };\n\n  var SliceObservable = (function (__super__) {\n    inherits(SliceObservable, __super__);\n    function SliceObservable(source, b, e) {\n      this.source = source;\n      this._b = b;\n      this._e = e;\n      __super__.call(this);\n    }\n\n    SliceObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SliceObserver(o, this._b, this._e));\n    };\n\n    return SliceObservable;\n  }(ObservableBase));\n\n  var SliceObserver = (function (__super__) {\n    inherits(SliceObserver, __super__);\n\n    function SliceObserver(o, b, e) {\n      this._o = o;\n      this._b = b;\n      this._e = e;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    SliceObserver.prototype.next = function (x) {\n      if (this._i >= this._b) {\n        if (this._e === this._i) {\n          this._o.onCompleted();\n        } else {\n          this._o.onNext(x);\n        }\n      }\n      this._i++;\n    };\n    SliceObserver.prototype.error = function (e) { this._o.onError(e); };\n    SliceObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SliceObserver;\n  }(AbstractObserver));\n\n  /*\n  * The slice() method returns a shallow copy of a portion of an Observable into a new Observable object.\n  * Unlike the array version, this does not support negative numbers for being or end.\n  * @param {Number} [begin] Zero-based index at which to begin extraction. If omitted, this will default to zero.\n  * @param {Number} [end] Zero-based index at which to end extraction. slice extracts up to but not including end.\n  * If omitted, this will emit the rest of the Observable object.\n  * @returns {Observable} A shallow copy of a portion of an Observable into a new Observable object.\n  */\n  observableProto.slice = function (begin, end) {\n    var start = begin || 0;\n    if (start < 0) { throw new Rx.ArgumentOutOfRangeError(); }\n    if (typeof end === 'number' && end < start) {\n      throw new Rx.ArgumentOutOfRangeError();\n    }\n    return new SliceObservable(this, start, end);\n  };\n\n  var LastIndexOfObservable = (function (__super__) {\n    inherits(LastIndexOfObservable, __super__);\n    function LastIndexOfObservable(source, e, n) {\n      this.source = source;\n      this._e = e;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    LastIndexOfObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(-1);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new LastIndexOfObserver(o, this._e, this._n));\n    };\n\n    return LastIndexOfObservable;\n  }(ObservableBase));\n\n  var LastIndexOfObserver = (function (__super__) {\n    inherits(LastIndexOfObserver, __super__);\n    function LastIndexOfObserver(o, e, n) {\n      this._o = o;\n      this._e = e;\n      this._n = n;\n      this._v = 0;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    LastIndexOfObserver.prototype.next = function (x) {\n      if (this._i >= this._n && x === this._e) {\n        this._hv = true;\n        this._v = this._i;\n      }\n      this._i++;\n    };\n    LastIndexOfObserver.prototype.error = function (e) { this._o.onError(e); };\n    LastIndexOfObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n      } else {\n        this._o.onNext(-1);\n      }\n      this._o.onCompleted();\n    };\n\n    return LastIndexOfObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the last index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   * @param {Any} searchElement Element to locate in the array.\n   * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n   * @returns {Observable} And observable sequence containing the last index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   */\n  observableProto.lastIndexOf = function(searchElement, fromIndex) {\n    var n = +fromIndex || 0;\n    Math.abs(n) === Infinity && (n = 0);\n    return new LastIndexOfObservable(this, searchElement, n);\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite-aggregates-compat/package.json",
    "content": "{\n  \"name\": \"rx-lite-aggregates-compat\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Aggregates\",\n  \"description\": \"Lightweight older browser compatible library with aggregate functions for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.aggregates.compat.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.aggregates.compat.js\"\n  },\n  \"dependencies\": {\n    \"rx-lite-compat\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.aggregates.compat.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-aggregates-compat/readme.md",
    "content": "# RxJS Aggregates Compat Module #\n\nThe Reactive Extensions for JavaScript has a number of aggregation operators including those you might already know from the Array#extras and the upcoming ES6 standard such as `reduce`, `find` and `findIndex`.  This module is used exclusively for aggregation operations used on finite observable sequences.  In addition to the aforementioned operators, there are many useful operators such as `count`, `sum`, `average` and determining whether two sequences are equal via the `sequenceEqual` method.  This requires `rx.lite.compat.js` from the [`rx-lite-compat`](https://www.npmjs.com/package/rx-lite) NPM module.  This module has support for older browsers which do not support ES5 functionality, hence the name `compat`.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-aggregates-compat\n$ npm install -g rx-lite-aggregates-compat\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-aggregates-compat');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.compat.js\"></script>\n<script src=\"path/to/rx.lite.aggregates.compat.js\"></script>\n```\n\n## Included Observable Operators ##\n\n### `Observable Instance Methods`\n- [`aggregate`](../../doc/api/core/operators/reduce.md)\n- [`all`](../../doc/api/core/operators/every.md)\n- [`any`](../../doc/api/core/operators/some.md)\n- [`average`](../../doc/api/core/operators/average.md)\n- [`includes`](../../doc/api/core/operators/includes.md)\n- [`count`](../../doc/api/core/operators/count.md)\n- [`elementAt`](../../doc/api/core/operators/elementat.md)\n- [`elementAtOrDefault`](../../doc/api/core/operators/elementatordefault.md)\n- [`every`](../../doc/api/core/operators/every.md)\n- [`find`](../../doc/api/core/operators/find.md)\n- [`findIndex`](../../doc/api/core/operators/findindex.md)\n- [`first`](../../doc/api/core/operators/first.md)\n- [`firstOrDefault`](../../doc/api/core/operators/firstordefault.md)\n- [`indexOf`](../../doc/api/core/operators/indexof.md)\n- [`isEmpty`](../../doc/api/core/operators/isempty.md)\n- [`last`](../../doc/api/core/operators/last.md)\n- [`lastOrDefault`](../../doc/api/core/operators/lastordefault.md)\n- [`max`](../../doc/api/core/operators/max.md)\n- [`maxBy`](../../doc/api/core/operators/maxby.md)\n- [`min`](../../doc/api/core/operators/min.md)\n- [`minBy`](../../doc/api/core/operators/minby.md)\n- [`reduce`](../../doc/api/core/operators/reduce.md)\n- [`sequenceEqual`](../../doc/api/core/operators/sequenceequal.md)\n- [`single`](../../doc/api/core/operators/single.md)\n- [`singleOrDefault`](../../doc/api/core/operators/singleordefault.md)\n- [`some`](../../doc/api/core/operators/some.md)\n- [`sum`](../../doc/api/core/operators/sum.md)\n- [`toMap`](../../doc/api/core/operators/tomap.md)\n- [`toSet`](../../doc/api/core/operators/toset.md)\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-aggregates-compat/rx.lite.aggregates.compat.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite.compat'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite-compat'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // References\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    BinaryDisposable = Rx.BinaryDisposable,\n    AnonymousObservable = Rx.AnonymousObservable,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    disposableEmpty = Rx.Disposable.empty,\n    helpers = Rx.helpers,\n    defaultComparer = helpers.defaultComparer,\n    identity = helpers.identity,\n    defaultSubComparer = helpers.defaultSubComparer,\n    isFunction = helpers.isFunction,\n    isPromise = helpers.isPromise,\n    isArrayLike = helpers.isArrayLike,\n    isIterable = helpers.isIterable,\n    inherits = Rx.internals.inherits,\n    observableFromPromise = Observable.fromPromise,\n    observableFrom = Observable.from,\n    bindCallback = Rx.internals.bindCallback,\n    EmptyError = Rx.EmptyError,\n    ObservableBase = Rx.ObservableBase,\n    ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  var ExtremaByObservable = (function (__super__) {\n    inherits(ExtremaByObservable, __super__);\n    function ExtremaByObservable(source, k, c) {\n      this.source = source;\n      this._k = k;\n      this._c = c;\n      __super__.call(this);\n    }\n\n    ExtremaByObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ExtremaByObserver(o, this._k, this._c));\n    };\n\n    return ExtremaByObservable;\n  }(ObservableBase));\n\n  var ExtremaByObserver = (function (__super__) {\n    inherits(ExtremaByObserver, __super__);\n    function ExtremaByObserver(o, k, c) {\n      this._o = o;\n      this._k = k;\n      this._c = c;\n      this._v = null;\n      this._hv = false;\n      this._l = [];\n      __super__.call(this);\n    }\n\n    ExtremaByObserver.prototype.next = function (x) {\n      var key = tryCatch(this._k)(x);\n      if (key === errorObj) { return this._o.onError(key.e); }\n      var comparison = 0;\n      if (!this._hv) {\n        this._hv = true;\n        this._v = key;\n      } else {\n        comparison = tryCatch(this._c)(key, this._v);\n        if (comparison === errorObj) { return this._o.onError(comparison.e); }\n      }\n      if (comparison > 0) {\n        this._v = key;\n        this._l = [];\n      }\n      if (comparison >= 0) { this._l.push(x); }\n    };\n\n    ExtremaByObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ExtremaByObserver.prototype.completed = function () {\n      this._o.onNext(this._l);\n      this._o.onCompleted();\n    };\n\n    return ExtremaByObserver;\n  }(AbstractObserver));\n\n  function firstOnly(x) {\n    if (x.length === 0) { throw new EmptyError(); }\n    return x[0];\n  }\n\n  var ReduceObservable = (function(__super__) {\n    inherits(ReduceObservable, __super__);\n    function ReduceObservable(source, accumulator, hasSeed, seed) {\n      this.source = source;\n      this.accumulator = accumulator;\n      this.hasSeed = hasSeed;\n      this.seed = seed;\n      __super__.call(this);\n    }\n\n    ReduceObservable.prototype.subscribeCore = function(observer) {\n      return this.source.subscribe(new ReduceObserver(observer,this));\n    };\n\n    return ReduceObservable;\n  }(ObservableBase));\n\n  var ReduceObserver = (function (__super__) {\n    inherits(ReduceObserver, __super__);\n    function ReduceObserver(o, parent) {\n      this._o = o;\n      this._p = parent;\n      this._fn = parent.accumulator;\n      this._hs = parent.hasSeed;\n      this._s = parent.seed;\n      this._ha = false;\n      this._a = null;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    ReduceObserver.prototype.next = function (x) {\n      !this._hv && (this._hv = true);\n      if (this._ha) {\n        this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n      } else {\n        this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n        this._ha = true;\n      }\n      if (this._a === errorObj) { return this._o.onError(this._a.e); }\n      this._i++;\n    };\n\n    ReduceObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ReduceObserver.prototype.completed = function () {\n      this._hv && this._o.onNext(this._a);\n      !this._hv && this._hs && this._o.onNext(this._s);\n      !this._hv && !this._hs && this._o.onError(new EmptyError());\n      this._o.onCompleted();\n    };\n\n    return ReduceObserver;\n  }(AbstractObserver));\n\n  /**\n  * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n  * For aggregation behavior with incremental intermediate results, see Observable.scan.\n  * @param {Function} accumulator An accumulator function to be invoked on each element.\n  * @param {Any} [seed] The initial accumulator value.\n  * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n  */\n  observableProto.reduce = function () {\n    var hasSeed = false, seed, accumulator = arguments[0];\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new ReduceObservable(this, accumulator, hasSeed, seed);\n  };\n\n  var SomeObservable = (function (__super__) {\n    inherits(SomeObservable, __super__);\n    function SomeObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SomeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SomeObserver(o, this._fn, this.source));\n    };\n\n    return SomeObservable;\n  }(ObservableBase));\n\n  var SomeObserver = (function (__super__) {\n    inherits(SomeObserver, __super__);\n\n    function SomeObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    SomeObserver.prototype.next = function (x) {\n      var result = tryCatch(this._fn)(x, this._i++, this._s);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      if (Boolean(result)) {\n        this._o.onNext(true);\n        this._o.onCompleted();\n      }\n    };\n    SomeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SomeObserver.prototype.completed = function () {\n      this._o.onNext(false);\n      this._o.onCompleted();\n    };\n\n    return SomeObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether any element of an observable sequence satisfies a condition if present, else if any items are in the sequence.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @returns {Observable} An observable sequence containing a single element determining whether any elements in the source sequence pass the test in the specified predicate if given, else if any items are in the sequence.\n   */\n  observableProto.some = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new SomeObservable(this, fn);\n  };\n\n  var IsEmptyObservable = (function (__super__) {\n    inherits(IsEmptyObservable, __super__);\n    function IsEmptyObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    IsEmptyObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new IsEmptyObserver(o));\n    };\n\n    return IsEmptyObservable;\n  }(ObservableBase));\n\n  var IsEmptyObserver = (function(__super__) {\n    inherits(IsEmptyObserver, __super__);\n    function IsEmptyObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    IsEmptyObserver.prototype.next = function () {\n      this._o.onNext(false);\n      this._o.onCompleted();\n    };\n    IsEmptyObserver.prototype.error = function (e) { this._o.onError(e); };\n    IsEmptyObserver.prototype.completed = function () {\n      this._o.onNext(true);\n      this._o.onCompleted();\n    };\n\n    return IsEmptyObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether an observable sequence is empty.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence is empty.\n   */\n  observableProto.isEmpty = function () {\n    return new IsEmptyObservable(this);\n  };\n\n  var EveryObservable = (function (__super__) {\n    inherits(EveryObservable, __super__);\n    function EveryObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    EveryObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new EveryObserver(o, this._fn, this.source));\n    };\n\n    return EveryObservable;\n  }(ObservableBase));\n\n  var EveryObserver = (function (__super__) {\n    inherits(EveryObserver, __super__);\n\n    function EveryObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    EveryObserver.prototype.next = function (x) {\n      var result = tryCatch(this._fn)(x, this._i++, this._s);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      if (!Boolean(result)) {\n        this._o.onNext(false);\n        this._o.onCompleted();\n      }\n    };\n    EveryObserver.prototype.error = function (e) { this._o.onError(e); };\n    EveryObserver.prototype.completed = function () {\n      this._o.onNext(true);\n      this._o.onCompleted();\n    };\n\n    return EveryObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether all elements of an observable sequence satisfy a condition.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element determining whether all elements in the source sequence pass the test in the specified predicate.\n   */\n  observableProto.every = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new EveryObservable(this, fn);\n  };\n\n  var IncludesObservable = (function (__super__) {\n    inherits(IncludesObservable, __super__);\n    function IncludesObservable(source, elem, idx) {\n      var n = +idx || 0;\n      Math.abs(n) === Infinity && (n = 0);\n\n      this.source = source;\n      this._elem = elem;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    IncludesObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(false);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new IncludesObserver(o, this._elem, this._n));\n    };\n\n    return IncludesObservable;\n  }(ObservableBase));\n\n  var IncludesObserver = (function (__super__) {\n    inherits(IncludesObserver, __super__);\n    function IncludesObserver(o, elem, n) {\n      this._o = o;\n      this._elem = elem;\n      this._n = n;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    function comparer(a, b) {\n      return (a === 0 && b === 0) || (a === b || (isNaN(a) && isNaN(b)));\n    }\n\n    IncludesObserver.prototype.next = function (x) {\n      if (this._i++ >= this._n && comparer(x, this._elem)) {\n        this._o.onNext(true);\n        this._o.onCompleted();\n      }\n    };\n    IncludesObserver.prototype.error = function (e) { this._o.onError(e); };\n    IncludesObserver.prototype.completed = function () { this._o.onNext(false); this._o.onCompleted(); };\n\n    return IncludesObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether an observable sequence includes a specified element with an optional equality comparer.\n   * @param searchElement The value to locate in the source sequence.\n   * @param {Number} [fromIndex] An equality comparer to compare elements.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence includes an element that has the specified value from the given index.\n   */\n  observableProto.includes = function (searchElement, fromIndex) {\n    return new IncludesObservable(this, searchElement, fromIndex);\n  };\n\n  var CountObservable = (function (__super__) {\n    inherits(CountObservable, __super__);\n    function CountObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CountObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new CountObserver(o, this._fn, this.source));\n    };\n\n    return CountObservable;\n  }(ObservableBase));\n\n  var CountObserver = (function (__super__) {\n    inherits(CountObserver, __super__);\n\n    function CountObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      this._c = 0;\n      __super__.call(this);\n    }\n\n    CountObserver.prototype.next = function (x) {\n      if (this._fn) {\n        var result = tryCatch(this._fn)(x, this._i++, this._s);\n        if (result === errorObj) { return this._o.onError(result.e); }\n        Boolean(result) && (this._c++);\n      } else {\n        this._c++;\n      }\n    };\n    CountObserver.prototype.error = function (e) { this._o.onError(e); };\n    CountObserver.prototype.completed = function () {\n      this._o.onNext(this._c);\n      this._o.onCompleted();\n    };\n\n    return CountObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns an observable sequence containing a value that represents how many elements in the specified observable sequence satisfy a condition if provided, else the count of items.\n   * @example\n   * res = source.count();\n   * res = source.count(function (x) { return x > 3; });\n   * @param {Function} [predicate]A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with a number that represents how many elements in the input sequence satisfy the condition in the predicate function if provided, else the count of items in the sequence.\n   */\n  observableProto.count = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new CountObservable(this, fn);\n  };\n\n  var IndexOfObservable = (function (__super__) {\n    inherits(IndexOfObservable, __super__);\n    function IndexOfObservable(source, e, n) {\n      this.source = source;\n      this._e = e;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    IndexOfObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(-1);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new IndexOfObserver(o, this._e, this._n));\n    };\n\n    return IndexOfObservable;\n  }(ObservableBase));\n\n  var IndexOfObserver = (function (__super__) {\n    inherits(IndexOfObserver, __super__);\n    function IndexOfObserver(o, e, n) {\n      this._o = o;\n      this._e = e;\n      this._n = n;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    IndexOfObserver.prototype.next = function (x) {\n      if (this._i >= this._n && x === this._e) {\n        this._o.onNext(this._i);\n        this._o.onCompleted();\n      }\n      this._i++;\n    };\n    IndexOfObserver.prototype.error = function (e) { this._o.onError(e); };\n    IndexOfObserver.prototype.completed = function () { this._o.onNext(-1); this._o.onCompleted(); };\n\n    return IndexOfObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   * @param {Any} searchElement Element to locate in the array.\n   * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n   * @returns {Observable} And observable sequence containing the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   */\n  observableProto.indexOf = function(searchElement, fromIndex) {\n    var n = +fromIndex || 0;\n    Math.abs(n) === Infinity && (n = 0);\n    return new IndexOfObservable(this, searchElement, n);\n  };\n\n  var SumObservable = (function (__super__) {\n    inherits(SumObservable, __super__);\n    function SumObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SumObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SumObserver(o, this._fn, this.source));\n    };\n\n    return SumObservable;\n  }(ObservableBase));\n\n  var SumObserver = (function (__super__) {\n    inherits(SumObserver, __super__);\n\n    function SumObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      this._c = 0;\n      __super__.call(this);\n    }\n\n    SumObserver.prototype.next = function (x) {\n      if (this._fn) {\n        var result = tryCatch(this._fn)(x, this._i++, this._s);\n        if (result === errorObj) { return this._o.onError(result.e); }\n        this._c += result;\n      } else {\n        this._c += x;\n      }\n    };\n    SumObserver.prototype.error = function (e) { this._o.onError(e); };\n    SumObserver.prototype.completed = function () {\n      this._o.onNext(this._c);\n      this._o.onCompleted();\n    };\n\n    return SumObserver;\n  }(AbstractObserver));\n\n  /**\n   * Computes the sum of a sequence of values that are obtained by invoking an optional transform function on each element of the input sequence, else if not specified computes the sum on each item in the sequence.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the sum of the values in the source sequence.\n   */\n  observableProto.sum = function (keySelector, thisArg) {\n    var fn = bindCallback(keySelector, thisArg, 3);\n    return new SumObservable(this, fn);\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n   * @example\n   * var res = source.minBy(function (x) { return x.value; });\n   * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer] Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n   */\n  observableProto.minBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return new ExtremaByObservable(this, keySelector, function (x, y) { return comparer(x, y) * -1; });\n  };\n\n  /**\n   * Returns the minimum element in an observable sequence according to the optional comparer else a default greater than less than check.\n   * @example\n   * var res = source.min();\n   * var res = source.min(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the minimum element in the source sequence.\n   */\n  observableProto.min = function (comparer) {\n    return this.minBy(identity, comparer).map(firstOnly);\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n   * @example\n   * var res = source.maxBy(function (x) { return x.value; });\n   * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer]  Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n   */\n  observableProto.maxBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return new ExtremaByObservable(this, keySelector, comparer);\n  };\n\n  /**\n   * Returns the maximum value in an observable sequence according to the specified comparer.\n   * @example\n   * var res = source.max();\n   * var res = source.max(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the maximum element in the source sequence.\n   */\n  observableProto.max = function (comparer) {\n    return this.maxBy(identity, comparer).map(firstOnly);\n  };\n\n  var AverageObservable = (function (__super__) {\n    inherits(AverageObservable, __super__);\n    function AverageObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    AverageObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new AverageObserver(o, this._fn, this.source));\n    };\n\n    return AverageObservable;\n  }(ObservableBase));\n\n  var AverageObserver = (function(__super__) {\n    inherits(AverageObserver, __super__);\n    function AverageObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._c = 0;\n      this._t = 0;\n      __super__.call(this);\n    }\n\n    AverageObserver.prototype.next = function (x) {\n      if(this._fn) {\n        var r = tryCatch(this._fn)(x, this._c++, this._s);\n        if (r === errorObj) { return this._o.onError(r.e); }\n        this._t += r;\n      } else {\n        this._c++;\n        this._t += x;\n      }\n    };\n    AverageObserver.prototype.error = function (e) { this._o.onError(e); };\n    AverageObserver.prototype.completed = function () {\n      if (this._c === 0) { return this._o.onError(new EmptyError()); }\n      this._o.onNext(this._t / this._c);\n      this._o.onCompleted();\n    };\n\n    return AverageObserver;\n  }(AbstractObserver));\n\n  /**\n   * Computes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the average of the sequence of values.\n   */\n  observableProto.average = function (keySelector, thisArg) {\n    var source = this, fn;\n    if (isFunction(keySelector)) {\n      fn = bindCallback(keySelector, thisArg, 3);\n    }\n    return new AverageObservable(source, fn);\n  };\n\n  /**\n   *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n   *\n   * @example\n   * var res = res = source.sequenceEqual([1,2,3]);\n   * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n   * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n   * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n   * @param {Observable} second Second observable sequence or array to compare.\n   * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n   * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n   */\n  observableProto.sequenceEqual = function (second, comparer) {\n    var first = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var donel = false, doner = false, ql = [], qr = [];\n      var subscription1 = first.subscribe(function (x) {\n        if (qr.length > 0) {\n          var v = qr.shift();\n          var equal = tryCatch(comparer)(v, x);\n          if (equal === errorObj) { return o.onError(equal.e); }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (doner) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          ql.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        donel = true;\n        if (ql.length === 0) {\n          if (qr.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (doner) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n\n      (isArrayLike(second) || isIterable(second)) && (second = observableFrom(second));\n      isPromise(second) && (second = observableFromPromise(second));\n      var subscription2 = second.subscribe(function (x) {\n        if (ql.length > 0) {\n          var v = ql.shift();\n          var equal = tryCatch(comparer)(v, x);\n          if (equal === errorObj) { return o.onError(equal.e); }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (donel) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          qr.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        doner = true;\n        if (qr.length === 0) {\n          if (ql.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (donel) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n      return new BinaryDisposable(subscription1, subscription2);\n    }, first);\n  };\n\n  var ElementAtObservable = (function (__super__) {\n    inherits(ElementAtObservable, __super__);\n    function ElementAtObservable(source, i, d) {\n      this.source = source;\n      this._i = i;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    ElementAtObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ElementAtObserver(o, this._i, this._d));\n    };\n\n    return ElementAtObservable;\n  }(ObservableBase));\n\n  var ElementAtObserver = (function (__super__) {\n    inherits(ElementAtObserver, __super__);\n\n    function ElementAtObserver(o, i, d) {\n      this._o = o;\n      this._i = i;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    ElementAtObserver.prototype.next = function (x) {\n      if (this._i-- === 0) {\n        this._o.onNext(x);\n        this._o.onCompleted();\n      }\n    };\n    ElementAtObserver.prototype.error = function (e) { this._o.onError(e); };\n    ElementAtObserver.prototype.completed = function () {\n      if (this._d === undefined) {\n        this._o.onError(new ArgumentOutOfRangeError());\n      } else {\n        this._o.onNext(this._d);\n        this._o.onCompleted();\n      }\n    };\n\n    return ElementAtObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the element at a specified index in a sequence or default value if not found.\n   * @param {Number} index The zero-based index of the element to retrieve.\n   * @param {Any} [defaultValue] The default value to use if elementAt does not find a value.\n   * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence.\n   */\n  observableProto.elementAt =  function (index, defaultValue) {\n    if (index < 0) { throw new ArgumentOutOfRangeError(); }\n    return new ElementAtObservable(this, index, defaultValue);\n  };\n\n  var SingleObserver = (function(__super__) {\n    inherits(SingleObserver, __super__);\n    function SingleObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      this._hv = false;\n      this._v = null;\n      __super__.call(this);\n    }\n\n    SingleObserver.prototype.next = function (x) {\n      var shouldYield = false;\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        Boolean(res) && (shouldYield = true);\n      } else if (!this._obj.predicate) {\n        shouldYield = true;\n      }\n      if (shouldYield) {\n        if (this._hv) {\n          return this._o.onError(new Error('Sequence contains more than one matching element'));\n        }\n        this._hv = true;\n        this._v = x;\n      }\n    };\n    SingleObserver.prototype.error = function (e) { this._o.onError(e); };\n    SingleObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n        this._o.onCompleted();\n      }\n      else if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return SingleObserver;\n  }(AbstractObserver));\n\n\n    /**\n     * Returns the only element of an observable sequence that satisfies the condition in the optional predicate, and reports an exception if there is not exactly one element in the observable sequence.\n     * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate.\n     */\n    observableProto.single = function (predicate, thisArg) {\n      var obj = {}, source = this;\n      if (typeof arguments[0] === 'object') {\n        obj = arguments[0];\n      } else {\n        obj = {\n          predicate: arguments[0],\n          thisArg: arguments[1],\n          defaultValue: arguments[2]\n        };\n      }\n      if (isFunction (obj.predicate)) {\n        var fn = obj.predicate;\n        obj.predicate = bindCallback(fn, obj.thisArg, 3);\n      }\n      return new AnonymousObservable(function (o) {\n        return source.subscribe(new SingleObserver(o, obj, source));\n      }, source);\n    };\n\n  var FirstObservable = (function (__super__) {\n    inherits(FirstObservable, __super__);\n    function FirstObservable(source, obj) {\n      this.source = source;\n      this._obj = obj;\n      __super__.call(this);\n    }\n\n    FirstObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new FirstObserver(o, this._obj, this.source));\n    };\n\n    return FirstObservable;\n  }(ObservableBase));\n\n  var FirstObserver = (function(__super__) {\n    inherits(FirstObserver, __super__);\n    function FirstObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    FirstObserver.prototype.next = function (x) {\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        if (Boolean(res)) {\n          this._o.onNext(x);\n          this._o.onCompleted();\n        }\n      } else if (!this._obj.predicate) {\n        this._o.onNext(x);\n        this._o.onCompleted();\n      }\n    };\n    FirstObserver.prototype.error = function (e) { this._o.onError(e); };\n    FirstObserver.prototype.completed = function () {\n      if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return FirstObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the first element of an observable sequence that satisfies the condition in the predicate if present else the first item in the sequence.\n   * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate if provided, else the first item in the sequence.\n   */\n  observableProto.first = function () {\n    var obj = {}, source = this;\n    if (typeof arguments[0] === 'object') {\n      obj = arguments[0];\n    } else {\n      obj = {\n        predicate: arguments[0],\n        thisArg: arguments[1],\n        defaultValue: arguments[2]\n      };\n    }\n    if (isFunction (obj.predicate)) {\n      var fn = obj.predicate;\n      obj.predicate = bindCallback(fn, obj.thisArg, 3);\n    }\n    return new FirstObservable(this, obj);\n  };\n\n  var LastObservable = (function (__super__) {\n    inherits(LastObservable, __super__);\n    function LastObservable(source, obj) {\n      this.source = source;\n      this._obj = obj;\n      __super__.call(this);\n    }\n\n    LastObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new LastObserver(o, this._obj, this.source));\n    };\n\n    return LastObservable;\n  }(ObservableBase));\n\n  var LastObserver = (function(__super__) {\n    inherits(LastObserver, __super__);\n    function LastObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      this._hv = false;\n      this._v = null;\n      __super__.call(this);\n    }\n\n    LastObserver.prototype.next = function (x) {\n      var shouldYield = false;\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        Boolean(res) && (shouldYield = true);\n      } else if (!this._obj.predicate) {\n        shouldYield = true;\n      }\n      if (shouldYield) {\n        this._hv = true;\n        this._v = x;\n      }\n    };\n    LastObserver.prototype.error = function (e) { this._o.onError(e); };\n    LastObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n        this._o.onCompleted();\n      }\n      else if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return LastObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the last element of an observable sequence that satisfies the condition in the predicate if specified, else the last element.\n   * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate.\n   */\n  observableProto.last = function () {\n    var obj = {}, source = this;\n    if (typeof arguments[0] === 'object') {\n      obj = arguments[0];\n    } else {\n      obj = {\n        predicate: arguments[0],\n        thisArg: arguments[1],\n        defaultValue: arguments[2]\n      };\n    }\n    if (isFunction (obj.predicate)) {\n      var fn = obj.predicate;\n      obj.predicate = bindCallback(fn, obj.thisArg, 3);\n    }\n    return new LastObservable(this, obj);\n  };\n\n  var FindValueObserver = (function(__super__) {\n    inherits(FindValueObserver, __super__);\n    function FindValueObserver(observer, source, callback, yieldIndex) {\n      this._o = observer;\n      this._s = source;\n      this._cb = callback;\n      this._y = yieldIndex;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    FindValueObserver.prototype.next = function (x) {\n      var shouldRun = tryCatch(this._cb)(x, this._i, this._s);\n      if (shouldRun === errorObj) { return this._o.onError(shouldRun.e); }\n      if (shouldRun) {\n        this._o.onNext(this._y ? this._i : x);\n        this._o.onCompleted();\n      } else {\n        this._i++;\n      }\n    };\n\n    FindValueObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    FindValueObserver.prototype.completed = function () {\n      this._y && this._o.onNext(-1);\n      this._o.onCompleted();\n    };\n\n    return FindValueObserver;\n  }(AbstractObserver));\n\n  function findValue (source, predicate, thisArg, yieldIndex) {\n    var callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new FindValueObserver(o, source, callback, yieldIndex));\n    }, source);\n  }\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the first element that matches the conditions defined by the specified predicate, if found; otherwise, undefined.\n   */\n  observableProto.find = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, false);\n  };\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns\n   * an Observable sequence with the zero-based index of the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the zero-based index of the first occurrence of an element that matches the conditions defined by match, if found; otherwise, –1.\n  */\n  observableProto.findIndex = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, true);\n  };\n\n  var ToSetObservable = (function (__super__) {\n    inherits(ToSetObservable, __super__);\n    function ToSetObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    ToSetObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ToSetObserver(o));\n    };\n\n    return ToSetObservable;\n  }(ObservableBase));\n\n  var ToSetObserver = (function (__super__) {\n    inherits(ToSetObserver, __super__);\n    function ToSetObserver(o) {\n      this._o = o;\n      this._s = new root.Set();\n      __super__.call(this);\n    }\n\n    ToSetObserver.prototype.next = function (x) {\n      this._s.add(x);\n    };\n\n    ToSetObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ToSetObserver.prototype.completed = function () {\n      this._o.onNext(this._s);\n      this._o.onCompleted();\n    };\n\n    return ToSetObserver;\n  }(AbstractObserver));\n\n  /**\n   * Converts the observable sequence to a Set if it exists.\n   * @returns {Observable} An observable sequence with a single value of a Set containing the values from the observable sequence.\n   */\n  observableProto.toSet = function () {\n    if (typeof root.Set === 'undefined') { throw new TypeError(); }\n    return new ToSetObservable(this);\n  };\n\n  var ToMapObservable = (function (__super__) {\n    inherits(ToMapObservable, __super__);\n    function ToMapObservable(source, k, e) {\n      this.source = source;\n      this._k = k;\n      this._e = e;\n      __super__.call(this);\n    }\n\n    ToMapObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ToMapObserver(o, this._k, this._e));\n    };\n\n    return ToMapObservable;\n  }(ObservableBase));\n\n  var ToMapObserver = (function (__super__) {\n    inherits(ToMapObserver, __super__);\n    function ToMapObserver(o, k, e) {\n      this._o = o;\n      this._k = k;\n      this._e = e;\n      this._m = new root.Map();\n      __super__.call(this);\n    }\n\n    ToMapObserver.prototype.next = function (x) {\n      var key = tryCatch(this._k)(x);\n      if (key === errorObj) { return this._o.onError(key.e); }\n      var elem = x;\n      if (this._e) {\n        elem = tryCatch(this._e)(x);\n        if (elem === errorObj) { return this._o.onError(elem.e); }\n      }\n\n      this._m.set(key, elem);\n    };\n\n    ToMapObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ToMapObserver.prototype.completed = function () {\n      this._o.onNext(this._m);\n      this._o.onCompleted();\n    };\n\n    return ToMapObserver;\n  }(AbstractObserver));\n\n  /**\n  * Converts the observable sequence to a Map if it exists.\n  * @param {Function} keySelector A function which produces the key for the Map.\n  * @param {Function} [elementSelector] An optional function which produces the element for the Map. If not present, defaults to the value from the observable sequence.\n  * @returns {Observable} An observable sequence with a single value of a Map containing the values from the observable sequence.\n  */\n  observableProto.toMap = function (keySelector, elementSelector) {\n    if (typeof root.Map === 'undefined') { throw new TypeError(); }\n    return new ToMapObservable(this, keySelector, elementSelector);\n  };\n\n  var SliceObservable = (function (__super__) {\n    inherits(SliceObservable, __super__);\n    function SliceObservable(source, b, e) {\n      this.source = source;\n      this._b = b;\n      this._e = e;\n      __super__.call(this);\n    }\n\n    SliceObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SliceObserver(o, this._b, this._e));\n    };\n\n    return SliceObservable;\n  }(ObservableBase));\n\n  var SliceObserver = (function (__super__) {\n    inherits(SliceObserver, __super__);\n\n    function SliceObserver(o, b, e) {\n      this._o = o;\n      this._b = b;\n      this._e = e;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    SliceObserver.prototype.next = function (x) {\n      if (this._i >= this._b) {\n        if (this._e === this._i) {\n          this._o.onCompleted();\n        } else {\n          this._o.onNext(x);\n        }\n      }\n      this._i++;\n    };\n    SliceObserver.prototype.error = function (e) { this._o.onError(e); };\n    SliceObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SliceObserver;\n  }(AbstractObserver));\n\n  /*\n  * The slice() method returns a shallow copy of a portion of an Observable into a new Observable object.\n  * Unlike the array version, this does not support negative numbers for being or end.\n  * @param {Number} [begin] Zero-based index at which to begin extraction. If omitted, this will default to zero.\n  * @param {Number} [end] Zero-based index at which to end extraction. slice extracts up to but not including end.\n  * If omitted, this will emit the rest of the Observable object.\n  * @returns {Observable} A shallow copy of a portion of an Observable into a new Observable object.\n  */\n  observableProto.slice = function (begin, end) {\n    var start = begin || 0;\n    if (start < 0) { throw new Rx.ArgumentOutOfRangeError(); }\n    if (typeof end === 'number' && end < start) {\n      throw new Rx.ArgumentOutOfRangeError();\n    }\n    return new SliceObservable(this, start, end);\n  };\n\n  var LastIndexOfObservable = (function (__super__) {\n    inherits(LastIndexOfObservable, __super__);\n    function LastIndexOfObservable(source, e, n) {\n      this.source = source;\n      this._e = e;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    LastIndexOfObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(-1);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new LastIndexOfObserver(o, this._e, this._n));\n    };\n\n    return LastIndexOfObservable;\n  }(ObservableBase));\n\n  var LastIndexOfObserver = (function (__super__) {\n    inherits(LastIndexOfObserver, __super__);\n    function LastIndexOfObserver(o, e, n) {\n      this._o = o;\n      this._e = e;\n      this._n = n;\n      this._v = 0;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    LastIndexOfObserver.prototype.next = function (x) {\n      if (this._i >= this._n && x === this._e) {\n        this._hv = true;\n        this._v = this._i;\n      }\n      this._i++;\n    };\n    LastIndexOfObserver.prototype.error = function (e) { this._o.onError(e); };\n    LastIndexOfObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n      } else {\n        this._o.onNext(-1);\n      }\n      this._o.onCompleted();\n    };\n\n    return LastIndexOfObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the last index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   * @param {Any} searchElement Element to locate in the array.\n   * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n   * @returns {Observable} And observable sequence containing the last index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   */\n  observableProto.lastIndexOf = function(searchElement, fromIndex) {\n    var n = +fromIndex || 0;\n    Math.abs(n) === Infinity && (n = 0);\n    return new LastIndexOfObservable(this, searchElement, n);\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite-async/package.json",
    "content": "{\n  \"name\": \"rx-lite-async\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Async\",\n  \"description\": \"Lightweight library with asynchronous functions for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.async.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.async.js\"\n  },\n  \"dependencies\": {\n    \"rx-lite\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.async.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-async/readme.md",
    "content": "# RxJS Async Module #\n\nThe Reactive Extensions for JavaScript provides support for bridging to events, promises, callbacks, Node.js-style callbacks and more.  This module includes all of that functionality.  In addition, this also supports taking ordinary functions and turning them into asynchronous functions via Observable sequences.  This requires `rx.lite.js` from the [`rx-lite`](https://www.npmjs.com/package/rx-lite) NPM module.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-async\n$ npm install -g rx-lite-async\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-async');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.js\"></script>\n<script src=\"path/to/rx.lite.async.js\"></script>\n```\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`start`](../../doc/api/core/operators/start.md)\n- [`startAsync`](../../doc/api/core/operators/startasync.md)\n- [`toAsync`](../../doc/api/core/operators/toasync.md)\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-async/rx.lite.async.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Aliases\n  var Observable = Rx.Observable,\n    observableFromPromise = Observable.fromPromise,\n    observableThrow = Observable.throwError,\n    AnonymousObservable = Rx.AnonymousObservable,\n    ObservableBase = Rx.ObservableBase,\n    AsyncSubject = Rx.AsyncSubject,\n    disposableCreate = Rx.Disposable.create,\n    CompositeDisposable = Rx.CompositeDisposable,\n    immediateScheduler = Rx.Scheduler.immediate,\n    defaultScheduler = Rx.Scheduler['default'],\n    inherits = Rx.internals.inherits,\n    isScheduler = Rx.Scheduler.isScheduler,\n    isPromise = Rx.helpers.isPromise,\n    isFunction = Rx.helpers.isFunction,\n    isIterable = Rx.helpers.isIterable,\n    isArrayLike = Rx.helpers.isArrayLike;\n\n  Observable.wrap = function (fn) {\n    function createObservable() {\n      return Observable.spawn.call(this, fn.apply(this, arguments));\n    }\n\n    createObservable.__generatorFunction__ = fn;\n    return createObservable;\n  };\n\n  var spawn = Observable.spawn = function () {\n    var gen = arguments[0], self = this, args = [];\n    for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n    return new AnonymousObservable(function (o) {\n      var g = new CompositeDisposable();\n\n      if (isFunction(gen)) { gen = gen.apply(self, args); }\n      if (!gen || !isFunction(gen.next)) {\n        o.onNext(gen);\n        return o.onCompleted();\n      }\n\n      function processGenerator(res) {\n        var ret = tryCatch(gen.next).call(gen, res);\n        if (ret === errorObj) { return o.onError(ret.e); }\n        next(ret);\n      }\n\n      processGenerator();\n\n      function onError(err) {\n        var ret = tryCatch(gen.next).call(gen, err);\n        if (ret === errorObj) { return o.onError(ret.e); }\n        next(ret);\n      }\n\n      function next(ret) {\n        if (ret.done) {\n          o.onNext(ret.value);\n          o.onCompleted();\n          return;\n        }\n        var obs = toObservable.call(self, ret.value);\n        var value = null;\n        var hasValue = false;\n        if (Observable.isObservable(obs)) {\n          g.add(obs.subscribe(function(val) {\n            hasValue = true;\n            value = val;\n          }, onError, function() {\n            hasValue && processGenerator(value);\n          }));\n        } else {\n          onError(new TypeError('type not supported'));\n        }\n      }\n\n      return g;\n    });\n  };\n\n  function toObservable(obj) {\n    if (!obj) { return obj; }\n    if (Observable.isObservable(obj)) { return obj; }\n    if (isPromise(obj)) { return Observable.fromPromise(obj); }\n    if (isGeneratorFunction(obj) || isGenerator(obj)) { return spawn.call(this, obj); }\n    if (isFunction(obj)) { return thunkToObservable.call(this, obj); }\n    if (isArrayLike(obj) || isIterable(obj)) { return arrayToObservable.call(this, obj); }\n    if (isObject(obj)) {return objectToObservable.call(this, obj);}\n    return obj;\n  }\n\n  function arrayToObservable (obj) {\n    return Observable.from(obj).concatMap(function(o) {\n      if(Observable.isObservable(o) || isObject(o)) {\n        return toObservable.call(null, o);\n      } else {\n        return Rx.Observable.just(o);\n      }\n    }).toArray();\n  }\n\n  function objectToObservable (obj) {\n    var results = new obj.constructor(), keys = Object.keys(obj), observables = [];\n    for (var i = 0, len = keys.length; i < len; i++) {\n      var key = keys[i];\n      var observable = toObservable.call(this, obj[key]);\n\n      if(observable && Observable.isObservable(observable)) {\n        defer(observable, key);\n      } else {\n        results[key] = obj[key];\n      }\n    }\n\n    return Observable.forkJoin.apply(Observable, observables).map(function() {\n      return results;\n    });\n\n\n    function defer (observable, key) {\n      results[key] = undefined;\n      observables.push(observable.map(function (next) {\n        results[key] = next;\n      }));\n    }\n  }\n\n  function thunkToObservable(fn) {\n    var self = this;\n    return new AnonymousObservable(function (o) {\n      fn.call(self, function () {\n        var err = arguments[0], res = arguments[1];\n        if (err) { return o.onError(err); }\n        if (arguments.length > 2) {\n          var args = [];\n          for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n          res = args;\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    });\n  }\n\n  function isGenerator(obj) {\n    return isFunction (obj.next) && isFunction (obj['throw']);\n  }\n\n  function isGeneratorFunction(obj) {\n    var ctor = obj.constructor;\n    if (!ctor) { return false; }\n    if (ctor.name === 'GeneratorFunction' || ctor.displayName === 'GeneratorFunction') { return true; }\n    return isGenerator(ctor.prototype);\n  }\n\n  function isObject(val) {\n    return Object == val.constructor;\n  }\n\n  /**\n   * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.\n   *\n   * @example\n   * var res = Rx.Observable.start(function () { console.log('hello'); });\n   * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout);\n   * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console);\n   *\n   * @param {Function} func Function to run asynchronously.\n   * @param {Scheduler} [scheduler]  Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param [context]  The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   *\n   * Remarks\n   * * The function is called immediately, not during the subscription of the resulting sequence.\n   * * Multiple subscriptions to the resulting sequence can observe the function's result.\n   */\n  Observable.start = function (func, context, scheduler) {\n    return observableToAsync(func, context, scheduler)();\n  };\n\n  /**\n   * Invokes the asynchronous function, surfacing the result through an observable sequence.\n   * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   */\n  Observable.startAsync = function (functionAsync) {\n    var promise = tryCatch(functionAsync)();\n    if (promise === errorObj) { return observableThrow(promise.e); }\n    return observableFromPromise(promise);\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite-async-compat/package.json",
    "content": "{\n  \"name\": \"rx-lite-async-compat\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Async\",\n  \"description\": \"Lightweight older browser compatible library with asynchronous functions for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.async.compat.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.async.compat.js\"\n  },\n  \"dependencies\": {\n    \"rx-lite-compat\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.async.compat.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-async-compat/readme.md",
    "content": "# RxJS Async Compat Module #\n\nThe Reactive Extensions for JavaScript provides support for bridging to events, promises, callbacks, Node.js-style callbacks and more.  This module includes all of that functionality.  In addition, this also supports taking ordinary functions and turning them into asynchronous functions via Observable sequences.  This requires `rx.lite.compat.js` from the [`rx-lite-compat`](https://www.npmjs.com/package/rx-lite) NPM module.  This module has support for older browsers which do not support ES5 functionality, hence the name `compat`.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-async-compat\n$ npm install -g rx-lite-async-compat\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-async-compat');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.js\"></script>\n<script src=\"path/to/rx.lite.async.compat.js\"></script>\n```\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`start`](../../doc/api/core/operators/start.md)\n- [`startAsync`](../../doc/api/core/operators/startasync.md)\n- [`toAsync`](../../doc/api/core/operators/toasync.md)\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-async-compat/rx.lite.async.compat.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite.compat'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite-compat'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Aliases\n  var Observable = Rx.Observable,\n    observableFromPromise = Observable.fromPromise,\n    observableThrow = Observable.throwError,\n    AnonymousObservable = Rx.AnonymousObservable,\n    ObservableBase = Rx.ObservableBase,\n    AsyncSubject = Rx.AsyncSubject,\n    disposableCreate = Rx.Disposable.create,\n    CompositeDisposable = Rx.CompositeDisposable,\n    immediateScheduler = Rx.Scheduler.immediate,\n    defaultScheduler = Rx.Scheduler['default'],\n    inherits = Rx.internals.inherits,\n    isScheduler = Rx.Scheduler.isScheduler,\n    isPromise = Rx.helpers.isPromise,\n    isFunction = Rx.helpers.isFunction,\n    isIterable = Rx.helpers.isIterable,\n    isArrayLike = Rx.helpers.isArrayLike;\n\n  Observable.wrap = function (fn) {\n    function createObservable() {\n      return Observable.spawn.call(this, fn.apply(this, arguments));\n    }\n\n    createObservable.__generatorFunction__ = fn;\n    return createObservable;\n  };\n\n  var spawn = Observable.spawn = function () {\n    var gen = arguments[0], self = this, args = [];\n    for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n    return new AnonymousObservable(function (o) {\n      var g = new CompositeDisposable();\n\n      if (isFunction(gen)) { gen = gen.apply(self, args); }\n      if (!gen || !isFunction(gen.next)) {\n        o.onNext(gen);\n        return o.onCompleted();\n      }\n\n      function processGenerator(res) {\n        var ret = tryCatch(gen.next).call(gen, res);\n        if (ret === errorObj) { return o.onError(ret.e); }\n        next(ret);\n      }\n\n      processGenerator();\n\n      function onError(err) {\n        var ret = tryCatch(gen.next).call(gen, err);\n        if (ret === errorObj) { return o.onError(ret.e); }\n        next(ret);\n      }\n\n      function next(ret) {\n        if (ret.done) {\n          o.onNext(ret.value);\n          o.onCompleted();\n          return;\n        }\n        var obs = toObservable.call(self, ret.value);\n        var value = null;\n        var hasValue = false;\n        if (Observable.isObservable(obs)) {\n          g.add(obs.subscribe(function(val) {\n            hasValue = true;\n            value = val;\n          }, onError, function() {\n            hasValue && processGenerator(value);\n          }));\n        } else {\n          onError(new TypeError('type not supported'));\n        }\n      }\n\n      return g;\n    });\n  };\n\n  function toObservable(obj) {\n    if (!obj) { return obj; }\n    if (Observable.isObservable(obj)) { return obj; }\n    if (isPromise(obj)) { return Observable.fromPromise(obj); }\n    if (isGeneratorFunction(obj) || isGenerator(obj)) { return spawn.call(this, obj); }\n    if (isFunction(obj)) { return thunkToObservable.call(this, obj); }\n    if (isArrayLike(obj) || isIterable(obj)) { return arrayToObservable.call(this, obj); }\n    if (isObject(obj)) {return objectToObservable.call(this, obj);}\n    return obj;\n  }\n\n  function arrayToObservable (obj) {\n    return Observable.from(obj).concatMap(function(o) {\n      if(Observable.isObservable(o) || isObject(o)) {\n        return toObservable.call(null, o);\n      } else {\n        return Rx.Observable.just(o);\n      }\n    }).toArray();\n  }\n\n  function objectToObservable (obj) {\n    var results = new obj.constructor(), keys = Object.keys(obj), observables = [];\n    for (var i = 0, len = keys.length; i < len; i++) {\n      var key = keys[i];\n      var observable = toObservable.call(this, obj[key]);\n\n      if(observable && Observable.isObservable(observable)) {\n        defer(observable, key);\n      } else {\n        results[key] = obj[key];\n      }\n    }\n\n    return Observable.forkJoin.apply(Observable, observables).map(function() {\n      return results;\n    });\n\n\n    function defer (observable, key) {\n      results[key] = undefined;\n      observables.push(observable.map(function (next) {\n        results[key] = next;\n      }));\n    }\n  }\n\n  function thunkToObservable(fn) {\n    var self = this;\n    return new AnonymousObservable(function (o) {\n      fn.call(self, function () {\n        var err = arguments[0], res = arguments[1];\n        if (err) { return o.onError(err); }\n        if (arguments.length > 2) {\n          var args = [];\n          for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n          res = args;\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    });\n  }\n\n  function isGenerator(obj) {\n    return isFunction (obj.next) && isFunction (obj['throw']);\n  }\n\n  function isGeneratorFunction(obj) {\n    var ctor = obj.constructor;\n    if (!ctor) { return false; }\n    if (ctor.name === 'GeneratorFunction' || ctor.displayName === 'GeneratorFunction') { return true; }\n    return isGenerator(ctor.prototype);\n  }\n\n  function isObject(val) {\n    return Object == val.constructor;\n  }\n\n  /**\n   * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.\n   *\n   * @example\n   * var res = Rx.Observable.start(function () { console.log('hello'); });\n   * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout);\n   * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console);\n   *\n   * @param {Function} func Function to run asynchronously.\n   * @param {Scheduler} [scheduler]  Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param [context]  The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   *\n   * Remarks\n   * * The function is called immediately, not during the subscription of the resulting sequence.\n   * * Multiple subscriptions to the resulting sequence can observe the function's result.\n   */\n  Observable.start = function (func, context, scheduler) {\n    return observableToAsync(func, context, scheduler)();\n  };\n\n  /**\n   * Invokes the asynchronous function, surfacing the result through an observable sequence.\n   * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   */\n  Observable.startAsync = function (functionAsync) {\n    var promise = tryCatch(functionAsync)();\n    if (promise === errorObj) { return observableThrow(promise.e); }\n    return observableFromPromise(promise);\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite-backpressure/package.json",
    "content": "{\n  \"name\": \"rx-lite-backpressure\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Async\",\n  \"description\": \"Lightweight library with backpressure functions for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.backpressure.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.backpressure.js\"\n  },\n  \"dependencies\": {\n    \"rx-lite\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.backpressure.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-backpressure/readme.md",
    "content": "# RxJS Backpressure Module #\n\nThe Reactive Extensions for JavaScript provides support backpressure for situations when the observable sequences emits too many messages for the observer to consume.  This is in addition to other mechanisms already in place such as `buffer`, `throttle`, `sample` among other operators which allow you to get messages every so often, or in batches.  This module allows you to pause and resume a hot observable with `pausable` and to pause and resume with buffered data with `pausableBuffered`.  In addition, we also support the ability to get a requested number of items from the queue through the `controlled` operator.\n This requires `rx.lite.js` from the [`rx-lite`](https://www.npmjs.com/package/rx-lite) NPM module.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-backpressure\n$ npm install -g rx-lite-backpressure\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-backpressure');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.js\"></script>\n<script src=\"path/to/rx.lite.backpressure.js\"></script>\n```\n\n## Included Observable Operators ##\n\n### `Observable Instance Methods`\n- [`controlled`](../../doc/api/core/operators/controlled.md)\n- [`pausable`](../../doc/api/core/operators/pausable.md)\n- [`pausableBuffered`](../../doc/api/core/operators/pausablebuffered.md)\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-backpressure/rx.lite.backpressure.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // References\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    NAryDisposable = Rx.NAryDisposable,\n    Notification = Rx.Notification,\n    Subject = Rx.Subject,\n    Observer = Rx.Observer,\n    disposableEmpty = Rx.Disposable.empty,\n    disposableCreate = Rx.Disposable.create,\n    inherits = Rx.internals.inherits,\n    addProperties = Rx.internals.addProperties,\n    defaultScheduler = Rx.Scheduler['default'],\n    currentThreadScheduler = Rx.Scheduler.currentThread,\n    identity = Rx.helpers.identity,\n    isScheduler = Rx.Scheduler.isScheduler,\n    isFunction = Rx.helpers.isFunction,\n    checkDisposed = Rx.Disposable.checkDisposed;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  var StopAndWaitObservable = (function (__super__) {\n    inherits(StopAndWaitObservable, __super__);\n    function StopAndWaitObservable (source) {\n      __super__.call(this);\n      this.source = source;\n    }\n\n    function scheduleMethod(s, self) {\n      return self.source.request(1);\n    }\n\n    StopAndWaitObservable.prototype._subscribe = function (o) {\n      this.subscription = this.source.subscribe(new StopAndWaitObserver(o, this, this.subscription));\n      return new BinaryDisposable(\n        this.subscription,\n        defaultScheduler.schedule(this, scheduleMethod)\n      );\n    };\n\n    var StopAndWaitObserver = (function (__sub__) {\n      inherits(StopAndWaitObserver, __sub__);\n      function StopAndWaitObserver (observer, observable, cancel) {\n        __sub__.call(this);\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n        this.scheduleDisposable = null;\n      }\n\n      StopAndWaitObserver.prototype.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      StopAndWaitObserver.prototype.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      };\n\n      function innerScheduleMethod(s, self) {\n        return self.observable.source.request(1);\n      }\n\n      StopAndWaitObserver.prototype.next = function (value) {\n        this.observer.onNext(value);\n        this.scheduleDisposable = defaultScheduler.schedule(this, innerScheduleMethod);\n      };\n\n      StopAndWaitObserver.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        if (this.scheduleDisposable) {\n          this.scheduleDisposable.dispose();\n          this.scheduleDisposable = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return StopAndWaitObserver;\n    }(AbstractObserver));\n\n    return StopAndWaitObservable;\n  }(Observable));\n\n\n  /**\n   * Attaches a stop and wait observable to the current observable.\n   * @returns {Observable} A stop and wait observable.\n   */\n  ControlledObservable.prototype.stopAndWait = function () {\n    return new StopAndWaitObservable(this);\n  };\n\n  var WindowedObservable = (function (__super__) {\n    inherits(WindowedObservable, __super__);\n    function WindowedObservable(source, windowSize) {\n      __super__.call(this);\n      this.source = source;\n      this.windowSize = windowSize;\n    }\n\n    function scheduleMethod(s, self) {\n      return self.source.request(self.windowSize);\n    }\n\n    WindowedObservable.prototype._subscribe = function (o) {\n      this.subscription = this.source.subscribe(new WindowedObserver(o, this, this.subscription));\n      return new BinaryDisposable(\n        this.subscription,\n        defaultScheduler.schedule(this, scheduleMethod)\n      );\n    };\n\n    var WindowedObserver = (function (__sub__) {\n      inherits(WindowedObserver, __sub__);\n      function WindowedObserver(observer, observable, cancel) {\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n        this.received = 0;\n        this.scheduleDisposable = null;\n        __sub__.call(this);\n      }\n\n      WindowedObserver.prototype.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      WindowedObserver.prototype.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      };\n\n      function innerScheduleMethod(s, self) {\n        return self.observable.source.request(self.observable.windowSize);\n      }\n\n      WindowedObserver.prototype.next = function (value) {\n        this.observer.onNext(value);\n        this.received = ++this.received % this.observable.windowSize;\n        this.received === 0 && (this.scheduleDisposable = defaultScheduler.schedule(this, innerScheduleMethod));\n      };\n\n      WindowedObserver.prototype.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        if (this.scheduleDisposable) {\n          this.scheduleDisposable.dispose();\n          this.scheduleDisposable = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return WindowedObserver;\n    }(AbstractObserver));\n\n    return WindowedObservable;\n  }(Observable));\n\n  /**\n   * Creates a sliding windowed observable based upon the window size.\n   * @param {Number} windowSize The number of items in the window\n   * @returns {Observable} A windowed observable based upon the window size.\n   */\n  ControlledObservable.prototype.windowed = function (windowSize) {\n    return new WindowedObservable(this, windowSize);\n  };\n\n  /**\n   * Pipes the existing Observable sequence into a Node.js Stream.\n   * @param {Stream} dest The destination Node.js stream.\n   * @returns {Stream} The destination stream.\n   */\n  observableProto.pipe = function (dest) {\n    var source = this.pausableBuffered();\n\n    function onDrain() {\n      source.resume();\n    }\n\n    dest.addListener('drain', onDrain);\n\n    source.subscribe(\n      function (x) {\n        !dest.write(x) && source.pause();\n      },\n      function (err) {\n        dest.emit('error', err);\n      },\n      function () {\n        // Hack check because STDIO is not closable\n        !dest._isStdio && dest.end();\n        dest.removeListener('drain', onDrain);\n      });\n\n    source.resume();\n\n    return dest;\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite-backpressure-compat/package.json",
    "content": "{\n  \"name\": \"rx-lite-backpressure-compat\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Async\",\n  \"description\": \"Lightweight older browser compatible library with backpressure functions for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.backpressure.compat.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.backpressure.compat.js\"\n  },\n  \"dependencies\": {\n    \"rx-lite-compat\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.backpressure.compat.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-backpressure-compat/readme.md",
    "content": "# RxJS Backpressure Module #\n\nThe Reactive Extensions for JavaScript provides support backpressure for situations when the observable sequences emits too many messages for the observer to consume.  This is in addition to other mechanisms already in place such as `buffer`, `throttle`, `sample` among other operators which allow you to get messages every so often, or in batches.  This module allows you to pause and resume a hot observable with `pausable` and to pause and resume with buffered data with `pausableBuffered`.  In addition, we also support the ability to get a requested number of items from the queue through the `controlled` operator.\nThis requires `rx.lite.compat.js` from the [`rx-lite-compat`](https://www.npmjs.com/package/rx-lite) NPM module.  This module has support for older browsers which do not support ES5 functionality, hence the name `compat`.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-backpressure-compat\n$ npm install -g rx-lite-backpressure-compat\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-backpressure-compat');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.compat.js\"></script>\n<script src=\"path/to/rx.lite.backpressure.compat.js\"></script>\n```\n\n## Included Observable Operators ##\n\n### `Observable Instance Methods`\n- [`controlled`](../../doc/api/core/operators/controlled.md)\n- [`pausable`](../../doc/api/core/operators/pausable.md)\n- [`pausableBuffered`](../../doc/api/core/operators/pausablebuffered.md)\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-backpressure-compat/rx.lite.backpressure.compat.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite.compat'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite-compat'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // References\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    NAryDisposable = Rx.NAryDisposable,\n    Notification = Rx.Notification,\n    Subject = Rx.Subject,\n    Observer = Rx.Observer,\n    disposableEmpty = Rx.Disposable.empty,\n    disposableCreate = Rx.Disposable.create,\n    inherits = Rx.internals.inherits,\n    addProperties = Rx.internals.addProperties,\n    defaultScheduler = Rx.Scheduler['default'],\n    currentThreadScheduler = Rx.Scheduler.currentThread,\n    identity = Rx.helpers.identity,\n    isScheduler = Rx.Scheduler.isScheduler,\n    isFunction = Rx.helpers.isFunction,\n    checkDisposed = Rx.Disposable.checkDisposed;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  var StopAndWaitObservable = (function (__super__) {\n    inherits(StopAndWaitObservable, __super__);\n    function StopAndWaitObservable (source) {\n      __super__.call(this);\n      this.source = source;\n    }\n\n    function scheduleMethod(s, self) {\n      return self.source.request(1);\n    }\n\n    StopAndWaitObservable.prototype._subscribe = function (o) {\n      this.subscription = this.source.subscribe(new StopAndWaitObserver(o, this, this.subscription));\n      return new BinaryDisposable(\n        this.subscription,\n        defaultScheduler.schedule(this, scheduleMethod)\n      );\n    };\n\n    var StopAndWaitObserver = (function (__sub__) {\n      inherits(StopAndWaitObserver, __sub__);\n      function StopAndWaitObserver (observer, observable, cancel) {\n        __sub__.call(this);\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n        this.scheduleDisposable = null;\n      }\n\n      StopAndWaitObserver.prototype.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      StopAndWaitObserver.prototype.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      };\n\n      function innerScheduleMethod(s, self) {\n        return self.observable.source.request(1);\n      }\n\n      StopAndWaitObserver.prototype.next = function (value) {\n        this.observer.onNext(value);\n        this.scheduleDisposable = defaultScheduler.schedule(this, innerScheduleMethod);\n      };\n\n      StopAndWaitObserver.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        if (this.scheduleDisposable) {\n          this.scheduleDisposable.dispose();\n          this.scheduleDisposable = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return StopAndWaitObserver;\n    }(AbstractObserver));\n\n    return StopAndWaitObservable;\n  }(Observable));\n\n\n  /**\n   * Attaches a stop and wait observable to the current observable.\n   * @returns {Observable} A stop and wait observable.\n   */\n  ControlledObservable.prototype.stopAndWait = function () {\n    return new StopAndWaitObservable(this);\n  };\n\n  var WindowedObservable = (function (__super__) {\n    inherits(WindowedObservable, __super__);\n    function WindowedObservable(source, windowSize) {\n      __super__.call(this);\n      this.source = source;\n      this.windowSize = windowSize;\n    }\n\n    function scheduleMethod(s, self) {\n      return self.source.request(self.windowSize);\n    }\n\n    WindowedObservable.prototype._subscribe = function (o) {\n      this.subscription = this.source.subscribe(new WindowedObserver(o, this, this.subscription));\n      return new BinaryDisposable(\n        this.subscription,\n        defaultScheduler.schedule(this, scheduleMethod)\n      );\n    };\n\n    var WindowedObserver = (function (__sub__) {\n      inherits(WindowedObserver, __sub__);\n      function WindowedObserver(observer, observable, cancel) {\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n        this.received = 0;\n        this.scheduleDisposable = null;\n        __sub__.call(this);\n      }\n\n      WindowedObserver.prototype.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      WindowedObserver.prototype.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      };\n\n      function innerScheduleMethod(s, self) {\n        return self.observable.source.request(self.observable.windowSize);\n      }\n\n      WindowedObserver.prototype.next = function (value) {\n        this.observer.onNext(value);\n        this.received = ++this.received % this.observable.windowSize;\n        this.received === 0 && (this.scheduleDisposable = defaultScheduler.schedule(this, innerScheduleMethod));\n      };\n\n      WindowedObserver.prototype.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        if (this.scheduleDisposable) {\n          this.scheduleDisposable.dispose();\n          this.scheduleDisposable = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return WindowedObserver;\n    }(AbstractObserver));\n\n    return WindowedObservable;\n  }(Observable));\n\n  /**\n   * Creates a sliding windowed observable based upon the window size.\n   * @param {Number} windowSize The number of items in the window\n   * @returns {Observable} A windowed observable based upon the window size.\n   */\n  ControlledObservable.prototype.windowed = function (windowSize) {\n    return new WindowedObservable(this, windowSize);\n  };\n\n  /**\n   * Pipes the existing Observable sequence into a Node.js Stream.\n   * @param {Stream} dest The destination Node.js stream.\n   * @returns {Stream} The destination stream.\n   */\n  observableProto.pipe = function (dest) {\n    var source = this.pausableBuffered();\n\n    function onDrain() {\n      source.resume();\n    }\n\n    dest.addListener('drain', onDrain);\n\n    source.subscribe(\n      function (x) {\n        !dest.write(x) && source.pause();\n      },\n      function (err) {\n        dest.emit('error', err);\n      },\n      function () {\n        // Hack check because STDIO is not closable\n        !dest._isStdio && dest.end();\n        dest.removeListener('drain', onDrain);\n      });\n\n    source.resume();\n\n    return dest;\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite-coincidence/package.json",
    "content": "{\n  \"name\": \"rx-lite-coincidence\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Async\",\n  \"description\": \"Lightweight library with coincidence functions for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.coincidence.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.coincidence.js\"\n  },\n  \"dependencies\": {\n    \"rx-lite\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.coincidence.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-coincidence/readme.md",
    "content": "# RxJS Coincidence Module #\n\nThe Reactive Extensions for JavaScript has a set of coincidence-based operators such as `join` and `groupJoin` which allow one to correlate two observable sequences much as you would do in SQL.  There is also support for advanced windowing and bufferring capabilities which allow for the specification of opening and closing observable sequences to denote how much data to capture.  This requires `rx.lite.js` from the [`rx-lite`](https://www.npmjs.com/package/rx-lite) NPM module.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-coincidence\n$ npm install -g rx-lite-coincidence\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-coincidence');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.js\"></script>\n<script src=\"path/to/rx.lite.coincidence.js\"></script>\n```\n\n## Included Observable Operators ##\n\n## `Observable Instance Methods`\n- [`buffer`](../../doc/api/core/operators/buffer.md)\n- [`groupBy`](../../doc/api/core/operators/groupby.md)\n- [`groupByUntil`](../../doc/api/core/operators/groupbyuntil.md)\n- [`groupJoin`](../../doc/api/core/operators/groupjoin.md)\n- [`join`](../../doc/api/core/operators/join.md)\n- [`pairwise`](../../doc/api/core/operators/pairwise.md)\n- [`partition`](../../doc/api/core/operators/partition.md)\n- [`window`](../../doc/api/core/operators/window.md)\n\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-coincidence/rx.lite.coincidence.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  var Observable = Rx.Observable,\n    ObservableBase = Rx.ObservableBase,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    Subject = Rx.Subject,\n    observableProto = Observable.prototype,\n    observableEmpty = Observable.empty,\n    observableNever = Observable.never,\n    AnonymousObservable = Rx.AnonymousObservable,\n    addRef = Rx.internals.addRef,\n    inherits = Rx.internals.inherits,\n    bindCallback = Rx.internals.bindCallback,\n    noop = Rx.helpers.noop,\n    isPromise = Rx.helpers.isPromise,\n    isFunction = Rx.helpers.isFunction,\n    observableFromPromise = Observable.fromPromise;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  var Map = root.Map || (function () {\n    function Map() {\n      this.size = 0;\n      this._values = [];\n      this._keys = [];\n    }\n\n    Map.prototype['delete'] = function (key) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) { return false; }\n      this._values.splice(i, 1);\n      this._keys.splice(i, 1);\n      this.size--;\n      return true;\n    };\n\n    Map.prototype.get = function (key) {\n      var i = this._keys.indexOf(key);\n      return i === -1 ? undefined : this._values[i];\n    };\n\n    Map.prototype.set = function (key, value) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) {\n        this._keys.push(key);\n        this._values.push(value);\n        this.size++;\n      } else {\n        this._values[i] = value;\n      }\n      return this;\n    };\n\n    Map.prototype.forEach = function (cb, thisArg) {\n      for (var i = 0; i < this.size; i++) {\n        cb.call(thisArg, this._values[i], this._keys[i]);\n      }\n    };\n\n    return Map;\n  }());\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters passed to the function correspond with the elements from the left and right source sequences for which overlap occurs.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.join = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable();\n      var leftDone = false, rightDone = false;\n      var leftId = 0, rightId = 0;\n      var leftMap = new Map(), rightMap = new Map();\n      var handleError = function (e) { o.onError(e); };\n\n      group.add(left.subscribe(\n        function (value) {\n          var id = leftId++, md = new SingleAssignmentDisposable();\n\n          leftMap.set(id, value);\n          group.add(md);\n\n          var duration = tryCatch(leftDurationSelector)(value);\n          if (duration === errorObj) { return o.onError(duration.e); }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            handleError,\n            function () {\n              leftMap['delete'](id) && leftMap.size === 0 && leftDone && o.onCompleted();\n              group.remove(md);\n            }));\n\n          rightMap.forEach(function (v) {\n            var result = tryCatch(resultSelector)(value, v);\n            if (result === errorObj) { return o.onError(result.e); }\n            o.onNext(result);\n          });\n        },\n        handleError,\n        function () {\n          leftDone = true;\n          (rightDone || leftMap.size === 0) && o.onCompleted();\n        })\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++, md = new SingleAssignmentDisposable();\n\n          rightMap.set(id, value);\n          group.add(md);\n\n          var duration = tryCatch(rightDurationSelector)(value);\n          if (duration === errorObj) { return o.onError(duration.e); }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            handleError,\n            function () {\n              rightMap['delete'](id) && rightMap.size === 0 && rightDone && o.onCompleted();\n              group.remove(md);\n            }));\n\n          leftMap.forEach(function (v) {\n            var result = tryCatch(resultSelector)(v, value);\n            if (result === errorObj) { return o.onError(result.e); }\n            o.onNext(result);\n          });\n        },\n        handleError,\n        function () {\n          rightDone = true;\n          (leftDone || rightMap.size === 0) && o.onCompleted();\n        })\n      );\n      return group;\n    }, left);\n  };\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations, and groups the results.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. The first parameter passed to the function is an element of the left sequence. The second parameter passed to the function is an observable sequence with elements from the right sequence that overlap with the left sequence's element.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.groupJoin = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable();\n      var r = new RefCountDisposable(group);\n      var leftMap = new Map(), rightMap = new Map();\n      var leftId = 0, rightId = 0;\n      var handleError = function (e) { return function (v) { v.onError(e); }; };\n\n      function handleError(e) { };\n\n      group.add(left.subscribe(\n        function (value) {\n          var s = new Subject();\n          var id = leftId++;\n          leftMap.set(id, s);\n\n          var result = tryCatch(resultSelector)(value, addRef(s, r));\n          if (result === errorObj) {\n            leftMap.forEach(handleError(result.e));\n            return o.onError(result.e);\n          }\n          o.onNext(result);\n\n          rightMap.forEach(function (v) { s.onNext(v); });\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var duration = tryCatch(leftDurationSelector)(value);\n          if (duration === errorObj) {\n            leftMap.forEach(handleError(duration.e));\n            return o.onError(duration.e);\n          }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.forEach(handleError(e));\n              o.onError(e);\n            },\n            function () {\n              leftMap['delete'](id) && s.onCompleted();\n              group.remove(md);\n            }));\n        },\n        function (e) {\n          leftMap.forEach(handleError(e));\n          o.onError(e);\n        },\n        function () { o.onCompleted(); })\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++;\n          rightMap.set(id, value);\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var duration = tryCatch(rightDurationSelector)(value);\n          if (duration === errorObj) {\n            leftMap.forEach(handleError(duration.e));\n            return o.onError(duration.e);\n          }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.forEach(handleError(e));\n              o.onError(e);\n            },\n            function () {\n              rightMap['delete'](id);\n              group.remove(md);\n            }));\n\n          leftMap.forEach(function (v) { v.onNext(value); });\n        },\n        function (e) {\n          leftMap.forEach(handleError(e));\n          o.onError(e);\n        })\n      );\n\n      return r;\n    }, left);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers.\n   *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n   *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n   *  @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.buffer = function () {\n    return this.window.apply(this, arguments)\n      .flatMap(toArray);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows.\n   *\n   *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n   *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n   *  @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.window = function (windowOpeningsOrClosingSelector, windowClosingSelector) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'function') {\n      return observableWindowWithBoundaries.call(this, windowOpeningsOrClosingSelector);\n    }\n    return typeof windowOpeningsOrClosingSelector === 'function' ?\n      observableWindowWithClosingSelector.call(this, windowOpeningsOrClosingSelector) :\n      observableWindowWithOpenings.call(this, windowOpeningsOrClosingSelector, windowClosingSelector);\n  };\n\n  function observableWindowWithOpenings(windowOpenings, windowClosingSelector) {\n    return windowOpenings.groupJoin(this, windowClosingSelector, observableEmpty, function (_, win) {\n      return win;\n    });\n  }\n\n  function observableWindowWithBoundaries(windowBoundaries) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var win = new Subject(),\n        d = new CompositeDisposable(),\n        r = new RefCountDisposable(d);\n\n      observer.onNext(addRef(win, r));\n\n      d.add(source.subscribe(function (x) {\n        win.onNext(x);\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      isPromise(windowBoundaries) && (windowBoundaries = observableFromPromise(windowBoundaries));\n\n      d.add(windowBoundaries.subscribe(function (w) {\n        win.onCompleted();\n        win = new Subject();\n        observer.onNext(addRef(win, r));\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      return r;\n    }, source);\n  }\n\n  function observableWindowWithClosingSelector(windowClosingSelector) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        r = new RefCountDisposable(d),\n        win = new Subject();\n      observer.onNext(addRef(win, r));\n      d.add(source.subscribe(function (x) {\n          win.onNext(x);\n      }, function (err) {\n          win.onError(err);\n          observer.onError(err);\n      }, function () {\n          win.onCompleted();\n          observer.onCompleted();\n      }));\n\n      function createWindowClose () {\n        var windowClose;\n        try {\n          windowClose = windowClosingSelector();\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n\n        isPromise(windowClose) && (windowClose = observableFromPromise(windowClose));\n\n        var m1 = new SingleAssignmentDisposable();\n        m.setDisposable(m1);\n        m1.setDisposable(windowClose.take(1).subscribe(noop, function (err) {\n          win.onError(err);\n          observer.onError(err);\n        }, function () {\n          win.onCompleted();\n          win = new Subject();\n          observer.onNext(addRef(win, r));\n          createWindowClose();\n        }));\n      }\n\n      createWindowClose();\n      return r;\n    }, source);\n  }\n\n  var PairwiseObservable = (function (__super__) {\n    inherits(PairwiseObservable, __super__);\n    function PairwiseObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    PairwiseObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new PairwiseObserver(o));\n    };\n\n    return PairwiseObservable;\n  }(ObservableBase));\n\n  var PairwiseObserver = (function(__super__) {\n    inherits(PairwiseObserver, __super__);\n    function PairwiseObserver(o) {\n      this._o = o;\n      this._p = null;\n      this._hp = false;\n      __super__.call(this);\n    }\n\n    PairwiseObserver.prototype.next = function (x) {\n      if (this._hp) {\n        this._o.onNext([this._p, x]);\n      } else {\n        this._hp = true;\n      }\n      this._p = x;\n    };\n    PairwiseObserver.prototype.error = function (err) { this._o.onError(err); };\n    PairwiseObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return PairwiseObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns a new observable that triggers on the second and subsequent triggerings of the input observable.\n   * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair.\n   * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs.\n   * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array.\n   */\n  observableProto.pairwise = function () {\n    return new PairwiseObservable(this);\n  };\n\n  /**\n   * Returns two observables which partition the observations of the source by the given function.\n   * The first will trigger observations for those values for which the predicate returns true.\n   * The second will trigger observations for those values where the predicate returns false.\n   * The predicate is executed once for each subscribed observer.\n   * Both also propagate all error observations arising from the source and each completes\n   * when the source completes.\n   * @param {Function} predicate\n   *    The function to determine which output Observable will trigger a particular observation.\n   * @returns {Array}\n   *    An array of observables. The first triggers when the predicate returns true,\n   *    and the second triggers when the predicate returns false.\n  */\n  observableProto.partition = function(predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return [\n      this.filter(predicate, thisArg),\n      this.filter(function (x, i, o) { return !fn(x, i, o); })\n    ];\n  };\n\n  /**\n   *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n   *\n   * @example\n   *  var res = observable.groupBy(function (x) { return x.id; });\n   *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n   *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n   * @param {Function} keySelector A function to extract the key for each element.\n   * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n   * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n   */\n  observableProto.groupBy = function (keySelector, elementSelector) {\n    return this.groupByUntil(keySelector, elementSelector, observableNever);\n  };\n\n    /**\n     *  Groups the elements of an observable sequence according to a specified key selector function.\n     *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n     *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n     *\n     * @example\n     *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n     *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n     *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n     * @param {Function} keySelector A function to extract the key for each element.\n     * @param {Function} durationSelector A function to signal the expiration of a group.\n     * @returns {Observable}\n     *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n     *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n     *\n     */\n    observableProto.groupByUntil = function (keySelector, elementSelector, durationSelector) {\n      var source = this;\n      return new AnonymousObservable(function (o) {\n        var map = new Map(),\n          groupDisposable = new CompositeDisposable(),\n          refCountDisposable = new RefCountDisposable(groupDisposable),\n          handleError = function (e) { return function (item) { item.onError(e); }; };\n\n        groupDisposable.add(\n          source.subscribe(function (x) {\n            var key = tryCatch(keySelector)(x);\n            if (key === errorObj) {\n              map.forEach(handleError(key.e));\n              return o.onError(key.e);\n            }\n\n            var fireNewMapEntry = false, writer = map.get(key);\n            if (writer === undefined) {\n              writer = new Subject();\n              map.set(key, writer);\n              fireNewMapEntry = true;\n            }\n\n            if (fireNewMapEntry) {\n              var group = new GroupedObservable(key, writer, refCountDisposable),\n                durationGroup = new GroupedObservable(key, writer);\n              var duration = tryCatch(durationSelector)(durationGroup);\n              if (duration === errorObj) {\n                map.forEach(handleError(duration.e));\n                return o.onError(duration.e);\n              }\n\n              o.onNext(group);\n\n              var md = new SingleAssignmentDisposable();\n              groupDisposable.add(md);\n\n              md.setDisposable(duration.take(1).subscribe(\n                noop,\n                function (e) {\n                  map.forEach(handleError(e));\n                  o.onError(e);\n                },\n                function () {\n                  if (map['delete'](key)) { writer.onCompleted(); }\n                  groupDisposable.remove(md);\n                }));\n            }\n\n            var element = x;\n            if (isFunction(elementSelector)) {\n              element = tryCatch(elementSelector)(x);\n              if (element === errorObj) {\n                map.forEach(handleError(element.e));\n                return o.onError(element.e);\n              }\n            }\n\n            writer.onNext(element);\n        }, function (e) {\n          map.forEach(handleError(e));\n          o.onError(e);\n        }, function () {\n          map.forEach(function (item) { item.onCompleted(); });\n          o.onCompleted();\n        }));\n\n      return refCountDisposable;\n    }, source);\n  };\n\n  var UnderlyingObservable = (function (__super__) {\n    inherits(UnderlyingObservable, __super__);\n    function UnderlyingObservable(m, u) {\n      this._m = m;\n      this._u = u;\n      __super__.call(this);\n    }\n\n    UnderlyingObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(this._m.getDisposable(), this._u.subscribe(o));\n    };\n\n    return UnderlyingObservable;\n  }(ObservableBase));\n\n  var GroupedObservable = (function (__super__) {\n    inherits(GroupedObservable, __super__);\n    function GroupedObservable(key, underlyingObservable, mergedDisposable) {\n      __super__.call(this);\n      this.key = key;\n      this.underlyingObservable = !mergedDisposable ?\n        underlyingObservable :\n        new UnderlyingObservable(mergedDisposable, underlyingObservable);\n    }\n\n    GroupedObservable.prototype._subscribe = function (o) {\n      return this.underlyingObservable.subscribe(o);\n    };\n\n    return GroupedObservable;\n  }(Observable));\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite-coincidence-compat/package.json",
    "content": "{\n  \"name\": \"rx-lite-coincidence-compat\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Async\",\n  \"description\": \"Lightweight older browser compatible library with coincidence functions for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.coincidence.compat.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.coincidence.compat.js\"\n  },\n  \"dependencies\": {\n    \"rx-lite-compat\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.coincidence.compat.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-coincidence-compat/readme.md",
    "content": "# RxJS Coincidence Compat Module #\n\nThe Reactive Extensions for JavaScript has a set of coincidence-based operators such as `join` and `groupJoin` which allow one to correlate two observable sequences much as you would do in SQL.  There is also support for advanced windowing and bufferring capabilities which allow for the specification of opening and closing observable sequences to denote how much data to capture.  This requires `rx.lite.compat.js` from the [`rx-lite-compat`](https://www.npmjs.com/package/rx-lite) NPM module.  This module has support for older browsers which do not support ES5 functionality, hence the name `compat`.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-coincidence-compat\n$ npm install -g rx-lite-coincidence-compat\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-coincidence-compat');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.compat.js\"></script>\n<script src=\"path/to/rx.lite.coincidence.compat.js\"></script>\n```\n\n## Included Observable Operators ##\n\n## `Observable Instance Methods`\n- [`buffer`](../../doc/api/core/operators/buffer.md)\n- [`groupBy`](../../doc/api/core/operators/groupby.md)\n- [`groupByUntil`](../../doc/api/core/operators/groupbyuntil.md)\n- [`groupJoin`](../../doc/api/core/operators/groupjoin.md)\n- [`join`](../../doc/api/core/operators/join.md)\n- [`pairwise`](../../doc/api/core/operators/pairwise.md)\n- [`partition`](../../doc/api/core/operators/partition.md)\n- [`window`](../../doc/api/core/operators/window.md)\n\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-coincidence-compat/rx.lite.coincidence.compat.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite.compat'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite-compat'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  var Observable = Rx.Observable,\n    ObservableBase = Rx.ObservableBase,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    Subject = Rx.Subject,\n    observableProto = Observable.prototype,\n    observableEmpty = Observable.empty,\n    observableNever = Observable.never,\n    AnonymousObservable = Rx.AnonymousObservable,\n    addRef = Rx.internals.addRef,\n    inherits = Rx.internals.inherits,\n    bindCallback = Rx.internals.bindCallback,\n    noop = Rx.helpers.noop,\n    isPromise = Rx.helpers.isPromise,\n    isFunction = Rx.helpers.isFunction,\n    observableFromPromise = Observable.fromPromise;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  var Map = root.Map || (function () {\n    function Map() {\n      this.size = 0;\n      this._values = [];\n      this._keys = [];\n    }\n\n    Map.prototype['delete'] = function (key) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) { return false; }\n      this._values.splice(i, 1);\n      this._keys.splice(i, 1);\n      this.size--;\n      return true;\n    };\n\n    Map.prototype.get = function (key) {\n      var i = this._keys.indexOf(key);\n      return i === -1 ? undefined : this._values[i];\n    };\n\n    Map.prototype.set = function (key, value) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) {\n        this._keys.push(key);\n        this._values.push(value);\n        this.size++;\n      } else {\n        this._values[i] = value;\n      }\n      return this;\n    };\n\n    Map.prototype.forEach = function (cb, thisArg) {\n      for (var i = 0; i < this.size; i++) {\n        cb.call(thisArg, this._values[i], this._keys[i]);\n      }\n    };\n\n    return Map;\n  }());\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters passed to the function correspond with the elements from the left and right source sequences for which overlap occurs.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.join = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable();\n      var leftDone = false, rightDone = false;\n      var leftId = 0, rightId = 0;\n      var leftMap = new Map(), rightMap = new Map();\n      var handleError = function (e) { o.onError(e); };\n\n      group.add(left.subscribe(\n        function (value) {\n          var id = leftId++, md = new SingleAssignmentDisposable();\n\n          leftMap.set(id, value);\n          group.add(md);\n\n          var duration = tryCatch(leftDurationSelector)(value);\n          if (duration === errorObj) { return o.onError(duration.e); }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            handleError,\n            function () {\n              leftMap['delete'](id) && leftMap.size === 0 && leftDone && o.onCompleted();\n              group.remove(md);\n            }));\n\n          rightMap.forEach(function (v) {\n            var result = tryCatch(resultSelector)(value, v);\n            if (result === errorObj) { return o.onError(result.e); }\n            o.onNext(result);\n          });\n        },\n        handleError,\n        function () {\n          leftDone = true;\n          (rightDone || leftMap.size === 0) && o.onCompleted();\n        })\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++, md = new SingleAssignmentDisposable();\n\n          rightMap.set(id, value);\n          group.add(md);\n\n          var duration = tryCatch(rightDurationSelector)(value);\n          if (duration === errorObj) { return o.onError(duration.e); }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            handleError,\n            function () {\n              rightMap['delete'](id) && rightMap.size === 0 && rightDone && o.onCompleted();\n              group.remove(md);\n            }));\n\n          leftMap.forEach(function (v) {\n            var result = tryCatch(resultSelector)(v, value);\n            if (result === errorObj) { return o.onError(result.e); }\n            o.onNext(result);\n          });\n        },\n        handleError,\n        function () {\n          rightDone = true;\n          (leftDone || rightMap.size === 0) && o.onCompleted();\n        })\n      );\n      return group;\n    }, left);\n  };\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations, and groups the results.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. The first parameter passed to the function is an element of the left sequence. The second parameter passed to the function is an observable sequence with elements from the right sequence that overlap with the left sequence's element.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.groupJoin = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable();\n      var r = new RefCountDisposable(group);\n      var leftMap = new Map(), rightMap = new Map();\n      var leftId = 0, rightId = 0;\n      var handleError = function (e) { return function (v) { v.onError(e); }; };\n\n      function handleError(e) { };\n\n      group.add(left.subscribe(\n        function (value) {\n          var s = new Subject();\n          var id = leftId++;\n          leftMap.set(id, s);\n\n          var result = tryCatch(resultSelector)(value, addRef(s, r));\n          if (result === errorObj) {\n            leftMap.forEach(handleError(result.e));\n            return o.onError(result.e);\n          }\n          o.onNext(result);\n\n          rightMap.forEach(function (v) { s.onNext(v); });\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var duration = tryCatch(leftDurationSelector)(value);\n          if (duration === errorObj) {\n            leftMap.forEach(handleError(duration.e));\n            return o.onError(duration.e);\n          }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.forEach(handleError(e));\n              o.onError(e);\n            },\n            function () {\n              leftMap['delete'](id) && s.onCompleted();\n              group.remove(md);\n            }));\n        },\n        function (e) {\n          leftMap.forEach(handleError(e));\n          o.onError(e);\n        },\n        function () { o.onCompleted(); })\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++;\n          rightMap.set(id, value);\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var duration = tryCatch(rightDurationSelector)(value);\n          if (duration === errorObj) {\n            leftMap.forEach(handleError(duration.e));\n            return o.onError(duration.e);\n          }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.forEach(handleError(e));\n              o.onError(e);\n            },\n            function () {\n              rightMap['delete'](id);\n              group.remove(md);\n            }));\n\n          leftMap.forEach(function (v) { v.onNext(value); });\n        },\n        function (e) {\n          leftMap.forEach(handleError(e));\n          o.onError(e);\n        })\n      );\n\n      return r;\n    }, left);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers.\n   *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n   *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n   *  @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.buffer = function () {\n    return this.window.apply(this, arguments)\n      .flatMap(toArray);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows.\n   *\n   *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n   *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n   *  @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.window = function (windowOpeningsOrClosingSelector, windowClosingSelector) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'function') {\n      return observableWindowWithBoundaries.call(this, windowOpeningsOrClosingSelector);\n    }\n    return typeof windowOpeningsOrClosingSelector === 'function' ?\n      observableWindowWithClosingSelector.call(this, windowOpeningsOrClosingSelector) :\n      observableWindowWithOpenings.call(this, windowOpeningsOrClosingSelector, windowClosingSelector);\n  };\n\n  function observableWindowWithOpenings(windowOpenings, windowClosingSelector) {\n    return windowOpenings.groupJoin(this, windowClosingSelector, observableEmpty, function (_, win) {\n      return win;\n    });\n  }\n\n  function observableWindowWithBoundaries(windowBoundaries) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var win = new Subject(),\n        d = new CompositeDisposable(),\n        r = new RefCountDisposable(d);\n\n      observer.onNext(addRef(win, r));\n\n      d.add(source.subscribe(function (x) {\n        win.onNext(x);\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      isPromise(windowBoundaries) && (windowBoundaries = observableFromPromise(windowBoundaries));\n\n      d.add(windowBoundaries.subscribe(function (w) {\n        win.onCompleted();\n        win = new Subject();\n        observer.onNext(addRef(win, r));\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      return r;\n    }, source);\n  }\n\n  function observableWindowWithClosingSelector(windowClosingSelector) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        r = new RefCountDisposable(d),\n        win = new Subject();\n      observer.onNext(addRef(win, r));\n      d.add(source.subscribe(function (x) {\n          win.onNext(x);\n      }, function (err) {\n          win.onError(err);\n          observer.onError(err);\n      }, function () {\n          win.onCompleted();\n          observer.onCompleted();\n      }));\n\n      function createWindowClose () {\n        var windowClose;\n        try {\n          windowClose = windowClosingSelector();\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n\n        isPromise(windowClose) && (windowClose = observableFromPromise(windowClose));\n\n        var m1 = new SingleAssignmentDisposable();\n        m.setDisposable(m1);\n        m1.setDisposable(windowClose.take(1).subscribe(noop, function (err) {\n          win.onError(err);\n          observer.onError(err);\n        }, function () {\n          win.onCompleted();\n          win = new Subject();\n          observer.onNext(addRef(win, r));\n          createWindowClose();\n        }));\n      }\n\n      createWindowClose();\n      return r;\n    }, source);\n  }\n\n  var PairwiseObservable = (function (__super__) {\n    inherits(PairwiseObservable, __super__);\n    function PairwiseObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    PairwiseObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new PairwiseObserver(o));\n    };\n\n    return PairwiseObservable;\n  }(ObservableBase));\n\n  var PairwiseObserver = (function(__super__) {\n    inherits(PairwiseObserver, __super__);\n    function PairwiseObserver(o) {\n      this._o = o;\n      this._p = null;\n      this._hp = false;\n      __super__.call(this);\n    }\n\n    PairwiseObserver.prototype.next = function (x) {\n      if (this._hp) {\n        this._o.onNext([this._p, x]);\n      } else {\n        this._hp = true;\n      }\n      this._p = x;\n    };\n    PairwiseObserver.prototype.error = function (err) { this._o.onError(err); };\n    PairwiseObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return PairwiseObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns a new observable that triggers on the second and subsequent triggerings of the input observable.\n   * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair.\n   * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs.\n   * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array.\n   */\n  observableProto.pairwise = function () {\n    return new PairwiseObservable(this);\n  };\n\n  /**\n   * Returns two observables which partition the observations of the source by the given function.\n   * The first will trigger observations for those values for which the predicate returns true.\n   * The second will trigger observations for those values where the predicate returns false.\n   * The predicate is executed once for each subscribed observer.\n   * Both also propagate all error observations arising from the source and each completes\n   * when the source completes.\n   * @param {Function} predicate\n   *    The function to determine which output Observable will trigger a particular observation.\n   * @returns {Array}\n   *    An array of observables. The first triggers when the predicate returns true,\n   *    and the second triggers when the predicate returns false.\n  */\n  observableProto.partition = function(predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return [\n      this.filter(predicate, thisArg),\n      this.filter(function (x, i, o) { return !fn(x, i, o); })\n    ];\n  };\n\n  /**\n   *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n   *\n   * @example\n   *  var res = observable.groupBy(function (x) { return x.id; });\n   *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n   *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n   * @param {Function} keySelector A function to extract the key for each element.\n   * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n   * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n   */\n  observableProto.groupBy = function (keySelector, elementSelector) {\n    return this.groupByUntil(keySelector, elementSelector, observableNever);\n  };\n\n    /**\n     *  Groups the elements of an observable sequence according to a specified key selector function.\n     *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n     *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n     *\n     * @example\n     *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n     *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n     *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n     * @param {Function} keySelector A function to extract the key for each element.\n     * @param {Function} durationSelector A function to signal the expiration of a group.\n     * @returns {Observable}\n     *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n     *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n     *\n     */\n    observableProto.groupByUntil = function (keySelector, elementSelector, durationSelector) {\n      var source = this;\n      return new AnonymousObservable(function (o) {\n        var map = new Map(),\n          groupDisposable = new CompositeDisposable(),\n          refCountDisposable = new RefCountDisposable(groupDisposable),\n          handleError = function (e) { return function (item) { item.onError(e); }; };\n\n        groupDisposable.add(\n          source.subscribe(function (x) {\n            var key = tryCatch(keySelector)(x);\n            if (key === errorObj) {\n              map.forEach(handleError(key.e));\n              return o.onError(key.e);\n            }\n\n            var fireNewMapEntry = false, writer = map.get(key);\n            if (writer === undefined) {\n              writer = new Subject();\n              map.set(key, writer);\n              fireNewMapEntry = true;\n            }\n\n            if (fireNewMapEntry) {\n              var group = new GroupedObservable(key, writer, refCountDisposable),\n                durationGroup = new GroupedObservable(key, writer);\n              var duration = tryCatch(durationSelector)(durationGroup);\n              if (duration === errorObj) {\n                map.forEach(handleError(duration.e));\n                return o.onError(duration.e);\n              }\n\n              o.onNext(group);\n\n              var md = new SingleAssignmentDisposable();\n              groupDisposable.add(md);\n\n              md.setDisposable(duration.take(1).subscribe(\n                noop,\n                function (e) {\n                  map.forEach(handleError(e));\n                  o.onError(e);\n                },\n                function () {\n                  if (map['delete'](key)) { writer.onCompleted(); }\n                  groupDisposable.remove(md);\n                }));\n            }\n\n            var element = x;\n            if (isFunction(elementSelector)) {\n              element = tryCatch(elementSelector)(x);\n              if (element === errorObj) {\n                map.forEach(handleError(element.e));\n                return o.onError(element.e);\n              }\n            }\n\n            writer.onNext(element);\n        }, function (e) {\n          map.forEach(handleError(e));\n          o.onError(e);\n        }, function () {\n          map.forEach(function (item) { item.onCompleted(); });\n          o.onCompleted();\n        }));\n\n      return refCountDisposable;\n    }, source);\n  };\n\n  var UnderlyingObservable = (function (__super__) {\n    inherits(UnderlyingObservable, __super__);\n    function UnderlyingObservable(m, u) {\n      this._m = m;\n      this._u = u;\n      __super__.call(this);\n    }\n\n    UnderlyingObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(this._m.getDisposable(), this._u.subscribe(o));\n    };\n\n    return UnderlyingObservable;\n  }(ObservableBase));\n\n  var GroupedObservable = (function (__super__) {\n    inherits(GroupedObservable, __super__);\n    function GroupedObservable(key, underlyingObservable, mergedDisposable) {\n      __super__.call(this);\n      this.key = key;\n      this.underlyingObservable = !mergedDisposable ?\n        underlyingObservable :\n        new UnderlyingObservable(mergedDisposable, underlyingObservable);\n    }\n\n    GroupedObservable.prototype._subscribe = function (o) {\n      return this.underlyingObservable.subscribe(o);\n    };\n\n    return GroupedObservable;\n  }(Observable));\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite-compat/package.json",
    "content": "{\n  \"name\": \"rx-lite-compat\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Lite\",\n  \"description\": \"Lightweight IE6 compatible library for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.compat.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.compat.js\"\n  },\n  \"dependencies\": {},\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.compat.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-compat/readme.md",
    "content": "# RxJS Lite Compatible Module #\n\nThe Reactive Extensions for JavaScript Lite version is a lightweight version of the Reactive Extensions for JavaScript which covers most of the day to day operators you might use all in a single library.  Functionality such as bridging to events, promises, callbacks, Node.js-style callbacks, time-based operations and more are built right in.  This comes with `rx.lite.compat.js` which has backwards compatibility to browsers which do not support all required ES5 features.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS. The files are available on [cdnjs](http://cdnjs.com/libraries/rxjs/) and [jsDelivr](http://www.jsdelivr.com/#!rxjs).\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-compat\n$ npm install -g rx-lite-compat\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-compat');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.compat.js\"></script>\n```\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`catch | catchException`](../../doc/api/core/operators/catch.md)\n- [`concat`](../../doc/api/core/operators/concat.md)\n- [`create | createWithDisposable`](../../doc/api/core/operators/create.md)\n- [`defer`](../../doc/api/core/operators/defer.md)\n- [`empty`](../../doc/api/core/operators/empty.md)\n- [`from`](../../doc/api/core/operators/from.md)\n- [`fromArray`](../../doc/api/core/operators/fromarray.md)\n- [`fromCallback`](../../doc/api/core/operators/fromcallback.md)\n- [`fromEvent`](../../doc/api/core/operators/fromevent.md)\n- [`fromEventPattern`](../../doc/api/core/operators/fromeventpattern.md)\n- [`fromNodeCallback`](../../doc/api/core/operators/fromnodecallback.md)\n- [`fromPromise`](../../doc/api/core/operators/frompromise.md)\n- [`interval`](../../doc/api/core/operators/interval.md)\n- [`just`](../../doc/api/core/operators/return.md)\n- [`merge`](../../doc/api/core/operators/merge.md)\n- [`mergeDelayError`](../../doc/api/core/operators/mergedelayerror.md)\n- [`never`](../../doc/api/core/operators/never.md)\n- [`of`](../../doc/api/core/operators/of.md)\n- [`ofWithScheduler`](../../doc/api/core/operators/ofwithscheduler.md)\n- [`range`](../../doc/api/core/operators/range.md)\n- [`repeat`](../../doc/api/core/operators/repeat.md)\n- [`return | returnValue`](../../doc/api/core/operators/return.md)\n- [`throw | throwError | throwException`](../../doc/api/core/operators/throw.md)\n- [`timer`](../../doc/api/core/operators/timer.md)\n- [`zip`](../../doc/api/core/operators/zip.md)\n- [`zipArray`](../../doc/api/core/operators/ziparray.md)\n\n### `Observable Instance Methods`\n- [`asObservable`](../../doc/api/core/operators/asobservable.md)\n- [`catch | catchException`](../../doc/api/core/operators/catchproto.md)\n- [`combineLatest`](../../doc/api/core/operators/combinelatest.md)\n- [`concat`](../../doc/api/core/operators/concatproto.md)\n- [`concatMap`](../../doc/api/core/operators/concatmap.md)\n- [`connect`](../../doc/api/core/operators/connect.md)\n- [`debounce`](../../doc/api/core/operators/debounce.md)  \n- [`defaultIfEmpty`](../../doc/api/core/operators/defaultifempty.md)\n- [`delay`](../../doc/api/core/operators/delay.md)\n- [`dematerialize`](../../doc/api/core/operators/dematerialize.md)\n- [`distinctUntilChanged`](../../doc/api/core/operators/distinctuntilchanged.md)\n- [`do | doAction`](../../doc/api/core/operators/do.md)\n- [`doOnNext`](../../doc/api/core/operators/doonnext.md)\n- [`doOnError`](../../doc/api/core/operators/doonerror.md)\n- [`doOnCompleted`](../../doc/api/core/operators/dooncompleted.md)\n- [`filter`](../../doc/api/core/operators/where.md)\n- [`finally | finallyAction`](../../doc/api/core/operators/finally.md)\n- [`flatMap`](../../doc/api/core/operators/selectmany.md)\n- [`flatMapLatest`](../../doc/api/core/operators/flatmaplatest.md)\n- [`ignoreElements`](../../doc/api/core/operators/ignoreelements.md)\n- [`map`](../../doc/api/core/operators/select.md)\n- [`merge`](../../doc/api/core/operators/mergeproto.md)\n- [`mergeObservable | mergeAll`](../../doc/api/core/operators/mergeall.md)\n- [`multicast`](../../doc/api/core/operators/multicast.md)\n- [`publish`](../../doc/api/core/operators/publish.md)\n- [`publishLast`](../../doc/api/core/operators/publishlast.md)\n- [`publishValue`](../../doc/api/core/operators/publishvalue.md)\n- [`refCount`](../../doc/api/core/operators/refcount.md)\n- [`repeat`](../../doc/api/core/operators/repeat.md)\n- [`replay`](../../doc/api/core/operators/replay.md)\n- [`retry`](../../doc/api/core/operators/retry.md)\n- [`retryWhen`](../../doc/api/core/operators/retrywhen.md)\n- [`sample`](../../doc/api/core/operators/sample.md)\n- [`scan`](../../doc/api/core/operators/scan.md)\n- [`select`](../../doc/api/core/operators/select.md)\n- [`selectConcat`](../../doc/api/core/operators/concatmap.md)\n- [`selectMany`](../../doc/api/core/operators/selectmany.md)\n- [`selectSwitch`](../../doc/api/core/operators/flatmaplatest.md)\n- [`singleInstance`](../../doc/api/core/operators/singleinstance.md)\n- [`skip`](../../doc/api/core/operators/skip.md)\n- [`skipLast`](../../doc/api/core/operators/skiplast.md)\n- [`skipUntil`](../../doc/api/core/operators/skipuntil.md)\n- [`skipWhile`](../../doc/api/core/operators/skipwhile.md)\n- [`startWith`](../../doc/api/core/operators/startwith.md)\n- [`subscribe | forEach`](../../doc/api/core/operators/subscribe.md)\n- [`subscribeOnNext`](../../doc/api/core/operators/subscribeonnext.md)\n- [`subscribeOnError`](../../doc/api/core/operators/subscribeonerror.md)\n- [`subscribeOnCompleted`](../../doc/api/core/operators/subscribeoncompleted.md)\n- [`switch | switchLatest`](../../doc/api/core/operators/switch.md)\n- [`take`](../../doc/api/core/operators/take.md)\n- [`takeLast`](../../doc/api/core/operators/takelast.md)\n- [`takeUntil`](../../doc/api/core/operators/takeuntil.md)\n- [`takeWhile`](../../doc/api/core/operators/takewhile.md)\n- [`tap`](../../doc/api/core/operators/do.md)\n- [`tapOnNext`](../../doc/api/core/operators/doonnext.md)\n- [`tapOnError`](../../doc/api/core/operators/doonerror.md)\n- [`tapOnCompleted`](../../doc/api/core/operators/dooncompleted.md)\n- [`throttle`](../../doc/api/core/operators/throttle.md)\n- [`throttle`](../../doc/api/core/operators/throttle.md)\n- [`timeout`](../../doc/api/core/operators/timeout.md)\n- [`timestamp`](../../doc/api/core/operators/timestamp.md)\n- [`toArray`](../../doc/api/core/operators/toarray.md)\n- [`transduce`](../../doc/api/core/operators/transduce.md)\n- [`where`](../../doc/api/core/operators/where.md)\n- [`withLatestFrom`](../../doc/api/core/operators/withlatestfrom.md)\n- [`zip`](../../doc/api/core/operators/zipproto.md)\n\n## Included Classes ##\n\n### Core Objects\n- [`Rx.Observer`](../../doc/api/core/observer.md)\n- [`Rx.Notification`](../../doc/api/core/notification.md)\n\n### Subjects\n\n- [`Rx.AsyncSubject`](../../doc/api/subjects/asyncsubject.md)\n- [`Rx.BehaviorSubject`](../../doc/api/subjects/behaviorsubject.md)\n- [`Rx.ReplaySubject`](../../doc/api/subjects/replaysubject.md)\n- [`Rx.Subject`](../../doc/api/subjects/subject.md)\n\n### Schedulers\n\n- [`Rx.Scheduler`](../../doc/api/schedulers/scheduler.md)\n\n### Disposables\n\n- [`Rx.CompositeDisposable`](../../doc/api/disposables/compositedisposable.md)\n- [`Rx.Disposable`](../../doc/api/disposables/disposable.md)\n- [`Rx.RefCountDisposable`](../../doc/api/disposables/refcountdisposable.md)\n- [`Rx.SerialDisposable`](../../doc/api/disposables/serialdisposable.md)\n- [`Rx.SingleAssignmentDisposable`](../../doc/api/disposables/singleassignmentdisposable.md)\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-compat/rx.lite.compat.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (undefined) {\n\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  var Rx = {\n    internals: {},\n    config: {\n      Promise: root.Promise\n    },\n    helpers: { }\n  };\n\n  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    defaultNow = Rx.helpers.defaultNow = (function () { return !!Date.now ? Date.now : function () { return +new Date; }; }()),\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.subscribe !== 'function' && typeof p.then === 'function'; },\n    isFunction = Rx.helpers.isFunction = (function () {\n\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      };\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n\n      return isFn;\n    }());\n\n    function cloneArray(arr) {\n      var len = arr.length, a = new Array(len);\n      for(var i = 0; i < len; i++) { a[i] = arr[i]; }\n      return a;\n    }\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  Rx.config.longStackSupport = false;\n  var hasStacks = false, stacks = tryCatch(function () { throw new Error(); })();\n  hasStacks = !!stacks.e && !!stacks.e.stack;\n\n  // All code after this point will be filtered from stack traces reported by RxJS\n  var rStartingLine = captureLine(), rFileName;\n\n  var STACK_JUMP_SEPARATOR = 'From previous event:';\n\n  function makeStackTraceLong(error, observable) {\n    // If possible, transform the error stack trace by removing Node and RxJS\n    // cruft, then concatenating with the stack trace of `observable`.\n    if (hasStacks &&\n        observable.stack &&\n        typeof error === 'object' &&\n        error !== null &&\n        error.stack &&\n        error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n    ) {\n      var stacks = [];\n      for (var o = observable; !!o; o = o.source) {\n        if (o.stack) {\n          stacks.unshift(o.stack);\n        }\n      }\n      stacks.unshift(error.stack);\n\n      var concatedStacks = stacks.join('\\n' + STACK_JUMP_SEPARATOR + '\\n');\n      error.stack = filterStackString(concatedStacks);\n    }\n  }\n\n  function filterStackString(stackString) {\n    var lines = stackString.split('\\n'), desiredLines = [];\n    for (var i = 0, len = lines.length; i < len; i++) {\n      var line = lines[i];\n\n      if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n        desiredLines.push(line);\n      }\n    }\n    return desiredLines.join('\\n');\n  }\n\n  function isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n    if (!fileNameAndLineNumber) {\n      return false;\n    }\n    var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === rFileName &&\n      lineNumber >= rStartingLine &&\n      lineNumber <= rEndingLine;\n  }\n\n  function isNodeFrame(stackLine) {\n    return stackLine.indexOf('(module.js:') !== -1 ||\n      stackLine.indexOf('(node.js:') !== -1;\n  }\n\n  function captureLine() {\n    if (!hasStacks) { return; }\n\n    try {\n      throw new Error();\n    } catch (e) {\n      var lines = e.stack.split('\\n');\n      var firstLine = lines[0].indexOf('@') > 0 ? lines[1] : lines[2];\n      var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n      if (!fileNameAndLineNumber) { return; }\n\n      rFileName = fileNameAndLineNumber[0];\n      return fileNameAndLineNumber[1];\n    }\n  }\n\n  function getFileNameAndLineNumber(stackLine) {\n    // Named functions: 'at functionName (filename:lineNumber:columnNumber)'\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }\n\n    // Anonymous functions: 'at filename:lineNumber:columnNumber'\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }\n\n    // Firefox style: 'function@filename:lineNumber or @filename:lineNumber'\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }\n  }\n\n  // Utilities\n  var toString = Object.prototype.toString;\n  var arrayClass = '[object Array]',\n      funcClass = '[object Function]',\n      stringClass = '[object String]';\n\n  if (!Array.prototype.forEach) {\n    Array.prototype.forEach = function (callback, thisArg) {\n      var T, k;\n\n      if (this == null) {\n        throw new TypeError(' this is null or not defined');\n      }\n\n      var O = Object(this);\n      var len = O.length >>> 0;\n\n      if (typeof callback !== 'function') {\n        throw new TypeError(callback + ' is not a function');\n      }\n\n      if (arguments.length > 1) {\n        T = thisArg;\n      }\n\n      k = 0;\n      while (k < len) {\n        var kValue;\n        if (k in O) {\n          kValue = O[k];\n          callback.call(T, kValue, k, O);\n        }\n        k++;\n      }\n    };\n  }\n\n  var boxedString = Object('a'),\n      splitString = boxedString[0] !== 'a' || !(0 in boxedString);\n  if (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n      var object = Object(this),\n        self = splitString && toString.call(this) === stringClass ?\n          this.split('') :\n          object,\n        length = self.length >>> 0,\n        thisp = arguments[1];\n\n      if (toString.call(fun) !== funcClass) {\n        throw new TypeError(fun + ' is not a function');\n      }\n\n      for (var i = 0; i < length; i++) {\n        if (i in self && !fun.call(thisp, self[i], i, object)) {\n          return false;\n        }\n      }\n      return true;\n    };\n  }\n\n  if (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n      var object = Object(this),\n        self = splitString && toString.call(this) === stringClass ?\n            this.split('') :\n            object,\n        length = self.length >>> 0,\n        result = new Array(length),\n        thisp = arguments[1];\n\n      if (toString.call(fun) !== funcClass) {\n        throw new TypeError(fun + ' is not a function');\n      }\n\n      for (var i = 0; i < length; i++) {\n        if (i in self) {\n          result[i] = fun.call(thisp, self[i], i, object);\n        }\n      }\n      return result;\n    };\n  }\n\n  if (!Array.prototype.filter) {\n    Array.prototype.filter = function (predicate) {\n      var results = [], item, t = new Object(this);\n      for (var i = 0, len = t.length >>> 0; i < len; i++) {\n        item = t[i];\n        if (i in t && predicate.call(arguments[1], item, i, t)) {\n          results.push(item);\n        }\n      }\n      return results;\n    };\n  }\n\n  if (!Array.isArray) {\n    Array.isArray = function (arg) {\n      return toString.call(arg) === arrayClass;\n    };\n  }\n\n  if (!Array.prototype.indexOf) {\n    Array.prototype.indexOf = function indexOf(searchElement) {\n      var t = Object(this);\n      var len = t.length >>> 0;\n      if (len === 0) {\n        return -1;\n      }\n      var n = 0;\n      if (arguments.length > 1) {\n        n = Number(arguments[1]);\n        if (n !== n) {\n          n = 0;\n        } else if (n !== 0 && n !== Infinity && n !== -Infinity) {\n          n = (n > 0 || -1) * Math.floor(Math.abs(n));\n        }\n      }\n      if (n >= len) {\n        return -1;\n      }\n      var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);\n      for (; k < len; k++) {\n        if (k in t && t[k] === searchElement) {\n          return k;\n        }\n      }\n      return -1;\n    };\n  }\n\n  // Fix for Tessel\n  if (!Object.prototype.propertyIsEnumerable) {\n    Object.prototype.propertyIsEnumerable = function (key) {\n      for (var k in this) { if (k === key) { return true; } }\n      return false;\n    };\n  }\n\n  if (!Object.keys) {\n    Object.keys = (function() {\n      'use strict';\n      var hasOwnProperty = Object.prototype.hasOwnProperty,\n      hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString');\n\n      return function(obj) {\n        if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n          throw new TypeError('Object.keys called on non-object');\n        }\n\n        var result = [], prop, i;\n\n        for (prop in obj) {\n          if (hasOwnProperty.call(obj, prop)) {\n            result.push(prop);\n          }\n        }\n\n        if (hasDontEnumBug) {\n          for (i = 0; i < dontEnumsLength; i++) {\n            if (hasOwnProperty.call(obj, dontEnums[i])) {\n              result.push(dontEnums[i]);\n            }\n          }\n        }\n        return result;\n      };\n    }());\n  }\n\n  if (typeof Object.create !== 'function') {\n    // Production steps of ECMA-262, Edition 5, 15.2.3.5\n    // Reference: http://es5.github.io/#x15.2.3.5\n    Object.create = (function() {\n      function Temp() {}\n\n      var hasOwn = Object.prototype.hasOwnProperty;\n\n      return function (O) {\n        if (typeof O !== 'object') {\n          throw new TypeError('Object prototype may only be an Object or null');\n        }\n\n        Temp.prototype = O;\n        var obj = new Temp();\n        Temp.prototype = null;\n\n        if (arguments.length > 1) {\n          // Object.defineProperties does ToObject on its first argument.\n          var Properties = Object(arguments[1]);\n          for (var prop in Properties) {\n            if (hasOwn.call(Properties, prop)) {\n              obj[prop] = Properties[prop];\n            }\n          }\n        }\n\n        // 5. Return obj\n        return obj;\n      };\n    })();\n  }\n\n  root.Element && root.Element.prototype.attachEvent && !root.Element.prototype.addEventListener && (function () {\n    function addMethod(name, fn) {\n      Window.prototype[name] = HTMLDocument.prototype[name] = Element.prototype[name] = fn;\n    }\n\n    addMethod('addEventListener', function (type, listener) {\n      var target = this;\n      var listeners = target._c1_listeners = target._c1_listeners || {};\n      var typeListeners = listeners[type] = listeners[type] || [];\n\n      target.attachEvent('on' + type, typeListeners.event = function (e) {\n        e || (e = root.event);\n\n        var documentElement = target.document &&\n          target.document.documentElement ||\n          target.documentElement ||\n          { scrollLeft: 0, scrollTop: 0 };\n\n        e.currentTarget = target;\n        e.pageX = e.clientX + documentElement.scrollLeft;\n        e.pageY = e.clientY + documentElement.scrollTop;\n\n        e.preventDefault = function () {\n          e.bubbledKeyCode = e.keyCode;\n          if (e.ctrlKey) {\n            try {\n              e.keyCode = 0;\n            } catch (e) { }\n          }\n          e.defaultPrevented = true;\n          e.returnValue = false;\n          e.modified = true;\n          e.returnValue = false;\n        };\n\n        e.stopImmediatePropagation = function () {\n          immediatePropagation = false;\n          e.cancelBubble = true;\n        };\n\n        e.stopPropagation = function () {\n          e.cancelBubble = true;\n        };\n\n        e.relatedTarget = e.fromElement || null;\n        e.target = e.srcElement || target;\n        e.timeStamp = +new Date();\n\n        // Normalize key events\n        switch(e.type) {\n          case 'keypress':\n            var c = ('charCode' in e ? e.charCode : e.keyCode);\n            if (c === 10) {\n              c = 0;\n              e.keyCode = 13;\n            } else if (c === 13 || c === 27) {\n              c = 0;\n            } else if (c === 3) {\n              c = 99;\n            }\n            e.charCode = c;\n            e.keyChar = e.charCode ? String.fromCharCode(e.charCode) : '';\n            break;\n        }\n\n        var copiedEvent = {};\n        for (var prop in e) {\n          copiedEvent[prop] = e[prop];\n        }\n\n        for (var i = 0, typeListenersCache = [].concat(typeListeners), typeListenerCache, immediatePropagation = true; immediatePropagation && (typeListenerCache = typeListenersCache[i]); ++i) {\n          for (var ii = 0, typeListener; typeListener = typeListeners[ii]; ++ii) {\n            if (typeListener === typeListenerCache) { typeListener.call(target, copiedEvent); break; }\n          }\n        }\n      });\n\n      typeListeners.push(listener);\n    });\n\n    addMethod('removeEventListener', function (type, listener) {\n      var target = this;\n      var listeners = target._c1_listeners = target._c1_listeners || {};\n      var typeListeners = listeners[type] = listeners[type] || [];\n\n      for (var i = typeListeners.length - 1, typeListener; typeListener = typeListeners[i]; --i) {\n        if (typeListener === listener) { typeListeners.splice(i, 1); break; }\n      }\n\n      !typeListeners.length &&\n        typeListeners.event &&\n        target.detachEvent('on' + type, typeListeners.event);\n    });\n\n    addMethod('dispatchEvent', function (e) {\n      var target = this;\n      var type = e.type;\n      var listeners = target._c1_listeners = target._c1_listeners || {};\n      var typeListeners = listeners[type] = listeners[type] || [];\n\n      try {\n        return target.fireEvent('on' + type, e);\n      } catch (err) {\n        return typeListeners.event && typeListeners.event(e);\n      }\n    });\n\n    function ready() {\n      if (ready.interval && document.body) {\n        ready.interval = clearInterval(ready.interval);\n\n        document.dispatchEvent(new CustomEvent('DOMContentLoaded'));\n      }\n    }\n\n    ready.interval = setInterval(ready, 1);\n\n    root.addEventListener('load', ready);\n  }());\n\n  (!root.CustomEvent || typeof root.CustomEvent === 'object') && (function() {\n    function CustomEvent (type, params) {\n      var event;\n      params = params || { bubbles: false, cancelable: false, detail: undefined };\n\n      try {\n        if (document.createEvent) {\n          event = document.createEvent('CustomEvent');\n          event.initCustomEvent(type, params.bubbles, params.cancelable, params.detail);\n        } else if (document.createEventObject) {\n          event = document.createEventObject();\n        }\n      } catch (error) {\n        event = document.createEvent('Event');\n        event.initEvent(type, params.bubbles, params.cancelable);\n        event.detail = params.detail;\n      }\n\n      return event;\n    }\n\n    root.CustomEvent && (CustomEvent.prototype = root.CustomEvent.prototype);\n    root.CustomEvent = CustomEvent;\n  }());\n\n  var EmptyError = Rx.EmptyError = function() {\n    this.message = 'Sequence contains no elements.';\n    Error.call(this);\n  };\n  EmptyError.prototype = Object.create(Error.prototype);\n  EmptyError.prototype.name = 'EmptyError';\n\n  var ObjectDisposedError = Rx.ObjectDisposedError = function() {\n    this.message = 'Object has been disposed';\n    Error.call(this);\n  };\n  ObjectDisposedError.prototype = Object.create(Error.prototype);\n  ObjectDisposedError.prototype.name = 'ObjectDisposedError';\n\n  var ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError = function () {\n    this.message = 'Argument out of range';\n    Error.call(this);\n  };\n  ArgumentOutOfRangeError.prototype = Object.create(Error.prototype);\n  ArgumentOutOfRangeError.prototype.name = 'ArgumentOutOfRangeError';\n\n  var NotSupportedError = Rx.NotSupportedError = function (message) {\n    this.message = message || 'This operation is not supported';\n    Error.call(this);\n  };\n  NotSupportedError.prototype = Object.create(Error.prototype);\n  NotSupportedError.prototype.name = 'NotSupportedError';\n\n  var NotImplementedError = Rx.NotImplementedError = function (message) {\n    this.message = message || 'This operation is not implemented';\n    Error.call(this);\n  };\n  NotImplementedError.prototype = Object.create(Error.prototype);\n  NotImplementedError.prototype.name = 'NotImplementedError';\n\n  var notImplemented = Rx.helpers.notImplemented = function () {\n    throw new NotImplementedError();\n  };\n\n  var notSupported = Rx.helpers.notSupported = function () {\n    throw new NotSupportedError();\n  };\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o && o[$iterator$] !== undefined;\n  };\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  };\n\n  Rx.helpers.iterator = $iterator$;\n\n  var bindCallback = Rx.internals.bindCallback = function (func, thisArg, argCount) {\n    if (typeof thisArg === 'undefined') { return func; }\n    switch(argCount) {\n      case 0:\n        return function() {\n          return func.call(thisArg)\n        };\n      case 1:\n        return function(arg) {\n          return func.call(thisArg, arg);\n        };\n      case 2:\n        return function(value, index) {\n          return func.call(thisArg, value, index);\n        };\n      case 3:\n        return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n    }\n\n    return function() {\n      return func.apply(thisArg, arguments);\n    };\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var dontEnums = ['toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'],\n  dontEnumsLength = dontEnums.length;\n\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\nvar objectProto = Object.prototype,\n    hasOwnProperty = objectProto.hasOwnProperty,\n    objToString = objectProto.toString,\n    MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\nvar keys = Object.keys || (function() {\n    var hasOwnProperty = Object.prototype.hasOwnProperty,\n        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),\n        dontEnums = [\n          'toString',\n          'toLocaleString',\n          'valueOf',\n          'hasOwnProperty',\n          'isPrototypeOf',\n          'propertyIsEnumerable',\n          'constructor'\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    return function(obj) {\n      if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n        throw new TypeError('Object.keys called on non-object');\n      }\n\n      var result = [], prop, i;\n\n      for (prop in obj) {\n        if (hasOwnProperty.call(obj, prop)) {\n          result.push(prop);\n        }\n      }\n\n      if (hasDontEnumBug) {\n        for (i = 0; i < dontEnumsLength; i++) {\n          if (hasOwnProperty.call(obj, dontEnums[i])) {\n            result.push(dontEnums[i]);\n          }\n        }\n      }\n      return result;\n    };\n  }());\n\nfunction equalObjects(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objProps = keys(object),\n      objLength = objProps.length,\n      othProps = keys(other),\n      othLength = othProps.length;\n\n  if (objLength !== othLength && !isLoose) {\n    return false;\n  }\n  var index = objLength, key;\n  while (index--) {\n    key = objProps[index];\n    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  var skipCtor = isLoose;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key],\n        result;\n\n    if (!(result === undefined ? equalFunc(objValue, othValue, isLoose, stackA, stackB) : result)) {\n      return false;\n    }\n    skipCtor || (skipCtor = key === 'constructor');\n  }\n  if (!skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    if (objCtor !== othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor === 'function' && objCtor instanceof objCtor &&\n          typeof othCtor === 'function' && othCtor instanceof othCtor)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction equalByTag(object, other, tag) {\n  switch (tag) {\n    case boolTag:\n    case dateTag:\n      return +object === +other;\n\n    case errorTag:\n      return object.name === other.name && object.message === other.message;\n\n    case numberTag:\n      return (object !== +object) ?\n        other !== +other :\n        object === +other;\n\n    case regexpTag:\n    case stringTag:\n      return object === (other + '');\n  }\n  return false;\n}\n\nvar isObject = Rx.internals.isObject = function(value) {\n  var type = typeof value;\n  return !!value && (type === 'object' || type === 'function');\n};\n\nfunction isObjectLike(value) {\n  return !!value && typeof value === 'object';\n}\n\nfunction isLength(value) {\n  return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nvar isHostObject = (function() {\n  try {\n    Object({ 'toString': 0 } + '');\n  } catch(e) {\n    return function() { return false; };\n  }\n  return function(value) {\n    return typeof value.toString !== 'function' && typeof (value + '') === 'string';\n  };\n}());\n\nfunction isTypedArray(value) {\n  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nvar isArray = Array.isArray || function(value) {\n  return isObjectLike(value) && isLength(value.length) && objToString.call(value) === arrayTag;\n};\n\nfunction arraySome (array, predicate) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction equalArrays(array, other, equalFunc, isLoose, stackA, stackB) {\n  var index = -1,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength !== othLength && !(isLoose && othLength > arrLength)) {\n    return false;\n  }\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index],\n        result;\n\n    if (result !== undefined) {\n      if (result) {\n        continue;\n      }\n      return false;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (isLoose) {\n      if (!arraySome(other, function(othValue) {\n            return arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB);\n          })) {\n        return false;\n      }\n    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB))) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction baseIsEqualDeep(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = arrayTag,\n      othTag = arrayTag;\n\n  if (!objIsArr) {\n    objTag = objToString.call(object);\n    if (objTag === argsTag) {\n      objTag = objectTag;\n    } else if (objTag !== objectTag) {\n      objIsArr = isTypedArray(object);\n    }\n  }\n  if (!othIsArr) {\n    othTag = objToString.call(other);\n    if (othTag === argsTag) {\n      othTag = objectTag;\n    }\n  }\n  var objIsObj = objTag === objectTag && !isHostObject(object),\n      othIsObj = othTag === objectTag && !isHostObject(other),\n      isSameTag = objTag === othTag;\n\n  if (isSameTag && !(objIsArr || objIsObj)) {\n    return equalByTag(object, other, objTag);\n  }\n  if (!isLoose) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, isLoose, stackA, stackB);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  // For more information on detecting circular references see https://es5.github.io/#JO.\n  stackA || (stackA = []);\n  stackB || (stackB = []);\n\n  var length = stackA.length;\n  while (length--) {\n    if (stackA[length] === object) {\n      return stackB[length] === other;\n    }\n  }\n  // Add `object` and `other` to the stack of traversed objects.\n  stackA.push(object);\n  stackB.push(other);\n\n  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, isLoose, stackA, stackB);\n\n  stackA.pop();\n  stackB.pop();\n\n  return result;\n}\n\nfunction baseIsEqual(value, other, isLoose, stackA, stackB) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, baseIsEqual, isLoose, stackA, stackB);\n}\n\nvar isEqual = Rx.internals.isEqual = function (value, other) {\n  return baseIsEqual(value, other);\n};\n\n  var hasProp = {}.hasOwnProperty,\n      slice = Array.prototype.slice;\n\n  var inherits = Rx.internals.inherits = function (child, parent) {\n    function __() { this.constructor = child; }\n    __.prototype = parent.prototype;\n    child.prototype = new __();\n  };\n\n  var addProperties = Rx.internals.addProperties = function (obj) {\n    for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n      var source = sources[idx];\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n  };\n\n  // Rx Utils\n  var addRef = Rx.internals.addRef = function (xs, r) {\n    return new AnonymousObservable(function (observer) {\n      return new BinaryDisposable(r.getDisposable(), xs.subscribe(observer));\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n\n  /**\n   * Represents a group of disposable resources that are disposed together.\n   * @constructor\n   */\n  var CompositeDisposable = Rx.CompositeDisposable = function () {\n    var args = [], i, len;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      len = arguments.length;\n      args = new Array(len);\n      for(i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    this.disposables = args;\n    this.isDisposed = false;\n    this.length = args.length;\n  };\n\n  var CompositeDisposablePrototype = CompositeDisposable.prototype;\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Mixed} item Disposable to add.\n   */\n  CompositeDisposablePrototype.add = function (item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n      this.length++;\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Mixed} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n  CompositeDisposablePrototype.remove = function (item) {\n    var shouldDispose = false;\n    if (!this.isDisposed) {\n      var idx = this.disposables.indexOf(item);\n      if (idx !== -1) {\n        shouldDispose = true;\n        this.disposables.splice(idx, 1);\n        this.length--;\n        item.dispose();\n      }\n    }\n    return shouldDispose;\n  };\n\n  /**\n   *  Disposes all disposables in the group and removes them from the group.\n   */\n  CompositeDisposablePrototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var len = this.disposables.length, currentDisposables = new Array(len);\n      for(var i = 0; i < len; i++) { currentDisposables[i] = this.disposables[i]; }\n      this.disposables = [];\n      this.length = 0;\n\n      for (i = 0; i < len; i++) {\n        currentDisposables[i].dispose();\n      }\n    }\n  };\n\n  /**\n   * Provides a set of static methods for creating Disposables.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   */\n  var Disposable = Rx.Disposable = function (action) {\n    this.isDisposed = false;\n    this.action = action || noop;\n  };\n\n  /** Performs the task of cleaning up resources. */\n  Disposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.action();\n      this.isDisposed = true;\n    }\n  };\n\n  /**\n   * Creates a disposable object that invokes the specified action when disposed.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   * @return {Disposable} The disposable object that runs the given action upon disposal.\n   */\n  var disposableCreate = Disposable.create = function (action) { return new Disposable(action); };\n\n  /**\n   * Gets the disposable that does nothing when disposed.\n   */\n  var disposableEmpty = Disposable.empty = { dispose: noop };\n\n  /**\n   * Validates whether the given object is a disposable\n   * @param {Object} Object to test whether it has a dispose method\n   * @returns {Boolean} true if a disposable object, else false.\n   */\n  var isDisposable = Disposable.isDisposable = function (d) {\n    return d && isFunction(d.dispose);\n  };\n\n  var checkDisposed = Disposable.checkDisposed = function (disposable) {\n    if (disposable.isDisposed) { throw new ObjectDisposedError(); }\n  };\n\n  var disposableFixup = Disposable._fixup = function (result) {\n    return isDisposable(result) ? result : disposableEmpty;\n  };\n\n  // Single assignment\n  var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SingleAssignmentDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SingleAssignmentDisposable.prototype.setDisposable = function (value) {\n    if (this.current) { throw new Error('Disposable has already been assigned'); }\n    var shouldDispose = this.isDisposed;\n    !shouldDispose && (this.current = value);\n    shouldDispose && value && value.dispose();\n  };\n  SingleAssignmentDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n      old && old.dispose();\n    }\n  };\n\n  // Multiple assignment disposable\n  var SerialDisposable = Rx.SerialDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SerialDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SerialDisposable.prototype.setDisposable = function (value) {\n    var shouldDispose = this.isDisposed;\n    if (!shouldDispose) {\n      var old = this.current;\n      this.current = value;\n    }\n    old && old.dispose();\n    shouldDispose && value && value.dispose();\n  };\n  SerialDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n    }\n    old && old.dispose();\n  };\n\n  var BinaryDisposable = Rx.BinaryDisposable = function (first, second) {\n    this._first = first;\n    this._second = second;\n    this.isDisposed = false;\n  };\n\n  BinaryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old1 = this._first;\n      this._first = null;\n      old1 && old1.dispose();\n      var old2 = this._second;\n      this._second = null;\n      old2 && old2.dispose();\n    }\n  };\n\n  var NAryDisposable = Rx.NAryDisposable = function (disposables) {\n    this._disposables = disposables;\n    this.isDisposed = false;\n  };\n\n  NAryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      for (var i = 0, len = this._disposables.length; i < len; i++) {\n        this._disposables[i].dispose();\n      }\n      this._disposables.length = 0;\n    }\n  };\n\n  /**\n   * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n   */\n  var RefCountDisposable = Rx.RefCountDisposable = (function () {\n\n    function InnerDisposable(disposable) {\n      this.disposable = disposable;\n      this.disposable.count++;\n      this.isInnerDisposed = false;\n    }\n\n    InnerDisposable.prototype.dispose = function () {\n      if (!this.disposable.isDisposed && !this.isInnerDisposed) {\n        this.isInnerDisposed = true;\n        this.disposable.count--;\n        if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {\n          this.disposable.isDisposed = true;\n          this.disposable.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Initializes a new instance of the RefCountDisposable with the specified disposable.\n     * @constructor\n     * @param {Disposable} disposable Underlying disposable.\n      */\n    function RefCountDisposable(disposable) {\n      this.underlyingDisposable = disposable;\n      this.isDisposed = false;\n      this.isPrimaryDisposed = false;\n      this.count = 0;\n    }\n\n    /**\n     * Disposes the underlying disposable only when all dependent disposables have been disposed\n     */\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed && !this.isPrimaryDisposed) {\n        this.isPrimaryDisposed = true;\n        if (this.count === 0) {\n          this.isDisposed = true;\n          this.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n     * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n     */\n    RefCountDisposable.prototype.getDisposable = function () {\n      return this.isDisposed ? disposableEmpty : new InnerDisposable(this);\n    };\n\n    return RefCountDisposable;\n  })();\n\n  var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) {\n    this.scheduler = scheduler;\n    this.state = state;\n    this.action = action;\n    this.dueTime = dueTime;\n    this.comparer = comparer || defaultSubComparer;\n    this.disposable = new SingleAssignmentDisposable();\n  };\n\n  ScheduledItem.prototype.invoke = function () {\n    this.disposable.setDisposable(this.invokeCore());\n  };\n\n  ScheduledItem.prototype.compareTo = function (other) {\n    return this.comparer(this.dueTime, other.dueTime);\n  };\n\n  ScheduledItem.prototype.isCancelled = function () {\n    return this.disposable.isDisposed;\n  };\n\n  ScheduledItem.prototype.invokeCore = function () {\n    return disposableFixup(this.action(this.scheduler, this.state));\n  };\n\n  /** Provides a set of static properties to access commonly used schedulers. */\n  var Scheduler = Rx.Scheduler = (function () {\n\n    function Scheduler() { }\n\n    /** Determines whether the given object is a scheduler */\n    Scheduler.isScheduler = function (s) {\n      return s instanceof Scheduler;\n    };\n\n    var schedulerProto = Scheduler.prototype;\n\n    /**\n   * Schedules an action to be executed.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.schedule = function (state, action) {\n      throw new NotImplementedError();\n    };\n\n  /**\n   * Schedules an action to be executed after dueTime.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @param {Number} dueTime Relative time after which to execute the action.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime;\n      dt instanceof Date && (dt = dt - this.now());\n      dt = Scheduler.normalize(dt);\n\n      if (dt === 0) { return this.schedule(state, action); }\n\n      return this._scheduleFuture(state, dt, action);\n    };\n\n    schedulerProto._scheduleFuture = function (state, dueTime, action) {\n      throw new NotImplementedError();\n    };\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.now = defaultNow;\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.prototype.now = defaultNow;\n\n    /**\n     * Normalizes the specified TimeSpan value to a positive value.\n     * @param {Number} timeSpan The time span value to normalize.\n     * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n     */\n    Scheduler.normalize = function (timeSpan) {\n      timeSpan < 0 && (timeSpan = 0);\n      return timeSpan;\n    };\n\n    return Scheduler;\n  }());\n\n  var normalizeTime = Scheduler.normalize, isScheduler = Scheduler.isScheduler;\n\n  (function (schedulerProto) {\n\n    function invokeRecImmediate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.schedule(state2, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    function invokeRecDate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2, dueTime1) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.scheduleFuture(state2, dueTime1, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursive = function (state, action) {\n      return this.schedule([state, action], invokeRecImmediate);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative or absolute due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number | Date} dueTime Relative or absolute time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveFuture = function (state, dueTime, action) {\n      return this.scheduleFuture([state, action], dueTime, invokeRecDate);\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    schedulerProto.schedulePeriodic = function(state, period, action) {\n      if (typeof root.setInterval === 'undefined') { throw new NotSupportedError(); }\n      period = normalizeTime(period);\n      var s = state, id = root.setInterval(function () { s = action(s); }, period);\n      return disposableCreate(function () { root.clearInterval(id); });\n    };\n\n  }(Scheduler.prototype));\n\n  /** Gets a scheduler that schedules work immediately on the current thread. */\n   var ImmediateScheduler = (function (__super__) {\n    inherits(ImmediateScheduler, __super__);\n    function ImmediateScheduler() {\n      __super__.call(this);\n    }\n\n    ImmediateScheduler.prototype.schedule = function (state, action) {\n      return disposableFixup(action(this, state));\n    };\n\n    return ImmediateScheduler;\n  }(Scheduler));\n\n  var immediateScheduler = Scheduler.immediate = new ImmediateScheduler();\n\n  /**\n   * Gets a scheduler that schedules work as soon as possible on the current thread.\n   */\n  var CurrentThreadScheduler = (function (__super__) {\n    var queue;\n\n    function runTrampoline () {\n      while (queue.length > 0) {\n        var item = queue.dequeue();\n        !item.isCancelled() && item.invoke();\n      }\n    }\n\n    inherits(CurrentThreadScheduler, __super__);\n    function CurrentThreadScheduler() {\n      __super__.call(this);\n    }\n\n    CurrentThreadScheduler.prototype.schedule = function (state, action) {\n      var si = new ScheduledItem(this, state, action, this.now());\n\n      if (!queue) {\n        queue = new PriorityQueue(4);\n        queue.enqueue(si);\n\n        var result = tryCatch(runTrampoline)();\n        queue = null;\n        if (result === errorObj) { thrower(result.e); }\n      } else {\n        queue.enqueue(si);\n      }\n      return si.disposable;\n    };\n\n    CurrentThreadScheduler.prototype.scheduleRequired = function () { return !queue; };\n\n    return CurrentThreadScheduler;\n  }(Scheduler));\n\n  var currentThreadScheduler = Scheduler.currentThread = new CurrentThreadScheduler();\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function createTick(self) {\n      return function tick(command, recurse) {\n        recurse(0, self._period);\n        var state = tryCatch(self._action)(self._state);\n        if (state === errorObj) {\n          self._cancel.dispose();\n          thrower(state.e);\n        }\n        self._state = state;\n      };\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveFuture(0, this._period, createTick(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  var scheduleMethod, clearMethod;\n\n  var localTimer = (function () {\n    var localSetTimeout, localClearTimeout = noop;\n    if (!!root.setTimeout) {\n      localSetTimeout = root.setTimeout;\n      localClearTimeout = root.clearTimeout;\n    } else if (!!root.WScript) {\n      localSetTimeout = function (fn, time) {\n        root.WScript.Sleep(time);\n        fn();\n      };\n    } else {\n      throw new NotSupportedError();\n    }\n\n    return {\n      setTimeout: localSetTimeout,\n      clearTimeout: localClearTimeout\n    };\n  }());\n  var localSetTimeout = localTimer.setTimeout,\n    localClearTimeout = localTimer.clearTimeout;\n\n  (function () {\n\n    var nextHandle = 1, tasksByHandle = {}, currentlyRunning = false;\n\n    clearMethod = function (handle) {\n      delete tasksByHandle[handle];\n    };\n\n    function runTask(handle) {\n      if (currentlyRunning) {\n        localSetTimeout(function () { runTask(handle); }, 0);\n      } else {\n        var task = tasksByHandle[handle];\n        if (task) {\n          currentlyRunning = true;\n          var result = tryCatch(task)();\n          clearMethod(handle);\n          currentlyRunning = false;\n          if (result === errorObj) { thrower(result.e); }\n        }\n      }\n    }\n\n    var reNative = new RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&\n      !reNative.test(setImmediate) && setImmediate;\n\n    function postMessageSupported () {\n      // Ensure not in a worker\n      if (!root.postMessage || root.importScripts) { return false; }\n      var isAsync = false, oldHandler = root.onmessage;\n      // Test for async\n      root.onmessage = function () { isAsync = true; };\n      root.postMessage('', '*');\n      root.onmessage = oldHandler;\n\n      return isAsync;\n    }\n\n    // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n    if (isFunction(setImmediate)) {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        setImmediate(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        process.nextTick(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (postMessageSupported()) {\n      var MSG_PREFIX = 'ms.rx.schedule' + Math.random();\n\n      var onGlobalPostMessage = function (event) {\n        // Only if we're a match to avoid any other global events\n        if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n          runTask(event.data.substring(MSG_PREFIX.length));\n        }\n      };\n\n      root.addEventListener('message', onGlobalPostMessage, false);\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        root.postMessage(MSG_PREFIX + id, '*');\n        return id;\n      };\n    } else if (!!root.MessageChannel) {\n      var channel = new root.MessageChannel();\n\n      channel.port1.onmessage = function (e) { runTask(e.data); };\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        channel.port2.postMessage(id);\n        return id;\n      };\n    } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {\n\n      scheduleMethod = function (action) {\n        var scriptElement = root.document.createElement('script');\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n\n        scriptElement.onreadystatechange = function () {\n          runTask(id);\n          scriptElement.onreadystatechange = null;\n          scriptElement.parentNode.removeChild(scriptElement);\n          scriptElement = null;\n        };\n        root.document.documentElement.appendChild(scriptElement);\n        return id;\n      };\n\n    } else {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        localSetTimeout(function () {\n          runTask(id);\n        }, 0);\n\n        return id;\n      };\n    }\n  }());\n\n  /**\n   * Gets a scheduler that schedules work via a timed callback based upon platform.\n   */\n   var DefaultScheduler = (function (__super__) {\n     inherits(DefaultScheduler, __super__);\n     function DefaultScheduler() {\n       __super__.call(this);\n     }\n\n     function scheduleAction(disposable, action, scheduler, state) {\n       return function schedule() {\n         disposable.setDisposable(Disposable._fixup(action(scheduler, state)));\n       };\n     }\n\n     function ClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     ClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         clearMethod(this._id);\n       }\n     };\n\n     function LocalClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     LocalClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         localClearTimeout(this._id);\n       }\n     };\n\n    DefaultScheduler.prototype.schedule = function (state, action) {\n      var disposable = new SingleAssignmentDisposable(),\n          id = scheduleMethod(scheduleAction(disposable, action, this, state));\n      return new BinaryDisposable(disposable, new ClearDisposable(id));\n    };\n\n    DefaultScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      if (dueTime === 0) { return this.schedule(state, action); }\n      var disposable = new SingleAssignmentDisposable(),\n          id = localSetTimeout(scheduleAction(disposable, action, this, state), dueTime);\n      return new BinaryDisposable(disposable, new LocalClearDisposable(id));\n    };\n\n    function scheduleLongRunning(state, action, disposable) {\n      return function () { action(state, disposable); };\n    }\n\n    DefaultScheduler.prototype.scheduleLongRunning = function (state, action) {\n      var disposable = disposableCreate(noop);\n      scheduleMethod(scheduleLongRunning(state, action, disposable));\n      return disposable;\n    };\n\n    return DefaultScheduler;\n  }(Scheduler));\n\n  var defaultScheduler = Scheduler['default'] = Scheduler.async = new DefaultScheduler();\n\n  function IndexedItem(id, value) {\n    this.id = id;\n    this.value = value;\n  }\n\n  IndexedItem.prototype.compareTo = function (other) {\n    var c = this.value.compareTo(other.value);\n    c === 0 && (c = this.id - other.id);\n    return c;\n  };\n\n  var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) {\n    this.items = new Array(capacity);\n    this.length = 0;\n  };\n\n  var priorityProto = PriorityQueue.prototype;\n  priorityProto.isHigherPriority = function (left, right) {\n    return this.items[left].compareTo(this.items[right]) < 0;\n  };\n\n  priorityProto.percolate = function (index) {\n    if (index >= this.length || index < 0) { return; }\n    var parent = index - 1 >> 1;\n    if (parent < 0 || parent === index) { return; }\n    if (this.isHigherPriority(index, parent)) {\n      var temp = this.items[index];\n      this.items[index] = this.items[parent];\n      this.items[parent] = temp;\n      this.percolate(parent);\n    }\n  };\n\n  priorityProto.heapify = function (index) {\n    +index || (index = 0);\n    if (index >= this.length || index < 0) { return; }\n    var left = 2 * index + 1,\n        right = 2 * index + 2,\n        first = index;\n    if (left < this.length && this.isHigherPriority(left, first)) {\n      first = left;\n    }\n    if (right < this.length && this.isHigherPriority(right, first)) {\n      first = right;\n    }\n    if (first !== index) {\n      var temp = this.items[index];\n      this.items[index] = this.items[first];\n      this.items[first] = temp;\n      this.heapify(first);\n    }\n  };\n\n  priorityProto.peek = function () { return this.items[0].value; };\n\n  priorityProto.removeAt = function (index) {\n    this.items[index] = this.items[--this.length];\n    this.items[this.length] = undefined;\n    this.heapify();\n  };\n\n  priorityProto.dequeue = function () {\n    var result = this.peek();\n    this.removeAt(0);\n    return result;\n  };\n\n  priorityProto.enqueue = function (item) {\n    var index = this.length++;\n    this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n    this.percolate(index);\n  };\n\n  priorityProto.remove = function (item) {\n    for (var i = 0; i < this.length; i++) {\n      if (this.items[i].value === item) {\n        this.removeAt(i);\n        return true;\n      }\n    }\n    return false;\n  };\n  PriorityQueue.count = 0;\n\n  /**\n   *  Represents a notification to an observer.\n   */\n  var Notification = Rx.Notification = (function () {\n    function Notification() {\n\n    }\n\n    Notification.prototype._accept = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    Notification.prototype._acceptObserver = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    /**\n     * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n     * @param {Function | Observer} observerOrOnNext Function to invoke for an OnNext notification or Observer to invoke the notification on..\n     * @param {Function} onError Function to invoke for an OnError notification.\n     * @param {Function} onCompleted Function to invoke for an OnCompleted notification.\n     * @returns {Any} Result produced by the observation.\n     */\n    Notification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n      return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n        this._acceptObserver(observerOrOnNext) :\n        this._accept(observerOrOnNext, onError, onCompleted);\n    };\n\n    /**\n     * Returns an observable sequence with a single notification.\n     *\n     * @memberOf Notifications\n     * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n     * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n     */\n    Notification.prototype.toObservable = function (scheduler) {\n      var self = this;\n      isScheduler(scheduler) || (scheduler = immediateScheduler);\n      return new AnonymousObservable(function (o) {\n        return scheduler.schedule(self, function (_, notification) {\n          notification._acceptObserver(o);\n          notification.kind === 'N' && o.onCompleted();\n        });\n      });\n    };\n\n    return Notification;\n  })();\n\n  var OnNextNotification = (function (__super__) {\n    inherits(OnNextNotification, __super__);\n    function OnNextNotification(value) {\n      this.value = value;\n      this.kind = 'N';\n    }\n\n    OnNextNotification.prototype._accept = function (onNext) {\n      return onNext(this.value);\n    };\n\n    OnNextNotification.prototype._acceptObserver = function (o) {\n      return o.onNext(this.value);\n    };\n\n    OnNextNotification.prototype.toString = function () {\n      return 'OnNext(' + this.value + ')';\n    };\n\n    return OnNextNotification;\n  }(Notification));\n\n  var OnErrorNotification = (function (__super__) {\n    inherits(OnErrorNotification, __super__);\n    function OnErrorNotification(error) {\n      this.error = error;\n      this.kind = 'E';\n    }\n\n    OnErrorNotification.prototype._accept = function (onNext, onError) {\n      return onError(this.error);\n    };\n\n    OnErrorNotification.prototype._acceptObserver = function (o) {\n      return o.onError(this.error);\n    };\n\n    OnErrorNotification.prototype.toString = function () {\n      return 'OnError(' + this.error + ')';\n    };\n\n    return OnErrorNotification;\n  }(Notification));\n\n  var OnCompletedNotification = (function (__super__) {\n    inherits(OnCompletedNotification, __super__);\n    function OnCompletedNotification() {\n      this.kind = 'C';\n    }\n\n    OnCompletedNotification.prototype._accept = function (onNext, onError, onCompleted) {\n      return onCompleted();\n    };\n\n    OnCompletedNotification.prototype._acceptObserver = function (o) {\n      return o.onCompleted();\n    };\n\n    OnCompletedNotification.prototype.toString = function () {\n      return 'OnCompleted()';\n    };\n\n    return OnCompletedNotification;\n  }(Notification));\n\n  /**\n   * Creates an object that represents an OnNext notification to an observer.\n   * @param {Any} value The value contained in the notification.\n   * @returns {Notification} The OnNext notification containing the value.\n   */\n  var notificationCreateOnNext = Notification.createOnNext = function (value) {\n    return new OnNextNotification(value);\n  };\n\n  /**\n   * Creates an object that represents an OnError notification to an observer.\n   * @param {Any} error The exception contained in the notification.\n   * @returns {Notification} The OnError notification containing the exception.\n   */\n  var notificationCreateOnError = Notification.createOnError = function (error) {\n    return new OnErrorNotification(error);\n  };\n\n  /**\n   * Creates an object that represents an OnCompleted notification to an observer.\n   * @returns {Notification} The OnCompleted notification.\n   */\n  var notificationCreateOnCompleted = Notification.createOnCompleted = function () {\n    return new OnCompletedNotification();\n  };\n\n  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n\n  /**\n   * Abstract base class for implementations of the Observer class.\n   * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n   */\n  var AbstractObserver = Rx.internals.AbstractObserver = (function (__super__) {\n    inherits(AbstractObserver, __super__);\n\n    /**\n     * Creates a new observer in a non-stopped state.\n     */\n    function AbstractObserver() {\n      this.isStopped = false;\n    }\n\n    // Must be implemented by other observers\n    AbstractObserver.prototype.next = notImplemented;\n    AbstractObserver.prototype.error = notImplemented;\n    AbstractObserver.prototype.completed = notImplemented;\n\n    /**\n     * Notifies the observer of a new element in the sequence.\n     * @param {Any} value Next element in the sequence.\n     */\n    AbstractObserver.prototype.onNext = function (value) {\n      !this.isStopped && this.next(value);\n    };\n\n    /**\n     * Notifies the observer that an exception has occurred.\n     * @param {Any} error The error that has occurred.\n     */\n    AbstractObserver.prototype.onError = function (error) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(error);\n      }\n    };\n\n    /**\n     * Notifies the observer of the end of the sequence.\n     */\n    AbstractObserver.prototype.onCompleted = function () {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.completed();\n      }\n    };\n\n    /**\n     * Disposes the observer, causing it to transition to the stopped state.\n     */\n    AbstractObserver.prototype.dispose = function () { this.isStopped = true; };\n\n    AbstractObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return AbstractObserver;\n  }(Observer));\n\n  /**\n   * Class to create an Observer instance from delegate-based implementations of the on* methods.\n   */\n  var AnonymousObserver = Rx.AnonymousObserver = (function (__super__) {\n    inherits(AnonymousObserver, __super__);\n\n    /**\n     * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n     * @param {Any} onNext Observer's OnNext action implementation.\n     * @param {Any} onError Observer's OnError action implementation.\n     * @param {Any} onCompleted Observer's OnCompleted action implementation.\n     */\n    function AnonymousObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    /**\n     * Calls the onNext action.\n     * @param {Any} value Next element in the sequence.\n     */\n    AnonymousObserver.prototype.next = function (value) {\n      this._onNext(value);\n    };\n\n    /**\n     * Calls the onError action.\n     * @param {Any} error The error that has occurred.\n     */\n    AnonymousObserver.prototype.error = function (error) {\n      this._onError(error);\n    };\n\n    /**\n     *  Calls the onCompleted action.\n     */\n    AnonymousObserver.prototype.completed = function () {\n      this._onCompleted();\n    };\n\n    return AnonymousObserver;\n  }(AbstractObserver));\n\n  var observableProto;\n\n  /**\n   * Represents a push-style collection.\n   */\n  var Observable = Rx.Observable = (function () {\n\n    function makeSubscribe(self, subscribe) {\n      return function (o) {\n        var oldOnError = o.onError;\n        o.onError = function (e) {\n          makeStackTraceLong(e, self);\n          oldOnError.call(o, e);\n        };\n\n        return subscribe.call(self, o);\n      };\n    }\n\n    function Observable() {\n      if (Rx.config.longStackSupport && hasStacks) {\n        var oldSubscribe = this._subscribe;\n        var e = tryCatch(thrower)(new Error()).e;\n        this.stack = e.stack.substring(e.stack.indexOf('\\n') + 1);\n        this._subscribe = makeSubscribe(this, oldSubscribe);\n      }\n    }\n\n    observableProto = Observable.prototype;\n\n    /**\n    * Determines whether the given object is an Observable\n    * @param {Any} An object to determine whether it is an Observable\n    * @returns {Boolean} true if an Observable, else false.\n    */\n    Observable.isObservable = function (o) {\n      return o && isFunction(o.subscribe);\n    };\n\n    /**\n     *  Subscribes an o to the observable sequence.\n     *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n     *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n     *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n     *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribe = observableProto.forEach = function (oOrOnNext, onError, onCompleted) {\n      return this._subscribe(typeof oOrOnNext === 'object' ?\n        oOrOnNext :\n        observerCreate(oOrOnNext, onError, onCompleted));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onNext The function to invoke on each element in the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnNext = function (onNext, thisArg) {\n      return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n    };\n\n    /**\n     * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n     * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnError = function (onError, thisArg) {\n      return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnCompleted = function (onCompleted, thisArg) {\n      return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n    };\n\n    return Observable;\n  })();\n\n  var ObservableBase = Rx.ObservableBase = (function (__super__) {\n    inherits(ObservableBase, __super__);\n\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.subscribeCore).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function ObservableBase() {\n      __super__.call(this);\n    }\n\n    ObservableBase.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    ObservableBase.prototype.subscribeCore = notImplemented;\n\n    return ObservableBase;\n  }(Observable));\n\nvar FlatMapObservable = Rx.FlatMapObservable = (function(__super__) {\n\n    inherits(FlatMapObservable, __super__);\n\n    function FlatMapObservable(source, selector, resultSelector, thisArg) {\n      this.resultSelector = isFunction(resultSelector) ? resultSelector : null;\n      this.selector = bindCallback(isFunction(selector) ? selector : function() { return selector; }, thisArg, 3);\n      this.source = source;\n      __super__.call(this);\n    }\n\n    FlatMapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this.resultSelector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(observer, selector, resultSelector, source) {\n      this.i = 0;\n      this.selector = selector;\n      this.resultSelector = resultSelector;\n      this.source = source;\n      this.o = observer;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype._wrapResult = function(result, x, i) {\n      return this.resultSelector ?\n        result.map(function(y, i2) { return this.resultSelector(x, y, i, i2); }, this) :\n        result;\n    };\n\n    InnerObserver.prototype.next = function(x) {\n      var i = this.i++;\n      var result = tryCatch(this.selector)(x, i, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = Observable.from(result));\n      this.o.onNext(this._wrapResult(result, x, i));\n    };\n\n    InnerObserver.prototype.error = function(e) { this.o.onError(e); };\n\n    InnerObserver.prototype.completed = function() { this.o.onCompleted(); };\n\n    return FlatMapObservable;\n\n}(ObservableBase));\n\n  var Enumerable = Rx.internals.Enumerable = function () { };\n\n  function IsDisposedDisposable(state) {\n    this._s = state;\n    this.isDisposed = false;\n  }\n\n  IsDisposedDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      this._s.isDisposed = true;\n    }\n  };\n\n  var ConcatEnumerableObservable = (function(__super__) {\n    inherits(ConcatEnumerableObservable, __super__);\n    function ConcatEnumerableObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    ConcatEnumerableObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        o: o,\n        subscription: subscription,\n        e: this.sources[$iterator$]()\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.o.onError(e); };\n    InnerObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return ConcatEnumerableObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.concat = function () {\n    return new ConcatEnumerableObservable(this);\n  };\n\n  var CatchErrorObservable = (function(__super__) {\n    function CatchErrorObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    inherits(CatchErrorObservable, __super__);\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.lastError !== null ? state.o.onError(state.lastError) : state.o.onCompleted(); }\n\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    CatchErrorObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        e: this.sources[$iterator$](),\n        subscription: subscription,\n        lastError: null,\n        o: o\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.lastError = e; this._recurse(this._state); };\n    InnerObserver.prototype.completed = function () { this._state.o.onCompleted(); };\n\n    return CatchErrorObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.catchError = function () {\n    return new CatchErrorObservable(this);\n  };\n\n  var RepeatEnumerable = (function (__super__) {\n    inherits(RepeatEnumerable, __super__);\n    function RepeatEnumerable(v, c) {\n      this.v = v;\n      this.c = c == null ? -1 : c;\n    }\n\n    RepeatEnumerable.prototype[$iterator$] = function () {\n      return new RepeatEnumerator(this);\n    };\n\n    function RepeatEnumerator(p) {\n      this.v = p.v;\n      this.l = p.c;\n    }\n\n    RepeatEnumerator.prototype.next = function () {\n      if (this.l === 0) { return doneEnumerator; }\n      if (this.l > 0) { this.l--; }\n      return { done: false, value: this.v };\n    };\n\n    return RepeatEnumerable;\n  }(Enumerable));\n\n  var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) {\n    return new RepeatEnumerable(value, repeatCount);\n  };\n\n  var OfEnumerable = (function(__super__) {\n    inherits(OfEnumerable, __super__);\n    function OfEnumerable(s, fn, thisArg) {\n      this.s = s;\n      this.fn = fn ? bindCallback(fn, thisArg, 3) : null;\n    }\n    OfEnumerable.prototype[$iterator$] = function () {\n      return new OfEnumerator(this);\n    };\n\n    function OfEnumerator(p) {\n      this.i = -1;\n      this.s = p.s;\n      this.l = this.s.length;\n      this.fn = p.fn;\n    }\n\n    OfEnumerator.prototype.next = function () {\n     return ++this.i < this.l ?\n       { done: false, value: !this.fn ? this.s[this.i] : this.fn(this.s[this.i], this.i, this.s) } :\n       doneEnumerator;\n    };\n\n    return OfEnumerable;\n  }(Enumerable));\n\n  var enumerableOf = Enumerable.of = function (source, selector, thisArg) {\n    return new OfEnumerable(source, selector, thisArg);\n  };\n\n  var ScheduledObserver = Rx.internals.ScheduledObserver = (function (__super__) {\n    inherits(ScheduledObserver, __super__);\n\n    function ScheduledObserver(scheduler, observer) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.observer = observer;\n      this.isAcquired = false;\n      this.hasFaulted = false;\n      this.queue = [];\n      this.disposable = new SerialDisposable();\n    }\n\n    function enqueueNext(observer, x) { return function () { observer.onNext(x); }; }\n    function enqueueError(observer, e) { return function () { observer.onError(e); }; }\n    function enqueueCompleted(observer) { return function () { observer.onCompleted(); }; }\n\n    ScheduledObserver.prototype.next = function (x) {\n      this.queue.push(enqueueNext(this.observer, x));\n    };\n\n    ScheduledObserver.prototype.error = function (e) {\n      this.queue.push(enqueueError(this.observer, e));\n    };\n\n    ScheduledObserver.prototype.completed = function () {\n      this.queue.push(enqueueCompleted(this.observer));\n    };\n\n\n    function scheduleMethod(state, recurse) {\n      var work;\n      if (state.queue.length > 0) {\n        work = state.queue.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var res = tryCatch(work)();\n      if (res === errorObj) {\n        state.queue = [];\n        state.hasFaulted = true;\n        return thrower(res.e);\n      }\n      recurse(state);\n    }\n\n    ScheduledObserver.prototype.ensureActive = function () {\n      var isOwner = false;\n      if (!this.hasFaulted && this.queue.length > 0) {\n        isOwner = !this.isAcquired;\n        this.isAcquired = true;\n      }\n      isOwner &&\n        this.disposable.setDisposable(this.scheduler.scheduleRecursive(this, scheduleMethod));\n    };\n\n    ScheduledObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.disposable.dispose();\n    };\n\n    return ScheduledObserver;\n  }(AbstractObserver));\n\n  var ToArrayObservable = (function(__super__) {\n    inherits(ToArrayObservable, __super__);\n    function ToArrayObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    ToArrayObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o) {\n      this.o = o;\n      this.a = [];\n      AbstractObserver.call(this);\n    }\n    \n    InnerObserver.prototype.next = function (x) { this.a.push(x); };\n    InnerObserver.prototype.error = function (e) { this.o.onError(e);  };\n    InnerObserver.prototype.completed = function () { this.o.onNext(this.a); this.o.onCompleted(); };\n\n    return ToArrayObservable;\n  }(ObservableBase));\n\n  /**\n  * Creates an array from an observable sequence.\n  * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n  */\n  observableProto.toArray = function () {\n    return new ToArrayObservable(this);\n  };\n\n  /**\n   *  Creates an observable sequence from a specified subscribe method implementation.\n   * @example\n   *  var res = Rx.Observable.create(function (observer) { return function () { } );\n   *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n   *  var res = Rx.Observable.create(function (observer) { } );\n   * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n   * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n   */\n  Observable.create = function (subscribe, parent) {\n    return new AnonymousObservable(subscribe, parent);\n  };\n\n  var Defer = (function(__super__) {\n    inherits(Defer, __super__);\n    function Defer(factory) {\n      this._f = factory;\n      __super__.call(this);\n    }\n\n    Defer.prototype.subscribeCore = function (o) {\n      var result = tryCatch(this._f)();\n      if (result === errorObj) { return observableThrow(result.e).subscribe(o);}\n      isPromise(result) && (result = observableFromPromise(result));\n      return result.subscribe(o);\n    };\n\n    return Defer;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n   *\n   * @example\n   *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n   * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n   * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n   */\n  var observableDefer = Observable.defer = function (observableFactory) {\n    return new Defer(observableFactory);\n  };\n\n  var EmptyObservable = (function(__super__) {\n    inherits(EmptyObservable, __super__);\n    function EmptyObservable(scheduler) {\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    EmptyObservable.prototype.subscribeCore = function (observer) {\n      var sink = new EmptySink(observer, this.scheduler);\n      return sink.run();\n    };\n\n    function EmptySink(observer, scheduler) {\n      this.observer = observer;\n      this.scheduler = scheduler;\n    }\n\n    function scheduleItem(s, state) {\n      state.onCompleted();\n      return disposableEmpty;\n    }\n\n    EmptySink.prototype.run = function () {\n      var state = this.observer;\n      return this.scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this.scheduler.schedule(state, scheduleItem);\n    };\n\n    return EmptyObservable;\n  }(ObservableBase));\n\n  var EMPTY_OBSERVABLE = new EmptyObservable(immediateScheduler);\n\n  /**\n   *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n   *\n   * @example\n   *  var res = Rx.Observable.empty();\n   *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n   * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n   * @returns {Observable} An observable sequence with no elements.\n   */\n  var observableEmpty = Observable.empty = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return scheduler === immediateScheduler ? EMPTY_OBSERVABLE : new EmptyObservable(scheduler);\n  };\n\n  var FromObservable = (function(__super__) {\n    inherits(FromObservable, __super__);\n    function FromObservable(iterable, fn, scheduler) {\n      this._iterable = iterable;\n      this._fn = fn;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function createScheduleMethod(o, it, fn) {\n      return function loopRecursive(i, recurse) {\n        var next = tryCatch(it.next).call(it);\n        if (next === errorObj) { return o.onError(next.e); }\n        if (next.done) { return o.onCompleted(); }\n\n        var result = next.value;\n\n        if (isFunction(fn)) {\n          result = tryCatch(fn)(result, i);\n          if (result === errorObj) { return o.onError(result.e); }\n        }\n\n        o.onNext(result);\n        recurse(i + 1);\n      };\n    }\n\n    FromObservable.prototype.subscribeCore = function (o) {\n      var list = Object(this._iterable),\n          it = getIterable(list);\n\n      return this._scheduler.scheduleRecursive(0, createScheduleMethod(o, it, this._fn));\n    };\n\n    return FromObservable;\n  }(ObservableBase));\n\n  var maxSafeInteger = Math.pow(2, 53) - 1;\n\n  function StringIterable(s) {\n    this._s = s;\n  }\n\n  StringIterable.prototype[$iterator$] = function () {\n    return new StringIterator(this._s);\n  };\n\n  function StringIterator(s) {\n    this._s = s;\n    this._l = s.length;\n    this._i = 0;\n  }\n\n  StringIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  StringIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._s.charAt(this._i++) } : doneEnumerator;\n  };\n\n  function ArrayIterable(a) {\n    this._a = a;\n  }\n\n  ArrayIterable.prototype[$iterator$] = function () {\n    return new ArrayIterator(this._a);\n  };\n\n  function ArrayIterator(a) {\n    this._a = a;\n    this._l = toLength(a);\n    this._i = 0;\n  }\n\n  ArrayIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  ArrayIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._a[this._i++] } : doneEnumerator;\n  };\n\n  function numberIsFinite(value) {\n    return typeof value === 'number' && root.isFinite(value);\n  }\n\n  function isNan(n) {\n    return n !== n;\n  }\n\n  function getIterable(o) {\n    var i = o[$iterator$], it;\n    if (!i && typeof o === 'string') {\n      it = new StringIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i && o.length !== undefined) {\n      it = new ArrayIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i) { throw new TypeError('Object is not iterable'); }\n    return o[$iterator$]();\n  }\n\n  function sign(value) {\n    var number = +value;\n    if (number === 0) { return number; }\n    if (isNaN(number)) { return number; }\n    return number < 0 ? -1 : 1;\n  }\n\n  function toLength(o) {\n    var len = +o.length;\n    if (isNaN(len)) { return 0; }\n    if (len === 0 || !numberIsFinite(len)) { return len; }\n    len = sign(len) * Math.floor(Math.abs(len));\n    if (len <= 0) { return 0; }\n    if (len > maxSafeInteger) { return maxSafeInteger; }\n    return len;\n  }\n\n  /**\n  * This method creates a new Observable sequence from an array-like or iterable object.\n  * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n  * @param {Function} [mapFn] Map function to call on every element of the array.\n  * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n  * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n  */\n  var observableFrom = Observable.from = function (iterable, mapFn, thisArg, scheduler) {\n    if (iterable == null) {\n      throw new Error('iterable cannot be null.')\n    }\n    if (mapFn && !isFunction(mapFn)) {\n      throw new Error('mapFn when provided must be a function');\n    }\n    if (mapFn) {\n      var mapper = bindCallback(mapFn, thisArg, 2);\n    }\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromObservable(iterable, mapper, scheduler);\n  }\n\n  var FromArrayObservable = (function(__super__) {\n    inherits(FromArrayObservable, __super__);\n    function FromArrayObservable(args, scheduler) {\n      this._args = args;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, args) {\n      var len = args.length;\n      return function loopRecursive (i, recurse) {\n        if (i < len) {\n          o.onNext(args[i]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    FromArrayObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._args));\n    };\n\n    return FromArrayObservable;\n  }(ObservableBase));\n\n  /**\n  *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n  * @deprecated use Observable.from or Observable.of\n  * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n  */\n  var observableFromArray = Observable.fromArray = function (array, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler)\n  };\n\n  var NeverObservable = (function(__super__) {\n    inherits(NeverObservable, __super__);\n    function NeverObservable() {\n      __super__.call(this);\n    }\n\n    NeverObservable.prototype.subscribeCore = function (observer) {\n      return disposableEmpty;\n    };\n\n    return NeverObservable;\n  }(ObservableBase));\n\n  var NEVER_OBSERVABLE = new NeverObservable();\n\n  /**\n   * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n   * @returns {Observable} An observable sequence whose observers will never get called.\n   */\n  var observableNever = Observable.never = function () {\n    return NEVER_OBSERVABLE;\n  };\n\n  function observableOf (scheduler, array) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler);\n  }\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.of = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return new FromArrayObservable(args, currentThreadScheduler);\n  };\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.ofWithScheduler = function (scheduler) {\n    var len = arguments.length, args = new Array(len - 1);\n    for(var i = 1; i < len; i++) { args[i - 1] = arguments[i]; }\n    return new FromArrayObservable(args, scheduler);\n  };\n\n  var PairsObservable = (function(__super__) {\n    inherits(PairsObservable, __super__);\n    function PairsObservable(o, scheduler) {\n      this._o = o;\n      this._keys = Object.keys(o);\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, obj, keys) {\n      return function loopRecursive(i, recurse) {\n        if (i < keys.length) {\n          var key = keys[i];\n          o.onNext([key, obj[key]]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    PairsObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._o, this._keys));\n    };\n\n    return PairsObservable;\n  }(ObservableBase));\n\n  /**\n   * Convert an object into an observable sequence of [key, value] pairs.\n   * @param {Object} obj The object to inspect.\n   * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n   * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n   */\n  Observable.pairs = function (obj, scheduler) {\n    scheduler || (scheduler = currentThreadScheduler);\n    return new PairsObservable(obj, scheduler);\n  };\n\n    var RangeObservable = (function(__super__) {\n    inherits(RangeObservable, __super__);\n    function RangeObservable(start, count, scheduler) {\n      this.start = start;\n      this.rangeCount = count;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function loopRecursive(start, count, o) {\n      return function loop (i, recurse) {\n        if (i < count) {\n          o.onNext(start + i);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    RangeObservable.prototype.subscribeCore = function (o) {\n      return this.scheduler.scheduleRecursive(\n        0,\n        loopRecursive(this.start, this.rangeCount, o)\n      );\n    };\n\n    return RangeObservable;\n  }(ObservableBase));\n\n  /**\n  *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n  * @param {Number} start The value of the first integer in the sequence.\n  * @param {Number} count The number of sequential integers to generate.\n  * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n  * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n  */\n  Observable.range = function (start, count, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RangeObservable(start, count, scheduler);\n  };\n\n  var RepeatObservable = (function(__super__) {\n    inherits(RepeatObservable, __super__);\n    function RepeatObservable(value, repeatCount, scheduler) {\n      this.value = value;\n      this.repeatCount = repeatCount == null ? -1 : repeatCount;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    RepeatObservable.prototype.subscribeCore = function (observer) {\n      var sink = new RepeatSink(observer, this);\n      return sink.run();\n    };\n\n    return RepeatObservable;\n  }(ObservableBase));\n\n  function RepeatSink(observer, parent) {\n    this.observer = observer;\n    this.parent = parent;\n  }\n\n  RepeatSink.prototype.run = function () {\n    var observer = this.observer, value = this.parent.value;\n    function loopRecursive(i, recurse) {\n      if (i === -1 || i > 0) {\n        observer.onNext(value);\n        i > 0 && i--;\n      }\n      if (i === 0) { return observer.onCompleted(); }\n      recurse(i);\n    }\n\n    return this.parent.scheduler.scheduleRecursive(this.parent.repeatCount, loopRecursive);\n  };\n\n  /**\n   *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n   * @param {Mixed} value Element to repeat.\n   * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n   * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n   */\n  Observable.repeat = function (value, repeatCount, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RepeatObservable(value, repeatCount, scheduler);\n  };\n\n  var JustObservable = (function(__super__) {\n    inherits(JustObservable, __super__);\n    function JustObservable(value, scheduler) {\n      this._value = value;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    JustObservable.prototype.subscribeCore = function (o) {\n      var state = [this._value, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var value = state[0], observer = state[1];\n      observer.onNext(value);\n      observer.onCompleted();\n      return disposableEmpty;\n    }\n\n    return JustObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n   *  There is an alias called 'just' or browsers <IE9.\n   * @param {Mixed} value Single element in the resulting observable sequence.\n   * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence containing the single specified element.\n   */\n  var observableReturn = Observable['return'] = Observable.just = function (value, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new JustObservable(value, scheduler);\n  };\n\n  var ThrowObservable = (function(__super__) {\n    inherits(ThrowObservable, __super__);\n    function ThrowObservable(error, scheduler) {\n      this._error = error;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    ThrowObservable.prototype.subscribeCore = function (o) {\n      var state = [this._error, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var e = state[0], o = state[1];\n      o.onError(e);\n      return disposableEmpty;\n    }\n\n    return ThrowObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n   *  There is an alias to this method called 'throwError' for browsers <IE9.\n   * @param {Mixed} error An object used for the sequence's termination.\n   * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n   */\n  var observableThrow = Observable['throw'] = function (error, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new ThrowObservable(error, scheduler);\n  };\n\n  var CatchObservable = (function (__super__) {\n    inherits(CatchObservable, __super__);\n    function CatchObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObservable.prototype.subscribeCore = function (o) {\n      var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();\n      subscription.setDisposable(d1);\n      d1.setDisposable(this.source.subscribe(new CatchObserver(o, subscription, this._fn)));\n      return subscription;\n    };\n\n    return CatchObservable;\n  }(ObservableBase));\n\n  var CatchObserver = (function(__super__) {\n    inherits(CatchObserver, __super__);\n    function CatchObserver(o, s, fn) {\n      this._o = o;\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObserver.prototype.next = function (x) { this._o.onNext(x); };\n    CatchObserver.prototype.completed = function () { return this._o.onCompleted(); };\n    CatchObserver.prototype.error = function (e) {\n      var result = tryCatch(this._fn)(e);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      isPromise(result) && (result = observableFromPromise(result));\n\n      var d = new SingleAssignmentDisposable();\n      this._s.setDisposable(d);\n      d.setDisposable(result.subscribe(this._o));\n    };\n\n    return CatchObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n   * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n   */\n  observableProto['catch'] = function (handlerOrSecond) {\n    return isFunction(handlerOrSecond) ? new CatchObservable(this, handlerOrSecond) : observableCatch([this, handlerOrSecond]);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n   * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n   */\n  var observableCatch = Observable['catch'] = function () {\n    var items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(len);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    return enumerableOf(items).catchError();\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   * This can be in the form of an argument list of observables or an array.\n   *\n   * @example\n   * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return combineLatest.apply(this, args);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var CombineLatestObservable = (function(__super__) {\n    inherits(CombineLatestObservable, __super__);\n    function CombineLatestObservable(params, cb) {\n      this._params = params;\n      this._cb = cb;\n      __super__.call(this);\n    }\n\n    CombineLatestObservable.prototype.subscribeCore = function(observer) {\n      var len = this._params.length,\n          subscriptions = new Array(len);\n\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        isDone: arrayInitialize(len, falseFactory),\n        values: new Array(len)\n      };\n\n      for (var i = 0; i < len; i++) {\n        var source = this._params[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new CombineLatestObserver(observer, i, this._cb, state)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return CombineLatestObservable;\n  }(ObservableBase));\n\n  var CombineLatestObserver = (function (__super__) {\n    inherits(CombineLatestObserver, __super__);\n    function CombineLatestObserver(o, i, cb, state) {\n      this._o = o;\n      this._i = i;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    CombineLatestObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      if (this._state.hasValueAll || (this._state.hasValueAll = this._state.hasValue.every(identity))) {\n        var res = tryCatch(this._cb).apply(null, this._state.values);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._state.isDone.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    CombineLatestObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    CombineLatestObserver.prototype.completed = function () {\n      this._state.isDone[this._i] = true;\n      this._state.isDone.every(identity) && this._o.onCompleted();\n    };\n\n    return CombineLatestObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n  *\n  * @example\n  * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n  * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n  * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n  */\n  var combineLatest = Observable.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n    return new CombineLatestObservable(args, resultSelector);\n  };\n\n  /**\n   * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  observableProto.concat = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    args.unshift(this);\n    return observableConcat.apply(null, args);\n  };\n\n  var ConcatObserver = (function(__super__) {\n    inherits(ConcatObserver, __super__);\n    function ConcatObserver(s, fn) {\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    ConcatObserver.prototype.next = function (x) { this._s.o.onNext(x); };\n    ConcatObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    ConcatObserver.prototype.completed = function () { this._s.i++; this._fn(this._s); };\n\n    return ConcatObserver;\n  }(AbstractObserver));\n\n  var ConcatObservable = (function(__super__) {\n    inherits(ConcatObservable, __super__);\n    function ConcatObservable(sources) {\n      this._sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive (state, recurse) {\n      if (state.disposable.isDisposed) { return; }\n      if (state.i === state.sources.length) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = state.sources[state.i];\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new ConcatObserver(state, recurse)));\n    }\n\n    ConcatObservable.prototype.subscribeCore = function(o) {\n      var subscription = new SerialDisposable();\n      var disposable = disposableCreate(noop);\n      var state = {\n        o: o,\n        i: 0,\n        subscription: subscription,\n        disposable: disposable,\n        sources: this._sources\n      };\n\n      var cancelable = immediateScheduler.scheduleRecursive(state, scheduleRecursive);\n      return new NAryDisposable([subscription, disposable, cancelable]);\n    };\n\n    return ConcatObservable;\n  }(ObservableBase));\n\n  /**\n   * Concatenates all the observable sequences.\n   * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  var observableConcat = Observable.concat = function () {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      args = new Array(arguments.length);\n      for(var i = 0, len = arguments.length; i < len; i++) { args[i] = arguments[i]; }\n    }\n    return new ConcatObservable(args);\n  };\n\n  /**\n   * Concatenates an observable sequence of observable sequences.\n   * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n   */\n  observableProto.concatAll = function () {\n    return this.merge(1);\n  };\n\n  var MergeObservable = (function (__super__) {\n    inherits(MergeObservable, __super__);\n\n    function MergeObservable(source, maxConcurrent) {\n      this.source = source;\n      this.maxConcurrent = maxConcurrent;\n      __super__.call(this);\n    }\n\n    MergeObservable.prototype.subscribeCore = function(observer) {\n      var g = new CompositeDisposable();\n      g.add(this.source.subscribe(new MergeObserver(observer, this.maxConcurrent, g)));\n      return g;\n    };\n\n    return MergeObservable;\n\n  }(ObservableBase));\n\n  var MergeObserver = (function (__super__) {\n    function MergeObserver(o, max, g) {\n      this.o = o;\n      this.max = max;\n      this.g = g;\n      this.done = false;\n      this.q = [];\n      this.activeCount = 0;\n      __super__.call(this);\n    }\n\n    inherits(MergeObserver, __super__);\n\n    MergeObserver.prototype.handleSubscribe = function (xs) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(xs) && (xs = observableFromPromise(xs));\n      sad.setDisposable(xs.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeObserver.prototype.next = function (innerSource) {\n      if(this.activeCount < this.max) {\n        this.activeCount++;\n        this.handleSubscribe(innerSource);\n      } else {\n        this.q.push(innerSource);\n      }\n    };\n    MergeObserver.prototype.error = function (e) { this.o.onError(e); };\n    MergeObserver.prototype.completed = function () { this.done = true; this.activeCount === 0 && this.o.onCompleted(); };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) { this.parent.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this.parent.o.onError(e); };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      if (this.parent.q.length > 0) {\n        this.parent.handleSubscribe(this.parent.q.shift());\n      } else {\n        this.parent.activeCount--;\n        this.parent.done && this.parent.activeCount === 0 && this.parent.o.onCompleted();\n      }\n    };\n\n    return MergeObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n  * Or merges two observable sequences into a single observable sequence.\n  * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.merge = function (maxConcurrentOrOther) {\n    return typeof maxConcurrentOrOther !== 'number' ?\n      observableMerge(this, maxConcurrentOrOther) :\n      new MergeObservable(this, maxConcurrentOrOther);\n  };\n\n  /**\n   * Merges all the observable sequences into a single observable sequence.\n   * The scheduler is optional and if not specified, the immediate scheduler is used.\n   * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n   */\n  var observableMerge = Observable.merge = function () {\n    var scheduler, sources = [], i, len = arguments.length;\n    if (!arguments[0]) {\n      scheduler = immediateScheduler;\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else if (isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else {\n      scheduler = immediateScheduler;\n      for(i = 0; i < len; i++) { sources.push(arguments[i]); }\n    }\n    if (Array.isArray(sources[0])) {\n      sources = sources[0];\n    }\n    return observableOf(scheduler, sources).mergeAll();\n  };\n\n  var MergeAllObservable = (function (__super__) {\n    inherits(MergeAllObservable, __super__);\n\n    function MergeAllObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeAllObservable.prototype.subscribeCore = function (o) {\n      var g = new CompositeDisposable(), m = new SingleAssignmentDisposable();\n      g.add(m);\n      m.setDisposable(this.source.subscribe(new MergeAllObserver(o, g)));\n      return g;\n    };\n\n    return MergeAllObservable;\n  }(ObservableBase));\n\n  var MergeAllObserver = (function (__super__) {\n    function MergeAllObserver(o, g) {\n      this.o = o;\n      this.g = g;\n      this.done = false;\n      __super__.call(this);\n    }\n\n    inherits(MergeAllObserver, __super__);\n\n    MergeAllObserver.prototype.next = function(innerSource) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      sad.setDisposable(innerSource.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeAllObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    MergeAllObserver.prototype.completed = function () {\n      this.done = true;\n      this.g.length === 1 && this.o.onCompleted();\n    };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) {\n      this.parent.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function (e) {\n      this.parent.o.onError(e);\n    };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      this.parent.done && this.parent.g.length === 1 && this.parent.o.onCompleted();\n    };\n\n    return MergeAllObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.mergeAll = function () {\n    return new MergeAllObservable(this);\n  };\n\n  var CompositeError = Rx.CompositeError = function(errors) {\n    this.innerErrors = errors;\n    this.message = 'This contains multiple errors. Check the innerErrors';\n    Error.call(this);\n  };\n  CompositeError.prototype = Object.create(Error.prototype);\n  CompositeError.prototype.name = 'CompositeError';\n\n  var MergeDelayErrorObservable = (function(__super__) {\n    inherits(MergeDelayErrorObservable, __super__);\n    function MergeDelayErrorObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeDelayErrorObservable.prototype.subscribeCore = function (o) {\n      var group = new CompositeDisposable(),\n        m = new SingleAssignmentDisposable(),\n        state = { isStopped: false, errors: [], o: o };\n\n      group.add(m);\n      m.setDisposable(this.source.subscribe(new MergeDelayErrorObserver(group, state)));\n\n      return group;\n    };\n\n    return MergeDelayErrorObservable;\n  }(ObservableBase));\n\n  var MergeDelayErrorObserver = (function(__super__) {\n    inherits(MergeDelayErrorObserver, __super__);\n    function MergeDelayErrorObserver(group, state) {\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function setCompletion(o, errors) {\n      if (errors.length === 0) {\n        o.onCompleted();\n      } else if (errors.length === 1) {\n        o.onError(errors[0]);\n      } else {\n        o.onError(new CompositeError(errors));\n      }\n    }\n\n    MergeDelayErrorObserver.prototype.next = function (x) {\n      var inner = new SingleAssignmentDisposable();\n      this._group.add(inner);\n\n      // Check for promises support\n      isPromise(x) && (x = observableFromPromise(x));\n      inner.setDisposable(x.subscribe(new InnerObserver(inner, this._group, this._state)));\n    };\n\n    MergeDelayErrorObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    MergeDelayErrorObserver.prototype.completed = function () {\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    inherits(InnerObserver, __super__);\n    function InnerObserver(inner, group, state) {\n      this._inner = inner;\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n    InnerObserver.prototype.completed = function () {\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    return MergeDelayErrorObserver;\n  }(AbstractObserver));\n\n  /**\n  * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n  * receive all successfully emitted items from all of the source Observables without being interrupted by\n  * an error notification from one of them.\n  *\n  * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n  * error via the Observer's onError, mergeDelayError will refrain from propagating that\n  * error notification until all of the merged Observables have finished emitting items.\n  * @param {Array | Arguments} args Arguments or an array to merge.\n  * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n  */\n  Observable.mergeDelayError = function() {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      var len = arguments.length;\n      args = new Array(len);\n      for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    var source = observableOf(null, args);\n    return new MergeDelayErrorObservable(source);\n  };\n\n  var SkipUntilObservable = (function(__super__) {\n    inherits(SkipUntilObservable, __super__);\n\n    function SkipUntilObservable(source, other) {\n      this._s = source;\n      this._o = isPromise(other) ? observableFromPromise(other) : other;\n      this._open = false;\n      __super__.call(this);\n    }\n\n    SkipUntilObservable.prototype.subscribeCore = function(o) {\n      var leftSubscription = new SingleAssignmentDisposable();\n      leftSubscription.setDisposable(this._s.subscribe(new SkipUntilSourceObserver(o, this)));\n\n      isPromise(this._o) && (this._o = observableFromPromise(this._o));\n\n      var rightSubscription = new SingleAssignmentDisposable();\n      rightSubscription.setDisposable(this._o.subscribe(new SkipUntilOtherObserver(o, this, rightSubscription)));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    };\n\n    return SkipUntilObservable;\n  }(ObservableBase));\n\n  var SkipUntilSourceObserver = (function(__super__) {\n    inherits(SkipUntilSourceObserver, __super__);\n    function SkipUntilSourceObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipUntilSourceObserver.prototype.next = function (x) {\n      this._p._open && this._o.onNext(x);\n    };\n\n    SkipUntilSourceObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilSourceObserver.prototype.onCompleted = function () {\n      this._p._open && this._o.onCompleted();\n    };\n\n    return SkipUntilSourceObserver;\n  }(AbstractObserver));\n\n  var SkipUntilOtherObserver = (function(__super__) {\n    inherits(SkipUntilOtherObserver, __super__);\n    function SkipUntilOtherObserver(o, p, r) {\n      this._o = o;\n      this._p = p;\n      this._r = r;\n      __super__.call(this);\n    }\n\n    SkipUntilOtherObserver.prototype.next = function () {\n      this._p._open = true;\n      this._r.dispose();\n    };\n\n    SkipUntilOtherObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilOtherObserver.prototype.onCompleted = function () {\n      this._r.dispose();\n    };\n\n    return SkipUntilOtherObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n   * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n   */\n  observableProto.skipUntil = function (other) {\n    return new SkipUntilObservable(this, other);\n  };\n\n  var SwitchObservable = (function(__super__) {\n    inherits(SwitchObservable, __super__);\n    function SwitchObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    SwitchObservable.prototype.subscribeCore = function (o) {\n      var inner = new SerialDisposable(), s = this.source.subscribe(new SwitchObserver(o, inner));\n      return new BinaryDisposable(s, inner);\n    };\n\n    inherits(SwitchObserver, AbstractObserver);\n    function SwitchObserver(o, inner) {\n      this.o = o;\n      this.inner = inner;\n      this.stopped = false;\n      this.latest = 0;\n      this.hasLatest = false;\n      AbstractObserver.call(this);\n    }\n\n    SwitchObserver.prototype.next = function (innerSource) {\n      var d = new SingleAssignmentDisposable(), id = ++this.latest;\n      this.hasLatest = true;\n      this.inner.setDisposable(d);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      d.setDisposable(innerSource.subscribe(new InnerObserver(this, id)));\n    };\n\n    SwitchObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    SwitchObserver.prototype.completed = function () {\n      this.stopped = true;\n      !this.hasLatest && this.o.onCompleted();\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(parent, id) {\n      this.parent = parent;\n      this.id = id;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function (x) {\n      this.parent.latest === this.id && this.parent.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.parent.latest === this.id && this.parent.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      if (this.parent.latest === this.id) {\n        this.parent.hasLatest = false;\n        this.parent.stopped && this.parent.o.onCompleted();\n      }\n    };\n\n    return SwitchObservable;\n  }(ObservableBase));\n\n  /**\n  * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n  * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n  */\n  observableProto['switch'] = observableProto.switchLatest = function () {\n    return new SwitchObservable(this);\n  };\n\n  var TakeUntilObservable = (function(__super__) {\n    inherits(TakeUntilObservable, __super__);\n\n    function TakeUntilObservable(source, other) {\n      this.source = source;\n      this.other = isPromise(other) ? observableFromPromise(other) : other;\n      __super__.call(this);\n    }\n\n    TakeUntilObservable.prototype.subscribeCore = function(o) {\n      return new BinaryDisposable(\n        this.source.subscribe(o),\n        this.other.subscribe(new TakeUntilObserver(o))\n      );\n    };\n\n    return TakeUntilObservable;\n  }(ObservableBase));\n\n  var TakeUntilObserver = (function(__super__) {\n    inherits(TakeUntilObserver, __super__);\n    function TakeUntilObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    TakeUntilObserver.prototype.next = function () {\n      this._o.onCompleted();\n    };\n\n    TakeUntilObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    TakeUntilObserver.prototype.onCompleted = noop;\n\n    return TakeUntilObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence until the other observable sequence produces a value.\n   * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n   */\n  observableProto.takeUntil = function (other) {\n    return new TakeUntilObservable(this, other);\n  };\n\n  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var WithLatestFromObservable = (function(__super__) {\n    inherits(WithLatestFromObservable, __super__);\n    function WithLatestFromObservable(source, sources, resultSelector) {\n      this._s = source;\n      this._ss = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    WithLatestFromObservable.prototype.subscribeCore = function (o) {\n      var len = this._ss.length;\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        values: new Array(len)\n      };\n\n      var n = this._ss.length, subscriptions = new Array(n + 1);\n      for (var i = 0; i < n; i++) {\n        var other = this._ss[i], sad = new SingleAssignmentDisposable();\n        isPromise(other) && (other = observableFromPromise(other));\n        sad.setDisposable(other.subscribe(new WithLatestFromOtherObserver(o, i, state)));\n        subscriptions[i] = sad;\n      }\n\n      var outerSad = new SingleAssignmentDisposable();\n      outerSad.setDisposable(this._s.subscribe(new WithLatestFromSourceObserver(o, this._cb, state)));\n      subscriptions[n] = outerSad;\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return WithLatestFromObservable;\n  }(ObservableBase));\n\n  var WithLatestFromOtherObserver = (function (__super__) {\n    inherits(WithLatestFromOtherObserver, __super__);\n    function WithLatestFromOtherObserver(o, i, state) {\n      this._o = o;\n      this._i = i;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromOtherObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      this._state.hasValueAll = this._state.hasValue.every(identity);\n    };\n\n    WithLatestFromOtherObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromOtherObserver.prototype.completed = noop;\n\n    return WithLatestFromOtherObserver;\n  }(AbstractObserver));\n\n  var WithLatestFromSourceObserver = (function (__super__) {\n    inherits(WithLatestFromSourceObserver, __super__);\n    function WithLatestFromSourceObserver(o, cb, state) {\n      this._o = o;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromSourceObserver.prototype.next = function (x) {\n      var allValues = [x].concat(this._state.values);\n      if (!this._state.hasValueAll) { return; }\n      var res = tryCatch(this._cb).apply(null, allValues);\n      if (res === errorObj) { return this._o.onError(res.e); }\n      this._o.onNext(res);\n    };\n\n    WithLatestFromSourceObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromSourceObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return WithLatestFromSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.withLatestFrom = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    return new WithLatestFromObservable(this, args, resultSelector);\n  };\n\n  function falseFactory() { return false; }\n  function emptyArrayFactory() { return []; }\n\n  var ZipObservable = (function(__super__) {\n    inherits(ZipObservable, __super__);\n    function ZipObservable(sources, resultSelector) {\n      this._s = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    ZipObservable.prototype.subscribeCore = function(observer) {\n      var n = this._s.length,\n          subscriptions = new Array(n),\n          done = arrayInitialize(n, falseFactory),\n          q = arrayInitialize(n, emptyArrayFactory);\n\n      for (var i = 0; i < n; i++) {\n        var source = this._s[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new ZipObserver(observer, i, this, q, done)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return ZipObservable;\n  }(ObservableBase));\n\n  var ZipObserver = (function (__super__) {\n    inherits(ZipObserver, __super__);\n    function ZipObserver(o, i, p, q, d) {\n      this._o = o;\n      this._i = i;\n      this._p = p;\n      this._q = q;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    function notEmpty(x) { return x.length > 0; }\n    function shiftEach(x) { return x.shift(); }\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    ZipObserver.prototype.next = function (x) {\n      this._q[this._i].push(x);\n      if (this._q.every(notEmpty)) {\n        var queuedValues = this._q.map(shiftEach);\n        var res = tryCatch(this._p._cb).apply(null, queuedValues);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._d.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    ZipObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ZipObserver.prototype.completed = function () {\n      this._d[this._i] = true;\n      this._d.every(identity) && this._o.onCompleted();\n    };\n\n    return ZipObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n   * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n   */\n  observableProto.zip = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    var parent = this;\n    args.unshift(parent);\n\n    return new ZipObservable(args, resultSelector);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n   * @param arguments Observable sources.\n   * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  Observable.zip = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args = isFunction(args[1]) ? args[0].concat(args[1]) : args[0];\n    }\n    var first = args.shift();\n    return first.zip.apply(first, args);\n  };\n\nfunction falseFactory() { return false; }\nfunction emptyArrayFactory() { return []; }\nfunction argumentsToArray() {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return args;\n}\n\nvar ZipIterableObservable = (function(__super__) {\n  inherits(ZipIterableObservable, __super__);\n  function ZipIterableObservable(sources, cb) {\n    this.sources = sources;\n    this._cb = cb;\n    __super__.call(this);\n  }\n\n  ZipIterableObservable.prototype.subscribeCore = function (o) {\n    var sources = this.sources, len = sources.length, subscriptions = new Array(len);\n\n    var state = {\n      q: arrayInitialize(len, emptyArrayFactory),\n      done: arrayInitialize(len, falseFactory),\n      cb: this._cb,\n      o: o\n    };\n\n    for (var i = 0; i < len; i++) {\n      (function (i) {\n        var source = sources[i], sad = new SingleAssignmentDisposable();\n        (isArrayLike(source) || isIterable(source)) && (source = observableFrom(source));\n\n        subscriptions[i] = sad;\n        sad.setDisposable(source.subscribe(new ZipIterableObserver(state, i)));\n      }(i));\n    }\n\n    return new NAryDisposable(subscriptions);\n  };\n\n  return ZipIterableObservable;\n}(ObservableBase));\n\nvar ZipIterableObserver = (function (__super__) {\n  inherits(ZipIterableObserver, __super__);\n  function ZipIterableObserver(s, i) {\n    this._s = s;\n    this._i = i;\n    __super__.call(this);\n  }\n\n  function notEmpty(x) { return x.length > 0; }\n  function shiftEach(x) { return x.shift(); }\n  function notTheSame(i) {\n    return function (x, j) {\n      return j !== i;\n    };\n  }\n\n  ZipIterableObserver.prototype.next = function (x) {\n    this._s.q[this._i].push(x);\n    if (this._s.q.every(notEmpty)) {\n      var queuedValues = this._s.q.map(shiftEach),\n          res = tryCatch(this._s.cb).apply(null, queuedValues);\n      if (res === errorObj) { return this._s.o.onError(res.e); }\n      this._s.o.onNext(res);\n    } else if (this._s.done.filter(notTheSame(this._i)).every(identity)) {\n      this._s.o.onCompleted();\n    }\n  };\n\n  ZipIterableObserver.prototype.error = function (e) { this._s.o.onError(e); };\n\n  ZipIterableObserver.prototype.completed = function () {\n    this._s.done[this._i] = true;\n    this._s.done.every(identity) && this._s.o.onCompleted();\n  };\n\n  return ZipIterableObserver;\n}(AbstractObserver));\n\n/**\n * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n */\nobservableProto.zipIterable = function () {\n  if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n\n  var parent = this;\n  args.unshift(parent);\n  return new ZipIterableObservable(args, resultSelector);\n};\n\n  function asObservable(source) {\n    return function subscribe(o) { return source.subscribe(o); };\n  }\n\n  /**\n   *  Hides the identity of an observable sequence.\n   * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n   */\n  observableProto.asObservable = function () {\n    return new AnonymousObservable(asObservable(this), this);\n  };\n\n  var DematerializeObservable = (function (__super__) {\n    inherits(DematerializeObservable, __super__);\n    function DematerializeObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    DematerializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DematerializeObserver(o));\n    };\n\n    return DematerializeObservable;\n  }(ObservableBase));\n\n  var DematerializeObserver = (function (__super__) {\n    inherits(DematerializeObserver, __super__);\n\n    function DematerializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    DematerializeObserver.prototype.next = function (x) { x.accept(this._o); };\n    DematerializeObserver.prototype.error = function (e) { this._o.onError(e); };\n    DematerializeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DematerializeObserver;\n  }(AbstractObserver));\n\n  /**\n   * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n   * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n   */\n  observableProto.dematerialize = function () {\n    return new DematerializeObservable(this);\n  };\n\n  var DistinctUntilChangedObservable = (function(__super__) {\n    inherits(DistinctUntilChangedObservable, __super__);\n    function DistinctUntilChangedObservable(source, keyFn, comparer) {\n      this.source = source;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctUntilChangedObserver(o, this.keyFn, this.comparer));\n    };\n\n    return DistinctUntilChangedObservable;\n  }(ObservableBase));\n\n  var DistinctUntilChangedObserver = (function(__super__) {\n    inherits(DistinctUntilChangedObserver, __super__);\n    function DistinctUntilChangedObserver(o, keyFn, comparer) {\n      this.o = o;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      this.hasCurrentKey = false;\n      this.currentKey = null;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObserver.prototype.next = function (x) {\n      var key = x, comparerEquals;\n      if (isFunction(this.keyFn)) {\n        key = tryCatch(this.keyFn)(x);\n        if (key === errorObj) { return this.o.onError(key.e); }\n      }\n      if (this.hasCurrentKey) {\n        comparerEquals = tryCatch(this.comparer)(this.currentKey, key);\n        if (comparerEquals === errorObj) { return this.o.onError(comparerEquals.e); }\n      }\n      if (!this.hasCurrentKey || !comparerEquals) {\n        this.hasCurrentKey = true;\n        this.currentKey = key;\n        this.o.onNext(x);\n      }\n    };\n    DistinctUntilChangedObserver.prototype.error = function(e) {\n      this.o.onError(e);\n    };\n    DistinctUntilChangedObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return DistinctUntilChangedObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Returns an observable sequence that contains only distinct contiguous elements according to the keyFn and the comparer.\n  * @param {Function} [keyFn] A function to compute the comparison key for each element. If not provided, it projects the value.\n  * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n  * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n  */\n  observableProto.distinctUntilChanged = function (keyFn, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctUntilChangedObservable(this, keyFn, comparer);\n  };\n\n  var TapObservable = (function(__super__) {\n    inherits(TapObservable,__super__);\n    function TapObservable(source, observerOrOnNext, onError, onCompleted) {\n      this.source = source;\n      this._oN = observerOrOnNext;\n      this._oE = onError;\n      this._oC = onCompleted;\n      __super__.call(this);\n    }\n\n    TapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, p) {\n      this.o = o;\n      this.t = !p._oN || isFunction(p._oN) ?\n        observerCreate(p._oN || noop, p._oE || noop, p._oC || noop) :\n        p._oN;\n      this.isStopped = false;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function(x) {\n      var res = tryCatch(this.t.onNext).call(this.t, x);\n      if (res === errorObj) { this.o.onError(res.e); }\n      this.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function(err) {\n      var res = tryCatch(this.t.onError).call(this.t, err);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onError(err);\n    };\n    InnerObserver.prototype.completed = function() {\n      var res = tryCatch(this.t.onCompleted).call(this.t);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onCompleted();\n    };\n\n    return TapObservable;\n  }(ObservableBase));\n\n  /**\n  *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an o.\n  * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto['do'] = observableProto.tap = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) {\n    return new TapObservable(this, observerOrOnNext, onError, onCompleted);\n  };\n\n  /**\n  *  Invokes an action for each element in the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onNext Action to invoke for each element in the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnNext = observableProto.tapOnNext = function (onNext, thisArg) {\n    return this.tap(typeof thisArg !== 'undefined' ? function (x) { onNext.call(thisArg, x); } : onNext);\n  };\n\n  /**\n  *  Invokes an action upon exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnError = observableProto.tapOnError = function (onError, thisArg) {\n    return this.tap(noop, typeof thisArg !== 'undefined' ? function (e) { onError.call(thisArg, e); } : onError);\n  };\n\n  /**\n  *  Invokes an action upon graceful termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnCompleted = observableProto.tapOnCompleted = function (onCompleted, thisArg) {\n    return this.tap(noop, null, typeof thisArg !== 'undefined' ? function () { onCompleted.call(thisArg); } : onCompleted);\n  };\n\n  var FinallyObservable = (function (__super__) {\n    inherits(FinallyObservable, __super__);\n    function FinallyObservable(source, fn, thisArg) {\n      this.source = source;\n      this._fn = bindCallback(fn, thisArg, 0);\n      __super__.call(this);\n    }\n\n    FinallyObservable.prototype.subscribeCore = function (o) {\n      var d = tryCatch(this.source.subscribe).call(this.source, o);\n      if (d === errorObj) {\n        this._fn();\n        thrower(d.e);\n      }\n\n      return new FinallyDisposable(d, this._fn);\n    };\n\n    function FinallyDisposable(s, fn) {\n      this.isDisposed = false;\n      this._s = s;\n      this._fn = fn;\n    }\n    FinallyDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        var res = tryCatch(this._s.dispose).call(this._s);\n        this._fn();\n        res === errorObj && thrower(res.e);\n      }\n    };\n\n    return FinallyObservable;\n\n  }(ObservableBase));\n\n  /**\n   *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n   * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n   * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n   */\n  observableProto['finally'] = function (action, thisArg) {\n    return new FinallyObservable(this, action, thisArg);\n  };\n\n  var IgnoreElementsObservable = (function(__super__) {\n    inherits(IgnoreElementsObservable, __super__);\n\n    function IgnoreElementsObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    IgnoreElementsObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    function InnerObserver(o) {\n      this.o = o;\n      this.isStopped = false;\n    }\n    InnerObserver.prototype.onNext = noop;\n    InnerObserver.prototype.onError = function (err) {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onError(err);\n      }\n    };\n    InnerObserver.prototype.onCompleted = function () {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onCompleted();\n      }\n    };\n    InnerObserver.prototype.dispose = function() { this.isStopped = true; };\n    InnerObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.observer.onError(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return IgnoreElementsObservable;\n  }(ObservableBase));\n\n  /**\n   *  Ignores all elements in an observable sequence leaving only the termination messages.\n   * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n   */\n  observableProto.ignoreElements = function () {\n    return new IgnoreElementsObservable(this);\n  };\n\n  var MaterializeObservable = (function (__super__) {\n    inherits(MaterializeObservable, __super__);\n    function MaterializeObservable(source, fn) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MaterializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new MaterializeObserver(o));\n    };\n\n    return MaterializeObservable;\n  }(ObservableBase));\n\n  var MaterializeObserver = (function (__super__) {\n    inherits(MaterializeObserver, __super__);\n\n    function MaterializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    MaterializeObserver.prototype.next = function (x) { this._o.onNext(notificationCreateOnNext(x)) };\n    MaterializeObserver.prototype.error = function (e) { this._o.onNext(notificationCreateOnError(e)); this._o.onCompleted(); };\n    MaterializeObserver.prototype.completed = function () { this._o.onNext(notificationCreateOnCompleted()); this._o.onCompleted(); };\n\n    return MaterializeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n   * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n   */\n  observableProto.materialize = function () {\n    return new MaterializeObservable(this);\n  };\n\n  /**\n   *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n   * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n   * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n   */\n  observableProto.repeat = function (repeatCount) {\n    return enumerableRepeat(this, repeatCount).concat();\n  };\n\n  /**\n   *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n   *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n   *\n   * @example\n   *  var res = retried = retry.repeat();\n   *  var res = retried = retry.repeat(2);\n   * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retry = function (retryCount) {\n    return enumerableRepeat(this, retryCount).catchError();\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RetryWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RetryWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RetryWhenObservable, __super__);\n\n    RetryWhenObservable.prototype.subscribeCore = function (o) {\n      var exceptions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(exceptions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            exceptions.onNext(exn);\n            outer.dispose();\n          },\n          function() { o.onCompleted(); }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RetryWhenObservable;\n  }(ObservableBase));\n\n  observableProto.retryWhen = function (notifier) {\n    return new RetryWhenObservable(repeat(this), notifier);\n  };\n\n  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RepeatWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RepeatWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RepeatWhenObservable, __super__);\n\n    RepeatWhenObservable.prototype.subscribeCore = function (o) {\n      var completions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(completions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) { o.onError(exn); },\n          function() {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            completions.onNext(null);\n            outer.dispose();\n          }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RepeatWhenObservable;\n  }(ObservableBase));\n\n  observableProto.repeatWhen = function (notifier) {\n    return new RepeatWhenObservable(repeat(this), notifier);\n  };\n\n  var ScanObservable = (function(__super__) {\n    inherits(ScanObservable, __super__);\n    function ScanObservable(source, accumulator, hasSeed, seed) {\n      this.source = source;\n      this.accumulator = accumulator;\n      this.hasSeed = hasSeed;\n      this.seed = seed;\n      __super__.call(this);\n    }\n\n    ScanObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new ScanObserver(o,this));\n    };\n\n    return ScanObservable;\n  }(ObservableBase));\n\n  var ScanObserver = (function (__super__) {\n    inherits(ScanObserver, __super__);\n    function ScanObserver(o, parent) {\n      this._o = o;\n      this._p = parent;\n      this._fn = parent.accumulator;\n      this._hs = parent.hasSeed;\n      this._s = parent.seed;\n      this._ha = false;\n      this._a = null;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    ScanObserver.prototype.next = function (x) {\n      !this._hv && (this._hv = true);\n      if (this._ha) {\n        this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n      } else {\n        this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n        this._ha = true;\n      }\n      if (this._a === errorObj) { return this._o.onError(this._a.e); }\n      this._o.onNext(this._a);\n      this._i++;\n    };\n\n    ScanObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ScanObserver.prototype.completed = function () {\n      !this._hv && this._hs && this._o.onNext(this._s);\n      this._o.onCompleted();\n    };\n\n    return ScanObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n  *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n  * @param {Mixed} [seed] The initial accumulator value.\n  * @param {Function} accumulator An accumulator function to be invoked on each element.\n  * @returns {Observable} An observable sequence containing the accumulated values.\n  */\n  observableProto.scan = function () {\n    var hasSeed = false, seed, accumulator = arguments[0];\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new ScanObservable(this, accumulator, hasSeed, seed);\n  };\n\n  var SkipLastObservable = (function (__super__) {\n    inherits(SkipLastObservable, __super__);\n    function SkipLastObservable(source, c) {\n      this.source = source;\n      this._c = c;\n      __super__.call(this);\n    }\n\n    SkipLastObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipLastObserver(o, this._c));\n    };\n\n    return SkipLastObservable;\n  }(ObservableBase));\n\n  var SkipLastObserver = (function (__super__) {\n    inherits(SkipLastObserver, __super__);\n    function SkipLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    SkipLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._o.onNext(this._q.shift());\n    };\n\n    SkipLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    SkipLastObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return SkipLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses a specified number of elements at the end of an observable sequence.\n   * @description\n   *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n   *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n   * @param count Number of elements to bypass at the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n   */\n  observableProto.skipLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipLastObservable(this, count);\n  };\n\n  /**\n   *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n   *  @example\n   *  var res = source.startWith(1, 2, 3);\n   *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n   * @param {Arguments} args The specified values to prepend to the observable sequence\n   * @returns {Observable} The source sequence prepended with the specified values.\n   */\n  observableProto.startWith = function () {\n    var values, scheduler, start = 0;\n    if (!!arguments.length && isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      start = 1;\n    } else {\n      scheduler = immediateScheduler;\n    }\n    for(var args = [], i = start, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableConcat.apply(null, [observableFromArray(args, scheduler), this]);\n  };\n\n  var TakeLastObserver = (function (__super__) {\n    inherits(TakeLastObserver, __super__);\n    function TakeLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastObserver.prototype.completed = function () {\n      while (this._q.length > 0) { this._o.onNext(this._q.shift()); }\n      this._o.onCompleted();\n    };\n\n    return TakeLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns a specified number of contiguous elements from the end of an observable sequence.\n   * @description\n   *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n   *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastObserver(o, count));\n    }, source);\n  };\n\nobservableProto.flatMapConcat = observableProto.concatMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).merge(1);\n};\n  var MapObservable = (function (__super__) {\n    inherits(MapObservable, __super__);\n\n    function MapObservable(source, selector, thisArg) {\n      this.source = source;\n      this.selector = bindCallback(selector, thisArg, 3);\n      __super__.call(this);\n    }\n\n    function innerMap(selector, self) {\n      return function (x, i, o) { return selector.call(this, self.selector(x, i, o), i, o); };\n    }\n\n    MapObservable.prototype.internalMap = function (selector, thisArg) {\n      return new MapObservable(this.source, innerMap(selector, this), thisArg);\n    };\n\n    MapObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, selector, source) {\n      this.o = o;\n      this.selector = selector;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var result = tryCatch(this.selector)(x, this.i++, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n      this.o.onNext(result);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return MapObservable;\n\n  }(ObservableBase));\n\n  /**\n  * Projects each element of an observable sequence into a new form by incorporating the element's index.\n  * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n  */\n  observableProto.map = observableProto.select = function (selector, thisArg) {\n    var selectorFn = typeof selector === 'function' ? selector : function () { return selector; };\n    return this instanceof MapObservable ?\n      this.internalMap(selectorFn, thisArg) :\n      new MapObservable(this, selectorFn, thisArg);\n  };\n\n  function plucker(args, len) {\n    return function mapper(x) {\n      var currentProp = x;\n      for (var i = 0; i < len; i++) {\n        var p = currentProp[args[i]];\n        if (typeof p !== 'undefined') {\n          currentProp = p;\n        } else {\n          return undefined;\n        }\n      }\n      return currentProp;\n    };\n  }\n\n  /**\n   * Retrieves the value of a specified nested property from all elements in\n   * the Observable sequence.\n   * @param {Arguments} arguments The nested properties to pluck.\n   * @returns {Observable} Returns a new Observable sequence of property values.\n   */\n  observableProto.pluck = function () {\n    var len = arguments.length, args = new Array(len);\n    if (len === 0) { throw new Error('List of properties cannot be empty.'); }\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return this.map(plucker(args, len));\n  };\n\nobservableProto.flatMap = observableProto.selectMany = observableProto.mergeMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).mergeAll();\n};\n\nobservableProto.flatMapLatest = observableProto.switchMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).switchLatest();\n};\n\n  var SkipObservable = (function(__super__) {\n    inherits(SkipObservable, __super__);\n    function SkipObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    SkipObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipObserver(o, this._count));\n    };\n\n    function SkipObserver(o, c) {\n      this._o = o;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(SkipObserver, AbstractObserver);\n\n    SkipObserver.prototype.next = function (x) {\n      if (this._r <= 0) {\n        this._o.onNext(x);\n      } else {\n        this._r--;\n      }\n    };\n    SkipObserver.prototype.error = function(e) { this._o.onError(e); };\n    SkipObserver.prototype.completed = function() { this._o.onCompleted(); };\n\n    return SkipObservable;\n  }(ObservableBase));\n\n  /**\n   * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n   * @param {Number} count The number of elements to skip before returning the remaining elements.\n   * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n   */\n  observableProto.skip = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipObservable(this, count);\n  };\n\n  var SkipWhileObservable = (function (__super__) {\n    inherits(SkipWhileObservable, __super__);\n    function SkipWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SkipWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipWhileObserver(o, this));\n    };\n\n    return SkipWhileObservable;\n  }(ObservableBase));\n\n  var SkipWhileObserver = (function (__super__) {\n    inherits(SkipWhileObserver, __super__);\n\n    function SkipWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = false;\n      __super__.call(this);\n    }\n\n    SkipWhileObserver.prototype.next = function (x) {\n      if (!this._r) {\n        var res = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._r = !res;\n      }\n      this._r && this._o.onNext(x);\n    };\n    SkipWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n   *  The element's index is used in the logic of the predicate function.\n   *\n   *  var res = source.skipWhile(function (value) { return value < 10; });\n   *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n   */\n  observableProto.skipWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new SkipWhileObservable(this, fn);\n  };\n\n  var TakeObservable = (function(__super__) {\n    inherits(TakeObservable, __super__);\n    function TakeObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    TakeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeObserver(o, this._count));\n    };\n\n    function TakeObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(TakeObserver, AbstractObserver);\n\n    TakeObserver.prototype.next = function (x) {\n      if (this._r-- > 0) {\n        this._o.onNext(x);\n        this._r <= 0 && this._o.onCompleted();\n      }\n    };\n\n    TakeObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n   * @param {Number} count The number of elements to return.\n   * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n   * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n   */\n  observableProto.take = function (count, scheduler) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    if (count === 0) { return observableEmpty(scheduler); }\n    return new TakeObservable(this, count);\n  };\n\n  var TakeWhileObservable = (function (__super__) {\n    inherits(TakeWhileObservable, __super__);\n    function TakeWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    TakeWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeWhileObserver(o, this));\n    };\n\n    return TakeWhileObservable;\n  }(ObservableBase));\n\n  var TakeWhileObserver = (function (__super__) {\n    inherits(TakeWhileObserver, __super__);\n\n    function TakeWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = true;\n      __super__.call(this);\n    }\n\n    TakeWhileObserver.prototype.next = function (x) {\n      if (this._r) {\n        this._r = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (this._r === errorObj) { return this._o.onError(this._r.e); }\n      }\n      if (this._r) {\n        this._o.onNext(x);\n      } else {\n        this._o.onCompleted();\n      }\n    };\n    TakeWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns elements from an observable sequence as long as a specified condition is true.\n   *  The element's index is used in the logic of the predicate function.\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n   */\n  observableProto.takeWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new TakeWhileObservable(this, fn);\n  };\n\n  var FilterObservable = (function (__super__) {\n    inherits(FilterObservable, __super__);\n\n    function FilterObservable(source, predicate, thisArg) {\n      this.source = source;\n      this.predicate = bindCallback(predicate, thisArg, 3);\n      __super__.call(this);\n    }\n\n    FilterObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.predicate, this));\n    };\n\n    function innerPredicate(predicate, self) {\n      return function(x, i, o) { return self.predicate(x, i, o) && predicate.call(this, x, i, o); }\n    }\n\n    FilterObservable.prototype.internalFilter = function(predicate, thisArg) {\n      return new FilterObservable(this.source, innerPredicate(predicate, this), thisArg);\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, predicate, source) {\n      this.o = o;\n      this.predicate = predicate;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var shouldYield = tryCatch(this.predicate)(x, this.i++, this.source);\n      if (shouldYield === errorObj) {\n        return this.o.onError(shouldYield.e);\n      }\n      shouldYield && this.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return FilterObservable;\n\n  }(ObservableBase));\n\n  /**\n  *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n  * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n  */\n  observableProto.filter = observableProto.where = function (predicate, thisArg) {\n    return this instanceof FilterObservable ? this.internalFilter(predicate, thisArg) :\n      new FilterObservable(this, predicate, thisArg);\n  };\n\nfunction createCbObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createCbHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createCbHandler(o, ctx, selector) {\n  return function handler () {\n    var len = arguments.length, results = new Array(len);\n    for(var i = 0; i < len; i++) { results[i] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a callback function to an observable sequence.\n *\n * @param {Function} fn Function with a callback as the last parameter to convert to an Observable sequence.\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n */\nObservable.fromCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n\n    var len = arguments.length, args = new Array(len)\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createCbObservable(fn, ctx, selector, args);\n  };\n};\n\nfunction createNodeObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createNodeHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createNodeHandler(o, ctx, selector) {\n  return function handler () {\n    var err = arguments[0];\n    if (err) { return o.onError(err); }\n\n    var len = arguments.length, results = [];\n    for(var i = 1; i < len; i++) { results[i - 1] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      var results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n * @param {Function} fn The function to call\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n */\nObservable.fromNodeCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createNodeObservable(fn, ctx, selector, args);\n  };\n};\n\n  function isNodeList(el) {\n    if (root.StaticNodeList) {\n      // IE8 Specific\n      // instanceof is slower than Object#toString, but Object#toString will not work as intended in IE8\n      return el instanceof root.StaticNodeList || el instanceof root.NodeList;\n    } else {\n      return Object.prototype.toString.call(el) === '[object NodeList]';\n    }\n  }\n\n  function ListenDisposable(e, n, fn) {\n    this._e = e;\n    this._n = n;\n    this._fn = fn;\n    this._e.addEventListener(this._n, this._fn, false);\n    this.isDisposed = false;\n  }\n  ListenDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this._e.removeEventListener(this._n, this._fn, false);\n      this.isDisposed = true;\n    }\n  };\n\n  function createEventListener (el, eventName, handler) {\n    var disposables = new CompositeDisposable();\n\n    // Asume NodeList or HTMLCollection\n    var elemToString = Object.prototype.toString.call(el);\n    if (isNodeList(el) || elemToString === '[object HTMLCollection]') {\n      for (var i = 0, len = el.length; i < len; i++) {\n        disposables.add(createEventListener(el.item(i), eventName, handler));\n      }\n    } else if (el) {\n      disposables.add(new ListenDisposable(el, eventName, handler));\n    }\n\n    return disposables;\n  }\n\n  /**\n   * Configuration option to determine whether to use native events only\n   */\n  Rx.config.useNativeEvents = false;\n\n  var EventObservable = (function(__super__) {\n    inherits(EventObservable, __super__);\n    function EventObservable(el, name, fn) {\n      this._el = el;\n      this._n = name;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventObservable.prototype.subscribeCore = function (o) {\n      return createEventListener(\n        this._el,\n        this._n,\n        createHandler(o, this._fn));\n    };\n\n    return EventObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n   * @param {Object} element The DOMElement or NodeList to attach a listener.\n   * @param {String} eventName The event name to attach the observable sequence.\n   * @param {Object} eventListenerOptions An object describing EventListenerOptions\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n   */\n  Observable.fromEvent = function (element, eventName, selector, eventListenerOptions) {\n    // Node.js specific\n    if (element.addListener) {\n      return fromEventPattern(\n        function (h) { element.addListener(eventName, h, eventListenerOptions); },\n        function (h) { element.removeListener(eventName, h, eventListenerOptions); },\n        selector);\n    }\n\n    // Use only if non-native events are allowed\n    if (!Rx.config.useNativeEvents) {\n      // Handles jq, Angular.js, Zepto, Marionette, Ember.js\n      if (typeof element.on === 'function' && typeof element.off === 'function') {\n        return fromEventPattern(\n          function (h) { element.on(eventName, h, eventListenerOptions); },\n          function (h) { element.off(eventName, h, eventListenerOptions); },\n          selector);\n      }\n    }\n\n    return new EventObservable(element, eventName, selector).publish().refCount();\n  };\n\n  var EventPatternObservable = (function(__super__) {\n    inherits(EventPatternObservable, __super__);\n    function EventPatternObservable(add, del, fn) {\n      this._add = add;\n      this._del = del;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventPatternObservable.prototype.subscribeCore = function (o) {\n      var fn = createHandler(o, this._fn);\n      var returnValue = this._add(fn);\n      return new EventPatternDisposable(this._del, fn, returnValue);\n    };\n\n    function EventPatternDisposable(del, fn, ret) {\n      this._del = del;\n      this._fn = fn;\n      this._ret = ret;\n      this.isDisposed = false;\n    }\n\n    EventPatternDisposable.prototype.dispose = function () {\n      if(!this.isDisposed) {\n        isFunction(this._del) && this._del(this._fn, this._ret);\n        this.isDisposed = true;\n      }\n    };\n\n    return EventPatternObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n   * @param {Function} addHandler The function to add a handler to the emitter.\n   * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence which wraps an event from an event emitter\n   */\n  var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) {\n    return new EventPatternObservable(addHandler, removeHandler, selector).publish().refCount();\n  };\n\n  var FromPromiseObservable = (function(__super__) {\n    inherits(FromPromiseObservable, __super__);\n    function FromPromiseObservable(p, s) {\n      this._p = p;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleNext(s, state) {\n      var o = state[0], data = state[1];\n      o.onNext(data);\n      o.onCompleted();\n    }\n\n    function scheduleError(s, state) {\n      var o = state[0], err = state[1];\n      o.onError(err);\n    }\n\n    FromPromiseObservable.prototype.subscribeCore = function(o) {\n      var sad = new SingleAssignmentDisposable(), self = this, p = this._p;\n\n      if (isFunction(p)) {\n        p = tryCatch(p)();\n        if (p === errorObj) {\n          o.onError(p.e);\n          return sad;\n        }\n      }\n\n      p\n        .then(function (data) {\n          sad.setDisposable(self._s.schedule([o, data], scheduleNext));\n        }, function (err) {\n          sad.setDisposable(self._s.schedule([o, err], scheduleError));\n        });\n\n      return sad;\n    };\n\n    return FromPromiseObservable;\n  }(ObservableBase));\n\n  /**\n  * Converts a Promise to an Observable sequence\n  * @param {Promise} An ES6 Compliant promise.\n  * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n  */\n  var observableFromPromise = Observable.fromPromise = function (promise, scheduler) {\n    scheduler || (scheduler = defaultScheduler);\n    return new FromPromiseObservable(promise, scheduler);\n  };\n\n  /*\n   * Converts an existing observable sequence to an ES6 Compatible Promise\n   * @example\n   * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n   *\n   * // With config\n   * Rx.config.Promise = RSVP.Promise;\n   * var promise = Rx.Observable.return(42).toPromise();\n   * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n   * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n   */\n  observableProto.toPromise = function (promiseCtor) {\n    promiseCtor || (promiseCtor = Rx.config.Promise);\n    if (!promiseCtor) { throw new NotSupportedError('Promise type not provided nor in Rx.config.Promise'); }\n    var source = this;\n    return new promiseCtor(function (resolve, reject) {\n      // No cancellation can be done\n      var value;\n      source.subscribe(function (v) {\n        value = v;\n      }, reject, function () {\n        resolve(value);\n      });\n    });\n  };\n\n  /**\n   * Invokes the asynchronous function, surfacing the result through an observable sequence.\n   * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   */\n  Observable.startAsync = function (functionAsync) {\n    var promise = tryCatch(functionAsync)();\n    if (promise === errorObj) { return observableThrow(promise.e); }\n    return observableFromPromise(promise);\n  };\n\n  var MulticastObservable = (function (__super__) {\n    inherits(MulticastObservable, __super__);\n    function MulticastObservable(source, fn1, fn2) {\n      this.source = source;\n      this._fn1 = fn1;\n      this._fn2 = fn2;\n      __super__.call(this);\n    }\n\n    MulticastObservable.prototype.subscribeCore = function (o) {\n      var connectable = this.source.multicast(this._fn1());\n      return new BinaryDisposable(this._fn2(connectable).subscribe(o), connectable.connect());\n    };\n\n    return MulticastObservable;\n  }(ObservableBase));\n\n  /**\n   * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n   * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n   * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n   *\n   * @example\n   * 1 - res = source.multicast(observable);\n   * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n   *\n   * @param {Function|Subject} subjectOrSubjectSelector\n   * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n   * Or:\n   * Subject to push source elements into.\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.multicast = function (subjectOrSubjectSelector, selector) {\n    return isFunction(subjectOrSubjectSelector) ?\n      new MulticastObservable(this, subjectOrSubjectSelector, selector) :\n      new ConnectableObservable(this, subjectOrSubjectSelector);\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of Multicast using a regular Subject.\n   *\n   * @example\n   * var resres = source.publish();\n   * var res = source.publish(function (x) { return x; });\n   *\n   * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publish = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new Subject(); }, selector) :\n      this.multicast(new Subject());\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.share = function () {\n    return this.publish().refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n   * This operator is a specialization of Multicast using a AsyncSubject.\n   *\n   * @example\n   * var res = source.publishLast();\n   * var res = source.publishLast(function (x) { return x; });\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishLast = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new AsyncSubject(); }, selector) :\n      this.multicast(new AsyncSubject());\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n   * This operator is a specialization of Multicast using a BehaviorSubject.\n   *\n   * @example\n   * var res = source.publishValue(42);\n   * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishValue = function (initialValueOrSelector, initialValue) {\n    return arguments.length === 2 ?\n      this.multicast(function () {\n        return new BehaviorSubject(initialValue);\n      }, initialValueOrSelector) :\n      this.multicast(new BehaviorSubject(initialValueOrSelector));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n   * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareValue = function (initialValue) {\n    return this.publishValue(initialValue).refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of Multicast using a ReplaySubject.\n   *\n   * @example\n   * var res = source.replay(null, 3);\n   * var res = source.replay(null, 3, 500);\n   * var res = source.replay(null, 3, 500, scheduler);\n   * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param windowSize [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.replay = function (selector, bufferSize, windowSize, scheduler) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new ReplaySubject(bufferSize, windowSize, scheduler); }, selector) :\n      this.multicast(new ReplaySubject(bufferSize, windowSize, scheduler));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   *\n   * @example\n   * var res = source.shareReplay(3);\n   * var res = source.shareReplay(3, 500);\n   * var res = source.shareReplay(3, 500, scheduler);\n   *\n\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareReplay = function (bufferSize, windowSize, scheduler) {\n    return this.replay(null, bufferSize, windowSize, scheduler).refCount();\n  };\n\n  var RefCountObservable = (function (__super__) {\n    inherits(RefCountObservable, __super__);\n    function RefCountObservable(source) {\n      this.source = source;\n      this._count = 0;\n      this._connectableSubscription = null;\n      __super__.call(this);\n    }\n\n    RefCountObservable.prototype.subscribeCore = function (o) {\n      var subscription = this.source.subscribe(o);\n      ++this._count === 1 && (this._connectableSubscription = this.source.connect());\n      return new RefCountDisposable(this, subscription);\n    };\n\n    function RefCountDisposable(p, s) {\n      this._p = p;\n      this._s = s;\n      this.isDisposed = false;\n    }\n\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this._s.dispose();\n        --this._p._count === 0 && this._p._connectableSubscription.dispose();\n      }\n    };\n\n    return RefCountObservable;\n  }(ObservableBase));\n\n  var ConnectableObservable = Rx.ConnectableObservable = (function (__super__) {\n    inherits(ConnectableObservable, __super__);\n    function ConnectableObservable(source, subject) {\n      this.source = source;\n      this._connection = null;\n      this._source = source.asObservable();\n      this._subject = subject;\n      __super__.call(this);\n    }\n\n    function ConnectDisposable(parent, subscription) {\n      this._p = parent;\n      this._s = subscription;\n    }\n\n    ConnectDisposable.prototype.dispose = function () {\n      if (this._s) {\n        this._s.dispose();\n        this._s = null;\n        this._p._connection = null;\n      }\n    };\n\n    ConnectableObservable.prototype.connect = function () {\n      if (!this._connection) {\n        if (this._subject.isStopped) {\n          return disposableEmpty;\n        }\n        var subscription = this._source.subscribe(this._subject);\n        this._connection = new ConnectDisposable(this, subscription);\n      }\n      return this._connection;\n    };\n\n    ConnectableObservable.prototype._subscribe = function (o) {\n      return this._subject.subscribe(o);\n    };\n\n    ConnectableObservable.prototype.refCount = function () {\n      return new RefCountObservable(this);\n    };\n\n    return ConnectableObservable;\n  }(Observable));\n\n  var TimerObservable = (function(__super__) {\n    inherits(TimerObservable, __super__);\n    function TimerObservable(dt, s) {\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimerObservable.prototype.subscribeCore = function (o) {\n      return this._s.scheduleFuture(o, this._dt, scheduleMethod);\n    };\n\n    function scheduleMethod(s, o) {\n      o.onNext(0);\n      o.onCompleted();\n    }\n\n    return TimerObservable;\n  }(ObservableBase));\n\n  function _observableTimer(dueTime, scheduler) {\n    return new TimerObservable(dueTime, scheduler);\n  }\n\n  function observableTimerDateAndPeriod(dueTime, period, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var d = dueTime, p = normalizeTime(period);\n      return scheduler.scheduleRecursiveFuture(0, d, function (count, self) {\n        if (p > 0) {\n          var now = scheduler.now();\n          d = new Date(d.getTime() + p);\n          d.getTime() <= now && (d = new Date(now + p));\n        }\n        observer.onNext(count);\n        self(count + 1, new Date(d));\n      });\n    });\n  }\n\n  function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) {\n    return dueTime === period ?\n      new AnonymousObservable(function (observer) {\n        return scheduler.schedulePeriodic(0, period, function (count) {\n          observer.onNext(count);\n          return count + 1;\n        });\n      }) :\n      observableDefer(function () {\n        return observableTimerDateAndPeriod(new Date(scheduler.now() + dueTime), period, scheduler);\n      });\n  }\n\n  /**\n   *  Returns an observable sequence that produces a value after each period.\n   *\n   * @example\n   *  1 - res = Rx.Observable.interval(1000);\n   *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n   *\n   * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n   * @returns {Observable} An observable sequence that produces a value after each period.\n   */\n  var observableinterval = Observable.interval = function (period, scheduler) {\n    return observableTimerTimeSpanAndPeriod(period, period, isScheduler(scheduler) ? scheduler : defaultScheduler);\n  };\n\n  /**\n   *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n   * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n   */\n  var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) {\n    var period;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    if (periodOrScheduler != null && typeof periodOrScheduler === 'number') {\n      period = periodOrScheduler;\n    } else if (isScheduler(periodOrScheduler)) {\n      scheduler = periodOrScheduler;\n    }\n    if ((dueTime instanceof Date || typeof dueTime === 'number') && period === undefined) {\n      return _observableTimer(dueTime, scheduler);\n    }\n    if (dueTime instanceof Date && period !== undefined) {\n      return observableTimerDateAndPeriod(dueTime, periodOrScheduler, scheduler);\n    }\n    return observableTimerTimeSpanAndPeriod(dueTime, period, scheduler);\n  };\n\n  function observableDelayRelative(source, dueTime, scheduler) {\n    return new AnonymousObservable(function (o) {\n      var active = false,\n        cancelable = new SerialDisposable(),\n        exception = null,\n        q = [],\n        running = false,\n        subscription;\n      subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) {\n        var d, shouldRun;\n        if (notification.value.kind === 'E') {\n          q = [];\n          q.push(notification);\n          exception = notification.value.error;\n          shouldRun = !running;\n        } else {\n          q.push({ value: notification.value, timestamp: notification.timestamp + dueTime });\n          shouldRun = !active;\n          active = true;\n        }\n        if (shouldRun) {\n          if (exception !== null) {\n            o.onError(exception);\n          } else {\n            d = new SingleAssignmentDisposable();\n            cancelable.setDisposable(d);\n            d.setDisposable(scheduler.scheduleRecursiveFuture(null, dueTime, function (_, self) {\n              var e, recurseDueTime, result, shouldRecurse;\n              if (exception !== null) {\n                return;\n              }\n              running = true;\n              do {\n                result = null;\n                if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) {\n                  result = q.shift().value;\n                }\n                if (result !== null) {\n                  result.accept(o);\n                }\n              } while (result !== null);\n              shouldRecurse = false;\n              recurseDueTime = 0;\n              if (q.length > 0) {\n                shouldRecurse = true;\n                recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now());\n              } else {\n                active = false;\n              }\n              e = exception;\n              running = false;\n              if (e !== null) {\n                o.onError(e);\n              } else if (shouldRecurse) {\n                self(null, recurseDueTime);\n              }\n            }));\n          }\n        }\n      });\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  function observableDelayAbsolute(source, dueTime, scheduler) {\n    return observableDefer(function () {\n      return observableDelayRelative(source, dueTime - scheduler.now(), scheduler);\n    });\n  }\n\n  function delayWithSelector(source, subscriptionDelay, delayDurationSelector) {\n    var subDelay, selector;\n    if (isFunction(subscriptionDelay)) {\n      selector = subscriptionDelay;\n    } else {\n      subDelay = subscriptionDelay;\n      selector = delayDurationSelector;\n    }\n    return new AnonymousObservable(function (o) {\n      var delays = new CompositeDisposable(), atEnd = false, subscription = new SerialDisposable();\n\n      function start() {\n        subscription.setDisposable(source.subscribe(\n          function (x) {\n            var delay = tryCatch(selector)(x);\n            if (delay === errorObj) { return o.onError(delay.e); }\n            var d = new SingleAssignmentDisposable();\n            delays.add(d);\n            d.setDisposable(delay.subscribe(\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              },\n              function (e) { o.onError(e); },\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              }\n            ));\n          },\n          function (e) { o.onError(e); },\n          function () {\n            atEnd = true;\n            subscription.dispose();\n            done();\n          }\n        ));\n      }\n\n      function done () {\n        atEnd && delays.length === 0 && o.onCompleted();\n      }\n\n      if (!subDelay) {\n        start();\n      } else {\n        subscription.setDisposable(subDelay.subscribe(start, function (e) { o.onError(e); }, start));\n      }\n\n      return new BinaryDisposable(subscription, delays);\n    }, source);\n  }\n\n  /**\n   *  Time shifts the observable sequence by dueTime.\n   *  The relative time intervals between the values are preserved.\n   *\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n   * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delay = function () {\n    var firstArg = arguments[0];\n    if (typeof firstArg === 'number' || firstArg instanceof Date) {\n      var dueTime = firstArg, scheduler = arguments[1];\n      isScheduler(scheduler) || (scheduler = defaultScheduler);\n      return dueTime instanceof Date ?\n        observableDelayAbsolute(this, dueTime, scheduler) :\n        observableDelayRelative(this, dueTime, scheduler);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return delayWithSelector(this, firstArg, arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  var DebounceObservable = (function (__super__) {\n    inherits(DebounceObservable, __super__);\n    function DebounceObservable(source, dt, s) {\n      isScheduler(s) || (s = defaultScheduler);\n      this.source = source;\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    DebounceObservable.prototype.subscribeCore = function (o) {\n      var cancelable = new SerialDisposable();\n      return new BinaryDisposable(\n        this.source.subscribe(new DebounceObserver(o, this._dt, this._s, cancelable)),\n        cancelable);\n    };\n\n    return DebounceObservable;\n  }(ObservableBase));\n\n  var DebounceObserver = (function (__super__) {\n    inherits(DebounceObserver, __super__);\n    function DebounceObserver(observer, dueTime, scheduler, cancelable) {\n      this._o = observer;\n      this._d = dueTime;\n      this._scheduler = scheduler;\n      this._c = cancelable;\n      this._v = null;\n      this._hv = false;\n      this._id = 0;\n      __super__.call(this);\n    }\n\n    function scheduleFuture(s, state) {\n      state.self._hv && state.self._id === state.currentId && state.self._o.onNext(state.x);\n      state.self._hv = false;\n    }\n\n    DebounceObserver.prototype.next = function (x) {\n      this._hv = true;\n      this._v = x;\n      var currentId = ++this._id, d = new SingleAssignmentDisposable();\n      this._c.setDisposable(d);\n      d.setDisposable(this._scheduler.scheduleFuture(this, this._d, function (_, self) {\n        self._hv && self._id === currentId && self._o.onNext(x);\n        self._hv = false;\n      }));\n    };\n\n    DebounceObserver.prototype.error = function (e) {\n      this._c.dispose();\n      this._o.onError(e);\n      this._hv = false;\n      this._id++;\n    };\n\n    DebounceObserver.prototype.completed = function () {\n      this._c.dispose();\n      this._hv && this._o.onNext(this._v);\n      this._o.onCompleted();\n      this._hv = false;\n      this._id++;\n    };\n\n    return DebounceObserver;\n  }(AbstractObserver));\n\n  function debounceWithSelector(source, durationSelector) {\n    return new AnonymousObservable(function (o) {\n      var value, hasValue = false, cancelable = new SerialDisposable(), id = 0;\n      var subscription = source.subscribe(\n        function (x) {\n          var throttle = tryCatch(durationSelector)(x);\n          if (throttle === errorObj) { return o.onError(throttle.e); }\n\n          isPromise(throttle) && (throttle = observableFromPromise(throttle));\n\n          hasValue = true;\n          value = x;\n          id++;\n          var currentid = id, d = new SingleAssignmentDisposable();\n          cancelable.setDisposable(d);\n          d.setDisposable(throttle.subscribe(\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            },\n            function (e) { o.onError(e); },\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            }\n          ));\n        },\n        function (e) {\n          cancelable.dispose();\n          o.onError(e);\n          hasValue = false;\n          id++;\n        },\n        function () {\n          cancelable.dispose();\n          hasValue && o.onNext(value);\n          o.onCompleted();\n          hasValue = false;\n          id++;\n        }\n      );\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  observableProto.debounce = function () {\n    if (isFunction (arguments[0])) {\n      return debounceWithSelector(this, arguments[0]);\n    } else if (typeof arguments[0] === 'number') {\n      return new DebounceObservable(this, arguments[0], arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  var TimestampObservable = (function (__super__) {\n    inherits(TimestampObservable, __super__);\n    function TimestampObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TimestampObserver(o, this._s));\n    };\n\n    return TimestampObservable;\n  }(ObservableBase));\n\n  var TimestampObserver = (function (__super__) {\n    inherits(TimestampObserver, __super__);\n    function TimestampObserver(o, s) {\n      this._o = o;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObserver.prototype.next = function (x) {\n      this._o.onNext({ value: x, timestamp: this._s.now() });\n    };\n\n    TimestampObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TimestampObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return TimestampObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Records the timestamp for each value in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n   *  2 - res = source.timestamp(Rx.Scheduler.default);\n   *\n   * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the default scheduler is used.\n   * @returns {Observable} An observable sequence with timestamp information on values.\n   */\n  observableProto.timestamp = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TimestampObservable(this, scheduler);\n  };\n\n  var SampleObservable = (function(__super__) {\n    inherits(SampleObservable, __super__);\n    function SampleObservable(source, sampler) {\n      this.source = source;\n      this._sampler = sampler;\n      __super__.call(this);\n    }\n\n    SampleObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        atEnd: false,\n        value: null,\n        hasValue: false,\n        sourceSubscription: new SingleAssignmentDisposable()\n      };\n\n      state.sourceSubscription.setDisposable(this.source.subscribe(new SampleSourceObserver(state)));\n      return new BinaryDisposable(\n        state.sourceSubscription,\n        this._sampler.subscribe(new SamplerObserver(state))\n      );\n    };\n\n    return SampleObservable;\n  }(ObservableBase));\n\n  var SamplerObserver = (function(__super__) {\n    inherits(SamplerObserver, __super__);\n    function SamplerObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SamplerObserver.prototype._handleMessage = function () {\n      if (this._s.hasValue) {\n        this._s.hasValue = false;\n        this._s.o.onNext(this._s.value);\n      }\n      this._s.atEnd && this._s.o.onCompleted();\n    };\n\n    SamplerObserver.prototype.next = function () { this._handleMessage(); };\n    SamplerObserver.prototype.error = function (e) { this._s.onError(e); };\n    SamplerObserver.prototype.completed = function () { this._handleMessage(); };\n\n    return SamplerObserver;\n  }(AbstractObserver));\n\n  var SampleSourceObserver = (function(__super__) {\n    inherits(SampleSourceObserver, __super__);\n    function SampleSourceObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SampleSourceObserver.prototype.next = function (x) {\n      this._s.hasValue = true;\n      this._s.value = x;\n    };\n    SampleSourceObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    SampleSourceObserver.prototype.completed = function () {\n      this._s.atEnd = true;\n      this._s.sourceSubscription.dispose();\n    };\n\n    return SampleSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Samples the observable sequence at each interval.\n   *\n   * @example\n   *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n   *  2 - res = source.sample(5000); // 5 seconds\n   *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n   *\n   * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n   * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Sampled observable sequence.\n   */\n  observableProto.sample = function (intervalOrSampler, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return typeof intervalOrSampler === 'number' ?\n      new SampleObservable(this, observableinterval(intervalOrSampler, scheduler)) :\n      new SampleObservable(this, intervalOrSampler);\n  };\n\n  var TimeoutError = Rx.TimeoutError = function(message) {\n    this.message = message || 'Timeout has occurred';\n    this.name = 'TimeoutError';\n    Error.call(this);\n  };\n  TimeoutError.prototype = Object.create(Error.prototype);\n\n  function timeoutWithSelector(source, firstTimeout, timeoutDurationSelector, other) {\n    if (isFunction(firstTimeout)) {\n      other = timeoutDurationSelector;\n      timeoutDurationSelector = firstTimeout;\n      firstTimeout = observableNever();\n    }\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var subscription = new SerialDisposable(),\n        timer = new SerialDisposable(),\n        original = new SingleAssignmentDisposable();\n\n      subscription.setDisposable(original);\n\n      var id = 0, switched = false;\n\n      function setTimer(timeout) {\n        var myId = id, d = new SingleAssignmentDisposable();\n\n        function timerWins() {\n          switched = (myId === id);\n          return switched;\n        }\n\n        timer.setDisposable(d);\n        d.setDisposable(timeout.subscribe(function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n          d.dispose();\n        }, function (e) {\n          timerWins() && o.onError(e);\n        }, function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n        }));\n      };\n\n      setTimer(firstTimeout);\n\n      function oWins() {\n        var res = !switched;\n        if (res) { id++; }\n        return res;\n      }\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (oWins()) {\n          o.onNext(x);\n          var timeout = tryCatch(timeoutDurationSelector)(x);\n          if (timeout === errorObj) { return o.onError(timeout.e); }\n          setTimer(isPromise(timeout) ? observableFromPromise(timeout) : timeout);\n        }\n      }, function (e) {\n        oWins() && o.onError(e);\n      }, function () {\n        oWins() && o.onCompleted();\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  function timeout(source, dueTime, other, scheduler) {\n    if (isScheduler(other)) {\n      scheduler = other;\n      other = observableThrow(new TimeoutError());\n    }\n    if (other instanceof Error) { other = observableThrow(other); }\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var id = 0,\n        original = new SingleAssignmentDisposable(),\n        subscription = new SerialDisposable(),\n        switched = false,\n        timer = new SerialDisposable();\n\n      subscription.setDisposable(original);\n\n      function createTimer() {\n        var myId = id;\n        timer.setDisposable(scheduler.scheduleFuture(null, dueTime, function () {\n          switched = id === myId;\n          if (switched) {\n            isPromise(other) && (other = observableFromPromise(other));\n            subscription.setDisposable(other.subscribe(o));\n          }\n        }));\n      }\n\n      createTimer();\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (!switched) {\n          id++;\n          o.onNext(x);\n          createTimer();\n        }\n      }, function (e) {\n        if (!switched) {\n          id++;\n          o.onError(e);\n        }\n      }, function () {\n        if (!switched) {\n          id++;\n          o.onCompleted();\n        }\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  observableProto.timeout = function () {\n    var firstArg = arguments[0];\n    if (firstArg instanceof Date || typeof firstArg === 'number') {\n      return timeout(this, firstArg, arguments[1], arguments[2]);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return timeoutWithSelector(this, firstArg, arguments[1], arguments[2]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n\n  /**\n   * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n   * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n   * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n   * @returns {Observable} An Observable that performs the throttle operation.\n   */\n  observableProto.throttle = function (windowDuration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    var duration = +windowDuration || 0;\n    if (duration <= 0) { throw new RangeError('windowDuration cannot be less or equal zero.'); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var lastOnNext = 0;\n      return source.subscribe(\n        function (x) {\n          var now = scheduler.now();\n          if (lastOnNext === 0 || now - lastOnNext >= duration) {\n            lastOnNext = now;\n            o.onNext(x);\n          }\n        },function (e) { o.onError(e); }, function () { o.onCompleted(); }\n      );\n    }, source);\n  };\n\n  var PausableObservable = (function (__super__) {\n    inherits(PausableObservable, __super__);\n    function PausableObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableObservable.prototype._subscribe = function (o) {\n      var conn = this.source.publish(),\n        subscription = conn.subscribe(o),\n        connection = disposableEmpty;\n\n      var pausable = this.pauser.startWith(!this.paused).distinctUntilChanged().subscribe(function (b) {\n        if (b) {\n          connection = conn.connect();\n        } else {\n          connection.dispose();\n          connection = disposableEmpty;\n        }\n      });\n\n      return new NAryDisposable([subscription, connection, pausable]);\n    };\n\n    PausableObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausable(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausable = function (pauser) {\n    return new PausableObservable(this, pauser);\n  };\n\n  function combineLatestSource(source, subject, resultSelector) {\n    return new AnonymousObservable(function (o) {\n      var hasValue = [false, false],\n        hasValueAll = false,\n        isDone = false,\n        values = new Array(2),\n        err;\n\n      function next(x, i) {\n        values[i] = x;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          if (err) { return o.onError(err); }\n          var res = tryCatch(resultSelector).apply(null, values);\n          if (res === errorObj) { return o.onError(res.e); }\n          o.onNext(res);\n        }\n        isDone && values[1] && o.onCompleted();\n      }\n\n      return new BinaryDisposable(\n        source.subscribe(\n          function (x) {\n            next(x, 0);\n          },\n          function (e) {\n            if (values[1]) {\n              o.onError(e);\n            } else {\n              err = e;\n            }\n          },\n          function () {\n            isDone = true;\n            values[1] && o.onCompleted();\n          }),\n        subject.subscribe(\n          function (x) {\n            next(x, 1);\n          },\n          function (e) { o.onError(e); },\n          function () {\n            isDone = true;\n            next(true, 1);\n          })\n        );\n    }, source);\n  }\n\n  var PausableBufferedObservable = (function (__super__) {\n    inherits(PausableBufferedObservable, __super__);\n    function PausableBufferedObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableBufferedObservable.prototype._subscribe = function (o) {\n      var q = [], previousShouldFire;\n\n      function drainQueue() { while (q.length > 0) { o.onNext(q.shift()); } }\n\n      var subscription =\n        combineLatestSource(\n          this.source,\n          this.pauser.startWith(!this.paused).distinctUntilChanged(),\n          function (data, shouldFire) {\n            return { data: data, shouldFire: shouldFire };\n          })\n          .subscribe(\n            function (results) {\n              if (previousShouldFire !== undefined && results.shouldFire !== previousShouldFire) {\n                previousShouldFire = results.shouldFire;\n                // change in shouldFire\n                if (results.shouldFire) { drainQueue(); }\n              } else {\n                previousShouldFire = results.shouldFire;\n                // new data\n                if (results.shouldFire) {\n                  o.onNext(results.data);\n                } else {\n                  q.push(results.data);\n                }\n              }\n            },\n            function (err) {\n              drainQueue();\n              o.onError(err);\n            },\n            function () {\n              drainQueue();\n              o.onCompleted();\n            }\n          );\n      return subscription;      \n    };\n\n    PausableBufferedObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableBufferedObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableBufferedObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n   * and yields the values that were buffered while paused.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausableBuffered = function (pauser) {\n    return new PausableBufferedObservable(this, pauser);\n  };\n\n  var ControlledObservable = (function (__super__) {\n    inherits(ControlledObservable, __super__);\n    function ControlledObservable (source, enableQueue, scheduler) {\n      __super__.call(this);\n      this.subject = new ControlledSubject(enableQueue, scheduler);\n      this.source = source.multicast(this.subject).refCount();\n    }\n\n    ControlledObservable.prototype._subscribe = function (o) {\n      return this.source.subscribe(o);\n    };\n\n    ControlledObservable.prototype.request = function (numberOfItems) {\n      return this.subject.request(numberOfItems == null ? -1 : numberOfItems);\n    };\n\n    return ControlledObservable;\n\n  }(Observable));\n\n  var ControlledSubject = (function (__super__) {\n    inherits(ControlledSubject, __super__);\n    function ControlledSubject(enableQueue, scheduler) {\n      enableQueue == null && (enableQueue = true);\n\n      __super__.call(this);\n      this.subject = new Subject();\n      this.enableQueue = enableQueue;\n      this.queue = enableQueue ? [] : null;\n      this.requestedCount = 0;\n      this.requestedDisposable = null;\n      this.error = null;\n      this.hasFailed = false;\n      this.hasCompleted = false;\n      this.scheduler = scheduler || currentThreadScheduler;\n    }\n\n    addProperties(ControlledSubject.prototype, Observer, {\n      _subscribe: function (o) {\n        return this.subject.subscribe(o);\n      },\n      onCompleted: function () {\n        this.hasCompleted = true;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onCompleted();\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnCompleted());\n        }\n      },\n      onError: function (error) {\n        this.hasFailed = true;\n        this.error = error;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onError(error);\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnError(error));\n        }\n      },\n      onNext: function (value) {\n        if (this.requestedCount <= 0) {\n          this.enableQueue && this.queue.push(Notification.createOnNext(value));\n        } else {\n          (this.requestedCount-- === 0) && this.disposeCurrentRequest();\n          this.subject.onNext(value);\n        }\n      },\n      _processRequest: function (numberOfItems) {\n        if (this.enableQueue) {\n          while (this.queue.length > 0 && (numberOfItems > 0 || this.queue[0].kind !== 'N')) {\n            var first = this.queue.shift();\n            first.accept(this.subject);\n            if (first.kind === 'N') {\n              numberOfItems--;\n            } else {\n              this.disposeCurrentRequest();\n              this.queue = [];\n            }\n          }\n        }\n\n        return numberOfItems;\n      },\n      request: function (number) {\n        this.disposeCurrentRequest();\n        var self = this;\n\n        this.requestedDisposable = this.scheduler.schedule(number,\n        function(s, i) {\n          var remaining = self._processRequest(i);\n          var stopped = self.hasCompleted || self.hasFailed;\n          if (!stopped && remaining > 0) {\n            self.requestedCount = remaining;\n\n            return disposableCreate(function () {\n              self.requestedCount = 0;\n            });\n              // Scheduled item is still in progress. Return a new\n              // disposable to allow the request to be interrupted\n              // via dispose.\n          }\n        });\n\n        return this.requestedDisposable;\n      },\n      disposeCurrentRequest: function () {\n        if (this.requestedDisposable) {\n          this.requestedDisposable.dispose();\n          this.requestedDisposable = null;\n        }\n      }\n    });\n\n    return ControlledSubject;\n  }(Observable));\n\n  /**\n   * Attaches a controller to the observable sequence with the ability to queue.\n   * @example\n   * var source = Rx.Observable.interval(100).controlled();\n   * source.request(3); // Reads 3 values\n   * @param {bool} enableQueue truthy value to determine if values should be queued pending the next request\n   * @param {Scheduler} scheduler determines how the requests will be scheduled\n   * @returns {Observable} The observable sequence which only propagates values on request.\n   */\n  observableProto.controlled = function (enableQueue, scheduler) {\n\n    if (enableQueue && isScheduler(enableQueue)) {\n      scheduler = enableQueue;\n      enableQueue = true;\n    }\n\n    if (enableQueue == null) {  enableQueue = true; }\n    return new ControlledObservable(this, enableQueue, scheduler);\n  };\n\n  /**\n   * Pipes the existing Observable sequence into a Node.js Stream.\n   * @param {Stream} dest The destination Node.js stream.\n   * @returns {Stream} The destination stream.\n   */\n  observableProto.pipe = function (dest) {\n    var source = this.pausableBuffered();\n\n    function onDrain() {\n      source.resume();\n    }\n\n    dest.addListener('drain', onDrain);\n\n    source.subscribe(\n      function (x) {\n        !dest.write(x) && source.pause();\n      },\n      function (err) {\n        dest.emit('error', err);\n      },\n      function () {\n        // Hack check because STDIO is not closable\n        !dest._isStdio && dest.end();\n        dest.removeListener('drain', onDrain);\n      });\n\n    source.resume();\n\n    return dest;\n  };\n\n  var TransduceObserver = (function (__super__) {\n    inherits(TransduceObserver, __super__);\n    function TransduceObserver(o, xform) {\n      this._o = o;\n      this._xform = xform;\n      __super__.call(this);\n    }\n\n    TransduceObserver.prototype.next = function (x) {\n      var res = tryCatch(this._xform['@@transducer/step']).call(this._xform, this._o, x);\n      if (res === errorObj) { this._o.onError(res.e); }\n    };\n\n    TransduceObserver.prototype.error = function (e) { this._o.onError(e); };\n\n    TransduceObserver.prototype.completed = function () {\n      this._xform['@@transducer/result'](this._o);\n    };\n\n    return TransduceObserver;\n  }(AbstractObserver));\n\n  function transformForObserver(o) {\n    return {\n      '@@transducer/init': function() {\n        return o;\n      },\n      '@@transducer/step': function(obs, input) {\n        return obs.onNext(input);\n      },\n      '@@transducer/result': function(obs) {\n        return obs.onCompleted();\n      }\n    };\n  }\n\n  /**\n   * Executes a transducer to transform the observable sequence\n   * @param {Transducer} transducer A transducer to execute\n   * @returns {Observable} An Observable sequence containing the results from the transducer.\n   */\n  observableProto.transduce = function(transducer) {\n    var source = this;\n    return new AnonymousObservable(function(o) {\n      var xform = transducer(transformForObserver(o));\n      return source.subscribe(new TransduceObserver(o, xform));\n    }, source);\n  };\n\n  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {\n    inherits(AnonymousObservable, __super__);\n\n    // Fix subscriber to check for undefined or function returned to decorate as Disposable\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.__subscribe).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function AnonymousObservable(subscribe, parent) {\n      this.source = parent;\n      this.__subscribe = subscribe;\n      __super__.call(this);\n    }\n\n    AnonymousObservable.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    return AnonymousObservable;\n\n  }(Observable));\n\n  var AutoDetachObserver = (function (__super__) {\n    inherits(AutoDetachObserver, __super__);\n\n    function AutoDetachObserver(observer) {\n      __super__.call(this);\n      this.observer = observer;\n      this.m = new SingleAssignmentDisposable();\n    }\n\n    var AutoDetachObserverPrototype = AutoDetachObserver.prototype;\n\n    AutoDetachObserverPrototype.next = function (value) {\n      var result = tryCatch(this.observer.onNext).call(this.observer, value);\n      if (result === errorObj) {\n        this.dispose();\n        thrower(result.e);\n      }\n    };\n\n    AutoDetachObserverPrototype.error = function (err) {\n      var result = tryCatch(this.observer.onError).call(this.observer, err);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.completed = function () {\n      var result = tryCatch(this.observer.onCompleted).call(this.observer);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };\n    AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };\n\n    AutoDetachObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.m.dispose();\n    };\n\n    return AutoDetachObserver;\n  }(AbstractObserver));\n\n  var InnerSubscription = function (s, o) {\n    this._s = s;\n    this._o = o;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this._s.isDisposed && this._o !== null) {\n      var idx = this._s.observers.indexOf(this._o);\n      this._s.observers.splice(idx, 1);\n      this._o = null;\n    }\n  };\n\n  /**\n   *  Represents an object that is both an observable sequence as well as an observer.\n   *  Each notification is broadcasted to all subscribed observers.\n   */\n  var Subject = Rx.Subject = (function (__super__) {\n    inherits(Subject, __super__);\n    function Subject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(Subject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n          return disposableEmpty;\n        }\n        o.onCompleted();\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onCompleted();\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.error = error;\n          this.hasError = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onNext(value);\n          }\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    /**\n     * Creates a subject from the specified observer and observable.\n     * @param {Observer} observer The observer used to send messages to the subject.\n     * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n     * @returns {Subject} Subject implemented using the given observer and observable.\n     */\n    Subject.create = function (observer, observable) {\n      return new AnonymousSubject(observer, observable);\n    };\n\n    return Subject;\n  }(Observable));\n\n  /**\n   *  Represents the result of an asynchronous operation.\n   *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n   */\n  var AsyncSubject = Rx.AsyncSubject = (function (__super__) {\n    inherits(AsyncSubject, __super__);\n\n    /**\n     * Creates a subject that can only receive one value and that value is cached for all future observations.\n     * @constructor\n     */\n    function AsyncSubject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasValue = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(AsyncSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n\n        if (this.hasError) {\n          o.onError(this.error);\n        } else if (this.hasValue) {\n          o.onNext(this.value);\n          o.onCompleted();\n        } else {\n          o.onCompleted();\n        }\n\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n       */\n      onCompleted: function () {\n        var i, len;\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          var os = cloneArray(this.observers), len = os.length;\n\n          if (this.hasValue) {\n            for (i = 0; i < len; i++) {\n              var o = os[i];\n              o.onNext(this.value);\n              o.onCompleted();\n            }\n          } else {\n            for (i = 0; i < len; i++) {\n              os[i].onCompleted();\n            }\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the error.\n       * @param {Mixed} error The Error to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.hasError = true;\n          this.error = error;\n\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n       * @param {Mixed} value The value to store in the subject.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        this.hasValue = true;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.error = null;\n        this.value = null;\n      }\n    });\n\n    return AsyncSubject;\n  }(Observable));\n\n  var AnonymousSubject = Rx.AnonymousSubject = (function (__super__) {\n    inherits(AnonymousSubject, __super__);\n    function AnonymousSubject(observer, observable) {\n      this.observer = observer;\n      this.observable = observable;\n      __super__.call(this);\n    }\n\n    addProperties(AnonymousSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        return this.observable.subscribe(o);\n      },\n      onCompleted: function () {\n        this.observer.onCompleted();\n      },\n      onError: function (error) {\n        this.observer.onError(error);\n      },\n      onNext: function (value) {\n        this.observer.onNext(value);\n      }\n    });\n\n    return AnonymousSubject;\n  }(Observable));\n\n  /**\n   *  Represents a value that changes over time.\n   *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n   */\n  var BehaviorSubject = Rx.BehaviorSubject = (function (__super__) {\n    inherits(BehaviorSubject, __super__);\n    function BehaviorSubject(value) {\n      __super__.call(this);\n      this.value = value;\n      this.observers = [];\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasError = false;\n    }\n\n    addProperties(BehaviorSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          o.onNext(this.value);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n        } else {\n          o.onCompleted();\n        }\n        return disposableEmpty;\n      },\n      /**\n       * Gets the current value or throws an exception.\n       * Value is frozen after onCompleted is called.\n       * After onError is called always throws the specified exception.\n       * An exception is always thrown after dispose is called.\n       * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n       */\n      getValue: function () {\n        checkDisposed(this);\n        if (this.hasError) { thrower(this.error); }\n        return this.value;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onCompleted();\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.hasError = true;\n        this.error = error;\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onError(error);\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onNext(value);\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.value = null;\n        this.error = null;\n      }\n    });\n\n    return BehaviorSubject;\n  }(Observable));\n\n  /**\n   * Represents an object that is both an observable sequence as well as an observer.\n   * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n   */\n  var ReplaySubject = Rx.ReplaySubject = (function (__super__) {\n\n    var maxSafeInteger = Math.pow(2, 53) - 1;\n\n    function createRemovableDisposable(subject, observer) {\n      return disposableCreate(function () {\n        observer.dispose();\n        !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n      });\n    }\n\n    inherits(ReplaySubject, __super__);\n\n    /**\n     *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n     *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n     *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n     *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n     */\n    function ReplaySubject(bufferSize, windowSize, scheduler) {\n      this.bufferSize = bufferSize == null ? maxSafeInteger : bufferSize;\n      this.windowSize = windowSize == null ? maxSafeInteger : windowSize;\n      this.scheduler = scheduler || currentThreadScheduler;\n      this.q = [];\n      this.observers = [];\n      this.isStopped = false;\n      this.isDisposed = false;\n      this.hasError = false;\n      this.error = null;\n      __super__.call(this);\n    }\n\n    addProperties(ReplaySubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        var so = new ScheduledObserver(this.scheduler, o), subscription = createRemovableDisposable(this, so);\n\n        this._trim(this.scheduler.now());\n        this.observers.push(so);\n\n        for (var i = 0, len = this.q.length; i < len; i++) {\n          so.onNext(this.q[i].value);\n        }\n\n        if (this.hasError) {\n          so.onError(this.error);\n        } else if (this.isStopped) {\n          so.onCompleted();\n        }\n\n        so.ensureActive();\n        return subscription;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      _trim: function (now) {\n        while (this.q.length > this.bufferSize) {\n          this.q.shift();\n        }\n        while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {\n          this.q.shift();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        var now = this.scheduler.now();\n        this.q.push({ interval: now, value: value });\n        this._trim(now);\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onNext(value);\n          observer.ensureActive();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.error = error;\n        this.hasError = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onError(error);\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onCompleted();\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    return ReplaySubject;\n  }(Observable));\n\n  /**\n  * Used to pause and resume streams.\n  */\n  Rx.Pauser = (function (__super__) {\n    inherits(Pauser, __super__);\n    function Pauser() {\n      __super__.call(this);\n    }\n\n    /**\n     * Pauses the underlying sequence.\n     */\n    Pauser.prototype.pause = function () { this.onNext(false); };\n\n    /**\n    * Resumes the underlying sequence.\n    */\n    Pauser.prototype.resume = function () { this.onNext(true); };\n\n    return Pauser;\n  }(Subject));\n\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    root.Rx = Rx;\n\n    define(function() {\n      return Rx;\n    });\n  } else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = Rx).Rx = Rx;\n    } else {\n      freeExports.Rx = Rx;\n    }\n  } else {\n    // in a browser or Rhino\n    root.Rx = Rx;\n  }\n\n  // All code before this point will be filtered from stack traces.\n  var rEndingLine = captureLine();\n\n}.call(this));\n"
  },
  {
    "path": "modules/rx-lite-experimental/package.json",
    "content": "{\n  \"name\": \"rx-lite-experimental\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Async\",\n  \"description\": \"Lightweight library with experimental functions for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.experimental.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.experimental.js\"\n  },\n  \"dependencies\": {\n    \"rx-lite\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.experimental.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-experimental/readme.md",
    "content": "# RxJS Experimental Module #\n\nThe Reactive Extensions for JavaScript has a number of operators that are considered experimental and not ready for mainstream usage.  This includes imperative operators such as `if`, `case`, `for`, `while`, `doWhile` as well as operators such as `forkJoin`.  This requires `rx.lite.js` from the [`rx-lite`](https://www.npmjs.com/package/rx-lite) NPM module.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-experimental\n$ npm install -g rx-lite-experimental\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-experimental');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.js\"></script>\n<script src=\"path/to/rx.lite.experimental.js\"></script>\n```\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`case | switchCase`](../../doc/api/core/operators/case.md)\n- [`for | forIn`](../../doc/api/core/operators/for.md)\n- [`forkJoin`](../../doc/api/core/operators/forkjoin.md)\n- [`if | ifThen`](../../doc/api/core/operators/if.md)\n- [`while | whileDo`](../../doc/api/core/operators/while.md)\n\n### `Observable Instance Methods`\n- [`doWhile`](/api/core/operators/dowhile.md)\n- [`expand`](../../doc/api/core/operators/expand.md)\n- [`forkJoin`](../../doc/api/core/operators/forkjoinproto.md)\n- [`let | letBind`](../../doc/api/core/operators/let.md)\n- [`manySelect`](../../doc/api/core/operators/manyselect.md)\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-experimental/rx.lite.experimental.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Aliases\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    ObservableBase = Rx.ObservableBase,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    FlatMapObservable = Rx.FlatMapObservable,\n    observableConcat = Observable.concat,\n    observableDefer = Observable.defer,\n    observableEmpty = Observable.empty,\n    disposableEmpty = Rx.Disposable.empty,\n    CompositeDisposable = Rx.CompositeDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    Enumerable = Rx.internals.Enumerable,\n    enumerableOf = Enumerable.of,\n    currentThreadScheduler = Rx.Scheduler.currentThread,\n    AsyncSubject = Rx.AsyncSubject,\n    Observer = Rx.Observer,\n    inherits = Rx.internals.inherits,\n    addProperties = Rx.internals.addProperties,\n    helpers = Rx.helpers,\n    noop = helpers.noop,\n    isPromise = helpers.isPromise,\n    isFunction = helpers.isFunction,\n    isIterable = Rx.helpers.isIterable,\n    isArrayLike = Rx.helpers.isArrayLike,\n    isScheduler = Rx.Scheduler.isScheduler,\n    observableFromPromise = Observable.fromPromise;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o && o[$iterator$] !== undefined;\n  };\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  };\n\n  Rx.helpers.iterator = $iterator$;\n\n  var WhileEnumerable = (function(__super__) {\n    inherits(WhileEnumerable, __super__);\n    function WhileEnumerable(c, s) {\n      this.c = c;\n      this.s = s;\n    }\n    WhileEnumerable.prototype[$iterator$] = function () {\n      var self = this;\n      return {\n        next: function () {\n          return self.c() ?\n           { done: false, value: self.s } :\n           { done: true, value: void 0 };\n        }\n      };\n    };\n    return WhileEnumerable;\n  }(Enumerable));\n  \n  function enumerableWhile(condition, source) {\n    return new WhileEnumerable(condition, source);\n  }  \n\n   /**\n   *  Returns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions.\n   *  This operator allows for a fluent style of writing queries that use the same sequence multiple times.\n   *\n   * @param {Function} selector Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.letBind = observableProto['let'] = function (func) {\n    return func(this);\n  };\n\n   /**\n   *  Determines whether an observable collection contains values. \n   *\n   * @example\n   *  1 - res = Rx.Observable.if(condition, obs1);\n   *  2 - res = Rx.Observable.if(condition, obs1, obs2);\n   *  3 - res = Rx.Observable.if(condition, obs1, scheduler);\n   * @param {Function} condition The condition which determines if the thenSource or elseSource will be run.\n   * @param {Observable} thenSource The observable sequence or Promise that will be run if the condition function returns true.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the condition function returns false. If this is not provided, it defaults to Rx.Observabe.Empty with the specified scheduler.\n   * @returns {Observable} An observable sequence which is either the thenSource or elseSource.\n   */\n  Observable['if'] = function (condition, thenSource, elseSourceOrScheduler) {\n    return observableDefer(function () {\n      elseSourceOrScheduler || (elseSourceOrScheduler = observableEmpty());\n\n      isPromise(thenSource) && (thenSource = observableFromPromise(thenSource));\n      isPromise(elseSourceOrScheduler) && (elseSourceOrScheduler = observableFromPromise(elseSourceOrScheduler));\n\n      // Assume a scheduler for empty only\n      typeof elseSourceOrScheduler.now === 'function' && (elseSourceOrScheduler = observableEmpty(elseSourceOrScheduler));\n      return condition() ? thenSource : elseSourceOrScheduler;\n    });\n  };\n\n   /**\n   *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n   * There is an alias for this method called 'forIn' for browsers <IE9\n   * @param {Array} sources An array of values to turn into an observable sequence.\n   * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n   * @returns {Observable} An observable sequence from the concatenated observable sequences.\n   */\n  Observable['for'] = Observable.forIn = function (sources, resultSelector, thisArg) {\n    return enumerableOf(sources, resultSelector, thisArg).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a while loop.\n   * There is an alias for this method called 'whileDo' for browsers <IE9\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  var observableWhileDo = Observable['while'] = Observable.whileDo = function (condition, source) {\n    isPromise(source) && (source = observableFromPromise(source));\n    return enumerableWhile(condition, source).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a do while loop.\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  observableProto.doWhile = function (condition) {\n    return observableConcat([this, observableWhileDo(condition, this)]);\n  };\n\n   /**\n   *  Uses selector to determine which source in sources to use.\n   * @param {Function} selector The function which extracts the value for to test in a case statement.\n   * @param {Array} sources A object which has keys which correspond to the case statement labels.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n   *\n   * @returns {Observable} An observable sequence which is determined by a case statement.\n   */\n  Observable['case'] = function (selector, sources, defaultSourceOrScheduler) {\n    return observableDefer(function () {\n      isPromise(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableFromPromise(defaultSourceOrScheduler));\n      defaultSourceOrScheduler || (defaultSourceOrScheduler = observableEmpty());\n\n      isScheduler(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableEmpty(defaultSourceOrScheduler));\n\n      var result = sources[selector()];\n      isPromise(result) && (result = observableFromPromise(result));\n\n      return result || defaultSourceOrScheduler;\n    });\n  };\n\n  var ExpandObservable = (function(__super__) {\n    inherits(ExpandObservable, __super__);\n    function ExpandObservable(source, fn, scheduler) {\n      this.source = source;\n      this._fn = fn;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(args, recurse) {\n      var state = args[0], self = args[1];\n      var work;\n      if (state.q.length > 0) {\n        work = state.q.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var m1 = new SingleAssignmentDisposable();\n      state.d.add(m1);\n      m1.setDisposable(work.subscribe(new ExpandObserver(state, self, m1)));\n      recurse([state, self]);\n    }\n\n    ExpandObservable.prototype._ensureActive = function (state) {\n      var isOwner = false;\n      if (state.q.length > 0) {\n        isOwner = !state.isAcquired;\n        state.isAcquired = true;\n      }\n      isOwner && state.m.setDisposable(this._scheduler.scheduleRecursive([state, this], scheduleRecursive));\n    };\n\n    ExpandObservable.prototype.subscribeCore = function (o) {\n      var m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        state = {\n          q: [],\n          m: m,\n          d: d,\n          activeCount: 0,\n          isAcquired: false,\n          o: o\n        };\n\n      state.q.push(this.source);\n      state.activeCount++;\n      this._ensureActive(state);\n      return d;\n    };\n\n    return ExpandObservable;\n  }(ObservableBase));\n\n  var ExpandObserver = (function(__super__) {\n    inherits(ExpandObserver, __super__);\n    function ExpandObserver(state, parent, m1) {\n      this._s = state;\n      this._p = parent;\n      this._m1 = m1;\n      __super__.call(this);\n    }\n\n    ExpandObserver.prototype.next = function (x) {\n      this._s.o.onNext(x);\n      var result = tryCatch(this._p._fn)(x);\n      if (result === errorObj) { return this._s.o.onError(result.e); }\n      this._s.q.push(result);\n      this._s.activeCount++;\n      this._p._ensureActive(this._s);\n    };\n\n    ExpandObserver.prototype.error = function (e) {\n      this._s.o.onError(e);\n    };\n\n    ExpandObserver.prototype.completed = function () {\n      this._s.d.remove(this._m1);\n      this._s.activeCount--;\n      this._s.activeCount === 0 && this._s.o.onCompleted();\n    };\n\n    return ExpandObserver;\n  }(AbstractObserver));\n\n   /**\n   *  Expands an observable sequence by recursively invoking selector.\n   *\n   * @param {Function} selector Selector function to invoke for each produced element, resulting in another sequence to which the selector will be invoked recursively again.\n   * @param {Scheduler} [scheduler] Scheduler on which to perform the expansion. If not provided, this defaults to the current thread scheduler.\n   * @returns {Observable} An observable sequence containing all the elements produced by the recursive expansion.\n   */\n  observableProto.expand = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new ExpandObservable(this, selector, scheduler);\n  };\n\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var ForkJoinObservable = (function (__super__) {\n    inherits(ForkJoinObservable, __super__);\n    function ForkJoinObservable(sources, cb) {\n      this._sources = sources;\n      this._cb = cb;\n      __super__.call(this);\n    }\n\n    ForkJoinObservable.prototype.subscribeCore = function (o) {\n      if (this._sources.length === 0) {\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      var count = this._sources.length;\n      var state = {\n        finished: false,\n        hasResults: new Array(count),\n        hasCompleted: new Array(count),\n        results: new Array(count)\n      };\n\n      var subscriptions = new CompositeDisposable();\n      for (var i = 0, len = this._sources.length; i < len; i++) {\n        var source = this._sources[i];\n        isPromise(source) && (source = observableFromPromise(source));\n        subscriptions.add(source.subscribe(new ForkJoinObserver(o, state, i, this._cb, subscriptions)));\n      }\n\n      return subscriptions;\n    };\n\n    return ForkJoinObservable;\n  }(ObservableBase));\n\n  var ForkJoinObserver = (function(__super__) {\n    inherits(ForkJoinObserver, __super__);\n    function ForkJoinObserver(o, s, i, cb, subs) {\n      this._o = o;\n      this._s = s;\n      this._i = i;\n      this._cb = cb;\n      this._subs = subs;\n      __super__.call(this);\n    }\n\n    ForkJoinObserver.prototype.next = function (x) {\n      if (!this._s.finished) {\n        this._s.hasResults[this._i] = true;\n        this._s.results[this._i] = x;\n      }\n    };\n\n    ForkJoinObserver.prototype.error = function (e) {\n      this._s.finished = true;\n      this._o.onError(e);\n      this._subs.dispose();\n    };\n\n    ForkJoinObserver.prototype.completed = function () {\n      if (!this._s.finished) {\n        if (!this._s.hasResults[this._i]) {\n          return this._o.onCompleted();\n        }\n        this._s.hasCompleted[this._i] = true;\n        for (var i = 0; i < this._s.results.length; i++) {\n          if (!this._s.hasCompleted[i]) { return; }\n        }\n        this._s.finished = true;\n\n        var res = tryCatch(this._cb).apply(null, this._s.results);\n        if (res === errorObj) { return this._o.onError(res.e); }\n\n        this._o.onNext(res);\n        this._o.onCompleted();\n      }\n    };\n\n    return ForkJoinObserver;\n  }(AbstractObserver));\n\n   /**\n   *  Runs all observable sequences in parallel and collect their last elements.\n   *\n   * @example\n   *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n   *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n   * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n   */\n  Observable.forkJoin = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n    return new ForkJoinObservable(args, resultSelector);\n  };\n\n   /**\n   *  Runs two observable sequences in parallel and combines their last elemenets.\n   * @param {Observable} second Second observable sequence.\n   * @param {Function} resultSelector Result selector function to invoke with the last elements of both sequences.\n   * @returns {Observable} An observable sequence with the result of calling the selector function with the last elements of both input sequences.\n   */\n  observableProto.forkJoin = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return Observable.forkJoin.apply(null, args);\n  };\n\n  /**\n   * Comonadic bind operator.\n   * @param {Function} selector A transform function to apply to each element.\n   * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n   * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n   */\n  observableProto.manySelect = observableProto.extend = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = Rx.Scheduler.immediate);\n    var source = this;\n    return observableDefer(function () {\n      var chain;\n\n      return source\n        .map(function (x) {\n          var curr = new ChainObservable(x);\n\n          chain && chain.onNext(x);\n          chain = curr;\n\n          return curr;\n        })\n        .tap(\n          noop,\n          function (e) { chain && chain.onError(e); },\n          function () { chain && chain.onCompleted(); }\n        )\n        .observeOn(scheduler)\n        .map(selector);\n    }, source);\n  };\n\n  var ChainObservable = (function (__super__) {\n    inherits(ChainObservable, __super__);\n    function ChainObservable(head) {\n      __super__.call(this);\n      this.head = head;\n      this.tail = new AsyncSubject();\n    }\n\n    addProperties(ChainObservable.prototype, Observer, {\n      _subscribe: function (o) {\n        var g = new CompositeDisposable();\n        g.add(currentThreadScheduler.schedule(this, function (_, self) {\n          o.onNext(self.head);\n          g.add(self.tail.mergeAll().subscribe(o));\n        }));\n\n        return g;\n      },\n      onCompleted: function () {\n        this.onNext(Observable.empty());\n      },\n      onError: function (e) {\n        this.onNext(Observable['throw'](e));\n      },\n      onNext: function (v) {\n        this.tail.onNext(v);\n        this.tail.onCompleted();\n      }\n    });\n\n    return ChainObservable;\n\n  }(Observable));\n\n  var SwitchFirstObservable = (function (__super__) {\n    inherits(SwitchFirstObservable, __super__);\n    function SwitchFirstObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    SwitchFirstObservable.prototype.subscribeCore = function (o) {\n      var m = new SingleAssignmentDisposable(),\n        g = new CompositeDisposable(),\n        state = {\n          hasCurrent: false,\n          isStopped: false,\n          o: o,\n          g: g\n        };\n\n      g.add(m);\n      m.setDisposable(this.source.subscribe(new SwitchFirstObserver(state)));\n      return g;\n    };\n\n    return SwitchFirstObservable;\n  }(ObservableBase));\n\n  var SwitchFirstObserver = (function(__super__) {\n    inherits(SwitchFirstObserver, __super__);\n    function SwitchFirstObserver(state) {\n      this._s = state;\n      __super__.call(this);\n    }\n\n    SwitchFirstObserver.prototype.next = function (x) {\n      if (!this._s.hasCurrent) {\n        this._s.hasCurrent = true;\n        isPromise(x) && (x = observableFromPromise(x));\n        var inner = new SingleAssignmentDisposable();\n        this._s.g.add(inner);\n        inner.setDisposable(x.subscribe(new InnerObserver(this._s, inner)));\n      }\n    };\n\n    SwitchFirstObserver.prototype.error = function (e) {\n      this._s.o.onError(e);\n    };\n\n    SwitchFirstObserver.prototype.completed = function () {\n      this._s.isStopped = true;\n      !this._s.hasCurrent && this._s.g.length === 1 && this._s.o.onCompleted();\n    };\n\n    inherits(InnerObserver, __super__);\n    function InnerObserver(state, inner) {\n      this._s = state;\n      this._i = inner;\n      __super__.call(this);\n    }\n\n    InnerObserver.prototype.next = function (x) { this._s.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    InnerObserver.prototype.completed = function () {\n      this._s.g.remove(this._i);\n      this._s.hasCurrent = false;\n      this._s.isStopped && this._s.g.length === 1 && this._s.o.onCompleted();\n    };\n\n    return SwitchFirstObserver;\n  }(AbstractObserver));\n\n  /**\n   * Performs a exclusive waiting for the first to finish before subscribing to another observable.\n   * Observables that come in between subscriptions will be dropped on the floor.\n   * @returns {Observable} A exclusive observable with only the results that happen when subscribed.\n   */\n  observableProto.switchFirst = function () {\n    return new SwitchFirstObservable(this);\n  };\n\nobservableProto.flatMapFirst = observableProto.exhaustMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).switchFirst();\n};\n\nobservableProto.flatMapWithMaxConcurrent = observableProto.flatMapMaxConcurrent = function(limit, selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).merge(limit);\n};\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite-experimental-compat/package.json",
    "content": "{\n  \"name\": \"rx-lite-experimental-compat\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Async\",\n  \"description\": \"Lightweight older browser compatible library with experimental functions for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.experimental.compat.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.experimental.compat.js\"\n  },\n  \"dependencies\": {\n    \"rx-lite-compat\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.experimental.compat.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-experimental-compat/readme.md",
    "content": "# RxJS Experimental Compat Module #\n\nThe Reactive Extensions for JavaScript has a number of operators that are considered experimental and not ready for mainstream usage.  This includes imperative operators such as `if`, `case`, `for`, `while`, `doWhile` as well as operators such as `forkJoin`.  This requires `rx.lite.compat.js` from the [`rx-lite-compat`](https://www.npmjs.com/package/rx-lite) NPM module.  This module has support for older browsers which do not support ES5 functionality, hence the name `compat`.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-experimental-compat\n$ npm install -g rx-lite-experimental-compat\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-experimental-compat');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.compat.js\"></script>\n<script src=\"path/to/rx.lite.experimental.compat.js\"></script>\n```\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`case | switchCase`](../../doc/api/core/operators/case.md)\n- [`for | forIn`](../../doc/api/core/operators/for.md)\n- [`forkJoin`](../../doc/api/core/operators/forkjoin.md)\n- [`if | ifThen`](../../doc/api/core/operators/if.md)\n- [`while | whileDo`](../../doc/api/core/operators/while.md)\n\n### `Observable Instance Methods`\n- [`doWhile`](/api/core/operators/dowhile.md)\n- [`expand`](../../doc/api/core/operators/expand.md)\n- [`forkJoin`](../../doc/api/core/operators/forkjoinproto.md)\n- [`let | letBind`](../../doc/api/core/operators/let.md)\n- [`manySelect`](../../doc/api/core/operators/manyselect.md)\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-experimental-compat/rx.lite.experimental.compat.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite.compat'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite-compat'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Aliases\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    ObservableBase = Rx.ObservableBase,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    FlatMapObservable = Rx.FlatMapObservable,\n    observableConcat = Observable.concat,\n    observableDefer = Observable.defer,\n    observableEmpty = Observable.empty,\n    disposableEmpty = Rx.Disposable.empty,\n    CompositeDisposable = Rx.CompositeDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    Enumerable = Rx.internals.Enumerable,\n    enumerableOf = Enumerable.of,\n    currentThreadScheduler = Rx.Scheduler.currentThread,\n    AsyncSubject = Rx.AsyncSubject,\n    Observer = Rx.Observer,\n    inherits = Rx.internals.inherits,\n    addProperties = Rx.internals.addProperties,\n    helpers = Rx.helpers,\n    noop = helpers.noop,\n    isPromise = helpers.isPromise,\n    isFunction = helpers.isFunction,\n    isIterable = Rx.helpers.isIterable,\n    isArrayLike = Rx.helpers.isArrayLike,\n    isScheduler = Rx.Scheduler.isScheduler,\n    observableFromPromise = Observable.fromPromise;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o && o[$iterator$] !== undefined;\n  };\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  };\n\n  Rx.helpers.iterator = $iterator$;\n\n  var WhileEnumerable = (function(__super__) {\n    inherits(WhileEnumerable, __super__);\n    function WhileEnumerable(c, s) {\n      this.c = c;\n      this.s = s;\n    }\n    WhileEnumerable.prototype[$iterator$] = function () {\n      var self = this;\n      return {\n        next: function () {\n          return self.c() ?\n           { done: false, value: self.s } :\n           { done: true, value: void 0 };\n        }\n      };\n    };\n    return WhileEnumerable;\n  }(Enumerable));\n  \n  function enumerableWhile(condition, source) {\n    return new WhileEnumerable(condition, source);\n  }  \n\n   /**\n   *  Returns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions.\n   *  This operator allows for a fluent style of writing queries that use the same sequence multiple times.\n   *\n   * @param {Function} selector Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.letBind = observableProto['let'] = function (func) {\n    return func(this);\n  };\n\n   /**\n   *  Determines whether an observable collection contains values. \n   *\n   * @example\n   *  1 - res = Rx.Observable.if(condition, obs1);\n   *  2 - res = Rx.Observable.if(condition, obs1, obs2);\n   *  3 - res = Rx.Observable.if(condition, obs1, scheduler);\n   * @param {Function} condition The condition which determines if the thenSource or elseSource will be run.\n   * @param {Observable} thenSource The observable sequence or Promise that will be run if the condition function returns true.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the condition function returns false. If this is not provided, it defaults to Rx.Observabe.Empty with the specified scheduler.\n   * @returns {Observable} An observable sequence which is either the thenSource or elseSource.\n   */\n  Observable['if'] = function (condition, thenSource, elseSourceOrScheduler) {\n    return observableDefer(function () {\n      elseSourceOrScheduler || (elseSourceOrScheduler = observableEmpty());\n\n      isPromise(thenSource) && (thenSource = observableFromPromise(thenSource));\n      isPromise(elseSourceOrScheduler) && (elseSourceOrScheduler = observableFromPromise(elseSourceOrScheduler));\n\n      // Assume a scheduler for empty only\n      typeof elseSourceOrScheduler.now === 'function' && (elseSourceOrScheduler = observableEmpty(elseSourceOrScheduler));\n      return condition() ? thenSource : elseSourceOrScheduler;\n    });\n  };\n\n   /**\n   *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n   * There is an alias for this method called 'forIn' for browsers <IE9\n   * @param {Array} sources An array of values to turn into an observable sequence.\n   * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n   * @returns {Observable} An observable sequence from the concatenated observable sequences.\n   */\n  Observable['for'] = Observable.forIn = function (sources, resultSelector, thisArg) {\n    return enumerableOf(sources, resultSelector, thisArg).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a while loop.\n   * There is an alias for this method called 'whileDo' for browsers <IE9\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  var observableWhileDo = Observable['while'] = Observable.whileDo = function (condition, source) {\n    isPromise(source) && (source = observableFromPromise(source));\n    return enumerableWhile(condition, source).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a do while loop.\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  observableProto.doWhile = function (condition) {\n    return observableConcat([this, observableWhileDo(condition, this)]);\n  };\n\n   /**\n   *  Uses selector to determine which source in sources to use.\n   * @param {Function} selector The function which extracts the value for to test in a case statement.\n   * @param {Array} sources A object which has keys which correspond to the case statement labels.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n   *\n   * @returns {Observable} An observable sequence which is determined by a case statement.\n   */\n  Observable['case'] = function (selector, sources, defaultSourceOrScheduler) {\n    return observableDefer(function () {\n      isPromise(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableFromPromise(defaultSourceOrScheduler));\n      defaultSourceOrScheduler || (defaultSourceOrScheduler = observableEmpty());\n\n      isScheduler(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableEmpty(defaultSourceOrScheduler));\n\n      var result = sources[selector()];\n      isPromise(result) && (result = observableFromPromise(result));\n\n      return result || defaultSourceOrScheduler;\n    });\n  };\n\n  var ExpandObservable = (function(__super__) {\n    inherits(ExpandObservable, __super__);\n    function ExpandObservable(source, fn, scheduler) {\n      this.source = source;\n      this._fn = fn;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(args, recurse) {\n      var state = args[0], self = args[1];\n      var work;\n      if (state.q.length > 0) {\n        work = state.q.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var m1 = new SingleAssignmentDisposable();\n      state.d.add(m1);\n      m1.setDisposable(work.subscribe(new ExpandObserver(state, self, m1)));\n      recurse([state, self]);\n    }\n\n    ExpandObservable.prototype._ensureActive = function (state) {\n      var isOwner = false;\n      if (state.q.length > 0) {\n        isOwner = !state.isAcquired;\n        state.isAcquired = true;\n      }\n      isOwner && state.m.setDisposable(this._scheduler.scheduleRecursive([state, this], scheduleRecursive));\n    };\n\n    ExpandObservable.prototype.subscribeCore = function (o) {\n      var m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        state = {\n          q: [],\n          m: m,\n          d: d,\n          activeCount: 0,\n          isAcquired: false,\n          o: o\n        };\n\n      state.q.push(this.source);\n      state.activeCount++;\n      this._ensureActive(state);\n      return d;\n    };\n\n    return ExpandObservable;\n  }(ObservableBase));\n\n  var ExpandObserver = (function(__super__) {\n    inherits(ExpandObserver, __super__);\n    function ExpandObserver(state, parent, m1) {\n      this._s = state;\n      this._p = parent;\n      this._m1 = m1;\n      __super__.call(this);\n    }\n\n    ExpandObserver.prototype.next = function (x) {\n      this._s.o.onNext(x);\n      var result = tryCatch(this._p._fn)(x);\n      if (result === errorObj) { return this._s.o.onError(result.e); }\n      this._s.q.push(result);\n      this._s.activeCount++;\n      this._p._ensureActive(this._s);\n    };\n\n    ExpandObserver.prototype.error = function (e) {\n      this._s.o.onError(e);\n    };\n\n    ExpandObserver.prototype.completed = function () {\n      this._s.d.remove(this._m1);\n      this._s.activeCount--;\n      this._s.activeCount === 0 && this._s.o.onCompleted();\n    };\n\n    return ExpandObserver;\n  }(AbstractObserver));\n\n   /**\n   *  Expands an observable sequence by recursively invoking selector.\n   *\n   * @param {Function} selector Selector function to invoke for each produced element, resulting in another sequence to which the selector will be invoked recursively again.\n   * @param {Scheduler} [scheduler] Scheduler on which to perform the expansion. If not provided, this defaults to the current thread scheduler.\n   * @returns {Observable} An observable sequence containing all the elements produced by the recursive expansion.\n   */\n  observableProto.expand = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new ExpandObservable(this, selector, scheduler);\n  };\n\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var ForkJoinObservable = (function (__super__) {\n    inherits(ForkJoinObservable, __super__);\n    function ForkJoinObservable(sources, cb) {\n      this._sources = sources;\n      this._cb = cb;\n      __super__.call(this);\n    }\n\n    ForkJoinObservable.prototype.subscribeCore = function (o) {\n      if (this._sources.length === 0) {\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      var count = this._sources.length;\n      var state = {\n        finished: false,\n        hasResults: new Array(count),\n        hasCompleted: new Array(count),\n        results: new Array(count)\n      };\n\n      var subscriptions = new CompositeDisposable();\n      for (var i = 0, len = this._sources.length; i < len; i++) {\n        var source = this._sources[i];\n        isPromise(source) && (source = observableFromPromise(source));\n        subscriptions.add(source.subscribe(new ForkJoinObserver(o, state, i, this._cb, subscriptions)));\n      }\n\n      return subscriptions;\n    };\n\n    return ForkJoinObservable;\n  }(ObservableBase));\n\n  var ForkJoinObserver = (function(__super__) {\n    inherits(ForkJoinObserver, __super__);\n    function ForkJoinObserver(o, s, i, cb, subs) {\n      this._o = o;\n      this._s = s;\n      this._i = i;\n      this._cb = cb;\n      this._subs = subs;\n      __super__.call(this);\n    }\n\n    ForkJoinObserver.prototype.next = function (x) {\n      if (!this._s.finished) {\n        this._s.hasResults[this._i] = true;\n        this._s.results[this._i] = x;\n      }\n    };\n\n    ForkJoinObserver.prototype.error = function (e) {\n      this._s.finished = true;\n      this._o.onError(e);\n      this._subs.dispose();\n    };\n\n    ForkJoinObserver.prototype.completed = function () {\n      if (!this._s.finished) {\n        if (!this._s.hasResults[this._i]) {\n          return this._o.onCompleted();\n        }\n        this._s.hasCompleted[this._i] = true;\n        for (var i = 0; i < this._s.results.length; i++) {\n          if (!this._s.hasCompleted[i]) { return; }\n        }\n        this._s.finished = true;\n\n        var res = tryCatch(this._cb).apply(null, this._s.results);\n        if (res === errorObj) { return this._o.onError(res.e); }\n\n        this._o.onNext(res);\n        this._o.onCompleted();\n      }\n    };\n\n    return ForkJoinObserver;\n  }(AbstractObserver));\n\n   /**\n   *  Runs all observable sequences in parallel and collect their last elements.\n   *\n   * @example\n   *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n   *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n   * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n   */\n  Observable.forkJoin = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n    return new ForkJoinObservable(args, resultSelector);\n  };\n\n   /**\n   *  Runs two observable sequences in parallel and combines their last elemenets.\n   * @param {Observable} second Second observable sequence.\n   * @param {Function} resultSelector Result selector function to invoke with the last elements of both sequences.\n   * @returns {Observable} An observable sequence with the result of calling the selector function with the last elements of both input sequences.\n   */\n  observableProto.forkJoin = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return Observable.forkJoin.apply(null, args);\n  };\n\n  /**\n   * Comonadic bind operator.\n   * @param {Function} selector A transform function to apply to each element.\n   * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n   * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n   */\n  observableProto.manySelect = observableProto.extend = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = Rx.Scheduler.immediate);\n    var source = this;\n    return observableDefer(function () {\n      var chain;\n\n      return source\n        .map(function (x) {\n          var curr = new ChainObservable(x);\n\n          chain && chain.onNext(x);\n          chain = curr;\n\n          return curr;\n        })\n        .tap(\n          noop,\n          function (e) { chain && chain.onError(e); },\n          function () { chain && chain.onCompleted(); }\n        )\n        .observeOn(scheduler)\n        .map(selector);\n    }, source);\n  };\n\n  var ChainObservable = (function (__super__) {\n    inherits(ChainObservable, __super__);\n    function ChainObservable(head) {\n      __super__.call(this);\n      this.head = head;\n      this.tail = new AsyncSubject();\n    }\n\n    addProperties(ChainObservable.prototype, Observer, {\n      _subscribe: function (o) {\n        var g = new CompositeDisposable();\n        g.add(currentThreadScheduler.schedule(this, function (_, self) {\n          o.onNext(self.head);\n          g.add(self.tail.mergeAll().subscribe(o));\n        }));\n\n        return g;\n      },\n      onCompleted: function () {\n        this.onNext(Observable.empty());\n      },\n      onError: function (e) {\n        this.onNext(Observable['throw'](e));\n      },\n      onNext: function (v) {\n        this.tail.onNext(v);\n        this.tail.onCompleted();\n      }\n    });\n\n    return ChainObservable;\n\n  }(Observable));\n\n  var SwitchFirstObservable = (function (__super__) {\n    inherits(SwitchFirstObservable, __super__);\n    function SwitchFirstObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    SwitchFirstObservable.prototype.subscribeCore = function (o) {\n      var m = new SingleAssignmentDisposable(),\n        g = new CompositeDisposable(),\n        state = {\n          hasCurrent: false,\n          isStopped: false,\n          o: o,\n          g: g\n        };\n\n      g.add(m);\n      m.setDisposable(this.source.subscribe(new SwitchFirstObserver(state)));\n      return g;\n    };\n\n    return SwitchFirstObservable;\n  }(ObservableBase));\n\n  var SwitchFirstObserver = (function(__super__) {\n    inherits(SwitchFirstObserver, __super__);\n    function SwitchFirstObserver(state) {\n      this._s = state;\n      __super__.call(this);\n    }\n\n    SwitchFirstObserver.prototype.next = function (x) {\n      if (!this._s.hasCurrent) {\n        this._s.hasCurrent = true;\n        isPromise(x) && (x = observableFromPromise(x));\n        var inner = new SingleAssignmentDisposable();\n        this._s.g.add(inner);\n        inner.setDisposable(x.subscribe(new InnerObserver(this._s, inner)));\n      }\n    };\n\n    SwitchFirstObserver.prototype.error = function (e) {\n      this._s.o.onError(e);\n    };\n\n    SwitchFirstObserver.prototype.completed = function () {\n      this._s.isStopped = true;\n      !this._s.hasCurrent && this._s.g.length === 1 && this._s.o.onCompleted();\n    };\n\n    inherits(InnerObserver, __super__);\n    function InnerObserver(state, inner) {\n      this._s = state;\n      this._i = inner;\n      __super__.call(this);\n    }\n\n    InnerObserver.prototype.next = function (x) { this._s.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    InnerObserver.prototype.completed = function () {\n      this._s.g.remove(this._i);\n      this._s.hasCurrent = false;\n      this._s.isStopped && this._s.g.length === 1 && this._s.o.onCompleted();\n    };\n\n    return SwitchFirstObserver;\n  }(AbstractObserver));\n\n  /**\n   * Performs a exclusive waiting for the first to finish before subscribing to another observable.\n   * Observables that come in between subscriptions will be dropped on the floor.\n   * @returns {Observable} A exclusive observable with only the results that happen when subscribed.\n   */\n  observableProto.switchFirst = function () {\n    return new SwitchFirstObservable(this);\n  };\n\nobservableProto.flatMapFirst = observableProto.exhaustMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).switchFirst();\n};\n\nobservableProto.flatMapWithMaxConcurrent = observableProto.flatMapMaxConcurrent = function(limit, selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).merge(limit);\n};\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite-extras/package.json",
    "content": "{\n  \"name\": \"rx-lite-extras\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Lite\",\n  \"description\": \"Lightweight library extras for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.extras.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.extras.js\"\n  },\n  \"dependencies\": {\n    \"rx-lite\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.extras.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-extras/readme.md",
    "content": "# RxJS Lite Extras #\n\nThe Reactive Extensions for JavaScript's lite extras are the operators that are found on `rx.js` and but not available in `rx.lite.js`.  By adding this file, you will have full access to all operators and thus makes including other files such as `rx.time.js`, `rx.joinpatterns.js` and others easier.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS. The files are available on [cdnjs](http://cdnjs.com/libraries/rxjs/) and [jsDelivr](http://www.jsdelivr.com/#!rxjs).\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-extras\n$ npm install -g rx-lite-extras\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-extras');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.js\"></script>\n<script src=\"path/to/rx.lite.extras.js\"></script>\n```\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`amb`](../../doc/api/core/operators/amb.md)\n- [`generate`](../../core/operators/generate.md)\n- [`onErrorResumeNext`](../../doc/api/core/operators/onerrorresumenext.md)\n- [`using`](../../doc/api/core/ooperators/using.md)\n\n### `Observable Instance Methods`\n- [`amb`](../../doc/api/core/operators/ambproto.md)\n- [`bufferWithCount`](../../doc/api/core/operators/bufferwithcount.md)\n- [`distinct`](../../doc/api/core/operators/distinct.md)\n- [`observeOn`](../../doc/api/core/operators/observeon.md)\n- [`onErrorResumeNext`](../../doc/api/core/operators/onerrorresumenext.md)\n- [`subscribeOn`](../../doc/api/core/operators/subscribeon.md)\n- [`takeLastBuffer`](../../doc/api/core/operators/takelastbuffer.md)\n- [`windowWithCount`](../../doc/api/core/operators/windowwithcount.md)\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-extras/rx.lite.extras.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // References\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    observableNever = Observable.never,\n    observableThrow = Observable['throw'],\n    AnonymousObservable = Rx.AnonymousObservable,\n    ObservableBase = Rx.ObservableBase,\n    AnonymousObserver = Rx.AnonymousObserver,\n    notificationCreateOnNext = Rx.Notification.createOnNext,\n    notificationCreateOnError = Rx.Notification.createOnError,\n    notificationCreateOnCompleted = Rx.Notification.createOnCompleted,\n    Observer = Rx.Observer,\n    observerCreate = Observer.create,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    Subject = Rx.Subject,\n    internals = Rx.internals,\n    helpers = Rx.helpers,\n    ScheduledObserver = internals.ScheduledObserver,\n    SerialDisposable = Rx.SerialDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    disposableEmpty = Rx.Disposable.empty,\n    immediateScheduler = Rx.Scheduler.immediate,\n    defaultKeySerializer = helpers.defaultKeySerializer,\n    addRef = Rx.internals.addRef,\n    identity = helpers.identity,\n    isPromise = helpers.isPromise,\n    isFunction = helpers.isFunction,\n    inherits = internals.inherits,\n    bindCallback = internals.bindCallback,\n    noop = helpers.noop,\n    isScheduler = Rx.Scheduler.isScheduler,\n    observableFromPromise = Observable.fromPromise,\n    ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  function ScheduledDisposable(scheduler, disposable) {\n    this.scheduler = scheduler;\n    this.disposable = disposable;\n    this.isDisposed = false;\n  }\n\n  function scheduleItem(s, self) {\n    if (!self.isDisposed) {\n      self.isDisposed = true;\n      self.disposable.dispose();\n    }\n  }\n\n  ScheduledDisposable.prototype.dispose = function () {\n    this.scheduler.schedule(this, scheduleItem);\n  };\n\n  var CheckedObserver = (function (__super__) {\n    inherits(CheckedObserver, __super__);\n\n    function CheckedObserver(observer) {\n      __super__.call(this);\n      this._observer = observer;\n      this._state = 0; // 0 - idle, 1 - busy, 2 - done\n    }\n\n    var CheckedObserverPrototype = CheckedObserver.prototype;\n\n    CheckedObserverPrototype.onNext = function (value) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onNext).call(this._observer, value);\n      this._state = 0;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onError = function (err) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onError).call(this._observer, err);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onCompleted = function () {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onCompleted).call(this._observer);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.checkAccess = function () {\n      if (this._state === 1) { throw new Error('Re-entrancy detected'); }\n      if (this._state === 2) { throw new Error('Observer completed'); }\n      if (this._state === 0) { this._state = 1; }\n    };\n\n    return CheckedObserver;\n  }(Observer));\n\n  var ObserveOnObserver = (function (__super__) {\n    inherits(ObserveOnObserver, __super__);\n\n    function ObserveOnObserver(scheduler, observer, cancel) {\n      __super__.call(this, scheduler, observer);\n      this._cancel = cancel;\n    }\n\n    ObserveOnObserver.prototype.next = function (value) {\n      __super__.prototype.next.call(this, value);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.error = function (e) {\n      __super__.prototype.error.call(this, e);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.completed = function () {\n      __super__.prototype.completed.call(this);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this._cancel && this._cancel.dispose();\n      this._cancel = null;\n    };\n\n    return ObserveOnObserver;\n  })(ScheduledObserver);\n\n  /**\n   *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n   *  If a violation is detected, an Error is thrown from the offending observer method call.\n   *\n   * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n   */\n  Observer.prototype.checked = function () { return new CheckedObserver(this); };\n\n  /**\n   * Schedules the invocation of observer methods on the given scheduler.\n   * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n   * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n   */\n  Observer.notifyOn = function (scheduler) {\n    return new ObserveOnObserver(scheduler, this);\n  };\n\n  /**\n  *  Creates an observer from a notification callback.\n  * @param {Function} handler Action that handles a notification.\n  * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n  */\n  Observer.fromNotifier = function (handler, thisArg) {\n    var handlerFunc = bindCallback(handler, thisArg, 1);\n    return new AnonymousObserver(function (x) {\n      return handlerFunc(notificationCreateOnNext(x));\n    }, function (e) {\n      return handlerFunc(notificationCreateOnError(e));\n    }, function () {\n      return handlerFunc(notificationCreateOnCompleted());\n    });\n  };\n\n  /**\n  *  Creates a notification callback from an observer.\n  * @returns The action that forwards its input notification to the underlying observer.\n  */\n  Observer.prototype.toNotifier = function () {\n    var observer = this;\n    return function (n) { return n.accept(observer); };\n  };\n\n  /**\n  *  Hides the identity of an observer.\n  * @returns An observer that hides the identity of the specified observer.\n  */\n  Observer.prototype.asObserver = function () {\n    var source = this;\n    return new AnonymousObserver(\n      function (x) { source.onNext(x); },\n      function (e) { source.onError(e); },\n      function () { source.onCompleted(); }\n    );\n  };\n\nvar ObserveOnObservable = (function (__super__) {\n  inherits(ObserveOnObservable, __super__);\n  function ObserveOnObservable(source, s) {\n    this.source = source;\n    this._s = s;\n    __super__.call(this);\n  }\n\n  ObserveOnObservable.prototype.subscribeCore = function (o) {\n    return this.source.subscribe(new ObserveOnObserver(this._s, o));\n  };\n\n  return ObserveOnObservable;\n}(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n   *\n   *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n   *  that require to be run on a scheduler, use subscribeOn.\n   *\n   *  @param {Scheduler} scheduler Scheduler to notify observers on.\n   *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n   */\n  observableProto.observeOn = function (scheduler) {\n    return new ObserveOnObservable(this, scheduler);\n  };\n\n  var SubscribeOnObservable = (function (__super__) {\n    inherits(SubscribeOnObservable, __super__);\n    function SubscribeOnObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(scheduler, state) {\n      var source = state[0], d = state[1], o = state[2];\n      d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(o)));\n    }\n\n    SubscribeOnObservable.prototype.subscribeCore = function (o) {\n      var m = new SingleAssignmentDisposable(), d = new SerialDisposable();\n      d.setDisposable(m);\n      m.setDisposable(this._s.schedule([this.source, d, o], scheduleMethod));\n      return d;\n    };\n\n    return SubscribeOnObservable;\n  }(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n   *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n   *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n   *  callbacks on a scheduler, use observeOn.\n\n   *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n   *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n   */\n  observableProto.subscribeOn = function (scheduler) {\n    return new SubscribeOnObservable(this, scheduler);\n  };\n\n  var GenerateObservable = (function (__super__) {\n    inherits(GenerateObservable, __super__);\n    function GenerateObservable(state, cndFn, itrFn, resFn, s) {\n      this._initialState = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n      var hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (hasResult === errorObj) { return state.o.onError(hasResult.e); }\n      if (hasResult) {\n        var result = tryCatch(state.self._resFn)(state.newState);\n        if (result === errorObj) { return state.o.onError(result.e); }\n        state.o.onNext(result);\n        recurse(state);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        first: true,\n        newState: this._initialState\n      };\n      return this._s.scheduleRecursive(state, scheduleRecursive);\n    };\n\n    return GenerateObservable;\n  }(ObservableBase));\n\n  /**\n   *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new GenerateObservable(initialState, condition, iterate, resultSelector, scheduler);\n  };\n\n  var UsingObservable = (function (__super__) {\n    inherits(UsingObservable, __super__);\n    function UsingObservable(resFn, obsFn) {\n      this._resFn = resFn;\n      this._obsFn = obsFn;\n      __super__.call(this);\n    }\n\n    UsingObservable.prototype.subscribeCore = function (o) {\n      var disposable = disposableEmpty;\n      var resource = tryCatch(this._resFn)();\n      if (resource === errorObj) {\n        return new BinaryDisposable(observableThrow(resource.e).subscribe(o), disposable);\n      }\n      resource && (disposable = resource);\n      var source = tryCatch(this._obsFn)(resource);\n      if (source === errorObj) {\n        return new BinaryDisposable(observableThrow(source.e).subscribe(o), disposable);\n      }\n      return new BinaryDisposable(source.subscribe(o), disposable);\n    };\n\n    return UsingObservable;\n  }(ObservableBase));\n\n  /**\n   * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n   * @param {Function} resourceFactory Factory function to obtain a resource object.\n   * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n   * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n   */\n  Observable.using = function (resourceFactory, observableFactory) {\n    return new UsingObservable(resourceFactory, observableFactory);\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @param {Observable} rightSource Second observable sequence or Promise.\n   * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n   */\n  observableProto.amb = function (rightSource) {\n    var leftSource = this;\n    return new AnonymousObservable(function (observer) {\n      var choice,\n        leftChoice = 'L', rightChoice = 'R',\n        leftSubscription = new SingleAssignmentDisposable(),\n        rightSubscription = new SingleAssignmentDisposable();\n\n      isPromise(rightSource) && (rightSource = observableFromPromise(rightSource));\n\n      function choiceL() {\n        if (!choice) {\n          choice = leftChoice;\n          rightSubscription.dispose();\n        }\n      }\n\n      function choiceR() {\n        if (!choice) {\n          choice = rightChoice;\n          leftSubscription.dispose();\n        }\n      }\n\n      var leftSubscribe = observerCreate(\n        function (left) {\n          choiceL();\n          choice === leftChoice && observer.onNext(left);\n        },\n        function (e) {\n          choiceL();\n          choice === leftChoice && observer.onError(e);\n        },\n        function () {\n          choiceL();\n          choice === leftChoice && observer.onCompleted();\n        }\n      );\n      var rightSubscribe = observerCreate(\n        function (right) {\n          choiceR();\n          choice === rightChoice && observer.onNext(right);\n        },\n        function (e) {\n          choiceR();\n          choice === rightChoice && observer.onError(e);\n        },\n        function () {\n          choiceR();\n          choice === rightChoice && observer.onCompleted();\n        }\n      );\n\n      leftSubscription.setDisposable(leftSource.subscribe(leftSubscribe));\n      rightSubscription.setDisposable(rightSource.subscribe(rightSubscribe));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    });\n  };\n\n  function amb(p, c) { return p.amb(c); }\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n   */\n  Observable.amb = function () {\n    var acc = observableNever(), items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(items);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    for (var i = 0, len = items.length; i < len; i++) {\n      acc = amb(acc, items[i]);\n    }\n    return acc;\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n   * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n   */\n  observableProto.onErrorResumeNext = function (second) {\n    if (!second) { throw new Error('Second observable is required'); }\n    return onErrorResumeNext([this, second]);\n  };\n\n  var OnErrorResumeNextObservable = (function(__super__) {\n    inherits(OnErrorResumeNextObservable, __super__);\n    function OnErrorResumeNextObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.pos < state.sources.length) {\n        var current = state.sources[state.pos++];\n        isPromise(current) && (current = observableFromPromise(current));\n        var d = new SingleAssignmentDisposable();\n        state.subscription.setDisposable(d);\n        d.setDisposable(current.subscribe(new OnErrorResumeNextObserver(state, recurse)));\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    OnErrorResumeNextObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable(),\n          state = {pos: 0, subscription: subscription, o: o, sources: this.sources },\n          cancellable = immediateScheduler.scheduleRecursive(state, scheduleMethod);\n\n      return new BinaryDisposable(subscription, cancellable);\n    };\n\n    return OnErrorResumeNextObservable;\n  }(ObservableBase));\n\n  var OnErrorResumeNextObserver = (function(__super__) {\n    inherits(OnErrorResumeNextObserver, __super__);\n    function OnErrorResumeNextObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      __super__.call(this);\n    }\n\n    OnErrorResumeNextObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    OnErrorResumeNextObserver.prototype.error = function () { this._recurse(this._state); };\n    OnErrorResumeNextObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return OnErrorResumeNextObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n   */\n  var onErrorResumeNext = Observable.onErrorResumeNext = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      var len = arguments.length;\n      sources = new Array(len);\n      for(var i = 0; i < len; i++) { sources[i] = arguments[i]; }\n    }\n    return new OnErrorResumeNextObservable(sources);\n  };\n\n  function toArray(x) { return x.toArray(); }\n  function notEmpty(x) { return x.length > 0; }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n   * @param {Number} count Length of each buffer.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithCount = observableProto.bufferCount = function (count, skip) {\n    typeof skip !== 'number' && (skip = count);\n    return this.windowWithCount(count, skip)\n      .flatMap(toArray)\n      .filter(notEmpty);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n   * @param {Number} count Length of each window.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithCount = observableProto.windowCount = function (count, skip) {\n    var source = this;\n    +count || (count = 0);\n    Math.abs(count) === Infinity && (count = 0);\n    if (count <= 0) { throw new ArgumentOutOfRangeError(); }\n    skip == null && (skip = count);\n    +skip || (skip = 0);\n    Math.abs(skip) === Infinity && (skip = 0);\n\n    if (skip <= 0) { throw new ArgumentOutOfRangeError(); }\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(),\n        refCountDisposable = new RefCountDisposable(m),\n        n = 0,\n        q = [];\n\n      function createWindow () {\n        var s = new Subject();\n        q.push(s);\n        observer.onNext(addRef(s, refCountDisposable));\n      }\n\n      createWindow();\n\n      m.setDisposable(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n          var c = n - count + 1;\n          c >= 0 && c % skip === 0 && q.shift().onCompleted();\n          ++n % skip === 0 && createWindow();\n        },\n        function (e) {\n          while (q.length > 0) { q.shift().onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          while (q.length > 0) { q.shift().onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  var TakeLastBufferObserver = (function (__super__) {\n    inherits(TakeLastBufferObserver, __super__);\n    function TakeLastBufferObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastBufferObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastBufferObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastBufferObserver.prototype.completed = function () {\n      this._o.onNext(this._q);\n      this._o.onCompleted();\n    };\n\n    return TakeLastBufferObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n   *\n   * @description\n   *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n   *  source sequence, this buffer is produced on the result sequence.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLastBuffer = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastBufferObserver(o, count));\n    }, source);\n  };\n\n  var DefaultIfEmptyObserver = (function (__super__) {\n    inherits(DefaultIfEmptyObserver, __super__);\n    function DefaultIfEmptyObserver(o, d) {\n      this._o = o;\n      this._d = d;\n      this._f = false;\n      __super__.call(this);\n    }\n\n    DefaultIfEmptyObserver.prototype.next = function (x) {\n      this._f = true;\n      this._o.onNext(x);\n    };\n\n    DefaultIfEmptyObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    DefaultIfEmptyObserver.prototype.completed = function () {\n      !this._f && this._o.onNext(this._d);\n      this._o.onCompleted();\n    };\n\n    return DefaultIfEmptyObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n   *\n   *  var res = obs = xs.defaultIfEmpty();\n   *  2 - obs = xs.defaultIfEmpty(false);\n   *\n   * @memberOf Observable#\n   * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n   * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n   */\n    observableProto.defaultIfEmpty = function (defaultValue) {\n      var source = this;\n      defaultValue === undefined && (defaultValue = null);\n      return new AnonymousObservable(function (o) {\n        return source.subscribe(new DefaultIfEmptyObserver(o, defaultValue));\n      }, source);\n    };\n\n  // Swap out for Array.findIndex\n  function arrayIndexOfComparer(array, item, comparer) {\n    for (var i = 0, len = array.length; i < len; i++) {\n      if (comparer(array[i], item)) { return i; }\n    }\n    return -1;\n  }\n\n  function HashSet(comparer) {\n    this.comparer = comparer;\n    this.set = [];\n  }\n  HashSet.prototype.push = function(value) {\n    var retValue = arrayIndexOfComparer(this.set, value, this.comparer) === -1;\n    retValue && this.set.push(value);\n    return retValue;\n  };\n\n  var DistinctObservable = (function (__super__) {\n    inherits(DistinctObservable, __super__);\n    function DistinctObservable(source, keyFn, cmpFn) {\n      this.source = source;\n      this._keyFn = keyFn;\n      this._cmpFn = cmpFn;\n      __super__.call(this);\n    }\n\n    DistinctObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctObserver(o, this._keyFn, this._cmpFn));\n    };\n\n    return DistinctObservable;\n  }(ObservableBase));\n\n  var DistinctObserver = (function (__super__) {\n    inherits(DistinctObserver, __super__);\n    function DistinctObserver(o, keyFn, cmpFn) {\n      this._o = o;\n      this._keyFn = keyFn;\n      this._h = new HashSet(cmpFn);\n      __super__.call(this);\n    }\n\n    DistinctObserver.prototype.next = function (x) {\n      var key = x;\n      if (isFunction(this._keyFn)) {\n        key = tryCatch(this._keyFn)(x);\n        if (key === errorObj) { return this._o.onError(key.e); }\n      }\n      this._h.push(key) && this._o.onNext(x);\n    };\n\n    DistinctObserver.prototype.error = function (e) { this._o.onError(e); };\n    DistinctObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DistinctObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n   *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n   *\n   * @example\n   *  var res = obs = xs.distinct();\n   *  2 - obs = xs.distinct(function (x) { return x.id; });\n   *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n   * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n   * @param {Function} [comparer]  Used to compare items in the collection.\n   * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinct = function (keySelector, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctObservable(this, keySelector, comparer);\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence. This observable sequence\n   * can be resubscribed to, even if all prior subscriptions have ended. (unlike `.publish().refCount()`)\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source.\n   */\n  observableProto.singleInstance = function() {\n    var source = this, hasObservable = false, observable;\n\n    function getObservable() {\n      if (!hasObservable) {\n        hasObservable = true;\n        observable = source['finally'](function() { hasObservable = false; }).publish().refCount();\n      }\n      return observable;\n    }\n\n    return new AnonymousObservable(function(o) {\n      return getObservable().subscribe(o);\n    });\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite-extras-compat/package.json",
    "content": "{\n  \"name\": \"rx-lite-extras-compat\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Lite\",\n  \"description\": \"Lightweight IE6 compatible library extras for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.extras.compat.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.extras.compat.js\"\n  },\n  \"dependencies\": {\n    \"rx-lite-compat\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.extras.compat.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-extras-compat/readme.md",
    "content": "# RxJS Lite Compatibility Extras #\n\nThe Reactive Extensions for JavaScript's lite extras are the operators that are found on `rx.compat.js` and but not available in `rx.lite.compat.js`.  By adding this file, you will have full access to all operators and thus makes including other files such as `rx.time.js`, `rx.joinpatterns.js` and others easier as well as having support for older browsers which do not support ES5 functionality.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS. The files are available on [cdnjs](http://cdnjs.com/libraries/rxjs/) and [jsDelivr](http://www.jsdelivr.com/#!rxjs).\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-extras-compat\n$ npm install -g rx-lite-extras-compat\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-extras-compat');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.compat.js\"></script>\n<script src=\"path/to/rx.lite.compat.extras.js\"></script>\n```\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`amb`](../../doc/api/core/operators/amb.md)\n- [`generate`](../../core/operators/generate.md)\n- [`onErrorResumeNext`](../../doc/api/core/operators/onerrorresumenext.md)\n- [`using`](../../doc/api/core/ooperators/using.md)\n\n### `Observable Instance Methods`\n- [`amb`](../../doc/api/core/operators/ambproto.md)\n- [`bufferWithCount`](../../doc/api/core/operators/bufferwithcount.md)\n- [`distinct`](../../doc/api/core/operators/distinct.md)\n- [`observeOn`](../../doc/api/core/operators/observeon.md)\n- [`onErrorResumeNext`](../../doc/api/core/operators/onerrorresumenext.md)\n- [`subscribeOn`](../../doc/api/core/operators/subscribeon.md)\n- [`takeLastBuffer`](../../doc/api/core/operators/takelastbuffer.md)\n- [`windowWithCount`](../../doc/api/core/operators/windowwithcount.md)\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-extras-compat/rx.lite.extras.compat.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite.compat'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite-compat'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // References\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    observableNever = Observable.never,\n    observableThrow = Observable['throw'],\n    AnonymousObservable = Rx.AnonymousObservable,\n    ObservableBase = Rx.ObservableBase,\n    AnonymousObserver = Rx.AnonymousObserver,\n    notificationCreateOnNext = Rx.Notification.createOnNext,\n    notificationCreateOnError = Rx.Notification.createOnError,\n    notificationCreateOnCompleted = Rx.Notification.createOnCompleted,\n    Observer = Rx.Observer,\n    observerCreate = Observer.create,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    Subject = Rx.Subject,\n    internals = Rx.internals,\n    helpers = Rx.helpers,\n    ScheduledObserver = internals.ScheduledObserver,\n    SerialDisposable = Rx.SerialDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    disposableEmpty = Rx.Disposable.empty,\n    immediateScheduler = Rx.Scheduler.immediate,\n    defaultKeySerializer = helpers.defaultKeySerializer,\n    addRef = Rx.internals.addRef,\n    identity = helpers.identity,\n    isPromise = helpers.isPromise,\n    isFunction = helpers.isFunction,\n    inherits = internals.inherits,\n    bindCallback = internals.bindCallback,\n    noop = helpers.noop,\n    isScheduler = Rx.Scheduler.isScheduler,\n    observableFromPromise = Observable.fromPromise,\n    ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  function ScheduledDisposable(scheduler, disposable) {\n    this.scheduler = scheduler;\n    this.disposable = disposable;\n    this.isDisposed = false;\n  }\n\n  function scheduleItem(s, self) {\n    if (!self.isDisposed) {\n      self.isDisposed = true;\n      self.disposable.dispose();\n    }\n  }\n\n  ScheduledDisposable.prototype.dispose = function () {\n    this.scheduler.schedule(this, scheduleItem);\n  };\n\n  var CheckedObserver = (function (__super__) {\n    inherits(CheckedObserver, __super__);\n\n    function CheckedObserver(observer) {\n      __super__.call(this);\n      this._observer = observer;\n      this._state = 0; // 0 - idle, 1 - busy, 2 - done\n    }\n\n    var CheckedObserverPrototype = CheckedObserver.prototype;\n\n    CheckedObserverPrototype.onNext = function (value) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onNext).call(this._observer, value);\n      this._state = 0;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onError = function (err) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onError).call(this._observer, err);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onCompleted = function () {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onCompleted).call(this._observer);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.checkAccess = function () {\n      if (this._state === 1) { throw new Error('Re-entrancy detected'); }\n      if (this._state === 2) { throw new Error('Observer completed'); }\n      if (this._state === 0) { this._state = 1; }\n    };\n\n    return CheckedObserver;\n  }(Observer));\n\n  var ObserveOnObserver = (function (__super__) {\n    inherits(ObserveOnObserver, __super__);\n\n    function ObserveOnObserver(scheduler, observer, cancel) {\n      __super__.call(this, scheduler, observer);\n      this._cancel = cancel;\n    }\n\n    ObserveOnObserver.prototype.next = function (value) {\n      __super__.prototype.next.call(this, value);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.error = function (e) {\n      __super__.prototype.error.call(this, e);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.completed = function () {\n      __super__.prototype.completed.call(this);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this._cancel && this._cancel.dispose();\n      this._cancel = null;\n    };\n\n    return ObserveOnObserver;\n  })(ScheduledObserver);\n\n  /**\n   *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n   *  If a violation is detected, an Error is thrown from the offending observer method call.\n   *\n   * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n   */\n  Observer.prototype.checked = function () { return new CheckedObserver(this); };\n\n  /**\n   * Schedules the invocation of observer methods on the given scheduler.\n   * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n   * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n   */\n  Observer.notifyOn = function (scheduler) {\n    return new ObserveOnObserver(scheduler, this);\n  };\n\n  /**\n  *  Creates an observer from a notification callback.\n  * @param {Function} handler Action that handles a notification.\n  * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n  */\n  Observer.fromNotifier = function (handler, thisArg) {\n    var handlerFunc = bindCallback(handler, thisArg, 1);\n    return new AnonymousObserver(function (x) {\n      return handlerFunc(notificationCreateOnNext(x));\n    }, function (e) {\n      return handlerFunc(notificationCreateOnError(e));\n    }, function () {\n      return handlerFunc(notificationCreateOnCompleted());\n    });\n  };\n\n  /**\n  *  Creates a notification callback from an observer.\n  * @returns The action that forwards its input notification to the underlying observer.\n  */\n  Observer.prototype.toNotifier = function () {\n    var observer = this;\n    return function (n) { return n.accept(observer); };\n  };\n\n  /**\n  *  Hides the identity of an observer.\n  * @returns An observer that hides the identity of the specified observer.\n  */\n  Observer.prototype.asObserver = function () {\n    var source = this;\n    return new AnonymousObserver(\n      function (x) { source.onNext(x); },\n      function (e) { source.onError(e); },\n      function () { source.onCompleted(); }\n    );\n  };\n\nvar ObserveOnObservable = (function (__super__) {\n  inherits(ObserveOnObservable, __super__);\n  function ObserveOnObservable(source, s) {\n    this.source = source;\n    this._s = s;\n    __super__.call(this);\n  }\n\n  ObserveOnObservable.prototype.subscribeCore = function (o) {\n    return this.source.subscribe(new ObserveOnObserver(this._s, o));\n  };\n\n  return ObserveOnObservable;\n}(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n   *\n   *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n   *  that require to be run on a scheduler, use subscribeOn.\n   *\n   *  @param {Scheduler} scheduler Scheduler to notify observers on.\n   *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n   */\n  observableProto.observeOn = function (scheduler) {\n    return new ObserveOnObservable(this, scheduler);\n  };\n\n  var SubscribeOnObservable = (function (__super__) {\n    inherits(SubscribeOnObservable, __super__);\n    function SubscribeOnObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(scheduler, state) {\n      var source = state[0], d = state[1], o = state[2];\n      d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(o)));\n    }\n\n    SubscribeOnObservable.prototype.subscribeCore = function (o) {\n      var m = new SingleAssignmentDisposable(), d = new SerialDisposable();\n      d.setDisposable(m);\n      m.setDisposable(this._s.schedule([this.source, d, o], scheduleMethod));\n      return d;\n    };\n\n    return SubscribeOnObservable;\n  }(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n   *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n   *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n   *  callbacks on a scheduler, use observeOn.\n\n   *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n   *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n   */\n  observableProto.subscribeOn = function (scheduler) {\n    return new SubscribeOnObservable(this, scheduler);\n  };\n\n  var GenerateObservable = (function (__super__) {\n    inherits(GenerateObservable, __super__);\n    function GenerateObservable(state, cndFn, itrFn, resFn, s) {\n      this._initialState = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n      var hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (hasResult === errorObj) { return state.o.onError(hasResult.e); }\n      if (hasResult) {\n        var result = tryCatch(state.self._resFn)(state.newState);\n        if (result === errorObj) { return state.o.onError(result.e); }\n        state.o.onNext(result);\n        recurse(state);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        first: true,\n        newState: this._initialState\n      };\n      return this._s.scheduleRecursive(state, scheduleRecursive);\n    };\n\n    return GenerateObservable;\n  }(ObservableBase));\n\n  /**\n   *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new GenerateObservable(initialState, condition, iterate, resultSelector, scheduler);\n  };\n\n  var UsingObservable = (function (__super__) {\n    inherits(UsingObservable, __super__);\n    function UsingObservable(resFn, obsFn) {\n      this._resFn = resFn;\n      this._obsFn = obsFn;\n      __super__.call(this);\n    }\n\n    UsingObservable.prototype.subscribeCore = function (o) {\n      var disposable = disposableEmpty;\n      var resource = tryCatch(this._resFn)();\n      if (resource === errorObj) {\n        return new BinaryDisposable(observableThrow(resource.e).subscribe(o), disposable);\n      }\n      resource && (disposable = resource);\n      var source = tryCatch(this._obsFn)(resource);\n      if (source === errorObj) {\n        return new BinaryDisposable(observableThrow(source.e).subscribe(o), disposable);\n      }\n      return new BinaryDisposable(source.subscribe(o), disposable);\n    };\n\n    return UsingObservable;\n  }(ObservableBase));\n\n  /**\n   * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n   * @param {Function} resourceFactory Factory function to obtain a resource object.\n   * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n   * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n   */\n  Observable.using = function (resourceFactory, observableFactory) {\n    return new UsingObservable(resourceFactory, observableFactory);\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @param {Observable} rightSource Second observable sequence or Promise.\n   * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n   */\n  observableProto.amb = function (rightSource) {\n    var leftSource = this;\n    return new AnonymousObservable(function (observer) {\n      var choice,\n        leftChoice = 'L', rightChoice = 'R',\n        leftSubscription = new SingleAssignmentDisposable(),\n        rightSubscription = new SingleAssignmentDisposable();\n\n      isPromise(rightSource) && (rightSource = observableFromPromise(rightSource));\n\n      function choiceL() {\n        if (!choice) {\n          choice = leftChoice;\n          rightSubscription.dispose();\n        }\n      }\n\n      function choiceR() {\n        if (!choice) {\n          choice = rightChoice;\n          leftSubscription.dispose();\n        }\n      }\n\n      var leftSubscribe = observerCreate(\n        function (left) {\n          choiceL();\n          choice === leftChoice && observer.onNext(left);\n        },\n        function (e) {\n          choiceL();\n          choice === leftChoice && observer.onError(e);\n        },\n        function () {\n          choiceL();\n          choice === leftChoice && observer.onCompleted();\n        }\n      );\n      var rightSubscribe = observerCreate(\n        function (right) {\n          choiceR();\n          choice === rightChoice && observer.onNext(right);\n        },\n        function (e) {\n          choiceR();\n          choice === rightChoice && observer.onError(e);\n        },\n        function () {\n          choiceR();\n          choice === rightChoice && observer.onCompleted();\n        }\n      );\n\n      leftSubscription.setDisposable(leftSource.subscribe(leftSubscribe));\n      rightSubscription.setDisposable(rightSource.subscribe(rightSubscribe));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    });\n  };\n\n  function amb(p, c) { return p.amb(c); }\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n   */\n  Observable.amb = function () {\n    var acc = observableNever(), items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(items);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    for (var i = 0, len = items.length; i < len; i++) {\n      acc = amb(acc, items[i]);\n    }\n    return acc;\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n   * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n   */\n  observableProto.onErrorResumeNext = function (second) {\n    if (!second) { throw new Error('Second observable is required'); }\n    return onErrorResumeNext([this, second]);\n  };\n\n  var OnErrorResumeNextObservable = (function(__super__) {\n    inherits(OnErrorResumeNextObservable, __super__);\n    function OnErrorResumeNextObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.pos < state.sources.length) {\n        var current = state.sources[state.pos++];\n        isPromise(current) && (current = observableFromPromise(current));\n        var d = new SingleAssignmentDisposable();\n        state.subscription.setDisposable(d);\n        d.setDisposable(current.subscribe(new OnErrorResumeNextObserver(state, recurse)));\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    OnErrorResumeNextObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable(),\n          state = {pos: 0, subscription: subscription, o: o, sources: this.sources },\n          cancellable = immediateScheduler.scheduleRecursive(state, scheduleMethod);\n\n      return new BinaryDisposable(subscription, cancellable);\n    };\n\n    return OnErrorResumeNextObservable;\n  }(ObservableBase));\n\n  var OnErrorResumeNextObserver = (function(__super__) {\n    inherits(OnErrorResumeNextObserver, __super__);\n    function OnErrorResumeNextObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      __super__.call(this);\n    }\n\n    OnErrorResumeNextObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    OnErrorResumeNextObserver.prototype.error = function () { this._recurse(this._state); };\n    OnErrorResumeNextObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return OnErrorResumeNextObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n   */\n  var onErrorResumeNext = Observable.onErrorResumeNext = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      var len = arguments.length;\n      sources = new Array(len);\n      for(var i = 0; i < len; i++) { sources[i] = arguments[i]; }\n    }\n    return new OnErrorResumeNextObservable(sources);\n  };\n\n  function toArray(x) { return x.toArray(); }\n  function notEmpty(x) { return x.length > 0; }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n   * @param {Number} count Length of each buffer.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithCount = observableProto.bufferCount = function (count, skip) {\n    typeof skip !== 'number' && (skip = count);\n    return this.windowWithCount(count, skip)\n      .flatMap(toArray)\n      .filter(notEmpty);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n   * @param {Number} count Length of each window.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithCount = observableProto.windowCount = function (count, skip) {\n    var source = this;\n    +count || (count = 0);\n    Math.abs(count) === Infinity && (count = 0);\n    if (count <= 0) { throw new ArgumentOutOfRangeError(); }\n    skip == null && (skip = count);\n    +skip || (skip = 0);\n    Math.abs(skip) === Infinity && (skip = 0);\n\n    if (skip <= 0) { throw new ArgumentOutOfRangeError(); }\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(),\n        refCountDisposable = new RefCountDisposable(m),\n        n = 0,\n        q = [];\n\n      function createWindow () {\n        var s = new Subject();\n        q.push(s);\n        observer.onNext(addRef(s, refCountDisposable));\n      }\n\n      createWindow();\n\n      m.setDisposable(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n          var c = n - count + 1;\n          c >= 0 && c % skip === 0 && q.shift().onCompleted();\n          ++n % skip === 0 && createWindow();\n        },\n        function (e) {\n          while (q.length > 0) { q.shift().onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          while (q.length > 0) { q.shift().onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  var TakeLastBufferObserver = (function (__super__) {\n    inherits(TakeLastBufferObserver, __super__);\n    function TakeLastBufferObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastBufferObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastBufferObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastBufferObserver.prototype.completed = function () {\n      this._o.onNext(this._q);\n      this._o.onCompleted();\n    };\n\n    return TakeLastBufferObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n   *\n   * @description\n   *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n   *  source sequence, this buffer is produced on the result sequence.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLastBuffer = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastBufferObserver(o, count));\n    }, source);\n  };\n\n  var DefaultIfEmptyObserver = (function (__super__) {\n    inherits(DefaultIfEmptyObserver, __super__);\n    function DefaultIfEmptyObserver(o, d) {\n      this._o = o;\n      this._d = d;\n      this._f = false;\n      __super__.call(this);\n    }\n\n    DefaultIfEmptyObserver.prototype.next = function (x) {\n      this._f = true;\n      this._o.onNext(x);\n    };\n\n    DefaultIfEmptyObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    DefaultIfEmptyObserver.prototype.completed = function () {\n      !this._f && this._o.onNext(this._d);\n      this._o.onCompleted();\n    };\n\n    return DefaultIfEmptyObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n   *\n   *  var res = obs = xs.defaultIfEmpty();\n   *  2 - obs = xs.defaultIfEmpty(false);\n   *\n   * @memberOf Observable#\n   * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n   * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n   */\n    observableProto.defaultIfEmpty = function (defaultValue) {\n      var source = this;\n      defaultValue === undefined && (defaultValue = null);\n      return new AnonymousObservable(function (o) {\n        return source.subscribe(new DefaultIfEmptyObserver(o, defaultValue));\n      }, source);\n    };\n\n  // Swap out for Array.findIndex\n  function arrayIndexOfComparer(array, item, comparer) {\n    for (var i = 0, len = array.length; i < len; i++) {\n      if (comparer(array[i], item)) { return i; }\n    }\n    return -1;\n  }\n\n  function HashSet(comparer) {\n    this.comparer = comparer;\n    this.set = [];\n  }\n  HashSet.prototype.push = function(value) {\n    var retValue = arrayIndexOfComparer(this.set, value, this.comparer) === -1;\n    retValue && this.set.push(value);\n    return retValue;\n  };\n\n  var DistinctObservable = (function (__super__) {\n    inherits(DistinctObservable, __super__);\n    function DistinctObservable(source, keyFn, cmpFn) {\n      this.source = source;\n      this._keyFn = keyFn;\n      this._cmpFn = cmpFn;\n      __super__.call(this);\n    }\n\n    DistinctObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctObserver(o, this._keyFn, this._cmpFn));\n    };\n\n    return DistinctObservable;\n  }(ObservableBase));\n\n  var DistinctObserver = (function (__super__) {\n    inherits(DistinctObserver, __super__);\n    function DistinctObserver(o, keyFn, cmpFn) {\n      this._o = o;\n      this._keyFn = keyFn;\n      this._h = new HashSet(cmpFn);\n      __super__.call(this);\n    }\n\n    DistinctObserver.prototype.next = function (x) {\n      var key = x;\n      if (isFunction(this._keyFn)) {\n        key = tryCatch(this._keyFn)(x);\n        if (key === errorObj) { return this._o.onError(key.e); }\n      }\n      this._h.push(key) && this._o.onNext(x);\n    };\n\n    DistinctObserver.prototype.error = function (e) { this._o.onError(e); };\n    DistinctObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DistinctObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n   *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n   *\n   * @example\n   *  var res = obs = xs.distinct();\n   *  2 - obs = xs.distinct(function (x) { return x.id; });\n   *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n   * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n   * @param {Function} [comparer]  Used to compare items in the collection.\n   * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinct = function (keySelector, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctObservable(this, keySelector, comparer);\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence. This observable sequence\n   * can be resubscribed to, even if all prior subscriptions have ended. (unlike `.publish().refCount()`)\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source.\n   */\n  observableProto.singleInstance = function() {\n    var source = this, hasObservable = false, observable;\n\n    function getObservable() {\n      if (!hasObservable) {\n        hasObservable = true;\n        observable = source['finally'](function() { hasObservable = false; }).publish().refCount();\n      }\n      return observable;\n    }\n\n    return new AnonymousObservable(function(o) {\n      return getObservable().subscribe(o);\n    });\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite-joinpatterns/package.json",
    "content": "{\n  \"name\": \"rx-lite-joinpatterns\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Async\",\n  \"description\": \"Lightweight library with join pattern functions for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.joinpatterns.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.joinpatterns.js\"\n  },\n  \"dependencies\": {\n    \"rx-lite\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.joinpatterns.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-joinpatterns/readme.md",
    "content": "# RxJS Join Patterns Module #\n\nThe Reactive Extensions for JavaScript also supports join calculus in that you can easily create patterns for when certain observable sequences fire.  This requires `rx.lite.js` from the [`rx-lite`](https://www.npmjs.com/package/rx-lite) NPM module.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-joinpatterns\n$ npm install -g rx-lite-joinpatterns\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-joinpatterns');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.js\"></script>\n<script src=\"path/to/rx.lite.joinpatterns.js\"></script>\n```\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`when`](../../doc/api/core/operators/when.md)\n\n### `Observable Instance Methods`\n- [`and`](../../doc/api/core/operators/and.md)\n\n### `Pattern Instance Methods`\n- [`thenDo`](../../doc/api/core/operators/thendo.md)\n\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-joinpatterns/rx.lite.joinpatterns.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Aliases\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    observableThrow = Observable.throwError,\n    observerCreate = Rx.Observer.create,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    noop = Rx.helpers.noop,\n    inherits = Rx.internals.inherits,\n    isFunction = Rx.helpers.isFunction;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  var Map = root.Map || (function () {\n    function Map() {\n      this.size = 0;\n      this._values = [];\n      this._keys = [];\n    }\n\n    Map.prototype['delete'] = function (key) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) { return false; }\n      this._values.splice(i, 1);\n      this._keys.splice(i, 1);\n      this.size--;\n      return true;\n    };\n\n    Map.prototype.get = function (key) {\n      var i = this._keys.indexOf(key);\n      return i === -1 ? undefined : this._values[i];\n    };\n\n    Map.prototype.set = function (key, value) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) {\n        this._keys.push(key);\n        this._values.push(value);\n        this.size++;\n      } else {\n        this._values[i] = value;\n      }\n      return this;\n    };\n\n    Map.prototype.forEach = function (cb, thisArg) {\n      for (var i = 0; i < this.size; i++) {\n        cb.call(thisArg, this._values[i], this._keys[i]);\n      }\n    };\n\n    return Map;\n  }());\n\n  /**\n   * @constructor\n   * Represents a join pattern over observable sequences.\n   */\n  function Pattern(patterns) {\n    this.patterns = patterns;\n  }\n\n  /**\n   *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n   *  @param other Observable sequence to match in addition to the current pattern.\n   *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n   */\n  Pattern.prototype.and = function (other) {\n    return new Pattern(this.patterns.concat(other));\n  };\n\n  /**\n   *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n   *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n   *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  Pattern.prototype.thenDo = function (selector) {\n    return new Plan(this, selector);\n  };\n\n  function Plan(expression, selector) {\n    this.expression = expression;\n    this.selector = selector;\n  }\n\n  function handleOnError(o) { return function (e) { o.onError(e); }; }\n  function handleOnNext(self, observer) {\n    return function onNext () {\n      var result = tryCatch(self.selector).apply(self, arguments);\n      if (result === errorObj) { return observer.onError(result.e); }\n      observer.onNext(result);\n    };\n  }\n\n  Plan.prototype.activate = function (externalSubscriptions, observer, deactivate) {\n    var joinObservers = [], errHandler = handleOnError(observer);\n    for (var i = 0, len = this.expression.patterns.length; i < len; i++) {\n      joinObservers.push(planCreateObserver(externalSubscriptions, this.expression.patterns[i], errHandler));\n    }\n    var activePlan = new ActivePlan(joinObservers, handleOnNext(this, observer), function () {\n      for (var j = 0, jlen = joinObservers.length; j < jlen; j++) {\n        joinObservers[j].removeActivePlan(activePlan);\n      }\n      deactivate(activePlan);\n    });\n    for (i = 0, len = joinObservers.length; i < len; i++) {\n      joinObservers[i].addActivePlan(activePlan);\n    }\n    return activePlan;\n  };\n\n  function planCreateObserver(externalSubscriptions, observable, onError) {\n    var entry = externalSubscriptions.get(observable);\n    if (!entry) {\n      var observer = new JoinObserver(observable, onError);\n      externalSubscriptions.set(observable, observer);\n      return observer;\n    }\n    return entry;\n  }\n\n  function ActivePlan(joinObserverArray, onNext, onCompleted) {\n    this.joinObserverArray = joinObserverArray;\n    this.onNext = onNext;\n    this.onCompleted = onCompleted;\n    this.joinObservers = new Map();\n    for (var i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      var joinObserver = this.joinObserverArray[i];\n      this.joinObservers.set(joinObserver, joinObserver);\n    }\n  }\n\n  ActivePlan.prototype.dequeue = function () {\n    this.joinObservers.forEach(function (v) { v.queue.shift(); });\n  };\n\n  ActivePlan.prototype.match = function () {\n    var i, len, hasValues = true;\n    for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      if (this.joinObserverArray[i].queue.length === 0) {\n        hasValues = false;\n        break;\n      }\n    }\n    if (hasValues) {\n      var firstValues = [],\n          isCompleted = false;\n      for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n        firstValues.push(this.joinObserverArray[i].queue[0]);\n        this.joinObserverArray[i].queue[0].kind === 'C' && (isCompleted = true);\n      }\n      if (isCompleted) {\n        this.onCompleted();\n      } else {\n        this.dequeue();\n        var values = [];\n        for (i = 0, len = firstValues.length; i < firstValues.length; i++) {\n          values.push(firstValues[i].value);\n        }\n        this.onNext.apply(this, values);\n      }\n    }\n  };\n\n  var JoinObserver = (function (__super__) {\n    inherits(JoinObserver, __super__);\n\n    function JoinObserver(source, onError) {\n      __super__.call(this);\n      this.source = source;\n      this.onError = onError;\n      this.queue = [];\n      this.activePlans = [];\n      this.subscription = new SingleAssignmentDisposable();\n      this.isDisposed = false;\n    }\n\n    var JoinObserverPrototype = JoinObserver.prototype;\n\n    JoinObserverPrototype.next = function (notification) {\n      if (!this.isDisposed) {\n        if (notification.kind === 'E') {\n          return this.onError(notification.error);\n        }\n        this.queue.push(notification);\n        var activePlans = this.activePlans.slice(0);\n        for (var i = 0, len = activePlans.length; i < len; i++) {\n          activePlans[i].match();\n        }\n      }\n    };\n\n    JoinObserverPrototype.error = noop;\n    JoinObserverPrototype.completed = noop;\n\n    JoinObserverPrototype.addActivePlan = function (activePlan) {\n      this.activePlans.push(activePlan);\n    };\n\n    JoinObserverPrototype.subscribe = function () {\n      this.subscription.setDisposable(this.source.materialize().subscribe(this));\n    };\n\n    JoinObserverPrototype.removeActivePlan = function (activePlan) {\n      this.activePlans.splice(this.activePlans.indexOf(activePlan), 1);\n      this.activePlans.length === 0 && this.dispose();\n    };\n\n    JoinObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this.subscription.dispose();\n      }\n    };\n\n    return JoinObserver;\n  } (AbstractObserver));\n\n  /**\n   *  Creates a pattern that matches when both observable sequences have an available value.\n   *\n   *  @param right Observable sequence to match with the current sequence.\n   *  @return {Pattern} Pattern object that matches when both observable sequences have an available value.\n   */\n  observableProto.and = function (right) {\n    return new Pattern([this, right]);\n  };\n\n  /**\n   *  Matches when the observable sequence has an available value and projects the value.\n   *\n   *  @param {Function} selector Selector that will be invoked for values in the source sequence.\n   *  @returns {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  observableProto.thenDo = function (selector) {\n    return new Pattern([this]).thenDo(selector);\n  };\n\n  /**\n   *  Joins together the results from several patterns.\n   *\n   *  @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns.\n   *  @returns {Observable} Observable sequence with the results form matching several patterns.\n   */\n  Observable.when = function () {\n    var len = arguments.length, plans;\n    if (Array.isArray(arguments[0])) {\n      plans = arguments[0];\n    } else {\n      plans = new Array(len);\n      for(var i = 0; i < len; i++) { plans[i] = arguments[i]; }\n    }\n    return new AnonymousObservable(function (o) {\n      var activePlans = [],\n          externalSubscriptions = new Map();\n      var outObserver = observerCreate(\n        function (x) { o.onNext(x); },\n        function (err) {\n          externalSubscriptions.forEach(function (v) { v.onError(err); });\n          o.onError(err);\n        },\n        function (x) { o.onCompleted(); }\n      );\n      try {\n        for (var i = 0, len = plans.length; i < len; i++) {\n          activePlans.push(plans[i].activate(externalSubscriptions, outObserver, function (activePlan) {\n            var idx = activePlans.indexOf(activePlan);\n            activePlans.splice(idx, 1);\n            activePlans.length === 0 && o.onCompleted();\n          }));\n        }\n      } catch (e) {\n        return observableThrow(e).subscribe(o);\n      }\n      var group = new CompositeDisposable();\n      externalSubscriptions.forEach(function (joinObserver) {\n        joinObserver.subscribe();\n        group.add(joinObserver);\n      });\n\n      return group;\n    });\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite-joinpatterns-compat/package.json",
    "content": "{\n  \"name\": \"rx-lite-joinpatterns-compat\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Async\",\n  \"description\": \"Lightweight older browser compatible library with join pattern functions for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.joinpatterns.compat.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.joinpatterns.compat.js\"\n  },\n  \"dependencies\": {\n    \"rx-lite-compat\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.joinpatterns.compat.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-joinpatterns-compat/readme.md",
    "content": "# RxJS Join Patterns Compat Module #\n\nThe Reactive Extensions for JavaScript also supports join calculus in that you can easily create patterns for when certain observable sequences fire.  This requires `rx.lite.js` from the [`rx-lite`](https://www.npmjs.com/package/rx-lite) NPM module.  This module has support for older browsers which do not support ES5 functionality, hence the name `compat`.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-joinpatterns-compat\n$ npm install -g rx-lite-joinpatterns-compat\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-joinpatterns');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.js\"></script>\n<script src=\"path/to/rx.lite.joinpatterns.js\"></script>\n```\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`when`](../../doc/api/core/operators/when.md)\n\n### `Observable Instance Methods`\n- [`and`](../../doc/api/core/operators/and.md)\n\n### `Pattern Instance Methods`\n- [`thenDo`](../../doc/api/core/operators/thendo.md)\n\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-joinpatterns-compat/rx.lite.joinpatterns.compat.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite.compat'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite-compat'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Aliases\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    observableThrow = Observable.throwError,\n    observerCreate = Rx.Observer.create,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    noop = Rx.helpers.noop,\n    inherits = Rx.internals.inherits,\n    isFunction = Rx.helpers.isFunction;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  var Map = root.Map || (function () {\n    function Map() {\n      this.size = 0;\n      this._values = [];\n      this._keys = [];\n    }\n\n    Map.prototype['delete'] = function (key) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) { return false; }\n      this._values.splice(i, 1);\n      this._keys.splice(i, 1);\n      this.size--;\n      return true;\n    };\n\n    Map.prototype.get = function (key) {\n      var i = this._keys.indexOf(key);\n      return i === -1 ? undefined : this._values[i];\n    };\n\n    Map.prototype.set = function (key, value) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) {\n        this._keys.push(key);\n        this._values.push(value);\n        this.size++;\n      } else {\n        this._values[i] = value;\n      }\n      return this;\n    };\n\n    Map.prototype.forEach = function (cb, thisArg) {\n      for (var i = 0; i < this.size; i++) {\n        cb.call(thisArg, this._values[i], this._keys[i]);\n      }\n    };\n\n    return Map;\n  }());\n\n  /**\n   * @constructor\n   * Represents a join pattern over observable sequences.\n   */\n  function Pattern(patterns) {\n    this.patterns = patterns;\n  }\n\n  /**\n   *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n   *  @param other Observable sequence to match in addition to the current pattern.\n   *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n   */\n  Pattern.prototype.and = function (other) {\n    return new Pattern(this.patterns.concat(other));\n  };\n\n  /**\n   *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n   *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n   *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  Pattern.prototype.thenDo = function (selector) {\n    return new Plan(this, selector);\n  };\n\n  function Plan(expression, selector) {\n    this.expression = expression;\n    this.selector = selector;\n  }\n\n  function handleOnError(o) { return function (e) { o.onError(e); }; }\n  function handleOnNext(self, observer) {\n    return function onNext () {\n      var result = tryCatch(self.selector).apply(self, arguments);\n      if (result === errorObj) { return observer.onError(result.e); }\n      observer.onNext(result);\n    };\n  }\n\n  Plan.prototype.activate = function (externalSubscriptions, observer, deactivate) {\n    var joinObservers = [], errHandler = handleOnError(observer);\n    for (var i = 0, len = this.expression.patterns.length; i < len; i++) {\n      joinObservers.push(planCreateObserver(externalSubscriptions, this.expression.patterns[i], errHandler));\n    }\n    var activePlan = new ActivePlan(joinObservers, handleOnNext(this, observer), function () {\n      for (var j = 0, jlen = joinObservers.length; j < jlen; j++) {\n        joinObservers[j].removeActivePlan(activePlan);\n      }\n      deactivate(activePlan);\n    });\n    for (i = 0, len = joinObservers.length; i < len; i++) {\n      joinObservers[i].addActivePlan(activePlan);\n    }\n    return activePlan;\n  };\n\n  function planCreateObserver(externalSubscriptions, observable, onError) {\n    var entry = externalSubscriptions.get(observable);\n    if (!entry) {\n      var observer = new JoinObserver(observable, onError);\n      externalSubscriptions.set(observable, observer);\n      return observer;\n    }\n    return entry;\n  }\n\n  function ActivePlan(joinObserverArray, onNext, onCompleted) {\n    this.joinObserverArray = joinObserverArray;\n    this.onNext = onNext;\n    this.onCompleted = onCompleted;\n    this.joinObservers = new Map();\n    for (var i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      var joinObserver = this.joinObserverArray[i];\n      this.joinObservers.set(joinObserver, joinObserver);\n    }\n  }\n\n  ActivePlan.prototype.dequeue = function () {\n    this.joinObservers.forEach(function (v) { v.queue.shift(); });\n  };\n\n  ActivePlan.prototype.match = function () {\n    var i, len, hasValues = true;\n    for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      if (this.joinObserverArray[i].queue.length === 0) {\n        hasValues = false;\n        break;\n      }\n    }\n    if (hasValues) {\n      var firstValues = [],\n          isCompleted = false;\n      for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n        firstValues.push(this.joinObserverArray[i].queue[0]);\n        this.joinObserverArray[i].queue[0].kind === 'C' && (isCompleted = true);\n      }\n      if (isCompleted) {\n        this.onCompleted();\n      } else {\n        this.dequeue();\n        var values = [];\n        for (i = 0, len = firstValues.length; i < firstValues.length; i++) {\n          values.push(firstValues[i].value);\n        }\n        this.onNext.apply(this, values);\n      }\n    }\n  };\n\n  var JoinObserver = (function (__super__) {\n    inherits(JoinObserver, __super__);\n\n    function JoinObserver(source, onError) {\n      __super__.call(this);\n      this.source = source;\n      this.onError = onError;\n      this.queue = [];\n      this.activePlans = [];\n      this.subscription = new SingleAssignmentDisposable();\n      this.isDisposed = false;\n    }\n\n    var JoinObserverPrototype = JoinObserver.prototype;\n\n    JoinObserverPrototype.next = function (notification) {\n      if (!this.isDisposed) {\n        if (notification.kind === 'E') {\n          return this.onError(notification.error);\n        }\n        this.queue.push(notification);\n        var activePlans = this.activePlans.slice(0);\n        for (var i = 0, len = activePlans.length; i < len; i++) {\n          activePlans[i].match();\n        }\n      }\n    };\n\n    JoinObserverPrototype.error = noop;\n    JoinObserverPrototype.completed = noop;\n\n    JoinObserverPrototype.addActivePlan = function (activePlan) {\n      this.activePlans.push(activePlan);\n    };\n\n    JoinObserverPrototype.subscribe = function () {\n      this.subscription.setDisposable(this.source.materialize().subscribe(this));\n    };\n\n    JoinObserverPrototype.removeActivePlan = function (activePlan) {\n      this.activePlans.splice(this.activePlans.indexOf(activePlan), 1);\n      this.activePlans.length === 0 && this.dispose();\n    };\n\n    JoinObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this.subscription.dispose();\n      }\n    };\n\n    return JoinObserver;\n  } (AbstractObserver));\n\n  /**\n   *  Creates a pattern that matches when both observable sequences have an available value.\n   *\n   *  @param right Observable sequence to match with the current sequence.\n   *  @return {Pattern} Pattern object that matches when both observable sequences have an available value.\n   */\n  observableProto.and = function (right) {\n    return new Pattern([this, right]);\n  };\n\n  /**\n   *  Matches when the observable sequence has an available value and projects the value.\n   *\n   *  @param {Function} selector Selector that will be invoked for values in the source sequence.\n   *  @returns {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  observableProto.thenDo = function (selector) {\n    return new Pattern([this]).thenDo(selector);\n  };\n\n  /**\n   *  Joins together the results from several patterns.\n   *\n   *  @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns.\n   *  @returns {Observable} Observable sequence with the results form matching several patterns.\n   */\n  Observable.when = function () {\n    var len = arguments.length, plans;\n    if (Array.isArray(arguments[0])) {\n      plans = arguments[0];\n    } else {\n      plans = new Array(len);\n      for(var i = 0; i < len; i++) { plans[i] = arguments[i]; }\n    }\n    return new AnonymousObservable(function (o) {\n      var activePlans = [],\n          externalSubscriptions = new Map();\n      var outObserver = observerCreate(\n        function (x) { o.onNext(x); },\n        function (err) {\n          externalSubscriptions.forEach(function (v) { v.onError(err); });\n          o.onError(err);\n        },\n        function (x) { o.onCompleted(); }\n      );\n      try {\n        for (var i = 0, len = plans.length; i < len; i++) {\n          activePlans.push(plans[i].activate(externalSubscriptions, outObserver, function (activePlan) {\n            var idx = activePlans.indexOf(activePlan);\n            activePlans.splice(idx, 1);\n            activePlans.length === 0 && o.onCompleted();\n          }));\n        }\n      } catch (e) {\n        return observableThrow(e).subscribe(o);\n      }\n      var group = new CompositeDisposable();\n      externalSubscriptions.forEach(function (joinObserver) {\n        joinObserver.subscribe();\n        group.add(joinObserver);\n      });\n\n      return group;\n    });\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite-testing/package.json",
    "content": "{\n  \"name\": \"rx-lite-testing\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Async\",\n  \"description\": \"Lightweight library with testing functions for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.testing.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.testing.js\"\n  },\n  \"dependencies\": {\n    \"rx-lite-virtualtime\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.testing.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-testing/readme.md",
    "content": "# RxJS Testing Module #\n\nThe Reactive Extensions for JavaScript has a built-in mechanism for testing all operators which allows for mocking absolute and relative time with ease. This requires `rx.lite.virtualtime.js` from the [`rx-lite-virtualtime`](https://www.npmjs.com/package/rx-virtualtime) NPM module.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-testing\n$ npm install -g rx-lite-testing\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-testing');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.js\"></script>\n<script src=\"path/to/rx.lite.virtualtime.js\"></script>\n<script src=\"path/to/rx.lite.testing.js\"></script>\n```\n\n## Included Classes ##\n\n### Testing Classes\n\n- [`Rx.ReactiveTest`](../../doc/api/testing/reactivetest.md)\n- [`Rx.Recorded`](../../doc/api/testing/recorded.md)\n- [`Rx.Subscription`](../../doc/api/testing/subscription.md)\n- [`Rx.TestScheduler`](../../doc/api/testing/testscheduler.md)\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-testing/rx.lite.testing.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite.virtualtime'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite-virtualtime'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Defaults\n  var Observer = Rx.Observer,\n    Observable = Rx.Observable,\n    Notification = Rx.Notification,\n    VirtualTimeScheduler = Rx.VirtualTimeScheduler,\n    Disposable = Rx.Disposable,\n    disposableEmpty = Disposable.empty,\n    disposableCreate = Disposable.create,\n    CompositeDisposable = Rx.CompositeDisposable,\n    inherits = Rx.internals.inherits,\n    defaultComparer = Rx.internals.isEqual;\n\nfunction OnNextPredicate(predicate) {\n    this.predicate = predicate;\n}\n\nOnNextPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'N') { return false; }\n  return this.predicate(other.value);\n};\n\nfunction OnErrorPredicate(predicate) {\n  this.predicate = predicate;\n}\n\nOnErrorPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'E') { return false; }\n  return this.predicate(other.error);\n};\n\nvar ReactiveTest = Rx.ReactiveTest = {\n  /** Default virtual time used for creation of observable sequences in unit tests. */\n  created: 100,\n  /** Default virtual time used to subscribe to observable sequences in unit tests. */\n  subscribed: 200,\n  /** Default virtual time used to dispose subscriptions in unit tests. */\n  disposed: 1000,\n\n  /**\n   * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n   *\n   * 1 - ReactiveTest.onNext(200, 42);\n   * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n   *\n   * @param ticks Recorded virtual time the OnNext notification occurs.\n   * @param value Recorded value stored in the OnNext notification or a predicate.\n   * @return Recorded OnNext notification.\n   */\n  onNext: function (ticks, value) {\n    return typeof value === 'function' ?\n      new Recorded(ticks, new OnNextPredicate(value)) :\n      new Recorded(ticks, Notification.createOnNext(value));\n  },\n  /**\n   * Factory method for an OnError notification record at a given time with a given error.\n   *\n   * 1 - ReactiveTest.onNext(200, new Error('error'));\n   * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n   *\n   * @param ticks Recorded virtual time the OnError notification occurs.\n   * @param exception Recorded exception stored in the OnError notification.\n   * @return Recorded OnError notification.\n   */\n  onError: function (ticks, error) {\n    return typeof error === 'function' ?\n      new Recorded(ticks, new OnErrorPredicate(error)) :\n      new Recorded(ticks, Notification.createOnError(error));\n  },\n  /**\n   * Factory method for an OnCompleted notification record at a given time.\n   *\n   * @param ticks Recorded virtual time the OnCompleted notification occurs.\n   * @return Recorded OnCompleted notification.\n   */\n  onCompleted: function (ticks) {\n    return new Recorded(ticks, Notification.createOnCompleted());\n  },\n  /**\n   * Factory method for a subscription record based on a given subscription and disposal time.\n   *\n   * @param start Virtual time indicating when the subscription was created.\n   * @param end Virtual time indicating when the subscription was disposed.\n   * @return Subscription object.\n   */\n  subscribe: function (start, end) {\n    return new Subscription(start, end);\n  }\n};\n\n  /**\n   * Creates a new object recording the production of the specified value at the given virtual time.\n   *\n   * @constructor\n   * @param {Number} time Virtual time the value was produced on.\n   * @param {Mixed} value Value that was produced.\n   * @param {Function} comparer An optional comparer.\n   */\n  var Recorded = Rx.Recorded = function (time, value, comparer) {\n    this.time = time;\n    this.value = value;\n    this.comparer = comparer || defaultComparer;\n  };\n\n  /**\n   * Checks whether the given recorded object is equal to the current instance.\n   *\n   * @param {Recorded} other Recorded object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Recorded.prototype.equals = function (other) {\n    return this.time === other.time && this.comparer(this.value, other.value);\n  };\n\n  /**\n   * Returns a string representation of the current Recorded value.\n   *\n   * @returns {String} String representation of the current Recorded value.\n   */\n  Recorded.prototype.toString = function () {\n    return this.value.toString() + '@' + this.time;\n  };\n\n  /**\n   * Creates a new subscription object with the given virtual subscription and unsubscription time.\n   *\n   * @constructor\n   * @param {Number} subscribe Virtual time at which the subscription occurred.\n   * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n   */\n  var Subscription = Rx.Subscription = function (start, end) {\n    this.subscribe = start;\n    this.unsubscribe = end || Number.MAX_VALUE;\n  };\n\n  /**\n   * Checks whether the given subscription is equal to the current instance.\n   * @param other Subscription object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Subscription.prototype.equals = function (other) {\n    return this.subscribe === other.subscribe && this.unsubscribe === other.unsubscribe;\n  };\n\n  /**\n   * Returns a string representation of the current Subscription value.\n   * @returns {String} String representation of the current Subscription value.\n   */\n  Subscription.prototype.toString = function () {\n    return '(' + this.subscribe + ', ' + (this.unsubscribe === Number.MAX_VALUE ? 'Infinite' : this.unsubscribe) + ')';\n  };\n\n  var MockDisposable = Rx.MockDisposable = function (scheduler) {\n    this.scheduler = scheduler;\n    this.disposes = [];\n    this.disposes.push(this.scheduler.clock);\n  };\n\n  MockDisposable.prototype.dispose = function () {\n    this.disposes.push(this.scheduler.clock);\n  };\n\n  var MockObserver = (function (__super__) {\n    inherits(MockObserver, __super__);\n\n    function MockObserver(scheduler) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = [];\n    }\n\n    var MockObserverPrototype = MockObserver.prototype;\n\n    MockObserverPrototype.onNext = function (value) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnNext(value)));\n    };\n\n    MockObserverPrototype.onError = function (e) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnError(e)));\n    };\n\n    MockObserverPrototype.onCompleted = function () {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnCompleted()));\n    };\n\n    return MockObserver;\n  })(Observer);\n\n  function MockPromise(scheduler, messages) {\n    var self = this;\n    this.scheduler = scheduler;\n    this.messages = messages;\n    this.subscriptions = [];\n    this.observers = [];\n    for (var i = 0, len = this.messages.length; i < len; i++) {\n      var message = this.messages[i],\n          notification = message.value;\n      (function (innerNotification) {\n        scheduler.scheduleAbsolute(null, message.time, function () {\n          var obs = self.observers.slice(0);\n\n          for (var j = 0, jLen = obs.length; j < jLen; j++) {\n            innerNotification.accept(obs[j]);\n          }\n          return disposableEmpty;\n        });\n      })(notification);\n    }\n  }\n\n  MockPromise.prototype.then = function (onResolved, onRejected) {\n    var self = this;\n\n    this.subscriptions.push(new Subscription(this.scheduler.clock));\n    var index = this.subscriptions.length - 1;\n\n    var newPromise;\n\n    var observer = Rx.Observer.create(\n      function (x) {\n        var retValue = onResolved(x);\n        if (retValue && typeof retValue.then === 'function') {\n          newPromise = retValue;\n        } else {\n          var ticks = self.scheduler.clock;\n          newPromise = new MockPromise(self.scheduler, [Rx.ReactiveTest.onNext(ticks, undefined), Rx.ReactiveTest.onCompleted(ticks)]);\n        }\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      },\n      function (err) {\n        onRejected(err);\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      }\n    );\n    this.observers.push(observer);\n\n    return newPromise || new MockPromise(this.scheduler, this.messages);\n  };\n\n  var HotObservable = (function (__super__) {\n    inherits(HotObservable, __super__);\n\n    function HotObservable(scheduler, messages) {\n      __super__.call(this);\n      var message, notification, observable = this;\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n      this.observers = [];\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          scheduler.scheduleAbsolute(null, message.time, function () {\n            var obs = observable.observers.slice(0);\n\n            for (var j = 0, jLen = obs.length; j < jLen; j++) {\n              innerNotification.accept(obs[j]);\n            }\n            return disposableEmpty;\n          });\n        })(notification);\n      }\n    }\n\n    HotObservable.prototype._subscribe = function (o) {\n      var observable = this;\n      this.observers.push(o);\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      return disposableCreate(function () {\n        var idx = observable.observers.indexOf(o);\n        observable.observers.splice(idx, 1);\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n      });\n    };\n\n    return HotObservable;\n  })(Observable);\n\n  var ColdObservable = (function (__super__) {\n    inherits(ColdObservable, __super__);\n\n    function ColdObservable(scheduler, messages) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n    }\n\n    ColdObservable.prototype._subscribe = function (o) {\n      var message, notification, observable = this;\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      var d = new CompositeDisposable();\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          d.add(observable.scheduler.scheduleRelative(null, message.time, function () {\n            innerNotification.accept(o);\n            return disposableEmpty;\n          }));\n        })(notification);\n      }\n      return disposableCreate(function () {\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n        d.dispose();\n      });\n    };\n\n    return ColdObservable;\n  })(Observable);\n\n  /** Virtual time scheduler used for testing applications and libraries built using Reactive Extensions. */\n  Rx.TestScheduler = (function (__super__) {\n    inherits(TestScheduler, __super__);\n\n    function baseComparer(x, y) {\n      return x > y ? 1 : (x < y ? -1 : 0);\n    }\n\n    function TestScheduler() {\n      __super__.call(this, 0, baseComparer);\n    }\n\n    /**\n     * Schedules an action to be executed at the specified virtual time.\n     *\n     * @param state State passed to the action to be executed.\n     * @param dueTime Absolute virtual time at which to execute the action.\n     * @param action Action to be executed.\n     * @return Disposable object used to cancel the scheduled action (best effort).\n     */\n    TestScheduler.prototype.scheduleAbsolute = function (state, dueTime, action) {\n      dueTime <= this.clock && (dueTime = this.clock + 1);\n      return __super__.prototype.scheduleAbsolute.call(this, state, dueTime, action);\n    };\n    /**\n     * Adds a relative virtual time to an absolute virtual time value.\n     *\n     * @param absolute Absolute virtual time value.\n     * @param relative Relative virtual time value to add.\n     * @return Resulting absolute virtual time sum value.\n     */\n    TestScheduler.prototype.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n    /**\n     * Converts the absolute virtual time value to a DateTimeOffset value.\n     *\n     * @param absolute Absolute virtual time value to convert.\n     * @return Corresponding DateTimeOffset value.\n     */\n    TestScheduler.prototype.toAbsoluteTime = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     *\n     * @param timeSpan TimeSpan value to convert.\n     * @return Corresponding relative virtual time value.\n     */\n    TestScheduler.prototype.toRelativeTime = function (timeSpan) {\n      return timeSpan;\n    };\n    /**\n     * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n     *\n     * @param create Factory method to create an observable sequence.\n     * @param created Virtual time at which to invoke the factory to create an observable sequence.\n     * @param subscribed Virtual time at which to subscribe to the created observable sequence.\n     * @param disposed Virtual time at which to dispose the subscription.\n     * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n     */\n    TestScheduler.prototype.startScheduler = function (createFn, settings) {\n      settings || (settings = {});\n      settings.created == null && (settings.created = ReactiveTest.created);\n      settings.subscribed == null && (settings.subscribed = ReactiveTest.subscribed);\n      settings.disposed == null && (settings.disposed = ReactiveTest.disposed);\n\n      var observer = this.createObserver(), source, subscription;\n\n      this.scheduleAbsolute(null, settings.created, function () {\n        source = createFn();\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.subscribed, function () {\n        subscription = source.subscribe(observer);\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.disposed, function () {\n        subscription.dispose();\n        return disposableEmpty;\n      });\n\n      this.start();\n\n      return observer;\n    };\n\n    /**\n     * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n     * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createHotObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new HotObservable(this, args);\n    };\n\n    /**\n     * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n     * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createColdObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new ColdObservable(this, args);\n    };\n\n    /**\n     * Creates a resolved promise with the given value and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} value The value to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which fulfills with the given value.\n     */\n    TestScheduler.prototype.createResolvedPromise = function (ticks, value) {\n      return new MockPromise(this, [Rx.ReactiveTest.onNext(ticks, value), Rx.ReactiveTest.onCompleted(ticks)]);\n    };\n\n    /**\n     * Creates a rejected promise with the given reason and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} reason The reason for rejection to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which rejects with the given reason.\n     */\n    TestScheduler.prototype.createRejectedPromise = function (ticks, reason) {\n      return new MockPromise(this, [Rx.ReactiveTest.onError(ticks, reason)]);\n    };\n\n    /**\n     * Creates an observer that records received notification messages and timestamps those.\n     * @return Observer that can be used to assert the timing of received notifications.\n     */\n    TestScheduler.prototype.createObserver = function () {\n      return new MockObserver(this);\n    };\n\n    return TestScheduler;\n  })(VirtualTimeScheduler);\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite-testing-compat/package.json",
    "content": "{\n  \"name\": \"rx-lite-testing-compat\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Async\",\n  \"description\": \"Lightweight older browser compatible library with testing functions for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.testing.compat.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.testing.compat.js\"\n  },\n  \"dependencies\": {\n    \"rx-virtualtime-compat\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.testing.compat.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-testing-compat/readme.md",
    "content": "# RxJS Testing Compat Module #\n\nThe Reactive Extensions for JavaScript has a built-in mechanism for testing all operators which allows for mocking absolute and relative time with ease. This requires `rx.lite.virtualtime.js` from the [`rx-lite-virtualtime`](https://www.npmjs.com/package/rx-virtualtime) NPM module.  This module has support for older browsers which do not support ES5 functionality, hence the name `compat`.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-testing-compat\n$ npm install -g rx-lite-testing-compat\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-testing-compat');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.compat.js\"></script>\n<script src=\"path/to/rx.lite.virtualtime.compat.js\"></script>\n<script src=\"path/to/rx.lite.testing.compat.js\"></script>\n```\n\n## Included Classes ##\n\n### Testing Classes\n\n- [`Rx.ReactiveTest`](../../doc/api/testing/reactivetest.md)\n- [`Rx.Recorded`](../../doc/api/testing/recorded.md)\n- [`Rx.Subscription`](../../doc/api/testing/subscription.md)\n- [`Rx.TestScheduler`](../../doc/api/testing/testscheduler.md)\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-testing-compat/rx.lite.testing.compat.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite.virtualtime.compat'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite-virtualtime-compat'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Defaults\n  var Observer = Rx.Observer,\n    Observable = Rx.Observable,\n    Notification = Rx.Notification,\n    VirtualTimeScheduler = Rx.VirtualTimeScheduler,\n    Disposable = Rx.Disposable,\n    disposableEmpty = Disposable.empty,\n    disposableCreate = Disposable.create,\n    CompositeDisposable = Rx.CompositeDisposable,\n    inherits = Rx.internals.inherits,\n    defaultComparer = Rx.internals.isEqual;\n\nfunction OnNextPredicate(predicate) {\n    this.predicate = predicate;\n}\n\nOnNextPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'N') { return false; }\n  return this.predicate(other.value);\n};\n\nfunction OnErrorPredicate(predicate) {\n  this.predicate = predicate;\n}\n\nOnErrorPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'E') { return false; }\n  return this.predicate(other.error);\n};\n\nvar ReactiveTest = Rx.ReactiveTest = {\n  /** Default virtual time used for creation of observable sequences in unit tests. */\n  created: 100,\n  /** Default virtual time used to subscribe to observable sequences in unit tests. */\n  subscribed: 200,\n  /** Default virtual time used to dispose subscriptions in unit tests. */\n  disposed: 1000,\n\n  /**\n   * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n   *\n   * 1 - ReactiveTest.onNext(200, 42);\n   * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n   *\n   * @param ticks Recorded virtual time the OnNext notification occurs.\n   * @param value Recorded value stored in the OnNext notification or a predicate.\n   * @return Recorded OnNext notification.\n   */\n  onNext: function (ticks, value) {\n    return typeof value === 'function' ?\n      new Recorded(ticks, new OnNextPredicate(value)) :\n      new Recorded(ticks, Notification.createOnNext(value));\n  },\n  /**\n   * Factory method for an OnError notification record at a given time with a given error.\n   *\n   * 1 - ReactiveTest.onNext(200, new Error('error'));\n   * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n   *\n   * @param ticks Recorded virtual time the OnError notification occurs.\n   * @param exception Recorded exception stored in the OnError notification.\n   * @return Recorded OnError notification.\n   */\n  onError: function (ticks, error) {\n    return typeof error === 'function' ?\n      new Recorded(ticks, new OnErrorPredicate(error)) :\n      new Recorded(ticks, Notification.createOnError(error));\n  },\n  /**\n   * Factory method for an OnCompleted notification record at a given time.\n   *\n   * @param ticks Recorded virtual time the OnCompleted notification occurs.\n   * @return Recorded OnCompleted notification.\n   */\n  onCompleted: function (ticks) {\n    return new Recorded(ticks, Notification.createOnCompleted());\n  },\n  /**\n   * Factory method for a subscription record based on a given subscription and disposal time.\n   *\n   * @param start Virtual time indicating when the subscription was created.\n   * @param end Virtual time indicating when the subscription was disposed.\n   * @return Subscription object.\n   */\n  subscribe: function (start, end) {\n    return new Subscription(start, end);\n  }\n};\n\n  /**\n   * Creates a new object recording the production of the specified value at the given virtual time.\n   *\n   * @constructor\n   * @param {Number} time Virtual time the value was produced on.\n   * @param {Mixed} value Value that was produced.\n   * @param {Function} comparer An optional comparer.\n   */\n  var Recorded = Rx.Recorded = function (time, value, comparer) {\n    this.time = time;\n    this.value = value;\n    this.comparer = comparer || defaultComparer;\n  };\n\n  /**\n   * Checks whether the given recorded object is equal to the current instance.\n   *\n   * @param {Recorded} other Recorded object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Recorded.prototype.equals = function (other) {\n    return this.time === other.time && this.comparer(this.value, other.value);\n  };\n\n  /**\n   * Returns a string representation of the current Recorded value.\n   *\n   * @returns {String} String representation of the current Recorded value.\n   */\n  Recorded.prototype.toString = function () {\n    return this.value.toString() + '@' + this.time;\n  };\n\n  /**\n   * Creates a new subscription object with the given virtual subscription and unsubscription time.\n   *\n   * @constructor\n   * @param {Number} subscribe Virtual time at which the subscription occurred.\n   * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n   */\n  var Subscription = Rx.Subscription = function (start, end) {\n    this.subscribe = start;\n    this.unsubscribe = end || Number.MAX_VALUE;\n  };\n\n  /**\n   * Checks whether the given subscription is equal to the current instance.\n   * @param other Subscription object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Subscription.prototype.equals = function (other) {\n    return this.subscribe === other.subscribe && this.unsubscribe === other.unsubscribe;\n  };\n\n  /**\n   * Returns a string representation of the current Subscription value.\n   * @returns {String} String representation of the current Subscription value.\n   */\n  Subscription.prototype.toString = function () {\n    return '(' + this.subscribe + ', ' + (this.unsubscribe === Number.MAX_VALUE ? 'Infinite' : this.unsubscribe) + ')';\n  };\n\n  var MockDisposable = Rx.MockDisposable = function (scheduler) {\n    this.scheduler = scheduler;\n    this.disposes = [];\n    this.disposes.push(this.scheduler.clock);\n  };\n\n  MockDisposable.prototype.dispose = function () {\n    this.disposes.push(this.scheduler.clock);\n  };\n\n  var MockObserver = (function (__super__) {\n    inherits(MockObserver, __super__);\n\n    function MockObserver(scheduler) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = [];\n    }\n\n    var MockObserverPrototype = MockObserver.prototype;\n\n    MockObserverPrototype.onNext = function (value) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnNext(value)));\n    };\n\n    MockObserverPrototype.onError = function (e) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnError(e)));\n    };\n\n    MockObserverPrototype.onCompleted = function () {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnCompleted()));\n    };\n\n    return MockObserver;\n  })(Observer);\n\n  function MockPromise(scheduler, messages) {\n    var self = this;\n    this.scheduler = scheduler;\n    this.messages = messages;\n    this.subscriptions = [];\n    this.observers = [];\n    for (var i = 0, len = this.messages.length; i < len; i++) {\n      var message = this.messages[i],\n          notification = message.value;\n      (function (innerNotification) {\n        scheduler.scheduleAbsolute(null, message.time, function () {\n          var obs = self.observers.slice(0);\n\n          for (var j = 0, jLen = obs.length; j < jLen; j++) {\n            innerNotification.accept(obs[j]);\n          }\n          return disposableEmpty;\n        });\n      })(notification);\n    }\n  }\n\n  MockPromise.prototype.then = function (onResolved, onRejected) {\n    var self = this;\n\n    this.subscriptions.push(new Subscription(this.scheduler.clock));\n    var index = this.subscriptions.length - 1;\n\n    var newPromise;\n\n    var observer = Rx.Observer.create(\n      function (x) {\n        var retValue = onResolved(x);\n        if (retValue && typeof retValue.then === 'function') {\n          newPromise = retValue;\n        } else {\n          var ticks = self.scheduler.clock;\n          newPromise = new MockPromise(self.scheduler, [Rx.ReactiveTest.onNext(ticks, undefined), Rx.ReactiveTest.onCompleted(ticks)]);\n        }\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      },\n      function (err) {\n        onRejected(err);\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      }\n    );\n    this.observers.push(observer);\n\n    return newPromise || new MockPromise(this.scheduler, this.messages);\n  };\n\n  var HotObservable = (function (__super__) {\n    inherits(HotObservable, __super__);\n\n    function HotObservable(scheduler, messages) {\n      __super__.call(this);\n      var message, notification, observable = this;\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n      this.observers = [];\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          scheduler.scheduleAbsolute(null, message.time, function () {\n            var obs = observable.observers.slice(0);\n\n            for (var j = 0, jLen = obs.length; j < jLen; j++) {\n              innerNotification.accept(obs[j]);\n            }\n            return disposableEmpty;\n          });\n        })(notification);\n      }\n    }\n\n    HotObservable.prototype._subscribe = function (o) {\n      var observable = this;\n      this.observers.push(o);\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      return disposableCreate(function () {\n        var idx = observable.observers.indexOf(o);\n        observable.observers.splice(idx, 1);\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n      });\n    };\n\n    return HotObservable;\n  })(Observable);\n\n  var ColdObservable = (function (__super__) {\n    inherits(ColdObservable, __super__);\n\n    function ColdObservable(scheduler, messages) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n    }\n\n    ColdObservable.prototype._subscribe = function (o) {\n      var message, notification, observable = this;\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      var d = new CompositeDisposable();\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          d.add(observable.scheduler.scheduleRelative(null, message.time, function () {\n            innerNotification.accept(o);\n            return disposableEmpty;\n          }));\n        })(notification);\n      }\n      return disposableCreate(function () {\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n        d.dispose();\n      });\n    };\n\n    return ColdObservable;\n  })(Observable);\n\n  /** Virtual time scheduler used for testing applications and libraries built using Reactive Extensions. */\n  Rx.TestScheduler = (function (__super__) {\n    inherits(TestScheduler, __super__);\n\n    function baseComparer(x, y) {\n      return x > y ? 1 : (x < y ? -1 : 0);\n    }\n\n    function TestScheduler() {\n      __super__.call(this, 0, baseComparer);\n    }\n\n    /**\n     * Schedules an action to be executed at the specified virtual time.\n     *\n     * @param state State passed to the action to be executed.\n     * @param dueTime Absolute virtual time at which to execute the action.\n     * @param action Action to be executed.\n     * @return Disposable object used to cancel the scheduled action (best effort).\n     */\n    TestScheduler.prototype.scheduleAbsolute = function (state, dueTime, action) {\n      dueTime <= this.clock && (dueTime = this.clock + 1);\n      return __super__.prototype.scheduleAbsolute.call(this, state, dueTime, action);\n    };\n    /**\n     * Adds a relative virtual time to an absolute virtual time value.\n     *\n     * @param absolute Absolute virtual time value.\n     * @param relative Relative virtual time value to add.\n     * @return Resulting absolute virtual time sum value.\n     */\n    TestScheduler.prototype.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n    /**\n     * Converts the absolute virtual time value to a DateTimeOffset value.\n     *\n     * @param absolute Absolute virtual time value to convert.\n     * @return Corresponding DateTimeOffset value.\n     */\n    TestScheduler.prototype.toAbsoluteTime = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     *\n     * @param timeSpan TimeSpan value to convert.\n     * @return Corresponding relative virtual time value.\n     */\n    TestScheduler.prototype.toRelativeTime = function (timeSpan) {\n      return timeSpan;\n    };\n    /**\n     * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n     *\n     * @param create Factory method to create an observable sequence.\n     * @param created Virtual time at which to invoke the factory to create an observable sequence.\n     * @param subscribed Virtual time at which to subscribe to the created observable sequence.\n     * @param disposed Virtual time at which to dispose the subscription.\n     * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n     */\n    TestScheduler.prototype.startScheduler = function (createFn, settings) {\n      settings || (settings = {});\n      settings.created == null && (settings.created = ReactiveTest.created);\n      settings.subscribed == null && (settings.subscribed = ReactiveTest.subscribed);\n      settings.disposed == null && (settings.disposed = ReactiveTest.disposed);\n\n      var observer = this.createObserver(), source, subscription;\n\n      this.scheduleAbsolute(null, settings.created, function () {\n        source = createFn();\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.subscribed, function () {\n        subscription = source.subscribe(observer);\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.disposed, function () {\n        subscription.dispose();\n        return disposableEmpty;\n      });\n\n      this.start();\n\n      return observer;\n    };\n\n    /**\n     * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n     * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createHotObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new HotObservable(this, args);\n    };\n\n    /**\n     * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n     * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createColdObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new ColdObservable(this, args);\n    };\n\n    /**\n     * Creates a resolved promise with the given value and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} value The value to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which fulfills with the given value.\n     */\n    TestScheduler.prototype.createResolvedPromise = function (ticks, value) {\n      return new MockPromise(this, [Rx.ReactiveTest.onNext(ticks, value), Rx.ReactiveTest.onCompleted(ticks)]);\n    };\n\n    /**\n     * Creates a rejected promise with the given reason and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} reason The reason for rejection to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which rejects with the given reason.\n     */\n    TestScheduler.prototype.createRejectedPromise = function (ticks, reason) {\n      return new MockPromise(this, [Rx.ReactiveTest.onError(ticks, reason)]);\n    };\n\n    /**\n     * Creates an observer that records received notification messages and timestamps those.\n     * @return Observer that can be used to assert the timing of received notifications.\n     */\n    TestScheduler.prototype.createObserver = function () {\n      return new MockObserver(this);\n    };\n\n    return TestScheduler;\n  })(VirtualTimeScheduler);\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite-time/package.json",
    "content": "{\n  \"name\": \"rx-lite-time\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Async\",\n  \"description\": \"Lightweight library with time-based functions for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.time.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.time.js\"\n  },\n  \"dependencies\": {\n    \"rx-lite\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.time.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-time/readme.md",
    "content": "# RxJS Time Module #\n\nThe Reactive Extensions for JavaScript, as it is a library that deals with events over time, naturally has a large number of operators that allow the creation of sequences at given timers, in addition to capturing time stamp and time interval information.  In addition, you can also check for timeouts on your operations.  This also supports windows and buffers with time. This requires `rx.lite.js` from the [`rx-lite`](https://www.npmjs.com/package/rx-lite) NPM module.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-time\n$ npm install -g rx-lite-time\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-time');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.js\"></script>\n<script src=\"path/to/rx.lite.time.js\"></script>\n```\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`generateWithAbsoluteTime`](../../doc/api/core/operators/generatewithabsolutetime.md)\n- [`generateWithRelativeTime`](../../doc/api/core/operators/generatewithrelativetime.md)\n\n### `Observable Instance Methods`\n- [`bufferWithTime`](../../doc/api/core/operators/bufferwithtime.md)\n- [`bufferWithTimeOrCount`](../../doc/api/core/operators/bufferwithtimeorcount.md)\n- [`debounceWithSelector`](../../doc/api/core/operators/debouncewithselector.md)\n- [`delaySubscription`](../api/core/operators/delaysubscription.md)\n- [`skipLastWithTime`](../../doc/api/core/operators/skiplastwithtime.md)\n- [`takeLastBufferWithTime`](../../doc/api/core/operators/takelastbufferwithtime.md)\n- [`takeLastWithTime`](../../doc/api/core/operators/takelastwithtime.md)\n- [`throttle`](../../doc/api/core/operators/throttle.md)\n- [`throttleWithTimeout`](../../doc/api/core/operators/debounce.md)\n- [`timeInterval`](../../doc/api/core/operators/timeinterval.md)\n- [`timeoutWithSelector`](../../doc/api/core/operators/timeoutwithselector.md)\n- [`timestamp`](../../doc/api/core/operators/timestamp.md)\n- [`windowWithTime`](../../doc/api/core/operators/windowwithtime.md)\n- [`windowWithTimeOrCount`](../../doc/api/core/operators/windowwithtimeorcount.md)\n\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-time/rx.lite.time.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Refernces\n  var inherits = Rx.internals.inherits,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    ObservableBase = Rx.ObservableBase,\n    observableDefer = Observable.defer,\n    observableEmpty = Observable.empty,\n    observableNever = Observable.never,\n    observableThrow = Observable['throw'],\n    observableFromArray = Observable.fromArray,\n    defaultScheduler = Rx.Scheduler['default'],\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    Subject = Rx.Subject,\n    addRef = Rx.internals.addRef,\n    normalizeTime = Rx.Scheduler.normalize,\n    helpers = Rx.helpers,\n    isPromise = helpers.isPromise,\n    isFunction = helpers.isFunction,\n    isScheduler = Rx.Scheduler.isScheduler,\n    observableFromPromise = Observable.fromPromise;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n   * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n   * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTime = observableProto.windowTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n    var source = this, timeShift;\n    timeShiftOrScheduler == null && (timeShift = timeSpan);\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    if (typeof timeShiftOrScheduler === 'number') {\n      timeShift = timeShiftOrScheduler;\n    } else if (isScheduler(timeShiftOrScheduler)) {\n      timeShift = timeSpan;\n      scheduler = timeShiftOrScheduler;\n    }\n    return new AnonymousObservable(function (observer) {\n      var groupDisposable,\n        nextShift = timeShift,\n        nextSpan = timeSpan,\n        q = [],\n        refCountDisposable,\n        timerD = new SerialDisposable(),\n        totalTime = 0;\n        groupDisposable = new CompositeDisposable(timerD),\n        refCountDisposable = new RefCountDisposable(groupDisposable);\n\n       function createTimer () {\n        var m = new SingleAssignmentDisposable(),\n          isSpan = false,\n          isShift = false;\n        timerD.setDisposable(m);\n        if (nextSpan === nextShift) {\n          isSpan = true;\n          isShift = true;\n        } else if (nextSpan < nextShift) {\n            isSpan = true;\n        } else {\n          isShift = true;\n        }\n        var newTotalTime = isSpan ? nextSpan : nextShift,\n          ts = newTotalTime - totalTime;\n        totalTime = newTotalTime;\n        if (isSpan) {\n          nextSpan += timeShift;\n        }\n        if (isShift) {\n          nextShift += timeShift;\n        }\n        m.setDisposable(scheduler.scheduleFuture(null, ts, function () {\n          if (isShift) {\n            var s = new Subject();\n            q.push(s);\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          isSpan && q.shift().onCompleted();\n          createTimer();\n        }));\n      };\n      q.push(new Subject());\n      observer.onNext(addRef(q[0], refCountDisposable));\n      createTimer();\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n        },\n        function (e) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed.\n   * @param {Number} timeSpan Maximum time length of a window.\n   * @param {Number} count Maximum element count of a window.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTimeOrCount = observableProto.windowTimeOrCount = function (timeSpan, count, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new AnonymousObservable(function (observer) {\n      var timerD = new SerialDisposable(),\n          groupDisposable = new CompositeDisposable(timerD),\n          refCountDisposable = new RefCountDisposable(groupDisposable),\n          n = 0,\n          windowId = 0,\n          s = new Subject();\n\n      function createTimer(id) {\n        var m = new SingleAssignmentDisposable();\n        timerD.setDisposable(m);\n        m.setDisposable(scheduler.scheduleFuture(null, timeSpan, function () {\n          if (id !== windowId) { return; }\n          n = 0;\n          var newId = ++windowId;\n          s.onCompleted();\n          s = new Subject();\n          observer.onNext(addRef(s, refCountDisposable));\n          createTimer(newId);\n        }));\n      }\n\n      observer.onNext(addRef(s, refCountDisposable));\n      createTimer(0);\n\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          var newId = 0, newWindow = false;\n          s.onNext(x);\n          if (++n === count) {\n            newWindow = true;\n            n = 0;\n            newId = ++windowId;\n            s.onCompleted();\n            s = new Subject();\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          newWindow && createTimer(newId);\n        },\n        function (e) {\n          s.onError(e);\n          observer.onError(e);\n        }, function () {\n          s.onCompleted();\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n   * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n   * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n   * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithTime = observableProto.bufferTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n    return this.windowWithTime(timeSpan, timeShiftOrScheduler, scheduler).flatMap(toArray);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed.\n   * @param {Number} timeSpan Maximum time length of a buffer.\n   * @param {Number} count Maximum element count of a buffer.\n   * @param {Scheduler} [scheduler]  Scheduler to run bufferin timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithTimeOrCount = observableProto.bufferTimeOrCount = function (timeSpan, count, scheduler) {\n    return this.windowWithTimeOrCount(timeSpan, count, scheduler).flatMap(toArray);\n  };\n\n  var TimeIntervalObservable = (function (__super__) {\n    inherits(TimeIntervalObservable, __super__);\n    function TimeIntervalObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimeIntervalObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TimeIntervalObserver(o, this._s));\n    };\n\n    return TimeIntervalObservable;\n  }(ObservableBase));\n\n  var TimeIntervalObserver = (function (__super__) {\n    inherits(TimeIntervalObserver, __super__);\n\n    function TimeIntervalObserver(o, s) {\n      this._o = o;\n      this._s = s;\n      this._l = s.now();\n      __super__.call(this);\n    }\n\n    TimeIntervalObserver.prototype.next = function (x) {\n      var now = this._s.now(), span = now - this._l;\n      this._l = now;\n      this._o.onNext({ value: x, interval: span });\n    };\n    TimeIntervalObserver.prototype.error = function (e) { this._o.onError(e); };\n    TimeIntervalObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TimeIntervalObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Records the time interval between consecutive values in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timeInterval();\n   *  2 - res = source.timeInterval(Rx.Scheduler.timeout);\n   *\n   * @param [scheduler]  Scheduler used to compute time intervals. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence with time interval information on values.\n   */\n  observableProto.timeInterval = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TimeIntervalObservable(this, scheduler);\n  };\n\n  var GenerateAbsoluteObservable = (function (__super__) {\n    inherits(GenerateAbsoluteObservable, __super__);\n    function GenerateAbsoluteObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n      this._state = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._timeFn = timeFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      state.hasResult && state.o.onNext(state.result);\n\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n      state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (state.hasResult === errorObj) { return state.o.onError(state.hasResult.e); }\n      if (state.hasResult) {\n        state.result = tryCatch(state.self._resFn)(state.newState);\n        if (state.result === errorObj) { return state.o.onError(state.result.e); }\n        var time = tryCatch(state.self._timeFn)(state.newState);\n        if (time === errorObj) { return state.o.onError(time.e); }\n        recurse(state, time);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateAbsoluteObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        newState: this._state,\n        first: true,\n        hasResult: false\n      };\n      return this._s.scheduleRecursiveFuture(state, new Date(this._s.now()), scheduleRecursive);\n    };\n\n    return GenerateAbsoluteObservable;\n  }(ObservableBase));\n\n  /**\n   *  GenerateAbsolutes an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithAbsoluteTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return new Date(); }\n   *  });\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning Date values.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithAbsoluteTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new GenerateAbsoluteObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n  };\n\n  var GenerateRelativeObservable = (function (__super__) {\n    inherits(GenerateRelativeObservable, __super__);\n    function GenerateRelativeObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n      this._state = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._timeFn = timeFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      state.hasResult && state.o.onNext(state.result);\n\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n\n      state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (state.hasResult === errorObj) { return state.o.onError(state.hasResult.e); }\n      if (state.hasResult) {\n        state.result = tryCatch(state.self._resFn)(state.newState);\n        if (state.result === errorObj) { return state.o.onError(state.result.e); }\n        var time = tryCatch(state.self._timeFn)(state.newState);\n        if (time === errorObj) { return state.o.onError(time.e); }\n        recurse(state, time);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateRelativeObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        newState: this._state,\n        first: true,\n        hasResult: false\n      };\n      return this._s.scheduleRecursiveFuture(state, 0, scheduleRecursive);\n    };\n\n    return GenerateRelativeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithRelativeTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return 500; }\n   *  );\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithRelativeTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new GenerateRelativeObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n  };\n\n  var DelaySubscription = (function(__super__) {\n    inherits(DelaySubscription, __super__);\n    function DelaySubscription(source, dt, s) {\n      this.source = source;\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    DelaySubscription.prototype.subscribeCore = function (o) {\n      var d = new SerialDisposable();\n\n      d.setDisposable(this._s.scheduleFuture([this.source, o, d], this._dt, scheduleMethod));\n\n      return d;\n    };\n\n    function scheduleMethod(s, state) {\n      var source = state[0], o = state[1], d = state[2];\n      d.setDisposable(source.subscribe(o));\n    }\n\n    return DelaySubscription;\n  }(ObservableBase));\n\n  /**\n   *  Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.delaySubscription(5000); // 5s\n   *  2 - res = source.delaySubscription(5000, Rx.Scheduler.default); // 5 seconds\n   *\n   * @param {Number} dueTime Relative or absolute time shift of the subscription.\n   * @param {Scheduler} [scheduler]  Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delaySubscription = function (dueTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new DelaySubscription(this, dueTime, scheduler);\n  };\n\n  var SkipLastWithTimeObservable = (function (__super__) {\n    inherits(SkipLastWithTimeObservable, __super__);\n    function SkipLastWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SkipLastWithTimeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipLastWithTimeObserver(o, this));\n    };\n\n    return SkipLastWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipLastWithTimeObserver = (function (__super__) {\n    inherits(SkipLastWithTimeObserver, __super__);\n\n    function SkipLastWithTimeObserver(o, p) {\n      this._o = o;\n      this._s = p._s;\n      this._d = p._d;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    SkipLastWithTimeObserver.prototype.next = function (x) {\n      var now = this._s.now();\n      this._q.push({ interval: now, value: x });\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._o.onNext(this._q.shift().value);\n      }\n    };\n    SkipLastWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipLastWithTimeObserver.prototype.completed = function () {\n      var now = this._s.now();\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._o.onNext(this._q.shift().value);\n      }\n      this._o.onCompleted();\n    };\n\n    return SkipLastWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for skipping elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence.\n   */\n  observableProto.skipLastWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipLastWithTimeObservable(this, duration, scheduler);\n  };\n\n  var TakeLastWithTimeObservable = (function (__super__) {\n    inherits(TakeLastWithTimeObservable, __super__);\n    function TakeLastWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TakeLastWithTimeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeLastWithTimeObserver(o, this._d, this._s));\n    };\n\n    return TakeLastWithTimeObservable;\n  }(ObservableBase));\n\n  var TakeLastWithTimeObserver = (function (__super__) {\n    inherits(TakeLastWithTimeObserver, __super__);\n\n    function TakeLastWithTimeObserver(o, d, s) {\n      this._o = o;\n      this._d = d;\n      this._s = s;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastWithTimeObserver.prototype.next = function (x) {\n      var now = this._s.now();\n      this._q.push({ interval: now, value: x });\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._q.shift();\n      }\n    };\n    TakeLastWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeLastWithTimeObserver.prototype.completed = function () {\n      var now = this._s.now();\n      while (this._q.length > 0) {\n        var next = this._q.shift();\n        if (now - next.interval <= this._d) { this._o.onNext(next.value); }\n      }\n      this._o.onCompleted();\n    };\n\n    return TakeLastWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TakeLastWithTimeObservable(this, duration, scheduler);\n  };\n\n  /**\n   *  Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastBufferWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        var now = scheduler.now();\n        q.push({ interval: now, value: x });\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          q.shift();\n        }\n      }, function (e) { o.onError(e); }, function () {\n        var now = scheduler.now(), res = [];\n        while (q.length > 0) {\n          var next = q.shift();\n          now - next.interval <= duration && res.push(next.value);\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  var TakeWithTimeObservable = (function (__super__) {\n    inherits(TakeWithTimeObservable, __super__);\n    function TakeWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, o) {\n      o.onCompleted();\n    }\n\n    TakeWithTimeObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(\n        this._s.scheduleFuture(o, this._d, scheduleMethod),\n        this.source.subscribe(o)\n      );\n    };\n\n    return TakeWithTimeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.takeWithTime(5000,  [optional scheduler]);\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence.\n   */\n  observableProto.takeWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TakeWithTimeObservable(this, duration, scheduler);\n  };\n\n  var SkipWithTimeObservable = (function (__super__) {\n    inherits(SkipWithTimeObservable, __super__);\n    function SkipWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      this._open = false;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, self) {\n      self._open = true;\n    }\n\n    SkipWithTimeObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(\n        this._s.scheduleFuture(this, this._d, scheduleMethod),\n        this.source.subscribe(new SkipWithTimeObserver(o, this))\n      );\n    };\n\n    return SkipWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipWithTimeObserver = (function (__super__) {\n    inherits(SkipWithTimeObserver, __super__);\n\n    function SkipWithTimeObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipWithTimeObserver.prototype.next = function (x) { this._p._open && this._o.onNext(x); };\n    SkipWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipWithTimeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence.\n   *  This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded\n   *  may not execute immediately, despite the zero due time.\n   *\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration.\n   * @param {Number} duration Duration for skipping elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence.\n   */\n  observableProto.skipWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipWithTimeObservable(this, duration, scheduler);\n  };\n\n  var SkipUntilWithTimeObservable = (function (__super__) {\n    inherits(SkipUntilWithTimeObservable, __super__);\n    function SkipUntilWithTimeObservable(source, startTime, scheduler) {\n      this.source = source;\n      this._st = startTime;\n      this._s = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, state) {\n      state._open = true;\n    }\n\n    SkipUntilWithTimeObservable.prototype.subscribeCore = function (o) {\n      this._open = false;\n      return new BinaryDisposable(\n        this._s.scheduleFuture(this, this._st, scheduleMethod),\n        this.source.subscribe(new SkipUntilWithTimeObserver(o, this))\n      );\n    };\n\n    return SkipUntilWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipUntilWithTimeObserver = (function (__super__) {\n    inherits(SkipUntilWithTimeObserver, __super__);\n\n    function SkipUntilWithTimeObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipUntilWithTimeObserver.prototype.next = function (x) { this._p._open && this._o.onNext(x); };\n    SkipUntilWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipUntilWithTimeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipUntilWithTimeObserver;\n  }(AbstractObserver));\n\n\n  /**\n   *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n   *\n   * @examples\n   *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n   *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n   * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n   */\n  observableProto.skipUntilWithTime = function (startTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipUntilWithTimeObservable(this, startTime, scheduler);\n  };\n\n  /**\n   *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n   * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n   * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n   */\n  observableProto.takeUntilWithTime = function (endTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return new BinaryDisposable(\n        scheduler.scheduleFuture(o, endTime, function (_, o) { o.onCompleted(); }),\n        source.subscribe(o));\n    }, source);\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite-time-compat/package.json",
    "content": "{\n  \"name\": \"rx-lite-time-compat\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Async\",\n  \"description\": \"Lightweight older browser compatible library with time-based functions for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.time.compat.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.time.compat.js\"\n  },\n  \"dependencies\": {\n    \"rx-lite-compat\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.time.compat.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-time-compat/readme.md",
    "content": "# RxJS Time Compat Module #\n\nThe Reactive Extensions for JavaScript, as it is a library that deals with events over time, naturally has a large number of operators that allow the creation of sequences at given timers, in addition to capturing time stamp and time interval information.  In addition, you can also check for timeouts on your operations.  This also supports windows and buffers with time. This requires `rx.lite.js` from the [`rx-lite`](https://www.npmjs.com/package/rx-lite) NPM module.  This module has support for older browsers which do not support ES5 functionality, hence the name `compat`.\n\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-time\n$ npm install -g rx-lite-time\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-time-compat');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.compat.js\"></script>\n<script src=\"path/to/rx.lite.time.compat.js\"></script>\n```\n\n## Included Observable Operators ##\n\n### `Observable Methods`\n- [`generateWithAbsoluteTime`](../../doc/api/core/operators/generatewithabsolutetime.md)\n- [`generateWithRelativeTime`](../../doc/api/core/operators/generatewithrelativetime.md)\n\n### `Observable Instance Methods`\n- [`bufferWithTime`](../../doc/api/core/operators/bufferwithtime.md)\n- [`bufferWithTimeOrCount`](../../doc/api/core/operators/bufferwithtimeorcount.md)\n- [`debounceWithSelector`](../../doc/api/core/operators/debouncewithselector.md)\n- [`delaySubscription`](../api/core/operators/delaysubscription.md)\n- [`skipLastWithTime`](../../doc/api/core/operators/skiplastwithtime.md)\n- [`takeLastBufferWithTime`](../../doc/api/core/operators/takelastbufferwithtime.md)\n- [`takeLastWithTime`](../../doc/api/core/operators/takelastwithtime.md)\n- [`throttle`](../../doc/api/core/operators/throttle.md)\n- [`throttleWithTimeout`](../../doc/api/core/operators/debounce.md)\n- [`timeInterval`](../../doc/api/core/operators/timeinterval.md)\n- [`timeoutWithSelector`](../../doc/api/core/operators/timeoutwithselector.md)\n- [`timestamp`](../../doc/api/core/operators/timestamp.md)\n- [`windowWithTime`](../../doc/api/core/operators/windowwithtime.md)\n- [`windowWithTimeOrCount`](../../doc/api/core/operators/windowwithtimeorcount.md)\n\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-time-compat/rx.lite.time.compat.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite.compat'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite-compat'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Refernces\n  var inherits = Rx.internals.inherits,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    ObservableBase = Rx.ObservableBase,\n    observableDefer = Observable.defer,\n    observableEmpty = Observable.empty,\n    observableNever = Observable.never,\n    observableThrow = Observable['throw'],\n    observableFromArray = Observable.fromArray,\n    defaultScheduler = Rx.Scheduler['default'],\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    Subject = Rx.Subject,\n    addRef = Rx.internals.addRef,\n    normalizeTime = Rx.Scheduler.normalize,\n    helpers = Rx.helpers,\n    isPromise = helpers.isPromise,\n    isFunction = helpers.isFunction,\n    isScheduler = Rx.Scheduler.isScheduler,\n    observableFromPromise = Observable.fromPromise;\n\n  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n   * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n   * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTime = observableProto.windowTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n    var source = this, timeShift;\n    timeShiftOrScheduler == null && (timeShift = timeSpan);\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    if (typeof timeShiftOrScheduler === 'number') {\n      timeShift = timeShiftOrScheduler;\n    } else if (isScheduler(timeShiftOrScheduler)) {\n      timeShift = timeSpan;\n      scheduler = timeShiftOrScheduler;\n    }\n    return new AnonymousObservable(function (observer) {\n      var groupDisposable,\n        nextShift = timeShift,\n        nextSpan = timeSpan,\n        q = [],\n        refCountDisposable,\n        timerD = new SerialDisposable(),\n        totalTime = 0;\n        groupDisposable = new CompositeDisposable(timerD),\n        refCountDisposable = new RefCountDisposable(groupDisposable);\n\n       function createTimer () {\n        var m = new SingleAssignmentDisposable(),\n          isSpan = false,\n          isShift = false;\n        timerD.setDisposable(m);\n        if (nextSpan === nextShift) {\n          isSpan = true;\n          isShift = true;\n        } else if (nextSpan < nextShift) {\n            isSpan = true;\n        } else {\n          isShift = true;\n        }\n        var newTotalTime = isSpan ? nextSpan : nextShift,\n          ts = newTotalTime - totalTime;\n        totalTime = newTotalTime;\n        if (isSpan) {\n          nextSpan += timeShift;\n        }\n        if (isShift) {\n          nextShift += timeShift;\n        }\n        m.setDisposable(scheduler.scheduleFuture(null, ts, function () {\n          if (isShift) {\n            var s = new Subject();\n            q.push(s);\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          isSpan && q.shift().onCompleted();\n          createTimer();\n        }));\n      };\n      q.push(new Subject());\n      observer.onNext(addRef(q[0], refCountDisposable));\n      createTimer();\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n        },\n        function (e) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed.\n   * @param {Number} timeSpan Maximum time length of a window.\n   * @param {Number} count Maximum element count of a window.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTimeOrCount = observableProto.windowTimeOrCount = function (timeSpan, count, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new AnonymousObservable(function (observer) {\n      var timerD = new SerialDisposable(),\n          groupDisposable = new CompositeDisposable(timerD),\n          refCountDisposable = new RefCountDisposable(groupDisposable),\n          n = 0,\n          windowId = 0,\n          s = new Subject();\n\n      function createTimer(id) {\n        var m = new SingleAssignmentDisposable();\n        timerD.setDisposable(m);\n        m.setDisposable(scheduler.scheduleFuture(null, timeSpan, function () {\n          if (id !== windowId) { return; }\n          n = 0;\n          var newId = ++windowId;\n          s.onCompleted();\n          s = new Subject();\n          observer.onNext(addRef(s, refCountDisposable));\n          createTimer(newId);\n        }));\n      }\n\n      observer.onNext(addRef(s, refCountDisposable));\n      createTimer(0);\n\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          var newId = 0, newWindow = false;\n          s.onNext(x);\n          if (++n === count) {\n            newWindow = true;\n            n = 0;\n            newId = ++windowId;\n            s.onCompleted();\n            s = new Subject();\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          newWindow && createTimer(newId);\n        },\n        function (e) {\n          s.onError(e);\n          observer.onError(e);\n        }, function () {\n          s.onCompleted();\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n   * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n   * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n   * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithTime = observableProto.bufferTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n    return this.windowWithTime(timeSpan, timeShiftOrScheduler, scheduler).flatMap(toArray);\n  };\n\n  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed.\n   * @param {Number} timeSpan Maximum time length of a buffer.\n   * @param {Number} count Maximum element count of a buffer.\n   * @param {Scheduler} [scheduler]  Scheduler to run bufferin timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithTimeOrCount = observableProto.bufferTimeOrCount = function (timeSpan, count, scheduler) {\n    return this.windowWithTimeOrCount(timeSpan, count, scheduler).flatMap(toArray);\n  };\n\n  var TimeIntervalObservable = (function (__super__) {\n    inherits(TimeIntervalObservable, __super__);\n    function TimeIntervalObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimeIntervalObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TimeIntervalObserver(o, this._s));\n    };\n\n    return TimeIntervalObservable;\n  }(ObservableBase));\n\n  var TimeIntervalObserver = (function (__super__) {\n    inherits(TimeIntervalObserver, __super__);\n\n    function TimeIntervalObserver(o, s) {\n      this._o = o;\n      this._s = s;\n      this._l = s.now();\n      __super__.call(this);\n    }\n\n    TimeIntervalObserver.prototype.next = function (x) {\n      var now = this._s.now(), span = now - this._l;\n      this._l = now;\n      this._o.onNext({ value: x, interval: span });\n    };\n    TimeIntervalObserver.prototype.error = function (e) { this._o.onError(e); };\n    TimeIntervalObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TimeIntervalObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Records the time interval between consecutive values in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timeInterval();\n   *  2 - res = source.timeInterval(Rx.Scheduler.timeout);\n   *\n   * @param [scheduler]  Scheduler used to compute time intervals. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence with time interval information on values.\n   */\n  observableProto.timeInterval = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TimeIntervalObservable(this, scheduler);\n  };\n\n  var GenerateAbsoluteObservable = (function (__super__) {\n    inherits(GenerateAbsoluteObservable, __super__);\n    function GenerateAbsoluteObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n      this._state = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._timeFn = timeFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      state.hasResult && state.o.onNext(state.result);\n\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n      state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (state.hasResult === errorObj) { return state.o.onError(state.hasResult.e); }\n      if (state.hasResult) {\n        state.result = tryCatch(state.self._resFn)(state.newState);\n        if (state.result === errorObj) { return state.o.onError(state.result.e); }\n        var time = tryCatch(state.self._timeFn)(state.newState);\n        if (time === errorObj) { return state.o.onError(time.e); }\n        recurse(state, time);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateAbsoluteObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        newState: this._state,\n        first: true,\n        hasResult: false\n      };\n      return this._s.scheduleRecursiveFuture(state, new Date(this._s.now()), scheduleRecursive);\n    };\n\n    return GenerateAbsoluteObservable;\n  }(ObservableBase));\n\n  /**\n   *  GenerateAbsolutes an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithAbsoluteTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return new Date(); }\n   *  });\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning Date values.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithAbsoluteTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new GenerateAbsoluteObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n  };\n\n  var GenerateRelativeObservable = (function (__super__) {\n    inherits(GenerateRelativeObservable, __super__);\n    function GenerateRelativeObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n      this._state = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._timeFn = timeFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      state.hasResult && state.o.onNext(state.result);\n\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n\n      state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (state.hasResult === errorObj) { return state.o.onError(state.hasResult.e); }\n      if (state.hasResult) {\n        state.result = tryCatch(state.self._resFn)(state.newState);\n        if (state.result === errorObj) { return state.o.onError(state.result.e); }\n        var time = tryCatch(state.self._timeFn)(state.newState);\n        if (time === errorObj) { return state.o.onError(time.e); }\n        recurse(state, time);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateRelativeObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        newState: this._state,\n        first: true,\n        hasResult: false\n      };\n      return this._s.scheduleRecursiveFuture(state, 0, scheduleRecursive);\n    };\n\n    return GenerateRelativeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithRelativeTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return 500; }\n   *  );\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithRelativeTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new GenerateRelativeObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n  };\n\n  var DelaySubscription = (function(__super__) {\n    inherits(DelaySubscription, __super__);\n    function DelaySubscription(source, dt, s) {\n      this.source = source;\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    DelaySubscription.prototype.subscribeCore = function (o) {\n      var d = new SerialDisposable();\n\n      d.setDisposable(this._s.scheduleFuture([this.source, o, d], this._dt, scheduleMethod));\n\n      return d;\n    };\n\n    function scheduleMethod(s, state) {\n      var source = state[0], o = state[1], d = state[2];\n      d.setDisposable(source.subscribe(o));\n    }\n\n    return DelaySubscription;\n  }(ObservableBase));\n\n  /**\n   *  Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.delaySubscription(5000); // 5s\n   *  2 - res = source.delaySubscription(5000, Rx.Scheduler.default); // 5 seconds\n   *\n   * @param {Number} dueTime Relative or absolute time shift of the subscription.\n   * @param {Scheduler} [scheduler]  Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delaySubscription = function (dueTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new DelaySubscription(this, dueTime, scheduler);\n  };\n\n  var SkipLastWithTimeObservable = (function (__super__) {\n    inherits(SkipLastWithTimeObservable, __super__);\n    function SkipLastWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SkipLastWithTimeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipLastWithTimeObserver(o, this));\n    };\n\n    return SkipLastWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipLastWithTimeObserver = (function (__super__) {\n    inherits(SkipLastWithTimeObserver, __super__);\n\n    function SkipLastWithTimeObserver(o, p) {\n      this._o = o;\n      this._s = p._s;\n      this._d = p._d;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    SkipLastWithTimeObserver.prototype.next = function (x) {\n      var now = this._s.now();\n      this._q.push({ interval: now, value: x });\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._o.onNext(this._q.shift().value);\n      }\n    };\n    SkipLastWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipLastWithTimeObserver.prototype.completed = function () {\n      var now = this._s.now();\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._o.onNext(this._q.shift().value);\n      }\n      this._o.onCompleted();\n    };\n\n    return SkipLastWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for skipping elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence.\n   */\n  observableProto.skipLastWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipLastWithTimeObservable(this, duration, scheduler);\n  };\n\n  var TakeLastWithTimeObservable = (function (__super__) {\n    inherits(TakeLastWithTimeObservable, __super__);\n    function TakeLastWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TakeLastWithTimeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeLastWithTimeObserver(o, this._d, this._s));\n    };\n\n    return TakeLastWithTimeObservable;\n  }(ObservableBase));\n\n  var TakeLastWithTimeObserver = (function (__super__) {\n    inherits(TakeLastWithTimeObserver, __super__);\n\n    function TakeLastWithTimeObserver(o, d, s) {\n      this._o = o;\n      this._d = d;\n      this._s = s;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastWithTimeObserver.prototype.next = function (x) {\n      var now = this._s.now();\n      this._q.push({ interval: now, value: x });\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._q.shift();\n      }\n    };\n    TakeLastWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeLastWithTimeObserver.prototype.completed = function () {\n      var now = this._s.now();\n      while (this._q.length > 0) {\n        var next = this._q.shift();\n        if (now - next.interval <= this._d) { this._o.onNext(next.value); }\n      }\n      this._o.onCompleted();\n    };\n\n    return TakeLastWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TakeLastWithTimeObservable(this, duration, scheduler);\n  };\n\n  /**\n   *  Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastBufferWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        var now = scheduler.now();\n        q.push({ interval: now, value: x });\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          q.shift();\n        }\n      }, function (e) { o.onError(e); }, function () {\n        var now = scheduler.now(), res = [];\n        while (q.length > 0) {\n          var next = q.shift();\n          now - next.interval <= duration && res.push(next.value);\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  var TakeWithTimeObservable = (function (__super__) {\n    inherits(TakeWithTimeObservable, __super__);\n    function TakeWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, o) {\n      o.onCompleted();\n    }\n\n    TakeWithTimeObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(\n        this._s.scheduleFuture(o, this._d, scheduleMethod),\n        this.source.subscribe(o)\n      );\n    };\n\n    return TakeWithTimeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.takeWithTime(5000,  [optional scheduler]);\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence.\n   */\n  observableProto.takeWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TakeWithTimeObservable(this, duration, scheduler);\n  };\n\n  var SkipWithTimeObservable = (function (__super__) {\n    inherits(SkipWithTimeObservable, __super__);\n    function SkipWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      this._open = false;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, self) {\n      self._open = true;\n    }\n\n    SkipWithTimeObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(\n        this._s.scheduleFuture(this, this._d, scheduleMethod),\n        this.source.subscribe(new SkipWithTimeObserver(o, this))\n      );\n    };\n\n    return SkipWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipWithTimeObserver = (function (__super__) {\n    inherits(SkipWithTimeObserver, __super__);\n\n    function SkipWithTimeObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipWithTimeObserver.prototype.next = function (x) { this._p._open && this._o.onNext(x); };\n    SkipWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipWithTimeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence.\n   *  This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded\n   *  may not execute immediately, despite the zero due time.\n   *\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration.\n   * @param {Number} duration Duration for skipping elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence.\n   */\n  observableProto.skipWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipWithTimeObservable(this, duration, scheduler);\n  };\n\n  var SkipUntilWithTimeObservable = (function (__super__) {\n    inherits(SkipUntilWithTimeObservable, __super__);\n    function SkipUntilWithTimeObservable(source, startTime, scheduler) {\n      this.source = source;\n      this._st = startTime;\n      this._s = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, state) {\n      state._open = true;\n    }\n\n    SkipUntilWithTimeObservable.prototype.subscribeCore = function (o) {\n      this._open = false;\n      return new BinaryDisposable(\n        this._s.scheduleFuture(this, this._st, scheduleMethod),\n        this.source.subscribe(new SkipUntilWithTimeObserver(o, this))\n      );\n    };\n\n    return SkipUntilWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipUntilWithTimeObserver = (function (__super__) {\n    inherits(SkipUntilWithTimeObserver, __super__);\n\n    function SkipUntilWithTimeObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipUntilWithTimeObserver.prototype.next = function (x) { this._p._open && this._o.onNext(x); };\n    SkipUntilWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipUntilWithTimeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipUntilWithTimeObserver;\n  }(AbstractObserver));\n\n\n  /**\n   *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n   *\n   * @examples\n   *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n   *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n   * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n   */\n  observableProto.skipUntilWithTime = function (startTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipUntilWithTimeObservable(this, startTime, scheduler);\n  };\n\n  /**\n   *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n   * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n   * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n   */\n  observableProto.takeUntilWithTime = function (endTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return new BinaryDisposable(\n        scheduler.scheduleFuture(o, endTime, function (_, o) { o.onCompleted(); }),\n        source.subscribe(o));\n    }, source);\n  };\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite-virtualtime/package.json",
    "content": "{\n  \"name\": \"rx-lite-virtualtime\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Async\",\n  \"description\": \"Lightweight library with virtual time functions for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.virtualtime.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.virtualtime.js\"\n  },\n  \"dependencies\": {\n    \"rx-lite\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.virtualtime.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-virtualtime/readme.md",
    "content": "# RxJS Virtual Time Module #\n\nThe Reactive Extensions for JavaScript supports a notion of virtual time, which allows you to mock time easily, or even run through historical data through the `HistoricalScheduler`. This requires `rx.lite.js` from the [`rx-lite`](https://www.npmjs.com/package/rx-lite) NPM module.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-virtualtime\n$ npm install -g rx-lite-virtualtime\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-virtualtime');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.js\"></script>\n<script src=\"path/to/rx.lite.virtualtime.js\"></script>\n```\n\n## Included Classes ##\n\n### Schedulers\n\n- [`Rx.HistoricalScheduler`](../../doc/api/schedulers/historicalscheduler.md)\n- [`Rx.VirtualTimeScheduler`](../../doc/api/schedulers/virtualtimescheduler.md)\n\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-virtualtime/rx.lite.virtualtime.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Aliases\n  var Scheduler = Rx.Scheduler,\n    ScheduledItem = Rx.internals.ScheduledItem,\n    SchedulePeriodicRecursive  = Rx.internals.SchedulePeriodicRecursive,\n    PriorityQueue = Rx.internals.PriorityQueue,\n    inherits = Rx.internals.inherits,\n    defaultSubComparer = Rx.helpers.defaultSubComparer,\n    notImplemented = Rx.helpers.notImplemented;\n\n  /** Provides a set of extension methods for virtual time scheduling. */\n  var VirtualTimeScheduler = Rx.VirtualTimeScheduler = (function (__super__) {\n    inherits(VirtualTimeScheduler, __super__);\n\n    /**\n     * Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer.\n     *\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function VirtualTimeScheduler(initialClock, comparer) {\n      this.clock = initialClock;\n      this.comparer = comparer;\n      this.isEnabled = false;\n      this.queue = new PriorityQueue(1024);\n      __super__.call(this);\n    }\n\n    var VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype;\n\n    VirtualTimeSchedulerPrototype.now = function () {\n      return this.toAbsoluteTime(this.clock);\n    };\n\n    VirtualTimeSchedulerPrototype.schedule = function (state, action) {\n      return this.scheduleAbsolute(state, this.clock, action);\n    };\n\n    VirtualTimeSchedulerPrototype.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime instanceof Date ?\n        this.toRelativeTime(dueTime - this.now()) :\n        this.toRelativeTime(dueTime);\n\n      return this.scheduleRelative(state, dt, action);\n    };\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    VirtualTimeSchedulerPrototype.add = notImplemented;\n\n    /**\n     * Converts an absolute time to a number\n     * @param {Any} The absolute time.\n     * @returns {Number} The absolute time in ms\n     */\n    VirtualTimeSchedulerPrototype.toAbsoluteTime = notImplemented;\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    VirtualTimeSchedulerPrototype.toRelativeTime = notImplemented;\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be emulated using recursive scheduling.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.schedulePeriodic = function (state, period, action) {\n      var s = new SchedulePeriodicRecursive(this, state, period, action);\n      return s.start();\n    };\n\n    /**\n     * Schedules an action to be executed after dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleRelative = function (state, dueTime, action) {\n      var runAt = this.add(this.clock, dueTime);\n      return this.scheduleAbsolute(state, runAt, action);\n    };\n\n    /**\n     * Starts the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.start = function () {\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n      }\n    };\n\n    /**\n     * Stops the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.stop = function () {\n      this.isEnabled = false;\n    };\n\n    /**\n     * Advances the scheduler's clock to the specified time, running all work till that point.\n     * @param {Number} time Absolute time to advance the scheduler's clock to.\n     */\n    VirtualTimeSchedulerPrototype.advanceTo = function (time) {\n      var dueToClock = this.comparer(this.clock, time);\n      if (this.comparer(this.clock, time) > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) { return; }\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null && this.comparer(next.dueTime, time) <= 0) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n        this.clock = time;\n      }\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.advanceBy = function (time) {\n      var dt = this.add(this.clock, time),\n          dueToClock = this.comparer(this.clock, dt);\n      if (dueToClock > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) {  return; }\n\n      this.advanceTo(dt);\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.sleep = function (time) {\n      var dt = this.add(this.clock, time);\n      if (this.comparer(this.clock, dt) >= 0) { throw new ArgumentOutOfRangeError(); }\n\n      this.clock = dt;\n    };\n\n    /**\n     * Gets the next scheduled item to be executed.\n     * @returns {ScheduledItem} The next scheduled item.\n     */\n    VirtualTimeSchedulerPrototype.getNext = function () {\n      while (this.queue.length > 0) {\n        var next = this.queue.peek();\n        if (next.isCancelled()) {\n          this.queue.dequeue();\n        } else {\n          return next;\n        }\n      }\n      return null;\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleAbsolute = function (state, dueTime, action) {\n      var self = this;\n\n      function run(scheduler, state1) {\n        self.queue.remove(si);\n        return action(scheduler, state1);\n      }\n\n      var si = new ScheduledItem(this, state, run, dueTime, this.comparer);\n      this.queue.enqueue(si);\n\n      return si.disposable;\n    };\n\n    return VirtualTimeScheduler;\n  }(Scheduler));\n\n  /** Provides a virtual time scheduler that uses Date for absolute time and number for relative time. */\n  Rx.HistoricalScheduler = (function (__super__) {\n    inherits(HistoricalScheduler, __super__);\n\n    /**\n     * Creates a new historical scheduler with the specified initial clock value.\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function HistoricalScheduler(initialClock, comparer) {\n      var clock = initialClock == null ? 0 : initialClock;\n      var cmp = comparer || defaultSubComparer;\n      __super__.call(this, clock, cmp);\n    }\n\n    var HistoricalSchedulerProto = HistoricalScheduler.prototype;\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    HistoricalSchedulerProto.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n\n    HistoricalSchedulerProto.toAbsoluteTime = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @memberOf HistoricalScheduler\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    HistoricalSchedulerProto.toRelativeTime = function (timeSpan) {\n      return timeSpan;\n    };\n\n    return HistoricalScheduler;\n  }(Rx.VirtualTimeScheduler));\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/rx-lite-virtualtime-compat/package.json",
    "content": "{\n  \"name\": \"rx-lite-virtualtime-compat\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS) Async\",\n  \"description\": \"Lightweight older browser compatible library with virtual time functions for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"licenses\": [\n    {\n      \"type\": \"Apache License, Version 2.0\",\n      \"url\": \"http://www.apache.org/licenses/LICENSE-2.0.html\"\n    }\n  ],\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"rx.lite.virtualtime.compat.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"rx.lite.virtualtime.compat.js\"\n  },\n  \"dependencies\": {\n    \"rx-lite-compat\": \"*\"\n  },\n  \"devDependencies\": {},\n  \"keywords\": [\n    \"React\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"rx.lite.virtualtime.compat.js\"\n}\n"
  },
  {
    "path": "modules/rx-lite-virtualtime-compat/readme.md",
    "content": "# RxJS Virtual Time Compat Module #\n\nThe Reactive Extensions for JavaScript supports a notion of virtual time, which allows you to mock time easily, or even run through historical data through the `HistoricalScheduler`. This requires `rx.lite.js` from the [`rx-lite`](https://www.npmjs.com/package/rx-lite) NPM module.  This module has support for older browsers which do not support ES5 functionality, hence the name `compat`.\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Installing with [NPM](https://npmjs.org/)\n\n```bash`\n$ npm install rx-lite-virtualtime-compat\n$ npm install -g rx-lite-virtualtime-compat\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx-lite-virtualtime-compat');\n```\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"path/to/rx.lite.compat.js\"></script>\n<script src=\"path/to/rx.lite.virtualtime.compat.js\"></script>\n```\n\n## Included Classes ##\n\n### Schedulers\n\n- [`Rx.HistoricalScheduler`](../../doc/api/schedulers/historicalscheduler.md)\n- [`Rx.VirtualTimeScheduler`](../../doc/api/schedulers/virtualtimescheduler.md)\n\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "modules/rx-lite-virtualtime-compat/rx.lite.virtualtime.compat.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite.compat'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite-compat'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Aliases\n  var Scheduler = Rx.Scheduler,\n    ScheduledItem = Rx.internals.ScheduledItem,\n    SchedulePeriodicRecursive  = Rx.internals.SchedulePeriodicRecursive,\n    PriorityQueue = Rx.internals.PriorityQueue,\n    inherits = Rx.internals.inherits,\n    defaultSubComparer = Rx.helpers.defaultSubComparer,\n    notImplemented = Rx.helpers.notImplemented;\n\n  /** Provides a set of extension methods for virtual time scheduling. */\n  var VirtualTimeScheduler = Rx.VirtualTimeScheduler = (function (__super__) {\n    inherits(VirtualTimeScheduler, __super__);\n\n    /**\n     * Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer.\n     *\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function VirtualTimeScheduler(initialClock, comparer) {\n      this.clock = initialClock;\n      this.comparer = comparer;\n      this.isEnabled = false;\n      this.queue = new PriorityQueue(1024);\n      __super__.call(this);\n    }\n\n    var VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype;\n\n    VirtualTimeSchedulerPrototype.now = function () {\n      return this.toAbsoluteTime(this.clock);\n    };\n\n    VirtualTimeSchedulerPrototype.schedule = function (state, action) {\n      return this.scheduleAbsolute(state, this.clock, action);\n    };\n\n    VirtualTimeSchedulerPrototype.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime instanceof Date ?\n        this.toRelativeTime(dueTime - this.now()) :\n        this.toRelativeTime(dueTime);\n\n      return this.scheduleRelative(state, dt, action);\n    };\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    VirtualTimeSchedulerPrototype.add = notImplemented;\n\n    /**\n     * Converts an absolute time to a number\n     * @param {Any} The absolute time.\n     * @returns {Number} The absolute time in ms\n     */\n    VirtualTimeSchedulerPrototype.toAbsoluteTime = notImplemented;\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    VirtualTimeSchedulerPrototype.toRelativeTime = notImplemented;\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be emulated using recursive scheduling.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.schedulePeriodic = function (state, period, action) {\n      var s = new SchedulePeriodicRecursive(this, state, period, action);\n      return s.start();\n    };\n\n    /**\n     * Schedules an action to be executed after dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleRelative = function (state, dueTime, action) {\n      var runAt = this.add(this.clock, dueTime);\n      return this.scheduleAbsolute(state, runAt, action);\n    };\n\n    /**\n     * Starts the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.start = function () {\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n      }\n    };\n\n    /**\n     * Stops the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.stop = function () {\n      this.isEnabled = false;\n    };\n\n    /**\n     * Advances the scheduler's clock to the specified time, running all work till that point.\n     * @param {Number} time Absolute time to advance the scheduler's clock to.\n     */\n    VirtualTimeSchedulerPrototype.advanceTo = function (time) {\n      var dueToClock = this.comparer(this.clock, time);\n      if (this.comparer(this.clock, time) > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) { return; }\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null && this.comparer(next.dueTime, time) <= 0) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n        this.clock = time;\n      }\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.advanceBy = function (time) {\n      var dt = this.add(this.clock, time),\n          dueToClock = this.comparer(this.clock, dt);\n      if (dueToClock > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) {  return; }\n\n      this.advanceTo(dt);\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.sleep = function (time) {\n      var dt = this.add(this.clock, time);\n      if (this.comparer(this.clock, dt) >= 0) { throw new ArgumentOutOfRangeError(); }\n\n      this.clock = dt;\n    };\n\n    /**\n     * Gets the next scheduled item to be executed.\n     * @returns {ScheduledItem} The next scheduled item.\n     */\n    VirtualTimeSchedulerPrototype.getNext = function () {\n      while (this.queue.length > 0) {\n        var next = this.queue.peek();\n        if (next.isCancelled()) {\n          this.queue.dequeue();\n        } else {\n          return next;\n        }\n      }\n      return null;\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleAbsolute = function (state, dueTime, action) {\n      var self = this;\n\n      function run(scheduler, state1) {\n        self.queue.remove(si);\n        return action(scheduler, state1);\n      }\n\n      var si = new ScheduledItem(this, state, run, dueTime, this.comparer);\n      this.queue.enqueue(si);\n\n      return si.disposable;\n    };\n\n    return VirtualTimeScheduler;\n  }(Scheduler));\n\n  /** Provides a virtual time scheduler that uses Date for absolute time and number for relative time. */\n  Rx.HistoricalScheduler = (function (__super__) {\n    inherits(HistoricalScheduler, __super__);\n\n    /**\n     * Creates a new historical scheduler with the specified initial clock value.\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function HistoricalScheduler(initialClock, comparer) {\n      var clock = initialClock == null ? 0 : initialClock;\n      var cmp = comparer || defaultSubComparer;\n      __super__.call(this, clock, cmp);\n    }\n\n    var HistoricalSchedulerProto = HistoricalScheduler.prototype;\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    HistoricalSchedulerProto.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n\n    HistoricalSchedulerProto.toAbsoluteTime = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @memberOf HistoricalScheduler\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    HistoricalSchedulerProto.toRelativeTime = function (timeSpan) {\n      return timeSpan;\n    };\n\n    return HistoricalScheduler;\n  }(Rx.VirtualTimeScheduler));\n\n  return Rx;\n}));\n"
  },
  {
    "path": "modules/version.js",
    "content": "var fs = require('fs');\nvar execSync = require('child_process').execSync;\n\nvar files = fs.readdirSync(process.cwd());\nfor (var i = 0; i < files.length; i++) {\n  var file = files[i];\n  var stat = fs.statSync(file);\n  if (stat.isDirectory()) {\n    console.log('versioning %s', file);\n    execSync('cd '+ file + ' && npm version '+ process.argv[2] + ' && cd ..');\n    console.log('versioned %s', file);\n  }\n}\n"
  },
  {
    "path": "nuget/RxJS-Aggregates/RxJS-Aggregates.nuspec",
    "content": "<?xml version=\"1.0\"?>\n<package>\n  <metadata>\n    <id>RxJS-Aggregates</id>\n    <title>Reactive Extensions for JavaScript - Aggregation Operations</title>\n    <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n    <version>$version$</version>\n    <authors>Microsoft Corporation</authors>\n    <description>Reactive Extensions for JavaScript library with aggregation event processing query operations.</description>\n    <projectUrl>http://rx.codeplex.com</projectUrl>\n    <iconUrl>http://go.microsoft.com/fwlink/?LinkId=261274</iconUrl>\n    <requireLicenseAcceptance>true</requireLicenseAcceptance>\n    <licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>\n    <language>en-US</language>\n    <tags>Rx RxJS Reactive Extensions Observable</tags>\n    <dependencies>\n      <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n      <dependency id=\"RxJS-Main\" version=\"$version$\" />\n    </dependencies>\n  </metadata>\n  <files>\n    <file src=\"..\\..\\dist\\rx.aggregates.js\" target=\"content\\Scripts\\rx.aggregates.js\" />\n    <file src=\"..\\..\\dist\\rx.aggregates.min.js\" target=\"content\\Scripts\\rx.aggregates.min.js\" />\n    <file src=\"..\\..\\ts\\rx.aggregates.d.ts\" target=\"content\\Scripts\\rx.aggregates.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.aggregates.es6.d.ts\" target=\"content\\Scripts\\rx.aggregates.es6.d.ts\" />\n  </files>\n</package>\n"
  },
  {
    "path": "nuget/RxJS-All/RxJS-All.nuspec",
    "content": "<?xml version=\"1.0\"?>\n<package>\n  <metadata>\n    <id>RxJS-All</id>\n    <title>Reactive Extensions for JavaScript - All Libraries</title>\n    <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n    <version>$version$</version>\n    <authors>Microsoft Corporation</authors>\n    <description>Reactive Extensions for JavaScript libraries.</description>\n    <projectUrl>http://rx.codeplex.com</projectUrl>\n    <iconUrl>http://go.microsoft.com/fwlink/?LinkId=261274</iconUrl>\n    <requireLicenseAcceptance>true</requireLicenseAcceptance>\n    <licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>\n    <language>en-US</language>\n    <tags>Rx RxJS Reactive Extensions Observable</tags>\n    <dependencies>\n      <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n      <dependency id=\"RxJS-Main\" version=\"$version$\" />\n      <dependency id=\"RxJS-Aggregates\" version=\"$version$\" />\n      <dependency id=\"RxJS-Binding\" version=\"$version$\" />\n      <dependency id=\"RxJS-Coincidence\" version=\"$version$\" />\n      <dependency id=\"RxJS-JoinPatterns\" version=\"$version$\" />\n      <dependency id=\"RxJS-Time\" version=\"$version$\" />\n      <dependency id=\"RxJS-Experimental\" version=\"$version$\" />\n      <dependency id=\"RxJS-Testing\" version=\"$version$\" />\n      <dependency id=\"RxJS-VirtualTime\" version=\"$version$\" />\n    </dependencies>\n  </metadata>\n  <files>\n    <file src=\"..\\..\\dist\\rx.all.js\" target=\"content\\Scripts\\rx.all.js\" />\n    <file src=\"..\\..\\dist\\rx.all.compat.js\" target=\"content\\Scripts\\rx.all.compat.js\" />\n    <file src=\"..\\..\\ts\\rx.all.d.ts\" target=\"content\\Scripts\\rx.all.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.all.es6.d.ts\" target=\"content\\Scripts\\rx.all.es6.d.ts\" />\n  </files>\n</package>\n"
  },
  {
    "path": "nuget/RxJS-Async/RxJS-Async.nuspec",
    "content": "<?xml version=\"1.0\"?>\n<package>\n  <metadata>\n    <id>RxJS-Async</id>\n    <title>Reactive Extensions for JavaScript - Async-Based Operations</title>\n    <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n    <version>$version$</version>\n    <authors>Microsoft Corporation</authors>\n    <description>Reactive Extensions for JavaScript library with async-based event processing query operations.</description>\n    <projectUrl>http://go.microsoft.com/fwlink/?LinkID=179929</projectUrl>\n    <iconUrl>http://go.microsoft.com/fwlink/?LinkId=261274</iconUrl>\n    <requireLicenseAcceptance>true</requireLicenseAcceptance>\n    <licenseUrl>http://go.microsoft.com/fwlink/?LinkID=265024</licenseUrl>\n    <language>en-US</language>\n    <tags>Rx RxJS Reactive Extensions Observable</tags>\n    <dependencies>\n      <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n      <dependency id=\"RxJS-Main\" version=\"$version$\" />\n      <dependency id=\"RxJS-Binding\" version=\"$version$\" />\n    </dependencies>\n  </metadata>\n  <files>\n    <file src=\"..\\..\\dist\\rx.async.js\" target=\"content\\Scripts\\rx.async.js\" />\n    <file src=\"..\\..\\dist\\rx.async.min.js\" target=\"content\\Scripts\\rx.async.min.js\" />\n    <file src=\"..\\..\\dist\\rx.async.compat.js\" target=\"content\\Scripts\\rx.async.compat.js\" />\n    <file src=\"..\\..\\dist\\rx.async.compat.min.js\" target=\"content\\Scripts\\rx.async.compat.min.js\" />\n    <file src=\"..\\..\\ts\\rx.async.d.ts\" target=\"content\\Scripts\\rx.async.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.async.es6.d.ts\" target=\"content\\Scripts\\rx.async.es6.d.ts\" />\n  </files>\n</package>\n"
  },
  {
    "path": "nuget/RxJS-BackPressure/RxJS-BackPressure.nuspec",
    "content": "<?xml version=\"1.0\"?>\n<package>\n  <metadata>\n    <id>RxJS-BackPressure</id>\n    <title>Reactive Extensions for JavaScript - BackPressure-Based Operations</title>\n    <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n    <version>$version$</version>\n    <authors>Microsoft Corporation</authors>\n    <description>Reactive Extensions for JavaScript library with async-based event processing query operations.</description>\n    <projectUrl>http://go.microsoft.com/fwlink/?LinkID=179929</projectUrl>\n    <iconUrl>http://go.microsoft.com/fwlink/?LinkId=261274</iconUrl>\n    <requireLicenseAcceptance>true</requireLicenseAcceptance>\n    <licenseUrl>http://go.microsoft.com/fwlink/?LinkID=265024</licenseUrl>\n    <language>en-US</language>\n    <tags>Rx RxJS Reactive Extensions Observable</tags>\n    <dependencies>\n      <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n      <dependency id=\"RxJS-Main\" version=\"$version$\" />\n      <dependency id=\"RxJS-Lite\" version=\"$version$\" />\n    </dependencies>\n  </metadata>\n  <files>\n    <file src=\"..\\..\\dist\\rx.backpressure.js\" target=\"content\\Scripts\\rx.backpressure.js\" />\n    <file src=\"..\\..\\dist\\rx.backpressure.min.js\" target=\"content\\Scripts\\rx.backpressure.min.js\" />\n    <file src=\"..\\..\\ts\\rx.backpressure.d.ts\" target=\"content\\Scripts\\rx.backpressure.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.backpressure.es6.d.ts\" target=\"content\\Scripts\\rx.backpressure.es6.d.ts\" />\n  </files>\n</package>\n"
  },
  {
    "path": "nuget/RxJS-Binding/RxJS-Binding.nuspec",
    "content": "<?xml version=\"1.0\"?>\n<package>\n  <metadata>\n    <id>RxJS-Binding</id>\n    <title>Reactive Extensions for JavaScript - Binding</title>\n    <version>$version$</version>\n    <authors>Microsoft Corporation</authors>\n    <description>Reactive Extensions for JavaScript library with binding operationrs.</description>\n    <projectUrl>http://rx.codeplex.com</projectUrl>\n    <iconUrl>http://go.microsoft.com/fwlink/?LinkId=261274</iconUrl>\n    <requireLicenseAcceptance>true</requireLicenseAcceptance>\n    <licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>\n    <language>en-US</language>\n    <tags>Rx RxJS Reactive Extensions Observable</tags>\n    <dependencies>\n      <dependency id=\"RxJS-Main\" version=\"$version$\" />\n    </dependencies>\n  </metadata>\n  <files>\n    <file src=\"..\\..\\dist\\rx.binding.js\" target=\"content\\Scripts\\rx.binding.js\" />\n    <file src=\"..\\..\\dist\\rx.binding.min.js\" target=\"content\\Scripts\\rx.binding.min.js\" />\n    <file src=\"..\\..\\ts\\rx.binding.d.ts\" target=\"content\\Scripts\\rx.binding.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.binding.es6.d.ts\" target=\"content\\Scripts\\rx.binding.es6.d.ts\" />\n  </files>\n</package>\n"
  },
  {
    "path": "nuget/RxJS-Coincidence/RxJS-Coincidence.nuspec",
    "content": "<?xml version=\"1.0\"?>\n<package>\n  <metadata>\n    <id>RxJS-Coincidence</id>\n    <title>Reactive Extensions for JavaScript - Coincidence</title>\n    <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n    <version>$version$</version>\n    <authors>Microsoft Corporation</authors>\n    <description>Reactive Extensions for JavaScript library with reactive coincidence join event processing query operations.</description>\n    <projectUrl>http://rx.codeplex.com</projectUrl>\n    <iconUrl>http://go.microsoft.com/fwlink/?LinkId=261274</iconUrl>\n    <requireLicenseAcceptance>true</requireLicenseAcceptance>\n    <licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>\n    <language>en-US</language>\n    <tags>Rx RxJS Reactive Extensions Observable</tags>\n    <dependencies>\n      <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n      <dependency id=\"RxJS-Main\" version=\"$version$\" />\n    </dependencies>\n  </metadata>\n  <files>\n    <file src=\"..\\..\\dist\\rx.coincidence.js\" target=\"content\\Scripts\\rx.coincidence.js\" />\n    <file src=\"..\\..\\dist\\rx.coincidence.min.js\" target=\"content\\Scripts\\rx.coincidence.min.js\" />\n    <file src=\"..\\..\\ts\\rx.coincidence.d.ts\" target=\"content\\Scripts\\rx.coincidence.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.coincidence.es6.d.ts\" target=\"content\\Scripts\\rx.coincidence.es6.d.ts\" />\n  </files>\n</package>\n"
  },
  {
    "path": "nuget/RxJS-Complete/RxJS-Complete.nuspec",
    "content": "﻿<?xml version=\"1.0\"?>\n<package>\n  <metadata>\n    <id>RxJS-Main</id>\n    <title>Reactive Extensions for JavaScript - Main Library</title>\n    <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n    <version>$version$</version>\n    <authors>Microsoft Corporation</authors>\n    <description>Reactive Extensions for JavaScript main library used to express complex event processing queries over observable sequences.</description>\n    <projectUrl>http://rx.codeplex.com</projectUrl>\n    <iconUrl>http://go.microsoft.com/fwlink/?LinkId=261274</iconUrl>\n    <requireLicenseAcceptance>true</requireLicenseAcceptance>\n    <licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>\n    <language>en-US</language>\n    <tags>Rx RxJS Reactive Extensions Observable</tags>\n  </metadata>\n  <files>\n    <file src=\"..\\..\\dist\\rx.all.js\" target=\"content\\Scripts\\rx.all.js\" />\n    <file src=\"..\\..\\dist\\rx.all.min.js\" target=\"content\\Scripts\\rx.all.min.js\" />\n    <file src=\"..\\..\\dist\\rx.all.compat.js\" target=\"content\\Scripts\\rx.all.compat.js\" />\n    <file src=\"..\\..\\dist\\rx.all.compat.min.js\" target=\"content\\Scripts\\rx.all.compat.min.js\" />\n    <file src=\"..\\..\\ts\\rx.all.d.ts\" target=\"content\\Scripts\\rx.all.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.all.es6.d.ts\" target=\"content\\Scripts\\rx.all.es6.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.d.ts\" target=\"content\\Scripts\\rx.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.es6.d.ts\" target=\"content\\Scripts\\rx.es6.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.lite.d.ts\" target=\"content\\Scripts\\rx.lite.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.lite.es6.d.ts\" target=\"content\\Scripts\\rx.lite.es6.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.lite.extras.d.ts\" target=\"content\\Scripts\\rx.lite.extras.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.lite.extras.es6.d.ts\" target=\"content\\Scripts\\rx.lite.extras.es6.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.aggregates.d.ts\" target=\"content\\Scripts\\rx.aggregates.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.aggregates.es6.d.ts\" target=\"content\\Scripts\\rx.aggregates.es6.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.async.d.ts\" target=\"content\\Scripts\\rx.async.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.async.es6.d.ts\" target=\"content\\Scripts\\rx.async.es6.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.binding.d.ts\" target=\"content\\Scripts\\rx.binding.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.binding.es6.d.ts\" target=\"content\\Scripts\\rx.binding.es6.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.coincidence.d.ts\" target=\"content\\Scripts\\rx.coincidence.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.coincidence.es6.d.ts\" target=\"content\\Scripts\\rx.coincidence.es6.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.experimental.d.ts\" target=\"content\\Scripts\\rx.experimental.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.experimental.es6.d.ts\" target=\"content\\Scripts\\rx.experimental.es6.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.joinpatterns.d.ts\" target=\"content\\Scripts\\rx.joinpatterns.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.joinpatterns.es6.d.ts\" target=\"content\\Scripts\\rx.joinpatterns.es6.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.time.d.ts\" target=\"content\\Scripts\\rx.time.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.time.es6.d.ts\" target=\"content\\Scripts\\rx.time.es6.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.virtualtime.d.ts\" target=\"content\\Scripts\\rx.virtualtime.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.virtualtime.es6.d.ts\" target=\"content\\Scripts\\rx.virtualtime.es6.d.ts\" />\n  </files>\n</package>\n"
  },
  {
    "path": "nuget/RxJS-Experimental/RxJS-Experimental.nuspec",
    "content": "﻿<?xml version=\"1.0\"?>\n<package>\n  <metadata>\n    <id>RxJS-Experimental</id>\n    <title>Reactive Extensions for JavaScript - Experimental</title>\n    <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n    <version>$version$</version>\n    <authors>Microsoft Corporation</authors>\n    <description>Reactive Extensions for JavaScript library with experimental operators.</description>\n    <projectUrl>http://rx.codeplex.com</projectUrl>\n    <iconUrl>http://go.microsoft.com/fwlink/?LinkId=261274</iconUrl>\n    <requireLicenseAcceptance>true</requireLicenseAcceptance>\n    <licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>\n    <language>en-US</language>\n    <tags>Rx RxJS Reactive Extensions Observable</tags>\n    <dependencies>\n      <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n      <dependency id=\"RxJS-Main\" version=\"$version$\" />\n    </dependencies>\n  </metadata>\n  <files>\n    <file src=\"..\\..\\dist\\rx.experimental.js\" target=\"content\\Scripts\\rx.experimental.js\" />\n    <file src=\"..\\..\\dist\\rx.experimental.min.js\" target=\"content\\Scripts\\rx.experimental.min.js\" />\n    <file src=\"..\\..\\ts\\rx.experimental.d.ts\" target=\"content\\Scripts\\rx.experimental.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.experimental.es6.d.ts\" target=\"content\\Scripts\\rx.experimental.es6.d.ts\" />\n  </files>\n</package>\n"
  },
  {
    "path": "nuget/RxJS-JoinPatterns/RxJS-JoinPatterns.nuspec",
    "content": "<?xml version=\"1.0\"?>\n<package>\n  <metadata>\n    <id>RxJS-JoinPatterns</id>\n    <title>Reactive Extensions for JavaScript - Join Patterns</title>\n    <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n    <version>$version$</version>\n    <authors>Microsoft Corporation</authors>\n    <description>Reactive Extensions for JavaScript library with join patterns event processing query operations.</description>\n    <projectUrl>http://rx.codeplex.com</projectUrl>\n    <iconUrl>http://go.microsoft.com/fwlink/?LinkId=261274</iconUrl>\n    <requireLicenseAcceptance>true</requireLicenseAcceptance>\n    <licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>\n    <language>en-US</language>\n    <tags>Rx RxJS Reactive Extensions Observable</tags>\n    <dependencies>\n      <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n      <dependency id=\"RxJS-Main\" version=\"$version$\" />\n    </dependencies>\n  </metadata>\n  <files>\n    <file src=\"..\\..\\dist\\rx.joinpatterns.js\" target=\"content\\Scripts\\rx.joinpatterns.js\" />\n    <file src=\"..\\..\\dist\\rx.joinpatterns.min.js\" target=\"content\\Scripts\\rx.joinpatterns.min.js\" />\n    <file src=\"..\\..\\ts\\rx.joinpatterns.d.ts\" target=\"content\\Scripts\\rx.joinpatterns.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.joinpatterns.es6.d.ts\" target=\"content\\Scripts\\rx.joinpatterns.es6.d.ts\" />\n  </files>\n</package>\n"
  },
  {
    "path": "nuget/RxJS-Lite/RxJS-Lite.nuspec",
    "content": "﻿<?xml version=\"1.0\"?>\n<package>\n  <metadata>\n    <id>RxJS-Lite</id>\n    <title>Reactive Extensions for JavaScript - Lite Library</title>\n    <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n    <version>$version$</version>\n    <authors>Microsoft Corporation</authors>\n    <description>Reactive Extensions for JavaScript main library used to express complex event processing queries over observable sequences.</description>\n    <projectUrl>http://rx.codeplex.com</projectUrl>\n    <iconUrl>http://go.microsoft.com/fwlink/?LinkId=261274</iconUrl>\n    <requireLicenseAcceptance>true</requireLicenseAcceptance>\n    <licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>\n    <language>en-US</language>\n    <tags>Rx RxJS Reactive Extensions Observable</tags>\n  </metadata>\n  <files>\n    <file src=\"..\\..\\dist\\rx.lite.js\" target=\"content\\Scripts\\rx.lite.js\" />\n    <file src=\"..\\..\\dist\\rx.lite.min.js\" target=\"content\\Scripts\\rx.lite.min.js\" />\n    <file src=\"..\\..\\dist\\rx.lite.compat.js\" target=\"content\\Scripts\\rx.lite.compat.js\" />\n    <file src=\"..\\..\\dist\\rx.lite.compat.min.js\" target=\"content\\Scripts\\rx.lite.compat.min.js\" />\n    <file src=\"..\\..\\dist\\rx.lite.extras.js\" target=\"content\\Scripts\\rx.lite.extras.js\" />\n    <file src=\"..\\..\\dist\\rx.lite.extras.min.js\" target=\"content\\Scripts\\rx.lite.extras.min.js\" />\n    <file src=\"..\\..\\ts\\rx.lite.d.ts\" target=\"content\\Scripts\\rx.lite.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.lite.es6.d.ts\" target=\"content\\Scripts\\rx.lite.es6.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.lite.extras.d.ts\" target=\"content\\Scripts\\rx.lite.extras.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.lite.extras.es6.d.ts\" target=\"content\\Scripts\\rx.lite.extras.es6.d.ts\" />\n  </files>\n</package>\n"
  },
  {
    "path": "nuget/RxJS-Main/RxJS-Main.nuspec",
    "content": "﻿<?xml version=\"1.0\"?>\n<package>\n  <metadata>\n    <id>RxJS-Main</id>\n    <title>Reactive Extensions for JavaScript - Main Library</title>\n    <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n    <version>$version$</version>\n    <authors>Microsoft Corporation</authors>\n    <description>Reactive Extensions for JavaScript main library used to express complex event processing queries over observable sequences.</description>\n    <projectUrl>http://rx.codeplex.com</projectUrl>\n    <iconUrl>http://go.microsoft.com/fwlink/?LinkId=261274</iconUrl>\n    <requireLicenseAcceptance>true</requireLicenseAcceptance>\n    <licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>\n    <language>en-US</language>\n    <tags>Rx RxJS Reactive Extensions Observable</tags>\n  </metadata>\n  <files>\n    <file src=\"..\\..\\dist\\rx.js\" target=\"content\\Scripts\\rx.js\" />\n    <file src=\"..\\..\\dist\\rx.min.js\" target=\"content\\Scripts\\rx.min.js\" />\n    <file src=\"..\\..\\dist\\rx.compat.js\" target=\"content\\Scripts\\rx.compat.js\" />\n    <file src=\"..\\..\\dist\\rx.compat.min.js\" target=\"content\\Scripts\\rx.compat.min.js\" />\n    <file src=\"..\\..\\ts\\rx.d.ts\" target=\"content\\Scripts\\rx.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.es6.d.ts\" target=\"content\\Scripts\\rx.es6.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.lite.d.ts\" target=\"content\\Scripts\\rx.lite.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.lite.es6.d.ts\" target=\"content\\Scripts\\rx.lite.es6.d.ts\" />\n  </files>\n</package>\n"
  },
  {
    "path": "nuget/RxJS-Testing/RxJS-Testing.nuspec",
    "content": "<?xml version=\"1.0\"?>\n<package>\n  <metadata>\n    <id>RxJS-Testing</id>\n    <title>Reactive Extensions for JavaScript - Test Library</title>\n    <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n    <version>$version$</version>\n    <authors>Microsoft Corporation</authors>\n    <description>Reactive Extensions for JavaScript test library, used to write unit tests for complex event processing queries.</description>\n    <projectUrl>http://rx.codeplex.com</projectUrl>\n    <iconUrl>http://go.microsoft.com/fwlink/?LinkId=261274</iconUrl>\n    <requireLicenseAcceptance>true</requireLicenseAcceptance>\n    <licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>\n    <language>en-US</language>\n    <tags>Rx RxJS Reactive Extensions Observable</tags>\n    <dependencies>\n      <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n      <dependency id=\"RxJS-Main\" version=\"$version$\" />\n      <dependency id=\"RxJS-VirtualTime\" version=\"$version$\" />\n    </dependencies>\n  </metadata>\n  <files>\n    <file src=\"..\\..\\dist\\rx.testing.js\" target=\"content\\Scripts\\rx.testing.js\" />\n    <file src=\"..\\..\\dist\\rx.testing.min.js\" target=\"content\\Scripts\\rx.testing.min.js\" />\n    <file src=\"..\\..\\ts\\rx.testing.d.ts\" target=\"content\\Scripts\\rx.testing.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.testing.es6.d.ts\" target=\"content\\Scripts\\rx.testing.es6.d.ts\" />\n  </files>\n</package>\n"
  },
  {
    "path": "nuget/RxJS-Time/RxJS-Time.nuspec",
    "content": "<?xml version=\"1.0\"?>\n<package>\n  <metadata>\n    <id>RxJS-Time</id>\n    <title>Reactive Extensions for JavaScript - Time-Based Operations</title>\n    <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n    <version>$version$</version>\n    <authors>Microsoft Corporation</authors>\n    <description>Reactive Extensions for JavaScript library with time-based event processing query operations.</description>\n    <projectUrl>http://go.microsoft.com/fwlink/?LinkID=179929</projectUrl>\n    <iconUrl>http://go.microsoft.com/fwlink/?LinkId=261274</iconUrl>\n    <requireLicenseAcceptance>true</requireLicenseAcceptance>\n    <licenseUrl>http://go.microsoft.com/fwlink/?LinkID=265024</licenseUrl>\n    <language>en-US</language>\n    <tags>Rx RxJS Reactive Extensions Observable</tags>\n    <dependencies>\n      <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n      <dependency id=\"RxJS-Main\" version=\"$version$\" />\n    </dependencies>\n  </metadata>\n  <files>\n    <file src=\"..\\..\\dist\\rx.time.js\" target=\"content\\Scripts\\rx.time.js\" />\n    <file src=\"..\\..\\dist\\rx.time.min.js\" target=\"content\\Scripts\\rx.time.min.js\" />\n    <file src=\"..\\..\\ts\\rx.time.d.ts\" target=\"content\\Scripts\\rx.time.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.time.es6.d.ts\" target=\"content\\Scripts\\rx.time.es6.d.ts\" />\n  </files>\n</package>\n"
  },
  {
    "path": "nuget/RxJS-VirtualTime/RxJS-VirtualTime.nuspec",
    "content": "<?xml version=\"1.0\"?>\n<package>\n  <metadata>\n    <id>RxJS-VirtualTime</id>\n    <title>Reactive Extensions for JavaScript - Virtual Time-Based Schedulers</title>\n    <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n    <version>$version$</version>\n    <authors>Microsoft Corporation</authors>\n    <description>Reactive Extensions for JavaScript library with virtual time based schedulers.</description>\n    <projectUrl>http://go.microsoft.com/fwlink/?LinkID=179929</projectUrl>\n    <iconUrl>http://go.microsoft.com/fwlink/?LinkId=261274</iconUrl>\n    <requireLicenseAcceptance>true</requireLicenseAcceptance>\n    <licenseUrl>http://go.microsoft.com/fwlink/?LinkID=265024</licenseUrl>\n    <language>en-US</language>\n    <tags>Rx RxJS Reactive Extensions Observable</tags>\n    <dependencies>\n      <!-- Automatically updated by build, keeping fixed dev build number here in case of local build -->\n      <dependency id=\"RxJS-Main\" version=\"$version$\" />\n    </dependencies>\n  </metadata>\n  <files>\n    <file src=\"..\\..\\dist\\rx.virtualtime.js\" target=\"content\\Scripts\\rx.virtualtime.js\" />\n    <file src=\"..\\..\\dist\\rx.virtualtime.min.js\" target=\"content\\Scripts\\rx.virtualtime.min.js\" />\n    <file src=\"..\\..\\ts\\rx.virtualtime.d.ts\" target=\"content\\Scripts\\rx.virtualtime.d.ts\" />\n    <file src=\"..\\..\\ts\\rx.virtualtime.es6.d.ts\" target=\"content\\Scripts\\rx.virtualtime.es6.d.ts\" />\n  </files>\n</package>\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"rx\",\n  \"title\": \"Reactive Extensions for JavaScript (RxJS)\",\n  \"description\": \"Library for composing asynchronous and event-based operations in JavaScript\",\n  \"version\": \"4.1.0\",\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"author\": {\n    \"name\": \"Cloud Programmability Team\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/blob/master/authors.txt\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"license\": \"Apache-2.0\",\n  \"bugs\": \"https://github.com/Reactive-Extensions/RxJS/issues\",\n  \"jam\": {\n    \"main\": \"dist/rx.all.js\"\n  },\n  \"browser\": {\n    \"index.js\": \"./dist/rx.all.js\"\n  },\n  \"dependencies\": {},\n  \"devDependencies\": {\n    \"benchmark\": \"*\",\n    \"grunt-cli\": \"*\",\n    \"grunt\": \"*\",\n    \"grunt-contrib-copy\": \"*\",\n    \"grunt-contrib-jshint\": \"*\",\n    \"grunt-contrib-connect\": \"*\",\n    \"grunt-contrib-uglify\": \"*\",\n    \"grunt-contrib-concat\": \"*\",\n    \"grunt-contrib-qunit\": \"*\",\n    \"grunt-contrib-watch\": \"*\",\n    \"grunt-jscs\": \"*\",\n    \"load-grunt-tasks\": \"*\"\n  },\n  \"keywords\": [\n    \"LINQ\",\n    \"FRP\",\n    \"Reactive\",\n    \"Events\",\n    \"Rx\",\n    \"RxJS\"\n  ],\n  \"main\": \"index.js\",\n  \"typings\": \"./ts/rx.all.d.ts\",\n  \"scripts\": {\n    \"test\": \"grunt\"\n  }\n}\n"
  },
  {
    "path": "readme.md",
    "content": "[![Build Status](https://travis-ci.org/Reactive-Extensions/RxJS.svg)](https://travis-ci.org/Reactive-Extensions/RxJS)\n[![GitHub version](https://img.shields.io/github/tag/reactive-extensions/rxjs.svg)](https://github.com/Reactive-Extensions/RxJS)\n[![NPM version](https://img.shields.io/npm/v/rx.svg)](https://www.npmjs.com/package/rx)\n[![Downloads](https://img.shields.io/npm/dm/rx.svg)](https://www.npmjs.com/package/rx)\n[![Bower](https://img.shields.io/bower/v/rxjs.svg)](http://bower.io/search/?q=rxjs)\n[![NuGet](https://img.shields.io/nuget/v/RxJS-All.svg)](http://www.nuget.org/packages/RxJS-All/)\n[![Join the chat at https://gitter.im/Reactive-Extensions/RxJS](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Reactive-Extensions/RxJS?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n\n# NOTE: The latest version of RxJS can be found [here](https://github.com/reactivex/rxjs)\n\n**[The Need to go Reactive](#the-need-to-go-reactive)** |\n**[About the Reactive Extensions](#about-the-reactive-extensions)** |\n**[Batteries Included](#batteries-included)** |\n**[Why RxJS?](#why-rxjs)** |\n**[Dive In!](#dive-in)** |\n**[Resources](#resources)** |\n**[Getting Started](#getting-started)** |\n**[What about my libraries?](#what-about-my-libraries)** |\n**[Compatibility](#compatibility)** |\n**[Contributing](#contributing)** |\n**[License](#license)**\n\n# The Reactive Extensions for JavaScript (RxJS) <sup>4.0</sup>... #\n\n*...is a set of libraries to compose asynchronous and event-based programs using observable collections and [Array#extras](http://blogs.msdn.com/b/ie/archive/2010/12/13/ecmascript-5-part-2-array-extras.aspx) style composition in JavaScript*\n\nThe project is actively developed by [Microsoft](https://microsoft.com/), in collaboration with a community of open source developers.\n\n## The Need to go Reactive ##\n\nApplications, especially on the web have changed over the years from being a simple static page, to DHTML with animations, to the Ajax revolution.  Each time, we're adding more complexity, more data, and asynchronous behavior to our applications.  How do we manage it all?  How do we scale it?  By moving towards \"Reactive Architectures\" which are event-driven, resilient and responsive.  With the Reactive Extensions, you have all the tools you need to help build these systems.\n\n## About the Reactive Extensions ##\n\nThe Reactive Extensions for JavaScript (RxJS) is a set of libraries for composing asynchronous and event-based programs using observable sequences and fluent query operators that many of you already know by [Array#extras](http://blogs.msdn.com/b/ie/archive/2010/12/13/ecmascript-5-part-2-array-extras.aspx) in JavaScript. Using RxJS, developers represent asynchronous data streams with Observables, query asynchronous data streams using our many operators, and parameterize the concurrency in the asynchronous data streams using Schedulers. Simply put, RxJS = Observables + Operators + Schedulers.\n\nWhether you are authoring a web-based application in JavaScript or a server-side application in Node.js, you have to deal with asynchronous and event-based programming. Although some patterns are emerging such as the Promise pattern, handling exceptions, cancellation, and synchronization is difficult and error-prone.\n\nUsing RxJS, you can represent multiple asynchronous data streams (that come from diverse sources, e.g., stock quote, tweets, computer events, web service requests, etc.), and subscribe to the event stream using the Observer object. The Observable notifies the subscribed Observer instance whenever an event occurs.\n\nBecause observable sequences are data streams, you can query them using standard query operators implemented by the Observable type. Thus you can filter, project, aggregate, compose and perform time-based operations on multiple events easily by using these operators. In addition, there are a number of other reactive stream specific operators that allow powerful queries to be written. Cancellation, exceptions, and synchronization are also handled gracefully by using the methods on the Observable object.\n\nBut the best news of all is that you already know how to program like this.  Take for example the following JavaScript code, where we get some stock data and then manipulate and iterate the results.\n\n```js\n/* Get stock data somehow */\nconst source = getAsyncStockData();\n\nconst subscription = source\n  .filter(quote => quote.price > 30)\n  .map(quote => quote.price)\n  .forEach(price => console.log(`Prices higher than $30: ${price}`));\n```\n\nNow what if this data were to come as some sort of event, for example a stream, such as a WebSocket? Then we could pretty much write the same query to iterate our data, with very little change.\n\n```js\n/* Get stock data somehow */\nconst source = getAsyncStockData();\n\nconst subscription = source\n  .filter(quote => quote.price > 30)\n  .map(quote => quote.price)\n  .subscribe(\n    price => console.log(`Prices higher than $30: ${price}`),\n    err => console.log(`Something went wrong: ${err.message}`)\n  );\n\n/* When we're done */\nsubscription.dispose();\n```\n\nThe only difference is that we can handle the errors inline with our subscription.  And when we're no longer interested in receiving the data as it comes streaming in, we call `dispose` on our subscription.  Note the use of `subscribe` instead of `forEach`.  We could also use `forEach` which is an alias for `subscribe` but we highly suggest you use `subscribe`.\n\n## Batteries Included ##\n\nSure, there are a lot of libraries to get started with RxJS. Confused on where to get started?  Start out with the complete set of operators with [`rx.all.js`](doc/libraries/main/rx.complete.md), then you can reduce it to the number of operators that you really need, and perhaps stick with something as small as [`rx.lite.js`](doc/libraries/lite/rx.lite.md).  If you're an implementor of RxJS, then you can start out with [`rx.core.js`](doc/libraries/core/rx.core.md).\n\nThis set of libraries include:\n\n### The complete library:\n- [`rx.all.js`](doc/libraries/main/rx.complete.md)\n\n### Main Libraries:\n- [`rx.js`](doc/libraries/main/rx.md)\n- [`rx.aggregates.js`](doc/libraries/main/rx.aggregates.md)\n- [`rx.async.js`](doc/libraries/main/rx.async.md)\n- [`rx.binding.js`](doc/libraries/main/rx.binding.md)\n- [`rx.coincidence.js`](doc/libraries/main/rx.coincidence.md)\n- [`rx.experimental.js`](doc/libraries/main/rx.experimental.md)\n- [`rx.joinpatterns.js`](doc/libraries/main/rx.joinpatterns.md)\n- [`rx.testing.js`](doc/libraries/main/rx.testing.md)\n- [`rx.time.js`](doc/libraries/main/rx.time.md)\n- [`rx.virtualtime.js`](doc/libraries/main/rx.virtualtime.md)\n\n### Lite Libraries:\n- [`rx.lite.js`](doc/libraries/lite/rx.lite.md)\n- [`rx.lite.extras.js`](doc/libraries/lite/rx.lite.extras.md)\n- [`rx.lite.aggregates.js`](doc/libraries/lite/rx.lite.aggregates.md)\n- [`rx.lite.async.js`](doc/libraries/lite/rx.lite.async.md)\n- [`rx.lite.coincidence.js`](doc/libraries/lite/rx.lite.coincidence.md)\n- [`rx.lite.experimental.js`](doc/libraries/lite/rx.lite.experimental.md)\n- [`rx.lite.joinpatterns.js`](doc/libraries/lite/rx.lite.joinpatterns.md)\n- [`rx.lite.testing.js`](doc/libraries/lite/rx.lite.testing.md)\n- [`rx.lite.time.js`](doc/libraries/lite/rx.lite.time.md)\n- [`rx.lite.virtualtime.js`](doc/libraries/lite/rx.lite.virtualtime.md)\n\n### Core Libraries:\n- [`rx.core.js`](doc/libraries/core/rx.core.md)\n- [`rx.core.binding.js`](doc/libraries/core/rx.core.binding.md)\n- [`rx.core.testing.js`](doc/libraries/core/rx.core.testing.md)\n\n## Why RxJS? ##\n\nOne question you may ask yourself is why RxJS?  What about Promises?  Promises are good for solving asynchronous operations such as querying a service with an XMLHttpRequest, where the expected behavior is one value and then completion.  Reactive Extensions for JavaScript unify both the world of Promises, callbacks as well as evented data such as DOM Input, Web Workers, and Web Sockets. Unifying these concepts enables rich composition.\n\nTo give you an idea about rich composition, we can create an autocompletion service which takes user input from a text input and then throttles queries to a service (to avoid flooding the service with calls for every key stroke).\n\nFirst, we'll reference the JavaScript files, including jQuery, although RxJS has no dependencies on jQuery...\n```html\n<script src=\"https://code.jquery.com/jquery.js\"></script>\n<script src=\"rx.lite.js\"></script>\n```\nNext, we'll get the user input from an input, listening to the keyup event by using the `Rx.Observable.fromEvent` method.  This will either use the event binding from [jQuery](http://jquery.com), [Zepto](http://zeptojs.com/), [AngularJS](https://angularjs.org/), [Backbone.js](http://backbonejs.org/) and [Ember.js](http://emberjs.com/) if available, and if not, falls back to the native event binding.  This gives you consistent ways of thinking of events depending on your framework, so there are no surprises.\n\n```js\nconst $input = $('#input');\nconst $results = $('#results');\n\n/* Only get the value from each key up */\nvar keyups = Rx.Observable.fromEvent($input, 'keyup')\n  .pluck('target', 'value')\n  .filter(text => text.length > 2 );\n\n/* Now debounce the input for 500ms */\nvar debounced = keyups\n  .debounce(500 /* ms */);\n\n/* Now get only distinct values, so we eliminate the arrows and other control characters */\nvar distinct = debounced\n  .distinctUntilChanged();\n```\n\nNow, let's query Wikipedia!  In RxJS, we can instantly bind to any [Promises A+](https://github.com/promises-aplus/promises-spec) implementation through the `Rx.Observable.fromPromise` method. Or, directly return it and RxJS will wrap it for you.\n\n```js\nlet searchWikipedia = (term) => {\n  return $.ajax({\n    url: 'https://en.wikipedia.org/w/api.php',\n    dataType: 'jsonp',\n    data: {\n      action: 'opensearch',\n      format: 'json',\n      search: term\n    }\n  }).promise();\n}\n```\n\nOnce that is created, we can tie together the distinct throttled input and query the service.  In this case, we'll call `flatMapLatest` to get the value and ensure we're not introducing any out of order sequence calls.\n\n```js\nconst suggestions = distinct\n  .flatMapLatest(searchWikipedia);\n```\n\nFinally, we call the `subscribe` method on our observable sequence to start pulling data.\n\n```js\nsuggestions.subscribe(\n  data => {\n    $results\n      .empty()\n      .append($.map(data[1], value =>  $('<li>').text(value)));\n  },\n  error => {\n    $results\n      .empty()\n      .append($('<li>'))\n        .text(`Error: ${error}`);\n  });\n```\n\nAnd there you have it!\n\n## Dive In! ##\n\nPlease check out:\n\n - [Our Code of Conduct](https://github.com/Reactive-Extensions/RxJS/tree/master/code-of-conduct.md)\n - [The full documentation](https://github.com/Reactive-Extensions/RxJS/tree/master/doc)\n - [Our many great examples](https://github.com/Reactive-Extensions/RxJS/tree/master/examples)\n - [Our design guidelines](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/designguidelines)\n - [Our contribution guidelines](https://github.com/Reactive-Extensions/RxJS/tree/master/contributing.md)\n - [Our complete Unit Tests](https://github.com/Reactive-Extensions/RxJS/tree/master/tests)\n - [Our recipes](https://github.com/Reactive-Extensions/RxJS/wiki/Recipes)\n\n## Resources\n\n- Contact us\n    - [Twitter @ReactiveX](https://twitter.com/ReactiveX)\n    - [Gitter.im](https://gitter.im/Reactive-Extensions/RxJS)\n    - [StackOverflow rxjs](http://stackoverflow.com/questions/tagged/rxjs)\n\n- Tutorials\n    - [The introduction to Reactive Programming you've been missing](https://gist.github.com/staltz/868e7e9bc2a7b8c1f754)\n    - [2 minute introduction to Rx](https://medium.com/@andrestaltz/2-minute-introduction-to-rx-24c8ca793877)\n    - [Learn RxJS - @jhusain](https://github.com/jhusain/learnrx)\n    - [RxJS Koans](https://github.com/Reactive-Extensions/RxJSKoans)\n    - [RxJS Workshop from BuildStuff 2014](https://github.com/Reactive-Extensions/BuildStuffWorkshop)\n    - [Rx Workshop](http://rxworkshop.codeplex.com/)\n    - [Reactive Programming and MVC](http://aaronstacy.com/writings/reactive-programming-and-mvc/)\n    - [RxJS lessons - egghead.io](https://egghead.io/technologies/rx)\n    - [RxJS Training - @andrestaltz](https://github.com/staltz/rxjs-training)\n\n- Reference Material\n    - [Rx Marbles](http://rxmarbles.com/)\n    - [RxJS GitBook](http://xgrommx.github.io/rx-book/)\n    - [Intro to Rx](http://introtorx.com/)\n    - [101 Rx Samples Wiki](http://rxwiki.wikidot.com/101samples)\n    - [RxJS Design Guidelines](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/designguidelines)\n    - [Visualizing Reactive Streams](http://jaredforsyth.com/2015/03/06/visualizing-reactive-streams-hot-and-cold/)\n    - [Your Mouse is a Database](http://queue.acm.org/detail.cfm?id=2169076)\n\n- Essential tools\n    - [RxVision](http://jaredforsyth.com/rxvision/)\n    - [Percussion](https://github.com/grisendo/Percussion)\n\n- Books\n    - [RxJS in Action](https://www.manning.com/books/rxjs-in-action)\n    - [RxJS](http://xgrommx.github.io/rx-book/)\n    - [Intro to Rx](http://www.amazon.com/Introduction-to-Rx-ebook/dp/B008GM3YPM/)\n    - [Programming Reactive Extensions and LINQ](http://www.amazon.com/Programming-Reactive-Extensions-Jesse-Liberty/dp/1430237473/)\n    - [Reactive Programming with RxJS](https://pragprog.com/book/smreactjs/reactive-programming-with-rxjs)\n\n- [Community Examples](examples/community.md)\n- [Presentations](examples/presentations.md)\n- [Videos and Podcasts](examples/videos.md)\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS. The files are available on [cdnjs](http://cdnjs.com/libraries/rxjs/) and [jsDelivr](http://www.jsdelivr.com/#!rxjs).\n\n### Download the Source\n\n```bash\ngit clone https://github.com/Reactive-Extensions/rxjs.git\ncd ./rxjs\n```\n\n### Installing with [NPM](https://www.npmjs.com/)\n\n```bash`\n$ npm install rx\n$ npm install -g rx\n```\n\n### Using with Node.js and Ringo.js\n\n```js\nvar Rx = require('rx');\n```\n\n### Installing with [Bower](http://bower.io/)\n\n```bash\n$ bower install rxjs\n```\n\n### Installing with [Jam](http://jamjs.org/)\n```bash\n$ jam install rx\n```\n### Installing All of RxJS via [NuGet](http://www.nuget.org/)\n```bash\n$ Install-Package RxJS-All\n```\n### Install individual packages via [NuGet](http://www.nuget.org/):\n\n    Install-Package RxJS-All\n    Install-Package RxJS-Lite\n    Install-Package RxJS-Main\n    Install-Package RxJS-Aggregates\n    Install-Package RxJS-Async\n    Install-Package RxJS-BackPressure\n    Install-Package RxJS-Binding\n    Install-Package RxJS-Coincidence\n    Install-Package RxJS-Experimental\n    Install-Package RxJS-JoinPatterns\n    Install-Package RxJS-Testing\n    Install-Package RxJS-Time\n\n### In a Browser:\n\n```html\n<!-- Just the core RxJS -->\n<script src=\"rx.js\"></script>\n\n<!-- Or all of RxJS minus testing -->\n<script src=\"rx.all.js\"></script>\n\n<!-- Or keeping it lite -->\n<script src=\"rx.lite.js\"></script>\n```\n\n### Along with a number of our extras for RxJS:\n\n```html\n<script src=\"rx.aggregates.js\"></script>\n<script src=\"rx.async.js\"></script>\n<script src=\"rx.backpressure.js\"></script>\n<script src=\"rx.binding.js\"></script>\n<script src=\"rx.coincidencejs\"></script>\n<script src=\"rx.experimental.js\"></script>\n<script src=\"rx.joinpatterns.js\"></script>\n<script src=\"rx.time.js\"></script>\n<script src=\"rx.virtualtime.js\"></script>\n<script src=\"rx.testing.js\"></script>\n```\n\n### Using RxJS with an AMD loader such as Require.js\n\n```js\nrequire({\n  'paths': {\n    'rx': 'path/to/rx-lite.js'\n  }\n},\n['rx'], (Rx) => {\n  const obs = Rx.Observable.of(42);\n  obs.forEach(x => console.log(x));\n});\n```\n\n## What about my libraries? ##\n\nThe Reactive Extensions for JavaScript have no external dependencies on any library, so they'll work well with just about any library.  We provide bridges and support for various libraries including:\n- [Node.js](https://www.npmjs.com/package/rx-node)\n- [React](http://facebook.github.io/react/)\n    - [Rx-React](https://github.com/fdecampredon/rx-react)\n    - [RxReact](https://github.com/AlexMost/RxReact)\n    - [cycle-react](https://github.com/pH200/cycle-react)\n- [Flux](http://facebook.github.io/flux/)\n    - [Rx-Flux](https://github.com/fdecampredon/rx-flux)\n    - [ReactiveFlux](https://github.com/codesuki/reactive-flux)\n    - [Thundercats.js](https://github.com/ThunderCatsJS/thundercats)\n    - [Flurx](https://github.com/qwtel/flurx)\n    - [RR](https://github.com/winsonwq/RR)\n- [Ember](http://emberjs.com/)\n    - [RxEmber](https://github.com/blesh/RxEmber)\n- [AngularJS](https://github.com/Reactive-Extensions/rx.angular.js)\n- [HTML DOM](https://github.com/Reactive-Extensions/RxJS-DOM)\n- [jQuery (1.4+)](https://github.com/Reactive-Extensions/RxJS-jQuery)\n- [MooTools](https://github.com/Reactive-Extensions/RxJS-MooTools)\n- [Dojo 1.7+](https://github.com/Reactive-Extensions/RxJS-Dojo)\n- [ExtJS](https://github.com/Reactive-Extensions/RxJS-ExtJS)\n\n## Compatibility ##\n\nRxJS has been thoroughly tested against all major browsers and supports IE6+, Chrome 4+, FireFox 1+, and Node.js v0.4+.\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\nFirst-time contributors must sign a [Contribution License Agreement](https://cla.microsoft.com/).  If your Pull Request has the label [cla-required](https://github.com/Reactive-Extensions/RxJS/labels/cla-required), this is an indication that you haven't yet signed such an agreement.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "src/core/abstractobserver.js",
    "content": "  /**\n   * Abstract base class for implementations of the Observer class.\n   * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n   */\n  var AbstractObserver = Rx.internals.AbstractObserver = (function (__super__) {\n    inherits(AbstractObserver, __super__);\n\n    /**\n     * Creates a new observer in a non-stopped state.\n     */\n    function AbstractObserver() {\n      this.isStopped = false;\n    }\n\n    // Must be implemented by other observers\n    AbstractObserver.prototype.next = notImplemented;\n    AbstractObserver.prototype.error = notImplemented;\n    AbstractObserver.prototype.completed = notImplemented;\n\n    /**\n     * Notifies the observer of a new element in the sequence.\n     * @param {Any} value Next element in the sequence.\n     */\n    AbstractObserver.prototype.onNext = function (value) {\n      !this.isStopped && this.next(value);\n    };\n\n    /**\n     * Notifies the observer that an exception has occurred.\n     * @param {Any} error The error that has occurred.\n     */\n    AbstractObserver.prototype.onError = function (error) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(error);\n      }\n    };\n\n    /**\n     * Notifies the observer of the end of the sequence.\n     */\n    AbstractObserver.prototype.onCompleted = function () {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.completed();\n      }\n    };\n\n    /**\n     * Disposes the observer, causing it to transition to the stopped state.\n     */\n    AbstractObserver.prototype.dispose = function () { this.isStopped = true; };\n\n    AbstractObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return AbstractObserver;\n  }(Observer));\n"
  },
  {
    "path": "src/core/anonymousobservable.js",
    "content": "  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {\n    inherits(AnonymousObservable, __super__);\n\n    // Fix subscriber to check for undefined or function returned to decorate as Disposable\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.__subscribe).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function AnonymousObservable(subscribe, parent) {\n      this.source = parent;\n      this.__subscribe = subscribe;\n      __super__.call(this);\n    }\n\n    AnonymousObservable.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    return AnonymousObservable;\n\n  }(Observable));\n"
  },
  {
    "path": "src/core/anonymousobserver.js",
    "content": "  /**\n   * Class to create an Observer instance from delegate-based implementations of the on* methods.\n   */\n  var AnonymousObserver = Rx.AnonymousObserver = (function (__super__) {\n    inherits(AnonymousObserver, __super__);\n\n    /**\n     * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n     * @param {Any} onNext Observer's OnNext action implementation.\n     * @param {Any} onError Observer's OnError action implementation.\n     * @param {Any} onCompleted Observer's OnCompleted action implementation.\n     */\n    function AnonymousObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    /**\n     * Calls the onNext action.\n     * @param {Any} value Next element in the sequence.\n     */\n    AnonymousObserver.prototype.next = function (value) {\n      this._onNext(value);\n    };\n\n    /**\n     * Calls the onError action.\n     * @param {Any} error The error that has occurred.\n     */\n    AnonymousObserver.prototype.error = function (error) {\n      this._onError(error);\n    };\n\n    /**\n     *  Calls the onCompleted action.\n     */\n    AnonymousObserver.prototype.completed = function () {\n      this._onCompleted();\n    };\n\n    return AnonymousObserver;\n  }(AbstractObserver));\n"
  },
  {
    "path": "src/core/autodetachobserver.js",
    "content": "  var AutoDetachObserver = (function (__super__) {\n    inherits(AutoDetachObserver, __super__);\n\n    function AutoDetachObserver(observer) {\n      __super__.call(this);\n      this.observer = observer;\n      this.m = new SingleAssignmentDisposable();\n    }\n\n    var AutoDetachObserverPrototype = AutoDetachObserver.prototype;\n\n    AutoDetachObserverPrototype.next = function (value) {\n      var result = tryCatch(this.observer.onNext).call(this.observer, value);\n      if (result === errorObj) {\n        this.dispose();\n        thrower(result.e);\n      }\n    };\n\n    AutoDetachObserverPrototype.error = function (err) {\n      var result = tryCatch(this.observer.onError).call(this.observer, err);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.completed = function () {\n      var result = tryCatch(this.observer.onCompleted).call(this.observer);\n      this.dispose();\n      result === errorObj && thrower(result.e);\n    };\n\n    AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };\n    AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };\n\n    AutoDetachObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.m.dispose();\n    };\n\n    return AutoDetachObserver;\n  }(AbstractObserver));\n"
  },
  {
    "path": "src/core/backpressure/controlled.js",
    "content": "  var ControlledObservable = (function (__super__) {\n    inherits(ControlledObservable, __super__);\n    function ControlledObservable (source, enableQueue, scheduler) {\n      __super__.call(this);\n      this.subject = new ControlledSubject(enableQueue, scheduler);\n      this.source = source.multicast(this.subject).refCount();\n    }\n\n    ControlledObservable.prototype._subscribe = function (o) {\n      return this.source.subscribe(o);\n    };\n\n    ControlledObservable.prototype.request = function (numberOfItems) {\n      return this.subject.request(numberOfItems == null ? -1 : numberOfItems);\n    };\n\n    return ControlledObservable;\n\n  }(Observable));\n\n  var ControlledSubject = (function (__super__) {\n    inherits(ControlledSubject, __super__);\n    function ControlledSubject(enableQueue, scheduler) {\n      enableQueue == null && (enableQueue = true);\n\n      __super__.call(this);\n      this.subject = new Subject();\n      this.enableQueue = enableQueue;\n      this.queue = enableQueue ? [] : null;\n      this.requestedCount = 0;\n      this.requestedDisposable = null;\n      this.error = null;\n      this.hasFailed = false;\n      this.hasCompleted = false;\n      this.scheduler = scheduler || currentThreadScheduler;\n    }\n\n    addProperties(ControlledSubject.prototype, Observer, {\n      _subscribe: function (o) {\n        return this.subject.subscribe(o);\n      },\n      onCompleted: function () {\n        this.hasCompleted = true;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onCompleted();\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnCompleted());\n        }\n      },\n      onError: function (error) {\n        this.hasFailed = true;\n        this.error = error;\n        if (!this.enableQueue || this.queue.length === 0) {\n          this.subject.onError(error);\n          this.disposeCurrentRequest();\n        } else {\n          this.queue.push(Notification.createOnError(error));\n        }\n      },\n      onNext: function (value) {\n        if (this.requestedCount <= 0) {\n          this.enableQueue && this.queue.push(Notification.createOnNext(value));\n        } else {\n          (this.requestedCount-- === 0) && this.disposeCurrentRequest();\n          this.subject.onNext(value);\n        }\n      },\n      _processRequest: function (numberOfItems) {\n        if (this.enableQueue) {\n          while (this.queue.length > 0 && (numberOfItems > 0 || this.queue[0].kind !== 'N')) {\n            var first = this.queue.shift();\n            first.accept(this.subject);\n            if (first.kind === 'N') {\n              numberOfItems--;\n            } else {\n              this.disposeCurrentRequest();\n              this.queue = [];\n            }\n          }\n        }\n\n        return numberOfItems;\n      },\n      request: function (number) {\n        this.disposeCurrentRequest();\n        var self = this;\n\n        this.requestedDisposable = this.scheduler.schedule(number,\n        function(s, i) {\n          var remaining = self._processRequest(i);\n          var stopped = self.hasCompleted || self.hasFailed;\n          if (!stopped && remaining > 0) {\n            self.requestedCount = remaining;\n\n            return disposableCreate(function () {\n              self.requestedCount = 0;\n            });\n              // Scheduled item is still in progress. Return a new\n              // disposable to allow the request to be interrupted\n              // via dispose.\n          }\n        });\n\n        return this.requestedDisposable;\n      },\n      disposeCurrentRequest: function () {\n        if (this.requestedDisposable) {\n          this.requestedDisposable.dispose();\n          this.requestedDisposable = null;\n        }\n      }\n    });\n\n    return ControlledSubject;\n  }(Observable));\n\n  /**\n   * Attaches a controller to the observable sequence with the ability to queue.\n   * @example\n   * var source = Rx.Observable.interval(100).controlled();\n   * source.request(3); // Reads 3 values\n   * @param {bool} enableQueue truthy value to determine if values should be queued pending the next request\n   * @param {Scheduler} scheduler determines how the requests will be scheduled\n   * @returns {Observable} The observable sequence which only propagates values on request.\n   */\n  observableProto.controlled = function (enableQueue, scheduler) {\n\n    if (enableQueue && isScheduler(enableQueue)) {\n      scheduler = enableQueue;\n      enableQueue = true;\n    }\n\n    if (enableQueue == null) {  enableQueue = true; }\n    return new ControlledObservable(this, enableQueue, scheduler);\n  };\n"
  },
  {
    "path": "src/core/backpressure/pausable.js",
    "content": "  var PausableObservable = (function (__super__) {\n    inherits(PausableObservable, __super__);\n    function PausableObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableObservable.prototype._subscribe = function (o) {\n      var conn = this.source.publish(),\n        subscription = conn.subscribe(o),\n        connection = disposableEmpty;\n\n      var pausable = this.pauser.startWith(!this.paused).distinctUntilChanged().subscribe(function (b) {\n        if (b) {\n          connection = conn.connect();\n        } else {\n          connection.dispose();\n          connection = disposableEmpty;\n        }\n      });\n\n      return new NAryDisposable([subscription, connection, pausable]);\n    };\n\n    PausableObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausable(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausable = function (pauser) {\n    return new PausableObservable(this, pauser);\n  };\n"
  },
  {
    "path": "src/core/backpressure/pausablebuffered.js",
    "content": "  function combineLatestSource(source, subject, resultSelector) {\n    return new AnonymousObservable(function (o) {\n      var hasValue = [false, false],\n        hasValueAll = false,\n        isDone = false,\n        values = new Array(2),\n        err;\n\n      function next(x, i) {\n        values[i] = x;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          if (err) { return o.onError(err); }\n          var res = tryCatch(resultSelector).apply(null, values);\n          if (res === errorObj) { return o.onError(res.e); }\n          o.onNext(res);\n        }\n        isDone && values[1] && o.onCompleted();\n      }\n\n      return new BinaryDisposable(\n        source.subscribe(\n          function (x) {\n            next(x, 0);\n          },\n          function (e) {\n            if (values[1]) {\n              o.onError(e);\n            } else {\n              err = e;\n            }\n          },\n          function () {\n            isDone = true;\n            values[1] && o.onCompleted();\n          }),\n        subject.subscribe(\n          function (x) {\n            next(x, 1);\n          },\n          function (e) { o.onError(e); },\n          function () {\n            isDone = true;\n            next(true, 1);\n          })\n        );\n    }, source);\n  }\n\n  var PausableBufferedObservable = (function (__super__) {\n    inherits(PausableBufferedObservable, __super__);\n    function PausableBufferedObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n      this.paused = true;\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this);\n    }\n\n    PausableBufferedObservable.prototype._subscribe = function (o) {\n      var q = [], previousShouldFire;\n\n      function drainQueue() { while (q.length > 0) { o.onNext(q.shift()); } }\n\n      var subscription =\n        combineLatestSource(\n          this.source,\n          this.pauser.startWith(!this.paused).distinctUntilChanged(),\n          function (data, shouldFire) {\n            return { data: data, shouldFire: shouldFire };\n          })\n          .subscribe(\n            function (results) {\n              if (previousShouldFire !== undefined && results.shouldFire !== previousShouldFire) {\n                previousShouldFire = results.shouldFire;\n                // change in shouldFire\n                if (results.shouldFire) { drainQueue(); }\n              } else {\n                previousShouldFire = results.shouldFire;\n                // new data\n                if (results.shouldFire) {\n                  o.onNext(results.data);\n                } else {\n                  q.push(results.data);\n                }\n              }\n            },\n            function (err) {\n              drainQueue();\n              o.onError(err);\n            },\n            function () {\n              drainQueue();\n              o.onCompleted();\n            }\n          );\n      return subscription;      \n    };\n\n    PausableBufferedObservable.prototype.pause = function () {\n      this.paused = true;\n      this.controller.onNext(false);\n    };\n\n    PausableBufferedObservable.prototype.resume = function () {\n      this.paused = false;\n      this.controller.onNext(true);\n    };\n\n    return PausableBufferedObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n   * and yields the values that were buffered while paused.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausableBuffered = function (pauser) {\n    return new PausableBufferedObservable(this, pauser);\n  };\n"
  },
  {
    "path": "src/core/backpressure/pauser.js",
    "content": "  /**\n  * Used to pause and resume streams.\n  */\n  Rx.Pauser = (function (__super__) {\n    inherits(Pauser, __super__);\n    function Pauser() {\n      __super__.call(this);\n    }\n\n    /**\n     * Pauses the underlying sequence.\n     */\n    Pauser.prototype.pause = function () { this.onNext(false); };\n\n    /**\n    * Resumes the underlying sequence.\n    */\n    Pauser.prototype.resume = function () { this.onNext(true); };\n\n    return Pauser;\n  }(Subject));\n"
  },
  {
    "path": "src/core/backpressure/stopandwait.js",
    "content": "  var StopAndWaitObservable = (function (__super__) {\n    inherits(StopAndWaitObservable, __super__);\n    function StopAndWaitObservable (source) {\n      __super__.call(this);\n      this.source = source;\n    }\n\n    function scheduleMethod(s, self) {\n      return self.source.request(1);\n    }\n\n    StopAndWaitObservable.prototype._subscribe = function (o) {\n      this.subscription = this.source.subscribe(new StopAndWaitObserver(o, this, this.subscription));\n      return new BinaryDisposable(\n        this.subscription,\n        defaultScheduler.schedule(this, scheduleMethod)\n      );\n    };\n\n    var StopAndWaitObserver = (function (__sub__) {\n      inherits(StopAndWaitObserver, __sub__);\n      function StopAndWaitObserver (observer, observable, cancel) {\n        __sub__.call(this);\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n        this.scheduleDisposable = null;\n      }\n\n      StopAndWaitObserver.prototype.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      StopAndWaitObserver.prototype.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      };\n\n      function innerScheduleMethod(s, self) {\n        return self.observable.source.request(1);\n      }\n\n      StopAndWaitObserver.prototype.next = function (value) {\n        this.observer.onNext(value);\n        this.scheduleDisposable = defaultScheduler.schedule(this, innerScheduleMethod);\n      };\n\n      StopAndWaitObserver.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        if (this.scheduleDisposable) {\n          this.scheduleDisposable.dispose();\n          this.scheduleDisposable = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return StopAndWaitObserver;\n    }(AbstractObserver));\n\n    return StopAndWaitObservable;\n  }(Observable));\n\n\n  /**\n   * Attaches a stop and wait observable to the current observable.\n   * @returns {Observable} A stop and wait observable.\n   */\n  ControlledObservable.prototype.stopAndWait = function () {\n    return new StopAndWaitObservable(this);\n  };\n"
  },
  {
    "path": "src/core/backpressure/windowed.js",
    "content": "  var WindowedObservable = (function (__super__) {\n    inherits(WindowedObservable, __super__);\n    function WindowedObservable(source, windowSize) {\n      __super__.call(this);\n      this.source = source;\n      this.windowSize = windowSize;\n    }\n\n    function scheduleMethod(s, self) {\n      return self.source.request(self.windowSize);\n    }\n\n    WindowedObservable.prototype._subscribe = function (o) {\n      this.subscription = this.source.subscribe(new WindowedObserver(o, this, this.subscription));\n      return new BinaryDisposable(\n        this.subscription,\n        defaultScheduler.schedule(this, scheduleMethod)\n      );\n    };\n\n    var WindowedObserver = (function (__sub__) {\n      inherits(WindowedObserver, __sub__);\n      function WindowedObserver(observer, observable, cancel) {\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n        this.received = 0;\n        this.scheduleDisposable = null;\n        __sub__.call(this);\n      }\n\n      WindowedObserver.prototype.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      WindowedObserver.prototype.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      };\n\n      function innerScheduleMethod(s, self) {\n        return self.observable.source.request(self.observable.windowSize);\n      }\n\n      WindowedObserver.prototype.next = function (value) {\n        this.observer.onNext(value);\n        this.received = ++this.received % this.observable.windowSize;\n        this.received === 0 && (this.scheduleDisposable = defaultScheduler.schedule(this, innerScheduleMethod));\n      };\n\n      WindowedObserver.prototype.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        if (this.scheduleDisposable) {\n          this.scheduleDisposable.dispose();\n          this.scheduleDisposable = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return WindowedObserver;\n    }(AbstractObserver));\n\n    return WindowedObservable;\n  }(Observable));\n\n  /**\n   * Creates a sliding windowed observable based upon the window size.\n   * @param {Number} windowSize The number of items in the window\n   * @returns {Observable} A windowed observable based upon the window size.\n   */\n  ControlledObservable.prototype.windowed = function (windowSize) {\n    return new WindowedObservable(this, windowSize);\n  };\n"
  },
  {
    "path": "src/core/checkedobserver.js",
    "content": "  var CheckedObserver = (function (__super__) {\n    inherits(CheckedObserver, __super__);\n\n    function CheckedObserver(observer) {\n      __super__.call(this);\n      this._observer = observer;\n      this._state = 0; // 0 - idle, 1 - busy, 2 - done\n    }\n\n    var CheckedObserverPrototype = CheckedObserver.prototype;\n\n    CheckedObserverPrototype.onNext = function (value) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onNext).call(this._observer, value);\n      this._state = 0;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onError = function (err) {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onError).call(this._observer, err);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.onCompleted = function () {\n      this.checkAccess();\n      var res = tryCatch(this._observer.onCompleted).call(this._observer);\n      this._state = 2;\n      res === errorObj && thrower(res.e);\n    };\n\n    CheckedObserverPrototype.checkAccess = function () {\n      if (this._state === 1) { throw new Error('Re-entrancy detected'); }\n      if (this._state === 2) { throw new Error('Observer completed'); }\n      if (this._state === 0) { this._state = 1; }\n    };\n\n    return CheckedObserver;\n  }(Observer));\n"
  },
  {
    "path": "src/core/concurrency/catchscheduler.js",
    "content": "  var CatchScheduler = (function (__super__) {\n    inherits(CatchScheduler, __super__);\n\n    function CatchScheduler(scheduler, handler) {\n      this._scheduler = scheduler;\n      this._handler = handler;\n      this._recursiveOriginal = null;\n      this._recursiveWrapper = null;\n      __super__.call(this);\n    }\n\n    CatchScheduler.prototype.schedule = function (state, action) {\n      return this._scheduler.schedule(state, this._wrap(action));\n    };\n\n    CatchScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      return this._scheduler.schedule(state, dueTime, this._wrap(action));\n    };\n\n    CatchScheduler.prototype.now = function () { return this._scheduler.now(); };\n\n    CatchScheduler.prototype._clone = function (scheduler) {\n        return new CatchScheduler(scheduler, this._handler);\n    };\n\n    CatchScheduler.prototype._wrap = function (action) {\n      var parent = this;\n      return function (self, state) {\n        var res = tryCatch(action)(parent._getRecursiveWrapper(self), state);\n        if (res === errorObj) {\n          if (!parent._handler(res.e)) { thrower(res.e); }\n          return disposableEmpty;\n        }\n        return disposableFixup(res);\n      };\n    };\n\n    CatchScheduler.prototype._getRecursiveWrapper = function (scheduler) {\n      if (this._recursiveOriginal !== scheduler) {\n        this._recursiveOriginal = scheduler;\n        var wrapper = this._clone(scheduler);\n        wrapper._recursiveOriginal = scheduler;\n        wrapper._recursiveWrapper = wrapper;\n        this._recursiveWrapper = wrapper;\n      }\n      return this._recursiveWrapper;\n    };\n\n    CatchScheduler.prototype.schedulePeriodic = function (state, period, action) {\n      var self = this, failed = false, d = new SingleAssignmentDisposable();\n\n      d.setDisposable(this._scheduler.schedulePeriodic(state, period, function (state1) {\n        if (failed) { return null; }\n        var res = tryCatch(action)(state1);\n        if (res === errorObj) {\n          failed = true;\n          if (!self._handler(res.e)) { thrower(res.e); }\n          d.dispose();\n          return null;\n        }\n        return res;\n      }));\n\n      return d;\n    };\n\n    return CatchScheduler;\n  }(Scheduler));\n"
  },
  {
    "path": "src/core/concurrency/currentthreadscheduler.js",
    "content": "  /**\n   * Gets a scheduler that schedules work as soon as possible on the current thread.\n   */\n  var CurrentThreadScheduler = (function (__super__) {\n    var queue;\n\n    function runTrampoline () {\n      while (queue.length > 0) {\n        var item = queue.dequeue();\n        !item.isCancelled() && item.invoke();\n      }\n    }\n\n    inherits(CurrentThreadScheduler, __super__);\n    function CurrentThreadScheduler() {\n      __super__.call(this);\n    }\n\n    CurrentThreadScheduler.prototype.schedule = function (state, action) {\n      var si = new ScheduledItem(this, state, action, this.now());\n\n      if (!queue) {\n        queue = new PriorityQueue(4);\n        queue.enqueue(si);\n\n        var result = tryCatch(runTrampoline)();\n        queue = null;\n        if (result === errorObj) { thrower(result.e); }\n      } else {\n        queue.enqueue(si);\n      }\n      return si.disposable;\n    };\n\n    CurrentThreadScheduler.prototype.scheduleRequired = function () { return !queue; };\n\n    return CurrentThreadScheduler;\n  }(Scheduler));\n\n  var currentThreadScheduler = Scheduler.currentThread = new CurrentThreadScheduler();\n"
  },
  {
    "path": "src/core/concurrency/defaultscheduler.js",
    "content": "  var scheduleMethod, clearMethod;\n\n  var localTimer = (function () {\n    var localSetTimeout, localClearTimeout = noop;\n    if (!!root.setTimeout) {\n      localSetTimeout = root.setTimeout;\n      localClearTimeout = root.clearTimeout;\n    } else if (!!root.WScript) {\n      localSetTimeout = function (fn, time) {\n        root.WScript.Sleep(time);\n        fn();\n      };\n    } else {\n      throw new NotSupportedError();\n    }\n\n    return {\n      setTimeout: localSetTimeout,\n      clearTimeout: localClearTimeout\n    };\n  }());\n  var localSetTimeout = localTimer.setTimeout,\n    localClearTimeout = localTimer.clearTimeout;\n\n  (function () {\n\n    var nextHandle = 1, tasksByHandle = {}, currentlyRunning = false;\n\n    clearMethod = function (handle) {\n      delete tasksByHandle[handle];\n    };\n\n    function runTask(handle) {\n      if (currentlyRunning) {\n        localSetTimeout(function () { runTask(handle); }, 0);\n      } else {\n        var task = tasksByHandle[handle];\n        if (task) {\n          currentlyRunning = true;\n          var result = tryCatch(task)();\n          clearMethod(handle);\n          currentlyRunning = false;\n          if (result === errorObj) { thrower(result.e); }\n        }\n      }\n    }\n\n    var reNative = new RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&\n      !reNative.test(setImmediate) && setImmediate;\n\n    function postMessageSupported () {\n      // Ensure not in a worker\n      if (!root.postMessage || root.importScripts) { return false; }\n      var isAsync = false, oldHandler = root.onmessage;\n      // Test for async\n      root.onmessage = function () { isAsync = true; };\n      root.postMessage('', '*');\n      root.onmessage = oldHandler;\n\n      return isAsync;\n    }\n\n    // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n    if (isFunction(setImmediate)) {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        setImmediate(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        process.nextTick(function () { runTask(id); });\n\n        return id;\n      };\n    } else if (postMessageSupported()) {\n      var MSG_PREFIX = 'ms.rx.schedule' + Math.random();\n\n      var onGlobalPostMessage = function (event) {\n        // Only if we're a match to avoid any other global events\n        if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n          runTask(event.data.substring(MSG_PREFIX.length));\n        }\n      };\n\n      root.addEventListener('message', onGlobalPostMessage, false);\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        root.postMessage(MSG_PREFIX + id, '*');\n        return id;\n      };\n    } else if (!!root.MessageChannel) {\n      var channel = new root.MessageChannel();\n\n      channel.port1.onmessage = function (e) { runTask(e.data); };\n\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        channel.port2.postMessage(id);\n        return id;\n      };\n    } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {\n\n      scheduleMethod = function (action) {\n        var scriptElement = root.document.createElement('script');\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n\n        scriptElement.onreadystatechange = function () {\n          runTask(id);\n          scriptElement.onreadystatechange = null;\n          scriptElement.parentNode.removeChild(scriptElement);\n          scriptElement = null;\n        };\n        root.document.documentElement.appendChild(scriptElement);\n        return id;\n      };\n\n    } else {\n      scheduleMethod = function (action) {\n        var id = nextHandle++;\n        tasksByHandle[id] = action;\n        localSetTimeout(function () {\n          runTask(id);\n        }, 0);\n\n        return id;\n      };\n    }\n  }());\n\n  /**\n   * Gets a scheduler that schedules work via a timed callback based upon platform.\n   */\n   var DefaultScheduler = (function (__super__) {\n     inherits(DefaultScheduler, __super__);\n     function DefaultScheduler() {\n       __super__.call(this);\n     }\n\n     function scheduleAction(disposable, action, scheduler, state) {\n       return function schedule() {\n         disposable.setDisposable(Disposable._fixup(action(scheduler, state)));\n       };\n     }\n\n     function ClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     ClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         clearMethod(this._id);\n       }\n     };\n\n     function LocalClearDisposable(id) {\n       this._id = id;\n       this.isDisposed = false;\n     }\n\n     LocalClearDisposable.prototype.dispose = function () {\n       if (!this.isDisposed) {\n         this.isDisposed = true;\n         localClearTimeout(this._id);\n       }\n     };\n\n    DefaultScheduler.prototype.schedule = function (state, action) {\n      var disposable = new SingleAssignmentDisposable(),\n          id = scheduleMethod(scheduleAction(disposable, action, this, state));\n      return new BinaryDisposable(disposable, new ClearDisposable(id));\n    };\n\n    DefaultScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      if (dueTime === 0) { return this.schedule(state, action); }\n      var disposable = new SingleAssignmentDisposable(),\n          id = localSetTimeout(scheduleAction(disposable, action, this, state), dueTime);\n      return new BinaryDisposable(disposable, new LocalClearDisposable(id));\n    };\n\n    function scheduleLongRunning(state, action, disposable) {\n      return function () { action(state, disposable); };\n    }\n\n    DefaultScheduler.prototype.scheduleLongRunning = function (state, action) {\n      var disposable = disposableCreate(noop);\n      scheduleMethod(scheduleLongRunning(state, action, disposable));\n      return disposable;\n    };\n\n    return DefaultScheduler;\n  }(Scheduler));\n\n  var defaultScheduler = Scheduler['default'] = Scheduler.async = new DefaultScheduler();\n"
  },
  {
    "path": "src/core/concurrency/historicalscheduler.js",
    "content": "  /** Provides a virtual time scheduler that uses Date for absolute time and number for relative time. */\n  Rx.HistoricalScheduler = (function (__super__) {\n    inherits(HistoricalScheduler, __super__);\n\n    /**\n     * Creates a new historical scheduler with the specified initial clock value.\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function HistoricalScheduler(initialClock, comparer) {\n      var clock = initialClock == null ? 0 : initialClock;\n      var cmp = comparer || defaultSubComparer;\n      __super__.call(this, clock, cmp);\n    }\n\n    var HistoricalSchedulerProto = HistoricalScheduler.prototype;\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    HistoricalSchedulerProto.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n\n    HistoricalSchedulerProto.toAbsoluteTime = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @memberOf HistoricalScheduler\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    HistoricalSchedulerProto.toRelativeTime = function (timeSpan) {\n      return timeSpan;\n    };\n\n    return HistoricalScheduler;\n  }(Rx.VirtualTimeScheduler));\n"
  },
  {
    "path": "src/core/concurrency/immediatescheduler.js",
    "content": "  /** Gets a scheduler that schedules work immediately on the current thread. */\n   var ImmediateScheduler = (function (__super__) {\n    inherits(ImmediateScheduler, __super__);\n    function ImmediateScheduler() {\n      __super__.call(this);\n    }\n\n    ImmediateScheduler.prototype.schedule = function (state, action) {\n      return disposableFixup(action(this, state));\n    };\n\n    return ImmediateScheduler;\n  }(Scheduler));\n\n  var immediateScheduler = Scheduler.immediate = new ImmediateScheduler();\n"
  },
  {
    "path": "src/core/concurrency/scheduleditem.js",
    "content": "  var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) {\n    this.scheduler = scheduler;\n    this.state = state;\n    this.action = action;\n    this.dueTime = dueTime;\n    this.comparer = comparer || defaultSubComparer;\n    this.disposable = new SingleAssignmentDisposable();\n  };\n\n  ScheduledItem.prototype.invoke = function () {\n    this.disposable.setDisposable(this.invokeCore());\n  };\n\n  ScheduledItem.prototype.compareTo = function (other) {\n    return this.comparer(this.dueTime, other.dueTime);\n  };\n\n  ScheduledItem.prototype.isCancelled = function () {\n    return this.disposable.isDisposed;\n  };\n\n  ScheduledItem.prototype.invokeCore = function () {\n    return disposableFixup(this.action(this.scheduler, this.state));\n  };\n"
  },
  {
    "path": "src/core/concurrency/scheduleperiodicrecursive.js",
    "content": "  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function createTick(self) {\n      return function tick(command, recurse) {\n        recurse(0, self._period);\n        var state = tryCatch(self._action)(self._state);\n        if (state === errorObj) {\n          self._cancel.dispose();\n          thrower(state.e);\n        }\n        self._state = state;\n      };\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveFuture(0, this._period, createTick(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n"
  },
  {
    "path": "src/core/concurrency/scheduler.js",
    "content": "  /** Provides a set of static properties to access commonly used schedulers. */\n  var Scheduler = Rx.Scheduler = (function () {\n\n    function Scheduler() { }\n\n    /** Determines whether the given object is a scheduler */\n    Scheduler.isScheduler = function (s) {\n      return s instanceof Scheduler;\n    };\n\n    var schedulerProto = Scheduler.prototype;\n\n    /**\n   * Schedules an action to be executed.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.schedule = function (state, action) {\n      throw new NotImplementedError();\n    };\n\n  /**\n   * Schedules an action to be executed after dueTime.\n   * @param state State passed to the action to be executed.\n   * @param {Function} action Action to be executed.\n   * @param {Number} dueTime Relative time after which to execute the action.\n   * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n   */\n    schedulerProto.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime;\n      dt instanceof Date && (dt = dt - this.now());\n      dt = Scheduler.normalize(dt);\n\n      if (dt === 0) { return this.schedule(state, action); }\n\n      return this._scheduleFuture(state, dt, action);\n    };\n\n    schedulerProto._scheduleFuture = function (state, dueTime, action) {\n      throw new NotImplementedError();\n    };\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.now = defaultNow;\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.prototype.now = defaultNow;\n\n    /**\n     * Normalizes the specified TimeSpan value to a positive value.\n     * @param {Number} timeSpan The time span value to normalize.\n     * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n     */\n    Scheduler.normalize = function (timeSpan) {\n      timeSpan < 0 && (timeSpan = 0);\n      return timeSpan;\n    };\n\n    return Scheduler;\n  }());\n\n  var normalizeTime = Scheduler.normalize, isScheduler = Scheduler.isScheduler;\n"
  },
  {
    "path": "src/core/concurrency/scheduler.periodic.js",
    "content": "  (function (schedulerProto) {\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    schedulerProto.schedulePeriodic = function(state, period, action) {\n      if (typeof root.setInterval === 'undefined') { throw new NotSupportedError(); }\n      period = normalizeTime(period);\n      var s = state, id = root.setInterval(function () { s = action(s); }, period);\n      return disposableCreate(function () { root.clearInterval(id); });\n    };\n\n  }(Scheduler.prototype));\n"
  },
  {
    "path": "src/core/concurrency/scheduler.recursive.js",
    "content": "  (function (schedulerProto) {\n\n    function invokeRecImmediate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.schedule(state2, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    function invokeRecDate(scheduler, pair) {\n      var state = pair[0], action = pair[1], group = new CompositeDisposable();\n      action(state, innerAction);\n      return group;\n\n      function innerAction(state2, dueTime1) {\n        var isAdded = false, isDone = false;\n\n        var d = scheduler.scheduleFuture(state2, dueTime1, scheduleWork);\n        if (!isDone) {\n          group.add(d);\n          isAdded = true;\n        }\n\n        function scheduleWork(_, state3) {\n          if (isAdded) {\n            group.remove(d);\n          } else {\n            isDone = true;\n          }\n          action(state3, innerAction);\n          return disposableEmpty;\n        }\n      }\n    }\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursive = function (state, action) {\n      return this.schedule([state, action], invokeRecImmediate);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative or absolute due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number | Date} dueTime Relative or absolute time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveFuture = function (state, dueTime, action) {\n      return this.scheduleFuture([state, action], dueTime, invokeRecDate);\n    };\n\n  }(Scheduler.prototype));\n"
  },
  {
    "path": "src/core/concurrency/scheduler.wrappers.js",
    "content": "  (function (schedulerProto) {\n    /**\n     * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n     * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n     * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n     */\n    schedulerProto.catchError = schedulerProto['catch'] = function (handler) {\n      return new CatchScheduler(this, handler);\n    };\n  }(Scheduler.prototype));\n"
  },
  {
    "path": "src/core/concurrency/virtualtimescheduler.js",
    "content": "  /** Provides a set of extension methods for virtual time scheduling. */\n  var VirtualTimeScheduler = Rx.VirtualTimeScheduler = (function (__super__) {\n    inherits(VirtualTimeScheduler, __super__);\n\n    /**\n     * Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer.\n     *\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function VirtualTimeScheduler(initialClock, comparer) {\n      this.clock = initialClock;\n      this.comparer = comparer;\n      this.isEnabled = false;\n      this.queue = new PriorityQueue(1024);\n      __super__.call(this);\n    }\n\n    var VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype;\n\n    VirtualTimeSchedulerPrototype.now = function () {\n      return this.toAbsoluteTime(this.clock);\n    };\n\n    VirtualTimeSchedulerPrototype.schedule = function (state, action) {\n      return this.scheduleAbsolute(state, this.clock, action);\n    };\n\n    VirtualTimeSchedulerPrototype.scheduleFuture = function (state, dueTime, action) {\n      var dt = dueTime instanceof Date ?\n        this.toRelativeTime(dueTime - this.now()) :\n        this.toRelativeTime(dueTime);\n\n      return this.scheduleRelative(state, dt, action);\n    };\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    VirtualTimeSchedulerPrototype.add = notImplemented;\n\n    /**\n     * Converts an absolute time to a number\n     * @param {Any} The absolute time.\n     * @returns {Number} The absolute time in ms\n     */\n    VirtualTimeSchedulerPrototype.toAbsoluteTime = notImplemented;\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    VirtualTimeSchedulerPrototype.toRelativeTime = notImplemented;\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be emulated using recursive scheduling.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.schedulePeriodic = function (state, period, action) {\n      var s = new SchedulePeriodicRecursive(this, state, period, action);\n      return s.start();\n    };\n\n    /**\n     * Schedules an action to be executed after dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleRelative = function (state, dueTime, action) {\n      var runAt = this.add(this.clock, dueTime);\n      return this.scheduleAbsolute(state, runAt, action);\n    };\n\n    /**\n     * Starts the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.start = function () {\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n      }\n    };\n\n    /**\n     * Stops the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.stop = function () {\n      this.isEnabled = false;\n    };\n\n    /**\n     * Advances the scheduler's clock to the specified time, running all work till that point.\n     * @param {Number} time Absolute time to advance the scheduler's clock to.\n     */\n    VirtualTimeSchedulerPrototype.advanceTo = function (time) {\n      var dueToClock = this.comparer(this.clock, time);\n      if (this.comparer(this.clock, time) > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) { return; }\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null && this.comparer(next.dueTime, time) <= 0) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n        this.clock = time;\n      }\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.advanceBy = function (time) {\n      var dt = this.add(this.clock, time),\n          dueToClock = this.comparer(this.clock, dt);\n      if (dueToClock > 0) { throw new ArgumentOutOfRangeError(); }\n      if (dueToClock === 0) {  return; }\n\n      this.advanceTo(dt);\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.sleep = function (time) {\n      var dt = this.add(this.clock, time);\n      if (this.comparer(this.clock, dt) >= 0) { throw new ArgumentOutOfRangeError(); }\n\n      this.clock = dt;\n    };\n\n    /**\n     * Gets the next scheduled item to be executed.\n     * @returns {ScheduledItem} The next scheduled item.\n     */\n    VirtualTimeSchedulerPrototype.getNext = function () {\n      while (this.queue.length > 0) {\n        var next = this.queue.peek();\n        if (next.isCancelled()) {\n          this.queue.dequeue();\n        } else {\n          return next;\n        }\n      }\n      return null;\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleAbsolute = function (state, dueTime, action) {\n      var self = this;\n\n      function run(scheduler, state1) {\n        self.queue.remove(si);\n        return action(scheduler, state1);\n      }\n\n      var si = new ScheduledItem(this, state, run, dueTime, this.comparer);\n      this.queue.enqueue(si);\n\n      return si.disposable;\n    };\n\n    return VirtualTimeScheduler;\n  }(Scheduler));\n"
  },
  {
    "path": "src/core/disposables/binarydisposable.js",
    "content": "  var BinaryDisposable = Rx.BinaryDisposable = function (first, second) {\n    this._first = first;\n    this._second = second;\n    this.isDisposed = false;\n  };\n\n  BinaryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old1 = this._first;\n      this._first = null;\n      old1 && old1.dispose();\n      var old2 = this._second;\n      this._second = null;\n      old2 && old2.dispose();\n    }\n  };\n\n  var NAryDisposable = Rx.NAryDisposable = function (disposables) {\n    this._disposables = disposables;\n    this.isDisposed = false;\n  };\n\n  NAryDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      for (var i = 0, len = this._disposables.length; i < len; i++) {\n        this._disposables[i].dispose();\n      }\n      this._disposables.length = 0;\n    }\n  };\n"
  },
  {
    "path": "src/core/disposables/booleandisposable.js",
    "content": "  // Single assignment\n  var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SingleAssignmentDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SingleAssignmentDisposable.prototype.setDisposable = function (value) {\n    if (this.current) { throw new Error('Disposable has already been assigned'); }\n    var shouldDispose = this.isDisposed;\n    !shouldDispose && (this.current = value);\n    shouldDispose && value && value.dispose();\n  };\n  SingleAssignmentDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n      old && old.dispose();\n    }\n  };\n\n  // Multiple assignment disposable\n  var SerialDisposable = Rx.SerialDisposable = function () {\n    this.isDisposed = false;\n    this.current = null;\n  };\n  SerialDisposable.prototype.getDisposable = function () {\n    return this.current;\n  };\n  SerialDisposable.prototype.setDisposable = function (value) {\n    var shouldDispose = this.isDisposed;\n    if (!shouldDispose) {\n      var old = this.current;\n      this.current = value;\n    }\n    old && old.dispose();\n    shouldDispose && value && value.dispose();\n  };\n  SerialDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var old = this.current;\n      this.current = null;\n    }\n    old && old.dispose();\n  };\n"
  },
  {
    "path": "src/core/disposables/compositedisposable.js",
    "content": "  /**\n   * Represents a group of disposable resources that are disposed together.\n   * @constructor\n   */\n  var CompositeDisposable = Rx.CompositeDisposable = function () {\n    var args = [], i, len;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      len = arguments.length;\n      args = new Array(len);\n      for(i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    this.disposables = args;\n    this.isDisposed = false;\n    this.length = args.length;\n  };\n\n  var CompositeDisposablePrototype = CompositeDisposable.prototype;\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Mixed} item Disposable to add.\n   */\n  CompositeDisposablePrototype.add = function (item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n      this.length++;\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Mixed} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n  CompositeDisposablePrototype.remove = function (item) {\n    var shouldDispose = false;\n    if (!this.isDisposed) {\n      var idx = this.disposables.indexOf(item);\n      if (idx !== -1) {\n        shouldDispose = true;\n        this.disposables.splice(idx, 1);\n        this.length--;\n        item.dispose();\n      }\n    }\n    return shouldDispose;\n  };\n\n  /**\n   *  Disposes all disposables in the group and removes them from the group.\n   */\n  CompositeDisposablePrototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      var len = this.disposables.length, currentDisposables = new Array(len);\n      for(var i = 0; i < len; i++) { currentDisposables[i] = this.disposables[i]; }\n      this.disposables = [];\n      this.length = 0;\n\n      for (i = 0; i < len; i++) {\n        currentDisposables[i].dispose();\n      }\n    }\n  };\n"
  },
  {
    "path": "src/core/disposables/disposable.js",
    "content": "  /**\n   * Provides a set of static methods for creating Disposables.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   */\n  var Disposable = Rx.Disposable = function (action) {\n    this.isDisposed = false;\n    this.action = action || noop;\n  };\n\n  /** Performs the task of cleaning up resources. */\n  Disposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.action();\n      this.isDisposed = true;\n    }\n  };\n\n  /**\n   * Creates a disposable object that invokes the specified action when disposed.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   * @return {Disposable} The disposable object that runs the given action upon disposal.\n   */\n  var disposableCreate = Disposable.create = function (action) { return new Disposable(action); };\n\n  /**\n   * Gets the disposable that does nothing when disposed.\n   */\n  var disposableEmpty = Disposable.empty = { dispose: noop };\n\n  /**\n   * Validates whether the given object is a disposable\n   * @param {Object} Object to test whether it has a dispose method\n   * @returns {Boolean} true if a disposable object, else false.\n   */\n  var isDisposable = Disposable.isDisposable = function (d) {\n    return d && isFunction(d.dispose);\n  };\n\n  var checkDisposed = Disposable.checkDisposed = function (disposable) {\n    if (disposable.isDisposed) { throw new ObjectDisposedError(); }\n  };\n\n  var disposableFixup = Disposable._fixup = function (result) {\n    return isDisposable(result) ? result : disposableEmpty;\n  };\n"
  },
  {
    "path": "src/core/disposables/refcountdisposable.js",
    "content": "  /**\n   * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n   */\n  var RefCountDisposable = Rx.RefCountDisposable = (function () {\n\n    function InnerDisposable(disposable) {\n      this.disposable = disposable;\n      this.disposable.count++;\n      this.isInnerDisposed = false;\n    }\n\n    InnerDisposable.prototype.dispose = function () {\n      if (!this.disposable.isDisposed && !this.isInnerDisposed) {\n        this.isInnerDisposed = true;\n        this.disposable.count--;\n        if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {\n          this.disposable.isDisposed = true;\n          this.disposable.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Initializes a new instance of the RefCountDisposable with the specified disposable.\n     * @constructor\n     * @param {Disposable} disposable Underlying disposable.\n      */\n    function RefCountDisposable(disposable) {\n      this.underlyingDisposable = disposable;\n      this.isDisposed = false;\n      this.isPrimaryDisposed = false;\n      this.count = 0;\n    }\n\n    /**\n     * Disposes the underlying disposable only when all dependent disposables have been disposed\n     */\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed && !this.isPrimaryDisposed) {\n        this.isPrimaryDisposed = true;\n        if (this.count === 0) {\n          this.isDisposed = true;\n          this.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n     * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n     */\n    RefCountDisposable.prototype.getDisposable = function () {\n      return this.isDisposed ? disposableEmpty : new InnerDisposable(this);\n    };\n\n    return RefCountDisposable;\n  })();\n"
  },
  {
    "path": "src/core/disposables/scheduleddisposable.js",
    "content": "  function ScheduledDisposable(scheduler, disposable) {\n    this.scheduler = scheduler;\n    this.disposable = disposable;\n    this.isDisposed = false;\n  }\n\n  function scheduleItem(s, self) {\n    if (!self.isDisposed) {\n      self.isDisposed = true;\n      self.disposable.dispose();\n    }\n  }\n\n  ScheduledDisposable.prototype.dispose = function () {\n    this.scheduler.schedule(this, scheduleItem);\n  };\n"
  },
  {
    "path": "src/core/enumerable.js",
    "content": "  var Enumerable = Rx.internals.Enumerable = function () { };\n\n  function IsDisposedDisposable(state) {\n    this._s = state;\n    this.isDisposed = false;\n  }\n\n  IsDisposedDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      this._s.isDisposed = true;\n    }\n  };\n\n  var ConcatEnumerableObservable = (function(__super__) {\n    inherits(ConcatEnumerableObservable, __super__);\n    function ConcatEnumerableObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    ConcatEnumerableObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        o: o,\n        subscription: subscription,\n        e: this.sources[$iterator$]()\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.o.onError(e); };\n    InnerObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return ConcatEnumerableObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.concat = function () {\n    return new ConcatEnumerableObservable(this);\n  };\n\n  var CatchErrorObservable = (function(__super__) {\n    function CatchErrorObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    inherits(CatchErrorObservable, __super__);\n\n    function scheduleMethod(state, recurse) {\n      if (state.isDisposed) { return; }\n      var currentItem = tryCatch(state.e.next).call(state.e);\n      if (currentItem === errorObj) { return state.o.onError(currentItem.e); }\n      if (currentItem.done) { return state.lastError !== null ? state.o.onError(state.lastError) : state.o.onCompleted(); }\n\n      var currentValue = currentItem.value;\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new InnerObserver(state, recurse)));\n    }\n\n    CatchErrorObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable();\n      var state = {\n        isDisposed: false,\n        e: this.sources[$iterator$](),\n        subscription: subscription,\n        lastError: null,\n        o: o\n      };\n\n      var cancelable = currentThreadScheduler.scheduleRecursive(state, scheduleMethod);\n      return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n    };\n\n    function InnerObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      AbstractObserver.call(this);\n    }\n\n    inherits(InnerObserver, AbstractObserver);\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._state.lastError = e; this._recurse(this._state); };\n    InnerObserver.prototype.completed = function () { this._state.o.onCompleted(); };\n\n    return CatchErrorObservable;\n  }(ObservableBase));\n\n  Enumerable.prototype.catchError = function () {\n    return new CatchErrorObservable(this);\n  };\n\n  var RepeatEnumerable = (function (__super__) {\n    inherits(RepeatEnumerable, __super__);\n    function RepeatEnumerable(v, c) {\n      this.v = v;\n      this.c = c == null ? -1 : c;\n    }\n\n    RepeatEnumerable.prototype[$iterator$] = function () {\n      return new RepeatEnumerator(this);\n    };\n\n    function RepeatEnumerator(p) {\n      this.v = p.v;\n      this.l = p.c;\n    }\n\n    RepeatEnumerator.prototype.next = function () {\n      if (this.l === 0) { return doneEnumerator; }\n      if (this.l > 0) { this.l--; }\n      return { done: false, value: this.v };\n    };\n\n    return RepeatEnumerable;\n  }(Enumerable));\n\n  var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) {\n    return new RepeatEnumerable(value, repeatCount);\n  };\n\n  var OfEnumerable = (function(__super__) {\n    inherits(OfEnumerable, __super__);\n    function OfEnumerable(s, fn, thisArg) {\n      this.s = s;\n      this.fn = fn ? bindCallback(fn, thisArg, 3) : null;\n    }\n    OfEnumerable.prototype[$iterator$] = function () {\n      return new OfEnumerator(this);\n    };\n\n    function OfEnumerator(p) {\n      this.i = -1;\n      this.s = p.s;\n      this.l = this.s.length;\n      this.fn = p.fn;\n    }\n\n    OfEnumerator.prototype.next = function () {\n     return ++this.i < this.l ?\n       { done: false, value: !this.fn ? this.s[this.i] : this.fn(this.s[this.i], this.i, this.s) } :\n       doneEnumerator;\n    };\n\n    return OfEnumerable;\n  }(Enumerable));\n\n  var enumerableOf = Enumerable.of = function (source, selector, thisArg) {\n    return new OfEnumerable(source, selector, thisArg);\n  };\n"
  },
  {
    "path": "src/core/expressions/ExpressionTrees.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\TypeScript\\Microsoft.TypeScript.Default.props\" Condition=\"Exists('$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\TypeScript\\Microsoft.TypeScript.Default.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <ProjectGuid>{9286B3D5-AAB5-41FB-B205-ED0ACADBDB98}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <OutputPath>bin</OutputPath>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <DebugType>full</DebugType>\n    <DebugSymbols>true</DebugSymbols>\n    <TypeScriptToolsVersion>1.4</TypeScriptToolsVersion>\n    <UseIISExpress>true</UseIISExpress>\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n  </PropertyGroup>\n  <ItemGroup>\n    <Service Include=\"{4A0DDDB5-7A95-4FBF-97CC-616D07737A77}\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"app.css\" />\n    <Content Include=\"index.html\" />\n    <Content Include=\"web.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <TypeScriptCompile Include=\"app.ts\" />\n    <TypeScriptCompile Include=\"compiler.ts\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"web.Debug.config\">\n      <DependentUpon>web.config</DependentUpon>\n    </None>\n    <None Include=\"web.Release.config\">\n      <DependentUpon>web.config</DependentUpon>\n    </None>\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">12.0</VisualStudioVersion>\n  </PropertyGroup>\n  <PropertyGroup>\n    <RootNamespace>ExpressionTrees</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"Exists('$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\WebApplications\\Microsoft.WebApplication.targets')\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>18636</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost:18636/</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <PropertyGroup Condition=\"'$(Configuration)' == 'Debug'\">\n    <TypeScriptRemoveComments>false</TypeScriptRemoveComments>\n    <TypeScriptSourceMap>true</TypeScriptSourceMap>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)' == 'Release'\">\n    <TypeScriptRemoveComments>true</TypeScriptRemoveComments>\n    <TypeScriptSourceMap>false</TypeScriptSourceMap>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\TypeScript\\Microsoft.TypeScript.targets\" Condition=\"Exists('$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\TypeScript\\Microsoft.TypeScript.targets')\" />\n</Project>"
  },
  {
    "path": "src/core/expressions/ExpressionTrees.csproj.user",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <StartPageUrl>\n          </StartPageUrl>\n          <StartAction>CurrentPage</StartAction>\n          <AspNetDebugging>True</AspNetDebugging>\n          <SilverlightDebugging>False</SilverlightDebugging>\n          <NativeDebugging>False</NativeDebugging>\n          <SQLDebugging>False</SQLDebugging>\n          <ExternalProgram>\n          </ExternalProgram>\n          <StartExternalURL>\n          </StartExternalURL>\n          <StartCmdLineArguments>\n          </StartCmdLineArguments>\n          <StartWorkingDirectory>\n          </StartWorkingDirectory>\n          <EnableENC>True</EnableENC>\n          <AlwaysStartWebServerOnDebug>True</AlwaysStartWebServerOnDebug>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n</Project>"
  },
  {
    "path": "src/core/expressions/ExpressionTrees.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.22823.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ExpressionTrees\", \"ExpressionTrees.csproj\", \"{9286B3D5-AAB5-41FB-B205-ED0ACADBDB98}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{9286B3D5-AAB5-41FB-B205-ED0ACADBDB98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9286B3D5-AAB5-41FB-B205-ED0ACADBDB98}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{9286B3D5-AAB5-41FB-B205-ED0ACADBDB98}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9286B3D5-AAB5-41FB-B205-ED0ACADBDB98}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "src/core/expressions/app.css",
    "content": "﻿body {\n    font-family: 'Segoe UI', sans-serif;\n}\n\nspan {\n    font-style: italic;\n}\n"
  },
  {
    "path": "src/core/expressions/app.js",
    "content": "/// <reference path=\"compiler.ts\" />\nvar Tests = (function () {\n    function Tests(element) {\n        this.element = element;\n    }\n    Tests.prototype.start = function () {\n        var e = Expression.add(Expression.constant(1), Expression.constant(2));\n        var l = Expression.lambda(e);\n        var c = l.compileToFunction();\n        var f = l.compile();\n        var b = l.toBonsai();\n        var x = f();\n        this.element.innerHTML = \"Eval(\" + l + \") = Eval(\" + c + \") = Eval(\" + JSON.stringify(b) + \") = \" + x;\n    };\n    return Tests;\n})();\nwindow.onload = function () {\n    var el = document.getElementById('content');\n    var tests = new Tests(el);\n    tests.start();\n};\n/*\nvar resources =\n  {\n    \"my://xs\": [1, 2, 3, 4, 5],\n    \"my://ss\": [\"bar\", \"foo\", \"qux\"],\n    \"rx://operators/filter\": function (xs: any[], f: (any) => boolean) { return xs.filter(f); },\n    \"rx://operators/map\": function (xs: any[], f: (any) => any) { return xs.map(f); },\n  };\n\nvar x = Expression.Parameter(\"x\");\nvar f1 =\n  Expression.Invoke(\n    Expression.Parameter(\"rx://operators/map\"),\n    Expression.Invoke(\n      Expression.Parameter(\"rx://operators/filter\"),\n      Expression.Parameter(\"my://xs\"),\n      Expression.Lambda<(number) => boolean>(\n        Expression.Equal(\n          Expression.Modulo(\n            x,\n            Expression.Constant(2)\n            ),\n          Expression.Constant(0)\n          ),\n        x\n        )\n      ),\n    Expression.Lambda<(number) => boolean>(\n      Expression.Multiply(\n        x,\n        x\n        ),\n      x\n      )\n    );\n\nvar f2 =\n  Expression.Invoke(\n    Expression.Parameter(\"rx://operators/map\"),\n    Expression.Parameter(\"my://ss\"),\n    Expression.Lambda<(string) => string>(\n      Expression.Call(\n        x,\n        \"substring\",\n        Expression.Constant(1)\n        ),\n      x\n      )\n    );\n\nvar binder = new Binder(resources);\n\nvar b1 = Expression.Lambda<() => number[]>(binder.Visit(f1));\nvar c1 = b1.Compile();\nvar r1 = c1();\nalert(r1.join(\", \"));\n\nvar b2 = Expression.Lambda<() => string[]>(binder.Visit(f2));\nvar c2 = b2.Compile();\nvar r2 = c2();\nalert(r2.join(\", \"));\n*/ \n//# sourceMappingURL=app.js.map"
  },
  {
    "path": "src/core/expressions/app.ts",
    "content": "﻿/// <reference path=\"compiler.ts\" />\n\nclass Tests {\n    element: HTMLElement;\n\n    constructor(element: HTMLElement) {\n        this.element = element;\n    }\n\n    start() {\n        var e = Expression.add(Expression.constant(1), Expression.constant(2));\n        var l = Expression.lambda<() => number>(e);\n        var c = l.compileToFunction();\n        var f = l.compile();\n        var b = l.toBonsai();\n        var x = f();\n        this.element.innerHTML = \"Eval(\" + l + \") = Eval(\" + c + \") = Eval(\" + JSON.stringify(b) + \") = \" + x;\n    }\n}\n\nwindow.onload = () => {\n    var el = document.getElementById('content');\n    var tests = new Tests(el);\n    tests.start();\n};\n\n/*\nvar resources =\n  {\n    \"my://xs\": [1, 2, 3, 4, 5],\n    \"my://ss\": [\"bar\", \"foo\", \"qux\"],\n    \"rx://operators/filter\": function (xs: any[], f: (any) => boolean) { return xs.filter(f); },\n    \"rx://operators/map\": function (xs: any[], f: (any) => any) { return xs.map(f); },\n  };\n\nvar x = Expression.Parameter(\"x\");\nvar f1 =\n  Expression.Invoke(\n    Expression.Parameter(\"rx://operators/map\"),\n    Expression.Invoke(\n      Expression.Parameter(\"rx://operators/filter\"),\n      Expression.Parameter(\"my://xs\"),\n      Expression.Lambda<(number) => boolean>(\n        Expression.Equal(\n          Expression.Modulo(\n            x,\n            Expression.Constant(2)\n            ),\n          Expression.Constant(0)\n          ),\n        x\n        )\n      ),\n    Expression.Lambda<(number) => boolean>(\n      Expression.Multiply(\n        x,\n        x\n        ),\n      x\n      )\n    );\n\nvar f2 =\n  Expression.Invoke(\n    Expression.Parameter(\"rx://operators/map\"),\n    Expression.Parameter(\"my://ss\"),\n    Expression.Lambda<(string) => string>(\n      Expression.Call(\n        x,\n        \"substring\",\n        Expression.Constant(1)\n        ),\n      x\n      )\n    );\n\nvar binder = new Binder(resources);\n\nvar b1 = Expression.Lambda<() => number[]>(binder.Visit(f1));\nvar c1 = b1.Compile();\nvar r1 = c1();\nalert(r1.join(\", \"));\n\nvar b2 = Expression.Lambda<() => string[]>(binder.Visit(f2));\nvar c2 = b2.Compile();\nvar r2 = c2();\nalert(r2.join(\", \"));\n*/"
  },
  {
    "path": "src/core/expressions/compiler.js",
    "content": "var __extends = this.__extends || function (d, b) {\n    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];\n    function __() { this.constructor = d; }\n    __.prototype = b.prototype;\n    d.prototype = new __();\n};\nvar Expression = (function () {\n    function Expression(nodeType) {\n        this.nodeType = nodeType;\n    }\n    Expression.prototype.accept = function (visitor) {\n        throw new Error(\"not implemented\");\n    };\n    Expression.prototype.acceptGeneric = function (visitor) {\n        throw new Error(\"not implemented\");\n    };\n    Expression.prototype.toString = function () {\n        return new PrintVisitor().visit(this);\n    };\n    Expression.prototype.toBonsai = function () {\n        return new BonsaiVisitor().visit(this);\n    };\n    Expression.constant = function (value) {\n        return new ConstantExpression(value);\n    };\n    Expression.parameter = function (name) {\n        return new ParameterExpression(name);\n    };\n    Expression.condition = function (test, ifTrue, ifFalse) {\n        return new ConditionalExpression(test, ifTrue, ifFalse);\n    };\n    Expression.add = function (left, right) {\n        return new BinaryExpression(3 /* Add */, left, right);\n    };\n    Expression.subtract = function (left, right) {\n        return new BinaryExpression(4 /* Subtract */, left, right);\n    };\n    Expression.multiply = function (left, right) {\n        return new BinaryExpression(5 /* Multiply */, left, right);\n    };\n    Expression.divide = function (left, right) {\n        return new BinaryExpression(6 /* Divide */, left, right);\n    };\n    Expression.modulo = function (left, right) {\n        return new BinaryExpression(7 /* Modulo */, left, right);\n    };\n    Expression.and = function (left, right) {\n        return new BinaryExpression(8 /* And */, left, right);\n    };\n    Expression.andAlso = function (left, right) {\n        return new BinaryExpression(10 /* AndAlso */, left, right);\n    };\n    Expression.or = function (left, right) {\n        return new BinaryExpression(9 /* Or */, left, right);\n    };\n    Expression.orElse = function (left, right) {\n        return new BinaryExpression(11 /* OrElse */, left, right);\n    };\n    Expression.exclusiveOr = function (left, right) {\n        return new BinaryExpression(12 /* ExclusiveOr */, left, right);\n    };\n    Expression.equal = function (left, right) {\n        return new BinaryExpression(13 /* Equal */, left, right);\n    };\n    Expression.notEqual = function (left, right) {\n        return new BinaryExpression(14 /* NotEqual */, left, right);\n    };\n    Expression.lessThan = function (left, right) {\n        return new BinaryExpression(15 /* LessThan */, left, right);\n    };\n    Expression.lessThanOrEqual = function (left, right) {\n        return new BinaryExpression(16 /* LessThanOrEqual */, left, right);\n    };\n    Expression.greaterThan = function (left, right) {\n        return new BinaryExpression(17 /* GreaterThan */, left, right);\n    };\n    Expression.greaterThanOrEqual = function (left, right) {\n        return new BinaryExpression(18 /* GreaterThanOrEqual */, left, right);\n    };\n    Expression.leftShift = function (left, right) {\n        return new BinaryExpression(19 /* LeftShift */, left, right);\n    };\n    Expression.rightShift = function (left, right) {\n        return new BinaryExpression(20 /* RightShift */, left, right);\n    };\n    Expression.not = function (operand) {\n        return new UnaryExpression(22 /* Not */, operand);\n    };\n    Expression.unaryPlus = function (operand) {\n        return new UnaryExpression(24 /* UnaryPlus */, operand);\n    };\n    Expression.negate = function (operand) {\n        return new UnaryExpression(23 /* Negate */, operand);\n    };\n    Expression.onesComplement = function (operand) {\n        return new UnaryExpression(25 /* OnesComplement */, operand);\n    };\n    Expression.lambda = function (body) {\n        var parameters = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            parameters[_i - 1] = arguments[_i];\n        }\n        return new LambdaExpression(body, parameters);\n    };\n    Expression.invoke = function (expression) {\n        var args = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n        }\n        return new InvocationExpression(expression, args);\n    };\n    Expression.new = function (typeName) {\n        var args = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n        }\n        return new NewExpression(typeName, args);\n    };\n    Expression.functionCall = function (obj, methodName) {\n        var args = [];\n        for (var _i = 2; _i < arguments.length; _i++) {\n            args[_i - 2] = arguments[_i];\n        }\n        return new FunctionCallExpression(obj, methodName, args);\n    };\n    Expression.member = function (obj, memberName) {\n        return new MemberExpression(obj, memberName);\n    };\n    Expression.index = function (obj) {\n        var args = [];\n        for (var _i = 1; _i < arguments.length; _i++) {\n            args[_i - 1] = arguments[_i];\n        }\n        return new IndexExpression(obj, args);\n    };\n    return Expression;\n})();\nvar ExpressionVisitorGeneric = (function () {\n    function ExpressionVisitorGeneric() {\n    }\n    ExpressionVisitorGeneric.prototype.visit = function (node) {\n        if (node === null) {\n            return null;\n        }\n        return node.acceptGeneric(this);\n    };\n    ExpressionVisitorGeneric.prototype.visitConstant = function (node) {\n        throw new Error(\"not implemented\");\n    };\n    ExpressionVisitorGeneric.prototype.visitParameter = function (node) {\n        throw new Error(\"not implemented\");\n    };\n    ExpressionVisitorGeneric.prototype.visitBinary = function (node) {\n        throw new Error(\"not implemented\");\n    };\n    ExpressionVisitorGeneric.prototype.visitUnary = function (node) {\n        throw new Error(\"not implemented\");\n    };\n    ExpressionVisitorGeneric.prototype.visitConditional = function (node) {\n        throw new Error(\"not implemented\");\n    };\n    ExpressionVisitorGeneric.prototype.visitLambda = function (node) {\n        throw new Error(\"not implemented\");\n    };\n    ExpressionVisitorGeneric.prototype.visitInvoke = function (node) {\n        throw new Error(\"not implemented\");\n    };\n    ExpressionVisitorGeneric.prototype.visitCall = function (node) {\n        throw new Error(\"not implemented\");\n    };\n    ExpressionVisitorGeneric.prototype.visitNew = function (node) {\n        throw new Error(\"not implemented\");\n    };\n    ExpressionVisitorGeneric.prototype.visitMember = function (node) {\n        throw new Error(\"not implemented\");\n    };\n    ExpressionVisitorGeneric.prototype.visitIndex = function (node) {\n        throw new Error(\"not implemented\");\n    };\n    ExpressionVisitorGeneric.prototype.visitMany = function (nodes) {\n        var res = new Array(nodes.length);\n        for (var i = 0; i < nodes.length; i++) {\n            var oldNode = nodes[i];\n            var newNode = this.visit(oldNode);\n            res[i] = newNode;\n        }\n        return res;\n    };\n    return ExpressionVisitorGeneric;\n})();\nvar ExpressionVisitor = (function () {\n    function ExpressionVisitor() {\n    }\n    ExpressionVisitor.prototype.visit = function (node) {\n        if (node === null) {\n            return null;\n        }\n        return node.accept(this);\n    };\n    ExpressionVisitor.prototype.visitConstant = function (node) {\n        return node;\n    };\n    ExpressionVisitor.prototype.visitParameter = function (node) {\n        return node;\n    };\n    ExpressionVisitor.prototype.visitBinary = function (node) {\n        return node.update(this.visit(node.left), this.visit(node.right));\n    };\n    ExpressionVisitor.prototype.visitUnary = function (node) {\n        return node.update(this.visit(node.operand));\n    };\n    ExpressionVisitor.prototype.visitConditional = function (node) {\n        return node.update(this.visit(node.test), this.visit(node.ifTrue), this.visit(node.ifFalse));\n    };\n    ExpressionVisitor.prototype.visitLambda = function (node) {\n        return node.update(this.visit(node.body), this.visitMany(node.parameters));\n    };\n    ExpressionVisitor.prototype.visitInvoke = function (node) {\n        return node.update(this.visit(node.expression), this.visitMany(node.args));\n    };\n    ExpressionVisitor.prototype.visitCall = function (node) {\n        return node.update(this.visit(node.obj), this.visitMany(node.args));\n    };\n    ExpressionVisitor.prototype.visitNew = function (node) {\n        return node.update(this.visitMany(node.args));\n    };\n    ExpressionVisitor.prototype.visitMember = function (node) {\n        return node.update(this.visit(node.obj));\n    };\n    ExpressionVisitor.prototype.visitIndex = function (node) {\n        return node.update(this.visit(node.obj), this.visitMany(node.args));\n    };\n    ExpressionVisitor.prototype.visitMany = function (nodes) {\n        var res = new Array(nodes.length);\n        for (var i = 0; i < nodes.length; i++) {\n            var oldNode = nodes[i];\n            var newNode = this.visit(oldNode);\n            res[i] = newNode;\n        }\n        return res;\n    };\n    return ExpressionVisitor;\n})();\nvar ConstantExpression = (function (_super) {\n    __extends(ConstantExpression, _super);\n    function ConstantExpression(value) {\n        _super.call(this, 0 /* Constant */);\n        this._value = value;\n    }\n    Object.defineProperty(ConstantExpression.prototype, \"value\", {\n        get: function () {\n            return this._value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ConstantExpression.prototype.accept = function (visitor) {\n        return visitor.visitConstant(this);\n    };\n    ConstantExpression.prototype.acceptGeneric = function (visitor) {\n        return visitor.visitConstant(this);\n    };\n    return ConstantExpression;\n})(Expression);\nvar ParameterExpression = (function (_super) {\n    __extends(ParameterExpression, _super);\n    function ParameterExpression(name) {\n        _super.call(this, 1 /* Parameter */);\n        this._name = name;\n    }\n    Object.defineProperty(ParameterExpression.prototype, \"name\", {\n        get: function () {\n            return this._name;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ParameterExpression.prototype.accept = function (visitor) {\n        return visitor.visitParameter(this);\n    };\n    ParameterExpression.prototype.acceptGeneric = function (visitor) {\n        return visitor.visitParameter(this);\n    };\n    return ParameterExpression;\n})(Expression);\nvar UnaryExpression = (function (_super) {\n    __extends(UnaryExpression, _super);\n    function UnaryExpression(nodeType, operand) {\n        _super.call(this, nodeType);\n        this._operand = operand;\n    }\n    Object.defineProperty(UnaryExpression.prototype, \"operand\", {\n        get: function () {\n            return this._operand;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    UnaryExpression.prototype.accept = function (visitor) {\n        return visitor.visitUnary(this);\n    };\n    UnaryExpression.prototype.acceptGeneric = function (visitor) {\n        return visitor.visitUnary(this);\n    };\n    UnaryExpression.prototype.update = function (operand) {\n        if (operand !== this._operand) {\n            return new UnaryExpression(this.nodeType, operand);\n        }\n        return this;\n    };\n    return UnaryExpression;\n})(Expression);\nvar BinaryExpression = (function (_super) {\n    __extends(BinaryExpression, _super);\n    function BinaryExpression(nodeType, left, right) {\n        _super.call(this, nodeType);\n        this._left = left;\n        this._right = right;\n    }\n    Object.defineProperty(BinaryExpression.prototype, \"left\", {\n        get: function () {\n            return this._left;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(BinaryExpression.prototype, \"right\", {\n        get: function () {\n            return this._right;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    BinaryExpression.prototype.accept = function (visitor) {\n        return visitor.visitBinary(this);\n    };\n    BinaryExpression.prototype.acceptGeneric = function (visitor) {\n        return visitor.visitBinary(this);\n    };\n    BinaryExpression.prototype.update = function (left, right) {\n        if (left !== this._left || right !== this._right) {\n            return new BinaryExpression(this.nodeType, left, right);\n        }\n        return this;\n    };\n    return BinaryExpression;\n})(Expression);\nvar ConditionalExpression = (function (_super) {\n    __extends(ConditionalExpression, _super);\n    function ConditionalExpression(test, ifTrue, ifFalse) {\n        _super.call(this, 26 /* Condition */);\n        this._test = test;\n        this._ifTrue = ifTrue;\n        this._ifFalse = ifFalse;\n    }\n    Object.defineProperty(ConditionalExpression.prototype, \"test\", {\n        get: function () {\n            return this._test;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ConditionalExpression.prototype, \"ifTrue\", {\n        get: function () {\n            return this._ifTrue;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ConditionalExpression.prototype, \"ifFalse\", {\n        get: function () {\n            return this._ifTrue;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ConditionalExpression.prototype.accept = function (visitor) {\n        return visitor.visitConditional(this);\n    };\n    ConditionalExpression.prototype.acceptGeneric = function (visitor) {\n        return visitor.visitConditional(this);\n    };\n    ConditionalExpression.prototype.update = function (test, ifTrue, ifFalse) {\n        if (test !== this._test || ifTrue !== this._ifTrue || ifFalse !== this._ifFalse) {\n            return new ConditionalExpression(test, ifTrue, ifFalse);\n        }\n        return this;\n    };\n    return ConditionalExpression;\n})(Expression);\nvar LambdaExpression = (function (_super) {\n    __extends(LambdaExpression, _super);\n    function LambdaExpression(body, parameters) {\n        _super.call(this, 2 /* Lambda */);\n        this._body = body;\n        this._parameters = parameters;\n    }\n    Object.defineProperty(LambdaExpression.prototype, \"body\", {\n        get: function () {\n            return this._body;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(LambdaExpression.prototype, \"parameters\", {\n        get: function () {\n            return this._parameters;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    LambdaExpression.prototype.accept = function (visitor) {\n        return visitor.visitLambda(this);\n    };\n    LambdaExpression.prototype.acceptGeneric = function (visitor) {\n        return visitor.visitLambda(this);\n    };\n    LambdaExpression.prototype.update = function (body, parameters) {\n        if (body !== this._body || parameters !== this._parameters) {\n            return new LambdaExpression(body, parameters);\n        }\n        return this;\n    };\n    LambdaExpression.prototype.compileToFunction = function (debug) {\n        var comp = new LambdaCompiler();\n        comp.visit(this);\n        var code = comp.code;\n        code = code.replace(/\\\"/g, \"\\\\\\\"\"); // TODO: more escape sequences\n        code = \"new Function(\\\"return \" + code + \";\\\")\";\n        code = code.replace(/\\r?\\n|\\r/g, \"\");\n        if (debug) {\n            alert(code);\n        }\n        return code;\n    };\n    LambdaExpression.prototype.compile = function (debug) {\n        var code = this.compileToFunction(debug);\n        return eval(code)();\n    };\n    return LambdaExpression;\n})(Expression);\nvar InvocationExpression = (function (_super) {\n    __extends(InvocationExpression, _super);\n    function InvocationExpression(expression, args) {\n        _super.call(this, 21 /* Invoke */);\n        this._expression = expression;\n        this._args = args;\n    }\n    Object.defineProperty(InvocationExpression.prototype, \"expression\", {\n        get: function () {\n            return this._expression;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(InvocationExpression.prototype, \"args\", {\n        get: function () {\n            return this._args;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    InvocationExpression.prototype.accept = function (visitor) {\n        return visitor.visitInvoke(this);\n    };\n    InvocationExpression.prototype.acceptGeneric = function (visitor) {\n        return visitor.visitInvoke(this);\n    };\n    InvocationExpression.prototype.update = function (expression, args) {\n        if (expression !== this._expression || args !== this._args) {\n            return new InvocationExpression(expression, args);\n        }\n        return this;\n    };\n    return InvocationExpression;\n})(Expression);\nvar FunctionCallExpression = (function (_super) {\n    __extends(FunctionCallExpression, _super);\n    function FunctionCallExpression(expression, methodName, args) {\n        _super.call(this, 28 /* Call */);\n        this._expression = expression;\n        this._method = methodName;\n        this._args = args;\n    }\n    Object.defineProperty(FunctionCallExpression.prototype, \"obj\", {\n        get: function () {\n            return this._expression;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(FunctionCallExpression.prototype, \"method\", {\n        get: function () {\n            return this._method;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(FunctionCallExpression.prototype, \"args\", {\n        get: function () {\n            return this._args;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    FunctionCallExpression.prototype.accept = function (visitor) {\n        return visitor.visitCall(this);\n    };\n    FunctionCallExpression.prototype.acceptGeneric = function (visitor) {\n        return visitor.visitCall(this);\n    };\n    FunctionCallExpression.prototype.update = function (expression, args) {\n        if (expression !== this._expression || args !== this._args) {\n            return new FunctionCallExpression(expression, this._method, args);\n        }\n        return this;\n    };\n    return FunctionCallExpression;\n})(Expression);\nvar IndexExpression = (function (_super) {\n    __extends(IndexExpression, _super);\n    function IndexExpression(expression, args) {\n        _super.call(this, 30 /* Index */);\n        this._expression = expression;\n        this._args = args;\n    }\n    Object.defineProperty(IndexExpression.prototype, \"obj\", {\n        get: function () {\n            return this._expression;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(IndexExpression.prototype, \"args\", {\n        get: function () {\n            return this._args;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    IndexExpression.prototype.accept = function (visitor) {\n        return visitor.visitIndex(this);\n    };\n    IndexExpression.prototype.acceptGeneric = function (visitor) {\n        return visitor.visitIndex(this);\n    };\n    IndexExpression.prototype.update = function (expression, args) {\n        if (expression !== this._expression || args !== this._args) {\n            return new IndexExpression(expression, args);\n        }\n        return this;\n    };\n    return IndexExpression;\n})(Expression);\nvar NewExpression = (function (_super) {\n    __extends(NewExpression, _super);\n    function NewExpression(typeName, args) {\n        _super.call(this, 27 /* New */);\n        this._type = typeName;\n        this._args = args;\n    }\n    Object.defineProperty(NewExpression.prototype, \"type\", {\n        get: function () {\n            return this._type;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(NewExpression.prototype, \"args\", {\n        get: function () {\n            return this._args;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    NewExpression.prototype.accept = function (visitor) {\n        return visitor.visitNew(this);\n    };\n    NewExpression.prototype.acceptGeneric = function (visitor) {\n        return visitor.visitNew(this);\n    };\n    NewExpression.prototype.update = function (args) {\n        if (args !== this._args) {\n            return new NewExpression(this._type, args);\n        }\n        return this;\n    };\n    return NewExpression;\n})(Expression);\nvar MemberExpression = (function (_super) {\n    __extends(MemberExpression, _super);\n    function MemberExpression(obj, memberName) {\n        _super.call(this, 29 /* Member */);\n        this._obj = obj;\n        this._member = memberName;\n    }\n    Object.defineProperty(MemberExpression.prototype, \"obj\", {\n        get: function () {\n            return this._obj;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(MemberExpression.prototype, \"member\", {\n        get: function () {\n            return this._member;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    MemberExpression.prototype.accept = function (visitor) {\n        return visitor.visitMember(this);\n    };\n    MemberExpression.prototype.acceptGeneric = function (visitor) {\n        return visitor.visitMember(this);\n    };\n    MemberExpression.prototype.update = function (obj) {\n        if (obj !== this._obj) {\n            return new MemberExpression(obj, this._member);\n        }\n        return this;\n    };\n    return MemberExpression;\n})(Expression);\nvar LambdaCompiler = (function (_super) {\n    __extends(LambdaCompiler, _super);\n    function LambdaCompiler() {\n        _super.call(this);\n        this._stack = new Array();\n    }\n    Object.defineProperty(LambdaCompiler.prototype, \"code\", {\n        get: function () {\n            if (this._stack.length != 1)\n                throw new Error(\"invalid code generation\");\n            return this._stack[0];\n        },\n        enumerable: true,\n        configurable: true\n    });\n    LambdaCompiler.prototype.visitConstant = function (node) {\n        var value = \"\";\n        if (typeof node.value == \"string\") {\n            value = \"\\\"\" + node.value + \"\\\"\"; // TODO: escape characters\n        }\n        else if (node.value instanceof Array) {\n            value = JSON.stringify(node.value);\n        }\n        else if (node.value === undefined) {\n            value = \"undefined\";\n        }\n        else {\n            value = node.value.toString(); // TODO\n        }\n        this._stack.push(value);\n        return node;\n    };\n    LambdaCompiler.prototype.visitUnary = function (node) {\n        this.visit(node.operand);\n        var o = this._stack.pop();\n        var i = \"\";\n        switch (node.nodeType) {\n            case 23 /* Negate */:\n                i = \"-\";\n                break;\n            case 24 /* UnaryPlus */:\n                i = \"+\";\n                break;\n            case 22 /* Not */:\n                i = \"!\";\n                break;\n            case 25 /* OnesComplement */:\n                i = \"~\";\n                break;\n        }\n        var res = \"(\" + i + \"\" + o + \")\";\n        this._stack.push(res);\n        return node;\n    };\n    LambdaCompiler.prototype.visitBinary = function (node) {\n        this.visit(node.left);\n        this.visit(node.right);\n        var r = this._stack.pop();\n        var l = this._stack.pop();\n        var i = \"\";\n        switch (node.nodeType) {\n            case 3 /* Add */:\n                i = \"+\";\n                break;\n            case 4 /* Subtract */:\n                i = \"-\";\n                break;\n            case 5 /* Multiply */:\n                i = \"*\";\n                break;\n            case 6 /* Divide */:\n                i = \"/\";\n                break;\n            case 7 /* Modulo */:\n                i = \"%\";\n                break;\n            case 8 /* And */:\n                i = \"&\";\n                break;\n            case 9 /* Or */:\n                i = \"|\";\n                break;\n            case 10 /* AndAlso */:\n                i = \"&&\";\n                break;\n            case 11 /* OrElse */:\n                i = \"||\";\n                break;\n            case 12 /* ExclusiveOr */:\n                i = \"^\";\n                break;\n            case 13 /* Equal */:\n                i = \"===\";\n                break;\n            case 14 /* NotEqual */:\n                i = \"!==\";\n                break;\n            case 15 /* LessThan */:\n                i = \"<\";\n                break;\n            case 16 /* LessThanOrEqual */:\n                i = \"<=\";\n                break;\n            case 17 /* GreaterThan */:\n                i = \">\";\n                break;\n            case 18 /* GreaterThanOrEqual */:\n                i = \">=\";\n                break;\n            case 19 /* LeftShift */:\n                i = \"<<\";\n                break;\n            case 20 /* RightShift */:\n                i = \">>\";\n                break;\n        }\n        var res = \"(\" + l + \" \" + i + \" \" + r + \")\";\n        this._stack.push(res);\n        return node;\n    };\n    LambdaCompiler.prototype.visitConditional = function (node) {\n        this.visit(node.test);\n        this.visit(node.ifTrue);\n        this.visit(node.ifFalse);\n        var f = this._stack.pop();\n        var t = this._stack.pop();\n        var c = this._stack.pop();\n        var res = \"(\" + c + \" ? \" + t + \" : \" + f + \")\";\n        this._stack.push(res);\n        return node;\n    };\n    LambdaCompiler.prototype.visitParameter = function (node) {\n        this._stack.push(node.name);\n        return node;\n    };\n    LambdaCompiler.prototype.visitLambda = function (node) {\n        this.visitMany(node.parameters);\n        this.visit(node.body);\n        var body = this._stack.pop();\n        var n = node.parameters.length;\n        var args = new Array(n);\n        for (var i = 0; i < n; i++) {\n            args[n - i - 1] = this._stack.pop();\n        }\n        var allArgs = args.join(\", \");\n        var res = \"function(\" + allArgs + \") { return \" + body + \"; }\";\n        this._stack.push(res);\n        return node;\n    };\n    LambdaCompiler.prototype.visitInvoke = function (node) {\n        this.visit(node.expression);\n        this.visitMany(node.args);\n        var n = node.args.length;\n        var args = new Array(n);\n        for (var i = 0; i < n; i++) {\n            args[n - i - 1] = this._stack.pop();\n        }\n        var argList = args.join(\", \");\n        var func = this._stack.pop();\n        var res = func + \"(\" + argList + \")\";\n        this._stack.push(res);\n        return node;\n    };\n    LambdaCompiler.prototype.visitCall = function (node) {\n        var res = \"\";\n        if (node.obj !== null) {\n            this.visit(node.obj);\n            res = this._stack.pop() + \".\";\n        }\n        this.visitMany(node.args);\n        var n = node.args.length;\n        var args = new Array(n);\n        for (var i = 0; i < n; i++) {\n            args[n - i - 1] = this._stack.pop();\n        }\n        var argList = args.join(\", \");\n        res += node.method + \"(\" + argList + \")\";\n        this._stack.push(res);\n        return node;\n    };\n    LambdaCompiler.prototype.visitNew = function (node) {\n        this.visitMany(node.args);\n        var n = node.args.length;\n        var args = new Array(n);\n        for (var i = 0; i < n; i++) {\n            args[n - i - 1] = this._stack.pop();\n        }\n        var argList = args.join(\", \");\n        var res = \"new \" + node.type + \"(\" + argList + \")\";\n        this._stack.push(res);\n        return node;\n    };\n    LambdaCompiler.prototype.visitMember = function (node) {\n        var res = \"\";\n        if (node.obj !== null) {\n            this.visit(node.obj);\n            res = this._stack.pop() + \".\";\n        }\n        res += node.member;\n        this._stack.push(res);\n        return node;\n    };\n    LambdaCompiler.prototype.visitIndex = function (node) {\n        this.visit(node.obj);\n        var res = this._stack.pop();\n        this.visitMany(node.args);\n        var n = node.args.length;\n        var args = new Array(n);\n        for (var i = 0; i < n; i++) {\n            args[n - i - 1] = this._stack.pop();\n        }\n        var argList = args.join(\", \");\n        res += \"[\" + argList + \"]\";\n        this._stack.push(res);\n        return node;\n    };\n    return LambdaCompiler;\n})(ExpressionVisitor);\nvar FreeVariableScanner = (function (_super) {\n    __extends(FreeVariableScanner, _super);\n    function FreeVariableScanner() {\n        _super.call(this);\n        this._stack = new Array();\n        this._result = new Array();\n    }\n    Object.defineProperty(FreeVariableScanner.prototype, \"result\", {\n        get: function () {\n            return this._result;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    FreeVariableScanner.prototype.visitParameter = function (node) {\n        var found = false;\n        for (var i = this._stack.length - 1; i >= 0; i--) {\n            if (this._stack[i].indexOf(node) >= 0) {\n                found = true;\n                break;\n            }\n        }\n        if (!found) {\n            this._result.push(node);\n        }\n        return node;\n    };\n    FreeVariableScanner.prototype.visitLambda = function (node) {\n        this._stack.push(node.parameters);\n        this.visit(node.body);\n        this._stack.pop();\n        return node;\n    };\n    return FreeVariableScanner;\n})(ExpressionVisitor);\nvar ExpressionType;\n(function (ExpressionType) {\n    ExpressionType[ExpressionType[\"Constant\"] = 0] = \"Constant\";\n    ExpressionType[ExpressionType[\"Parameter\"] = 1] = \"Parameter\";\n    ExpressionType[ExpressionType[\"Lambda\"] = 2] = \"Lambda\";\n    ExpressionType[ExpressionType[\"Add\"] = 3] = \"Add\";\n    ExpressionType[ExpressionType[\"Subtract\"] = 4] = \"Subtract\";\n    ExpressionType[ExpressionType[\"Multiply\"] = 5] = \"Multiply\";\n    ExpressionType[ExpressionType[\"Divide\"] = 6] = \"Divide\";\n    ExpressionType[ExpressionType[\"Modulo\"] = 7] = \"Modulo\";\n    ExpressionType[ExpressionType[\"And\"] = 8] = \"And\";\n    ExpressionType[ExpressionType[\"Or\"] = 9] = \"Or\";\n    ExpressionType[ExpressionType[\"AndAlso\"] = 10] = \"AndAlso\";\n    ExpressionType[ExpressionType[\"OrElse\"] = 11] = \"OrElse\";\n    ExpressionType[ExpressionType[\"ExclusiveOr\"] = 12] = \"ExclusiveOr\";\n    ExpressionType[ExpressionType[\"Equal\"] = 13] = \"Equal\";\n    ExpressionType[ExpressionType[\"NotEqual\"] = 14] = \"NotEqual\";\n    ExpressionType[ExpressionType[\"LessThan\"] = 15] = \"LessThan\";\n    ExpressionType[ExpressionType[\"LessThanOrEqual\"] = 16] = \"LessThanOrEqual\";\n    ExpressionType[ExpressionType[\"GreaterThan\"] = 17] = \"GreaterThan\";\n    ExpressionType[ExpressionType[\"GreaterThanOrEqual\"] = 18] = \"GreaterThanOrEqual\";\n    ExpressionType[ExpressionType[\"LeftShift\"] = 19] = \"LeftShift\";\n    ExpressionType[ExpressionType[\"RightShift\"] = 20] = \"RightShift\";\n    ExpressionType[ExpressionType[\"Invoke\"] = 21] = \"Invoke\";\n    ExpressionType[ExpressionType[\"Not\"] = 22] = \"Not\";\n    ExpressionType[ExpressionType[\"Negate\"] = 23] = \"Negate\";\n    ExpressionType[ExpressionType[\"UnaryPlus\"] = 24] = \"UnaryPlus\";\n    ExpressionType[ExpressionType[\"OnesComplement\"] = 25] = \"OnesComplement\";\n    ExpressionType[ExpressionType[\"Condition\"] = 26] = \"Condition\";\n    ExpressionType[ExpressionType[\"New\"] = 27] = \"New\";\n    ExpressionType[ExpressionType[\"Call\"] = 28] = \"Call\";\n    ExpressionType[ExpressionType[\"Member\"] = 29] = \"Member\";\n    ExpressionType[ExpressionType[\"Index\"] = 30] = \"Index\";\n})(ExpressionType || (ExpressionType = {}));\nvar Binder = (function (_super) {\n    __extends(Binder, _super);\n    function Binder(resources) {\n        _super.call(this);\n        this._stack = new Array();\n        this._resources = resources;\n    }\n    Binder.prototype.visitParameter = function (node) {\n        var found = false;\n        for (var i = this._stack.length - 1; i >= 0; i--) {\n            if (this._stack[i].indexOf(node) >= 0) {\n                found = true;\n                break;\n            }\n        }\n        if (!found) {\n            return Expression.constant(this._resources[node.name]);\n        }\n        return node;\n    };\n    Binder.prototype.visitLambda = function (node) {\n        this._stack.push(node.parameters);\n        this.visit(node.body);\n        this._stack.pop();\n        return node;\n    };\n    return Binder;\n})(ExpressionVisitor);\nvar PrintVisitor = (function (_super) {\n    __extends(PrintVisitor, _super);\n    function PrintVisitor() {\n        _super.apply(this, arguments);\n    }\n    PrintVisitor.prototype.visitConstant = function (node) {\n        return \"Constant(\" + node.value + \")\";\n    };\n    PrintVisitor.prototype.visitParameter = function (node) {\n        return \"Parameter(\" + node.name + \")\";\n    };\n    PrintVisitor.prototype.visitBinary = function (node) {\n        return ExpressionType[node.nodeType] + \"(\" + this.visit(node.left) + \", \" + this.visit(node.right) + \")\";\n    };\n    PrintVisitor.prototype.visitUnary = function (node) {\n        return ExpressionType[node.nodeType] + \"(\" + this.visit(node.operand) + \")\";\n    };\n    PrintVisitor.prototype.visitConditional = function (node) {\n        return \"Conditional(\" + this.visit(node.test) + \", \" + this.visit(node.ifTrue) + \", \" + this.visit(node.ifFalse) + \")\";\n    };\n    PrintVisitor.prototype.visitLambda = function (node) {\n        var body = this.visit(node.body);\n        var children = this.visitMany(node.parameters);\n        children.unshift(body);\n        return \"Lambda(\" + children.join(\", \") + \")\";\n    };\n    PrintVisitor.prototype.visitInvoke = function (node) {\n        var expression = this.visit(node.expression);\n        var children = this.visitMany(node.args);\n        children.unshift(expression);\n        return \"Invoke(\" + children.join(\", \") + \")\";\n    };\n    PrintVisitor.prototype.visitCall = function (node) {\n        var children = this.visitMany(node.args);\n        if (node.obj != null) {\n            children.unshift(this.visit(node.obj));\n        }\n        children.unshift(node.method);\n        return \"Call(\" + children.join(\", \") + \")\";\n    };\n    PrintVisitor.prototype.visitNew = function (node) {\n        var children = this.visitMany(node.args);\n        children.unshift(node.type);\n        return \"New(\" + children.join(\", \") + \")\";\n    };\n    PrintVisitor.prototype.visitMember = function (node) {\n        var children = [];\n        if (node.obj != null) {\n            children.unshift(this.visit(node.obj));\n        }\n        children.unshift(node.member);\n        return \"Member(\" + children.join(\", \") + \")\";\n    };\n    PrintVisitor.prototype.visitIndex = function (node) {\n        var children = this.visitMany(node.args);\n        if (node.obj != null) {\n            children.unshift(this.visit(node.obj));\n        }\n        return \"Index(\" + children.join(\", \") + \")\";\n    };\n    return PrintVisitor;\n})(ExpressionVisitorGeneric);\nvar BonsaiVisitor = (function (_super) {\n    __extends(BonsaiVisitor, _super);\n    function BonsaiVisitor() {\n        _super.apply(this, arguments);\n    }\n    BonsaiVisitor.prototype.visitConstant = function (node) {\n        return [\":\", node.value];\n    };\n    BonsaiVisitor.prototype.visitParameter = function (node) {\n        return [\"$\", node.name];\n    };\n    BonsaiVisitor.prototype.visitBinary = function (node) {\n        var i = \"\";\n        switch (node.nodeType) {\n            case 3 /* Add */:\n                i = \"+\";\n                break;\n            case 4 /* Subtract */:\n                i = \"-\";\n                break;\n            case 5 /* Multiply */:\n                i = \"*\";\n                break;\n            case 6 /* Divide */:\n                i = \"/\";\n                break;\n            case 7 /* Modulo */:\n                i = \"%\";\n                break;\n            case 8 /* And */:\n                i = \"&\";\n                break;\n            case 9 /* Or */:\n                i = \"|\";\n                break;\n            case 10 /* AndAlso */:\n                i = \"&&\";\n                break;\n            case 11 /* OrElse */:\n                i = \"||\";\n                break;\n            case 12 /* ExclusiveOr */:\n                i = \"^\";\n                break;\n            case 13 /* Equal */:\n                i = \"===\";\n                break;\n            case 14 /* NotEqual */:\n                i = \"!==\";\n                break;\n            case 15 /* LessThan */:\n                i = \"<\";\n                break;\n            case 16 /* LessThanOrEqual */:\n                i = \"<=\";\n                break;\n            case 17 /* GreaterThan */:\n                i = \">\";\n                break;\n            case 18 /* GreaterThanOrEqual */:\n                i = \">=\";\n                break;\n            case 19 /* LeftShift */:\n                i = \"<<\";\n                break;\n            case 20 /* RightShift */:\n                i = \">>\";\n                break;\n        }\n        return [i, this.visit(node.left), this.visit(node.right)];\n    };\n    BonsaiVisitor.prototype.visitUnary = function (node) {\n        var i = \"\";\n        switch (node.nodeType) {\n            case 23 /* Negate */:\n                i = \"-\";\n                break;\n            case 24 /* UnaryPlus */:\n                i = \"+\";\n                break;\n            case 22 /* Not */:\n                i = \"!\";\n                break;\n            case 25 /* OnesComplement */:\n                i = \"~\";\n                break;\n        }\n        return [i, this.visit(node.operand)];\n    };\n    BonsaiVisitor.prototype.visitConditional = function (node) {\n        return [\"?:\", this.visit(node.test), this.visit(node.ifTrue), this.visit(node.ifFalse)];\n    };\n    BonsaiVisitor.prototype.visitLambda = function (node) {\n        return [\"=>\", this.visit(node.body), this.visitMany(node.parameters)];\n    };\n    BonsaiVisitor.prototype.visitInvoke = function (node) {\n        var expression = this.visit(node.expression);\n        var args = this.visitMany(node.args);\n        return [\"()\", expression, args];\n    };\n    BonsaiVisitor.prototype.visitCall = function (node) {\n        var args = [];\n        if (node.obj != null) {\n            args.unshift(this.visit(node.obj));\n        }\n        args.unshift(this.visitMany(node.args));\n        return [\".()\", node.method, args];\n    };\n    BonsaiVisitor.prototype.visitNew = function (node) {\n        var args = this.visitMany(node.args);\n        return [\"new\", args];\n    };\n    BonsaiVisitor.prototype.visitMember = function (node) {\n        var res = [\".\", node.member];\n        if (node.obj != null) {\n            res.unshift(this.visit(node.obj));\n        }\n        return res;\n    };\n    BonsaiVisitor.prototype.visitIndex = function (node) {\n        throw new Error(\"not implemented\");\n    };\n    return BonsaiVisitor;\n})(ExpressionVisitorGeneric);\n//# sourceMappingURL=compiler.js.map"
  },
  {
    "path": "src/core/expressions/compiler.ts",
    "content": "class Expression {\n    nodeType: ExpressionType;\n\n    constructor(nodeType: ExpressionType) {\n        this.nodeType = nodeType;\n    }\n\n    accept(visitor: ExpressionVisitor): Expression {\n        throw new Error(\"not implemented\");\n    }\n\n    acceptGeneric<T>(visitor: ExpressionVisitorGeneric<T>): T {\n        throw new Error(\"not implemented\");\n    }\n\n    toString(): string {\n        return new PrintVisitor().visit(this);\n    }\n\n    toBonsai(): string {\n        return new BonsaiVisitor().visit(this);\n    }\n\n    static constant(value: any): ConstantExpression {\n        return new ConstantExpression(value);\n    }\n\n    static parameter(name: string): ParameterExpression {\n        return new ParameterExpression(name);\n    }\n\n    static condition(test: Expression, ifTrue: Expression, ifFalse: Expression): ConditionalExpression {\n        return new ConditionalExpression(test, ifTrue, ifFalse);\n    }\n\n    static add(left: Expression, right: Expression): BinaryExpression {\n        return new BinaryExpression(ExpressionType.Add, left, right);\n    }\n\n    static subtract(left: Expression, right: Expression): BinaryExpression {\n        return new BinaryExpression(ExpressionType.Subtract, left, right);\n    }\n\n    static multiply(left: Expression, right: Expression): BinaryExpression {\n        return new BinaryExpression(ExpressionType.Multiply, left, right);\n    }\n\n    static divide(left: Expression, right: Expression): BinaryExpression {\n        return new BinaryExpression(ExpressionType.Divide, left, right);\n    }\n\n    static modulo(left: Expression, right: Expression): BinaryExpression {\n        return new BinaryExpression(ExpressionType.Modulo, left, right);\n    }\n\n    static and(left: Expression, right: Expression): BinaryExpression {\n        return new BinaryExpression(ExpressionType.And, left, right);\n    }\n\n    static andAlso(left: Expression, right: Expression): BinaryExpression {\n        return new BinaryExpression(ExpressionType.AndAlso, left, right);\n    }\n\n    static or(left: Expression, right: Expression): BinaryExpression {\n        return new BinaryExpression(ExpressionType.Or, left, right);\n    }\n\n    static orElse(left: Expression, right: Expression): BinaryExpression {\n        return new BinaryExpression(ExpressionType.OrElse, left, right);\n    }\n\n    static exclusiveOr(left: Expression, right: Expression): BinaryExpression {\n        return new BinaryExpression(ExpressionType.ExclusiveOr, left, right);\n    }\n\n    static equal(left: Expression, right: Expression): BinaryExpression {\n        return new BinaryExpression(ExpressionType.Equal, left, right);\n    }\n\n    static notEqual(left: Expression, right: Expression): BinaryExpression {\n        return new BinaryExpression(ExpressionType.NotEqual, left, right);\n    }\n\n    static lessThan(left: Expression, right: Expression): BinaryExpression {\n        return new BinaryExpression(ExpressionType.LessThan, left, right);\n    }\n\n    static lessThanOrEqual(left: Expression, right: Expression): BinaryExpression {\n        return new BinaryExpression(ExpressionType.LessThanOrEqual, left, right);\n    }\n\n    static greaterThan(left: Expression, right: Expression): BinaryExpression {\n        return new BinaryExpression(ExpressionType.GreaterThan, left, right);\n    }\n\n    static greaterThanOrEqual(left: Expression, right: Expression): BinaryExpression {\n        return new BinaryExpression(ExpressionType.GreaterThanOrEqual, left, right);\n    }\n\n    static leftShift(left: Expression, right: Expression): BinaryExpression {\n        return new BinaryExpression(ExpressionType.LeftShift, left, right);\n    }\n\n    static rightShift(left: Expression, right: Expression): BinaryExpression {\n        return new BinaryExpression(ExpressionType.RightShift, left, right);\n    }\n\n    static not(operand: Expression): UnaryExpression {\n        return new UnaryExpression(ExpressionType.Not, operand);\n    }\n\n    static unaryPlus(operand: Expression): UnaryExpression {\n        return new UnaryExpression(ExpressionType.UnaryPlus, operand);\n    }\n\n    static negate(operand: Expression): UnaryExpression {\n        return new UnaryExpression(ExpressionType.Negate, operand);\n    }\n\n    static onesComplement(operand: Expression): UnaryExpression {\n        return new UnaryExpression(ExpressionType.OnesComplement, operand);\n    }\n\n    static lambda<T extends Function>(body: Expression, ...parameters: ParameterExpression[]): LambdaExpression<T> {\n        return new LambdaExpression<T>(body, parameters);\n    }\n\n    static invoke(expression: Expression, ...args: Expression[]): InvocationExpression {\n        return new InvocationExpression(expression, args);\n    }\n\n    static new(typeName: string, ...args: Expression[]): NewExpression {\n        return new NewExpression(typeName, args);\n    }\n\n    static functionCall(obj: Expression, methodName: string, ...args: Expression[]): FunctionCallExpression {\n        return new FunctionCallExpression(obj, methodName, args);\n    }\n\n    static member(obj: Expression, memberName: string): MemberExpression {\n        return new MemberExpression(obj, memberName);\n    }\n\n    static index(obj: Expression, ...args: Expression[]): IndexExpression {\n        return new IndexExpression(obj, args);\n    }\n}\n\nclass ExpressionVisitorGeneric<T> {\n    visit(node: Expression): T {\n        if (node === null) {\n            return null;\n        }\n        return node.acceptGeneric(this);\n    }\n\n    visitConstant(node: ConstantExpression): T { throw new Error(\"not implemented\"); }\n\n    visitParameter(node: ParameterExpression): T { throw new Error(\"not implemented\"); }\n\n    visitBinary(node: BinaryExpression): T { throw new Error(\"not implemented\"); }\n\n    visitUnary(node: UnaryExpression): T { throw new Error(\"not implemented\"); }\n\n    visitConditional(node: ConditionalExpression): T { throw new Error(\"not implemented\"); }\n\n    visitLambda<TFunction extends Function>(node: LambdaExpression<TFunction>): T { throw new Error(\"not implemented\"); }\n\n    visitInvoke(node: InvocationExpression): T { throw new Error(\"not implemented\"); }\n\n    visitCall(node: FunctionCallExpression): T { throw new Error(\"not implemented\"); }\n\n    visitNew(node: NewExpression): T { throw new Error(\"not implemented\"); }\n\n    visitMember(node: MemberExpression): T { throw new Error(\"not implemented\"); }\n\n    visitIndex(node: IndexExpression): T { throw new Error(\"not implemented\"); }\n\n    visitMany<E extends Expression>(nodes: E[]): T[] {\n        var res = new Array<T>(nodes.length);\n\n        for (var i = 0; i < nodes.length; i++) {\n            var oldNode = nodes[i];\n            var newNode = <T>this.visit(oldNode);\n            res[i] = newNode;\n        }\n\n        return res;\n    }\n}\n\nclass ExpressionVisitor {\n    visit(node: Expression): Expression {\n        if (node === null) {\n            return null;\n        }\n        return node.accept(this);\n    }\n\n    visitConstant(node: ConstantExpression): Expression {\n        return node;\n    }\n\n    visitParameter(node: ParameterExpression): Expression {\n        return node;\n    }\n\n    visitBinary(node: BinaryExpression): Expression {\n        return node.update(this.visit(node.left), this.visit(node.right));\n    }\n\n    visitUnary(node: UnaryExpression): Expression {\n        return node.update(this.visit(node.operand));\n    }\n\n    visitConditional(node: ConditionalExpression): Expression {\n        return node.update(this.visit(node.test), this.visit(node.ifTrue), this.visit(node.ifFalse));\n    }\n\n    visitLambda<T extends Function>(node: LambdaExpression<T>): Expression {\n        return node.update(this.visit(node.body), this.visitMany(node.parameters));\n    }\n\n    visitInvoke(node: InvocationExpression): Expression {\n        return node.update(this.visit(node.expression), this.visitMany(node.args));\n    }\n\n    visitCall(node: FunctionCallExpression): Expression {\n        return node.update(this.visit(node.obj), this.visitMany(node.args));\n    }\n\n    visitNew(node: NewExpression): Expression {\n        return node.update(this.visitMany(node.args));\n    }\n\n    visitMember(node: MemberExpression): Expression {\n        return node.update(this.visit(node.obj));\n    }\n\n    visitIndex(node: IndexExpression): Expression {\n        return node.update(this.visit(node.obj), this.visitMany(node.args));\n    }\n\n    visitMany<T extends Expression>(nodes: T[]): T[] {\n        var res = new Array<T>(nodes.length);\n\n        for (var i = 0; i < nodes.length; i++) {\n            var oldNode = nodes[i];\n            var newNode = <T>this.visit(oldNode);\n            res[i] = newNode;\n        }\n\n        return res;\n    }\n}\n\nclass ConstantExpression extends Expression {\n    _value: any;\n\n    constructor(value: any) {\n        super(ExpressionType.Constant);\n        this._value = value;\n    }\n\n    get value(): any {\n        return this._value;\n    }\n\n    accept(visitor: ExpressionVisitor): Expression {\n        return visitor.visitConstant(this);\n    }\n\n    acceptGeneric<T>(visitor: ExpressionVisitorGeneric<T>): T {\n        return visitor.visitConstant(this);\n    }\n}\n\nclass ParameterExpression extends Expression {\n    _name: string;\n\n    constructor(name: string) {\n        super(ExpressionType.Parameter);\n        this._name = name;\n    }\n\n    get name(): string {\n        return this._name;\n    }\n\n    accept(visitor: ExpressionVisitor): Expression {\n        return visitor.visitParameter(this);\n    }\n\n    acceptGeneric<T>(visitor: ExpressionVisitorGeneric<T>): T {\n        return visitor.visitParameter(this);\n    }\n}\n\nclass UnaryExpression extends Expression {\n    _operand: Expression;\n\n    constructor(nodeType: ExpressionType, operand: Expression) {\n        super(nodeType);\n        this._operand = operand;\n    }\n\n    get operand(): Expression {\n        return this._operand;\n    }\n\n    accept(visitor: ExpressionVisitor): Expression {\n        return visitor.visitUnary(this);\n    }\n\n    acceptGeneric<T>(visitor: ExpressionVisitorGeneric<T>): T {\n        return visitor.visitUnary(this);\n    }\n\n    update(operand: Expression): UnaryExpression {\n        if (operand !== this._operand) {\n            return new UnaryExpression(this.nodeType, operand);\n        }\n\n        return this;\n    }\n}\n\nclass BinaryExpression extends Expression {\n    _left: Expression;\n    _right: Expression;\n\n    constructor(nodeType: ExpressionType, left: Expression, right: Expression) {\n        super(nodeType);\n        this._left = left;\n        this._right = right;\n    }\n\n    get left(): Expression {\n        return this._left;\n    }\n\n    get right(): Expression {\n        return this._right;\n    }\n\n    accept(visitor: ExpressionVisitor): Expression {\n        return visitor.visitBinary(this);\n    }\n\n    acceptGeneric<T>(visitor: ExpressionVisitorGeneric<T>): T {\n        return visitor.visitBinary(this);\n    }\n\n    update(left: Expression, right: Expression): BinaryExpression {\n        if (left !== this._left || right !== this._right) {\n            return new BinaryExpression(this.nodeType, left, right);\n        }\n\n        return this;\n    }\n}\n\nclass ConditionalExpression extends Expression {\n    _test: Expression;\n    _ifTrue: Expression;\n    _ifFalse: Expression;\n\n    constructor(test: Expression, ifTrue: Expression, ifFalse: Expression) {\n        super(ExpressionType.Condition);\n        this._test = test;\n        this._ifTrue = ifTrue;\n        this._ifFalse = ifFalse;\n    }\n\n    get test(): Expression {\n        return this._test;\n    }\n\n    get ifTrue(): Expression {\n        return this._ifTrue;\n    }\n\n    get ifFalse(): Expression {\n        return this._ifTrue;\n    }\n\n    accept(visitor: ExpressionVisitor): Expression {\n        return visitor.visitConditional(this);\n    }\n\n    acceptGeneric<T>(visitor: ExpressionVisitorGeneric<T>): T {\n        return visitor.visitConditional(this);\n    }\n\n    update(test: Expression, ifTrue: Expression, ifFalse: Expression): ConditionalExpression {\n        if (test !== this._test || ifTrue !== this._ifTrue || ifFalse !== this._ifFalse) {\n            return new ConditionalExpression(test, ifTrue, ifFalse);\n        }\n\n        return this;\n    }\n}\n\nclass LambdaExpression<TFunction extends Function> extends Expression {\n    _body: Expression;\n    _parameters: ParameterExpression[];\n\n    constructor(body: Expression, parameters: ParameterExpression[]) {\n        super(ExpressionType.Lambda);\n        this._body = body;\n        this._parameters = parameters;\n    }\n\n    get body(): Expression {\n        return this._body;\n    }\n\n    get parameters(): ParameterExpression[] {\n        return this._parameters;\n    }\n\n    accept(visitor: ExpressionVisitor): Expression {\n        return visitor.visitLambda<TFunction>(this);\n    }\n\n    acceptGeneric<T>(visitor: ExpressionVisitorGeneric<T>): T {\n        return visitor.visitLambda<TFunction>(this);\n    }\n\n    update(body: Expression, parameters: ParameterExpression[]): LambdaExpression<TFunction> {\n        if (body !== this._body || parameters !== this._parameters) {\n            return new LambdaExpression<TFunction>(body, parameters);\n        }\n\n        return this;\n    }\n\n    compileToFunction(debug?: boolean): string {\n        var comp = new LambdaCompiler();\n        comp.visit(this);\n\n        var code = comp.code;\n\n        code = code.replace(/\"/g, \"\\\\\\\"\"); // TODO: more escape sequences\n        code = \"new Function(\\\"return \" + code + \";\\\")\";\n        code = code.replace(/\\r?\\n|\\r/g, \"\");\n\n        if (debug) {\n            alert(code);\n        }\n\n        return code;\n    }\n\n    compile(debug?: boolean): TFunction {\n        var code = this.compileToFunction(debug);\n        return <TFunction>eval(code)();\n    }\n}\n\nclass InvocationExpression extends Expression {\n    _expression: Expression;\n    _args: Expression[];\n\n    constructor(expression: Expression, args: Expression[]) {\n        super(ExpressionType.Invoke);\n        this._expression = expression;\n        this._args = args;\n    }\n\n    get expression(): Expression {\n        return this._expression;\n    }\n\n    get args(): Expression[] {\n        return this._args;\n    }\n\n    accept(visitor: ExpressionVisitor): Expression {\n        return visitor.visitInvoke(this);\n    }\n\n    acceptGeneric<T>(visitor: ExpressionVisitorGeneric<T>): T {\n        return visitor.visitInvoke(this);\n    }\n\n    update(expression: Expression, args: Expression[]): InvocationExpression {\n        if (expression !== this._expression || args !== this._args) {\n            return new InvocationExpression(expression, args);\n        }\n\n        return this;\n    }\n}\n\nclass FunctionCallExpression extends Expression {\n    _expression: Expression;\n    _method: string;\n    _args: Expression[];\n\n    constructor(expression: Expression, methodName: string, args: Expression[]) {\n        super(ExpressionType.Call);\n        this._expression = expression;\n        this._method = methodName;\n        this._args = args;\n    }\n\n    get obj(): Expression {\n        return this._expression;\n    }\n\n    get method(): string {\n        return this._method;\n    }\n\n    get args(): Expression[] {\n        return this._args;\n    }\n\n    accept(visitor: ExpressionVisitor): Expression {\n        return visitor.visitCall(this);\n    }\n\n    acceptGeneric<T>(visitor: ExpressionVisitorGeneric<T>): T {\n        return visitor.visitCall(this);\n    }\n\n    update(expression: Expression, args: Expression[]): FunctionCallExpression {\n        if (expression !== this._expression || args !== this._args) {\n            return new FunctionCallExpression(expression, this._method, args);\n        }\n\n        return this;\n    }\n}\n\nclass IndexExpression extends Expression {\n    _expression: Expression;\n    _args: Expression[];\n\n    constructor(expression: Expression, args: Expression[]) {\n        super(ExpressionType.Index);\n        this._expression = expression;\n        this._args = args;\n    }\n\n    get obj(): Expression {\n        return this._expression;\n    }\n\n    get args(): Expression[] {\n        return this._args;\n    }\n\n    accept(visitor: ExpressionVisitor): Expression {\n        return visitor.visitIndex(this);\n    }\n\n    acceptGeneric<T>(visitor: ExpressionVisitorGeneric<T>): T {\n        return visitor.visitIndex(this);\n    }\n\n    update(expression: Expression, args: Expression[]): IndexExpression {\n        if (expression !== this._expression || args !== this._args) {\n            return new IndexExpression(expression, args);\n        }\n\n        return this;\n    }\n}\n\nclass NewExpression extends Expression {\n    _type: string;\n    _args: Expression[];\n\n    constructor(typeName: string, args: Expression[]) {\n        super(ExpressionType.New);\n        this._type = typeName;\n        this._args = args;\n    }\n\n    get type(): string {\n        return this._type;\n    }\n\n    get args(): Expression[] {\n        return this._args;\n    }\n\n    accept(visitor: ExpressionVisitor): Expression {\n        return visitor.visitNew(this);\n    }\n\n    acceptGeneric<T>(visitor: ExpressionVisitorGeneric<T>): T {\n        return visitor.visitNew(this);\n    }\n\n    update(args: Expression[]): NewExpression {\n        if (args !== this._args) {\n            return new NewExpression(this._type, args);\n        }\n\n        return this;\n    }\n}\n\nclass MemberExpression extends Expression {\n    _obj: Expression;\n    _member: string;\n\n    constructor(obj: Expression, memberName: string) {\n        super(ExpressionType.Member);\n        this._obj = obj;\n        this._member = memberName;\n    }\n\n    get obj(): Expression {\n        return this._obj;\n    }\n\n    get member(): string {\n        return this._member;\n    }\n\n    accept(visitor: ExpressionVisitor): Expression {\n        return visitor.visitMember(this);\n    }\n\n    acceptGeneric<T>(visitor: ExpressionVisitorGeneric<T>): T {\n        return visitor.visitMember(this);\n    }\n\n    update(obj: Expression): MemberExpression {\n        if (obj !== this._obj) {\n            return new MemberExpression(obj, this._member);\n        }\n\n        return this;\n    }\n}\n\nclass LambdaCompiler extends ExpressionVisitor {\n    _stack: string[];\n\n    constructor() {\n        super();\n        this._stack = [];\n    }\n\n    get code(): string {\n        if (this._stack.length != 1)\n            throw new Error(\"invalid code generation\");\n\n        return this._stack[0];\n    }\n\n    visitConstant(node: ConstantExpression): Expression {\n        var value = \"\";\n\n        if (typeof node.value == \"string\") {\n            value = \"\\\"\" + node.value + \"\\\"\"; // TODO: escape characters\n        }\n        else if (node.value instanceof Array) {\n            value = JSON.stringify(node.value);\n        }\n        else if (node.value === undefined) {\n            value = \"undefined\";\n        }\n        else {\n            value = node.value.toString(); // TODO\n        }\n\n        this._stack.push(value);\n\n        return node;\n    }\n\n    visitUnary(node: UnaryExpression): Expression {\n        this.visit(node.operand);\n\n        var o = this._stack.pop();\n        var i = \"\";\n\n        switch (node.nodeType) {\n            case ExpressionType.Negate:\n                i = \"-\";\n                break;\n            case ExpressionType.UnaryPlus:\n                i = \"+\";\n                break;\n            case ExpressionType.Not:\n                i = \"!\";\n                break;\n            case ExpressionType.OnesComplement:\n                i = \"~\";\n                break;\n        }\n\n        var res = \"(\" + i + \"\" + o + \")\";\n        this._stack.push(res);\n\n        return node;\n    }\n\n    visitBinary(node: BinaryExpression): Expression {\n        this.visit(node.left);\n        this.visit(node.right);\n\n        var r = this._stack.pop();\n        var l = this._stack.pop();\n        var i = \"\";\n\n        switch (node.nodeType) {\n            case ExpressionType.Add:\n                i = \"+\";\n                break;\n            case ExpressionType.Subtract:\n                i = \"-\";\n                break;\n            case ExpressionType.Multiply:\n                i = \"*\";\n                break;\n            case ExpressionType.Divide:\n                i = \"/\";\n                break;\n            case ExpressionType.Modulo:\n                i = \"%\";\n                break;\n            case ExpressionType.And:\n                i = \"&\";\n                break;\n            case ExpressionType.Or:\n                i = \"|\";\n                break;\n            case ExpressionType.AndAlso:\n                i = \"&&\";\n                break;\n            case ExpressionType.OrElse:\n                i = \"||\";\n                break;\n            case ExpressionType.ExclusiveOr:\n                i = \"^\";\n                break;\n            case ExpressionType.Equal:\n                i = \"===\";\n                break;\n            case ExpressionType.NotEqual:\n                i = \"!==\";\n                break;\n            case ExpressionType.LessThan:\n                i = \"<\";\n                break;\n            case ExpressionType.LessThanOrEqual:\n                i = \"<=\";\n                break;\n            case ExpressionType.GreaterThan:\n                i = \">\";\n                break;\n            case ExpressionType.GreaterThanOrEqual:\n                i = \">=\";\n                break;\n            case ExpressionType.LeftShift:\n                i = \"<<\";\n                break;\n            case ExpressionType.RightShift:\n                i = \">>\";\n                break;\n        }\n\n        var res = \"(\" + l + \" \" + i + \" \" + r + \")\";\n        this._stack.push(res);\n\n        return node;\n    }\n\n    visitConditional(node: ConditionalExpression): Expression {\n        this.visit(node.test);\n        this.visit(node.ifTrue);\n        this.visit(node.ifFalse);\n\n        var f = this._stack.pop();\n        var t = this._stack.pop();\n        var c = this._stack.pop();\n\n        var res = \"(\" + c + \" ? \" + t + \" : \" + f + \")\";\n\n        this._stack.push(res);\n\n        return node;\n    }\n\n    visitParameter(node: ParameterExpression): Expression {\n        this._stack.push(node.name);\n\n        return node;\n    }\n\n    visitLambda<T extends Function>(node: LambdaExpression<T>): Expression {\n        this.visitMany(node.parameters);\n        this.visit(node.body);\n\n        var body = this._stack.pop();\n\n        var n = node.parameters.length;\n        var args = new Array<string>(n);\n        for (var i = 0; i < n; i++) {\n            args[n - i - 1] = this._stack.pop();\n        }\n\n        var allArgs = args.join(\", \");\n\n        var res = \"function(\" + allArgs + \") { return \" + body + \"; }\";\n\n        this._stack.push(res);\n\n        return node;\n    }\n\n    visitInvoke(node: InvocationExpression): Expression {\n        this.visit(node.expression);\n        this.visitMany(node.args);\n\n        var n = node.args.length;\n        var args = new Array<string>(n);\n        for (var i = 0; i < n; i++) {\n            args[n - i - 1] = this._stack.pop();\n        }\n\n        var argList = args.join(\", \");\n\n        var func = this._stack.pop();\n\n        var res = func + \"(\" + argList + \")\";\n\n        this._stack.push(res);\n\n        return node;\n    }\n\n    visitCall(node: FunctionCallExpression): Expression {\n        var res = \"\";\n\n        if (node.obj !== null) {\n            this.visit(node.obj);\n            res = this._stack.pop() + \".\";\n        }\n\n        this.visitMany(node.args);\n\n        var n = node.args.length;\n        var args = new Array<string>(n);\n        for (var i = 0; i < n; i++) {\n            args[n - i - 1] = this._stack.pop();\n        }\n\n        var argList = args.join(\", \");\n\n        res += node.method + \"(\" + argList + \")\";\n\n        this._stack.push(res);\n\n        return node;\n    }\n\n    visitNew(node: NewExpression): Expression {\n        this.visitMany(node.args);\n\n        var n = node.args.length;\n        var args = new Array<string>(n);\n        for (var i = 0; i < n; i++) {\n            args[n - i - 1] = this._stack.pop();\n        }\n\n        var argList = args.join(\", \");\n\n        var res = \"new \" + node.type + \"(\" + argList + \")\";\n\n        this._stack.push(res);\n\n        return node;\n    }\n\n    visitMember(node: MemberExpression): Expression {\n        var res = \"\";\n\n        if (node.obj !== null) {\n            this.visit(node.obj);\n            res = this._stack.pop() + \".\";\n        }\n\n        res += node.member;\n\n        this._stack.push(res);\n\n        return node;\n    }\n\n    visitIndex(node: IndexExpression): Expression {\n        this.visit(node.obj);\n        var res = this._stack.pop();\n\n        this.visitMany(node.args);\n\n        var n = node.args.length;\n        var args = new Array<string>(n);\n        for (var i = 0; i < n; i++) {\n            args[n - i - 1] = this._stack.pop();\n        }\n\n        var argList = args.join(\", \");\n\n        res += \"[\" + argList + \"]\";\n\n        this._stack.push(res);\n\n        return node;\n    }\n}\n\nclass FreeVariableScanner extends ExpressionVisitor {\n    _stack: Expression[][];\n    _result: Expression[];\n\n    constructor() {\n        super();\n        this._stack = [];\n        this._result = [];\n    }\n\n    get result(): Expression[] {\n        return this._result;\n    }\n\n    visitParameter(node: ParameterExpression): Expression {\n        var found = false;\n\n        for (var i = this._stack.length - 1; i >= 0; i--) {\n            if (this._stack[i].indexOf(node) >= 0) {\n                found = true;\n                break;\n            }\n        }\n\n        if (!found) {\n            this._result.push(node);\n        }\n\n        return node;\n    }\n\n    visitLambda<T extends Function>(node: LambdaExpression<T>): Expression {\n        this._stack.push(node.parameters);\n\n        this.visit(node.body);\n\n        this._stack.pop();\n\n        return node;\n    }\n}\n\nenum ExpressionType {\n    Constant,\n    Parameter,\n    Lambda,\n    Add,\n    Subtract,\n    Multiply,\n    Divide,\n    Modulo,\n    And,\n    Or,\n    AndAlso,\n    OrElse,\n    ExclusiveOr,\n    Equal,\n    NotEqual,\n    LessThan,\n    LessThanOrEqual,\n    GreaterThan,\n    GreaterThanOrEqual,\n    LeftShift,\n    RightShift,\n    Invoke,\n    Not,\n    Negate,\n    UnaryPlus,\n    OnesComplement,\n    Condition,\n    New,\n    Call,\n    Member,\n    Index,\n}\n\nclass Binder extends ExpressionVisitor {\n    _stack: Expression[][];\n    _resources: any;\n\n    constructor(resources: any) {\n        super();\n        this._stack = [];\n        this._resources = resources;\n    }\n\n    visitParameter(node: ParameterExpression): Expression {\n        var found = false;\n\n        for (var i = this._stack.length - 1; i >= 0; i--) {\n            if (this._stack[i].indexOf(node) >= 0) {\n                found = true;\n                break;\n            }\n        }\n\n        if (!found) {\n            return Expression.constant(this._resources[node.name]);\n        }\n\n        return node;\n    }\n\n    visitLambda<T extends Function>(node: LambdaExpression<T>): Expression {\n        this._stack.push(node.parameters);\n\n        this.visit(node.body);\n\n        this._stack.pop();\n\n        return node;\n    }\n}\n\nclass PrintVisitor extends ExpressionVisitorGeneric<string> {\n    visitConstant(node: ConstantExpression): string {\n        return \"Constant(\" + node.value + \")\";\n    }\n\n    visitParameter(node: ParameterExpression): string {\n        return \"Parameter(\" + node.name + \")\";\n    }\n\n    visitBinary(node: BinaryExpression): string {\n        return ExpressionType[node.nodeType] + \"(\" + this.visit(node.left) + \", \" + this.visit(node.right) + \")\";\n    }\n\n    visitUnary(node: UnaryExpression): string {\n        return ExpressionType[node.nodeType] + \"(\" + this.visit(node.operand) + \")\";\n    }\n\n    visitConditional(node: ConditionalExpression): string {\n        return \"Conditional(\" + this.visit(node.test) + \", \" + this.visit(node.ifTrue) + \", \" + this.visit(node.ifFalse) + \")\";\n    }\n\n    visitLambda<T extends Function>(node: LambdaExpression<T>): string {\n        var body = this.visit(node.body);\n        var children = this.visitMany(node.parameters);\n        children.unshift(body);\n        return \"Lambda(\" + children.join(\", \") + \")\";\n    }\n\n    visitInvoke(node: InvocationExpression): string {\n        var expression = this.visit(node.expression);\n        var children = this.visitMany(node.args);\n        children.unshift(expression);\n        return \"Invoke(\" + children.join(\", \") + \")\";\n    }\n\n    visitCall(node: FunctionCallExpression): string {\n        var children = this.visitMany(node.args);\n        if (node.obj != null) {\n            children.unshift(this.visit(node.obj));\n        }\n        children.unshift(node.method);\n        return \"Call(\" + children.join(\", \") + \")\";\n    }\n\n    visitNew(node: NewExpression): string {\n        var children = this.visitMany(node.args);\n        children.unshift(node.type);\n        return \"New(\" + children.join(\", \") + \")\";\n    }\n\n    visitMember(node: MemberExpression): string {\n        var children = <string[]>[];\n        if (node.obj != null) {\n            children.unshift(this.visit(node.obj));\n        }\n        children.unshift(node.member);\n        return \"Member(\" + children.join(\", \") + \")\";\n    }\n\n    visitIndex(node: IndexExpression): string {\n        var children = this.visitMany(node.args);\n        if (node.obj != null) {\n            children.unshift(this.visit(node.obj));\n        }\n        return \"Index(\" + children.join(\", \") + \")\";\n    }\n}\n\nclass BonsaiVisitor extends ExpressionVisitorGeneric<any> {\n    visitConstant(node: ConstantExpression): any {\n        return [ \":\", node.value ];\n    }\n\n    visitParameter(node: ParameterExpression): any {\n        return [\"$\", node.name];\n    }\n\n    visitBinary(node: BinaryExpression): any {\n        var i = \"\";\n\n        switch (node.nodeType) {\n            case ExpressionType.Add:\n                i = \"+\";\n                break;\n            case ExpressionType.Subtract:\n                i = \"-\";\n                break;\n            case ExpressionType.Multiply:\n                i = \"*\";\n                break;\n            case ExpressionType.Divide:\n                i = \"/\";\n                break;\n            case ExpressionType.Modulo:\n                i = \"%\";\n                break;\n            case ExpressionType.And:\n                i = \"&\";\n                break;\n            case ExpressionType.Or:\n                i = \"|\";\n                break;\n            case ExpressionType.AndAlso:\n                i = \"&&\";\n                break;\n            case ExpressionType.OrElse:\n                i = \"||\";\n                break;\n            case ExpressionType.ExclusiveOr:\n                i = \"^\";\n                break;\n            case ExpressionType.Equal:\n                i = \"===\";\n                break;\n            case ExpressionType.NotEqual:\n                i = \"!==\";\n                break;\n            case ExpressionType.LessThan:\n                i = \"<\";\n                break;\n            case ExpressionType.LessThanOrEqual:\n                i = \"<=\";\n                break;\n            case ExpressionType.GreaterThan:\n                i = \">\";\n                break;\n            case ExpressionType.GreaterThanOrEqual:\n                i = \">=\";\n                break;\n            case ExpressionType.LeftShift:\n                i = \"<<\";\n                break;\n            case ExpressionType.RightShift:\n                i = \">>\";\n                break;\n        }\n\n        return [ i, this.visit(node.left), this.visit(node.right) ];\n    }\n\n    visitUnary(node: UnaryExpression): any {\n        var i = \"\";\n\n        switch (node.nodeType) {\n            case ExpressionType.Negate:\n                i = \"-\";\n                break;\n            case ExpressionType.UnaryPlus:\n                i = \"+\";\n                break;\n            case ExpressionType.Not:\n                i = \"!\";\n                break;\n            case ExpressionType.OnesComplement:\n                i = \"~\";\n                break;\n        }\n\n        return [i, this.visit(node.operand)];\n    }\n\n    visitConditional(node: ConditionalExpression): any {\n        return [\"?:\", this.visit(node.test), this.visit(node.ifTrue), this.visit(node.ifFalse) ];\n    }\n\n    visitLambda<T extends Function>(node: LambdaExpression<T>): any {\n        return [\"=>\", this.visit(node.body), this.visitMany(node.parameters)];\n    }\n\n    visitInvoke(node: InvocationExpression): any {\n        var expression = this.visit(node.expression);\n        var args = this.visitMany(node.args);\n        return [\"()\", expression, args];\n    }\n\n    visitCall(node: FunctionCallExpression): any {\n        var args = <any[]>[];\n        if (node.obj != null) {\n            args.unshift(this.visit(node.obj));\n        }\n        args.unshift(this.visitMany(node.args));\n        return [\".()\", node.method, args];\n    }\n\n    visitNew(node: NewExpression): any {\n        var args = this.visitMany(node.args);\n        return [\"new\", args];\n    }\n\n    visitMember(node: MemberExpression): any {\n        var res = [\".\", node.member];\n        if (node.obj != null) {\n            res.unshift(this.visit(node.obj));\n        }\n        return res;\n    }\n\n    visitIndex(node: IndexExpression): any {\n        throw new Error(\"not implemented\");\n    }\n}"
  },
  {
    "path": "src/core/expressions/index.html",
    "content": "﻿<!DOCTYPE html>\n\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" />\n    <title>TypeScript Expression APIs</title>\n    <link rel=\"stylesheet\" href=\"app.css\" type=\"text/css\" />\n    <script src=\"app.js\"></script>\n    <script src=\"compiler.js\"></script>\n</head>\n<body>\n    <h1>TypeScript Expression APIs</h1>\n\n    <div id=\"content\"></div>\n</body>\n</html>\n"
  },
  {
    "path": "src/core/expressions/web.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "src/core/expressions/web.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>"
  },
  {
    "path": "src/core/expressions/web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  For more information on how to configure your ASP.NET application, please visit\n  http://go.microsoft.com/fwlink/?LinkId=169433\n  -->\n<configuration>\n  <system.web>\n    <compilation debug=\"true\" targetFramework=\"4.5\" />\n    <httpRuntime targetFramework=\"4.5\" />\n  </system.web>\n</configuration>"
  },
  {
    "path": "src/core/headers/aggregatesheader.js",
    "content": "  // References\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    BinaryDisposable = Rx.BinaryDisposable,\n    AnonymousObservable = Rx.AnonymousObservable,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    disposableEmpty = Rx.Disposable.empty,\n    helpers = Rx.helpers,\n    defaultComparer = helpers.defaultComparer,\n    identity = helpers.identity,\n    defaultSubComparer = helpers.defaultSubComparer,\n    isFunction = helpers.isFunction,\n    isPromise = helpers.isPromise,\n    isArrayLike = helpers.isArrayLike,\n    isIterable = helpers.isIterable,\n    inherits = Rx.internals.inherits,\n    observableFromPromise = Observable.fromPromise,\n    observableFrom = Observable.from,\n    bindCallback = Rx.internals.bindCallback,\n    EmptyError = Rx.EmptyError,\n    ObservableBase = Rx.ObservableBase,\n    ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError;\n"
  },
  {
    "path": "src/core/headers/asyncheader.js",
    "content": "  // Aliases\n  var Observable = Rx.Observable,\n    observableFromPromise = Observable.fromPromise,\n    observableThrow = Observable.throwError,\n    AnonymousObservable = Rx.AnonymousObservable,\n    ObservableBase = Rx.ObservableBase,\n    AsyncSubject = Rx.AsyncSubject,\n    disposableCreate = Rx.Disposable.create,\n    CompositeDisposable = Rx.CompositeDisposable,\n    immediateScheduler = Rx.Scheduler.immediate,\n    defaultScheduler = Rx.Scheduler['default'],\n    inherits = Rx.internals.inherits,\n    isScheduler = Rx.Scheduler.isScheduler,\n    isPromise = Rx.helpers.isPromise,\n    isFunction = Rx.helpers.isFunction,\n    isIterable = Rx.helpers.isIterable,\n    isArrayLike = Rx.helpers.isArrayLike;\n"
  },
  {
    "path": "src/core/headers/asyncintro.js",
    "content": ";(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.binding', 'exports'], function (Rx, exports) {\n      root.Rx = factory(root, exports, Rx);\n      return root.Rx;\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('./rx'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n"
  },
  {
    "path": "src/core/headers/backpressureheader.js",
    "content": "  // References\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    NAryDisposable = Rx.NAryDisposable,\n    Notification = Rx.Notification,\n    Subject = Rx.Subject,\n    Observer = Rx.Observer,\n    disposableEmpty = Rx.Disposable.empty,\n    disposableCreate = Rx.Disposable.create,\n    inherits = Rx.internals.inherits,\n    addProperties = Rx.internals.addProperties,\n    defaultScheduler = Rx.Scheduler['default'],\n    currentThreadScheduler = Rx.Scheduler.currentThread,\n    identity = Rx.helpers.identity,\n    isScheduler = Rx.Scheduler.isScheduler,\n    isFunction = Rx.helpers.isFunction,\n    checkDisposed = Rx.Disposable.checkDisposed;\n"
  },
  {
    "path": "src/core/headers/basicheader-compat.js",
    "content": "  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    defaultNow = Rx.helpers.defaultNow = (function () { return !!Date.now ? Date.now : function () { return +new Date; }; }()),\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.subscribe !== 'function' && typeof p.then === 'function'; },\n    isFunction = Rx.helpers.isFunction = (function () {\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      };\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n      return isFn;\n    }());\n\n    function cloneArray(arr) {\n      var len = arr.length, a = new Array(len);\n      for(var i = 0; i < len; i++) { a[i] = arr[i]; }\n      return a;\n    }\n"
  },
  {
    "path": "src/core/headers/basicheader.js",
    "content": "  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    defaultNow = Rx.helpers.defaultNow = Date.now,\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.subscribe !== 'function' && typeof p.then === 'function'; },\n    isFunction = Rx.helpers.isFunction = (function () {\n\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      };\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n\n      return isFn;\n    }());\n\n  function cloneArray(arr) { for(var a = [], i = 0, len = arr.length; i < len; i++) { a.push(arr[i]); } return a;}\n"
  },
  {
    "path": "src/core/headers/bindingheader.js",
    "content": "  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    ObservableBase = Rx.ObservableBase,\n    Subject = Rx.Subject,\n    AsyncSubject = Rx.AsyncSubject,\n    Observer = Rx.Observer,\n    ScheduledObserver = Rx.internals.ScheduledObserver,\n    disposableCreate = Rx.Disposable.create,\n    disposableEmpty = Rx.Disposable.empty,\n    BinaryDisposable = Rx.BinaryDisposable,\n    currentThreadScheduler = Rx.Scheduler.currentThread,\n    isFunction = Rx.helpers.isFunction,\n    inherits = Rx.internals.inherits,\n    addProperties = Rx.internals.addProperties,\n    checkDisposed = Rx.Disposable.checkDisposed;\n\n  // Utilities\n  function cloneArray(arr) {\n    var len = arr.length, a = new Array(len);\n    for(var i = 0; i < len; i++) { a[i] = arr[i]; }\n    return a;\n  }\n"
  },
  {
    "path": "src/core/headers/coincidenceheader.js",
    "content": "  var Observable = Rx.Observable,\n    ObservableBase = Rx.ObservableBase,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    Subject = Rx.Subject,\n    observableProto = Observable.prototype,\n    observableEmpty = Observable.empty,\n    observableNever = Observable.never,\n    AnonymousObservable = Rx.AnonymousObservable,\n    addRef = Rx.internals.addRef,\n    inherits = Rx.internals.inherits,\n    bindCallback = Rx.internals.bindCallback,\n    noop = Rx.helpers.noop,\n    isPromise = Rx.helpers.isPromise,\n    isFunction = Rx.helpers.isFunction,\n    observableFromPromise = Observable.fromPromise;\n"
  },
  {
    "path": "src/core/headers/core-bindingheader.js",
    "content": "  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    ObservableBase = Rx.ObservableBase,\n    Observer = Rx.Observer,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    disposableCreate = Rx.Disposable.create,\n    disposableEmpty = Rx.Disposable.empty,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    currentThreadScheduler = Rx.Scheduler.currentThread,\n    isFunction = Rx.helpers.isFunction,\n    inherits = Rx.internals.inherits,\n    addProperties = Rx.internals.addProperties,\n    checkDisposed = Rx.Disposable.checkDisposed;\n\n  // Utilities\n  function cloneArray(arr) {\n    var len = arr.length, a = new Array(len);\n    for(var i = 0; i < len; i++) { a[i] = arr[i]; }\n    return a;\n  }\n"
  },
  {
    "path": "src/core/headers/core-intro.js",
    "content": ";(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n    // Because of build optimizers\n    if (typeof define === 'function' && define.amd) {\n        define(['./rx.core'], function (Rx, exports) {\n            return factory(root, exports, Rx);\n        });\n    } else if (typeof module === 'object' && module && module.exports === freeExports) {\n        module.exports = factory(root, module.exports, require('./rx.core'));\n    } else {\n        root.Rx = factory(root, {}, root.Rx);\n    }\n}.call(this, function (root, exp, Rx, undefined) {\n"
  },
  {
    "path": "src/core/headers/core-testheader.js",
    "content": "  // Defaults\n  var Observer = Rx.Observer,\n    Observable = Rx.Observable,\n    Disposable = Rx.Disposable,\n    disposableEmpty = Disposable.empty,\n    disposableCreate = Disposable.create,\n    CompositeDisposable = Rx.CompositeDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    Scheduler = Rx.Scheduler,\n    ScheduledItem = Rx.internals.ScheduledItem,\n    SchedulePeriodicRecursive  = Rx.internals.SchedulePeriodicRecursive,\n    PriorityQueue = Rx.internals.PriorityQueue,\n    inherits = Rx.internals.inherits,\n    notImplemented = Rx.helpers.notImplemented,\n    defaultComparer = Rx.helpers.defaultComparer = function (a, b) { return isEqual(a, b); };\n"
  },
  {
    "path": "src/core/headers/coreheader.js",
    "content": "// Defaults\nvar\n  noop = Rx.helpers.noop = function () { },\n  defaultNow = Rx.helpers.defaultNow = (function () { return !!Date.now ? Date.now : function () { return +new Date; }; }()),\n  defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n  isPromise = Rx.helpers.isPromise = function (p) { return !!p && !isFunction(p.subscribe) && isFunction(p.then); },\n  defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); }\n  isFunction = Rx.helpers.isFunction = (function () {\n    var isFn = function (value) {\n      return typeof value == 'function' || false;\n    };\n\n    // fallback for older versions of Chrome and Safari\n    if (isFn(/x/)) {\n      isFn = function(value) {\n        return typeof value == 'function' && toString.call(value) == '[object Function]';\n      };\n    }\n    return isFn;\n  }());\n\n  var NotImplementedError = Rx.NotImplementedError = function (message) {\n    this.message = message || 'This operation is not implemented';\n    Error.call(this);\n  };\n  NotImplementedError.prototype = Error.prototype;\n\n  var NotSupportedError = Rx.NotSupportedError = function (message) {\n    this.message = message || 'This operation is not supported';\n    Error.call(this);\n  };\n  NotSupportedError.prototype = Error.prototype;\n\n  var notImplemented = Rx.helpers.notImplemented = function () {\n    throw new NotImplementedError();\n  };\n\n  var notSupported = Rx.helpers.notSupported = function () {\n    throw new NotSupportedError();\n  };\n"
  },
  {
    "path": "src/core/headers/enumeratorheader.js",
    "content": "  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o && o[$iterator$] !== undefined;\n  };\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  };\n\n  Rx.helpers.iterator = $iterator$;\n"
  },
  {
    "path": "src/core/headers/experimentalheader.js",
    "content": "  // Aliases\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    ObservableBase = Rx.ObservableBase,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    FlatMapObservable = Rx.FlatMapObservable,\n    observableConcat = Observable.concat,\n    observableDefer = Observable.defer,\n    observableEmpty = Observable.empty,\n    disposableEmpty = Rx.Disposable.empty,\n    CompositeDisposable = Rx.CompositeDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    Enumerable = Rx.internals.Enumerable,\n    enumerableOf = Enumerable.of,\n    currentThreadScheduler = Rx.Scheduler.currentThread,\n    AsyncSubject = Rx.AsyncSubject,\n    Observer = Rx.Observer,\n    inherits = Rx.internals.inherits,\n    addProperties = Rx.internals.addProperties,\n    helpers = Rx.helpers,\n    noop = helpers.noop,\n    isPromise = helpers.isPromise,\n    isFunction = helpers.isFunction,\n    isIterable = Rx.helpers.isIterable,\n    isArrayLike = Rx.helpers.isArrayLike,\n    isScheduler = Rx.Scheduler.isScheduler,\n    observableFromPromise = Observable.fromPromise;\n"
  },
  {
    "path": "src/core/headers/exports.js",
    "content": "  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    root.Rx = Rx;\n\n    define(function() {\n      return Rx;\n    });\n  } else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = Rx).Rx = Rx;\n    } else {\n      freeExports.Rx = Rx;\n    }\n  } else {\n    // in a browser or Rhino\n    root.Rx = Rx;\n  }\n"
  },
  {
    "path": "src/core/headers/intro.js",
    "content": ";(function (undefined) {\n\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  var Rx = {\n    internals: {},\n    config: {\n      Promise: root.Promise\n    },\n    helpers: { }\n  };\n"
  },
  {
    "path": "src/core/headers/joinpatternsheader.js",
    "content": "  // Aliases\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    observableThrow = Observable.throwError,\n    observerCreate = Rx.Observer.create,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    noop = Rx.helpers.noop,\n    inherits = Rx.internals.inherits,\n    isFunction = Rx.helpers.isFunction;\n"
  },
  {
    "path": "src/core/headers/license.js",
    "content": "// Copyright (c) Microsoft, All rights reserved. See License.txt in the project root for license information.\n"
  },
  {
    "path": "src/core/headers/liteextrasheader.js",
    "content": "  // References\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    observableNever = Observable.never,\n    observableThrow = Observable['throw'],\n    AnonymousObservable = Rx.AnonymousObservable,\n    ObservableBase = Rx.ObservableBase,\n    AnonymousObserver = Rx.AnonymousObserver,\n    notificationCreateOnNext = Rx.Notification.createOnNext,\n    notificationCreateOnError = Rx.Notification.createOnError,\n    notificationCreateOnCompleted = Rx.Notification.createOnCompleted,\n    Observer = Rx.Observer,\n    observerCreate = Observer.create,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    Subject = Rx.Subject,\n    internals = Rx.internals,\n    helpers = Rx.helpers,\n    ScheduledObserver = internals.ScheduledObserver,\n    SerialDisposable = Rx.SerialDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    disposableEmpty = Rx.Disposable.empty,\n    immediateScheduler = Rx.Scheduler.immediate,\n    defaultKeySerializer = helpers.defaultKeySerializer,\n    addRef = Rx.internals.addRef,\n    identity = helpers.identity,\n    isPromise = helpers.isPromise,\n    isFunction = helpers.isFunction,\n    inherits = internals.inherits,\n    bindCallback = internals.bindCallback,\n    noop = helpers.noop,\n    isScheduler = Rx.Scheduler.isScheduler,\n    observableFromPromise = Observable.fromPromise,\n    ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError;\n"
  },
  {
    "path": "src/core/headers/liteheader-compat.js",
    "content": "  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    defaultNow = Rx.helpers.defaultNow = (function () { return !!Date.now ? Date.now : function () { return +new Date; }; }()),\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.subscribe !== 'function' && typeof p.then === 'function'; },\n    isFunction = Rx.helpers.isFunction = (function () {\n\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      };\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n\n      return isFn;\n    }());\n\n    function cloneArray(arr) {\n      var len = arr.length, a = new Array(len);\n      for(var i = 0; i < len; i++) { a[i] = arr[i]; }\n      return a;\n    }\n"
  },
  {
    "path": "src/core/headers/liteheader.js",
    "content": "  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    defaultNow = Rx.helpers.defaultNow = Date.now,\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.subscribe !== 'function' && typeof p.then === 'function'; },\n    isFunction = Rx.helpers.isFunction = (function () {\n\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      };\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n\n      return isFn;\n    }());\n\n    function cloneArray(arr) {\n      var len = arr.length, a = new Array(len);\n      for(var i = 0; i < len; i++) { a[i] = arr[i]; }\n      return a;\n    }\n"
  },
  {
    "path": "src/core/headers/liteintro-compat.js",
    "content": ";(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite.compat'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite-compat'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n"
  },
  {
    "path": "src/core/headers/liteintro.js",
    "content": ";(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n"
  },
  {
    "path": "src/core/headers/litetestintro-compat.js",
    "content": ";(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite.virtualtime.compat'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite-virtualtime-compat'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n"
  },
  {
    "path": "src/core/headers/litetestintro.js",
    "content": ";(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.lite.virtualtime'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('rx-lite-virtualtime'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n"
  },
  {
    "path": "src/core/headers/outro.js",
    "content": "}.call(this));\n"
  },
  {
    "path": "src/core/headers/sortingheader.js",
    "content": "  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    observableNever = Observable.never,\n    isEqual = Rx.internals.isEqual,\n    defaultSubComparer = Rx.helpers.defaultSubComparer;\n"
  },
  {
    "path": "src/core/headers/subintro.js",
    "content": ";(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx'], function (Rx, exports) {\n      return factory(root, exports, Rx);\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('./rx'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n"
  },
  {
    "path": "src/core/headers/suboutro.js",
    "content": "  return Rx;\n}));\n"
  },
  {
    "path": "src/core/headers/testheader.js",
    "content": "  // Defaults\n  var Observer = Rx.Observer,\n    Observable = Rx.Observable,\n    Notification = Rx.Notification,\n    VirtualTimeScheduler = Rx.VirtualTimeScheduler,\n    Disposable = Rx.Disposable,\n    disposableEmpty = Disposable.empty,\n    disposableCreate = Disposable.create,\n    CompositeDisposable = Rx.CompositeDisposable,\n    inherits = Rx.internals.inherits,\n    defaultComparer = Rx.internals.isEqual;\n"
  },
  {
    "path": "src/core/headers/testintro.js",
    "content": ";(function (factory) {\n  var objectTypes = {\n    'function': true,\n    'object': true\n  };\n\n  function checkGlobal(value) {\n    return (value && value.Object === Object) ? value : null;\n  }\n\n  var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;\n  var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;\n  var freeGlobal = checkGlobal(freeExports && freeModule && typeof global === 'object' && global);\n  var freeSelf = checkGlobal(objectTypes[typeof self] && self);\n  var freeWindow = checkGlobal(objectTypes[typeof window] && window);\n  var moduleExports = (freeModule && freeModule.exports === freeExports) ? freeExports : null;\n  var thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n  var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();\n\n  // Because of build optimizers\n  if (typeof define === 'function' && define.amd) {\n    define(['./rx.virtualtime', 'exports'], function (Rx, exports) {\n      root.Rx = factory(root, exports, Rx);\n      return root.Rx;\n    });\n  } else if (typeof module === 'object' && module && module.exports === freeExports) {\n    module.exports = factory(root, module.exports, require('./rx'));\n  } else {\n    root.Rx = factory(root, {}, root.Rx);\n  }\n}.call(this, function (root, exp, Rx, undefined) {\n"
  },
  {
    "path": "src/core/headers/timeheader.js",
    "content": "  // Refernces\n  var inherits = Rx.internals.inherits,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    ObservableBase = Rx.ObservableBase,\n    observableDefer = Observable.defer,\n    observableEmpty = Observable.empty,\n    observableNever = Observable.never,\n    observableThrow = Observable['throw'],\n    observableFromArray = Observable.fromArray,\n    defaultScheduler = Rx.Scheduler['default'],\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    BinaryDisposable = Rx.BinaryDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    Subject = Rx.Subject,\n    addRef = Rx.internals.addRef,\n    normalizeTime = Rx.Scheduler.normalize,\n    helpers = Rx.helpers,\n    isPromise = helpers.isPromise,\n    isFunction = helpers.isFunction,\n    isScheduler = Rx.Scheduler.isScheduler,\n    observableFromPromise = Observable.fromPromise;\n"
  },
  {
    "path": "src/core/headers/virtualtimeheader.js",
    "content": "  // Aliases\n  var Scheduler = Rx.Scheduler,\n    ScheduledItem = Rx.internals.ScheduledItem,\n    SchedulePeriodicRecursive  = Rx.internals.SchedulePeriodicRecursive,\n    PriorityQueue = Rx.internals.PriorityQueue,\n    inherits = Rx.internals.inherits,\n    defaultSubComparer = Rx.helpers.defaultSubComparer,\n    notImplemented = Rx.helpers.notImplemented;\n"
  },
  {
    "path": "src/core/internal/bindcallback.js",
    "content": "  var bindCallback = Rx.internals.bindCallback = function (func, thisArg, argCount) {\n    if (typeof thisArg === 'undefined') { return func; }\n    switch(argCount) {\n      case 0:\n        return function() {\n          return func.call(thisArg)\n        };\n      case 1:\n        return function(arg) {\n          return func.call(thisArg, arg);\n        };\n      case 2:\n        return function(value, index) {\n          return func.call(thisArg, value, index);\n        };\n      case 3:\n        return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n    }\n\n    return function() {\n      return func.apply(thisArg, arguments);\n    };\n  };\n"
  },
  {
    "path": "src/core/internal/dontenums.js",
    "content": "  /** Used to determine if values are of the language type Object */\n  var dontEnums = ['toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'],\n  dontEnumsLength = dontEnums.length;\n"
  },
  {
    "path": "src/core/internal/errors.js",
    "content": "  var EmptyError = Rx.EmptyError = function() {\n    this.message = 'Sequence contains no elements.';\n    Error.call(this);\n  };\n  EmptyError.prototype = Object.create(Error.prototype);\n  EmptyError.prototype.name = 'EmptyError';\n\n  var ObjectDisposedError = Rx.ObjectDisposedError = function() {\n    this.message = 'Object has been disposed';\n    Error.call(this);\n  };\n  ObjectDisposedError.prototype = Object.create(Error.prototype);\n  ObjectDisposedError.prototype.name = 'ObjectDisposedError';\n\n  var ArgumentOutOfRangeError = Rx.ArgumentOutOfRangeError = function () {\n    this.message = 'Argument out of range';\n    Error.call(this);\n  };\n  ArgumentOutOfRangeError.prototype = Object.create(Error.prototype);\n  ArgumentOutOfRangeError.prototype.name = 'ArgumentOutOfRangeError';\n\n  var NotSupportedError = Rx.NotSupportedError = function (message) {\n    this.message = message || 'This operation is not supported';\n    Error.call(this);\n  };\n  NotSupportedError.prototype = Object.create(Error.prototype);\n  NotSupportedError.prototype.name = 'NotSupportedError';\n\n  var NotImplementedError = Rx.NotImplementedError = function (message) {\n    this.message = message || 'This operation is not implemented';\n    Error.call(this);\n  };\n  NotImplementedError.prototype = Object.create(Error.prototype);\n  NotImplementedError.prototype.name = 'NotImplementedError';\n\n  var notImplemented = Rx.helpers.notImplemented = function () {\n    throw new NotImplementedError();\n  };\n\n  var notSupported = Rx.helpers.notSupported = function () {\n    throw new NotSupportedError();\n  };\n"
  },
  {
    "path": "src/core/internal/isequal.js",
    "content": "var argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\nvar objectProto = Object.prototype,\n    hasOwnProperty = objectProto.hasOwnProperty,\n    objToString = objectProto.toString,\n    MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\nvar keys = Object.keys || (function() {\n    var hasOwnProperty = Object.prototype.hasOwnProperty,\n        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),\n        dontEnums = [\n          'toString',\n          'toLocaleString',\n          'valueOf',\n          'hasOwnProperty',\n          'isPrototypeOf',\n          'propertyIsEnumerable',\n          'constructor'\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    return function(obj) {\n      if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n        throw new TypeError('Object.keys called on non-object');\n      }\n\n      var result = [], prop, i;\n\n      for (prop in obj) {\n        if (hasOwnProperty.call(obj, prop)) {\n          result.push(prop);\n        }\n      }\n\n      if (hasDontEnumBug) {\n        for (i = 0; i < dontEnumsLength; i++) {\n          if (hasOwnProperty.call(obj, dontEnums[i])) {\n            result.push(dontEnums[i]);\n          }\n        }\n      }\n      return result;\n    };\n  }());\n\nfunction equalObjects(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objProps = keys(object),\n      objLength = objProps.length,\n      othProps = keys(other),\n      othLength = othProps.length;\n\n  if (objLength !== othLength && !isLoose) {\n    return false;\n  }\n  var index = objLength, key;\n  while (index--) {\n    key = objProps[index];\n    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  var skipCtor = isLoose;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key],\n        result;\n\n    if (!(result === undefined ? equalFunc(objValue, othValue, isLoose, stackA, stackB) : result)) {\n      return false;\n    }\n    skipCtor || (skipCtor = key === 'constructor');\n  }\n  if (!skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    if (objCtor !== othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor === 'function' && objCtor instanceof objCtor &&\n          typeof othCtor === 'function' && othCtor instanceof othCtor)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction equalByTag(object, other, tag) {\n  switch (tag) {\n    case boolTag:\n    case dateTag:\n      return +object === +other;\n\n    case errorTag:\n      return object.name === other.name && object.message === other.message;\n\n    case numberTag:\n      return (object !== +object) ?\n        other !== +other :\n        object === +other;\n\n    case regexpTag:\n    case stringTag:\n      return object === (other + '');\n  }\n  return false;\n}\n\nvar isObject = Rx.internals.isObject = function(value) {\n  var type = typeof value;\n  return !!value && (type === 'object' || type === 'function');\n};\n\nfunction isObjectLike(value) {\n  return !!value && typeof value === 'object';\n}\n\nfunction isLength(value) {\n  return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nvar isHostObject = (function() {\n  try {\n    Object({ 'toString': 0 } + '');\n  } catch(e) {\n    return function() { return false; };\n  }\n  return function(value) {\n    return typeof value.toString !== 'function' && typeof (value + '') === 'string';\n  };\n}());\n\nfunction isTypedArray(value) {\n  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nvar isArray = Array.isArray || function(value) {\n  return isObjectLike(value) && isLength(value.length) && objToString.call(value) === arrayTag;\n};\n\nfunction arraySome (array, predicate) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction equalArrays(array, other, equalFunc, isLoose, stackA, stackB) {\n  var index = -1,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength !== othLength && !(isLoose && othLength > arrLength)) {\n    return false;\n  }\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index],\n        result;\n\n    if (result !== undefined) {\n      if (result) {\n        continue;\n      }\n      return false;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (isLoose) {\n      if (!arraySome(other, function(othValue) {\n            return arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB);\n          })) {\n        return false;\n      }\n    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB))) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction baseIsEqualDeep(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = arrayTag,\n      othTag = arrayTag;\n\n  if (!objIsArr) {\n    objTag = objToString.call(object);\n    if (objTag === argsTag) {\n      objTag = objectTag;\n    } else if (objTag !== objectTag) {\n      objIsArr = isTypedArray(object);\n    }\n  }\n  if (!othIsArr) {\n    othTag = objToString.call(other);\n    if (othTag === argsTag) {\n      othTag = objectTag;\n    }\n  }\n  var objIsObj = objTag === objectTag && !isHostObject(object),\n      othIsObj = othTag === objectTag && !isHostObject(other),\n      isSameTag = objTag === othTag;\n\n  if (isSameTag && !(objIsArr || objIsObj)) {\n    return equalByTag(object, other, objTag);\n  }\n  if (!isLoose) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, isLoose, stackA, stackB);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  // For more information on detecting circular references see https://es5.github.io/#JO.\n  stackA || (stackA = []);\n  stackB || (stackB = []);\n\n  var length = stackA.length;\n  while (length--) {\n    if (stackA[length] === object) {\n      return stackB[length] === other;\n    }\n  }\n  // Add `object` and `other` to the stack of traversed objects.\n  stackA.push(object);\n  stackB.push(other);\n\n  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, isLoose, stackA, stackB);\n\n  stackA.pop();\n  stackB.pop();\n\n  return result;\n}\n\nfunction baseIsEqual(value, other, isLoose, stackA, stackB) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, baseIsEqual, isLoose, stackA, stackB);\n}\n\nvar isEqual = Rx.internals.isEqual = function (value, other) {\n  return baseIsEqual(value, other);\n};\n"
  },
  {
    "path": "src/core/internal/map.js",
    "content": "  var Map = root.Map || (function () {\n    function Map() {\n      this.size = 0;\n      this._values = [];\n      this._keys = [];\n    }\n\n    Map.prototype['delete'] = function (key) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) { return false; }\n      this._values.splice(i, 1);\n      this._keys.splice(i, 1);\n      this.size--;\n      return true;\n    };\n\n    Map.prototype.get = function (key) {\n      var i = this._keys.indexOf(key);\n      return i === -1 ? undefined : this._values[i];\n    };\n\n    Map.prototype.set = function (key, value) {\n      var i = this._keys.indexOf(key);\n      if (i === -1) {\n        this._keys.push(key);\n        this._values.push(value);\n        this.size++;\n      } else {\n        this._values[i] = value;\n      }\n      return this;\n    };\n\n    Map.prototype.forEach = function (cb, thisArg) {\n      for (var i = 0; i < this.size; i++) {\n        cb.call(thisArg, this._values[i], this._keys[i]);\n      }\n    };\n\n    return Map;\n  }());\n"
  },
  {
    "path": "src/core/internal/polyfills.js",
    "content": "  // Utilities\n  var toString = Object.prototype.toString;\n  var arrayClass = '[object Array]',\n      funcClass = '[object Function]',\n      stringClass = '[object String]';\n\n  if (!Array.prototype.forEach) {\n    Array.prototype.forEach = function (callback, thisArg) {\n      var T, k;\n\n      if (this == null) {\n        throw new TypeError(' this is null or not defined');\n      }\n\n      var O = Object(this);\n      var len = O.length >>> 0;\n\n      if (typeof callback !== 'function') {\n        throw new TypeError(callback + ' is not a function');\n      }\n\n      if (arguments.length > 1) {\n        T = thisArg;\n      }\n\n      k = 0;\n      while (k < len) {\n        var kValue;\n        if (k in O) {\n          kValue = O[k];\n          callback.call(T, kValue, k, O);\n        }\n        k++;\n      }\n    };\n  }\n\n  var boxedString = Object('a'),\n      splitString = boxedString[0] !== 'a' || !(0 in boxedString);\n  if (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n      var object = Object(this),\n        self = splitString && toString.call(this) === stringClass ?\n          this.split('') :\n          object,\n        length = self.length >>> 0,\n        thisp = arguments[1];\n\n      if (toString.call(fun) !== funcClass) {\n        throw new TypeError(fun + ' is not a function');\n      }\n\n      for (var i = 0; i < length; i++) {\n        if (i in self && !fun.call(thisp, self[i], i, object)) {\n          return false;\n        }\n      }\n      return true;\n    };\n  }\n\n  if (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n      var object = Object(this),\n        self = splitString && toString.call(this) === stringClass ?\n            this.split('') :\n            object,\n        length = self.length >>> 0,\n        result = new Array(length),\n        thisp = arguments[1];\n\n      if (toString.call(fun) !== funcClass) {\n        throw new TypeError(fun + ' is not a function');\n      }\n\n      for (var i = 0; i < length; i++) {\n        if (i in self) {\n          result[i] = fun.call(thisp, self[i], i, object);\n        }\n      }\n      return result;\n    };\n  }\n\n  if (!Array.prototype.filter) {\n    Array.prototype.filter = function (predicate) {\n      var results = [], item, t = new Object(this);\n      for (var i = 0, len = t.length >>> 0; i < len; i++) {\n        item = t[i];\n        if (i in t && predicate.call(arguments[1], item, i, t)) {\n          results.push(item);\n        }\n      }\n      return results;\n    };\n  }\n\n  if (!Array.isArray) {\n    Array.isArray = function (arg) {\n      return toString.call(arg) === arrayClass;\n    };\n  }\n\n  if (!Array.prototype.indexOf) {\n    Array.prototype.indexOf = function indexOf(searchElement) {\n      var t = Object(this);\n      var len = t.length >>> 0;\n      if (len === 0) {\n        return -1;\n      }\n      var n = 0;\n      if (arguments.length > 1) {\n        n = Number(arguments[1]);\n        if (n !== n) {\n          n = 0;\n        } else if (n !== 0 && n !== Infinity && n !== -Infinity) {\n          n = (n > 0 || -1) * Math.floor(Math.abs(n));\n        }\n      }\n      if (n >= len) {\n        return -1;\n      }\n      var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);\n      for (; k < len; k++) {\n        if (k in t && t[k] === searchElement) {\n          return k;\n        }\n      }\n      return -1;\n    };\n  }\n\n  // Fix for Tessel\n  if (!Object.prototype.propertyIsEnumerable) {\n    Object.prototype.propertyIsEnumerable = function (key) {\n      for (var k in this) { if (k === key) { return true; } }\n      return false;\n    };\n  }\n\n  if (!Object.keys) {\n    Object.keys = (function() {\n      'use strict';\n      var hasOwnProperty = Object.prototype.hasOwnProperty,\n      hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString');\n\n      return function(obj) {\n        if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n          throw new TypeError('Object.keys called on non-object');\n        }\n\n        var result = [], prop, i;\n\n        for (prop in obj) {\n          if (hasOwnProperty.call(obj, prop)) {\n            result.push(prop);\n          }\n        }\n\n        if (hasDontEnumBug) {\n          for (i = 0; i < dontEnumsLength; i++) {\n            if (hasOwnProperty.call(obj, dontEnums[i])) {\n              result.push(dontEnums[i]);\n            }\n          }\n        }\n        return result;\n      };\n    }());\n  }\n\n  if (typeof Object.create !== 'function') {\n    // Production steps of ECMA-262, Edition 5, 15.2.3.5\n    // Reference: http://es5.github.io/#x15.2.3.5\n    Object.create = (function() {\n      function Temp() {}\n\n      var hasOwn = Object.prototype.hasOwnProperty;\n\n      return function (O) {\n        if (typeof O !== 'object') {\n          throw new TypeError('Object prototype may only be an Object or null');\n        }\n\n        Temp.prototype = O;\n        var obj = new Temp();\n        Temp.prototype = null;\n\n        if (arguments.length > 1) {\n          // Object.defineProperties does ToObject on its first argument.\n          var Properties = Object(arguments[1]);\n          for (var prop in Properties) {\n            if (hasOwn.call(Properties, prop)) {\n              obj[prop] = Properties[prop];\n            }\n          }\n        }\n\n        // 5. Return obj\n        return obj;\n      };\n    })();\n  }\n\n  root.Element && root.Element.prototype.attachEvent && !root.Element.prototype.addEventListener && (function () {\n    function addMethod(name, fn) {\n      Window.prototype[name] = HTMLDocument.prototype[name] = Element.prototype[name] = fn;\n    }\n\n    addMethod('addEventListener', function (type, listener) {\n      var target = this;\n      var listeners = target._c1_listeners = target._c1_listeners || {};\n      var typeListeners = listeners[type] = listeners[type] || [];\n\n      target.attachEvent('on' + type, typeListeners.event = function (e) {\n        e || (e = root.event);\n\n        var documentElement = target.document &&\n          target.document.documentElement ||\n          target.documentElement ||\n          { scrollLeft: 0, scrollTop: 0 };\n\n        e.currentTarget = target;\n        e.pageX = e.clientX + documentElement.scrollLeft;\n        e.pageY = e.clientY + documentElement.scrollTop;\n\n        e.preventDefault = function () {\n          e.bubbledKeyCode = e.keyCode;\n          if (e.ctrlKey) {\n            try {\n              e.keyCode = 0;\n            } catch (e) { }\n          }\n          e.defaultPrevented = true;\n          e.returnValue = false;\n          e.modified = true;\n          e.returnValue = false;\n        };\n\n        e.stopImmediatePropagation = function () {\n          immediatePropagation = false;\n          e.cancelBubble = true;\n        };\n\n        e.stopPropagation = function () {\n          e.cancelBubble = true;\n        };\n\n        e.relatedTarget = e.fromElement || null;\n        e.target = e.srcElement || target;\n        e.timeStamp = +new Date();\n\n        // Normalize key events\n        switch(e.type) {\n          case 'keypress':\n            var c = ('charCode' in e ? e.charCode : e.keyCode);\n            if (c === 10) {\n              c = 0;\n              e.keyCode = 13;\n            } else if (c === 13 || c === 27) {\n              c = 0;\n            } else if (c === 3) {\n              c = 99;\n            }\n            e.charCode = c;\n            e.keyChar = e.charCode ? String.fromCharCode(e.charCode) : '';\n            break;\n        }\n\n        var copiedEvent = {};\n        for (var prop in e) {\n          copiedEvent[prop] = e[prop];\n        }\n\n        for (var i = 0, typeListenersCache = [].concat(typeListeners), typeListenerCache, immediatePropagation = true; immediatePropagation && (typeListenerCache = typeListenersCache[i]); ++i) {\n          for (var ii = 0, typeListener; typeListener = typeListeners[ii]; ++ii) {\n            if (typeListener === typeListenerCache) { typeListener.call(target, copiedEvent); break; }\n          }\n        }\n      });\n\n      typeListeners.push(listener);\n    });\n\n    addMethod('removeEventListener', function (type, listener) {\n      var target = this;\n      var listeners = target._c1_listeners = target._c1_listeners || {};\n      var typeListeners = listeners[type] = listeners[type] || [];\n\n      for (var i = typeListeners.length - 1, typeListener; typeListener = typeListeners[i]; --i) {\n        if (typeListener === listener) { typeListeners.splice(i, 1); break; }\n      }\n\n      !typeListeners.length &&\n        typeListeners.event &&\n        target.detachEvent('on' + type, typeListeners.event);\n    });\n\n    addMethod('dispatchEvent', function (e) {\n      var target = this;\n      var type = e.type;\n      var listeners = target._c1_listeners = target._c1_listeners || {};\n      var typeListeners = listeners[type] = listeners[type] || [];\n\n      try {\n        return target.fireEvent('on' + type, e);\n      } catch (err) {\n        return typeListeners.event && typeListeners.event(e);\n      }\n    });\n\n    function ready() {\n      if (ready.interval && document.body) {\n        ready.interval = clearInterval(ready.interval);\n\n        document.dispatchEvent(new CustomEvent('DOMContentLoaded'));\n      }\n    }\n\n    ready.interval = setInterval(ready, 1);\n\n    root.addEventListener('load', ready);\n  }());\n\n  (!root.CustomEvent || typeof root.CustomEvent === 'object') && (function() {\n    function CustomEvent (type, params) {\n      var event;\n      params = params || { bubbles: false, cancelable: false, detail: undefined };\n\n      try {\n        if (document.createEvent) {\n          event = document.createEvent('CustomEvent');\n          event.initCustomEvent(type, params.bubbles, params.cancelable, params.detail);\n        } else if (document.createEventObject) {\n          event = document.createEventObject();\n        }\n      } catch (error) {\n        event = document.createEvent('Event');\n        event.initEvent(type, params.bubbles, params.cancelable);\n        event.detail = params.detail;\n      }\n\n      return event;\n    }\n\n    root.CustomEvent && (CustomEvent.prototype = root.CustomEvent.prototype);\n    root.CustomEvent = CustomEvent;\n  }());\n"
  },
  {
    "path": "src/core/internal/priorityqueue.js",
    "content": "  function IndexedItem(id, value) {\n    this.id = id;\n    this.value = value;\n  }\n\n  IndexedItem.prototype.compareTo = function (other) {\n    var c = this.value.compareTo(other.value);\n    c === 0 && (c = this.id - other.id);\n    return c;\n  };\n\n  var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) {\n    this.items = new Array(capacity);\n    this.length = 0;\n  };\n\n  var priorityProto = PriorityQueue.prototype;\n  priorityProto.isHigherPriority = function (left, right) {\n    return this.items[left].compareTo(this.items[right]) < 0;\n  };\n\n  priorityProto.percolate = function (index) {\n    if (index >= this.length || index < 0) { return; }\n    var parent = index - 1 >> 1;\n    if (parent < 0 || parent === index) { return; }\n    if (this.isHigherPriority(index, parent)) {\n      var temp = this.items[index];\n      this.items[index] = this.items[parent];\n      this.items[parent] = temp;\n      this.percolate(parent);\n    }\n  };\n\n  priorityProto.heapify = function (index) {\n    +index || (index = 0);\n    if (index >= this.length || index < 0) { return; }\n    var left = 2 * index + 1,\n        right = 2 * index + 2,\n        first = index;\n    if (left < this.length && this.isHigherPriority(left, first)) {\n      first = left;\n    }\n    if (right < this.length && this.isHigherPriority(right, first)) {\n      first = right;\n    }\n    if (first !== index) {\n      var temp = this.items[index];\n      this.items[index] = this.items[first];\n      this.items[first] = temp;\n      this.heapify(first);\n    }\n  };\n\n  priorityProto.peek = function () { return this.items[0].value; };\n\n  priorityProto.removeAt = function (index) {\n    this.items[index] = this.items[--this.length];\n    this.items[this.length] = undefined;\n    this.heapify();\n  };\n\n  priorityProto.dequeue = function () {\n    var result = this.peek();\n    this.removeAt(0);\n    return result;\n  };\n\n  priorityProto.enqueue = function (item) {\n    var index = this.length++;\n    this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n    this.percolate(index);\n  };\n\n  priorityProto.remove = function (item) {\n    for (var i = 0; i < this.length; i++) {\n      if (this.items[i].value === item) {\n        this.removeAt(i);\n        return true;\n      }\n    }\n    return false;\n  };\n  PriorityQueue.count = 0;\n"
  },
  {
    "path": "src/core/internal/trycatch.js",
    "content": "  var errorObj = {e: {}};\n  \n  function tryCatcherGen(tryCatchTarget) {\n    return function tryCatcher() {\n      try {\n        return tryCatchTarget.apply(this, arguments);\n      } catch (e) {\n        errorObj.e = e;\n        return errorObj;\n      }\n    };\n  }\n\n  var tryCatch = Rx.internals.tryCatch = function tryCatch(fn) {\n    if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n    return tryCatcherGen(fn);\n  };\n\n  function thrower(e) {\n    throw e;\n  }\n"
  },
  {
    "path": "src/core/internal/util.js",
    "content": "  var hasProp = {}.hasOwnProperty,\n      slice = Array.prototype.slice;\n\n  var inherits = Rx.internals.inherits = function (child, parent) {\n    function __() { this.constructor = child; }\n    __.prototype = parent.prototype;\n    child.prototype = new __();\n  };\n\n  var addProperties = Rx.internals.addProperties = function (obj) {\n    for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n      var source = sources[idx];\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n  };\n\n  // Rx Utils\n  var addRef = Rx.internals.addRef = function (xs, r) {\n    return new AnonymousObservable(function (observer) {\n      return new BinaryDisposable(r.getDisposable(), xs.subscribe(observer));\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n"
  },
  {
    "path": "src/core/joins/activeplan.js",
    "content": "  function ActivePlan(joinObserverArray, onNext, onCompleted) {\n    this.joinObserverArray = joinObserverArray;\n    this.onNext = onNext;\n    this.onCompleted = onCompleted;\n    this.joinObservers = new Map();\n    for (var i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      var joinObserver = this.joinObserverArray[i];\n      this.joinObservers.set(joinObserver, joinObserver);\n    }\n  }\n\n  ActivePlan.prototype.dequeue = function () {\n    this.joinObservers.forEach(function (v) { v.queue.shift(); });\n  };\n\n  ActivePlan.prototype.match = function () {\n    var i, len, hasValues = true;\n    for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      if (this.joinObserverArray[i].queue.length === 0) {\n        hasValues = false;\n        break;\n      }\n    }\n    if (hasValues) {\n      var firstValues = [],\n          isCompleted = false;\n      for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n        firstValues.push(this.joinObserverArray[i].queue[0]);\n        this.joinObserverArray[i].queue[0].kind === 'C' && (isCompleted = true);\n      }\n      if (isCompleted) {\n        this.onCompleted();\n      } else {\n        this.dequeue();\n        var values = [];\n        for (i = 0, len = firstValues.length; i < firstValues.length; i++) {\n          values.push(firstValues[i].value);\n        }\n        this.onNext.apply(this, values);\n      }\n    }\n  };\n"
  },
  {
    "path": "src/core/joins/joinobserver.js",
    "content": "  var JoinObserver = (function (__super__) {\n    inherits(JoinObserver, __super__);\n\n    function JoinObserver(source, onError) {\n      __super__.call(this);\n      this.source = source;\n      this.onError = onError;\n      this.queue = [];\n      this.activePlans = [];\n      this.subscription = new SingleAssignmentDisposable();\n      this.isDisposed = false;\n    }\n\n    var JoinObserverPrototype = JoinObserver.prototype;\n\n    JoinObserverPrototype.next = function (notification) {\n      if (!this.isDisposed) {\n        if (notification.kind === 'E') {\n          return this.onError(notification.error);\n        }\n        this.queue.push(notification);\n        var activePlans = this.activePlans.slice(0);\n        for (var i = 0, len = activePlans.length; i < len; i++) {\n          activePlans[i].match();\n        }\n      }\n    };\n\n    JoinObserverPrototype.error = noop;\n    JoinObserverPrototype.completed = noop;\n\n    JoinObserverPrototype.addActivePlan = function (activePlan) {\n      this.activePlans.push(activePlan);\n    };\n\n    JoinObserverPrototype.subscribe = function () {\n      this.subscription.setDisposable(this.source.materialize().subscribe(this));\n    };\n\n    JoinObserverPrototype.removeActivePlan = function (activePlan) {\n      this.activePlans.splice(this.activePlans.indexOf(activePlan), 1);\n      this.activePlans.length === 0 && this.dispose();\n    };\n\n    JoinObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this.subscription.dispose();\n      }\n    };\n\n    return JoinObserver;\n  } (AbstractObserver));\n"
  },
  {
    "path": "src/core/joins/pattern.js",
    "content": "  /**\n   * @constructor\n   * Represents a join pattern over observable sequences.\n   */\n  function Pattern(patterns) {\n    this.patterns = patterns;\n  }\n\n  /**\n   *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n   *  @param other Observable sequence to match in addition to the current pattern.\n   *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n   */\n  Pattern.prototype.and = function (other) {\n    return new Pattern(this.patterns.concat(other));\n  };\n\n  /**\n   *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n   *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n   *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  Pattern.prototype.thenDo = function (selector) {\n    return new Plan(this, selector);\n  };\n"
  },
  {
    "path": "src/core/joins/plan.js",
    "content": "  function Plan(expression, selector) {\n    this.expression = expression;\n    this.selector = selector;\n  }\n\n  function handleOnError(o) { return function (e) { o.onError(e); }; }\n  function handleOnNext(self, observer) {\n    return function onNext () {\n      var result = tryCatch(self.selector).apply(self, arguments);\n      if (result === errorObj) { return observer.onError(result.e); }\n      observer.onNext(result);\n    };\n  }\n\n  Plan.prototype.activate = function (externalSubscriptions, observer, deactivate) {\n    var joinObservers = [], errHandler = handleOnError(observer);\n    for (var i = 0, len = this.expression.patterns.length; i < len; i++) {\n      joinObservers.push(planCreateObserver(externalSubscriptions, this.expression.patterns[i], errHandler));\n    }\n    var activePlan = new ActivePlan(joinObservers, handleOnNext(this, observer), function () {\n      for (var j = 0, jlen = joinObservers.length; j < jlen; j++) {\n        joinObservers[j].removeActivePlan(activePlan);\n      }\n      deactivate(activePlan);\n    });\n    for (i = 0, len = joinObservers.length; i < len; i++) {\n      joinObservers[i].addActivePlan(activePlan);\n    }\n    return activePlan;\n  };\n\n  function planCreateObserver(externalSubscriptions, observable, onError) {\n    var entry = externalSubscriptions.get(observable);\n    if (!entry) {\n      var observer = new JoinObserver(observable, onError);\n      externalSubscriptions.set(observable, observer);\n      return observer;\n    }\n    return entry;\n  }\n"
  },
  {
    "path": "src/core/linq/connectableobservable.js",
    "content": "  var RefCountObservable = (function (__super__) {\n    inherits(RefCountObservable, __super__);\n    function RefCountObservable(source) {\n      this.source = source;\n      this._count = 0;\n      this._connectableSubscription = null;\n      __super__.call(this);\n    }\n\n    RefCountObservable.prototype.subscribeCore = function (o) {\n      var subscription = this.source.subscribe(o);\n      ++this._count === 1 && (this._connectableSubscription = this.source.connect());\n      return new RefCountDisposable(this, subscription);\n    };\n\n    function RefCountDisposable(p, s) {\n      this._p = p;\n      this._s = s;\n      this.isDisposed = false;\n    }\n\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this._s.dispose();\n        --this._p._count === 0 && this._p._connectableSubscription.dispose();\n      }\n    };\n\n    return RefCountObservable;\n  }(ObservableBase));\n\n  var ConnectableObservable = Rx.ConnectableObservable = (function (__super__) {\n    inherits(ConnectableObservable, __super__);\n    function ConnectableObservable(source, subject) {\n      this.source = source;\n      this._connection = null;\n      this._source = source.asObservable();\n      this._subject = subject;\n      __super__.call(this);\n    }\n\n    function ConnectDisposable(parent, subscription) {\n      this._p = parent;\n      this._s = subscription;\n    }\n\n    ConnectDisposable.prototype.dispose = function () {\n      if (this._s) {\n        this._s.dispose();\n        this._s = null;\n        this._p._connection = null;\n      }\n    };\n\n    ConnectableObservable.prototype.connect = function () {\n      if (!this._connection) {\n        if (this._subject.isStopped) {\n          return disposableEmpty;\n        }\n        var subscription = this._source.subscribe(this._subject);\n        this._connection = new ConnectDisposable(this, subscription);\n      }\n      return this._connection;\n    };\n\n    ConnectableObservable.prototype._subscribe = function (o) {\n      return this._subject.subscribe(o);\n    };\n\n    ConnectableObservable.prototype.refCount = function () {\n      return new RefCountObservable(this);\n    };\n\n    return ConnectableObservable;\n  }(Observable));\n"
  },
  {
    "path": "src/core/linq/enumerable/while.js",
    "content": "  var WhileEnumerable = (function(__super__) {\n    inherits(WhileEnumerable, __super__);\n    function WhileEnumerable(c, s) {\n      this.c = c;\n      this.s = s;\n    }\n    WhileEnumerable.prototype[$iterator$] = function () {\n      var self = this;\n      return {\n        next: function () {\n          return self.c() ?\n           { done: false, value: self.s } :\n           { done: true, value: void 0 };\n        }\n      };\n    };\n    return WhileEnumerable;\n  }(Enumerable));\n  \n  function enumerableWhile(condition, source) {\n    return new WhileEnumerable(condition, source);\n  }  \n"
  },
  {
    "path": "src/core/linq/groupedobservable.js",
    "content": "  var UnderlyingObservable = (function (__super__) {\n    inherits(UnderlyingObservable, __super__);\n    function UnderlyingObservable(m, u) {\n      this._m = m;\n      this._u = u;\n      __super__.call(this);\n    }\n\n    UnderlyingObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(this._m.getDisposable(), this._u.subscribe(o));\n    };\n\n    return UnderlyingObservable;\n  }(ObservableBase));\n\n  var GroupedObservable = (function (__super__) {\n    inherits(GroupedObservable, __super__);\n    function GroupedObservable(key, underlyingObservable, mergedDisposable) {\n      __super__.call(this);\n      this.key = key;\n      this.underlyingObservable = !mergedDisposable ?\n        underlyingObservable :\n        new UnderlyingObservable(mergedDisposable, underlyingObservable);\n    }\n\n    GroupedObservable.prototype._subscribe = function (o) {\n      return this.underlyingObservable.subscribe(o);\n    };\n\n    return GroupedObservable;\n  }(Observable));\n"
  },
  {
    "path": "src/core/linq/observable/_extremaby.js",
    "content": "  var ExtremaByObservable = (function (__super__) {\n    inherits(ExtremaByObservable, __super__);\n    function ExtremaByObservable(source, k, c) {\n      this.source = source;\n      this._k = k;\n      this._c = c;\n      __super__.call(this);\n    }\n\n    ExtremaByObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ExtremaByObserver(o, this._k, this._c));\n    };\n\n    return ExtremaByObservable;\n  }(ObservableBase));\n\n  var ExtremaByObserver = (function (__super__) {\n    inherits(ExtremaByObserver, __super__);\n    function ExtremaByObserver(o, k, c) {\n      this._o = o;\n      this._k = k;\n      this._c = c;\n      this._v = null;\n      this._hv = false;\n      this._l = [];\n      __super__.call(this);\n    }\n\n    ExtremaByObserver.prototype.next = function (x) {\n      var key = tryCatch(this._k)(x);\n      if (key === errorObj) { return this._o.onError(key.e); }\n      var comparison = 0;\n      if (!this._hv) {\n        this._hv = true;\n        this._v = key;\n      } else {\n        comparison = tryCatch(this._c)(key, this._v);\n        if (comparison === errorObj) { return this._o.onError(comparison.e); }\n      }\n      if (comparison > 0) {\n        this._v = key;\n        this._l = [];\n      }\n      if (comparison >= 0) { this._l.push(x); }\n    };\n\n    ExtremaByObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ExtremaByObserver.prototype.completed = function () {\n      this._o.onNext(this._l);\n      this._o.onCompleted();\n    };\n\n    return ExtremaByObserver;\n  }(AbstractObserver));\n"
  },
  {
    "path": "src/core/linq/observable/_findvalue.js",
    "content": "  var FindValueObserver = (function(__super__) {\n    inherits(FindValueObserver, __super__);\n    function FindValueObserver(observer, source, callback, yieldIndex) {\n      this._o = observer;\n      this._s = source;\n      this._cb = callback;\n      this._y = yieldIndex;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    FindValueObserver.prototype.next = function (x) {\n      var shouldRun = tryCatch(this._cb)(x, this._i, this._s);\n      if (shouldRun === errorObj) { return this._o.onError(shouldRun.e); }\n      if (shouldRun) {\n        this._o.onNext(this._y ? this._i : x);\n        this._o.onCompleted();\n      } else {\n        this._i++;\n      }\n    };\n\n    FindValueObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    FindValueObserver.prototype.completed = function () {\n      this._y && this._o.onNext(-1);\n      this._o.onCompleted();\n    };\n\n    return FindValueObserver;\n  }(AbstractObserver));\n\n  function findValue (source, predicate, thisArg, yieldIndex) {\n    var callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new FindValueObserver(o, source, callback, yieldIndex));\n    }, source);\n  }\n"
  },
  {
    "path": "src/core/linq/observable/_firstonly.js",
    "content": "  function firstOnly(x) {\n    if (x.length === 0) { throw new EmptyError(); }\n    return x[0];\n  }\n"
  },
  {
    "path": "src/core/linq/observable/_observabletimer.js",
    "content": "  var TimerObservable = (function(__super__) {\n    inherits(TimerObservable, __super__);\n    function TimerObservable(dt, s) {\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimerObservable.prototype.subscribeCore = function (o) {\n      return this._s.scheduleFuture(o, this._dt, scheduleMethod);\n    };\n\n    function scheduleMethod(s, o) {\n      o.onNext(0);\n      o.onCompleted();\n    }\n\n    return TimerObservable;\n  }(ObservableBase));\n\n  function _observableTimer(dueTime, scheduler) {\n    return new TimerObservable(dueTime, scheduler);\n  }\n"
  },
  {
    "path": "src/core/linq/observable/_observabletimerdateandperiod.js",
    "content": "  function observableTimerDateAndPeriod(dueTime, period, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var d = dueTime, p = normalizeTime(period);\n      return scheduler.scheduleRecursiveFuture(0, d, function (count, self) {\n        if (p > 0) {\n          var now = scheduler.now();\n          d = new Date(d.getTime() + p);\n          d.getTime() <= now && (d = new Date(now + p));\n        }\n        observer.onNext(count);\n        self(count + 1, new Date(d));\n      });\n    });\n  }\n"
  },
  {
    "path": "src/core/linq/observable/_observabletimertimespanandperiod.js",
    "content": "  function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) {\n    return dueTime === period ?\n      new AnonymousObservable(function (observer) {\n        return scheduler.schedulePeriodic(0, period, function (count) {\n          observer.onNext(count);\n          return count + 1;\n        });\n      }) :\n      observableDefer(function () {\n        return observableTimerDateAndPeriod(new Date(scheduler.now() + dueTime), period, scheduler);\n      });\n  }\n"
  },
  {
    "path": "src/core/linq/observable/amb.js",
    "content": "  function amb(p, c) { return p.amb(c); }\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n   */\n  Observable.amb = function () {\n    var acc = observableNever(), items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(items);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    for (var i = 0, len = items.length; i < len; i++) {\n      acc = amb(acc, items[i]);\n    }\n    return acc;\n  };\n"
  },
  {
    "path": "src/core/linq/observable/ambproto.js",
    "content": "  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @param {Observable} rightSource Second observable sequence or Promise.\n   * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n   */\n  observableProto.amb = function (rightSource) {\n    var leftSource = this;\n    return new AnonymousObservable(function (observer) {\n      var choice,\n        leftChoice = 'L', rightChoice = 'R',\n        leftSubscription = new SingleAssignmentDisposable(),\n        rightSubscription = new SingleAssignmentDisposable();\n\n      isPromise(rightSource) && (rightSource = observableFromPromise(rightSource));\n\n      function choiceL() {\n        if (!choice) {\n          choice = leftChoice;\n          rightSubscription.dispose();\n        }\n      }\n\n      function choiceR() {\n        if (!choice) {\n          choice = rightChoice;\n          leftSubscription.dispose();\n        }\n      }\n\n      var leftSubscribe = observerCreate(\n        function (left) {\n          choiceL();\n          choice === leftChoice && observer.onNext(left);\n        },\n        function (e) {\n          choiceL();\n          choice === leftChoice && observer.onError(e);\n        },\n        function () {\n          choiceL();\n          choice === leftChoice && observer.onCompleted();\n        }\n      );\n      var rightSubscribe = observerCreate(\n        function (right) {\n          choiceR();\n          choice === rightChoice && observer.onNext(right);\n        },\n        function (e) {\n          choiceR();\n          choice === rightChoice && observer.onError(e);\n        },\n        function () {\n          choiceR();\n          choice === rightChoice && observer.onCompleted();\n        }\n      );\n\n      leftSubscription.setDisposable(leftSource.subscribe(leftSubscribe));\n      rightSubscription.setDisposable(rightSource.subscribe(rightSubscribe));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    });\n  };\n"
  },
  {
    "path": "src/core/linq/observable/and.js",
    "content": "  /**\n   *  Creates a pattern that matches when both observable sequences have an available value.\n   *\n   *  @param right Observable sequence to match with the current sequence.\n   *  @return {Pattern} Pattern object that matches when both observable sequences have an available value.\n   */\n  observableProto.and = function (right) {\n    return new Pattern([this, right]);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/asobservable.js",
    "content": "  function asObservable(source) {\n    return function subscribe(o) { return source.subscribe(o); };\n  }\n\n  /**\n   *  Hides the identity of an observable sequence.\n   * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n   */\n  observableProto.asObservable = function () {\n    return new AnonymousObservable(asObservable(this), this);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/average.js",
    "content": "  var AverageObservable = (function (__super__) {\n    inherits(AverageObservable, __super__);\n    function AverageObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    AverageObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new AverageObserver(o, this._fn, this.source));\n    };\n\n    return AverageObservable;\n  }(ObservableBase));\n\n  var AverageObserver = (function(__super__) {\n    inherits(AverageObserver, __super__);\n    function AverageObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._c = 0;\n      this._t = 0;\n      __super__.call(this);\n    }\n\n    AverageObserver.prototype.next = function (x) {\n      if(this._fn) {\n        var r = tryCatch(this._fn)(x, this._c++, this._s);\n        if (r === errorObj) { return this._o.onError(r.e); }\n        this._t += r;\n      } else {\n        this._c++;\n        this._t += x;\n      }\n    };\n    AverageObserver.prototype.error = function (e) { this._o.onError(e); };\n    AverageObserver.prototype.completed = function () {\n      if (this._c === 0) { return this._o.onError(new EmptyError()); }\n      this._o.onNext(this._t / this._c);\n      this._o.onCompleted();\n    };\n\n    return AverageObserver;\n  }(AbstractObserver));\n\n  /**\n   * Computes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the average of the sequence of values.\n   */\n  observableProto.average = function (keySelector, thisArg) {\n    var source = this, fn;\n    if (isFunction(keySelector)) {\n      fn = bindCallback(keySelector, thisArg, 3);\n    }\n    return new AverageObservable(source, fn);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/buffer.js",
    "content": "  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers.\n   *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n   *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n   *  @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.buffer = function () {\n    return this.window.apply(this, arguments)\n      .flatMap(toArray);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/bufferwithcount.js",
    "content": "  function toArray(x) { return x.toArray(); }\n  function notEmpty(x) { return x.length > 0; }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n   * @param {Number} count Length of each buffer.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithCount = observableProto.bufferCount = function (count, skip) {\n    typeof skip !== 'number' && (skip = count);\n    return this.windowWithCount(count, skip)\n      .flatMap(toArray)\n      .filter(notEmpty);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/bufferwithtime.js",
    "content": "  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n   * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n   * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n   * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithTime = observableProto.bufferTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n    return this.windowWithTime(timeSpan, timeShiftOrScheduler, scheduler).flatMap(toArray);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/bufferwithtimeorcount.js",
    "content": "  function toArray(x) { return x.toArray(); }\n\n  /**\n   *  Projects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed.\n   * @param {Number} timeSpan Maximum time length of a buffer.\n   * @param {Number} count Maximum element count of a buffer.\n   * @param {Scheduler} [scheduler]  Scheduler to run bufferin timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithTimeOrCount = observableProto.bufferTimeOrCount = function (timeSpan, count, scheduler) {\n    return this.windowWithTimeOrCount(timeSpan, count, scheduler).flatMap(toArray);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/case.js",
    "content": "   /**\n   *  Uses selector to determine which source in sources to use.\n   * @param {Function} selector The function which extracts the value for to test in a case statement.\n   * @param {Array} sources A object which has keys which correspond to the case statement labels.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n   *\n   * @returns {Observable} An observable sequence which is determined by a case statement.\n   */\n  Observable['case'] = function (selector, sources, defaultSourceOrScheduler) {\n    return observableDefer(function () {\n      isPromise(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableFromPromise(defaultSourceOrScheduler));\n      defaultSourceOrScheduler || (defaultSourceOrScheduler = observableEmpty());\n\n      isScheduler(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableEmpty(defaultSourceOrScheduler));\n\n      var result = sources[selector()];\n      isPromise(result) && (result = observableFromPromise(result));\n\n      return result || defaultSourceOrScheduler;\n    });\n  };\n"
  },
  {
    "path": "src/core/linq/observable/catch.js",
    "content": "  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n   * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n   */\n  var observableCatch = Observable['catch'] = function () {\n    var items;\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      var len = arguments.length;\n      items = new Array(len);\n      for(var i = 0; i < len; i++) { items[i] = arguments[i]; }\n    }\n    return enumerableOf(items).catchError();\n  };\n"
  },
  {
    "path": "src/core/linq/observable/catchproto.js",
    "content": "  var CatchObservable = (function (__super__) {\n    inherits(CatchObservable, __super__);\n    function CatchObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObservable.prototype.subscribeCore = function (o) {\n      var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();\n      subscription.setDisposable(d1);\n      d1.setDisposable(this.source.subscribe(new CatchObserver(o, subscription, this._fn)));\n      return subscription;\n    };\n\n    return CatchObservable;\n  }(ObservableBase));\n\n  var CatchObserver = (function(__super__) {\n    inherits(CatchObserver, __super__);\n    function CatchObserver(o, s, fn) {\n      this._o = o;\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CatchObserver.prototype.next = function (x) { this._o.onNext(x); };\n    CatchObserver.prototype.completed = function () { return this._o.onCompleted(); };\n    CatchObserver.prototype.error = function (e) {\n      var result = tryCatch(this._fn)(e);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      isPromise(result) && (result = observableFromPromise(result));\n\n      var d = new SingleAssignmentDisposable();\n      this._s.setDisposable(d);\n      d.setDisposable(result.subscribe(this._o));\n    };\n\n    return CatchObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n   * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n   */\n  observableProto['catch'] = function (handlerOrSecond) {\n    return isFunction(handlerOrSecond) ? new CatchObservable(this, handlerOrSecond) : observableCatch([this, handlerOrSecond]);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/combinelatestproto.js",
    "content": "  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   * This can be in the form of an argument list of observables or an array.\n   *\n   * @example\n   * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return combineLatest.apply(this, args);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/concatall.js",
    "content": "  /**\n   * Concatenates an observable sequence of observable sequences.\n   * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n   */\n  observableProto.concatAll = function () {\n    return this.merge(1);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/concatmap.js",
    "content": "  function concatMap(source, selector, thisArg) {\n    var selectorFunc = bindCallback(selector, thisArg, 3);\n    return source.map(function (x, i) {\n      var result = selectorFunc(x, i, source);\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));\n      return result;\n    }).concatAll();\n  }\n\n  /**\n   *  One of the Following:\n   *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   * @example\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n   *  Or:\n   *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n   *\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n   *  Or:\n   *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n   * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n   * source sequence onto which could be either an observable or Promise.\n   * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n   */\n  observableProto.selectConcat = observableProto.concatMap = function (selector, resultSelector, thisArg) {\n    if (isFunction(selector) && isFunction(resultSelector)) {\n      return this.concatMap(function (x, i) {\n        var selectorResult = selector(x, i);\n        isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));\n        (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));\n\n        return selectorResult.map(function (y, i2) {\n          return resultSelector(x, y, i, i2);\n        });\n      });\n    }\n    return isFunction(selector) ?\n      concatMap(this, selector, thisArg) :\n      concatMap(this, function () { return selector; });\n  };\n"
  },
  {
    "path": "src/core/linq/observable/concatmapobserver.js",
    "content": "  /**\n   * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.concatMapObserver = observableProto.selectConcatObserver = function(onNext, onError, onCompleted, thisArg) {\n    var source = this,\n        onNextFunc = bindCallback(onNext, thisArg, 2),\n        onErrorFunc = bindCallback(onError, thisArg, 1),\n        onCompletedFunc = bindCallback(onCompleted, thisArg, 0);\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNextFunc(x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onErrorFunc(err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompletedFunc();\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, this).concatAll();\n  };\n"
  },
  {
    "path": "src/core/linq/observable/concatproto.js",
    "content": "  /**\n   * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  observableProto.concat = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    args.unshift(this);\n    return observableConcat.apply(null, args);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/count.js",
    "content": "  var CountObservable = (function (__super__) {\n    inherits(CountObservable, __super__);\n    function CountObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    CountObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new CountObserver(o, this._fn, this.source));\n    };\n\n    return CountObservable;\n  }(ObservableBase));\n\n  var CountObserver = (function (__super__) {\n    inherits(CountObserver, __super__);\n\n    function CountObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      this._c = 0;\n      __super__.call(this);\n    }\n\n    CountObserver.prototype.next = function (x) {\n      if (this._fn) {\n        var result = tryCatch(this._fn)(x, this._i++, this._s);\n        if (result === errorObj) { return this._o.onError(result.e); }\n        Boolean(result) && (this._c++);\n      } else {\n        this._c++;\n      }\n    };\n    CountObserver.prototype.error = function (e) { this._o.onError(e); };\n    CountObserver.prototype.completed = function () {\n      this._o.onNext(this._c);\n      this._o.onCompleted();\n    };\n\n    return CountObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns an observable sequence containing a value that represents how many elements in the specified observable sequence satisfy a condition if provided, else the count of items.\n   * @example\n   * res = source.count();\n   * res = source.count(function (x) { return x > 3; });\n   * @param {Function} [predicate]A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with a number that represents how many elements in the input sequence satisfy the condition in the predicate function if provided, else the count of items in the sequence.\n   */\n  observableProto.count = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new CountObservable(this, fn);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/create.js",
    "content": "  /**\n   *  Creates an observable sequence from a specified subscribe method implementation.\n   * @example\n   *  var res = Rx.Observable.create(function (observer) { return function () { } );\n   *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n   *  var res = Rx.Observable.create(function (observer) { } );\n   * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n   * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n   */\n  Observable.create = function (subscribe, parent) {\n    return new AnonymousObservable(subscribe, parent);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/debounce.js",
    "content": "  var DebounceObservable = (function (__super__) {\n    inherits(DebounceObservable, __super__);\n    function DebounceObservable(source, dt, s) {\n      isScheduler(s) || (s = defaultScheduler);\n      this.source = source;\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    DebounceObservable.prototype.subscribeCore = function (o) {\n      var cancelable = new SerialDisposable();\n      return new BinaryDisposable(\n        this.source.subscribe(new DebounceObserver(o, this._dt, this._s, cancelable)),\n        cancelable);\n    };\n\n    return DebounceObservable;\n  }(ObservableBase));\n\n  var DebounceObserver = (function (__super__) {\n    inherits(DebounceObserver, __super__);\n    function DebounceObserver(observer, dueTime, scheduler, cancelable) {\n      this._o = observer;\n      this._d = dueTime;\n      this._scheduler = scheduler;\n      this._c = cancelable;\n      this._v = null;\n      this._hv = false;\n      this._id = 0;\n      __super__.call(this);\n    }\n\n    function scheduleFuture(s, state) {\n      state.self._hv && state.self._id === state.currentId && state.self._o.onNext(state.x);\n      state.self._hv = false;\n    }\n\n    DebounceObserver.prototype.next = function (x) {\n      this._hv = true;\n      this._v = x;\n      var currentId = ++this._id, d = new SingleAssignmentDisposable();\n      this._c.setDisposable(d);\n      d.setDisposable(this._scheduler.scheduleFuture(this, this._d, function (_, self) {\n        self._hv && self._id === currentId && self._o.onNext(x);\n        self._hv = false;\n      }));\n    };\n\n    DebounceObserver.prototype.error = function (e) {\n      this._c.dispose();\n      this._o.onError(e);\n      this._hv = false;\n      this._id++;\n    };\n\n    DebounceObserver.prototype.completed = function () {\n      this._c.dispose();\n      this._hv && this._o.onNext(this._v);\n      this._o.onCompleted();\n      this._hv = false;\n      this._id++;\n    };\n\n    return DebounceObserver;\n  }(AbstractObserver));\n\n  function debounceWithSelector(source, durationSelector) {\n    return new AnonymousObservable(function (o) {\n      var value, hasValue = false, cancelable = new SerialDisposable(), id = 0;\n      var subscription = source.subscribe(\n        function (x) {\n          var throttle = tryCatch(durationSelector)(x);\n          if (throttle === errorObj) { return o.onError(throttle.e); }\n\n          isPromise(throttle) && (throttle = observableFromPromise(throttle));\n\n          hasValue = true;\n          value = x;\n          id++;\n          var currentid = id, d = new SingleAssignmentDisposable();\n          cancelable.setDisposable(d);\n          d.setDisposable(throttle.subscribe(\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            },\n            function (e) { o.onError(e); },\n            function () {\n              hasValue && id === currentid && o.onNext(value);\n              hasValue = false;\n              d.dispose();\n            }\n          ));\n        },\n        function (e) {\n          cancelable.dispose();\n          o.onError(e);\n          hasValue = false;\n          id++;\n        },\n        function () {\n          cancelable.dispose();\n          hasValue && o.onNext(value);\n          o.onCompleted();\n          hasValue = false;\n          id++;\n        }\n      );\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  observableProto.debounce = function () {\n    if (isFunction (arguments[0])) {\n      return debounceWithSelector(this, arguments[0]);\n    } else if (typeof arguments[0] === 'number') {\n      return new DebounceObservable(this, arguments[0], arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n"
  },
  {
    "path": "src/core/linq/observable/defaultifempty.js",
    "content": "  var DefaultIfEmptyObserver = (function (__super__) {\n    inherits(DefaultIfEmptyObserver, __super__);\n    function DefaultIfEmptyObserver(o, d) {\n      this._o = o;\n      this._d = d;\n      this._f = false;\n      __super__.call(this);\n    }\n\n    DefaultIfEmptyObserver.prototype.next = function (x) {\n      this._f = true;\n      this._o.onNext(x);\n    };\n\n    DefaultIfEmptyObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    DefaultIfEmptyObserver.prototype.completed = function () {\n      !this._f && this._o.onNext(this._d);\n      this._o.onCompleted();\n    };\n\n    return DefaultIfEmptyObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n   *\n   *  var res = obs = xs.defaultIfEmpty();\n   *  2 - obs = xs.defaultIfEmpty(false);\n   *\n   * @memberOf Observable#\n   * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n   * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n   */\n    observableProto.defaultIfEmpty = function (defaultValue) {\n      var source = this;\n      defaultValue === undefined && (defaultValue = null);\n      return new AnonymousObservable(function (o) {\n        return source.subscribe(new DefaultIfEmptyObserver(o, defaultValue));\n      }, source);\n    };\n"
  },
  {
    "path": "src/core/linq/observable/defer.js",
    "content": "  var Defer = (function(__super__) {\n    inherits(Defer, __super__);\n    function Defer(factory) {\n      this._f = factory;\n      __super__.call(this);\n    }\n\n    Defer.prototype.subscribeCore = function (o) {\n      var result = tryCatch(this._f)();\n      if (result === errorObj) { return observableThrow(result.e).subscribe(o);}\n      isPromise(result) && (result = observableFromPromise(result));\n      return result.subscribe(o);\n    };\n\n    return Defer;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n   *\n   * @example\n   *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n   * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n   * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n   */\n  var observableDefer = Observable.defer = function (observableFactory) {\n    return new Defer(observableFactory);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/delay.js",
    "content": "  function observableDelayRelative(source, dueTime, scheduler) {\n    return new AnonymousObservable(function (o) {\n      var active = false,\n        cancelable = new SerialDisposable(),\n        exception = null,\n        q = [],\n        running = false,\n        subscription;\n      subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) {\n        var d, shouldRun;\n        if (notification.value.kind === 'E') {\n          q = [];\n          q.push(notification);\n          exception = notification.value.error;\n          shouldRun = !running;\n        } else {\n          q.push({ value: notification.value, timestamp: notification.timestamp + dueTime });\n          shouldRun = !active;\n          active = true;\n        }\n        if (shouldRun) {\n          if (exception !== null) {\n            o.onError(exception);\n          } else {\n            d = new SingleAssignmentDisposable();\n            cancelable.setDisposable(d);\n            d.setDisposable(scheduler.scheduleRecursiveFuture(null, dueTime, function (_, self) {\n              var e, recurseDueTime, result, shouldRecurse;\n              if (exception !== null) {\n                return;\n              }\n              running = true;\n              do {\n                result = null;\n                if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) {\n                  result = q.shift().value;\n                }\n                if (result !== null) {\n                  result.accept(o);\n                }\n              } while (result !== null);\n              shouldRecurse = false;\n              recurseDueTime = 0;\n              if (q.length > 0) {\n                shouldRecurse = true;\n                recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now());\n              } else {\n                active = false;\n              }\n              e = exception;\n              running = false;\n              if (e !== null) {\n                o.onError(e);\n              } else if (shouldRecurse) {\n                self(null, recurseDueTime);\n              }\n            }));\n          }\n        }\n      });\n      return new BinaryDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  function observableDelayAbsolute(source, dueTime, scheduler) {\n    return observableDefer(function () {\n      return observableDelayRelative(source, dueTime - scheduler.now(), scheduler);\n    });\n  }\n\n  function delayWithSelector(source, subscriptionDelay, delayDurationSelector) {\n    var subDelay, selector;\n    if (isFunction(subscriptionDelay)) {\n      selector = subscriptionDelay;\n    } else {\n      subDelay = subscriptionDelay;\n      selector = delayDurationSelector;\n    }\n    return new AnonymousObservable(function (o) {\n      var delays = new CompositeDisposable(), atEnd = false, subscription = new SerialDisposable();\n\n      function start() {\n        subscription.setDisposable(source.subscribe(\n          function (x) {\n            var delay = tryCatch(selector)(x);\n            if (delay === errorObj) { return o.onError(delay.e); }\n            var d = new SingleAssignmentDisposable();\n            delays.add(d);\n            d.setDisposable(delay.subscribe(\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              },\n              function (e) { o.onError(e); },\n              function () {\n                o.onNext(x);\n                delays.remove(d);\n                done();\n              }\n            ));\n          },\n          function (e) { o.onError(e); },\n          function () {\n            atEnd = true;\n            subscription.dispose();\n            done();\n          }\n        ));\n      }\n\n      function done () {\n        atEnd && delays.length === 0 && o.onCompleted();\n      }\n\n      if (!subDelay) {\n        start();\n      } else {\n        subscription.setDisposable(subDelay.subscribe(start, function (e) { o.onError(e); }, start));\n      }\n\n      return new BinaryDisposable(subscription, delays);\n    }, source);\n  }\n\n  /**\n   *  Time shifts the observable sequence by dueTime.\n   *  The relative time intervals between the values are preserved.\n   *\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n   * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delay = function () {\n    var firstArg = arguments[0];\n    if (typeof firstArg === 'number' || firstArg instanceof Date) {\n      var dueTime = firstArg, scheduler = arguments[1];\n      isScheduler(scheduler) || (scheduler = defaultScheduler);\n      return dueTime instanceof Date ?\n        observableDelayAbsolute(this, dueTime, scheduler) :\n        observableDelayRelative(this, dueTime, scheduler);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return delayWithSelector(this, firstArg, arguments[1]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n"
  },
  {
    "path": "src/core/linq/observable/delaysubscription.js",
    "content": "  var DelaySubscription = (function(__super__) {\n    inherits(DelaySubscription, __super__);\n    function DelaySubscription(source, dt, s) {\n      this.source = source;\n      this._dt = dt;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    DelaySubscription.prototype.subscribeCore = function (o) {\n      var d = new SerialDisposable();\n\n      d.setDisposable(this._s.scheduleFuture([this.source, o, d], this._dt, scheduleMethod));\n\n      return d;\n    };\n\n    function scheduleMethod(s, state) {\n      var source = state[0], o = state[1], d = state[2];\n      d.setDisposable(source.subscribe(o));\n    }\n\n    return DelaySubscription;\n  }(ObservableBase));\n\n  /**\n   *  Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.delaySubscription(5000); // 5s\n   *  2 - res = source.delaySubscription(5000, Rx.Scheduler.default); // 5 seconds\n   *\n   * @param {Number} dueTime Relative or absolute time shift of the subscription.\n   * @param {Scheduler} [scheduler]  Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delaySubscription = function (dueTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new DelaySubscription(this, dueTime, scheduler);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/dematerialize.js",
    "content": "  var DematerializeObservable = (function (__super__) {\n    inherits(DematerializeObservable, __super__);\n    function DematerializeObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    DematerializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DematerializeObserver(o));\n    };\n\n    return DematerializeObservable;\n  }(ObservableBase));\n\n  var DematerializeObserver = (function (__super__) {\n    inherits(DematerializeObserver, __super__);\n\n    function DematerializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    DematerializeObserver.prototype.next = function (x) { x.accept(this._o); };\n    DematerializeObserver.prototype.error = function (e) { this._o.onError(e); };\n    DematerializeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DematerializeObserver;\n  }(AbstractObserver));\n\n  /**\n   * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n   * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n   */\n  observableProto.dematerialize = function () {\n    return new DematerializeObservable(this);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/distinct.js",
    "content": "  // Swap out for Array.findIndex\n  function arrayIndexOfComparer(array, item, comparer) {\n    for (var i = 0, len = array.length; i < len; i++) {\n      if (comparer(array[i], item)) { return i; }\n    }\n    return -1;\n  }\n\n  function HashSet(comparer) {\n    this.comparer = comparer;\n    this.set = [];\n  }\n  HashSet.prototype.push = function(value) {\n    var retValue = arrayIndexOfComparer(this.set, value, this.comparer) === -1;\n    retValue && this.set.push(value);\n    return retValue;\n  };\n\n  var DistinctObservable = (function (__super__) {\n    inherits(DistinctObservable, __super__);\n    function DistinctObservable(source, keyFn, cmpFn) {\n      this.source = source;\n      this._keyFn = keyFn;\n      this._cmpFn = cmpFn;\n      __super__.call(this);\n    }\n\n    DistinctObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctObserver(o, this._keyFn, this._cmpFn));\n    };\n\n    return DistinctObservable;\n  }(ObservableBase));\n\n  var DistinctObserver = (function (__super__) {\n    inherits(DistinctObserver, __super__);\n    function DistinctObserver(o, keyFn, cmpFn) {\n      this._o = o;\n      this._keyFn = keyFn;\n      this._h = new HashSet(cmpFn);\n      __super__.call(this);\n    }\n\n    DistinctObserver.prototype.next = function (x) {\n      var key = x;\n      if (isFunction(this._keyFn)) {\n        key = tryCatch(this._keyFn)(x);\n        if (key === errorObj) { return this._o.onError(key.e); }\n      }\n      this._h.push(key) && this._o.onNext(x);\n    };\n\n    DistinctObserver.prototype.error = function (e) { this._o.onError(e); };\n    DistinctObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return DistinctObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n   *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n   *\n   * @example\n   *  var res = obs = xs.distinct();\n   *  2 - obs = xs.distinct(function (x) { return x.id; });\n   *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n   * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n   * @param {Function} [comparer]  Used to compare items in the collection.\n   * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinct = function (keySelector, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctObservable(this, keySelector, comparer);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/dowhile.js",
    "content": "   /**\n   *  Repeats source as long as condition holds emulating a do while loop.\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  observableProto.doWhile = function (condition) {\n    return observableConcat([this, observableWhileDo(condition, this)]);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/elementat.js",
    "content": "  var ElementAtObservable = (function (__super__) {\n    inherits(ElementAtObservable, __super__);\n    function ElementAtObservable(source, i, d) {\n      this.source = source;\n      this._i = i;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    ElementAtObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ElementAtObserver(o, this._i, this._d));\n    };\n\n    return ElementAtObservable;\n  }(ObservableBase));\n\n  var ElementAtObserver = (function (__super__) {\n    inherits(ElementAtObserver, __super__);\n\n    function ElementAtObserver(o, i, d) {\n      this._o = o;\n      this._i = i;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    ElementAtObserver.prototype.next = function (x) {\n      if (this._i-- === 0) {\n        this._o.onNext(x);\n        this._o.onCompleted();\n      }\n    };\n    ElementAtObserver.prototype.error = function (e) { this._o.onError(e); };\n    ElementAtObserver.prototype.completed = function () {\n      if (this._d === undefined) {\n        this._o.onError(new ArgumentOutOfRangeError());\n      } else {\n        this._o.onNext(this._d);\n        this._o.onCompleted();\n      }\n    };\n\n    return ElementAtObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the element at a specified index in a sequence or default value if not found.\n   * @param {Number} index The zero-based index of the element to retrieve.\n   * @param {Any} [defaultValue] The default value to use if elementAt does not find a value.\n   * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence.\n   */\n  observableProto.elementAt =  function (index, defaultValue) {\n    if (index < 0) { throw new ArgumentOutOfRangeError(); }\n    return new ElementAtObservable(this, index, defaultValue);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/every.js",
    "content": "  var EveryObservable = (function (__super__) {\n    inherits(EveryObservable, __super__);\n    function EveryObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    EveryObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new EveryObserver(o, this._fn, this.source));\n    };\n\n    return EveryObservable;\n  }(ObservableBase));\n\n  var EveryObserver = (function (__super__) {\n    inherits(EveryObserver, __super__);\n\n    function EveryObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    EveryObserver.prototype.next = function (x) {\n      var result = tryCatch(this._fn)(x, this._i++, this._s);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      if (!Boolean(result)) {\n        this._o.onNext(false);\n        this._o.onCompleted();\n      }\n    };\n    EveryObserver.prototype.error = function (e) { this._o.onError(e); };\n    EveryObserver.prototype.completed = function () {\n      this._o.onNext(true);\n      this._o.onCompleted();\n    };\n\n    return EveryObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether all elements of an observable sequence satisfy a condition.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element determining whether all elements in the source sequence pass the test in the specified predicate.\n   */\n  observableProto.every = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new EveryObservable(this, fn);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/expand.js",
    "content": "  var ExpandObservable = (function(__super__) {\n    inherits(ExpandObservable, __super__);\n    function ExpandObservable(source, fn, scheduler) {\n      this.source = source;\n      this._fn = fn;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(args, recurse) {\n      var state = args[0], self = args[1];\n      var work;\n      if (state.q.length > 0) {\n        work = state.q.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var m1 = new SingleAssignmentDisposable();\n      state.d.add(m1);\n      m1.setDisposable(work.subscribe(new ExpandObserver(state, self, m1)));\n      recurse([state, self]);\n    }\n\n    ExpandObservable.prototype._ensureActive = function (state) {\n      var isOwner = false;\n      if (state.q.length > 0) {\n        isOwner = !state.isAcquired;\n        state.isAcquired = true;\n      }\n      isOwner && state.m.setDisposable(this._scheduler.scheduleRecursive([state, this], scheduleRecursive));\n    };\n\n    ExpandObservable.prototype.subscribeCore = function (o) {\n      var m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        state = {\n          q: [],\n          m: m,\n          d: d,\n          activeCount: 0,\n          isAcquired: false,\n          o: o\n        };\n\n      state.q.push(this.source);\n      state.activeCount++;\n      this._ensureActive(state);\n      return d;\n    };\n\n    return ExpandObservable;\n  }(ObservableBase));\n\n  var ExpandObserver = (function(__super__) {\n    inherits(ExpandObserver, __super__);\n    function ExpandObserver(state, parent, m1) {\n      this._s = state;\n      this._p = parent;\n      this._m1 = m1;\n      __super__.call(this);\n    }\n\n    ExpandObserver.prototype.next = function (x) {\n      this._s.o.onNext(x);\n      var result = tryCatch(this._p._fn)(x);\n      if (result === errorObj) { return this._s.o.onError(result.e); }\n      this._s.q.push(result);\n      this._s.activeCount++;\n      this._p._ensureActive(this._s);\n    };\n\n    ExpandObserver.prototype.error = function (e) {\n      this._s.o.onError(e);\n    };\n\n    ExpandObserver.prototype.completed = function () {\n      this._s.d.remove(this._m1);\n      this._s.activeCount--;\n      this._s.activeCount === 0 && this._s.o.onCompleted();\n    };\n\n    return ExpandObserver;\n  }(AbstractObserver));\n\n   /**\n   *  Expands an observable sequence by recursively invoking selector.\n   *\n   * @param {Function} selector Selector function to invoke for each produced element, resulting in another sequence to which the selector will be invoked recursively again.\n   * @param {Scheduler} [scheduler] Scheduler on which to perform the expansion. If not provided, this defaults to the current thread scheduler.\n   * @returns {Observable} An observable sequence containing all the elements produced by the recursive expansion.\n   */\n  observableProto.expand = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new ExpandObservable(this, selector, scheduler);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/find.js",
    "content": "  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the first element that matches the conditions defined by the specified predicate, if found; otherwise, undefined.\n   */\n  observableProto.find = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, false);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/findindex.js",
    "content": "  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns\n   * an Observable sequence with the zero-based index of the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the zero-based index of the first occurrence of an element that matches the conditions defined by match, if found; otherwise, –1.\n  */\n  observableProto.findIndex = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, true);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/first.js",
    "content": "  var FirstObservable = (function (__super__) {\n    inherits(FirstObservable, __super__);\n    function FirstObservable(source, obj) {\n      this.source = source;\n      this._obj = obj;\n      __super__.call(this);\n    }\n\n    FirstObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new FirstObserver(o, this._obj, this.source));\n    };\n\n    return FirstObservable;\n  }(ObservableBase));\n\n  var FirstObserver = (function(__super__) {\n    inherits(FirstObserver, __super__);\n    function FirstObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    FirstObserver.prototype.next = function (x) {\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        if (Boolean(res)) {\n          this._o.onNext(x);\n          this._o.onCompleted();\n        }\n      } else if (!this._obj.predicate) {\n        this._o.onNext(x);\n        this._o.onCompleted();\n      }\n    };\n    FirstObserver.prototype.error = function (e) { this._o.onError(e); };\n    FirstObserver.prototype.completed = function () {\n      if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return FirstObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the first element of an observable sequence that satisfies the condition in the predicate if present else the first item in the sequence.\n   * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate if provided, else the first item in the sequence.\n   */\n  observableProto.first = function () {\n    var obj = {}, source = this;\n    if (typeof arguments[0] === 'object') {\n      obj = arguments[0];\n    } else {\n      obj = {\n        predicate: arguments[0],\n        thisArg: arguments[1],\n        defaultValue: arguments[2]\n      };\n    }\n    if (isFunction (obj.predicate)) {\n      var fn = obj.predicate;\n      obj.predicate = bindCallback(fn, obj.thisArg, 3);\n    }\n    return new FirstObservable(this, obj);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/for.js",
    "content": "   /**\n   *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n   * There is an alias for this method called 'forIn' for browsers <IE9\n   * @param {Array} sources An array of values to turn into an observable sequence.\n   * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n   * @returns {Observable} An observable sequence from the concatenated observable sequences.\n   */\n  Observable['for'] = Observable.forIn = function (sources, resultSelector, thisArg) {\n    return enumerableOf(sources, resultSelector, thisArg).concat();\n  };\n"
  },
  {
    "path": "src/core/linq/observable/forkjoin.js",
    "content": "  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var ForkJoinObservable = (function (__super__) {\n    inherits(ForkJoinObservable, __super__);\n    function ForkJoinObservable(sources, cb) {\n      this._sources = sources;\n      this._cb = cb;\n      __super__.call(this);\n    }\n\n    ForkJoinObservable.prototype.subscribeCore = function (o) {\n      if (this._sources.length === 0) {\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      var count = this._sources.length;\n      var state = {\n        finished: false,\n        hasResults: new Array(count),\n        hasCompleted: new Array(count),\n        results: new Array(count)\n      };\n\n      var subscriptions = new CompositeDisposable();\n      for (var i = 0, len = this._sources.length; i < len; i++) {\n        var source = this._sources[i];\n        isPromise(source) && (source = observableFromPromise(source));\n        subscriptions.add(source.subscribe(new ForkJoinObserver(o, state, i, this._cb, subscriptions)));\n      }\n\n      return subscriptions;\n    };\n\n    return ForkJoinObservable;\n  }(ObservableBase));\n\n  var ForkJoinObserver = (function(__super__) {\n    inherits(ForkJoinObserver, __super__);\n    function ForkJoinObserver(o, s, i, cb, subs) {\n      this._o = o;\n      this._s = s;\n      this._i = i;\n      this._cb = cb;\n      this._subs = subs;\n      __super__.call(this);\n    }\n\n    ForkJoinObserver.prototype.next = function (x) {\n      if (!this._s.finished) {\n        this._s.hasResults[this._i] = true;\n        this._s.results[this._i] = x;\n      }\n    };\n\n    ForkJoinObserver.prototype.error = function (e) {\n      this._s.finished = true;\n      this._o.onError(e);\n      this._subs.dispose();\n    };\n\n    ForkJoinObserver.prototype.completed = function () {\n      if (!this._s.finished) {\n        if (!this._s.hasResults[this._i]) {\n          return this._o.onCompleted();\n        }\n        this._s.hasCompleted[this._i] = true;\n        for (var i = 0; i < this._s.results.length; i++) {\n          if (!this._s.hasCompleted[i]) { return; }\n        }\n        this._s.finished = true;\n\n        var res = tryCatch(this._cb).apply(null, this._s.results);\n        if (res === errorObj) { return this._o.onError(res.e); }\n\n        this._o.onNext(res);\n        this._o.onCompleted();\n      }\n    };\n\n    return ForkJoinObserver;\n  }(AbstractObserver));\n\n   /**\n   *  Runs all observable sequences in parallel and collect their last elements.\n   *\n   * @example\n   *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n   *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n   * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n   */\n  Observable.forkJoin = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n    return new ForkJoinObservable(args, resultSelector);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/forkjoinproto.js",
    "content": "   /**\n   *  Runs two observable sequences in parallel and combines their last elemenets.\n   * @param {Observable} second Second observable sequence.\n   * @param {Function} resultSelector Result selector function to invoke with the last elements of both sequences.\n   * @returns {Observable} An observable sequence with the result of calling the selector function with the last elements of both input sequences.\n   */\n  observableProto.forkJoin = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return Observable.forkJoin.apply(null, args);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/fromevent.js",
    "content": "  function isNodeList(el) {\n    if (root.StaticNodeList) {\n      // IE8 Specific\n      // instanceof is slower than Object#toString, but Object#toString will not work as intended in IE8\n      return el instanceof root.StaticNodeList || el instanceof root.NodeList;\n    } else {\n      return Object.prototype.toString.call(el) === '[object NodeList]';\n    }\n  }\n\n  function ListenDisposable(e, n, fn) {\n    this._e = e;\n    this._n = n;\n    this._fn = fn;\n    this._e.addEventListener(this._n, this._fn, false);\n    this.isDisposed = false;\n  }\n  ListenDisposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this._e.removeEventListener(this._n, this._fn, false);\n      this.isDisposed = true;\n    }\n  };\n\n  function createEventListener (el, eventName, handler) {\n    var disposables = new CompositeDisposable();\n\n    // Asume NodeList or HTMLCollection\n    var elemToString = Object.prototype.toString.call(el);\n    if (isNodeList(el) || elemToString === '[object HTMLCollection]') {\n      for (var i = 0, len = el.length; i < len; i++) {\n        disposables.add(createEventListener(el.item(i), eventName, handler));\n      }\n    } else if (el) {\n      disposables.add(new ListenDisposable(el, eventName, handler));\n    }\n\n    return disposables;\n  }\n\n  /**\n   * Configuration option to determine whether to use native events only\n   */\n  Rx.config.useNativeEvents = false;\n\n  var EventObservable = (function(__super__) {\n    inherits(EventObservable, __super__);\n    function EventObservable(el, name, fn) {\n      this._el = el;\n      this._n = name;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventObservable.prototype.subscribeCore = function (o) {\n      return createEventListener(\n        this._el,\n        this._n,\n        createHandler(o, this._fn));\n    };\n\n    return EventObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n   * @param {Object} element The DOMElement or NodeList to attach a listener.\n   * @param {String} eventName The event name to attach the observable sequence.\n   * @param {Object} eventListenerOptions An object describing EventListenerOptions\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n   */\n  Observable.fromEvent = function (element, eventName, selector, eventListenerOptions) {\n    // Node.js specific\n    if (element.addListener) {\n      return fromEventPattern(\n        function (h) { element.addListener(eventName, h, eventListenerOptions); },\n        function (h) { element.removeListener(eventName, h, eventListenerOptions); },\n        selector);\n    }\n\n    // Use only if non-native events are allowed\n    if (!Rx.config.useNativeEvents) {\n      // Handles jq, Angular.js, Zepto, Marionette, Ember.js\n      if (typeof element.on === 'function' && typeof element.off === 'function') {\n        return fromEventPattern(\n          function (h) { element.on(eventName, h, eventListenerOptions); },\n          function (h) { element.off(eventName, h, eventListenerOptions); },\n          selector);\n      }\n    }\n\n    return new EventObservable(element, eventName, selector).publish().refCount();\n  };\n"
  },
  {
    "path": "src/core/linq/observable/fromeventpattern.js",
    "content": "  var EventPatternObservable = (function(__super__) {\n    inherits(EventPatternObservable, __super__);\n    function EventPatternObservable(add, del, fn) {\n      this._add = add;\n      this._del = del;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    function createHandler(o, fn) {\n      return function handler () {\n        var results = arguments[0];\n        if (isFunction(fn)) {\n          results = tryCatch(fn).apply(null, arguments);\n          if (results === errorObj) { return o.onError(results.e); }\n        }\n        o.onNext(results);\n      };\n    }\n\n    EventPatternObservable.prototype.subscribeCore = function (o) {\n      var fn = createHandler(o, this._fn);\n      var returnValue = this._add(fn);\n      return new EventPatternDisposable(this._del, fn, returnValue);\n    };\n\n    function EventPatternDisposable(del, fn, ret) {\n      this._del = del;\n      this._fn = fn;\n      this._ret = ret;\n      this.isDisposed = false;\n    }\n\n    EventPatternDisposable.prototype.dispose = function () {\n      if(!this.isDisposed) {\n        isFunction(this._del) && this._del(this._fn, this._ret);\n        this.isDisposed = true;\n      }\n    };\n\n    return EventPatternObservable;\n  }(ObservableBase));\n\n  /**\n   * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n   * @param {Function} addHandler The function to add a handler to the emitter.\n   * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence which wraps an event from an event emitter\n   */\n  var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) {\n    return new EventPatternObservable(addHandler, removeHandler, selector).publish().refCount();\n  };\n"
  },
  {
    "path": "src/core/linq/observable/generate.js",
    "content": "  var GenerateObservable = (function (__super__) {\n    inherits(GenerateObservable, __super__);\n    function GenerateObservable(state, cndFn, itrFn, resFn, s) {\n      this._initialState = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n      var hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (hasResult === errorObj) { return state.o.onError(hasResult.e); }\n      if (hasResult) {\n        var result = tryCatch(state.self._resFn)(state.newState);\n        if (result === errorObj) { return state.o.onError(result.e); }\n        state.o.onNext(result);\n        recurse(state);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        first: true,\n        newState: this._initialState\n      };\n      return this._s.scheduleRecursive(state, scheduleRecursive);\n    };\n\n    return GenerateObservable;\n  }(ObservableBase));\n\n  /**\n   *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new GenerateObservable(initialState, condition, iterate, resultSelector, scheduler);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/generatewithabsolutetime.js",
    "content": "  var GenerateAbsoluteObservable = (function (__super__) {\n    inherits(GenerateAbsoluteObservable, __super__);\n    function GenerateAbsoluteObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n      this._state = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._timeFn = timeFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      state.hasResult && state.o.onNext(state.result);\n\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n      state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (state.hasResult === errorObj) { return state.o.onError(state.hasResult.e); }\n      if (state.hasResult) {\n        state.result = tryCatch(state.self._resFn)(state.newState);\n        if (state.result === errorObj) { return state.o.onError(state.result.e); }\n        var time = tryCatch(state.self._timeFn)(state.newState);\n        if (time === errorObj) { return state.o.onError(time.e); }\n        recurse(state, time);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateAbsoluteObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        newState: this._state,\n        first: true,\n        hasResult: false\n      };\n      return this._s.scheduleRecursiveFuture(state, new Date(this._s.now()), scheduleRecursive);\n    };\n\n    return GenerateAbsoluteObservable;\n  }(ObservableBase));\n\n  /**\n   *  GenerateAbsolutes an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithAbsoluteTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return new Date(); }\n   *  });\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning Date values.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithAbsoluteTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new GenerateAbsoluteObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/generatewithrelativetime.js",
    "content": "  var GenerateRelativeObservable = (function (__super__) {\n    inherits(GenerateRelativeObservable, __super__);\n    function GenerateRelativeObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n      this._state = state;\n      this._cndFn = cndFn;\n      this._itrFn = itrFn;\n      this._resFn = resFn;\n      this._timeFn = timeFn;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive(state, recurse) {\n      state.hasResult && state.o.onNext(state.result);\n\n      if (state.first) {\n        state.first = false;\n      } else {\n        state.newState = tryCatch(state.self._itrFn)(state.newState);\n        if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n      }\n\n      state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n      if (state.hasResult === errorObj) { return state.o.onError(state.hasResult.e); }\n      if (state.hasResult) {\n        state.result = tryCatch(state.self._resFn)(state.newState);\n        if (state.result === errorObj) { return state.o.onError(state.result.e); }\n        var time = tryCatch(state.self._timeFn)(state.newState);\n        if (time === errorObj) { return state.o.onError(time.e); }\n        recurse(state, time);\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    GenerateRelativeObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        self: this,\n        newState: this._state,\n        first: true,\n        hasResult: false\n      };\n      return this._s.scheduleRecursiveFuture(state, 0, scheduleRecursive);\n    };\n\n    return GenerateRelativeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithRelativeTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return 500; }\n   *  );\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithRelativeTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new GenerateRelativeObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/groupby.js",
    "content": "  /**\n   *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n   *\n   * @example\n   *  var res = observable.groupBy(function (x) { return x.id; });\n   *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n   *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n   * @param {Function} keySelector A function to extract the key for each element.\n   * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n   * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n   */\n  observableProto.groupBy = function (keySelector, elementSelector) {\n    return this.groupByUntil(keySelector, elementSelector, observableNever);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/groupbyuntil.js",
    "content": "    /**\n     *  Groups the elements of an observable sequence according to a specified key selector function.\n     *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n     *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n     *\n     * @example\n     *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n     *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n     *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n     * @param {Function} keySelector A function to extract the key for each element.\n     * @param {Function} durationSelector A function to signal the expiration of a group.\n     * @returns {Observable}\n     *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n     *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n     *\n     */\n    observableProto.groupByUntil = function (keySelector, elementSelector, durationSelector) {\n      var source = this;\n      return new AnonymousObservable(function (o) {\n        var map = new Map(),\n          groupDisposable = new CompositeDisposable(),\n          refCountDisposable = new RefCountDisposable(groupDisposable),\n          handleError = function (e) { return function (item) { item.onError(e); }; };\n\n        groupDisposable.add(\n          source.subscribe(function (x) {\n            var key = tryCatch(keySelector)(x);\n            if (key === errorObj) {\n              map.forEach(handleError(key.e));\n              return o.onError(key.e);\n            }\n\n            var fireNewMapEntry = false, writer = map.get(key);\n            if (writer === undefined) {\n              writer = new Subject();\n              map.set(key, writer);\n              fireNewMapEntry = true;\n            }\n\n            if (fireNewMapEntry) {\n              var group = new GroupedObservable(key, writer, refCountDisposable),\n                durationGroup = new GroupedObservable(key, writer);\n              var duration = tryCatch(durationSelector)(durationGroup);\n              if (duration === errorObj) {\n                map.forEach(handleError(duration.e));\n                return o.onError(duration.e);\n              }\n\n              o.onNext(group);\n\n              var md = new SingleAssignmentDisposable();\n              groupDisposable.add(md);\n\n              md.setDisposable(duration.take(1).subscribe(\n                noop,\n                function (e) {\n                  map.forEach(handleError(e));\n                  o.onError(e);\n                },\n                function () {\n                  if (map['delete'](key)) { writer.onCompleted(); }\n                  groupDisposable.remove(md);\n                }));\n            }\n\n            var element = x;\n            if (isFunction(elementSelector)) {\n              element = tryCatch(elementSelector)(x);\n              if (element === errorObj) {\n                map.forEach(handleError(element.e));\n                return o.onError(element.e);\n              }\n            }\n\n            writer.onNext(element);\n        }, function (e) {\n          map.forEach(handleError(e));\n          o.onError(e);\n        }, function () {\n          map.forEach(function (item) { item.onCompleted(); });\n          o.onCompleted();\n        }));\n\n      return refCountDisposable;\n    }, source);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/groupjoin.js",
    "content": "  /**\n   *  Correlates the elements of two sequences based on overlapping durations, and groups the results.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. The first parameter passed to the function is an element of the left sequence. The second parameter passed to the function is an observable sequence with elements from the right sequence that overlap with the left sequence's element.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.groupJoin = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable();\n      var r = new RefCountDisposable(group);\n      var leftMap = new Map(), rightMap = new Map();\n      var leftId = 0, rightId = 0;\n      var handleError = function (e) { return function (v) { v.onError(e); }; };\n\n      function handleError(e) { };\n\n      group.add(left.subscribe(\n        function (value) {\n          var s = new Subject();\n          var id = leftId++;\n          leftMap.set(id, s);\n\n          var result = tryCatch(resultSelector)(value, addRef(s, r));\n          if (result === errorObj) {\n            leftMap.forEach(handleError(result.e));\n            return o.onError(result.e);\n          }\n          o.onNext(result);\n\n          rightMap.forEach(function (v) { s.onNext(v); });\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var duration = tryCatch(leftDurationSelector)(value);\n          if (duration === errorObj) {\n            leftMap.forEach(handleError(duration.e));\n            return o.onError(duration.e);\n          }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.forEach(handleError(e));\n              o.onError(e);\n            },\n            function () {\n              leftMap['delete'](id) && s.onCompleted();\n              group.remove(md);\n            }));\n        },\n        function (e) {\n          leftMap.forEach(handleError(e));\n          o.onError(e);\n        },\n        function () { o.onCompleted(); })\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++;\n          rightMap.set(id, value);\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var duration = tryCatch(rightDurationSelector)(value);\n          if (duration === errorObj) {\n            leftMap.forEach(handleError(duration.e));\n            return o.onError(duration.e);\n          }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.forEach(handleError(e));\n              o.onError(e);\n            },\n            function () {\n              rightMap['delete'](id);\n              group.remove(md);\n            }));\n\n          leftMap.forEach(function (v) { v.onNext(value); });\n        },\n        function (e) {\n          leftMap.forEach(handleError(e));\n          o.onError(e);\n        })\n      );\n\n      return r;\n    }, left);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/if.js",
    "content": "   /**\n   *  Determines whether an observable collection contains values. \n   *\n   * @example\n   *  1 - res = Rx.Observable.if(condition, obs1);\n   *  2 - res = Rx.Observable.if(condition, obs1, obs2);\n   *  3 - res = Rx.Observable.if(condition, obs1, scheduler);\n   * @param {Function} condition The condition which determines if the thenSource or elseSource will be run.\n   * @param {Observable} thenSource The observable sequence or Promise that will be run if the condition function returns true.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the condition function returns false. If this is not provided, it defaults to Rx.Observabe.Empty with the specified scheduler.\n   * @returns {Observable} An observable sequence which is either the thenSource or elseSource.\n   */\n  Observable['if'] = function (condition, thenSource, elseSourceOrScheduler) {\n    return observableDefer(function () {\n      elseSourceOrScheduler || (elseSourceOrScheduler = observableEmpty());\n\n      isPromise(thenSource) && (thenSource = observableFromPromise(thenSource));\n      isPromise(elseSourceOrScheduler) && (elseSourceOrScheduler = observableFromPromise(elseSourceOrScheduler));\n\n      // Assume a scheduler for empty only\n      typeof elseSourceOrScheduler.now === 'function' && (elseSourceOrScheduler = observableEmpty(elseSourceOrScheduler));\n      return condition() ? thenSource : elseSourceOrScheduler;\n    });\n  };\n"
  },
  {
    "path": "src/core/linq/observable/includes.js",
    "content": "  var IncludesObservable = (function (__super__) {\n    inherits(IncludesObservable, __super__);\n    function IncludesObservable(source, elem, idx) {\n      var n = +idx || 0;\n      Math.abs(n) === Infinity && (n = 0);\n\n      this.source = source;\n      this._elem = elem;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    IncludesObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(false);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new IncludesObserver(o, this._elem, this._n));\n    };\n\n    return IncludesObservable;\n  }(ObservableBase));\n\n  var IncludesObserver = (function (__super__) {\n    inherits(IncludesObserver, __super__);\n    function IncludesObserver(o, elem, n) {\n      this._o = o;\n      this._elem = elem;\n      this._n = n;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    function comparer(a, b) {\n      return (a === 0 && b === 0) || (a === b || (isNaN(a) && isNaN(b)));\n    }\n\n    IncludesObserver.prototype.next = function (x) {\n      if (this._i++ >= this._n && comparer(x, this._elem)) {\n        this._o.onNext(true);\n        this._o.onCompleted();\n      }\n    };\n    IncludesObserver.prototype.error = function (e) { this._o.onError(e); };\n    IncludesObserver.prototype.completed = function () { this._o.onNext(false); this._o.onCompleted(); };\n\n    return IncludesObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether an observable sequence includes a specified element with an optional equality comparer.\n   * @param searchElement The value to locate in the source sequence.\n   * @param {Number} [fromIndex] An equality comparer to compare elements.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence includes an element that has the specified value from the given index.\n   */\n  observableProto.includes = function (searchElement, fromIndex) {\n    return new IncludesObservable(this, searchElement, fromIndex);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/indexof.js",
    "content": "  var IndexOfObservable = (function (__super__) {\n    inherits(IndexOfObservable, __super__);\n    function IndexOfObservable(source, e, n) {\n      this.source = source;\n      this._e = e;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    IndexOfObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(-1);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new IndexOfObserver(o, this._e, this._n));\n    };\n\n    return IndexOfObservable;\n  }(ObservableBase));\n\n  var IndexOfObserver = (function (__super__) {\n    inherits(IndexOfObserver, __super__);\n    function IndexOfObserver(o, e, n) {\n      this._o = o;\n      this._e = e;\n      this._n = n;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    IndexOfObserver.prototype.next = function (x) {\n      if (this._i >= this._n && x === this._e) {\n        this._o.onNext(this._i);\n        this._o.onCompleted();\n      }\n      this._i++;\n    };\n    IndexOfObserver.prototype.error = function (e) { this._o.onError(e); };\n    IndexOfObserver.prototype.completed = function () { this._o.onNext(-1); this._o.onCompleted(); };\n\n    return IndexOfObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   * @param {Any} searchElement Element to locate in the array.\n   * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n   * @returns {Observable} And observable sequence containing the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   */\n  observableProto.indexOf = function(searchElement, fromIndex) {\n    var n = +fromIndex || 0;\n    Math.abs(n) === Infinity && (n = 0);\n    return new IndexOfObservable(this, searchElement, n);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/interval.js",
    "content": "  /**\n   *  Returns an observable sequence that produces a value after each period.\n   *\n   * @example\n   *  1 - res = Rx.Observable.interval(1000);\n   *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n   *\n   * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n   * @returns {Observable} An observable sequence that produces a value after each period.\n   */\n  var observableinterval = Observable.interval = function (period, scheduler) {\n    return observableTimerTimeSpanAndPeriod(period, period, isScheduler(scheduler) ? scheduler : defaultScheduler);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/isempty.js",
    "content": "  var IsEmptyObservable = (function (__super__) {\n    inherits(IsEmptyObservable, __super__);\n    function IsEmptyObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    IsEmptyObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new IsEmptyObserver(o));\n    };\n\n    return IsEmptyObservable;\n  }(ObservableBase));\n\n  var IsEmptyObserver = (function(__super__) {\n    inherits(IsEmptyObserver, __super__);\n    function IsEmptyObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    IsEmptyObserver.prototype.next = function () {\n      this._o.onNext(false);\n      this._o.onCompleted();\n    };\n    IsEmptyObserver.prototype.error = function (e) { this._o.onError(e); };\n    IsEmptyObserver.prototype.completed = function () {\n      this._o.onNext(true);\n      this._o.onCompleted();\n    };\n\n    return IsEmptyObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether an observable sequence is empty.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence is empty.\n   */\n  observableProto.isEmpty = function () {\n    return new IsEmptyObservable(this);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/join.js",
    "content": "  /**\n   *  Correlates the elements of two sequences based on overlapping durations.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters passed to the function correspond with the elements from the left and right source sequences for which overlap occurs.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.join = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable();\n      var leftDone = false, rightDone = false;\n      var leftId = 0, rightId = 0;\n      var leftMap = new Map(), rightMap = new Map();\n      var handleError = function (e) { o.onError(e); };\n\n      group.add(left.subscribe(\n        function (value) {\n          var id = leftId++, md = new SingleAssignmentDisposable();\n\n          leftMap.set(id, value);\n          group.add(md);\n\n          var duration = tryCatch(leftDurationSelector)(value);\n          if (duration === errorObj) { return o.onError(duration.e); }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            handleError,\n            function () {\n              leftMap['delete'](id) && leftMap.size === 0 && leftDone && o.onCompleted();\n              group.remove(md);\n            }));\n\n          rightMap.forEach(function (v) {\n            var result = tryCatch(resultSelector)(value, v);\n            if (result === errorObj) { return o.onError(result.e); }\n            o.onNext(result);\n          });\n        },\n        handleError,\n        function () {\n          leftDone = true;\n          (rightDone || leftMap.size === 0) && o.onCompleted();\n        })\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++, md = new SingleAssignmentDisposable();\n\n          rightMap.set(id, value);\n          group.add(md);\n\n          var duration = tryCatch(rightDurationSelector)(value);\n          if (duration === errorObj) { return o.onError(duration.e); }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            handleError,\n            function () {\n              rightMap['delete'](id) && rightMap.size === 0 && rightDone && o.onCompleted();\n              group.remove(md);\n            }));\n\n          leftMap.forEach(function (v) {\n            var result = tryCatch(resultSelector)(v, value);\n            if (result === errorObj) { return o.onError(result.e); }\n            o.onNext(result);\n          });\n        },\n        handleError,\n        function () {\n          rightDone = true;\n          (leftDone || rightMap.size === 0) && o.onCompleted();\n        })\n      );\n      return group;\n    }, left);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/jortsort.js",
    "content": "  /**\n   * jortSort checks if your inputs are sorted.  Note that this is only for a sequence with an end.\n   * See http://jort.technology/ for full details.\n   * @returns {Observable} An observable which has a single value of true if sorted, else false.\n   */\n  observableProto.jortSort = function () {\n    return this.jortSortUntil(observableNever());\n  };\n"
  },
  {
    "path": "src/core/linq/observable/jortsortuntil.js",
    "content": "  /**\n   * jortSort checks if your inputs are sorted until another Observable sequence fires.\n   * See http://jort.technology/ for full details.\n   * @returns {Observable} An observable which has a single value of true if sorted, else false.\n   */\n  observableProto.jortSortUntil = function (other) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var arr = [];\n      return source.takeUntil(other).subscribe(\n        arr.push.bind(arr),\n        observer.onError.bind(observer),\n        function () {\n          var sorted = arr.slice(0).sort(defaultSubComparer);\n          observer.onNext(isEqual(arr, sorted));\n          observer.onCompleted();\n        });\n    }, source);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/last.js",
    "content": "  var LastObservable = (function (__super__) {\n    inherits(LastObservable, __super__);\n    function LastObservable(source, obj) {\n      this.source = source;\n      this._obj = obj;\n      __super__.call(this);\n    }\n\n    LastObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new LastObserver(o, this._obj, this.source));\n    };\n\n    return LastObservable;\n  }(ObservableBase));\n\n  var LastObserver = (function(__super__) {\n    inherits(LastObserver, __super__);\n    function LastObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      this._hv = false;\n      this._v = null;\n      __super__.call(this);\n    }\n\n    LastObserver.prototype.next = function (x) {\n      var shouldYield = false;\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        Boolean(res) && (shouldYield = true);\n      } else if (!this._obj.predicate) {\n        shouldYield = true;\n      }\n      if (shouldYield) {\n        this._hv = true;\n        this._v = x;\n      }\n    };\n    LastObserver.prototype.error = function (e) { this._o.onError(e); };\n    LastObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n        this._o.onCompleted();\n      }\n      else if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return LastObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the last element of an observable sequence that satisfies the condition in the predicate if specified, else the last element.\n   * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate.\n   */\n  observableProto.last = function () {\n    var obj = {}, source = this;\n    if (typeof arguments[0] === 'object') {\n      obj = arguments[0];\n    } else {\n      obj = {\n        predicate: arguments[0],\n        thisArg: arguments[1],\n        defaultValue: arguments[2]\n      };\n    }\n    if (isFunction (obj.predicate)) {\n      var fn = obj.predicate;\n      obj.predicate = bindCallback(fn, obj.thisArg, 3);\n    }\n    return new LastObservable(this, obj);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/lastindexof.js",
    "content": "  var LastIndexOfObservable = (function (__super__) {\n    inherits(LastIndexOfObservable, __super__);\n    function LastIndexOfObservable(source, e, n) {\n      this.source = source;\n      this._e = e;\n      this._n = n;\n      __super__.call(this);\n    }\n\n    LastIndexOfObservable.prototype.subscribeCore = function (o) {\n      if (this._n < 0) {\n        o.onNext(-1);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n\n      return this.source.subscribe(new LastIndexOfObserver(o, this._e, this._n));\n    };\n\n    return LastIndexOfObservable;\n  }(ObservableBase));\n\n  var LastIndexOfObserver = (function (__super__) {\n    inherits(LastIndexOfObserver, __super__);\n    function LastIndexOfObserver(o, e, n) {\n      this._o = o;\n      this._e = e;\n      this._n = n;\n      this._v = 0;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    LastIndexOfObserver.prototype.next = function (x) {\n      if (this._i >= this._n && x === this._e) {\n        this._hv = true;\n        this._v = this._i;\n      }\n      this._i++;\n    };\n    LastIndexOfObserver.prototype.error = function (e) { this._o.onError(e); };\n    LastIndexOfObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n      } else {\n        this._o.onNext(-1);\n      }\n      this._o.onCompleted();\n    };\n\n    return LastIndexOfObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the last index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   * @param {Any} searchElement Element to locate in the array.\n   * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n   * @returns {Observable} And observable sequence containing the last index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   */\n  observableProto.lastIndexOf = function(searchElement, fromIndex) {\n    var n = +fromIndex || 0;\n    Math.abs(n) === Infinity && (n = 0);\n    return new LastIndexOfObservable(this, searchElement, n);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/let.js",
    "content": "   /**\n   *  Returns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions.\n   *  This operator allows for a fluent style of writing queries that use the same sequence multiple times.\n   *\n   * @param {Function} selector Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.letBind = observableProto['let'] = function (func) {\n    return func(this);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/manyselect.js",
    "content": "  /**\n   * Comonadic bind operator.\n   * @param {Function} selector A transform function to apply to each element.\n   * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n   * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n   */\n  observableProto.manySelect = observableProto.extend = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = Rx.Scheduler.immediate);\n    var source = this;\n    return observableDefer(function () {\n      var chain;\n\n      return source\n        .map(function (x) {\n          var curr = new ChainObservable(x);\n\n          chain && chain.onNext(x);\n          chain = curr;\n\n          return curr;\n        })\n        .tap(\n          noop,\n          function (e) { chain && chain.onError(e); },\n          function () { chain && chain.onCompleted(); }\n        )\n        .observeOn(scheduler)\n        .map(selector);\n    }, source);\n  };\n\n  var ChainObservable = (function (__super__) {\n    inherits(ChainObservable, __super__);\n    function ChainObservable(head) {\n      __super__.call(this);\n      this.head = head;\n      this.tail = new AsyncSubject();\n    }\n\n    addProperties(ChainObservable.prototype, Observer, {\n      _subscribe: function (o) {\n        var g = new CompositeDisposable();\n        g.add(currentThreadScheduler.schedule(this, function (_, self) {\n          o.onNext(self.head);\n          g.add(self.tail.mergeAll().subscribe(o));\n        }));\n\n        return g;\n      },\n      onCompleted: function () {\n        this.onNext(Observable.empty());\n      },\n      onError: function (e) {\n        this.onNext(Observable['throw'](e));\n      },\n      onNext: function (v) {\n        this.tail.onNext(v);\n        this.tail.onCompleted();\n      }\n    });\n\n    return ChainObservable;\n\n  }(Observable));\n"
  },
  {
    "path": "src/core/linq/observable/materialize.js",
    "content": "  var MaterializeObservable = (function (__super__) {\n    inherits(MaterializeObservable, __super__);\n    function MaterializeObservable(source, fn) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MaterializeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new MaterializeObserver(o));\n    };\n\n    return MaterializeObservable;\n  }(ObservableBase));\n\n  var MaterializeObserver = (function (__super__) {\n    inherits(MaterializeObserver, __super__);\n\n    function MaterializeObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    MaterializeObserver.prototype.next = function (x) { this._o.onNext(notificationCreateOnNext(x)) };\n    MaterializeObserver.prototype.error = function (e) { this._o.onNext(notificationCreateOnError(e)); this._o.onCompleted(); };\n    MaterializeObserver.prototype.completed = function () { this._o.onNext(notificationCreateOnCompleted()); this._o.onCompleted(); };\n\n    return MaterializeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n   * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n   */\n  observableProto.materialize = function () {\n    return new MaterializeObservable(this);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/max.js",
    "content": "  /**\n   * Returns the maximum value in an observable sequence according to the specified comparer.\n   * @example\n   * var res = source.max();\n   * var res = source.max(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the maximum element in the source sequence.\n   */\n  observableProto.max = function (comparer) {\n    return this.maxBy(identity, comparer).map(firstOnly);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/maxby.js",
    "content": "  /**\n   * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n   * @example\n   * var res = source.maxBy(function (x) { return x.value; });\n   * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer]  Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n   */\n  observableProto.maxBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return new ExtremaByObservable(this, keySelector, comparer);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/merge.js",
    "content": "  /**\n   * Merges all the observable sequences into a single observable sequence.\n   * The scheduler is optional and if not specified, the immediate scheduler is used.\n   * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n   */\n  var observableMerge = Observable.merge = function () {\n    var scheduler, sources = [], i, len = arguments.length;\n    if (!arguments[0]) {\n      scheduler = immediateScheduler;\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else if (isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else {\n      scheduler = immediateScheduler;\n      for(i = 0; i < len; i++) { sources.push(arguments[i]); }\n    }\n    if (Array.isArray(sources[0])) {\n      sources = sources[0];\n    }\n    return observableOf(scheduler, sources).mergeAll();\n  };\n"
  },
  {
    "path": "src/core/linq/observable/mergedelayerror.js",
    "content": "  var CompositeError = Rx.CompositeError = function(errors) {\n    this.innerErrors = errors;\n    this.message = 'This contains multiple errors. Check the innerErrors';\n    Error.call(this);\n  };\n  CompositeError.prototype = Object.create(Error.prototype);\n  CompositeError.prototype.name = 'CompositeError';\n\n  var MergeDelayErrorObservable = (function(__super__) {\n    inherits(MergeDelayErrorObservable, __super__);\n    function MergeDelayErrorObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeDelayErrorObservable.prototype.subscribeCore = function (o) {\n      var group = new CompositeDisposable(),\n        m = new SingleAssignmentDisposable(),\n        state = { isStopped: false, errors: [], o: o };\n\n      group.add(m);\n      m.setDisposable(this.source.subscribe(new MergeDelayErrorObserver(group, state)));\n\n      return group;\n    };\n\n    return MergeDelayErrorObservable;\n  }(ObservableBase));\n\n  var MergeDelayErrorObserver = (function(__super__) {\n    inherits(MergeDelayErrorObserver, __super__);\n    function MergeDelayErrorObserver(group, state) {\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function setCompletion(o, errors) {\n      if (errors.length === 0) {\n        o.onCompleted();\n      } else if (errors.length === 1) {\n        o.onError(errors[0]);\n      } else {\n        o.onError(new CompositeError(errors));\n      }\n    }\n\n    MergeDelayErrorObserver.prototype.next = function (x) {\n      var inner = new SingleAssignmentDisposable();\n      this._group.add(inner);\n\n      // Check for promises support\n      isPromise(x) && (x = observableFromPromise(x));\n      inner.setDisposable(x.subscribe(new InnerObserver(inner, this._group, this._state)));\n    };\n\n    MergeDelayErrorObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    MergeDelayErrorObserver.prototype.completed = function () {\n      this._state.isStopped = true;\n      this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    inherits(InnerObserver, __super__);\n    function InnerObserver(inner, group, state) {\n      this._inner = inner;\n      this._group = group;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    InnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) {\n      this._state.errors.push(e);\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n    InnerObserver.prototype.completed = function () {\n      this._group.remove(this._inner);\n      this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n    };\n\n    return MergeDelayErrorObserver;\n  }(AbstractObserver));\n\n  /**\n  * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n  * receive all successfully emitted items from all of the source Observables without being interrupted by\n  * an error notification from one of them.\n  *\n  * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n  * error via the Observer's onError, mergeDelayError will refrain from propagating that\n  * error notification until all of the merged Observables have finished emitting items.\n  * @param {Array | Arguments} args Arguments or an array to merge.\n  * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n  */\n  Observable.mergeDelayError = function() {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      var len = arguments.length;\n      args = new Array(len);\n      for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    }\n    var source = observableOf(null, args);\n    return new MergeDelayErrorObservable(source);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/min.js",
    "content": "  /**\n   * Returns the minimum element in an observable sequence according to the optional comparer else a default greater than less than check.\n   * @example\n   * var res = source.min();\n   * var res = source.min(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the minimum element in the source sequence.\n   */\n  observableProto.min = function (comparer) {\n    return this.minBy(identity, comparer).map(firstOnly);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/minby.js",
    "content": "  /**\n   * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n   * @example\n   * var res = source.minBy(function (x) { return x.value; });\n   * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer] Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n   */\n  observableProto.minBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return new ExtremaByObservable(this, keySelector, function (x, y) { return comparer(x, y) * -1; });\n  };\n"
  },
  {
    "path": "src/core/linq/observable/multicast.js",
    "content": "  var MulticastObservable = (function (__super__) {\n    inherits(MulticastObservable, __super__);\n    function MulticastObservable(source, fn1, fn2) {\n      this.source = source;\n      this._fn1 = fn1;\n      this._fn2 = fn2;\n      __super__.call(this);\n    }\n\n    MulticastObservable.prototype.subscribeCore = function (o) {\n      var connectable = this.source.multicast(this._fn1());\n      return new BinaryDisposable(this._fn2(connectable).subscribe(o), connectable.connect());\n    };\n\n    return MulticastObservable;\n  }(ObservableBase));\n\n  /**\n   * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n   * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n   * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n   *\n   * @example\n   * 1 - res = source.multicast(observable);\n   * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n   *\n   * @param {Function|Subject} subjectOrSubjectSelector\n   * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n   * Or:\n   * Subject to push source elements into.\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.multicast = function (subjectOrSubjectSelector, selector) {\n    return isFunction(subjectOrSubjectSelector) ?\n      new MulticastObservable(this, subjectOrSubjectSelector, selector) :\n      new ConnectableObservable(this, subjectOrSubjectSelector);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/observeon.js",
    "content": "var ObserveOnObservable = (function (__super__) {\n  inherits(ObserveOnObservable, __super__);\n  function ObserveOnObservable(source, s) {\n    this.source = source;\n    this._s = s;\n    __super__.call(this);\n  }\n\n  ObserveOnObservable.prototype.subscribeCore = function (o) {\n    return this.source.subscribe(new ObserveOnObserver(this._s, o));\n  };\n\n  return ObserveOnObservable;\n}(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n   *\n   *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n   *  that require to be run on a scheduler, use subscribeOn.\n   *\n   *  @param {Scheduler} scheduler Scheduler to notify observers on.\n   *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n   */\n  observableProto.observeOn = function (scheduler) {\n    return new ObserveOnObservable(this, scheduler);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/ofarraychanges.js",
    "content": "  /**\n   * Creates an Observable sequence from changes to an array using Array.observe.\n   * @param {Array} array An array to observe changes.\n   * @returns {Observable} An observable sequence containing changes to an array from Array.observe.\n   */\n  Observable.ofArrayChanges = function(array) {\n    if (!Array.isArray(array)) { throw new TypeError('Array.observe only accepts arrays.'); }\n    if (typeof Array.observe !== 'function' && typeof Array.unobserve !== 'function') { throw new TypeError('Array.observe is not supported on your platform') }\n    return new AnonymousObservable(function(observer) {\n      function observerFn(changes) {\n        for(var i = 0, len = changes.length; i < len; i++) {\n          observer.onNext(changes[i]);\n        }\n      }\n      \n      Array.observe(array, observerFn);\n\n      return function () {\n        Array.unobserve(array, observerFn);\n      };\n    });\n  };\n"
  },
  {
    "path": "src/core/linq/observable/ofobjectchanges.js",
    "content": "  /**\n   * Creates an Observable sequence from changes to an object using Object.observe.\n   * @param {Object} obj An object to observe changes.\n   * @returns {Observable} An observable sequence containing changes to an object from Object.observe.\n   */\n  Observable.ofObjectChanges = function(obj) {\n    if (obj == null) { throw new TypeError('object must not be null or undefined.'); }\n    if (typeof Object.observe !== 'function' && typeof Object.unobserve !== 'function') { throw new TypeError('Object.observe is not supported on your platform') }\n    return new AnonymousObservable(function(observer) {\n      function observerFn(changes) {\n        for(var i = 0, len = changes.length; i < len; i++) {\n          observer.onNext(changes[i]);\n        }\n      }\n\n      Object.observe(obj, observerFn);\n\n      return function () {\n        Object.unobserve(obj, observerFn);\n      };\n    });\n  };\n"
  },
  {
    "path": "src/core/linq/observable/onerrorresumenext.js",
    "content": "  var OnErrorResumeNextObservable = (function(__super__) {\n    inherits(OnErrorResumeNextObservable, __super__);\n    function OnErrorResumeNextObservable(sources) {\n      this.sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(state, recurse) {\n      if (state.pos < state.sources.length) {\n        var current = state.sources[state.pos++];\n        isPromise(current) && (current = observableFromPromise(current));\n        var d = new SingleAssignmentDisposable();\n        state.subscription.setDisposable(d);\n        d.setDisposable(current.subscribe(new OnErrorResumeNextObserver(state, recurse)));\n      } else {\n        state.o.onCompleted();\n      }\n    }\n\n    OnErrorResumeNextObservable.prototype.subscribeCore = function (o) {\n      var subscription = new SerialDisposable(),\n          state = {pos: 0, subscription: subscription, o: o, sources: this.sources },\n          cancellable = immediateScheduler.scheduleRecursive(state, scheduleMethod);\n\n      return new BinaryDisposable(subscription, cancellable);\n    };\n\n    return OnErrorResumeNextObservable;\n  }(ObservableBase));\n\n  var OnErrorResumeNextObserver = (function(__super__) {\n    inherits(OnErrorResumeNextObserver, __super__);\n    function OnErrorResumeNextObserver(state, recurse) {\n      this._state = state;\n      this._recurse = recurse;\n      __super__.call(this);\n    }\n\n    OnErrorResumeNextObserver.prototype.next = function (x) { this._state.o.onNext(x); };\n    OnErrorResumeNextObserver.prototype.error = function () { this._recurse(this._state); };\n    OnErrorResumeNextObserver.prototype.completed = function () { this._recurse(this._state); };\n\n    return OnErrorResumeNextObserver;\n  }(AbstractObserver));\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n   */\n  var onErrorResumeNext = Observable.onErrorResumeNext = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      var len = arguments.length;\n      sources = new Array(len);\n      for(var i = 0; i < len; i++) { sources[i] = arguments[i]; }\n    }\n    return new OnErrorResumeNextObservable(sources);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/onerrorresumenextproto.js",
    "content": "  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n   * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n   */\n  observableProto.onErrorResumeNext = function (second) {\n    if (!second) { throw new Error('Second observable is required'); }\n    return onErrorResumeNext([this, second]);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/pairwise.js",
    "content": "  var PairwiseObservable = (function (__super__) {\n    inherits(PairwiseObservable, __super__);\n    function PairwiseObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    PairwiseObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new PairwiseObserver(o));\n    };\n\n    return PairwiseObservable;\n  }(ObservableBase));\n\n  var PairwiseObserver = (function(__super__) {\n    inherits(PairwiseObserver, __super__);\n    function PairwiseObserver(o) {\n      this._o = o;\n      this._p = null;\n      this._hp = false;\n      __super__.call(this);\n    }\n\n    PairwiseObserver.prototype.next = function (x) {\n      if (this._hp) {\n        this._o.onNext([this._p, x]);\n      } else {\n        this._hp = true;\n      }\n      this._p = x;\n    };\n    PairwiseObserver.prototype.error = function (err) { this._o.onError(err); };\n    PairwiseObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return PairwiseObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns a new observable that triggers on the second and subsequent triggerings of the input observable.\n   * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair.\n   * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs.\n   * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array.\n   */\n  observableProto.pairwise = function () {\n    return new PairwiseObservable(this);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/partition.js",
    "content": "  /**\n   * Returns two observables which partition the observations of the source by the given function.\n   * The first will trigger observations for those values for which the predicate returns true.\n   * The second will trigger observations for those values where the predicate returns false.\n   * The predicate is executed once for each subscribed observer.\n   * Both also propagate all error observations arising from the source and each completes\n   * when the source completes.\n   * @param {Function} predicate\n   *    The function to determine which output Observable will trigger a particular observation.\n   * @returns {Array}\n   *    An array of observables. The first triggers when the predicate returns true,\n   *    and the second triggers when the predicate returns false.\n  */\n  observableProto.partition = function(predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return [\n      this.filter(predicate, thisArg),\n      this.filter(function (x, i, o) { return !fn(x, i, o); })\n    ];\n  };\n"
  },
  {
    "path": "src/core/linq/observable/pipe.js",
    "content": "  /**\n   * Pipes the existing Observable sequence into a Node.js Stream.\n   * @param {Stream} dest The destination Node.js stream.\n   * @returns {Stream} The destination stream.\n   */\n  observableProto.pipe = function (dest) {\n    var source = this.pausableBuffered();\n\n    function onDrain() {\n      source.resume();\n    }\n\n    dest.addListener('drain', onDrain);\n\n    source.subscribe(\n      function (x) {\n        !dest.write(x) && source.pause();\n      },\n      function (err) {\n        dest.emit('error', err);\n      },\n      function () {\n        // Hack check because STDIO is not closable\n        !dest._isStdio && dest.end();\n        dest.removeListener('drain', onDrain);\n      });\n\n    source.resume();\n\n    return dest;\n  };\n"
  },
  {
    "path": "src/core/linq/observable/pluck.js",
    "content": "  function plucker(args, len) {\n    return function mapper(x) {\n      var currentProp = x;\n      for (var i = 0; i < len; i++) {\n        var p = currentProp[args[i]];\n        if (typeof p !== 'undefined') {\n          currentProp = p;\n        } else {\n          return undefined;\n        }\n      }\n      return currentProp;\n    };\n  }\n\n  /**\n   * Retrieves the value of a specified nested property from all elements in\n   * the Observable sequence.\n   * @param {Arguments} arguments The nested properties to pluck.\n   * @returns {Observable} Returns a new Observable sequence of property values.\n   */\n  observableProto.pluck = function () {\n    var len = arguments.length, args = new Array(len);\n    if (len === 0) { throw new Error('List of properties cannot be empty.'); }\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return this.map(plucker(args, len));\n  };\n"
  },
  {
    "path": "src/core/linq/observable/publish.js",
    "content": "  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of Multicast using a regular Subject.\n   *\n   * @example\n   * var resres = source.publish();\n   * var res = source.publish(function (x) { return x; });\n   *\n   * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publish = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new Subject(); }, selector) :\n      this.multicast(new Subject());\n  };\n"
  },
  {
    "path": "src/core/linq/observable/publishlast.js",
    "content": "  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n   * This operator is a specialization of Multicast using a AsyncSubject.\n   *\n   * @example\n   * var res = source.publishLast();\n   * var res = source.publishLast(function (x) { return x; });\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishLast = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new AsyncSubject(); }, selector) :\n      this.multicast(new AsyncSubject());\n  };\n"
  },
  {
    "path": "src/core/linq/observable/publishvalue.js",
    "content": "  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n   * This operator is a specialization of Multicast using a BehaviorSubject.\n   *\n   * @example\n   * var res = source.publishValue(42);\n   * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishValue = function (initialValueOrSelector, initialValue) {\n    return arguments.length === 2 ?\n      this.multicast(function () {\n        return new BehaviorSubject(initialValue);\n      }, initialValueOrSelector) :\n      this.multicast(new BehaviorSubject(initialValueOrSelector));\n  };\n"
  },
  {
    "path": "src/core/linq/observable/repeatproto.js",
    "content": "  /**\n   *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n   * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n   * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n   */\n  observableProto.repeat = function (repeatCount) {\n    return enumerableRepeat(this, repeatCount).concat();\n  };\n"
  },
  {
    "path": "src/core/linq/observable/repeatwhen.js",
    "content": "  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RepeatWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RepeatWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RepeatWhenObservable, __super__);\n\n    RepeatWhenObservable.prototype.subscribeCore = function (o) {\n      var completions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(completions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) { o.onError(exn); },\n          function() {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            completions.onNext(null);\n            outer.dispose();\n          }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RepeatWhenObservable;\n  }(ObservableBase));\n\n  observableProto.repeatWhen = function (notifier) {\n    return new RepeatWhenObservable(repeat(this), notifier);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/replay.js",
    "content": "  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of Multicast using a ReplaySubject.\n   *\n   * @example\n   * var res = source.replay(null, 3);\n   * var res = source.replay(null, 3, 500);\n   * var res = source.replay(null, 3, 500, scheduler);\n   * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param windowSize [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.replay = function (selector, bufferSize, windowSize, scheduler) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new ReplaySubject(bufferSize, windowSize, scheduler); }, selector) :\n      this.multicast(new ReplaySubject(bufferSize, windowSize, scheduler));\n  };\n"
  },
  {
    "path": "src/core/linq/observable/retry.js",
    "content": "  /**\n   *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n   *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n   *\n   * @example\n   *  var res = retried = retry.repeat();\n   *  var res = retried = retry.repeat(2);\n   * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retry = function (retryCount) {\n    return enumerableRepeat(this, retryCount).catchError();\n  };\n"
  },
  {
    "path": "src/core/linq/observable/retrywhen.js",
    "content": "  function repeat(value) {\n    return {\n      '@@iterator': function () {\n        return {\n          next: function () {\n            return { done: false, value: value };\n          }\n        };\n      }\n    };\n  }\n\n  var RetryWhenObservable = (function(__super__) {\n    function createDisposable(state) {\n      return {\n        isDisposed: false,\n        dispose: function () {\n          if (!this.isDisposed) {\n            this.isDisposed = true;\n            state.isDisposed = true;\n          }\n        }\n      };\n    }\n\n    function RetryWhenObservable(source, notifier) {\n      this.source = source;\n      this._notifier = notifier;\n      __super__.call(this);\n    }\n\n    inherits(RetryWhenObservable, __super__);\n\n    RetryWhenObservable.prototype.subscribeCore = function (o) {\n      var exceptions = new Subject(),\n        notifier = new Subject(),\n        handled = this._notifier(exceptions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = this.source['@@iterator']();\n\n      var state = { isDisposed: false },\n        lastError,\n        subscription = new SerialDisposable();\n      var cancelable = currentThreadScheduler.scheduleRecursive(null, function (_, recurse) {\n        if (state.isDisposed) { return; }\n        var currentItem = e.next();\n\n        if (currentItem.done) {\n          if (lastError) {\n            o.onError(lastError);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new BinaryDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) {\n            inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            exceptions.onNext(exn);\n            outer.dispose();\n          },\n          function() { o.onCompleted(); }));\n      });\n\n      return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n    };\n\n    return RetryWhenObservable;\n  }(ObservableBase));\n\n  observableProto.retryWhen = function (notifier) {\n    return new RetryWhenObservable(repeat(this), notifier);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/sample.js",
    "content": "  var SampleObservable = (function(__super__) {\n    inherits(SampleObservable, __super__);\n    function SampleObservable(source, sampler) {\n      this.source = source;\n      this._sampler = sampler;\n      __super__.call(this);\n    }\n\n    SampleObservable.prototype.subscribeCore = function (o) {\n      var state = {\n        o: o,\n        atEnd: false,\n        value: null,\n        hasValue: false,\n        sourceSubscription: new SingleAssignmentDisposable()\n      };\n\n      state.sourceSubscription.setDisposable(this.source.subscribe(new SampleSourceObserver(state)));\n      return new BinaryDisposable(\n        state.sourceSubscription,\n        this._sampler.subscribe(new SamplerObserver(state))\n      );\n    };\n\n    return SampleObservable;\n  }(ObservableBase));\n\n  var SamplerObserver = (function(__super__) {\n    inherits(SamplerObserver, __super__);\n    function SamplerObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SamplerObserver.prototype._handleMessage = function () {\n      if (this._s.hasValue) {\n        this._s.hasValue = false;\n        this._s.o.onNext(this._s.value);\n      }\n      this._s.atEnd && this._s.o.onCompleted();\n    };\n\n    SamplerObserver.prototype.next = function () { this._handleMessage(); };\n    SamplerObserver.prototype.error = function (e) { this._s.onError(e); };\n    SamplerObserver.prototype.completed = function () { this._handleMessage(); };\n\n    return SamplerObserver;\n  }(AbstractObserver));\n\n  var SampleSourceObserver = (function(__super__) {\n    inherits(SampleSourceObserver, __super__);\n    function SampleSourceObserver(s) {\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SampleSourceObserver.prototype.next = function (x) {\n      this._s.hasValue = true;\n      this._s.value = x;\n    };\n    SampleSourceObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    SampleSourceObserver.prototype.completed = function () {\n      this._s.atEnd = true;\n      this._s.sourceSubscription.dispose();\n    };\n\n    return SampleSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Samples the observable sequence at each interval.\n   *\n   * @example\n   *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n   *  2 - res = source.sample(5000); // 5 seconds\n   *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n   *\n   * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n   * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Sampled observable sequence.\n   */\n  observableProto.sample = function (intervalOrSampler, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return typeof intervalOrSampler === 'number' ?\n      new SampleObservable(this, observableinterval(intervalOrSampler, scheduler)) :\n      new SampleObservable(this, intervalOrSampler);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/selectmanyobserver.js",
    "content": "  /**\n   * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.flatMapObserver = observableProto.selectManyObserver = function (onNext, onError, onCompleted, thisArg) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNext.call(thisArg, x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onError.call(thisArg, err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompleted.call(thisArg);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, source).mergeAll();\n  };\n"
  },
  {
    "path": "src/core/linq/observable/sequenceequal.js",
    "content": "  /**\n   *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n   *\n   * @example\n   * var res = res = source.sequenceEqual([1,2,3]);\n   * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n   * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n   * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n   * @param {Observable} second Second observable sequence or array to compare.\n   * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n   * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n   */\n  observableProto.sequenceEqual = function (second, comparer) {\n    var first = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var donel = false, doner = false, ql = [], qr = [];\n      var subscription1 = first.subscribe(function (x) {\n        if (qr.length > 0) {\n          var v = qr.shift();\n          var equal = tryCatch(comparer)(v, x);\n          if (equal === errorObj) { return o.onError(equal.e); }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (doner) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          ql.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        donel = true;\n        if (ql.length === 0) {\n          if (qr.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (doner) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n\n      (isArrayLike(second) || isIterable(second)) && (second = observableFrom(second));\n      isPromise(second) && (second = observableFromPromise(second));\n      var subscription2 = second.subscribe(function (x) {\n        if (ql.length > 0) {\n          var v = ql.shift();\n          var equal = tryCatch(comparer)(v, x);\n          if (equal === errorObj) { return o.onError(equal.e); }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (donel) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          qr.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        doner = true;\n        if (qr.length === 0) {\n          if (ql.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (donel) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n      return new BinaryDisposable(subscription1, subscription2);\n    }, first);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/share.js",
    "content": "  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.share = function () {\n    return this.publish().refCount();\n  };\n"
  },
  {
    "path": "src/core/linq/observable/sharereplay.js",
    "content": "  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   *\n   * @example\n   * var res = source.shareReplay(3);\n   * var res = source.shareReplay(3, 500);\n   * var res = source.shareReplay(3, 500, scheduler);\n   *\n\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareReplay = function (bufferSize, windowSize, scheduler) {\n    return this.replay(null, bufferSize, windowSize, scheduler).refCount();\n  };\n"
  },
  {
    "path": "src/core/linq/observable/sharevalue.js",
    "content": "  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n   * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareValue = function (initialValue) {\n    return this.publishValue(initialValue).refCount();\n  };\n"
  },
  {
    "path": "src/core/linq/observable/single.js",
    "content": "  var SingleObserver = (function(__super__) {\n    inherits(SingleObserver, __super__);\n    function SingleObserver(o, obj, s) {\n      this._o = o;\n      this._obj = obj;\n      this._s = s;\n      this._i = 0;\n      this._hv = false;\n      this._v = null;\n      __super__.call(this);\n    }\n\n    SingleObserver.prototype.next = function (x) {\n      var shouldYield = false;\n      if (this._obj.predicate) {\n        var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        Boolean(res) && (shouldYield = true);\n      } else if (!this._obj.predicate) {\n        shouldYield = true;\n      }\n      if (shouldYield) {\n        if (this._hv) {\n          return this._o.onError(new Error('Sequence contains more than one matching element'));\n        }\n        this._hv = true;\n        this._v = x;\n      }\n    };\n    SingleObserver.prototype.error = function (e) { this._o.onError(e); };\n    SingleObserver.prototype.completed = function () {\n      if (this._hv) {\n        this._o.onNext(this._v);\n        this._o.onCompleted();\n      }\n      else if (this._obj.defaultValue === undefined) {\n        this._o.onError(new EmptyError());\n      } else {\n        this._o.onNext(this._obj.defaultValue);\n        this._o.onCompleted();\n      }\n    };\n\n    return SingleObserver;\n  }(AbstractObserver));\n\n\n    /**\n     * Returns the only element of an observable sequence that satisfies the condition in the optional predicate, and reports an exception if there is not exactly one element in the observable sequence.\n     * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate.\n     */\n    observableProto.single = function (predicate, thisArg) {\n      var obj = {}, source = this;\n      if (typeof arguments[0] === 'object') {\n        obj = arguments[0];\n      } else {\n        obj = {\n          predicate: arguments[0],\n          thisArg: arguments[1],\n          defaultValue: arguments[2]\n        };\n      }\n      if (isFunction (obj.predicate)) {\n        var fn = obj.predicate;\n        obj.predicate = bindCallback(fn, obj.thisArg, 3);\n      }\n      return new AnonymousObservable(function (o) {\n        return source.subscribe(new SingleObserver(o, obj, source));\n      }, source);\n    };\n"
  },
  {
    "path": "src/core/linq/observable/singleinstance.js",
    "content": "  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence. This observable sequence\n   * can be resubscribed to, even if all prior subscriptions have ended. (unlike `.publish().refCount()`)\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source.\n   */\n  observableProto.singleInstance = function() {\n    var source = this, hasObservable = false, observable;\n\n    function getObservable() {\n      if (!hasObservable) {\n        hasObservable = true;\n        observable = source['finally'](function() { hasObservable = false; }).publish().refCount();\n      }\n      return observable;\n    }\n\n    return new AnonymousObservable(function(o) {\n      return getObservable().subscribe(o);\n    });\n  };\n"
  },
  {
    "path": "src/core/linq/observable/skiplast.js",
    "content": "  var SkipLastObservable = (function (__super__) {\n    inherits(SkipLastObservable, __super__);\n    function SkipLastObservable(source, c) {\n      this.source = source;\n      this._c = c;\n      __super__.call(this);\n    }\n\n    SkipLastObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipLastObserver(o, this._c));\n    };\n\n    return SkipLastObservable;\n  }(ObservableBase));\n\n  var SkipLastObserver = (function (__super__) {\n    inherits(SkipLastObserver, __super__);\n    function SkipLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    SkipLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._o.onNext(this._q.shift());\n    };\n\n    SkipLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    SkipLastObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return SkipLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses a specified number of elements at the end of an observable sequence.\n   * @description\n   *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n   *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n   * @param count Number of elements to bypass at the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n   */\n  observableProto.skipLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipLastObservable(this, count);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/skiplastwithtime.js",
    "content": "  var SkipLastWithTimeObservable = (function (__super__) {\n    inherits(SkipLastWithTimeObservable, __super__);\n    function SkipLastWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    SkipLastWithTimeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipLastWithTimeObserver(o, this));\n    };\n\n    return SkipLastWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipLastWithTimeObserver = (function (__super__) {\n    inherits(SkipLastWithTimeObserver, __super__);\n\n    function SkipLastWithTimeObserver(o, p) {\n      this._o = o;\n      this._s = p._s;\n      this._d = p._d;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    SkipLastWithTimeObserver.prototype.next = function (x) {\n      var now = this._s.now();\n      this._q.push({ interval: now, value: x });\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._o.onNext(this._q.shift().value);\n      }\n    };\n    SkipLastWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipLastWithTimeObserver.prototype.completed = function () {\n      var now = this._s.now();\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._o.onNext(this._q.shift().value);\n      }\n      this._o.onCompleted();\n    };\n\n    return SkipLastWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for skipping elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence.\n   */\n  observableProto.skipLastWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipLastWithTimeObservable(this, duration, scheduler);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/skipuntilwithtime.js",
    "content": "  var SkipUntilWithTimeObservable = (function (__super__) {\n    inherits(SkipUntilWithTimeObservable, __super__);\n    function SkipUntilWithTimeObservable(source, startTime, scheduler) {\n      this.source = source;\n      this._st = startTime;\n      this._s = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, state) {\n      state._open = true;\n    }\n\n    SkipUntilWithTimeObservable.prototype.subscribeCore = function (o) {\n      this._open = false;\n      return new BinaryDisposable(\n        this._s.scheduleFuture(this, this._st, scheduleMethod),\n        this.source.subscribe(new SkipUntilWithTimeObserver(o, this))\n      );\n    };\n\n    return SkipUntilWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipUntilWithTimeObserver = (function (__super__) {\n    inherits(SkipUntilWithTimeObserver, __super__);\n\n    function SkipUntilWithTimeObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipUntilWithTimeObserver.prototype.next = function (x) { this._p._open && this._o.onNext(x); };\n    SkipUntilWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipUntilWithTimeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipUntilWithTimeObserver;\n  }(AbstractObserver));\n\n\n  /**\n   *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n   *\n   * @examples\n   *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n   *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n   * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n   */\n  observableProto.skipUntilWithTime = function (startTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipUntilWithTimeObservable(this, startTime, scheduler);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/skipwhile.js",
    "content": "  var SkipWhileObservable = (function (__super__) {\n    inherits(SkipWhileObservable, __super__);\n    function SkipWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SkipWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipWhileObserver(o, this));\n    };\n\n    return SkipWhileObservable;\n  }(ObservableBase));\n\n  var SkipWhileObserver = (function (__super__) {\n    inherits(SkipWhileObserver, __super__);\n\n    function SkipWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = false;\n      __super__.call(this);\n    }\n\n    SkipWhileObserver.prototype.next = function (x) {\n      if (!this._r) {\n        var res = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._r = !res;\n      }\n      this._r && this._o.onNext(x);\n    };\n    SkipWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n   *  The element's index is used in the logic of the predicate function.\n   *\n   *  var res = source.skipWhile(function (value) { return value < 10; });\n   *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n   */\n  observableProto.skipWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new SkipWhileObservable(this, fn);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/skipwithtime.js",
    "content": "  var SkipWithTimeObservable = (function (__super__) {\n    inherits(SkipWithTimeObservable, __super__);\n    function SkipWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      this._open = false;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, self) {\n      self._open = true;\n    }\n\n    SkipWithTimeObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(\n        this._s.scheduleFuture(this, this._d, scheduleMethod),\n        this.source.subscribe(new SkipWithTimeObserver(o, this))\n      );\n    };\n\n    return SkipWithTimeObservable;\n  }(ObservableBase));\n\n  var SkipWithTimeObserver = (function (__super__) {\n    inherits(SkipWithTimeObserver, __super__);\n\n    function SkipWithTimeObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipWithTimeObserver.prototype.next = function (x) { this._p._open && this._o.onNext(x); };\n    SkipWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SkipWithTimeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SkipWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence.\n   *  This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded\n   *  may not execute immediately, despite the zero due time.\n   *\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration.\n   * @param {Number} duration Duration for skipping elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence.\n   */\n  observableProto.skipWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new SkipWithTimeObservable(this, duration, scheduler);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/slice.js",
    "content": "  var SliceObservable = (function (__super__) {\n    inherits(SliceObservable, __super__);\n    function SliceObservable(source, b, e) {\n      this.source = source;\n      this._b = b;\n      this._e = e;\n      __super__.call(this);\n    }\n\n    SliceObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SliceObserver(o, this._b, this._e));\n    };\n\n    return SliceObservable;\n  }(ObservableBase));\n\n  var SliceObserver = (function (__super__) {\n    inherits(SliceObserver, __super__);\n\n    function SliceObserver(o, b, e) {\n      this._o = o;\n      this._b = b;\n      this._e = e;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    SliceObserver.prototype.next = function (x) {\n      if (this._i >= this._b) {\n        if (this._e === this._i) {\n          this._o.onCompleted();\n        } else {\n          this._o.onNext(x);\n        }\n      }\n      this._i++;\n    };\n    SliceObserver.prototype.error = function (e) { this._o.onError(e); };\n    SliceObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return SliceObserver;\n  }(AbstractObserver));\n\n  /*\n  * The slice() method returns a shallow copy of a portion of an Observable into a new Observable object.\n  * Unlike the array version, this does not support negative numbers for being or end.\n  * @param {Number} [begin] Zero-based index at which to begin extraction. If omitted, this will default to zero.\n  * @param {Number} [end] Zero-based index at which to end extraction. slice extracts up to but not including end.\n  * If omitted, this will emit the rest of the Observable object.\n  * @returns {Observable} A shallow copy of a portion of an Observable into a new Observable object.\n  */\n  observableProto.slice = function (begin, end) {\n    var start = begin || 0;\n    if (start < 0) { throw new Rx.ArgumentOutOfRangeError(); }\n    if (typeof end === 'number' && end < start) {\n      throw new Rx.ArgumentOutOfRangeError();\n    }\n    return new SliceObservable(this, start, end);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/some.js",
    "content": "  var SomeObservable = (function (__super__) {\n    inherits(SomeObservable, __super__);\n    function SomeObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SomeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SomeObserver(o, this._fn, this.source));\n    };\n\n    return SomeObservable;\n  }(ObservableBase));\n\n  var SomeObserver = (function (__super__) {\n    inherits(SomeObserver, __super__);\n\n    function SomeObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    SomeObserver.prototype.next = function (x) {\n      var result = tryCatch(this._fn)(x, this._i++, this._s);\n      if (result === errorObj) { return this._o.onError(result.e); }\n      if (Boolean(result)) {\n        this._o.onNext(true);\n        this._o.onCompleted();\n      }\n    };\n    SomeObserver.prototype.error = function (e) { this._o.onError(e); };\n    SomeObserver.prototype.completed = function () {\n      this._o.onNext(false);\n      this._o.onCompleted();\n    };\n\n    return SomeObserver;\n  }(AbstractObserver));\n\n  /**\n   * Determines whether any element of an observable sequence satisfies a condition if present, else if any items are in the sequence.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @returns {Observable} An observable sequence containing a single element determining whether any elements in the source sequence pass the test in the specified predicate if given, else if any items are in the sequence.\n   */\n  observableProto.some = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new SomeObservable(this, fn);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/spawn.js",
    "content": "  Observable.wrap = function (fn) {\n    function createObservable() {\n      return Observable.spawn.call(this, fn.apply(this, arguments));\n    }\n\n    createObservable.__generatorFunction__ = fn;\n    return createObservable;\n  };\n\n  var spawn = Observable.spawn = function () {\n    var gen = arguments[0], self = this, args = [];\n    for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n    return new AnonymousObservable(function (o) {\n      var g = new CompositeDisposable();\n\n      if (isFunction(gen)) { gen = gen.apply(self, args); }\n      if (!gen || !isFunction(gen.next)) {\n        o.onNext(gen);\n        return o.onCompleted();\n      }\n\n      function processGenerator(res) {\n        var ret = tryCatch(gen.next).call(gen, res);\n        if (ret === errorObj) { return o.onError(ret.e); }\n        next(ret);\n      }\n\n      processGenerator();\n\n      function onError(err) {\n        var ret = tryCatch(gen.next).call(gen, err);\n        if (ret === errorObj) { return o.onError(ret.e); }\n        next(ret);\n      }\n\n      function next(ret) {\n        if (ret.done) {\n          o.onNext(ret.value);\n          o.onCompleted();\n          return;\n        }\n        var obs = toObservable.call(self, ret.value);\n        var value = null;\n        var hasValue = false;\n        if (Observable.isObservable(obs)) {\n          g.add(obs.subscribe(function(val) {\n            hasValue = true;\n            value = val;\n          }, onError, function() {\n            hasValue && processGenerator(value);\n          }));\n        } else {\n          onError(new TypeError('type not supported'));\n        }\n      }\n\n      return g;\n    });\n  };\n\n  function toObservable(obj) {\n    if (!obj) { return obj; }\n    if (Observable.isObservable(obj)) { return obj; }\n    if (isPromise(obj)) { return Observable.fromPromise(obj); }\n    if (isGeneratorFunction(obj) || isGenerator(obj)) { return spawn.call(this, obj); }\n    if (isFunction(obj)) { return thunkToObservable.call(this, obj); }\n    if (isArrayLike(obj) || isIterable(obj)) { return arrayToObservable.call(this, obj); }\n    if (isObject(obj)) {return objectToObservable.call(this, obj);}\n    return obj;\n  }\n\n  function arrayToObservable (obj) {\n    return Observable.from(obj).concatMap(function(o) {\n      if(Observable.isObservable(o) || isObject(o)) {\n        return toObservable.call(null, o);\n      } else {\n        return Rx.Observable.just(o);\n      }\n    }).toArray();\n  }\n\n  function objectToObservable (obj) {\n    var results = new obj.constructor(), keys = Object.keys(obj), observables = [];\n    for (var i = 0, len = keys.length; i < len; i++) {\n      var key = keys[i];\n      var observable = toObservable.call(this, obj[key]);\n\n      if(observable && Observable.isObservable(observable)) {\n        defer(observable, key);\n      } else {\n        results[key] = obj[key];\n      }\n    }\n\n    return Observable.forkJoin.apply(Observable, observables).map(function() {\n      return results;\n    });\n\n\n    function defer (observable, key) {\n      results[key] = undefined;\n      observables.push(observable.map(function (next) {\n        results[key] = next;\n      }));\n    }\n  }\n\n  function thunkToObservable(fn) {\n    var self = this;\n    return new AnonymousObservable(function (o) {\n      fn.call(self, function () {\n        var err = arguments[0], res = arguments[1];\n        if (err) { return o.onError(err); }\n        if (arguments.length > 2) {\n          var args = [];\n          for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n          res = args;\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    });\n  }\n\n  function isGenerator(obj) {\n    return isFunction (obj.next) && isFunction (obj['throw']);\n  }\n\n  function isGeneratorFunction(obj) {\n    var ctor = obj.constructor;\n    if (!ctor) { return false; }\n    if (ctor.name === 'GeneratorFunction' || ctor.displayName === 'GeneratorFunction') { return true; }\n    return isGenerator(ctor.prototype);\n  }\n\n  function isObject(val) {\n    return Object == val.constructor;\n  }\n"
  },
  {
    "path": "src/core/linq/observable/start.js",
    "content": "  /**\n   * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.\n   *\n   * @example\n   * var res = Rx.Observable.start(function () { console.log('hello'); });\n   * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout);\n   * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console);\n   *\n   * @param {Function} func Function to run asynchronously.\n   * @param {Scheduler} [scheduler]  Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param [context]  The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   *\n   * Remarks\n   * * The function is called immediately, not during the subscription of the resulting sequence.\n   * * Multiple subscriptions to the resulting sequence can observe the function's result.\n   */\n  Observable.start = function (func, context, scheduler) {\n    return observableToAsync(func, context, scheduler)();\n  };\n"
  },
  {
    "path": "src/core/linq/observable/startasync.js",
    "content": "  /**\n   * Invokes the asynchronous function, surfacing the result through an observable sequence.\n   * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   */\n  Observable.startAsync = function (functionAsync) {\n    var promise = tryCatch(functionAsync)();\n    if (promise === errorObj) { return observableThrow(promise.e); }\n    return observableFromPromise(promise);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/startwith.js",
    "content": "  /**\n   *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n   *  @example\n   *  var res = source.startWith(1, 2, 3);\n   *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n   * @param {Arguments} args The specified values to prepend to the observable sequence\n   * @returns {Observable} The source sequence prepended with the specified values.\n   */\n  observableProto.startWith = function () {\n    var values, scheduler, start = 0;\n    if (!!arguments.length && isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      start = 1;\n    } else {\n      scheduler = immediateScheduler;\n    }\n    for(var args = [], i = start, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableConcat.apply(null, [observableFromArray(args, scheduler), this]);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/subscribeon.js",
    "content": "  var SubscribeOnObservable = (function (__super__) {\n    inherits(SubscribeOnObservable, __super__);\n    function SubscribeOnObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(scheduler, state) {\n      var source = state[0], d = state[1], o = state[2];\n      d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(o)));\n    }\n\n    SubscribeOnObservable.prototype.subscribeCore = function (o) {\n      var m = new SingleAssignmentDisposable(), d = new SerialDisposable();\n      d.setDisposable(m);\n      m.setDisposable(this._s.schedule([this.source, d, o], scheduleMethod));\n      return d;\n    };\n\n    return SubscribeOnObservable;\n  }(ObservableBase));\n\n   /**\n   *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n   *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n   *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n   *  callbacks on a scheduler, use observeOn.\n\n   *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n   *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n   */\n  observableProto.subscribeOn = function (scheduler) {\n    return new SubscribeOnObservable(this, scheduler);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/sum.js",
    "content": "  var SumObservable = (function (__super__) {\n    inherits(SumObservable, __super__);\n    function SumObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    SumObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SumObserver(o, this._fn, this.source));\n    };\n\n    return SumObservable;\n  }(ObservableBase));\n\n  var SumObserver = (function (__super__) {\n    inherits(SumObserver, __super__);\n\n    function SumObserver(o, fn, s) {\n      this._o = o;\n      this._fn = fn;\n      this._s = s;\n      this._i = 0;\n      this._c = 0;\n      __super__.call(this);\n    }\n\n    SumObserver.prototype.next = function (x) {\n      if (this._fn) {\n        var result = tryCatch(this._fn)(x, this._i++, this._s);\n        if (result === errorObj) { return this._o.onError(result.e); }\n        this._c += result;\n      } else {\n        this._c += x;\n      }\n    };\n    SumObserver.prototype.error = function (e) { this._o.onError(e); };\n    SumObserver.prototype.completed = function () {\n      this._o.onNext(this._c);\n      this._o.onCompleted();\n    };\n\n    return SumObserver;\n  }(AbstractObserver));\n\n  /**\n   * Computes the sum of a sequence of values that are obtained by invoking an optional transform function on each element of the input sequence, else if not specified computes the sum on each item in the sequence.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the sum of the values in the source sequence.\n   */\n  observableProto.sum = function (keySelector, thisArg) {\n    var fn = bindCallback(keySelector, thisArg, 3);\n    return new SumObservable(this, fn);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/switchfirst.js",
    "content": "  var SwitchFirstObservable = (function (__super__) {\n    inherits(SwitchFirstObservable, __super__);\n    function SwitchFirstObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    SwitchFirstObservable.prototype.subscribeCore = function (o) {\n      var m = new SingleAssignmentDisposable(),\n        g = new CompositeDisposable(),\n        state = {\n          hasCurrent: false,\n          isStopped: false,\n          o: o,\n          g: g\n        };\n\n      g.add(m);\n      m.setDisposable(this.source.subscribe(new SwitchFirstObserver(state)));\n      return g;\n    };\n\n    return SwitchFirstObservable;\n  }(ObservableBase));\n\n  var SwitchFirstObserver = (function(__super__) {\n    inherits(SwitchFirstObserver, __super__);\n    function SwitchFirstObserver(state) {\n      this._s = state;\n      __super__.call(this);\n    }\n\n    SwitchFirstObserver.prototype.next = function (x) {\n      if (!this._s.hasCurrent) {\n        this._s.hasCurrent = true;\n        isPromise(x) && (x = observableFromPromise(x));\n        var inner = new SingleAssignmentDisposable();\n        this._s.g.add(inner);\n        inner.setDisposable(x.subscribe(new InnerObserver(this._s, inner)));\n      }\n    };\n\n    SwitchFirstObserver.prototype.error = function (e) {\n      this._s.o.onError(e);\n    };\n\n    SwitchFirstObserver.prototype.completed = function () {\n      this._s.isStopped = true;\n      !this._s.hasCurrent && this._s.g.length === 1 && this._s.o.onCompleted();\n    };\n\n    inherits(InnerObserver, __super__);\n    function InnerObserver(state, inner) {\n      this._s = state;\n      this._i = inner;\n      __super__.call(this);\n    }\n\n    InnerObserver.prototype.next = function (x) { this._s.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    InnerObserver.prototype.completed = function () {\n      this._s.g.remove(this._i);\n      this._s.hasCurrent = false;\n      this._s.isStopped && this._s.g.length === 1 && this._s.o.onCompleted();\n    };\n\n    return SwitchFirstObserver;\n  }(AbstractObserver));\n\n  /**\n   * Performs a exclusive waiting for the first to finish before subscribing to another observable.\n   * Observables that come in between subscriptions will be dropped on the floor.\n   * @returns {Observable} A exclusive observable with only the results that happen when subscribed.\n   */\n  observableProto.switchFirst = function () {\n    return new SwitchFirstObservable(this);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/takelast.js",
    "content": "  var TakeLastObserver = (function (__super__) {\n    inherits(TakeLastObserver, __super__);\n    function TakeLastObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastObserver.prototype.completed = function () {\n      while (this._q.length > 0) { this._o.onNext(this._q.shift()); }\n      this._o.onCompleted();\n    };\n\n    return TakeLastObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns a specified number of contiguous elements from the end of an observable sequence.\n   * @description\n   *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n   *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLast = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastObserver(o, count));\n    }, source);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/takelastbuffer.js",
    "content": "  var TakeLastBufferObserver = (function (__super__) {\n    inherits(TakeLastBufferObserver, __super__);\n    function TakeLastBufferObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastBufferObserver.prototype.next = function (x) {\n      this._q.push(x);\n      this._q.length > this._c && this._q.shift();\n    };\n\n    TakeLastBufferObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TakeLastBufferObserver.prototype.completed = function () {\n      this._o.onNext(this._q);\n      this._o.onCompleted();\n    };\n\n    return TakeLastBufferObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n   *\n   * @description\n   *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n   *  source sequence, this buffer is produced on the result sequence.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLastBuffer = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(new TakeLastBufferObserver(o, count));\n    }, source);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/takelastbufferwithtime.js",
    "content": "  /**\n   *  Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastBufferWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        var now = scheduler.now();\n        q.push({ interval: now, value: x });\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          q.shift();\n        }\n      }, function (e) { o.onError(e); }, function () {\n        var now = scheduler.now(), res = [];\n        while (q.length > 0) {\n          var next = q.shift();\n          now - next.interval <= duration && res.push(next.value);\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    }, source);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/takelastwithtime.js",
    "content": "  var TakeLastWithTimeObservable = (function (__super__) {\n    inherits(TakeLastWithTimeObservable, __super__);\n    function TakeLastWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TakeLastWithTimeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeLastWithTimeObserver(o, this._d, this._s));\n    };\n\n    return TakeLastWithTimeObservable;\n  }(ObservableBase));\n\n  var TakeLastWithTimeObserver = (function (__super__) {\n    inherits(TakeLastWithTimeObserver, __super__);\n\n    function TakeLastWithTimeObserver(o, d, s) {\n      this._o = o;\n      this._d = d;\n      this._s = s;\n      this._q = [];\n      __super__.call(this);\n    }\n\n    TakeLastWithTimeObserver.prototype.next = function (x) {\n      var now = this._s.now();\n      this._q.push({ interval: now, value: x });\n      while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n        this._q.shift();\n      }\n    };\n    TakeLastWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeLastWithTimeObserver.prototype.completed = function () {\n      var now = this._s.now();\n      while (this._q.length > 0) {\n        var next = this._q.shift();\n        if (now - next.interval <= this._d) { this._o.onNext(next.value); }\n      }\n      this._o.onCompleted();\n    };\n\n    return TakeLastWithTimeObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TakeLastWithTimeObservable(this, duration, scheduler);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/takeuntilwithtime.js",
    "content": "  /**\n   *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n   * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n   * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n   */\n  observableProto.takeUntilWithTime = function (endTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return new BinaryDisposable(\n        scheduler.scheduleFuture(o, endTime, function (_, o) { o.onCompleted(); }),\n        source.subscribe(o));\n    }, source);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/takewhile.js",
    "content": "  var TakeWhileObservable = (function (__super__) {\n    inherits(TakeWhileObservable, __super__);\n    function TakeWhileObservable(source, fn) {\n      this.source = source;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    TakeWhileObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeWhileObserver(o, this));\n    };\n\n    return TakeWhileObservable;\n  }(ObservableBase));\n\n  var TakeWhileObserver = (function (__super__) {\n    inherits(TakeWhileObserver, __super__);\n\n    function TakeWhileObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      this._i = 0;\n      this._r = true;\n      __super__.call(this);\n    }\n\n    TakeWhileObserver.prototype.next = function (x) {\n      if (this._r) {\n        this._r = tryCatch(this._p._fn)(x, this._i++, this._p);\n        if (this._r === errorObj) { return this._o.onError(this._r.e); }\n      }\n      if (this._r) {\n        this._o.onNext(x);\n      } else {\n        this._o.onCompleted();\n      }\n    };\n    TakeWhileObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeWhileObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Returns elements from an observable sequence as long as a specified condition is true.\n   *  The element's index is used in the logic of the predicate function.\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n   */\n  observableProto.takeWhile = function (predicate, thisArg) {\n    var fn = bindCallback(predicate, thisArg, 3);\n    return new TakeWhileObservable(this, fn);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/takewithtime.js",
    "content": "  var TakeWithTimeObservable = (function (__super__) {\n    inherits(TakeWithTimeObservable, __super__);\n    function TakeWithTimeObservable(source, d, s) {\n      this.source = source;\n      this._d = d;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(s, o) {\n      o.onCompleted();\n    }\n\n    TakeWithTimeObservable.prototype.subscribeCore = function (o) {\n      return new BinaryDisposable(\n        this._s.scheduleFuture(o, this._d, scheduleMethod),\n        this.source.subscribe(o)\n      );\n    };\n\n    return TakeWithTimeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.takeWithTime(5000,  [optional scheduler]);\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence.\n   */\n  observableProto.takeWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TakeWithTimeObservable(this, duration, scheduler);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/thendo.js",
    "content": "  /**\n   *  Matches when the observable sequence has an available value and projects the value.\n   *\n   *  @param {Function} selector Selector that will be invoked for values in the source sequence.\n   *  @returns {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  observableProto.thenDo = function (selector) {\n    return new Pattern([this]).thenDo(selector);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/throttle.js",
    "content": "  /**\n   * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n   * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n   * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n   * @returns {Observable} An Observable that performs the throttle operation.\n   */\n  observableProto.throttle = function (windowDuration, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    var duration = +windowDuration || 0;\n    if (duration <= 0) { throw new RangeError('windowDuration cannot be less or equal zero.'); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var lastOnNext = 0;\n      return source.subscribe(\n        function (x) {\n          var now = scheduler.now();\n          if (lastOnNext === 0 || now - lastOnNext >= duration) {\n            lastOnNext = now;\n            o.onNext(x);\n          }\n        },function (e) { o.onError(e); }, function () { o.onCompleted(); }\n      );\n    }, source);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/timeinterval.js",
    "content": "  var TimeIntervalObservable = (function (__super__) {\n    inherits(TimeIntervalObservable, __super__);\n    function TimeIntervalObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimeIntervalObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TimeIntervalObserver(o, this._s));\n    };\n\n    return TimeIntervalObservable;\n  }(ObservableBase));\n\n  var TimeIntervalObserver = (function (__super__) {\n    inherits(TimeIntervalObserver, __super__);\n\n    function TimeIntervalObserver(o, s) {\n      this._o = o;\n      this._s = s;\n      this._l = s.now();\n      __super__.call(this);\n    }\n\n    TimeIntervalObserver.prototype.next = function (x) {\n      var now = this._s.now(), span = now - this._l;\n      this._l = now;\n      this._o.onNext({ value: x, interval: span });\n    };\n    TimeIntervalObserver.prototype.error = function (e) { this._o.onError(e); };\n    TimeIntervalObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TimeIntervalObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Records the time interval between consecutive values in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timeInterval();\n   *  2 - res = source.timeInterval(Rx.Scheduler.timeout);\n   *\n   * @param [scheduler]  Scheduler used to compute time intervals. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence with time interval information on values.\n   */\n  observableProto.timeInterval = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TimeIntervalObservable(this, scheduler);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/timeout.js",
    "content": "  var TimeoutError = Rx.TimeoutError = function(message) {\n    this.message = message || 'Timeout has occurred';\n    this.name = 'TimeoutError';\n    Error.call(this);\n  };\n  TimeoutError.prototype = Object.create(Error.prototype);\n\n  function timeoutWithSelector(source, firstTimeout, timeoutDurationSelector, other) {\n    if (isFunction(firstTimeout)) {\n      other = timeoutDurationSelector;\n      timeoutDurationSelector = firstTimeout;\n      firstTimeout = observableNever();\n    }\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var subscription = new SerialDisposable(),\n        timer = new SerialDisposable(),\n        original = new SingleAssignmentDisposable();\n\n      subscription.setDisposable(original);\n\n      var id = 0, switched = false;\n\n      function setTimer(timeout) {\n        var myId = id, d = new SingleAssignmentDisposable();\n\n        function timerWins() {\n          switched = (myId === id);\n          return switched;\n        }\n\n        timer.setDisposable(d);\n        d.setDisposable(timeout.subscribe(function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n          d.dispose();\n        }, function (e) {\n          timerWins() && o.onError(e);\n        }, function () {\n          timerWins() && subscription.setDisposable(other.subscribe(o));\n        }));\n      };\n\n      setTimer(firstTimeout);\n\n      function oWins() {\n        var res = !switched;\n        if (res) { id++; }\n        return res;\n      }\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (oWins()) {\n          o.onNext(x);\n          var timeout = tryCatch(timeoutDurationSelector)(x);\n          if (timeout === errorObj) { return o.onError(timeout.e); }\n          setTimer(isPromise(timeout) ? observableFromPromise(timeout) : timeout);\n        }\n      }, function (e) {\n        oWins() && o.onError(e);\n      }, function () {\n        oWins() && o.onCompleted();\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  function timeout(source, dueTime, other, scheduler) {\n    if (isScheduler(other)) {\n      scheduler = other;\n      other = observableThrow(new TimeoutError());\n    }\n    if (other instanceof Error) { other = observableThrow(other); }\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    Observable.isObservable(other) || (other = observableThrow(new TimeoutError()));\n    return new AnonymousObservable(function (o) {\n      var id = 0,\n        original = new SingleAssignmentDisposable(),\n        subscription = new SerialDisposable(),\n        switched = false,\n        timer = new SerialDisposable();\n\n      subscription.setDisposable(original);\n\n      function createTimer() {\n        var myId = id;\n        timer.setDisposable(scheduler.scheduleFuture(null, dueTime, function () {\n          switched = id === myId;\n          if (switched) {\n            isPromise(other) && (other = observableFromPromise(other));\n            subscription.setDisposable(other.subscribe(o));\n          }\n        }));\n      }\n\n      createTimer();\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (!switched) {\n          id++;\n          o.onNext(x);\n          createTimer();\n        }\n      }, function (e) {\n        if (!switched) {\n          id++;\n          o.onError(e);\n        }\n      }, function () {\n        if (!switched) {\n          id++;\n          o.onCompleted();\n        }\n      }));\n      return new BinaryDisposable(subscription, timer);\n    }, source);\n  }\n\n  observableProto.timeout = function () {\n    var firstArg = arguments[0];\n    if (firstArg instanceof Date || typeof firstArg === 'number') {\n      return timeout(this, firstArg, arguments[1], arguments[2]);\n    } else if (Observable.isObservable(firstArg) || isFunction(firstArg)) {\n      return timeoutWithSelector(this, firstArg, arguments[1], arguments[2]);\n    } else {\n      throw new Error('Invalid arguments');\n    }\n  };\n"
  },
  {
    "path": "src/core/linq/observable/timer.js",
    "content": "  /**\n   *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n   * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n   */\n  var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) {\n    var period;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    if (periodOrScheduler != null && typeof periodOrScheduler === 'number') {\n      period = periodOrScheduler;\n    } else if (isScheduler(periodOrScheduler)) {\n      scheduler = periodOrScheduler;\n    }\n    if ((dueTime instanceof Date || typeof dueTime === 'number') && period === undefined) {\n      return _observableTimer(dueTime, scheduler);\n    }\n    if (dueTime instanceof Date && period !== undefined) {\n      return observableTimerDateAndPeriod(dueTime, periodOrScheduler, scheduler);\n    }\n    return observableTimerTimeSpanAndPeriod(dueTime, period, scheduler);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/timestamp.js",
    "content": "  var TimestampObservable = (function (__super__) {\n    inherits(TimestampObservable, __super__);\n    function TimestampObservable(source, s) {\n      this.source = source;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TimestampObserver(o, this._s));\n    };\n\n    return TimestampObservable;\n  }(ObservableBase));\n\n  var TimestampObserver = (function (__super__) {\n    inherits(TimestampObserver, __super__);\n    function TimestampObserver(o, s) {\n      this._o = o;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    TimestampObserver.prototype.next = function (x) {\n      this._o.onNext({ value: x, timestamp: this._s.now() });\n    };\n\n    TimestampObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    TimestampObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return TimestampObserver;\n  }(AbstractObserver));\n\n  /**\n   *  Records the timestamp for each value in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n   *  2 - res = source.timestamp(Rx.Scheduler.default);\n   *\n   * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the default scheduler is used.\n   * @returns {Observable} An observable sequence with timestamp information on values.\n   */\n  observableProto.timestamp = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new TimestampObservable(this, scheduler);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/toasync.js",
    "content": "  /**\n   * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n   * @param {Function} function Function to convert to an asynchronous function.\n   * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Function} Asynchronous function.\n   */\n  var observableToAsync = Observable.toAsync = function (func, context, scheduler) {\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return function () {\n      var args = arguments,\n        subject = new AsyncSubject();\n\n      scheduler.schedule(null, function () {\n        var result;\n        try {\n          result = func.apply(context, args);\n        } catch (e) {\n          subject.onError(e);\n          return;\n        }\n        subject.onNext(result);\n        subject.onCompleted();\n      });\n      return subject.asObservable();\n    };\n  };\n"
  },
  {
    "path": "src/core/linq/observable/tomap.js",
    "content": "  var ToMapObservable = (function (__super__) {\n    inherits(ToMapObservable, __super__);\n    function ToMapObservable(source, k, e) {\n      this.source = source;\n      this._k = k;\n      this._e = e;\n      __super__.call(this);\n    }\n\n    ToMapObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ToMapObserver(o, this._k, this._e));\n    };\n\n    return ToMapObservable;\n  }(ObservableBase));\n\n  var ToMapObserver = (function (__super__) {\n    inherits(ToMapObserver, __super__);\n    function ToMapObserver(o, k, e) {\n      this._o = o;\n      this._k = k;\n      this._e = e;\n      this._m = new root.Map();\n      __super__.call(this);\n    }\n\n    ToMapObserver.prototype.next = function (x) {\n      var key = tryCatch(this._k)(x);\n      if (key === errorObj) { return this._o.onError(key.e); }\n      var elem = x;\n      if (this._e) {\n        elem = tryCatch(this._e)(x);\n        if (elem === errorObj) { return this._o.onError(elem.e); }\n      }\n\n      this._m.set(key, elem);\n    };\n\n    ToMapObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ToMapObserver.prototype.completed = function () {\n      this._o.onNext(this._m);\n      this._o.onCompleted();\n    };\n\n    return ToMapObserver;\n  }(AbstractObserver));\n\n  /**\n  * Converts the observable sequence to a Map if it exists.\n  * @param {Function} keySelector A function which produces the key for the Map.\n  * @param {Function} [elementSelector] An optional function which produces the element for the Map. If not present, defaults to the value from the observable sequence.\n  * @returns {Observable} An observable sequence with a single value of a Map containing the values from the observable sequence.\n  */\n  observableProto.toMap = function (keySelector, elementSelector) {\n    if (typeof root.Map === 'undefined') { throw new TypeError(); }\n    return new ToMapObservable(this, keySelector, elementSelector);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/topromise.js",
    "content": "  /*\n   * Converts an existing observable sequence to an ES6 Compatible Promise\n   * @example\n   * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n   *\n   * // With config\n   * Rx.config.Promise = RSVP.Promise;\n   * var promise = Rx.Observable.return(42).toPromise();\n   * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n   * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n   */\n  observableProto.toPromise = function (promiseCtor) {\n    promiseCtor || (promiseCtor = Rx.config.Promise);\n    if (!promiseCtor) { throw new NotSupportedError('Promise type not provided nor in Rx.config.Promise'); }\n    var source = this;\n    return new promiseCtor(function (resolve, reject) {\n      // No cancellation can be done\n      var value;\n      source.subscribe(function (v) {\n        value = v;\n      }, reject, function () {\n        resolve(value);\n      });\n    });\n  };\n"
  },
  {
    "path": "src/core/linq/observable/toset.js",
    "content": "  var ToSetObservable = (function (__super__) {\n    inherits(ToSetObservable, __super__);\n    function ToSetObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    ToSetObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new ToSetObserver(o));\n    };\n\n    return ToSetObservable;\n  }(ObservableBase));\n\n  var ToSetObserver = (function (__super__) {\n    inherits(ToSetObserver, __super__);\n    function ToSetObserver(o) {\n      this._o = o;\n      this._s = new root.Set();\n      __super__.call(this);\n    }\n\n    ToSetObserver.prototype.next = function (x) {\n      this._s.add(x);\n    };\n\n    ToSetObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ToSetObserver.prototype.completed = function () {\n      this._o.onNext(this._s);\n      this._o.onCompleted();\n    };\n\n    return ToSetObserver;\n  }(AbstractObserver));\n\n  /**\n   * Converts the observable sequence to a Set if it exists.\n   * @returns {Observable} An observable sequence with a single value of a Set containing the values from the observable sequence.\n   */\n  observableProto.toSet = function () {\n    if (typeof root.Set === 'undefined') { throw new TypeError(); }\n    return new ToSetObservable(this);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/transduce.js",
    "content": "  var TransduceObserver = (function (__super__) {\n    inherits(TransduceObserver, __super__);\n    function TransduceObserver(o, xform) {\n      this._o = o;\n      this._xform = xform;\n      __super__.call(this);\n    }\n\n    TransduceObserver.prototype.next = function (x) {\n      var res = tryCatch(this._xform['@@transducer/step']).call(this._xform, this._o, x);\n      if (res === errorObj) { this._o.onError(res.e); }\n    };\n\n    TransduceObserver.prototype.error = function (e) { this._o.onError(e); };\n\n    TransduceObserver.prototype.completed = function () {\n      this._xform['@@transducer/result'](this._o);\n    };\n\n    return TransduceObserver;\n  }(AbstractObserver));\n\n  function transformForObserver(o) {\n    return {\n      '@@transducer/init': function() {\n        return o;\n      },\n      '@@transducer/step': function(obs, input) {\n        return obs.onNext(input);\n      },\n      '@@transducer/result': function(obs) {\n        return obs.onCompleted();\n      }\n    };\n  }\n\n  /**\n   * Executes a transducer to transform the observable sequence\n   * @param {Transducer} transducer A transducer to execute\n   * @returns {Observable} An Observable sequence containing the results from the transducer.\n   */\n  observableProto.transduce = function(transducer) {\n    var source = this;\n    return new AnonymousObservable(function(o) {\n      var xform = transducer(transformForObserver(o));\n      return source.subscribe(new TransduceObserver(o, xform));\n    }, source);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/using.js",
    "content": "  var UsingObservable = (function (__super__) {\n    inherits(UsingObservable, __super__);\n    function UsingObservable(resFn, obsFn) {\n      this._resFn = resFn;\n      this._obsFn = obsFn;\n      __super__.call(this);\n    }\n\n    UsingObservable.prototype.subscribeCore = function (o) {\n      var disposable = disposableEmpty;\n      var resource = tryCatch(this._resFn)();\n      if (resource === errorObj) {\n        return new BinaryDisposable(observableThrow(resource.e).subscribe(o), disposable);\n      }\n      resource && (disposable = resource);\n      var source = tryCatch(this._obsFn)(resource);\n      if (source === errorObj) {\n        return new BinaryDisposable(observableThrow(source.e).subscribe(o), disposable);\n      }\n      return new BinaryDisposable(source.subscribe(o), disposable);\n    };\n\n    return UsingObservable;\n  }(ObservableBase));\n\n  /**\n   * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n   * @param {Function} resourceFactory Factory function to obtain a resource object.\n   * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n   * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n   */\n  Observable.using = function (resourceFactory, observableFactory) {\n    return new UsingObservable(resourceFactory, observableFactory);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/when.js",
    "content": "  /**\n   *  Joins together the results from several patterns.\n   *\n   *  @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns.\n   *  @returns {Observable} Observable sequence with the results form matching several patterns.\n   */\n  Observable.when = function () {\n    var len = arguments.length, plans;\n    if (Array.isArray(arguments[0])) {\n      plans = arguments[0];\n    } else {\n      plans = new Array(len);\n      for(var i = 0; i < len; i++) { plans[i] = arguments[i]; }\n    }\n    return new AnonymousObservable(function (o) {\n      var activePlans = [],\n          externalSubscriptions = new Map();\n      var outObserver = observerCreate(\n        function (x) { o.onNext(x); },\n        function (err) {\n          externalSubscriptions.forEach(function (v) { v.onError(err); });\n          o.onError(err);\n        },\n        function (x) { o.onCompleted(); }\n      );\n      try {\n        for (var i = 0, len = plans.length; i < len; i++) {\n          activePlans.push(plans[i].activate(externalSubscriptions, outObserver, function (activePlan) {\n            var idx = activePlans.indexOf(activePlan);\n            activePlans.splice(idx, 1);\n            activePlans.length === 0 && o.onCompleted();\n          }));\n        }\n      } catch (e) {\n        return observableThrow(e).subscribe(o);\n      }\n      var group = new CompositeDisposable();\n      externalSubscriptions.forEach(function (joinObserver) {\n        joinObserver.subscribe();\n        group.add(joinObserver);\n      });\n\n      return group;\n    });\n  };\n"
  },
  {
    "path": "src/core/linq/observable/while.js",
    "content": "   /**\n   *  Repeats source as long as condition holds emulating a while loop.\n   * There is an alias for this method called 'whileDo' for browsers <IE9\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  var observableWhileDo = Observable['while'] = Observable.whileDo = function (condition, source) {\n    isPromise(source) && (source = observableFromPromise(source));\n    return enumerableWhile(condition, source).concat();\n  };\n"
  },
  {
    "path": "src/core/linq/observable/window.js",
    "content": "  /**\n   *  Projects each element of an observable sequence into zero or more windows.\n   *\n   *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n   *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n   *  @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.window = function (windowOpeningsOrClosingSelector, windowClosingSelector) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'function') {\n      return observableWindowWithBoundaries.call(this, windowOpeningsOrClosingSelector);\n    }\n    return typeof windowOpeningsOrClosingSelector === 'function' ?\n      observableWindowWithClosingSelector.call(this, windowOpeningsOrClosingSelector) :\n      observableWindowWithOpenings.call(this, windowOpeningsOrClosingSelector, windowClosingSelector);\n  };\n\n  function observableWindowWithOpenings(windowOpenings, windowClosingSelector) {\n    return windowOpenings.groupJoin(this, windowClosingSelector, observableEmpty, function (_, win) {\n      return win;\n    });\n  }\n\n  function observableWindowWithBoundaries(windowBoundaries) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var win = new Subject(),\n        d = new CompositeDisposable(),\n        r = new RefCountDisposable(d);\n\n      observer.onNext(addRef(win, r));\n\n      d.add(source.subscribe(function (x) {\n        win.onNext(x);\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      isPromise(windowBoundaries) && (windowBoundaries = observableFromPromise(windowBoundaries));\n\n      d.add(windowBoundaries.subscribe(function (w) {\n        win.onCompleted();\n        win = new Subject();\n        observer.onNext(addRef(win, r));\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      return r;\n    }, source);\n  }\n\n  function observableWindowWithClosingSelector(windowClosingSelector) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        r = new RefCountDisposable(d),\n        win = new Subject();\n      observer.onNext(addRef(win, r));\n      d.add(source.subscribe(function (x) {\n          win.onNext(x);\n      }, function (err) {\n          win.onError(err);\n          observer.onError(err);\n      }, function () {\n          win.onCompleted();\n          observer.onCompleted();\n      }));\n\n      function createWindowClose () {\n        var windowClose;\n        try {\n          windowClose = windowClosingSelector();\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n\n        isPromise(windowClose) && (windowClose = observableFromPromise(windowClose));\n\n        var m1 = new SingleAssignmentDisposable();\n        m.setDisposable(m1);\n        m1.setDisposable(windowClose.take(1).subscribe(noop, function (err) {\n          win.onError(err);\n          observer.onError(err);\n        }, function () {\n          win.onCompleted();\n          win = new Subject();\n          observer.onNext(addRef(win, r));\n          createWindowClose();\n        }));\n      }\n\n      createWindowClose();\n      return r;\n    }, source);\n  }\n"
  },
  {
    "path": "src/core/linq/observable/windowwithcount.js",
    "content": "  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n   * @param {Number} count Length of each window.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithCount = observableProto.windowCount = function (count, skip) {\n    var source = this;\n    +count || (count = 0);\n    Math.abs(count) === Infinity && (count = 0);\n    if (count <= 0) { throw new ArgumentOutOfRangeError(); }\n    skip == null && (skip = count);\n    +skip || (skip = 0);\n    Math.abs(skip) === Infinity && (skip = 0);\n\n    if (skip <= 0) { throw new ArgumentOutOfRangeError(); }\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(),\n        refCountDisposable = new RefCountDisposable(m),\n        n = 0,\n        q = [];\n\n      function createWindow () {\n        var s = new Subject();\n        q.push(s);\n        observer.onNext(addRef(s, refCountDisposable));\n      }\n\n      createWindow();\n\n      m.setDisposable(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n          var c = n - count + 1;\n          c >= 0 && c % skip === 0 && q.shift().onCompleted();\n          ++n % skip === 0 && createWindow();\n        },\n        function (e) {\n          while (q.length > 0) { q.shift().onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          while (q.length > 0) { q.shift().onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/windowwithtime.js",
    "content": "  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n   * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n   * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTime = observableProto.windowTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n    var source = this, timeShift;\n    timeShiftOrScheduler == null && (timeShift = timeSpan);\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    if (typeof timeShiftOrScheduler === 'number') {\n      timeShift = timeShiftOrScheduler;\n    } else if (isScheduler(timeShiftOrScheduler)) {\n      timeShift = timeSpan;\n      scheduler = timeShiftOrScheduler;\n    }\n    return new AnonymousObservable(function (observer) {\n      var groupDisposable,\n        nextShift = timeShift,\n        nextSpan = timeSpan,\n        q = [],\n        refCountDisposable,\n        timerD = new SerialDisposable(),\n        totalTime = 0;\n        groupDisposable = new CompositeDisposable(timerD),\n        refCountDisposable = new RefCountDisposable(groupDisposable);\n\n       function createTimer () {\n        var m = new SingleAssignmentDisposable(),\n          isSpan = false,\n          isShift = false;\n        timerD.setDisposable(m);\n        if (nextSpan === nextShift) {\n          isSpan = true;\n          isShift = true;\n        } else if (nextSpan < nextShift) {\n            isSpan = true;\n        } else {\n          isShift = true;\n        }\n        var newTotalTime = isSpan ? nextSpan : nextShift,\n          ts = newTotalTime - totalTime;\n        totalTime = newTotalTime;\n        if (isSpan) {\n          nextSpan += timeShift;\n        }\n        if (isShift) {\n          nextShift += timeShift;\n        }\n        m.setDisposable(scheduler.scheduleFuture(null, ts, function () {\n          if (isShift) {\n            var s = new Subject();\n            q.push(s);\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          isSpan && q.shift().onCompleted();\n          createTimer();\n        }));\n      };\n      q.push(new Subject());\n      observer.onNext(addRef(q[0], refCountDisposable));\n      createTimer();\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n        },\n        function (e) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/windowwithtimeorcount.js",
    "content": "  /**\n   *  Projects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed.\n   * @param {Number} timeSpan Maximum time length of a window.\n   * @param {Number} count Maximum element count of a window.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTimeOrCount = observableProto.windowTimeOrCount = function (timeSpan, count, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = defaultScheduler);\n    return new AnonymousObservable(function (observer) {\n      var timerD = new SerialDisposable(),\n          groupDisposable = new CompositeDisposable(timerD),\n          refCountDisposable = new RefCountDisposable(groupDisposable),\n          n = 0,\n          windowId = 0,\n          s = new Subject();\n\n      function createTimer(id) {\n        var m = new SingleAssignmentDisposable();\n        timerD.setDisposable(m);\n        m.setDisposable(scheduler.scheduleFuture(null, timeSpan, function () {\n          if (id !== windowId) { return; }\n          n = 0;\n          var newId = ++windowId;\n          s.onCompleted();\n          s = new Subject();\n          observer.onNext(addRef(s, refCountDisposable));\n          createTimer(newId);\n        }));\n      }\n\n      observer.onNext(addRef(s, refCountDisposable));\n      createTimer(0);\n\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          var newId = 0, newWindow = false;\n          s.onNext(x);\n          if (++n === count) {\n            newWindow = true;\n            n = 0;\n            newId = ++windowId;\n            s.onCompleted();\n            s = new Subject();\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          newWindow && createTimer(newId);\n        },\n        function (e) {\n          s.onError(e);\n          observer.onError(e);\n        }, function () {\n          s.onCompleted();\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/zip.js",
    "content": "  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n   * @param arguments Observable sources.\n   * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  Observable.zip = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    if (Array.isArray(args[0])) {\n      args = isFunction(args[1]) ? args[0].concat(args[1]) : args[0];\n    }\n    var first = args.shift();\n    return first.zip.apply(first, args);\n  };\n"
  },
  {
    "path": "src/core/linq/observable/zipiterable.js",
    "content": "function falseFactory() { return false; }\nfunction emptyArrayFactory() { return []; }\nfunction argumentsToArray() {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return args;\n}\n\nvar ZipIterableObservable = (function(__super__) {\n  inherits(ZipIterableObservable, __super__);\n  function ZipIterableObservable(sources, cb) {\n    this.sources = sources;\n    this._cb = cb;\n    __super__.call(this);\n  }\n\n  ZipIterableObservable.prototype.subscribeCore = function (o) {\n    var sources = this.sources, len = sources.length, subscriptions = new Array(len);\n\n    var state = {\n      q: arrayInitialize(len, emptyArrayFactory),\n      done: arrayInitialize(len, falseFactory),\n      cb: this._cb,\n      o: o\n    };\n\n    for (var i = 0; i < len; i++) {\n      (function (i) {\n        var source = sources[i], sad = new SingleAssignmentDisposable();\n        (isArrayLike(source) || isIterable(source)) && (source = observableFrom(source));\n\n        subscriptions[i] = sad;\n        sad.setDisposable(source.subscribe(new ZipIterableObserver(state, i)));\n      }(i));\n    }\n\n    return new NAryDisposable(subscriptions);\n  };\n\n  return ZipIterableObservable;\n}(ObservableBase));\n\nvar ZipIterableObserver = (function (__super__) {\n  inherits(ZipIterableObserver, __super__);\n  function ZipIterableObserver(s, i) {\n    this._s = s;\n    this._i = i;\n    __super__.call(this);\n  }\n\n  function notEmpty(x) { return x.length > 0; }\n  function shiftEach(x) { return x.shift(); }\n  function notTheSame(i) {\n    return function (x, j) {\n      return j !== i;\n    };\n  }\n\n  ZipIterableObserver.prototype.next = function (x) {\n    this._s.q[this._i].push(x);\n    if (this._s.q.every(notEmpty)) {\n      var queuedValues = this._s.q.map(shiftEach),\n          res = tryCatch(this._s.cb).apply(null, queuedValues);\n      if (res === errorObj) { return this._s.o.onError(res.e); }\n      this._s.o.onNext(res);\n    } else if (this._s.done.filter(notTheSame(this._i)).every(identity)) {\n      this._s.o.onCompleted();\n    }\n  };\n\n  ZipIterableObserver.prototype.error = function (e) { this._s.o.onError(e); };\n\n  ZipIterableObserver.prototype.completed = function () {\n    this._s.done[this._i] = true;\n    this._s.done.every(identity) && this._s.o.onCompleted();\n  };\n\n  return ZipIterableObserver;\n}(AbstractObserver));\n\n/**\n * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n */\nobservableProto.zipIterable = function () {\n  if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n\n  var parent = this;\n  args.unshift(parent);\n  return new ZipIterableObservable(args, resultSelector);\n};\n"
  },
  {
    "path": "src/core/longstacktraces/longstackbegin.js",
    "content": "  Rx.config.longStackSupport = false;\n  var hasStacks = false, stacks = tryCatch(function () { throw new Error(); })();\n  hasStacks = !!stacks.e && !!stacks.e.stack;\n\n  // All code after this point will be filtered from stack traces reported by RxJS\n  var rStartingLine = captureLine(), rFileName;\n"
  },
  {
    "path": "src/core/longstacktraces/longstackend.js",
    "content": "  // All code before this point will be filtered from stack traces.\n  var rEndingLine = captureLine();\n"
  },
  {
    "path": "src/core/longstacktraces/longstacktraces.js",
    "content": "  var STACK_JUMP_SEPARATOR = 'From previous event:';\n\n  function makeStackTraceLong(error, observable) {\n    // If possible, transform the error stack trace by removing Node and RxJS\n    // cruft, then concatenating with the stack trace of `observable`.\n    if (hasStacks &&\n        observable.stack &&\n        typeof error === 'object' &&\n        error !== null &&\n        error.stack &&\n        error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n    ) {\n      var stacks = [];\n      for (var o = observable; !!o; o = o.source) {\n        if (o.stack) {\n          stacks.unshift(o.stack);\n        }\n      }\n      stacks.unshift(error.stack);\n\n      var concatedStacks = stacks.join('\\n' + STACK_JUMP_SEPARATOR + '\\n');\n      error.stack = filterStackString(concatedStacks);\n    }\n  }\n\n  function filterStackString(stackString) {\n    var lines = stackString.split('\\n'), desiredLines = [];\n    for (var i = 0, len = lines.length; i < len; i++) {\n      var line = lines[i];\n\n      if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n        desiredLines.push(line);\n      }\n    }\n    return desiredLines.join('\\n');\n  }\n\n  function isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n    if (!fileNameAndLineNumber) {\n      return false;\n    }\n    var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === rFileName &&\n      lineNumber >= rStartingLine &&\n      lineNumber <= rEndingLine;\n  }\n\n  function isNodeFrame(stackLine) {\n    return stackLine.indexOf('(module.js:') !== -1 ||\n      stackLine.indexOf('(node.js:') !== -1;\n  }\n\n  function captureLine() {\n    if (!hasStacks) { return; }\n\n    try {\n      throw new Error();\n    } catch (e) {\n      var lines = e.stack.split('\\n');\n      var firstLine = lines[0].indexOf('@') > 0 ? lines[1] : lines[2];\n      var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n      if (!fileNameAndLineNumber) { return; }\n\n      rFileName = fileNameAndLineNumber[0];\n      return fileNameAndLineNumber[1];\n    }\n  }\n\n  function getFileNameAndLineNumber(stackLine) {\n    // Named functions: 'at functionName (filename:lineNumber:columnNumber)'\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }\n\n    // Anonymous functions: 'at filename:lineNumber:columnNumber'\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }\n\n    // Firefox style: 'function@filename:lineNumber or @filename:lineNumber'\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }\n  }\n"
  },
  {
    "path": "src/core/notification.js",
    "content": "  /**\n   *  Represents a notification to an observer.\n   */\n  var Notification = Rx.Notification = (function () {\n    function Notification() {\n\n    }\n\n    Notification.prototype._accept = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    Notification.prototype._acceptObserver = function (onNext, onError, onCompleted) {\n      throw new NotImplementedError();\n    };\n\n    /**\n     * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n     * @param {Function | Observer} observerOrOnNext Function to invoke for an OnNext notification or Observer to invoke the notification on..\n     * @param {Function} onError Function to invoke for an OnError notification.\n     * @param {Function} onCompleted Function to invoke for an OnCompleted notification.\n     * @returns {Any} Result produced by the observation.\n     */\n    Notification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n      return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n        this._acceptObserver(observerOrOnNext) :\n        this._accept(observerOrOnNext, onError, onCompleted);\n    };\n\n    /**\n     * Returns an observable sequence with a single notification.\n     *\n     * @memberOf Notifications\n     * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n     * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n     */\n    Notification.prototype.toObservable = function (scheduler) {\n      var self = this;\n      isScheduler(scheduler) || (scheduler = immediateScheduler);\n      return new AnonymousObservable(function (o) {\n        return scheduler.schedule(self, function (_, notification) {\n          notification._acceptObserver(o);\n          notification.kind === 'N' && o.onCompleted();\n        });\n      });\n    };\n\n    return Notification;\n  })();\n\n  var OnNextNotification = (function (__super__) {\n    inherits(OnNextNotification, __super__);\n    function OnNextNotification(value) {\n      this.value = value;\n      this.kind = 'N';\n    }\n\n    OnNextNotification.prototype._accept = function (onNext) {\n      return onNext(this.value);\n    };\n\n    OnNextNotification.prototype._acceptObserver = function (o) {\n      return o.onNext(this.value);\n    };\n\n    OnNextNotification.prototype.toString = function () {\n      return 'OnNext(' + this.value + ')';\n    };\n\n    return OnNextNotification;\n  }(Notification));\n\n  var OnErrorNotification = (function (__super__) {\n    inherits(OnErrorNotification, __super__);\n    function OnErrorNotification(error) {\n      this.error = error;\n      this.kind = 'E';\n    }\n\n    OnErrorNotification.prototype._accept = function (onNext, onError) {\n      return onError(this.error);\n    };\n\n    OnErrorNotification.prototype._acceptObserver = function (o) {\n      return o.onError(this.error);\n    };\n\n    OnErrorNotification.prototype.toString = function () {\n      return 'OnError(' + this.error + ')';\n    };\n\n    return OnErrorNotification;\n  }(Notification));\n\n  var OnCompletedNotification = (function (__super__) {\n    inherits(OnCompletedNotification, __super__);\n    function OnCompletedNotification() {\n      this.kind = 'C';\n    }\n\n    OnCompletedNotification.prototype._accept = function (onNext, onError, onCompleted) {\n      return onCompleted();\n    };\n\n    OnCompletedNotification.prototype._acceptObserver = function (o) {\n      return o.onCompleted();\n    };\n\n    OnCompletedNotification.prototype.toString = function () {\n      return 'OnCompleted()';\n    };\n\n    return OnCompletedNotification;\n  }(Notification));\n\n  /**\n   * Creates an object that represents an OnNext notification to an observer.\n   * @param {Any} value The value contained in the notification.\n   * @returns {Notification} The OnNext notification containing the value.\n   */\n  var notificationCreateOnNext = Notification.createOnNext = function (value) {\n    return new OnNextNotification(value);\n  };\n\n  /**\n   * Creates an object that represents an OnError notification to an observer.\n   * @param {Any} error The exception contained in the notification.\n   * @returns {Notification} The OnError notification containing the exception.\n   */\n  var notificationCreateOnError = Notification.createOnError = function (error) {\n    return new OnErrorNotification(error);\n  };\n\n  /**\n   * Creates an object that represents an OnCompleted notification to an observer.\n   * @returns {Notification} The OnCompleted notification.\n   */\n  var notificationCreateOnCompleted = Notification.createOnCompleted = function () {\n    return new OnCompletedNotification();\n  };\n"
  },
  {
    "path": "src/core/observable.js",
    "content": "  var observableProto;\n\n  /**\n   * Represents a push-style collection.\n   */\n  var Observable = Rx.Observable = (function () {\n\n    function makeSubscribe(self, subscribe) {\n      return function (o) {\n        var oldOnError = o.onError;\n        o.onError = function (e) {\n          makeStackTraceLong(e, self);\n          oldOnError.call(o, e);\n        };\n\n        return subscribe.call(self, o);\n      };\n    }\n\n    function Observable() {\n      if (Rx.config.longStackSupport && hasStacks) {\n        var oldSubscribe = this._subscribe;\n        var e = tryCatch(thrower)(new Error()).e;\n        this.stack = e.stack.substring(e.stack.indexOf('\\n') + 1);\n        this._subscribe = makeSubscribe(this, oldSubscribe);\n      }\n    }\n\n    observableProto = Observable.prototype;\n\n    /**\n    * Determines whether the given object is an Observable\n    * @param {Any} An object to determine whether it is an Observable\n    * @returns {Boolean} true if an Observable, else false.\n    */\n    Observable.isObservable = function (o) {\n      return o && isFunction(o.subscribe);\n    };\n\n    /**\n     *  Subscribes an o to the observable sequence.\n     *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n     *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n     *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n     *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribe = observableProto.forEach = function (oOrOnNext, onError, onCompleted) {\n      return this._subscribe(typeof oOrOnNext === 'object' ?\n        oOrOnNext :\n        observerCreate(oOrOnNext, onError, onCompleted));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onNext The function to invoke on each element in the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnNext = function (onNext, thisArg) {\n      return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n    };\n\n    /**\n     * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n     * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnError = function (onError, thisArg) {\n      return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnCompleted = function (onCompleted, thisArg) {\n      return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n    };\n\n    return Observable;\n  })();\n"
  },
  {
    "path": "src/core/observeonobserver.js",
    "content": "  var ObserveOnObserver = (function (__super__) {\n    inherits(ObserveOnObserver, __super__);\n\n    function ObserveOnObserver(scheduler, observer, cancel) {\n      __super__.call(this, scheduler, observer);\n      this._cancel = cancel;\n    }\n\n    ObserveOnObserver.prototype.next = function (value) {\n      __super__.prototype.next.call(this, value);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.error = function (e) {\n      __super__.prototype.error.call(this, e);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.completed = function () {\n      __super__.prototype.completed.call(this);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this._cancel && this._cancel.dispose();\n      this._cancel = null;\n    };\n\n    return ObserveOnObserver;\n  })(ScheduledObserver);\n"
  },
  {
    "path": "src/core/observer-extras.js",
    "content": "  /**\n   *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n   *  If a violation is detected, an Error is thrown from the offending observer method call.\n   *\n   * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n   */\n  Observer.prototype.checked = function () { return new CheckedObserver(this); };\n\n  /**\n   * Schedules the invocation of observer methods on the given scheduler.\n   * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n   * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n   */\n  Observer.notifyOn = function (scheduler) {\n    return new ObserveOnObserver(scheduler, this);\n  };\n\n  /**\n  *  Creates an observer from a notification callback.\n  * @param {Function} handler Action that handles a notification.\n  * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n  */\n  Observer.fromNotifier = function (handler, thisArg) {\n    var handlerFunc = bindCallback(handler, thisArg, 1);\n    return new AnonymousObserver(function (x) {\n      return handlerFunc(notificationCreateOnNext(x));\n    }, function (e) {\n      return handlerFunc(notificationCreateOnError(e));\n    }, function () {\n      return handlerFunc(notificationCreateOnCompleted());\n    });\n  };\n\n  /**\n  *  Creates a notification callback from an observer.\n  * @returns The action that forwards its input notification to the underlying observer.\n  */\n  Observer.prototype.toNotifier = function () {\n    var observer = this;\n    return function (n) { return n.accept(observer); };\n  };\n\n  /**\n  *  Hides the identity of an observer.\n  * @returns An observer that hides the identity of the specified observer.\n  */\n  Observer.prototype.asObserver = function () {\n    var source = this;\n    return new AnonymousObserver(\n      function (x) { source.onNext(x); },\n      function (e) { source.onError(e); },\n      function () { source.onCompleted(); }\n    );\n  };\n"
  },
  {
    "path": "src/core/observer-lite.js",
    "content": "  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n"
  },
  {
    "path": "src/core/observer.js",
    "content": "  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates a notification callback from an observer.\n   * @returns The action that forwards its input notification to the underlying observer.\n   */\n  Observer.prototype.toNotifier = function () {\n    var observer = this;\n    return function (n) { return n.accept(observer); };\n  };\n\n  /**\n   *  Hides the identity of an observer.\n   * @returns An observer that hides the identity of the specified observer.\n   */\n  Observer.prototype.asObserver = function () {\n    var self = this;\n    return new AnonymousObserver(\n      function (x) { self.onNext(x); },\n      function (err) { self.onError(err); },\n      function () { self.onCompleted(); });\n  };\n\n  /**\n   *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n   *  If a violation is detected, an Error is thrown from the offending observer method call.\n   * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n   */\n  Observer.prototype.checked = function () { return new CheckedObserver(this); };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n\n  /**\n   *  Creates an observer from a notification callback.\n   * @param {Function} handler Action that handles a notification.\n   * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n   */\n  Observer.fromNotifier = function (handler, thisArg) {\n    var cb = bindCallback(handler, thisArg, 1);\n    return new AnonymousObserver(function (x) {\n      return cb(notificationCreateOnNext(x));\n    }, function (e) {\n      return cb(notificationCreateOnError(e));\n    }, function () {\n      return cb(notificationCreateOnCompleted());\n    });\n  };\n\n  /**\n   * Schedules the invocation of observer methods on the given scheduler.\n   * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n   * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n   */\n  Observer.prototype.notifyOn = function (scheduler) {\n    return new ObserveOnObserver(scheduler, this);\n  };\n\n  Observer.prototype.makeSafe = function(disposable) {\n    return new AnonymousSafeObserver(this._onNext, this._onError, this._onCompleted, disposable);\n  };\n"
  },
  {
    "path": "src/core/perf/observablebase.js",
    "content": "  var ObservableBase = Rx.ObservableBase = (function (__super__) {\n    inherits(ObservableBase, __super__);\n\n    function fixSubscriber(subscriber) {\n      return subscriber && isFunction(subscriber.dispose) ? subscriber :\n        isFunction(subscriber) ? disposableCreate(subscriber) : disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      var sub = tryCatch(self.subscribeCore).call(self, ado);\n      if (sub === errorObj && !ado.fail(errorObj.e)) { thrower(errorObj.e); }\n      ado.setDisposable(fixSubscriber(sub));\n    }\n\n    function ObservableBase() {\n      __super__.call(this);\n    }\n\n    ObservableBase.prototype._subscribe = function (o) {\n      var ado = new AutoDetachObserver(o), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.schedule(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n      return ado;\n    };\n\n    ObservableBase.prototype.subscribeCore = notImplemented;\n\n    return ObservableBase;\n  }(Observable));\n"
  },
  {
    "path": "src/core/perf/operators/combinelatest.js",
    "content": "  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var CombineLatestObservable = (function(__super__) {\n    inherits(CombineLatestObservable, __super__);\n    function CombineLatestObservable(params, cb) {\n      this._params = params;\n      this._cb = cb;\n      __super__.call(this);\n    }\n\n    CombineLatestObservable.prototype.subscribeCore = function(observer) {\n      var len = this._params.length,\n          subscriptions = new Array(len);\n\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        isDone: arrayInitialize(len, falseFactory),\n        values: new Array(len)\n      };\n\n      for (var i = 0; i < len; i++) {\n        var source = this._params[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new CombineLatestObserver(observer, i, this._cb, state)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return CombineLatestObservable;\n  }(ObservableBase));\n\n  var CombineLatestObserver = (function (__super__) {\n    inherits(CombineLatestObserver, __super__);\n    function CombineLatestObserver(o, i, cb, state) {\n      this._o = o;\n      this._i = i;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    CombineLatestObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      if (this._state.hasValueAll || (this._state.hasValueAll = this._state.hasValue.every(identity))) {\n        var res = tryCatch(this._cb).apply(null, this._state.values);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._state.isDone.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    CombineLatestObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    CombineLatestObserver.prototype.completed = function () {\n      this._state.isDone[this._i] = true;\n      this._state.isDone.every(identity) && this._o.onCompleted();\n    };\n\n    return CombineLatestObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n  *\n  * @example\n  * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n  * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n  * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n  */\n  var combineLatest = Observable.combineLatest = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n    return new CombineLatestObservable(args, resultSelector);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/concat.js",
    "content": "  var ConcatObserver = (function(__super__) {\n    inherits(ConcatObserver, __super__);\n    function ConcatObserver(s, fn) {\n      this._s = s;\n      this._fn = fn;\n      __super__.call(this);\n    }\n\n    ConcatObserver.prototype.next = function (x) { this._s.o.onNext(x); };\n    ConcatObserver.prototype.error = function (e) { this._s.o.onError(e); };\n    ConcatObserver.prototype.completed = function () { this._s.i++; this._fn(this._s); };\n\n    return ConcatObserver;\n  }(AbstractObserver));\n\n  var ConcatObservable = (function(__super__) {\n    inherits(ConcatObservable, __super__);\n    function ConcatObservable(sources) {\n      this._sources = sources;\n      __super__.call(this);\n    }\n\n    function scheduleRecursive (state, recurse) {\n      if (state.disposable.isDisposed) { return; }\n      if (state.i === state.sources.length) { return state.o.onCompleted(); }\n\n      // Check if promise\n      var currentValue = state.sources[state.i];\n      isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n      var d = new SingleAssignmentDisposable();\n      state.subscription.setDisposable(d);\n      d.setDisposable(currentValue.subscribe(new ConcatObserver(state, recurse)));\n    }\n\n    ConcatObservable.prototype.subscribeCore = function(o) {\n      var subscription = new SerialDisposable();\n      var disposable = disposableCreate(noop);\n      var state = {\n        o: o,\n        i: 0,\n        subscription: subscription,\n        disposable: disposable,\n        sources: this._sources\n      };\n\n      var cancelable = immediateScheduler.scheduleRecursive(state, scheduleRecursive);\n      return new NAryDisposable([subscription, disposable, cancelable]);\n    };\n\n    return ConcatObservable;\n  }(ObservableBase));\n\n  /**\n   * Concatenates all the observable sequences.\n   * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  var observableConcat = Observable.concat = function () {\n    var args;\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      args = new Array(arguments.length);\n      for(var i = 0, len = arguments.length; i < len; i++) { args[i] = arguments[i]; }\n    }\n    return new ConcatObservable(args);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/concatmap.js",
    "content": "observableProto.flatMapConcat = observableProto.concatMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).merge(1);\n};"
  },
  {
    "path": "src/core/perf/operators/distinctuntilchanged.js",
    "content": "  var DistinctUntilChangedObservable = (function(__super__) {\n    inherits(DistinctUntilChangedObservable, __super__);\n    function DistinctUntilChangedObservable(source, keyFn, comparer) {\n      this.source = source;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new DistinctUntilChangedObserver(o, this.keyFn, this.comparer));\n    };\n\n    return DistinctUntilChangedObservable;\n  }(ObservableBase));\n\n  var DistinctUntilChangedObserver = (function(__super__) {\n    inherits(DistinctUntilChangedObserver, __super__);\n    function DistinctUntilChangedObserver(o, keyFn, comparer) {\n      this.o = o;\n      this.keyFn = keyFn;\n      this.comparer = comparer;\n      this.hasCurrentKey = false;\n      this.currentKey = null;\n      __super__.call(this);\n    }\n\n    DistinctUntilChangedObserver.prototype.next = function (x) {\n      var key = x, comparerEquals;\n      if (isFunction(this.keyFn)) {\n        key = tryCatch(this.keyFn)(x);\n        if (key === errorObj) { return this.o.onError(key.e); }\n      }\n      if (this.hasCurrentKey) {\n        comparerEquals = tryCatch(this.comparer)(this.currentKey, key);\n        if (comparerEquals === errorObj) { return this.o.onError(comparerEquals.e); }\n      }\n      if (!this.hasCurrentKey || !comparerEquals) {\n        this.hasCurrentKey = true;\n        this.currentKey = key;\n        this.o.onNext(x);\n      }\n    };\n    DistinctUntilChangedObserver.prototype.error = function(e) {\n      this.o.onError(e);\n    };\n    DistinctUntilChangedObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return DistinctUntilChangedObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Returns an observable sequence that contains only distinct contiguous elements according to the keyFn and the comparer.\n  * @param {Function} [keyFn] A function to compute the comparison key for each element. If not provided, it projects the value.\n  * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n  * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n  */\n  observableProto.distinctUntilChanged = function (keyFn, comparer) {\n    comparer || (comparer = defaultComparer);\n    return new DistinctUntilChangedObservable(this, keyFn, comparer);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/empty.js",
    "content": "  var EmptyObservable = (function(__super__) {\n    inherits(EmptyObservable, __super__);\n    function EmptyObservable(scheduler) {\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    EmptyObservable.prototype.subscribeCore = function (observer) {\n      var sink = new EmptySink(observer, this.scheduler);\n      return sink.run();\n    };\n\n    function EmptySink(observer, scheduler) {\n      this.observer = observer;\n      this.scheduler = scheduler;\n    }\n\n    function scheduleItem(s, state) {\n      state.onCompleted();\n      return disposableEmpty;\n    }\n\n    EmptySink.prototype.run = function () {\n      var state = this.observer;\n      return this.scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this.scheduler.schedule(state, scheduleItem);\n    };\n\n    return EmptyObservable;\n  }(ObservableBase));\n\n  var EMPTY_OBSERVABLE = new EmptyObservable(immediateScheduler);\n\n  /**\n   *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n   *\n   * @example\n   *  var res = Rx.Observable.empty();\n   *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n   * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n   * @returns {Observable} An observable sequence with no elements.\n   */\n  var observableEmpty = Observable.empty = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return scheduler === immediateScheduler ? EMPTY_OBSERVABLE : new EmptyObservable(scheduler);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/filter.js",
    "content": "  var FilterObservable = (function (__super__) {\n    inherits(FilterObservable, __super__);\n\n    function FilterObservable(source, predicate, thisArg) {\n      this.source = source;\n      this.predicate = bindCallback(predicate, thisArg, 3);\n      __super__.call(this);\n    }\n\n    FilterObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.predicate, this));\n    };\n\n    function innerPredicate(predicate, self) {\n      return function(x, i, o) { return self.predicate(x, i, o) && predicate.call(this, x, i, o); }\n    }\n\n    FilterObservable.prototype.internalFilter = function(predicate, thisArg) {\n      return new FilterObservable(this.source, innerPredicate(predicate, this), thisArg);\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, predicate, source) {\n      this.o = o;\n      this.predicate = predicate;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var shouldYield = tryCatch(this.predicate)(x, this.i++, this.source);\n      if (shouldYield === errorObj) {\n        return this.o.onError(shouldYield.e);\n      }\n      shouldYield && this.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return FilterObservable;\n\n  }(ObservableBase));\n\n  /**\n  *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n  * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n  */\n  observableProto.filter = observableProto.where = function (predicate, thisArg) {\n    return this instanceof FilterObservable ? this.internalFilter(predicate, thisArg) :\n      new FilterObservable(this, predicate, thisArg);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/finally.js",
    "content": "  var FinallyObservable = (function (__super__) {\n    inherits(FinallyObservable, __super__);\n    function FinallyObservable(source, fn, thisArg) {\n      this.source = source;\n      this._fn = bindCallback(fn, thisArg, 0);\n      __super__.call(this);\n    }\n\n    FinallyObservable.prototype.subscribeCore = function (o) {\n      var d = tryCatch(this.source.subscribe).call(this.source, o);\n      if (d === errorObj) {\n        this._fn();\n        thrower(d.e);\n      }\n\n      return new FinallyDisposable(d, this._fn);\n    };\n\n    function FinallyDisposable(s, fn) {\n      this.isDisposed = false;\n      this._s = s;\n      this._fn = fn;\n    }\n    FinallyDisposable.prototype.dispose = function () {\n      if (!this.isDisposed) {\n        var res = tryCatch(this._s.dispose).call(this._s);\n        this._fn();\n        res === errorObj && thrower(res.e);\n      }\n    };\n\n    return FinallyObservable;\n\n  }(ObservableBase));\n\n  /**\n   *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n   * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n   * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n   */\n  observableProto['finally'] = function (action, thisArg) {\n    return new FinallyObservable(this, action, thisArg);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/flatmap.js",
    "content": "observableProto.flatMap = observableProto.selectMany = observableProto.mergeMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).mergeAll();\n};\n"
  },
  {
    "path": "src/core/perf/operators/flatmapbase.js",
    "content": "var FlatMapObservable = Rx.FlatMapObservable = (function(__super__) {\n\n    inherits(FlatMapObservable, __super__);\n\n    function FlatMapObservable(source, selector, resultSelector, thisArg) {\n      this.resultSelector = isFunction(resultSelector) ? resultSelector : null;\n      this.selector = bindCallback(isFunction(selector) ? selector : function() { return selector; }, thisArg, 3);\n      this.source = source;\n      __super__.call(this);\n    }\n\n    FlatMapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this.resultSelector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(observer, selector, resultSelector, source) {\n      this.i = 0;\n      this.selector = selector;\n      this.resultSelector = resultSelector;\n      this.source = source;\n      this.o = observer;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype._wrapResult = function(result, x, i) {\n      return this.resultSelector ?\n        result.map(function(y, i2) { return this.resultSelector(x, y, i, i2); }, this) :\n        result;\n    };\n\n    InnerObserver.prototype.next = function(x) {\n      var i = this.i++;\n      var result = tryCatch(this.selector)(x, i, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = Observable.from(result));\n      this.o.onNext(this._wrapResult(result, x, i));\n    };\n\n    InnerObserver.prototype.error = function(e) { this.o.onError(e); };\n\n    InnerObserver.prototype.completed = function() { this.o.onCompleted(); };\n\n    return FlatMapObservable;\n\n}(ObservableBase));\n"
  },
  {
    "path": "src/core/perf/operators/flatmapfirst.js",
    "content": "observableProto.flatMapFirst = observableProto.exhaustMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).switchFirst();\n};\n"
  },
  {
    "path": "src/core/perf/operators/flatmaplatest.js",
    "content": "observableProto.flatMapLatest = observableProto.switchMap = function(selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).switchLatest();\n};\n"
  },
  {
    "path": "src/core/perf/operators/flatmapwithmaxconcurrent.js",
    "content": "observableProto.flatMapWithMaxConcurrent = observableProto.flatMapMaxConcurrent = function(limit, selector, resultSelector, thisArg) {\n    return new FlatMapObservable(this, selector, resultSelector, thisArg).merge(limit);\n};\n"
  },
  {
    "path": "src/core/perf/operators/from.js",
    "content": "  var FromObservable = (function(__super__) {\n    inherits(FromObservable, __super__);\n    function FromObservable(iterable, fn, scheduler) {\n      this._iterable = iterable;\n      this._fn = fn;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function createScheduleMethod(o, it, fn) {\n      return function loopRecursive(i, recurse) {\n        var next = tryCatch(it.next).call(it);\n        if (next === errorObj) { return o.onError(next.e); }\n        if (next.done) { return o.onCompleted(); }\n\n        var result = next.value;\n\n        if (isFunction(fn)) {\n          result = tryCatch(fn)(result, i);\n          if (result === errorObj) { return o.onError(result.e); }\n        }\n\n        o.onNext(result);\n        recurse(i + 1);\n      };\n    }\n\n    FromObservable.prototype.subscribeCore = function (o) {\n      var list = Object(this._iterable),\n          it = getIterable(list);\n\n      return this._scheduler.scheduleRecursive(0, createScheduleMethod(o, it, this._fn));\n    };\n\n    return FromObservable;\n  }(ObservableBase));\n\n  var maxSafeInteger = Math.pow(2, 53) - 1;\n\n  function StringIterable(s) {\n    this._s = s;\n  }\n\n  StringIterable.prototype[$iterator$] = function () {\n    return new StringIterator(this._s);\n  };\n\n  function StringIterator(s) {\n    this._s = s;\n    this._l = s.length;\n    this._i = 0;\n  }\n\n  StringIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  StringIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._s.charAt(this._i++) } : doneEnumerator;\n  };\n\n  function ArrayIterable(a) {\n    this._a = a;\n  }\n\n  ArrayIterable.prototype[$iterator$] = function () {\n    return new ArrayIterator(this._a);\n  };\n\n  function ArrayIterator(a) {\n    this._a = a;\n    this._l = toLength(a);\n    this._i = 0;\n  }\n\n  ArrayIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  ArrayIterator.prototype.next = function () {\n    return this._i < this._l ? { done: false, value: this._a[this._i++] } : doneEnumerator;\n  };\n\n  function numberIsFinite(value) {\n    return typeof value === 'number' && root.isFinite(value);\n  }\n\n  function isNan(n) {\n    return n !== n;\n  }\n\n  function getIterable(o) {\n    var i = o[$iterator$], it;\n    if (!i && typeof o === 'string') {\n      it = new StringIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i && o.length !== undefined) {\n      it = new ArrayIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i) { throw new TypeError('Object is not iterable'); }\n    return o[$iterator$]();\n  }\n\n  function sign(value) {\n    var number = +value;\n    if (number === 0) { return number; }\n    if (isNaN(number)) { return number; }\n    return number < 0 ? -1 : 1;\n  }\n\n  function toLength(o) {\n    var len = +o.length;\n    if (isNaN(len)) { return 0; }\n    if (len === 0 || !numberIsFinite(len)) { return len; }\n    len = sign(len) * Math.floor(Math.abs(len));\n    if (len <= 0) { return 0; }\n    if (len > maxSafeInteger) { return maxSafeInteger; }\n    return len;\n  }\n\n  /**\n  * This method creates a new Observable sequence from an array-like or iterable object.\n  * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n  * @param {Function} [mapFn] Map function to call on every element of the array.\n  * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n  * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n  */\n  var observableFrom = Observable.from = function (iterable, mapFn, thisArg, scheduler) {\n    if (iterable == null) {\n      throw new Error('iterable cannot be null.')\n    }\n    if (mapFn && !isFunction(mapFn)) {\n      throw new Error('mapFn when provided must be a function');\n    }\n    if (mapFn) {\n      var mapper = bindCallback(mapFn, thisArg, 2);\n    }\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromObservable(iterable, mapper, scheduler);\n  }\n"
  },
  {
    "path": "src/core/perf/operators/fromarray.js",
    "content": "  /**\n  *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n  * @deprecated use Observable.from or Observable.of\n  * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n  */\n  var observableFromArray = Observable.fromArray = function (array, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler)\n  };\n"
  },
  {
    "path": "src/core/perf/operators/fromarrayobservable.js",
    "content": "  var FromArrayObservable = (function(__super__) {\n    inherits(FromArrayObservable, __super__);\n    function FromArrayObservable(args, scheduler) {\n      this._args = args;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, args) {\n      var len = args.length;\n      return function loopRecursive (i, recurse) {\n        if (i < len) {\n          o.onNext(args[i]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    FromArrayObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._args));\n    };\n\n    return FromArrayObservable;\n  }(ObservableBase));\n"
  },
  {
    "path": "src/core/perf/operators/fromcallback.js",
    "content": "function createCbObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createCbHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createCbHandler(o, ctx, selector) {\n  return function handler () {\n    var len = arguments.length, results = new Array(len);\n    for(var i = 0; i < len; i++) { results[i] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a callback function to an observable sequence.\n *\n * @param {Function} fn Function with a callback as the last parameter to convert to an Observable sequence.\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n */\nObservable.fromCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n\n    var len = arguments.length, args = new Array(len)\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createCbObservable(fn, ctx, selector, args);\n  };\n};\n"
  },
  {
    "path": "src/core/perf/operators/fromnodecallback.js",
    "content": "function createNodeObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createNodeHandler(o, ctx, selector));\n  fn.apply(ctx, args);\n\n  return o.asObservable();\n}\n\nfunction createNodeHandler(o, ctx, selector) {\n  return function handler () {\n    var err = arguments[0];\n    if (err) { return o.onError(err); }\n\n    var len = arguments.length, results = [];\n    for(var i = 1; i < len; i++) { results[i - 1] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      var results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\n/**\n * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n * @param {Function} fn The function to call\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n */\nObservable.fromNodeCallback = function (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this); \n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createNodeObservable(fn, ctx, selector, args);\n  };\n};\n"
  },
  {
    "path": "src/core/perf/operators/frompromise.js",
    "content": "  var FromPromiseObservable = (function(__super__) {\n    inherits(FromPromiseObservable, __super__);\n    function FromPromiseObservable(p, s) {\n      this._p = p;\n      this._s = s;\n      __super__.call(this);\n    }\n\n    function scheduleNext(s, state) {\n      var o = state[0], data = state[1];\n      o.onNext(data);\n      o.onCompleted();\n    }\n\n    function scheduleError(s, state) {\n      var o = state[0], err = state[1];\n      o.onError(err);\n    }\n\n    FromPromiseObservable.prototype.subscribeCore = function(o) {\n      var sad = new SingleAssignmentDisposable(), self = this, p = this._p;\n\n      if (isFunction(p)) {\n        p = tryCatch(p)();\n        if (p === errorObj) {\n          o.onError(p.e);\n          return sad;\n        }\n      }\n\n      p\n        .then(function (data) {\n          sad.setDisposable(self._s.schedule([o, data], scheduleNext));\n        }, function (err) {\n          sad.setDisposable(self._s.schedule([o, err], scheduleError));\n        });\n\n      return sad;\n    };\n\n    return FromPromiseObservable;\n  }(ObservableBase));\n\n  /**\n  * Converts a Promise to an Observable sequence\n  * @param {Promise} An ES6 Compliant promise.\n  * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n  */\n  var observableFromPromise = Observable.fromPromise = function (promise, scheduler) {\n    scheduler || (scheduler = defaultScheduler);\n    return new FromPromiseObservable(promise, scheduler);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/ignoreelements.js",
    "content": "  var IgnoreElementsObservable = (function(__super__) {\n    inherits(IgnoreElementsObservable, __super__);\n\n    function IgnoreElementsObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    IgnoreElementsObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    function InnerObserver(o) {\n      this.o = o;\n      this.isStopped = false;\n    }\n    InnerObserver.prototype.onNext = noop;\n    InnerObserver.prototype.onError = function (err) {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onError(err);\n      }\n    };\n    InnerObserver.prototype.onCompleted = function () {\n      if(!this.isStopped) {\n        this.isStopped = true;\n        this.o.onCompleted();\n      }\n    };\n    InnerObserver.prototype.dispose = function() { this.isStopped = true; };\n    InnerObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.observer.onError(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return IgnoreElementsObservable;\n  }(ObservableBase));\n\n  /**\n   *  Ignores all elements in an observable sequence leaving only the termination messages.\n   * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n   */\n  observableProto.ignoreElements = function () {\n    return new IgnoreElementsObservable(this);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/just.js",
    "content": "  var JustObservable = (function(__super__) {\n    inherits(JustObservable, __super__);\n    function JustObservable(value, scheduler) {\n      this._value = value;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    JustObservable.prototype.subscribeCore = function (o) {\n      var state = [this._value, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var value = state[0], observer = state[1];\n      observer.onNext(value);\n      observer.onCompleted();\n      return disposableEmpty;\n    }\n\n    return JustObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n   *  There is an alias called 'just' or browsers <IE9.\n   * @param {Mixed} value Single element in the resulting observable sequence.\n   * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence containing the single specified element.\n   */\n  var observableReturn = Observable['return'] = Observable.just = function (value, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new JustObservable(value, scheduler);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/map.js",
    "content": "  var MapObservable = (function (__super__) {\n    inherits(MapObservable, __super__);\n\n    function MapObservable(source, selector, thisArg) {\n      this.source = source;\n      this.selector = bindCallback(selector, thisArg, 3);\n      __super__.call(this);\n    }\n\n    function innerMap(selector, self) {\n      return function (x, i, o) { return selector.call(this, self.selector(x, i, o), i, o); };\n    }\n\n    MapObservable.prototype.internalMap = function (selector, thisArg) {\n      return new MapObservable(this.source, innerMap(selector, this), thisArg);\n    };\n\n    MapObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new InnerObserver(o, this.selector, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, selector, source) {\n      this.o = o;\n      this.selector = selector;\n      this.source = source;\n      this.i = 0;\n      AbstractObserver.call(this);\n    }\n\n    InnerObserver.prototype.next = function(x) {\n      var result = tryCatch(this.selector)(x, this.i++, this.source);\n      if (result === errorObj) { return this.o.onError(result.e); }\n      this.o.onNext(result);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      this.o.onCompleted();\n    };\n\n    return MapObservable;\n\n  }(ObservableBase));\n\n  /**\n  * Projects each element of an observable sequence into a new form by incorporating the element's index.\n  * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n  */\n  observableProto.map = observableProto.select = function (selector, thisArg) {\n    var selectorFn = typeof selector === 'function' ? selector : function () { return selector; };\n    return this instanceof MapObservable ?\n      this.internalMap(selectorFn, thisArg) :\n      new MapObservable(this, selectorFn, thisArg);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/mergeall.js",
    "content": "  var MergeAllObservable = (function (__super__) {\n    inherits(MergeAllObservable, __super__);\n\n    function MergeAllObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    MergeAllObservable.prototype.subscribeCore = function (o) {\n      var g = new CompositeDisposable(), m = new SingleAssignmentDisposable();\n      g.add(m);\n      m.setDisposable(this.source.subscribe(new MergeAllObserver(o, g)));\n      return g;\n    };\n\n    return MergeAllObservable;\n  }(ObservableBase));\n\n  var MergeAllObserver = (function (__super__) {\n    function MergeAllObserver(o, g) {\n      this.o = o;\n      this.g = g;\n      this.done = false;\n      __super__.call(this);\n    }\n\n    inherits(MergeAllObserver, __super__);\n\n    MergeAllObserver.prototype.next = function(innerSource) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      sad.setDisposable(innerSource.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeAllObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    MergeAllObserver.prototype.completed = function () {\n      this.done = true;\n      this.g.length === 1 && this.o.onCompleted();\n    };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) {\n      this.parent.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function (e) {\n      this.parent.o.onError(e);\n    };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      this.parent.done && this.parent.g.length === 1 && this.parent.o.onCompleted();\n    };\n\n    return MergeAllObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.mergeAll = function () {\n    return new MergeAllObservable(this);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/mergeconcat.js",
    "content": "  var MergeObservable = (function (__super__) {\n    inherits(MergeObservable, __super__);\n\n    function MergeObservable(source, maxConcurrent) {\n      this.source = source;\n      this.maxConcurrent = maxConcurrent;\n      __super__.call(this);\n    }\n\n    MergeObservable.prototype.subscribeCore = function(observer) {\n      var g = new CompositeDisposable();\n      g.add(this.source.subscribe(new MergeObserver(observer, this.maxConcurrent, g)));\n      return g;\n    };\n\n    return MergeObservable;\n\n  }(ObservableBase));\n\n  var MergeObserver = (function (__super__) {\n    function MergeObserver(o, max, g) {\n      this.o = o;\n      this.max = max;\n      this.g = g;\n      this.done = false;\n      this.q = [];\n      this.activeCount = 0;\n      __super__.call(this);\n    }\n\n    inherits(MergeObserver, __super__);\n\n    MergeObserver.prototype.handleSubscribe = function (xs) {\n      var sad = new SingleAssignmentDisposable();\n      this.g.add(sad);\n      isPromise(xs) && (xs = observableFromPromise(xs));\n      sad.setDisposable(xs.subscribe(new InnerObserver(this, sad)));\n    };\n\n    MergeObserver.prototype.next = function (innerSource) {\n      if(this.activeCount < this.max) {\n        this.activeCount++;\n        this.handleSubscribe(innerSource);\n      } else {\n        this.q.push(innerSource);\n      }\n    };\n    MergeObserver.prototype.error = function (e) { this.o.onError(e); };\n    MergeObserver.prototype.completed = function () { this.done = true; this.activeCount === 0 && this.o.onCompleted(); };\n\n    function InnerObserver(parent, sad) {\n      this.parent = parent;\n      this.sad = sad;\n      __super__.call(this);\n    }\n\n    inherits(InnerObserver, __super__);\n\n    InnerObserver.prototype.next = function (x) { this.parent.o.onNext(x); };\n    InnerObserver.prototype.error = function (e) { this.parent.o.onError(e); };\n    InnerObserver.prototype.completed = function () {\n      this.parent.g.remove(this.sad);\n      if (this.parent.q.length > 0) {\n        this.parent.handleSubscribe(this.parent.q.shift());\n      } else {\n        this.parent.activeCount--;\n        this.parent.done && this.parent.activeCount === 0 && this.parent.o.onCompleted();\n      }\n    };\n\n    return MergeObserver;\n  }(AbstractObserver));\n\n  /**\n  * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n  * Or merges two observable sequences into a single observable sequence.\n  * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n  * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n  */\n  observableProto.merge = function (maxConcurrentOrOther) {\n    return typeof maxConcurrentOrOther !== 'number' ?\n      observableMerge(this, maxConcurrentOrOther) :\n      new MergeObservable(this, maxConcurrentOrOther);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/never.js",
    "content": "  var NeverObservable = (function(__super__) {\n    inherits(NeverObservable, __super__);\n    function NeverObservable() {\n      __super__.call(this);\n    }\n\n    NeverObservable.prototype.subscribeCore = function (observer) {\n      return disposableEmpty;\n    };\n\n    return NeverObservable;\n  }(ObservableBase));\n\n  var NEVER_OBSERVABLE = new NeverObservable();\n\n  /**\n   * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n   * @returns {Observable} An observable sequence whose observers will never get called.\n   */\n  var observableNever = Observable.never = function () {\n    return NEVER_OBSERVABLE;\n  };\n"
  },
  {
    "path": "src/core/perf/operators/of.js",
    "content": "  function observableOf (scheduler, array) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new FromArrayObservable(array, scheduler);\n  }\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.of = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return new FromArrayObservable(args, currentThreadScheduler);\n  };\n\n  /**\n  *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n  * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n  */\n  Observable.ofWithScheduler = function (scheduler) {\n    var len = arguments.length, args = new Array(len - 1);\n    for(var i = 1; i < len; i++) { args[i - 1] = arguments[i]; }\n    return new FromArrayObservable(args, scheduler);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/pairs.js",
    "content": "  var PairsObservable = (function(__super__) {\n    inherits(PairsObservable, __super__);\n    function PairsObservable(o, scheduler) {\n      this._o = o;\n      this._keys = Object.keys(o);\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function scheduleMethod(o, obj, keys) {\n      return function loopRecursive(i, recurse) {\n        if (i < keys.length) {\n          var key = keys[i];\n          o.onNext([key, obj[key]]);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    PairsObservable.prototype.subscribeCore = function (o) {\n      return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._o, this._keys));\n    };\n\n    return PairsObservable;\n  }(ObservableBase));\n\n  /**\n   * Convert an object into an observable sequence of [key, value] pairs.\n   * @param {Object} obj The object to inspect.\n   * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n   * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n   */\n  Observable.pairs = function (obj, scheduler) {\n    scheduler || (scheduler = currentThreadScheduler);\n    return new PairsObservable(obj, scheduler);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/range.js",
    "content": "    var RangeObservable = (function(__super__) {\n    inherits(RangeObservable, __super__);\n    function RangeObservable(start, count, scheduler) {\n      this.start = start;\n      this.rangeCount = count;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    function loopRecursive(start, count, o) {\n      return function loop (i, recurse) {\n        if (i < count) {\n          o.onNext(start + i);\n          recurse(i + 1);\n        } else {\n          o.onCompleted();\n        }\n      };\n    }\n\n    RangeObservable.prototype.subscribeCore = function (o) {\n      return this.scheduler.scheduleRecursive(\n        0,\n        loopRecursive(this.start, this.rangeCount, o)\n      );\n    };\n\n    return RangeObservable;\n  }(ObservableBase));\n\n  /**\n  *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n  * @param {Number} start The value of the first integer in the sequence.\n  * @param {Number} count The number of sequential integers to generate.\n  * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n  * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n  */\n  Observable.range = function (start, count, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RangeObservable(start, count, scheduler);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/reduce.js",
    "content": "  var ReduceObservable = (function(__super__) {\n    inherits(ReduceObservable, __super__);\n    function ReduceObservable(source, accumulator, hasSeed, seed) {\n      this.source = source;\n      this.accumulator = accumulator;\n      this.hasSeed = hasSeed;\n      this.seed = seed;\n      __super__.call(this);\n    }\n\n    ReduceObservable.prototype.subscribeCore = function(observer) {\n      return this.source.subscribe(new ReduceObserver(observer,this));\n    };\n\n    return ReduceObservable;\n  }(ObservableBase));\n\n  var ReduceObserver = (function (__super__) {\n    inherits(ReduceObserver, __super__);\n    function ReduceObserver(o, parent) {\n      this._o = o;\n      this._p = parent;\n      this._fn = parent.accumulator;\n      this._hs = parent.hasSeed;\n      this._s = parent.seed;\n      this._ha = false;\n      this._a = null;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    ReduceObserver.prototype.next = function (x) {\n      !this._hv && (this._hv = true);\n      if (this._ha) {\n        this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n      } else {\n        this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n        this._ha = true;\n      }\n      if (this._a === errorObj) { return this._o.onError(this._a.e); }\n      this._i++;\n    };\n\n    ReduceObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ReduceObserver.prototype.completed = function () {\n      this._hv && this._o.onNext(this._a);\n      !this._hv && this._hs && this._o.onNext(this._s);\n      !this._hv && !this._hs && this._o.onError(new EmptyError());\n      this._o.onCompleted();\n    };\n\n    return ReduceObserver;\n  }(AbstractObserver));\n\n  /**\n  * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n  * For aggregation behavior with incremental intermediate results, see Observable.scan.\n  * @param {Function} accumulator An accumulator function to be invoked on each element.\n  * @param {Any} [seed] The initial accumulator value.\n  * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n  */\n  observableProto.reduce = function () {\n    var hasSeed = false, seed, accumulator = arguments[0];\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new ReduceObservable(this, accumulator, hasSeed, seed);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/repeat.js",
    "content": "  var RepeatObservable = (function(__super__) {\n    inherits(RepeatObservable, __super__);\n    function RepeatObservable(value, repeatCount, scheduler) {\n      this.value = value;\n      this.repeatCount = repeatCount == null ? -1 : repeatCount;\n      this.scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    RepeatObservable.prototype.subscribeCore = function (observer) {\n      var sink = new RepeatSink(observer, this);\n      return sink.run();\n    };\n\n    return RepeatObservable;\n  }(ObservableBase));\n\n  function RepeatSink(observer, parent) {\n    this.observer = observer;\n    this.parent = parent;\n  }\n\n  RepeatSink.prototype.run = function () {\n    var observer = this.observer, value = this.parent.value;\n    function loopRecursive(i, recurse) {\n      if (i === -1 || i > 0) {\n        observer.onNext(value);\n        i > 0 && i--;\n      }\n      if (i === 0) { return observer.onCompleted(); }\n      recurse(i);\n    }\n\n    return this.parent.scheduler.scheduleRecursive(this.parent.repeatCount, loopRecursive);\n  };\n\n  /**\n   *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n   * @param {Mixed} value Element to repeat.\n   * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n   * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n   */\n  Observable.repeat = function (value, repeatCount, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new RepeatObservable(value, repeatCount, scheduler);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/scan.js",
    "content": "  var ScanObservable = (function(__super__) {\n    inherits(ScanObservable, __super__);\n    function ScanObservable(source, accumulator, hasSeed, seed) {\n      this.source = source;\n      this.accumulator = accumulator;\n      this.hasSeed = hasSeed;\n      this.seed = seed;\n      __super__.call(this);\n    }\n\n    ScanObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new ScanObserver(o,this));\n    };\n\n    return ScanObservable;\n  }(ObservableBase));\n\n  var ScanObserver = (function (__super__) {\n    inherits(ScanObserver, __super__);\n    function ScanObserver(o, parent) {\n      this._o = o;\n      this._p = parent;\n      this._fn = parent.accumulator;\n      this._hs = parent.hasSeed;\n      this._s = parent.seed;\n      this._ha = false;\n      this._a = null;\n      this._hv = false;\n      this._i = 0;\n      __super__.call(this);\n    }\n\n    ScanObserver.prototype.next = function (x) {\n      !this._hv && (this._hv = true);\n      if (this._ha) {\n        this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n      } else {\n        this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n        this._ha = true;\n      }\n      if (this._a === errorObj) { return this._o.onError(this._a.e); }\n      this._o.onNext(this._a);\n      this._i++;\n    };\n\n    ScanObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ScanObserver.prototype.completed = function () {\n      !this._hv && this._hs && this._o.onNext(this._s);\n      this._o.onCompleted();\n    };\n\n    return ScanObserver;\n  }(AbstractObserver));\n\n  /**\n  *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n  *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n  * @param {Mixed} [seed] The initial accumulator value.\n  * @param {Function} accumulator An accumulator function to be invoked on each element.\n  * @returns {Observable} An observable sequence containing the accumulated values.\n  */\n  observableProto.scan = function () {\n    var hasSeed = false, seed, accumulator = arguments[0];\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new ScanObservable(this, accumulator, hasSeed, seed);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/skip.js",
    "content": "  var SkipObservable = (function(__super__) {\n    inherits(SkipObservable, __super__);\n    function SkipObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    SkipObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new SkipObserver(o, this._count));\n    };\n\n    function SkipObserver(o, c) {\n      this._o = o;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(SkipObserver, AbstractObserver);\n\n    SkipObserver.prototype.next = function (x) {\n      if (this._r <= 0) {\n        this._o.onNext(x);\n      } else {\n        this._r--;\n      }\n    };\n    SkipObserver.prototype.error = function(e) { this._o.onError(e); };\n    SkipObserver.prototype.completed = function() { this._o.onCompleted(); };\n\n    return SkipObservable;\n  }(ObservableBase));\n\n  /**\n   * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n   * @param {Number} count The number of elements to skip before returning the remaining elements.\n   * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n   */\n  observableProto.skip = function (count) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    return new SkipObservable(this, count);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/skipuntil.js",
    "content": "  var SkipUntilObservable = (function(__super__) {\n    inherits(SkipUntilObservable, __super__);\n\n    function SkipUntilObservable(source, other) {\n      this._s = source;\n      this._o = isPromise(other) ? observableFromPromise(other) : other;\n      this._open = false;\n      __super__.call(this);\n    }\n\n    SkipUntilObservable.prototype.subscribeCore = function(o) {\n      var leftSubscription = new SingleAssignmentDisposable();\n      leftSubscription.setDisposable(this._s.subscribe(new SkipUntilSourceObserver(o, this)));\n\n      isPromise(this._o) && (this._o = observableFromPromise(this._o));\n\n      var rightSubscription = new SingleAssignmentDisposable();\n      rightSubscription.setDisposable(this._o.subscribe(new SkipUntilOtherObserver(o, this, rightSubscription)));\n\n      return new BinaryDisposable(leftSubscription, rightSubscription);\n    };\n\n    return SkipUntilObservable;\n  }(ObservableBase));\n\n  var SkipUntilSourceObserver = (function(__super__) {\n    inherits(SkipUntilSourceObserver, __super__);\n    function SkipUntilSourceObserver(o, p) {\n      this._o = o;\n      this._p = p;\n      __super__.call(this);\n    }\n\n    SkipUntilSourceObserver.prototype.next = function (x) {\n      this._p._open && this._o.onNext(x);\n    };\n\n    SkipUntilSourceObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilSourceObserver.prototype.onCompleted = function () {\n      this._p._open && this._o.onCompleted();\n    };\n\n    return SkipUntilSourceObserver;\n  }(AbstractObserver));\n\n  var SkipUntilOtherObserver = (function(__super__) {\n    inherits(SkipUntilOtherObserver, __super__);\n    function SkipUntilOtherObserver(o, p, r) {\n      this._o = o;\n      this._p = p;\n      this._r = r;\n      __super__.call(this);\n    }\n\n    SkipUntilOtherObserver.prototype.next = function () {\n      this._p._open = true;\n      this._r.dispose();\n    };\n\n    SkipUntilOtherObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    SkipUntilOtherObserver.prototype.onCompleted = function () {\n      this._r.dispose();\n    };\n\n    return SkipUntilOtherObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n   * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n   */\n  observableProto.skipUntil = function (other) {\n    return new SkipUntilObservable(this, other);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/switch.js",
    "content": "  var SwitchObservable = (function(__super__) {\n    inherits(SwitchObservable, __super__);\n    function SwitchObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    SwitchObservable.prototype.subscribeCore = function (o) {\n      var inner = new SerialDisposable(), s = this.source.subscribe(new SwitchObserver(o, inner));\n      return new BinaryDisposable(s, inner);\n    };\n\n    inherits(SwitchObserver, AbstractObserver);\n    function SwitchObserver(o, inner) {\n      this.o = o;\n      this.inner = inner;\n      this.stopped = false;\n      this.latest = 0;\n      this.hasLatest = false;\n      AbstractObserver.call(this);\n    }\n\n    SwitchObserver.prototype.next = function (innerSource) {\n      var d = new SingleAssignmentDisposable(), id = ++this.latest;\n      this.hasLatest = true;\n      this.inner.setDisposable(d);\n      isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n      d.setDisposable(innerSource.subscribe(new InnerObserver(this, id)));\n    };\n\n    SwitchObserver.prototype.error = function (e) {\n      this.o.onError(e);\n    };\n\n    SwitchObserver.prototype.completed = function () {\n      this.stopped = true;\n      !this.hasLatest && this.o.onCompleted();\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(parent, id) {\n      this.parent = parent;\n      this.id = id;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function (x) {\n      this.parent.latest === this.id && this.parent.o.onNext(x);\n    };\n\n    InnerObserver.prototype.error = function (e) {\n      this.parent.latest === this.id && this.parent.o.onError(e);\n    };\n\n    InnerObserver.prototype.completed = function () {\n      if (this.parent.latest === this.id) {\n        this.parent.hasLatest = false;\n        this.parent.stopped && this.parent.o.onCompleted();\n      }\n    };\n\n    return SwitchObservable;\n  }(ObservableBase));\n\n  /**\n  * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n  * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n  */\n  observableProto['switch'] = observableProto.switchLatest = function () {\n    return new SwitchObservable(this);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/take.js",
    "content": "  var TakeObservable = (function(__super__) {\n    inherits(TakeObservable, __super__);\n    function TakeObservable(source, count) {\n      this.source = source;\n      this._count = count;\n      __super__.call(this);\n    }\n\n    TakeObservable.prototype.subscribeCore = function (o) {\n      return this.source.subscribe(new TakeObserver(o, this._count));\n    };\n\n    function TakeObserver(o, c) {\n      this._o = o;\n      this._c = c;\n      this._r = c;\n      AbstractObserver.call(this);\n    }\n\n    inherits(TakeObserver, AbstractObserver);\n\n    TakeObserver.prototype.next = function (x) {\n      if (this._r-- > 0) {\n        this._o.onNext(x);\n        this._r <= 0 && this._o.onCompleted();\n      }\n    };\n\n    TakeObserver.prototype.error = function (e) { this._o.onError(e); };\n    TakeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n    return TakeObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n   * @param {Number} count The number of elements to return.\n   * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n   * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n   */\n  observableProto.take = function (count, scheduler) {\n    if (count < 0) { throw new ArgumentOutOfRangeError(); }\n    if (count === 0) { return observableEmpty(scheduler); }\n    return new TakeObservable(this, count);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/takeuntil.js",
    "content": "  var TakeUntilObservable = (function(__super__) {\n    inherits(TakeUntilObservable, __super__);\n\n    function TakeUntilObservable(source, other) {\n      this.source = source;\n      this.other = isPromise(other) ? observableFromPromise(other) : other;\n      __super__.call(this);\n    }\n\n    TakeUntilObservable.prototype.subscribeCore = function(o) {\n      return new BinaryDisposable(\n        this.source.subscribe(o),\n        this.other.subscribe(new TakeUntilObserver(o))\n      );\n    };\n\n    return TakeUntilObservable;\n  }(ObservableBase));\n\n  var TakeUntilObserver = (function(__super__) {\n    inherits(TakeUntilObserver, __super__);\n    function TakeUntilObserver(o) {\n      this._o = o;\n      __super__.call(this);\n    }\n\n    TakeUntilObserver.prototype.next = function () {\n      this._o.onCompleted();\n    };\n\n    TakeUntilObserver.prototype.error = function (err) {\n      this._o.onError(err);\n    };\n\n    TakeUntilObserver.prototype.onCompleted = noop;\n\n    return TakeUntilObserver;\n  }(AbstractObserver));\n\n  /**\n   * Returns the values from the source observable sequence until the other observable sequence produces a value.\n   * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n   */\n  observableProto.takeUntil = function (other) {\n    return new TakeUntilObservable(this, other);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/tap.js",
    "content": "  var TapObservable = (function(__super__) {\n    inherits(TapObservable,__super__);\n    function TapObservable(source, observerOrOnNext, onError, onCompleted) {\n      this.source = source;\n      this._oN = observerOrOnNext;\n      this._oE = onError;\n      this._oC = onCompleted;\n      __super__.call(this);\n    }\n\n    TapObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o, this));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o, p) {\n      this.o = o;\n      this.t = !p._oN || isFunction(p._oN) ?\n        observerCreate(p._oN || noop, p._oE || noop, p._oC || noop) :\n        p._oN;\n      this.isStopped = false;\n      AbstractObserver.call(this);\n    }\n    InnerObserver.prototype.next = function(x) {\n      var res = tryCatch(this.t.onNext).call(this.t, x);\n      if (res === errorObj) { this.o.onError(res.e); }\n      this.o.onNext(x);\n    };\n    InnerObserver.prototype.error = function(err) {\n      var res = tryCatch(this.t.onError).call(this.t, err);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onError(err);\n    };\n    InnerObserver.prototype.completed = function() {\n      var res = tryCatch(this.t.onCompleted).call(this.t);\n      if (res === errorObj) { return this.o.onError(res.e); }\n      this.o.onCompleted();\n    };\n\n    return TapObservable;\n  }(ObservableBase));\n\n  /**\n  *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an o.\n  * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto['do'] = observableProto.tap = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) {\n    return new TapObservable(this, observerOrOnNext, onError, onCompleted);\n  };\n\n  /**\n  *  Invokes an action for each element in the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onNext Action to invoke for each element in the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnNext = observableProto.tapOnNext = function (onNext, thisArg) {\n    return this.tap(typeof thisArg !== 'undefined' ? function (x) { onNext.call(thisArg, x); } : onNext);\n  };\n\n  /**\n  *  Invokes an action upon exceptional termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnError = observableProto.tapOnError = function (onError, thisArg) {\n    return this.tap(noop, typeof thisArg !== 'undefined' ? function (e) { onError.call(thisArg, e); } : onError);\n  };\n\n  /**\n  *  Invokes an action upon graceful termination of the observable sequence.\n  *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n  * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} The source sequence with the side-effecting behavior applied.\n  */\n  observableProto.doOnCompleted = observableProto.tapOnCompleted = function (onCompleted, thisArg) {\n    return this.tap(noop, null, typeof thisArg !== 'undefined' ? function () { onCompleted.call(thisArg); } : onCompleted);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/throw.js",
    "content": "  var ThrowObservable = (function(__super__) {\n    inherits(ThrowObservable, __super__);\n    function ThrowObservable(error, scheduler) {\n      this._error = error;\n      this._scheduler = scheduler;\n      __super__.call(this);\n    }\n\n    ThrowObservable.prototype.subscribeCore = function (o) {\n      var state = [this._error, o];\n      return this._scheduler === immediateScheduler ?\n        scheduleItem(null, state) :\n        this._scheduler.schedule(state, scheduleItem);\n    };\n\n    function scheduleItem(s, state) {\n      var e = state[0], o = state[1];\n      o.onError(e);\n      return disposableEmpty;\n    }\n\n    return ThrowObservable;\n  }(ObservableBase));\n\n  /**\n   *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n   *  There is an alias to this method called 'throwError' for browsers <IE9.\n   * @param {Mixed} error An object used for the sequence's termination.\n   * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n   */\n  var observableThrow = Observable['throw'] = function (error, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new ThrowObservable(error, scheduler);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/toarray.js",
    "content": "  var ToArrayObservable = (function(__super__) {\n    inherits(ToArrayObservable, __super__);\n    function ToArrayObservable(source) {\n      this.source = source;\n      __super__.call(this);\n    }\n\n    ToArrayObservable.prototype.subscribeCore = function(o) {\n      return this.source.subscribe(new InnerObserver(o));\n    };\n\n    inherits(InnerObserver, AbstractObserver);\n    function InnerObserver(o) {\n      this.o = o;\n      this.a = [];\n      AbstractObserver.call(this);\n    }\n    \n    InnerObserver.prototype.next = function (x) { this.a.push(x); };\n    InnerObserver.prototype.error = function (e) { this.o.onError(e);  };\n    InnerObserver.prototype.completed = function () { this.o.onNext(this.a); this.o.onCompleted(); };\n\n    return ToArrayObservable;\n  }(ObservableBase));\n\n  /**\n  * Creates an array from an observable sequence.\n  * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n  */\n  observableProto.toArray = function () {\n    return new ToArrayObservable(this);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/withlatestfrom.js",
    "content": "  function falseFactory() { return false; }\n  function argumentsToArray() {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return args;\n  }\n\n  var WithLatestFromObservable = (function(__super__) {\n    inherits(WithLatestFromObservable, __super__);\n    function WithLatestFromObservable(source, sources, resultSelector) {\n      this._s = source;\n      this._ss = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    WithLatestFromObservable.prototype.subscribeCore = function (o) {\n      var len = this._ss.length;\n      var state = {\n        hasValue: arrayInitialize(len, falseFactory),\n        hasValueAll: false,\n        values: new Array(len)\n      };\n\n      var n = this._ss.length, subscriptions = new Array(n + 1);\n      for (var i = 0; i < n; i++) {\n        var other = this._ss[i], sad = new SingleAssignmentDisposable();\n        isPromise(other) && (other = observableFromPromise(other));\n        sad.setDisposable(other.subscribe(new WithLatestFromOtherObserver(o, i, state)));\n        subscriptions[i] = sad;\n      }\n\n      var outerSad = new SingleAssignmentDisposable();\n      outerSad.setDisposable(this._s.subscribe(new WithLatestFromSourceObserver(o, this._cb, state)));\n      subscriptions[n] = outerSad;\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return WithLatestFromObservable;\n  }(ObservableBase));\n\n  var WithLatestFromOtherObserver = (function (__super__) {\n    inherits(WithLatestFromOtherObserver, __super__);\n    function WithLatestFromOtherObserver(o, i, state) {\n      this._o = o;\n      this._i = i;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromOtherObserver.prototype.next = function (x) {\n      this._state.values[this._i] = x;\n      this._state.hasValue[this._i] = true;\n      this._state.hasValueAll = this._state.hasValue.every(identity);\n    };\n\n    WithLatestFromOtherObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromOtherObserver.prototype.completed = noop;\n\n    return WithLatestFromOtherObserver;\n  }(AbstractObserver));\n\n  var WithLatestFromSourceObserver = (function (__super__) {\n    inherits(WithLatestFromSourceObserver, __super__);\n    function WithLatestFromSourceObserver(o, cb, state) {\n      this._o = o;\n      this._cb = cb;\n      this._state = state;\n      __super__.call(this);\n    }\n\n    WithLatestFromSourceObserver.prototype.next = function (x) {\n      var allValues = [x].concat(this._state.values);\n      if (!this._state.hasValueAll) { return; }\n      var res = tryCatch(this._cb).apply(null, allValues);\n      if (res === errorObj) { return this._o.onError(res.e); }\n      this._o.onNext(res);\n    };\n\n    WithLatestFromSourceObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    WithLatestFromSourceObserver.prototype.completed = function () {\n      this._o.onCompleted();\n    };\n\n    return WithLatestFromSourceObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.withLatestFrom = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    return new WithLatestFromObservable(this, args, resultSelector);\n  };\n"
  },
  {
    "path": "src/core/perf/operators/zip.js",
    "content": "  function falseFactory() { return false; }\n  function emptyArrayFactory() { return []; }\n\n  var ZipObservable = (function(__super__) {\n    inherits(ZipObservable, __super__);\n    function ZipObservable(sources, resultSelector) {\n      this._s = sources;\n      this._cb = resultSelector;\n      __super__.call(this);\n    }\n\n    ZipObservable.prototype.subscribeCore = function(observer) {\n      var n = this._s.length,\n          subscriptions = new Array(n),\n          done = arrayInitialize(n, falseFactory),\n          q = arrayInitialize(n, emptyArrayFactory);\n\n      for (var i = 0; i < n; i++) {\n        var source = this._s[i], sad = new SingleAssignmentDisposable();\n        subscriptions[i] = sad;\n        isPromise(source) && (source = observableFromPromise(source));\n        sad.setDisposable(source.subscribe(new ZipObserver(observer, i, this, q, done)));\n      }\n\n      return new NAryDisposable(subscriptions);\n    };\n\n    return ZipObservable;\n  }(ObservableBase));\n\n  var ZipObserver = (function (__super__) {\n    inherits(ZipObserver, __super__);\n    function ZipObserver(o, i, p, q, d) {\n      this._o = o;\n      this._i = i;\n      this._p = p;\n      this._q = q;\n      this._d = d;\n      __super__.call(this);\n    }\n\n    function notEmpty(x) { return x.length > 0; }\n    function shiftEach(x) { return x.shift(); }\n    function notTheSame(i) {\n      return function (x, j) {\n        return j !== i;\n      };\n    }\n\n    ZipObserver.prototype.next = function (x) {\n      this._q[this._i].push(x);\n      if (this._q.every(notEmpty)) {\n        var queuedValues = this._q.map(shiftEach);\n        var res = tryCatch(this._p._cb).apply(null, queuedValues);\n        if (res === errorObj) { return this._o.onError(res.e); }\n        this._o.onNext(res);\n      } else if (this._d.filter(notTheSame(this._i)).every(identity)) {\n        this._o.onCompleted();\n      }\n    };\n\n    ZipObserver.prototype.error = function (e) {\n      this._o.onError(e);\n    };\n\n    ZipObserver.prototype.completed = function () {\n      this._d[this._i] = true;\n      this._d.every(identity) && this._o.onCompleted();\n    };\n\n    return ZipObserver;\n  }(AbstractObserver));\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n   * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n   */\n  observableProto.zip = function () {\n    if (arguments.length === 0) { throw new Error('invalid arguments'); }\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n    Array.isArray(args[0]) && (args = args[0]);\n\n    var parent = this;\n    args.unshift(parent);\n\n    return new ZipObservable(args, resultSelector);\n  };\n"
  },
  {
    "path": "src/core/scheduledobserver.js",
    "content": "  var ScheduledObserver = Rx.internals.ScheduledObserver = (function (__super__) {\n    inherits(ScheduledObserver, __super__);\n\n    function ScheduledObserver(scheduler, observer) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.observer = observer;\n      this.isAcquired = false;\n      this.hasFaulted = false;\n      this.queue = [];\n      this.disposable = new SerialDisposable();\n    }\n\n    function enqueueNext(observer, x) { return function () { observer.onNext(x); }; }\n    function enqueueError(observer, e) { return function () { observer.onError(e); }; }\n    function enqueueCompleted(observer) { return function () { observer.onCompleted(); }; }\n\n    ScheduledObserver.prototype.next = function (x) {\n      this.queue.push(enqueueNext(this.observer, x));\n    };\n\n    ScheduledObserver.prototype.error = function (e) {\n      this.queue.push(enqueueError(this.observer, e));\n    };\n\n    ScheduledObserver.prototype.completed = function () {\n      this.queue.push(enqueueCompleted(this.observer));\n    };\n\n\n    function scheduleMethod(state, recurse) {\n      var work;\n      if (state.queue.length > 0) {\n        work = state.queue.shift();\n      } else {\n        state.isAcquired = false;\n        return;\n      }\n      var res = tryCatch(work)();\n      if (res === errorObj) {\n        state.queue = [];\n        state.hasFaulted = true;\n        return thrower(res.e);\n      }\n      recurse(state);\n    }\n\n    ScheduledObserver.prototype.ensureActive = function () {\n      var isOwner = false;\n      if (!this.hasFaulted && this.queue.length > 0) {\n        isOwner = !this.isAcquired;\n        this.isAcquired = true;\n      }\n      isOwner &&\n        this.disposable.setDisposable(this.scheduler.scheduleRecursive(this, scheduleMethod));\n    };\n\n    ScheduledObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.disposable.dispose();\n    };\n\n    return ScheduledObserver;\n  }(AbstractObserver));\n"
  },
  {
    "path": "src/core/subjects/anonymoussubject.js",
    "content": "  var AnonymousSubject = Rx.AnonymousSubject = (function (__super__) {\n    inherits(AnonymousSubject, __super__);\n    function AnonymousSubject(observer, observable) {\n      this.observer = observer;\n      this.observable = observable;\n      __super__.call(this);\n    }\n\n    addProperties(AnonymousSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        return this.observable.subscribe(o);\n      },\n      onCompleted: function () {\n        this.observer.onCompleted();\n      },\n      onError: function (error) {\n        this.observer.onError(error);\n      },\n      onNext: function (value) {\n        this.observer.onNext(value);\n      }\n    });\n\n    return AnonymousSubject;\n  }(Observable));\n"
  },
  {
    "path": "src/core/subjects/asyncsubject.js",
    "content": "  /**\n   *  Represents the result of an asynchronous operation.\n   *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n   */\n  var AsyncSubject = Rx.AsyncSubject = (function (__super__) {\n    inherits(AsyncSubject, __super__);\n\n    /**\n     * Creates a subject that can only receive one value and that value is cached for all future observations.\n     * @constructor\n     */\n    function AsyncSubject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasValue = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(AsyncSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n\n        if (this.hasError) {\n          o.onError(this.error);\n        } else if (this.hasValue) {\n          o.onNext(this.value);\n          o.onCompleted();\n        } else {\n          o.onCompleted();\n        }\n\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n       */\n      onCompleted: function () {\n        var i, len;\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          var os = cloneArray(this.observers), len = os.length;\n\n          if (this.hasValue) {\n            for (i = 0; i < len; i++) {\n              var o = os[i];\n              o.onNext(this.value);\n              o.onCompleted();\n            }\n          } else {\n            for (i = 0; i < len; i++) {\n              os[i].onCompleted();\n            }\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the error.\n       * @param {Mixed} error The Error to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.hasError = true;\n          this.error = error;\n\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n       * @param {Mixed} value The value to store in the subject.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        this.hasValue = true;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.error = null;\n        this.value = null;\n      }\n    });\n\n    return AsyncSubject;\n  }(Observable));\n"
  },
  {
    "path": "src/core/subjects/behaviorsubject.js",
    "content": "  /**\n   *  Represents a value that changes over time.\n   *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n   */\n  var BehaviorSubject = Rx.BehaviorSubject = (function (__super__) {\n    inherits(BehaviorSubject, __super__);\n    function BehaviorSubject(value) {\n      __super__.call(this);\n      this.value = value;\n      this.observers = [];\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasError = false;\n    }\n\n    addProperties(BehaviorSubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          o.onNext(this.value);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n        } else {\n          o.onCompleted();\n        }\n        return disposableEmpty;\n      },\n      /**\n       * Gets the current value or throws an exception.\n       * Value is frozen after onCompleted is called.\n       * After onError is called always throws the specified exception.\n       * An exception is always thrown after dispose is called.\n       * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n       */\n      getValue: function () {\n        checkDisposed(this);\n        if (this.hasError) { thrower(this.error); }\n        return this.value;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onCompleted();\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.hasError = true;\n        this.error = error;\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onError(error);\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onNext(value);\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.value = null;\n        this.error = null;\n      }\n    });\n\n    return BehaviorSubject;\n  }(Observable));\n"
  },
  {
    "path": "src/core/subjects/innersubscription.js",
    "content": "  var InnerSubscription = function (s, o) {\n    this._s = s;\n    this._o = o;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this._s.isDisposed && this._o !== null) {\n      var idx = this._s.observers.indexOf(this._o);\n      this._s.observers.splice(idx, 1);\n      this._o = null;\n    }\n  };\n"
  },
  {
    "path": "src/core/subjects/replaysubject.js",
    "content": "  /**\n   * Represents an object that is both an observable sequence as well as an observer.\n   * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n   */\n  var ReplaySubject = Rx.ReplaySubject = (function (__super__) {\n\n    var maxSafeInteger = Math.pow(2, 53) - 1;\n\n    function createRemovableDisposable(subject, observer) {\n      return disposableCreate(function () {\n        observer.dispose();\n        !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n      });\n    }\n\n    inherits(ReplaySubject, __super__);\n\n    /**\n     *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n     *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n     *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n     *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n     */\n    function ReplaySubject(bufferSize, windowSize, scheduler) {\n      this.bufferSize = bufferSize == null ? maxSafeInteger : bufferSize;\n      this.windowSize = windowSize == null ? maxSafeInteger : windowSize;\n      this.scheduler = scheduler || currentThreadScheduler;\n      this.q = [];\n      this.observers = [];\n      this.isStopped = false;\n      this.isDisposed = false;\n      this.hasError = false;\n      this.error = null;\n      __super__.call(this);\n    }\n\n    addProperties(ReplaySubject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        var so = new ScheduledObserver(this.scheduler, o), subscription = createRemovableDisposable(this, so);\n\n        this._trim(this.scheduler.now());\n        this.observers.push(so);\n\n        for (var i = 0, len = this.q.length; i < len; i++) {\n          so.onNext(this.q[i].value);\n        }\n\n        if (this.hasError) {\n          so.onError(this.error);\n        } else if (this.isStopped) {\n          so.onCompleted();\n        }\n\n        so.ensureActive();\n        return subscription;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      _trim: function (now) {\n        while (this.q.length > this.bufferSize) {\n          this.q.shift();\n        }\n        while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {\n          this.q.shift();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        var now = this.scheduler.now();\n        this.q.push({ interval: now, value: value });\n        this._trim(now);\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onNext(value);\n          observer.ensureActive();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.error = error;\n        this.hasError = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onError(error);\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onCompleted();\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    return ReplaySubject;\n  }(Observable));\n"
  },
  {
    "path": "src/core/subjects/subject.js",
    "content": "  /**\n   *  Represents an object that is both an observable sequence as well as an observer.\n   *  Each notification is broadcasted to all subscribed observers.\n   */\n  var Subject = Rx.Subject = (function (__super__) {\n    inherits(Subject, __super__);\n    function Subject() {\n      __super__.call(this);\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(Subject.prototype, Observer.prototype, {\n      _subscribe: function (o) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.observers.push(o);\n          return new InnerSubscription(this, o);\n        }\n        if (this.hasError) {\n          o.onError(this.error);\n          return disposableEmpty;\n        }\n        o.onCompleted();\n        return disposableEmpty;\n      },\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { checkDisposed(this); return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onCompleted();\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.error = error;\n          this.hasError = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onNext(value);\n          }\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    /**\n     * Creates a subject from the specified observer and observable.\n     * @param {Observer} observer The observer used to send messages to the subject.\n     * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n     * @returns {Subject} Subject implemented using the given observer and observable.\n     */\n    Subject.create = function (observer, observable) {\n      return new AnonymousSubject(observer, observable);\n    };\n\n    return Subject;\n  }(Observable));\n"
  },
  {
    "path": "src/core/testing/coldobservable.js",
    "content": "  var ColdObservable = (function (__super__) {\n    inherits(ColdObservable, __super__);\n\n    function ColdObservable(scheduler, messages) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n    }\n\n    ColdObservable.prototype._subscribe = function (o) {\n      var message, notification, observable = this;\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      var d = new CompositeDisposable();\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          d.add(observable.scheduler.scheduleRelative(null, message.time, function () {\n            innerNotification.accept(o);\n            return disposableEmpty;\n          }));\n        })(notification);\n      }\n      return disposableCreate(function () {\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n        d.dispose();\n      });\n    };\n\n    return ColdObservable;\n  })(Observable);\n"
  },
  {
    "path": "src/core/testing/hotobservable.js",
    "content": "  var HotObservable = (function (__super__) {\n    inherits(HotObservable, __super__);\n\n    function HotObservable(scheduler, messages) {\n      __super__.call(this);\n      var message, notification, observable = this;\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n      this.observers = [];\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          scheduler.scheduleAbsolute(null, message.time, function () {\n            var obs = observable.observers.slice(0);\n\n            for (var j = 0, jLen = obs.length; j < jLen; j++) {\n              innerNotification.accept(obs[j]);\n            }\n            return disposableEmpty;\n          });\n        })(notification);\n      }\n    }\n\n    HotObservable.prototype._subscribe = function (o) {\n      var observable = this;\n      this.observers.push(o);\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      return disposableCreate(function () {\n        var idx = observable.observers.indexOf(o);\n        observable.observers.splice(idx, 1);\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n      });\n    };\n\n    return HotObservable;\n  })(Observable);\n"
  },
  {
    "path": "src/core/testing/mockdisposable.js",
    "content": "  var MockDisposable = Rx.MockDisposable = function (scheduler) {\n    this.scheduler = scheduler;\n    this.disposes = [];\n    this.disposes.push(this.scheduler.clock);\n  };\n\n  MockDisposable.prototype.dispose = function () {\n    this.disposes.push(this.scheduler.clock);\n  };\n"
  },
  {
    "path": "src/core/testing/mockobserver.js",
    "content": "  var MockObserver = (function (__super__) {\n    inherits(MockObserver, __super__);\n\n    function MockObserver(scheduler) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = [];\n    }\n\n    var MockObserverPrototype = MockObserver.prototype;\n\n    MockObserverPrototype.onNext = function (value) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnNext(value)));\n    };\n\n    MockObserverPrototype.onError = function (e) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnError(e)));\n    };\n\n    MockObserverPrototype.onCompleted = function () {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnCompleted()));\n    };\n\n    return MockObserver;\n  })(Observer);\n"
  },
  {
    "path": "src/core/testing/mockpromise.js",
    "content": "  function MockPromise(scheduler, messages) {\n    var self = this;\n    this.scheduler = scheduler;\n    this.messages = messages;\n    this.subscriptions = [];\n    this.observers = [];\n    for (var i = 0, len = this.messages.length; i < len; i++) {\n      var message = this.messages[i],\n          notification = message.value;\n      (function (innerNotification) {\n        scheduler.scheduleAbsolute(null, message.time, function () {\n          var obs = self.observers.slice(0);\n\n          for (var j = 0, jLen = obs.length; j < jLen; j++) {\n            innerNotification.accept(obs[j]);\n          }\n          return disposableEmpty;\n        });\n      })(notification);\n    }\n  }\n\n  MockPromise.prototype.then = function (onResolved, onRejected) {\n    var self = this;\n\n    this.subscriptions.push(new Subscription(this.scheduler.clock));\n    var index = this.subscriptions.length - 1;\n\n    var newPromise;\n\n    var observer = Rx.Observer.create(\n      function (x) {\n        var retValue = onResolved(x);\n        if (retValue && typeof retValue.then === 'function') {\n          newPromise = retValue;\n        } else {\n          var ticks = self.scheduler.clock;\n          newPromise = new MockPromise(self.scheduler, [Rx.ReactiveTest.onNext(ticks, undefined), Rx.ReactiveTest.onCompleted(ticks)]);\n        }\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      },\n      function (err) {\n        onRejected(err);\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      }\n    );\n    this.observers.push(observer);\n\n    return newPromise || new MockPromise(this.scheduler, this.messages);\n  };\n"
  },
  {
    "path": "src/core/testing/reactivetest.js",
    "content": "function OnNextPredicate(predicate) {\n    this.predicate = predicate;\n}\n\nOnNextPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'N') { return false; }\n  return this.predicate(other.value);\n};\n\nfunction OnErrorPredicate(predicate) {\n  this.predicate = predicate;\n}\n\nOnErrorPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'E') { return false; }\n  return this.predicate(other.error);\n};\n\nvar ReactiveTest = Rx.ReactiveTest = {\n  /** Default virtual time used for creation of observable sequences in unit tests. */\n  created: 100,\n  /** Default virtual time used to subscribe to observable sequences in unit tests. */\n  subscribed: 200,\n  /** Default virtual time used to dispose subscriptions in unit tests. */\n  disposed: 1000,\n\n  /**\n   * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n   *\n   * 1 - ReactiveTest.onNext(200, 42);\n   * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n   *\n   * @param ticks Recorded virtual time the OnNext notification occurs.\n   * @param value Recorded value stored in the OnNext notification or a predicate.\n   * @return Recorded OnNext notification.\n   */\n  onNext: function (ticks, value) {\n    return typeof value === 'function' ?\n      new Recorded(ticks, new OnNextPredicate(value)) :\n      new Recorded(ticks, Notification.createOnNext(value));\n  },\n  /**\n   * Factory method for an OnError notification record at a given time with a given error.\n   *\n   * 1 - ReactiveTest.onNext(200, new Error('error'));\n   * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n   *\n   * @param ticks Recorded virtual time the OnError notification occurs.\n   * @param exception Recorded exception stored in the OnError notification.\n   * @return Recorded OnError notification.\n   */\n  onError: function (ticks, error) {\n    return typeof error === 'function' ?\n      new Recorded(ticks, new OnErrorPredicate(error)) :\n      new Recorded(ticks, Notification.createOnError(error));\n  },\n  /**\n   * Factory method for an OnCompleted notification record at a given time.\n   *\n   * @param ticks Recorded virtual time the OnCompleted notification occurs.\n   * @return Recorded OnCompleted notification.\n   */\n  onCompleted: function (ticks) {\n    return new Recorded(ticks, Notification.createOnCompleted());\n  },\n  /**\n   * Factory method for a subscription record based on a given subscription and disposal time.\n   *\n   * @param start Virtual time indicating when the subscription was created.\n   * @param end Virtual time indicating when the subscription was disposed.\n   * @return Subscription object.\n   */\n  subscribe: function (start, end) {\n    return new Subscription(start, end);\n  }\n};\n"
  },
  {
    "path": "src/core/testing/recorded.js",
    "content": "  /**\n   * Creates a new object recording the production of the specified value at the given virtual time.\n   *\n   * @constructor\n   * @param {Number} time Virtual time the value was produced on.\n   * @param {Mixed} value Value that was produced.\n   * @param {Function} comparer An optional comparer.\n   */\n  var Recorded = Rx.Recorded = function (time, value, comparer) {\n    this.time = time;\n    this.value = value;\n    this.comparer = comparer || defaultComparer;\n  };\n\n  /**\n   * Checks whether the given recorded object is equal to the current instance.\n   *\n   * @param {Recorded} other Recorded object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Recorded.prototype.equals = function (other) {\n    return this.time === other.time && this.comparer(this.value, other.value);\n  };\n\n  /**\n   * Returns a string representation of the current Recorded value.\n   *\n   * @returns {String} String representation of the current Recorded value.\n   */\n  Recorded.prototype.toString = function () {\n    return this.value.toString() + '@' + this.time;\n  };\n"
  },
  {
    "path": "src/core/testing/subscription.js",
    "content": "  /**\n   * Creates a new subscription object with the given virtual subscription and unsubscription time.\n   *\n   * @constructor\n   * @param {Number} subscribe Virtual time at which the subscription occurred.\n   * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n   */\n  var Subscription = Rx.Subscription = function (start, end) {\n    this.subscribe = start;\n    this.unsubscribe = end || Number.MAX_VALUE;\n  };\n\n  /**\n   * Checks whether the given subscription is equal to the current instance.\n   * @param other Subscription object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Subscription.prototype.equals = function (other) {\n    return this.subscribe === other.subscribe && this.unsubscribe === other.unsubscribe;\n  };\n\n  /**\n   * Returns a string representation of the current Subscription value.\n   * @returns {String} String representation of the current Subscription value.\n   */\n  Subscription.prototype.toString = function () {\n    return '(' + this.subscribe + ', ' + (this.unsubscribe === Number.MAX_VALUE ? 'Infinite' : this.unsubscribe) + ')';\n  };\n"
  },
  {
    "path": "src/core/testing/testscheduler.js",
    "content": "  /** Virtual time scheduler used for testing applications and libraries built using Reactive Extensions. */\n  Rx.TestScheduler = (function (__super__) {\n    inherits(TestScheduler, __super__);\n\n    function baseComparer(x, y) {\n      return x > y ? 1 : (x < y ? -1 : 0);\n    }\n\n    function TestScheduler() {\n      __super__.call(this, 0, baseComparer);\n    }\n\n    /**\n     * Schedules an action to be executed at the specified virtual time.\n     *\n     * @param state State passed to the action to be executed.\n     * @param dueTime Absolute virtual time at which to execute the action.\n     * @param action Action to be executed.\n     * @return Disposable object used to cancel the scheduled action (best effort).\n     */\n    TestScheduler.prototype.scheduleAbsolute = function (state, dueTime, action) {\n      dueTime <= this.clock && (dueTime = this.clock + 1);\n      return __super__.prototype.scheduleAbsolute.call(this, state, dueTime, action);\n    };\n    /**\n     * Adds a relative virtual time to an absolute virtual time value.\n     *\n     * @param absolute Absolute virtual time value.\n     * @param relative Relative virtual time value to add.\n     * @return Resulting absolute virtual time sum value.\n     */\n    TestScheduler.prototype.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n    /**\n     * Converts the absolute virtual time value to a DateTimeOffset value.\n     *\n     * @param absolute Absolute virtual time value to convert.\n     * @return Corresponding DateTimeOffset value.\n     */\n    TestScheduler.prototype.toAbsoluteTime = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     *\n     * @param timeSpan TimeSpan value to convert.\n     * @return Corresponding relative virtual time value.\n     */\n    TestScheduler.prototype.toRelativeTime = function (timeSpan) {\n      return timeSpan;\n    };\n    /**\n     * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n     *\n     * @param create Factory method to create an observable sequence.\n     * @param created Virtual time at which to invoke the factory to create an observable sequence.\n     * @param subscribed Virtual time at which to subscribe to the created observable sequence.\n     * @param disposed Virtual time at which to dispose the subscription.\n     * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n     */\n    TestScheduler.prototype.startScheduler = function (createFn, settings) {\n      settings || (settings = {});\n      settings.created == null && (settings.created = ReactiveTest.created);\n      settings.subscribed == null && (settings.subscribed = ReactiveTest.subscribed);\n      settings.disposed == null && (settings.disposed = ReactiveTest.disposed);\n\n      var observer = this.createObserver(), source, subscription;\n\n      this.scheduleAbsolute(null, settings.created, function () {\n        source = createFn();\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.subscribed, function () {\n        subscription = source.subscribe(observer);\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsolute(null, settings.disposed, function () {\n        subscription.dispose();\n        return disposableEmpty;\n      });\n\n      this.start();\n\n      return observer;\n    };\n\n    /**\n     * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n     * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createHotObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new HotObservable(this, args);\n    };\n\n    /**\n     * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n     * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createColdObservable = function () {\n      var len = arguments.length, args;\n      if (Array.isArray(arguments[0])) {\n        args = arguments[0];\n      } else {\n        args = new Array(len);\n        for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n      }\n      return new ColdObservable(this, args);\n    };\n\n    /**\n     * Creates a resolved promise with the given value and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} value The value to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which fulfills with the given value.\n     */\n    TestScheduler.prototype.createResolvedPromise = function (ticks, value) {\n      return new MockPromise(this, [Rx.ReactiveTest.onNext(ticks, value), Rx.ReactiveTest.onCompleted(ticks)]);\n    };\n\n    /**\n     * Creates a rejected promise with the given reason and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} reason The reason for rejection to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which rejects with the given reason.\n     */\n    TestScheduler.prototype.createRejectedPromise = function (ticks, reason) {\n      return new MockPromise(this, [Rx.ReactiveTest.onError(ticks, reason)]);\n    };\n\n    /**\n     * Creates an observer that records received notification messages and timestamps those.\n     * @return Observer that can be used to assert the timing of received notifications.\n     */\n    TestScheduler.prototype.createObserver = function () {\n      return new MockObserver(this);\n    };\n\n    return TestScheduler;\n  })(VirtualTimeScheduler);\n"
  },
  {
    "path": "src/modular/asyncsubject.js",
    "content": "'use strict';\n\nvar Disposable = require('./disposable');\nvar Observable = require('./observable');\nvar Observer = require('./observer');\nvar InnerSubscription = require('./internal/innersubscription');\nvar addProperties = require('./internal/addproperties');\nvar cloneArray = require('./internal/clonearray');\nvar inherits = require('inherits');\n\n/**\n*  Represents the result of an asynchronous operation.\n*  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n*/\nfunction AsyncSubject() {\n  Observable.call(this);\n  this.isDisposed = false;\n  this.isStopped = false;\n  this.hasValue = false;\n  this.observers = [];\n  this.hasError = false;\n}\n\ninherits(AsyncSubject, Observable);\n\naddProperties(AsyncSubject.prototype, Observer.prototype, {\n  _subscribe: function (o) {\n    Disposable.checkDisposed(this);\n\n    if (!this.isStopped) {\n      this.observers.push(o);\n      return new InnerSubscription(this, o);\n    }\n\n    if (this.hasError) {\n      o.onError(this.error);\n    } else if (this.hasValue) {\n      o.onNext(this.value);\n      o.onCompleted();\n    } else {\n      o.onCompleted();\n    }\n\n    return Disposable.empty;\n  },\n  /**\n   * Indicates whether the subject has observers subscribed to it.\n   * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n   */\n  hasObservers: function () {\n    Disposable.checkDisposed(this);\n    return this.observers.length > 0;\n  },\n  /**\n   * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n   */\n  onCompleted: function () {\n    var i;\n    Disposable.checkDisposed(this);\n    if (!this.isStopped) {\n      this.isStopped = true;\n      var os = cloneArray(this.observers), len = os.length;\n\n      if (this.hasValue) {\n        for (i = 0; i < len; i++) {\n          var o = os[i];\n          o.onNext(this.value);\n          o.onCompleted();\n        }\n      } else {\n        for (i = 0; i < len; i++) {\n          os[i].onCompleted();\n        }\n      }\n\n      this.observers.length = 0;\n    }\n  },\n  /**\n   * Notifies all subscribed observers about the error.\n   * @param {Mixed} error The Error to send to all observers.\n   */\n  onError: function (error) {\n    Disposable.checkDisposed(this);\n    if (!this.isStopped) {\n      this.isStopped = true;\n      this.hasError = true;\n      this.error = error;\n\n      for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n        os[i].onError(error);\n      }\n\n      this.observers.length = 0;\n    }\n  },\n  /**\n   * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n   * @param {Mixed} value The value to store in the subject.\n   */\n  onNext: function (value) {\n    Disposable.checkDisposed(this);\n    if (this.isStopped) { return; }\n    this.value = value;\n    this.hasValue = true;\n  },\n  /**\n   * Unsubscribe all observers and release resources.\n   */\n  dispose: function () {\n    this.isDisposed = true;\n    this.observers = null;\n    this.error = null;\n    this.value = null;\n  }\n});\n\nmodule.exports = AsyncSubject;\n"
  },
  {
    "path": "src/modular/behaviorsubject.js",
    "content": "'use strict';\n\nvar Observable = require('./observable');\nvar Observer = require('./observer');\nvar Disposable = require('./disposable');\nvar InnerSubscription = require('./internal/innersubscription');\nvar addProperties = require('./internal/addproperties');\nvar cloneArray = require('./internal/clonearray');\nvar thrower = require('./internal/trycatchutils').thrower;\nvar inherits = require('inherits');\n\n/**\n*  Represents a value that changes over time.\n*  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n*/\nfunction BehaviorSubject(value) {\n  this.value = value;\n  this.observers = [];\n  this.isDisposed = false;\n  this.isStopped = false;\n  this.hasError = false;\n  Observable.call(this);\n}\n\ninherits(BehaviorSubject, Observable);\n\naddProperties(BehaviorSubject.prototype, Observer.prototype, {\n  _subscribe: function (o) {\n    Disposable.checkDisposed(this);\n    if (!this.isStopped) {\n      this.observers.push(o);\n      o.onNext(this.value);\n      return new InnerSubscription(this, o);\n    }\n    if (this.hasError) {\n      o.onError(this.error);\n    } else {\n      o.onCompleted();\n    }\n    return Disposable.empty;\n  },\n  /**\n   * Gets the current value or throws an exception.\n   * Value is frozen after onCompleted is called.\n   * After onError is called always throws the specified exception.\n   * An exception is always thrown after dispose is called.\n   * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n   */\n  getValue: function () {\n    Disposable.checkDisposed(this);\n    if (this.hasError) { thrower(this.error); }\n    return this.value;\n  },\n  /**\n   * Indicates whether the subject has observers subscribed to it.\n   * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n   */\n  hasObservers: function () {\n    Disposable.checkDisposed(this);\n    return this.observers.length > 0;\n  },\n  /**\n   * Notifies all subscribed observers about the end of the sequence.\n   */\n  onCompleted: function () {\n    Disposable.checkDisposed(this);\n    if (this.isStopped) { return; }\n    this.isStopped = true;\n    for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n      os[i].onCompleted();\n    }\n\n    this.observers.length = 0;\n  },\n  /**\n   * Notifies all subscribed observers about the exception.\n   * @param {Mixed} error The exception to send to all observers.\n   */\n  onError: function (error) {\n    Disposable.checkDisposed(this);\n    if (this.isStopped) { return; }\n    this.isStopped = true;\n    this.hasError = true;\n    this.error = error;\n\n    for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n      os[i].onError(error);\n    }\n\n    this.observers.length = 0;\n  },\n  /**\n   * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n   * @param {Mixed} value The value to send to all observers.\n   */\n  onNext: function (value) {\n    Disposable.checkDisposed(this);\n    if (this.isStopped) { return; }\n    this.value = value;\n    for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n      os[i].onNext(value);\n    }\n  },\n  /**\n   * Unsubscribe all observers and release resources.\n   */\n  dispose: function () {\n    this.isDisposed = true;\n    this.observers = null;\n    this.value = null;\n    this.error = null;\n  }\n});\n\nmodule.exports = BehaviorSubject;\n"
  },
  {
    "path": "src/modular/binarydisposable.js",
    "content": "'use strict';\n\nfunction BinaryDisposable(first, second) {\n  this._first = first;\n  this._second = second;\n  this.isDisposed = false;\n}\n\nBinaryDisposable.prototype.dispose = function () {\n  if (!this.isDisposed) {\n    this.isDisposed = true;\n    var old1 = this._first;\n    this._first = null;\n    old1 && old1.dispose();\n    var old2 = this._second;\n    this._second = null;\n    old2 && old2.dispose();\n  }\n};\n\nmodule.exports = BinaryDisposable;\n"
  },
  {
    "path": "src/modular/compositedisposable.js",
    "content": "'use strict';\n\n/**\n * Represents a group of disposable resources that are disposed together.\n * @constructor\n */\nfunction CompositeDisposable () {\n  var args = [], i, len;\n  if (Array.isArray(arguments[0])) {\n    args = arguments[0];\n    len = args.length;\n  } else {\n    len = arguments.length;\n    args = new Array(len);\n    for(i = 0; i < len; i++) { args[i] = arguments[i]; }\n  }\n  this.disposables = args;\n  this.isDisposed = false;\n  this.length = args.length;\n}\n\n/**\n * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n * @param {Mixed} item Disposable to add.\n */\nCompositeDisposable.prototype.add = function (item) {\n  if (this.isDisposed) {\n    item.dispose();\n  } else {\n    this.disposables.push(item);\n    this.length++;\n  }\n};\n\n/**\n * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n * @param {Mixed} item Disposable to remove.\n * @returns {Boolean} true if found; false otherwise.\n */\nCompositeDisposable.prototype.remove = function (item) {\n  var shouldDispose = false;\n  if (!this.isDisposed) {\n    var idx = this.disposables.indexOf(item);\n    if (idx !== -1) {\n      shouldDispose = true;\n      this.disposables.splice(idx, 1);\n      this.length--;\n      item.dispose();\n    }\n  }\n  return shouldDispose;\n};\n\n/**\n *  Disposes all disposables in the group and removes them from the group.\n */\nCompositeDisposable.prototype.dispose = function () {\n  if (!this.isDisposed) {\n    this.isDisposed = true;\n    var len = this.disposables.length, currentDisposables = new Array(len);\n    for(var i = 0; i < len; i++) { currentDisposables[i] = this.disposables[i]; }\n    this.disposables = [];\n    this.length = 0;\n\n    for (i = 0; i < len; i++) {\n      currentDisposables[i].dispose();\n    }\n  }\n};\n\nmodule.exports = CompositeDisposable;\n"
  },
  {
    "path": "src/modular/disposable.js",
    "content": "'use strict';\n\nvar noop = require('./helpers/noop');\nvar isFunction = require('./helpers/isfunction');\nvar ObjectDisposedError = require('./internal/errors').ObjectDisposedError;\n\n/**\n * Provides a set of static methods for creating Disposables.\n * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n */\nfunction Disposable (action) {\n  this.isDisposed = false;\n  this.action = action || noop;\n}\n\n/** Performs the task of cleaning up resources. */\nDisposable.prototype.dispose = function () {\n  if (!this.isDisposed) {\n    this.action();\n    this.isDisposed = true;\n  }\n};\n\n/**\n * Creates a disposable object that invokes the specified action when disposed.\n * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n * @return {Disposable} The disposable object that runs the given action upon disposal.\n */\nDisposable.create = function (action) { return new Disposable(action); };\n\n/**\n * Gets the disposable that does nothing when disposed.\n */\nDisposable.empty = { dispose: noop };\n\n/**\n * Validates whether the given object is a disposable\n * @param {Object} Object to test whether it has a dispose method\n * @returns {Boolean} true if a disposable object, else false.\n */\nDisposable.isDisposable = function (d) {\n  return d && isFunction(d.dispose);\n};\n\nDisposable.checkDisposed = function (disposable) {\n  if (disposable.isDisposed) { throw new ObjectDisposedError(); }\n};\n\nDisposable._fixup = function (result) {\n  return Disposable.isDisposable(result) ? result : Disposable.empty;\n};\n\nmodule.exports = Disposable;\n"
  },
  {
    "path": "src/modular/dist/rx.all.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"rx\"] = factory();\n\telse\n\t\troot[\"rx\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Observer = __webpack_require__(1);\n\n\tObserver.addToObject({\n\t  create: __webpack_require__(2)\n\t});\n\n\tvar Observable = __webpack_require__(8);\n\n\tObservable.addToObject({\n\t  race: __webpack_require__(10),\n\t  bindCallback: __webpack_require__(30),\n\t  bindNodeCallback: __webpack_require__(37),\n\t  case: __webpack_require__(38),\n\t  catch: __webpack_require__(42),\n\t  combineLatest: __webpack_require__(45),\n\t  concat: __webpack_require__(47),\n\t  create: __webpack_require__(48),\n\t  defer: __webpack_require__(39),\n\t  empty: __webpack_require__(41),\n\t  forkJoin: __webpack_require__(49),\n\t  from: __webpack_require__(50),\n\t  fromArray: __webpack_require__(53),\n\t  fromEvent: __webpack_require__(54),\n\t  fromEventPattern: __webpack_require__(55),\n\t  fromPromise: __webpack_require__(27),\n\t  generate: __webpack_require__(60),\n\t  generateAbsolute: __webpack_require__(61),\n\t  generateRelative: __webpack_require__(62),\n\t  interval: __webpack_require__(63),\n\t  just: __webpack_require__(64),\n\t  merge: __webpack_require__(65),\n\t  never: __webpack_require__(29),\n\t  of: __webpack_require__(67),\n\t  ofScheduled: __webpack_require__(68),\n\t  onErrorResumeNext: __webpack_require__(69),\n\t  pairs: __webpack_require__(70),\n\t  range: __webpack_require__(71),\n\t  repeat: __webpack_require__(72),\n\t  sequenceEqual: __webpack_require__(73),\n\t  start: __webpack_require__(75),\n\t  startAsync: __webpack_require__(77),\n\t  throw: __webpack_require__(40),\n\t  timer: __webpack_require__(78),\n\t  toAsync: __webpack_require__(76),\n\t  when: __webpack_require__(79),\n\t  using: __webpack_require__(134),\n\t  zip: __webpack_require__(135)\n\t});\n\n\tObservable.addToPrototype({\n\t  race: __webpack_require__(10),\n\t  and: __webpack_require__(136),\n\t  asObservable: __webpack_require__(35),\n\t  average: __webpack_require__(143),\n\t  buffer: __webpack_require__(144),\n\t  bufferCount: __webpack_require__(154),\n\t  bufferTime: __webpack_require__(157),\n\t  bufferTimeOrCount: __webpack_require__(159),\n\t  catch: __webpack_require__(42),\n\t  catchHandler: __webpack_require__(161),\n\t  combineLatest: __webpack_require__(45),\n\t  concat: __webpack_require__(47),\n\t  concatAll: __webpack_require__(162),\n\t  controlled: __webpack_require__(164),\n\t  count: __webpack_require__(167),\n\t  debounce: __webpack_require__(168),\n\t  defaultIfEmpty: __webpack_require__(169),\n\t  delay: __webpack_require__(170),\n\t  delaySubscription: __webpack_require__(172),\n\t  dematerialize: __webpack_require__(173),\n\t  distinct: __webpack_require__(174),\n\t  distinctUntilChanged: __webpack_require__(175),\n\t  do: __webpack_require__(176),\n\t  every: __webpack_require__(177),\n\t  filter: __webpack_require__(155),\n\t  finally: __webpack_require__(178),\n\t  find: __webpack_require__(179),\n\t  findIndex: __webpack_require__(181),\n\t  first: __webpack_require__(182),\n\t  flatMap: __webpack_require__(145),\n\t  flatMapFirst: __webpack_require__(183),\n\t  flatMapLatest: __webpack_require__(185),\n\t  flatMapMaxConcurrent: __webpack_require__(187),\n\t  forkJoin: __webpack_require__(49),\n\t  groupJoin: __webpack_require__(151),\n\t  ignoreElements: __webpack_require__(188),\n\t  includes: __webpack_require__(189),\n\t  indexOf: __webpack_require__(190),\n\t  isEmpty: __webpack_require__(191),\n\t  join: __webpack_require__(192),\n\t  last: __webpack_require__(193),\n\t  lastIndexOf: __webpack_require__(194),\n\t  map: __webpack_require__(195),\n\t  materialize: __webpack_require__(141),\n\t  max: __webpack_require__(196),\n\t  maxBy: __webpack_require__(197),\n\t  merge: __webpack_require__(65),\n\t  mergeAll: __webpack_require__(66),\n\t  mergeConcat: __webpack_require__(163),\n\t  min: __webpack_require__(200),\n\t  minBy: __webpack_require__(201),\n\t  multicast: __webpack_require__(58),\n\t  observeOn: __webpack_require__(202),\n\t  onErrorResumeNext: __webpack_require__(69),\n\t  pairwise: __webpack_require__(205),\n\t  partition: __webpack_require__(206),\n\t  pausable: __webpack_require__(207),\n\t  pausableBuffered: __webpack_require__(209),\n\t  pluck: __webpack_require__(210),\n\t  publish: __webpack_require__(56),\n\t  publishLast: __webpack_require__(211),\n\t  publishValue: __webpack_require__(212),\n\t  reduce: __webpack_require__(214),\n\t  repeat: __webpack_require__(215),\n\t  repeatWhen: __webpack_require__(216),\n\t  replay: __webpack_require__(217),\n\t  retry: __webpack_require__(219),\n\t  retryWhen: __webpack_require__(220),\n\t  sample: __webpack_require__(221),\n\t  scan: __webpack_require__(222),\n\t  sequenceEqual: __webpack_require__(73),\n\t  share: __webpack_require__(223),\n\t  shareReplay: __webpack_require__(224),\n\t  shareValue: __webpack_require__(225),\n\t  skip: __webpack_require__(226),\n\t  skipLast: __webpack_require__(227),\n\t  skipLastTime: __webpack_require__(228),\n\t  skipUntil: __webpack_require__(229),\n\t  skipUntilTime: __webpack_require__(230),\n\t  skipWhile: __webpack_require__(231),\n\t  slice: __webpack_require__(232),\n\t  subscribeOn: __webpack_require__(233),\n\t  some: __webpack_require__(235),\n\t  sum: __webpack_require__(236),\n\t  switch: __webpack_require__(186),\n\t  switchFirst: __webpack_require__(184),\n\t  take: __webpack_require__(153),\n\t  takeLast: __webpack_require__(237),\n\t  takeLastBuffer: __webpack_require__(238),\n\t  takeLastBufferTime: __webpack_require__(239),\n\t  lastLastTime: __webpack_require__(240),\n\t  takeUntil: __webpack_require__(241),\n\t  takeUntilTime: __webpack_require__(242),\n\t  takeWhile: __webpack_require__(243),\n\t  tap: __webpack_require__(176),\n\t  thenDo: __webpack_require__(244),\n\t  throttle: __webpack_require__(245),\n\t  timeInterval: __webpack_require__(246),\n\t  timestamp: __webpack_require__(171),\n\t  toArray: __webpack_require__(247),\n\t  toMap: __webpack_require__(248),\n\t  toPromise: __webpack_require__(249),\n\t  toSet: __webpack_require__(250),\n\t  transduce: __webpack_require__(251),\n\t  window: __webpack_require__(149),\n\t  windowCount: __webpack_require__(156),\n\t  windowTime: __webpack_require__(158),\n\t  windowTimeOrCount: __webpack_require__(160),\n\t  withLatestFrom: __webpack_require__(252),\n\t  zip: __webpack_require__(135),\n\t  zipIterable: __webpack_require__(253)\n\t});\n\n\t// RxJS V4 aliases\n\tObservable.prototype.amb = Observable.prototype.race;\n\tObservable.amb = Observable.race;\n\tObservable.prototype.selectMany = Observable.prototype.flatMap;\n\tObservable.prototype.select = Observable.prototype.map;\n\tObservable.prototype.where = Observable.prototype.filter;\n\n\t// RxJS V5 aliases\n\tObservable.prototype.mergeMap = Observable.prototype.flatMap;\n\tObservable.prototype.switchMap = Observable.prototype.flatMapLatest;\n\tObservable.prototype.exhaustMap = Observable.prototype.flatMapFirst;\n\tObservable.prototype.exhaust = Observable.prototype.switchFirst;\n\tObservable.prototype.publishReplay = Observable.prototype.replay;\n\tObservable.fromCallback = Observable.bindCallback;\n\tObservable.fromNodeCallback = Observable.bindNodeCallback;\n\n\tvar Subject = __webpack_require__(57);\n\tSubject.addToObject({\n\t  create: __webpack_require__(254)\n\t});\n\n\tvar Rx = {\n\t  // Disposables\n\t  BinaryDisposable: __webpack_require__(24),\n\t  CompositeDisposable: __webpack_require__(14),\n\t  Disposable: __webpack_require__(13),\n\t  NAryDisposable: __webpack_require__(43),\n\t  SerialDisposable: __webpack_require__(44),\n\t  SingleAssignmentDisposable: __webpack_require__(17),\n\n\t  // Schedulers\n\t  Scheduler: __webpack_require__(12),\n\t  VirtualTimeScheduler: __webpack_require__(255),\n\t  HistoricalScheduler: __webpack_require__(257),\n\n\t  // Core\n\t  Observer: Observer,\n\t  Observable: Observable,\n\n\t  // Subjects\n\t  AsyncSubject: __webpack_require__(31),\n\t  BehaviorSubject: __webpack_require__(213),\n\t  ReplaySubject: __webpack_require__(218),\n\t  Subject: Subject,\n\n\t  // Testing\n\t  reactiveTest: __webpack_require__(258),\n\t  TestScheduler: __webpack_require__(261)\n\t};\n\n\tmodule.exports = Rx;\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\t/**\n\t * Supports push-style iteration over an observable sequence.\n\t */\n\n\tfunction Observer() {}\n\n\tObserver.addToObject = function (operators) {\n\t  Object.keys(operators).forEach(function (operator) {\n\t    Observer[operator] = operators[operator];\n\t  });\n\t};\n\n\tObserver.addToPrototype = function (operators) {\n\t  Object.keys(operators).forEach(function (operator) {\n\t    Observer.prototype[operator] = function () {\n\t      var args = [this];\n\t      args.push.apply(args, arguments);\n\t      return operators[operator].apply(null, args);\n\t    };\n\t  });\n\t};\n\n\tmodule.exports = Observer;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar noop = __webpack_require__(3);\n\tvar AnonymousObserver = __webpack_require__(4);\n\n\tfunction throwError(e) {\n\t  throw e;\n\t}\n\n\t/**\n\t *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n\t * @param {Function} [onNext] Observer's OnNext action implementation.\n\t * @param {Function} [onError] Observer's OnError action implementation.\n\t * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n\t * @returns {Observer} The observer object implemented using the given actions.\n\t */\n\tmodule.exports = function (onNext, onError, onCompleted) {\n\t  return new AnonymousObserver(onNext || noop, onError || throwError, onCompleted || noop);\n\t};\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function noop() {};\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar inherits = __webpack_require__(6);\n\n\t/**\n\t * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n\t * @param {Any} onNext Observer's OnNext action implementation.\n\t * @param {Any} onError Observer's OnError action implementation.\n\t * @param {Any} onCompleted Observer's OnCompleted action implementation.\n\t */\n\tfunction AnonymousObserver(onNext, onError, onCompleted) {\n\t  AbstractObserver.call(this);\n\t  this._onNext = onNext;\n\t  this._onError = onError;\n\t  this._onCompleted = onCompleted;\n\t}\n\n\tinherits(AnonymousObserver, AbstractObserver);\n\n\t/**\n\t * Calls the onNext action.\n\t * @param {Any} value Next element in the sequence.\n\t */\n\tAnonymousObserver.prototype.next = function (value) {\n\t  this._onNext(value);\n\t};\n\n\t/**\n\t * Calls the onError action.\n\t * @param {Any} error The error that has occurred.\n\t */\n\tAnonymousObserver.prototype.error = function (error) {\n\t  this._onError(error);\n\t};\n\n\t/**\n\t *  Calls the onCompleted action.\n\t */\n\tAnonymousObserver.prototype.completed = function () {\n\t  this._onCompleted();\n\t};\n\n\tmodule.exports = AnonymousObserver;\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Observer = __webpack_require__(1);\n\tvar inherits = __webpack_require__(6);\n\tvar NotImplementedError = __webpack_require__(7).NotImplementedError;\n\n\tfunction notImplemented() {\n\t  throw new NotImplementedError();\n\t}\n\n\tfunction AbstractObserver() {\n\t  this.isStopped = false;\n\t  Observer.call(this);\n\t}\n\n\tinherits(AbstractObserver, Observer);\n\n\t// Must be implemented by other observers\n\tAbstractObserver.prototype.next = notImplemented;\n\tAbstractObserver.prototype.error = notImplemented;\n\tAbstractObserver.prototype.completed = notImplemented;\n\n\tAbstractObserver.prototype.onNext = function (value) {\n\t  if (!this.isStopped) {\n\t    this.next(value);\n\t  }\n\t};\n\n\tAbstractObserver.prototype.onError = function (error) {\n\t  if (!this.isStopped) {\n\t    this.isStopped = true;\n\t    this.error(error);\n\t  }\n\t};\n\n\tAbstractObserver.prototype.onCompleted = function () {\n\t  if (!this.isStopped) {\n\t    this.isStopped = true;\n\t    this.completed();\n\t  }\n\t};\n\n\tAbstractObserver.prototype.dispose = function () {\n\t  this.isStopped = true;\n\t};\n\n\tAbstractObserver.prototype.fail = function (e) {\n\t  if (!this.isStopped) {\n\t    this.isStopped = true;\n\t    this.error(e);\n\t    return true;\n\t  }\n\n\t  return false;\n\t};\n\n\tmodule.exports = AbstractObserver;\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\tif (typeof Object.create === 'function') {\n\t  // implementation from standard node.js 'util' module\n\t  module.exports = function inherits(ctor, superCtor) {\n\t    ctor.super_ = superCtor\n\t    ctor.prototype = Object.create(superCtor.prototype, {\n\t      constructor: {\n\t        value: ctor,\n\t        enumerable: false,\n\t        writable: true,\n\t        configurable: true\n\t      }\n\t    });\n\t  };\n\t} else {\n\t  // old school shim for old browsers\n\t  module.exports = function inherits(ctor, superCtor) {\n\t    ctor.super_ = superCtor\n\t    var TempCtor = function () {}\n\t    TempCtor.prototype = superCtor.prototype\n\t    ctor.prototype = new TempCtor()\n\t    ctor.prototype.constructor = ctor\n\t  }\n\t}\n\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tfunction EmptyError() {\n\t  this.message = 'Sequence contains no elements.';\n\t  Error.call(this);\n\t}\n\tEmptyError.prototype = Object.create(Error.prototype);\n\tEmptyError.prototype.name = 'EmptyError';\n\n\tfunction ObjectDisposedError() {\n\t  this.message = 'Object has been disposed';\n\t  Error.call(this);\n\t}\n\tObjectDisposedError.prototype = Object.create(Error.prototype);\n\tObjectDisposedError.prototype.name = 'ObjectDisposedError';\n\n\tfunction ArgumentOutOfRangeError() {\n\t  this.message = 'Argument out of range';\n\t  Error.call(this);\n\t}\n\tArgumentOutOfRangeError.prototype = Object.create(Error.prototype);\n\tArgumentOutOfRangeError.prototype.name = 'ArgumentOutOfRangeError';\n\n\tfunction NotSupportedError(message) {\n\t  this.message = message || 'This operation is not supported';\n\t  Error.call(this);\n\t}\n\tNotSupportedError.prototype = Object.create(Error.prototype);\n\tNotSupportedError.prototype.name = 'NotSupportedError';\n\n\tfunction NotImplementedError(message) {\n\t  this.message = message || 'This operation is not implemented';\n\t  Error.call(this);\n\t}\n\tNotImplementedError.prototype = Object.create(Error.prototype);\n\tNotImplementedError.prototype.name = 'NotImplementedError';\n\n\tfunction CompositeError(errors) {\n\t  this.innerErrors = errors;\n\t  this.message = 'This contains multiple errors. Check the innerErrors';\n\t  Error.call(this);\n\t}\n\n\tCompositeError.prototype = Object.create(Error.prototype);\n\tCompositeError.prototype.name = 'CompositeError';\n\n\tmodule.exports = {\n\t  CompositeError: CompositeError,\n\t  EmptyError: EmptyError,\n\t  ObjectDisposedError: ObjectDisposedError,\n\t  ArgumentOutOfRangeError: ArgumentOutOfRangeError,\n\t  NotSupportedError: NotSupportedError,\n\t  NotImplementedError: NotImplementedError\n\t};\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar create = __webpack_require__(2);\n\tvar isFunction = __webpack_require__(9);\n\n\tfunction Observable() {}\n\n\t/**\n\t* Determines whether the given object is an Observable\n\t* @param {Any} An object to determine whether it is an Observable\n\t* @returns {Boolean} true if an Observable, else false.\n\t*/\n\tObservable.isObservable = function (o) {\n\t  return o && isFunction(o.subscribe);\n\t};\n\n\t/**\n\t *  Subscribes an o to the observable sequence.\n\t *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n\t *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n\t *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n\t *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n\t */\n\tObservable.prototype.subscribe = function (oOrOnNext, onError, onCompleted) {\n\t  return this._subscribe(typeof oOrOnNext === 'object' ? oOrOnNext : create(oOrOnNext, onError, onCompleted));\n\t};\n\n\t/**\n\t * Subscribes to the next value in the sequence with an optional \"this\" argument.\n\t * @param {Function} onNext The function to invoke on each element in the observable sequence.\n\t * @param {Any} [thisArg] Object to use as this when executing callback.\n\t * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n\t */\n\tObservable.prototype.subscribeOnNext = function (onNext, thisArg) {\n\t  return this._subscribe(create(typeof thisArg !== 'undefined' ? function (x) {\n\t    onNext.call(thisArg, x);\n\t  } : onNext));\n\t};\n\n\t/**\n\t * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n\t * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n\t * @param {Any} [thisArg] Object to use as this when executing callback.\n\t * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n\t */\n\tObservable.prototype.subscribeOnError = function (onError, thisArg) {\n\t  return this._subscribe(create(null, typeof thisArg !== 'undefined' ? function (e) {\n\t    onError.call(thisArg, e);\n\t  } : onError));\n\t};\n\n\t/**\n\t * Subscribes to the next value in the sequence with an optional \"this\" argument.\n\t * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n\t * @param {Any} [thisArg] Object to use as this when executing callback.\n\t * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n\t */\n\tObservable.prototype.subscribeOnCompleted = function (onCompleted, thisArg) {\n\t  return this._subscribe(create(null, null, typeof thisArg !== 'undefined' ? function () {\n\t    onCompleted.call(thisArg);\n\t  } : onCompleted));\n\t};\n\n\tObservable.addToObject = function (operators) {\n\t  Object.keys(operators).forEach(function (operator) {\n\t    Observable[operator] = operators[operator];\n\t  });\n\t};\n\n\tObservable.addToPrototype = function (operators) {\n\t  Object.keys(operators).forEach(function (operator) {\n\t    Observable.prototype[operator] = function () {\n\t      var args = [this];\n\t      args.push.apply(args, arguments);\n\t      return operators[operator].apply(null, args);\n\t    };\n\t  });\n\t};\n\n\tmodule.exports = Observable;\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function () {\n\t  var isFn = function (value) {\n\t    return typeof value === 'function' || false;\n\t  };\n\n\t  // fallback for older versions of Chrome and Safari\n\t  if (isFn(/x/)) {\n\t    isFn = function (value) {\n\t      return typeof value === 'function' && Object.prototype.toString.call(value) === '[object Function]';\n\t    };\n\t  }\n\t  return isFn;\n\t}();\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar never = __webpack_require__(29);\n\tvar inherits = __webpack_require__(6);\n\n\tvar LEFT_CHOICE = 'L';\n\tvar RIGHT_CHOICE = 'R';\n\n\tfunction choiceL(state) {\n\t  if (!state.choice) {\n\t    state.choice = LEFT_CHOICE;\n\t    state.rightSubscription.dispose();\n\t  }\n\t}\n\n\tfunction choiceR(state) {\n\t  if (!state.choice) {\n\t    state.choice = RIGHT_CHOICE;\n\t    state.leftSubscription.dispose();\n\t  }\n\t}\n\n\tfunction LeftObserver(o, state) {\n\t  this._o = o;\n\t  this._s = state;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(LeftObserver, AbstractObserver);\n\n\tLeftObserver.prototype.next = function (x) {\n\t  choiceL(this._s);\n\t  this._s.choice === LEFT_CHOICE && this._o.onNext(x);\n\t};\n\n\tLeftObserver.prototype.error = function (e) {\n\t  choiceL(this._s);\n\t  this._s.choice === LEFT_CHOICE && this._o.onError(e);\n\t};\n\n\tLeftObserver.prototype.completed = function () {\n\t  choiceL(this._s);\n\t  this._s.choice === LEFT_CHOICE && this._o.onCompleted();\n\t};\n\n\tfunction RightObserver(o, state) {\n\t  this._o = o;\n\t  this._s = state;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(RightObserver, AbstractObserver);\n\n\tRightObserver.prototype.next = function (x) {\n\t  choiceR(this._s);\n\t  this._s.choice === RIGHT_CHOICE && this._o.onNext(x);\n\t};\n\n\tRightObserver.prototype.error = function (e) {\n\t  choiceR(this._s);\n\t  this._s.choice === RIGHT_CHOICE && this._o.onError(e);\n\t};\n\n\tRightObserver.prototype.completed = function () {\n\t  choiceR(this._s);\n\t  this._s.choice === RIGHT_CHOICE && this._o.onCompleted();\n\t};\n\n\tfunction AmbObservable(leftSource, rightSource) {\n\t  isPromise(leftSource) && (leftSource = fromPromise(leftSource));\n\t  isPromise(rightSource) && (rightSource = fromPromise(rightSource));\n\n\t  this._l = leftSource;\n\t  this._r = rightSource;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(AmbObservable, ObservableBase);\n\n\tAmbObservable.prototype.subscribeCore = function (o) {\n\t  var state = {\n\t    choice: null,\n\t    leftSubscription: new SingleAssignmentDisposable(),\n\t    rightSubscription: new SingleAssignmentDisposable()\n\t  };\n\n\t  state.leftSubscription.setDisposable(this._l.subscribe(new LeftObserver(o, state)));\n\t  state.rightSubscription.setDisposable(this._r.subscribe(new RightObserver(o, state)));\n\n\t  return new BinaryDisposable(state.leftSubscription, state.rightSubscription);\n\t};\n\n\t/**\n\t * Propagates the observable sequence or Promise that reacts first.\n\t * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n\t */\n\tmodule.exports = function amb() {\n\t  var acc = never();\n\t  for (var i = 0, len = arguments.length; i < len; i++) {\n\t    acc = new AmbObservable(acc, arguments[i]);\n\t  }\n\t  return acc;\n\t};\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar inherits = __webpack_require__(6);\n\tvar isFunction = __webpack_require__(9);\n\tvar errors = __webpack_require__(7);\n\tvar Observable = __webpack_require__(8);\n\tvar Scheduler = __webpack_require__(12);\n\tvar Disposable = __webpack_require__(13);\n\tvar AutoDetachObserver = __webpack_require__(26);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj,\n\t    thrower = tryCatchUtils.thrower;\n\n\tfunction fixSubscriber(subscriber) {\n\t  return subscriber && isFunction(subscriber.dispose) ? subscriber : isFunction(subscriber) ? Disposable.create(subscriber) : Disposable.empty;\n\t}\n\n\tfunction setDisposable(s, state) {\n\t  var ado = state[0],\n\t      self = state[1];\n\t  var sub = tryCatch(self.subscribeCore).call(self, ado);\n\t  if (sub === errorObj && !ado.fail(sub.e)) {\n\t    thrower(sub.e);\n\t  }\n\t  ado.setDisposable(fixSubscriber(sub));\n\t}\n\n\tfunction ObservableBase() {\n\t  Observable.call(this);\n\t}\n\n\tinherits(ObservableBase, Observable);\n\n\tObservableBase.prototype._subscribe = function (o) {\n\t  var ado = new AutoDetachObserver(o),\n\t      state = [ado, this];\n\n\t  if (Scheduler.queue.scheduleRequired()) {\n\t    Scheduler.queue.schedule(state, setDisposable);\n\t  } else {\n\t    setDisposable(null, state);\n\t  }\n\t  return ado;\n\t};\n\n\tObservableBase.prototype.subscribeCore = function () {\n\t  throw new errors.NotImplementedError();\n\t};\n\n\tmodule.exports = ObservableBase;\n\n/***/ },\n/* 12 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n\tvar errors = __webpack_require__(7);\n\tvar Disposable = __webpack_require__(13);\n\tvar CompositeDisposable = __webpack_require__(14);\n\n\tfunction Scheduler() {}\n\n\t/** Determines whether the given object is a scheduler */\n\tScheduler.isScheduler = function (s) {\n\t  return s instanceof Scheduler;\n\t};\n\n\t/**\n\t* Schedules an action to be executed.\n\t* @param state State passed to the action to be executed.\n\t* @param {Function} action Action to be executed.\n\t* @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n\t*/\n\tScheduler.prototype.schedule = function (state, action) {\n\t  throw new errors.NotImplementedError();\n\t};\n\n\t/**\n\t* Schedules an action to be executed after dueTime.\n\t* @param state State passed to the action to be executed.\n\t* @param {Function} action Action to be executed.\n\t* @param {Number} dueTime Relative time after which to execute the action.\n\t* @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n\t*/\n\tScheduler.prototype.scheduleFuture = function (state, dueTime, action) {\n\t  var dt = dueTime;\n\t  dt instanceof Date && (dt = dt - this.now());\n\t  dt = Scheduler.normalize(dt);\n\n\t  if (dt === 0) {\n\t    return this.schedule(state, action);\n\t  }\n\n\t  return this._scheduleFuture(state, dt, action);\n\t};\n\n\tScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n\t  throw new errors.NotImplementedError();\n\t};\n\n\tfunction PeriodicDisposable(id) {\n\t  this._id = id;\n\t  this.isDisposed = false;\n\t}\n\n\tPeriodicDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this.isDisposed = true;\n\t    global.clearInterval(this._id);\n\t  }\n\t};\n\n\t/**\n\t * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n\t * @param {Mixed} state Initial state passed to the action upon the first iteration.\n\t * @param {Number} period Period for running the work periodically.\n\t * @param {Function} action Action to be executed, potentially updating the state.\n\t * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n\t */\n\tScheduler.prototype.schedulePeriodic = function (state, period, action) {\n\t  if (typeof global.setInterval === 'undefined') {\n\t    throw new errors.NotSupportedError();\n\t  }\n\t  period = Scheduler.normalize(period);\n\t  var s = state,\n\t      id = global.setInterval(function () {\n\t    s = action(s);\n\t  }, period);\n\t  return new PeriodicDisposable(id);\n\t};\n\n\tfunction invokeRecImmediate(scheduler, pair) {\n\t  var state = pair[0],\n\t      action = pair[1],\n\t      group = new CompositeDisposable();\n\t  action(state, innerAction);\n\t  return group;\n\n\t  function innerAction(state2) {\n\t    var isAdded = false,\n\t        isDone = false;\n\n\t    var d = scheduler.schedule(state2, scheduleWork);\n\t    if (!isDone) {\n\t      group.add(d);\n\t      isAdded = true;\n\t    }\n\n\t    function scheduleWork(_, state3) {\n\t      if (isAdded) {\n\t        group.remove(d);\n\t      } else {\n\t        isDone = true;\n\t      }\n\t      action(state3, innerAction);\n\t      return Disposable.empty;\n\t    }\n\t  }\n\t}\n\n\tfunction invokeRecDate(scheduler, pair) {\n\t  var state = pair[0],\n\t      action = pair[1],\n\t      group = new CompositeDisposable();\n\t  action(state, innerAction);\n\t  return group;\n\n\t  function innerAction(state2, dueTime1) {\n\t    var isAdded = false,\n\t        isDone = false;\n\n\t    var d = scheduler.scheduleFuture(state2, dueTime1, scheduleWork);\n\t    if (!isDone) {\n\t      group.add(d);\n\t      isAdded = true;\n\t    }\n\n\t    function scheduleWork(_, state3) {\n\t      if (isAdded) {\n\t        group.remove(d);\n\t      } else {\n\t        isDone = true;\n\t      }\n\t      action(state3, innerAction);\n\t      return Disposable.empty;\n\t    }\n\t  }\n\t}\n\n\t/**\n\t * Schedules an action to be executed recursively.\n\t * @param {Mixed} state State passed to the action to be executed.\n\t * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n\t * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n\t */\n\tScheduler.prototype.scheduleRecursive = function (state, action) {\n\t  return this.schedule([state, action], invokeRecImmediate);\n\t};\n\n\t/**\n\t * Schedules an action to be executed recursively after a specified relative or absolute due time.\n\t * @param {Mixed} state State passed to the action to be executed.\n\t * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n\t * @param {Number | Date} dueTime Relative or absolute time after which to execute the action for the first time.\n\t * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n\t */\n\tScheduler.prototype.scheduleRecursiveFuture = function (state, dueTime, action) {\n\t  return this.scheduleFuture([state, action], dueTime, invokeRecDate);\n\t};\n\n\tvar defaultNow = function () {\n\t  return !!Date.now ? Date.now : function () {\n\t    return +new Date();\n\t  };\n\t}();\n\n\t/** Gets the current time according to the local machine's system clock. */\n\tScheduler.now = defaultNow;\n\n\t/** Gets the current time according to the local machine's system clock. */\n\tScheduler.prototype.now = defaultNow;\n\n\t/**\n\t * Normalizes the specified TimeSpan value to a positive value.\n\t * @param {Number} timeSpan The time span value to normalize.\n\t * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n\t */\n\tScheduler.normalize = function (timeSpan) {\n\t  timeSpan < 0 && (timeSpan = 0);\n\t  return timeSpan;\n\t};\n\n\tmodule.exports = Scheduler;\n\n\tvar CurrentThreadScheduler = __webpack_require__(15);\n\tvar ImmediateScheduler = __webpack_require__(21);\n\tvar DefaultScheduler = __webpack_require__(22);\n\tvar CatchScheduler = __webpack_require__(25);\n\n\tScheduler.queue = Scheduler.currentThread = new CurrentThreadScheduler();\n\tScheduler.async = Scheduler['default'] = Scheduler.timeout = new DefaultScheduler();\n\tScheduler.immediate = new ImmediateScheduler();\n\n\t/**\n\t * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n\t * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n\t * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n\t */\n\tScheduler.prototype['catch'] = function (handler) {\n\t  return new CatchScheduler(this, handler);\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 13 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar noop = __webpack_require__(3);\n\tvar isFunction = __webpack_require__(9);\n\tvar ObjectDisposedError = __webpack_require__(7).ObjectDisposedError;\n\n\t/**\n\t * Provides a set of static methods for creating Disposables.\n\t * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n\t */\n\tfunction Disposable(action) {\n\t  this.isDisposed = false;\n\t  this.action = action || noop;\n\t}\n\n\t/** Performs the task of cleaning up resources. */\n\tDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this.action();\n\t    this.isDisposed = true;\n\t  }\n\t};\n\n\t/**\n\t * Creates a disposable object that invokes the specified action when disposed.\n\t * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n\t * @return {Disposable} The disposable object that runs the given action upon disposal.\n\t */\n\tDisposable.create = function (action) {\n\t  return new Disposable(action);\n\t};\n\n\t/**\n\t * Gets the disposable that does nothing when disposed.\n\t */\n\tDisposable.empty = { dispose: noop };\n\n\t/**\n\t * Validates whether the given object is a disposable\n\t * @param {Object} Object to test whether it has a dispose method\n\t * @returns {Boolean} true if a disposable object, else false.\n\t */\n\tDisposable.isDisposable = function (d) {\n\t  return d && isFunction(d.dispose);\n\t};\n\n\tDisposable.checkDisposed = function (disposable) {\n\t  if (disposable.isDisposed) {\n\t    throw new ObjectDisposedError();\n\t  }\n\t};\n\n\tDisposable._fixup = function (result) {\n\t  return Disposable.isDisposable(result) ? result : Disposable.empty;\n\t};\n\n\tmodule.exports = Disposable;\n\n/***/ },\n/* 14 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\t/**\n\t * Represents a group of disposable resources that are disposed together.\n\t * @constructor\n\t */\n\n\tfunction CompositeDisposable() {\n\t  var args = [],\n\t      i,\n\t      len;\n\t  if (Array.isArray(arguments[0])) {\n\t    args = arguments[0];\n\t    len = args.length;\n\t  } else {\n\t    len = arguments.length;\n\t    args = new Array(len);\n\t    for (i = 0; i < len; i++) {\n\t      args[i] = arguments[i];\n\t    }\n\t  }\n\t  this.disposables = args;\n\t  this.isDisposed = false;\n\t  this.length = args.length;\n\t}\n\n\t/**\n\t * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n\t * @param {Mixed} item Disposable to add.\n\t */\n\tCompositeDisposable.prototype.add = function (item) {\n\t  if (this.isDisposed) {\n\t    item.dispose();\n\t  } else {\n\t    this.disposables.push(item);\n\t    this.length++;\n\t  }\n\t};\n\n\t/**\n\t * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n\t * @param {Mixed} item Disposable to remove.\n\t * @returns {Boolean} true if found; false otherwise.\n\t */\n\tCompositeDisposable.prototype.remove = function (item) {\n\t  var shouldDispose = false;\n\t  if (!this.isDisposed) {\n\t    var idx = this.disposables.indexOf(item);\n\t    if (idx !== -1) {\n\t      shouldDispose = true;\n\t      this.disposables.splice(idx, 1);\n\t      this.length--;\n\t      item.dispose();\n\t    }\n\t  }\n\t  return shouldDispose;\n\t};\n\n\t/**\n\t *  Disposes all disposables in the group and removes them from the group.\n\t */\n\tCompositeDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this.isDisposed = true;\n\t    var len = this.disposables.length,\n\t        currentDisposables = new Array(len);\n\t    for (var i = 0; i < len; i++) {\n\t      currentDisposables[i] = this.disposables[i];\n\t    }\n\t    this.disposables = [];\n\t    this.length = 0;\n\n\t    for (i = 0; i < len; i++) {\n\t      currentDisposables[i].dispose();\n\t    }\n\t  }\n\t};\n\n\tmodule.exports = CompositeDisposable;\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Scheduler = __webpack_require__(12);\n\tvar ScheduledItem = __webpack_require__(16);\n\tvar PriorityQueue = __webpack_require__(19);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj,\n\t    thrower = tryCatchUtils.thrower;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction CurrentThreadScheduler() {\n\t  Scheduler.call(this);\n\t}\n\n\tCurrentThreadScheduler.queue = null;\n\n\tinherits(CurrentThreadScheduler, Scheduler);\n\n\tfunction runTrampoline() {\n\t  while (CurrentThreadScheduler.queue.length > 0) {\n\t    var item = CurrentThreadScheduler.queue.dequeue();\n\t    !item.isCancelled() && item.invoke();\n\t  }\n\t}\n\n\tCurrentThreadScheduler.prototype.schedule = function (state, action) {\n\t  var si = new ScheduledItem(this, state, action, this.now());\n\n\t  if (!CurrentThreadScheduler.queue) {\n\t    CurrentThreadScheduler.queue = new PriorityQueue(4);\n\t    CurrentThreadScheduler.queue.enqueue(si);\n\n\t    var result = tryCatch(runTrampoline)();\n\t    CurrentThreadScheduler.queue = null;\n\t    if (result === errorObj) {\n\t      thrower(result.e);\n\t    }\n\t  } else {\n\t    CurrentThreadScheduler.queue.enqueue(si);\n\t  }\n\t  return si.disposable;\n\t};\n\n\tCurrentThreadScheduler.prototype.scheduleRequired = function () {\n\t  return !CurrentThreadScheduler.queue;\n\t};\n\n\tmodule.exports = CurrentThreadScheduler;\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Disposable = __webpack_require__(13);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar cmp = __webpack_require__(18);\n\n\tfunction ScheduledItem(scheduler, state, action, dueTime, comparer) {\n\t  this.scheduler = scheduler;\n\t  this.state = state;\n\t  this.action = action;\n\t  this.dueTime = dueTime;\n\t  this.comparer = comparer || cmp;\n\t  this.disposable = new SingleAssignmentDisposable();\n\t}\n\n\tScheduledItem.prototype.invoke = function () {\n\t  this.disposable.setDisposable(this.invokeCore());\n\t};\n\n\tScheduledItem.prototype.compareTo = function (other) {\n\t  return this.comparer(this.dueTime, other.dueTime);\n\t};\n\n\tScheduledItem.prototype.isCancelled = function () {\n\t  return this.disposable.isDisposed;\n\t};\n\n\tScheduledItem.prototype.invokeCore = function () {\n\t  return Disposable._fixup(this.action(this.scheduler, this.state));\n\t};\n\n\tmodule.exports = ScheduledItem;\n\n/***/ },\n/* 17 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tfunction SingleAssignmentDisposable() {\n\t  this.isDisposed = false;\n\t  this._current = null;\n\t}\n\n\tSingleAssignmentDisposable.prototype.getDisposable = function () {\n\t  return this._current;\n\t};\n\n\tSingleAssignmentDisposable.prototype.setDisposable = function (value) {\n\t  if (this._current) {\n\t    throw new Error('Disposable has already been assigned');\n\t  }\n\t  var shouldDispose = this.isDisposed;\n\t  !shouldDispose && (this._current = value);\n\t  shouldDispose && value && value.dispose();\n\t};\n\n\tSingleAssignmentDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this.isDisposed = true;\n\t    var old = this._current;\n\t    this._current = null;\n\t    old && old.dispose();\n\t  }\n\t};\n\n\tmodule.exports = SingleAssignmentDisposable;\n\n/***/ },\n/* 18 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function comparer(x, y) {\n\t  if (x > y) {\n\t    return 1;\n\t  }\n\t  if (y > x) {\n\t    return -1;\n\t  }\n\t  return 0;\n\t};\n\n/***/ },\n/* 19 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tfunction IndexedItem(id, value) {\n\t  this.id = id;\n\t  this.value = value;\n\t}\n\n\tIndexedItem.prototype.compareTo = function (other) {\n\t  var c = this.value.compareTo(other.value);\n\t  c === 0 && (c = this.id - other.id);\n\t  return c;\n\t};\n\n\tfunction PriorityQueue(capacity) {\n\t  this.items = new Array(capacity);\n\t  this.length = 0;\n\t}\n\n\tPriorityQueue.prototype.isHigherPriority = function (left, right) {\n\t  return this.items[left].compareTo(this.items[right]) < 0;\n\t};\n\n\tPriorityQueue.prototype.percolate = function (index) {\n\t  if (index >= this.length || index < 0) {\n\t    return;\n\t  }\n\t  var parent = index - 1 >> 1;\n\t  if (parent < 0 || parent === index) {\n\t    return;\n\t  }\n\t  if (this.isHigherPriority(index, parent)) {\n\t    var temp = this.items[index];\n\t    this.items[index] = this.items[parent];\n\t    this.items[parent] = temp;\n\t    this.percolate(parent);\n\t  }\n\t};\n\n\tPriorityQueue.prototype.heapify = function (index) {\n\t  +index || (index = 0);\n\t  if (index >= this.length || index < 0) {\n\t    return;\n\t  }\n\t  var left = 2 * index + 1,\n\t      right = 2 * index + 2,\n\t      first = index;\n\t  if (left < this.length && this.isHigherPriority(left, first)) {\n\t    first = left;\n\t  }\n\t  if (right < this.length && this.isHigherPriority(right, first)) {\n\t    first = right;\n\t  }\n\t  if (first !== index) {\n\t    var temp = this.items[index];\n\t    this.items[index] = this.items[first];\n\t    this.items[first] = temp;\n\t    this.heapify(first);\n\t  }\n\t};\n\n\tPriorityQueue.prototype.peek = function () {\n\t  return this.items[0].value;\n\t};\n\n\tPriorityQueue.prototype.removeAt = function (index) {\n\t  this.items[index] = this.items[--this.length];\n\t  this.items[this.length] = undefined;\n\t  this.heapify();\n\t};\n\n\tPriorityQueue.prototype.dequeue = function () {\n\t  var result = this.peek();\n\t  this.removeAt(0);\n\t  return result;\n\t};\n\n\tPriorityQueue.prototype.enqueue = function (item) {\n\t  var index = this.length++;\n\t  this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n\t  this.percolate(index);\n\t};\n\n\tPriorityQueue.prototype.remove = function (item) {\n\t  for (var i = 0; i < this.length; i++) {\n\t    if (this.items[i].value === item) {\n\t      this.removeAt(i);\n\t      return true;\n\t    }\n\t  }\n\t  return false;\n\t};\n\n\tPriorityQueue.count = 0;\n\n\tmodule.exports = PriorityQueue;\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar isFunction = __webpack_require__(9);\n\tvar errorObj = module.exports.errorObj = { e: {} };\n\n\tfunction tryCatcherGen(tryCatchTarget) {\n\t  return function tryCatcher() {\n\t    try {\n\t      return tryCatchTarget.apply(this, arguments);\n\t    } catch (e) {\n\t      errorObj.e = e;\n\t      return errorObj;\n\t    }\n\t  };\n\t}\n\n\tmodule.exports.tryCatch = function tryCatch(fn) {\n\t  if (!isFunction(fn)) {\n\t    throw new TypeError('fn must be a function');\n\t  }\n\t  return tryCatcherGen(fn);\n\t};\n\n\tmodule.exports.thrower = function thrower(e) {\n\t  throw e;\n\t};\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Scheduler = __webpack_require__(12);\n\tvar Disposable = __webpack_require__(13);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction ImmediateScheduler() {\n\t  Scheduler.call(this);\n\t}\n\n\tinherits(ImmediateScheduler, Scheduler);\n\n\tImmediateScheduler.prototype.schedule = function (state, action) {\n\t  return Disposable._fixup(action(this, state));\n\t};\n\n\tmodule.exports = ImmediateScheduler;\n\n/***/ },\n/* 22 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global, process) {'use strict';\n\n\tvar Disposable = __webpack_require__(13);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar Scheduler = __webpack_require__(12);\n\tvar isFunction = __webpack_require__(9);\n\tvar noop = __webpack_require__(3);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj,\n\t    thrower = tryCatchUtils.thrower;\n\tvar inherits = __webpack_require__(6);\n\n\tvar scheduleMethod, clearMethod;\n\n\t(function () {\n\n\t  var nextHandle = 1,\n\t      tasksByHandle = {},\n\t      currentlyRunning = false;\n\n\t  clearMethod = function (handle) {\n\t    delete tasksByHandle[handle];\n\t  };\n\n\t  function runTask(handle) {\n\t    if (currentlyRunning) {\n\t      global.setTimeout(function () {\n\t        runTask(handle);\n\t      }, 0);\n\t    } else {\n\t      var task = tasksByHandle[handle];\n\t      if (task) {\n\t        currentlyRunning = true;\n\t        var result = tryCatch(task)();\n\t        clearMethod(handle);\n\t        currentlyRunning = false;\n\t        if (result === errorObj) {\n\t          thrower(result.e);\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  var setImmediate = global.setImmediate;\n\n\t  function postMessageSupported() {\n\t    // Ensure not in a worker\n\t    if (!global.postMessage || global.importScripts) {\n\t      return false;\n\t    }\n\t    var isAsync = false,\n\t        oldHandler = global.onmessage;\n\t    // Test for async\n\t    global.onmessage = function () {\n\t      isAsync = true;\n\t    };\n\t    global.postMessage('', '*');\n\t    global.onmessage = oldHandler;\n\n\t    return isAsync;\n\t  }\n\n\t  // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n\t  if (isFunction(setImmediate)) {\n\t    scheduleMethod = function (action) {\n\t      var id = nextHandle++;\n\t      tasksByHandle[id] = action;\n\t      setImmediate(function () {\n\t        runTask(id);\n\t      });\n\n\t      return id;\n\t    };\n\t  } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n\t    scheduleMethod = function (action) {\n\t      var id = nextHandle++;\n\t      tasksByHandle[id] = action;\n\t      process.nextTick(function () {\n\t        runTask(id);\n\t      });\n\n\t      return id;\n\t    };\n\t  } else if (postMessageSupported()) {\n\t    var MSG_PREFIX = 'ms.rx.schedule' + Math.random();\n\n\t    var onGlobalPostMessage = function (event) {\n\t      // Only if we're a match to avoid any other global events\n\t      if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n\t        runTask(event.data.substring(MSG_PREFIX.length));\n\t      }\n\t    };\n\n\t    global.addEventListener('message', onGlobalPostMessage, false);\n\n\t    scheduleMethod = function (action) {\n\t      var id = nextHandle++;\n\t      tasksByHandle[id] = action;\n\t      global.postMessage(MSG_PREFIX + id, '*');\n\t      return id;\n\t    };\n\t  } else if (!!global.MessageChannel) {\n\t    var channel = new global.MessageChannel();\n\n\t    channel.port1.onmessage = function (e) {\n\t      runTask(e.data);\n\t    };\n\n\t    scheduleMethod = function (action) {\n\t      var id = nextHandle++;\n\t      tasksByHandle[id] = action;\n\t      channel.port2.postMessage(id);\n\t      return id;\n\t    };\n\t  } else if ('document' in global && 'onreadystatechange' in global.document.createElement('script')) {\n\n\t    scheduleMethod = function (action) {\n\t      var scriptElement = global.document.createElement('script');\n\t      var id = nextHandle++;\n\t      tasksByHandle[id] = action;\n\n\t      scriptElement.onreadystatechange = function () {\n\t        runTask(id);\n\t        scriptElement.onreadystatechange = null;\n\t        scriptElement.parentNode.removeChild(scriptElement);\n\t        scriptElement = null;\n\t      };\n\t      global.document.documentElement.appendChild(scriptElement);\n\t      return id;\n\t    };\n\t  } else {\n\t    scheduleMethod = function (action) {\n\t      var id = nextHandle++;\n\t      tasksByHandle[id] = action;\n\t      global.setTimeout(function () {\n\t        runTask(id);\n\t      }, 0);\n\n\t      return id;\n\t    };\n\t  }\n\t})();\n\n\t/**\n\t* Gets a scheduler that schedules work via a timed callback based upon platform.\n\t*/\n\tfunction DefaultScheduler() {\n\t  Scheduler.call(this);\n\t}\n\n\tinherits(DefaultScheduler, Scheduler);\n\n\tfunction scheduleAction(disposable, action, scheduler, state) {\n\t  return function schedule() {\n\t    disposable.setDisposable(Disposable._fixup(action(scheduler, state)));\n\t  };\n\t}\n\n\tfunction ClearDisposable(method, id) {\n\t  this._id = id;\n\t  this._method = method;\n\t  this.isDisposed = false;\n\t}\n\n\tClearDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this.isDisposed = true;\n\t    this._method.call(null, this._id);\n\t  }\n\t};\n\n\tDefaultScheduler.prototype.schedule = function (state, action) {\n\t  var disposable = new SingleAssignmentDisposable(),\n\t      id = scheduleMethod(scheduleAction(disposable, action, this, state));\n\n\t  return new BinaryDisposable(disposable, new ClearDisposable(clearMethod, id));\n\t};\n\n\tDefaultScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n\t  if (dueTime === 0) {\n\t    return this.schedule(state, action);\n\t  }\n\n\t  var disposable = new SingleAssignmentDisposable(),\n\t      id = global.setTimeout(scheduleAction(disposable, action, this, state), dueTime);\n\n\t  return new BinaryDisposable(disposable, new ClearDisposable(global.clearTimeout, id));\n\t};\n\n\tmodule.exports = DefaultScheduler;\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(23)))\n\n/***/ },\n/* 23 */\n/***/ function(module, exports) {\n\n\t// shim for using process in browser\n\n\tvar process = module.exports = {};\n\tvar queue = [];\n\tvar draining = false;\n\tvar currentQueue;\n\tvar queueIndex = -1;\n\n\tfunction cleanUpNextTick() {\n\t    draining = false;\n\t    if (currentQueue.length) {\n\t        queue = currentQueue.concat(queue);\n\t    } else {\n\t        queueIndex = -1;\n\t    }\n\t    if (queue.length) {\n\t        drainQueue();\n\t    }\n\t}\n\n\tfunction drainQueue() {\n\t    if (draining) {\n\t        return;\n\t    }\n\t    var timeout = setTimeout(cleanUpNextTick);\n\t    draining = true;\n\n\t    var len = queue.length;\n\t    while(len) {\n\t        currentQueue = queue;\n\t        queue = [];\n\t        while (++queueIndex < len) {\n\t            if (currentQueue) {\n\t                currentQueue[queueIndex].run();\n\t            }\n\t        }\n\t        queueIndex = -1;\n\t        len = queue.length;\n\t    }\n\t    currentQueue = null;\n\t    draining = false;\n\t    clearTimeout(timeout);\n\t}\n\n\tprocess.nextTick = function (fun) {\n\t    var args = new Array(arguments.length - 1);\n\t    if (arguments.length > 1) {\n\t        for (var i = 1; i < arguments.length; i++) {\n\t            args[i - 1] = arguments[i];\n\t        }\n\t    }\n\t    queue.push(new Item(fun, args));\n\t    if (queue.length === 1 && !draining) {\n\t        setTimeout(drainQueue, 0);\n\t    }\n\t};\n\n\t// v8 likes predictible objects\n\tfunction Item(fun, array) {\n\t    this.fun = fun;\n\t    this.array = array;\n\t}\n\tItem.prototype.run = function () {\n\t    this.fun.apply(null, this.array);\n\t};\n\tprocess.title = 'browser';\n\tprocess.browser = true;\n\tprocess.env = {};\n\tprocess.argv = [];\n\tprocess.version = ''; // empty string to avoid regexp issues\n\tprocess.versions = {};\n\n\tfunction noop() {}\n\n\tprocess.on = noop;\n\tprocess.addListener = noop;\n\tprocess.once = noop;\n\tprocess.off = noop;\n\tprocess.removeListener = noop;\n\tprocess.removeAllListeners = noop;\n\tprocess.emit = noop;\n\n\tprocess.binding = function (name) {\n\t    throw new Error('process.binding is not supported');\n\t};\n\n\tprocess.cwd = function () { return '/' };\n\tprocess.chdir = function (dir) {\n\t    throw new Error('process.chdir is not supported');\n\t};\n\tprocess.umask = function() { return 0; };\n\n\n/***/ },\n/* 24 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tfunction BinaryDisposable(first, second) {\n\t  this._first = first;\n\t  this._second = second;\n\t  this.isDisposed = false;\n\t}\n\n\tBinaryDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this.isDisposed = true;\n\t    var old1 = this._first;\n\t    this._first = null;\n\t    old1 && old1.dispose();\n\t    var old2 = this._second;\n\t    this._second = null;\n\t    old2 && old2.dispose();\n\t  }\n\t};\n\n\tmodule.exports = BinaryDisposable;\n\n/***/ },\n/* 25 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Scheduler = __webpack_require__(12);\n\tvar Disposable = __webpack_require__(13);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj,\n\t    thrower = tryCatchUtils.thrower;\n\n\tfunction CatchScheduler(scheduler, handler) {\n\t  this._scheduler = scheduler;\n\t  this._handler = handler;\n\t  this._recursiveOriginal = null;\n\t  this._recursiveWrapper = null;\n\t  Scheduler.call(this);\n\t}\n\n\tinherits(CatchScheduler, Scheduler);\n\n\tCatchScheduler.prototype.schedule = function (state, action) {\n\t  return this._scheduler.schedule(state, this._wrap(action));\n\t};\n\n\tCatchScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n\t  return this._scheduler.schedule(state, dueTime, this._wrap(action));\n\t};\n\n\tCatchScheduler.prototype.now = function () {\n\t  return this._scheduler.now();\n\t};\n\n\tCatchScheduler.prototype._clone = function (scheduler) {\n\t  return new CatchScheduler(scheduler, this._handler);\n\t};\n\n\tCatchScheduler.prototype._wrap = function (action) {\n\t  var parent = this;\n\t  return function (self, state) {\n\t    var res = tryCatch(action)(parent._getRecursiveWrapper(self), state);\n\t    if (res === errorObj) {\n\t      if (!parent._handler(res.e)) {\n\t        thrower(res.e);\n\t      }\n\t      return Disposable.empty;\n\t    }\n\t    return Disposable._fixup(res);\n\t  };\n\t};\n\n\tCatchScheduler.prototype._getRecursiveWrapper = function (scheduler) {\n\t  if (this._recursiveOriginal !== scheduler) {\n\t    this._recursiveOriginal = scheduler;\n\t    var wrapper = this._clone(scheduler);\n\t    wrapper._recursiveOriginal = scheduler;\n\t    wrapper._recursiveWrapper = wrapper;\n\t    this._recursiveWrapper = wrapper;\n\t  }\n\t  return this._recursiveWrapper;\n\t};\n\n\tCatchScheduler.prototype.schedulePeriodic = function (state, period, action) {\n\t  var self = this,\n\t      failed = false,\n\t      d = new SingleAssignmentDisposable();\n\n\t  d.setDisposable(this._scheduler.schedulePeriodic(state, period, function (state1) {\n\t    if (failed) {\n\t      return null;\n\t    }\n\t    var res = tryCatch(action)(state1);\n\t    if (res === errorObj) {\n\t      failed = true;\n\t      if (!self._handler(res.e)) {\n\t        thrower(res.e);\n\t      }\n\t      d.dispose();\n\t      return null;\n\t    }\n\t    return res;\n\t  }));\n\n\t  return d;\n\t};\n\n\tmodule.exports = CatchScheduler;\n\n/***/ },\n/* 26 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj,\n\t    thrower = tryCatchUtils.thrower;\n\n\tfunction AutoDetachObserver(observer) {\n\t  AbstractObserver.call(this);\n\t  this.observer = observer;\n\t  this.m = new SingleAssignmentDisposable();\n\t}\n\n\tinherits(AutoDetachObserver, AbstractObserver);\n\n\tAutoDetachObserver.prototype.next = function (value) {\n\t  var result = tryCatch(this.observer.onNext).call(this.observer, value);\n\t  if (result === errorObj) {\n\t    this.dispose();\n\t    thrower(result.e);\n\t  }\n\t};\n\n\tAutoDetachObserver.prototype.error = function (err) {\n\t  var result = tryCatch(this.observer.onError).call(this.observer, err);\n\t  this.dispose();\n\t  result === errorObj && thrower(result.e);\n\t};\n\n\tAutoDetachObserver.prototype.completed = function () {\n\t  var result = tryCatch(this.observer.onCompleted).call(this.observer);\n\t  this.dispose();\n\t  result === errorObj && thrower(result.e);\n\t};\n\n\tAutoDetachObserver.prototype.setDisposable = function (value) {\n\t  this.m.setDisposable(value);\n\t};\n\tAutoDetachObserver.prototype.getDisposable = function () {\n\t  return this.m.getDisposable();\n\t};\n\n\tAutoDetachObserver.prototype.dispose = function () {\n\t  AbstractObserver.prototype.dispose.call(this);\n\t  this.m.dispose();\n\t};\n\n\tmodule.exports = AutoDetachObserver;\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar Scheduler = __webpack_require__(12);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar isFunction = __webpack_require__(9);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction FromPromiseObservable(p, s) {\n\t  this._p = p;\n\t  this._s = s;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(FromPromiseObservable, ObservableBase);\n\n\tfunction scheduleNext(s, state) {\n\t  var o = state[0],\n\t      data = state[1];\n\t  o.onNext(data);\n\t  o.onCompleted();\n\t}\n\n\tfunction scheduleError(s, state) {\n\t  var o = state[0],\n\t      err = state[1];\n\t  o.onError(err);\n\t}\n\n\tFromPromiseObservable.prototype.subscribeCore = function (o) {\n\t  var sad = new SingleAssignmentDisposable(),\n\t      self = this,\n\t      p = self._p;\n\n\t  if (isFunction(p)) {\n\t    p = tryCatch(p)();\n\t    if (p === errorObj) {\n\t      o.onError(p.e);\n\t      return sad;\n\t    }\n\t  }\n\n\t  p.then(function (data) {\n\t    sad.setDisposable(self._s.schedule([o, data], scheduleNext));\n\t  }, function (err) {\n\t    sad.setDisposable(self._s.schedule([o, err], scheduleError));\n\t  });\n\n\t  return sad;\n\t};\n\n\t/**\n\t* Converts a Promise to an Observable sequence\n\t* @param {Promise|Function} An ES6 Compliant promise or a function that returns one\n\t* @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n\t*/\n\tmodule.exports = function fromPromise(promise, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  return new FromPromiseObservable(promise, scheduler);\n\t};\n\n/***/ },\n/* 28 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar isFunction = __webpack_require__(9);\n\n\tmodule.exports = function isPromise(p) {\n\t  return p && isFunction(p.then);\n\t};\n\n/***/ },\n/* 29 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar Disposable = __webpack_require__(13);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction NeverObservable() {\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(NeverObservable, ObservableBase);\n\n\tNeverObservable.prototype.subscribeCore = function () {\n\t  return Disposable.empty;\n\t};\n\n\tvar NEVER_OBSERVABLE = new NeverObservable();\n\n\t/**\n\t * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n\t * @returns {Observable} An observable sequence whose observers will never get called.\n\t */\n\tmodule.exports = function never() {\n\t  return NEVER_OBSERVABLE;\n\t};\n\n/***/ },\n/* 30 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AsyncSubject = __webpack_require__(31);\n\tvar asObservable = __webpack_require__(35);\n\tvar isFunction = __webpack_require__(9);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction createCbHandler(o, ctx, selector) {\n\t  return function handler() {\n\t    var len = arguments.length,\n\t        results = new Array(len);\n\t    for (var i = 0; i < len; i++) {\n\t      results[i] = arguments[i];\n\t    }\n\n\t    if (isFunction(selector)) {\n\t      results = tryCatch(selector).apply(ctx, results);\n\t      if (results === errorObj) {\n\t        return o.onError(results.e);\n\t      }\n\t      o.onNext(results);\n\t    } else {\n\t      if (results.length <= 1) {\n\t        o.onNext(results[0]);\n\t      } else {\n\t        o.onNext(results);\n\t      }\n\t    }\n\n\t    o.onCompleted();\n\t  };\n\t}\n\n\tfunction createCbObservable(fn, ctx, selector, args) {\n\t  var o = new AsyncSubject();\n\n\t  args.push(createCbHandler(o, ctx, selector));\n\t  var res = tryCatch(fn).apply(ctx, args);\n\t  if (res === errorObj) {\n\t    o.onError(res.e);\n\t  }\n\n\t  return asObservable(o);\n\t}\n\n\t/**\n\t * Converts a callback function to an observable sequence.\n\t *\n\t * @param {Function} fn Function with a callback as the last parameter to convert to an Observable sequence.\n\t * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n\t * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n\t * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n\t */\n\tmodule.exports = function bindCallback(fn, ctx, selector) {\n\t  return function () {\n\t    typeof ctx === 'undefined' && (ctx = this);\n\n\t    var len = arguments.length,\n\t        args = new Array(len);\n\t    for (var i = 0; i < len; i++) {\n\t      args[i] = arguments[i];\n\t    }\n\t    return createCbObservable(fn, ctx, selector, args);\n\t  };\n\t};\n\n/***/ },\n/* 31 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Disposable = __webpack_require__(13);\n\tvar Observable = __webpack_require__(8);\n\tvar Observer = __webpack_require__(1);\n\tvar InnerSubscription = __webpack_require__(32);\n\tvar addProperties = __webpack_require__(33);\n\tvar cloneArray = __webpack_require__(34);\n\tvar inherits = __webpack_require__(6);\n\n\t/**\n\t*  Represents the result of an asynchronous operation.\n\t*  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n\t*/\n\tfunction AsyncSubject() {\n\t  Observable.call(this);\n\t  this.isDisposed = false;\n\t  this.isStopped = false;\n\t  this.hasValue = false;\n\t  this.observers = [];\n\t  this.hasError = false;\n\t}\n\n\tinherits(AsyncSubject, Observable);\n\n\taddProperties(AsyncSubject.prototype, Observer.prototype, {\n\t  _subscribe: function (o) {\n\t    Disposable.checkDisposed(this);\n\n\t    if (!this.isStopped) {\n\t      this.observers.push(o);\n\t      return new InnerSubscription(this, o);\n\t    }\n\n\t    if (this.hasError) {\n\t      o.onError(this.error);\n\t    } else if (this.hasValue) {\n\t      o.onNext(this.value);\n\t      o.onCompleted();\n\t    } else {\n\t      o.onCompleted();\n\t    }\n\n\t    return Disposable.empty;\n\t  },\n\t  /**\n\t   * Indicates whether the subject has observers subscribed to it.\n\t   * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n\t   */\n\t  hasObservers: function () {\n\t    Disposable.checkDisposed(this);\n\t    return this.observers.length > 0;\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n\t   */\n\t  onCompleted: function () {\n\t    var i;\n\t    Disposable.checkDisposed(this);\n\t    if (!this.isStopped) {\n\t      this.isStopped = true;\n\t      var os = cloneArray(this.observers),\n\t          len = os.length;\n\n\t      if (this.hasValue) {\n\t        for (i = 0; i < len; i++) {\n\t          var o = os[i];\n\t          o.onNext(this.value);\n\t          o.onCompleted();\n\t        }\n\t      } else {\n\t        for (i = 0; i < len; i++) {\n\t          os[i].onCompleted();\n\t        }\n\t      }\n\n\t      this.observers.length = 0;\n\t    }\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the error.\n\t   * @param {Mixed} error The Error to send to all observers.\n\t   */\n\t  onError: function (error) {\n\t    Disposable.checkDisposed(this);\n\t    if (!this.isStopped) {\n\t      this.isStopped = true;\n\t      this.hasError = true;\n\t      this.error = error;\n\n\t      for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t        os[i].onError(error);\n\t      }\n\n\t      this.observers.length = 0;\n\t    }\n\t  },\n\t  /**\n\t   * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n\t   * @param {Mixed} value The value to store in the subject.\n\t   */\n\t  onNext: function (value) {\n\t    Disposable.checkDisposed(this);\n\t    if (this.isStopped) {\n\t      return;\n\t    }\n\t    this.value = value;\n\t    this.hasValue = true;\n\t  },\n\t  /**\n\t   * Unsubscribe all observers and release resources.\n\t   */\n\t  dispose: function () {\n\t    this.isDisposed = true;\n\t    this.observers = null;\n\t    this.error = null;\n\t    this.value = null;\n\t  }\n\t});\n\n\tmodule.exports = AsyncSubject;\n\n/***/ },\n/* 32 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tfunction InnerSubscription(s, o) {\n\t  this._s = s;\n\t  this._o = o;\n\t}\n\n\tInnerSubscription.prototype.dispose = function () {\n\t  if (!this._s.isDisposed && this._o !== null) {\n\t    var idx = this._s.observers.indexOf(this._o);\n\t    this._s.observers.splice(idx, 1);\n\t    this._o = null;\n\t  }\n\t};\n\n\tmodule.exports = InnerSubscription;\n\n/***/ },\n/* 33 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function addProperties() {\n\t  var obj = arguments[0];\n\t  for (var sources = [], i = 1, len = arguments.length; i < len; i++) {\n\t    sources.push(arguments[i]);\n\t  }\n\t  for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n\t    var source = sources[idx];\n\t    for (var prop in source) {\n\t      obj[prop] = source[prop];\n\t    }\n\t  }\n\t};\n\n/***/ },\n/* 34 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function cloneArray(arr) {\n\t  var len = arr.length,\n\t      a = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    a[i] = arr[i];\n\t  }\n\t  return a;\n\t};\n\n/***/ },\n/* 35 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AnonymousObservable = __webpack_require__(36);\n\n\tfunction createAsObservable(source) {\n\t  return function subscribe(o) {\n\t    return source.subscribe(o);\n\t  };\n\t}\n\n\t/**\n\t *  Hides the identity of an observable sequence.\n\t * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n\t */\n\tmodule.exports = function asObservable(source) {\n\t  return new AnonymousObservable(createAsObservable(source), source);\n\t};\n\n/***/ },\n/* 36 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar inherits = __webpack_require__(6);\n\tvar isFunction = __webpack_require__(9);\n\tvar Observable = __webpack_require__(8);\n\tvar Disposable = __webpack_require__(13);\n\tvar AutoDetachObserver = __webpack_require__(26);\n\tvar Scheduler = __webpack_require__(12);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj,\n\t    thrower = tryCatchUtils.thrower;\n\n\t// Fix subscriber to check for undefined or function returned to decorate as Disposable\n\tfunction fixSubscriber(subscriber) {\n\t  return subscriber && isFunction(subscriber.dispose) ? subscriber : isFunction(subscriber) ? Disposable.create(subscriber) : Disposable.empty;\n\t}\n\n\tfunction setDisposable(s, state) {\n\t  var ado = state[0],\n\t      self = state[1];\n\t  var sub = tryCatch(self.__subscribe).call(self, ado);\n\t  if (sub === errorObj && !ado.fail(sub.e)) {\n\t    thrower(sub.e);\n\t  }\n\t  ado.setDisposable(fixSubscriber(sub));\n\t}\n\n\tfunction AnonymousObservable(subscribe, parent) {\n\t  this.source = parent;\n\t  this.__subscribe = subscribe;\n\t  Observable.call(this);\n\t}\n\n\tinherits(AnonymousObservable, Observable);\n\n\tAnonymousObservable.prototype._subscribe = function (o) {\n\t  var ado = new AutoDetachObserver(o),\n\t      state = [ado, this];\n\n\t  if (Scheduler.queue.scheduleRequired()) {\n\t    Scheduler.queue.schedule(state, setDisposable);\n\t  } else {\n\t    setDisposable(null, state);\n\t  }\n\t  return ado;\n\t};\n\n\tmodule.exports = AnonymousObservable;\n\n/***/ },\n/* 37 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AsyncSubject = __webpack_require__(31);\n\tvar asObservable = __webpack_require__(35);\n\tvar isFunction = __webpack_require__(9);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction createNodeHandler(o, ctx, selector) {\n\t  return function handler() {\n\t    var err = arguments[0];\n\t    if (err) {\n\t      return o.onError(err);\n\t    }\n\n\t    var len = arguments.length,\n\t        results = [];\n\t    for (var i = 1; i < len; i++) {\n\t      results[i - 1] = arguments[i];\n\t    }\n\n\t    if (isFunction(selector)) {\n\t      results = tryCatch(selector).apply(ctx, results);\n\t      if (results === errorObj) {\n\t        return o.onError(results.e);\n\t      }\n\t      o.onNext(results);\n\t    } else {\n\t      if (results.length <= 1) {\n\t        o.onNext(results[0]);\n\t      } else {\n\t        o.onNext(results);\n\t      }\n\t    }\n\n\t    o.onCompleted();\n\t  };\n\t}\n\n\tfunction createNodeObservable(fn, ctx, selector, args) {\n\t  var o = new AsyncSubject();\n\n\t  args.push(createNodeHandler(o, ctx, selector));\n\t  var res = tryCatch(fn).apply(ctx, args);\n\t  if (res === errorObj) {\n\t    o.onError(res.e);\n\t  }\n\n\t  return asObservable(o);\n\t}\n\n\t/**\n\t * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n\t * @param {Function} fn The function to call\n\t * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n\t * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n\t * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n\t */\n\tmodule.exports = function bindNodeCallback(fn, ctx, selector) {\n\t  return function () {\n\t    typeof ctx === 'undefined' && (ctx = this);\n\t    var len = arguments.length,\n\t        args = new Array(len);\n\t    for (var i = 0; i < len; i++) {\n\t      args[i] = arguments[i];\n\t    }\n\t    return createNodeObservable(fn, ctx, selector, args);\n\t  };\n\t};\n\n/***/ },\n/* 38 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar defer = __webpack_require__(39);\n\tvar empty = __webpack_require__(41);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar isScheduler = __webpack_require__(12).isScheduler;\n\n\tfunction createCase(selector, sources, defaultSourceOrScheduler) {\n\t  return function () {\n\t    isPromise(defaultSourceOrScheduler) && (defaultSourceOrScheduler = fromPromise(defaultSourceOrScheduler));\n\t    defaultSourceOrScheduler || (defaultSourceOrScheduler = empty());\n\n\t    isScheduler(defaultSourceOrScheduler) && (defaultSourceOrScheduler = empty(defaultSourceOrScheduler));\n\n\t    var result = sources[selector()];\n\t    isPromise(result) && (result = fromPromise(result));\n\n\t    return result || defaultSourceOrScheduler;\n\t  };\n\t}\n\n\t/**\n\t*  Uses selector to determine which source in sources to use.\n\t* @param {Function} selector The function which extracts the value for to test in a case statement.\n\t* @param {Array} sources A object which has keys which correspond to the case statement labels.\n\t* @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n\t*\n\t* @returns {Observable} An observable sequence which is determined by a case statement.\n\t*/\n\tmodule.exports = function case_(selector, sources, defaultSourceOrScheduler) {\n\t  return defer(createCase(selector, sources, defaultSourceOrScheduler));\n\t};\n\n/***/ },\n/* 39 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar fromPromise = __webpack_require__(27);\n\tvar throwError = __webpack_require__(40);\n\tvar isPromise = __webpack_require__(28);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction Defer(factory) {\n\t  this._f = factory;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(Defer, ObservableBase);\n\n\tDefer.prototype.subscribeCore = function (o) {\n\t  var result = tryCatch(this._f)();\n\t  if (result === errorObj) {\n\t    return throwError(result.e).subscribe(o);\n\t  }\n\t  isPromise(result) && (result = fromPromise(result));\n\t  return result.subscribe(o);\n\t};\n\n\t/**\n\t *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n\t *\n\t * @example\n\t *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n\t * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n\t * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n\t */\n\tmodule.exports = function observableDefer(observableFactory) {\n\t  return new Defer(observableFactory);\n\t};\n\n/***/ },\n/* 40 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar Disposable = __webpack_require__(13);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction scheduleItem(s, state) {\n\t  var e = state[0],\n\t      o = state[1];\n\t  o.onError(e);\n\t  return Disposable.empty;\n\t}\n\n\tfunction ThrowObservable(error, scheduler) {\n\t  this._error = error;\n\t  this._scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(ThrowObservable, ObservableBase);\n\n\tThrowObservable.prototype.subscribeCore = function (o) {\n\t  var state = [this._error, o];\n\t  return this._scheduler === Scheduler.immediate ? scheduleItem(null, state) : this._scheduler.schedule(state, scheduleItem);\n\t};\n\n\tmodule.exports = function throwError(error, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.immediate);\n\t  return new ThrowObservable(error, scheduler);\n\t};\n\n/***/ },\n/* 41 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar Disposable = __webpack_require__(13);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction scheduleItem(s, state) {\n\t  state.onCompleted();\n\t  return Disposable.empty;\n\t}\n\n\tfunction EmptyObservable(scheduler) {\n\t  this._scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(EmptyObservable, ObservableBase);\n\n\tEmptyObservable.prototype.subscribeCore = function (o) {\n\t  return this.scheduler === Scheduler.immediate ? scheduleItem(null, o) : this._scheduler.schedule(o, scheduleItem);\n\t};\n\n\tvar EMPTY_OBSERVABLE = new EmptyObservable(Scheduler.immediate);\n\n\t/**\n\t *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n\t *\n\t * @example\n\t *  var res = Rx.Observable.empty();\n\t *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n\t * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n\t * @returns {Observable} An observable sequence with no elements.\n\t */\n\tmodule.exports = function empty(scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.immediate);\n\t  return scheduler === Scheduler.immediate ? EMPTY_OBSERVABLE : new EmptyObservable(scheduler);\n\t};\n\n/***/ },\n/* 42 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Scheduler = __webpack_require__(12);\n\tvar NAryDisposable = __webpack_require__(43);\n\tvar SerialDisposable = __webpack_require__(44);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction CatchObserver(state, recurse) {\n\t  this._state = state;\n\t  this._recurse = recurse;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(CatchObserver, AbstractObserver);\n\n\tCatchObserver.prototype.next = function (x) {\n\t  this._state.o.onNext(x);\n\t};\n\tCatchObserver.prototype.error = function (e) {\n\t  this._state.lastError = e;this._recurse(this._state);\n\t};\n\tCatchObserver.prototype.completed = function () {\n\t  this._state.o.onCompleted();\n\t};\n\n\tfunction CatchObservable(sources) {\n\t  this.sources = sources;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(CatchObservable, ObservableBase);\n\n\tfunction scheduleMethod(state, recurse) {\n\t  if (state.isDisposed) {\n\t    return;\n\t  }\n\t  if (state.i < state.sources.length) {\n\t    var currentValue = state.sources[state.i++];\n\t    isPromise(currentValue) && (currentValue = fromPromise(currentValue));\n\n\t    var d = new SingleAssignmentDisposable();\n\t    state.subscription.setDisposable(d);\n\t    d.setDisposable(currentValue.subscribe(new CatchObserver(state, recurse)));\n\t  } else {\n\t    if (state.lastError !== null) {\n\t      state.o.onError(state.lastError);\n\t    } else {\n\t      state.o.onCompleted();\n\t    }\n\t  }\n\t}\n\n\tfunction IsDisposedDisposable(s) {\n\t  this._s = s;\n\t}\n\n\tIsDisposedDisposable.prototype.dispose = function () {\n\t  !this._s.isDisposed && (this._s.isDisposed = true);\n\t};\n\n\tCatchObservable.prototype.subscribeCore = function (o) {\n\t  var subscription = new SerialDisposable();\n\t  var state = {\n\t    isDisposed: false,\n\t    sources: this.sources,\n\t    i: 0,\n\t    subscription: subscription,\n\t    lastError: null,\n\t    o: o\n\t  };\n\n\t  var cancelable = Scheduler.queue.scheduleRecursive(state, scheduleMethod);\n\t  return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n\t};\n\n\tmodule.exports = function catch_() {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  return new CatchObservable(args);\n\t};\n\n/***/ },\n/* 43 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tfunction NAryDisposable(disposables) {\n\t  this._disposables = disposables;\n\t  this.isDisposed = false;\n\t}\n\n\tNAryDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this.isDisposed = true;\n\t    for (var i = 0, len = this._disposables.length; i < len; i++) {\n\t      this._disposables[i].dispose();\n\t    }\n\t    this._disposables.length = 0;\n\t  }\n\t};\n\n\tmodule.exports = NAryDisposable;\n\n/***/ },\n/* 44 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tfunction SerialDisposable() {\n\t  this.isDisposed = false;\n\t  this._current = null;\n\t}\n\n\tSerialDisposable.prototype.getDisposable = function () {\n\t  return this._current;\n\t};\n\n\tSerialDisposable.prototype.setDisposable = function (value) {\n\t  var shouldDispose = this.isDisposed;\n\t  if (!shouldDispose) {\n\t    var old = this._current;\n\t    this._current = value;\n\t    old && old.dispose();\n\t  }\n\n\t  shouldDispose && value && value.dispose();\n\t};\n\n\tSerialDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this.isDisposed = true;\n\t    var old = this._current;\n\t    this._current = null;\n\t    old && old.dispose();\n\t  }\n\t};\n\n\tmodule.exports = SerialDisposable;\n\n/***/ },\n/* 45 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar NAryDisposable = __webpack_require__(43);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar identity = __webpack_require__(46);\n\tvar isFunction = __webpack_require__(9);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction falseFactory() {\n\t  return false;\n\t}\n\tfunction initializeArray(n, fn) {\n\t  var results = new Array(n);\n\t  for (var i = 0; i < n; i++) {\n\t    results[i] = fn(i);\n\t  }\n\t  return results;\n\t}\n\tfunction argumentsToArray() {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  return args;\n\t}\n\n\tfunction CombineLatestObserver(o, i, cb, state) {\n\t  this._o = o;\n\t  this._i = i;\n\t  this._cb = cb;\n\t  this._state = state;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(CombineLatestObserver, AbstractObserver);\n\n\tfunction notTheSame(i) {\n\t  return function (x, j) {\n\t    return j !== i;\n\t  };\n\t}\n\n\tCombineLatestObserver.prototype.next = function (x) {\n\t  this._state.values[this._i] = x;\n\t  this._state.hasValue[this._i] = true;\n\t  if (this._state.hasValueAll || (this._state.hasValueAll = this._state.hasValue.every(identity))) {\n\t    var res = tryCatch(this._cb).apply(null, this._state.values);\n\t    if (res === errorObj) {\n\t      return this._o.onError(res.e);\n\t    }\n\t    this._o.onNext(res);\n\t  } else if (this._state.isDone.filter(notTheSame(this._i)).every(identity)) {\n\t    this._o.onCompleted();\n\t  }\n\t};\n\n\tCombineLatestObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tCombineLatestObserver.prototype.completed = function () {\n\t  this._state.isDone[this._i] = true;\n\t  this._state.isDone.every(identity) && this._o.onCompleted();\n\t};\n\n\tfunction CombineLatestObservable(params, cb) {\n\t  this._params = params;\n\t  this._cb = cb;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(CombineLatestObservable, ObservableBase);\n\n\tCombineLatestObservable.prototype.subscribeCore = function (observer) {\n\t  var len = this._params.length,\n\t      subscriptions = new Array(len);\n\n\t  var state = {\n\t    hasValue: initializeArray(len, falseFactory),\n\t    hasValueAll: false,\n\t    isDone: initializeArray(len, falseFactory),\n\t    values: new Array(len)\n\t  };\n\n\t  for (var i = 0; i < len; i++) {\n\t    var source = this._params[i],\n\t        sad = new SingleAssignmentDisposable();\n\t    subscriptions[i] = sad;\n\t    isPromise(source) && (source = fromPromise(source));\n\t    sad.setDisposable(source.subscribe(new CombineLatestObserver(observer, i, this._cb, state)));\n\t  }\n\n\t  return new NAryDisposable(subscriptions);\n\t};\n\n\t/**\n\t* Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n\t*\n\t* @example\n\t* 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n\t* 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n\t* @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n\t*/\n\tmodule.exports = function combineLatest() {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n\t  return new CombineLatestObservable(args, resultSelector);\n\t};\n\n/***/ },\n/* 46 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function identity(x) {\n\t  return x;\n\t};\n\n/***/ },\n/* 47 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Scheduler = __webpack_require__(12);\n\tvar Disposable = __webpack_require__(13);\n\tvar NAryDisposable = __webpack_require__(43);\n\tvar SerialDisposable = __webpack_require__(44);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction ConcatObserver(s, fn) {\n\t  this._s = s;\n\t  this._fn = fn;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(ConcatObserver, AbstractObserver);\n\n\tConcatObserver.prototype.next = function (x) {\n\t  this._s.o.onNext(x);\n\t};\n\tConcatObserver.prototype.error = function (e) {\n\t  this._s.o.onError(e);\n\t};\n\tConcatObserver.prototype.completed = function () {\n\t  this._s.i++;this._fn(this._s);\n\t};\n\n\tfunction ConcatObservable(sources) {\n\t  this._sources = sources;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(ConcatObservable, ObservableBase);\n\n\tfunction scheduleRecursive(state, recurse) {\n\t  if (state.disposable.isDisposed) {\n\t    return;\n\t  }\n\t  if (state.i === state.sources.length) {\n\t    return state.o.onCompleted();\n\t  }\n\n\t  // Check if promise\n\t  var currentValue = state.sources[state.i];\n\t  isPromise(currentValue) && (currentValue = fromPromise(currentValue));\n\n\t  var d = new SingleAssignmentDisposable();\n\t  state.subscription.setDisposable(d);\n\t  d.setDisposable(currentValue.subscribe(new ConcatObserver(state, recurse)));\n\t}\n\n\tConcatObservable.prototype.subscribeCore = function (o) {\n\t  var subscription = new SerialDisposable();\n\t  var disposable = Disposable.create();\n\t  var state = {\n\t    o: o,\n\t    i: 0,\n\t    subscription: subscription,\n\t    disposable: disposable,\n\t    sources: this._sources\n\t  };\n\n\t  var cancelable = Scheduler.immediate.scheduleRecursive(state, scheduleRecursive);\n\t  return new NAryDisposable([subscription, disposable, cancelable]);\n\t};\n\n\t/**\n\t * Concatenates all the observable sequences.\n\t * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n\t * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n\t */\n\tmodule.exports = function concat() {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  return new ConcatObservable(args);\n\t};\n\n/***/ },\n/* 48 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AnonymousObservable = __webpack_require__(36);\n\n\t/**\n\t *  Creates an observable sequence from a specified subscribe method implementation.\n\t * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n\t * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n\t */\n\tmodule.exports = function create(subscribe, parent) {\n\t  return new AnonymousObservable(subscribe, parent);\n\t};\n\n/***/ },\n/* 49 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar CompositeDisposable = __webpack_require__(14);\n\tvar Disposable = __webpack_require__(13);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar isFunction = __webpack_require__(9);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction argumentsToArray() {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  return args;\n\t}\n\n\tfunction ForkJoinObserver(o, s, i, cb, subs) {\n\t  this._o = o;\n\t  this._s = s;\n\t  this._i = i;\n\t  this._cb = cb;\n\t  this._subs = subs;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(ForkJoinObserver, AbstractObserver);\n\n\tForkJoinObserver.prototype.next = function (x) {\n\t  if (!this._s.finished) {\n\t    this._s.hasResults[this._i] = true;\n\t    this._s.results[this._i] = x;\n\t  }\n\t};\n\n\tForkJoinObserver.prototype.error = function (e) {\n\t  this._s.finished = true;\n\t  this._o.onError(e);\n\t  this._subs.dispose();\n\t};\n\n\tForkJoinObserver.prototype.completed = function () {\n\t  if (!this._s.finished) {\n\t    if (!this._s.hasResults[this._i]) {\n\t      return this._o.onCompleted();\n\t    }\n\t    this._s.hasCompleted[this._i] = true;\n\t    for (var i = 0; i < this._s.results.length; i++) {\n\t      if (!this._s.hasCompleted[i]) {\n\t        return;\n\t      }\n\t    }\n\t    this._s.finished = true;\n\n\t    var res = tryCatch(this._cb).apply(null, this._s.results);\n\t    if (res === errorObj) {\n\t      return this._o.onError(res.e);\n\t    }\n\n\t    this._o.onNext(res);\n\t    this._o.onCompleted();\n\t  }\n\t};\n\n\tfunction ForkJoinObservable(sources, cb) {\n\t  this._sources = sources;\n\t  this._cb = cb;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(ForkJoinObservable, ObservableBase);\n\n\tForkJoinObservable.prototype.subscribeCore = function (o) {\n\t  if (this._sources.length === 0) {\n\t    o.onCompleted();\n\t    return Disposable.empty;\n\t  }\n\n\t  var count = this._sources.length;\n\t  var state = {\n\t    finished: false,\n\t    hasResults: new Array(count),\n\t    hasCompleted: new Array(count),\n\t    results: new Array(count)\n\t  };\n\n\t  var subscriptions = new CompositeDisposable();\n\t  for (var i = 0, len = this._sources.length; i < len; i++) {\n\t    var source = this._sources[i];\n\t    isPromise(source) && (source = fromPromise(source));\n\t    subscriptions.add(source.subscribe(new ForkJoinObserver(o, state, i, this._cb, subscriptions)));\n\t  }\n\n\t  return subscriptions;\n\t};\n\n\tmodule.exports = function forkJoin() {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n\t  return new ForkJoinObservable(args, resultSelector);\n\t};\n\n/***/ },\n/* 50 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar Scheduler = __webpack_require__(12);\n\tvar isFunction = __webpack_require__(9);\n\tvar $iterator$ = __webpack_require__(51);\n\tvar bindCallback = __webpack_require__(52);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tvar doneEnumerator = { done: true, value: undefined };\n\tvar maxSafeInteger = Math.pow(2, 53) - 1;\n\n\tfunction numberIsFinite(value) {\n\t  return typeof value === 'number' && global.isFinite(value);\n\t}\n\n\tfunction sign(value) {\n\t  var number = +value;\n\t  if (number === 0) {\n\t    return number;\n\t  }\n\t  if (isNaN(number)) {\n\t    return number;\n\t  }\n\t  return number < 0 ? -1 : 1;\n\t}\n\n\tfunction toLength(o) {\n\t  var len = +o.length;\n\t  if (isNaN(len)) {\n\t    return 0;\n\t  }\n\t  if (len === 0 || !numberIsFinite(len)) {\n\t    return len;\n\t  }\n\t  len = sign(len) * Math.floor(Math.abs(len));\n\t  if (len <= 0) {\n\t    return 0;\n\t  }\n\t  if (len > maxSafeInteger) {\n\t    return maxSafeInteger;\n\t  }\n\t  return len;\n\t}\n\n\tfunction StringIterator(s) {\n\t  this._s = s;\n\t  this._l = s.length;\n\t  this._i = 0;\n\t}\n\n\tStringIterator.prototype[$iterator$] = function () {\n\t  return this;\n\t};\n\n\tStringIterator.prototype.next = function () {\n\t  return this._i < this._l ? { done: false, value: this._s.charAt(this._i++) } : doneEnumerator;\n\t};\n\n\tfunction StringIterable(s) {\n\t  this._s = s;\n\t}\n\n\tStringIterable.prototype[$iterator$] = function () {\n\t  return new StringIterator(this._s);\n\t};\n\n\tfunction ArrayIterator(a) {\n\t  this._a = a;\n\t  this._l = toLength(a);\n\t  this._i = 0;\n\t}\n\n\tArrayIterator.prototype[$iterator$] = function () {\n\t  return this;\n\t};\n\n\tArrayIterator.prototype.next = function () {\n\t  return this._i < this._l ? { done: false, value: this._a[this._i++] } : doneEnumerator;\n\t};\n\n\tfunction ArrayIterable(a) {\n\t  this._a = a;\n\t}\n\n\tArrayIterable.prototype[$iterator$] = function () {\n\t  return new ArrayIterator(this._a);\n\t};\n\n\tfunction getIterable(o) {\n\t  var i = o[$iterator$],\n\t      it;\n\t  if (!i && typeof o === 'string') {\n\t    it = new StringIterable(o);\n\t    return it[$iterator$]();\n\t  }\n\t  if (!i && o.length !== undefined) {\n\t    it = new ArrayIterable(o);\n\t    return it[$iterator$]();\n\t  }\n\t  if (!i) {\n\t    throw new TypeError('Object is not iterable');\n\t  }\n\t  return o[$iterator$]();\n\t}\n\n\tfunction FromObservable(iterable, fn, scheduler) {\n\t  this._iterable = iterable;\n\t  this._fn = fn;\n\t  this._scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(FromObservable, ObservableBase);\n\n\tfunction scheduleRecursive(o, it, fn) {\n\t  return function loopRecursive(i, recurse) {\n\t    var next = tryCatch(it.next).call(it);\n\t    if (next === errorObj) {\n\t      return o.onError(next.e);\n\t    }\n\t    if (next.done) {\n\t      return o.onCompleted();\n\t    }\n\n\t    var result = next.value;\n\n\t    if (isFunction(fn)) {\n\t      result = tryCatch(fn)(result, i);\n\t      if (result === errorObj) {\n\t        return o.onError(result.e);\n\t      }\n\t    }\n\n\t    o.onNext(result);\n\t    recurse(i + 1);\n\t  };\n\t}\n\n\tFromObservable.prototype.subscribeCore = function (o) {\n\t  var list = Object(this._iterable),\n\t      it = getIterable(list);\n\n\t  return this._scheduler.scheduleRecursive(0, scheduleRecursive(o, it, this._fn));\n\t};\n\n\t/**\n\t* This method creates a new Observable sequence from an array-like or iterable object.\n\t* @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n\t* @param {Function} [mapFn] Map function to call on every element of the array.\n\t* @param {Any} [thisArg] The context to use calling the mapFn if provided.\n\t* @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n\t*/\n\tmodule.exports = function (iterable, mapFn, thisArg, scheduler) {\n\t  if (iterable == null) {\n\t    throw new Error('iterable cannot be null.');\n\t  }\n\t  if (mapFn && !isFunction(mapFn)) {\n\t    throw new Error('mapFn when provided must be a function');\n\t  }\n\n\t  var mapper;\n\t  if (mapFn) {\n\t    mapper = bindCallback(mapFn, thisArg, 2);\n\t  }\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.queue);\n\t  return new FromObservable(iterable, mapper, scheduler);\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 51 */\n/***/ function(module, exports) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n\t// Shim in iterator support\n\n\tvar $iterator$ = typeof global.Symbol === 'function' && global.Symbol.iterator || '_es6shim_iterator_';\n\t// Bug for mozilla version\n\tif (global.Set && typeof new global.Set()['@@iterator'] === 'function') {\n\t  $iterator$ = '@@iterator';\n\t}\n\n\tmodule.exports = $iterator$;\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 52 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function bindCallback(func, thisArg, argCount) {\n\t  if (typeof thisArg === 'undefined') {\n\t    return func;\n\t  }\n\t  switch (argCount) {\n\t    case 0:\n\t      return function () {\n\t        return func.call(thisArg);\n\t      };\n\t    case 1:\n\t      return function (arg) {\n\t        return func.call(thisArg, arg);\n\t      };\n\t    case 2:\n\t      return function (value, index) {\n\t        return func.call(thisArg, value, index);\n\t      };\n\t    case 3:\n\t      return function (value, index, collection) {\n\t        return func.call(thisArg, value, index, collection);\n\t      };\n\t  }\n\n\t  return function () {\n\t    return func.apply(thisArg, arguments);\n\t  };\n\t};\n\n/***/ },\n/* 53 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction scheduleRecursive(state, recurse) {\n\t  if (state.i < state.len) {\n\t    state.o.onNext(state.args[state.i++]);\n\t    recurse(state);\n\t  } else {\n\t    state.o.onCompleted();\n\t  }\n\t}\n\n\tfunction FromArrayObservable(args, scheduler) {\n\t  this._args = args;\n\t  this._scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(FromArrayObservable, ObservableBase);\n\n\tFromArrayObservable.prototype.subscribeCore = function (o) {\n\t  var state = {\n\t    i: 0,\n\t    args: this._args,\n\t    len: this._args.length,\n\t    o: o\n\t  };\n\t  return this._scheduler.scheduleRecursive(state, scheduleRecursive);\n\t};\n\n\tmodule.exports = function fromArray(array, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.queue);\n\t  return new FromArrayObservable(array, scheduler);\n\t};\n\n/***/ },\n/* 54 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar fromEventPattern = __webpack_require__(55);\n\tvar publish = __webpack_require__(56);\n\tvar CompositeDisposable = __webpack_require__(14);\n\tvar isFunction = __webpack_require__(9);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction isNodeList(el) {\n\t  if (global.StaticNodeList) {\n\t    // IE8 Specific\n\t    // instanceof is slower than Object#toString, but Object#toString will not work as intended in IE8\n\t    return el instanceof global.StaticNodeList || el instanceof global.NodeList;\n\t  } else {\n\t    return Object.prototype.toString.call(el) === '[object NodeList]';\n\t  }\n\t}\n\n\tfunction ListenDisposable(e, n, fn) {\n\t  this._e = e;\n\t  this._n = n;\n\t  this._fn = fn;\n\t  this._e.addEventListener(this._n, this._fn, false);\n\t  this.isDisposed = false;\n\t}\n\n\tListenDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this._e.removeEventListener(this._n, this._fn, false);\n\t    this.isDisposed = true;\n\t  }\n\t};\n\n\tfunction createEventListener(el, eventName, handler) {\n\t  var disposables = new CompositeDisposable();\n\n\t  // Asume NodeList or HTMLCollection\n\t  var elemToString = Object.prototype.toString.call(el);\n\t  if (isNodeList(el) || elemToString === '[object HTMLCollection]') {\n\t    for (var i = 0, len = el.length; i < len; i++) {\n\t      disposables.add(createEventListener(el.item(i), eventName, handler));\n\t    }\n\t  } else if (el) {\n\t    disposables.add(new ListenDisposable(el, eventName, handler));\n\t  }\n\n\t  return disposables;\n\t}\n\n\t/**\n\t * Configuration option to determine whether to use native events only\n\t */\n\tglobal.Rx || (global.Rx = {});\n\tglobal.Rx.config || (global.Rx.config = {});\n\tglobal.Rx.config.useNativeEvents = false;\n\n\tfunction EventObservable(el, name, fn) {\n\t  this._el = el;\n\t  this._n = name;\n\t  this._fn = fn;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(EventObservable, ObservableBase);\n\n\tfunction createHandler(o, fn) {\n\t  return function handler() {\n\t    var results = arguments[0];\n\t    if (isFunction(fn)) {\n\t      results = tryCatch(fn).apply(null, arguments);\n\t      if (results === errorObj) {\n\t        return o.onError(results.e);\n\t      }\n\t    }\n\t    o.onNext(results);\n\t  };\n\t}\n\n\tEventObservable.prototype.subscribeCore = function (o) {\n\t  return createEventListener(this._el, this._n, createHandler(o, this._fn));\n\t};\n\n\t/**\n\t * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n\t * @param {Object} element The DOMElement or NodeList to attach a listener.\n\t * @param {String} eventName The event name to attach the observable sequence.\n\t * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n\t * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n\t */\n\tmodule.exports = function fromEvent(element, eventName, selector) {\n\t  // Node.js specific\n\t  if (element.addListener) {\n\t    return fromEventPattern(function (h) {\n\t      element.addListener(eventName, h);\n\t    }, function (h) {\n\t      element.removeListener(eventName, h);\n\t    }, selector);\n\t  }\n\n\t  // Use only if non-native events are allowed\n\t  if (!global.Rx.config.useNativeEvents) {\n\t    // Handles jq, Angular.js, Zepto, Marionette, Ember.js\n\t    if (typeof element.on === 'function' && typeof element.off === 'function') {\n\t      return fromEventPattern(function (h) {\n\t        element.on(eventName, h);\n\t      }, function (h) {\n\t        element.off(eventName, h);\n\t      }, selector);\n\t    }\n\t  }\n\n\t  return publish(new EventObservable(element, eventName, selector)).refCount();\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 55 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar publish = __webpack_require__(56);\n\tvar isFunction = __webpack_require__(9);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction EventPatternDisposable(del, fn, ret) {\n\t  this._del = del;\n\t  this._fn = fn;\n\t  this._ret = ret;\n\t  this.isDisposed = false;\n\t}\n\n\tEventPatternDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    isFunction(this._del) && this._del(this._fn, this._ret);\n\t    this.isDisposed = true;\n\t  }\n\t};\n\n\tfunction EventPatternObservable(add, del, fn) {\n\t  this._add = add;\n\t  this._del = del;\n\t  this._fn = fn;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(EventPatternObservable, ObservableBase);\n\n\tfunction createHandler(o, fn) {\n\t  return function handler() {\n\t    var results = arguments[0];\n\t    if (isFunction(fn)) {\n\t      results = tryCatch(fn).apply(null, arguments);\n\t      if (results === errorObj) {\n\t        return o.onError(results.e);\n\t      }\n\t    }\n\t    o.onNext(results);\n\t  };\n\t}\n\n\tEventPatternObservable.prototype.subscribeCore = function (o) {\n\t  var fn = createHandler(o, this._fn);\n\t  var returnValue = this._add(fn);\n\t  return new EventPatternDisposable(this._del, fn, returnValue);\n\t};\n\n\t/**\n\t * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n\t * @param {Function} addHandler The function to add a handler to the emitter.\n\t * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n\t * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n\t * @returns {Observable} An observable sequence which wraps an event from an event emitter\n\t */\n\tmodule.exports = function fromEventPattern(addHandler, removeHandler, selector) {\n\t  return publish(new EventPatternObservable(addHandler, removeHandler, selector)).refCount();\n\t};\n\n/***/ },\n/* 56 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Subject = __webpack_require__(57);\n\tvar multicast = __webpack_require__(58);\n\tvar isFunction = __webpack_require__(9);\n\n\t/**\n\t * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n\t * This operator is a specialization of Multicast using a regular Subject.\n\t * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n\t * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n\t */\n\tmodule.exports = function publish(source, fn) {\n\t  return fn && isFunction(fn) ? multicast(source, function () {\n\t    return new Subject();\n\t  }, fn) : multicast(source, new Subject());\n\t};\n\n/***/ },\n/* 57 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Disposable = __webpack_require__(13);\n\tvar Observable = __webpack_require__(8);\n\tvar Observer = __webpack_require__(1);\n\tvar InnerSubscription = __webpack_require__(32);\n\tvar addProperties = __webpack_require__(33);\n\tvar cloneArray = __webpack_require__(34);\n\tvar inherits = __webpack_require__(6);\n\n\t/**\n\t*  Represents an object that is both an observable sequence as well as an observer.\n\t*  Each notification is broadcasted to all subscribed observers.\n\t*/\n\tfunction Subject() {\n\t  Observable.call(this);\n\t  this.isDisposed = false;\n\t  this.isStopped = false;\n\t  this.observers = [];\n\t  this.hasError = false;\n\t}\n\n\tinherits(Subject, Observable);\n\n\taddProperties(Subject.prototype, Observer.prototype, {\n\t  _subscribe: function (o) {\n\t    Disposable.checkDisposed(this);\n\t    if (!this.isStopped) {\n\t      this.observers.push(o);\n\t      return new InnerSubscription(this, o);\n\t    }\n\t    if (this.hasError) {\n\t      o.onError(this.error);\n\t      return Disposable.empty;\n\t    }\n\t    o.onCompleted();\n\t    return Disposable.empty;\n\t  },\n\t  /**\n\t   * Indicates whether the subject has observers subscribed to it.\n\t   * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n\t   */\n\t  hasObservers: function () {\n\t    Disposable.checkDisposed(this);\n\t    return this.observers.length > 0;\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the end of the sequence.\n\t   */\n\t  onCompleted: function () {\n\t    Disposable.checkDisposed(this);\n\t    if (!this.isStopped) {\n\t      this.isStopped = true;\n\t      for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t        os[i].onCompleted();\n\t      }\n\n\t      this.observers.length = 0;\n\t    }\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the exception.\n\t   * @param {Mixed} error The exception to send to all observers.\n\t   */\n\t  onError: function (error) {\n\t    Disposable.checkDisposed(this);\n\t    if (!this.isStopped) {\n\t      this.isStopped = true;\n\t      this.error = error;\n\t      this.hasError = true;\n\t      for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t        os[i].onError(error);\n\t      }\n\n\t      this.observers.length = 0;\n\t    }\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n\t   * @param {Mixed} value The value to send to all observers.\n\t   */\n\t  onNext: function (value) {\n\t    Disposable.checkDisposed(this);\n\t    if (!this.isStopped) {\n\t      for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t        os[i].onNext(value);\n\t      }\n\t    }\n\t  },\n\t  /**\n\t   * Unsubscribe all observers and release resources.\n\t   */\n\t  dispose: function () {\n\t    this.isDisposed = true;\n\t    this.observers = null;\n\t  }\n\t});\n\n\tSubject.addToObject = function (operators) {\n\t  Object.keys(operators).forEach(function (operator) {\n\t    Subject[operator] = operators[operator];\n\t  });\n\t};\n\n\tSubject.addToPrototype = function (operators) {\n\t  Object.keys(operators).forEach(function (operator) {\n\t    Subject.prototype[operator] = function () {\n\t      var args = [this];\n\t      args.push.apply(args, arguments);\n\t      return operators[operator].apply(null, args);\n\t    };\n\t  });\n\t};\n\n\tmodule.exports = Subject;\n\n/***/ },\n/* 58 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar ConnectableObservable = __webpack_require__(59);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar isFunction = __webpack_require__(9);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction MulticastObservable(source, fn1, fn2) {\n\t  this.source = source;\n\t  this._fn1 = fn1;\n\t  this._fn2 = fn2;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(MulticastObservable, ObservableBase);\n\n\tMulticastObservable.prototype.subscribeCore = function (o) {\n\t  var connectable = this.source.multicast(this._fn1());\n\t  return new BinaryDisposable(this._fn2(connectable).subscribe(o), connectable.connect());\n\t};\n\n\t/**\n\t * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n\t * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n\t * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n\t * @param {Function|Subject} subjectOrSubjectSelector\n\t * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n\t * Or:\n\t * Subject to push source elements into.\n\t *\n\t * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n\t * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n\t */\n\tmodule.exports = function multicast(source, subjectOrSubjectSelector, selector) {\n\t  return isFunction(subjectOrSubjectSelector) ? new MulticastObservable(source, subjectOrSubjectSelector, selector) : new ConnectableObservable(source, subjectOrSubjectSelector);\n\t};\n\n/***/ },\n/* 59 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Observable = __webpack_require__(8);\n\tvar ObservableBase = __webpack_require__(11);\n\tvar asObservable = __webpack_require__(35);\n\tvar Disposable = __webpack_require__(13);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction RefCountDisposable(p, s) {\n\t  this._p = p;\n\t  this._s = s;\n\t  this.isDisposed = false;\n\t}\n\n\tRefCountDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this.isDisposed = true;\n\t    this._s.dispose();\n\t    --this._p._count === 0 && this._p._connectableSubscription.dispose();\n\t  }\n\t};\n\n\tfunction RefCountObservable(source) {\n\t  this.source = source;\n\t  this._count = 0;\n\t  this._connectableSubscription = null;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(RefCountObservable, ObservableBase);\n\n\tRefCountObservable.prototype.subscribeCore = function (o) {\n\t  var subscription = this.source.subscribe(o);\n\t  ++this._count === 1 && (this._connectableSubscription = this.source.connect());\n\t  return new RefCountDisposable(this, subscription);\n\t};\n\n\tfunction ConnectableObservable(source, subject) {\n\t  this.source = source;\n\t  this._connection = null;\n\t  this._source = asObservable(source);\n\t  this._subject = subject;\n\t  Observable.call(this);\n\t}\n\n\tinherits(ConnectableObservable, Observable);\n\n\tfunction ConnectDisposable(parent, subscription) {\n\t  this._p = parent;\n\t  this._s = subscription;\n\t}\n\n\tConnectDisposable.prototype.dispose = function () {\n\t  if (this._s) {\n\t    this._s.dispose();\n\t    this._s = null;\n\t    this._p._connection = null;\n\t  }\n\t};\n\n\tConnectableObservable.prototype.connect = function () {\n\t  if (!this._connection) {\n\t    if (this._subject.isStopped) {\n\t      return Disposable.empty;\n\t    }\n\n\t    var subscription = this._source.subscribe(this._subject);\n\t    this._connection = new ConnectDisposable(this, subscription);\n\t  }\n\t  return this._connection;\n\t};\n\n\tConnectableObservable.prototype._subscribe = function (o) {\n\t  return this._subject.subscribe(o);\n\t};\n\n\tConnectableObservable.prototype.refCount = function () {\n\t  return new RefCountObservable(this);\n\t};\n\n\tmodule.exports = ConnectableObservable;\n\n/***/ },\n/* 60 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar Scheduler = __webpack_require__(12);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction GenerateObservable(state, cndFn, itrFn, resFn, s) {\n\t  this._initialState = state;\n\t  this._cndFn = cndFn;\n\t  this._itrFn = itrFn;\n\t  this._resFn = resFn;\n\t  this._s = s;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(GenerateObservable, ObservableBase);\n\n\tfunction scheduleRecursive(state, recurse) {\n\t  if (state.first) {\n\t    state.first = false;\n\t  } else {\n\t    state.newState = tryCatch(state.self._itrFn)(state.newState);\n\t    if (state.newState === errorObj) {\n\t      return state.o.onError(state.newState.e);\n\t    }\n\t  }\n\t  var hasResult = tryCatch(state.self._cndFn)(state.newState);\n\t  if (hasResult === errorObj) {\n\t    return state.o.onError(hasResult.e);\n\t  }\n\t  if (hasResult) {\n\t    var result = tryCatch(state.self._resFn)(state.newState);\n\t    if (result === errorObj) {\n\t      return state.o.onError(result.e);\n\t    }\n\t    state.o.onNext(result);\n\t    recurse(state);\n\t  } else {\n\t    state.o.onCompleted();\n\t  }\n\t}\n\n\tGenerateObservable.prototype.subscribeCore = function (o) {\n\t  var state = {\n\t    o: o,\n\t    self: this,\n\t    first: true,\n\t    newState: this._initialState\n\t  };\n\t  return this._s.scheduleRecursive(state, scheduleRecursive);\n\t};\n\n\tmodule.exports = function generate(initialState, condition, iterate, resultSelector, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.queue);\n\t  return new GenerateObservable(initialState, condition, iterate, resultSelector, scheduler);\n\t};\n\n/***/ },\n/* 61 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction GenerateAbsoluteObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n\t  this._state = state;\n\t  this._cndFn = cndFn;\n\t  this._itrFn = itrFn;\n\t  this._resFn = resFn;\n\t  this._timeFn = timeFn;\n\t  this._s = s;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(GenerateAbsoluteObservable, ObservableBase);\n\n\tfunction scheduleRecursive(state, recurse) {\n\t  state.hasResult && state.o.onNext(state.result);\n\n\t  if (state.first) {\n\t    state.first = false;\n\t  } else {\n\t    state.newState = tryCatch(state.self._itrFn)(state.newState);\n\t    if (state.newState === errorObj) {\n\t      return state.o.onError(state.newState.e);\n\t    }\n\t  }\n\t  state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n\t  if (state.hasResult === errorObj) {\n\t    return state.o.onError(state.hasResult.e);\n\t  }\n\t  if (state.hasResult) {\n\t    state.result = tryCatch(state.self._resFn)(state.newState);\n\t    if (state.result === errorObj) {\n\t      return state.o.onError(state.result.e);\n\t    }\n\t    var time = tryCatch(state.self._timeFn)(state.newState);\n\t    if (time === errorObj) {\n\t      return state.o.onError(time.e);\n\t    }\n\t    recurse(state, time);\n\t  } else {\n\t    state.o.onCompleted();\n\t  }\n\t}\n\n\tGenerateAbsoluteObservable.prototype.subscribeCore = function (o) {\n\t  var state = {\n\t    o: o,\n\t    self: this,\n\t    newState: this._state,\n\t    first: true,\n\t    hasResult: false\n\t  };\n\t  return this._s.scheduleRecursiveFuture(state, new Date(this._s.now()), scheduleRecursive);\n\t};\n\n\tmodule.exports = function generateAbsolute(initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  return new GenerateAbsoluteObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n\t};\n\n/***/ },\n/* 62 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction GenerateRelativeObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n\t  this._state = state;\n\t  this._cndFn = cndFn;\n\t  this._itrFn = itrFn;\n\t  this._resFn = resFn;\n\t  this._timeFn = timeFn;\n\t  this._s = s;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(GenerateRelativeObservable, ObservableBase);\n\n\tfunction scheduleRecursive(state, recurse) {\n\t  state.hasResult && state.o.onNext(state.result);\n\n\t  if (state.first) {\n\t    state.first = false;\n\t  } else {\n\t    state.newState = tryCatch(state.self._itrFn)(state.newState);\n\t    if (state.newState === errorObj) {\n\t      return state.o.onError(state.newState.e);\n\t    }\n\t  }\n\t  state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n\t  if (state.hasResult === errorObj) {\n\t    return state.o.onError(state.hasResult.e);\n\t  }\n\t  if (state.hasResult) {\n\t    state.result = tryCatch(state.self._resFn)(state.newState);\n\t    if (state.result === errorObj) {\n\t      return state.o.onError(state.result.e);\n\t    }\n\t    var time = tryCatch(state.self._timeFn)(state.newState);\n\t    if (time === errorObj) {\n\t      return state.o.onError(time.e);\n\t    }\n\t    recurse(state, time);\n\t  } else {\n\t    state.o.onCompleted();\n\t  }\n\t}\n\n\tGenerateRelativeObservable.prototype.subscribeCore = function (o) {\n\t  var state = {\n\t    o: o,\n\t    self: this,\n\t    newState: this._state,\n\t    first: true,\n\t    hasResult: false\n\t  };\n\t  return this._s.scheduleRecursiveFuture(state, 0, scheduleRecursive);\n\t};\n\n\tmodule.exports = function generateRelative(initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  return new GenerateRelativeObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n\t};\n\n/***/ },\n/* 63 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction IntervalObservable(period, scheduler) {\n\t  this._period = period;\n\t  this._scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(IntervalObservable, ObservableBase);\n\n\tfunction createScheduleMethod(o) {\n\t  return function scheduleMethod(count) {\n\t    o.onNext(count);\n\t    return count + 1;\n\t  };\n\t}\n\n\tIntervalObservable.prototype.subscribeCore = function (o) {\n\t  return this._scheduler.schedulePeriodic(0, this._period, createScheduleMethod(o));\n\t};\n\n\t/**\n\t*  Returns an observable sequence that produces a value after each period.\n\t* @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n\t* @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n\t* @returns {Observable} An observable sequence that produces a value after each period.\n\t*/\n\tmodule.exports = function interval(period, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  return new IntervalObservable(period, scheduler);\n\t};\n\n/***/ },\n/* 64 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar Disposable = __webpack_require__(13);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction scheduleItem(s, state) {\n\t  var value = state[0],\n\t      observer = state[1];\n\t  observer.onNext(value);\n\t  observer.onCompleted();\n\t  return Disposable.empty;\n\t}\n\n\tfunction JustObservable(value, scheduler) {\n\t  this._value = value;\n\t  this._scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(JustObservable, ObservableBase);\n\n\tJustObservable.prototype.subscribeCore = function (o) {\n\t  var state = [this._value, o];\n\t  return this._scheduler === Scheduler.immediate ? scheduleItem(null, state) : this._scheduler.schedule(state, scheduleItem);\n\t};\n\n\tmodule.exports = function just(value, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.immediate);\n\t  return new JustObservable(value, scheduler);\n\t};\n\n/***/ },\n/* 65 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar fromArray = __webpack_require__(53);\n\tvar mergeAll = __webpack_require__(66);\n\tvar Scheduler = __webpack_require__(12);\n\n\tmodule.exports = function merge() {\n\t  var scheduler,\n\t      sources = [],\n\t      i,\n\t      len = arguments.length;\n\t  if (!arguments[0]) {\n\t    scheduler = Scheduler.immediate;\n\t    for (i = 1; i < len; i++) {\n\t      sources.push(arguments[i]);\n\t    }\n\t  } else if (Scheduler.isScheduler(arguments[0])) {\n\t    scheduler = arguments[0];\n\t    for (i = 1; i < len; i++) {\n\t      sources.push(arguments[i]);\n\t    }\n\t  } else {\n\t    scheduler = Scheduler.immediate;\n\t    for (i = 0; i < len; i++) {\n\t      sources.push(arguments[i]);\n\t    }\n\t  }\n\t  return mergeAll(fromArray(sources, scheduler));\n\t};\n\n/***/ },\n/* 66 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar ObservableBase = __webpack_require__(11);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar CompositeDisposable = __webpack_require__(14);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction InnerObserver(parent, sad) {\n\t  this._parent = parent;\n\t  this._sad = sad;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(InnerObserver, AbstractObserver);\n\n\tInnerObserver.prototype.next = function (x) {\n\t  this._parent._o.onNext(x);\n\t};\n\tInnerObserver.prototype.error = function (e) {\n\t  this._parent._o.onError(e);\n\t};\n\tInnerObserver.prototype.completed = function () {\n\t  this._parent._g.remove(this._sad);\n\t  this._parent._done && this._parent._g.length === 1 && this._parent._o.onCompleted();\n\t};\n\n\tfunction MergeAllObserver(o, g) {\n\t  this._o = o;\n\t  this._g = g;\n\t  this._done = false;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(MergeAllObserver, AbstractObserver);\n\n\tMergeAllObserver.prototype.next = function (innerSource) {\n\t  var sad = new SingleAssignmentDisposable();\n\t  this._g.add(sad);\n\t  isPromise(innerSource) && (innerSource = fromPromise(innerSource));\n\t  sad.setDisposable(innerSource.subscribe(new InnerObserver(this, sad)));\n\t};\n\tMergeAllObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tMergeAllObserver.prototype.completed = function () {\n\t  this._done = true;this._g.length === 1 && this._o.onCompleted();\n\t};\n\n\tfunction MergeAllObservable(source) {\n\t  this.source = source;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(MergeAllObservable, ObservableBase);\n\n\tMergeAllObservable.prototype.subscribeCore = function (o) {\n\t  var g = new CompositeDisposable(),\n\t      m = new SingleAssignmentDisposable();\n\t  g.add(m);\n\t  m.setDisposable(this.source.subscribe(new MergeAllObserver(o, g)));\n\t  return g;\n\t};\n\n\t/**\n\t* Merges an observable sequence of observable sequences into an observable sequence.\n\t* @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n\t*/\n\tmodule.exports = function mergeAll(sources) {\n\t  return new MergeAllObservable(sources);\n\t};\n\n/***/ },\n/* 67 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar fromArray = __webpack_require__(53);\n\n\tmodule.exports = function () {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  return fromArray(args);\n\t};\n\n/***/ },\n/* 68 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar fromArray = __webpack_require__(53);\n\n\t/**\n\t*  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n\t* @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n\t* @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n\t*/\n\tmodule.exports = function ofscheduled() {\n\t  var len = arguments.length,\n\t      args = new Array(len - 1),\n\t      scheduler = arguments[0];\n\t  for (var i = 1; i < len; i++) {\n\t    args[i - 1] = arguments[i];\n\t  }\n\t  return fromArray(args, scheduler);\n\t};\n\n/***/ },\n/* 69 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Scheduler = __webpack_require__(12);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar SerialDisposable = __webpack_require__(44);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction OnErrorResumeNextObserver(state, recurse) {\n\t  this._state = state;\n\t  this._recurse = recurse;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(OnErrorResumeNextObserver, AbstractObserver);\n\n\tOnErrorResumeNextObserver.prototype.next = function (x) {\n\t  this._state.o.onNext(x);\n\t};\n\tOnErrorResumeNextObserver.prototype.error = function () {\n\t  this._recurse(this._state);\n\t};\n\tOnErrorResumeNextObserver.prototype.completed = function () {\n\t  this._recurse(this._state);\n\t};\n\n\tfunction OnErrorResumeNextObservable(sources) {\n\t  this.sources = sources;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(OnErrorResumeNextObservable, ObservableBase);\n\n\tfunction scheduleMethod(state, recurse) {\n\t  if (state.pos < state.sources.length) {\n\t    var current = state.sources[state.pos++];\n\t    isPromise(current) && (current = fromPromise(current));\n\t    var d = new SingleAssignmentDisposable();\n\t    state.subscription.setDisposable(d);\n\t    d.setDisposable(current.subscribe(new OnErrorResumeNextObserver(state, recurse)));\n\t  } else {\n\t    state.o.onCompleted();\n\t  }\n\t}\n\n\tOnErrorResumeNextObservable.prototype.subscribeCore = function (o) {\n\t  var subscription = new SerialDisposable(),\n\t      state = {\n\t    pos: 0,\n\t    subscription: subscription,\n\t    o: o,\n\t    sources: this.sources\n\t  },\n\t      cancellable = Scheduler.immediate.scheduleRecursive(state, scheduleMethod);\n\t  return new BinaryDisposable(subscription, cancellable);\n\t};\n\n\t/**\n\t * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n\t * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n\t */\n\tmodule.exports = function onErrorResumeNext() {\n\t  var len = arguments.length,\n\t      sources = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    sources[i] = arguments[i];\n\t  }\n\t  return new OnErrorResumeNextObservable(sources);\n\t};\n\n/***/ },\n/* 70 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction scheduleMethod(o, obj, keys) {\n\t  return function loopRecursive(i, recurse) {\n\t    if (i < keys.length) {\n\t      var key = keys[i];\n\t      o.onNext([key, obj[key]]);\n\t      recurse(i + 1);\n\t    } else {\n\t      o.onCompleted();\n\t    }\n\t  };\n\t}\n\n\tfunction PairsObservable(o, scheduler) {\n\t  this._o = o;\n\t  this._keys = Object.keys(o);\n\t  this._scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(PairsObservable, ObservableBase);\n\n\tPairsObservable.prototype.subscribeCore = function (o) {\n\t  return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._o, this._keys));\n\t};\n\n\tmodule.exports = function pairs(obj, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.queue);\n\t  return new PairsObservable(obj, scheduler);\n\t};\n\n/***/ },\n/* 71 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction RangeObservable(start, count, scheduler) {\n\t  this.start = start;\n\t  this.rangeCount = count;\n\t  this.scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(RangeObservable, ObservableBase);\n\n\tfunction loopRecursive(start, count, o) {\n\t  return function loop(i, recurse) {\n\t    if (i < count) {\n\t      o.onNext(start + i);\n\t      recurse(i + 1);\n\t    } else {\n\t      o.onCompleted();\n\t    }\n\t  };\n\t}\n\n\tRangeObservable.prototype.subscribeCore = function (o) {\n\t  return this.scheduler.scheduleRecursive(0, loopRecursive(this.start, this.rangeCount, o));\n\t};\n\n\t/**\n\t*  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n\t* @param {Number} start The value of the first integer in the sequence.\n\t* @param {Number} count The number of sequential integers to generate.\n\t* @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n\t* @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n\t*/\n\tmodule.exports = function range(start, count, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.queue);\n\t  return new RangeObservable(start, count, scheduler);\n\t};\n\n/***/ },\n/* 72 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction RepeatValueObservable(value, count, scheduler) {\n\t  this._value = value;\n\t  this._count = count;\n\t  this._scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(RepeatValueObservable, ObservableBase);\n\n\tfunction scheduleRecursive(state, recurse) {\n\t  if (state.n === 0) {\n\t    return state.o.onCompleted();\n\t  }\n\t  if (state.n > 0) {\n\t    state.n--;\n\t  }\n\t  state.o.onNext(state.value);\n\t  recurse(state);\n\t}\n\n\tRepeatValueObservable.prototype.subscribeCore = function (o) {\n\t  var state = {\n\t    value: this._value,\n\t    n: this._count,\n\t    o: o\n\t  };\n\t  return this._scheduler.scheduleRecursive(state, scheduleRecursive);\n\t};\n\n\tmodule.exports = function repeatValue(value, repeatCount, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.queue);\n\t  return new RepeatValueObservable(value, repeatCount, scheduler);\n\t};\n\n/***/ },\n/* 73 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar fromArray = __webpack_require__(50);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar isEqual = __webpack_require__(74);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tvar $iterator$ = typeof global.Symbol === 'function' && global.Symbol.iterator || '_es6shim_iterator_';\n\t// Bug for mozilla version\n\tif (global.Set && typeof new global.Set()['@@iterator'] === 'function') {\n\t  $iterator$ = '@@iterator';\n\t}\n\n\tfunction isIterable(o) {\n\t  return o && o[$iterator$] !== undefined;\n\t}\n\n\tfunction isArrayLike(o) {\n\t  return o && o.length !== undefined;\n\t}\n\n\tfunction FirstObserver(state) {\n\t  this._s = state;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(FirstObserver, AbstractObserver);\n\n\tFirstObserver.prototype.next = function (x) {\n\t  if (this._s.qr.length > 0) {\n\t    var v = this._s.qr.shift();\n\t    var equal = tryCatch(this._s.cmp)(v, x);\n\t    if (equal === errorObj) {\n\t      return this._s.o.onError(equal.e);\n\t    }\n\t    if (!equal) {\n\t      this._s.o.onNext(false);\n\t      this._s.o.onCompleted();\n\t    }\n\t  } else if (this._s.doner) {\n\t    this._s.o.onNext(false);\n\t    this._s.o.onCompleted();\n\t  } else {\n\t    this._s.ql.push(x);\n\t  }\n\t};\n\n\tFirstObserver.prototype.error = function (e) {\n\t  this._s.o.onError(e);\n\t};\n\n\tFirstObserver.prototype.completed = function () {\n\t  this._s.donel = true;\n\t  if (this._s.ql.length === 0) {\n\t    if (this._s.qr.length > 0) {\n\t      this._s.o.onNext(false);\n\t      this._s.o.onCompleted();\n\t    } else if (this._s.doner) {\n\t      this._s.o.onNext(true);\n\t      this._s.o.onCompleted();\n\t    }\n\t  }\n\t};\n\n\tfunction SecondObserver(state) {\n\t  this._s = state;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SecondObserver, AbstractObserver);\n\n\tSecondObserver.prototype.next = function (x) {\n\t  if (this._s.ql.length > 0) {\n\t    var v = this._s.ql.shift();\n\t    var equal = tryCatch(this._s.cmp)(v, x);\n\t    if (equal === errorObj) {\n\t      return this._s.o.onError(equal.e);\n\t    }\n\t    if (!equal) {\n\t      this._s.o.onNext(false);\n\t      this._s.o.onCompleted();\n\t    }\n\t  } else if (this._s.donel) {\n\t    this._s.o.onNext(false);\n\t    this._s.o.onCompleted();\n\t  } else {\n\t    this._s.qr.push(x);\n\t  }\n\t};\n\n\tSecondObserver.prototype.error = function (e) {\n\t  this._s.o.onError(e);\n\t};\n\n\tSecondObserver.prototype.completed = function () {\n\t  this._s.doner = true;\n\t  if (this._s.qr.length === 0) {\n\t    if (this._s.ql.length > 0) {\n\t      this._s.o.onNext(false);\n\t      this._s.o.onCompleted();\n\t    } else if (this._s.donel) {\n\t      this._s.o.onNext(true);\n\t      this._s.o.onCompleted();\n\t    }\n\t  }\n\t};\n\n\tfunction SequenceEqualObservable(first, second, comparer) {\n\t  this._first = first;\n\t  this._second = second;\n\t  this._cmp = comparer;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(SequenceEqualObservable, ObservableBase);\n\n\tSequenceEqualObservable.prototype.subscribeCore = function (o) {\n\t  (isArrayLike(this._first) || isIterable(this._first)) && (this._first = fromArray(this._first));\n\t  isPromise(this._first) && (this._first = fromPromise(this._first));\n\n\t  (isArrayLike(this._second) || isIterable(this._second)) && (this._second = fromArray(this._second));\n\t  isPromise(this._second) && (this._second = fromPromise(this._second));\n\n\t  var state = {\n\t    o: o,\n\t    donel: false,\n\t    doner: false,\n\t    ql: [],\n\t    qr: [],\n\t    cmp: this._cmp\n\t  };\n\n\t  return new BinaryDisposable(this._first.subscribe(new FirstObserver(state)), this._second.subscribe(new SecondObserver(state)));\n\t};\n\n\tmodule.exports = function sequenceEqual(first, second, comparer) {\n\t  comparer || (comparer = isEqual);\n\t  return new SequenceEqualObservable(first, second, comparer);\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 74 */\n/***/ function(module, exports) {\n\n\tvar argsTag = '[object Arguments]',\n\t    arrayTag = '[object Array]',\n\t    boolTag = '[object Boolean]',\n\t    dateTag = '[object Date]',\n\t    errorTag = '[object Error]',\n\t    funcTag = '[object Function]',\n\t    mapTag = '[object Map]',\n\t    numberTag = '[object Number]',\n\t    objectTag = '[object Object]',\n\t    regexpTag = '[object RegExp]',\n\t    setTag = '[object Set]',\n\t    stringTag = '[object String]',\n\t    weakMapTag = '[object WeakMap]';\n\n\tvar arrayBufferTag = '[object ArrayBuffer]',\n\t    float32Tag = '[object Float32Array]',\n\t    float64Tag = '[object Float64Array]',\n\t    int8Tag = '[object Int8Array]',\n\t    int16Tag = '[object Int16Array]',\n\t    int32Tag = '[object Int32Array]',\n\t    uint8Tag = '[object Uint8Array]',\n\t    uint8ClampedTag = '[object Uint8ClampedArray]',\n\t    uint16Tag = '[object Uint16Array]',\n\t    uint32Tag = '[object Uint32Array]';\n\n\tvar typedArrayTags = {};\n\ttypedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;\n\ttypedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\n\tvar objectProto = Object.prototype,\n\t    hasOwnProperty = objectProto.hasOwnProperty,\n\t    objToString = objectProto.toString,\n\t    MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\n\tvar keys = Object.keys || function () {\n\t  var hasOwnProperty = Object.prototype.hasOwnProperty,\n\t      hasDontEnumBug = !{ toString: null }.propertyIsEnumerable('toString'),\n\t      dontEnums = ['toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor'],\n\t      dontEnumsLength = dontEnums.length;\n\n\t  return function (obj) {\n\t    if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n\t      throw new TypeError('Object.keys called on non-object');\n\t    }\n\n\t    var result = [],\n\t        prop,\n\t        i;\n\n\t    for (prop in obj) {\n\t      if (hasOwnProperty.call(obj, prop)) {\n\t        result.push(prop);\n\t      }\n\t    }\n\n\t    if (hasDontEnumBug) {\n\t      for (i = 0; i < dontEnumsLength; i++) {\n\t        if (hasOwnProperty.call(obj, dontEnums[i])) {\n\t          result.push(dontEnums[i]);\n\t        }\n\t      }\n\t    }\n\t    return result;\n\t  };\n\t}();\n\n\tfunction equalObjects(object, other, equalFunc, isLoose, stackA, stackB) {\n\t  var objProps = keys(object),\n\t      objLength = objProps.length,\n\t      othProps = keys(other),\n\t      othLength = othProps.length;\n\n\t  if (objLength !== othLength && !isLoose) {\n\t    return false;\n\t  }\n\t  var index = objLength,\n\t      key;\n\t  while (index--) {\n\t    key = objProps[index];\n\t    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n\t      return false;\n\t    }\n\t  }\n\t  var skipCtor = isLoose;\n\t  while (++index < objLength) {\n\t    key = objProps[index];\n\t    var objValue = object[key],\n\t        othValue = other[key],\n\t        result;\n\n\t    if (!(result === undefined ? equalFunc(objValue, othValue, isLoose, stackA, stackB) : result)) {\n\t      return false;\n\t    }\n\t    skipCtor || (skipCtor = key === 'constructor');\n\t  }\n\t  if (!skipCtor) {\n\t    var objCtor = object.constructor,\n\t        othCtor = other.constructor;\n\n\t    if (objCtor !== othCtor && 'constructor' in object && 'constructor' in other && !(typeof objCtor === 'function' && objCtor instanceof objCtor && typeof othCtor === 'function' && othCtor instanceof othCtor)) {\n\t      return false;\n\t    }\n\t  }\n\t  return true;\n\t}\n\n\tfunction equalByTag(object, other, tag) {\n\t  switch (tag) {\n\t    case boolTag:\n\t    case dateTag:\n\t      return +object === +other;\n\n\t    case errorTag:\n\t      return object.name === other.name && object.message === other.message;\n\n\t    case numberTag:\n\t      return object !== +object ? other !== +other : object === +other;\n\n\t    case regexpTag:\n\t    case stringTag:\n\t      return object === other + '';\n\t  }\n\t  return false;\n\t}\n\n\tfunction isObject(value) {\n\t  var type = typeof value;\n\t  return !!value && (type === 'object' || type === 'function');\n\t}\n\n\tfunction isObjectLike(value) {\n\t  return !!value && typeof value === 'object';\n\t}\n\n\tfunction isLength(value) {\n\t  return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n\t}\n\n\tvar isHostObject = function () {\n\t  try {\n\t    Object({ 'toString': 0 } + '');\n\t  } catch (e) {\n\t    return function () {\n\t      return false;\n\t    };\n\t  }\n\t  return function (value) {\n\t    return typeof value.toString !== 'function' && typeof (value + '') === 'string';\n\t  };\n\t}();\n\n\tfunction isTypedArray(value) {\n\t  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n\t}\n\n\tvar isArray = Array.isArray || function (value) {\n\t  return isObjectLike(value) && isLength(value.length) && objToString.call(value) === arrayTag;\n\t};\n\n\tfunction arraySome(array, predicate) {\n\t  var index = -1,\n\t      length = array.length;\n\n\t  while (++index < length) {\n\t    if (predicate(array[index], index, array)) {\n\t      return true;\n\t    }\n\t  }\n\t  return false;\n\t}\n\n\tfunction equalArrays(array, other, equalFunc, isLoose, stackA, stackB) {\n\t  var index = -1,\n\t      arrLength = array.length,\n\t      othLength = other.length;\n\n\t  if (arrLength !== othLength && !(isLoose && othLength > arrLength)) {\n\t    return false;\n\t  }\n\t  // Ignore non-index properties.\n\t  while (++index < arrLength) {\n\t    var arrValue = array[index],\n\t        othValue = other[index],\n\t        result;\n\n\t    if (result !== undefined) {\n\t      if (result) {\n\t        continue;\n\t      }\n\t      return false;\n\t    }\n\t    // Recursively compare arrays (susceptible to call stack limits).\n\t    if (isLoose) {\n\t      if (!arraySome(other, function (othValue) {\n\t        return arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB);\n\t      })) {\n\t        return false;\n\t      }\n\t    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB))) {\n\t      return false;\n\t    }\n\t  }\n\t  return true;\n\t}\n\n\tfunction baseIsEqualDeep(object, other, equalFunc, isLoose, stackA, stackB) {\n\t  var objIsArr = isArray(object),\n\t      othIsArr = isArray(other),\n\t      objTag = arrayTag,\n\t      othTag = arrayTag;\n\n\t  if (!objIsArr) {\n\t    objTag = objToString.call(object);\n\t    if (objTag === argsTag) {\n\t      objTag = objectTag;\n\t    } else if (objTag !== objectTag) {\n\t      objIsArr = isTypedArray(object);\n\t    }\n\t  }\n\t  if (!othIsArr) {\n\t    othTag = objToString.call(other);\n\t    if (othTag === argsTag) {\n\t      othTag = objectTag;\n\t    } else if (othTag !== objectTag) {\n\t      othIsArr = isTypedArray(other);\n\t    }\n\t  }\n\t  var objIsObj = objTag === objectTag && !isHostObject(object),\n\t      othIsObj = othTag === objectTag && !isHostObject(other),\n\t      isSameTag = objTag === othTag;\n\n\t  if (isSameTag && !(objIsArr || objIsObj)) {\n\t    return equalByTag(object, other, objTag);\n\t  }\n\t  if (!isLoose) {\n\t    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n\t        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n\t    if (objIsWrapped || othIsWrapped) {\n\t      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, isLoose, stackA, stackB);\n\t    }\n\t  }\n\t  if (!isSameTag) {\n\t    return false;\n\t  }\n\t  // Assume cyclic values are equal.\n\t  // For more information on detecting circular references see https://es5.github.io/#JO.\n\t  stackA || (stackA = []);\n\t  stackB || (stackB = []);\n\n\t  var length = stackA.length;\n\t  while (length--) {\n\t    if (stackA[length] === object) {\n\t      return stackB[length] === other;\n\t    }\n\t  }\n\t  // Add `object` and `other` to the stack of traversed objects.\n\t  stackA.push(object);\n\t  stackB.push(other);\n\n\t  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, isLoose, stackA, stackB);\n\n\t  stackA.pop();\n\t  stackB.pop();\n\n\t  return result;\n\t}\n\n\tfunction baseIsEqual(value, other, isLoose, stackA, stackB) {\n\t  if (value === other) {\n\t    return true;\n\t  }\n\t  if (value == null || other == null || !isObject(value) && !isObjectLike(other)) {\n\t    return value !== value && other !== other;\n\t  }\n\t  return baseIsEqualDeep(value, other, baseIsEqual, isLoose, stackA, stackB);\n\t}\n\n\tmodule.exports = function (value, other) {\n\t  return baseIsEqual(value, other);\n\t};\n\n/***/ },\n/* 75 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar toAsync = __webpack_require__(76);\n\n\tmodule.exports = function start(func, context, scheduler) {\n\t  return toAsync(func, context, scheduler)();\n\t};\n\n/***/ },\n/* 76 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AsyncSubject = __webpack_require__(31);\n\tvar asObservable = __webpack_require__(35);\n\tvar Scheduler = __webpack_require__(12);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction scheduleMethod(s, state) {\n\t  var result = tryCatch(state.func).apply(state.context, state.args);\n\t  if (result === errorObj) {\n\t    return state.subject.onError(result.e);\n\t  }\n\t  state.subject.onNext(result);\n\t  state.subject.onCompleted();\n\t}\n\n\tmodule.exports = function toAsync(func, context, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  return function asyncFn() {\n\t    var subject = new AsyncSubject(),\n\t        len = arguments.length,\n\t        args = new Array(len);\n\t    for (var i = 0; i < len; i++) {\n\t      args[i] = arguments[i];\n\t    }\n\t    var state = {\n\t      subject: subject,\n\t      args: args,\n\t      func: func,\n\t      context: context\n\t    };\n\n\t    scheduler.schedule(state, scheduleMethod);\n\t    return asObservable(subject);\n\t  };\n\t};\n\n/***/ },\n/* 77 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar fromPromise = __webpack_require__(27);\n\tvar throwError = __webpack_require__(40);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tmodule.exports = function startAsync(functionAsync) {\n\t  var promise = tryCatch(functionAsync)();\n\t  if (promise === errorObj) {\n\t    return throwError(promise.e);\n\t  }\n\t  return fromPromise(promise);\n\t};\n\n/***/ },\n/* 78 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar defer = __webpack_require__(39);\n\tvar interval = __webpack_require__(63);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction TimerObservable(dt, s) {\n\t  this._dt = dt;\n\t  this._s = s;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(TimerObservable, ObservableBase);\n\n\tfunction scheduleTimer(s, o) {\n\t  o.onNext(0);\n\t  o.onCompleted();\n\t}\n\n\tTimerObservable.prototype.subscribeCore = function (o) {\n\t  return this._s.scheduleFuture(o, this._dt, scheduleTimer);\n\t};\n\n\tfunction TimerPeriodObservable(dt, period, scheduler) {\n\t  this._dt = dt;\n\t  this._period = Scheduler.normalize(period);\n\t  this._scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(TimerPeriodObservable, ObservableBase);\n\n\tfunction scheduleTimerPeriod(state, recurse) {\n\t  if (state.p > 0) {\n\t    var now = state.scheduler.now();\n\t    state.dt = new Date(state.dt.getTime() + state.p);\n\t    state.dt.getTime() <= now && (state.dt = new Date(now + state.p));\n\t  }\n\t  state.o.onNext(state.i++);\n\t  recurse(state, new Date(state.dt));\n\t}\n\n\tTimerPeriodObservable.prototype.subscribeCore = function (o) {\n\t  var state = {\n\t    o: o,\n\t    i: 0,\n\t    p: this._period,\n\t    dt: this._dt,\n\t    scheduler: this._scheduler\n\t  };\n\t  return this._scheduler.scheduleRecursiveFuture(state, this._dt, scheduleTimerPeriod);\n\t};\n\n\tfunction timerRelativeAndPeriod(dt, period, scheduler) {\n\t  if (dt === period) {\n\t    return interval(dt, scheduler);\n\t  }\n\t  return defer(function () {\n\t    return new TimerPeriodObservable(new Date(scheduler.now() + dt), period, scheduler);\n\t  });\n\t}\n\n\t/**\n\t *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n\t * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n\t * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n\t * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n\t * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n\t */\n\tmodule.exports = function timer(dueTime, periodOrScheduler, scheduler) {\n\t  var period;\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  if (periodOrScheduler != null && typeof periodOrScheduler === 'number') {\n\t    period = periodOrScheduler;\n\t  } else if (Scheduler.isScheduler(periodOrScheduler)) {\n\t    scheduler = periodOrScheduler;\n\t  }\n\t  if ((dueTime instanceof Date || typeof dueTime === 'number') && period === undefined) {\n\t    return new TimerObservable(dueTime, scheduler);\n\t  }\n\t  if (dueTime instanceof Date && period !== undefined) {\n\t    return new TimerPeriodObservable(dueTime, periodOrScheduler, scheduler);\n\t  }\n\t  return timerRelativeAndPeriod(dueTime, period, scheduler);\n\t};\n\n/***/ },\n/* 79 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar throwError = __webpack_require__(40);\n\tvar CompositeDisposable = __webpack_require__(14);\n\tvar inherits = __webpack_require__(6);\n\n\t__webpack_require__(80);\n\n\tfunction WhenObserver(map, o) {\n\t  this._map = map;\n\t  this._o = o;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(WhenObserver, AbstractObserver);\n\n\tWhenObserver.prototype.next = function (x) {\n\t  this._o.onNext(x);\n\t};\n\tWhenObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\tWhenObserver.prototype.error = function (e) {\n\t  this._map.forEach(function (v) {\n\t    v.onError(e);\n\t  });\n\t  this._o.onError(e);\n\t};\n\n\tfunction WhenObservable(plans) {\n\t  this._plans = plans;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(WhenObservable, ObservableBase);\n\n\tWhenObservable.prototype.subscribeCore = function (o) {\n\t  var activePlans = [],\n\t      externalSubscriptions = new global.Map(),\n\t      outObserver = new WhenObserver(externalSubscriptions, o);\n\n\t  try {\n\t    for (var i = 0, len = this._plans.length; i < len; i++) {\n\t      activePlans.push(this._plans[i].activate(externalSubscriptions, outObserver, function (activePlan) {\n\t        var idx = activePlans.indexOf(activePlan);\n\t        activePlans.splice(idx, 1);\n\t        activePlans.length === 0 && o.onCompleted();\n\t      }));\n\t    }\n\t  } catch (e) {\n\t    return throwError(e).subscribe(o);\n\t  }\n\t  var group = new CompositeDisposable();\n\t  externalSubscriptions.forEach(function (joinObserver) {\n\t    joinObserver.subscribe();\n\t    group.add(joinObserver);\n\t  });\n\n\t  return group;\n\t};\n\n\t/**\n\t *  Joins together the results from several patterns.\n\t *\n\t *  @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns.\n\t *  @returns {Observable} Observable sequence with the results form matching several patterns.\n\t */\n\tmodule.exports = function when() {\n\t  var len = arguments.length,\n\t      plans = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    plans[i] = arguments[i];\n\t  }\n\t  return new WhenObservable(plans);\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 80 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tif (!__webpack_require__(81)()) {\n\t\tObject.defineProperty(__webpack_require__(82), 'Map',\n\t\t\t{ value: __webpack_require__(83), configurable: true, enumerable: false,\n\t\t\t\twritable: true });\n\t}\n\n\n/***/ },\n/* 81 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function () {\n\t\tvar map, iterator, result;\n\t\tif (typeof Map !== 'function') return false;\n\t\ttry {\n\t\t\t// WebKit doesn't support arguments and crashes\n\t\t\tmap = new Map([['raz', 'one'], ['dwa', 'two'], ['trzy', 'three']]);\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t\tif (String(map) !== '[object Map]') return false;\n\t\tif (map.size !== 3) return false;\n\t\tif (typeof map.clear !== 'function') return false;\n\t\tif (typeof map.delete !== 'function') return false;\n\t\tif (typeof map.entries !== 'function') return false;\n\t\tif (typeof map.forEach !== 'function') return false;\n\t\tif (typeof map.get !== 'function') return false;\n\t\tif (typeof map.has !== 'function') return false;\n\t\tif (typeof map.keys !== 'function') return false;\n\t\tif (typeof map.set !== 'function') return false;\n\t\tif (typeof map.values !== 'function') return false;\n\n\t\titerator = map.entries();\n\t\tresult = iterator.next();\n\t\tif (result.done !== false) return false;\n\t\tif (!result.value) return false;\n\t\tif (result.value[0] !== 'raz') return false;\n\t\tif (result.value[1] !== 'one') return false;\n\n\t\treturn true;\n\t};\n\n\n/***/ },\n/* 82 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = new Function(\"return this\")();\n\n\n/***/ },\n/* 83 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar clear          = __webpack_require__(84)\n\t  , eIndexOf       = __webpack_require__(86)\n\t  , setPrototypeOf = __webpack_require__(92)\n\t  , callable       = __webpack_require__(97)\n\t  , validValue     = __webpack_require__(85)\n\t  , d              = __webpack_require__(98)\n\t  , ee             = __webpack_require__(110)\n\t  , Symbol         = __webpack_require__(111)\n\t  , iterator       = __webpack_require__(116)\n\t  , forOf          = __webpack_require__(120)\n\t  , Iterator       = __webpack_require__(130)\n\t  , isNative       = __webpack_require__(133)\n\n\t  , call = Function.prototype.call\n\t  , defineProperties = Object.defineProperties, getPrototypeOf = Object.getPrototypeOf\n\t  , MapPoly;\n\n\tmodule.exports = MapPoly = function (/*iterable*/) {\n\t\tvar iterable = arguments[0], keys, values, self;\n\t\tif (!(this instanceof MapPoly)) throw new TypeError('Constructor requires \\'new\\'');\n\t\tif (isNative && setPrototypeOf && (Map !== MapPoly)) {\n\t\t\tself = setPrototypeOf(new Map(), getPrototypeOf(this));\n\t\t} else {\n\t\t\tself = this;\n\t\t}\n\t\tif (iterable != null) iterator(iterable);\n\t\tdefineProperties(self, {\n\t\t\t__mapKeysData__: d('c', keys = []),\n\t\t\t__mapValuesData__: d('c', values = [])\n\t\t});\n\t\tif (!iterable) return self;\n\t\tforOf(iterable, function (value) {\n\t\t\tvar key = validValue(value)[0];\n\t\t\tvalue = value[1];\n\t\t\tif (eIndexOf.call(keys, key) !== -1) return;\n\t\t\tkeys.push(key);\n\t\t\tvalues.push(value);\n\t\t}, self);\n\t\treturn self;\n\t};\n\n\tif (isNative) {\n\t\tif (setPrototypeOf) setPrototypeOf(MapPoly, Map);\n\t\tMapPoly.prototype = Object.create(Map.prototype, {\n\t\t\tconstructor: d(MapPoly)\n\t\t});\n\t}\n\n\tee(defineProperties(MapPoly.prototype, {\n\t\tclear: d(function () {\n\t\t\tif (!this.__mapKeysData__.length) return;\n\t\t\tclear.call(this.__mapKeysData__);\n\t\t\tclear.call(this.__mapValuesData__);\n\t\t\tthis.emit('_clear');\n\t\t}),\n\t\tdelete: d(function (key) {\n\t\t\tvar index = eIndexOf.call(this.__mapKeysData__, key);\n\t\t\tif (index === -1) return false;\n\t\t\tthis.__mapKeysData__.splice(index, 1);\n\t\t\tthis.__mapValuesData__.splice(index, 1);\n\t\t\tthis.emit('_delete', index, key);\n\t\t\treturn true;\n\t\t}),\n\t\tentries: d(function () { return new Iterator(this, 'key+value'); }),\n\t\tforEach: d(function (cb/*, thisArg*/) {\n\t\t\tvar thisArg = arguments[1], iterator, result;\n\t\t\tcallable(cb);\n\t\t\titerator = this.entries();\n\t\t\tresult = iterator._next();\n\t\t\twhile (result !== undefined) {\n\t\t\t\tcall.call(cb, thisArg, this.__mapValuesData__[result],\n\t\t\t\t\tthis.__mapKeysData__[result], this);\n\t\t\t\tresult = iterator._next();\n\t\t\t}\n\t\t}),\n\t\tget: d(function (key) {\n\t\t\tvar index = eIndexOf.call(this.__mapKeysData__, key);\n\t\t\tif (index === -1) return;\n\t\t\treturn this.__mapValuesData__[index];\n\t\t}),\n\t\thas: d(function (key) {\n\t\t\treturn (eIndexOf.call(this.__mapKeysData__, key) !== -1);\n\t\t}),\n\t\tkeys: d(function () { return new Iterator(this, 'key'); }),\n\t\tset: d(function (key, value) {\n\t\t\tvar index = eIndexOf.call(this.__mapKeysData__, key), emit;\n\t\t\tif (index === -1) {\n\t\t\t\tindex = this.__mapKeysData__.push(key) - 1;\n\t\t\t\temit = true;\n\t\t\t}\n\t\t\tthis.__mapValuesData__[index] = value;\n\t\t\tif (emit) this.emit('_add', index, key);\n\t\t\treturn this;\n\t\t}),\n\t\tsize: d.gs(function () { return this.__mapKeysData__.length; }),\n\t\tvalues: d(function () { return new Iterator(this, 'value'); }),\n\t\ttoString: d(function () { return '[object Map]'; })\n\t}));\n\tObject.defineProperty(MapPoly.prototype, Symbol.iterator, d(function () {\n\t\treturn this.entries();\n\t}));\n\tObject.defineProperty(MapPoly.prototype, Symbol.toStringTag, d('c', 'Map'));\n\n\n/***/ },\n/* 84 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// Inspired by Google Closure:\n\t// http://closure-library.googlecode.com/svn/docs/\n\t// closure_goog_array_array.js.html#goog.array.clear\n\n\t'use strict';\n\n\tvar value = __webpack_require__(85);\n\n\tmodule.exports = function () {\n\t\tvalue(this).length = 0;\n\t\treturn this;\n\t};\n\n\n/***/ },\n/* 85 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function (value) {\n\t\tif (value == null) throw new TypeError(\"Cannot use null or undefined\");\n\t\treturn value;\n\t};\n\n\n/***/ },\n/* 86 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar toPosInt = __webpack_require__(87)\n\t  , value    = __webpack_require__(85)\n\n\t  , indexOf = Array.prototype.indexOf\n\t  , hasOwnProperty = Object.prototype.hasOwnProperty\n\t  , abs = Math.abs, floor = Math.floor;\n\n\tmodule.exports = function (searchElement/*, fromIndex*/) {\n\t\tvar i, l, fromIndex, val;\n\t\tif (searchElement === searchElement) { //jslint: ignore\n\t\t\treturn indexOf.apply(this, arguments);\n\t\t}\n\n\t\tl = toPosInt(value(this).length);\n\t\tfromIndex = arguments[1];\n\t\tif (isNaN(fromIndex)) fromIndex = 0;\n\t\telse if (fromIndex >= 0) fromIndex = floor(fromIndex);\n\t\telse fromIndex = toPosInt(this.length) - floor(abs(fromIndex));\n\n\t\tfor (i = fromIndex; i < l; ++i) {\n\t\t\tif (hasOwnProperty.call(this, i)) {\n\t\t\t\tval = this[i];\n\t\t\t\tif (val !== val) return i; //jslint: ignore\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t};\n\n\n/***/ },\n/* 87 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar toInteger = __webpack_require__(88)\n\n\t  , max = Math.max;\n\n\tmodule.exports = function (value) { return max(0, toInteger(value)); };\n\n\n/***/ },\n/* 88 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar sign = __webpack_require__(89)\n\n\t  , abs = Math.abs, floor = Math.floor;\n\n\tmodule.exports = function (value) {\n\t\tif (isNaN(value)) return 0;\n\t\tvalue = Number(value);\n\t\tif ((value === 0) || !isFinite(value)) return value;\n\t\treturn sign(value) * floor(abs(value));\n\t};\n\n\n/***/ },\n/* 89 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tmodule.exports = __webpack_require__(90)()\n\t\t? Math.sign\n\t\t: __webpack_require__(91);\n\n\n/***/ },\n/* 90 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function () {\n\t\tvar sign = Math.sign;\n\t\tif (typeof sign !== 'function') return false;\n\t\treturn ((sign(10) === 1) && (sign(-20) === -1));\n\t};\n\n\n/***/ },\n/* 91 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function (value) {\n\t\tvalue = Number(value);\n\t\tif (isNaN(value) || (value === 0)) return value;\n\t\treturn (value > 0) ? 1 : -1;\n\t};\n\n\n/***/ },\n/* 92 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tmodule.exports = __webpack_require__(93)()\n\t\t? Object.setPrototypeOf\n\t\t: __webpack_require__(94);\n\n\n/***/ },\n/* 93 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tvar create = Object.create, getPrototypeOf = Object.getPrototypeOf\n\t  , x = {};\n\n\tmodule.exports = function (/*customCreate*/) {\n\t\tvar setPrototypeOf = Object.setPrototypeOf\n\t\t  , customCreate = arguments[0] || create;\n\t\tif (typeof setPrototypeOf !== 'function') return false;\n\t\treturn getPrototypeOf(setPrototypeOf(customCreate(null), x)) === x;\n\t};\n\n\n/***/ },\n/* 94 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// Big thanks to @WebReflection for sorting this out\n\t// https://gist.github.com/WebReflection/5593554\n\n\t'use strict';\n\n\tvar isObject      = __webpack_require__(95)\n\t  , value         = __webpack_require__(85)\n\n\t  , isPrototypeOf = Object.prototype.isPrototypeOf\n\t  , defineProperty = Object.defineProperty\n\t  , nullDesc = { configurable: true, enumerable: false, writable: true,\n\t\t\tvalue: undefined }\n\t  , validate;\n\n\tvalidate = function (obj, prototype) {\n\t\tvalue(obj);\n\t\tif ((prototype === null) || isObject(prototype)) return obj;\n\t\tthrow new TypeError('Prototype must be null or an object');\n\t};\n\n\tmodule.exports = (function (status) {\n\t\tvar fn, set;\n\t\tif (!status) return null;\n\t\tif (status.level === 2) {\n\t\t\tif (status.set) {\n\t\t\t\tset = status.set;\n\t\t\t\tfn = function (obj, prototype) {\n\t\t\t\t\tset.call(validate(obj, prototype), prototype);\n\t\t\t\t\treturn obj;\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tfn = function (obj, prototype) {\n\t\t\t\t\tvalidate(obj, prototype).__proto__ = prototype;\n\t\t\t\t\treturn obj;\n\t\t\t\t};\n\t\t\t}\n\t\t} else {\n\t\t\tfn = function self(obj, prototype) {\n\t\t\t\tvar isNullBase;\n\t\t\t\tvalidate(obj, prototype);\n\t\t\t\tisNullBase = isPrototypeOf.call(self.nullPolyfill, obj);\n\t\t\t\tif (isNullBase) delete self.nullPolyfill.__proto__;\n\t\t\t\tif (prototype === null) prototype = self.nullPolyfill;\n\t\t\t\tobj.__proto__ = prototype;\n\t\t\t\tif (isNullBase) defineProperty(self.nullPolyfill, '__proto__', nullDesc);\n\t\t\t\treturn obj;\n\t\t\t};\n\t\t}\n\t\treturn Object.defineProperty(fn, 'level', { configurable: false,\n\t\t\tenumerable: false, writable: false, value: status.level });\n\t}((function () {\n\t\tvar x = Object.create(null), y = {}, set\n\t\t  , desc = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__');\n\n\t\tif (desc) {\n\t\t\ttry {\n\t\t\t\tset = desc.set; // Opera crashes at this point\n\t\t\t\tset.call(x, y);\n\t\t\t} catch (ignore) { }\n\t\t\tif (Object.getPrototypeOf(x) === y) return { set: set, level: 2 };\n\t\t}\n\n\t\tx.__proto__ = y;\n\t\tif (Object.getPrototypeOf(x) === y) return { level: 2 };\n\n\t\tx = {};\n\t\tx.__proto__ = y;\n\t\tif (Object.getPrototypeOf(x) === y) return { level: 1 };\n\n\t\treturn false;\n\t}())));\n\n\t__webpack_require__(96);\n\n\n/***/ },\n/* 95 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tvar map = { function: true, object: true };\n\n\tmodule.exports = function (x) {\n\t\treturn ((x != null) && map[typeof x]) || false;\n\t};\n\n\n/***/ },\n/* 96 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// Workaround for http://code.google.com/p/v8/issues/detail?id=2804\n\n\t'use strict';\n\n\tvar create = Object.create, shim;\n\n\tif (!__webpack_require__(93)()) {\n\t\tshim = __webpack_require__(94);\n\t}\n\n\tmodule.exports = (function () {\n\t\tvar nullObject, props, desc;\n\t\tif (!shim) return create;\n\t\tif (shim.level !== 1) return create;\n\n\t\tnullObject = {};\n\t\tprops = {};\n\t\tdesc = { configurable: false, enumerable: false, writable: true,\n\t\t\tvalue: undefined };\n\t\tObject.getOwnPropertyNames(Object.prototype).forEach(function (name) {\n\t\t\tif (name === '__proto__') {\n\t\t\t\tprops[name] = { configurable: true, enumerable: false, writable: true,\n\t\t\t\t\tvalue: undefined };\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tprops[name] = desc;\n\t\t});\n\t\tObject.defineProperties(nullObject, props);\n\n\t\tObject.defineProperty(shim, 'nullPolyfill', { configurable: false,\n\t\t\tenumerable: false, writable: false, value: nullObject });\n\n\t\treturn function (prototype, props) {\n\t\t\treturn create((prototype === null) ? nullObject : prototype, props);\n\t\t};\n\t}());\n\n\n/***/ },\n/* 97 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function (fn) {\n\t\tif (typeof fn !== 'function') throw new TypeError(fn + \" is not a function\");\n\t\treturn fn;\n\t};\n\n\n/***/ },\n/* 98 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar assign        = __webpack_require__(99)\n\t  , normalizeOpts = __webpack_require__(105)\n\t  , isCallable    = __webpack_require__(106)\n\t  , contains      = __webpack_require__(107)\n\n\t  , d;\n\n\td = module.exports = function (dscr, value/*, options*/) {\n\t\tvar c, e, w, options, desc;\n\t\tif ((arguments.length < 2) || (typeof dscr !== 'string')) {\n\t\t\toptions = value;\n\t\t\tvalue = dscr;\n\t\t\tdscr = null;\n\t\t} else {\n\t\t\toptions = arguments[2];\n\t\t}\n\t\tif (dscr == null) {\n\t\t\tc = w = true;\n\t\t\te = false;\n\t\t} else {\n\t\t\tc = contains.call(dscr, 'c');\n\t\t\te = contains.call(dscr, 'e');\n\t\t\tw = contains.call(dscr, 'w');\n\t\t}\n\n\t\tdesc = { value: value, configurable: c, enumerable: e, writable: w };\n\t\treturn !options ? desc : assign(normalizeOpts(options), desc);\n\t};\n\n\td.gs = function (dscr, get, set/*, options*/) {\n\t\tvar c, e, options, desc;\n\t\tif (typeof dscr !== 'string') {\n\t\t\toptions = set;\n\t\t\tset = get;\n\t\t\tget = dscr;\n\t\t\tdscr = null;\n\t\t} else {\n\t\t\toptions = arguments[3];\n\t\t}\n\t\tif (get == null) {\n\t\t\tget = undefined;\n\t\t} else if (!isCallable(get)) {\n\t\t\toptions = get;\n\t\t\tget = set = undefined;\n\t\t} else if (set == null) {\n\t\t\tset = undefined;\n\t\t} else if (!isCallable(set)) {\n\t\t\toptions = set;\n\t\t\tset = undefined;\n\t\t}\n\t\tif (dscr == null) {\n\t\t\tc = true;\n\t\t\te = false;\n\t\t} else {\n\t\t\tc = contains.call(dscr, 'c');\n\t\t\te = contains.call(dscr, 'e');\n\t\t}\n\n\t\tdesc = { get: get, set: set, configurable: c, enumerable: e };\n\t\treturn !options ? desc : assign(normalizeOpts(options), desc);\n\t};\n\n\n/***/ },\n/* 99 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tmodule.exports = __webpack_require__(100)()\n\t\t? Object.assign\n\t\t: __webpack_require__(101);\n\n\n/***/ },\n/* 100 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function () {\n\t\tvar assign = Object.assign, obj;\n\t\tif (typeof assign !== 'function') return false;\n\t\tobj = { foo: 'raz' };\n\t\tassign(obj, { bar: 'dwa' }, { trzy: 'trzy' });\n\t\treturn (obj.foo + obj.bar + obj.trzy) === 'razdwatrzy';\n\t};\n\n\n/***/ },\n/* 101 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar keys  = __webpack_require__(102)\n\t  , value = __webpack_require__(85)\n\n\t  , max = Math.max;\n\n\tmodule.exports = function (dest, src/*, …srcn*/) {\n\t\tvar error, i, l = max(arguments.length, 2), assign;\n\t\tdest = Object(value(dest));\n\t\tassign = function (key) {\n\t\t\ttry { dest[key] = src[key]; } catch (e) {\n\t\t\t\tif (!error) error = e;\n\t\t\t}\n\t\t};\n\t\tfor (i = 1; i < l; ++i) {\n\t\t\tsrc = arguments[i];\n\t\t\tkeys(src).forEach(assign);\n\t\t}\n\t\tif (error !== undefined) throw error;\n\t\treturn dest;\n\t};\n\n\n/***/ },\n/* 102 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tmodule.exports = __webpack_require__(103)()\n\t\t? Object.keys\n\t\t: __webpack_require__(104);\n\n\n/***/ },\n/* 103 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function () {\n\t\ttry {\n\t\t\tObject.keys('primitive');\n\t\t\treturn true;\n\t\t} catch (e) { return false; }\n\t};\n\n\n/***/ },\n/* 104 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tvar keys = Object.keys;\n\n\tmodule.exports = function (object) {\n\t\treturn keys(object == null ? object : Object(object));\n\t};\n\n\n/***/ },\n/* 105 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tvar forEach = Array.prototype.forEach, create = Object.create;\n\n\tvar process = function (src, obj) {\n\t\tvar key;\n\t\tfor (key in src) obj[key] = src[key];\n\t};\n\n\tmodule.exports = function (options/*, …options*/) {\n\t\tvar result = create(null);\n\t\tforEach.call(arguments, function (options) {\n\t\t\tif (options == null) return;\n\t\t\tprocess(Object(options), result);\n\t\t});\n\t\treturn result;\n\t};\n\n\n/***/ },\n/* 106 */\n/***/ function(module, exports) {\n\n\t// Deprecated\n\n\t'use strict';\n\n\tmodule.exports = function (obj) { return typeof obj === 'function'; };\n\n\n/***/ },\n/* 107 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tmodule.exports = __webpack_require__(108)()\n\t\t? String.prototype.contains\n\t\t: __webpack_require__(109);\n\n\n/***/ },\n/* 108 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tvar str = 'razdwatrzy';\n\n\tmodule.exports = function () {\n\t\tif (typeof str.contains !== 'function') return false;\n\t\treturn ((str.contains('dwa') === true) && (str.contains('foo') === false));\n\t};\n\n\n/***/ },\n/* 109 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tvar indexOf = String.prototype.indexOf;\n\n\tmodule.exports = function (searchString/*, position*/) {\n\t\treturn indexOf.call(this, searchString, arguments[1]) > -1;\n\t};\n\n\n/***/ },\n/* 110 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar d        = __webpack_require__(98)\n\t  , callable = __webpack_require__(97)\n\n\t  , apply = Function.prototype.apply, call = Function.prototype.call\n\t  , create = Object.create, defineProperty = Object.defineProperty\n\t  , defineProperties = Object.defineProperties\n\t  , hasOwnProperty = Object.prototype.hasOwnProperty\n\t  , descriptor = { configurable: true, enumerable: false, writable: true }\n\n\t  , on, once, off, emit, methods, descriptors, base;\n\n\ton = function (type, listener) {\n\t\tvar data;\n\n\t\tcallable(listener);\n\n\t\tif (!hasOwnProperty.call(this, '__ee__')) {\n\t\t\tdata = descriptor.value = create(null);\n\t\t\tdefineProperty(this, '__ee__', descriptor);\n\t\t\tdescriptor.value = null;\n\t\t} else {\n\t\t\tdata = this.__ee__;\n\t\t}\n\t\tif (!data[type]) data[type] = listener;\n\t\telse if (typeof data[type] === 'object') data[type].push(listener);\n\t\telse data[type] = [data[type], listener];\n\n\t\treturn this;\n\t};\n\n\tonce = function (type, listener) {\n\t\tvar once, self;\n\n\t\tcallable(listener);\n\t\tself = this;\n\t\ton.call(this, type, once = function () {\n\t\t\toff.call(self, type, once);\n\t\t\tapply.call(listener, this, arguments);\n\t\t});\n\n\t\tonce.__eeOnceListener__ = listener;\n\t\treturn this;\n\t};\n\n\toff = function (type, listener) {\n\t\tvar data, listeners, candidate, i;\n\n\t\tcallable(listener);\n\n\t\tif (!hasOwnProperty.call(this, '__ee__')) return this;\n\t\tdata = this.__ee__;\n\t\tif (!data[type]) return this;\n\t\tlisteners = data[type];\n\n\t\tif (typeof listeners === 'object') {\n\t\t\tfor (i = 0; (candidate = listeners[i]); ++i) {\n\t\t\t\tif ((candidate === listener) ||\n\t\t\t\t\t\t(candidate.__eeOnceListener__ === listener)) {\n\t\t\t\t\tif (listeners.length === 2) data[type] = listeners[i ? 0 : 1];\n\t\t\t\t\telse listeners.splice(i, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif ((listeners === listener) ||\n\t\t\t\t\t(listeners.__eeOnceListener__ === listener)) {\n\t\t\t\tdelete data[type];\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n\n\temit = function (type) {\n\t\tvar i, l, listener, listeners, args;\n\n\t\tif (!hasOwnProperty.call(this, '__ee__')) return;\n\t\tlisteners = this.__ee__[type];\n\t\tif (!listeners) return;\n\n\t\tif (typeof listeners === 'object') {\n\t\t\tl = arguments.length;\n\t\t\targs = new Array(l - 1);\n\t\t\tfor (i = 1; i < l; ++i) args[i - 1] = arguments[i];\n\n\t\t\tlisteners = listeners.slice();\n\t\t\tfor (i = 0; (listener = listeners[i]); ++i) {\n\t\t\t\tapply.call(listener, this, args);\n\t\t\t}\n\t\t} else {\n\t\t\tswitch (arguments.length) {\n\t\t\tcase 1:\n\t\t\t\tcall.call(listeners, this);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tcall.call(listeners, this, arguments[1]);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tcall.call(listeners, this, arguments[1], arguments[2]);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tl = arguments.length;\n\t\t\t\targs = new Array(l - 1);\n\t\t\t\tfor (i = 1; i < l; ++i) {\n\t\t\t\t\targs[i - 1] = arguments[i];\n\t\t\t\t}\n\t\t\t\tapply.call(listeners, this, args);\n\t\t\t}\n\t\t}\n\t};\n\n\tmethods = {\n\t\ton: on,\n\t\tonce: once,\n\t\toff: off,\n\t\temit: emit\n\t};\n\n\tdescriptors = {\n\t\ton: d(on),\n\t\tonce: d(once),\n\t\toff: d(off),\n\t\temit: d(emit)\n\t};\n\n\tbase = defineProperties({}, descriptors);\n\n\tmodule.exports = exports = function (o) {\n\t\treturn (o == null) ? create(base) : defineProperties(Object(o), descriptors);\n\t};\n\texports.methods = methods;\n\n\n/***/ },\n/* 111 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tmodule.exports = __webpack_require__(112)() ? Symbol : __webpack_require__(113);\n\n\n/***/ },\n/* 112 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function () {\n\t\tvar symbol;\n\t\tif (typeof Symbol !== 'function') return false;\n\t\tsymbol = Symbol('test symbol');\n\t\ttry { String(symbol); } catch (e) { return false; }\n\t\tif (typeof Symbol.iterator === 'symbol') return true;\n\n\t\t// Return 'true' for polyfills\n\t\tif (typeof Symbol.isConcatSpreadable !== 'object') return false;\n\t\tif (typeof Symbol.iterator !== 'object') return false;\n\t\tif (typeof Symbol.toPrimitive !== 'object') return false;\n\t\tif (typeof Symbol.toStringTag !== 'object') return false;\n\t\tif (typeof Symbol.unscopables !== 'object') return false;\n\n\t\treturn true;\n\t};\n\n\n/***/ },\n/* 113 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// ES2015 Symbol polyfill for environments that do not support it (or partially support it_\n\n\t'use strict';\n\n\tvar d              = __webpack_require__(98)\n\t  , validateSymbol = __webpack_require__(114)\n\n\t  , create = Object.create, defineProperties = Object.defineProperties\n\t  , defineProperty = Object.defineProperty, objPrototype = Object.prototype\n\t  , NativeSymbol, SymbolPolyfill, HiddenSymbol, globalSymbols = create(null);\n\n\tif (typeof Symbol === 'function') NativeSymbol = Symbol;\n\n\tvar generateName = (function () {\n\t\tvar created = create(null);\n\t\treturn function (desc) {\n\t\t\tvar postfix = 0, name, ie11BugWorkaround;\n\t\t\twhile (created[desc + (postfix || '')]) ++postfix;\n\t\t\tdesc += (postfix || '');\n\t\t\tcreated[desc] = true;\n\t\t\tname = '@@' + desc;\n\t\t\tdefineProperty(objPrototype, name, d.gs(null, function (value) {\n\t\t\t\t// For IE11 issue see:\n\t\t\t\t// https://connect.microsoft.com/IE/feedbackdetail/view/1928508/\n\t\t\t\t//    ie11-broken-getters-on-dom-objects\n\t\t\t\t// https://github.com/medikoo/es6-symbol/issues/12\n\t\t\t\tif (ie11BugWorkaround) return;\n\t\t\t\tie11BugWorkaround = true;\n\t\t\t\tdefineProperty(this, name, d(value));\n\t\t\t\tie11BugWorkaround = false;\n\t\t\t}));\n\t\t\treturn name;\n\t\t};\n\t}());\n\n\t// Internal constructor (not one exposed) for creating Symbol instances.\n\t// This one is used to ensure that `someSymbol instanceof Symbol` always return false\n\tHiddenSymbol = function Symbol(description) {\n\t\tif (this instanceof HiddenSymbol) throw new TypeError('TypeError: Symbol is not a constructor');\n\t\treturn SymbolPolyfill(description);\n\t};\n\n\t// Exposed `Symbol` constructor\n\t// (returns instances of HiddenSymbol)\n\tmodule.exports = SymbolPolyfill = function Symbol(description) {\n\t\tvar symbol;\n\t\tif (this instanceof Symbol) throw new TypeError('TypeError: Symbol is not a constructor');\n\t\tsymbol = create(HiddenSymbol.prototype);\n\t\tdescription = (description === undefined ? '' : String(description));\n\t\treturn defineProperties(symbol, {\n\t\t\t__description__: d('', description),\n\t\t\t__name__: d('', generateName(description))\n\t\t});\n\t};\n\tdefineProperties(SymbolPolyfill, {\n\t\tfor: d(function (key) {\n\t\t\tif (globalSymbols[key]) return globalSymbols[key];\n\t\t\treturn (globalSymbols[key] = SymbolPolyfill(String(key)));\n\t\t}),\n\t\tkeyFor: d(function (s) {\n\t\t\tvar key;\n\t\t\tvalidateSymbol(s);\n\t\t\tfor (key in globalSymbols) if (globalSymbols[key] === s) return key;\n\t\t}),\n\n\t\t// If there's native implementation of given symbol, let's fallback to it\n\t\t// to ensure proper interoperability with other native functions e.g. Array.from\n\t\thasInstance: d('', (NativeSymbol && NativeSymbol.hasInstance) || SymbolPolyfill('hasInstance')),\n\t\tisConcatSpreadable: d('', (NativeSymbol && NativeSymbol.isConcatSpreadable) ||\n\t\t\tSymbolPolyfill('isConcatSpreadable')),\n\t\titerator: d('', (NativeSymbol && NativeSymbol.iterator) || SymbolPolyfill('iterator')),\n\t\tmatch: d('', (NativeSymbol && NativeSymbol.match) || SymbolPolyfill('match')),\n\t\treplace: d('', (NativeSymbol && NativeSymbol.replace) || SymbolPolyfill('replace')),\n\t\tsearch: d('', (NativeSymbol && NativeSymbol.search) || SymbolPolyfill('search')),\n\t\tspecies: d('', (NativeSymbol && NativeSymbol.species) || SymbolPolyfill('species')),\n\t\tsplit: d('', (NativeSymbol && NativeSymbol.split) || SymbolPolyfill('split')),\n\t\ttoPrimitive: d('', (NativeSymbol && NativeSymbol.toPrimitive) || SymbolPolyfill('toPrimitive')),\n\t\ttoStringTag: d('', (NativeSymbol && NativeSymbol.toStringTag) || SymbolPolyfill('toStringTag')),\n\t\tunscopables: d('', (NativeSymbol && NativeSymbol.unscopables) || SymbolPolyfill('unscopables'))\n\t});\n\n\t// Internal tweaks for real symbol producer\n\tdefineProperties(HiddenSymbol.prototype, {\n\t\tconstructor: d(SymbolPolyfill),\n\t\ttoString: d('', function () { return this.__name__; })\n\t});\n\n\t// Proper implementation of methods exposed on Symbol.prototype\n\t// They won't be accessible on produced symbol instances as they derive from HiddenSymbol.prototype\n\tdefineProperties(SymbolPolyfill.prototype, {\n\t\ttoString: d(function () { return 'Symbol (' + validateSymbol(this).__description__ + ')'; }),\n\t\tvalueOf: d(function () { return validateSymbol(this); })\n\t});\n\tdefineProperty(SymbolPolyfill.prototype, SymbolPolyfill.toPrimitive, d('',\n\t\tfunction () { return validateSymbol(this); }));\n\tdefineProperty(SymbolPolyfill.prototype, SymbolPolyfill.toStringTag, d('c', 'Symbol'));\n\n\t// Proper implementaton of toPrimitive and toStringTag for returned symbol instances\n\tdefineProperty(HiddenSymbol.prototype, SymbolPolyfill.toStringTag,\n\t\td('c', SymbolPolyfill.prototype[SymbolPolyfill.toStringTag]));\n\n\t// Note: It's important to define `toPrimitive` as last one, as some implementations\n\t// implement `toPrimitive` natively without implementing `toStringTag` (or other specified symbols)\n\t// And that may invoke error in definition flow:\n\t// See: https://github.com/medikoo/es6-symbol/issues/13#issuecomment-164146149\n\tdefineProperty(HiddenSymbol.prototype, SymbolPolyfill.toPrimitive,\n\t\td('c', SymbolPolyfill.prototype[SymbolPolyfill.toPrimitive]));\n\n\n/***/ },\n/* 114 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar isSymbol = __webpack_require__(115);\n\n\tmodule.exports = function (value) {\n\t\tif (!isSymbol(value)) throw new TypeError(value + \" is not a symbol\");\n\t\treturn value;\n\t};\n\n\n/***/ },\n/* 115 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function (x) {\n\t\treturn (x && ((typeof x === 'symbol') || (x['@@toStringTag'] === 'Symbol'))) || false;\n\t};\n\n\n/***/ },\n/* 116 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar isIterable = __webpack_require__(117);\n\n\tmodule.exports = function (value) {\n\t\tif (!isIterable(value)) throw new TypeError(value + \" is not iterable\");\n\t\treturn value;\n\t};\n\n\n/***/ },\n/* 117 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar isArguments    = __webpack_require__(118)\n\t  , isString       = __webpack_require__(119)\n\t  , iteratorSymbol = __webpack_require__(111).iterator\n\n\t  , isArray = Array.isArray;\n\n\tmodule.exports = function (value) {\n\t\tif (value == null) return false;\n\t\tif (isArray(value)) return true;\n\t\tif (isString(value)) return true;\n\t\tif (isArguments(value)) return true;\n\t\treturn (typeof value[iteratorSymbol] === 'function');\n\t};\n\n\n/***/ },\n/* 118 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tvar toString = Object.prototype.toString\n\n\t  , id = toString.call((function () { return arguments; }()));\n\n\tmodule.exports = function (x) { return (toString.call(x) === id); };\n\n\n/***/ },\n/* 119 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tvar toString = Object.prototype.toString\n\n\t  , id = toString.call('');\n\n\tmodule.exports = function (x) {\n\t\treturn (typeof x === 'string') || (x && (typeof x === 'object') &&\n\t\t\t((x instanceof String) || (toString.call(x) === id))) || false;\n\t};\n\n\n/***/ },\n/* 120 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar isArguments = __webpack_require__(118)\n\t  , callable    = __webpack_require__(97)\n\t  , isString    = __webpack_require__(119)\n\t  , get         = __webpack_require__(121)\n\n\t  , isArray = Array.isArray, call = Function.prototype.call\n\t  , some = Array.prototype.some;\n\n\tmodule.exports = function (iterable, cb/*, thisArg*/) {\n\t\tvar mode, thisArg = arguments[2], result, doBreak, broken, i, l, char, code;\n\t\tif (isArray(iterable) || isArguments(iterable)) mode = 'array';\n\t\telse if (isString(iterable)) mode = 'string';\n\t\telse iterable = get(iterable);\n\n\t\tcallable(cb);\n\t\tdoBreak = function () { broken = true; };\n\t\tif (mode === 'array') {\n\t\t\tsome.call(iterable, function (value) {\n\t\t\t\tcall.call(cb, thisArg, value, doBreak);\n\t\t\t\tif (broken) return true;\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (mode === 'string') {\n\t\t\tl = iterable.length;\n\t\t\tfor (i = 0; i < l; ++i) {\n\t\t\t\tchar = iterable[i];\n\t\t\t\tif ((i + 1) < l) {\n\t\t\t\t\tcode = char.charCodeAt(0);\n\t\t\t\t\tif ((code >= 0xD800) && (code <= 0xDBFF)) char += iterable[++i];\n\t\t\t\t}\n\t\t\t\tcall.call(cb, thisArg, char, doBreak);\n\t\t\t\tif (broken) break;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tresult = iterable.next();\n\n\t\twhile (!result.done) {\n\t\t\tcall.call(cb, thisArg, result.value, doBreak);\n\t\t\tif (broken) return;\n\t\t\tresult = iterable.next();\n\t\t}\n\t};\n\n\n/***/ },\n/* 121 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar isArguments    = __webpack_require__(118)\n\t  , isString       = __webpack_require__(119)\n\t  , ArrayIterator  = __webpack_require__(122)\n\t  , StringIterator = __webpack_require__(129)\n\t  , iterable       = __webpack_require__(116)\n\t  , iteratorSymbol = __webpack_require__(111).iterator;\n\n\tmodule.exports = function (obj) {\n\t\tif (typeof iterable(obj)[iteratorSymbol] === 'function') return obj[iteratorSymbol]();\n\t\tif (isArguments(obj)) return new ArrayIterator(obj);\n\t\tif (isString(obj)) return new StringIterator(obj);\n\t\treturn new ArrayIterator(obj);\n\t};\n\n\n/***/ },\n/* 122 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar setPrototypeOf = __webpack_require__(92)\n\t  , contains       = __webpack_require__(107)\n\t  , d              = __webpack_require__(98)\n\t  , Iterator       = __webpack_require__(123)\n\n\t  , defineProperty = Object.defineProperty\n\t  , ArrayIterator;\n\n\tArrayIterator = module.exports = function (arr, kind) {\n\t\tif (!(this instanceof ArrayIterator)) return new ArrayIterator(arr, kind);\n\t\tIterator.call(this, arr);\n\t\tif (!kind) kind = 'value';\n\t\telse if (contains.call(kind, 'key+value')) kind = 'key+value';\n\t\telse if (contains.call(kind, 'key')) kind = 'key';\n\t\telse kind = 'value';\n\t\tdefineProperty(this, '__kind__', d('', kind));\n\t};\n\tif (setPrototypeOf) setPrototypeOf(ArrayIterator, Iterator);\n\n\tArrayIterator.prototype = Object.create(Iterator.prototype, {\n\t\tconstructor: d(ArrayIterator),\n\t\t_resolve: d(function (i) {\n\t\t\tif (this.__kind__ === 'value') return this.__list__[i];\n\t\t\tif (this.__kind__ === 'key+value') return [i, this.__list__[i]];\n\t\t\treturn i;\n\t\t}),\n\t\ttoString: d(function () { return '[object Array Iterator]'; })\n\t});\n\n\n/***/ },\n/* 123 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar clear    = __webpack_require__(84)\n\t  , assign   = __webpack_require__(99)\n\t  , callable = __webpack_require__(97)\n\t  , value    = __webpack_require__(85)\n\t  , d        = __webpack_require__(98)\n\t  , autoBind = __webpack_require__(124)\n\t  , Symbol   = __webpack_require__(111)\n\n\t  , defineProperty = Object.defineProperty\n\t  , defineProperties = Object.defineProperties\n\t  , Iterator;\n\n\tmodule.exports = Iterator = function (list, context) {\n\t\tif (!(this instanceof Iterator)) return new Iterator(list, context);\n\t\tdefineProperties(this, {\n\t\t\t__list__: d('w', value(list)),\n\t\t\t__context__: d('w', context),\n\t\t\t__nextIndex__: d('w', 0)\n\t\t});\n\t\tif (!context) return;\n\t\tcallable(context.on);\n\t\tcontext.on('_add', this._onAdd);\n\t\tcontext.on('_delete', this._onDelete);\n\t\tcontext.on('_clear', this._onClear);\n\t};\n\n\tdefineProperties(Iterator.prototype, assign({\n\t\tconstructor: d(Iterator),\n\t\t_next: d(function () {\n\t\t\tvar i;\n\t\t\tif (!this.__list__) return;\n\t\t\tif (this.__redo__) {\n\t\t\t\ti = this.__redo__.shift();\n\t\t\t\tif (i !== undefined) return i;\n\t\t\t}\n\t\t\tif (this.__nextIndex__ < this.__list__.length) return this.__nextIndex__++;\n\t\t\tthis._unBind();\n\t\t}),\n\t\tnext: d(function () { return this._createResult(this._next()); }),\n\t\t_createResult: d(function (i) {\n\t\t\tif (i === undefined) return { done: true, value: undefined };\n\t\t\treturn { done: false, value: this._resolve(i) };\n\t\t}),\n\t\t_resolve: d(function (i) { return this.__list__[i]; }),\n\t\t_unBind: d(function () {\n\t\t\tthis.__list__ = null;\n\t\t\tdelete this.__redo__;\n\t\t\tif (!this.__context__) return;\n\t\t\tthis.__context__.off('_add', this._onAdd);\n\t\t\tthis.__context__.off('_delete', this._onDelete);\n\t\t\tthis.__context__.off('_clear', this._onClear);\n\t\t\tthis.__context__ = null;\n\t\t}),\n\t\ttoString: d(function () { return '[object Iterator]'; })\n\t}, autoBind({\n\t\t_onAdd: d(function (index) {\n\t\t\tif (index >= this.__nextIndex__) return;\n\t\t\t++this.__nextIndex__;\n\t\t\tif (!this.__redo__) {\n\t\t\t\tdefineProperty(this, '__redo__', d('c', [index]));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.__redo__.forEach(function (redo, i) {\n\t\t\t\tif (redo >= index) this.__redo__[i] = ++redo;\n\t\t\t}, this);\n\t\t\tthis.__redo__.push(index);\n\t\t}),\n\t\t_onDelete: d(function (index) {\n\t\t\tvar i;\n\t\t\tif (index >= this.__nextIndex__) return;\n\t\t\t--this.__nextIndex__;\n\t\t\tif (!this.__redo__) return;\n\t\t\ti = this.__redo__.indexOf(index);\n\t\t\tif (i !== -1) this.__redo__.splice(i, 1);\n\t\t\tthis.__redo__.forEach(function (redo, i) {\n\t\t\t\tif (redo > index) this.__redo__[i] = --redo;\n\t\t\t}, this);\n\t\t}),\n\t\t_onClear: d(function () {\n\t\t\tif (this.__redo__) clear.call(this.__redo__);\n\t\t\tthis.__nextIndex__ = 0;\n\t\t})\n\t})));\n\n\tdefineProperty(Iterator.prototype, Symbol.iterator, d(function () {\n\t\treturn this;\n\t}));\n\tdefineProperty(Iterator.prototype, Symbol.toStringTag, d('', 'Iterator'));\n\n\n/***/ },\n/* 124 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar copy       = __webpack_require__(125)\n\t  , map        = __webpack_require__(126)\n\t  , callable   = __webpack_require__(97)\n\t  , validValue = __webpack_require__(85)\n\n\t  , bind = Function.prototype.bind, defineProperty = Object.defineProperty\n\t  , hasOwnProperty = Object.prototype.hasOwnProperty\n\t  , define;\n\n\tdefine = function (name, desc, bindTo) {\n\t\tvar value = validValue(desc) && callable(desc.value), dgs;\n\t\tdgs = copy(desc);\n\t\tdelete dgs.writable;\n\t\tdelete dgs.value;\n\t\tdgs.get = function () {\n\t\t\tif (hasOwnProperty.call(this, name)) return value;\n\t\t\tdesc.value = bind.call(value, (bindTo == null) ? this : this[bindTo]);\n\t\t\tdefineProperty(this, name, desc);\n\t\t\treturn this[name];\n\t\t};\n\t\treturn dgs;\n\t};\n\n\tmodule.exports = function (props/*, bindTo*/) {\n\t\tvar bindTo = arguments[1];\n\t\treturn map(props, function (desc, name) {\n\t\t\treturn define(name, desc, bindTo);\n\t\t});\n\t};\n\n\n/***/ },\n/* 125 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar assign = __webpack_require__(99)\n\t  , value  = __webpack_require__(85);\n\n\tmodule.exports = function (obj) {\n\t\tvar copy = Object(value(obj));\n\t\tif (copy !== obj) return copy;\n\t\treturn assign({}, obj);\n\t};\n\n\n/***/ },\n/* 126 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar callable = __webpack_require__(97)\n\t  , forEach  = __webpack_require__(127)\n\n\t  , call = Function.prototype.call;\n\n\tmodule.exports = function (obj, cb/*, thisArg*/) {\n\t\tvar o = {}, thisArg = arguments[2];\n\t\tcallable(cb);\n\t\tforEach(obj, function (value, key, obj, index) {\n\t\t\to[key] = call.call(cb, thisArg, value, key, obj, index);\n\t\t});\n\t\treturn o;\n\t};\n\n\n/***/ },\n/* 127 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tmodule.exports = __webpack_require__(128)('forEach');\n\n\n/***/ },\n/* 128 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// Internal method, used by iteration functions.\n\t// Calls a function for each key-value pair found in object\n\t// Optionally takes compareFn to iterate object in specific order\n\n\t'use strict';\n\n\tvar callable = __webpack_require__(97)\n\t  , value    = __webpack_require__(85)\n\n\t  , bind = Function.prototype.bind, call = Function.prototype.call, keys = Object.keys\n\t  , propertyIsEnumerable = Object.prototype.propertyIsEnumerable;\n\n\tmodule.exports = function (method, defVal) {\n\t\treturn function (obj, cb/*, thisArg, compareFn*/) {\n\t\t\tvar list, thisArg = arguments[2], compareFn = arguments[3];\n\t\t\tobj = Object(value(obj));\n\t\t\tcallable(cb);\n\n\t\t\tlist = keys(obj);\n\t\t\tif (compareFn) {\n\t\t\t\tlist.sort((typeof compareFn === 'function') ? bind.call(compareFn, obj) : undefined);\n\t\t\t}\n\t\t\tif (typeof method !== 'function') method = list[method];\n\t\t\treturn call.call(method, list, function (key, index) {\n\t\t\t\tif (!propertyIsEnumerable.call(obj, key)) return defVal;\n\t\t\t\treturn call.call(cb, thisArg, obj[key], key, obj, index);\n\t\t\t});\n\t\t};\n\t};\n\n\n/***/ },\n/* 129 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t// Thanks @mathiasbynens\n\t// http://mathiasbynens.be/notes/javascript-unicode#iterating-over-symbols\n\n\t'use strict';\n\n\tvar setPrototypeOf = __webpack_require__(92)\n\t  , d              = __webpack_require__(98)\n\t  , Iterator       = __webpack_require__(123)\n\n\t  , defineProperty = Object.defineProperty\n\t  , StringIterator;\n\n\tStringIterator = module.exports = function (str) {\n\t\tif (!(this instanceof StringIterator)) return new StringIterator(str);\n\t\tstr = String(str);\n\t\tIterator.call(this, str);\n\t\tdefineProperty(this, '__length__', d('', str.length));\n\n\t};\n\tif (setPrototypeOf) setPrototypeOf(StringIterator, Iterator);\n\n\tStringIterator.prototype = Object.create(Iterator.prototype, {\n\t\tconstructor: d(StringIterator),\n\t\t_next: d(function () {\n\t\t\tif (!this.__list__) return;\n\t\t\tif (this.__nextIndex__ < this.__length__) return this.__nextIndex__++;\n\t\t\tthis._unBind();\n\t\t}),\n\t\t_resolve: d(function (i) {\n\t\t\tvar char = this.__list__[i], code;\n\t\t\tif (this.__nextIndex__ === this.__length__) return char;\n\t\t\tcode = char.charCodeAt(0);\n\t\t\tif ((code >= 0xD800) && (code <= 0xDBFF)) return char + this.__list__[this.__nextIndex__++];\n\t\t\treturn char;\n\t\t}),\n\t\ttoString: d(function () { return '[object String Iterator]'; })\n\t});\n\n\n/***/ },\n/* 130 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar setPrototypeOf    = __webpack_require__(92)\n\t  , d                 = __webpack_require__(98)\n\t  , Iterator          = __webpack_require__(123)\n\t  , toStringTagSymbol = __webpack_require__(111).toStringTag\n\t  , kinds             = __webpack_require__(131)\n\n\t  , defineProperties = Object.defineProperties\n\t  , unBind = Iterator.prototype._unBind\n\t  , MapIterator;\n\n\tMapIterator = module.exports = function (map, kind) {\n\t\tif (!(this instanceof MapIterator)) return new MapIterator(map, kind);\n\t\tIterator.call(this, map.__mapKeysData__, map);\n\t\tif (!kind || !kinds[kind]) kind = 'key+value';\n\t\tdefineProperties(this, {\n\t\t\t__kind__: d('', kind),\n\t\t\t__values__: d('w', map.__mapValuesData__)\n\t\t});\n\t};\n\tif (setPrototypeOf) setPrototypeOf(MapIterator, Iterator);\n\n\tMapIterator.prototype = Object.create(Iterator.prototype, {\n\t\tconstructor: d(MapIterator),\n\t\t_resolve: d(function (i) {\n\t\t\tif (this.__kind__ === 'value') return this.__values__[i];\n\t\t\tif (this.__kind__ === 'key') return this.__list__[i];\n\t\t\treturn [this.__list__[i], this.__values__[i]];\n\t\t}),\n\t\t_unBind: d(function () {\n\t\t\tthis.__values__ = null;\n\t\t\tunBind.call(this);\n\t\t}),\n\t\ttoString: d(function () { return '[object Map Iterator]'; })\n\t});\n\tObject.defineProperty(MapIterator.prototype, toStringTagSymbol,\n\t\td('c', 'Map Iterator'));\n\n\n/***/ },\n/* 131 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tmodule.exports = __webpack_require__(132)('key',\n\t\t'value', 'key+value');\n\n\n/***/ },\n/* 132 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tvar forEach = Array.prototype.forEach, create = Object.create;\n\n\tmodule.exports = function (arg/*, …args*/) {\n\t\tvar set = create(null);\n\t\tforEach.call(arguments, function (name) { set[name] = true; });\n\t\treturn set;\n\t};\n\n\n/***/ },\n/* 133 */\n/***/ function(module, exports) {\n\n\t// Exports true if environment provides native `Map` implementation,\n\t// whatever that is.\n\n\t'use strict';\n\n\tmodule.exports = (function () {\n\t\tif (typeof Map === 'undefined') return false;\n\t\treturn (Object.prototype.toString.call(new Map()) === '[object Map]');\n\t}());\n\n\n/***/ },\n/* 134 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar throwError = __webpack_require__(40);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar Disposable = __webpack_require__(13);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction UsingObservable(resFn, obsFn) {\n\t  this._resFn = resFn;\n\t  this._obsFn = obsFn;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(UsingObservable, ObservableBase);\n\n\tUsingObservable.prototype.subscribeCore = function (o) {\n\t  var disposable = Disposable.empty;\n\t  var resource = tryCatch(this._resFn)();\n\t  if (resource === errorObj) {\n\t    return new BinaryDisposable(throwError(resource.e).subscribe(o), disposable);\n\t  }\n\t  resource && (disposable = resource);\n\t  var source = tryCatch(this._obsFn)(resource);\n\t  if (source === errorObj) {\n\t    return new BinaryDisposable(throwError(source.e).subscribe(o), disposable);\n\t  }\n\t  return new BinaryDisposable(source.subscribe(o), disposable);\n\t};\n\n\t/**\n\t * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n\t * @param {Function} resourceFactory Factory function to obtain a resource object.\n\t * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n\t * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n\t */\n\tmodule.exports = function using(resourceFactory, observableFactory) {\n\t  return new UsingObservable(resourceFactory, observableFactory);\n\t};\n\n/***/ },\n/* 135 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar NAryDisposable = __webpack_require__(43);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar identity = __webpack_require__(46);\n\tvar isFunction = __webpack_require__(9);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction falseFactory() {\n\t  return false;\n\t}\n\tfunction emptyArrayFactory() {\n\t  return [];\n\t}\n\tfunction initializeArray(n, fn) {\n\t  var results = new Array(n);\n\t  for (var i = 0; i < n; i++) {\n\t    results[i] = fn(i);\n\t  }\n\t  return results;\n\t}\n\tfunction argumentsToArray() {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  return args;\n\t}\n\n\tfunction ZipObserver(o, i, p, q, d) {\n\t  this._o = o;\n\t  this._i = i;\n\t  this._p = p;\n\t  this._q = q;\n\t  this._d = d;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(ZipObserver, AbstractObserver);\n\n\tfunction notEmpty(x) {\n\t  return x.length > 0;\n\t}\n\tfunction shiftEach(x) {\n\t  return x.shift();\n\t}\n\tfunction notTheSame(i) {\n\t  return function (x, j) {\n\t    return j !== i;\n\t  };\n\t}\n\n\tZipObserver.prototype.next = function (x) {\n\t  this._q[this._i].push(x);\n\t  if (this._q.every(notEmpty)) {\n\t    var queuedValues = this._q.map(shiftEach);\n\t    var res = tryCatch(this._p._cb).apply(null, queuedValues);\n\t    if (res === errorObj) {\n\t      return this._o.onError(res.e);\n\t    }\n\t    this._o.onNext(res);\n\t  } else if (this._d.filter(notTheSame(this._i)).every(identity)) {\n\t    this._o.onCompleted();\n\t  }\n\t};\n\n\tZipObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tZipObserver.prototype.completed = function () {\n\t  this._d[this._i] = true;\n\t  this._d.every(identity) && this._o.onCompleted();\n\t};\n\n\tfunction ZipObservable(s, cb) {\n\t  this._s = s;\n\t  this._cb = cb;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(ZipObservable, ObservableBase);\n\n\tZipObservable.prototype.subscribeCore = function (observer) {\n\t  var n = this._s.length,\n\t      subscriptions = new Array(n),\n\t      done = initializeArray(n, falseFactory),\n\t      q = initializeArray(n, emptyArrayFactory);\n\n\t  for (var i = 0; i < n; i++) {\n\t    var source = this._s[i],\n\t        sad = new SingleAssignmentDisposable();\n\t    subscriptions[i] = sad;\n\t    isPromise(source) && (source = fromPromise(source));\n\t    sad.setDisposable(source.subscribe(new ZipObserver(observer, i, this, q, done)));\n\t  }\n\n\t  return new NAryDisposable(subscriptions);\n\t};\n\n\t/**\n\t* Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n\t* The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n\t* @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n\t*/\n\tmodule.exports = function zip() {\n\t  if (arguments.length === 0) {\n\t    throw new Error('invalid arguments');\n\t  }\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n\t  return new ZipObservable(args, resultSelector);\n\t};\n\n/***/ },\n/* 136 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Pattern = __webpack_require__(137);\n\n\tmodule.exports = function and(left, right) {\n\t  return new Pattern([left, right]);\n\t};\n\n/***/ },\n/* 137 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Plan = __webpack_require__(138);\n\n\t/**\n\t * @constructor\n\t * Represents a join pattern over observable sequences.\n\t */\n\tfunction Pattern(patterns) {\n\t  this._patterns = patterns;\n\t}\n\n\t/**\n\t *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n\t *  @param other Observable sequence to match in addition to the current pattern.\n\t *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n\t */\n\tPattern.prototype.and = function (other) {\n\t  return new Pattern(this._patterns.concat(other));\n\t};\n\n\t/**\n\t *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n\t *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n\t *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n\t */\n\tPattern.prototype.thenDo = function (selector) {\n\t  return new Plan(this, selector);\n\t};\n\n\tmodule.exports = Pattern;\n\n/***/ },\n/* 138 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ActivePlan = __webpack_require__(139);\n\tvar JoinObserver = __webpack_require__(140);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction planCreateObserver(externalSubscriptions, observable, onError) {\n\t  var entry = externalSubscriptions.get(observable);\n\t  if (!entry) {\n\t    var observer = new JoinObserver(observable, onError);\n\t    externalSubscriptions.set(observable, observer);\n\t    return observer;\n\t  }\n\t  return entry;\n\t}\n\n\tfunction Plan(expression, selector) {\n\t  this._expression = expression;\n\t  this._selector = selector;\n\t}\n\n\tfunction handleOnError(o) {\n\t  return function (e) {\n\t    o.onError(e);\n\t  };\n\t}\n\tfunction handleOnNext(self, observer) {\n\t  return function onNext() {\n\t    var result = tryCatch(self._selector).apply(self, arguments);\n\t    if (result === errorObj) {\n\t      return observer.onError(result.e);\n\t    }\n\t    observer.onNext(result);\n\t  };\n\t}\n\n\tPlan.prototype.activate = function (externalSubscriptions, observer, deactivate) {\n\t  var joinObservers = [],\n\t      errHandler = handleOnError(observer);\n\t  for (var i = 0, len = this._expression._patterns.length; i < len; i++) {\n\t    joinObservers.push(planCreateObserver(externalSubscriptions, this._expression._patterns[i], errHandler));\n\t  }\n\t  var activePlan = new ActivePlan(joinObservers, handleOnNext(this, observer), function () {\n\t    for (var j = 0, jlen = joinObservers.length; j < jlen; j++) {\n\t      joinObservers[j].removeActivePlan(activePlan);\n\t    }\n\t    deactivate(activePlan);\n\t  });\n\t  for (i = 0, len = joinObservers.length; i < len; i++) {\n\t    joinObservers[i].addActivePlan(activePlan);\n\t  }\n\t  return activePlan;\n\t};\n\n\tmodule.exports = Plan;\n\n/***/ },\n/* 139 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n\t__webpack_require__(80);\n\n\tfunction ActivePlan(joinObserverArray, onNext, onCompleted) {\n\t  this._joinObserverArray = joinObserverArray;\n\t  this._onNext = onNext;\n\t  this._onCompleted = onCompleted;\n\t  this._joinObservers = new global.Map();\n\t  for (var i = 0, len = this._joinObserverArray.length; i < len; i++) {\n\t    var joinObserver = this._joinObserverArray[i];\n\t    this._joinObservers.set(joinObserver, joinObserver);\n\t  }\n\t}\n\n\tActivePlan.prototype.dequeue = function () {\n\t  this._joinObservers.forEach(function (v) {\n\t    v._queue.shift();\n\t  });\n\t};\n\n\tActivePlan.prototype.match = function () {\n\t  var i,\n\t      len,\n\t      hasValues = true;\n\t  for (i = 0, len = this._joinObserverArray.length; i < len; i++) {\n\t    if (this._joinObserverArray[i]._queue.length === 0) {\n\t      hasValues = false;\n\t      break;\n\t    }\n\t  }\n\t  if (hasValues) {\n\t    var firstValues = [],\n\t        isCompleted = false;\n\t    for (i = 0, len = this._joinObserverArray.length; i < len; i++) {\n\t      firstValues.push(this._joinObserverArray[i]._queue[0]);\n\t      this._joinObserverArray[i]._queue[0].kind === 'C' && (isCompleted = true);\n\t    }\n\t    if (isCompleted) {\n\t      this._onCompleted();\n\t    } else {\n\t      this.dequeue();\n\t      var values = [];\n\t      for (i = 0, len = firstValues.length; i < firstValues.length; i++) {\n\t        values.push(firstValues[i].value);\n\t      }\n\t      this._onNext.apply(this, values);\n\t    }\n\t  }\n\t};\n\n\tmodule.exports = ActivePlan;\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 140 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar materialize = __webpack_require__(141);\n\tvar noop = __webpack_require__(3);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction JoinObserver(source, onError) {\n\t  AbstractObserver.call(this);\n\t  this._source = source;\n\t  this._onError = onError;\n\t  this._queue = [];\n\t  this._activePlans = [];\n\t  this._subscription = new SingleAssignmentDisposable();\n\t  this.isDisposed = false;\n\t}\n\n\tinherits(JoinObserver, AbstractObserver);\n\n\tJoinObserver.prototype.next = function (notification) {\n\t  if (!this.isDisposed) {\n\t    if (notification.kind === 'E') {\n\t      return this._onError(notification.error);\n\t    }\n\t    this._queue.push(notification);\n\t    var activePlans = this._activePlans.slice(0);\n\t    for (var i = 0, len = activePlans.length; i < len; i++) {\n\t      activePlans[i].match();\n\t    }\n\t  }\n\t};\n\n\tJoinObserver.prototype.error = noop;\n\tJoinObserver.prototype.completed = noop;\n\n\tJoinObserver.prototype.addActivePlan = function (activePlan) {\n\t  this._activePlans.push(activePlan);\n\t};\n\n\tJoinObserver.prototype.subscribe = function () {\n\t  this._subscription.setDisposable(materialize(this._source).subscribe(this));\n\t};\n\n\tJoinObserver.prototype.removeActivePlan = function (activePlan) {\n\t  this._activePlans.splice(this._activePlans.indexOf(activePlan), 1);\n\t  this._activePlans.length === 0 && this.dispose();\n\t};\n\n\tJoinObserver.prototype.dispose = function () {\n\t  AbstractObserver.prototype.dispose.call(this);\n\t  if (!this.isDisposed) {\n\t    this.isDisposed = true;\n\t    this._subscription.dispose();\n\t  }\n\t};\n\n\tmodule.exports = JoinObserver;\n\n/***/ },\n/* 141 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Notification = __webpack_require__(142);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction MaterializeObserver(o) {\n\t  this._o = o;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(MaterializeObserver, AbstractObserver);\n\n\tMaterializeObserver.prototype.next = function (x) {\n\t  this._o.onNext(Notification.createOnNext(x));\n\t};\n\tMaterializeObserver.prototype.error = function (e) {\n\t  this._o.onNext(Notification.createOnError(e));this._o.onCompleted();\n\t};\n\tMaterializeObserver.prototype.completed = function () {\n\t  this._o.onNext(Notification.createOnCompleted());this._o.onCompleted();\n\t};\n\n\tfunction MaterializeObservable(source) {\n\t  this.source = source;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(MaterializeObservable, ObservableBase);\n\n\tMaterializeObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new MaterializeObserver(o));\n\t};\n\n\t/**\n\t *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n\t * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n\t */\n\tmodule.exports = function materialize(source) {\n\t  return new MaterializeObservable(source);\n\t};\n\n/***/ },\n/* 142 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AnonymousObservable = __webpack_require__(36);\n\tvar Scheduler = __webpack_require__(12);\n\tvar errors = __webpack_require__(7);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction Notification() {}\n\n\tNotification.prototype._accept = function (onNext, onError, onCompleted) {\n\t  throw new errors.NotImplementedError();\n\t};\n\n\tNotification.prototype._acceptObserver = function (onNext, onError, onCompleted) {\n\t  throw new errors.NotImplementedError();\n\t};\n\n\t/**\n\t * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n\t * @param {Function | Observer} observerOrOnNext Function to invoke for an OnNext notification or Observer to invoke the notification on..\n\t * @param {Function} onError Function to invoke for an OnError notification.\n\t * @param {Function} onCompleted Function to invoke for an OnCompleted notification.\n\t * @returns {Any} Result produced by the observation.\n\t */\n\tNotification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n\t  return observerOrOnNext && typeof observerOrOnNext === 'object' ? this._acceptObserver(observerOrOnNext) : this._accept(observerOrOnNext, onError, onCompleted);\n\t};\n\n\t/**\n\t * Returns an observable sequence with a single notification.\n\t *\n\t * @memberOf Notifications\n\t * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n\t * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n\t */\n\tNotification.prototype.toObservable = function (scheduler) {\n\t  var self = this;\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.immediate);\n\t  return new AnonymousObservable(function (o) {\n\t    return scheduler.schedule(self, function (_, notification) {\n\t      notification._acceptObserver(o);\n\t      notification.kind === 'N' && o.onCompleted();\n\t    });\n\t  });\n\t};\n\n\tfunction OnNextNotification(value) {\n\t  this.value = value;\n\t  this.kind = 'N';\n\t}\n\n\tinherits(OnNextNotification, Notification);\n\n\tOnNextNotification.prototype._accept = function (onNext) {\n\t  return onNext(this.value);\n\t};\n\n\tOnNextNotification.prototype._acceptObserver = function (o) {\n\t  return o.onNext(this.value);\n\t};\n\n\tOnNextNotification.prototype.toString = function () {\n\t  return 'OnNext(' + this.value + ')';\n\t};\n\n\tfunction OnErrorNotification(error) {\n\t  this.error = error;\n\t  this.kind = 'E';\n\t}\n\n\tinherits(OnErrorNotification, Notification);\n\n\tOnErrorNotification.prototype._accept = function (onNext, onError) {\n\t  return onError(this.error);\n\t};\n\n\tOnErrorNotification.prototype._acceptObserver = function (o) {\n\t  return o.onError(this.error);\n\t};\n\n\tOnErrorNotification.prototype.toString = function () {\n\t  return 'OnError(' + this.error + ')';\n\t};\n\n\tfunction OnCompletedNotification() {\n\t  this.kind = 'C';\n\t}\n\n\tinherits(OnCompletedNotification, Notification);\n\n\tOnCompletedNotification.prototype._accept = function (onNext, onError, onCompleted) {\n\t  return onCompleted();\n\t};\n\n\tOnCompletedNotification.prototype._acceptObserver = function (o) {\n\t  return o.onCompleted();\n\t};\n\n\tOnCompletedNotification.prototype.toString = function () {\n\t  return 'OnCompleted()';\n\t};\n\n\t/**\n\t* Creates an object that represents an OnNext notification to an observer.\n\t* @param {Any} value The value contained in the notification.\n\t* @returns {Notification} The OnNext notification containing the value.\n\t*/\n\tNotification.createOnNext = function (value) {\n\t  return new OnNextNotification(value);\n\t};\n\n\t/**\n\t* Creates an object that represents an OnError notification to an observer.\n\t* @param {Any} error The exception contained in the notification.\n\t* @returns {Notification} The OnError notification containing the exception.\n\t*/\n\tNotification.createOnError = function (error) {\n\t  return new OnErrorNotification(error);\n\t};\n\n\t/**\n\t* Creates an object that represents an OnCompleted notification to an observer.\n\t* @returns {Notification} The OnCompleted notification.\n\t*/\n\tNotification.createOnCompleted = function () {\n\t  return new OnCompletedNotification();\n\t};\n\n\tmodule.exports = Notification;\n\n/***/ },\n/* 143 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar EmptyError = __webpack_require__(7).EmptyError;\n\tvar isFunction = __webpack_require__(9);\n\tvar bindCallback = __webpack_require__(52);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction AverageObserver(o, fn, s) {\n\t  this._o = o;\n\t  this._fn = fn;\n\t  this._s = s;\n\t  this._c = 0;\n\t  this._t = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(AverageObserver, AbstractObserver);\n\n\tAverageObserver.prototype.next = function (x) {\n\t  if (this._fn) {\n\t    var r = tryCatch(this._fn)(x, this._c++, this._s);\n\t    if (r === errorObj) {\n\t      return this._o.onError(r.e);\n\t    }\n\t    this._t += r;\n\t  } else {\n\t    this._c++;\n\t    this._t += x;\n\t  }\n\t};\n\tAverageObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tAverageObserver.prototype.completed = function () {\n\t  if (this._c === 0) {\n\t    return this._o.onError(new EmptyError());\n\t  }\n\t  this._o.onNext(this._t / this._c);\n\t  this._o.onCompleted();\n\t};\n\n\tfunction AverageObservable(source, fn) {\n\t  this.source = source;\n\t  this._fn = fn;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(AverageObservable, ObservableBase);\n\n\tAverageObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new AverageObserver(o, this._fn, this.source));\n\t};\n\n\t/**\n\t * Computes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present.\n\t * @param {Function} [selector] A transform function to apply to each element.\n\t * @param {Any} [thisArg] Object to use as this when executing callback.\n\t * @returns {Observable} An observable sequence containing a single element with the average of the sequence of values.\n\t */\n\tmodule.exports = function average(source, keySelector, thisArg) {\n\t  var fn;\n\t  isFunction(keySelector) && (fn = bindCallback(keySelector, thisArg, 3));\n\t  return new AverageObservable(source, fn);\n\t};\n\n/***/ },\n/* 144 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar flatMap = __webpack_require__(145);\n\tvar window = __webpack_require__(149);\n\n\tfunction toArray(x) {\n\t  return x.toArray();\n\t}\n\n\tmodule.exports = function buffer(source, windowOpeningsOrClosingSelector, windowClosingSelector) {\n\t  return flatMap(window(source, windowOpeningsOrClosingSelector, windowClosingSelector), toArray);\n\t};\n\n/***/ },\n/* 145 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar FlatMapObservable = __webpack_require__(146);\n\tvar mergeAll = __webpack_require__(66);\n\n\tmodule.exports = function flatMap(source, selector, resultSelector, thisArg) {\n\t  var obs = new FlatMapObservable(source, selector, resultSelector, thisArg);\n\t  return mergeAll(obs);\n\t};\n\n/***/ },\n/* 146 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar ObservableBase = __webpack_require__(11);\n\tvar observableFrom = __webpack_require__(50);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar isArrayLike = __webpack_require__(147);\n\tvar isIterable = __webpack_require__(148);\n\tvar bindCallback = __webpack_require__(52);\n\tvar isFunction = __webpack_require__(9);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction FlatMapObserver(o, selector, resultSelector, source) {\n\t  this.i = 0;\n\t  this._fn = selector;\n\t  this._resFn = resultSelector;\n\t  this.source = source;\n\t  this._o = o;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(FlatMapObserver, AbstractObserver);\n\n\tFlatMapObserver.prototype._wrapResult = function (result, x, i) {\n\t  return isFunction(this._resFn) ? result.map(function (y, i2) {\n\t    return this._resFn(x, y, i, i2);\n\t  }, this) : result;\n\t};\n\n\tFlatMapObserver.prototype.next = function (x) {\n\t  var i = this.i++;\n\t  var result = tryCatch(this._fn)(x, i, this.source);\n\t  if (result === errorObj) {\n\t    return this._o.onError(result.e);\n\t  }\n\n\t  isPromise(result) && (result = fromPromise(result));\n\t  (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));\n\t  this._o.onNext(this._wrapResult(result, x, i));\n\t};\n\tFlatMapObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tFlatMapObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction FlatMapObservable(source, fn, resultFn, thisArg) {\n\t  this._resFn = isFunction(resultFn) ? resultFn : null;\n\t  this._fn = bindCallback(isFunction(fn) ? fn : function () {\n\t    return fn;\n\t  }, thisArg, 3);\n\t  this.source = source;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(FlatMapObservable, ObservableBase);\n\n\tFlatMapObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new FlatMapObserver(o, this._fn, this._resFn, this));\n\t};\n\n\tmodule.exports = FlatMapObservable;\n\n/***/ },\n/* 147 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function isArrayLike(o) {\n\t  return o && o.length !== undefined;\n\t};\n\n/***/ },\n/* 148 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar $iterator$ = __webpack_require__(51);\n\n\tmodule.exports = function isIterable(o) {\n\t  return o && o[$iterator$] !== undefined;\n\t};\n\n/***/ },\n/* 149 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar CompositeDisposable = __webpack_require__(14);\n\tvar RefCountDisposable = __webpack_require__(150);\n\tvar SerialDisposable = __webpack_require__(44);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar AnonymousObservable = __webpack_require__(36);\n\tvar Subject = __webpack_require__(57);\n\tvar empty = __webpack_require__(41);\n\tvar fromPromise = __webpack_require__(27);\n\tvar groupJoin = __webpack_require__(151);\n\tvar take = __webpack_require__(153);\n\tvar addRef = __webpack_require__(152);\n\tvar isPromise = __webpack_require__(28);\n\tvar isFunction = __webpack_require__(9);\n\tvar noop = __webpack_require__(3);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction returnWindow(x, win) {\n\t  return win;\n\t}\n\n\tfunction observableWindowWithOpenings(source, windowOpenings, windowClosingSelector) {\n\t  return groupJoin(windowOpenings, source, windowClosingSelector, empty, returnWindow);\n\t}\n\n\tfunction observableWindowWithBoundaries(source, windowBoundaries) {\n\t  return new AnonymousObservable(function (o) {\n\t    var win = new Subject(),\n\t        d = new CompositeDisposable(),\n\t        r = new RefCountDisposable(d);\n\n\t    o.onNext(addRef(win, r));\n\n\t    d.add(source.subscribe(function (x) {\n\t      win.onNext(x);\n\t    }, function (err) {\n\t      win.onError(err);\n\t      o.onError(err);\n\t    }, function () {\n\t      win.onCompleted();\n\t      o.onCompleted();\n\t    }));\n\n\t    isPromise(windowBoundaries) && (windowBoundaries = fromPromise(windowBoundaries));\n\n\t    d.add(windowBoundaries.subscribe(function () {\n\t      win.onCompleted();\n\t      win = new Subject();\n\t      o.onNext(addRef(win, r));\n\t    }, function (err) {\n\t      win.onError(err);\n\t      o.onError(err);\n\t    }, function () {\n\t      win.onCompleted();\n\t      o.onCompleted();\n\t    }));\n\n\t    return r;\n\t  }, source);\n\t}\n\n\tfunction observableWindowWithClosingSelector(source, windowClosingSelector) {\n\t  return new AnonymousObservable(function (o) {\n\t    var m = new SerialDisposable(),\n\t        d = new CompositeDisposable(m),\n\t        r = new RefCountDisposable(d),\n\t        win = new Subject();\n\t    o.onNext(addRef(win, r));\n\t    d.add(source.subscribe(function (x) {\n\t      win.onNext(x);\n\t    }, function (err) {\n\t      win.onError(err);\n\t      o.onError(err);\n\t    }, function () {\n\t      win.onCompleted();\n\t      o.onCompleted();\n\t    }));\n\n\t    function createWindowClose() {\n\t      var windowClose = tryCatch(windowClosingSelector)();\n\t      if (windowClose === errorObj) {\n\t        return o.onError(windowClose.e);\n\t      }\n\t      isPromise(windowClose) && (windowClose = fromPromise(windowClose));\n\n\t      var m1 = new SingleAssignmentDisposable();\n\t      m.setDisposable(m1);\n\t      m1.setDisposable(take(windowClose, 1).subscribe(noop, function (err) {\n\t        win.onError(err);\n\t        o.onError(err);\n\t      }, function () {\n\t        win.onCompleted();\n\t        win = new Subject();\n\t        o.onNext(addRef(win, r));\n\t        createWindowClose();\n\t      }));\n\t    }\n\n\t    createWindowClose();\n\t    return r;\n\t  }, source);\n\t}\n\n\t/**\n\t *  Projects each element of an observable sequence into zero or more windows.\n\t *\n\t *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n\t *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n\t *  @returns {Observable} An observable sequence of windows.\n\t */\n\tmodule.exports = function window(source, windowOpeningsOrClosingSelector, windowClosingSelector) {\n\t  if (!windowClosingSelector && !isFunction(windowOpeningsOrClosingSelector)) {\n\t    return observableWindowWithBoundaries(source, windowOpeningsOrClosingSelector);\n\t  }\n\t  return isFunction(windowOpeningsOrClosingSelector) ? observableWindowWithClosingSelector(source, windowOpeningsOrClosingSelector) : observableWindowWithOpenings(source, windowOpeningsOrClosingSelector, windowClosingSelector);\n\t};\n\n/***/ },\n/* 150 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Disposable = __webpack_require__(13);\n\n\tfunction InnerDisposable(disposable) {\n\t  this.disposable = disposable;\n\t  this.disposable.count++;\n\t  this.isInnerDisposed = false;\n\t}\n\n\tInnerDisposable.prototype.dispose = function () {\n\t  if (!this.disposable.isDisposed && !this.isInnerDisposed) {\n\t    this.isInnerDisposed = true;\n\t    this.disposable.count--;\n\t    if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {\n\t      this.disposable.isDisposed = true;\n\t      this.disposable.underlyingDisposable.dispose();\n\t    }\n\t  }\n\t};\n\n\t/**\n\t * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n\t */\n\tfunction RefCountDisposable(disposable) {\n\t  this.underlyingDisposable = disposable;\n\t  this.isDisposed = false;\n\t  this.isPrimaryDisposed = false;\n\t  this.count = 0;\n\t}\n\n\t/**\n\t * Disposes the underlying disposable only when all dependent disposables have been disposed\n\t */\n\tRefCountDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed && !this.isPrimaryDisposed) {\n\t    this.isPrimaryDisposed = true;\n\t    if (this.count === 0) {\n\t      this.isDisposed = true;\n\t      this.underlyingDisposable.dispose();\n\t    }\n\t  }\n\t};\n\n\t/**\n\t * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n\t * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n\t */\n\tRefCountDisposable.prototype.getDisposable = function () {\n\t  return this.isDisposed ? Disposable.empty : new InnerDisposable(this);\n\t};\n\n\tmodule.exports = RefCountDisposable;\n\n/***/ },\n/* 151 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n\tvar AnonymousObservable = __webpack_require__(36); // TODO: Get rid of\n\tvar CompositeDisposable = __webpack_require__(14);\n\tvar RefCountDisposable = __webpack_require__(150);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar Subject = __webpack_require__(57);\n\tvar addRef = __webpack_require__(152);\n\tvar noop = __webpack_require__(3);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\t__webpack_require__(80);\n\n\tmodule.exports = function groupJoin(left, right, leftDurationSelector, rightDurationSelector, resultSelector) {\n\t  return new AnonymousObservable(function (o) {\n\t    var group = new CompositeDisposable();\n\t    var r = new RefCountDisposable(group);\n\t    var leftMap = new global.Map(),\n\t        rightMap = new global.Map();\n\t    var leftId = 0,\n\t        rightId = 0;\n\t    var handleError = function (e) {\n\t      return function (v) {\n\t        v.onError(e);\n\t      };\n\t    };\n\n\t    group.add(left.subscribe(function (value) {\n\t      var s = new Subject();\n\t      var id = leftId++;\n\t      leftMap.set(id, s);\n\n\t      var result = tryCatch(resultSelector)(value, addRef(s, r));\n\t      if (result === errorObj) {\n\t        leftMap.forEach(handleError(result.e));\n\t        return o.onError(result.e);\n\t      }\n\t      o.onNext(result);\n\n\t      rightMap.forEach(function (v) {\n\t        s.onNext(v);\n\t      });\n\n\t      var md = new SingleAssignmentDisposable();\n\t      group.add(md);\n\n\t      var duration = tryCatch(leftDurationSelector)(value);\n\t      if (duration === errorObj) {\n\t        leftMap.forEach(handleError(duration.e));\n\t        return o.onError(duration.e);\n\t      }\n\n\t      md.setDisposable(duration.take(1).subscribe(noop, function (e) {\n\t        leftMap.forEach(handleError(e));\n\t        o.onError(e);\n\t      }, function () {\n\t        leftMap['delete'](id) && s.onCompleted();\n\t        group.remove(md);\n\t      }));\n\t    }, function (e) {\n\t      leftMap.forEach(handleError(e));\n\t      o.onError(e);\n\t    }, function () {\n\t      o.onCompleted();\n\t    }));\n\n\t    group.add(right.subscribe(function (value) {\n\t      var id = rightId++;\n\t      rightMap.set(id, value);\n\n\t      var md = new SingleAssignmentDisposable();\n\t      group.add(md);\n\n\t      var duration = tryCatch(rightDurationSelector)(value);\n\t      if (duration === errorObj) {\n\t        leftMap.forEach(handleError(duration.e));\n\t        return o.onError(duration.e);\n\t      }\n\n\t      md.setDisposable(duration.take(1).subscribe(noop, function (e) {\n\t        leftMap.forEach(handleError(e));\n\t        o.onError(e);\n\t      }, function () {\n\t        rightMap['delete'](id);\n\t        group.remove(md);\n\t      }));\n\n\t      leftMap.forEach(function (v) {\n\t        v.onNext(value);\n\t      });\n\t    }, function (e) {\n\t      leftMap.forEach(handleError(e));\n\t      o.onError(e);\n\t    }));\n\n\t    return r;\n\t  }, left);\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 152 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction AddRefObservable(xs, r) {\n\t  this._xs = xs;\n\t  this._r = r;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(AddRefObservable, ObservableBase);\n\n\tAddRefObservable.prototype.subscribeCore = function (o) {\n\t  return new BinaryDisposable(this._r.getDisposable(), this._xs.subscribe(o));\n\t};\n\n\tmodule.exports = function addRef(xs, r) {\n\t  return new AddRefObservable(xs, r);\n\t};\n\n/***/ },\n/* 153 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar ObservableBase = __webpack_require__(11);\n\tvar empty = __webpack_require__(41);\n\tvar errors = __webpack_require__(7);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction TakeObserver(o, c) {\n\t  this._o = o;\n\t  this._c = c;\n\t  this._r = c;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(TakeObserver, AbstractObserver);\n\n\tTakeObserver.prototype.next = function (x) {\n\t  if (this._r-- > 0) {\n\t    this._o.onNext(x);\n\t    this._r <= 0 && this._o.onCompleted();\n\t  }\n\t};\n\n\tTakeObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tTakeObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction TakeObservable(source, count) {\n\t  this.source = source;\n\t  this._count = count;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(TakeObservable, ObservableBase);\n\n\tTakeObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new TakeObserver(o, this._count));\n\t};\n\n\t/**\n\t *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n\t * @param {Number} count The number of elements to return.\n\t * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n\t * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n\t */\n\tmodule.exports = function (source, count, scheduler) {\n\t  if (count < 0) {\n\t    throw new errors.ArgumentOutOfRangeError();\n\t  }\n\t  if (count === 0) {\n\t    return empty(scheduler);\n\t  }\n\t  return new TakeObservable(source, count);\n\t};\n\n/***/ },\n/* 154 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar filter = __webpack_require__(155);\n\tvar flatMap = __webpack_require__(145);\n\tvar windowCount = __webpack_require__(156);\n\n\tfunction toArray(x) {\n\t  return x.toArray();\n\t}\n\tfunction notEmpty(x) {\n\t  return x.length > 0;\n\t}\n\n\tmodule.exports = function bufferCount(source, count, skip) {\n\t  typeof skip !== 'number' && (skip = count);\n\t  return filter(flatMap(windowCount(source, count, skip), toArray), notEmpty);\n\t};\n\n/***/ },\n/* 155 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar bindCallback = __webpack_require__(52);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction FilterObserver(o, predicate, source) {\n\t  this._o = o;\n\t  this._fn = predicate;\n\t  this.source = source;\n\t  this._i = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(FilterObserver, AbstractObserver);\n\n\tFilterObserver.prototype.next = function (x) {\n\t  var shouldYield = tryCatch(this._fn)(x, this._i++, this.source);\n\t  if (shouldYield === errorObj) {\n\t    return this._o.onError(shouldYield.e);\n\t  }\n\t  shouldYield && this._o.onNext(x);\n\t};\n\n\tFilterObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tFilterObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction FilterObservable(source, predicate, thisArg) {\n\t  this.source = source;\n\t  this._fn = bindCallback(predicate, thisArg, 3);\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(FilterObservable, ObservableBase);\n\n\tFilterObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new FilterObserver(o, this._fn, this));\n\t};\n\n\tfunction innerPredicate(fn, self) {\n\t  return function (x, i, o) {\n\t    return self._fn(x, i, o) && fn.call(this, x, i, o);\n\t  };\n\t}\n\n\tFilterObservable.prototype.internalFilter = function (fn, thisArg) {\n\t  return new FilterObservable(this.source, innerPredicate(fn, this), thisArg);\n\t};\n\n\t/**\n\t*  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n\t* @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n\t* @param {Any} [thisArg] Object to use as this when executing callback.\n\t* @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n\t*/\n\tmodule.exports = function filter(source, predicate, thisArg) {\n\t  return source instanceof FilterObservable ? source.internalFilter(predicate, thisArg) : new FilterObservable(source, predicate, thisArg);\n\t};\n\n/***/ },\n/* 156 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Subject = __webpack_require__(57);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar RefCountDisposable = __webpack_require__(150);\n\tvar ArgumentOutOfRangeError = __webpack_require__(7).ArgumentOutOfRangeError;\n\tvar addRef = __webpack_require__(152);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction createWindow(state) {\n\t  var s = new Subject();\n\t  state.q.push(s);\n\t  state.o.onNext(addRef(s, state.refCountDisposable));\n\t}\n\n\tfunction WindowCountObserver(state) {\n\t  this._s = state;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(WindowCountObserver, AbstractObserver);\n\n\tWindowCountObserver.prototype.next = function (x) {\n\t  for (var i = 0, len = this._s.q.length; i < len; i++) {\n\t    this._s.q[i].onNext(x);\n\t  }\n\t  var c = this._s.n - this._s.count + 1;\n\t  c >= 0 && c % this._s.skip === 0 && this._s.q.shift().onCompleted();\n\t  ++this._s.n % this._s.skip === 0 && createWindow(this._s);\n\t};\n\n\tWindowCountObserver.prototype.error = function (e) {\n\t  while (this._s.q.length > 0) {\n\t    this._s.q.shift().onError(e);\n\t  }\n\t  this._s.o.onError(e);\n\t};\n\n\tWindowCountObserver.prototype.completed = function () {\n\t  while (this._s.q.length > 0) {\n\t    this._s.q.shift().onCompleted();\n\t  }\n\t  this._s.o.onCompleted();\n\t};\n\n\tfunction WindowCountObservable(source, count, skip) {\n\t  this.source = source;\n\t  this._count = count;\n\t  this._skip = skip;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(WindowCountObservable, ObservableBase);\n\n\tWindowCountObservable.prototype.subscribeCore = function (o) {\n\t  var m = new SingleAssignmentDisposable(),\n\t      refCountDisposable = new RefCountDisposable(m);\n\n\t  var state = {\n\t    m: m,\n\t    refCountDisposable: refCountDisposable,\n\t    q: [],\n\t    n: 0,\n\t    count: this._count,\n\t    skip: this._skip,\n\t    o: o\n\t  };\n\n\t  createWindow(state);\n\t  m.setDisposable(this.source.subscribe(new WindowCountObserver(state)));\n\n\t  return refCountDisposable;\n\t};\n\n\tmodule.exports = function (source, count, skip) {\n\t  +count || (count = 0);\n\t  Math.abs(count) === Infinity && (count = 0);\n\t  if (count <= 0) {\n\t    throw new ArgumentOutOfRangeError();\n\t  }\n\t  skip == null && (skip = count);\n\t  +skip || (skip = 0);\n\t  Math.abs(skip) === Infinity && (skip = 0);\n\n\t  if (skip <= 0) {\n\t    throw new ArgumentOutOfRangeError();\n\t  }\n\t  return new WindowCountObservable(source, count, skip);\n\t};\n\n/***/ },\n/* 157 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar flatMap = __webpack_require__(145);\n\tvar windowTime = __webpack_require__(158);\n\n\tfunction toArray(x) {\n\t  return x.toArray();\n\t}\n\n\tmodule.exports = function bufferTime(source, timeSpan, timeShiftOrScheduler, scheduler) {\n\t  return flatMap(windowTime(source, timeSpan, timeShiftOrScheduler, scheduler), toArray);\n\t};\n\n/***/ },\n/* 158 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Subject = __webpack_require__(57);\n\tvar CompositeDisposable = __webpack_require__(14);\n\tvar RefCountDisposable = __webpack_require__(150);\n\tvar SerialDisposable = __webpack_require__(44);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar addRef = __webpack_require__(152);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction WindowTimeObserver(state) {\n\t\tthis._state = state;\n\t\tAbstractObserver.call(this);\n\t}\n\n\tinherits(WindowTimeObserver, AbstractObserver);\n\n\tWindowTimeObserver.prototype.next = function (x) {\n\t\tfor (var i = 0, len = this._state.q.length; i < len; i++) {\n\t\t\tthis._state.q[i].onNext(x);\n\t\t}\n\t};\n\n\tWindowTimeObserver.prototype.error = function (e) {\n\t\tfor (var i = 0, len = this._state.q.length; i < len; i++) {\n\t\t\tthis._state.q[i].onError(e);\n\t\t}\n\t\tthis._state.o.onError(e);\n\t};\n\n\tWindowTimeObserver.prototype.completed = function () {\n\t\tfor (var i = 0, len = this._state.q.length; i < len; i++) {\n\t\t\tthis._state.q[i].onCompleted();\n\t\t}\n\t\tthis._state.o.onCompleted();\n\t};\n\n\tfunction WindowTimeObservable(source, timeSpan, timeShift, scheduler) {\n\t\tthis.source = source;\n\t\tthis._timeSpan = timeSpan;\n\t\tthis._timeShift = timeShift;\n\t\tthis._scheduler = scheduler;\n\t\tObservableBase.call(this);\n\t}\n\n\tinherits(WindowTimeObservable, ObservableBase);\n\n\tWindowTimeObservable.prototype.subscribeCore = function (o) {\n\t\tvar self = this;\n\t\tvar groupDisposable,\n\t\t    nextShift = self._timeShift,\n\t\t    nextSpan = self._timeSpan,\n\t\t    q = [],\n\t\t    refCountDisposable,\n\t\t    timerD = new SerialDisposable(),\n\t\t    totalTime = 0;\n\t\tgroupDisposable = new CompositeDisposable(timerD), refCountDisposable = new RefCountDisposable(groupDisposable);\n\n\t\tfunction createTimer() {\n\t\t\tvar m = new SingleAssignmentDisposable(),\n\t\t\t    isSpan = false,\n\t\t\t    isShift = false;\n\t\t\ttimerD.setDisposable(m);\n\t\t\tif (nextSpan === nextShift) {\n\t\t\t\tisSpan = true;\n\t\t\t\tisShift = true;\n\t\t\t} else if (nextSpan < nextShift) {\n\t\t\t\tisSpan = true;\n\t\t\t} else {\n\t\t\t\tisShift = true;\n\t\t\t}\n\t\t\tvar newTotalTime = isSpan ? nextSpan : nextShift,\n\t\t\t    ts = newTotalTime - totalTime;\n\t\t\ttotalTime = newTotalTime;\n\t\t\tif (isSpan) {\n\t\t\t\tnextSpan += self._timeShift;\n\t\t\t}\n\t\t\tif (isShift) {\n\t\t\t\tnextShift += self._timeShift;\n\t\t\t}\n\t\t\tm.setDisposable(self._scheduler.scheduleFuture(null, ts, function () {\n\t\t\t\tif (isShift) {\n\t\t\t\t\tvar s = new Subject();\n\t\t\t\t\tq.push(s);\n\t\t\t\t\to.onNext(addRef(s, refCountDisposable));\n\t\t\t\t}\n\t\t\t\tisSpan && q.shift().onCompleted();\n\t\t\t\tcreateTimer();\n\t\t\t}));\n\t\t}\n\t\tq.push(new Subject());\n\t\to.onNext(addRef(q[0], refCountDisposable));\n\t\tcreateTimer();\n\t\tgroupDisposable.add(self.source.subscribe(new WindowTimeObserver({ q: q, o: o })));\n\t\treturn refCountDisposable;\n\t};\n\n\tmodule.exports = function (source, timeSpan, timeShiftOrScheduler, scheduler) {\n\t\tvar timeShift;\n\t\ttimeShiftOrScheduler == null && (timeShift = timeSpan);\n\t\tScheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t\tif (typeof timeShiftOrScheduler === 'number') {\n\t\t\ttimeShift = timeShiftOrScheduler;\n\t\t} else if (Scheduler.isScheduler(timeShiftOrScheduler)) {\n\t\t\ttimeShift = timeSpan;\n\t\t\tscheduler = timeShiftOrScheduler;\n\t\t}\n\t\treturn new WindowTimeObservable(source, timeSpan, timeShift, scheduler);\n\t};\n\n/***/ },\n/* 159 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar flatMap = __webpack_require__(145);\n\tvar windowTimeOrCount = __webpack_require__(160);\n\n\tfunction toArray(x) {\n\t  return x.toArray();\n\t}\n\n\tmodule.exports = function bufferTimeOrCount(source, timeSpan, count, scheduler) {\n\t  return flatMap(windowTimeOrCount(source, timeSpan, count, scheduler), toArray);\n\t};\n\n/***/ },\n/* 160 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AnonymousObservable = __webpack_require__(36);\n\tvar Subject = __webpack_require__(57);\n\tvar CompositeDisposable = __webpack_require__(14);\n\tvar RefCountDisposable = __webpack_require__(150);\n\tvar SerialDisposable = __webpack_require__(44);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar addRef = __webpack_require__(152);\n\tvar Scheduler = __webpack_require__(12);\n\n\tmodule.exports = function windowTimeOrCount(source, timeSpan, count, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  return new AnonymousObservable(function (observer) {\n\t    var timerD = new SerialDisposable(),\n\t        groupDisposable = new CompositeDisposable(timerD),\n\t        refCountDisposable = new RefCountDisposable(groupDisposable),\n\t        n = 0,\n\t        windowId = 0,\n\t        s = new Subject();\n\n\t    function createTimer(id) {\n\t      var m = new SingleAssignmentDisposable();\n\t      timerD.setDisposable(m);\n\t      m.setDisposable(scheduler.scheduleFuture(null, timeSpan, function () {\n\t        if (id !== windowId) {\n\t          return;\n\t        }\n\t        n = 0;\n\t        var newId = ++windowId;\n\t        s.onCompleted();\n\t        s = new Subject();\n\t        observer.onNext(addRef(s, refCountDisposable));\n\t        createTimer(newId);\n\t      }));\n\t    }\n\n\t    observer.onNext(addRef(s, refCountDisposable));\n\t    createTimer(0);\n\n\t    groupDisposable.add(source.subscribe(function (x) {\n\t      var newId = 0,\n\t          newWindow = false;\n\t      s.onNext(x);\n\t      if (++n === count) {\n\t        newWindow = true;\n\t        n = 0;\n\t        newId = ++windowId;\n\t        s.onCompleted();\n\t        s = new Subject();\n\t        observer.onNext(addRef(s, refCountDisposable));\n\t      }\n\t      newWindow && createTimer(newId);\n\t    }, function (e) {\n\t      s.onError(e);\n\t      observer.onError(e);\n\t    }, function () {\n\t      s.onCompleted();\n\t      observer.onCompleted();\n\t    }));\n\t    return refCountDisposable;\n\t  }, source);\n\t};\n\n/***/ },\n/* 161 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar SerialDisposable = __webpack_require__(44);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar bindCallback = __webpack_require__(52);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction CatchObserver(o, s, fn) {\n\t  this._o = o;\n\t  this._s = s;\n\t  this._fn = fn;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(CatchObserver, AbstractObserver);\n\n\tCatchObserver.prototype.next = function (x) {\n\t  this._o.onNext(x);\n\t};\n\tCatchObserver.prototype.completed = function () {\n\t  return this._o.onCompleted();\n\t};\n\tCatchObserver.prototype.error = function (e) {\n\t  var result = tryCatch(this._fn)(e);\n\t  if (result === errorObj) {\n\t    return this._o.onError(result.e);\n\t  }\n\t  isPromise(result) && (result = fromPromise(result));\n\n\t  var d = new SingleAssignmentDisposable();\n\t  this._s.setDisposable(d);\n\t  d.setDisposable(result.subscribe(this._o));\n\t};\n\n\tfunction CatchObservable(source, fn) {\n\t  this.source = source;\n\t  this._fn = fn;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(CatchObservable, ObservableBase);\n\n\tCatchObservable.prototype.subscribeCore = function (o) {\n\t  var d1 = new SingleAssignmentDisposable(),\n\t      subscription = new SerialDisposable();\n\t  subscription.setDisposable(d1);\n\t  d1.setDisposable(this.source.subscribe(new CatchObserver(o, subscription, this._fn)));\n\t  return subscription;\n\t};\n\n\t/**\n\t * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n\t * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n\t * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n\t */\n\tmodule.exports = function catchHandler(source, handler, thisArg) {\n\t  var fn = bindCallback(handler, thisArg, 1);\n\t  return new CatchObservable(source, fn);\n\t};\n\n/***/ },\n/* 162 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar mergeConcat = __webpack_require__(163);\n\n\tmodule.exports = function concatAll(sources) {\n\t  return mergeConcat(sources, 1);\n\t};\n\n/***/ },\n/* 163 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar CompositeDisposable = __webpack_require__(14);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction InnerObserver(parent, sad) {\n\t  this._p = parent;\n\t  this._sad = sad;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(InnerObserver, AbstractObserver);\n\n\tInnerObserver.prototype.next = function (x) {\n\t  this._p._o.onNext(x);\n\t};\n\tInnerObserver.prototype.error = function (e) {\n\t  this._p._o.onError(e);\n\t};\n\tInnerObserver.prototype.completed = function () {\n\t  this._p._g.remove(this._sad);\n\t  if (this._p._q.length > 0) {\n\t    this._p.handleSubscribe(this._p._q.shift());\n\t  } else {\n\t    this._p._activeCount--;\n\t    this._p._done && this._p._activeCount === 0 && this._p._o.onCompleted();\n\t  }\n\t};\n\n\tfunction MergeObserver(o, max, g) {\n\t  this._o = o;\n\t  this._max = max;\n\t  this._g = g;\n\t  this._done = false;\n\t  this._q = [];\n\t  this._activeCount = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(MergeObserver, AbstractObserver);\n\n\tMergeObserver.prototype.handleSubscribe = function (xs) {\n\t  var sad = new SingleAssignmentDisposable();\n\t  this._g.add(sad);\n\t  isPromise(xs) && (xs = fromPromise(xs));\n\t  sad.setDisposable(xs.subscribe(new InnerObserver(this, sad)));\n\t};\n\n\tMergeObserver.prototype.next = function (innerSource) {\n\t  if (this._activeCount < this._max) {\n\t    this._activeCount++;\n\t    this.handleSubscribe(innerSource);\n\t  } else {\n\t    this._q.push(innerSource);\n\t  }\n\t};\n\tMergeObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tMergeObserver.prototype.completed = function () {\n\t  this._done = true;this._activeCount === 0 && this._o.onCompleted();\n\t};\n\n\tfunction MergeObservable(source, maxConcurrent) {\n\t  this.source = source;\n\t  this._maxConcurrent = maxConcurrent;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(MergeObservable, ObservableBase);\n\n\tMergeObservable.prototype.subscribeCore = function (observer) {\n\t  var g = new CompositeDisposable();\n\t  g.add(this.source.subscribe(new MergeObserver(observer, this._maxConcurrent, g)));\n\t  return g;\n\t};\n\n\t/**\n\t* Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n\t* Or merges two observable sequences into a single observable sequence.\n\t* @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n\t* @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n\t*/\n\tmodule.exports = function mergeConcat(source, maxConcurrent) {\n\t  return new MergeObservable(source, maxConcurrent);\n\t};\n\n/***/ },\n/* 164 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Observable = __webpack_require__(8);\n\tvar StopAndWaitObservable = __webpack_require__(165);\n\tvar WindowedObservable = __webpack_require__(166);\n\tvar multicast = __webpack_require__(58);\n\tvar Notification = __webpack_require__(142);\n\tvar Observer = __webpack_require__(1);\n\tvar Subject = __webpack_require__(57);\n\tvar Scheduler = __webpack_require__(12);\n\tvar Disposable = __webpack_require__(13);\n\tvar Scheduler = __webpack_require__(12);\n\tvar addProperties = __webpack_require__(33);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction ControlledSubject(enableQueue, scheduler) {\n\t  enableQueue == null && (enableQueue = true);\n\t  this.subject = new Subject();\n\t  this.enableQueue = enableQueue;\n\t  this.queue = enableQueue ? [] : null;\n\t  this.requestedCount = 0;\n\t  this.requestedDisposable = null;\n\t  this.error = null;\n\t  this.hasFailed = false;\n\t  this.hasCompleted = false;\n\t  this.scheduler = scheduler || Scheduler.queue;\n\t  Observable.call(this);\n\t}\n\n\tinherits(ControlledSubject, Observable);\n\n\taddProperties(ControlledSubject.prototype, Observer, {\n\t  _subscribe: function (o) {\n\t    return this.subject.subscribe(o);\n\t  },\n\t  onCompleted: function () {\n\t    this.hasCompleted = true;\n\t    if (!this.enableQueue || this.queue.length === 0) {\n\t      this.subject.onCompleted();\n\t      this.disposeCurrentRequest();\n\t    } else {\n\t      this.queue.push(Notification.createOnCompleted());\n\t    }\n\t  },\n\t  onError: function (error) {\n\t    this.hasFailed = true;\n\t    this.error = error;\n\t    if (!this.enableQueue || this.queue.length === 0) {\n\t      this.subject.onError(error);\n\t      this.disposeCurrentRequest();\n\t    } else {\n\t      this.queue.push(Notification.createOnError(error));\n\t    }\n\t  },\n\t  onNext: function (value) {\n\t    if (this.requestedCount <= 0) {\n\t      this.enableQueue && this.queue.push(Notification.createOnNext(value));\n\t    } else {\n\t      this.requestedCount-- === 0 && this.disposeCurrentRequest();\n\t      this.subject.onNext(value);\n\t    }\n\t  },\n\t  _processRequest: function (numberOfItems) {\n\t    if (this.enableQueue) {\n\t      while (this.queue.length > 0 && (numberOfItems > 0 || this.queue[0].kind !== 'N')) {\n\t        var first = this.queue.shift();\n\t        first.accept(this.subject);\n\t        if (first.kind === 'N') {\n\t          numberOfItems--;\n\t        } else {\n\t          this.disposeCurrentRequest();\n\t          this.queue = [];\n\t        }\n\t      }\n\t    }\n\n\t    return numberOfItems;\n\t  },\n\t  request: function (number) {\n\t    this.disposeCurrentRequest();\n\t    var self = this;\n\n\t    this.requestedDisposable = this.scheduler.schedule(number, function (s, i) {\n\t      var remaining = self._processRequest(i);\n\t      var stopped = self.hasCompleted || self.hasFailed;\n\t      if (!stopped && remaining > 0) {\n\t        self.requestedCount = remaining;\n\n\t        return Disposable.create(function () {\n\t          self.requestedCount = 0;\n\t        });\n\t        // Scheduled item is still in progress. Return a new\n\t        // disposable to allow the request to be interrupted\n\t        // via dispose.\n\t      }\n\t    });\n\n\t    return this.requestedDisposable;\n\t  },\n\t  disposeCurrentRequest: function () {\n\t    if (this.requestedDisposable) {\n\t      this.requestedDisposable.dispose();\n\t      this.requestedDisposable = null;\n\t    }\n\t  }\n\t});\n\n\tfunction ControlledObservable(source, enableQueue, scheduler) {\n\t  this.subject = new ControlledSubject(enableQueue, scheduler);\n\t  this.source = multicast(source, this.subject).refCount();\n\t  Observable.call(this);\n\t}\n\n\tinherits(ControlledObservable, Observable);\n\n\tControlledObservable.prototype._subscribe = function (o) {\n\t  return this.source.subscribe(o);\n\t};\n\n\tControlledObservable.prototype.request = function (numberOfItems) {\n\t  return this.subject.request(numberOfItems == null ? -1 : numberOfItems);\n\t};\n\n\tControlledObservable.prototype.stopAndWait = function (scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  return new StopAndWaitObservable(this, scheduler);\n\t};\n\n\tControlledObservable.prototype.windowed = function (windowSize, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  return new WindowedObservable(this, windowSize, scheduler);\n\t};\n\n\tmodule.exports = function controlled(source, enableQueue, scheduler) {\n\n\t  if (enableQueue && Scheduler.isScheduler(enableQueue)) {\n\t    scheduler = enableQueue;\n\t    enableQueue = true;\n\t  }\n\n\t  if (enableQueue == null) {\n\t    enableQueue = true;\n\t  }\n\t  return new ControlledObservable(source, enableQueue, scheduler);\n\t};\n\n/***/ },\n/* 165 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Observable = __webpack_require__(8);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction StopAndWaitObserver(observer, observable, scheduler, cancel) {\n\t  this.observer = observer;\n\t  this.observable = observable;\n\t  this.scheduler = scheduler;\n\t  this.cancel = cancel;\n\t  this.scheduleDisposable = null;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(StopAndWaitObserver, AbstractObserver);\n\n\tStopAndWaitObserver.prototype.completed = function () {\n\t  this.observer.onCompleted();\n\t  this.dispose();\n\t};\n\n\tStopAndWaitObserver.prototype.error = function (error) {\n\t  this.observer.onError(error);\n\t  this.dispose();\n\t};\n\n\tfunction innerScheduleMethod(s, self) {\n\t  return self.observable.source.request(1);\n\t}\n\n\tStopAndWaitObserver.prototype.next = function (value) {\n\t  this.observer.onNext(value);\n\t  this.scheduleDisposable = this.scheduler.schedule(this, innerScheduleMethod);\n\t};\n\n\tStopAndWaitObserver.prototype.dispose = function () {\n\t  this.observer = null;\n\t  if (this.cancel) {\n\t    this.cancel.dispose();\n\t    this.cancel = null;\n\t  }\n\t  if (this.scheduleDisposable) {\n\t    this.scheduleDisposable.dispose();\n\t    this.scheduleDisposable = null;\n\t  }\n\t  AbstractObserver.prototype.dispose.call(this);\n\t};\n\n\tfunction StopAndWaitObservable(source, scheduler) {\n\t  this.source = source;\n\t  this.scheduler = scheduler;\n\t  Observable.call(this);\n\t}\n\n\tinherits(StopAndWaitObservable, Observable);\n\n\tfunction scheduleMethod(s, self) {\n\t  return self.source.request(1);\n\t}\n\n\tStopAndWaitObservable.prototype._subscribe = function (o) {\n\t  this.subscription = this.source.subscribe(new StopAndWaitObserver(o, this, this.scheduler, this.subscription));\n\t  return new BinaryDisposable(this.subscription, this.scheduler.schedule(this, scheduleMethod));\n\t};\n\n\tmodule.exports = StopAndWaitObservable;\n\n/***/ },\n/* 166 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Observable = __webpack_require__(8);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction WindowedObserver(observer, observable, scheduler, cancel) {\n\t  this.observer = observer;\n\t  this.observable = observable;\n\t  this.scheduler = scheduler;\n\t  this.cancel = cancel;\n\t  this.received = 0;\n\t  this.scheduleDisposable = null;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(WindowedObserver, AbstractObserver);\n\n\tWindowedObserver.prototype.completed = function () {\n\t  this.observer.onCompleted();\n\t  this.dispose();\n\t};\n\n\tWindowedObserver.prototype.error = function (error) {\n\t  this.observer.onError(error);\n\t  this.dispose();\n\t};\n\n\tfunction innerScheduleMethod(s, self) {\n\t  return self.observable.source.request(self.observable.windowSize);\n\t}\n\n\tWindowedObserver.prototype.next = function (value) {\n\t  this.observer.onNext(value);\n\t  this.received = ++this.received % this.observable.windowSize;\n\t  this.received === 0 && (this.scheduleDisposable = this.scheduler.schedule(this, innerScheduleMethod));\n\t};\n\n\tWindowedObserver.prototype.dispose = function () {\n\t  this.observer = null;\n\t  if (this.cancel) {\n\t    this.cancel.dispose();\n\t    this.cancel = null;\n\t  }\n\t  if (this.scheduleDisposable) {\n\t    this.scheduleDisposable.dispose();\n\t    this.scheduleDisposable = null;\n\t  }\n\t  AbstractObserver.prototype.dispose.call(this);\n\t};\n\n\tfunction WindowedObservable(source, windowSize, scheduler) {\n\t  this.source = source;\n\t  this.windowSize = windowSize;\n\t  this.scheduler = scheduler;\n\t  Observable.call(this);\n\t}\n\n\tinherits(WindowedObservable, Observable);\n\n\tfunction scheduleMethod(s, self) {\n\t  return self.source.request(self.windowSize);\n\t}\n\n\tWindowedObservable.prototype._subscribe = function (o) {\n\t  this.subscription = this.source.subscribe(new WindowedObserver(o, this, this.scheduler, this.subscription));\n\t  return new BinaryDisposable(this.subscription, this.scheduler.schedule(this, scheduleMethod));\n\t};\n\n\tmodule.exports = WindowedObservable;\n\n/***/ },\n/* 167 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar bindCallback = __webpack_require__(52);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction CountObserver(o, fn, s) {\n\t  this._o = o;\n\t  this._fn = fn;\n\t  this._s = s;\n\t  this._i = 0;\n\t  this._c = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(CountObserver, AbstractObserver);\n\n\tCountObserver.prototype.next = function (x) {\n\t  if (this._fn) {\n\t    var result = tryCatch(this._fn)(x, this._i++, this._s);\n\t    if (result === errorObj) {\n\t      return this._o.onError(result.e);\n\t    }\n\t    Boolean(result) && this._c++;\n\t  } else {\n\t    this._c++;\n\t  }\n\t};\n\tCountObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tCountObserver.prototype.completed = function () {\n\t  this._o.onNext(this._c);\n\t  this._o.onCompleted();\n\t};\n\n\tfunction CountObservable(source, fn) {\n\t  this.source = source;\n\t  this._fn = fn;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(CountObservable, ObservableBase);\n\n\tCountObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new CountObserver(o, this._fn, this.source));\n\t};\n\n\tmodule.exports = function count(source, predicate, thisArg) {\n\t  var fn = bindCallback(predicate, thisArg, 3);\n\t  return new CountObservable(source, fn);\n\t};\n\n/***/ },\n/* 168 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Scheduler = __webpack_require__(12);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar SerialDisposable = __webpack_require__(44);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar isFunction = __webpack_require__(9);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction DebounceObserver(o, dt, scheduler, cancelable) {\n\t  this._o = o;\n\t  this._d = dt;\n\t  this._scheduler = scheduler;\n\t  this._c = cancelable;\n\t  this._v = null;\n\t  this._hv = false;\n\t  this._id = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(DebounceObserver, AbstractObserver);\n\n\tDebounceObserver.prototype.next = function (x) {\n\t  this._hv = true;\n\t  this._v = x;\n\t  var currentId = ++this._id,\n\t      d = new SingleAssignmentDisposable();\n\t  this._c.setDisposable(d);\n\t  d.setDisposable(this._scheduler.scheduleFuture(this, this._d, function (_, self) {\n\t    self._hv && self._id === currentId && self._o.onNext(x);\n\t    self._hv = false;\n\t  }));\n\t};\n\n\tDebounceObserver.prototype.error = function (e) {\n\t  this._c.dispose();\n\t  this._o.onError(e);\n\t  this._hv = false;\n\t  this._id++;\n\t};\n\n\tDebounceObserver.prototype.completed = function () {\n\t  this._c.dispose();\n\t  this._hv && this._o.onNext(this._v);\n\t  this._o.onCompleted();\n\t  this._hv = false;\n\t  this._id++;\n\t};\n\n\tfunction DebounceObservable(source, dt, s) {\n\t  Scheduler.isScheduler(s) || (s = Scheduler.async);\n\t  this.source = source;\n\t  this._dt = dt;\n\t  this._s = s;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(DebounceObservable, ObservableBase);\n\n\tDebounceObservable.prototype.subscribeCore = function (o) {\n\t  var cancelable = new SerialDisposable();\n\t  return new BinaryDisposable(this.source.subscribe(new DebounceObserver(o, this._dt, this._s, cancelable)), cancelable);\n\t};\n\n\tfunction DebounceSelectorObserver(s) {\n\t  this._s = s;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(DebounceSelectorObserver, AbstractObserver);\n\n\tDebounceSelectorObserver.prototype.next = function (x) {\n\t  var throttle = tryCatch(this._s.fn)(x);\n\t  if (throttle === errorObj) {\n\t    return this._s.o.onError(throttle.e);\n\t  }\n\n\t  isPromise(throttle) && (throttle = fromPromise(throttle));\n\n\t  this._s.hasValue = true;\n\t  this._s.value = x;\n\t  this._s.id++;\n\t  var currentId = this._s.id,\n\t      d = new SingleAssignmentDisposable();\n\t  this._s.cancelable.setDisposable(d);\n\n\t  var self = this;\n\t  d.setDisposable(throttle.subscribe(function () {\n\t    self._s.hasValue && self._s.id === currentId && self._s.o.onNext(self._s.value);\n\t    self._s.hasValue = false;\n\t    d.dispose();\n\t  }, function (e) {\n\t    self._s.o.onError(e);\n\t  }, function () {\n\t    self._s.hasValue && self._s.id === currentId && self._s.o.onNext(self._s.value);\n\t    self._s.hasValue = false;\n\t    d.dispose();\n\t  }));\n\t};\n\n\tDebounceSelectorObserver.prototype.error = function (e) {\n\t  this._s.cancelable.dispose();\n\t  this._s.o.onError(e);\n\t  this._s.hasValue = false;\n\t  this._s.id++;\n\t};\n\n\tDebounceSelectorObserver.prototype.completed = function () {\n\t  this._s.cancelable.dispose();\n\t  this._s.hasValue && this._s.o.onNext(this._s.value);\n\t  this._s.o.onCompleted();\n\t  this._s.hasValue = false;\n\t  this._s.id++;\n\t};\n\n\tfunction DebounceSelectorObservable(source, fn) {\n\t  this.source = source;\n\t  this._fn = fn;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(DebounceSelectorObservable, ObservableBase);\n\n\tDebounceSelectorObservable.prototype.subscribeCore = function (o) {\n\t  var state = {\n\t    value: null,\n\t    hasValue: false,\n\t    cancelable: new SerialDisposable(),\n\t    id: 0,\n\t    o: o,\n\t    fn: this._fn\n\t  };\n\n\t  return new BinaryDisposable(state.cancelable, this.source.subscribe(new DebounceSelectorObserver(state)));\n\t};\n\n\tmodule.exports = function debounce() {\n\t  var source = arguments[0];\n\t  if (isFunction(arguments[1])) {\n\t    return new DebounceSelectorObservable(source, arguments[1]);\n\t  } else if (typeof arguments[1] === 'number') {\n\t    return new DebounceObservable(source, arguments[1], arguments[2]);\n\t  } else {\n\t    throw new Error('Invalid arguments');\n\t  }\n\t};\n\n/***/ },\n/* 169 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction DefaultIfEmptyObserver(o, d) {\n\t  this._o = o;\n\t  this._d = d;\n\t  this._f = false;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(DefaultIfEmptyObserver, AbstractObserver);\n\n\tDefaultIfEmptyObserver.prototype.next = function (x) {\n\t  this._f = true;\n\t  this._o.onNext(x);\n\t};\n\tDefaultIfEmptyObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tDefaultIfEmptyObserver.prototype.completed = function () {\n\t  !this._f && this._o.onNext(this._d);\n\t  this._o.onCompleted();\n\t};\n\n\tfunction DefaultIfEmptyObservable(source, defaultValue) {\n\t  this.source = source;\n\t  this._d = defaultValue;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(DefaultIfEmptyObservable, ObservableBase);\n\n\tDefaultIfEmptyObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new DefaultIfEmptyObserver(o, this._d));\n\t};\n\n\t/**\n\t *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n\t * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n\t * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n\t */\n\tmodule.exports = function defaultIfEmpty(source, defaultValue) {\n\t  return new DefaultIfEmptyObservable(source, defaultValue);\n\t};\n\n/***/ },\n/* 170 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar materialize = __webpack_require__(141);\n\tvar timestamp = __webpack_require__(171);\n\tvar isObservable = __webpack_require__(8).isObservable;\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar CompositeDisposable = __webpack_require__(14);\n\tvar SerialDisposable = __webpack_require__(44);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar isFunction = __webpack_require__(9);\n\tvar Scheduler = __webpack_require__(12);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction scheduleRelative(state, recurse) {\n\t  if (state.error) {\n\t    return;\n\t  }\n\t  state.running = true;\n\n\t  var result;\n\t  do {\n\t    result = null;\n\t    if (state.q.length > 0 && state.q[0].timestamp - state.scheduler.now() <= 0) {\n\t      result = state.q.shift().value;\n\t    }\n\t    if (result) {\n\t      result.accept(state.o);\n\t    }\n\t  } while (result);\n\n\t  var shouldRecurse = false;\n\t  var recurseDueTime = 0;\n\n\t  if (state.q.length > 0) {\n\t    shouldRecurse = true;\n\t    recurseDueTime = Math.max(0, state.q[0].timestamp - state.scheduler.now());\n\t  } else {\n\t    state.active = false;\n\t  }\n\n\t  state.running = false;\n\t  if (state.error) {\n\t    state.o.onError(state.error);\n\t  } else if (shouldRecurse) {\n\t    recurse(state, recurseDueTime);\n\t  }\n\t}\n\n\tfunction DelayRelativeObserver(state) {\n\t  this._s = state;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(DelayRelativeObserver, AbstractObserver);\n\n\tDelayRelativeObserver.prototype.next = function (notification) {\n\t  var shouldRun;\n\t  if (notification.value.kind === 'E') {\n\t    this._s.q = [];\n\t    this._s.q.push(notification);\n\t    this._s.error = notification.value.error;\n\t    shouldRun = !this._s.running;\n\t  } else {\n\t    this._s.q.push({ value: notification.value, timestamp: notification.timestamp + this._s.dueTime });\n\t    shouldRun = !this._s.active;\n\t    this._s.active = true;\n\t  }\n\t  if (shouldRun) {\n\t    if (this._s.error) {\n\t      this._s.o.onError(this._s.error);\n\t    } else {\n\t      var d = new SingleAssignmentDisposable();\n\t      this._s.cancelable.setDisposable(d);\n\t      d.setDisposable(this._s.scheduler.scheduleRecursiveFuture(this._s, this._s.dueTime, scheduleRelative));\n\t    }\n\t  }\n\t};\n\n\tDelayRelativeObserver.prototype.error = function (e) {\n\t  throw e;\n\t};\n\tDelayRelativeObserver.prototype.completed = function () {};\n\n\tfunction DelayRelativeObservable(source, dueTime, scheduler) {\n\t  this.source = source;\n\t  this._dueTime = dueTime;\n\t  this._scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(DelayRelativeObservable, ObservableBase);\n\n\tDelayRelativeObservable.prototype.subscribeCore = function (o) {\n\t  var state = {\n\t    active: false,\n\t    cancelable: new SerialDisposable(),\n\t    error: null,\n\t    q: [],\n\t    running: false,\n\t    o: o,\n\t    dueTime: this._dueTime,\n\t    scheduler: this._scheduler\n\t  };\n\n\t  var subscription = timestamp(materialize(this.source), this._scheduler).subscribe(new DelayRelativeObserver(state));\n\n\t  return new BinaryDisposable(subscription, state.cancelable);\n\t};\n\n\tfunction DelayAbsoluteObservable(source, dueTime, scheduler) {\n\t  this.source = source;\n\t  this._dueTime = dueTime;\n\t  this._scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(DelayAbsoluteObservable, ObservableBase);\n\n\tDelayAbsoluteObservable.prototype.subscribe = function (o) {\n\t  var obs = new DelayRelativeObservable(this.source, this._dueTime - this._scheduler.now(), this._scheduler);\n\t  return obs.subscribe(o);\n\t};\n\n\tfunction DelaySelectorObseravble(source, subscriptionDelay, delayDurationSelector) {\n\t  this.source = source;\n\t  this._selector = null;\n\t  this._subDelay = null;\n\t  if (isFunction(subscriptionDelay)) {\n\t    this._selector = subscriptionDelay;\n\t  } else {\n\t    this._subDelay = subscriptionDelay;\n\t    this._selector = delayDurationSelector;\n\t  }\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(DelaySelectorObseravble, ObservableBase);\n\n\tDelaySelectorObseravble.prototype.subscribeCore = function (o) {\n\t  var delays = new CompositeDisposable(),\n\t      atEnd = false,\n\t      subscription = new SerialDisposable(),\n\t      selector = this._selector,\n\t      subDelay = this._subDelay,\n\t      source = this.source;\n\n\t  function start() {\n\t    subscription.setDisposable(source.subscribe(function (x) {\n\t      var delay = tryCatch(selector)(x);\n\t      if (delay === errorObj) {\n\t        return o.onError(delay.e);\n\t      }\n\t      var d = new SingleAssignmentDisposable();\n\t      delays.add(d);\n\t      d.setDisposable(delay.subscribe(function () {\n\t        o.onNext(x);\n\t        delays.remove(d);\n\t        done();\n\t      }, function (e) {\n\t        o.onError(e);\n\t      }, function () {\n\t        o.onNext(x);\n\t        delays.remove(d);\n\t        done();\n\t      }));\n\t    }, function (e) {\n\t      o.onError(e);\n\t    }, function () {\n\t      atEnd = true;\n\t      subscription.dispose();\n\t      done();\n\t    }));\n\t  }\n\n\t  function done() {\n\t    atEnd && delays.length === 0 && o.onCompleted();\n\t  }\n\n\t  if (!subDelay) {\n\t    start();\n\t  } else {\n\t    subscription.setDisposable(subDelay.subscribe(start, function (e) {\n\t      o.onError(e);\n\t    }, start));\n\t  }\n\n\t  return new BinaryDisposable(subscription, delays);\n\t};\n\n\t/**\n\t *  Time shifts the observable sequence by dueTime.\n\t *  The relative time intervals between the values are preserved.\n\t *\n\t * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n\t * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n\t * @returns {Observable} Time-shifted sequence.\n\t */\n\tmodule.exports = function delay() {\n\t  var source = arguments[0],\n\t      firstArg = arguments[1];\n\t  if (typeof firstArg === 'number' || firstArg instanceof Date) {\n\t    var dueTime = firstArg,\n\t        scheduler = arguments[2];\n\t    Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t    return dueTime instanceof Date ? new DelayAbsoluteObservable(source, dueTime, scheduler) : new DelayRelativeObservable(source, dueTime, scheduler);\n\t  } else if (isObservable(firstArg) || isFunction(firstArg)) {\n\t    return new DelaySelectorObseravble(source, firstArg, arguments[2]);\n\t  } else {\n\t    throw new Error('Invalid arguments');\n\t  }\n\t};\n\n/***/ },\n/* 171 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction TimestampObserver(o, s) {\n\t  this._o = o;\n\t  this._s = s;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(TimestampObserver, AbstractObserver);\n\n\tTimestampObserver.prototype.next = function (x) {\n\t  this._o.onNext({ value: x, timestamp: this._s.now() });\n\t};\n\tTimestampObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tTimestampObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction TimestampObservable(source, s) {\n\t  this.source = source;\n\t  this._s = s;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(TimestampObservable, ObservableBase);\n\n\tTimestampObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new TimestampObserver(o, this._s));\n\t};\n\n\tmodule.exports = function timestamp(source, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  return new TimestampObservable(source, scheduler);\n\t};\n\n/***/ },\n/* 172 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar SerialDisposable = __webpack_require__(44);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction DelaySubscription(source, dt, s) {\n\t  this.source = source;\n\t  this._dt = dt;\n\t  this._s = s;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(DelaySubscription, ObservableBase);\n\n\tfunction scheduleMethod(s, state) {\n\t  var source = state[0],\n\t      o = state[1],\n\t      d = state[2];\n\t  d.setDisposable(source.subscribe(o));\n\t}\n\n\tDelaySubscription.prototype.subscribeCore = function (o) {\n\t  var d = new SerialDisposable();\n\t  d.setDisposable(this._s.scheduleFuture([this.source, o, d], this._dt, scheduleMethod));\n\t  return d;\n\t};\n\n\t/**\n\t *  Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n\t * @param {Number} dueTime Relative or absolute time shift of the subscription.\n\t * @param {Scheduler} [scheduler]  Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used.\n\t * @returns {Observable} Time-shifted sequence.\n\t */\n\tmodule.exports = function delaySubscription(source, dueTime, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  return new DelaySubscription(source, dueTime, scheduler);\n\t};\n\n/***/ },\n/* 173 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction DematerializeObserver(o) {\n\t  this._o = o;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(DematerializeObserver, AbstractObserver);\n\n\tDematerializeObserver.prototype.next = function (x) {\n\t  x.accept(this._o);\n\t};\n\tDematerializeObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tDematerializeObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction DematerializeObservable(source) {\n\t  this.source = source;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(DematerializeObservable, ObservableBase);\n\n\tDematerializeObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new DematerializeObserver(o));\n\t};\n\n\t/**\n\t * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n\t * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n\t */\n\tmodule.exports = function dematerialize(source) {\n\t  return new DematerializeObservable(source);\n\t};\n\n/***/ },\n/* 174 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar isFunction = __webpack_require__(9);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar isEqual = __webpack_require__(74);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction arrayIndexOfComparer(array, item, comparer) {\n\t  for (var i = 0, len = array.length; i < len; i++) {\n\t    if (comparer(array[i], item)) {\n\t      return i;\n\t    }\n\t  }\n\t  return -1;\n\t}\n\n\tfunction HashSet(cmp) {\n\t  this._cmp = cmp;\n\t  this._set = [];\n\t}\n\n\tHashSet.prototype.push = function (v) {\n\t  var retValue = arrayIndexOfComparer(this._set, v, this._cmp) === -1;\n\t  retValue && this._set.push(v);\n\t  return retValue;\n\t};\n\n\tfunction DistinctObserver(o, keyFn, cmpFn) {\n\t  this._o = o;\n\t  this._keyFn = keyFn;\n\t  this._h = new HashSet(cmpFn);\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(DistinctObserver, AbstractObserver);\n\n\tDistinctObserver.prototype.next = function (x) {\n\t  var key = x;\n\t  if (isFunction(this._keyFn)) {\n\t    key = tryCatch(this._keyFn)(x);\n\t    if (key === errorObj) {\n\t      return this._o.onError(key.e);\n\t    }\n\t  }\n\t  this._h.push(key) && this._o.onNext(x);\n\t};\n\n\tDistinctObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tDistinctObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction DistinctObservable(source, keyFn, cmpFn) {\n\t  this.source = source;\n\t  this._keyFn = keyFn;\n\t  this._cmpFn = cmpFn;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(DistinctObservable, ObservableBase);\n\n\tDistinctObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new DistinctObserver(o, this._keyFn, this._cmpFn));\n\t};\n\n\tmodule.exports = function distinct(source, keySelector, comparer) {\n\t  comparer || (comparer = isEqual);\n\t  return new DistinctObservable(source, keySelector, comparer);\n\t};\n\n/***/ },\n/* 175 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar isFunction = __webpack_require__(9);\n\tvar isEqual = __webpack_require__(74);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction DistinctUntilChangedObserver(o, fn, cmp) {\n\t  this._o = o;\n\t  this._fn = fn;\n\t  this._cmp = cmp;\n\t  this._hk = false;\n\t  this._k = null;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(DistinctUntilChangedObserver, AbstractObserver);\n\n\tDistinctUntilChangedObserver.prototype.next = function (x) {\n\t  var key = x,\n\t      comparerEquals;\n\t  if (isFunction(this._fn)) {\n\t    key = tryCatch(this._fn)(x);\n\t    if (key === errorObj) {\n\t      return this._o.onError(key.e);\n\t    }\n\t  }\n\t  if (this._hk) {\n\t    comparerEquals = tryCatch(this._cmp)(this._k, key);\n\t    if (comparerEquals === errorObj) {\n\t      return this._o.onError(comparerEquals.e);\n\t    }\n\t  }\n\t  if (!this._hk || !comparerEquals) {\n\t    this._hk = true;\n\t    this._k = key;\n\t    this._o.onNext(x);\n\t  }\n\t};\n\tDistinctUntilChangedObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tDistinctUntilChangedObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction DistinctUntilChangedObservable(source, fn, cmp) {\n\t  this.source = source;\n\t  this._fn = fn;\n\t  this._cmp = cmp;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(DistinctUntilChangedObservable, ObservableBase);\n\n\tDistinctUntilChangedObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new DistinctUntilChangedObserver(o, this._fn, this._cmp));\n\t};\n\n\t/**\n\t*  Returns an observable sequence that contains only distinct contiguous elements according to the keyFn and the comparer.\n\t* @param {Function} [keyFn] A function to compute the comparison key for each element. If not provided, it projects the value.\n\t* @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n\t* @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n\t*/\n\tmodule.exports = function distinctUntilChanged(source, keyFn, comparer) {\n\t  comparer || (comparer = isEqual);\n\t  return new DistinctUntilChangedObservable(source, keyFn, comparer);\n\t};\n\n/***/ },\n/* 176 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar create = __webpack_require__(2);\n\tvar isFunction = __webpack_require__(9);\n\tvar noop = __webpack_require__(3);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction TapObserver(o, p) {\n\t  this._o = o;\n\t  this._t = !p._oN || isFunction(p._oN) ? create(p._oN || noop, p._oE || noop, p._oC || noop) : p._oN;\n\t  this.isStopped = false;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(TapObserver, AbstractObserver);\n\n\tTapObserver.prototype.next = function (x) {\n\t  var res = tryCatch(this._t.onNext).call(this._t, x);\n\t  if (res === errorObj) {\n\t    this._o.onError(res.e);\n\t  }\n\t  this._o.onNext(x);\n\t};\n\n\tTapObserver.prototype.error = function (e) {\n\t  var res = tryCatch(this._t.onError).call(this._t, e);\n\t  if (res === errorObj) {\n\t    return this._o.onError(res.e);\n\t  }\n\t  this._o.onError(e);\n\t};\n\n\tTapObserver.prototype.completed = function () {\n\t  var res = tryCatch(this._t.onCompleted).call(this._t);\n\t  if (res === errorObj) {\n\t    return this._o.onError(res.e);\n\t  }\n\t  this._o.onCompleted();\n\t};\n\n\tfunction TapObservable(source, observerOrOnNext, onError, onCompleted) {\n\t  this.source = source;\n\t  this._oN = observerOrOnNext;\n\t  this._oE = onError;\n\t  this._oC = onCompleted;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(TapObservable, ObservableBase);\n\n\tTapObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new TapObserver(o, this));\n\t};\n\n\t/**\n\t*  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n\t*  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n\t* @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an o.\n\t* @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n\t* @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n\t* @returns {Observable} The source sequence with the side-effecting behavior applied.\n\t*/\n\tmodule.exports = function tap(source, observerOrOnNext, onError, onCompleted) {\n\t  return new TapObservable(source, observerOrOnNext, onError, onCompleted);\n\t};\n\n/***/ },\n/* 177 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar bindCallback = __webpack_require__(52);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction EveryObserver(o, fn, s) {\n\t  this._o = o;\n\t  this._fn = fn;\n\t  this._s = s;\n\t  this._i = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(EveryObserver, AbstractObserver);\n\n\tEveryObserver.prototype.next = function (x) {\n\t  var result = tryCatch(this._fn)(x, this._i++, this._s);\n\t  if (result === errorObj) {\n\t    return this._o.onError(result.e);\n\t  }\n\t  if (!Boolean(result)) {\n\t    this._o.onNext(false);\n\t    this._o.onCompleted();\n\t  }\n\t};\n\tEveryObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tEveryObserver.prototype.completed = function () {\n\t  this._o.onNext(true);\n\t  this._o.onCompleted();\n\t};\n\n\tfunction EveryObservable(source, fn) {\n\t  this.source = source;\n\t  this._fn = fn;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(EveryObservable, ObservableBase);\n\n\tEveryObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new EveryObserver(o, this._fn, this.source));\n\t};\n\n\tmodule.exports = function every(source, predicate, thisArg) {\n\t  var fn = bindCallback(predicate, thisArg, 3);\n\t  return new EveryObservable(source, fn);\n\t};\n\n/***/ },\n/* 178 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar inherits = __webpack_require__(6);\n\tvar bindCallback = __webpack_require__(52);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj,\n\t    thrower = tryCatchUtils.thrower;\n\n\tfunction FinallyDisposable(s, fn) {\n\t  this.isDisposed = false;\n\t  this._s = s;\n\t  this._fn = fn;\n\t}\n\n\tFinallyDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    var res = tryCatch(this._s.dispose).call(this._s);\n\t    this._fn();\n\t    res === errorObj && thrower(res.e);\n\t  }\n\t};\n\n\tfunction FinallyObservable(source, fn, thisArg) {\n\t  this.source = source;\n\t  this._fn = bindCallback(fn, thisArg, 0);\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(FinallyObservable, ObservableBase);\n\n\tFinallyObservable.prototype.subscribeCore = function (o) {\n\t  var d = tryCatch(this.source.subscribe).call(this.source, o);\n\t  if (d === errorObj) {\n\t    this._fn();\n\t    thrower(d.e);\n\t  }\n\n\t  return new FinallyDisposable(d, this._fn);\n\t};\n\n\t/**\n\t *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n\t * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n\t * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n\t */\n\tmodule.exports = function finally_(source, action, thisArg) {\n\t  return new FinallyObservable(source, action, thisArg);\n\t};\n\n/***/ },\n/* 179 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar FindValueObservable = __webpack_require__(180);\n\n\tmodule.exports = function find(source, predicate, thisArg) {\n\t  return new FindValueObservable(source, predicate, thisArg, false);\n\t};\n\n/***/ },\n/* 180 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar bindCallback = __webpack_require__(52);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction FindValueObserver(observer, source, callback, yieldIndex) {\n\t  this._o = observer;\n\t  this._s = source;\n\t  this._cb = callback;\n\t  this._y = yieldIndex;\n\t  this._i = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(FindValueObserver, AbstractObserver);\n\n\tFindValueObserver.prototype.next = function (x) {\n\t  var shouldRun = tryCatch(this._cb)(x, this._i, this._s);\n\t  if (shouldRun === errorObj) {\n\t    return this._o.onError(shouldRun.e);\n\t  }\n\t  if (shouldRun) {\n\t    this._o.onNext(this._y ? this._i : x);\n\t    this._o.onCompleted();\n\t  } else {\n\t    this._i++;\n\t  }\n\t};\n\n\tFindValueObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\n\tFindValueObserver.prototype.completed = function () {\n\t  this._y && this._o.onNext(-1);\n\t  this._o.onCompleted();\n\t};\n\n\tfunction FindValueObservable(source, cb, thisArg, yieldIndex) {\n\t  this.source = source;\n\t  this._cb = bindCallback(cb, thisArg, 3);\n\t  this._yieldIndex = yieldIndex;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(FindValueObservable, ObservableBase);\n\n\tFindValueObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new FindValueObserver(o, this.source, this._cb, this._yieldIndex));\n\t};\n\n\tmodule.exports = FindValueObservable;\n\n/***/ },\n/* 181 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar FindValueObservable = __webpack_require__(180);\n\n\tmodule.exports = function findIndex(source, predicate, thisArg) {\n\t  return new FindValueObservable(source, predicate, thisArg, true);\n\t};\n\n/***/ },\n/* 182 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar EmptyError = __webpack_require__(7).EmptyError;\n\tvar bindCallback = __webpack_require__(52);\n\tvar isFunction = __webpack_require__(9);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction FirstObserver(o, obj, s) {\n\t  this._o = o;\n\t  this._obj = obj;\n\t  this._s = s;\n\t  this._i = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(FirstObserver, AbstractObserver);\n\n\tFirstObserver.prototype.next = function (x) {\n\t  if (this._obj.predicate) {\n\t    var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n\t    if (res === errorObj) {\n\t      return this._o.onError(res.e);\n\t    }\n\t    if (Boolean(res)) {\n\t      this._o.onNext(x);\n\t      this._o.onCompleted();\n\t    }\n\t  } else if (!this._obj.predicate) {\n\t    this._o.onNext(x);\n\t    this._o.onCompleted();\n\t  }\n\t};\n\tFirstObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tFirstObserver.prototype.completed = function () {\n\t  if (this._obj.defaultValue === undefined) {\n\t    this._o.onError(new EmptyError());\n\t  } else {\n\t    this._o.onNext(this._obj.defaultValue);\n\t    this._o.onCompleted();\n\t  }\n\t};\n\n\tfunction FirstObservable(source, obj) {\n\t  this.source = source;\n\t  this._obj = obj;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(FirstObservable, ObservableBase);\n\n\tFirstObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new FirstObserver(o, this._obj, this.source));\n\t};\n\n\tmodule.exports = function first() {\n\t  var obj = {},\n\t      source = arguments[0];\n\t  if (typeof arguments[1] === 'object') {\n\t    obj = arguments[1];\n\t  } else {\n\t    obj = {\n\t      predicate: arguments[1],\n\t      thisArg: arguments[2],\n\t      defaultValue: arguments[3]\n\t    };\n\t  }\n\t  if (isFunction(obj.predicate)) {\n\t    var fn = obj.predicate;\n\t    obj.predicate = bindCallback(fn, obj.thisArg, 3);\n\t  }\n\t  return new FirstObservable(source, obj);\n\t};\n\n/***/ },\n/* 183 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar FlatMapObservable = __webpack_require__(146);\n\tvar switchFirst = __webpack_require__(184);\n\n\tmodule.exports = function flatMapFirst(source, selector, resultSelector, thisArg) {\n\t  return switchFirst(new FlatMapObservable(source, selector, resultSelector, thisArg));\n\t};\n\n/***/ },\n/* 184 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar CompositeDisposable = __webpack_require__(14);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction InnerObserver(state, inner) {\n\t  this._s = state;\n\t  this._i = inner;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(InnerObserver, AbstractObserver);\n\n\tInnerObserver.prototype.next = function (x) {\n\t  this._s.o.onNext(x);\n\t};\n\tInnerObserver.prototype.error = function (e) {\n\t  this._s.o.onError(e);\n\t};\n\tInnerObserver.prototype.completed = function () {\n\t  this._s.g.remove(this._i);\n\t  this._s.hasCurrent = false;\n\t  this._s.isStopped && this._s.g.length === 1 && this._s.o.onCompleted();\n\t};\n\n\tfunction SwitchFirstObserver(state) {\n\t  this._s = state;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SwitchFirstObserver, AbstractObserver);\n\n\tSwitchFirstObserver.prototype.next = function (x) {\n\t  if (!this._s.hasCurrent) {\n\t    this._s.hasCurrent = true;\n\t    isPromise(x) && (x = fromPromise(x));\n\t    var inner = new SingleAssignmentDisposable();\n\t    this._s.g.add(inner);\n\t    inner.setDisposable(x.subscribe(new InnerObserver(this._s, inner)));\n\t  }\n\t};\n\n\tSwitchFirstObserver.prototype.error = function (e) {\n\t  this._s.o.onError(e);\n\t};\n\n\tSwitchFirstObserver.prototype.completed = function () {\n\t  this._s.isStopped = true;\n\t  !this._s.hasCurrent && this._s.g.length === 1 && this._s.o.onCompleted();\n\t};\n\n\tfunction SwitchFirstObservable(source) {\n\t  this.source = source;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(SwitchFirstObservable, ObservableBase);\n\n\tSwitchFirstObservable.prototype.subscribeCore = function (o) {\n\t  var m = new SingleAssignmentDisposable(),\n\t      g = new CompositeDisposable(),\n\t      state = {\n\t    hasCurrent: false,\n\t    isStopped: false,\n\t    o: o,\n\t    g: g\n\t  };\n\n\t  g.add(m);\n\t  m.setDisposable(this.source.subscribe(new SwitchFirstObserver(state)));\n\t  return g;\n\t};\n\n\t/**\n\t * Performs a exclusive waiting for the first to finish before subscribing to another observable.\n\t * Observables that come in between subscriptions will be dropped on the floor.\n\t * @returns {Observable} A exclusive observable with only the results that happen when subscribed.\n\t */\n\tmodule.exports = function switchFirst(source) {\n\t  return new SwitchFirstObservable(source);\n\t};\n\n/***/ },\n/* 185 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar FlatMapObservable = __webpack_require__(146);\n\tvar switchLatest = __webpack_require__(186);\n\n\tmodule.exports = function flatMapLatest(source, selector, resultSelector, thisArg) {\n\t  return switchLatest(new FlatMapObservable(source, selector, resultSelector, thisArg));\n\t};\n\n/***/ },\n/* 186 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar SerialDisposable = __webpack_require__(44);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction InnerObserver(p, id) {\n\t  this._p = p;\n\t  this._id = id;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(InnerObserver, AbstractObserver);\n\n\tInnerObserver.prototype.next = function (x) {\n\t  this._p._latest === this._id && this._p._o.onNext(x);\n\t};\n\tInnerObserver.prototype.error = function (e) {\n\t  this._p._latest === this._id && this._p._o.onError(e);\n\t};\n\tInnerObserver.prototype.completed = function () {\n\t  if (this._p._latest === this._id) {\n\t    this._p._hasLatest = false;\n\t    this._p._stopped && this._p._o.onCompleted();\n\t  }\n\t};\n\n\tfunction SwitchObserver(o, inner) {\n\t  this._o = o;\n\t  this._inner = inner;\n\t  this._stopped = false;\n\t  this._latest = 0;\n\t  this._hasLatest = false;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SwitchObserver, AbstractObserver);\n\n\tSwitchObserver.prototype.next = function (innerSource) {\n\t  var d = new SingleAssignmentDisposable(),\n\t      id = ++this._latest;\n\t  this._hasLatest = true;\n\t  this._inner.setDisposable(d);\n\t  isPromise(innerSource) && (innerSource = fromPromise(innerSource));\n\t  d.setDisposable(innerSource.subscribe(new InnerObserver(this, id)));\n\t};\n\tSwitchObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tSwitchObserver.prototype.completed = function () {\n\t  this._stopped = true;!this._hasLatest && this._o.onCompleted();\n\t};\n\n\tfunction SwitchObservable(source) {\n\t  this.source = source;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(SwitchObservable, ObservableBase);\n\n\tSwitchObservable.prototype.subscribeCore = function (o) {\n\t  var inner = new SerialDisposable(),\n\t      s = this.source.subscribe(new SwitchObserver(o, inner));\n\t  return new BinaryDisposable(s, inner);\n\t};\n\n\t/**\n\t* Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n\t* @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n\t*/\n\tmodule.exports = function switch_(source) {\n\t  return new SwitchObservable(source);\n\t};\n\n/***/ },\n/* 187 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar FlatMapObservable = __webpack_require__(146);\n\tvar mergeConcat = __webpack_require__(163);\n\n\tmodule.exports = function flatMapLatest(source, limit, selector, resultSelector, thisArg) {\n\t  return mergeConcat(new FlatMapObservable(source, selector, resultSelector, thisArg), limit);\n\t};\n\n/***/ },\n/* 188 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar noop = __webpack_require__(3);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction IgnoreElementsObserver(o) {\n\t  this._o = o;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(IgnoreElementsObserver, AbstractObserver);\n\n\tIgnoreElementsObserver.prototype.next = noop;\n\tIgnoreElementsObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tIgnoreElementsObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction IgnoreElementsObservable(source) {\n\t  this.source = source;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(IgnoreElementsObservable, ObservableBase);\n\n\tIgnoreElementsObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new IgnoreElementsObserver(o));\n\t};\n\n\t/**\n\t *  Ignores all elements in an observable sequence leaving only the termination messages.\n\t * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n\t */\n\tmodule.exports = function ignoreElements(source) {\n\t  return new IgnoreElementsObservable(source);\n\t};\n\n/***/ },\n/* 189 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Disposable = __webpack_require__(13);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction IncludesObserver(o, elem, n) {\n\t  this._o = o;\n\t  this._elem = elem;\n\t  this._n = n;\n\t  this._i = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(IncludesObserver, AbstractObserver);\n\n\tfunction comparer(a, b) {\n\t  return a === 0 && b === 0 || a === b || isNaN(a) && isNaN(b);\n\t}\n\n\tIncludesObserver.prototype.next = function (x) {\n\t  if (this._i++ >= this._n && comparer(x, this._elem)) {\n\t    this._o.onNext(true);\n\t    this._o.onCompleted();\n\t  }\n\t};\n\tIncludesObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tIncludesObserver.prototype.completed = function () {\n\t  this._o.onNext(false);this._o.onCompleted();\n\t};\n\n\tfunction IncludesObservable(source, elem, idx) {\n\t  var n = +idx || 0;\n\t  Math.abs(n) === Infinity && (n = 0);\n\n\t  this.source = source;\n\t  this._elem = elem;\n\t  this._n = n;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(IncludesObservable, ObservableBase);\n\n\tIncludesObservable.prototype.subscribeCore = function (o) {\n\t  if (this._n < 0) {\n\t    o.onNext(false);\n\t    o.onCompleted();\n\t    return Disposable.empty;\n\t  }\n\n\t  return this.source.subscribe(new IncludesObserver(o, this._elem, this._n));\n\t};\n\n\tmodule.exports = function includes(source, searchElement, fromIndex) {\n\t  return new IncludesObservable(source, searchElement, fromIndex);\n\t};\n\n/***/ },\n/* 190 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Disposable = __webpack_require__(13);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction IndexOfObserver(o, e, n) {\n\t  this._o = o;\n\t  this._e = e;\n\t  this._n = n;\n\t  this._i = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(IndexOfObserver, AbstractObserver);\n\n\tIndexOfObserver.prototype.next = function (x) {\n\t  if (this._i >= this._n && x === this._e) {\n\t    this._o.onNext(this._i);\n\t    this._o.onCompleted();\n\t  }\n\t  this._i++;\n\t};\n\tIndexOfObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tIndexOfObserver.prototype.completed = function () {\n\t  this._o.onNext(-1);this._o.onCompleted();\n\t};\n\n\tfunction IndexOfObservable(source, e, n) {\n\t  this.source = source;\n\t  this._e = e;\n\t  this._n = n;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(IndexOfObservable, ObservableBase);\n\n\tIndexOfObservable.prototype.subscribeCore = function (o) {\n\t  if (this._n < 0) {\n\t    o.onNext(-1);\n\t    o.onCompleted();\n\t    return Disposable.empty;\n\t  }\n\n\t  return this.source.subscribe(new IndexOfObserver(o, this._e, this._n));\n\t};\n\n\tmodule.exports = function indexOf(source, searchElement, fromIndex) {\n\t  var n = +fromIndex || 0;\n\t  Math.abs(n) === Infinity && (n = 0);\n\t  return new IndexOfObservable(source, searchElement, n);\n\t};\n\n/***/ },\n/* 191 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction IsEmptyObserver(o) {\n\t  this._o = o;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(IsEmptyObserver, AbstractObserver);\n\n\tIsEmptyObserver.prototype.next = function () {\n\t  this._o.onNext(false);\n\t  this._o.onCompleted();\n\t};\n\tIsEmptyObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tIsEmptyObserver.prototype.completed = function () {\n\t  this._o.onNext(true);\n\t  this._o.onCompleted();\n\t};\n\n\tfunction IsEmptyObservable(source) {\n\t  this.source = source;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(IsEmptyObservable, ObservableBase);\n\n\tIsEmptyObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new IsEmptyObserver(o));\n\t};\n\n\tmodule.exports = function isEmpty(source) {\n\t  return new IsEmptyObservable(source);\n\t};\n\n/***/ },\n/* 192 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n\tvar AnonymousObservable = __webpack_require__(36); // TODO: Get rid of\n\tvar take = __webpack_require__(153);\n\tvar CompositeDisposable = __webpack_require__(14);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar noop = __webpack_require__(3);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\t__webpack_require__(80);\n\n\tmodule.exports = function join(left, right, leftDurationSelector, rightDurationSelector, resultSelector) {\n\t  return new AnonymousObservable(function (o) {\n\t    var group = new CompositeDisposable();\n\t    var leftDone = false,\n\t        rightDone = false;\n\t    var leftId = 0,\n\t        rightId = 0;\n\t    var leftMap = new global.Map(),\n\t        rightMap = new global.Map();\n\t    var handleError = function (e) {\n\t      o.onError(e);\n\t    };\n\n\t    group.add(left.subscribe(function (value) {\n\t      var id = leftId++,\n\t          md = new SingleAssignmentDisposable();\n\n\t      leftMap.set(id, value);\n\t      group.add(md);\n\n\t      var duration = tryCatch(leftDurationSelector)(value);\n\t      if (duration === errorObj) {\n\t        return o.onError(duration.e);\n\t      }\n\n\t      md.setDisposable(take(duration, 1).subscribe(noop, handleError, function () {\n\t        leftMap['delete'](id) && leftMap.size === 0 && leftDone && o.onCompleted();\n\t        group.remove(md);\n\t      }));\n\n\t      rightMap.forEach(function (v) {\n\t        var result = tryCatch(resultSelector)(value, v);\n\t        if (result === errorObj) {\n\t          return o.onError(result.e);\n\t        }\n\t        o.onNext(result);\n\t      });\n\t    }, handleError, function () {\n\t      leftDone = true;\n\t      (rightDone || leftMap.size === 0) && o.onCompleted();\n\t    }));\n\n\t    group.add(right.subscribe(function (value) {\n\t      var id = rightId++,\n\t          md = new SingleAssignmentDisposable();\n\n\t      rightMap.set(id, value);\n\t      group.add(md);\n\n\t      var duration = tryCatch(rightDurationSelector)(value);\n\t      if (duration === errorObj) {\n\t        return o.onError(duration.e);\n\t      }\n\n\t      md.setDisposable(take(duration, 1).subscribe(noop, handleError, function () {\n\t        rightMap['delete'](id) && rightMap.size === 0 && rightDone && o.onCompleted();\n\t        group.remove(md);\n\t      }));\n\n\t      leftMap.forEach(function (v) {\n\t        var result = tryCatch(resultSelector)(v, value);\n\t        if (result === errorObj) {\n\t          return o.onError(result.e);\n\t        }\n\t        o.onNext(result);\n\t      });\n\t    }, handleError, function () {\n\t      rightDone = true;\n\t      (leftDone || rightMap.size === 0) && o.onCompleted();\n\t    }));\n\t    return group;\n\t  }, left);\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 193 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar EmptyError = __webpack_require__(7).EmptyError;\n\tvar bindCallback = __webpack_require__(52);\n\tvar isFunction = __webpack_require__(9);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction LastObserver(o, obj, s) {\n\t  this._o = o;\n\t  this._obj = obj;\n\t  this._s = s;\n\t  this._i = 0;\n\t  this._hv = false;\n\t  this._v = null;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(LastObserver, AbstractObserver);\n\n\tLastObserver.prototype.next = function (x) {\n\t  var shouldYield = false;\n\t  if (this._obj.predicate) {\n\t    var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n\t    if (res === errorObj) {\n\t      return this._o.onError(res.e);\n\t    }\n\t    Boolean(res) && (shouldYield = true);\n\t  } else if (!this._obj.predicate) {\n\t    shouldYield = true;\n\t  }\n\t  if (shouldYield) {\n\t    this._hv = true;\n\t    this._v = x;\n\t  }\n\t};\n\tLastObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tLastObserver.prototype.completed = function () {\n\t  if (this._hv) {\n\t    this._o.onNext(this._v);\n\t    this._o.onCompleted();\n\t  } else if (this._obj.defaultValue === undefined) {\n\t    this._o.onError(new EmptyError());\n\t  } else {\n\t    this._o.onNext(this._obj.defaultValue);\n\t    this._o.onCompleted();\n\t  }\n\t};\n\n\tfunction LastObservable(source, obj) {\n\t  this.source = source;\n\t  this._obj = obj;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(LastObservable, ObservableBase);\n\n\tLastObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new LastObserver(o, this._obj, this.source));\n\t};\n\n\tmodule.exports = function last() {\n\t  var obj = {},\n\t      source = arguments[0];\n\t  if (typeof arguments[1] === 'object') {\n\t    obj = arguments[1];\n\t  } else {\n\t    obj = {\n\t      predicate: arguments[1],\n\t      thisArg: arguments[2],\n\t      defaultValue: arguments[3]\n\t    };\n\t  }\n\t  if (isFunction(obj.predicate)) {\n\t    var fn = obj.predicate;\n\t    obj.predicate = bindCallback(fn, obj.thisArg, 3);\n\t  }\n\t  return new LastObservable(source, obj);\n\t};\n\n/***/ },\n/* 194 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Disposable = __webpack_require__(13);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction LastIndexOfObserver(o, e, n) {\n\t  this._o = o;\n\t  this._e = e;\n\t  this._n = n;\n\t  this._v = 0;\n\t  this._hv = false;\n\t  this._i = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(LastIndexOfObserver, AbstractObserver);\n\n\tLastIndexOfObserver.prototype.next = function (x) {\n\t  if (this._i >= this._n && x === this._e) {\n\t    this._hv = true;\n\t    this._v = this._i;\n\t  }\n\t  this._i++;\n\t};\n\tLastIndexOfObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tLastIndexOfObserver.prototype.completed = function () {\n\t  if (this._hv) {\n\t    this._o.onNext(this._v);\n\t  } else {\n\t    this._o.onNext(-1);\n\t  }\n\t  this._o.onCompleted();\n\t};\n\n\tfunction LastIndexOfObservable(source, e, n) {\n\t  this.source = source;\n\t  this._e = e;\n\t  this._n = n;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(LastIndexOfObservable, ObservableBase);\n\n\tLastIndexOfObservable.prototype.subscribeCore = function (o) {\n\t  if (this._n < 0) {\n\t    o.onNext(-1);\n\t    o.onCompleted();\n\t    return Disposable.empty;\n\t  }\n\n\t  return this.source.subscribe(new LastIndexOfObserver(o, this._e, this._n));\n\t};\n\n\tmodule.exports = function lastIndexOf(source, searchElement, fromIndex) {\n\t  var n = +fromIndex || 0;\n\t  Math.abs(n) === Infinity && (n = 0);\n\t  return new LastIndexOfObservable(source, searchElement, n);\n\t};\n\n/***/ },\n/* 195 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar bindCallback = __webpack_require__(52);\n\tvar isFunction = __webpack_require__(9);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction MapObserver(o, selector, source) {\n\t  this._o = o;\n\t  this._fn = selector;\n\t  this._s = source;\n\t  this._i = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(MapObserver, AbstractObserver);\n\n\tMapObserver.prototype.next = function (x) {\n\t  var result = tryCatch(this._fn)(x, this._i++, this._s);\n\t  if (result === errorObj) {\n\t    return this._o.onError(result.e);\n\t  }\n\t  this._o.onNext(result);\n\t};\n\n\tMapObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tMapObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction MapObservable(source, fn, thisArg) {\n\t  this.source = source;\n\t  this._fn = bindCallback(fn, thisArg, 3);\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(MapObservable, ObservableBase);\n\n\tfunction innerMap(fn, self) {\n\t  return function (x, i, o) {\n\t    return fn.call(this, self._fn(x, i, o), i, o);\n\t  };\n\t}\n\n\tMapObservable.prototype.internalMap = function (fn, thisArg) {\n\t  return new MapObservable(this.source, innerMap(fn, this), thisArg);\n\t};\n\n\tMapObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new MapObserver(o, this._fn, this));\n\t};\n\n\tmodule.exports = function map(source, fn, thisArg) {\n\t  var thisFn = isFunction(fn) ? fn : function () {\n\t    return fn;\n\t  };\n\t  return source instanceof MapObservable ? source.internalMap(thisFn, thisArg) : new MapObservable(source, thisFn, thisArg);\n\t};\n\n/***/ },\n/* 196 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar maxBy = __webpack_require__(197);\n\tvar firstOnly = __webpack_require__(199);\n\tvar identity = __webpack_require__(46);\n\n\tmodule.exports = function max(source, comparer) {\n\t  return maxBy(source, identity, comparer).map(firstOnly);\n\t};\n\n/***/ },\n/* 197 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ExtremaByObservable = __webpack_require__(198);\n\n\tfunction defaultComparer(x, y) {\n\t  return x > y ? 1 : y > x ? -1 : 0;\n\t}\n\n\tmodule.exports = function maxBy(source, keySelector, comparer) {\n\t  comparer || (comparer = defaultComparer);\n\t  return new ExtremaByObservable(source, keySelector, comparer);\n\t};\n\n/***/ },\n/* 198 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction ExtremaByObserver(o, k, c) {\n\t  this._o = o;\n\t  this._k = k;\n\t  this._c = c;\n\t  this._v = null;\n\t  this._hv = false;\n\t  this._l = [];\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(ExtremaByObserver, AbstractObserver);\n\n\tExtremaByObserver.prototype.next = function (x) {\n\t  var key = tryCatch(this._k)(x);\n\t  if (key === errorObj) {\n\t    return this._o.onError(key.e);\n\t  }\n\t  var comparison = 0;\n\t  if (!this._hv) {\n\t    this._hv = true;\n\t    this._v = key;\n\t  } else {\n\t    comparison = tryCatch(this._c)(key, this._v);\n\t    if (comparison === errorObj) {\n\t      return this._o.onError(comparison.e);\n\t    }\n\t  }\n\t  if (comparison > 0) {\n\t    this._v = key;\n\t    this._l = [];\n\t  }\n\t  if (comparison >= 0) {\n\t    this._l.push(x);\n\t  }\n\t};\n\n\tExtremaByObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\n\tExtremaByObserver.prototype.completed = function () {\n\t  this._o.onNext(this._l);\n\t  this._o.onCompleted();\n\t};\n\n\tfunction ExtremaByObservable(source, k, c) {\n\t  this.source = source;\n\t  this._k = k;\n\t  this._c = c;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(ExtremaByObservable, ObservableBase);\n\n\tExtremaByObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new ExtremaByObserver(o, this._k, this._c));\n\t};\n\n\tmodule.exports = ExtremaByObservable;\n\n/***/ },\n/* 199 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar EmptyError = __webpack_require__(7).EmptyError;\n\n\tmodule.exports = function firstOnly(x) {\n\t  if (x.length === 0) {\n\t    throw new EmptyError();\n\t  }\n\t  return x[0];\n\t};\n\n/***/ },\n/* 200 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar minBy = __webpack_require__(201);\n\tvar firstOnly = __webpack_require__(199);\n\tvar identity = __webpack_require__(46);\n\n\tmodule.exports = function min(source, comparer) {\n\t  return minBy(source, identity, comparer).map(firstOnly);\n\t};\n\n/***/ },\n/* 201 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ExtremaByObservable = __webpack_require__(198);\n\n\tfunction defaultComparer(x, y) {\n\t  return x > y ? 1 : y > x ? -1 : 0;\n\t}\n\n\tfunction minByFn(comparer) {\n\t  return function (x, y) {\n\t    return comparer(x, y) * -1;\n\t  };\n\t}\n\n\tmodule.exports = function minBy(source, keySelector, comparer) {\n\t  comparer || (comparer = defaultComparer);\n\t  return new ExtremaByObservable(source, keySelector, minByFn(comparer));\n\t};\n\n/***/ },\n/* 202 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar ObserveOnObserver = __webpack_require__(203);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction ObserveOnObservable(source, s) {\n\t  this.source = source;\n\t  this._s = s;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(ObserveOnObservable, ObservableBase);\n\n\tObserveOnObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new ObserveOnObserver(this._s, o));\n\t};\n\n\tmodule.exports = function observeOn(source, scheduler) {\n\t  return new ObserveOnObservable(source, scheduler);\n\t};\n\n/***/ },\n/* 203 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ScheduledObserver = __webpack_require__(204);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction ObserveOnObserver(scheduler, observer, cancel) {\n\t  ScheduledObserver.call(this, scheduler, observer);\n\t  this._cancel = cancel;\n\t}\n\n\tinherits(ObserveOnObserver, ScheduledObserver);\n\n\tObserveOnObserver.prototype.next = function (value) {\n\t  ScheduledObserver.prototype.next.call(this, value);\n\t  this.ensureActive();\n\t};\n\n\tObserveOnObserver.prototype.error = function (e) {\n\t  ScheduledObserver.prototype.error.call(this, e);\n\t  this.ensureActive();\n\t};\n\n\tObserveOnObserver.prototype.completed = function () {\n\t  ScheduledObserver.prototype.completed.call(this);\n\t  this.ensureActive();\n\t};\n\n\tObserveOnObserver.prototype.dispose = function () {\n\t  ScheduledObserver.prototype.dispose.call(this);\n\t  this._cancel && this._cancel.dispose();\n\t  this._cancel = null;\n\t};\n\n\tmodule.exports = ObserveOnObserver;\n\n/***/ },\n/* 204 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar SerialDisposable = __webpack_require__(44);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj,\n\t    thrower = tryCatchUtils.thrower;\n\n\tfunction ScheduledObserver(scheduler, observer) {\n\t  AbstractObserver.call(this);\n\t  this.scheduler = scheduler;\n\t  this.observer = observer;\n\t  this.isAcquired = false;\n\t  this.hasFaulted = false;\n\t  this.queue = [];\n\t  this.disposable = new SerialDisposable();\n\t}\n\n\tinherits(ScheduledObserver, AbstractObserver);\n\n\tfunction enqueueNext(observer, x) {\n\t  return function () {\n\t    observer.onNext(x);\n\t  };\n\t}\n\tfunction enqueueError(observer, e) {\n\t  return function () {\n\t    observer.onError(e);\n\t  };\n\t}\n\tfunction enqueueCompleted(observer) {\n\t  return function () {\n\t    observer.onCompleted();\n\t  };\n\t}\n\n\tScheduledObserver.prototype.next = function (x) {\n\t  this.queue.push(enqueueNext(this.observer, x));\n\t};\n\n\tScheduledObserver.prototype.error = function (e) {\n\t  this.queue.push(enqueueError(this.observer, e));\n\t};\n\n\tScheduledObserver.prototype.completed = function () {\n\t  this.queue.push(enqueueCompleted(this.observer));\n\t};\n\n\tfunction scheduleMethod(state, recurse) {\n\t  var work;\n\t  if (state.queue.length > 0) {\n\t    work = state.queue.shift();\n\t  } else {\n\t    state.isAcquired = false;\n\t    return;\n\t  }\n\t  var res = tryCatch(work)();\n\t  if (res === errorObj) {\n\t    state.queue = [];\n\t    state.hasFaulted = true;\n\t    return thrower(res.e);\n\t  }\n\t  recurse(state);\n\t}\n\n\tScheduledObserver.prototype.ensureActive = function () {\n\t  var isOwner = false;\n\t  if (!this.hasFaulted && this.queue.length > 0) {\n\t    isOwner = !this.isAcquired;\n\t    this.isAcquired = true;\n\t  }\n\t  isOwner && this.disposable.setDisposable(this.scheduler.scheduleRecursive(this, scheduleMethod));\n\t};\n\n\tScheduledObserver.prototype.dispose = function () {\n\t  AbstractObserver.prototype.dispose.call(this);\n\t  this.disposable.dispose();\n\t};\n\n\tmodule.exports = ScheduledObserver;\n\n/***/ },\n/* 205 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction PairwiseObserver(o) {\n\t  this._o = o;\n\t  this._p = null;\n\t  this._hp = false;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(PairwiseObserver, AbstractObserver);\n\n\tPairwiseObserver.prototype.next = function (x) {\n\t  if (this._hp) {\n\t    this._o.onNext([this._p, x]);\n\t  } else {\n\t    this._hp = true;\n\t  }\n\t  this._p = x;\n\t};\n\tPairwiseObserver.prototype.error = function (err) {\n\t  this._o.onError(err);\n\t};\n\tPairwiseObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction PairwiseObservable(source) {\n\t  this.source = source;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(PairwiseObservable, ObservableBase);\n\n\tPairwiseObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new PairwiseObserver(o));\n\t};\n\n\tmodule.exports = function pairwise(source) {\n\t  return new PairwiseObservable(source);\n\t};\n\n/***/ },\n/* 206 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar filter = __webpack_require__(155);\n\tvar bindCallback = __webpack_require__(52);\n\n\tmodule.exports = function partition(source, predicate, thisArg) {\n\t  var fn = bindCallback(predicate, thisArg, 3);\n\t  return [filter(source, predicate, thisArg), filter(source, function (x, i, o) {\n\t    return !fn(x, i, o);\n\t  })];\n\t};\n\n/***/ },\n/* 207 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Observable = __webpack_require__(8);\n\tvar distinctUntilChanged = __webpack_require__(175);\n\tvar merge = __webpack_require__(65);\n\tvar publish = __webpack_require__(56);\n\tvar startWith = __webpack_require__(208);\n\tvar Subject = __webpack_require__(57);\n\tvar Disposable = __webpack_require__(13);\n\tvar NAryDisposable = __webpack_require__(43);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction PausableObservable(source, pauser) {\n\t  this.source = source;\n\t  this.controller = new Subject();\n\n\t  if (pauser && pauser.subscribe) {\n\t    this.pauser = merge(this.controller, pauser);\n\t  } else {\n\t    this.pauser = this.controller;\n\t  }\n\n\t  Observable.call(this);\n\t}\n\n\tinherits(PausableObservable, Observable);\n\n\tPausableObservable.prototype._subscribe = function (o) {\n\t  var conn = publish(this.source),\n\t      subscription = conn.subscribe(o),\n\t      connection = Disposable.empty;\n\n\t  var pausable = startWith(distinctUntilChanged(this.pauser), !this.paused).subscribe(function (b) {\n\t    if (b) {\n\t      connection = conn.connect();\n\t    } else {\n\t      connection.dispose();\n\t      connection = Disposable.empty;\n\t    }\n\t  });\n\n\t  return new NAryDisposable([subscription, connection, pausable]);\n\t};\n\n\tPausableObservable.prototype.pause = function () {\n\t  this.controller.onNext(false);\n\t};\n\n\tPausableObservable.prototype.resume = function () {\n\t  this.controller.onNext(true);\n\t};\n\n\tmodule.exports = function pausable(source, pauser) {\n\t  return new PausableObservable(source, pauser);\n\t};\n\n/***/ },\n/* 208 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar concat = __webpack_require__(47);\n\tvar fromArray = __webpack_require__(53);\n\tvar Scheduler = __webpack_require__(12);\n\n\tmodule.exports = function startWith() {\n\t  var source = arguments[0],\n\t      scheduler,\n\t      start = 1;\n\t  if (Scheduler.isScheduler(arguments[1])) {\n\t    scheduler = arguments[1];\n\t    start = 2;\n\t  } else {\n\t    scheduler = Scheduler.immediate;\n\t  }\n\t  for (var args = [], i = start, len = arguments.length; i < len; i++) {\n\t    args.push(arguments[i]);\n\t  }\n\t  return concat(fromArray(args, scheduler), source);\n\t};\n\n/***/ },\n/* 209 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Observable = __webpack_require__(8);\n\tvar ObservableBase = __webpack_require__(11);\n\tvar distinctUntilChanged = __webpack_require__(175);\n\tvar merge = __webpack_require__(65);\n\tvar startWith = __webpack_require__(208);\n\tvar Subject = __webpack_require__(57);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar identity = __webpack_require__(46);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction next(state, x, i) {\n\t  state.values[i] = x;\n\t  state.hasValue[i] = true;\n\t  if (state.hasValueAll || (state.hasValueAll = state.hasValue.every(identity))) {\n\t    if (state.err) {\n\t      return state.o.onError(state.err);\n\t    }\n\t    var res = tryCatch(state.fn).apply(null, state.values);\n\t    if (res === errorObj) {\n\t      return state.o.onError(res.e);\n\t    }\n\t    state.o.onNext(res);\n\t  }\n\t  state.isDone && state.values[1] && state.o.onCompleted();\n\t}\n\n\tfunction SourceObserver(state) {\n\t  this._s = state;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SourceObserver, AbstractObserver);\n\n\tSourceObserver.prototype.next = function (x) {\n\t  next(this._s, x, 0);\n\t};\n\tSourceObserver.prototype.error = function (e) {\n\t  if (this._s.values[1]) {\n\t    this._s.o.onError(e);\n\t  } else {\n\t    this._s.err = e;\n\t  }\n\t};\n\tSourceObserver.prototype.completed = function () {\n\t  this._s.isDone = true;\n\t  this._s.values[1] && this._s.o.onCompleted();\n\t};\n\n\tfunction SubjectObserver(state) {\n\t  this._s = state;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SubjectObserver, AbstractObserver);\n\n\tSubjectObserver.prototype.next = function (x) {\n\t  next(this._s, x, 1);\n\t};\n\tSubjectObserver.prototype.error = function (e) {\n\t  this._s.o.onError(e);\n\t};\n\tSubjectObserver.prototype.completed = function () {\n\t  this._s.isDone = true;\n\t  next(this._s, true, 1);\n\t};\n\n\tfunction CombineLatestObservable(source, subject, fn) {\n\t  this.source = source;\n\t  this.subject = subject;\n\t  this.fn = fn;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(CombineLatestObservable, ObservableBase);\n\n\tCombineLatestObservable.prototype.subscribeCore = function (o) {\n\t  var state = {\n\t    hasValue: [false, false],\n\t    hasValueAll: false,\n\t    isDone: false,\n\t    values: new Array(2),\n\t    err: null,\n\t    o: o,\n\t    fn: this.fn\n\t  };\n\n\t  return new BinaryDisposable(this.source.subscribe(new SourceObserver(state)), this.subject.subscribe(new SubjectObserver(state)));\n\t};\n\n\tfunction combineLatestSource(source, subject, fn) {\n\t  return new CombineLatestObservable(source, subject, fn);\n\t}\n\n\tfunction PausableBufferedObserver(o) {\n\t  this._o = o;\n\t  this._q = [];\n\t  this._previousShouldFire = null;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(PausableBufferedObserver, AbstractObserver);\n\n\tPausableBufferedObserver.prototype.drainQueue = function () {\n\t  while (this._q.length > 0) {\n\t    this._o.onNext(this._q.shift());\n\t  }\n\t};\n\n\tPausableBufferedObserver.prototype.next = function (x) {\n\t  if (this._previousShouldFire !== null && x.shouldFire !== this._previousShouldFire) {\n\t    this._previousShouldFire = x.shouldFire;\n\t    // change in shouldFire\n\t    if (x.shouldFire) {\n\t      this.drainQueue();\n\t    }\n\t  } else {\n\t    this._previousShouldFire = x.shouldFire;\n\t    // new data\n\t    if (x.shouldFire) {\n\t      this._o.onNext(x.data);\n\t    } else {\n\t      this._q.push(x.data);\n\t    }\n\t  }\n\t};\n\n\tPausableBufferedObserver.prototype.error = function (e) {\n\t  this.drainQueue();\n\t  this._o.onError(e);\n\t};\n\n\tPausableBufferedObserver.prototype.completed = function () {\n\t  this.drainQueue();\n\t  this._o.onCompleted();\n\t};\n\n\tfunction PausableBufferedObservable(source, pauser) {\n\t  this.source = source;\n\t  this.controller = new Subject();\n\t  this.paused = true;\n\n\t  if (pauser && pauser.subscribe) {\n\t    this.pauser = merge(this.controller, pauser);\n\t  } else {\n\t    this.pauser = this.controller;\n\t  }\n\n\t  Observable.call(this);\n\t}\n\n\tinherits(PausableBufferedObservable, Observable);\n\n\tfunction selectorFn(data, shouldFire) {\n\t  return { data: data, shouldFire: shouldFire };\n\t}\n\n\tPausableBufferedObservable.prototype._subscribe = function (o) {\n\n\t  return combineLatestSource(this.source, distinctUntilChanged(startWith(this.pauser, !this.paused)), selectorFn).subscribe(new PausableBufferedObserver(o));\n\t};\n\n\tPausableBufferedObservable.prototype.pause = function () {\n\t  this.controller.onNext(false);\n\t  this.paused = true;\n\t};\n\n\tPausableBufferedObservable.prototype.resume = function () {\n\t  this.controller.onNext(true);\n\t  this.paused = false;\n\t};\n\n\tmodule.exports = function pausableBuffered(source, pauser) {\n\t  return new PausableBufferedObservable(source, pauser);\n\t};\n\n/***/ },\n/* 210 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar map = __webpack_require__(195);\n\n\tfunction plucker(args, len) {\n\t  return function mapper(x) {\n\t    var currentProp = x;\n\t    for (var i = 0; i < len; i++) {\n\t      var p = currentProp[args[i]];\n\t      if (typeof p !== 'undefined') {\n\t        currentProp = p;\n\t      } else {\n\t        return undefined;\n\t      }\n\t    }\n\t    return currentProp;\n\t  };\n\t}\n\n\t/**\n\t * Retrieves the value of a specified nested property from all elements in\n\t * the Observable sequence.\n\t * @param {Arguments} arguments The nested properties to pluck.\n\t * @returns {Observable} Returns a new Observable sequence of property values.\n\t */\n\tmodule.exports = function pluck() {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  if (len === 0) {\n\t    throw new Error('List of properties cannot be empty.');\n\t  }\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  var pluckedArgs = args.slice(1);\n\t  return map(args[0], plucker(pluckedArgs, pluckedArgs.length));\n\t};\n\n/***/ },\n/* 211 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AsyncSubject = __webpack_require__(31);\n\tvar multicast = __webpack_require__(58);\n\tvar isFunction = __webpack_require__(9);\n\n\tmodule.exports = function publishLast(source, selector) {\n\t  return isFunction(selector) ? multicast(source, function () {\n\t    return new AsyncSubject();\n\t  }, selector) : multicast(source, new AsyncSubject());\n\t};\n\n/***/ },\n/* 212 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar multicast = __webpack_require__(58);\n\tvar BehaviorSubject = __webpack_require__(213);\n\n\tfunction createBehaviorSubject(initialValue) {\n\t  return function fn() {\n\t    return new BehaviorSubject(initialValue);\n\t  };\n\t}\n\n\tmodule.exports = function publishValue() {\n\t  var source = arguments[0];\n\t  if (arguments.length === 3) {\n\t    return multicast(source, createBehaviorSubject(arguments[2]), arguments[1]);\n\t  } else if (arguments.length === 2) {\n\t    return multicast(source, new BehaviorSubject(arguments[1]));\n\t  } else {\n\t    throw new Error('Invalid arguments');\n\t  }\n\t};\n\n/***/ },\n/* 213 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Observable = __webpack_require__(8);\n\tvar Observer = __webpack_require__(1);\n\tvar Disposable = __webpack_require__(13);\n\tvar InnerSubscription = __webpack_require__(32);\n\tvar addProperties = __webpack_require__(33);\n\tvar cloneArray = __webpack_require__(34);\n\tvar thrower = __webpack_require__(20).thrower;\n\tvar inherits = __webpack_require__(6);\n\n\t/**\n\t*  Represents a value that changes over time.\n\t*  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n\t*/\n\tfunction BehaviorSubject(value) {\n\t  this.value = value;\n\t  this.observers = [];\n\t  this.isDisposed = false;\n\t  this.isStopped = false;\n\t  this.hasError = false;\n\t  Observable.call(this);\n\t}\n\n\tinherits(BehaviorSubject, Observable);\n\n\taddProperties(BehaviorSubject.prototype, Observer.prototype, {\n\t  _subscribe: function (o) {\n\t    Disposable.checkDisposed(this);\n\t    if (!this.isStopped) {\n\t      this.observers.push(o);\n\t      o.onNext(this.value);\n\t      return new InnerSubscription(this, o);\n\t    }\n\t    if (this.hasError) {\n\t      o.onError(this.error);\n\t    } else {\n\t      o.onCompleted();\n\t    }\n\t    return Disposable.empty;\n\t  },\n\t  /**\n\t   * Gets the current value or throws an exception.\n\t   * Value is frozen after onCompleted is called.\n\t   * After onError is called always throws the specified exception.\n\t   * An exception is always thrown after dispose is called.\n\t   * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n\t   */\n\t  getValue: function () {\n\t    Disposable.checkDisposed(this);\n\t    if (this.hasError) {\n\t      thrower(this.error);\n\t    }\n\t    return this.value;\n\t  },\n\t  /**\n\t   * Indicates whether the subject has observers subscribed to it.\n\t   * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n\t   */\n\t  hasObservers: function () {\n\t    Disposable.checkDisposed(this);\n\t    return this.observers.length > 0;\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the end of the sequence.\n\t   */\n\t  onCompleted: function () {\n\t    Disposable.checkDisposed(this);\n\t    if (this.isStopped) {\n\t      return;\n\t    }\n\t    this.isStopped = true;\n\t    for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t      os[i].onCompleted();\n\t    }\n\n\t    this.observers.length = 0;\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the exception.\n\t   * @param {Mixed} error The exception to send to all observers.\n\t   */\n\t  onError: function (error) {\n\t    Disposable.checkDisposed(this);\n\t    if (this.isStopped) {\n\t      return;\n\t    }\n\t    this.isStopped = true;\n\t    this.hasError = true;\n\t    this.error = error;\n\n\t    for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t      os[i].onError(error);\n\t    }\n\n\t    this.observers.length = 0;\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n\t   * @param {Mixed} value The value to send to all observers.\n\t   */\n\t  onNext: function (value) {\n\t    Disposable.checkDisposed(this);\n\t    if (this.isStopped) {\n\t      return;\n\t    }\n\t    this.value = value;\n\t    for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t      os[i].onNext(value);\n\t    }\n\t  },\n\t  /**\n\t   * Unsubscribe all observers and release resources.\n\t   */\n\t  dispose: function () {\n\t    this.isDisposed = true;\n\t    this.observers = null;\n\t    this.value = null;\n\t    this.error = null;\n\t  }\n\t});\n\n\tmodule.exports = BehaviorSubject;\n\n/***/ },\n/* 214 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar EmptyError = __webpack_require__(7).EmptyError;\n\n\tfunction ReduceObserver(o, parent) {\n\t  this._o = o;\n\t  this._p = parent;\n\t  this._fn = parent.accumulator;\n\t  this._hs = parent.hasSeed;\n\t  this._s = parent.seed;\n\t  this._ha = false;\n\t  this._a = null;\n\t  this._hv = false;\n\t  this._i = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(ReduceObserver, AbstractObserver);\n\n\tReduceObserver.prototype.next = function (x) {\n\t  !this._hv && (this._hv = true);\n\t  if (this._ha) {\n\t    this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n\t  } else {\n\t    this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n\t    this._ha = true;\n\t  }\n\t  if (this._a === errorObj) {\n\t    return this._o.onError(this._a.e);\n\t  }\n\t  this._i++;\n\t};\n\n\tReduceObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\n\tReduceObserver.prototype.completed = function () {\n\t  this._hv && this._o.onNext(this._a);\n\t  !this._hv && this._hs && this._o.onNext(this._s);\n\t  !this._hv && !this._hs && this._o.onError(new EmptyError());\n\t  this._o.onCompleted();\n\t};\n\n\tfunction ReduceObservable(source, accumulator, hasSeed, seed) {\n\t  this.source = source;\n\t  this.accumulator = accumulator;\n\t  this.hasSeed = hasSeed;\n\t  this.seed = seed;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(ReduceObservable, ObservableBase);\n\n\tReduceObservable.prototype.subscribeCore = function (observer) {\n\t  return this.source.subscribe(new ReduceObserver(observer, this));\n\t};\n\n\t/**\n\t* Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n\t* For aggregation behavior with incremental intermediate results, see Observable.scan.\n\t* @param {Function} accumulator An accumulator function to be invoked on each element.\n\t* @param {Any} [seed] The initial accumulator value.\n\t* @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n\t*/\n\tmodule.exports = function reduce() {\n\t  var hasSeed = false,\n\t      seed,\n\t      source = arguments[0],\n\t      accumulator = arguments[1];\n\t  if (arguments.length === 3) {\n\t    hasSeed = true;\n\t    seed = arguments[2];\n\t  }\n\t  return new ReduceObservable(source, accumulator, hasSeed, seed);\n\t};\n\n/***/ },\n/* 215 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Scheduler = __webpack_require__(12);\n\tvar NAryDisposable = __webpack_require__(43);\n\tvar SerialDisposable = __webpack_require__(44);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar inherits = __webpack_require__(6);\n\n\tvar $iterator$ = '@@iterator';\n\n\tfunction repeatValue(value, count) {\n\t  count == null && (count = -1);\n\t  return {\n\t    '@@iterator': function () {\n\t      return {\n\t        remaining: count,\n\t        next: function () {\n\t          if (this.remaining === 0) {\n\t            return { done: true, value: undefined };\n\t          }\n\t          if (this.remaining > 0) {\n\t            this.remaining--;\n\t          }\n\t          return { done: false, value: value };\n\t        }\n\t      };\n\t    }\n\t  };\n\t}\n\n\tfunction createDisposable(state) {\n\t  return {\n\t    isDisposed: false,\n\t    dispose: function () {\n\t      if (!this.isDisposed) {\n\t        this.isDisposed = true;\n\t        state.isDisposed = true;\n\t      }\n\t    }\n\t  };\n\t}\n\n\tfunction ConcatObserver(state, recurse) {\n\t  this._state = state;\n\t  this._recurse = recurse;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(ConcatObserver, AbstractObserver);\n\n\tConcatObserver.prototype.next = function (x) {\n\t  this._state.o.onNext(x);\n\t};\n\tConcatObserver.prototype.error = function (e) {\n\t  this._state.o.onError(e);\n\t};\n\tConcatObserver.prototype.completed = function () {\n\t  this._recurse(this._state);\n\t};\n\n\tfunction ConcatObservable(sources) {\n\t  this.sources = sources;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(ConcatObservable, ObservableBase);\n\n\tfunction scheduleMethod(state, recurse) {\n\t  if (state.isDisposed) {\n\t    return;\n\t  }\n\t  var currentItem = state.e.next();\n\t  if (currentItem.done) {\n\t    return state.o.onCompleted();\n\t  }\n\n\t  // Check if promise\n\t  var currentValue = currentItem.value;\n\t  isPromise(currentValue) && (currentValue = fromPromise(currentValue));\n\n\t  var d = new SingleAssignmentDisposable();\n\t  state.subscription.setDisposable(d);\n\t  d.setDisposable(currentValue.subscribe(new ConcatObserver(state, recurse)));\n\t}\n\n\tConcatObservable.prototype.subscribeCore = function (o) {\n\t  var subscription = new SerialDisposable();\n\t  var state = {\n\t    isDisposed: false,\n\t    o: o,\n\t    subscription: subscription,\n\t    e: this.sources[$iterator$]()\n\t  };\n\n\t  var cancelable = Scheduler.queue.scheduleRecursive(state, scheduleMethod);\n\t  return new NAryDisposable([subscription, cancelable, createDisposable(state)]);\n\t};\n\n\tmodule.exports = function repeat(source, repeatCount) {\n\t  return new ConcatObservable(repeatValue(source, repeatCount));\n\t};\n\n/***/ },\n/* 216 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar Subject = __webpack_require__(57);\n\tvar Scheduler = __webpack_require__(12);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar NAryDisposable = __webpack_require__(43);\n\tvar SerialDisposable = __webpack_require__(44);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar inherits = __webpack_require__(6);\n\n\tvar $iterator$ = '@@iterator';\n\n\tfunction repeat(value) {\n\t  return {\n\t    '@@iterator': function () {\n\t      return {\n\t        next: function () {\n\t          return { done: false, value: value };\n\t        }\n\t      };\n\t    }\n\t  };\n\t}\n\n\tfunction createDisposable(state) {\n\t  return {\n\t    isDisposed: false,\n\t    dispose: function () {\n\t      if (!this.isDisposed) {\n\t        this.isDisposed = true;\n\t        state.isDisposed = true;\n\t      }\n\t    }\n\t  };\n\t}\n\n\tfunction RepeatWhenObservable(source, notifier) {\n\t  this.source = source;\n\t  this._notifier = notifier;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(RepeatWhenObservable, ObservableBase);\n\n\tRepeatWhenObservable.prototype.subscribeCore = function (o) {\n\t  var completions = new Subject(),\n\t      notifier = new Subject(),\n\t      handled = this._notifier(completions),\n\t      notificationDisposable = handled.subscribe(notifier);\n\n\t  var e = this.source[$iterator$]();\n\n\t  var state = { isDisposed: false },\n\t      lastError,\n\t      subscription = new SerialDisposable();\n\t  var cancelable = Scheduler.queue.scheduleRecursive(null, function (_, recurse) {\n\t    if (state.isDisposed) {\n\t      return;\n\t    }\n\t    var currentItem = e.next();\n\n\t    if (currentItem.done) {\n\t      if (lastError) {\n\t        o.onError(lastError);\n\t      } else {\n\t        o.onCompleted();\n\t      }\n\t      return;\n\t    }\n\n\t    // Check if promise\n\t    var currentValue = currentItem.value;\n\t    isPromise(currentValue) && (currentValue = fromPromise(currentValue));\n\n\t    var outer = new SingleAssignmentDisposable();\n\t    var inner = new SingleAssignmentDisposable();\n\t    subscription.setDisposable(new BinaryDisposable(inner, outer));\n\t    outer.setDisposable(currentValue.subscribe(function (x) {\n\t      o.onNext(x);\n\t    }, function (exn) {\n\t      o.onError(exn);\n\t    }, function () {\n\t      inner.setDisposable(notifier.subscribe(recurse, function (ex) {\n\t        o.onError(ex);\n\t      }, function () {\n\t        o.onCompleted();\n\t      }));\n\n\t      completions.onNext(null);\n\t      outer.dispose();\n\t    }));\n\t  });\n\n\t  return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n\t};\n\n\tmodule.exports = function repeatWhen(source, notifier) {\n\t  return new RepeatWhenObservable(repeat(source), notifier);\n\t};\n\n/***/ },\n/* 217 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar multicast = __webpack_require__(58);\n\tvar ReplaySubject = __webpack_require__(218);\n\tvar isFunction = __webpack_require__(9);\n\n\tmodule.exports = function replay(source, selector, bufferSize, windowSize, scheduler) {\n\t  return isFunction(selector) ? multicast(source, function () {\n\t    return new ReplaySubject(bufferSize, windowSize, scheduler);\n\t  }, selector) : multicast(source, new ReplaySubject(bufferSize, windowSize, scheduler));\n\t};\n\n/***/ },\n/* 218 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Disposable = __webpack_require__(13);\n\tvar Observable = __webpack_require__(8);\n\tvar Observer = __webpack_require__(1);\n\tvar ScheduledObserver = __webpack_require__(204);\n\tvar Scheduler = __webpack_require__(12);\n\tvar addProperties = __webpack_require__(33);\n\tvar cloneArray = __webpack_require__(34);\n\tvar inherits = __webpack_require__(6);\n\n\tvar MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\n\tfunction createRemovableDisposable(subject, observer) {\n\t  return Disposable.create(function () {\n\t    observer.dispose();\n\t    !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n\t  });\n\t}\n\n\t/**\n\t * Represents an object that is both an observable sequence as well as an observer.\n\t * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n\t *\n\t *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n\t *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n\t *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n\t *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n\t */\n\tfunction ReplaySubject(bufferSize, windowSize, scheduler) {\n\t  this.bufferSize = bufferSize == null ? MAX_SAFE_INTEGER : bufferSize;\n\t  this.windowSize = windowSize == null ? MAX_SAFE_INTEGER : windowSize;\n\t  this.scheduler = scheduler || Scheduler.queue;\n\t  this.q = [];\n\t  this.observers = [];\n\t  this.isStopped = false;\n\t  this.isDisposed = false;\n\t  this.hasError = false;\n\t  this.error = null;\n\t  Observable.call(this);\n\t}\n\n\tinherits(ReplaySubject, Observable);\n\n\taddProperties(ReplaySubject.prototype, Observer.prototype, {\n\t  _subscribe: function (o) {\n\t    Disposable.checkDisposed(this);\n\t    var so = new ScheduledObserver(this.scheduler, o),\n\t        subscription = createRemovableDisposable(this, so);\n\n\t    this._trim(this.scheduler.now());\n\t    this.observers.push(so);\n\n\t    for (var i = 0, len = this.q.length; i < len; i++) {\n\t      so.onNext(this.q[i].value);\n\t    }\n\n\t    if (this.hasError) {\n\t      so.onError(this.error);\n\t    } else if (this.isStopped) {\n\t      so.onCompleted();\n\t    }\n\n\t    so.ensureActive();\n\t    return subscription;\n\t  },\n\t  /**\n\t   * Indicates whether the subject has observers subscribed to it.\n\t   * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n\t   */\n\t  hasObservers: function () {\n\t    Disposable.checkDisposed(this);\n\t    return this.observers.length > 0;\n\t  },\n\t  _trim: function (now) {\n\t    while (this.q.length > this.bufferSize) {\n\t      this.q.shift();\n\t    }\n\t    while (this.q.length > 0 && now - this.q[0].interval > this.windowSize) {\n\t      this.q.shift();\n\t    }\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n\t   * @param {Mixed} value The value to send to all observers.\n\t   */\n\t  onNext: function (value) {\n\t    Disposable.checkDisposed(this);\n\t    if (this.isStopped) {\n\t      return;\n\t    }\n\t    var now = this.scheduler.now();\n\t    this.q.push({ interval: now, value: value });\n\t    this._trim(now);\n\n\t    for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t      var observer = os[i];\n\t      observer.onNext(value);\n\t      observer.ensureActive();\n\t    }\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the exception.\n\t   * @param {Mixed} error The exception to send to all observers.\n\t   */\n\t  onError: function (error) {\n\t    Disposable.checkDisposed(this);\n\t    if (this.isStopped) {\n\t      return;\n\t    }\n\t    this.isStopped = true;\n\t    this.error = error;\n\t    this.hasError = true;\n\t    var now = this.scheduler.now();\n\t    this._trim(now);\n\t    for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t      var observer = os[i];\n\t      observer.onError(error);\n\t      observer.ensureActive();\n\t    }\n\t    this.observers.length = 0;\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the end of the sequence.\n\t   */\n\t  onCompleted: function () {\n\t    Disposable.checkDisposed(this);\n\t    if (this.isStopped) {\n\t      return;\n\t    }\n\t    this.isStopped = true;\n\t    var now = this.scheduler.now();\n\t    this._trim(now);\n\t    for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t      var observer = os[i];\n\t      observer.onCompleted();\n\t      observer.ensureActive();\n\t    }\n\t    this.observers.length = 0;\n\t  },\n\t  /**\n\t   * Unsubscribe all observers and release resources.\n\t   */\n\t  dispose: function () {\n\t    this.isDisposed = true;\n\t    this.observers = null;\n\t  }\n\t});\n\n\tmodule.exports = ReplaySubject;\n\n/***/ },\n/* 219 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Scheduler = __webpack_require__(12);\n\tvar NAryDisposable = __webpack_require__(43);\n\tvar SerialDisposable = __webpack_require__(44);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar inherits = __webpack_require__(6);\n\n\tvar $iterator$ = '@@iterator';\n\n\tfunction repeat(value, count) {\n\t  count == null && (count = -1);\n\t  return {\n\t    '@@iterator': function () {\n\t      return {\n\t        remaining: count,\n\t        next: function () {\n\t          if (this.remaining === 0) {\n\t            return { done: true, value: undefined };\n\t          }\n\t          if (this.remaining > 0) {\n\t            this.remaining--;\n\t          }\n\t          return { done: false, value: value };\n\t        }\n\t      };\n\t    }\n\t  };\n\t}\n\n\tfunction CatchErrorObserver(state, recurse) {\n\t  this._state = state;\n\t  this._recurse = recurse;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(CatchErrorObserver, AbstractObserver);\n\n\tCatchErrorObserver.prototype.next = function (x) {\n\t  this._state.o.onNext(x);\n\t};\n\tCatchErrorObserver.prototype.error = function (e) {\n\t  this._state.lastError = e;this._recurse(this._state);\n\t};\n\tCatchErrorObserver.prototype.completed = function () {\n\t  this._state.o.onCompleted();\n\t};\n\n\tfunction createDisposable(state) {\n\t  return {\n\t    isDisposed: false,\n\t    dispose: function () {\n\t      if (!this.isDisposed) {\n\t        this.isDisposed = true;\n\t        state.isDisposed = true;\n\t      }\n\t    }\n\t  };\n\t}\n\n\tfunction CatchErrorObservable(sources) {\n\t  this.sources = sources;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(CatchErrorObservable, ObservableBase);\n\n\tfunction scheduleMethod(state, recurse) {\n\t  if (state.isDisposed) {\n\t    return;\n\t  }\n\t  var currentItem = state.e.next();\n\t  if (currentItem.done) {\n\t    return state.lastError !== null ? state.o.onError(state.lastError) : state.o.onCompleted();\n\t  }\n\n\t  var currentValue = currentItem.value;\n\t  isPromise(currentValue) && (currentValue = fromPromise(currentValue));\n\n\t  var d = new SingleAssignmentDisposable();\n\t  state.subscription.setDisposable(d);\n\t  d.setDisposable(currentValue.subscribe(new CatchErrorObserver(state, recurse)));\n\t}\n\n\tCatchErrorObservable.prototype.subscribeCore = function (o) {\n\t  var subscription = new SerialDisposable();\n\t  var state = {\n\t    isDisposed: false,\n\t    e: this.sources[$iterator$](),\n\t    subscription: subscription,\n\t    lastError: null,\n\t    o: o\n\t  };\n\n\t  var cancelable = Scheduler.queue.scheduleRecursive(state, scheduleMethod);\n\t  return new NAryDisposable([subscription, cancelable, createDisposable(state)]);\n\t};\n\n\tmodule.exports = function retry(source, retryCount) {\n\t  return new CatchErrorObservable(repeat(source, retryCount));\n\t};\n\n/***/ },\n/* 220 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar Subject = __webpack_require__(57);\n\tvar Scheduler = __webpack_require__(12);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar NAryDisposable = __webpack_require__(43);\n\tvar SerialDisposable = __webpack_require__(44);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar inherits = __webpack_require__(6);\n\n\tvar $iterator$ = '@@iterator';\n\n\tfunction repeat(value) {\n\t  return {\n\t    '@@iterator': function () {\n\t      return {\n\t        next: function () {\n\t          return { done: false, value: value };\n\t        }\n\t      };\n\t    }\n\t  };\n\t}\n\n\tfunction createDisposable(state) {\n\t  return {\n\t    isDisposed: false,\n\t    dispose: function () {\n\t      if (!this.isDisposed) {\n\t        this.isDisposed = true;\n\t        state.isDisposed = true;\n\t      }\n\t    }\n\t  };\n\t}\n\n\tfunction CatchErrorWhenObservable(source, notifier) {\n\t  this.source = source;\n\t  this._notifier = notifier;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(CatchErrorWhenObservable, ObservableBase);\n\n\tCatchErrorWhenObservable.prototype.subscribeCore = function (o) {\n\t  var exceptions = new Subject(),\n\t      notifier = new Subject(),\n\t      handled = this._notifier(exceptions),\n\t      notificationDisposable = handled.subscribe(notifier);\n\n\t  var e = this.source[$iterator$]();\n\n\t  var state = { isDisposed: false },\n\t      lastError,\n\t      subscription = new SerialDisposable();\n\t  var cancelable = Scheduler.queue.scheduleRecursive(null, function (_, recurse) {\n\t    if (state.isDisposed) {\n\t      return;\n\t    }\n\t    var currentItem = e.next();\n\n\t    if (currentItem.done) {\n\t      if (lastError) {\n\t        o.onError(lastError);\n\t      } else {\n\t        o.onCompleted();\n\t      }\n\t      return;\n\t    }\n\n\t    // Check if promise\n\t    var currentValue = currentItem.value;\n\t    isPromise(currentValue) && (currentValue = fromPromise(currentValue));\n\n\t    var outer = new SingleAssignmentDisposable();\n\t    var inner = new SingleAssignmentDisposable();\n\t    subscription.setDisposable(new BinaryDisposable(inner, outer));\n\t    outer.setDisposable(currentValue.subscribe(function (x) {\n\t      o.onNext(x);\n\t    }, function (exn) {\n\t      inner.setDisposable(notifier.subscribe(recurse, function (ex) {\n\t        o.onError(ex);\n\t      }, function () {\n\t        o.onCompleted();\n\t      }));\n\n\t      exceptions.onNext(exn);\n\t      outer.dispose();\n\t    }, function () {\n\t      o.onCompleted();\n\t    }));\n\t  });\n\n\t  return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n\t};\n\n\tmodule.exports = function retryWhen(source, notifier) {\n\t  return new CatchErrorWhenObservable(repeat(source), notifier);\n\t};\n\n/***/ },\n/* 221 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar interval = __webpack_require__(63);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction SamplerObserver(s) {\n\t  this._s = s;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SamplerObserver, AbstractObserver);\n\n\tSamplerObserver.prototype._handleMessage = function () {\n\t  if (this._s.hasValue) {\n\t    this._s.hasValue = false;\n\t    this._s.o.onNext(this._s.value);\n\t  }\n\t  this._s.atEnd && this._s.o.onCompleted();\n\t};\n\n\tSamplerObserver.prototype.next = function () {\n\t  this._handleMessage();\n\t};\n\tSamplerObserver.prototype.error = function (e) {\n\t  this._s.onError(e);\n\t};\n\tSamplerObserver.prototype.completed = function () {\n\t  this._handleMessage();\n\t};\n\n\tfunction SampleSourceObserver(s) {\n\t  this._s = s;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SampleSourceObserver, AbstractObserver);\n\n\tSampleSourceObserver.prototype.next = function (x) {\n\t  this._s.hasValue = true;\n\t  this._s.value = x;\n\t};\n\tSampleSourceObserver.prototype.error = function (e) {\n\t  this._s.o.onError(e);\n\t};\n\tSampleSourceObserver.prototype.completed = function () {\n\t  this._s.atEnd = true;\n\t  this._s.sourceSubscription.dispose();\n\t};\n\n\tfunction SampleObservable(source, sampler) {\n\t  this.source = source;\n\t  this._sampler = sampler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(SampleObservable, ObservableBase);\n\n\tSampleObservable.prototype.subscribeCore = function (o) {\n\t  var state = {\n\t    o: o,\n\t    atEnd: false,\n\t    value: null,\n\t    hasValue: false,\n\t    sourceSubscription: new SingleAssignmentDisposable()\n\t  };\n\n\t  state.sourceSubscription.setDisposable(this.source.subscribe(new SampleSourceObserver(state)));\n\t  return new BinaryDisposable(state.sourceSubscription, this._sampler.subscribe(new SamplerObserver(state)));\n\t};\n\n\tmodule.exports = function sample(source, intervalOrSampler, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  return typeof intervalOrSampler === 'number' ? new SampleObservable(source, interval(intervalOrSampler, scheduler)) : new SampleObservable(source, intervalOrSampler);\n\t};\n\n/***/ },\n/* 222 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction ScanObserver(o, parent) {\n\t  this._o = o;\n\t  this._p = parent;\n\t  this._fn = parent.accumulator;\n\t  this._hs = parent.hasSeed;\n\t  this._s = parent.seed;\n\t  this._ha = false;\n\t  this._a = null;\n\t  this._hv = false;\n\t  this._i = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(ScanObserver, AbstractObserver);\n\n\tScanObserver.prototype.next = function (x) {\n\t  !this._hv && (this._hv = true);\n\t  if (this._ha) {\n\t    this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n\t  } else {\n\t    this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n\t    this._ha = true;\n\t  }\n\t  if (this._a === errorObj) {\n\t    return this._o.onError(this._a.e);\n\t  }\n\t  this._o.onNext(this._a);\n\t  this._i++;\n\t};\n\n\tScanObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tScanObserver.prototype.completed = function () {\n\t  !this._hv && this._hs && this._o.onNext(this._s);\n\t  this._o.onCompleted();\n\t};\n\n\tfunction ScanObservable(source, accumulator, hasSeed, seed) {\n\t  this.source = source;\n\t  this.accumulator = accumulator;\n\t  this.hasSeed = hasSeed;\n\t  this.seed = seed;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(ScanObservable, ObservableBase);\n\n\tScanObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new ScanObserver(o, this));\n\t};\n\n\t/**\n\t*  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n\t*  For aggregation behavior with no intermediate results, see Observable.aggregate.\n\t* @param {Mixed} [seed] The initial accumulator value.\n\t* @param {Function} accumulator An accumulator function to be invoked on each element.\n\t* @returns {Observable} An observable sequence containing the accumulated values.\n\t*/\n\tmodule.exports = function scan() {\n\t  var source = arguments[0],\n\t      hasSeed = false,\n\t      seed,\n\t      accumulator = arguments[1];\n\t  if (arguments.length === 3) {\n\t    hasSeed = true;\n\t    seed = arguments[2];\n\t  }\n\t  return new ScanObservable(source, accumulator, hasSeed, seed);\n\t};\n\n/***/ },\n/* 223 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar publish = __webpack_require__(56);\n\n\tmodule.exports = function share(source) {\n\t  return publish(source).refCount();\n\t};\n\n/***/ },\n/* 224 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar replay = __webpack_require__(217);\n\n\tmodule.exports = function shareReplay(source, bufferSize, windowSize, scheduler) {\n\t  return replay(source, null, bufferSize, windowSize, scheduler).refCount();\n\t};\n\n/***/ },\n/* 225 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar publishValue = __webpack_require__(212);\n\n\tmodule.exports = function shareValue(source, initialValue) {\n\t  return publishValue(source, initialValue).refCount();\n\t};\n\n/***/ },\n/* 226 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar ObservableBase = __webpack_require__(11);\n\tvar errors = __webpack_require__(7);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction SkipObserver(o, r) {\n\t  this._o = o;\n\t  this._r = r;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SkipObserver, AbstractObserver);\n\n\tSkipObserver.prototype.next = function (x) {\n\t  if (this._r <= 0) {\n\t    this._o.onNext(x);\n\t  } else {\n\t    this._r--;\n\t  }\n\t};\n\tSkipObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tSkipObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction SkipObservable(source, count) {\n\t  this.source = source;\n\t  this._count = count;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(SkipObservable, ObservableBase);\n\n\tSkipObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new SkipObserver(o, this._count));\n\t};\n\n\t/**\n\t * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n\t * @param {Number} count The number of elements to skip before returning the remaining elements.\n\t * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n\t */\n\tmodule.exports = function skip(source, count) {\n\t  if (count < 0) {\n\t    throw new errors.ArgumentOutOfRangeError();\n\t  }\n\t  return new SkipObservable(source, count);\n\t};\n\n/***/ },\n/* 227 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction SkipLastObserver(o, c) {\n\t  this._o = o;\n\t  this._c = c;\n\t  this._q = [];\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SkipLastObserver, AbstractObserver);\n\n\tSkipLastObserver.prototype.next = function (x) {\n\t  this._q.push(x);\n\t  this._q.length > this._c && this._o.onNext(this._q.shift());\n\t};\n\n\tSkipLastObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tSkipLastObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction SkipLastObservable(source, c) {\n\t  this.source = source;\n\t  this._c = c;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(SkipLastObservable, ObservableBase);\n\n\tSkipLastObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new SkipLastObserver(o, this._c));\n\t};\n\n\tmodule.exports = function skipLast(source, count) {\n\t  count < 0 && (count = 0);\n\t  return new SkipLastObservable(source, count);\n\t};\n\n/***/ },\n/* 228 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction SkipLastWithTimeObserver(o, p) {\n\t  this._o = o;\n\t  this._s = p._s;\n\t  this._d = p._d;\n\t  this._q = [];\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SkipLastWithTimeObserver, AbstractObserver);\n\n\tSkipLastWithTimeObserver.prototype.next = function (x) {\n\t  var now = this._s.now();\n\t  this._q.push({ interval: now, value: x });\n\t  while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n\t    this._o.onNext(this._q.shift().value);\n\t  }\n\t};\n\tSkipLastWithTimeObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tSkipLastWithTimeObserver.prototype.completed = function () {\n\t  var now = this._s.now();\n\t  while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n\t    this._o.onNext(this._q.shift().value);\n\t  }\n\t  this._o.onCompleted();\n\t};\n\n\tfunction SkipLastWithTimeObservable(source, d, s) {\n\t  this.source = source;\n\t  this._d = d;\n\t  this._s = s;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(SkipLastWithTimeObservable, ObservableBase);\n\n\tSkipLastWithTimeObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new SkipLastWithTimeObserver(o, this));\n\t};\n\n\tmodule.exports = function skipLastWithTime(source, duration, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  return new SkipLastWithTimeObservable(source, duration, scheduler);\n\t};\n\n/***/ },\n/* 229 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction SkipUntilSourceObserver(o, p) {\n\t  this._o = o;\n\t  this._p = p;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SkipUntilSourceObserver, AbstractObserver);\n\n\tSkipUntilSourceObserver.prototype.next = function (x) {\n\t  this._p._open && this._o.onNext(x);\n\t};\n\tSkipUntilSourceObserver.prototype.error = function (err) {\n\t  this._o.onError(err);\n\t};\n\tSkipUntilSourceObserver.prototype.onCompleted = function () {\n\t  this._p._open && this._o.onCompleted();\n\t};\n\n\tfunction SkipUntilOtherObserver(o, p, r) {\n\t  this._o = o;\n\t  this._p = p;\n\t  this._r = r;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SkipUntilOtherObserver, AbstractObserver);\n\n\tSkipUntilOtherObserver.prototype.next = function () {\n\t  this._p._open = true;this._r.dispose();\n\t};\n\tSkipUntilOtherObserver.prototype.error = function (err) {\n\t  this._o.onError(err);\n\t};\n\tSkipUntilOtherObserver.prototype.onCompleted = function () {\n\t  this._r.dispose();\n\t};\n\n\tfunction SkipUntilObservable(source, other) {\n\t  this._s = source;\n\t  this._o = isPromise(other) ? fromPromise(other) : other;\n\t  this._open = false;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(SkipUntilObservable, ObservableBase);\n\n\tSkipUntilObservable.prototype.subscribeCore = function (o) {\n\t  var leftSubscription = new SingleAssignmentDisposable();\n\t  leftSubscription.setDisposable(this._s.subscribe(new SkipUntilSourceObserver(o, this)));\n\n\t  isPromise(this._o) && (this._o = fromPromise(this._o));\n\n\t  var rightSubscription = new SingleAssignmentDisposable();\n\t  rightSubscription.setDisposable(this._o.subscribe(new SkipUntilOtherObserver(o, this, rightSubscription)));\n\n\t  return new BinaryDisposable(leftSubscription, rightSubscription);\n\t};\n\n\t/**\n\t * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n\t * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n\t * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n\t */\n\tmodule.exports = function skipUntil(source, other) {\n\t  return new SkipUntilObservable(source, other);\n\t};\n\n/***/ },\n/* 230 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction SkipUntilWithTimeObserver(o, p) {\n\t  this._o = o;\n\t  this._p = p;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SkipUntilWithTimeObserver, AbstractObserver);\n\n\tSkipUntilWithTimeObserver.prototype.next = function (x) {\n\t  this._p._open && this._o.onNext(x);\n\t};\n\tSkipUntilWithTimeObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tSkipUntilWithTimeObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction SkipUntilWithTimeObservable(source, startTime, scheduler) {\n\t  this.source = source;\n\t  this._st = startTime;\n\t  this._s = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(SkipUntilWithTimeObservable, ObservableBase);\n\n\tfunction scheduleMethod(s, state) {\n\t  state._open = true;\n\t}\n\n\tSkipUntilWithTimeObservable.prototype.subscribeCore = function (o) {\n\t  this._open = false;\n\t  return new BinaryDisposable(this._s.scheduleFuture(this, this._st, scheduleMethod), this.source.subscribe(new SkipUntilWithTimeObserver(o, this)));\n\t};\n\n\tmodule.exports = function skipUntilWithTime(source, startTime, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  return new SkipUntilWithTimeObservable(source, startTime, scheduler);\n\t};\n\n/***/ },\n/* 231 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar bindCallback = __webpack_require__(52);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction SkipWhileObserver(o, p) {\n\t  this._o = o;\n\t  this._p = p;\n\t  this._i = 0;\n\t  this._r = false;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SkipWhileObserver, AbstractObserver);\n\n\tSkipWhileObserver.prototype.next = function (x) {\n\t  if (!this._r) {\n\t    var res = tryCatch(this._p._fn)(x, this._i++, this._p);\n\t    if (res === errorObj) {\n\t      return this._o.onError(res.e);\n\t    }\n\t    this._r = !res;\n\t  }\n\t  this._r && this._o.onNext(x);\n\t};\n\tSkipWhileObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tSkipWhileObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction SkipWhileObservable(source, fn) {\n\t  this.source = source;\n\t  this._fn = fn;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(SkipWhileObservable, ObservableBase);\n\n\tSkipWhileObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new SkipWhileObserver(o, this));\n\t};\n\n\tmodule.exports = function skipWhile(source, predicate, thisArg) {\n\t  var fn = bindCallback(predicate, thisArg, 3);\n\t  return new SkipWhileObservable(source, fn);\n\t};\n\n/***/ },\n/* 232 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar ArgumentOutOfRangeError = __webpack_require__(7).ArgumentOutOfRangeError;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction SliceObserver(o, b, e) {\n\t  this._o = o;\n\t  this._b = b;\n\t  this._e = e;\n\t  this._i = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SliceObserver, AbstractObserver);\n\n\tSliceObserver.prototype.next = function (x) {\n\t  if (this._i >= this._b) {\n\t    if (this._e === this._i) {\n\t      this._o.onCompleted();\n\t    } else {\n\t      this._o.onNext(x);\n\t    }\n\t  }\n\t  this._i++;\n\t};\n\tSliceObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tSliceObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction SliceObservable(source, b, e) {\n\t  this.source = source;\n\t  this._b = b;\n\t  this._e = e;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(SliceObservable, ObservableBase);\n\n\tSliceObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new SliceObserver(o, this._b, this._e));\n\t};\n\n\tmodule.exports = function slice(source, begin, end) {\n\t  var start = begin || 0;\n\t  if (start < 0) {\n\t    throw new ArgumentOutOfRangeError();\n\t  }\n\t  if (typeof end === 'number' && end < start) {\n\t    throw new ArgumentOutOfRangeError();\n\t  }\n\t  return new SliceObservable(source, start, end);\n\t};\n\n/***/ },\n/* 233 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar ScheduledDisposable = __webpack_require__(234);\n\tvar SerialDisposable = __webpack_require__(44);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction SubscribeOnObservable(source, s) {\n\t  this.source = source;\n\t  this._s = s;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(SubscribeOnObservable, ObservableBase);\n\n\tfunction scheduleMethod(scheduler, state) {\n\t  var source = state[0],\n\t      d = state[1],\n\t      o = state[2];\n\t  d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(o)));\n\t}\n\n\tSubscribeOnObservable.prototype.subscribeCore = function (o) {\n\t  var m = new SingleAssignmentDisposable(),\n\t      d = new SerialDisposable();\n\t  d.setDisposable(m);\n\t  m.setDisposable(this._s.schedule([this.source, d, o], scheduleMethod));\n\t  return d;\n\t};\n\n\tmodule.exports = function subscribeOn(source, scheduler) {\n\t  return new SubscribeOnObservable(source, scheduler);\n\t};\n\n/***/ },\n/* 234 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tfunction ScheduledDisposable(scheduler, disposable) {\n\t  this._scheduler = scheduler;\n\t  this._disposable = disposable;\n\t  this.isDisposed = false;\n\t}\n\n\tfunction scheduleItem(s, self) {\n\t  if (!self.isDisposed) {\n\t    self.isDisposed = true;\n\t    self._disposable.dispose();\n\t  }\n\t}\n\n\tScheduledDisposable.prototype.dispose = function () {\n\t  this._scheduler.schedule(this, scheduleItem);\n\t};\n\n\tmodule.exports = ScheduledDisposable;\n\n/***/ },\n/* 235 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar bindCallback = __webpack_require__(52);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction SomeObserver(o, fn, s) {\n\t  this._o = o;\n\t  this._fn = fn;\n\t  this._s = s;\n\t  this._i = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SomeObserver, AbstractObserver);\n\n\tSomeObserver.prototype.next = function (x) {\n\t  var result = tryCatch(this._fn)(x, this._i++, this._s);\n\t  if (result === errorObj) {\n\t    return this._o.onError(result.e);\n\t  }\n\t  if (Boolean(result)) {\n\t    this._o.onNext(true);\n\t    this._o.onCompleted();\n\t  }\n\t};\n\tSomeObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tSomeObserver.prototype.completed = function () {\n\t  this._o.onNext(false);\n\t  this._o.onCompleted();\n\t};\n\n\tfunction SomeObservable(source, fn) {\n\t  this.source = source;\n\t  this._fn = fn;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(SomeObservable, ObservableBase);\n\n\tSomeObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new SomeObserver(o, this._fn, this.source));\n\t};\n\n\tmodule.exports = function some(source, predicate, thisArg) {\n\t  var fn = bindCallback(predicate, thisArg, 3);\n\t  return new SomeObservable(source, fn);\n\t};\n\n/***/ },\n/* 236 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar bindCallback = __webpack_require__(52);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction SumObserver(o, fn, s) {\n\t  this._o = o;\n\t  this._fn = fn;\n\t  this._s = s;\n\t  this._i = 0;\n\t  this._c = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SumObserver, AbstractObserver);\n\n\tSumObserver.prototype.next = function (x) {\n\t  if (this._fn) {\n\t    var result = tryCatch(this._fn)(x, this._i++, this._s);\n\t    if (result === errorObj) {\n\t      return this._o.onError(result.e);\n\t    }\n\t    this._c += result;\n\t  } else {\n\t    this._c += x;\n\t  }\n\t};\n\tSumObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tSumObserver.prototype.completed = function () {\n\t  this._o.onNext(this._c);\n\t  this._o.onCompleted();\n\t};\n\n\tfunction SumObservable(source, fn) {\n\t  this.source = source;\n\t  this._fn = fn;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(SumObservable, ObservableBase);\n\n\tSumObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new SumObserver(o, this._fn, this.source));\n\t};\n\n\tmodule.exports = function sum(source, keySelector, thisArg) {\n\t  var fn = bindCallback(keySelector, thisArg, 3);\n\t  return new SumObservable(source, fn);\n\t};\n\n/***/ },\n/* 237 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Scheduler = __webpack_require__(12);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar ArgumentOutOfRangeError = __webpack_require__(7).ArgumentOutOfRangeError;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction TakeLastObserver(o, c, s, ss, ls) {\n\t  this._o = o;\n\t  this._c = c;\n\t  this._s = s;\n\t  this._ls = ls;\n\t  this._ss = ss;\n\t  this._q = [];\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(TakeLastObserver, AbstractObserver);\n\n\tTakeLastObserver.prototype.next = function (x) {\n\t  this._q.push(x);\n\t  this._q.length > this._c && this._q.shift();\n\t};\n\n\tTakeLastObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\n\tfunction loopRecursive(state, recurse) {\n\t  if (state[1].length > 0) {\n\t    state[0].onNext(state[1].shift());\n\t    recurse(state);\n\t  } else {\n\t    state[0].onCompleted();\n\t  }\n\t}\n\n\tTakeLastObserver.prototype.completed = function () {\n\t  this._ss.dispose();\n\t  this._ls.setDisposable(this._s.scheduleRecursive([this._o, this._q], loopRecursive));\n\t};\n\n\tfunction TakeLastObservable(source, count, scheduler) {\n\t  this.source = source;\n\t  this.count = count;\n\t  this.scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(TakeLastObservable, ObservableBase);\n\n\tTakeLastObservable.prototype.subscribeCore = function (o) {\n\t  var subscription = new SingleAssignmentDisposable();\n\t  var loopSubscription = new SingleAssignmentDisposable();\n\t  subscription.setDisposable(this.source.subscribe(new TakeLastObserver(o, this.count, this.scheduler, subscription, loopSubscription)));\n\n\t  return new BinaryDisposable(subscription, loopSubscription);\n\t};\n\n\tmodule.exports = function takeLast(source, count, scheduler) {\n\t  if (count < 0) {\n\t    throw new ArgumentOutOfRangeError();\n\t  }\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.queue);\n\t  return new TakeLastObservable(source, count, scheduler);\n\t};\n\n/***/ },\n/* 238 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction TakeLastBufferObserver(o, c) {\n\t  this._o = o;\n\t  this._c = c;\n\t  this._q = [];\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(TakeLastBufferObserver, AbstractObserver);\n\n\tTakeLastBufferObserver.prototype.next = function (x) {\n\t  this._q.push(x);\n\t  this._q.length > this._c && this._q.shift();\n\t};\n\n\tTakeLastBufferObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\n\tTakeLastBufferObserver.prototype.completed = function () {\n\t  this._o.onNext(this._q);\n\t  this._o.onCompleted();\n\t};\n\n\tfunction TakeLastBufferObservable(source, count) {\n\t  this.source = source;\n\t  this._c = count;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(TakeLastBufferObservable, ObservableBase);\n\n\tTakeLastBufferObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new TakeLastBufferObserver(o, this._c));\n\t};\n\n\tmodule.exports = function takeLastBuffer(source, count) {\n\t  count < 0 && (count = 0);\n\t  return new TakeLastBufferObservable(source, count);\n\t};\n\n/***/ },\n/* 239 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction TakeLastBufferWithTimeObserver(o, d, s) {\n\t  this._o = o;\n\t  this._d = d;\n\t  this._s = s;\n\t  this._q = [];\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(TakeLastBufferWithTimeObserver, AbstractObserver);\n\n\tTakeLastBufferWithTimeObserver.prototype.next = function (x) {\n\t  var now = this._s.now();\n\t  this._q.push({ interval: now, value: x });\n\t  while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n\t    this._q.shift();\n\t  }\n\t};\n\n\tTakeLastBufferWithTimeObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\n\tTakeLastBufferWithTimeObserver.prototype.completed = function () {\n\t  var now = this._s.now(),\n\t      res = [];\n\t  while (this._q.length > 0) {\n\t    var next = this._q.shift();\n\t    now - next.interval <= this._d && res.push(next.value);\n\t  }\n\t  this._o.onNext(res);\n\t  this._o.onCompleted();\n\t};\n\n\tfunction TakeLastBufferWithTimeObservable(source, duration, scheduler) {\n\t  this.source = source;\n\t  this._d = duration;\n\t  this._s = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(TakeLastBufferWithTimeObservable, ObservableBase);\n\n\tTakeLastBufferWithTimeObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new TakeLastBufferWithTimeObserver(o, this._d, this._s));\n\t};\n\n\tmodule.exports = function takeLastBufferWithTime(source, duration, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  return new TakeLastBufferWithTimeObservable(source, duration, scheduler);\n\t};\n\n/***/ },\n/* 240 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction TakeLastWithTimeObserver(o, d, s) {\n\t  this._o = o;\n\t  this._d = d;\n\t  this._s = s;\n\t  this._q = [];\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(TakeLastWithTimeObserver, AbstractObserver);\n\n\tTakeLastWithTimeObserver.prototype.next = function (x) {\n\t  var now = this._s.now();\n\t  this._q.push({ interval: now, value: x });\n\t  while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n\t    this._q.shift();\n\t  }\n\t};\n\tTakeLastWithTimeObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tTakeLastWithTimeObserver.prototype.completed = function () {\n\t  var now = this._s.now();\n\t  while (this._q.length > 0) {\n\t    var next = this._q.shift();\n\t    if (now - next.interval <= this._d) {\n\t      this._o.onNext(next.value);\n\t    }\n\t  }\n\t  this._o.onCompleted();\n\t};\n\n\tfunction TakeLastWithTimeObservable(source, d, s) {\n\t  this.source = source;\n\t  this._d = d;\n\t  this._s = s;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(TakeLastWithTimeObservable, ObservableBase);\n\n\tTakeLastWithTimeObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new TakeLastWithTimeObserver(o, this._d, this._s));\n\t};\n\n\tmodule.exports = function takeLastWithTime(source, duration, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  return new TakeLastWithTimeObservable(source, duration, scheduler);\n\t};\n\n/***/ },\n/* 241 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar isPromise = __webpack_require__(28);\n\tvar fromPromise = __webpack_require__(27);\n\tvar noop = __webpack_require__(3);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction TakeUntilObserver(o) {\n\t  this._o = o;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(TakeUntilObserver, AbstractObserver);\n\n\tTakeUntilObserver.prototype.next = function () {\n\t  this._o.onCompleted();\n\t};\n\tTakeUntilObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tTakeUntilObserver.prototype.onCompleted = noop;\n\n\tfunction TakeUntilObservable(source, other) {\n\t  this.source = source;\n\t  this._other = isPromise(other) ? fromPromise(other) : other;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(TakeUntilObservable, ObservableBase);\n\n\tTakeUntilObservable.prototype.subscribeCore = function (o) {\n\t  return new BinaryDisposable(this.source.subscribe(o), this._other.subscribe(new TakeUntilObserver(o)));\n\t};\n\n\t/**\n\t * Returns the values from the source observable sequence until the other observable sequence produces a value.\n\t * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n\t * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n\t */\n\tmodule.exports = function takeUntil(source, other) {\n\t  return new TakeUntilObservable(source, other);\n\t};\n\n/***/ },\n/* 242 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar BinaryDisposable = __webpack_require__(24);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction TakeUntilWithTimeObservable(source, end, scheduler) {\n\t  this.source = source;\n\t  this._e = end;\n\t  this._s = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(TakeUntilWithTimeObservable, ObservableBase);\n\n\tfunction scheduleMethod(s, o) {\n\t  o.onCompleted();\n\t}\n\n\tTakeUntilWithTimeObservable.prototype.subscribeCore = function (o) {\n\t  return new BinaryDisposable(this._s.scheduleFuture(o, this._e, scheduleMethod), this.source.subscribe(o));\n\t};\n\n\tmodule.exports = function takeUntilWithTime(source, endTime, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  return new TakeUntilWithTimeObservable(source, endTime, scheduler);\n\t};\n\n/***/ },\n/* 243 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar bindCallback = __webpack_require__(52);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction TakeWhileObserver(o, p) {\n\t  this._o = o;\n\t  this._p = p;\n\t  this._i = 0;\n\t  this._r = true;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(TakeWhileObserver, AbstractObserver);\n\n\tTakeWhileObserver.prototype.next = function (x) {\n\t  if (this._r) {\n\t    this._r = tryCatch(this._p._fn)(x, this._i++, this._p);\n\t    if (this._r === errorObj) {\n\t      return this._o.onError(this._r.e);\n\t    }\n\t  }\n\t  if (this._r) {\n\t    this._o.onNext(x);\n\t  } else {\n\t    this._o.onCompleted();\n\t  }\n\t};\n\tTakeWhileObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tTakeWhileObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction TakeWhileObservable(source, fn) {\n\t  this.source = source;\n\t  this._fn = fn;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(TakeWhileObservable, ObservableBase);\n\n\tTakeWhileObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new TakeWhileObserver(o, this));\n\t};\n\n\tmodule.exports = function takeWhile(source, predicate, thisArg) {\n\t  var fn = bindCallback(predicate, thisArg, 3);\n\t  return new TakeWhileObservable(source, fn);\n\t};\n\n/***/ },\n/* 244 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Pattern = __webpack_require__(137);\n\n\tmodule.exports = function thenDo(source, selector) {\n\t  return new Pattern([source]).thenDo(selector);\n\t};\n\n/***/ },\n/* 245 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction ThrottleObserver(s) {\n\t  this._s = s;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(ThrottleObserver, AbstractObserver);\n\n\tThrottleObserver.prototype.next = function (x) {\n\t  var now = this._s.scheduler.now();\n\t  if (this._s.lastOnNext === 0 || now - this._s.lastOnNext >= this._s.duration) {\n\t    this._s.lastOnNext = now;\n\t    this._s.o.onNext(x);\n\t  }\n\t};\n\tThrottleObserver.prototype.error = function (e) {\n\t  this._s.o.onError(e);\n\t};\n\tThrottleObserver.prototype.completed = function () {\n\t  this._s.o.onCompleted();\n\t};\n\n\tfunction ThrottleObservable(source, duration, scheduler) {\n\t  this.source = source;\n\t  this._duration = duration;\n\t  this._scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(ThrottleObservable, ObservableBase);\n\n\tThrottleObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new ThrottleObserver({\n\t    o: o,\n\t    duration: this._duration,\n\t    scheduler: this._scheduler,\n\t    lastOnNext: 0\n\t  }));\n\t};\n\n\tmodule.exports = function throttle(source, windowDuration, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  var duration = +windowDuration || 0;\n\t  if (duration <= 0) {\n\t    throw new RangeError('windowDuration cannot be less or equal zero.');\n\t  }\n\t  return new ThrottleObservable(source, duration, scheduler);\n\t};\n\n/***/ },\n/* 246 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Scheduler = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction TimeIntervalObserver(o, s) {\n\t  this._o = o;\n\t  this._s = s;\n\t  this._l = s.now();\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(TimeIntervalObserver, AbstractObserver);\n\n\tTimeIntervalObserver.prototype.next = function (x) {\n\t  var now = this._s.now(),\n\t      span = now - this._l;\n\t  this._l = now;\n\t  this._o.onNext({ value: x, interval: span });\n\t};\n\tTimeIntervalObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tTimeIntervalObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction TimeIntervalObservable(source, s) {\n\t  this.source = source;\n\t  this._s = s;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(TimeIntervalObservable, ObservableBase);\n\n\tTimeIntervalObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new TimeIntervalObserver(o, this._s));\n\t};\n\n\tmodule.exports = function timeInterval(source, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  return new TimeIntervalObservable(source, scheduler);\n\t};\n\n/***/ },\n/* 247 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar ObservableBase = __webpack_require__(11);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction ToArrayObserver(o) {\n\t  this.o = o;\n\t  this.a = [];\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(ToArrayObserver, AbstractObserver);\n\n\tToArrayObserver.prototype.next = function (x) {\n\t  this.a.push(x);\n\t};\n\tToArrayObserver.prototype.error = function (e) {\n\t  this.o.onError(e);\n\t};\n\tToArrayObserver.prototype.completed = function () {\n\t  this.o.onNext(this.a);this.o.onCompleted();\n\t};\n\n\tfunction ToArrayObservable(source) {\n\t  this.source = source;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(ToArrayObservable, ObservableBase);\n\n\tToArrayObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new ToArrayObserver(o));\n\t};\n\n\t/**\n\t* Creates an array from an observable sequence.\n\t* @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n\t*/\n\tmodule.exports = function toArray(o) {\n\t  return new ToArrayObservable(o);\n\t};\n\n/***/ },\n/* 248 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction ToMapObserver(o, k, e) {\n\t  this._o = o;\n\t  this._k = k;\n\t  this._e = e;\n\t  this._m = new global.Map();\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(ToMapObserver, AbstractObserver);\n\n\tToMapObserver.prototype.next = function (x) {\n\t  var key = tryCatch(this._k)(x);\n\t  if (key === errorObj) {\n\t    return this._o.onError(key.e);\n\t  }\n\t  var elem = x;\n\t  if (this._e) {\n\t    elem = tryCatch(this._e)(x);\n\t    if (elem === errorObj) {\n\t      return this._o.onError(elem.e);\n\t    }\n\t  }\n\n\t  this._m.set(key, elem);\n\t};\n\n\tToMapObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\n\tToMapObserver.prototype.completed = function () {\n\t  this._o.onNext(this._m);\n\t  this._o.onCompleted();\n\t};\n\n\tfunction ToMapObservable(source, k, e) {\n\t  this.source = source;\n\t  this._k = k;\n\t  this._e = e;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(ToMapObservable, ObservableBase);\n\n\tToMapObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new ToMapObserver(o, this._k, this._e));\n\t};\n\n\tmodule.exports = function toMap(source, keySelector, elementSelector) {\n\t  if (typeof global.Map === 'undefined') {\n\t    throw new TypeError();\n\t  }\n\t  return new ToMapObservable(source, keySelector, elementSelector);\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 249 */\n/***/ function(module, exports) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n\tmodule.exports = function toPromise(source, promiseCtor) {\n\t  promiseCtor || (promiseCtor = global.Promise);\n\t  return new promiseCtor(function (resolve, reject) {\n\t    // No cancellation can be done\n\t    var value;\n\t    source.subscribe(function (v) {\n\t      value = v;\n\t    }, reject, function () {\n\t      resolve(value);\n\t    });\n\t  });\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 250 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction ToSetObserver(o) {\n\t  this._o = o;\n\t  this._s = new global.Set();\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(ToSetObserver, AbstractObserver);\n\n\tToSetObserver.prototype.next = function (x) {\n\t  this._s.add(x);\n\t};\n\tToSetObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tToSetObserver.prototype.completed = function () {\n\t  this._o.onNext(this._s);\n\t  this._o.onCompleted();\n\t};\n\n\tfunction ToSetObservable(source) {\n\t  this.source = source;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(ToSetObservable, ObservableBase);\n\n\tToSetObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new ToSetObserver(o));\n\t};\n\n\tmodule.exports = function toSet(source) {\n\t  if (typeof global.Set === 'undefined') {\n\t    throw new TypeError();\n\t  }\n\t  return new ToSetObservable(source);\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 251 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction TransduceObserver(o, xform) {\n\t  this._o = o;\n\t  this._xform = xform;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(TransduceObserver, AbstractObserver);\n\n\tTransduceObserver.prototype.next = function (x) {\n\t  var res = tryCatch(this._xform['@@transducer/step']).call(this._xform, this._o, x);\n\t  if (res === errorObj) {\n\t    this._o.onError(res.e);\n\t  }\n\t};\n\n\tTransduceObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\n\tTransduceObserver.prototype.completed = function () {\n\t  this._xform['@@transducer/result'](this._o);\n\t};\n\n\tfunction transformForObserver(o) {\n\t  return {\n\t    '@@transducer/init': function () {\n\t      return o;\n\t    },\n\t    '@@transducer/step': function (obs, input) {\n\t      return obs.onNext(input);\n\t    },\n\t    '@@transducer/result': function (obs) {\n\t      return obs.onCompleted();\n\t    }\n\t  };\n\t}\n\n\tfunction TransduceObservable(source, transducer) {\n\t  this.source = source;\n\t  this._transducer = transducer;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(TransduceObservable, ObservableBase);\n\n\tTransduceObservable.prototype.subscribeCore = function (o) {\n\t  var xform = this._transducer(transformForObserver(o));\n\t  return this.source.subscribe(new TransduceObserver(o, xform));\n\t};\n\n\tmodule.exports = function transduce(source, transducer) {\n\t  return new TransduceObservable(source, transducer);\n\t};\n\n/***/ },\n/* 252 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar NAryDisposable = __webpack_require__(43);\n\tvar fromPromise = __webpack_require__(27);\n\tvar isPromise = __webpack_require__(28);\n\tvar identity = __webpack_require__(46);\n\tvar noop = __webpack_require__(3);\n\tvar isFunction = __webpack_require__(9);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction falseFactory() {\n\t  return false;\n\t}\n\tfunction initializeArray(n, fn) {\n\t  var results = new Array(n);\n\t  for (var i = 0; i < n; i++) {\n\t    results[i] = fn(i);\n\t  }\n\t  return results;\n\t}\n\tfunction argumentsToArray() {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  return args;\n\t}\n\n\tfunction WithLatestFromOtherObserver(o, i, state) {\n\t  this._o = o;\n\t  this._i = i;\n\t  this._state = state;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(WithLatestFromOtherObserver, AbstractObserver);\n\n\tWithLatestFromOtherObserver.prototype.next = function (x) {\n\t  this._state.values[this._i] = x;\n\t  this._state.hasValue[this._i] = true;\n\t  this._state.hasValueAll = this._state.hasValue.every(identity);\n\t};\n\n\tWithLatestFromOtherObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tWithLatestFromOtherObserver.prototype.completed = noop;\n\n\tfunction WithLatestFromSourceObserver(o, cb, state) {\n\t  this._o = o;\n\t  this._cb = cb;\n\t  this._state = state;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(WithLatestFromSourceObserver, AbstractObserver);\n\n\tWithLatestFromSourceObserver.prototype.next = function (x) {\n\t  var allValues = [x].concat(this._state.values);\n\t  if (!this._state.hasValueAll) {\n\t    return;\n\t  }\n\t  var res = tryCatch(this._cb).apply(null, allValues);\n\t  if (res === errorObj) {\n\t    return this._o.onError(res.e);\n\t  }\n\t  this._o.onNext(res);\n\t};\n\n\tWithLatestFromSourceObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tWithLatestFromSourceObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction WithLatestFromObservable(source, sources, resultSelector) {\n\t  this._s = source;\n\t  this._ss = sources;\n\t  this._cb = resultSelector;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(WithLatestFromObservable, ObservableBase);\n\n\tWithLatestFromObservable.prototype.subscribeCore = function (o) {\n\t  var len = this._ss.length;\n\t  var state = {\n\t    hasValue: initializeArray(len, falseFactory),\n\t    hasValueAll: false,\n\t    values: new Array(len)\n\t  };\n\n\t  var n = this._ss.length,\n\t      subscriptions = new Array(n + 1);\n\t  for (var i = 0; i < n; i++) {\n\t    var other = this._ss[i],\n\t        sad = new SingleAssignmentDisposable();\n\t    isPromise(other) && (other = fromPromise(other));\n\t    sad.setDisposable(other.subscribe(new WithLatestFromOtherObserver(o, i, state)));\n\t    subscriptions[i] = sad;\n\t  }\n\n\t  var outerSad = new SingleAssignmentDisposable();\n\t  outerSad.setDisposable(this._s.subscribe(new WithLatestFromSourceObserver(o, this._cb, state)));\n\t  subscriptions[n] = outerSad;\n\n\t  return new NAryDisposable(subscriptions);\n\t};\n\n\t/**\n\t * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n\t * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n\t */\n\tmodule.exports = function withLatestFrom() {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n\n\t  return new WithLatestFromObservable(args[0], args.slice(1), resultSelector);\n\t};\n\n/***/ },\n/* 253 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(11);\n\tvar observableFrom = __webpack_require__(50);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar NAryDisposable = __webpack_require__(43);\n\tvar identity = __webpack_require__(46);\n\tvar isFunction = __webpack_require__(9);\n\tvar isArrayLike = __webpack_require__(147);\n\tvar isIterable = __webpack_require__(148);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction falseFactory() {\n\t  return false;\n\t}\n\tfunction emptyArrayFactory() {\n\t  return [];\n\t}\n\tfunction initializeArray(n, fn) {\n\t  var results = new Array(n);\n\t  for (var i = 0; i < n; i++) {\n\t    results[i] = fn(i);\n\t  }\n\t  return results;\n\t}\n\tfunction argumentsToArray() {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  return args;\n\t}\n\n\tfunction ZipIterableObserver(s, i) {\n\t  this._s = s;\n\t  this._i = i;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(ZipIterableObserver, AbstractObserver);\n\n\tfunction notEmpty(x) {\n\t  return x.length > 0;\n\t}\n\tfunction shiftEach(x) {\n\t  return x.shift();\n\t}\n\tfunction notTheSame(i) {\n\t  return function (x, j) {\n\t    return j !== i;\n\t  };\n\t}\n\n\tZipIterableObserver.prototype.next = function (x) {\n\t  this._s.q[this._i].push(x);\n\t  if (this._s.q.every(notEmpty)) {\n\t    var queuedValues = this._s.q.map(shiftEach),\n\t        res = tryCatch(this._s.cb).apply(null, queuedValues);\n\t    if (res === errorObj) {\n\t      return this._s.o.onError(res.e);\n\t    }\n\t    this._s.o.onNext(res);\n\t  } else if (this._s.done.filter(notTheSame(this._i)).every(identity)) {\n\t    this._s.o.onCompleted();\n\t  }\n\t};\n\n\tZipIterableObserver.prototype.error = function (e) {\n\t  this._s.o.onError(e);\n\t};\n\n\tZipIterableObserver.prototype.completed = function () {\n\t  this._s.done[this._i] = true;\n\t  this._s.done.every(identity) && this._s.o.onCompleted();\n\t};\n\n\tfunction ZipIterableObservable(sources, cb) {\n\t  this._sources = sources;\n\t  this._cb = cb;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(ZipIterableObservable, ObservableBase);\n\n\tZipIterableObservable.prototype.subscribeCore = function (o) {\n\t  var sources = this._sources,\n\t      len = sources.length,\n\t      subscriptions = new Array(len);\n\n\t  var state = {\n\t    q: initializeArray(len, emptyArrayFactory),\n\t    done: initializeArray(len, falseFactory),\n\t    cb: this._cb,\n\t    o: o\n\t  };\n\n\t  for (var i = 0; i < len; i++) {\n\t    (function (i) {\n\t      var source = sources[i],\n\t          sad = new SingleAssignmentDisposable();\n\t      (isArrayLike(source) || isIterable(source)) && (source = observableFrom(source));\n\t      subscriptions[i] = sad;\n\t      sad.setDisposable(source.subscribe(new ZipIterableObserver(state, i)));\n\t    })(i);\n\t  }\n\n\t  return new NAryDisposable(subscriptions);\n\t};\n\n\t/**\n\t * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n\t * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n\t * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n\t */\n\tmodule.exports = function zipIterable() {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n\t  return new ZipIterableObservable(args, resultSelector);\n\t};\n\n/***/ },\n/* 254 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Observable = __webpack_require__(8);\n\tvar Observer = __webpack_require__(1);\n\tvar addProperties = __webpack_require__(33);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction AnonymousSubject(observer, observable) {\n\t  this.observer = observer;\n\t  this.observable = observable;\n\t  Observable.call(this);\n\t}\n\n\tinherits(AnonymousSubject, Observable);\n\n\taddProperties(AnonymousSubject.prototype, Observer.prototype, {\n\t  _subscribe: function (o) {\n\t    return this.observable.subscribe(o);\n\t  },\n\t  onCompleted: function () {\n\t    this.observer.onCompleted();\n\t  },\n\t  onError: function (error) {\n\t    this.observer.onError(error);\n\t  },\n\t  onNext: function (value) {\n\t    this.observer.onNext(value);\n\t  }\n\t});\n\n\t/**\n\t * Creates a subject from the specified observer and observable.\n\t * @param {Observer} observer The observer used to send messages to the subject.\n\t * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n\t * @returns {Subject} Subject implemented using the given observer and observable.\n\t */\n\tmodule.exports = function create(observer, observable) {\n\t  return new AnonymousSubject(observer, observable);\n\t};\n\n/***/ },\n/* 255 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Scheduler = __webpack_require__(12);\n\tvar PriorityQueue = __webpack_require__(19);\n\tvar ScheduledItem = __webpack_require__(16);\n\tvar SchedulePeriodicRecursive = __webpack_require__(256);\n\tvar errors = __webpack_require__(7);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction notImplemented() {\n\t  throw new errors.NotImplementedError();\n\t}\n\n\t/**\n\t * Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer.\n\t *\n\t * @constructor\n\t * @param {Number} initialClock Initial value for the clock.\n\t * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n\t */\n\tfunction VirtualTimeScheduler(initialClock, comparer) {\n\t  this.clock = initialClock;\n\t  this.comparer = comparer;\n\t  this.isEnabled = false;\n\t  this.queue = new PriorityQueue(1024);\n\t  Scheduler.call(this);\n\t}\n\n\tinherits(VirtualTimeScheduler, Scheduler);\n\n\tvar VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype;\n\n\tVirtualTimeSchedulerPrototype.now = function () {\n\t  return this.toAbsoluteTime(this.clock);\n\t};\n\n\tVirtualTimeSchedulerPrototype.schedule = function (state, action) {\n\t  return this.scheduleAbsolute(state, this.clock, action);\n\t};\n\n\tVirtualTimeSchedulerPrototype.scheduleFuture = function (state, dueTime, action) {\n\t  var dt = dueTime instanceof Date ? this.toRelativeTime(dueTime - this.now()) : this.toRelativeTime(dueTime);\n\n\t  return this.scheduleRelative(state, dt, action);\n\t};\n\n\t/**\n\t * Adds a relative time value to an absolute time value.\n\t * @param {Number} absolute Absolute virtual time value.\n\t * @param {Number} relative Relative virtual time value to add.\n\t * @return {Number} Resulting absolute virtual time sum value.\n\t */\n\tVirtualTimeSchedulerPrototype.add = notImplemented;\n\n\t/**\n\t * Converts an absolute time to a number\n\t * @param {Any} The absolute time.\n\t * @returns {Number} The absolute time in ms\n\t */\n\tVirtualTimeSchedulerPrototype.toAbsoluteTime = notImplemented;\n\n\t/**\n\t * Converts the TimeSpan value to a relative virtual time value.\n\t * @param {Number} timeSpan TimeSpan value to convert.\n\t * @return {Number} Corresponding relative virtual time value.\n\t */\n\tVirtualTimeSchedulerPrototype.toRelativeTime = notImplemented;\n\n\t/**\n\t * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be emulated using recursive scheduling.\n\t * @param {Mixed} state Initial state passed to the action upon the first iteration.\n\t * @param {Number} period Period for running the work periodically.\n\t * @param {Function} action Action to be executed, potentially updating the state.\n\t * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n\t */\n\tVirtualTimeSchedulerPrototype.schedulePeriodic = function (state, period, action) {\n\t  var s = new SchedulePeriodicRecursive(this, state, period, action);\n\t  return s.start();\n\t};\n\n\t/**\n\t * Schedules an action to be executed after dueTime.\n\t * @param {Mixed} state State passed to the action to be executed.\n\t * @param {Number} dueTime Relative time after which to execute the action.\n\t * @param {Function} action Action to be executed.\n\t * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n\t */\n\tVirtualTimeSchedulerPrototype.scheduleRelative = function (state, dueTime, action) {\n\t  var runAt = this.add(this.clock, dueTime);\n\t  return this.scheduleAbsolute(state, runAt, action);\n\t};\n\n\t/**\n\t * Starts the virtual time scheduler.\n\t */\n\tVirtualTimeSchedulerPrototype.start = function () {\n\t  if (!this.isEnabled) {\n\t    this.isEnabled = true;\n\t    do {\n\t      var next = this.getNext();\n\t      if (next !== null) {\n\t        this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n\t        next.invoke();\n\t      } else {\n\t        this.isEnabled = false;\n\t      }\n\t    } while (this.isEnabled);\n\t  }\n\t};\n\n\t/**\n\t * Stops the virtual time scheduler.\n\t */\n\tVirtualTimeSchedulerPrototype.stop = function () {\n\t  this.isEnabled = false;\n\t};\n\n\t/**\n\t * Advances the scheduler's clock to the specified time, running all work till that point.\n\t * @param {Number} time Absolute time to advance the scheduler's clock to.\n\t */\n\tVirtualTimeSchedulerPrototype.advanceTo = function (time) {\n\t  var dueToClock = this.comparer(this.clock, time);\n\t  if (this.comparer(this.clock, time) > 0) {\n\t    throw new errors.ArgumentOutOfRangeError();\n\t  }\n\t  if (dueToClock === 0) {\n\t    return;\n\t  }\n\t  if (!this.isEnabled) {\n\t    this.isEnabled = true;\n\t    do {\n\t      var next = this.getNext();\n\t      if (next !== null && this.comparer(next.dueTime, time) <= 0) {\n\t        this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n\t        next.invoke();\n\t      } else {\n\t        this.isEnabled = false;\n\t      }\n\t    } while (this.isEnabled);\n\t    this.clock = time;\n\t  }\n\t};\n\n\t/**\n\t * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n\t * @param {Number} time Relative time to advance the scheduler's clock by.\n\t */\n\tVirtualTimeSchedulerPrototype.advanceBy = function (time) {\n\t  var dt = this.add(this.clock, time),\n\t      dueToClock = this.comparer(this.clock, dt);\n\t  if (dueToClock > 0) {\n\t    throw new errors.ArgumentOutOfRangeError();\n\t  }\n\t  if (dueToClock === 0) {\n\t    return;\n\t  }\n\n\t  this.advanceTo(dt);\n\t};\n\n\t/**\n\t * Advances the scheduler's clock by the specified relative time.\n\t * @param {Number} time Relative time to advance the scheduler's clock by.\n\t */\n\tVirtualTimeSchedulerPrototype.sleep = function (time) {\n\t  var dt = this.add(this.clock, time);\n\t  if (this.comparer(this.clock, dt) >= 0) {\n\t    throw new errors.ArgumentOutOfRangeError();\n\t  }\n\n\t  this.clock = dt;\n\t};\n\n\t/**\n\t * Gets the next scheduled item to be executed.\n\t * @returns {ScheduledItem} The next scheduled item.\n\t */\n\tVirtualTimeSchedulerPrototype.getNext = function () {\n\t  while (this.queue.length > 0) {\n\t    var next = this.queue.peek();\n\t    if (next.isCancelled()) {\n\t      this.queue.dequeue();\n\t    } else {\n\t      return next;\n\t    }\n\t  }\n\t  return null;\n\t};\n\n\t/**\n\t * Schedules an action to be executed at dueTime.\n\t * @param {Mixed} state State passed to the action to be executed.\n\t * @param {Number} dueTime Absolute time at which to execute the action.\n\t * @param {Function} action Action to be executed.\n\t * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n\t */\n\tVirtualTimeSchedulerPrototype.scheduleAbsolute = function (state, dueTime, action) {\n\t  var self = this;\n\n\t  function run(scheduler, state1) {\n\t    self.queue.remove(si);\n\t    return action(scheduler, state1);\n\t  }\n\n\t  var si = new ScheduledItem(this, state, run, dueTime, this.comparer);\n\t  this.queue.enqueue(si);\n\n\t  return si.disposable;\n\t};\n\n\tmodule.exports = VirtualTimeScheduler;\n\n/***/ },\n/* 256 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar SingleAssignmentDisposable = __webpack_require__(17);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj,\n\t    thrower = tryCatchUtils.thrower;\n\n\tfunction createTick(self) {\n\t  return function tick(command, recurse) {\n\t    recurse(0, self._period);\n\t    var state = tryCatch(self._action)(self._state);\n\t    if (state === errorObj) {\n\t      self._cancel.dispose();\n\t      thrower(state.e);\n\t    }\n\t    self._state = state;\n\t  };\n\t}\n\n\tfunction SchedulePeriodicRecursive(scheduler, state, period, action) {\n\t  this._scheduler = scheduler;\n\t  this._state = state;\n\t  this._period = period;\n\t  this._action = action;\n\t}\n\n\tSchedulePeriodicRecursive.prototype.start = function () {\n\t  var d = new SingleAssignmentDisposable();\n\t  this._cancel = d;\n\t  d.setDisposable(this._scheduler.scheduleRecursiveFuture(0, this._period, createTick(this)));\n\n\t  return d;\n\t};\n\n\tmodule.exports = SchedulePeriodicRecursive;\n\n/***/ },\n/* 257 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar VirtualTimeScheduler = __webpack_require__(255);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction baseComparer(x, y) {\n\t  return x > y ? 1 : x < y ? -1 : 0;\n\t}\n\n\t/**\n\t * Provides a virtual time scheduler that uses Date for absolute time and number for relative time.\n\t * Creates a new historical scheduler with the specified initial clock value.\n\t * @constructor\n\t * @param {Number} initialClock Initial value for the clock.\n\t * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n\t */\n\tfunction HistoricalScheduler(initialClock, comparer) {\n\t  var clock = initialClock == null ? 0 : initialClock;\n\t  var cmp = comparer || baseComparer;\n\t  VirtualTimeScheduler.call(this, clock, cmp);\n\t}\n\n\tinherits(HistoricalScheduler, VirtualTimeScheduler);\n\n\t/**\n\t * Adds a relative time value to an absolute time value.\n\t * @param {Number} absolute Absolute virtual time value.\n\t * @param {Number} relative Relative virtual time value to add.\n\t * @return {Number} Resulting absolute virtual time sum value.\n\t */\n\tHistoricalScheduler.prototype.add = function (absolute, relative) {\n\t  return absolute + relative;\n\t};\n\n\tHistoricalScheduler.prototype.toAbsoluteTime = function (absolute) {\n\t  return new Date(absolute).getTime();\n\t};\n\n\t/**\n\t * Converts the TimeSpan value to a relative virtual time value.\n\t * @memberOf HistoricalScheduler\n\t * @param {Number} timeSpan TimeSpan value to convert.\n\t * @return {Number} Corresponding relative virtual time value.\n\t */\n\tHistoricalScheduler.prototype.toRelativeTime = function (timeSpan) {\n\t  return timeSpan;\n\t};\n\n\tmodule.exports = HistoricalScheduler;\n\n/***/ },\n/* 258 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Notification = __webpack_require__(142);\n\tvar Recorded = __webpack_require__(259);\n\tvar Subscription = __webpack_require__(260);\n\n\tfunction OnNextPredicate(predicate) {\n\t  this.predicate = predicate;\n\t}\n\n\tOnNextPredicate.prototype.equals = function (other) {\n\t  if (other === this) {\n\t    return true;\n\t  }\n\t  if (other == null) {\n\t    return false;\n\t  }\n\t  if (other.kind !== 'N') {\n\t    return false;\n\t  }\n\t  return this.predicate(other.value);\n\t};\n\n\tfunction OnErrorPredicate(predicate) {\n\t  this.predicate = predicate;\n\t}\n\n\tOnErrorPredicate.prototype.equals = function (other) {\n\t  if (other === this) {\n\t    return true;\n\t  }\n\t  if (other == null) {\n\t    return false;\n\t  }\n\t  if (other.kind !== 'E') {\n\t    return false;\n\t  }\n\t  return this.predicate(other.error);\n\t};\n\n\tmodule.exports = {\n\t  /** Default virtual time used for creation of observable sequences in unit tests. */\n\t  created: 100,\n\t  /** Default virtual time used to subscribe to observable sequences in unit tests. */\n\t  subscribed: 200,\n\t  /** Default virtual time used to dispose subscriptions in unit tests. */\n\t  disposed: 1000,\n\n\t  /**\n\t   * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n\t   *\n\t   * 1 - ReactiveTest.onNext(200, 42);\n\t   * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n\t   *\n\t   * @param ticks Recorded virtual time the OnNext notification occurs.\n\t   * @param value Recorded value stored in the OnNext notification or a predicate.\n\t   * @return Recorded OnNext notification.\n\t   */\n\t  onNext: function (ticks, value) {\n\t    return typeof value === 'function' ? new Recorded(ticks, new OnNextPredicate(value)) : new Recorded(ticks, Notification.createOnNext(value));\n\t  },\n\t  /**\n\t   * Factory method for an OnError notification record at a given time with a given error.\n\t   *\n\t   * 1 - ReactiveTest.onNext(200, new Error('error'));\n\t   * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n\t   *\n\t   * @param ticks Recorded virtual time the OnError notification occurs.\n\t   * @param exception Recorded exception stored in the OnError notification.\n\t   * @return Recorded OnError notification.\n\t   */\n\t  onError: function (ticks, error) {\n\t    return typeof error === 'function' ? new Recorded(ticks, new OnErrorPredicate(error)) : new Recorded(ticks, Notification.createOnError(error));\n\t  },\n\t  /**\n\t   * Factory method for an OnCompleted notification record at a given time.\n\t   *\n\t   * @param ticks Recorded virtual time the OnCompleted notification occurs.\n\t   * @return Recorded OnCompleted notification.\n\t   */\n\t  onCompleted: function (ticks) {\n\t    return new Recorded(ticks, Notification.createOnCompleted());\n\t  },\n\t  /**\n\t   * Factory method for a subscription record based on a given subscription and disposal time.\n\t   *\n\t   * @param start Virtual time indicating when the subscription was created.\n\t   * @param end Virtual time indicating when the subscription was disposed.\n\t   * @return Subscription object.\n\t   */\n\t  subscribe: function (start, end) {\n\t    return new Subscription(start, end);\n\t  }\n\t};\n\n/***/ },\n/* 259 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar isEqual = __webpack_require__(74);\n\n\t/**\n\t * Creates a new object recording the production of the specified value at the given virtual time.\n\t *\n\t * @constructor\n\t * @param {Number} time Virtual time the value was produced on.\n\t * @param {Mixed} value Value that was produced.\n\t * @param {Function} comparer An optional comparer.\n\t */\n\tfunction Recorded(time, value, comparer) {\n\t  this.time = time;\n\t  this.value = value;\n\t  this.comparer = comparer || isEqual;\n\t}\n\n\t/**\n\t * Checks whether the given recorded object is equal to the current instance.\n\t *\n\t * @param {Recorded} other Recorded object to check for equality.\n\t * @returns {Boolean} true if both objects are equal; false otherwise.\n\t */\n\tRecorded.prototype.equals = function (other) {\n\t  return this.time === other.time && this.comparer(this.value, other.value);\n\t};\n\n\t/**\n\t * Returns a string representation of the current Recorded value.\n\t *\n\t * @returns {String} String representation of the current Recorded value.\n\t */\n\tRecorded.prototype.toString = function () {\n\t  return this.value.toString() + '@' + this.time;\n\t};\n\n\tmodule.exports = Recorded;\n\n/***/ },\n/* 260 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\t/**\n\t * Creates a new subscription object with the given virtual subscription and unsubscription time.\n\t *\n\t * @constructor\n\t * @param {Number} subscribe Virtual time at which the subscription occurred.\n\t * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n\t */\n\n\tfunction Subscription(start, end) {\n\t  this.subscribe = start;\n\t  this.unsubscribe = end || Number.MAX_VALUE;\n\t}\n\n\t/**\n\t * Checks whether the given subscription is equal to the current instance.\n\t * @param other Subscription object to check for equality.\n\t * @returns {Boolean} true if both objects are equal; false otherwise.\n\t */\n\tSubscription.prototype.equals = function (other) {\n\t  return this.subscribe === other.subscribe && this.unsubscribe === other.unsubscribe;\n\t};\n\n\t/**\n\t * Returns a string representation of the current Subscription value.\n\t * @returns {String} String representation of the current Subscription value.\n\t */\n\tSubscription.prototype.toString = function () {\n\t  return '(' + this.subscribe + ', ' + (this.unsubscribe === Number.MAX_VALUE ? 'Infinite' : this.unsubscribe) + ')';\n\t};\n\n\tmodule.exports = Subscription;\n\n/***/ },\n/* 261 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ColdObservable = __webpack_require__(262);\n\tvar Disposable = __webpack_require__(13);\n\tvar HotObservable = __webpack_require__(263);\n\tvar MockObserver = __webpack_require__(264);\n\tvar MockPromise = __webpack_require__(265);\n\tvar MockDisposable = __webpack_require__(266);\n\tvar ReactiveTest = __webpack_require__(258);\n\tvar VirtualTimeScheduler = __webpack_require__(255);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction baseComparer(x, y) {\n\t  return x > y ? 1 : x < y ? -1 : 0;\n\t}\n\n\tfunction TestScheduler() {\n\t  VirtualTimeScheduler.call(this, 0, baseComparer);\n\t}\n\n\tinherits(TestScheduler, VirtualTimeScheduler);\n\n\t/**\n\t * Schedules an action to be executed at the specified virtual time.\n\t *\n\t * @param state State passed to the action to be executed.\n\t * @param dueTime Absolute virtual time at which to execute the action.\n\t * @param action Action to be executed.\n\t * @return Disposable object used to cancel the scheduled action (best effort).\n\t */\n\tTestScheduler.prototype.scheduleAbsolute = function (state, dueTime, action) {\n\t  dueTime <= this.clock && (dueTime = this.clock + 1);\n\t  return VirtualTimeScheduler.prototype.scheduleAbsolute.call(this, state, dueTime, action);\n\t};\n\t/**\n\t * Adds a relative virtual time to an absolute virtual time value.\n\t *\n\t * @param absolute Absolute virtual time value.\n\t * @param relative Relative virtual time value to add.\n\t * @return Resulting absolute virtual time sum value.\n\t */\n\tTestScheduler.prototype.add = function (absolute, relative) {\n\t  return absolute + relative;\n\t};\n\t/**\n\t * Converts the absolute virtual time value to a DateTimeOffset value.\n\t *\n\t * @param absolute Absolute virtual time value to convert.\n\t * @return Corresponding DateTimeOffset value.\n\t */\n\tTestScheduler.prototype.toAbsoluteTime = function (absolute) {\n\t  return new Date(absolute).getTime();\n\t};\n\t/**\n\t * Converts the TimeSpan value to a relative virtual time value.\n\t *\n\t * @param timeSpan TimeSpan value to convert.\n\t * @return Corresponding relative virtual time value.\n\t */\n\tTestScheduler.prototype.toRelativeTime = function (timeSpan) {\n\t  return timeSpan;\n\t};\n\t/**\n\t * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n\t *\n\t * @param create Factory method to create an observable sequence.\n\t * @param created Virtual time at which to invoke the factory to create an observable sequence.\n\t * @param subscribed Virtual time at which to subscribe to the created observable sequence.\n\t * @param disposed Virtual time at which to dispose the subscription.\n\t * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n\t */\n\tTestScheduler.prototype.startScheduler = function (createFn, settings) {\n\t  settings || (settings = {});\n\t  settings.created == null && (settings.created = ReactiveTest.created);\n\t  settings.subscribed == null && (settings.subscribed = ReactiveTest.subscribed);\n\t  settings.disposed == null && (settings.disposed = ReactiveTest.disposed);\n\n\t  var observer = this.createObserver(),\n\t      source,\n\t      subscription;\n\n\t  this.scheduleAbsolute(null, settings.created, function () {\n\t    source = createFn();\n\t    return Disposable.empty;\n\t  });\n\n\t  this.scheduleAbsolute(null, settings.subscribed, function () {\n\t    subscription = source.subscribe(observer);\n\t    return Disposable.empty;\n\t  });\n\n\t  this.scheduleAbsolute(null, settings.disposed, function () {\n\t    subscription.dispose();\n\t    return Disposable.empty;\n\t  });\n\n\t  this.start();\n\n\t  return observer;\n\t};\n\n\t/**\n\t * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n\t * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n\t * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n\t */\n\tTestScheduler.prototype.createHotObservable = function () {\n\t  var len = arguments.length,\n\t      args;\n\t  if (Array.isArray(arguments[0])) {\n\t    args = arguments[0];\n\t  } else {\n\t    args = new Array(len);\n\t    for (var i = 0; i < len; i++) {\n\t      args[i] = arguments[i];\n\t    }\n\t  }\n\t  return new HotObservable(this, args);\n\t};\n\n\t/**\n\t * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n\t * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n\t * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n\t */\n\tTestScheduler.prototype.createColdObservable = function () {\n\t  var len = arguments.length,\n\t      args;\n\t  if (Array.isArray(arguments[0])) {\n\t    args = arguments[0];\n\t  } else {\n\t    args = new Array(len);\n\t    for (var i = 0; i < len; i++) {\n\t      args[i] = arguments[i];\n\t    }\n\t  }\n\t  return new ColdObservable(this, args);\n\t};\n\n\t/**\n\t * Creates a resolved promise with the given value and ticks\n\t * @param {Number} ticks The absolute time of the resolution.\n\t * @param {Any} value The value to yield at the given tick.\n\t * @returns {MockPromise} A mock Promise which fulfills with the given value.\n\t */\n\tTestScheduler.prototype.createResolvedPromise = function (ticks, value) {\n\t  return new MockPromise(this, [ReactiveTest.onNext(ticks, value), ReactiveTest.onCompleted(ticks)]);\n\t};\n\n\t/**\n\t * Creates a rejected promise with the given reason and ticks\n\t * @param {Number} ticks The absolute time of the resolution.\n\t * @param {Any} reason The reason for rejection to yield at the given tick.\n\t * @returns {MockPromise} A mock Promise which rejects with the given reason.\n\t */\n\tTestScheduler.prototype.createRejectedPromise = function (ticks, reason) {\n\t  return new MockPromise(this, [ReactiveTest.onError(ticks, reason)]);\n\t};\n\n\t/**\n\t * Creates an observer that records received notification messages and timestamps those.\n\t * @return Observer that can be used to assert the timing of received notifications.\n\t */\n\tTestScheduler.prototype.createObserver = function () {\n\t  return new MockObserver(this);\n\t};\n\n\t/**\n\t* Creates a disposable that records subscriptions and unsubscriptions.\n\t* @return A Disposable that has the absolute time for subscription and unsubscriptions.\n\t*/\n\tTestScheduler.prototype.createDisposable = function () {\n\t  return new MockDisposable(this);\n\t};\n\n\tmodule.exports = TestScheduler;\n\n/***/ },\n/* 262 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar CompositeDisposable = __webpack_require__(14);\n\tvar Disposable = __webpack_require__(13);\n\tvar Observable = __webpack_require__(8);\n\tvar Subscription = __webpack_require__(260);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction ColdObservable(scheduler, messages) {\n\t  Observable.call(this);\n\t  this.scheduler = scheduler;\n\t  this.messages = messages;\n\t  this.subscriptions = [];\n\t}\n\n\tinherits(ColdObservable, Observable);\n\n\tColdObservable.prototype._subscribe = function (o) {\n\t  var message,\n\t      notification,\n\t      observable = this;\n\t  this.subscriptions.push(new Subscription(this.scheduler.clock));\n\t  var index = this.subscriptions.length - 1;\n\t  var d = new CompositeDisposable();\n\t  for (var i = 0, len = this.messages.length; i < len; i++) {\n\t    message = this.messages[i];\n\t    notification = message.value;\n\t    (function (innerNotification) {\n\t      d.add(observable.scheduler.scheduleRelative(null, message.time, function () {\n\t        innerNotification.accept(o);\n\t        return Disposable.empty;\n\t      }));\n\t    })(notification);\n\t  }\n\t  return Disposable.create(function () {\n\t    observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n\t    d.dispose();\n\t  });\n\t};\n\n\tmodule.exports = ColdObservable;\n\n/***/ },\n/* 263 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Disposable = __webpack_require__(13);\n\tvar Observable = __webpack_require__(8);\n\tvar Subscription = __webpack_require__(260);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction HotObservable(scheduler, messages) {\n\t  Observable.call(this);\n\t  var message,\n\t      notification,\n\t      observable = this;\n\t  this.scheduler = scheduler;\n\t  this.messages = messages;\n\t  this.subscriptions = [];\n\t  this.observers = [];\n\t  for (var i = 0, len = this.messages.length; i < len; i++) {\n\t    message = this.messages[i];\n\t    notification = message.value;\n\t    (function (innerNotification) {\n\t      scheduler.scheduleAbsolute(null, message.time, function () {\n\t        var obs = observable.observers.slice(0);\n\n\t        for (var j = 0, jLen = obs.length; j < jLen; j++) {\n\t          innerNotification.accept(obs[j]);\n\t        }\n\t        return Disposable.empty;\n\t      });\n\t    })(notification);\n\t  }\n\t}\n\n\tinherits(HotObservable, Observable);\n\n\tHotObservable.prototype._subscribe = function (o) {\n\t  var observable = this;\n\t  this.observers.push(o);\n\t  this.subscriptions.push(new Subscription(this.scheduler.clock));\n\t  var index = this.subscriptions.length - 1;\n\t  return Disposable.create(function () {\n\t    var idx = observable.observers.indexOf(o);\n\t    observable.observers.splice(idx, 1);\n\t    observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n\t  });\n\t};\n\n\tmodule.exports = HotObservable;\n\n/***/ },\n/* 264 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Notification = __webpack_require__(142);\n\tvar Observer = __webpack_require__(1);\n\tvar Recorded = __webpack_require__(259);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction MockObserver(scheduler) {\n\t  Observer.call(this);\n\t  this.scheduler = scheduler;\n\t  this.messages = [];\n\t}\n\n\tinherits(MockObserver, Observer);\n\n\tMockObserver.prototype.onNext = function (value) {\n\t  this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnNext(value)));\n\t};\n\n\tMockObserver.prototype.onError = function (e) {\n\t  this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnError(e)));\n\t};\n\n\tMockObserver.prototype.onCompleted = function () {\n\t  this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnCompleted()));\n\t};\n\n\tmodule.exports = MockObserver;\n\n/***/ },\n/* 265 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Disposable = __webpack_require__(13);\n\tvar ReactiveTest = __webpack_require__(258);\n\tvar Subscription = __webpack_require__(260);\n\tvar create = __webpack_require__(2);\n\n\tfunction MockPromise(scheduler, messages) {\n\t  var self = this;\n\t  this.scheduler = scheduler;\n\t  this.messages = messages;\n\t  this.subscriptions = [];\n\t  this.observers = [];\n\t  for (var i = 0, len = this.messages.length; i < len; i++) {\n\t    var message = this.messages[i],\n\t        notification = message.value;\n\t    (function (innerNotification) {\n\t      scheduler.scheduleAbsolute(null, message.time, function () {\n\t        var obs = self.observers.slice(0);\n\n\t        for (var j = 0, jLen = obs.length; j < jLen; j++) {\n\t          innerNotification.accept(obs[j]);\n\t        }\n\t        return Disposable.empty;\n\t      });\n\t    })(notification);\n\t  }\n\t}\n\n\tMockPromise.prototype.then = function (onResolved, onRejected) {\n\t  var self = this;\n\n\t  this.subscriptions.push(new Subscription(this.scheduler.clock));\n\t  var index = this.subscriptions.length - 1;\n\n\t  var newPromise;\n\n\t  var observer = create(function (x) {\n\t    var retValue = onResolved(x);\n\t    if (retValue && typeof retValue.then === 'function') {\n\t      newPromise = retValue;\n\t    } else {\n\t      var ticks = self.scheduler.clock;\n\t      newPromise = new MockPromise(self.scheduler, [ReactiveTest.onNext(ticks, undefined), ReactiveTest.onCompleted(ticks)]);\n\t    }\n\t    var idx = self.observers.indexOf(observer);\n\t    self.observers.splice(idx, 1);\n\t    self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n\t  }, function (err) {\n\t    onRejected(err);\n\t    var idx = self.observers.indexOf(observer);\n\t    self.observers.splice(idx, 1);\n\t    self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n\t  });\n\t  this.observers.push(observer);\n\n\t  return newPromise || new MockPromise(this.scheduler, this.messages);\n\t};\n\n\tmodule.exports = MockPromise;\n\n/***/ },\n/* 266 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tfunction MockDisposable(scheduler) {\n\t  this.scheduler = scheduler;\n\t  this.disposes = [];\n\t  this.disposes.push(this.scheduler.clock);\n\t}\n\n\tMockDisposable.prototype.dispose = function () {\n\t  this.disposes.push(this.scheduler.clock);\n\t};\n\n\tmodule.exports = MockDisposable;\n\n/***/ }\n/******/ ])\n});\n;\n"
  },
  {
    "path": "src/modular/dist/rx.lite.js",
    "content": "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"rx\"] = factory();\n\telse\n\t\troot[\"rx\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Observer = __webpack_require__(1);\n\n\tObserver.addToObject({\n\t  create: __webpack_require__(2)\n\t});\n\n\tvar Observable = __webpack_require__(8);\n\n\tObservable.addToObject({\n\t  bindCallback: __webpack_require__(10),\n\t  bindNodeCallback: __webpack_require__(32),\n\t  catch: __webpack_require__(33),\n\t  concat: __webpack_require__(39),\n\t  create: __webpack_require__(40),\n\t  empty: __webpack_require__(41),\n\t  from: __webpack_require__(42),\n\t  fromArray: __webpack_require__(45),\n\t  fromEvent: __webpack_require__(46),\n\t  fromEventPattern: __webpack_require__(47),\n\t  fromPromise: __webpack_require__(37),\n\t  interval: __webpack_require__(52),\n\t  just: __webpack_require__(53),\n\t  merge: __webpack_require__(54),\n\t  never: __webpack_require__(56),\n\t  of: __webpack_require__(57),\n\t  range: __webpack_require__(58),\n\t  throw: __webpack_require__(59),\n\t  using: __webpack_require__(60),\n\t  zip: __webpack_require__(61)\n\t});\n\n\tObservable.addToPrototype({\n\t  catch: __webpack_require__(33),\n\t  combineLatest: __webpack_require__(63),\n\t  concat: __webpack_require__(39),\n\t  concatAll: __webpack_require__(64),\n\t  debounce: __webpack_require__(66),\n\t  distinctUntilChanged: __webpack_require__(67),\n\t  do: __webpack_require__(69),\n\t  filter: __webpack_require__(70),\n\t  finally: __webpack_require__(71),\n\t  flatMap: __webpack_require__(72),\n\t  flatMapLatest: __webpack_require__(76),\n\t  map: __webpack_require__(78),\n\t  merge: __webpack_require__(54),\n\t  mergeAll: __webpack_require__(55),\n\t  multicast: __webpack_require__(50),\n\t  pluck: __webpack_require__(79),\n\t  publish: __webpack_require__(48),\n\t  publishLast: __webpack_require__(80),\n\t  publishValue: __webpack_require__(81),\n\t  replay: __webpack_require__(83),\n\t  scan: __webpack_require__(86),\n\t  share: __webpack_require__(87),\n\t  shareReplay: __webpack_require__(88),\n\t  shareValue: __webpack_require__(89),\n\t  skip: __webpack_require__(90),\n\t  skipUntil: __webpack_require__(91),\n\t  switch: __webpack_require__(77),\n\t  take: __webpack_require__(92),\n\t  takeUntil: __webpack_require__(93),\n\t  tap: __webpack_require__(69),\n\t  toArray: __webpack_require__(94),\n\t  toPromise: __webpack_require__(95),\n\t  zip: __webpack_require__(61)\n\t});\n\n\t// RxJS V4 aliases\n\tObservable.prototype.selectMany = Observable.prototype.flatMap;\n\tObservable.prototype.select = Observable.prototype.map;\n\tObservable.prototype.where = Observable.prototype.filter;\n\n\t// RxJS V5 aliases\n\tObservable.prototype.mergeMap = Observable.prototype.flatMap;\n\tObservable.prototype.switchMap = Observable.prototype.flatMapLatest;\n\tObservable.prototype.publishReplay = Observable.prototype.replay;\n\tObservable.fromCallback = Observable.bindCallback;\n\tObservable.fromNodeCallback = Observable.bindNodeCallback;\n\n\tvar Subject = __webpack_require__(49);\n\tSubject.addToObject({\n\t  create: __webpack_require__(96)\n\t});\n\n\tvar Rx = {\n\t  // Disposables\n\t  BinaryDisposable: __webpack_require__(30),\n\t  CompositeDisposable: __webpack_require__(22),\n\t  Disposable: __webpack_require__(12),\n\t  NAryDisposable: __webpack_require__(35),\n\t  SerialDisposable: __webpack_require__(36),\n\t  SingleAssignmentDisposable: __webpack_require__(19),\n\n\t  // Scheduler\n\t  Scheduler: __webpack_require__(21),\n\n\t  // Core\n\t  Observer: Observer,\n\t  Observable: Observable,\n\n\t  // Subjects\n\t  AsyncSubject: __webpack_require__(11),\n\t  BehaviorSubject: __webpack_require__(82),\n\t  ReplaySubject: __webpack_require__(84),\n\t  Subject: Subject\n\t};\n\n\tmodule.exports = Rx;\n\n/***/ },\n/* 1 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\t/**\n\t * Supports push-style iteration over an observable sequence.\n\t */\n\n\tfunction Observer() {}\n\n\tObserver.addToObject = function (operators) {\n\t  Object.keys(operators).forEach(function (operator) {\n\t    Observer[operator] = operators[operator];\n\t  });\n\t};\n\n\tObserver.addToPrototype = function (operators) {\n\t  Object.keys(operators).forEach(function (operator) {\n\t    Observer.prototype[operator] = function () {\n\t      var args = [this];\n\t      args.push.apply(args, arguments);\n\t      return operators[operator].apply(null, args);\n\t    };\n\t  });\n\t};\n\n\tmodule.exports = Observer;\n\n/***/ },\n/* 2 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar noop = __webpack_require__(3);\n\tvar AnonymousObserver = __webpack_require__(4);\n\n\tfunction throwError(e) {\n\t  throw e;\n\t}\n\n\t/**\n\t *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n\t * @param {Function} [onNext] Observer's OnNext action implementation.\n\t * @param {Function} [onError] Observer's OnError action implementation.\n\t * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n\t * @returns {Observer} The observer object implemented using the given actions.\n\t */\n\tmodule.exports = function (onNext, onError, onCompleted) {\n\t  return new AnonymousObserver(onNext || noop, onError || throwError, onCompleted || noop);\n\t};\n\n/***/ },\n/* 3 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function noop() {};\n\n/***/ },\n/* 4 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar inherits = __webpack_require__(6);\n\n\t/**\n\t * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n\t * @param {Any} onNext Observer's OnNext action implementation.\n\t * @param {Any} onError Observer's OnError action implementation.\n\t * @param {Any} onCompleted Observer's OnCompleted action implementation.\n\t */\n\tfunction AnonymousObserver(onNext, onError, onCompleted) {\n\t  AbstractObserver.call(this);\n\t  this._onNext = onNext;\n\t  this._onError = onError;\n\t  this._onCompleted = onCompleted;\n\t}\n\n\tinherits(AnonymousObserver, AbstractObserver);\n\n\t/**\n\t * Calls the onNext action.\n\t * @param {Any} value Next element in the sequence.\n\t */\n\tAnonymousObserver.prototype.next = function (value) {\n\t  this._onNext(value);\n\t};\n\n\t/**\n\t * Calls the onError action.\n\t * @param {Any} error The error that has occurred.\n\t */\n\tAnonymousObserver.prototype.error = function (error) {\n\t  this._onError(error);\n\t};\n\n\t/**\n\t *  Calls the onCompleted action.\n\t */\n\tAnonymousObserver.prototype.completed = function () {\n\t  this._onCompleted();\n\t};\n\n\tmodule.exports = AnonymousObserver;\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Observer = __webpack_require__(1);\n\tvar inherits = __webpack_require__(6);\n\tvar NotImplementedError = __webpack_require__(7).NotImplementedError;\n\n\tfunction notImplemented() {\n\t  throw new NotImplementedError();\n\t}\n\n\tfunction AbstractObserver() {\n\t  this.isStopped = false;\n\t  Observer.call(this);\n\t}\n\n\tinherits(AbstractObserver, Observer);\n\n\t// Must be implemented by other observers\n\tAbstractObserver.prototype.next = notImplemented;\n\tAbstractObserver.prototype.error = notImplemented;\n\tAbstractObserver.prototype.completed = notImplemented;\n\n\tAbstractObserver.prototype.onNext = function (value) {\n\t  if (!this.isStopped) {\n\t    this.next(value);\n\t  }\n\t};\n\n\tAbstractObserver.prototype.onError = function (error) {\n\t  if (!this.isStopped) {\n\t    this.isStopped = true;\n\t    this.error(error);\n\t  }\n\t};\n\n\tAbstractObserver.prototype.onCompleted = function () {\n\t  if (!this.isStopped) {\n\t    this.isStopped = true;\n\t    this.completed();\n\t  }\n\t};\n\n\tAbstractObserver.prototype.dispose = function () {\n\t  this.isStopped = true;\n\t};\n\n\tAbstractObserver.prototype.fail = function (e) {\n\t  if (!this.isStopped) {\n\t    this.isStopped = true;\n\t    this.error(e);\n\t    return true;\n\t  }\n\n\t  return false;\n\t};\n\n\tmodule.exports = AbstractObserver;\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\tif (typeof Object.create === 'function') {\n\t  // implementation from standard node.js 'util' module\n\t  module.exports = function inherits(ctor, superCtor) {\n\t    ctor.super_ = superCtor\n\t    ctor.prototype = Object.create(superCtor.prototype, {\n\t      constructor: {\n\t        value: ctor,\n\t        enumerable: false,\n\t        writable: true,\n\t        configurable: true\n\t      }\n\t    });\n\t  };\n\t} else {\n\t  // old school shim for old browsers\n\t  module.exports = function inherits(ctor, superCtor) {\n\t    ctor.super_ = superCtor\n\t    var TempCtor = function () {}\n\t    TempCtor.prototype = superCtor.prototype\n\t    ctor.prototype = new TempCtor()\n\t    ctor.prototype.constructor = ctor\n\t  }\n\t}\n\n\n/***/ },\n/* 7 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tfunction EmptyError() {\n\t  this.message = 'Sequence contains no elements.';\n\t  Error.call(this);\n\t}\n\tEmptyError.prototype = Object.create(Error.prototype);\n\tEmptyError.prototype.name = 'EmptyError';\n\n\tfunction ObjectDisposedError() {\n\t  this.message = 'Object has been disposed';\n\t  Error.call(this);\n\t}\n\tObjectDisposedError.prototype = Object.create(Error.prototype);\n\tObjectDisposedError.prototype.name = 'ObjectDisposedError';\n\n\tfunction ArgumentOutOfRangeError() {\n\t  this.message = 'Argument out of range';\n\t  Error.call(this);\n\t}\n\tArgumentOutOfRangeError.prototype = Object.create(Error.prototype);\n\tArgumentOutOfRangeError.prototype.name = 'ArgumentOutOfRangeError';\n\n\tfunction NotSupportedError(message) {\n\t  this.message = message || 'This operation is not supported';\n\t  Error.call(this);\n\t}\n\tNotSupportedError.prototype = Object.create(Error.prototype);\n\tNotSupportedError.prototype.name = 'NotSupportedError';\n\n\tfunction NotImplementedError(message) {\n\t  this.message = message || 'This operation is not implemented';\n\t  Error.call(this);\n\t}\n\tNotImplementedError.prototype = Object.create(Error.prototype);\n\tNotImplementedError.prototype.name = 'NotImplementedError';\n\n\tfunction CompositeError(errors) {\n\t  this.innerErrors = errors;\n\t  this.message = 'This contains multiple errors. Check the innerErrors';\n\t  Error.call(this);\n\t}\n\n\tCompositeError.prototype = Object.create(Error.prototype);\n\tCompositeError.prototype.name = 'CompositeError';\n\n\tmodule.exports = {\n\t  CompositeError: CompositeError,\n\t  EmptyError: EmptyError,\n\t  ObjectDisposedError: ObjectDisposedError,\n\t  ArgumentOutOfRangeError: ArgumentOutOfRangeError,\n\t  NotSupportedError: NotSupportedError,\n\t  NotImplementedError: NotImplementedError\n\t};\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar create = __webpack_require__(2);\n\tvar isFunction = __webpack_require__(9);\n\n\tfunction Observable() {}\n\n\t/**\n\t* Determines whether the given object is an Observable\n\t* @param {Any} An object to determine whether it is an Observable\n\t* @returns {Boolean} true if an Observable, else false.\n\t*/\n\tObservable.isObservable = function (o) {\n\t  return o && isFunction(o.subscribe);\n\t};\n\n\t/**\n\t *  Subscribes an o to the observable sequence.\n\t *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n\t *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n\t *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n\t *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n\t */\n\tObservable.prototype.subscribe = function (oOrOnNext, onError, onCompleted) {\n\t  return this._subscribe(typeof oOrOnNext === 'object' ? oOrOnNext : create(oOrOnNext, onError, onCompleted));\n\t};\n\n\t/**\n\t * Subscribes to the next value in the sequence with an optional \"this\" argument.\n\t * @param {Function} onNext The function to invoke on each element in the observable sequence.\n\t * @param {Any} [thisArg] Object to use as this when executing callback.\n\t * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n\t */\n\tObservable.prototype.subscribeOnNext = function (onNext, thisArg) {\n\t  return this._subscribe(create(typeof thisArg !== 'undefined' ? function (x) {\n\t    onNext.call(thisArg, x);\n\t  } : onNext));\n\t};\n\n\t/**\n\t * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n\t * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n\t * @param {Any} [thisArg] Object to use as this when executing callback.\n\t * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n\t */\n\tObservable.prototype.subscribeOnError = function (onError, thisArg) {\n\t  return this._subscribe(create(null, typeof thisArg !== 'undefined' ? function (e) {\n\t    onError.call(thisArg, e);\n\t  } : onError));\n\t};\n\n\t/**\n\t * Subscribes to the next value in the sequence with an optional \"this\" argument.\n\t * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n\t * @param {Any} [thisArg] Object to use as this when executing callback.\n\t * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n\t */\n\tObservable.prototype.subscribeOnCompleted = function (onCompleted, thisArg) {\n\t  return this._subscribe(create(null, null, typeof thisArg !== 'undefined' ? function () {\n\t    onCompleted.call(thisArg);\n\t  } : onCompleted));\n\t};\n\n\tObservable.addToObject = function (operators) {\n\t  Object.keys(operators).forEach(function (operator) {\n\t    Observable[operator] = operators[operator];\n\t  });\n\t};\n\n\tObservable.addToPrototype = function (operators) {\n\t  Object.keys(operators).forEach(function (operator) {\n\t    Observable.prototype[operator] = function () {\n\t      var args = [this];\n\t      args.push.apply(args, arguments);\n\t      return operators[operator].apply(null, args);\n\t    };\n\t  });\n\t};\n\n\tmodule.exports = Observable;\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function () {\n\t  var isFn = function (value) {\n\t    return typeof value === 'function' || false;\n\t  };\n\n\t  // fallback for older versions of Chrome and Safari\n\t  if (isFn(/x/)) {\n\t    isFn = function (value) {\n\t      return typeof value === 'function' && Object.prototype.toString.call(value) === '[object Function]';\n\t    };\n\t  }\n\t  return isFn;\n\t}();\n\n/***/ },\n/* 10 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AsyncSubject = __webpack_require__(11);\n\tvar asObservable = __webpack_require__(16);\n\tvar isFunction = __webpack_require__(9);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction createCbHandler(o, ctx, selector) {\n\t  return function handler() {\n\t    var len = arguments.length,\n\t        results = new Array(len);\n\t    for (var i = 0; i < len; i++) {\n\t      results[i] = arguments[i];\n\t    }\n\n\t    if (isFunction(selector)) {\n\t      results = tryCatch(selector).apply(ctx, results);\n\t      if (results === errorObj) {\n\t        return o.onError(results.e);\n\t      }\n\t      o.onNext(results);\n\t    } else {\n\t      if (results.length <= 1) {\n\t        o.onNext(results[0]);\n\t      } else {\n\t        o.onNext(results);\n\t      }\n\t    }\n\n\t    o.onCompleted();\n\t  };\n\t}\n\n\tfunction createCbObservable(fn, ctx, selector, args) {\n\t  var o = new AsyncSubject();\n\n\t  args.push(createCbHandler(o, ctx, selector));\n\t  var res = tryCatch(fn).apply(ctx, args);\n\t  if (res === errorObj) {\n\t    o.onError(res.e);\n\t  }\n\n\t  return asObservable(o);\n\t}\n\n\t/**\n\t * Converts a callback function to an observable sequence.\n\t *\n\t * @param {Function} fn Function with a callback as the last parameter to convert to an Observable sequence.\n\t * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n\t * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n\t * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n\t */\n\tmodule.exports = function bindCallback(fn, ctx, selector) {\n\t  return function () {\n\t    typeof ctx === 'undefined' && (ctx = this);\n\n\t    var len = arguments.length,\n\t        args = new Array(len);\n\t    for (var i = 0; i < len; i++) {\n\t      args[i] = arguments[i];\n\t    }\n\t    return createCbObservable(fn, ctx, selector, args);\n\t  };\n\t};\n\n/***/ },\n/* 11 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Disposable = __webpack_require__(12);\n\tvar Observable = __webpack_require__(8);\n\tvar Observer = __webpack_require__(1);\n\tvar InnerSubscription = __webpack_require__(13);\n\tvar addProperties = __webpack_require__(14);\n\tvar cloneArray = __webpack_require__(15);\n\tvar inherits = __webpack_require__(6);\n\n\t/**\n\t*  Represents the result of an asynchronous operation.\n\t*  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n\t*/\n\tfunction AsyncSubject() {\n\t  Observable.call(this);\n\t  this.isDisposed = false;\n\t  this.isStopped = false;\n\t  this.hasValue = false;\n\t  this.observers = [];\n\t  this.hasError = false;\n\t}\n\n\tinherits(AsyncSubject, Observable);\n\n\taddProperties(AsyncSubject.prototype, Observer.prototype, {\n\t  _subscribe: function (o) {\n\t    Disposable.checkDisposed(this);\n\n\t    if (!this.isStopped) {\n\t      this.observers.push(o);\n\t      return new InnerSubscription(this, o);\n\t    }\n\n\t    if (this.hasError) {\n\t      o.onError(this.error);\n\t    } else if (this.hasValue) {\n\t      o.onNext(this.value);\n\t      o.onCompleted();\n\t    } else {\n\t      o.onCompleted();\n\t    }\n\n\t    return Disposable.empty;\n\t  },\n\t  /**\n\t   * Indicates whether the subject has observers subscribed to it.\n\t   * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n\t   */\n\t  hasObservers: function () {\n\t    Disposable.checkDisposed(this);\n\t    return this.observers.length > 0;\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n\t   */\n\t  onCompleted: function () {\n\t    var i;\n\t    Disposable.checkDisposed(this);\n\t    if (!this.isStopped) {\n\t      this.isStopped = true;\n\t      var os = cloneArray(this.observers),\n\t          len = os.length;\n\n\t      if (this.hasValue) {\n\t        for (i = 0; i < len; i++) {\n\t          var o = os[i];\n\t          o.onNext(this.value);\n\t          o.onCompleted();\n\t        }\n\t      } else {\n\t        for (i = 0; i < len; i++) {\n\t          os[i].onCompleted();\n\t        }\n\t      }\n\n\t      this.observers.length = 0;\n\t    }\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the error.\n\t   * @param {Mixed} error The Error to send to all observers.\n\t   */\n\t  onError: function (error) {\n\t    Disposable.checkDisposed(this);\n\t    if (!this.isStopped) {\n\t      this.isStopped = true;\n\t      this.hasError = true;\n\t      this.error = error;\n\n\t      for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t        os[i].onError(error);\n\t      }\n\n\t      this.observers.length = 0;\n\t    }\n\t  },\n\t  /**\n\t   * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n\t   * @param {Mixed} value The value to store in the subject.\n\t   */\n\t  onNext: function (value) {\n\t    Disposable.checkDisposed(this);\n\t    if (this.isStopped) {\n\t      return;\n\t    }\n\t    this.value = value;\n\t    this.hasValue = true;\n\t  },\n\t  /**\n\t   * Unsubscribe all observers and release resources.\n\t   */\n\t  dispose: function () {\n\t    this.isDisposed = true;\n\t    this.observers = null;\n\t    this.error = null;\n\t    this.value = null;\n\t  }\n\t});\n\n\tmodule.exports = AsyncSubject;\n\n/***/ },\n/* 12 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar noop = __webpack_require__(3);\n\tvar isFunction = __webpack_require__(9);\n\tvar ObjectDisposedError = __webpack_require__(7).ObjectDisposedError;\n\n\t/**\n\t * Provides a set of static methods for creating Disposables.\n\t * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n\t */\n\tfunction Disposable(action) {\n\t  this.isDisposed = false;\n\t  this.action = action || noop;\n\t}\n\n\t/** Performs the task of cleaning up resources. */\n\tDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this.action();\n\t    this.isDisposed = true;\n\t  }\n\t};\n\n\t/**\n\t * Creates a disposable object that invokes the specified action when disposed.\n\t * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n\t * @return {Disposable} The disposable object that runs the given action upon disposal.\n\t */\n\tDisposable.create = function (action) {\n\t  return new Disposable(action);\n\t};\n\n\t/**\n\t * Gets the disposable that does nothing when disposed.\n\t */\n\tDisposable.empty = { dispose: noop };\n\n\t/**\n\t * Validates whether the given object is a disposable\n\t * @param {Object} Object to test whether it has a dispose method\n\t * @returns {Boolean} true if a disposable object, else false.\n\t */\n\tDisposable.isDisposable = function (d) {\n\t  return d && isFunction(d.dispose);\n\t};\n\n\tDisposable.checkDisposed = function (disposable) {\n\t  if (disposable.isDisposed) {\n\t    throw new ObjectDisposedError();\n\t  }\n\t};\n\n\tDisposable._fixup = function (result) {\n\t  return Disposable.isDisposable(result) ? result : Disposable.empty;\n\t};\n\n\tmodule.exports = Disposable;\n\n/***/ },\n/* 13 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tfunction InnerSubscription(s, o) {\n\t  this._s = s;\n\t  this._o = o;\n\t}\n\n\tInnerSubscription.prototype.dispose = function () {\n\t  if (!this._s.isDisposed && this._o !== null) {\n\t    var idx = this._s.observers.indexOf(this._o);\n\t    this._s.observers.splice(idx, 1);\n\t    this._o = null;\n\t  }\n\t};\n\n\tmodule.exports = InnerSubscription;\n\n/***/ },\n/* 14 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function addProperties() {\n\t  var obj = arguments[0];\n\t  for (var sources = [], i = 1, len = arguments.length; i < len; i++) {\n\t    sources.push(arguments[i]);\n\t  }\n\t  for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n\t    var source = sources[idx];\n\t    for (var prop in source) {\n\t      obj[prop] = source[prop];\n\t    }\n\t  }\n\t};\n\n/***/ },\n/* 15 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function cloneArray(arr) {\n\t  var len = arr.length,\n\t      a = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    a[i] = arr[i];\n\t  }\n\t  return a;\n\t};\n\n/***/ },\n/* 16 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AnonymousObservable = __webpack_require__(17);\n\n\tfunction createAsObservable(source) {\n\t  return function subscribe(o) {\n\t    return source.subscribe(o);\n\t  };\n\t}\n\n\t/**\n\t *  Hides the identity of an observable sequence.\n\t * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n\t */\n\tmodule.exports = function asObservable(source) {\n\t  return new AnonymousObservable(createAsObservable(source), source);\n\t};\n\n/***/ },\n/* 17 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar inherits = __webpack_require__(6);\n\tvar isFunction = __webpack_require__(9);\n\tvar Observable = __webpack_require__(8);\n\tvar Disposable = __webpack_require__(12);\n\tvar AutoDetachObserver = __webpack_require__(18);\n\tvar Scheduler = __webpack_require__(21);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj,\n\t    thrower = tryCatchUtils.thrower;\n\n\t// Fix subscriber to check for undefined or function returned to decorate as Disposable\n\tfunction fixSubscriber(subscriber) {\n\t  return subscriber && isFunction(subscriber.dispose) ? subscriber : isFunction(subscriber) ? Disposable.create(subscriber) : Disposable.empty;\n\t}\n\n\tfunction setDisposable(s, state) {\n\t  var ado = state[0],\n\t      self = state[1];\n\t  var sub = tryCatch(self.__subscribe).call(self, ado);\n\t  if (sub === errorObj && !ado.fail(sub.e)) {\n\t    thrower(sub.e);\n\t  }\n\t  ado.setDisposable(fixSubscriber(sub));\n\t}\n\n\tfunction AnonymousObservable(subscribe, parent) {\n\t  this.source = parent;\n\t  this.__subscribe = subscribe;\n\t  Observable.call(this);\n\t}\n\n\tinherits(AnonymousObservable, Observable);\n\n\tAnonymousObservable.prototype._subscribe = function (o) {\n\t  var ado = new AutoDetachObserver(o),\n\t      state = [ado, this];\n\n\t  if (Scheduler.queue.scheduleRequired()) {\n\t    Scheduler.queue.schedule(state, setDisposable);\n\t  } else {\n\t    setDisposable(null, state);\n\t  }\n\t  return ado;\n\t};\n\n\tmodule.exports = AnonymousObservable;\n\n/***/ },\n/* 18 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar SingleAssignmentDisposable = __webpack_require__(19);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj,\n\t    thrower = tryCatchUtils.thrower;\n\n\tfunction AutoDetachObserver(observer) {\n\t  AbstractObserver.call(this);\n\t  this.observer = observer;\n\t  this.m = new SingleAssignmentDisposable();\n\t}\n\n\tinherits(AutoDetachObserver, AbstractObserver);\n\n\tAutoDetachObserver.prototype.next = function (value) {\n\t  var result = tryCatch(this.observer.onNext).call(this.observer, value);\n\t  if (result === errorObj) {\n\t    this.dispose();\n\t    thrower(result.e);\n\t  }\n\t};\n\n\tAutoDetachObserver.prototype.error = function (err) {\n\t  var result = tryCatch(this.observer.onError).call(this.observer, err);\n\t  this.dispose();\n\t  result === errorObj && thrower(result.e);\n\t};\n\n\tAutoDetachObserver.prototype.completed = function () {\n\t  var result = tryCatch(this.observer.onCompleted).call(this.observer);\n\t  this.dispose();\n\t  result === errorObj && thrower(result.e);\n\t};\n\n\tAutoDetachObserver.prototype.setDisposable = function (value) {\n\t  this.m.setDisposable(value);\n\t};\n\tAutoDetachObserver.prototype.getDisposable = function () {\n\t  return this.m.getDisposable();\n\t};\n\n\tAutoDetachObserver.prototype.dispose = function () {\n\t  AbstractObserver.prototype.dispose.call(this);\n\t  this.m.dispose();\n\t};\n\n\tmodule.exports = AutoDetachObserver;\n\n/***/ },\n/* 19 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tfunction SingleAssignmentDisposable() {\n\t  this.isDisposed = false;\n\t  this._current = null;\n\t}\n\n\tSingleAssignmentDisposable.prototype.getDisposable = function () {\n\t  return this._current;\n\t};\n\n\tSingleAssignmentDisposable.prototype.setDisposable = function (value) {\n\t  if (this._current) {\n\t    throw new Error('Disposable has already been assigned');\n\t  }\n\t  var shouldDispose = this.isDisposed;\n\t  !shouldDispose && (this._current = value);\n\t  shouldDispose && value && value.dispose();\n\t};\n\n\tSingleAssignmentDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this.isDisposed = true;\n\t    var old = this._current;\n\t    this._current = null;\n\t    old && old.dispose();\n\t  }\n\t};\n\n\tmodule.exports = SingleAssignmentDisposable;\n\n/***/ },\n/* 20 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar isFunction = __webpack_require__(9);\n\tvar errorObj = module.exports.errorObj = { e: {} };\n\n\tfunction tryCatcherGen(tryCatchTarget) {\n\t  return function tryCatcher() {\n\t    try {\n\t      return tryCatchTarget.apply(this, arguments);\n\t    } catch (e) {\n\t      errorObj.e = e;\n\t      return errorObj;\n\t    }\n\t  };\n\t}\n\n\tmodule.exports.tryCatch = function tryCatch(fn) {\n\t  if (!isFunction(fn)) {\n\t    throw new TypeError('fn must be a function');\n\t  }\n\t  return tryCatcherGen(fn);\n\t};\n\n\tmodule.exports.thrower = function thrower(e) {\n\t  throw e;\n\t};\n\n/***/ },\n/* 21 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n\tvar errors = __webpack_require__(7);\n\tvar Disposable = __webpack_require__(12);\n\tvar CompositeDisposable = __webpack_require__(22);\n\n\tfunction Scheduler() {}\n\n\t/** Determines whether the given object is a scheduler */\n\tScheduler.isScheduler = function (s) {\n\t  return s instanceof Scheduler;\n\t};\n\n\t/**\n\t* Schedules an action to be executed.\n\t* @param state State passed to the action to be executed.\n\t* @param {Function} action Action to be executed.\n\t* @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n\t*/\n\tScheduler.prototype.schedule = function (state, action) {\n\t  throw new errors.NotImplementedError();\n\t};\n\n\t/**\n\t* Schedules an action to be executed after dueTime.\n\t* @param state State passed to the action to be executed.\n\t* @param {Function} action Action to be executed.\n\t* @param {Number} dueTime Relative time after which to execute the action.\n\t* @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n\t*/\n\tScheduler.prototype.scheduleFuture = function (state, dueTime, action) {\n\t  var dt = dueTime;\n\t  dt instanceof Date && (dt = dt - this.now());\n\t  dt = Scheduler.normalize(dt);\n\n\t  if (dt === 0) {\n\t    return this.schedule(state, action);\n\t  }\n\n\t  return this._scheduleFuture(state, dt, action);\n\t};\n\n\tScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n\t  throw new errors.NotImplementedError();\n\t};\n\n\tfunction PeriodicDisposable(id) {\n\t  this._id = id;\n\t  this.isDisposed = false;\n\t}\n\n\tPeriodicDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this.isDisposed = true;\n\t    global.clearInterval(this._id);\n\t  }\n\t};\n\n\t/**\n\t * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n\t * @param {Mixed} state Initial state passed to the action upon the first iteration.\n\t * @param {Number} period Period for running the work periodically.\n\t * @param {Function} action Action to be executed, potentially updating the state.\n\t * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n\t */\n\tScheduler.prototype.schedulePeriodic = function (state, period, action) {\n\t  if (typeof global.setInterval === 'undefined') {\n\t    throw new errors.NotSupportedError();\n\t  }\n\t  period = Scheduler.normalize(period);\n\t  var s = state,\n\t      id = global.setInterval(function () {\n\t    s = action(s);\n\t  }, period);\n\t  return new PeriodicDisposable(id);\n\t};\n\n\tfunction invokeRecImmediate(scheduler, pair) {\n\t  var state = pair[0],\n\t      action = pair[1],\n\t      group = new CompositeDisposable();\n\t  action(state, innerAction);\n\t  return group;\n\n\t  function innerAction(state2) {\n\t    var isAdded = false,\n\t        isDone = false;\n\n\t    var d = scheduler.schedule(state2, scheduleWork);\n\t    if (!isDone) {\n\t      group.add(d);\n\t      isAdded = true;\n\t    }\n\n\t    function scheduleWork(_, state3) {\n\t      if (isAdded) {\n\t        group.remove(d);\n\t      } else {\n\t        isDone = true;\n\t      }\n\t      action(state3, innerAction);\n\t      return Disposable.empty;\n\t    }\n\t  }\n\t}\n\n\tfunction invokeRecDate(scheduler, pair) {\n\t  var state = pair[0],\n\t      action = pair[1],\n\t      group = new CompositeDisposable();\n\t  action(state, innerAction);\n\t  return group;\n\n\t  function innerAction(state2, dueTime1) {\n\t    var isAdded = false,\n\t        isDone = false;\n\n\t    var d = scheduler.scheduleFuture(state2, dueTime1, scheduleWork);\n\t    if (!isDone) {\n\t      group.add(d);\n\t      isAdded = true;\n\t    }\n\n\t    function scheduleWork(_, state3) {\n\t      if (isAdded) {\n\t        group.remove(d);\n\t      } else {\n\t        isDone = true;\n\t      }\n\t      action(state3, innerAction);\n\t      return Disposable.empty;\n\t    }\n\t  }\n\t}\n\n\t/**\n\t * Schedules an action to be executed recursively.\n\t * @param {Mixed} state State passed to the action to be executed.\n\t * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n\t * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n\t */\n\tScheduler.prototype.scheduleRecursive = function (state, action) {\n\t  return this.schedule([state, action], invokeRecImmediate);\n\t};\n\n\t/**\n\t * Schedules an action to be executed recursively after a specified relative or absolute due time.\n\t * @param {Mixed} state State passed to the action to be executed.\n\t * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n\t * @param {Number | Date} dueTime Relative or absolute time after which to execute the action for the first time.\n\t * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n\t */\n\tScheduler.prototype.scheduleRecursiveFuture = function (state, dueTime, action) {\n\t  return this.scheduleFuture([state, action], dueTime, invokeRecDate);\n\t};\n\n\tvar defaultNow = function () {\n\t  return !!Date.now ? Date.now : function () {\n\t    return +new Date();\n\t  };\n\t}();\n\n\t/** Gets the current time according to the local machine's system clock. */\n\tScheduler.now = defaultNow;\n\n\t/** Gets the current time according to the local machine's system clock. */\n\tScheduler.prototype.now = defaultNow;\n\n\t/**\n\t * Normalizes the specified TimeSpan value to a positive value.\n\t * @param {Number} timeSpan The time span value to normalize.\n\t * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n\t */\n\tScheduler.normalize = function (timeSpan) {\n\t  timeSpan < 0 && (timeSpan = 0);\n\t  return timeSpan;\n\t};\n\n\tmodule.exports = Scheduler;\n\n\tvar CurrentThreadScheduler = __webpack_require__(23);\n\tvar ImmediateScheduler = __webpack_require__(27);\n\tvar DefaultScheduler = __webpack_require__(28);\n\tvar CatchScheduler = __webpack_require__(31);\n\n\tScheduler.queue = Scheduler.currentThread = new CurrentThreadScheduler();\n\tScheduler.async = Scheduler['default'] = Scheduler.timeout = new DefaultScheduler();\n\tScheduler.immediate = new ImmediateScheduler();\n\n\t/**\n\t * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n\t * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n\t * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n\t */\n\tScheduler.prototype['catch'] = function (handler) {\n\t  return new CatchScheduler(this, handler);\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 22 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\t/**\n\t * Represents a group of disposable resources that are disposed together.\n\t * @constructor\n\t */\n\n\tfunction CompositeDisposable() {\n\t  var args = [],\n\t      i,\n\t      len;\n\t  if (Array.isArray(arguments[0])) {\n\t    args = arguments[0];\n\t    len = args.length;\n\t  } else {\n\t    len = arguments.length;\n\t    args = new Array(len);\n\t    for (i = 0; i < len; i++) {\n\t      args[i] = arguments[i];\n\t    }\n\t  }\n\t  this.disposables = args;\n\t  this.isDisposed = false;\n\t  this.length = args.length;\n\t}\n\n\t/**\n\t * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n\t * @param {Mixed} item Disposable to add.\n\t */\n\tCompositeDisposable.prototype.add = function (item) {\n\t  if (this.isDisposed) {\n\t    item.dispose();\n\t  } else {\n\t    this.disposables.push(item);\n\t    this.length++;\n\t  }\n\t};\n\n\t/**\n\t * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n\t * @param {Mixed} item Disposable to remove.\n\t * @returns {Boolean} true if found; false otherwise.\n\t */\n\tCompositeDisposable.prototype.remove = function (item) {\n\t  var shouldDispose = false;\n\t  if (!this.isDisposed) {\n\t    var idx = this.disposables.indexOf(item);\n\t    if (idx !== -1) {\n\t      shouldDispose = true;\n\t      this.disposables.splice(idx, 1);\n\t      this.length--;\n\t      item.dispose();\n\t    }\n\t  }\n\t  return shouldDispose;\n\t};\n\n\t/**\n\t *  Disposes all disposables in the group and removes them from the group.\n\t */\n\tCompositeDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this.isDisposed = true;\n\t    var len = this.disposables.length,\n\t        currentDisposables = new Array(len);\n\t    for (var i = 0; i < len; i++) {\n\t      currentDisposables[i] = this.disposables[i];\n\t    }\n\t    this.disposables = [];\n\t    this.length = 0;\n\n\t    for (i = 0; i < len; i++) {\n\t      currentDisposables[i].dispose();\n\t    }\n\t  }\n\t};\n\n\tmodule.exports = CompositeDisposable;\n\n/***/ },\n/* 23 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Scheduler = __webpack_require__(21);\n\tvar ScheduledItem = __webpack_require__(24);\n\tvar PriorityQueue = __webpack_require__(26);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj,\n\t    thrower = tryCatchUtils.thrower;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction CurrentThreadScheduler() {\n\t  Scheduler.call(this);\n\t}\n\n\tCurrentThreadScheduler.queue = null;\n\n\tinherits(CurrentThreadScheduler, Scheduler);\n\n\tfunction runTrampoline() {\n\t  while (CurrentThreadScheduler.queue.length > 0) {\n\t    var item = CurrentThreadScheduler.queue.dequeue();\n\t    !item.isCancelled() && item.invoke();\n\t  }\n\t}\n\n\tCurrentThreadScheduler.prototype.schedule = function (state, action) {\n\t  var si = new ScheduledItem(this, state, action, this.now());\n\n\t  if (!CurrentThreadScheduler.queue) {\n\t    CurrentThreadScheduler.queue = new PriorityQueue(4);\n\t    CurrentThreadScheduler.queue.enqueue(si);\n\n\t    var result = tryCatch(runTrampoline)();\n\t    CurrentThreadScheduler.queue = null;\n\t    if (result === errorObj) {\n\t      thrower(result.e);\n\t    }\n\t  } else {\n\t    CurrentThreadScheduler.queue.enqueue(si);\n\t  }\n\t  return si.disposable;\n\t};\n\n\tCurrentThreadScheduler.prototype.scheduleRequired = function () {\n\t  return !CurrentThreadScheduler.queue;\n\t};\n\n\tmodule.exports = CurrentThreadScheduler;\n\n/***/ },\n/* 24 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Disposable = __webpack_require__(12);\n\tvar SingleAssignmentDisposable = __webpack_require__(19);\n\tvar cmp = __webpack_require__(25);\n\n\tfunction ScheduledItem(scheduler, state, action, dueTime, comparer) {\n\t  this.scheduler = scheduler;\n\t  this.state = state;\n\t  this.action = action;\n\t  this.dueTime = dueTime;\n\t  this.comparer = comparer || cmp;\n\t  this.disposable = new SingleAssignmentDisposable();\n\t}\n\n\tScheduledItem.prototype.invoke = function () {\n\t  this.disposable.setDisposable(this.invokeCore());\n\t};\n\n\tScheduledItem.prototype.compareTo = function (other) {\n\t  return this.comparer(this.dueTime, other.dueTime);\n\t};\n\n\tScheduledItem.prototype.isCancelled = function () {\n\t  return this.disposable.isDisposed;\n\t};\n\n\tScheduledItem.prototype.invokeCore = function () {\n\t  return Disposable._fixup(this.action(this.scheduler, this.state));\n\t};\n\n\tmodule.exports = ScheduledItem;\n\n/***/ },\n/* 25 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function comparer(x, y) {\n\t  if (x > y) {\n\t    return 1;\n\t  }\n\t  if (y > x) {\n\t    return -1;\n\t  }\n\t  return 0;\n\t};\n\n/***/ },\n/* 26 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tfunction IndexedItem(id, value) {\n\t  this.id = id;\n\t  this.value = value;\n\t}\n\n\tIndexedItem.prototype.compareTo = function (other) {\n\t  var c = this.value.compareTo(other.value);\n\t  c === 0 && (c = this.id - other.id);\n\t  return c;\n\t};\n\n\tfunction PriorityQueue(capacity) {\n\t  this.items = new Array(capacity);\n\t  this.length = 0;\n\t}\n\n\tPriorityQueue.prototype.isHigherPriority = function (left, right) {\n\t  return this.items[left].compareTo(this.items[right]) < 0;\n\t};\n\n\tPriorityQueue.prototype.percolate = function (index) {\n\t  if (index >= this.length || index < 0) {\n\t    return;\n\t  }\n\t  var parent = index - 1 >> 1;\n\t  if (parent < 0 || parent === index) {\n\t    return;\n\t  }\n\t  if (this.isHigherPriority(index, parent)) {\n\t    var temp = this.items[index];\n\t    this.items[index] = this.items[parent];\n\t    this.items[parent] = temp;\n\t    this.percolate(parent);\n\t  }\n\t};\n\n\tPriorityQueue.prototype.heapify = function (index) {\n\t  +index || (index = 0);\n\t  if (index >= this.length || index < 0) {\n\t    return;\n\t  }\n\t  var left = 2 * index + 1,\n\t      right = 2 * index + 2,\n\t      first = index;\n\t  if (left < this.length && this.isHigherPriority(left, first)) {\n\t    first = left;\n\t  }\n\t  if (right < this.length && this.isHigherPriority(right, first)) {\n\t    first = right;\n\t  }\n\t  if (first !== index) {\n\t    var temp = this.items[index];\n\t    this.items[index] = this.items[first];\n\t    this.items[first] = temp;\n\t    this.heapify(first);\n\t  }\n\t};\n\n\tPriorityQueue.prototype.peek = function () {\n\t  return this.items[0].value;\n\t};\n\n\tPriorityQueue.prototype.removeAt = function (index) {\n\t  this.items[index] = this.items[--this.length];\n\t  this.items[this.length] = undefined;\n\t  this.heapify();\n\t};\n\n\tPriorityQueue.prototype.dequeue = function () {\n\t  var result = this.peek();\n\t  this.removeAt(0);\n\t  return result;\n\t};\n\n\tPriorityQueue.prototype.enqueue = function (item) {\n\t  var index = this.length++;\n\t  this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n\t  this.percolate(index);\n\t};\n\n\tPriorityQueue.prototype.remove = function (item) {\n\t  for (var i = 0; i < this.length; i++) {\n\t    if (this.items[i].value === item) {\n\t      this.removeAt(i);\n\t      return true;\n\t    }\n\t  }\n\t  return false;\n\t};\n\n\tPriorityQueue.count = 0;\n\n\tmodule.exports = PriorityQueue;\n\n/***/ },\n/* 27 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Scheduler = __webpack_require__(21);\n\tvar Disposable = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction ImmediateScheduler() {\n\t  Scheduler.call(this);\n\t}\n\n\tinherits(ImmediateScheduler, Scheduler);\n\n\tImmediateScheduler.prototype.schedule = function (state, action) {\n\t  return Disposable._fixup(action(this, state));\n\t};\n\n\tmodule.exports = ImmediateScheduler;\n\n/***/ },\n/* 28 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global, process) {'use strict';\n\n\tvar Disposable = __webpack_require__(12);\n\tvar BinaryDisposable = __webpack_require__(30);\n\tvar SingleAssignmentDisposable = __webpack_require__(19);\n\tvar Scheduler = __webpack_require__(21);\n\tvar isFunction = __webpack_require__(9);\n\tvar noop = __webpack_require__(3);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj,\n\t    thrower = tryCatchUtils.thrower;\n\tvar inherits = __webpack_require__(6);\n\n\tvar scheduleMethod, clearMethod;\n\n\t(function () {\n\n\t  var nextHandle = 1,\n\t      tasksByHandle = {},\n\t      currentlyRunning = false;\n\n\t  clearMethod = function (handle) {\n\t    delete tasksByHandle[handle];\n\t  };\n\n\t  function runTask(handle) {\n\t    if (currentlyRunning) {\n\t      global.setTimeout(function () {\n\t        runTask(handle);\n\t      }, 0);\n\t    } else {\n\t      var task = tasksByHandle[handle];\n\t      if (task) {\n\t        currentlyRunning = true;\n\t        var result = tryCatch(task)();\n\t        clearMethod(handle);\n\t        currentlyRunning = false;\n\t        if (result === errorObj) {\n\t          thrower(result.e);\n\t        }\n\t      }\n\t    }\n\t  }\n\n\t  var setImmediate = global.setImmediate;\n\n\t  function postMessageSupported() {\n\t    // Ensure not in a worker\n\t    if (!global.postMessage || global.importScripts) {\n\t      return false;\n\t    }\n\t    var isAsync = false,\n\t        oldHandler = global.onmessage;\n\t    // Test for async\n\t    global.onmessage = function () {\n\t      isAsync = true;\n\t    };\n\t    global.postMessage('', '*');\n\t    global.onmessage = oldHandler;\n\n\t    return isAsync;\n\t  }\n\n\t  // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n\t  if (isFunction(setImmediate)) {\n\t    scheduleMethod = function (action) {\n\t      var id = nextHandle++;\n\t      tasksByHandle[id] = action;\n\t      setImmediate(function () {\n\t        runTask(id);\n\t      });\n\n\t      return id;\n\t    };\n\t  } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n\t    scheduleMethod = function (action) {\n\t      var id = nextHandle++;\n\t      tasksByHandle[id] = action;\n\t      process.nextTick(function () {\n\t        runTask(id);\n\t      });\n\n\t      return id;\n\t    };\n\t  } else if (postMessageSupported()) {\n\t    var MSG_PREFIX = 'ms.rx.schedule' + Math.random();\n\n\t    var onGlobalPostMessage = function (event) {\n\t      // Only if we're a match to avoid any other global events\n\t      if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n\t        runTask(event.data.substring(MSG_PREFIX.length));\n\t      }\n\t    };\n\n\t    global.addEventListener('message', onGlobalPostMessage, false);\n\n\t    scheduleMethod = function (action) {\n\t      var id = nextHandle++;\n\t      tasksByHandle[id] = action;\n\t      global.postMessage(MSG_PREFIX + id, '*');\n\t      return id;\n\t    };\n\t  } else if (!!global.MessageChannel) {\n\t    var channel = new global.MessageChannel();\n\n\t    channel.port1.onmessage = function (e) {\n\t      runTask(e.data);\n\t    };\n\n\t    scheduleMethod = function (action) {\n\t      var id = nextHandle++;\n\t      tasksByHandle[id] = action;\n\t      channel.port2.postMessage(id);\n\t      return id;\n\t    };\n\t  } else if ('document' in global && 'onreadystatechange' in global.document.createElement('script')) {\n\n\t    scheduleMethod = function (action) {\n\t      var scriptElement = global.document.createElement('script');\n\t      var id = nextHandle++;\n\t      tasksByHandle[id] = action;\n\n\t      scriptElement.onreadystatechange = function () {\n\t        runTask(id);\n\t        scriptElement.onreadystatechange = null;\n\t        scriptElement.parentNode.removeChild(scriptElement);\n\t        scriptElement = null;\n\t      };\n\t      global.document.documentElement.appendChild(scriptElement);\n\t      return id;\n\t    };\n\t  } else {\n\t    scheduleMethod = function (action) {\n\t      var id = nextHandle++;\n\t      tasksByHandle[id] = action;\n\t      global.setTimeout(function () {\n\t        runTask(id);\n\t      }, 0);\n\n\t      return id;\n\t    };\n\t  }\n\t})();\n\n\t/**\n\t* Gets a scheduler that schedules work via a timed callback based upon platform.\n\t*/\n\tfunction DefaultScheduler() {\n\t  Scheduler.call(this);\n\t}\n\n\tinherits(DefaultScheduler, Scheduler);\n\n\tfunction scheduleAction(disposable, action, scheduler, state) {\n\t  return function schedule() {\n\t    disposable.setDisposable(Disposable._fixup(action(scheduler, state)));\n\t  };\n\t}\n\n\tfunction ClearDisposable(method, id) {\n\t  this._id = id;\n\t  this._method = method;\n\t  this.isDisposed = false;\n\t}\n\n\tClearDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this.isDisposed = true;\n\t    this._method.call(null, this._id);\n\t  }\n\t};\n\n\tDefaultScheduler.prototype.schedule = function (state, action) {\n\t  var disposable = new SingleAssignmentDisposable(),\n\t      id = scheduleMethod(scheduleAction(disposable, action, this, state));\n\n\t  return new BinaryDisposable(disposable, new ClearDisposable(clearMethod, id));\n\t};\n\n\tDefaultScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n\t  if (dueTime === 0) {\n\t    return this.schedule(state, action);\n\t  }\n\n\t  var disposable = new SingleAssignmentDisposable(),\n\t      id = global.setTimeout(scheduleAction(disposable, action, this, state), dueTime);\n\n\t  return new BinaryDisposable(disposable, new ClearDisposable(global.clearTimeout, id));\n\t};\n\n\tmodule.exports = DefaultScheduler;\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()), __webpack_require__(29)))\n\n/***/ },\n/* 29 */\n/***/ function(module, exports) {\n\n\t// shim for using process in browser\n\n\tvar process = module.exports = {};\n\tvar queue = [];\n\tvar draining = false;\n\tvar currentQueue;\n\tvar queueIndex = -1;\n\n\tfunction cleanUpNextTick() {\n\t    draining = false;\n\t    if (currentQueue.length) {\n\t        queue = currentQueue.concat(queue);\n\t    } else {\n\t        queueIndex = -1;\n\t    }\n\t    if (queue.length) {\n\t        drainQueue();\n\t    }\n\t}\n\n\tfunction drainQueue() {\n\t    if (draining) {\n\t        return;\n\t    }\n\t    var timeout = setTimeout(cleanUpNextTick);\n\t    draining = true;\n\n\t    var len = queue.length;\n\t    while(len) {\n\t        currentQueue = queue;\n\t        queue = [];\n\t        while (++queueIndex < len) {\n\t            if (currentQueue) {\n\t                currentQueue[queueIndex].run();\n\t            }\n\t        }\n\t        queueIndex = -1;\n\t        len = queue.length;\n\t    }\n\t    currentQueue = null;\n\t    draining = false;\n\t    clearTimeout(timeout);\n\t}\n\n\tprocess.nextTick = function (fun) {\n\t    var args = new Array(arguments.length - 1);\n\t    if (arguments.length > 1) {\n\t        for (var i = 1; i < arguments.length; i++) {\n\t            args[i - 1] = arguments[i];\n\t        }\n\t    }\n\t    queue.push(new Item(fun, args));\n\t    if (queue.length === 1 && !draining) {\n\t        setTimeout(drainQueue, 0);\n\t    }\n\t};\n\n\t// v8 likes predictible objects\n\tfunction Item(fun, array) {\n\t    this.fun = fun;\n\t    this.array = array;\n\t}\n\tItem.prototype.run = function () {\n\t    this.fun.apply(null, this.array);\n\t};\n\tprocess.title = 'browser';\n\tprocess.browser = true;\n\tprocess.env = {};\n\tprocess.argv = [];\n\tprocess.version = ''; // empty string to avoid regexp issues\n\tprocess.versions = {};\n\n\tfunction noop() {}\n\n\tprocess.on = noop;\n\tprocess.addListener = noop;\n\tprocess.once = noop;\n\tprocess.off = noop;\n\tprocess.removeListener = noop;\n\tprocess.removeAllListeners = noop;\n\tprocess.emit = noop;\n\n\tprocess.binding = function (name) {\n\t    throw new Error('process.binding is not supported');\n\t};\n\n\tprocess.cwd = function () { return '/' };\n\tprocess.chdir = function (dir) {\n\t    throw new Error('process.chdir is not supported');\n\t};\n\tprocess.umask = function() { return 0; };\n\n\n/***/ },\n/* 30 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tfunction BinaryDisposable(first, second) {\n\t  this._first = first;\n\t  this._second = second;\n\t  this.isDisposed = false;\n\t}\n\n\tBinaryDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this.isDisposed = true;\n\t    var old1 = this._first;\n\t    this._first = null;\n\t    old1 && old1.dispose();\n\t    var old2 = this._second;\n\t    this._second = null;\n\t    old2 && old2.dispose();\n\t  }\n\t};\n\n\tmodule.exports = BinaryDisposable;\n\n/***/ },\n/* 31 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Scheduler = __webpack_require__(21);\n\tvar Disposable = __webpack_require__(12);\n\tvar SingleAssignmentDisposable = __webpack_require__(19);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj,\n\t    thrower = tryCatchUtils.thrower;\n\n\tfunction CatchScheduler(scheduler, handler) {\n\t  this._scheduler = scheduler;\n\t  this._handler = handler;\n\t  this._recursiveOriginal = null;\n\t  this._recursiveWrapper = null;\n\t  Scheduler.call(this);\n\t}\n\n\tinherits(CatchScheduler, Scheduler);\n\n\tCatchScheduler.prototype.schedule = function (state, action) {\n\t  return this._scheduler.schedule(state, this._wrap(action));\n\t};\n\n\tCatchScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n\t  return this._scheduler.schedule(state, dueTime, this._wrap(action));\n\t};\n\n\tCatchScheduler.prototype.now = function () {\n\t  return this._scheduler.now();\n\t};\n\n\tCatchScheduler.prototype._clone = function (scheduler) {\n\t  return new CatchScheduler(scheduler, this._handler);\n\t};\n\n\tCatchScheduler.prototype._wrap = function (action) {\n\t  var parent = this;\n\t  return function (self, state) {\n\t    var res = tryCatch(action)(parent._getRecursiveWrapper(self), state);\n\t    if (res === errorObj) {\n\t      if (!parent._handler(res.e)) {\n\t        thrower(res.e);\n\t      }\n\t      return Disposable.empty;\n\t    }\n\t    return Disposable._fixup(res);\n\t  };\n\t};\n\n\tCatchScheduler.prototype._getRecursiveWrapper = function (scheduler) {\n\t  if (this._recursiveOriginal !== scheduler) {\n\t    this._recursiveOriginal = scheduler;\n\t    var wrapper = this._clone(scheduler);\n\t    wrapper._recursiveOriginal = scheduler;\n\t    wrapper._recursiveWrapper = wrapper;\n\t    this._recursiveWrapper = wrapper;\n\t  }\n\t  return this._recursiveWrapper;\n\t};\n\n\tCatchScheduler.prototype.schedulePeriodic = function (state, period, action) {\n\t  var self = this,\n\t      failed = false,\n\t      d = new SingleAssignmentDisposable();\n\n\t  d.setDisposable(this._scheduler.schedulePeriodic(state, period, function (state1) {\n\t    if (failed) {\n\t      return null;\n\t    }\n\t    var res = tryCatch(action)(state1);\n\t    if (res === errorObj) {\n\t      failed = true;\n\t      if (!self._handler(res.e)) {\n\t        thrower(res.e);\n\t      }\n\t      d.dispose();\n\t      return null;\n\t    }\n\t    return res;\n\t  }));\n\n\t  return d;\n\t};\n\n\tmodule.exports = CatchScheduler;\n\n/***/ },\n/* 32 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AsyncSubject = __webpack_require__(11);\n\tvar asObservable = __webpack_require__(16);\n\tvar isFunction = __webpack_require__(9);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction createNodeHandler(o, ctx, selector) {\n\t  return function handler() {\n\t    var err = arguments[0];\n\t    if (err) {\n\t      return o.onError(err);\n\t    }\n\n\t    var len = arguments.length,\n\t        results = [];\n\t    for (var i = 1; i < len; i++) {\n\t      results[i - 1] = arguments[i];\n\t    }\n\n\t    if (isFunction(selector)) {\n\t      results = tryCatch(selector).apply(ctx, results);\n\t      if (results === errorObj) {\n\t        return o.onError(results.e);\n\t      }\n\t      o.onNext(results);\n\t    } else {\n\t      if (results.length <= 1) {\n\t        o.onNext(results[0]);\n\t      } else {\n\t        o.onNext(results);\n\t      }\n\t    }\n\n\t    o.onCompleted();\n\t  };\n\t}\n\n\tfunction createNodeObservable(fn, ctx, selector, args) {\n\t  var o = new AsyncSubject();\n\n\t  args.push(createNodeHandler(o, ctx, selector));\n\t  var res = tryCatch(fn).apply(ctx, args);\n\t  if (res === errorObj) {\n\t    o.onError(res.e);\n\t  }\n\n\t  return asObservable(o);\n\t}\n\n\t/**\n\t * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n\t * @param {Function} fn The function to call\n\t * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n\t * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n\t * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n\t */\n\tmodule.exports = function bindNodeCallback(fn, ctx, selector) {\n\t  return function () {\n\t    typeof ctx === 'undefined' && (ctx = this);\n\t    var len = arguments.length,\n\t        args = new Array(len);\n\t    for (var i = 0; i < len; i++) {\n\t      args[i] = arguments[i];\n\t    }\n\t    return createNodeObservable(fn, ctx, selector, args);\n\t  };\n\t};\n\n/***/ },\n/* 33 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Scheduler = __webpack_require__(21);\n\tvar NAryDisposable = __webpack_require__(35);\n\tvar SerialDisposable = __webpack_require__(36);\n\tvar SingleAssignmentDisposable = __webpack_require__(19);\n\tvar fromPromise = __webpack_require__(37);\n\tvar isPromise = __webpack_require__(38);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction CatchObserver(state, recurse) {\n\t  this._state = state;\n\t  this._recurse = recurse;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(CatchObserver, AbstractObserver);\n\n\tCatchObserver.prototype.next = function (x) {\n\t  this._state.o.onNext(x);\n\t};\n\tCatchObserver.prototype.error = function (e) {\n\t  this._state.lastError = e;this._recurse(this._state);\n\t};\n\tCatchObserver.prototype.completed = function () {\n\t  this._state.o.onCompleted();\n\t};\n\n\tfunction CatchObservable(sources) {\n\t  this.sources = sources;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(CatchObservable, ObservableBase);\n\n\tfunction scheduleMethod(state, recurse) {\n\t  if (state.isDisposed) {\n\t    return;\n\t  }\n\t  if (state.i < state.sources.length) {\n\t    var currentValue = state.sources[state.i++];\n\t    isPromise(currentValue) && (currentValue = fromPromise(currentValue));\n\n\t    var d = new SingleAssignmentDisposable();\n\t    state.subscription.setDisposable(d);\n\t    d.setDisposable(currentValue.subscribe(new CatchObserver(state, recurse)));\n\t  } else {\n\t    if (state.lastError !== null) {\n\t      state.o.onError(state.lastError);\n\t    } else {\n\t      state.o.onCompleted();\n\t    }\n\t  }\n\t}\n\n\tfunction IsDisposedDisposable(s) {\n\t  this._s = s;\n\t}\n\n\tIsDisposedDisposable.prototype.dispose = function () {\n\t  !this._s.isDisposed && (this._s.isDisposed = true);\n\t};\n\n\tCatchObservable.prototype.subscribeCore = function (o) {\n\t  var subscription = new SerialDisposable();\n\t  var state = {\n\t    isDisposed: false,\n\t    sources: this.sources,\n\t    i: 0,\n\t    subscription: subscription,\n\t    lastError: null,\n\t    o: o\n\t  };\n\n\t  var cancelable = Scheduler.queue.scheduleRecursive(state, scheduleMethod);\n\t  return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n\t};\n\n\tmodule.exports = function catch_() {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  return new CatchObservable(args);\n\t};\n\n/***/ },\n/* 34 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar inherits = __webpack_require__(6);\n\tvar isFunction = __webpack_require__(9);\n\tvar errors = __webpack_require__(7);\n\tvar Observable = __webpack_require__(8);\n\tvar Scheduler = __webpack_require__(21);\n\tvar Disposable = __webpack_require__(12);\n\tvar AutoDetachObserver = __webpack_require__(18);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj,\n\t    thrower = tryCatchUtils.thrower;\n\n\tfunction fixSubscriber(subscriber) {\n\t  return subscriber && isFunction(subscriber.dispose) ? subscriber : isFunction(subscriber) ? Disposable.create(subscriber) : Disposable.empty;\n\t}\n\n\tfunction setDisposable(s, state) {\n\t  var ado = state[0],\n\t      self = state[1];\n\t  var sub = tryCatch(self.subscribeCore).call(self, ado);\n\t  if (sub === errorObj && !ado.fail(sub.e)) {\n\t    thrower(sub.e);\n\t  }\n\t  ado.setDisposable(fixSubscriber(sub));\n\t}\n\n\tfunction ObservableBase() {\n\t  Observable.call(this);\n\t}\n\n\tinherits(ObservableBase, Observable);\n\n\tObservableBase.prototype._subscribe = function (o) {\n\t  var ado = new AutoDetachObserver(o),\n\t      state = [ado, this];\n\n\t  if (Scheduler.queue.scheduleRequired()) {\n\t    Scheduler.queue.schedule(state, setDisposable);\n\t  } else {\n\t    setDisposable(null, state);\n\t  }\n\t  return ado;\n\t};\n\n\tObservableBase.prototype.subscribeCore = function () {\n\t  throw new errors.NotImplementedError();\n\t};\n\n\tmodule.exports = ObservableBase;\n\n/***/ },\n/* 35 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tfunction NAryDisposable(disposables) {\n\t  this._disposables = disposables;\n\t  this.isDisposed = false;\n\t}\n\n\tNAryDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this.isDisposed = true;\n\t    for (var i = 0, len = this._disposables.length; i < len; i++) {\n\t      this._disposables[i].dispose();\n\t    }\n\t    this._disposables.length = 0;\n\t  }\n\t};\n\n\tmodule.exports = NAryDisposable;\n\n/***/ },\n/* 36 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tfunction SerialDisposable() {\n\t  this.isDisposed = false;\n\t  this._current = null;\n\t}\n\n\tSerialDisposable.prototype.getDisposable = function () {\n\t  return this._current;\n\t};\n\n\tSerialDisposable.prototype.setDisposable = function (value) {\n\t  var shouldDispose = this.isDisposed;\n\t  if (!shouldDispose) {\n\t    var old = this._current;\n\t    this._current = value;\n\t    old && old.dispose();\n\t  }\n\n\t  shouldDispose && value && value.dispose();\n\t};\n\n\tSerialDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this.isDisposed = true;\n\t    var old = this._current;\n\t    this._current = null;\n\t    old && old.dispose();\n\t  }\n\t};\n\n\tmodule.exports = SerialDisposable;\n\n/***/ },\n/* 37 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar Scheduler = __webpack_require__(21);\n\tvar SingleAssignmentDisposable = __webpack_require__(19);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar isFunction = __webpack_require__(9);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction FromPromiseObservable(p, s) {\n\t  this._p = p;\n\t  this._s = s;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(FromPromiseObservable, ObservableBase);\n\n\tfunction scheduleNext(s, state) {\n\t  var o = state[0],\n\t      data = state[1];\n\t  o.onNext(data);\n\t  o.onCompleted();\n\t}\n\n\tfunction scheduleError(s, state) {\n\t  var o = state[0],\n\t      err = state[1];\n\t  o.onError(err);\n\t}\n\n\tFromPromiseObservable.prototype.subscribeCore = function (o) {\n\t  var sad = new SingleAssignmentDisposable(),\n\t      self = this,\n\t      p = self._p;\n\n\t  if (isFunction(p)) {\n\t    p = tryCatch(p)();\n\t    if (p === errorObj) {\n\t      o.onError(p.e);\n\t      return sad;\n\t    }\n\t  }\n\n\t  p.then(function (data) {\n\t    sad.setDisposable(self._s.schedule([o, data], scheduleNext));\n\t  }, function (err) {\n\t    sad.setDisposable(self._s.schedule([o, err], scheduleError));\n\t  });\n\n\t  return sad;\n\t};\n\n\t/**\n\t* Converts a Promise to an Observable sequence\n\t* @param {Promise|Function} An ES6 Compliant promise or a function that returns one\n\t* @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n\t*/\n\tmodule.exports = function fromPromise(promise, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  return new FromPromiseObservable(promise, scheduler);\n\t};\n\n/***/ },\n/* 38 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar isFunction = __webpack_require__(9);\n\n\tmodule.exports = function isPromise(p) {\n\t  return p && isFunction(p.then);\n\t};\n\n/***/ },\n/* 39 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Scheduler = __webpack_require__(21);\n\tvar Disposable = __webpack_require__(12);\n\tvar NAryDisposable = __webpack_require__(35);\n\tvar SerialDisposable = __webpack_require__(36);\n\tvar SingleAssignmentDisposable = __webpack_require__(19);\n\tvar fromPromise = __webpack_require__(37);\n\tvar isPromise = __webpack_require__(38);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction ConcatObserver(s, fn) {\n\t  this._s = s;\n\t  this._fn = fn;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(ConcatObserver, AbstractObserver);\n\n\tConcatObserver.prototype.next = function (x) {\n\t  this._s.o.onNext(x);\n\t};\n\tConcatObserver.prototype.error = function (e) {\n\t  this._s.o.onError(e);\n\t};\n\tConcatObserver.prototype.completed = function () {\n\t  this._s.i++;this._fn(this._s);\n\t};\n\n\tfunction ConcatObservable(sources) {\n\t  this._sources = sources;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(ConcatObservable, ObservableBase);\n\n\tfunction scheduleRecursive(state, recurse) {\n\t  if (state.disposable.isDisposed) {\n\t    return;\n\t  }\n\t  if (state.i === state.sources.length) {\n\t    return state.o.onCompleted();\n\t  }\n\n\t  // Check if promise\n\t  var currentValue = state.sources[state.i];\n\t  isPromise(currentValue) && (currentValue = fromPromise(currentValue));\n\n\t  var d = new SingleAssignmentDisposable();\n\t  state.subscription.setDisposable(d);\n\t  d.setDisposable(currentValue.subscribe(new ConcatObserver(state, recurse)));\n\t}\n\n\tConcatObservable.prototype.subscribeCore = function (o) {\n\t  var subscription = new SerialDisposable();\n\t  var disposable = Disposable.create();\n\t  var state = {\n\t    o: o,\n\t    i: 0,\n\t    subscription: subscription,\n\t    disposable: disposable,\n\t    sources: this._sources\n\t  };\n\n\t  var cancelable = Scheduler.immediate.scheduleRecursive(state, scheduleRecursive);\n\t  return new NAryDisposable([subscription, disposable, cancelable]);\n\t};\n\n\t/**\n\t * Concatenates all the observable sequences.\n\t * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n\t * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n\t */\n\tmodule.exports = function concat() {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  return new ConcatObservable(args);\n\t};\n\n/***/ },\n/* 40 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AnonymousObservable = __webpack_require__(17);\n\n\t/**\n\t *  Creates an observable sequence from a specified subscribe method implementation.\n\t * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n\t * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n\t */\n\tmodule.exports = function create(subscribe, parent) {\n\t  return new AnonymousObservable(subscribe, parent);\n\t};\n\n/***/ },\n/* 41 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar Disposable = __webpack_require__(12);\n\tvar Scheduler = __webpack_require__(21);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction scheduleItem(s, state) {\n\t  state.onCompleted();\n\t  return Disposable.empty;\n\t}\n\n\tfunction EmptyObservable(scheduler) {\n\t  this._scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(EmptyObservable, ObservableBase);\n\n\tEmptyObservable.prototype.subscribeCore = function (o) {\n\t  return this.scheduler === Scheduler.immediate ? scheduleItem(null, o) : this._scheduler.schedule(o, scheduleItem);\n\t};\n\n\tvar EMPTY_OBSERVABLE = new EmptyObservable(Scheduler.immediate);\n\n\t/**\n\t *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n\t *\n\t * @example\n\t *  var res = Rx.Observable.empty();\n\t *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n\t * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n\t * @returns {Observable} An observable sequence with no elements.\n\t */\n\tmodule.exports = function empty(scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.immediate);\n\t  return scheduler === Scheduler.immediate ? EMPTY_OBSERVABLE : new EmptyObservable(scheduler);\n\t};\n\n/***/ },\n/* 42 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar Scheduler = __webpack_require__(21);\n\tvar isFunction = __webpack_require__(9);\n\tvar $iterator$ = __webpack_require__(43);\n\tvar bindCallback = __webpack_require__(44);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tvar doneEnumerator = { done: true, value: undefined };\n\tvar maxSafeInteger = Math.pow(2, 53) - 1;\n\n\tfunction numberIsFinite(value) {\n\t  return typeof value === 'number' && global.isFinite(value);\n\t}\n\n\tfunction sign(value) {\n\t  var number = +value;\n\t  if (number === 0) {\n\t    return number;\n\t  }\n\t  if (isNaN(number)) {\n\t    return number;\n\t  }\n\t  return number < 0 ? -1 : 1;\n\t}\n\n\tfunction toLength(o) {\n\t  var len = +o.length;\n\t  if (isNaN(len)) {\n\t    return 0;\n\t  }\n\t  if (len === 0 || !numberIsFinite(len)) {\n\t    return len;\n\t  }\n\t  len = sign(len) * Math.floor(Math.abs(len));\n\t  if (len <= 0) {\n\t    return 0;\n\t  }\n\t  if (len > maxSafeInteger) {\n\t    return maxSafeInteger;\n\t  }\n\t  return len;\n\t}\n\n\tfunction StringIterator(s) {\n\t  this._s = s;\n\t  this._l = s.length;\n\t  this._i = 0;\n\t}\n\n\tStringIterator.prototype[$iterator$] = function () {\n\t  return this;\n\t};\n\n\tStringIterator.prototype.next = function () {\n\t  return this._i < this._l ? { done: false, value: this._s.charAt(this._i++) } : doneEnumerator;\n\t};\n\n\tfunction StringIterable(s) {\n\t  this._s = s;\n\t}\n\n\tStringIterable.prototype[$iterator$] = function () {\n\t  return new StringIterator(this._s);\n\t};\n\n\tfunction ArrayIterator(a) {\n\t  this._a = a;\n\t  this._l = toLength(a);\n\t  this._i = 0;\n\t}\n\n\tArrayIterator.prototype[$iterator$] = function () {\n\t  return this;\n\t};\n\n\tArrayIterator.prototype.next = function () {\n\t  return this._i < this._l ? { done: false, value: this._a[this._i++] } : doneEnumerator;\n\t};\n\n\tfunction ArrayIterable(a) {\n\t  this._a = a;\n\t}\n\n\tArrayIterable.prototype[$iterator$] = function () {\n\t  return new ArrayIterator(this._a);\n\t};\n\n\tfunction getIterable(o) {\n\t  var i = o[$iterator$],\n\t      it;\n\t  if (!i && typeof o === 'string') {\n\t    it = new StringIterable(o);\n\t    return it[$iterator$]();\n\t  }\n\t  if (!i && o.length !== undefined) {\n\t    it = new ArrayIterable(o);\n\t    return it[$iterator$]();\n\t  }\n\t  if (!i) {\n\t    throw new TypeError('Object is not iterable');\n\t  }\n\t  return o[$iterator$]();\n\t}\n\n\tfunction FromObservable(iterable, fn, scheduler) {\n\t  this._iterable = iterable;\n\t  this._fn = fn;\n\t  this._scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(FromObservable, ObservableBase);\n\n\tfunction scheduleRecursive(o, it, fn) {\n\t  return function loopRecursive(i, recurse) {\n\t    var next = tryCatch(it.next).call(it);\n\t    if (next === errorObj) {\n\t      return o.onError(next.e);\n\t    }\n\t    if (next.done) {\n\t      return o.onCompleted();\n\t    }\n\n\t    var result = next.value;\n\n\t    if (isFunction(fn)) {\n\t      result = tryCatch(fn)(result, i);\n\t      if (result === errorObj) {\n\t        return o.onError(result.e);\n\t      }\n\t    }\n\n\t    o.onNext(result);\n\t    recurse(i + 1);\n\t  };\n\t}\n\n\tFromObservable.prototype.subscribeCore = function (o) {\n\t  var list = Object(this._iterable),\n\t      it = getIterable(list);\n\n\t  return this._scheduler.scheduleRecursive(0, scheduleRecursive(o, it, this._fn));\n\t};\n\n\t/**\n\t* This method creates a new Observable sequence from an array-like or iterable object.\n\t* @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n\t* @param {Function} [mapFn] Map function to call on every element of the array.\n\t* @param {Any} [thisArg] The context to use calling the mapFn if provided.\n\t* @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n\t*/\n\tmodule.exports = function (iterable, mapFn, thisArg, scheduler) {\n\t  if (iterable == null) {\n\t    throw new Error('iterable cannot be null.');\n\t  }\n\t  if (mapFn && !isFunction(mapFn)) {\n\t    throw new Error('mapFn when provided must be a function');\n\t  }\n\n\t  var mapper;\n\t  if (mapFn) {\n\t    mapper = bindCallback(mapFn, thisArg, 2);\n\t  }\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.queue);\n\t  return new FromObservable(iterable, mapper, scheduler);\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 43 */\n/***/ function(module, exports) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n\t// Shim in iterator support\n\n\tvar $iterator$ = typeof global.Symbol === 'function' && global.Symbol.iterator || '_es6shim_iterator_';\n\t// Bug for mozilla version\n\tif (global.Set && typeof new global.Set()['@@iterator'] === 'function') {\n\t  $iterator$ = '@@iterator';\n\t}\n\n\tmodule.exports = $iterator$;\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 44 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function bindCallback(func, thisArg, argCount) {\n\t  if (typeof thisArg === 'undefined') {\n\t    return func;\n\t  }\n\t  switch (argCount) {\n\t    case 0:\n\t      return function () {\n\t        return func.call(thisArg);\n\t      };\n\t    case 1:\n\t      return function (arg) {\n\t        return func.call(thisArg, arg);\n\t      };\n\t    case 2:\n\t      return function (value, index) {\n\t        return func.call(thisArg, value, index);\n\t      };\n\t    case 3:\n\t      return function (value, index, collection) {\n\t        return func.call(thisArg, value, index, collection);\n\t      };\n\t  }\n\n\t  return function () {\n\t    return func.apply(thisArg, arguments);\n\t  };\n\t};\n\n/***/ },\n/* 45 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar Scheduler = __webpack_require__(21);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction scheduleRecursive(state, recurse) {\n\t  if (state.i < state.len) {\n\t    state.o.onNext(state.args[state.i++]);\n\t    recurse(state);\n\t  } else {\n\t    state.o.onCompleted();\n\t  }\n\t}\n\n\tfunction FromArrayObservable(args, scheduler) {\n\t  this._args = args;\n\t  this._scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(FromArrayObservable, ObservableBase);\n\n\tFromArrayObservable.prototype.subscribeCore = function (o) {\n\t  var state = {\n\t    i: 0,\n\t    args: this._args,\n\t    len: this._args.length,\n\t    o: o\n\t  };\n\t  return this._scheduler.scheduleRecursive(state, scheduleRecursive);\n\t};\n\n\tmodule.exports = function fromArray(array, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.queue);\n\t  return new FromArrayObservable(array, scheduler);\n\t};\n\n/***/ },\n/* 46 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar fromEventPattern = __webpack_require__(47);\n\tvar publish = __webpack_require__(48);\n\tvar CompositeDisposable = __webpack_require__(22);\n\tvar isFunction = __webpack_require__(9);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction isNodeList(el) {\n\t  if (global.StaticNodeList) {\n\t    // IE8 Specific\n\t    // instanceof is slower than Object#toString, but Object#toString will not work as intended in IE8\n\t    return el instanceof global.StaticNodeList || el instanceof global.NodeList;\n\t  } else {\n\t    return Object.prototype.toString.call(el) === '[object NodeList]';\n\t  }\n\t}\n\n\tfunction ListenDisposable(e, n, fn) {\n\t  this._e = e;\n\t  this._n = n;\n\t  this._fn = fn;\n\t  this._e.addEventListener(this._n, this._fn, false);\n\t  this.isDisposed = false;\n\t}\n\n\tListenDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this._e.removeEventListener(this._n, this._fn, false);\n\t    this.isDisposed = true;\n\t  }\n\t};\n\n\tfunction createEventListener(el, eventName, handler) {\n\t  var disposables = new CompositeDisposable();\n\n\t  // Asume NodeList or HTMLCollection\n\t  var elemToString = Object.prototype.toString.call(el);\n\t  if (isNodeList(el) || elemToString === '[object HTMLCollection]') {\n\t    for (var i = 0, len = el.length; i < len; i++) {\n\t      disposables.add(createEventListener(el.item(i), eventName, handler));\n\t    }\n\t  } else if (el) {\n\t    disposables.add(new ListenDisposable(el, eventName, handler));\n\t  }\n\n\t  return disposables;\n\t}\n\n\t/**\n\t * Configuration option to determine whether to use native events only\n\t */\n\tglobal.Rx || (global.Rx = {});\n\tglobal.Rx.config || (global.Rx.config = {});\n\tglobal.Rx.config.useNativeEvents = false;\n\n\tfunction EventObservable(el, name, fn) {\n\t  this._el = el;\n\t  this._n = name;\n\t  this._fn = fn;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(EventObservable, ObservableBase);\n\n\tfunction createHandler(o, fn) {\n\t  return function handler() {\n\t    var results = arguments[0];\n\t    if (isFunction(fn)) {\n\t      results = tryCatch(fn).apply(null, arguments);\n\t      if (results === errorObj) {\n\t        return o.onError(results.e);\n\t      }\n\t    }\n\t    o.onNext(results);\n\t  };\n\t}\n\n\tEventObservable.prototype.subscribeCore = function (o) {\n\t  return createEventListener(this._el, this._n, createHandler(o, this._fn));\n\t};\n\n\t/**\n\t * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n\t * @param {Object} element The DOMElement or NodeList to attach a listener.\n\t * @param {String} eventName The event name to attach the observable sequence.\n\t * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n\t * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n\t */\n\tmodule.exports = function fromEvent(element, eventName, selector) {\n\t  // Node.js specific\n\t  if (element.addListener) {\n\t    return fromEventPattern(function (h) {\n\t      element.addListener(eventName, h);\n\t    }, function (h) {\n\t      element.removeListener(eventName, h);\n\t    }, selector);\n\t  }\n\n\t  // Use only if non-native events are allowed\n\t  if (!global.Rx.config.useNativeEvents) {\n\t    // Handles jq, Angular.js, Zepto, Marionette, Ember.js\n\t    if (typeof element.on === 'function' && typeof element.off === 'function') {\n\t      return fromEventPattern(function (h) {\n\t        element.on(eventName, h);\n\t      }, function (h) {\n\t        element.off(eventName, h);\n\t      }, selector);\n\t    }\n\t  }\n\n\t  return publish(new EventObservable(element, eventName, selector)).refCount();\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 47 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar publish = __webpack_require__(48);\n\tvar isFunction = __webpack_require__(9);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction EventPatternDisposable(del, fn, ret) {\n\t  this._del = del;\n\t  this._fn = fn;\n\t  this._ret = ret;\n\t  this.isDisposed = false;\n\t}\n\n\tEventPatternDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    isFunction(this._del) && this._del(this._fn, this._ret);\n\t    this.isDisposed = true;\n\t  }\n\t};\n\n\tfunction EventPatternObservable(add, del, fn) {\n\t  this._add = add;\n\t  this._del = del;\n\t  this._fn = fn;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(EventPatternObservable, ObservableBase);\n\n\tfunction createHandler(o, fn) {\n\t  return function handler() {\n\t    var results = arguments[0];\n\t    if (isFunction(fn)) {\n\t      results = tryCatch(fn).apply(null, arguments);\n\t      if (results === errorObj) {\n\t        return o.onError(results.e);\n\t      }\n\t    }\n\t    o.onNext(results);\n\t  };\n\t}\n\n\tEventPatternObservable.prototype.subscribeCore = function (o) {\n\t  var fn = createHandler(o, this._fn);\n\t  var returnValue = this._add(fn);\n\t  return new EventPatternDisposable(this._del, fn, returnValue);\n\t};\n\n\t/**\n\t * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n\t * @param {Function} addHandler The function to add a handler to the emitter.\n\t * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n\t * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n\t * @returns {Observable} An observable sequence which wraps an event from an event emitter\n\t */\n\tmodule.exports = function fromEventPattern(addHandler, removeHandler, selector) {\n\t  return publish(new EventPatternObservable(addHandler, removeHandler, selector)).refCount();\n\t};\n\n/***/ },\n/* 48 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Subject = __webpack_require__(49);\n\tvar multicast = __webpack_require__(50);\n\tvar isFunction = __webpack_require__(9);\n\n\t/**\n\t * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n\t * This operator is a specialization of Multicast using a regular Subject.\n\t * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n\t * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n\t */\n\tmodule.exports = function publish(source, fn) {\n\t  return fn && isFunction(fn) ? multicast(source, function () {\n\t    return new Subject();\n\t  }, fn) : multicast(source, new Subject());\n\t};\n\n/***/ },\n/* 49 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Disposable = __webpack_require__(12);\n\tvar Observable = __webpack_require__(8);\n\tvar Observer = __webpack_require__(1);\n\tvar InnerSubscription = __webpack_require__(13);\n\tvar addProperties = __webpack_require__(14);\n\tvar cloneArray = __webpack_require__(15);\n\tvar inherits = __webpack_require__(6);\n\n\t/**\n\t*  Represents an object that is both an observable sequence as well as an observer.\n\t*  Each notification is broadcasted to all subscribed observers.\n\t*/\n\tfunction Subject() {\n\t  Observable.call(this);\n\t  this.isDisposed = false;\n\t  this.isStopped = false;\n\t  this.observers = [];\n\t  this.hasError = false;\n\t}\n\n\tinherits(Subject, Observable);\n\n\taddProperties(Subject.prototype, Observer.prototype, {\n\t  _subscribe: function (o) {\n\t    Disposable.checkDisposed(this);\n\t    if (!this.isStopped) {\n\t      this.observers.push(o);\n\t      return new InnerSubscription(this, o);\n\t    }\n\t    if (this.hasError) {\n\t      o.onError(this.error);\n\t      return Disposable.empty;\n\t    }\n\t    o.onCompleted();\n\t    return Disposable.empty;\n\t  },\n\t  /**\n\t   * Indicates whether the subject has observers subscribed to it.\n\t   * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n\t   */\n\t  hasObservers: function () {\n\t    Disposable.checkDisposed(this);\n\t    return this.observers.length > 0;\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the end of the sequence.\n\t   */\n\t  onCompleted: function () {\n\t    Disposable.checkDisposed(this);\n\t    if (!this.isStopped) {\n\t      this.isStopped = true;\n\t      for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t        os[i].onCompleted();\n\t      }\n\n\t      this.observers.length = 0;\n\t    }\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the exception.\n\t   * @param {Mixed} error The exception to send to all observers.\n\t   */\n\t  onError: function (error) {\n\t    Disposable.checkDisposed(this);\n\t    if (!this.isStopped) {\n\t      this.isStopped = true;\n\t      this.error = error;\n\t      this.hasError = true;\n\t      for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t        os[i].onError(error);\n\t      }\n\n\t      this.observers.length = 0;\n\t    }\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n\t   * @param {Mixed} value The value to send to all observers.\n\t   */\n\t  onNext: function (value) {\n\t    Disposable.checkDisposed(this);\n\t    if (!this.isStopped) {\n\t      for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t        os[i].onNext(value);\n\t      }\n\t    }\n\t  },\n\t  /**\n\t   * Unsubscribe all observers and release resources.\n\t   */\n\t  dispose: function () {\n\t    this.isDisposed = true;\n\t    this.observers = null;\n\t  }\n\t});\n\n\tSubject.addToObject = function (operators) {\n\t  Object.keys(operators).forEach(function (operator) {\n\t    Subject[operator] = operators[operator];\n\t  });\n\t};\n\n\tSubject.addToPrototype = function (operators) {\n\t  Object.keys(operators).forEach(function (operator) {\n\t    Subject.prototype[operator] = function () {\n\t      var args = [this];\n\t      args.push.apply(args, arguments);\n\t      return operators[operator].apply(null, args);\n\t    };\n\t  });\n\t};\n\n\tmodule.exports = Subject;\n\n/***/ },\n/* 50 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar ConnectableObservable = __webpack_require__(51);\n\tvar BinaryDisposable = __webpack_require__(30);\n\tvar isFunction = __webpack_require__(9);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction MulticastObservable(source, fn1, fn2) {\n\t  this.source = source;\n\t  this._fn1 = fn1;\n\t  this._fn2 = fn2;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(MulticastObservable, ObservableBase);\n\n\tMulticastObservable.prototype.subscribeCore = function (o) {\n\t  var connectable = this.source.multicast(this._fn1());\n\t  return new BinaryDisposable(this._fn2(connectable).subscribe(o), connectable.connect());\n\t};\n\n\t/**\n\t * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n\t * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n\t * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n\t * @param {Function|Subject} subjectOrSubjectSelector\n\t * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n\t * Or:\n\t * Subject to push source elements into.\n\t *\n\t * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n\t * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n\t */\n\tmodule.exports = function multicast(source, subjectOrSubjectSelector, selector) {\n\t  return isFunction(subjectOrSubjectSelector) ? new MulticastObservable(source, subjectOrSubjectSelector, selector) : new ConnectableObservable(source, subjectOrSubjectSelector);\n\t};\n\n/***/ },\n/* 51 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Observable = __webpack_require__(8);\n\tvar ObservableBase = __webpack_require__(34);\n\tvar asObservable = __webpack_require__(16);\n\tvar Disposable = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction RefCountDisposable(p, s) {\n\t  this._p = p;\n\t  this._s = s;\n\t  this.isDisposed = false;\n\t}\n\n\tRefCountDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    this.isDisposed = true;\n\t    this._s.dispose();\n\t    --this._p._count === 0 && this._p._connectableSubscription.dispose();\n\t  }\n\t};\n\n\tfunction RefCountObservable(source) {\n\t  this.source = source;\n\t  this._count = 0;\n\t  this._connectableSubscription = null;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(RefCountObservable, ObservableBase);\n\n\tRefCountObservable.prototype.subscribeCore = function (o) {\n\t  var subscription = this.source.subscribe(o);\n\t  ++this._count === 1 && (this._connectableSubscription = this.source.connect());\n\t  return new RefCountDisposable(this, subscription);\n\t};\n\n\tfunction ConnectableObservable(source, subject) {\n\t  this.source = source;\n\t  this._connection = null;\n\t  this._source = asObservable(source);\n\t  this._subject = subject;\n\t  Observable.call(this);\n\t}\n\n\tinherits(ConnectableObservable, Observable);\n\n\tfunction ConnectDisposable(parent, subscription) {\n\t  this._p = parent;\n\t  this._s = subscription;\n\t}\n\n\tConnectDisposable.prototype.dispose = function () {\n\t  if (this._s) {\n\t    this._s.dispose();\n\t    this._s = null;\n\t    this._p._connection = null;\n\t  }\n\t};\n\n\tConnectableObservable.prototype.connect = function () {\n\t  if (!this._connection) {\n\t    if (this._subject.isStopped) {\n\t      return Disposable.empty;\n\t    }\n\n\t    var subscription = this._source.subscribe(this._subject);\n\t    this._connection = new ConnectDisposable(this, subscription);\n\t  }\n\t  return this._connection;\n\t};\n\n\tConnectableObservable.prototype._subscribe = function (o) {\n\t  return this._subject.subscribe(o);\n\t};\n\n\tConnectableObservable.prototype.refCount = function () {\n\t  return new RefCountObservable(this);\n\t};\n\n\tmodule.exports = ConnectableObservable;\n\n/***/ },\n/* 52 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar Scheduler = __webpack_require__(21);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction IntervalObservable(period, scheduler) {\n\t  this._period = period;\n\t  this._scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(IntervalObservable, ObservableBase);\n\n\tfunction createScheduleMethod(o) {\n\t  return function scheduleMethod(count) {\n\t    o.onNext(count);\n\t    return count + 1;\n\t  };\n\t}\n\n\tIntervalObservable.prototype.subscribeCore = function (o) {\n\t  return this._scheduler.schedulePeriodic(0, this._period, createScheduleMethod(o));\n\t};\n\n\t/**\n\t*  Returns an observable sequence that produces a value after each period.\n\t* @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n\t* @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n\t* @returns {Observable} An observable sequence that produces a value after each period.\n\t*/\n\tmodule.exports = function interval(period, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\t  return new IntervalObservable(period, scheduler);\n\t};\n\n/***/ },\n/* 53 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar Disposable = __webpack_require__(12);\n\tvar Scheduler = __webpack_require__(21);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction scheduleItem(s, state) {\n\t  var value = state[0],\n\t      observer = state[1];\n\t  observer.onNext(value);\n\t  observer.onCompleted();\n\t  return Disposable.empty;\n\t}\n\n\tfunction JustObservable(value, scheduler) {\n\t  this._value = value;\n\t  this._scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(JustObservable, ObservableBase);\n\n\tJustObservable.prototype.subscribeCore = function (o) {\n\t  var state = [this._value, o];\n\t  return this._scheduler === Scheduler.immediate ? scheduleItem(null, state) : this._scheduler.schedule(state, scheduleItem);\n\t};\n\n\tmodule.exports = function just(value, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.immediate);\n\t  return new JustObservable(value, scheduler);\n\t};\n\n/***/ },\n/* 54 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar fromArray = __webpack_require__(45);\n\tvar mergeAll = __webpack_require__(55);\n\tvar Scheduler = __webpack_require__(21);\n\n\tmodule.exports = function merge() {\n\t  var scheduler,\n\t      sources = [],\n\t      i,\n\t      len = arguments.length;\n\t  if (!arguments[0]) {\n\t    scheduler = Scheduler.immediate;\n\t    for (i = 1; i < len; i++) {\n\t      sources.push(arguments[i]);\n\t    }\n\t  } else if (Scheduler.isScheduler(arguments[0])) {\n\t    scheduler = arguments[0];\n\t    for (i = 1; i < len; i++) {\n\t      sources.push(arguments[i]);\n\t    }\n\t  } else {\n\t    scheduler = Scheduler.immediate;\n\t    for (i = 0; i < len; i++) {\n\t      sources.push(arguments[i]);\n\t    }\n\t  }\n\t  return mergeAll(fromArray(sources, scheduler));\n\t};\n\n/***/ },\n/* 55 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar ObservableBase = __webpack_require__(34);\n\tvar fromPromise = __webpack_require__(37);\n\tvar isPromise = __webpack_require__(38);\n\tvar CompositeDisposable = __webpack_require__(22);\n\tvar SingleAssignmentDisposable = __webpack_require__(19);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction InnerObserver(parent, sad) {\n\t  this._parent = parent;\n\t  this._sad = sad;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(InnerObserver, AbstractObserver);\n\n\tInnerObserver.prototype.next = function (x) {\n\t  this._parent._o.onNext(x);\n\t};\n\tInnerObserver.prototype.error = function (e) {\n\t  this._parent._o.onError(e);\n\t};\n\tInnerObserver.prototype.completed = function () {\n\t  this._parent._g.remove(this._sad);\n\t  this._parent._done && this._parent._g.length === 1 && this._parent._o.onCompleted();\n\t};\n\n\tfunction MergeAllObserver(o, g) {\n\t  this._o = o;\n\t  this._g = g;\n\t  this._done = false;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(MergeAllObserver, AbstractObserver);\n\n\tMergeAllObserver.prototype.next = function (innerSource) {\n\t  var sad = new SingleAssignmentDisposable();\n\t  this._g.add(sad);\n\t  isPromise(innerSource) && (innerSource = fromPromise(innerSource));\n\t  sad.setDisposable(innerSource.subscribe(new InnerObserver(this, sad)));\n\t};\n\tMergeAllObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tMergeAllObserver.prototype.completed = function () {\n\t  this._done = true;this._g.length === 1 && this._o.onCompleted();\n\t};\n\n\tfunction MergeAllObservable(source) {\n\t  this.source = source;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(MergeAllObservable, ObservableBase);\n\n\tMergeAllObservable.prototype.subscribeCore = function (o) {\n\t  var g = new CompositeDisposable(),\n\t      m = new SingleAssignmentDisposable();\n\t  g.add(m);\n\t  m.setDisposable(this.source.subscribe(new MergeAllObserver(o, g)));\n\t  return g;\n\t};\n\n\t/**\n\t* Merges an observable sequence of observable sequences into an observable sequence.\n\t* @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n\t*/\n\tmodule.exports = function mergeAll(sources) {\n\t  return new MergeAllObservable(sources);\n\t};\n\n/***/ },\n/* 56 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar Disposable = __webpack_require__(12);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction NeverObservable() {\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(NeverObservable, ObservableBase);\n\n\tNeverObservable.prototype.subscribeCore = function () {\n\t  return Disposable.empty;\n\t};\n\n\tvar NEVER_OBSERVABLE = new NeverObservable();\n\n\t/**\n\t * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n\t * @returns {Observable} An observable sequence whose observers will never get called.\n\t */\n\tmodule.exports = function never() {\n\t  return NEVER_OBSERVABLE;\n\t};\n\n/***/ },\n/* 57 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar fromArray = __webpack_require__(45);\n\n\tmodule.exports = function () {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  return fromArray(args);\n\t};\n\n/***/ },\n/* 58 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar Scheduler = __webpack_require__(21);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction RangeObservable(start, count, scheduler) {\n\t  this.start = start;\n\t  this.rangeCount = count;\n\t  this.scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(RangeObservable, ObservableBase);\n\n\tfunction loopRecursive(start, count, o) {\n\t  return function loop(i, recurse) {\n\t    if (i < count) {\n\t      o.onNext(start + i);\n\t      recurse(i + 1);\n\t    } else {\n\t      o.onCompleted();\n\t    }\n\t  };\n\t}\n\n\tRangeObservable.prototype.subscribeCore = function (o) {\n\t  return this.scheduler.scheduleRecursive(0, loopRecursive(this.start, this.rangeCount, o));\n\t};\n\n\t/**\n\t*  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n\t* @param {Number} start The value of the first integer in the sequence.\n\t* @param {Number} count The number of sequential integers to generate.\n\t* @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n\t* @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n\t*/\n\tmodule.exports = function range(start, count, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.queue);\n\t  return new RangeObservable(start, count, scheduler);\n\t};\n\n/***/ },\n/* 59 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar Disposable = __webpack_require__(12);\n\tvar Scheduler = __webpack_require__(21);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction scheduleItem(s, state) {\n\t  var e = state[0],\n\t      o = state[1];\n\t  o.onError(e);\n\t  return Disposable.empty;\n\t}\n\n\tfunction ThrowObservable(error, scheduler) {\n\t  this._error = error;\n\t  this._scheduler = scheduler;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(ThrowObservable, ObservableBase);\n\n\tThrowObservable.prototype.subscribeCore = function (o) {\n\t  var state = [this._error, o];\n\t  return this._scheduler === Scheduler.immediate ? scheduleItem(null, state) : this._scheduler.schedule(state, scheduleItem);\n\t};\n\n\tmodule.exports = function throwError(error, scheduler) {\n\t  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.immediate);\n\t  return new ThrowObservable(error, scheduler);\n\t};\n\n/***/ },\n/* 60 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar throwError = __webpack_require__(59);\n\tvar BinaryDisposable = __webpack_require__(30);\n\tvar Disposable = __webpack_require__(12);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction UsingObservable(resFn, obsFn) {\n\t  this._resFn = resFn;\n\t  this._obsFn = obsFn;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(UsingObservable, ObservableBase);\n\n\tUsingObservable.prototype.subscribeCore = function (o) {\n\t  var disposable = Disposable.empty;\n\t  var resource = tryCatch(this._resFn)();\n\t  if (resource === errorObj) {\n\t    return new BinaryDisposable(throwError(resource.e).subscribe(o), disposable);\n\t  }\n\t  resource && (disposable = resource);\n\t  var source = tryCatch(this._obsFn)(resource);\n\t  if (source === errorObj) {\n\t    return new BinaryDisposable(throwError(source.e).subscribe(o), disposable);\n\t  }\n\t  return new BinaryDisposable(source.subscribe(o), disposable);\n\t};\n\n\t/**\n\t * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n\t * @param {Function} resourceFactory Factory function to obtain a resource object.\n\t * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n\t * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n\t */\n\tmodule.exports = function using(resourceFactory, observableFactory) {\n\t  return new UsingObservable(resourceFactory, observableFactory);\n\t};\n\n/***/ },\n/* 61 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar SingleAssignmentDisposable = __webpack_require__(19);\n\tvar NAryDisposable = __webpack_require__(35);\n\tvar fromPromise = __webpack_require__(37);\n\tvar isPromise = __webpack_require__(38);\n\tvar identity = __webpack_require__(62);\n\tvar isFunction = __webpack_require__(9);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction falseFactory() {\n\t  return false;\n\t}\n\tfunction emptyArrayFactory() {\n\t  return [];\n\t}\n\tfunction initializeArray(n, fn) {\n\t  var results = new Array(n);\n\t  for (var i = 0; i < n; i++) {\n\t    results[i] = fn(i);\n\t  }\n\t  return results;\n\t}\n\tfunction argumentsToArray() {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  return args;\n\t}\n\n\tfunction ZipObserver(o, i, p, q, d) {\n\t  this._o = o;\n\t  this._i = i;\n\t  this._p = p;\n\t  this._q = q;\n\t  this._d = d;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(ZipObserver, AbstractObserver);\n\n\tfunction notEmpty(x) {\n\t  return x.length > 0;\n\t}\n\tfunction shiftEach(x) {\n\t  return x.shift();\n\t}\n\tfunction notTheSame(i) {\n\t  return function (x, j) {\n\t    return j !== i;\n\t  };\n\t}\n\n\tZipObserver.prototype.next = function (x) {\n\t  this._q[this._i].push(x);\n\t  if (this._q.every(notEmpty)) {\n\t    var queuedValues = this._q.map(shiftEach);\n\t    var res = tryCatch(this._p._cb).apply(null, queuedValues);\n\t    if (res === errorObj) {\n\t      return this._o.onError(res.e);\n\t    }\n\t    this._o.onNext(res);\n\t  } else if (this._d.filter(notTheSame(this._i)).every(identity)) {\n\t    this._o.onCompleted();\n\t  }\n\t};\n\n\tZipObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tZipObserver.prototype.completed = function () {\n\t  this._d[this._i] = true;\n\t  this._d.every(identity) && this._o.onCompleted();\n\t};\n\n\tfunction ZipObservable(s, cb) {\n\t  this._s = s;\n\t  this._cb = cb;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(ZipObservable, ObservableBase);\n\n\tZipObservable.prototype.subscribeCore = function (observer) {\n\t  var n = this._s.length,\n\t      subscriptions = new Array(n),\n\t      done = initializeArray(n, falseFactory),\n\t      q = initializeArray(n, emptyArrayFactory);\n\n\t  for (var i = 0; i < n; i++) {\n\t    var source = this._s[i],\n\t        sad = new SingleAssignmentDisposable();\n\t    subscriptions[i] = sad;\n\t    isPromise(source) && (source = fromPromise(source));\n\t    sad.setDisposable(source.subscribe(new ZipObserver(observer, i, this, q, done)));\n\t  }\n\n\t  return new NAryDisposable(subscriptions);\n\t};\n\n\t/**\n\t* Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n\t* The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n\t* @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n\t*/\n\tmodule.exports = function zip() {\n\t  if (arguments.length === 0) {\n\t    throw new Error('invalid arguments');\n\t  }\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n\t  return new ZipObservable(args, resultSelector);\n\t};\n\n/***/ },\n/* 62 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function identity(x) {\n\t  return x;\n\t};\n\n/***/ },\n/* 63 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar SingleAssignmentDisposable = __webpack_require__(19);\n\tvar NAryDisposable = __webpack_require__(35);\n\tvar fromPromise = __webpack_require__(37);\n\tvar isPromise = __webpack_require__(38);\n\tvar identity = __webpack_require__(62);\n\tvar isFunction = __webpack_require__(9);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction falseFactory() {\n\t  return false;\n\t}\n\tfunction initializeArray(n, fn) {\n\t  var results = new Array(n);\n\t  for (var i = 0; i < n; i++) {\n\t    results[i] = fn(i);\n\t  }\n\t  return results;\n\t}\n\tfunction argumentsToArray() {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  return args;\n\t}\n\n\tfunction CombineLatestObserver(o, i, cb, state) {\n\t  this._o = o;\n\t  this._i = i;\n\t  this._cb = cb;\n\t  this._state = state;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(CombineLatestObserver, AbstractObserver);\n\n\tfunction notTheSame(i) {\n\t  return function (x, j) {\n\t    return j !== i;\n\t  };\n\t}\n\n\tCombineLatestObserver.prototype.next = function (x) {\n\t  this._state.values[this._i] = x;\n\t  this._state.hasValue[this._i] = true;\n\t  if (this._state.hasValueAll || (this._state.hasValueAll = this._state.hasValue.every(identity))) {\n\t    var res = tryCatch(this._cb).apply(null, this._state.values);\n\t    if (res === errorObj) {\n\t      return this._o.onError(res.e);\n\t    }\n\t    this._o.onNext(res);\n\t  } else if (this._state.isDone.filter(notTheSame(this._i)).every(identity)) {\n\t    this._o.onCompleted();\n\t  }\n\t};\n\n\tCombineLatestObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tCombineLatestObserver.prototype.completed = function () {\n\t  this._state.isDone[this._i] = true;\n\t  this._state.isDone.every(identity) && this._o.onCompleted();\n\t};\n\n\tfunction CombineLatestObservable(params, cb) {\n\t  this._params = params;\n\t  this._cb = cb;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(CombineLatestObservable, ObservableBase);\n\n\tCombineLatestObservable.prototype.subscribeCore = function (observer) {\n\t  var len = this._params.length,\n\t      subscriptions = new Array(len);\n\n\t  var state = {\n\t    hasValue: initializeArray(len, falseFactory),\n\t    hasValueAll: false,\n\t    isDone: initializeArray(len, falseFactory),\n\t    values: new Array(len)\n\t  };\n\n\t  for (var i = 0; i < len; i++) {\n\t    var source = this._params[i],\n\t        sad = new SingleAssignmentDisposable();\n\t    subscriptions[i] = sad;\n\t    isPromise(source) && (source = fromPromise(source));\n\t    sad.setDisposable(source.subscribe(new CombineLatestObserver(observer, i, this._cb, state)));\n\t  }\n\n\t  return new NAryDisposable(subscriptions);\n\t};\n\n\t/**\n\t* Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n\t*\n\t* @example\n\t* 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n\t* 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n\t* @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n\t*/\n\tmodule.exports = function combineLatest() {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n\t  return new CombineLatestObservable(args, resultSelector);\n\t};\n\n/***/ },\n/* 64 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar mergeConcat = __webpack_require__(65);\n\n\tmodule.exports = function concatAll(sources) {\n\t  return mergeConcat(sources, 1);\n\t};\n\n/***/ },\n/* 65 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar CompositeDisposable = __webpack_require__(22);\n\tvar SingleAssignmentDisposable = __webpack_require__(19);\n\tvar fromPromise = __webpack_require__(37);\n\tvar isPromise = __webpack_require__(38);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction InnerObserver(parent, sad) {\n\t  this._p = parent;\n\t  this._sad = sad;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(InnerObserver, AbstractObserver);\n\n\tInnerObserver.prototype.next = function (x) {\n\t  this._p._o.onNext(x);\n\t};\n\tInnerObserver.prototype.error = function (e) {\n\t  this._p._o.onError(e);\n\t};\n\tInnerObserver.prototype.completed = function () {\n\t  this._p._g.remove(this._sad);\n\t  if (this._p._q.length > 0) {\n\t    this._p.handleSubscribe(this._p._q.shift());\n\t  } else {\n\t    this._p._activeCount--;\n\t    this._p._done && this._p._activeCount === 0 && this._p._o.onCompleted();\n\t  }\n\t};\n\n\tfunction MergeObserver(o, max, g) {\n\t  this._o = o;\n\t  this._max = max;\n\t  this._g = g;\n\t  this._done = false;\n\t  this._q = [];\n\t  this._activeCount = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(MergeObserver, AbstractObserver);\n\n\tMergeObserver.prototype.handleSubscribe = function (xs) {\n\t  var sad = new SingleAssignmentDisposable();\n\t  this._g.add(sad);\n\t  isPromise(xs) && (xs = fromPromise(xs));\n\t  sad.setDisposable(xs.subscribe(new InnerObserver(this, sad)));\n\t};\n\n\tMergeObserver.prototype.next = function (innerSource) {\n\t  if (this._activeCount < this._max) {\n\t    this._activeCount++;\n\t    this.handleSubscribe(innerSource);\n\t  } else {\n\t    this._q.push(innerSource);\n\t  }\n\t};\n\tMergeObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tMergeObserver.prototype.completed = function () {\n\t  this._done = true;this._activeCount === 0 && this._o.onCompleted();\n\t};\n\n\tfunction MergeObservable(source, maxConcurrent) {\n\t  this.source = source;\n\t  this._maxConcurrent = maxConcurrent;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(MergeObservable, ObservableBase);\n\n\tMergeObservable.prototype.subscribeCore = function (observer) {\n\t  var g = new CompositeDisposable();\n\t  g.add(this.source.subscribe(new MergeObserver(observer, this._maxConcurrent, g)));\n\t  return g;\n\t};\n\n\t/**\n\t* Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n\t* Or merges two observable sequences into a single observable sequence.\n\t* @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n\t* @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n\t*/\n\tmodule.exports = function mergeConcat(source, maxConcurrent) {\n\t  return new MergeObservable(source, maxConcurrent);\n\t};\n\n/***/ },\n/* 66 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar Scheduler = __webpack_require__(21);\n\tvar BinaryDisposable = __webpack_require__(30);\n\tvar SerialDisposable = __webpack_require__(36);\n\tvar SingleAssignmentDisposable = __webpack_require__(19);\n\tvar fromPromise = __webpack_require__(37);\n\tvar isPromise = __webpack_require__(38);\n\tvar isFunction = __webpack_require__(9);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\tvar inherits = __webpack_require__(6);\n\n\tfunction DebounceObserver(o, dt, scheduler, cancelable) {\n\t  this._o = o;\n\t  this._d = dt;\n\t  this._scheduler = scheduler;\n\t  this._c = cancelable;\n\t  this._v = null;\n\t  this._hv = false;\n\t  this._id = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(DebounceObserver, AbstractObserver);\n\n\tDebounceObserver.prototype.next = function (x) {\n\t  this._hv = true;\n\t  this._v = x;\n\t  var currentId = ++this._id,\n\t      d = new SingleAssignmentDisposable();\n\t  this._c.setDisposable(d);\n\t  d.setDisposable(this._scheduler.scheduleFuture(this, this._d, function (_, self) {\n\t    self._hv && self._id === currentId && self._o.onNext(x);\n\t    self._hv = false;\n\t  }));\n\t};\n\n\tDebounceObserver.prototype.error = function (e) {\n\t  this._c.dispose();\n\t  this._o.onError(e);\n\t  this._hv = false;\n\t  this._id++;\n\t};\n\n\tDebounceObserver.prototype.completed = function () {\n\t  this._c.dispose();\n\t  this._hv && this._o.onNext(this._v);\n\t  this._o.onCompleted();\n\t  this._hv = false;\n\t  this._id++;\n\t};\n\n\tfunction DebounceObservable(source, dt, s) {\n\t  Scheduler.isScheduler(s) || (s = Scheduler.async);\n\t  this.source = source;\n\t  this._dt = dt;\n\t  this._s = s;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(DebounceObservable, ObservableBase);\n\n\tDebounceObservable.prototype.subscribeCore = function (o) {\n\t  var cancelable = new SerialDisposable();\n\t  return new BinaryDisposable(this.source.subscribe(new DebounceObserver(o, this._dt, this._s, cancelable)), cancelable);\n\t};\n\n\tfunction DebounceSelectorObserver(s) {\n\t  this._s = s;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(DebounceSelectorObserver, AbstractObserver);\n\n\tDebounceSelectorObserver.prototype.next = function (x) {\n\t  var throttle = tryCatch(this._s.fn)(x);\n\t  if (throttle === errorObj) {\n\t    return this._s.o.onError(throttle.e);\n\t  }\n\n\t  isPromise(throttle) && (throttle = fromPromise(throttle));\n\n\t  this._s.hasValue = true;\n\t  this._s.value = x;\n\t  this._s.id++;\n\t  var currentId = this._s.id,\n\t      d = new SingleAssignmentDisposable();\n\t  this._s.cancelable.setDisposable(d);\n\n\t  var self = this;\n\t  d.setDisposable(throttle.subscribe(function () {\n\t    self._s.hasValue && self._s.id === currentId && self._s.o.onNext(self._s.value);\n\t    self._s.hasValue = false;\n\t    d.dispose();\n\t  }, function (e) {\n\t    self._s.o.onError(e);\n\t  }, function () {\n\t    self._s.hasValue && self._s.id === currentId && self._s.o.onNext(self._s.value);\n\t    self._s.hasValue = false;\n\t    d.dispose();\n\t  }));\n\t};\n\n\tDebounceSelectorObserver.prototype.error = function (e) {\n\t  this._s.cancelable.dispose();\n\t  this._s.o.onError(e);\n\t  this._s.hasValue = false;\n\t  this._s.id++;\n\t};\n\n\tDebounceSelectorObserver.prototype.completed = function () {\n\t  this._s.cancelable.dispose();\n\t  this._s.hasValue && this._s.o.onNext(this._s.value);\n\t  this._s.o.onCompleted();\n\t  this._s.hasValue = false;\n\t  this._s.id++;\n\t};\n\n\tfunction DebounceSelectorObservable(source, fn) {\n\t  this.source = source;\n\t  this._fn = fn;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(DebounceSelectorObservable, ObservableBase);\n\n\tDebounceSelectorObservable.prototype.subscribeCore = function (o) {\n\t  var state = {\n\t    value: null,\n\t    hasValue: false,\n\t    cancelable: new SerialDisposable(),\n\t    id: 0,\n\t    o: o,\n\t    fn: this._fn\n\t  };\n\n\t  return new BinaryDisposable(state.cancelable, this.source.subscribe(new DebounceSelectorObserver(state)));\n\t};\n\n\tmodule.exports = function debounce() {\n\t  var source = arguments[0];\n\t  if (isFunction(arguments[1])) {\n\t    return new DebounceSelectorObservable(source, arguments[1]);\n\t  } else if (typeof arguments[1] === 'number') {\n\t    return new DebounceObservable(source, arguments[1], arguments[2]);\n\t  } else {\n\t    throw new Error('Invalid arguments');\n\t  }\n\t};\n\n/***/ },\n/* 67 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar isFunction = __webpack_require__(9);\n\tvar isEqual = __webpack_require__(68);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction DistinctUntilChangedObserver(o, fn, cmp) {\n\t  this._o = o;\n\t  this._fn = fn;\n\t  this._cmp = cmp;\n\t  this._hk = false;\n\t  this._k = null;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(DistinctUntilChangedObserver, AbstractObserver);\n\n\tDistinctUntilChangedObserver.prototype.next = function (x) {\n\t  var key = x,\n\t      comparerEquals;\n\t  if (isFunction(this._fn)) {\n\t    key = tryCatch(this._fn)(x);\n\t    if (key === errorObj) {\n\t      return this._o.onError(key.e);\n\t    }\n\t  }\n\t  if (this._hk) {\n\t    comparerEquals = tryCatch(this._cmp)(this._k, key);\n\t    if (comparerEquals === errorObj) {\n\t      return this._o.onError(comparerEquals.e);\n\t    }\n\t  }\n\t  if (!this._hk || !comparerEquals) {\n\t    this._hk = true;\n\t    this._k = key;\n\t    this._o.onNext(x);\n\t  }\n\t};\n\tDistinctUntilChangedObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tDistinctUntilChangedObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction DistinctUntilChangedObservable(source, fn, cmp) {\n\t  this.source = source;\n\t  this._fn = fn;\n\t  this._cmp = cmp;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(DistinctUntilChangedObservable, ObservableBase);\n\n\tDistinctUntilChangedObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new DistinctUntilChangedObserver(o, this._fn, this._cmp));\n\t};\n\n\t/**\n\t*  Returns an observable sequence that contains only distinct contiguous elements according to the keyFn and the comparer.\n\t* @param {Function} [keyFn] A function to compute the comparison key for each element. If not provided, it projects the value.\n\t* @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n\t* @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n\t*/\n\tmodule.exports = function distinctUntilChanged(source, keyFn, comparer) {\n\t  comparer || (comparer = isEqual);\n\t  return new DistinctUntilChangedObservable(source, keyFn, comparer);\n\t};\n\n/***/ },\n/* 68 */\n/***/ function(module, exports) {\n\n\tvar argsTag = '[object Arguments]',\n\t    arrayTag = '[object Array]',\n\t    boolTag = '[object Boolean]',\n\t    dateTag = '[object Date]',\n\t    errorTag = '[object Error]',\n\t    funcTag = '[object Function]',\n\t    mapTag = '[object Map]',\n\t    numberTag = '[object Number]',\n\t    objectTag = '[object Object]',\n\t    regexpTag = '[object RegExp]',\n\t    setTag = '[object Set]',\n\t    stringTag = '[object String]',\n\t    weakMapTag = '[object WeakMap]';\n\n\tvar arrayBufferTag = '[object ArrayBuffer]',\n\t    float32Tag = '[object Float32Array]',\n\t    float64Tag = '[object Float64Array]',\n\t    int8Tag = '[object Int8Array]',\n\t    int16Tag = '[object Int16Array]',\n\t    int32Tag = '[object Int32Array]',\n\t    uint8Tag = '[object Uint8Array]',\n\t    uint8ClampedTag = '[object Uint8ClampedArray]',\n\t    uint16Tag = '[object Uint16Array]',\n\t    uint32Tag = '[object Uint32Array]';\n\n\tvar typedArrayTags = {};\n\ttypedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;\n\ttypedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\n\tvar objectProto = Object.prototype,\n\t    hasOwnProperty = objectProto.hasOwnProperty,\n\t    objToString = objectProto.toString,\n\t    MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\n\tvar keys = Object.keys || function () {\n\t  var hasOwnProperty = Object.prototype.hasOwnProperty,\n\t      hasDontEnumBug = !{ toString: null }.propertyIsEnumerable('toString'),\n\t      dontEnums = ['toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor'],\n\t      dontEnumsLength = dontEnums.length;\n\n\t  return function (obj) {\n\t    if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n\t      throw new TypeError('Object.keys called on non-object');\n\t    }\n\n\t    var result = [],\n\t        prop,\n\t        i;\n\n\t    for (prop in obj) {\n\t      if (hasOwnProperty.call(obj, prop)) {\n\t        result.push(prop);\n\t      }\n\t    }\n\n\t    if (hasDontEnumBug) {\n\t      for (i = 0; i < dontEnumsLength; i++) {\n\t        if (hasOwnProperty.call(obj, dontEnums[i])) {\n\t          result.push(dontEnums[i]);\n\t        }\n\t      }\n\t    }\n\t    return result;\n\t  };\n\t}();\n\n\tfunction equalObjects(object, other, equalFunc, isLoose, stackA, stackB) {\n\t  var objProps = keys(object),\n\t      objLength = objProps.length,\n\t      othProps = keys(other),\n\t      othLength = othProps.length;\n\n\t  if (objLength !== othLength && !isLoose) {\n\t    return false;\n\t  }\n\t  var index = objLength,\n\t      key;\n\t  while (index--) {\n\t    key = objProps[index];\n\t    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n\t      return false;\n\t    }\n\t  }\n\t  var skipCtor = isLoose;\n\t  while (++index < objLength) {\n\t    key = objProps[index];\n\t    var objValue = object[key],\n\t        othValue = other[key],\n\t        result;\n\n\t    if (!(result === undefined ? equalFunc(objValue, othValue, isLoose, stackA, stackB) : result)) {\n\t      return false;\n\t    }\n\t    skipCtor || (skipCtor = key === 'constructor');\n\t  }\n\t  if (!skipCtor) {\n\t    var objCtor = object.constructor,\n\t        othCtor = other.constructor;\n\n\t    if (objCtor !== othCtor && 'constructor' in object && 'constructor' in other && !(typeof objCtor === 'function' && objCtor instanceof objCtor && typeof othCtor === 'function' && othCtor instanceof othCtor)) {\n\t      return false;\n\t    }\n\t  }\n\t  return true;\n\t}\n\n\tfunction equalByTag(object, other, tag) {\n\t  switch (tag) {\n\t    case boolTag:\n\t    case dateTag:\n\t      return +object === +other;\n\n\t    case errorTag:\n\t      return object.name === other.name && object.message === other.message;\n\n\t    case numberTag:\n\t      return object !== +object ? other !== +other : object === +other;\n\n\t    case regexpTag:\n\t    case stringTag:\n\t      return object === other + '';\n\t  }\n\t  return false;\n\t}\n\n\tfunction isObject(value) {\n\t  var type = typeof value;\n\t  return !!value && (type === 'object' || type === 'function');\n\t}\n\n\tfunction isObjectLike(value) {\n\t  return !!value && typeof value === 'object';\n\t}\n\n\tfunction isLength(value) {\n\t  return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n\t}\n\n\tvar isHostObject = function () {\n\t  try {\n\t    Object({ 'toString': 0 } + '');\n\t  } catch (e) {\n\t    return function () {\n\t      return false;\n\t    };\n\t  }\n\t  return function (value) {\n\t    return typeof value.toString !== 'function' && typeof (value + '') === 'string';\n\t  };\n\t}();\n\n\tfunction isTypedArray(value) {\n\t  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n\t}\n\n\tvar isArray = Array.isArray || function (value) {\n\t  return isObjectLike(value) && isLength(value.length) && objToString.call(value) === arrayTag;\n\t};\n\n\tfunction arraySome(array, predicate) {\n\t  var index = -1,\n\t      length = array.length;\n\n\t  while (++index < length) {\n\t    if (predicate(array[index], index, array)) {\n\t      return true;\n\t    }\n\t  }\n\t  return false;\n\t}\n\n\tfunction equalArrays(array, other, equalFunc, isLoose, stackA, stackB) {\n\t  var index = -1,\n\t      arrLength = array.length,\n\t      othLength = other.length;\n\n\t  if (arrLength !== othLength && !(isLoose && othLength > arrLength)) {\n\t    return false;\n\t  }\n\t  // Ignore non-index properties.\n\t  while (++index < arrLength) {\n\t    var arrValue = array[index],\n\t        othValue = other[index],\n\t        result;\n\n\t    if (result !== undefined) {\n\t      if (result) {\n\t        continue;\n\t      }\n\t      return false;\n\t    }\n\t    // Recursively compare arrays (susceptible to call stack limits).\n\t    if (isLoose) {\n\t      if (!arraySome(other, function (othValue) {\n\t        return arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB);\n\t      })) {\n\t        return false;\n\t      }\n\t    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB))) {\n\t      return false;\n\t    }\n\t  }\n\t  return true;\n\t}\n\n\tfunction baseIsEqualDeep(object, other, equalFunc, isLoose, stackA, stackB) {\n\t  var objIsArr = isArray(object),\n\t      othIsArr = isArray(other),\n\t      objTag = arrayTag,\n\t      othTag = arrayTag;\n\n\t  if (!objIsArr) {\n\t    objTag = objToString.call(object);\n\t    if (objTag === argsTag) {\n\t      objTag = objectTag;\n\t    } else if (objTag !== objectTag) {\n\t      objIsArr = isTypedArray(object);\n\t    }\n\t  }\n\t  if (!othIsArr) {\n\t    othTag = objToString.call(other);\n\t    if (othTag === argsTag) {\n\t      othTag = objectTag;\n\t    } else if (othTag !== objectTag) {\n\t      othIsArr = isTypedArray(other);\n\t    }\n\t  }\n\t  var objIsObj = objTag === objectTag && !isHostObject(object),\n\t      othIsObj = othTag === objectTag && !isHostObject(other),\n\t      isSameTag = objTag === othTag;\n\n\t  if (isSameTag && !(objIsArr || objIsObj)) {\n\t    return equalByTag(object, other, objTag);\n\t  }\n\t  if (!isLoose) {\n\t    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n\t        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n\t    if (objIsWrapped || othIsWrapped) {\n\t      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, isLoose, stackA, stackB);\n\t    }\n\t  }\n\t  if (!isSameTag) {\n\t    return false;\n\t  }\n\t  // Assume cyclic values are equal.\n\t  // For more information on detecting circular references see https://es5.github.io/#JO.\n\t  stackA || (stackA = []);\n\t  stackB || (stackB = []);\n\n\t  var length = stackA.length;\n\t  while (length--) {\n\t    if (stackA[length] === object) {\n\t      return stackB[length] === other;\n\t    }\n\t  }\n\t  // Add `object` and `other` to the stack of traversed objects.\n\t  stackA.push(object);\n\t  stackB.push(other);\n\n\t  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, isLoose, stackA, stackB);\n\n\t  stackA.pop();\n\t  stackB.pop();\n\n\t  return result;\n\t}\n\n\tfunction baseIsEqual(value, other, isLoose, stackA, stackB) {\n\t  if (value === other) {\n\t    return true;\n\t  }\n\t  if (value == null || other == null || !isObject(value) && !isObjectLike(other)) {\n\t    return value !== value && other !== other;\n\t  }\n\t  return baseIsEqualDeep(value, other, baseIsEqual, isLoose, stackA, stackB);\n\t}\n\n\tmodule.exports = function (value, other) {\n\t  return baseIsEqual(value, other);\n\t};\n\n/***/ },\n/* 69 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar create = __webpack_require__(2);\n\tvar isFunction = __webpack_require__(9);\n\tvar noop = __webpack_require__(3);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction TapObserver(o, p) {\n\t  this._o = o;\n\t  this._t = !p._oN || isFunction(p._oN) ? create(p._oN || noop, p._oE || noop, p._oC || noop) : p._oN;\n\t  this.isStopped = false;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(TapObserver, AbstractObserver);\n\n\tTapObserver.prototype.next = function (x) {\n\t  var res = tryCatch(this._t.onNext).call(this._t, x);\n\t  if (res === errorObj) {\n\t    this._o.onError(res.e);\n\t  }\n\t  this._o.onNext(x);\n\t};\n\n\tTapObserver.prototype.error = function (e) {\n\t  var res = tryCatch(this._t.onError).call(this._t, e);\n\t  if (res === errorObj) {\n\t    return this._o.onError(res.e);\n\t  }\n\t  this._o.onError(e);\n\t};\n\n\tTapObserver.prototype.completed = function () {\n\t  var res = tryCatch(this._t.onCompleted).call(this._t);\n\t  if (res === errorObj) {\n\t    return this._o.onError(res.e);\n\t  }\n\t  this._o.onCompleted();\n\t};\n\n\tfunction TapObservable(source, observerOrOnNext, onError, onCompleted) {\n\t  this.source = source;\n\t  this._oN = observerOrOnNext;\n\t  this._oE = onError;\n\t  this._oC = onCompleted;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(TapObservable, ObservableBase);\n\n\tTapObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new TapObserver(o, this));\n\t};\n\n\t/**\n\t*  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n\t*  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n\t* @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an o.\n\t* @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n\t* @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n\t* @returns {Observable} The source sequence with the side-effecting behavior applied.\n\t*/\n\tmodule.exports = function tap(source, observerOrOnNext, onError, onCompleted) {\n\t  return new TapObservable(source, observerOrOnNext, onError, onCompleted);\n\t};\n\n/***/ },\n/* 70 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar bindCallback = __webpack_require__(44);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction FilterObserver(o, predicate, source) {\n\t  this._o = o;\n\t  this._fn = predicate;\n\t  this.source = source;\n\t  this._i = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(FilterObserver, AbstractObserver);\n\n\tFilterObserver.prototype.next = function (x) {\n\t  var shouldYield = tryCatch(this._fn)(x, this._i++, this.source);\n\t  if (shouldYield === errorObj) {\n\t    return this._o.onError(shouldYield.e);\n\t  }\n\t  shouldYield && this._o.onNext(x);\n\t};\n\n\tFilterObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tFilterObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction FilterObservable(source, predicate, thisArg) {\n\t  this.source = source;\n\t  this._fn = bindCallback(predicate, thisArg, 3);\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(FilterObservable, ObservableBase);\n\n\tFilterObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new FilterObserver(o, this._fn, this));\n\t};\n\n\tfunction innerPredicate(fn, self) {\n\t  return function (x, i, o) {\n\t    return self._fn(x, i, o) && fn.call(this, x, i, o);\n\t  };\n\t}\n\n\tFilterObservable.prototype.internalFilter = function (fn, thisArg) {\n\t  return new FilterObservable(this.source, innerPredicate(fn, this), thisArg);\n\t};\n\n\t/**\n\t*  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n\t* @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n\t* @param {Any} [thisArg] Object to use as this when executing callback.\n\t* @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n\t*/\n\tmodule.exports = function filter(source, predicate, thisArg) {\n\t  return source instanceof FilterObservable ? source.internalFilter(predicate, thisArg) : new FilterObservable(source, predicate, thisArg);\n\t};\n\n/***/ },\n/* 71 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar inherits = __webpack_require__(6);\n\tvar bindCallback = __webpack_require__(44);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj,\n\t    thrower = tryCatchUtils.thrower;\n\n\tfunction FinallyDisposable(s, fn) {\n\t  this.isDisposed = false;\n\t  this._s = s;\n\t  this._fn = fn;\n\t}\n\n\tFinallyDisposable.prototype.dispose = function () {\n\t  if (!this.isDisposed) {\n\t    var res = tryCatch(this._s.dispose).call(this._s);\n\t    this._fn();\n\t    res === errorObj && thrower(res.e);\n\t  }\n\t};\n\n\tfunction FinallyObservable(source, fn, thisArg) {\n\t  this.source = source;\n\t  this._fn = bindCallback(fn, thisArg, 0);\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(FinallyObservable, ObservableBase);\n\n\tFinallyObservable.prototype.subscribeCore = function (o) {\n\t  var d = tryCatch(this.source.subscribe).call(this.source, o);\n\t  if (d === errorObj) {\n\t    this._fn();\n\t    thrower(d.e);\n\t  }\n\n\t  return new FinallyDisposable(d, this._fn);\n\t};\n\n\t/**\n\t *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n\t * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n\t * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n\t */\n\tmodule.exports = function finally_(source, action, thisArg) {\n\t  return new FinallyObservable(source, action, thisArg);\n\t};\n\n/***/ },\n/* 72 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar FlatMapObservable = __webpack_require__(73);\n\tvar mergeAll = __webpack_require__(55);\n\n\tmodule.exports = function flatMap(source, selector, resultSelector, thisArg) {\n\t  var obs = new FlatMapObservable(source, selector, resultSelector, thisArg);\n\t  return mergeAll(obs);\n\t};\n\n/***/ },\n/* 73 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar ObservableBase = __webpack_require__(34);\n\tvar observableFrom = __webpack_require__(42);\n\tvar fromPromise = __webpack_require__(37);\n\tvar isPromise = __webpack_require__(38);\n\tvar isArrayLike = __webpack_require__(74);\n\tvar isIterable = __webpack_require__(75);\n\tvar bindCallback = __webpack_require__(44);\n\tvar isFunction = __webpack_require__(9);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction FlatMapObserver(o, selector, resultSelector, source) {\n\t  this.i = 0;\n\t  this._fn = selector;\n\t  this._resFn = resultSelector;\n\t  this.source = source;\n\t  this._o = o;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(FlatMapObserver, AbstractObserver);\n\n\tFlatMapObserver.prototype._wrapResult = function (result, x, i) {\n\t  return isFunction(this._resFn) ? result.map(function (y, i2) {\n\t    return this._resFn(x, y, i, i2);\n\t  }, this) : result;\n\t};\n\n\tFlatMapObserver.prototype.next = function (x) {\n\t  var i = this.i++;\n\t  var result = tryCatch(this._fn)(x, i, this.source);\n\t  if (result === errorObj) {\n\t    return this._o.onError(result.e);\n\t  }\n\n\t  isPromise(result) && (result = fromPromise(result));\n\t  (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));\n\t  this._o.onNext(this._wrapResult(result, x, i));\n\t};\n\tFlatMapObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tFlatMapObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction FlatMapObservable(source, fn, resultFn, thisArg) {\n\t  this._resFn = isFunction(resultFn) ? resultFn : null;\n\t  this._fn = bindCallback(isFunction(fn) ? fn : function () {\n\t    return fn;\n\t  }, thisArg, 3);\n\t  this.source = source;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(FlatMapObservable, ObservableBase);\n\n\tFlatMapObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new FlatMapObserver(o, this._fn, this._resFn, this));\n\t};\n\n\tmodule.exports = FlatMapObservable;\n\n/***/ },\n/* 74 */\n/***/ function(module, exports) {\n\n\t'use strict';\n\n\tmodule.exports = function isArrayLike(o) {\n\t  return o && o.length !== undefined;\n\t};\n\n/***/ },\n/* 75 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar $iterator$ = __webpack_require__(43);\n\n\tmodule.exports = function isIterable(o) {\n\t  return o && o[$iterator$] !== undefined;\n\t};\n\n/***/ },\n/* 76 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar FlatMapObservable = __webpack_require__(73);\n\tvar switchLatest = __webpack_require__(77);\n\n\tmodule.exports = function flatMapLatest(source, selector, resultSelector, thisArg) {\n\t  return switchLatest(new FlatMapObservable(source, selector, resultSelector, thisArg));\n\t};\n\n/***/ },\n/* 77 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar BinaryDisposable = __webpack_require__(30);\n\tvar SerialDisposable = __webpack_require__(36);\n\tvar SingleAssignmentDisposable = __webpack_require__(19);\n\tvar fromPromise = __webpack_require__(37);\n\tvar isPromise = __webpack_require__(38);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction InnerObserver(p, id) {\n\t  this._p = p;\n\t  this._id = id;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(InnerObserver, AbstractObserver);\n\n\tInnerObserver.prototype.next = function (x) {\n\t  this._p._latest === this._id && this._p._o.onNext(x);\n\t};\n\tInnerObserver.prototype.error = function (e) {\n\t  this._p._latest === this._id && this._p._o.onError(e);\n\t};\n\tInnerObserver.prototype.completed = function () {\n\t  if (this._p._latest === this._id) {\n\t    this._p._hasLatest = false;\n\t    this._p._stopped && this._p._o.onCompleted();\n\t  }\n\t};\n\n\tfunction SwitchObserver(o, inner) {\n\t  this._o = o;\n\t  this._inner = inner;\n\t  this._stopped = false;\n\t  this._latest = 0;\n\t  this._hasLatest = false;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SwitchObserver, AbstractObserver);\n\n\tSwitchObserver.prototype.next = function (innerSource) {\n\t  var d = new SingleAssignmentDisposable(),\n\t      id = ++this._latest;\n\t  this._hasLatest = true;\n\t  this._inner.setDisposable(d);\n\t  isPromise(innerSource) && (innerSource = fromPromise(innerSource));\n\t  d.setDisposable(innerSource.subscribe(new InnerObserver(this, id)));\n\t};\n\tSwitchObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tSwitchObserver.prototype.completed = function () {\n\t  this._stopped = true;!this._hasLatest && this._o.onCompleted();\n\t};\n\n\tfunction SwitchObservable(source) {\n\t  this.source = source;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(SwitchObservable, ObservableBase);\n\n\tSwitchObservable.prototype.subscribeCore = function (o) {\n\t  var inner = new SerialDisposable(),\n\t      s = this.source.subscribe(new SwitchObserver(o, inner));\n\t  return new BinaryDisposable(s, inner);\n\t};\n\n\t/**\n\t* Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n\t* @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n\t*/\n\tmodule.exports = function switch_(source) {\n\t  return new SwitchObservable(source);\n\t};\n\n/***/ },\n/* 78 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar bindCallback = __webpack_require__(44);\n\tvar isFunction = __webpack_require__(9);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction MapObserver(o, selector, source) {\n\t  this._o = o;\n\t  this._fn = selector;\n\t  this._s = source;\n\t  this._i = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(MapObserver, AbstractObserver);\n\n\tMapObserver.prototype.next = function (x) {\n\t  var result = tryCatch(this._fn)(x, this._i++, this._s);\n\t  if (result === errorObj) {\n\t    return this._o.onError(result.e);\n\t  }\n\t  this._o.onNext(result);\n\t};\n\n\tMapObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tMapObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction MapObservable(source, fn, thisArg) {\n\t  this.source = source;\n\t  this._fn = bindCallback(fn, thisArg, 3);\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(MapObservable, ObservableBase);\n\n\tfunction innerMap(fn, self) {\n\t  return function (x, i, o) {\n\t    return fn.call(this, self._fn(x, i, o), i, o);\n\t  };\n\t}\n\n\tMapObservable.prototype.internalMap = function (fn, thisArg) {\n\t  return new MapObservable(this.source, innerMap(fn, this), thisArg);\n\t};\n\n\tMapObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new MapObserver(o, this._fn, this));\n\t};\n\n\tmodule.exports = function map(source, fn, thisArg) {\n\t  var thisFn = isFunction(fn) ? fn : function () {\n\t    return fn;\n\t  };\n\t  return source instanceof MapObservable ? source.internalMap(thisFn, thisArg) : new MapObservable(source, thisFn, thisArg);\n\t};\n\n/***/ },\n/* 79 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar map = __webpack_require__(78);\n\n\tfunction plucker(args, len) {\n\t  return function mapper(x) {\n\t    var currentProp = x;\n\t    for (var i = 0; i < len; i++) {\n\t      var p = currentProp[args[i]];\n\t      if (typeof p !== 'undefined') {\n\t        currentProp = p;\n\t      } else {\n\t        return undefined;\n\t      }\n\t    }\n\t    return currentProp;\n\t  };\n\t}\n\n\t/**\n\t * Retrieves the value of a specified nested property from all elements in\n\t * the Observable sequence.\n\t * @param {Arguments} arguments The nested properties to pluck.\n\t * @returns {Observable} Returns a new Observable sequence of property values.\n\t */\n\tmodule.exports = function pluck() {\n\t  var len = arguments.length,\n\t      args = new Array(len);\n\t  if (len === 0) {\n\t    throw new Error('List of properties cannot be empty.');\n\t  }\n\t  for (var i = 0; i < len; i++) {\n\t    args[i] = arguments[i];\n\t  }\n\t  var pluckedArgs = args.slice(1);\n\t  return map(args[0], plucker(pluckedArgs, pluckedArgs.length));\n\t};\n\n/***/ },\n/* 80 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AsyncSubject = __webpack_require__(11);\n\tvar multicast = __webpack_require__(50);\n\tvar isFunction = __webpack_require__(9);\n\n\tmodule.exports = function publishLast(source, selector) {\n\t  return isFunction(selector) ? multicast(source, function () {\n\t    return new AsyncSubject();\n\t  }, selector) : multicast(source, new AsyncSubject());\n\t};\n\n/***/ },\n/* 81 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar multicast = __webpack_require__(50);\n\tvar BehaviorSubject = __webpack_require__(82);\n\n\tfunction createBehaviorSubject(initialValue) {\n\t  return function fn() {\n\t    return new BehaviorSubject(initialValue);\n\t  };\n\t}\n\n\tmodule.exports = function publishValue() {\n\t  var source = arguments[0];\n\t  if (arguments.length === 3) {\n\t    return multicast(source, createBehaviorSubject(arguments[2]), arguments[1]);\n\t  } else if (arguments.length === 2) {\n\t    return multicast(source, new BehaviorSubject(arguments[1]));\n\t  } else {\n\t    throw new Error('Invalid arguments');\n\t  }\n\t};\n\n/***/ },\n/* 82 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Observable = __webpack_require__(8);\n\tvar Observer = __webpack_require__(1);\n\tvar Disposable = __webpack_require__(12);\n\tvar InnerSubscription = __webpack_require__(13);\n\tvar addProperties = __webpack_require__(14);\n\tvar cloneArray = __webpack_require__(15);\n\tvar thrower = __webpack_require__(20).thrower;\n\tvar inherits = __webpack_require__(6);\n\n\t/**\n\t*  Represents a value that changes over time.\n\t*  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n\t*/\n\tfunction BehaviorSubject(value) {\n\t  this.value = value;\n\t  this.observers = [];\n\t  this.isDisposed = false;\n\t  this.isStopped = false;\n\t  this.hasError = false;\n\t  Observable.call(this);\n\t}\n\n\tinherits(BehaviorSubject, Observable);\n\n\taddProperties(BehaviorSubject.prototype, Observer.prototype, {\n\t  _subscribe: function (o) {\n\t    Disposable.checkDisposed(this);\n\t    if (!this.isStopped) {\n\t      this.observers.push(o);\n\t      o.onNext(this.value);\n\t      return new InnerSubscription(this, o);\n\t    }\n\t    if (this.hasError) {\n\t      o.onError(this.error);\n\t    } else {\n\t      o.onCompleted();\n\t    }\n\t    return Disposable.empty;\n\t  },\n\t  /**\n\t   * Gets the current value or throws an exception.\n\t   * Value is frozen after onCompleted is called.\n\t   * After onError is called always throws the specified exception.\n\t   * An exception is always thrown after dispose is called.\n\t   * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n\t   */\n\t  getValue: function () {\n\t    Disposable.checkDisposed(this);\n\t    if (this.hasError) {\n\t      thrower(this.error);\n\t    }\n\t    return this.value;\n\t  },\n\t  /**\n\t   * Indicates whether the subject has observers subscribed to it.\n\t   * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n\t   */\n\t  hasObservers: function () {\n\t    Disposable.checkDisposed(this);\n\t    return this.observers.length > 0;\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the end of the sequence.\n\t   */\n\t  onCompleted: function () {\n\t    Disposable.checkDisposed(this);\n\t    if (this.isStopped) {\n\t      return;\n\t    }\n\t    this.isStopped = true;\n\t    for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t      os[i].onCompleted();\n\t    }\n\n\t    this.observers.length = 0;\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the exception.\n\t   * @param {Mixed} error The exception to send to all observers.\n\t   */\n\t  onError: function (error) {\n\t    Disposable.checkDisposed(this);\n\t    if (this.isStopped) {\n\t      return;\n\t    }\n\t    this.isStopped = true;\n\t    this.hasError = true;\n\t    this.error = error;\n\n\t    for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t      os[i].onError(error);\n\t    }\n\n\t    this.observers.length = 0;\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n\t   * @param {Mixed} value The value to send to all observers.\n\t   */\n\t  onNext: function (value) {\n\t    Disposable.checkDisposed(this);\n\t    if (this.isStopped) {\n\t      return;\n\t    }\n\t    this.value = value;\n\t    for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t      os[i].onNext(value);\n\t    }\n\t  },\n\t  /**\n\t   * Unsubscribe all observers and release resources.\n\t   */\n\t  dispose: function () {\n\t    this.isDisposed = true;\n\t    this.observers = null;\n\t    this.value = null;\n\t    this.error = null;\n\t  }\n\t});\n\n\tmodule.exports = BehaviorSubject;\n\n/***/ },\n/* 83 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar multicast = __webpack_require__(50);\n\tvar ReplaySubject = __webpack_require__(84);\n\tvar isFunction = __webpack_require__(9);\n\n\tmodule.exports = function replay(source, selector, bufferSize, windowSize, scheduler) {\n\t  return isFunction(selector) ? multicast(source, function () {\n\t    return new ReplaySubject(bufferSize, windowSize, scheduler);\n\t  }, selector) : multicast(source, new ReplaySubject(bufferSize, windowSize, scheduler));\n\t};\n\n/***/ },\n/* 84 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Disposable = __webpack_require__(12);\n\tvar Observable = __webpack_require__(8);\n\tvar Observer = __webpack_require__(1);\n\tvar ScheduledObserver = __webpack_require__(85);\n\tvar Scheduler = __webpack_require__(21);\n\tvar addProperties = __webpack_require__(14);\n\tvar cloneArray = __webpack_require__(15);\n\tvar inherits = __webpack_require__(6);\n\n\tvar MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\n\tfunction createRemovableDisposable(subject, observer) {\n\t  return Disposable.create(function () {\n\t    observer.dispose();\n\t    !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n\t  });\n\t}\n\n\t/**\n\t * Represents an object that is both an observable sequence as well as an observer.\n\t * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n\t *\n\t *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n\t *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n\t *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n\t *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n\t */\n\tfunction ReplaySubject(bufferSize, windowSize, scheduler) {\n\t  this.bufferSize = bufferSize == null ? MAX_SAFE_INTEGER : bufferSize;\n\t  this.windowSize = windowSize == null ? MAX_SAFE_INTEGER : windowSize;\n\t  this.scheduler = scheduler || Scheduler.queue;\n\t  this.q = [];\n\t  this.observers = [];\n\t  this.isStopped = false;\n\t  this.isDisposed = false;\n\t  this.hasError = false;\n\t  this.error = null;\n\t  Observable.call(this);\n\t}\n\n\tinherits(ReplaySubject, Observable);\n\n\taddProperties(ReplaySubject.prototype, Observer.prototype, {\n\t  _subscribe: function (o) {\n\t    Disposable.checkDisposed(this);\n\t    var so = new ScheduledObserver(this.scheduler, o),\n\t        subscription = createRemovableDisposable(this, so);\n\n\t    this._trim(this.scheduler.now());\n\t    this.observers.push(so);\n\n\t    for (var i = 0, len = this.q.length; i < len; i++) {\n\t      so.onNext(this.q[i].value);\n\t    }\n\n\t    if (this.hasError) {\n\t      so.onError(this.error);\n\t    } else if (this.isStopped) {\n\t      so.onCompleted();\n\t    }\n\n\t    so.ensureActive();\n\t    return subscription;\n\t  },\n\t  /**\n\t   * Indicates whether the subject has observers subscribed to it.\n\t   * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n\t   */\n\t  hasObservers: function () {\n\t    Disposable.checkDisposed(this);\n\t    return this.observers.length > 0;\n\t  },\n\t  _trim: function (now) {\n\t    while (this.q.length > this.bufferSize) {\n\t      this.q.shift();\n\t    }\n\t    while (this.q.length > 0 && now - this.q[0].interval > this.windowSize) {\n\t      this.q.shift();\n\t    }\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n\t   * @param {Mixed} value The value to send to all observers.\n\t   */\n\t  onNext: function (value) {\n\t    Disposable.checkDisposed(this);\n\t    if (this.isStopped) {\n\t      return;\n\t    }\n\t    var now = this.scheduler.now();\n\t    this.q.push({ interval: now, value: value });\n\t    this._trim(now);\n\n\t    for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t      var observer = os[i];\n\t      observer.onNext(value);\n\t      observer.ensureActive();\n\t    }\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the exception.\n\t   * @param {Mixed} error The exception to send to all observers.\n\t   */\n\t  onError: function (error) {\n\t    Disposable.checkDisposed(this);\n\t    if (this.isStopped) {\n\t      return;\n\t    }\n\t    this.isStopped = true;\n\t    this.error = error;\n\t    this.hasError = true;\n\t    var now = this.scheduler.now();\n\t    this._trim(now);\n\t    for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t      var observer = os[i];\n\t      observer.onError(error);\n\t      observer.ensureActive();\n\t    }\n\t    this.observers.length = 0;\n\t  },\n\t  /**\n\t   * Notifies all subscribed observers about the end of the sequence.\n\t   */\n\t  onCompleted: function () {\n\t    Disposable.checkDisposed(this);\n\t    if (this.isStopped) {\n\t      return;\n\t    }\n\t    this.isStopped = true;\n\t    var now = this.scheduler.now();\n\t    this._trim(now);\n\t    for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n\t      var observer = os[i];\n\t      observer.onCompleted();\n\t      observer.ensureActive();\n\t    }\n\t    this.observers.length = 0;\n\t  },\n\t  /**\n\t   * Unsubscribe all observers and release resources.\n\t   */\n\t  dispose: function () {\n\t    this.isDisposed = true;\n\t    this.observers = null;\n\t  }\n\t});\n\n\tmodule.exports = ReplaySubject;\n\n/***/ },\n/* 85 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar SerialDisposable = __webpack_require__(36);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj,\n\t    thrower = tryCatchUtils.thrower;\n\n\tfunction ScheduledObserver(scheduler, observer) {\n\t  AbstractObserver.call(this);\n\t  this.scheduler = scheduler;\n\t  this.observer = observer;\n\t  this.isAcquired = false;\n\t  this.hasFaulted = false;\n\t  this.queue = [];\n\t  this.disposable = new SerialDisposable();\n\t}\n\n\tinherits(ScheduledObserver, AbstractObserver);\n\n\tfunction enqueueNext(observer, x) {\n\t  return function () {\n\t    observer.onNext(x);\n\t  };\n\t}\n\tfunction enqueueError(observer, e) {\n\t  return function () {\n\t    observer.onError(e);\n\t  };\n\t}\n\tfunction enqueueCompleted(observer) {\n\t  return function () {\n\t    observer.onCompleted();\n\t  };\n\t}\n\n\tScheduledObserver.prototype.next = function (x) {\n\t  this.queue.push(enqueueNext(this.observer, x));\n\t};\n\n\tScheduledObserver.prototype.error = function (e) {\n\t  this.queue.push(enqueueError(this.observer, e));\n\t};\n\n\tScheduledObserver.prototype.completed = function () {\n\t  this.queue.push(enqueueCompleted(this.observer));\n\t};\n\n\tfunction scheduleMethod(state, recurse) {\n\t  var work;\n\t  if (state.queue.length > 0) {\n\t    work = state.queue.shift();\n\t  } else {\n\t    state.isAcquired = false;\n\t    return;\n\t  }\n\t  var res = tryCatch(work)();\n\t  if (res === errorObj) {\n\t    state.queue = [];\n\t    state.hasFaulted = true;\n\t    return thrower(res.e);\n\t  }\n\t  recurse(state);\n\t}\n\n\tScheduledObserver.prototype.ensureActive = function () {\n\t  var isOwner = false;\n\t  if (!this.hasFaulted && this.queue.length > 0) {\n\t    isOwner = !this.isAcquired;\n\t    this.isAcquired = true;\n\t  }\n\t  isOwner && this.disposable.setDisposable(this.scheduler.scheduleRecursive(this, scheduleMethod));\n\t};\n\n\tScheduledObserver.prototype.dispose = function () {\n\t  AbstractObserver.prototype.dispose.call(this);\n\t  this.disposable.dispose();\n\t};\n\n\tmodule.exports = ScheduledObserver;\n\n/***/ },\n/* 86 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar inherits = __webpack_require__(6);\n\tvar tryCatchUtils = __webpack_require__(20);\n\tvar tryCatch = tryCatchUtils.tryCatch,\n\t    errorObj = tryCatchUtils.errorObj;\n\n\tfunction ScanObserver(o, parent) {\n\t  this._o = o;\n\t  this._p = parent;\n\t  this._fn = parent.accumulator;\n\t  this._hs = parent.hasSeed;\n\t  this._s = parent.seed;\n\t  this._ha = false;\n\t  this._a = null;\n\t  this._hv = false;\n\t  this._i = 0;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(ScanObserver, AbstractObserver);\n\n\tScanObserver.prototype.next = function (x) {\n\t  !this._hv && (this._hv = true);\n\t  if (this._ha) {\n\t    this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n\t  } else {\n\t    this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n\t    this._ha = true;\n\t  }\n\t  if (this._a === errorObj) {\n\t    return this._o.onError(this._a.e);\n\t  }\n\t  this._o.onNext(this._a);\n\t  this._i++;\n\t};\n\n\tScanObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tScanObserver.prototype.completed = function () {\n\t  !this._hv && this._hs && this._o.onNext(this._s);\n\t  this._o.onCompleted();\n\t};\n\n\tfunction ScanObservable(source, accumulator, hasSeed, seed) {\n\t  this.source = source;\n\t  this.accumulator = accumulator;\n\t  this.hasSeed = hasSeed;\n\t  this.seed = seed;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(ScanObservable, ObservableBase);\n\n\tScanObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new ScanObserver(o, this));\n\t};\n\n\t/**\n\t*  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n\t*  For aggregation behavior with no intermediate results, see Observable.aggregate.\n\t* @param {Mixed} [seed] The initial accumulator value.\n\t* @param {Function} accumulator An accumulator function to be invoked on each element.\n\t* @returns {Observable} An observable sequence containing the accumulated values.\n\t*/\n\tmodule.exports = function scan() {\n\t  var source = arguments[0],\n\t      hasSeed = false,\n\t      seed,\n\t      accumulator = arguments[1];\n\t  if (arguments.length === 3) {\n\t    hasSeed = true;\n\t    seed = arguments[2];\n\t  }\n\t  return new ScanObservable(source, accumulator, hasSeed, seed);\n\t};\n\n/***/ },\n/* 87 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar publish = __webpack_require__(48);\n\n\tmodule.exports = function share(source) {\n\t  return publish(source).refCount();\n\t};\n\n/***/ },\n/* 88 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar replay = __webpack_require__(83);\n\n\tmodule.exports = function shareReplay(source, bufferSize, windowSize, scheduler) {\n\t  return replay(source, null, bufferSize, windowSize, scheduler).refCount();\n\t};\n\n/***/ },\n/* 89 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar publishValue = __webpack_require__(81);\n\n\tmodule.exports = function shareValue(source, initialValue) {\n\t  return publishValue(source, initialValue).refCount();\n\t};\n\n/***/ },\n/* 90 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar ObservableBase = __webpack_require__(34);\n\tvar errors = __webpack_require__(7);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction SkipObserver(o, r) {\n\t  this._o = o;\n\t  this._r = r;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SkipObserver, AbstractObserver);\n\n\tSkipObserver.prototype.next = function (x) {\n\t  if (this._r <= 0) {\n\t    this._o.onNext(x);\n\t  } else {\n\t    this._r--;\n\t  }\n\t};\n\tSkipObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tSkipObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction SkipObservable(source, count) {\n\t  this.source = source;\n\t  this._count = count;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(SkipObservable, ObservableBase);\n\n\tSkipObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new SkipObserver(o, this._count));\n\t};\n\n\t/**\n\t * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n\t * @param {Number} count The number of elements to skip before returning the remaining elements.\n\t * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n\t */\n\tmodule.exports = function skip(source, count) {\n\t  if (count < 0) {\n\t    throw new errors.ArgumentOutOfRangeError();\n\t  }\n\t  return new SkipObservable(source, count);\n\t};\n\n/***/ },\n/* 91 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar BinaryDisposable = __webpack_require__(30);\n\tvar SingleAssignmentDisposable = __webpack_require__(19);\n\tvar fromPromise = __webpack_require__(37);\n\tvar isPromise = __webpack_require__(38);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction SkipUntilSourceObserver(o, p) {\n\t  this._o = o;\n\t  this._p = p;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SkipUntilSourceObserver, AbstractObserver);\n\n\tSkipUntilSourceObserver.prototype.next = function (x) {\n\t  this._p._open && this._o.onNext(x);\n\t};\n\tSkipUntilSourceObserver.prototype.error = function (err) {\n\t  this._o.onError(err);\n\t};\n\tSkipUntilSourceObserver.prototype.onCompleted = function () {\n\t  this._p._open && this._o.onCompleted();\n\t};\n\n\tfunction SkipUntilOtherObserver(o, p, r) {\n\t  this._o = o;\n\t  this._p = p;\n\t  this._r = r;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(SkipUntilOtherObserver, AbstractObserver);\n\n\tSkipUntilOtherObserver.prototype.next = function () {\n\t  this._p._open = true;this._r.dispose();\n\t};\n\tSkipUntilOtherObserver.prototype.error = function (err) {\n\t  this._o.onError(err);\n\t};\n\tSkipUntilOtherObserver.prototype.onCompleted = function () {\n\t  this._r.dispose();\n\t};\n\n\tfunction SkipUntilObservable(source, other) {\n\t  this._s = source;\n\t  this._o = isPromise(other) ? fromPromise(other) : other;\n\t  this._open = false;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(SkipUntilObservable, ObservableBase);\n\n\tSkipUntilObservable.prototype.subscribeCore = function (o) {\n\t  var leftSubscription = new SingleAssignmentDisposable();\n\t  leftSubscription.setDisposable(this._s.subscribe(new SkipUntilSourceObserver(o, this)));\n\n\t  isPromise(this._o) && (this._o = fromPromise(this._o));\n\n\t  var rightSubscription = new SingleAssignmentDisposable();\n\t  rightSubscription.setDisposable(this._o.subscribe(new SkipUntilOtherObserver(o, this, rightSubscription)));\n\n\t  return new BinaryDisposable(leftSubscription, rightSubscription);\n\t};\n\n\t/**\n\t * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n\t * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n\t * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n\t */\n\tmodule.exports = function skipUntil(source, other) {\n\t  return new SkipUntilObservable(source, other);\n\t};\n\n/***/ },\n/* 92 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar ObservableBase = __webpack_require__(34);\n\tvar empty = __webpack_require__(41);\n\tvar errors = __webpack_require__(7);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction TakeObserver(o, c) {\n\t  this._o = o;\n\t  this._c = c;\n\t  this._r = c;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(TakeObserver, AbstractObserver);\n\n\tTakeObserver.prototype.next = function (x) {\n\t  if (this._r-- > 0) {\n\t    this._o.onNext(x);\n\t    this._r <= 0 && this._o.onCompleted();\n\t  }\n\t};\n\n\tTakeObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tTakeObserver.prototype.completed = function () {\n\t  this._o.onCompleted();\n\t};\n\n\tfunction TakeObservable(source, count) {\n\t  this.source = source;\n\t  this._count = count;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(TakeObservable, ObservableBase);\n\n\tTakeObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new TakeObserver(o, this._count));\n\t};\n\n\t/**\n\t *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n\t * @param {Number} count The number of elements to return.\n\t * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n\t * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n\t */\n\tmodule.exports = function (source, count, scheduler) {\n\t  if (count < 0) {\n\t    throw new errors.ArgumentOutOfRangeError();\n\t  }\n\t  if (count === 0) {\n\t    return empty(scheduler);\n\t  }\n\t  return new TakeObservable(source, count);\n\t};\n\n/***/ },\n/* 93 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar ObservableBase = __webpack_require__(34);\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar BinaryDisposable = __webpack_require__(30);\n\tvar isPromise = __webpack_require__(38);\n\tvar fromPromise = __webpack_require__(37);\n\tvar noop = __webpack_require__(3);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction TakeUntilObserver(o) {\n\t  this._o = o;\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(TakeUntilObserver, AbstractObserver);\n\n\tTakeUntilObserver.prototype.next = function () {\n\t  this._o.onCompleted();\n\t};\n\tTakeUntilObserver.prototype.error = function (e) {\n\t  this._o.onError(e);\n\t};\n\tTakeUntilObserver.prototype.onCompleted = noop;\n\n\tfunction TakeUntilObservable(source, other) {\n\t  this.source = source;\n\t  this._other = isPromise(other) ? fromPromise(other) : other;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(TakeUntilObservable, ObservableBase);\n\n\tTakeUntilObservable.prototype.subscribeCore = function (o) {\n\t  return new BinaryDisposable(this.source.subscribe(o), this._other.subscribe(new TakeUntilObserver(o)));\n\t};\n\n\t/**\n\t * Returns the values from the source observable sequence until the other observable sequence produces a value.\n\t * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n\t * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n\t */\n\tmodule.exports = function takeUntil(source, other) {\n\t  return new TakeUntilObservable(source, other);\n\t};\n\n/***/ },\n/* 94 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar AbstractObserver = __webpack_require__(5);\n\tvar ObservableBase = __webpack_require__(34);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction ToArrayObserver(o) {\n\t  this.o = o;\n\t  this.a = [];\n\t  AbstractObserver.call(this);\n\t}\n\n\tinherits(ToArrayObserver, AbstractObserver);\n\n\tToArrayObserver.prototype.next = function (x) {\n\t  this.a.push(x);\n\t};\n\tToArrayObserver.prototype.error = function (e) {\n\t  this.o.onError(e);\n\t};\n\tToArrayObserver.prototype.completed = function () {\n\t  this.o.onNext(this.a);this.o.onCompleted();\n\t};\n\n\tfunction ToArrayObservable(source) {\n\t  this.source = source;\n\t  ObservableBase.call(this);\n\t}\n\n\tinherits(ToArrayObservable, ObservableBase);\n\n\tToArrayObservable.prototype.subscribeCore = function (o) {\n\t  return this.source.subscribe(new ToArrayObserver(o));\n\t};\n\n\t/**\n\t* Creates an array from an observable sequence.\n\t* @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n\t*/\n\tmodule.exports = function toArray(o) {\n\t  return new ToArrayObservable(o);\n\t};\n\n/***/ },\n/* 95 */\n/***/ function(module, exports) {\n\n\t/* WEBPACK VAR INJECTION */(function(global) {'use strict';\n\n\tmodule.exports = function toPromise(source, promiseCtor) {\n\t  promiseCtor || (promiseCtor = global.Promise);\n\t  return new promiseCtor(function (resolve, reject) {\n\t    // No cancellation can be done\n\t    var value;\n\t    source.subscribe(function (v) {\n\t      value = v;\n\t    }, reject, function () {\n\t      resolve(value);\n\t    });\n\t  });\n\t};\n\t/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n/***/ },\n/* 96 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\n\tvar Observable = __webpack_require__(8);\n\tvar Observer = __webpack_require__(1);\n\tvar addProperties = __webpack_require__(14);\n\tvar inherits = __webpack_require__(6);\n\n\tfunction AnonymousSubject(observer, observable) {\n\t  this.observer = observer;\n\t  this.observable = observable;\n\t  Observable.call(this);\n\t}\n\n\tinherits(AnonymousSubject, Observable);\n\n\taddProperties(AnonymousSubject.prototype, Observer.prototype, {\n\t  _subscribe: function (o) {\n\t    return this.observable.subscribe(o);\n\t  },\n\t  onCompleted: function () {\n\t    this.observer.onCompleted();\n\t  },\n\t  onError: function (error) {\n\t    this.observer.onError(error);\n\t  },\n\t  onNext: function (value) {\n\t    this.observer.onNext(value);\n\t  }\n\t});\n\n\t/**\n\t * Creates a subject from the specified observer and observable.\n\t * @param {Observer} observer The observer used to send messages to the subject.\n\t * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n\t * @returns {Subject} Subject implemented using the given observer and observable.\n\t */\n\tmodule.exports = function create(observer, observable) {\n\t  return new AnonymousSubject(observer, observable);\n\t};\n\n/***/ }\n/******/ ])\n});\n;\n"
  },
  {
    "path": "src/modular/helpers/comparer.js",
    "content": "'use strict';\n\nmodule.exports = function comparer (x, y) {\n  if (x > y) { return 1; }\n  if (y > x) { return -1; }\n  return 0;\n};\n"
  },
  {
    "path": "src/modular/helpers/identity.js",
    "content": "'use strict';\n\nmodule.exports = function identity (x) { return x; };\n"
  },
  {
    "path": "src/modular/helpers/isarraylike.js",
    "content": "'use strict'\n\nmodule.exports = function isArrayLike (o) {\n  return o && o.length !== undefined;\n};\n"
  },
  {
    "path": "src/modular/helpers/isfunction.js",
    "content": "'use strict';\n\nmodule.exports = (function () {\n  var isFn = function (value) {\n    return typeof value === 'function' || false;\n  };\n\n  // fallback for older versions of Chrome and Safari\n  if (isFn(/x/)) {\n    isFn = function(value) {\n      return typeof value === 'function' &&\n        Object.prototype.toString.call(value) === '[object Function]';\n    };\n  }\n  return isFn;\n}());\n"
  },
  {
    "path": "src/modular/helpers/isiterable.js",
    "content": "'use strict';\n\nvar $iterator$ = require('./iterator');\n\nmodule.exports = function isIterable (o) {\n  return o && o[$iterator$] !== undefined;\n};\n"
  },
  {
    "path": "src/modular/helpers/ispromise.js",
    "content": "'use strict';\n\nvar isFunction = require('./isfunction');\n\nmodule.exports = function isPromise (p) {\n  return p && isFunction(p.then);\n};\n"
  },
  {
    "path": "src/modular/helpers/iterator.js",
    "content": "'use strict';\n\n// Shim in iterator support\nvar $iterator$ = (typeof global.Symbol === 'function' && global.Symbol.iterator) ||\n  '_es6shim_iterator_';\n// Bug for mozilla version\nif (global.Set && typeof new global.Set()['@@iterator'] === 'function') {\n  $iterator$ = '@@iterator';\n}\n\nmodule.exports = $iterator$;\n"
  },
  {
    "path": "src/modular/helpers/noop.js",
    "content": "'use strict';\n\nmodule.exports = function noop () { };\n"
  },
  {
    "path": "src/modular/index.js",
    "content": "'use strict';\n\nvar Observer = require('./observer');\n\nObserver.addToObject({\n  create: require('./observer/create')\n});\n\nvar Observable = require('./observable');\n\nObservable.addToObject({\n  race: require('./observable/race'),\n  bindCallback: require('./observable/bindcallback'),\n  bindNodeCallback: require('./observable/bindnodecallback'),\n  case: require('./observable/case'),\n  catch: require('./observable/catch'),\n  combineLatest: require('./observable/combinelatest'),\n  concat: require('./observable/concat'),\n  create: require('./observable/create'),\n  defer: require('./observable/defer'),\n  empty: require('./observable/empty'),\n  forkJoin: require('./observable/forkjoin'),\n  from: require('./observable/from'),\n  fromArray: require('./observable/fromarray'),\n  fromEvent: require('./observable/fromevent'),\n  fromEventPattern: require('./observable/fromeventpattern'),\n  fromPromise: require('./observable/frompromise'),\n  generate: require('./observable/generate'),\n  generateAbsolute: require('./observable/generateabsolute'),\n  generateRelative: require('./observable/generaterelative'),\n  interval: require('./observable/interval'),\n  just: require('./observable/just'),\n  merge: require('./observable/merge'),\n  never: require('./observable/never'),\n  of: require('./observable/of'),\n  ofScheduled: require('./observable/ofscheduled'),\n  onErrorResumeNext: require('./observable/onerrorresumenext'),\n  pairs: require('./observable/pairs'),\n  range: require('./observable/range'),\n  repeat: require('./observable/repeatvalue'),\n  sequenceEqual: require('./observable/sequenceequal'),\n  start: require('./observable/start'),\n  startAsync: require('./observable/startasync'),\n  throw: require('./observable/throw'),\n  timer: require('./observable/timer'),\n  toAsync: require('./observable/toasync'),\n  when: require('./observable/when'),\n  using: require('./observable/using'),\n  zip: require('./observable/zip')\n});\n\nObservable.addToPrototype({\n  race: require('./observable/race'),\n  and: require('./observable/and'),\n  asObservable: require('./observable/asobservable'),\n  average: require('./observable/average'),\n  buffer: require('./observable/buffer'),\n  bufferCount: require('./observable/buffercount'),\n  bufferTime: require('./observable/buffertime'),\n  bufferTimeOrCount: require('./observable/buffertimeorcount'),\n  catch: require('./observable/catch'),\n  catchHandler: require('./observable/catchhandler'),\n  combineLatest: require('./observable/combinelatest'),\n  concat: require('./observable/concat'),\n  concatAll: require('./observable/concatall'),\n  controlled: require('./observable/controlled'),\n  count: require('./observable/count'),\n  debounce: require('./observable/debounce'),\n  defaultIfEmpty: require('./observable/defaultifempty'),\n  delay: require('./observable/delay'),\n  delaySubscription: require('./observable/delaysubscription'),\n  dematerialize: require('./observable/dematerialize'),\n  distinct: require('./observable/distinct'),\n  distinctUntilChanged: require('./observable/distinctuntilchanged'),\n  do: require('./observable/tap'),\n  every: require('./observable/every'),\n  filter: require('./observable/filter'),\n  finally: require('./observable/finally'),\n  find: require('./observable/find'),\n  findIndex: require('./observable/findindex'),\n  first: require('./observable/first'),\n  flatMap: require('./observable/flatmap'),\n  flatMapFirst: require('./observable/flatmapfirst'),\n  flatMapLatest: require('./observable/flatmaplatest'),\n  flatMapMaxConcurrent: require('./observable/flatmapmaxconcurrent'),\n  forkJoin: require('./observable/forkjoin'),\n  groupJoin: require('./observable/groupjoin'),\n  ignoreElements: require('./observable/ignoreelements'),\n  includes: require('./observable/includes'),\n  indexOf: require('./observable/indexof'),\n  isEmpty: require('./observable/isempty'),\n  join: require('./observable/join'),\n  last: require('./observable/last'),\n  lastIndexOf: require('./observable/lastindexof'),\n  map: require('./observable/map'),\n  materialize: require('./observable/materialize'),\n  max: require('./observable/max'),\n  maxBy: require('./observable/maxby'),\n  merge: require('./observable/merge'),\n  mergeAll: require('./observable/mergeall'),\n  mergeConcat: require('./observable/mergeconcat'),\n  min: require('./observable/min'),\n  minBy: require('./observable/minby'),\n  multicast: require('./observable/multicast'),\n  observeOn: require('./observable/observeon'),\n  onErrorResumeNext: require('./observable/onerrorresumenext'),\n  pairwise: require('./observable/pairwise'),\n  partition: require('./observable/partition'),\n  pausable: require('./observable/pausable'),\n  pausableBuffered: require('./observable/pausablebuffered'),\n  pluck: require('./observable/pluck'),\n  publish: require('./observable/publish'),\n  publishLast: require('./observable/publishlast'),\n  publishValue: require('./observable/publishvalue'),\n  reduce: require('./observable/reduce'),\n  repeat: require('./observable/repeat'),\n  repeatWhen: require('./observable/repeatwhen'),\n  replay: require('./observable/replay'),\n  retry: require('./observable/retry'),\n  retryWhen: require('./observable/retrywhen'),\n  sample: require('./observable/sample'),\n  scan: require('./observable/scan'),\n  sequenceEqual: require('./observable/sequenceequal'),\n  share: require('./observable/share'),\n  shareReplay: require('./observable/sharereplay'),\n  shareValue: require('./observable/sharevalue'),\n  skip: require('./observable/skip'),\n  skipLast: require('./observable/skiplast'),\n  skipLastTime: require('./observable/skiplastwithtime'),\n  skipUntil: require('./observable/skipuntil'),\n  skipUntilTime: require('./observable/skipuntilwithtime'),\n  skipWhile: require('./observable/skipwhile'),\n  slice: require('./observable/slice'),\n  subscribeOn: require('./observable/subscribeon'),\n  some: require('./observable/some'),\n  sum: require('./observable/sum'),\n  switch: require('./observable/switch'),\n  switchFirst: require('./observable/switchfirst'),\n  take: require('./observable/take'),\n  takeLast: require('./observable/takelast'),\n  takeLastBuffer: require('./observable/takelastbuffer'),\n  takeLastBufferTime: require('./observable/takelastbufferwithtime'),\n  lastLastTime: require('./observable/takelastwithtime'),\n  takeUntil: require('./observable/takeuntil'),\n  takeUntilTime: require('./observable/takeuntilwithtime'),\n  takeWhile: require('./observable/takewhile'),\n  tap: require('./observable/tap'),\n  thenDo: require('./observable/thendo'),\n  throttle: require('./observable/throttle'),\n  timeInterval: require('./observable/timeinterval'),\n  timestamp: require('./observable/timestamp'),\n  toArray: require('./observable/toarray'),\n  toMap: require('./observable/tomap'),\n  toPromise: require('./observable/topromise'),\n  toSet: require('./observable/toset'),\n  transduce: require('./observable/transduce'),\n  window: require('./observable/window'),\n  windowCount: require('./observable/windowcount'),\n  windowTime: require('./observable/windowtime'),\n  windowTimeOrCount: require('./observable/windowtimeorcount'),\n  withLatestFrom: require('./observable/withlatestfrom'),\n  zip: require('./observable/zip'),\n  zipIterable: require('./observable/zipiterable'),\n});\n\n// RxJS V4 aliases\nObservable.prototype.amb = Observable.prototype.race;\nObservable.amb = Observable.race;\nObservable.prototype.selectMany = Observable.prototype.flatMap;\nObservable.prototype.select = Observable.prototype.map;\nObservable.prototype.where = Observable.prototype.filter;\n\n// RxJS V5 aliases\nObservable.prototype.mergeMap = Observable.prototype.flatMap;\nObservable.prototype.switchMap = Observable.prototype.flatMapLatest;\nObservable.prototype.exhaustMap = Observable.prototype.flatMapFirst;\nObservable.prototype.exhaust = Observable.prototype.switchFirst;\nObservable.prototype.publishReplay = Observable.prototype.replay;\nObservable.fromCallback = Observable.bindCallback;\nObservable.fromNodeCallback = Observable.bindNodeCallback;\n\nvar Subject = require('./subject');\nSubject.addToObject({\n  create: require('./subject/create')\n});\n\nvar Rx = {\n  // Disposables\n  BinaryDisposable: require('./binarydisposable'),\n  CompositeDisposable: require('./compositedisposable'),\n  Disposable: require('./disposable'),\n  NAryDisposable: require('./narydisposable'),\n  SerialDisposable: require('./serialdisposable'),\n  SingleAssignmentDisposable: require('./singleassignmentdisposable'),\n\n  // Schedulers\n  Scheduler: require('./scheduler'),\n  VirtualTimeScheduler: require('./scheduler/virtualtimescheduler'),\n  HistoricalScheduler: require('./scheduler/historicalscheduler'),\n\n  // Core\n  Observer: Observer,\n  Observable: Observable,\n\n  // Subjects\n  AsyncSubject: require('./asyncsubject'),\n  BehaviorSubject: require('./behaviorsubject'),\n  ReplaySubject: require('./replaysubject'),\n  Subject: Subject,\n\n  // Testing\n  reactiveTest: require('./testing/reactivetest'),\n  TestScheduler: require('./testing/testscheduler')\n};\n\nmodule.exports = Rx;\n"
  },
  {
    "path": "src/modular/internal/addproperties.js",
    "content": "'use strict';\n\nmodule.exports = function addProperties() {\n  var obj = arguments[0];\n  for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n  for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n    var source = sources[idx];\n    for (var prop in source) {\n      obj[prop] = source[prop];\n    }\n  }\n};\n"
  },
  {
    "path": "src/modular/internal/addref.js",
    "content": "'use strict';\n\nvar ObservableBase = require('../observable/observablebase');\nvar BinaryDisposable = require('../binarydisposable');\nvar inherits = require('inherits');\n\nfunction AddRefObservable(xs, r) {\n  this._xs = xs;\n  this._r = r;\n  ObservableBase.call(this);\n}\n\ninherits(AddRefObservable, ObservableBase);\n\nAddRefObservable.prototype.subscribeCore = function (o) {\n  return new BinaryDisposable(this._r.getDisposable(), this._xs.subscribe(o));\n};\n\nmodule.exports = function addRef (xs, r) {\n  return new AddRefObservable(xs, r);\n};\n"
  },
  {
    "path": "src/modular/internal/bindcallback.js",
    "content": "'use strict';\n\nmodule.exports = function bindCallback(func, thisArg, argCount) {\n  if (typeof thisArg === 'undefined') { return func; }\n  switch(argCount) {\n    case 0:\n      return function() { return func.call(thisArg); };\n    case 1:\n      return function(arg) { return func.call(thisArg, arg); };\n    case 2:\n      return function(value, index) { return func.call(thisArg, value, index); };\n    case 3:\n      return function(value, index, collection) { return func.call(thisArg, value, index, collection); };\n  }\n\n  return function() {\n    return func.apply(thisArg, arguments);\n  };\n};\n"
  },
  {
    "path": "src/modular/internal/clonearray.js",
    "content": "'use strict';\n\nmodule.exports = function cloneArray(arr) {\n  var len = arr.length, a = new Array(len);\n  for(var i = 0; i < len; i++) { a[i] = arr[i]; }\n  return a;\n};\n"
  },
  {
    "path": "src/modular/internal/errors.js",
    "content": "'use strict';\n\nfunction EmptyError () {\n  this.message = 'Sequence contains no elements.';\n  Error.call(this);\n}\nEmptyError.prototype = Object.create(Error.prototype);\nEmptyError.prototype.name = 'EmptyError';\n\nfunction ObjectDisposedError() {\n  this.message = 'Object has been disposed';\n  Error.call(this);\n}\nObjectDisposedError.prototype = Object.create(Error.prototype);\nObjectDisposedError.prototype.name = 'ObjectDisposedError';\n\nfunction ArgumentOutOfRangeError() {\n  this.message = 'Argument out of range';\n  Error.call(this);\n}\nArgumentOutOfRangeError.prototype = Object.create(Error.prototype);\nArgumentOutOfRangeError.prototype.name = 'ArgumentOutOfRangeError';\n\nfunction NotSupportedError(message) {\n  this.message = message || 'This operation is not supported';\n  Error.call(this);\n}\nNotSupportedError.prototype = Object.create(Error.prototype);\nNotSupportedError.prototype.name = 'NotSupportedError';\n\nfunction NotImplementedError(message) {\n  this.message = message || 'This operation is not implemented';\n  Error.call(this);\n}\nNotImplementedError.prototype = Object.create(Error.prototype);\nNotImplementedError.prototype.name = 'NotImplementedError';\n\nfunction CompositeError (errors) {\n  this.innerErrors = errors;\n  this.message = 'This contains multiple errors. Check the innerErrors';\n  Error.call(this);\n}\n\nCompositeError.prototype = Object.create(Error.prototype);\nCompositeError.prototype.name = 'CompositeError';\n\nmodule.exports = {\n  CompositeError: CompositeError,\n  EmptyError: EmptyError,\n  ObjectDisposedError: ObjectDisposedError,\n  ArgumentOutOfRangeError: ArgumentOutOfRangeError,\n  NotSupportedError: NotSupportedError,\n  NotImplementedError: NotImplementedError\n};\n"
  },
  {
    "path": "src/modular/internal/innersubscription.js",
    "content": "'use strict';\n\nfunction InnerSubscription(s, o) {\n  this._s = s;\n  this._o = o;\n}\n\nInnerSubscription.prototype.dispose = function () {\n  if (!this._s.isDisposed && this._o !== null) {\n    var idx = this._s.observers.indexOf(this._o);\n    this._s.observers.splice(idx, 1);\n    this._o = null;\n  }\n};\n\nmodule.exports = InnerSubscription;\n"
  },
  {
    "path": "src/modular/internal/isequal.js",
    "content": "var argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dateTag] = typedArrayTags[errorTag] =\ntypedArrayTags[funcTag] = typedArrayTags[mapTag] =\ntypedArrayTags[numberTag] = typedArrayTags[objectTag] =\ntypedArrayTags[regexpTag] = typedArrayTags[setTag] =\ntypedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;\n\nvar objectProto = Object.prototype,\n    hasOwnProperty = objectProto.hasOwnProperty,\n    objToString = objectProto.toString,\n    MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\nvar keys = Object.keys || (function() {\n    var hasOwnProperty = Object.prototype.hasOwnProperty,\n        hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),\n        dontEnums = [\n          'toString',\n          'toLocaleString',\n          'valueOf',\n          'hasOwnProperty',\n          'isPrototypeOf',\n          'propertyIsEnumerable',\n          'constructor'\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    return function(obj) {\n      if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n        throw new TypeError('Object.keys called on non-object');\n      }\n\n      var result = [], prop, i;\n\n      for (prop in obj) {\n        if (hasOwnProperty.call(obj, prop)) {\n          result.push(prop);\n        }\n      }\n\n      if (hasDontEnumBug) {\n        for (i = 0; i < dontEnumsLength; i++) {\n          if (hasOwnProperty.call(obj, dontEnums[i])) {\n            result.push(dontEnums[i]);\n          }\n        }\n      }\n      return result;\n    };\n  }());\n\nfunction equalObjects(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objProps = keys(object),\n      objLength = objProps.length,\n      othProps = keys(other),\n      othLength = othProps.length;\n\n  if (objLength !== othLength && !isLoose) {\n    return false;\n  }\n  var index = objLength, key;\n  while (index--) {\n    key = objProps[index];\n    if (!(isLoose ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  var skipCtor = isLoose;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key],\n        result;\n\n    if (!(result === undefined ? equalFunc(objValue, othValue, isLoose, stackA, stackB) : result)) {\n      return false;\n    }\n    skipCtor || (skipCtor = key === 'constructor');\n  }\n  if (!skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    if (objCtor !== othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor === 'function' && objCtor instanceof objCtor &&\n          typeof othCtor === 'function' && othCtor instanceof othCtor)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction equalByTag(object, other, tag) {\n  switch (tag) {\n    case boolTag:\n    case dateTag:\n      return +object === +other;\n\n    case errorTag:\n      return object.name === other.name && object.message === other.message;\n\n    case numberTag:\n      return (object !== +object) ?\n        other !== +other :\n        object === +other;\n\n    case regexpTag:\n    case stringTag:\n      return object === (other + '');\n  }\n  return false;\n}\n\nfunction isObject (value) {\n  var type = typeof value;\n  return !!value && (type === 'object' || type === 'function');\n}\n\nfunction isObjectLike(value) {\n  return !!value && typeof value === 'object';\n}\n\nfunction isLength(value) {\n  return typeof value === 'number' && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;\n}\n\nvar isHostObject = (function() {\n  try {\n    Object({ 'toString': 0 } + '');\n  } catch(e) {\n    return function() { return false; };\n  }\n  return function(value) {\n    return typeof value.toString !== 'function' && typeof (value + '') === 'string';\n  };\n}());\n\nfunction isTypedArray(value) {\n  return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];\n}\n\nvar isArray = Array.isArray || function(value) {\n  return isObjectLike(value) && isLength(value.length) && objToString.call(value) === arrayTag;\n};\n\nfunction arraySome (array, predicate) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction equalArrays(array, other, equalFunc, isLoose, stackA, stackB) {\n  var index = -1,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength !== othLength && !(isLoose && othLength > arrLength)) {\n    return false;\n  }\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index],\n        result;\n\n    if (result !== undefined) {\n      if (result) {\n        continue;\n      }\n      return false;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (isLoose) {\n      if (!arraySome(other, function(othValue) {\n            return arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB);\n          })) {\n        return false;\n      }\n    } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, isLoose, stackA, stackB))) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction baseIsEqualDeep(object, other, equalFunc, isLoose, stackA, stackB) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = arrayTag,\n      othTag = arrayTag;\n\n  if (!objIsArr) {\n    objTag = objToString.call(object);\n    if (objTag === argsTag) {\n      objTag = objectTag;\n    } else if (objTag !== objectTag) {\n      objIsArr = isTypedArray(object);\n    }\n  }\n  if (!othIsArr) {\n    othTag = objToString.call(other);\n    if (othTag === argsTag) {\n      othTag = objectTag;\n    } else if (othTag !== objectTag) {\n      othIsArr = isTypedArray(other);\n    }\n  }\n  var objIsObj = objTag === objectTag && !isHostObject(object),\n      othIsObj = othTag === objectTag && !isHostObject(other),\n      isSameTag = objTag === othTag;\n\n  if (isSameTag && !(objIsArr || objIsObj)) {\n    return equalByTag(object, other, objTag);\n  }\n  if (!isLoose) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      return equalFunc(objIsWrapped ? object.value() : object, othIsWrapped ? other.value() : other, isLoose, stackA, stackB);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  // Assume cyclic values are equal.\n  // For more information on detecting circular references see https://es5.github.io/#JO.\n  stackA || (stackA = []);\n  stackB || (stackB = []);\n\n  var length = stackA.length;\n  while (length--) {\n    if (stackA[length] === object) {\n      return stackB[length] === other;\n    }\n  }\n  // Add `object` and `other` to the stack of traversed objects.\n  stackA.push(object);\n  stackB.push(other);\n\n  var result = (objIsArr ? equalArrays : equalObjects)(object, other, equalFunc, isLoose, stackA, stackB);\n\n  stackA.pop();\n  stackB.pop();\n\n  return result;\n}\n\nfunction baseIsEqual(value, other, isLoose, stackA, stackB) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, baseIsEqual, isLoose, stackA, stackB);\n}\n\nmodule.exports = function (value, other) {\n  return baseIsEqual(value, other);\n};\n"
  },
  {
    "path": "src/modular/internal/priorityqueue.js",
    "content": "'use strict';\n\nfunction IndexedItem(id, value) {\n  this.id = id;\n  this.value = value;\n}\n\nIndexedItem.prototype.compareTo = function (other) {\n  var c = this.value.compareTo(other.value);\n  c === 0 && (c = this.id - other.id);\n  return c;\n};\n\nfunction PriorityQueue (capacity) {\n  this.items = new Array(capacity);\n  this.length = 0;\n}\n\nPriorityQueue.prototype.isHigherPriority = function (left, right) {\n  return this.items[left].compareTo(this.items[right]) < 0;\n};\n\nPriorityQueue.prototype.percolate = function (index) {\n  if (index >= this.length || index < 0) { return; }\n  var parent = index - 1 >> 1;\n  if (parent < 0 || parent === index) { return; }\n  if (this.isHigherPriority(index, parent)) {\n    var temp = this.items[index];\n    this.items[index] = this.items[parent];\n    this.items[parent] = temp;\n    this.percolate(parent);\n  }\n};\n\nPriorityQueue.prototype.heapify = function (index) {\n  +index || (index = 0);\n  if (index >= this.length || index < 0) { return; }\n  var left = 2 * index + 1,\n      right = 2 * index + 2,\n      first = index;\n  if (left < this.length && this.isHigherPriority(left, first)) {\n    first = left;\n  }\n  if (right < this.length && this.isHigherPriority(right, first)) {\n    first = right;\n  }\n  if (first !== index) {\n    var temp = this.items[index];\n    this.items[index] = this.items[first];\n    this.items[first] = temp;\n    this.heapify(first);\n  }\n};\n\nPriorityQueue.prototype.peek = function () { return this.items[0].value; };\n\nPriorityQueue.prototype.removeAt = function (index) {\n  this.items[index] = this.items[--this.length];\n  this.items[this.length] = undefined;\n  this.heapify();\n};\n\nPriorityQueue.prototype.dequeue = function () {\n  var result = this.peek();\n  this.removeAt(0);\n  return result;\n};\n\nPriorityQueue.prototype.enqueue = function (item) {\n  var index = this.length++;\n  this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n  this.percolate(index);\n};\n\nPriorityQueue.prototype.remove = function (item) {\n  for (var i = 0; i < this.length; i++) {\n    if (this.items[i].value === item) {\n      this.removeAt(i);\n      return true;\n    }\n  }\n  return false;\n};\n\nPriorityQueue.count = 0;\n\nmodule.exports = PriorityQueue;\n"
  },
  {
    "path": "src/modular/internal/trycatchutils.js",
    "content": "'use strict';\n\nvar isFunction = require('../helpers/isfunction');\nvar errorObj = module.exports.errorObj = {e: {}};\n\nfunction tryCatcherGen(tryCatchTarget) {\n  return function tryCatcher() {\n    try {\n      return tryCatchTarget.apply(this, arguments);\n    } catch (e) {\n      errorObj.e = e;\n      return errorObj;\n    }\n  };\n}\n\nmodule.exports.tryCatch = function tryCatch(fn) {\n  if (!isFunction(fn)) { throw new TypeError('fn must be a function'); }\n  return tryCatcherGen(fn);\n};\n\nmodule.exports.thrower = function thrower(e) {\n  throw e;\n};\n"
  },
  {
    "path": "src/modular/joins/activeplan.js",
    "content": "'use strict';\n\nrequire('es6-map/implement');\n\nfunction ActivePlan(joinObserverArray, onNext, onCompleted) {\n  this._joinObserverArray = joinObserverArray;\n  this._onNext = onNext;\n  this._onCompleted = onCompleted;\n  this._joinObservers = new global.Map();\n  for (var i = 0, len = this._joinObserverArray.length; i < len; i++) {\n    var joinObserver = this._joinObserverArray[i];\n    this._joinObservers.set(joinObserver, joinObserver);\n  }\n}\n\nActivePlan.prototype.dequeue = function () {\n  this._joinObservers.forEach(function (v) { v._queue.shift(); });\n};\n\nActivePlan.prototype.match = function () {\n  var i, len, hasValues = true;\n  for (i = 0, len = this._joinObserverArray.length; i < len; i++) {\n    if (this._joinObserverArray[i]._queue.length === 0) {\n      hasValues = false;\n      break;\n    }\n  }\n  if (hasValues) {\n    var firstValues = [],\n        isCompleted = false;\n    for (i = 0, len = this._joinObserverArray.length; i < len; i++) {\n      firstValues.push(this._joinObserverArray[i]._queue[0]);\n      this._joinObserverArray[i]._queue[0].kind === 'C' && (isCompleted = true);\n    }\n    if (isCompleted) {\n      this._onCompleted();\n    } else {\n      this.dequeue();\n      var values = [];\n      for (i = 0, len = firstValues.length; i < firstValues.length; i++) {\n        values.push(firstValues[i].value);\n      }\n      this._onNext.apply(this, values);\n    }\n  }\n};\n\nmodule.exports = ActivePlan;\n"
  },
  {
    "path": "src/modular/joins/joinobserver.js",
    "content": "'use strict';\n\nvar AbstractObserver = require('../observer/abstractobserver');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar materialize = require('../observable/materialize');\nvar noop = require('../helpers/noop');\nvar inherits = require('inherits');\n\nfunction JoinObserver(source, onError) {\n  AbstractObserver.call(this);\n  this._source = source;\n  this._onError = onError;\n  this._queue = [];\n  this._activePlans = [];\n  this._subscription = new SingleAssignmentDisposable();\n  this.isDisposed = false;\n}\n\ninherits(JoinObserver, AbstractObserver);\n\nJoinObserver.prototype.next = function (notification) {\n  if (!this.isDisposed) {\n    if (notification.kind === 'E') {\n      return this._onError(notification.error);\n    }\n    this._queue.push(notification);\n    var activePlans = this._activePlans.slice(0);\n    for (var i = 0, len = activePlans.length; i < len; i++) {\n      activePlans[i].match();\n    }\n  }\n};\n\nJoinObserver.prototype.error = noop;\nJoinObserver.prototype.completed = noop;\n\nJoinObserver.prototype.addActivePlan = function (activePlan) {\n  this._activePlans.push(activePlan);\n};\n\nJoinObserver.prototype.subscribe = function () {\n  this._subscription.setDisposable(materialize(this._source).subscribe(this));\n};\n\nJoinObserver.prototype.removeActivePlan = function (activePlan) {\n  this._activePlans.splice(this._activePlans.indexOf(activePlan), 1);\n  this._activePlans.length === 0 && this.dispose();\n};\n\nJoinObserver.prototype.dispose = function () {\n  AbstractObserver.prototype.dispose.call(this);\n  if (!this.isDisposed) {\n    this.isDisposed = true;\n    this._subscription.dispose();\n  }\n};\n\nmodule.exports = JoinObserver;\n"
  },
  {
    "path": "src/modular/joins/pattern.js",
    "content": "'use strict';\n\nvar Plan = require('./plan');\n\n/**\n * @constructor\n * Represents a join pattern over observable sequences.\n */\nfunction Pattern(patterns) {\n  this._patterns = patterns;\n}\n\n/**\n *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n *  @param other Observable sequence to match in addition to the current pattern.\n *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n */\nPattern.prototype.and = function (other) {\n  return new Pattern(this._patterns.concat(other));\n};\n\n/**\n *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n */\nPattern.prototype.thenDo = function (selector) {\n  return new Plan(this, selector);\n};\n\nmodule.exports = Pattern;\n"
  },
  {
    "path": "src/modular/joins/plan.js",
    "content": "'use strict';\n\nvar ActivePlan = require('./activeplan');\nvar JoinObserver = require('./joinobserver');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\n\nfunction planCreateObserver(externalSubscriptions, observable, onError) {\n  var entry = externalSubscriptions.get(observable);\n  if (!entry) {\n    var observer = new JoinObserver(observable, onError);\n    externalSubscriptions.set(observable, observer);\n    return observer;\n  }\n  return entry;\n}\n\nfunction Plan(expression, selector) {\n  this._expression = expression;\n  this._selector = selector;\n}\n\nfunction handleOnError(o) { return function (e) { o.onError(e); }; }\nfunction handleOnNext(self, observer) {\n  return function onNext () {\n    var result = tryCatch(self._selector).apply(self, arguments);\n    if (result === errorObj) { return observer.onError(result.e); }\n    observer.onNext(result);\n  };\n}\n\nPlan.prototype.activate = function (externalSubscriptions, observer, deactivate) {\n  var joinObservers = [], errHandler = handleOnError(observer);\n  for (var i = 0, len = this._expression._patterns.length; i < len; i++) {\n    joinObservers.push(planCreateObserver(externalSubscriptions, this._expression._patterns[i], errHandler));\n  }\n  var activePlan = new ActivePlan(joinObservers, handleOnNext(this, observer), function () {\n    for (var j = 0, jlen = joinObservers.length; j < jlen; j++) {\n      joinObservers[j].removeActivePlan(activePlan);\n    }\n    deactivate(activePlan);\n  });\n  for (i = 0, len = joinObservers.length; i < len; i++) {\n    joinObservers[i].addActivePlan(activePlan);\n  }\n  return activePlan;\n};\n\nmodule.exports = Plan;\n"
  },
  {
    "path": "src/modular/narydisposable.js",
    "content": "'use strict';\n\nfunction NAryDisposable(disposables) {\n  this._disposables = disposables;\n  this.isDisposed = false;\n}\n\nNAryDisposable.prototype.dispose = function () {\n  if (!this.isDisposed) {\n    this.isDisposed = true;\n    for (var i = 0, len = this._disposables.length; i < len; i++) {\n      this._disposables[i].dispose();\n    }\n    this._disposables.length = 0;\n  }\n};\n\nmodule.exports = NAryDisposable;\n"
  },
  {
    "path": "src/modular/notification.js",
    "content": "'use strict';\n\nvar AnonymousObservable = require('./observable/anonymousobservable');\nvar Scheduler = require('./scheduler');\nvar errors = require('./internal/errors');\nvar inherits = require('inherits');\n\nfunction Notification() { }\n\nNotification.prototype._accept = function (onNext, onError, onCompleted) {\n  throw new errors.NotImplementedError();\n};\n\nNotification.prototype._acceptObserver = function (onNext, onError, onCompleted) {\n  throw new errors.NotImplementedError();\n};\n\n/**\n * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n * @param {Function | Observer} observerOrOnNext Function to invoke for an OnNext notification or Observer to invoke the notification on..\n * @param {Function} onError Function to invoke for an OnError notification.\n * @param {Function} onCompleted Function to invoke for an OnCompleted notification.\n * @returns {Any} Result produced by the observation.\n */\nNotification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n  return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n    this._acceptObserver(observerOrOnNext) :\n    this._accept(observerOrOnNext, onError, onCompleted);\n};\n\n/**\n * Returns an observable sequence with a single notification.\n *\n * @memberOf Notifications\n * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n */\nNotification.prototype.toObservable = function (scheduler) {\n  var self = this;\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.immediate);\n  return new AnonymousObservable(function (o) {\n    return scheduler.schedule(self, function (_, notification) {\n      notification._acceptObserver(o);\n      notification.kind === 'N' && o.onCompleted();\n    });\n  });\n};\n\nfunction OnNextNotification(value) {\n  this.value = value;\n  this.kind = 'N';\n}\n\ninherits(OnNextNotification, Notification);\n\nOnNextNotification.prototype._accept = function (onNext) {\n  return onNext(this.value);\n};\n\nOnNextNotification.prototype._acceptObserver = function (o) {\n  return o.onNext(this.value);\n};\n\nOnNextNotification.prototype.toString = function () {\n  return 'OnNext(' + this.value + ')';\n};\n\nfunction OnErrorNotification(error) {\n  this.error = error;\n  this.kind = 'E';\n}\n\ninherits(OnErrorNotification, Notification);\n\nOnErrorNotification.prototype._accept = function (onNext, onError) {\n  return onError(this.error);\n};\n\nOnErrorNotification.prototype._acceptObserver = function (o) {\n  return o.onError(this.error);\n};\n\nOnErrorNotification.prototype.toString = function () {\n  return 'OnError(' + this.error + ')';\n};\n\nfunction OnCompletedNotification() {\n  this.kind = 'C';\n}\n\ninherits(OnCompletedNotification, Notification);\n\nOnCompletedNotification.prototype._accept = function (onNext, onError, onCompleted) {\n  return onCompleted();\n};\n\nOnCompletedNotification.prototype._acceptObserver = function (o) {\n  return o.onCompleted();\n};\n\nOnCompletedNotification.prototype.toString = function () {\n  return 'OnCompleted()';\n};\n\n\n/**\n* Creates an object that represents an OnNext notification to an observer.\n* @param {Any} value The value contained in the notification.\n* @returns {Notification} The OnNext notification containing the value.\n*/\nNotification.createOnNext = function (value) {\n  return new OnNextNotification(value);\n};\n\n/**\n* Creates an object that represents an OnError notification to an observer.\n* @param {Any} error The exception contained in the notification.\n* @returns {Notification} The OnError notification containing the exception.\n*/\nNotification.createOnError = function (error) {\n  return new OnErrorNotification(error);\n};\n\n/**\n* Creates an object that represents an OnCompleted notification to an observer.\n* @returns {Notification} The OnCompleted notification.\n*/\nNotification.createOnCompleted = function () {\n  return new OnCompletedNotification();\n};\n\nmodule.exports = Notification;\n"
  },
  {
    "path": "src/modular/observable/_extremabyobservable.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction ExtremaByObserver(o, k, c) {\n  this._o = o;\n  this._k = k;\n  this._c = c;\n  this._v = null;\n  this._hv = false;\n  this._l = [];\n  AbstractObserver.call(this);\n}\n\ninherits(ExtremaByObserver, AbstractObserver);\n\nExtremaByObserver.prototype.next = function (x) {\n  var key = tryCatch(this._k)(x);\n  if (key === errorObj) { return this._o.onError(key.e); }\n  var comparison = 0;\n  if (!this._hv) {\n    this._hv = true;\n    this._v = key;\n  } else {\n    comparison = tryCatch(this._c)(key, this._v);\n    if (comparison === errorObj) { return this._o.onError(comparison.e); }\n  }\n  if (comparison > 0) {\n    this._v = key;\n    this._l = [];\n  }\n  if (comparison >= 0) { this._l.push(x); }\n};\n\nExtremaByObserver.prototype.error = function (e) { this._o.onError(e); };\n\nExtremaByObserver.prototype.completed = function () {\n  this._o.onNext(this._l);\n  this._o.onCompleted();\n};\n\nfunction ExtremaByObservable(source, k, c) {\n  this.source = source;\n  this._k = k;\n  this._c = c;\n  ObservableBase.call(this);\n}\n\ninherits(ExtremaByObservable, ObservableBase);\n\nExtremaByObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new ExtremaByObserver(o, this._k, this._c));\n};\n\nmodule.exports = ExtremaByObservable;\n"
  },
  {
    "path": "src/modular/observable/_findvalueobservable.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar bindCallback = require('../internal/bindcallback');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction FindValueObserver(observer, source, callback, yieldIndex) {\n  this._o = observer;\n  this._s = source;\n  this._cb = callback;\n  this._y = yieldIndex;\n  this._i = 0;\n  AbstractObserver.call(this);\n}\n\ninherits(FindValueObserver, AbstractObserver);\n\nFindValueObserver.prototype.next = function (x) {\n  var shouldRun = tryCatch(this._cb)(x, this._i, this._s);\n  if (shouldRun === errorObj) { return this._o.onError(shouldRun.e); }\n  if (shouldRun) {\n    this._o.onNext(this._y ? this._i : x);\n    this._o.onCompleted();\n  } else {\n    this._i++;\n  }\n};\n\nFindValueObserver.prototype.error = function (e) {\n  this._o.onError(e);\n};\n\nFindValueObserver.prototype.completed = function () {\n  this._y && this._o.onNext(-1);\n  this._o.onCompleted();\n};\n\nfunction FindValueObservable(source, cb, thisArg, yieldIndex) {\n  this.source = source;\n  this._cb = bindCallback(cb, thisArg, 3);\n  this._yieldIndex = yieldIndex;\n  ObservableBase.call(this);\n}\n\ninherits(FindValueObservable, ObservableBase);\n\nFindValueObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new FindValueObserver(o, this.source, this._cb, this._yieldIndex));\n};\n\nmodule.exports = FindValueObservable;\n"
  },
  {
    "path": "src/modular/observable/_firstonly.js",
    "content": "'use strict';\n\nvar EmptyError = require('../internal/errors').EmptyError;\n\nmodule.exports = function firstOnly(x) {\n  if (x.length === 0) { throw new EmptyError(); }\n  return x[0];\n};\n"
  },
  {
    "path": "src/modular/observable/and.js",
    "content": "'use strict';\n\nvar Pattern = require('../joins/pattern');\n\nmodule.exports = function and (left, right) {\n  return new Pattern([left, right]);\n};\n"
  },
  {
    "path": "src/modular/observable/anonymousobservable.js",
    "content": "'use strict';\n\nvar inherits = require('inherits');\nvar isFunction = require('../helpers/isfunction');\nvar Observable  = require('../observable');\nvar Disposable = require('../disposable');\nvar AutoDetachObserver = require('../observer/autodetachobserver');\nvar Scheduler = require('../scheduler');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj, thrower = tryCatchUtils.thrower;\n\n// Fix subscriber to check for undefined or function returned to decorate as Disposable\nfunction fixSubscriber(subscriber) {\n  return subscriber && isFunction(subscriber.dispose) ? subscriber :\n    isFunction(subscriber) ? Disposable.create(subscriber) : Disposable.empty;\n}\n\nfunction setDisposable(s, state) {\n  var ado = state[0], self = state[1];\n  var sub = tryCatch(self.__subscribe).call(self, ado);\n  if (sub === errorObj && !ado.fail(sub.e)) { thrower(sub.e); }\n  ado.setDisposable(fixSubscriber(sub));\n}\n\nfunction AnonymousObservable(subscribe, parent) {\n  this.source = parent;\n  this.__subscribe = subscribe;\n  Observable.call(this);\n}\n\ninherits(AnonymousObservable, Observable);\n\nAnonymousObservable.prototype._subscribe = function (o) {\n  var ado = new AutoDetachObserver(o), state = [ado, this];\n\n  if (Scheduler.queue.scheduleRequired()) {\n    Scheduler.queue.schedule(state, setDisposable);\n  } else {\n    setDisposable(null, state);\n  }\n  return ado;\n};\n\nmodule.exports = AnonymousObservable;\n"
  },
  {
    "path": "src/modular/observable/asobservable.js",
    "content": "'use strict';\n\nvar AnonymousObservable = require('./anonymousobservable');\n\nfunction createAsObservable(source) {\n  return function subscribe(o) { return source.subscribe(o); };\n}\n\n/**\n *  Hides the identity of an observable sequence.\n * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n */\nmodule.exports = function asObservable(source) {\n  return new AnonymousObservable(createAsObservable(source), source);\n};\n"
  },
  {
    "path": "src/modular/observable/average.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar EmptyError = require('../internal/errors').EmptyError;\nvar isFunction = require('../helpers/isfunction');\nvar bindCallback = require('../internal/bindcallback');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\n\nfunction AverageObserver(o, fn, s) {\n  this._o = o;\n  this._fn = fn;\n  this._s = s;\n  this._c = 0;\n  this._t = 0;\n  AbstractObserver.call(this);\n}\n\ninherits(AverageObserver, AbstractObserver);\n\nAverageObserver.prototype.next = function (x) {\n  if(this._fn) {\n    var r = tryCatch(this._fn)(x, this._c++, this._s);\n    if (r === errorObj) { return this._o.onError(r.e); }\n    this._t += r;\n  } else {\n    this._c++;\n    this._t += x;\n  }\n};\nAverageObserver.prototype.error = function (e) { this._o.onError(e); };\nAverageObserver.prototype.completed = function () {\n  if (this._c === 0) { return this._o.onError(new EmptyError()); }\n  this._o.onNext(this._t / this._c);\n  this._o.onCompleted();\n};\n\nfunction AverageObservable(source, fn) {\n  this.source = source;\n  this._fn = fn;\n  ObservableBase.call(this);\n}\n\ninherits(AverageObservable, ObservableBase);\n\nAverageObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new AverageObserver(o, this._fn, this.source));\n};\n\n/**\n * Computes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present.\n * @param {Function} [selector] A transform function to apply to each element.\n * @param {Any} [thisArg] Object to use as this when executing callback.\n * @returns {Observable} An observable sequence containing a single element with the average of the sequence of values.\n */\nmodule.exports = function average (source, keySelector, thisArg) {\n  var fn;\n  isFunction(keySelector) && (fn = bindCallback(keySelector, thisArg, 3));\n  return new AverageObservable(source, fn);\n};\n"
  },
  {
    "path": "src/modular/observable/bindcallback.js",
    "content": "'use strict';\n\nvar AsyncSubject = require('../asyncsubject');\nvar asObservable  = require('./asobservable');\nvar isFunction = require('../helpers/isfunction');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\n\nfunction createCbHandler(o, ctx, selector) {\n  return function handler () {\n    var len = arguments.length, results = new Array(len);\n    for(var i = 0; i < len; i++) { results[i] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\nfunction createCbObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createCbHandler(o, ctx, selector));\n  var res = tryCatch(fn).apply(ctx, args);\n  if (res === errorObj) { o.onError(res.e); }\n\n  return asObservable(o);\n}\n\n/**\n * Converts a callback function to an observable sequence.\n *\n * @param {Function} fn Function with a callback as the last parameter to convert to an Observable sequence.\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n */\nmodule.exports = function bindCallback (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this);\n\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createCbObservable(fn, ctx, selector, args);\n  };\n};\n"
  },
  {
    "path": "src/modular/observable/bindnodecallback.js",
    "content": "'use strict';\n\nvar AsyncSubject = require('../asyncsubject');\nvar asObservable  = require('./asobservable');\nvar isFunction = require('../helpers/isfunction');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\n\nfunction createNodeHandler(o, ctx, selector) {\n  return function handler () {\n    var err = arguments[0];\n    if (err) { return o.onError(err); }\n\n    var len = arguments.length, results = [];\n    for(var i = 1; i < len; i++) { results[i - 1] = arguments[i]; }\n\n    if (isFunction(selector)) {\n      results = tryCatch(selector).apply(ctx, results);\n      if (results === errorObj) { return o.onError(results.e); }\n      o.onNext(results);\n    } else {\n      if (results.length <= 1) {\n        o.onNext(results[0]);\n      } else {\n        o.onNext(results);\n      }\n    }\n\n    o.onCompleted();\n  };\n}\n\nfunction createNodeObservable(fn, ctx, selector, args) {\n  var o = new AsyncSubject();\n\n  args.push(createNodeHandler(o, ctx, selector));\n  var res = tryCatch(fn).apply(ctx, args);\n  if (res === errorObj) { o.onError(res.e); }\n\n  return asObservable(o);\n}\n\n/**\n * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n * @param {Function} fn The function to call\n * @param {Mixed} [ctx] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n */\nmodule.exports = function bindNodeCallback (fn, ctx, selector) {\n  return function () {\n    typeof ctx === 'undefined' && (ctx = this);\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    return createNodeObservable(fn, ctx, selector, args);\n  };\n};\n"
  },
  {
    "path": "src/modular/observable/buffer.js",
    "content": "'use strict';\n\nvar flatMap = require('./flatmap');\nvar window = require('./window');\n\nfunction toArray(x) { return x.toArray(); }\n\nmodule.exports = function buffer (source, windowOpeningsOrClosingSelector, windowClosingSelector) {\n  return flatMap(window(source, windowOpeningsOrClosingSelector, windowClosingSelector), toArray);\n};\n"
  },
  {
    "path": "src/modular/observable/buffercount.js",
    "content": "'use strict';\n\nvar filter = require('./filter');\nvar flatMap = require('./flatmap');\nvar windowCount = require('./windowcount');\n\nfunction toArray(x) { return x.toArray(); }\nfunction notEmpty(x) { return x.length > 0; }\n\nmodule.exports = function bufferCount (source, count, skip) {\n  typeof skip !== 'number' && (skip = count);\n  return filter(flatMap(windowCount(source, count, skip), toArray), notEmpty);\n};\n"
  },
  {
    "path": "src/modular/observable/buffertime.js",
    "content": "'use strict';\n\nvar flatMap = require('./flatmap');\nvar windowTime = require('./windowtime');\n\nfunction toArray(x) { return x.toArray(); }\n\nmodule.exports = function bufferTime (source, timeSpan, timeShiftOrScheduler, scheduler) {\n  return flatMap(windowTime(source, timeSpan, timeShiftOrScheduler, scheduler), toArray);\n};\n"
  },
  {
    "path": "src/modular/observable/buffertimeorcount.js",
    "content": "'use strict';\n\nvar flatMap = require('./flatmap');\nvar windowTimeOrCount = require('./windowtimeorcount');\n\nfunction toArray(x) { return x.toArray(); }\n\nmodule.exports = function bufferTimeOrCount (source, timeSpan, count, scheduler) {\n  return flatMap(windowTimeOrCount(source, timeSpan, count, scheduler), toArray);\n};\n"
  },
  {
    "path": "src/modular/observable/case.js",
    "content": "'use strict';\n\nvar defer = require('./defer');\nvar empty = require('./empty');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar isScheduler = require('../scheduler').isScheduler;\n\nfunction createCase(selector, sources, defaultSourceOrScheduler) {\n  return function () {\n    isPromise(defaultSourceOrScheduler) && (defaultSourceOrScheduler = fromPromise(defaultSourceOrScheduler));\n    defaultSourceOrScheduler || (defaultSourceOrScheduler = empty());\n\n    isScheduler(defaultSourceOrScheduler) && (defaultSourceOrScheduler = empty(defaultSourceOrScheduler));\n\n    var result = sources[selector()];\n    isPromise(result) && (result = fromPromise(result));\n\n    return result || defaultSourceOrScheduler;\n  };\n}\n\n/**\n*  Uses selector to determine which source in sources to use.\n* @param {Function} selector The function which extracts the value for to test in a case statement.\n* @param {Array} sources A object which has keys which correspond to the case statement labels.\n* @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n*\n* @returns {Observable} An observable sequence which is determined by a case statement.\n*/\nmodule.exports = function case_(selector, sources, defaultSourceOrScheduler) {\n return defer(createCase(selector, sources, defaultSourceOrScheduler));\n};\n"
  },
  {
    "path": "src/modular/observable/catch.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar Scheduler = require('../scheduler');\nvar NAryDisposable = require('../narydisposable');\nvar SerialDisposable = require('../serialdisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar inherits = require('inherits');\n\nfunction CatchObserver(state, recurse) {\n  this._state = state;\n  this._recurse = recurse;\n  AbstractObserver.call(this);\n}\n\ninherits(CatchObserver, AbstractObserver);\n\nCatchObserver.prototype.next = function (x) { this._state.o.onNext(x); };\nCatchObserver.prototype.error = function (e) { this._state.lastError = e; this._recurse(this._state); };\nCatchObserver.prototype.completed = function () { this._state.o.onCompleted(); };\n\nfunction CatchObservable(sources) {\n  this.sources = sources;\n  ObservableBase.call(this);\n}\n\ninherits(CatchObservable, ObservableBase);\n\nfunction scheduleMethod(state, recurse) {\n  if (state.isDisposed) { return; }\n  if (state.i < state.sources.length) {\n    var currentValue = state.sources[state.i++];\n    isPromise(currentValue) && (currentValue = fromPromise(currentValue));\n\n    var d = new SingleAssignmentDisposable();\n    state.subscription.setDisposable(d);\n    d.setDisposable(currentValue.subscribe(new CatchObserver(state, recurse)));\n  } else {\n    if (state.lastError !== null) {\n      state.o.onError(state.lastError);\n    } else {\n      state.o.onCompleted();\n    }\n  }\n}\n\nfunction IsDisposedDisposable(s) {\n  this._s = s;\n}\n\nIsDisposedDisposable.prototype.dispose = function () {\n  !this._s.isDisposed && (this._s.isDisposed = true);\n};\n\nCatchObservable.prototype.subscribeCore = function (o) {\n  var subscription = new SerialDisposable();\n  var state = {\n    isDisposed: false,\n    sources: this.sources,\n    i: 0,\n    subscription: subscription,\n    lastError: null,\n    o: o\n  };\n\n  var cancelable = Scheduler.queue.scheduleRecursive(state, scheduleMethod);\n  return new NAryDisposable([subscription, cancelable, new IsDisposedDisposable(state)]);\n};\n\nmodule.exports = function catch_() {\n  var len = arguments.length, args = new Array(len);\n  for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return new CatchObservable(args);\n};\n"
  },
  {
    "path": "src/modular/observable/catchhandler.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar SerialDisposable = require('../serialdisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar bindCallback = require('../internal/bindcallback');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar inherits = require('inherits');\n\nfunction CatchObserver(o, s, fn) {\n  this._o = o;\n  this._s = s;\n  this._fn = fn;\n  AbstractObserver.call(this);\n}\n\ninherits(CatchObserver, AbstractObserver);\n\nCatchObserver.prototype.next = function (x) { this._o.onNext(x); };\nCatchObserver.prototype.completed = function () { return this._o.onCompleted(); };\nCatchObserver.prototype.error = function (e) {\n  var result = tryCatch(this._fn)(e);\n  if (result === errorObj) { return this._o.onError(result.e); }\n  isPromise(result) && (result = fromPromise(result));\n\n  var d = new SingleAssignmentDisposable();\n  this._s.setDisposable(d);\n  d.setDisposable(result.subscribe(this._o));\n};\n\nfunction CatchObservable(source, fn) {\n  this.source = source;\n  this._fn = fn;\n  ObservableBase.call(this);\n}\n\ninherits(CatchObservable, ObservableBase);\n\nCatchObservable.prototype.subscribeCore = function (o) {\n  var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();\n  subscription.setDisposable(d1);\n  d1.setDisposable(this.source.subscribe(new CatchObserver(o, subscription, this._fn)));\n  return subscription;\n};\n\n/**\n * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n */\nmodule.exports = function catchHandler(source, handler, thisArg) {\n  var fn = bindCallback(handler, thisArg, 1);\n  return new CatchObservable(source, fn);\n};\n"
  },
  {
    "path": "src/modular/observable/combinelatest.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar NAryDisposable = require('../narydisposable');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar identity = require('../helpers/identity');\nvar isFunction = require('../helpers/isfunction');\nvar inherits = require('inherits');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\n\nfunction falseFactory() { return false; }\nfunction initializeArray (n, fn) {\n  var results = new Array(n);\n  for (var i = 0; i < n; i++) {\n    results[i] = fn(i);\n  }\n  return results;\n}\nfunction argumentsToArray() {\n  var len = arguments.length, args = new Array(len);\n  for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return args;\n}\n\nfunction CombineLatestObserver(o, i, cb, state) {\n  this._o = o;\n  this._i = i;\n  this._cb = cb;\n  this._state = state;\n  AbstractObserver.call(this);\n}\n\ninherits(CombineLatestObserver, AbstractObserver);\n\nfunction notTheSame(i) {\n  return function (x, j) {\n    return j !== i;\n  };\n}\n\nCombineLatestObserver.prototype.next = function (x) {\n  this._state.values[this._i] = x;\n  this._state.hasValue[this._i] = true;\n  if (this._state.hasValueAll || (this._state.hasValueAll = this._state.hasValue.every(identity))) {\n    var res = tryCatch(this._cb).apply(null, this._state.values);\n    if (res === errorObj) { return this._o.onError(res.e); }\n    this._o.onNext(res);\n  } else if (this._state.isDone.filter(notTheSame(this._i)).every(identity)) {\n    this._o.onCompleted();\n  }\n};\n\nCombineLatestObserver.prototype.error = function (e) { this._o.onError(e); };\nCombineLatestObserver.prototype.completed = function () {\n  this._state.isDone[this._i] = true;\n  this._state.isDone.every(identity) && this._o.onCompleted();\n};\n\n\nfunction CombineLatestObservable(params, cb) {\n  this._params = params;\n  this._cb = cb;\n  ObservableBase.call(this);\n}\n\ninherits(CombineLatestObservable, ObservableBase);\n\nCombineLatestObservable.prototype.subscribeCore = function(observer) {\n  var len = this._params.length,\n      subscriptions = new Array(len);\n\n  var state = {\n    hasValue: initializeArray(len, falseFactory),\n    hasValueAll: false,\n    isDone: initializeArray(len, falseFactory),\n    values: new Array(len)\n  };\n\n  for (var i = 0; i < len; i++) {\n    var source = this._params[i], sad = new SingleAssignmentDisposable();\n    subscriptions[i] = sad;\n    isPromise(source) && (source = fromPromise(source));\n    sad.setDisposable(source.subscribe(new CombineLatestObserver(observer, i, this._cb, state)));\n  }\n\n  return new NAryDisposable(subscriptions);\n};\n\n/**\n* Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n*\n* @example\n* 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n* 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n* @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n*/\nmodule.exports = function combineLatest () {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n  return new CombineLatestObservable(args, resultSelector);\n};\n"
  },
  {
    "path": "src/modular/observable/concat.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar Scheduler = require('../scheduler');\nvar Disposable = require('../disposable');\nvar NAryDisposable = require('../narydisposable');\nvar SerialDisposable = require('../serialdisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar inherits = require('inherits');\n\nfunction ConcatObserver(s, fn) {\n  this._s = s;\n  this._fn = fn;\n  AbstractObserver.call(this);\n}\n\ninherits(ConcatObserver, AbstractObserver);\n\nConcatObserver.prototype.next = function (x) { this._s.o.onNext(x); };\nConcatObserver.prototype.error = function (e) { this._s.o.onError(e); };\nConcatObserver.prototype.completed = function () { this._s.i++; this._fn(this._s); };\n\nfunction ConcatObservable(sources) {\n  this._sources = sources;\n  ObservableBase.call(this);\n}\n\ninherits(ConcatObservable, ObservableBase);\n\nfunction scheduleRecursive (state, recurse) {\n  if (state.disposable.isDisposed) { return; }\n  if (state.i === state.sources.length) { return state.o.onCompleted(); }\n\n  // Check if promise\n  var currentValue = state.sources[state.i];\n  isPromise(currentValue) && (currentValue = fromPromise(currentValue));\n\n  var d = new SingleAssignmentDisposable();\n  state.subscription.setDisposable(d);\n  d.setDisposable(currentValue.subscribe(new ConcatObserver(state, recurse)));\n}\n\nConcatObservable.prototype.subscribeCore = function(o) {\n  var subscription = new SerialDisposable();\n  var disposable = Disposable.create();\n  var state = {\n    o: o,\n    i: 0,\n    subscription: subscription,\n    disposable: disposable,\n    sources: this._sources\n  };\n\n  var cancelable = Scheduler.immediate.scheduleRecursive(state, scheduleRecursive);\n  return new NAryDisposable([subscription, disposable, cancelable]);\n};\n\n/**\n * Concatenates all the observable sequences.\n * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n */\nmodule.exports = function concat () {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return new ConcatObservable(args);\n};\n"
  },
  {
    "path": "src/modular/observable/concatall.js",
    "content": "'use strict';\n\nvar mergeConcat = require('./mergeconcat');\n\nmodule.exports = function concatAll (sources) {\n  return mergeConcat(sources, 1);\n};\n"
  },
  {
    "path": "src/modular/observable/connectableobservable.js",
    "content": "'use strict';\n\nvar Observable = require('../observable');\nvar ObservableBase = require('./observablebase');\nvar asObservable = require('./asobservable');\nvar Disposable = require('../disposable');\nvar inherits = require('inherits');\n\nfunction RefCountDisposable(p, s) {\n  this._p = p;\n  this._s = s;\n  this.isDisposed = false;\n}\n\nRefCountDisposable.prototype.dispose = function () {\n  if (!this.isDisposed) {\n    this.isDisposed = true;\n    this._s.dispose();\n    --this._p._count === 0 && this._p._connectableSubscription.dispose();\n  }\n};\n\nfunction RefCountObservable(source) {\n  this.source = source;\n  this._count = 0;\n  this._connectableSubscription = null;\n  ObservableBase.call(this);\n}\n\ninherits(RefCountObservable, ObservableBase);\n\nRefCountObservable.prototype.subscribeCore = function (o) {\n  var subscription = this.source.subscribe(o);\n  ++this._count === 1 && (this._connectableSubscription = this.source.connect());\n  return new RefCountDisposable(this, subscription);\n};\n\nfunction ConnectableObservable(source, subject) {\n  this.source = source;\n  this._connection = null;\n  this._source = asObservable(source);\n  this._subject = subject;\n  Observable.call(this);\n}\n\ninherits(ConnectableObservable, Observable);\n\nfunction ConnectDisposable(parent, subscription) {\n  this._p = parent;\n  this._s = subscription;\n}\n\nConnectDisposable.prototype.dispose = function () {\n  if (this._s) {\n    this._s.dispose();\n    this._s = null;\n    this._p._connection = null;\n  }\n};\n\nConnectableObservable.prototype.connect = function () {\n  if (!this._connection) {\n    if (this._subject.isStopped) { return Disposable.empty; }\n\n    var subscription = this._source.subscribe(this._subject);\n    this._connection = new ConnectDisposable(this, subscription);\n  }\n  return this._connection;\n};\n\nConnectableObservable.prototype._subscribe = function (o) {\n  return this._subject.subscribe(o);\n};\n\nConnectableObservable.prototype.refCount = function () {\n  return new RefCountObservable(this);\n};\n\nmodule.exports = ConnectableObservable;\n"
  },
  {
    "path": "src/modular/observable/controlled.js",
    "content": "'use strict';\n\nvar Observable = require('../observable');\nvar StopAndWaitObservable = require('./stopandwait');\nvar WindowedObservable = require('./windowed');\nvar multicast = require('./multicast');\nvar Notification = require('../notification');\nvar Observer = require('../observer');\nvar Subject = require('../subject');\nvar Scheduler = require('../scheduler');\nvar Disposable = require('../disposable');\nvar Scheduler = require('../scheduler');\nvar addProperties = require('../internal/addproperties');\nvar inherits = require('inherits');\n\nfunction ControlledSubject(enableQueue, scheduler) {\n  enableQueue == null && (enableQueue = true);\n  this.subject = new Subject();\n  this.enableQueue = enableQueue;\n  this.queue = enableQueue ? [] : null;\n  this.requestedCount = 0;\n  this.requestedDisposable = null;\n  this.error = null;\n  this.hasFailed = false;\n  this.hasCompleted = false;\n  this.scheduler = scheduler || Scheduler.queue;\n  Observable.call(this);\n}\n\ninherits(ControlledSubject, Observable);\n\naddProperties(ControlledSubject.prototype, Observer, {\n  _subscribe: function (o) {\n    return this.subject.subscribe(o);\n  },\n  onCompleted: function () {\n    this.hasCompleted = true;\n    if (!this.enableQueue || this.queue.length === 0) {\n      this.subject.onCompleted();\n      this.disposeCurrentRequest();\n    } else {\n      this.queue.push(Notification.createOnCompleted());\n    }\n  },\n  onError: function (error) {\n    this.hasFailed = true;\n    this.error = error;\n    if (!this.enableQueue || this.queue.length === 0) {\n      this.subject.onError(error);\n      this.disposeCurrentRequest();\n    } else {\n      this.queue.push(Notification.createOnError(error));\n    }\n  },\n  onNext: function (value) {\n    if (this.requestedCount <= 0) {\n      this.enableQueue && this.queue.push(Notification.createOnNext(value));\n    } else {\n      (this.requestedCount-- === 0) && this.disposeCurrentRequest();\n      this.subject.onNext(value);\n    }\n  },\n  _processRequest: function (numberOfItems) {\n    if (this.enableQueue) {\n      while (this.queue.length > 0 && (numberOfItems > 0 || this.queue[0].kind !== 'N')) {\n        var first = this.queue.shift();\n        first.accept(this.subject);\n        if (first.kind === 'N') {\n          numberOfItems--;\n        } else {\n          this.disposeCurrentRequest();\n          this.queue = [];\n        }\n      }\n    }\n\n    return numberOfItems;\n  },\n  request: function (number) {\n    this.disposeCurrentRequest();\n    var self = this;\n\n    this.requestedDisposable = this.scheduler.schedule(number,\n    function(s, i) {\n      var remaining = self._processRequest(i);\n      var stopped = self.hasCompleted || self.hasFailed;\n      if (!stopped && remaining > 0) {\n        self.requestedCount = remaining;\n\n        return Disposable.create(function () {\n          self.requestedCount = 0;\n        });\n          // Scheduled item is still in progress. Return a new\n          // disposable to allow the request to be interrupted\n          // via dispose.\n      }\n    });\n\n    return this.requestedDisposable;\n  },\n  disposeCurrentRequest: function () {\n    if (this.requestedDisposable) {\n      this.requestedDisposable.dispose();\n      this.requestedDisposable = null;\n    }\n  }\n});\n\nfunction ControlledObservable (source, enableQueue, scheduler) {\n  this.subject = new ControlledSubject(enableQueue, scheduler);\n  this.source = multicast(source, this.subject).refCount();\n  Observable.call(this);\n}\n\ninherits(ControlledObservable, Observable);\n\nControlledObservable.prototype._subscribe = function (o) {\n  return this.source.subscribe(o);\n};\n\nControlledObservable.prototype.request = function (numberOfItems) {\n  return this.subject.request(numberOfItems == null ? -1 : numberOfItems);\n};\n\nControlledObservable.prototype.stopAndWait = function (scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  return new StopAndWaitObservable(this, scheduler);\n};\n\nControlledObservable.prototype.windowed = function (windowSize, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  return new WindowedObservable(this, windowSize, scheduler);\n};\n\nmodule.exports = function controlled (source, enableQueue, scheduler) {\n\n  if (enableQueue && Scheduler.isScheduler(enableQueue)) {\n    scheduler = enableQueue;\n    enableQueue = true;\n  }\n\n  if (enableQueue == null) {  enableQueue = true; }\n  return new ControlledObservable(source, enableQueue, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/count.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar bindCallback = require('../internal/bindcallback');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction CountObserver(o, fn, s) {\n  this._o = o;\n  this._fn = fn;\n  this._s = s;\n  this._i = 0;\n  this._c = 0;\n  AbstractObserver.call(this);\n}\n\ninherits(CountObserver, AbstractObserver);\n\nCountObserver.prototype.next = function (x) {\n  if (this._fn) {\n    var result = tryCatch(this._fn)(x, this._i++, this._s);\n    if (result === errorObj) { return this._o.onError(result.e); }\n    Boolean(result) && (this._c++);\n  } else {\n    this._c++;\n  }\n};\nCountObserver.prototype.error = function (e) { this._o.onError(e); };\nCountObserver.prototype.completed = function () {\n  this._o.onNext(this._c);\n  this._o.onCompleted();\n};\n\nfunction CountObservable(source, fn) {\n  this.source = source;\n  this._fn = fn;\n  ObservableBase.call(this);\n}\n\ninherits(CountObservable, ObservableBase);\n\nCountObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new CountObserver(o, this._fn, this.source));\n};\n\nmodule.exports = function count (source, predicate, thisArg) {\n  var fn = bindCallback(predicate, thisArg, 3);\n  return new CountObservable(source, fn);\n};\n"
  },
  {
    "path": "src/modular/observable/create.js",
    "content": "'use strict';\n\nvar AnonymousObservable = require('./anonymousobservable');\n\n/**\n *  Creates an observable sequence from a specified subscribe method implementation.\n * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n */\nmodule.exports = function create (subscribe, parent) {\n  return new AnonymousObservable(subscribe, parent);\n};\n"
  },
  {
    "path": "src/modular/observable/debounce.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar Scheduler = require('../scheduler');\nvar BinaryDisposable = require('../binarydisposable');\nvar SerialDisposable = require('../serialdisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar isFunction = require('../helpers/isfunction');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction DebounceObserver(o, dt, scheduler, cancelable) {\n  this._o = o;\n  this._d = dt;\n  this._scheduler = scheduler;\n  this._c = cancelable;\n  this._v = null;\n  this._hv = false;\n  this._id = 0;\n  AbstractObserver.call(this);\n}\n\ninherits(DebounceObserver, AbstractObserver);\n\nDebounceObserver.prototype.next = function (x) {\n  this._hv = true;\n  this._v = x;\n  var currentId = ++this._id, d = new SingleAssignmentDisposable();\n  this._c.setDisposable(d);\n  d.setDisposable(this._scheduler.scheduleFuture(this, this._d, function (_, self) {\n    self._hv && self._id === currentId && self._o.onNext(x);\n    self._hv = false;\n  }));\n};\n\nDebounceObserver.prototype.error = function (e) {\n  this._c.dispose();\n  this._o.onError(e);\n  this._hv = false;\n  this._id++;\n};\n\nDebounceObserver.prototype.completed = function () {\n  this._c.dispose();\n  this._hv && this._o.onNext(this._v);\n  this._o.onCompleted();\n  this._hv = false;\n  this._id++;\n};\n\nfunction DebounceObservable(source, dt, s) {\n  Scheduler.isScheduler(s) || (s = Scheduler.async);\n  this.source = source;\n  this._dt = dt;\n  this._s = s;\n  ObservableBase.call(this);\n}\n\ninherits(DebounceObservable, ObservableBase);\n\nDebounceObservable.prototype.subscribeCore = function (o) {\n  var cancelable = new SerialDisposable();\n  return new BinaryDisposable(\n    this.source.subscribe(new DebounceObserver(o, this._dt, this._s, cancelable)),\n    cancelable);\n};\n\nfunction DebounceSelectorObserver(s) {\n  this._s = s;\n  AbstractObserver.call(this);\n}\n\ninherits(DebounceSelectorObserver, AbstractObserver);\n\nDebounceSelectorObserver.prototype.next = function (x) {\n  var throttle = tryCatch(this._s.fn)(x);\n  if (throttle === errorObj) { return this._s.o.onError(throttle.e); }\n\n  isPromise(throttle) && (throttle = fromPromise(throttle));\n\n  this._s.hasValue = true;\n  this._s.value = x;\n  this._s.id++;\n  var currentId = this._s.id, d = new SingleAssignmentDisposable();\n  this._s.cancelable.setDisposable(d);\n\n  var self = this;\n  d.setDisposable(throttle.subscribe(\n    function () {\n      self._s.hasValue && self._s.id === currentId && self._s.o.onNext(self._s.value);\n      self._s.hasValue = false;\n      d.dispose();\n    },\n    function (e) { self._s.o.onError(e); },\n    function () {\n      self._s.hasValue && self._s.id === currentId && self._s.o.onNext(self._s.value);\n      self._s.hasValue = false;\n      d.dispose();\n    }\n  ));\n};\n\nDebounceSelectorObserver.prototype.error = function (e) {\n  this._s.cancelable.dispose();\n  this._s.o.onError(e);\n  this._s.hasValue = false;\n  this._s.id++;\n};\n\nDebounceSelectorObserver.prototype.completed = function () {\n  this._s.cancelable.dispose();\n  this._s.hasValue && this._s.o.onNext(this._s.value);\n  this._s.o.onCompleted();\n  this._s.hasValue = false;\n  this._s.id++;\n};\n\nfunction DebounceSelectorObservable(source, fn) {\n  this.source = source;\n  this._fn = fn;\n  ObservableBase.call(this);\n}\n\ninherits(DebounceSelectorObservable, ObservableBase);\n\nDebounceSelectorObservable.prototype.subscribeCore = function (o) {\n  var state = {\n    value: null,\n    hasValue: false,\n    cancelable: new SerialDisposable(),\n    id: 0,\n    o: o,\n    fn: this._fn\n  };\n\n  return new BinaryDisposable(\n    state.cancelable,\n    this.source.subscribe(new DebounceSelectorObserver(state))\n  );\n};\n\nmodule.exports = function debounce() {\n  var source = arguments[0];\n  if (isFunction (arguments[1])) {\n    return new DebounceSelectorObservable(source, arguments[1]);\n  } else if (typeof arguments[1] === 'number') {\n    return new DebounceObservable(source, arguments[1], arguments[2]);\n  } else {\n    throw new Error('Invalid arguments');\n  }\n};\n"
  },
  {
    "path": "src/modular/observable/defaultifempty.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar inherits = require('inherits');\n\nfunction DefaultIfEmptyObserver(o, d) {\n  this._o = o;\n  this._d = d;\n  this._f = false;\n  AbstractObserver.call(this);\n}\n\ninherits(DefaultIfEmptyObserver, AbstractObserver);\n\nDefaultIfEmptyObserver.prototype.next = function (x) {\n  this._f = true;\n  this._o.onNext(x);\n};\nDefaultIfEmptyObserver.prototype.error = function (e) { this._o.onError(e); };\nDefaultIfEmptyObserver.prototype.completed = function () {\n  !this._f && this._o.onNext(this._d);\n  this._o.onCompleted();\n};\n\nfunction DefaultIfEmptyObservable(source, defaultValue) {\n  this.source = source;\n  this._d = defaultValue;\n  ObservableBase.call(this);\n}\n\ninherits(DefaultIfEmptyObservable, ObservableBase);\n\nDefaultIfEmptyObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new DefaultIfEmptyObserver(o, this._d));\n};\n\n/**\n *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n */\nmodule.exports = function defaultIfEmpty(source, defaultValue) {\n  return new DefaultIfEmptyObservable(source, defaultValue);\n};\n"
  },
  {
    "path": "src/modular/observable/defer.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar fromPromise = require('./frompromise');\nvar throwError = require('./throw');\nvar isPromise = require('../helpers/ispromise');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction Defer(factory) {\n  this._f = factory;\n  ObservableBase.call(this);\n}\n\ninherits(Defer, ObservableBase);\n\nDefer.prototype.subscribeCore = function (o) {\n  var result = tryCatch(this._f)();\n  if (result === errorObj) { return throwError(result.e).subscribe(o);}\n  isPromise(result) && (result = fromPromise(result));\n  return result.subscribe(o);\n};\n\n\n/**\n *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n *\n * @example\n *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n */\nmodule.exports = function observableDefer(observableFactory) {\n  return new Defer(observableFactory);\n};\n"
  },
  {
    "path": "src/modular/observable/delay.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar materialize = require('./materialize');\nvar timestamp = require('./timestamp');\nvar isObservable = require('../observable').isObservable;\nvar AbstractObserver = require('../observer/abstractobserver');\nvar BinaryDisposable = require('../binarydisposable');\nvar CompositeDisposable = require('../compositedisposable');\nvar SerialDisposable = require('../serialdisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar isFunction = require('../helpers/isfunction');\nvar Scheduler = require('../scheduler');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction scheduleRelative (state, recurse) {\n  if (state.error) { return; }\n  state.running = true;\n\n  var result;\n  do {\n    result = null;\n    if (state.q.length > 0 && state.q[0].timestamp - state.scheduler.now() <= 0) {\n      result = state.q.shift().value;\n    }\n    if (result) { result.accept(state.o); }\n  } while (result);\n\n  var shouldRecurse = false;\n  var recurseDueTime = 0;\n\n  if (state.q.length > 0) {\n    shouldRecurse = true;\n    recurseDueTime = Math.max(0, state.q[0].timestamp - state.scheduler.now());\n  } else {\n    state.active = false;\n  }\n\n  state.running = false;\n  if (state.error) {\n    state.o.onError(state.error);\n  } else if (shouldRecurse) {\n    recurse(state, recurseDueTime);\n  }\n}\n\nfunction DelayRelativeObserver(state) {\n  this._s = state;\n  AbstractObserver.call(this);\n}\n\ninherits(DelayRelativeObserver, AbstractObserver);\n\nDelayRelativeObserver.prototype.next = function (notification) {\n  var shouldRun;\n  if (notification.value.kind === 'E') {\n    this._s.q = [];\n    this._s.q.push(notification);\n    this._s.error = notification.value.error;\n    shouldRun = !this._s.running;\n  } else {\n    this._s.q.push({ value: notification.value, timestamp: notification.timestamp + this._s.dueTime });\n    shouldRun = !this._s.active;\n    this._s.active = true;\n  }\n  if (shouldRun) {\n    if (this._s.error) {\n      this._s.o.onError(this._s.error);\n    } else {\n      var d = new SingleAssignmentDisposable();\n      this._s.cancelable.setDisposable(d);\n      d.setDisposable(this._s.scheduler.scheduleRecursiveFuture(this._s, this._s.dueTime, scheduleRelative));\n    }\n  }\n};\n\nDelayRelativeObserver.prototype.error = function (e) { throw e; };\nDelayRelativeObserver.prototype.completed = function () { };\n\nfunction DelayRelativeObservable(source, dueTime, scheduler) {\n  this.source = source;\n  this._dueTime = dueTime;\n  this._scheduler = scheduler;\n  ObservableBase.call(this);\n}\n\ninherits(DelayRelativeObservable, ObservableBase);\n\nDelayRelativeObservable.prototype.subscribeCore = function (o) {\n  var state = {\n    active: false,\n    cancelable: new SerialDisposable(),\n    error: null,\n    q: [],\n    running: false,\n    o: o,\n    dueTime: this._dueTime,\n    scheduler: this._scheduler\n  };\n\n  var subscription = timestamp(materialize(this.source), this._scheduler)\n    .subscribe(new DelayRelativeObserver(state));\n\n  return new BinaryDisposable(subscription, state.cancelable);\n};\n\nfunction DelayAbsoluteObservable(source, dueTime, scheduler) {\n  this.source = source;\n  this._dueTime = dueTime;\n  this._scheduler = scheduler;\n  ObservableBase.call(this);\n}\n\ninherits(DelayAbsoluteObservable, ObservableBase);\n\nDelayAbsoluteObservable.prototype.subscribe = function (o) {\n  var obs = new DelayRelativeObservable(this.source, this._dueTime - this._scheduler.now(), this._scheduler);\n  return obs.subscribe(o);\n};\n\nfunction DelaySelectorObseravble(source, subscriptionDelay, delayDurationSelector) {\n  this.source = source;\n  this._selector = null;\n  this._subDelay = null;\n  if (isFunction(subscriptionDelay)) {\n    this._selector = subscriptionDelay;\n  } else {\n    this._subDelay = subscriptionDelay;\n    this._selector = delayDurationSelector;\n  }\n  ObservableBase.call(this);\n}\n\ninherits(DelaySelectorObseravble, ObservableBase);\n\nDelaySelectorObseravble.prototype.subscribeCore = function (o) {\n  var delays = new CompositeDisposable(),\n      atEnd = false,\n      subscription = new SerialDisposable(),\n      selector = this._selector,\n      subDelay = this._subDelay,\n      source = this.source;\n\n  function start() {\n    subscription.setDisposable(source.subscribe(\n      function (x) {\n        var delay = tryCatch(selector)(x);\n        if (delay === errorObj) { return o.onError(delay.e); }\n        var d = new SingleAssignmentDisposable();\n        delays.add(d);\n        d.setDisposable(delay.subscribe(\n          function () {\n            o.onNext(x);\n            delays.remove(d);\n            done();\n          },\n          function (e) { o.onError(e); },\n          function () {\n            o.onNext(x);\n            delays.remove(d);\n            done();\n          }\n        ));\n      },\n      function (e) { o.onError(e); },\n      function () {\n        atEnd = true;\n        subscription.dispose();\n        done();\n      }\n    ));\n  }\n\n  function done () {\n    atEnd && delays.length === 0 && o.onCompleted();\n  }\n\n  if (!subDelay) {\n    start();\n  } else {\n    subscription.setDisposable(subDelay.subscribe(start, function (e) { o.onError(e); }, start));\n  }\n\n  return new BinaryDisposable(subscription, delays);\n};\n\n/**\n *  Time shifts the observable sequence by dueTime.\n *  The relative time intervals between the values are preserved.\n *\n * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n * @returns {Observable} Time-shifted sequence.\n */\nmodule.exports = function delay () {\n  var source = arguments[0], firstArg = arguments[1];\n  if (typeof firstArg === 'number' || firstArg instanceof Date) {\n    var dueTime = firstArg, scheduler = arguments[2];\n    Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n    return dueTime instanceof Date ?\n      new DelayAbsoluteObservable(source, dueTime, scheduler) :\n      new DelayRelativeObservable(source, dueTime, scheduler);\n  } else if (isObservable(firstArg) || isFunction(firstArg)) {\n    return new DelaySelectorObseravble(source, firstArg, arguments[2]);\n  } else {\n    throw new Error('Invalid arguments');\n  }\n};\n"
  },
  {
    "path": "src/modular/observable/delaysubscription.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar SerialDisposable = require('../serialdisposable');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction DelaySubscription(source, dt, s) {\n  this.source = source;\n  this._dt = dt;\n  this._s = s;\n  ObservableBase.call(this);\n}\n\ninherits(DelaySubscription, ObservableBase);\n\nfunction scheduleMethod(s, state) {\n  var source = state[0], o = state[1], d = state[2];\n  d.setDisposable(source.subscribe(o));\n}\n\nDelaySubscription.prototype.subscribeCore = function (o) {\n  var d = new SerialDisposable();\n  d.setDisposable(this._s.scheduleFuture([this.source, o, d], this._dt, scheduleMethod));\n  return d;\n};\n\n/**\n *  Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n * @param {Number} dueTime Relative or absolute time shift of the subscription.\n * @param {Scheduler} [scheduler]  Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used.\n * @returns {Observable} Time-shifted sequence.\n */\nmodule.exports = function delaySubscription (source, dueTime, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  return new DelaySubscription(source, dueTime, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/dematerialize.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar inherits = require('inherits');\n\nfunction DematerializeObserver(o) {\n  this._o = o;\n  AbstractObserver.call(this);\n}\n\ninherits(DematerializeObserver, AbstractObserver);\n\nDematerializeObserver.prototype.next = function (x) { x.accept(this._o); };\nDematerializeObserver.prototype.error = function (e) { this._o.onError(e); };\nDematerializeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\nfunction DematerializeObservable(source) {\n  this.source = source;\n  ObservableBase.call(this);\n}\n\ninherits(DematerializeObservable, ObservableBase);\n\nDematerializeObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new DematerializeObserver(o));\n};\n\n/**\n * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n */\nmodule.exports = function dematerialize (source) {\n  return new DematerializeObservable(source);\n};\n"
  },
  {
    "path": "src/modular/observable/distinct.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar isFunction = require('../helpers/isfunction');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar isEqual = require('../internal/isequal');\nvar inherits = require('inherits');\n\nfunction arrayIndexOfComparer(array, item, comparer) {\n  for (var i = 0, len = array.length; i < len; i++) {\n    if (comparer(array[i], item)) { return i; }\n  }\n  return -1;\n}\n\nfunction HashSet(cmp) {\n  this._cmp = cmp;\n  this._set = [];\n}\n\nHashSet.prototype.push = function(v) {\n  var retValue = arrayIndexOfComparer(this._set, v, this._cmp) === -1;\n  retValue && this._set.push(v);\n  return retValue;\n};\n\nfunction DistinctObserver(o, keyFn, cmpFn) {\n  this._o = o;\n  this._keyFn = keyFn;\n  this._h = new HashSet(cmpFn);\n  AbstractObserver.call(this);\n}\n\ninherits(DistinctObserver, AbstractObserver);\n\nDistinctObserver.prototype.next = function (x) {\n  var key = x;\n  if (isFunction(this._keyFn)) {\n    key = tryCatch(this._keyFn)(x);\n    if (key === errorObj) { return this._o.onError(key.e); }\n  }\n  this._h.push(key) && this._o.onNext(x);\n};\n\nDistinctObserver.prototype.error = function (e) { this._o.onError(e); };\nDistinctObserver.prototype.completed = function () { this._o.onCompleted(); };\n\nfunction DistinctObservable(source, keyFn, cmpFn) {\n  this.source = source;\n  this._keyFn = keyFn;\n  this._cmpFn = cmpFn;\n  ObservableBase.call(this);\n}\n\ninherits(DistinctObservable, ObservableBase);\n\nDistinctObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new DistinctObserver(o, this._keyFn, this._cmpFn));\n};\n\nmodule.exports = function distinct (source, keySelector, comparer) {\n  comparer || (comparer = isEqual);\n  return new DistinctObservable(source, keySelector, comparer);\n};\n"
  },
  {
    "path": "src/modular/observable/distinctuntilchanged.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar isFunction = require('../helpers/isfunction');\nvar isEqual = require('../internal/isequal');\nvar inherits = require('inherits');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\n\nfunction DistinctUntilChangedObserver(o, fn, cmp) {\n  this._o = o;\n  this._fn = fn;\n  this._cmp = cmp;\n  this._hk = false;\n  this._k = null;\n  AbstractObserver.call(this);\n}\n\ninherits(DistinctUntilChangedObserver, AbstractObserver);\n\nDistinctUntilChangedObserver.prototype.next = function (x) {\n  var key = x, comparerEquals;\n  if (isFunction(this._fn)) {\n    key = tryCatch(this._fn)(x);\n    if (key === errorObj) { return this._o.onError(key.e); }\n  }\n  if (this._hk) {\n    comparerEquals = tryCatch(this._cmp)(this._k, key);\n    if (comparerEquals === errorObj) { return this._o.onError(comparerEquals.e); }\n  }\n  if (!this._hk || !comparerEquals) {\n    this._hk = true;\n    this._k = key;\n    this._o.onNext(x);\n  }\n};\nDistinctUntilChangedObserver.prototype.error = function(e) { this._o.onError(e); };\nDistinctUntilChangedObserver.prototype.completed = function () { this._o.onCompleted(); };\n\nfunction DistinctUntilChangedObservable(source, fn, cmp) {\n  this.source = source;\n  this._fn = fn;\n  this._cmp = cmp;\n  ObservableBase.call(this);\n}\n\ninherits(DistinctUntilChangedObservable, ObservableBase);\n\nDistinctUntilChangedObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new DistinctUntilChangedObserver(o, this._fn, this._cmp));\n};\n\n/**\n*  Returns an observable sequence that contains only distinct contiguous elements according to the keyFn and the comparer.\n* @param {Function} [keyFn] A function to compute the comparison key for each element. If not provided, it projects the value.\n* @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n* @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n*/\nmodule.exports = function distinctUntilChanged (source, keyFn, comparer) {\n  comparer || (comparer = isEqual);\n  return new DistinctUntilChangedObservable(source, keyFn, comparer);\n};\n"
  },
  {
    "path": "src/modular/observable/empty.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar Disposable = require('../disposable');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction scheduleItem(s, state) {\n  state.onCompleted();\n  return Disposable.empty;\n}\n\nfunction EmptyObservable(scheduler) {\n  this._scheduler = scheduler;\n  ObservableBase.call(this);\n}\n\ninherits(EmptyObservable, ObservableBase);\n\nEmptyObservable.prototype.subscribeCore = function (o) {\n  return this.scheduler === Scheduler.immediate ?\n    scheduleItem(null, o) :\n    this._scheduler.schedule(o, scheduleItem);\n};\n\nvar EMPTY_OBSERVABLE = new EmptyObservable(Scheduler.immediate);\n\n/**\n *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n *\n * @example\n *  var res = Rx.Observable.empty();\n *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n * @returns {Observable} An observable sequence with no elements.\n */\nmodule.exports = function empty (scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.immediate);\n  return scheduler === Scheduler.immediate ? EMPTY_OBSERVABLE : new EmptyObservable(scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/every.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar bindCallback = require('../internal/bindcallback');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction EveryObserver(o, fn, s) {\n  this._o = o;\n  this._fn = fn;\n  this._s = s;\n  this._i = 0;\n  AbstractObserver.call(this);\n}\n\ninherits(EveryObserver, AbstractObserver);\n\nEveryObserver.prototype.next = function (x) {\n  var result = tryCatch(this._fn)(x, this._i++, this._s);\n  if (result === errorObj) { return this._o.onError(result.e); }\n  if (!Boolean(result)) {\n    this._o.onNext(false);\n    this._o.onCompleted();\n  }\n};\nEveryObserver.prototype.error = function (e) { this._o.onError(e); };\nEveryObserver.prototype.completed = function () {\n  this._o.onNext(true);\n  this._o.onCompleted();\n};\n\nfunction EveryObservable(source, fn) {\n  this.source = source;\n  this._fn = fn;\n  ObservableBase.call(this);\n}\n\ninherits(EveryObservable, ObservableBase);\n\nEveryObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new EveryObserver(o, this._fn, this.source));\n};\n\nmodule.exports = function every (source, predicate, thisArg) {\n  var fn = bindCallback(predicate, thisArg, 3);\n  return new EveryObservable(source, fn);\n};\n"
  },
  {
    "path": "src/modular/observable/filter.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar bindCallback = require('../internal/bindcallback');\nvar inherits = require('inherits');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\n\nfunction FilterObserver(o, predicate, source) {\n  this._o = o;\n  this._fn = predicate;\n  this.source = source;\n  this._i = 0;\n  AbstractObserver.call(this);\n}\n\ninherits(FilterObserver, AbstractObserver);\n\nFilterObserver.prototype.next = function(x) {\n  var shouldYield = tryCatch(this._fn)(x, this._i++, this.source);\n  if (shouldYield === errorObj) {\n    return this._o.onError(shouldYield.e);\n  }\n  shouldYield && this._o.onNext(x);\n};\n\nFilterObserver.prototype.error = function (e) { this._o.onError(e); };\nFilterObserver.prototype.completed = function () { this._o.onCompleted(); };\n\nfunction FilterObservable(source, predicate, thisArg) {\n  this.source = source;\n  this._fn = bindCallback(predicate, thisArg, 3);\n  ObservableBase.call(this);\n}\n\ninherits(FilterObservable, ObservableBase);\n\nFilterObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new FilterObserver(o, this._fn, this));\n};\n\nfunction innerPredicate(fn, self) {\n  return function(x, i, o) { return self._fn(x, i, o) && fn.call(this, x, i, o); };\n}\n\nFilterObservable.prototype.internalFilter = function(fn, thisArg) {\n  return new FilterObservable(this.source, innerPredicate(fn, this), thisArg);\n};\n\n/**\n*  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n* @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n* @param {Any} [thisArg] Object to use as this when executing callback.\n* @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n*/\nmodule.exports = function filter(source, predicate, thisArg) {\n  return source instanceof FilterObservable ? source.internalFilter(predicate, thisArg) :\n    new FilterObservable(source, predicate, thisArg);\n};\n"
  },
  {
    "path": "src/modular/observable/finally.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar inherits = require('inherits');\nvar bindCallback = require('../internal/bindcallback');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj, thrower = tryCatchUtils.thrower;\n\nfunction FinallyDisposable(s, fn) {\n  this.isDisposed = false;\n  this._s = s;\n  this._fn = fn;\n}\n\nFinallyDisposable.prototype.dispose = function () {\n  if (!this.isDisposed) {\n    var res = tryCatch(this._s.dispose).call(this._s);\n    this._fn();\n    res === errorObj && thrower(res.e);\n  }\n};\n\nfunction FinallyObservable(source, fn, thisArg) {\n  this.source = source;\n  this._fn = bindCallback(fn, thisArg, 0);\n  ObservableBase.call(this);\n}\n\ninherits(FinallyObservable, ObservableBase);\n\nFinallyObservable.prototype.subscribeCore = function (o) {\n  var d = tryCatch(this.source.subscribe).call(this.source, o);\n  if (d === errorObj) {\n    this._fn();\n    thrower(d.e);\n  }\n\n  return new FinallyDisposable(d, this._fn);\n};\n\n/**\n *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n */\nmodule.exports = function finally_ (source, action, thisArg) {\n  return new FinallyObservable(source, action, thisArg);\n};\n"
  },
  {
    "path": "src/modular/observable/find.js",
    "content": "'use strict';\n\nvar FindValueObservable = require('./_findvalueobservable');\n\nmodule.exports = function find (source, predicate, thisArg) {\n  return new FindValueObservable(source, predicate, thisArg, false);\n};\n"
  },
  {
    "path": "src/modular/observable/findindex.js",
    "content": "'use strict';\n\nvar FindValueObservable = require('./_findvalueobservable');\n\nmodule.exports = function findIndex (source, predicate, thisArg) {\n  return new FindValueObservable(source, predicate, thisArg, true);\n};\n"
  },
  {
    "path": "src/modular/observable/first.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar EmptyError = require('../internal/errors').EmptyError;\nvar bindCallback = require('../internal/bindcallback');\nvar isFunction = require('../helpers/isfunction');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction FirstObserver(o, obj, s) {\n  this._o = o;\n  this._obj = obj;\n  this._s = s;\n  this._i = 0;\n  AbstractObserver.call(this);\n}\n\ninherits(FirstObserver, AbstractObserver);\n\nFirstObserver.prototype.next = function (x) {\n  if (this._obj.predicate) {\n    var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n    if (res === errorObj) { return this._o.onError(res.e); }\n    if (Boolean(res)) {\n      this._o.onNext(x);\n      this._o.onCompleted();\n    }\n  } else if (!this._obj.predicate) {\n    this._o.onNext(x);\n    this._o.onCompleted();\n  }\n};\nFirstObserver.prototype.error = function (e) { this._o.onError(e); };\nFirstObserver.prototype.completed = function () {\n  if (this._obj.defaultValue === undefined) {\n    this._o.onError(new EmptyError());\n  } else {\n    this._o.onNext(this._obj.defaultValue);\n    this._o.onCompleted();\n  }\n};\n\nfunction FirstObservable(source, obj) {\n  this.source = source;\n  this._obj = obj;\n  ObservableBase.call(this);\n}\n\ninherits(FirstObservable, ObservableBase);\n\nFirstObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new FirstObserver(o, this._obj, this.source));\n};\n\nmodule.exports = function first () {\n  var obj = {}, source = arguments[0];\n  if (typeof arguments[1] === 'object') {\n    obj = arguments[1];\n  } else {\n    obj = {\n      predicate: arguments[1],\n      thisArg: arguments[2],\n      defaultValue: arguments[3]\n    };\n  }\n  if (isFunction (obj.predicate)) {\n    var fn = obj.predicate;\n    obj.predicate = bindCallback(fn, obj.thisArg, 3);\n  }\n  return new FirstObservable(source, obj);\n};\n"
  },
  {
    "path": "src/modular/observable/flatmap.js",
    "content": "'use strict';\n\nvar FlatMapObservable = require('./flatmapobservable');\nvar mergeAll = require('./mergeall');\n\nmodule.exports = function flatMap (source, selector, resultSelector, thisArg) {\n  var obs = new FlatMapObservable(source, selector, resultSelector, thisArg);\n  return mergeAll(obs);\n};\n"
  },
  {
    "path": "src/modular/observable/flatmapfirst.js",
    "content": "'use strict';\n\nvar FlatMapObservable = require('./flatmapobservable');\nvar switchFirst = require('./switchfirst');\n\nmodule.exports = function flatMapFirst(source, selector, resultSelector, thisArg) {\n  return switchFirst(new FlatMapObservable(source, selector, resultSelector, thisArg));\n};\n"
  },
  {
    "path": "src/modular/observable/flatmaplatest.js",
    "content": "'use strict';\n\nvar FlatMapObservable = require('./flatmapobservable');\nvar switchLatest = require('./switch');\n\nmodule.exports = function flatMapLatest (source, selector, resultSelector, thisArg) {\n  return switchLatest(new FlatMapObservable(source, selector, resultSelector, thisArg));\n};\n"
  },
  {
    "path": "src/modular/observable/flatmapmaxconcurrent.js",
    "content": "'use strict';\n\nvar FlatMapObservable = require('./flatmapobservable');\nvar mergeConcat = require('./mergeconcat');\n\nmodule.exports = function flatMapLatest (source, limit, selector, resultSelector, thisArg) {\n  return mergeConcat(new FlatMapObservable(source, selector, resultSelector, thisArg), limit);\n};\n"
  },
  {
    "path": "src/modular/observable/flatmapobservable.js",
    "content": "'use strict';\n\nvar AbstractObserver = require('../observer/abstractobserver');\nvar ObservableBase = require('./observablebase');\nvar observableFrom = require('./from');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar isArrayLike = require('../helpers/isarraylike');\nvar isIterable = require('../helpers/isiterable');\nvar bindCallback = require('../internal/bindcallback');\nvar isFunction = require('../helpers/isfunction');\nvar inherits = require('inherits');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\n\nfunction FlatMapObserver(o, selector, resultSelector, source) {\n  this.i = 0;\n  this._fn = selector;\n  this._resFn = resultSelector;\n  this.source = source;\n  this._o = o;\n  AbstractObserver.call(this);\n}\n\ninherits(FlatMapObserver, AbstractObserver);\n\nFlatMapObserver.prototype._wrapResult = function(result, x, i) {\n  return isFunction(this._resFn) ?\n    result.map(function(y, i2) { return this._resFn(x, y, i, i2); }, this) :\n    result;\n};\n\nFlatMapObserver.prototype.next = function(x) {\n  var i = this.i++;\n  var result = tryCatch(this._fn)(x, i, this.source);\n  if (result === errorObj) { return this._o.onError(result.e); }\n\n  isPromise(result) && (result = fromPromise(result));\n  (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));\n  this._o.onNext(this._wrapResult(result, x, i));\n};\nFlatMapObserver.prototype.error = function(e) { this._o.onError(e); };\nFlatMapObserver.prototype.completed = function() { this._o.onCompleted(); };\n\nfunction FlatMapObservable(source, fn, resultFn, thisArg) {\n  this._resFn = isFunction(resultFn) ? resultFn : null;\n  this._fn = bindCallback(isFunction(fn) ? fn : function() { return fn; }, thisArg, 3);\n  this.source = source;\n  ObservableBase.call(this);\n}\n\ninherits(FlatMapObservable, ObservableBase);\n\nFlatMapObservable.prototype.subscribeCore = function(o) {\n  return this.source.subscribe(new FlatMapObserver(o, this._fn, this._resFn, this));\n};\n\nmodule.exports = FlatMapObservable;\n"
  },
  {
    "path": "src/modular/observable/forkjoin.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar CompositeDisposable = require('../compositedisposable');\nvar Disposable = require('../disposable');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar isFunction = require('../helpers/isfunction');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction argumentsToArray() {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return args;\n}\n\nfunction ForkJoinObserver(o, s, i, cb, subs) {\n  this._o = o;\n  this._s = s;\n  this._i = i;\n  this._cb = cb;\n  this._subs = subs;\n  AbstractObserver.call(this);\n}\n\ninherits(ForkJoinObserver, AbstractObserver);\n\nForkJoinObserver.prototype.next = function (x) {\n  if (!this._s.finished) {\n    this._s.hasResults[this._i] = true;\n    this._s.results[this._i] = x;\n  }\n};\n\nForkJoinObserver.prototype.error = function (e) {\n  this._s.finished = true;\n  this._o.onError(e);\n  this._subs.dispose();\n};\n\nForkJoinObserver.prototype.completed = function () {\n  if (!this._s.finished) {\n    if (!this._s.hasResults[this._i]) {\n      return this._o.onCompleted();\n    }\n    this._s.hasCompleted[this._i] = true;\n    for (var i = 0; i < this._s.results.length; i++) {\n      if (!this._s.hasCompleted[i]) { return; }\n    }\n    this._s.finished = true;\n\n    var res = tryCatch(this._cb).apply(null, this._s.results);\n    if (res === errorObj) { return this._o.onError(res.e); }\n\n    this._o.onNext(res);\n    this._o.onCompleted();\n  }\n};\n\nfunction ForkJoinObservable(sources, cb) {\n  this._sources = sources;\n  this._cb = cb;\n  ObservableBase.call(this);\n}\n\ninherits(ForkJoinObservable, ObservableBase);\n\nForkJoinObservable.prototype.subscribeCore = function (o) {\n  if (this._sources.length === 0) {\n    o.onCompleted();\n    return Disposable.empty;\n  }\n\n  var count = this._sources.length;\n  var state = {\n    finished: false,\n    hasResults: new Array(count),\n    hasCompleted: new Array(count),\n    results: new Array(count)\n  };\n\n  var subscriptions = new CompositeDisposable();\n  for (var i = 0, len = this._sources.length; i < len; i++) {\n    var source = this._sources[i];\n    isPromise(source) && (source = fromPromise(source));\n    subscriptions.add(source.subscribe(new ForkJoinObserver(o, state, i, this._cb, subscriptions)));\n  }\n\n  return subscriptions;\n};\n\nmodule.exports = function forkJoin () {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n  return new ForkJoinObservable(args, resultSelector);\n};\n"
  },
  {
    "path": "src/modular/observable/from.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar Scheduler = require('../scheduler');\nvar isFunction = require('../helpers/isfunction');\nvar $iterator$ = require('../helpers/iterator');\nvar bindCallback = require('../internal/bindcallback');\nvar inherits = require('inherits');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\n\nvar doneEnumerator = { done: true, value: undefined };\nvar maxSafeInteger = Math.pow(2, 53) - 1;\n\nfunction numberIsFinite(value) {\n  return typeof value === 'number' && global.isFinite(value);\n}\n\nfunction sign(value) {\n  var number = +value;\n  if (number === 0) { return number; }\n  if (isNaN(number)) { return number; }\n  return number < 0 ? -1 : 1;\n}\n\nfunction toLength(o) {\n  var len = +o.length;\n  if (isNaN(len)) { return 0; }\n  if (len === 0 || !numberIsFinite(len)) { return len; }\n  len = sign(len) * Math.floor(Math.abs(len));\n  if (len <= 0) { return 0; }\n  if (len > maxSafeInteger) { return maxSafeInteger; }\n  return len;\n}\n\nfunction StringIterator(s) {\n  this._s = s;\n  this._l = s.length;\n  this._i = 0;\n}\n\nStringIterator.prototype[$iterator$] = function () {\n  return this;\n};\n\nStringIterator.prototype.next = function () {\n  return this._i < this._l ? { done: false, value: this._s.charAt(this._i++) } : doneEnumerator;\n};\n\nfunction StringIterable(s) {\n  this._s = s;\n}\n\nStringIterable.prototype[$iterator$] = function () {\n  return new StringIterator(this._s);\n};\n\nfunction ArrayIterator(a) {\n  this._a = a;\n  this._l = toLength(a);\n  this._i = 0;\n}\n\nArrayIterator.prototype[$iterator$] = function () {\n  return this;\n};\n\nArrayIterator.prototype.next = function () {\n  return this._i < this._l ? { done: false, value: this._a[this._i++] } : doneEnumerator;\n};\n\nfunction ArrayIterable(a) {\n  this._a = a;\n}\n\nArrayIterable.prototype[$iterator$] = function () {\n  return new ArrayIterator(this._a);\n};\n\nfunction getIterable(o) {\n  var i = o[$iterator$], it;\n  if (!i && typeof o === 'string') {\n    it = new StringIterable(o);\n    return it[$iterator$]();\n  }\n  if (!i && o.length !== undefined) {\n    it = new ArrayIterable(o);\n    return it[$iterator$]();\n  }\n  if (!i) { throw new TypeError('Object is not iterable'); }\n  return o[$iterator$]();\n}\n\nfunction FromObservable(iterable, fn, scheduler) {\n  this._iterable = iterable;\n  this._fn = fn;\n  this._scheduler = scheduler;\n  ObservableBase.call(this);\n}\n\ninherits(FromObservable, ObservableBase);\n\nfunction scheduleRecursive(o, it, fn) {\n  return function loopRecursive(i, recurse) {\n    var next = tryCatch(it.next).call(it);\n    if (next === errorObj) { return o.onError(next.e); }\n    if (next.done) { return o.onCompleted(); }\n\n    var result = next.value;\n\n    if (isFunction(fn)) {\n      result = tryCatch(fn)(result, i);\n      if (result === errorObj) { return o.onError(result.e); }\n    }\n\n    o.onNext(result);\n    recurse(i + 1);\n  };\n}\n\nFromObservable.prototype.subscribeCore = function (o) {\n  var list = Object(this._iterable),\n      it = getIterable(list);\n\n  return this._scheduler.scheduleRecursive(0, scheduleRecursive(o, it, this._fn));\n};\n\n/**\n* This method creates a new Observable sequence from an array-like or iterable object.\n* @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n* @param {Function} [mapFn] Map function to call on every element of the array.\n* @param {Any} [thisArg] The context to use calling the mapFn if provided.\n* @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n*/\nmodule.exports = function (iterable, mapFn, thisArg, scheduler) {\n  if (iterable == null) { throw new Error('iterable cannot be null.'); }\n  if (mapFn && !isFunction(mapFn)) { throw new Error('mapFn when provided must be a function'); }\n\n  var mapper;\n  if (mapFn) { mapper = bindCallback(mapFn, thisArg, 2); }\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.queue);\n  return new FromObservable(iterable, mapper, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/fromarray.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction scheduleRecursive(state, recurse) {\n  if (state.i < state.len) {\n    state.o.onNext(state.args[state.i++]);\n    recurse(state);\n  } else {\n    state.o.onCompleted();\n  }\n}\n\nfunction FromArrayObservable(args, scheduler) {\n  this._args = args;\n  this._scheduler = scheduler;\n  ObservableBase.call(this);\n}\n\ninherits(FromArrayObservable, ObservableBase);\n\nFromArrayObservable.prototype.subscribeCore = function (o) {\n  var state = {\n    i: 0,\n    args: this._args,\n    len: this._args.length,\n    o: o\n  };\n  return this._scheduler.scheduleRecursive(state, scheduleRecursive);\n};\n\nmodule.exports = function fromArray(array, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.queue);\n  return new FromArrayObservable(array, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/fromevent.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar fromEventPattern = require('./fromeventpattern');\nvar publish = require('./publish');\nvar CompositeDisposable = require('../compositedisposable');\nvar isFunction = require('../helpers/isfunction');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction isNodeList(el) {\n  if (global.StaticNodeList) {\n    // IE8 Specific\n    // instanceof is slower than Object#toString, but Object#toString will not work as intended in IE8\n    return el instanceof global.StaticNodeList || el instanceof global.NodeList;\n  } else {\n    return Object.prototype.toString.call(el) === '[object NodeList]';\n  }\n}\n\nfunction ListenDisposable(e, n, fn, o) {\n  this._e = e;\n  this._n = n;\n  this._fn = fn;\n  this._opts = o || false;\n  this._e.addEventListener(this._n, this._fn, this._opts);\n  this.isDisposed = false;\n}\n\nListenDisposable.prototype.dispose = function () {\n  if (!this.isDisposed) {\n    this._e.removeEventListener(this._n, this._fn, this._opts);\n    this.isDisposed = true;\n  }\n};\n\nfunction createEventListener (el, eventName, handler, optionOrCapture) {\n  var disposables = new CompositeDisposable();\n\n  // Asume NodeList or HTMLCollection\n  var elemToString = Object.prototype.toString.call(el);\n  if (isNodeList(el) || elemToString === '[object HTMLCollection]') {\n    for (var i = 0, len = el.length; i < len; i++) {\n      disposables.add(createEventListener(el.item(i), eventName, handler, optionOrCapture));\n    }\n  } else if (el) {\n    disposables.add(new ListenDisposable(el, eventName, handler, optionOrCapture));\n  }\n\n  return disposables;\n}\n\n/**\n * Configuration option to determine whether to use native events only\n */\nglobal.Rx || (global.Rx = {});\nglobal.Rx.config || (global.Rx.config = {});\nglobal.Rx.config.useNativeEvents = false;\n\nfunction EventObservable(el, name, fn, opts) {\n  this._el = el;\n  this._n = name;\n  this._fn = fn;\n  this._opts = opts;\n  ObservableBase.call(this);\n}\n\ninherits(EventObservable, ObservableBase);\n\nfunction createHandler(o, fn) {\n  return function handler () {\n    var results = arguments[0];\n    if (isFunction(fn)) {\n      results = tryCatch(fn).apply(null, arguments);\n      if (results === errorObj) { return o.onError(results.e); }\n    }\n    o.onNext(results);\n  };\n}\n\nEventObservable.prototype.subscribeCore = function (o) {\n  return createEventListener(\n    this._el,\n    this._n,\n    createHandler(o, this._fn),\n    this._opts);\n};\n\n/**\n * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n * @param {Object} element The DOMElement or NodeList to attach a listener.\n * @param {String} eventName The event name to attach the observable sequence.\n * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n * @param {Object} options An object of EventListenerOptions \n * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n */\nmodule.exports = function fromEvent(element, eventName, selector, options) {\n  // Node.js specific\n  if (element.addListener) {\n    return fromEventPattern(\n      function (h) { element.addListener(eventName, h); },\n      function (h) { element.removeListener(eventName, h); },\n      selector);\n  }\n\n  // Use only if non-native events are allowed\n  if (!global.Rx.config.useNativeEvents) {\n    // Handles jq, Angular.js, Zepto, Marionette, Ember.js\n    if (typeof element.on === 'function' && typeof element.off === 'function') {\n      return fromEventPattern(\n        function (h) { element.on(eventName, h); },\n        function (h) { element.off(eventName, h); },\n        selector);\n    }\n  }\n\n  return publish(\n    new EventObservable(element, eventName, selector, options)\n  ).refCount();\n};\n"
  },
  {
    "path": "src/modular/observable/fromeventpattern.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar publish = require('./publish');\nvar isFunction = require('../helpers/isfunction');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction EventPatternDisposable(del, fn, ret) {\n  this._del = del;\n  this._fn = fn;\n  this._ret = ret;\n  this.isDisposed = false;\n}\n\nEventPatternDisposable.prototype.dispose = function () {\n  if(!this.isDisposed) {\n    isFunction(this._del) && this._del(this._fn, this._ret);\n    this.isDisposed = true;\n  }\n};\n\nfunction EventPatternObservable(add, del, fn) {\n  this._add = add;\n  this._del = del;\n  this._fn = fn;\n  ObservableBase.call(this);\n}\n\ninherits(EventPatternObservable, ObservableBase);\n\nfunction createHandler(o, fn) {\n  return function handler () {\n    var results = arguments[0];\n    if (isFunction(fn)) {\n      results = tryCatch(fn).apply(null, arguments);\n      if (results === errorObj) { return o.onError(results.e); }\n    }\n    o.onNext(results);\n  };\n}\n\nEventPatternObservable.prototype.subscribeCore = function (o) {\n  var fn = createHandler(o, this._fn);\n  var returnValue = this._add(fn);\n  return new EventPatternDisposable(this._del, fn, returnValue);\n};\n\n/**\n * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n * @param {Function} addHandler The function to add a handler to the emitter.\n * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n * @returns {Observable} An observable sequence which wraps an event from an event emitter\n */\nmodule.exports = function fromEventPattern (addHandler, removeHandler, selector) {\n  return publish(new EventPatternObservable(addHandler, removeHandler, selector)).refCount();\n};\n"
  },
  {
    "path": "src/modular/observable/frompromise.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar Scheduler = require('../scheduler');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar isFunction = require('../helpers/isfunction');\nvar inherits = require('inherits');\n\nfunction FromPromiseObservable(p, s) {\n  this._p = p;\n  this._s = s;\n  ObservableBase.call(this);\n}\n\ninherits(FromPromiseObservable, ObservableBase);\n\nfunction scheduleNext(s, state) {\n  var o = state[0], data = state[1];\n  o.onNext(data);\n  o.onCompleted();\n}\n\nfunction scheduleError(s, state) {\n  var o = state[0], err = state[1];\n  o.onError(err);\n}\n\nFromPromiseObservable.prototype.subscribeCore = function(o) {\n  var sad = new SingleAssignmentDisposable(), self = this, p = self._p;\n\n  if (isFunction(p)) {\n    p = tryCatch(p)();\n    if (p === errorObj) {\n      o.onError(p.e);\n      return sad;\n    }\n  }\n\n  p\n    .then(function (data) {\n      sad.setDisposable(self._s.schedule([o, data], scheduleNext));\n    }, function (err) {\n      sad.setDisposable(self._s.schedule([o, err], scheduleError));\n    });\n\n  return sad;\n};\n\n/**\n* Converts a Promise to an Observable sequence\n* @param {Promise|Function} An ES6 Compliant promise or a function that returns one\n* @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n*/\nmodule.exports = function fromPromise(promise, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  return new FromPromiseObservable(promise, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/generate.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar Scheduler = require('../scheduler');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction GenerateObservable(state, cndFn, itrFn, resFn, s) {\n  this._initialState = state;\n  this._cndFn = cndFn;\n  this._itrFn = itrFn;\n  this._resFn = resFn;\n  this._s = s;\n  ObservableBase.call(this);\n}\n\ninherits(GenerateObservable, ObservableBase);\n\nfunction scheduleRecursive(state, recurse) {\n  if (state.first) {\n    state.first = false;\n  } else {\n    state.newState = tryCatch(state.self._itrFn)(state.newState);\n    if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n  }\n  var hasResult = tryCatch(state.self._cndFn)(state.newState);\n  if (hasResult === errorObj) { return state.o.onError(hasResult.e); }\n  if (hasResult) {\n    var result = tryCatch(state.self._resFn)(state.newState);\n    if (result === errorObj) { return state.o.onError(result.e); }\n    state.o.onNext(result);\n    recurse(state);\n  } else {\n    state.o.onCompleted();\n  }\n}\n\nGenerateObservable.prototype.subscribeCore = function (o) {\n  var state = {\n    o: o,\n    self: this,\n    first: true,\n    newState: this._initialState,\n  };\n  return this._s.scheduleRecursive(state, scheduleRecursive);\n};\n\nmodule.exports = function generate (initialState, condition, iterate, resultSelector, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.queue);\n  return new GenerateObservable(initialState, condition, iterate, resultSelector, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/generateabsolute.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction GenerateAbsoluteObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n  this._state = state;\n  this._cndFn = cndFn;\n  this._itrFn = itrFn;\n  this._resFn = resFn;\n  this._timeFn = timeFn;\n  this._s = s;\n  ObservableBase.call(this);\n}\n\ninherits(GenerateAbsoluteObservable, ObservableBase);\n\nfunction scheduleRecursive(state, recurse) {\n  state.hasResult && state.o.onNext(state.result);\n\n  if (state.first) {\n    state.first = false;\n  } else {\n    state.newState = tryCatch(state.self._itrFn)(state.newState);\n    if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n  }\n  state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n  if (state.hasResult === errorObj) { return state.o.onError(state.hasResult.e); }\n  if (state.hasResult) {\n    state.result = tryCatch(state.self._resFn)(state.newState);\n    if (state.result === errorObj) { return state.o.onError(state.result.e); }\n    var time = tryCatch(state.self._timeFn)(state.newState);\n    if (time === errorObj) { return state.o.onError(time.e); }\n    recurse(state, time);\n  } else {\n    state.o.onCompleted();\n  }\n}\n\nGenerateAbsoluteObservable.prototype.subscribeCore = function (o) {\n  var state = {\n    o: o,\n    self: this,\n    newState: this._state,\n    first: true,\n    hasResult: false\n  };\n  return this._s.scheduleRecursiveFuture(state, new Date(this._s.now()), scheduleRecursive);\n};\n\n\nmodule.exports = function generateAbsolute (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  return new GenerateAbsoluteObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/generaterelative.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction GenerateRelativeObservable(state, cndFn, itrFn, resFn, timeFn, s) {\n  this._state = state;\n  this._cndFn = cndFn;\n  this._itrFn = itrFn;\n  this._resFn = resFn;\n  this._timeFn = timeFn;\n  this._s = s;\n  ObservableBase.call(this);\n}\n\ninherits(GenerateRelativeObservable, ObservableBase);\n\nfunction scheduleRecursive(state, recurse) {\n  state.hasResult && state.o.onNext(state.result);\n\n  if (state.first) {\n    state.first = false;\n  } else {\n    state.newState = tryCatch(state.self._itrFn)(state.newState);\n    if (state.newState === errorObj) { return state.o.onError(state.newState.e); }\n  }\n  state.hasResult = tryCatch(state.self._cndFn)(state.newState);\n  if (state.hasResult === errorObj) { return state.o.onError(state.hasResult.e); }\n  if (state.hasResult) {\n    state.result = tryCatch(state.self._resFn)(state.newState);\n    if (state.result === errorObj) { return state.o.onError(state.result.e); }\n    var time = tryCatch(state.self._timeFn)(state.newState);\n    if (time === errorObj) { return state.o.onError(time.e); }\n    recurse(state, time);\n  } else {\n    state.o.onCompleted();\n  }\n}\n\nGenerateRelativeObservable.prototype.subscribeCore = function (o) {\n  var state = {\n    o: o,\n    self: this,\n    newState: this._state,\n    first: true,\n    hasResult: false\n  };\n  return this._s.scheduleRecursiveFuture(state, 0, scheduleRecursive);\n};\n\nmodule.exports = function generateRelative (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  return new GenerateRelativeObservable(initialState, condition, iterate, resultSelector, timeSelector, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/groupjoin.js",
    "content": "'use strict';\n\nvar AnonymousObservable = require('./anonymousobservable'); // TODO: Get rid of\nvar CompositeDisposable = require('../compositedisposable');\nvar RefCountDisposable = require('../refcountdisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar Subject = require('../subject');\nvar addRef = require('../internal/addref');\nvar noop = require('../helpers/noop');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\n\nrequire('es6-map/implement');\n\nmodule.exports = function groupJoin(left, right, leftDurationSelector, rightDurationSelector, resultSelector) {\n  return new AnonymousObservable(function (o) {\n    var group = new CompositeDisposable();\n    var r = new RefCountDisposable(group);\n    var leftMap = new global.Map(), rightMap = new global.Map();\n    var leftId = 0, rightId = 0;\n    var handleError = function (e) { return function (v) { v.onError(e); }; };\n\n    group.add(left.subscribe(\n      function (value) {\n        var s = new Subject();\n        var id = leftId++;\n        leftMap.set(id, s);\n\n        var result = tryCatch(resultSelector)(value, addRef(s, r));\n        if (result === errorObj) {\n          leftMap.forEach(handleError(result.e));\n          return o.onError(result.e);\n        }\n        o.onNext(result);\n\n        rightMap.forEach(function (v) { s.onNext(v); });\n\n        var md = new SingleAssignmentDisposable();\n        group.add(md);\n\n        var duration = tryCatch(leftDurationSelector)(value);\n        if (duration === errorObj) {\n          leftMap.forEach(handleError(duration.e));\n          return o.onError(duration.e);\n        }\n\n        md.setDisposable(duration.take(1).subscribe(\n          noop,\n          function (e) {\n            leftMap.forEach(handleError(e));\n            o.onError(e);\n          },\n          function () {\n            leftMap['delete'](id) && s.onCompleted();\n            group.remove(md);\n          }));\n      },\n      function (e) {\n        leftMap.forEach(handleError(e));\n        o.onError(e);\n      },\n      function () { o.onCompleted(); })\n    );\n\n    group.add(right.subscribe(\n      function (value) {\n        var id = rightId++;\n        rightMap.set(id, value);\n\n        var md = new SingleAssignmentDisposable();\n        group.add(md);\n\n        var duration = tryCatch(rightDurationSelector)(value);\n        if (duration === errorObj) {\n          leftMap.forEach(handleError(duration.e));\n          return o.onError(duration.e);\n        }\n\n        md.setDisposable(duration.take(1).subscribe(\n          noop,\n          function (e) {\n            leftMap.forEach(handleError(e));\n            o.onError(e);\n          },\n          function () {\n            rightMap['delete'](id);\n            group.remove(md);\n          }));\n\n        leftMap.forEach(function (v) { v.onNext(value); });\n      },\n      function (e) {\n        leftMap.forEach(handleError(e));\n        o.onError(e);\n      })\n    );\n\n    return r;\n  }, left);\n};\n"
  },
  {
    "path": "src/modular/observable/ignoreelements.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar noop = require('../helpers/noop');\nvar inherits = require('inherits');\n\nfunction IgnoreElementsObserver(o) {\n  this._o = o;\n  AbstractObserver.call(this);\n}\n\ninherits(IgnoreElementsObserver, AbstractObserver);\n\nIgnoreElementsObserver.prototype.next = noop;\nIgnoreElementsObserver.prototype.error = function (e) { this._o.onError(e); };\nIgnoreElementsObserver.prototype.completed = function () { this._o.onCompleted(); };\n\nfunction IgnoreElementsObservable(source) {\n  this.source = source;\n  ObservableBase.call(this);\n}\n\ninherits(IgnoreElementsObservable, ObservableBase);\n\nIgnoreElementsObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new IgnoreElementsObserver(o));\n};\n\n/**\n *  Ignores all elements in an observable sequence leaving only the termination messages.\n * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n */\nmodule.exports = function ignoreElements (source) {\n  return new IgnoreElementsObservable(source);\n};\n"
  },
  {
    "path": "src/modular/observable/includes.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar Disposable = require('../disposable');\nvar inherits = require('inherits');\n\nfunction IncludesObserver(o, elem, n) {\n  this._o = o;\n  this._elem = elem;\n  this._n = n;\n  this._i = 0;\n  AbstractObserver.call(this);\n}\n\ninherits(IncludesObserver, AbstractObserver);\n\nfunction comparer(a, b) {\n  return (a === 0 && b === 0) || (a === b || (isNaN(a) && isNaN(b)));\n}\n\nIncludesObserver.prototype.next = function (x) {\n  if (this._i++ >= this._n && comparer(x, this._elem)) {\n    this._o.onNext(true);\n    this._o.onCompleted();\n  }\n};\nIncludesObserver.prototype.error = function (e) { this._o.onError(e); };\nIncludesObserver.prototype.completed = function () { this._o.onNext(false); this._o.onCompleted(); };\n\nfunction IncludesObservable(source, elem, idx) {\n  var n = +idx || 0;\n  Math.abs(n) === Infinity && (n = 0);\n\n  this.source = source;\n  this._elem = elem;\n  this._n = n;\n  ObservableBase.call(this);\n}\n\ninherits(IncludesObservable, ObservableBase);\n\nIncludesObservable.prototype.subscribeCore = function (o) {\n  if (this._n < 0) {\n    o.onNext(false);\n    o.onCompleted();\n    return Disposable.empty;\n  }\n\n  return this.source.subscribe(new IncludesObserver(o, this._elem, this._n));\n};\n\nmodule.exports = function includes (source, searchElement, fromIndex) {\n  return new IncludesObservable(source, searchElement, fromIndex);\n};\n"
  },
  {
    "path": "src/modular/observable/indexof.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar Disposable = require('../disposable');\nvar inherits = require('inherits');\n\nfunction IndexOfObserver(o, e, n) {\n  this._o = o;\n  this._e = e;\n  this._n = n;\n  this._i = 0;\n  AbstractObserver.call(this);\n}\n\ninherits(IndexOfObserver, AbstractObserver);\n\nIndexOfObserver.prototype.next = function (x) {\n  if (this._i >= this._n && x === this._e) {\n    this._o.onNext(this._i);\n    this._o.onCompleted();\n  }\n  this._i++;\n};\nIndexOfObserver.prototype.error = function (e) { this._o.onError(e); };\nIndexOfObserver.prototype.completed = function () { this._o.onNext(-1); this._o.onCompleted(); };\n\nfunction IndexOfObservable(source, e, n) {\n  this.source = source;\n  this._e = e;\n  this._n = n;\n  ObservableBase.call(this);\n}\n\ninherits(IndexOfObservable, ObservableBase);\n\nIndexOfObservable.prototype.subscribeCore = function (o) {\n  if (this._n < 0) {\n    o.onNext(-1);\n    o.onCompleted();\n    return Disposable.empty;\n  }\n\n  return this.source.subscribe(new IndexOfObserver(o, this._e, this._n));\n};\n\nmodule.exports = function indexOf (source, searchElement, fromIndex) {\n  var n = +fromIndex || 0;\n  Math.abs(n) === Infinity && (n = 0);\n  return new IndexOfObservable(source, searchElement, n);\n};\n"
  },
  {
    "path": "src/modular/observable/interval.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction IntervalObservable(period, scheduler) {\n  this._period = period;\n  this._scheduler = scheduler;\n  ObservableBase.call(this);\n}\n\ninherits(IntervalObservable, ObservableBase);\n\nfunction createScheduleMethod(o) {\n  return function scheduleMethod (count) {\n    o.onNext(count);\n    return count + 1;\n  };\n}\n\nIntervalObservable.prototype.subscribeCore = function (o) {\n  return this._scheduler.schedulePeriodic(0, this._period, createScheduleMethod(o));\n};\n\n/**\n*  Returns an observable sequence that produces a value after each period.\n* @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n* @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n* @returns {Observable} An observable sequence that produces a value after each period.\n*/\nmodule.exports = function interval (period, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  return new IntervalObservable(period, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/isempty.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar inherits = require('inherits');\n\nfunction IsEmptyObserver(o) {\n  this._o = o;\n  AbstractObserver.call(this);\n}\n\ninherits(IsEmptyObserver, AbstractObserver);\n\nIsEmptyObserver.prototype.next = function () {\n  this._o.onNext(false);\n  this._o.onCompleted();\n};\nIsEmptyObserver.prototype.error = function (e) { this._o.onError(e); };\nIsEmptyObserver.prototype.completed = function () {\n  this._o.onNext(true);\n  this._o.onCompleted();\n};\n\nfunction IsEmptyObservable(source) {\n  this.source = source;\n  ObservableBase.call(this);\n}\n\ninherits(IsEmptyObservable, ObservableBase);\n\nIsEmptyObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new IsEmptyObserver(o));\n};\n\nmodule.exports = function isEmpty (source) {\n  return new IsEmptyObservable(source);\n};\n"
  },
  {
    "path": "src/modular/observable/join.js",
    "content": "'use strict';\n\nvar AnonymousObservable = require('./anonymousobservable'); // TODO: Get rid of\nvar take = require('./take');\nvar CompositeDisposable = require('../compositedisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar noop = require('../helpers/noop');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\n\nrequire('es6-map/implement');\n\nmodule.exports = function join (left, right, leftDurationSelector, rightDurationSelector, resultSelector) {\n  return new AnonymousObservable(function (o) {\n    var group = new CompositeDisposable();\n    var leftDone = false, rightDone = false;\n    var leftId = 0, rightId = 0;\n    var leftMap = new global.Map(), rightMap = new global.Map();\n    var handleError = function (e) { o.onError(e); };\n\n    group.add(left.subscribe(\n      function (value) {\n        var id = leftId++, md = new SingleAssignmentDisposable();\n\n        leftMap.set(id, value);\n        group.add(md);\n\n        var duration = tryCatch(leftDurationSelector)(value);\n        if (duration === errorObj) { return o.onError(duration.e); }\n\n        md.setDisposable(take(duration, 1).subscribe(\n          noop,\n          handleError,\n          function () {\n            leftMap['delete'](id) && leftMap.size === 0 && leftDone && o.onCompleted();\n            group.remove(md);\n          }));\n\n        rightMap.forEach(function (v) {\n          var result = tryCatch(resultSelector)(value, v);\n          if (result === errorObj) { return o.onError(result.e); }\n          o.onNext(result);\n        });\n      },\n      handleError,\n      function () {\n        leftDone = true;\n        (rightDone || leftMap.size === 0) && o.onCompleted();\n      })\n    );\n\n    group.add(right.subscribe(\n      function (value) {\n        var id = rightId++, md = new SingleAssignmentDisposable();\n\n        rightMap.set(id, value);\n        group.add(md);\n\n        var duration = tryCatch(rightDurationSelector)(value);\n        if (duration === errorObj) { return o.onError(duration.e); }\n\n        md.setDisposable(take(duration, 1).subscribe(\n          noop,\n          handleError,\n          function () {\n            rightMap['delete'](id) && rightMap.size === 0 && rightDone && o.onCompleted();\n            group.remove(md);\n          }));\n\n        leftMap.forEach(function (v) {\n          var result = tryCatch(resultSelector)(v, value);\n          if (result === errorObj) { return o.onError(result.e); }\n          o.onNext(result);\n        });\n      },\n      handleError,\n      function () {\n        rightDone = true;\n        (leftDone || rightMap.size === 0) && o.onCompleted();\n      })\n    );\n    return group;\n  }, left);\n};\n"
  },
  {
    "path": "src/modular/observable/just.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar Disposable = require('../disposable');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction scheduleItem(s, state) {\n  var value = state[0], observer = state[1];\n  observer.onNext(value);\n  observer.onCompleted();\n  return Disposable.empty;\n}\n\nfunction JustObservable(value, scheduler) {\n  this._value = value;\n  this._scheduler = scheduler;\n  ObservableBase.call(this);\n}\n\ninherits(JustObservable, ObservableBase);\n\nJustObservable.prototype.subscribeCore = function (o) {\n  var state = [this._value, o];\n  return this._scheduler === Scheduler.immediate ?\n    scheduleItem(null, state) :\n    this._scheduler.schedule(state, scheduleItem);\n};\n\nmodule.exports = function just(value, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.immediate);\n  return new JustObservable(value, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/last.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar EmptyError = require('../internal/errors').EmptyError;\nvar bindCallback = require('../internal/bindcallback');\nvar isFunction = require('../helpers/isfunction');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction LastObserver(o, obj, s) {\n  this._o = o;\n  this._obj = obj;\n  this._s = s;\n  this._i = 0;\n  this._hv = false;\n  this._v = null;\n  AbstractObserver.call(this);\n}\n\ninherits(LastObserver, AbstractObserver);\n\nLastObserver.prototype.next = function (x) {\n  var shouldYield = false;\n  if (this._obj.predicate) {\n    var res = tryCatch(this._obj.predicate)(x, this._i++, this._s);\n    if (res === errorObj) { return this._o.onError(res.e); }\n    Boolean(res) && (shouldYield = true);\n  } else if (!this._obj.predicate) {\n    shouldYield = true;\n  }\n  if (shouldYield) {\n    this._hv = true;\n    this._v = x;\n  }\n};\nLastObserver.prototype.error = function (e) { this._o.onError(e); };\nLastObserver.prototype.completed = function () {\n  if (this._hv) {\n    this._o.onNext(this._v);\n    this._o.onCompleted();\n  }\n  else if (this._obj.defaultValue === undefined) {\n    this._o.onError(new EmptyError());\n  } else {\n    this._o.onNext(this._obj.defaultValue);\n    this._o.onCompleted();\n  }\n};\n\nfunction LastObservable(source, obj) {\n  this.source = source;\n  this._obj = obj;\n  ObservableBase.call(this);\n}\n\ninherits(LastObservable, ObservableBase);\n\nLastObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new LastObserver(o, this._obj, this.source));\n};\n\nmodule.exports = function last () {\n  var obj = {}, source = arguments[0];\n  if (typeof arguments[1] === 'object') {\n    obj = arguments[1];\n  } else {\n    obj = {\n      predicate: arguments[1],\n      thisArg: arguments[2],\n      defaultValue: arguments[3]\n    };\n  }\n  if (isFunction (obj.predicate)) {\n    var fn = obj.predicate;\n    obj.predicate = bindCallback(fn, obj.thisArg, 3);\n  }\n  return new LastObservable(source, obj);\n};\n"
  },
  {
    "path": "src/modular/observable/lastindexof.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar Disposable = require('../disposable');\nvar inherits = require('inherits');\n\nfunction LastIndexOfObserver(o, e, n) {\n  this._o = o;\n  this._e = e;\n  this._n = n;\n  this._v = 0;\n  this._hv = false;\n  this._i = 0;\n  AbstractObserver.call(this);\n}\n\ninherits(LastIndexOfObserver, AbstractObserver);\n\nLastIndexOfObserver.prototype.next = function (x) {\n  if (this._i >= this._n && x === this._e) {\n    this._hv = true;\n    this._v = this._i;\n  }\n  this._i++;\n};\nLastIndexOfObserver.prototype.error = function (e) { this._o.onError(e); };\nLastIndexOfObserver.prototype.completed = function () {\n  if (this._hv) {\n    this._o.onNext(this._v);\n  } else {\n    this._o.onNext(-1);\n  }\n  this._o.onCompleted();\n};\n\nfunction LastIndexOfObservable(source, e, n) {\n  this.source = source;\n  this._e = e;\n  this._n = n;\n  ObservableBase.call(this);\n}\n\ninherits(LastIndexOfObservable, ObservableBase);\n\nLastIndexOfObservable.prototype.subscribeCore = function (o) {\n  if (this._n < 0) {\n    o.onNext(-1);\n    o.onCompleted();\n    return Disposable.empty;\n  }\n\n  return this.source.subscribe(new LastIndexOfObserver(o, this._e, this._n));\n};\n\nmodule.exports = function lastIndexOf (source, searchElement, fromIndex) {\n  var n = +fromIndex || 0;\n  Math.abs(n) === Infinity && (n = 0);\n  return new LastIndexOfObservable(source, searchElement, n);\n};\n"
  },
  {
    "path": "src/modular/observable/map.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar bindCallback = require('../internal/bindcallback');\nvar isFunction = require('../helpers/isfunction');\nvar inherits = require('inherits');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\n\nfunction MapObserver(o, selector, source) {\n  this._o = o;\n  this._fn = selector;\n  this._s = source;\n  this._i = 0;\n  AbstractObserver.call(this);\n}\n\ninherits(MapObserver, AbstractObserver);\n\nMapObserver.prototype.next = function(x) {\n  var result = tryCatch(this._fn)(x, this._i++, this._s);\n  if (result === errorObj) { return this._o.onError(result.e); }\n  this._o.onNext(result);\n};\n\nMapObserver.prototype.error = function (e) { this._o.onError(e); };\nMapObserver.prototype.completed = function () { this._o.onCompleted(); };\n\nfunction MapObservable(source, fn, thisArg) {\n  this.source = source;\n  this._fn = bindCallback(fn, thisArg, 3);\n  ObservableBase.call(this);\n}\n\ninherits(MapObservable, ObservableBase);\n\nfunction innerMap(fn, self) {\n  return function (x, i, o) { return fn.call(this, self._fn(x, i, o), i, o); };\n}\n\nMapObservable.prototype.internalMap = function (fn, thisArg) {\n  return new MapObservable(this.source, innerMap(fn, this), thisArg);\n};\n\nMapObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new MapObserver(o, this._fn, this));\n};\n\nmodule.exports = function map (source, fn, thisArg) {\n  var thisFn = isFunction(fn) ? fn : function () { return fn; };\n  return source instanceof MapObservable ?\n    source.internalMap(thisFn, thisArg) :\n    new MapObservable(source, thisFn, thisArg);\n};\n"
  },
  {
    "path": "src/modular/observable/materialize.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar Notification = require('../notification');\nvar inherits = require('inherits');\n\nfunction MaterializeObserver(o) {\n  this._o = o;\n  AbstractObserver.call(this);\n}\n\ninherits(MaterializeObserver, AbstractObserver);\n\nMaterializeObserver.prototype.next = function (x) { this._o.onNext(Notification.createOnNext(x)); };\nMaterializeObserver.prototype.error = function (e) { this._o.onNext(Notification.createOnError(e)); this._o.onCompleted(); };\nMaterializeObserver.prototype.completed = function () { this._o.onNext(Notification.createOnCompleted()); this._o.onCompleted(); };\n\nfunction MaterializeObservable(source) {\n  this.source = source;\n  ObservableBase.call(this);\n}\n\ninherits(MaterializeObservable, ObservableBase);\n\nMaterializeObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new MaterializeObserver(o));\n};\n\n/**\n *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n */\nmodule.exports = function materialize (source) {\n  return new MaterializeObservable(source);\n};\n"
  },
  {
    "path": "src/modular/observable/max.js",
    "content": "'use strict';\n\nvar maxBy = require('./maxby');\nvar firstOnly = require('./_firstonly');\nvar identity = require('../helpers/identity');\n\nmodule.exports = function max (source, comparer) {\n  return maxBy(source, identity, comparer).map(firstOnly);\n};\n"
  },
  {
    "path": "src/modular/observable/maxby.js",
    "content": "'use strict';\n\nvar ExtremaByObservable = require('./_extremabyobservable');\n\nfunction defaultComparer (x, y) {\n  return x > y ? 1 : y > x ? -1 : 0;\n}\n\nmodule.exports = function maxBy (source, keySelector, comparer) {\n  comparer || (comparer = defaultComparer);\n  return new ExtremaByObservable(source, keySelector, comparer);\n};\n"
  },
  {
    "path": "src/modular/observable/merge.js",
    "content": "'use strict';\n\nvar fromArray = require('./fromarray');\nvar mergeAll = require('./mergeall');\nvar Scheduler = require('../scheduler');\n\nmodule.exports = function merge() {\n  var scheduler, sources = [], i, len = arguments.length;\n  if (!arguments[0]) {\n    scheduler = Scheduler.immediate;\n    for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n  } else if (Scheduler.isScheduler(arguments[0])) {\n    scheduler = arguments[0];\n    for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n  } else {\n    scheduler = Scheduler.immediate;\n    for(i = 0; i < len; i++) { sources.push(arguments[i]); }\n  }\n  return mergeAll(fromArray(sources, scheduler));\n};\n"
  },
  {
    "path": "src/modular/observable/mergeall.js",
    "content": "'use strict';\n\nvar AbstractObserver = require('../observer/abstractobserver');\nvar ObservableBase = require('./observablebase');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar CompositeDisposable = require('../compositedisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar inherits = require('inherits');\n\nfunction InnerObserver(parent, sad) {\n  this._parent = parent;\n  this._sad = sad;\n  AbstractObserver.call(this);\n}\n\ninherits(InnerObserver, AbstractObserver);\n\nInnerObserver.prototype.next = function (x) { this._parent._o.onNext(x); };\nInnerObserver.prototype.error = function (e) { this._parent._o.onError(e); };\nInnerObserver.prototype.completed = function () {\n  this._parent._g.remove(this._sad);\n  this._parent._done && this._parent._g.length === 1 && this._parent._o.onCompleted();\n};\n\nfunction MergeAllObserver(o, g) {\n  this._o = o;\n  this._g = g;\n  this._done = false;\n  AbstractObserver.call(this);\n}\n\ninherits(MergeAllObserver, AbstractObserver);\n\nMergeAllObserver.prototype.next = function(innerSource) {\n  var sad = new SingleAssignmentDisposable();\n  this._g.add(sad);\n  isPromise(innerSource) && (innerSource = fromPromise(innerSource));\n  sad.setDisposable(innerSource.subscribe(new InnerObserver(this, sad)));\n};\nMergeAllObserver.prototype.error = function (e) { this._o.onError(e); };\nMergeAllObserver.prototype.completed = function () { this._done = true; this._g.length === 1 && this._o.onCompleted(); };\n\n\nfunction MergeAllObservable(source) {\n  this.source = source;\n  ObservableBase.call(this);\n}\n\ninherits(MergeAllObservable, ObservableBase);\n\nMergeAllObservable.prototype.subscribeCore = function (o) {\n  var g = new CompositeDisposable(), m = new SingleAssignmentDisposable();\n  g.add(m);\n  m.setDisposable(this.source.subscribe(new MergeAllObserver(o, g)));\n  return g;\n};\n\n/**\n* Merges an observable sequence of observable sequences into an observable sequence.\n* @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n*/\nmodule.exports = function mergeAll (sources) {\n  return new MergeAllObservable(sources);\n};\n"
  },
  {
    "path": "src/modular/observable/mergeconcat.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar CompositeDisposable = require('../compositedisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar inherits = require('inherits');\n\nfunction InnerObserver(parent, sad) {\n  this._p = parent;\n  this._sad = sad;\n  AbstractObserver.call(this);\n}\n\ninherits(InnerObserver, AbstractObserver);\n\nInnerObserver.prototype.next = function (x) { this._p._o.onNext(x); };\nInnerObserver.prototype.error = function (e) { this._p._o.onError(e); };\nInnerObserver.prototype.completed = function () {\n  this._p._g.remove(this._sad);\n  if (this._p._q.length > 0) {\n    this._p.handleSubscribe(this._p._q.shift());\n  } else {\n    this._p._activeCount--;\n    this._p._done && this._p._activeCount === 0 && this._p._o.onCompleted();\n  }\n};\n\nfunction MergeObserver(o, max, g) {\n  this._o = o;\n  this._max = max;\n  this._g = g;\n  this._done = false;\n  this._q = [];\n  this._activeCount = 0;\n  AbstractObserver.call(this);\n}\n\ninherits(MergeObserver, AbstractObserver);\n\nMergeObserver.prototype.handleSubscribe = function (xs) {\n  var sad = new SingleAssignmentDisposable();\n  this._g.add(sad);\n  isPromise(xs) && (xs = fromPromise(xs));\n  sad.setDisposable(xs.subscribe(new InnerObserver(this, sad)));\n};\n\nMergeObserver.prototype.next = function (innerSource) {\n  if(this._activeCount < this._max) {\n    this._activeCount++;\n    this.handleSubscribe(innerSource);\n  } else {\n    this._q.push(innerSource);\n  }\n};\nMergeObserver.prototype.error = function (e) { this._o.onError(e); };\nMergeObserver.prototype.completed = function () { this._done = true; this._activeCount === 0 && this._o.onCompleted(); };\n\n\nfunction MergeObservable(source, maxConcurrent) {\n  this.source = source;\n  this._maxConcurrent = maxConcurrent;\n  ObservableBase.call(this);\n}\n\ninherits(MergeObservable, ObservableBase);\n\nMergeObservable.prototype.subscribeCore = function(observer) {\n  var g = new CompositeDisposable();\n  g.add(this.source.subscribe(new MergeObserver(observer, this._maxConcurrent, g)));\n  return g;\n};\n\n/**\n* Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n* Or merges two observable sequences into a single observable sequence.\n* @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n* @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n*/\nmodule.exports = function mergeConcat (source, maxConcurrent) {\n  return new MergeObservable(source, maxConcurrent);\n};\n"
  },
  {
    "path": "src/modular/observable/mergedelayerror.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar fromArray = require('./fromarray');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar CompositeDisposable = require('../compositedisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar CompositeError = require('../internal/errors').CompositeError;\nvar inherits = require('inherits');\n\nfunction setCompletion(o, errors) {\n  if (errors.length === 0) {\n    o.onCompleted();\n  } else if (errors.length === 1) {\n    o.onError(errors[0]);\n  } else {\n    o.onError(new CompositeError(errors));\n  }\n}\n\nfunction InnerObserver(inner, group, state) {\n  this._inner = inner;\n  this._group = group;\n  this._state = state;\n  AbstractObserver.call(this);\n}\n\ninherits(InnerObserver, AbstractObserver);\n\nInnerObserver.prototype.next = function (x) { this._state.o.onNext(x); };\nInnerObserver.prototype.error = function (e) {\n  this._state.errors.push(e);\n  this._group.remove(this._inner);\n  this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n};\nInnerObserver.prototype.completed = function () {\n  this._group.remove(this._inner);\n  this._state.isStopped && this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n};\n\nfunction MergeDelayErrorObserver(group, state) {\n  this._group = group;\n  this._state = state;\n  AbstractObserver.call(this);\n}\n\ninherits(MergeDelayErrorObserver, AbstractObserver);\n\nMergeDelayErrorObserver.prototype.next = function (x) {\n  var inner = new SingleAssignmentDisposable();\n  this._group.add(inner);\n\n  // Check for promises support\n  isPromise(x) && (x = fromPromise(x));\n  inner.setDisposable(x.subscribe(new InnerObserver(inner, this._group, this._state)));\n};\n\nMergeDelayErrorObserver.prototype.error = function (e) {\n  this._state.errors.push(e);\n  this._state.isStopped = true;\n  this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n};\n\nMergeDelayErrorObserver.prototype.completed = function () {\n  this._state.isStopped = true;\n  this._group.length === 1 && setCompletion(this._state.o, this._state.errors);\n};\n\nfunction MergeDelayErrorObservable(source) {\n  this.source = source;\n  ObservableBase.call(this);\n}\n\ninherits(MergeDelayErrorObservable, ObservableBase);\n\nMergeDelayErrorObservable.prototype.subscribeCore = function (o) {\n  var group = new CompositeDisposable(),\n    m = new SingleAssignmentDisposable(),\n    state = { isStopped: false, errors: [], o: o };\n\n  group.add(m);\n  m.setDisposable(this.source.subscribe(new MergeDelayErrorObserver(group, state)));\n\n  return group;\n};\n\n/**\n* Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n* receive all successfully emitted items from all of the source Observables without being interrupted by\n* an error notification from one of them.\n*\n* This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n* error via the Observer's onError, mergeDelayError will refrain from propagating that\n* error notification until all of the merged Observables have finished emitting items.\n* @param {Array | Arguments} args Arguments or an array to merge.\n* @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n*/\nmodule.exports = function mergeDelayError()  {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return new MergeDelayErrorObservable(fromArray(args));\n};\n"
  },
  {
    "path": "src/modular/observable/min.js",
    "content": "'use strict';\n\nvar minBy = require('./minby');\nvar firstOnly = require('./_firstonly');\nvar identity = require('../helpers/identity');\n\nmodule.exports = function min (source, comparer) {\n  return minBy(source, identity, comparer).map(firstOnly);\n};\n"
  },
  {
    "path": "src/modular/observable/minby.js",
    "content": "'use strict';\n\nvar ExtremaByObservable = require('./_extremabyobservable');\n\nfunction defaultComparer (x, y) {\n  return x > y ? 1 : y > x ? -1 : 0;\n}\n\nfunction minByFn(comparer) {\n  return function (x, y) { return comparer(x, y) * -1; };\n}\n\nmodule.exports = function minBy (source, keySelector, comparer) {\n  comparer || (comparer = defaultComparer);\n  return new ExtremaByObservable(source, keySelector, minByFn(comparer));\n};\n"
  },
  {
    "path": "src/modular/observable/multicast.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar ConnectableObservable = require('./connectableobservable');\nvar BinaryDisposable = require('../binarydisposable');\nvar isFunction = require('../helpers/isfunction');\nvar inherits = require('inherits');\n\nfunction MulticastObservable(source, fn1, fn2) {\n  this.source = source;\n  this._fn1 = fn1;\n  this._fn2 = fn2;\n  ObservableBase.call(this);\n}\n\ninherits(MulticastObservable, ObservableBase);\n\nMulticastObservable.prototype.subscribeCore = function (o) {\n  var connectable = this.source.multicast(this._fn1());\n  return new BinaryDisposable(this._fn2(connectable).subscribe(o), connectable.connect());\n};\n\n/**\n * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n * @param {Function|Subject} subjectOrSubjectSelector\n * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n * Or:\n * Subject to push source elements into.\n *\n * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n */\nmodule.exports = function multicast (source, subjectOrSubjectSelector, selector) {\n  return isFunction(subjectOrSubjectSelector) ?\n    new MulticastObservable(source, subjectOrSubjectSelector, selector) :\n    new ConnectableObservable(source, subjectOrSubjectSelector);\n};\n"
  },
  {
    "path": "src/modular/observable/never.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar Disposable = require('../disposable');\nvar inherits = require('inherits');\n\nfunction NeverObservable() {\n  ObservableBase.call(this);\n}\n\ninherits(NeverObservable, ObservableBase);\n\nNeverObservable.prototype.subscribeCore = function () {\n  return Disposable.empty;\n};\n\nvar NEVER_OBSERVABLE = new NeverObservable();\n\n/**\n * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n * @returns {Observable} An observable sequence whose observers will never get called.\n */\nmodule.exports = function never () {\n  return NEVER_OBSERVABLE;\n};\n"
  },
  {
    "path": "src/modular/observable/observablebase.js",
    "content": "'use strict';\n\nvar inherits = require('inherits');\nvar isFunction = require('../helpers/isfunction');\nvar errors = require('../internal/errors');\nvar Observable  = require('../observable');\nvar Scheduler = require('../scheduler');\nvar Disposable = require('../disposable');\nvar AutoDetachObserver = require('../observer/autodetachobserver');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj, thrower = tryCatchUtils.thrower;\n\nfunction fixSubscriber(subscriber) {\n  return subscriber && isFunction(subscriber.dispose) ? subscriber :\n    isFunction(subscriber) ? Disposable.create(subscriber) : Disposable.empty;\n}\n\nfunction setDisposable(s, state) {\n  var ado = state[0], self = state[1];\n  var sub = tryCatch(self.subscribeCore).call(self, ado);\n  if (sub === errorObj && !ado.fail(sub.e)) { thrower(sub.e); }\n  ado.setDisposable(fixSubscriber(sub));\n}\n\nfunction ObservableBase () {\n  Observable.call(this);\n}\n\ninherits(ObservableBase, Observable);\n\nObservableBase.prototype._subscribe = function (o) {\n  var ado = new AutoDetachObserver(o), state = [ado, this];\n\n  if (Scheduler.queue.scheduleRequired()) {\n    Scheduler.queue.schedule(state, setDisposable);\n  } else {\n    setDisposable(null, state);\n  }\n  return ado;\n};\n\nObservableBase.prototype.subscribeCore = function () {\n  throw new errors.NotImplementedError();\n};\n\nmodule.exports = ObservableBase;\n"
  },
  {
    "path": "src/modular/observable/observeon.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar ObserveOnObserver = require('../observer/observeonobserver');\nvar inherits = require('inherits');\n\nfunction ObserveOnObservable(source, s) {\n  this.source = source;\n  this._s = s;\n  ObservableBase.call(this);\n}\n\ninherits(ObserveOnObservable, ObservableBase);\n\nObserveOnObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new ObserveOnObserver(this._s, o));\n};\n\nmodule.exports = function observeOn (source, scheduler) {\n  return new ObserveOnObservable(source, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/of.js",
    "content": "'use strict';\n\nvar fromArray = require('./fromarray');\n\nmodule.exports = function () {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return fromArray(args);\n};\n"
  },
  {
    "path": "src/modular/observable/ofscheduled.js",
    "content": "'use strict';\n\nvar fromArray = require('./fromarray');\n\n/**\n*  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n* @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n* @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n*/\nmodule.exports = function ofscheduled() {\n  var len = arguments.length, args = new Array(len - 1), scheduler = arguments[0];\n  for(var i = 1; i < len; i++) { args[i - 1] = arguments[i]; }\n  return fromArray(args, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/onerrorresumenext.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar Scheduler = require('../scheduler');\nvar BinaryDisposable = require('../binarydisposable');\nvar SerialDisposable = require('../serialdisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar inherits = require('inherits');\n\nfunction OnErrorResumeNextObserver(state, recurse) {\n  this._state = state;\n  this._recurse = recurse;\n  AbstractObserver.call(this);\n}\n\ninherits(OnErrorResumeNextObserver, AbstractObserver);\n\nOnErrorResumeNextObserver.prototype.next = function (x) { this._state.o.onNext(x); };\nOnErrorResumeNextObserver.prototype.error = function () { this._recurse(this._state); };\nOnErrorResumeNextObserver.prototype.completed = function () { this._recurse(this._state); };\n\nfunction OnErrorResumeNextObservable(sources) {\n  this.sources = sources;\n  ObservableBase.call(this);\n}\n\ninherits(OnErrorResumeNextObservable, ObservableBase);\n\nfunction scheduleMethod(state, recurse) {\n  if (state.pos < state.sources.length) {\n    var current = state.sources[state.pos++];\n    isPromise(current) && (current = fromPromise(current));\n    var d = new SingleAssignmentDisposable();\n    state.subscription.setDisposable(d);\n    d.setDisposable(current.subscribe(new OnErrorResumeNextObserver(state, recurse)));\n  } else {\n    state.o.onCompleted();\n  }\n}\n\nOnErrorResumeNextObservable.prototype.subscribeCore = function (o) {\n  var subscription = new SerialDisposable(),\n    state = {\n      pos: 0,\n      subscription: subscription,\n      o: o,\n      sources: this.sources\n    },\n    cancellable = Scheduler.immediate.scheduleRecursive(state, scheduleMethod);\n  return new BinaryDisposable(subscription, cancellable);\n};\n\n/**\n * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n */\nmodule.exports = function onErrorResumeNext () {\n  var len = arguments.length, sources = new Array(len);\n  for(var i = 0; i < len; i++) { sources[i] = arguments[i]; }\n  return new OnErrorResumeNextObservable(sources);\n};\n"
  },
  {
    "path": "src/modular/observable/pairs.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction scheduleMethod(o, obj, keys) {\n  return function loopRecursive(i, recurse) {\n    if (i < keys.length) {\n      var key = keys[i];\n      o.onNext([key, obj[key]]);\n      recurse(i + 1);\n    } else {\n      o.onCompleted();\n    }\n  };\n}\n\nfunction PairsObservable(o, scheduler) {\n  this._o = o;\n  this._keys = Object.keys(o);\n  this._scheduler = scheduler;\n  ObservableBase.call(this);\n}\n\ninherits(PairsObservable, ObservableBase);\n\nPairsObservable.prototype.subscribeCore = function (o) {\n  return this._scheduler.scheduleRecursive(0, scheduleMethod(o, this._o, this._keys));\n};\n\nmodule.exports = function pairs(obj, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.queue);\n  return new PairsObservable(obj, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/pairwise.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar inherits = require('inherits');\n\nfunction PairwiseObserver(o) {\n  this._o = o;\n  this._p = null;\n  this._hp = false;\n  AbstractObserver.call(this);\n}\n\ninherits(PairwiseObserver, AbstractObserver);\n\nPairwiseObserver.prototype.next = function (x) {\n  if (this._hp) {\n    this._o.onNext([this._p, x]);\n  } else {\n    this._hp = true;\n  }\n  this._p = x;\n};\nPairwiseObserver.prototype.error = function (err) { this._o.onError(err); };\nPairwiseObserver.prototype.completed = function () { this._o.onCompleted(); };\n\nfunction PairwiseObservable(source) {\n  this.source = source;\n  ObservableBase.call(this);\n}\n\ninherits(PairwiseObservable, ObservableBase);\n\nPairwiseObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new PairwiseObserver(o));\n};\n\nmodule.exports = function pairwise (source) {\n  return new PairwiseObservable(source);\n};\n"
  },
  {
    "path": "src/modular/observable/partition.js",
    "content": "'use strict';\n\nvar filter = require('./filter');\nvar bindCallback = require('../internal/bindcallback');\n\nmodule.exports = function partition (source, predicate, thisArg) {\n  var fn = bindCallback(predicate, thisArg, 3);\n  return [\n    filter(source, predicate, thisArg),\n    filter(source, function (x, i, o) { return !fn(x, i, o); })\n  ];\n};\n"
  },
  {
    "path": "src/modular/observable/pausable.js",
    "content": "'use strict';\n\nvar Observable = require('../observable');\nvar distinctUntilChanged = require('./distinctuntilchanged');\nvar merge = require('./merge');\nvar publish = require('./publish');\nvar startWith = require('./startwith');\nvar Subject = require('../subject');\nvar Disposable = require('../disposable');\nvar NAryDisposable = require('../narydisposable');\nvar inherits = require('inherits');\n\nfunction PausableObservable(source, pauser) {\n  this.source = source;\n  this.controller = new Subject();\n\n  if (pauser && pauser.subscribe) {\n    this.pauser = merge(this.controller, pauser);\n  } else {\n    this.pauser = this.controller;\n  }\n\n  Observable.call(this);\n}\n\ninherits(PausableObservable, Observable);\n\nPausableObservable.prototype._subscribe = function (o) {\n  var conn = publish(this.source),\n    subscription = conn.subscribe(o),\n    connection = Disposable.empty;\n\n  var pausable = startWith(distinctUntilChanged(this.pauser), !this.paused).subscribe(function (b) {\n    if (b) {\n      connection = conn.connect();\n    } else {\n      connection.dispose();\n      connection = Disposable.empty;\n    }\n  });\n\n  return new NAryDisposable([subscription, connection, pausable]);\n};\n\nPausableObservable.prototype.pause = function () {\n  this.controller.onNext(false);\n};\n\nPausableObservable.prototype.resume = function () {\n  this.controller.onNext(true);\n};\n\nmodule.exports = function pausable (source, pauser) {\n  return new PausableObservable(source, pauser);\n};\n"
  },
  {
    "path": "src/modular/observable/pausablebuffered.js",
    "content": "'use strict';\n\nvar Observable = require('../observable');\nvar ObservableBase = require('./observablebase');\nvar distinctUntilChanged = require('./distinctuntilchanged');\nvar merge = require('./merge');\nvar startWith = require('./startwith');\nvar Subject = require('../subject');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar BinaryDisposable = require('../binarydisposable');\nvar identity = require('../helpers/identity');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction next(state, x, i) {\n  state.values[i] = x;\n  state.hasValue[i] = true;\n  if (state.hasValueAll || (state.hasValueAll = state.hasValue.every(identity))) {\n    if (state.err) { return state.o.onError(state.err); }\n    var res = tryCatch(state.fn).apply(null, state.values);\n    if (res === errorObj) { return state.o.onError(res.e); }\n    state.o.onNext(res);\n  }\n  state.isDone && state.values[1] && state.o.onCompleted();\n}\n\nfunction SourceObserver(state) {\n  this._s = state;\n  AbstractObserver.call(this);\n}\n\ninherits(SourceObserver, AbstractObserver);\n\nSourceObserver.prototype.next = function (x) { next(this._s, x, 0); };\nSourceObserver.prototype.error = function (e) {\n  if (this._s.values[1]) {\n    this._s.o.onError(e);\n  } else {\n    this._s.err = e;\n  }\n};\nSourceObserver.prototype.completed = function () {\n  this._s.isDone = true;\n  this._s.values[1] && this._s.o.onCompleted();\n};\n\nfunction SubjectObserver(state) {\n  this._s = state;\n  AbstractObserver.call(this);\n}\n\ninherits(SubjectObserver, AbstractObserver);\n\nSubjectObserver.prototype.next = function (x) { next(this._s, x, 1); };\nSubjectObserver.prototype.error = function (e) { this._s.o.onError(e); };\nSubjectObserver.prototype.completed = function () {\n  this._s.isDone = true;\n  next(this._s, true, 1);\n};\n\nfunction CombineLatestObservable(source, subject, fn) {\n  this.source = source;\n  this.subject = subject;\n  this.fn = fn;\n  ObservableBase.call(this);\n}\n\ninherits(CombineLatestObservable, ObservableBase);\n\nCombineLatestObservable.prototype.subscribeCore = function (o) {\n  var state = {\n    hasValue: [false, false],\n    hasValueAll: false,\n    isDone: false,\n    values: new Array(2),\n    err: null,\n    o: o,\n    fn: this.fn\n  };\n\n  return new BinaryDisposable(\n    this.source.subscribe(new SourceObserver(state)),\n    this.subject.subscribe(new SubjectObserver(state))\n  );\n};\n\nfunction combineLatestSource(source, subject, fn) {\n  return new CombineLatestObservable(source, subject, fn);\n}\n\nfunction PausableBufferedObserver(o) {\n  this._o = o;\n  this._q = [];\n  this._previousShouldFire = null;\n  AbstractObserver.call(this);\n}\n\ninherits(PausableBufferedObserver, AbstractObserver);\n\nPausableBufferedObserver.prototype.drainQueue = function () {\n  while (this._q.length > 0) { this._o.onNext(this._q.shift()); }\n};\n\nPausableBufferedObserver.prototype.next = function (x) {\n  if (this._previousShouldFire !== null && x.shouldFire !== this._previousShouldFire) {\n    this._previousShouldFire = x.shouldFire;\n    // change in shouldFire\n    if (x.shouldFire) { this.drainQueue(); }\n  } else {\n    this._previousShouldFire = x.shouldFire;\n    // new data\n    if (x.shouldFire) {\n      this._o.onNext(x.data);\n    } else {\n      this._q.push(x.data);\n    }\n  }\n};\n\nPausableBufferedObserver.prototype.error = function (e) {\n  this.drainQueue();\n  this._o.onError(e);\n};\n\nPausableBufferedObserver.prototype.completed = function () {\n  this.drainQueue();\n  this._o.onCompleted();\n};\n\nfunction PausableBufferedObservable(source, pauser) {\n  this.source = source;\n  this.controller = new Subject();\n  this.paused = true;\n\n  if (pauser && pauser.subscribe) {\n    this.pauser = merge(this.controller, pauser);\n  } else {\n    this.pauser = this.controller;\n  }\n\n  Observable.call(this);\n}\n\ninherits(PausableBufferedObservable, Observable);\n\nfunction selectorFn(data, shouldFire) {\n  return { data: data, shouldFire: shouldFire };\n}\n\nPausableBufferedObservable.prototype._subscribe = function (o) {\n\n  return combineLatestSource(\n      this.source,\n      distinctUntilChanged(startWith(this.pauser, !this.paused)),\n      selectorFn)\n    .subscribe(new PausableBufferedObserver(o));\n};\n\nPausableBufferedObservable.prototype.pause = function () {\n  this.controller.onNext(false);\n  this.paused = true;\n};\n\nPausableBufferedObservable.prototype.resume = function () {\n  this.controller.onNext(true);\n  this.paused = false;\n};\n\nmodule.exports = function pausableBuffered (source, pauser) {\n  return new PausableBufferedObservable(source, pauser);\n};\n"
  },
  {
    "path": "src/modular/observable/pluck.js",
    "content": "'use strict';\n\nvar map = require('./map');\n\nfunction plucker(args, len) {\n  return function mapper(x) {\n    var currentProp = x;\n    for (var i = 0; i < len; i++) {\n      var p = currentProp[args[i]];\n      if (typeof p !== 'undefined') {\n        currentProp = p;\n      } else {\n        return undefined;\n      }\n    }\n    return currentProp;\n  };\n}\n\n/**\n * Retrieves the value of a specified nested property from all elements in\n * the Observable sequence.\n * @param {Arguments} arguments The nested properties to pluck.\n * @returns {Observable} Returns a new Observable sequence of property values.\n */\nmodule.exports = function pluck() {\n  var len = arguments.length, args = new Array(len);\n  if (len === 0) { throw new Error('List of properties cannot be empty.'); }\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  var pluckedArgs = args.slice(1);\n  return map(args[0], plucker(pluckedArgs, pluckedArgs.length));\n};\n"
  },
  {
    "path": "src/modular/observable/publish.js",
    "content": "'use strict';\n\nvar Subject = require('../subject');\nvar multicast = require('./multicast');\nvar isFunction = require('../helpers/isfunction');\n\n/**\n * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n * This operator is a specialization of Multicast using a regular Subject.\n * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n */\nmodule.exports = function publish (source, fn) {\n  return fn && isFunction(fn) ?\n    multicast(source, function () { return new Subject(); }, fn) :\n    multicast(source, new Subject());\n};\n"
  },
  {
    "path": "src/modular/observable/publishlast.js",
    "content": "'use strict';\n\nvar AsyncSubject = require('../asyncsubject');\nvar multicast = require('./multicast');\nvar isFunction = require('../helpers/isfunction');\n\nmodule.exports = function publishLast (source, selector) {\n  return isFunction(selector) ?\n    multicast(source, function () { return new AsyncSubject(); }, selector) :\n    multicast(source, new AsyncSubject());\n};\n"
  },
  {
    "path": "src/modular/observable/publishvalue.js",
    "content": "'use strict';\n\nvar multicast = require('./multicast');\nvar BehaviorSubject = require('../behaviorsubject');\n\nfunction createBehaviorSubject(initialValue) {\n  return function fn() { return new BehaviorSubject(initialValue); };\n}\n\nmodule.exports = function publishValue() {\n  var source = arguments[0];\n  if (arguments.length === 3) {\n    return multicast(source, createBehaviorSubject(arguments[2]), arguments[1]);\n  } else if (arguments.length === 2) {\n    return multicast(source, new BehaviorSubject(arguments[1]));\n  } else {\n    throw new Error('Invalid arguments');\n  }\n};\n"
  },
  {
    "path": "src/modular/observable/race.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar BinaryDisposable = require('../binarydisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar never = require('./never');\nvar inherits = require('inherits');\n\nvar LEFT_CHOICE = 'L';\nvar RIGHT_CHOICE = 'R';\n\nfunction choiceL(state) {\n  if (!state.choice) {\n    state.choice = LEFT_CHOICE;\n    state.rightSubscription.dispose();\n  }\n}\n\nfunction choiceR(state) {\n  if (!state.choice) {\n    state.choice = RIGHT_CHOICE;\n    state.leftSubscription.dispose();\n  }\n}\n\nfunction LeftObserver(o, state) {\n  this._o = o;\n  this._s = state;\n  AbstractObserver.call(this);\n}\n\ninherits(LeftObserver, AbstractObserver);\n\nLeftObserver.prototype.next = function (x) {\n  choiceL(this._s);\n  this._s.choice === LEFT_CHOICE && this._o.onNext(x);\n};\n\nLeftObserver.prototype.error = function (e) {\n  choiceL(this._s);\n  this._s.choice === LEFT_CHOICE && this._o.onError(e);\n};\n\nLeftObserver.prototype.completed = function () {\n  choiceL(this._s);\n  this._s.choice === LEFT_CHOICE && this._o.onCompleted();\n};\n\nfunction RightObserver(o, state) {\n  this._o = o;\n  this._s = state;\n  AbstractObserver.call(this);\n}\n\ninherits(RightObserver, AbstractObserver);\n\nRightObserver.prototype.next = function (x) {\n  choiceR(this._s);\n  this._s.choice === RIGHT_CHOICE && this._o.onNext(x);\n};\n\nRightObserver.prototype.error = function (e) {\n  choiceR(this._s);\n  this._s.choice === RIGHT_CHOICE && this._o.onError(e);\n};\n\nRightObserver.prototype.completed = function () {\n  choiceR(this._s);\n  this._s.choice === RIGHT_CHOICE && this._o.onCompleted();\n};\n\nfunction AmbObservable (leftSource, rightSource) {\n  isPromise(leftSource) && (leftSource = fromPromise(leftSource));\n  isPromise(rightSource) && (rightSource = fromPromise(rightSource));\n\n  this._l = leftSource;\n  this._r = rightSource;\n  ObservableBase.call(this);\n}\n\ninherits(AmbObservable, ObservableBase);\n\nAmbObservable.prototype.subscribeCore = function (o) {\n  var state = {\n    choice: null,\n    leftSubscription: new SingleAssignmentDisposable(),\n    rightSubscription: new SingleAssignmentDisposable()\n  };\n\n  state.leftSubscription.setDisposable(this._l.subscribe(new LeftObserver(o, state)));\n  state.rightSubscription.setDisposable(this._r.subscribe(new RightObserver(o, state)));\n\n  return new BinaryDisposable(state.leftSubscription, state.rightSubscription);\n};\n\n/**\n * Propagates the observable sequence or Promise that reacts first.\n * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n */\nmodule.exports = function amb() {\n  var acc = never();\n  for (var i = 0, len = arguments.length; i < len; i++) { acc = new AmbObservable(acc, arguments[i]); }\n  return acc;\n};\n"
  },
  {
    "path": "src/modular/observable/range.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction RangeObservable(start, count, scheduler) {\n  this.start = start;\n  this.rangeCount = count;\n  this.scheduler = scheduler;\n  ObservableBase.call(this);\n}\n\ninherits(RangeObservable, ObservableBase);\n\nfunction loopRecursive(start, count, o) {\n  return function loop (i, recurse) {\n    if (i < count) {\n      o.onNext(start + i);\n      recurse(i + 1);\n    } else {\n      o.onCompleted();\n    }\n  };\n}\n\nRangeObservable.prototype.subscribeCore = function (o) {\n  return this.scheduler.scheduleRecursive(\n    0,\n    loopRecursive(this.start, this.rangeCount, o)\n  );\n};\n\n/**\n*  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n* @param {Number} start The value of the first integer in the sequence.\n* @param {Number} count The number of sequential integers to generate.\n* @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n* @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n*/\nmodule.exports = function range(start, count, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.queue);\n  return new RangeObservable(start, count, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/reduce.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar inherits = require('inherits');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar EmptyError = require('../internal/errors').EmptyError;\n\nfunction ReduceObserver(o, parent) {\n  this._o = o;\n  this._p = parent;\n  this._fn = parent.accumulator;\n  this._hs = parent.hasSeed;\n  this._s = parent.seed;\n  this._ha = false;\n  this._a = null;\n  this._hv = false;\n  this._i = 0;\n  AbstractObserver.call(this);\n}\n\ninherits(ReduceObserver, AbstractObserver);\n\nReduceObserver.prototype.next = function (x) {\n  !this._hv && (this._hv = true);\n  if (this._ha) {\n    this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n  } else {\n    this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n    this._ha = true;\n  }\n  if (this._a === errorObj) { return this._o.onError(this._a.e); }\n  this._i++;\n};\n\nReduceObserver.prototype.error = function (e) { this._o.onError(e); };\n\nReduceObserver.prototype.completed = function () {\n  this._hv && this._o.onNext(this._a);\n  !this._hv && this._hs && this._o.onNext(this._s);\n  !this._hv && !this._hs && this._o.onError(new EmptyError());\n  this._o.onCompleted();\n};\n\nfunction ReduceObservable(source, accumulator, hasSeed, seed) {\n  this.source = source;\n  this.accumulator = accumulator;\n  this.hasSeed = hasSeed;\n  this.seed = seed;\n  ObservableBase.call(this);\n}\n\ninherits(ReduceObservable, ObservableBase);\n\nReduceObservable.prototype.subscribeCore = function(observer) {\n  return this.source.subscribe(new ReduceObserver(observer,this));\n};\n\n/**\n* Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n* For aggregation behavior with incremental intermediate results, see Observable.scan.\n* @param {Function} accumulator An accumulator function to be invoked on each element.\n* @param {Any} [seed] The initial accumulator value.\n* @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n*/\nmodule.exports = function reduce () {\n  var hasSeed = false, seed, source = arguments[0], accumulator = arguments[1];\n  if (arguments.length === 3) {\n    hasSeed = true;\n    seed = arguments[2];\n  }\n  return new ReduceObservable(source, accumulator, hasSeed, seed);\n};\n"
  },
  {
    "path": "src/modular/observable/repeat.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar Scheduler = require('../scheduler');\nvar NAryDisposable = require('../narydisposable');\nvar SerialDisposable = require('../serialdisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar inherits = require('inherits');\n\nvar $iterator$ = '@@iterator';\n\nfunction repeatValue(value, count) {\n  count == null && (count = -1);\n  return {\n    '@@iterator': function () {\n      return {\n        remaining: count,\n        next: function () {\n          if (this.remaining === 0) { return { done: true, value: undefined }; }\n          if (this.remaining > 0) { this.remaining--; }\n          return { done: false, value: value };\n        }\n      };\n    }\n  };\n}\n\nfunction createDisposable(state) {\n  return {\n    isDisposed: false,\n    dispose: function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        state.isDisposed = true;\n      }\n    }\n  };\n}\n\nfunction ConcatObserver(state, recurse) {\n  this._state = state;\n  this._recurse = recurse;\n  AbstractObserver.call(this);\n}\n\ninherits(ConcatObserver, AbstractObserver);\n\nConcatObserver.prototype.next = function (x) { this._state.o.onNext(x); };\nConcatObserver.prototype.error = function (e) { this._state.o.onError(e); };\nConcatObserver.prototype.completed = function () { this._recurse(this._state); };\n\nfunction ConcatObservable(sources) {\n  this.sources = sources;\n  ObservableBase.call(this);\n}\n\ninherits(ConcatObservable, ObservableBase);\n\nfunction scheduleMethod(state, recurse) {\n  if (state.isDisposed) { return; }\n  var currentItem = state.e.next();\n  if (currentItem.done) { return state.o.onCompleted(); }\n\n  // Check if promise\n  var currentValue = currentItem.value;\n  isPromise(currentValue) && (currentValue = fromPromise(currentValue));\n\n  var d = new SingleAssignmentDisposable();\n  state.subscription.setDisposable(d);\n  d.setDisposable(currentValue.subscribe(new ConcatObserver(state, recurse)));\n}\n\nConcatObservable.prototype.subscribeCore = function (o) {\n  var subscription = new SerialDisposable();\n  var state = {\n    isDisposed: false,\n    o: o,\n    subscription: subscription,\n    e: this.sources[$iterator$]()\n  };\n\n  var cancelable = Scheduler.queue.scheduleRecursive(state, scheduleMethod);\n  return new NAryDisposable([subscription, cancelable, createDisposable(state)]);\n};\n\nmodule.exports = function repeat(source, repeatCount) {\n  return new ConcatObservable(repeatValue(source, repeatCount));\n};\n"
  },
  {
    "path": "src/modular/observable/repeatvalue.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction RepeatValueObservable(value, count, scheduler) {\n  this._value = value;\n  this._count = count;\n  this._scheduler = scheduler;\n  ObservableBase.call(this);\n}\n\ninherits(RepeatValueObservable, ObservableBase);\n\nfunction scheduleRecursive(state, recurse) {\n  if (state.n === 0) { return state.o.onCompleted(); }\n  if (state.n > 0) { state.n--; }\n  state.o.onNext(state.value);\n  recurse(state);\n}\n\nRepeatValueObservable.prototype.subscribeCore = function (o) {\n  var state = {\n    value: this._value,\n    n: this._count,\n    o: o\n  };\n  return this._scheduler.scheduleRecursive(state, scheduleRecursive);\n};\n\nmodule.exports = function repeatValue (value, repeatCount, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.queue);\n  return new RepeatValueObservable(value, repeatCount, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/repeatwhen.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar Subject = require('../subject');\nvar Scheduler = require('../scheduler');\nvar BinaryDisposable = require('../binarydisposable');\nvar NAryDisposable = require('../narydisposable');\nvar SerialDisposable = require('../serialdisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar inherits = require('inherits');\n\nvar $iterator$ = '@@iterator';\n\nfunction repeat(value) {\n  return {\n    '@@iterator': function () {\n      return {\n        next: function () {\n          return { done: false, value: value };\n        }\n      };\n    }\n  };\n}\n\nfunction createDisposable(state) {\n  return {\n    isDisposed: false,\n    dispose: function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        state.isDisposed = true;\n      }\n    }\n  };\n}\n\nfunction RepeatWhenObservable(source, notifier) {\n  this.source = source;\n  this._notifier = notifier;\n  ObservableBase.call(this);\n}\n\ninherits(RepeatWhenObservable, ObservableBase);\n\nRepeatWhenObservable.prototype.subscribeCore = function (o) {\n  var completions = new Subject(),\n    notifier = new Subject(),\n    handled = this._notifier(completions),\n    notificationDisposable = handled.subscribe(notifier);\n\n  var e = this.source[$iterator$]();\n\n  var state = { isDisposed: false },\n    lastError,\n    subscription = new SerialDisposable();\n  var cancelable = Scheduler.queue.scheduleRecursive(null, function (_, recurse) {\n    if (state.isDisposed) { return; }\n    var currentItem = e.next();\n\n    if (currentItem.done) {\n      if (lastError) {\n        o.onError(lastError);\n      } else {\n        o.onCompleted();\n      }\n      return;\n    }\n\n    // Check if promise\n    var currentValue = currentItem.value;\n    isPromise(currentValue) && (currentValue = fromPromise(currentValue));\n\n    var outer = new SingleAssignmentDisposable();\n    var inner = new SingleAssignmentDisposable();\n    subscription.setDisposable(new BinaryDisposable(inner, outer));\n    outer.setDisposable(currentValue.subscribe(\n      function(x) { o.onNext(x); },\n      function (exn) { o.onError(exn); },\n      function() {\n        inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n          o.onError(ex);\n        }, function() {\n          o.onCompleted();\n        }));\n\n        completions.onNext(null);\n        outer.dispose();\n      }));\n  });\n\n  return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n};\n\nmodule.exports = function repeatWhen (source, notifier) {\n  return new RepeatWhenObservable(repeat(source), notifier);\n};\n"
  },
  {
    "path": "src/modular/observable/replay.js",
    "content": "'use strict';\n\nvar multicast = require('./multicast');\nvar ReplaySubject = require('../replaysubject');\nvar isFunction = require('../helpers/isfunction');\n\nmodule.exports = function replay (source, selector, bufferSize, windowSize, scheduler) {\n  return isFunction(selector) ?\n    multicast(source, function () { return new ReplaySubject(bufferSize, windowSize, scheduler); }, selector) :\n    multicast(source, new ReplaySubject(bufferSize, windowSize, scheduler));\n};\n"
  },
  {
    "path": "src/modular/observable/retry.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar Scheduler = require('../scheduler');\nvar NAryDisposable = require('../narydisposable');\nvar SerialDisposable = require('../serialdisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar inherits = require('inherits');\n\nvar $iterator$ = '@@iterator';\n\nfunction repeat(value, count) {\n  count == null && (count = -1);\n  return {\n    '@@iterator': function () {\n      return {\n        remaining: count,\n        next: function () {\n          if (this.remaining === 0) { return { done: true, value: undefined }; }\n          if (this.remaining > 0) { this.remaining--; }\n          return { done: false, value: value };\n        }\n      };\n    }\n  };\n}\n\nfunction CatchErrorObserver(state, recurse) {\n  this._state = state;\n  this._recurse = recurse;\n  AbstractObserver.call(this);\n}\n\ninherits(CatchErrorObserver, AbstractObserver);\n\nCatchErrorObserver.prototype.next = function (x) { this._state.o.onNext(x); };\nCatchErrorObserver.prototype.error = function (e) { this._state.lastError = e; this._recurse(this._state); };\nCatchErrorObserver.prototype.completed = function () { this._state.o.onCompleted(); };\n\nfunction createDisposable(state) {\n  return {\n    isDisposed: false,\n    dispose: function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        state.isDisposed = true;\n      }\n    }\n  };\n}\n\nfunction CatchErrorObservable(sources) {\n  this.sources = sources;\n  ObservableBase.call(this);\n}\n\ninherits(CatchErrorObservable, ObservableBase);\n\nfunction scheduleMethod(state, recurse) {\n  if (state.isDisposed) { return; }\n  var currentItem = state.e.next();\n  if (currentItem.done) { return state.lastError !== null ? state.o.onError(state.lastError) : state.o.onCompleted(); }\n\n  var currentValue = currentItem.value;\n  isPromise(currentValue) && (currentValue = fromPromise(currentValue));\n\n  var d = new SingleAssignmentDisposable();\n  state.subscription.setDisposable(d);\n  d.setDisposable(currentValue.subscribe(new CatchErrorObserver(state, recurse)));\n}\n\nCatchErrorObservable.prototype.subscribeCore = function (o) {\n  var subscription = new SerialDisposable();\n  var state = {\n    isDisposed: false,\n    e: this.sources[$iterator$](),\n    subscription: subscription,\n    lastError: null,\n    o: o\n  };\n\n  var cancelable = Scheduler.queue.scheduleRecursive(state, scheduleMethod);\n  return new NAryDisposable([subscription, cancelable, createDisposable(state)]);\n};\n\nmodule.exports = function retry(source, retryCount) {\n  return new CatchErrorObservable(repeat(source, retryCount));\n};\n"
  },
  {
    "path": "src/modular/observable/retrywhen.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar Subject = require('../subject');\nvar Scheduler = require('../scheduler');\nvar BinaryDisposable = require('../binarydisposable');\nvar NAryDisposable = require('../narydisposable');\nvar SerialDisposable = require('../serialdisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar inherits = require('inherits');\n\nvar $iterator$ = '@@iterator';\n\nfunction repeat(value) {\n  return {\n    '@@iterator': function () {\n      return {\n        next: function () {\n          return { done: false, value: value };\n        }\n      };\n    }\n  };\n}\n\nfunction createDisposable(state) {\n  return {\n    isDisposed: false,\n    dispose: function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        state.isDisposed = true;\n      }\n    }\n  };\n}\n\nfunction CatchErrorWhenObservable(source, notifier) {\n  this.source = source;\n  this._notifier = notifier;\n  ObservableBase.call(this);\n}\n\ninherits(CatchErrorWhenObservable, ObservableBase);\n\nCatchErrorWhenObservable.prototype.subscribeCore = function (o) {\n  var exceptions = new Subject(),\n    notifier = new Subject(),\n    handled = this._notifier(exceptions),\n    notificationDisposable = handled.subscribe(notifier);\n\n  var e = this.source[$iterator$]();\n\n  var state = { isDisposed: false },\n    lastError,\n    subscription = new SerialDisposable();\n  var cancelable = Scheduler.queue.scheduleRecursive(null, function (_, recurse) {\n    if (state.isDisposed) { return; }\n    var currentItem = e.next();\n\n    if (currentItem.done) {\n      if (lastError) {\n        o.onError(lastError);\n      } else {\n        o.onCompleted();\n      }\n      return;\n    }\n\n    // Check if promise\n    var currentValue = currentItem.value;\n    isPromise(currentValue) && (currentValue = fromPromise(currentValue));\n\n    var outer = new SingleAssignmentDisposable();\n    var inner = new SingleAssignmentDisposable();\n    subscription.setDisposable(new BinaryDisposable(inner, outer));\n    outer.setDisposable(currentValue.subscribe(\n      function(x) { o.onNext(x); },\n      function (exn) {\n        inner.setDisposable(notifier.subscribe(recurse, function(ex) {\n          o.onError(ex);\n        }, function() {\n          o.onCompleted();\n        }));\n\n        exceptions.onNext(exn);\n        outer.dispose();\n      },\n      function() { o.onCompleted(); }));\n  });\n\n  return new NAryDisposable([notificationDisposable, subscription, cancelable, createDisposable(state)]);\n};\n\nmodule.exports = function retryWhen (source, notifier) {\n  return new CatchErrorWhenObservable(repeat(source), notifier);\n};\n"
  },
  {
    "path": "src/modular/observable/sample.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar interval = require('./interval');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar BinaryDisposable = require('../binarydisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction SamplerObserver(s) {\n  this._s = s;\n  AbstractObserver.call(this);\n}\n\ninherits(SamplerObserver, AbstractObserver);\n\nSamplerObserver.prototype._handleMessage = function () {\n  if (this._s.hasValue) {\n    this._s.hasValue = false;\n    this._s.o.onNext(this._s.value);\n  }\n  this._s.atEnd && this._s.o.onCompleted();\n};\n\nSamplerObserver.prototype.next = function () { this._handleMessage(); };\nSamplerObserver.prototype.error = function (e) { this._s.onError(e); };\nSamplerObserver.prototype.completed = function () { this._handleMessage(); };\n\nfunction SampleSourceObserver(s) {\n  this._s = s;\n  AbstractObserver.call(this);\n}\n\ninherits(SampleSourceObserver, AbstractObserver);\n\nSampleSourceObserver.prototype.next = function (x) {\n  this._s.hasValue = true;\n  this._s.value = x;\n};\nSampleSourceObserver.prototype.error = function (e) { this._s.o.onError(e); };\nSampleSourceObserver.prototype.completed = function () {\n  this._s.atEnd = true;\n  this._s.sourceSubscription.dispose();\n};\n\nfunction SampleObservable(source, sampler) {\n  this.source = source;\n  this._sampler = sampler;\n  ObservableBase.call(this);\n}\n\ninherits(SampleObservable, ObservableBase);\n\nSampleObservable.prototype.subscribeCore = function (o) {\n  var state = {\n    o: o,\n    atEnd: false,\n    value: null,\n    hasValue: false,\n    sourceSubscription: new SingleAssignmentDisposable()\n  };\n\n  state.sourceSubscription.setDisposable(this.source.subscribe(new SampleSourceObserver(state)));\n  return new BinaryDisposable(\n    state.sourceSubscription,\n    this._sampler.subscribe(new SamplerObserver(state))\n  );\n};\n\nmodule.exports = function sample(source, intervalOrSampler, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  return typeof intervalOrSampler === 'number' ?\n    new SampleObservable(source, interval(intervalOrSampler, scheduler)) :\n    new SampleObservable(source, intervalOrSampler);\n};\n"
  },
  {
    "path": "src/modular/observable/scan.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar inherits = require('inherits');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\n\nfunction ScanObserver(o, parent) {\n  this._o = o;\n  this._p = parent;\n  this._fn = parent.accumulator;\n  this._hs = parent.hasSeed;\n  this._s = parent.seed;\n  this._ha = false;\n  this._a = null;\n  this._hv = false;\n  this._i = 0;\n  AbstractObserver.call(this);\n}\n\ninherits(ScanObserver, AbstractObserver);\n\nScanObserver.prototype.next = function (x) {\n  !this._hv && (this._hv = true);\n  if (this._ha) {\n    this._a = tryCatch(this._fn)(this._a, x, this._i, this._p);\n  } else {\n    this._a = this._hs ? tryCatch(this._fn)(this._s, x, this._i, this._p) : x;\n    this._ha = true;\n  }\n  if (this._a === errorObj) { return this._o.onError(this._a.e); }\n  this._o.onNext(this._a);\n  this._i++;\n};\n\nScanObserver.prototype.error = function (e) { this._o.onError(e); };\nScanObserver.prototype.completed = function () {\n  !this._hv && this._hs && this._o.onNext(this._s);\n  this._o.onCompleted();\n};\n\nfunction ScanObservable(source, accumulator, hasSeed, seed) {\n  this.source = source;\n  this.accumulator = accumulator;\n  this.hasSeed = hasSeed;\n  this.seed = seed;\n  ObservableBase.call(this);\n}\n\ninherits(ScanObservable, ObservableBase);\n\nScanObservable.prototype.subscribeCore = function(o) {\n  return this.source.subscribe(new ScanObserver(o,this));\n};\n\n/**\n*  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n*  For aggregation behavior with no intermediate results, see Observable.aggregate.\n* @param {Mixed} [seed] The initial accumulator value.\n* @param {Function} accumulator An accumulator function to be invoked on each element.\n* @returns {Observable} An observable sequence containing the accumulated values.\n*/\nmodule.exports = function scan () {\n  var source = arguments[0], hasSeed = false, seed, accumulator = arguments[1];\n  if (arguments.length === 3) {\n    hasSeed = true;\n    seed = arguments[2];\n  }\n  return new ScanObservable(source, accumulator, hasSeed, seed);\n};\n"
  },
  {
    "path": "src/modular/observable/sequenceequal.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar fromArray = require('./from');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar BinaryDisposable = require('../binarydisposable');\nvar isEqual = require('../internal/isequal');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nvar $iterator$ = (typeof global.Symbol === 'function' && global.Symbol.iterator) ||\n  '_es6shim_iterator_';\n// Bug for mozilla version\nif (global.Set && typeof new global.Set()['@@iterator'] === 'function') {\n  $iterator$ = '@@iterator';\n}\n\nfunction isIterable(o) {\n  return o && o[$iterator$] !== undefined;\n}\n\nfunction isArrayLike (o) {\n  return o && o.length !== undefined;\n}\n\nfunction FirstObserver(state) {\n  this._s = state;\n  AbstractObserver.call(this);\n}\n\ninherits(FirstObserver, AbstractObserver);\n\nFirstObserver.prototype.next = function (x) {\n  if (this._s.qr.length > 0) {\n    var v = this._s.qr.shift();\n    var equal = tryCatch(this._s.cmp)(v, x);\n    if (equal === errorObj) { return this._s.o.onError(equal.e); }\n    if (!equal) {\n      this._s.o.onNext(false);\n      this._s.o.onCompleted();\n    }\n  } else if (this._s.doner) {\n    this._s.o.onNext(false);\n    this._s.o.onCompleted();\n  } else {\n    this._s.ql.push(x);\n  }\n};\n\nFirstObserver.prototype.error = function (e) { this._s.o.onError(e); };\n\nFirstObserver.prototype.completed = function () {\n  this._s.donel = true;\n  if (this._s.ql.length === 0) {\n    if (this._s.qr.length > 0) {\n      this._s.o.onNext(false);\n      this._s.o.onCompleted();\n    } else if (this._s.doner) {\n      this._s.o.onNext(true);\n      this._s.o.onCompleted();\n    }\n  }\n};\n\nfunction SecondObserver(state) {\n  this._s = state;\n  AbstractObserver.call(this);\n}\n\ninherits(SecondObserver, AbstractObserver);\n\nSecondObserver.prototype.next = function (x) {\n  if (this._s.ql.length > 0) {\n    var v = this._s.ql.shift();\n    var equal = tryCatch(this._s.cmp)(v, x);\n    if (equal === errorObj) { return this._s.o.onError(equal.e); }\n    if (!equal) {\n      this._s.o.onNext(false);\n      this._s.o.onCompleted();\n    }\n  } else if (this._s.donel) {\n    this._s.o.onNext(false);\n    this._s.o.onCompleted();\n  } else {\n    this._s.qr.push(x);\n  }\n};\n\nSecondObserver.prototype.error = function (e) { this._s.o.onError(e); };\n\nSecondObserver.prototype.completed = function () {\n  this._s.doner = true;\n  if (this._s.qr.length === 0) {\n    if (this._s.ql.length > 0) {\n      this._s.o.onNext(false);\n      this._s.o.onCompleted();\n    } else if (this._s.donel) {\n      this._s.o.onNext(true);\n      this._s.o.onCompleted();\n    }\n  }\n};\n\nfunction SequenceEqualObservable(first, second, comparer) {\n  this._first = first;\n  this._second = second;\n  this._cmp = comparer;\n  ObservableBase.call(this);\n}\n\ninherits(SequenceEqualObservable, ObservableBase);\n\nSequenceEqualObservable.prototype.subscribeCore = function (o) {\n  (isArrayLike(this._first) || isIterable(this._first)) && (this._first = fromArray(this._first));\n  isPromise(this._first) && (this._first = fromPromise(this._first));\n\n  (isArrayLike(this._second) || isIterable(this._second)) && (this._second = fromArray(this._second));\n  isPromise(this._second) && (this._second = fromPromise(this._second));\n\n  var state = {\n    o: o,\n    donel: false,\n    doner: false,\n    ql: [],\n    qr: [],\n    cmp: this._cmp\n  };\n\n  return new BinaryDisposable(\n    this._first.subscribe(new FirstObserver(state)),\n    this._second.subscribe(new SecondObserver(state))\n  );\n};\n\nmodule.exports = function sequenceEqual (first, second, comparer) {\n  comparer || (comparer = isEqual);\n  return new SequenceEqualObservable(first, second, comparer);\n};\n"
  },
  {
    "path": "src/modular/observable/share.js",
    "content": "'use strict';\n\nvar publish = require('./publish');\n\nmodule.exports = function share (source) {\n  return publish(source).refCount();\n};\n"
  },
  {
    "path": "src/modular/observable/sharereplay.js",
    "content": "'use strict';\n\nvar replay = require('./replay');\n\nmodule.exports = function shareReplay(source, bufferSize, windowSize, scheduler) {\n  return replay(source, null, bufferSize, windowSize, scheduler).refCount();\n};\n"
  },
  {
    "path": "src/modular/observable/sharevalue.js",
    "content": "'use strict';\n\nvar publishValue = require('./publishvalue');\n\nmodule.exports = function shareValue(source, initialValue) {\n  return publishValue(source, initialValue).refCount();\n};\n"
  },
  {
    "path": "src/modular/observable/skip.js",
    "content": "'use strict';\n\nvar AbstractObserver = require('../observer/abstractobserver');\nvar ObservableBase = require('./observablebase');\nvar errors = require('../internal/errors');\nvar inherits = require('inherits');\n\nfunction SkipObserver(o, r) {\n  this._o = o;\n  this._r = r;\n  AbstractObserver.call(this);\n}\n\ninherits(SkipObserver, AbstractObserver);\n\nSkipObserver.prototype.next = function (x) {\n  if (this._r <= 0) {\n    this._o.onNext(x);\n  } else {\n    this._r--;\n  }\n};\nSkipObserver.prototype.error = function(e) { this._o.onError(e); };\nSkipObserver.prototype.completed = function() { this._o.onCompleted(); };\n\nfunction SkipObservable(source, count) {\n  this.source = source;\n  this._count = count;\n  ObservableBase.call(this);\n}\n\ninherits(SkipObservable, ObservableBase);\n\nSkipObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new SkipObserver(o, this._count));\n};\n\n/**\n * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n * @param {Number} count The number of elements to skip before returning the remaining elements.\n * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n */\nmodule.exports = function skip(source, count) {\n  if (count < 0) { throw new errors.ArgumentOutOfRangeError(); }\n  return new SkipObservable(source, count);\n};\n"
  },
  {
    "path": "src/modular/observable/skiplast.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar inherits = require('inherits');\n\nfunction SkipLastObserver(o, c) {\n  this._o = o;\n  this._c = c;\n  this._q = [];\n  AbstractObserver.call(this);\n}\n\ninherits(SkipLastObserver, AbstractObserver);\n\nSkipLastObserver.prototype.next = function (x) {\n  this._q.push(x);\n  this._q.length > this._c && this._o.onNext(this._q.shift());\n};\n\nSkipLastObserver.prototype.error = function (e) { this._o.onError(e); };\nSkipLastObserver.prototype.completed = function () { this._o.onCompleted(); };\n\nfunction SkipLastObservable(source, c) {\n  this.source = source;\n  this._c = c;\n  ObservableBase.call(this);\n}\n\ninherits(SkipLastObservable, ObservableBase);\n\nSkipLastObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new SkipLastObserver(o, this._c));\n};\n\nmodule.exports = function skipLast (source, count) {\n  count < 0 && (count = 0);\n  return new SkipLastObservable(source, count);\n};\n"
  },
  {
    "path": "src/modular/observable/skiplastwithtime.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction SkipLastWithTimeObserver(o, p) {\n  this._o = o;\n  this._s = p._s;\n  this._d = p._d;\n  this._q = [];\n  AbstractObserver.call(this);\n}\n\ninherits(SkipLastWithTimeObserver, AbstractObserver);\n\nSkipLastWithTimeObserver.prototype.next = function (x) {\n  var now = this._s.now();\n  this._q.push({ interval: now, value: x });\n  while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n    this._o.onNext(this._q.shift().value);\n  }\n};\nSkipLastWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\nSkipLastWithTimeObserver.prototype.completed = function () {\n  var now = this._s.now();\n  while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n    this._o.onNext(this._q.shift().value);\n  }\n  this._o.onCompleted();\n};\n\nfunction SkipLastWithTimeObservable(source, d, s) {\n  this.source = source;\n  this._d = d;\n  this._s = s;\n  ObservableBase.call(this);\n}\n\ninherits(SkipLastWithTimeObservable, ObservableBase);\n\nSkipLastWithTimeObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new SkipLastWithTimeObserver(o, this));\n};\n\nmodule.exports = function skipLastWithTime (source, duration, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  return new SkipLastWithTimeObservable(source, duration, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/skipuntil.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar BinaryDisposable = require('../binarydisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar inherits = require('inherits');\n\nfunction SkipUntilSourceObserver(o, p) {\n  this._o = o;\n  this._p = p;\n  AbstractObserver.call(this);\n}\n\ninherits(SkipUntilSourceObserver, AbstractObserver);\n\nSkipUntilSourceObserver.prototype.next = function (x) { this._p._open && this._o.onNext(x); };\nSkipUntilSourceObserver.prototype.error = function (err) { this._o.onError(err); };\nSkipUntilSourceObserver.prototype.onCompleted = function () { this._p._open && this._o.onCompleted(); };\n\nfunction SkipUntilOtherObserver(o, p, r) {\n  this._o = o;\n  this._p = p;\n  this._r = r;\n  AbstractObserver.call(this);\n}\n\ninherits(SkipUntilOtherObserver, AbstractObserver);\n\nSkipUntilOtherObserver.prototype.next = function () { this._p._open = true; this._r.dispose(); };\nSkipUntilOtherObserver.prototype.error = function (err) { this._o.onError(err); };\nSkipUntilOtherObserver.prototype.onCompleted = function () { this._r.dispose(); };\n\nfunction SkipUntilObservable(source, other) {\n  this._s = source;\n  this._o = isPromise(other) ? fromPromise(other) : other;\n  this._open = false;\n  ObservableBase.call(this);\n}\n\ninherits(SkipUntilObservable, ObservableBase);\n\nSkipUntilObservable.prototype.subscribeCore = function(o) {\n  var leftSubscription = new SingleAssignmentDisposable();\n  leftSubscription.setDisposable(this._s.subscribe(new SkipUntilSourceObserver(o, this)));\n\n  isPromise(this._o) && (this._o = fromPromise(this._o));\n\n  var rightSubscription = new SingleAssignmentDisposable();\n  rightSubscription.setDisposable(this._o.subscribe(new SkipUntilOtherObserver(o, this, rightSubscription)));\n\n  return new BinaryDisposable(leftSubscription, rightSubscription);\n};\n\n/**\n * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n */\nmodule.exports = function skipUntil (source, other) {\n  return new SkipUntilObservable(source, other);\n};\n"
  },
  {
    "path": "src/modular/observable/skipuntilwithtime.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar BinaryDisposable = require('../binarydisposable');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction SkipUntilWithTimeObserver(o, p) {\n  this._o = o;\n  this._p = p;\n  AbstractObserver.call(this);\n}\n\ninherits(SkipUntilWithTimeObserver, AbstractObserver);\n\nSkipUntilWithTimeObserver.prototype.next = function (x) { this._p._open && this._o.onNext(x); };\nSkipUntilWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\nSkipUntilWithTimeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\nfunction SkipUntilWithTimeObservable(source, startTime, scheduler) {\n  this.source = source;\n  this._st = startTime;\n  this._s = scheduler;\n  ObservableBase.call(this);\n}\n\ninherits(SkipUntilWithTimeObservable, ObservableBase);\n\nfunction scheduleMethod(s, state) {\n  state._open = true;\n}\n\nSkipUntilWithTimeObservable.prototype.subscribeCore = function (o) {\n  this._open = false;\n  return new BinaryDisposable(\n    this._s.scheduleFuture(this, this._st, scheduleMethod),\n    this.source.subscribe(new SkipUntilWithTimeObserver(o, this))\n  );\n};\n\nmodule.exports = function skipUntilWithTime (source, startTime, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  return new SkipUntilWithTimeObservable(source, startTime, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/skipwhile.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar bindCallback = require('../internal/bindcallback');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction SkipWhileObserver(o, p) {\n  this._o = o;\n  this._p = p;\n  this._i = 0;\n  this._r = false;\n  AbstractObserver.call(this);\n}\n\ninherits(SkipWhileObserver, AbstractObserver);\n\nSkipWhileObserver.prototype.next = function (x) {\n  if (!this._r) {\n    var res = tryCatch(this._p._fn)(x, this._i++, this._p);\n    if (res === errorObj) { return this._o.onError(res.e); }\n    this._r = !res;\n  }\n  this._r && this._o.onNext(x);\n};\nSkipWhileObserver.prototype.error = function (e) { this._o.onError(e); };\nSkipWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\nfunction SkipWhileObservable(source, fn) {\n  this.source = source;\n  this._fn = fn;\n  ObservableBase.call(this);\n}\n\ninherits(SkipWhileObservable, ObservableBase);\n\nSkipWhileObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new SkipWhileObserver(o, this));\n};\n\nmodule.exports = function skipWhile (source, predicate, thisArg) {\n  var fn = bindCallback(predicate, thisArg, 3);\n  return new SkipWhileObservable(source, fn);\n};\n"
  },
  {
    "path": "src/modular/observable/skipwithtime.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar BinaryDisposable = require('../binarydisposable');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction SkipWithTimeObserver(o, p) {\n  this._o = o;\n  this._p = p;\n  AbstractObserver.call(this);\n}\n\ninherits(SkipWithTimeObserver, AbstractObserver);\n\nSkipWithTimeObserver.prototype.next = function (x) { this._p._open && this._o.onNext(x); };\nSkipWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\nSkipWithTimeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\nfunction SkipWithTimeObservable(source, d, s) {\n  this.source = source;\n  this._d = d;\n  this._s = s;\n  this._open = false;\n  ObservableBase.call(this);\n}\n\ninherits(SkipWithTimeObservable, ObservableBase);\n\nfunction scheduleMethod(s, self) {\n  self._open = true;\n}\n\nSkipWithTimeObservable.prototype.subscribeCore = function (o) {\n  return new BinaryDisposable(\n    this._s.scheduleFuture(this, this._d, scheduleMethod),\n    this.source.subscribe(new SkipWithTimeObserver(o, this))\n  );\n};\n\nmodule.exports = function skipWithTime (source, duration, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  return new SkipWithTimeObservable(source, duration, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/slice.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar ArgumentOutOfRangeError = require('../internal/errors').ArgumentOutOfRangeError;\nvar inherits = require('inherits');\n\nfunction SliceObserver(o, b, e) {\n  this._o = o;\n  this._b = b;\n  this._e = e;\n  this._i = 0;\n  AbstractObserver.call(this);\n}\n\ninherits(SliceObserver, AbstractObserver);\n\nSliceObserver.prototype.next = function (x) {\n  if (this._i >= this._b) {\n    if (this._e === this._i) {\n      this._o.onCompleted();\n    } else {\n      this._o.onNext(x);\n    }\n  }\n  this._i++;\n};\nSliceObserver.prototype.error = function (e) { this._o.onError(e); };\nSliceObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n\nfunction SliceObservable(source, b, e) {\n  this.source = source;\n  this._b = b;\n  this._e = e;\n  ObservableBase.call(this);\n}\n\ninherits(SliceObservable, ObservableBase);\n\nSliceObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new SliceObserver(o, this._b, this._e));\n};\n\nmodule.exports = function slice(source, begin, end) {\n  var start = begin || 0;\n  if (start < 0) { throw new ArgumentOutOfRangeError(); }\n  if (typeof end === 'number' && end < start) {\n    throw new ArgumentOutOfRangeError();\n  }\n  return new SliceObservable(source, start, end);\n};\n"
  },
  {
    "path": "src/modular/observable/some.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar bindCallback = require('../internal/bindcallback');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction SomeObserver(o, fn, s) {\n  this._o = o;\n  this._fn = fn;\n  this._s = s;\n  this._i = 0;\n  AbstractObserver.call(this);\n}\n\ninherits(SomeObserver, AbstractObserver);\n\nSomeObserver.prototype.next = function (x) {\n  var result = tryCatch(this._fn)(x, this._i++, this._s);\n  if (result === errorObj) { return this._o.onError(result.e); }\n  if (Boolean(result)) {\n    this._o.onNext(true);\n    this._o.onCompleted();\n  }\n};\nSomeObserver.prototype.error = function (e) { this._o.onError(e); };\nSomeObserver.prototype.completed = function () {\n  this._o.onNext(false);\n  this._o.onCompleted();\n};\n\nfunction SomeObservable(source, fn) {\n  this.source = source;\n  this._fn = fn;\n  ObservableBase.call(this);\n}\n\ninherits(SomeObservable, ObservableBase);\n\nSomeObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new SomeObserver(o, this._fn, this.source));\n};\n\nmodule.exports = function some (source, predicate, thisArg) {\n  var fn = bindCallback(predicate, thisArg, 3);\n  return new SomeObservable(source, fn);\n};\n"
  },
  {
    "path": "src/modular/observable/start.js",
    "content": "'use strict';\n\nvar toAsync = require('./toasync');\n\nmodule.exports = function start (func, context, scheduler) {\n  return toAsync(func, context, scheduler)();\n};\n"
  },
  {
    "path": "src/modular/observable/startasync.js",
    "content": "'use strict';\n\nvar fromPromise = require('./frompromise');\nvar throwError = require('./throw');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\n\nmodule.exports = function startAsync(functionAsync) {\n  var promise = tryCatch(functionAsync)();\n  if (promise === errorObj) { return throwError(promise.e); }\n  return fromPromise(promise);\n};\n"
  },
  {
    "path": "src/modular/observable/startwith.js",
    "content": "'use strict';\n\nvar concat = require('./concat');\nvar fromArray = require('./fromarray');\nvar Scheduler = require('../scheduler');\n\nmodule.exports = function startWith () {\n  var source = arguments[0], scheduler, start = 1;\n  if (Scheduler.isScheduler(arguments[1])) {\n    scheduler = arguments[1];\n    start = 2;\n  } else {\n    scheduler = Scheduler.immediate;\n  }\n  for(var args = [], i = start, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n  return concat(fromArray(args, scheduler), source);\n};\n"
  },
  {
    "path": "src/modular/observable/stopandwait.js",
    "content": "'use strict';\n\nvar Observable = require('../observable');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar BinaryDisposable = require('../binarydisposable');\nvar inherits = require('inherits');\n\nfunction StopAndWaitObserver(observer, observable, scheduler, cancel) {\n  this.observer = observer;\n  this.observable = observable;\n  this.scheduler = scheduler;\n  this.cancel = cancel;\n  this.scheduleDisposable = null;\n  AbstractObserver.call(this);\n}\n\ninherits(StopAndWaitObserver, AbstractObserver);\n\nStopAndWaitObserver.prototype.completed = function () {\n  this.observer.onCompleted();\n  this.dispose();\n};\n\nStopAndWaitObserver.prototype.error = function (error) {\n  this.observer.onError(error);\n  this.dispose();\n};\n\nfunction innerScheduleMethod(s, self) {\n  return self.observable.source.request(1);\n}\n\nStopAndWaitObserver.prototype.next = function (value) {\n  this.observer.onNext(value);\n  this.scheduleDisposable = this.scheduler.schedule(this, innerScheduleMethod);\n};\n\nStopAndWaitObserver.prototype.dispose = function () {\n  this.observer = null;\n  if (this.cancel) {\n    this.cancel.dispose();\n    this.cancel = null;\n  }\n  if (this.scheduleDisposable) {\n    this.scheduleDisposable.dispose();\n    this.scheduleDisposable = null;\n  }\n  AbstractObserver.prototype.dispose.call(this);\n};\n\nfunction StopAndWaitObservable(source, scheduler) {\n  this.source = source;\n  this.scheduler = scheduler;\n  Observable.call(this);\n}\n\ninherits(StopAndWaitObservable, Observable);\n\nfunction scheduleMethod(s, self) {\n  return self.source.request(1);\n}\n\nStopAndWaitObservable.prototype._subscribe = function (o) {\n  this.subscription = this.source.subscribe(new StopAndWaitObserver(o, this, this.scheduler, this.subscription));\n  return new BinaryDisposable(\n    this.subscription,\n    this.scheduler.schedule(this, scheduleMethod)\n  );\n};\n\nmodule.exports = StopAndWaitObservable;\n"
  },
  {
    "path": "src/modular/observable/subscribeon.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar ScheduledDisposable = require('../scheduleddisposable');\nvar SerialDisposable = require('../serialdisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar inherits = require('inherits');\n\nfunction SubscribeOnObservable(source, s) {\n  this.source = source;\n  this._s = s;\n  ObservableBase.call(this);\n}\n\ninherits(SubscribeOnObservable, ObservableBase);\n\nfunction scheduleMethod(scheduler, state) {\n  var source = state[0], d = state[1], o = state[2];\n  d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(o)));\n}\n\nSubscribeOnObservable.prototype.subscribeCore = function (o) {\n  var m = new SingleAssignmentDisposable(), d = new SerialDisposable();\n  d.setDisposable(m);\n  m.setDisposable(this._s.schedule([this.source, d, o], scheduleMethod));\n  return d;\n};\n\nmodule.exports = function subscribeOn (source, scheduler) {\n  return new SubscribeOnObservable(source, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/sum.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar bindCallback = require('../internal/bindcallback');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction SumObserver(o, fn, s) {\n  this._o = o;\n  this._fn = fn;\n  this._s = s;\n  this._i = 0;\n  this._c = 0;\n  AbstractObserver.call(this);\n}\n\ninherits(SumObserver, AbstractObserver);\n\nSumObserver.prototype.next = function (x) {\n  if (this._fn) {\n    var result = tryCatch(this._fn)(x, this._i++, this._s);\n    if (result === errorObj) { return this._o.onError(result.e); }\n    this._c += result;\n  } else {\n    this._c += x;\n  }\n};\nSumObserver.prototype.error = function (e) { this._o.onError(e); };\nSumObserver.prototype.completed = function () {\n  this._o.onNext(this._c);\n  this._o.onCompleted();\n};\n\nfunction SumObservable(source, fn) {\n  this.source = source;\n  this._fn = fn;\n  ObservableBase.call(this);\n}\n\ninherits(SumObservable, ObservableBase);\n\nSumObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new SumObserver(o, this._fn, this.source));\n};\n\nmodule.exports = function sum (source, keySelector, thisArg) {\n  var fn = bindCallback(keySelector, thisArg, 3);\n  return new SumObservable(source, fn);\n};\n"
  },
  {
    "path": "src/modular/observable/switch.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar BinaryDisposable = require('../binarydisposable');\nvar SerialDisposable = require('../serialdisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar inherits = require('inherits');\n\nfunction InnerObserver(p, id) {\n  this._p = p;\n  this._id = id;\n  AbstractObserver.call(this);\n}\n\ninherits(InnerObserver, AbstractObserver);\n\nInnerObserver.prototype.next = function (x) { this._p._latest === this._id && this._p._o.onNext(x); };\nInnerObserver.prototype.error = function (e) { this._p._latest === this._id && this._p._o.onError(e); };\nInnerObserver.prototype.completed = function () {\n  if (this._p._latest === this._id) {\n    this._p._hasLatest = false;\n    this._p._stopped && this._p._o.onCompleted();\n  }\n};\n\nfunction SwitchObserver(o, inner) {\n  this._o = o;\n  this._inner = inner;\n  this._stopped = false;\n  this._latest = 0;\n  this._hasLatest = false;\n  AbstractObserver.call(this);\n}\n\ninherits(SwitchObserver, AbstractObserver);\n\nSwitchObserver.prototype.next = function (innerSource) {\n  var d = new SingleAssignmentDisposable(), id = ++this._latest;\n  this._hasLatest = true;\n  this._inner.setDisposable(d);\n  isPromise(innerSource) && (innerSource = fromPromise(innerSource));\n  d.setDisposable(innerSource.subscribe(new InnerObserver(this, id)));\n};\nSwitchObserver.prototype.error = function (e) { this._o.onError(e); };\nSwitchObserver.prototype.completed = function () { this._stopped = true; !this._hasLatest && this._o.onCompleted(); };\n\nfunction SwitchObservable(source) {\n  this.source = source;\n  ObservableBase.call(this);\n}\n\ninherits(SwitchObservable, ObservableBase);\n\nSwitchObservable.prototype.subscribeCore = function (o) {\n  var inner = new SerialDisposable(), s = this.source.subscribe(new SwitchObserver(o, inner));\n  return new BinaryDisposable(s, inner);\n};\n\n/**\n* Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n* @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n*/\nmodule.exports = function switch_(source) {\n  return new SwitchObservable(source);\n};\n"
  },
  {
    "path": "src/modular/observable/switchfirst.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar CompositeDisposable = require('../compositedisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar inherits = require('inherits');\n\nfunction InnerObserver(state, inner) {\n  this._s = state;\n  this._i = inner;\n  AbstractObserver.call(this);\n}\n\ninherits(InnerObserver, AbstractObserver);\n\nInnerObserver.prototype.next = function (x) { this._s.o.onNext(x); };\nInnerObserver.prototype.error = function (e) { this._s.o.onError(e); };\nInnerObserver.prototype.completed = function () {\n  this._s.g.remove(this._i);\n  this._s.hasCurrent = false;\n  this._s.isStopped && this._s.g.length === 1 && this._s.o.onCompleted();\n};\n\nfunction SwitchFirstObserver(state) {\n  this._s = state;\n  AbstractObserver.call(this);\n}\n\ninherits(SwitchFirstObserver, AbstractObserver);\n\nSwitchFirstObserver.prototype.next = function (x) {\n  if (!this._s.hasCurrent) {\n    this._s.hasCurrent = true;\n    isPromise(x) && (x = fromPromise(x));\n    var inner = new SingleAssignmentDisposable();\n    this._s.g.add(inner);\n    inner.setDisposable(x.subscribe(new InnerObserver(this._s, inner)));\n  }\n};\n\nSwitchFirstObserver.prototype.error = function (e) {\n  this._s.o.onError(e);\n};\n\nSwitchFirstObserver.prototype.completed = function () {\n  this._s.isStopped = true;\n  !this._s.hasCurrent && this._s.g.length === 1 && this._s.o.onCompleted();\n};\n\nfunction SwitchFirstObservable(source) {\n  this.source = source;\n  ObservableBase.call(this);\n}\n\ninherits(SwitchFirstObservable, ObservableBase);\n\nSwitchFirstObservable.prototype.subscribeCore = function (o) {\n  var m = new SingleAssignmentDisposable(),\n    g = new CompositeDisposable(),\n    state = {\n      hasCurrent: false,\n      isStopped: false,\n      o: o,\n      g: g\n    };\n\n  g.add(m);\n  m.setDisposable(this.source.subscribe(new SwitchFirstObserver(state)));\n  return g;\n};\n\n/**\n * Performs a exclusive waiting for the first to finish before subscribing to another observable.\n * Observables that come in between subscriptions will be dropped on the floor.\n * @returns {Observable} A exclusive observable with only the results that happen when subscribed.\n */\nmodule.exports = function switchFirst (source) {\n  return new SwitchFirstObservable(source);\n};\n"
  },
  {
    "path": "src/modular/observable/take.js",
    "content": "'use strict';\n\nvar AbstractObserver = require('../observer/abstractobserver');\nvar ObservableBase = require('./observablebase');\nvar empty = require('./empty');\nvar errors = require('../internal/errors');\nvar inherits = require('inherits');\n\nfunction TakeObserver(o, c) {\n  this._o = o;\n  this._c = c;\n  this._r = c;\n  AbstractObserver.call(this);\n}\n\ninherits(TakeObserver, AbstractObserver);\n\nTakeObserver.prototype.next = function (x) {\n  if (this._r-- > 0) {\n    this._o.onNext(x);\n    this._r <= 0 && this._o.onCompleted();\n  }\n};\n\nTakeObserver.prototype.error = function (e) { this._o.onError(e); };\nTakeObserver.prototype.completed = function () { this._o.onCompleted(); };\n\nfunction TakeObservable(source, count) {\n  this.source = source;\n  this._count = count;\n  ObservableBase.call(this);\n}\n\ninherits(TakeObservable, ObservableBase);\n\nTakeObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new TakeObserver(o, this._count));\n};\n\n/**\n *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n * @param {Number} count The number of elements to return.\n * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n */\nmodule.exports = function (source, count, scheduler) {\n  if (count < 0) { throw new errors.ArgumentOutOfRangeError(); }\n  if (count === 0) { return empty(scheduler); }\n  return new TakeObservable(source, count);\n};\n"
  },
  {
    "path": "src/modular/observable/takelast.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar Scheduler = require('../scheduler');\nvar BinaryDisposable = require('../binarydisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar ArgumentOutOfRangeError = require('../internal/errors').ArgumentOutOfRangeError;\nvar inherits = require('inherits');\n\nfunction TakeLastObserver(o, c, s, ss, ls) {\n  this._o = o;\n  this._c = c;\n  this._s = s;\n  this._ls = ls;\n  this._ss = ss;\n  this._q = [];\n  AbstractObserver.call(this);\n}\n\ninherits(TakeLastObserver, AbstractObserver);\n\nTakeLastObserver.prototype.next = function (x) {\n  this._q.push(x);\n  this._q.length > this._c && this._q.shift();\n};\n\nTakeLastObserver.prototype.error = function (e) {\n  this._o.onError(e);\n};\n\nfunction loopRecursive(state, recurse) {\n  if (state[1].length > 0) {\n    state[0].onNext(state[1].shift());\n    recurse(state);\n  } else {\n    state[0].onCompleted();\n  }\n}\n\nTakeLastObserver.prototype.completed = function () {\n  this._ss.dispose();\n  this._ls.setDisposable(this._s.scheduleRecursive([this._o, this._q], loopRecursive));\n};\n\nfunction TakeLastObservable(source, count, scheduler) {\n  this.source = source;\n  this.count = count;\n  this.scheduler = scheduler;\n  ObservableBase.call(this);\n}\n\ninherits(TakeLastObservable, ObservableBase);\n\nTakeLastObservable.prototype.subscribeCore = function (o) {\n  var subscription = new SingleAssignmentDisposable();\n  var loopSubscription = new SingleAssignmentDisposable();\n  subscription.setDisposable(this.source.subscribe(new TakeLastObserver(o, this.count, this.scheduler, subscription, loopSubscription)));\n\n  return new BinaryDisposable(subscription, loopSubscription);\n};\n\nmodule.exports = function takeLast (source, count, scheduler) {\n  if (count < 0) { throw new ArgumentOutOfRangeError(); }\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.queue);\n  return new TakeLastObservable(source, count, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/takelastbuffer.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar inherits = require('inherits');\n\nfunction TakeLastBufferObserver(o, c) {\n  this._o = o;\n  this._c = c;\n  this._q = [];\n  AbstractObserver.call(this);\n}\n\ninherits(TakeLastBufferObserver, AbstractObserver);\n\nTakeLastBufferObserver.prototype.next = function (x) {\n  this._q.push(x);\n  this._q.length > this._c && this._q.shift();\n};\n\nTakeLastBufferObserver.prototype.error = function (e) {\n  this._o.onError(e);\n};\n\nTakeLastBufferObserver.prototype.completed = function () {\n  this._o.onNext(this._q);\n  this._o.onCompleted();\n};\n\nfunction TakeLastBufferObservable(source, count) {\n  this.source = source;\n  this._c = count;\n  ObservableBase.call(this);\n}\n\ninherits(TakeLastBufferObservable, ObservableBase);\n\nTakeLastBufferObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new TakeLastBufferObserver(o, this._c));\n};\n\nmodule.exports = function takeLastBuffer(source, count) {\n  count < 0 && (count = 0);\n  return new TakeLastBufferObservable(source, count);\n};\n"
  },
  {
    "path": "src/modular/observable/takelastbufferwithtime.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction TakeLastBufferWithTimeObserver(o, d, s) {\n  this._o = o;\n  this._d = d;\n  this._s = s;\n  this._q = [];\n  AbstractObserver.call(this);\n}\n\ninherits(TakeLastBufferWithTimeObserver, AbstractObserver);\n\nTakeLastBufferWithTimeObserver.prototype.next = function (x) {\n  var now = this._s.now();\n  this._q.push({ interval: now, value: x });\n  while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n    this._q.shift();\n  }\n};\n\nTakeLastBufferWithTimeObserver.prototype.error = function (e) {\n  this._o.onError(e);\n};\n\nTakeLastBufferWithTimeObserver.prototype.completed = function () {\n  var now = this._s.now(), res = [];\n  while (this._q.length > 0) {\n    var next = this._q.shift();\n    now - next.interval <= this._d && res.push(next.value);\n  }\n  this._o.onNext(res);\n  this._o.onCompleted();\n};\n\nfunction TakeLastBufferWithTimeObservable(source, duration, scheduler) {\n  this.source = source;\n  this._d = duration;\n  this._s = scheduler;\n  ObservableBase.call(this);\n}\n\ninherits(TakeLastBufferWithTimeObservable, ObservableBase);\n\nTakeLastBufferWithTimeObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new TakeLastBufferWithTimeObserver(o, this._d, this._s));\n};\n\nmodule.exports = function takeLastBufferWithTime (source, duration, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  return new TakeLastBufferWithTimeObservable(source, duration, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/takelastwithtime.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction TakeLastWithTimeObserver(o, d, s) {\n  this._o = o;\n  this._d = d;\n  this._s = s;\n  this._q = [];\n  AbstractObserver.call(this);\n}\n\ninherits(TakeLastWithTimeObserver, AbstractObserver);\n\nTakeLastWithTimeObserver.prototype.next = function (x) {\n  var now = this._s.now();\n  this._q.push({ interval: now, value: x });\n  while (this._q.length > 0 && now - this._q[0].interval >= this._d) {\n    this._q.shift();\n  }\n};\nTakeLastWithTimeObserver.prototype.error = function (e) { this._o.onError(e); };\nTakeLastWithTimeObserver.prototype.completed = function () {\n  var now = this._s.now();\n  while (this._q.length > 0) {\n    var next = this._q.shift();\n    if (now - next.interval <= this._d) { this._o.onNext(next.value); }\n  }\n  this._o.onCompleted();\n};\n\nfunction TakeLastWithTimeObservable(source, d, s) {\n  this.source = source;\n  this._d = d;\n  this._s = s;\n  ObservableBase.call(this);\n}\n\ninherits(TakeLastWithTimeObservable, ObservableBase);\n\nTakeLastWithTimeObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new TakeLastWithTimeObserver(o, this._d, this._s));\n};\n\nmodule.exports = function takeLastWithTime (source, duration, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  return new TakeLastWithTimeObservable(source, duration, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/takeuntil.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar BinaryDisposable = require('../binarydisposable');\nvar isPromise = require('../helpers/ispromise');\nvar fromPromise = require('./frompromise');\nvar noop = require('../helpers/noop');\nvar inherits = require('inherits');\n\nfunction TakeUntilObserver(o) {\n  this._o = o;\n  AbstractObserver.call(this);\n}\n\ninherits(TakeUntilObserver, AbstractObserver);\n\nTakeUntilObserver.prototype.next = function () { this._o.onCompleted(); };\nTakeUntilObserver.prototype.error = function (e) { this._o.onError(e); };\nTakeUntilObserver.prototype.onCompleted = noop;\n\nfunction TakeUntilObservable(source, other) {\n  this.source = source;\n  this._other = isPromise(other) ? fromPromise(other) : other;\n  ObservableBase.call(this);\n}\n\ninherits(TakeUntilObservable, ObservableBase);\n\nTakeUntilObservable.prototype.subscribeCore = function(o) {\n  return new BinaryDisposable(\n    this.source.subscribe(o),\n    this._other.subscribe(new TakeUntilObserver(o))\n  );\n};\n\n/**\n * Returns the values from the source observable sequence until the other observable sequence produces a value.\n * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n */\nmodule.exports = function takeUntil(source, other) {\n  return new TakeUntilObservable(source, other);\n};\n"
  },
  {
    "path": "src/modular/observable/takeuntilwithtime.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar BinaryDisposable = require('../binarydisposable');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction TakeUntilWithTimeObservable(source, end, scheduler) {\n  this.source = source;\n  this._e = end;\n  this._s = scheduler;\n  ObservableBase.call(this);\n}\n\ninherits(TakeUntilWithTimeObservable, ObservableBase);\n\nfunction scheduleMethod(s, o) {\n  o.onCompleted();\n}\n\nTakeUntilWithTimeObservable.prototype.subscribeCore = function (o) {\n  return new BinaryDisposable(\n    this._s.scheduleFuture(o, this._e, scheduleMethod),\n    this.source.subscribe(o));\n};\n\nmodule.exports = function takeUntilWithTime (source, endTime, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  return new TakeUntilWithTimeObservable(source, endTime, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/takewhile.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar bindCallback = require('../internal/bindcallback');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction TakeWhileObserver(o, p) {\n  this._o = o;\n  this._p = p;\n  this._i = 0;\n  this._r = true;\n  AbstractObserver.call(this);\n}\n\ninherits(TakeWhileObserver, AbstractObserver);\n\nTakeWhileObserver.prototype.next = function (x) {\n  if (this._r) {\n    this._r = tryCatch(this._p._fn)(x, this._i++, this._p);\n    if (this._r === errorObj) { return this._o.onError(this._r.e); }\n  }\n  if (this._r) {\n    this._o.onNext(x);\n  } else {\n    this._o.onCompleted();\n  }\n};\nTakeWhileObserver.prototype.error = function (e) { this._o.onError(e); };\nTakeWhileObserver.prototype.completed = function () { this._o.onCompleted(); };\n\nfunction TakeWhileObservable(source, fn) {\n  this.source = source;\n  this._fn = fn;\n  ObservableBase.call(this);\n}\n\ninherits(TakeWhileObservable, ObservableBase);\n\nTakeWhileObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new TakeWhileObserver(o, this));\n};\n\nmodule.exports = function takeWhile (source, predicate, thisArg) {\n  var fn = bindCallback(predicate, thisArg, 3);\n  return new TakeWhileObservable(source, fn);\n};\n"
  },
  {
    "path": "src/modular/observable/tap.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar create = require('../observer/create');\nvar isFunction = require('../helpers/isfunction');\nvar noop = require('../helpers/noop');\nvar inherits = require('inherits');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\n\nfunction TapObserver(o, p) {\n  this._o = o;\n  this._t = !p._oN || isFunction(p._oN) ?\n    create(p._oN || noop, p._oE || noop, p._oC || noop) :\n    p._oN;\n  this.isStopped = false;\n  AbstractObserver.call(this);\n}\n\ninherits(TapObserver, AbstractObserver);\n\nTapObserver.prototype.next = function(x) {\n  var res = tryCatch(this._t.onNext).call(this._t, x);\n  if (res === errorObj) { this._o.onError(res.e); }\n  this._o.onNext(x);\n};\n\nTapObserver.prototype.error = function(e) {\n  var res = tryCatch(this._t.onError).call(this._t, e);\n  if (res === errorObj) { return this._o.onError(res.e); }\n  this._o.onError(e);\n};\n\nTapObserver.prototype.completed = function() {\n  var res = tryCatch(this._t.onCompleted).call(this._t);\n  if (res === errorObj) { return this._o.onError(res.e); }\n  this._o.onCompleted();\n};\n\nfunction TapObservable(source, observerOrOnNext, onError, onCompleted) {\n  this.source = source;\n  this._oN = observerOrOnNext;\n  this._oE = onError;\n  this._oC = onCompleted;\n  ObservableBase.call(this);\n}\n\ninherits(TapObservable, ObservableBase);\n\nTapObservable.prototype.subscribeCore = function(o) {\n  return this.source.subscribe(new TapObserver(o, this));\n};\n\n/**\n*  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n*  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n* @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an o.\n* @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n* @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n* @returns {Observable} The source sequence with the side-effecting behavior applied.\n*/\nmodule.exports = function tap(source, observerOrOnNext, onError, onCompleted) {\n  return new TapObservable(source, observerOrOnNext, onError, onCompleted);\n};\n"
  },
  {
    "path": "src/modular/observable/thendo.js",
    "content": "'use strict';\n\nvar Pattern = require('../joins/pattern');\n\nmodule.exports = function thenDo(source, selector) {\n  return new Pattern([source]).thenDo(selector);\n};\n"
  },
  {
    "path": "src/modular/observable/throttle.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction ThrottleObserver(s) {\n  this._s = s;\n  AbstractObserver.call(this);\n}\n\ninherits(ThrottleObserver, AbstractObserver);\n\nThrottleObserver.prototype.next = function (x) {\n  var now = this._s.scheduler.now();\n  if (this._s.lastOnNext === 0 || now - this._s.lastOnNext >= this._s.duration) {\n    this._s.lastOnNext = now;\n    this._s.o.onNext(x);\n  }\n};\nThrottleObserver.prototype.error = function (e) { this._s.o.onError(e); };\nThrottleObserver.prototype.completed = function () { this._s.o.onCompleted(); };\n\nfunction ThrottleObservable(source, duration, scheduler) {\n  this.source = source;\n  this._duration = duration;\n  this._scheduler = scheduler;\n  ObservableBase.call(this);\n}\n\ninherits(ThrottleObservable, ObservableBase);\n\nThrottleObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new ThrottleObserver({\n    o: o,\n    duration: this._duration,\n    scheduler: this._scheduler,\n    lastOnNext: 0\n  }));\n};\n\nmodule.exports = function throttle(source, windowDuration, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  var duration = +windowDuration || 0;\n  if (duration <= 0) { throw new RangeError('windowDuration cannot be less or equal zero.'); }\n  return new ThrottleObservable(source, duration, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/throw.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar Disposable = require('../disposable');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction scheduleItem(s, state) {\n  var e = state[0], o = state[1];\n  o.onError(e);\n  return Disposable.empty;\n}\n\nfunction ThrowObservable(error, scheduler) {\n  this._error = error;\n  this._scheduler = scheduler;\n  ObservableBase.call(this);\n}\n\ninherits(ThrowObservable, ObservableBase);\n\nThrowObservable.prototype.subscribeCore = function (o) {\n  var state = [this._error, o];\n  return this._scheduler === Scheduler.immediate ?\n    scheduleItem(null, state) :\n    this._scheduler.schedule(state, scheduleItem);\n};\n\nmodule.exports = function throwError(error, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.immediate);\n  return new ThrowObservable(error, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/timeinterval.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction TimeIntervalObserver(o, s) {\n  this._o = o;\n  this._s = s;\n  this._l = s.now();\n  AbstractObserver.call(this);\n}\n\ninherits(TimeIntervalObserver, AbstractObserver);\n\nTimeIntervalObserver.prototype.next = function (x) {\n  var now = this._s.now(), span = now - this._l;\n  this._l = now;\n  this._o.onNext({ value: x, interval: span });\n};\nTimeIntervalObserver.prototype.error = function (e) { this._o.onError(e); };\nTimeIntervalObserver.prototype.completed = function () { this._o.onCompleted(); };\n\nfunction TimeIntervalObservable(source, s) {\n  this.source = source;\n  this._s = s;\n  ObservableBase.call(this);\n}\n\ninherits(TimeIntervalObservable, ObservableBase);\n\nTimeIntervalObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new TimeIntervalObserver(o, this._s));\n};\n\nmodule.exports = function timeInterval (source, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  return new TimeIntervalObservable(source, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/timer.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar defer = require('./defer');\nvar interval = require('./interval');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction TimerObservable(dt, s) {\n  this._dt = dt;\n  this._s = s;\n  ObservableBase.call(this);\n}\n\ninherits(TimerObservable, ObservableBase);\n\nfunction scheduleTimer(s, o) {\n  o.onNext(0);\n  o.onCompleted();\n}\n\nTimerObservable.prototype.subscribeCore = function (o) {\n  return this._s.scheduleFuture(o, this._dt, scheduleTimer);\n};\n\nfunction TimerPeriodObservable(dt, period, scheduler) {\n  this._dt = dt;\n  this._period = Scheduler.normalize(period);\n  this._scheduler = scheduler;\n  ObservableBase.call(this);\n}\n\ninherits(TimerPeriodObservable, ObservableBase);\n\nfunction scheduleTimerPeriod(state, recurse) {\n  if (state.p > 0) {\n    var now = state.scheduler.now();\n    state.dt = new Date(state.dt.getTime() + state.p);\n    state.dt.getTime() <= now && (state.dt = new Date(now + state.p));\n  }\n  state.o.onNext(state.i++);\n  recurse(state, new Date(state.dt));\n}\n\nTimerPeriodObservable.prototype.subscribeCore = function (o) {\n  var state = {\n    o: o,\n    i: 0,\n    p: this._period,\n    dt: this._dt,\n    scheduler: this._scheduler\n  };\n  return this._scheduler.scheduleRecursiveFuture(state, this._dt, scheduleTimerPeriod);\n};\n\nfunction timerRelativeAndPeriod(dt, period, scheduler) {\n  if (dt === period) { return interval(dt, scheduler); }\n  return defer(function () {\n    return new TimerPeriodObservable(new Date(scheduler.now() + dt), period, scheduler);\n  });\n}\n\n/**\n *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n */\nmodule.exports = function timer (dueTime, periodOrScheduler, scheduler) {\n  var period;\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  if (periodOrScheduler != null && typeof periodOrScheduler === 'number') {\n    period = periodOrScheduler;\n  } else if (Scheduler.isScheduler(periodOrScheduler)) {\n    scheduler = periodOrScheduler;\n  }\n  if ((dueTime instanceof Date || typeof dueTime === 'number') && period === undefined) {\n    return new TimerObservable(dueTime, scheduler);\n  }\n  if (dueTime instanceof Date && period !== undefined) {\n    return new TimerPeriodObservable(dueTime, periodOrScheduler, scheduler);\n  }\n  return timerRelativeAndPeriod(dueTime, period, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/timestamp.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction TimestampObserver(o, s) {\n  this._o = o;\n  this._s = s;\n  AbstractObserver.call(this);\n}\n\ninherits(TimestampObserver, AbstractObserver);\n\nTimestampObserver.prototype.next = function (x) { this._o.onNext({ value: x, timestamp: this._s.now() }); };\nTimestampObserver.prototype.error = function (e) { this._o.onError(e); };\nTimestampObserver.prototype.completed = function () { this._o.onCompleted(); };\n\n\nfunction TimestampObservable(source, s) {\n  this.source = source;\n  this._s = s;\n  ObservableBase.call(this);\n}\n\ninherits(TimestampObservable, ObservableBase);\n\nTimestampObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new TimestampObserver(o, this._s));\n};\n\nmodule.exports = function timestamp (source, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  return new TimestampObservable(source, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/toarray.js",
    "content": "'use strict';\n\nvar AbstractObserver = require('../observer/abstractobserver');\nvar ObservableBase = require('./observablebase');\nvar inherits = require('inherits');\n\nfunction ToArrayObserver(o) {\n  this.o = o;\n  this.a = [];\n  AbstractObserver.call(this);\n}\n\ninherits(ToArrayObserver, AbstractObserver);\n\nToArrayObserver.prototype.next = function (x) { this.a.push(x); };\nToArrayObserver.prototype.error = function (e) { this.o.onError(e);  };\nToArrayObserver.prototype.completed = function () { this.o.onNext(this.a); this.o.onCompleted(); };\n\nfunction ToArrayObservable(source) {\n  this.source = source;\n  ObservableBase.call(this);\n}\n\ninherits(ToArrayObservable, ObservableBase);\n\nToArrayObservable.prototype.subscribeCore = function(o) {\n  return this.source.subscribe(new ToArrayObserver(o));\n};\n\n/**\n* Creates an array from an observable sequence.\n* @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n*/\nmodule.exports = function toArray(o) {\n  return new ToArrayObservable(o);\n};\n"
  },
  {
    "path": "src/modular/observable/toasync.js",
    "content": "'use strict';\n\nvar AsyncSubject = require('../asyncsubject');\nvar asObservable = require('./asobservable');\nvar Scheduler = require('../scheduler');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\n\nfunction scheduleMethod(s, state) {\n  var result = tryCatch(state.func).apply(state.context, state.args);\n  if (result === errorObj) { return state.subject.onError(result.e); }\n  state.subject.onNext(result);\n  state.subject.onCompleted();\n}\n\nmodule.exports = function toAsync(func, context, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  return function asyncFn () {\n    var subject = new AsyncSubject(), len = arguments.length, args = new Array(len);\n    for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n    var state = {\n      subject: subject,\n      args: args,\n      func: func,\n      context: context\n    };\n\n    scheduler.schedule(state, scheduleMethod);\n    return asObservable(subject);\n  };\n};\n"
  },
  {
    "path": "src/modular/observable/tomap.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction ToMapObserver(o, k, e) {\n  this._o = o;\n  this._k = k;\n  this._e = e;\n  this._m = new global.Map();\n  AbstractObserver.call(this);\n}\n\ninherits(ToMapObserver, AbstractObserver);\n\nToMapObserver.prototype.next = function (x) {\n  var key = tryCatch(this._k)(x);\n  if (key === errorObj) { return this._o.onError(key.e); }\n  var elem = x;\n  if (this._e) {\n    elem = tryCatch(this._e)(x);\n    if (elem === errorObj) { return this._o.onError(elem.e); }\n  }\n\n  this._m.set(key, elem);\n};\n\nToMapObserver.prototype.error = function (e) {\n  this._o.onError(e);\n};\n\nToMapObserver.prototype.completed = function () {\n  this._o.onNext(this._m);\n  this._o.onCompleted();\n};\n\nfunction ToMapObservable(source, k, e) {\n  this.source = source;\n  this._k = k;\n  this._e = e;\n  ObservableBase.call(this);\n}\n\ninherits(ToMapObservable, ObservableBase);\n\nToMapObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new ToMapObserver(o, this._k, this._e));\n};\n\nmodule.exports = function toMap(source, keySelector, elementSelector) {\n  if (typeof global.Map === 'undefined') { throw new TypeError(); }\n  return new ToMapObservable(source, keySelector, elementSelector);\n};\n"
  },
  {
    "path": "src/modular/observable/topromise.js",
    "content": "'use strict';\n\nmodule.exports = function toPromise(source, promiseCtor) {\n  promiseCtor || (promiseCtor = global.Promise);\n  return new promiseCtor(function (resolve, reject) {\n    // No cancellation can be done\n    var value;\n    source.subscribe(function (v) {\n      value = v;\n    }, reject, function () {\n      resolve(value);\n    });\n  });\n};\n"
  },
  {
    "path": "src/modular/observable/toset.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar inherits = require('inherits');\n\nfunction ToSetObserver(o) {\n  this._o = o;\n  this._s = new global.Set();\n  AbstractObserver.call(this);\n}\n\ninherits(ToSetObserver, AbstractObserver);\n\nToSetObserver.prototype.next = function (x) { this._s.add(x); };\nToSetObserver.prototype.error = function (e) { this._o.onError(e); };\nToSetObserver.prototype.completed = function () {\n  this._o.onNext(this._s);\n  this._o.onCompleted();\n};\n\nfunction ToSetObservable(source) {\n  this.source = source;\n  ObservableBase.call(this);\n}\n\ninherits(ToSetObservable, ObservableBase);\n\nToSetObservable.prototype.subscribeCore = function (o) {\n  return this.source.subscribe(new ToSetObserver(o));\n};\n\nmodule.exports = function toSet (source) {\n  if (typeof global.Set === 'undefined') { throw new TypeError(); }\n  return new ToSetObservable(source);\n};\n"
  },
  {
    "path": "src/modular/observable/transduce.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction TransduceObserver(o, xform) {\n  this._o = o;\n  this._xform = xform;\n  AbstractObserver.call(this);\n}\n\ninherits(TransduceObserver, AbstractObserver);\n\nTransduceObserver.prototype.next = function (x) {\n  var res = tryCatch(this._xform['@@transducer/step']).call(this._xform, this._o, x);\n  if (res === errorObj) { this._o.onError(res.e); }\n};\n\nTransduceObserver.prototype.error = function (e) { this._o.onError(e); };\n\nTransduceObserver.prototype.completed = function () {\n  this._xform['@@transducer/result'](this._o);\n};\n\nfunction transformForObserver(o) {\n  return {\n    '@@transducer/init': function() {\n      return o;\n    },\n    '@@transducer/step': function(obs, input) {\n      return obs.onNext(input);\n    },\n    '@@transducer/result': function(obs) {\n      return obs.onCompleted();\n    }\n  };\n}\n\nfunction TransduceObservable(source, transducer) {\n  this.source = source;\n  this._transducer = transducer;\n  ObservableBase.call(this);\n}\n\ninherits(TransduceObservable, ObservableBase);\n\nTransduceObservable.prototype.subscribeCore = function (o) {\n  var xform = this._transducer(transformForObserver(o));\n  return this.source.subscribe(new TransduceObserver(o, xform));\n};\n\nmodule.exports = function transduce (source, transducer) {\n  return new TransduceObservable(source, transducer);\n};\n"
  },
  {
    "path": "src/modular/observable/using.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar throwError = require('./throw');\nvar BinaryDisposable = require('../binarydisposable');\nvar Disposable = require('../disposable');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\nvar inherits = require('inherits');\n\nfunction UsingObservable(resFn, obsFn) {\n  this._resFn = resFn;\n  this._obsFn = obsFn;\n  ObservableBase.call(this);\n}\n\ninherits(UsingObservable, ObservableBase);\n\nUsingObservable.prototype.subscribeCore = function (o) {\n  var disposable = Disposable.empty;\n  var resource = tryCatch(this._resFn)();\n  if (resource === errorObj) {\n    return new BinaryDisposable(throwError(resource.e).subscribe(o), disposable);\n  }\n  resource && (disposable = resource);\n  var source = tryCatch(this._obsFn)(resource);\n  if (source === errorObj) {\n    return new BinaryDisposable(throwError(source.e).subscribe(o), disposable);\n  }\n  return new BinaryDisposable(source.subscribe(o), disposable);\n};\n\n/**\n * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n * @param {Function} resourceFactory Factory function to obtain a resource object.\n * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n */\nmodule.exports = function using (resourceFactory, observableFactory) {\n  return new UsingObservable(resourceFactory, observableFactory);\n};\n"
  },
  {
    "path": "src/modular/observable/when.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar throwError = require('./throw');\nvar CompositeDisposable = require('../compositedisposable');\nvar inherits = require('inherits');\n\nrequire('es6-map/implement');\n\nfunction WhenObserver(map, o) {\n  this._map = map;\n  this._o = o;\n  AbstractObserver.call(this);\n}\n\ninherits(WhenObserver, AbstractObserver);\n\nWhenObserver.prototype.next = function (x) { this._o.onNext(x); };\nWhenObserver.prototype.completed = function () { this._o.onCompleted(); };\nWhenObserver.prototype.error = function (e) {\n  this._map.forEach(function (v) { v.onError(e); });\n  this._o.onError(e);\n};\n\nfunction WhenObservable(plans) {\n  this._plans = plans;\n  ObservableBase.call(this);\n}\n\ninherits(WhenObservable, ObservableBase);\n\nWhenObservable.prototype.subscribeCore = function (o) {\n  var activePlans = [],\n      externalSubscriptions = new global.Map(),\n      outObserver = new WhenObserver(externalSubscriptions, o);\n\n  try {\n    for (var i = 0, len = this._plans.length; i < len; i++) {\n      activePlans.push(this._plans[i].activate(externalSubscriptions, outObserver, function (activePlan) {\n        var idx = activePlans.indexOf(activePlan);\n        activePlans.splice(idx, 1);\n        activePlans.length === 0 && o.onCompleted();\n      }));\n    }\n  } catch (e) {\n    return throwError(e).subscribe(o);\n  }\n  var group = new CompositeDisposable();\n  externalSubscriptions.forEach(function (joinObserver) {\n    joinObserver.subscribe();\n    group.add(joinObserver);\n  });\n\n  return group;\n};\n\n/**\n *  Joins together the results from several patterns.\n *\n *  @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns.\n *  @returns {Observable} Observable sequence with the results form matching several patterns.\n */\nmodule.exports = function when() {\n  var len = arguments.length, plans = new Array(len);\n  for(var i = 0; i < len; i++) { plans[i] = arguments[i]; }\n  return new WhenObservable(plans);\n};\n"
  },
  {
    "path": "src/modular/observable/window.js",
    "content": "'use strict';\n\nvar CompositeDisposable = require('../compositedisposable');\nvar RefCountDisposable = require('../refcountdisposable');\nvar SerialDisposable = require('../serialdisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar AnonymousObservable = require('./anonymousobservable');\nvar Subject = require('../subject');\nvar empty = require('./empty');\nvar fromPromise = require('./frompromise');\nvar groupJoin = require('./groupjoin');\nvar take = require('./take');\nvar addRef = require('../internal/addref');\nvar isPromise = require('../helpers/ispromise');\nvar isFunction = require('../helpers/isfunction');\nvar noop = require('../helpers/noop');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\n\nfunction returnWindow(x, win) { return win; }\n\nfunction observableWindowWithOpenings(source, windowOpenings, windowClosingSelector) {\n  return groupJoin(windowOpenings, source, windowClosingSelector, empty, returnWindow);\n}\n\nfunction observableWindowWithBoundaries(source, windowBoundaries) {\n  return new AnonymousObservable(function (o) {\n    var win = new Subject(),\n      d = new CompositeDisposable(),\n      r = new RefCountDisposable(d);\n\n    o.onNext(addRef(win, r));\n\n    d.add(source.subscribe(function (x) {\n      win.onNext(x);\n    }, function (err) {\n      win.onError(err);\n      o.onError(err);\n    }, function () {\n      win.onCompleted();\n      o.onCompleted();\n    }));\n\n    isPromise(windowBoundaries) && (windowBoundaries = fromPromise(windowBoundaries));\n\n    d.add(windowBoundaries.subscribe(function () {\n      win.onCompleted();\n      win = new Subject();\n      o.onNext(addRef(win, r));\n    }, function (err) {\n      win.onError(err);\n      o.onError(err);\n    }, function () {\n      win.onCompleted();\n      o.onCompleted();\n    }));\n\n    return r;\n  }, source);\n}\n\nfunction observableWindowWithClosingSelector(source, windowClosingSelector) {\n  return new AnonymousObservable(function (o) {\n    var m = new SerialDisposable(),\n      d = new CompositeDisposable(m),\n      r = new RefCountDisposable(d),\n      win = new Subject();\n    o.onNext(addRef(win, r));\n    d.add(source.subscribe(function (x) {\n        win.onNext(x);\n    }, function (err) {\n        win.onError(err);\n        o.onError(err);\n    }, function () {\n        win.onCompleted();\n        o.onCompleted();\n    }));\n\n    function createWindowClose () {\n      var windowClose = tryCatch(windowClosingSelector)();\n      if (windowClose === errorObj) {\n        return o.onError(windowClose.e);\n      }\n      isPromise(windowClose) && (windowClose = fromPromise(windowClose));\n\n      var m1 = new SingleAssignmentDisposable();\n      m.setDisposable(m1);\n      m1.setDisposable(take(windowClose, 1).subscribe(noop, function (err) {\n        win.onError(err);\n        o.onError(err);\n      }, function () {\n        win.onCompleted();\n        win = new Subject();\n        o.onNext(addRef(win, r));\n        createWindowClose();\n      }));\n    }\n\n    createWindowClose();\n    return r;\n  }, source);\n}\n\n/**\n *  Projects each element of an observable sequence into zero or more windows.\n *\n *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n *  @returns {Observable} An observable sequence of windows.\n */\nmodule.exports = function window (source, windowOpeningsOrClosingSelector, windowClosingSelector) {\n  if (!windowClosingSelector && !isFunction(windowOpeningsOrClosingSelector)) {\n    return observableWindowWithBoundaries(source, windowOpeningsOrClosingSelector);\n  }\n  return isFunction(windowOpeningsOrClosingSelector) ?\n    observableWindowWithClosingSelector(source, windowOpeningsOrClosingSelector) :\n    observableWindowWithOpenings(source, windowOpeningsOrClosingSelector, windowClosingSelector);\n};\n"
  },
  {
    "path": "src/modular/observable/windowcount.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar Subject = require('../subject');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar RefCountDisposable = require('../refcountdisposable');\nvar ArgumentOutOfRangeError = require('../internal/errors').ArgumentOutOfRangeError;\nvar addRef = require('../internal/addref');\nvar inherits = require('inherits');\n\nfunction createWindow(state) {\n  var s = new Subject();\n  state.q.push(s);\n  state.o.onNext(addRef(s, state.refCountDisposable));\n}\n\nfunction WindowCountObserver(state) {\n  this._s = state;\n  AbstractObserver.call(this);\n}\n\ninherits(WindowCountObserver, AbstractObserver);\n\nWindowCountObserver.prototype.next = function (x) {\n  for (var i = 0, len = this._s.q.length; i < len; i++) { this._s.q[i].onNext(x); }\n  var c = this._s.n - this._s.count + 1;\n  c >= 0 && c % this._s.skip === 0 && this._s.q.shift().onCompleted();\n  ++this._s.n % this._s.skip === 0 && createWindow(this._s);\n};\n\nWindowCountObserver.prototype.error = function (e) {\n  while (this._s.q.length > 0) { this._s.q.shift().onError(e); }\n  this._s.o.onError(e);\n};\n\nWindowCountObserver.prototype.completed = function () {\n  while (this._s.q.length > 0) { this._s.q.shift().onCompleted(); }\n  this._s.o.onCompleted();\n};\n\nfunction WindowCountObservable(source, count, skip) {\n  this.source = source;\n  this._count = count;\n  this._skip = skip;\n  ObservableBase.call(this);\n}\n\ninherits(WindowCountObservable, ObservableBase);\n\nWindowCountObservable.prototype.subscribeCore = function (o) {\n  var m = new SingleAssignmentDisposable(),\n    refCountDisposable = new RefCountDisposable(m);\n\n  var state = {\n    m: m,\n    refCountDisposable: refCountDisposable,\n    q: [],\n    n: 0,\n    count: this._count,\n    skip: this._skip,\n    o: o\n  };\n\n  createWindow(state);\n  m.setDisposable(this.source.subscribe(new WindowCountObserver(state)));\n\n  return refCountDisposable;\n};\n\nmodule.exports = function (source, count, skip) {\n  +count || (count = 0);\n  Math.abs(count) === Infinity && (count = 0);\n  if (count <= 0) { throw new ArgumentOutOfRangeError(); }\n  skip == null && (skip = count);\n  +skip || (skip = 0);\n  Math.abs(skip) === Infinity && (skip = 0);\n\n  if (skip <= 0) { throw new ArgumentOutOfRangeError(); }\n  return new WindowCountObservable(source, count, skip);\n};\n"
  },
  {
    "path": "src/modular/observable/windowed.js",
    "content": "'use strict';\n\nvar Observable = require('../observable');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar BinaryDisposable = require('../binarydisposable');\nvar inherits = require('inherits');\n\nfunction WindowedObserver(observer, observable, scheduler, cancel) {\n  this.observer = observer;\n  this.observable = observable;\n  this.scheduler = scheduler;\n  this.cancel = cancel;\n  this.received = 0;\n  this.scheduleDisposable = null;\n  AbstractObserver.call(this);\n}\n\ninherits(WindowedObserver, AbstractObserver);\n\nWindowedObserver.prototype.completed = function () {\n  this.observer.onCompleted();\n  this.dispose();\n};\n\nWindowedObserver.prototype.error = function (error) {\n  this.observer.onError(error);\n  this.dispose();\n};\n\nfunction innerScheduleMethod(s, self) {\n  return self.observable.source.request(self.observable.windowSize);\n}\n\nWindowedObserver.prototype.next = function (value) {\n  this.observer.onNext(value);\n  this.received = ++this.received % this.observable.windowSize;\n  this.received === 0 && (this.scheduleDisposable = this.scheduler.schedule(this, innerScheduleMethod));\n};\n\nWindowedObserver.prototype.dispose = function () {\n  this.observer = null;\n  if (this.cancel) {\n    this.cancel.dispose();\n    this.cancel = null;\n  }\n  if (this.scheduleDisposable) {\n    this.scheduleDisposable.dispose();\n    this.scheduleDisposable = null;\n  }\n  AbstractObserver.prototype.dispose.call(this);\n};\n\nfunction WindowedObservable(source, windowSize, scheduler) {\n  this.source = source;\n  this.windowSize = windowSize;\n  this.scheduler = scheduler;\n  Observable.call(this);\n}\n\ninherits(WindowedObservable, Observable);\n\nfunction scheduleMethod(s, self) {\n  return self.source.request(self.windowSize);\n}\n\nWindowedObservable.prototype._subscribe = function (o) {\n  this.subscription = this.source.subscribe(new WindowedObserver(o, this, this.scheduler, this.subscription));\n  return new BinaryDisposable(\n    this.subscription,\n    this.scheduler.schedule(this, scheduleMethod)\n  );\n};\n\nmodule.exports = WindowedObservable;\n"
  },
  {
    "path": "src/modular/observable/windowtime.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar Subject = require('../subject');\nvar CompositeDisposable = require('../compositedisposable');\nvar RefCountDisposable = require('../refcountdisposable');\nvar SerialDisposable = require('../serialdisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar addRef = require('../internal/addref');\nvar Scheduler = require('../scheduler');\nvar inherits = require('inherits');\n\nfunction WindowTimeObserver(state) {\n  this._state = state;\n  AbstractObserver.call(this);\n}\n\ninherits(WindowTimeObserver, AbstractObserver);\n\nWindowTimeObserver.prototype.next = function (x) {\n  for (var i = 0, len = this._state.q.length; i < len; i++) { this._state.q[i].onNext(x); }\n};\n\nWindowTimeObserver.prototype.error = function (e) {\n  for (var i = 0, len = this._state.q.length; i < len; i++) { this._state.q[i].onError(e); }\n  this._state.o.onError(e);\n};\n\nWindowTimeObserver.prototype.completed = function () {\n  for (var i = 0, len = this._state.q.length; i < len; i++) { this._state.q[i].onCompleted(); }\n  this._state.o.onCompleted();\n};\n\nfunction WindowTimeObservable(source, timeSpan, timeShift, scheduler) {\n\tthis.source = source;\n\tthis._timeSpan = timeSpan;\n\tthis._timeShift = timeShift;\n\tthis._scheduler = scheduler;\n\tObservableBase.call(this);\n}\n\ninherits(WindowTimeObservable, ObservableBase);\n\nWindowTimeObservable.prototype.subscribeCore = function (o) {\n\tvar self = this;\n\tvar groupDisposable,\n\t\tnextShift = self._timeShift,\n\t\tnextSpan = self._timeSpan,\n\t\tq = [],\n\t\trefCountDisposable,\n\t\ttimerD = new SerialDisposable(),\n\t\ttotalTime = 0;\n\t\tgroupDisposable = new CompositeDisposable(timerD),\n\t\trefCountDisposable = new RefCountDisposable(groupDisposable);\n\n\tfunction createTimer () {\n\t\tvar m = new SingleAssignmentDisposable(),\n\t\t\tisSpan = false,\n\t\t\tisShift = false;\n\t\ttimerD.setDisposable(m);\n\t\tif (nextSpan === nextShift) {\n\t\t  isSpan = true;\n\t\t  isShift = true;\n\t\t} else if (nextSpan < nextShift) {\n\t\t\tisSpan = true;\n\t\t} else {\n\t\t\tisShift = true;\n\t\t}\n\t\tvar newTotalTime = isSpan ? nextSpan : nextShift,\n\t\t\tts = newTotalTime - totalTime;\n\t\ttotalTime = newTotalTime;\n\t\tif (isSpan) {\n\t\t\tnextSpan += self._timeShift;\n\t\t}\n\t\tif (isShift) {\n\t\t\tnextShift += self._timeShift;\n\t\t}\n\t\tm.setDisposable(self._scheduler.scheduleFuture(null, ts, function () {\n\t\t\tif (isShift) {\n\t\t\t\tvar s = new Subject();\n\t\t\t\tq.push(s);\n\t\t\t\to.onNext(addRef(s, refCountDisposable));\n\t\t\t}\n\t\t\tisSpan && q.shift().onCompleted();\n\t\t\tcreateTimer();\n\t\t}));\n\t}\n\tq.push(new Subject());\n\to.onNext(addRef(q[0], refCountDisposable));\n\tcreateTimer();\n\tgroupDisposable.add(self.source.subscribe(new WindowTimeObserver({q: q, o: o})));\n\treturn refCountDisposable;\n};\n\nmodule.exports = function (source, timeSpan, timeShiftOrScheduler, scheduler) {\n\tvar timeShift;\n\ttimeShiftOrScheduler == null && (timeShift = timeSpan);\n\tScheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n\tif (typeof timeShiftOrScheduler === 'number') {\n\t\ttimeShift = timeShiftOrScheduler;\n\t} else if (Scheduler.isScheduler(timeShiftOrScheduler)) {\n\t\ttimeShift = timeSpan;\n\t\tscheduler = timeShiftOrScheduler;\n\t}\n\treturn new WindowTimeObservable(source, timeSpan, timeShift, scheduler);\n};\n"
  },
  {
    "path": "src/modular/observable/windowtimeorcount.js",
    "content": "'use strict';\n\nvar AnonymousObservable = require('./anonymousobservable');\nvar Subject = require('../subject');\nvar CompositeDisposable = require('../compositedisposable');\nvar RefCountDisposable = require('../refcountdisposable');\nvar SerialDisposable = require('../serialdisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar addRef = require('../internal/addref');\nvar Scheduler = require('../scheduler');\n\nmodule.exports = function windowTimeOrCount (source, timeSpan, count, scheduler) {\n  Scheduler.isScheduler(scheduler) || (scheduler = Scheduler.async);\n  return new AnonymousObservable(function (observer) {\n    var timerD = new SerialDisposable(),\n        groupDisposable = new CompositeDisposable(timerD),\n        refCountDisposable = new RefCountDisposable(groupDisposable),\n        n = 0,\n        windowId = 0,\n        s = new Subject();\n\n    function createTimer(id) {\n      var m = new SingleAssignmentDisposable();\n      timerD.setDisposable(m);\n      m.setDisposable(scheduler.scheduleFuture(null, timeSpan, function () {\n        if (id !== windowId) { return; }\n        n = 0;\n        var newId = ++windowId;\n        s.onCompleted();\n        s = new Subject();\n        observer.onNext(addRef(s, refCountDisposable));\n        createTimer(newId);\n      }));\n    }\n\n    observer.onNext(addRef(s, refCountDisposable));\n    createTimer(0);\n\n    groupDisposable.add(source.subscribe(\n      function (x) {\n        var newId = 0, newWindow = false;\n        s.onNext(x);\n        if (++n === count) {\n          newWindow = true;\n          n = 0;\n          newId = ++windowId;\n          s.onCompleted();\n          s = new Subject();\n          observer.onNext(addRef(s, refCountDisposable));\n        }\n        newWindow && createTimer(newId);\n      },\n      function (e) {\n        s.onError(e);\n        observer.onError(e);\n      }, function () {\n        s.onCompleted();\n        observer.onCompleted();\n      }\n    ));\n    return refCountDisposable;\n  }, source);\n};\n"
  },
  {
    "path": "src/modular/observable/withlatestfrom.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar NAryDisposable = require('../narydisposable');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar identity = require('../helpers/identity');\nvar noop = require('../helpers/noop');\nvar isFunction = require('../helpers/isfunction');\nvar inherits = require('inherits');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\n\nfunction falseFactory() { return false; }\nfunction initializeArray (n, fn) {\n  var results = new Array(n);\n  for (var i = 0; i < n; i++) {\n    results[i] = fn(i);\n  }\n  return results;\n}\nfunction argumentsToArray() {\n  var len = arguments.length, args = new Array(len);\n  for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return args;\n}\n\nfunction WithLatestFromOtherObserver(o, i, state) {\n  this._o = o;\n  this._i = i;\n  this._state = state;\n  AbstractObserver.call(this);\n}\n\ninherits(WithLatestFromOtherObserver, AbstractObserver);\n\nWithLatestFromOtherObserver.prototype.next = function (x) {\n  this._state.values[this._i] = x;\n  this._state.hasValue[this._i] = true;\n  this._state.hasValueAll = this._state.hasValue.every(identity);\n};\n\nWithLatestFromOtherObserver.prototype.error = function (e) { this._o.onError(e); };\nWithLatestFromOtherObserver.prototype.completed = noop;\n\nfunction WithLatestFromSourceObserver(o, cb, state) {\n  this._o = o;\n  this._cb = cb;\n  this._state = state;\n  AbstractObserver.call(this);\n}\n\ninherits(WithLatestFromSourceObserver, AbstractObserver);\n\nWithLatestFromSourceObserver.prototype.next = function (x) {\n  var allValues = [x].concat(this._state.values);\n  if (!this._state.hasValueAll) { return; }\n  var res = tryCatch(this._cb).apply(null, allValues);\n  if (res === errorObj) { return this._o.onError(res.e); }\n  this._o.onNext(res);\n};\n\nWithLatestFromSourceObserver.prototype.error = function (e) { this._o.onError(e); };\nWithLatestFromSourceObserver.prototype.completed = function () { this._o.onCompleted(); };\n\nfunction WithLatestFromObservable(source, sources, resultSelector) {\n  this._s = source;\n  this._ss = sources;\n  this._cb = resultSelector;\n  ObservableBase.call(this);\n}\n\ninherits(WithLatestFromObservable, ObservableBase);\n\nWithLatestFromObservable.prototype.subscribeCore = function (o) {\n  var len = this._ss.length;\n  var state = {\n    hasValue: initializeArray(len, falseFactory),\n    hasValueAll: false,\n    values: new Array(len)\n  };\n\n  var n = this._ss.length, subscriptions = new Array(n + 1);\n  for (var i = 0; i < n; i++) {\n    var other = this._ss[i], sad = new SingleAssignmentDisposable();\n    isPromise(other) && (other = fromPromise(other));\n    sad.setDisposable(other.subscribe(new WithLatestFromOtherObserver(o, i, state)));\n    subscriptions[i] = sad;\n  }\n\n  var outerSad = new SingleAssignmentDisposable();\n  outerSad.setDisposable(this._s.subscribe(new WithLatestFromSourceObserver(o, this._cb, state)));\n  subscriptions[n] = outerSad;\n\n  return new NAryDisposable(subscriptions);\n};\n\n/**\n * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n */\nmodule.exports = function withLatestFrom () {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n\n  return new WithLatestFromObservable(args[0], args.slice(1), resultSelector);\n};\n"
  },
  {
    "path": "src/modular/observable/zip.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar NAryDisposable = require('../narydisposable');\nvar fromPromise = require('./frompromise');\nvar isPromise = require('../helpers/ispromise');\nvar identity = require('../helpers/identity');\nvar isFunction = require('../helpers/isfunction');\nvar inherits = require('inherits');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\n\nfunction falseFactory() { return false; }\nfunction emptyArrayFactory() { return []; }\nfunction initializeArray (n, fn) {\n  var results = new Array(n);\n  for (var i = 0; i < n; i++) {\n    results[i] = fn(i);\n  }\n  return results;\n}\nfunction argumentsToArray() {\n  var len = arguments.length, args = new Array(len);\n  for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return args;\n}\n\nfunction ZipObserver(o, i, p, q, d) {\n  this._o = o;\n  this._i = i;\n  this._p = p;\n  this._q = q;\n  this._d = d;\n  AbstractObserver.call(this);\n}\n\ninherits(ZipObserver, AbstractObserver);\n\nfunction notEmpty(x) { return x.length > 0; }\nfunction shiftEach(x) { return x.shift(); }\nfunction notTheSame(i) { return function (x, j) { return j !== i; }; }\n\nZipObserver.prototype.next = function (x) {\n  this._q[this._i].push(x);\n  if (this._q.every(notEmpty)) {\n    var queuedValues = this._q.map(shiftEach);\n    var res = tryCatch(this._p._cb).apply(null, queuedValues);\n    if (res === errorObj) { return this._o.onError(res.e); }\n    this._o.onNext(res);\n  } else if (this._d.filter(notTheSame(this._i)).every(identity)) {\n    this._o.onCompleted();\n  }\n};\n\nZipObserver.prototype.error = function (e) { this._o.onError(e); };\nZipObserver.prototype.completed = function () {\n  this._d[this._i] = true;\n  this._d.every(identity) && this._o.onCompleted();\n};\n\n\nfunction ZipObservable(s, cb) {\n  this._s = s;\n  this._cb = cb;\n  ObservableBase.call(this);\n}\n\ninherits(ZipObservable, ObservableBase);\n\nZipObservable.prototype.subscribeCore = function(observer) {\n  var n = this._s.length,\n      subscriptions = new Array(n),\n      done = initializeArray(n, falseFactory),\n      q = initializeArray(n, emptyArrayFactory);\n\n  for (var i = 0; i < n; i++) {\n    var source = this._s[i], sad = new SingleAssignmentDisposable();\n    subscriptions[i] = sad;\n    isPromise(source) && (source = fromPromise(source));\n    sad.setDisposable(source.subscribe(new ZipObserver(observer, i, this, q, done)));\n  }\n\n  return new NAryDisposable(subscriptions);\n};\n\n/**\n* Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n* The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n* @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n*/\nmodule.exports = function zip () {\n  if (arguments.length === 0) { throw new Error('invalid arguments'); }\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n  return new ZipObservable(args, resultSelector);\n};\n"
  },
  {
    "path": "src/modular/observable/zipiterable.js",
    "content": "'use strict';\n\nvar ObservableBase = require('./observablebase');\nvar observableFrom = require('./from');\nvar AbstractObserver = require('../observer/abstractobserver');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar NAryDisposable = require('../narydisposable');\nvar identity = require('../helpers/identity');\nvar isFunction = require('../helpers/isfunction');\nvar isArrayLike = require('../helpers/isarraylike');\nvar isIterable = require('../helpers/isiterable');\nvar inherits = require('inherits');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj;\n\nfunction falseFactory() { return false; }\nfunction emptyArrayFactory() { return []; }\nfunction initializeArray (n, fn) {\n  var results = new Array(n);\n  for (var i = 0; i < n; i++) {\n    results[i] = fn(i);\n  }\n  return results;\n}\nfunction argumentsToArray() {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  return args;\n}\n\nfunction ZipIterableObserver(s, i) {\n  this._s = s;\n  this._i = i;\n  AbstractObserver.call(this);\n}\n\ninherits(ZipIterableObserver, AbstractObserver);\n\nfunction notEmpty(x) { return x.length > 0; }\nfunction shiftEach(x) { return x.shift(); }\nfunction notTheSame(i) { return function (x, j) { return j !== i; }; }\n\nZipIterableObserver.prototype.next = function (x) {\n  this._s.q[this._i].push(x);\n  if (this._s.q.every(notEmpty)) {\n    var queuedValues = this._s.q.map(shiftEach),\n        res = tryCatch(this._s.cb).apply(null, queuedValues);\n    if (res === errorObj) { return this._s.o.onError(res.e); }\n    this._s.o.onNext(res);\n  } else if (this._s.done.filter(notTheSame(this._i)).every(identity)) {\n    this._s.o.onCompleted();\n  }\n};\n\nZipIterableObserver.prototype.error = function (e) { this._s.o.onError(e); };\n\nZipIterableObserver.prototype.completed = function () {\n  this._s.done[this._i] = true;\n  this._s.done.every(identity) && this._s.o.onCompleted();\n};\n\nfunction ZipIterableObservable(sources, cb) {\n  this._sources = sources;\n  this._cb = cb;\n  ObservableBase.call(this);\n}\n\ninherits(ZipIterableObservable, ObservableBase);\n\nZipIterableObservable.prototype.subscribeCore = function (o) {\n  var sources = this._sources, len = sources.length, subscriptions = new Array(len);\n\n  var state = {\n    q: initializeArray(len, emptyArrayFactory),\n    done: initializeArray(len, falseFactory),\n    cb: this._cb,\n    o: o\n  };\n\n  for (var i = 0; i < len; i++) {\n    (function (i) {\n      var source = sources[i], sad = new SingleAssignmentDisposable();\n      (isArrayLike(source) || isIterable(source)) && (source = observableFrom(source));\n      subscriptions[i] = sad;\n      sad.setDisposable(source.subscribe(new ZipIterableObserver(state, i)));\n    }(i));\n  }\n\n  return new NAryDisposable(subscriptions);\n};\n\n/**\n * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n */\nmodule.exports = function zipIterable() {\n  var len = arguments.length, args = new Array(len);\n  for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  var resultSelector = isFunction(args[len - 1]) ? args.pop() : argumentsToArray;\n  return new ZipIterableObservable(args, resultSelector);\n};\n"
  },
  {
    "path": "src/modular/observable.js",
    "content": "'use strict';\n\nvar create = require('./observer/create');\nvar isFunction = require('./helpers/isfunction');\n\nfunction Observable() { }\n\n/**\n* Determines whether the given object is an Observable\n* @param {Any} An object to determine whether it is an Observable\n* @returns {Boolean} true if an Observable, else false.\n*/\nObservable.isObservable = function (o) {\n  return o && isFunction(o.subscribe);\n};\n\n/**\n *  Subscribes an o to the observable sequence.\n *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n */\nObservable.prototype.subscribe = function (oOrOnNext, onError, onCompleted) {\n  return this._subscribe(typeof oOrOnNext === 'object' ?\n    oOrOnNext :\n    create(oOrOnNext, onError, onCompleted));\n};\n\n/**\n * Subscribes to the next value in the sequence with an optional \"this\" argument.\n * @param {Function} onNext The function to invoke on each element in the observable sequence.\n * @param {Any} [thisArg] Object to use as this when executing callback.\n * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n */\nObservable.prototype.subscribeOnNext = function (onNext, thisArg) {\n  return this._subscribe(create(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n};\n\n/**\n * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n * @param {Any} [thisArg] Object to use as this when executing callback.\n * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n */\nObservable.prototype.subscribeOnError = function (onError, thisArg) {\n  return this._subscribe(create(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n};\n\n/**\n * Subscribes to the next value in the sequence with an optional \"this\" argument.\n * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n * @param {Any} [thisArg] Object to use as this when executing callback.\n * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n */\nObservable.prototype.subscribeOnCompleted = function (onCompleted, thisArg) {\n  return this._subscribe(create(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n};\n\nObservable.addToObject = function (operators) {\n  Object.keys(operators).forEach(function (operator) {\n    Observable[operator] = operators[operator];\n  });\n};\n\nObservable.addToPrototype = function (operators) {\n  Object.keys(operators).forEach(function (operator) {\n    Observable.prototype[operator] = function () {\n      var args = [this];\n      args.push.apply(args, arguments);\n      return operators[operator].apply(null, args);\n    };\n  });\n};\n\nmodule.exports = Observable;\n"
  },
  {
    "path": "src/modular/observer/abstractobserver.js",
    "content": "'use strict';\n\nvar Observer = require('../observer');\nvar inherits = require('inherits');\nvar NotImplementedError = require('../internal/errors').NotImplementedError;\n\nfunction notImplemented() {\n  throw new NotImplementedError();\n}\n\nfunction AbstractObserver() {\n  this.isStopped = false;\n  Observer.call(this);\n}\n\ninherits(AbstractObserver, Observer);\n\n// Must be implemented by other observers\nAbstractObserver.prototype.next = notImplemented;\nAbstractObserver.prototype.error = notImplemented;\nAbstractObserver.prototype.completed = notImplemented;\n\nAbstractObserver.prototype.onNext = function (value) {\n  if (!this.isStopped) { this.next(value); }\n};\n\nAbstractObserver.prototype.onError = function (error) {\n  if (!this.isStopped) {\n    this.isStopped = true;\n    this.error(error);\n  }\n};\n\nAbstractObserver.prototype.onCompleted = function () {\n  if (!this.isStopped) {\n    this.isStopped = true;\n    this.completed();\n  }\n};\n\nAbstractObserver.prototype.dispose = function () {\n  this.isStopped = true;\n};\n\nAbstractObserver.prototype.fail = function (e) {\n  if (!this.isStopped) {\n    this.isStopped = true;\n    this.error(e);\n    return true;\n  }\n\n  return false;\n};\n\nmodule.exports = AbstractObserver;\n"
  },
  {
    "path": "src/modular/observer/anonymousobserver.js",
    "content": "'use strict';\n\nvar AbstractObserver = require('./abstractobserver');\nvar inherits = require('inherits');\n\n/**\n * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n * @param {Any} onNext Observer's OnNext action implementation.\n * @param {Any} onError Observer's OnError action implementation.\n * @param {Any} onCompleted Observer's OnCompleted action implementation.\n */\nfunction AnonymousObserver(onNext, onError, onCompleted) {\n  AbstractObserver.call(this);\n  this._onNext = onNext;\n  this._onError = onError;\n  this._onCompleted = onCompleted;\n}\n\ninherits(AnonymousObserver, AbstractObserver);\n\n/**\n * Calls the onNext action.\n * @param {Any} value Next element in the sequence.\n */\nAnonymousObserver.prototype.next = function (value) {\n  this._onNext(value);\n};\n\n/**\n * Calls the onError action.\n * @param {Any} error The error that has occurred.\n */\nAnonymousObserver.prototype.error = function (error) {\n  this._onError(error);\n};\n\n/**\n *  Calls the onCompleted action.\n */\nAnonymousObserver.prototype.completed = function () {\n  this._onCompleted();\n};\n\nmodule.exports = AnonymousObserver;\n"
  },
  {
    "path": "src/modular/observer/asobserver.js",
    "content": "'use strict';\n\nvar AnonymousObserver = require('./anonymousobserver');\n\n/**\n *  Hides the identity of an observer.\n * @returns An observer that hides the identity of the specified observer.\n */\nmodule.exports = function (observer) {\n  return new AnonymousObserver(\n    function (x) { observer.onNext(x); },\n    function (err) { observer.onError(err); },\n    function () { observer.onCompleted(); });\n};\n"
  },
  {
    "path": "src/modular/observer/autodetachobserver.js",
    "content": "'use strict';\n\nvar AbstractObserver = require('./abstractobserver');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar inherits = require('inherits');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj, thrower = tryCatchUtils.thrower;\n\nfunction AutoDetachObserver(observer) {\n  AbstractObserver.call(this);\n  this.observer = observer;\n  this.m = new SingleAssignmentDisposable();\n}\n\ninherits(AutoDetachObserver, AbstractObserver);\n\nAutoDetachObserver.prototype.next = function (value) {\n  var result = tryCatch(this.observer.onNext).call(this.observer, value);\n  if (result === errorObj) {\n    this.dispose();\n    thrower(result.e);\n  }\n};\n\nAutoDetachObserver.prototype.error = function (err) {\n  var result = tryCatch(this.observer.onError).call(this.observer, err);\n  this.dispose();\n  result === errorObj && thrower(result.e);\n};\n\nAutoDetachObserver.prototype.completed = function () {\n  var result = tryCatch(this.observer.onCompleted).call(this.observer);\n  this.dispose();\n  result === errorObj && thrower(result.e);\n};\n\nAutoDetachObserver.prototype.setDisposable = function (value) { this.m.setDisposable(value); };\nAutoDetachObserver.prototype.getDisposable = function () { return this.m.getDisposable(); };\n\nAutoDetachObserver.prototype.dispose = function () {\n  AbstractObserver.prototype.dispose.call(this);\n  this.m.dispose();\n};\n\nmodule.exports = AutoDetachObserver;\n"
  },
  {
    "path": "src/modular/observer/checked.js",
    "content": "'use strict';\n\nvar CheckedObserver = require('./checkedobserver');\n\n/**\n *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n *  If a violation is detected, an Error is thrown from the offending observer method call.\n * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n */\nmodule.exports = function (observer) {\n  return new CheckedObserver(observer);\n};\n"
  },
  {
    "path": "src/modular/observer/checkedobserver.js",
    "content": "'use strict';\n\nvar Observer = require('../observer');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj, thrower = tryCatchUtils.thrower;\n\nfunction CheckedObserver(observer) {\n  Observer.call(this);\n  this._observer = observer;\n  this._state = 0; // 0 - idle, 1 - busy, 2 - done\n}\nCheckedObserver.prototype.onNext = function (value) {\n  this.checkAccess();\n  var res = tryCatch(this._observer.onNext).call(this._observer, value);\n  this._state = 0;\n  res === errorObj && thrower(res.e);\n};\n\nCheckedObserver.prototype.onError = function (err) {\n  this.checkAccess();\n  var res = tryCatch(this._observer.onError).call(this._observer, err);\n  this._state = 2;\n  res === errorObj && thrower(res.e);\n};\n\nCheckedObserver.prototype.onCompleted = function () {\n  this.checkAccess();\n  var res = tryCatch(this._observer.onCompleted).call(this._observer);\n  this._state = 2;\n  res === errorObj && thrower(res.e);\n};\n\nCheckedObserver.prototype.checkAccess = function () {\n  if (this._state === 1) { throw new Error('Re-entrancy detected'); }\n  if (this._state === 2) { throw new Error('Observer completed'); }\n  if (this._state === 0) { this._state = 1; }\n};\n\nmodule.exports = CheckedObserver;\n"
  },
  {
    "path": "src/modular/observer/create.js",
    "content": "'use strict';\n\nvar noop = require('../helpers/noop');\nvar AnonymousObserver = require('./anonymousobserver');\n\nfunction throwError(e) { throw e; }\n\n/**\n *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n * @param {Function} [onNext] Observer's OnNext action implementation.\n * @param {Function} [onError] Observer's OnError action implementation.\n * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n * @returns {Observer} The observer object implemented using the given actions.\n */\nmodule.exports = function (onNext, onError, onCompleted) {\n  return new AnonymousObserver(onNext || noop, onError || throwError, onCompleted || noop);\n};\n"
  },
  {
    "path": "src/modular/observer/fromnotifier.js",
    "content": "'use strict';\n\nvar AnonymousObserver = require('./anonymousobserver');\nvar Notification = require('../notification');\nvar bindCallback = require('../internal/bindcallback');\n\n/**\n *  Creates an observer from a notification callback.\n * @param {Function} handler Action that handles a notification.\n * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n */\nmodule.exports = function (handler, thisArg) {\n  var cb = bindCallback(handler, thisArg, 1);\n  return new AnonymousObserver(function (x) {\n    return cb(Notification.createOnNext(x));\n  }, function (e) {\n    return cb(Notification.createOnError(e));\n  }, function () {\n    return cb(Notification.createOnCompleted());\n  });\n};\n"
  },
  {
    "path": "src/modular/observer/makesafe.js",
    "content": "'use strict';\n\nvar AnonymousSafeObserver = require('./anonymoussafeobserver');\n\nmodule.exports = function(observer, disposable) {\n  return new AnonymousSafeObserver(\n    observer._onNext,\n    observer._onError,\n    observer._onCompleted,\n    disposable);\n};\n"
  },
  {
    "path": "src/modular/observer/notifyon.js",
    "content": "'use strict';\n\nvar ObserveOnObserver = require('./observeronobserver');\n\n/**\n * Schedules the invocation of observer methods on the given scheduler.\n * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n */\nmodule.exports = function (observer, scheduler) {\n  return new ObserveOnObserver(scheduler, observer);\n};\n"
  },
  {
    "path": "src/modular/observer/observeonobserver.js",
    "content": "'use strict';\n\nvar ScheduledObserver = require('./scheduledobserver');\nvar inherits = require('inherits');\n\nfunction ObserveOnObserver(scheduler, observer, cancel) {\n  ScheduledObserver.call(this, scheduler, observer);\n  this._cancel = cancel;\n}\n\ninherits(ObserveOnObserver, ScheduledObserver);\n\nObserveOnObserver.prototype.next = function (value) {\n  ScheduledObserver.prototype.next.call(this, value);\n  this.ensureActive();\n};\n\nObserveOnObserver.prototype.error = function (e) {\n  ScheduledObserver.prototype.error.call(this, e);\n  this.ensureActive();\n};\n\nObserveOnObserver.prototype.completed = function () {\n  ScheduledObserver.prototype.completed.call(this);\n  this.ensureActive();\n};\n\nObserveOnObserver.prototype.dispose = function () {\n  ScheduledObserver.prototype.dispose.call(this);\n  this._cancel && this._cancel.dispose();\n  this._cancel = null;\n};\n\nmodule.exports = ObserveOnObserver;\n"
  },
  {
    "path": "src/modular/observer/scheduledobserver.js",
    "content": "'use strict';\n\nvar AbstractObserver = require('./abstractobserver');\nvar SerialDisposable = require('../serialdisposable');\nvar inherits = require('inherits');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj, thrower = tryCatchUtils.thrower;\n\nfunction ScheduledObserver(scheduler, observer) {\n  AbstractObserver.call(this);\n  this.scheduler = scheduler;\n  this.observer = observer;\n  this.isAcquired = false;\n  this.hasFaulted = false;\n  this.queue = [];\n  this.disposable = new SerialDisposable();\n}\n\ninherits(ScheduledObserver, AbstractObserver);\n\nfunction enqueueNext(observer, x) { return function () { observer.onNext(x); }; }\nfunction enqueueError(observer, e) { return function () { observer.onError(e); }; }\nfunction enqueueCompleted(observer) { return function () { observer.onCompleted(); }; }\n\nScheduledObserver.prototype.next = function (x) {\n  this.queue.push(enqueueNext(this.observer, x));\n};\n\nScheduledObserver.prototype.error = function (e) {\n  this.queue.push(enqueueError(this.observer, e));\n};\n\nScheduledObserver.prototype.completed = function () {\n  this.queue.push(enqueueCompleted(this.observer));\n};\n\nfunction scheduleMethod(state, recurse) {\n  var work;\n  if (state.queue.length > 0) {\n    work = state.queue.shift();\n  } else {\n    state.isAcquired = false;\n    return;\n  }\n  var res = tryCatch(work)();\n  if (res === errorObj) {\n    state.queue = [];\n    state.hasFaulted = true;\n    return thrower(res.e);\n  }\n  recurse(state);\n}\n\nScheduledObserver.prototype.ensureActive = function () {\n  var isOwner = false;\n  if (!this.hasFaulted && this.queue.length > 0) {\n    isOwner = !this.isAcquired;\n    this.isAcquired = true;\n  }\n  isOwner &&\n    this.disposable.setDisposable(this.scheduler.scheduleRecursive(this, scheduleMethod));\n};\n\nScheduledObserver.prototype.dispose = function () {\n  AbstractObserver.prototype.dispose.call(this);\n  this.disposable.dispose();\n};\n\nmodule.exports = ScheduledObserver;\n"
  },
  {
    "path": "src/modular/observer/tonotifier.js",
    "content": "'use strict';\n\n/**\n *  Creates a notification callback from an observer.\n * @returns The action that forwards its input notification to the underlying observer.\n */\nmodule.exports = function (observer) {\n  return function (n) { return n.accept(observer); };\n};\n"
  },
  {
    "path": "src/modular/observer.js",
    "content": "'use strict';\n\n/**\n * Supports push-style iteration over an observable sequence.\n */\nfunction Observer () { }\n\nObserver.addToObject = function (operators) {\n  Object.keys(operators).forEach(function (operator) {\n    Observer[operator] = operators[operator];\n  });\n};\n\nObserver.addToPrototype = function (operators) {\n  Object.keys(operators).forEach(function (operator) {\n    Observer.prototype[operator] = function () {\n      var args = [this];\n      args.push.apply(args, arguments);\n      return operators[operator].apply(null, args);\n    };\n  });\n};\n\n\nmodule.exports = Observer;\n"
  },
  {
    "path": "src/modular/package.json",
    "content": "{\n  \"name\": \"@rxjs/rx\",\n  \"version\": \"4.1.0\",\n  \"description\": \"The Reactive Extensions for JavaScript\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"build:all:umd:debug\": \"webpack index.js dist/rx.all.js --config webpack.config.js\",\n    \"build:all:umd:min\": \"webpack index.js dist/rx.all.min.js  --config webpack.config.production.js\",\n    \"build:all:umd\": \"npm run build:all:umd:debug && npm run build:all:umd:min\",\n    \"build:lite:umd:debug\": \"webpack rx.lite.js dist/rx.lite.js --config webpack.config.js\",\n    \"build:lite:umd:min\": \"webpack rx.lite.js dist/rx.lite.min.js  --config webpack.config.production.js\",\n    \"build:lite:umd\": \"npm run build:lite:umd:debug && npm run build:lite:umd:min\",\n    \"build:test\": \"npm run build:all:umd && npm run build:lite:umd && npm run test\",\n    \"test\": \"tape test/**/*.js | tap-spec\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS.git\"\n  },\n  \"keywords\": [\n    \"Rx\",\n    \"RxJS\",\n    \"Reactive\",\n    \"FRP\",\n    \"Promise\",\n    \"Callback\",\n    \"Observable\",\n    \"Observer\"\n  ],\n  \"author\": \"Microsoft Corporation\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/Reactive-Extensions/RxJS/issues\"\n  },\n  \"homepage\": \"https://github.com/Reactive-Extensions/RxJS\",\n  \"devDependencies\": {\n    \"babel-core\": \"^6.4.5\",\n    \"babel-loader\": \"^6.2.1\",\n    \"lie\": \"^3.0.1\",\n    \"tap-spec\": \"^4.1.0\",\n    \"tape\": \"^4.2.2\",\n    \"webpack\": \"^1.12.11\"\n  },\n  \"dependencies\": {\n    \"es6-map\": \"^0.1.3\",\n    \"inherits\": \"^2.0.1\"\n  }\n}\n"
  },
  {
    "path": "src/modular/readme.md",
    "content": "[![NPM version](https://img.shields.io/npm/v/@rxjs/rx.svg)](https://www.npmjs.com/package/@rxjs/rx)\n[![Downloads](https://img.shields.io/npm/dm/@rxjs/rx.svg)](https://www.npmjs.com/package/@rxjs/rx\n[![Join the chat at https://gitter.im/Reactive-Extensions/RxJS](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Reactive-Extensions/RxJS?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n\n**[The Need to go Reactive](#the-need-to-go-reactive)** |\n**[About the Reactive Extensions](#about-the-reactive-extensions)** |\n**[Batteries Included](#batteries-included)** |\n**[Why RxJS?](#why-rxjs)** |\n**[Dive In!](#dive-in)** |\n**[Resources](#resources)** |\n**[Getting Started](#getting-started)** |\n**[Contributing](#contributing)** |\n**[License](#license)**\n\n# The Reactive Extensions for JavaScript (RxJS) <sup>4.0</sup>... #\n\n*...is a set of libraries to compose asynchronous and event-based programs using observable collections and [Array#extras](http://blogs.msdn.com/b/ie/archive/2010/12/13/ecmascript-5-part-2-array-extras.aspx) style composition in JavaScript*\n\nThe project is actively developed by [Microsoft](https://microsoft.com/), in collaboration with a community of open source developers.\n\n## The Need to go Reactive ##\n\nApplications, especially on the web have changed over the years from being a simple static page, to DHTML with animations, to the Ajax revolution.  Each time, we're adding more complexity, more data, and asynchronous behavior to our applications.  How do we manage it all?  How do we scale it?  By moving towards \"Reactive Architectures\" which are event-driven, resilient and responsive.  With the Reactive Extensions, you have all the tools you need to help build these systems.\n\n## About the Reactive Extensions ##\n\nThe Reactive Extensions for JavaScript (RxJS) is a set of libraries for composing asynchronous and event-based programs using observable sequences and fluent query operators that many of you already know by [Array#extras](http://blogs.msdn.com/b/ie/archive/2010/12/13/ecmascript-5-part-2-array-extras.aspx) in JavaScript. Using RxJS, developers represent asynchronous data streams with Observables, query asynchronous data streams using our many operators, and parameterize the concurrency in the asynchronous data streams using Schedulers. Simply put, RxJS = Observables + Operators + Schedulers.\n\nWhether you are authoring a web-based application in JavaScript or a server-side application in Node.js, you have to deal with asynchronous and event-based programming. Although some patterns are emerging such as the Promise pattern, handling exceptions, cancellation, and synchronization is difficult and error-prone.\n\nUsing RxJS, you can represent multiple asynchronous data streams (that come from diverse sources, e.g., stock quote, tweets, computer events, web service requests, etc.), and subscribe to the event stream using the Observer object. The Observable notifies the subscribed Observer instance whenever an event occurs.\n\nBecause observable sequences are data streams, you can query them using standard query operators implemented by the Observable type. Thus you can filter, project, aggregate, compose and perform time-based operations on multiple events easily by using these operators. In addition, there are a number of other reactive stream specific operators that allow powerful queries to be written. Cancellation, exceptions, and synchronization are also handled gracefully by using the methods on the Observable object.\n\nBut the best news of all is that you already know how to program like this.  Take for example the following JavaScript code, where we get some stock data and then manipulate and iterate the results.\n\n```js\n/* Get stock data somehow */\nconst source = getAsyncStockData();\n\nconst subscription = source\n  .filter(quote => quote.price > 30)\n  .map(quote => quote.price)\n  .forEach(price => console.log(`Prices higher than $30: ${price}`);\n```\n\nNow what if this data were to come as some sort of event, for example a stream, such as a WebSocket? Then we could pretty much write the same query to iterate our data, with very little change.\n\n```js\n/* Get stock data somehow */\nconst source = getAsyncStockData();\n\nconst subscription = source\n  .filter(quote => quote.price > 30)\n  .map(quote => quote.price)\n  .subscribe(\n    price => console.log(`Prices higher than $30: ${price}`),\n    err => console.log(`Something went wrong: ${err.message}`);\n  );\n\n/* When we're done */\nsubscription.dispose();\n```\n\nThe only difference is that we can handle the errors inline with our subscription.  And when we're no longer interested in receiving the data as it comes streaming in, we call `dispose` on our subscription.  Note the use of `subscribe` instead of `forEach`.  We could also use `forEach` which is an alias for `subscribe` but we highly suggest you use `subscribe`.\n\n## Batteries Included ##\n\nSure, there are a lot of ways to get started with RxJS.  Since RxJS has been built using the CommonJS style of modules, you can either take the whole thing via Node.js with requiring `@rxjs/rx` or simply in your browser using the files of `dist/rx.all.js` or `dist/rx.all.min.js`.  We also have smaller versions such as a modular version of `rx.lite` which you can get via Node by requiring `@rxjs/rx/rx.lite` or in your browser `dist/rx.lite.js` or `dist/rx.lite.min.js`.\n\n```js\nvar Rx = require('@rxjs/rx');\n\nconst subscription = Rx.Observable.fromArray([1,2,3])\n  .filter(x => x % 2 === 0)\n  .map(x => x + 2)\n  .subscribe(x => console.log(`The answer is ${x}`));\n// => The answer is 4\n```\n\nHow much you include is up to you.  For example, want only a few operators?, then simply require what you need and leave the rest behind.\n\n```js\nconst fromArray = require('@rx/rx/observable/fromarray');\nconst filter = require('@rxjs/rx/observable/filter');\nconst map = require('@rxjs/rx/observable/map');\n\nconst source = fromArray([1,2,3]);\n\nconst filtered = filter(source, x => x % 2 === 0);\n\nconst mapped = map(filtered, x => x + 2);\n\nconst subscription = mapped.subscribe( x => console.log(`The answer is ${x}`) );\n// => The answer is 4\n```\n\nOptionally you can add right to the Observable itself such as:\n\n```js\nconst Observable = require('@rxjs/rx/observable');\n\n// Add class methods\nObservable.addToObject({\n  fromArray: require('@rxjs/rx/observable/fromarray')\n});\n\n// Add instance methods\nObservable.addToPrototype({\n  filter: require('@rxjs/rx/observable/filter'),\n  map: require('@rxjs/rx/observable/map')\n});\n\nconst subscription = Observable.fromArray([1,2,3])\n  .filter(x => x % 2 === 0)\n  .map(x => x + 2)\n  .subscribe(x => console.log(`The answer is ${x}`));\n```\n\n## Why RxJS? ##\n\nOne question you may ask yourself is why RxJS?  What about Promises?  Promises are good for solving asynchronous operations such as querying a service with an XMLHttpRequest, where the expected behavior is one value and then completion.  Reactive Extensions for JavaScript unify both the world of Promises, callbacks as well as evented data such as DOM Input, Web Workers, and Web Sockets. Unifying these concepts enables rich composition.\n\nTo give you an idea about rich composition, we can create an autocompletion service which takes user input from a text input and then throttles queries a service (to avoid flooding the service with calls for every key stroke).\n\nFirst, we'll reference the JavaScript files, including jQuery, although RxJS has no dependencies on jQuery...\n```html\n<script src=\"https://code.jquery.com/jquery.js\"></script>\n<script src=\"rx.lite.js\"></script>\n```\nNext, we'll get the user input from an input, listening to the keyup event by using the `Rx.Observable.fromEvent` method.  This will either use the event binding from [jQuery](http://jquery.com), [Zepto](http://zeptojs.com/), [AngularJS](https://angularjs.org/), [Backbone.js](http://backbonejs.org/) and [Ember.js](http://emberjs.com/) if available, and if not, falls back to the native event binding.  This gives you consistent ways of thinking of events depending on your framework, so there are no surprises.\n\n```js\nconst $input = $('#input');\nconst $results = $('#results');\n\n/* Only get the value from each key up */\nvar keyups = Rx.Observable.fromEvent($input, 'keyup')\n  .pluck('target', 'value')\n  .filter(text => text.length > 2 );\n\n/* Now debounce the input for 500ms */\nvar debounced = keyups\n  .debounce(500 /* ms */);\n\n/* Now get only distinct values, so we eliminate the arrows and other control characters */\nvar distinct = debounced\n  .distinctUntilChanged();\n```\n\nNow, let's query Wikipedia!  In RxJS, we can instantly bind to any [Promises A+](https://github.com/promises-aplus/promises-spec) implementation through the `Rx.Observable.fromPromise` method. Or, directly return it and RxJS will wrap it for you.\n\n```js\nfunction searchWikipedia (term) {\n  return $.ajax({\n    url: 'https://en.wikipedia.org/w/api.php',\n    dataType: 'jsonp',\n    data: {\n      action: 'opensearch',\n      format: 'json',\n      search: term\n    }\n  }).promise();\n}\n```\n\nOnce that is created, we can tie together the distinct throttled input and query the service.  In this case, we'll call `flatMapLatest` to get the value and ensure we're not introducing any out of order sequence calls.\n\n```js\nconst suggestions = distinct\n  .flatMapLatest(searchWikipedia);\n```\n\nFinally, we call the `subscribe` method on our observable sequence to start pulling data.\n\n```js\nsuggestions.subscribe(\n  data => {\n    $results\n      .empty()\n      .append($.map(data[1], value =>  $('<li>').text(value)))\n  },\n  error=> {\n    $results\n      .empty()\n      .append($('<li>'))\n        .text('Error:' + error);\n  });\n```\n\nAnd there you have it!\n\n## Dive In! ##\n\nPlease check out:\n\n - [Our Code of Conduct](https://github.com/Reactive-Extensions/RxJS/tree/master/code-of-conduct.md)\n - [The full documentation](https://github.com/Reactive-Extensions/RxJS/tree/master/src/modular/doc)\n - [Our design guidelines](https://github.com/Reactive-Extensions/RxJS/tree/master/doc/designguidelines)\n - [Our contribution guidelines](https://github.com/Reactive-Extensions/RxJS/tree/master/contributing.md)\n - [Our complete Unit Tests](https://github.com/Reactive-Extensions/RxJS/tree/master/src/modular/test)\n\n## Resources\n\n- Contact us\n   - [Twitter @ReactiveX](https://twitter.com/ReactiveX)\n   - [Gitter.im](https://gitter.im/Reactive-Extensions/RxJS)\n   - [StackOverflow rxjs](http://stackoverflow.com/questions/tagged/rxjs)\n\n## Getting Started\n\nThere are a number of ways to get started with RxJS.\n\n### Download the Source\n\n```bash\ngit clone https://github.com/Reactive-Extensions/rxjs.git\ncd ./rxjs/src/modular\n```\n\n### Installing with [NPM](https://www.npmjs.com/)\n\n```bash`\n$ npm install @rxjs/rx\n$ npm install -g @rxjs/rx\n```\n\n### Using with Node.js/JXcore\n\n```js\nvar Rx = require('@rxjs/rx');\n```\n\n### In a Browser:\n\n```html\n<!-- Or all of RxJS minus testing -->\n<script src=\"rx.all.js\"></script>\n\n<!-- Or keeping it lite -->\n<script src=\"rx.lite.js\"></script>\n```\n\n### Custom Builds\n\nYou can create custom builds using WebPack, Browserify, Rollup or other tools since RxJS is written in the style of CommonJS modules.  If you are looking for inspiration, see our `webpack.config.js` and `webpack.config.production.js` files on how we use WebPack.\n\n## Contributing ##\n\nThere are lots of ways to contribute to the project, and we appreciate our [contributors](https://github.com/Reactive-Extensions/RxJS/wiki/Contributors).  If you wish to contribute, check out our [style guide]((https://github.com/Reactive-Extensions/RxJS/tree/master/doc/contributing)).\n\nYou can contribute by reviewing and sending feedback on code checkins, suggesting and trying out new features as they are implemented, submit bugs and help us verify fixes as they are checked in, as well as submit code fixes or code contributions of your own. Note that all code submissions will be rigorously reviewed and tested by the Rx Team, and only those that meet an extremely high bar for both quality and design/roadmap appropriateness will be merged into the source.\n\nFirst-time contributors must sign a [Contribution License Agreement](https://cla.microsoft.com/).  If your Pull Request has the label [cla-required](https://github.com/Reactive-Extensions/RxJS/labels/cla-required), this is an indication that you haven't yet signed such an agreement.\n\n## License ##\n\nCopyright (c) Microsoft Open Technologies, Inc.  All rights reserved.\nMicrosoft Open Technologies would like to thank its contributors, a list\nof whom are at https://github.com/Reactive-Extensions/RxJS/wiki/Contributors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you\nmay not use this file except in compliance with the License. You may\nobtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\nimplied. See the License for the specific language governing permissions\nand limitations under the License.\n"
  },
  {
    "path": "src/modular/refcountdisposable.js",
    "content": "'use strict';\n\nvar Disposable = require('./disposable');\n\nfunction InnerDisposable(disposable) {\n  this.disposable = disposable;\n  this.disposable.count++;\n  this.isInnerDisposed = false;\n}\n\nInnerDisposable.prototype.dispose = function () {\n  if (!this.disposable.isDisposed && !this.isInnerDisposed) {\n    this.isInnerDisposed = true;\n    this.disposable.count--;\n    if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {\n      this.disposable.isDisposed = true;\n      this.disposable.underlyingDisposable.dispose();\n    }\n  }\n};\n\n/**\n * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n */\nfunction RefCountDisposable(disposable) {\n  this.underlyingDisposable = disposable;\n  this.isDisposed = false;\n  this.isPrimaryDisposed = false;\n  this.count = 0;\n}\n\n/**\n * Disposes the underlying disposable only when all dependent disposables have been disposed\n */\nRefCountDisposable.prototype.dispose = function () {\n  if (!this.isDisposed && !this.isPrimaryDisposed) {\n    this.isPrimaryDisposed = true;\n    if (this.count === 0) {\n      this.isDisposed = true;\n      this.underlyingDisposable.dispose();\n    }\n  }\n};\n\n/**\n * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n */\nRefCountDisposable.prototype.getDisposable = function () {\n  return this.isDisposed ? Disposable.empty : new InnerDisposable(this);\n};\n\nmodule.exports = RefCountDisposable;\n"
  },
  {
    "path": "src/modular/replaysubject.js",
    "content": "'use strict';\n\nvar Disposable = require('./disposable');\nvar Observable = require('./observable');\nvar Observer = require('./observer');\nvar ScheduledObserver = require('./observer/scheduledobserver');\nvar Scheduler = require('./scheduler');\nvar addProperties = require('./internal/addproperties');\nvar cloneArray = require('./internal/clonearray');\nvar inherits = require('inherits');\n\nvar MAX_SAFE_INTEGER = Math.pow(2, 53) - 1;\n\nfunction createRemovableDisposable(subject, observer) {\n  return Disposable.create(function () {\n    observer.dispose();\n    !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n  });\n}\n\n\n\n/**\n * Represents an object that is both an observable sequence as well as an observer.\n * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n *\n *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n */\nfunction ReplaySubject(bufferSize, windowSize, scheduler) {\n  this.bufferSize = bufferSize == null ? MAX_SAFE_INTEGER : bufferSize;\n  this.windowSize = windowSize == null ? MAX_SAFE_INTEGER : windowSize;\n  this.scheduler = scheduler || Scheduler.queue;\n  this.q = [];\n  this.observers = [];\n  this.isStopped = false;\n  this.isDisposed = false;\n  this.hasError = false;\n  this.error = null;\n  Observable.call(this);\n}\n\ninherits(ReplaySubject, Observable);\n\naddProperties(ReplaySubject.prototype, Observer.prototype, {\n  _subscribe: function (o) {\n    Disposable.checkDisposed(this);\n    var so = new ScheduledObserver(this.scheduler, o), subscription = createRemovableDisposable(this, so);\n\n    this._trim(this.scheduler.now());\n    this.observers.push(so);\n\n    for (var i = 0, len = this.q.length; i < len; i++) {\n      so.onNext(this.q[i].value);\n    }\n\n    if (this.hasError) {\n      so.onError(this.error);\n    } else if (this.isStopped) {\n      so.onCompleted();\n    }\n\n    so.ensureActive();\n    return subscription;\n  },\n  /**\n   * Indicates whether the subject has observers subscribed to it.\n   * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n   */\n  hasObservers: function () {\n    Disposable.checkDisposed(this);\n    return this.observers.length > 0;\n  },\n  _trim: function (now) {\n    while (this.q.length > this.bufferSize) {\n      this.q.shift();\n    }\n    while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {\n      this.q.shift();\n    }\n  },\n  /**\n   * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n   * @param {Mixed} value The value to send to all observers.\n   */\n  onNext: function (value) {\n    Disposable.checkDisposed(this);\n    if (this.isStopped) { return; }\n    var now = this.scheduler.now();\n    this.q.push({ interval: now, value: value });\n    this._trim(now);\n\n    for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n      var observer = os[i];\n      observer.onNext(value);\n      observer.ensureActive();\n    }\n  },\n  /**\n   * Notifies all subscribed observers about the exception.\n   * @param {Mixed} error The exception to send to all observers.\n   */\n  onError: function (error) {\n    Disposable.checkDisposed(this);\n    if (this.isStopped) { return; }\n    this.isStopped = true;\n    this.error = error;\n    this.hasError = true;\n    var now = this.scheduler.now();\n    this._trim(now);\n    for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n      var observer = os[i];\n      observer.onError(error);\n      observer.ensureActive();\n    }\n    this.observers.length = 0;\n  },\n  /**\n   * Notifies all subscribed observers about the end of the sequence.\n   */\n  onCompleted: function () {\n    Disposable.checkDisposed(this);\n    if (this.isStopped) { return; }\n    this.isStopped = true;\n    var now = this.scheduler.now();\n    this._trim(now);\n    for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n      var observer = os[i];\n      observer.onCompleted();\n      observer.ensureActive();\n    }\n    this.observers.length = 0;\n  },\n  /**\n   * Unsubscribe all observers and release resources.\n   */\n  dispose: function () {\n    this.isDisposed = true;\n    this.observers = null;\n  }\n});\n\nmodule.exports = ReplaySubject;\n"
  },
  {
    "path": "src/modular/rx.lite.js",
    "content": "'use strict';\n\nvar Observer = require('./observer');\n\nObserver.addToObject({\n  create: require('./observer/create')\n});\n\nvar Observable = require('./observable');\n\nObservable.addToObject({\n  bindCallback: require('./observable/bindcallback'),\n  bindNodeCallback: require('./observable/bindnodecallback'),\n  catch: require('./observable/catch'),\n  concat: require('./observable/concat'),\n  create: require('./observable/create'),\n  empty: require('./observable/empty'),\n  from: require('./observable/from'),\n  fromArray: require('./observable/fromarray'),\n  fromEvent: require('./observable/fromevent'),\n  fromEventPattern: require('./observable/fromeventpattern'),\n  fromPromise: require('./observable/frompromise'),\n  interval: require('./observable/interval'),\n  just: require('./observable/just'),\n  merge: require('./observable/merge'),\n  never: require('./observable/never'),\n  of: require('./observable/of'),\n  range: require('./observable/range'),\n  throw: require('./observable/throw'),\n  using: require('./observable/using'),\n  zip: require('./observable/zip')\n});\n\nObservable.addToPrototype({\n  catch: require('./observable/catch'),\n  combineLatest: require('./observable/combinelatest'),\n  concat: require('./observable/concat'),\n  concatAll: require('./observable/concatall'),\n  debounce: require('./observable/debounce'),\n  distinctUntilChanged: require('./observable/distinctuntilchanged'),\n  do: require('./observable/tap'),\n  filter: require('./observable/filter'),\n  finally: require('./observable/finally'),\n  flatMap: require('./observable/flatmap'),\n  flatMapLatest: require('./observable/flatmaplatest'),\n  map: require('./observable/map'),\n  merge: require('./observable/merge'),\n  mergeAll: require('./observable/mergeall'),\n  multicast: require('./observable/multicast'),\n  pluck: require('./observable/pluck'),\n  publish: require('./observable/publish'),\n  publishLast: require('./observable/publishlast'),\n  publishValue: require('./observable/publishvalue'),\n  replay: require('./observable/replay'),\n  scan: require('./observable/scan'),\n  share: require('./observable/share'),\n  shareReplay: require('./observable/sharereplay'),\n  shareValue: require('./observable/sharevalue'),\n  skip: require('./observable/skip'),\n  skipUntil: require('./observable/skipuntil'),\n  switch: require('./observable/switch'),\n  take: require('./observable/take'),\n  takeUntil: require('./observable/takeuntil'),\n  tap: require('./observable/tap'),\n  toArray: require('./observable/toarray'),\n  toPromise: require('./observable/topromise'),\n  zip: require('./observable/zip')\n});\n\n// RxJS V4 aliases\nObservable.prototype.selectMany = Observable.prototype.flatMap;\nObservable.prototype.select = Observable.prototype.map;\nObservable.prototype.where = Observable.prototype.filter;\n\n// RxJS V5 aliases\nObservable.prototype.mergeMap = Observable.prototype.flatMap;\nObservable.prototype.switchMap = Observable.prototype.flatMapLatest;\nObservable.prototype.publishReplay = Observable.prototype.replay;\nObservable.fromCallback = Observable.bindCallback;\nObservable.fromNodeCallback = Observable.bindNodeCallback;\n\nvar Subject = require('./subject');\nSubject.addToObject({\n  create: require('./subject/create')\n});\n\n\nvar Rx = {\n  // Disposables\n  BinaryDisposable: require('./binarydisposable'),\n  CompositeDisposable: require('./compositedisposable'),\n  Disposable: require('./disposable'),\n  NAryDisposable: require('./narydisposable'),\n  SerialDisposable: require('./serialdisposable'),\n  SingleAssignmentDisposable: require('./singleassignmentdisposable'),\n\n  // Scheduler\n  Scheduler: require('./scheduler'),\n\n  // Core\n  Observer: Observer,\n  Observable: Observable,\n\n  // Subjects\n  AsyncSubject: require('./asyncsubject'),\n  BehaviorSubject: require('./behaviorsubject'),\n  ReplaySubject: require('./replaysubject'),\n  Subject: Subject\n};\n\nmodule.exports = Rx;\n"
  },
  {
    "path": "src/modular/scheduleddisposable.js",
    "content": "'use strict';\n\nfunction ScheduledDisposable(scheduler, disposable) {\n  this._scheduler = scheduler;\n  this._disposable = disposable;\n  this.isDisposed = false;\n}\n\nfunction scheduleItem(s, self) {\n  if (!self.isDisposed) {\n    self.isDisposed = true;\n    self._disposable.dispose();\n  }\n}\n\nScheduledDisposable.prototype.dispose = function () {\n  this._scheduler.schedule(this, scheduleItem);\n};\n\nmodule.exports = ScheduledDisposable;\n"
  },
  {
    "path": "src/modular/scheduler/catchscheduler.js",
    "content": "'use strict';\n\nvar Scheduler = require('../scheduler');\nvar Disposable = require('../disposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar inherits = require('inherits');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj, thrower = tryCatchUtils.thrower;\n\nfunction CatchScheduler(scheduler, handler) {\n  this._scheduler = scheduler;\n  this._handler = handler;\n  this._recursiveOriginal = null;\n  this._recursiveWrapper = null;\n  Scheduler.call(this);\n}\n\ninherits(CatchScheduler, Scheduler);\n\nCatchScheduler.prototype.schedule = function (state, action) {\n  return this._scheduler.schedule(state, this._wrap(action));\n};\n\nCatchScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n  return this._scheduler.schedule(state, dueTime, this._wrap(action));\n};\n\nCatchScheduler.prototype.now = function () { return this._scheduler.now(); };\n\nCatchScheduler.prototype._clone = function (scheduler) {\n  return new CatchScheduler(scheduler, this._handler);\n};\n\nCatchScheduler.prototype._wrap = function (action) {\n  var parent = this;\n  return function (self, state) {\n    var res = tryCatch(action)(parent._getRecursiveWrapper(self), state);\n    if (res === errorObj) {\n      if (!parent._handler(res.e)) { thrower(res.e); }\n      return Disposable.empty;\n    }\n    return Disposable._fixup(res);\n  };\n};\n\nCatchScheduler.prototype._getRecursiveWrapper = function (scheduler) {\n  if (this._recursiveOriginal !== scheduler) {\n    this._recursiveOriginal = scheduler;\n    var wrapper = this._clone(scheduler);\n    wrapper._recursiveOriginal = scheduler;\n    wrapper._recursiveWrapper = wrapper;\n    this._recursiveWrapper = wrapper;\n  }\n  return this._recursiveWrapper;\n};\n\nCatchScheduler.prototype.schedulePeriodic = function (state, period, action) {\n  var self = this, failed = false, d = new SingleAssignmentDisposable();\n\n  d.setDisposable(this._scheduler.schedulePeriodic(state, period, function (state1) {\n    if (failed) { return null; }\n    var res = tryCatch(action)(state1);\n    if (res === errorObj) {\n      failed = true;\n      if (!self._handler(res.e)) { thrower(res.e); }\n      d.dispose();\n      return null;\n    }\n    return res;\n  }));\n\n  return d;\n};\n\nmodule.exports = CatchScheduler;\n"
  },
  {
    "path": "src/modular/scheduler/currentthreadscheduler.js",
    "content": "'use strict';\n\nvar Scheduler = require('../scheduler');\nvar ScheduledItem = require('./scheduleditem');\nvar PriorityQueue = require('../internal/priorityqueue');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj, thrower = tryCatchUtils.thrower;\nvar inherits = require('inherits');\n\nfunction CurrentThreadScheduler() {\n  Scheduler.call(this);\n}\n\nCurrentThreadScheduler.queue = null;\n\ninherits(CurrentThreadScheduler, Scheduler);\n\nfunction runTrampoline () {\n  while (CurrentThreadScheduler.queue.length > 0) {\n    var item = CurrentThreadScheduler.queue.dequeue();\n    !item.isCancelled() && item.invoke();\n  }\n}\n\nCurrentThreadScheduler.prototype.schedule = function (state, action) {\n  var si = new ScheduledItem(this, state, action, this.now());\n\n  if (!CurrentThreadScheduler.queue) {\n    CurrentThreadScheduler.queue = new PriorityQueue(4);\n    CurrentThreadScheduler.queue.enqueue(si);\n\n    var result = tryCatch(runTrampoline)();\n    CurrentThreadScheduler.queue = null;\n    if (result === errorObj) { thrower(result.e); }\n  } else {\n    CurrentThreadScheduler.queue.enqueue(si);\n  }\n  return si.disposable;\n};\n\nCurrentThreadScheduler.prototype.scheduleRequired = function () { return !CurrentThreadScheduler.queue; };\n\nmodule.exports = CurrentThreadScheduler;\n"
  },
  {
    "path": "src/modular/scheduler/defaultscheduler.js",
    "content": "'use strict';\n\nvar Disposable = require('../disposable');\nvar BinaryDisposable = require('../binarydisposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar Scheduler = require('../scheduler');\nvar isFunction = require('../helpers/isfunction');\nvar noop = require('../helpers/noop');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj, thrower = tryCatchUtils.thrower;\nvar inherits = require('inherits');\n\nvar scheduleMethod, clearMethod;\n\n(function () {\n\n  var nextHandle = 1, tasksByHandle = {}, currentlyRunning = false;\n\n  clearMethod = function (handle) {\n    delete tasksByHandle[handle];\n  };\n\n  function runTask(handle) {\n    if (currentlyRunning) {\n      global.setTimeout(function () { runTask(handle); }, 0);\n    } else {\n      var task = tasksByHandle[handle];\n      if (task) {\n        currentlyRunning = true;\n        var result = tryCatch(task)();\n        clearMethod(handle);\n        currentlyRunning = false;\n        if (result === errorObj) { thrower(result.e); }\n      }\n    }\n  }\n\n  var setImmediate = global.setImmediate;\n\n  function postMessageSupported () {\n    // Ensure not in a worker\n    if (!global.postMessage || global.importScripts) { return false; }\n    var isAsync = false, oldHandler = global.onmessage;\n    // Test for async\n    global.onmessage = function () { isAsync = true; };\n    global.postMessage('', '*');\n    global.onmessage = oldHandler;\n\n    return isAsync;\n  }\n\n  // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n  if (isFunction(setImmediate)) {\n    scheduleMethod = function (action) {\n      var id = nextHandle++;\n      tasksByHandle[id] = action;\n      setImmediate(function () { runTask(id); });\n\n      return id;\n    };\n  } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n    scheduleMethod = function (action) {\n      var id = nextHandle++;\n      tasksByHandle[id] = action;\n      process.nextTick(function () { runTask(id); });\n\n      return id;\n    };\n  } else if (postMessageSupported()) {\n    var MSG_PREFIX = 'ms.rx.schedule' + Math.random();\n\n    var onGlobalPostMessage = function (event) {\n      // Only if we're a match to avoid any other global events\n      if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n        runTask(event.data.substring(MSG_PREFIX.length));\n      }\n    };\n\n    global.addEventListener('message', onGlobalPostMessage, false);\n\n    scheduleMethod = function (action) {\n      var id = nextHandle++;\n      tasksByHandle[id] = action;\n      global.postMessage(MSG_PREFIX + id, '*');\n      return id;\n    };\n  } else if (!!global.MessageChannel) {\n    var channel = new global.MessageChannel();\n\n    channel.port1.onmessage = function (e) { runTask(e.data); };\n\n    scheduleMethod = function (action) {\n      var id = nextHandle++;\n      tasksByHandle[id] = action;\n      channel.port2.postMessage(id);\n      return id;\n    };\n  } else if ('document' in global && 'onreadystatechange' in global.document.createElement('script')) {\n\n    scheduleMethod = function (action) {\n      var scriptElement = global.document.createElement('script');\n      var id = nextHandle++;\n      tasksByHandle[id] = action;\n\n      scriptElement.onreadystatechange = function () {\n        runTask(id);\n        scriptElement.onreadystatechange = null;\n        scriptElement.parentNode.removeChild(scriptElement);\n        scriptElement = null;\n      };\n      global.document.documentElement.appendChild(scriptElement);\n      return id;\n    };\n\n  } else {\n    scheduleMethod = function (action) {\n      var id = nextHandle++;\n      tasksByHandle[id] = action;\n      global.setTimeout(function () {\n        runTask(id);\n      }, 0);\n\n      return id;\n    };\n  }\n}());\n\n/**\n* Gets a scheduler that schedules work via a timed callback based upon platform.\n*/\nfunction DefaultScheduler() {\n  Scheduler.call(this);\n}\n\ninherits(DefaultScheduler, Scheduler);\n\nfunction scheduleAction(disposable, action, scheduler, state) {\n  return function schedule() {\n    disposable.setDisposable(Disposable._fixup(action(scheduler, state)));\n  };\n}\n\nfunction ClearDisposable(method, id) {\n  this._id = id;\n  this._method = method;\n  this.isDisposed = false;\n}\n\nClearDisposable.prototype.dispose = function () {\n  if (!this.isDisposed) {\n    this.isDisposed = true;\n    this._method.call(null, this._id);\n  }\n};\n\nDefaultScheduler.prototype.schedule = function (state, action) {\n  var disposable = new SingleAssignmentDisposable(),\n      id = scheduleMethod(scheduleAction(disposable, action, this, state));\n\n  return new BinaryDisposable(disposable, new ClearDisposable(clearMethod, id));\n};\n\nDefaultScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n  if (dueTime === 0) { return this.schedule(state, action); }\n\n  var disposable = new SingleAssignmentDisposable(),\n      id = global.setTimeout(scheduleAction(disposable, action, this, state), dueTime);\n\n  return new BinaryDisposable(disposable, new ClearDisposable(global.clearTimeout, id));\n};\n\nmodule.exports = DefaultScheduler;\n"
  },
  {
    "path": "src/modular/scheduler/historicalscheduler.js",
    "content": "'use strict';\n\nvar VirtualTimeScheduler = require('./virtualtimescheduler');\nvar inherits = require('inherits');\n\nfunction baseComparer(x, y) { return x > y ? 1 : (x < y ? -1 : 0); }\n\n/**\n * Provides a virtual time scheduler that uses Date for absolute time and number for relative time.\n * Creates a new historical scheduler with the specified initial clock value.\n * @constructor\n * @param {Number} initialClock Initial value for the clock.\n * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n */\nfunction HistoricalScheduler(initialClock, comparer) {\n  var clock = initialClock == null ? 0 : initialClock;\n  var cmp = comparer || baseComparer;\n  VirtualTimeScheduler.call(this, clock, cmp);\n}\n\ninherits(HistoricalScheduler, VirtualTimeScheduler);\n\n/**\n * Adds a relative time value to an absolute time value.\n * @param {Number} absolute Absolute virtual time value.\n * @param {Number} relative Relative virtual time value to add.\n * @return {Number} Resulting absolute virtual time sum value.\n */\nHistoricalScheduler.prototype.add = function (absolute, relative) {\n  return absolute + relative;\n};\n\nHistoricalScheduler.prototype.toAbsoluteTime = function (absolute) {\n  return new Date(absolute).getTime();\n};\n\n/**\n * Converts the TimeSpan value to a relative virtual time value.\n * @memberOf HistoricalScheduler\n * @param {Number} timeSpan TimeSpan value to convert.\n * @return {Number} Corresponding relative virtual time value.\n */\nHistoricalScheduler.prototype.toRelativeTime = function (timeSpan) {\n  return timeSpan;\n};\n\nmodule.exports = HistoricalScheduler;\n"
  },
  {
    "path": "src/modular/scheduler/immediatescheduler.js",
    "content": "'use strict';\n\nvar Scheduler = require('../scheduler');\nvar Disposable = require('../disposable');\nvar inherits = require('inherits');\n\nfunction ImmediateScheduler() {\n  Scheduler.call(this);\n}\n\ninherits(ImmediateScheduler, Scheduler);\n\nImmediateScheduler.prototype.schedule = function (state, action) {\n  return Disposable._fixup(action(this, state));\n};\n\nmodule.exports = ImmediateScheduler;\n"
  },
  {
    "path": "src/modular/scheduler/scheduleditem.js",
    "content": "'use strict';\n\nvar Disposable = require('../disposable');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar cmp = require('../helpers/comparer');\n\nfunction ScheduledItem(scheduler, state, action, dueTime, comparer) {\n  this.scheduler = scheduler;\n  this.state = state;\n  this.action = action;\n  this.dueTime = dueTime;\n  this.comparer = comparer || cmp;\n  this.disposable = new SingleAssignmentDisposable();\n}\n\nScheduledItem.prototype.invoke = function () {\n  this.disposable.setDisposable(this.invokeCore());\n};\n\nScheduledItem.prototype.compareTo = function (other) {\n  return this.comparer(this.dueTime, other.dueTime);\n};\n\nScheduledItem.prototype.isCancelled = function () {\n  return this.disposable.isDisposed;\n};\n\nScheduledItem.prototype.invokeCore = function () {\n  return Disposable._fixup(this.action(this.scheduler, this.state));\n};\n\nmodule.exports = ScheduledItem;\n"
  },
  {
    "path": "src/modular/scheduler/scheduleperiodicrecursive.js",
    "content": "'use strict';\n\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar tryCatchUtils = require('../internal/trycatchutils');\nvar tryCatch = tryCatchUtils.tryCatch, errorObj = tryCatchUtils.errorObj, thrower = tryCatchUtils.thrower;\n\nfunction createTick(self) {\n  return function tick(command, recurse) {\n    recurse(0, self._period);\n    var state = tryCatch(self._action)(self._state);\n    if (state === errorObj) {\n      self._cancel.dispose();\n      thrower(state.e);\n    }\n    self._state = state;\n  };\n}\n\nfunction SchedulePeriodicRecursive(scheduler, state, period, action) {\n  this._scheduler = scheduler;\n  this._state = state;\n  this._period = period;\n  this._action = action;\n}\n\nSchedulePeriodicRecursive.prototype.start = function () {\n  var d = new SingleAssignmentDisposable();\n  this._cancel = d;\n  d.setDisposable(this._scheduler.scheduleRecursiveFuture(0, this._period, createTick(this)));\n\n  return d;\n};\n\nmodule.exports = SchedulePeriodicRecursive;\n"
  },
  {
    "path": "src/modular/scheduler/virtualtimescheduler.js",
    "content": "'use strict';\n\nvar Scheduler = require('../scheduler');\nvar PriorityQueue = require('../internal/priorityqueue');\nvar ScheduledItem = require('./scheduleditem');\nvar SchedulePeriodicRecursive = require('./scheduleperiodicrecursive');\nvar errors = require('../internal/errors');\nvar inherits = require('inherits');\n\nfunction notImplemented() {\n  throw new errors.NotImplementedError();\n}\n\n/**\n * Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer.\n *\n * @constructor\n * @param {Number} initialClock Initial value for the clock.\n * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n */\nfunction VirtualTimeScheduler(initialClock, comparer) {\n  this.clock = initialClock;\n  this.comparer = comparer;\n  this.isEnabled = false;\n  this.queue = new PriorityQueue(1024);\n  Scheduler.call(this);\n}\n\ninherits(VirtualTimeScheduler, Scheduler);\n\nvar VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype;\n\nVirtualTimeSchedulerPrototype.now = function () {\n  return this.toAbsoluteTime(this.clock);\n};\n\nVirtualTimeSchedulerPrototype.schedule = function (state, action) {\n  return this.scheduleAbsolute(state, this.clock, action);\n};\n\nVirtualTimeSchedulerPrototype.scheduleFuture = function (state, dueTime, action) {\n  var dt = dueTime instanceof Date ?\n    this.toRelativeTime(dueTime - this.now()) :\n    this.toRelativeTime(dueTime);\n\n  return this.scheduleRelative(state, dt, action);\n};\n\n/**\n * Adds a relative time value to an absolute time value.\n * @param {Number} absolute Absolute virtual time value.\n * @param {Number} relative Relative virtual time value to add.\n * @return {Number} Resulting absolute virtual time sum value.\n */\nVirtualTimeSchedulerPrototype.add = notImplemented;\n\n/**\n * Converts an absolute time to a number\n * @param {Any} The absolute time.\n * @returns {Number} The absolute time in ms\n */\nVirtualTimeSchedulerPrototype.toAbsoluteTime = notImplemented;\n\n/**\n * Converts the TimeSpan value to a relative virtual time value.\n * @param {Number} timeSpan TimeSpan value to convert.\n * @return {Number} Corresponding relative virtual time value.\n */\nVirtualTimeSchedulerPrototype.toRelativeTime = notImplemented;\n\n/**\n * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be emulated using recursive scheduling.\n * @param {Mixed} state Initial state passed to the action upon the first iteration.\n * @param {Number} period Period for running the work periodically.\n * @param {Function} action Action to be executed, potentially updating the state.\n * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n */\nVirtualTimeSchedulerPrototype.schedulePeriodic = function (state, period, action) {\n  var s = new SchedulePeriodicRecursive(this, state, period, action);\n  return s.start();\n};\n\n/**\n * Schedules an action to be executed after dueTime.\n * @param {Mixed} state State passed to the action to be executed.\n * @param {Number} dueTime Relative time after which to execute the action.\n * @param {Function} action Action to be executed.\n * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n */\nVirtualTimeSchedulerPrototype.scheduleRelative = function (state, dueTime, action) {\n  var runAt = this.add(this.clock, dueTime);\n  return this.scheduleAbsolute(state, runAt, action);\n};\n\n/**\n * Starts the virtual time scheduler.\n */\nVirtualTimeSchedulerPrototype.start = function () {\n  if (!this.isEnabled) {\n    this.isEnabled = true;\n    do {\n      var next = this.getNext();\n      if (next !== null) {\n        this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n        next.invoke();\n      } else {\n        this.isEnabled = false;\n      }\n    } while (this.isEnabled);\n  }\n};\n\n/**\n * Stops the virtual time scheduler.\n */\nVirtualTimeSchedulerPrototype.stop = function () {\n  this.isEnabled = false;\n};\n\n/**\n * Advances the scheduler's clock to the specified time, running all work till that point.\n * @param {Number} time Absolute time to advance the scheduler's clock to.\n */\nVirtualTimeSchedulerPrototype.advanceTo = function (time) {\n  var dueToClock = this.comparer(this.clock, time);\n  if (this.comparer(this.clock, time) > 0) { throw new errors.ArgumentOutOfRangeError(); }\n  if (dueToClock === 0) { return; }\n  if (!this.isEnabled) {\n    this.isEnabled = true;\n    do {\n      var next = this.getNext();\n      if (next !== null && this.comparer(next.dueTime, time) <= 0) {\n        this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n        next.invoke();\n      } else {\n        this.isEnabled = false;\n      }\n    } while (this.isEnabled);\n    this.clock = time;\n  }\n};\n\n/**\n * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n * @param {Number} time Relative time to advance the scheduler's clock by.\n */\nVirtualTimeSchedulerPrototype.advanceBy = function (time) {\n  var dt = this.add(this.clock, time),\n      dueToClock = this.comparer(this.clock, dt);\n  if (dueToClock > 0) { throw new errors.ArgumentOutOfRangeError(); }\n  if (dueToClock === 0) {  return; }\n\n  this.advanceTo(dt);\n};\n\n/**\n * Advances the scheduler's clock by the specified relative time.\n * @param {Number} time Relative time to advance the scheduler's clock by.\n */\nVirtualTimeSchedulerPrototype.sleep = function (time) {\n  var dt = this.add(this.clock, time);\n  if (this.comparer(this.clock, dt) >= 0) { throw new errors.ArgumentOutOfRangeError(); }\n\n  this.clock = dt;\n};\n\n/**\n * Gets the next scheduled item to be executed.\n * @returns {ScheduledItem} The next scheduled item.\n */\nVirtualTimeSchedulerPrototype.getNext = function () {\n  while (this.queue.length > 0) {\n    var next = this.queue.peek();\n    if (next.isCancelled()) {\n      this.queue.dequeue();\n    } else {\n      return next;\n    }\n  }\n  return null;\n};\n\n/**\n * Schedules an action to be executed at dueTime.\n * @param {Mixed} state State passed to the action to be executed.\n * @param {Number} dueTime Absolute time at which to execute the action.\n * @param {Function} action Action to be executed.\n * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n */\nVirtualTimeSchedulerPrototype.scheduleAbsolute = function (state, dueTime, action) {\n  var self = this;\n\n  function run(scheduler, state1) {\n    self.queue.remove(si);\n    return action(scheduler, state1);\n  }\n\n  var si = new ScheduledItem(this, state, run, dueTime, this.comparer);\n  this.queue.enqueue(si);\n\n  return si.disposable;\n};\n\nmodule.exports = VirtualTimeScheduler;\n"
  },
  {
    "path": "src/modular/scheduler.js",
    "content": "'use strict';\n\nvar errors = require('./internal/errors');\nvar Disposable = require('./disposable');\nvar CompositeDisposable = require('./compositedisposable');\n\nfunction Scheduler() { }\n\n/** Determines whether the given object is a scheduler */\nScheduler.isScheduler = function (s) {\n  return s instanceof Scheduler;\n};\n\n/**\n* Schedules an action to be executed.\n* @param state State passed to the action to be executed.\n* @param {Function} action Action to be executed.\n* @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n*/\nScheduler.prototype.schedule = function (state, action) {\n  throw new errors.NotImplementedError();\n};\n\n/**\n* Schedules an action to be executed after dueTime.\n* @param state State passed to the action to be executed.\n* @param {Function} action Action to be executed.\n* @param {Number} dueTime Relative time after which to execute the action.\n* @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n*/\nScheduler.prototype.scheduleFuture = function (state, dueTime, action) {\n  var dt = dueTime;\n  dt instanceof Date && (dt = dt - this.now());\n  dt = Scheduler.normalize(dt);\n\n  if (dt === 0) { return this.schedule(state, action); }\n\n  return this._scheduleFuture(state, dt, action);\n};\n\nScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n  throw new errors.NotImplementedError();\n};\n\nfunction PeriodicDisposable(id) {\n  this._id = id;\n  this.isDisposed = false;\n}\n\nPeriodicDisposable.prototype.dispose = function () {\n  if (!this.isDisposed) {\n    this.isDisposed = true;\n    global.clearInterval(this._id);\n  }\n};\n\n/**\n * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n * @param {Mixed} state Initial state passed to the action upon the first iteration.\n * @param {Number} period Period for running the work periodically.\n * @param {Function} action Action to be executed, potentially updating the state.\n * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n */\nScheduler.prototype.schedulePeriodic = function(state, period, action) {\n  if (typeof global.setInterval === 'undefined') { throw new errors.NotSupportedError(); }\n  period = Scheduler.normalize(period);\n  var s = state, id = global.setInterval(function () { s = action(s); }, period);\n  return new PeriodicDisposable(id);\n};\n\nfunction invokeRecImmediate(scheduler, pair) {\n  var state = pair[0], action = pair[1], group = new CompositeDisposable();\n  action(state, innerAction);\n  return group;\n\n  function innerAction(state2) {\n    var isAdded = false, isDone = false;\n\n    var d = scheduler.schedule(state2, scheduleWork);\n    if (!isDone) {\n      group.add(d);\n      isAdded = true;\n    }\n\n    function scheduleWork(_, state3) {\n      if (isAdded) {\n        group.remove(d);\n      } else {\n        isDone = true;\n      }\n      action(state3, innerAction);\n      return Disposable.empty;\n    }\n  }\n}\n\nfunction invokeRecDate(scheduler, pair) {\n  var state = pair[0], action = pair[1], group = new CompositeDisposable();\n  action(state, innerAction);\n  return group;\n\n  function innerAction(state2, dueTime1) {\n    var isAdded = false, isDone = false;\n\n    var d = scheduler.scheduleFuture(state2, dueTime1, scheduleWork);\n    if (!isDone) {\n      group.add(d);\n      isAdded = true;\n    }\n\n    function scheduleWork(_, state3) {\n      if (isAdded) {\n        group.remove(d);\n      } else {\n        isDone = true;\n      }\n      action(state3, innerAction);\n      return Disposable.empty;\n    }\n  }\n}\n\n/**\n * Schedules an action to be executed recursively.\n * @param {Mixed} state State passed to the action to be executed.\n * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n */\nScheduler.prototype.scheduleRecursive = function (state, action) {\n  return this.schedule([state, action], invokeRecImmediate);\n};\n\n/**\n * Schedules an action to be executed recursively after a specified relative or absolute due time.\n * @param {Mixed} state State passed to the action to be executed.\n * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n * @param {Number | Date} dueTime Relative or absolute time after which to execute the action for the first time.\n * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n */\nScheduler.prototype.scheduleRecursiveFuture = function (state, dueTime, action) {\n  return this.scheduleFuture([state, action], dueTime, invokeRecDate);\n};\n\nvar defaultNow = (function () { return !!Date.now ? Date.now : function () { return +new Date(); }; }());\n\n/** Gets the current time according to the local machine's system clock. */\nScheduler.now = defaultNow;\n\n/** Gets the current time according to the local machine's system clock. */\nScheduler.prototype.now = defaultNow;\n\n/**\n * Normalizes the specified TimeSpan value to a positive value.\n * @param {Number} timeSpan The time span value to normalize.\n * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n */\nScheduler.normalize = function (timeSpan) {\n  timeSpan < 0 && (timeSpan = 0);\n  return timeSpan;\n};\n\nmodule.exports = Scheduler;\n\nvar CurrentThreadScheduler = require('./scheduler/currentthreadscheduler');\nvar ImmediateScheduler = require('./scheduler/immediatescheduler');\nvar DefaultScheduler = require('./scheduler/defaultscheduler');\nvar CatchScheduler = require('./scheduler/catchscheduler');\n\nScheduler.queue = Scheduler.currentThread = new CurrentThreadScheduler();\nScheduler.async = Scheduler['default'] = Scheduler.timeout = new DefaultScheduler();\nScheduler.immediate = new ImmediateScheduler();\n\n/**\n * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n */\nScheduler.prototype['catch'] = function (handler) {\n  return new CatchScheduler(this, handler);\n};\n"
  },
  {
    "path": "src/modular/serialdisposable.js",
    "content": "'use strict';\n\nfunction SerialDisposable() {\n  this.isDisposed = false;\n  this._current = null;\n}\n\nSerialDisposable.prototype.getDisposable = function () {\n  return this._current;\n};\n\nSerialDisposable.prototype.setDisposable = function (value) {\n  var shouldDispose = this.isDisposed;\n  if (!shouldDispose) {\n    var old = this._current;\n    this._current = value;\n    old && old.dispose();\n  }\n\n  shouldDispose && value && value.dispose();\n};\n\nSerialDisposable.prototype.dispose = function () {\n  if (!this.isDisposed) {\n    this.isDisposed = true;\n    var old = this._current;\n    this._current = null;\n    old && old.dispose();\n  }\n};\n\nmodule.exports = SerialDisposable;\n"
  },
  {
    "path": "src/modular/singleassignmentdisposable.js",
    "content": "'use strict';\n\nfunction SingleAssignmentDisposable () {\n  this.isDisposed = false;\n  this._current = null;\n}\n\nSingleAssignmentDisposable.prototype.getDisposable = function () {\n  return this._current;\n};\n\nSingleAssignmentDisposable.prototype.setDisposable = function (value) {\n  if (this._current) { throw new Error('Disposable has already been assigned'); }\n  var shouldDispose = this.isDisposed;\n  !shouldDispose && (this._current = value);\n  shouldDispose && value && value.dispose();\n};\n\nSingleAssignmentDisposable.prototype.dispose = function () {\n  if (!this.isDisposed) {\n    this.isDisposed = true;\n    var old = this._current;\n    this._current = null;\n    old && old.dispose();\n  }\n};\n\nmodule.exports = SingleAssignmentDisposable;\n"
  },
  {
    "path": "src/modular/subject/create.js",
    "content": "'use strict';\n\nvar Observable = require('../observable');\nvar Observer = require('../observer');\nvar addProperties = require('../internal/addproperties');\nvar inherits = require('inherits');\n\nfunction AnonymousSubject(observer, observable) {\n  this.observer = observer;\n  this.observable = observable;\n  Observable.call(this);\n}\n\ninherits(AnonymousSubject, Observable);\n\naddProperties(AnonymousSubject.prototype, Observer.prototype, {\n  _subscribe: function (o) {\n    return this.observable.subscribe(o);\n  },\n  onCompleted: function () {\n    this.observer.onCompleted();\n  },\n  onError: function (error) {\n    this.observer.onError(error);\n  },\n  onNext: function (value) {\n    this.observer.onNext(value);\n  }\n});\n\n/**\n * Creates a subject from the specified observer and observable.\n * @param {Observer} observer The observer used to send messages to the subject.\n * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n * @returns {Subject} Subject implemented using the given observer and observable.\n */\nmodule.exports = function create(observer, observable) {\n  return new AnonymousSubject(observer, observable);\n};\n"
  },
  {
    "path": "src/modular/subject.js",
    "content": "'use strict';\n\nvar Disposable = require('./disposable');\nvar Observable = require('./observable');\nvar Observer = require('./observer');\nvar InnerSubscription = require('./internal/innersubscription');\nvar addProperties = require('./internal/addproperties');\nvar cloneArray = require('./internal/clonearray');\nvar inherits = require('inherits');\n\n/**\n*  Represents an object that is both an observable sequence as well as an observer.\n*  Each notification is broadcasted to all subscribed observers.\n*/\nfunction Subject() {\n  Observable.call(this);\n  this.isDisposed = false;\n  this.isStopped = false;\n  this.observers = [];\n  this.hasError = false;\n}\n\ninherits(Subject, Observable);\n\naddProperties(Subject.prototype, Observer.prototype, {\n  _subscribe: function (o) {\n    Disposable.checkDisposed(this);\n    if (!this.isStopped) {\n      this.observers.push(o);\n      return new InnerSubscription(this, o);\n    }\n    if (this.hasError) {\n      o.onError(this.error);\n      return Disposable.empty;\n    }\n    o.onCompleted();\n    return Disposable.empty;\n  },\n  /**\n   * Indicates whether the subject has observers subscribed to it.\n   * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n   */\n  hasObservers: function () {\n    Disposable.checkDisposed(this);\n    return this.observers.length > 0;\n  },\n  /**\n   * Notifies all subscribed observers about the end of the sequence.\n   */\n  onCompleted: function () {\n    Disposable.checkDisposed(this);\n    if (!this.isStopped) {\n      this.isStopped = true;\n      for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n        os[i].onCompleted();\n      }\n\n      this.observers.length = 0;\n    }\n  },\n  /**\n   * Notifies all subscribed observers about the exception.\n   * @param {Mixed} error The exception to send to all observers.\n   */\n  onError: function (error) {\n    Disposable.checkDisposed(this);\n    if (!this.isStopped) {\n      this.isStopped = true;\n      this.error = error;\n      this.hasError = true;\n      for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n        os[i].onError(error);\n      }\n\n      this.observers.length = 0;\n    }\n  },\n  /**\n   * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n   * @param {Mixed} value The value to send to all observers.\n   */\n  onNext: function (value) {\n    Disposable.checkDisposed(this);\n    if (!this.isStopped) {\n      for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n        os[i].onNext(value);\n      }\n    }\n  },\n  /**\n   * Unsubscribe all observers and release resources.\n   */\n  dispose: function () {\n    this.isDisposed = true;\n    this.observers = null;\n  }\n});\n\nSubject.addToObject = function (operators) {\n  Object.keys(operators).forEach(function (operator) {\n    Subject[operator] = operators[operator];\n  });\n};\n\nSubject.addToPrototype = function (operators) {\n  Object.keys(operators).forEach(function (operator) {\n    Subject.prototype[operator] = function () {\n      var args = [this];\n      args.push.apply(args, arguments);\n      return operators[operator].apply(null, args);\n    };\n  });\n};\n\n\nmodule.exports = Subject;\n"
  },
  {
    "path": "src/modular/test/asyncsubject.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar AsyncSubject = require('../asyncsubject');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n    onError = ReactiveTest.onError,\n    onCompleted = ReactiveTest.onCompleted;\n\ntest('AsyncSubject Infinite', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 1),\n    onNext(110, 2),\n    onNext(220, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(410, 6),\n    onNext(520, 7),\n    onNext(630, 8),\n    onNext(710, 9),\n    onNext(870, 10),\n    onNext(940, 11),\n    onNext(1020, 12)\n  );\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n  var subject;\n\n  var subscription, subscription1, subscription2, subscription3;\n\n  scheduler.scheduleAbsolute(null, 100, function () {\n    subject = new AsyncSubject();\n  });\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = xs.subscribe(subject);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    subscription1 = subject.subscribe(results1);\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    subscription2 = subject.subscribe(results2);\n  });\n\n  scheduler.scheduleAbsolute(null, 900, function () {\n    subscription3 = subject.subscribe(results3);\n  });\n\n  scheduler.scheduleAbsolute(null, 600, function () {\n    subscription1.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 700, function () {\n    subscription2.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    subscription1.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 950, function () {\n    subscription3.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, []);\n\n  reactiveAssert(t, results2.messages, []);\n\n  reactiveAssert(t, results3.messages, []);\n\n  t.end();\n});\n\ntest('AsyncSubject Finite', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 1),\n    onNext(110, 2),\n    onNext(220, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(410, 6),\n    onNext(520, 7),\n    onCompleted(630),\n    onNext(640, 9),\n    onCompleted(650),\n    onError(660, new Error())\n  );\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n\n  var subject;\n\n  var subscription, subscription1, subscription2, subscription3;\n\n  scheduler.scheduleAbsolute(null, 100, function () {\n    subject = new AsyncSubject();\n  });\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = xs.subscribe(subject);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    subscription1 = subject.subscribe(results1);\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    subscription2 = subject.subscribe(results2);\n  });\n\n  scheduler.scheduleAbsolute(null, 900, function () {\n    subscription3 = subject.subscribe(results3);\n  });\n\n  scheduler.scheduleAbsolute(null, 600, function () {\n    subscription1.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 700, function () {\n    subscription2.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    subscription1.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 950, function () {\n    subscription3.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, []);\n  reactiveAssert(t, results2.messages, [onNext(630, 7), onCompleted(630)]);\n  reactiveAssert(t, results3.messages, [onNext(900, 7), onCompleted(900)]);\n  t.end();\n});\n\ntest('AsyncSubject Error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 1),\n    onNext(110, 2),\n    onNext(220, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(410, 6),\n    onNext(520, 7),\n    onError(630, error),\n    onNext(640, 9),\n    onCompleted(650),\n    onError(660, new Error())\n  );\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n  var subject;\n\n  var subscription, subscription1, subscription2, subscription3;\n\n  scheduler.scheduleAbsolute(null, 100, function () {\n    subject = new AsyncSubject();\n  });\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = xs.subscribe(subject);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    subscription1 = subject.subscribe(results1);\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    subscription2 = subject.subscribe(results2);\n  });\n\n  scheduler.scheduleAbsolute(null, 900, function () {\n    subscription3 = subject.subscribe(results3);\n  });\n\n  scheduler.scheduleAbsolute(null, 600, function () {\n    subscription1.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 700, function () {\n    subscription2.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    subscription1.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 950, function () {\n    subscription3.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, []);\n  reactiveAssert(t, results2.messages, [onError(630, error)]);\n  reactiveAssert(t, results3.messages, [onError(900, error)]);\n  t.end();\n});\n\ntest('AsyncSubject cancelled', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onCompleted(630),\n    onNext(640, 9),\n    onCompleted(650),\n    onError(660, new Error()));\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n  var subject;\n\n  var subscription, subscription1, subscription2, subscription3;\n\n  scheduler.scheduleAbsolute(null, 100, function () {\n    subject = new AsyncSubject();\n  });\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = xs.subscribe(subject);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    subscription1 = subject.subscribe(results1);\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    subscription2 = subject.subscribe(results2);\n  });\n\n  scheduler.scheduleAbsolute(null, 900, function () {\n    subscription3 = subject.subscribe(results3);\n  });\n\n  scheduler.scheduleAbsolute(null, 600, function () {\n    subscription1.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 700, function () {\n    subscription2.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    subscription1.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 950, function () {\n    subscription3.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, []);\n  reactiveAssert(t, results2.messages, [onCompleted(630)]);\n  reactiveAssert(t, results3.messages, [onCompleted(900)]);\n  t.end();\n});\n\ntest('AsyncSubject disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n  var subject;\n\n  var subscription1, subscription2, subscription3;\n\n  scheduler.scheduleAbsolute(null, 100, function () {\n    subject = new AsyncSubject();\n  });\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription1 = subject.subscribe(results1);\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    subscription2 = subject.subscribe(results2);\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    subscription3 = subject.subscribe(results3);\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    subscription1.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 600, function () {\n    subject.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 700, function () {\n    subscription2.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    subscription3.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 150, function () {\n    subject.onNext(1);\n  });\n\n  scheduler.scheduleAbsolute(null, 250, function () {\n    subject.onNext(2);\n  });\n\n  scheduler.scheduleAbsolute(null, 350, function () {\n    subject.onNext(3);\n  });\n\n  scheduler.scheduleAbsolute(null, 450, function () {\n    subject.onNext(4);\n  });\n\n  scheduler.scheduleAbsolute(null, 550, function () {\n    subject.onNext(5);\n  });\n\n  scheduler.scheduleAbsolute(null, 650, function () {\n    t.throws(function () { subject.onNext(6); });\n  });\n\n  scheduler.scheduleAbsolute(null, 750, function () {\n    t.throws(function () { subject.onCompleted(); });\n  });\n\n  scheduler.scheduleAbsolute(null, 850, function () {\n    t.throws(function () { subject.onError(new Error()); });\n  });\n\n  scheduler.scheduleAbsolute(null, 950, function () {\n    t.throws(function () { subject.subscribe(); });\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, []);\n  reactiveAssert(t, results2.messages, []);\n  reactiveAssert(t, results3.messages, []);\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/average.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar EmptyError = require('../internal/errors').EmptyError;\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  average: require('../observable/average')\n});\n\ntest('Observable#average number Empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.average();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(250, function (n) { return n.error instanceof EmptyError; })\n  ]);\n\n  t.end();\n});\n\ntest('Observable#average number return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.average();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#average number some', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 3),\n    onNext(220, 4),\n    onNext(230, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.average();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 3),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#average number throw', function (t) {\n  var error = new Error();\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.average();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#average number never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.average();\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#average selector regular number', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 'b'),\n    onNext(220, 'fo'),\n    onNext(230, 'qux'),\n    onCompleted(240)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.average(function (x) { return x.length; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(240, 2),\n    onCompleted(240)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 240)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#average selector throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 'b'),\n    onNext(220, 'fo'),\n    onNext(230, 'qux'),\n    onCompleted(240)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.average(function () { throw error; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/behaviorsubject.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar BehaviorSubject = require('../behaviorsubject');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\ntest('BehaviorSubject Infinite', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 1),\n    onNext(110, 2),\n    onNext(220, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(410, 6),\n    onNext(520, 7),\n    onNext(630, 8),\n    onNext(710, 9),\n    onNext(870, 10),\n    onNext(940, 11),\n    onNext(1020, 12)\n  );\n\n  var subject, subscription, subscription1, subscription2, subscription3;\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, 100, function () { subject = new BehaviorSubject(100); });\n  scheduler.scheduleAbsolute(null, 200, function () { subscription = xs.subscribe(subject); });\n  scheduler.scheduleAbsolute(null, 1000, function () { subscription.dispose(); });\n\n  scheduler.scheduleAbsolute(null, 300, function () { subscription1 = subject.subscribe(results1); });\n  scheduler.scheduleAbsolute(null, 400, function () { subscription2 = subject.subscribe(results2); });\n  scheduler.scheduleAbsolute(null, 900, function () { subscription3 = subject.subscribe(results3); });\n\n  scheduler.scheduleAbsolute(null, 600, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n  scheduler.scheduleAbsolute(null, 800, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 950, function () { subscription3.dispose(); });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(300, 4),\n    onNext(340, 5),\n    onNext(410, 6),\n    onNext(520, 7)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(400, 5),\n    onNext(410, 6),\n    onNext(520, 7),\n    onNext(630, 8)\n  ]);\n\n  reactiveAssert(t, results3.messages, [\n    onNext(900, 10),\n    onNext(940, 11)\n  ]);\n\n  t.end();\n});\n\ntest('BehaviorSubject Finite', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 1),\n    onNext(110, 2),\n    onNext(220, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(410, 6),\n    onNext(520, 7),\n    onCompleted(630),\n    onNext(640, 9),\n    onCompleted(650),\n    onError(660, new Error())\n  );\n\n  var subject, subscription, subscription1, subscription2, subscription3;\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, 100, function () { subject = new BehaviorSubject(100); });\n  scheduler.scheduleAbsolute(null, 200, function () { subscription = xs.subscribe(subject); });\n  scheduler.scheduleAbsolute(null, 1000, function () { subscription.dispose(); });\n\n  scheduler.scheduleAbsolute(null, 300, function () { subscription1 = subject.subscribe(results1); });\n  scheduler.scheduleAbsolute(null, 400, function () { subscription2 = subject.subscribe(results2); });\n  scheduler.scheduleAbsolute(null, 900, function () { subscription3 = subject.subscribe(results3); });\n\n  scheduler.scheduleAbsolute(null, 600, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n  scheduler.scheduleAbsolute(null, 800, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 950, function () { subscription3.dispose(); });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(300, 4),\n    onNext(340, 5),\n    onNext(410, 6),\n    onNext(520, 7)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(400, 5),\n    onNext(410, 6),\n    onNext(520, 7),\n    onCompleted(630)\n  ]);\n\n  reactiveAssert(t, results3.messages, [\n    onCompleted(900)\n  ]);\n\n  t.end();\n});\n\ntest('BehaviorSubject Error', function (t) {\n  var scheduler = new TestScheduler();\n\n  var ex = new Error();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 1),\n    onNext(110, 2),\n    onNext(220, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(410, 6),\n    onNext(520, 7),\n    onError(630, ex),\n    onNext(640, 9),\n    onCompleted(650),\n    onError(660, new Error())\n  );\n\n  var subject, subscription, subscription1, subscription2, subscription3;\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, 100, function () { subject = new BehaviorSubject(100); });\n  scheduler.scheduleAbsolute(null, 200, function () { subscription = xs.subscribe(subject); });\n  scheduler.scheduleAbsolute(null, 1000, function () { subscription.dispose(); });\n\n  scheduler.scheduleAbsolute(null, 300, function () { subscription1 = subject.subscribe(results1); });\n  scheduler.scheduleAbsolute(null, 400, function () { subscription2 = subject.subscribe(results2); });\n  scheduler.scheduleAbsolute(null, 900, function () { subscription3 = subject.subscribe(results3); });\n\n  scheduler.scheduleAbsolute(null, 600, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n  scheduler.scheduleAbsolute(null, 800, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 950, function () { subscription3.dispose(); });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(300, 4),\n    onNext(340, 5),\n    onNext(410, 6),\n    onNext(520, 7)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(400, 5),\n    onNext(410, 6),\n    onNext(520, 7),\n    onError(630, ex)\n  ]);\n\n  reactiveAssert(t, results3.messages, [\n    onError(900, ex)\n  ]);\n\n  t.end();\n});\n\ntest('BehaviorSubject Canceled', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onCompleted(630),\n    onNext(640, 9),\n    onCompleted(650),\n    onError(660, new Error())\n  );\n\n  var subject, subscription, subscription1, subscription2, subscription3;\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, 100, function () { subject = new BehaviorSubject(100); });\n  scheduler.scheduleAbsolute(null, 200, function () { subscription = xs.subscribe(subject); });\n  scheduler.scheduleAbsolute(null, 1000, function () { subscription.dispose(); });\n\n  scheduler.scheduleAbsolute(null, 300, function () { subscription1 = subject.subscribe(results1); });\n  scheduler.scheduleAbsolute(null, 400, function () { subscription2 = subject.subscribe(results2); });\n  scheduler.scheduleAbsolute(null, 900, function () { subscription3 = subject.subscribe(results3); });\n\n  scheduler.scheduleAbsolute(null, 600, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n  scheduler.scheduleAbsolute(null, 800, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 950, function () { subscription3.dispose(); });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(300, 100)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(400, 100),\n    onCompleted(630)\n  ]);\n\n  reactiveAssert(t, results3.messages, [\n    onCompleted(900)\n  ]);\n\n  t.end();\n});\n\ntest('BehaviorSubject subject disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var subject;\n\n  var results1 = scheduler.createObserver();\n  var subscription1;\n\n  var results2 = scheduler.createObserver();\n  var subscription2;\n\n  var results3 = scheduler.createObserver();\n  var subscription3;\n\n  scheduler.scheduleAbsolute(null, 100, function () { subject = new BehaviorSubject(0); });\n  scheduler.scheduleAbsolute(null, 200, function () { subscription1 = subject.subscribe(results1); });\n  scheduler.scheduleAbsolute(null, 300, function () { subscription2 = subject.subscribe(results2); });\n  scheduler.scheduleAbsolute(null, 400, function () { subscription3 = subject.subscribe(results3); });\n  scheduler.scheduleAbsolute(null, 500, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 600, function () { subject.dispose(); });\n  scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n  scheduler.scheduleAbsolute(null, 800, function () { subscription3.dispose(); });\n\n  scheduler.scheduleAbsolute(null, 150, function () { subject.onNext(1); });\n  scheduler.scheduleAbsolute(null, 250, function () { subject.onNext(2); });\n  scheduler.scheduleAbsolute(null, 350, function () { subject.onNext(3); });\n  scheduler.scheduleAbsolute(null, 450, function () { subject.onNext(4); });\n  scheduler.scheduleAbsolute(null, 550, function () { subject.onNext(5); });\n  scheduler.scheduleAbsolute(null, 650, function () { t.throws(function () { subject.onNext(6); }); });\n  scheduler.scheduleAbsolute(null, 750, function () { t.throws(function () { subject.onCompleted(); }); });\n  scheduler.scheduleAbsolute(null, 850, function () { t.throws(function () { subject.onError(new Error()); }); });\n  scheduler.scheduleAbsolute(null, 950, function () { t.throws(function () { subject.subscribe(); }); });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(200, 1),\n    onNext(250, 2),\n    onNext(350, 3),\n    onNext(450, 4)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(300, 2),\n    onNext(350, 3),\n    onNext(450, 4),\n    onNext(550, 5)\n  ]);\n\n  reactiveAssert(t, results3.messages, [\n    onNext(400, 3),\n    onNext(450, 4),\n    onNext(550, 5)\n  ]);\n\n  t.end();\n});\n\ntest('BehaviorSubject value vs getValue()', function (t) {\n  var scheduler = new TestScheduler();\n\n  var subject;\n\n  var resultsGetValue = scheduler.createObserver();\n  var resultsValue = scheduler.createObserver();\n\n  // create and dispose\n  scheduler.scheduleAbsolute(null, 100, function () { subject = new BehaviorSubject(0); });\n  scheduler.scheduleAbsolute(null, 650, function () { subject.dispose(); });\n\n  // fill the subject with values\n  scheduler.scheduleAbsolute(null, 150, function () { subject.onNext(1); });\n  scheduler.scheduleAbsolute(null, 250, function () { subject.onNext(2); });\n  scheduler.scheduleAbsolute(null, 350, function () { subject.onNext(3); });\n  scheduler.scheduleAbsolute(null, 450, function () { subject.onNext(4); });\n  scheduler.scheduleAbsolute(null, 550, function () { subject.onError(new Error('Subject onError() method has been called')); });\n\n  // getValue()\n  scheduler.scheduleAbsolute(null, 200, function () { resultsGetValue.onNext(subject.getValue()); });\n  scheduler.scheduleAbsolute(null, 300, function () { resultsGetValue.onNext(subject.getValue()); });\n  scheduler.scheduleAbsolute(null, 400, function () { resultsGetValue.onNext(subject.getValue()); });\n  scheduler.scheduleAbsolute(null, 500, function () { resultsGetValue.onNext(subject.getValue()); });\n  scheduler.scheduleAbsolute(null, 600, function () { t.throws(function () { resultsGetValue.onNext(subject.getValue()); }); });\n  scheduler.scheduleAbsolute(null, 700, function () { t.throws(function () { resultsGetValue.onNext(subject.getValue()); }); });\n\n  // value\n  scheduler.scheduleAbsolute(null, 200, function () { resultsValue.onNext(subject.value); });\n  scheduler.scheduleAbsolute(null, 300, function () { resultsValue.onNext(subject.value); });\n  scheduler.scheduleAbsolute(null, 400, function () { resultsValue.onNext(subject.value); });\n  scheduler.scheduleAbsolute(null, 500, function () { resultsValue.onNext(subject.value); });\n  scheduler.scheduleAbsolute(null, 600, function () { resultsValue.onNext(subject.value); });\n  scheduler.scheduleAbsolute(null, 700, function () { resultsValue.onNext(subject.value); });\n\n  scheduler.start();\n\n  reactiveAssert(t, resultsGetValue.messages, [\n    onNext(200, 1),\n    onNext(300, 2),\n    onNext(400, 3),\n    onNext(500, 4)\n\n    // getValue() throws an exception if BehaviorSubject.onError() has been called\n    //onNext(600)\n\n    // getValue() throws an exception if BehaviorSubject has been disposed\n    //onNext(700)\n  ]);\n\n  reactiveAssert(t, resultsValue.messages, [\n    onNext(200, 1),\n    onNext(300, 2),\n    onNext(400, 3),\n    onNext(500, 4),\n\n    // value is frozen if BehaviorSubject.onError() has been called\n    onNext(600, 4),\n\n    // value returns null if BehaviorSubject has been disposed\n    onNext(700, null)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/binarydisposable.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Disposable = require('../disposable');\nvar BinaryDisposable = require('../binarydisposable');\n\ntest('BinaryDisposable#constructor', function (t) {\n  var disp1 = false;\n  var disp2 = false;\n\n  var d1 = Disposable.create(function () { disp1 = true; });\n  var d2 = Disposable.create(function () { disp2 = true; });\n\n  var b = new BinaryDisposable(d1, d2);\n\n  t.equal(b.isDisposed, false, 'should not be disposed');\n  t.equal(disp1, false, 'first should not be disposed');\n  t.equal(disp2, false, 'second should not be disposed');\n\n  t.end();\n});\n\ntest('BinaryDisposable#dispose', function (t) {\n  var disp1 = false;\n  var disp2 = false;\n\n  var d1 = Disposable.create(function () { disp1 = true; });\n  var d2 = Disposable.create(function () { disp2 = true; });\n\n  var b = new BinaryDisposable(d1, d2);\n\n  t.equal(b.isDisposed, false, 'should not be disposed');\n  t.equal(disp1, false, 'first should not be disposed');\n  t.equal(disp2, false, 'second should not be disposed');\n\n  b.dispose();\n\n  t.equal(b.isDisposed, true, 'should be disposed');\n  t.equal(disp1, true, 'first should be disposed');\n  t.equal(disp2, true, 'second should be disposed');\n\n  b.dispose();\n\n  t.equal(b.isDisposed, true, 'should be idempotent');\n  t.equal(disp1, true, 'first should be idempotent');\n  t.equal(disp2, true, 'second should be idempotent');\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/bindcallback.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  bindCallback: require('../observable/bindcallback')\n});\n\ntest('Observable.bindCallback', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.bindCallback(function (cb) { cb(true); })();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, true),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.bindCallback throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.bindCallback(function () { throw error; })();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(200, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.bindCallback single argument', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.bindCallback(function (file, cb) { cb(file); })('file.txt');\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 'file.txt'),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.bindCallback selector', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.bindCallback(\n      function (f, s, t, cb) { cb(1,2,3); },\n      null,\n      function (f) { return f; })(1,2,3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 1),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.bindCallback selector throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.bindCallback(\n      function (f, s, t, cb) { cb(1,2,3); },\n      null,\n      function () { throw error; })(1,2,3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(200, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.bindCallback ctx', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.bindCallback(\n      function (cb) { t.equal(this, 42); cb(null); },\n      42)();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, null),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.bindCallback resubscribe', function (t) {\n  var count = 0;\n\n  var res = Observable.bindCallback( function(cb) { cb(++count); })();\n\n  res.subscribe(function (x) {\n    t.equal(x, 1);\n  }, function () {\n    t.fail();\n  }, function () {\n    t.ok(true);\n  });\n\n  res.subscribe(function (x) {\n    t.equal(x, 1);\n  }, function () {\n    t.fail();\n  }, function () {\n    t.ok(true);\n  });\n\n  t.equal(1, count);\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/bindnodecallback.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  bindNodeCallback: require('../observable/bindnodecallback')\n});\n\ntest('Observable.bindNodeCallback', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.bindNodeCallback(function (cb) { cb(null); })();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, undefined),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.bindNodeCallback throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.bindNodeCallback(function () { throw error; })();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(200, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.bindNodeCallback single', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.bindNodeCallback(function (file, cb) { cb(null, file); })('foo');\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 'foo'),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.bindNodeCallback selector', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.bindNodeCallback(\n      function (f, s, t, cb) { cb(null, f, s, t); },\n      null,\n      function (f) { return f; })(1,2,3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 1),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.bindNodeCallback selector throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.bindNodeCallback(\n      function (f, s, t, cb) { cb(null, f, s, t); },\n      null,\n      function () { throw error; })(1,2,3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(200, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.bindNodeCallback selector', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.bindNodeCallback(\n      function (f, s, t, cb) { cb(null, f, s, t); },\n      null,\n      function (f) { return f; })(1,2,3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 1),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.bindNodeCallback ctx', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.bindNodeCallback(\n      function (cb) { t.equal(this, 42); cb(null); },\n      42)();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, undefined),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.bindNodeCallback Error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.bindNodeCallback(function (cb) { cb(error); })();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(200, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.bindNodeCallback resubscribe', function (t) {\n  var count = 0;\n\n  var res = Observable.bindNodeCallback( function(cb) { cb(null, ++count); })();\n\n  res.subscribe(function (x) {\n    t.equal(x, 1);\n  }, function () {\n    t.fail();\n  }, function () {\n    t.ok(true);\n  });\n\n  res.subscribe(function (x) {\n    t.equal(x, 1);\n  }, function () {\n    t.fail();\n  }, function () {\n    t.ok(true);\n  });\n\n  t.equal(1, count);\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/buffer.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToObject({\n  empty: require('../observable/empty'),\n  'throw': require('../observable/throw'),\n  timer: require('../observable/timer')\n});\n\nObservable.addToPrototype({\n  buffer: require('../observable/buffer'),\n  delay: require('../observable/delay')\n});\n\ntest('Observable#buffer Boundaries Simple', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(255, true),\n    onNext(330, true),\n    onNext(350, true),\n    onNext(400, true),\n    onNext(500, true),\n    onCompleted(900)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.buffer(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(255, [3]),\n    onNext(330, [4, 5]),\n    onNext(350, [6]),\n    onNext(400, [ ]),\n    onNext(500, [7, 8, 9]),\n    onNext(590, [10]),\n    onCompleted(590)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 590)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 590)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#buffer Boundaries onCompleted Boundaries', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(255, true),\n    onNext(330, true),\n    onNext(350, true),\n    onCompleted(400)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.buffer(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(255, [3]),\n    onNext(330, [4, 5]),\n    onNext(350, [6]),\n    onNext(400, []),\n    onCompleted(400)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#buffer Boundaries onError Source', function (t) {\n  var ex = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(380, 7),\n    onError(400, ex)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(255, true),\n    onNext(330, true),\n    onNext(350, true),\n    onCompleted(500)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.buffer(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(255, [3]),\n    onNext(330, [4, 5]),\n    onNext(350, [6]),\n    onError(400, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#buffer Boundaries onError Boundaries', function (t) {\n  var ex = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(255, true),\n    onNext(330, true),\n    onNext(350, true),\n    onError(400, ex)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.buffer(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(255, [3]),\n    onNext(330, [4, 5]),\n    onNext(350, [6]),\n    onError(400, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#buffer Closings Basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590)\n  );\n\n  var window = 1;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.buffer(function () { return Observable.timer((window++) * 100, scheduler); });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, [ 3, 4 ]),\n    onNext(500, [ 5, 6, 7, 8, 9 ]),\n    onNext(590, [ 10 ]),\n    onCompleted(590)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 590)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#buffer Closings Inner Subscriptions', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590)\n  );\n\n  var closings = [\n    scheduler.createHotObservable(\n      onNext(300, true),\n      onNext(350, false),\n      onCompleted(380)\n    ),\n    scheduler.createHotObservable(\n      onNext(400, true),\n      onNext(510, false),\n      onNext(620, false)\n    ),\n    scheduler.createHotObservable(\n      onCompleted(500)\n    ),\n    scheduler.createHotObservable(\n      onNext(600, true)\n    )\n  ];\n\n  var window = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.buffer(function () { return closings[window++]; });\n  });\n\n  reactiveAssert(t, results.messages, [\n      onNext(300, [3, 4 ]),\n      onNext(400, [5, 6 ]),\n      onNext(500, [7, 8, 9 ]),\n      onNext(590, [10 ]),\n      onCompleted(590)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 590)\n  ]);\n\n  reactiveAssert(t, closings[0].subscriptions, [\n    subscribe(200, 300)\n  ]);\n\n  reactiveAssert(t, closings[1].subscriptions, [\n    subscribe(300, 400)\n  ]);\n\n  reactiveAssert(t, closings[2].subscriptions, [\n    subscribe(400, 500)\n  ]);\n\n  reactiveAssert(t, closings[3].subscriptions, [\n    subscribe(500, 590)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#buffer Closings Empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590)\n  );\n\n  var window = 1;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.buffer(function () { return Observable.empty().delay((window++) * 100, scheduler); });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, [3, 4]),\n    onNext(500, [5, 6, 7, 8, 9]),\n    onNext(590, [10]),\n    onCompleted(590)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 590)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#buffer Closings Dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590)\n  );\n\n  var window = 1;\n\n  var results = scheduler.startScheduler(\n    function () {\n      return xs.buffer(function () { return Observable.timer((window++) * 100, scheduler); });\n    },\n    { disposed: 400 }\n  );\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, [ 3, 4 ])\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#buffer Closings Error', function (t) {\n  var scheduler = new TestScheduler();\n\n  var ex = new Error();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onError(590, ex)\n  );\n\n  var window = 1;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.buffer(function () { return Observable.timer((window++) * 100, scheduler); });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, [ 3, 4 ]),\n    onNext(500, [ 5, 6, 7, 8, 9 ]),\n    onError(590, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 590)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#buffer Closings Throw', function (t) {\n  var scheduler = new TestScheduler();\n\n  var ex = new Error();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onError(590, new Error())\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.buffer(function () { throw ex; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(200, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#buffer Closings Window Close Error', function (t) {\n  var scheduler = new TestScheduler();\n\n  var ex = new Error();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onError(590, new Error())\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.buffer(function () { return Observable['throw'](ex, scheduler); });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(201, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 201)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#buffer Opening Closings Basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(255, 50),\n    onNext(330, 100),\n    onNext(350, 50),\n    onNext(400, 90),\n    onCompleted(900)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.buffer(ys, function (x) { return Observable.timer(x, null, scheduler); });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(305, [4 ]),\n    onNext(400, [ ]),\n    onNext(430, [6, 7, 8]),\n    onNext(490, [7, 8, 9]),\n    onCompleted(900)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 900)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 900)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/buffercount.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  bufferCount: require('../observable/buffercount')\n});\n\ntest('Observable#bufferCount partial window', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.bufferCount(5);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, [2,3,4,5]),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#bufferCount full windows', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.bufferCount(2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, [2,3]),\n    onNext(240, [4,5]),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#bufferCount full and partial windows', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.bufferCount(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, [2,3,4]),\n    onNext(250, [5]),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#bufferCount Error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onError(250, error));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.bufferCount(5);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(250, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#bufferCount skip less', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.bufferCount(3, 1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, [2,3,4]),\n    onNext(240, [3,4,5]),\n    onNext(250, [4,5]),\n    onNext(250, [5]),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#bufferCount skip more', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.bufferCount(2, 3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, [2,3]),\n    onNext(250, [5]),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#bufferCount basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(100, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(280, 4),\n    onNext(320, 5),\n    onNext(350, 6),\n    onNext(380, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onCompleted(600));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.bufferCount(3, 2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(280, [2,3,4]),\n    onNext(350, [4,5,6]),\n    onNext(420, [6,7,8]),\n    onNext(600, [8,9]),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#bufferCount disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(100, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(280, 4),\n    onNext(320, 5),\n    onNext(350, 6),\n    onNext(380, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onCompleted(600));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.bufferCount(3, 2);\n  }, {disposed: 370 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(280, [2,3,4]),\n    onNext(350, [4,5,6])\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 370)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/buffertime.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  bufferTime: require('../observable/buffertime')\n});\n\ntest('Observable#bufferTime Basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(100, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(280, 4),\n    onNext(320, 5),\n    onNext(350, 6),\n    onNext(380, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onCompleted(600));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.bufferTime(100, 70, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, [2,3,4]),\n    onNext(370, [4,5,6]),\n    onNext(440, [6,7,8]),\n    onNext(510, [8,9]),\n    onNext(580, []),\n    onNext(600, []),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#bufferTime Error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(100, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(280, 4),\n    onNext(320, 5),\n    onNext(350, 6),\n    onNext(380, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onError(600, error));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.bufferTime(100, 70, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, [2,3,4]),\n    onNext(370, [4,5,6]),\n    onNext(440, [6,7,8]),\n    onNext(510, [8,9]),\n    onNext(580, []),\n    onError(600, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#bufferTime Disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(100, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(280, 4),\n    onNext(320, 5),\n    onNext(350, 6),\n    onNext(380, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onCompleted(600));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.bufferTime(100, 70, scheduler);\n  }, {disposed: 370});\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, [2,3,4])\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 370)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#bufferTime Basic Same', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(100, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(280, 4),\n    onNext(320, 5),\n    onNext(350, 6),\n    onNext(380, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.bufferTime(100, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, [2,3,4]),\n    onNext(400, [5,6,7]),\n    onNext(500, [8,9]),\n    onNext(600, []),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/buffertimeorcount.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  bufferTimeOrCount: require('../observable/buffertimeorcount')\n});\n\ntest('Observable#bufferTimeOrCount basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(205, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(280, 4),\n    onNext(320, 5),\n    onNext(350, 6),\n    onNext(370, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.bufferTimeOrCount(70, 3, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(240, [1,2,3]),\n    onNext(310, [4]),\n    onNext(370, [5,6,7]),\n    onNext(440, [8]),\n    onNext(510, [9]),\n    onNext(580, []),\n    onNext(600, []),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#bufferTimeOrCount error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(205, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(280, 4),\n    onNext(320, 5),\n    onNext(350, 6),\n    onNext(370, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onError(600, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.bufferTimeOrCount(70, 3, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(240, [1,2,3]),\n    onNext(310, [4]),\n    onNext(370, [5,6,7]),\n    onNext(440, [8]),\n    onNext(510, [9]),\n    onNext(580, []),\n    onError(600, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#bufferTimeOrCount disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(205, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(280, 4),\n    onNext(320, 5),\n    onNext(350, 6),\n    onNext(370, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.bufferTimeOrCount(70, 3, scheduler);\n  }, { disposed: 370 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(240, [1,2,3]),\n    onNext(310, [4]),\n    onNext(370, [5,6,7])\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 370)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#bufferTimeOrCount multiple', function(t) {\n  var scheduler = new TestScheduler();\n\n  var xs1 = scheduler.createHotObservable(onCompleted(700))\n    .bufferTimeOrCount(100, 3, scheduler);\n\n  var xs2 = scheduler.createHotObservable(onCompleted(700))\n    .bufferTimeOrCount(150, 4, scheduler);\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, 370, function (){\n    xs1.subscribe(results1);\n    xs2.subscribe(results2);\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(470, []),\n    onNext(570, []),\n    onNext(670, []),\n    onNext(700, []),\n    onCompleted(700)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(520, []),\n    onNext(670, []),\n    onNext(700, []),\n    onCompleted(700)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/case.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToObject({\n  'case': require('../observable/case')\n});\n\ntest('Observable.case one', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(240, 2),\n    onNext(270, 3),\n    onCompleted(300)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(220, 11),\n    onNext(250, 12),\n    onNext(280, 13),\n    onCompleted(310)\n  );\n\n  var zs = scheduler.createHotObservable(\n    onNext(230, 21),\n    onNext(240, 22),\n    onNext(290, 23),\n    onCompleted(320)\n  );\n\n  var map = {\n    1: xs,\n    2: ys\n  };\n\n  var results = scheduler.startScheduler(function () {\n    return Observable['case'](function () { return 1; }, map, zs);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(240, 2),\n    onNext(270, 3),\n    onCompleted(300)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 300)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, []);\n\n  reactiveAssert(t, zs.subscriptions, []);\n\n  t.end();\n});\n\ntest('Observable.case two', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(240, 2),\n    onNext(270, 3),\n    onCompleted(300)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(220, 11),\n    onNext(250, 12),\n    onNext(280, 13),\n    onCompleted(310)\n  );\n\n  var zs = scheduler.createHotObservable(\n    onNext(230, 21),\n    onNext(240, 22),\n    onNext(290, 23),\n    onCompleted(320)\n  );\n\n  var map = {\n    1: xs,\n    2: ys\n  };\n\n  var results = scheduler.startScheduler(function () {\n    return Observable['case'](function () { return 2; }, map, zs);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 11),\n    onNext(250, 12),\n    onNext(280, 13),\n    onCompleted(310)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, []);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 310)\n  ]);\n\n  reactiveAssert(t, zs.subscriptions, []);\n\n  t.end();\n});\n\ntest('Observable.case three', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(240, 2),\n    onNext(270, 3),\n    onCompleted(300)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(220, 11),\n    onNext(250, 12),\n    onNext(280, 13),\n    onCompleted(310)\n  );\n\n  var zs = scheduler.createHotObservable(\n    onNext(230, 21),\n    onNext(240, 22),\n    onNext(290, 23),\n    onCompleted(320)\n  );\n\n  var map = {\n    1: xs,\n    2: ys\n  };\n\n  var results = scheduler.startScheduler(function () {\n    return Observable['case'](function () { return 3; }, map, zs);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 21),\n    onNext(240, 22),\n    onNext(290, 23),\n    onCompleted(320)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, []);\n\n  reactiveAssert(t, ys.subscriptions, []);\n\n  reactiveAssert(t, zs.subscriptions, [\n    subscribe(200, 320)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.case Throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(240, 2),\n    onNext(270, 3),\n    onCompleted(300)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(220, 11),\n    onNext(250, 12),\n    onNext(280, 13),\n    onCompleted(310)\n  );\n\n  var zs = scheduler.createHotObservable(\n    onNext(230, 21),\n    onNext(240, 22),\n    onNext(290, 23),\n    onCompleted(320)\n  );\n\n  var map = {\n    1: xs,\n    2: ys\n  };\n\n  var results = scheduler.startScheduler(function () {\n    return Observable['case'](function () { throw error; }, map, zs);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(200, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, []);\n\n  reactiveAssert(t, ys.subscriptions, []);\n\n  reactiveAssert(t, zs.subscriptions, []);\n\n  t.end();\n});\n\ntest('Observable.case with default one', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(240, 2),\n    onNext(270, 3),\n    onCompleted(300));\n\n  var ys = scheduler.createHotObservable(\n    onNext(220, 11),\n    onNext(250, 12),\n    onNext(280, 13),\n    onCompleted(310));\n\n  var map = {\n    1: xs,\n    2: ys\n  };\n\n  var results = scheduler.startScheduler(function () {\n    return Observable['case'](function () { return 1; }, map, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(240, 2),\n    onNext(270, 3),\n    onCompleted(300)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 300)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, []);\n\n  t.end();\n});\n\ntest('Observable.case with default two', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(240, 2),\n    onNext(270, 3),\n    onCompleted(300)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(220, 11),\n    onNext(250, 12),\n    onNext(280, 13),\n    onCompleted(310)\n  );\n\n  var map = {\n    1: xs,\n    2: ys\n  };\n\n  var results = scheduler.startScheduler(function () {\n    return Observable['case'](function () { return 2; }, map, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 11),\n    onNext(250, 12),\n    onNext(280, 13),\n    onCompleted(310)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, []);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 310)\n  ]);\n\n  t.end();\n});\n\ntest('case with default three', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(240, 2),\n    onNext(270, 3),\n    onCompleted(300));\n\n  var ys = scheduler.createHotObservable(\n    onNext(220, 11),\n    onNext(250, 12),\n    onNext(280, 13),\n    onCompleted(310));\n\n  var map = {\n    1: xs,\n    2: ys\n  };\n\n  var results = scheduler.startScheduler(function () {\n    return Observable['case'](function () { return 3; }, map, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(201)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, []);\n\n  reactiveAssert(t, ys.subscriptions, []);\n\n  t.end();\n});\n\ntest('Observable.case with default throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(240, 2),\n    onNext(270, 3),\n    onCompleted(300));\n\n  var ys = scheduler.createHotObservable(\n    onNext(220, 11),\n    onNext(250, 12),\n    onNext(280, 13),\n    onCompleted(310));\n\n  var map = {\n    1: xs,\n    2: ys\n  };\n  var results = scheduler.startScheduler(function () {\n    return Observable['case'](function () { throw error; }, map, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(200, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, []);\n\n  reactiveAssert(t, ys.subscriptions, []);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/catch.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar create = require('../observable/create');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  'catch': require('../observable/catch'),\n  never: require('../observable/never')\n});\n\nObservable.addToPrototype({\n  'catch': require('../observable/catch')\n});\n\ntest('Observable.catch NoErrors', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onCompleted(230)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return o1['catch'](o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onCompleted(230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.catch never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = Observable.never();\n\n  var o2 = scheduler.createHotObservable(\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return o1['catch'](o2);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable.catch empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(230)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return o1['catch'](o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.catch return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(230)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return o1['catch'](o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onCompleted(230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.catch error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onError(230, error)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return o1['catch'](o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(240, 5),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.catch error never', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onError(230, error)\n  );\n\n  var o2 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return o1['catch'](o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.catch error error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onError(230, new Error())\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(240, 4),\n    onError(250, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return o1['catch'](o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(240, 4),\n    onError(250, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.catch multiple', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(215, error)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(220, 3),\n    onError(225, error)\n  );\n\n  var o3 = scheduler.createHotObservable(\n    onNext(230, 4),\n    onCompleted(235)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable['catch'](o1, o2, o3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onCompleted(235)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.catch does not lose subscription to underlying observable', function (t) {\n  var subscribes = 0,\n    unsubscribes = 0,\n    tracer = create(function () { ++subscribes; return function () { ++unsubscribes; }; }),\n    s;\n\n  // Try it without catchError()\n  s = tracer.subscribe();\n  t.equal(subscribes, 1, '1 subscribes');\n  t.equal(unsubscribes, 0, '0 unsubscribes');\n  s.dispose();\n  t.equal(subscribes, 1, 'After dispose: 1 subscribes');\n  t.equal(unsubscribes, 1, 'After dispose: 1 unsubscribes');\n\n  // Now try again with catchError(Observable):\n  subscribes = unsubscribes = 0;\n  s = tracer['catch'](Observable.never()).subscribe();\n  t.equal(subscribes, 1, 'catchError(Observable): 1 subscribes');\n  t.equal(unsubscribes, 0, 'catchError(Observable): 0 unsubscribes');\n  s.dispose();\n  t.equal(subscribes, 1, 'catchError(Observable): After dispose: 1 subscribes');\n  t.equal(unsubscribes, 1, 'catchError(Observable): After dispose: 1 unsubscribes');\n\n  // And now try again with catchError(function()):\n  subscribes = unsubscribes = 0;\n  s = tracer['catch'](function () { return Observable.never(); }).subscribe();\n  t.equal(subscribes, 1, 'catchError(function): 1 subscribes');\n  t.equal(unsubscribes, 0, 'catchError(function): 0 unsubscribes');\n  s.dispose();\n  t.equal(subscribes, 1, 'catchError(function): After dispose: 1 subscribes');\n  t.equal(unsubscribes, 1, 'catchError(function): After dispose: 1 unsubscribes'); // this one FAILS (unsubscribes is 0)\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/catchhandler.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  'throw': require('../observable/throw')\n});\n\nObservable.addToPrototype({\n  catchHandler: require('../observable/catchhandler')\n});\n\ntest('Observable#catchHandler specific error caught', function (t) {\n  var error = new Error();\n\n  var handlerCalled = false;\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onError(230, error)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(240, 4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return o1.catchHandler(function () {\n      handlerCalled = true;\n      return o2;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(240, 4),\n    onCompleted(250)\n  ]);\n\n  t.ok(handlerCalled);\n\n  t.end();\n});\n\ntest('Observable#catchHandler specific error caughtImmediate', function (t) {\n  var handlerCalled = false;\n\n  var scheduler = new TestScheduler();\n\n  var o2 = scheduler.createHotObservable(\n    onNext(240, 4),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return Observable['throw'](new Error()).catchHandler(function () {\n      handlerCalled = true;\n      return o2;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(240, 4),\n    onCompleted(250)\n  ]);\n\n  t.ok(handlerCalled);\n\n  t.end();\n});\n\ntest('Observable#catchHandler HandlerThrows', function (t) {\n  var error = new Error();\n\n  var error2 = new Error();\n\n  var handlerCalled = false;\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onError(230, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return o1.catchHandler(function () {\n      handlerCalled = true;\n      throw error2;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onError(230, error2)\n  ]);\n\n  t.ok(handlerCalled);\n\n  t.end();\n});\n\ntest('Observable#catchHandler Nested OuterCatches', function (t) {\n  var error = new Error();\n\n  var firstHandlerCalled = false;\n  var secondHandlerCalled = false;\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(215, error)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(220, 3),\n    onCompleted(225)\n  );\n\n  var o3 = scheduler.createHotObservable(\n    onNext(220, 4),\n    onCompleted(225)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return o1.catchHandler(function () {\n      firstHandlerCalled = true;\n      return o2;\n    }).catchHandler(function () {\n      secondHandlerCalled = true;\n      return o3;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onCompleted(225)\n  ]);\n\n  t.ok(firstHandlerCalled);\n  t.ok(!secondHandlerCalled);\n\n  t.end();\n});\n\ntest('Observable#catchHandler throw from nested catch', function (t) {\n  var error = new Error();\n\n  var error2 = new Error();\n\n  var firstHandlerCalled = false;\n  var secondHandlerCalled = false;\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(215, error)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(220, 3),\n    onError(225, error2)\n  );\n\n  var o3 = scheduler.createHotObservable(\n    onNext(230, 4),\n    onCompleted(235));\n\n  var results = scheduler.startScheduler(function () {\n    return o1.catchHandler(function (e) {\n      firstHandlerCalled = true;\n      t.equal(e, error);\n      return o2;\n    }).catchHandler(function (e) {\n      secondHandlerCalled = true;\n      t.equal(e, error2);\n      return o3;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onCompleted(235)\n  ]);\n\n  t.ok(firstHandlerCalled);\n  t.ok(secondHandlerCalled);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/combinelatest.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nfunction add (x, y) { return x + y; }\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  combineLatest: require('../observable/combinelatest'),\n  never: require('../observable/never')\n});\n\nObservable.addToPrototype({\n  combineLatest: require('../observable/combinelatest')\n});\n\ntest('combineLatest never never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = Observable.never();\n  var e2 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return e1.combineLatest(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('combineLatest never empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = Observable.never();\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.combineLatest(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('combineLatest empty never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = Observable.never();\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.combineLatest(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('combineLatest empty empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.combineLatest(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest empty return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(220)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.combineLatest(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(215)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest return empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(220)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.combineLatest(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(215)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest never return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(220)\n  );\n\n  var e2 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return e1.combineLatest(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('combineLatest return never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(210)\n  );\n\n  var e2 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return e2.combineLatest(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('combineLatest return return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 3),\n    onCompleted(240)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.combineLatest(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 2 + 3),\n    onCompleted(240)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest return return no selector', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 3),\n    onCompleted(240)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.combineLatest(e2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, [2, 3]),\n    onCompleted(240)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest empty error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.combineLatest(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest error empty', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.combineLatest(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest return throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.combineLatest(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest throw return', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.combineLatest(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest throw throw', function (t) {\n  var error1 = new Error();\n  var error2 = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error1)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(230, error2)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.combineLatest(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error1)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest ErrorThrow', function (t) {\n  var error1 = new Error();\n  var error2 = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(220, error1)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(230, error2)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.combineLatest(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error1)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest throw error', function (t) {\n  var error1 = new Error();\n  var error2 = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(220, error1)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(230, error2)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.combineLatest(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error1)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest never throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = Observable.never();\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.combineLatest(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest throw never', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = Observable.never();\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error));\n\n  var results = scheduler.startScheduler(function () {\n    return e2.combineLatest(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest some throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.combineLatest(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest throw some', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(230));\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error));\n\n  var results = scheduler.startScheduler(function () {\n    return e2.combineLatest(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest throw after complete left', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(220)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(230, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.combineLatest(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(230, error)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest throw after complete right', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(220)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(230, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.combineLatest(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(230, error)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest interleaved with tail', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onNext(225, 4),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 3),\n    onNext(230, 5),\n    onNext(235, 6),\n    onNext(240, 7),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.combineLatest(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 2 + 3),\n    onNext(225, 3 + 4),\n    onNext(230, 4 + 5),\n    onNext(235, 4 + 6),\n    onNext(240, 4 + 7),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest consecutive', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onNext(225, 4),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(235, 6),\n    onNext(240, 7),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.combineLatest(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(235, 4 + 6),\n    onNext(240, 4 + 7),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest consecutive end with error left', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onNext(225, 4),\n    onError(230, error)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(235, 6),\n    onNext(240, 7),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.combineLatest(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(230, error)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest consecutive end with error right', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onNext(225, 4),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(235, 6),\n    onNext(240, 7),\n    onError(245, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.combineLatest(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(235, 4 + 6),\n    onNext(240, 4 + 7),\n    onError(245, error)\n  ]);\n\n  t.end();\n});\n\ntest('combineLatest selector throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 3),\n    onCompleted(240)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.combineLatest(e2, function () { throw error; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/compositedisposable.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Disposable = require('../disposable');\nvar CompositeDisposable = require('../compositedisposable');\n\nfunction noop() { }\n\ntest('CompositeDisposable#add', function (t) {\n  var d1 = Disposable.create(noop),\n      d2 = Disposable.create(noop),\n      g = new CompositeDisposable(d1);\n\n  t.equal(1, g.length, 'should have a length of one');\n\n  g.add(d2);\n  t.equal(2, g.length, 'should have a length of two after add');\n\n  t.end();\n});\n\ntest('CompositeDisposable#add after dispose', function (t) {\n  var disp1 = false;\n  var disp2 = false;\n\n  var d1 = Disposable.create(function () { disp1 = true; });\n  var d2 = Disposable.create(function () { disp2 = true; });\n\n  var g = new CompositeDisposable(d1);\n  t.equal(1, g.length, 'should have a length of 1');\n\n  g.dispose();\n  t.ok(disp1, 'should be disposed');\n  t.equal(0, g.length, 'should have a length of 0');\n\n  g.add(d2);\n  t.ok(disp2, 'should be disposed');\n  t.equal(0, g.length, 'should have a length of 0');\n\n  t.end();\n});\n\ntest('CompositeDisposable#remove', function (t) {\n  var disp1 = false;\n  var disp2 = false;\n\n  var d1 = Disposable.create(function () { disp1 = true; });\n  var d2 = Disposable.create(function () { disp2 = true; });\n\n  var g = new CompositeDisposable(d1, d2);\n\n  t.equal(2, g.length, 'should have a length of two');\n\n  t.ok(g.remove(d1), 'remove() should return true for first disposable');\n\n  t.equal(1, g.length, 'should have a length of one');\n\n  t.ok(disp1, 'first should be disposed');\n  t.ok(g.remove(d2), 'remove() should return true for second disposable');\n  t.ok(disp2, 'second should be disposed');\n\n  var disp3 = false;\n  var d3 = Disposable.create(function () { disp3 = true; });\n\n  t.ok(!g.remove(d3), 'remove() should return false for third disposable');\n  t.ok(!disp3, 'third should not have been disposed');\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/concat.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToObject({\n  concat: require('../observable/concat'),\n  never: require('../observable/never')\n});\n\nObservable.addToPrototype({\n  concat: require('../observable/concat')\n});\n\ntest('Observable.concat empty empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.concat(e2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.concat empty never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(230)\n  );\n\n  var e2 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return e1.concat(e2);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable.concat never empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(230)\n  );\n\n  var e2 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return e2.concat(e1);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable.concat never never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = Observable.never();\n  var e2 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return e1.concat(e2);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable.concat empty throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(250, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.concat(e2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(250, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.concat throw empty', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(230, error)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.concat(e2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(230, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.concat throw throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(230, error)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(250, new Error())\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.concat(e2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(230, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.concat return empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.concat(e2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.concat empty return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(240, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.concat(e2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(240, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.concat return never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(230)\n  );\n\n  var e2 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return e1.concat(e2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.concat never return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(230)\n  );\n\n  var e2 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return e2.concat(e1);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable.concat return return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(240, 3),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.concat(e2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 2),\n    onNext(240, 3),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.concat throw return', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(230, error)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(240, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.concat(e2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(230, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.concat return throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(250, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.concat(e2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 2),\n    onError(250, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.concat some data on both sides', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onCompleted(225)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.concat(e2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.concat as arguments', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs1 = scheduler.createColdObservable(\n      onNext(10, 1),\n      onNext(20, 2),\n      onNext(30, 3),\n      onCompleted(40)\n  );\n\n  var xs2 = scheduler.createColdObservable(\n    onNext(10, 4),\n    onNext(20, 5),\n    onCompleted(30)\n  );\n\n  var xs3 = scheduler.createColdObservable(\n    onNext(10, 6),\n    onNext(20, 7),\n    onNext(30, 8),\n    onNext(40, 9),\n    onCompleted(50)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.concat(xs1, xs2, xs3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onNext(250, 4),\n    onNext(260, 5),\n    onNext(280, 6),\n    onNext(290, 7),\n    onNext(300, 8),\n    onNext(310, 9),\n    onCompleted(320)\n  ]);\n\n  reactiveAssert(t, xs1.subscriptions, [\n    subscribe(200, 240)\n  ]);\n\n  reactiveAssert(t, xs2.subscriptions, [\n    subscribe(240, 270)\n  ]);\n\n  reactiveAssert(t, xs3.subscriptions, [\n    subscribe(270, 320)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/connectableobservable.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar ConnectableObservable = require('../observable/connectableobservable');\nvar Subject = require('../subject');\nvar Disposable = require('../disposable');\nvar inherits = require('inherits');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nfunction MySubject() {\n  this.disposeOnMap = {};\n  this.subscribeCount = 0;\n  this.disposed = false;\n  Observable.call(this);\n}\n\ninherits(MySubject, Observable);\n\nMySubject.prototype._subscribe = function (o) {\n  this.subscribeCount++;\n  this.o = o;\n\n  var self = this;\n  return Disposable.create(function () { self.disposed = true; });\n};\n\nMySubject.prototype.disposeOn = function (value, disposable) {\n  this.disposeOnMap[value] = disposable;\n};\n\nMySubject.prototype.onNext = function (value) {\n  this.o.onNext(value);\n  this.disposeOnMap[value] && this.disposeOnMap[value].dispose();\n};\n\nMySubject.prototype.onError = function (e) { this.o.onError(e); };\nMySubject.prototype.onCompleted = function () { this.o.onCompleted(); };\n\n\ntest('ConnectableObservable creation', function (t) {\n  var y = 0;\n\n  var s2 = new Subject();\n  var co2 = new ConnectableObservable(Observable.just(1), s2);\n\n  co2.subscribe(function (x) { y = x; });\n  t.notEqual(1, y);\n\n  co2.connect();\n  t.equal(1, y);\n\n  t.end();\n});\n\ntest('ConnectableObservable connected', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onNext(240, 4),\n    onCompleted(250)\n  );\n\n  var subject = new MySubject();\n\n  var conn = new ConnectableObservable(xs, subject);\n  conn.connect();\n\n  var results = scheduler.startScheduler(function () { return conn; });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onNext(240, 4),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('ConnectableObservable not connected', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onNext(240, 4),\n    onCompleted(250)\n  );\n\n  var subject = new MySubject();\n\n  var conn = new ConnectableObservable(xs, subject);\n\n  var results = scheduler.startScheduler(function () { return conn; });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('ConnectableObservable disconnected', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onNext(240, 4),\n    onCompleted(250)\n  );\n\n  var subject = new MySubject();\n\n  var conn = new ConnectableObservable(xs, subject);\n  var disconnect = conn.connect();\n  disconnect.dispose();\n\n  var results = scheduler.startScheduler(function () { return conn; });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('ConnectableObservable disconnect future', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onNext(240, 4),\n    onCompleted(250)\n  );\n\n  var subject = new MySubject();\n\n  var conn = new ConnectableObservable(xs, subject);\n  subject.disposeOn(3, conn.connect());\n\n  var results = scheduler.startScheduler(function () { return conn; });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3)\n  ]);\n\n  t.end();\n});\n\ntest('ConnectableObservable multiple non-overlapped connections', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onNext(240, 4),\n    onNext(250, 5),\n    onNext(260, 6),\n    onNext(270, 7),\n    onNext(280, 8),\n    onNext(290, 9),\n    onCompleted(300)\n  );\n\n  var subject = new Subject();\n\n  var conn = new ConnectableObservable(xs, subject);\n\n  var c1;\n  scheduler.scheduleAbsolute(null, 225, function () { c1 = conn.connect(); });\n  scheduler.scheduleAbsolute(null, 241, function () { c1.dispose(); });\n  scheduler.scheduleAbsolute(null, 245, function () { c1.dispose(); }); // idempotency test\n  scheduler.scheduleAbsolute(null, 251, function () { c1.dispose(); }); // idempotency test\n  scheduler.scheduleAbsolute(null, 260, function () { c1.dispose(); }); // idempotency test\n\n  var c2;\n  scheduler.scheduleAbsolute(null, 249, function () { c2 = conn.connect(); });\n  scheduler.scheduleAbsolute(null, 255, function () { c2.dispose(); });\n  scheduler.scheduleAbsolute(null, 265, function () { c2.dispose(); }); // idempotency test\n  scheduler.scheduleAbsolute(null, 280, function () { c2.dispose(); }); // idempotency test\n\n  var c3;\n  scheduler.scheduleAbsolute(null, 275, function () { c3 = conn.connect(); });\n  scheduler.scheduleAbsolute(null, 295, function () { c3.dispose(); });\n\n  var results = scheduler.startScheduler(function () { return conn; });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 3),\n    onNext(240, 4),\n    onNext(250, 5),\n    onNext(280, 8),\n    onNext(290, 9)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(225, 241),\n    subscribe(249, 255),\n    subscribe(275, 295)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/controlled.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  'range': require('../observable/range'),\n  'throw': require('../observable/throw')\n});\n\nObservable.addToPrototype({\n  concat: require('../observable/concat'),\n  controlled: require('../observable/controlled')\n});\n\ntest('Observable#controlled gets some values', function (t) {\n  var subscription;\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.createObserver();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  );\n\n  var controlled = xs.controlled();\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = controlled.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    controlled.request(5);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(400, 2),\n    onNext(400, 3),\n    onNext(400, 4),\n    onNext(400, 5),\n    onNext(400, 6),\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#controlled gets two sets of values', function (t) {\n  var subscription;\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.createObserver();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  );\n\n  var controlled = xs.controlled();\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = controlled.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    controlled.request(3);\n  });\n\n  scheduler.scheduleAbsolute(null, 450, function () {\n    controlled.request(2);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(400, 2),\n    onNext(400, 3),\n    onNext(400, 4),\n    onNext(450, 5),\n    onNext(450, 6),\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#controlled fires on completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.createObserver();\n\n  var source = Observable.range(1, 2).controlled();\n\n  scheduler.scheduleAbsolute(null, 200, function(){\n    source.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    source.request(3);\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 1),\n    onNext(300, 2),\n    onCompleted(300)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#controlled cancels inflight request', function (t) {\n  var scheduler = new TestScheduler();\n\n  var source = scheduler.createHotObservable(\n      onNext(400, 2),\n      onNext(410, 3),\n      onNext(420, 4)\n  ).controlled();\n\n  var results = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, 200, function(){\n    source.request(3);\n  });\n\n  scheduler.scheduleAbsolute(null, 200, function(){\n    source.request(2);\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function(){\n    source.subscribe(results);\n  });\n\n  scheduler.advanceBy(420);\n\n  reactiveAssert(t, results.messages, [\n    onNext(400, 2),\n    onNext(410, 3)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#controlled fires onError', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.createObserver();\n\n  var error = new Error('expected');\n  var source = Observable.range(1, 2, scheduler)\n    .concat(Observable['throw'](error, scheduler))\n    .controlled();\n\n  scheduler.scheduleAbsolute(null, 200, function(){\n    source.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    source.request(3);\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 1),\n    onNext(300, 2),\n    onError(300, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#controlled drops messages with queue disabled', function (t) {\n  var scheduler = new TestScheduler();\n\n  var source = scheduler.createHotObservable(\n    onNext(400, 1),\n    onNext(410, 2),\n    onNext(420, 3),\n    onNext(430, 4),\n    onCompleted(500)\n  ).controlled(false);\n\n  var results = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, 415, function(){\n    source.request(2);\n  });\n\n  scheduler.scheduleAbsolute(null, 200, function(){\n    source.subscribe(results);\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(420, 3),\n    onNext(430, 4),\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#controlled requests are scheduled', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.createObserver();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 0),\n    onNext(220, 1),\n    onNext(230, 2),\n    onNext(240, 3),\n    onNext(250, 4),\n    onNext(260, 5),\n    onNext(270, 6),\n    onCompleted(280)\n  );\n\n  var source = xs.controlled();\n\n  // process one event at a time\n  scheduler.scheduleAbsolute(null, 200, function() {\n    source.subscribe(\n      function (x) {\n        // alternate between immediate and delayed request(1), causes hanging\n        if (x % 2) {\n          //Immediate\n          source.request(1); // request next\n        } else {\n          //Delayed\n          scheduler.schedule(source, function (_, source) {\n            source.request(1); // request next\n          });\n        }\n        results.onNext(x);\n      },\n      function (e) { results.onError(e); },\n      function () { results.onCompleted(); }\n    );\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function() {\n    source.request(1); // start by requesting first item\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 0),\n    onNext(301, 1),\n    onNext(301, 2),\n    onNext(302, 3),\n    onNext(302, 4),\n    onNext(303, 5),\n    onNext(303, 6),\n    onCompleted(303)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#controlled can request queued values passing true during construction', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  );\n\n  var controlled = xs.controlled(true);\n\n  var results = scheduler.createObserver();\n\n  var subscription;\n  scheduler.scheduleAbsolute(null, 200, function() {\n    subscription = controlled.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function() {\n    controlled.request(5);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function() {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(400, 2),\n    onNext(400, 3),\n    onNext(400, 4),\n    onNext(400, 5),\n    onNext(400, 6),\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#controlled discards all values that occurred prior to calling request when passing false during construction', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onNext(450, 7),\n    onCompleted(500)\n  );\n\n  var controlled = xs.controlled(false);\n\n  var results = scheduler.createObserver();\n\n  var subscription;\n  scheduler.scheduleAbsolute(null, 200, function() {\n    subscription = controlled.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function() {\n    controlled.request(2);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function() {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(301, 4),\n    onNext(350, 5),\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#controlled does not dequeue any values when requesting null, 0, or -1, or -5 items', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  );\n\n  var controlled = xs.controlled();\n\n  var results = scheduler.createObserver();\n\n  var subscription;\n  scheduler.scheduleAbsolute(null, 200, function() {\n    subscription = controlled.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function() {\n    controlled.request(null);\n  });\n\n  scheduler.scheduleAbsolute(null, 410, function() {\n    controlled.request(0);\n  });\n\n  scheduler.scheduleAbsolute(null, 420, function() {\n    controlled.request(-1);\n  });\n\n  scheduler.scheduleAbsolute(null, 430, function() {\n    controlled.request(-5);\n  });\n\n  scheduler.scheduleAbsolute(null, 440, function() {\n    controlled.request(1);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function() {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(440, 2)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#controlled relays requested values when only some of them are queued up', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  );\n\n  var controlled = xs.controlled();\n\n  var results = scheduler.createObserver();\n\n  var subscription;\n  scheduler.scheduleAbsolute(null, 200, function() {\n    subscription = controlled.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function() {\n    controlled.request(4);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function() {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 2),\n    onNext(300, 3),\n    onNext(301, 4),\n    onNext(350, 5)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#controlled can terminate the request via dispose when it is partially delivered', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  );\n\n  var controlled = xs.controlled();\n\n  var results = scheduler.createObserver();\n\n  var subscription;\n  scheduler.scheduleAbsolute(null, 200, function() {\n    subscription = controlled.subscribe(results);\n  });\n\n  var theRequest;\n  scheduler.scheduleAbsolute(null, 300, function() {\n    theRequest = controlled.request(4);\n  });\n\n  scheduler.scheduleAbsolute(null, 310, function() {\n    theRequest.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function() {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 2),\n    onNext(300, 3),\n    onNext(301, 4)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#controlled relays queued values, non-queued values, and then a queued value again', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(320, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onNext(450, 7),\n    onCompleted(500)\n  );\n\n  var controlled = xs.controlled();\n\n  var results = scheduler.createObserver();\n\n  var subscription;\n  scheduler.scheduleAbsolute(null, 200, function() {\n    subscription = controlled.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function() {\n    controlled.request(2);\n    // queued values\n  });\n\n  scheduler.scheduleAbsolute(null, 310, function() {\n    controlled.request(2);\n    // values that haven't arrived yet\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function() {\n    controlled.request(1);\n    // queued value again\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function() {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 2),\n    onNext(300, 3),\n    onNext(320, 4),\n    onNext(350, 5),\n    onNext(400, 6)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#controlled relays requested values that occured before an error occured', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error('expected');\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onError(250, error)\n  );\n\n  var controlled = xs.controlled();\n\n  var results = scheduler.createObserver();\n\n  var subscription;\n  scheduler.scheduleAbsolute(null, 200, function() {\n    subscription = controlled.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function() {\n    controlled.request(2);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function() {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(500, 2),\n    onNext(500, 3),\n    onError(500, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#controlled relays error immediately when requesting values after an error has occured when queue is empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error('expected');\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(300, 3),\n    onError(400, error)\n  );\n\n  var controlled = xs.controlled();\n\n  var results = scheduler.createObserver();\n\n  var subscription;\n  scheduler.scheduleAbsolute(null, 200, function() {\n    subscription = controlled.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 350, function() {\n    controlled.request(2);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function() {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(350, 2),\n    onNext(350, 3),\n    onError(400, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#controlled relays completion immediately when requesting values after completion has occured when queue is empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(300, 3),\n      onCompleted(400)\n  );\n\n  var controlled = xs.controlled();\n\n  var results = scheduler.createObserver();\n\n  var subscription;\n  scheduler.scheduleAbsolute(null, 200, function() {\n    subscription = controlled.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 350, function() {\n    controlled.request(2);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function() {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(350, 2),\n    onNext(350, 3),\n    onCompleted(400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#controlled does not relay error when requesting values after an error has occured when queue is not empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var unexpectedError = new Error('unexpected');\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(300, 3),\n    onError(400, unexpectedError)\n  );\n\n  var controlled = xs.controlled();\n\n  var results = scheduler.createObserver();\n\n  var subscription;\n  scheduler.scheduleAbsolute(null, 200, function() {\n    subscription = controlled.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 350, function() {\n    controlled.request(1);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function() {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(350, 2)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#controlled does not relay completion when requesting values after completion has occured when queue is not empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(300, 3),\n    onCompleted(400)\n  );\n\n  var controlled = xs.controlled();\n\n  var results = scheduler.createObserver();\n\n  var subscription;\n  scheduler.scheduleAbsolute(null, 200, function() {\n    subscription = controlled.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 350, function() {\n    controlled.request(1);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function() {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(350, 2)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#controlled ignores all values when queue is disabled but delivers completion immediately when it occurs', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  );\n\n  var controlled = xs.controlled(false);\n\n  var results = scheduler.createObserver();\n\n  var subscription;\n  scheduler.scheduleAbsolute(null, 200, function() {\n    subscription = controlled.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function() {\n    controlled.request(5);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function() {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#controlled ignores all values when queue is disabled but delivers error immediately when it occurs', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error('expected');\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onError(500, error)\n  );\n\n  var controlled = xs.controlled(false);\n\n  var results = scheduler.createObserver();\n\n  var subscription;\n  scheduler.scheduleAbsolute(null, 200, function() {\n    subscription = controlled.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function() {\n    controlled.request(5);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function() {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onError(500, error)\n  ]);\n\n  t.end();\n});\n\n\ntest('Observable#controlled disposes partially delivered request when issuing a new one', function (t) {\n var scheduler = new TestScheduler();\n\n var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(450, 5),\n    onNext(460, 6),\n    onCompleted(500)\n  );\n\n  var controlled = xs.controlled();\n\n  var results = scheduler.createObserver();\n\n  var subscription;\n  scheduler.scheduleAbsolute(null, 200, function() {\n    subscription = controlled.subscribe(\n      function(x) {\n        results.onNext(x);\n      },\n      function(err) {\n        results.onError(err);\n      },\n      function() {\n        results.onCompleted();\n      }\n    );\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function() {\n\n    controlled.request(5);\n\n    controlled.request(1);\n    // cause the previous request that hasn't completed yet to get discarded\n\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function() {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(400, 2),\n    onNext(400, 3),\n    onNext(400, 4),\n    onNext(450, 5)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/count.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar range = require('../observable/range');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  count: require('../observable/count'),\n  skip: require('../observable/skip'),\n  take: require('../observable/take')\n});\n\ntest('Observable#count empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.count();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 0),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#count some', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.count();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 3),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#count throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.count();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#count never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.count();\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#count predicate empty true', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.count(function () { return true; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 0),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#count predicate empty false', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.count(function () { return false; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 0),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#count predicate return true', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.count(function () { return true; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 1), onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#count predicate return false', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.count(function () { return false; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 0),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#count predicate all matched', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.count(function (x) { return x < 10; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 3),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#count predicate none matched', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.count(function (x) { return x > 10; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 0),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#count predicate some even', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.count(function (x) { return x % 2 === 0; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 2),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#count predicate throw true', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.count(function () { return true; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#count predicate throw false', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.count(function () { return false; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#count predicate never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.count(function () { return true; });\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#count predicate throws error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onCompleted(240)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.count(function (x) {\n      if (x === 3) { throw error; }\n      return true;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(230, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#count after range', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = range(1, 10, scheduler);\n\n  var results = scheduler.startScheduler(function(){\n    return xs.count();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(211, 10),\n    onCompleted(211)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#count After Skip', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = range(1, 10, scheduler).skip(1);\n\n  var results = scheduler.startScheduler(function () {\n    return xs.count();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(211, 9),\n    onCompleted(211)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#count after take', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = range(1, 10, scheduler).take(1);\n\n  var results = scheduler.startScheduler(function(){\n    return xs.count();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 1),\n    onCompleted(201)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/create.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar Disposable = require('../disposable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n    onError = ReactiveTest.onError,\n    onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  create: require('../observable/create')\n});\n\nfunction noop () { }\n\ntest('Observable.create next', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.create(function (o) {\n      o.onNext(1);\n      o.onNext(2);\n      return Disposable.empty;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 1),\n    onNext(200, 2)\n  ]);\n  t.end();\n});\n\ntest('Observable.create completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.create(function (o) {\n      o.onCompleted();\n      o.onNext(100);\n      o.onError(new Error());\n      o.onCompleted();\n      return Disposable.empty;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(200)\n  ]);\n  t.end();\n});\n\ntest('Observable.create Error', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.create(function (o) {\n      o.onError(error);\n      o.onNext(100);\n      o.onError(new Error());\n      o.onCompleted();\n      return Disposable.empty;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(200, error)\n  ]);\n  t.end();\n});\n\ntest('Observable.create noop next', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.create(function (o) {\n      o.onNext(1);\n      o.onNext(2);\n      return noop;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 1),\n    onNext(200, 2)\n  ]);\n  t.end();\n});\n\ntest('Observable.create no op completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.create(function (o) {\n      o.onCompleted();\n      o.onNext(100);\n      o.onError(new Error());\n      o.onCompleted();\n      return noop;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(200)\n  ]);\n  t.end();\n});\n\ntest('Observable.create no op Error', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.create(function (o) {\n      o.onError(error);\n      o.onNext(100);\n      o.onError('foo');\n      o.onCompleted();\n      return noop;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(200, error)\n  ]);\n  t.end();\n});\n\ntest('Observable.create throws errors', function (t) {\n  t.throws(function () {\n    Observable.create(function () { throw new Error(); }).subscribe();\n  });\n  t.end();\n});\n\ntest('Observable.create dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.create(function (o) {\n      var isStopped = false;\n\n      o.onNext(1);\n      o.onNext(2);\n\n      scheduler.scheduleFuture(null, 600, function () {\n        !isStopped && o.onNext(3);\n      });\n\n      scheduler.scheduleFuture(null, 700, function () {\n        !isStopped && o.onNext(4);\n      });\n\n      scheduler.scheduleFuture(null, 900, function () {\n        !isStopped && o.onNext(5);\n      });\n\n      scheduler.scheduleFuture(null, 1100, function () {\n        !isStopped && o.onNext(6);\n      });\n\n      return function () { isStopped = true; };\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 1),\n    onNext(200, 2),\n    onNext(800, 3),\n    onNext(900, 4)\n  ]);\n  t.end();\n});\n\ntest('Observable.create observer does not catch', function (t) {\n  t.throws(function () {\n    Observable.create(function (o) { o.onNext(1); })\n      .subscribe(function () { throw new Error(); });\n  });\n\n  t.throws(function () {\n    Observable.create(function (o) { o.onError(new Error()); })\n      .subscribe(noop, function () { throw new Error(); });\n  });\n\n  t.throws(function () {\n    Observable.create(function (o) { o.onCompleted(); })\n      .subscribe(noop, noop, function () { throw new Error(); });\n  });\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/currentthreadscheduler.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Scheduler = require('../scheduler');\n\nScheduler.queue.ensureTrampoline = function (action) {\n  if (this.scheduleRequired()) { this.schedule(null, action); } else { action(); }\n};\n\ntest('current thread now', function (t) {\n  var res = Scheduler.queue.now() - new Date().getTime();\n\n  t.ok(res < 1000);\n\n  t.end();\n});\n\ntest('current thread schedule action', function (t) {\n  var ran = false;\n\n  Scheduler.queue.schedule(null, function () { ran = true; });\n\n  t.ok(ran);\n\n  t.end();\n});\n\ntest('current thread schedule action error', function (t) {\n  var error = new Error();\n\n  try {\n    Scheduler.queue.schedule(error, function (_, e) { throw e; });\n    t.ok(false);\n  } catch (e) {\n    t.equal(e, error);\n  }\n\n  t.end();\n});\n\ntest('current thread schedule nested', function (t) {\n  var ran = false;\n\n  Scheduler.queue.schedule(null, function () {\n    Scheduler.queue.schedule(null, function () { ran = true; });\n  });\n\n  t.ok(ran);\n\n  t.end();\n});\n\ntest('current thread ensure trampoline', function (t) {\n  var ran1 = false, ran2 = false;\n\n  Scheduler.queue.ensureTrampoline(function () {\n    Scheduler.queue.schedule(null, function () { ran1 = true; });\n    Scheduler.queue.schedule(null, function () { ran2 = true; });\n  });\n\n  t.ok(ran1);\n  t.ok(ran2);\n\n  t.end();\n});\n\ntest('current thread ensure trampoline nested', function (t) {\n  var ran1 = false, ran2 = false;\n\n  Scheduler.queue.ensureTrampoline(function () {\n    Scheduler.queue.ensureTrampoline(function () { ran1 = true; });\n    Scheduler.queue.ensureTrampoline(function () { ran2 = true; });\n  });\n\n  t.ok(ran1);\n  t.ok(ran2);\n\n  t.end();\n});\n\ntest('current thread ensure trampoline and cancel', function (t) {\n  var ran1 = false, ran2 = false;\n\n  Scheduler.queue.ensureTrampoline(function () {\n    Scheduler.queue.schedule(null, function () {\n      ran1 = true;\n      var d = Scheduler.queue.schedule(null, function () { ran2 = true; });\n      d.dispose();\n    });\n  });\n\n  t.ok(ran1);\n  t.ok(!ran2);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/debounce.js",
    "content": "\n'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToObject({\n  timer: require('../observable/timer')\n});\n\nObservable.addToPrototype({\n  debounce: require('../observable/debounce')\n});\n\ntest('Observable#debounce empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 0),\n    onCompleted(300)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.debounce(10, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(300)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 300)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#debounce error', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 0),\n    onError(300, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.debounce(10, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(300, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 300)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#debounce Never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 0)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.debounce(10, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#debounce all pass', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(300, 2),\n    onNext(351, 3),\n    onCompleted(400)\n  );\n\n  var results = scheduler.startScheduler(function(){\n    return xs.debounce(50, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(260, 1),\n    onNext(350, 2),\n    onNext(400, 3),\n    onCompleted(400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#debounce relative time all pass', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 0),\n    onNext(210, 1),\n    onNext(240, 2),\n    onNext(270, 3),\n    onNext(300, 4),\n    onCompleted(400)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.debounce(function () { return Observable.timer(20, scheduler); });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 1),\n    onNext(260, 2),\n    onNext(290, 3),\n    onNext(320, 4),\n    onCompleted(400)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#debounce relative time all pass error on end', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 0),\n    onNext(210, 1),\n    onNext(240, 2),\n    onNext(270, 3),\n    onNext(300, 4),\n    onError(400, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.debounce(function () { return Observable.timer(20, scheduler); });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 1),\n    onNext(260, 2),\n    onNext(290, 3),\n    onNext(320, 4),\n    onError(400, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#debounce relative time all drop', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 0),\n    onNext(210, 1),\n    onNext(240, 2),\n    onNext(270, 3),\n    onNext(300, 4),\n    onNext(330, 5),\n    onNext(360, 6),\n    onNext(390, 7),\n    onCompleted(400)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.debounce(function () { return Observable.timer(40, scheduler); });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(400, 7),\n    onCompleted(400)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#debounce relative time all drop error on end', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 0),\n    onNext(210, 1),\n    onNext(240, 2),\n    onNext(270, 3),\n    onNext(300, 4),\n    onNext(330, 5),\n    onNext(360, 6),\n    onNext(390, 7),\n    onError(400, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.debounce(40, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(400, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#debounce duration DelayBehavior', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, -1),\n    onNext(250, 0),\n    onNext(280, 1),\n    onNext(310, 2),\n    onNext(350, 3),\n    onNext(400, 4),\n    onCompleted(550)\n  );\n\n  var ys = [\n    scheduler.createColdObservable(onNext(20, 42), onNext(25, 99)),\n    scheduler.createColdObservable(onNext(20, 42), onNext(25, 99)),\n    scheduler.createColdObservable(onNext(20, 42), onNext(25, 99)),\n    scheduler.createColdObservable(onNext(20, 42), onNext(25, 99)),\n    scheduler.createColdObservable(onNext(20, 42), onNext(25, 99))\n  ];\n\n  var results = scheduler.startScheduler(function () {\n    return xs.debounce(function (x) { return ys[x]; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250 + 20, 0),\n    onNext(280 + 20, 1),\n    onNext(310 + 20, 2),\n    onNext(350 + 20, 3),\n    onNext(400 + 20, 4),\n    onCompleted(550)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [subscribe(200, 550)]);\n\n  reactiveAssert(t, ys[0].subscriptions, [subscribe(250, 250 + 20)]);\n  reactiveAssert(t, ys[1].subscriptions, [subscribe(280, 280 + 20)]);\n  reactiveAssert(t, ys[2].subscriptions, [subscribe(310, 310 + 20)]);\n  reactiveAssert(t, ys[3].subscriptions, [subscribe(350, 350 + 20)]);\n  reactiveAssert(t, ys[4].subscriptions, [subscribe(400, 400 + 20)]);\n\n  t.end();\n});\n\ntest('Observable#debounce duration debounce behavior', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, -1),\n    onNext(250, 0),\n    onNext(280, 1),\n    onNext(310, 2),\n    onNext(350, 3),\n    onNext(400, 4),\n    onCompleted(550));\n\n  var ys = [\n    scheduler.createColdObservable(onNext(20, 42), onNext(25, 99)),\n    scheduler.createColdObservable(onNext(40, 42), onNext(45, 99)),\n    scheduler.createColdObservable(onNext(20, 42), onNext(25, 99)),\n    scheduler.createColdObservable(onNext(60, 42), onNext(65, 99)),\n    scheduler.createColdObservable(onNext(20, 42), onNext(25, 99))];\n\n  var results = scheduler.startScheduler(function () {\n    return xs.debounce(function (x) { return ys[x]; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250 + 20, 0),\n    onNext(310 + 20, 2),\n    onNext(400 + 20, 4),\n    onCompleted(550)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [subscribe(200, 550)]);\n\n  reactiveAssert(t, ys[0].subscriptions, [subscribe(250, 250 + 20)]);\n  reactiveAssert(t, ys[1].subscriptions, [subscribe(280, 310)]);\n  reactiveAssert(t, ys[2].subscriptions, [subscribe(310, 310 + 20)]);\n  reactiveAssert(t, ys[3].subscriptions, [subscribe(350, 400)]);\n  reactiveAssert(t, ys[4].subscriptions, [subscribe(400, 400 + 20)]);\n\n  t.end();\n});\n\ntest('Observable#debounce duration early completion', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, -1),\n    onNext(250, 0),\n    onNext(280, 1),\n    onNext(310, 2),\n    onNext(350, 3),\n    onNext(400, 4),\n    onCompleted(410));\n\n  var ys = [\n    scheduler.createColdObservable(onNext(20, 42), onNext(25, 99)),\n    scheduler.createColdObservable(onNext(40, 42), onNext(45, 99)),\n    scheduler.createColdObservable(onNext(20, 42), onNext(25, 99)),\n    scheduler.createColdObservable(onNext(60, 42), onNext(65, 99)),\n    scheduler.createColdObservable(onNext(20, 42), onNext(25, 99))];\n\n  var results = scheduler.startScheduler(function () {\n    return xs.debounce(function (x) { return ys[x]; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250 + 20, 0),\n    onNext(310 + 20, 2),\n    onNext(410, 4),\n    onCompleted(410)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [subscribe(200, 410)]);\n\n  reactiveAssert(t, ys[0].subscriptions, [subscribe(250, 250 + 20)]);\n  reactiveAssert(t, ys[1].subscriptions, [subscribe(280, 310)]);\n  reactiveAssert(t, ys[2].subscriptions, [subscribe(310, 310 + 20)]);\n  reactiveAssert(t, ys[3].subscriptions, [subscribe(350, 400)]);\n  reactiveAssert(t, ys[4].subscriptions, [subscribe(400, 410)]);\n\n  t.end();\n});\n\ntest('Observable#debounce duration inner error', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(250, 2),\n    onNext(350, 3),\n    onNext(450, 4),\n    onCompleted(550)\n  );\n\n  var error = new Error();\n\n  var results = scheduler.startScheduler(function () {\n    return xs.debounce(function (x) {\n      if (x < 4) {\n        return scheduler.createColdObservable(\n          onNext(x * 10, 'Ignore'),\n          onNext(x * 10 + 5, 'Aargh!')\n        );\n      } else {\n        return scheduler.createColdObservable(\n          onError(x * 10, error)\n        );\n      }\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250 + 2 * 10, 2),\n    onNext(350 + 3 * 10, 3),\n    onError(450 + 4 * 10, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 490)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#debounce duration outer error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(250, 2),\n    onNext(350, 3),\n    onNext(450, 4),\n    onError(460, error));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.debounce(function (x) {\n      return scheduler.createColdObservable(\n        onNext(x * 10, 'Ignore'),\n        onNext(x * 10 + 5, 'Aargh!')\n      );\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250 + 2 * 10, 2),\n    onNext(350 + 3 * 10, 3),\n    onError(460, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 460)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#debounce duration selector throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(250, 2),\n    onNext(350, 3),\n    onNext(450, 4),\n    onCompleted(550)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.debounce(function (x) {\n      if (x < 4) {\n        return scheduler.createColdObservable(\n          onNext(x * 10, 'Ignore'),\n          onNext(x * 10 + 5, 'Aargh!')\n        );\n      }\n      throw error;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250 + 2 * 10, 2),\n    onNext(350 + 3 * 10, 3),\n    onError(450, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 450)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#debounce duration inner done delay behavior', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(250, 2),\n    onNext(350, 3),\n    onNext(450, 4),\n    onCompleted(550));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.debounce(function (x) {\n      return scheduler.createColdObservable(onCompleted(x * 10));\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250 + 2 * 10, 2),\n    onNext(350 + 3 * 10, 3),\n    onNext(450 + 4 * 10, 4),\n    onCompleted(550)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 550)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#debounce duration inner done debounce behavior', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(250, 2),\n    onNext(280, 3),\n    onNext(300, 4),\n    onNext(400, 5),\n    onNext(410, 6),\n    onCompleted(550));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.debounce(function (x) {\n      return scheduler.createColdObservable(onCompleted(x * 10));\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250 + 2 * 10, 2),\n    onNext(300 + 4 * 10, 4),\n    onNext(410 + 6 * 10, 6),\n    onCompleted(550)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 550)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/defaultifempty.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  defaultIfEmpty: require('../observable/defaultifempty')\n});\n\ntest('Observable#defaultIfEmpty never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.defaultIfEmpty();\n  });\n\n  reactiveAssert(t, results.messages, [\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#defaultIfEmpty error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.defaultIfEmpty();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#defaultIfEmpty non-empty 1', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(280, 42),\n    onNext(360, 43),\n    onCompleted(420));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.defaultIfEmpty();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(280, 42),\n    onNext(360, 43),\n    onCompleted(420)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#defaultIfEmpty non-empty 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(280, 42),\n    onNext(360, 43),\n    onCompleted(420));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.defaultIfEmpty(-1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(280, 42),\n    onNext(360, 43),\n    onCompleted(420)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#defaultIfEmpty empty 1', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onCompleted(420));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.defaultIfEmpty(null);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(420, null),\n    onCompleted(420)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#defaultIfEmpty empty 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onCompleted(420));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.defaultIfEmpty(-1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(420, -1),\n    onCompleted(420)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/defaultscheduler.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Scheduler = require('../scheduler');\n\ntest('Scheduler.async now', function (t) {\n  var res = Scheduler.async.now() - +new Date();\n\n  t.ok(res < 1000, 'Should be near zero');\n\n  t.end();\n});\n\ntest('Scheduler.async schedule action', function (t) {\n  Scheduler.async.schedule(true, function (s, state) {\n    t.ok(state, 'should schedule action');\n    t.end();\n  });\n});\n\ntest('Scheduler.async schedule relative', function (t) {\n  Scheduler.async.scheduleFuture(+new Date(), 200, function (s, startTime) {\n    var endTime = +new Date();\n    t.ok(endTime - startTime > 180, endTime - startTime);\n    t.end();\n  });\n});\n\ntest('Scheduler.async schedule action cancel', function (t) {\n  var set = false;\n  var d = Scheduler.async.scheduleFuture(null, 200, function () { set = true; });\n\n  d.dispose();\n\n  setTimeout(function () {\n    t.ok(!set, 'after cancel should not be set');\n    t.end();\n  }, 400);\n});\n"
  },
  {
    "path": "src/modular/test/defer.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToObject({\n  defer: require('../observable/defer')\n});\n\ntest('Observable.defer complete', function (t) {\n  var invoked = 0;\n\n  var scheduler = new TestScheduler();\n\n  var xs;\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.defer(function () {\n      invoked++;\n      xs = scheduler.createColdObservable(\n        onNext(100, scheduler.clock),\n        onCompleted(200));\n\n      return xs;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 200),\n    onCompleted(400)\n  ]);\n\n  t.equal(1, invoked);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.defer Error', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked = 0;\n\n  var error = new Error();\n\n  var xs;\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.defer(function () {\n      invoked++;\n      xs = scheduler.createColdObservable(\n        onNext(100, scheduler.clock),\n        onError(200, error));\n      return xs;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 200),\n    onError(400, error)\n  ]);\n\n  t.equal(1, invoked);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.defer dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked = 0;\n\n  var xs;\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.defer(function () {\n      invoked++;\n      xs = scheduler.createColdObservable(\n        onNext(100, scheduler.clock),\n        onNext(200, invoked),\n        onNext(1100, 1000));\n\n      return xs;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 200),\n    onNext(400, 1)\n  ]);\n\n  t.equal(1, invoked);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.defer throw', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked = 0;\n\n  var error = new Error();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.defer(function () {\n      invoked++;\n      throw error;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(200, error)\n  ]);\n\n  t.equal(1, invoked);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/delay.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  delay: require('../observable/delay')\n});\n\ntest('Observable#delay relative time simple 1', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(250, 2),\n    onNext(350, 3),\n    onNext(450, 4),\n    onCompleted(550));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.delay(100, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(350, 2),\n    onNext(450, 3),\n    onNext(550, 4),\n    onCompleted(650)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 550)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delay absolute time simple 1 implementation', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(250, 2),\n    onNext(350, 3),\n    onNext(450, 4),\n    onCompleted(550));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.delay(new Date(300), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(350, 2),\n    onNext(450, 3),\n    onNext(550, 4),\n    onCompleted(650)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 550)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delay relative time simple 2 implementation', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(250, 2),\n    onNext(350, 3),\n    onNext(450, 4),\n    onCompleted(550));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.delay(50, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 2),\n    onNext(400, 3),\n    onNext(500, 4),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 550)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delay absolute time simple 2 implementation', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(250, 2),\n    onNext(350, 3),\n    onNext(450, 4),\n    onCompleted(550));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.delay(new Date(250), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 2),\n    onNext(400, 3),\n    onNext(500, 4),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 550)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delay relative time simple 3 implementation', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(250, 2),\n    onNext(350, 3),\n    onNext(450, 4),\n    onCompleted(550));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.delay(150, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(400, 2),\n    onNext(500, 3),\n    onNext(600, 4),\n    onCompleted(700)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 550)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delay absolute time simple 3 implementation', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(250, 2),\n    onNext(350, 3),\n    onNext(450, 4),\n    onCompleted(550));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.delay(new Date(350), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(400, 2),\n    onNext(500, 3),\n    onNext(600, 4),\n    onCompleted(700)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 550)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delay relative time error 1 implementation', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(250, 2),\n    onNext(350, 3),\n    onNext(450, 4),\n    onError(550, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.delay(50, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 2),\n    onNext(400, 3),\n    onNext(500, 4),\n    onError(550, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 550)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delay absolute time error 1 implementation', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(250, 2),\n    onNext(350, 3),\n    onNext(450, 4),\n    onError(550, error));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.delay(new Date(250), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 2),\n    onNext(400, 3),\n    onNext(500, 4),\n    onError(550, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 550)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delay relative time error 2 implementation', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(250, 2),\n    onNext(350, 3),\n    onNext(450, 4),\n    onError(550, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.delay(150, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(400, 2),\n    onNext(500, 3),\n    onError(550, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 550)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delay absolute time error 2 implementation', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(250, 2),\n    onNext(350, 3),\n    onNext(450, 4),\n    onError(550, error));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.delay(new Date(350), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(400, 2),\n    onNext(500, 3),\n    onError(550, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 550)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delay empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(550));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.delay(10, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(560)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 550)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delay error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(550, error));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.delay(10, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(550, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 550)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delay never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.delay(10, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\n// delay with selector\ntest('Observable#delay duration simple 1', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 10),\n    onNext(220, 30),\n    onNext(230, 50),\n    onNext(240, 35),\n    onNext(250, 20),\n    onCompleted(260));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.delay(function (x) {\n      return scheduler.createColdObservable(onNext(x, '!'));\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210 + 10, 10),\n    onNext(220 + 30, 30),\n    onNext(250 + 20, 20),\n    onNext(240 + 35, 35),\n    onNext(230 + 50, 50),\n    onCompleted(280)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 260)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delay duration simple 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onNext(250, 6),\n    onCompleted(300)\n  );\n\n  var ys = scheduler.createColdObservable(\n    onNext(10, '!')\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.delay(function () { return ys; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210 + 10, 2),\n    onNext(220 + 10, 3),\n    onNext(230 + 10, 4),\n    onNext(240 + 10, 5),\n    onNext(250 + 10, 6),\n    onCompleted(300)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 300)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(210, 220),\n    subscribe(220, 230),\n    subscribe(230, 240),\n    subscribe(240, 250),\n    subscribe(250, 260)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delay duration simple 3', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onNext(250, 6),\n    onCompleted(300)\n  );\n\n  var ys = scheduler.createColdObservable(\n    onNext(100, '!')\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.delay(function () { return ys; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210 + 100, 2),\n    onNext(220 + 100, 3),\n    onNext(230 + 100, 4),\n    onNext(240 + 100, 5),\n    onNext(250 + 100, 6),\n    onCompleted(350)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 300)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(210, 310),\n    subscribe(220, 320),\n    subscribe(230, 330),\n    subscribe(240, 340),\n    subscribe(250, 350)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delay duration simple 4 inner empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onNext(250, 6),\n    onCompleted(300)\n  );\n\n  var ys = scheduler.createColdObservable(\n    onCompleted(100)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.delay(function () { return ys; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210 + 100, 2),\n    onNext(220 + 100, 3),\n    onNext(230 + 100, 4),\n    onNext(240 + 100, 5),\n    onNext(250 + 100, 6),\n    onCompleted(350)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 300)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(210, 310),\n    subscribe(220, 320),\n    subscribe(230, 330),\n    subscribe(240, 340),\n    subscribe(250, 350)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delay duration dispose 1', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onNext(250, 6),\n    onCompleted(300)\n  );\n\n  var ys = scheduler.createColdObservable(\n    onNext(200, '!')\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.delay(function () { return ys; });\n  }, { disposed: 425 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210 + 200, 2),\n    onNext(220 + 200, 3)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 300)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(210, 410),\n    subscribe(220, 420),\n    subscribe(230, 425),\n    subscribe(240, 425),\n    subscribe(250, 425)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delay duration dispose 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(400, 3),\n    onCompleted(500));\n\n  var ys = scheduler.createColdObservable(\n    onNext(50, '!'));\n\n  var results = scheduler.startScheduler(function () {\n      return xs.delay(function () { return ys; });\n  }, { disposed: 300 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210 + 50, 2)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 300)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(210, 260)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/delaysubscription.js",
    "content": "'use strict';\n\n'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  delaySubscription: require('../observable/delaysubscription')\n});\n\ntest('Observable#delaySubscription relative', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(50, 42),\n    onNext(60, 43),\n    onCompleted(70)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return xs.delaySubscription(30, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(280, 42),\n    onNext(290, 43),\n    onCompleted(300)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(230, 300)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delaySubscription relative hot', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return xs.delaySubscription(20, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(220, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delaySubscription relative hot misses all', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return xs.delaySubscription(200, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(400, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delaySubscription relative hot cancel', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return xs.delaySubscription(20, scheduler);\n  }, { disposed: 210 });\n\n  reactiveAssert(t, results.messages, [\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delaySubscription relative error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(50, 42),\n    onNext(60, 43),\n    onError(70, error)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return xs.delaySubscription(30, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(280, 42),\n    onNext(290, 43),\n    onError(300, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(230, 300)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delaySubscription absolute', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(50, 42),\n    onNext(60, 43),\n    onCompleted(70)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return xs.delaySubscription(new Date(230), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(280, 42),\n    onNext(290, 43),\n    onCompleted(300)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(230, 300)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delaySubscription absolute hot', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return xs.delaySubscription(new Date(220), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(220, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delaySubscription relative hot misses all', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return xs.delaySubscription(new Date(400), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(400, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delaySubscription relative hot cancel', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return xs.delaySubscription(new Date(220), scheduler);\n  }, { disposed: 210 });\n\n  reactiveAssert(t, results.messages, [\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n  ]);\n\n  t.end();\n});\n\ntest('Observable#delaySubscription absolute error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(50, 42),\n    onNext(60, 43),\n    onError(70, error)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return xs.delaySubscription(new Date(230), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(280, 42),\n    onNext(290, 43),\n    onError(300, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(230, 300)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/disposable.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Disposable = require('../disposable');\n\ntest('Disposable#create', function (t) {\n  var disposable = Disposable.create(function () { });\n  t.ok(disposable, 'disposable should not be undefined');\n  t.end();\n});\n\ntest('Disposable#dispose', function (t) {\n  var disposed = false;\n  var d = Disposable.create(function () { disposed = true; });\n\n  t.ok(!disposed, 'should not be disposed');\n  d.dispose();\n  t.ok(disposed, 'should be disposed');\n  t.end();\n});\n\ntest('Disposable#empty', function (t) {\n  var d = Disposable.empty;\n  t.ok(d, 'should not be null');\n  d.dispose();\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/distinct.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  distinct: require('../observable/distinct')\n});\n\ntest('Observable#distinct default comparer all distinct', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(280, 4),\n    onNext(300, 2),\n    onNext(350, 1),\n    onNext(380, 3),\n    onNext(400, 5),\n    onCompleted(420)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.distinct();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(280, 4),\n    onNext(300, 2),\n    onNext(350, 1),\n    onNext(380, 3),\n    onNext(400, 5),\n    onCompleted(420)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#distinct default comparer some duplicates', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(280, 4),\n    onNext(300, 2),\n    onNext(350, 2),\n    onNext(380, 3),\n    onNext(400, 4),\n    onCompleted(420)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.distinct();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(280, 4),\n    onNext(300, 2),\n    onNext(380, 3),\n    onCompleted(420)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  t.end();\n});\n\nfunction modComparer(mod) {\n  return function (x, y) { return x % mod === y % mod; };\n}\n\ntest('Observable#distinct CustomComparer all distinct', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(280, 4),\n    onNext(300, 2),\n    onNext(350, 1),\n    onNext(380, 3),\n    onNext(400, 5),\n    onCompleted(420)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.distinct(null, modComparer(10));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(280, 4),\n    onNext(300, 2),\n    onNext(350, 1),\n    onNext(380, 3),\n    onNext(400, 5),\n    onCompleted(420)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#distinct custom comparer some duplicates', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(280, 4),\n    onNext(300, 2),\n    onNext(350, 12),\n    onNext(380, 3),\n    onNext(400, 24),\n    onCompleted(420)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.distinct(null, modComparer(10));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(280, 4),\n    onNext(300, 2),\n    onNext(380, 3),\n    onCompleted(420)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/distinctuntilchanged.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  distinctUntilChanged: require('../observable/distinctuntilchanged')\n});\n\ntest('Observable#distinctUntilChanged never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.distinctUntilChanged();\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#distinctUntilChanged empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.distinctUntilChanged();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#distinctUntilChanged return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.distinctUntilChanged();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#distinctUntilChanged throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(250, error));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.distinctUntilChanged();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(250, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#distinctUntilChanged all changes', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.distinctUntilChanged();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#distinctUntilChanged all same', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 2),\n      onNext(230, 2),\n      onNext(240, 2),\n      onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.distinctUntilChanged();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#distinctUntilChanged some changes', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(215, 3),\n    onNext(220, 3),\n    onNext(225, 2),\n    onNext(230, 2),\n    onNext(230, 1),\n    onNext(240, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.distinctUntilChanged();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(215, 3),\n    onNext(225, 2),\n    onNext(230, 1),\n    onNext(240, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#distinctUntilChanged comparer all equal', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.distinctUntilChanged(null, function () { return true; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#distinctUntilChanged comparer all different', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 2),\n    onNext(230, 2),\n    onNext(240, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.distinctUntilChanged(null, function () { return false; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 2),\n    onNext(230, 2),\n    onNext(240, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#distinctUntilChanged key selector evens', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 4),\n    onNext(230, 3),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.distinctUntilChanged(function (x) { return x % 2 === 0; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(230, 3),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#distinctUntilChanged key selector throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.distinctUntilChanged(function () { throw error; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#distinctUntilChanged comparer throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.distinctUntilChanged(null, function () { throw error; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/empty.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest'),\n    onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  empty: require('../observable/empty')\n});\n\n\ntest('Observable.empty basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.empty(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(201)\n  ]);\n  t.end();\n});\n\ntest('Observable.empty disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.empty(scheduler);\n  }, { disposed: 200 });\n\n  reactiveAssert(t, results.messages, []);\n  t.end();\n});\n\nfunction noop () { }\n\ntest('Observable.empty observer throws', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = Observable.empty(scheduler);\n\n  xs.subscribe(noop, noop, function () { throw new Error(); });\n\n  t.throws(function () {\n    scheduler.start();\n  });\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/every.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  every: require('../observable/every')\n});\n\ntest('Observable#every empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.every(function (x) { return x > 0; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, true),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#every return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.every(function (x) { return x > 0; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, true),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#every return no match', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, -2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.every(function (x) { return x > 0; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, false),\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#every none match', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, -2),\n    onNext(220, -3),\n    onNext(230, -4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.every(function (x) { return x > 0; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, false),\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#every some match', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, -2),\n    onNext(220, 3),\n    onNext(230, -4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.every(function (x) { return x > 0; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, false),\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#every all match', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.every(function (x) { return x > 0; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, true),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#every throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.every(function (x) { return x > 0; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#every never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.every(function (x) { return x > 0; });\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/filter.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar SerialDisposable = require('../serialdisposable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe,\n  created = ReactiveTest.created,\n  subscribed = ReactiveTest.subscribed,\n  disposed = ReactiveTest.disposed;\n\nObservable.addToPrototype({\n  filter: require('../observable/filter'),\n  map: require('../observable/map')\n});\n\nfunction isPrime(i) {\n  if (i <= 1) { return false; }\n  var max = Math.floor(Math.sqrt(i));\n  for (var j = 2; j <= max; ++j) {\n    if (i % j === 0) { return false; }\n  }\n  return true;\n}\n\ntest('Observable#filter complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked = 0;\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(180, 2),\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onCompleted(600),\n    onNext(610, 12),\n    onError(620, new Error()),\n    onCompleted(630));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.filter(function (x) {\n      invoked++;\n      return isPrime(x);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 3),\n    onNext(340, 5),\n    onNext(390, 7),\n    onNext(580, 11),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.equal(9, invoked);\n\n  t.end();\n});\n\ntest('Observable#filter true', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked = 0;\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(180, 2),\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.filter(function () {\n      invoked++;\n      return true;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.equal(9, invoked);\n\n  t.end();\n});\n\ntest('Observable#filter False', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked = 0;\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(180, 2),\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.filter(function (x) {\n      invoked++;\n      return false;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.equal(9, invoked);\n\n  t.end();\n});\n\ntest('Observable#filter dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked = 0;\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(180, 2),\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.filter(function (x) {\n      invoked++;\n      return isPrime(x);\n    });\n  }, { disposed: 400 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 3),\n    onNext(340, 5),\n    onNext(390, 7)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.equal(5, invoked);\n\n  t.end();\n});\n\ntest('Observable#filter error', function (t) {\n  var scheduler = new TestScheduler();\n  var invoked = 0;\n\n  var error = new Error();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(180, 2),\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onError(600, error),\n    onNext(610, 12),\n    onError(620, new Error()),\n    onCompleted(630)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.filter(function (x) {\n      invoked++;\n      return isPrime(x);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 3),\n    onNext(340, 5),\n    onNext(390, 7),\n    onNext(580, 11),\n    onError(600, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.equal(9, invoked);\n\n  t.end();\n});\n\ntest('Observable#filter Throw', function (t) {\n  var scheduler = new TestScheduler();\n  var invoked = 0;\n\n  var error = new Error();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(180, 2),\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onCompleted(600),\n    onNext(610, 12),\n    onError(620, new Error()),\n    onCompleted(630)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.filter(function (x) {\n      invoked++;\n      if (x > 5) {\n        throw error;\n      }\n      return isPrime(x);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 3),\n    onNext(340, 5),\n    onError(380, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 380)\n  ]);\n\n  t.equal(4, invoked);\n\n  t.end();\n});\n\ntest('Observable#filter dispose in predicate', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked = 0;\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(180, 2),\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onCompleted(600),\n    onNext(610, 12),\n    onError(620, new Error()),\n    onCompleted(630)\n  );\n\n  var results = scheduler.createObserver();\n\n  var d = new SerialDisposable();\n\n  var ys;\n  scheduler.scheduleAbsolute(null, created, function () {\n    return ys = xs.filter(function (x) {\n      invoked++;\n      if (x === 8) {\n        d.dispose();\n      }\n      return isPrime(x);\n    });\n  });\n\n  scheduler.scheduleAbsolute(null, subscribed, function () {\n    d.setDisposable(ys.subscribe(results));\n  });\n\n  scheduler.scheduleAbsolute(null, disposed, function () {\n    d.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 3),\n    onNext(340, 5),\n    onNext(390, 7)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 450)\n  ]);\n\n  t.equal(6, invoked);\n\n  t.end();\n});\n\ntest('Observable#filter with index complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked = 0;\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(180, 2),\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onCompleted(600),\n    onNext(610, 12),\n    onError(620, new Error()),\n    onCompleted(630)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.filter(function (x, index) {\n      invoked++;\n      return isPrime(x + index * 10);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 3),\n    onNext(390, 7),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.equal(9, invoked);\n\n  t.end();\n});\n\ntest('Observable#filter with index True', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked = 0;\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(180, 2),\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.filter(function (x, index) {\n      invoked++;\n      return true;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.equal(9, invoked);\n\n  t.end();\n});\n\ntest('Observable#filter with index false', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked = 0;\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(180, 2),\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.filter(function (x, index) {\n      invoked++;\n      return false;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.equal(9, invoked);\n\n  t.end();\n});\n\ntest('Observable#filter with index dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked = 0;\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(180, 2),\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.filter(function (x, index) {\n      invoked++;\n      return isPrime(x + index * 10);\n    });\n  }, { disposed: 400 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 3),\n    onNext(390, 7)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.equal(5, invoked);\n\n  t.end();\n});\n\ntest('Observable#filter with index error', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked = 0;\n\n  var error = new Error();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(180, 2),\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onError(600, error),\n    onNext(610, 12),\n    onError(620, new Error()),\n    onCompleted(630)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.filter(function (x, index) {\n      invoked++;\n      return isPrime(x + index * 10);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 3),\n    onNext(390, 7),\n    onError(600, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.equal(9, invoked);\n\n  t.end();\n});\n\ntest('Observable#filter with index throw', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked = 0;\n\n  var error = new Error();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(180, 2),\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onCompleted(600),\n    onNext(610, 12),\n    onError(620, new Error()),\n    onCompleted(630)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.filter(function (x, index) {\n      invoked++;\n      if (x > 5) {\n        throw error;\n      }\n      return isPrime(x + index * 10);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 3),\n    onError(380, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 380)\n  ]);\n\n  t.equal(4, invoked);\n\n  t.end();\n});\n\ntest('Observable#filter with index dispose in predicate', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked = 0;\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(180, 2),\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onCompleted(600),\n    onNext(610, 12),\n    onError(620, new Error()),\n    onCompleted(630)\n  );\n\n  var results = scheduler.createObserver();\n\n  var d = new SerialDisposable();\n\n  var ys;\n  scheduler.scheduleAbsolute(null, created, function () {\n    ys = xs.filter(function (x, index) {\n      invoked++;\n      if (x === 8) {\n        d.dispose();\n      }\n      return isPrime(x + index * 10);\n    });\n  });\n\n  scheduler.scheduleAbsolute(null, subscribed, function () {\n    d.setDisposable(ys.subscribe(results));\n  });\n\n  scheduler.scheduleAbsolute(null, disposed, function () {\n    d.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 3),\n    onNext(390, 7)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 450)\n  ]);\n\n  t.equal(6, invoked);\n\n  t.end();\n});\n\ntest('Observable#filter multiple subscribers', function (t) {\n  var s = new TestScheduler();\n\n  var xs = s.createHotObservable(onCompleted(100)).filter(function () { return true; });\n\n  var o1 = s.createObserver();\n  var o2 = s.createObserver();\n\n  xs.subscribe(o1);\n  xs.subscribe(o2);\n\n  s.start();\n\n  t.equal(o1.messages.length, 1);\n  t.equal(o2.messages.length, 1);\n\n  t.end();\n});\n\ntest('Observable#Filter and Filter Optimization', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked1 = 0;\n  var invoked2 = 0;\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(180, 2),\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onCompleted(600),\n    onNext(610, 12),\n    onError(620, new Error()),\n    onCompleted(630)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs\n      .filter(function(x) { invoked1++; return x % 2 === 0; })\n      .filter(function(x) { invoked2++; return x % 3 === 0; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(380, 6),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.equal(9, invoked1);\n  t.equal(4, invoked2);\n\n  t.end();\n});\n\ntest('Observable#filter and Observable#filter thisArg', function (t) {\n  var scheduler = new TestScheduler();\n\n  function Filterer() {\n    this.filter1 = function(item) { return item % 2 === 0; };\n    this.filter2 = function(item) { return item % 3 === 0; };\n  }\n\n  var filterer = new Filterer();\n\n  var xs = scheduler.createColdObservable(\n      onNext(10, 1),\n      onNext(20, 2),\n      onNext(30, 3),\n      onNext(40, 4),\n      onNext(50, 5),\n      onNext(60, 6),\n      onNext(70, 7),\n      onNext(80, 8),\n      onNext(90, 9),\n      onCompleted(100)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return xs\n      .filter(function(x){ return this.filter1(x);}, filterer)\n      .filter(function(x){ return this.filter2(x);}, filterer)\n      .filter(function(x){ return this.filter1(x);}, filterer);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(260, 6),\n    onCompleted(300)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#filter and map optimization', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked1 = 0;\n  var invoked2 = 0;\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(180, 2),\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onCompleted(600),\n    onNext(610, 12),\n    onError(620, new Error()),\n    onCompleted(630)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs\n    .filter(function(x) { invoked1++; return x % 2 === 0; })\n    .map(function(x) { invoked2++; return x * x; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(270, 16),\n    onNext(380, 36),\n    onNext(450, 64),\n    onNext(560, 100),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.equal(9, invoked1);\n  t.equal(4, invoked2);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/finally.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToObject({\n  empty: require('../observable/empty'),\n  'throw': require('../observable/throw')\n});\n\nObservable.addToPrototype({\n  'finally': require('../observable/finally')\n});\n\ntest('Observable#finally has orders of effects', function (t) {\n  var results = [];\n  function noop () {}\n\n  var someObservable = Observable.empty()['finally'](function () {\n    results.push('invoked');\n  });\n\n  someObservable.subscribe(noop, noop, function () {\n    results.push('completed');\n  });\n\n  t.equal(results[0], 'completed');\n  t.equal(results[1], 'invoked');\n\n  t.end();\n});\n\ntest('Observable#finally calls finally before throwing', function (t) {\n  var invoked = false;\n\n  var someObservable = Observable['throw'](new Error())['finally'](function () {\n    invoked = true;\n  });\n\n  t.throws(function () {\n    someObservable.subscribe();\n  });\n\n  t.ok(invoked, 'should have been invoked');\n\n  t.end();\n});\n\ntest('Observable#finally only called once on empty', function (t) {\n  var invokeCount = 0;\n\n  var someObservable = Observable.empty()['finally'](function () {\n    invokeCount++;\n  });\n\n  var d = someObservable.subscribe();\n\n  d.dispose();\n  d.dispose();\n\n  t.equal(1, invokeCount);\n\n  t.end();\n});\n\ntest('Observable#finally called with empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var invoked = false;\n\n  var results = scheduler.startScheduler(function () {\n    return xs['finally'](function () {\n      invoked = true;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.ok(invoked);\n\n  t.end();\n});\n\ntest('Observable#finally called with never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var invoked = false;\n\n  var results = scheduler.startScheduler(function () {\n    return xs['finally'](function () {\n      invoked = true;\n    });\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.ok(invoked);\n\n  t.end();\n});\n\n\ntest('Observable#finally called with single value', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var invoked = false;\n\n  var results = scheduler.startScheduler(function () {\n    return xs['finally'](function () {\n      invoked = true;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.ok(invoked);\n\n  t.end();\n});\n\ntest('Observable#finally on throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(250, error)\n  );\n\n  var invoked = false;\n\n  var results = scheduler.startScheduler(function () {\n    return xs['finally'](function () {\n      invoked = true;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(250, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.ok(invoked);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/find.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  find: require('../observable/find')\n});\n\ntest('Observable#find never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.find(function () { return true; });\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#find empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.find(function () { return true; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#find single', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(220)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.find(function (x) { return x === 2; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#find not found', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(220)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.find(function (x) { return x === 3; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#find error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.find(function (x) { return x === 3; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#find throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(220)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.find(function () { throw error; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/findindex.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  findIndex: require('../observable/findindex')\n});\n\ntest('findIndex never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.findIndex(function () { return true; });\n  });\n\n  reactiveAssert(t, results.messages, [\n  ]);\n\n  t.end();\n});\n\ntest('findIndex empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.findIndex(function () { return true; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, -1),\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('findIndex single', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(220)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.findIndex(function (x) { return x === 2; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 0),\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#findIndex not found', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(220)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.findIndex(function (x) { return x === 3; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, -1),\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#findIndex error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.findIndex(function (x) { return x === 3; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#findIndex throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(220)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.findIndex(function () { throw error; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/first.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar EmptyError = require('../internal/errors').EmptyError;\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  first: require('../observable/first')\n});\n\n// First Async\ntest('Observable#first empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.first();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(250, function (n) { return n.error instanceof EmptyError; })\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#first default', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(\n    function () {\n      return xs.first({defaultValue: 42});\n    });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 42),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#first one', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.first();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onCompleted(210)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#first many', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.first();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onCompleted(210)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#first Error', function (t) {\n  var ex = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, ex)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.first();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#first predicate', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.first(function (x) {\n      return x % 2 === 1;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 3), onCompleted(220)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#first Predicate Obj', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.first({\n      predicate: function (x) {\n        return x % 2 === 1;\n      }\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 3), onCompleted(220)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#first Predicate thisArg', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.first(function (x) {\n      t.equal(this, 42);\n      return x % 2 === 1;\n    }, 42);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 3),\n    onCompleted(220)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#first Predicate Obj thisArg', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.first({\n      predicate: function (x) {\n        t.equal(this, 42);\n        return x % 2 === 1;\n      },\n      thisArg: 42\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 3),\n    onCompleted(220)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#first Predicate None', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.first(function (x) {\n      return x > 10;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(250, function (n) { return n.error instanceof EmptyError; })\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#first Predicate Obj None', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.first({\n      predicate: function (x) {\n        return x > 10;\n      }\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(250, function (n) { return n.error instanceof EmptyError; })\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#first Predicate Obj None Default', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.first({\n      predicate: function (x) {\n        return x > 10;\n      },\n      defaultValue: 42\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 42), onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#first Predicate Error', function (t) {\n  var ex = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(220, ex)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.first(function (x) {\n      return x % 2 === 1;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#first PredicateThrows', function (t) {\n  var ex = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.first(function (x) {\n      if (x < 4) {\n        return false;\n      } else {\n        throw ex;\n      }\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(230, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/flatmap.js",
    "content": "\n'use strict';\n/* jshint undef: true, unused: true */\n/* globals Promise */\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar isEqual = require('../internal/isequal');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToObject({\n  fromArray: require('../observable/fromarray'),\n  interval: require('../observable/interval')\n});\n\nObservable.addToPrototype({\n  flatMap: require('../observable/flatmap'),\n  map: require('../observable/map'),\n  take: require('../observable/take')\n});\n\n// Polyfilling\nrequire('lie/polyfill');\n\ntest('Observable#flatMap then complete promise', function (t) {\n  var xs = Observable.fromArray([4,3,2,1]);\n\n  var ys = Promise.resolve(42);\n\n  var results = [];\n  xs.flatMap(ys).subscribe(\n    function (x) {\n      results.push(x);\n    },\n    function () {\n      t.ok(false);\n      t.end();\n    },\n    function () {\n      t.ok(isEqual([42,42,42,42], results));\n      t.end();\n    });\n});\n\ntest('Observable#flatMap then error Promise', function (t) {\n  var xs = Observable.fromArray([4,3,2,1]);\n\n  var ys = Promise.reject(42);\n\n  xs.flatMap(ys).subscribe(\n    function () {\n      t.ok(false);\n      t.end();\n    },\n    function (err) {\n      t.equal(err, 42);\n      t.end();\n    },\n    function () {\n      t.ok(false);\n      t.end();\n    });\n});\n\ntest('Observable#flatMap selector complete Promise', function (t) {\n  var xs = Observable.fromArray([4,3,2,1]);\n\n  var results = [];\n  xs.flatMap(function (x, i) {\n    return Promise.resolve(x + i);\n  }).subscribe(\n    function (x) {\n      results.push(x);\n    },\n    function () {\n      t.ok(false);\n      t.end();\n    },\n    function () {\n      t.ok(isEqual([4, 4, 4, 4], results));\n      t.end();\n    });\n});\n\ntest('Observable#flatMap Selector error Promise', function (t) {\n  var xs = Observable.fromArray([4,3,2,1]);\n\n  xs.flatMap(function (x, i) {\n    return Promise.reject(x + i);\n  }).subscribe(\n    function () {\n      t.ok(false);\n      t.end();\n    },\n    function (err) {\n      t.equal(err, 4);\n      t.end();\n    },\n    function () {\n      t.ok(false);\n      t.end();\n    });\n});\n\ntest('Observable#flatMap result selector complete promise', function (t) {\n  var xs = Observable.fromArray([4,3,2,1]);\n\n  var results = [];\n  xs.flatMap(\n    function (x, i) {\n      return Promise.resolve(x + i);\n    },\n    function (x, y, i) {\n      return x + y + i;\n    })\n    .subscribe(\n      function (x) {\n        results.push(x);\n      },\n      function () {\n        t.ok(false);\n        t.end();\n      },\n      function () {\n        t.ok(isEqual([8, 8, 8, 8], results));\n        t.end();\n      });\n});\n\ntest('Observable#flatMap result selector error promise', function (t) {\n  var xs = Observable.fromArray([4,3,2,1]);\n\n  xs.flatMap(\n    function (x, i) {\n      return Promise.reject(x + i);\n    },\n    function (x, y, i) {\n      return x + y + i;\n    })\n    .subscribe(\n      function () {\n        t.ok(false);\n        t.end();\n      },\n      function (err) {\n        t.equal(err, 4);\n        t.end();\n      },\n      function () {\n        t.ok(false);\n        t.end();\n      });\n});\n\ntest('Observable#flatMap then complete complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(100, 4),\n    onNext(200, 2),\n    onNext(300, 3),\n    onNext(400, 1),\n    onCompleted(500)\n  );\n\n  var ys = scheduler.createColdObservable(\n    onNext(50, 'foo'),\n    onNext(100, 'bar'),\n    onNext(150, 'baz'),\n    onNext(200, 'qux'),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.flatMap(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(350, 'foo'),\n    onNext(400, 'bar'),\n    onNext(450, 'baz'),\n    onNext(450, 'foo'),\n    onNext(500, 'qux'),\n    onNext(500, 'bar'),\n    onNext(550, 'baz'),\n    onNext(550, 'foo'),\n    onNext(600, 'qux'),\n    onNext(600, 'bar'),\n    onNext(650, 'baz'),\n    onNext(650, 'foo'),\n    onNext(700, 'qux'),\n    onNext(700, 'bar'),\n    onNext(750, 'baz'),\n    onNext(800, 'qux'),\n    onCompleted(850)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 700)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(300, 550),\n    subscribe(400, 650),\n    subscribe(500, 750),\n    subscribe(600, 850)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#flatMap then complete complete 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(100, 4),\n    onNext(200, 2),\n    onNext(300, 3),\n    onNext(400, 1),\n    onCompleted(700));\n\n  var ys = scheduler.createColdObservable(\n    onNext(50, 'foo'),\n    onNext(100, 'bar'),\n    onNext(150, 'baz'),\n    onNext(200, 'qux'),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.flatMap(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(350, 'foo'),\n    onNext(400, 'bar'),\n    onNext(450, 'baz'),\n    onNext(450, 'foo'),\n    onNext(500, 'qux'),\n    onNext(500, 'bar'),\n    onNext(550, 'baz'),\n    onNext(550, 'foo'),\n    onNext(600, 'qux'),\n    onNext(600, 'bar'),\n    onNext(650, 'baz'),\n    onNext(650, 'foo'),\n    onNext(700, 'qux'),\n    onNext(700, 'bar'),\n    onNext(750, 'baz'),\n    onNext(800, 'qux'),\n    onCompleted(900)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 900)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(300, 550),\n    subscribe(400, 650),\n    subscribe(500, 750),\n    subscribe(600, 850)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#flatMap then never complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(100, 4),\n    onNext(200, 2),\n    onNext(300, 3),\n    onNext(400, 1),\n    onNext(500, 5),\n    onNext(700, 0));\n\n  var ys = scheduler.createColdObservable(\n    onNext(50, 'foo'),\n    onNext(100, 'bar'),\n    onNext(150, 'baz'),\n    onNext(200, 'qux'),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.flatMap(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(350, 'foo'),\n    onNext(400, 'bar'),\n    onNext(450, 'baz'),\n    onNext(450, 'foo'),\n    onNext(500, 'qux'),\n    onNext(500, 'bar'),\n    onNext(550, 'baz'),\n    onNext(550, 'foo'),\n    onNext(600, 'qux'),\n    onNext(600, 'bar'),\n    onNext(650, 'baz'),\n    onNext(650, 'foo'),\n    onNext(700, 'qux'),\n    onNext(700, 'bar'),\n    onNext(750, 'baz'),\n    onNext(750, 'foo'),\n    onNext(800, 'qux'),\n    onNext(800, 'bar'),\n    onNext(850, 'baz'),\n    onNext(900, 'qux'),\n    onNext(950, 'foo')\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(300, 550),\n    subscribe(400, 650),\n    subscribe(500, 750),\n    subscribe(600, 850),\n    subscribe(700, 950),\n    subscribe(900, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#flatMap then complete never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(100, 4),\n    onNext(200, 2),\n    onNext(300, 3),\n    onNext(400, 1),\n    onCompleted(500));\n\n  var ys = scheduler.createColdObservable(\n    onNext(50, 'foo'),\n    onNext(100, 'bar'),\n    onNext(150, 'baz'),\n    onNext(200, 'qux'));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.flatMap(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(350, 'foo'),\n    onNext(400, 'bar'),\n    onNext(450, 'baz'),\n    onNext(450, 'foo'),\n    onNext(500, 'qux'),\n    onNext(500, 'bar'),\n    onNext(550, 'baz'),\n    onNext(550, 'foo'),\n    onNext(600, 'qux'),\n    onNext(600, 'bar'),\n    onNext(650, 'baz'),\n    onNext(650, 'foo'),\n    onNext(700, 'qux'),\n    onNext(700, 'bar'),\n    onNext(750, 'baz'),\n    onNext(800, 'qux')\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 700)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(300, 1000),\n    subscribe(400, 1000),\n    subscribe(500, 1000),\n    subscribe(600, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#flatMap then complete Error', function (t) {\n  var ex = new Error('ex');\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(100, 4),\n    onNext(200, 2),\n    onNext(300, 3),\n    onNext(400, 1),\n    onCompleted(500)\n  );\n\n  var ys = scheduler.createColdObservable(\n    onNext(50, 'foo'),\n    onNext(100, 'bar'),\n    onNext(150, 'baz'),\n    onNext(200, 'qux'),\n    onError(300, ex)\n  );\n\n  var results = scheduler.startScheduler(function () {\n      return xs.flatMap(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(350, 'foo'),\n    onNext(400, 'bar'),\n    onNext(450, 'baz'),\n    onNext(450, 'foo'),\n    onNext(500, 'qux'),\n    onNext(500, 'bar'),\n    onNext(550, 'baz'),\n    onNext(550, 'foo'),\n    onError(600, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(300, 600),\n    subscribe(400, 600),\n    subscribe(500, 600),\n    subscribe(600, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#flatMap then error complete', function (t) {\n  var ex = new Error('ex');\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(100, 4),\n    onNext(200, 2),\n    onNext(300, 3),\n    onNext(400, 1),\n    onError(500, ex));\n\n  var ys = scheduler.createColdObservable(\n    onNext(50, 'foo'),\n    onNext(100, 'bar'),\n    onNext(150, 'baz'),\n    onNext(200, 'qux'),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.flatMap(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(350, 'foo'),\n    onNext(400, 'bar'),\n    onNext(450, 'baz'),\n    onNext(450, 'foo'),\n    onNext(500, 'qux'),\n    onNext(500, 'bar'),\n    onNext(550, 'baz'),\n    onNext(550, 'foo'),\n    onNext(600, 'qux'),\n    onNext(600, 'bar'),\n    onNext(650, 'baz'),\n    onNext(650, 'foo'),\n    onError(700, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 700)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(300, 550),\n    subscribe(400, 650),\n    subscribe(500, 700),\n    subscribe(600, 700)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#flatMap then error Error', function (t) {\n  var ex = new Error('ex');\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(100, 4),\n    onNext(200, 2),\n    onNext(300, 3),\n    onNext(400, 1),\n    onError(500, ex));\n\n  var ys = scheduler.createColdObservable(\n    onNext(50, 'foo'),\n    onNext(100, 'bar'),\n    onNext(150, 'baz'),\n    onNext(200, 'qux'),\n    onError(250, ex));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.flatMap(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(350, 'foo'),\n    onNext(400, 'bar'),\n    onNext(450, 'baz'),\n    onNext(450, 'foo'),\n    onNext(500, 'qux'),\n    onNext(500, 'bar'),\n    onError(550, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 550)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(300, 550),\n    subscribe(400, 550),\n    subscribe(500, 550)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#flatMap complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n    onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n    onNext(300, scheduler.createColdObservable(\n      onNext(10, 102),\n      onNext(90, 103),\n      onNext(110, 104),\n      onNext(190, 105),\n      onNext(440, 106),\n      onCompleted(460))),\n    onNext(400, scheduler.createColdObservable(\n      onNext(180, 202),\n      onNext(190, 203),\n      onCompleted(205))),\n    onNext(550, scheduler.createColdObservable(\n      onNext(10, 301),\n      onNext(50, 302),\n      onNext(70, 303),\n      onNext(260, 304),\n      onNext(310, 305),\n      onCompleted(410))),\n    onNext(750, scheduler.createColdObservable(onCompleted(40))),\n    onNext(850, scheduler.createColdObservable(\n      onNext(80, 401),\n      onNext(90, 402),\n      onCompleted(100))),\n    onCompleted(900));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.flatMap(function (x) {\n      return x;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 102),\n    onNext(390, 103),\n    onNext(410, 104),\n    onNext(490, 105),\n    onNext(560, 301),\n    onNext(580, 202),\n    onNext(590, 203),\n    onNext(600, 302),\n    onNext(620, 303),\n    onNext(740, 106),\n    onNext(810, 304),\n    onNext(860, 305),\n    onNext(930, 401),\n    onNext(940, 402),\n    onCompleted(960)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 900)\n  ]);\n\n  reactiveAssert(t, xs.messages[2].value.value.subscriptions, [subscribe(300, 760)]);\n  reactiveAssert(t, xs.messages[3].value.value.subscriptions, [subscribe(400, 605)]);\n  reactiveAssert(t, xs.messages[4].value.value.subscriptions, [subscribe(550, 960)]);\n  reactiveAssert(t, xs.messages[5].value.value.subscriptions, [subscribe(750, 790)]);\n  reactiveAssert(t, xs.messages[6].value.value.subscriptions, [subscribe(850, 950)]);\n\n  t.end();\n});\n\ntest('Observable#flatMap complete innerNotcomplete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n    onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n    onNext(300, scheduler.createColdObservable(\n      onNext(10, 102),\n      onNext(90, 103),\n      onNext(110, 104),\n      onNext(190, 105),\n      onNext(440, 106),\n      onCompleted(460))),\n    onNext(400, scheduler.createColdObservable(\n      onNext(180, 202),\n      onNext(190, 203))),\n    onNext(550, scheduler.createColdObservable(\n      onNext(10, 301),\n      onNext(50, 302),\n      onNext(70, 303),\n      onNext(260, 304),\n      onNext(310, 305),\n      onCompleted(410))),\n    onNext(750, scheduler.createColdObservable(onCompleted(40))),\n    onNext(850, scheduler.createColdObservable(\n      onNext(80, 401),\n      onNext(90, 402),\n      onCompleted(100))),\n    onCompleted(900));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.flatMap(function (x) {\n      return x;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 102),\n    onNext(390, 103),\n    onNext(410, 104),\n    onNext(490, 105),\n    onNext(560, 301),\n    onNext(580, 202),\n    onNext(590, 203),\n    onNext(600, 302),\n    onNext(620, 303),\n    onNext(740, 106),\n    onNext(810, 304),\n    onNext(860, 305),\n    onNext(930, 401),\n    onNext(940, 402)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [subscribe(200, 900)]);\n\n  reactiveAssert(t, xs.messages[2].value.value.subscriptions, [subscribe(300, 760)]);\n  reactiveAssert(t, xs.messages[3].value.value.subscriptions, [subscribe(400, 1000)]);\n  reactiveAssert(t, xs.messages[4].value.value.subscriptions, [subscribe(550, 960)]);\n  reactiveAssert(t, xs.messages[5].value.value.subscriptions, [subscribe(750, 790)]);\n  reactiveAssert(t, xs.messages[6].value.value.subscriptions, [subscribe(850, 950)]);\n\n  t.end();\n});\n\ntest('Observable#flatMap complete outerNotcomplete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n    onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n    onNext(300, scheduler.createColdObservable(\n      onNext(10, 102),\n      onNext(90, 103),\n      onNext(110, 104),\n      onNext(190, 105),\n      onNext(440, 106),\n      onCompleted(460))),\n    onNext(400, scheduler.createColdObservable(\n      onNext(180, 202),\n      onNext(190, 203),\n      onCompleted(205))),\n    onNext(550, scheduler.createColdObservable(\n      onNext(10, 301),\n      onNext(50, 302),\n      onNext(70, 303),\n      onNext(260, 304),\n      onNext(310, 305),\n      onCompleted(410))),\n    onNext(750, scheduler.createColdObservable(onCompleted(40))),\n    onNext(850, scheduler.createColdObservable(\n      onNext(80, 401),\n      onNext(90, 402),\n      onCompleted(100))));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.flatMap(function (x) {\n      return x;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 102),\n    onNext(390, 103),\n    onNext(410, 104),\n    onNext(490, 105),\n    onNext(560, 301),\n    onNext(580, 202),\n    onNext(590, 203),\n    onNext(600, 302),\n    onNext(620, 303),\n    onNext(740, 106),\n    onNext(810, 304),\n    onNext(860, 305),\n    onNext(930, 401),\n    onNext(940, 402)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [subscribe(200, 1000)]);\n  reactiveAssert(t, xs.messages[2].value.value.subscriptions, [subscribe(300, 760)]);\n  reactiveAssert(t, xs.messages[3].value.value.subscriptions, [subscribe(400, 605)]);\n  reactiveAssert(t, xs.messages[4].value.value.subscriptions, [subscribe(550, 960)]);\n  reactiveAssert(t, xs.messages[5].value.value.subscriptions, [subscribe(750, 790)]);\n  reactiveAssert(t, xs.messages[6].value.value.subscriptions, [subscribe(850, 950)]);\n\n  t.end();\n});\n\ntest('Observable#flatMap error outer', function (t) {\n    var ex = new Error('ex');\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n      onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n      onNext(300, scheduler.createColdObservable(\n        onNext(10, 102),\n        onNext(90, 103),\n        onNext(110, 104),\n        onNext(190, 105),\n        onNext(440, 106),\n        onCompleted(460))),\n      onNext(400, scheduler.createColdObservable(\n        onNext(180, 202),\n        onNext(190, 203),\n        onCompleted(205))),\n      onNext(550, scheduler.createColdObservable(\n        onNext(10, 301),\n        onNext(50, 302),\n        onNext(70, 303),\n        onNext(260, 304),\n        onNext(310, 305),\n        onCompleted(410))),\n      onNext(750, scheduler.createColdObservable(onCompleted(40))),\n      onNext(850, scheduler.createColdObservable(\n        onNext(80, 401),\n        onNext(90, 402),\n        onCompleted(100))),\n      onError(900, ex));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.flatMap(function (x) {\n        return x;\n      });\n    });\n\n    reactiveAssert(t, results.messages, [\n      onNext(310, 102),\n      onNext(390, 103),\n      onNext(410, 104),\n      onNext(490, 105),\n      onNext(560, 301),\n      onNext(580, 202),\n      onNext(590, 203),\n      onNext(600, 302),\n      onNext(620, 303),\n      onNext(740, 106),\n      onNext(810, 304),\n      onNext(860, 305),\n      onError(900, ex)\n    ]);\n\n    reactiveAssert(t, xs.subscriptions, [subscribe(200, 900)]);\n\n    reactiveAssert(t, xs.messages[2].value.value.subscriptions, [subscribe(300, 760)]);\n    reactiveAssert(t, xs.messages[3].value.value.subscriptions, [subscribe(400, 605)]);\n    reactiveAssert(t, xs.messages[4].value.value.subscriptions, [subscribe(550, 900)]);\n    reactiveAssert(t, xs.messages[5].value.value.subscriptions, [subscribe(750, 790)]);\n    reactiveAssert(t, xs.messages[6].value.value.subscriptions, [subscribe(850, 900)]);\n\n    t.end();\n});\n\ntest('Observable#flatMap error inner', function (t) {\n    var ex = new Error('ex');\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n      onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n      onNext(300, scheduler.createColdObservable(\n        onNext(10, 102),\n        onNext(90, 103),\n        onNext(110, 104),\n        onNext(190, 105),\n        onNext(440, 106),\n        onError(460, ex))),\n      onNext(400, scheduler.createColdObservable(\n        onNext(180, 202),\n        onNext(190, 203),\n        onCompleted(205))),\n      onNext(550, scheduler.createColdObservable(\n        onNext(10, 301),\n        onNext(50, 302),\n        onNext(70, 303),\n        onNext(260, 304),\n        onNext(310, 305),\n        onCompleted(410))),\n      onNext(750, scheduler.createColdObservable(onCompleted(40))),\n      onNext(850, scheduler.createColdObservable(\n        onNext(80, 401),\n        onNext(90, 402),\n        onCompleted(100))),\n      onCompleted(900));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.flatMap(function (x) {\n        return x;\n      });\n    });\n\n    reactiveAssert(t, results.messages, [\n      onNext(310, 102),\n      onNext(390, 103),\n      onNext(410, 104),\n      onNext(490, 105),\n      onNext(560, 301),\n      onNext(580, 202),\n      onNext(590, 203),\n      onNext(600, 302),\n      onNext(620, 303),\n      onNext(740, 106),\n      onError(760, ex)\n    ]);\n\n    reactiveAssert(t, xs.subscriptions, [subscribe(200, 760)]);\n\n    reactiveAssert(t, xs.messages[2].value.value.subscriptions, [subscribe(300, 760)]);\n    reactiveAssert(t, xs.messages[3].value.value.subscriptions, [subscribe(400, 605)]);\n    reactiveAssert(t, xs.messages[4].value.value.subscriptions, [subscribe(550, 760)]);\n    reactiveAssert(t, xs.messages[5].value.value.subscriptions, [subscribe(750, 760)]);\n    reactiveAssert(t, xs.messages[6].value.value.subscriptions, []);\n\n    t.end();\n});\n\ntest('Observable#flatMap dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n    onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n    onNext(300, scheduler.createColdObservable(\n      onNext(10, 102),\n      onNext(90, 103),\n      onNext(110, 104),\n      onNext(190, 105),\n      onNext(440, 106),\n      onCompleted(460))),\n    onNext(400, scheduler.createColdObservable(\n      onNext(180, 202),\n      onNext(190, 203),\n      onCompleted(205))),\n    onNext(550, scheduler.createColdObservable(\n      onNext(10, 301),\n      onNext(50, 302),\n      onNext(70, 303),\n      onNext(260, 304),\n      onNext(310, 305),\n      onCompleted(410))),\n    onNext(750, scheduler.createColdObservable(onCompleted(40))),\n    onNext(850, scheduler.createColdObservable(\n      onNext(80, 401),\n      onNext(90, 402),\n      onCompleted(100))),\n    onCompleted(900));\n\n  var results = scheduler.startScheduler(function () {\n      return xs.flatMap(function (x) { return x; });\n  }, { disposed: 700 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 102),\n    onNext(390, 103),\n    onNext(410, 104),\n    onNext(490, 105),\n    onNext(560, 301),\n    onNext(580, 202),\n    onNext(590, 203),\n    onNext(600, 302),\n    onNext(620, 303)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [subscribe(200, 700)]);\n\n  reactiveAssert(t, xs.messages[2].value.value.subscriptions, [subscribe(300, 700)]);\n  reactiveAssert(t, xs.messages[3].value.value.subscriptions, [subscribe(400, 605)]);\n  reactiveAssert(t, xs.messages[4].value.value.subscriptions, [subscribe(550, 700)]);\n  reactiveAssert(t, xs.messages[5].value.value.subscriptions, []);\n  reactiveAssert(t, xs.messages[6].value.value.subscriptions, []);\n\n  t.end();\n});\n\ntest('Observable#flatMap Throw', function (t) {\n  var invoked = 0;\n  var ex = new Error('ex');\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n    onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n    onNext(300, scheduler.createColdObservable(\n      onNext(10, 102),\n      onNext(90, 103),\n      onNext(110, 104),\n      onNext(190, 105),\n      onNext(440, 106),\n      onCompleted(460))),\n    onNext(400, scheduler.createColdObservable(\n      onNext(180, 202),\n      onNext(190, 203),\n      onCompleted(205))),\n    onNext(550, scheduler.createColdObservable(\n      onNext(10, 301),\n      onNext(50, 302),\n      onNext(70, 303),\n      onNext(260, 304),\n      onNext(310, 305),\n      onCompleted(410))),\n    onNext(750, scheduler.createColdObservable(\n      onCompleted(40))),\n    onNext(850, scheduler.createColdObservable(\n      onNext(80, 401),\n      onNext(90, 402),\n      onCompleted(100))),\n    onCompleted(900));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.flatMap(function (x) {\n      invoked++;\n      if (invoked === 3) { throw ex; }\n      return x;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 102),\n    onNext(390, 103),\n    onNext(410, 104),\n    onNext(490, 105),\n    onError(550, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [subscribe(200, 550)]);\n\n  reactiveAssert(t, xs.messages[2].value.value.subscriptions, [\n    subscribe(300, 550)\n  ]);\n\n  reactiveAssert(t, xs.messages[3].value.value.subscriptions, [\n    subscribe(400, 550)\n  ]);\n\n  reactiveAssert(t, xs.messages[4].value.value.subscriptions, []);\n  reactiveAssert(t, xs.messages[5].value.value.subscriptions, []);\n  reactiveAssert(t, xs.messages[6].value.value.subscriptions, []);\n\n  t.end();\n});\n\ntest('Observable#flatMap use function', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 4),\n    onNext(220, 3),\n    onNext(250, 5),\n    onNext(270, 1),\n    onCompleted(290)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.flatMap(function (x) {\n      return Observable.interval(10, scheduler).map(function () {\n        return x;\n      }).take(x);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 4),\n    onNext(230, 3),\n    onNext(230, 4),\n    onNext(240, 3),\n    onNext(240, 4),\n    onNext(250, 3),\n    onNext(250, 4),\n    onNext(260, 5),\n    onNext(270, 5),\n    onNext(280, 1),\n    onNext(280, 5),\n    onNext(290, 5),\n    onNext(300, 5),\n    onCompleted(300)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 290)\n  ]);\n\n  t.end();\n});\n\nfunction arrayRepeat(value, times) {\n  var results = [];\n  for(var i = 0; i < times; i++) {\n    results.push(value);\n  }\n  return results;\n}\n\ntest('Observable#flatMap iterable complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 2),\n    onNext(340, 4),\n    onNext(420, 3),\n    onNext(510, 2),\n    onCompleted(600)\n  );\n\n  var inners = [];\n\n  var results = scheduler.startScheduler(function () {\n    return xs.flatMap(function (x) {\n      var ys = arrayRepeat(x, x);\n      inners.push(ys);\n      return ys;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(210, 2),\n    onNext(340, 4),\n    onNext(340, 4),\n    onNext(340, 4),\n    onNext(340, 4),\n    onNext(420, 3),\n    onNext(420, 3),\n    onNext(420, 3),\n    onNext(510, 2),\n    onNext(510, 2),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.equal(4, inners.length);\n\n  t.end();\n});\n\ntest('Observable#flatMap Iterable complete result selector', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 2),\n    onNext(340, 4),\n    onNext(420, 3),\n    onNext(510, 2),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.flatMap(function (x) { return arrayRepeat(x, x); }, function (x, y) { return x + y; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 4),\n    onNext(210, 4),\n    onNext(340, 8),\n    onNext(340, 8),\n    onNext(340, 8),\n    onNext(340, 8),\n    onNext(420, 6),\n    onNext(420, 6),\n    onNext(420, 6),\n    onNext(510, 4),\n    onNext(510, 4),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#flatMap iterable Error', function (t) {\n  var scheduler = new TestScheduler();\n\n  var ex = new Error();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 2),\n    onNext(340, 4),\n    onNext(420, 3),\n    onNext(510, 2),\n    onError(600, ex)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.flatMap(function (x) { return arrayRepeat(x, x); });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(210, 2),\n    onNext(340, 4),\n    onNext(340, 4),\n    onNext(340, 4),\n    onNext(340, 4),\n    onNext(420, 3),\n    onNext(420, 3),\n    onNext(420, 3),\n    onNext(510, 2),\n    onNext(510, 2),\n    onError(600, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#flatMap Iterable error result selector', function (t) {\n  var scheduler = new TestScheduler();\n\n  var ex = new Error();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 2),\n    onNext(340, 4),\n    onNext(420, 3),\n    onNext(510, 2),\n    onError(600, ex)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.flatMap(function (x) { return arrayRepeat(x, x); }, function (x, y) { return x + y; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 4),\n    onNext(210, 4),\n    onNext(340, 8),\n    onNext(340, 8),\n    onNext(340, 8),\n    onNext(340, 8),\n    onNext(420, 6),\n    onNext(420, 6),\n    onNext(420, 6),\n    onNext(510, 4),\n    onNext(510, 4),\n    onError(600, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#flatMap iterable dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 2),\n    onNext(340, 4),\n    onNext(420, 3),\n    onNext(510, 2),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(\n    function () {\n      return xs.flatMap(function (x) { return arrayRepeat(x, x); });\n    },\n    { disposed: 350 }\n  );\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(210, 2),\n    onNext(340, 4),\n    onNext(340, 4),\n    onNext(340, 4),\n    onNext(340, 4)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 350)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#flatMap iterable dispose result selector', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 2),\n    onNext(340, 4),\n    onNext(420, 3),\n    onNext(510, 2),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(\n    function () {\n      return xs.flatMap(function (x) { return arrayRepeat(x, x); }, function (x, y) { return x + y; });\n    },\n    { disposed: 350 }\n  );\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 4),\n    onNext(210, 4),\n    onNext(340, 8),\n    onNext(340, 8),\n    onNext(340, 8),\n    onNext(340, 8)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 350)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#flatMap iterable selector throws', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 2),\n    onNext(340, 4),\n    onNext(420, 3),\n    onNext(510, 2),\n    onCompleted(600)\n  );\n\n  var invoked = 0;\n  var ex = new Error();\n\n  var results = scheduler.startScheduler(function () {\n    return xs.flatMap(function (x) {\n      invoked++;\n      if (invoked === 3) { throw ex; }\n      return arrayRepeat(x, x);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(210, 2),\n    onNext(340, 4),\n    onNext(340, 4),\n    onNext(340, 4),\n    onNext(340, 4),\n    onError(420, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  t.equal(3, invoked);\n\n  t.end();\n});\n\ntest('Observable#flatMap iterable result selector throws', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 2),\n    onNext(340, 4),\n    onNext(420, 3),\n    onNext(510, 2),\n    onCompleted(600)\n  );\n\n  var ex = new Error();\n\n  var inners = [];\n\n  var results = scheduler.startScheduler(function () {\n    return xs.flatMap(\n      function (x) {\n        var ys = arrayRepeat(x, x);\n        inners.push(ys);\n        return ys;\n      },\n      function (x, y) {\n        if (x === 3) { throw ex; }\n        return x + y;\n      }\n    );\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 4),\n    onNext(210, 4),\n    onNext(340, 8),\n    onNext(340, 8),\n    onNext(340, 8),\n    onNext(340, 8),\n    onError(420, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  t.equal(3, inners.length);\n\n  t.end();\n});\n\ntest('Observable#flatMap iterable selector throws result selector', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 2),\n    onNext(340, 4),\n    onNext(420, 3),\n    onNext(510, 2),\n    onCompleted(600)\n  );\n\n  var invoked = 0;\n  var ex = new Error();\n\n  var results = scheduler.startScheduler(function () {\n    return xs.flatMap(\n      function (x) {\n        invoked++;\n        if (invoked === 3) { throw ex; }\n        return arrayRepeat(x, x);\n      },\n      function (x, y) { return x + y; }\n    );\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 4),\n    onNext(210, 4),\n    onNext(340, 8),\n    onNext(340, 8),\n    onNext(340, 8),\n    onNext(340, 8),\n    onError(420, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  t.equal(3, invoked);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/forkjoin.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  forkJoin: require('../observable/forkjoin')\n});\n\nObservable.addToPrototype({\n  forkJoin: require('../observable/forkjoin')\n});\n\nfunction add(x, y) { return x + y; }\n\ntest('Observable.forkJoin n-ary parameters', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onNext(225, 4),\n    onCompleted(230));\n\n  var o2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(235, 6),\n    onNext(240, 7),\n    onCompleted(250)\n  );\n\n  var o3 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(230, 3),\n    onNext(245, 5),\n    onCompleted(270)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.forkJoin(o1, o2, o3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(270, [4,7,5]),\n    onCompleted(270)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.forkJoin n-ary parameters empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onNext(225, 4),\n    onCompleted(230)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(235, 6),\n    onNext(240, 7),\n    onCompleted(250)\n  );\n\n  var o3 = scheduler.createHotObservable(\n    onCompleted(270)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.forkJoin(o1, o2, o3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(270)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.forkJoin n-ary parameters empty before end', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onNext(225, 4),\n    onCompleted(230)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onCompleted(235)\n  );\n\n  var o3 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(230, 3),\n    onNext(245, 5),\n    onCompleted(270));\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.forkJoin(o1, o2, o3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(235)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.forkJoin empty empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(230)\n  );\n\n  var e = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e.forkJoin(o, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.forkJoin none', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.forkJoin();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.forkJoin empty return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(230)\n  );\n\n  var e = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e.forkJoin(o, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.forkJoin return empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(230));\n\n  var e = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return e.forkJoin(o, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.forkJoin return return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(230)\n  );\n\n  var e = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 3),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e.forkJoin(o, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 2 + 3),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.forkJoin empty throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(230)\n  );\n\n  var e = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e.forkJoin(o, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.forkJoin throw empty', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error),\n    onCompleted(230)\n  );\n\n  var e = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e.forkJoin(o, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.forkJoin return throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(230)\n  );\n\n  var e = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e.forkJoin(o, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.forkJoin throw return', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error),\n    onCompleted(230)\n  );\n\n  var e = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e.forkJoin(o, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.forkJoin binary', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onNext(225, 4),\n    onCompleted(230)\n  );\n\n  var e = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(235, 6),\n    onNext(240, 7),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e.forkJoin(o, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 4 + 7),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/from.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n    onError = ReactiveTest.onError,\n    onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  from: require('../observable/from')\n});\n\ntest('Observable.from Array', function (t) {\n  var array = [1, 2, 3, 4, 5];\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.from(array, null, null, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 1),\n    onNext(202, 2),\n    onNext(203, 3),\n    onNext(204, 4),\n    onNext(205, 5),\n    onCompleted(206)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.from Array disposed', function (t) {\n  var array = [1, 2, 3, 4, 5];\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.from(array, null, null, scheduler);\n  }, { disposed: 204 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 1),\n    onNext(202, 2),\n    onNext(203, 3)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.from array empty', function (t) {\n  var array = [];\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.from(array, null, null, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(201)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.from with length', function (t) {\n  var array = { length: 5 };\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.from(array, function (v, k) { return k; }, null, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 0),\n    onNext(202, 1),\n    onNext(203, 2),\n    onNext(204, 3),\n    onNext(205, 4),\n    onCompleted(206)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.from With String', function (t) {\n  var array = 'foo';\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.from(array, null, null, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 'f'),\n    onNext(202, 'o'),\n    onNext(203, 'o'),\n    onCompleted(204)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.from with selector', function (t) {\n  var array = [1,2,3];\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.from(array, function (x) { return x + x; }, null, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 2),\n    onNext(202, 4),\n    onNext(203, 6),\n    onCompleted(204)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.from with selector error', function (t) {\n  var array = [1,2,3];\n  var error = new Error('woops');\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.from(array, function () { throw error; }, null, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(201, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.from with selector some error', function (t) {\n  var array = [1,2,3];\n  var error = new Error('woops');\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.from(array, function (x, i) {\n      if (i > 1) { throw error; }\n      return x + x;\n    }, null, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 2),\n    onNext(202, 4),\n    onError(203, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.from With Selector And Context', function (t) {\n  var array = [1,2,3];\n  var context = 42;\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.from(array, function (x) {\n      t.equal(this, context);\n      return x + x;\n    }, context, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 2),\n    onNext(202, 4),\n    onNext(203, 6),\n    onCompleted(204)\n  ]);\n\n  t.end();\n});\n\n// Shim in iterator support\nvar $iterator$ = (typeof global.Symbol === 'function' && global.Symbol.iterator) ||\n  '_es6shim_iterator_';\n// Bug for mozilla version\nif (global.Set && typeof new global.Set()['@@iterator'] === 'function') {\n  $iterator$ = '@@iterator';\n}\n\n// Check for Map\nif (!!global.Map && new global.Map()[$iterator$] !== undefined) {\n  test('Observable.from With Map', function (t) {\n    var array = new global.Map([[1, 2], [2, 4], [4, 8]]);\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.from(array, null, null, scheduler);\n    });\n\n    reactiveAssert(t, results.messages, [\n      onNext(201, [1,2]),\n      onNext(202, [2,4]),\n      onNext(203, [4,8]),\n      onCompleted(204)\n    ]);\n\n    t.end();\n  });\n}\n\nif (!!global.Set && new global.Set()[$iterator$] !== undefined) {\n  test('Observable.from With Set', function (t) {\n    var array = new global.Set(['foo','bar','baz']);\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.from(array, null, null, scheduler);\n    });\n\n    reactiveAssert(t, results.messages, [\n      onNext(201, 'foo'),\n      onNext(202, 'bar'),\n      onNext(203, 'baz'),\n      onCompleted(204)\n    ]);\n\n    t.end();\n  });\n}\n"
  },
  {
    "path": "src/modular/test/fromarray.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n    onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  fromArray: require('../observable/fromarray')\n});\n\ntest('Observable.fromArray normal', function (t) {\n  var array = [1, 2, 3, 4, 5];\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.fromArray(array, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 1),\n    onNext(202, 2),\n    onNext(203, 3),\n    onNext(204, 4),\n    onNext(205, 5),\n    onCompleted(206)\n  ]);\n  t.end();\n});\n\ntest('Observable.fromArray empty', function (t) {\n  var array = [];\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.fromArray(array, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(201)\n  ]);\n  t.end();\n});\n\ntest('Observable.fromArray one', function (t) {\n  var array = [1];\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.fromArray(array, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 1),\n    onCompleted(202)\n  ]);\n  t.end();\n});\n\ntest('Observable.fromArray dispose', function (t) {\n  var array = [1, 2, 3, 4, 5];\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.fromArray(array, scheduler);\n  }, { disposed: 204 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 1),\n    onNext(202, 2),\n    onNext(203, 3)\n  ]);\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/fromevent.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar slice = Array.prototype.slice;\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError;\n\nObservable.addToObject({\n  fromEvent: require('../observable/fromevent')\n});\n\n/** Fake DOM Element */\nfunction FakeDOMStandardElement(nodeName) {\n  this.listeners = {};\n  this.nodeName = nodeName;\n  this.addEventListenerCalled = false;\n  this.removeEventListenerCalled = false;\n}\n\nFakeDOMStandardElement.prototype.addEventListener = function (eventName, handler, optionsOrCapture) {\n  this.listeners[eventName] = handler;\n  this.addEventListenerCalled = true;\n};\n\nFakeDOMStandardElement.prototype.removeEventListener = function (eventName, handler, optionsOrCapture) {\n  delete this.listeners[eventName];\n  this.removeEventListenerCalled = true;\n};\n\nFakeDOMStandardElement.prototype.trigger = function (eventName) {\n  var args = slice.call(arguments, 1);\n  if (eventName in this.listeners) {\n    this.listeners[eventName].apply(null, args);\n  }\n};\n\ntest('Observable.fromEvent DOM Element', function (t) {\n  var scheduler = new TestScheduler();\n\n  var element = new FakeDOMStandardElement('foo');\n\n  scheduler.scheduleFuture(null, 210, function() {\n    t.equal(element.addEventListenerCalled, true);\n    t.equal(element.removeEventListenerCalled, false);\n  });\n\n  scheduler.scheduleFuture(null, 220, function() {\n    element.trigger('someEvent', 42);\n  });\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.fromEvent(element, 'someEvent');\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 42)\n  ]);\n\n  t.equal(element.removeEventListenerCalled, true);\n\n  t.end();\n});\n\ntest('Observable.fromEvent DOM Element selector', function (t) {\n  var scheduler = new TestScheduler();\n\n  var element = new FakeDOMStandardElement('foo');\n\n  scheduler.scheduleFuture(null, 210, function() {\n    t.equal(element.addEventListenerCalled, true);\n    t.equal(element.removeEventListenerCalled, false);\n  });\n\n  scheduler.scheduleFuture(null, 220, function() {\n    element.trigger('someEvent', 'baz', 'quux');\n  });\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.fromEvent(\n      element,\n      'someEvent',\n      function (baz, quux) {\n        return { foo: baz, bar: quux };\n      }\n    );\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, {foo: 'baz', bar: 'quux'})\n  ]);\n\n  t.equal(element.removeEventListenerCalled, true);\n\n  t.end();\n});\n\ntest('Observable.fromEvent DOM Element selector throws', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var element = new FakeDOMStandardElement('foo');\n\n  scheduler.scheduleFuture(null, 210, function() {\n    t.equal(element.addEventListenerCalled, true);\n    t.equal(element.removeEventListenerCalled, false);\n  });\n\n  scheduler.scheduleFuture(null, 220, function() {\n    element.trigger('someEvent', 'baz', 'quux');\n  });\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.fromEvent(\n      element,\n      'someEvent',\n      function () {\n        throw error;\n      }\n    );\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.equal(element.removeEventListenerCalled, true);\n\n  t.end();\n});\n\n/** Fake Node EventEmitter */\nfunction FakeEventEmitter() {\n  this.listeners = {};\n  this.addListenerCalled = false;\n  this.removeListenerCalled = false;\n}\n\nFakeEventEmitter.prototype.addListener = function (eventName, handler, useCapture) {\n  this.listeners[eventName] = handler;\n  this.addListenerCalled = true;\n};\n\nFakeEventEmitter.prototype.removeListener = function (eventName, handler, useCapture) {\n  delete this.listeners[eventName];\n  this.removeListenerCalled = true;\n};\n\nFakeEventEmitter.prototype.emit = function (eventName, eventData) {\n  var args = slice.call(arguments, 1);\n  if (eventName in this.listeners) {\n    this.listeners[eventName].apply(null, args);\n  }\n};\n\ntest('Observable.fromEvent EventEmitter', function (t) {\n  var scheduler = new TestScheduler();\n\n  var element = new FakeEventEmitter();\n\n  scheduler.scheduleFuture(null, 210, function() {\n    t.equal(element.addListenerCalled, true);\n    t.equal(element.removeListenerCalled, false);\n  });\n\n  scheduler.scheduleFuture(null, 220, function() {\n    element.emit('someEvent', 42);\n  });\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.fromEvent(element, 'someEvent');\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 42)\n  ]);\n\n  t.equal(element.removeListenerCalled, true);\n\n  t.end();\n});\n\ntest('Observable.fromEvent EventEmitter selector', function (t) {\n  var scheduler = new TestScheduler();\n\n  var element = new FakeEventEmitter();\n\n  scheduler.scheduleFuture(null, 210, function() {\n    t.equal(element.addListenerCalled, true);\n    t.equal(element.removeListenerCalled, false);\n  });\n\n  scheduler.scheduleFuture(null, 220, function() {\n    element.emit('someEvent', 'baz', 'quux');\n  });\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.fromEvent(\n      element,\n      'someEvent',\n      function (baz, quux) {\n        return { foo: baz, bar: quux };\n      }\n    );\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, {foo: 'baz', bar: 'quux'})\n  ]);\n\n  t.equal(element.removeListenerCalled, true);\n\n  t.end();\n});\n\ntest('Observable.fromEvent EventEmitter selector throws', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var element = new FakeEventEmitter();\n\n  scheduler.scheduleFuture(null, 210, function() {\n    t.equal(element.addListenerCalled, true);\n    t.equal(element.removeListenerCalled, false);\n  });\n\n  scheduler.scheduleFuture(null, 220, function() {\n    element.emit('someEvent', 'baz', 'quux');\n  });\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.fromEvent(\n      element,\n      'someEvent',\n      function () {\n        throw error;\n      }\n    );\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.equal(element.removeListenerCalled, true);\n\n  t.end();\n});\n\n/** Fake jQuery/Angular/Ember Element */\nfunction FakeJQueryElement(nodeName) {\n  this.listeners = {};\n  this.nodeName = nodeName;\n  this.onCalled = false;\n  this.offCalled = false;\n}\n\nFakeJQueryElement.prototype.on = function (eventName, handler) {\n  this.listeners[eventName] = handler;\n  this.onCalled = true;\n};\n\nFakeJQueryElement.prototype.off = function (eventName, handler) {\n  delete this.listeners[eventName];\n  this.offCalled = true;\n};\n\nFakeJQueryElement.prototype.trigger = function (eventName) {\n  var args = slice.call(arguments, 1);\n  if (eventName in this.listeners) {\n    this.listeners[eventName].apply(null, args);\n  }\n};\n\ntest('Observable.fromEvent jQuery/Angular/Ember Element', function (t) {\n  var scheduler = new TestScheduler();\n\n  var element = new FakeJQueryElement('foo');\n\n  scheduler.scheduleFuture(null, 210, function(){\n    t.equal(element.onCalled, true);\n    t.equal(element.offCalled, false);\n  });\n\n  scheduler.scheduleFuture(null, 220, function() {\n    element.trigger('someEvent', 42);\n  });\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.fromEvent(element, 'someEvent');\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 42)\n  ]);\n\n  t.equal(element.offCalled, true);\n\n  t.end();\n});\n\ntest('Observable.fromEvent jQuery/Angular/Ember Element selector', function (t) {\n  var scheduler = new TestScheduler();\n\n  var element = new FakeJQueryElement('foo');\n\n  scheduler.scheduleFuture(null, 210, function(){\n    t.equal(element.onCalled, true);\n    t.equal(element.offCalled, false);\n  });\n\n  scheduler.scheduleFuture(null, 220, function() {\n    element.trigger('someEvent', 'baz', 'quux');\n  });\n\n  var results = scheduler.startScheduler(function(){\n    return Observable.fromEvent(\n      element,\n      'someEvent',\n      function (baz, quux) {\n        return { foo: baz, bar: quux };\n      }\n    );\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, {foo: 'baz', bar: 'quux'})\n  ]);\n\n  t.equal(element.offCalled, true);\n\n  t.end();\n});\n\ntest('Observable.fromEvent jQuery/Angular/Ember Element selector throws', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var element = new FakeJQueryElement('foo');\n\n  scheduler.scheduleFuture(null, 210, function(){\n    t.equal(element.onCalled, true);\n    t.equal(element.offCalled, false);\n  });\n\n  scheduler.scheduleFuture(null, 220, function() {\n    element.trigger('someEvent', 'baz', 'quux');\n  });\n\n  var results = scheduler.startScheduler(function(){\n    return Observable.fromEvent(\n      element,\n      'someEvent',\n      function () {\n        throw error;\n      }\n    );\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.equal(element.offCalled, true);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/fromeventpattern.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar slice = Array.prototype.slice;\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError;\n\nObservable.addToObject({\n  fromEventPattern: require('../observable/fromeventpattern')\n});\n\nfunction FakeDojoElement(nodeName) {\n  this.listeners = {};\n  this.nodeName = nodeName;\n  this.onCalled = false;\n  this.offCalled = false;\n}\n\nFakeDojoElement.prototype.on = function (eventName, handler) {\n  this.listeners[eventName] = handler;\n  this.onCalled = true;\n  return new FakeDojoDisposable(this, eventName);\n};\n\nFakeDojoElement.prototype.trigger = function (eventName) {\n  var args = slice.call(arguments, 1);\n  if (eventName in this.listeners) {\n    this.listeners[eventName].apply(null, args);\n  }\n};\n\nfunction FakeDojoDisposable(parent, eventName) {\n  this.parent = parent;\n  this.eventName = eventName;\n}\n\nFakeDojoDisposable.prototype.disconnect = function () {\n  delete this.parent.listeners[this.eventName];\n  this.parent.offCalled = true;\n};\n\ntest('fromEventPattern with return from add handler', function (t) {\n  var scheduler = new TestScheduler();\n\n  var element = new FakeDojoElement('foo');\n\n  scheduler.scheduleFuture(null, 210, function() {\n    t.equal(element.onCalled, true);\n    t.equal(element.offCalled, false);\n  });\n\n  scheduler.scheduleFuture(null, 220, function() {\n    element.trigger('someEvent', 42);\n  });\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.fromEventPattern(\n      function (h) { return element.on('someEvent', h); },\n      function (_, d) { d.disconnect(); }\n    );\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 42)\n  ]);\n\n  t.equal(element.offCalled, true);\n\n  t.end();\n});\n\n\n/** Fake DOM Element */\nfunction FakeDOMStandardElement(nodeName) {\n  this.listeners = {};\n  this.nodeName = nodeName;\n  this.addEventListenerCalled = false;\n  this.removeEventListenerCalled = false;\n}\n\nFakeDOMStandardElement.prototype.addEventListener = function (eventName, handler, useCapture) {\n  this.listeners[eventName] = handler;\n  this.addEventListenerCalled = true;\n};\n\nFakeDOMStandardElement.prototype.removeEventListener = function (eventName, handler, useCapture) {\n  delete this.listeners[eventName];\n  this.removeEventListenerCalled = true;\n};\n\nFakeDOMStandardElement.prototype.trigger = function (eventName) {\n  var args = slice.call(arguments, 1);\n  if (eventName in this.listeners) {\n    this.listeners[eventName].apply(null, args);\n  }\n};\n\ntest('Observable.fromEventPattern', function (t) {\n  var scheduler = new TestScheduler();\n\n  var element = new FakeDOMStandardElement('foo');\n\n  scheduler.scheduleFuture(null, 210, function() {\n    t.equal(element.addEventListenerCalled, true);\n    t.equal(element.removeEventListenerCalled, false);\n  });\n\n  scheduler.scheduleFuture(null, 220, function() {\n    element.trigger('someEvent', 42);\n  });\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.fromEventPattern(\n      function (h) { element.addEventListener('someEvent', h); },\n      function (h) { element.removeEventListener('someEvent', h); }\n    );\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 42)\n  ]);\n\n  t.equal(element.removeEventListenerCalled, true);\n\n  t.end();\n});\n\ntest('fromEventPattern selector', function (t) {\n  var scheduler = new TestScheduler();\n\n  var element = new FakeDOMStandardElement('foo');\n\n  scheduler.scheduleFuture(null, 210, function() {\n    t.equal(element.addEventListenerCalled, true);\n    t.equal(element.removeEventListenerCalled, false);\n  });\n\n  scheduler.scheduleFuture(null, 220, function() {\n    element.trigger('someEvent', 'baz', 'quux');\n  });\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.fromEventPattern(\n      function (h) { element.addEventListener('someEvent', h); },\n      function (h) { element.removeEventListener('someEvent', h); },\n      function (baz, quux) {\n        return { foo: baz, bar: quux };\n      }\n    );\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, {foo: 'baz', bar: 'quux'})\n  ]);\n\n  t.equal(element.removeEventListenerCalled, true);\n\n  t.end();\n});\n\ntest('fromEventPattern selector throws', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var element = new FakeDOMStandardElement('foo');\n\n  scheduler.scheduleFuture(null, 210, function() {\n    t.equal(element.addEventListenerCalled, true);\n    t.equal(element.removeEventListenerCalled, false);\n  });\n\n  scheduler.scheduleFuture(null, 220, function() {\n    element.trigger('someEvent', 'baz', 'quux');\n  });\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.fromEventPattern(\n      function (h) { element.addEventListener('someEvent', h); },\n      function (h) { element.removeEventListener('someEvent', h); },\n      function () {\n        throw error;\n      }\n    );\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.equal(element.removeEventListenerCalled, true);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/frompromise.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n    onError = ReactiveTest.onError,\n    onCompleted = ReactiveTest.onCompleted;\n\n// Polyfilling\nrequire('lie/polyfill');\n\nObservable.addToObject({\n  fromPromise: require('../observable/frompromise')\n});\n\ntest('Observable.fromPromise factory success mock', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createResolvedPromise(201, 1);\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.fromPromise(function () { return xs; }, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(202, 1),\n    onCompleted(202)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.fromPromise factory failure mock', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createRejectedPromise(201, error);\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.fromPromise(function () { return xs; }, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(202, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.fromPromise factory throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.fromPromise(function () { throw error; }, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(200, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.fromPromise success mock', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createResolvedPromise(201, 1);\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.fromPromise(xs, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(202, 1),\n    onCompleted(202)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.fromPromise failure mock', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createRejectedPromise(201, error);\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.fromPromise(xs, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(202, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.fromPromise success', function (t) {\n  var promise = new Promise(function (resolve) {\n    resolve(42);\n  });\n\n  var source = Observable.fromPromise(promise);\n\n  source.subscribe(\n    function (x) {\n      t.equal(42, x);\n    },\n    function () {\n      t.ok(false);\n    },\n    function () {\n      t.ok(true);\n      t.end();\n    });\n});\n\ntest('promise Failure', function (t) {\n  var error = new Error('woops');\n\n  var promise = new Promise(function (resolve, reject) {\n    reject(error);\n  });\n\n  var source = Observable.fromPromise(promise);\n\n  source.subscribe(\n    function () {\n      t.ok(false);\n    },\n    function (err) {\n      t.equal(err, error);\n      t.end();\n    },\n    function () {\n      t.ok(false);\n    });\n});\n"
  },
  {
    "path": "src/modular/test/generate.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  generate: require('../observable/generate')\n});\n\ntest('Observable.generate finite', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.generate(0, function (x) {\n      return x <= 3;\n    }, function (x) {\n      return x + 1;\n    }, function (x) {\n      return x;\n    }, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 0),\n    onNext(202, 1),\n    onNext(203, 2),\n    onNext(204, 3),\n    onCompleted(205)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.generate throw condition', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.generate(0, function () {\n      throw error;\n    }, function (x) {\n      return x + 1;\n    }, function (x) {\n      return x;\n    }, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(201, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.generate throw result selector', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.generate(0, function () {\n      return true;\n    }, function (x) {\n      return x + 1;\n    }, function () {\n      throw error;\n    }, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(201, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.generate throw iterate', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.generate(0, function () {\n      return true;\n    }, function () {\n      throw error;\n    }, function (x) {\n      return x;\n    }, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 0),\n    onError(202, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.generate dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.generate(0, function () {\n      return true;\n    }, function (x) {\n      return x + 1;\n    }, function (x) {\n      return x;\n    }, scheduler);\n  }, {disposed: 203 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 0),\n    onNext(202, 1)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/generateabsolute.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  generateAbsolute: require('../observable/generateabsolute')\n});\n\ntest('Observable.generateAbsolute absolute time finite', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.generateAbsolute(0, function (x) {\n      return x <= 3;\n    }, function (x) {\n      return x + 1;\n    }, function (x) {\n      return x;\n    }, function (x) {\n      return new Date(scheduler.now() + x + 1);\n    }, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(202, 0),\n    onNext(204, 1),\n    onNext(207, 2),\n    onNext(211, 3),\n    onCompleted(211)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.generateAbsolute absolute time throw condition', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.generateAbsolute(0, function () {\n      throw error;\n    }, function (x) {\n      return x + 1;\n    }, function (x) {\n      return x;\n    }, function (x) {\n      return new Date(scheduler.now() + x + 1);\n    }, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(201, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.generateAbsolute absolute time throw result selector', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.generateAbsolute(0, function () {\n      return true;\n    }, function (x) {\n      return x + 1;\n    }, function () {\n      throw error;\n    }, function (x) {\n      return new Date(scheduler.now() + x + 1);\n    }, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(201, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.generateAbsolute absolute time throw iterate', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.generateAbsolute(0, function () {\n      return true;\n    }, function () {\n      throw error;\n    }, function (x) {\n      return x;\n    }, function (x) {\n      return new Date(scheduler.now() + x + 1);\n    }, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(202, 0),\n    onError(202, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.generateAbsolute absolute time throw time selector', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.generateAbsolute(0, function () {\n      return true;\n    }, function (x) {\n      return x + 1;\n    }, function (x) {\n      return x;\n    }, function () {\n      throw error;\n    }, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(201, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.generateAbsolute absolute time dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n      return Observable.generateAbsolute(0, function () {\n        return true;\n      }, function (x) {\n        return x + 1;\n      }, function (x) {\n        return x;\n      }, function (x) {\n        return new Date(scheduler.now() + x + 1);\n      }, scheduler);\n  }, { disposed: 210 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(202, 0),\n    onNext(204, 1),\n    onNext(207, 2)\n  ]);\n\n  t.end();\n});\n\ntest('generateWithAbsoluteTime resultSelection', function(t) {\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.generateAbsolute(0, function(x) {\n      return x < 3;\n    }, function(x) {\n      return x + 1;\n    }, function(x) {\n      return 2 * x + 1;\n    }, function(x) {\n      return 10 * x;\n    }, scheduler);\n  });\n\n  reactiveAssert(t, results.messages,\n    [onNext(202, 1),\n      onNext(212, 3),\n      onNext(232, 5),\n      onCompleted(232)]\n  );\n\n  t.end();\n\n});\n"
  },
  {
    "path": "src/modular/test/generaterelative.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  generateRelative: require('../observable/generaterelative')\n});\n\ntest('Observable.generateRelative finite', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.generateRelative(0, function (x) {\n      return x <= 3;\n    }, function (x) {\n      return x + 1;\n    }, function (x) {\n      return x;\n    }, function (x) {\n      return x + 1;\n    }, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(202, 0),\n    onNext(204, 1),\n    onNext(207, 2),\n    onNext(211, 3),\n    onCompleted(211)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.generateRelative throw condition', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.generateRelative(0, function () {\n      throw error;\n    }, function (x) {\n      return x + 1;\n    }, function (x) {\n      return x;\n    }, function (x) {\n      return x + 1;\n    }, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(201, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.generateRelative throw result selector', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.generateRelative(0, function () {\n      return true;\n    }, function (x) {\n      return x + 1;\n    }, function () {\n      throw error;\n    }, function (x) {\n      return x + 1;\n    }, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(201, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.generateRelative throw iterate', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.generateRelative(0, function () {\n      return true;\n    }, function () {\n      throw error;\n    }, function (x) {\n      return x;\n    }, function (x) {\n      return x + 1;\n    }, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(202, 0),\n    onError(202, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.generateRelative throw time selector', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.generateRelative(0, function () {\n      return true;\n    }, function (x) {\n      return x + 1;\n    }, function (x) {\n      return x;\n    }, function () {\n      throw error;\n    }, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(201, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.generateRelative dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.generateRelative(0, function () {\n      return true;\n    }, function (x) {\n      return x + 1;\n    }, function (x) {\n      return x;\n    }, function (x) {\n      return x + 1;\n    }, scheduler);\n  }, { disposed: 210 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(202, 0),\n    onNext(204, 1),\n    onNext(207, 2)\n  ]);\n\n  t.end();\n});\n\ntest('generaterelative resultSelection', function(t) {\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.generateRelative(0, function(x) {\n      return x < 3;\n    }, function(x) {\n      return x + 1;\n    }, function(x) {\n      return 2 * x + 1;\n    }, function(x) {\n      return 10 * x;\n    }, scheduler);\n  });\n\n  reactiveAssert(t, results.messages,\n    [onNext(202, 1),\n    onNext(212, 3),\n    onNext(232, 5),\n    onCompleted(232)]\n  );\n\n  t.end();\n\n});\n"
  },
  {
    "path": "src/modular/test/groupjoin.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  groupJoin: require('../observable/groupjoin'),\n  map: require('../observable/map'),\n  mergeAll: require('../observable/mergeall')\n});\n\nfunction TimeInterval(value, interval) {\n  this.value = value;\n  this.interval = interval;\n}\n\nfunction newTimer(l, t, scheduler) {\n  var timer = scheduler.createColdObservable(onNext(t, 0), onCompleted(t));\n  l.push(timer);\n  return timer;\n}\n\ntest('groupJoin normal I', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 280)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800)\n  );\n\n  var xsd = [];\n  var ysd = [];\n\n  var results = scheduler.startScheduler(function (){\n    return xs.groupJoin(\n      ys,\n      function (x) { return newTimer(xsd, x.interval, scheduler); },\n      function (y) { return newTimer(ysd, y.interval, scheduler); },\n      function (x, yy) { return yy.map(function (y) { return x.value + y.value; }); })\n    .mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man'),\n    onNext(720, '8tin'),\n    onNext(720, '8man'),\n    onNext(722, '6rat'),\n    onNext(722, '7rat'),\n    onNext(722, '8rat'),\n    onNext(732, '7wig'),\n    onNext(732, '8wig'),\n    onNext(830, '9rat'),\n    onCompleted(990)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 990)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 990)\n  ]);\n\n  t.end();\n});\n\ntest('groupJoin normal II', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 200)),\n    onNext(720, new TimeInterval(8, 100)),\n    onCompleted(721)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', (20))),\n    onNext(217, new TimeInterval('bat', (1))),\n    onNext(290, new TimeInterval('wag', (200))),\n    onNext(300, new TimeInterval('pig', (10))),\n    onNext(305, new TimeInterval('cup', (50))),\n    onNext(600, new TimeInterval('yak', (90))),\n    onNext(702, new TimeInterval('tin', (20))),\n    onNext(712, new TimeInterval('man', (10))),\n    onNext(722, new TimeInterval('rat', (200))),\n    onNext(732, new TimeInterval('wig', (5))),\n    onCompleted(990)\n  );\n\n  var xsd = [];\n  var ysd = [];\n\n  var results = scheduler.startScheduler(function (){\n    return xs.groupJoin(\n      ys,\n      function (x) { return newTimer(xsd, x.interval, scheduler); },\n      function (y) { return newTimer(ysd, y.interval, scheduler); },\n      function (x, yy) { return yy.map(function (y) { return x.value + y.value; }); })\n    .mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man'),\n    onNext(720, '8tin'),\n    onNext(720, '8man'),\n    onNext(722, '6rat'),\n    onNext(722, '7rat'),\n    onNext(722, '8rat'),\n    onNext(732, '7wig'),\n    onNext(732, '8wig'),\n    onCompleted(910)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 910)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 910)\n  ]);\n\n  t.end();\n});\n\ntest('groupJoin normal III', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 280)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900));\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.groupJoin(ys, function (x) {\n      return Observable.timer(x.interval, null, scheduler).filter(function () { return false; });\n    }, function (y) {\n      return Observable.timer(y.interval, null, scheduler).filter(function () { return false; });\n    }, function (x, yy) {\n      return yy.map(function (y) { return x.value + y.value; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man'),\n    onNext(720, '8tin'),\n    onNext(720, '8man'),\n    onNext(722, '6rat'),\n    onNext(722, '7rat'),\n    onNext(722, '8rat'),\n    onNext(732, '7wig'),\n    onNext(732, '8wig'),\n    onNext(830, '9rat'),\n    onCompleted(990)\n  ]);\n\n  t.end();\n});\n\ntest('groupJoin normal IV', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 200)),\n    onNext(720, new TimeInterval(8, 100)),\n    onCompleted(990));\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(980));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.groupJoin(ys, function (x) {\n      return Observable.timer(x.interval, null, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, null, scheduler);\n    }, function (x, yy) {\n      return yy.map(function (y) { return x.value + y.value; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man'),\n    onNext(720, '8tin'),\n    onNext(720, '8man'),\n    onNext(722, '6rat'),\n    onNext(722, '7rat'),\n    onNext(722, '8rat'),\n    onNext(732, '7wig'),\n    onNext(732, '8wig'),\n    onCompleted(990)\n  ]);\n\n  t.end();\n});\n\ntest('groupJoin normal V', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 200)),\n    onNext(720, new TimeInterval(8, 100)),\n    onCompleted(990));\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(900));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.groupJoin(ys, function (x) {\n      return Observable.timer(x.interval, null, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, null, scheduler);\n    }, function (x, yy) {\n      return yy.map(function (y) { return x.value + y.value; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man'),\n    onNext(720, '8tin'),\n    onNext(720, '8man'),\n    onNext(722, '6rat'),\n    onNext(722, '7rat'),\n    onNext(722, '8rat'),\n    onNext(732, '7wig'),\n    onNext(732, '8wig'),\n    onCompleted(990)\n  ]);\n\n  t.end();\n});\n\ntest('groupJoin normal VI', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 30)),\n    onNext(720, new TimeInterval(8, 200)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(850));\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 20)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(900));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.groupJoin(ys, function (x) {\n      return Observable.timer(x.interval, null, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, null, scheduler);\n    }, function (x, yy) {\n      return yy.map(function (y) { return x.value + y.value; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man'),\n    onNext(720, '8tin'),\n    onNext(720, '8man'),\n    onNext(722, '6rat'),\n    onNext(722, '7rat'),\n    onNext(722, '8rat'),\n    onNext(732, '7wig'),\n    onNext(732, '8wig'),\n    onCompleted(920)\n  ]);\n\n  t.end();\n});\n\ntest('groupJoin normal VII', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onCompleted(210));\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 20)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(900)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.groupJoin(ys, function (x) {\n      return Observable.timer(x.interval, null, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, null, scheduler);\n    }, function (x, yy) {\n      return yy.map(function (y) { return x.value + y.value; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('groupJoin normal VIII', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 200))\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(220, new TimeInterval('hat', 100)),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.groupJoin(ys, function (x) {\n      return Observable.timer(x.interval, null, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, null, scheduler);\n    }, function (x, yy) {\n      return yy.map(function (y) { return x.value + y.value; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, '0hat')\n  ]);\n\n  t.end();\n});\n\ntest('groupJoin normal IX', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 300)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900));\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.groupJoin(ys, function (x) {\n      return Observable.timer(x.interval, null, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, null, scheduler);\n    }, function (x, yy) {\n      return yy.map(function (y) { return x.value + y.value; });\n    }).mergeAll();\n  }, { disposed: 713 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man')\n  ]);\n\n  t.end();\n});\n\ntest('groupJoin Error I', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onError(310, error)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.groupJoin(ys, function (x) {\n      return Observable.timer(x.interval, null, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, null, scheduler);\n    }, function (x, yy) {\n      return yy.map(function (y) { return x.value + y.value; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onError(310, error)\n  ]);\n\n  t.end();\n});\n\ntest('groupJoin Error II', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 300)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onError(722, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.groupJoin(ys, function (x) {\n      return Observable.timer(x.interval, null, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, null, scheduler);\n    }, function (x, yy) {\n      return yy.map(function (y) { return x.value + y.value; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man'),\n    onNext(720, '8tin'),\n    onNext(720, '8man'),\n    onError(722, error)\n  ]);\n\n  t.end();\n});\n\ntest('groupJoin Error III', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 300)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900));\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.groupJoin(ys, function (x) {\n      return Observable.timer(x.interval, null, scheduler).flatMap(x.value === 6 ? Observable['throw'](error) : Observable.empty());\n    }, function (y) {\n      return Observable.timer(y.interval, null, scheduler);\n    }, function (x, yy) {\n      return yy.map(function (y) { return x.value + y.value; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man'),\n    onNext(720, '8tin'),\n    onNext(720, '8man'),\n    onNext(722, '6rat'),\n    onNext(722, '7rat'),\n    onNext(722, '8rat'),\n    onError(725, error)\n  ]);\n\n  t.end();\n});\n\ntest('groupJoin Error IV', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 300)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 19)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.groupJoin(ys, function (x) {\n      return Observable.timer(x.interval, null, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, null, scheduler).flatMap(y.value === 'tin' ? Observable['throw'](error) : Observable.empty());\n    }, function (x, yy) {\n      return yy.map(function (y) { return x.value + y.value; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man'),\n    onNext(720, '8tin'),\n    onNext(720, '8man'),\n    onError(721, error)\n  ]);\n\n  t.end();\n});\n\ntest('groupJoin Error V', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 300)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.groupJoin(ys, function (x) {\n      if (x.value >= 0) { throw error; }\n      return Observable.empty();\n    }, function (y) {\n      return Observable.timer(y.interval, null, scheduler);\n    }, function (x, yy) {\n      return yy.map(function (y) { return x.value + y.value; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('groupJoin Error VI', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 300)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.groupJoin(ys, function (x) {\n      return Observable.timer(x.interval, null, scheduler);\n    }, function (y) {\n      if (y.value.length >= 0) { throw error; }\n      return Observable.empty();\n    }, function (x, yy) {\n      return yy.map(function (y) { return x.value + y.value; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(215, error)\n  ]);\n\n  t.end();\n});\n\ntest('groupJoin Error VII', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(215, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 300)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(210, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.groupJoin(ys, function (x) {\n      return Observable.timer(x.interval, null, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, null, scheduler);\n    }, function (x, yy) {\n      if (x.value >= 0) { throw error; }\n      return yy.map(function (y) { return x.value + y.value; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(215, error)\n  ]);\n\n  t.end();\n});\n\ntest('groupJoin Error VIII', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 300)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.groupJoin(ys, function (x) {\n      return Observable.timer(x.interval, null, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, null, scheduler);\n    }, function (x, yy) {\n      if (x.value >= 0) { throw error; }\n      return yy.map(function (y) { return x.value + y.value; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/historicalscheduler.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar HistoricalScheduler = require('../scheduler/historicalscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\n\nfunction time(days) {\n  var d = new Date(1979,10,31,4,30,15);\n  d.setUTCDate(d.getDate() + days);\n  return d.getTime();\n}\n\nfunction fromDays(days) {\n  return 86400000 * days;\n}\n\nfunction Timestamped (value, timestamp) {\n  this.value = value;\n  this.timestamp = timestamp;\n}\n\nTimestamped.prototype.equals = function (other) {\n  if (other == null) { return false; }\n  return other.value === this.value && other.timestamp === this.timestamp;\n};\n\ntest('HistoricalScheduler constructor', function (t) {\n  var s = new HistoricalScheduler();\n  \n  t.equal(0, s.clock);\n  t.equal(false, s.isEnabled);\n\n  t.end();\n});\n\ntest('HistoricalScheduler start and stop', function (t) {\n  var s = new HistoricalScheduler();\n\n  var list = [];\n\n  s.scheduleAbsolute(null, time(0), function () { list.push(new Timestamped(1, s.now())); });\n  s.scheduleAbsolute(null, time(1), function () { list.push(new Timestamped(2, s.now())); });\n  s.scheduleAbsolute(null, time(2), function () { s.stop(); });\n  s.scheduleAbsolute(null, time(3), function () { list.push(new Timestamped(3, s.now())); });\n  s.scheduleAbsolute(null, time(4), function () { s.stop(); });\n  s.scheduleAbsolute(null, time(5), function () { s.start(); });\n  s.scheduleAbsolute(null, time(6), function () { list.push(new Timestamped(4, s.now())); });\n\n  s.start();\n\n  t.equal(time(2), s.now());\n  t.equal(time(2), s.clock);\n\n  s.start();\n\n  t.equal(time(4), s.now());\n  t.equal(time(4), s.clock);\n\n  s.start();\n\n  t.equal(time(6), s.now());\n  t.equal(time(6), s.clock);\n\n  s.start();\n\n  t.equal(time(6), s.now());\n  t.equal(time(6), s.clock);\n\n  reactiveAssert(t, list, [\n    new Timestamped(1, time(0)),\n    new Timestamped(2, time(1)),\n    new Timestamped(3, time(3)),\n    new Timestamped(4, time(6))\n  ]);\n\n  t.end();\n});\n\ntest('HistoricalScheduler order', function (t) {\n  var s = new HistoricalScheduler();\n\n  var list = [];\n\n  s.scheduleAbsolute(null, time(2), function () { list.push(new Timestamped(2, s.now())); });\n\n  s.scheduleAbsolute(null, time(3), function () { list.push(new Timestamped(3, s.now())); });\n\n  s.scheduleAbsolute(null, time(1), function () { list.push(new Timestamped(0, s.now())); });\n  s.scheduleAbsolute(null, time(1), function () { list.push(new Timestamped(1, s.now())); });\n\n  s.start();\n\n  reactiveAssert(t, list, [\n    new Timestamped(0, time(1)),\n    new Timestamped(1, time(1)),\n    new Timestamped(2, time(2)),\n    new Timestamped(3, time(3))\n  ]);\n\n  t.end();\n});\n\ntest('HistoricalScheduler cancellation', function (t) {\n  var s = new HistoricalScheduler();\n\n  var list = [];\n\n  var d = s.scheduleAbsolute(null, time(2), function () { list.push(new Timestamped(2, s.now())); });\n\n  s.scheduleAbsolute(null, time(1), function () {\n    list.push(new Timestamped(0, s.now()));\n    d.dispose();\n  });\n\n  s.start();\n\n  reactiveAssert(t, list, [\n    new Timestamped(0, time(1))\n  ]);\n\n  t.end();\n});\n\ntest('HistoricalScheduler advance to', function (t) {\n  var s = new HistoricalScheduler();\n\n  var list = [];\n\n  s.scheduleAbsolute(null, time(0), function () { list.push(new Timestamped(0, s.now())); });\n  s.scheduleAbsolute(null, time(1), function () { list.push(new Timestamped(1, s.now())); });\n  s.scheduleAbsolute(null, time(2), function () { list.push(new Timestamped(2, s.now())); });\n  s.scheduleAbsolute(null, time(10), function () { list.push(new Timestamped(10, s.now())); });\n  s.scheduleAbsolute(null, time(11), function () { list.push(new Timestamped(11, s.now())); });\n\n  s.advanceTo(time(8));\n\n  t.equal(time(8), s.now());\n  t.equal(time(8), s.clock);\n\n  reactiveAssert(t, list, [\n    new Timestamped(0, time(0)),\n    new Timestamped(1, time(1)),\n    new Timestamped(2, time(2))\n  ]);\n\n  s.advanceTo(time(8));\n\n  t.equal(time(8), s.now());\n  t.equal(time(8), s.clock);\n\n  reactiveAssert(t, list, [\n    new Timestamped(0, time(0)),\n    new Timestamped(1, time(1)),\n    new Timestamped(2, time(2))\n  ]);\n\n  s.scheduleAbsolute(null, time(7), function () { list.push(new Timestamped(7, s.now())); });\n  s.scheduleAbsolute(null, time(8), function () { list.push(new Timestamped(8, s.now())); });\n\n  t.equal(time(8), s.now());\n  t.equal(time(8), s.clock);\n\n  reactiveAssert(t, list, [\n    new Timestamped(0, time(0)),\n    new Timestamped(1, time(1)),\n    new Timestamped(2, time(2))\n  ]);\n\n  s.advanceTo(time(10));\n\n  t.equal(time(10), s.now());\n  t.equal(time(10), s.clock);\n\n  reactiveAssert(t, list, [\n    new Timestamped(0, time(0)),\n    new Timestamped(1, time(1)),\n    new Timestamped(2, time(2)),\n    new Timestamped(7, time(8)),\n    new Timestamped(8, time(8)),\n    new Timestamped(10, time(10))\n  ]);\n\n  s.advanceTo(time(100));\n\n  t.equal(time(100), s.now());\n  t.equal(time(100), s.clock);\n\n  reactiveAssert(t, list, [\n    new Timestamped(0, time(0)),\n    new Timestamped(1, time(1)),\n    new Timestamped(2, time(2)),\n    new Timestamped(7, time(8)),\n    new Timestamped(8, time(8)),\n    new Timestamped(10, time(10)),\n    new Timestamped(11, time(11))\n  ]);\n\n  t.end();\n});\n\ntest('HistoricalScheduler advance by', function (t) {\n  var s = new HistoricalScheduler();\n\n  var list = [];\n\n  s.scheduleAbsolute(null, time(0), function () { list.push(new Timestamped(0, s.now())); });\n  s.scheduleAbsolute(null, time(1), function () { list.push(new Timestamped(1, s.now())); });\n  s.scheduleAbsolute(null, time(2), function () { list.push(new Timestamped(2, s.now())); });\n  s.scheduleAbsolute(null, time(10), function () { list.push(new Timestamped(10, s.now())); });\n  s.scheduleAbsolute(null, time(11), function () { list.push(new Timestamped(11, s.now())); });\n\n  s.advanceBy(time(8) - s.now());\n\n  t.equal(time(8), s.now());\n  t.equal(time(8), s.clock);\n\n  reactiveAssert(t, list, [\n    new Timestamped(0, time(0)),\n    new Timestamped(1, time(1)),\n    new Timestamped(2, time(2))\n  ]);\n\n  s.scheduleAbsolute(null, time(7), function () { list.push(new Timestamped(7, s.now())); });\n  s.scheduleAbsolute(null, time(8), function () { list.push(new Timestamped(8, s.now())); });\n\n  t.equal(time(8), s.now());\n  t.equal(time(8), s.clock);\n\n  reactiveAssert(t, list, [\n    new Timestamped(0, time(0)),\n    new Timestamped(1, time(1)),\n    new Timestamped(2, time(2))\n  ]);\n\n  s.advanceBy(0);\n\n  t.equal(time(8), s.now());\n  t.equal(time(8), s.clock);\n\n  reactiveAssert(t, list, [\n    new Timestamped(0, time(0)),\n    new Timestamped(1, time(1)),\n    new Timestamped(2, time(2))\n  ]);\n\n  s.advanceBy(fromDays(2));\n\n  t.equal(time(10), s.now());\n  t.equal(time(10), s.clock);\n\n  reactiveAssert(t, list, [\n    new Timestamped(0, time(0)),\n    new Timestamped(1, time(1)),\n    new Timestamped(2, time(2)),\n    new Timestamped(7, time(8)),\n    new Timestamped(8, time(8)),\n    new Timestamped(10, time(10))\n  ]);\n\n  s.advanceBy(fromDays(90));\n\n  t.equal(time(100), s.now());\n  t.equal(time(100), s.clock);\n\n  reactiveAssert(t, list, [\n    new Timestamped(0, time(0)),\n    new Timestamped(1, time(1)),\n    new Timestamped(2, time(2)),\n    new Timestamped(7, time(8)),\n    new Timestamped(8, time(8)),\n    new Timestamped(10, time(10)),\n    new Timestamped(11, time(11))\n  ]);\n\n  t.end();\n});\n\ntest('HistoricalScheduler is enabled', function (t) {\n  var s = new HistoricalScheduler();\n\n  t.equal(false, s.isEnabled);\n\n  s.schedule(s, function (s) {\n    t.equal(true, s.isEnabled);\n    s.stop();\n    t.equal(false, s.isEnabled);\n  });\n\n  t.equal(false, s.isEnabled);\n\n  s.start();\n\n  t.equal(false, s.isEnabled);\n\n  t.end();\n});\n\ntest('HistoricalScheduler Sleep 1', function (t) {\n  var now = new Date(1983, 2, 11, 12, 0, 0).getTime();\n\n  var s = new HistoricalScheduler(now);\n\n  s.sleep(fromDays(1));\n\n  t.equal(now + fromDays(1), s.clock);\n\n  t.end();\n});\n\ntest('HistoricalScheduler sleep 2', function (t) {\n  var s = new HistoricalScheduler();\n\n  var n = 0;\n\n  s.scheduleRecursiveFuture(null, new Date(s.now() + 6000), function (_, rec) {\n    s.sleep(3 * 6000);\n    n++;\n\n    rec(null, new Date(s.now() + 6000));\n  });\n\n  s.advanceTo(s.now() + (5 * 6000));\n\n  t.equal(2, n);\n\n  t.end();\n});\n\nfunction reverseComparer (x, y) {\n  return y - x;\n}\n\ntest('HistoricalScheduler with comparer', function (t) {\n  var now = new Date();\n\n  var s = new HistoricalScheduler(now, reverseComparer);\n\n  var list = [];\n\n  s.scheduleAbsolute(null, now - 1000, function () { list.push(1); });\n  s.scheduleAbsolute(null, now - 2000, function () { list.push(2); });\n\n  s.start();\n\n  reactiveAssert(t, list, [\n    1,\n    2\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/ignoreelements.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  ignoreElements: require('../observable/ignoreelements')\n});\n\ntest('Observable#ignoreElements basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.ignoreElements();\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#ignoreElements Completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onCompleted(610));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.ignoreElements();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(610)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 610)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#ignoreElements Error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onError(610, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.ignoreElements();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(610, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 610)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/includes.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  includes: require('../observable/includes')\n});\n\ntest('Observable#includes empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.includes(42);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, false),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#includes return positive', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.includes(2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, true),\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#includes return negative', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.includes(-2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, false),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#includes some positive', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.includes(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, true),\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#includes some negative', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.includes(-3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, false),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#includes throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.includes(42);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#includes never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.includes(42);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#includes fromIndex less than zero', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.includes(42, -1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, false),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#includes fromIndex Infinity', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.includes(2, Infinity);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, true),\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#includes fromIndex zero', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.includes(2, 0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, true),\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#includes fromIndex greater than zero misses', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.includes(2, 1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, false),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#includes fromIndex greater than zero no end', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.includes(2, 1);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#includes fromIndex greater than zero hits', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.includes(3, 1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, true),\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#includes -0 equals 0', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, -0),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.includes(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, true),\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#includes +0 equals 0', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, +0),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.includes(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, true),\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#includes NaN equals NaN', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, NaN),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.includes(NaN);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, true),\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/indexof.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  indexOf: require('../observable/indexof')\n});\n\ntest('Observable#indexOf empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.indexOf(42);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, -1),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#indexOf return positive', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.indexOf(2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 0),\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#indexOf return negative', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.indexOf(-2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, -1),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#indexOf some positive', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.indexOf(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 1),\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#indexOf some negative', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.indexOf(-3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, -1),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#indexOf throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.indexOf(42);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#indexOf never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.indexOf(42);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#indexOf fromIndex less than zero', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.indexOf(42, -1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, -1),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#indexOf fromIndex Infinity', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.indexOf(2, Infinity);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 0),\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#indexOf fromIndex zero', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.indexOf(2, 0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 0),\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#indexOf fromIndex greater than zero misses', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.indexOf(2, 1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, -1),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#indexOf fromIndex greater than zero no end', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.indexOf(2, 1);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#indexOf fromIndex greater than zero hits', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.indexOf(3, 1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 1),\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#indexOf -0 equals 0', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, -0),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.indexOf(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 0),\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#indexOf +0 equals 0', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, +0),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.indexOf(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 0),\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/interval.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext;\n\nObservable.addToObject({\n  interval: require('../observable/interval')\n});\n\ntest('Observable.interval relative time basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.interval(100, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 0),\n    onNext(400, 1),\n    onNext(500, 2),\n    onNext(600, 3),\n    onNext(700, 4),\n    onNext(800, 5),\n    onNext(900, 6)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.interval relative time zero', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.interval(0, scheduler);\n  }, { disposed: 210 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 0),\n    onNext(202, 1),\n    onNext(203, 2),\n    onNext(204, 3),\n    onNext(205, 4),\n    onNext(206, 5),\n    onNext(207, 6),\n    onNext(208, 7),\n    onNext(209, 8)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.interval relative time negative', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.interval(-1, scheduler);\n  }, {disposed: 210 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 0),\n    onNext(202, 1),\n    onNext(203, 2),\n    onNext(204, 3),\n    onNext(205, 4),\n    onNext(206, 5),\n    onNext(207, 6),\n    onNext(208, 7),\n    onNext(209, 8)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.interval relative time disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.interval(1000, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable.interval relative time observer throws', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = Observable.interval(1, scheduler);\n\n  xs.subscribe(function () { throw new Error(); });\n\n  t.throws(function () { return scheduler.start(); });\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/isempty.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  isEmpty: require('../observable/isempty')\n});\n\ntest('Observable#isEmpty empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.isEmpty();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, true),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#isEmpty return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.isEmpty();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, false),\n    onCompleted(210)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#isEmpty throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.isEmpty();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#isEmpty never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.isEmpty();\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/isequal.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar isEqual = require('../internal/isequal');\n\ntest('isEqual bool equal', function (t) {\n  t.ok(isEqual(true, true));\n  t.end();\n});\n\ntest('isEqual bool inequal', function (t) {\n  t.ok(!isEqual(true, false));\n  t.end();\n});\n\ntest('isEqual number equal', function (t) {\n  t.ok(isEqual(42, 42));\n  t.end();\n});\n\ntest('isEqual number inequal', function (t) {\n  t.ok(!isEqual(42, 0));\n  t.end();\n});\n\ntest('isEqual number +0 equal to -0', function (t) {\n  t.ok(isEqual(+0, -0));\n  t.end();\n});\n\ntest('isEqual number NaN is equal to NaN', function (t) {\n  t.ok(isEqual(NaN, NaN));\n  t.end();\n});\n\ntest('isEqual number Infinity is equal to Infinity', function (t) {\n  t.ok(isEqual(Infinity, Infinity));\n  t.end();\n});\n\ntest('isEqual string equal', function (t) {\n  t.ok(isEqual('foo', 'foo'));\n  t.end();\n});\n\ntest('isEqual string inequal', function (t) {\n  t.ok(!isEqual('foo', 'bar'));\n  t.end();\n});\n\ntest('isEqual array equal', function (t) {\n  t.ok(isEqual([1,2,3], [1,2,3]));\n  t.end();\n});\n\ntest('isEqual array inequal', function (t) {\n  t.ok(!isEqual([1,2,3], ['foo', 'bar']));\n  t.end();\n});\n\ntest('isEqual object equal', function (t) {\n  t.ok(isEqual({foo: 'bar'}, {foo: 'bar'}));\n  t.end();\n});\n\ntest('isEqual object inequal', function (t) {\n  t.ok(!isEqual({foo: 'bar'}, {foo: 'baz'}));\n  t.end();\n});\n\ntest('isEqual complex object equal', function (t) {\n  t.ok(isEqual({foo: 'bar', baz: [1,2,3]}, {foo: 'bar', baz: [1,2,3]}));\n  t.end();\n});\n\ntest('isEqual complex object inequal', function (t) {\n  t.ok(!isEqual({foo: 'bar', baz: [1,2,3]}, {foo: 'bar', baz: [4,5,6]}));\n  t.end();\n});\n\ntest('isEqual new object equal', function (t) {\n  function Foo () { }\n  t.ok(isEqual(new Foo(), new Foo()));\n  t.end();\n});\n\ntest('isEqual new object inequal', function (t) {\n  function Foo () { }\n  function Bar () { }\n  t.ok(!isEqual(new Foo(), new Bar()));\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/join.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  timer: require('../observable/timer')\n});\n\nObservable.addToPrototype({\n  join: require('../observable/join')\n});\n\nfunction TimeInterval(value, interval) {\n  this.value = value;\n  this.interval = interval;\n}\n\ntest('join normal I', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 300)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.join(ys, function (x) {\n      return Observable.timer(x.interval, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, scheduler);\n    }, function (x, y) {\n      return x.value + y.value;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man'),\n    onNext(720, '8tin'),\n    onNext(720, '8man'),\n    onNext(722, '6rat'),\n    onNext(722, '7rat'),\n    onNext(722, '8rat'),\n    onNext(732, '7wig'),\n    onNext(732, '8wig'),\n    onNext(830, '9rat'),\n    onCompleted(900)\n  ]);\n\n  t.end();\n});\n\ntest('join normal II', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 200)),\n    onNext(720, new TimeInterval(8, 100)),\n    onCompleted(721)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(990)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.join(ys, function (x) {\n      return Observable.timer(x.interval, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, scheduler);\n    }, function (x, y) {\n      return x.value + y.value;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man'),\n    onNext(720, '8tin'),\n    onNext(720, '8man'),\n    onNext(722, '6rat'),\n    onNext(722, '7rat'),\n    onNext(722, '8rat'),\n    onNext(732, '7wig'),\n    onNext(732, '8wig'),\n    onCompleted(910)\n  ]);\n\n  t.end();\n});\n\ntest('join normal III', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 300)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900));\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.join(ys, function (x) {\n      return Observable.timer(x.interval, null, scheduler).filter(function () {\n        return false;\n      });\n    }, function (y) {\n      return Observable.timer(y.interval, null, scheduler).filter(function () {\n        return false;\n      });\n    }, function (x, y) {\n      return x.value + y.value;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man'),\n    onNext(720, '8tin'),\n    onNext(720, '8man'),\n    onNext(722, '6rat'),\n    onNext(722, '7rat'),\n    onNext(722, '8rat'),\n    onNext(732, '7wig'),\n    onNext(732, '8wig'),\n    onNext(830, '9rat'),\n    onCompleted(900)\n  ]);\n\n  t.end();\n});\n\ntest('join normal IV', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 200)),\n    onNext(720, new TimeInterval(8, 100)),\n    onCompleted(990)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(980)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.join(ys, function (x) {\n      return Observable.timer(x.interval, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, scheduler);\n    }, function (x, y) {\n      return x.value + y.value;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man'),\n    onNext(720, '8tin'),\n    onNext(720, '8man'),\n    onNext(722, '6rat'),\n    onNext(722, '7rat'),\n    onNext(722, '8rat'),\n    onNext(732, '7wig'),\n    onNext(732, '8wig'),\n    onCompleted(980)\n  ]);\n\n  t.end();\n});\n\ntest('join normal V', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 200)),\n    onNext(720, new TimeInterval(8, 100)),\n    onCompleted(990));\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(900)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.join(ys, function (x) {\n      return Observable.timer(x.interval, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, scheduler);\n    }, function (x, y) {\n      return x.value + y.value;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man'),\n    onNext(720, '8tin'),\n    onNext(720, '8man'),\n    onNext(722, '6rat'),\n    onNext(722, '7rat'),\n    onNext(722, '8rat'),\n    onNext(732, '7wig'),\n    onNext(732, '8wig'),\n    onCompleted(922)\n  ]);\n\n  t.end();\n});\n\ntest('join normal VI', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 30)),\n    onNext(720, new TimeInterval(8, 200)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(850));\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 20)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(900)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.join(ys, function (x) {\n      return Observable.timer(x.interval, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, scheduler);\n    }, function (x, y) {\n      return x.value + y.value;\n    });\n});\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man'),\n    onNext(720, '8tin'),\n    onNext(720, '8man'),\n    onNext(722, '6rat'),\n    onNext(722, '7rat'),\n    onNext(722, '8rat'),\n    onNext(732, '7wig'),\n    onNext(732, '8wig'),\n    onCompleted(900)\n  ]);\n\n  t.end();\n});\n\ntest('join normal VII', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 300)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.join(ys, function (x) {\n      return Observable.timer(x.interval, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, scheduler);\n    }, function (x, y) {\n      return x.value + y.value;\n    });\n  }, { disposed: 713 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man')\n  ]);\n\n  t.end();\n});\n\ntest('join error I', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onError(310, error)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.join(ys, function (x) {\n      return Observable.timer(x.interval, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, scheduler);\n    }, function (x, y) {\n      return x.value + y.value;\n    });\n  }, { disposed: 713 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onError(310, error)\n  ]);\n\n  t.end();\n});\n\ntest('join error II', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 300)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900));\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onError(722, error));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.join(ys, function (x) {\n      return Observable.timer(x.interval, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, scheduler);\n    }, function (x, y) {\n      return x.value + y.value;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man'),\n    onNext(720, '8tin'),\n    onNext(720, '8man'),\n    onError(722, error)\n  ]);\n\n  t.end();\n});\n\ntest('join error III', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 300)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.join(ys, function (x) {\n      return Observable.timer(x.interval, null, scheduler)\n        .flatMap(x.value === 6 ? Observable['throw'](error) : Observable.empty());\n    }, function (y) {\n      return Observable.timer(y.interval, scheduler);\n    }, function (x, y) {\n      return x.value + y.value;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man'),\n    onNext(720, '8tin'),\n    onNext(720, '8man'),\n    onNext(722, '6rat'),\n    onNext(722, '7rat'),\n    onNext(722, '8rat'),\n    onError(725, error)\n  ]);\n\n  t.end();\n});\n\ntest('join error IV', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 300)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 19)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.join(ys, function (x) {\n      return Observable.timer(x.interval, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, null, scheduler)\n        .flatMap(y.value === 'tin' ? Observable['throw'](error) : Observable.empty());\n    }, function (x, y) {\n      return x.value + y.value;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, '0hat'),\n    onNext(217, '0bat'),\n    onNext(219, '1hat'),\n    onNext(300, '3wag'),\n    onNext(300, '3pig'),\n    onNext(305, '3cup'),\n    onNext(310, '4wag'),\n    onNext(310, '4pig'),\n    onNext(310, '4cup'),\n    onNext(702, '6tin'),\n    onNext(710, '7tin'),\n    onNext(712, '6man'),\n    onNext(712, '7man'),\n    onNext(720, '8tin'),\n    onNext(720, '8man'),\n    onError(721, error)\n  ]);\n\n  t.end();\n});\n\ntest('join error V', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 300)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.join(ys, function (x) {\n      if (x.value >= 0) { throw error; }\n      return Observable.empty();\n    }, function (y) {\n      return Observable.timer(y.interval, scheduler);\n    }, function (x, y) {\n      return x.value + y.value;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('join error VI', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 300)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.join(ys, function (x) {\n      return Observable.timer(x.interval, scheduler);\n    }, function (y) {\n      if (y.value.length >= 0) { throw error; }\n      return Observable.empty();\n    }, function (x, y) {\n      return x.value + y.value;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(215, error)\n  ]);\n\n  t.end();\n});\n\ntest('join error VII', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 300)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.join(ys, function (x) {\n      return Observable.timer(x.interval, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, scheduler);\n    }, function (x, y) {\n      if (x.value >= 0) { throw error; }\n      return x.value + y.value;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(215, error)\n  ]);\n\n  t.end();\n});\n\ntest('join error VIII', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, new TimeInterval(0, 10)),\n    onNext(219, new TimeInterval(1, 5)),\n    onNext(240, new TimeInterval(2, 10)),\n    onNext(300, new TimeInterval(3, 100)),\n    onNext(310, new TimeInterval(4, 80)),\n    onNext(500, new TimeInterval(5, 90)),\n    onNext(700, new TimeInterval(6, 25)),\n    onNext(710, new TimeInterval(7, 300)),\n    onNext(720, new TimeInterval(8, 100)),\n    onNext(830, new TimeInterval(9, 10)),\n    onCompleted(900)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(215, new TimeInterval('hat', 20)),\n    onNext(217, new TimeInterval('bat', 1)),\n    onNext(290, new TimeInterval('wag', 200)),\n    onNext(300, new TimeInterval('pig', 10)),\n    onNext(305, new TimeInterval('cup', 50)),\n    onNext(600, new TimeInterval('yak', 90)),\n    onNext(702, new TimeInterval('tin', 20)),\n    onNext(712, new TimeInterval('man', 10)),\n    onNext(722, new TimeInterval('rat', 200)),\n    onNext(732, new TimeInterval('wig', 5)),\n    onCompleted(800)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.join(ys, function (x) {\n      return Observable.timer(x.interval, scheduler);\n    }, function (y) {\n      return Observable.timer(y.interval, scheduler);\n    }, function (x, y) {\n      if (x.value >= 0) { throw error; }\n      return x.value + y.value;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(215, error)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/just.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar SerialDisposable = require('../serialdisposable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n    onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  just: require('../observable/just')\n});\n\ntest('Observable.just basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var res = scheduler.startScheduler(function () {\n    return Observable.just(42, scheduler);\n  });\n\n  reactiveAssert(t, res.messages, [\n    onNext(201, 42),\n    onCompleted(201)\n  ]);\n   t.end();\n});\n\ntest('Observable.just disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var res = scheduler.startScheduler(function () {\n    return Observable.just(42, scheduler);\n  }, { disposed: 200 });\n\n  reactiveAssert(t, res.messages, []);\n  t.end();\n});\n\ntest('Observable.just disposed after next', function (t) {\n  var scheduler = new TestScheduler();\n\n  var d = new SerialDisposable();\n\n  var xs = Observable.just(42, scheduler);\n\n  var res = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, 100, function () {\n    d.setDisposable(xs.subscribe(\n      function (x) {\n        d.dispose();\n        res.onNext(x);\n      },\n      function (e) { res.onError(e); },\n      function () { res.onCompleted(); }\n    ));\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, res.messages, [\n    onNext(101, 42)\n  ]);\n  t.end();\n});\n\nfunction noop () { }\n\ntest('Observable.just Observer throws', function (t) {\n  var scheduler1 = new TestScheduler();\n\n  var xs = Observable.just(1, scheduler1);\n\n  xs.subscribe(function () { throw new Error(); });\n\n  t.throws(function () { scheduler1.start(); });\n\n  var scheduler2 = new TestScheduler();\n\n  var ys = Observable.just(1, scheduler2);\n\n  ys.subscribe(noop, noop, function () { throw new Error(); });\n\n  t.throws(function () { scheduler2.start(); });\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/last.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar EmptyError = require('../internal/errors').EmptyError;\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  last: require('../observable/last')\n});\n\ntest('Observable#last empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.last();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(250, function (n) { return n.error instanceof EmptyError; })\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#last default value', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.last({defaultValue: 42});\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 42),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#last one', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.last();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 2),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#last many', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.last();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 3),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#last error', function (t) {\n  var ex = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, ex)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.last();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#last predicate', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.last(function (x) {\n      return x % 2 === 1;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 5),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#last obj predicate', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.last({\n      predicate: function (x) {\n        return x % 2 === 1;\n      }\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 5),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#last predicate thisArg', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.last(function (x) {\n      t.equal(this, 42);\n      return x % 2 === 1;\n    }, 42);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 5),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#last obj predicate', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.last({\n      predicate: function (x) {\n        t.equal(this, 42);\n        return x % 2 === 1;\n      },\n      thisArg: 42\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 5),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#last predicate None', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.last(function (x) {\n      return x > 10;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(250, function (n) { return n.error instanceof EmptyError; })\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#last obj predicate none default', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.last({\n      predicate: function (x) {\n        return x > 10;\n      },\n      defaultValue: 42\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 42),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#last predicate throw', function (t) {\n  var ex = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, ex)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.last(function (x) {\n      return x % 2 === 1;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#last predicate throws', function (t) {\n  var ex = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.last(function (x) {\n      if (x < 4) {\n        return x % 2 === 1;\n      }\n      throw ex;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(230, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/lastindexof.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  lastIndexOf: require('../observable/lastindexof')\n});\n\ntest('Observable#lastIndexOf empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.lastIndexOf(42);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, -1),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#lastIndexOf return positive', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.lastIndexOf(2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 0),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#lastIndexOf return negative', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.lastIndexOf(-2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, -1),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#lastIndexOf some positive', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.lastIndexOf(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 1),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#lastIndexOf some negative', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.lastIndexOf(-3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, -1),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#lastIndexOf throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.lastIndexOf(42);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#lastIndexOf never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.lastIndexOf(42);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#lastIndexOf fromIndex less than zero', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.lastIndexOf(42, -1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, -1),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#lastIndexOf fromIndex Infinity', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.lastIndexOf(2, Infinity);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 0),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#lastIndexOf fromIndex zero', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.lastIndexOf(2, 0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 0),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#lastIndexOf fromIndex greater than zero misses', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.lastIndexOf(2, 1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, -1),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#lastIndexOf fromIndex greater than zero no end', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.lastIndexOf(2, 1);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#lastIndexOf fromIndex greater than zero hits', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.lastIndexOf(3, 1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 1),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#lastIndexOf -0 equals 0', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, -0),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.lastIndexOf(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 0),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#lastIndexOf +0 equals 0', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, +0),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.lastIndexOf(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 0),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#lastIndexOf hits the last without end', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 2),\n    onNext(240, 3),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.lastIndexOf(2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#lastIndexOf hits the last with end', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 2),\n    onNext(240, 3),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.lastIndexOf(2, 2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/map.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar SerialDisposable = require('../serialdisposable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe,\n  disposed = ReactiveTest.disposed;\n\nObservable.addToPrototype({\n  map: require('../observable/map')\n});\n\n// Function shortcuts\nfunction noop () { }\nfunction identity (x) { return x; }\nfunction throwError () { throw new Error(); }\n\ntest('Observable#map throws', function (t) {\n  t.throws(function () {\n    Observable.just(1)\n      .map(identity)\n      .subscribe(throwError);\n  });\n\n  t.throws(function () {\n    Observable.throwError(new Error())\n      .map(function (x) { return x; })\n      .subscribe(noop, throwError);\n  });\n\n  t.throws(function () {\n    Observable.empty()\n      .map(function (x) { return x; })\n      .subscribe(noop, noop, throwError);\n  });\n\n  t.throws(function () {\n    Observable.create(throwError)\n      .map(identity)\n      .subscribe();\n  });\n\n  t.end();\n});\n\ntest('Observable#map with index dispose inside selector', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(100, 4),\n    onNext(200, 3),\n    onNext(500, 2),\n    onNext(600, 1)\n  );\n\n  var invoked = 0;\n\n  var results = scheduler.createObserver();\n\n  var d = new SerialDisposable();\n  d.setDisposable(\n    xs.map(function(x, index) {\n      invoked++;\n      scheduler.clock > 400 && d.dispose();\n      return x + index * 10;\n    })\n    .subscribe(results)\n  );\n\n  scheduler.scheduleAbsolute(null, disposed, function () { d.dispose(); });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(100, 4),\n    onNext(200, 13)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(0, 500)\n  ]);\n\n  t.equal(3, invoked);\n\n  t.end();\n});\n\ntest('Observable#map with index Completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked = 0;\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 5),\n    onNext(210, 4),\n    onNext(240, 3),\n    onNext(290, 2),\n    onNext(350, 1),\n    onCompleted(400),\n    onNext(410, -1),\n    onCompleted(420),\n    onError(430, new Error())\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.map(function (x, index) {\n      invoked++;\n      return (x + 1) + (index * 10);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 5),\n    onNext(240, 14),\n    onNext(290, 23),\n    onNext(350, 32),\n    onCompleted(400)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.equal(4, invoked);\n\n  t.end();\n});\n\ntest('Observable#map with index not completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked = 0;\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 5),\n    onNext(210, 4),\n    onNext(240, 3),\n    onNext(290, 2),\n    onNext(350, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.map(function (x, index) {\n      invoked++;\n      return (x + 1) + (index * 10);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 5),\n    onNext(240, 14),\n    onNext(290, 23),\n    onNext(350, 32)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.equal(4, invoked);\n\n  t.end();\n});\n\ntest('Observable#map with index error', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var invoked = 0;\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 5),\n    onNext(210, 4),\n    onNext(240, 3),\n    onNext(290, 2),\n    onNext(350, 1),\n    onError(400, error),\n    onNext(410, -1),\n    onCompleted(420),\n    onError(430, new Error())\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.map(function (x, index) {\n      invoked++;\n      return (x + 1) + (index * 10);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 5),\n    onNext(240, 14),\n    onNext(290, 23),\n    onNext(350, 32),\n    onError(400, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.equal(4, invoked);\n\n  t.end();\n});\n\ntest('Observable#map selector throws', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked = 0;\n\n  var error = new Error();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 5),\n    onNext(210, 4),\n    onNext(240, 3),\n    onNext(290, 2),\n    onNext(350, 1),\n    onCompleted(400),\n    onNext(410, -1),\n    onCompleted(420),\n    onError(430, new Error())\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.map(function (x, index) {\n      invoked++;\n      if (invoked === 3) { throw error; }\n      return (x + 1) + (index * 10);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 5),\n    onNext(240, 14),\n    onError(290, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 290)\n  ]);\n\n  t.equal(3, invoked);\n\n  t.end();\n});\n\ntest('Observable#map value', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.map(-1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, -1),\n    onNext(220, -1),\n    onNext(230, -1),\n    onNext(240, -1),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#map thisArg', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked = 0;\n  var foo = 42;\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 5),\n    onNext(210, 4),\n    onNext(240, 3),\n    onNext(290, 2),\n    onNext(350, 1),\n    onCompleted(400),\n    onNext(410, -1),\n    onCompleted(420),\n    onError(430, new Error())\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.map(function (x, index) {\n      invoked++;\n      t.equal(this, foo);\n      return (x + 1) + (index * 10);\n    }, 42);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 5),\n    onNext(240, 14),\n    onNext(290, 23),\n    onNext(350, 32),\n    onCompleted(400)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.equal(4, invoked);\n\n  t.end();\n});\n\ntest('Observable#map and map Optimization', function (t) {\n  var scheduler = new TestScheduler();\n\n  var invoked1 = 0;\n  var invoked2 = 0;\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(180, 2),\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onCompleted(600),\n    onNext(610, 12),\n    onError(620, new Error()),\n    onCompleted(630)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs\n    .map(function(x) { invoked1++; return x * 2; })\n    .map(function(x) { invoked2++; return x / 2; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(380, 6),\n    onNext(390, 7),\n    onNext(450, 8),\n    onNext(470, 9),\n    onNext(560, 10),\n    onNext(580, 11),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.equal(9, invoked1);\n  t.equal(9, invoked2);\n\n  t.end();\n});\n\ntest('Observable#map and map thisArg', function(t) {\n  var scheduler = new TestScheduler();\n\n  function Filterer() {\n    this.selector1 = function(item) { return item + 2; };\n    this.selector2 = function(item) { return item * 3; };\n  }\n\n  var filterer = new Filterer();\n\n  var xs = scheduler.createColdObservable(\n    onNext(10, 1),\n    onNext(20, 2),\n    onNext(30, 3),\n    onNext(40, 4),\n    onCompleted(100)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return xs\n      .map(function(x){ return this.selector1(x);}, filterer)\n      .map(function(x){ return this.selector2(x);}, filterer)\n      .map(function(x){ return this.selector1(x);}, filterer);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 11),\n    onNext(220, 14),\n    onNext(230, 17),\n    onNext(240, 20),\n    onCompleted(300)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/materialize.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar Notification = require('../notification');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  never: require('../observable/never')\n});\n\nObservable.addToPrototype({\n  dematerialize: require('../observable/dematerialize'),\n  materialize: require('../observable/materialize')\n});\n\ntest('Observable#materialize never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.materialize();\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#materialize empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.materialize();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, Notification.createOnCompleted()),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#materialize return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.materialize();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, Notification.createOnNext(2)),\n    onNext(250, Notification.createOnCompleted()),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#materialize throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(250, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.materialize();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, Notification.createOnError(error)),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#materialize dematerialize never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.materialize().dematerialize();\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#materialize dematerialize empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.materialize().dematerialize();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#materialize dematerialize return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.materialize().dematerialize();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#materialize dematerialize throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(250, error));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.materialize().dematerialize();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(250, error)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/max.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar EmptyError = require('../internal/errors').EmptyError;\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  max: require('../observable/max')\n});\n\nfunction reverseComparer(a, b) {\n  return a > b ? -1 : a < b ? 1 : 0;\n}\n\ntest('Observable#max number empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.max();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(250, function (n) { return n.error instanceof EmptyError; })\n  ]);\n\n  t.end();\n});\n\ntest('Observable#max number Return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.max();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#max number Some', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 3),\n    onNext(220, 4),\n    onNext(230, 2),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.max();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 4),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#max number throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.max();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#max number Never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n      return xs.max();\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#max comparer empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.max(reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(250, function (n) { return n.error instanceof EmptyError; })\n  ]);\n\n  t.end();\n});\n\ntest('Observable#max comparer return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 'z'),\n    onNext(210, 'a'),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.max(reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 'a'),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#max comparer some', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 'z'),\n    onNext(210, 'b'),\n    onNext(220, 'c'),\n    onNext(230, 'a'),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.max(reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 'a'),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#max comparer throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 'z'),\n    onError(210, error));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.max(reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#max comparer never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 'z')\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.max(reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#max comparer throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 'z'),\n    onNext(210, 'b'),\n    onNext(220, 'c'),\n    onNext(230, 'a'),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.max(function () { throw error; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/maxby.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  maxBy: require('../observable/maxby')\n});\n\nfunction reverseComparer(a, b) {\n  return a > b ? -1 : a < b ? 1 : 0;\n}\n\ntest('Observable#maxBy empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.maxBy(function (x) { return x.key; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, []),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#maxBy return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onNext(210, { key: 2, value: 'a' }),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.maxBy(function (x) { return x.key; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, [{ key: 2, value: 'a' }]),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#maxBy some', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onNext(210, { key: 3, value: 'b' }),\n    onNext(220, { key: 4, value: 'c' }),\n    onNext(230, { key: 2, value: 'a' }),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.maxBy(function (x) { return x.key; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, [{ key: 4, value: 'c' }]),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#maxBy multiple', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onNext(210, { key: 3, value: 'b' }),\n    onNext(215, { key: 2, value: 'd' }),\n    onNext(220, { key: 3, value: 'c' }),\n    onNext(225, { key: 2, value: 'y' }),\n    onNext(230, { key: 4, value: 'a' }),\n    onNext(235, { key: 4, value: 'r' }),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.maxBy(function (x) { return x.key; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, [{ key: 4, value: 'a' }, { key: 4, value: 'r' }]),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#maxBy throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.maxBy(function (x) { return x.key; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#maxBy never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' })\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.maxBy(function (x) { return x.key; });\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#maxBy comparer empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.maxBy(function (x) { return x.key; }, reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, []),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#maxBy comparer return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onNext(210, { key: 2, value: 'a' }),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.maxBy(function (x) { return x.key; }, reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, [{ key: 2, value: 'a' }]),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#maxBy comparer some', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onNext(210, { key: 3, value: 'b' }),\n    onNext(220, { key: 4, value: 'c' }),\n    onNext(230, { key: 2, value: 'a' }),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.maxBy(function (x) { return x.key; }, reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, [{ key: 2, value: 'a' }]),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#maxBy comparer throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.maxBy(function (x) { return x.key; }, reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#maxBy comparer never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' })\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.maxBy(function (x) { return x.key; }, reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#maxBy selector throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onNext(210, { key: 3, value: 'b' }),\n    onNext(220, { key: 2, value: 'c' }),\n    onNext(230, { key: 4, value: 'a' }),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.maxBy(function () { throw error; }, reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#maxBy comparer throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onNext(210, { key: 3, value: 'b' }),\n    onNext(220, { key: 2, value: 'c' }),\n    onNext(230, { key: 4, value: 'a' }),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.maxBy(function (x) { return x.key; }, function () { throw error; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/merge.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  empty: require('../observable/empty'),\n  merge: require('../observable/merge'),\n  never: require('../observable/never')\n});\n\nObservable.addToPrototype({\n  merge: require('../observable/merge'),\n  tap: require('../observable/tap')\n});\n\ntest('merge never 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var n1 = Observable.never();\n  var n2 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.merge(scheduler, n1, n2);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('merge never 3', function (t) {\n  var scheduler = new TestScheduler();\n\n  var n1 = Observable.never();\n  var n2 = Observable.never();\n  var n3 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.merge(scheduler, n1, n2, n3);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('merge empty 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = Observable.empty();\n  var e2 = Observable.empty();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.merge(scheduler, e1, e2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(203)\n  ]);\n\n  t.end();\n});\n\ntest('merge empty 3', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = Observable.empty();\n  var e2 = Observable.empty();\n  var e3 = Observable.empty();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.merge(scheduler, e1, e2, e3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(204)\n  ]);\n\n  t.end();\n});\n\ntest('merge empty delayed 2 right last', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(240)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.merge(scheduler, e1, e2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('merge empty delayed 2 left last', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(240)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.merge(scheduler, e1, e2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('merge empty delayed 3 middle last', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(245)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var e3 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(240)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.merge(scheduler, e1, e2, e3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('merge empty never ', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(245)\n  );\n\n  var n1 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n      return Observable.merge(scheduler, e1, n1);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('merge never empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(245)\n  );\n\n  var n1 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.merge(scheduler, n1, e1);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('merge return never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var r1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(245)\n  );\n  var n1 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.merge(scheduler, r1, n1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2)\n  ]);\n\n  t.end();\n});\n\ntest('merge never return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var r1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(245)\n  );\n\n  var n1 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n      return Observable.merge(scheduler, n1, r1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2)\n  ]);\n\n  t.end();\n});\n\ntest('merge Error never ', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(245, error)\n  );\n  var n1 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.merge(scheduler, e1, n1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onError(245, error)\n  ]);\n\n  t.end();\n});\n\ntest('merge never Error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(245, error)\n  );\n\n  var n1 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.merge(scheduler, n1, e1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onError(245, error)\n  ]);\n\n  t.end();\n});\n\ntest('merge empty return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(245)\n  );\n\n  var r1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n      return Observable.merge(scheduler, e1, r1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('merge return empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(245)\n  );\n\n  var r1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n      return Observable.merge(scheduler, r1, e1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('merge lots 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 4),\n    onNext(230, 6),\n    onNext(240, 8),\n    onCompleted(245)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 3),\n    onNext(225, 5),\n    onNext(235, 7),\n    onNext(245, 9),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.merge(scheduler, o1, o2);\n  }).messages;\n\n  t.equal(9, results.length);\n  for (var i = 0; i < 8; i++) {\n    t.ok(results[i].value.kind === 'N' &&\n      results[i].time === 210 + i * 5 &&\n      results[i].value.value === i + 2);\n  }\n  t.ok(results[8].value.kind === 'C' && results[8].time === 250);\n\n  t.end();\n});\n\ntest('merge lots 3', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(225, 5),\n    onNext(240, 8),\n    onCompleted(245)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 3),\n    onNext(230, 6),\n    onNext(245, 9),\n    onCompleted(250)\n  );\n\n  var o3 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 4),\n    onNext(235, 7),\n    onCompleted(240)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.merge(scheduler, o1, o2, o3);\n  }).messages;\n\n  t.equal(9, results.length);\n  for (var i = 0; i < 8; i++) {\n    t.ok(results[i].value.kind === 'N' &&\n      results[i].time === 210 + i * 5 &&\n      results[i].value.value === i + 2);\n  }\n  t.ok(results[8].value.kind === 'C' && results[8].time === 250);\n\n  t.end();\n});\n\ntest('merge Error left', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(245, error)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 3),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.merge(scheduler, o1, o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(215, 3),\n    onError(245, error)\n  ]);\n\n  t.end();\n});\n\ntest('merge Error causes disposal', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var sourceNotDisposed = false;\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 1),\n    onCompleted(250))\n    .tap(function () {\n      return sourceNotDisposed = true;\n  });\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.merge(scheduler, o1, o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.ok(!sourceNotDisposed);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/mergeall.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n/* globals Promise */\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar isEqual = require('../internal/isequal');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  fromArray: require('../observable/fromarray')\n});\n\nObservable.addToPrototype({\n  mergeAll: require('../observable/mergeall')\n});\n\n// Polyfilling\nrequire('lie/polyfill');\n\ntest('Observable#mergeAll Promise', function (t) {\n  var sources = Observable.fromArray([\n    Promise.resolve(0),\n    Promise.resolve(1),\n    Promise.resolve(2),\n    Promise.resolve(3),\n  ]);\n\n  var res = [];\n  sources.mergeAll().subscribe(\n    function (x) {\n      res.push(x);\n    },\n    function () {\n      t.ok(false);\n    },\n    function () {\n      t.ok(isEqual([0,1,2,3], res));\n      t.end();\n    });\n});\n\ntest('Observable#mergeAll Promise error', function (t) {\n  var sources = Observable.fromArray([\n    Promise.resolve(0),\n    Promise.reject(1),\n    Promise.resolve(2),\n    Promise.resolve(3),\n  ]);\n\n  var res = [];\n  sources.mergeAll().subscribe(\n    function (x) {\n      res.push(x);\n    },\n    function (err) {\n      t.ok(res.length === 1);\n      t.equal(1, err);\n      t.end();\n    });\n});\n\ntest('Observable#mergeAll Observable of Observable data', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(300,\n      scheduler.createColdObservable(\n        onNext(10, 101),\n        onNext(20, 102),\n        onNext(110, 103),\n        onNext(120, 104),\n        onNext(210, 105),\n        onNext(220, 106),\n        onCompleted(230))),\n    onNext(400,\n      scheduler.createColdObservable(\n        onNext(10, 201),\n        onNext(20, 202),\n        onNext(30, 203),\n        onNext(40, 204),\n        onCompleted(50))),\n    onNext(500,\n      scheduler.createColdObservable(\n        onNext(10, 301),\n        onNext(20, 302),\n        onNext(30, 303),\n        onNext(40, 304),\n        onNext(120, 305),\n        onCompleted(150))),\n    onCompleted(600));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 101),\n    onNext(320, 102),\n    onNext(410, 103),\n    onNext(410, 201),\n    onNext(420, 104),\n    onNext(420, 202),\n    onNext(430, 203),\n    onNext(440, 204),\n    onNext(510, 105),\n    onNext(510, 301),\n    onNext(520, 106),\n    onNext(520, 302),\n    onNext(530, 303),\n    onNext(540, 304),\n    onNext(620, 305),\n    onCompleted(650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#mergeAll Observable of Observable data non-overlapped', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(300,\n      scheduler.createColdObservable(\n        onNext(10, 101),\n        onNext(20, 102),\n        onCompleted(230))),\n    onNext(400,\n      scheduler.createColdObservable(\n        onNext(10, 201),\n        onNext(20, 202),\n        onNext(30, 203),\n        onNext(40, 204),\n        onCompleted(50))),\n    onNext(500,\n      scheduler.createColdObservable(\n        onNext(10, 301),\n        onNext(20, 302),\n        onNext(30, 303),\n        onNext(40, 304),\n        onCompleted(50))),\n    onCompleted(600));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 101),\n    onNext(320, 102),\n    onNext(410, 201),\n    onNext(420, 202),\n    onNext(430, 203),\n    onNext(440, 204),\n    onNext(510, 301),\n    onNext(520, 302),\n    onNext(530, 303),\n    onNext(540, 304),\n    onCompleted(600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#mergeAll Observable of Observable inner throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(300,\n      scheduler.createColdObservable(\n        onNext(10, 101),\n        onNext(20, 102),\n        onCompleted(230))),\n    onNext(400,\n      scheduler.createColdObservable(\n        onNext(10, 201),\n        onNext(20, 202),\n        onNext(30, 203),\n        onNext(40, 204),\n        onError(50, error))),\n    onNext(500,\n      scheduler.createColdObservable(\n        onNext(10, 301),\n        onNext(20, 302),\n        onNext(30, 303),\n        onNext(40, 304),\n        onCompleted(50))),\n    onCompleted(600));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 101),\n    onNext(320, 102),\n    onNext(410, 201),\n    onNext(420, 202),\n    onNext(430, 203),\n    onNext(440, 204),\n    onError(450, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#mergeAll Observable of Observable outer throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(300,\n      scheduler.createColdObservable(\n        onNext(10, 101),\n        onNext(20, 102),\n        onCompleted(230))),\n    onNext(400,\n      scheduler.createColdObservable(\n        onNext(10, 201),\n        onNext(20, 202),\n        onNext(30, 203),\n        onNext(40, 204),\n        onCompleted(50))),\n    onError(500, error));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 101),\n    onNext(320, 102),\n    onNext(410, 201),\n    onNext(420, 202),\n    onNext(430, 203),\n    onNext(440, 204),\n    onError(500, error)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/mergeconcat.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  mergeConcat: require('../observable/mergeconcat')\n});\n\ntest('Observable#mergeConcat basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, scheduler.createColdObservable(onNext(50, 1), onNext(100, 2), onNext(120, 3), onCompleted(140))),\n    onNext(260, scheduler.createColdObservable(onNext(20, 4), onNext(70, 5), onCompleted(200))),\n    onNext(270, scheduler.createColdObservable(onNext(10, 6), onNext(90, 7), onNext(110, 8), onCompleted(130))),\n    onNext(320, scheduler.createColdObservable(onNext(210, 9), onNext(240, 10), onCompleted(300))),\n    onCompleted(400)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.mergeConcat(2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(260, 1),\n    onNext(280, 4),\n    onNext(310, 2),\n    onNext(330, 3),\n    onNext(330, 5),\n    onNext(360, 6),\n    onNext(440, 7),\n    onNext(460, 8),\n    onNext(670, 9),\n    onNext(700, 10),\n    onCompleted(760)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 760)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#mergeConcat basic Long', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, scheduler.createColdObservable(onNext(50, 1), onNext(100, 2), onNext(120, 3), onCompleted(140))),\n    onNext(260, scheduler.createColdObservable(onNext(20, 4), onNext(70, 5), onCompleted(300))),\n    onNext(270, scheduler.createColdObservable(onNext(10, 6), onNext(90, 7), onNext(110, 8), onCompleted(130))),\n    onNext(320, scheduler.createColdObservable(onNext(210, 9), onNext(240, 10), onCompleted(300))),\n    onCompleted(400)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.mergeConcat(2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(260, 1),\n    onNext(280, 4),\n    onNext(310, 2),\n    onNext(330, 3),\n    onNext(330, 5),\n    onNext(360, 6),\n    onNext(440, 7),\n    onNext(460, 8),\n    onNext(690, 9),\n    onNext(720, 10),\n    onCompleted(780)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 780)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#mergeConcat basic Wide', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, scheduler.createColdObservable(onNext(50, 1), onNext(100, 2), onNext(120, 3), onCompleted(140))),\n    onNext(260, scheduler.createColdObservable(onNext(20, 4), onNext(70, 5), onCompleted(300))),\n    onNext(270, scheduler.createColdObservable(onNext(10, 6), onNext(90, 7), onNext(110, 8), onCompleted(130))),\n    onNext(420, scheduler.createColdObservable(onNext(210, 9), onNext(240, 10), onCompleted(300))),\n    onCompleted(450)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.mergeConcat(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(260, 1),\n    onNext(280, 4),\n    onNext(280, 6),\n    onNext(310, 2),\n    onNext(330, 3),\n    onNext(330, 5),\n    onNext(360, 7),\n    onNext(380, 8),\n    onNext(630, 9),\n    onNext(660, 10),\n    onCompleted(720)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 720)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#mergeConcat basic late', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, scheduler.createColdObservable(onNext(50, 1), onNext(100, 2), onNext(120, 3), onCompleted(140))),\n    onNext(260, scheduler.createColdObservable(onNext(20, 4), onNext(70, 5), onCompleted(300))),\n    onNext(270, scheduler.createColdObservable(onNext(10, 6), onNext(90, 7), onNext(110, 8), onCompleted(130))),\n    onNext(420, scheduler.createColdObservable(onNext(210, 9), onNext(240, 10), onCompleted(300))),\n    onCompleted(750)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.mergeConcat(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(260, 1),\n    onNext(280, 4),\n    onNext(280, 6),\n    onNext(310, 2),\n    onNext(330, 3),\n    onNext(330, 5),\n    onNext(360, 7),\n    onNext(380, 8),\n    onNext(630, 9),\n    onNext(660, 10),\n    onCompleted(750)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 750)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#mergeConcat disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, scheduler.createColdObservable(onNext(50, 1), onNext(100, 2), onNext(120, 3), onCompleted(140))),\n    onNext(260, scheduler.createColdObservable(onNext(20, 4), onNext(70, 5), onCompleted(200))),\n    onNext(270, scheduler.createColdObservable(onNext(10, 6), onNext(90, 7), onNext(110, 8), onCompleted(130))),\n    onNext(320, scheduler.createColdObservable(onNext(210, 9), onNext(240, 10), onCompleted(300))),\n    onCompleted(400)\n  );\n\n  var results = scheduler.startScheduler(function () {\n      return xs.mergeConcat(2);\n  }, { disposed: 450 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(260, 1),\n    onNext(280, 4),\n    onNext(310, 2),\n    onNext(330, 3),\n    onNext(330, 5),\n    onNext(360, 6),\n    onNext(440, 7)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 450)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#mergeConcat inner error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, scheduler.createColdObservable(onNext(50, 1), onNext(100, 2), onNext(120, 3), onCompleted(140))),\n    onNext(260, scheduler.createColdObservable(onNext(20, 4), onNext(70, 5), onCompleted(200))),\n    onNext(270, scheduler.createColdObservable(onNext(10, 6), onNext(90, 7), onNext(110, 8), onCompleted(130))),\n    onNext(320, scheduler.createColdObservable(onNext(210, 9), onNext(240, 10), onCompleted(300))),\n    onError(400, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.mergeConcat(2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(260, 1),\n    onNext(280, 4),\n    onNext(310, 2),\n    onNext(330, 3),\n    onNext(330, 5),\n    onNext(360, 6),\n    onError(400, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#mergeConcat outer error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, scheduler.createColdObservable(onNext(50, 1), onNext(100, 2), onNext(120, 3), onCompleted(140))),\n    onNext(260, scheduler.createColdObservable(onNext(20, 4), onNext(70, 5), onCompleted(200))),\n    onNext(270, scheduler.createColdObservable(onNext(10, 6), onNext(90, 7), onNext(110, 8), onError(140, error))),\n    onNext(320, scheduler.createColdObservable(onNext(210, 9), onNext(240, 10), onCompleted(300))),\n    onCompleted(400)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.mergeConcat(2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(260, 1),\n    onNext(280, 4),\n    onNext(310, 2),\n    onNext(330, 3),\n    onNext(330, 5),\n    onNext(360, 6),\n    onNext(440, 7),\n    onNext(460, 8),\n    onError(490, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 490)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/mergedelayerror.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nvar CompositeError = require('../internal/errors').CompositeError;\n\nObservable.addToObject({\n  mergeDelayError: require('../observable/mergedelayerror')\n});\n\ntest('Observable.mergeDelayError never never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n  var o2 = scheduler.createHotObservable(\n    onNext(160, 1)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.mergeDelayError(o1, o2);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable.mergeDelayError empty right', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n  var o2 = scheduler.createHotObservable(\n    onNext(160, 1),\n    onCompleted(260)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.mergeDelayError(o1, o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(260)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.mergeDelayError empty left', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(260)\n  );\n  var o2 = scheduler.createHotObservable(\n    onNext(160, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.mergeDelayError(o1, o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(260)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.mergeDelayError empty middle', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(260)\n  );\n  var o2 = scheduler.createHotObservable(\n    onNext(160, 1),\n    onCompleted(250)\n  );\n  var o3 = scheduler.createHotObservable(\n    onNext(160, 1),\n    onCompleted(270)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.mergeDelayError(o1, o2, o3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(270)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.mergeDelayError empty never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(260)\n  );\n  var o2 = scheduler.createHotObservable(\n    onNext(160, 1)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.mergeDelayError(o1, o2);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable.mergeDelayError never empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n  var o2 = scheduler.createHotObservable(\n    onNext(160, 1),\n    onCompleted(260)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.mergeDelayError(o1, o2);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable.mergeDelayError return never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n  var o2 = scheduler.createHotObservable(\n    onNext(160, 1)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.mergeDelayError(o1, o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.mergeDelayError never return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n  var o2 = scheduler.createHotObservable(\n    onNext(160, 1)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.mergeDelayError(o2, o1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.mergeDelayError error never', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(250, error) // error dropped\n  );\n  var o2 = scheduler.createHotObservable(\n    onNext(160, 1)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.mergeDelayError(o1, o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.mergeDelayError never error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(250, error) // error dropped\n  );\n  var o2 = scheduler.createHotObservable(\n    onNext(160, 1)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.mergeDelayError(o2, o1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.mergeDelayError error empty', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(250, error)\n  );\n  var o2 = scheduler.createHotObservable(\n    onNext(160, 1),\n    onCompleted(260)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.mergeDelayError(o1, o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onError(260, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.mergeDelayError empty error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(250, error)\n  );\n  var o2 = scheduler.createHotObservable(\n    onNext(160, 1),\n    onCompleted(260)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.mergeDelayError(o2, o1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onError(260, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.mergeDelayError no errors', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n  var o2 = scheduler.createHotObservable(\n    onNext(160, 1),\n    onNext(215, 2),\n    onCompleted(260)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.mergeDelayError(o1, o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(215, 2),\n    onCompleted(260)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.mergeDelayError error error', function (t) {\n  var error1 = new Error();\n  var error2 = new Error();\n  var composite = new CompositeError([error1, error2]);\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(250, error1)\n  );\n  var o2 = scheduler.createHotObservable(\n    onNext(160, 1),\n    onNext(215, 2),\n    onError(260, error2)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.mergeDelayError(o2, o1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(215, 2),\n    onError(260, composite)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.mergeDelayError error left', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(250, error),\n    onNext(270, 3),\n    onCompleted(280)\n  );\n  var o2 = scheduler.createHotObservable(\n    onNext(160, 1),\n    onNext(215, 2),\n    onCompleted(260)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.mergeDelayError(o1, o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(215, 2),\n    onError(260, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.mergeDelayError error right', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(250, error),\n    onNext(270, 3),\n    onCompleted(280)\n  );\n  var o2 = scheduler.createHotObservable(\n    onNext(160, 1),\n    onNext(215, 2),\n    onCompleted(260)\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.mergeDelayError(o2, o1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(215, 2),\n    onError(260, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.mergeDelayError infinite left error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4)\n  );\n  var o2 = scheduler.createHotObservable(\n    onNext(160, 1),\n    onNext(215, 2),\n    onNext(225, 3),\n    onError(260, error) // Error dropped\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.mergeDelayError(o1, o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(215, 2),\n    onNext(220, 3),\n    onNext(225, 3),\n    onNext(230, 4)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.mergeDelayError infinite right error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4)\n  );\n  var o2 = scheduler.createHotObservable(\n    onNext(160, 1),\n    onNext(215, 2),\n    onNext(225, 3),\n    onError(260, error) // Error dropped\n  );\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.mergeDelayError(o2, o1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(215, 2),\n    onNext(220, 3),\n    onNext(225, 3),\n    onNext(230, 4)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/min.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar EmptyError = require('../internal/errors').EmptyError;\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  min: require('../observable/min')\n});\n\nfunction reverseComparer(a, b) {\n  return a > b ? -1 : a < b ? 1 : 0;\n}\n\ntest('Observable#min empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.min();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, function (n) { return n.error instanceof EmptyError; })\n  ]);\n\n  t.end();\n});\n\ntest('Observable#min return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.min();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#min some', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.min();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#min throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.min();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#min never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.min();\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#min with comparer empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 'a'),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.min(reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, function (n) { return n.error instanceof EmptyError; })\n  ]);\n\n  t.end();\n});\n\ntest('Observable#min with comparer non-empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 'z'),\n    onNext(210, 'b'),\n    onNext(220, 'c'),\n    onNext(230, 'a'),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.min(reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 'c'),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#min with comparer throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 'z'),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.min(reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#min with comparer never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 'z')\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.min(reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#min with comparer throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 'z'),\n    onNext(210, 'b'),\n    onNext(220, 'c'),\n    onNext(230, 'a'),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.min(function () { throw error; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/minby.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  minBy: require('../observable/minby')\n});\n\nfunction reverseComparer(a, b) {\n  return a > b ? -1 : a < b ? 1 : 0;\n}\n\ntest('Observable#minBy empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.minBy(function (x) { return x.key; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, []),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#minBy return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onNext(210, { key: 2, value: 'a' }),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.minBy(function (x) { return x.key; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, [{ key: 2, value: 'a' }]),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#minBy some', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onNext(210, { key: 3, value: 'b' }),\n    onNext(220, { key: 2, value: 'c' }),\n    onNext(230, { key: 4, value: 'a' }),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.minBy(function (x) { return x.key; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, [{ key: 2, value: 'c' }]),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#minBy multiple', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onNext(210, { key: 3, value: 'b' }),\n    onNext(215, { key: 2, value: 'd' }),\n    onNext(220, { key: 3, value: 'c' }),\n    onNext(225, { key: 2, value: 'y' }),\n    onNext(230, { key: 4, value: 'a' }),\n    onNext(235, { key: 4, value: 'r' }),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.minBy(function (x) { return x.key; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, [{ key: 2, value: 'd' }, { key: 2, value: 'y' }]),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#minBy throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.minBy(function (x) { return x.key; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#minBy never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' })\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.minBy(function (x) { return x.key; });\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#minBy comparer empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.minBy(function (x) { return x.key; }, reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, []),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#minBy comparer return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onNext(210, { key: 2, value: 'a' }),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.minBy(function (x) { return x.key; }, reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, [{ key: 2, value: 'a' }]),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#minBy comparer some', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onNext(210, { key: 3, value: 'b' }),\n    onNext(220, { key: 20, value: 'c' }),\n    onNext(230, { key: 4, value: 'a' }),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.minBy(function (x) { return x.key; }, reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, [{ key: 20, value: 'c' }]),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#minBy comparer throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.minBy(function (x) { return x.key; }, reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#minBy comparer never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' })\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.minBy(function (x) { return x.key; }, reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#minBy selector throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onNext(210, { key: 3, value: 'b' }),\n    onNext(220, { key: 2, value: 'c' }),\n    onNext(230, { key: 4, value: 'a' }),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.minBy(function () { throw error; }, reverseComparer);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#minBy comparer throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, { key: 1, value: 'z' }),\n    onNext(210, { key: 3, value: 'b' }),\n    onNext(220, { key: 2, value: 'c' }),\n    onNext(230, { key: 4, value: 'a' }),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.minBy(function (x) { return x.key; }, function () { throw error; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/multicast.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar Subject = require('../subject');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToObject({\n  create: require('../observable/create')\n});\n\nObservable.addToPrototype({\n  multicast: require('../observable/multicast'),\n  zip: require('../observable/zip')\n});\n\ntest('Observable#multicast hot 1', function (t) {\n  var scheduler = new TestScheduler();\n\n  var s = new Subject();\n\n  var xs = scheduler.createHotObservable(\n    onNext(40, 0),\n    onNext(90, 1),\n    onNext(150, 2),\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onCompleted(390)\n  );\n\n  var c;\n  var o = scheduler.createObserver();\n  var d1;\n  var d2;\n\n  scheduler.scheduleAbsolute(null, 50, function () {\n    c = xs.multicast(s);\n  });\n\n  scheduler.scheduleAbsolute(null, 100, function () {\n    d1 = c.subscribe(o);\n  });\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    d2 = c.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    d1.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, o.messages, [\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 390)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#multicast hot 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var s = new Subject();\n\n  var xs = scheduler.createHotObservable(\n    onNext(40, 0),\n    onNext(90, 1),\n    onNext(150, 2),\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onCompleted(390)\n  );\n\n  var c;\n  var o = scheduler.createObserver();\n  var d1;\n  var d2;\n\n  scheduler.scheduleAbsolute(null, 50, function () {\n    c = xs.multicast(s);\n  });\n\n  scheduler.scheduleAbsolute(null, 100, function () {\n    d2 = c.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    d1 = c.subscribe(o);\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    d1.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, o.messages, [\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(100, 390)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#multicast hot 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var s = new Subject();\n\n  var xs = scheduler.createHotObservable(\n    onNext(40, 0),\n    onNext(90, 1),\n    onNext(150, 2),\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onCompleted(390));\n\n  var c;\n  var o = scheduler.createObserver();\n  var d1;\n  var d2;\n\n  scheduler.scheduleAbsolute(null, 50, function () {\n    c = xs.multicast(s);\n  });\n\n  scheduler.scheduleAbsolute(null, 100, function () {\n    d2 = c.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    d1 = c.subscribe(o);\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    d1.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, o.messages, [\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(100, 390)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#multicast hot 3', function (t) {\n  var scheduler = new TestScheduler();\n\n  var s = new Subject();\n\n  var xs = scheduler.createHotObservable(\n    onNext(40, 0),\n    onNext(90, 1),\n    onNext(150, 2),\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onCompleted(390)\n  );\n\n  var c;\n  var o = scheduler.createObserver();\n  var d1;\n  var d2;\n\n  scheduler.scheduleAbsolute(null, 50, function () {\n    c = xs.multicast(s);\n  });\n\n  scheduler.scheduleAbsolute(null, 100, function () {\n    d2 = c.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    d1 = c.subscribe(o);\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    d2.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 335, function () {\n    d2 = c.connect();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, o.messages, [\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5),\n    onNext(340, 7),\n    onCompleted(390)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(100, 300),\n    subscribe(335, 390)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#multicast hot 4', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var s = new Subject();\n\n  var xs = scheduler.createHotObservable(\n    onNext(40, 0),\n    onNext(90, 1),\n    onNext(150, 2),\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onError(390, error)\n  );\n\n  var c;\n  var o = scheduler.createObserver();\n  var d1;\n  var d2;\n\n  scheduler.scheduleAbsolute(null, 50, function () {\n    c = xs.multicast(s);\n  });\n\n  scheduler.scheduleAbsolute(null, 100, function () {\n    d2 = c.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    d1 = c.subscribe(o);\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    d2.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 335, function () {\n    d2 = c.connect();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, o.messages, [\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5),\n    onNext(340, 7),\n    onError(390, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(100, 300),\n    subscribe(335, 390)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#multicast hot 5', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var s = new Subject();\n\n  var xs = scheduler.createHotObservable(\n    onNext(40, 0),\n    onNext(90, 1),\n    onNext(150, 2),\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onError(390, error));\n\n  var c;\n  var o = scheduler.createObserver();\n  var d1;\n  var d2;\n\n  scheduler.scheduleAbsolute(null, 50, function () {\n    c = xs.multicast(s);\n  });\n\n  scheduler.scheduleAbsolute(null, 100, function () {\n    d2 = c.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    d1 = c.subscribe(o);\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, o.messages, [\n    onError(400, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(100, 390)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#multicast hot 6', function (t) {\n  var scheduler = new TestScheduler();\n\n  var s = new Subject();\n\n  var xs = scheduler.createHotObservable(\n    onNext(40, 0),\n    onNext(90, 1),\n    onNext(150, 2),\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onCompleted(390)\n  );\n\n  var c;\n  var o = scheduler.createObserver();\n  var d1;\n  var d2;\n\n  scheduler.scheduleAbsolute(null, 50, function () {\n    c = xs.multicast(s);\n  });\n\n  scheduler.scheduleAbsolute(null, 100, function () {\n    d2 = c.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    d1 = c.subscribe(o);\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, o.messages, [\n    onCompleted(400)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(100, 390)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#multicast cold completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(40, 0),\n    onNext(90, 1),\n    onNext(150, 2),\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onCompleted(390)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.multicast(function () { return new Subject(); }, function (ys) { return ys; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onCompleted(390)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 390)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#multicast cold Error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(40, 0),\n    onNext(90, 1),\n    onNext(150, 2),\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onError(390, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.multicast(\n      function () { return new Subject(); },\n      function (ys) { return ys; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onError(390, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 390)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#multicast cold dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(40, 0),\n    onNext(90, 1),\n    onNext(150, 2),\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5),\n    onNext(330, 6),\n    onNext(340, 7));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.multicast(function () { return new Subject(); }, function (ys) { return ys; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5),\n    onNext(330, 6),\n    onNext(340, 7)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#multicast cold zip', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(40, 0),\n    onNext(90, 1),\n    onNext(150, 2),\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onCompleted(390)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.multicast(function () {\n      return new Subject();\n    }, function (ys) {\n      return ys.zip(ys, function (a, b) { return a + b; });\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 6),\n    onNext(240, 8),\n    onNext(270, 10),\n    onNext(330, 12),\n    onNext(340, 14),\n    onCompleted(390)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 390)\n  ]);\n\n  t.end();\n});\n\n// adapted from issue Reactive-Extensions/RxJS#1112\ntest('multicast should not reconnect when stopped', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.createObserver();\n\n  var calls = 0;\n\n  function request(v) {\n    calls++;\n    return v * 2;\n  }\n\n  var xs = scheduler.createColdObservable(\n    onNext(1, 1),\n    onNext(2, 2),\n    onNext(3, 3),\n    onCompleted(4));\n\n  var c, s;\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    c = Observable.create(function (o) {\n      return xs.subscribe(\n        function (x) { o.onNext(request(x)); },\n        function (e) { o.onError(e); },\n        function () { o.onCompleted(); });\n    }).multicast(new Subject());\n    c.subscribe(results);\n    s = c.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    s.dispose();\n    c.connect();\n  });\n\n  scheduler.start();\n\n  t.equal(calls, 3);\n\n  reactiveAssert(t, results.messages, [\n    onNext(301, 2),\n    onNext(302, 4),\n    onNext(303, 6),\n    onCompleted(304)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/narydisposable.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Disposable = require('../disposable');\nvar NAryDisposable = require('../NAryDisposable');\n\ntest('NAryDisposable#constructor', function (t) {\n  var disp1 = false;\n  var disp2 = false;\n  var disp3 = false;\n\n  var d1 = Disposable.create(function () { disp1 = true; });\n  var d2 = Disposable.create(function () { disp2 = true; });\n  var d3 = Disposable.create(function () { disp3 = true; });\n\n  var b = new NAryDisposable([d1, d2, d3]);\n\n  t.equal(b.isDisposed, false, 'should not be disposed');\n  t.equal(disp1, false, 'first should not be disposed');\n  t.equal(disp2, false, 'second should not be disposed');\n  t.equal(disp3, false, 'third should not be disposed');\n\n  t.end();\n});\n\ntest('NAryDisposable#dispose', function (t) {\n  var disp1 = false;\n  var disp2 = false;\n  var disp3 = false;\n\n  var d1 = Disposable.create(function () { disp1 = true; });\n  var d2 = Disposable.create(function () { disp2 = true; });\n  var d3 = Disposable.create(function () { disp3 = true; });\n\n  var b = new NAryDisposable([d1, d2, d3]);\n\n  t.equal(b.isDisposed, false, 'should not be disposed');\n  t.equal(disp1, false, 'first should not be disposed');\n  t.equal(disp2, false, 'second should not be disposed');\n  t.equal(disp1, false, 'third should not be disposed');\n\n  b.dispose();\n\n  t.equal(b.isDisposed, true, 'should be disposed');\n  t.equal(disp1, true, 'first should be disposed');\n  t.equal(disp2, true, 'second should be disposed');\n  t.equal(disp2, true, 'third should be disposed');\n\n  b.dispose();\n\n  t.equal(b.isDisposed, true, 'should be idempotent');\n  t.equal(disp1, true, 'first should be idempotent');\n  t.equal(disp2, true, 'second should be idempotent');\n  t.equal(disp2, true, 'third should be idempotent');\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/never.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\n\nObservable.addToObject({\n  never: require('../observable/never')\n});\n\ntest('Observable.never basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = Observable.never();\n\n  var results = scheduler.createObserver();\n\n  xs.subscribe(results);\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, []);\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/notification.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar Notification = require('../notification');\nvar Observer = require('../observer');\nvar test = require('tape');\nvar inherits = require('inherits');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n    onError = ReactiveTest.onError,\n    onCompleted = ReactiveTest.onCompleted;\n\ntest('Notification.createOnNextc.constructor', function (t) {\n  var n = Notification.createOnNext(42);\n\n  t.equal('N', n.kind);\n  t.equal(42, n.value);\n  t.end();\n});\n\ntest('Notification.createOnNext#toString', function (t) {\n  var n1 = Notification.createOnNext(42);\n\n  t.ok(n1.toString().indexOf('OnNext') !== -1);\n  t.ok(n1.toString().indexOf('42') !== -1);\n  t.end();\n});\n\nfunction CheckOnNextObserver() {\n  Observer.call(this);\n  this.value = null;\n}\n\ninherits(CheckOnNextObserver, Observer);\n\nCheckOnNextObserver.prototype.onNext = function (value) {\n  return this.value = value;\n};\n\ntest('Notification.createOnNext#accept Observer', function (t) {\n  var con = new CheckOnNextObserver();\n\n  var n1 = Notification.createOnNext(42);\n  n1.accept(con);\n\n  t.equal(42, con.value);\n  t.end();\n});\n\nfunction AcceptObserver(onNext, onError, onCompleted) {\n  Observer.call(this);\n  this._onNext = onNext;\n  this._onError = onError;\n  this._onCompleted = onCompleted;\n}\n\ninherits(AcceptObserver, Observer);\n\nAcceptObserver.prototype.onNext = function (value) {\n  return this._onNext(value);\n};\n\nAcceptObserver.prototype.onError = function (exception) {\n  return this._onError(exception);\n};\n\nAcceptObserver.prototype.onCompleted = function () {\n  return this._onCompleted();\n};\n\ntest('Notification.createOnNext#accept Observer with result', function (t) {\n  var n1 = Notification.createOnNext(42);\n\n  var results = n1.accept(new AcceptObserver(\n    function () {\n      return 'OK';\n    },\n    function () {\n      t.ok(false);\n      return false;\n    },\n    function () {\n      t.ok(false);\n      return false;\n  }));\n\n  t.equal('OK', results);\n  t.end();\n});\n\ntest('Notification.createOnNext#accept action', function (t) {\n  var obs = false;\n\n  var n1 = Notification.createOnNext(42);\n\n  n1.accept(\n    function () {\n      obs = true;\n    },\n    function () {\n      t.ok(false);\n    },\n    function () {\n      t.ok(false);\n    }\n  );\n\n  t.ok(obs);\n  t.end();\n});\n\ntest('Notification.createOnNext#accept action with result', function (t) {\n  var n1 = Notification.createOnNext(42);\n\n  var results = n1.accept(\n    function () {\n      return 'OK';\n    },\n    function () {\n      t.ok(false);\n    },\n    function () {\n      t.ok(false);\n    }\n  );\n\n  t.equal('OK', results);\n  t.end();\n});\n\ntest('Notification.createOnError.constructor', function (t) {\n  var error = new Error();\n\n  var n = Notification.createOnError(error);\n\n  t.equal('E', n.kind);\n  t.equal(error, n.error);\n  t.end();\n});\n\ntest('Notification.createOnError#toString', function (t) {\n  var error = new Error('woops');\n\n  var n1 = Notification.createOnError(error);\n\n  t.ok(n1.toString().indexOf('OnError') !== -1);\n  t.ok(n1.toString().indexOf('woops') !== -1);\n  t.end();\n});\n\n\nfunction CheckOnErrorObserver() {\n  Observer.call(this);\n  this.error = null;\n}\n\ninherits(CheckOnErrorObserver, Observer);\n\nCheckOnErrorObserver.prototype.onError = function (err) {\n  this.error = err;\n};\n\ntest('Notification.createOnError#accept(observer)', function (t) {\n  var error = new Error();\n\n  var obs = new CheckOnErrorObserver();\n\n  var n1 = Notification.createOnError(error);\n\n  n1.accept(obs);\n\n  t.equal(error, obs.error);\n  t.end();\n});\n\ntest('Notification.createOnError#accept(observer) with result', function (t) {\n  var error = new Error();\n\n  var n1 = Notification.createOnError(error);\n\n  var results = n1.accept(new AcceptObserver(\n    function () {\n      t.ok(false);\n    },\n    function () {\n      return 'OK';\n    },\n    function () {\n      t.ok(false);\n    }\n  ));\n\n  t.equal('OK', results);\n  t.end();\n});\n\ntest('Notification.createOnError#accept(action)', function (t) {\n  var error = new Error();\n\n  var obs = false;\n\n  var n1 = Notification.createOnError(error);\n\n  n1.accept(\n    function () {\n      t.ok(false);\n    },\n    function () {\n      obs = true;\n    },\n    function () {\n      t.ok(false);\n    }\n  );\n\n  t.ok(obs);\n  t.end();\n});\n\ntest('Notification.createOnError#accept(action) with result', function (t) {\n  var error = new Error();\n\n  var n1 = Notification.createOnError(error);\n\n  var results = n1.accept(\n    function () {\n      t.ok(false);\n    },\n    function () {\n      return 'OK';\n    },\n    function () {\n      t.ok(false);\n    }\n  );\n\n  t.equal('OK', results);\n  t.end();\n});\n\ntest('Notification.createOnCompleted.constructor', function (t) {\n  var n = Notification.createOnCompleted();\n\n  t.equal('C', n.kind);\n  t.end();\n});\n\ntest('Notification.createOnCompleted toString', function (t) {\n  var n1 = Notification.createOnCompleted();\n\n  t.ok(n1.toString().indexOf('OnCompleted') !== -1);\n  t.end();\n});\n\nfunction CheckOnCompletedObserver() {\n  Observer.call(this);\n  this.completed = false;\n}\n\ninherits(CheckOnCompletedObserver, Observer);\n\nCheckOnCompletedObserver.prototype.onCompleted = function () {\n  this.completed = true;\n};\n\ntest('Notification.createOnCompleted#accept(observer)', function (t) {\n  var obs = new CheckOnCompletedObserver();\n\n  var n1 = Notification.createOnCompleted();\n\n  n1.accept(obs);\n\n  t.ok(obs.completed);\n  t.end();\n});\n\ntest('Notification.createOnCompleted#accept(observer) with result', function (t) {\n  var n1 = Notification.createOnCompleted();\n\n  var results = n1.accept(new AcceptObserver(\n    function () {\n      t.ok(false);\n    },\n    function () {\n      t.ok(false);\n    },\n    function () {\n      return 'OK';\n    }\n  ));\n\n  t.equal('OK', results);\n  t.end();\n});\n\ntest('Notification.createOnCompleted#accept(action)', function (t) {\n  var obs = false;\n\n  var n1 = Notification.createOnCompleted();\n\n  n1.accept(\n    function () {\n      t.ok(false);\n    },\n    function () {\n      t.ok(false);\n    },\n    function () {\n      obs = true;\n    }\n  );\n\n  t.ok(obs);\n  t.end();\n});\n\ntest('Notification.createOnCompleted#accept(action) with result', function (t) {\n  var n1 = Notification.createOnCompleted();\n\n  var results = n1.accept(\n    function () {\n      t.ok(false);\n    },\n    function () {\n      t.ok(false);\n    },\n    function () {\n      return 'OK';\n    }\n  );\n\n  t.equal('OK', results);\n  t.end();\n});\n\ntest('toObservable empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Notification.createOnCompleted().toObservable(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(201)\n  ]);\n\n  t.end();\n});\n\ntest('Notification#toObservable just', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Notification.createOnNext(42).toObservable(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 42),\n    onCompleted(201)\n  ]);\n\n  t.end();\n});\n\ntest('Notification#toObservable throwError', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Notification.createOnError(error).toObservable(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(201, error)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/observeon.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  observeOn: require('../observable/observeon')\n});\n\ntest('Observable#observeOn normal', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.observeOn(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(211, 2),\n    onCompleted(251)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 251)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#observeOn Error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.observeOn(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(211, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 211)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#observeOn empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.observeOn(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(251)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 251)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#observeOn never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.observeOn(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/observer.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Observer = require('../observer');\nvar Notification = require('../notification');\n\nObserver.addToObject({\n  create: require('../observer/create'),\n  fromNotifier: require('../observer/fromnotifier'),\n});\n\nObserver.addToPrototype({\n  asObserver: require('../observer/asobserver'),\n  checked: require('../observer/checked'),\n  toNotifier: require('../observer/tonotifier')\n});\n\nfunction createObserver() {\n  var obs = new Observer();\n  obs.onNext = function onNext(value) { this.hasOnNext = value; };\n  obs.onError = function onError (err) { this.hasOnError = err; };\n  obs.onCompleted = function onCompleted () { this.hasOnCompleted = true; };\n\n  return obs;\n}\n\ntest('fromNotifier notification onNext', function (t) {\n  var i = 0;\n\n  var next = function (n) {\n    t.equal(i++, 0);\n    t.equal(n.kind, 'N');\n    t.equal(n.value, 42);\n    t.end();\n  };\n\n  Observer.fromNotifier(next).onNext(42);\n});\n\ntest('fromNotifier notification onError', function (t) {\n  var error = new Error();\n\n  var i = 0;\n\n  var next = function (n) {\n    t.equal(i++, 0);\n    t.equal(n.kind, 'E');\n    t.equal(n.error, error);\n    t.end();\n  };\n\n  Observer.fromNotifier(next).onError(error);\n});\n\ntest('fromNotifier Notification onCompleted', function (t) {\n  var i = 0;\n\n  var next = function (n) {\n    t.equal(i++, 0);\n    t.equal(n.kind, 'C');\n    t.end();\n  };\n\n  Observer.fromNotifier(next).onCompleted();\n});\n\ntest('toNotifier forwards', function (t) {\n  var obsn = new createObserver();\n  obsn.toNotifier()(Notification.createOnNext(42));\n  t.equal(obsn.hasOnNext, 42);\n\n  var error = new Error();\n  var obse = new createObserver();\n  obse.toNotifier()(Notification.createOnError(error));\n  t.equal(error, obse.hasOnError);\n\n  var obsc = new createObserver();\n  obsc.toNotifier()(Notification.createOnCompleted());\n  t.ok(obsc.hasOnCompleted);\n\n  t.end();\n});\n\ntest('Observer.create onNext', function (t) {\n  var next = false;\n  var res = Observer.create(function (x) {\n    t.equal(42, x);\n    next = true;\n  });\n\n  res.onNext(42);\n\n  t.ok(next);\n  t.end();\n\n  res.onCompleted();\n});\n\ntest('Observer.create OnNext has error', function (t) {\n  var e_;\n  var error = new Error();\n  var next = false;\n  var res = Observer.create(function (x) {\n      t.equal(42, x);\n      next = true;\n  });\n\n  res.onNext(42);\n  t.ok(next);\n\n  try {\n    res.onError(error);\n    t.ok(false);\n  } catch (e) {\n    e_  = e;\n  }\n\n  t.equal(error, e_);\n  t.end();\n});\n\ntest('Observer.create onNext onCompleted', function (t) {\n  var next = false;\n\n  var completed = false;\n\n  var res = Observer.create(function (x) {\n    t.equal(42, x);\n    next = true;\n  }, null, function () {\n    completed = true;\n  });\n\n  res.onNext(42);\n\n  t.ok(next);\n  t.ok(!completed);\n\n  res.onCompleted();\n\n  t.ok(completed);\n  t.end();\n});\n\ntest('Observer.create onNext onCompleted has error', function (t) {\n  var e_;\n  var error = new Error();\n\n  var next = false;\n\n  var completed = false;\n\n  var res = Observer.create(\n    function (x) {\n      t.equal(42, x);\n      next = true;\n    },\n    null,\n    function () {\n      completed = true;\n    }\n  );\n\n  res.onNext(42);\n  t.ok(next);\n  t.ok(!completed);\n\n  try {\n    res.onError(error);\n    t.ok(false);\n  } catch (e) {\n    e_  = e;\n  }\n\n  t.equal(error, e_);\n  t.ok(!completed);\n  t.end();\n});\n\ntest('Observer.create onNext onError', function (t) {\n  var error = new Error();\n\n  var next = true;\n\n  var hasError = false;\n\n  var res = Observer.create(function (x) {\n    t.equal(42, x);\n    next = true;\n  }, function (e) {\n    t.equal(error, e);\n    hasError = true;\n  });\n\n  res.onNext(42);\n\n  t.ok(next);\n  t.ok(!hasError);\n\n  res.onError(error);\n  t.ok(hasError);\n  t.end();\n});\n\ntest('Observer.create onNext onError hit completed', function (t) {\n  var error = new Error();\n\n  var next = true;\n\n  var hasError = false;\n\n  var res = Observer.create(function (x) {\n    t.equal(42, x);\n    next = true;\n  }, function (e) {\n    t.equal(error, e);\n    hasError = true;\n  });\n\n  res.onNext(42);\n  t.ok(next);\n  t.ok(!hasError);\n\n  res.onCompleted();\n\n  t.ok(!hasError);\n  t.end();\n});\n\ntest('Observer.create onNext onError onCompleted 1', function (t) {\n  var error = new Error();\n\n  var next = true;\n\n  var hasError = false;\n  var completed = false;\n\n  var res = Observer.create(function (x) {\n    t.equal(42, x);\n    next = true;\n  }, function (e) {\n    t.equal(error, e);\n    hasError = true;\n  }, function () {\n    completed = true;\n  });\n\n  res.onNext(42);\n\n  t.ok(next);\n  t.ok(!hasError);\n  t.ok(!completed);\n\n  res.onCompleted();\n\n  t.ok(completed);\n  t.ok(!hasError);\n  t.end();\n});\n\ntest('Observer.create onNext onError onCompleted 2', function (t) {\n  var error = new Error();\n\n  var next = true;\n\n  var hasError = false;\n\n  var completed = false;\n\n  var res = Observer.create(function (x) {\n    t.equal(42, x);\n    next = true;\n  }, function (e) {\n    t.equal(error, e);\n    hasError = true;\n  }, function () {\n    completed = true;\n  });\n\n  res.onNext(42);\n\n  t.ok(next);\n  t.ok(!hasError);\n  t.ok(!completed);\n\n  res.onError(error);\n\n  t.ok(!completed);\n  t.ok(hasError);\n  t.end();\n});\n\ntest('Observer.asObserver hides', function (t) {\n  var obs = new createObserver();\n\n  var res = obs.asObserver();\n\n  t.notEqual(obs, res);\n  t.end();\n});\n\ntest('asObserver Forwards', function (t) {\n  var obsn = new createObserver();\n  obsn.asObserver().onNext(42);\n  t.equal(obsn.hasOnNext, 42);\n\n  var error = new Error();\n  var obse = new createObserver();\n  obse.asObserver().onError(error);\n  t.equal(obse.hasOnError, error);\n\n  var obsc = new createObserver();\n  obsc.asObserver().onCompleted();\n  t.ok(obsc.hasOnCompleted);\n\n  t.end();\n});\n\ntest('Observer.checked already terminated completed', function (t) {\n  var m = 0, n = 0;\n\n  var o = Observer.create(function () {\n    m++;\n  }, function () {\n    t.ok(false);\n  }, function () {\n    n++;\n  }).checked();\n\n  o.onNext(1);\n  o.onNext(2);\n  o.onCompleted();\n\n  t.throws(function () { o.onCompleted(); });\n  t.throws(function () { o.onError(new Error('error')); });\n  t.equal(2, m);\n  t.equal(1, n);\n\n  t.end();\n});\n\ntest('Observer.checked already terminated error', function (t) {\n  var m = 0, n = 0;\n\n  var o = Observer.create(function () {\n    m++;\n  }, function () {\n    n++;\n  }, function () {\n    t.ok(false);\n  }).checked();\n\n  o.onNext(1);\n  o.onNext(2);\n  o.onError(new Error('error'));\n\n  t.throws(function () { o.onCompleted(); });\n  t.throws(function () { o.onError(new Error('error')); });\n\n  t.equal(2, m);\n  t.equal(1, n);\n  t.end();\n});\n\ntest('Observer.checked re-entrant next', function (t) {\n  var n = 0;\n\n  var o = Observer.create(function () {\n    n++;\n    t.throws(function () { o.onNext(9); });\n    t.throws(function () { o.onError(new Error('error')); });\n    t.throws(function () { o.onCompleted(); });\n  }, function () {\n    t.ok(false);\n  }, function () {\n    t.ok(false);\n  }).checked();\n\n  o.onNext(1);\n\n  t.equal(1, n);\n  t.end();\n});\n\ntest('Observer.checked re-entrant error', function (t) {\n  var n = 0;\n\n  var o = Observer.create(function () {\n    t.ok(false);\n  }, function () {\n    n++;\n    t.throws(function () { o.onNext(9); });\n    t.throws(function () { o.onError(new Error('error')); });\n    t.throws(function () { o.onCompleted(); });\n  }, function () {\n    t.ok(false);\n  }).checked();\n\n  o.onError(new Error('error'));\n  t.equal(1, n);\n  \n  t.end();\n});\n\ntest('Observer.checked re-entrant completed', function (t) {\n  var n = 0;\n\n  var o = Observer.create(function () {\n    t.ok(false);\n  }, function () {\n    t.ok(false);\n  }, function () {\n    n++;\n    t.throws(function () { o.onNext(9); });\n    t.throws(function () { o.onError(new Error('error')); });\n    t.throws(function () { o.onCompleted(); });\n  }).checked();\n\n  o.onCompleted();\n\n  t.equal(1, n);\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/of.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n    onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  of: require('../observable/of'),\n  ofScheduled: require('../observable/ofscheduled')\n});\n\ntest('Observable.of', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.of(1,2,3,4,5);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 1),\n    onNext(200, 2),\n    onNext(200, 3),\n    onNext(200, 4),\n    onNext(200, 5),\n    onCompleted(200)\n  ]);\n  t.end();\n});\n\ntest('Observable.of empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.of();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(200)\n  ]);\n  t.end();\n});\n\ntest('Observable.ofScheduled', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.ofScheduled(scheduler, 1,2,3,4,5);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 1),\n    onNext(202, 2),\n    onNext(203, 3),\n    onNext(204, 4),\n    onNext(205, 5),\n    onCompleted(206)\n  ]);\n  t.end();\n});\n\ntest('Observable.ofScheduled empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.ofScheduled(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(201)\n  ]);\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/onerrorresumenext.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  onErrorResumeNext: require('../observable/onerrorresumenext')\n});\n\nObservable.addToPrototype({\n  onErrorResumeNext: require('../observable/onerrorresumenext')\n});\n\ntest('Observable.onErrorResumeNext error multiple', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(220, new Error())\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(230, 4),\n    onError(240, new Error())\n  );\n\n  var o3 = scheduler.createHotObservable(\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.onErrorResumeNext(o1, o2, o3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(230, 4),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.onErrorResumeNext empty return throw and more', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(205)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(215, 2),\n    onCompleted(220)\n  );\n\n  var o3 = scheduler.createHotObservable(\n    onNext(225, 3),\n    onNext(230, 4),\n    onCompleted(235)\n  );\n\n  var o4 = scheduler.createHotObservable(\n    onError(240, new Error())\n  );\n\n  var o5 = scheduler.createHotObservable(\n    onNext(245, 5), onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.onErrorResumeNext(o1, o2, o3, o4, o5);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, 2),\n    onNext(225, 3),\n    onNext(230, 4),\n    onNext(245, 5),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.onErrorResumeNext single source throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onError(230, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.onErrorResumeNext(o1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.onErrorResumeNext end with never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(220)\n  );\n\n  var o2 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.onErrorResumeNext(o1, o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.onErrorResumeNext start with never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = Observable.never();\n\n  var o2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(220)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.onErrorResumeNext(o1, o2);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable.onErrorResumeNext no errors', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onCompleted(230)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(240, 4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return o1.onErrorResumeNext(o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(240, 4),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.onErrorResumeNext error', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onError(230, new Error())\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(240, 4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return o1.onErrorResumeNext(o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(240, 4),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.onErrorResumeNext empty return throw and more', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(220)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onError(230, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return o1.onErrorResumeNext(o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onCompleted(230)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/pairs.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n    onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  pairs: require('../observable/pairs')\n});\n\ntest('Observable.pairs empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = {};\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.pairs(xs, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(201)\n  ]);\n  t.end();\n});\n\ntest('Observable.pairs normal', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = {foo: 42, bar: 56, baz: 78};\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.pairs(xs, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, ['foo', 42]),\n    onNext(202, ['bar', 56]),\n    onNext(203, ['baz', 78]),\n    onCompleted(204)\n  ]);\n  t.end();\n});\n\ntest('Observable.pairs dispose', function (t) {\n  var xs = {foo: 42, bar: 56, baz: 78, quux: 104};\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.pairs(xs, scheduler);\n  }, { disposed: 204 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, ['foo', 42]),\n    onNext(202, ['bar', 56]),\n    onNext(203, ['baz', 78]),\n  ]);\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/pairwise.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  pairwise: require('../observable/pairwise')\n});\n\ntest('Observable#pairwise empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 5),\n    onCompleted(210)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.pairwise();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(210)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#pairwise single', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 5),\n    onNext(210, 4),\n    onCompleted(220)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.pairwise();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(220)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#pairwise completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 5),\n    onNext(210, 4),\n    onNext(240, 3),\n    onNext(290, 2),\n    onNext(350, 1),\n    onCompleted(360)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.pairwise();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(240, [4,3]),\n    onNext(290, [3, 2]),\n    onNext(350, [2, 1]),\n    onCompleted(360)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 360)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#pairwise not completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 5),\n    onNext(210, 4),\n    onNext(240, 3),\n    onNext(290, 2),\n    onNext(350, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.pairwise();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(240, [4,3]),\n    onNext(290, [3, 2]),\n    onNext(350, [2, 1])\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#pairwise error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 5),\n    onNext(210, 4),\n    onNext(240, 3),\n    onError(290, error),\n    onNext(350, 1),\n    onCompleted(360)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.pairwise();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(240, [4,3]),\n    onError(290, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 290)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#pairwise disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 5),\n    onNext(210, 4),\n    onNext(240, 3),\n    onNext(290, 2),\n    onNext(350, 1),\n    onCompleted(360)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.pairwise();\n  }, { disposed: 280 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(240, [4,3])\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 280)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/partition.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  partition: require('../observable/partition')\n});\n\nfunction isEven(num) {\n  return +num % 2 === 0;\n}\n\ntest('Observable#partition empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 5),\n    onCompleted(210)\n  );\n\n  var observables,\n    subscription1,\n    subscription2,\n    results1 = scheduler.createObserver(),\n    results2 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.created, function () {\n    observables = xs.partition(isEven);\n  });\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.subscribed, function () {\n    subscription1 = observables[0].subscribe(results1);\n    subscription2 = observables[1].subscribe(results2);\n  });\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.disposed, function () {\n    subscription1.dispose();\n    subscription2.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onCompleted(210)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onCompleted(210)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 210),\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#partition single', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 5),\n    onNext(210, 4),\n    onCompleted(220)\n  );\n\n  var observables,\n    subscription1,\n    subscription2,\n    results1 = scheduler.createObserver(),\n    results2 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.created, function () {\n    observables = xs.partition(isEven);\n  });\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.subscribed, function () {\n    subscription1 = observables[0].subscribe(results1);\n    subscription2 = observables[1].subscribe(results2);\n  });\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.disposed, function () {\n    subscription1.dispose();\n    subscription2.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(210, 4),\n    onCompleted(220)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onCompleted(220)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 220),\n    subscribe(200, 220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#partition each', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 5),\n    onNext(210, 4),\n    onNext(220, 3),\n    onCompleted(230)\n  );\n\n  var observables,\n    subscription1,\n    subscription2,\n    results1 = scheduler.createObserver(),\n    results2 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.created, function () {\n    observables = xs.partition(isEven);\n  });\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.subscribed, function () {\n    subscription1 = observables[0].subscribe(results1);\n    subscription2 = observables[1].subscribe(results2);\n  });\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.disposed, function () {\n    subscription1.dispose();\n    subscription2.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(210, 4),\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(220, 3),\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230),\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#partition completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 5),\n    onNext(210, 4),\n    onNext(240, 3),\n    onNext(290, 2),\n    onNext(350, 1),\n    onCompleted(360)\n  );\n\n  var observables,\n    subscription1,\n    subscription2,\n    results1 = scheduler.createObserver(),\n    results2 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.created, function () {\n    observables = xs.partition(isEven);\n  });\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.subscribed, function () {\n    subscription1 = observables[0].subscribe(results1);\n    subscription2 = observables[1].subscribe(results2);\n  });\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.disposed, function () {\n    subscription1.dispose();\n    subscription2.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(210, 4),\n    onNext(290, 2),\n    onCompleted(360)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(240, 3),\n    onNext(350, 1),\n    onCompleted(360)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 360),\n    subscribe(200, 360)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#partition not completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 5),\n    onNext(210, 4),\n    onNext(240, 3),\n    onNext(290, 2),\n    onNext(350, 1)\n  );\n\n  var observables,\n    subscription1,\n    subscription2,\n    results1 = scheduler.createObserver(),\n    results2 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.created, function () {\n    observables = xs.partition(isEven);\n  });\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.subscribed, function () {\n    subscription1 = observables[0].subscribe(results1);\n    subscription2 = observables[1].subscribe(results2);\n  });\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.disposed, function () {\n    subscription1.dispose();\n    subscription2.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(210, 4),\n    onNext(290, 2)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(240, 3),\n    onNext(350, 1)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000),\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#partition error', function (t) {\n  var error = new Error();\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 5),\n    onNext(210, 4),\n    onNext(240, 3),\n    onError(290, error),\n    onNext(350, 1),\n    onCompleted(360)\n  );\n\n  var observables,\n    subscription1,\n    subscription2,\n    results1 = scheduler.createObserver(),\n    results2 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.created, function () {\n    observables = xs.partition(isEven);\n  });\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.subscribed, function () {\n    subscription1 = observables[0].subscribe(results1);\n    subscription2 = observables[1].subscribe(results2);\n  });\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.disposed, function () {\n    subscription1.dispose();\n    subscription2.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(210, 4),\n    onError(290, error)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(240, 3),\n    onError(290, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 290),\n    subscribe(200, 290)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#partition disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 5),\n    onNext(210, 4),\n    onNext(240, 3),\n    onNext(290, 2),\n    onNext(350, 1),\n    onCompleted(360)\n  );\n\n  var observables,\n    subscription1,\n    subscription2,\n    results1 = scheduler.createObserver(),\n    results2 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.created, function () {\n    observables = xs.partition(isEven);\n  });\n\n  scheduler.scheduleAbsolute(null, ReactiveTest.subscribed, function () {\n    subscription1 = observables[0].subscribe(results1);\n    subscription2 = observables[1].subscribe(results2);\n  });\n\n  scheduler.scheduleAbsolute(null, 280, function () {\n    subscription1.dispose();\n    subscription2.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(210, 4)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(240, 3)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 280),\n    subscribe(200, 280)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/pausable.js",
    "content": "var test = require('tape');\nvar Observable = require('../observable');\nvar Subject = require('../subject');\nvar Scheduler = require('../scheduler');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  pausable: require('../observable/pausable')\n});\n\ntest('Observable#pausable no skip', function (t) {\n  var subscription;\n\n  var scheduler = new TestScheduler();\n\n  var controller = new Subject();\n\n  var results = scheduler.createObserver();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  );\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = xs.pausable(controller).subscribe(results);\n    controller.onNext(true);\n  });\n\n  scheduler.scheduleAbsolute(null, 205, function () {\n    controller.onNext(false);\n  });\n\n  scheduler.scheduleAbsolute(null, 209, function () {\n    controller.onNext(true);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#pausable skips', function (t) {\n  var subscription;\n\n  var scheduler = new TestScheduler();\n\n  var controller = new Subject();\n\n  var results = scheduler.createObserver();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  );\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = xs.pausable(controller).subscribe(results);\n    controller.onNext(true);\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    controller.onNext(false);\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    controller.onNext(true);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(230, 3),\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#pausable error', function (t) {\n  var subscription;\n\n  var err = new Error();\n  var scheduler = new TestScheduler();\n\n  var controller = new Subject();\n\n  var results = scheduler.createObserver();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(230, err),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  );\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = xs.pausable(controller).subscribe(results);\n    controller.onNext(true);\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    controller.onNext(false);\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    controller.onNext(true);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onError(230, err)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#pausable with observable controller and pause and unpause', function (t) {\n  var subscription;\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.createObserver();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(270, 4),\n    onNext(301, 5),\n    onNext(350, 6),\n    onNext(450, 7),\n    onCompleted(500)\n  );\n\n  var controller = scheduler.createHotObservable(\n    onNext(201, true),\n    onNext(220, false),\n    onNext(250, true)\n  );\n\n  var pausable = xs.pausable(controller);\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = pausable.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    pausable.pause();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    pausable.resume();\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(270, 4),\n    onNext(450, 7),\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#pausable with default controller and multiple subscriptions', function (t) {\n  var paused, subscription, subscription2;\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  );\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    paused = xs.pausable();\n    subscription = paused.subscribe(results);\n    paused.resume();\n  });\n\n  scheduler.scheduleAbsolute(null, 240, function () {\n    subscription2 = paused.subscribe(results2);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n    subscription2.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n\ntest('pausable is unaffected by currentThread scheduler', function (t) {\n  var subscription;\n\n  var scheduler = new TestScheduler();\n\n  var controller = new Subject();\n\n  var results = scheduler.createObserver();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  );\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    Scheduler.currentThread.schedule(null, function () {\n      subscription = xs.pausable(controller).subscribe(results);\n      controller.onNext(true);\n    });\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/pausablebuffered.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar Subject = require('../subject');\nvar Scheduler = require('../scheduler');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  just: require('../observable/just')\n});\n\nObservable.addToPrototype({\n  pausableBuffered: require('../observable/pausablebuffered')\n});\n\ntest('Observable#pausableBuffered no skip', function (t) {\n  var subscription;\n\n  var scheduler = new TestScheduler();\n\n  var controller = new Subject();\n\n  var results = scheduler.createObserver();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  );\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = xs.pausableBuffered(controller).subscribe(results);\n    controller.onNext(true);\n  });\n\n  scheduler.scheduleAbsolute(null, 205, function () {\n    controller.onNext(false);\n  });\n\n  scheduler.scheduleAbsolute(null, 209, function () {\n    controller.onNext(true);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#pausableBuffered skips', function (t) {\n  var subscription;\n\n  var scheduler = new TestScheduler();\n\n  var controller = new Subject();\n\n  var results = scheduler.createObserver();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  );\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = xs.pausableBuffered(controller).subscribe(results);\n    controller.onNext(true);\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    controller.onNext(false);\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    controller.onNext(true);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(400, 4),\n    onNext(400, 5),\n    onNext(400, 6),\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#pausableBuffered error', function (t) {\n  var subscription;\n\n  var err = new Error();\n  var scheduler = new TestScheduler();\n\n  var controller = new Subject();\n\n  var results = scheduler.createObserver();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(230, err),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  );\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = xs.pausableBuffered(controller).subscribe(results);\n    controller.onNext(true);\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    controller.onNext(false);\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    controller.onNext(true);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onError(230, err)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#pausableBuffered skip initial elements', function (t) {\n  var subscription;\n\n  var scheduler = new TestScheduler();\n\n  var controller = new Subject();\n\n  var results = scheduler.createObserver();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(230, 2),\n    onNext(270, 3),\n    onCompleted(400)\n  );\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = xs.pausableBuffered(controller).subscribe(results);\n    controller.onNext(false);\n  });\n\n  scheduler.scheduleAbsolute(null, 280, function () {\n    controller.onNext(true);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(280, 2),\n    onNext(280, 3),\n    onCompleted(400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#pausableBuffered with observable controller and pause and unpause', function (t) {\n  var subscription;\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.createObserver();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onNext(450, 7),\n    onNext(470, 8),\n    onCompleted(500)\n  );\n\n  var controller = scheduler.createHotObservable(\n    onNext(201, true),\n    onNext(300, false),\n    onNext(400, true)\n  );\n\n  var pausableBuffered = xs.pausableBuffered(controller);\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = pausableBuffered.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 460, function () {\n    pausableBuffered.pause();\n  });\n\n  scheduler.scheduleAbsolute(null, 480, function () {\n    pausableBuffered.resume();\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(400, 4),\n    onNext(400, 5),\n    onNext(400, 6),\n    onNext(450, 7),\n    onNext(480, 8),\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#pausableBuffered with immediate unpause', function (t) {\n  var subscription;\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.createObserver();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(500)\n  );\n\n  var controller = Observable.just(true);\n\n  var pausableBuffered = xs.pausableBuffered(controller);\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = pausableBuffered.subscribe(results);\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#pausableBuffered when finishing', function (t) {\n  var subscription;\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.createObserver();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onNext(450, 7),\n    onNext(470, 8),\n    onCompleted(500)\n  );\n\n  var controller = scheduler.createHotObservable(\n    onNext(201, true),\n    onNext(300, false),\n    onNext(400, true)\n  );\n\n  var pausableBuffered = xs.pausableBuffered(controller);\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = pausableBuffered.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 460, function () {\n    pausableBuffered.pause();\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(400, 4),\n    onNext(400, 5),\n    onNext(400, 6),\n    onNext(450, 7)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#pausableBuffered with observable controller and pause and unpause after end', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onNext(450, 7),\n    onNext(470, 8),\n    onCompleted(500)\n  );\n\n  var controller = scheduler.createHotObservable(\n    onNext(201, true),\n    onNext(300, false),\n    onNext(600, true)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.pausableBuffered(controller);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(600, 4),\n    onNext(600, 5),\n    onNext(600, 6),\n    onNext(600, 7),\n    onNext(600, 8),\n    onCompleted(600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#pausableBuffered with observable controller and pause and unpause after error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onNext(450, 7),\n    onNext(470, 8),\n    onError(500, error)\n  );\n\n  var controller = scheduler.createHotObservable(\n    onNext(201, true),\n    onNext(300, false),\n    onNext(600, true)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.pausableBuffered(controller);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(600, 4),\n    onNext(600, 5),\n    onNext(600, 6),\n    onNext(600, 7),\n    onNext(600, 8),\n    onError(600, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#pausableBuffered with state change in subscriber', function (t) {\n  var subscription;\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.createObserver();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(330, 5),\n    onCompleted(500)\n  );\n\n  var controller = new Subject();\n\n  var pausableBuffered = xs.pausableBuffered(controller);\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = pausableBuffered.subscribe(\n      function(value){\n        results.onNext(value);\n        controller.onNext(false);\n        scheduler.scheduleRelative(null, 100, function () { controller.onNext(true); });\n      },\n      function (e) { results.onError(e); },\n      function () { results.onCompleted(); }\n    );\n\n    controller.onNext(true);\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(310, 3),\n    onNext(310, 4),\n    onNext(410, 5),\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n\ntest('pausableBuffered produces expected result', function (t) {\n  var data = new Subject();\n  var signal = new Subject();\n  var p = data.pausableBuffered(signal);\n  var results = [];\n  p.subscribe(function (value) { results.push(value); });\n\n  data.onNext(1);\n  signal.onNext(false);\n  signal.onNext(true);\n\n  t.deepEqual(results, [1]);\n\n  t.end();\n});\n\ntest('Observable#pausableBuffered with default controller and multiple subscriptions', function (t) {\n  var paused, subscription, subscription2;\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  );\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    paused = xs.pausableBuffered();\n    subscription = paused.subscribe(results);\n    paused.resume();\n  });\n\n  scheduler.scheduleAbsolute(null, 240, function () {\n    subscription2 = paused.subscribe(results2);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n    subscription2.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n\ntest('pausableBuffered is unaffected by currentThread scheduler', function (t) {\n  var subscription;\n\n  var scheduler = new TestScheduler();\n\n  var controller = new Subject();\n\n  var results = scheduler.createObserver();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  );\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    Scheduler.currentThread.schedule(null, function () {\n      subscription = xs.pausableBuffered(controller).subscribe(results);\n      controller.onNext(true);\n    });\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(301, 4),\n    onNext(350, 5),\n    onNext(399, 6),\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/pluck.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  pluck: require('../observable/pluck')\n});\n\ntest('Observable#pluck completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, {prop: 1}),\n    onNext(210, {prop: 2}),\n    onNext(240, {prop: 3}),\n    onNext(290, {prop: 4}),\n    onNext(350, {prop: 5}),\n    onCompleted(400),\n    onNext(410, {prop: -1}),\n    onCompleted(420),\n    onError(430, new Error('ex'))\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.pluck('prop');\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(350, 5),\n    onCompleted(400)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.end();\n});\n\ntest('deep pluck nested completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, {a: {b: {c: 1}}}),\n    onNext(210, {a: {b: {c: 2}}}),\n    onNext(240, {a: {b: {c: 3}}}),\n    onNext(290, {a: {b: {c: 4}}}),\n    onNext(350, {a: {b: {c: 5}}}),\n    onCompleted(400),\n    onNext(410, {a: {b: {c: -1}}}),\n    onCompleted(420),\n    onError(430, new Error('ex'))\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.pluck('a', 'b', 'c');\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(350, 5),\n    onCompleted(400)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.end();\n});\n\ntest('deep pluck nested edge cases', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, {a: {b: {c: 1}}}),\n    onNext(210, {a: {b: 2}}),\n    onNext(240, {a: {c: {c: 3}}}),\n    onNext(290, {}),\n    onNext(350, {a: {b: {c: 5}}}),\n    onCompleted(400),\n    onNext(410, {a: {b: {c: -1}}}),\n    onCompleted(420),\n    onError(430, new Error('ex'))\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.pluck('a', 'b', 'c');\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, undefined),\n    onNext(240, undefined),\n    onNext(290, undefined),\n    onNext(350, 5),\n    onCompleted(400)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/publish.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar ConnectableObservable = require('../observable/connectableobservable');\nvar Disposable = require('../disposable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar inherits = require('inherits');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe,\n  created = ReactiveTest.created,\n  subscribed = ReactiveTest.subscribed,\n  disposed = ReactiveTest.disposed;\n\nObservable.addToObject({\n  defer: require('../observable/defer'),\n  never: require('../observable/never')\n});\n\nObservable.addToPrototype({\n  publish: require('../observable/publish'),\n  zip: require('../observable/zip')\n});\n\nfunction add(x, y) { return x + y; }\n\ntest('Observable#publish Cold Zip', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(40, 0),\n    onNext(90, 1),\n    onNext(150, 2),\n    onNext(210, 3),\n    onNext(240, 4),\n    onNext(270, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onCompleted(390)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.publish(function (ys) { return ys.zip(ys, add); });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 6),\n    onNext(240, 8),\n    onNext(270, 10),\n    onNext(330, 12),\n    onNext(340, 14),\n    onCompleted(390)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 390)\n  ]);\n\n  t.end();\n});\n\nfunction MySubject() {\n  this._disposeOnMap = {};\n  this.subscribeCount = 0;\n  this.disposed = false;\n  Observable.call(this);\n}\n\ninherits(MySubject, Observable);\n\nMySubject.prototype._subscribe = function (o) {\n  this.subscribeCount++;\n  this._o = o;\n\n  var self = this;\n  return Disposable.create(function () { self.disposed = true; });\n};\n\nMySubject.prototype.disposeOn = function (value, disposable) {\n  this._disposeOnMap[value] = disposable;\n};\n\nMySubject.prototype.onNext = function (value) {\n  this._o.onNext(value);\n  this._disposeOnMap[value] && this._disposeOnMap[value].dispose();\n};\n\nMySubject.prototype.onError = function (exception) {\n  this._o.onError(exception);\n};\n\nMySubject.prototype.onCompleted = function () {\n  this._o.onCompleted();\n};\n\ntest('ConnectableObservable#refCount connects on first', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onNext(240, 4),\n    onCompleted(250)\n  );\n\n  var subject = new MySubject();\n\n  var conn = new ConnectableObservable(xs, subject);\n\n  var results = scheduler.startScheduler(function () {\n    return conn.refCount();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onNext(240, 4),\n    onCompleted(250)\n  ]);\n\n  t.ok(subject.disposed);\n\n  t.end();\n});\n\ntest('ConnectableObservable#refCount not connected', function (t) {\n  var disconnected = false;\n\n  var count = 0;\n\n  var xs = Observable.defer(function () {\n    count++;\n    return Observable.create(function () {\n      return function () { disconnected = true; };\n    });\n  });\n\n  var subject = new MySubject();\n  var conn = new ConnectableObservable(xs, subject);\n\n  var refd = conn.refCount();\n  var dis1 = refd.subscribe();\n\n  t.equal(1, count);\n  t.equal(1, subject.subscribeCount);\n  t.ok(!disconnected);\n\n  var dis2 = refd.subscribe();\n  t.equal(1, count);\n  t.equal(2, subject.subscribeCount);\n  t.ok(!disconnected);\n\n  dis1.dispose();\n  t.ok(!disconnected);\n\n  dis2.dispose();\n  t.ok(disconnected);\n\n  disconnected = false;\n\n  var dis3 = refd.subscribe();\n  t.equal(2, count);\n  t.equal(3, subject.subscribeCount);\n  t.ok(!disconnected);\n\n  dis3.dispose();\n  t.ok(disconnected);\n\n  t.end();\n});\n\ntest('Observable#publish basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var ys;\n  var subscription;\n  var connection;\n\n  var results = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, created, function () {\n    ys = xs.publish();\n  });\n\n  scheduler.scheduleAbsolute(null, subscribed, function () {\n    subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, disposed, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 550, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 650, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(520, 11)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 550),\n    subscribe(650, 800)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#publish Error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onError(600, error)\n  );\n\n  var results = scheduler.createObserver();\n\n  var ys;\n  var subscription;\n  var connection;\n\n  scheduler.scheduleAbsolute(null, created, function () {\n    ys = xs.publish();\n  });\n\n  scheduler.scheduleAbsolute(null, subscribed, function () {\n    subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, disposed, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(520, 11),\n    onNext(560, 20),\n    onError(600, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#publish complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.createObserver();\n\n  var ys;\n  var subscription;\n  var connection;\n\n  scheduler.scheduleAbsolute(null, created, function () {\n    ys = xs.publish();\n  });\n\n  scheduler.scheduleAbsolute(null, subscribed, function () {\n    subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, disposed, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#publish dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.createObserver();\n\n  var ys;\n  var subscription;\n  var connection;\n\n  scheduler.scheduleAbsolute(null, created, function () {\n    ys = xs.publish();\n  });\n\n  scheduler.scheduleAbsolute(null, subscribed, function () {\n    subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 350, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 550, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 650, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(340, 8)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 550),\n    subscribe(650, 800)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#publish multiple connections', function (t) {\n  var xs = Observable.never();\n\n  var ys = xs.publish();\n\n  var connection1 = ys.connect();\n  var connection2 = ys.connect();\n\n  t.ok(connection1 === connection2);\n\n  connection1.dispose();\n  connection2.dispose();\n\n  var connection3 = ys.connect();\n\n  t.ok(connection1 !== connection3);\n\n  connection3.dispose();\n\n  t.end();\n});\n\ntest('Observable#publish function zip complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.publish(function (_xs) {\n      return _xs.zip(_xs.skip(1), add);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(280, 7),\n    onNext(290, 5),\n    onNext(340, 9),\n    onNext(360, 13),\n    onNext(370, 11),\n    onNext(390, 13),\n    onNext(410, 20),\n    onNext(430, 15),\n    onNext(450, 11),\n    onNext(520, 20),\n    onNext(560, 31),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#publish function zip error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onError(600, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.publish(function (_xs) {\n      return _xs.zip(_xs.skip(1), add);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(280, 7),\n    onNext(290, 5),\n    onNext(340, 9),\n    onNext(360, 13),\n    onNext(370, 11),\n    onNext(390, 13),\n    onNext(410, 20),\n    onNext(430, 15),\n    onNext(450, 11),\n    onNext(520, 20),\n    onNext(560, 31),\n    onError(600, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#publish function zip dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.publish(function (_xs) { return _xs.zip(_xs.skip(1), add); });\n  }, { disposed: 470 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(280, 7),\n    onNext(290, 5),\n    onNext(340, 9),\n    onNext(360, 13),\n    onNext(370, 11),\n    onNext(390, 13),\n    onNext(410, 20),\n    onNext(430, 15),\n    onNext(450, 11)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 470)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/publishlast.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe,\n  created = ReactiveTest.created,\n  subscribed = ReactiveTest.subscribed,\n  disposed = ReactiveTest.disposed;\n\nObservable.addToObject({\n  never: require('../observable/never')\n});\n\nObservable.addToPrototype({\n  publishLast: require('../observable/publishlast'),\n  zip: require('../observable/zip')\n});\n\nfunction add(x, y) { return x + y; }\n\ntest('Observable#publishLast basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.createObserver();\n\n  var ys;\n  var subscription;\n  var connection;\n\n  scheduler.scheduleAbsolute(null, created, function () {\n    ys = xs.publishLast();\n  });\n\n  scheduler.scheduleAbsolute(null, subscribed, function () {\n    subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, disposed, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 550, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 650, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 550),\n    subscribe(650, 800)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#publishLast Error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onError(600, error)\n  );\n\n  var results = scheduler.createObserver();\n\n  var ys;\n  var subscription;\n  var connection;\n\n  scheduler.scheduleAbsolute(null, created, function () {\n    ys = xs.publishLast();\n  });\n\n  scheduler.scheduleAbsolute(null, subscribed, function () {\n      subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, disposed, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onError(600, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#publishLast complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.createObserver();\n\n  var ys;\n  var subscription;\n  var connection;\n\n  scheduler.scheduleAbsolute(null, created, function () {\n    ys = xs.publishLast();\n  });\n\n  scheduler.scheduleAbsolute(null, subscribed, function () {\n    subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, disposed, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(600, 20),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#publishLast dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.createObserver();\n\n  var ys;\n  var subscription;\n  var connection;\n\n  scheduler.scheduleAbsolute(null, created, function () {\n    ys = xs.publishLast();\n  });\n\n  scheduler.scheduleAbsolute(null, subscribed, function () {\n    subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 350, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 550, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 650, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 550),\n    subscribe(650, 800)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#publishLast multiple connections', function (t) {\n  var xs = Observable.never();\n  var ys = xs.publishLast();\n\n  var connection1 = ys.connect();\n  var connection2 = ys.connect();\n  t.ok(connection1 === connection2);\n\n  connection1.dispose();\n  connection2.dispose();\n\n  var connection3 = ys.connect();\n  t.ok(connection1 !== connection3);\n\n  t.end();\n});\n\ntest('Observable#publishLast zip complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.publishLast(function (_xs) {\n      return _xs.zip(_xs, add);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(600, 40),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#publishLast zip Error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onError(600, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.publishLast(function (_xs) {\n      return _xs.zip(_xs, add);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(600, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#publishLast zip dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.publishLast(function (_xs) {\n      return _xs.zip(_xs, add);\n    });\n  }, { disposed: 470 });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 470)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/publishvalue.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe,\n  created = ReactiveTest.created,\n  disposed = ReactiveTest.disposed,\n  subscribed = ReactiveTest.subscribed;\n\nObservable.addToPrototype({\n  publishValue: require('../observable/publishvalue'),\n  skip: require('../observable/skip'),\n  zip: require('../observable/zip')\n});\n\nfunction add(x, y) { return x + y; }\n\ntest('Observable#publishValue basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.createObserver();\n\n  var ys;\n  var subscription;\n  var connection;\n\n  scheduler.scheduleAbsolute(null, created, function () {\n    ys = xs.publishValue(1979);\n  });\n\n  scheduler.scheduleAbsolute(null, subscribed, function () {\n    subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, disposed, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 550, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 650, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 1979),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(520, 11)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 550),\n    subscribe(650, 800)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#publishValue error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onError(600, error)\n  );\n\n  var results = scheduler.createObserver();\n\n  var ys;\n  var subscription;\n  var connection;\n\n  scheduler.scheduleAbsolute(null, created, function () {\n    ys = xs.publishValue(1979);\n  });\n\n  scheduler.scheduleAbsolute(null, subscribed, function () {\n    subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, disposed, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 1979),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(520, 11),\n    onNext(560, 20),\n    onError(600, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#publishValue complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.createObserver();\n\n  var ys;\n  var subscription;\n  var connection;\n\n  scheduler.scheduleAbsolute(null, created, function () {\n    ys = xs.publishValue(1979);\n  });\n\n  scheduler.scheduleAbsolute(null, subscribed, function () {\n    subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, disposed, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 1979),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#publishValue dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var ys;\n  var subscription;\n  var connection;\n\n  var results = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, created, function () {\n    ys = xs.publishValue(1979);\n  });\n\n  scheduler.scheduleAbsolute(null, subscribed, function () {\n    subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 350, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 550, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 650, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 1979),\n    onNext(340, 8)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 550),\n    subscribe(650, 800)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#publishValue multiple connections', function (t) {\n  var xs = Observable.never();\n  var ys = xs.publishValue(1979);\n\n  var connection1 = ys.connect();\n  var connection2 = ys.connect();\n\n  t.ok(connection1 === connection2);\n\n  connection1.dispose();\n  connection2.dispose();\n\n  var connection3 = ys.connect();\n  t.ok(connection1 !== connection3);\n\n  t.end();\n});\n\ntest('Observable#publishValue zip complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.publishValue(function (_xs) {\n      return _xs.zip(_xs.skip(1), add);\n    }, 1979);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 1982),\n    onNext(280, 7),\n    onNext(290, 5),\n    onNext(340, 9),\n    onNext(360, 13),\n    onNext(370, 11),\n    onNext(390, 13),\n    onNext(410, 20),\n    onNext(430, 15),\n    onNext(450, 11),\n    onNext(520, 20),\n    onNext(560, 31),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#publishValue zip error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onError(600, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.publishValue(function (_xs) {\n      return _xs.zip(_xs.skip(1), add);\n    }, 1979);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 1982),\n    onNext(280, 7),\n    onNext(290, 5),\n    onNext(340, 9),\n    onNext(360, 13),\n    onNext(370, 11),\n    onNext(390, 13),\n    onNext(410, 20),\n    onNext(430, 15),\n    onNext(450, 11),\n    onNext(520, 20),\n    onNext(560, 31),\n    onError(600, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#publishValue zip dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.publishValue(function (_xs) {\n      return _xs.zip(_xs.skip(1), add);\n    }, 1979);\n  }, { disposed: 470 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 1982),\n    onNext(280, 7),\n    onNext(290, 5),\n    onNext(340, 9),\n    onNext(360, 13),\n    onNext(370, 11),\n    onNext(390, 13),\n    onNext(410, 20),\n    onNext(430, 15),\n    onNext(450, 11)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 470)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/race.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  race: require('../observable/race'),\n  never: require('../observable/never')\n});\n\nObservable.addToPrototype({\n  race: require('../observable/race'),\n  tap: require('../observable/tap')\n});\n\ntest('Observable.race never 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var l = Observable.never();\n  var r = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return l.race(r);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable.race never 3', function (t) {\n  var scheduler = new TestScheduler();\n\n  var n1 = Observable.never();\n  var n2 = Observable.never();\n  var n3 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.race(n1, n2, n3);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable.race never empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var n = Observable.never();\n  var e = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(225)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return n.race(e);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(225)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.race empty never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var n = Observable.never();\n  var e = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(225));\n\n  var results = scheduler.startScheduler(function () {\n    return e.race(n);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(225)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.race regular should dispose loser', function (t) {\n  var scheduler = new TestScheduler();\n\n  var sourceNotDisposed = false;\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(240)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 3),\n    onCompleted(250)).tap(function () { return sourceNotDisposed = true; });\n\n  var results = scheduler.startScheduler(function () {\n    return o1.race(o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onCompleted(240)\n  ]);\n\n  t.ok(!sourceNotDisposed);\n\n  t.end();\n});\n\ntest('Observable.race WinnerThrows', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var sourceNotDisposed = false;\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(220, error)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 3),\n    onCompleted(250)).tap(function () { return sourceNotDisposed = true; });\n\n  var results = scheduler.startScheduler(function () {\n    return o1.race(o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onError(220, error)\n  ]);\n\n  t.ok(!sourceNotDisposed);\n\n  t.end();\n});\n\ntest('Observable.race loser throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var sourceNotDisposed = false;\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onError(230, error)).tap(function () { return sourceNotDisposed = true; });\n\n  var o2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 3),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return o1.race(o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 3), onCompleted(250)\n  ]);\n\n  t.ok(!sourceNotDisposed);\n\n  t.end();\n});\n\ntest('Observable.race throws before election', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var sourceNotDisposed = false;\n\n  var o1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error)\n  );\n\n  var o2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 3),\n    onCompleted(250)).tap(function () { return sourceNotDisposed = true; });\n\n  var results = scheduler.startScheduler(function () {\n    return o1.race(o2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.ok(!sourceNotDisposed);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/range.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n    onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  range: require('../observable/range')\n});\n\ntest('Observable.range zero', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.range(0, 0, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(201)\n  ]);\n  t.end();\n});\n\ntest('Observable.range one', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.range(0, 1, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 0),\n    onCompleted(202)\n  ]);\n  t.end();\n});\n\ntest('Observable.range five', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.range(10, 5, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 10),\n    onNext(202, 11),\n    onNext(203, 12),\n    onNext(204, 13),\n    onNext(205, 14),\n    onCompleted(206)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.range dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.range(-10, 5, scheduler);\n  }, { disposed: 204 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, -10),\n    onNext(202, -9),\n    onNext(203, -8)\n  ]);\n  \n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/reduce.js",
    "content": "'use strict';\n\nfunction add(x, y) { return x + y; }\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar EmptyError = require('../internal/errors').EmptyError;\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  reduce: require('../observable/reduce')\n});\n\ntest('Observable#reduce with seed empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.reduce(add, 42);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 42),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#reduce with seed return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 24),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.reduce(add, 42);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 42 + 24),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#reduce with seed throws error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 24),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.reduce(function () { throw error; }, 42);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#reduce with seed throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.reduce(add, 42);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#reduce with seed never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.reduce(add, 42);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#reduce with seed range', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 0),\n    onNext(220, 1),\n    onNext(230, 2),\n    onNext(240, 3),\n    onNext(250, 4),\n    onCompleted(260)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.reduce(add, 42);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(260, 10 + 42),\n    onCompleted(260)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#reduce without seed empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(onNext(150, 1), onCompleted(250));\n  var results = scheduler.startScheduler(function () {\n    return xs.reduce(add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(250, function (n) { return n.error instanceof EmptyError; })\n  ]);\n\n  t.end();\n});\n\ntest('Observable#reduce without seed return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 24),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.reduce(add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 24),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#reduce without seed throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.reduce(add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#reduce without seed never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.reduce(add);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#reduce without seed range', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 0),\n    onNext(220, 1),\n    onNext(230, 2),\n    onNext(240, 3),\n    onNext(250, 4), onCompleted(260)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.reduce(add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(260, 10),\n    onCompleted(260)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#reduce without seed throws error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 24),\n    onNext(220, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.reduce(function () { throw error; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/refcountdisposable.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar RefCountDisposable = require('../refcountdisposable');\n\nfunction BooleanDisposable() {\n  this.isDisposed = false;\n}\n\nBooleanDisposable.prototype.dispose = function () {\n  !this.isDisposed && (this.isDisposed = true);\n};\n\ntest('RefCountDisposable single reference', function (t) {\n  var d = new BooleanDisposable();\n  var r = new RefCountDisposable(d);\n  t.notOk(d.isDisposed, 'should not be disposed');\n  r.dispose();\n  t.ok(d.isDisposed, 'should be disposed');\n  r.dispose();\n  t.ok(d.isDisposed, 'should still be disposed');\n\n  t.end();\n});\n\ntest('RefCountDisposable ref counting', function (t) {\n  var d = new BooleanDisposable();\n  var r = new RefCountDisposable(d);\n  t.notOk(d.isDisposed, 'should not be disposed');\n\n  var d1 = r.getDisposable();\n  var d2 = r.getDisposable();\n  t.notOk(d.isDisposed, 'after two getDisposable() calls should not be disposed');\n\n  d1.dispose();\n  t.notOk(d.isDisposed, 'after one dispose() should not be disposed');\n\n  d2.dispose();\n  t.notOk(d.isDisposed, 'after two dispose() should be disposed');\n\n  r.dispose();\n  t.ok(d.isDisposed, 'the outer should be disposed');\n  t.ok(r.isDisposed, 'the ref counted should be disposed');\n\n  var d3 = r.getDisposable(); // CHECK\n  d3.dispose();\n\n  t.end();\n});\n\ntest('RefCountDisposable primary disposes first', function (t) {\n  var d = new BooleanDisposable();\n  var r = new RefCountDisposable(d);\n  t.notOk(d.isDisposed, 'should not be disposed after creation');\n\n  var d1 = r.getDisposable();\n  var d2 = r.getDisposable();\n  t.notOk(d.isDisposed, 'should not be disposed after two getDisposable() calls');\n\n  d1.dispose();\n  t.notOk(d.isDisposed, 'should not be disposed after one dispose() call');\n\n  r.dispose();\n  t.notOk(d.isDisposed, 'should not dispose outer if inner has refs');\n\n  d2.dispose();\n  t.ok(d.isDisposed, 'should dispose outer if dispose() called twice');\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/repeat.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToObject({\n  create: require('../observable/create'),\n  just: require('../observable/just'),\n  repeat: require('../observable/repeatvalue'),\n  'throw': require('../observable/throw')\n});\n\nObservable.addToPrototype({\n  repeat: require('../observable/repeat')\n});\n\ntest('Observable#repeat value count zero', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.repeat(42, 0, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(201)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#repeat value count one', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.repeat(42, 1, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 42),\n    onCompleted(202)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#repeat value count ten', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.repeat(42, 10, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 42),\n    onNext(202, 42),\n    onNext(203, 42),\n    onNext(204, 42),\n    onNext(205, 42),\n    onNext(206, 42),\n    onNext(207, 42),\n    onNext(208, 42),\n    onNext(209, 42),\n    onNext(210, 42),\n    onCompleted(211)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#repeat value count dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.repeat(42, 10, scheduler);\n  }, { disposed: 207 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 42),\n    onNext(202, 42),\n    onNext(203, 42),\n    onNext(204, 42),\n    onNext(205, 42),\n    onNext(206, 42)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#repeat value', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.repeat(42, -1, scheduler);\n  }, { disposed: 207 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 42),\n    onNext(202, 42),\n    onNext(203, 42),\n    onNext(204, 42),\n    onNext(205, 42),\n    onNext(206, 42)\n  ]);\n\n  t.end();\n});\n\nfunction noop() { }\n\ntest('Observable#repeat Observable basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(100, 1),\n    onNext(150, 2),\n    onNext(200, 3),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.repeat();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 1),\n    onNext(350, 2),\n    onNext(400, 3),\n    onNext(550, 1),\n    onNext(600, 2),\n    onNext(650, 3),\n    onNext(800, 1),\n    onNext(850, 2),\n    onNext(900, 3)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 450),\n    subscribe(450, 700),\n    subscribe(700, 950),\n    subscribe(950, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#repeat Observable infinite', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(100, 1),\n    onNext(150, 2),\n    onNext(200, 3));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.repeat();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 1),\n    onNext(350, 2),\n    onNext(400, 3)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#repeat Observable error', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var xs = scheduler.createColdObservable(\n    onNext(100, 1),\n    onNext(150, 2),\n    onNext(200, 3),\n    onError(250, error));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.repeat();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 1),\n    onNext(350, 2),\n    onNext(400, 3),\n    onError(450, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 450)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#repeat Observable throws', function (t) {\n  var scheduler1 = new TestScheduler();\n  var xs = Observable.just(1, scheduler1).repeat();\n\n  xs.subscribe(function () {\n    throw new Error();\n  });\n\n  t.throws(function () {\n    scheduler1.start();\n  });\n\n  var scheduler2 = new TestScheduler();\n  var ys = Observable['throw'](new Error(), scheduler2).repeat();\n\n  ys.subscribe(noop, function () {\n    throw new Error();\n  });\n\n  t.throws(function () {\n    scheduler2.start();\n  });\n\n  var scheduler3 = new TestScheduler();\n  var zs = Observable.just(1, scheduler3).repeat();\n\n  var d = zs.subscribe(noop, noop, function () { throw new Error(); });\n\n  scheduler3.scheduleAbsolute(null, 210, function () {\n    d.dispose();\n  });\n\n  scheduler3.start();\n\n  var xss = Observable.create(function () { throw new Error(); }).repeat();\n\n  t.throws(function () {\n    xss.subscribe();\n  });\n\n  t.end();\n});\n\ntest('Observable#repeat Observable repeat count Basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(5, 1),\n    onNext(10, 2),\n    onNext(15, 3),\n    onCompleted(20));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.repeat(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(205, 1),\n    onNext(210, 2),\n    onNext(215, 3),\n    onNext(225, 1),\n    onNext(230, 2),\n    onNext(235, 3),\n    onNext(245, 1),\n    onNext(250, 2),\n    onNext(255, 3),\n    onCompleted(260)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 220),\n    subscribe(220, 240),\n    subscribe(240, 260)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#repeat Observable repeat count dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(5, 1),\n    onNext(10, 2),\n    onNext(15, 3),\n    onCompleted(20));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.repeat(3);\n  }, { disposed: 231 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(205, 1),\n    onNext(210, 2),\n    onNext(215, 3),\n    onNext(225, 1),\n    onNext(230, 2)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 220),\n    subscribe(220, 231)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#repeat Observable repeat count infinite', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(100, 1),\n    onNext(150, 2),\n    onNext(200, 3)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.repeat(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 1),\n    onNext(350, 2),\n    onNext(400, 3)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#repeat Observable repeat count error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(100, 1),\n    onNext(150, 2),\n    onNext(200, 3),\n    onError(250, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.repeat(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 1),\n    onNext(350, 2),\n    onNext(400, 3),\n    onError(450, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 450)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#repeat Observable repeat count throws', function (t) {\n  var scheduler1 = new TestScheduler();\n  var xs = Observable.just(1, scheduler1).repeat(3);\n\n  xs.subscribe(function () { throw new Error(); });\n\n  t.throws(function () {\n    return scheduler1.start();\n  });\n\n  var scheduler2 = new TestScheduler();\n  var ys = Observable['throw'](new Error(), scheduler2).repeat(3);\n\n  ys.subscribe(noop, function () { throw new Error(); });\n\n  t.throws(function () {\n    scheduler2.start();\n  });\n\n  var scheduler3 = new TestScheduler();\n  var zs = Observable.just(1, scheduler3).repeat(100);\n\n  var d = zs.subscribe(noop, noop, function () { throw new Error(); });\n\n  scheduler3.scheduleAbsolute(null, 10, function () {\n    d.dispose();\n  });\n\n  scheduler3.start();\n\n  var xss = Observable.create(function () { throw new Error(); }).repeat(3);\n\n  t.throws(function () {\n    xss.subscribe();\n  });\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/repeatwhen.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToObject({\n  empty: require('../observable/empty'),\n  never: require('../observable/never')\n});\n\nObservable.addToPrototype({\n  repeatWhen: require('../observable/repeatwhen'),\n  scan: require('../observable/scan'),\n  takeWhile: require('../observable/takewhile')\n});\n\ntest('Observable#repeatWhen never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.repeatWhen(function () {\n      return Observable.empty(scheduler);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#repeatWhen Observable never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.repeatWhen(function () {\n      return Observable.never();\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#repeatWhen Observable never complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.repeatWhen(function () {\n      return Observable.never();\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#repeatWhen Observable Empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(100, 1),\n    onNext(150, 2),\n    onNext(200, 3),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.repeatWhen(function() {\n      return Observable.empty(scheduler);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 1),\n    onNext(350, 2),\n    onNext(400, 3),\n    onCompleted(450)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 450)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#repeatWhen Observable Next Error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(10, 1),\n    onNext(20, 2),\n    onError(30, error),\n    onCompleted(40)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.repeatWhen(function(attempts) {\n      return attempts.scan(function(count) {\n        if(++count === 2) {\n          throw error;\n        }\n        return count;\n      }, 0); // returning any nexting observable should cause a continue\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(220, 2),\n    onError(230, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#repeatWhen Observable complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(10, 1),\n    onNext(20, 2),\n    onCompleted(30)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.repeatWhen(function() {\n      return Observable.empty(scheduler); // a completing observable completes\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#repeatWhen Observable next complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(10, 1),\n    onNext(20, 2),\n    onCompleted(30)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.repeatWhen(function(attempts) {\n      return attempts.scan(function(count) {\n        return count + 1;\n      }, 0).takeWhile(function(count) {\n        return count < 2;\n      }); // returning any nexting observable should cause a continue\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(240, 1),\n    onNext(250, 2),\n    onCompleted(260)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230),\n    subscribe(230, 260)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#repeatWhen Observable infinite', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(10, 1),\n    onNext(20, 2),\n    onCompleted(30)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.repeatWhen(function(){\n      return Observable.never();\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(220, 2)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/replay.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe,\n  created = ReactiveTest.created,\n  disposed = ReactiveTest.disposed;\n\nObservable.addToObject({\n  never: require('../observable/never')\n});\n\nObservable.addToPrototype({\n  repeat: require('../observable/repeat'),\n  replay: require('../observable/replay'),\n  take: require('../observable/take')\n});\n\ntest('Observable#replay count basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.createObserver();\n\n  var ys;\n  var subscription;\n  var connection;\n\n  scheduler.scheduleAbsolute(null, created, function () {\n    ys = xs.replay(null, 3, null, scheduler);\n  });\n\n  scheduler.scheduleAbsolute(null, 450, function () {\n    subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, disposed, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 550, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 650, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(451, 5),\n    onNext(452, 6),\n    onNext(453, 7),\n    onNext(521, 11)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 550),\n    subscribe(650, 800)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#replay count error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onError(600, error)\n  );\n\n  var results = scheduler.createObserver();\n\n  var ys;\n  var subscription;\n  var connection;\n\n  scheduler.scheduleAbsolute(null, created, function () {\n     ys = xs.replay(null, 3, null, scheduler);\n  });\n\n  scheduler.scheduleAbsolute(null, 450, function () {\n    subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, disposed, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(451, 5),\n    onNext(452, 6),\n    onNext(453, 7),\n    onNext(521, 11),\n    onNext(561, 20),\n    onError(601, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#replay count complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.createObserver();\n\n  var ys;\n  var subscription;\n  var connection;\n\n  scheduler.scheduleAbsolute(null, created, function () {\n    ys = xs.replay(null, 3, null, scheduler);\n  });\n\n  scheduler.scheduleAbsolute(null, 450, function () {\n    subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, disposed, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(451, 5),\n    onNext(452, 6),\n    onNext(453, 7),\n    onNext(521, 11),\n    onNext(561, 20),\n    onCompleted(601)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#replay count dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(onNext(110, 7), onNext(220, 3), onNext(280, 4), onNext(290, 1), onNext(340, 8), onNext(360, 5), onNext(370, 6), onNext(390, 7), onNext(410, 13), onNext(430, 2), onNext(450, 9), onNext(520, 11), onNext(560, 20), onCompleted(600));\n\n  var results = scheduler.createObserver();\n\n  var ys;\n  var subscription;\n  var connection;\n\n  scheduler.scheduleAbsolute(null, created, function () {\n    ys = xs.replay(null, 3, null, scheduler);\n  });\n\n  scheduler.scheduleAbsolute(null, 450, function () {\n    subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 475, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 550, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 650, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(451, 5),\n    onNext(452, 6),\n    onNext(453, 7)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 550),\n    subscribe(650, 800)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#replay count multiple connections', function (t) {\n  var xs = Observable.never();\n  var ys = xs.replay(null, 3);\n\n  var connection1 = ys.connect();\n  var connection2 = ys.connect();\n  t.ok(connection1 === connection2);\n\n  connection1.dispose();\n  connection2.dispose();\n\n  var connection3 = ys.connect();\n  t.ok(connection1 !== connection3);\n\n  t.end();\n});\n\ntest('Observable#replay count function zip complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.replay(function (_xs) {\n      return _xs.take(6).repeat();\n    }, 3, null, scheduler);\n  }, {disposed: 610 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(221, 3),\n    onNext(281, 4),\n    onNext(291, 1),\n    onNext(341, 8),\n    onNext(361, 5),\n    onNext(371, 6),\n    onNext(372, 8),\n    onNext(373, 5),\n    onNext(374, 6),\n    onNext(391, 7),\n    onNext(411, 13),\n    onNext(431, 2),\n    onNext(432, 7),\n    onNext(433, 13),\n    onNext(434, 2),\n    onNext(451, 9),\n    onNext(521, 11),\n    onNext(561, 20),\n    onNext(562, 9),\n    onNext(563, 11),\n    onNext(564, 20),\n    onNext(602, 9),\n    onNext(603, 11),\n    onNext(604, 20),\n    onNext(606, 9),\n    onNext(607, 11),\n    onNext(608, 20)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#replay count function zip error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onError(600, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.replay(function (_xs) {\n      return _xs.take(6).repeat();\n    }, 3, null, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(221, 3),\n    onNext(281, 4),\n    onNext(291, 1),\n    onNext(341, 8),\n    onNext(361, 5),\n    onNext(371, 6),\n    onNext(372, 8),\n    onNext(373, 5),\n    onNext(374, 6),\n    onNext(391, 7),\n    onNext(411, 13),\n    onNext(431, 2),\n    onNext(432, 7),\n    onNext(433, 13),\n    onNext(434, 2),\n    onNext(451, 9),\n    onNext(521, 11),\n    onNext(561, 20),\n    onNext(562, 9),\n    onNext(563, 11),\n    onNext(564, 20),\n    onError(601, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#replay count function zip dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.replay(function (_xs) {\n      return _xs.take(6).repeat();\n    }, 3, null, scheduler);\n  }, { disposed: 470 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(221, 3),\n    onNext(281, 4),\n    onNext(291, 1),\n    onNext(341, 8),\n    onNext(361, 5),\n    onNext(371, 6),\n    onNext(372, 8),\n    onNext(373, 5),\n    onNext(374, 6),\n    onNext(391, 7),\n    onNext(411, 13),\n    onNext(431, 2),\n    onNext(432, 7),\n    onNext(433, 13),\n    onNext(434, 2),\n    onNext(451, 9)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 470)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#replay time basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.createObserver();\n\n  var ys;\n  var subscription;\n  var connection;\n\n  scheduler.scheduleAbsolute(null, created, function () {\n    ys = xs.replay(null, null, 150, scheduler);\n  });\n\n  scheduler.scheduleAbsolute(null, 450, function () {\n    subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, disposed, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n  connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 550, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 650, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(451, 8),\n    onNext(452, 5),\n    onNext(453, 6),\n    onNext(454, 7),\n    onNext(521, 11)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 550),\n    subscribe(650, 800)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#replay time error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onError(600, error)\n   );\n\n  var results = scheduler.createObserver();\n\n  var ys;\n  var subscription;\n  var connection;\n\n  scheduler.scheduleAbsolute(null, created, function () {\n    ys = xs.replay(null, null, 75, scheduler);\n  });\n\n  scheduler.scheduleAbsolute(null, 450, function () {\n    subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, disposed, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(451, 7),\n    onNext(521, 11),\n    onNext(561, 20),\n    onError(601, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#replay time complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(onNext(110, 7), onNext(220, 3), onNext(280, 4), onNext(290, 1), onNext(340, 8), onNext(360, 5), onNext(370, 6), onNext(390, 7), onNext(410, 13), onNext(430, 2), onNext(450, 9), onNext(520, 11), onNext(560, 20), onCompleted(600));\n\n  var results = scheduler.createObserver();\n\n  var ys;\n  var subscription;\n  var connection;\n\n  scheduler.scheduleAbsolute(null, created, function () {\n    ys = xs.replay(null, null, 85, scheduler);\n  });\n\n  scheduler.scheduleAbsolute(null, 450, function () {\n    subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, disposed, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(451, 6),\n    onNext(452, 7),\n    onNext(521, 11),\n    onNext(561, 20),\n    onCompleted(601)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#replay time dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.createObserver();\n\n  var ys;\n  var subscription;\n  var connection;\n\n  scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.replay(null, null, 100, scheduler);\n  });\n\n  scheduler.scheduleAbsolute(null, 450, function () {\n    subscription = ys.subscribe(results);\n  });\n\n  scheduler.scheduleAbsolute(null, 475, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 500, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 550, function () {\n      connection.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 650, function () {\n    connection = ys.connect();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    connection.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results.messages, [\n    onNext(451, 5),\n    onNext(452, 6),\n    onNext(453, 7)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(300, 400),\n    subscribe(500, 550),\n    subscribe(650, 800)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#replay time multiple connections', function (t) {\n  var xs = Observable.never();\n  var ys = xs.replay(null, null, 100);\n\n  var connection1 = ys.connect();\n  var connection2 = ys.connect();\n  t.ok(connection1 === connection2);\n\n  connection1.dispose();\n  connection2.dispose();\n\n  var connection3 = ys.connect();\n  t.ok(connection1 !== connection3);\n\n  t.end();\n});\n\ntest('Observable#replay time function zip complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.replay(function (_xs) {\n      return _xs.take(6).repeat();\n    }, null, 50, scheduler);\n  }, { disposed: 610 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(221, 3),\n    onNext(281, 4),\n    onNext(291, 1),\n    onNext(341, 8),\n    onNext(361, 5),\n    onNext(371, 6),\n    onNext(372, 8),\n    onNext(373, 5),\n    onNext(374, 6),\n    onNext(391, 7),\n    onNext(411, 13),\n    onNext(431, 2),\n    onNext(432, 7),\n    onNext(433, 13),\n    onNext(434, 2),\n    onNext(451, 9),\n    onNext(521, 11),\n    onNext(561, 20),\n    onNext(562, 11),\n    onNext(563, 20),\n    onNext(602, 20),\n    onNext(604, 20),\n    onNext(606, 20),\n    onNext(608, 20)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#replay time function zip error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onError(600, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.replay(function (_xs) {\n      return _xs.take(6).repeat();\n    }, null, 50, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(221, 3),\n    onNext(281, 4),\n    onNext(291, 1),\n    onNext(341, 8),\n    onNext(361, 5),\n    onNext(371, 6),\n    onNext(372, 8),\n    onNext(373, 5),\n    onNext(374, 6),\n    onNext(391, 7),\n    onNext(411, 13),\n    onNext(431, 2),\n    onNext(432, 7),\n    onNext(433, 13),\n    onNext(434, 2),\n    onNext(451, 9),\n    onNext(521, 11),\n    onNext(561, 20),\n    onNext(562, 11),\n    onNext(563, 20),\n    onError(601, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#replay time function zip dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 7),\n    onNext(220, 3),\n    onNext(280, 4),\n    onNext(290, 1),\n    onNext(340, 8),\n    onNext(360, 5),\n    onNext(370, 6),\n    onNext(390, 7),\n    onNext(410, 13),\n    onNext(430, 2),\n    onNext(450, 9),\n    onNext(520, 11),\n    onNext(560, 20),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.replay(function (_xs) {\n      return _xs.take(6).repeat();\n    }, null, 50, scheduler);\n  }, { disposed: 470 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(221, 3),\n    onNext(281, 4),\n    onNext(291, 1),\n    onNext(341, 8),\n    onNext(361, 5),\n    onNext(371, 6),\n    onNext(372, 8),\n    onNext(373, 5),\n    onNext(374, 6),\n    onNext(391, 7),\n    onNext(411, 13),\n    onNext(431, 2),\n    onNext(432, 7),\n    onNext(433, 13),\n    onNext(434, 2),\n    onNext(451, 9)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 470)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/replaysubject.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar ReplaySubject = require('../replaysubject');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n    onError = ReactiveTest.onError,\n    onCompleted = ReactiveTest.onCompleted;\n\ntest('ReplaySubject Infinite', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 1),\n    onNext(110, 2),\n    onNext(220, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(410, 6),\n    onNext(520, 7),\n    onNext(630, 8),\n    onNext(710, 9),\n    onNext(870, 10),\n    onNext(940, 11),\n    onNext(1020, 12)\n  );\n\n  var subject, subscription, subscription1, subscription2, subscription3;\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, 100, function () { subject = new ReplaySubject(3, 100, scheduler); });\n  scheduler.scheduleAbsolute(null, 200, function () { subscription = xs.subscribe(subject); });\n  scheduler.scheduleAbsolute(null, 1000, function () { subscription.dispose(); });\n\n  scheduler.scheduleAbsolute(null, 300, function () { subscription1 = subject.subscribe(results1); });\n  scheduler.scheduleAbsolute(null, 400, function () { subscription2 = subject.subscribe(results2); });\n  scheduler.scheduleAbsolute(null, 900, function () { subscription3 = subject.subscribe(results3); });\n\n  scheduler.scheduleAbsolute(null, 600, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n  scheduler.scheduleAbsolute(null, 800, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 950, function () { subscription3.dispose(); });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(301, 3),\n    onNext(302, 4),\n    onNext(341, 5),\n    onNext(411, 6),\n    onNext(521, 7)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(401, 5),\n    onNext(411, 6),\n    onNext(521, 7),\n    onNext(631, 8)\n  ]);\n\n  reactiveAssert(t, results3.messages, [\n    onNext(901, 10),\n    onNext(941, 11)\n  ]);\n\n  t.end();\n});\n\ntest('ReplaySubject Infinite 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 1),\n    onNext(110, 2),\n    onNext(220, 3),\n    onNext(270, 4),\n    onNext(280, -1),\n    onNext(290, -2),\n    onNext(340, 5),\n    onNext(410, 6),\n    onNext(520, 7),\n    onNext(630, 8),\n    onNext(710, 9),\n    onNext(870, 10),\n    onNext(940, 11),\n    onNext(1020, 12)\n  );\n\n  var subject, subscription, subscription1, subscription2, subscription3;\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, 100, function () { subject = new ReplaySubject(3, 100, scheduler); });\n  scheduler.scheduleAbsolute(null, 200, function () { subscription = xs.subscribe(subject); });\n  scheduler.scheduleAbsolute(null, 1000, function () { subscription.dispose(); });\n\n  scheduler.scheduleAbsolute(null, 300, function () { subscription1 = subject.subscribe(results1); });\n  scheduler.scheduleAbsolute(null, 400, function () { subscription2 = subject.subscribe(results2); });\n  scheduler.scheduleAbsolute(null, 900, function () { subscription3 = subject.subscribe(results3); });\n\n  scheduler.scheduleAbsolute(null, 600, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n  scheduler.scheduleAbsolute(null, 800, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 950, function () { subscription3.dispose(); });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(301, 4),\n    onNext(302, -1),\n    onNext(303, -2),\n    onNext(341, 5),\n    onNext(411, 6),\n    onNext(521, 7)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(401, 5),\n    onNext(411, 6),\n    onNext(521, 7),\n    onNext(631, 8)\n  ]);\n\n  reactiveAssert(t, results3.messages, [\n    onNext(901, 10),\n    onNext(941, 11)\n  ]);\n\n  t.end();\n});\n\ntest('ReplaySubject Finite', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 1),\n    onNext(110, 2),\n    onNext(220, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(410, 6),\n    onNext(520, 7),\n    onCompleted(630),\n    onNext(640, 9),\n    onCompleted(650),\n    onError(660, new Error())\n  );\n\n  var subject, subscription, subscription1, subscription2, subscription3;\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, 100, function () { subject = new ReplaySubject(3, 100, scheduler); });\n  scheduler.scheduleAbsolute(null, 200, function () { subscription = xs.subscribe(subject); });\n  scheduler.scheduleAbsolute(null, 1000, function () { subscription.dispose(); });\n\n  scheduler.scheduleAbsolute(null, 300, function () { subscription1 = subject.subscribe(results1); });\n  scheduler.scheduleAbsolute(null, 400, function () { subscription2 = subject.subscribe(results2); });\n  scheduler.scheduleAbsolute(null, 900, function () { subscription3 = subject.subscribe(results3); });\n\n  scheduler.scheduleAbsolute(null, 600, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n  scheduler.scheduleAbsolute(null, 800, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 950, function () { subscription3.dispose(); });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(301, 3),\n    onNext(302, 4),\n    onNext(341, 5),\n    onNext(411, 6),\n    onNext(521, 7)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(401, 5),\n    onNext(411, 6),\n    onNext(521, 7),\n    onCompleted(631)\n  ]);\n\n  reactiveAssert(t, results3.messages, [\n    onCompleted(901)\n  ]);\n\n  t.end();\n});\n\ntest('ReplaySubject Error', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var xs = scheduler.createHotObservable(\n      onNext(70, 1),\n      onNext(110, 2),\n      onNext(220, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(410, 6),\n      onNext(520, 7),\n      onError(630, error),\n      onNext(640, 9),\n      onCompleted(650),\n      onError(660, new Error(new Error()))\n  );\n\n  var subject, subscription, subscription1, subscription2, subscription3;\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, 100, function () { subject = new ReplaySubject(3, 100, scheduler); });\n  scheduler.scheduleAbsolute(null, 200, function () { subscription = xs.subscribe(subject); });\n  scheduler.scheduleAbsolute(null, 1000, function () { subscription.dispose(); });\n\n  scheduler.scheduleAbsolute(null, 300, function () { subscription1 = subject.subscribe(results1); });\n  scheduler.scheduleAbsolute(null, 400, function () { subscription2 = subject.subscribe(results2); });\n  scheduler.scheduleAbsolute(null, 900, function () { subscription3 = subject.subscribe(results3); });\n\n  scheduler.scheduleAbsolute(null, 600, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n  scheduler.scheduleAbsolute(null, 800, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 950, function () { subscription3.dispose(); });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(301, 3),\n    onNext(302, 4),\n    onNext(341, 5),\n    onNext(411, 6),\n    onNext(521, 7)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(401, 5),\n    onNext(411, 6),\n    onNext(521, 7),\n    onError(631, error)\n  ]);\n\n  reactiveAssert(t, results3.messages, [\n    onError(901, error)\n  ]);\n\n  t.end();\n});\n\ntest('ReplaySubject Canceled', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onCompleted(630),\n    onNext(640, 9),\n    onCompleted(650),\n    onError(660, new Error())\n  );\n\n  var subject, subscription, subscription1, subscription2, subscription3;\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, 100, function () { subject = new ReplaySubject(3, 100, scheduler); });\n  scheduler.scheduleAbsolute(null, 200, function () { subscription = xs.subscribe(subject); });\n  scheduler.scheduleAbsolute(null, 1000, function () { subscription.dispose(); });\n\n  scheduler.scheduleAbsolute(null, 300, function () { subscription1 = subject.subscribe(results1); });\n  scheduler.scheduleAbsolute(null, 400, function () { subscription2 = subject.subscribe(results2); });\n  scheduler.scheduleAbsolute(null, 900, function () { subscription3 = subject.subscribe(results3); });\n\n  scheduler.scheduleAbsolute(null, 600, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n  scheduler.scheduleAbsolute(null, 800, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 950, function () { subscription3.dispose(); });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onCompleted(631)\n  ]);\n\n  reactiveAssert(t, results3.messages, [\n    onCompleted(901)\n  ]);\n\n  t.end();\n});\n\ntest('ReplaySubject Disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var subject, subscription1, subscription2, subscription3;\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, 100, function () { subject = new ReplaySubject(undefined, undefined, scheduler); });\n  scheduler.scheduleAbsolute(null, 200, function () { subscription1 = subject.subscribe(results1); });\n  scheduler.scheduleAbsolute(null, 300, function () { subscription2 = subject.subscribe(results2); });\n  scheduler.scheduleAbsolute(null, 400, function () { subscription3 = subject.subscribe(results3); });\n  scheduler.scheduleAbsolute(null, 500, function () { subscription1.dispose(); });\n  scheduler.scheduleAbsolute(null, 600, function () { subject.dispose(); });\n  scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n  scheduler.scheduleAbsolute(null, 800, function () { subscription3.dispose(); });\n\n  scheduler.scheduleAbsolute(null, 150, function () { subject.onNext(1); });\n  scheduler.scheduleAbsolute(null, 250, function () { subject.onNext(2); });\n  scheduler.scheduleAbsolute(null, 350, function () { subject.onNext(3); });\n  scheduler.scheduleAbsolute(null, 450, function () { subject.onNext(4); });\n  scheduler.scheduleAbsolute(null, 550, function () { subject.onNext(5); });\n  scheduler.scheduleAbsolute(null, 650, function () { t.throws(function () { subject.onNext(6); }); });\n  scheduler.scheduleAbsolute(null, 750, function () { t.throws(function () { subject.onCompleted(); }); });\n  scheduler.scheduleAbsolute(null, 850, function () { t.throws(function () { subject.onError(new Error()); }); });\n  scheduler.scheduleAbsolute(null, 950, function () { t.throws(function () { subject.subscribe(); }); });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(201, 1),\n    onNext(251, 2),\n    onNext(351, 3),\n    onNext(451, 4)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(301, 1),\n    onNext(302, 2),\n    onNext(351, 3),\n    onNext(451, 4),\n    onNext(551, 5)\n  ]);\n\n  reactiveAssert(t, results3.messages, [\n    onNext(401, 1),\n    onNext(402, 2),\n    onNext(403, 3),\n    onNext(451, 4),\n    onNext(551, 5)\n  ]);\n\n  t.end();\n});\n\ntest('ReplaySubject Dies out', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 1),\n    onNext(110, 2),\n    onNext(220, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(410, 6),\n    onNext(520, 7),\n    onCompleted(580)\n  );\n\n  var subject;\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n  var results4 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, 100, function () { subject = new ReplaySubject(Number.MAX_VALUE, 100, scheduler); });\n  scheduler.scheduleAbsolute(null, 200, function () { xs.subscribe(subject); });\n\n  scheduler.scheduleAbsolute(null, 300, function () { subject.subscribe(results1); });\n  scheduler.scheduleAbsolute(null, 400, function () { subject.subscribe(results2); });\n  scheduler.scheduleAbsolute(null, 600, function () { subject.subscribe(results3); });\n  scheduler.scheduleAbsolute(null, 900, function () { subject.subscribe(results4); });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(301, 3),\n    onNext(302, 4),\n    onNext(341, 5),\n    onNext(411, 6),\n    onNext(521, 7),\n    onCompleted(581)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(401, 5),\n    onNext(411, 6),\n    onNext(521, 7),\n    onCompleted(581)\n  ]);\n\n  reactiveAssert(t, results3.messages, [\n    onNext(601, 7),\n    onCompleted(602)\n  ]);\n\n  reactiveAssert(t, results4.messages, [\n    onCompleted(901)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/retry.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToObject({\n  create: require('../observable/create'),\n  just: require('../observable/just'),\n  'throw': require('../observable/throw')\n});\n\nObservable.addToPrototype({\n  retry: require('../observable/retry')\n});\n\nfunction noop() { }\n\ntest('Observable#retry Observable basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(100, 1),\n    onNext(150, 2),\n    onNext(200, 3),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.retry();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 1),\n    onNext(350, 2),\n    onNext(400, 3),\n    onCompleted(450)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 450)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#retry Observable infinite', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(100, 1),\n    onNext(150, 2),\n    onNext(200, 3)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.retry();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 1),\n    onNext(350, 2),\n    onNext(400, 3)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#retry Observable error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(100, 1),\n    onNext(150, 2),\n    onNext(200, 3),\n    onError(250, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.retry();\n  }, { disposed: 1100 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 1),\n    onNext(350, 2),\n    onNext(400, 3),\n    onNext(550, 1),\n    onNext(600, 2),\n    onNext(650, 3),\n    onNext(800, 1),\n    onNext(850, 2),\n    onNext(900, 3),\n    onNext(1050, 1)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 450),\n    subscribe(450, 700),\n    subscribe(700, 950),\n    subscribe(950, 1100)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#retry Observable throws', function (t) {\n  var scheduler1 = new TestScheduler();\n\n  var xs = Observable.just(1, scheduler1).retry();\n\n  xs.subscribe(function () {\n    throw new Error();\n  });\n\n  t.throws(function () {\n    return scheduler1.start();\n  });\n\n  var scheduler2 = new TestScheduler();\n\n  var ys = Observable['throw'](new Error(), scheduler2).retry();\n\n  var d = ys.subscribe(noop, function (err) { throw err; });\n\n  scheduler2.scheduleAbsolute(null, 210, function () {\n    return d.dispose();\n  });\n\n  scheduler2.start();\n\n  var scheduler3 = new TestScheduler();\n\n  var zs = Observable.just(1, scheduler3).retry();\n\n  zs.subscribe(noop, noop, function () { throw new Error(); });\n\n  t.throws(function () {\n    return scheduler3.start();\n  });\n\n  t.end();\n});\n\ntest('Observable#retry Observable retry count basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var xs = scheduler.createColdObservable(\n    onNext(5, 1),\n    onNext(10, 2),\n    onNext(15, 3),\n    onError(20, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.retry(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(205, 1),\n    onNext(210, 2),\n    onNext(215, 3),\n    onNext(225, 1),\n    onNext(230, 2),\n    onNext(235, 3),\n    onNext(245, 1),\n    onNext(250, 2),\n    onNext(255, 3),\n    onError(260, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 220),\n    subscribe(220, 240),\n    subscribe(240, 260)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#retry Observable retry count dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var xs = scheduler.createColdObservable(\n    onNext(5, 1),\n    onNext(10, 2),\n    onNext(15, 3),\n    onError(20, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.retry(3);\n  }, { disposed: 231 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(205, 1),\n    onNext(210, 2),\n    onNext(215, 3),\n    onNext(225, 1),\n    onNext(230, 2)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 220),\n    subscribe(220, 231)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#retry retry count dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(100, 1),\n    onNext(150, 2),\n    onNext(200, 3)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.retry(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 1),\n    onNext(350, 2),\n    onNext(400, 3)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#retry Observable retry count dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(100, 1),\n    onNext(150, 2),\n    onNext(200, 3),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.retry(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 1),\n    onNext(350, 2),\n    onNext(400, 3),\n    onCompleted(450)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 450)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#retry Observable retry count Throws', function (t) {\n  var scheduler1 = new TestScheduler();\n\n  var xs = Observable.just(1, scheduler1).retry(3);\n\n  xs.subscribe(function () {\n    throw new Error();\n  });\n\n  t.throws(function () {\n    return scheduler1.start();\n  });\n\n  var scheduler2 = new TestScheduler();\n\n  var ys = Observable['throw'](new Error(), scheduler2).retry(100);\n\n  var d = ys.subscribe(noop, function (err) { throw err; });\n\n  scheduler2.scheduleAbsolute(null, 10, function () {\n    return d.dispose();\n  });\n\n  scheduler2.start();\n\n  var scheduler3 = new TestScheduler();\n\n  var zs = Observable.just(1, scheduler3).retry(100);\n\n  zs.subscribe(noop, noop, function () { throw new Error(); });\n\n  t.throws(function () {\n    return scheduler3.start();\n  });\n\n  var xss = Observable.create(function () { throw new Error(); }).retry(100);\n\n  t.throws(function () {\n    return xss.subscribe();\n  });\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/retrywhen.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToObject({\n  empty: require('../observable/empty'),\n  never: require('../observable/never')\n});\n\nObservable.addToPrototype({\n  retryWhen: require('../observable/retrywhen'),\n  scan: require('../observable/scan'),\n  takeWhile: require('../observable/takewhile')\n});\n\ntest('Observable#retryWhen never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.retryWhen(function () {\n      return Observable.empty(scheduler);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#retryWhen Observable never', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onError(250, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.retryWhen(function () {\n      return Observable.never();\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#retryWhen Observable never complete', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.retryWhen(function () {\n      return Observable.never();\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#retryWhen Observable Empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(100, 1),\n    onNext(150, 2),\n    onNext(200, 3),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.retryWhen(function() {\n      return Observable.empty(scheduler);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 1),\n    onNext(350, 2),\n    onNext(400, 3),\n    onCompleted(450)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 450)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#retryWhen Observable Next Error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(10, 1),\n    onNext(20, 2),\n    onError(30, error),\n    onCompleted(40)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.retryWhen(function(attempts) {\n      return attempts.scan(function(count) {\n        if(++count === 2) {\n          throw error;\n        }\n        return count;\n      }, 0); // returning any nexting observable should cause a continue\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(240, 1),\n    onNext(250, 2),\n    onError(260, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230),\n    subscribe(230, 260)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#retryWhen Observable complete', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(10, 1),\n    onNext(20, 2),\n    onError(30, error),\n    onCompleted(40)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.retryWhen(function() {\n      return Observable.empty(scheduler); // a completing observable completes\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#retryWhen Observable next complete', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(10, 1),\n    onNext(20, 2),\n    onError(30, error),\n    onCompleted(40)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.retryWhen(function(attempts) {\n      return attempts.scan(function(count) {\n        return count + 1;\n      }, 0).takeWhile(function(count) {\n        return count < 2;\n      }); // returning any nexting observable should cause a continue\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(240, 1),\n    onNext(250, 2),\n    onCompleted(260)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230),\n    subscribe(230, 260)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#retryWhen Observable infinite', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createColdObservable(\n    onNext(10, 1),\n    onNext(20, 2),\n    onError(30, error),\n    onCompleted(40)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.retryWhen(function(){\n      return Observable.never();\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(220, 2)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/sample.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  sample: require('../observable/sample')\n});\n\ntest('Observable#sample regular', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(260, 4),\n    onNext(300, 5),\n    onNext(350, 6),\n    onNext(380, 7),\n    onCompleted(390)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sample(50, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 3),\n    onNext(300, 5),\n    onNext(350, 6),\n    onNext(400, 7),\n    onCompleted(400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sample error in flight', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(260, 4),\n    onNext(300, 5),\n    onNext(310, 6),\n    onError(330, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sample(50, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 3),\n    onNext(300, 5),\n    onError(330, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sample empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sample(0, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sample Error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sample(0, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sample never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sample(0, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#sample sampler simple 1', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(300, 5),\n    onNext(310, 6),\n    onCompleted(400)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(150, ''),\n    onNext(210, 'bar'),\n    onNext(250, 'foo'),\n    onNext(260, 'qux'),\n    onNext(320, 'baz'),\n    onCompleted(500)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sample(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 3),\n    onNext(320, 6),\n    onCompleted(500 /* on sampling boundaries only */)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sample sampler simple 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(300, 5),\n    onNext(310, 6),\n    onNext(360, 7),\n    onCompleted(400)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(150, ''),\n    onNext(210, 'bar'),\n    onNext(250, 'foo'),\n    onNext(260, 'qux'),\n    onNext(320, 'baz'),\n    onCompleted(500)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sample(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 3),\n    onNext(320, 6),\n    onNext(500, 7),\n    onCompleted(500 /* on sampling boundaries only */)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sample sampler simple 3', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onCompleted(300)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(150, ''),\n    onNext(210, 'bar'),\n    onNext(250, 'foo'),\n    onNext(260, 'qux'),\n    onNext(320, 'baz'),\n    onCompleted(500)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sample(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 3),\n    onNext(320, 4),\n    onCompleted(320 /* on sampling boundaries only */)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 300)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 320)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sample completes if earlier completes', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onCompleted(300)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(150, ''),\n    onCompleted(210)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sample(ys);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 300)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sample sampler source throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(300, 5),\n    onNext(310, 6),\n    onError(320, error)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(150, ''),\n    onNext(210, 'bar'),\n    onNext(250, 'foo'),\n    onNext(260, 'qux'),\n    onNext(330, 'baz'),\n    onCompleted(400)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sample(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 3),\n    onError(320, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 320)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 320)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/scan.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nfunction add(x, y) { return x + y; }\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  scan: require('../observable/scan')\n});\n\ntest('Observable#scan with seed throws error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 24),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.scan(function () { throw error; }, 42);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#scan with seed never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var seed = 42;\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.scan(add, seed);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#scan with seed empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var seed = 42;\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.scan(add, seed);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 42),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#scan with seed return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var seed = 42;\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.scan(add, seed);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, seed + 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#scan with seed throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var seed = 42;\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(250, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.scan(add, seed);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(250, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#scan with seed some data', function (t) {\n  var scheduler = new TestScheduler();\n\n  var seed = 1;\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.scan(add, seed);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, seed + 2),\n    onNext(220, seed + 2 + 3),\n    onNext(230, seed + 2 + 3 + 4),\n    onNext(240, seed + 2 + 3 + 4 + 5),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#scan no seed never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.scan(function (acc, x) {\n      return acc + x;\n    });\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#scan no seed empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(onNext(150, 1), onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.scan(function (acc, x) {\n      return acc + x;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#scan no seed return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.scan(function (acc, x) {\n      acc === undefined && (acc = 0);\n      return acc + x;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#scan no seed throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(250, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.scan(function (acc, x) {\n      acc === undefined && (acc = 0);\n      return acc + x;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(250, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#scan no seed some data', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.scan(function (acc, x) {\n      acc === undefined && (acc = 0);\n      return acc + x;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 2 + 3),\n    onNext(230, 2 + 3 + 4),\n    onNext(240, 2 + 3 + 4 + 5),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#scan without seed throws error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.scan(function () { throw error; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/scheduler.js",
    "content": "'use strict';\n\nvar Scheduler = require('../scheduler');\nvar Disposable = require('../disposable');\nvar inherits = require('inherits');\nvar test = require('tape');\n\nfunction MyScheduler(now) {\n  if (now !== undefined) { this.now = function () { return now; }; }\n  this.waitCycles = 0;\n  Scheduler.call(this);\n}\n\ninherits(MyScheduler, Scheduler);\n\nMyScheduler.prototype.schedule = function (state, action) {\n  return action(this, state);\n};\n\nMyScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n  var self = this;\n  this.check(function (o) { return action(self, o); }, state, dueTime);\n  this.waitCycles += dueTime;\n  return action(this, state);\n};\n\ntest('scheduler schedule non-recursive', function (t) {\n  var ms = new MyScheduler();\n\n  var res = false;\n\n  ms.scheduleRecursive(null, function () { res = true; });\n\n  t.ok(res);\n  t.end();\n});\n\ntest('scheduler schedule recursive', function (t) {\n  var ms = new MyScheduler();\n\n  var i = 0;\n\n  ms.scheduleRecursive(null, function (_, a) { ++i < 10 && a(); });\n\n  t.equal(10, i);\n  t.end();\n});\n\ntest('scheduler schedule with time non-recursive', function (t) {\n  var now = new Date();\n\n  var ms = new MyScheduler(now);\n\n  var res = false;\n\n  ms.check = function (a, s, t) { t.equal(t, 0); };\n  ms.scheduleFuture(null, now, function () { res = true; });\n\n  t.ok(res);\n\n  t.equal(ms.waitCycles, 0);\n\n  t.end();\n});\n\ntest('scheduler schedule with absolute time recursive', function (t) {\n  var now = new Date();\n\n  var i = 0;\n\n  var ms = new MyScheduler(now);\n\n  ms.check = function (a, s, t) { t.equal(t, 0); };\n\n  ms.scheduleRecursiveFuture(null, now, function (_, a) {\n    ++i < 10 && a(null, now);\n  });\n\n  t.equal(ms.waitCycles, 0);\n  t.equal(10, i);\n  t.end();\n});\n\ntest('scheduler schedule with relative time non-recursive', function (t) {\n  var now = new Date().getTime();\n\n  var ms = new MyScheduler(now);\n\n  ms.check = function (a, s, t) { t.equal(t, 0);   };\n\n  var res = false;\n  ms.scheduleRecursiveFuture(null, 0, function () { res = true; });\n\n  t.ok(res);\n  t.equal(ms.waitCycles, 0);\n  t.end();\n});\n\ntest('scheduler schedule with time recursive', function (t) {\n  var now = +new Date();\n\n  var i = 0;\n\n  var ms = new MyScheduler(now);\n\n  ms.check = function (a, s, tt) {\n    return t.ok(tt < 10);\n  };\n\n  ms.scheduleRecursiveFuture(null, 0, function (_, a) {\n    ++i < 10 && a(null, i);\n  });\n\n  t.equal(ms.waitCycles, 45);\n  t.equal(10, i);\n  t.end();\n});\n\ntest('catch builtin swallow shallow', function (t) {\n  var swallow = Scheduler.immediate['catch'](function () { return true; });\n\n  swallow.schedule(null, function () { throw new Error('Should be swallowed'); });\n\n  t.ok(true);\n  t.end();\n});\n\ntest('catch builtin swallow recursive', function (t) {\n  var swallow = Scheduler.immediate['catch'](function () { return true; });\n\n  swallow.schedule(42, function (self) {\n    return self.schedule(null, function () { new Error('Should be swallowed'); });\n  });\n\n  t.ok(true);\n  t.end();\n});\n\nfunction MyErrorScheduler(onError) {\n  this._onError = onError;\n  Scheduler.call(this);\n}\n\ninherits(MyErrorScheduler, Scheduler);\n\nMyErrorScheduler.prototype.schedule = function (state, action) {\n  try {\n    return action(this, state);\n  } catch (e) {\n    this._onError(e);\n    return Disposable.empty;\n  }\n};\n\nMyErrorScheduler.prototype.schedulePeriodic = function (state, period, action) {\n  Scheduler.immediate.schedule(this, function (_, self) {\n    try {\n      var s = state;\n      for(var i = 0; true; i++) {\n        if (i > 10) { break; }\n        s = action(s);\n      }\n    } catch (e) {\n      self._onError(e);\n    }\n  });\n};\n\ntest('catch custom unhandled', function (t) {\n  var err;\n\n  var scheduler = new MyErrorScheduler(function (ex) { err = ex; });\n\n  scheduler\n    ['catch'](function () { return true; })\n    .schedule(null, function () { throw new Error('Should be caught'); });\n\n  t.ok(!err);\n\n  var ex1 = 'error';\n  scheduler\n    ['catch'](function () { return ex1 instanceof Error; })\n    .schedule(null, function () { throw ex1; });\n\n  t.equal(err, ex1);\n  t.end();\n});\n\ntest('catch custom periodic caught', function (t) {\n  var err;\n\n  var scheduler = new MyErrorScheduler(function (ex) { err = ex; });\n\n  var catcher = scheduler['catch'](function () { return true; });\n\n  catcher.schedulePeriodic(42, 0, function () {\n    throw new Error('Should be caught');\n  });\n\n  t.ok(!err);\n  t.end();\n});\n\ntest('catch custom periodic uncaught', function (t) {\n  var ex = new Error('Error1');\n\n  var err;\n\n  var scheduler = new MyErrorScheduler(function (e) { err = e; });\n\n  var catcher = scheduler['catch'](function (e) { return e instanceof String; });\n\n  catcher.schedulePeriodic(42, 0, function () { throw ex; });\n\n  t.equal(err, ex);\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/sequenceequal.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  sequenceEqual: require('../observable/sequenceequal')\n});\n\ntest('Observable#sequenceEqual equal', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(450, 7),\n    onCompleted(510)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(270, 3),\n    onNext(280, 4),\n    onNext(300, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onCompleted(720)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sequenceEqual(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(720, true),\n    onCompleted(720)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 720)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 720)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sequenceEqual equal sym', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(450, 7),\n    onCompleted(510)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(270, 3),\n    onNext(280, 4),\n    onNext(300, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onCompleted(720)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return ys.sequenceEqual(xs);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(720, true),\n    onCompleted(720)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 720)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 720)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sequenceEqual not equal Left', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(310, 0),\n    onNext(340, 6),\n    onNext(450, 7),\n    onCompleted(510)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(270, 3),\n    onNext(280, 4),\n    onNext(300, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onCompleted(720)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sequenceEqual(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, false),\n    onCompleted(310)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 310)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 310)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sequenceEqual not equal left sym', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(310, 0),\n    onNext(340, 6),\n    onNext(450, 7),\n    onCompleted(510)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(270, 3),\n    onNext(280, 4),\n    onNext(300, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onCompleted(720)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return ys.sequenceEqual(xs);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, false),\n    onCompleted(310)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 310)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 310)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sequenceEqual not equal right', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(450, 7),\n    onCompleted(510)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(270, 3),\n    onNext(280, 4),\n    onNext(300, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onNext(350, 8)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sequenceEqual(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(510, false),\n    onCompleted(510)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 510)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 510)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sequenceEqual not equal right sym', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(450, 7),\n    onCompleted(510)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(270, 3),\n    onNext(280, 4),\n    onNext(300, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onNext(350, 8)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return ys.sequenceEqual(xs);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(510, false),\n    onCompleted(510)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 510)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 510)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sequenceEqual not equal 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(450, 7),\n    onNext(490, 8),\n    onNext(520, 9),\n    onNext(580, 10),\n    onNext(600, 11)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(270, 3),\n    onNext(280, 4),\n    onNext(300, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onNext(350, 9),\n    onNext(400, 9),\n    onNext(410, 10),\n    onNext(490, 11),\n    onNext(550, 12),\n    onNext(560, 13)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sequenceEqual(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(490, false),\n    onCompleted(490)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 490)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 490)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sequenceEqual not equal 2 sym', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(450, 7),\n    onNext(490, 8),\n    onNext(520, 9),\n    onNext(580, 10),\n    onNext(600, 11)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(270, 3),\n    onNext(280, 4),\n    onNext(300, 5),\n    onNext(330, 6),\n    onNext(340, 7),\n    onNext(350, 9),\n    onNext(400, 9),\n    onNext(410, 10),\n    onNext(490, 11),\n    onNext(550, 12),\n    onNext(560, 13)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return ys.sequenceEqual(xs);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(490, false),\n    onCompleted(490)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 490)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 490)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sequenceEqual not equal 3', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(310, 5),\n    onCompleted(330)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(270, 3),\n    onNext(400, 4),\n    onCompleted(420)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sequenceEqual(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(420, false),\n    onCompleted(420)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sequenceEqual not equal 3 sym', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(310, 5),\n    onCompleted(330)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(270, 3),\n    onNext(400, 4),\n    onCompleted(420)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return ys.sequenceEqual(xs);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(420, false),\n    onCompleted(420)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sequenceEqual comparer throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(310, 5),\n    onCompleted(330)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(270, 3),\n    onNext(400, 4),\n    onCompleted(420)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sequenceEqual(ys, function () { throw error; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(270, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 270)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 270)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sequenceEqual comparer throws sym', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(310, 5),\n    onCompleted(330)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(270, 3),\n    onNext(400, 4),\n    onCompleted(420)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return ys.sequenceEqual(xs, function () { throw error; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(270, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 270)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 270)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sequenceEqual not equal 4', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(250, 1),\n    onCompleted(300)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(290, 1),\n    onNext(310, 2),\n    onCompleted(350)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sequenceEqual(ys);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, false),\n    onCompleted(310)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 310)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 310)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sequenceEqual not equal 4 sym', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(250, 1),\n    onCompleted(300)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(290, 1),\n    onNext(310, 2),\n    onCompleted(350)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return ys.sequenceEqual(xs);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, false),\n    onCompleted(310)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 310)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 310)\n  ]);\n\n  t.end();\n});\n\n// SequenceEqual Array\ntest('Observable#sequenceEqual iterable equal', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(450, 7),\n    onCompleted(510)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sequenceEqual([3, 4, 5, 6, 7]);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(510, true),\n    onCompleted(510)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 510)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sequenceEqual iterable not equal elements', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(450, 7),\n    onCompleted(510)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sequenceEqual([3, 4, 9, 6, 7]);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, false),\n    onCompleted(310)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 310)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sequenceEqual iterable comparer equal', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(450, 7),\n    onCompleted(510)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sequenceEqual([3 - 2, 4, 5, 6 + 42, 7 - 6], function (x, y) {\n      return x % 2 === y % 2;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(510, true),\n    onCompleted(510)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 510)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sequenceEqual iterable comparer not equal', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(450, 7),\n    onCompleted(510)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sequenceEqual([3 - 2, 4, 5 + 9, 6 + 42, 7 - 6], function (x, y) {\n      return x % 2 === y % 2;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, false),\n    onCompleted(310)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 310)\n  ]);\n\n  t.end();\n});\n\nfunction throwComparer(value, exn) {\n  return function (x, y) {\n    if (x === value) { throw exn; }\n    return x === y;\n  };\n}\n\ntest('Observable#sequenceEqual iterable comparer throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(450, 7),\n    onCompleted(510)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sequenceEqual([3, 4, 5, 6, 7], throwComparer(5, error));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(310, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 310)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sequenceEqual iterable not equal too long', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(450, 7),\n    onCompleted(510)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sequenceEqual([3, 4, 5, 6, 7, 8]);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(510, false),\n    onCompleted(510)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 510)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sequenceEqual iterable not equal too short', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(450, 7),\n    onCompleted(510)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sequenceEqual([3, 4, 5, 6]);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(450, false),\n    onCompleted(450)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 450)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sequenceEqual iterable on error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(190, 2),\n    onNext(240, 3),\n    onNext(290, 4),\n    onError(310, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sequenceEqual([3, 4]);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(310, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 310)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/serialdisposable.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar SerialDisposable = require('../serialdisposable');\nvar Disposable = require('../disposable');\n\n\ntest('SerialDisposable#constructor', function (t) {\n  var m = new SerialDisposable();\n\n  t.ok(!m.getDisposable(), 'should not have a disposable');\n\n  t.end();\n});\n\ntest('SerialDisposable replace before dispose()', function (t) {\n  var disp1 = false;\n  var disp2 = false;\n\n  var m = new SerialDisposable();\n\n  var d1 = Disposable.create(function () { disp1 = true; });\n  m.setDisposable(d1);\n\n  t.equal(d1, m.getDisposable(), 'should have a disposable set');\n  t.ok(!disp1, 'should not be disposed');\n\n  var d2 = Disposable.create(function () { disp2 = true; });\n  m.setDisposable(d2);\n\n  t.equal(d2, m.getDisposable(), 'should have a new disposable set');\n  t.ok(disp1, 'first should be disposed');\n  t.ok(!disp2, 'next should not be disposed');\n\n  t.end();\n});\n\ntest('SerialDisposable replace after dispose', function (t) {\n  var disp1 = false;\n  var disp2 = false;\n\n  var m = new SerialDisposable();\n  m.dispose();\n\n  var d1 = Disposable.create(function () { disp1 = true; });\n  m.setDisposable(d1);\n\n  t.equal(null, m.getDisposable(), 'should not have a set disposable after dispose');\n  t.ok(disp1, 'should be disposed');\n\n  var d2 = Disposable.create(function () { disp2 = true; });\n  m.setDisposable(d2);\n\n  t.equal(null, m.getDisposable(), 'should not have a set disposable after dispose');\n  t.ok(disp2, 'should be disposed');\n\n  t.end();\n});\n\ntest('SerialDisposable#dispose', function (t) {\n  var disp = false;\n\n  var m = new SerialDisposable();\n  var d = Disposable.create(function () { disp = true; });\n  m.setDisposable(d);\n\n  t.equal(d, m.getDisposable(), 'should have set the disposable');\n  t.ok(!disp, 'should not be disposed before dispose()');\n\n  m.dispose();\n\n  t.ok(disp, 'should be disposed after dispose()');\n  t.equal(null, m.getDisposable(), 'should clear the current disposable');\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/singleassignmentdisposable.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar SingleAssignmentDisposable = require('../singleassignmentdisposable');\nvar Disposable = require('../disposable');\n\ntest('SingleAssignmentDisposable setDisposable null', function (t) {\n  var d = new SingleAssignmentDisposable();\n\n  d.setDisposable(null);\n\n  t.equal(null, d.getDisposable(), 'getDisposable should return null');\n\n  t.end();\n});\n\ntest('SingleAssignmentDisposable dispose after set', function (t) {\n  var disposed = false,\n      d = new SingleAssignmentDisposable(),\n      dd = Disposable.create(function () { disposed = true; });\n\n  d.setDisposable(dd);\n  t.equal(dd, d.getDisposable(), 'should have set the disposable via setDisposable');\n  t.ok(!disposed, 'should not be disposed');\n\n  d.dispose();\n  t.ok(disposed, 'should be disposed after dispose()');\n\n  d.dispose();\n  t.ok(disposed, 'should be idempotent after dispose()');\n\n  t.end();\n});\n\ntest('SingleAssignmentDisposable dispose before setDisposable', function (t) {\n  var disposed = false,\n      d = new SingleAssignmentDisposable(),\n      dd = Disposable.create(function () { disposed = true; });\n  t.ok(!disposed, 'should not be disposed');\n\n  d.dispose();\n  t.ok(!disposed, 'should not be disposed after disposed');\n\n  d.setDisposable(dd);\n  t.ok(d.getDisposable() == null, 'should not set disposable');\n  t.ok(disposed, 'should be disposed after setDisposable');\n\n  d.dispose();\n  t.ok(disposed, 'calling dispose should dispose idempotent');\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/skip.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  skip: require('../observable/skip')\n});\n\ntest('Observable#skip complete after', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 6),\n    onNext(150, 4),\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onCompleted(690)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skip(20);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(690)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 690)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skip complete same', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 6),\n    onNext(150, 4),\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onCompleted(690)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skip(17);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(690)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 690)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skip complete before', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 6),\n    onNext(150, 4),\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onCompleted(690)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skip(10);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onCompleted(690)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 690)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skip complete zero', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 6),\n    onNext(150, 4),\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onCompleted(690)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skip(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onCompleted(690)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 690)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skip error after', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 6),\n    onNext(150, 4),\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onError(690, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skip(20);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(690, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 690)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skip error same', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 6),\n    onNext(150, 4),\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onError(690, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skip(17);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(690, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 690)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skip error before', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 6),\n    onNext(150, 4),\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onError(690, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skip(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onError(690, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 690)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skip dispose before', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 6),\n    onNext(150, 4),\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skip(3);\n  }, { disposed: 250 });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skip dispose after', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 6),\n    onNext(150, 4),\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skip(3);\n  }, { disposed: 400 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/skiplast.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  skipLast: require('../observable/skiplast')\n});\n\ntest('Observable#skipLast zero completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onCompleted(650)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipLast(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onCompleted(650)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipLast zero error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onError(650, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipLast(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onError(650, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipLast zero disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipLast(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipLast one completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onCompleted(650)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipLast(1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 2),\n    onNext(270, 3),\n    onNext(310, 4),\n    onNext(360, 5),\n    onNext(380, 6),\n    onNext(410, 7),\n    onNext(590, 8),\n    onCompleted(650)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipLast one error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onError(650, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipLast(1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 2),\n    onNext(270, 3),\n    onNext(310, 4),\n    onNext(360, 5),\n    onNext(380, 6),\n    onNext(410, 7),\n    onNext(590, 8),\n    onError(650, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipLast one disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipLast(1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 2),\n    onNext(270, 3),\n    onNext(310, 4),\n    onNext(360, 5),\n    onNext(380, 6),\n    onNext(410, 7),\n    onNext(590, 8)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipLast three completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onCompleted(650)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipLast(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 2),\n    onNext(360, 3),\n    onNext(380, 4),\n    onNext(410, 5),\n    onNext(590, 6),\n    onCompleted(650)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipLast three error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onError(650, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipLast(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 2),\n    onNext(360, 3),\n    onNext(380, 4),\n    onNext(410, 5),\n    onNext(590, 6),\n    onError(650, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipLast three disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipLast(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 2),\n    onNext(360, 3),\n    onNext(380, 4),\n    onNext(410, 5),\n    onNext(590, 6)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/skiplastwithtime.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  skipLastWithTime: require('../observable/skiplastwithtime')\n});\n\ntest('Observable#skipLastWithTime zero 1', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipLastWithTime(0, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipLastWithTime zero 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipLastWithTime(0, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipLastWithTime some 1', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipLastWithTime(15, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 1),\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipLastWithTime some 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onNext(240, 4),\n    onNext(250, 5),\n    onNext(260, 6),\n    onNext(270, 7),\n    onNext(280, 8),\n    onNext(290, 9),\n    onCompleted(300)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipLastWithTime(45, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(260, 1),\n    onNext(270, 2),\n    onNext(280, 3),\n    onNext(290, 4),\n    onNext(300, 5),\n    onCompleted(300)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 300)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipLastWithTime some all', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipLastWithTime(45, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipLastWithTime error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipLastWithTime(45, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipLastWithTime never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipLastWithTime(50, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/skipuntil.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  never: require('../observable/never')\n});\n\nObservable.addToPrototype({\n  skipUntil: require('../observable/skipuntil')\n});\n\ntest('Observable#skipUntil some data next', function (t) {\n  var scheduler = new TestScheduler();\n\n  var l = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var r = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(225, 99),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return l.skipUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipUntil some data error', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var l = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var r = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(225, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return l.skipUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(225, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipUntil some data empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var l = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var r = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(225)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return l.skipUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#skipUntil never next', function (t) {\n  var scheduler = new TestScheduler();\n\n  var l = Observable.never();\n\n  var r = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(225, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return l.skipUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#skipUntil never error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var l = Observable.never();\n\n  var r = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(225, error));\n\n  var results = scheduler.startScheduler(function () {\n    return l.skipUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(225, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipUntil some data never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var l = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var r = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return l.skipUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#skipUntil never empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var l = Observable.never();\n\n  var r = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(225)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return l.skipUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#skipUntil never never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var l = Observable.never();\n\n  var r = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return l.skipUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#skipUntil has completed causes disposal', function (t) {\n  var scheduler = new TestScheduler();\n\n  var disposed = false;\n\n  var l = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var r = Observable.create(function () {\n    return function () { disposed = true; };\n  });\n\n  var results = scheduler.startScheduler(function () {\n    return l.skipUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.ok(disposed);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/skipuntilwithtime.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  skipUntilWithTime: require('../observable/skipuntilwithtime')\n});\n\ntest('Observable#skipUntilWithTime zero', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipUntilWithTime(new Date(0), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipUntilWithTime late', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipUntilWithTime(new Date(250), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipUntilWithTime error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipUntilWithTime(new Date(250), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipUntilWithTime never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable();\n\n  var results = scheduler.startScheduler(function () {\n      return xs.skipUntilWithTime(new Date(250), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipUntil twice 1', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onNext(240, 4),\n    onNext(250, 5),\n    onNext(260, 6),\n    onCompleted(270)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs\n      .skipUntilWithTime(new Date(215), scheduler)\n      .skipUntilWithTime(new Date(230), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(240, 4),\n    onNext(250, 5),\n    onNext(260, 6),\n    onCompleted(270)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 270)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipUntil twice 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onNext(240, 4),\n    onNext(250, 5),\n    onNext(260, 6),\n    onCompleted(270)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs\n      .skipUntilWithTime(new Date(230), scheduler)\n      .skipUntilWithTime(new Date(215), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(240, 4),\n    onNext(250, 5),\n    onNext(260, 6),\n    onCompleted(270)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 270)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/skipwhile.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  skipWhile: require('../observable/skipwhile')\n});\n\nfunction isPrime(i) {\n  if (i <= 1) { return false; }\n  var max = Math.floor(Math.sqrt(i));\n  for (var j = 2; j <= max; ++j) {\n    if (i % j === 0) { return false; }\n  }\n  return true;\n}\n\ntest('Observable#skipWhile complete before', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, -1),\n    onNext(110, -1),\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onCompleted(330),\n    onNext(350, 7),\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onCompleted(600)\n  );\n\n  var invoked = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipWhile(function (x) {\n      invoked++;\n      return isPrime(x);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(330)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 330)\n  ]);\n\n  t.equal(4, invoked);\n\n  t.end();\n});\n\ntest('Observable#skipWhile complete after', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, -1),\n    onNext(110, -1),\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onCompleted(600)\n  );\n\n  var invoked = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipWhile(function (x) {\n        invoked++;\n        return isPrime(x);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.equal(6, invoked);\n\n  t.end();\n});\n\ntest('Observable#skipWhile error before', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, -1),\n    onNext(110, -1),\n    onNext(210, 2),\n    onNext(260, 5),\n    onError(270, error),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onCompleted(600)\n  );\n\n  var invoked = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipWhile(function (x) {\n      invoked++;\n      return isPrime(x);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(270, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 270)\n  ]);\n\n  t.equal(2, invoked);\n\n  t.end();\n});\n\ntest('Observable#skipWhile error after', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, -1),\n    onNext(110, -1),\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onError(600, error)\n  );\n\n  var invoked = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipWhile(function (x) {\n      invoked++;\n      return isPrime(x);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onError(600, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.equal(6, invoked);\n\n  t.end();\n});\n\ntest('Observable#skipWhile dispose before', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, -1),\n    onNext(110, -1),\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onCompleted(600)\n  );\n\n  var invoked = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipWhile(function (x) {\n      invoked++;\n      return isPrime(x);\n    });\n  }, { disposed: 300 });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 300)\n  ]);\n\n  t.equal(3, invoked);\n\n  t.end();\n});\n\ntest('Observable#skipWhile dispose after', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, -1),\n    onNext(110, -1),\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onCompleted(600)\n  );\n\n  var invoked = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipWhile(function (x) {\n      invoked++;\n      return isPrime(x);\n    });\n  }, { disposed: 470 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 470)\n  ]);\n\n  t.equal(6, invoked);\n\n  t.end();\n});\n\ntest('Observable#skipWhile zero', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, -1),\n    onNext(110, -1),\n    onNext(205, 100),\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onCompleted(600)\n  );\n\n  var invoked = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipWhile(function (x) {\n      invoked++;\n      return isPrime(x);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(205, 100),\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.equal(1, invoked);\n\n  t.end();\n});\n\ntest('Observable#skipWhile throw', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, -1),\n    onNext(110, -1),\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onCompleted(600)\n  );\n\n  var error = new Error();\n\n  var invoked = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipWhile(function (x) {\n      invoked++;\n      if (invoked === 3) { throw error; }\n      return isPrime(x);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(290, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 290)\n  ]);\n\n  t.equal(3, invoked);\n\n  t.end();\n});\n\ntest('Observable#skipWhile index', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, -1),\n    onNext(110, -1),\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipWhile(function (x, i) {\n      return i < 5;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/skipwithtime.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  skipWithTime: require('../observable/skipwithtime')\n});\n\ntest('Observable#skipWithTime zero', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipWithTime(0, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipWithTime some', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipWithTime(15, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 2),\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipWithTime late', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onCompleted(230));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipWithTime(50, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipWithTime error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipWithTime(50, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipWithTime never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable();\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipWithTime(50, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipWithTime twice 1', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onNext(240, 4),\n    onNext(250, 5),\n    onNext(260, 6),\n    onCompleted(270)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipWithTime(15, scheduler).skipWithTime(30, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(240, 4),\n    onNext(250, 5),\n    onNext(260, 6),\n    onCompleted(270)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 270)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#skipWithTime twice 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onNext(240, 4),\n    onNext(250, 5),\n    onNext(260, 6),\n    onCompleted(270)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.skipWithTime(30, scheduler).skipWithTime(15, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(240, 4),\n    onNext(250, 5),\n    onNext(260, 6),\n    onCompleted(270)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 270)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/slice.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  slice: require('../observable/slice')\n});\n\ntest('Observable#slice arguments', function (t) {\n  t.throws(function () {\n    Observable.of(1,2,3).slice(-1);\n  });\n\n  t.throws(function () {\n    Observable.of(1,2,3).slice(0, -1);\n  });\n\n  t.throws(function () {\n    Observable.of(1,2,3).slice(25, 1);\n  });\n\n  t.end();\n});\n\ntest('Observable#slice never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.slice(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n\n  ]);\n\n  t.end();\n});\n\ntest('Observable#slice empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.slice(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#slice error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(250, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.slice(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(250, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#slice single no end', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.slice(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#slice single end', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.slice(0, 1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#slice multiple no end', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.slice(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#slice multiple one no end', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.slice(1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#slice multiple no end error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onError(230, error),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.slice(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onError(230, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#slice multiple end', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.slice(0, 3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onCompleted(240)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#slice multiple one end', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.slice(1, 3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 3),\n    onNext(230, 4),\n    onCompleted(240)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#slice multiple end error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onError(230, error),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.slice(0, 3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onError(230, error)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/some.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  some: require('../observable/some')\n});\n\ntest('Observable#some predicate empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.some(function (x) { return x > 0; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, false),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#some predicate return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.some(function (x) { return x > 0; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, true),\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#some predicate return not match', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, -2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.some(function (x) { return x > 0; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, false),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#some predicate SomeNoneMatch', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, -2),\n    onNext(220, -3),\n    onNext(230, -4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.some(function (x) { return x > 0; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, false),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#some predicate some match', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, -2),\n    onNext(220, 3),\n    onNext(230, -4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.some(function (x) { return x > 0; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, true),\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#some predicate throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.some(function (x) { return x > 0; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#some predicate throws error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, -2),\n    onNext(220, 3),\n    onNext(230, -4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.some(function () { throw error; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#some predicate never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.some(function (x) { return x > 0; });\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/start.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  start: require('../observable/start'),\n  startAsync: require('../observable/startAsync')\n});\n\nfunction noop() {}\n\n// Polyfilling\nrequire('lie/polyfill');\n\ntest('Observable.startAsync', function (t) {\n  var source = Observable.startAsync(function () {\n    return new Promise(function (res) { res(42); });\n  });\n\n  source.subscribe(function (x) {\n    t.equal(42, x);\n    t.end();\n  });\n});\n\ntest('Observable.startAsync Error', function (t) {\n  var source = Observable.startAsync(function () {\n    return new Promise(function (res, rej) { rej(42); });\n  });\n\n  source.subscribe(noop, function (err) {\n    t.equal(42, err);\n    t.end();\n  });\n});\n\ntest('Observable.start action 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var done = false;\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.start(function () {\n      done = true;\n    }, null, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, undefined),\n    onCompleted(200)\n  ]);\n\n  t.ok(done);\n\n  t.end();\n});\n\ntest('Observable.start function 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.start(function () {\n      return 1;\n    }, null, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 1),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.start with error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.start(function () {\n      throw error;\n    }, null, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(200, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.start with context', function (t) {\n  var context = { value: 42 };\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.start(function () {\n      return this.value;\n    }, context, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 42),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/startwith.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Scheduler = require('../scheduler');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  startWith: require('../observable/startwith')\n});\n\ntest('Observable#startWith normal', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.startWith(1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 1),\n    onNext(220, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#startWith never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.startWith(scheduler, 1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 1)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#startWith empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.startWith(scheduler, 1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 1),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#startWith one', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.startWith(scheduler, 1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 1),\n    onNext(220, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#startWith multiple', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.startWith(scheduler, 1, 2, 3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 1),\n    onNext(202, 2),\n    onNext(203, 3),\n    onNext(220, 4),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#startWith error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(250, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.startWith(scheduler, 1, 2, 3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 1),\n    onNext(202, 2),\n    onNext(203, 3),\n    onError(250, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#startWith is unaffected by currentThread scheduler', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onCompleted(250)\n  );\n\n  var results;\n\n  Scheduler.queue.schedule(null, function () {\n    results = scheduler.startScheduler(function () {\n      return xs.startWith(scheduler, 1);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 1),\n    onNext(220, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/stopandwait.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  controlled: require('../observable/controlled')\n});\n\ntest('ControlledObservable#stopAndWait never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.controlled(true, scheduler).stopAndWait(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('ControlledObservable#stopAndWait empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.controlled(true, scheduler).stopAndWait(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('ControlledObservable#stopAndWait basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.controlled(true, scheduler).stopAndWait(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('ControlledObservable#stopAndWait error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onError(250, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.controlled(true, scheduler).stopAndWait(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onError(250, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('ControlledObservable#stopAndWait infinite', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.controlled(true, scheduler).stopAndWait(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('ControlledObservable#windowed disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onNext(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.controlled(true, scheduler).stopAndWait(scheduler);\n  }, { disposed: 235 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 235)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/subject.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Subject = require('../subject');\nvar Observable = require('../observable');\nvar Observer = require('../observer');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n    onError = ReactiveTest.onError,\n    onCompleted = ReactiveTest.onCompleted;\n\nObserver.addToObject({\n  create: require('../observer/create')\n});\n\nObservable.addToObject({\n  just: require('../observable/just')\n});\n\nSubject.addToObject({\n  create: require('../subject/create')\n});\n\ntest('Subject infinite', function (t) {\n  var s, subscription, subscription1, subscription2, subscription3;\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 1),\n    onNext(110, 2),\n    onNext(220, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(410, 6),\n    onNext(520, 7),\n    onNext(630, 8),\n    onNext(710, 9),\n    onNext(870, 10),\n    onNext(940, 11),\n    onNext(1020, 12)\n  );\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, 100, function () {\n    s = new Subject();\n  });\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = xs.subscribe(s);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    subscription1 = s.subscribe(results1);\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    subscription2 = s.subscribe(results2);\n  });\n\n  scheduler.scheduleAbsolute(null, 900, function () {\n    subscription3 = s.subscribe(results3);\n  });\n\n  scheduler.scheduleAbsolute(null, 600, function () {\n    subscription1.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 700, function () {\n    subscription2.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    subscription1.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 950, function () {\n    subscription3.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(340, 5),\n    onNext(410, 6),\n    onNext(520, 7)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(410, 6),\n    onNext(520, 7),\n    onNext(630, 8)\n  ]);\n\n  reactiveAssert(t, results3.messages, [\n    onNext(940, 11)\n  ]);\n\n  t.end();\n});\n\ntest('Subject finite', function (t) {\n  var s, subscription, subscription1, subscription2, subscription3;\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 1),\n    onNext(110, 2),\n    onNext(220, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(410, 6),\n    onNext(520, 7),\n    onCompleted(630),\n    onNext(640, 9),\n    onCompleted(650),\n    onError(660, new Error())\n  );\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, 100, function () {\n    s = new Subject();\n  });\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = xs.subscribe(s);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    subscription1 = s.subscribe(results1);\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    subscription2 = s.subscribe(results2);\n  });\n\n  scheduler.scheduleAbsolute(null, 900, function () {\n    subscription3 = s.subscribe(results3);\n  });\n\n  scheduler.scheduleAbsolute(null, 600, function () {\n    subscription1.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 700, function () {\n    subscription2.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    subscription1.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 950, function () {\n    subscription3.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(340, 5),\n    onNext(410, 6),\n    onNext(520, 7)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(410, 6),\n    onNext(520, 7),\n    onCompleted(630)\n  ]);\n\n  reactiveAssert(t, results3.messages, [\n    onCompleted(900)\n  ]);\n\n  t.end();\n});\n\ntest('Subject error', function (t) {\n  var s, subscription, subscription1, subscription2, subscription3;\n\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 1),\n    onNext(110, 2),\n    onNext(220, 3),\n    onNext(270, 4),\n    onNext(340, 5),\n    onNext(410, 6),\n    onNext(520, 7),\n    onError(630, error),\n    onNext(640, 9),\n    onCompleted(650),\n    onError(660, 'foo')\n  );\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, 100, function () {\n    s = new Subject();\n  });\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = xs.subscribe(s);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    subscription1 = s.subscribe(results1);\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    subscription2 = s.subscribe(results2);\n  });\n\n  scheduler.scheduleAbsolute(null, 900, function () {\n    subscription3 = s.subscribe(results3);\n  });\n\n  scheduler.scheduleAbsolute(null, 600, function () {\n    subscription1.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 700, function () {\n    subscription2.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    subscription1.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 950, function () {\n    subscription3.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, [\n    onNext(340, 5),\n    onNext(410, 6),\n    onNext(520, 7)\n  ]);\n\n  reactiveAssert(t, results2.messages, [\n    onNext(410, 6),\n    onNext(520, 7),\n    onError(630, error)\n  ]);\n\n  reactiveAssert(t, results3.messages, [\n    onError(900, error)\n  ]);\n\n  t.end();\n});\n\ntest('Subject canceled', function (t) {\n  var s, subscription, subscription1, subscription2, subscription3;\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onCompleted(630),\n    onNext(640, 9),\n    onCompleted(650),\n    onError(660, new Error())\n  );\n\n  var results1 = scheduler.createObserver();\n  var results2 = scheduler.createObserver();\n  var results3 = scheduler.createObserver();\n\n  scheduler.scheduleAbsolute(null, 100, function () {\n    s = new Subject();\n  });\n\n  scheduler.scheduleAbsolute(null, 200, function () {\n    subscription = xs.subscribe(s);\n  });\n\n  scheduler.scheduleAbsolute(null, 1000, function () {\n    subscription.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 300, function () {\n    subscription1 = s.subscribe(results1);\n  });\n\n  scheduler.scheduleAbsolute(null, 400, function () {\n    subscription2 = s.subscribe(results2);\n  });\n\n  scheduler.scheduleAbsolute(null, 900, function () {\n    subscription3 = s.subscribe(results3);\n  });\n\n  scheduler.scheduleAbsolute(null, 600, function () {\n    subscription1.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 700, function () {\n    subscription2.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 800, function () {\n    subscription1.dispose();\n  });\n\n  scheduler.scheduleAbsolute(null, 950, function () {\n    subscription3.dispose();\n  });\n\n  scheduler.start();\n\n  reactiveAssert(t, results1.messages, []);\n  reactiveAssert(t, results2.messages, [onCompleted(630)]);\n  reactiveAssert(t, results3.messages, [onCompleted(900)]);\n  t.end();\n});\n\ntest('Subject.create', function (t) {\n  var _x, _ex, done = false;\n\n  var v = Observer.create(\n    function (x) { _x = x; },\n    function (ex) { _ex = ex; },\n    function () { done = true; });\n\n  var o = Observable.just(42);\n\n  var s = Subject.create(v, o);\n  s.subscribe(function (x) { _x = x; });\n\n  t.equal(42, _x);\n  s.onNext(21);\n\n  var e = new Error();\n  s.onError(e);\n\n  t.equal(e, _ex);\n\n  s.onCompleted();\n  t.ok(!done);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/subscribeon.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  subscribeOn: require('../observable/subscribeon')\n});\n\ntest('Observable#subscribeOn normal', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.subscribeOn(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(201, 251)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#subscribeOn error', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.subscribeOn(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(201, 211)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#subscribeOn empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.subscribeOn(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(201, 251)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#subscribeOn never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.subscribeOn(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(201, 1001)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/sum.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  sum: require('../observable/sum')\n});\n\ntest('Observable#sum number empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sum();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 0),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sum number return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sum();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 2),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sum number some', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sum();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, 2 + 3 + 4),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sum number throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sum();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#sum number never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sum();\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#sum with selector regular number', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 'fo'),\n    onNext(220, 'b'),\n    onNext(230, 'qux'),\n    onCompleted(240)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.sum(function (x) {\n      return x.length;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(240, 6),\n    onCompleted(240)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 240)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/switch.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  fromArray: require('../observable/fromarray')\n});\n\nObservable.addToPrototype({\n  'switch': require('../observable/switch')\n});\n\ntest('Observable#switch Promise', function (t) {\n  var sources = Observable.fromArray([\n    Promise.resolve(0),\n    Promise.resolve(1),\n    Promise.resolve(2),\n    Promise.resolve(3)\n  ]);\n\n  sources['switch']().subscribe(function (x) {\n    t.equal(3, x);\n    t.end();\n  });\n});\n\ntest('Observable#switch Promise error', function (t) {\n  var sources = Observable.fromArray([\n    Promise.resolve(0),\n    Promise.resolve(1),\n    Promise.reject(2),\n    Promise.resolve(3)\n  ]);\n\n  sources['switch']().subscribe(function (x) {\n    t.equal(3, x);\n    t.end();\n  }, function (err) {\n    t.equal(2, err);\n    t.end();\n  });\n});\n\ntest('Observable#switch Data', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(300, scheduler.createColdObservable(\n      onNext(10, 101),\n      onNext(20, 102),\n      onNext(110, 103),\n      onNext(120, 104),\n      onNext(210, 105),\n      onNext(220, 106),\n      onCompleted(230))\n    ),\n    onNext(400, scheduler.createColdObservable(\n      onNext(10, 201),\n      onNext(20, 202),\n      onNext(30, 203),\n      onNext(40, 204),\n      onCompleted(50))\n    ),\n    onNext(500, scheduler.createColdObservable(\n      onNext(10, 301),\n      onNext(20, 302),\n      onNext(30, 303),\n      onNext(40, 304),\n      onCompleted(150))\n    ),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs['switch']();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 101),\n    onNext(320, 102),\n    onNext(410, 201),\n    onNext(420, 202),\n    onNext(430, 203),\n    onNext(440, 204),\n    onNext(510, 301),\n    onNext(520, 302),\n    onNext(530, 303),\n    onNext(540, 304),\n    onCompleted(650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#switch inner throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(300, scheduler.createColdObservable(\n      onNext(10, 101),\n      onNext(20, 102),\n      onNext(110, 103),\n      onNext(120, 104),\n      onNext(210, 105),\n      onNext(220, 106),\n      onCompleted(230))\n    ),\n    onNext(400, scheduler.createColdObservable(\n      onNext(10, 201),\n      onNext(20, 202),\n      onNext(30, 203),\n      onNext(40, 204),\n      onError(50, error))\n    ),\n    onNext(500, scheduler.createColdObservable(\n      onNext(10, 301),\n      onNext(20, 302),\n      onNext(30, 303),\n      onNext(40, 304),\n      onCompleted(150))\n    ),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs['switch']();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 101),\n    onNext(320, 102),\n    onNext(410, 201),\n    onNext(420, 202),\n    onNext(430, 203),\n    onNext(440, 204),\n    onError(450, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#switch outer throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(300, scheduler.createColdObservable(\n      onNext(10, 101),\n      onNext(20, 102),\n      onNext(110, 103),\n      onNext(120, 104),\n      onNext(210, 105),\n      onNext(220, 106),\n      onCompleted(230))\n    ),\n    onNext(400, scheduler.createColdObservable(\n      onNext(10, 201),\n      onNext(20, 202),\n      onNext(30, 203),\n      onNext(40, 204),\n      onCompleted(50))\n    ),\n    onError(500, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs['switch']();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 101),\n    onNext(320, 102),\n    onNext(410, 201),\n    onNext(420, 202),\n    onNext(430, 203),\n    onNext(440, 204),\n    onError(500, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#switch no inner', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onCompleted(500)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs['switch']();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#switch inner completes', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(300, scheduler.createColdObservable(\n      onNext(10, 101),\n      onNext(20, 102),\n      onNext(110, 103),\n      onNext(120, 104),\n      onNext(210, 105),\n      onNext(220, 106),\n      onCompleted(230))\n    ),\n    onCompleted(540)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs['switch']();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 101),\n    onNext(320, 102),\n    onNext(410, 103),\n    onNext(420, 104),\n    onNext(510, 105),\n    onNext(520, 106),\n    onCompleted(540)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/switchfirst.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  fromArray: require('../observable/fromarray')\n});\n\nObservable.addToPrototype({\n  'switchFirst': require('../observable/switchfirst')\n});\n\ntest('Observable#switchFirst Promise', function (t) {\n  var sources = Observable.fromArray([\n    Promise.resolve(0),\n    Promise.resolve(1),\n    Promise.resolve(2),\n    Promise.resolve(3)\n  ]);\n\n  sources['switchFirst']().subscribe(function (x) {\n    t.equal(0, x);\n    t.end();\n  });\n});\n\ntest('Observable#switchFirst Promise error', function (t) {\n  var sources = Observable.fromArray([\n    Promise.resolve(0),\n    Promise.resolve(1),\n    Promise.reject(2),\n    Promise.resolve(3)\n  ]);\n\n  sources['switchFirst']().subscribe(function (x) {\n    t.equal(0, x);\n    t.end();\n  }, function (err) {\n    t.equal(2, err);\n    t.end();\n  });\n});\n\ntest('Observable#switchFirst Data', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(300, scheduler.createColdObservable(\n      onNext(10, 101),\n      onNext(20, 102),\n      onNext(110, 103),\n      onNext(120, 104),\n      onNext(210, 105),\n      onNext(220, 106),\n      onCompleted(230))\n    ),\n    onNext(400, scheduler.createColdObservable(\n      onNext(10, 201),\n      onNext(20, 202),\n      onNext(30, 203),\n      onNext(40, 204),\n      onCompleted(50))\n    ),\n    onNext(500, scheduler.createColdObservable(\n      onNext(10, 301),\n      onNext(20, 302),\n      onNext(30, 303),\n      onNext(40, 304),\n      onCompleted(150))\n    ),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs['switchFirst']();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 101),\n    onNext(320, 102),\n    onNext(410, 103),\n    onNext(420, 104),\n    onNext(510, 105),\n    onNext(520, 106),\n    onCompleted(600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#switchFirst inner throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(300, scheduler.createColdObservable(\n      onNext(10, 101),\n      onNext(20, 102),\n      onNext(110, 103),\n      onNext(120, 104),\n      onNext(210, 105),\n      onNext(220, 106),\n      onCompleted(230))\n    ),\n    onNext(400, scheduler.createColdObservable(\n      onNext(10, 201),\n      onNext(20, 202),\n      onNext(30, 203),\n      onNext(40, 204),\n      onError(50, error))\n    ),\n    onNext(500, scheduler.createColdObservable(\n      onNext(10, 301),\n      onNext(20, 302),\n      onNext(30, 303),\n      onNext(40, 304),\n      onCompleted(150))\n    ),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs['switchFirst']();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 101),\n    onNext(320, 102),\n    onNext(410, 103),\n    onNext(420, 104),\n    onNext(510, 105),\n    onNext(520, 106),\n    onCompleted(600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#switchFirst outer throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(300, scheduler.createColdObservable(\n      onNext(10, 101),\n      onNext(20, 102),\n      onNext(110, 103),\n      onNext(120, 104),\n      onNext(210, 105),\n      onNext(220, 106),\n      onCompleted(230))\n    ),\n    onNext(400, scheduler.createColdObservable(\n      onNext(10, 201),\n      onNext(20, 202),\n      onNext(30, 203),\n      onNext(40, 204),\n      onCompleted(50))\n    ),\n    onError(500, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs['switchFirst']();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 101),\n    onNext(320, 102),\n    onNext(410, 103),\n    onNext(420, 104),\n    onError(500, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#switchFirst no inner', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onCompleted(500)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs['switchFirst']();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#switchFirst inner completes', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(300, scheduler.createColdObservable(\n      onNext(10, 101),\n      onNext(20, 102),\n      onNext(110, 103),\n      onNext(120, 104),\n      onNext(210, 105),\n      onNext(220, 106),\n      onCompleted(230))\n    ),\n    onCompleted(540)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs['switchFirst']();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(310, 101),\n    onNext(320, 102),\n    onNext(410, 103),\n    onNext(420, 104),\n    onNext(510, 105),\n    onNext(520, 106),\n    onCompleted(540)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/take.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  take: require('../observable/take')\n});\n\ntest('Observable#take complete after', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 6),\n    onNext(150, 4),\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onCompleted(690)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.take(20);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onCompleted(690)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 690)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#take complete same', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 6),\n    onNext(150, 4),\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onCompleted(690)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.take(17);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onCompleted(630)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 630)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#take complete before', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 6),\n    onNext(150, 4),\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onCompleted(690)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.take(10);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onCompleted(415)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 415)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#take error after', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 6),\n    onNext(150, 4),\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onError(690, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.take(20);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onError(690, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 690)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#take error same', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 6),\n    onNext(150, 4),\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onError(690, new Error())\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.take(17);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onCompleted(630)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 630)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#take error before', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 6),\n    onNext(150, 4),\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10),\n    onError(690, new Error()));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.take(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onCompleted(270)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 270)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#take dispose before', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 6),\n    onNext(150, 4),\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.take(3);\n  }, { disposed: 250 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 9),\n    onNext(230, 13)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#take dispose after', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(70, 6),\n    onNext(150, 4),\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onNext(280, 1),\n    onNext(300, -1),\n    onNext(310, 3),\n    onNext(340, 8),\n    onNext(370, 11),\n    onNext(410, 15),\n    onNext(415, 16),\n    onNext(460, 72),\n    onNext(510, 76),\n    onNext(560, 32),\n    onNext(570, -100),\n    onNext(580, -3),\n    onNext(590, 5),\n    onNext(630, 10)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.take(3);\n  }, { disposed: 400 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 9),\n    onNext(230, 13),\n    onNext(270, 7),\n    onCompleted(270)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 270)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/takelast.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  takeLast: require('../observable/takelast')\n});\n\ntest('Observable#takeLast zero completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onCompleted(650)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLast(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(650)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLast zero error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onError(650, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLast(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(650, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLast zero disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLast(0);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLast one completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onCompleted(650)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLast(1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(650, 9),\n    onCompleted(650)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLast one error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onError(650, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLast(1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(650, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLast one disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLast(1);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLast three completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onCompleted(650)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLast(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(650, 7),\n    onNext(650, 8),\n    onNext(650, 9),\n    onCompleted(650)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLast three error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onError(650, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLast(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(650, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLast three disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLast(3);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/takelastbuffer.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  takeLastBuffer: require('../observable/takelastbuffer')\n});\n\ntest('Observable#takeLastBuffer zero completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onCompleted(650)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastBuffer(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(650, []),\n    onCompleted(650)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastBuffer zero error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onError(650, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastBuffer(0);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(650, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastBuffer zero disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastBuffer(0);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastBuffer one completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onCompleted(650)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastBuffer(1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(650, [9]),\n    onCompleted(650)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastBuffer one error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onError(650, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastBuffer(1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(650, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastBuffer one disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastBuffer(1);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastBuffer three completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onCompleted(650)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastBuffer(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(650, [7, 8, 9]),\n    onCompleted(650)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastBuffer three error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9),\n    onError(650, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastBuffer(3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(650, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 650)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastBuffer three disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(180, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(270, 4),\n    onNext(310, 5),\n    onNext(360, 6),\n    onNext(380, 7),\n    onNext(410, 8),\n    onNext(590, 9)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastBuffer(3);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/takelastbufferwithtime.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  takeLastBufferWithTime: require('../observable/takelastbufferwithtime')\n});\n\ntest('Observable#takeLastBufferWithTime zero 1', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastBufferWithTime(0, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, []),\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastBufferWithTime zero 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n      return xs.takeLastBufferWithTime(0, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, []),\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastBufferWithTime some 1', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onCompleted(240)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastBufferWithTime(25, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(240, [2,3]),\n    onCompleted(240)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 240)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastBufferWithTime some 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onCompleted(300)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastBufferWithTime(25, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, []),\n    onCompleted(300)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 300)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastBufferWithTime some 3', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onNext(240, 4),\n    onNext(250, 5),\n    onNext(260, 6),\n    onNext(270, 7),\n    onNext(280, 8),\n    onNext(290, 9),\n    onCompleted(300)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastBufferWithTime(45, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, [6,7,8,9]),\n    onCompleted(300)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 300)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastBufferWithTime some 4', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(240, 2),\n    onNext(250, 3),\n    onNext(280, 4),\n    onNext(290, 5),\n    onNext(300, 6),\n    onCompleted(350)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastBufferWithTime(25, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(350, []),\n    onCompleted(350)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 350)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastBufferWithTime All', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastBufferWithTime(50, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, [1,2]),\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastBufferWithTime Error', function (t) {\n  var scheduler = new TestScheduler();\n\n  var ex = new Error();\n\n  var xs = scheduler.createHotObservable(onError(210, ex));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastBufferWithTime(50, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, ex)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastBufferWithTime never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable();\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastBufferWithTime(50, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/takelastwithtime.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  takeLastWithTime: require('../observable/takelastwithtime')\n});\n\ntest('Observable#takeLastWithTime zero 1', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastWithTime(0, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastWithTime zero 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastWithTime(0, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastWithTime some 1', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onCompleted(240)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastWithTime(25, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(240, 2),\n    onNext(240, 3),\n    onCompleted(240)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 240)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastWithTime some 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onCompleted(300)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastWithTime(25, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(300)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 300)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastWithTime some 3', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onNext(240, 4),\n    onNext(250, 5),\n    onNext(260, 6),\n    onNext(270, 7),\n    onNext(280, 8),\n    onNext(290, 9),\n    onCompleted(300)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastWithTime(45, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 6),\n    onNext(300, 7),\n    onNext(300, 8),\n    onNext(300, 9),\n    onCompleted(300)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 300)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastWithTime some 4', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(240, 2),\n    onNext(250, 3),\n    onNext(280, 4),\n    onNext(290, 5),\n    onNext(300, 6),\n    onCompleted(350)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastWithTime(25, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(350)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 350)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastWithTime all', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastWithTime(50, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 1),\n    onNext(230, 2),\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastWithTime error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastWithTime(50, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeLastWithTime never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeLastWithTime(50, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/takeuntil.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  never: require('../observable/never')\n});\n\nObservable.addToPrototype({\n  takeUntil: require('../observable/takeuntil'),\n  tap: require('../observable/tap')\n});\n\ntest('Observable#takeUntil preempt some data next', function (t) {\n  var scheduler = new TestScheduler();\n\n  var l = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var r = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(225, 99),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return l.takeUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onCompleted(225)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeUntil preempt some data error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var l = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var r = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(225, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return l.takeUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onError(225, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeUntil no preempt some data empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var l = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var r = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(225)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return l.takeUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeUntil no preempt some data never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var l = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var r = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return l.takeUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeUntil preempt never next', function (t) {\n  var scheduler = new TestScheduler();\n\n  var l = Observable.never();\n\n  var r = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(225, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return l.takeUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(225)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeUntil preempt never error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var l = Observable.never();\n\n  var r = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(225, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return l.takeUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(225, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeUntil no preempt never empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var l = Observable.never();\n\n  var r = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(225)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return l.takeUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#takeUntil no preempt never never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var l = Observable.never();\n\n  var r = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return l.takeUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#takeUntil preempt before first produced', function (t) {\n  var scheduler = new TestScheduler();\n\n  var l = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(230, 2),\n    onCompleted(240)\n  );\n\n  var r = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(220)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return l.takeUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeUntil preempt before first produced remain silent and proper disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var sourceNotDisposed = false;\n\n  var l = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(215, new Error()),\n    onCompleted(240)\n  ).tap(function () { sourceNotDisposed = true; });\n\n  var r = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(220)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return l.takeUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(210)\n  ]);\n\n  t.ok(!sourceNotDisposed);\n\n  t.end();\n});\n\ntest('Observable#takeUntil no preempt after last produced proper disposed signal', function (t) {\n  var scheduler = new TestScheduler();\n\n  var signalNotDisposed = false;\n\n  var l = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(230, 2),\n    onCompleted(240)\n  );\n\n  var r = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(250, 2),\n    onCompleted(260)\n  ).tap(function () { signalNotDisposed = true; });\n\n  var results = scheduler.startScheduler(function () {\n    return l.takeUntil(r);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, 2),\n    onCompleted(240)\n  ]);\n\n  t.ok(!signalNotDisposed);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/takeuntilwithtime.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  takeUntilWithTime: require('../observable/takeuntilwithtime')\n});\n\ntest('Observable#takeUntilWithTime zero', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeUntilWithTime(new Date(0), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(201)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 201)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeUntilWithTime late', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeUntilWithTime(new Date(250), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeUntilWithTime error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeUntilWithTime(new Date(250), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeUntilWithTime never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable();\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeUntilWithTime(new Date(250), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeUntilWithTime twice 1', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onNext(240, 4),\n    onNext(250, 5),\n    onNext(260, 6),\n    onCompleted(270)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs\n      .takeUntilWithTime(new Date(255), scheduler)\n      .takeUntilWithTime(new Date(235), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onCompleted(235)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 235)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#takeUntilWithTime twice 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onNext(240, 4),\n    onNext(250, 5),\n    onNext(260, 6),\n    onCompleted(270)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs\n      .takeUntilWithTime(new Date(235), scheduler)\n      .takeUntilWithTime(new Date(255), scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onCompleted(235)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 235)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/takewhile.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  takeWhile: require('../observable/takewhile')\n});\n\nfunction isPrime(i) {\n  if (i <= 1) { return false; }\n  var max = Math.floor(Math.sqrt(i));\n  for (var j = 2; j <= max; ++j) {\n    if (i % j === 0) { return false; }\n  }\n\n  return true;\n}\n\ntest('Observable#takeWhile complete before', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, -1),\n    onNext(110, -1),\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onCompleted(330),\n    onNext(350, 7),\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onCompleted(600)\n  );\n\n  var invoked = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeWhile(function (x) {\n      invoked++;\n      return isPrime(x);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onCompleted(330)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 330)\n  ]);\n\n  t.equal(4, invoked);\n\n  t.end();\n});\n\ntest('Observable#takeWhile complete after', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, -1),\n    onNext(110, -1),\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onCompleted(600)\n  );\n\n  var invoked = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeWhile(function (x) {\n      invoked++;\n      return isPrime(x);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onCompleted(390)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 390)\n  ]);\n\n  t.equal(6, invoked);\n\n  t.end();\n});\n\ntest('Observable#takeWhile error before', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, -1),\n    onNext(110, -1),\n    onNext(210, 2),\n    onNext(260, 5),\n    onError(270, error),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23)\n  );\n\n  var invoked = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeWhile(function (x) {\n      invoked++;\n      return isPrime(x);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(260, 5),\n    onError(270, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 270)\n  ]);\n\n  t.equal(2, invoked);\n\n  t.end();\n});\n\ntest('Observable#takeWhile error after', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, -1),\n    onNext(110, -1),\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onError(600, new Error())\n  );\n\n  var invoked = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeWhile(function (x) {\n      invoked++;\n      return isPrime(x);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onCompleted(390)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 390)\n  ]);\n\n  t.equal(6, invoked);\n\n  t.end();\n});\n\ntest('Observable#takeWhile dispose before', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, -1),\n    onNext(110, -1),\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onCompleted(600)\n  );\n\n  var invoked = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeWhile(function (x) {\n      invoked++;\n      return isPrime(x);\n    });\n  }, { disposed: 300 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 300)\n  ]);\n\n  t.equal(3, invoked);\n\n  t.end();\n});\n\ntest('Observable#takeWhile dispose after', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, -1),\n    onNext(110, -1),\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onCompleted(600)\n  );\n\n  var invoked = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeWhile(function (x) {\n      invoked++;\n      return isPrime(x);\n    });\n  }, { disposed: 400 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onCompleted(390)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 390)\n  ]);\n\n  t.equal(6, invoked);\n\n  t.end();\n});\n\ntest('Observable#takeWhile zero', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, -1),\n    onNext(110, -1),\n    onNext(205, 100),\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onCompleted(600)\n  );\n\n  var invoked = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeWhile(function (x) {\n      invoked++;\n      return isPrime(x);\n    });\n  }, { disposed: 300 });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(205)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 205)\n  ]);\n\n  t.equal(1, invoked);\n\n  t.end();\n});\n\ntest('Observable#takeWhile throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, -1),\n    onNext(110, -1),\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onCompleted(600)\n  );\n\n  var invoked = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeWhile(function (x) {\n      invoked++;\n      if (invoked === 3) { throw error; }\n      return isPrime(x);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(260, 5),\n    onError(290, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 290)\n  ]);\n\n  t.equal(3, invoked);\n\n  t.end();\n});\n\ntest('Observable#takeWhile index', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, -1),\n    onNext(110, -1),\n    onNext(205, 100),\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onNext(350, 7),\n    onNext(390, 4),\n    onNext(410, 17),\n    onNext(450, 8),\n    onNext(500, 23),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.takeWhile(function (x, i) {\n      return i < 5;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(205, 100),\n    onNext(210, 2),\n    onNext(260, 5),\n    onNext(290, 13),\n    onNext(320, 3),\n    onCompleted(350)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 350)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/tap.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar create = require('../observer/create');\nvar noop = require('../helpers/noop');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n    onError = ReactiveTest.onError,\n    onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  tap: require('../observable/tap')\n});\n\ntest('Observable#tap should see all values', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var i = 0;\n  var sum = 2 + 3 + 4 + 5;\n\n  scheduler.startScheduler(function () {\n    return xs.tap(function (x) { i++; return sum -= x; });\n  });\n\n  t.equal(4, i);\n  t.equal(0, sum);\n\n  t.end();\n});\n\ntest('Observable#tap plain action', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var i = 0;\n\n  scheduler.startScheduler(function () {\n    return xs.tap(function () { return i++; });\n  });\n\n  t.equal(4, i);\n\n  t.end();\n});\n\ntest('Observable#tap next completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var i = 0;\n  var sum = 2 + 3 + 4 + 5;\n  var completed = false;\n\n  scheduler.startScheduler(function () {\n    return xs.tap(function (x) { i++; sum -= x; }, null, function () { completed = true; });\n  });\n\n  t.equal(4, i);\n  t.equal(0, sum);\n  t.ok(completed);\n\n  t.end();\n});\n\ntest('Observable#tap next completed never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var i = 0;\n  var completed = false;\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  scheduler.startScheduler(function () {\n    return xs.tap(function () { i++; }, null, function () { completed = true; });\n  });\n\n  t.equal(0, i);\n  t.ok(!completed);\n\n  t.end();\n});\n\ntest('Observable#tap next error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onError(250, error)\n  );\n\n  var i = 0;\n  var sum = 2 + 3 + 4 + 5;\n  var sawError = false;\n\n  scheduler.startScheduler(function () {\n    return xs.tap(function (x) { i++; sum -= x; }, function (e) { sawError = e === error; });\n  });\n\n  t.equal(4, i);\n  t.equal(0, sum);\n  t.ok(sawError);\n\n  t.end();\n});\n\ntest('Observable#tap next error not', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var i = 0;\n  var sum = 2 + 3 + 4 + 5;\n  var sawError = false;\n\n  scheduler.startScheduler(function () {\n    return xs.tap(function (x) { i++; sum -= x; }, function () { sawError = true; });\n  });\n\n  t.equal(4, i);\n  t.equal(0, sum);\n  t.ok(!sawError);\n\n  t.end();\n});\n\ntest('Observable#tap next error completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var i = 0;\n  var sum = 2 + 3 + 4 + 5;\n  var sawError = false;\n  var hasCompleted = false;\n\n  scheduler.startScheduler(function () {\n    return xs.tap(function (x) { i++; sum -= x; }, function () { sawError = true; }, function () { hasCompleted = true; });\n  });\n\n  t.equal(4, i);\n  t.equal(0, sum);\n  t.ok(!sawError);\n  t.ok(hasCompleted);\n\n  t.end();\n});\n\ntest('Observable#tap next completed error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onError(250, error)\n  );\n\n  var i = 0;\n  var sum = 2 + 3 + 4 + 5;\n  var sawError = false;\n  var hasCompleted = false;\n\n  scheduler.startScheduler(function () {\n    return xs.tap(function (x) { i++; sum -= x; }, function () { sawError = true; }, function () { hasCompleted = true; });\n  });\n\n  t.equal(4, i);\n  t.equal(0, sum);\n  t.ok(sawError);\n  t.ok(!hasCompleted);\n\n  t.end();\n});\n\ntest('Observable#tap next error completed never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var i = 0;\n  var sawError = false;\n  var hasCompleted = false;\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  scheduler.startScheduler(function () {\n    return xs.tap(function () { i++; }, function () { sawError = true; }, function () { hasCompleted = true; });\n  });\n\n  t.equal(0, i);\n  t.ok(!sawError);\n  t.ok(!hasCompleted);\n\n  t.end();\n});\n\ntest('Observable#tap observer some data with error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onError(250, error)\n  );\n\n  var i = 0;\n  var sum = 2 + 3 + 4 + 5;\n  var sawError = false;\n  var hasCompleted = false;\n\n  scheduler.startScheduler(function () {\n    return xs.tap(create(function (x) { i++; sum -= x; }, function (e) { sawError = e === error; }, function () { hasCompleted = true; }));\n  });\n\n  t.equal(4, i);\n  t.equal(0, sum);\n  t.ok(sawError);\n  t.ok(!hasCompleted);\n\n  t.end();\n});\n\ntest('Observable#tap next throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.tap(function () { throw error; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#tap next completed next throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.tap(function () { throw error; }, null, noop);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#tap next competed completed throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n      return xs.tap(noop, null, function () { throw error; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onError(250, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#tap next error next throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.tap(function () { throw error; }, noop);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#tap next error error throws', function (t) {\n  var error1 = new Error();\n  var error2 = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.tap(noop, function () { throw error2; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error2)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#tap next error completed next throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.tap(function () { throw error; }, noop, noop);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#tap next error completed error throws', function (t) {\n  var error1 = new Error();\n  var error2 = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.tap(noop, function () { throw error2; }, noop);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error2)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#tap next error completed completed throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.tap(noop, noop, function () { throw error; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onError(250, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#tap observer next throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.tap(create(function () { throw error;  }, noop, noop));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#tap observer error throws', function (t) {\n  var error1 = new Error();\n  var error2 = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(210, error1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.tap(create(noop, function () { throw error2; }, noop));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error2)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#tap observer completed throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.tap(create(noop, noop, function () { throw error; }));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onError(250, error)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/throttle.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  throttle: require('../observable/throttle')\n});\n\ntest('Observable#throttle completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(310, 4),\n    onNext(350, 5),\n    onNext(410, 6),\n    onNext(450, 7),\n    onCompleted(500)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.throttle(200, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(410, 6),\n    onCompleted(500)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#throttle never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.throttle(200, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#throttle empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(500)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.throttle(200, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(500)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#throttle error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(310, 4),\n    onNext(350, 5),\n    onError(410, error),\n    onNext(450, 7),\n    onCompleted(500)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.throttle(200, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onError(410, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 410)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#throttle no end', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(250, 3),\n    onNext(310, 4),\n    onNext(350, 5),\n    onNext(410, 6),\n    onNext(450, 7)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.throttle(200, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(410, 6)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/throw.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onError = ReactiveTest.onError;\n\nObservable.addToObject({\n  'throw': require('../observable/throw')\n});\n\nfunction noop () { }\n\ntest('Observable.throw basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable['throw'](error, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(201, error)\n  ]);\n  t.end();\n});\n\ntest('Observable.throw disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable['throw'](new Error(), scheduler);\n  }, { disposed: 200 });\n\n  reactiveAssert(t, results.messages, []);\n  t.end();\n});\n\ntest('Observable.throw observer throws', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = Observable['throw'](new Error(), scheduler);\n\n  xs.subscribe(noop, function () { throw new Error(); });\n\n  t.throws(function () { scheduler.start(); });\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/timeinterval.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  timeInterval: require('../observable/timeinterval')\n});\n\nfunction TimeInterval(value, interval) {\n  this.value = value;\n  this.interval = interval;\n}\n\ntest('Observable#timeInterval regular', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(260, 4),\n    onNext(300, 5),\n    onNext(350, 6),\n    onCompleted(400)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.timeInterval(scheduler).map(function (x) {\n      return new TimeInterval(x.value, x.interval);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, new TimeInterval(2, 10)),\n    onNext(230, new TimeInterval(3, 20)),\n    onNext(260, new TimeInterval(4, 30)),\n    onNext(300, new TimeInterval(5, 40)),\n    onNext(350, new TimeInterval(6, 50)),\n    onCompleted(400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#timeInterval empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(201)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.timeInterval(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(201)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#timeInterval error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(201, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.timeInterval(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(201, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#timeInterval never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.timeInterval(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/timer.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  timer: require('../observable/timer')\n});\n\nfunction noop () { }\n\ntest('Observable.timer one shot relative time basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.timer(300, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(500, 0),\n    onCompleted(500)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.timer one shot relative time zero', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.timer(0, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 0),\n    onCompleted(201)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.timer one shot relative time negative', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.timer(-1, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(201, 0),\n    onCompleted(201)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.timer one shot relative time disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.timer(1000, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable.timer one shot relative time observer throws', function (t) {\n  var scheduler1 = new TestScheduler();\n\n  var xs = Observable.timer(1, scheduler1);\n  xs.subscribe(function () { throw new Error(); });\n  t.throws(function () { scheduler1.start(); });\n\n  var scheduler2 = new TestScheduler();\n\n  var ys = Observable.timer(1, scheduler2);\n  ys.subscribe(noop, noop, function () { throw new Error(); });\n  t.throws(function () { scheduler2.start(); });\n\n  t.end();\n});\n\ntest('Observable.timer relative start and periodically repeat', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function() {\n    return Observable.timer(300, 100, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(500, 0),\n    onNext(600, 1),\n    onNext(700, 2),\n    onNext(800, 3),\n    onNext(900, 4)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/timestamp.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToPrototype({\n  timestamp: require('../observable/timestamp')\n});\n\nfunction Timestamp(value, timestamp) {\n  this.value = value;\n  this.timestamp = timestamp;\n}\n\ntest('Observable#timestamp regular', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(230, 3),\n    onNext(260, 4),\n    onNext(300, 5),\n    onNext(350, 6),\n    onCompleted(400)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.timestamp(scheduler).map(function (x) {\n      return new Timestamp(x.value, x.timestamp);\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, new Timestamp(2, 210)),\n    onNext(230, new Timestamp(3, 230)),\n    onNext(260, new Timestamp(4, 260)),\n    onNext(300, new Timestamp(5, 300)),\n    onNext(350, new Timestamp(6, 350)),\n    onCompleted(400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#timestamp empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(201)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.timestamp(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(201)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#timestamp error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(201, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.timestamp(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(201, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#timestamp never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.timestamp(scheduler);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/toarray.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n    onError = ReactiveTest.onError,\n    onCompleted = ReactiveTest.onCompleted,\n    subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  toArray: require('../observable/toarray')\n});\n\ntest('Observable#toArray completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(220, 2),\n    onNext(330, 3),\n    onNext(440, 4),\n    onNext(550, 5),\n    onCompleted(660)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.toArray();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(660, [2,3,4,5]),\n    onCompleted(660)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 660)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#toArray error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(220, 2),\n    onNext(330, 3),\n    onNext(440, 4),\n    onNext(550, 5),\n    onError(660, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.toArray();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(660, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 660)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#toArray disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(220, 2),\n    onNext(330, 3),\n    onNext(440, 4),\n    onNext(550, 5)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.toArray();\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/toasync.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  toAsync: require('../observable/toasync')\n});\n\ntest('Observable.toAsync context', function (t) {\n  var context = { value: 42 };\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.toAsync(function (x) {\n      return this.value + x;\n    }, context, scheduler)(42);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 84),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.toAsync 0', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.toAsync(function () {\n      return 0;\n    }, null, scheduler)();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 0),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.toAsync 1', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.toAsync(function (x) {\n      return x;\n    }, null, scheduler)(1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 1),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.toAsync 2', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.toAsync(function (x, y) {\n        return x + y;\n    }, null, scheduler)(1, 2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 3),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.toAsync 3', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.toAsync(function (x, y, z) {\n      return x + y + z;\n    }, null, scheduler)(1, 2, 3);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 6),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.toAsync 4', function (t) {\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.toAsync(function (a, b, c, d) {\n      return a + b + c + d;\n    }, null, scheduler)(1, 2, 3, 4);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(200, 10),\n    onCompleted(200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.toAsync error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.toAsync(function () {\n      throw error;\n    }, null, scheduler)();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(200, error)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/tomap.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  toMap: require('../observable/tomap')\n});\n\nfunction extractValues(x) {\n  var arr = [];\n  x.forEach(function (value, key) {\n    arr.push(key, value);\n  });\n  return arr;\n}\n\ntest('Observable#toMap completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(220, 2),\n    onNext(330, 3),\n    onNext(440, 4),\n    onNext(550, 5),\n    onCompleted(660)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.toMap(function (x) { return x * 2; }, function (x) { return x * 4; }).map(extractValues);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(660, [4, 8, 6, 12, 8, 16, 10, 20]),\n    onCompleted(660)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 660)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#toMap error', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(220, 2),\n    onNext(330, 3),\n    onNext(440, 4),\n    onNext(550, 5),\n    onError(660, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.toMap(function (x) { return x * 2; }, function (x) { return x * 4; }).map(extractValues);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(660, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 660)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#toMap key selector throws', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(220, 2),\n    onNext(330, 3),\n    onNext(440, 4),\n    onNext(550, 5),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.toMap(function (x) { if (x < 4) { return x * 2; } else { throw error; } }, function (x) { return x * 4; }).map(extractValues);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(440, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 440)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#toMap element selector throws', function (t) {\n  var scheduler = new TestScheduler();\n\n  var error = new Error();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(220, 2),\n    onNext(330, 3),\n    onNext(440, 4),\n    onNext(550, 5),\n    onCompleted(600)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.toMap(function (x) { return x * 2; }, function (x) { if (x < 4) { return x * 4; } else { throw error; } }).map(extractValues);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(440, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 440)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#toMap disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(220, 2),\n    onNext(330, 3),\n    onNext(440, 4),\n    onNext(550, 5)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.toMap(function (x) { return x * 2; }, function (x) { return x * 4; }).map(extractValues);\n  });\n\n  reactiveAssert(t, results.messages, [\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/topromise.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar LocalPromise = require('lie');\n\nObservable.addToObject({\n  just: require('../observable/just'),\n  'throw': require('../observable/throw')\n});\n\nObservable.addToPrototype({\n  toPromise: require('../observable/topromise')\n});\n\ntest('Observable#toPromise success', function (t) {\n  var source = Observable.just(42);\n\n  var promise = source.toPromise(LocalPromise);\n\n  promise.then(\n    function (value) {\n      t.equal(42, value);\n      t.end();\n    },\n    function () {\n      t.fail();\n    }\n  );\n});\n\ntest('Observable#toPromise Failure', function (t) {\n  var error = new Error('woops');\n\n  var source = Observable['throw'](error);\n\n  var promise = source.toPromise(LocalPromise);\n\n  promise.then(\n    function () {\n      t.fail();\n    },\n    function (reason) {\n      t.equal(error, reason);\n      t.end();\n    }\n  );\n});\n"
  },
  {
    "path": "src/modular/test/toset.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  map: require('../observable/map'),\n  toSet: require('../observable/toset')\n});\n\nfunction extractValues(x) {\n  var arr = [];\n  x.forEach(function (item) {\n    arr.push(item);\n  });\n  return arr;\n}\n\ntest('Observable#toSet completed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(220, 2),\n    onNext(330, 3),\n    onNext(440, 4),\n    onNext(550, 5),\n    onCompleted(660)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.toSet().map(extractValues);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(660, [2,3,4,5]),\n    onCompleted(660)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 660)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#toSet error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(220, 2),\n    onNext(330, 3),\n    onNext(440, 4),\n    onNext(550, 5),\n    onError(660, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.toSet().map(extractValues);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(660, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 660)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#toSet disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(110, 1),\n    onNext(220, 2),\n    onNext(330, 3),\n    onNext(440, 4),\n    onNext(550, 5)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.toSet().map(extractValues);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/transduce.js",
    "content": ""
  },
  {
    "path": "src/modular/test/using.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToObject({\n  using: require('../observable/using')\n});\n\ntest('Observable.using null', function (t) {\n  var xs, _d, disposable;\n\n  var scheduler = new TestScheduler();\n\n  var disposeInvoked = 0;\n  var createInvoked = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.using(function () {\n      disposeInvoked++;\n      disposable = null;\n      return disposable;\n    }, function (d) {\n      _d = d;\n      createInvoked++;\n\n      xs = scheduler.createColdObservable(\n        onNext(100, scheduler.clock),\n        onCompleted(200));\n\n      return xs;\n    });\n  });\n\n  t.equal(disposable, _d);\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 200),\n    onCompleted(400)\n  ]);\n\n  t.equal(1, createInvoked);\n  t.equal(1, disposeInvoked);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.equal(disposable, null);\n\n  t.end();\n});\n\ntest('Observable.using complete', function (t) {\n  var disposable, xs, _d;\n\n  var scheduler = new TestScheduler();\n\n  var disposeInvoked = 0;\n  var createInvoked = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.using(function () {\n      disposeInvoked++;\n      disposable = scheduler.createDisposable();\n      return disposable;\n    }, function (d) {\n      _d = d;\n      createInvoked++;\n      xs = scheduler.createColdObservable(onNext(100, scheduler.clock), onCompleted(200));\n      return xs;\n    });\n  });\n\n  t.equal(disposable, _d);\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 200),\n    onCompleted(400)\n  ]);\n\n  t.equal(1, createInvoked);\n  t.equal(1, disposeInvoked);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  reactiveAssert(t, disposable.disposes, [\n    200, 400\n  ]);\n\n  t.end();\n});\n\ntest('Observable.using error', function (t) {\n  var disposable, xs, _d;\n\n  var scheduler = new TestScheduler();\n\n  var disposeInvoked = 0;\n  var createInvoked = 0;\n\n  var error = new Error();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.using(function () {\n      disposeInvoked++;\n      disposable = scheduler.createDisposable();\n      return disposable;\n    }, function (d) {\n      _d = d;\n      createInvoked++;\n      xs = scheduler.createColdObservable(\n        onNext(100, scheduler.clock),\n        onError(200, error));\n\n      return xs;\n    });\n  });\n\n  t.equal(disposable, _d);\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 200),\n    onError(400, error)\n  ]);\n\n  t.equal(1, createInvoked);\n  t.equal(1, disposeInvoked);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)]\n  );\n\n  reactiveAssert(t, disposable.disposes, [200, 400]);\n\n  t.end();\n});\n\ntest('Observable.using dispose', function (t) {\n  var disposable, xs, _d;\n\n  var scheduler = new TestScheduler();\n\n  var disposeInvoked = 0;\n  var createInvoked = 0;\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.using(function () {\n      disposeInvoked++;\n      disposable = scheduler.createDisposable();\n      return disposable;\n    }, function (d) {\n      _d = d;\n      createInvoked++;\n      xs = scheduler.createColdObservable(\n        onNext(100, scheduler.clock),\n        onNext(1000, scheduler.clock + 1));\n\n      return xs;\n    });\n  });\n\n  t.equal(disposable, _d);\n\n  reactiveAssert(t, results.messages, [\n    onNext(300, 200)\n  ]);\n\n  t.equal(1, createInvoked);\n  t.equal(1, disposeInvoked);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  reactiveAssert(t, disposable.disposes, [200, 1000]);\n\n  t.end();\n});\n\ntest('Observable.using throw resource selector', function (t) {\n  var scheduler = new TestScheduler();\n\n  var disposeInvoked = 0;\n  var createInvoked = 0;\n\n  var error = new Error();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.using(function () {\n      disposeInvoked++;\n      throw error;\n    }, function () {\n      createInvoked++;\n      return Observable.never();\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(200, error)\n  ]);\n\n  t.equal(0, createInvoked);\n  t.equal(1, disposeInvoked);\n\n  t.end();\n});\n\ntest('Observable.using throw resource usage', function (t) {\n  var disposable;\n\n  var scheduler = new TestScheduler();\n\n  var disposeInvoked = 0;\n  var createInvoked = 0;\n\n  var error = new Error();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.using(function () {\n      disposeInvoked++;\n      disposable = scheduler.createDisposable();\n      return disposable;\n    }, function () {\n      createInvoked++;\n      throw error;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(200, error)\n  ]);\n\n  t.equal(1, createInvoked);\n  t.equal(1, disposeInvoked);\n\n  reactiveAssert(t, disposable.disposes, [200, 200]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/when.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  never: require('../observable/never'),\n  when: require('../observable/when')\n});\n\nObservable.addToPrototype({\n  and: require('../observable/and'),\n  thenDo: require('../observable/thendo')\n});\n\nfunction throwError(error) { return function () { throw error; }; }\nfunction multiply (x, y) { return x * y; }\nfunction subtract (x, y) { return x - y; }\nfunction add () {\n  var sum = 0;\n  for (var i = 0, len = arguments.length; i < len; i++) {\n    sum += arguments[i];\n  }\n  return sum;\n}\n\ntest('Observable#when then 1', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onCompleted(220)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(xs.thenDo(function (a) {\n      return a;\n    }));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 1),\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when then 1 error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onError(210, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(xs.thenDo(function (a) {\n      return a;\n    }));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when then 1 throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onCompleted(220)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(xs.thenDo(throwError(error)));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when and 2', function (t) {\n  var N = 2;\n\n  var scheduler = new TestScheduler();\n\n  var obs = [];\n  for (var i = 0; i < N; i++) {\n    obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n  }\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(obs[0].and(obs[1]).thenDo(add));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, N),\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when and 2 error', function (t) {\n  var error = new Error();\n\n  var N = 2;\n\n  for (var i = 0; i < N; i++) {\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var j = 0; j < N; j++) {\n      if (j === i) {\n        obs.push(scheduler.createHotObservable(onError(210, error)));\n      } else {\n        obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n      }\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).thenDo(add));\n    });\n\n    reactiveAssert(t, results.messages, [\n      onError(210, error)\n    ]);\n  }\n\n  t.end();\n});\n\ntest('Observable#when then 2 throws', function (t) {\n  var error = new Error();\n\n  var N = 2;\n\n  var scheduler = new TestScheduler();\n\n  var obs = [];\n  for (var i = 0; i < N; i++) {\n    obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n  }\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(obs[0].and(obs[1]).thenDo(throwError(error)));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when and 3', function (t) {\n  var N = 3;\n\n  var scheduler = new TestScheduler();\n\n  var obs = [];\n  for (var i = 0; i < N; i++) {\n    obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n  }\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(obs[0].and(obs[1]).and(obs[2]).thenDo(add));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, N),\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when and 3 error', function (t) {\n  var error = new Error();\n\n  var N = 3;\n\n  for (var i = 0; i < N; i++) {\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var j = 0; j < N; j++) {\n      if (j === i) {\n        obs.push(scheduler.createHotObservable(onError(210, error)));\n      } else {\n        obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n      }\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).thenDo(add));\n    });\n\n    reactiveAssert(t, results.messages, [\n      onError(210, error)\n    ]);\n  }\n\n  t.end();\n});\n\ntest('Observable#when then 3 throws', function (t) {\n  var error = new Error();\n\n  var N = 3;\n\n  var scheduler = new TestScheduler();\n\n  var obs = [];\n  for (var i = 0; i < N; i++) {\n    obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n  }\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(obs[0].and(obs[1]).and(obs[2]).thenDo(throwError(error)));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when and 4', function (t) {\n  var N = 4;\n  var scheduler = new TestScheduler();\n  var obs = [];\n  for (var i = 0; i < N; i++) {\n    obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n  }\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).thenDo(add));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, N),\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when and 4 error', function (t) {\n  var error = new Error();\n\n  var N = 4;\n\n  for (var i = 0; i < N; i++) {\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var j = 0; j < N; j++) {\n      if (j === i) {\n        obs.push(scheduler.createHotObservable(onError(210, error)));\n      } else {\n        obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n      }\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).thenDo(add));\n    });\n\n    reactiveAssert(t, results.messages, [\n      onError(210, error)\n    ]);\n  }\n\n  t.end();\n});\n\ntest('Observable#when then 4 throws', function (t) {\n  var error = new Error();\n\n  var N = 4;\n\n  var scheduler = new TestScheduler();\n\n  var obs = [];\n  for (var i = 0; i < N; i++) {\n    obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n  }\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).thenDo(throwError(error)));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when and 5', function (t) {\n  var N = 5;\n\n  var scheduler = new TestScheduler();\n\n  var obs = [];\n  for (var i = 0; i < N; i++) {\n    obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n  }\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).thenDo(add));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, N),\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when and 5 error', function (t) {\n  var error = new Error();\n  var N = 5;\n  for (var i = 0; i < N; i++) {\n    var scheduler = new TestScheduler();\n    var obs = [];\n    for (var j = 0; j < N; j++) {\n      if (j === i) {\n        obs.push(scheduler.createHotObservable(onError(210, error)));\n      } else {\n        obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n      }\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).thenDo(add));\n    });\n\n    reactiveAssert(t, results.messages, [\n      onError(210, error)\n    ]);\n  }\n\n  t.end();\n});\n\ntest('Observable#when then 5 throws', function (t) {\n  var error = new Error();\n\n  var N = 5;\n\n  var scheduler = new TestScheduler();\n\n  var obs = [];\n  for (var i = 0; i < N; i++) {\n    obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n  }\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).thenDo(throwError(error)));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when and 6', function (t) {\n  var N = 6;\n\n  var scheduler = new TestScheduler();\n\n  var obs = [];\n  for (var i = 0; i < N; i++) {\n    obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n  }\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).thenDo(add));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, N),\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when and 6 error', function (t) {\n  var error = new Error();\n\n  var N = 6;\n\n  for (var i = 0; i < N; i++) {\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var j = 0; j < N; j++) {\n      if (j === i) {\n        obs.push(scheduler.createHotObservable(onError(210, error)));\n      } else {\n        obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n      }\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).thenDo(add));\n    });\n\n    reactiveAssert(t, results.messages, [\n      onError(210, error)\n    ]);\n  }\n\n  t.end();\n});\n\ntest('Observable#when then 6 throws', function (t) {\n  var error = new Error();\n\n  var N = 6;\n\n  var scheduler = new TestScheduler();\n\n  var obs = [];\n  for (var i = 0; i < N; i++) {\n    obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n  }\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).thenDo(throwError(error)));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when and 7', function (t) {\n  var N = 7;\n\n  var scheduler = new TestScheduler();\n\n  var obs = [];\n  for (var i = 0; i < N; i++) {\n    obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n  }\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).and(obs[6]).thenDo(add));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, N),\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when and 7 error', function (t) {\n  var error = new Error();\n\n  var N = 7;\n\n  for (var i = 0; i < N; i++) {\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var j = 0; j < N; j++) {\n      if (j === i) {\n        obs.push(scheduler.createHotObservable(onError(210, error)));\n      } else {\n        obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n      }\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).and(obs[6]).thenDo(add));\n    });\n\n    reactiveAssert(t, results.messages, [\n      onError(210, error)\n    ]);\n  }\n\n  t.end();\n});\n\ntest('Observable#when then 7 throws', function (t) {\n  var error = new Error();\n\n  var N = 7;\n\n  var scheduler = new TestScheduler();\n\n  var obs = [];\n  for (var i = 0; i < N; i++) {\n    obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n  }\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).and(obs[6]).thenDo(throwError(error)));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when and 8', function (t) {\n  var N = 8;\n\n  var scheduler = new TestScheduler();\n\n  var obs = [];\n  for (var i = 0; i < N; i++) {\n    obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n  }\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).and(obs[6]).and(obs[7]).thenDo(add));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, N),\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when and 8 error', function (t) {\n  var error = new Error();\n\n  var N = 8;\n\n  for (var i = 0; i < N; i++) {\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var j = 0; j < N; j++) {\n      if (j === i) {\n        obs.push(scheduler.createHotObservable(onError(210, error)));\n      } else {\n        obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n      }\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).and(obs[6]).and(obs[7]).thenDo(add));\n    });\n\n    reactiveAssert(t, results.messages, [\n      onError(210, error)\n    ]);\n  }\n\n  t.end();\n});\n\ntest('Observable#when then 8 throws', function (t) {\n  var error = new Error();\n\n  var N = 8;\n\n  var scheduler = new TestScheduler();\n\n  var obs = [];\n  for (var i = 0; i < N; i++) {\n    obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n  }\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).and(obs[6]).and(obs[7]).thenDo(throwError(error)));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when and 9', function (t) {\n  var N = 9;\n\n  var scheduler = new TestScheduler();\n\n  var obs = [];\n  for (var i = 0; i < N; i++) {\n    obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n  }\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).and(obs[6]).and(obs[7]).and(obs[8]).thenDo(add));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, N),\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when and 9 error', function (t) {\n  var error = new Error();\n\n  var N = 9;\n\n  for (var i = 0; i < N; i++) {\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var j = 0; j < N; j++) {\n      if (j === i) {\n        obs.push(scheduler.createHotObservable(onError(210, error)));\n      } else {\n        obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n      }\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).and(obs[6]).and(obs[7]).and(obs[8]).thenDo(add));\n    });\n\n    reactiveAssert(t, results.messages, [\n      onError(210, error)\n    ]);\n  }\n\n  t.end();\n});\n\ntest('Observable#when then 9 throws', function (t) {\n  var error = new Error();\n\n  var N = 9;\n\n  var scheduler = new TestScheduler();\n\n  var obs = [];\n  for (var i = 0; i < N; i++) {\n    obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n  }\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).and(obs[6]).and(obs[7]).and(obs[8]).thenDo(throwError(error)));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(210, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when when multiple data symmetric', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onCompleted(240)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(240, 4),\n    onNext(250, 5),\n    onNext(260, 6),\n    onCompleted(270)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(xs.and(ys).thenDo(add));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(240, 1 + 4),\n    onNext(250, 2 + 5),\n    onNext(260, 3 + 6),\n    onCompleted(270)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when when multiple data asymmetric', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onCompleted(240)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(240, 4),\n    onNext(250, 5),\n    onCompleted(270)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(xs.and(ys).thenDo(add));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(240, 1 + 4),\n    onNext(250, 2 + 5),\n    onCompleted(270)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when when empty empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onCompleted(240)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onCompleted(270)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(xs.and(ys).thenDo(add));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(270)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when when never never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = Observable.never();\n\n  var ys = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(xs.and(ys).thenDo(add));\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#when when throw non-empty', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onError(240, error)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onCompleted(270)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(xs.and(ys).thenDo(add));\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(240, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#when complicated when', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(210, 1),\n    onNext(220, 2),\n    onNext(230, 3),\n    onCompleted(240)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(240, 4),\n    onNext(250, 5),\n    onNext(260, 6),\n    onCompleted(270)\n  );\n\n  var zs = scheduler.createHotObservable(\n    onNext(220, 7),\n    onNext(230, 8),\n    onNext(240, 9),\n    onCompleted(300)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.when(\n      xs.and(ys).thenDo(add),\n      xs.and(zs).thenDo(multiply),\n      ys.and(zs).thenDo(subtract)\n    );\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 1 * 7),\n    onNext(230, 2 * 8),\n    onNext(240, 3 + 4),\n    onNext(250, 5 - 9),\n    onCompleted(300)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/window.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToObject({\n  timer: require('../observable/timer')\n});\n\nObservable.addToPrototype({\n  map: require('../observable/map'),\n  mergeAll: require('../observable/mergeall'),\n  window: require('../observable/window')\n});\n\n\ntest('Observable#window closings basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590)\n  );\n\n  var window = 1;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.window(function () {\n      return Observable.timer(window++ * 100, scheduler);\n    }).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, '0 3'),\n    onNext(260, '0 4'),\n    onNext(310, '1 5'),\n    onNext(340, '1 6'),\n    onNext(410, '1 7'),\n    onNext(420, '1 8'),\n    onNext(470, '1 9'),\n    onNext(550, '2 10'),\n    onCompleted(590)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 590)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#window closings Dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590)\n  );\n\n  var window = 1;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.window(function () {\n      return Observable.timer(window++ * 100, scheduler);\n    }).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  }, { disposed: 400 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, '0 3'),\n    onNext(260, '0 4'),\n    onNext(310, '1 5'),\n    onNext(340, '1 6')\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#window closings Error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onError(590, error)\n  );\n\n  var window = 1;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.window(function () {\n      return Observable.timer(window++ * 100, scheduler);\n    }).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, '0 3'),\n    onNext(260, '0 4'),\n    onNext(310, '1 5'),\n    onNext(340, '1 6'),\n    onNext(410, '1 7'),\n    onNext(420, '1 8'),\n    onNext(470, '1 9'),\n    onNext(550, '2 10'),\n    onError(590, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 590)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#window closings Throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.window(function () { throw error; })\n      .map(function (w, i) { return w.map(function (x) { return i + ' ' + x; }); })\n      .mergeAll();\n  });\n  reactiveAssert(t, results.messages, [\n    onError(200, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 200)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#window closings window close error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.window(function () {\n      return Observable['throw'](error, scheduler);\n    }).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(201, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 201)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#window closings default', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590)\n  );\n\n  var window = 1;\n\n  var results = scheduler.startScheduler(function () {\n    return xs.window(function () {\n      return Observable.timer(window++ * 100, scheduler);\n    }).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, '0 3'),\n    onNext(260, '0 4'),\n    onNext(310, '1 5'),\n    onNext(340, '1 6'),\n    onNext(410, '1 7'),\n    onNext(420, '1 8'),\n    onNext(470, '1 9'),\n    onNext(550, '2 10'),\n    onCompleted(590)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 590)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#window opening closings basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(255, 50),\n    onNext(330, 100),\n    onNext(350, 50),\n    onNext(400, 90),\n    onCompleted(900)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.window(ys, function (x) {\n      return Observable.timer(x, scheduler);\n    }).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(260, '0 4'),\n    onNext(340, '1 6'),\n    onNext(410, '1 7'),\n    onNext(410, '3 7'),\n    onNext(420, '1 8'),\n    onNext(420, '3 8'),\n    onNext(470, '3 9'),\n    onCompleted(900)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 900)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 900)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#window opening closings throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590));\n\n  var ys = scheduler.createHotObservable(\n    onNext(255, 50),\n    onNext(330, 100),\n    onNext(350, 50),\n    onNext(400, 90),\n    onCompleted(900));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.window(ys, function () { throw error; })\n      .map(function (w, i) { return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(255, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 255)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 255)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#window opening closings dispose', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(255, 50),\n    onNext(330, 100),\n    onNext(350, 50),\n    onNext(400, 90),\n    onCompleted(900)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.window(ys, function (x) {\n      return Observable.timer(x, scheduler);\n    }).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  }, { disposed: 415 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(260, '0 4'),\n    onNext(340, '1 6'),\n    onNext(410, '1 7'),\n    onNext(410, '3 7')\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 415)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 415)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#window opening closings data error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onError(415, error)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(255, 50),\n    onNext(330, 100),\n    onNext(350, 50),\n    onNext(400, 90),\n    onCompleted(900)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.window(ys, function (x) {\n      return Observable.timer(x, scheduler);\n    }).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(260, '0 4'),\n    onNext(340, '1 6'),\n    onNext(410, '1 7'),\n    onNext(410, '3 7'),\n    onError(415, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 415)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 415)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#window opening closings window error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(255, 50),\n    onNext(330, 100),\n    onNext(350, 50),\n    onNext(400, 90),\n    onError(415, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.window(ys, function (x) {\n      return Observable.timer(x, scheduler);\n    }).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(260, '0 4'),\n    onNext(340, '1 6'),\n    onNext(410, '1 7'),\n    onNext(410, '3 7'),\n    onError(415, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 415)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 415)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#window_Boundaries_Simple', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(255, true),\n    onNext(330, true),\n    onNext(350, true),\n    onNext(400, true),\n    onNext(500, true),\n    onCompleted(900)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.window(ys).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, '0 3'),\n    onNext(260, '1 4'),\n    onNext(310, '1 5'),\n    onNext(340, '2 6'),\n    onNext(410, '4 7'),\n    onNext(420, '4 8'),\n    onNext(470, '4 9'),\n    onNext(550, '5 10'),\n    onCompleted(590)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 590)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 590)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#window boundaries onCompleted boundaries', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(255, true),\n    onNext(330, true),\n    onNext(350, true),\n    onCompleted(400)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.window(ys).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, '0 3'),\n    onNext(260, '1 4'),\n    onNext(310, '1 5'),\n    onNext(340, '2 6'),\n    onCompleted(400)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#window boundaries onError source', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(380, 7),\n    onError(400, error)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(255, true),\n    onNext(330, true),\n    onNext(350, true),\n    onCompleted(500)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.window(ys).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, '0 3'),\n    onNext(260, '1 4'),\n    onNext(310, '1 5'),\n    onNext(340, '2 6'),\n    onNext(380, '3 7'),\n    onError(400, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#window boundaries onError boundaries', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(90, 1),\n    onNext(180, 2),\n    onNext(250, 3),\n    onNext(260, 4),\n    onNext(310, 5),\n    onNext(340, 6),\n    onNext(410, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onNext(550, 10),\n    onCompleted(590)\n  );\n\n  var ys = scheduler.createHotObservable(\n    onNext(255, true),\n    onNext(330, true),\n    onNext(350, true),\n    onError(400, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.window(ys).map(function (w, i) {\n      return w.map(function (x) {\n        return i + ' ' + x;\n      });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(250, '0 3'),\n    onNext(260, '1 4'),\n    onNext(310, '1 5'),\n    onNext(340, '2 6'),\n    onError(400, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  reactiveAssert(t, ys.subscriptions, [\n    subscribe(200, 400)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/windowcount.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  map: require('../observable/map'),\n  mergeAll: require('../observable/mergeall'),\n  windowCount: require('../observable/windowcount')\n});\n\ntest('Observable#windowCount basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(100, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(280, 4),\n    onNext(320, 5),\n    onNext(350, 6),\n    onNext(380, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onCompleted(600));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.windowCount(3, 2).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, '0 2'),\n    onNext(240, '0 3'),\n    onNext(280, '0 4'),\n    onNext(280, '1 4'),\n    onNext(320, '1 5'),\n    onNext(350, '1 6'),\n    onNext(350, '2 6'),\n    onNext(380, '2 7'),\n    onNext(420, '2 8'),\n    onNext(420, '3 8'),\n    onNext(470, '3 9'),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#windowCount disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(100, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(280, 4),\n    onNext(320, 5),\n    onNext(350, 6),\n    onNext(380, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onCompleted(600));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.windowCount(3, 2).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  }, { disposed: 370 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, '0 2'),\n    onNext(240, '0 3'),\n    onNext(280, '0 4'),\n    onNext(280, '1 4'),\n    onNext(320, '1 5'),\n    onNext(350, '1 6'),\n    onNext(350, '2 6')\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 370)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#windowCount error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(100, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(280, 4),\n    onNext(320, 5),\n    onNext(350, 6),\n    onNext(380, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onError(600, error));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.windowCount(3, 2).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, '0 2'),\n    onNext(240, '0 3'),\n    onNext(280, '0 4'),\n    onNext(280, '1 4'),\n    onNext(320, '1 5'),\n    onNext(350, '1 6'),\n    onNext(350, '2 6'),\n    onNext(380, '2 7'),\n    onNext(420, '2 8'),\n    onNext(420, '3 8'),\n    onNext(470, '3 9'),\n    onError(600, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/windowed.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  controlled: require('../observable/controlled')\n});\n\ntest('ControlledObservable#windowed never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.controlled(true, scheduler).windowed(5, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('ControlledObservable#windowed empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.controlled(true, scheduler).windowed(5, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('ControlledObservable#windowed basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.controlled(true, scheduler).windowed(5, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onCompleted(250)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('ControlledObservable#windowed error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onError(250, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.controlled(true, scheduler).windowed(5, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onError(250, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 250)\n  ]);\n\n  t.end();\n});\n\ntest('ControlledObservable#windowed infinite', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.controlled(true, scheduler).windowed(5, scheduler);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('ControlledObservable#windowed disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5),\n    onNext(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.controlled(true, scheduler).windowed(5, scheduler);\n  }, { disposed: 235 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 235)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/windowtime.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToObject({\n  just: require('../observable/just')\n});\n\nObservable.addToPrototype({\n  concat: require('../observable/concat'),\n  map: require('../observable/map'),\n  mergeAll: require('../observable/mergeall'),\n  windowTime: require('../observable/windowtime')\n});\n\ntest('Observable#windowTime basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(270, 4),\n    onNext(320, 5),\n    onNext(360, 6),\n    onNext(390, 7),\n    onNext(410, 8),\n    onNext(460, 9),\n    onNext(470, 10),\n    onCompleted(490)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return xs.windowTime(100, scheduler).map(function (ys, i) {\n      return ys.map(function (y) { return i + ' ' + y; }).concat(Observable.just(i + ' end'));\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, '0 2'),\n    onNext(240, '0 3'),\n    onNext(270, '0 4'),\n    onNext(300, '0 end'),\n    onNext(320, '1 5'),\n    onNext(360, '1 6'),\n    onNext(390, '1 7'),\n    onNext(400, '1 end'),\n    onNext(410, '2 8'),\n    onNext(460, '2 9'),\n    onNext(470, '2 10'),\n    onNext(490, '2 end'),\n    onCompleted(490)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 490)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#windowTime basic both', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(270, 4),\n    onNext(320, 5),\n    onNext(360, 6),\n    onNext(390, 7),\n    onNext(410, 8),\n    onNext(460, 9),\n    onNext(470, 10),\n    onCompleted(490));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.windowTime(100, 50, scheduler).map(function (ys, i) {\n      return ys.map(function (y) { return i + ' ' + y; }).concat(Observable.just(i + ' end'));\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, '0 2'),\n    onNext(240, '0 3'),\n    onNext(270, '0 4'),\n    onNext(270, '1 4'),\n    onNext(300, '0 end'),\n    onNext(320, '1 5'),\n    onNext(320, '2 5'),\n    onNext(350, '1 end'),\n    onNext(360, '2 6'),\n    onNext(360, '3 6'),\n    onNext(390, '2 7'),\n    onNext(390, '3 7'),\n    onNext(400, '2 end'),\n    onNext(410, '3 8'),\n    onNext(410, '4 8'),\n    onNext(450, '3 end'),\n    onNext(460, '4 9'),\n    onNext(460, '5 9'),\n    onNext(470, '4 10'),\n    onNext(470, '5 10'),\n    onNext(490, '4 end'),\n    onNext(490, '5 end'),\n    onCompleted(490)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 490)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#windowTime basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(100, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(280, 4),\n    onNext(320, 5),\n    onNext(350, 6),\n    onNext(380, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onCompleted(600));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.windowTime(100, 70, scheduler).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, '0 2'),\n    onNext(240, '0 3'),\n    onNext(280, '0 4'),\n    onNext(280, '1 4'),\n    onNext(320, '1 5'),\n    onNext(350, '1 6'),\n    onNext(350, '2 6'),\n    onNext(380, '2 7'),\n    onNext(420, '2 8'),\n    onNext(420, '3 8'),\n    onNext(470, '3 9'),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#windowTime Error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(100, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(280, 4),\n    onNext(320, 5),\n    onNext(350, 6),\n    onNext(380, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onError(600, error));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.windowTime(100, 70, scheduler).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x;   });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, '0 2'),\n    onNext(240, '0 3'),\n    onNext(280, '0 4'),\n    onNext(280, '1 4'),\n    onNext(320, '1 5'),\n    onNext(350, '1 6'),\n    onNext(350, '2 6'),\n    onNext(380, '2 7'),\n    onNext(420, '2 8'),\n    onNext(420, '3 8'),\n    onNext(470, '3 9'),\n    onError(600, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#windowTime disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(100, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(280, 4),\n    onNext(320, 5),\n    onNext(350, 6),\n    onNext(380, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onCompleted(600));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.windowTime(100, 70, scheduler).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  }, { disposed: 370 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, '0 2'),\n    onNext(240, '0 3'),\n    onNext(280, '0 4'),\n    onNext(280, '1 4'),\n    onNext(320, '1 5'),\n    onNext(350, '1 6'),\n    onNext(350, '2 6')\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 370)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#windowTime basic same', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(100, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(280, 4),\n    onNext(320, 5),\n    onNext(350, 6),\n    onNext(380, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onCompleted(600));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.windowTime(100, scheduler).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, '0 2'),\n    onNext(240, '0 3'),\n    onNext(280, '0 4'),\n    onNext(320, '1 5'),\n    onNext(350, '1 6'),\n    onNext(380, '1 7'),\n    onNext(420, '2 8'),\n    onNext(470, '2 9'),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/windowtimeorcount.js",
    "content": "'use strict';\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToPrototype({\n  map: require('../observable/map'),\n  mergeAll: require('../observable/mergeall'),\n  windowTimeOrCount: require('../observable/windowtimeorcount')\n});\n\ntest('Observable#windowTimeOrCount basic', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(205, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(280, 4),\n    onNext(320, 5),\n    onNext(350, 6),\n    onNext(370, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onCompleted(600));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.windowTimeOrCount(70, 3, scheduler).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(205, '0 1'),\n    onNext(210, '0 2'),\n    onNext(240, '0 3'),\n    onNext(280, '1 4'),\n    onNext(320, '2 5'),\n    onNext(350, '2 6'),\n    onNext(370, '2 7'),\n    onNext(420, '3 8'),\n    onNext(470, '4 9'),\n    onCompleted(600)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#windowTimeOrCount Error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(205, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(280, 4),\n    onNext(320, 5),\n    onNext(350, 6),\n    onNext(370, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onError(600, error));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.windowTimeOrCount(70, 3, scheduler).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(205, '0 1'),\n    onNext(210, '0 2'),\n    onNext(240, '0 3'),\n    onNext(280, '1 4'),\n    onNext(320, '2 5'),\n    onNext(350, '2 6'),\n    onNext(370, '2 7'),\n    onNext(420, '3 8'),\n    onNext(470, '4 9'),\n    onError(600, error)\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 600)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#windowTimeOrCount disposed', function (t) {\n  var scheduler = new TestScheduler();\n\n  var xs = scheduler.createHotObservable(\n    onNext(205, 1),\n    onNext(210, 2),\n    onNext(240, 3),\n    onNext(280, 4),\n    onNext(320, 5),\n    onNext(350, 6),\n    onNext(370, 7),\n    onNext(420, 8),\n    onNext(470, 9),\n    onCompleted(600));\n\n  var results = scheduler.startScheduler(function () {\n    return xs.windowTimeOrCount(70, 3, scheduler).map(function (w, i) {\n      return w.map(function (x) { return i + ' ' + x; });\n    }).mergeAll();\n  }, { disposed: 370 });\n\n  reactiveAssert(t, results.messages, [\n    onNext(205, '0 1'),\n    onNext(210, '0 2'),\n    onNext(240, '0 3'),\n    onNext(280, '1 4'),\n    onNext(320, '2 5'),\n    onNext(350, '2 6'),\n    onNext(370, '2 7')\n  ]);\n\n  reactiveAssert(t, xs.subscriptions, [\n    subscribe(200, 370)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/withlatestfrom.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nfunction add (x, y) { return x + y; }\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted;\n\nObservable.addToObject({\n  never: require('../observable/never')\n});\n\nObservable.addToPrototype({\n  withLatestFrom: require('../observable/withlatestfrom')\n});\n\ntest('Observable#withLatestFrom never never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = Observable.never();\n  var e2 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return e1.withLatestFrom(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom never empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = Observable.never();\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.withLatestFrom(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom empty never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = Observable.never();\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.withLatestFrom(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom emptyempty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.withLatestFrom(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom empty return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(220)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.withLatestFrom(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom return empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(220)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.withLatestFrom(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom never return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(220)\n  );\n\n  var e2 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return e1.withLatestFrom(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom return never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(210)\n  );\n\n  var e2 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return e2.withLatestFrom(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom return return', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 3),\n    onCompleted(240)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.withLatestFrom(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 2 + 3),\n    onCompleted(230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom empty error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.withLatestFrom(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom error empty', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.withLatestFrom(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom return throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.withLatestFrom(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom throw return', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.withLatestFrom(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom throw throw', function (t) {\n  var error1 = new Error('error1');\n  var error2 = new Error('error2');\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error1)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(230, error2)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.withLatestFrom(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error1)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom error throw', function (t) {\n  var error1 = new Error('error1');\n  var error2 = new Error('error2');\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(220, error1)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(230, error2)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.withLatestFrom(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error1)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom throw error', function (t) {\n  var error1 = new Error('error1');\n  var error2 = new Error('error2');\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onError(220, error1)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(230, error2)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.withLatestFrom(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error1)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom never throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = Observable.never();\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.withLatestFrom(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom throw never', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = Observable.never();\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.withLatestFrom(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom some throw', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.withLatestFrom(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom throw some', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.withLatestFrom(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom throw after complete left', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(220)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(230, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.withLatestFrom(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom throw after complete right', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(220)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(230, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.withLatestFrom(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(230, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom interleaved with tail', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 3),\n    onNext(230, 5),\n    onNext(235, 6),\n    onNext(240, 7),\n    onCompleted(250)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onNext(225, 4),\n    onCompleted(230)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.withLatestFrom(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 3 + 2),\n    onNext(230, 5 + 4),\n    onNext(235, 6 + 4),\n    onNext(240, 7 + 4),\n    onCompleted(250)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom consecutive', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onNext(235, 4),\n    onCompleted(240)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(225, 6),\n    onNext(240, 7),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.withLatestFrom(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(235, 4 + 6),\n    onCompleted(240)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom consecutive array', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onNext(235, 4),\n    onCompleted(240)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(225, 6),\n    onNext(240, 7),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.withLatestFrom(e2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(235, [4,6]),\n    onCompleted(240)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom consecutive end with error left', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onNext(225, 4),\n    onError(230, error)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(235, 6),\n    onNext(240, 7),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.withLatestFrom(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(230, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom consecutive end with error right', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onNext(225, 4),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(235, 6),\n    onNext(240, 7),\n    onError(245, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.withLatestFrom(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(235, 4 + 6),\n    onNext(240, 4 + 7),\n    onError(245, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom consecutive end with error right array', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onNext(225, 4),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(235, 6),\n    onNext(240, 7),\n    onError(245, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.withLatestFrom(e1);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(235, [6,4]),\n    onNext(240, [7,4]),\n    onError(245, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable#withLatestFrom selector throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 3),\n    onCompleted(240)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.withLatestFrom(e2, function () {\n      throw error;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/test/zip.js",
    "content": "'use strict';\n/* jshint undef: true, unused: true */\n\nfunction add (x, y) { return x + y; }\n\nvar test = require('tape');\nvar Observable = require('../observable');\nvar TestScheduler = require('../testing/testscheduler');\nvar reactiveAssert = require('../testing/reactiveassert');\nvar ReactiveTest = require('../testing/reactivetest');\nvar onNext = ReactiveTest.onNext,\n  onError = ReactiveTest.onError,\n  onCompleted = ReactiveTest.onCompleted,\n  subscribe = ReactiveTest.subscribe;\n\nObservable.addToObject({\n  never: require('../observable/never'),\n  zip: require('../observable/zip')\n});\n\nObservable.addToPrototype({\n  zip: require('../observable/zip'),\n  zipIterable: require('../observable/zipiterable')\n});\n\ntest('Observable.zip n-ary symmetric', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e0 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 1),\n    onNext(250, 4),\n    onCompleted(420)\n  );\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onNext(240, 5),\n    onCompleted(410)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(230, 3),\n    onNext(260, 6),\n    onCompleted(400)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.zip(e0, e1, e2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, [1, 2, 3]),\n    onNext(260, [4, 5, 6]),\n    onCompleted(420)\n  ]);\n\n  reactiveAssert(t, e0.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  reactiveAssert(t, e1.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  reactiveAssert(t, e2.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zip n-ary symmetric selector', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e0 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 1),\n    onNext(250, 4),\n    onCompleted(420)\n  );\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onNext(240, 5),\n    onCompleted(410)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(230, 3),\n    onNext(260, 6),\n    onCompleted(400)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.zip(e0, e1, e2, function (r0, r1, r2) { return [r0, r1, r2]; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, [1, 2, 3]),\n    onNext(260, [4, 5, 6]),\n    onCompleted(420)\n  ]);\n\n  reactiveAssert(t, e0.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  reactiveAssert(t, e1.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  reactiveAssert(t, e2.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zip n-ary array symmetric', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e0 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 1),\n    onNext(250, 4),\n    onCompleted(420)\n  );\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onNext(240, 5),\n    onCompleted(410)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(230, 3),\n    onNext(260, 6),\n    onCompleted(400)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.zip(e0, e1, e2);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, [1, 2, 3]),\n    onNext(260, [4, 5, 6]),\n    onCompleted(420)\n  ]);\n\n  reactiveAssert(t, e0.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  reactiveAssert(t, e1.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  reactiveAssert(t, e2.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zip n-ary symmetric array selector', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e0 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 1),\n    onNext(250, 4),\n    onCompleted(420)\n  );\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 2),\n    onNext(240, 5),\n    onCompleted(410)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(230, 3),\n    onNext(260, 6),\n    onCompleted(400)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.zip(e0, e1, e2, function (r0, r1, r2) { return [r0, r1, r2]; });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(230, [1, 2, 3]),\n    onNext(260, [4, 5, 6]),\n    onCompleted(420)\n  ]);\n\n  reactiveAssert(t, e0.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  reactiveAssert(t, e1.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  reactiveAssert(t, e2.subscriptions, [\n    subscribe(200, 420)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zip never never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = Observable.never();\n  var o2 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return o1.zip(o2, add);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable.zip never empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o1 = Observable.never();\n  var o2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return o1.zip(o2, add);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable.zip empty empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.zip(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zip empty non-empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(220)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.zip(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(215)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zip non-empty empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(220)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.zip(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(215)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zip never non-empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(220)\n  );\n\n  var e2 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return e2.zip(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable.zip non-empty never', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(220)\n  );\n\n  var e2 = Observable.never();\n\n  var results = scheduler.startScheduler(function () {\n    return e1.zip(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  t.end();\n});\n\ntest('Observable.zip non-empty non-empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 3),\n    onCompleted(240)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.zip(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 2 + 3),\n    onCompleted(240)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zip empty error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1), onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.zip(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zip error empty', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.zip(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zip never error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = Observable.never();\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.zip(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [onError(220, error)]);\n\n  t.end();\n});\n\ntest('Observable.zip error never', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = Observable.never();\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n      return e2.zip(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zip error error', function (t) {\n  var error1 = new Error();\n  var error2 = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(230, error1)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error2)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.zip(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error2)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zip some error', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.zip(e2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zip error some', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(230)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e2.zip(e1, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zip some data asymmetric 1', function (t) {\n  var i;\n  var scheduler = new TestScheduler();\n\n  var msgs1 = (function () {\n    var results = [];\n    for (i = 0; i < 5; i++) {\n      results.push(onNext(205 + i * 5, i));\n    }\n    return results;\n  })();\n\n  var msgs2 = (function () {\n    var results = [];\n    for (i = 0; i < 10; i++) {\n      results.push(onNext(205 + i * 8, i));\n    }\n    return results;\n  })();\n\n  var len = Math.min(msgs1.length, msgs2.length);\n\n  var e1 = scheduler.createHotObservable(msgs1);\n  var e2 = scheduler.createHotObservable(msgs2);\n\n  var results = scheduler.startScheduler(function () {\n    return e1.zip(e2, add);\n  }).messages;\n\n  t.equal(len, results.length);\n\n  for (i = 0; i < len; i++) {\n    var sum = msgs1[i].value.value + msgs2[i].value.value;\n    var time = Math.max(msgs1[i].time, msgs2[i].time);\n    t.ok(results[i].value.kind === 'N' && results[i].time === time && results[i].value.value === sum);\n  }\n\n  t.end();\n});\n\ntest('Observable.zip some data asymmetric 2', function (t) {\n  var i;\n  var scheduler = new TestScheduler();\n\n  var msgs1 = (function () {\n    var results = [];\n    for (i = 0; i < 10; i++) {\n      results.push(onNext(205 + i * 5, i));\n    }\n    return results;\n  })();\n\n  var msgs2 = (function () {\n    var results = [];\n    for (i = 0; i < 5; i++) {\n      results.push(onNext(205 + i * 8, i));\n    }\n    return results;\n  })();\n\n  var len = Math.min(msgs1.length, msgs2.length);\n\n  var e1 = scheduler.createHotObservable(msgs1);\n  var e2 = scheduler.createHotObservable(msgs2);\n\n  var results = scheduler.startScheduler(function () {\n    return e1.zip(e2, add);\n  }).messages;\n\n  t.equal(len, results.length);\n\n  for (i = 0; i < len; i++) {\n    var sum = msgs1[i].value.value + msgs2[i].value.value;\n    var time = Math.max(msgs1[i].time, msgs2[i].time);\n    t.ok(results[i].value.kind === 'N' && results[i].time === time && results[i].value.value === sum);\n  }\n\n  t.end();\n});\n\ntest('Observable.zip some data symmetric', function (t) {\n  var i;\n\n  var scheduler = new TestScheduler();\n\n  var msgs1 = (function () {\n    var results = [];\n    for (i = 0; i < 10; i++) {\n      results.push(onNext(205 + i * 5, i));\n    }\n    return results;\n  })();\n\n  var msgs2 = (function () {\n    var results = [];\n    for (i = 0; i < 10; i++) {\n      results.push(onNext(205 + i * 8, i));\n    }\n    return results;\n  })();\n\n  var len = Math.min(msgs1.length, msgs2.length);\n\n  var e1 = scheduler.createHotObservable(msgs1);\n  var e2 = scheduler.createHotObservable(msgs2);\n\n  var results = scheduler.startScheduler(function () {\n    return e1.zip(e2, add);\n  }).messages;\n\n  t.equal(len, results.length);\n\n  for (i = 0; i < len; i++) {\n    var sum = msgs1[i].value.value + msgs2[i].value.value;\n    var time = Math.max(msgs1[i].time, msgs2[i].time);\n    t.ok(results[i].value.kind === 'N' && results[i].time === time && results[i].value.value === sum);\n  }\n\n  t.end();\n});\n\ntest('Observable.zip selector throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var e1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onNext(225, 4),\n    onCompleted(240)\n  );\n\n  var e2 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(220, 3),\n    onNext(230, 5),\n    onCompleted(250)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return e1.zip(e2, function (x, y) {\n      if (y === 5) {\n        throw error;\n      } else {\n        return x + y;\n      }\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(220, 2 + 3),\n    onError(230, error)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zip right completes first', function (t) {\n  var scheduler = new TestScheduler();\n\n  var o = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 4),\n    onCompleted(225)\n  );\n\n  var e = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onCompleted(220)\n  );\n\n  var results = scheduler.startScheduler(function () {\n    return o.zip(e, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, 6),\n    onCompleted(225)\n  ]);\n\n  reactiveAssert(t, o.subscriptions, [\n    subscribe(200, 225)\n  ]);\n\n  reactiveAssert(t, e.subscriptions, [\n    subscribe(200, 225)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zipIterable never empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var n1 = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n\n  var n2 = [];\n\n  var results = scheduler.startScheduler(function () {\n    return n1.zipIterable(n2, add);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, n1.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zipIterable empty empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var n1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n  var n2 = [];\n\n  var results = scheduler.startScheduler(function () {\n    return n1.zipIterable(n2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(210)\n  ]);\n\n  reactiveAssert(t, n1.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zipIterable empty non-empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var n1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onCompleted(210)\n  );\n\n  var n2 = [2];\n\n  var results = scheduler.startScheduler(function () {\n    return n1.zipIterable(n2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(210)\n  ]);\n\n  reactiveAssert(t, n1.subscriptions, [\n    subscribe(200, 210)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zipIterable non-empty empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var n1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(220)\n  );\n  var n2 = [];\n\n  var results = scheduler.startScheduler(function () {\n    return n1.zipIterable(n2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onCompleted(215)\n  ]);\n\n  reactiveAssert(t, n1.subscriptions, [\n    subscribe(200, 215)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zipIterable never non-empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var n1 = scheduler.createHotObservable(\n    onNext(150, 1)\n  );\n  var n2 = [2];\n\n  var results = scheduler.startScheduler(function () {\n    return n1.zipIterable(n2, add);\n  });\n\n  reactiveAssert(t, results.messages, []);\n\n  reactiveAssert(t, n1.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zipIterable non-empty non-empty', function (t) {\n  var scheduler = new TestScheduler();\n\n  var n1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onCompleted(230)\n  );\n\n  var n2 = [3];\n\n  var results = scheduler.startScheduler(function () {\n    return n1.zipIterable(n2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, 2 + 3),\n    onCompleted(230)\n  ]);\n\n  reactiveAssert(t, n1.subscriptions, [\n    subscribe(200, 230)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zipIterable error empty', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var n1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n  var n2 = [];\n\n  var results = scheduler.startScheduler(function () {\n    return n1.zipIterable(n2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  reactiveAssert(t, n1.subscriptions, [\n    subscribe(200, 220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zipIterable error some', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var n1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onError(220, error)\n  );\n\n  var n2 = [2];\n\n  var results = scheduler.startScheduler(function () {\n    return n1.zipIterable(n2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onError(220, error)\n  ]);\n\n  reactiveAssert(t, n1.subscriptions, [\n    subscribe(200, 220)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zipIterable some data both sides', function (t) {\n  var scheduler = new TestScheduler();\n\n  var n1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(210, 2),\n    onNext(220, 3),\n    onNext(230, 4),\n    onNext(240, 5)\n  );\n\n  var n2 = [5, 4, 3, 2];\n\n  var results = scheduler.startScheduler(function () {\n    return n1.zipIterable(n2, add);\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(210, 7),\n    onNext(220, 7),\n    onNext(230, 7),\n    onNext(240, 7)\n  ]);\n\n  reactiveAssert(t, n1.subscriptions, [\n    subscribe(200, 1000)\n  ]);\n\n  t.end();\n});\n\ntest('Observable.zipIterable selector throws', function (t) {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var n1 = scheduler.createHotObservable(\n    onNext(150, 1),\n    onNext(215, 2),\n    onNext(225, 4),\n    onCompleted(240)\n  );\n\n  var n2 = [3, 5];\n\n  var results = scheduler.startScheduler(function () {\n    return n1.zipIterable(n2, function (x, y) {\n      if (y === 5) { throw error; }\n      return x + y;\n    });\n  });\n\n  reactiveAssert(t, results.messages, [\n    onNext(215, 2 + 3),\n    onError(225, error)\n  ]);\n\n  reactiveAssert(t, n1.subscriptions, [\n    subscribe(200, 225)\n  ]);\n\n  t.end();\n});\n"
  },
  {
    "path": "src/modular/testing/coldobservable.js",
    "content": "'use strict';\n\nvar CompositeDisposable = require('../compositedisposable');\nvar Disposable = require('../disposable');\nvar Observable = require('../observable');\nvar Subscription = require('./subscription');\nvar inherits = require('inherits');\n\nfunction ColdObservable(scheduler, messages) {\n  Observable.call(this);\n  this.scheduler = scheduler;\n  this.messages = messages;\n  this.subscriptions = [];\n}\n\ninherits(ColdObservable, Observable);\n\nColdObservable.prototype._subscribe = function (o) {\n  var message, notification, observable = this;\n  this.subscriptions.push(new Subscription(this.scheduler.clock));\n  var index = this.subscriptions.length - 1;\n  var d = new CompositeDisposable();\n  for (var i = 0, len = this.messages.length; i < len; i++) {\n    message = this.messages[i];\n    notification = message.value;\n    (function (innerNotification) {\n      d.add(observable.scheduler.scheduleRelative(null, message.time, function () {\n        innerNotification.accept(o);\n        return Disposable.empty;\n      }));\n    })(notification);\n  }\n  return Disposable.create(function () {\n    observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n    d.dispose();\n  });\n};\n\nmodule.exports = ColdObservable;\n"
  },
  {
    "path": "src/modular/testing/hotobservable.js",
    "content": "'use strict';\n\nvar Disposable = require('../disposable');\nvar Observable = require('../observable');\nvar Subscription = require('./subscription');\nvar inherits = require('inherits');\n\nfunction HotObservable(scheduler, messages) {\n  Observable.call(this);\n  var message, notification, observable = this;\n  this.scheduler = scheduler;\n  this.messages = messages;\n  this.subscriptions = [];\n  this.observers = [];\n  for (var i = 0, len = this.messages.length; i < len; i++) {\n    message = this.messages[i];\n    notification = message.value;\n    (function (innerNotification) {\n      scheduler.scheduleAbsolute(null, message.time, function () {\n        var obs = observable.observers.slice(0);\n\n        for (var j = 0, jLen = obs.length; j < jLen; j++) {\n          innerNotification.accept(obs[j]);\n        }\n        return Disposable.empty;\n      });\n    })(notification);\n  }\n}\n\ninherits(HotObservable, Observable);\n\nHotObservable.prototype._subscribe = function (o) {\n  var observable = this;\n  this.observers.push(o);\n  this.subscriptions.push(new Subscription(this.scheduler.clock));\n  var index = this.subscriptions.length - 1;\n  return Disposable.create(function () {\n    var idx = observable.observers.indexOf(o);\n    observable.observers.splice(idx, 1);\n    observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n  });\n};\n\nmodule.exports = HotObservable;\n"
  },
  {
    "path": "src/modular/testing/mockdisposable.js",
    "content": "'use strict';\n\nfunction MockDisposable (scheduler) {\n  this.scheduler = scheduler;\n  this.disposes = [];\n  this.disposes.push(this.scheduler.clock);\n}\n\nMockDisposable.prototype.dispose = function () {\n  this.disposes.push(this.scheduler.clock);\n};\n\nmodule.exports = MockDisposable;\n"
  },
  {
    "path": "src/modular/testing/mockobserver.js",
    "content": "'use strict';\n\nvar Notification = require('../notification');\nvar Observer = require('../observer');\nvar Recorded = require('./recorded');\nvar inherits = require('inherits');\n\nfunction MockObserver(scheduler) {\n  Observer.call(this);\n  this.scheduler = scheduler;\n  this.messages = [];\n}\n\ninherits(MockObserver, Observer);\n\nMockObserver.prototype.onNext = function (value) {\n  this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnNext(value)));\n};\n\nMockObserver.prototype.onError = function (e) {\n  this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnError(e)));\n};\n\nMockObserver.prototype.onCompleted = function () {\n  this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnCompleted()));\n};\n\nmodule.exports = MockObserver;\n"
  },
  {
    "path": "src/modular/testing/mockpromise.js",
    "content": "'use strict';\n\nvar Disposable = require('../disposable');\nvar ReactiveTest = require('./reactivetest');\nvar Subscription = require('./subscription');\nvar create = require('../observer/create');\n\nfunction MockPromise(scheduler, messages) {\n  var self = this;\n  this.scheduler = scheduler;\n  this.messages = messages;\n  this.subscriptions = [];\n  this.observers = [];\n  for (var i = 0, len = this.messages.length; i < len; i++) {\n    var message = this.messages[i],\n        notification = message.value;\n    (function (innerNotification) {\n      scheduler.scheduleAbsolute(null, message.time, function () {\n        var obs = self.observers.slice(0);\n\n        for (var j = 0, jLen = obs.length; j < jLen; j++) {\n          innerNotification.accept(obs[j]);\n        }\n        return Disposable.empty;\n      });\n    })(notification);\n  }\n}\n\nMockPromise.prototype.then = function (onResolved, onRejected) {\n  var self = this;\n\n  this.subscriptions.push(new Subscription(this.scheduler.clock));\n  var index = this.subscriptions.length - 1;\n\n  var newPromise;\n\n  var observer = create(\n    function (x) {\n      var retValue = onResolved(x);\n      if (retValue && typeof retValue.then === 'function') {\n        newPromise = retValue;\n      } else {\n        var ticks = self.scheduler.clock;\n        newPromise = new MockPromise(self.scheduler, [ReactiveTest.onNext(ticks, undefined), ReactiveTest.onCompleted(ticks)]);\n      }\n      var idx = self.observers.indexOf(observer);\n      self.observers.splice(idx, 1);\n      self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n    },\n    function (err) {\n      onRejected(err);\n      var idx = self.observers.indexOf(observer);\n      self.observers.splice(idx, 1);\n      self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n    }\n  );\n  this.observers.push(observer);\n\n  return newPromise || new MockPromise(this.scheduler, this.messages);\n};\n\nmodule.exports = MockPromise;\n"
  },
  {
    "path": "src/modular/testing/reactiveassert.js",
    "content": "'use strict';\n\nvar isEqual = require('../internal/isequal');\n\nfunction createMessage(actual, expected) {\n  return 'Expected: [' + expected.toString() + '] Actual: [' + actual.toString() + ']';\n}\n\nmodule.exports = function assertEqual (t, actual, expected) {\n  var i, isOk = true;\n  if (expected.length !== actual.length) {\n    return t.ok(false, 'Not equal length.'  + createMessage(actual, expected));\n  }\n  for (i = 0; i < expected.length; i++) {\n    var e = expected[i], a = actual[i];\n    // ALlow for predicates\n    if (e.value && typeof e.value.predicate === 'function') {\n      isOk = e.time === a.time && e.value.predicate(a.value);\n    } else {\n      isOk = isEqual(e, a);\n    }\n\n    if (!isOk) {\n      break;\n    }\n  }\n  t.ok(isOk, createMessage(actual, expected));\n};\n"
  },
  {
    "path": "src/modular/testing/reactivetest.js",
    "content": "'use strict';\n\nvar Notification = require('../notification');\nvar Recorded = require('./recorded');\nvar Subscription = require('./subscription');\n\nfunction OnNextPredicate(predicate) {\n  this.predicate = predicate;\n}\n\nOnNextPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'N') { return false; }\n  return this.predicate(other.value);\n};\n\nfunction OnErrorPredicate(predicate) {\n  this.predicate = predicate;\n}\n\nOnErrorPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'E') { return false; }\n  return this.predicate(other.error);\n};\n\nmodule.exports = {\n  /** Default virtual time used for creation of observable sequences in unit tests. */\n  created: 100,\n  /** Default virtual time used to subscribe to observable sequences in unit tests. */\n  subscribed: 200,\n  /** Default virtual time used to dispose subscriptions in unit tests. */\n  disposed: 1000,\n\n  /**\n   * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n   *\n   * 1 - ReactiveTest.onNext(200, 42);\n   * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n   *\n   * @param ticks Recorded virtual time the OnNext notification occurs.\n   * @param value Recorded value stored in the OnNext notification or a predicate.\n   * @return Recorded OnNext notification.\n   */\n  onNext: function (ticks, value) {\n    return typeof value === 'function' ?\n      new Recorded(ticks, new OnNextPredicate(value)) :\n      new Recorded(ticks, Notification.createOnNext(value));\n  },\n  /**\n   * Factory method for an OnError notification record at a given time with a given error.\n   *\n   * 1 - ReactiveTest.onNext(200, new Error('error'));\n   * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n   *\n   * @param ticks Recorded virtual time the OnError notification occurs.\n   * @param exception Recorded exception stored in the OnError notification.\n   * @return Recorded OnError notification.\n   */\n  onError: function (ticks, error) {\n    return typeof error === 'function' ?\n      new Recorded(ticks, new OnErrorPredicate(error)) :\n      new Recorded(ticks, Notification.createOnError(error));\n  },\n  /**\n   * Factory method for an OnCompleted notification record at a given time.\n   *\n   * @param ticks Recorded virtual time the OnCompleted notification occurs.\n   * @return Recorded OnCompleted notification.\n   */\n  onCompleted: function (ticks) {\n    return new Recorded(ticks, Notification.createOnCompleted());\n  },\n  /**\n   * Factory method for a subscription record based on a given subscription and disposal time.\n   *\n   * @param start Virtual time indicating when the subscription was created.\n   * @param end Virtual time indicating when the subscription was disposed.\n   * @return Subscription object.\n   */\n  subscribe: function (start, end) {\n    return new Subscription(start, end);\n  }\n};\n"
  },
  {
    "path": "src/modular/testing/recorded.js",
    "content": "'use strict';\n\nvar isEqual = require('../internal/isequal');\n\n/**\n * Creates a new object recording the production of the specified value at the given virtual time.\n *\n * @constructor\n * @param {Number} time Virtual time the value was produced on.\n * @param {Mixed} value Value that was produced.\n * @param {Function} comparer An optional comparer.\n */\nfunction Recorded (time, value, comparer) {\n  this.time = time;\n  this.value = value;\n  this.comparer = comparer || isEqual;\n}\n\n/**\n * Checks whether the given recorded object is equal to the current instance.\n *\n * @param {Recorded} other Recorded object to check for equality.\n * @returns {Boolean} true if both objects are equal; false otherwise.\n */\nRecorded.prototype.equals = function (other) {\n  return this.time === other.time && this.comparer(this.value, other.value);\n};\n\n/**\n * Returns a string representation of the current Recorded value.\n *\n * @returns {String} String representation of the current Recorded value.\n */\nRecorded.prototype.toString = function () {\n  return this.value.toString() + '@' + this.time;\n};\n\nmodule.exports = Recorded;\n"
  },
  {
    "path": "src/modular/testing/subscription.js",
    "content": "'use strict';\n\n/**\n * Creates a new subscription object with the given virtual subscription and unsubscription time.\n *\n * @constructor\n * @param {Number} subscribe Virtual time at which the subscription occurred.\n * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n */\nfunction Subscription (start, end) {\n  this.subscribe = start;\n  this.unsubscribe = end || Number.MAX_VALUE;\n}\n\n/**\n * Checks whether the given subscription is equal to the current instance.\n * @param other Subscription object to check for equality.\n * @returns {Boolean} true if both objects are equal; false otherwise.\n */\nSubscription.prototype.equals = function (other) {\n  return this.subscribe === other.subscribe && this.unsubscribe === other.unsubscribe;\n};\n\n/**\n * Returns a string representation of the current Subscription value.\n * @returns {String} String representation of the current Subscription value.\n */\nSubscription.prototype.toString = function () {\n  return '(' + this.subscribe + ', ' + (this.unsubscribe === Number.MAX_VALUE ? 'Infinite' : this.unsubscribe) + ')';\n};\n\nmodule.exports = Subscription;\n"
  },
  {
    "path": "src/modular/testing/testscheduler.js",
    "content": "'use strict';\n\nvar ColdObservable = require('./coldobservable');\nvar Disposable = require('../disposable');\nvar HotObservable = require('./hotobservable');\nvar MockObserver = require('./mockobserver');\nvar MockPromise = require('./mockpromise');\nvar MockDisposable = require('./mockdisposable');\nvar ReactiveTest = require('./reactivetest');\nvar VirtualTimeScheduler = require('../scheduler/virtualtimescheduler');\nvar inherits = require('inherits');\n\nfunction baseComparer(x, y) { return x > y ? 1 : (x < y ? -1 : 0); }\n\nfunction TestScheduler() {\n  VirtualTimeScheduler.call(this, 0, baseComparer);\n}\n\ninherits(TestScheduler, VirtualTimeScheduler);\n\n/**\n * Schedules an action to be executed at the specified virtual time.\n *\n * @param state State passed to the action to be executed.\n * @param dueTime Absolute virtual time at which to execute the action.\n * @param action Action to be executed.\n * @return Disposable object used to cancel the scheduled action (best effort).\n */\nTestScheduler.prototype.scheduleAbsolute = function (state, dueTime, action) {\n  dueTime <= this.clock && (dueTime = this.clock + 1);\n  return VirtualTimeScheduler.prototype.scheduleAbsolute.call(this, state, dueTime, action);\n};\n/**\n * Adds a relative virtual time to an absolute virtual time value.\n *\n * @param absolute Absolute virtual time value.\n * @param relative Relative virtual time value to add.\n * @return Resulting absolute virtual time sum value.\n */\nTestScheduler.prototype.add = function (absolute, relative) {\n  return absolute + relative;\n};\n/**\n * Converts the absolute virtual time value to a DateTimeOffset value.\n *\n * @param absolute Absolute virtual time value to convert.\n * @return Corresponding DateTimeOffset value.\n */\nTestScheduler.prototype.toAbsoluteTime = function (absolute) {\n  return new Date(absolute).getTime();\n};\n/**\n * Converts the TimeSpan value to a relative virtual time value.\n *\n * @param timeSpan TimeSpan value to convert.\n * @return Corresponding relative virtual time value.\n */\nTestScheduler.prototype.toRelativeTime = function (timeSpan) {\n  return timeSpan;\n};\n/**\n * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n *\n * @param create Factory method to create an observable sequence.\n * @param created Virtual time at which to invoke the factory to create an observable sequence.\n * @param subscribed Virtual time at which to subscribe to the created observable sequence.\n * @param disposed Virtual time at which to dispose the subscription.\n * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n */\nTestScheduler.prototype.startScheduler = function (createFn, settings) {\n  settings || (settings = {});\n  settings.created == null && (settings.created = ReactiveTest.created);\n  settings.subscribed == null && (settings.subscribed = ReactiveTest.subscribed);\n  settings.disposed == null && (settings.disposed = ReactiveTest.disposed);\n\n  var observer = this.createObserver(), source, subscription;\n\n  this.scheduleAbsolute(null, settings.created, function () {\n    source = createFn();\n    return Disposable.empty;\n  });\n\n  this.scheduleAbsolute(null, settings.subscribed, function () {\n    subscription = source.subscribe(observer);\n    return Disposable.empty;\n  });\n\n  this.scheduleAbsolute(null, settings.disposed, function () {\n    subscription.dispose();\n    return Disposable.empty;\n  });\n\n  this.start();\n\n  return observer;\n};\n\n/**\n * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n */\nTestScheduler.prototype.createHotObservable = function () {\n  var len = arguments.length, args;\n  if (Array.isArray(arguments[0])) {\n    args = arguments[0];\n  } else {\n    args = new Array(len);\n    for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  }\n  return new HotObservable(this, args);\n};\n\n/**\n * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n */\nTestScheduler.prototype.createColdObservable = function () {\n  var len = arguments.length, args;\n  if (Array.isArray(arguments[0])) {\n    args = arguments[0];\n  } else {\n    args = new Array(len);\n    for (var i = 0; i < len; i++) { args[i] = arguments[i]; }\n  }\n  return new ColdObservable(this, args);\n};\n\n/**\n * Creates a resolved promise with the given value and ticks\n * @param {Number} ticks The absolute time of the resolution.\n * @param {Any} value The value to yield at the given tick.\n * @returns {MockPromise} A mock Promise which fulfills with the given value.\n */\nTestScheduler.prototype.createResolvedPromise = function (ticks, value) {\n  return new MockPromise(this, [ReactiveTest.onNext(ticks, value), ReactiveTest.onCompleted(ticks)]);\n};\n\n/**\n * Creates a rejected promise with the given reason and ticks\n * @param {Number} ticks The absolute time of the resolution.\n * @param {Any} reason The reason for rejection to yield at the given tick.\n * @returns {MockPromise} A mock Promise which rejects with the given reason.\n */\nTestScheduler.prototype.createRejectedPromise = function (ticks, reason) {\n  return new MockPromise(this, [ReactiveTest.onError(ticks, reason)]);\n};\n\n/**\n * Creates an observer that records received notification messages and timestamps those.\n * @return Observer that can be used to assert the timing of received notifications.\n */\nTestScheduler.prototype.createObserver = function () {\n  return new MockObserver(this);\n};\n\n/**\n* Creates a disposable that records subscriptions and unsubscriptions.\n* @return A Disposable that has the absolute time for subscription and unsubscriptions.\n*/\nTestScheduler.prototype.createDisposable = function () {\n  return new MockDisposable(this);\n};\n\nmodule.exports = TestScheduler;\n"
  },
  {
    "path": "src/modular/webpack.config.js",
    "content": "'use strict';\n\nmodule.exports = {\n  module: {\n    loaders: [\n      { test: /\\.js$/, loaders: ['babel-loader'], exclude: /node_modules/ }\n    ]\n  },\n  output: {\n    library: 'rx',\n    libraryTarget: 'umd'\n  },\n  resolve: {\n    extensions: ['', '.js']\n  }\n};\n"
  },
  {
    "path": "src/modular/webpack.config.production.js",
    "content": "'use strict';\n\nvar webpack = require('webpack');\nvar baseConfig = require('./webpack.config.js');\n\nvar config = Object.create(baseConfig);\nconfig.plugins = [\n  new webpack.optimize.OccurenceOrderPlugin(),\n  new webpack.optimize.UglifyJsPlugin({\n    compressor: {\n      screw_ie8: true,\n      warnings: false\n    }\n  })\n];\n\nmodule.exports = config;\n"
  },
  {
    "path": "tests/concurrency/currentthreadscheduler.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, ok, equal */\n  QUnit.module('currentThreadScheduler');\n\n  var Scheduler = Rx.Scheduler;\n\n  Scheduler.currentThread.ensureTrampoline = function (action) {\n    if (this.scheduleRequired()) { this.schedule(null, action); } else { action(); }\n  };\n\n  test('current thread now', function () {\n    var res = Scheduler.currentThread.now() - new Date().getTime();\n    ok(res < 1000);\n  });\n\n  test('current thread schedule action', function () {\n    var ran = false;\n\n    Scheduler.currentThread.schedule(null, function () { ran = true; });\n\n    ok(ran);\n  });\n\n  test('current thread schedule action error', function () {\n    var error = new Error();\n\n    try {\n      Scheduler.currentThread.schedule(error, function (_, e) { throw e; });\n      ok(false);\n    } catch (e) {\n      equal(e, error);\n    }\n  });\n\n  test('current thread schedule nested', function () {\n    var ran = false;\n\n    Scheduler.currentThread.schedule(null, function () {\n      Scheduler.currentThread.schedule(null, function () { ran = true; });\n    });\n\n    ok(ran);\n  });\n\n  test('current thread ensure trampoline', function () {\n    var ran1 = false, ran2 = false;\n\n    Scheduler.currentThread.ensureTrampoline(function () {\n      Scheduler.currentThread.schedule(null, function () { ran1 = true; });\n      Scheduler.currentThread.schedule(null, function () { ran2 = true; });\n    });\n\n    ok(ran1);\n    ok(ran2);\n  });\n\n  test('current thread ensure trampoline nested', function () {\n    var ran1 = false, ran2 = false;\n\n    Scheduler.currentThread.ensureTrampoline(function () {\n      Scheduler.currentThread.ensureTrampoline(function () { ran1 = true; });\n      Scheduler.currentThread.ensureTrampoline(function () { ran2 = true; });\n    });\n\n    ok(ran1);\n    ok(ran2);\n  });\n\n  test('current thread ensure trampoline and cancel', function () {\n    var ran1 = false, ran2 = false;\n\n    Scheduler.currentThread.ensureTrampoline(function () {\n      Scheduler.currentThread.schedule(null, function () {\n        ran1 = true;\n        var d = Scheduler.currentThread.schedule(null, function () { ran2 = true; });\n        d.dispose();\n      });\n    });\n\n    ok(ran1);\n    ok(!ran2);\n  });\n\n}());\n"
  },
  {
    "path": "tests/concurrency/defaultscheduler.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, ok, asyncTest, start */\n\n  QUnit.module('defaultScheduler');\n\n  var DefaultScheduler = Rx.Scheduler['default'];\n\n  test('default now', function () {\n    var res = DefaultScheduler.now() - new Date().getTime();\n    ok(res < 1000);\n  });\n\n  asyncTest('default schedule action', 1, function () {\n    DefaultScheduler.schedule(null, function () {\n      ok(true);\n      start();\n    });\n  });\n\n  asyncTest('default schedule relative', 1, function () {\n    var startTime = +new Date();\n\n    DefaultScheduler.scheduleFuture(null, 200, function () {\n      var endTime = +new Date();\n      ok(endTime - startTime > 180, endTime - startTime);\n      start();\n    });\n  });\n\n  asyncTest('default schedule action cancel', 1, function () {\n    var set = false;\n    var d = DefaultScheduler.scheduleFuture(null, 200, function () { set = true; });\n\n    d.dispose();\n\n    setTimeout(function () {\n      ok(!set);\n      start();\n    }, 400);\n  });\n\n}());\n"
  },
  {
    "path": "tests/concurrency/historicalscheduler.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal, ok */\n\n  QUnit.module('HistoricalScheduler');\n\n  var HistoricalScheduler = Rx.HistoricalScheduler;\n\n  function arrayEquals(first, second) {\n    if (first.length !== second.length) {\n      ok(false);\n    }\n    for (var i = 0, len = first.length; i < len; i++) {\n      var f = first[i], s = second[i];\n      if (f.equals && s.equals) {\n        ok(f.equals(s));\n      } else {\n        ok(f === s);\n      }\n    }\n  }\n\n  function time(days) {\n    var d = new Date(1979,10,31,4,30,15);\n    d.setUTCDate(d.getDate() + days);\n    return d.getTime();\n  }\n\n  function fromDays(days) {\n    return 86400000 * days;\n  }\n\n  function Timestamped (value, timestamp) {\n    this.value = value;\n    this.timestamp = timestamp;\n  }\n\n  Timestamped.prototype.equals = function (other) {\n    if (other == null) { return false; }\n    return other.value === this.value && other.timestamp === this.timestamp;\n  };\n\n  test('constructor', function () {\n    var s = new HistoricalScheduler();\n    equal(0, s.clock);\n    equal(false, s.isEnabled);\n  });\n\n  test('start and stop', function () {\n    var s = new HistoricalScheduler();\n\n    var list = [];\n\n    s.scheduleAbsolute(null, time(0), function () { list.push(new Timestamped(1, s.now())); });\n    s.scheduleAbsolute(null, time(1), function () { list.push(new Timestamped(2, s.now())); });\n    s.scheduleAbsolute(null, time(2), function () { s.stop(); });\n    s.scheduleAbsolute(null, time(3), function () { list.push(new Timestamped(3, s.now())); });\n    s.scheduleAbsolute(null, time(4), function () { s.stop(); });\n    s.scheduleAbsolute(null, time(5), function () { s.start(); });\n    s.scheduleAbsolute(null, time(6), function () { list.push(new Timestamped(4, s.now())); });\n\n    s.start();\n\n    equal(time(2), s.now());\n    equal(time(2), s.clock);\n\n    s.start();\n\n    equal(time(4), s.now());\n    equal(time(4), s.clock);\n\n    s.start();\n\n    equal(time(6), s.now());\n    equal(time(6), s.clock);\n\n    s.start();\n\n    equal(time(6), s.now());\n    equal(time(6), s.clock);\n\n    arrayEquals(list, [\n      new Timestamped(1, time(0)),\n      new Timestamped(2, time(1)),\n      new Timestamped(3, time(3)),\n      new Timestamped(4, time(6))\n    ]);\n  });\n\n  test('order', function () {\n    var s = new HistoricalScheduler();\n\n    var list = [];\n\n    s.scheduleAbsolute(null, time(2), function () { list.push(new Timestamped(2, s.now())); });\n\n    s.scheduleAbsolute(null, time(3), function () { list.push(new Timestamped(3, s.now())); });\n\n    s.scheduleAbsolute(null, time(1), function () { list.push(new Timestamped(0, s.now())); });\n    s.scheduleAbsolute(null, time(1), function () { list.push(new Timestamped(1, s.now())); });\n\n    s.start();\n\n    arrayEquals(list, [\n      new Timestamped(0, time(1)),\n      new Timestamped(1, time(1)),\n      new Timestamped(2, time(2)),\n      new Timestamped(3, time(3))\n    ]);\n  });\n\n  test('cancellation', function () {\n    var s = new HistoricalScheduler();\n\n    var list = [];\n\n    var d = s.scheduleAbsolute(null, time(2), function () { list.push(new Timestamped(2, s.now())); });\n\n    s.scheduleAbsolute(null, time(1), function () {\n      list.push(new Timestamped(0, s.now()));\n      d.dispose();\n    });\n\n    s.start();\n\n    arrayEquals(list, [\n      new Timestamped(0, time(1))\n    ]);\n  });\n\n  test('advance to', function () {\n    var s = new HistoricalScheduler();\n\n    var list = [];\n\n    s.scheduleAbsolute(null, time(0), function () { list.push(new Timestamped(0, s.now())); });\n    s.scheduleAbsolute(null, time(1), function () { list.push(new Timestamped(1, s.now())); });\n    s.scheduleAbsolute(null, time(2), function () { list.push(new Timestamped(2, s.now())); });\n    s.scheduleAbsolute(null, time(10), function () { list.push(new Timestamped(10, s.now())); });\n    s.scheduleAbsolute(null, time(11), function () { list.push(new Timestamped(11, s.now())); });\n\n    s.advanceTo(time(8));\n\n    equal(time(8), s.now());\n    equal(time(8), s.clock);\n\n    arrayEquals(list, [\n      new Timestamped(0, time(0)),\n      new Timestamped(1, time(1)),\n      new Timestamped(2, time(2))\n    ]);\n\n    s.advanceTo(time(8));\n\n    equal(time(8), s.now());\n    equal(time(8), s.clock);\n\n    arrayEquals(list, [\n      new Timestamped(0, time(0)),\n      new Timestamped(1, time(1)),\n      new Timestamped(2, time(2))\n    ]);\n\n    s.scheduleAbsolute(null, time(7), function () { list.push(new Timestamped(7, s.now())); });\n    s.scheduleAbsolute(null, time(8), function () { list.push(new Timestamped(8, s.now())); });\n\n    equal(time(8), s.now());\n    equal(time(8), s.clock);\n\n    arrayEquals(list, [\n      new Timestamped(0, time(0)),\n      new Timestamped(1, time(1)),\n      new Timestamped(2, time(2))\n    ]);\n\n    s.advanceTo(time(10));\n\n    equal(time(10), s.now());\n    equal(time(10), s.clock);\n\n    arrayEquals(list, [\n      new Timestamped(0, time(0)),\n      new Timestamped(1, time(1)),\n      new Timestamped(2, time(2)),\n      new Timestamped(7, time(8)),\n      new Timestamped(8, time(8)),\n      new Timestamped(10, time(10))\n    ]);\n\n    s.advanceTo(time(100));\n\n    equal(time(100), s.now());\n    equal(time(100), s.clock);\n\n    arrayEquals(list, [\n      new Timestamped(0, time(0)),\n      new Timestamped(1, time(1)),\n      new Timestamped(2, time(2)),\n      new Timestamped(7, time(8)),\n      new Timestamped(8, time(8)),\n      new Timestamped(10, time(10)),\n      new Timestamped(11, time(11))\n    ]);\n  });\n\n  test('advance by', function () {\n    var s = new HistoricalScheduler();\n\n    var list = [];\n\n    s.scheduleAbsolute(null, time(0), function () { list.push(new Timestamped(0, s.now())); });\n    s.scheduleAbsolute(null, time(1), function () { list.push(new Timestamped(1, s.now())); });\n    s.scheduleAbsolute(null, time(2), function () { list.push(new Timestamped(2, s.now())); });\n    s.scheduleAbsolute(null, time(10), function () { list.push(new Timestamped(10, s.now())); });\n    s.scheduleAbsolute(null, time(11), function () { list.push(new Timestamped(11, s.now())); });\n\n    s.advanceBy(time(8) - s.now());\n\n    equal(time(8), s.now());\n    equal(time(8), s.clock);\n\n    arrayEquals(list, [\n      new Timestamped(0, time(0)),\n      new Timestamped(1, time(1)),\n      new Timestamped(2, time(2))\n    ]);\n\n    s.scheduleAbsolute(null, time(7), function () { list.push(new Timestamped(7, s.now())); });\n    s.scheduleAbsolute(null, time(8), function () { list.push(new Timestamped(8, s.now())); });\n\n    equal(time(8), s.now());\n    equal(time(8), s.clock);\n\n    arrayEquals(list, [\n      new Timestamped(0, time(0)),\n      new Timestamped(1, time(1)),\n      new Timestamped(2, time(2))\n    ]);\n\n    s.advanceBy(0);\n\n    equal(time(8), s.now());\n    equal(time(8), s.clock);\n\n    arrayEquals(list, [\n      new Timestamped(0, time(0)),\n      new Timestamped(1, time(1)),\n      new Timestamped(2, time(2))\n    ]);\n\n    s.advanceBy(fromDays(2));\n\n    equal(time(10), s.now());\n    equal(time(10), s.clock);\n\n    arrayEquals(list, [\n      new Timestamped(0, time(0)),\n      new Timestamped(1, time(1)),\n      new Timestamped(2, time(2)),\n      new Timestamped(7, time(8)),\n      new Timestamped(8, time(8)),\n      new Timestamped(10, time(10))\n    ]);\n\n    s.advanceBy(fromDays(90));\n\n    equal(time(100), s.now());\n    equal(time(100), s.clock);\n\n    arrayEquals(list, [\n      new Timestamped(0, time(0)),\n      new Timestamped(1, time(1)),\n      new Timestamped(2, time(2)),\n      new Timestamped(7, time(8)),\n      new Timestamped(8, time(8)),\n      new Timestamped(10, time(10)),\n      new Timestamped(11, time(11))\n    ]);\n  });\n\n  test('is enabled', function () {\n    var s = new HistoricalScheduler();\n\n    equal(false, s.isEnabled);\n\n    s.schedule(s, function (s) {\n      equal(true, s.isEnabled);\n      s.stop();\n      equal(false, s.isEnabled);\n    });\n\n    equal(false, s.isEnabled);\n\n    s.start();\n\n    equal(false, s.isEnabled);\n  });\n\n  test('Sleep 1', function () {\n    var now = new Date(1983, 2, 11, 12, 0, 0).getTime();\n\n    var s = new HistoricalScheduler(now);\n\n    s.sleep(fromDays(1));\n\n    equal(now + fromDays(1), s.clock);\n  });\n\n  test('sleep 2', function () {\n    var s = new HistoricalScheduler();\n\n    var n = 0;\n\n    s.scheduleRecursiveFuture(null, new Date(s.now() + 6000), function (_, rec) {\n      s.sleep(3 * 6000);\n      n++;\n\n      rec(null, new Date(s.now() + 6000));\n    });\n\n    s.advanceTo(s.now() + (5 * 6000));\n\n    equal(2, n);\n  });\n\n  function reverseComparer (x, y) {\n    return y - x;\n  }\n\n  test('with comparer', function () {\n    var now = new Date();\n\n    var s = new HistoricalScheduler(now, reverseComparer);\n\n    var res = [];\n\n    s.scheduleAbsolute(null, now - 1000, function () { res.push(1); });\n    s.scheduleAbsolute(null, now - 2000, function () { res.push(2); });\n\n    s.start();\n\n    arrayEquals(res, [1,2]);\n  });\n\n}());\n"
  },
  {
    "path": "tests/concurrency/immediatescheduler.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, ok, equal */\n\n  QUnit.module('immediateScheduler');\n\n  var scheduler = Rx.Scheduler.immediate,\n      disposableEmpty = Rx.Disposable.empty;\n\n  test('immediateScheduler now', function () {\n    var res = scheduler.now() - new Date().getTime();\n    ok(res < 1000);\n  });\n\n  test('immediateScheduler schedule', function () {\n    var ran = false;\n    scheduler.schedule(null, function () { ran = true; });\n    ok(ran);\n  });\n\n  test('immediateScheduler schedule error', function () {\n    var ex = new Error();\n    try {\n      return scheduler.schedule(null, function () { throw ex; });\n    } catch (e) {\n      equal(e, ex);\n    }\n  });\n\n  test('immediateScheduler schedule with state', function () {\n    var xx = 0;\n    scheduler.schedule(42, function (self, x) { xx = x; return disposableEmpty; });\n    equal(42, xx);\n  });\n\n  test('immediateScheduler recursive', function () {\n    var xx = 0;\n    var yy = 0;\n    scheduler.schedule(42, function (self, x) {\n      xx = x;\n      return self.schedule(43, function (self2, y) {\n        yy = y;\n        return disposableEmpty;\n      });\n    });\n    equal(42, xx);\n    equal(43, yy);\n  });\n\n}());\n"
  },
  {
    "path": "tests/concurrency/scheduler-lite.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, ok, equal */\n  QUnit.module('Scheduler');\n\n  var Scheduler = Rx.Scheduler,\n      inherits = Rx.internals.inherits;\n\n  var MyScheduler = (function (__super__) {\n    inherits(MyScheduler, __super__);\n    function MyScheduler(now) {\n      if (now !== undefined) { this.now = function () { return now; }; }\n      this.waitCycles = 0;\n      __super__.call(this);\n    }\n\n    MyScheduler.prototype.schedule = function (state, action) {\n      return action(this, state);\n    };\n\n    MyScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      var self = this;\n      this.check(function (o) { return action(self, o); }, state, dueTime);\n      this.waitCycles += dueTime;\n      return action(this, state);\n    };\n\n    return MyScheduler;\n  }(Scheduler));\n\n  test('scheduler schedule non-recursive', function () {\n      var ms = new MyScheduler();\n      var res = false;\n      ms.scheduleRecursive(null, function () {\n  \t    res = true;\n      });\n      ok(res);\n  });\n\n  test('scheduler schedule recursive', function () {\n      var ms = new MyScheduler();\n      var i = 0;\n      ms.scheduleRecursive(null, function (_, a) {\n  \t    if (++i < 10) {\n  \t        a();\n  \t    }\n      });\n      equal(10, i);\n  });\n\n  test('scheduler schedule with time non-recursive', function () {\n    var now = new Date();\n\n    var ms = new MyScheduler(now);\n\n    var res = false;\n\n    ms.check = function (a, s, t) { equal(t, 0); };\n    ms.scheduleFuture(null, now, function () { res = true; });\n\n    ok(res);\n\n    equal(ms.waitCycles, 0);\n  });\n\n  test('scheduler schedule with absolute time recursive', function () {\n      var now = new Date();\n\n      var i = 0;\n\n      var ms = new MyScheduler(now);\n\n      ms.check = function (a, s, t) { equal(t, 0); };\n\n      ms.scheduleRecursiveFuture(null, now, function (_, a) {\n  \t    if (++i < 10) { a(null, now); }\n      });\n\n      equal(ms.waitCycles, 0);\n      equal(10, i);\n  });\n\n  test('scheduler schedule with relative time non-recursive', function () {\n      var now = new Date().getTime();\n\n      var ms = new MyScheduler(now);\n\n      ms.check = function (a, s, t) { equal(t, 0);   };\n\n      var res = false;\n      ms.scheduleRecursiveFuture(null, 0, function () { res = true; });\n\n      ok(res);\n      equal(ms.waitCycles, 0);\n  });\n\n  test('scheduler schedule with time recursive', function () {\n    var now = new Date().getTime();\n\n    var i = 0;\n\n    var ms = new MyScheduler(now);\n\n    ms.check = function (a, s, t) {\n\t    return ok(t < 10);\n    };\n\n    ms.scheduleRecursiveFuture(null, 0, function (_, a) {\n\t    if (++i < 10) { a(null, i); }\n    });\n\n    equal(ms.waitCycles, 45);\n    equal(10, i);\n  });\n\n}());\n"
  },
  {
    "path": "tests/concurrency/scheduler.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, ok, equal */\n  QUnit.module('Scheduler');\n\n  var Scheduler = Rx.Scheduler,\n      inherits = Rx.internals.inherits;\n\n  var MyScheduler = (function (__super__) {\n    inherits(MyScheduler, __super__);\n    function MyScheduler(now) {\n      if (now !== undefined) { this.now = function () { return now; }; }\n      this.waitCycles = 0;\n      __super__.call(this);\n    }\n\n    MyScheduler.prototype.schedule = function (state, action) {\n      return action(this, state);\n    };\n\n    MyScheduler.prototype._scheduleFuture = function (state, dueTime, action) {\n      var self = this;\n      this.check(function (o) { return action(self, o); }, state, dueTime);\n      this.waitCycles += dueTime;\n      return action(this, state);\n    };\n\n    return MyScheduler;\n  }(Scheduler));\n\n  test('scheduler schedule non-recursive', function () {\n      var ms = new MyScheduler();\n      var res = false;\n      ms.scheduleRecursive(null, function () {\n  \t    res = true;\n      });\n      ok(res);\n  });\n\n  test('scheduler schedule recursive', function () {\n      var ms = new MyScheduler();\n      var i = 0;\n      ms.scheduleRecursive(null, function (_, a) {\n  \t    if (++i < 10) {\n  \t        a();\n  \t    }\n      });\n      equal(10, i);\n  });\n\n  test('scheduler schedule with time non-recursive', function () {\n    var now = new Date();\n\n    var ms = new MyScheduler(now);\n\n    var res = false;\n\n    ms.check = function (a, s, t) { equal(t, 0); };\n    ms.scheduleFuture(null, now, function () { res = true; });\n\n    ok(res);\n\n    equal(ms.waitCycles, 0);\n  });\n\n  test('scheduler schedule with absolute time recursive', function () {\n      var now = new Date();\n\n      var i = 0;\n\n      var ms = new MyScheduler(now);\n\n      ms.check = function (a, s, t) { equal(t, 0); };\n\n      ms.scheduleRecursiveFuture(null, now, function (_, a) {\n  \t    if (++i < 10) { a(null, now); }\n      });\n\n      equal(ms.waitCycles, 0);\n      equal(10, i);\n  });\n\n  test('scheduler schedule with relative time non-recursive', function () {\n      var now = new Date().getTime();\n\n      var ms = new MyScheduler(now);\n\n      ms.check = function (a, s, t) { equal(t, 0);   };\n\n      var res = false;\n      ms.scheduleRecursiveFuture(null, 0, function () { res = true; });\n\n      ok(res);\n      equal(ms.waitCycles, 0);\n  });\n\n  test('scheduler schedule with time recursive', function () {\n    var now = new Date().getTime();\n\n    var i = 0;\n\n    var ms = new MyScheduler(now);\n\n    ms.check = function (a, s, t) {\n\t    return ok(t < 10);\n    };\n\n    ms.scheduleRecursiveFuture(null, 0, function (_, a) {\n\t    if (++i < 10) { a(null, i); }\n    });\n\n    equal(ms.waitCycles, 45);\n    equal(10, i);\n  });\n\n  test('catch builtin swallow shallow', function () {\n    var swallow = Scheduler.immediate.catchError(function () { return true; });\n    swallow.schedule(null, function () { throw new Error('Should be swallowed'); });\n    ok(true);\n  });\n\n  test('catch builtin swallow recursive', function () {\n      var swallow = Scheduler.immediate.catchError(function () { return true; });\n      swallow.schedule(42, function (self) {\n        return self.schedule(null, function () { new Error('Should be swallowed'); });\n      });\n      ok(true);\n  });\n\n  var disposableEmpty = Rx.Disposable.empty;\n\n  var MyErrorScheduler = (function (__super__) {\n    inherits(MyErrorScheduler, __super__);\n    function MyErrorScheduler(onError) {\n      this._onError = onError;\n      __super__.call(this);\n    }\n\n    MyErrorScheduler.prototype.schedule = function (state, action) {\n      try {\n        return action(this, state);\n      } catch (e) {\n        this._onError(e);\n        return disposableEmpty;\n      }\n    };\n\n    MyErrorScheduler.prototype.schedulePeriodic = function (state, period, action) {\n      Scheduler.immediate.schedule(this, function (_, self) {\n        try {\n          var s = state;\n          for(var i = 0; true; i++) {\n            if (i > 10) { break; }\n            s = action(s);\n          }\n        } catch (e) {\n          self._onError(e);\n        }\n      });\n    };\n\n    return MyErrorScheduler;\n  }(Scheduler));\n\n  test('catch custom unhandled', function () {\n    var err;\n    var scheduler = new MyErrorScheduler(function (ex) { err = ex; });\n\n    scheduler\n      .catchError(function () { return true; })\n      .schedule(null, function () { throw new Error('Should be caught'); });\n\n    ok(!err);\n\n    var ex1 = 'error';\n    scheduler\n      .catchError(function () { return ex1 instanceof Error; })\n      .schedule(null, function () { throw ex1; });\n\n    equal(err, ex1);\n  });\n\n  test('catch custom periodic caught', function () {\n    var err;\n\n    var scheduler = new MyErrorScheduler(function (ex) { err = ex; });\n\n    var catcher = scheduler.catchError(function () { return true; });\n\n    catcher.schedulePeriodic(42, 0, function () {\n      throw new Error('Should be caught');\n    });\n\n    ok(!err);\n  });\n\n  test('catch custom periodic uncaught', function () {\n    var ex = new Error('Error1');\n\n    var err;\n\n    var scheduler = new MyErrorScheduler(function (e) { err = e; });\n\n    var catcher = scheduler.catchError(function (e) { return e instanceof String; });\n\n    catcher.schedulePeriodic(42, 0, function () { throw ex; });\n\n    equal(err, ex);\n  });\n\n}());\n"
  },
  {
    "path": "tests/concurrency/virtualtimescheduler.js",
    "content": "(function () {\n\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal, ok */\n\n  QUnit.module('VirtualTimeScheduler');\n\n  var VirtualTimeScheduler = Rx.VirtualTimeScheduler;\n\n  var VirtualSchedulerTestScheduler = (function () {\n\n    function comparer(a, b) {\n      return a > b ? 1 : a < b ? -1 : 0;\n    }\n\n    function add(absolute, relative) {\n      absolute == null && (absolute = '');\n      return absolute + relative;\n    }\n\n    function toAbsoluteTime(absolute) {\n      absolute == null && (absolute = '');\n      return new Date(absolute.length);\n    }\n\n    function toRelative (timeSpan) {\n      return String.fromCharCode(timeSpan % 65535);\n    }\n\n    return function () {\n      var scheduler = new VirtualTimeScheduler(null, comparer);\n      scheduler.add = add;\n      scheduler.toAbsoluteTime = toAbsoluteTime;\n      scheduler.toRelative = toRelative;\n      return scheduler;\n    };\n  }());\n\n  test('Virtual Now', function () {\n    var res = new VirtualSchedulerTestScheduler().now() - new Date().getTime();\n    ok(res < 1000);\n  });\n\n  test('Virtual Schedule Action', function () {\n    var ran = false;\n\n    var scheduler = new VirtualSchedulerTestScheduler();\n\n    scheduler.schedule(null, function () { ran = true; });\n\n    scheduler.start();\n\n    ok(ran);\n  });\n\n  test('Virtual Schedule Action Error', function () {\n    var error = new Error();\n\n    try {\n      var scheduler = new VirtualSchedulerTestScheduler();\n\n      scheduler.schedule(error, function (_, e) {\n        throw e;\n      });\n\n      scheduler.start();\n      ok(false);\n    } catch (e) {\n      equal(e, error);\n    }\n  });\n\n}());\n"
  },
  {
    "path": "tests/core/notification.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal, ok */\n\n  QUnit.module('Notification');\n\n  var createOnNext = Rx.Notification.createOnNext,\n      createOnError = Rx.Notification.createOnError,\n      createOnCompleted = Rx.Notification.createOnCompleted,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      inherits = Rx.internals.inherits;\n\n  test('onNext constructor and properties', function () {\n    var n = createOnNext(42);\n\n    equal('N', n.kind);\n\n    equal(42, n.value);\n  });\n\n  test('onNext toString', function () {\n      var n1 = createOnNext(42);\n\n      ok(n1.toString().indexOf('OnNext') !== -1);\n      ok(n1.toString().indexOf('42') !== -1);\n  });\n\n  var CheckOnNextObserver = (function (__super__) {\n    inherits(CheckOnNextObserver, __super__);\n\n    function CheckOnNextObserver() {\n      __super__.call(this);\n      this.value = null;\n    }\n\n    CheckOnNextObserver.prototype.onNext = function (value) {\n      return this.value = value;\n    };\n\n    return CheckOnNextObserver;\n  }(Rx.Observer));\n\n  test('onNext acceptObserver', function () {\n    var con = new CheckOnNextObserver();\n\n    var n1 = createOnNext(42);\n    n1.accept(con);\n\n    equal(42, con.value);\n  });\n\n  var AcceptObserver = (function (__super__) {\n    inherits(AcceptObserver, __super__);\n\n    function AcceptObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    AcceptObserver.prototype.onNext = function (value) {\n      return this._onNext(value);\n    };\n\n    AcceptObserver.prototype.onError = function (exception) {\n      return this._onError(exception);\n    };\n\n    AcceptObserver.prototype.onCompleted = function () {\n      return this._onCompleted();\n    };\n\n    return AcceptObserver;\n  }(Rx.Observer));\n\n  test('onNext accept Observer with result', function () {\n    var n1 = createOnNext(42);\n\n    var results = n1.accept(new AcceptObserver(\n      function () {\n        return 'OK';\n      },\n      function () {\n        ok(false);\n        return false;\n      },\n      function () {\n        ok(false);\n        return false;\n    }));\n\n    equal('OK', results);\n  });\n\n  test('onNext accept action', function () {\n    var obs = false;\n\n    var n1 = createOnNext(42);\n\n    n1.accept(\n      function () {\n        obs = true;\n      },\n      function () {\n        ok(false);\n      },\n      function () {\n        ok(false);\n      }\n    );\n\n    ok(obs);\n  });\n\n  test('onNext accept action with result', function () {\n    var n1 = createOnNext(42);\n\n    var results = n1.accept(\n      function () {\n        return 'OK';\n      },\n      function () {\n        ok(false);\n      },\n      function () {\n        ok(false);\n      }\n    );\n\n    equal('OK', results);\n  });\n\n  test('onError constructor and properties', function () {\n    var error = new Error();\n\n    var n = createOnError(error);\n\n    equal('E', n.kind);\n    equal(error, n.error);\n  });\n\n  test('onError ToString', function () {\n    var error = new Error('woops');\n\n    var n1 = createOnError(error);\n\n    ok(n1.toString().indexOf('OnError') !== -1);\n    ok(n1.toString().indexOf('woops') !== -1);\n  });\n\n  var CheckOnErrorObserver = (function (__super__) {\n\n    inherits(CheckOnErrorObserver, __super__);\n\n    function CheckOnErrorObserver() {\n      __super__.call(this);\n      this.error = null;\n    }\n\n    CheckOnErrorObserver.prototype.onError = function (exception) {\n      this.error = exception;\n    };\n\n    return CheckOnErrorObserver;\n\n  }(Rx.Observer));\n\n  test('onError accept observer', function () {\n    var error = new Error();\n\n    var obs = new CheckOnErrorObserver();\n\n    var n1 = createOnError(error);\n\n    n1.accept(obs);\n\n    equal(error, obs.error);\n  });\n\n  test('onError accept observer with result', function () {\n    var error = new Error();\n\n    var n1 = createOnError(error);\n\n    var results = n1.accept(new AcceptObserver(\n      function () {\n        ok(false);\n      },\n      function () {\n        return 'OK';\n      },\n      function () {\n        ok(false);\n      }\n    ));\n\n    equal('OK', results);\n  });\n\n  test('onError accept action', function () {\n    var error = new Error();\n\n    var obs = false;\n\n    var n1 = createOnError(error);\n\n    n1.accept(\n      function () {\n        ok(false);\n      },\n      function () {\n        obs = true;\n      },\n      function () {\n        ok(false);\n      }\n    );\n\n    ok(obs);\n  });\n\n  test('onError accept action with result', function () {\n    var error = new Error();\n\n    var n1 = createOnError(error);\n\n    var results = n1.accept(\n      function () {\n        ok(false);\n      },\n      function () {\n        return 'OK';\n      },\n      function () {\n        ok(false);\n      }\n    );\n    equal('OK', results);\n  });\n\n  test('onCompleted constructor and properties', function () {\n    var n = createOnCompleted();\n\n    equal('C', n.kind);\n    equal(null, n.error);\n    equal(null, n.value);\n  });\n\n  test('onCompleted toString', function () {\n    var n1 = createOnCompleted();\n\n    ok(n1.toString().indexOf('OnCompleted') !== -1);\n  });\n\n  var CheckOnCompletedObserver = (function (__super__) {\n\n    inherits(CheckOnCompletedObserver, __super__);\n\n    function CheckOnCompletedObserver() {\n      __super__.call(this);\n      this.completed = false;\n    }\n\n    CheckOnCompletedObserver.prototype.onCompleted = function () {\n      this.completed = true;\n    };\n\n    return CheckOnCompletedObserver;\n  }(Rx.Observer));\n\n  test('onCompleted accept observer', function () {\n    var obs = new CheckOnCompletedObserver();\n\n    var n1 = createOnCompleted();\n\n    n1.accept(obs);\n\n    ok(obs.completed);\n  });\n\n  test('onCompleted accept observer with result', function () {\n    var n1 = createOnCompleted();\n\n    var results = n1.accept(new AcceptObserver(\n      function () {\n        ok(false);\n      },\n      function () {\n        ok(false);\n      },\n      function () {\n        return 'OK';\n      }\n    ));\n\n    equal('OK', results);\n  });\n\n  test('onCompleted accept action', function () {\n    var obs = false;\n\n    var n1 = createOnCompleted();\n\n    n1.accept(\n      function () {\n        ok(false);\n      },\n      function () {\n        ok(false);\n      },\n      function () {\n        obs = true;\n      }\n    );\n\n    ok(obs);\n  });\n\n  test('onCompleted accept action with result', function () {\n    var n1 = createOnCompleted();\n\n    var results = n1.accept(\n      function () {\n        ok(false);\n      },\n      function () {\n        ok(false);\n      },\n      function () {\n        return 'OK';\n      }\n    );\n\n    equal('OK', results);\n  });\n\n  test('toObservable empty', function () {\n    var scheduler = new Rx.TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return createOnCompleted().toObservable(scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(201)\n    );\n  });\n\n  test('toObservable just', function () {\n    var scheduler = new Rx.TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return createOnNext(42).toObservable(scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 42),\n      onCompleted(201)\n    );\n  });\n\n  test('toObservable throwError', function () {\n    var error = new Error();\n\n    var scheduler = new Rx.TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return createOnError(error).toObservable(scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(201, error)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/core/observable.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal, ok */\n\n  QUnit.module('Observable');\n\n  var Observable = Rx.Observable;\n\n  test('subscribe none return', function () {\n    Observable.just(1).subscribe();\n\n    ok(true);\n  });\n\n  test('subscribe none throw', function () {\n    var e, error = new Error();\n\n    try {\n      Observable['throw'](error).subscribe();\n    } catch (e1) {\n      e = e1;\n    }\n\n    equal(e, error);\n  });\n\n  test('subscribe none return', function () {\n    Observable.empty().subscribe(function () {\n      ok(false);\n    });\n\n    ok(true);\n  });\n\n  test('subscribe onNext return', function () {\n    var x1;\n    Observable.just(42).subscribe(function (x) { x1 = x; });\n    equal(42, x1);\n  });\n\n  test('subscribe onNext throw', function () {\n    var e;\n    var error = new Error();\n\n    try {\n      Observable['throw'](error).subscribe(function () { ok(false); });\n    } catch (e1) {\n      e = e1;\n    }\n\n    equal(e, error);\n  });\n\n  test('subscribe onNext empty', function () {\n    Observable.empty().subscribe(function () {\n      ok(false);\n    });\n\n    ok(true);\n  });\n\n  test('subscribe onNext empty finished', function () {\n    var finished = false, x1 = -1;\n\n    Observable.just(42).subscribe(\n      function (x) {\n        x1 = x;\n      },\n      null,\n      function () {\n        finished = true;\n      });\n\n    equal(42, x1);\n    ok(finished);\n  });\n\n  test('subscribe onNext, onCompleted throw', function () {\n    var e;\n    var error = new Error();\n\n    try {\n      Observable['throw'](error).subscribe(\n        function () {\n          ok(false);\n        },\n        null,\n        function () {\n          ok(false);\n        });\n    } catch (e1) {\n      e = e1;\n    }\n\n    equal(error, e);\n  });\n\n  test('subscribe onNext onCompleted empty', function () {\n    var finished = false;\n    Observable.empty().subscribe(\n      function () {\n        ok(false);\n      },\n      null,\n      function () {\n        finished = true;\n      });\n\n    ok(finished);\n  });\n\n  test('subscribeOnNext next empty', function () {\n    Observable.empty().subscribeOnNext(function () {\n      ok(false);\n    });\n\n    ok(true);\n  });\n\n  test('SubscribeNext_Throw', function () {\n    var error = new Error(), e1;\n\n    try {\n      Observable['throw'](error).subscribeOnNext(function () {\n        ok(false);\n      });\n    } catch (e) {\n      e1 = e;\n    }\n\n    equal(error, e1);\n  });\n\n  test('subscribeOnNext return', function () {\n    var val;\n\n    Observable.just(42).subscribeOnNext(function (v) {\n      val = v;\n    });\n\n    equal(42, val);\n  });\n\n  test('subscribeonNext thisArg', function () {\n    var val, thisArg = 56;\n\n    Observable.just(42).subscribeOnNext(function (v) {\n      val = v;\n      equal(this, thisArg);\n    }, thisArg);\n\n    equal(42, val);\n  });\n\n  test('subscribeOnError empty', function () {\n    Observable.empty().subscribeOnError(function () {\n      ok(false);\n    });\n\n    ok(true);\n  });\n\n  test('subscribeOnError throw', function () {\n    var error = new Error(), err;\n\n    Observable['throw'](error).subscribeOnError(function (e) {\n      err = e;\n    });\n\n    equal(err, error);\n  });\n\n  test('subscirbeOnError next', function () {\n    Observable.just(42).subscribeOnError(function () {\n      ok(false);\n    });\n\n    ok(true);\n  });\n\n  test('subscribeOnError thisArg', function () {\n    var thisArg = 56, that;\n    Observable['throw'](new Error()).subscribeOnError(function () {\n      that = this;\n    }, thisArg);\n\n    equal(thisArg, that);\n  });\n\n  test('subscribeOnCompleted empty', function () {\n    var hit = false;\n    Observable.empty().subscribeOnCompleted(function () {\n      hit = true;\n    });\n\n    ok(hit);\n  });\n\n  test('subscribeOnCompleted throw', function () {\n    var error = new Error(), e1;\n    try {\n      Observable['throw'](error).subscribeOnCompleted(function () {\n        ok(false);\n      });\n    } catch (e) {\n      e1 = e;\n    }\n    equal(error, e1);\n  });\n\n  test('subscribeOnCompleted completed', function () {\n    var hit = false;\n\n    Observable.just(42).subscribeOnCompleted(function () {\n      hit = true;\n    });\n\n    ok(hit);\n  });\n\n  test('subscribeOnCompleted thisArg', function () {\n    var thisArg = 56, that;\n\n    Observable.just(42).subscribeOnCompleted(function () {\n      that = this;\n    }, thisArg);\n\n    equal(that, thisArg);\n  });\n\n}());\n"
  },
  {
    "path": "tests/core/observer-extras.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal, ok  */\n  QUnit.module('Observer');\n\n  var Observer = Rx.Observer,\n    createOnNext = Rx.Notification.createOnNext,\n    createOnError = Rx.Notification.createOnError,\n    createOnCompleted = Rx.Notification.createOnCompleted;\n\n  test('toObserver notificiation onNext', function () {\n    var i = 0;\n    var next = function (n) {\n      equal(i++, 0);\n      equal(n.kind, 'N');\n      equal(n.value, 42);\n    };\n    Observer.fromNotifier(next).onNext(42);\n  });\n\n  test('toObserver notificiation onError', function () {\n    var error = new Error();\n\n    var i = 0;\n\n    var next = function (n) {\n      equal(i++, 0);\n      equal(n.kind, 'E');\n      equal(n.error, error);\n    };\n    Observer.fromNotifier(next).onError(error);\n  });\n\n  test('toObserver notificiation onCompleted', function () {\n    var i = 0;\n\n    var next = function (n) {\n      equal(i++, 0);\n      equal(n.kind, 'C');\n    };\n\n    Observer.fromNotifier(next).onCompleted();\n  });\n\n  test('toNotifier forwards', function () {\n    var obsn = new MyObserver();\n    obsn.toNotifier()(createOnNext(42));\n    equal(obsn.hasOnNext, 42);\n\n    var error = new Error();\n    var obse = new MyObserver();\n    obse.toNotifier()(createOnError(error));\n    equal(error, obse.hasOnError);\n\n    var obsc = new MyObserver();\n    obsc.toNotifier()(createOnCompleted());\n    ok(obsc.hasOnCompleted);\n  });\n\n  test('asObserver hides', function () {\n    var obs = new MyObserver();\n\n    var res = obs.asObserver();\n\n    ok(obs !== res);\n  });\n\n  test('asObserver forwards', function () {\n    var obsn = new MyObserver();\n    obsn.asObserver().onNext(42);\n    equal(obsn.hasOnNext, 42);\n\n    var error = new Error();\n    var obse = new MyObserver();\n    obse.asObserver().onError(error);\n    equal(obse.hasOnError, error);\n\n    var obsc = new MyObserver();\n    obsc.asObserver().onCompleted();\n    ok(obsc.hasOnCompleted);\n  });\n\n  var MyObserver = (function (__super__) {\n    Rx.internals.inherits(MyObserver, __super__);\n    function MyObserver() {\n      __super__.call(this);\n    }\n\n    MyObserver.prototype.onNext = function (value) {\n      this.hasOnNext = value;\n    };\n\n    MyObserver.prototype.onError = function (err) {\n      this.hasOnError = err;\n    };\n\n    MyObserver.prototype.onCompleted = function () {\n      this.hasOnCompleted = true;\n    };\n\n    return MyObserver;\n  }(Rx.internals.AbstractObserver));\n\n}());\n"
  },
  {
    "path": "tests/core/observer-lite.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal, ok */\n  QUnit.module('Observer');\n\n  var Observer = Rx.Observer;\n\n  test('create onNext', function () {\n    var next = false;\n\n    var res = Observer.create(function (x) {\n      equal(42, x);\n      next = true;\n    });\n\n    res.onNext(42);\n\n    ok(next);\n\n    res.onCompleted();\n  });\n\n  test('create onNext has error', function () {\n    var e_;\n\n    var err = new Error();\n\n    var next = false;\n\n    var res = Observer.create(function (x) {\n      equal(42, x);\n      next = true;\n    });\n\n    res.onNext(42);\n    ok(next);\n\n    try {\n      res.onError(err);\n      ok(false);\n    } catch (e) {\n      e_ = e;\n    }\n    equal(err, e_);\n  });\n\n  test('create onNext onCompleted', function () {\n    var next = false;\n\n    var completed = false;\n\n    var res = Observer.create(function (x) {\n      equal(42, x);\n      next = true;\n    }, null, function () {\n      completed = true;\n    });\n\n    res.onNext(42);\n\n    ok(next);\n    ok(!completed);\n\n    res.onCompleted();\n\n    ok(completed);\n  });\n\n  test('create onNext onCompleted has error', function () {\n    var e_;\n\n    var err = new Error();\n\n    var next = false;\n    var completed = false;\n\n    var res = Observer.create(function (x) {\n      equal(42, x);\n      next = true;\n    }, null, function () {\n      completed = true;\n    });\n\n    res.onNext(42);\n\n    ok(next);\n    ok(!completed);\n\n    try {\n      res.onError(err);\n      ok(false);\n    } catch (e) {\n      e_ = e;\n    }\n\n    equal(err, e_);\n    ok(!completed);\n  });\n\n  test('create onNext onError', function () {\n    var err = new Error();\n    var next = true;\n    var error = false;\n    var res = Observer.create(function (x) {\n      equal(42, x);\n      next = true;\n    }, function (e) {\n      equal(err, e);\n      error = true;\n    });\n\n    res.onNext(42);\n\n    ok(next);\n    ok(!error);\n\n    res.onError(err);\n    ok(error);\n  });\n\n  test('create onNext onError hit completed', function () {\n    var err = new Error();\n\n    var next = true;\n    var error = false;\n\n    var res = Observer.create(function (x) {\n      equal(42, x);\n      next = true;\n    }, function (e) {\n      equal(err, e);\n      error = true;\n    });\n\n    res.onNext(42);\n\n    ok(next);\n    ok(!error);\n\n    res.onCompleted();\n\n    ok(!error);\n  });\n\n  test('create onNext onError onCompleted 1', function () {\n    var err = new Error();\n\n    var next = false;\n    var error = false;\n    var completed = false;\n\n    var res = Observer.create(function (x) {\n      equal(42, x);\n      next = true;\n    }, function (e) {\n      equal(err, e);\n      error = true;\n    }, function () {\n      completed = true;\n    });\n\n    res.onNext(42);\n\n    ok(next);\n    ok(!error);\n    ok(!completed);\n\n    res.onCompleted();\n\n    ok(completed);\n    ok(!error);\n  });\n\n  test('create onNext onError onCompleted 2', function () {\n    var err = new Error();\n\n    var next = false;\n    var error = false;\n    var completed = false;\n\n    var res = Observer.create(function (x) {\n      equal(42, x);\n      next = true;\n    }, function (e) {\n      equal(err, e);\n      error = true;\n    }, function () {\n      completed = true;\n    });\n\n    res.onNext(42);\n\n    ok(next);\n    ok(!error);\n    ok(!completed);\n\n    res.onError(err);\n\n    ok(!completed);\n    ok(error);\n  });\n}());\n"
  },
  {
    "path": "tests/core/observer.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal, notDeepEqual, ok, raises */\n\n  QUnit.module('Observer');\n\n  var Observer = Rx.Observer,\n      createOnNext = Rx.Notification.createOnNext,\n      createOnError = Rx.Notification.createOnError,\n      createOnCompleted = Rx.Notification.createOnCompleted;\n\n  test('fromNotifier notification onNext', function () {\n    var i = 0;\n\n    var next = function (n) {\n      equal(i++, 0);\n      equal(n.kind, 'N');\n      equal(n.value, 42);\n    };\n\n    Observer.fromNotifier(next).onNext(42);\n  });\n\n  test('fromNotifier notification onError', function () {\n    var error = new Error();\n\n    var i = 0;\n\n    var next = function (n) {\n      equal(i++, 0);\n      equal(n.kind, 'E');\n      equal(n.error, error);\n    };\n\n    Observer.fromNotifier(next).onError(error);\n  });\n\n  test('fromNotifier NotificationOnCompleted', function () {\n    var i = 0;\n\n    var next = function (n) {\n      equal(i++, 0);\n      equal(n.kind, 'C');\n    };\n\n    Observer.fromNotifier(next).onCompleted();\n  });\n\n  test('toNotifier forwards', function () {\n    var obsn = new MyObserver();\n    obsn.toNotifier()(createOnNext(42));\n    equal(obsn.hasOnNext, 42);\n\n    var error = new Error();\n    var obse = new MyObserver();\n    obse.toNotifier()(createOnError(error));\n    equal(error, obse.hasOnError);\n\n    var obsc = new MyObserver();\n    obsc.toNotifier()(createOnCompleted());\n    ok(obsc.hasOnCompleted);\n  });\n\n  test('create onNext', function () {\n    var next = false;\n    var res = Observer.create(function (x) {\n      equal(42, x);\n      next = true;\n    });\n\n    res.onNext(42);\n\n    ok(next);\n\n    res.onCompleted();\n  });\n\n  test('create OnNext has error', function () {\n    var e_;\n    var error = new Error();\n    var next = false;\n    var res = Observer.create(function (x) {\n        equal(42, x);\n        next = true;\n    });\n\n    res.onNext(42);\n    ok(next);\n\n    try {\n      res.onError(error);\n      ok(false);\n    } catch (e) {\n      e_ = e;\n    }\n    equal(error, e_);\n  });\n\n  test('create OnNext OnCompleted', function () {\n    var next = false;\n\n    var completed = false;\n\n    var res = Observer.create(function (x) {\n      equal(42, x);\n      next = true;\n    }, null, function () {\n      completed = true;\n    });\n\n    res.onNext(42);\n\n    ok(next);\n    ok(!completed);\n\n    res.onCompleted();\n\n    ok(completed);\n  });\n\n  test('Create OnNext OnCompleted Has Error', function () {\n    var e_;\n    var error = new Error();\n\n    var next = false;\n\n    var completed = false;\n\n    var res = Observer.create(\n      function (x) {\n        equal(42, x);\n        next = true;\n      },\n      null,\n      function () {\n        completed = true;\n      }\n    );\n\n    res.onNext(42);\n    ok(next);\n    ok(!completed);\n\n    try {\n      res.onError(error);\n      ok(false);\n    } catch (e) {\n      e_ = e;\n    }\n\n    equal(error, e_);\n    ok(!completed);\n  });\n\n  test('Create OnNext OnError', function () {\n    var error = new Error();\n\n    var next = true;\n\n    var hasError = false;\n\n    var res = Observer.create(function (x) {\n      equal(42, x);\n      next = true;\n    }, function (e) {\n      equal(error, e);\n      hasError = true;\n    });\n\n    res.onNext(42);\n\n    ok(next);\n    ok(!hasError);\n\n    res.onError(error);\n    ok(hasError);\n  });\n\n  test('Create OnNext OnError Hit Completed', function () {\n    var error = new Error();\n\n    var next = true;\n\n    var hasError = false;\n\n    var res = Observer.create(function (x) {\n      equal(42, x);\n      next = true;\n    }, function (e) {\n      equal(error, e);\n      hasError = true;\n    });\n\n    res.onNext(42);\n    ok(next);\n    ok(!hasError);\n\n    res.onCompleted();\n\n    ok(!hasError);\n  });\n\n  test('Create OnNext OnError OnCompleted 1', function () {\n    var error = new Error();\n\n    var next = true;\n\n    var hasError = false;\n    var completed = false;\n\n    var res = Observer.create(function (x) {\n      equal(42, x);\n      next = true;\n    }, function (e) {\n      equal(error, e);\n      hasError = true;\n    }, function () {\n      completed = true;\n    });\n\n    res.onNext(42);\n\n    ok(next);\n    ok(!hasError);\n    ok(!completed);\n\n    res.onCompleted();\n\n    ok(completed);\n    ok(!hasError);\n  });\n\n  test('Create OnNext OnError OnCompleted 2', function () {\n    var error = new Error();\n\n    var next = true;\n\n    var hasError = false;\n\n    var completed = false;\n\n    var res = Observer.create(function (x) {\n      equal(42, x);\n      next = true;\n    }, function (e) {\n      equal(error, e);\n      hasError = true;\n    }, function () {\n      completed = true;\n    });\n\n    res.onNext(42);\n\n    ok(next);\n    ok(!hasError);\n    ok(!completed);\n\n    res.onError(error);\n\n    ok(!completed);\n    ok(hasError);\n  });\n\n  function MyObserver() {\n    var obs = new Observer();\n    obs.onNext = function onNext(value) { this.hasOnNext = value; };\n    obs.onError = function onError (err) { this.hasOnError = err; };\n    obs.onCompleted = function onCompleted () { this.hasOnCompleted = true; };\n\n    return obs;\n  }\n\n  test('AsObserver Hides', function () {\n      var obs, res;\n      obs = new MyObserver();\n      res = obs.asObserver();\n      notDeepEqual(obs, res);\n  });\n\n  test('AsObserver Forwards', function () {\n      var obsn = new MyObserver();\n      obsn.asObserver().onNext(42);\n      equal(obsn.hasOnNext, 42);\n\n      var error = new Error();\n      var obse = new MyObserver();\n      obse.asObserver().onError(error);\n      equal(obse.hasOnError, error);\n\n      var obsc = new MyObserver();\n      obsc.asObserver().onCompleted();\n      ok(obsc.hasOnCompleted);\n  });\n\n  test('Observer Checked Already Terminated Completed', function () {\n    var m = 0, n = 0;\n    var o = Observer.create(function () {\n      m++;\n    }, function () {\n      ok(false);\n    }, function () {\n      n++;\n    }).checked();\n\n    o.onNext(1);\n    o.onNext(2);\n    o.onCompleted();\n\n    raises(function () { o.onCompleted(); });\n    raises(function () { on.onError(new Error('error')); });\n    equal(2, m);\n    equal(1, n);\n  });\n\n  test('Observer_Checked_AlreadyTerminated_Error', function () {\n      var m = 0, n = 0;\n      var o = Observer.create(function () {\n          m++;\n      }, function () {\n          n++;\n      }, function () {\n          ok(false);\n      }).checked();\n\n      o.onNext(1);\n      o.onNext(2);\n      o.onError(new Error('error'));\n\n      raises(function () { o.onCompleted(); });\n      raises(function () { o.onError(new Error('error')); });\n\n      equal(2, m);\n      equal(1, n);\n  });\n\n  test('Observer_Checked_Reentrant_Next', function () {\n      var n = 0;\n      var o;\n      o = Observer.create(function () {\n          n++;\n          raises(function () { o.onNext(9); });\n          raises(function () { o.onError(new Error('error')); });\n          raises(function () { o.onCompleted(); });\n      }, function () {\n          ok(false);\n      }, function () {\n          ok(false);\n      }).checked();\n\n      o.onNext(1);\n      equal(1, n);\n  });\n\n  test('Observer_Checked_Reentrant_Error', function () {\n      var n = 0;\n      var o;\n      o = Observer.create(function () {\n          ok(false);\n      }, function () {\n          n++;\n          raises(function () { o.onNext(9); });\n          raises(function () { o.onError(new Error('error')); });\n          raises(function () { o.onCompleted(); });\n      }, function () {\n          ok(false);\n      }).checked();\n\n      o.onError(new Error('error'));\n      equal(1, n);\n  });\n\n  test('Observer_Checked_Reentrant_Completed', function () {\n      var n = 0;\n      var o = Observer.create(function () {\n          ok(false);\n      }, function () {\n          ok(false);\n      }, function () {\n          n++;\n          raises(function () { o.onNext(9); });\n          raises(function () { o.onError(new Error('error')); });\n          raises(function () { o.onCompleted(); });\n      }).checked();\n\n      o.onCompleted();\n      equal(1, n);\n  });\n\n}());\n"
  },
  {
    "path": "tests/disposables/compositedisposable.js",
    "content": "QUnit.module('CompositeDisposable');\n\nvar Disposable = Rx.Disposable,\n  CompositeDisposable = Rx.CompositeDisposable,\n  SerialDisposable = Rx.SerialDisposable,\n  RefCountDisposable = Rx.RefCountDisposable,\n  SingleAssignmentDisposable = Rx.SingleAssignmentDisposable;\n\nfunction noop() { }\n\ntest('GroupDisposable_Add', function () {\n  var d1 = Disposable.create(noop),\n      d2 = Disposable.create(noop),\n      g = new CompositeDisposable(d1);\n\n  equal(1, g.length);\n\n  g.add(d2);\n  equal(2, g.length);\n});\n\ntest('GroupDisposable_AddAfterDispose', function () {\n  var disp1 = false;\n  var disp2 = false;\n\n  var d1 = Disposable.create(function () {\n      disp1 = true;\n  });\n\n  var d2 = Disposable.create(function () {\n      disp2 = true;\n  });\n\n  var g = new CompositeDisposable(d1);\n  equal(1, g.length);\n\n  g.dispose();\n  ok(disp1);\n  equal(0, g.length);\n\n  g.add(d2);\n  ok(disp2);\n  equal(0, g.length);\n});\n\ntest('GroupDisposable_Remove', function () {\n  var disp1 = false;\n  var disp2 = false;\n\n  var d1 = Disposable.create(function () {\n      disp1 = true;\n  });\n\n  var d2 = Disposable.create(function () {\n      disp2 = true;\n  });\n\n  var g = new CompositeDisposable(d1, d2);\n\n  equal(2, g.length);\n\n  ok(g.remove(d1));\n\n  equal(1, g.length);\n\n  ok(disp1);\n  ok(g.remove(d2));\n  ok(disp2);\n\n  var disp3 = false;\n  var d3 = Disposable.create(function () {\n    disp3 = true;\n  });\n\n  ok(!g.remove(d3));\n  ok(!disp3);\n});\n"
  },
  {
    "path": "tests/disposables/disposable.js",
    "content": "﻿QUnit.module('Disposable');\n\nvar Disposable = Rx.Disposable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable;\n\nvar BooleanDisposable = (function () {\n    function BooleanDisposable() {\n        this.isDisposed = false;\n    }\n    BooleanDisposable.prototype.dispose = function () {\n        this.isDisposed = true;\n    };\n    return BooleanDisposable;\n})();\n\ntest('AnonymousDisposable_Create', function () {\n    var disposable = Disposable.create(function () { });\n    ok(disposable !== null);\n});\n\ntest('AnonymousDisposable_Dispose', function () {\n    var disposed = false;\n    var d = Disposable.create(function () {\n        disposed = true;\n    });\n\n    ok(!disposed);\n    d.dispose();\n    ok(disposed);\n});\n\ntest('EmptyDisposable', function () {\n    var d = Disposable.empty;\n    ok(d);\n    d.dispose();\n});\n\ntest('BooleanDisposable', function () {\n    var d = new BooleanDisposable();\n    ok(!d.isDisposed);\n    d.dispose();\n    ok(d.isDisposed);\n    d.dispose();\n    ok(d.isDisposed);\n});\n"
  },
  {
    "path": "tests/disposables/refcountdisposable.js",
    "content": "QUnit.module('RefCountDisposable');\n\nvar Disposable = Rx.Disposable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable;\n\ntest('RefCountDisposable_RefCounting', function () {\n    var d = new BooleanDisposable();\n    var r = new RefCountDisposable(d);\n    ok(!d.isDisposed);\n\n    var d1 = r.getDisposable();\n    var d2 = r.getDisposable();\n    ok(!d.isDisposed);\n\n    d1.dispose();\n    ok(!d.isDisposed);\n\n    d2.dispose();\n    ok(!d.isDisposed);\n\n    r.dispose();\n    ok(d.isDisposed);\n\n    var d3 = r.getDisposable();\n    d3.dispose();\n});\n\ntest('RefCountDisposable_PrimaryDisposesFirst', function () {\n    var d = new BooleanDisposable();\n    var r = new RefCountDisposable(d);\n\n    ok(!d.isDisposed);\n\n    var d1 = r.getDisposable();\n    var d2 = r.getDisposable();\n\n    ok(!d.isDisposed);\n\n    d1.dispose();\n    ok(!d.isDisposed);\n\n    r.dispose();\n    ok(!d.isDisposed);\n\n    d2.dispose();\n    ok(d.isDisposed);\n});\n"
  },
  {
    "path": "tests/disposables/serialdisposable.js",
    "content": "QUnit.module('SerialDisposable');\n\nvar Disposable = Rx.Disposable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable;\n\ntest('MutableDisposable_Ctor_Prop', function () {\n    var m = new SerialDisposable();\n    ok(!m.getDisposable());\n});\n\ntest('MutableDisposable_ReplaceBeforeDispose', function () {\n    var disp1 = false;\n    var disp2 = false;\n\n    var m = new SerialDisposable();\n    var d1 = Disposable.create(function () {\n        disp1 = true;\n    });\n\n    m.setDisposable(d1);\n\n    equal(d1, m.getDisposable());\n    ok(!disp1);\n\n    var d2 = Disposable.create(function () {\n        disp2 = true;\n    });\n    m.setDisposable(d2);\n\n    equal(d2, m.getDisposable());\n    ok(disp1);\n    ok(!disp2);\n});\n\ntest('MutableDisposable_ReplaceAfterDispose', function () {\n    var disp1 = false;\n    var disp2 = false;\n    var m = new SerialDisposable();\n    m.dispose();\n\n    var d1 = Disposable.create(function () {\n        disp1 = true;\n    });\n    m.setDisposable(d1);\n\n    equal(null, m.getDisposable());\n    ok(disp1);\n\n    var d2 = Disposable.create(function () {\n        disp2 = true;\n    });\n    m.setDisposable(d2);\n\n    equal(null, m.getDisposable());\n    ok(disp2);\n});\n\ntest('MutableDisposable_Dispose', function () {\n    var disp = false;\n    var m = new SerialDisposable();\n    var d = Disposable.create(function () {\n        disp = true;\n    });\n    m.setDisposable(d);\n\n    equal(d, m.getDisposable());\n    ok(!disp);\n    m.dispose();\n    ok(disp);\n    equal(null, m.getDisposable());\n});\n"
  },
  {
    "path": "tests/disposables/singleassignmentdisposable.js",
    "content": "QUnit.module('SingleAssignmentDisposable');\n\nvar Disposable = Rx.Disposable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable;\n\ntest('FutureDisposable_SetNull', function () {\n    var d = new SingleAssignmentDisposable();\n    d.setDisposable(null);\n    equal(null, d.getDisposable());\n});\n\ntest('FutureDisposable_DisposeAfterSet', function () {\n    var disposed = false,\n        d = new SingleAssignmentDisposable(),\n        dd = Disposable.create(function () { disposed = true; });\n    d.setDisposable(dd);\n    equal(dd, d.getDisposable());\n    ok(!disposed);\n    d.dispose();\n    ok(disposed);\n    d.dispose();\n    ok(disposed);\n});\n\ntest('FutureDisposable_DisposeBeforeSet', function () {\n    var disposed = false,\n        d = new SingleAssignmentDisposable(),\n        dd = Disposable.create(function () { disposed = true; });\n    ok(!disposed);\n    d.dispose();\n    ok(!disposed);\n    d.setDisposable(dd);\n    ok(d.getDisposable() == null);\n    ok(disposed);\n    d.dispose();\n    ok(disposed);\n});\n"
  },
  {
    "path": "tests/helpers/mockiterable.js",
    "content": ""
  },
  {
    "path": "tests/helpers/reactiveassert.js",
    "content": "﻿(function (window, undefined) {\n\n  var freeExports = typeof exports == 'object' && exports,\n    freeModule = typeof module == 'object' && module && module.exports == freeExports && module,\n    freeGlobal = typeof global == 'object' && global;\n  if (freeGlobal.global === freeGlobal) {\n    window = freeGlobal;\n  }\n\n  var comparer = Rx.internals.isEqual;\n\n  var slice = Array.prototype.slice;\n\n  function createMessage(actual, expected) {\n    return 'Expected: [' + expected.toString() + ']\\r\\nActual: [' + actual.toString() + ']';\n  }\n\n  Array.prototype.assertEqual = function () {\n    var expected = slice.call(arguments);\n    var actual = this;\n\n    var i, isOk = true;\n    if (expected.length !== actual.length) {\n      ok(false, 'Not equal length. ' + createMessage(actual, expected));\n      return;\n    }\n    for (i = 0; i < expected.length; i++) {\n      var e = expected[i], a = actual[i];\n      // ALlow for predicates\n      if (e.value && typeof e.value.predicate === 'function') {\n\n        isOk = e.time === a.time && e.value.predicate(a.value);\n      } else {\n        isOk = comparer(e, a);\n      }\n\n      if (!isOk) {\n        break;\n      }\n    }\n    ok(isOk, createMessage(actual, expected));\n  };\n}(this));\n"
  },
  {
    "path": "tests/internal/isequal.js",
    "content": "QUnit.module('isEqual');\n\nvar isEqual = Rx.internals.isEqual;\n\ntest('isEqual_bool_equal', function () {\n  ok(isEqual(true, true));\n});\n\ntest('isEqual_bool_inequal', function () {\n  ok(!isEqual(true, false));\n});\n\ntest('isEqual_number_equal', function () {\n  ok(isEqual(42, 42));\n});\n\ntest('isEqual_number_inequal', function () {\n  ok(!isEqual(42, 0));\n});\n\ntest('isEqual_number +0 not equal to -0', function () {\n  ok(isEqual(+0, -0));\n});\n\ntest('isEqual_number NaN is equal to NaN', function () {\n  ok(isEqual(NaN, NaN));\n});\n\ntest('isEqual_number Infinity is equal to Infinity', function () {\n  ok(isEqual(Infinity, Infinity));\n});\n\ntest('isEqual_string_equal', function () {\n  ok(isEqual('foo', 'foo'));\n});\n\ntest('isEqual_string_inequal', function () {\n  ok(!isEqual('foo', 'bar'));\n});\n\ntest('isEqual_array_equal', function () {\n  ok(isEqual([1,2,3], [1,2,3]));\n});\n\ntest('isEqual_array_inequal', function () {\n  ok(!isEqual([1,2,3], ['foo', 'bar']));\n});\n\ntest('isEqual object equal', function () {\n  ok(isEqual({foo: 'bar'}, {foo: 'bar'}));\n});\n\ntest('isEqual object inequal', function () {\n  ok(!isEqual({foo: 'bar'}, {foo: 'baz'}));\n});\n\ntest('isEqual complex object equal', function () {\n  ok(isEqual({foo: 'bar', baz: [1,2,3]}, {foo: 'bar', baz: [1,2,3]}));\n});\n\ntest('isEqual complex object inequal', function () {\n  ok(!isEqual({foo: 'bar', baz: [1,2,3]}, {foo: 'bar', baz: [4,5,6]}));\n});\n\ntest('isEqual new object equal', function () {\n  function Foo () { }\n  ok(isEqual(new Foo(), new Foo()));\n});\n\ntest('isEqual new object inequal', function () {\n  function Foo () { }\n  function Bar () { }\n  ok(!isEqual(new Foo(), new Bar()));\n});\n"
  },
  {
    "path": "tests/internal/trycatch.js",
    "content": "QUnit.module('tryCatch');\n\nvar tryCatch = Rx.internals.tryCatch;\n\ntest('tryCatch_multiple', function () {\n  var catcher1 = tryCatch(function() { return 1; });\n  var catcher2 = tryCatch(function() { return 2; });\n\n  ok(catcher1() === 1, \"Shouldn't store state in global context\");\n  ok(catcher2() === 2, \"Shouldn't store state in global context\");\n});\n"
  },
  {
    "path": "tests/observable/amb.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, ok */\n\n  QUnit.module('amb');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('amb never 2', function () {\n    var scheduler = new TestScheduler();\n\n    var l = Observable.never();\n    var r = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return l.amb(r);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('amb never 3', function () {\n    var scheduler = new TestScheduler();\n\n    var n1 = Observable.never();\n    var n2 = Observable.never();\n    var n3 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.amb(n1, n2, n3);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('amb never empty', function () {\n    var scheduler = new TestScheduler();\n\n    var n = Observable.never();\n    var e = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(225));\n\n    var results = scheduler.startScheduler(function () {\n      return n.amb(e);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(225));\n  });\n\n  test('amb empty never', function () {\n    var scheduler = new TestScheduler();\n\n    var n = Observable.never();\n    var e = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(225));\n\n    var results = scheduler.startScheduler(function () {\n      return e.amb(n);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(225));\n  });\n\n  test('amb regular should dispose loser', function () {\n    var scheduler = new TestScheduler();\n\n    var sourceNotDisposed = false;\n\n    var o1 = scheduler.createHotObservable(onNext(150, 1), onNext(210, 2), onCompleted(240));\n    var o2 = scheduler.createHotObservable(onNext(150, 1), onNext(220, 3), onCompleted(250)).tap(function () {\n      return sourceNotDisposed = true;\n    });\n\n    var results = scheduler.startScheduler(function () {\n      return o1.amb(o2);\n    });\n\n    results.messages.assertEqual(onNext(210, 2), onCompleted(240));\n    ok(!sourceNotDisposed);\n  });\n\n  test('Amb WinnerThrows', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var sourceNotDisposed = false;\n\n    var o1 = scheduler.createHotObservable(onNext(150, 1), onNext(210, 2), onError(220, error));\n    var o2 = scheduler.createHotObservable(onNext(150, 1), onNext(220, 3), onCompleted(250)).tap(function () {\n        return sourceNotDisposed = true;\n    });\n\n    var results = scheduler.startScheduler(function () {\n        return o1.amb(o2);\n    });\n\n    results.messages.assertEqual(onNext(210, 2), onError(220, error));\n    ok(!sourceNotDisposed);\n  });\n\n  test('Amb LoserThrows', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var sourceNotDisposed = false;\n\n    var o1 = scheduler.createHotObservable(onNext(150, 1), onNext(220, 2), onError(230, error)).tap(function () {\n      return sourceNotDisposed = true;\n    });\n\n    var o2 = scheduler.createHotObservable(onNext(150, 1), onNext(210, 3), onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return o1.amb(o2);\n    });\n\n    results.messages.assertEqual(onNext(210, 3), onCompleted(250));\n    ok(!sourceNotDisposed);\n  });\n\n  test('Amb throws before election', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var sourceNotDisposed = false;\n\n    var o1 = scheduler.createHotObservable(onNext(150, 1), onError(210, error));\n    var o2 = scheduler.createHotObservable(onNext(150, 1), onNext(220, 3), onCompleted(250)).tap(function () {\n        return sourceNotDisposed = true;\n    });\n\n    var results = scheduler.startScheduler(function () {\n        return o1.amb(o2);\n    });\n\n    results.messages.assertEqual(onError(210, error));\n\n    ok(!sourceNotDisposed);\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/asobservable.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, notEqual, ok */\n\n  QUnit.module('asObservable');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('asObservable Hides', function () {\n    var someObservable = Observable.empty();\n    notEqual(someObservable.asObservable(), someObservable);\n  });\n\n  test('asObservable Never', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.never().asObservable();\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('asObservable Empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n        return xs.asObservable();\n    });\n\n    results.messages.assertEqual(\n      onCompleted(250));\n  });\n\n  test('asObservable throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(250, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.asObservable();\n    });\n\n    results.messages.assertEqual(\n      onError(250, error));\n  });\n\n  test('asObservable just', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.asObservable();\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 2),\n      onCompleted(250));\n  });\n\n  test('asObservable is not eager', function () {\n    var scheduler = new TestScheduler();\n\n    var subscribed = false;\n\n    var xs = Observable.create(function (obs) {\n      subscribed = true;\n      var disp = scheduler.createHotObservable(\n          onNext(150, 1),\n          onNext(220, 2),\n          onCompleted(250)\n        ).subscribe(obs);\n      return function () { return disp.dispose(); };\n    });\n    xs.asObservable();\n\n    ok(!subscribed);\n\n    scheduler.startScheduler(function () {\n      return xs.asObservable();\n    });\n\n    ok(subscribed);\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/average.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal, ok */\n\n  QUnit.module('average');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('average Number Empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.average();\n    });\n\n    results.messages.assertEqual(\n      onError(250, function (n) { return n.error instanceof Rx.EmptyError; })\n    );\n  });\n\n  test('average Number Return', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.average();\n    });\n    results.messages.assertEqual(\n      onNext(250, 2),\n      onCompleted(250)\n    );\n  });\n\n  test('average Number Some', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 3),\n      onNext(220, 4),\n      onNext(230, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.average();\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 3),\n      onCompleted(250)\n    );\n  });\n\n  test('average Number Throw', function () {\n    var error = new Error();\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.average();\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('average Number Never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.average();\n    });\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n  test('average Selector Regular Number', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 'b'),\n      onNext(220, 'fo'),\n      onNext(230, 'qux'),\n      onCompleted(240)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.average(function (x) { return x.length; });\n    });\n\n    results.messages.assertEqual(\n      onNext(240, 2),\n      onCompleted(240)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 240));\n  });\n\n  test('average Selector throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 'b'),\n      onNext(220, 'fo'),\n      onNext(230, 'qux'),\n      onCompleted(240)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.average(function () { throw error; });\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 210));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/buffer.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('Buffer');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('Buffer Boundaries Simple', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(180, 2),\n      onNext(250, 3),\n      onNext(260, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(410, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onNext(550, 10),\n      onCompleted(590)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(255, true),\n      onNext(330, true),\n      onNext(350, true),\n      onNext(400, true),\n      onNext(500, true),\n      onCompleted(900)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.buffer(ys);\n    });\n\n    res.messages.assertEqual(\n      onNext(255, [3]),\n      onNext(330, [4, 5]),\n      onNext(350, [6]),\n      onNext(400, [ ]),\n      onNext(500, [7, 8, 9]),\n      onNext(590, [10]),\n      onCompleted(590)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 590)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 590)\n    );\n  });\n\n  test('Buffer Boundaries onCompletedBoundaries', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(180, 2),\n      onNext(250, 3),\n      onNext(260, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(410, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onNext(550, 10),\n      onCompleted(590)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(255, true),\n      onNext(330, true),\n      onNext(350, true),\n      onCompleted(400)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.buffer(ys);\n    });\n\n    res.messages.assertEqual(\n      onNext(255, [3]),\n      onNext(330, [4, 5]),\n      onNext(350, [6]),\n      onNext(400, []),\n      onCompleted(400)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n  });\n\n  test('Buffer Boundaries onErrorSource', function () {\n      var ex = new Error();\n\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n        onNext(90, 1),\n        onNext(180, 2),\n        onNext(250, 3),\n        onNext(260, 4),\n        onNext(310, 5),\n        onNext(340, 6),\n        onNext(380, 7),\n        onError(400, ex)\n      );\n\n      var ys = scheduler.createHotObservable(\n        onNext(255, true),\n        onNext(330, true),\n        onNext(350, true),\n        onCompleted(500)\n      );\n\n      var res = scheduler.startScheduler(function () {\n          return xs.buffer(ys);\n      });\n\n      res.messages.assertEqual(\n          onNext(255, [3]),\n          onNext(330, [4, 5]),\n          onNext(350, [6]),\n          onError(400, ex)\n      );\n\n      xs.subscriptions.assertEqual(\n          subscribe(200, 400)\n      );\n\n      ys.subscriptions.assertEqual(\n          subscribe(200, 400)\n      );\n  });\n\n  test('Buffer Boundaries onErrorBoundaries', function () {\n      var ex = new Error();\n\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n        onNext(90, 1),\n        onNext(180, 2),\n        onNext(250, 3),\n        onNext(260, 4),\n        onNext(310, 5),\n        onNext(340, 6),\n        onNext(410, 7),\n        onNext(420, 8),\n        onNext(470, 9),\n        onNext(550, 10),\n        onCompleted(590)\n      );\n\n      var ys = scheduler.createHotObservable(\n        onNext(255, true),\n        onNext(330, true),\n        onNext(350, true),\n        onError(400, ex)\n      );\n\n      var res = scheduler.startScheduler(function () {\n          return xs.buffer(ys);\n      });\n\n      res.messages.assertEqual(\n        onNext(255, [3]),\n        onNext(330, [4, 5]),\n        onNext(350, [6]),\n        onError(400, ex)\n      );\n\n      xs.subscriptions.assertEqual(\n        subscribe(200, 400)\n      );\n\n      ys.subscriptions.assertEqual(\n        subscribe(200, 400)\n      );\n  });\n\n  test('Buffer Closings Basic', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n        onNext(90, 1),\n        onNext(180, 2),\n        onNext(250, 3),\n        onNext(260, 4),\n        onNext(310, 5),\n        onNext(340, 6),\n        onNext(410, 7),\n        onNext(420, 8),\n        onNext(470, 9),\n        onNext(550, 10),\n        onCompleted(590)\n      );\n\n      var window = 1;\n\n      var res = scheduler.startScheduler(function () {\n          return xs.buffer(function () { return Observable.timer((window++) * 100, scheduler); });\n      });\n\n      res.messages.assertEqual(\n          onNext(300, [ 3, 4 ]),\n          onNext(500, [ 5, 6, 7, 8, 9 ]),\n          onNext(590, [ 10 ]),\n          onCompleted(590)\n      );\n\n      xs.subscriptions.assertEqual(\n          subscribe(200, 590)\n      );\n  });\n\n  test('Buffer Closings InnerSubscriptions', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n          onNext(90, 1),\n          onNext(180, 2),\n          onNext(250, 3),\n          onNext(260, 4),\n          onNext(310, 5),\n          onNext(340, 6),\n          onNext(410, 7),\n          onNext(420, 8),\n          onNext(470, 9),\n          onNext(550, 10),\n          onCompleted(590)\n      );\n\n      var closings = [\n          scheduler.createHotObservable(\n              onNext(300, true),\n              onNext(350, false),\n              onCompleted(380)\n          ),\n          scheduler.createHotObservable(\n              onNext(400, true),\n              onNext(510, false),\n              onNext(620, false)\n          ),\n          scheduler.createHotObservable(\n              onCompleted(500)\n          ),\n          scheduler.createHotObservable(\n              onNext(600, true)\n          )\n      ];\n\n      var window = 0;\n\n      var res = scheduler.startScheduler(function () {\n        return xs.buffer(function () { return closings[window++]; });\n      });\n\n      res.messages.assertEqual(\n          onNext(300, [3, 4 ]),\n          onNext(400, [5, 6 ]),\n          onNext(500, [7, 8, 9 ]),\n          onNext(590, [10 ]),\n          onCompleted(590)\n      );\n\n      xs.subscriptions.assertEqual(\n          subscribe(200, 590)\n      );\n\n      closings[0].subscriptions.assertEqual(\n          subscribe(200, 300)\n      );\n\n      closings[1].subscriptions.assertEqual(\n          subscribe(300, 400)\n      );\n\n      closings[2].subscriptions.assertEqual(\n          subscribe(400, 500)\n      );\n\n      closings[3].subscriptions.assertEqual(\n          subscribe(500, 590)\n      );\n  });\n\n  test('Buffer Closings Empty', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n          onNext(90, 1),\n          onNext(180, 2),\n          onNext(250, 3),\n          onNext(260, 4),\n          onNext(310, 5),\n          onNext(340, 6),\n          onNext(410, 7),\n          onNext(420, 8),\n          onNext(470, 9),\n          onNext(550, 10),\n          onCompleted(590)\n      );\n\n      var window = 1;\n\n      var res = scheduler.startScheduler(function () {\n          return xs.buffer(function () { return Observable.empty().delay((window++) * 100, scheduler); });\n      });\n\n      res.messages.assertEqual(\n          onNext(300, [3, 4]),\n          onNext(500, [5, 6, 7, 8, 9]),\n          onNext(590, [10]),\n          onCompleted(590)\n      );\n\n      xs.subscriptions.assertEqual(\n          subscribe(200, 590)\n      );\n  });\n\n  test('Buffer Closings Dispose', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n          onNext(90, 1),\n          onNext(180, 2),\n          onNext(250, 3),\n          onNext(260, 4),\n          onNext(310, 5),\n          onNext(340, 6),\n          onNext(410, 7),\n          onNext(420, 8),\n          onNext(470, 9),\n          onNext(550, 10),\n          onCompleted(590)\n      );\n\n      var window = 1;\n\n      var res = scheduler.startScheduler(\n        function () {\n          return xs.buffer(function () { return Observable.timer((window++) * 100, scheduler); });\n        },\n        { disposed: 400 }\n      );\n\n      res.messages.assertEqual(\n          onNext(300, [ 3, 4 ])\n      );\n\n      xs.subscriptions.assertEqual(\n          subscribe(200, 400)\n      );\n  });\n\n  test('Buffer Closings Error', function () {\n      var scheduler = new TestScheduler();\n\n      var ex = new Error();\n\n      var xs = scheduler.createHotObservable(\n          onNext(90, 1),\n          onNext(180, 2),\n          onNext(250, 3),\n          onNext(260, 4),\n          onNext(310, 5),\n          onNext(340, 6),\n          onNext(410, 7),\n          onNext(420, 8),\n          onNext(470, 9),\n          onNext(550, 10),\n          onError(590, ex)\n      );\n\n      var window = 1;\n\n      var res = scheduler.startScheduler(function () {\n        return xs.buffer(function () { return Observable.timer((window++) * 100, scheduler); });\n      });\n\n      res.messages.assertEqual(\n        onNext(300, [ 3, 4 ]),\n        onNext(500, [ 5, 6, 7, 8, 9 ]),\n        onError(590, ex)\n      );\n\n      xs.subscriptions.assertEqual(\n        subscribe(200, 590)\n      );\n  });\n\n  test('Buffer Closings Throw', function () {\n      var scheduler = new TestScheduler();\n\n      var ex = new Error();\n\n      var xs = scheduler.createHotObservable(\n          onNext(90, 1),\n          onNext(180, 2),\n          onNext(250, 3),\n          onNext(260, 4),\n          onNext(310, 5),\n          onNext(340, 6),\n          onNext(410, 7),\n          onNext(420, 8),\n          onNext(470, 9),\n          onNext(550, 10),\n          onError(590, new Error())\n      );\n\n      var res = scheduler.startScheduler(function () {\n          return xs.buffer(function () { throw ex; });\n      });\n\n      res.messages.assertEqual(\n          onError(200, ex)\n      );\n\n      xs.subscriptions.assertEqual(\n          subscribe(200, 200)\n      );\n  });\n\n  test('Buffer Closings WindowClose Error', function () {\n    var scheduler = new TestScheduler();\n\n    var ex = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(180, 2),\n      onNext(250, 3),\n      onNext(260, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(410, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onNext(550, 10),\n      onError(590, new Error())\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.buffer(function () { return Observable['throw'](ex, scheduler); });\n    });\n\n    res.messages.assertEqual(\n      onError(201, ex)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 201)\n    );\n  });\n\n  test('Buffer OpeningClosings Basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(180, 2),\n      onNext(250, 3),\n      onNext(260, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(410, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onNext(550, 10),\n      onCompleted(590)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(255, 50),\n      onNext(330, 100),\n      onNext(350, 50),\n      onNext(400, 90),\n      onCompleted(900)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.buffer(ys, function (x) { return Observable.timer(x, null, scheduler); });\n    });\n\n    res.messages.assertEqual(\n      onNext(305, [4 ]),\n      onNext(400, [ ]),\n      onNext(430, [6, 7, 8]),\n      onNext(490, [7, 8, 9]),\n      onCompleted(900)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 900)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 900)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/bufferwithcount.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('bufferWithCount');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n\n  test('bufferWithCount partial window', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.bufferWithCount(5);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, [2,3,4,5]),\n      onCompleted(250)\n    );\n  });\n\n  test('bufferWithCount full windows', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.bufferWithCount(2);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, [2,3]),\n      onNext(240, [4,5]),\n      onCompleted(250)\n    );\n  });\n\n  test('bufferWithCount full and partial windows', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.bufferWithCount(3);\n    });\n\n    results.messages.assertEqual(\n      onNext(230, [2,3,4]),\n      onNext(250, [5]),\n      onCompleted(250)\n    );\n  });\n\n  test('bufferWithCount Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onError(250, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.bufferWithCount(5);\n    });\n\n    results.messages.assertEqual(\n      onError(250, error)\n    );\n  });\n\n  test('bufferWithCount skip less', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.bufferWithCount(3, 1);\n    });\n\n    results.messages.assertEqual(\n      onNext(230, [2,3,4]),\n      onNext(240, [3,4,5]),\n      onNext(250, [4,5]),\n      onNext(250, [5]),\n      onCompleted(250)\n    );\n  });\n\n  test('bufferWithCount skip more', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.bufferWithCount(2, 3);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, [2,3]),\n      onNext(250, [5]),\n      onCompleted(250)\n    );\n  });\n\n  test('bufferWithCount basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(100, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(280, 4),\n      onNext(320, 5),\n      onNext(350, 6),\n      onNext(380, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onCompleted(600));\n\n    var results = scheduler.startScheduler(function () {\n        return xs.bufferWithCount(3, 2);\n    });\n\n    results.messages.assertEqual(\n      onNext(280, [2,3,4]),\n      onNext(350, [4,5,6]),\n      onNext(420, [6,7,8]),\n      onNext(600, [8,9]),\n      onCompleted(600));\n\n    xs.subscriptions.assertEqual(subscribe(200, 600));\n  });\n\n  test('BufferWithCount disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(100, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(280, 4),\n      onNext(320, 5),\n      onNext(350, 6),\n      onNext(380, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onCompleted(600));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.bufferWithCount(3, 2);\n    }, {disposed: 370 });\n\n    results.messages.assertEqual(\n      onNext(280, [2,3,4]),\n      onNext(350, [4,5,6]));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 370));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/bufferwithtime.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('BufferWithTime');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('BufferWithTime Basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(100, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(280, 4),\n      onNext(320, 5),\n      onNext(350, 6),\n      onNext(380, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onCompleted(600));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.bufferWithTime(100, 70, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(300, [2,3,4]),\n      onNext(370, [4,5,6]),\n      onNext(440, [6,7,8]),\n      onNext(510, [8,9]),\n      onNext(580, []),\n      onNext(600, []),\n      onCompleted(600));\n    xs.subscriptions.assertEqual(subscribe(200, 600));\n  });\n\n  test('BufferWithTime Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(100, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(280, 4),\n      onNext(320, 5),\n      onNext(350, 6),\n      onNext(380, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onError(600, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.bufferWithTime(100, 70, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(300, [2,3,4]),\n      onNext(370, [4,5,6]),\n      onNext(440, [6,7,8]),\n      onNext(510, [8,9]),\n      onNext(580, []),\n      onError(600, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600));\n  });\n\n  test('BufferWithTime Disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(100, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(280, 4),\n      onNext(320, 5),\n      onNext(350, 6),\n      onNext(380, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onCompleted(600));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.bufferWithTime(100, 70, scheduler);\n    }, {disposed: 370});\n\n    results.messages.assertEqual(\n      onNext(300, [2,3,4]));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 370));\n  });\n\n  test('BufferWithTime Basic Same', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(100, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(280, 4),\n      onNext(320, 5),\n       onNext(350, 6),\n       onNext(380, 7),\n       onNext(420, 8),\n       onNext(470, 9),\n       onCompleted(600));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.bufferWithTime(100, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(300, [2,3,4]),\n      onNext(400, [5,6,7]),\n      onNext(500, [8,9]),\n      onNext(600, []),\n      onCompleted(600));\n\n    xs.subscriptions.assertEqual(subscribe(200, 600));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/bufferwithtimeorcount.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('bufferWithTimeOrCount');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('bufferWithTimeOrCount basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(205, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(280, 4),\n      onNext(320, 5),\n      onNext(350, 6),\n      onNext(370, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.bufferWithTimeOrCount(70, 3, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(240, [1,2,3]),\n      onNext(310, [4]),\n      onNext(370, [5,6,7]),\n      onNext(440, [8]),\n      onNext(510, [9]),\n      onNext(580, []),\n      onNext(600, []),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n  test('bufferWithTimeOrCount error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(205, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(280, 4),\n      onNext(320, 5),\n      onNext(350, 6),\n      onNext(370, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onError(600, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.bufferWithTimeOrCount(70, 3, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(240, [1,2,3]),\n      onNext(310, [4]),\n      onNext(370, [5,6,7]),\n      onNext(440, [8]),\n      onNext(510, [9]),\n      onNext(580, []),\n      onError(600, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n  test('bufferWithTimeOrCount disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(205, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(280, 4),\n      onNext(320, 5),\n      onNext(350, 6),\n      onNext(370, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.bufferWithTimeOrCount(70, 3, scheduler);\n    }, { disposed: 370 });\n\n    results.messages.assertEqual(\n      onNext(240, [1,2,3]),\n      onNext(310, [4]),\n      onNext(370, [5,6,7])\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 370)\n    );\n  });\n\n  test('multiple bufferWithTimeOrCounts', function(){\n    var scheduler = new TestScheduler();\n\n    var xs1 = scheduler.createHotObservable(onCompleted(700))\n        .bufferWithTimeOrCount(100, 3, scheduler);\n\n    var xs2 = scheduler.createHotObservable(onCompleted(700))\n        .bufferWithTimeOrCount(150, 4, scheduler);\n\n    var results1 = scheduler.createObserver();\n    var results2 = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, 370, function (){\n      xs1.subscribe(results1);\n      xs2.subscribe(results2);\n    });\n\n    scheduler.start();\n\n    results1.messages.assertEqual(\n      onNext(470, []),\n      onNext(570, []),\n      onNext(670, []),\n      onNext(700, []),\n      onCompleted(700)\n    );\n\n    results2.messages.assertEqual(\n      onNext(520, []),\n      onNext(670, []),\n      onNext(700, []),\n      onCompleted(700)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/case.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('case');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('case One', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(240, 2),\n      onNext(270, 3),\n      onCompleted(300));\n\n    var ys = scheduler.createHotObservable(\n      onNext(220, 11),\n      onNext(250, 12),\n      onNext(280, 13),\n      onCompleted(310));\n\n    var zs = scheduler.createHotObservable(\n      onNext(230, 21),\n      onNext(240, 22),\n      onNext(290, 23),\n      onCompleted(320));\n\n    var map = {\n      1: xs,\n      2: ys\n    };\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['case'](function () { return 1; }, map, zs);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(240, 2),\n      onNext(270, 3),\n      onCompleted(300));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300));\n\n    ys.subscriptions.assertEqual();\n\n    zs.subscriptions.assertEqual();\n  });\n\n  test('case Two', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(240, 2),\n      onNext(270, 3),\n      onCompleted(300));\n\n    var ys = scheduler.createHotObservable(\n      onNext(220, 11),\n      onNext(250, 12),\n      onNext(280, 13),\n      onCompleted(310));\n\n    var zs = scheduler.createHotObservable(\n      onNext(230, 21),\n      onNext(240, 22),\n      onNext(290, 23),\n      onCompleted(320));\n\n    var map = {\n      1: xs,\n      2: ys\n    };\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['case'](function () { return 2; }, map, zs);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 11),\n      onNext(250, 12),\n      onNext(280, 13),\n      onCompleted(310));\n\n    xs.subscriptions.assertEqual();\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 310));\n\n    zs.subscriptions.assertEqual();\n  });\n\n  test('case Three', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(240, 2),\n      onNext(270, 3),\n      onCompleted(300));\n\n    var ys = scheduler.createHotObservable(\n      onNext(220, 11),\n      onNext(250, 12),\n      onNext(280, 13),\n      onCompleted(310));\n\n    var zs = scheduler.createHotObservable(\n      onNext(230, 21),\n      onNext(240, 22),\n      onNext(290, 23),\n      onCompleted(320));\n\n    var map = {\n      1: xs,\n      2: ys\n    };\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['case'](function () { return 3; }, map, zs);\n    });\n\n    results.messages.assertEqual(\n      onNext(230, 21),\n      onNext(240, 22),\n      onNext(290, 23),\n      onCompleted(320));\n\n    xs.subscriptions.assertEqual();\n\n    ys.subscriptions.assertEqual();\n\n    zs.subscriptions.assertEqual(\n      subscribe(200, 320));\n  });\n\n  test('case Throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(240, 2),\n      onNext(270, 3),\n      onCompleted(300));\n\n    var ys = scheduler.createHotObservable(\n      onNext(220, 11),\n      onNext(250, 12),\n      onNext(280, 13),\n      onCompleted(310));\n\n    var zs = scheduler.createHotObservable(\n      onNext(230, 21),\n      onNext(240, 22),\n      onNext(290, 23),\n      onCompleted(320));\n\n    var map = {\n      1: xs,\n      2: ys\n    };\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['case'](function () { throw error; }, map, zs);\n    });\n\n    results.messages.assertEqual(\n      onError(200, error));\n\n    xs.subscriptions.assertEqual();\n\n    ys.subscriptions.assertEqual();\n\n    zs.subscriptions.assertEqual();\n  });\n\n  test('caseWithDefault One', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(240, 2),\n      onNext(270, 3),\n      onCompleted(300));\n\n    var ys = scheduler.createHotObservable(\n      onNext(220, 11),\n      onNext(250, 12),\n      onNext(280, 13),\n      onCompleted(310));\n\n    var map = {\n      1: xs,\n      2: ys\n    };\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['case'](function () { return 1; }, map, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(240, 2),\n      onNext(270, 3),\n      onCompleted(300));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300));\n\n    ys.subscriptions.assertEqual();\n  });\n\n  test('caseWithDefault Two', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(240, 2),\n      onNext(270, 3),\n      onCompleted(300));\n\n    var ys = scheduler.createHotObservable(\n      onNext(220, 11),\n      onNext(250, 12),\n      onNext(280, 13),\n      onCompleted(310));\n\n    var map = {\n      1: xs,\n      2: ys\n    };\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['case'](function () { return 2; }, map, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 11),\n      onNext(250, 12),\n      onNext(280, 13),\n      onCompleted(310));\n\n    xs.subscriptions.assertEqual();\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 310));\n  });\n\n  test('caseWithDefault Three', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(240, 2),\n      onNext(270, 3),\n      onCompleted(300));\n\n    var ys = scheduler.createHotObservable(\n      onNext(220, 11),\n      onNext(250, 12),\n      onNext(280, 13),\n      onCompleted(310));\n\n    var map = {\n      1: xs,\n      2: ys\n    };\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['case'](function () { return 3; }, map, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(201));\n\n    xs.subscriptions.assertEqual();\n\n    ys.subscriptions.assertEqual();\n  });\n\n  test('caseWithDefault Throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(240, 2),\n      onNext(270, 3),\n      onCompleted(300));\n\n    var ys = scheduler.createHotObservable(\n      onNext(220, 11),\n      onNext(250, 12),\n      onNext(280, 13),\n      onCompleted(310));\n\n    var map = {\n      1: xs,\n      2: ys\n    };\n    var results = scheduler.startScheduler(function () {\n      return Observable['case'](function () { throw error; }, map, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(200, error));\n\n    xs.subscriptions.assertEqual();\n\n    ys.subscriptions.assertEqual();\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/catch.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, ok, equal */\n\n  QUnit.module('catch');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('Catch NoErrors', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onCompleted(230));\n    var o2 = scheduler.createHotObservable(\n      onNext(240, 5),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return o1['catch'](o2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onCompleted(230));\n  });\n\n  test('Catch Never', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = Observable.never();\n    var o2 = scheduler.createHotObservable(\n      onNext(240, 5),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return o1['catch'](o2);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('Catch Empty', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(230));\n    var o2 = scheduler.createHotObservable(\n      onNext(240, 5),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return o1['catch'](o2);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(230));\n  });\n\n  test('Catch Return', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(230));\n\n    var o2 = scheduler.createHotObservable(\n      onNext(240, 5),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return o1['catch'](o2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onCompleted(230));\n  });\n\n  test('Catch Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onError(230, error));\n\n    var o2 = scheduler.createHotObservable(\n      onNext(240, 5),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return o1['catch'](o2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(240, 5),\n      onCompleted(250));\n  });\n\n  test('Catch Error Never', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onError(230, error));\n\n    var o2 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return o1['catch'](o2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3));\n  });\n\n  test('Catch Error Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onError(230, new Error()));\n\n    var o2 = scheduler.createHotObservable(\n      onNext(240, 4),\n      onError(250, error));\n\n    var results = scheduler.startScheduler(function () {\n      return o1['catch'](o2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(240, 4),\n      onError(250, error)\n    );\n  });\n\n  test('Catch Multiple', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(215, error));\n\n    var o2 = scheduler.createHotObservable(\n      onNext(220, 3),\n      onError(225, error));\n\n    var o3 = scheduler.createHotObservable(\n      onNext(230, 4),\n      onCompleted(235));\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['catch'](o1, o2, o3);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onCompleted(235)\n    );\n  });\n\n  test('Catch ErrorSpecific Caught', function () {\n    var error = new Error();\n\n    var handlerCalled = false;\n\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onError(230, error)\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(240, 4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return o1['catch'](function () {\n        handlerCalled = true;\n        return o2;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(240, 4),\n      onCompleted(250)\n    );\n\n    ok(handlerCalled);\n  });\n\n  test('Catch ErrorSpecific CaughtImmediate', function () {\n    var handlerCalled = false;\n\n    var scheduler = new TestScheduler();\n\n    var o2 = scheduler.createHotObservable(\n      onNext(240, 4),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['throw'](new Error())['catch'](function () {\n        handlerCalled = true;\n        return o2;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(240, 4),\n      onCompleted(250));\n\n    ok(handlerCalled);\n  });\n\n  test('Catch HandlerThrows', function () {\n    var error = new Error();\n\n    var error2 = new Error();\n\n    var handlerCalled = false;\n\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onError(230, error));\n\n    var results = scheduler.startScheduler(function () {\n      return o1['catch'](function () {\n        handlerCalled = true;\n        throw error2;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onError(230, error2));\n\n    ok(handlerCalled);\n  });\n\n  test('Catch Nested OuterCatches', function () {\n    var error = new Error();\n\n    var firstHandlerCalled = false;\n    var secondHandlerCalled = false;\n\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(215, error));\n\n    var o2 = scheduler.createHotObservable(\n      onNext(220, 3),\n      onCompleted(225));\n\n    var o3 = scheduler.createHotObservable(\n      onNext(220, 4),\n      onCompleted(225));\n\n    var results = scheduler.startScheduler(function () {\n      return o1['catch'](function () {\n        firstHandlerCalled = true;\n        return o2;\n      })['catch'](function () {\n        secondHandlerCalled = true;\n        return o3;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onCompleted(225));\n\n    ok(firstHandlerCalled);\n    ok(!secondHandlerCalled);\n  });\n\n  test('Catch ThrowFromNestedCatch', function () {\n    var error = new Error();\n\n    var error2 = new Error();\n\n    var firstHandlerCalled = false;\n    var secondHandlerCalled = false;\n\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(215, error));\n\n    var o2 = scheduler.createHotObservable(\n      onNext(220, 3),\n      onError(225, error2));\n\n    var o3 = scheduler.createHotObservable(\n      onNext(230, 4),\n      onCompleted(235));\n\n    var results = scheduler.startScheduler(function () {\n      return o1['catch'](function (e) {\n        firstHandlerCalled = true;\n        equal(e, error);\n        return o2;\n      })['catch'](function (e) {\n        secondHandlerCalled = true;\n        equal(e, error2);\n        return o3;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onCompleted(235));\n\n    ok(firstHandlerCalled);\n    ok(secondHandlerCalled);\n  });\n\n  test('Rx.Observable.catch() does not lose subscription to underlying observable', 12, function () {\n    var subscribes = 0,\n      unsubscribes = 0,\n      tracer = Rx.Observable.create(function () { ++subscribes; return function () { ++unsubscribes; }; }),\n      s;\n\n    // Try it without catchError()\n    s = tracer.subscribe();\n    equal(subscribes, 1, '1 subscribes');\n    equal(unsubscribes, 0, '0 unsubscribes');\n    s.dispose();\n    equal(subscribes, 1, 'After dispose: 1 subscribes');\n    equal(unsubscribes, 1, 'After dispose: 1 unsubscribes');\n\n    // Now try again with catchError(Observable):\n    subscribes = unsubscribes = 0;\n    s = tracer['catch'](Rx.Observable.never()).subscribe();\n    equal(subscribes, 1, 'catchError(Observable): 1 subscribes');\n    equal(unsubscribes, 0, 'catchError(Observable): 0 unsubscribes');\n    s.dispose();\n    equal(subscribes, 1, 'catchError(Observable): After dispose: 1 subscribes');\n    equal(unsubscribes, 1, 'catchError(Observable): After dispose: 1 unsubscribes');\n\n    // And now try again with catchError(function()):\n    subscribes = unsubscribes = 0;\n    s = tracer['catch'](function () { return Rx.Observable.never(); }).subscribe();\n    equal(subscribes, 1, 'catchError(function): 1 subscribes');\n    equal(unsubscribes, 0, 'catchError(function): 0 unsubscribes');\n    s.dispose();\n    equal(subscribes, 1, 'catchError(function): After dispose: 1 subscribes');\n    equal(unsubscribes, 1, 'catchError(function): After dispose: 1 unsubscribes'); // this one FAILS (unsubscribes is 0)\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/combinelatest.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('combineLatest');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  function add(x, y) { return x + y; }\n\n  test('combineLatest never never', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = Observable.never();\n    var e2 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return e1.combineLatest(e2, add);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('combineLatest never empty', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = Observable.never();\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.combineLatest(e2, add);\n    });\n    results.messages.assertEqual();\n  });\n\n  test('combineLatest empty never', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = Observable.never();\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210));\n\n    var results = scheduler.startScheduler(function () {\n      return e2.combineLatest(e1, add);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('combineLatest empty empty', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210));\n\n    var results = scheduler.startScheduler(function () {\n      return e2.combineLatest(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(210));\n  });\n\n  test('combineLatest empty return', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(220));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.combineLatest(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(215));\n  });\n\n  test('combineLatest return empty', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(220));\n\n    var results = scheduler.startScheduler(function () {\n      return e2.combineLatest(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(215));\n  });\n\n  test('combineLatest never return', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(220));\n    var e2 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return e1.combineLatest(e2, add);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('combineLatest return never', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(210));\n    var e2 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return e2.combineLatest(e1, add);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('combineLatest return return', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(230));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 3),\n      onCompleted(240));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.combineLatest(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 2 + 3),\n      onCompleted(240));\n  });\n\n  test('combineLatest return return no selector', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(230));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 3),\n      onCompleted(240));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.combineLatest(e2);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, [2, 3]),\n      onCompleted(240));\n  });\n\n  test('combineLatest empty error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(230));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.combineLatest(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error));\n  });\n\n  test('combineLatest error empty', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(230));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error));\n\n    var results = scheduler.startScheduler(function () {\n      return e2.combineLatest(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error));\n  });\n\n  test('combineLatest return throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(230));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.combineLatest(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error));\n  });\n\n  test('combineLatest throw return', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(230));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error));\n\n    var results = scheduler.startScheduler(function () {\n      return e2.combineLatest(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error));\n  });\n\n  test('combineLatest throw throw', function () {\n    var error1 = new Error();\n    var error2 = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error1));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(230, error2));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.combineLatest(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error1));\n  });\n\n  test('combineLatest ErrorThrow', function () {\n    var error1 = new Error();\n    var error2 = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(220, error1));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(230, error2));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.combineLatest(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error1));\n  });\n\n  test('combineLatest throw error', function () {\n    var error1 = new Error();\n    var error2 = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(220, error1));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(230, error2));\n\n    var results = scheduler.startScheduler(function () {\n      return e2.combineLatest(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error1));\n  });\n\n  test('combineLatest never throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = Observable.never();\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.combineLatest(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error));\n  });\n\n  test('combineLatest throw never', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = Observable.never();\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error));\n\n    var results = scheduler.startScheduler(function () {\n      return e2.combineLatest(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error));\n  });\n\n  test('combineLatest some throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(230));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.combineLatest(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error));\n  });\n\n  test('combineLatest throw some', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(230));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error));\n\n    var results = scheduler.startScheduler(function () {\n      return e2.combineLatest(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error));\n  });\n\n  test('combineLatest throw after complete left', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(220));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(230, error));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.combineLatest(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onError(230, error));\n  });\n\n  test('combineLatest throw after complete right', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(220));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(230, error));\n\n    var results = scheduler.startScheduler(function () {\n      return e2.combineLatest(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onError(230, error));\n  });\n\n  test('combineLatest interleaved with tail', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onNext(225, 4),\n      onCompleted(230));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 3),\n      onNext(230, 5),\n      onNext(235, 6),\n      onNext(240, 7),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.combineLatest(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 2 + 3),\n      onNext(225, 3 + 4),\n      onNext(230, 4 + 5),\n      onNext(235, 4 + 6),\n      onNext(240, 4 + 7),\n      onCompleted(250));\n  });\n\n  test('combineLatest consecutive', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onNext(225, 4),\n      onCompleted(230));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(235, 6),\n      onNext(240, 7),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.combineLatest(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onNext(235, 4 + 6),\n      onNext(240, 4 + 7),\n      onCompleted(250));\n  });\n\n  test('combineLatest consecutive end with error left', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onNext(225, 4),\n      onError(230, error));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(235, 6),\n      onNext(240, 7),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.combineLatest(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onError(230, error));\n  });\n\n  test('combineLatest consecutive end with error right', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onNext(225, 4),\n      onCompleted(230));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(235, 6),\n      onNext(240, 7),\n      onError(245, error));\n\n    var results = scheduler.startScheduler(function () {\n      return e2.combineLatest(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onNext(235, 4 + 6),\n      onNext(240, 4 + 7),\n      onError(245, error));\n  });\n\n  test('combineLatest selector throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(230));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 3),\n      onCompleted(240));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.combineLatest(e2, function () { throw error; });\n    });\n\n    results.messages.assertEqual(\n      onError(220, error));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/concat.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, RSVP, asyncTest, start, ok, equal */\n\n  QUnit.module('concat');\n\n  var Observable = Rx.Observable,\n    TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe,\n    isEqual = Rx.internals.isEqual;\n\n  asyncTest('concatAll promises', function () {\n    var sources = Rx.Observable.fromArray([\n      new RSVP.Promise(function (res) { res(0); }),\n      new RSVP.Promise(function (res) { res(1); }),\n      new RSVP.Promise(function (res) { res(2); }),\n      new RSVP.Promise(function (res) { res(3); }),\n    ]);\n\n    var res = [];\n    sources.concatAll().subscribe(\n      function (x) {\n        res.push(x);\n      },\n      function () {\n        ok(false);\n        start();\n      },\n      function () {\n        ok(isEqual([0,1,2,3], res));\n        start();\n      });\n  });\n\n  asyncTest('concatAll some errors', function () {\n    var sources = Rx.Observable.fromArray([\n      new RSVP.Promise(function (res) { res(0); }),\n      new RSVP.Promise(function (res, rej) { rej(1); }),\n      new RSVP.Promise(function (res) { res(2); }),\n      new RSVP.Promise(function (res) { res(3); }),\n    ]);\n\n    var res = [];\n    sources.concatAll().subscribe(\n      function (x) {\n        res.push(x);\n      },\n      function (err) {\n        ok(res.length === 1);\n        equal(1, err);\n        start();\n      },\n      function () {\n        ok(false);\n        start();\n      });\n  });\n\n  test('concat empty empty', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(230));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.concat(e2);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(250));\n  });\n\n  test('concat empty never', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(230));\n    var e2 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return e1.concat(e2);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('concat never empty', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(230));\n    var e2 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return e2.concat(e1);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('concat never never', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = Observable.never();\n    var e2 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return e1.concat(e2);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('concat EmptyThrow', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(230));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(250, error));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.concat(e2);\n    });\n\n    results.messages.assertEqual(\n      onError(250, error));\n  });\n\n  test('concat ThrowEmpty', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(230, error));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n        return e1.concat(e2);\n    });\n\n    results.messages.assertEqual(\n      onError(230, error));\n  });\n\n  test('concat throw throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(230, error));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(250, new Error()));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.concat(e2);\n    });\n\n    results.messages.assertEqual(\n      onError(230, error));\n  });\n\n  test('concat ReturnEmpty', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(230));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.concat(e2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onCompleted(250));\n  });\n\n  test('concat empty return', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(230));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(240, 2),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.concat(e2);\n    });\n\n    results.messages.assertEqual(\n      onNext(240, 2),\n      onCompleted(250));\n  });\n\n  test('concat return never', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(230));\n    var e2 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return e1.concat(e2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2));\n  });\n\n  test('concat never return', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(230));\n    var e2 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return e2.concat(e1);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('concat return return', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onCompleted(230));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(240, 3),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.concat(e2);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 2),\n      onNext(240, 3),\n      onCompleted(250));\n  });\n\n  test('concat throw return', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(230, error));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(240, 2),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.concat(e2);\n    });\n\n    results.messages.assertEqual(\n      onError(230, error));\n  });\n\n  test('concat return throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onCompleted(230));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(250, error));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.concat(e2);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 2),\n      onError(250, error));\n  });\n\n  test('concat some data on both sides', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onCompleted(225));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.concat(e2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250));\n  });\n\n  test('concat as arguments', function () {\n    var scheduler = new TestScheduler();\n\n    var xs1 = scheduler.createColdObservable(\n        onNext(10, 1),\n        onNext(20, 2),\n        onNext(30, 3),\n        onCompleted(40)\n    );\n\n    var xs2 = scheduler.createColdObservable(\n      onNext(10, 4),\n      onNext(20, 5),\n      onCompleted(30)\n    );\n\n    var xs3 = scheduler.createColdObservable(\n      onNext(10, 6),\n      onNext(20, 7),\n      onNext(30, 8),\n      onNext(40, 9),\n      onCompleted(50)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return Observable.concat(xs1, xs2, xs3);\n    });\n\n    res.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(250, 4),\n      onNext(260, 5),\n      onNext(280, 6),\n      onNext(290, 7),\n      onNext(300, 8),\n      onNext(310, 9),\n      onCompleted(320)\n    );\n\n    xs1.subscriptions.assertEqual(\n      subscribe(200, 240)\n    );\n\n    xs2.subscriptions.assertEqual(\n      subscribe(240, 270)\n    );\n\n    xs3.subscriptions.assertEqual(\n      subscribe(270, 320)\n    );\n  });\n\n\n}());\n"
  },
  {
    "path": "tests/observable/concatmap.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, RSVP, asyncTest, ok, start, equal */\n\n  QUnit.module('concatMap');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe,\n      isEqual = Rx.internals.isEqual;\n\n  asyncTest('concatMap Then Complete Task', function () {\n    var xs = Rx.Observable.fromArray([4,3,2,1]);\n\n    var ys = new RSVP.Promise(function (res) { res(42); });\n\n    var results = [];\n    xs.concatMap(ys).subscribe(\n      function (x) {\n        results.push(x);\n      },\n      function () {\n        ok(false);\n        start();\n      },\n      function () {\n        ok(isEqual([42,42,42,42], results));\n        start();\n      });\n  });\n\n  asyncTest('concatMap Then Error Task', function () {\n    var xs = Rx.Observable.fromArray([4,3,2,1]);\n\n    var ys = new RSVP.Promise(function (res, rej) { rej(42); });\n\n    xs.concatMap(ys).subscribe(\n      function () {\n        ok(false);\n        start();\n      },\n      function (err) {\n        equal(err, 42);\n        start();\n      },\n      function () {\n        ok(false);\n        start();\n      });\n  });\n\n  asyncTest('concatMap Selector Complete Task', function () {\n    var xs = Rx.Observable.fromArray([4,3,2,1]);\n\n    var results = [];\n    xs.concatMap(function (x, i) {\n      return new RSVP.Promise(function (res) { res(x + i); });\n    }).subscribe(\n      function (x) {\n        results.push(x);\n      },\n      function () {\n        ok(false);\n        start();\n      },\n      function () {\n        ok(isEqual([4, 4, 4, 4], results));\n        start();\n      });\n  });\n\n  asyncTest('concatMap Selector Error Task', function () {\n    var xs = Rx.Observable.fromArray([4,3,2,1]);\n\n    xs.concatMap(function (x, i) {\n      return new RSVP.Promise(function (res, rej) { rej(x + i); });\n    }).subscribe(\n      function () {\n        ok(false);\n        start();\n      },\n      function (err) {\n        equal(err, 4);\n        start();\n      },\n      function () {\n        ok(false);\n        start();\n      });\n  });\n\n  asyncTest('concatMap result selector Complete Task', function () {\n    var xs = Rx.Observable.fromArray([4,3,2,1]);\n\n    var results = [];\n    xs.concatMap(\n      function (x, i) {\n        return new RSVP.Promise(function (res) { res(x + i); });\n      },\n      function (x, y, i) {\n        return x + y + i;\n      })\n      .subscribe(\n        function (x) {\n          results.push(x);\n        },\n        function () {\n          ok(false);\n          start();\n        },\n        function () {\n          ok(isEqual([8, 8, 8, 8], results));\n          start();\n        });\n  });\n\n  asyncTest('concatMap result selector Error Task', function () {\n    var xs = Rx.Observable.fromArray([4,3,2,1]);\n\n    xs.concatMap(\n      function (x, i) {\n        return new RSVP.Promise(function (res, rej) { rej(x + i); });\n      },\n      function (x, y, i) {\n        return x + y + i;\n      })\n      .subscribe(\n        function () {\n          ok(false);\n          start();\n        },\n        function (err) {\n          equal(err, 4);\n          start();\n        },\n        function () {\n          ok(false);\n          start();\n        });\n  });\n\n  test('concatMap Then Complete Complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n        onNext(100, 4),\n        onNext(200, 2),\n        onNext(300, 3),\n        onNext(400, 1),\n        onCompleted(500));\n\n    var ys = scheduler.createColdObservable(\n      onNext(50, 'foo'),\n      onNext(100, 'bar'),\n      onNext(150, 'baz'),\n      onNext(200, 'qux'),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.concatMap(ys);\n    }, {disposed: 2000 });\n\n    results.messages.assertEqual(\n      onNext(350, 'foo'),\n      onNext(400, 'bar'),\n      onNext(450, 'baz'),\n      onNext(500, 'qux'),\n      onNext(600, 'foo'),\n      onNext(650, 'bar'),\n      onNext(700, 'baz'),\n      onNext(750, 'qux'),\n      onNext(850, 'foo'),\n      onNext(900, 'bar'),\n      onNext(950, 'baz'),\n      onNext(1000, 'qux'),\n      onNext(1100, 'foo'),\n      onNext(1150, 'bar'),\n      onNext(1200, 'baz'),\n      onNext(1250, 'qux'),\n      onCompleted(1300));\n\n    xs.subscriptions.assertEqual(subscribe(200, 700));\n\n    ys.subscriptions.assertEqual(\n        subscribe(300, 550),\n        subscribe(550, 800),\n        subscribe(800, 1050),\n        subscribe(1050, 1300));\n  });\n\n  test('concatMap Then Complete Complete 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 4),\n      onNext(200, 2),\n      onNext(300, 3),\n      onNext(400, 1),\n      onCompleted(700));\n\n    var ys = scheduler.createColdObservable(\n      onNext(50, 'foo'),\n      onNext(100, 'bar'),\n      onNext(150, 'baz'),\n      onNext(200, 'qux'),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n        return xs.concatMap(ys);\n    }, {disposed: 2000 });\n\n    results.messages.assertEqual(\n      onNext(350, 'foo'),\n      onNext(400, 'bar'),\n      onNext(450, 'baz'),\n      onNext(500, 'qux'),\n      onNext(600, 'foo'),\n      onNext(650, 'bar'),\n      onNext(700, 'baz'),\n      onNext(750, 'qux'),\n      onNext(850, 'foo'),\n      onNext(900, 'bar'),\n      onNext(950, 'baz'),\n      onNext(1000, 'qux'),\n      onNext(1100, 'foo'),\n      onNext(1150, 'bar'),\n      onNext(1200, 'baz'),\n      onNext(1250, 'qux'),\n      onCompleted(1300));\n\n    xs.subscriptions.assertEqual(subscribe(200, 900));\n\n    ys.subscriptions.assertEqual(\n      subscribe(300, 550),\n      subscribe(550, 800),\n      subscribe(800, 1050),\n      subscribe(1050, 1300));\n  });\n\n  test('concatMap Then Never Complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 4),\n      onNext(200, 2),\n      onNext(300, 3),\n      onNext(400, 1),\n      onNext(500, 5),\n      onNext(700, 0));\n\n    var ys = scheduler.createColdObservable(\n      onNext(50, 'foo'),\n      onNext(100, 'bar'),\n      onNext(150, 'baz'),\n      onNext(200, 'qux'),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n        return xs.concatMap(ys);\n    }, {disposed: 2000 });\n\n    results.messages.assertEqual(\n      onNext(350, 'foo'),\n      onNext(400, 'bar'),\n      onNext(450, 'baz'),\n      onNext(500, 'qux'),\n      onNext(600, 'foo'),\n      onNext(650, 'bar'),\n      onNext(700, 'baz'),\n      onNext(750, 'qux'),\n      onNext(850, 'foo'),\n      onNext(900, 'bar'),\n      onNext(950, 'baz'),\n      onNext(1000, 'qux'),\n      onNext(1100, 'foo'),\n      onNext(1150, 'bar'),\n      onNext(1200, 'baz'),\n      onNext(1250, 'qux'),\n      onNext(1350, 'foo'),\n      onNext(1400, 'bar'),\n      onNext(1450, 'baz'),\n      onNext(1500, 'qux'),\n      onNext(1600, 'foo'),\n      onNext(1650, 'bar'),\n      onNext(1700, 'baz'),\n      onNext(1750, 'qux'));\n\n    xs.subscriptions.assertEqual(subscribe(200, 2000));\n\n    ys.subscriptions.assertEqual(\n      subscribe(300, 550),\n      subscribe(550, 800),\n      subscribe(800, 1050),\n      subscribe(1050, 1300),\n      subscribe(1300, 1550),\n      subscribe(1550, 1800));\n  });\n\n  test('concatMap Then Complete Never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 4),\n      onNext(200, 2),\n      onNext(300, 3),\n      onNext(400, 1),\n      onCompleted(500));\n\n    var ys = scheduler.createColdObservable(\n      onNext(50, 'foo'),\n      onNext(100, 'bar'),\n      onNext(150, 'baz'),\n      onNext(200, 'qux'));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.concatMap(ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(350, 'foo'),\n      onNext(400, 'bar'),\n      onNext(450, 'baz'),\n      onNext(500, 'qux')\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 700));\n\n    ys.subscriptions.assertEqual(\n      subscribe(300, 1000));\n  });\n\n  test('concatMap Then Complete Error', function () {\n    var ex = new Error('ex');\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 4),\n      onNext(200, 2),\n      onNext(300, 3),\n      onNext(400, 1),\n      onCompleted(500));\n\n    var ys = scheduler.createColdObservable(\n      onNext(50, 'foo'),\n      onNext(100, 'bar'),\n      onNext(150, 'baz'),\n      onNext(200, 'qux'),\n      onError(300, ex));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.concatMap(ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(350, 'foo'),\n      onNext(400, 'bar'),\n      onNext(450, 'baz'),\n      onNext(500, 'qux'),\n      onError(600, ex));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600));\n\n    ys.subscriptions.assertEqual(\n      subscribe(300, 600));\n  });\n\n  test('concatMap Then Error Complete', function () {\n    var ex = new Error('ex');\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 4),\n      onNext(200, 2),\n      onNext(300, 3),\n      onNext(400, 1),\n      onError(500, ex));\n\n    var ys = scheduler.createColdObservable(\n      onNext(50, 'foo'),\n      onNext(100, 'bar'),\n      onNext(150, 'baz'),\n      onNext(200, 'qux'),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.concatMap(ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(350, 'foo'),\n      onNext(400, 'bar'),\n      onNext(450, 'baz'),\n      onNext(500, 'qux'),\n      onNext(600, 'foo'),\n      onNext(650, 'bar'),\n      onError(700, ex));\n\n    xs.subscriptions.assertEqual(subscribe(200, 700));\n\n    ys.subscriptions.assertEqual(\n      subscribe(300, 550),\n      subscribe(550, 700));\n  });\n\n  test('concatMap Then Error Error', function () {\n    var ex = new Error('ex');\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 4),\n      onNext(200, 2),\n      onNext(300, 3),\n      onNext(400, 1),\n      onError(500, ex));\n\n    var ys = scheduler.createColdObservable(\n      onNext(50, 'foo'),\n      onNext(100, 'bar'),\n      onNext(150, 'baz'),\n      onNext(200, 'qux'),\n      onError(250, ex));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.concatMap(ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(350, 'foo'),\n      onNext(400, 'bar'),\n      onNext(450, 'baz'),\n      onNext(500, 'qux'),\n      onError(550, ex));\n\n    xs.subscriptions.assertEqual(subscribe(200, 550));\n\n    ys.subscriptions.assertEqual(\n      subscribe(300, 550));\n  });\n\n  test('concatMap Complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n      onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n      onNext(300, scheduler.createColdObservable(\n        onNext(10, 102),\n        onNext(90, 103),\n        onNext(110, 104),\n        onNext(190, 105),\n        onNext(440, 106),\n        onCompleted(460))),\n      onNext(400, scheduler.createColdObservable(\n        onNext(180, 202),\n        onNext(190, 203),\n        onCompleted(205))),\n      onNext(550, scheduler.createColdObservable(\n        onNext(10, 301),\n        onNext(50, 302),\n        onNext(70, 303),\n        onNext(260, 304),\n        onNext(310, 305),\n        onCompleted(410))),\n      onNext(750, scheduler.createColdObservable(onCompleted(40))),\n      onNext(850, scheduler.createColdObservable(\n        onNext(80, 401),\n        onNext(90, 402),\n        onCompleted(100))),\n      onCompleted(900));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.concatMap(function (x) {\n        return x;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 102),\n      onNext(390, 103),\n      onNext(410, 104),\n      onNext(490, 105),\n      onNext(740, 106),\n      onNext(940, 202),\n      onNext(950, 203),\n      onNext(975, 301));\n\n    xs.subscriptions.assertEqual(subscribe(200, 900));\n\n    xs.messages[2].value.value.subscriptions.assertEqual(subscribe(300, 760));\n    xs.messages[3].value.value.subscriptions.assertEqual(subscribe(760, 965));\n    xs.messages[4].value.value.subscriptions.assertEqual(subscribe(965, 1000));\n    xs.messages[5].value.value.subscriptions.assertEqual();\n    xs.messages[6].value.value.subscriptions.assertEqual();\n  });\n\n  test('concatMap Complete InnerNotComplete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n      onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n      onNext(300, scheduler.createColdObservable(\n        onNext(10, 102),\n        onNext(90, 103),\n        onNext(110, 104),\n        onNext(190, 105),\n        onNext(440, 106),\n        onCompleted(460))),\n      onNext(400, scheduler.createColdObservable(\n        onNext(180, 202),\n        onNext(190, 203))),\n      onNext(550, scheduler.createColdObservable(\n        onNext(10, 301),\n        onNext(50, 302),\n        onNext(70, 303),\n        onNext(260, 304),\n        onNext(310, 305),\n        onCompleted(410))),\n      onNext(750, scheduler.createColdObservable(onCompleted(40))),\n      onNext(850, scheduler.createColdObservable(\n        onNext(80, 401),\n        onNext(90, 402),\n        onCompleted(100))),\n      onCompleted(900));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.concatMap(function (x) {\n        return x;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 102),\n      onNext(390, 103),\n      onNext(410, 104),\n      onNext(490, 105),\n      onNext(740, 106),\n      onNext(940, 202),\n      onNext(950, 203));\n\n    xs.subscriptions.assertEqual(subscribe(200, 900));\n\n    xs.messages[2].value.value.subscriptions.assertEqual(subscribe(300, 760));\n    xs.messages[3].value.value.subscriptions.assertEqual(subscribe(760, 1000));\n    xs.messages[4].value.value.subscriptions.assertEqual();\n    xs.messages[5].value.value.subscriptions.assertEqual();\n    xs.messages[6].value.value.subscriptions.assertEqual();\n  });\n\n  test('concatMap Complete OuterNotComplete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n      onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n      onNext(300, scheduler.createColdObservable(\n        onNext(10, 102),\n        onNext(90, 103),\n        onNext(110, 104),\n        onNext(190, 105),\n        onNext(440, 106),\n        onCompleted(460))),\n      onNext(400, scheduler.createColdObservable(\n        onNext(180, 202),\n        onNext(190, 203),\n        onCompleted(205))),\n      onNext(550, scheduler.createColdObservable(\n        onNext(10, 301),\n        onNext(50, 302),\n        onNext(70, 303),\n        onNext(260, 304),\n        onNext(310, 305),\n        onCompleted(410))),\n      onNext(750, scheduler.createColdObservable(onCompleted(40))),\n      onNext(850, scheduler.createColdObservable(\n        onNext(80, 401),\n        onNext(90, 402),\n        onCompleted(100))));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.concatMap(function (x) {\n        return x;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 102),\n      onNext(390, 103),\n      onNext(410, 104),\n      onNext(490, 105),\n      onNext(740, 106),\n      onNext(940, 202),\n      onNext(950, 203),\n      onNext(975, 301));\n\n    xs.subscriptions.assertEqual(subscribe(200, 1000));\n    xs.messages[2].value.value.subscriptions.assertEqual(subscribe(300, 760));\n    xs.messages[3].value.value.subscriptions.assertEqual(subscribe(760, 965));\n    xs.messages[4].value.value.subscriptions.assertEqual(subscribe(965, 1000));\n    xs.messages[5].value.value.subscriptions.assertEqual();\n    xs.messages[6].value.value.subscriptions.assertEqual();\n  });\n\n  test('concatMap Error Outer', function () {\n    var ex = new Error('ex');\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n      onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n      onNext(300, scheduler.createColdObservable(\n        onNext(10, 102),\n        onNext(90, 103),\n        onNext(110, 104),\n        onNext(190, 105),\n        onNext(440, 106),\n        onCompleted(460))),\n      onNext(400, scheduler.createColdObservable(\n        onNext(180, 202),\n        onNext(190, 203),\n        onCompleted(205))),\n      onNext(550, scheduler.createColdObservable(\n        onNext(10, 301),\n        onNext(50, 302),\n        onNext(70, 303),\n        onNext(260, 304),\n        onNext(310, 305),\n        onCompleted(410))),\n      onNext(750, scheduler.createColdObservable(onCompleted(40))),\n      onNext(850, scheduler.createColdObservable(\n        onNext(80, 401),\n        onNext(90, 402),\n        onCompleted(100))),\n      onError(900, ex));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.concatMap(function (x) {\n        return x;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 102),\n      onNext(390, 103),\n      onNext(410, 104),\n      onNext(490, 105),\n      onNext(740, 106),\n      onError(900, ex));\n\n    xs.subscriptions.assertEqual(subscribe(200, 900));\n\n    xs.messages[2].value.value.subscriptions.assertEqual(subscribe(300, 760));\n    xs.messages[3].value.value.subscriptions.assertEqual(subscribe(760, 900));\n    xs.messages[4].value.value.subscriptions.assertEqual();\n    xs.messages[5].value.value.subscriptions.assertEqual();\n    xs.messages[6].value.value.subscriptions.assertEqual();\n  });\n\n  test('concatMap Error Inner', function () {\n    var ex = new Error('ex');\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n      onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n      onNext(300, scheduler.createColdObservable(\n        onNext(10, 102),\n        onNext(90, 103),\n        onNext(110, 104),\n        onNext(190, 105),\n        onNext(440, 106),\n        onError(460, ex))),\n      onNext(400, scheduler.createColdObservable(\n        onNext(180, 202),\n        onNext(190, 203),\n        onCompleted(205))),\n      onNext(550, scheduler.createColdObservable(\n        onNext(10, 301),\n        onNext(50, 302),\n        onNext(70, 303),\n        onNext(260, 304),\n        onNext(310, 305),\n        onCompleted(410))),\n      onNext(750, scheduler.createColdObservable(onCompleted(40))),\n      onNext(850, scheduler.createColdObservable(\n        onNext(80, 401),\n        onNext(90, 402),\n        onCompleted(100))),\n      onCompleted(900));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.concatMap(function (x) {\n        return x;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 102),\n      onNext(390, 103),\n      onNext(410, 104),\n      onNext(490, 105),\n\n      onNext(740, 106),\n      onError(760, ex));\n\n    xs.subscriptions.assertEqual(subscribe(200, 760));\n\n    xs.messages[2].value.value.subscriptions.assertEqual(subscribe(300, 760));\n    xs.messages[3].value.value.subscriptions.assertEqual();\n    xs.messages[4].value.value.subscriptions.assertEqual();\n    xs.messages[5].value.value.subscriptions.assertEqual();\n    xs.messages[6].value.value.subscriptions.assertEqual();\n  });\n\n  test('concatMap dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n      onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n      onNext(300, scheduler.createColdObservable(\n        onNext(10, 102),\n        onNext(90, 103),\n        onNext(110, 104),\n        onNext(190, 105),\n        onNext(440, 106),\n        onCompleted(460))),\n      onNext(400, scheduler.createColdObservable(\n        onNext(180, 202),\n        onNext(190, 203),\n        onCompleted(205))),\n      onNext(550, scheduler.createColdObservable(\n        onNext(10, 301),\n        onNext(50, 302),\n        onNext(70, 303),\n        onNext(260, 304),\n        onNext(310, 305),\n        onCompleted(410))),\n      onNext(750, scheduler.createColdObservable(onCompleted(40))),\n      onNext(850, scheduler.createColdObservable(\n        onNext(80, 401),\n        onNext(90, 402),\n        onCompleted(100))),\n      onCompleted(900));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.concatMap(function (x) {\n        return x;\n      });\n    }, { disposed: 700 });\n\n    results.messages.assertEqual(\n      onNext(310, 102),\n      onNext(390, 103),\n      onNext(410, 104),\n      onNext(490, 105));\n\n    xs.subscriptions.assertEqual(subscribe(200, 700));\n\n    xs.messages[2].value.value.subscriptions.assertEqual(subscribe(300, 700));\n    xs.messages[3].value.value.subscriptions.assertEqual();\n    xs.messages[4].value.value.subscriptions.assertEqual();\n    xs.messages[5].value.value.subscriptions.assertEqual();\n    xs.messages[6].value.value.subscriptions.assertEqual();\n  });\n\n  test('concatMap Throw', function () {\n    var invoked = 0;\n    var ex = new Error('ex');\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n      onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n      onNext(300, scheduler.createColdObservable(\n        onNext(10, 102),\n        onNext(90, 103),\n        onNext(110, 104),\n        onNext(190, 105),\n        onNext(440, 106),\n        onCompleted(460))),\n      onNext(400, scheduler.createColdObservable(\n        onNext(180, 202),\n        onNext(190, 203),\n        onCompleted(205))),\n      onNext(550, scheduler.createColdObservable(\n        onNext(10, 301),\n        onNext(50, 302),\n        onNext(70, 303),\n        onNext(260, 304),\n        onNext(310, 305),\n        onCompleted(410))),\n      onNext(750, scheduler.createColdObservable(\n        onCompleted(40))),\n      onNext(850, scheduler.createColdObservable(\n        onNext(80, 401),\n        onNext(90, 402),\n        onCompleted(100))),\n      onCompleted(900));\n\n    var results = scheduler.startScheduler(function () {\n        return xs.concatMap(function (x) {\n            invoked++;\n            if (invoked === 3) {\n                throw ex;\n            }\n            return x;\n        });\n    });\n    results.messages.assertEqual(onNext(310, 102), onNext(390, 103), onNext(410, 104), onNext(490, 105), onError(550, ex));\n    xs.subscriptions.assertEqual(subscribe(200, 550));\n    xs.messages[2].value.value.subscriptions.assertEqual(subscribe(300, 550));\n    xs.messages[3].value.value.subscriptions.assertEqual();\n    xs.messages[4].value.value.subscriptions.assertEqual();\n    xs.messages[5].value.value.subscriptions.assertEqual();\n    xs.messages[6].value.value.subscriptions.assertEqual();\n  });\n\n  test('concatMap UseFunction', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 4),\n      onNext(220, 3),\n      onNext(250, 5),\n      onNext(270, 1),\n      onCompleted(290));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.concatMap(function (x) {\n        return Observable.interval(10, scheduler).select(function () {\n          return x;\n        }).take(x);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 4),\n      onNext(230, 4),\n      onNext(240, 4),\n      onNext(250, 4),\n      onNext(260, 3),\n      onNext(270, 3),\n      onNext(280, 3),\n      onNext(290, 5),\n      onNext(300, 5),\n      onNext(310, 5),\n      onNext(320, 5),\n      onNext(330, 5),\n      onNext(340, 1),\n      onCompleted(340));\n\n    xs.subscriptions.assertEqual(subscribe(200, 290));\n  });\n\n  function arrayRepeat(value, times) {\n    var results = [];\n    for(var i = 0; i < times; i++) {\n      results.push(value);\n    }\n    return results;\n  }\n\n  test('concatMap iterable Complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(510, 2),\n      onCompleted(600)\n    );\n\n    var inners = [];\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMap(function (x) {\n        var ys = arrayRepeat(x, x);\n        inners.push(ys);\n        return ys;\n      });\n    });\n\n    res.messages.assertEqual(\n      onNext(210, 2),\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(340, 4),\n      onNext(340, 4),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(420, 3),\n      onNext(420, 3),\n      onNext(510, 2),\n      onNext(510, 2),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n\n    equal(4, inners.length);\n  });\n\n  test('concatMap iterable Complete result selector', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(510, 2),\n      onCompleted(600)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMap(function (x) { return arrayRepeat(x, x); }, function (x, y) { return x + y; });\n    });\n\n    res.messages.assertEqual(\n      onNext(210, 4),\n      onNext(210, 4),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(420, 6),\n      onNext(420, 6),\n      onNext(420, 6),\n      onNext(510, 4),\n      onNext(510, 4),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n  test('concatMap iterable Error', function () {\n    var scheduler = new TestScheduler();\n\n    var ex = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(510, 2),\n      onError(600, ex)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMap(function (x) { return arrayRepeat(x, x); });\n    });\n\n    res.messages.assertEqual(\n      onNext(210, 2),\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(340, 4),\n      onNext(340, 4),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(420, 3),\n      onNext(420, 3),\n      onNext(510, 2),\n      onNext(510, 2),\n      onError(600, ex)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n  test('concatMap iterable Error result selector', function () {\n    var scheduler = new TestScheduler();\n\n    var ex = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(510, 2),\n      onError(600, ex)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMap(function (x) { return arrayRepeat(x, x); }, function (x, y) { return x + y; });\n    });\n\n    res.messages.assertEqual(\n      onNext(210, 4),\n      onNext(210, 4),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(420, 6),\n      onNext(420, 6),\n      onNext(420, 6),\n      onNext(510, 4),\n      onNext(510, 4),\n      onError(600, ex)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n  test('concatMap iterable dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(510, 2),\n      onCompleted(600)\n    );\n\n    var res = scheduler.startScheduler(\n      function () {\n        return xs.concatMap(function (x) { return arrayRepeat(x, x); });\n      },\n      {disposed: 350 }\n    );\n\n    res.messages.assertEqual(\n      onNext(210, 2),\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(340, 4),\n      onNext(340, 4),\n      onNext(340, 4)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 350)\n    );\n  });\n\n  test('concatMap iterable dispose result selector', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(510, 2),\n      onCompleted(600)\n    );\n\n    var res = scheduler.startScheduler(\n      function () {\n        return xs.concatMap(function (x) { return arrayRepeat(x, x); }, function (x, y) { return x + y; });\n      },\n      { disposed: 350 }\n    );\n\n    res.messages.assertEqual(\n      onNext(210, 4),\n      onNext(210, 4),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 350)\n    );\n  });\n\n  test('concatMap iterable selector throws', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(510, 2),\n      onCompleted(600)\n    );\n\n    var invoked = 0;\n    var ex = new Error();\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMap(function (x) {\n        invoked++;\n        if (invoked === 3) { throw ex; }\n        return arrayRepeat(x, x);\n      });\n    });\n\n    res.messages.assertEqual(\n      onNext(210, 2),\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(340, 4),\n      onNext(340, 4),\n      onNext(340, 4),\n      onError(420, ex)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n\n    equal(3, invoked);\n  });\n\n  test('concatMap iterable result selector throws', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(510, 2),\n      onCompleted(600)\n    );\n\n    var ex = new Error();\n\n    var inners = [];\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMap(\n        function (x) {\n          var ys = arrayRepeat(x, x);\n          inners.push(ys);\n          return ys;\n        },\n        function (x, y) {\n          if (x === 3) { throw ex; }\n          return x + y;\n        }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(210, 4),\n      onNext(210, 4),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8),\n      onError(420, ex)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n\n    equal(3, inners.length);\n  });\n\n  test('concatMap iterable SelectorThrows result selector', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(510, 2),\n      onCompleted(600)\n    );\n\n    var invoked = 0;\n    var ex = new Error();\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMap(\n        function (x) {\n          invoked++;\n          if (invoked === 3) { throw ex; }\n          return arrayRepeat(x, x);\n        },\n        function (x, y) { return x + y; }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(210, 4),\n      onNext(210, 4),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8),\n      onError(420, ex)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n\n    equal(3, invoked);\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/concatmapobserver.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('concatMapObserver');\n\n  var Observable = Rx.Observable,\n    TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe;\n\n  function throwError(err) {\n    throw err;\n  }\n\n  test('ConcatMap Triple Identity', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.just(x, scheduler); },\n        function (err) { return Observable['throw'](err, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onCompleted(306)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMap Triple InnersWithTiming1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var ysn = scheduler.createColdObservable(\n      onNext(10, 10),\n      onNext(20, 11),\n      onNext(30, 12),\n      onCompleted(40)\n    );\n\n    var yse = scheduler.createColdObservable(\n      onNext(0, 99),\n      onCompleted(10)\n    );\n\n    var ysc = scheduler.createColdObservable(\n      onNext(10, 42),\n      onCompleted(20)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function () { return ysn; },\n        function () { return yse; },\n        function () { return ysc; }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(310, 10),\n      onNext(320, 11),\n      onNext(330, 12),\n      onNext(350, 10),\n      onNext(360, 11),\n      onNext(370, 12),\n      onNext(390, 10),\n      onNext(400, 11),\n      onNext(410, 12),\n      onNext(430, 10),\n      onNext(440, 11),\n      onNext(450, 12),\n      onNext(470, 10),\n      onNext(480, 11),\n      onNext(490, 12),\n      onNext(510, 42),\n      onCompleted(520)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n\n    ysn.subscriptions.assertEqual(\n      subscribe(300, 340),\n      subscribe(340, 380),\n      subscribe(380, 420),\n      subscribe(420, 460),\n      subscribe(460, 500)\n    );\n\n    yse.subscriptions.assertEqual(\n    );\n\n    ysc.subscriptions.assertEqual(\n      subscribe(500, 520)\n    );\n  });\n\n  test('ConcatMap Triple InnersWithTiming2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var ysn = scheduler.createColdObservable(\n      onNext(10, 10),\n      onNext(20, 11),\n      onNext(30, 12),\n      onCompleted(40)\n    );\n\n    var yse = scheduler.createColdObservable(\n      onNext(0, 99),\n      onCompleted(10)\n    );\n\n    var ysc = scheduler.createColdObservable(\n      onNext(10, 42),\n      onCompleted(50)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function () { return ysn; },\n        function () { return yse; },\n        function () { return ysc; }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(310, 10),\n      onNext(320, 11),\n      onNext(330, 12),\n      onNext(350, 10),\n      onNext(360, 11),\n      onNext(370, 12),\n      onNext(390, 10),\n      onNext(400, 11),\n      onNext(410, 12),\n      onNext(430, 10),\n      onNext(440, 11),\n      onNext(450, 12),\n      onNext(470, 10),\n      onNext(480, 11),\n      onNext(490, 12),\n      onNext(510, 42),\n      onCompleted(550)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n\n    ysn.subscriptions.assertEqual(\n      subscribe(300, 340),\n      subscribe(340, 380),\n      subscribe(380, 420),\n      subscribe(420, 460),\n      subscribe(460, 500)\n    );\n\n    yse.subscriptions.assertEqual(\n    );\n\n    ysc.subscriptions.assertEqual(\n      subscribe(500, 550)\n    );\n  });\n\n  test('ConcatMap Triple InnersWithTiming3', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(400, 1),\n      onNext(500, 2),\n      onNext(600, 3),\n      onNext(700, 4),\n      onCompleted(800)\n    );\n\n    var ysn = scheduler.createColdObservable(\n      onNext(10, 10),\n      onNext(20, 11),\n      onNext(30, 12),\n      onCompleted(40)\n    );\n\n    var yse = scheduler.createColdObservable(\n      onNext(0, 99),\n      onCompleted(10)\n    );\n\n    var ysc = scheduler.createColdObservable(\n      onNext(10, 42),\n      onCompleted(100)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function () { return ysn; },\n        function () { return yse; },\n        function () { return ysc; }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(310, 10),\n      onNext(320, 11),\n      onNext(330, 12),\n      onNext(410, 10),\n      onNext(420, 11),\n      onNext(430, 12),\n      onNext(510, 10),\n      onNext(520, 11),\n      onNext(530, 12),\n      onNext(610, 10),\n      onNext(620, 11),\n      onNext(630, 12),\n      onNext(710, 10),\n      onNext(720, 11),\n      onNext(730, 12),\n      onNext(810, 42),\n      onCompleted(900)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 800)\n    );\n\n    ysn.subscriptions.assertEqual(\n      subscribe(300, 340),\n      subscribe(400, 440),\n      subscribe(500, 540),\n      subscribe(600, 640),\n      subscribe(700, 740)\n    );\n\n    yse.subscriptions.assertEqual(\n    );\n\n    ysc.subscriptions.assertEqual(\n      subscribe(800, 900)\n    );\n  });\n\n  test('ConcatMap Triple Error Identity', function () {\n    var scheduler = new TestScheduler();\n\n    var err = new Error();\n\n    var xs = scheduler.createHotObservable(\n        onNext(300, 0),\n        onNext(301, 1),\n        onNext(302, 2),\n        onNext(303, 3),\n        onNext(304, 4),\n        onError(305, err)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.just(x, scheduler); },\n        function (ex1) { return Observable['throw'](ex1, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onError(306, err)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMap Triple ConcatMap', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function (err) { return Observable['throw'](err, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 2),\n      onNext(305, 3),\n      onNext(306, 3),\n      onNext(307, 3),\n      onNext(308, 4),\n      onNext(309, 4),\n      onNext(310, 4),\n      onNext(311, 4),\n      onCompleted(312)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMap Triple Concat', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.just(x, scheduler); },\n        function (err) { return Observable['throw'](err, scheduler); },\n        function () { return Observable.range(1, 3, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onNext(306, 1),\n      onNext(307, 2),\n      onNext(308, 3),\n      onCompleted(309)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMap Triple Catch', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.just(x, scheduler); },\n        function () { return Observable.range(1, 3, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onCompleted(306)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMap Triple Error Catch', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n        onNext(300, 0),\n        onNext(301, 1),\n        onNext(302, 2),\n        onNext(303, 3),\n        onNext(304, 4),\n        onError(305, new Error())\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.just(x, scheduler); },\n        function () { return Observable.range(1, 3, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onNext(306, 1),\n      onNext(307, 2),\n      onNext(308, 3),\n      onCompleted(309)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMap Triple All', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function () { return Observable.repeat(0, 2, scheduler); },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 2),\n      onNext(305, 3),\n      onNext(306, 3),\n      onNext(307, 3),\n      onNext(308, 4),\n      onNext(309, 4),\n      onNext(310, 4),\n      onNext(311, 4),\n      onNext(312, -1),\n      onNext(313, -1),\n      onCompleted(313)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMap Triple Error All', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onError(305, new Error())\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function () { return Observable.repeat(0, 2, scheduler); },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 2),\n      onNext(305, 3),\n      onNext(306, 3),\n      onNext(307, 3),\n      onNext(308, 4),\n      onNext(309, 4),\n      onNext(310, 4),\n      onNext(311, 4),\n      onNext(312, 0),\n      onNext(313, 0),\n      onCompleted(313)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMap Triple All Dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function () { return Observable.repeat(0, 2, scheduler); },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    }, {disposed: 307 });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 2),\n      onNext(305, 3),\n      onNext(306, 3)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMap Triple All Dispose Before First', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function () { return Observable.repeat(0, 2, scheduler); },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    }, { disposed: 304 });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 304)\n    );\n  });\n\n  test('ConcatMap Triple OnNextThrow', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var err = new Error();\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function () { return throwError(err); },\n        function () { return Observable.repeat(0, 2, scheduler); },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onError(300, err)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300)\n    );\n  });\n\n  test('ConcatMap Triple OnErrorThrow', function () {\n    var scheduler = new TestScheduler();\n\n    var err = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onError(305, new Error())\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function () { throw err; },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 2),\n      onError(305, err)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMap Triple OnCompletedThrow', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n        onNext(300, 0),\n        onNext(301, 1),\n        onNext(302, 2),\n        onNext(303, 3),\n        onNext(304, 4),\n        onCompleted(305)\n    );\n\n    var err = new Error();\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function () { return Observable.repeat(0, 2, scheduler); },\n        function () { throw err; }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 2),\n      onError(305, err)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMapWithIndex Triple Identity', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.just(x, scheduler); },\n        function (err) { return Observable['throw'](err, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onCompleted(306)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMapWithIndex Triple InnersWithTiming1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var ysn = scheduler.createColdObservable(\n      onNext(10, 10),\n      onNext(20, 11),\n      onNext(30, 12),\n      onCompleted(40)\n    );\n\n    var yse = scheduler.createColdObservable(\n      onNext(0, 99),\n      onCompleted(10)\n    );\n\n    var ysc = scheduler.createColdObservable(\n      onNext(10, 42),\n      onCompleted(20)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return  ysn; },\n        function (err) { return yse; },\n        function () { return ysc; }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(310, 10),\n      onNext(320, 11),\n      onNext(330, 12),\n      onNext(350, 10),\n      onNext(360, 11),\n      onNext(370, 12),\n      onNext(390, 10),\n      onNext(400, 11),\n      onNext(410, 12),\n      onNext(430, 10),\n      onNext(440, 11),\n      onNext(450, 12),\n      onNext(470, 10),\n      onNext(480, 11),\n      onNext(490, 12),\n      onNext(510, 42),\n      onCompleted(520)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n\n    ysn.subscriptions.assertEqual(\n      subscribe(300, 340),\n      subscribe(340, 380),\n      subscribe(380, 420),\n      subscribe(420, 460),\n      subscribe(460, 500)\n    );\n\n    yse.subscriptions.assertEqual(\n    );\n\n    ysc.subscriptions.assertEqual(\n      subscribe(500, 520)\n    );\n  });\n\n  test('ConcatMapWithIndex Triple InnersWithTiming2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var ysn = scheduler.createColdObservable(\n      onNext(10, 10),\n      onNext(20, 11),\n      onNext(30, 12),\n      onCompleted(40)\n    );\n\n    var yse = scheduler.createColdObservable(\n      onNext(0, 99),\n      onCompleted(10)\n    );\n\n    var ysc = scheduler.createColdObservable(\n      onNext(10, 42),\n      onCompleted(50)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function () { return ysn; },\n        function () { return yse; },\n        function () { return ysc; }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(310, 10),\n      onNext(320, 11),\n      onNext(330, 12),\n      onNext(350, 10),\n      onNext(360, 11),\n      onNext(370, 12),\n      onNext(390, 10),\n      onNext(400, 11),\n      onNext(410, 12),\n      onNext(430, 10),\n      onNext(440, 11),\n      onNext(450, 12),\n      onNext(470, 10),\n      onNext(480, 11),\n      onNext(490, 12),\n      onNext(510, 42),\n      onCompleted(550)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n\n    ysn.subscriptions.assertEqual(\n      subscribe(300, 340),\n      subscribe(340, 380),\n      subscribe(380, 420),\n      subscribe(420, 460),\n      subscribe(460, 500)\n    );\n\n    yse.subscriptions.assertEqual(\n    );\n\n    ysc.subscriptions.assertEqual(\n      subscribe(500, 550)\n    );\n  });\n\n  test('ConcatMapWithIndex Triple InnersWithTiming3', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(400, 1),\n      onNext(500, 2),\n      onNext(600, 3),\n      onNext(700, 4),\n      onCompleted(800)\n    );\n\n    var ysn = scheduler.createColdObservable(\n      onNext(10, 10),\n      onNext(20, 11),\n      onNext(30, 12),\n      onCompleted(40)\n    );\n\n    var yse = scheduler.createColdObservable(\n      onNext(0, 99),\n      onCompleted(10)\n    );\n\n    var ysc = scheduler.createColdObservable(\n      onNext(10, 42),\n      onCompleted(100)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function () { return ysn; },\n        function () { return yse; },\n        function () { return ysc; }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(310, 10),\n      onNext(320, 11),\n      onNext(330, 12),\n      onNext(410, 10),\n      onNext(420, 11),\n      onNext(430, 12),\n      onNext(510, 10),\n      onNext(520, 11),\n      onNext(530, 12),\n      onNext(610, 10),\n      onNext(620, 11),\n      onNext(630, 12),\n      onNext(710, 10),\n      onNext(720, 11),\n      onNext(730, 12),\n      onNext(810, 42),\n      onCompleted(900)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 800)\n    );\n\n    ysn.subscriptions.assertEqual(\n      subscribe(300, 340),\n      subscribe(400, 440),\n      subscribe(500, 540),\n      subscribe(600, 640),\n      subscribe(700, 740)\n    );\n\n    yse.subscriptions.assertEqual(\n    );\n\n    ysc.subscriptions.assertEqual(\n      subscribe(800, 900)\n    );\n  });\n\n  test('ConcatMapWithIndex Triple Error Identity', function () {\n    var scheduler = new TestScheduler();\n\n    var err = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onError(305, err)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.just(x, scheduler); },\n        function (ex1) { return Observable['throw'](ex1, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onError(306, err)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMapWithIndex Triple ConcatMap', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function (err) { return Observable['throw'](err, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 2),\n      onNext(305, 3),\n      onNext(306, 3),\n      onNext(307, 3),\n      onNext(308, 4),\n      onNext(309, 4),\n      onNext(310, 4),\n      onNext(311, 4),\n      onCompleted(312)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMapWithIndex Triple Concat', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return  Observable.just(x, scheduler); },\n        function (err) { return Observable['throw'](err, scheduler); },\n        function () { return Observable.range(1, 3, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onNext(306, 1),\n      onNext(307, 2),\n      onNext(308, 3),\n      onCompleted(309)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMapWithIndex Triple Catch', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return  Observable.just(x, scheduler); },\n        function () { return Observable.range(1, 3, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onCompleted(306)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMapWithIndex Triple Error Catch', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onError(305, new Error())\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return  Observable.just(x, scheduler); },\n        function () { return Observable.range(1, 3, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onNext(306, 1),\n      onNext(307, 2),\n      onNext(308, 3),\n      onCompleted(309)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMapWithIndex Triple All', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function () { return Observable.repeat(0, 2, scheduler); },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 2),\n      onNext(305, 3),\n      onNext(306, 3),\n      onNext(307, 3),\n      onNext(308, 4),\n      onNext(309, 4),\n      onNext(310, 4),\n      onNext(311, 4),\n      onNext(312, -1),\n      onNext(313, -1),\n      onCompleted(313)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMapWithIndex Triple Error All', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onError(305, new Error())\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function () { return Observable.repeat(0, 2, scheduler); },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 2),\n      onNext(305, 3),\n      onNext(306, 3),\n      onNext(307, 3),\n      onNext(308, 4),\n      onNext(309, 4),\n      onNext(310, 4),\n      onNext(311, 4),\n      onNext(312, 0),\n      onNext(313, 0),\n      onCompleted(313)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMapWithIndex Triple All Dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function () { return Observable.repeat(0, 2, scheduler); },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    }, { disposed: 307 });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 2),\n      onNext(305, 3),\n      onNext(306, 3)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMapWithIndex Triple All Dispose Before First', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function () { return Observable.repeat(0, 2, scheduler); },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    }, { disposed: 304 });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 304)\n    );\n  });\n\n  test('ConcatMapWithIndex Triple OnNextThrow', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var err = new Error();\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function () { throw err; },\n        function () { Observable.repeat(0, 2, scheduler); },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onError(300, err)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300)\n    );\n  });\n\n  test('ConcatMapWithIndex Triple OnErrorThrow', function () {\n    var scheduler = new TestScheduler();\n\n    var err = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onError(305, new Error())\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function () { throw err; },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 2),\n      onError(305, err)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('ConcatMapWithIndex Triple OnCompletedThrow', function () {\n      var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var err = new Error();\n\n    var res = scheduler.startScheduler(function () {\n      return xs.concatMapObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function () { return Observable.repeat(0, 2, scheduler); },\n        function () { throw err; }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 2),\n      onError(305, err)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/connectableobservable.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal, notEqual */\n\n  QUnit.module('ConnectableObservableTest');\n\n  var Observable = Rx.Observable,\n      Subject = Rx.Subject,\n      inherits = Rx.internals.inherits,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  var ConnectableObservable = (function (__super__) {\n    inherits(ConnectableObservable, __super__);\n    function ConnectableObservable(o, s) {\n      __super__.call(this);\n      this._o = o.multicast(s);\n    }\n\n    ConnectableObservable.prototype._subscribe = function (o) { return this._o.subscribe(o); };\n    ConnectableObservable.prototype.connect = function () { return this._o.connect(); };\n    ConnectableObservable.prototype.refCount = function () { return this._o.refCount(); };\n\n    return ConnectableObservable;\n  }(Observable));\n\n  var MySubject = (function (__super__) {\n    inherits(MySubject, __super__);\n    function MySubject() {\n      __super__.call(this);\n      this.disposeOnMap = {};\n      this.subscribeCount = 0;\n      this.disposed = false;\n    }\n\n    MySubject.prototype._subscribe = function (o) {\n      this.subscribeCount++;\n      this.observer = o;\n\n      var self = this;\n      return Rx.Disposable.create(function () { self.disposed = true; });\n    };\n\n    MySubject.prototype.disposeOn = function (value, disposable) {\n      this.disposeOnMap[value] = disposable;\n    };\n\n    MySubject.prototype.onNext = function (value) {\n      this.observer.onNext(value);\n      this.disposeOnMap[value] && this.disposeOnMap[value].dispose();\n    };\n\n    MySubject.prototype.onError = function (exception) {\n        this.observer.onError(exception);\n    };\n\n    MySubject.prototype.onCompleted = function () {\n        this.observer.onCompleted();\n    };\n\n    return MySubject;\n  })(Observable);\n  \n  test('ConnectableObservable creation', function () {\n    var y = 0;\n\n    var s2 = new Subject();\n    var co2 = new ConnectableObservable(Observable.just(1), s2);\n\n    co2.subscribe(function (x) { y = x; });\n    notEqual(1, y);\n\n    co2.connect();\n    equal(1, y);\n  });\n\n  test('ConnectableObservable connected', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(240, 4),\n      onCompleted(250)\n    );\n\n    var subject = new MySubject();\n\n    var conn = new ConnectableObservable(xs, subject);\n    conn.connect();\n\n    var res = scheduler.startScheduler(function () { return conn; });\n\n    res.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(240, 4),\n      onCompleted(250)\n    );\n  });\n\n  test('ConnectableObservable not connected', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(240, 4),\n      onCompleted(250)\n    );\n\n    var subject = new MySubject();\n\n    var conn = new ConnectableObservable(xs, subject);\n\n    var res = scheduler.startScheduler(function () { return conn; });\n\n    res.messages.assertEqual();\n  });\n\n  test('ConnectableObservable disconnected', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(240, 4),\n      onCompleted(250)\n    );\n\n    var subject = new MySubject();\n\n    var conn = new ConnectableObservable(xs, subject);\n    var disconnect = conn.connect();\n    disconnect.dispose();\n\n    var res = scheduler.startScheduler(function () { return conn; });\n\n    res.messages.assertEqual();\n  });\n\n  test('ConnectableObservable disconnect future', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(240, 4),\n      onCompleted(250)\n    );\n\n    var subject = new MySubject();\n\n    var conn = new ConnectableObservable(xs, subject);\n    subject.disposeOn(3, conn.connect());\n\n    var res = scheduler.startScheduler(function () { return conn; });\n\n    res.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3)\n    );\n  });\n\n  test('ConnectableObservable multiple non-overlapped connections', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(240, 4),\n      onNext(250, 5),\n      onNext(260, 6),\n      onNext(270, 7),\n      onNext(280, 8),\n      onNext(290, 9),\n      onCompleted(300)\n    );\n\n    var subject = new Subject();\n\n    var conn = xs.multicast(subject);\n\n    var c1;\n    scheduler.scheduleAbsolute(null, 225, function () { c1 = conn.connect(); });\n    scheduler.scheduleAbsolute(null, 241, function () { c1.dispose(); });\n    scheduler.scheduleAbsolute(null, 245, function () { c1.dispose(); }); // idempotency test\n    scheduler.scheduleAbsolute(null, 251, function () { c1.dispose(); }); // idempotency test\n    scheduler.scheduleAbsolute(null, 260, function () { c1.dispose(); }); // idempotency test\n\n    var c2;\n    scheduler.scheduleAbsolute(null, 249, function () { c2 = conn.connect(); });\n    scheduler.scheduleAbsolute(null, 255, function () { c2.dispose(); });\n    scheduler.scheduleAbsolute(null, 265, function () { c2.dispose(); }); // idempotency test\n    scheduler.scheduleAbsolute(null, 280, function () { c2.dispose(); }); // idempotency test\n\n    var c3;\n    scheduler.scheduleAbsolute(null, 275, function () { c3 = conn.connect(); });\n    scheduler.scheduleAbsolute(null, 295, function () { c3.dispose(); });\n\n    var res = scheduler.startScheduler(function () { return conn; });\n\n    res.messages.assertEqual(\n      onNext(230, 3),\n      onNext(240, 4),\n      onNext(250, 5),\n      onNext(280, 8),\n      onNext(290, 9)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(225, 241),\n      subscribe(249, 255),\n      subscribe(275, 295)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/controlled.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('Controlled');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('controlled gets some values', function () {\n    var subscription;\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.createObserver();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n\n    var controlled = xs.controlled();\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = controlled.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      controlled.request(5);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n        subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(400, 2),\n      onNext(400, 3),\n      onNext(400, 4),\n      onNext(400, 5),\n      onNext(400, 6),\n      onCompleted(500)\n    );\n  });\n\n  test('controlled gets two sets of values', function () {\n    var subscription;\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.createObserver();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n\n    var controlled = xs.controlled();\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = controlled.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      controlled.request(3);\n    });\n\n    scheduler.scheduleAbsolute(null, 450, function () {\n      controlled.request(2);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n        subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(400, 2),\n      onNext(400, 3),\n      onNext(400, 4),\n      onNext(450, 5),\n      onNext(450, 6),\n      onCompleted(500)\n    );\n  });\n\n  test('controlled fires on completed', function(){\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.createObserver();\n\n    var source = Rx.Observable.range(1, 2).controlled();\n\n    scheduler.scheduleAbsolute(null, 200, function(){\n      source.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      source.request(3);\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(300, 1),\n      onNext(300, 2),\n      onCompleted(300)\n    );\n  });\n\n  test('controlled cancels inflight request', function(){\n    var scheduler = new TestScheduler();\n\n    var source = scheduler.createHotObservable(\n        onNext(400, 2),\n        onNext(410, 3),\n        onNext(420, 4)\n    ).controlled();\n\n    var results = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, 200, function(){\n      source.request(3);\n    });\n\n    scheduler.scheduleAbsolute(null, 200, function(){\n      source.request(2);\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function(){\n      source.subscribe(results);\n    });\n\n    scheduler.advanceBy(420);\n\n\n    results.messages.assertEqual(\n      onNext(400, 2),\n      onNext(410, 3)\n    );\n  });\n\n  test('controlled fires onError', function(){\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.createObserver();\n\n    var error = new Error('expected');\n    var source = Rx.Observable.range(1, 2, scheduler)\n      .concat(Rx.Observable['throw'](error, scheduler))\n      .controlled();\n\n    scheduler.scheduleAbsolute(null, 200, function(){\n      source.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      source.request(3);\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(300, 1),\n      onNext(300, 2),\n      onError(300, error)\n    );\n  });\n\n  test('controlled drops messages with queue disabled', function(){\n    var scheduler = new TestScheduler();\n\n    var source = scheduler.createHotObservable(\n      onNext(400, 1),\n      onNext(410, 2),\n      onNext(420, 3),\n      onNext(430, 4),\n      onCompleted(500)\n    ).controlled(false);\n\n    var results = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, 415, function(){\n      source.request(2);\n    });\n\n    scheduler.scheduleAbsolute(null, 200, function(){\n      source.subscribe(results);\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(420, 3),\n      onNext(430, 4),\n      onCompleted(500)\n    );\n  });\n\n  test('controlled requests are scheduled', function() {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.createObserver();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 0),\n      onNext(220, 1),\n      onNext(230, 2),\n      onNext(240, 3),\n      onNext(250, 4),\n      onNext(260, 5),\n      onNext(270, 6),\n      onCompleted(280)\n    );\n\n    var source = xs.controlled();\n\n    // process one event at a time\n    scheduler.scheduleAbsolute(null, 200, function() {\n      source.subscribe(\n        function (x) {\n          // alternate between immediate and delayed request(1), causes hanging\n          if (x % 2) {\n            //Immediate\n            source.request(1); // request next\n          } else {\n            //Delayed\n            scheduler.schedule(source, function (_, source) {\n              source.request(1); // request next\n            });\n          }\n          results.onNext(x);\n        },\n        function (e) { results.onError(e); },\n        function () { results.onCompleted(); }\n      );\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function() {\n      source.request(1); // start by requesting first item\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(301, 2),\n      onNext(302, 3),\n      onNext(302, 4),\n      onNext(303, 5),\n      onNext(303, 6),\n      onCompleted(303)\n    );\n  });\n\n  test('controlled can request queued values passing true during construction', function() {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n\n    var controlled = xs.controlled(true);\n\n    var results = scheduler.createObserver();\n\n    var subscription;\n    scheduler.scheduleAbsolute(null, 200, function() {\n      subscription = controlled.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function() {\n      controlled.request(5);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function() {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(400, 2),\n      onNext(400, 3),\n      onNext(400, 4),\n      onNext(400, 5),\n      onNext(400, 6),\n      onCompleted(500)\n    );\n  });\n\n  test('controlled discards all values that occurred prior to calling request when passing false during construction', function() {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onNext(450, 7),\n      onCompleted(500)\n    );\n\n    var controlled = xs.controlled(false);\n\n    var results = scheduler.createObserver();\n\n    var subscription;\n    scheduler.scheduleAbsolute(null, 200, function() {\n      subscription = controlled.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function() {\n      controlled.request(2);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function() {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(301, 4),\n      onNext(350, 5),\n      onCompleted(500)\n    );\n  });\n\n  test('controlled does not dequeue any values when requesting null, 0, or -1, or -5 items', function() {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n\n    var controlled = xs.controlled();\n\n    var results = scheduler.createObserver();\n\n    var subscription;\n    scheduler.scheduleAbsolute(null, 200, function() {\n      subscription = controlled.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function() {\n      controlled.request(null);\n    });\n\n    scheduler.scheduleAbsolute(null, 410, function() {\n      controlled.request(0);\n    });\n\n    scheduler.scheduleAbsolute(null, 420, function() {\n      controlled.request(-1);\n    });\n\n    scheduler.scheduleAbsolute(null, 430, function() {\n      controlled.request(-5);\n    });\n\n    scheduler.scheduleAbsolute(null, 440, function() {\n      controlled.request(1);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function() {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(440, 2)\n    );\n  });\n\n  test('controlled relays requested values when only some of them are queued up', function() {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n\n    var controlled = xs.controlled();\n\n    var results = scheduler.createObserver();\n\n    var subscription;\n    scheduler.scheduleAbsolute(null, 200, function() {\n      subscription = controlled.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function() {\n      controlled.request(4);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function() {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(300, 2),\n      onNext(300, 3),\n      onNext(301, 4),\n      onNext(350, 5)\n    );\n  });\n\n  test('controlled can terminate the request via dispose when it is partially delivered', function() {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n\n    var controlled = xs.controlled();\n\n    var results = scheduler.createObserver();\n\n    var subscription;\n    scheduler.scheduleAbsolute(null, 200, function() {\n      subscription = controlled.subscribe(results);\n    });\n\n    var theRequest;\n    scheduler.scheduleAbsolute(null, 300, function() {\n      theRequest = controlled.request(4);\n    });\n\n    scheduler.scheduleAbsolute(null, 310, function() {\n      theRequest.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function() {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(300, 2),\n      onNext(300, 3),\n      onNext(301, 4)\n    );\n  });\n\n  test('controlled relays queued values, non-queued values, and then a queued value again', function() {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(320, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onNext(450, 7),\n      onCompleted(500)\n    );\n\n    var controlled = xs.controlled();\n\n    var results = scheduler.createObserver();\n\n    var subscription;\n    scheduler.scheduleAbsolute(null, 200, function() {\n      subscription = controlled.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function() {\n      controlled.request(2);\n      // queued values\n    });\n\n    scheduler.scheduleAbsolute(null, 310, function() {\n      controlled.request(2);\n      // values that haven't arrived yet\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function() {\n      controlled.request(1);\n      // queued value again\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function() {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(300, 2),\n      onNext(300, 3),\n      onNext(320, 4),\n      onNext(350, 5),\n      onNext(400, 6)\n    );\n\n  });\n\n  test('controlled relays requested values that occured before an error occured', function() {\n    var scheduler = new TestScheduler();\n\n    var error = new Error('expected');\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onError(250, error)\n    );\n\n    var controlled = xs.controlled();\n\n    var results = scheduler.createObserver();\n\n    var subscription;\n    scheduler.scheduleAbsolute(null, 200, function() {\n      subscription = controlled.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function() {\n      controlled.request(2);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function() {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(500, 2),\n      onNext(500, 3),\n      onError(500, error)\n    );\n  });\n\n  test('controlled relays error immediately when requesting values after an error has occured when queue is empty', function() {\n    var scheduler = new TestScheduler();\n\n    var error = new Error('expected');\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(300, 3),\n      onError(400, error)\n    );\n\n    var controlled = xs.controlled();\n\n    var results = scheduler.createObserver();\n\n    var subscription;\n    scheduler.scheduleAbsolute(null, 200, function() {\n      subscription = controlled.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 350, function() {\n      controlled.request(2);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function() {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(350, 2),\n      onNext(350, 3),\n      onError(400, error)\n    );\n  });\n\n  test('controlled relays completion immediately when requesting values after completion has occured when queue is empty', function() {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n        onNext(150, 1),\n        onNext(210, 2),\n        onNext(300, 3),\n        onCompleted(400)\n    );\n\n    var controlled = xs.controlled();\n\n    var results = scheduler.createObserver();\n\n    var subscription;\n    scheduler.scheduleAbsolute(null, 200, function() {\n      subscription = controlled.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 350, function() {\n      controlled.request(2);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function() {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(350, 2),\n      onNext(350, 3),\n      onCompleted(400)\n    );\n  });\n\n  test('controlled does not relay error when requesting values after an error has occured when queue is not empty', function() {\n    var scheduler = new TestScheduler();\n\n    var unexpectedError = new Error('unexpected');\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(300, 3),\n      onError(400, unexpectedError)\n    );\n\n    var controlled = xs.controlled();\n\n    var results = scheduler.createObserver();\n\n    var subscription;\n    scheduler.scheduleAbsolute(null, 200, function() {\n      subscription = controlled.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 350, function() {\n      controlled.request(1);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function() {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(350, 2)\n    );\n  });\n\n  test('controlled does not relay completion when requesting values after completion has occured when queue is not empty', function() {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(300, 3),\n      onCompleted(400)\n    );\n\n    var controlled = xs.controlled();\n\n    var results = scheduler.createObserver();\n\n    var subscription;\n    scheduler.scheduleAbsolute(null, 200, function() {\n      subscription = controlled.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 350, function() {\n      controlled.request(1);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function() {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(350, 2)\n    );\n  });\n\n  test('controlled ignores all values when queue is disabled but delivers completion immediately when it occurs', function() {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n\n    var controlled = xs.controlled(false);\n\n    var results = scheduler.createObserver();\n\n    var subscription;\n    scheduler.scheduleAbsolute(null, 200, function() {\n      subscription = controlled.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function() {\n      controlled.request(5);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function() {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onCompleted(500)\n    );\n  });\n\n  test('controlled ignores all values when queue is disabled but delivers error immediately when it occurs', function() {\n    var scheduler = new TestScheduler();\n\n    var error = new Error('expected');\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onError(500, error)\n    );\n\n    var controlled = xs.controlled(false);\n\n    var results = scheduler.createObserver();\n\n    var subscription;\n    scheduler.scheduleAbsolute(null, 200, function() {\n      subscription = controlled.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function() {\n      controlled.request(5);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function() {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onError(500, error)\n    );\n  });\n\n\n  test('controlled disposes partially delivered request when issuing a new one', function() {\n   var scheduler = new TestScheduler();\n\n   var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(450, 5),\n      onNext(460, 6),\n      onCompleted(500)\n    );\n\n    var controlled = xs.controlled();\n\n    var results = scheduler.createObserver();\n\n    var subscription;\n    scheduler.scheduleAbsolute(null, 200, function() {\n      subscription = controlled.subscribe(\n        function(x) {\n          results.onNext(x);\n        },\n        function(err) {\n          results.onError(err);\n        },\n        function() {\n          results.onCompleted();\n        }\n      );\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function() {\n\n      controlled.request(5);\n\n      controlled.request(1);\n      // cause the previous request that hasn't completed yet to get discarded\n\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function() {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(400, 2),\n      onNext(400, 3),\n      onNext(400, 4),\n      onNext(450, 5)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/count.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('count');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('count empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250));\n\n    var res = scheduler.startScheduler(function () {\n      return xs.count();\n    });\n\n    res.messages.assertEqual(\n      onNext(250, 0),\n      onCompleted(250));\n  });\n\n  test('count some', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onCompleted(250));\n\n    var res = scheduler.startScheduler(function () {\n      return xs.count();\n    });\n\n    res.messages.assertEqual(\n      onNext(250, 3),\n      onCompleted(250));\n  });\n\n  test('count throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error));\n\n    var res = scheduler.startScheduler(function () {\n      return xs.count();\n    });\n\n    res.messages.assertEqual(\n      onError(210, error));\n  });\n\n  test('count never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1));\n\n    var res = scheduler.startScheduler(function () {\n      return xs.count();\n    });\n\n    res.messages.assertEqual();\n  });\n\n  test('count predicate empty true', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250));\n\n    var res = scheduler.startScheduler(function () {\n      return xs.count(function () { return true; });\n    });\n\n    res.messages.assertEqual(\n      onNext(250, 0),\n      onCompleted(250));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250));\n  });\n\n  test('count predicate empty false', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250));\n\n    var res = scheduler.startScheduler(function () {\n      return xs.count(function () { return false; });\n    });\n\n    res.messages.assertEqual(\n      onNext(250, 0),\n      onCompleted(250));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250));\n  });\n\n  test('count predicate return true', function () {\n\n      var scheduler = new TestScheduler();\n      var xs = scheduler.createHotObservable(onNext(150, 1), onNext(210, 2), onCompleted(250));\n      var res = scheduler.startScheduler(function () {\n          return xs.count(function () {\n              return true;\n          });\n      });\n      res.messages.assertEqual(onNext(250, 1), onCompleted(250));\n      xs.subscriptions.assertEqual(subscribe(200, 250));\n  });\n\n  test('count predicate return false', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250));\n\n    var res = scheduler.startScheduler(function () {\n      return xs.count(function () { return false; });\n    });\n\n    res.messages.assertEqual(\n      onNext(250, 0),\n      onCompleted(250));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250));\n  });\n\n  test('count predicate all matched', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onCompleted(250));\n\n    var res = scheduler.startScheduler(function () {\n      return xs.count(function (x) { return x < 10; });\n    });\n\n    res.messages.assertEqual(\n      onNext(250, 3),\n      onCompleted(250));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250));\n  });\n\n  test('count predicate none matched', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onCompleted(250));\n\n    var res = scheduler.startScheduler(function () {\n      return xs.count(function (x) { return x > 10; });\n    });\n\n    res.messages.assertEqual(\n      onNext(250, 0),\n      onCompleted(250));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250));\n  });\n\n  test('count predicate some even', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onCompleted(250));\n\n    var res = scheduler.startScheduler(function () {\n      return xs.count(function (x) { return x % 2 === 0; });\n    });\n\n    res.messages.assertEqual(\n      onNext(250, 2), onCompleted(250));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250));\n  });\n\n  test('count predicate throw true', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error));\n\n    var res = scheduler.startScheduler(function () {\n      return xs.count(function () { return true; });\n    });\n\n    res.messages.assertEqual(\n      onError(210, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 210));\n  });\n\n  test('count predicate throw false', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error));\n\n    var res = scheduler.startScheduler(function () {\n      return xs.count(function () { return false; });\n    });\n\n    res.messages.assertEqual(\n      onError(210, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 210));\n  });\n\n  test('count predicate never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1));\n\n    var res = scheduler.startScheduler(function () {\n      return xs.count(function () { return true; });\n    });\n\n    res.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(subscribe(200, 1000));\n  });\n\n  test('count predicate throws error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onCompleted(240));\n\n    var res = scheduler.startScheduler(function () {\n      return xs.count(function (x) {\n        if (x === 3) { throw error; }\n        return true;\n      });\n    });\n\n    res.messages.assertEqual(\n      onError(230, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230));\n  });\n\n  test('count after range', function() {\n    var scheduler = new TestScheduler();\n\n    var xs = Rx.Observable.range(1, 10, scheduler);\n\n    var result = scheduler.startScheduler(function(){\n      return xs.count();\n    });\n\n    result.messages.assertEqual(onNext(211, 10), onCompleted(211));\n  });\n\n  test('count After Skip', function() {\n    var scheduler = new TestScheduler();\n\n    var xs = Rx.Observable.range(1, 10, scheduler).skip(1);\n\n    var result = scheduler.startScheduler(function(){\n      return xs.count();\n    });\n\n    result.messages.assertEqual(onNext(211, 9), onCompleted(211));\n  });\n\n  test('count After Take', function() {\n    var scheduler = new TestScheduler();\n\n    var xs = Rx.Observable.range(1, 10, scheduler).take(1);\n\n    var result = scheduler.startScheduler(function(){\n      return xs.count();\n    });\n\n    result.messages.assertEqual(onNext(201, 1), onCompleted(201));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/create.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, raises */\n\n  QUnit.module('create');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  function noop () { }\n\n  test('create next', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.create(function (o) {\n        o.onNext(1);\n        o.onNext(2);\n        return Rx.Disposable.empty;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(200, 1),\n      onNext(200, 2));\n  });\n\n  test('create completed', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.create(function (o) {\n        o.onCompleted();\n        o.onNext(100);\n        o.onError(new Error());\n        o.onCompleted();\n        return Rx.Disposable.empty;\n      });\n    });\n\n    results.messages.assertEqual(\n      onCompleted(200));\n  });\n\n  test('create Error', function () {\n    var scheduler = new TestScheduler();\n\n    var error = new Error();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.create(function (o) {\n        o.onError(error);\n        o.onNext(100);\n        o.onError(new Error());\n        o.onCompleted();\n        return Rx.Disposable.empty;\n      });\n    });\n\n    results.messages.assertEqual(\n      onError(200, error));\n  });\n\n  test('create noop next', function () {\n\n      var scheduler = new TestScheduler();\n      var results = scheduler.startScheduler(function () {\n        return Observable.create(function (o) {\n          o.onNext(1);\n          o.onNext(2);\n          return noop;\n        });\n      });\n\n      results.messages.assertEqual(onNext(200, 1), onNext(200, 2));\n  });\n\n  test('create no op completed', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.create(function (o) {\n        o.onCompleted();\n        o.onNext(100);\n        o.onError(new Error());\n        o.onCompleted();\n        return noop;\n      });\n    });\n\n    results.messages.assertEqual(\n      onCompleted(200));\n  });\n\n  test('create no op Error', function () {\n    var scheduler = new TestScheduler();\n\n    var error = new Error();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.create(function (o) {\n        o.onError(error);\n        o.onNext(100);\n        o.onError('foo');\n        o.onCompleted();\n        return noop;\n      });\n    });\n\n    results.messages.assertEqual(\n      onError(200, error));\n  });\n\n  test('create throws errors', function () {\n    raises(function () {\n      Observable.create(function () { throw new Error(); }).subscribe();\n    });\n  });\n\n  test('create dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.create(function (o) {\n        var isStopped = false;\n\n        o.onNext(1);\n        o.onNext(2);\n\n        scheduler.scheduleFuture(null, 600, function () {\n          !isStopped && o.onNext(3);\n        });\n\n        scheduler.scheduleFuture(null, 700, function () {\n          !isStopped && o.onNext(4);\n        });\n\n        scheduler.scheduleFuture(null, 900, function () {\n          !isStopped && o.onNext(5);\n        });\n\n        scheduler.scheduleFuture(null, 1100, function () {\n          !isStopped && o.onNext(6);\n        });\n\n        return function () { isStopped = true; };\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(200, 1),\n      onNext(200, 2),\n      onNext(800, 3),\n      onNext(900, 4));\n  });\n\n  test('create observer does not catch', function () {\n    raises(function () {\n      Observable.create(function (o) { o.onNext(1); })\n        .subscribe(function () { throw new Error(); });\n    });\n\n    raises(function () {\n      Observable.create(function (o) { o.onError(new Error()); })\n        .subscribe(noop, function () { throw new Error(); });\n    });\n\n    raises(function () {\n      Observable.create(function (o) { o.onCompleted(); })\n        .subscribe(noop, noop, function () { throw new Error(); });\n    });\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/debounce.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('debounce');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('debounce Empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 0),\n      onCompleted(300)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.debounce(10, scheduler);\n    });\n\n    res.messages.assertEqual(\n      onCompleted(300)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300)\n    );\n  });\n\n  test('debounce Error', function () {\n    var scheduler = new TestScheduler();\n\n    var error = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 0),\n      onError(300, error)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.debounce(10, scheduler);\n    });\n\n    res.messages.assertEqual(\n      onError(300, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300)\n    );\n  });\n\n  test('debounce Never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 0)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.debounce(10, scheduler);\n    });\n\n    res.messages.assertEqual(\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n  test('debounce all pass', function(){\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(300, 2),\n      onNext(351, 3),\n      onCompleted(400)\n    );\n\n    var results = scheduler.startScheduler(function(){\n      return xs.debounce(50, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(260, 1),\n      onNext(350, 2),\n      onNext(400, 3),\n      onCompleted(400)\n    );\n  });\n\n  test('debounce relative time all pass', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 0),\n      onNext(210, 1),\n      onNext(240, 2),\n      onNext(270, 3),\n      onNext(300, 4),\n      onCompleted(400)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.debounce(function () { return Observable.timer(20, scheduler); });\n    });\n\n    res.messages.assertEqual(\n      onNext(230, 1),\n      onNext(260, 2),\n      onNext(290, 3),\n      onNext(320, 4),\n      onCompleted(400)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n  });\n\n  test('debounce relative time all pass error on end', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 0),\n      onNext(210, 1),\n      onNext(240, 2),\n      onNext(270, 3),\n      onNext(300, 4),\n      onError(400, error)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.debounce(function () { return Observable.timer(20, scheduler); });\n    });\n\n    res.messages.assertEqual(\n      onNext(230, 1),\n      onNext(260, 2),\n      onNext(290, 3),\n      onNext(320, 4),\n      onError(400, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n  });\n\n  test('debounce relative time all drop', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 0),\n      onNext(210, 1),\n      onNext(240, 2),\n      onNext(270, 3),\n      onNext(300, 4),\n      onNext(330, 5),\n      onNext(360, 6),\n      onNext(390, 7),\n      onCompleted(400)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.debounce(function () { return Observable.timer(40, scheduler); });\n    });\n\n    res.messages.assertEqual(\n      onNext(400, 7),\n      onCompleted(400)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n  });\n\n  test('debounce relative time all drop error on end', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 0),\n      onNext(210, 1),\n      onNext(240, 2),\n      onNext(270, 3),\n      onNext(300, 4),\n      onNext(330, 5),\n      onNext(360, 6),\n      onNext(390, 7),\n      onError(400, error)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.debounce(40, scheduler);\n    });\n\n    res.messages.assertEqual(\n      onError(400, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n  });\n\n  test('debounce duration DelayBehavior', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, -1),\n      onNext(250, 0),\n      onNext(280, 1),\n      onNext(310, 2),\n      onNext(350, 3),\n      onNext(400, 4),\n      onCompleted(550)\n    );\n\n    var ys = [\n      scheduler.createColdObservable(onNext(20, 42), onNext(25, 99)),\n      scheduler.createColdObservable(onNext(20, 42), onNext(25, 99)),\n      scheduler.createColdObservable(onNext(20, 42), onNext(25, 99)),\n      scheduler.createColdObservable(onNext(20, 42), onNext(25, 99)),\n      scheduler.createColdObservable(onNext(20, 42), onNext(25, 99))\n    ];\n\n    var results = scheduler.startScheduler(function () {\n      return xs.debounce(function (x) { return ys[x]; });\n    });\n\n    results.messages.assertEqual(\n      onNext(250 + 20, 0),\n      onNext(280 + 20, 1),\n      onNext(310 + 20, 2),\n      onNext(350 + 20, 3),\n      onNext(400 + 20, 4),\n      onCompleted(550)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 550));\n    ys[0].subscriptions.assertEqual(subscribe(250, 250 + 20));\n    ys[1].subscriptions.assertEqual(subscribe(280, 280 + 20));\n    ys[2].subscriptions.assertEqual(subscribe(310, 310 + 20));\n    ys[3].subscriptions.assertEqual(subscribe(350, 350 + 20));\n    ys[4].subscriptions.assertEqual(subscribe(400, 400 + 20));\n  });\n\n  test('debounce duration debounce behavior', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, -1),\n      onNext(250, 0),\n      onNext(280, 1),\n      onNext(310, 2),\n      onNext(350, 3),\n      onNext(400, 4),\n      onCompleted(550));\n\n    var ys = [\n      scheduler.createColdObservable(onNext(20, 42), onNext(25, 99)),\n      scheduler.createColdObservable(onNext(40, 42), onNext(45, 99)),\n      scheduler.createColdObservable(onNext(20, 42), onNext(25, 99)),\n      scheduler.createColdObservable(onNext(60, 42), onNext(65, 99)),\n      scheduler.createColdObservable(onNext(20, 42), onNext(25, 99))];\n\n    var results = scheduler.startScheduler(function () {\n      return xs.debounce(function (x) { return ys[x]; });\n    });\n\n    results.messages.assertEqual(\n      onNext(250 + 20, 0),\n      onNext(310 + 20, 2),\n      onNext(400 + 20, 4),\n      onCompleted(550));\n\n    xs.subscriptions.assertEqual(subscribe(200, 550));\n\n    ys[0].subscriptions.assertEqual(subscribe(250, 250 + 20));\n    ys[1].subscriptions.assertEqual(subscribe(280, 310));\n    ys[2].subscriptions.assertEqual(subscribe(310, 310 + 20));\n    ys[3].subscriptions.assertEqual(subscribe(350, 400));\n    ys[4].subscriptions.assertEqual(subscribe(400, 400 + 20));\n  });\n\n  test('debounce duration early completion', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, -1),\n      onNext(250, 0),\n      onNext(280, 1),\n      onNext(310, 2),\n      onNext(350, 3),\n      onNext(400, 4),\n      onCompleted(410));\n\n    var ys = [\n      scheduler.createColdObservable(onNext(20, 42), onNext(25, 99)),\n      scheduler.createColdObservable(onNext(40, 42), onNext(45, 99)),\n      scheduler.createColdObservable(onNext(20, 42), onNext(25, 99)),\n      scheduler.createColdObservable(onNext(60, 42), onNext(65, 99)),\n      scheduler.createColdObservable(onNext(20, 42), onNext(25, 99))];\n\n    var results = scheduler.startScheduler(function () {\n      return xs.debounce(function (x) { return ys[x]; });\n    });\n\n    results.messages.assertEqual(\n      onNext(250 + 20, 0),\n      onNext(310 + 20, 2),\n      onNext(410, 4),\n      onCompleted(410));\n\n    xs.subscriptions.assertEqual(subscribe(200, 410));\n\n    ys[0].subscriptions.assertEqual(subscribe(250, 250 + 20));\n    ys[1].subscriptions.assertEqual(subscribe(280, 310));\n    ys[2].subscriptions.assertEqual(subscribe(310, 310 + 20));\n    ys[3].subscriptions.assertEqual(subscribe(350, 400));\n    ys[4].subscriptions.assertEqual(subscribe(400, 410));\n  });\n\n  test('debounce duration inner error', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(250, 2),\n      onNext(350, 3),\n      onNext(450, 4),\n      onCompleted(550));\n\n    var error = new Error();\n\n    var results = scheduler.startScheduler(function () {\n      return xs.debounce(function (x) {\n        if (x < 4) {\n          return scheduler.createColdObservable(onNext(x * 10, 'Ignore'), onNext(x * 10 + 5, 'Aargh!'));\n        } else {\n          return scheduler.createColdObservable(onError(x * 10, error));\n        }\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(250 + 2 * 10, 2),\n      onNext(350 + 3 * 10, 3),\n      onError(450 + 4 * 10, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 490));\n  });\n\n  test('debounce duration outer error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(250, 2),\n      onNext(350, 3),\n      onNext(450, 4),\n      onError(460, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.debounce(function (x) {\n        return scheduler.createColdObservable(onNext(x * 10, 'Ignore'), onNext(x * 10 + 5, 'Aargh!'));\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(250 + 2 * 10, 2),\n      onNext(350 + 3 * 10, 3),\n      onError(460, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 460));\n  });\n\n  test('debounce duration selector throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(onNext(150, 1), onNext(250, 2), onNext(350, 3), onNext(450, 4), onCompleted(550));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.debounce(function (x) {\n        if (x < 4) {\n          return scheduler.createColdObservable(onNext(x * 10, 'Ignore'), onNext(x * 10 + 5, 'Aargh!'));\n        }\n        throw error;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(250 + 2 * 10, 2),\n      onNext(350 + 3 * 10, 3),\n      onError(450, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450));\n  });\n\n  test('debounce duration inner done delay behavior', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(250, 2),\n      onNext(350, 3),\n      onNext(450, 4),\n      onCompleted(550));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.debounce(function (x) {\n        return scheduler.createColdObservable(onCompleted(x * 10));\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(250 + 2 * 10, 2),\n      onNext(350 + 3 * 10, 3),\n      onNext(450 + 4 * 10, 4),\n      onCompleted(550));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 550));\n  });\n\n  test('debounce duration inner done debounce behavior', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(250, 2),\n      onNext(280, 3),\n      onNext(300, 4),\n      onNext(400, 5),\n      onNext(410, 6),\n      onCompleted(550));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.debounce(function (x) {\n        return scheduler.createColdObservable(onCompleted(x * 10));\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(250 + 2 * 10, 2),\n      onNext(300 + 4 * 10, 4),\n      onNext(410 + 6 * 10, 6),\n      onCompleted(550));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 550));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/defaultifempty.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('defaultIfEmpty');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('defaultIfEmpty non-empty 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(280, 42),\n      onNext(360, 43),\n      onCompleted(420));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.defaultIfEmpty();\n    });\n\n    results.messages.assertEqual(\n      onNext(280, 42),\n      onNext(360, 43),\n      onCompleted(420));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 420));\n  });\n\n  test('defaultIfEmpty non-empty 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(280, 42),\n      onNext(360, 43),\n      onCompleted(420));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.defaultIfEmpty(-1);\n    });\n\n    results.messages.assertEqual(\n      onNext(280, 42),\n      onNext(360, 43),\n      onCompleted(420));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 420));\n  });\n\n  test('defaultIfEmpty empty 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onCompleted(420));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.defaultIfEmpty(null);\n    });\n\n    results.messages.assertEqual(\n      onNext(420, null),\n      onCompleted(420));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 420));\n  });\n\n  test('defaultIfEmpty empty 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onCompleted(420));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.defaultIfEmpty(-1);\n    });\n\n    results.messages.assertEqual(\n      onNext(420, -1),\n      onCompleted(420));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 420));\n  });\n}());\n"
  },
  {
    "path": "tests/observable/defer.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal */\n  QUnit.module('defer');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('defer Complete', function () {\n    var invoked = 0;\n\n    var scheduler = new TestScheduler();\n\n    var xs;\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.defer(function () {\n        invoked++;\n        xs = scheduler.createColdObservable(\n          onNext(100, scheduler.clock),\n          onCompleted(200));\n\n        return xs;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 200),\n      onCompleted(400)\n    );\n\n    equal(1, invoked);\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400));\n  });\n\n  test('defer Error', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked = 0;\n\n    var error = new Error();\n\n    var xs;\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.defer(function () {\n        invoked++;\n        xs = scheduler.createColdObservable(\n          onNext(100, scheduler.clock),\n          onError(200, error));\n        return xs;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 200),\n      onError(400, error));\n\n    equal(1, invoked);\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400));\n  });\n\n  test('defer Dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked = 0;\n\n    var xs;\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.defer(function () {\n        invoked++;\n        xs = scheduler.createColdObservable(\n          onNext(100, scheduler.clock),\n          onNext(200, invoked),\n          onNext(1100, 1000));\n\n        return xs;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 200),\n      onNext(400, 1));\n\n    equal(1, invoked);\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000));\n  });\n\n  test('defer throw', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked = 0;\n\n    var error = new Error();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.defer(function () {\n        invoked++;\n        throw error;\n      });\n    });\n\n    results.messages.assertEqual(\n      onError(200, error));\n\n    equal(1, invoked);\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/delay.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('delay');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('delay relative time simple 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(250, 2),\n      onNext(350, 3),\n      onNext(450, 4),\n      onCompleted(550));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.delay(100, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(350, 2),\n      onNext(450, 3),\n      onNext(550, 4),\n      onCompleted(650));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 550));\n  });\n\n  test('delay absolute time simple 1 implementation', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(250, 2),\n      onNext(350, 3),\n      onNext(450, 4),\n      onCompleted(550));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.delay(new Date(300), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(350, 2),\n      onNext(450, 3),\n      onNext(550, 4),\n      onCompleted(650));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 550));\n  });\n\n  test('delay relative time simple 2 implementation', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(250, 2),\n      onNext(350, 3),\n      onNext(450, 4),\n      onCompleted(550));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.delay(50, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 2),\n      onNext(400, 3),\n      onNext(500, 4),\n      onCompleted(600));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 550));\n  });\n\n  test('delay absolute time simple 2 implementation', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(250, 2),\n      onNext(350, 3),\n      onNext(450, 4),\n      onCompleted(550));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.delay(new Date(250), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 2),\n      onNext(400, 3),\n      onNext(500, 4),\n      onCompleted(600));\n\n    xs.subscriptions.assertEqual(subscribe(200, 550));\n  });\n\n  test('delay relative time simple 3 implementation', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(250, 2),\n      onNext(350, 3),\n      onNext(450, 4),\n      onCompleted(550));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.delay(150, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(400, 2),\n      onNext(500, 3),\n      onNext(600, 4),\n      onCompleted(700));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 550));\n  });\n\n  test('delay absolute time simple 3 implementation', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(250, 2),\n      onNext(350, 3),\n      onNext(450, 4),\n      onCompleted(550));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.delay(new Date(350), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(400, 2),\n      onNext(500, 3),\n      onNext(600, 4),\n      onCompleted(700));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 550));\n  });\n\n  test('delay relative time error 1 implementation', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(250, 2),\n      onNext(350, 3),\n      onNext(450, 4),\n      onError(550, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.delay(50, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 2),\n      onNext(400, 3),\n      onNext(500, 4),\n      onError(550, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 550));\n  });\n\n  test('delay absolute time error 1 implementation', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(250, 2),\n      onNext(350, 3),\n      onNext(450, 4),\n      onError(550, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.delay(new Date(250), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 2),\n      onNext(400, 3),\n      onNext(500, 4),\n      onError(550, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 550));\n  });\n\n  test('delay relative time error 2 implementation', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(250, 2),\n      onNext(350, 3),\n      onNext(450, 4),\n      onError(550, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.delay(150, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(400, 2),\n      onNext(500, 3),\n      onError(550, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 550));\n  });\n\n  test('delay absolute time error 2 implementation', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(250, 2),\n      onNext(350, 3),\n      onNext(450, 4),\n      onError(550, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.delay(new Date(350), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(400, 2),\n      onNext(500, 3),\n      onError(550, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 550));\n  });\n\n  test('delay empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(550));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.delay(10, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(560));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 550));\n  });\n\n  test('delay error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(550, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.delay(10, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(550, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 550));\n  });\n\n  test('delay never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.delay(10, scheduler);\n    });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000));\n  });\n\n  // delay with selector\n  test('delay duration simple 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 10),\n      onNext(220, 30),\n      onNext(230, 50),\n      onNext(240, 35),\n      onNext(250, 20),\n      onCompleted(260));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.delay(function (x) {\n        return scheduler.createColdObservable(onNext(x, '!'));\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210 + 10, 10),\n      onNext(220 + 30, 30),\n      onNext(250 + 20, 20),\n      onNext(240 + 35, 35),\n      onNext(230 + 50, 50),\n      onCompleted(280));\n\n    xs.subscriptions.assertEqual(subscribe(200, 260));\n  });\n\n  test('delay duration simple 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onNext(250, 6),\n      onCompleted(300));\n\n    var ys = scheduler.createColdObservable(\n      onNext(10, '!'));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.delay(function () { return ys; });\n    });\n\n    results.messages.assertEqual(\n      onNext(210 + 10, 2),\n      onNext(220 + 10, 3),\n      onNext(230 + 10, 4),\n      onNext(240 + 10, 5),\n      onNext(250 + 10, 6),\n      onCompleted(300));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300));\n\n    ys.subscriptions.assertEqual(\n      subscribe(210, 220),\n      subscribe(220, 230),\n      subscribe(230, 240),\n      subscribe(240, 250),\n      subscribe(250, 260));\n  });\n\n  test('delay duration simple 3', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onNext(250, 6),\n      onCompleted(300));\n\n    var ys = scheduler.createColdObservable(\n      onNext(100, '!'));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.delay(function () { return ys; });\n    });\n\n    results.messages.assertEqual(\n      onNext(210 + 100, 2),\n      onNext(220 + 100, 3),\n      onNext(230 + 100, 4),\n      onNext(240 + 100, 5),\n      onNext(250 + 100, 6),\n      onCompleted(350));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300));\n\n    ys.subscriptions.assertEqual(\n      subscribe(210, 310),\n      subscribe(220, 320),\n      subscribe(230, 330),\n      subscribe(240, 340),\n      subscribe(250, 350));\n  });\n\n  test('delay duration simple 4 inner empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onNext(250, 6),\n      onCompleted(300));\n\n    var ys = scheduler.createColdObservable(\n      onCompleted(100));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.delay(function () { return ys; });\n    });\n\n    results.messages.assertEqual(\n      onNext(210 + 100, 2),\n      onNext(220 + 100, 3),\n      onNext(230 + 100, 4),\n      onNext(240 + 100, 5),\n      onNext(250 + 100, 6),\n      onCompleted(350));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300));\n\n    ys.subscriptions.assertEqual(\n      subscribe(210, 310),\n      subscribe(220, 320),\n      subscribe(230, 330),\n      subscribe(240, 340),\n      subscribe(250, 350));\n  });\n\n  test('delay duration dispose 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onNext(250, 6),\n      onCompleted(300));\n\n    var ys = scheduler.createColdObservable(\n      onNext(200, '!'));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.delay(function () { return ys; });\n    }, { disposed: 425 });\n\n    results.messages.assertEqual(\n      onNext(210 + 200, 2),\n      onNext(220 + 200, 3));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300));\n\n    ys.subscriptions.assertEqual(\n      subscribe(210, 410),\n      subscribe(220, 420),\n      subscribe(230, 425),\n      subscribe(240, 425),\n      subscribe(250, 425));\n  });\n\n  test('delay duration dispose 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(400, 3),\n      onCompleted(500));\n\n    var ys = scheduler.createColdObservable(\n      onNext(50, '!'));\n\n    var results = scheduler.startScheduler(function () {\n        return xs.delay(function () { return ys; });\n    }, { disposed: 300 });\n\n    results.messages.assertEqual(\n      onNext(210 + 50, 2));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300));\n\n    ys.subscriptions.assertEqual(\n      subscribe(210, 260));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/delaysubscription.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('delaySubsription');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('delay subscription relative', function() {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(50, 42),\n      onNext(60, 43),\n      onCompleted(70)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return xs.delaySubscription(30, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(280, 42),\n      onNext(290, 43),\n      onCompleted(300)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(230, 300)\n    );\n  });\n\n  test('delaySubscription relative hot', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return xs.delaySubscription(20, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(220, 250)\n    );\n  });\n\n  test('delaySubscription relative hot misses all', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return xs.delaySubscription(200, scheduler);\n    });\n\n    results.messages.assertEqual(\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(400, 1000)\n    );\n  });\n\n  test('delaySubscription relative hot cancel', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return xs.delaySubscription(20, scheduler);\n    }, { disposed: 210 });\n\n    results.messages.assertEqual(\n    );\n\n    xs.subscriptions.assertEqual(\n    );\n  });\n\n  test('delaySubscription relative error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(50, 42),\n      onNext(60, 43),\n      onError(70, error)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return xs.delaySubscription(30, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(280, 42),\n      onNext(290, 43),\n      onError(300, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(230, 300)\n    );\n  });\n\n  test('delay subscription absolute', function() {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(50, 42),\n      onNext(60, 43),\n      onCompleted(70)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return xs.delaySubscription(new Date(230), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(280, 42),\n      onNext(290, 43),\n      onCompleted(300)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(230, 300)\n    );\n  });\n\n  test('delaySubscription absolute hot', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return xs.delaySubscription(new Date(220), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(220, 250)\n    );\n  });\n\n  test('delaySubscription relative hot misses all', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return xs.delaySubscription(new Date(400), scheduler);\n    });\n\n    results.messages.assertEqual(\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(400, 1000)\n    );\n  });\n\n  test('delaySubscription relative hot cancel', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return xs.delaySubscription(new Date(220), scheduler);\n    }, { disposed: 210 });\n\n    results.messages.assertEqual(\n    );\n\n    xs.subscriptions.assertEqual(\n    );\n  });\n\n  test('delaySubscription absolute error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(50, 42),\n      onNext(60, 43),\n      onError(70, error)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return xs.delaySubscription(new Date(230), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(280, 42),\n      onNext(290, 43),\n      onError(300, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(230, 300)\n    );\n  });\n}());\n"
  },
  {
    "path": "tests/observable/distinct.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('distinct');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe;\n\n  test('distinct default comparer all distinct', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(280, 4),\n      onNext(300, 2),\n      onNext(350, 1),\n      onNext(380, 3),\n      onNext(400, 5),\n      onCompleted(420)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.distinct();\n    });\n\n    results.messages.assertEqual(\n      onNext(280, 4),\n      onNext(300, 2),\n      onNext(350, 1),\n      onNext(380, 3),\n      onNext(400, 5),\n      onCompleted(420)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n  });\n\n  test('distinct default comparer some duplicates', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(280, 4),\n      onNext(300, 2),\n      onNext(350, 2),\n      onNext(380, 3),\n      onNext(400, 4),\n      onCompleted(420)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.distinct();\n    });\n\n    results.messages.assertEqual(\n      onNext(280, 4),\n      onNext(300, 2),\n      onNext(380, 3),\n      onCompleted(420)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n  });\n\n  function modComparer(mod) {\n    return function (x, y) {\n      return Rx.helpers.defaultComparer(x % mod, y % mod);\n    };\n  }\n\n  test('distinct CustomComparer all distinct', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(280, 4),\n      onNext(300, 2),\n      onNext(350, 1),\n      onNext(380, 3),\n      onNext(400, 5),\n      onCompleted(420)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.distinct(null, modComparer(10));\n    });\n\n    res.messages.assertEqual(\n      onNext(280, 4),\n      onNext(300, 2),\n      onNext(350, 1),\n      onNext(380, 3),\n      onNext(400, 5),\n      onCompleted(420)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n  });\n\n  test('distinct CustomComparer some duplicates', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(280, 4),\n      onNext(300, 2),\n      onNext(350, 12),\n      onNext(380, 3),\n      onNext(400, 24),\n      onCompleted(420)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.distinct(null, modComparer(10));\n    });\n\n    res.messages.assertEqual(\n      onNext(280, 4),\n      onNext(300, 2),\n      onNext(380, 3),\n      onCompleted(420)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/distinctuntilchanged.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('distinctUntilChanged');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('distinctUntilChanged never', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Rx.Observable.never().distinctUntilChanged();\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('distinctUntilChanged empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.distinctUntilChanged();\n    });\n\n    results.messages.assertEqual(\n      onCompleted(250));\n  });\n\n  test('distinctUntilChanged return', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.distinctUntilChanged();\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 2),\n      onCompleted(250));\n  });\n\n  test('distinctUntilChanged throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(250, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.distinctUntilChanged();\n    });\n\n    results.messages.assertEqual(\n      onError(250, error));\n  });\n\n  test('distinctUntilChanged all changes', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.distinctUntilChanged();\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250));\n  });\n\n  test('distinctUntilChanged all same', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n        onNext(150, 1),\n        onNext(210, 2),\n        onNext(220, 2),\n        onNext(230, 2),\n        onNext(240, 2),\n        onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.distinctUntilChanged();\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onCompleted(250));\n  });\n\n  test('distinctUntilChanged some changes', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(215, 3),\n      onNext(220, 3),\n      onNext(225, 2),\n      onNext(230, 2),\n      onNext(230, 1),\n      onNext(240, 2),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.distinctUntilChanged();\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(215, 3),\n      onNext(225, 2),\n      onNext(230, 1),\n      onNext(240, 2),\n      onCompleted(250));\n  });\n\n  test('distinctUntilChanged comparer all equal', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.distinctUntilChanged(null, function () { return true; });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onCompleted(250));\n  });\n\n  test('distinctUntilChanged comparer all different', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 2),\n      onNext(230, 2),\n      onNext(240, 2),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.distinctUntilChanged(null, function () { return false; });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 2),\n      onNext(230, 2),\n      onNext(240, 2),\n      onCompleted(250));\n  });\n\n  test('distinctUntilChanged key selector evens', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 4),\n      onNext(230, 3),\n      onNext(240, 5),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.distinctUntilChanged(function (x) { return x % 2 === 0; });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(230, 3),\n      onCompleted(250)\n    );\n  });\n\n  test('distinctUntilChanged key selector throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.distinctUntilChanged(function () { throw error; });\n    });\n\n    results.messages.assertEqual(\n      onError(210, error));\n  });\n\n  test('distinctUntilChanged comparer throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.distinctUntilChanged(null, function () { throw error; });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onError(220, error));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/do.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal, notEqual, ok */\n\n  QUnit.module('do/tap');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted;\n\n  function noop () { }\n\n  test('do should see all values', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var i = 0;\n    var sum = 2 + 3 + 4 + 5;\n\n    scheduler.startScheduler(function () {\n      return xs.tap(function (x) { i++; return sum -= x; });\n    });\n\n    equal(4, i);\n    equal(0, sum);\n  });\n\n  test('do plain action', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var i = 0;\n\n    scheduler.startScheduler(function () {\n      return xs.tap(function () { return i++; });\n    });\n\n    equal(4, i);\n  });\n\n  test('do next completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var i = 0;\n    var sum = 2 + 3 + 4 + 5;\n    var completed = false;\n\n    scheduler.startScheduler(function () {\n      return xs.tap(function (x) { i++; sum -= x; }, null, function () { completed = true; });\n    });\n\n    equal(4, i);\n    equal(0, sum);\n    ok(completed);\n  });\n\n  test('do next completed never', function () {\n    var scheduler = new TestScheduler();\n\n    var i = 0;\n    var completed = false;\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    scheduler.startScheduler(function () {\n      return xs.tap(function () { i++; }, null, function () { completed = true; });\n    });\n\n    equal(0, i);\n    ok(!completed);\n  });\n\n  test('do next error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onError(250, error)\n    );\n\n    var i = 0;\n    var sum = 2 + 3 + 4 + 5;\n    var sawError = false;\n\n    scheduler.startScheduler(function () {\n      return xs.tap(function (x) { i++; sum -= x; }, function (e) { sawError = e === error; });\n    });\n\n    equal(4, i);\n    equal(0, sum);\n    ok(sawError);\n  });\n\n  test('do next error not', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var i = 0;\n    var sum = 2 + 3 + 4 + 5;\n    var sawError = false;\n\n    scheduler.startScheduler(function () {\n      return xs.tap(function (x) { i++; sum -= x; }, function () { sawError = true; });\n    });\n\n    equal(4, i);\n    equal(0, sum);\n    ok(!sawError);\n  });\n\n  test('do next error completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5), onCompleted(250)\n    );\n\n    var i = 0;\n    var sum = 2 + 3 + 4 + 5;\n    var sawError = false;\n    var hasCompleted = false;\n\n    scheduler.startScheduler(function () {\n      return xs.tap(function (x) { i++; sum -= x; }, function () { sawError = true; }, function () { hasCompleted = true; });\n    });\n\n    equal(4, i);\n    equal(0, sum);\n    ok(!sawError);\n    ok(hasCompleted);\n  });\n\n  test('do next completed error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onError(250, error)\n    );\n\n    var i = 0;\n    var sum = 2 + 3 + 4 + 5;\n    var sawError = false;\n    var hasCompleted = false;\n\n    scheduler.startScheduler(function () {\n      return xs.tap(function (x) { i++; sum -= x; }, function () { sawError = true; }, function () { hasCompleted = true; });\n    });\n\n    equal(4, i);\n    equal(0, sum);\n    ok(sawError);\n    ok(!hasCompleted);\n  });\n\n  test('do next error completed never', function () {\n    var scheduler = new TestScheduler();\n\n    var i = 0;\n    var sawError = false;\n    var hasCompleted = false;\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    scheduler.startScheduler(function () {\n      return xs.tap(function () { i++; }, function () { sawError = true; }, function () { hasCompleted = true; });\n    });\n\n    equal(0, i);\n    ok(!sawError);\n    ok(!hasCompleted);\n  });\n\n  test('do observer some data with error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onError(250, error)\n    );\n\n    var i = 0;\n    var sum = 2 + 3 + 4 + 5;\n    var sawError = false;\n    var hasCompleted = false;\n\n    scheduler.startScheduler(function () {\n      return xs.tap(Rx.Observer.create(function (x) { i++; sum -= x; }, function (e) { sawError = e === error; }, function () { hasCompleted = true; }));\n    });\n\n    equal(4, i);\n    equal(0, sum);\n    ok(sawError);\n    ok(!hasCompleted);\n  });\n\n  test('do next throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.tap(function () { throw error; });\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('do next completed next throws', function () {\n    var error = new Error();\n    var scheduler = new TestScheduler();\n    var xs = scheduler.createHotObservable(onNext(150, 1), onNext(210, 2), onCompleted(250));\n    var results = scheduler.startScheduler(function () {\n      return xs.tap(function () { throw error; }, null, noop);\n    });\n    results.messages.assertEqual(onError(210, error));\n  });\n\n  test('do next competed completed throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n        return xs.tap(noop, null, function () { throw error; });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onError(250, error)\n    );\n  });\n\n  test('do next error next throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.tap(function () { throw error; }, noop);\n    });\n\n    results.messages.assertEqual(onError(210, error));\n  });\n\n  test('do next error error throws', function () {\n    var error1 = new Error();\n    var error2 = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.tap(noop, function () { throw error2; });\n    });\n\n    results.messages.assertEqual(\n      onError(210, error2)\n    );\n  });\n\n  test('do next error completed next throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.tap(function () { throw error; }, noop, noop);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('do next error completed error throws', function () {\n    var error1 = new Error();\n    var error2 = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.tap(noop, function () { throw error2; }, noop);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error2)\n    );\n  });\n\n  test('do next error completed completed throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.tap(noop, noop, function () { throw error; });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onError(250, error)\n    );\n  });\n\n  test('do observer next throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.tap(Rx.Observer.create(function () { throw error;  }, noop, noop));\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('do observer error throws', function () {\n    var error1 = new Error();\n    var error2 = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.tap(Rx.Observer.create(noop, function () { throw error2; }, noop));\n    });\n\n    results.messages.assertEqual(\n      onError(210, error2)\n    );\n  });\n\n  test('do observer completed throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.tap(Rx.Observer.create(noop, noop, function () { throw error; }));\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onError(250, error)\n    );\n  });\n\n  test('doOnNext no thisArg', function () {\n    var scheduler = new TestScheduler();\n\n    var self = this, that;\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    scheduler.startScheduler(function () {\n      return xs.doOnNext(function () { that = this; });\n    });\n\n    notEqual(that, self);\n  });\n\n  test('doOnNext thisArg', function () {\n    var scheduler = new TestScheduler();\n\n    var self = 42, that;\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    scheduler.startScheduler(function () {\n      return xs.doOnNext(function () { that = this; }, self);\n    });\n\n    equal(that, self);\n  });\n\n  test('doOnError no thisArg', function () {\n    var scheduler = new TestScheduler();\n\n    var self = this, that;\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, new Error())\n    );\n\n    scheduler.startScheduler(function () {\n      return xs.doOnError(function () { that = this; });\n    });\n\n    notEqual(that, self);\n  });\n\n  test('doOnError thisArg', function () {\n    var scheduler = new TestScheduler();\n\n    var self = 42, that;\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, new Error())\n    );\n\n    scheduler.startScheduler(function () {\n      return xs.doOnError(function () { that = this; }, self);\n    });\n\n    equal(that, self);\n  });\n\n  test('doOnCompleted no thisArg', function () {\n    var scheduler = new TestScheduler();\n\n    var self = this, that;\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    scheduler.startScheduler(function () {\n      return xs.doOnCompleted(function () { that = this; });\n    });\n\n    notEqual(that, self);\n  });\n\n  test('doOnCompleted thisArg', function () {\n    var scheduler = new TestScheduler();\n\n    var self = 42, that;\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    scheduler.startScheduler(function () {\n      return xs.doOnCompleted(function () { that = this; }, self);\n    });\n\n    equal(that, self);\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/dowhile.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('doWhile');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe;\n\n  test('doWhile always false', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(50, 1),\n      onNext(100, 2),\n      onNext(150, 3),\n      onNext(200, 4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.doWhile(function () {\n        return false;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 1),\n      onNext(300, 2),\n      onNext(350, 3),\n      onNext(400, 4),\n      onCompleted(450)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450)\n    );\n  });\n\n  test('doWhile always true', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(50, 1),\n      onNext(100, 2),\n      onNext(150, 3),\n      onNext(200, 4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.doWhile(function () {\n        return true;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 1),\n      onNext(300, 2),\n      onNext(350, 3),\n      onNext(400, 4),\n      onNext(500, 1),\n      onNext(550, 2),\n      onNext(600, 3),\n      onNext(650, 4),\n      onNext(750, 1),\n      onNext(800, 2),\n      onNext(850, 3),\n      onNext(900, 4)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450),\n      subscribe(450, 700),\n      subscribe(700, 950),\n      subscribe(950, 1000)\n    );\n  });\n\n  test('doWhile always true throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onError(50, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.doWhile(function () {\n        return true;\n      });\n    });\n\n    results.messages.assertEqual(\n      onError(250, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n  });\n\n  test('doWhile always true infinite', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(50, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.doWhile(function () {\n        return true;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 1)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n  test('doWhile sometimes true', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(50, 1),\n      onNext(100, 2),\n      onNext(150, 3),\n      onNext(200, 4),\n      onCompleted(250)\n    );\n\n    var n = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.doWhile(function () {\n        return ++n < 3;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 1),\n      onNext(300, 2),\n      onNext(350, 3),\n      onNext(400, 4),\n      onNext(500, 1),\n      onNext(550, 2),\n      onNext(600, 3),\n      onNext(650, 4),\n      onNext(750, 1),\n      onNext(800, 2),\n      onNext(850, 3),\n      onNext(900, 4),\n      onCompleted(950)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450),\n      subscribe(450, 700),\n      subscribe(700, 950)\n    );\n  });\n\n  test('doWhile sometimes throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(50, 1),\n      onNext(100, 2),\n      onNext(150, 3),\n      onNext(200, 4),\n      onCompleted(250)\n    );\n\n    var n = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.doWhile(function () {\n        if (++n < 3) {\n          return true;\n        } else {\n          throw error;\n        }\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 1),\n      onNext(300, 2),\n      onNext(350, 3),\n      onNext(400, 4),\n      onNext(500, 1),\n      onNext(550, 2),\n      onNext(600, 3),\n      onNext(650, 4),\n      onNext(750, 1),\n      onNext(800, 2),\n      onNext(850, 3),\n      onNext(900, 4),\n      onError(950, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450),\n      subscribe(450, 700),\n      subscribe(700, 950)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/elementat.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('elementAt');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('elementAt First', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(280, 42),\n      onNext(360, 43),\n      onNext(470, 44),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.elementAt(0);\n    });\n\n    results.messages.assertEqual(\n      onNext(280, 42),\n      onCompleted(280)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 280)\n    );\n  });\n\n  test('elementAt Other', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(280, 42),\n      onNext(360, 43),\n      onNext(470, 44),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.elementAt(2);\n    });\n\n    results.messages.assertEqual(\n      onNext(470, 44),\n      onCompleted(470)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 470)\n    );\n  });\n\n  test('elementAt out of range', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(280, 42),\n      onNext(360, 43),\n      onNext(470, 44),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.elementAt(3);\n    });\n\n    results.messages.assertEqual(\n      onError(600, function (n) { return n.error instanceof Rx.ArgumentOutOfRangeError; })\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n  test('elementAt out of range default', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(280, 42),\n      onNext(360, 43),\n      onNext(470, 44),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.elementAt(3, 84);\n    });\n\n    results.messages.assertEqual(\n      onNext(600, 84),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/empty.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, raises */\n\n  QUnit.module('empty');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('empty basic', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.empty(scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(201));\n  });\n\n  test('empty disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.empty(scheduler);\n    }, { disposed: 200 });\n\n    results.messages.assertEqual();\n  });\n\n  function noop () { }\n\n  test('empty observer throws', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = Observable.empty(scheduler);\n\n    xs.subscribe(noop, noop, function () { throw new Error(); });\n\n    raises(function () {\n      scheduler.start();\n    });\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/every.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('every');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('every empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.every(function (x) { return x > 0; });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, true),\n      onCompleted(250)\n    );\n  });\n\n  test('every return', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.every(function (x) { return x > 0; });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, true),\n      onCompleted(250)\n    );\n  });\n\n  test('every return no match', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, -2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.every(function (x) { return x > 0; });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, false),\n      onCompleted(210)\n    );\n  });\n\n  test('every none match', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, -2),\n      onNext(220, -3),\n      onNext(230, -4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.every(function (x) { return x > 0; });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, false),\n      onCompleted(210)\n    );\n  });\n\n  test('every some match', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, -2),\n      onNext(220, 3),\n      onNext(230, -4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n        return xs.every(function (x) { return x > 0; });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, false),\n      onCompleted(210)\n    );\n  });\n\n  test('every all match', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.every(function (x) { return x > 0; });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, true),\n      onCompleted(250)\n    );\n  });\n\n  test('every throw', function () {\n    var error = new Error();\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.every(function (x) { return x > 0; });\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('every never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.every(function (x) { return x > 0; });\n    });\n\n    results.messages.assertEqual();\n  });\n}());\n"
  },
  {
    "path": "tests/observable/expand.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('Expand');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('expand empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onCompleted(300));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.expand(function () {\n        return scheduler.createColdObservable(\n          onNext(100, 1),\n          onNext(200, 2),\n          onCompleted(300));\n      }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(300));\n\n    xs.subscriptions.assertEqual(\n      subscribe(201, 300));\n  });\n\n  test('expand error', function () {\n    var scheduler = new TestScheduler();\n    var error = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onError(300, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.expand(function (x) {\n        return scheduler.createColdObservable(\n          onNext(100 + x, 2 * x),\n          onNext(200 + x, 3 * x),\n          onCompleted(300 + x));\n      }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(300, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(201, 300));\n  });\n\n  test('expand never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable();\n\n    var results = scheduler.startScheduler(function () {\n      return xs.expand(function (x) {\n        return scheduler.createColdObservable(\n          onNext(100 + x, 2 * x),\n          onNext(200 + x, 3 * x),\n          onCompleted(300 + x));\n      }, scheduler);\n    });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(201, 1000));\n  });\n\n  test('expand basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(550, 1),\n      onNext(850, 2),\n      onCompleted(950));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.expand(function (x) {\n        return scheduler.createColdObservable(\n          onNext(100, 2 * x),\n          onNext(200, 3 * x),\n          onCompleted(300));\n      }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(550, 1),\n      onNext(651, 2),\n      onNext(751, 3),\n      onNext(752, 4),\n      onNext(850, 2),\n      onNext(852, 6),\n      onNext(852, 6),\n      onNext(853, 8),\n      onNext(951, 4),\n      onNext(952, 9),\n      onNext(952, 12),\n      onNext(953, 12),\n      onNext(953, 12),\n      onNext(954, 16));\n\n    xs.subscriptions.assertEqual(\n      subscribe(201, 950));\n  });\n\n  test('expand throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(550, 1),\n      onNext(850, 2),\n      onCompleted(950));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.expand(function () {\n        throw error;\n      }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(550, 1),\n      onError(550, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(201, 550));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/finally.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal, raises, ok */\n\n  QUnit.module('finally');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe;\n\n  test('finally has orders of effects', function () {\n    var results = [];\n    function noop () {}\n\n    var someObservable = Rx.Observable.empty()['finally'](function () {\n      results.push('invoked');\n    });\n\n    someObservable.subscribe(noop, noop, function () {\n      results.push('completed');\n    });\n\n    equal(results[0], 'completed');\n    equal(results[1], 'invoked');\n  });\n\n  test('finally calls finally before throwing', function () {\n    var invoked = false;\n\n    var someObservable = Rx.Observable['throw'](new Error())['finally'](function () {\n      invoked = true;\n    });\n\n    raises(function () {\n      someObservable.subscribe();\n    });\n\n    ok(invoked);\n  });\n\n  test('finally only called once on empty', function () {\n    var invokeCount = 0;\n\n    var someObservable = Rx.Observable.empty()['finally'](function () {\n      invokeCount++;\n    });\n\n    var d = someObservable.subscribe();\n\n    d.dispose();\n    d.dispose();\n\n    equal(1, invokeCount);\n  });\n\n  test('finally called with empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var invoked = false;\n\n    var results = scheduler.startScheduler(function () {\n      return xs['finally'](function () {\n        invoked = true;\n      });\n    });\n\n    results.messages.assertEqual(\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n\n    ok(invoked);\n  });\n\n  test('finally called with single value', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var invoked = false;\n\n    var results = scheduler.startScheduler(function () {\n      return xs['finally'](function () {\n        invoked = true;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n\n    ok(invoked);\n  });\n\n  test('finally on throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(250, error)\n    );\n\n    var invoked = false;\n\n    var results = scheduler.startScheduler(function () {\n      return xs['finally'](function () {\n        invoked = true;\n      });\n    });\n\n    results.messages.assertEqual(\n      onError(250, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n\n    ok(invoked);\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/find.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('find');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('find never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n        onNext(150, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.find(function () { return true; });\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('find empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.find(function () { return true; });\n    });\n\n    results.messages.assertEqual(\n      onCompleted(210)\n    );\n  });\n\n  test('find single', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(220)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.find(function (x) { return x === 2; });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onCompleted(210)\n    );\n  });\n\n  test('find not found', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(220)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.find(function (x) { return x === 3; });\n    });\n\n    results.messages.assertEqual(\n      onCompleted(220)\n    );\n  });\n\n  test('find error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(220, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.find(function (x) { return x === 3; });\n    });\n\n    results.messages.assertEqual(\n      onError(220, error)\n    );\n  });\n\n  test('find throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(220)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.find(function () { throw error; });\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/findindex.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('findIndex');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('findIndex never', function () {\n    var scheduler = new TestScheduler();\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.findIndex(function () { return true; });\n    });\n\n    res.messages.assertEqual(\n    );\n  });\n\n  test('findIndex empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.findIndex(function () { return true; });\n    });\n\n    res.messages.assertEqual(\n      onNext(210, -1),\n      onCompleted(210)\n    );\n  });\n\n  test('findIndex single', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(220)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.findIndex(function (x) { return x === 2; });\n    });\n\n    res.messages.assertEqual(\n      onNext(210, 0),\n      onCompleted(210)\n    );\n  });\n\n  test('findIndex_NotFound', function () {\n      var scheduler = new TestScheduler();\n      var xs = scheduler.createHotObservable(\n          onNext(150, 1),\n          onNext(210, 2),\n          onCompleted(220)\n      );\n\n      var res = scheduler.startScheduler(function () {\n          return xs.findIndex(function (x) {\n              return x === 3;\n          });\n      });\n\n      res.messages.assertEqual(\n          onNext(220, -1),\n          onCompleted(220)\n      );\n  });\n\n  test('findIndex_Error', function () {\n      var error = new Error();\n      var scheduler = new TestScheduler();\n      var xs = scheduler.createHotObservable(\n          onNext(150, 1),\n          onNext(210, 2),\n          onError(220, error)\n      );\n\n      var res = scheduler.startScheduler(function () {\n          return xs.findIndex(function (x) {\n              return x === 3;\n          });\n      });\n\n      res.messages.assertEqual(\n          onError(220, error)\n      );\n  });\n\n  test('findIndex_Throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(220)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.findIndex(function () { throw error; });\n    });\n\n    res.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/first.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal */\n\n  QUnit.module('first');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe;\n\n  // First Async\n  test('first empty', function () {\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.first();\n    });\n\n    res.messages.assertEqual(\n      onError(250, function (n) { return n.error instanceof Rx.EmptyError; }));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n  });\n\n  test('first default', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var res = scheduler.startScheduler(\n      function () {\n        return xs.first({defaultValue: 42});\n      });\n\n    res.messages.assertEqual(\n      onNext(250, 42),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n  });\n\n  test('first one', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.first();\n    });\n\n    res.messages.assertEqual(\n      onNext(210, 2),\n      onCompleted(210));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 210));\n  });\n\n  test('first many', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onCompleted(250)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.first();\n    });\n\n    res.messages.assertEqual(onNext(210, 2), onCompleted(210));\n    xs.subscriptions.assertEqual(subscribe(200, 210));\n  });\n\n  test('first Error', function () {\n    var ex = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, ex)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.first();\n    });\n\n    res.messages.assertEqual(onError(210, ex));\n\n    xs.subscriptions.assertEqual(subscribe(200, 210));\n  });\n\n  test('first predicate', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.first(function (x) {\n        return x % 2 === 1;\n      });\n    });\n\n    res.messages.assertEqual(onNext(220, 3), onCompleted(220));\n\n    xs.subscriptions.assertEqual(subscribe(200, 220));\n  });\n\n  test('first Predicate Obj', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.first({\n        predicate: function (x) {\n          return x % 2 === 1;\n        }\n      });\n    });\n\n    res.messages.assertEqual(onNext(220, 3), onCompleted(220));\n\n    xs.subscriptions.assertEqual(subscribe(200, 220));\n  });\n\n  test('first Predicate thisArg', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.first(function (x) {\n        equal(this, 42);\n        return x % 2 === 1;\n      }, 42);\n    });\n\n    res.messages.assertEqual(onNext(220, 3), onCompleted(220));\n\n    xs.subscriptions.assertEqual(subscribe(200, 220));\n  });\n\n  test('first Predicate Obj thisArg', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.first({\n        predicate: function (x) {\n          equal(this, 42);\n          return x % 2 === 1;\n        },\n        thisArg: 42\n      });\n    });\n\n    res.messages.assertEqual(onNext(220, 3), onCompleted(220));\n\n    xs.subscriptions.assertEqual(subscribe(200, 220));\n  });\n\n  test('first Predicate None', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.first(function (x) {\n        return x > 10;\n      });\n    });\n\n    res.messages.assertEqual(\n      onError(250, function (n) { return n.error instanceof Rx.EmptyError; }));\n\n    xs.subscriptions.assertEqual(subscribe(200, 250));\n  });\n\n  test('first Predicate Obj None', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.first({\n        predicate: function (x) {\n          return x > 10;\n        }\n      });\n    });\n\n    res.messages.assertEqual(\n      onError(250, function (n) { return n.error instanceof Rx.EmptyError; }));\n\n    xs.subscriptions.assertEqual(subscribe(200, 250));\n  });\n\n  test('first Predicate Obj None Default', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.first({\n        predicate: function (x) {\n          return x > 10;\n        },\n        defaultValue: 42\n      });\n    });\n\n    res.messages.assertEqual(onNext(250, 42), onCompleted(250));\n\n    xs.subscriptions.assertEqual(subscribe(200, 250));\n  });\n\n  test('first Predicate Error', function () {\n    var ex = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(220, ex)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.first(function (x) {\n        return x % 2 === 1;\n      });\n    });\n\n    res.messages.assertEqual(onError(220, ex));\n\n    xs.subscriptions.assertEqual(subscribe(200, 220));\n  });\n\n  test('first PredicateThrows', function () {\n    var ex = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.first(function (x) {\n        if (x < 4) {\n          return false;\n        } else {\n          throw ex;\n        }\n      });\n    });\n\n    res.messages.assertEqual(onError(230, ex));\n\n    xs.subscriptions.assertEqual(subscribe(200, 230));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/for.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('for');\n\n  var Observable = Rx.Observable,\n    TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('for basic', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['for']([1, 2, 3], function (x) {\n        return scheduler.createColdObservable(\n          onNext(x * 100 + 10, x * 10 + 1),\n          onNext(x * 100 + 20, x * 10 + 2),\n          onNext(x * 100 + 30, x * 10 + 3),\n          onCompleted(x * 100 + 40)\n        );\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 11),\n      onNext(320, 12),\n      onNext(330, 13),\n      onNext(550, 21),\n      onNext(560, 22),\n      onNext(570, 23),\n      onNext(890, 31),\n      onNext(900, 32),\n      onNext(910, 33),\n      onCompleted(920)\n    );\n  });\n\n  test('for throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['for']([1, 2, 3], function () {\n        throw error;\n      });\n    });\n    results.messages.assertEqual(\n      onError(200, error)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/forkjoin.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('forkJoin');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  function add(x, y) { return x + y; }\n\n  test('forkJoin n-ary parameters', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onNext(225, 4),\n      onCompleted(230));\n\n    var o2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(235, 6),\n      onNext(240, 7),\n      onCompleted(250)\n    );\n\n    var o3 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(230, 3),\n      onNext(245, 5),\n      onCompleted(270)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.forkJoin(o1, o2, o3);\n    });\n\n    results.messages.assertEqual(\n      onNext(270, [4,7,5]),\n      onCompleted(270)\n    );\n  });\n\n  test('forkJoin n-ary parameters empty', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onNext(225, 4),\n      onCompleted(230));\n\n    var o2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(235, 6),\n      onNext(240, 7),\n      onCompleted(250));\n\n    var o3 = scheduler.createHotObservable(\n      onCompleted(270)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.forkJoin(o1, o2, o3);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(270)\n    );\n  });\n\n  test('forkJoin n-ary parameters empty before end', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onNext(225, 4),\n      onCompleted(230));\n\n    var o2 = scheduler.createHotObservable(\n      onCompleted(235)\n    );\n\n    var o3 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(230, 3),\n      onNext(245, 5),\n      onCompleted(270));\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.forkJoin(o1, o2, o3);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(235)\n    );\n  });\n\n  test('forkJoin empty empty', function () {\n    var scheduler = new TestScheduler();\n\n    var o = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(230)\n    );\n\n    var e = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e.forkJoin(o, add);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(230)\n    );\n  });\n\n  test('forkJoin none', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.forkJoin();\n    });\n\n    results.messages.assertEqual(\n      onCompleted(200)\n    );\n  });\n\n  test('forkJoin empty return', function () {\n    var scheduler = new TestScheduler();\n\n    var o = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(230));\n\n    var e = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return e.forkJoin(o, add);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(230)\n    );\n  });\n\n  test('forkJoin return empty', function () {\n    var scheduler = new TestScheduler();\n\n    var o = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(230));\n\n    var e = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return e.forkJoin(o, add);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(250)\n    );\n  });\n\n  test('forkJoin return return', function () {\n    var scheduler = new TestScheduler();\n\n    var o = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(230));\n\n    var e = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 3),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return e.forkJoin(o, add);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 2 + 3),\n      onCompleted(250)\n    );\n  });\n\n  test('forkJoin empty throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var o = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(230));\n\n    var e = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e.forkJoin(o, add);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('forkJoin throw empty', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var o = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error),\n      onCompleted(230)\n    );\n\n    var e = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e.forkJoin(o, add);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('forkJoin return throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var o = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(230)\n    );\n\n    var e = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e.forkJoin(o, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error)\n    );\n  });\n\n  test('forkJoin throw return', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var o = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error),\n      onCompleted(230)\n    );\n\n    var e = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e.forkJoin(o, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error)\n    );\n  });\n\n  test('forkJoin binary', function () {\n    var scheduler = new TestScheduler();\n\n    var o = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onNext(225, 4),\n      onCompleted(230)\n    );\n\n    var e = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(235, 6),\n      onNext(240, 7),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e.forkJoin(o, add);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 4 + 7),\n      onCompleted(250));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/from.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, Map, Set, Symbol, window, equal */\n\n  QUnit.module('from');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('from Array', function () {\n    var enumerableFinite = [1, 2, 3, 4, 5];\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.from(enumerableFinite, null, null, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 1),\n      onNext(202, 2),\n      onNext(203, 3),\n      onNext(204, 4),\n      onNext(205, 5),\n      onCompleted(206)\n    );\n  });\n\n  test('from Array Empty', function () {\n    var enumerableFinite = [];\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.from(enumerableFinite, null, null, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(201)\n    );\n  });\n\n  test('from With Length', function () {\n    var enumerableFinite = { length: 5 };\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.from(enumerableFinite, function (v, k) { return k; }, null, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 0),\n      onNext(202, 1),\n      onNext(203, 2),\n      onNext(204, 3),\n      onNext(205, 4),\n      onCompleted(206)\n    );\n  });\n\n  test('from With String', function () {\n    var enumerableFinite = 'foo';\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.from(enumerableFinite, null, null, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 'f'),\n      onNext(202, 'o'),\n      onNext(203, 'o'),\n      onCompleted(204)\n    );\n  });\n\n  test('from With Selector', function () {\n    var enumerableFinite = [1,2,3];\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.from(enumerableFinite, function (x) { return x + x; }, null, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 2),\n      onNext(202, 4),\n      onNext(203, 6),\n      onCompleted(204)\n    );\n  });\n\n  test('from With Selector Error', function () {\n    var enumerableFinite = [1,2,3];\n    var error = new Error('woops');\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.from(enumerableFinite, function () { throw error; }, null, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(201, error)\n    );\n  });\n\n  test('from With Selector Some Error', function () {\n    var enumerableFinite = [1,2,3];\n    var error = new Error('woops');\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.from(enumerableFinite, function (x, i) {\n        if (i > 1) { throw error; }\n        return x + x;\n      }, null, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 2),\n      onNext(202, 4),\n      onError(203, error)\n    );\n  });\n\n  test('from With Selector And Context', function () {\n    var enumerableFinite = [1,2,3];\n    var context = 42;\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.from(enumerableFinite, function (x) {\n        equal(this, context);\n        return x + x;\n      }, context, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 2),\n      onNext(202, 4),\n      onNext(203, 6),\n      onCompleted(204)\n    );\n  });\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (window.Set && typeof new window.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  // Check for Map\n  if (!!window.Map && new window.Map()[$iterator$] !== undefined) {\n    test('from With Map', function () {\n      var enumerableFinite = new Map([[1, 2], [2, 4], [4, 8]]);\n\n      var scheduler = new TestScheduler();\n\n      var results = scheduler.startScheduler(function () {\n        return Observable.from(enumerableFinite, null, null, scheduler);\n      });\n\n      results.messages.assertEqual(\n        onNext(201, [1,2]),\n        onNext(202, [2,4]),\n        onNext(203, [4,8]),\n        onCompleted(204)\n      );\n    });\n  }\n\n  if (!!window.Set && new window.Set()[$iterator$] !== undefined) {\n    test('from With Set', function () {\n      var enumerableFinite = new Set(['foo','bar','baz']);\n\n      var scheduler = new TestScheduler();\n\n      var results = scheduler.startScheduler(function () {\n        return Observable.from(enumerableFinite, null, null, scheduler);\n      });\n\n      results.messages.assertEqual(\n        onNext(201, 'foo'),\n        onNext(202, 'bar'),\n        onNext(203, 'baz'),\n        onCompleted(204)\n      );\n    });\n  }\n\n}());\n"
  },
  {
    "path": "tests/observable/fromarray.js",
    "content": "(function () {\n\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('fromArray');\n\n  var Observable = Rx.Observable,\n    TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('fromArray normal', function () {\n    var array = [1, 2, 3, 4, 5];\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.fromArray(array, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 1),\n      onNext(202, 2),\n      onNext(203, 3),\n      onNext(204, 4),\n      onNext(205, 5),\n      onCompleted(206)\n    );\n  });\n\n  test('fromArray empty', function () {\n    var array = [];\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.fromArray(array, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(201)\n    );\n  });\n\n  test('fromArray one', function () {\n    var array = [1];\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.fromArray(array, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 1),\n      onCompleted(202)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/fromcallback.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal, ok */\n\n  QUnit.module('fromCallback');\n\n  var Observable = Rx.Observable;\n\n  test('fromCallback', function () {\n    var res = Observable.fromCallback(function (cb) {\n      cb(true);\n    })();\n\n    res.subscribe(\n      function (r) {\n        equal(r, true);\n      },\n      function () {\n        ok(false);\n      },\n      function () {\n        ok(true);\n      });\n  });\n\n  test('fromCallback single argument', function () {\n    var res = Observable.fromCallback(function (file, cb) {\n      cb(file);\n    })('file.txt');\n\n    res.subscribe(\n      function (r) {\n        equal(r, 'file.txt');\n      },\n      function () {\n        ok(false);\n      },\n      function () {\n        ok(true);\n      });\n  });\n\n  test('fromCallback selector', function () {\n    var res = Observable.fromCallback(\n      function (f,s,t,cb) {\n        cb(f,s,t);\n      },\n      null,\n      function (f) {\n        return f;\n      })(1,2,3);\n\n    res.subscribe(\n      function (r) {\n        equal(r, 1);\n      },\n      function () {\n        ok(false);\n      },\n      function () {\n        ok(true);\n      });\n  });\n\n  test('fromCallback context', function () {\n    var res = Observable.fromCallback(\n      function (cb) {\n        equal(this, 42);\n        cb(true);\n      },\n      42)();\n\n    res.subscribe(\n      function () {\n        ok(true);\n      },\n      function () {\n        ok(false);\n      },\n      function () {\n        ok(true);\n      });\n  });\n\n  test('fromCallback resubscribe', function() {\n\n    var count = 0;\n\n    var res = Observable.fromCallback(\n        function(cb) {\n          cb(++count);\n        })();\n\n    var observer = Rx.Observer.create(\n        function () {\n          ok(1);\n        }, function () {\n          ok(false);\n        }, function () {\n          ok(true);\n        });\n\n\n    res.subscribe(observer);\n\n    res.subscribe(function () {\n      ok(1);\n    }, function () {\n      ok(false);\n    }, function () {\n      ok(true);\n    });\n\n    equal(1, count);\n\n  });\n}());\n"
  },
  {
    "path": "tests/observable/fromevent.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal */\n  var Observable = Rx.Observable,\n    slice = Array.prototype.slice,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError;\n\n  QUnit.module('FromEvent', {\n    setup : function() {\n      this.scheduler = new Rx.TestScheduler();\n    }\n  });\n\n  /** Fake DOM Element */\n  function FakeDOMStandardElement(nodeName) {\n    this.listeners = {};\n    this.nodeName = nodeName;\n    this.addEventListenerCalled = false;\n    this.removeEventListenerCalled = false;\n  }\n\n  FakeDOMStandardElement.prototype.addEventListener = function (eventName, handler, useCapture) {\n    this.listeners[eventName] = handler;\n    this.addEventListenerCalled = true;\n  };\n\n  FakeDOMStandardElement.prototype.removeEventListener = function (eventName, handler, useCapture) {\n    delete this.listeners[eventName];\n    this.removeEventListenerCalled = true;\n  };\n\n  FakeDOMStandardElement.prototype.trigger = function (eventName) {\n    var args = slice.call(arguments, 1);\n    if (eventName in this.listeners) {\n      this.listeners[eventName].apply(null, args);\n    }\n  };\n\n  test('Event DOM Element', function () {\n    var element = new FakeDOMStandardElement('foo');\n\n    this.scheduler.scheduleFuture(null, 210, function() {\n      equal(element.addEventListenerCalled, true);\n      equal(element.removeEventListenerCalled, false);\n    });\n\n    this.scheduler.scheduleFuture(null, 220, function() {\n      element.trigger('someEvent', 42);\n    });\n\n    var result = this.scheduler.startScheduler(function() {\n      return Observable.fromEvent(element, 'someEvent');\n    });\n\n    result.messages.assertEqual(onNext(220, 42));\n\n    equal(element.removeEventListenerCalled, true);\n  });\n\n  test('Event DOM Element selector', function () {\n    var element = new FakeDOMStandardElement('foo');\n\n    this.scheduler.scheduleFuture(null, 210, function() {\n      equal(element.addEventListenerCalled, true);\n      equal(element.removeEventListenerCalled, false);\n    });\n\n    this.scheduler.scheduleFuture(null, 220, function() {\n      element.trigger('someEvent', 'baz', 'quux');\n    });\n\n    var result = this.scheduler.startScheduler(function() {\n      return Observable.fromEvent(\n        element,\n        'someEvent',\n        function (baz, quux) {\n          return { foo: baz, bar: quux };\n        }\n      );\n    });\n\n    result.messages.assertEqual(\n      onNext(220, {foo: 'baz', bar: 'quux'})\n    );\n\n    equal(element.removeEventListenerCalled, true);\n  });\n\n  test('Event DOM Element selector throws', function () {\n    var error = new Error();\n\n    var element = new FakeDOMStandardElement('foo');\n\n    this.scheduler.scheduleFuture(null, 210, function() {\n      equal(element.addEventListenerCalled, true);\n      equal(element.removeEventListenerCalled, false);\n    });\n\n    this.scheduler.scheduleFuture(null, 220, function() {\n      element.trigger('someEvent', 'baz', 'quux');\n    });\n\n    var result = this.scheduler.startScheduler(function() {\n      return Observable.fromEvent(\n        element,\n        'someEvent',\n        function () {\n          throw error;\n        }\n      );\n    });\n\n    result.messages.assertEqual(\n      onError(220, error)\n    );\n\n    equal(element.removeEventListenerCalled, true);\n  });\n\n  /** Fake Node EventEmitter */\n  function FakeEventEmitter() {\n    this.listeners = {};\n    this.addListenerCalled = false;\n    this.removeListenerCalled = false;\n  }\n\n  FakeEventEmitter.prototype.addListener = function (eventName, handler, useCapture) {\n    this.listeners[eventName] = handler;\n    this.addListenerCalled = true;\n  };\n\n  FakeEventEmitter.prototype.removeListener = function (eventName, handler, useCapture) {\n    delete this.listeners[eventName];\n    this.removeListenerCalled = true;\n  };\n\n  FakeEventEmitter.prototype.emit = function (eventName, eventData) {\n    var args = slice.call(arguments, 1);\n    if (eventName in this.listeners) {\n      this.listeners[eventName].apply(null, args);\n    }\n  };\n\n  test('Event EventEmitter', function () {\n    var element = new FakeEventEmitter();\n\n    this.scheduler.scheduleFuture(null, 210, function() {\n      equal(element.addListenerCalled, true);\n      equal(element.removeListenerCalled, false);\n    });\n\n    this.scheduler.scheduleFuture(null, 220, function() {\n      element.emit('someEvent', 42);\n    });\n\n    var result = this.scheduler.startScheduler(function() {\n      return Observable.fromEvent(element, 'someEvent');\n    });\n\n    result.messages.assertEqual(onNext(220, 42));\n    equal(element.removeListenerCalled, true);\n  });\n\n  test('Event EventEmitter selector', function () {\n    var element = new FakeEventEmitter();\n\n    this.scheduler.scheduleFuture(null, 210, function() {\n      equal(element.addListenerCalled, true);\n      equal(element.removeListenerCalled, false);\n    });\n\n    this.scheduler.scheduleFuture(null, 220, function() {\n      element.emit('someEvent', 'baz', 'quux');\n    });\n\n    var result = this.scheduler.startScheduler(function() {\n      return Observable.fromEvent(\n        element,\n        'someEvent',\n        function (baz, quux) {\n          return { foo: baz, bar: quux };\n        }\n      );\n    });\n\n    result.messages.assertEqual(\n      onNext(220, {foo: 'baz', bar: 'quux'})\n    );\n\n    equal(element.removeListenerCalled, true);\n  });\n\n  test('Event EventEmitter selector throws', function () {\n    var error = new Error();\n\n    var element = new FakeEventEmitter();\n\n    this.scheduler.scheduleFuture(null, 210, function() {\n      equal(element.addListenerCalled, true);\n      equal(element.removeListenerCalled, false);\n    });\n\n    this.scheduler.scheduleFuture(null, 220, function() {\n      element.emit('someEvent', 'baz', 'quux');\n    });\n\n    var result = this.scheduler.startScheduler(function() {\n      return Observable.fromEvent(\n        element,\n        'someEvent',\n        function () {\n          throw error;\n        }\n      );\n    });\n\n    result.messages.assertEqual(\n      onError(220, error)\n    );\n\n    equal(element.removeListenerCalled, true);\n  });\n\n  /** Fake jQuery/Angular/Ember Element */\n  function FakeJQueryElement(nodeName) {\n    this.listeners = {};\n    this.nodeName = nodeName;\n    this.onCalled = false;\n    this.offCalled = false;\n  }\n\n  FakeJQueryElement.prototype.on = function (eventName, handler) {\n    this.listeners[eventName] = handler;\n    this.onCalled = true;\n  };\n\n  FakeJQueryElement.prototype.off = function (eventName, handler) {\n    delete this.listeners[eventName];\n    this.offCalled = true;\n  };\n\n  FakeJQueryElement.prototype.trigger = function (eventName) {\n    var args = slice.call(arguments, 1);\n    if (eventName in this.listeners) {\n      this.listeners[eventName].apply(null, args);\n    }\n  };\n\n  test('Event jQuery/Angular/Ember Element', function () {\n    var element = new FakeJQueryElement('foo');\n\n    this.scheduler.scheduleFuture(null, 210, function(){\n      equal(element.onCalled, true);\n      equal(element.offCalled, false);\n    });\n\n    this.scheduler.scheduleFuture(null, 220, function() {\n      element.trigger('someEvent', 42);\n    });\n\n    var result = this.scheduler.startScheduler(function() {\n      return Observable.fromEvent(element, 'someEvent');\n    });\n\n    result.messages.assertEqual(\n      onNext(220, 42)\n    );\n\n    equal(element.offCalled, true);\n  });\n\n  test('Event jQuery/Angular/Ember Element selector', function () {\n    var element = new FakeJQueryElement('foo');\n\n    this.scheduler.scheduleFuture(null, 210, function(){\n      equal(element.onCalled, true);\n      equal(element.offCalled, false);\n    });\n\n    this.scheduler.scheduleFuture(null, 220, function() {\n      element.trigger('someEvent', 'baz', 'quux');\n    });\n\n    var result = this.scheduler.startScheduler(function(){\n      return Observable.fromEvent(\n        element,\n        'someEvent',\n        function (baz, quux) {\n          return { foo: baz, bar: quux };\n        }\n      );\n    });\n\n    result.messages.assertEqual(\n      onNext(220, {foo: 'baz', bar: 'quux'})\n    );\n\n    equal(element.offCalled, true);\n  });\n\n  test('Event jQuery/Angular/Ember Element selector throws', function () {\n    var error = new Error();\n\n    var element = new FakeJQueryElement('foo');\n\n    this.scheduler.scheduleFuture(null, 210, function(){\n      equal(element.onCalled, true);\n      equal(element.offCalled, false);\n    });\n\n    this.scheduler.scheduleFuture(null, 220, function() {\n      element.trigger('someEvent', 'baz', 'quux');\n    });\n\n    var result = this.scheduler.startScheduler(function(){\n      return Observable.fromEvent(\n        element,\n        'someEvent',\n        function () {\n          throw error;\n        }\n      );\n    });\n\n    result.messages.assertEqual(\n      onError(220, error)\n    );\n\n    equal(element.offCalled, true);\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/fromeventpattern.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal */\n  var Observable = Rx.Observable,\n    slice = Array.prototype.slice,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError;\n\n  QUnit.module('fromEventPattern', {\n    setup : function() {\n      this.scheduler = new Rx.TestScheduler();\n    }\n  });\n\n  function FakeDojoElement(nodeName) {\n    this.listeners = {};\n    this.nodeName = nodeName;\n    this.onCalled = false;\n    this.offCalled = false;\n  }\n\n  FakeDojoElement.prototype.on = function (eventName, handler) {\n    this.listeners[eventName] = handler;\n    this.onCalled = true;\n    return new FakeDojoDisposable(this, eventName);\n  };\n\n  FakeDojoElement.prototype.trigger = function (eventName) {\n    var args = slice.call(arguments, 1);\n    if (eventName in this.listeners) {\n      this.listeners[eventName].apply(null, args);\n    }\n  };\n\n  function FakeDojoDisposable(parent, eventName) {\n    this.parent = parent;\n    this.eventName = eventName;\n  }\n\n  FakeDojoDisposable.prototype.disconnect = function () {\n    delete this.parent.listeners[this.eventName];\n    this.parent.offCalled = true;\n  };\n\n  test('fromEventPattern with return from add handler', function () {\n    var element = new FakeDojoElement('foo');\n\n    this.scheduler.scheduleFuture(null, 210, function() {\n      equal(element.onCalled, true);\n      equal(element.offCalled, false);\n    });\n\n    this.scheduler.scheduleFuture(null, 220, function() {\n      element.trigger('someEvent', 42);\n    });\n\n    var result = this.scheduler.startScheduler(function() {\n      return Observable.fromEventPattern(\n        function (h) { return element.on('someEvent', h); },\n        function (_, d) { d.disconnect(); }\n      );\n    });\n\n    result.messages.assertEqual(onNext(220, 42));\n\n    equal(element.offCalled, true);\n  });\n\n\n  /** Fake DOM Element */\n  function FakeDOMStandardElement(nodeName) {\n    this.listeners = {};\n    this.nodeName = nodeName;\n    this.addEventListenerCalled = false;\n    this.removeEventListenerCalled = false;\n  }\n\n  FakeDOMStandardElement.prototype.addEventListener = function (eventName, handler, useCapture) {\n    this.listeners[eventName] = handler;\n    this.addEventListenerCalled = true;\n  };\n\n  FakeDOMStandardElement.prototype.removeEventListener = function (eventName, handler, useCapture) {\n    delete this.listeners[eventName];\n    this.removeEventListenerCalled = true;\n  };\n\n  FakeDOMStandardElement.prototype.trigger = function (eventName) {\n    var args = slice.call(arguments, 1);\n    if (eventName in this.listeners) {\n      this.listeners[eventName].apply(null, args);\n    }\n  };\n\n  test('fromEventPattern', function () {\n    var element = new FakeDOMStandardElement('foo');\n\n    this.scheduler.scheduleFuture(null, 210, function() {\n      equal(element.addEventListenerCalled, true);\n      equal(element.removeEventListenerCalled, false);\n    });\n\n    this.scheduler.scheduleFuture(null, 220, function() {\n      element.trigger('someEvent', 42);\n    });\n\n    var result = this.scheduler.startScheduler(function() {\n      return Observable.fromEventPattern(\n        function (h) { element.addEventListener('someEvent', h); },\n        function (h) { element.removeEventListener('someEvent', h); }\n      );\n    });\n\n    result.messages.assertEqual(onNext(220, 42));\n\n    equal(element.removeEventListenerCalled, true);\n  });\n\n  test('fromEventPattern selector', function () {\n    var element = new FakeDOMStandardElement('foo');\n\n    this.scheduler.scheduleFuture(null, 210, function() {\n      equal(element.addEventListenerCalled, true);\n      equal(element.removeEventListenerCalled, false);\n    });\n\n    this.scheduler.scheduleFuture(null, 220, function() {\n      element.trigger('someEvent', 'baz', 'quux');\n    });\n\n    var result = this.scheduler.startScheduler(function() {\n      return Observable.fromEventPattern(\n        function (h) { element.addEventListener('someEvent', h); },\n        function (h) { element.removeEventListener('someEvent', h); },\n        function (baz, quux) {\n          return { foo: baz, bar: quux };\n        }\n      );\n    });\n\n    result.messages.assertEqual(\n      onNext(220, {foo: 'baz', bar: 'quux'})\n    );\n\n    equal(element.removeEventListenerCalled, true);\n  });\n\n  test('fromEventPattern selector throws', function () {\n    var error = new Error();\n\n    var element = new FakeDOMStandardElement('foo');\n\n    this.scheduler.scheduleFuture(null, 210, function() {\n      equal(element.addEventListenerCalled, true);\n      equal(element.removeEventListenerCalled, false);\n    });\n\n    this.scheduler.scheduleFuture(null, 220, function() {\n      element.trigger('someEvent', 'baz', 'quux');\n    });\n\n    var result = this.scheduler.startScheduler(function() {\n      return Observable.fromEventPattern(\n        function (h) { element.addEventListener('someEvent', h); },\n        function (h) { element.removeEventListener('someEvent', h); },\n        function () {\n          throw error;\n        }\n      );\n    });\n\n    result.messages.assertEqual(\n      onError(220, error)\n    );\n\n    equal(element.removeEventListenerCalled, true);\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/fromnodecallback.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal, ok */\n\n  QUnit.module('FromNodeCallback');\n\n  var Observable = Rx.Observable;\n\n  test('FromNodeCallback', function () {\n    var res = Observable.fromNodeCallback(function (cb) {\n      cb(null);\n    })();\n\n    res.subscribe(function () {\n      ok(true);\n    });\n  });\n\n  test('fromNodeCallback Single', function () {\n    var res = Observable.fromNodeCallback(function (file, cb) {\n      cb(null, file);\n    })('foo');\n\n    res.subscribe(\n      function (r) {\n        equal(r, 'foo');\n      },\n      function () {\n        ok(false);\n      },\n      function () {\n        ok(true);\n      });\n  });\n\n  test('fromNodeCallback Selector', function () {\n    var res = Observable.fromNodeCallback(\n      function (f,s,t,cb) {\n        cb(null, f,s,t);\n      },\n      null,\n      function (f) {\n        return f;\n      })(1,2,3);\n\n    res.subscribe(\n      function (r) {\n        equal(r, 1);\n      },\n      function () {\n        ok(false);\n      },\n      function () {\n        ok(true);\n      });\n  });\n\n  test('fromNodeCallback Context', function () {\n    var res = Observable.fromNodeCallback(\n      function (cb) {\n        equal(this, 42);\n        cb(null);\n      },\n      42)();\n\n    res.subscribe(\n      function () {\n        ok(true);\n      },\n      function () {\n        ok(false);\n      },\n      function () {\n        ok(true);\n      });\n  });\n\n  test('fromNodeCallback Error', function () {\n    var error = new Error();\n\n    var res = Observable.fromNodeCallback(function (cb) {\n      cb(error);\n    })();\n\n    res.subscribe(\n      function () {\n        ok(false);\n      },\n      function (err) {\n        equal(err, error);\n      },\n      function () {\n        ok(false);\n      });\n  });\n\n  test('FromCallback_Resubscribe', function() {\n\n    var count = 0;\n\n    var res = Observable.fromNodeCallback(\n        function(cb) {\n          cb(null, ++count);\n        })();\n\n    var observer = Rx.Observer.create(\n        function () {\n          ok(1);\n        }, function () {\n          ok(false);\n        }, function () {\n          ok(true);\n        });\n\n\n    res.subscribe(observer);\n\n    res.subscribe(function () {\n      ok(1);\n    }, function () {\n      ok(false);\n    }, function () {\n      ok(true);\n    });\n\n    equal(1, count);\n\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/frompromise.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal, ok, asyncTest, start, RSVP */\n\n  QUnit.module('fromPromise');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('FromPromise Success Factory Mock', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createResolvedPromise(201, 1);\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.fromPromise(function () { return xs; }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(202, 1),\n      onCompleted(202)\n    );\n  });\n\n  test('fromPromise Failure Mock', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createRejectedPromise(201, error);\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.fromPromise(function () { return xs; }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(202, error)\n    );\n  });\n\n  test('fromPromise Failure Factory throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.fromPromise(function () { throw error; }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(200, error)\n    );\n  });\n\n  test('FromPromise Success Mock', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createResolvedPromise(201, 1);\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.fromPromise(xs, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(202, 1),\n      onCompleted(202)\n    );\n  });\n\n  test('fromPromise Failure Mock', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createRejectedPromise(201, error);\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.fromPromise(xs, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(202, error)\n    );\n  });\n\n  asyncTest('fromPromise Success', function () {\n    var promise = new RSVP.Promise(function (resolve) {\n      resolve(42);\n    });\n\n    var source = Observable.fromPromise(promise);\n\n    source.subscribe(\n      function (x) {\n        equal(42, x);\n      },\n      function () {\n        ok(false);\n      },\n      function () {\n        ok(true);\n        start();\n      });\n  });\n\n  asyncTest('promise Failure', function () {\n    var error = new Error('woops');\n\n    var promise = new RSVP.Promise(function (resolve, reject) {\n      reject(error);\n    });\n\n    var source = Observable.fromPromise(promise);\n\n    source.subscribe(\n      function () {\n        ok(false);\n      },\n      function (err) {\n        equal(err, error);\n        start();\n      },\n      function () {\n        ok(false);\n      });\n  });\n}());\n"
  },
  {
    "path": "tests/observable/generate.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('generate');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('generate finite', function () {\n      var scheduler = new TestScheduler();\n\n      var results = scheduler.startScheduler(function () {\n        return Observable.generate(0, function (x) {\n          return x <= 3;\n        }, function (x) {\n          return x + 1;\n        }, function (x) {\n          return x;\n        }, scheduler);\n      });\n\n      results.messages.assertEqual(\n        onNext(201, 0),\n        onNext(202, 1),\n        onNext(203, 2),\n        onNext(204, 3),\n        onCompleted(205)\n      );\n  });\n\n  test('generate throw condition', function () {\n    var scheduler = new TestScheduler();\n\n    var error = new Error();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.generate(0, function () {\n        throw error;\n      }, function (x) {\n        return x + 1;\n      }, function (x) {\n        return x;\n      }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(201, error));\n  });\n\n  test('generate throw result selector', function () {\n    var scheduler = new TestScheduler();\n\n    var error = new Error();\n\n    var results = scheduler.startScheduler(function () {\n        return Observable.generate(0, function () {\n          return true;\n        }, function (x) {\n          return x + 1;\n        }, function () {\n          throw error;\n        }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(201, error));\n  });\n\n  test('generate throw iterate', function () {\n    var scheduler = new TestScheduler();\n\n    var error = new Error();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.generate(0, function () {\n        return true;\n      }, function () {\n        throw error;\n      }, function (x) {\n        return x;\n      }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 0),\n      onError(202, error)\n    );\n  });\n\n  test('generate dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.generate(0, function () {\n        return true;\n      }, function (x) {\n        return x + 1;\n      }, function (x) {\n        return x;\n      }, scheduler);\n    }, {disposed: 203 });\n\n    results.messages.assertEqual(\n      onNext(201, 0),\n      onNext(202, 1));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/generatewithabsolutetime.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('generateWithAbsoluteTime');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('generateWithAbsoluteTime absolute time finite', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n        return Observable.generateWithAbsoluteTime(0, function (x) {\n            return x <= 3;\n        }, function (x) {\n            return x + 1;\n        }, function (x) {\n            return x;\n        }, function (x) {\n            return new Date(scheduler.now() + x + 1);\n        }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(202, 0),\n      onNext(204, 1),\n      onNext(207, 2),\n      onNext(211, 3),\n      onCompleted(211));\n  });\n\n  test('generateWithAbsoluteTime absolute time throw condition', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.generateWithAbsoluteTime(0, function () {\n        throw error;\n      }, function (x) {\n        return x + 1;\n      }, function (x) {\n        return x;\n      }, function (x) {\n        return new Date(scheduler.now() + x + 1);\n      }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(201, error));\n  });\n\n  test('generateWithAbsoluteTime absolute time throw result selector', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.generateWithAbsoluteTime(0, function () {\n        return true;\n      }, function (x) {\n        return x + 1;\n      }, function () {\n        throw error;\n      }, function (x) {\n        return new Date(scheduler.now() + x + 1);\n      }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(201, error));\n  });\n\n  test('generateWithAbsoluteTime absolute time throw iterate', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n        return Observable.generateWithAbsoluteTime(0, function () {\n            return true;\n        }, function () {\n            throw error;\n        }, function (x) {\n            return x;\n        }, function (x) {\n            return new Date(scheduler.now() + x + 1);\n        }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(202, 0),\n      onError(202, error));\n  });\n\n  test('generateWithAbsoluteTime absolute time throw time selector', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n        return Observable.generateWithAbsoluteTime(0, function () {\n          return true;\n        }, function (x) {\n          return x + 1;\n        }, function (x) {\n          return x;\n        }, function () {\n          throw error;\n        }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(201, error));\n  });\n\n  test('generateWithAbsoluteTime absolute time dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n        return Observable.generateWithAbsoluteTime(0, function () {\n          return true;\n        }, function (x) {\n          return x + 1;\n        }, function (x) {\n          return x;\n        }, function (x) {\n          return new Date(scheduler.now() + x + 1);\n        }, scheduler);\n    }, { disposed: 210 });\n\n    results.messages.assertEqual(\n      onNext(202, 0),\n      onNext(204, 1),\n      onNext(207, 2));\n  });\n\n  test('generateWithAbsoluteTime resultSelection', function() {\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.generateWithAbsoluteTime(0, function(x) {\n        return x < 3;\n      }, function(x) {\n        return x + 1;\n      }, function(x) {\n        return 2 * x + 1;\n      }, function(x) {\n        return 10 * x;\n      }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(202, 1),\n      onNext(212, 3),\n      onNext(232, 5),\n      onCompleted(232)\n    );\n\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/generatewithrelativetime.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('generateWithRelativeTime');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('generateWithRelativeTime finite', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.generateWithRelativeTime(0, function (x) {\n        return x <= 3;\n      }, function (x) {\n        return x + 1;\n      }, function (x) {\n        return x;\n      }, function (x) {\n        return x + 1;\n      }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(202, 0),\n      onNext(204, 1),\n      onNext(207, 2),\n      onNext(211, 3),\n      onCompleted(211));\n  });\n\n  test('generateWithRelativeTime throw condition', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.generateWithRelativeTime(0, function () {\n        throw error;\n      }, function (x) {\n        return x + 1;\n      }, function (x) {\n        return x;\n      }, function (x) {\n        return x + 1;\n      }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(201, error));\n  });\n\n  test('generateWithRelativeTime throw result selector', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.generateWithRelativeTime(0, function () {\n        return true;\n      }, function (x) {\n        return x + 1;\n      }, function () {\n        throw error;\n      }, function (x) {\n        return x + 1;\n      }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(201, error));\n  });\n\n  test('generateWithRelativeTime throw iterate', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n        return Observable.generateWithRelativeTime(0, function () {\n            return true;\n        }, function () {\n            throw error;\n        }, function (x) {\n            return x;\n        }, function (x) {\n            return x + 1;\n        }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(202, 0),\n      onError(202, error));\n  });\n\n  test('generateWithRelativeTime throw time selector', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.generateWithRelativeTime(0, function () {\n        return true;\n      }, function (x) {\n        return x + 1;\n      }, function (x) {\n        return x;\n      }, function () {\n        throw error;\n      }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(201, error));\n  });\n\n  test('generateWithRelativeTime dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n        return Observable.generateWithRelativeTime(0, function () {\n          return true;\n        }, function (x) {\n          return x + 1;\n        }, function (x) {\n          return x;\n        }, function (x) {\n          return x + 1;\n        }, scheduler);\n    }, { disposed: 210 });\n\n    results.messages.assertEqual(\n      onNext(202, 0),\n      onNext(204, 1),\n      onNext(207, 2));\n  });\n\n  test('generateWithRelativeTime resultSelection', function() {\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.generateWithRelativeTime(0, function(x) {\n        return x < 3;\n      }, function(x) {\n        return x + 1;\n      }, function(x) {\n        return 2 * x + 1;\n      }, function() {\n        return 10;\n      }, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(211, 1),\n      onNext(221, 3),\n      onNext(231, 5),\n      onCompleted(231)\n    );\n\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/groupby.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal */\n  QUnit.module('GroupBy');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe,\n      created = Rx.ReactiveTest.created,\n      subscribed = Rx.ReactiveTest.subscribed,\n      disposed = Rx.ReactiveTest.disposed;\n\n  if (!String.prototype.trim) {\n    String.prototype.trim = function () {\n      return this.replace(/^\\s+/, '').replace(/\\s+$/, '');\n    };\n  }\n\n  String.prototype.reverse = function () {\n    return this.split('').reverse().join('');\n  };\n\n  function noop() { }\n\n  test('groupBy with key comparer', function () {\n    var scheduler = new TestScheduler();\n\n    var keyInvoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupBy(function (x) {\n        keyInvoked++;\n        return x.toLowerCase().trim();\n      }).map(function (g) { return g.key; });\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 'foo'),\n      onNext(270, 'bar'),\n      onNext(350, 'baz'),\n      onNext(360, 'qux'),\n      onCompleted(570));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 570));\n\n    equal(12, keyInvoked);\n  });\n\n  test('groupBy outer complete', function () {\n    var scheduler = new TestScheduler();\n\n    var keyInvoked = 0;\n    var eleInvoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupBy(function (x) {\n        keyInvoked++;\n        return x.toLowerCase().trim();\n      }, function (x) {\n        eleInvoked++;\n        return x.reverse();\n      }).map(function (g) {\n        return g.key;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 'foo'),\n      onNext(270, 'bar'),\n      onNext(350, 'baz'),\n      onNext(360, 'qux'),\n      onCompleted(570));\n\n    xs.subscriptions.assertEqual(subscribe(200, 570));\n\n    equal(12, keyInvoked);\n    equal(12, eleInvoked);\n  });\n\n  test('groupBy outer error', function () {\n    var scheduler = new TestScheduler();\n\n    var keyInvoked = 0;\n    var eleInvoked = 0;\n\n    var error = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onError(570, error),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupBy(function (x) {\n        keyInvoked++;\n        return x.toLowerCase().trim();\n      }, function (x) {\n        eleInvoked++;\n        return x.reverse();\n      }).map(function (g) {\n        return g.key;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 'foo'),\n      onNext(270, 'bar'),\n      onNext(350, 'baz'),\n      onNext(360, 'qux'),\n      onError(570, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 570));\n\n    equal(12, keyInvoked);\n    equal(12, eleInvoked);\n  });\n\n  test('groupBy outer dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var keyInvoked = 0;\n    var eleInvoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupBy(function (x) {\n        keyInvoked++;\n        return x.toLowerCase().trim();\n      }, function (x) {\n        eleInvoked++;\n        return x.reverse();\n      }).map(function (g) {\n        return g.key;\n      });\n    }, {disposed: 355 });\n\n    results.messages.assertEqual(\n      onNext(220, 'foo'),\n      onNext(270, 'bar'),\n      onNext(350, 'baz'));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 355));\n\n    equal(5, keyInvoked);\n    equal(5, eleInvoked);\n  });\n\n  test('groupBy outer key throw', function () {\n    var scheduler = new TestScheduler();\n\n    var keyInvoked = 0;\n    var eleInvoked = 0;\n\n    var error = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupBy(function (x) {\n        keyInvoked++;\n        if (keyInvoked === 10) { throw error; }\n        return x.toLowerCase().trim();\n      }, function (x) {\n        eleInvoked++;\n        return x.reverse();\n      }).map(function (g) {\n        return g.key;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 'foo'),\n      onNext(270, 'bar'),\n      onNext(350, 'baz'),\n      onNext(360, 'qux'),\n      onError(480, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 480));\n\n    equal(10, keyInvoked);\n    equal(9, eleInvoked);\n  });\n\n  test('groupBy outer element throw', function () {\n    var scheduler = new TestScheduler();\n\n    var keyInvoked = 0;\n    var eleInvoked = 0;\n\n    var error = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupBy(function (x) {\n        keyInvoked++;\n        return x.toLowerCase().trim();\n      }, function (x) {\n        eleInvoked++;\n        if (eleInvoked === 10) { throw error; }\n        return x.reverse();\n      }).map(function (g) {\n        return g.key;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 'foo'),\n      onNext(270, 'bar'),\n      onNext(350, 'baz'),\n      onNext(360, 'qux'),\n      onError(480, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 480));\n\n    equal(10, keyInvoked);\n    equal(10, eleInvoked);\n  });\n\n  test('groupBy inner complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var outer = null;\n    var outerSubscription = null;\n    var inners = {};\n    var innerSubscriptions = {};\n    var results = {};\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupBy(function (x) {\n        return x.toLowerCase().trim();\n      }, function (x) {\n        return x.reverse();\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        var result = scheduler.createObserver();\n        inners[group.key] = group;\n        results[group.key] = result;\n\n        scheduler.scheduleRelative(null, 100, function () {\n          innerSubscriptions[group.key] = group.subscribe(result);\n        });\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      for (var i = 0; i < innerSubscriptions.length; i++) {\n        innerSubscriptions[i].dispose();\n      }\n    });\n\n    scheduler.start();\n\n    equal(4, Object.keys(inners).length);\n\n    results['foo'].messages.assertEqual(\n      onNext(470, ' OOF'),\n      onNext(530, '    oOf    '),\n      onCompleted(570));\n\n    results['bar'].messages.assertEqual(\n      onNext(390, 'rab   '),\n      onNext(420, '  RAB '),\n      onCompleted(570));\n\n    results['baz'].messages.assertEqual(\n      onNext(480, '  zab'),\n      onNext(510, ' ZAb '),\n      onCompleted(570));\n\n    results['qux'].messages.assertEqual(\n      onCompleted(570));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 570));\n  });\n\n  test('groupBy inner complete all', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var outer = null;\n    var outerSubscription = null;\n    var inners = {};\n    var innerSubscriptions = {};\n    var results = {};\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupBy(function (x) {\n        return x.toLowerCase().trim();\n      }, function (x) {\n        return x.reverse();\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        var result = scheduler.createObserver();\n        inners[group.key] = group;\n        results[group.key] = result;\n        innerSubscriptions[group.key] = group.subscribe(result);\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      for (var i = 0; i < innerSubscriptions.length; i++) {\n        innerSubscriptions[i].dispose();\n      }\n    });\n\n    scheduler.start();\n\n    equal(4, Object.keys(inners).length);\n\n    results['foo'].messages.assertEqual(\n      onNext(220, 'oof  '),\n      onNext(240, ' OoF '),\n      onNext(310, ' Oof'),\n      onNext(470, ' OOF'),\n      onNext(530, '    oOf    '),\n      onCompleted(570));\n\n    results['bar'].messages.assertEqual(\n      onNext(270, '  Rab'),\n      onNext(390, 'rab   '),\n      onNext(420, '  RAB '),\n      onCompleted(570));\n\n    results['baz'].messages.assertEqual(\n      onNext(350, '   zaB '),\n      onNext(480, '  zab'),\n      onNext(510, ' ZAb '),\n      onCompleted(570));\n\n    results['qux'].messages.assertEqual(\n      onNext(360, ' xuq  '),\n      onCompleted(570));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 570));\n  });\n\n  test('groupBy inner error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onError(570, error),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var outer = null;\n    var outerSubscription = null;\n    var inners = {};\n    var innerSubscriptions = {};\n    var results = {};\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupBy(function (x) {\n        return x.toLowerCase().trim();\n      }, function (x) {\n        return x.reverse();\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        var result = scheduler.createObserver();\n        inners[group.key] = group;\n        results[group.key] = result;\n\n        scheduler.scheduleRelative(null, 100, function () {\n            innerSubscriptions[group.key] = group.subscribe(result);\n        });\n      }, noop);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      for (var i = 0, len = innerSubscriptions.length; i < len; i++) {\n        innerSubscriptions[i].dispose();\n      }\n    });\n\n    scheduler.start();\n\n    equal(4, Object.keys(inners).length);\n\n    results['foo'].messages.assertEqual(\n      onNext(470, ' OOF'),\n      onNext(530, '    oOf    '),\n      onError(570, error));\n\n    results['bar'].messages.assertEqual(\n      onNext(390, 'rab   '),\n      onNext(420, '  RAB '),\n      onError(570, error));\n\n    results['baz'].messages.assertEqual(\n      onNext(480, '  zab'),\n      onNext(510, ' ZAb '),\n      onError(570, error));\n\n    results['qux'].messages.assertEqual(\n      onError(570, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 570));\n  });\n\n  test('groupBy inner dispose', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(onNext(90, new Error()), onNext(110, new Error()), onNext(130, new Error()), onNext(220, '  foo'), onNext(240, ' FoO '), onNext(270, 'baR  '), onNext(310, 'foO '), onNext(350, ' Baz   '), onNext(360, '  qux '), onNext(390, '   bar'), onNext(420, ' BAR  '), onNext(470, 'FOO '), onNext(480, 'baz  '), onNext(510, ' bAZ '), onNext(530, '    fOo    '), onCompleted(570), onNext(580, new Error()), onCompleted(600), onError(650, new Error()));\n      var outer = null;\n      var outerSubscription = null;\n      var inners = {};\n      var innerSubscriptions = {};\n      var results = {};\n\n      scheduler.scheduleAbsolute(null, created, function () {\n        outer = xs.groupBy(function (x) {\n          return x.toLowerCase().trim();\n        }, function (x) {\n          return x.reverse();\n        });\n      });\n\n      scheduler.scheduleAbsolute(null, subscribed, function () {\n        outerSubscription = outer.subscribe(function (group) {\n          var result = scheduler.createObserver();\n\n          inners[group.key] = group;\n          results[group.key] = result;\n\n          innerSubscriptions[group.key] = group.subscribe(result);\n        });\n      });\n\n      scheduler.scheduleAbsolute(null, 400, function () {\n        outerSubscription.dispose();\n        for (var key in innerSubscriptions) {\n\n          innerSubscriptions[key].dispose();\n        }\n      });\n\n      scheduler.start();\n\n      equal(4, Object.keys(inners).length);\n\n      results['foo'].messages.assertEqual(\n        onNext(220, 'oof  '),\n        onNext(240, ' OoF '),\n        onNext(310, ' Oof'));\n\n      results['bar'].messages.assertEqual(\n        onNext(270, '  Rab'),\n        onNext(390, 'rab   '));\n\n      results['baz'].messages.assertEqual(\n        onNext(350, '   zaB '));\n\n      results['qux'].messages.assertEqual(\n        onNext(360, ' xuq  '));\n\n      xs.subscriptions.assertEqual(\n        subscribe(200, 400));\n  });\n\n  test('groupBy inner key throw', function () {\n    var keyInvoked = 0;\n\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var outer = null;\n    var outerSubscription = null;\n    var inners = {};\n    var innerSubscriptions = {};\n    var results = {};\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupBy(function (x) {\n        keyInvoked++;\n        if (keyInvoked === 6) { throw error; }\n        return x.toLowerCase().trim();\n      }, function (x) {\n        return x.reverse();\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n        outerSubscription = outer.subscribe(function (group) {\n          var result = scheduler.createObserver();\n\n          inners[group.key] = group;\n          results[group.key] = result;\n\n          innerSubscriptions[group.key] = group.subscribe(result);\n        }, noop);\n    });\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      for (var key in innerSubscriptions) {\n\n        innerSubscriptions[key].dispose();\n      }\n    });\n\n    scheduler.start();\n\n    equal(3, Object.keys(inners).length);\n\n    results['foo'].messages.assertEqual(\n      onNext(220, 'oof  '),\n      onNext(240, ' OoF '),\n      onNext(310, ' Oof'),\n      onError(360, error));\n\n    results['bar'].messages.assertEqual(\n      onNext(270, '  Rab'),\n      onError(360, error));\n\n    results['baz'].messages.assertEqual(\n      onNext(350, '   zaB '),\n      onError(360, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 360));\n  });\n\n  test('groupBy inner element throw', function () {\n    var eleInvoked = 0;\n\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var outer = null;\n    var outerSubscription = null;\n    var inners = {};\n    var innerSubscriptions = {};\n    var results = {};\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupBy(function (x) {\n        return x.toLowerCase().trim();\n      }, function (x) {\n        eleInvoked++;\n        if (eleInvoked === 6) { throw error; }\n        return x.reverse();\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n          var result = scheduler.createObserver();\n\n          inners[group.key] = group;\n          results[group.key] = result;\n\n          innerSubscriptions[group.key] = group.subscribe(result);\n      }, noop);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      for (var key in innerSubscriptions) {\n\n        innerSubscriptions[key].dispose();\n      }\n    });\n\n    scheduler.start();\n\n    equal(4, Object.keys(inners).length);\n\n    results['foo'].messages.assertEqual(\n      onNext(220, 'oof  '),\n      onNext(240, ' OoF '),\n      onNext(310, ' Oof'),\n      onError(360, error));\n\n    results['bar'].messages.assertEqual(\n      onNext(270, '  Rab'),\n      onError(360, error));\n\n    results['baz'].messages.assertEqual(\n      onNext(350, '   zaB '),\n      onError(360, error));\n\n    results['qux'].messages.assertEqual(\n      onError(360, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 360));\n  });\n\n  test('groupBy outer independence', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var outer = null;\n    var outerSubscription = null;\n    var inners = {};\n    var innerSubscriptions = {};\n    var results = {};\n    var outerResults = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupBy(function (x) {\n        return x.toLowerCase().trim();\n      }, function (x) {\n        return x.reverse();\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        outerResults.onNext(group.key);\n\n        var result = scheduler.createObserver();\n\n        inners[group.key] = group;\n        results[group.key] = result;\n\n        innerSubscriptions[group.key] = group.subscribe(result);\n      }, function (e) {\n        outerResults.onError(e);\n      }, function () {\n        outerResults.onCompleted();\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      for (var key in innerSubscriptions) {\n\n        innerSubscriptions[key].dispose();\n      }\n    });\n\n    scheduler.scheduleAbsolute(null, 320, function () {\n      outerSubscription.dispose();\n    });\n\n    scheduler.start();\n\n    equal(2, Object.keys(inners).length);\n\n    outerResults.messages.assertEqual(\n      onNext(220, 'foo'),\n      onNext(270, 'bar'));\n\n    results['foo'].messages.assertEqual(\n      onNext(220, 'oof  '),\n      onNext(240, ' OoF '),\n      onNext(310, ' Oof'),\n      onNext(470, ' OOF'),\n      onNext(530, '    oOf    '),\n      onCompleted(570));\n\n    results['bar'].messages.assertEqual(\n      onNext(270, '  Rab'),\n      onNext(390, 'rab   '),\n      onNext(420, '  RAB '),\n      onCompleted(570));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 570));\n  });\n\n  test('groupBy inner independence', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var outer = null;\n    var outerSubscription = null;\n    var inners = {};\n    var innerSubscriptions = {};\n    var results = {};\n    var outerResults = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupBy(function (x) {\n        return x.toLowerCase().trim();\n      }, function (x) {\n        return x.reverse();\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        outerResults.onNext(group.key);\n\n        var result = scheduler.createObserver();\n\n        inners[group.key] = group;\n        results[group.key] = result;\n\n        innerSubscriptions[group.key] = group.subscribe(result);\n      }, function (e) {\n        outerResults.onError(e);\n      }, function () {\n        outerResults.onCompleted();\n      });\n    });\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      for (var key in innerSubscriptions) {\n\n        innerSubscriptions[key].dispose();\n      }\n    });\n\n    scheduler.scheduleAbsolute(null, 320, function () {\n      innerSubscriptions['foo'].dispose();\n    });\n\n    scheduler.start();\n\n    equal(4, Object.keys(inners).length);\n\n    results['foo'].messages.assertEqual(\n      onNext(220, 'oof  '),\n      onNext(240, ' OoF '),\n      onNext(310, ' Oof'));\n\n    results['bar'].messages.assertEqual(\n      onNext(270, '  Rab'),\n      onNext(390, 'rab   '),\n      onNext(420, '  RAB '),\n      onCompleted(570));\n\n    results['baz'].messages.assertEqual(\n      onNext(350, '   zaB '),\n      onNext(480, '  zab'),\n      onNext(510, ' ZAb '),\n      onCompleted(570));\n\n    results['qux'].messages.assertEqual(\n      onNext(360, ' xuq  '),\n      onCompleted(570));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 570));\n  });\n\n  test('groupBy inner multiple independence', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var outer = null;\n    var outerSubscription = null;\n    var inners = {};\n    var innerSubscriptions = {};\n    var results = {};\n    var outerResults = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupBy(function (x) {\n        return x.toLowerCase().trim();\n      }, function (x) {\n        return x.reverse();\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        outerResults.onNext(group.key);\n        var result = scheduler.createObserver();\n        inners[group.key] = group;\n        results[group.key] = result;\n        innerSubscriptions[group.key] = group.subscribe(result);\n      }, function (e) {\n        outerResults.onError(e);\n      }, function () {\n        outerResults.onCompleted();\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      for (var key in innerSubscriptions) {\n\n        innerSubscriptions[key].dispose();\n      }\n    });\n\n    scheduler.scheduleAbsolute(null, 320, function () {\n      innerSubscriptions['foo'].dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 280, function () {\n      innerSubscriptions['bar'].dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 355, function () {\n      innerSubscriptions['baz'].dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      innerSubscriptions['qux'].dispose();\n    });\n\n    scheduler.start();\n\n    equal(4, Object.keys(inners).length);\n\n    results['foo'].messages.assertEqual(\n      onNext(220, 'oof  '),\n      onNext(240, ' OoF '),\n      onNext(310, ' Oof'));\n\n    results['bar'].messages.assertEqual(\n      onNext(270, '  Rab'));\n\n    results['baz'].messages.assertEqual(\n      onNext(350, '   zaB '));\n\n    results['qux'].messages.assertEqual(\n      onNext(360, ' xuq  '));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 570));\n  });\n\n  test('groupBy inner escape complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(310, 'foO '),\n      onNext(470, 'FOO '),\n      onNext(530, '    fOo    '),\n      onCompleted(570));\n\n    var results = scheduler.createObserver();\n    var outer = null;\n    var outerSubscription = null;\n    var inner = null;\n    var innerSubscription = null;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupBy(function (x) {\n        return x.toLowerCase().trim();\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        inner = group;\n      });\n    });\n    scheduler.scheduleAbsolute(null, 600, function () {\n      innerSubscription = inner.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      innerSubscription.dispose();\n    });\n\n    scheduler.start();\n    results.messages.assertEqual(\n      onCompleted(600));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 570));\n  });\n\n  test('groupBy inner escape error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(310, 'foO '),\n      onNext(470, 'FOO '),\n      onNext(530, '    fOo    '),\n      onError(570, error));\n\n    var results = scheduler.createObserver();\n    var outer = null;\n    var outerSubscription = null;\n    var inner = null;\n    var innerSubscription = null;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupBy(function (x) {\n        return x.toLowerCase().trim();\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        inner = group;\n      }, noop);\n    });\n\n    scheduler.scheduleAbsolute(null, 600, function () {\n      innerSubscription = inner.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      innerSubscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onError(600, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 570));\n  });\n\n  test('groupBy inner escape dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(310, 'foO '),\n      onNext(470, 'FOO '),\n      onNext(530, '    fOo    '),\n      onError(570, new Error()));\n\n    var results = scheduler.createObserver();\n    var outer = null;\n    var outerSubscription = null;\n    var inner = null;\n    var innerSubscription = null;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupBy(function (x) {\n        return x.toLowerCase().trim();\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        inner = group;\n      }, noop);\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      outerSubscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 600, function () {\n      innerSubscription = inner.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      innerSubscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/groupbyuntil.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal */\n\n  QUnit.module('GroupByUntil');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe,\n      created = Rx.ReactiveTest.created,\n      subscribed = Rx.ReactiveTest.subscribed,\n      disposed = Rx.ReactiveTest.disposed;\n\n  function noop () { }\n\n  String.prototype.reverse = function () {\n    return this.split('').reverse().join('');\n  };\n\n  if (!String.prototype.trim) {\n    String.prototype.trim = function () {\n      return this.replace(/^\\s+/, '').replace(/\\s+$/, '');\n    };\n  }\n\n  test('GroupByUntil WithKeyComparer', function () {\n    var scheduler = new TestScheduler();\n\n    var keyInvoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupByUntil(function (x) {\n        keyInvoked++;\n        return x.toLowerCase().trim();\n      }, function (x) {\n        return x;\n      }, function (g) {\n        return g.skip(2);\n      }).map(function (x) {\n        return x.key;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 'foo'),\n      onNext(270, 'bar'),\n      onNext(350, 'baz'),\n      onNext(360, 'qux'),\n      onNext(470, 'foo'),\n      onCompleted(570));\n\n    xs.subscriptions.assertEqual(subscribe(200, 570));\n\n    equal(12, keyInvoked);\n  });\n\n  test('GroupByUntil Outer Complete', function () {\n    var scheduler = new TestScheduler();\n\n    var keyInvoked = 0;\n    var eleInvoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupByUntil(function (x) {\n        keyInvoked++;\n        return x.toLowerCase().trim();\n      }, function (x) {\n        eleInvoked++;\n        return x.reverse();\n      }, function (g) {\n        return g.skip(2);\n      }).map(function (x) {\n        return x.key;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 'foo'),\n      onNext(270, 'bar'),\n      onNext(350, 'baz'),\n      onNext(360, 'qux'),\n      onNext(470, 'foo'),\n      onCompleted(570));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 570));\n\n    equal(12, keyInvoked);\n    equal(12, eleInvoked);\n  });\n\n  test('GroupByUntil Outer Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var keyInvoked = 0;\n    var eleInvoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onError(570, error),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupByUntil(function (x) {\n        keyInvoked++;\n        return x.toLowerCase().trim();\n      }, function (x) {\n        eleInvoked++;\n        return x.reverse();\n      }, function (g) {\n        return g.skip(2);\n      }).map(function (x) {\n        return x.key;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 'foo'),\n      onNext(270, 'bar'),\n      onNext(350, 'baz'),\n      onNext(360, 'qux'),\n      onNext(470, 'foo'),\n      onError(570, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 570));\n\n    equal(12, keyInvoked);\n    equal(12, eleInvoked);\n  });\n\n  test('GroupByUntil Outer Dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var keyInvoked = 0;\n    var eleInvoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupByUntil(function (x) {\n        keyInvoked++;\n        return x.toLowerCase().trim();\n      }, function (x) {\n        eleInvoked++;\n        return x.reverse();\n      }, function (g) {\n        return g.skip(2);\n      }).map(function (x) {\n        return x.key;\n      });\n    }, { disposed: 355 });\n\n    results.messages.assertEqual(\n      onNext(220, 'foo'),\n      onNext(270, 'bar'),\n      onNext(350, 'baz'));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 355));\n\n    equal(5, keyInvoked);\n    equal(5, eleInvoked);\n  });\n\n  test('GroupByUntil Outer KeyThrow', function () {\n    var scheduler = new TestScheduler();\n\n    var error = new Error();\n\n    var keyInvoked = 0;\n    var eleInvoked = 0;\n\n    var xs = scheduler.createHotObservable(onNext(90, new Error()), onNext(110, new Error()), onNext(130, new Error()), onNext(220, '  foo'), onNext(240, ' FoO '), onNext(270, 'baR  '), onNext(310, 'foO '), onNext(350, ' Baz   '), onNext(360, '  qux '), onNext(390, '   bar'), onNext(420, ' BAR  '), onNext(470, 'FOO '), onNext(480, 'baz  '), onNext(510, ' bAZ '), onNext(530, '    fOo    '), onCompleted(570), onNext(580, new Error()), onCompleted(600), onError(650, new Error()));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupByUntil(function (x) {\n        keyInvoked++;\n        if (keyInvoked === 10) { throw error; }\n        return x.toLowerCase().trim();\n      }, function (x) {\n        eleInvoked++;\n        return x.reverse();\n      }, function (g) {\n        return g.skip(2);\n      }).map(function (x) {\n        return x.key;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 'foo'),\n      onNext(270, 'bar'),\n      onNext(350, 'baz'),\n      onNext(360, 'qux'),\n      onNext(470, 'foo'),\n      onError(480, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 480));\n\n    equal(10, keyInvoked);\n    equal(9, eleInvoked);\n  });\n\n  test('GroupByUntil Outer EleThrow', function () {\n    var scheduler = new TestScheduler();\n\n    var error = new Error();\n\n    var keyInvoked = 0;\n    var eleInvoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupByUntil(function (x) {\n        keyInvoked++;\n        return x.toLowerCase().trim();\n      }, function (x) {\n        eleInvoked++;\n        if (eleInvoked === 10) { throw error; }\n        return x.reverse();\n      }, function (g) {\n        return g.skip(2);\n      }).map(function (x) {\n        return x.key;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 'foo'),\n      onNext(270, 'bar'),\n      onNext(350, 'baz'),\n      onNext(360, 'qux'),\n      onNext(470, 'foo'),\n      onError(480, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 480));\n\n    equal(10, keyInvoked);\n    equal(10, eleInvoked);\n  });\n\n  test('GroupByUntil Inner Complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var inners = {};\n    var innerSubscriptions = {};\n    var results = {};\n    var outer;\n    var outerSubscription;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupByUntil(function (x) {\n        return x.toLowerCase().trim();\n      }, function (x) {\n        return x.reverse();\n      }, function (g) {\n        return g.skip(2);\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        var result = scheduler.createObserver();\n\n        inners[group.key] = group;\n        results[group.key] = result;\n\n        scheduler.scheduleRelative(null, 100, function () {\n          innerSubscriptions[group.key] = group.subscribe(result);\n        });\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      for (var key in innerSubscriptions) {\n        innerSubscriptions[key].dispose();\n      }\n    });\n\n    scheduler.start();\n\n    equal(4, Object.keys(inners).length);\n\n    results['bar'].messages.assertEqual(\n      onNext(390, 'rab   '),\n      onCompleted(420));\n\n    results['baz'].messages.assertEqual(\n      onNext(480, '  zab'),\n      onCompleted(510));\n\n    results['qux'].messages.assertEqual(\n      onCompleted(570));\n\n    results['foo'].messages.assertEqual(\n      onCompleted(570));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 570));\n  });\n\n  test('GroupByUntil Inner Complete All', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var outer = null;\n    var outerSubscription = null;\n    var inners = {};\n    var innerSubscriptions = {};\n    var results = {};\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupByUntil(function (x) {\n        return x.toLowerCase().trim();\n      }, function (x) {\n        return x.reverse();\n      }, function (g) {\n        return g.skip(2);\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        var result = scheduler.createObserver();\n\n        inners[group.key] = group;\n        results[group.key] = result;\n\n        innerSubscriptions[group.key] = group.subscribe(result);\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      for (var key in innerSubscriptions) {\n        innerSubscriptions[key].dispose();\n      }\n    });\n\n    scheduler.start();\n\n    equal(4, Object.keys(inners).length);\n\n    results['bar'].messages.assertEqual(\n      onNext(270, '  Rab'),\n      onNext(390, 'rab   '),\n      onNext(420, '  RAB '),\n      onCompleted(420));\n\n    results['baz'].messages.assertEqual(\n      onNext(350, '   zaB '),\n      onNext(480, '  zab'),\n      onNext(510, ' ZAb '),\n      onCompleted(510));\n\n    results['qux'].messages.assertEqual(\n      onNext(360, ' xuq  '),\n      onCompleted(570));\n\n    results['foo'].messages.assertEqual(\n      onNext(470, ' OOF'),\n      onNext(530, '    oOf    '),\n      onCompleted(570));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 570));\n  });\n\n  test('GroupByUntil Inner Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onError(570, error),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var outer = null;\n    var outerSubscription = null;\n    var inners = {};\n    var innerSubscriptions = {};\n    var results = {};\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupByUntil(function (x) {\n        return x.toLowerCase().trim();\n      }, function (x) {\n        return x.reverse();\n      }, function (g) {\n        return g.skip(2);\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        var result = scheduler.createObserver();\n\n        inners[group.key] = group;\n        results[group.key] = result;\n\n        scheduler.scheduleRelative(null, 100, function () {\n          innerSubscriptions[group.key] = group.subscribe(result);\n        });\n      }, noop);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      for (var key in innerSubscriptions) {\n        innerSubscriptions[key].dispose();\n      }\n    });\n\n    scheduler.start();\n\n    equal(4, Object.keys(inners).length);\n\n    results['bar'].messages.assertEqual(\n      onNext(390, 'rab   '),\n      onCompleted(420));\n\n    results['baz'].messages.assertEqual(\n      onNext(480, '  zab'),\n      onCompleted(510));\n\n    results['qux'].messages.assertEqual(\n      onError(570, error));\n\n    results['foo'].messages.assertEqual(\n      onError(570, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 570));\n  });\n\n  test('GroupByUntil Inner Dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var inners = {};\n    var innerSubscriptions = {};\n    var results = {};\n    var outer;\n    var outerSubscription;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupByUntil(function (x) {\n        return x.toLowerCase().trim();\n      }, function (x) {\n        return x.reverse();\n      }, function (g) {\n        return g.skip(2);\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        var result = scheduler.createObserver();\n\n        inners[group.key] = group;\n        results[group.key] = result;\n\n        innerSubscriptions[group.key] = group.subscribe(result);\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      outerSubscription.dispose();\n      for (var key in innerSubscriptions) {\n        innerSubscriptions[key].dispose();\n      }\n    });\n\n    scheduler.start();\n\n    equal(4, Object.keys(inners).length);\n\n    results['bar'].messages.assertEqual(\n      onNext(270, '  Rab'),\n      onNext(390, 'rab   '));\n\n    results['baz'].messages.assertEqual(\n      onNext(350, '   zaB '));\n\n    results['qux'].messages.assertEqual(\n      onNext(360, ' xuq  '));\n\n    results['foo'].messages.assertEqual(\n      onNext(220, 'oof  '),\n      onNext(240, ' OoF '),\n      onNext(310, ' Oof'),\n      onCompleted(310));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400));\n  });\n\n  test('GroupByUntil Inner KeyThrow', function () {\n    var error = new Error();\n\n    var keyInvoked = 0;\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var inners = {};\n    var innerSubscriptions = {};\n    var results = {};\n    var outer;\n    var outerSubscription;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupByUntil(function (x) {\n        keyInvoked++;\n        if (keyInvoked === 6) { throw error; }\n        return x.toLowerCase().trim();\n      }, function (x) {\n        return x.reverse();\n      }, function (g) {\n        return g.skip(2);\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        var result = scheduler.createObserver();\n\n        inners[group.key] = group;\n        results[group.key] = result;\n\n        innerSubscriptions[group.key] = group.subscribe(result);\n      }, noop);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      for (var key in innerSubscriptions) {\n        innerSubscriptions[key].dispose();\n      }\n    });\n\n    scheduler.start();\n\n    equal(3, Object.keys(inners).length);\n\n    results['bar'].messages.assertEqual(\n      onNext(270, '  Rab'),\n      onError(360, error));\n    results['baz'].messages.assertEqual(\n      onNext(350, '   zaB '),\n      onError(360, error));\n\n    results['foo'].messages.assertEqual(\n      onNext(220, 'oof  '),\n      onNext(240, ' OoF '),\n      onNext(310, ' Oof'),\n      onCompleted(310));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 360));\n  });\n\n  test('GroupByUntil Inner EleThrow', function () {\n    var error = new Error();\n\n    var eleInvoked = 0;\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var inners = {};\n    var innerSubscriptions = {};\n    var results = {};\n    var outer;\n    var outerSubscription;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupByUntil(function (x) {\n        return x.toLowerCase().trim();\n      }, function (x) {\n        eleInvoked++;\n        if (eleInvoked === 6) { throw error; }\n        return x.reverse();\n      }, function (g) {\n        return g.skip(2);\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        var result = scheduler.createObserver();\n\n        inners[group.key] = group;\n        results[group.key] = result;\n\n        innerSubscriptions[group.key] = group.subscribe(result);\n      }, noop);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      for (var key in innerSubscriptions) {\n        innerSubscriptions[key].dispose();\n      }\n    });\n\n    scheduler.start();\n\n    equal(4, Object.keys(inners).length);\n\n    results['bar'].messages.assertEqual(\n      onNext(270, '  Rab'),\n      onError(360, error));\n\n    results['baz'].messages.assertEqual(\n      onNext(350, '   zaB '),\n      onError(360, error));\n\n    results['qux'].messages.assertEqual(\n      onError(360, error));\n\n    results['foo'].messages.assertEqual(\n      onNext(220, 'oof  '),\n      onNext(240, ' OoF '),\n      onNext(310, ' Oof'),\n      onCompleted(310));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 360));\n  });\n\n  test('GroupByUntil Outer Independence', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var inners = {};\n    var innerSubscriptions = {};\n    var results = {};\n    var outer;\n    var outerSubscription;\n    var outerResults = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupByUntil(function (x) {\n        return x.toLowerCase().trim();\n      }, function (x) {\n        return x.reverse();\n      }, function (g) {\n        return g.skip(2);\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        outerResults.onNext(group.key);\n\n        var result = scheduler.createObserver();\n\n        inners[group.key] = group;\n        results[group.key] = result;\n\n        innerSubscriptions[group.key] = group.subscribe(result);\n      }, function (e) {\n        outerResults.onError(e);\n      }, function () {\n        outerResults.onCompleted();\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      for (var key in innerSubscriptions) {\n        innerSubscriptions[key].dispose();\n      }\n    });\n\n    scheduler.scheduleAbsolute(null, 320, function () {\n      outerSubscription.dispose();\n    });\n\n    scheduler.start();\n\n    equal(2, Object.keys(inners).length);\n\n    outerResults.messages.assertEqual(\n      onNext(220, 'foo'),\n      onNext(270, 'bar'));\n\n    results['foo'].messages.assertEqual(\n      onNext(220, 'oof  '),\n      onNext(240, ' OoF '),\n      onNext(310, ' Oof'),\n      onCompleted(310));\n\n    results['bar'].messages.assertEqual(\n      onNext(270, '  Rab'),\n      onNext(390, 'rab   '),\n      onNext(420, '  RAB '),\n      onCompleted(420));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 420));\n  });\n\n  test('GroupByUntil Inner Independence', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var inners = {};\n    var innerSubscriptions = {};\n    var results = {};\n    var outer;\n    var outerSubscription;\n    var outerResults = scheduler.createObserver();\n\n    outerResults = scheduler.createObserver();\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupByUntil(function (x) {\n        return x.toLowerCase().trim();\n      }, function (x) {\n        return x.reverse();\n      }, function (g) {\n        return g.skip(2);\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        outerResults.onNext(group.key);\n\n        var result = scheduler.createObserver();\n\n        inners[group.key] = group;\n        results[group.key] = result;\n\n        innerSubscriptions[group.key] = group.subscribe(result);\n      }, function (e) {\n        outerResults.onError(e);\n      }, function () {\n        outerResults.onCompleted();\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      for (var key in innerSubscriptions) {\n        innerSubscriptions[key].dispose();\n      }\n    });\n\n    scheduler.scheduleAbsolute(null, 320, function () {\n      innerSubscriptions['foo'].dispose();\n    });\n\n    scheduler.start();\n\n    equal(4, Object.keys(inners).length);\n\n    results['bar'].messages.assertEqual(\n      onNext(270, '  Rab'),\n      onNext(390, 'rab   '),\n      onNext(420, '  RAB '),\n      onCompleted(420));\n\n    results['baz'].messages.assertEqual(\n      onNext(350, '   zaB '),\n      onNext(480, '  zab'),\n      onNext(510, ' ZAb '),\n      onCompleted(510));\n\n    results['qux'].messages.assertEqual(\n      onNext(360, ' xuq  '),\n      onCompleted(570));\n\n    results['foo'].messages.assertEqual(\n      onNext(470, ' OOF'),\n      onNext(530, '    oOf    '),\n      onCompleted(570));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 570));\n  });\n\n  test('GroupByUntil Inner Multiple Independence', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var results = scheduler.createObserver();\n    var inners = {};\n    var innerSubscriptions = {};\n    var outer;\n    var outerSubscription;\n    var outerResults = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupByUntil(function (x) {\n        return x.toLowerCase().trim();\n      }, function (x) {\n        return x.reverse();\n      }, function (g) {\n        return g.skip(2);\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        outerResults.onNext(group.key);\n\n        var result = scheduler.createObserver();\n\n        inners[group.key] = group;\n        results[group.key] = result;\n\n        innerSubscriptions[group.key] = group.subscribe(result);\n      }, function (e) {\n        return outerResults.onError(e);\n      }, function () {\n        return outerResults.onCompleted();\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      for (var key in innerSubscriptions) {\n        innerSubscriptions[key].dispose();\n      }\n    });\n\n    scheduler.scheduleAbsolute(null, 320, function () {\n      innerSubscriptions['foo'].dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 280, function () {\n      innerSubscriptions['bar'].dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 355, function () {\n      innerSubscriptions['baz'].dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      innerSubscriptions['qux'].dispose();\n    });\n\n    scheduler.start();\n\n    equal(4, Object.keys(inners).length);\n\n    results['bar'].messages.assertEqual(\n      onNext(270, '  Rab'));\n\n    results['baz'].messages.assertEqual(\n      onNext(350, '   zaB '));\n\n    results['qux'].messages.assertEqual(\n      onNext(360, ' xuq  '));\n\n    results['foo'].messages.assertEqual(\n      onNext(470, ' OOF'),\n      onNext(530, '    oOf    '),\n      onCompleted(570));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 570));\n});\n\n  test('GroupByUntil Inner Escape Complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(310, 'foO '),\n      onNext(470, 'FOO '),\n      onNext(530, '    fOo    '),\n      onCompleted(570));\n\n    var results = scheduler.createObserver();\n    var inner;\n    var innerSubscription;\n    var outer;\n    var outerSubscription;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupByUntil(function (x) {\n        return x.toLowerCase().trim();\n      }, function (x) {\n        return x.reverse();\n      }, function (g) {\n        return g.skip(2);\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        return inner = group;\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, 600, function () {\n      innerSubscription = inner.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      innerSubscription.dispose();\n    });\n\n    scheduler.start();\n    xs.subscriptions.assertEqual(subscribe(200, 570));\n    results.messages.assertEqual(onCompleted(600));\n  });\n\n  test('GroupByUntil Inner Escape Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(310, 'foO '),\n      onNext(470, 'FOO '),\n      onNext(530, '    fOo    '),\n      onError(570, error));\n\n    var results = scheduler.createObserver();\n    var inner;\n    var innerSubscription;\n    var outer;\n    var outerSubscription;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupByUntil(function (x) {\n        return x.toLowerCase().trim();\n      }, function (x) {\n        return x.reverse();\n      }, function (g) {\n        return g.skip(2);\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        inner = group;\n      }, noop);\n    });\n\n    scheduler.scheduleAbsolute(null, 600, function () {\n      innerSubscription = inner.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n      innerSubscription.dispose();\n    });\n\n    scheduler.start();\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 570));\n\n    results.messages.assertEqual(\n      onError(600, error));\n  });\n\n  test('GroupByUntil Inner Escape Dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(310, 'foO '),\n      onNext(470, 'FOO '),\n      onNext(530, '    fOo    '),\n      onError(570, new Error()));\n\n    var results = scheduler.createObserver();\n    var inner;\n    var innerSubscription;\n    var outer;\n    var outerSubscription;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      outer = xs.groupByUntil(function (x) {\n        return x.toLowerCase().trim();\n      }, function (x) {\n        return x.reverse();\n      }, function (g) {\n        return g.skip(2);\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      outerSubscription = outer.subscribe(function (group) {\n        inner = group;\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, 290, function () {\n      outerSubscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 600, function () {\n      innerSubscription = inner.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      outerSubscription.dispose();\n    });\n\n    scheduler.start();\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 290));\n\n    results.messages.assertEqual();\n  });\n\n  test('GroupByUntil Default', function () {\n    var keyInvoked = 0;\n    var eleInvoked = 0;\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, new Error()),\n      onNext(110, new Error()),\n      onNext(130, new Error()),\n      onNext(220, '  foo'),\n      onNext(240, ' FoO '),\n      onNext(270, 'baR  '),\n      onNext(310, 'foO '),\n      onNext(350, ' Baz   '),\n      onNext(360, '  qux '),\n      onNext(390, '   bar'),\n      onNext(420, ' BAR  '),\n      onNext(470, 'FOO '),\n      onNext(480, 'baz  '),\n      onNext(510, ' bAZ '),\n      onNext(530, '    fOo    '),\n      onCompleted(570),\n      onNext(580, new Error()),\n      onCompleted(600),\n      onError(650, new Error()));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupByUntil(function (x) {\n        keyInvoked++;\n        return x.toLowerCase().trim();\n      }, function (x) {\n        eleInvoked++;\n        return x.reverse();\n      }, function (g) {\n        return g.skip(2);\n      }).map(function (x) {\n        return x.key;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 'foo'),\n      onNext(270, 'bar'),\n      onNext(350, 'baz'),\n      onNext(360, 'qux'),\n      onNext(470, 'foo'),\n      onCompleted(570));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 570));\n\n    equal(12, keyInvoked);\n    equal(12, eleInvoked);\n  });\n\n  test('GroupByUntil DurationSelector Throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(onNext(210, 'foo'));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupByUntil(function (x) {\n        return x;\n      }, function (x) {\n        return x;\n      }, function () {\n        throw error;\n      });\n    });\n\n    results.messages.assertEqual(\n      onError(210, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 210));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/groupjoin.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal */\n\n  QUnit.module('groupJoin');\n\n  var TestScheduler = Rx.TestScheduler,\n      Observable = Rx.Observable,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  function TimeInterval(value, interval) {\n    this.value = value;\n    this.interval = interval;\n  }\n\n  function newTimer(l, t, scheduler) {\n    var timer = scheduler.createColdObservable(onNext(t, 0), onCompleted(t));\n    l.push(timer);\n    return timer;\n  }\n\n  test('groupJoin normal I', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n        onNext(210, new TimeInterval(0, 10)),\n        onNext(219, new TimeInterval(1, 5)),\n        onNext(240, new TimeInterval(2, 10)),\n        onNext(300, new TimeInterval(3, 100)),\n        onNext(310, new TimeInterval(4, 80)),\n        onNext(500, new TimeInterval(5, 90)),\n        onNext(700, new TimeInterval(6, 25)),\n        onNext(710, new TimeInterval(7, 280)),\n        onNext(720, new TimeInterval(8, 100)),\n        onNext(830, new TimeInterval(9, 10)),\n        onCompleted(900)\n      );\n\n      var ys = scheduler.createHotObservable(\n        onNext(215, new TimeInterval('hat', 20)),\n        onNext(217, new TimeInterval('bat', 1)),\n        onNext(290, new TimeInterval('wag', 200)),\n        onNext(300, new TimeInterval('pig', 10)),\n        onNext(305, new TimeInterval('cup', 50)),\n        onNext(600, new TimeInterval('yak', 90)),\n        onNext(702, new TimeInterval('tin', 20)),\n        onNext(712, new TimeInterval('man', 10)),\n        onNext(722, new TimeInterval('rat', 200)),\n        onNext(732, new TimeInterval('wig', 5)),\n        onCompleted(800)\n      );\n\n      var xsd = [];\n      var ysd = [];\n\n      var res = scheduler.startScheduler(function (){\n        return xs.groupJoin(\n          ys,\n          function (x) { return newTimer(xsd, x.interval, scheduler); },\n          function (y) { return newTimer(ysd, y.interval, scheduler); },\n          function (x, yy) { return yy.map(function (y) { return x.value + y.value; }); })\n        .mergeAll();\n      });\n\n      res.messages.assertEqual(\n        onNext(215, '0hat'),\n        onNext(217, '0bat'),\n        onNext(219, '1hat'),\n        onNext(300, '3wag'),\n        onNext(300, '3pig'),\n        onNext(305, '3cup'),\n        onNext(310, '4wag'),\n        onNext(310, '4pig'),\n        onNext(310, '4cup'),\n        onNext(702, '6tin'),\n        onNext(710, '7tin'),\n        onNext(712, '6man'),\n        onNext(712, '7man'),\n        onNext(720, '8tin'),\n        onNext(720, '8man'),\n        onNext(722, '6rat'),\n        onNext(722, '7rat'),\n        onNext(722, '8rat'),\n        onNext(732, '7wig'),\n        onNext(732, '8wig'),\n        onNext(830, '9rat'),\n        onCompleted(990)\n      );\n\n      xs.subscriptions.assertEqual(\n        subscribe(200, 990)\n      );\n\n      ys.subscriptions.assertEqual(\n        subscribe(200, 990)\n      );\n  });\n\n  test('groupJoin normal II', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 200)),\n      onNext(720, new TimeInterval(8, 100)),\n      onCompleted(721)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', (20))),\n      onNext(217, new TimeInterval('bat', (1))),\n      onNext(290, new TimeInterval('wag', (200))),\n      onNext(300, new TimeInterval('pig', (10))),\n      onNext(305, new TimeInterval('cup', (50))),\n      onNext(600, new TimeInterval('yak', (90))),\n      onNext(702, new TimeInterval('tin', (20))),\n      onNext(712, new TimeInterval('man', (10))),\n      onNext(722, new TimeInterval('rat', (200))),\n      onNext(732, new TimeInterval('wig', (5))),\n      onCompleted(990)\n    );\n\n    var xsd = [];\n    var ysd = [];\n\n    var res = scheduler.startScheduler(function (){\n      return xs.groupJoin(\n        ys,\n        function (x) { return newTimer(xsd, x.interval, scheduler); },\n        function (y) { return newTimer(ysd, y.interval, scheduler); },\n        function (x, yy) { return yy.map(function (y) { return x.value + y.value; }); })\n      .mergeAll();\n    });\n\n    res.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onNext(310, '4wag'),\n      onNext(310, '4pig'),\n      onNext(310, '4cup'),\n      onNext(702, '6tin'),\n      onNext(710, '7tin'),\n      onNext(712, '6man'),\n      onNext(712, '7man'),\n      onNext(720, '8tin'),\n      onNext(720, '8man'),\n      onNext(722, '6rat'),\n      onNext(722, '7rat'),\n      onNext(722, '8rat'),\n      onNext(732, '7wig'),\n      onNext(732, '8wig'),\n      onCompleted(910)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 910)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 910)\n    );\n  });\n\n  test('groupJoin normal III', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 280)),\n      onNext(720, new TimeInterval(8, 100)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(900));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(800));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupJoin(ys, function (x) {\n        return Observable.timer(x.interval, null, scheduler).filter(function () { return false; });\n      }, function (y) {\n        return Observable.timer(y.interval, null, scheduler).filter(function () { return false; });\n      }, function (x, yy) {\n        return yy.map(function (y) { return x.value + y.value; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onNext(310, '4wag'),\n      onNext(310, '4pig'),\n      onNext(310, '4cup'),\n      onNext(702, '6tin'),\n      onNext(710, '7tin'),\n      onNext(712, '6man'),\n      onNext(712, '7man'),\n      onNext(720, '8tin'),\n      onNext(720, '8man'),\n      onNext(722, '6rat'),\n      onNext(722, '7rat'),\n      onNext(722, '8rat'),\n      onNext(732, '7wig'),\n      onNext(732, '8wig'),\n      onNext(830, '9rat'),\n      onCompleted(990));\n  });\n\n  test('groupJoin normal IV', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 200)),\n      onNext(720, new TimeInterval(8, 100)),\n      onCompleted(990));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(980));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupJoin(ys, function (x) {\n        return Observable.timer(x.interval, null, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, null, scheduler);\n      }, function (x, yy) {\n        return yy.map(function (y) { return x.value + y.value; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onNext(310, '4wag'),\n      onNext(310, '4pig'),\n      onNext(310, '4cup'),\n      onNext(702, '6tin'),\n      onNext(710, '7tin'),\n      onNext(712, '6man'),\n      onNext(712, '7man'),\n      onNext(720, '8tin'),\n      onNext(720, '8man'),\n      onNext(722, '6rat'),\n      onNext(722, '7rat'),\n      onNext(722, '8rat'),\n      onNext(732, '7wig'),\n      onNext(732, '8wig'),\n      onCompleted(990));\n  });\n\n  test('groupJoin normal V', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 200)),\n      onNext(720, new TimeInterval(8, 100)),\n      onCompleted(990));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(900));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupJoin(ys, function (x) {\n        return Observable.timer(x.interval, null, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, null, scheduler);\n      }, function (x, yy) {\n        return yy.map(function (y) { return x.value + y.value; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onNext(310, '4wag'),\n      onNext(310, '4pig'),\n      onNext(310, '4cup'),\n      onNext(702, '6tin'),\n      onNext(710, '7tin'),\n      onNext(712, '6man'),\n      onNext(712, '7man'),\n      onNext(720, '8tin'),\n      onNext(720, '8man'),\n      onNext(722, '6rat'),\n      onNext(722, '7rat'),\n      onNext(722, '8rat'),\n      onNext(732, '7wig'),\n      onNext(732, '8wig'),\n      onCompleted(990));\n  });\n\n  test('groupJoin normal VI', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 30)),\n      onNext(720, new TimeInterval(8, 200)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(850));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 20)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(900));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupJoin(ys, function (x) {\n        return Observable.timer(x.interval, null, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, null, scheduler);\n      }, function (x, yy) {\n        return yy.map(function (y) { return x.value + y.value; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onNext(310, '4wag'),\n      onNext(310, '4pig'),\n      onNext(310, '4cup'),\n      onNext(702, '6tin'),\n      onNext(710, '7tin'),\n      onNext(712, '6man'),\n      onNext(712, '7man'),\n      onNext(720, '8tin'),\n      onNext(720, '8man'),\n      onNext(722, '6rat'),\n      onNext(722, '7rat'),\n      onNext(722, '8rat'),\n      onNext(732, '7wig'),\n      onNext(732, '8wig'),\n      onCompleted(920));\n  });\n\n  test('groupJoin normal VII', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onCompleted(210));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 20)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(900));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupJoin(ys, function (x) {\n        return Observable.timer(x.interval, null, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, null, scheduler);\n      }, function (x, yy) {\n        return yy.map(function (y) { return x.value + y.value; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onCompleted(210));\n  });\n\n  test('groupJoin normal VIII', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 200)));\n\n    var ys = scheduler.createHotObservable(\n      onNext(220, new TimeInterval('hat', 100)),\n      onCompleted(230));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupJoin(ys, function (x) {\n        return Observable.timer(x.interval, null, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, null, scheduler);\n      }, function (x, yy) {\n        return yy.map(function (y) { return x.value + y.value; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(220, '0hat'));\n  });\n\n  test('groupJoin normal IX', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 300)),\n      onNext(720, new TimeInterval(8, 100)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(900));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(800)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupJoin(ys, function (x) {\n        return Observable.timer(x.interval, null, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, null, scheduler);\n      }, function (x, yy) {\n        return yy.map(function (y) { return x.value + y.value; });\n      }).mergeAll();\n    }, { disposed: 713 });\n\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onNext(310, '4wag'),\n      onNext(310, '4pig'),\n      onNext(310, '4cup'),\n      onNext(702, '6tin'),\n      onNext(710, '7tin'),\n      onNext(712, '6man'),\n      onNext(712, '7man'));\n  });\n\n  test('groupJoin Error I', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onError(310, error));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(800));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupJoin(ys, function (x) {\n        return Observable.timer(x.interval, null, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, null, scheduler);\n      }, function (x, yy) {\n        return yy.map(function (y) { return x.value + y.value; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onError(310, error));\n  });\n\n  test('groupJoin Error II', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 300)),\n      onNext(720, new TimeInterval(8, 100)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(900));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onError(722, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupJoin(ys, function (x) {\n        return Observable.timer(x.interval, null, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, null, scheduler);\n      }, function (x, yy) {\n        return yy.map(function (y) { return x.value + y.value; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onNext(310, '4wag'),\n      onNext(310, '4pig'),\n      onNext(310, '4cup'),\n      onNext(702, '6tin'),\n      onNext(710, '7tin'),\n      onNext(712, '6man'),\n      onNext(712, '7man'),\n      onNext(720, '8tin'),\n      onNext(720, '8man'),\n      onError(722, error));\n  });\n\n  test('groupJoin Error III', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 300)),\n      onNext(720, new TimeInterval(8, 100)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(900));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(800));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupJoin(ys, function (x) {\n        return Observable.timer(x.interval, null, scheduler).flatMap(x.value === 6 ? Observable['throw'](error) : Observable.empty());\n      }, function (y) {\n        return Observable.timer(y.interval, null, scheduler);\n      }, function (x, yy) {\n        return yy.map(function (y) { return x.value + y.value; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onNext(310, '4wag'),\n      onNext(310, '4pig'),\n      onNext(310, '4cup'),\n      onNext(702, '6tin'),\n      onNext(710, '7tin'),\n      onNext(712, '6man'),\n      onNext(712, '7man'),\n      onNext(720, '8tin'),\n      onNext(720, '8man'),\n      onNext(722, '6rat'),\n      onNext(722, '7rat'),\n      onNext(722, '8rat'),\n      onError(725, error));\n  });\n\n  test('groupJoin Error IV', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 300)),\n      onNext(720, new TimeInterval(8, 100)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(900));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 19)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(800));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupJoin(ys, function (x) {\n        return Observable.timer(x.interval, null, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, null, scheduler).flatMap(y.value === 'tin' ? Observable['throw'](error) : Observable.empty());\n      }, function (x, yy) {\n        return yy.map(function (y) { return x.value + y.value; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onNext(310, '4wag'),\n      onNext(310, '4pig'),\n      onNext(310, '4cup'),\n      onNext(702, '6tin'),\n      onNext(710, '7tin'),\n      onNext(712, '6man'),\n      onNext(712, '7man'),\n      onNext(720, '8tin'),\n      onNext(720, '8man'),\n      onError(721, error));\n  });\n\n  test('groupJoin Error V', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 300)),\n      onNext(720, new TimeInterval(8, 100)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(900));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(800));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupJoin(ys, function (x) {\n        if (x.value >= 0) { throw error; }\n        return Observable.empty();\n      }, function (y) {\n        return Observable.timer(y.interval, null, scheduler);\n      }, function (x, yy) {\n        return yy.map(function (y) { return x.value + y.value; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onError(210, error));\n  });\n\n  test('groupJoin Error VI', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 300)),\n      onNext(720, new TimeInterval(8, 100)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(900));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(800));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupJoin(ys, function (x) {\n        return Observable.timer(x.interval, null, scheduler);\n      }, function (y) {\n        if (y.value.length >= 0) { throw error; }\n        return Observable.empty();\n      }, function (x, yy) {\n        return yy.map(function (y) { return x.value + y.value; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onError(215, error));\n  });\n\n  test('groupJoin Error VII', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(215, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 300)),\n      onNext(720, new TimeInterval(8, 100)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(900));\n\n    var ys = scheduler.createHotObservable(\n      onNext(210, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(800));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupJoin(ys, function (x) {\n        return Observable.timer(x.interval, null, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, null, scheduler);\n      }, function (x, yy) {\n        if (x.value >= 0) { throw error; }\n        return yy.map(function (y) { return x.value + y.value; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onError(215, error));\n  });\n\n  test('groupJoin Error VIII', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 300)),\n      onNext(720, new TimeInterval(8, 100)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(900));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(800));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.groupJoin(ys, function (x) {\n        return Observable.timer(x.interval, null, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, null, scheduler);\n      }, function (x, yy) {\n        if (x.value >= 0) { throw error; }\n        return yy.map(function (y) { return x.value + y.value; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onError(210, error));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/if.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('If');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('If True', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(250, 2),\n      onCompleted(300));\n\n    var ys = scheduler.createHotObservable(\n      onNext(310, 3),\n      onNext(350, 4),\n      onCompleted(400));\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['if'](function () { return true; }, xs, ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(250, 2),\n      onCompleted(300));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300));\n\n    ys.subscriptions.assertEqual();\n  });\n\n  test('If False', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(250, 2),\n      onCompleted(300));\n\n    var ys = scheduler.createHotObservable(\n      onNext(310, 3),\n      onNext(350, 4),\n      onCompleted(400));\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['if'](function () { return false; }, xs, ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 3),\n      onNext(350, 4),\n      onCompleted(400));\n\n    xs.subscriptions.assertEqual();\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 400));\n  });\n\n  test('If Throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(250, 2),\n      onCompleted(300));\n\n    var ys = scheduler.createHotObservable(\n      onNext(310, 3),\n      onNext(350, 4),\n      onCompleted(400));\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['if'](function () { throw error; }, xs, ys);\n    });\n\n    results.messages.assertEqual(\n      onError(200, error));\n\n    xs.subscriptions.assertEqual();\n\n    ys.subscriptions.assertEqual();\n  });\n\n  test('If Dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(250, 2));\n\n    var ys = scheduler.createHotObservable(\n      onNext(310, 3),\n      onNext(350, 4),\n      onCompleted(400));\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['if'](function () { return true; }, xs, ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(250, 2));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000));\n\n    ys.subscriptions.assertEqual();\n  });\n\n  test('If Default Completed', function () {\n    var b = false;\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(220, 2),\n      onNext(330, 3),\n      onCompleted(440));\n\n    scheduler.scheduleAbsolute(null, 150, function () {\n      b = true;\n    });\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['if'](function () { return b; }, xs);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 2),\n      onNext(330, 3),\n      onCompleted(440));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 440));\n  });\n\n  test('If Default Error', function () {\n    var error = new Error();\n\n    var b = false;\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(220, 2),\n      onNext(330, 3),\n      onError(440, error));\n\n    scheduler.scheduleAbsolute(null, 150, function () {\n      b = true;\n    });\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['if'](function () { return b; }, xs);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 2),\n      onNext(330, 3),\n      onError(440, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 440));\n  });\n\n  test('If Default Never', function () {\n    var b = false;\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(220, 2),\n      onNext(330, 3));\n\n    scheduler.scheduleAbsolute(null, 150, function () {\n      b = true;\n    });\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['if'](function () { return b; }, xs);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 2),\n      onNext(330, 3));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000));\n  });\n\n  test('If Default Other', function () {\n    var b = true;\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(220, 2),\n      onNext(330, 3),\n      onError(440, new Error()));\n\n    scheduler.scheduleAbsolute(null, 150, function () {\n      b = false;\n    });\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['if'](function () { return b; }, xs);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(200));\n\n    xs.subscriptions.assertEqual();\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/ignoreelements.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('ignoreElements');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('ignoreElements Basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.ignoreElements();\n    });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(subscribe(200, 1000));\n  });\n\n  test('ignoreElements Completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onCompleted(610));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.ignoreElements();\n    });\n\n    results.messages.assertEqual(\n      onCompleted(610));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 610));\n  });\n\n  test('ignoreElements Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onError(610, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.ignoreElements();\n    });\n\n    results.messages.assertEqual(\n      onError(610, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 610));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/includes.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('Includes');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('includes Empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.includes(42);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, false),\n      onCompleted(250)\n    );\n  });\n\n  test('includes return positive', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.includes(2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, true),\n      onCompleted(210)\n    );\n  });\n\n  test('includes return negative', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.includes(-2);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, false),\n      onCompleted(250)\n    );\n  });\n\n  test('includes some positive', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.includes(3);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, true),\n      onCompleted(220)\n    );\n  });\n\n  test('includes some negative', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.includes(-3);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, false),\n      onCompleted(250)\n    );\n  });\n\n  test('includes throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.includes(42);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('includes never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.includes(42);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('includes fromIndex less than zero', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.includes(42, -1);\n    });\n\n    results.messages.assertEqual(\n      onNext(200, false),\n      onCompleted(200)\n    );\n  });\n\n  test('includes fromIndex Infinity', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.includes(2, Infinity);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, true),\n      onCompleted(210)\n    );\n  });\n\n  test('includes fromIndex zero', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.includes(2, 0);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, true),\n      onCompleted(210)\n    );\n  });\n\n  test('includes fromIndex greater than zero misses', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.includes(2, 1);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, false),\n      onCompleted(250)\n    );\n  });\n\n  test('includes fromIndex greater than zero no end', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.includes(2, 1);\n    });\n\n    results.messages.assertEqual(\n    );\n  });\n\n  test('includes fromIndex greater than zero hits', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.includes(3, 1);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, true),\n      onCompleted(220)\n    );\n  });\n\n  test('includes -0 equals 0', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, -0),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.includes(0);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, true),\n      onCompleted(210)\n    );\n  });\n\n  test('includes +0 equals 0', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, +0),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.includes(0);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, true),\n      onCompleted(210)\n    );\n  });\n\n  test('includes NaN equals NaN', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, NaN),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.includes(NaN);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, true),\n      onCompleted(210)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/indexof.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('indexOf');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('indexOf empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.indexOf(42);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, -1),\n      onCompleted(250)\n    );\n  });\n\n  test('indexOf return positive', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.indexOf(2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 0),\n      onCompleted(210)\n    );\n  });\n\n  test('indexOf return negative', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.indexOf(-2);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, -1),\n      onCompleted(250)\n    );\n  });\n\n  test('indexOf some positive', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.indexOf(3);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 1),\n      onCompleted(220)\n    );\n  });\n\n  test('indexOf some negative', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.indexOf(-3);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, -1),\n      onCompleted(250)\n    );\n  });\n\n  test('indexOf throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.indexOf(42);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('indexOf never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.indexOf(42);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('indexOf fromIndex less than zero', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.indexOf(42, -1);\n    });\n\n    results.messages.assertEqual(\n      onNext(200, -1),\n      onCompleted(200)\n    );\n  });\n\n  test('indexOf fromIndex Infinity', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.indexOf(2, Infinity);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 0),\n      onCompleted(210)\n    );\n  });\n\n  test('indexOf fromIndex zero', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.indexOf(2, 0);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 0),\n      onCompleted(210)\n    );\n  });\n\n  test('indexOf fromIndex greater than zero misses', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.indexOf(2, 1);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, -1),\n      onCompleted(250)\n    );\n  });\n\n  test('indexOf fromIndex greater than zero no end', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.indexOf(2, 1);\n    });\n\n    results.messages.assertEqual(\n    );\n  });\n\n  test('indexOf fromIndex greater than zero hits', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.indexOf(3, 1);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 1),\n      onCompleted(220)\n    );\n  });\n\n  test('indexOf -0 equals 0', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, -0),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.indexOf(0);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 0),\n      onCompleted(210)\n    );\n  });\n\n  test('indexOf +0 equals 0', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, +0),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.indexOf(0);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 0),\n      onCompleted(210)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/interval.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, raises */\n\n  QUnit.module('interval');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext;\n\n  test('interval relative time basic', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.interval(100, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 0),\n      onNext(400, 1),\n      onNext(500, 2),\n      onNext(600, 3),\n      onNext(700, 4),\n      onNext(800, 5),\n      onNext(900, 6));\n  });\n\n  test('interval relative time zero', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.interval(0, scheduler);\n    }, { disposed: 210 });\n\n    results.messages.assertEqual(\n      onNext(201, 0),\n      onNext(202, 1),\n      onNext(203, 2),\n      onNext(204, 3),\n      onNext(205, 4),\n      onNext(206, 5),\n      onNext(207, 6),\n      onNext(208, 7),\n      onNext(209, 8));\n  });\n\n  test('interval relative time Negative', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.interval(-1, scheduler);\n    }, {disposed: 210 });\n\n    results.messages.assertEqual(\n      onNext(201, 0),\n      onNext(202, 1),\n      onNext(203, 2),\n      onNext(204, 3),\n      onNext(205, 4),\n      onNext(206, 5),\n      onNext(207, 6),\n      onNext(208, 7),\n      onNext(209, 8));\n  });\n\n  test('interval relative time disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.interval(1000, scheduler);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('interval relative time observer throws', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = Observable.interval(1, scheduler);\n\n    xs.subscribe(function () { throw new Error(); });\n\n    raises(function () { return scheduler.start(); });\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/isempty.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('isEmpty');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('isEmpty Empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(onNext(150, 1), onCompleted(250));\n    var results = scheduler.startScheduler(function () {\n        return xs.isEmpty();\n    });\n    results.messages.assertEqual(onNext(250, true), onCompleted(250));\n    xs.subscriptions.assertEqual(subscribe(200, 250));\n  });\n\n  test('isEmpty Return', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(onNext(150, 1), onNext(210, 2), onCompleted(250));\n    var results = scheduler.startScheduler(function () {\n        return xs.isEmpty();\n    });\n\n    results.messages.assertEqual(\n      onNext(210, false),\n      onCompleted(210));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 210));\n  });\n\n  test('isEmpty Throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.isEmpty();\n    });\n\n    results.messages.assertEqual(\n      onError(210, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 210));\n  });\n\n  test('isEmpty Never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.isEmpty();\n    });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/join.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('join');\n\n  var TestScheduler = Rx.TestScheduler,\n      Observable = Rx.Observable,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  function TimeInterval(value, interval) {\n    this.value = value;\n    this.interval = interval;\n  }\n\n  test('join normal I', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 300)),\n      onNext(720, new TimeInterval(8, 100)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(900));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(800));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.join(ys, function (x) {\n        return Observable.timer(x.interval, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, scheduler);\n      }, function (x, y) {\n        return x.value + y.value;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onNext(310, '4wag'),\n      onNext(310, '4pig'),\n      onNext(310, '4cup'),\n      onNext(702, '6tin'),\n      onNext(710, '7tin'),\n      onNext(712, '6man'),\n      onNext(712, '7man'),\n      onNext(720, '8tin'),\n      onNext(720, '8man'),\n      onNext(722, '6rat'),\n      onNext(722, '7rat'),\n      onNext(722, '8rat'),\n      onNext(732, '7wig'),\n      onNext(732, '8wig'),\n      onNext(830, '9rat'),\n      onCompleted(900));\n  });\n\n  test('join normal II', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 200)),\n      onNext(720, new TimeInterval(8, 100)),\n      onCompleted(721));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(990));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.join(ys, function (x) {\n        return Observable.timer(x.interval, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, scheduler);\n      }, function (x, y) {\n        return x.value + y.value;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onNext(310, '4wag'),\n      onNext(310, '4pig'),\n      onNext(310, '4cup'),\n      onNext(702, '6tin'),\n      onNext(710, '7tin'),\n      onNext(712, '6man'),\n      onNext(712, '7man'),\n      onNext(720, '8tin'),\n      onNext(720, '8man'),\n      onNext(722, '6rat'),\n      onNext(722, '7rat'),\n      onNext(722, '8rat'),\n      onNext(732, '7wig'),\n      onNext(732, '8wig'),\n      onCompleted(910));\n  });\n\n  test('join normal III', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 300)),\n      onNext(720, new TimeInterval(8, 100)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(900));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(800));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.join(ys, function (x) {\n        return Observable.timer(x.interval, null, scheduler).filter(function () {\n          return false;\n        });\n      }, function (y) {\n        return Observable.timer(y.interval, null, scheduler).filter(function () {\n          return false;\n        });\n      }, function (x, y) {\n        return x.value + y.value;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onNext(310, '4wag'),\n      onNext(310, '4pig'),\n      onNext(310, '4cup'),\n      onNext(702, '6tin'),\n      onNext(710, '7tin'),\n      onNext(712, '6man'),\n      onNext(712, '7man'),\n      onNext(720, '8tin'),\n      onNext(720, '8man'),\n      onNext(722, '6rat'),\n      onNext(722, '7rat'),\n      onNext(722, '8rat'),\n      onNext(732, '7wig'),\n      onNext(732, '8wig'),\n      onNext(830, '9rat'),\n      onCompleted(900));\n  });\n\n  test('join normal IV', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 200)),\n      onNext(720, new TimeInterval(8, 100)),\n      onCompleted(990));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(980));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.join(ys, function (x) {\n        return Observable.timer(x.interval, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, scheduler);\n      }, function (x, y) {\n        return x.value + y.value;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onNext(310, '4wag'),\n      onNext(310, '4pig'),\n      onNext(310, '4cup'),\n      onNext(702, '6tin'),\n      onNext(710, '7tin'),\n      onNext(712, '6man'),\n      onNext(712, '7man'),\n      onNext(720, '8tin'),\n      onNext(720, '8man'),\n      onNext(722, '6rat'),\n      onNext(722, '7rat'),\n      onNext(722, '8rat'),\n      onNext(732, '7wig'),\n      onNext(732, '8wig'),\n      onCompleted(980));\n  });\n\n  test('join normal V', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 200)),\n      onNext(720, new TimeInterval(8, 100)),\n      onCompleted(990));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(900));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.join(ys, function (x) {\n        return Observable.timer(x.interval, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, scheduler);\n      }, function (x, y) {\n        return x.value + y.value;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onNext(310, '4wag'),\n      onNext(310, '4pig'),\n      onNext(310, '4cup'),\n      onNext(702, '6tin'),\n      onNext(710, '7tin'),\n      onNext(712, '6man'),\n      onNext(712, '7man'),\n      onNext(720, '8tin'),\n      onNext(720, '8man'),\n      onNext(722, '6rat'),\n      onNext(722, '7rat'),\n      onNext(722, '8rat'),\n      onNext(732, '7wig'),\n      onNext(732, '8wig'),\n      onCompleted(922));\n  });\n\n  test('join normal VI', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 30)),\n      onNext(720, new TimeInterval(8, 200)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(850));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 20)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(900));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.join(ys, function (x) {\n        return Observable.timer(x.interval, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, scheduler);\n      }, function (x, y) {\n        return x.value + y.value;\n      });\n  });\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onNext(310, '4wag'),\n      onNext(310, '4pig'),\n      onNext(310, '4cup'),\n      onNext(702, '6tin'),\n      onNext(710, '7tin'),\n      onNext(712, '6man'),\n      onNext(712, '7man'),\n      onNext(720, '8tin'),\n      onNext(720, '8man'),\n      onNext(722, '6rat'),\n      onNext(722, '7rat'),\n      onNext(722, '8rat'),\n      onNext(732, '7wig'),\n      onNext(732, '8wig'),\n      onCompleted(900));\n  });\n\n  test('join normal VII', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 300)),\n      onNext(720, new TimeInterval(8, 100)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(900));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(800));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.join(ys, function (x) {\n        return Observable.timer(x.interval, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, scheduler);\n      }, function (x, y) {\n        return x.value + y.value;\n      });\n    }, { disposed: 713 });\n\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onNext(310, '4wag'),\n      onNext(310, '4pig'),\n      onNext(310, '4cup'),\n      onNext(702, '6tin'),\n      onNext(710, '7tin'),\n      onNext(712, '6man'),\n      onNext(712, '7man'));\n  });\n\n  test('join error I', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onError(310, error));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(800));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.join(ys, function (x) {\n        return Observable.timer(x.interval, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, scheduler);\n      }, function (x, y) {\n        return x.value + y.value;\n      });\n    }, { disposed: 713 });\n\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onError(310, error));\n  });\n\n  test('join error II', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 300)),\n      onNext(720, new TimeInterval(8, 100)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(900));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onError(722, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.join(ys, function (x) {\n        return Observable.timer(x.interval, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, scheduler);\n      }, function (x, y) {\n        return x.value + y.value;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onNext(310, '4wag'),\n      onNext(310, '4pig'),\n      onNext(310, '4cup'),\n      onNext(702, '6tin'),\n      onNext(710, '7tin'),\n      onNext(712, '6man'),\n      onNext(712, '7man'),\n      onNext(720, '8tin'),\n      onNext(720, '8man'),\n      onError(722, error));\n  });\n\n  test('join error III', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 300)),\n      onNext(720, new TimeInterval(8, 100)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(900));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(800));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.join(ys, function (x) {\n        return Observable.timer(x.interval, null, scheduler)\n          .flatMap(x.value === 6 ? Observable['throw'](error) : Observable.empty());\n      }, function (y) {\n        return Observable.timer(y.interval, scheduler);\n      }, function (x, y) {\n        return x.value + y.value;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onNext(310, '4wag'),\n      onNext(310, '4pig'),\n      onNext(310, '4cup'),\n      onNext(702, '6tin'),\n      onNext(710, '7tin'),\n      onNext(712, '6man'),\n      onNext(712, '7man'),\n      onNext(720, '8tin'),\n      onNext(720, '8man'),\n      onNext(722, '6rat'),\n      onNext(722, '7rat'),\n      onNext(722, '8rat'),\n      onError(725, error));\n  });\n\n  test('join error IV', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 300)),\n      onNext(720, new TimeInterval(8, 100)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(900));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 19)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(800));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.join(ys, function (x) {\n        return Observable.timer(x.interval, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, null, scheduler)\n          .flatMap(y.value === 'tin' ? Observable['throw'](error) : Observable.empty());\n      }, function (x, y) {\n        return x.value + y.value;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(215, '0hat'),\n      onNext(217, '0bat'),\n      onNext(219, '1hat'),\n      onNext(300, '3wag'),\n      onNext(300, '3pig'),\n      onNext(305, '3cup'),\n      onNext(310, '4wag'),\n      onNext(310, '4pig'),\n      onNext(310, '4cup'),\n      onNext(702, '6tin'),\n      onNext(710, '7tin'),\n      onNext(712, '6man'),\n      onNext(712, '7man'),\n      onNext(720, '8tin'),\n      onNext(720, '8man'),\n      onError(721, error));\n  });\n\n  test('join error V', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 300)),\n      onNext(720, new TimeInterval(8, 100)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(900));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(800));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.join(ys, function (x) {\n        if (x.value >= 0) { throw error; }\n        return Observable.empty();\n      }, function (y) {\n        return Observable.timer(y.interval, scheduler);\n      }, function (x, y) {\n        return x.value + y.value;\n      });\n    });\n\n    results.messages.assertEqual(\n      onError(210, error));\n  });\n\n  test('join error VI', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 300)),\n      onNext(720, new TimeInterval(8, 100)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(900));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(800));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.join(ys, function (x) {\n        return Observable.timer(x.interval, scheduler);\n      }, function (y) {\n        if (y.value.length >= 0) { throw error; }\n        return Observable.empty();\n      }, function (x, y) {\n        return x.value + y.value;\n      });\n    });\n\n    results.messages.assertEqual(\n      onError(215, error));\n  });\n\n  test('join error VII', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 300)),\n      onNext(720, new TimeInterval(8, 100)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(900));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(800));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.join(ys, function (x) {\n        return Observable.timer(x.interval, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, scheduler);\n      }, function (x, y) {\n        if (x.value >= 0) { throw error; }\n        return x.value + y.value;\n      });\n    });\n\n    results.messages.assertEqual(\n      onError(215, error));\n  });\n\n  test('join error VIII', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, new TimeInterval(0, 10)),\n      onNext(219, new TimeInterval(1, 5)),\n      onNext(240, new TimeInterval(2, 10)),\n      onNext(300, new TimeInterval(3, 100)),\n      onNext(310, new TimeInterval(4, 80)),\n      onNext(500, new TimeInterval(5, 90)),\n      onNext(700, new TimeInterval(6, 25)),\n      onNext(710, new TimeInterval(7, 300)),\n      onNext(720, new TimeInterval(8, 100)),\n      onNext(830, new TimeInterval(9, 10)),\n      onCompleted(900));\n\n    var ys = scheduler.createHotObservable(\n      onNext(215, new TimeInterval('hat', 20)),\n      onNext(217, new TimeInterval('bat', 1)),\n      onNext(290, new TimeInterval('wag', 200)),\n      onNext(300, new TimeInterval('pig', 10)),\n      onNext(305, new TimeInterval('cup', 50)),\n      onNext(600, new TimeInterval('yak', 90)),\n      onNext(702, new TimeInterval('tin', 20)),\n      onNext(712, new TimeInterval('man', 10)),\n      onNext(722, new TimeInterval('rat', 200)),\n      onNext(732, new TimeInterval('wig', 5)),\n      onCompleted(800));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.join(ys, function (x) {\n        return Observable.timer(x.interval, scheduler);\n      }, function (y) {\n        return Observable.timer(y.interval, scheduler);\n      }, function (x, y) {\n        if (x.value >= 0) { throw error; }\n        return x.value + y.value;\n      });\n    });\n\n    results.messages.assertEqual(\n      onError(215, error));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/jortsort.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('jorSort');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('jortSort never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1)\n    );\n\n    var results = scheduler.startWithCreate(function () {\n      return xs.jortSort();\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('jortSort empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startWithCreate(function () {\n      return xs.jortSort();\n    });\n\n    results.messages.assertEqual(\n      onNext(250, true),\n      onCompleted(250)\n    );\n  });\n\n  test('jortSort error', function () {\n    var scheduler = new TestScheduler();\n    var error = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onError(250, error)\n    );\n\n    var results = scheduler.startWithCreate(function () {\n      return xs.jortSort();\n    });\n\n    results.messages.assertEqual(\n      onError(250, error)\n    );\n  });\n\n  test('jortSort returns true', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startWithCreate(function () {\n      return xs.jortSort();\n    });\n\n    results.messages.assertEqual(\n      onNext(250, true),\n      onCompleted(250)\n    );\n  });\n\n  test('jortSort returns false', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 5),\n      onNext(220, 3),\n      onNext(230, 2),\n      onNext(240, 4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startWithCreate(function () {\n      return xs.jortSort();\n    });\n\n    results.messages.assertEqual(\n      onNext(250, false),\n      onCompleted(250)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/jortsortuntil.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('jortSortUntil');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('jortSortUntil never never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(190, 1)\n    );\n\n    var results = scheduler.startWithCreate(function () {\n      return xs.jortSortUntil(ys);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  // TODO: Is empty really sorted or is it a headfake?\n  test('jortSortUntil empty never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onCompleted(250)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(190, 1)\n    );\n\n    var results = scheduler.startWithCreate(function () {\n      return xs.jortSortUntil(ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(true),\n      onCompleted(250)\n    );\n  });\n\n  test('jortSortUntil error never', function () {\n    var scheduler = new TestScheduler();\n    var error = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onError(250, error)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(190, 1)\n    );\n\n    var results = scheduler.startWithCreate(function () {\n      return xs.jortSortUntil(ys);\n    });\n\n    results.messages.assertEqual(\n      onError(250, error)\n    );\n  });\n\n  test('jortSortUntil error empty', function () {\n    var scheduler = new TestScheduler();\n    var error = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onError(250, error)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(190, 1)\n    );\n\n    var results = scheduler.startWithCreate(function () {\n      return xs.jortSortUntil(ys);\n    });\n\n    results.messages.assertEqual(\n      onError(250, error)\n    );\n  });\n\n  test('jortSortUntil error pre-empted', function () {\n    var scheduler = new TestScheduler();\n    var error = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onError(250, error)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(190, 1),\n      onNext(245, 2),\n      onCompleted(255)\n    );\n\n    var results = scheduler.startWithCreate(function () {\n      return xs.jortSortUntil(ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(245, true),\n      onCompleted(245)\n    );\n  });\n\n  test('jortSortUntil pre-empted true', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(190, 1),\n      onNext(245, 2),\n      onCompleted(255)\n    );\n\n    var results = scheduler.startWithCreate(function () {\n      return xs.jortSortUntil(ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(245, true),\n      onCompleted(245)\n    );\n  });\n\n  test('jortSortUntil pre-empted false', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 4),\n      onNext(220, 3),\n      onNext(230, 2),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(190, 1),\n      onNext(245, 2),\n      onCompleted(255)\n    );\n\n    var results = scheduler.startWithCreate(function () {\n      return xs.jortSortUntil(ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(245, false),\n      onCompleted(245)\n    );\n  });\n\n  test('jortSortUntil not pre-empted true', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(190, 1),\n      onNext(255, 2),\n      onCompleted(265)\n    );\n\n    var results = scheduler.startWithCreate(function () {\n      return xs.jortSortUntil(ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, true),\n      onCompleted(250)\n    );\n  });\n\n  test('jortSortUntil not pre-empted false', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 4),\n      onNext(220, 3),\n      onNext(230, 2),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(190, 1),\n      onNext(255, 2),\n      onCompleted(265)\n    );\n\n    var results = scheduler.startWithCreate(function () {\n      return xs.jortSortUntil(ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, false),\n      onCompleted(250)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/last.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal */\n  QUnit.module('last');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('last Empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.last();\n    });\n\n    results.messages.assertEqual(\n      onError(250, function (n) { return n.error instanceof Rx.EmptyError; })\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 250));\n  });\n\n  test('last default value', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.last({defaultValue: 42});\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 42),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 250));\n  });\n\n  test('last One', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.last();\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 2),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 250));\n  });\n\n  test('last Many', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.last();\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 3),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 250));\n  });\n\n  test('last Error', function () {\n    var ex = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, ex)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.last();\n    });\n\n    results.messages.assertEqual(onError(210, ex));\n\n    xs.subscriptions.assertEqual(subscribe(200, 210));\n  });\n\n  test('last predicate', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.last(function (x) {\n        return x % 2 === 1;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 5),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 250));\n  });\n\n  test('last Obj predicate', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.last({\n        predicate: function (x) {\n          return x % 2 === 1;\n        }\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 5),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 250));\n  });\n\n  test('last predicate thisArg', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.last(function (x) {\n        equal(this, 42);\n        return x % 2 === 1;\n      }, 42);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 5),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 250));\n  });\n\n  test('last Obj predicate', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.last({\n        predicate: function (x) {\n          equal(this, 42);\n          return x % 2 === 1;\n        },\n        thisArg: 42\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 5),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 250));\n  });\n\n  test('last predicate None', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.last(function (x) {\n        return x > 10;\n      });\n    });\n\n    results.messages.assertEqual(\n      onError(250, function (n) { return n.error instanceof Rx.EmptyError; })\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 250));\n  });\n\n  test('last Obj predicate none default', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.last({\n        predicate: function (x) {\n          return x > 10;\n        },\n        defaultValue: 42\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 42),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 250));\n  });\n\n  test('last predicate Throw', function () {\n    var ex = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, ex)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.last(function (x) {\n        return x % 2 === 1;\n      });\n    });\n\n    results.messages.assertEqual(onError(210, ex));\n\n    xs.subscriptions.assertEqual(subscribe(200, 210));\n  });\n\n  test('last predicate throws', function () {\n    var ex = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.last(function (x) {\n        if (x < 4) {\n          return x % 2 === 1;\n        }\n        throw ex;\n      });\n    });\n\n    results.messages.assertEqual(onError(230, ex));\n\n    xs.subscriptions.assertEqual(subscribe(200, 230));\n  });\n}());\n"
  },
  {
    "path": "tests/observable/lastindexof.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('lastIndexOf');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('lastIndexOf empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.lastIndexOf(42);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, -1),\n      onCompleted(250)\n    );\n  });\n\n  test('lastIndexOf return positive', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.lastIndexOf(2);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 0),\n      onCompleted(250)\n    );\n  });\n\n  test('lastIndexOf return negative', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.lastIndexOf(-2);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, -1),\n      onCompleted(250)\n    );\n  });\n\n  test('lastIndexOf some positive', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.lastIndexOf(3);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 1),\n      onCompleted(250)\n    );\n  });\n\n  test('lastIndexOf some negative', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.lastIndexOf(-3);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, -1),\n      onCompleted(250)\n    );\n  });\n\n  test('lastIndexOf throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.lastIndexOf(42);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('lastIndexOf never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.lastIndexOf(42);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('lastIndexOf fromIndex less than zero', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.lastIndexOf(42, -1);\n    });\n\n    results.messages.assertEqual(\n      onNext(200, -1),\n      onCompleted(200)\n    );\n  });\n\n  test('lastIndexOf fromIndex Infinity', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.lastIndexOf(2, Infinity);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 0),\n      onCompleted(250)\n    );\n  });\n\n  test('lastIndexOf fromIndex zero', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.lastIndexOf(2, 0);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 0),\n      onCompleted(250)\n    );\n  });\n\n  test('lastIndexOf fromIndex greater than zero misses', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.lastIndexOf(2, 1);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, -1),\n      onCompleted(250)\n    );\n  });\n\n  test('lastIndexOf fromIndex greater than zero no end', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.lastIndexOf(2, 1);\n    });\n\n    results.messages.assertEqual(\n    );\n  });\n\n  test('lastIndexOf fromIndex greater than zero hits', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.lastIndexOf(3, 1);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 1),\n      onCompleted(250)\n    );\n  });\n\n  test('lastIndexOf -0 equals 0', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, -0),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.lastIndexOf(0);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 0),\n      onCompleted(250)\n    );\n  });\n\n  test('lastIndexOf +0 equals 0', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, +0),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.lastIndexOf(0);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 0),\n      onCompleted(250)\n    );\n  });\n\n  test('lastIndexOf hits the last without end', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 2),\n      onNext(240, 3),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.lastIndexOf(2);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 2),\n      onCompleted(250)\n    );\n  });\n\n  test('lastIndexOf hits the last with end', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 2),\n      onNext(240, 3),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.lastIndexOf(2, 2);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 2),\n      onCompleted(250)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/let.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, ok */\n  QUnit.module('let');\n\n  var Observable = Rx.Observable;\n\n  test('let calls function immediately', function () {\n    var called = false;\n\n    Observable.empty()['let'](function (x) {\n      called = true;\n      return x;\n    });\n\n    ok(called);\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/manyselect.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, ok */\n  QUnit.module('manySelect');\n\n  var Observable = Rx.Observable,\n    TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe;\n\n  test('manySelect Law 1', function () {\n    var xs = Observable.range(1, 0);\n\n    var left = xs.manySelect(function (x) { return x.first(); });\n    var right = xs;\n\n    left.sequenceEqual(right).first().subscribe(ok);\n  });\n\n  test('manySelect Basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(100, 1),\n      onNext(220, 2),\n      onNext(270, 3),\n      onNext(410, 4),\n      onCompleted(500)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.manySelect(function (ys) { return ys.first(); }, scheduler).mergeAll();\n    });\n\n    res.messages.assertEqual(\n      onNext(221, 2),\n      onNext(271, 3),\n      onNext(411, 4),\n      onCompleted(501)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 500)\n    );\n  });\n\n  test('manySelect Error', function () {\n    var scheduler = new TestScheduler();\n\n    var ex = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(100, 1),\n      onNext(220, 2),\n      onNext(270, 3),\n      onNext(410, 4),\n      onError(500, ex)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.manySelect(function (ys) { return ys.first(); }, scheduler).mergeAll();\n    });\n\n    res.messages.assertEqual(\n      onNext(221, 2),\n      onNext(271, 3),\n      onNext(411, 4),\n      onError(501, ex)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 500)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/materialize.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('materialize');\n\n  var Notification = Rx.Notification,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('materialize never', function () {\n      var scheduler = new TestScheduler();\n      var results = scheduler.startScheduler(function () {\n        return Rx.Observable.never().materialize();\n      });\n\n      results.messages.assertEqual();\n  });\n\n  test('materialize empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1), onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.materialize();\n    });\n\n    results.messages.assertEqual(\n      onNext(250, Notification.createOnCompleted()),\n      onCompleted(250)\n    );\n  });\n\n  test('materialize return', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.materialize();\n    });\n\n    results.messages.assertEqual(\n      onNext(210, Notification.createOnNext(2)),\n      onNext(250, Notification.createOnCompleted()),\n      onCompleted(250)\n    );\n  });\n\n  test('materialize throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(250, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.materialize();\n    });\n\n    results.messages.assertEqual(\n      onNext(250, Notification.createOnError(error)),\n      onCompleted(250)\n    );\n  });\n\n  test('materialize dematerialize never', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Rx.Observable.never().materialize().dematerialize();\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('materialize dematerialize empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.materialize().dematerialize();\n    });\n\n    results.messages.assertEqual(\n      onCompleted(250)\n    );\n  });\n\n  test('materialize dematerialize return', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.materialize().dematerialize();\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onCompleted(250)\n    );\n  });\n\n  test('materialize dematerialize throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(250, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.materialize().dematerialize();\n    });\n\n    results.messages.assertEqual(\n      onError(250, error)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/max.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('max');\n\n  function reverseComparer(a, b) {\n    return a > b ? -1 : a < b ? 1 : 0;\n  }\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('max number empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.max();\n    });\n\n    results.messages.assertEqual(\n      onError(250, function (n) { return n.error instanceof Rx.EmptyError; })\n    );\n  });\n\n  test('max number Return', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.max();\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 2),\n      onCompleted(250));\n  });\n\n  test('max number Some', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 3),\n      onNext(220, 4),\n      onNext(230, 2),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.max();\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 4),\n      onCompleted(250));\n  });\n\n  test('max number throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.max();\n    });\n\n    results.messages.assertEqual(\n      onError(210, error));\n  });\n\n  test('max number Never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1));\n\n    var results = scheduler.startScheduler(function () {\n        return xs.max();\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('max comparer empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.max(reverseComparer);\n    });\n\n    results.messages.assertEqual(\n      onError(250, function (n) { return n.error instanceof Rx.EmptyError; })\n    );\n  });\n\n  test('max comparer return', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 'z'),\n      onNext(210, 'a'),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.max(reverseComparer);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 'a'),\n      onCompleted(250));\n  });\n\n  test('max comparer some', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 'z'),\n      onNext(210, 'b'),\n      onNext(220, 'c'),\n      onNext(230, 'a'),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.max(reverseComparer);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 'a'),\n      onCompleted(250));\n  });\n\n  test('max comparer throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 'z'),\n      onError(210, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.max(reverseComparer);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error));\n  });\n\n  test('max comparer never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 'z'));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.max(reverseComparer);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('max comparer throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 'z'),\n      onNext(210, 'b'),\n      onNext(220, 'c'),\n      onNext(230, 'a'),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.max(function () { throw error; });\n    });\n\n    results.messages.assertEqual(\n      onError(220, error));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/maxby.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('maxBy');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n\n  function reverseComparer(a, b) {\n    return a > b ? -1 : a < b ? 1 : 0;\n  }\n\n  test('maxBy empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.maxBy(function (x) { return x.key; });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, []),\n      onCompleted(250)\n    );\n  });\n\n  test('maxBy return', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onNext(210, { key: 2, value: 'a' }),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.maxBy(function (x) { return x.key; });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, [{ key: 2, value: 'a' }]),\n      onCompleted(250)\n    );\n  });\n\n  test('maxBy some', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onNext(210, { key: 3, value: 'b' }),\n      onNext(220, { key: 4, value: 'c' }),\n      onNext(230, { key: 2, value: 'a' }),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.maxBy(function (x) { return x.key; });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, [{ key: 4, value: 'c' }]),\n      onCompleted(250)\n    );\n  });\n\n  test('maxBy multiple', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onNext(210, { key: 3, value: 'b' }),\n      onNext(215, { key: 2, value: 'd' }),\n      onNext(220, { key: 3, value: 'c' }),\n      onNext(225, { key: 2, value: 'y' }),\n      onNext(230, { key: 4, value: 'a' }),\n      onNext(235, { key: 4, value: 'r' }),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.maxBy(function (x) { return x.key; });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, [{ key: 4, value: 'a' }, { key: 4, value: 'r' }]),\n      onCompleted(250)\n    );\n  });\n\n  test('maxBy throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.maxBy(function (x) { return x.key; });\n    });\n\n    results.messages.assertEqual(\n      onError(210, error));\n  });\n\n  test('maxBy never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.maxBy(function (x) { return x.key; });\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('maxBy comparer empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.maxBy(function (x) { return x.key; }, reverseComparer);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, []),\n      onCompleted(250)\n    );\n  });\n\n  test('maxBy comparer return', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onNext(210, { key: 2, value: 'a' }),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.maxBy(function (x) { return x.key; }, reverseComparer);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, [{ key: 2, value: 'a' }]),\n      onCompleted(250)\n    );\n  });\n\n  test('maxBy comparer some', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onNext(210, { key: 3, value: 'b' }),\n      onNext(220, { key: 4, value: 'c' }),\n      onNext(230, { key: 2, value: 'a' }),\n      onCompleted(250)\n    );\n    var results = scheduler.startScheduler(function () {\n      return xs.maxBy(function (x) { return x.key; }, reverseComparer);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, [{ key: 2, value: 'a' }]),\n      onCompleted(250)\n    );\n  });\n\n  test('maxBy comparer throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.maxBy(function (x) { return x.key; }, reverseComparer);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error));\n  });\n\n  test('maxBy comparer never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.maxBy(function (x) { return x.key; }, reverseComparer);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('maxBy selector throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onNext(210, { key: 3, value: 'b' }),\n      onNext(220, { key: 2, value: 'c' }),\n      onNext(230, { key: 4, value: 'a' }),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.maxBy(function () { throw error; }, reverseComparer);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error));\n  });\n\n  test('maxBy comparer throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onNext(210, { key: 3, value: 'b' }),\n      onNext(220, { key: 2, value: 'c' }),\n      onNext(230, { key: 4, value: 'a' }),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.maxBy(function (x) { return x.key; }, function () { throw error; });\n    });\n\n    results.messages.assertEqual(\n      onError(220, error));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/merge.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, ok, equal */\n  QUnit.module('merge');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('merge never 2', function () {\n    var scheduler = new TestScheduler();\n\n    var n1 = Observable.never();\n    var n2 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.merge(scheduler, n1, n2);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('merge never 3', function () {\n    var scheduler = new TestScheduler();\n\n    var n1 = Observable.never();\n    var n2 = Observable.never();\n    var n3 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.merge(scheduler, n1, n2, n3);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('merge empty2', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = Observable.empty();\n    var e2 = Observable.empty();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.merge(scheduler, e1, e2);\n    });\n\n    results.messages.assertEqual(onCompleted(203));\n  });\n\n  test('merge empty3', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = Observable.empty();\n    var e2 = Observable.empty();\n    var e3 = Observable.empty();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.merge(scheduler, e1, e2, e3);\n    });\n\n    results.messages.assertEqual(onCompleted(204));\n  });\n\n  test('merge empty delayed 2 right last', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(onNext(150, 1), onCompleted(240));\n    var e2 = scheduler.createHotObservable(onNext(150, 1), onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.merge(scheduler, e1, e2);\n    });\n\n    results.messages.assertEqual(onCompleted(250));\n  });\n\n  test('merge empty delayed 2 left last', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(onNext(150, 1), onCompleted(250));\n    var e2 = scheduler.createHotObservable(onNext(150, 1), onCompleted(240));\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.merge(scheduler, e1, e2);\n    });\n\n    results.messages.assertEqual(onCompleted(250));\n  });\n\n  test('merge empty delayed 3 Middle Last', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(onNext(150, 1), onCompleted(245));\n    var e2 = scheduler.createHotObservable(onNext(150, 1), onCompleted(250));\n    var e3 = scheduler.createHotObservable(onNext(150, 1), onCompleted(240));\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.merge(scheduler, e1, e2, e3);\n    });\n\n    results.messages.assertEqual(onCompleted(250));\n  });\n\n  test('merge empty never ', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(onNext(150, 1), onCompleted(245));\n    var n1 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n        return Observable.merge(scheduler, e1, n1);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('merge never empty', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(onNext(150, 1), onCompleted(245));\n    var n1 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.merge(scheduler, n1, e1);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('merge return never ', function () {\n    var scheduler = new TestScheduler();\n\n    var r1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(245)\n    );\n    var n1 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.merge(scheduler, r1, n1);\n    });\n\n    results.messages.assertEqual(onNext(210, 2));\n  });\n\n  test('merge never return', function () {\n    var scheduler = new TestScheduler();\n\n    var r1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(245)\n    );\n\n    var n1 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n        return Observable.merge(scheduler, n1, r1);\n    });\n\n    results.messages.assertEqual(onNext(210, 2));\n  });\n\n  test('merge Error never ', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(245, error)\n    );\n    var n1 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.merge(scheduler, e1, n1);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onError(245, error)\n    );\n  });\n\n  test('merge never Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(onNext(150, 1), onNext(210, 2), onError(245, error));\n    var n1 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.merge(scheduler, n1, e1);\n    });\n\n    results.messages.assertEqual(onNext(210, 2), onError(245, error));\n  });\n\n  test('merge emptyreturn', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(onNext(150, 1), onCompleted(245));\n    var r1 = scheduler.createHotObservable(onNext(150, 1), onNext(210, 2), onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n        return Observable.merge(scheduler, e1, r1);\n    });\n\n    results.messages.assertEqual(onNext(210, 2), onCompleted(250));\n  });\n\n  test('merge return empty', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(onNext(150, 1), onCompleted(245));\n    var r1 = scheduler.createHotObservable(onNext(150, 1), onNext(210, 2), onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n        return Observable.merge(scheduler, r1, e1);\n    });\n\n    results.messages.assertEqual(onNext(210, 2), onCompleted(250));\n  });\n\n  test('merge lots 2', function () {\n      var scheduler = new TestScheduler();\n\n      var o1 = scheduler.createHotObservable(onNext(150, 1), onNext(210, 2), onNext(220, 4), onNext(230, 6), onNext(240, 8), onCompleted(245));\n      var o2 = scheduler.createHotObservable(onNext(150, 1), onNext(215, 3), onNext(225, 5), onNext(235, 7), onNext(245, 9), onCompleted(250));\n      var results = scheduler.startScheduler(function () {\n          return Observable.merge(scheduler, o1, o2);\n      }).messages;\n\n      equal(9, results.length);\n      for (var i = 0; i < 8; i++) {\n        ok(results[i].value.kind === 'N' && results[i].time === 210 + i * 5 && results[i].value.value === i + 2);\n      }\n      ok(results[8].value.kind === 'C' && results[8].time === 250);\n  });\n\n  test('merge lots 3', function () {\n      var scheduler = new TestScheduler();\n\n      var o1 = scheduler.createHotObservable(onNext(150, 1), onNext(210, 2), onNext(225, 5), onNext(240, 8), onCompleted(245));\n      var o2 = scheduler.createHotObservable(onNext(150, 1), onNext(215, 3), onNext(230, 6), onNext(245, 9), onCompleted(250));\n      var o3 = scheduler.createHotObservable(onNext(150, 1), onNext(220, 4), onNext(235, 7), onCompleted(240));\n\n      var results = scheduler.startScheduler(function () {\n        return Observable.merge(scheduler, o1, o2, o3);\n      }).messages;\n\n      equal(9, results.length);\n      for (var i = 0; i < 8; i++) {\n        ok(results[i].value.kind === 'N' && results[i].time === 210 + i * 5 && results[i].value.value === i + 2);\n      }\n      ok(results[8].value.kind === 'C' && results[8].time === 250);\n  });\n\n  test('merge Error left', function () {\n  var error = new Error();\n\n  var scheduler = new TestScheduler();\n\n  var o1 = scheduler.createHotObservable(onNext(150, 1), onNext(210, 2), onError(245, error));\n  var o2 = scheduler.createHotObservable(onNext(150, 1), onNext(215, 3), onCompleted(250));\n\n  var results = scheduler.startScheduler(function () {\n    return Observable.merge(scheduler, o1, o2);\n  });\n\n  results.messages.assertEqual(onNext(210, 2), onNext(215, 3), onError(245, error));\n  });\n\n  test('merge Error causes disposal', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var sourceNotDisposed = false;\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error)\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 1),\n      onCompleted(250))\n      .tap(function () {\n        return sourceNotDisposed = true;\n    });\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.merge(scheduler, o1, o2);\n    });\n\n    results.messages.assertEqual(onError(210, error));\n    ok(!sourceNotDisposed);\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/mergeall.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, RSVP, asyncTest, start, ok, equal */\n  QUnit.module('mergeAll');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      isEqual = Rx.internals.isEqual;\n\n\n  asyncTest('mergeAll Task', function () {\n    var sources = Rx.Observable.fromArray([\n      new RSVP.Promise(function (res) { res(0); }),\n      new RSVP.Promise(function (res) { res(1); }),\n      new RSVP.Promise(function (res) { res(2); }),\n      new RSVP.Promise(function (res) { res(3); }),\n    ]);\n\n    var res = [];\n    sources.mergeAll().subscribe(\n      function (x) {\n        res.push(x);\n      },\n      function () {\n        ok(false);\n        start();\n      },\n      function () {\n        ok(isEqual([0,1,2,3], res));\n        start();\n      });\n  });\n\n  asyncTest('mergeAll Task Error', function () {\n    var sources = Rx.Observable.fromArray([\n      new RSVP.Promise(function (res) { res(0); }),\n      new RSVP.Promise(function (res, rej) { rej(1); }),\n      new RSVP.Promise(function (res) { res(2); }),\n      new RSVP.Promise(function (res) { res(3); }),\n    ]);\n\n    var res = [];\n    sources.mergeAll().subscribe(\n      function (x) {\n        res.push(x);\n      },\n      function (err) {\n        ok(res.length === 1);\n        equal(1, err);\n        start();\n      },\n      function () {\n        ok(false);\n        start();\n      });\n  });\n\n  test('mergeAll Observable of Observable data', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300,\n        scheduler.createColdObservable(\n          onNext(10, 101),\n          onNext(20, 102),\n          onNext(110, 103),\n          onNext(120, 104),\n          onNext(210, 105),\n          onNext(220, 106),\n          onCompleted(230))),\n      onNext(400,\n        scheduler.createColdObservable(\n          onNext(10, 201),\n          onNext(20, 202),\n          onNext(30, 203),\n          onNext(40, 204),\n          onCompleted(50))),\n      onNext(500,\n        scheduler.createColdObservable(\n          onNext(10, 301),\n          onNext(20, 302),\n          onNext(30, 303),\n          onNext(40, 304),\n          onNext(120, 305),\n          onCompleted(150))),\n      onCompleted(600));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 101),\n      onNext(320, 102),\n      onNext(410, 103),\n      onNext(410, 201),\n      onNext(420, 104),\n      onNext(420, 202),\n      onNext(430, 203),\n      onNext(440, 204),\n      onNext(510, 105),\n      onNext(510, 301),\n      onNext(520, 106),\n      onNext(520, 302),\n      onNext(530, 303),\n      onNext(540, 304),\n      onNext(620, 305),\n      onCompleted(650));\n  });\n\n  test('mergeAll Observable of Observable data non-overlapped', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300,\n        scheduler.createColdObservable(\n          onNext(10, 101),\n          onNext(20, 102),\n          onCompleted(230))),\n      onNext(400,\n        scheduler.createColdObservable(\n          onNext(10, 201),\n          onNext(20, 202),\n          onNext(30, 203),\n          onNext(40, 204),\n          onCompleted(50))),\n      onNext(500,\n        scheduler.createColdObservable(\n          onNext(10, 301),\n          onNext(20, 302),\n          onNext(30, 303),\n          onNext(40, 304),\n          onCompleted(50))),\n      onCompleted(600));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 101),\n      onNext(320, 102),\n      onNext(410, 201),\n      onNext(420, 202),\n      onNext(430, 203),\n      onNext(440, 204),\n      onNext(510, 301),\n      onNext(520, 302),\n      onNext(530, 303),\n      onNext(540, 304),\n      onCompleted(600));\n  });\n\n  test('mergeAll Observable of Observable inner throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300,\n        scheduler.createColdObservable(\n          onNext(10, 101),\n          onNext(20, 102),\n          onCompleted(230))),\n      onNext(400,\n        scheduler.createColdObservable(\n          onNext(10, 201),\n          onNext(20, 202),\n          onNext(30, 203),\n          onNext(40, 204),\n          onError(50, error))),\n      onNext(500,\n        scheduler.createColdObservable(\n          onNext(10, 301),\n          onNext(20, 302),\n          onNext(30, 303),\n          onNext(40, 304),\n          onCompleted(50))),\n      onCompleted(600));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 101),\n      onNext(320, 102),\n      onNext(410, 201),\n      onNext(420, 202),\n      onNext(430, 203),\n      onNext(440, 204),\n      onError(450, error));\n  });\n\n  test('mergeAll Observable of Observable outer throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300,\n        scheduler.createColdObservable(\n          onNext(10, 101),\n          onNext(20, 102),\n          onCompleted(230))),\n      onNext(400,\n        scheduler.createColdObservable(\n          onNext(10, 201),\n          onNext(20, 202),\n          onNext(30, 203),\n          onNext(40, 204),\n          onCompleted(50))),\n      onError(500, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 101),\n      onNext(320, 102),\n      onNext(410, 201),\n      onNext(420, 202),\n      onNext(430, 203),\n      onNext(440, 204),\n      onError(500, error));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/mergeconcat.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('mergeConcat');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('merge basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, scheduler.createColdObservable(onNext(50, 1), onNext(100, 2), onNext(120, 3), onCompleted(140))),\n      onNext(260, scheduler.createColdObservable(onNext(20, 4), onNext(70, 5), onCompleted(200))),\n      onNext(270, scheduler.createColdObservable(onNext(10, 6), onNext(90, 7), onNext(110, 8), onCompleted(130))),\n      onNext(320, scheduler.createColdObservable(onNext(210, 9), onNext(240, 10), onCompleted(300))),\n      onCompleted(400));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.merge(2);\n    });\n\n    results.messages.assertEqual(\n      onNext(260, 1),\n      onNext(280, 4),\n      onNext(310, 2),\n      onNext(330, 3),\n      onNext(330, 5),\n      onNext(360, 6),\n      onNext(440, 7),\n      onNext(460, 8),\n      onNext(670, 9),\n      onNext(700, 10),\n      onCompleted(760));\n\n    xs.subscriptions.assertEqual(subscribe(200, 760));\n  });\n\n  test('merge basic Long', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, scheduler.createColdObservable(onNext(50, 1), onNext(100, 2), onNext(120, 3), onCompleted(140))),\n      onNext(260, scheduler.createColdObservable(onNext(20, 4), onNext(70, 5), onCompleted(300))),\n      onNext(270, scheduler.createColdObservable(onNext(10, 6), onNext(90, 7), onNext(110, 8), onCompleted(130))),\n      onNext(320, scheduler.createColdObservable(onNext(210, 9), onNext(240, 10), onCompleted(300))),\n      onCompleted(400));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.merge(2);\n    });\n\n    results.messages.assertEqual(\n      onNext(260, 1),\n      onNext(280, 4),\n      onNext(310, 2),\n      onNext(330, 3),\n      onNext(330, 5),\n      onNext(360, 6),\n      onNext(440, 7),\n      onNext(460, 8),\n      onNext(690, 9),\n      onNext(720, 10),\n      onCompleted(780));\n\n    xs.subscriptions.assertEqual(subscribe(200, 780));\n  });\n\n  test('merge basic Wide', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, scheduler.createColdObservable(onNext(50, 1), onNext(100, 2), onNext(120, 3), onCompleted(140))),\n      onNext(260, scheduler.createColdObservable(onNext(20, 4), onNext(70, 5), onCompleted(300))),\n      onNext(270, scheduler.createColdObservable(onNext(10, 6), onNext(90, 7), onNext(110, 8), onCompleted(130))),\n      onNext(420, scheduler.createColdObservable(onNext(210, 9), onNext(240, 10), onCompleted(300))),\n      onCompleted(450));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.merge(3);\n    });\n\n    results.messages.assertEqual(\n      onNext(260, 1),\n      onNext(280, 4),\n      onNext(280, 6),\n      onNext(310, 2),\n      onNext(330, 3),\n      onNext(330, 5),\n      onNext(360, 7),\n      onNext(380, 8),\n      onNext(630, 9),\n      onNext(660, 10),\n      onCompleted(720));\n\n    xs.subscriptions.assertEqual(subscribe(200, 720));\n  });\n\n  test('merge basic late', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, scheduler.createColdObservable(onNext(50, 1), onNext(100, 2), onNext(120, 3), onCompleted(140))),\n      onNext(260, scheduler.createColdObservable(onNext(20, 4), onNext(70, 5), onCompleted(300))),\n      onNext(270, scheduler.createColdObservable(onNext(10, 6), onNext(90, 7), onNext(110, 8), onCompleted(130))),\n      onNext(420, scheduler.createColdObservable(onNext(210, 9), onNext(240, 10), onCompleted(300))),\n      onCompleted(750));\n\n    var results = scheduler.startScheduler(function () {\n        return xs.merge(3);\n    });\n\n    results.messages.assertEqual(\n      onNext(260, 1),\n      onNext(280, 4),\n      onNext(280, 6),\n      onNext(310, 2),\n      onNext(330, 3),\n      onNext(330, 5),\n      onNext(360, 7),\n      onNext(380, 8),\n      onNext(630, 9),\n      onNext(660, 10),\n      onCompleted(750));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 750));\n  });\n\n  test('merge disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, scheduler.createColdObservable(onNext(50, 1), onNext(100, 2), onNext(120, 3), onCompleted(140))),\n      onNext(260, scheduler.createColdObservable(onNext(20, 4), onNext(70, 5), onCompleted(200))),\n      onNext(270, scheduler.createColdObservable(onNext(10, 6), onNext(90, 7), onNext(110, 8), onCompleted(130))),\n      onNext(320, scheduler.createColdObservable(onNext(210, 9), onNext(240, 10), onCompleted(300))),\n      onCompleted(400));\n\n    var results = scheduler.startScheduler(function () {\n        return xs.merge(2);\n    }, { disposed: 450 });\n\n    results.messages.assertEqual(\n      onNext(260, 1),\n      onNext(280, 4),\n      onNext(310, 2),\n      onNext(330, 3),\n      onNext(330, 5),\n      onNext(360, 6),\n      onNext(440, 7));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450));\n  });\n\n  test('merge inner error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, scheduler.createColdObservable(onNext(50, 1), onNext(100, 2), onNext(120, 3), onCompleted(140))),\n      onNext(260, scheduler.createColdObservable(onNext(20, 4), onNext(70, 5), onCompleted(200))),\n      onNext(270, scheduler.createColdObservable(onNext(10, 6), onNext(90, 7), onNext(110, 8), onCompleted(130))),\n      onNext(320, scheduler.createColdObservable(onNext(210, 9), onNext(240, 10), onCompleted(300))),\n      onError(400, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.merge(2);\n    });\n\n    results.messages.assertEqual(\n      onNext(260, 1),\n      onNext(280, 4),\n      onNext(310, 2),\n      onNext(330, 3),\n      onNext(330, 5),\n      onNext(360, 6),\n      onError(400, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400));\n  });\n\n  test('merge outer error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, scheduler.createColdObservable(onNext(50, 1), onNext(100, 2), onNext(120, 3), onCompleted(140))),\n      onNext(260, scheduler.createColdObservable(onNext(20, 4), onNext(70, 5), onCompleted(200))),\n      onNext(270, scheduler.createColdObservable(onNext(10, 6), onNext(90, 7), onNext(110, 8), onError(140, error))),\n      onNext(320, scheduler.createColdObservable(onNext(210, 9), onNext(240, 10), onCompleted(300))),\n      onCompleted(400));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.merge(2);\n    });\n\n    results.messages.assertEqual(\n      onNext(260, 1),\n      onNext(280, 4),\n      onNext(310, 2),\n      onNext(330, 3),\n      onNext(330, 5),\n      onNext(360, 6),\n      onNext(440, 7),\n      onNext(460, 8),\n      onError(490, error));\n\n    xs.subscriptions.assertEqual(subscribe(200, 490));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/mergedelayerror.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('mergeDelayError');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('mergeDelayError never never', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(160, 1)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.mergeDelayError(o1, o2);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('mergeDelayError empty right', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(160, 1),\n      onCompleted(260)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.mergeDelayError(o1, o2);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(260)\n    );\n  });\n\n  test('mergeDelayError empty left', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(260)\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(160, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.mergeDelayError(o1, o2);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(260)\n    );\n  });\n\n  test('mergeDelayError empty middle', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(260)\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(160, 1),\n      onCompleted(250)\n    );\n    var o3 = scheduler.createHotObservable(\n      onNext(160, 1),\n      onCompleted(270)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.mergeDelayError(o1, o2, o3);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(270)\n    );\n  });\n\n  test('mergeDelayError empty never', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(260)\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(160, 1)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.mergeDelayError(o1, o2);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('mergeDelayError never empty', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(160, 1),\n      onCompleted(260)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.mergeDelayError(o1, o2);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('mergeDelayError return never', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(160, 1)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.mergeDelayError(o1, o2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2)\n    );\n  });\n\n  test('mergeDelayError never return', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(160, 1)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.mergeDelayError(o2, o1);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2)\n    );\n  });\n\n  test('mergeDelayError error never', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(250, error) // error dropped\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(160, 1)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.mergeDelayError(o1, o2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2)\n    );\n  });\n\n  test('mergeDelayError never error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(250, error) // error dropped\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(160, 1)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.mergeDelayError(o2, o1);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2)\n    );\n  });\n\n  test('mergeDelayError error empty', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(250, error)\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(160, 1),\n      onCompleted(260)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.mergeDelayError(o1, o2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onError(260, error)\n    );\n  });\n\n  test('mergeDelayError empty error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(250, error)\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(160, 1),\n      onCompleted(260)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.mergeDelayError(o2, o1);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onError(260, error)\n    );\n  });\n\n  test('mergeDelayError no errors', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(160, 1),\n      onNext(215, 2),\n      onCompleted(260)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.mergeDelayError(o1, o2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(215, 2),\n      onCompleted(260)\n    );\n  });\n\n  test('mergeDelayError error error', function () {\n    var error1 = new Error();\n    var error2 = new Error();\n    var composite = new Rx.CompositeError([error1, error2]);\n\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(250, error1)\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(160, 1),\n      onNext(215, 2),\n      onError(260, error2)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.mergeDelayError(o2, o1);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(215, 2),\n      onError(260, composite)\n    );\n  });\n\n  test('mergeDelayError error left', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(250, error),\n      onNext(270, 3),\n      onCompleted(280)\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(160, 1),\n      onNext(215, 2),\n      onCompleted(260)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.mergeDelayError(o1, o2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(215, 2),\n      onError(260, error)\n    );\n  });\n\n  test('mergeDelayError error right', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(250, error),\n      onNext(270, 3),\n      onCompleted(280)\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(160, 1),\n      onNext(215, 2),\n      onCompleted(260)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.mergeDelayError(o2, o1);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(215, 2),\n      onError(260, error)\n    );\n  });\n\n  test('mergeDelayError infinite left error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4)\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(160, 1),\n      onNext(215, 2),\n      onNext(225, 3),\n      onError(260, error) // Error dropped\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.mergeDelayError(o1, o2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(215, 2),\n      onNext(220, 3),\n      onNext(225, 3),\n      onNext(230, 4)\n    );\n  });\n\n  test('mergeDelayError infinite right error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4)\n    );\n    var o2 = scheduler.createHotObservable(\n      onNext(160, 1),\n      onNext(215, 2),\n      onNext(225, 3),\n      onError(260, error) // Error dropped\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return Observable.mergeDelayError(o2, o1);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(215, 2),\n      onNext(220, 3),\n      onNext(225, 3),\n      onNext(230, 4)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/min.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('min');\n\n  function reverseComparer(a, b) {\n    return a > b ? -1 : a < b ? 1 : 0;\n  }\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('min empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.min();\n    });\n\n    results.messages.assertEqual(\n      onNext(250, function (n) { return n.error instanceof Rx.EmptyError; })\n    );\n  });\n\n  test('min return', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(onNext(150, 1), onNext(210, 2), onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.min();\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 2),\n      onCompleted(250)\n    );\n  });\n\n  test('min some', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.min();\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 2),\n      onCompleted(250));\n  });\n\n  test('min throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.min();\n    });\n\n    results.messages.assertEqual(\n      onError(210, error));\n  });\n\n  test('min never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.min();\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('min with comparer empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 'a'),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n        return xs.min(reverseComparer);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, function (n) { return n.error instanceof Rx.EmptyError; })\n    );\n  });\n\n  test('min with comparer non-empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 'z'),\n      onNext(210, 'b'),\n      onNext(220, 'c'),\n      onNext(230, 'a'),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.min(reverseComparer);\n    });\n\n    results.messages.assertEqual(onNext(250, 'c'), onCompleted(250));\n  });\n\n  test('min with comparer throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 'z'),\n      onError(210, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.min(reverseComparer);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error));\n  });\n\n  test('min with comparer never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 'z'));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.min(reverseComparer);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('min with comparer throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 'z'),\n      onNext(210, 'b'),\n      onNext(220, 'c'),\n      onNext(230, 'a'),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.min(function () { throw error; });\n    });\n\n    results.messages.assertEqual(\n      onError(220, error));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/minby.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('minBy');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  function reverseComparer(a, b) {\n    return a > b ? -1 : a < b ? 1 : 0;\n  }\n\n  test('minBy empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.minBy(function (x) { return x.key; });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, []),\n      onCompleted(250)\n    );\n  });\n\n  test('minBy return', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onNext(210, { key: 2, value: 'a' }),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.minBy(function (x) { return x.key; });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, [{ key: 2, value: 'a' }]),\n      onCompleted(250)\n    );\n  });\n\n  test('minBy some', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onNext(210, { key: 3, value: 'b' }),\n      onNext(220, { key: 2, value: 'c' }),\n      onNext(230, { key: 4, value: 'a' }),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.minBy(function (x) { return x.key; });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, [{ key: 2, value: 'c' }]),\n      onCompleted(250)\n    );\n  });\n\n  test('minBy multiple', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onNext(210, { key: 3, value: 'b' }),\n      onNext(215, { key: 2, value: 'd' }),\n      onNext(220, { key: 3, value: 'c' }),\n      onNext(225, { key: 2, value: 'y' }),\n      onNext(230, { key: 4, value: 'a' }),\n      onNext(235, { key: 4, value: 'r' }),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.minBy(function (x) { return x.key; });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, [{ key: 2, value: 'd' }, { key: 2, value: 'y' }]),\n      onCompleted(250)\n    );\n  });\n\n  test('minBy throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.minBy(function (x) { return x.key; });\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('minBy never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' })\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.minBy(function (x) { return x.key; });\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('minBy comparer empty', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n        onNext(150, { key: 1, value: 'z' }),\n        onCompleted(250)\n      );\n\n      var results = scheduler.startScheduler(function () {\n        return xs.minBy(function (x) { return x.key; }, reverseComparer);\n      });\n\n      results.messages.assertEqual(\n        onNext(250, []),\n        onCompleted(250)\n      );\n  });\n\n  test('minBy comparer return', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onNext(210, { key: 2, value: 'a' }),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.minBy(function (x) { return x.key; }, reverseComparer);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, [{ key: 2, value: 'a' }]),\n      onCompleted(250)\n    );\n  });\n\n  test('minBy comparer some', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onNext(210, { key: 3, value: 'b' }),\n      onNext(220, { key: 20, value: 'c' }),\n      onNext(230, { key: 4, value: 'a' }),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.minBy(function (x) { return x.key; }, reverseComparer);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, [{ key: 20, value: 'c' }]),\n      onCompleted(250)\n    );\n  });\n\n  test('minBy comparer throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.minBy(function (x) { return x.key; }, reverseComparer);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error));\n  });\n\n  test('minBy comparer never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' })\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.minBy(function (x) { return x.key; }, reverseComparer);\n    });\n\n    results.messages.assertEqual(\n\n    );\n  });\n\n  test('minBy selector throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onNext(210, { key: 3, value: 'b' }),\n      onNext(220, { key: 2, value: 'c' }),\n      onNext(230, { key: 4, value: 'a' }),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.minBy(function () { throw error; }, reverseComparer);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error));\n  });\n\n  test('minBy comparer throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, { key: 1, value: 'z' }),\n      onNext(210, { key: 3, value: 'b' }),\n      onNext(220, { key: 2, value: 'c' }),\n      onNext(230, { key: 4, value: 'a' }),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.minBy(function (x) { return x.key; }, function () { throw error; });\n    });\n\n    results.messages.assertEqual(\n      onError(220, error));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/multicast.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal */\n\n  QUnit.module('multicast');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe,\n    Subject = Rx.Subject;\n\n  test('multicast hot 1', function () {\n    var scheduler = new TestScheduler();\n\n    var s = new Subject();\n\n    var xs = scheduler.createHotObservable(\n      onNext(40, 0),\n      onNext(90, 1),\n      onNext(150, 2),\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5),\n      onNext(330, 6),\n      onNext(340, 7),\n      onCompleted(390));\n\n    var c;\n    var o = scheduler.createObserver();\n    var d1;\n    var d2;\n\n    scheduler.scheduleAbsolute(null, 50, function () {\n      c = xs.multicast(s);\n    });\n\n    scheduler.scheduleAbsolute(null, 100, function () {\n      d1 = c.subscribe(o);\n    });\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      d2 = c.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      d1.dispose();\n    });\n\n    scheduler.start();\n\n    o.messages.assertEqual(\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 390));\n  });\n\n  test('multicast hot 2', function () {\n    var scheduler = new TestScheduler();\n\n    var s = new Subject();\n\n    var xs = scheduler.createHotObservable(\n      onNext(40, 0),\n      onNext(90, 1),\n      onNext(150, 2),\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5),\n      onNext(330, 6),\n      onNext(340, 7),\n      onCompleted(390));\n\n    var c;\n    var o = scheduler.createObserver();\n    var d1;\n    var d2;\n\n    scheduler.scheduleAbsolute(null, 50, function () {\n      c = xs.multicast(s);\n    });\n\n    scheduler.scheduleAbsolute(null, 100, function () {\n      d2 = c.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      d1 = c.subscribe(o);\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      d1.dispose();\n    });\n\n    scheduler.start();\n\n    o.messages.assertEqual(\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5));\n\n    xs.subscriptions.assertEqual(\n      subscribe(100, 390));\n  });\n\n  test('multicast hot 2', function () {\n    var scheduler = new TestScheduler();\n\n    var s = new Subject();\n\n    var xs = scheduler.createHotObservable(\n      onNext(40, 0),\n      onNext(90, 1),\n      onNext(150, 2),\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5),\n      onNext(330, 6),\n      onNext(340, 7),\n      onCompleted(390));\n\n    var c;\n    var o = scheduler.createObserver();\n    var d1;\n    var d2;\n\n    scheduler.scheduleAbsolute(null, 50, function () {\n      c = xs.multicast(s);\n    });\n\n    scheduler.scheduleAbsolute(null, 100, function () {\n      d2 = c.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      d1 = c.subscribe(o);\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      d1.dispose();\n    });\n\n    scheduler.start();\n\n    o.messages.assertEqual(\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5));\n\n    xs.subscriptions.assertEqual(subscribe(100, 390));\n  });\n\n  test('multicast hot 3', function () {\n    var scheduler = new TestScheduler();\n\n    var s = new Subject();\n\n    var xs = scheduler.createHotObservable(\n      onNext(40, 0),\n      onNext(90, 1),\n      onNext(150, 2),\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5),\n      onNext(330, 6),\n      onNext(340, 7),\n      onCompleted(390));\n\n    var c;\n    var o = scheduler.createObserver();\n    var d1;\n    var d2;\n\n    scheduler.scheduleAbsolute(null, 50, function () {\n      c = xs.multicast(s);\n    });\n\n    scheduler.scheduleAbsolute(null, 100, function () {\n      d2 = c.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      d1 = c.subscribe(o);\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      d2.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 335, function () {\n      d2 = c.connect();\n    });\n\n    scheduler.start();\n\n    o.messages.assertEqual(\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5),\n      onNext(340, 7),\n      onCompleted(390));\n\n    xs.subscriptions.assertEqual(\n      subscribe(100, 300),\n      subscribe(335, 390));\n  });\n\n  test('multicast hot 4', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var s = new Subject();\n\n    var xs = scheduler.createHotObservable(\n      onNext(40, 0),\n      onNext(90, 1),\n      onNext(150, 2),\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5),\n      onNext(330, 6),\n      onNext(340, 7),\n      onError(390, error));\n\n    var c;\n    var o = scheduler.createObserver();\n    var d1;\n    var d2;\n\n    scheduler.scheduleAbsolute(null, 50, function () {\n      c = xs.multicast(s);\n    });\n\n    scheduler.scheduleAbsolute(null, 100, function () {\n      d2 = c.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      d1 = c.subscribe(o);\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      d2.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 335, function () {\n      d2 = c.connect();\n    });\n\n    scheduler.start();\n\n    o.messages.assertEqual(\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5),\n      onNext(340, 7),\n      onError(390, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(100, 300),\n      subscribe(335, 390));\n  });\n\n  test('multicast hot 5', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var s = new Subject();\n\n    var xs = scheduler.createHotObservable(\n      onNext(40, 0),\n      onNext(90, 1),\n      onNext(150, 2),\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5),\n      onNext(330, 6),\n      onNext(340, 7),\n      onError(390, error));\n\n    var c;\n    var o = scheduler.createObserver();\n    var d1;\n    var d2;\n\n    scheduler.scheduleAbsolute(null, 50, function () {\n      c = xs.multicast(s);\n    });\n\n    scheduler.scheduleAbsolute(null, 100, function () {\n      d2 = c.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      d1 = c.subscribe(o);\n    });\n\n    scheduler.start();\n\n    o.messages.assertEqual(\n      onError(400, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(100, 390));\n  });\n\n  test('multicast hot 6', function () {\n    var scheduler = new TestScheduler();\n\n    var s = new Subject();\n\n    var xs = scheduler.createHotObservable(\n      onNext(40, 0),\n      onNext(90, 1),\n      onNext(150, 2),\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5),\n      onNext(330, 6),\n      onNext(340, 7),\n      onCompleted(390));\n\n    var c;\n    var o = scheduler.createObserver();\n    var d1;\n    var d2;\n\n    scheduler.scheduleAbsolute(null, 50, function () {\n      c = xs.multicast(s);\n    });\n\n    scheduler.scheduleAbsolute(null, 100, function () {\n      d2 = c.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      d1 = c.subscribe(o);\n    });\n\n    scheduler.start();\n\n    o.messages.assertEqual(\n      onCompleted(400));\n\n    xs.subscriptions.assertEqual(\n      subscribe(100, 390));\n  });\n\n  test('multicast cold completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(40, 0),\n      onNext(90, 1),\n      onNext(150, 2),\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5),\n      onNext(330, 6),\n      onNext(340, 7),\n      onCompleted(390));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.multicast(function () { return new Subject(); }, function (ys) { return ys; });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5),\n      onNext(330, 6),\n      onNext(340, 7),\n      onCompleted(390));\n\n    xs.subscriptions.assertEqual(subscribe(200, 390));\n  });\n\n  test('multicast cold Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(40, 0),\n      onNext(90, 1),\n      onNext(150, 2),\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5),\n      onNext(330, 6),\n      onNext(340, 7),\n      onError(390, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.multicast(\n        function () { return new Subject(); },\n        function (ys) { return ys; });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5),\n      onNext(330, 6),\n      onNext(340, 7),\n      onError(390, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 390));\n  });\n\n  test('multicast cold dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(40, 0),\n      onNext(90, 1),\n      onNext(150, 2),\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5),\n      onNext(330, 6),\n      onNext(340, 7));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.multicast(function () { return new Subject(); }, function (ys) { return ys; });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5),\n      onNext(330, 6),\n      onNext(340, 7));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000));\n  });\n\n  test('multicast cold zip', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(40, 0),\n      onNext(90, 1),\n      onNext(150, 2),\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5),\n      onNext(330, 6),\n      onNext(340, 7),\n      onCompleted(390));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.multicast(function () {\n        return new Subject();\n      }, function (ys) {\n        return ys.zip(ys, function (a, b) { return a + b; });\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 6),\n      onNext(240, 8),\n      onNext(270, 10),\n      onNext(330, 12),\n      onNext(340, 14),\n      onCompleted(390));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 390));\n  });\n\n  // adapted from issue Reactive-Extensions/RxJS#1112\n  test(\"multicast should not reconnect when stopped\", function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.createObserver();\n\n    var calls = 0;\n\n    function request(v) {\n      calls++;\n      return v * 2;\n    }\n\n    var xs = scheduler.createColdObservable(\n      onNext(1, 1),\n      onNext(2, 2),\n      onNext(3, 3),\n      onCompleted(4));\n\n    var c, s;\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      c = new Rx.AnonymousObservable(function (o) {\n        return xs.subscribe(\n          function (x) { o.onNext(request(x)); },\n          function (e) { o.onError(e); },\n          function () { o.onCompleted(); });\n      }).multicast(new Subject());\n      c.subscribe(results);\n      s = c.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      s.dispose();\n      c.connect();\n    });\n\n    scheduler.start();\n\n    equal(calls, 3);\n\n    results.messages.assertEqual(\n      onNext(301, 2),\n      onNext(302, 4),\n      onNext(303, 6),\n      onCompleted(304));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/never.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('never');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler;\n\n  test('never basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = Observable.never();\n\n    var results = scheduler.createObserver();\n\n    xs.subscribe(results);\n\n    scheduler.start();\n\n    results.messages.assertEqual();\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/observeon.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('observeOn');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('observeOn normal', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.observeOn(scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(211, 2),\n      onCompleted(251));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 251));\n  });\n\n  test('observeOn Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.observeOn(scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(211, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 211)\n    );\n  });\n\n  test('observeOn empty', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n        onNext(150, 1),\n        onCompleted(250)\n      );\n\n      var results = scheduler.startScheduler(function () {\n        return xs.observeOn(scheduler);\n      });\n\n      results.messages.assertEqual(\n        onCompleted(251)\n      );\n\n      xs.subscriptions.assertEqual(\n        subscribe(200, 251)\n      );\n  });\n\n  test('observeOn never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.observeOn(scheduler);\n    });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/of.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal */\n\n  QUnit.module('of');\n\n  var Observable = Rx.Observable,\n    TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('of', function () {\n    var results = [];\n\n    Rx.Observable.of(1,2,3,4,5).subscribe(results.push.bind(results));\n\n    equal([1,2,3,4,5].toString(), results.toString());\n  });\n\n  test('of empty', function () {\n    var results = [];\n\n    Rx.Observable.of().subscribe(results.push.bind(results));\n\n    equal(results.length, 0);\n  });\n\n  test('ofWithScheduler', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.ofWithScheduler(scheduler, 1,2,3,4,5);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 1),\n      onNext(202, 2),\n      onNext(203, 3),\n      onNext(204, 4),\n      onNext(205, 5),\n      onCompleted(206)\n    );\n  });\n\n  test('ofWithScheduler empty', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.ofWithScheduler(scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(201)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/ofarraychanges.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, Rx, equal, start, asyncTest */\n\n  if (typeof Array.observe === 'function') {\n    QUnit.module('ofArrayChanges');\n\n    var Observable = Rx.Observable;\n\n    asyncTest('ofArrayChanges captures update', function () {\n      var arr = [1,2,3];\n\n      var source = Observable.ofArrayChanges(arr);\n\n      source.subscribe(function (x) {\n        equal(x.type, 'splice');\n        equal(x.index, 3);\n        equal(x.addedCount, 1);\n        start();\n      });\n\n      arr.push(42);\n    });\n  }\n\n}());\n"
  },
  {
    "path": "tests/observable/ofobjectchanges.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, Rx, equal, start, asyncTest */\n\n  if (typeof Object.observe === 'function') {\n    QUnit.module('ofObjectChanges');\n\n    var Observable = Rx.Observable;\n\n    asyncTest('ofObjectChanges captures update', function() {\n      var obj = {x: 1};\n\n      var source = Observable.ofObjectChanges(obj);\n\n      source.subscribe(function (x) {\n        equal(x.type, 'update');\n        equal(x.name, 'x');\n        equal(x.oldValue, 1);\n        start();\n      });\n\n      obj.x = 42;\n    });\n  }\n\n}());\n"
  },
  {
    "path": "tests/observable/onerrorresumenext.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('onErrorResumeNext');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('onErrorResumeNext error multiple', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(220, new Error())\n    );\n\n    var o2 = scheduler.createHotObservable(\n      onNext(230, 4),\n      onError(240, new Error())\n    );\n\n    var o3 = scheduler.createHotObservable(\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.onErrorResumeNext(o1, o2, o3);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(230, 4),\n      onCompleted(250)\n    );\n  });\n\n  test('onErrorResumeNext empty return throw and more', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(205)\n    );\n\n    var o2 = scheduler.createHotObservable(\n      onNext(215, 2),\n      onCompleted(220)\n    );\n\n    var o3 = scheduler.createHotObservable(\n      onNext(225, 3),\n      onNext(230, 4),\n      onCompleted(235)\n    );\n\n    var o4 = scheduler.createHotObservable(\n      onError(240, new Error())\n    );\n\n    var o5 = scheduler.createHotObservable(\n      onNext(245, 5), onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.onErrorResumeNext(o1, o2, o3, o4, o5);\n    });\n\n    results.messages.assertEqual(\n      onNext(215, 2),\n      onNext(225, 3),\n      onNext(230, 4),\n      onNext(245, 5),\n      onCompleted(250)\n    );\n  });\n\n  test('onErrorResumeNext single source throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onError(230, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.onErrorResumeNext(o1);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(230)\n    );\n  });\n\n  test('onErrorResumeNext end with never', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(220)\n    );\n\n    var o2 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.onErrorResumeNext(o1, o2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2)\n    );\n  });\n\n  test('onErrorResumeNext start with never', function () {\n      var scheduler = new TestScheduler();\n\n      var o1 = Observable.never();\n      \n      var o2 = scheduler.createHotObservable(\n        onNext(150, 1),\n        onNext(210, 2),\n        onCompleted(220)\n      );\n\n      var results = scheduler.startScheduler(function () {\n        return Observable.onErrorResumeNext(o1, o2);\n      });\n\n      results.messages.assertEqual();\n  });\n\n  test('onErrorResumeNext no errors', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onCompleted(230)\n    );\n\n    var o2 = scheduler.createHotObservable(\n      onNext(240, 4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return o1.onErrorResumeNext(o2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(240, 4),\n      onCompleted(250)\n    );\n  });\n\n  test('onErrorResumeNext error', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onError(230, new Error())\n    );\n\n    var o2 = scheduler.createHotObservable(\n      onNext(240, 4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return o1.onErrorResumeNext(o2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(240, 4),\n      onCompleted(250)\n    );\n  });\n\n  test('onErrorResumeNext empty return throw and more', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var o1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(220)\n    );\n\n    var o2 = scheduler.createHotObservable(\n      onError(230, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return o1.onErrorResumeNext(o2);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onCompleted(230)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/pairs.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('pairs');\n\n  var TestScheduler = Rx.TestScheduler,\n    Observable = Rx.Observable,\n    onNext = Rx.ReactiveTest.onNext,\n    onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('pairs empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = {};\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.pairs(xs, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(201)\n    );\n  });\n\n  test('pairs normal', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = {foo: 42, bar: 56, baz: 78};\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.pairs(xs, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, ['foo', 42]),\n      onNext(202, ['bar', 56]),\n      onNext(203, ['baz', 78]),\n      onCompleted(204)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/pairwise.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('pairwise');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe;\n\n  test('pairwise empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 5),\n      onCompleted(210)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.pairwise();\n    });\n\n    results.messages.assertEqual(\n      onCompleted(210)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 210)\n    );\n  });\n\n  test('pairwise single', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 5),\n      onNext(210, 4),\n      onCompleted(220)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.pairwise();\n    });\n\n    results.messages.assertEqual(\n      onCompleted(220)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 220)\n    );\n  });\n\n  test('pairwise completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 5),\n      onNext(210, 4),\n      onNext(240, 3),\n      onNext(290, 2),\n      onNext(350, 1),\n      onCompleted(360)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.pairwise();\n    });\n\n    results.messages.assertEqual(\n      onNext(240, [4,3]),\n      onNext(290, [3, 2]),\n      onNext(350, [2, 1]),\n      onCompleted(360)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 360)\n    );\n  });\n\n  test('pairwise not completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 5),\n      onNext(210, 4),\n      onNext(240, 3),\n      onNext(290, 2),\n      onNext(350, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.pairwise();\n    });\n\n    results.messages.assertEqual(\n      onNext(240, [4,3]),\n      onNext(290, [3, 2]),\n      onNext(350, [2, 1])\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n  test('pairwise error', function () {\n    var error = new Error();\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 5),\n      onNext(210, 4),\n      onNext(240, 3),\n      onError(290, error),\n      onNext(350, 1),\n      onCompleted(360)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.pairwise();\n    });\n\n    results.messages.assertEqual(\n      onNext(240, [4,3]),\n      onError(290, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 290)\n    );\n  });\n\n  test('pairwise disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 5),\n      onNext(210, 4),\n      onNext(240, 3),\n      onNext(290, 2),\n      onNext(350, 1),\n      onCompleted(360)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.pairwise();\n    }, { disposed: 280 });\n\n    results.messages.assertEqual(\n      onNext(240, [4,3])\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 280)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/partition.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('partition');\n\n  var TestScheduler = Rx.TestScheduler,\n    ReactiveTest = Rx.ReactiveTest,\n    onNext = ReactiveTest.onNext,\n    onError = ReactiveTest.onError,\n    onCompleted = ReactiveTest.onCompleted,\n    subscribe = ReactiveTest.subscribe;\n\n  function isEven(num) {\n    return +num % 2 === 0;\n  }\n\n  test('partition empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 5),\n      onCompleted(210)\n    );\n\n    var observables,\n      subscription1,\n      subscription2,\n      results1 = scheduler.createObserver(),\n      results2 = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.created, function () {\n      observables = xs.partition(isEven);\n    });\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.subscribed, function () {\n      subscription1 = observables[0].subscribe(results1);\n      subscription2 = observables[1].subscribe(results2);\n    });\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.disposed, function () {\n      subscription1.dispose();\n      subscription2.dispose();\n    });\n\n    scheduler.start();\n\n    results1.messages.assertEqual(\n      onCompleted(210)\n    );\n\n    results2.messages.assertEqual(\n      onCompleted(210)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 210),\n      subscribe(200, 210)\n    );\n  });\n\n  test('partition single', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 5),\n      onNext(210, 4),\n      onCompleted(220)\n    );\n\n    var observables,\n      subscription1,\n      subscription2,\n      results1 = scheduler.createObserver(),\n      results2 = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.created, function () {\n      observables = xs.partition(isEven);\n    });\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.subscribed, function () {\n      subscription1 = observables[0].subscribe(results1);\n      subscription2 = observables[1].subscribe(results2);\n    });\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.disposed, function () {\n      subscription1.dispose();\n      subscription2.dispose();\n    });\n\n    scheduler.start();\n\n    results1.messages.assertEqual(\n      onNext(210, 4),\n      onCompleted(220)\n    );\n\n    results2.messages.assertEqual(\n      onCompleted(220)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 220),\n      subscribe(200, 220)\n    );\n  });\n\n  test('partition each', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 5),\n      onNext(210, 4),\n      onNext(220, 3),\n      onCompleted(230)\n    );\n\n    var observables,\n      subscription1,\n      subscription2,\n      results1 = scheduler.createObserver(),\n      results2 = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.created, function () {\n      observables = xs.partition(isEven);\n    });\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.subscribed, function () {\n      subscription1 = observables[0].subscribe(results1);\n      subscription2 = observables[1].subscribe(results2);\n    });\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.disposed, function () {\n      subscription1.dispose();\n      subscription2.dispose();\n    });\n\n    scheduler.start();\n\n    results1.messages.assertEqual(\n      onNext(210, 4),\n      onCompleted(230)\n    );\n\n    results2.messages.assertEqual(\n      onNext(220, 3),\n      onCompleted(230)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230),\n      subscribe(200, 230)\n    );\n  });\n\n  test('partition completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 5),\n      onNext(210, 4),\n      onNext(240, 3),\n      onNext(290, 2),\n      onNext(350, 1),\n      onCompleted(360)\n    );\n\n    var observables,\n      subscription1,\n      subscription2,\n      results1 = scheduler.createObserver(),\n      results2 = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.created, function () {\n      observables = xs.partition(isEven);\n    });\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.subscribed, function () {\n      subscription1 = observables[0].subscribe(results1);\n      subscription2 = observables[1].subscribe(results2);\n    });\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.disposed, function () {\n      subscription1.dispose();\n      subscription2.dispose();\n    });\n\n    scheduler.start();\n\n    results1.messages.assertEqual(\n      onNext(210, 4),\n      onNext(290, 2),\n      onCompleted(360)\n    );\n\n    results2.messages.assertEqual(\n      onNext(240, 3),\n      onNext(350, 1),\n      onCompleted(360)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 360),\n      subscribe(200, 360)\n    );\n  });\n\n  test('partition not completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 5),\n      onNext(210, 4),\n      onNext(240, 3),\n      onNext(290, 2),\n      onNext(350, 1)\n    );\n\n    var observables,\n      subscription1,\n      subscription2,\n      results1 = scheduler.createObserver(),\n      results2 = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.created, function () {\n      observables = xs.partition(isEven);\n    });\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.subscribed, function () {\n      subscription1 = observables[0].subscribe(results1);\n      subscription2 = observables[1].subscribe(results2);\n    });\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.disposed, function () {\n      subscription1.dispose();\n      subscription2.dispose();\n    });\n\n    scheduler.start();\n\n    results1.messages.assertEqual(\n      onNext(210, 4),\n      onNext(290, 2)\n    );\n\n    results2.messages.assertEqual(\n      onNext(240, 3),\n      onNext(350, 1)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000),\n      subscribe(200, 1000)\n    );\n  });\n\n  test('partition error', function () {\n    var error = new Error();\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 5),\n      onNext(210, 4),\n      onNext(240, 3),\n      onError(290, error),\n      onNext(350, 1),\n      onCompleted(360)\n    );\n\n    var observables,\n      subscription1,\n      subscription2,\n      results1 = scheduler.createObserver(),\n      results2 = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.created, function () {\n      observables = xs.partition(isEven);\n    });\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.subscribed, function () {\n      subscription1 = observables[0].subscribe(results1);\n      subscription2 = observables[1].subscribe(results2);\n    });\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.disposed, function () {\n      subscription1.dispose();\n      subscription2.dispose();\n    });\n\n    scheduler.start();\n\n    results1.messages.assertEqual(\n      onNext(210, 4),\n      onError(290, error)\n    );\n\n    results2.messages.assertEqual(\n      onNext(240, 3),\n      onError(290, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 290),\n      subscribe(200, 290)\n    );\n  });\n\n  test('partition disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 5),\n      onNext(210, 4),\n      onNext(240, 3),\n      onNext(290, 2),\n      onNext(350, 1),\n      onCompleted(360)\n    );\n\n    var observables,\n      subscription1,\n      subscription2,\n      results1 = scheduler.createObserver(),\n      results2 = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.created, function () {\n      observables = xs.partition(isEven);\n    });\n\n    scheduler.scheduleAbsolute(null, ReactiveTest.subscribed, function () {\n      subscription1 = observables[0].subscribe(results1);\n      subscription2 = observables[1].subscribe(results2);\n    });\n\n    scheduler.scheduleAbsolute(null, 280, function () {\n      subscription1.dispose();\n      subscription2.dispose();\n    });\n\n    scheduler.start();\n\n    results1.messages.assertEqual(\n      onNext(210, 4)\n    );\n\n    results2.messages.assertEqual(\n      onNext(240, 3)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 280),\n      subscribe(200, 280)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/pausable.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('pausable');\n\n  var TestScheduler = Rx.TestScheduler,\n    Subject = Rx.Subject,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('paused no skip', function () {\n    var subscription;\n\n    var scheduler = new TestScheduler();\n\n    var controller = new Subject();\n\n    var results = scheduler.createObserver();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = xs.pausable(controller).subscribe(results);\n      controller.onNext(true);\n    });\n\n    scheduler.scheduleAbsolute(null, 205, function () {\n      controller.onNext(false);\n    });\n\n    scheduler.scheduleAbsolute(null, 209, function () {\n      controller.onNext(true);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n        subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n  });\n\n  test('paused skips', function () {\n    var subscription;\n\n    var scheduler = new TestScheduler();\n\n    var controller = new Subject();\n\n    var results = scheduler.createObserver();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = xs.pausable(controller).subscribe(results);\n      controller.onNext(true);\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      controller.onNext(false);\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      controller.onNext(true);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n        subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(230, 3),\n      onCompleted(500)\n    );\n  });\n\n  test('paused error', function () {\n    var subscription;\n\n    var err = new Error();\n    var scheduler = new TestScheduler();\n\n    var controller = new Subject();\n\n    var results = scheduler.createObserver();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(230, err),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = xs.pausable(controller).subscribe(results);\n      controller.onNext(true);\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      controller.onNext(false);\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      controller.onNext(true);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onError(230, err)\n    );\n  });\n\n  test('paused with observable controller and pause and unpause', function(){\n    var subscription;\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.createObserver();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(301, 5),\n      onNext(350, 6),\n      onNext(450, 7),\n      onCompleted(500)\n    );\n\n    var controller = scheduler.createHotObservable(\n      onNext(201, true),\n      onNext(220, false),\n      onNext(250, true)\n    );\n\n    var pausable = xs.pausable(controller);\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = pausable.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      pausable.pause();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      pausable.resume();\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(270, 4),\n      onNext(450, 7),\n      onCompleted(500)\n    );\n  });\n\n  test('paused with default controller and multiple subscriptions', function () {\n    var paused, subscription, subscription2;\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.createObserver();\n    var results2 = scheduler.createObserver();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      paused = xs.pausable();\n      subscription = paused.subscribe(results);\n      paused.resume();\n    });\n\n    scheduler.scheduleAbsolute(null, 240, function () {\n      subscription2 = paused.subscribe(results2);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n      subscription2.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n\n    results2.messages.assertEqual(\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n  });\n\n  test('pausable is unaffected by currentThread scheduler', function () {\n    var subscription;\n\n    var scheduler = new TestScheduler();\n\n    var controller = new Subject();\n\n    var results = scheduler.createObserver();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      Rx.Scheduler.currentThread.schedule(null, function () {\n        subscription = xs.pausable(controller).subscribe(results);\n        controller.onNext(true);\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n  });\n  \n}());\n"
  },
  {
    "path": "tests/observable/pausablebuffered.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('PausableBuffered');\n\n  var TestScheduler = Rx.TestScheduler,\n    Subject = Rx.Subject,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('paused no skip', function () {\n    var subscription;\n\n    var scheduler = new TestScheduler();\n\n    var controller = new Subject();\n\n    var results = scheduler.createObserver();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = xs.pausableBuffered(controller).subscribe(results);\n      controller.onNext(true);\n    });\n\n    scheduler.scheduleAbsolute(null, 205, function () {\n      controller.onNext(false);\n    });\n\n    scheduler.scheduleAbsolute(null, 209, function () {\n      controller.onNext(true);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n  });\n\n  test('paused skips', function () {\n    var subscription;\n\n    var scheduler = new TestScheduler();\n\n    var controller = new Subject();\n\n    var results = scheduler.createObserver();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = xs.pausableBuffered(controller).subscribe(results);\n      controller.onNext(true);\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      controller.onNext(false);\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      controller.onNext(true);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n        subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(400, 4),\n      onNext(400, 5),\n      onNext(400, 6),\n      onCompleted(500)\n    );\n  });\n\n  test('paused error', function () {\n    var subscription;\n\n    var err = new Error();\n    var scheduler = new TestScheduler();\n\n    var controller = new Subject();\n\n    var results = scheduler.createObserver();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(230, err),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = xs.pausableBuffered(controller).subscribe(results);\n      controller.onNext(true);\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      controller.onNext(false);\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      controller.onNext(true);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n        subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onError(230, err)\n    );\n  });\n\n  test('paused skip initial elements', function(){\n    var subscription;\n\n    var scheduler = new TestScheduler();\n\n    var controller = new Subject();\n\n    var results = scheduler.createObserver();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(230, 2),\n      onNext(270, 3),\n      onCompleted(400)\n    );\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = xs.pausableBuffered(controller).subscribe(results);\n      controller.onNext(false);\n    });\n\n    scheduler.scheduleAbsolute(null, 280, function () {\n      controller.onNext(true);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n    results.messages.assertEqual(\n      onNext(280, 2),\n      onNext(280, 3),\n      onCompleted(400)\n    );\n  });\n\n  test('paused with observable controller and pause and unpause', function(){\n    var subscription;\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.createObserver();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onNext(450, 7),\n      onNext(470, 8),\n      onCompleted(500)\n    );\n\n    var controller = scheduler.createHotObservable(\n      onNext(201, true),\n      onNext(300, false),\n      onNext(400, true)\n    );\n\n    var pausableBuffered = xs.pausableBuffered(controller);\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = pausableBuffered.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 460, function () {\n      pausableBuffered.pause();\n    });\n\n    scheduler.scheduleAbsolute(null, 480, function () {\n      pausableBuffered.resume();\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(400, 4),\n      onNext(400, 5),\n      onNext(400, 6),\n      onNext(450, 7),\n      onNext(480, 8),\n      onCompleted(500)\n    );\n  });\n\n  test('paused with immediate unpause', function(){\n    var subscription;\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.createObserver();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(500)\n    );\n\n    var controller = Rx.Observable.just(true);\n\n    var pausableBuffered = xs.pausableBuffered(controller);\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = pausableBuffered.subscribe(results);\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onCompleted(500)\n    );\n\n  });\n\n  test('paused when finishing', function () {\n    var subscription;\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.createObserver();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onNext(450, 7),\n      onNext(470, 8),\n      onCompleted(500)\n    );\n\n    var controller = scheduler.createHotObservable(\n      onNext(201, true),\n      onNext(300, false),\n      onNext(400, true)\n    );\n\n    var pausableBuffered = xs.pausableBuffered(controller);\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = pausableBuffered.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 460, function () {\n      pausableBuffered.pause();\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(400, 4),\n      onNext(400, 5),\n      onNext(400, 6),\n      onNext(450, 7)\n    );\n  });\n\n  test('paused with observable controller and pause and unpause after end', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onNext(450, 7),\n      onNext(470, 8),\n      onCompleted(500)\n    );\n\n    var controller = scheduler.createHotObservable(\n      onNext(201, true),\n      onNext(300, false),\n      onNext(600, true)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.pausableBuffered(controller);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(600, 4),\n      onNext(600, 5),\n      onNext(600, 6),\n      onNext(600, 7),\n      onNext(600, 8),\n      onCompleted(600)\n    );\n  });\n\n  test('paused with observable controller and pause and unpause after error', function(){\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onNext(450, 7),\n      onNext(470, 8),\n      onError(500, error)\n    );\n\n    var controller = scheduler.createHotObservable(\n      onNext(201, true),\n      onNext(300, false),\n      onNext(600, true)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.pausableBuffered(controller);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(600, 4),\n      onNext(600, 5),\n      onNext(600, 6),\n      onNext(600, 7),\n      onNext(600, 8),\n      onError(600, error)\n    );\n  });\n\n  test('paused with state change in subscriber', function(){\n    var subscription;\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.createObserver();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(330, 5),\n      onCompleted(500)\n    );\n\n    var controller = new Rx.Subject();\n\n    var pausableBuffered = xs.pausableBuffered(controller);\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = pausableBuffered.subscribe(\n        function(value){\n          results.onNext(value);\n          controller.onNext(false);\n          scheduler.scheduleRelative(null, 100, function () { controller.onNext(true); });\n        },\n        function (e) { results.onError(e); },\n        function () { results.onCompleted(); }\n      );\n\n      controller.onNext(true);\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(310, 3),\n      onNext(310, 4),\n      onNext(410, 5),\n      onCompleted(500)\n    );\n  });\n\n  test('pausableBuffered produces expected result', 1, function () {\n    var data = new Rx.Subject();\n    var signal = new Rx.Subject();\n    var p = data.pausableBuffered(signal);\n    var results = [];\n    p.subscribe(function (value) { results.push(value); });\n\n    data.onNext(1);\n    signal.onNext(false);\n    signal.onNext(true);\n\n    QUnit.deepEqual(results, [1]);\n  });\n\n  test('paused with default controller and multiple subscriptions', function () {\n    var paused, subscription, subscription2;\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.createObserver();\n    var results2 = scheduler.createObserver();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      paused = xs.pausableBuffered();\n      subscription = paused.subscribe(results);\n      paused.resume();\n    });\n\n    scheduler.scheduleAbsolute(null, 240, function () {\n      subscription2 = paused.subscribe(results2);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n      subscription2.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n\n    results2.messages.assertEqual(\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n  });\n\n  test('pausableBuffered is unaffected by currentThread scheduler', function () {\n    var subscription;\n\n    var scheduler = new TestScheduler();\n\n    var controller = new Subject();\n\n    var results = scheduler.createObserver();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      Rx.Scheduler.currentThread.schedule(null, function () {\n        subscription = xs.pausableBuffered(controller).subscribe(results);\n        controller.onNext(true);\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(301, 4),\n      onNext(350, 5),\n      onNext(399, 6),\n      onCompleted(500)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/pluck.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('pluck');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('pluck completed', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n        onNext(180, {prop: 1}),\n        onNext(210, {prop: 2}),\n        onNext(240, {prop: 3}),\n        onNext(290, {prop: 4}),\n        onNext(350, {prop: 5}),\n        onCompleted(400),\n        onNext(410, {prop: -1}),\n        onCompleted(420),\n        onError(430, new Error('ex'))\n      );\n\n      var results = scheduler.startScheduler(function () {\n        return xs.pluck('prop');\n      });\n\n      results.messages.assertEqual(\n        onNext(210, 2),\n        onNext(240, 3),\n        onNext(290, 4),\n        onNext(350, 5),\n        onCompleted(400)\n      );\n\n      xs.subscriptions.assertEqual(\n        subscribe(200, 400)\n      );\n  });\n\n  test('deep pluck nested completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, {a: {b: {c: 1}}}),\n      onNext(210, {a: {b: {c: 2}}}),\n      onNext(240, {a: {b: {c: 3}}}),\n      onNext(290, {a: {b: {c: 4}}}),\n      onNext(350, {a: {b: {c: 5}}}),\n      onCompleted(400),\n      onNext(410, {a: {b: {c: -1}}}),\n      onCompleted(420),\n      onError(430, new Error('ex'))\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.pluck('a', 'b', 'c');\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(350, 5),\n      onCompleted(400)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 400));\n  });\n\n  test('deep pluck nested edge cases', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n        onNext(180, {a: {b: {c: 1}}}),\n        onNext(210, {a: {b: 2}}),\n        onNext(240, {a: {c: {c: 3}}}),\n        onNext(290, {}),\n        onNext(350, {a: {b: {c: 5}}}),\n        onCompleted(400),\n        onNext(410, {a: {b: {c: -1}}}),\n        onCompleted(420),\n        onError(430, new Error('ex'))\n      );\n\n      var results = scheduler.startScheduler(function () {\n          return xs.pluck('a', 'b', 'c');\n      });\n\n      results.messages.assertEqual(\n        onNext(210, undefined),\n        onNext(240, undefined),\n        onNext(290, undefined),\n        onNext(350, 5),\n        onCompleted(400)\n      );\n\n      xs.subscriptions.assertEqual(\n        subscribe(200, 400)\n      );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/publish.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal, ok */\n  QUnit.module('publish');\n\n  var TestScheduler = Rx.TestScheduler,\n      Observable = Rx.Observable,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe,\n      created = Rx.ReactiveTest.created,\n      disposed = Rx.ReactiveTest.disposed,\n      subscribed = Rx.ReactiveTest.subscribed,\n      inherits = Rx.internals.inherits;\n\n  function add(x, y) { return x + y; }\n\n  test('publish Cold Zip', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(40, 0),\n      onNext(90, 1),\n      onNext(150, 2),\n      onNext(210, 3),\n      onNext(240, 4),\n      onNext(270, 5),\n      onNext(330, 6),\n      onNext(340, 7),\n      onCompleted(390)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.publish(function (ys) { return ys.zip(ys, add); });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 6),\n      onNext(240, 8),\n      onNext(270, 10),\n      onNext(330, 12),\n      onNext(340, 14),\n      onCompleted(390)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 390)\n    );\n  });\n\n  var MySubject = (function (__super__) {\n    inherits(MySubject, __super__);\n    function MySubject() {\n      __super__.call(this);\n      this.disposeOnMap = {};\n      this.subscribeCount = 0;\n      this.disposed = false;\n    }\n\n    MySubject.prototype._subscribe = function (o) {\n      this.subscribeCount++;\n      this.observer = o;\n\n      var self = this;\n      return Rx.Disposable.create(function () { self.disposed = true; });\n    };\n\n    MySubject.prototype.disposeOn = function (value, disposable) {\n      this.disposeOnMap[value] = disposable;\n    };\n\n    MySubject.prototype.onNext = function (value) {\n      this.observer.onNext(value);\n      this.disposeOnMap[value] && this.disposeOnMap[value].dispose();\n    };\n\n    MySubject.prototype.onError = function (exception) {\n        this.observer.onError(exception);\n    };\n\n    MySubject.prototype.onCompleted = function () {\n        this.observer.onCompleted();\n    };\n\n    return MySubject;\n  })(Observable);\n\n  var ConnectableObservable = (function (__super__) {\n    inherits(ConnectableObservable, __super__);\n    function ConnectableObservable(o, s) {\n      __super__.call(this);\n      this._o = o.multicast(s);\n    }\n\n    ConnectableObservable.prototype._subscribe = function (o) { return this._o.subscribe(o); };\n    ConnectableObservable.prototype.connect = function () { return this._o.connect(); };\n    ConnectableObservable.prototype.refCount = function () { return this._o.refCount(); };\n\n    return ConnectableObservable;\n  }(Observable));\n\n  test('refCount connects on first', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(240, 4),\n      onCompleted(250)\n    );\n\n    var subject = new MySubject();\n\n    var conn = new ConnectableObservable(xs, subject);\n\n    var results = scheduler.startScheduler(function () {\n      return conn.refCount();\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(240, 4),\n      onCompleted(250)\n    );\n\n    ok(subject.disposed);\n  });\n\n  test('refCount not connected', function () {\n    var disconnected = false;\n\n    var count = 0;\n\n    var xs = Observable.defer(function () {\n      count++;\n      return Observable.create(function () {\n        return function () { disconnected = true; };\n      });\n    });\n\n    var subject = new MySubject();\n    var conn = new ConnectableObservable(xs, subject);\n\n    var refd = conn.refCount();\n    var dis1 = refd.subscribe();\n\n    equal(1, count);\n    equal(1, subject.subscribeCount);\n    ok(!disconnected);\n\n    var dis2 = refd.subscribe();\n    equal(1, count);\n    equal(2, subject.subscribeCount);\n    ok(!disconnected);\n\n    dis1.dispose();\n    ok(!disconnected);\n\n    dis2.dispose();\n    ok(disconnected);\n\n    disconnected = false;\n\n    var dis3 = refd.subscribe();\n    equal(2, count);\n    equal(3, subject.subscribeCount);\n    ok(!disconnected);\n\n    dis3.dispose();\n    ok(disconnected);\n  });\n\n  test('publish basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var ys;\n    var subscription;\n    var connection;\n\n    var results = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.publish();\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 550, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 650, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      connection.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(520, 11)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(300, 400),\n      subscribe(500, 550),\n      subscribe(650, 800)\n    );\n  });\n\n  test('publish Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onError(600, error)\n    );\n\n    var results = scheduler.createObserver();\n\n    var ys;\n    var subscription;\n    var connection;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.publish();\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      connection.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(520, 11),\n      onNext(560, 20),\n      onError(600, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(300, 400),\n      subscribe(500, 600)\n    );\n  });\n\n  test('publish complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.createObserver();\n\n    var ys;\n    var subscription;\n    var connection;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.publish();\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      connection.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(onNext(340, 8), onNext(360, 5), onNext(370, 6), onNext(390, 7), onNext(520, 11), onNext(560, 20), onCompleted(600));\n\n    xs.subscriptions.assertEqual(subscribe(300, 400), subscribe(500, 600));\n  });\n\n  test('publish dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.createObserver();\n\n    var ys;\n    var subscription;\n    var connection;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.publish();\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 350, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 550, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 650, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      connection.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(340, 8)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(300, 400),\n      subscribe(500, 550),\n      subscribe(650, 800)\n    );\n  });\n\n  test('publish multiple connections', function () {\n      var xs = Observable.never();\n\n      var ys = xs.publish();\n\n      var connection1 = ys.connect();\n      var connection2 = ys.connect();\n\n      ok(connection1 === connection2);\n\n      connection1.dispose();\n      connection2.dispose();\n\n      var connection3 = ys.connect();\n\n      ok(connection1 !== connection3);\n\n      connection3.dispose();\n  });\n\n  test('publishLambda zip complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.publish(function (_xs) {\n        return _xs.zip(_xs.skip(1), add);\n      });\n    });\n\n    results.messages.assertEqual(onNext(280, 7), onNext(290, 5), onNext(340, 9), onNext(360, 13), onNext(370, 11), onNext(390, 13), onNext(410, 20), onNext(430, 15), onNext(450, 11), onNext(520, 20), onNext(560, 31), onCompleted(600));\n\n    xs.subscriptions.assertEqual(subscribe(200, 600));\n  });\n\n  test('publishLambda zip error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onError(600, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.publish(function (_xs) {\n        return _xs.zip(_xs.skip(1), add);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(280, 7),\n      onNext(290, 5),\n      onNext(340, 9),\n      onNext(360, 13),\n      onNext(370, 11),\n      onNext(390, 13),\n      onNext(410, 20),\n      onNext(430, 15),\n      onNext(450, 11),\n      onNext(520, 20),\n      onNext(560, 31),\n      onError(600, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n  test('publishLambda zip dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.publish(function (_xs) { return _xs.zip(_xs.skip(1), add); });\n    }, { disposed: 470 });\n\n    results.messages.assertEqual(\n      onNext(280, 7),\n      onNext(290, 5),\n      onNext(340, 9),\n      onNext(360, 13),\n      onNext(370, 11),\n      onNext(390, 13),\n      onNext(410, 20),\n      onNext(430, 15),\n      onNext(450, 11)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 470)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/publishlast.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, ok */\n  QUnit.module('publishLast');\n\n  var TestScheduler = Rx.TestScheduler,\n      Observable = Rx.Observable,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe,\n      created = Rx.ReactiveTest.created,\n      disposed = Rx.ReactiveTest.disposed,\n      subscribed = Rx.ReactiveTest.subscribed;\n\n  function add(x, y) { return x + y; }\n\n  test('publishLast basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(onNext(110, 7), onNext(220, 3), onNext(280, 4), onNext(290, 1), onNext(340, 8), onNext(360, 5), onNext(370, 6), onNext(390, 7), onNext(410, 13), onNext(430, 2), onNext(450, 9), onNext(520, 11), onNext(560, 20), onCompleted(600));\n\n    var results = scheduler.createObserver();\n\n    var ys;\n    var subscription;\n    var connection;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.publishLast();\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 550, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 650, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      connection.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(300, 400),\n      subscribe(500, 550),\n      subscribe(650, 800)\n    );\n  });\n\n  test('publishLast Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onError(600, error)\n    );\n\n    var results = scheduler.createObserver();\n\n    var ys;\n    var subscription;\n    var connection;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.publishLast();\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n        subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      connection.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onError(600, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(300, 400),\n      subscribe(500, 600)\n    );\n  });\n\n  test('publishLast complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.createObserver();\n\n    var ys;\n    var subscription;\n    var connection;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.publishLast();\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      connection.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(600, 20),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(300, 400),\n      subscribe(500, 600)\n    );\n  });\n\n  test('publishLast dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.createObserver();\n\n    var ys;\n    var subscription;\n    var connection;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.publishLast();\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 350, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 550, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 650, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      connection.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(300, 400),\n      subscribe(500, 550),\n      subscribe(650, 800)\n    );\n  });\n\n  test('publishLast multiple connections', function () {\n    var xs = Observable.never();\n    var ys = xs.publishLast();\n\n    var connection1 = ys.connect();\n    var connection2 = ys.connect();\n    ok(connection1 === connection2);\n\n    connection1.dispose();\n    connection2.dispose();\n\n    var connection3 = ys.connect();\n    ok(connection1 !== connection3);\n  });\n\n  test('publishLast zip complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.publishLast(function (_xs) {\n        return _xs.zip(_xs, add);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(600, 40),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n  test('publishLast zip Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onError(600, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.publishLast(function (_xs) {\n        return _xs.zip(_xs, add);\n      });\n    });\n\n    results.messages.assertEqual(\n      onError(600, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n  test('publishLast zip dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.publishLast(function (_xs) {\n        return _xs.zip(_xs, add);\n      });\n    }, { disposed: 470 });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 470)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/publishvalue.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, ok */\n\n  QUnit.module('publishValue');\n\n  var TestScheduler = Rx.TestScheduler,\n      Observable = Rx.Observable,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe,\n      created = Rx.ReactiveTest.created,\n      disposed = Rx.ReactiveTest.disposed,\n      subscribed = Rx.ReactiveTest.subscribed;\n\n  function add(x, y) { return x + y; }\n\n  test('publishValue basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.createObserver();\n\n    var ys;\n    var subscription;\n    var connection;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.publishValue(1979);\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 550, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 650, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      connection.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(200, 1979),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(520, 11)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(300, 400),\n      subscribe(500, 550),\n      subscribe(650, 800)\n    );\n  });\n\n  test('publishValue error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onError(600, error)\n    );\n\n    var results = scheduler.createObserver();\n\n    var ys;\n    var subscription;\n    var connection;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.publishValue(1979);\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      connection.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(200, 1979),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(520, 11),\n      onNext(560, 20),\n      onError(600, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(300, 400),\n      subscribe(500, 600)\n    );\n  });\n\n  test('publishValue complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.createObserver();\n\n    var ys;\n    var subscription;\n    var connection;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.publishValue(1979);\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      connection.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(200, 1979),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(300, 400),\n      subscribe(500, 600)\n    );\n  });\n\n  test('publishValue dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var ys;\n    var subscription;\n    var connection;\n\n    var results = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.publishValue(1979);\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 350, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 550, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 650, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      connection.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(200, 1979),\n      onNext(340, 8)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(300, 400),\n      subscribe(500, 550),\n      subscribe(650, 800)\n    );\n  });\n\n  test('publishValue multiple connections', function () {\n    var xs = Observable.never();\n    var ys = xs.publishValue(1979);\n\n    var connection1 = ys.connect();\n    var connection2 = ys.connect();\n\n    ok(connection1 === connection2);\n\n    connection1.dispose();\n    connection2.dispose();\n\n    var connection3 = ys.connect();\n    ok(connection1 !== connection3);\n  });\n\n  test('publishValue zip complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.publishValue(function (_xs) {\n        return _xs.zip(_xs.skip(1), add);\n      }, 1979);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 1982),\n      onNext(280, 7),\n      onNext(290, 5),\n      onNext(340, 9),\n      onNext(360, 13),\n      onNext(370, 11),\n      onNext(390, 13),\n      onNext(410, 20),\n      onNext(430, 15),\n      onNext(450, 11),\n      onNext(520, 20),\n      onNext(560, 31),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n  test('publishValue zip error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onError(600, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.publishValue(function (_xs) {\n          return _xs.zip(_xs.skip(1), add);\n      }, 1979);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 1982),\n      onNext(280, 7),\n      onNext(290, 5),\n      onNext(340, 9),\n      onNext(360, 13),\n      onNext(370, 11),\n      onNext(390, 13),\n      onNext(410, 20),\n      onNext(430, 15),\n      onNext(450, 11),\n      onNext(520, 20),\n      onNext(560, 31),\n      onError(600, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n  test('publishValue zip dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.publishValue(function (_xs) {\n        return _xs.zip(_xs.skip(1), add);\n      }, 1979);\n    }, { disposed: 470 });\n\n    results.messages.assertEqual(\n      onNext(220, 1982),\n      onNext(280, 7),\n      onNext(290, 5),\n      onNext(340, 9),\n      onNext(360, 13),\n      onNext(370, 11),\n      onNext(390, 13),\n      onNext(410, 20),\n      onNext(430, 15),\n      onNext(450, 11)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 470)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/range.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('range');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('range zero', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.range(0, 0, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(201)\n    );\n  });\n\n  test('range one', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.range(0, 1, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 0),\n      onCompleted(202)\n    );\n  });\n\n  test('range five', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.range(10, 5, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 10),\n      onNext(202, 11),\n      onNext(203, 12),\n      onNext(204, 13),\n      onNext(205, 14),\n      onCompleted(206)\n    );\n  });\n\n  test('range dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.range(-10, 5, scheduler);\n    }, { disposed: 204 });\n\n    results.messages.assertEqual(\n      onNext(201, -10),\n      onNext(202, -9),\n      onNext(203, -8)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/reduce.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('reduce');\n\n  function add(x, y) { return x + y; }\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('reduce with seed empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.reduce(add, 42);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 42),\n      onCompleted(250)\n    );\n  });\n\n  test('reduce with seed return', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 24),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.reduce(add, 42);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 42 + 24),\n      onCompleted(250)\n    );\n  });\n\n  test('reduce with seed throws error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 24),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.reduce(function () { throw error; }, 42);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('reduce with seed throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.reduce(add, 42);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('reduce with seed never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.reduce(add, 42);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('reduce with seed range', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 0),\n      onNext(220, 1),\n      onNext(230, 2),\n      onNext(240, 3),\n      onNext(250, 4),\n      onCompleted(260)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.reduce(add, 42);\n    });\n\n    results.messages.assertEqual(\n      onNext(260, 10 + 42),\n      onCompleted(260)\n    );\n  });\n\n  test('reduce without seed empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(onNext(150, 1), onCompleted(250));\n    var results = scheduler.startScheduler(function () {\n      return xs.reduce(add);\n    });\n\n    results.messages.assertEqual(\n      onError(250, function (n) { return n.error instanceof Rx.EmptyError; })\n    );\n  });\n\n  test('reduce without seed return', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 24),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.reduce(add);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 24),\n      onCompleted(250)\n    );\n  });\n\n  test('reduce without seed throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.reduce(add);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('reduce without seed never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.reduce(add);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('reduce without seed range', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 0),\n      onNext(220, 1),\n      onNext(230, 2),\n      onNext(240, 3),\n      onNext(250, 4), onCompleted(260)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.reduce(add);\n    });\n\n    results.messages.assertEqual(\n      onNext(260, 10),\n      onCompleted(260)\n    );\n  });\n\n  test('reduce without seed throws error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 24),\n      onNext(220, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.reduce(function () { throw error; });\n    });\n\n    results.messages.assertEqual(\n      onError(220, error)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/repeat.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, raises */\n\n  QUnit.module('Repeat');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('repeat value count zero', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.repeat(42, 0, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(201)\n    );\n  });\n\n  test('repeat value count one', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.repeat(42, 1, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 42),\n      onCompleted(201)\n    );\n  });\n\n  test('repeat value count ten', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.repeat(42, 10, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 42),\n      onNext(202, 42),\n      onNext(203, 42),\n      onNext(204, 42),\n      onNext(205, 42),\n      onNext(206, 42),\n      onNext(207, 42),\n      onNext(208, 42),\n      onNext(209, 42),\n      onNext(210, 42),\n      onCompleted(210)\n    );\n  });\n\n  test('repeat value count dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.repeat(42, 10, scheduler);\n    }, { disposed: 207 });\n\n    results.messages.assertEqual(\n      onNext(201, 42),\n      onNext(202, 42),\n      onNext(203, 42),\n      onNext(204, 42),\n      onNext(205, 42),\n      onNext(206, 42)\n    );\n  });\n\n  test('repeat value', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.repeat(42, -1, scheduler);\n    }, { disposed: 207 });\n\n    results.messages.assertEqual(\n      onNext(201, 42),\n      onNext(202, 42),\n      onNext(203, 42),\n      onNext(204, 42),\n      onNext(205, 42),\n      onNext(206, 42)\n    );\n  });\n\n  function noop() { }\n\n  test('repeat Observable basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 1),\n      onNext(150, 2),\n      onNext(200, 3),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.repeat();\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 1),\n      onNext(350, 2),\n      onNext(400, 3),\n      onNext(550, 1),\n      onNext(600, 2),\n      onNext(650, 3),\n      onNext(800, 1),\n      onNext(850, 2),\n      onNext(900, 3));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450),\n      subscribe(450, 700),\n      subscribe(700, 950),\n      subscribe(950, 1000));\n  });\n\n  test('repeat Observable infinite', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 1),\n      onNext(150, 2),\n      onNext(200, 3));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.repeat();\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 1),\n      onNext(350, 2),\n      onNext(400, 3));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000));\n  });\n\n  test('Repeat Observable error', function () {\n    var scheduler = new TestScheduler();\n\n    var error = new Error();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 1),\n      onNext(150, 2),\n      onNext(200, 3),\n      onError(250, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.repeat();\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 1),\n      onNext(350, 2),\n      onNext(400, 3),\n      onError(450, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450));\n  });\n\n  test('Repeat Observable throws', function () {\n    var scheduler1 = new TestScheduler();\n    var xs = Observable.just(1, scheduler1).repeat();\n\n    xs.subscribe(function () {\n      throw new Error();\n    });\n\n    raises(function () {\n      scheduler1.start();\n    });\n\n    var scheduler2 = new TestScheduler();\n    var ys = Observable['throw'](new Error(), scheduler2).repeat();\n\n    ys.subscribe(noop, function () {\n      throw new Error();\n    });\n\n    raises(function () {\n      scheduler2.start();\n    });\n\n    var scheduler3 = new TestScheduler();\n    var zs = Observable.just(1, scheduler3).repeat();\n\n    var d = zs.subscribe(noop, noop, function () { throw new Error(); });\n\n    scheduler3.scheduleAbsolute(null, 210, function () {\n      d.dispose();\n    });\n\n    scheduler3.start();\n\n    var xss = Observable.create(function () { throw new Error(); }).repeat();\n\n    raises(function () {\n      xss.subscribe();\n    });\n  });\n\n  test('Repeat Observable repeat count Basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(5, 1),\n      onNext(10, 2),\n      onNext(15, 3),\n      onCompleted(20));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.repeat(3);\n    });\n\n    results.messages.assertEqual(\n      onNext(205, 1),\n      onNext(210, 2),\n      onNext(215, 3),\n      onNext(225, 1),\n      onNext(230, 2),\n      onNext(235, 3),\n      onNext(245, 1),\n      onNext(250, 2),\n      onNext(255, 3),\n      onCompleted(260));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 220),\n      subscribe(220, 240),\n      subscribe(240, 260));\n  });\n\n  test('Repeat Observable repeat count dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(5, 1),\n      onNext(10, 2),\n      onNext(15, 3),\n      onCompleted(20));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.repeat(3);\n    }, { disposed: 231 });\n\n    results.messages.assertEqual(\n      onNext(205, 1),\n      onNext(210, 2),\n      onNext(215, 3),\n      onNext(225, 1),\n      onNext(230, 2));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 220),\n      subscribe(220, 231));\n  });\n\n  test('repeat Observable repeat count infinite', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 1),\n      onNext(150, 2),\n      onNext(200, 3)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.repeat(3);\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 1),\n      onNext(350, 2),\n      onNext(400, 3)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n  test('repeat Observable repeat count error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 1),\n      onNext(150, 2),\n      onNext(200, 3),\n      onError(250, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.repeat(3);\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 1),\n      onNext(350, 2),\n      onNext(400, 3),\n      onError(450, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450));\n  });\n\n  test('repeat Observable repeat count throws', function () {\n    var scheduler1 = new TestScheduler();\n    var xs = Observable.just(1, scheduler1).repeat(3);\n\n    xs.subscribe(function () { throw new Error(); });\n\n    raises(function () {\n      return scheduler1.start();\n    });\n\n    var scheduler2 = new TestScheduler();\n    var ys = Observable['throw'](new Error(), scheduler2).repeat(3);\n\n    ys.subscribe(noop, function () { throw new Error(); });\n\n    raises(function () {\n      scheduler2.start();\n    });\n\n    var scheduler3 = new TestScheduler();\n    var zs = Observable.just(1, scheduler3).repeat(100);\n\n    var d = zs.subscribe(noop, noop, function () { throw new Error(); });\n\n    scheduler3.scheduleAbsolute(null, 10, function () {\n      d.dispose();\n    });\n\n    scheduler3.start();\n\n    var xss = Observable.create(function () { throw new Error(); }).repeat(3);\n\n    raises(function () {\n      xss.subscribe();\n    });\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/repeatwhen.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('repeatWhen');\n\n  var Observable = Rx.Observable,\n    TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe;\n\n  test('repeatWhen never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.repeatWhen(function () {\n        return Observable.empty(scheduler);\n      });\n    });\n\n    results.messages.assertEqual(\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n  });\n\n  test('repeatWhen Observable never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.repeatWhen(function () {\n        return Observable.never();\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n  });\n\n  test('repeatWhen Observable never complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.repeatWhen(function () {\n        return Observable.never();\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n  });\n\n  test('repeatWhen Observable Empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 1),\n      onNext(150, 2),\n      onNext(200, 3),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.repeatWhen(function() {\n        return Observable.empty(scheduler);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 1),\n      onNext(350, 2),\n      onNext(400, 3),\n      onCompleted(450)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450)\n    );\n  });\n\n  test('repeatWhen Observable Next Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(10, 1),\n      onNext(20, 2),\n      onError(30, error),\n      onCompleted(40)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.repeatWhen(function(attempts) {\n        return attempts.scan(function(count) {\n          if(++count === 2) {\n            throw error;\n          }\n          return count;\n        }, 0); // returning any nexting observable should cause a continue\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onError(230, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230)\n    );\n  });\n\n  test('repeatWhen Observable complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(10, 1),\n      onNext(20, 2),\n      onCompleted(30)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.repeatWhen(function() {\n        return Observable.empty(scheduler); // a completing observable completes\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230)\n    );\n  });\n\n  test('repeatWhen Observable next complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(10, 1),\n      onNext(20, 2),\n      onCompleted(30)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.repeatWhen(function(attempts) {\n        return attempts.scan(function(count) {\n          return count + 1;\n        }, 0).takeWhile(function(count) {\n          return count < 2;\n        }); // returning any nexting observable should cause a continue\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(240, 1),\n      onNext(250, 2),\n      onCompleted(260)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230),\n      subscribe(230, 260)\n    );\n  });\n\n  test('repeatWhen Observable infinite', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(10, 1),\n      onNext(20, 2),\n      onCompleted(30)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.repeatWhen(function(){\n        return Observable.never();\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/replay.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, ok */\n\n  QUnit.module('replay');\n\n  var TestScheduler = Rx.TestScheduler,\n      Observable = Rx.Observable,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe,\n      created = Rx.ReactiveTest.created,\n      disposed = Rx.ReactiveTest.disposed;\n\n  test('replay count basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.createObserver();\n\n    var ys;\n    var subscription;\n    var connection;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.replay(null, 3, null, scheduler);\n    });\n\n    scheduler.scheduleAbsolute(null, 450, function () {\n      subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 550, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 650, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      connection.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(451, 5),\n      onNext(452, 6),\n      onNext(453, 7),\n      onNext(521, 11)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(300, 400),\n      subscribe(500, 550),\n      subscribe(650, 800)\n    );\n  });\n\n  test('replay count error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(onNext(110, 7), onNext(220, 3), onNext(280, 4), onNext(290, 1), onNext(340, 8), onNext(360, 5), onNext(370, 6), onNext(390, 7), onNext(410, 13), onNext(430, 2), onNext(450, 9), onNext(520, 11), onNext(560, 20), onError(600, error));\n\n    var results = scheduler.createObserver();\n\n    var ys;\n    var subscription;\n    var connection;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n       ys = xs.replay(null, 3, null, scheduler);\n    });\n\n    scheduler.scheduleAbsolute(null, 450, function () {\n      subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n        connection.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(451, 5),\n      onNext(452, 6),\n      onNext(453, 7),\n      onNext(521, 11),\n      onNext(561, 20),\n      onError(601, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(300, 400),\n      subscribe(500, 600)\n    );\n  });\n\n  test('replay count complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.createObserver();\n\n    var ys;\n    var subscription;\n    var connection;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.replay(null, 3, null, scheduler);\n    });\n\n    scheduler.scheduleAbsolute(null, 450, function () {\n      subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      connection.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(451, 5),\n      onNext(452, 6),\n      onNext(453, 7),\n      onNext(521, 11),\n      onNext(561, 20),\n      onCompleted(601)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(300, 400),\n      subscribe(500, 600)\n    );\n  });\n\n  test('replay count dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(onNext(110, 7), onNext(220, 3), onNext(280, 4), onNext(290, 1), onNext(340, 8), onNext(360, 5), onNext(370, 6), onNext(390, 7), onNext(410, 13), onNext(430, 2), onNext(450, 9), onNext(520, 11), onNext(560, 20), onCompleted(600));\n\n    var results = scheduler.createObserver();\n\n    var ys;\n    var subscription;\n    var connection;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.replay(null, 3, null, scheduler);\n    });\n\n    scheduler.scheduleAbsolute(null, 450, function () {\n      subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 475, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 550, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 650, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      connection.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(451, 5),\n      onNext(452, 6),\n      onNext(453, 7)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(300, 400),\n      subscribe(500, 550),\n      subscribe(650, 800)\n    );\n  });\n\n  test('replay count multiple connections', function () {\n    var xs = Observable.never();\n    var ys = xs.replay(null, 3);\n\n    var connection1 = ys.connect();\n    var connection2 = ys.connect();\n    ok(connection1 === connection2);\n\n    connection1.dispose();\n    connection2.dispose();\n\n    var connection3 = ys.connect();\n    ok(connection1 !== connection3);\n  });\n\n  test('replay count function zip complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.replay(function (_xs) {\n        return _xs.take(6).repeat();\n      }, 3, null, scheduler);\n    }, {disposed: 610 });\n\n    results.messages.assertEqual(\n      onNext(221, 3),\n      onNext(281, 4),\n      onNext(291, 1),\n      onNext(341, 8),\n      onNext(361, 5),\n      onNext(371, 6),\n      onNext(372, 8),\n      onNext(373, 5),\n      onNext(374, 6),\n      onNext(391, 7),\n      onNext(411, 13),\n      onNext(431, 2),\n      onNext(432, 7),\n      onNext(433, 13),\n      onNext(434, 2),\n      onNext(451, 9),\n      onNext(521, 11),\n      onNext(561, 20),\n      onNext(562, 9),\n      onNext(563, 11),\n      onNext(564, 20),\n      onNext(602, 9),\n      onNext(603, 11),\n      onNext(604, 20),\n      onNext(606, 9),\n      onNext(607, 11),\n      onNext(608, 20)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n  test('replay count function zip error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onError(600, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.replay(function (_xs) {\n        return _xs.take(6).repeat();\n      }, 3, null, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(221, 3),\n      onNext(281, 4),\n      onNext(291, 1),\n      onNext(341, 8),\n      onNext(361, 5),\n      onNext(371, 6),\n      onNext(372, 8),\n      onNext(373, 5),\n      onNext(374, 6),\n      onNext(391, 7),\n      onNext(411, 13),\n      onNext(431, 2),\n      onNext(432, 7),\n      onNext(433, 13),\n      onNext(434, 2),\n      onNext(451, 9),\n      onNext(521, 11),\n      onNext(561, 20),\n      onNext(562, 9),\n      onNext(563, 11),\n      onNext(564, 20),\n      onError(601, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n  test('replay count function zip dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.replay(function (_xs) {\n        return _xs.take(6).repeat();\n      }, 3, null, scheduler);\n    }, { disposed: 470 });\n\n    results.messages.assertEqual(\n      onNext(221, 3),\n      onNext(281, 4),\n      onNext(291, 1),\n      onNext(341, 8),\n      onNext(361, 5),\n      onNext(371, 6),\n      onNext(372, 8),\n      onNext(373, 5),\n      onNext(374, 6),\n      onNext(391, 7),\n      onNext(411, 13),\n      onNext(431, 2),\n      onNext(432, 7),\n      onNext(433, 13),\n      onNext(434, 2),\n      onNext(451, 9)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 470)\n    );\n  });\n\n  test('replay time basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.createObserver();\n\n    var ys;\n    var subscription;\n    var connection;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.replay(null, null, 150, scheduler);\n    });\n\n    scheduler.scheduleAbsolute(null, 450, function () {\n      subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n    connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 550, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 650, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      connection.dispose();\n    });\n\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(451, 8),\n      onNext(452, 5),\n      onNext(453, 6),\n      onNext(454, 7), onNext(521, 11)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(300, 400),\n      subscribe(500, 550),\n      subscribe(650, 800)\n    );\n  });\n\n  test('replay time error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onError(600, error)\n     );\n\n    var results = scheduler.createObserver();\n\n    var ys;\n    var subscription;\n    var connection;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.replay(null, null, 75, scheduler);\n    });\n\n    scheduler.scheduleAbsolute(null, 450, function () {\n      subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      connection.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(451, 7),\n      onNext(521, 11),\n      onNext(561, 20),\n      onError(601, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(300, 400),\n      subscribe(500, 600)\n    );\n  });\n\n  test('replay time complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(onNext(110, 7), onNext(220, 3), onNext(280, 4), onNext(290, 1), onNext(340, 8), onNext(360, 5), onNext(370, 6), onNext(390, 7), onNext(410, 13), onNext(430, 2), onNext(450, 9), onNext(520, 11), onNext(560, 20), onCompleted(600));\n\n    var results = scheduler.createObserver();\n\n    var ys;\n    var subscription;\n    var connection;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.replay(null, null, 85, scheduler);\n    });\n\n    scheduler.scheduleAbsolute(null, 450, function () {\n      subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      connection.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(451, 6),\n      onNext(452, 7),\n      onNext(521, 11),\n      onNext(561, 20),\n      onCompleted(601)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(300, 400),\n      subscribe(500, 600)\n    );\n  });\n\n  test('replay time dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.createObserver();\n\n    var ys;\n    var subscription;\n    var connection;\n\n    scheduler.scheduleAbsolute(null, created, function () {\n        ys = xs.replay(null, null, 100, scheduler);\n    });\n\n    scheduler.scheduleAbsolute(null, 450, function () {\n      subscription = ys.subscribe(results);\n    });\n\n    scheduler.scheduleAbsolute(null, 475, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 550, function () {\n        connection.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 650, function () {\n      connection = ys.connect();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      connection.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(451, 5),\n      onNext(452, 6),\n      onNext(453, 7)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(300, 400),\n      subscribe(500, 550),\n      subscribe(650, 800)\n    );\n  });\n\n  test('replay time multiple connections', function () {\n    var xs = Observable.never();\n    var ys = xs.replay(null, null, 100);\n\n    var connection1 = ys.connect();\n    var connection2 = ys.connect();\n    ok(connection1 === connection2);\n\n    connection1.dispose();\n    connection2.dispose();\n\n    var connection3 = ys.connect();\n    ok(connection1 !== connection3);\n  });\n\n  test('replay time function zip complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.replay(function (_xs) {\n        return _xs.take(6).repeat();\n      }, null, 50, scheduler);\n    }, { disposed: 610 });\n\n    results.messages.assertEqual(\n      onNext(221, 3),\n      onNext(281, 4),\n      onNext(291, 1),\n      onNext(341, 8),\n      onNext(361, 5),\n      onNext(371, 6),\n      onNext(372, 8),\n      onNext(373, 5),\n      onNext(374, 6),\n      onNext(391, 7),\n      onNext(411, 13),\n      onNext(431, 2),\n      onNext(432, 7),\n      onNext(433, 13),\n      onNext(434, 2),\n      onNext(451, 9),\n      onNext(521, 11),\n      onNext(561, 20),\n      onNext(562, 11),\n      onNext(563, 20),\n      onNext(602, 20),\n      onNext(604, 20),\n      onNext(606, 20),\n      onNext(608, 20)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n  test('replay time function zip error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onError(600, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.replay(function (_xs) {\n        return _xs.take(6).repeat();\n      }, null, 50, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(221, 3),\n      onNext(281, 4),\n      onNext(291, 1),\n      onNext(341, 8),\n      onNext(361, 5),\n      onNext(371, 6),\n      onNext(372, 8),\n      onNext(373, 5),\n      onNext(374, 6),\n      onNext(391, 7),\n      onNext(411, 13),\n      onNext(431, 2),\n      onNext(432, 7),\n      onNext(433, 13),\n      onNext(434, 2),\n      onNext(451, 9),\n      onNext(521, 11),\n      onNext(561, 20),\n      onNext(562, 11),\n      onNext(563, 20),\n      onError(601, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n  test('replay time function zip dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 7),\n      onNext(220, 3),\n      onNext(280, 4),\n      onNext(290, 1),\n      onNext(340, 8),\n      onNext(360, 5),\n      onNext(370, 6),\n      onNext(390, 7),\n      onNext(410, 13),\n      onNext(430, 2),\n      onNext(450, 9),\n      onNext(520, 11),\n      onNext(560, 20),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.replay(function (_xs) {\n        return _xs.take(6).repeat();\n      }, null, 50, scheduler);\n    }, { disposed: 470 });\n\n    results.messages.assertEqual(\n      onNext(221, 3),\n      onNext(281, 4),\n      onNext(291, 1),\n      onNext(341, 8),\n      onNext(361, 5),\n      onNext(371, 6),\n      onNext(372, 8),\n      onNext(373, 5),\n      onNext(374, 6),\n      onNext(391, 7),\n      onNext(411, 13),\n      onNext(431, 2),\n      onNext(432, 7),\n      onNext(433, 13),\n      onNext(434, 2),\n      onNext(451, 9)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 470)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/retry.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, raises */\n\n  QUnit.module('retry');\n\n  function noop() { }\n\n  var Observable = Rx.Observable,\n    TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe;\n\n  test('retry Observable basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 1),\n      onNext(150, 2),\n      onNext(200, 3),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.retry();\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 1),\n      onNext(350, 2),\n      onNext(400, 3),\n      onCompleted(450)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450)\n    );\n  });\n\n  test('retry Observable infinite', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 1),\n      onNext(150, 2),\n      onNext(200, 3)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.retry();\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 1),\n      onNext(350, 2),\n      onNext(400, 3)\n    );\n\n    return xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n  test('retry Observable error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 1),\n      onNext(150, 2),\n      onNext(200, 3),\n      onError(250, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.retry();\n    }, { disposed: 1100 });\n\n    results.messages.assertEqual(\n      onNext(300, 1),\n      onNext(350, 2),\n      onNext(400, 3),\n      onNext(550, 1),\n      onNext(600, 2),\n      onNext(650, 3),\n      onNext(800, 1),\n      onNext(850, 2),\n      onNext(900, 3),\n      onNext(1050, 1)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450),\n      subscribe(450, 700),\n      subscribe(700, 950),\n      subscribe(950, 1100)\n    );\n  });\n\n  test('retry Observable throws', function () {\n    var scheduler1 = new TestScheduler();\n\n    var xs = Observable.just(1, scheduler1).retry();\n\n    xs.subscribe(function () {\n      throw new Error();\n    });\n\n    raises(function () {\n      return scheduler1.start();\n    });\n\n    var scheduler2 = new TestScheduler();\n\n    var ys = Observable['throw'](new Error(), scheduler2).retry();\n\n    var d = ys.subscribe(noop, function (err) { throw err; });\n\n    scheduler2.scheduleAbsolute(null, 210, function () {\n      return d.dispose();\n    });\n\n    scheduler2.start();\n\n    var scheduler3 = new TestScheduler();\n\n    var zs = Observable.just(1, scheduler3).retry();\n\n    zs.subscribe(noop, noop, function () { throw new Error(); });\n\n    raises(function () {\n      return scheduler3.start();\n    });\n  });\n\n  test('retry Observable retry count basic', function () {\n    var scheduler = new TestScheduler();\n\n    var error = new Error();\n\n    var xs = scheduler.createColdObservable(\n      onNext(5, 1),\n      onNext(10, 2),\n      onNext(15, 3),\n      onError(20, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.retry(3);\n    });\n\n    results.messages.assertEqual(\n      onNext(205, 1),\n      onNext(210, 2),\n      onNext(215, 3),\n      onNext(225, 1),\n      onNext(230, 2),\n      onNext(235, 3),\n      onNext(245, 1),\n      onNext(250, 2),\n      onNext(255, 3),\n      onError(260, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 220),\n      subscribe(220, 240),\n      subscribe(240, 260)\n    );\n  });\n\n  test('retry Observable retry count dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var error = new Error();\n\n    var xs = scheduler.createColdObservable(\n      onNext(5, 1),\n      onNext(10, 2),\n      onNext(15, 3),\n      onError(20, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.retry(3);\n    }, { disposed: 231 });\n\n    results.messages.assertEqual(\n      onNext(205, 1),\n      onNext(210, 2),\n      onNext(215, 3),\n      onNext(225, 1),\n      onNext(230, 2)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 220),\n      subscribe(220, 231)\n    );\n  });\n\n  test('retry retry count dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 1),\n      onNext(150, 2),\n      onNext(200, 3)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.retry(3);\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 1),\n      onNext(350, 2),\n      onNext(400, 3)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n  test('retry Observable retry count dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 1),\n      onNext(150, 2),\n      onNext(200, 3),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.retry(3);\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 1),\n      onNext(350, 2),\n      onNext(400, 3),\n      onCompleted(450)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450)\n    );\n  });\n\n  test('retry Observable retry count Throws', function () {\n    var scheduler1 = new TestScheduler();\n\n    var xs = Observable.just(1, scheduler1).retry(3);\n\n    xs.subscribe(function () {\n      throw new Error();\n    });\n\n    raises(function () {\n      return scheduler1.start();\n    });\n\n    var scheduler2 = new TestScheduler();\n\n    var ys = Observable['throw'](new Error(), scheduler2).retry(100);\n\n    var d = ys.subscribe(noop, function (err) { throw err; });\n\n    scheduler2.scheduleAbsolute(null, 10, function () {\n      return d.dispose();\n    });\n\n    scheduler2.start();\n\n    var scheduler3 = new TestScheduler();\n\n    var zs = Observable.just(1, scheduler3).retry(100);\n\n    zs.subscribe(noop, noop, function () { throw new Error(); });\n\n    raises(function () {\n      return scheduler3.start();\n    });\n\n    var xss = Observable.create(function () { throw new Error(); }).retry(100);\n\n    raises(function () {\n      return xss.subscribe();\n    });\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/retrywhen.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('retryWhen');\n\n  var Observable = Rx.Observable,\n    TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe;\n\n  test('retryWhen never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.retryWhen(function () {\n        return Observable.empty(scheduler);\n      });\n    });\n\n    results.messages.assertEqual(\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n  });\n\n  test('retryWhen Observable never', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onError(250, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.retryWhen(function () {\n        return Observable.never();\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n  });\n\n  test('retryWhen Observable never complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.retryWhen(function () {\n        return Observable.never();\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n  });\n\n  test('retryWhen Observable Empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 1),\n      onNext(150, 2),\n      onNext(200, 3),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.retryWhen(function() {\n        return Observable.empty(scheduler);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 1),\n      onNext(350, 2),\n      onNext(400, 3),\n      onCompleted(450)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450)\n    );\n  });\n\n  test('retryWhen Observable Next Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(10, 1),\n      onNext(20, 2),\n      onError(30, error),\n      onCompleted(40)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.retryWhen(function(attempts) {\n        return attempts.scan(function(count) {\n          if(++count === 2) {\n            throw error;\n          }\n          return count;\n        }, 0); // returning any nexting observable should cause a continue\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(240, 1),\n      onNext(250, 2),\n      onError(260, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230),\n      subscribe(230, 260)\n    );\n  });\n\n  test('retryWhen Observable complete', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(10, 1),\n      onNext(20, 2),\n      onError(30, error),\n      onCompleted(40)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.retryWhen(function() {\n        return Observable.empty(scheduler); // a completing observable completes\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230)\n    );\n  });\n\n  test('retryWhen Observable next complete', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(10, 1),\n      onNext(20, 2),\n      onError(30, error),\n      onCompleted(40)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.retryWhen(function(attempts) {\n        return attempts.scan(function(count) {\n          return count + 1;\n        }, 0).takeWhile(function(count) {\n          return count < 2;\n        }); // returning any nexting observable should cause a continue\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(240, 1),\n      onNext(250, 2),\n      onCompleted(260)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230),\n      subscribe(230, 260)\n    );\n  });\n\n  test('retryWhen Observable infinite', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(10, 1),\n      onNext(20, 2),\n      onError(30, error),\n      onCompleted(40)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.retryWhen(function(){\n        return Observable.never();\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/return.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, raises */\n  QUnit.module('just');\n\n  var Observable = Rx.Observable,\n    TestScheduler = Rx.TestScheduler,\n    SerialDisposable = Rx.SerialDisposable,\n    onNext = Rx.ReactiveTest.onNext,\n    onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('just basic', function () {\n    var scheduler = new TestScheduler();\n\n    var res = scheduler.startScheduler(function () {\n      return Observable.just(42, scheduler);\n    });\n\n    res.messages.assertEqual(\n      onNext(201, 42),\n      onCompleted(201)\n    );\n  });\n\n  test('just disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var res = scheduler.startScheduler(function () {\n      return Observable.just(42, scheduler);\n    }, { disposed: 200 });\n\n    res.messages.assertEqual();\n  });\n\n  test('just disposed after next', function () {\n    var scheduler = new TestScheduler();\n\n    var d = new SerialDisposable();\n\n    var xs = Observable.just(42, scheduler);\n\n    var res = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, 100, function () {\n      d.setDisposable(xs.subscribe(\n        function (x) {\n          d.dispose();\n          res.onNext(x);\n        },\n        function (e) { res.onError(e); },\n        function () { res.onCompleted(); }\n      ));\n    });\n\n    scheduler.start();\n\n    res.messages.assertEqual(\n      onNext(101, 42)\n    );\n  });\n\n  function noop () { }\n\n  test('just Observer throws', function () {\n    var scheduler1 = new TestScheduler();\n\n    var xs = Observable.just(1, scheduler1);\n\n    xs.subscribe(function () { throw new Error(); });\n\n    raises(function () { scheduler1.start(); });\n\n    var scheduler2 = new TestScheduler();\n\n    var ys = Observable.just(1, scheduler2);\n\n    ys.subscribe(noop, noop, function () { throw new Error(); });\n\n    raises(function () { scheduler2.start(); });\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/sample.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n\n  QUnit.module('sample');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('sample regular', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(260, 4),\n      onNext(300, 5),\n      onNext(350, 6),\n      onNext(380, 7),\n      onCompleted(390)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sample(50, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 3),\n      onNext(300, 5),\n      onNext(350, 6),\n      onNext(400, 7),\n      onCompleted(400)\n    );\n  });\n\n  test('sample error in flight', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(260, 4),\n      onNext(300, 5),\n      onNext(310, 6),\n      onError(330, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sample(50, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 3),\n      onNext(300, 5),\n      onError(330, error)\n    );\n  });\n\n  test('sample Empty', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Rx.Observable.empty(scheduler).sample(0, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(201)\n    );\n  });\n\n  test('sample Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Rx.Observable['throw'](error, scheduler).sample(0, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(201, error)\n    );\n  });\n\n  test('sample never', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Rx.Observable.never().sample(0, scheduler);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('sample sampler simple 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(300, 5),\n      onNext(310, 6),\n      onCompleted(400)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(150, ''),\n      onNext(210, 'bar'),\n      onNext(250, 'foo'),\n      onNext(260, 'qux'),\n      onNext(320, 'baz'),\n      onCompleted(500)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.sample(ys);\n    });\n\n    res.messages.assertEqual(\n      onNext(250, 3),\n      onNext(320, 6),\n      onCompleted(500 /* on sampling boundaries only */)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 500)\n    );\n  });\n\n  test('sample sampler simple 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(300, 5),\n      onNext(310, 6),\n      onNext(360, 7),\n      onCompleted(400)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(150, ''),\n      onNext(210, 'bar'),\n      onNext(250, 'foo'),\n      onNext(260, 'qux'),\n      onNext(320, 'baz'),\n      onCompleted(500)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.sample(ys);\n    });\n\n    res.messages.assertEqual(\n      onNext(250, 3),\n      onNext(320, 6),\n      onNext(500, 7),\n      onCompleted(500 /* on sampling boundaries only */)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 500)\n    );\n  });\n\n  test('sample sampler simple 3', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onCompleted(300)\n     );\n\n    var ys = scheduler.createHotObservable(\n      onNext(150, ''),\n      onNext(210, 'bar'),\n      onNext(250, 'foo'),\n      onNext(260, 'qux'),\n      onNext(320, 'baz'),\n      onCompleted(500)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.sample(ys);\n    });\n\n    res.messages.assertEqual(\n      onNext(250, 3),\n      onNext(320, 4),\n      onCompleted(320 /* on sampling boundaries only */)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 320)\n    );\n  });\n\n  test('sample completes if earlier completes', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onCompleted(300)\n     );\n\n    var ys = scheduler.createHotObservable(\n      onNext(150, ''),\n      onCompleted(210)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.sample(ys);\n    });\n\n    res.messages.assertEqual(\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n  test('sample sampler source throws', function() {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(300, 5),\n      onNext(310, 6),\n      onError(320, error)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(150, ''),\n      onNext(210, 'bar'),\n      onNext(250, 'foo'),\n      onNext(260, 'qux'),\n      onNext(330, 'baz'),\n      onCompleted(400)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.sample(ys);\n    });\n\n    res.messages.assertEqual(\n      onNext(250, 3),\n      onError(320, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 320)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 320)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/scan.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('scan');\n\n  function add(x, y) { return x + y; }\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('scan with seed throws error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 24),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.scan(function () { throw error; }, 42);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('scan with seed never', function () {\n    var scheduler = new TestScheduler();\n\n    var seed = 42;\n\n    var results = scheduler.startScheduler(function () {\n      return Rx.Observable.never().scan(add, seed);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('scan with seed empty', function () {\n    var scheduler = new TestScheduler();\n\n    var seed = 42;\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.scan(add, seed);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 42),\n      onCompleted(250)\n    );\n\n  });\n\n  test('scan with seed return', function () {\n    var scheduler = new TestScheduler();\n\n    var seed = 42;\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.scan(add, seed);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, seed + 2),\n      onCompleted(250)\n    );\n  });\n\n  test('scan with seed throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var seed = 42;\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(250, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.scan(add, seed);\n    });\n\n    results.messages.assertEqual(\n      onError(250, error)\n    );\n  });\n\n  test('scan with seed some data', function () {\n    var scheduler = new TestScheduler();\n\n    var seed = 1;\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.scan(add, seed);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, seed + 2),\n      onNext(220, seed + 2 + 3),\n      onNext(230, seed + 2 + 3 + 4),\n      onNext(240, seed + 2 + 3 + 4 + 5),\n      onCompleted(250)\n    );\n  });\n\n  test('scan no seed never', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Rx.Observable.never().scan(function (acc, x) {\n        return acc + x;\n      });\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('scan no seed empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(onNext(150, 1), onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.scan(function (acc, x) {\n        return acc + x;\n      });\n    });\n\n    results.messages.assertEqual(onCompleted(250));\n  });\n\n  test('scan no seed return', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.scan(function (acc, x) {\n        acc === undefined && (acc = 0);\n        return acc + x;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 2),\n      onCompleted(250)\n    );\n  });\n\n  test('scan no seed throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(250, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.scan(function (acc, x) {\n        acc === undefined && (acc = 0);\n        return acc + x;\n      });\n    });\n\n    results.messages.assertEqual(onError(250, error));\n  });\n\n  test('scan no seed some data', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.scan(function (acc, x) {\n        acc === undefined && (acc = 0);\n        return acc + x;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 2 + 3),\n      onNext(230, 2 + 3 + 4),\n      onNext(240, 2 + 3 + 4 + 5),\n      onCompleted(250));\n  });\n\n  test('scan without seed throws error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.scan(function () { throw error; });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onError(220, error)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/select.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, raises, equal */\n  QUnit.module('map');\n\n  var Observable = Rx.Observable,\n    TestScheduler = Rx.TestScheduler,\n    SerialDisposable = Rx.SerialDisposable,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe,\n    disposed = Rx.ReactiveTest.disposed;\n\n  // Function shortcuts\n  function noop () { }\n  function identity (x) { return x; }\n  function throwError () { throw new Error(); }\n\n  test('map throws', function () {\n    raises(function () {\n      Observable.just(1)\n        .map(identity)\n        .subscribe(throwError);\n    });\n\n    raises(function () {\n      Observable.throwError(new Error())\n        .map(function (x) { return x; })\n        .subscribe(noop, throwError);\n    });\n\n    raises(function () {\n      Observable.empty()\n        .map(function (x) { return x; })\n        .subscribe(noop, noop, throwError);\n    });\n\n    raises(function () {\n      Observable.create(throwError)\n        .map(identity)\n        .subscribe();\n    });\n\n  });\n\n  test('map with index dispose inside selector', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(100, 4),\n      onNext(200, 3),\n      onNext(500, 2),\n      onNext(600, 1)\n    );\n\n    var invoked = 0;\n\n    var results = scheduler.createObserver();\n\n    var d = new SerialDisposable();\n    d.setDisposable(\n      xs.map(function(x, index) {\n        invoked++;\n        scheduler.clock > 400 && d.dispose();\n        return x + index * 10;\n      })\n      .subscribe(results)\n    );\n\n    scheduler.scheduleAbsolute(null, disposed, function () { d.dispose(); });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(100, 4),\n      onNext(200, 13)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(0, 500)\n    );\n\n    equal(3, invoked);\n  });\n\n  test('map with index Completed', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 5),\n      onNext(210, 4),\n      onNext(240, 3),\n      onNext(290, 2),\n      onNext(350, 1),\n      onCompleted(400),\n      onNext(410, -1),\n      onCompleted(420),\n      onError(430, new Error())\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.map(function (x, index) {\n        invoked++;\n        return (x + 1) + (index * 10);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 5),\n      onNext(240, 14),\n      onNext(290, 23),\n      onNext(350, 32),\n      onCompleted(400)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n\n    equal(4, invoked);\n  });\n\n  test('map with index not completed', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 5),\n      onNext(210, 4),\n      onNext(240, 3),\n      onNext(290, 2),\n      onNext(350, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.map(function (x, index) {\n        invoked++;\n        return (x + 1) + (index * 10);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 5),\n      onNext(240, 14),\n      onNext(290, 23),\n      onNext(350, 32)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n\n    equal(4, invoked);\n  });\n\n  test('map with index error', function () {\n    var scheduler = new TestScheduler();\n\n    var error = new Error();\n\n    var invoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 5),\n      onNext(210, 4),\n      onNext(240, 3),\n      onNext(290, 2),\n      onNext(350, 1),\n      onError(400, error),\n      onNext(410, -1),\n      onCompleted(420),\n      onError(430, new Error())\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.map(function (x, index) {\n        invoked++;\n        return (x + 1) + (index * 10);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 5),\n      onNext(240, 14),\n      onNext(290, 23),\n      onNext(350, 32),\n      onError(400, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n\n    equal(4, invoked);\n  });\n\n  test('map selector throws', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked = 0;\n\n    var error = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 5),\n      onNext(210, 4),\n      onNext(240, 3),\n      onNext(290, 2),\n      onNext(350, 1),\n      onCompleted(400),\n      onNext(410, -1),\n      onCompleted(420),\n      onError(430, new Error())\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.map(function (x, index) {\n        invoked++;\n        if (invoked === 3) { throw error; }\n        return (x + 1) + (index * 10);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 5),\n      onNext(240, 14),\n      onError(290, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 290)\n    );\n\n    equal(3, invoked);\n  });\n\n  test('map value', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.map(-1);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, -1),\n      onNext(220, -1),\n      onNext(230, -1),\n      onNext(240, -1),\n      onCompleted(250)\n    );\n  });\n\n  test('map thisArg', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked = 0;\n    var foo = 42;\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 5),\n      onNext(210, 4),\n      onNext(240, 3),\n      onNext(290, 2),\n      onNext(350, 1),\n      onCompleted(400),\n      onNext(410, -1),\n      onCompleted(420),\n      onError(430, new Error())\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.map(function (x, index) {\n        invoked++;\n        equal(this, foo);\n        return (x + 1) + (index * 10);\n      }, 42);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 5),\n      onNext(240, 14),\n      onNext(290, 23),\n      onNext(350, 32),\n      onCompleted(400)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n\n    equal(4, invoked);\n  });\n\n  test('map and map Optimization', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked1 = 0;\n    var invoked2 = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(180, 2),\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onCompleted(600),\n      onNext(610, 12),\n      onError(620, new Error()),\n      onCompleted(630)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs\n      .map(function(x) { invoked1++; return x * 2; })\n      .map(function(x) { invoked2++; return x / 2; });\n    });\n\n    results.messages.assertEqual(\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n\n    equal(9, invoked1);\n    equal(9, invoked2);\n  });\n\n  test('map and map thisArg', function(){\n\n    var scheduler = new TestScheduler();\n\n    function Filterer() {\n      this.selector1 = function(item) { return item + 2; };\n      this.selector2 = function(item) { return item * 3; };\n    }\n\n    var filterer = new Filterer();\n\n    var xs = scheduler.createColdObservable(\n      onNext(10, 1),\n      onNext(20, 2),\n      onNext(30, 3),\n      onNext(40, 4),\n      onCompleted(100)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return xs\n        .map(function(x){ return this.selector1(x);}, filterer)\n        .map(function(x){ return this.selector2(x);}, filterer)\n        .map(function(x){ return this.selector1(x);}, filterer);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 11),\n      onNext(220, 14),\n      onNext(230, 17),\n      onNext(240, 20),\n      onCompleted(300)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/selectmany.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, asyncTest, start, ok, equal, RSVP */\n\n  QUnit.module('flatMap');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe,\n      isEqual = Rx.internals.isEqual;\n\n  asyncTest('flatMap then complete promise', function () {\n    var xs = Rx.Observable.fromArray([4,3,2,1]);\n\n    var ys = new RSVP.Promise(function (res) { res(42); });\n\n    var results = [];\n    xs.flatMap(ys).subscribe(\n      function (x) {\n        results.push(x);\n      },\n      function () {\n        ok(false);\n        start();\n      },\n      function () {\n        ok(isEqual([42,42,42,42], results));\n        start();\n      });\n  });\n\n  asyncTest('flatMap then error Task', function () {\n    var xs = Rx.Observable.fromArray([4,3,2,1]);\n\n    var ys = new RSVP.Promise(function (res, rej) { rej(42); });\n\n    xs.flatMap(ys).subscribe(\n      function () {\n        ok(false);\n        start();\n      },\n      function (err) {\n        equal(err, 42);\n        start();\n      },\n      function () {\n        ok(false);\n        start();\n      });\n  });\n\n  asyncTest('flatMap Selector complete Task', function () {\n    var xs = Rx.Observable.fromArray([4,3,2,1]);\n\n    var results = [];\n    xs.flatMap(function (x, i) {\n      return new RSVP.Promise(function (res) { res(x + i); });\n    }).subscribe(\n      function (x) {\n        results.push(x);\n      },\n      function () {\n        ok(false);\n        start();\n      },\n      function () {\n        ok(isEqual([4, 4, 4, 4], results));\n        start();\n      });\n  });\n\n  asyncTest('flatMap Selector error Task', function () {\n    var xs = Rx.Observable.fromArray([4,3,2,1]);\n\n    xs.flatMap(function (x, i) {\n      return new RSVP.Promise(function (res, rej) { rej(x + i); });\n    }).subscribe(\n      function () {\n        ok(false);\n        start();\n      },\n      function (err) {\n        equal(err, 4);\n        start();\n      },\n      function () {\n        ok(false);\n        start();\n      });\n  });\n\n  asyncTest('flatMap result selector complete promise', function () {\n    var xs = Rx.Observable.fromArray([4,3,2,1]);\n\n    var results = [];\n    xs.flatMap(\n      function (x, i) {\n        return new RSVP.Promise(function (res) { res(x + i); });\n      },\n      function (x, y, i) {\n        return x + y + i;\n      })\n      .subscribe(\n        function (x) {\n          results.push(x);\n        },\n        function () {\n          ok(false);\n          start();\n        },\n        function () {\n          ok(isEqual([8, 8, 8, 8], results));\n          start();\n        });\n  });\n\n  asyncTest('flatMap result selector error promise', function () {\n    var xs = Rx.Observable.fromArray([4,3,2,1]);\n\n    xs.flatMap(\n      function (x, i) {\n        return new RSVP.Promise(function (res, rej) { rej(x + i); });\n      },\n      function (x, y, i) {\n        return x + y + i;\n      })\n      .subscribe(\n        function () {\n          ok(false);\n          start();\n        },\n        function (err) {\n          equal(err, 4);\n          start();\n        },\n        function () {\n          ok(false);\n          start();\n        });\n  });\n\n  test('flatMap then complete complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 4),\n      onNext(200, 2),\n      onNext(300, 3),\n      onNext(400, 1),\n      onCompleted(500)\n    );\n\n    var ys = scheduler.createColdObservable(\n      onNext(50, 'foo'),\n      onNext(100, 'bar'),\n      onNext(150, 'baz'),\n      onNext(200, 'qux'),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.flatMap(ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(350, 'foo'),\n      onNext(400, 'bar'),\n      onNext(450, 'baz'),\n      onNext(450, 'foo'),\n      onNext(500, 'qux'),\n      onNext(500, 'bar'),\n      onNext(550, 'baz'),\n      onNext(550, 'foo'),\n      onNext(600, 'qux'),\n      onNext(600, 'bar'),\n      onNext(650, 'baz'),\n      onNext(650, 'foo'),\n      onNext(700, 'qux'),\n      onNext(700, 'bar'),\n      onNext(750, 'baz'),\n      onNext(800, 'qux'),\n      onCompleted(850)\n      );\n\n    xs.subscriptions.assertEqual(subscribe(200, 700));\n\n    ys.subscriptions.assertEqual(\n        subscribe(300, 550),\n        subscribe(400, 650),\n        subscribe(500, 750),\n        subscribe(600, 850));\n});\n\ntest('flatMap then complete Complete_2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 4),\n      onNext(200, 2),\n      onNext(300, 3),\n      onNext(400, 1),\n      onCompleted(700));\n\n    var ys = scheduler.createColdObservable(\n      onNext(50, 'foo'),\n      onNext(100, 'bar'),\n      onNext(150, 'baz'),\n      onNext(200, 'qux'),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.flatMap(ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(350, 'foo'),\n      onNext(400, 'bar'),\n      onNext(450, 'baz'),\n      onNext(450, 'foo'),\n      onNext(500, 'qux'),\n      onNext(500, 'bar'),\n      onNext(550, 'baz'),\n      onNext(550, 'foo'),\n      onNext(600, 'qux'),\n      onNext(600, 'bar'),\n      onNext(650, 'baz'),\n      onNext(650, 'foo'),\n      onNext(700, 'qux'),\n      onNext(700, 'bar'),\n      onNext(750, 'baz'),\n      onNext(800, 'qux'),\n      onCompleted(900));\n\n    xs.subscriptions.assertEqual(subscribe(200, 900));\n\n    ys.subscriptions.assertEqual(\n      subscribe(300, 550),\n      subscribe(400, 650),\n      subscribe(500, 750),\n      subscribe(600, 850)\n    );\n  });\n\n  test('flatMap then never complete', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createColdObservable(\n        onNext(100, 4),\n        onNext(200, 2),\n        onNext(300, 3),\n        onNext(400, 1),\n        onNext(500, 5),\n        onNext(700, 0));\n\n      var ys = scheduler.createColdObservable(\n        onNext(50, 'foo'),\n        onNext(100, 'bar'),\n        onNext(150, 'baz'),\n        onNext(200, 'qux'),\n        onCompleted(250));\n\n      var results = scheduler.startScheduler(function () {\n          return xs.flatMap(ys);\n      });\n\n      results.messages.assertEqual(\n        onNext(350, 'foo'),\n        onNext(400, 'bar'),\n        onNext(450, 'baz'),\n        onNext(450, 'foo'),\n        onNext(500, 'qux'),\n        onNext(500, 'bar'),\n        onNext(550, 'baz'),\n        onNext(550, 'foo'),\n        onNext(600, 'qux'),\n        onNext(600, 'bar'),\n        onNext(650, 'baz'),\n        onNext(650, 'foo'),\n        onNext(700, 'qux'),\n        onNext(700, 'bar'),\n        onNext(750, 'baz'),\n        onNext(750, 'foo'),\n        onNext(800, 'qux'),\n        onNext(800, 'bar'),\n        onNext(850, 'baz'),\n        onNext(900, 'qux'),\n        onNext(950, 'foo'));\n\n      xs.subscriptions.assertEqual(subscribe(200, 1000));\n\n      ys.subscriptions.assertEqual(\n        subscribe(300, 550),\n        subscribe(400, 650),\n        subscribe(500, 750),\n        subscribe(600, 850),\n        subscribe(700, 950),\n        subscribe(900, 1000));\n  });\n\n  test('flatMap then complete never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 4),\n      onNext(200, 2),\n      onNext(300, 3),\n      onNext(400, 1),\n      onCompleted(500));\n\n    var ys = scheduler.createColdObservable(\n      onNext(50, 'foo'),\n      onNext(100, 'bar'),\n      onNext(150, 'baz'),\n      onNext(200, 'qux'));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.flatMap(ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(350, 'foo'),\n      onNext(400, 'bar'),\n      onNext(450, 'baz'),\n      onNext(450, 'foo'),\n      onNext(500, 'qux'),\n      onNext(500, 'bar'),\n      onNext(550, 'baz'),\n      onNext(550, 'foo'),\n      onNext(600, 'qux'),\n      onNext(600, 'bar'),\n      onNext(650, 'baz'),\n      onNext(650, 'foo'),\n      onNext(700, 'qux'),\n      onNext(700, 'bar'),\n      onNext(750, 'baz'), onNext(800, 'qux'));\n\n    xs.subscriptions.assertEqual(subscribe(200, 700));\n\n    ys.subscriptions.assertEqual(\n      subscribe(300, 1000),\n      subscribe(400, 1000),\n      subscribe(500, 1000),\n      subscribe(600, 1000)\n    );\n  });\n\n  test('flatMap then complete Error', function () {\n      var ex = new Error('ex');\n\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createColdObservable(\n        onNext(100, 4),\n        onNext(200, 2),\n        onNext(300, 3),\n        onNext(400, 1),\n        onCompleted(500));\n\n      var ys = scheduler.createColdObservable(\n        onNext(50, 'foo'),\n        onNext(100, 'bar'),\n        onNext(150, 'baz'),\n        onNext(200, 'qux'),\n        onError(300, ex));\n\n      var results = scheduler.startScheduler(function () {\n          return xs.flatMap(ys);\n      });\n\n      results.messages.assertEqual(\n        onNext(350, 'foo'),\n        onNext(400, 'bar'),\n        onNext(450, 'baz'),\n        onNext(450, 'foo'),\n        onNext(500, 'qux'),\n        onNext(500, 'bar'),\n        onNext(550, 'baz'),\n        onNext(550, 'foo'),\n        onError(600, ex));\n\n      xs.subscriptions.assertEqual(subscribe(200, 600));\n\n      ys.subscriptions.assertEqual(subscribe(300, 600), subscribe(400, 600), subscribe(500, 600), subscribe(600, 600));\n  });\n\n  test('flatMap then error complete', function () {\n    var ex = new Error('ex');\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 4),\n      onNext(200, 2),\n      onNext(300, 3),\n      onNext(400, 1),\n      onError(500, ex));\n\n    var ys = scheduler.createColdObservable(\n      onNext(50, 'foo'),\n      onNext(100, 'bar'),\n      onNext(150, 'baz'),\n      onNext(200, 'qux'),\n      onCompleted(250));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.flatMap(ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(350, 'foo'),\n      onNext(400, 'bar'),\n      onNext(450, 'baz'),\n      onNext(450, 'foo'),\n      onNext(500, 'qux'),\n      onNext(500, 'bar'),\n      onNext(550, 'baz'),\n      onNext(550, 'foo'),\n      onNext(600, 'qux'),\n      onNext(600, 'bar'),\n      onNext(650, 'baz'),\n      onNext(650, 'foo'),\n      onError(700, ex));\n\n    xs.subscriptions.assertEqual(subscribe(200, 700));\n\n    ys.subscriptions.assertEqual(\n      subscribe(300, 550),\n      subscribe(400, 650),\n      subscribe(500, 700),\n      subscribe(600, 700));\n  });\n\n  test('flatMap then error Error', function () {\n    var ex = new Error('ex');\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 4),\n      onNext(200, 2),\n      onNext(300, 3),\n      onNext(400, 1),\n      onError(500, ex));\n\n    var ys = scheduler.createColdObservable(\n      onNext(50, 'foo'),\n      onNext(100, 'bar'),\n      onNext(150, 'baz'),\n      onNext(200, 'qux'),\n      onError(250, ex));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.flatMap(ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(350, 'foo'),\n      onNext(400, 'bar'),\n      onNext(450, 'baz'),\n      onNext(450, 'foo'),\n      onNext(500, 'qux'),\n      onNext(500, 'bar'),\n      onError(550, ex));\n\n    xs.subscriptions.assertEqual(subscribe(200, 550));\n\n    ys.subscriptions.assertEqual(\n      subscribe(300, 550),\n      subscribe(400, 550),\n      subscribe(500, 550));\n  });\n\n  test('flatMap complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n      onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n      onNext(300, scheduler.createColdObservable(\n        onNext(10, 102),\n        onNext(90, 103),\n        onNext(110, 104),\n        onNext(190, 105),\n        onNext(440, 106),\n        onCompleted(460))),\n      onNext(400, scheduler.createColdObservable(\n        onNext(180, 202),\n        onNext(190, 203),\n        onCompleted(205))),\n      onNext(550, scheduler.createColdObservable(\n        onNext(10, 301),\n        onNext(50, 302),\n        onNext(70, 303),\n        onNext(260, 304),\n        onNext(310, 305),\n        onCompleted(410))),\n      onNext(750, scheduler.createColdObservable(onCompleted(40))),\n      onNext(850, scheduler.createColdObservable(\n        onNext(80, 401),\n        onNext(90, 402),\n        onCompleted(100))),\n      onCompleted(900));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.flatMap(function (x) {\n        return x;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 102),\n      onNext(390, 103),\n      onNext(410, 104),\n      onNext(490, 105),\n      onNext(560, 301),\n      onNext(580, 202),\n      onNext(590, 203),\n      onNext(600, 302),\n      onNext(620, 303),\n      onNext(740, 106),\n      onNext(810, 304),\n      onNext(860, 305),\n      onNext(930, 401),\n      onNext(940, 402),\n      onCompleted(960));\n\n    xs.subscriptions.assertEqual(subscribe(200, 900));\n\n    xs.messages[2].value.value.subscriptions.assertEqual(subscribe(300, 760));\n    xs.messages[3].value.value.subscriptions.assertEqual(subscribe(400, 605));\n    xs.messages[4].value.value.subscriptions.assertEqual(subscribe(550, 960));\n    xs.messages[5].value.value.subscriptions.assertEqual(subscribe(750, 790));\n    xs.messages[6].value.value.subscriptions.assertEqual(subscribe(850, 950));\n  });\n\n  test('flatMap Complete_innerNotcomplete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n      onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n      onNext(300, scheduler.createColdObservable(\n        onNext(10, 102),\n        onNext(90, 103),\n        onNext(110, 104),\n        onNext(190, 105),\n        onNext(440, 106),\n        onCompleted(460))),\n      onNext(400, scheduler.createColdObservable(\n        onNext(180, 202),\n        onNext(190, 203))),\n      onNext(550, scheduler.createColdObservable(\n        onNext(10, 301),\n        onNext(50, 302),\n        onNext(70, 303),\n        onNext(260, 304),\n        onNext(310, 305),\n        onCompleted(410))),\n      onNext(750, scheduler.createColdObservable(onCompleted(40))),\n      onNext(850, scheduler.createColdObservable(\n        onNext(80, 401),\n        onNext(90, 402),\n        onCompleted(100))),\n      onCompleted(900));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.flatMap(function (x) {\n        return x;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 102),\n      onNext(390, 103),\n      onNext(410, 104),\n      onNext(490, 105),\n      onNext(560, 301),\n      onNext(580, 202),\n      onNext(590, 203),\n      onNext(600, 302),\n      onNext(620, 303),\n      onNext(740, 106),\n      onNext(810, 304),\n      onNext(860, 305),\n      onNext(930, 401),\n      onNext(940, 402));\n\n    xs.subscriptions.assertEqual(subscribe(200, 900));\n\n    xs.messages[2].value.value.subscriptions.assertEqual(subscribe(300, 760));\n    xs.messages[3].value.value.subscriptions.assertEqual(subscribe(400, 1000));\n    xs.messages[4].value.value.subscriptions.assertEqual(subscribe(550, 960));\n    xs.messages[5].value.value.subscriptions.assertEqual(subscribe(750, 790));\n    xs.messages[6].value.value.subscriptions.assertEqual(subscribe(850, 950));\n  });\n\n  test('flatMap Complete_outerNotcomplete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n      onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n      onNext(300, scheduler.createColdObservable(\n        onNext(10, 102),\n        onNext(90, 103),\n        onNext(110, 104),\n        onNext(190, 105),\n        onNext(440, 106),\n        onCompleted(460))),\n      onNext(400, scheduler.createColdObservable(\n        onNext(180, 202),\n        onNext(190, 203),\n        onCompleted(205))),\n      onNext(550, scheduler.createColdObservable(\n        onNext(10, 301),\n        onNext(50, 302),\n        onNext(70, 303),\n        onNext(260, 304),\n        onNext(310, 305),\n        onCompleted(410))),\n      onNext(750, scheduler.createColdObservable(onCompleted(40))),\n      onNext(850, scheduler.createColdObservable(\n        onNext(80, 401),\n        onNext(90, 402),\n        onCompleted(100))));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.flatMap(function (x) {\n        return x;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 102),\n      onNext(390, 103),\n      onNext(410, 104),\n      onNext(490, 105),\n      onNext(560, 301),\n      onNext(580, 202),\n      onNext(590, 203),\n      onNext(600, 302),\n      onNext(620, 303),\n      onNext(740, 106),\n      onNext(810, 304),\n      onNext(860, 305),\n      onNext(930, 401),\n      onNext(940, 402));\n\n    xs.subscriptions.assertEqual(subscribe(200, 1000));\n    xs.messages[2].value.value.subscriptions.assertEqual(subscribe(300, 760));\n    xs.messages[3].value.value.subscriptions.assertEqual(subscribe(400, 605));\n    xs.messages[4].value.value.subscriptions.assertEqual(subscribe(550, 960));\n    xs.messages[5].value.value.subscriptions.assertEqual(subscribe(750, 790));\n    xs.messages[6].value.value.subscriptions.assertEqual(subscribe(850, 950));\n  });\n\n  test('flatMap error outer', function () {\n      var ex = new Error('ex');\n\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n        onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n        onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n        onNext(300, scheduler.createColdObservable(\n          onNext(10, 102),\n          onNext(90, 103),\n          onNext(110, 104),\n          onNext(190, 105),\n          onNext(440, 106),\n          onCompleted(460))),\n        onNext(400, scheduler.createColdObservable(\n          onNext(180, 202),\n          onNext(190, 203),\n          onCompleted(205))),\n        onNext(550, scheduler.createColdObservable(\n          onNext(10, 301),\n          onNext(50, 302),\n          onNext(70, 303),\n          onNext(260, 304),\n          onNext(310, 305),\n          onCompleted(410))),\n        onNext(750, scheduler.createColdObservable(onCompleted(40))),\n        onNext(850, scheduler.createColdObservable(\n          onNext(80, 401),\n          onNext(90, 402),\n          onCompleted(100))),\n        onError(900, ex));\n\n      var results = scheduler.startScheduler(function () {\n        return xs.flatMap(function (x) {\n          return x;\n        });\n      });\n\n      results.messages.assertEqual(\n        onNext(310, 102),\n        onNext(390, 103),\n        onNext(410, 104),\n        onNext(490, 105),\n        onNext(560, 301),\n        onNext(580, 202),\n        onNext(590, 203),\n        onNext(600, 302),\n        onNext(620, 303),\n        onNext(740, 106),\n        onNext(810, 304),\n        onNext(860, 305),\n        onError(900, ex));\n\n      xs.subscriptions.assertEqual(subscribe(200, 900));\n\n      xs.messages[2].value.value.subscriptions.assertEqual(subscribe(300, 760));\n      xs.messages[3].value.value.subscriptions.assertEqual(subscribe(400, 605));\n      xs.messages[4].value.value.subscriptions.assertEqual(subscribe(550, 900));\n      xs.messages[5].value.value.subscriptions.assertEqual(subscribe(750, 790));\n      xs.messages[6].value.value.subscriptions.assertEqual(subscribe(850, 900));\n  });\n\n  test('flatMap error inner', function () {\n      var ex = new Error('ex');\n\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n        onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n        onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n        onNext(300, scheduler.createColdObservable(\n          onNext(10, 102),\n          onNext(90, 103),\n          onNext(110, 104),\n          onNext(190, 105),\n          onNext(440, 106),\n          onError(460, ex))),\n        onNext(400, scheduler.createColdObservable(\n          onNext(180, 202),\n          onNext(190, 203),\n          onCompleted(205))),\n        onNext(550, scheduler.createColdObservable(\n          onNext(10, 301),\n          onNext(50, 302),\n          onNext(70, 303),\n          onNext(260, 304),\n          onNext(310, 305),\n          onCompleted(410))),\n        onNext(750, scheduler.createColdObservable(onCompleted(40))),\n        onNext(850, scheduler.createColdObservable(\n          onNext(80, 401),\n          onNext(90, 402),\n          onCompleted(100))),\n        onCompleted(900));\n\n      var results = scheduler.startScheduler(function () {\n        return xs.flatMap(function (x) {\n          return x;\n        });\n      });\n\n      results.messages.assertEqual(\n        onNext(310, 102),\n        onNext(390, 103),\n        onNext(410, 104),\n        onNext(490, 105),\n        onNext(560, 301),\n        onNext(580, 202),\n        onNext(590, 203),\n        onNext(600, 302),\n        onNext(620, 303),\n        onNext(740, 106),\n        onError(760, ex));\n\n      xs.subscriptions.assertEqual(subscribe(200, 760));\n\n      xs.messages[2].value.value.subscriptions.assertEqual(subscribe(300, 760));\n      xs.messages[3].value.value.subscriptions.assertEqual(subscribe(400, 605));\n      xs.messages[4].value.value.subscriptions.assertEqual(subscribe(550, 760));\n      xs.messages[5].value.value.subscriptions.assertEqual(subscribe(750, 760));\n      xs.messages[6].value.value.subscriptions.assertEqual();\n  });\n\n  test('flatMap dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n      onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n      onNext(300, scheduler.createColdObservable(\n        onNext(10, 102),\n        onNext(90, 103),\n        onNext(110, 104),\n        onNext(190, 105),\n        onNext(440, 106),\n        onCompleted(460))),\n      onNext(400, scheduler.createColdObservable(\n        onNext(180, 202),\n        onNext(190, 203),\n        onCompleted(205))),\n      onNext(550, scheduler.createColdObservable(\n        onNext(10, 301),\n        onNext(50, 302),\n        onNext(70, 303),\n        onNext(260, 304),\n        onNext(310, 305),\n        onCompleted(410))),\n      onNext(750, scheduler.createColdObservable(onCompleted(40))),\n      onNext(850, scheduler.createColdObservable(\n        onNext(80, 401),\n        onNext(90, 402),\n        onCompleted(100))),\n      onCompleted(900));\n\n    var results = scheduler.startScheduler(function () {\n        return xs.flatMap(function (x) { return x; });\n    }, { disposed: 700 });\n\n    results.messages.assertEqual(\n      onNext(310, 102),\n      onNext(390, 103),\n      onNext(410, 104),\n      onNext(490, 105),\n      onNext(560, 301),\n      onNext(580, 202),\n      onNext(590, 203),\n      onNext(600, 302),\n      onNext(620, 303));\n\n    xs.subscriptions.assertEqual(subscribe(200, 700));\n\n    xs.messages[2].value.value.subscriptions.assertEqual(subscribe(300, 700));\n    xs.messages[3].value.value.subscriptions.assertEqual(subscribe(400, 605));\n    xs.messages[4].value.value.subscriptions.assertEqual(subscribe(550, 700));\n    xs.messages[5].value.value.subscriptions.assertEqual();\n    xs.messages[6].value.value.subscriptions.assertEqual();\n  });\n\n  test('flatMap Throw', function () {\n    var invoked = 0;\n    var ex = new Error('ex');\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(5, scheduler.createColdObservable(onError(1, new Error('ex1')))),\n      onNext(105, scheduler.createColdObservable(onError(1, new Error('ex2')))),\n      onNext(300, scheduler.createColdObservable(\n        onNext(10, 102),\n        onNext(90, 103),\n        onNext(110, 104),\n        onNext(190, 105),\n        onNext(440, 106),\n        onCompleted(460))),\n      onNext(400, scheduler.createColdObservable(\n        onNext(180, 202),\n        onNext(190, 203),\n        onCompleted(205))),\n      onNext(550, scheduler.createColdObservable(\n        onNext(10, 301),\n        onNext(50, 302),\n        onNext(70, 303),\n        onNext(260, 304),\n        onNext(310, 305),\n        onCompleted(410))),\n      onNext(750, scheduler.createColdObservable(\n        onCompleted(40))),\n      onNext(850, scheduler.createColdObservable(\n        onNext(80, 401),\n        onNext(90, 402),\n        onCompleted(100))),\n      onCompleted(900));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.flatMap(function (x) {\n        invoked++;\n        if (invoked === 3) { throw ex; }\n        return x;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 102),\n      onNext(390, 103),\n      onNext(410, 104),\n      onNext(490, 105),\n      onError(550, ex)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 550));\n\n    xs.messages[2].value.value.subscriptions.assertEqual(\n      subscribe(300, 550)\n    );\n\n    xs.messages[3].value.value.subscriptions.assertEqual(\n      subscribe(400, 550)\n    );\n\n    xs.messages[4].value.value.subscriptions.assertEqual();\n    xs.messages[5].value.value.subscriptions.assertEqual();\n    xs.messages[6].value.value.subscriptions.assertEqual();\n  });\n\n  test('flatMap UseFunction', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 4),\n      onNext(220, 3),\n      onNext(250, 5),\n      onNext(270, 1),\n      onCompleted(290)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.flatMap(function (x) {\n        return Observable.interval(10, scheduler).select(function () {\n          return x;\n        }).take(x);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 4),\n      onNext(230, 3),\n      onNext(230, 4),\n      onNext(240, 3),\n      onNext(240, 4),\n      onNext(250, 3),\n      onNext(250, 4),\n      onNext(260, 5),\n      onNext(270, 5),\n      onNext(280, 1),\n      onNext(280, 5),\n      onNext(290, 5),\n      onNext(300, 5),\n      onCompleted(300)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 290)\n    );\n  });\n\n  function arrayRepeat(value, times) {\n    var results = [];\n    for(var i = 0; i < times; i++) {\n      results.push(value);\n    }\n    return results;\n  }\n\n  test('flatMap iterable complete', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(510, 2),\n      onCompleted(600)\n    );\n\n    var inners = [];\n\n    var res = scheduler.startScheduler(function () {\n      return xs.flatMap(function (x) {\n        var ys = arrayRepeat(x, x);\n        inners.push(ys);\n        return ys;\n      });\n    });\n\n    res.messages.assertEqual(\n      onNext(210, 2),\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(340, 4),\n      onNext(340, 4),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(420, 3),\n      onNext(420, 3),\n      onNext(510, 2),\n      onNext(510, 2),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n\n    equal(4, inners.length);\n  });\n\n  test('flatMap Iterable complete result selector', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(510, 2),\n      onCompleted(600)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.flatMap(function (x) { return arrayRepeat(x, x); }, function (x, y) { return x + y; });\n    });\n\n    res.messages.assertEqual(\n      onNext(210, 4),\n      onNext(210, 4),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(420, 6),\n      onNext(420, 6),\n      onNext(420, 6),\n      onNext(510, 4),\n      onNext(510, 4),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n  test('flatMap iterable Error', function () {\n    var scheduler = new TestScheduler();\n\n    var ex = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(510, 2),\n      onError(600, ex)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.flatMap(function (x) { return arrayRepeat(x, x); })\n    });\n\n    res.messages.assertEqual(\n      onNext(210, 2),\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(340, 4),\n      onNext(340, 4),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(420, 3),\n      onNext(420, 3),\n      onNext(510, 2),\n      onNext(510, 2),\n      onError(600, ex)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n  test('flatMap Iterable error result selector', function () {\n    var scheduler = new TestScheduler();\n\n    var ex = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(510, 2),\n      onError(600, ex)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.flatMap(function (x) { return arrayRepeat(x, x); }, function (x, y) { return x + y; });\n    });\n\n    res.messages.assertEqual(\n      onNext(210, 4),\n      onNext(210, 4),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(420, 6),\n      onNext(420, 6),\n      onNext(420, 6),\n      onNext(510, 4),\n      onNext(510, 4),\n      onError(600, ex)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n  test('flatMap iterable dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(510, 2),\n      onCompleted(600)\n    );\n\n    var res = scheduler.startScheduler(\n      function () {\n        return xs.flatMap(function (x) { return arrayRepeat(x, x); })\n      },\n      { disposed: 350 }\n    );\n\n    res.messages.assertEqual(\n      onNext(210, 2),\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(340, 4),\n      onNext(340, 4),\n      onNext(340, 4)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 350)\n    );\n  });\n\n  test('flatMap iterable dispose result selector', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(510, 2),\n      onCompleted(600)\n    );\n\n    var res = scheduler.startScheduler(\n      function () {\n        return xs.flatMap(function (x) { return arrayRepeat(x, x); }, function (x, y) { return x + y; });\n      },\n      { disposed: 350 }\n    );\n\n    res.messages.assertEqual(\n      onNext(210, 4),\n      onNext(210, 4),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 350)\n    );\n  });\n\n  test('flatMap iterable selector throws', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(510, 2),\n      onCompleted(600)\n    );\n\n    var invoked = 0;\n    var ex = new Error();\n\n    var res = scheduler.startScheduler(function () {\n      return xs.flatMap(function (x) {\n        invoked++;\n        if (invoked === 3) { throw ex; }\n        return arrayRepeat(x, x);\n      });\n    });\n\n    res.messages.assertEqual(\n        onNext(210, 2),\n        onNext(210, 2),\n        onNext(340, 4),\n        onNext(340, 4),\n        onNext(340, 4),\n        onNext(340, 4),\n        onError(420, ex)\n    );\n\n    xs.subscriptions.assertEqual(\n        subscribe(200, 420)\n    );\n\n    equal(3, invoked);\n  });\n\n  test('flatMap iterable result selector throws', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(510, 2),\n      onCompleted(600)\n    );\n\n    var ex = new Error();\n\n    var inners = [];\n\n    var res = scheduler.startScheduler(function () {\n      return xs.flatMap(\n        function (x) {\n          var ys = arrayRepeat(x, x);\n          inners.push(ys);\n          return ys;\n        },\n        function (x, y) {\n          if (x === 3) { throw ex; }\n          return x + y;\n        }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(210, 4),\n      onNext(210, 4),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8),\n      onError(420, ex)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n\n    equal(3, inners.length);\n  });\n\n  test('flatMap iterable selector throws result selector', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 2),\n      onNext(340, 4),\n      onNext(420, 3),\n      onNext(510, 2),\n      onCompleted(600)\n    );\n\n    var invoked = 0;\n    var ex = new Error();\n\n    var res = scheduler.startScheduler(function () {\n      return xs.flatMap(\n        function (x) {\n          invoked++;\n          if (invoked === 3) { throw ex; }\n          return arrayRepeat(x, x);\n        },\n        function (x, y) { return x + y; }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(210, 4),\n      onNext(210, 4),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8),\n      onNext(340, 8),\n      onError(420, ex)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n\n    equal(3, invoked);\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/selectmanyobserver.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('selectManyObserver');\n\n  var Observable = Rx.Observable,\n    TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe;\n\n  function throwError(err) { throw err; }\n\n  test('selectManyObserver identity', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x) { return Observable.just(x, scheduler); },\n        function (err) { return Observable['throw'](err, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onCompleted(306)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver inners with timing 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var ysn = scheduler.createColdObservable(\n      onNext(10, 10),\n      onNext(20, 11),\n      onNext(30, 12),\n      onCompleted(40)\n    );\n\n    var yse = scheduler.createColdObservable(\n      onNext(0, 99),\n      onCompleted(10)\n    );\n\n    var ysc = scheduler.createColdObservable(\n      onNext(10, 42),\n      onCompleted(20)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x) { return ysn; },\n        function (err) { return yse; },\n        function () { return ysc; }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(310, 10),\n      onNext(311, 10),\n      onNext(312, 10),\n      onNext(313, 10),\n      onNext(314, 10),\n      onNext(315, 42),\n      onNext(320, 11),\n      onNext(321, 11),\n      onNext(322, 11),\n      onNext(323, 11),\n      onNext(324, 11),\n      onNext(330, 12),\n      onNext(331, 12),\n      onNext(332, 12),\n      onNext(333, 12),\n      onNext(334, 12),\n      onCompleted(344)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n\n    ysn.subscriptions.assertEqual(\n      subscribe(300, 340),\n      subscribe(301, 341),\n      subscribe(302, 342),\n      subscribe(303, 343),\n      subscribe(304, 344)\n    );\n\n    yse.subscriptions.assertEqual(\n    );\n\n    ysc.subscriptions.assertEqual(\n      subscribe(305, 325)\n    );\n  });\n\n  test('selectManyObserver inners with timing 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var ysn = scheduler.createColdObservable(\n      onNext(10, 10),\n      onNext(20, 11),\n      onNext(30, 12),\n      onCompleted(40)\n    );\n\n    var yse = scheduler.createColdObservable(\n      onNext(0, 99),\n      onCompleted(10)\n    );\n\n    var ysc = scheduler.createColdObservable(\n      onNext(10, 42),\n      onCompleted(50)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x) { return ysn; },\n        function (err) { return yse; },\n        function () { return ysc; }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(310, 10),\n      onNext(311, 10),\n      onNext(312, 10),\n      onNext(313, 10),\n      onNext(314, 10),\n      onNext(315, 42),\n      onNext(320, 11),\n      onNext(321, 11),\n      onNext(322, 11),\n      onNext(323, 11),\n      onNext(324, 11),\n      onNext(330, 12),\n      onNext(331, 12),\n      onNext(332, 12),\n      onNext(333, 12),\n      onNext(334, 12),\n      onCompleted(355)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n\n    ysn.subscriptions.assertEqual(\n      subscribe(300, 340),\n      subscribe(301, 341),\n      subscribe(302, 342),\n      subscribe(303, 343),\n      subscribe(304, 344)\n    );\n\n    yse.subscriptions.assertEqual(\n    );\n\n    ysc.subscriptions.assertEqual(\n      subscribe(305, 355)\n    );\n  });\n\n  test('selectManyObserver inners with timing 3', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(400, 1),\n      onNext(500, 2),\n      onNext(600, 3),\n      onNext(700, 4),\n      onCompleted(800)\n    );\n\n    var ysn = scheduler.createColdObservable(\n      onNext(10, 10),\n      onNext(20, 11),\n      onNext(30, 12),\n      onCompleted(40)\n    );\n\n    var yse = scheduler.createColdObservable(\n      onNext(0, 99),\n      onCompleted(10)\n    );\n\n    var ysc = scheduler.createColdObservable(\n      onNext(10, 42),\n      onCompleted(100)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x) { return ysn; },\n        function (err) { return yse; },\n        function () { return ysc; }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(310, 10),\n      onNext(320, 11),\n      onNext(330, 12),\n      onNext(410, 10),\n      onNext(420, 11),\n      onNext(430, 12),\n      onNext(510, 10),\n      onNext(520, 11),\n      onNext(530, 12),\n      onNext(610, 10),\n      onNext(620, 11),\n      onNext(630, 12),\n      onNext(710, 10),\n      onNext(720, 11),\n      onNext(730, 12),\n      onNext(810, 42),\n      onCompleted(900)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 800)\n    );\n\n    ysn.subscriptions.assertEqual(\n      subscribe(300, 340),\n      subscribe(400, 440),\n      subscribe(500, 540),\n      subscribe(600, 640),\n      subscribe(700, 740)\n    );\n\n    yse.subscriptions.assertEqual(\n    );\n\n    ysc.subscriptions.assertEqual(\n      subscribe(800, 900)\n    );\n  });\n\n  test('selectManyObserver error identity', function () {\n    var scheduler = new TestScheduler();\n\n    var err = new Error();\n\n    var xs = scheduler.createHotObservable(\n        onNext(300, 0),\n        onNext(301, 1),\n        onNext(302, 2),\n        onNext(303, 3),\n        onNext(304, 4),\n        onError(305, err)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x) { return Observable.just(x, scheduler); },\n        function (ex1) { return Observable['throw'](ex1, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      )\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onError(306, err)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver selectMany', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function (err) { return Observable['throw'](err, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(304, 2),\n      onNext(305, 4),\n      onNext(305, 3),\n      onNext(306, 4),\n      onNext(306, 3),\n      onNext(307, 4),\n      onNext(308, 4),\n      onCompleted(308)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver Concat', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x) { return Observable.just(x, scheduler); },\n        function (err) { return Observable['throw'](err, scheduler); },\n        function () { return Observable.range(1, 3, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onNext(306, 1),\n      onNext(307, 2),\n      onNext(308, 3),\n      onCompleted(309)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver Catch', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x) { return Observable.just(x, scheduler); },\n        function (err) { return Observable.range(1, 3, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onCompleted(306)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver error Catch', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n        onNext(300, 0),\n        onNext(301, 1),\n        onNext(302, 2),\n        onNext(303, 3),\n        onNext(304, 4),\n        onError(305, new Error())\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x) { return Observable.just(x, scheduler); },\n        function (err) { return Observable.range(1, 3, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onNext(306, 1),\n      onNext(307, 2),\n      onNext(308, 3),\n      onCompleted(309)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver all', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function (err) { return Observable.repeat(0, 2, scheduler); },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(304, 2),\n      onNext(305, 4),\n      onNext(305, 3),\n      onNext(306, -1),\n      onNext(306, 4),\n      onNext(306, 3),\n      onNext(307, -1),\n      onNext(307, 4),\n      onNext(308, 4),\n      onCompleted(308)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver error all', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onError(305, new Error())\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function (err) { return Observable.repeat(0, 2, scheduler); },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(304, 2),\n      onNext(305, 4),\n      onNext(305, 3),\n      onNext(306, 0),\n      onNext(306, 4),\n      onNext(306, 3),\n      onNext(307, 0),\n      onNext(307, 4),\n      onNext(308, 4),\n      onCompleted(308)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver all dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function () { return Observable.repeat(0, 2, scheduler); },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    }, { disposed: 307 });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(304, 2),\n      onNext(305, 4),\n      onNext(305, 3),\n      onNext(306, -1),\n      onNext(306, 4),\n      onNext(306, 3)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver all dispose before first', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function () { return Observable.repeat(0, 2, scheduler); },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    }, { disposed: 304 });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 304)\n    );\n  });\n\n  test('selectManyObserver on next throw', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var err = new Error();\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function () { return throwError(err); },\n        function () { return Observable.repeat(0, 2, scheduler); },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onError(300, err)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300)\n    );\n  });\n\n  test('selectManyObserver on errror throw', function () {\n    var scheduler = new TestScheduler();\n\n    var err = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onError(305, new Error())\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function () { throw err; },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(304, 2),\n      onError(305, err)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver on completed throw', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n        onNext(300, 0),\n        onNext(301, 1),\n        onNext(302, 2),\n        onNext(303, 3),\n        onNext(304, 4),\n        onCompleted(305)\n    );\n\n    var err = new Error();\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function () { return Observable.repeat(0, 2, scheduler); },\n        function () { throw err; }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(304, 2),\n      onError(305, err)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver with index identity', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x) { return Observable.just(x, scheduler); },\n        function (err) { return Observable['throw'](err, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onCompleted(306)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver with index inners with timing 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var ysn = scheduler.createColdObservable(\n      onNext(10, 10),\n      onNext(20, 11),\n      onNext(30, 12),\n      onCompleted(40)\n    );\n\n    var yse = scheduler.createColdObservable(\n      onNext(0, 99),\n      onCompleted(10)\n    );\n\n    var ysc = scheduler.createColdObservable(\n      onNext(10, 42),\n      onCompleted(20)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x, _) { return  ysn; },\n        function (err) { return yse; },\n        function () { return ysc; }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(310, 10),\n      onNext(311, 10),\n      onNext(312, 10),\n      onNext(313, 10),\n      onNext(314, 10),\n      onNext(315, 42),\n      onNext(320, 11),\n      onNext(321, 11),\n      onNext(322, 11),\n      onNext(323, 11),\n      onNext(324, 11),\n      onNext(330, 12),\n      onNext(331, 12),\n      onNext(332, 12),\n      onNext(333, 12),\n      onNext(334, 12),\n      onCompleted(344)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n\n    ysn.subscriptions.assertEqual(\n      subscribe(300, 340),\n      subscribe(301, 341),\n      subscribe(302, 342),\n      subscribe(303, 343),\n      subscribe(304, 344)\n    );\n\n    yse.subscriptions.assertEqual(\n    );\n\n    ysc.subscriptions.assertEqual(\n      subscribe(305, 325)\n    );\n  });\n\n  test('selectManyObserver with index inners with timing 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var ysn = scheduler.createColdObservable(\n      onNext(10, 10),\n      onNext(20, 11),\n      onNext(30, 12),\n      onCompleted(40)\n    );\n\n    var yse = scheduler.createColdObservable(\n      onNext(0, 99),\n      onCompleted(10)\n    );\n\n    var ysc = scheduler.createColdObservable(\n      onNext(10, 42),\n      onCompleted(50)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x, _) { return ysn; },\n        function (err) { return yse; },\n        function () { return ysc; }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(310, 10),\n      onNext(311, 10),\n      onNext(312, 10),\n      onNext(313, 10),\n      onNext(314, 10),\n      onNext(315, 42),\n      onNext(320, 11),\n      onNext(321, 11),\n      onNext(322, 11),\n      onNext(323, 11),\n      onNext(324, 11),\n      onNext(330, 12),\n      onNext(331, 12),\n      onNext(332, 12),\n      onNext(333, 12),\n      onNext(334, 12),\n      onCompleted(355)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n\n    ysn.subscriptions.assertEqual(\n      subscribe(300, 340),\n      subscribe(301, 341),\n      subscribe(302, 342),\n      subscribe(303, 343),\n      subscribe(304, 344)\n    );\n\n    yse.subscriptions.assertEqual(\n    );\n\n    ysc.subscriptions.assertEqual(\n      subscribe(305, 355)\n    );\n  });\n\n  test('selectManyObserver with index inners with timing 3', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(400, 1),\n      onNext(500, 2),\n      onNext(600, 3),\n      onNext(700, 4),\n      onCompleted(800)\n    );\n\n    var ysn = scheduler.createColdObservable(\n      onNext(10, 10),\n      onNext(20, 11),\n      onNext(30, 12),\n      onCompleted(40)\n    );\n\n    var yse = scheduler.createColdObservable(\n      onNext(0, 99),\n      onCompleted(10)\n    );\n\n    var ysc = scheduler.createColdObservable(\n      onNext(10, 42),\n      onCompleted(100)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x, _) { return ysn; },\n        function (err) { return yse; },\n        function () { return ysc; }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(310, 10),\n      onNext(320, 11),\n      onNext(330, 12),\n      onNext(410, 10),\n      onNext(420, 11),\n      onNext(430, 12),\n      onNext(510, 10),\n      onNext(520, 11),\n      onNext(530, 12),\n      onNext(610, 10),\n      onNext(620, 11),\n      onNext(630, 12),\n      onNext(710, 10),\n      onNext(720, 11),\n      onNext(730, 12),\n      onNext(810, 42),\n      onCompleted(900)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 800)\n    );\n\n    ysn.subscriptions.assertEqual(\n      subscribe(300, 340),\n      subscribe(400, 440),\n      subscribe(500, 540),\n      subscribe(600, 640),\n      subscribe(700, 740)\n    );\n\n    yse.subscriptions.assertEqual(\n    );\n\n    ysc.subscriptions.assertEqual(\n      subscribe(800, 900)\n    );\n  });\n\n  test('selectManyObserver with index error identity', function () {\n    var scheduler = new TestScheduler();\n\n    var err = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onError(305, err)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x, _) { return Observable.just(x, scheduler); },\n        function (ex1) { return Observable['throw'](ex1, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onError(306, err)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver with index selectMany', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x, _) { return Observable.repeat(x, x, scheduler); },\n        function (err) { return Observable['throw'](err, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(304, 2),\n      onNext(305, 4),\n      onNext(305, 3),\n      onNext(306, 4),\n      onNext(306, 3),\n      onNext(307, 4),\n      onNext(308, 4),\n      onCompleted(308)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver with index Concat', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x, _) { return  Observable.just(x, scheduler); },\n        function (err) { return Observable['throw'](err, scheduler); },\n        function () { return Observable.range(1, 3, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onNext(306, 1),\n      onNext(307, 2),\n      onNext(308, 3),\n      onCompleted(309)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver with index Catch', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x, _) { return  Observable.just(x, scheduler); },\n        function (err) { return Observable.range(1, 3, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onCompleted(306)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver with index error Catch', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onError(305, new Error())\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x, _) { return  Observable.just(x, scheduler); },\n        function (err) { return Observable.range(1, 3, scheduler); },\n        function () { return Observable.empty(scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(301, 0),\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(305, 4),\n      onNext(306, 1),\n      onNext(307, 2),\n      onNext(308, 3),\n      onCompleted(309)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver with index all', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n          function (x, _) { return Observable.repeat(x, x, scheduler); },\n          function (err) { return Observable.repeat(0, 2, scheduler); },\n          function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(304, 2),\n      onNext(305, 4),\n      onNext(305, 3),\n      onNext(306, -1),\n      onNext(306, 4),\n      onNext(306, 3),\n      onNext(307, -1),\n      onNext(307, 4),\n      onNext(308, 4),\n      onCompleted(308)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver with index error all', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onError(305, new Error())\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x, _) { return Observable.repeat(x, x, scheduler); },\n        function (err) { return Observable.repeat(0, 2, scheduler); },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(304, 2),\n      onNext(305, 4),\n      onNext(305, 3),\n      onNext(306, 0),\n      onNext(306, 4),\n      onNext(306, 3),\n      onNext(307, 0),\n      onNext(307, 4),\n      onNext(308, 4),\n      onCompleted(308)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver with index all dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function () { return Observable.repeat(0, 2, scheduler); },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    }, { disposed: 307 });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(304, 2),\n      onNext(305, 4),\n      onNext(305, 3),\n      onNext(306, -1),\n      onNext(306, 4),\n      onNext(306, 3)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver with index all dispose before first', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x) { return Observable.repeat(x, x, scheduler); },\n        function () { return Observable.repeat(0, 2, scheduler); },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    }, { disposed: 304 });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 304)\n    );\n  });\n\n  test('selectManyObserver with index on next throw', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var err = new Error();\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x, _) { throw err; },\n        function (ex1) { Observable.repeat(0, 2, scheduler); },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onError(300, err)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300)\n    );\n  });\n\n  test('selectManyObserver with index on errror throw', function () {\n    var scheduler = new TestScheduler();\n\n    var err = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onError(305, new Error())\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x, _) { return Observable.repeat(x, x, scheduler); },\n        function (ex1) { throw err; },\n        function () { return Observable.repeat(-1, 2, scheduler); }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(304, 2),\n      onError(305, err)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n  test('selectManyObserver with index on completed throw', function () {\n      var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, 0),\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(303, 3),\n      onNext(304, 4),\n      onCompleted(305)\n    );\n\n    var err = new Error();\n\n    var res = scheduler.startScheduler(function () {\n      return xs.selectManyObserver(\n        function (x, _) { return Observable.repeat(x, x, scheduler); },\n        function (ex1) { return Observable.repeat(0, 2, scheduler); },\n        function () { throw err; }\n      );\n    });\n\n    res.messages.assertEqual(\n      onNext(302, 1),\n      onNext(303, 2),\n      onNext(304, 3),\n      onNext(304, 2),\n      onError(305, err)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 305)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/sequenceequal.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('sequenceEqual');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('sequenceEqual equal', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(190, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(450, 7),\n      onCompleted(510)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(90, 1), onNext(270, 3), onNext(280, 4), onNext(300, 5), onNext(330, 6), onNext(340, 7), onCompleted(720)\n    );\n\n    var results = scheduler.startScheduler(function () {\n        return xs.sequenceEqual(ys);\n    });\n    results.messages.assertEqual(\n      onNext(720, true),\n      onCompleted(720)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 720)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 720)\n    );\n  });\n\n  test('sequenceEqual equal sym', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(190, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(450, 7),\n      onCompleted(510)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(270, 3),\n      onNext(280, 4),\n      onNext(300, 5),\n      onNext(330, 6),\n      onNext(340, 7),\n      onCompleted(720)\n    );\n    var results = scheduler.startScheduler(function () {\n        return ys.sequenceEqual(xs);\n    });\n    results.messages.assertEqual(\n      onNext(720, true),\n      onCompleted(720)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 720)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 720)\n    );\n  });\n\n  test('sequenceEqual not equal Left', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n        onNext(110, 1),\n        onNext(190, 2),\n        onNext(240, 3),\n        onNext(290, 4), onNext(310, 0), onNext(340, 6), onNext(450, 7), onCompleted(510)\n      );\n\n      var ys = scheduler.createHotObservable(\n        onNext(90, 1),\n        onNext(270, 3),\n        onNext(280, 4),\n        onNext(300, 5),\n        onNext(330, 6),\n        onNext(340, 7),\n        onCompleted(720)\n      );\n\n      var results = scheduler.startScheduler(function () {\n          return xs.sequenceEqual(ys);\n      });\n\n      results.messages.assertEqual(\n        onNext(310, false),\n        onCompleted(310)\n      );\n\n      xs.subscriptions.assertEqual(\n        subscribe(200, 310)\n      );\n\n      ys.subscriptions.assertEqual(\n        subscribe(200, 310)\n      );\n  });\n\n  test('sequenceEqual not equal left sym', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(190, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(310, 0),\n      onNext(340, 6),\n      onNext(450, 7),\n      onCompleted(510)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(270, 3),\n      onNext(280, 4),\n      onNext(300, 5),\n      onNext(330, 6),\n      onNext(340, 7),\n      onCompleted(720)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return ys.sequenceEqual(xs);\n    });\n\n    results.messages.assertEqual(\n      onNext(310, false),\n      onCompleted(310)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 310)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 310)\n    );\n  });\n\n  test('sequenceEqual not equal right', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(190, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(450, 7),\n      onCompleted(510)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(270, 3),\n      onNext(280, 4),\n      onNext(300, 5),\n      onNext(330, 6),\n      onNext(340, 7),\n      onNext(350, 8)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sequenceEqual(ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(510, false),\n      onCompleted(510)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 510)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 510)\n    );\n  });\n\n  test('sequenceEqual not equal right sym', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(190, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(450, 7),\n      onCompleted(510)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(270, 3),\n      onNext(280, 4),\n      onNext(300, 5),\n      onNext(330, 6),\n      onNext(340, 7),\n      onNext(350, 8)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return ys.sequenceEqual(xs);\n    });\n\n    results.messages.assertEqual(\n      onNext(510, false),\n      onCompleted(510)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 510)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 510)\n    );\n  });\n\n  test('sequenceEqual not equal 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(190, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(450, 7),\n      onNext(490, 8),\n      onNext(520, 9),\n      onNext(580, 10),\n      onNext(600, 11)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(270, 3),\n      onNext(280, 4),\n      onNext(300, 5),\n      onNext(330, 6),\n      onNext(340, 7),\n      onNext(350, 9),\n      onNext(400, 9),\n      onNext(410, 10),\n      onNext(490, 11),\n      onNext(550, 12),\n      onNext(560, 13)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sequenceEqual(ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(490, false),\n      onCompleted(490)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 490)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 490)\n    );\n  });\n\n  test('sequenceEqual not equal 2 sym', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(190, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(450, 7),\n      onNext(490, 8),\n      onNext(520, 9),\n      onNext(580, 10),\n      onNext(600, 11)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(270, 3),\n      onNext(280, 4),\n      onNext(300, 5),\n      onNext(330, 6),\n      onNext(340, 7),\n      onNext(350, 9),\n      onNext(400, 9),\n      onNext(410, 10),\n      onNext(490, 11),\n      onNext(550, 12),\n      onNext(560, 13)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return ys.sequenceEqual(xs);\n    });\n\n    results.messages.assertEqual(\n      onNext(490, false),\n      onCompleted(490)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 490)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 490)\n    );\n  });\n\n  test('sequenceEqual not equal 3', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(190, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(310, 5),\n      onCompleted(330)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(270, 3),\n      onNext(400, 4),\n      onCompleted(420)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sequenceEqual(ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(420, false),\n      onCompleted(420)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n  });\n\n  test('sequenceEqual not equal 3 sym', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(190, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(310, 5),\n      onCompleted(330)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(270, 3),\n      onNext(400, 4),\n      onCompleted(420)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return ys.sequenceEqual(xs);\n    });\n\n    results.messages.assertEqual(\n      onNext(420, false),\n      onCompleted(420)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n  });\n\n  test('sequenceEqual comparer throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(190, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(310, 5),\n      onCompleted(330)\n    );\n    var ys = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(270, 3),\n      onNext(400, 4),\n      onCompleted(420)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sequenceEqual(ys, function () { throw error; });\n    });\n\n    results.messages.assertEqual(\n      onError(270, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 270)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 270)\n    );\n  });\n\n  test('sequenceEqual comparer throws sym', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(190, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(310, 5),\n      onCompleted(330)\n    );\n    var ys = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(270, 3),\n      onNext(400, 4),\n      onCompleted(420)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return ys.sequenceEqual(xs, function () { throw error; });\n    });\n\n    results.messages.assertEqual(\n      onError(270, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 270)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 270)\n    );\n  });\n\n  test('sequenceEqual not equal 4', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(250, 1),\n      onCompleted(300)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(290, 1),\n      onNext(310, 2),\n      onCompleted(350)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sequenceEqual(ys);\n    });\n\n    results.messages.assertEqual(\n      onNext(310, false),\n      onCompleted(310)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 310)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 310)\n    );\n  });\n\n  test('sequenceEqual not equal 4 sym', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(250, 1),\n      onCompleted(300)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(290, 1),\n      onNext(310, 2),\n      onCompleted(350)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return ys.sequenceEqual(xs);\n    });\n\n    results.messages.assertEqual(\n      onNext(310, false),\n      onCompleted(310)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 310)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 310)\n    );\n  });\n\n  // SequenceEqual Array\n  test('sequenceEqual iterable equal', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(190, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(450, 7),\n      onCompleted(510)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sequenceEqual([3, 4, 5, 6, 7]);\n    });\n\n    results.messages.assertEqual(\n      onNext(510, true),\n      onCompleted(510)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 510)\n    );\n  });\n\n  test('sequenceEqual iterable not equal elements', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(190, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(450, 7),\n      onCompleted(510)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sequenceEqual([3, 4, 9, 6, 7]);\n    });\n\n    results.messages.assertEqual(\n      onNext(310, false),\n      onCompleted(310)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 310)\n    );\n  });\n\n  test('sequenceEqual iterable comparer equal', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(190, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(450, 7),\n      onCompleted(510)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sequenceEqual([3 - 2, 4, 5, 6 + 42, 7 - 6], function (x, y) {\n        return x % 2 === y % 2;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(510, true),\n      onCompleted(510)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 510)\n    );\n  });\n\n  test('sequenceEqual iterable comparer not equal', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(190, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(450, 7),\n      onCompleted(510)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sequenceEqual([3 - 2, 4, 5 + 9, 6 + 42, 7 - 6], function (x, y) {\n        return x % 2 === y % 2;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(310, false),\n      onCompleted(310)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 310)\n    );\n  });\n\n  function throwComparer(value, exn) {\n    return function (x, y) {\n      if (x === value) { throw exn; }\n      return x === y;\n    };\n  }\n\n  test('sequenceEqual iterable comparer throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(190, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(450, 7),\n      onCompleted(510)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sequenceEqual([3, 4, 5, 6, 7], throwComparer(5, error));\n    });\n\n    results.messages.assertEqual(\n      onError(310, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 310)\n    );\n  });\n\n  test('sequenceEqual iterable not equal too long', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(190, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(450, 7),\n      onCompleted(510)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sequenceEqual([3, 4, 5, 6, 7, 8]);\n    });\n\n    results.messages.assertEqual(\n      onNext(510, false),\n      onCompleted(510)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 510)\n    );\n  });\n\n  test('sequenceEqual iterable not equal too short', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(190, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(450, 7),\n      onCompleted(510)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sequenceEqual([3, 4, 5, 6]);\n    });\n\n    results.messages.assertEqual(\n      onNext(450, false),\n      onCompleted(450)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450)\n    );\n  });\n\n  test('sequenceEqual iterable on error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(190, 2),\n      onNext(240, 3),\n      onNext(290, 4),\n      onError(310, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sequenceEqual([3, 4]);\n    });\n\n    results.messages.assertEqual(\n      onError(310, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 310)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/single.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('single');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe;\n\n  // Single Or Default\n  test('single empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.single();\n    });\n\n    results.messages.assertEqual(\n      onError(250, function (n) { return n.error instanceof Rx.EmptyError; })\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 250));\n  });\n\n  test('single empty default value', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.single({defaultValue: 42});\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 42),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 250));\n  });\n\n  test('single one', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.single();\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 2),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n  });\n\n  test('single many', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.single();\n    });\n\n    results.messages.assertEqual(\n      onError(220, function (n) { return n.error instanceof Error; })\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 220)\n    );\n  });\n\n  test('single Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.single();\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 210)\n    );\n  });\n\n  test('single predicate', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.single(function (x) {\n        return x % 2 === 1;\n      });\n    });\n\n    results.messages.assertEqual(\n      onError(240, function (n) { return n.error instanceof Error; })\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 240));\n  });\n\n  test('single predicate empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.single(function (x) { return x % 2 === 1; });\n    });\n\n    results.messages.assertEqual(\n      onError(250, function (n) { return n.error instanceof Rx.EmptyError; })\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n  });\n\n  test('single predicate empty default value', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.single({\n        predicate: function (x) { return x % 2 === 1; },\n        defaultValue: 42\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 42),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n  });\n\n  test('single predicate one', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.single(function (x) { return x === 4; });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 4),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n  });\n\n  test('single predicate none', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.single(function (x) { return x > 10; });\n    });\n\n    results.messages.assertEqual(\n      onError(250, function (n) { return n.error instanceof Rx.EmptyError; })\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n  });\n\n  test('single predicate none default value', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.single({\n        predicate: function (x) { return x > 10; },\n        defaultValue: 42\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 42),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n  });\n\n  test('single predicate throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.single(function (x) { return x > 10; });\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 210)\n    );\n  });\n\n  test('single predicate throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.single(function (x) {\n        if (x < 4) { return false; }\n        throw error;\n      });\n    });\n\n    results.messages.assertEqual(\n      onError(230, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/singleinstance.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('singleInstance');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe,\n      created = Rx.ReactiveTest.created,\n      disposed = Rx.ReactiveTest.disposed,\n      subscribed = Rx.ReactiveTest.subscribed;\n\n  test('singleInstance basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 1),\n      onNext(150, 2),\n      onNext(200, 3),\n      onCompleted(250)\n    );\n\n    var ys;\n    var results1 = scheduler.createObserver();\n    var results2 = scheduler.createObserver();\n    var disposable;\n\n    scheduler.scheduleAbsolute(null, created, function() {\n      ys = xs.singleInstance();\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function() {\n      disposable = new Rx.CompositeDisposable(\n        ys.subscribe(results1),\n        ys.subscribe(results2)\n      );\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function() {\n      disposable.dispose();\n    });\n\n    scheduler.start();\n\n    results1.messages.assertEqual(\n      onNext(300, 1),\n      onNext(350, 2),\n      onNext(400, 3),\n      onCompleted(450)\n    );\n\n    results2.messages.assertEqual(\n      onNext(300, 1),\n      onNext(350, 2),\n      onNext(400, 3),\n      onCompleted(450)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450)\n    );\n  });\n\n  test('singleInstance can resubscribe after stopped', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(100, 1),\n      onNext(150, 2),\n      onNext(200, 3),\n      onCompleted(250)\n    );\n\n    var ys;\n    var results1 = scheduler.createObserver();\n    var results2 = scheduler.createObserver();\n    var disposable = new Rx.SerialDisposable();\n\n    scheduler.scheduleAbsolute(null, 100, function() {\n        ys = xs.singleInstance();\n    });\n\n    scheduler.scheduleAbsolute(null, 200, function() {\n      disposable.setDisposable(ys.subscribe(results1));\n    });\n\n    scheduler.scheduleAbsolute(null, 600, function() {\n      disposable.setDisposable(ys.subscribe(results2));\n    });\n\n    scheduler.scheduleAbsolute(null, 900, function(){\n      disposable.dispose();\n    });\n\n    scheduler.start();\n\n    results1.messages.assertEqual(\n      onNext(300, 1),\n      onNext(350, 2),\n      onNext(400, 3),\n      onCompleted(450)\n    );\n\n    results2.messages.assertEqual(\n      onNext(700, 1),\n      onNext(750, 2),\n      onNext(800, 3),\n      onCompleted(850)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450),\n      subscribe(600, 850)\n    );\n  });\n}());\n"
  },
  {
    "path": "tests/observable/skip.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('skip');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('skip complete after', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 6),\n      onNext(150, 4),\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onCompleted(690)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skip(20);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(690)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 690)\n    );\n  });\n\n  test('skip complete same', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 6),\n      onNext(150, 4),\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onCompleted(690)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skip(17);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(690)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 690)\n    );\n  });\n\n  test('skip complete before', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 6),\n      onNext(150, 4),\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onCompleted(690)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skip(10);\n    });\n\n    results.messages.assertEqual(\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onCompleted(690)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 690)\n    );\n  });\n\n  test('skip complete zero', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 6),\n      onNext(150, 4),\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onCompleted(690)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skip(0);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onCompleted(690)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 690)\n    );\n  });\n\n  test('skip error after', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 6),\n      onNext(150, 4),\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onError(690, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skip(20);\n    });\n\n    results.messages.assertEqual(\n      onError(690, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 690)\n    );\n  });\n\n  test('skip error same', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 6),\n      onNext(150, 4),\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onError(690, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skip(17);\n    });\n\n    results.messages.assertEqual(\n      onError(690, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 690)\n    );\n  });\n\n  test('skip error before', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 6),\n      onNext(150, 4),\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onError(690, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skip(3);\n    });\n\n    results.messages.assertEqual(\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onError(690, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 690)\n    );\n  });\n\n  test('skip dispose before', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 6),\n      onNext(150, 4),\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skip(3);\n    }, { disposed: 250 });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n  });\n\n  test('skip dispose after', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 6),\n      onNext(150, 4),\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skip(3);\n    }, { disposed: 400 });\n\n    results.messages.assertEqual(\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/skiplast.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('skipLast');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('skipLast zero completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onCompleted(650)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipLast(0);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onCompleted(650)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 650)\n    );\n  });\n\n  test('skipLast zero error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onError(650, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipLast(0);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onError(650, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 650)\n    );\n  });\n\n  test('skipLast zero disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9)\n    );\n    var results = scheduler.startScheduler(function () {\n      return xs.skipLast(0);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n  test('skipLast one completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onCompleted(650)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipLast(1);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 2),\n      onNext(270, 3),\n      onNext(310, 4),\n      onNext(360, 5),\n      onNext(380, 6),\n      onNext(410, 7),\n      onNext(590, 8),\n      onCompleted(650)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 650)\n    );\n  });\n\n  test('skipLast one error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onError(650, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipLast(1);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 2),\n      onNext(270, 3),\n      onNext(310, 4),\n      onNext(360, 5),\n      onNext(380, 6),\n      onNext(410, 7),\n      onNext(590, 8),\n      onError(650, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 650)\n    );\n  });\n\n  test('skipLast one disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipLast(1);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 2),\n      onNext(270, 3),\n      onNext(310, 4),\n      onNext(360, 5),\n      onNext(380, 6),\n      onNext(410, 7),\n      onNext(590, 8)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n  test('skipLast three completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onCompleted(650)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipLast(3);\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 2),\n      onNext(360, 3),\n      onNext(380, 4),\n      onNext(410, 5),\n      onNext(590, 6),\n      onCompleted(650)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 650)\n    );\n  });\n\n  test('skipLast three error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onError(650, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipLast(3);\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 2),\n      onNext(360, 3),\n      onNext(380, 4),\n      onNext(410, 5),\n      onNext(590, 6),\n      onError(650, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 650)\n    );\n  });\n\n  test('skipLast three disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipLast(3);\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 2),\n      onNext(360, 3),\n      onNext(380, 4),\n      onNext(410, 5),\n      onNext(590, 6)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/skiplastwithtime.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('skipLastWithTime');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('skipLastWithTime zero 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipLastWithTime(0, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230)\n    );\n  });\n\n  test('skipLastWithTime zero 2', function () {\n\n      var scheduler = new TestScheduler();\n      var xs = scheduler.createHotObservable(onNext(210, 1), onNext(220, 2), onNext(230, 3), onCompleted(230));\n      var results = scheduler.startScheduler(function () {\n          return xs.skipLastWithTime(0, scheduler);\n      });\n      results.messages.assertEqual(onNext(210, 1), onNext(220, 2), onNext(230, 3), onCompleted(230));\n      xs.subscriptions.assertEqual(subscribe(200, 230));\n  });\n\n  test('skipLastWithTime some 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onCompleted(230)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipLastWithTime(15, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(230, 1),\n      onCompleted(230)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230)\n    );\n  });\n\n  test('skipLastWithTime some 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(240, 4),\n      onNext(250, 5),\n      onNext(260, 6),\n      onNext(270, 7),\n      onNext(280, 8),\n      onNext(290, 9),\n      onCompleted(300)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipLastWithTime(45, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(260, 1),\n      onNext(270, 2),\n      onNext(280, 3),\n      onNext(290, 4),\n      onNext(300, 5),\n      onCompleted(300)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300)\n    );\n  });\n\n  test('SkipLast_Some all', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipLastWithTime(45, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(230)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230)\n    );\n  });\n\n  test('skipLastWithTime error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipLastWithTime(45, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 210)\n    );\n  });\n\n  test('skipLastWithTimeNever', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable();\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipLastWithTime(50, scheduler);\n    });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/skipuntil.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, ok */\n  QUnit.module('skipUntil');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('skipUntil some data next', function () {\n    var scheduler = new TestScheduler();\n\n    var l = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var r = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(225, 99),\n      onCompleted(230)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return l.skipUntil(r);\n    });\n    results.messages.assertEqual(\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n  });\n\n  test('skipUntil some data error', function () {\n    var scheduler = new TestScheduler();\n\n    var error = new Error();\n\n    var l = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var r = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(225, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return l.skipUntil(r);\n    });\n\n    results.messages.assertEqual(\n      onError(225, error)\n    );\n  });\n\n  test('skipUntil some data empty', function () {\n    var scheduler = new TestScheduler();\n\n    var l = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var r = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(225)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return l.skipUntil(r);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('skipUntil never next', function () {\n    var scheduler = new TestScheduler();\n\n    var l = Observable.never();\n\n    var r = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(225, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return l.skipUntil(r);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('skipUntil never error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var l = Observable.never();\n\n    var r = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(225, error));\n\n    var results = scheduler.startScheduler(function () {\n      return l.skipUntil(r);\n    });\n\n    results.messages.assertEqual(\n      onError(225, error)\n    );\n  });\n\n  test('skipUntil some data Never', function () {\n    var scheduler = new TestScheduler();\n\n    var l = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var r = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return l.skipUntil(r);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('skipUntil never empty', function () {\n    var scheduler = new TestScheduler();\n\n    var l = Observable.never();\n\n    var r = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(225)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return l.skipUntil(r);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('skipUntil never never', function () {\n    var scheduler = new TestScheduler();\n\n    var l = Observable.never();\n\n    var r = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return l.skipUntil(r);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('SkipUntil has completed causes disposal', function () {\n    var scheduler = new TestScheduler();\n\n    var disposed = false;\n\n    var l = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var r = Observable.create(function () {\n      return function () { disposed = true; };\n    });\n\n    var results = scheduler.startScheduler(function () {\n      return l.skipUntil(r);\n    });\n\n    results.messages.assertEqual();\n\n    ok(disposed);\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/skipuntilwithtime.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('skipUntilWithTime');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('skipUntilWithTime zero', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipUntilWithTime(new Date(0), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230)\n    );\n  });\n\n  test('skipUntilWithTime late', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipUntilWithTime(new Date(250), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(230)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230)\n    );\n  });\n\n  test('skipUntilWithTime error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipUntilWithTime(new Date(250), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n    xs.subscriptions.assertEqual(\n      subscribe(200, 210)\n    );\n  });\n\n  test('skipUntilWithTime never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable();\n\n    var results = scheduler.startScheduler(function () {\n        return xs.skipUntilWithTime(new Date(250), scheduler);\n    });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n  test('skipUntil twice 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(240, 4),\n      onNext(250, 5),\n      onNext(260, 6),\n      onCompleted(270)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipUntilWithTime(new Date(215), scheduler).skipUntilWithTime(new Date(230), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(240, 4),\n      onNext(250, 5),\n      onNext(260, 6),\n      onCompleted(270)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 270)\n    );\n  });\n\n  test('skipUntil twice 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(240, 4),\n      onNext(250, 5),\n      onNext(260, 6),\n      onCompleted(270)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipUntilWithTime(new Date(230), scheduler).skipUntilWithTime(new Date(215), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(240, 4),\n      onNext(250, 5),\n      onNext(260, 6),\n      onCompleted(270)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 270)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/skipwhile.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal */\n  QUnit.module('skipWhile');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  function isPrime(i) {\n    if (i <= 1) { return false; }\n    var max = Math.floor(Math.sqrt(i));\n    for (var j = 2; j <= max; ++j) {\n      if (i % j === 0) { return false; }\n    }\n    return true;\n  }\n\n  test('skipWhile complete before', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, -1),\n      onNext(110, -1),\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onCompleted(330),\n      onNext(350, 7),\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onCompleted(600)\n    );\n\n    var invoked = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipWhile(function (x) {\n        invoked++;\n        return isPrime(x);\n      });\n    });\n\n    results.messages.assertEqual(\n      onCompleted(330)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 330)\n    );\n\n    equal(4, invoked);\n  });\n\n  test('skipWhile complete after', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, -1),\n      onNext(110, -1),\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onCompleted(600)\n    );\n\n    var invoked = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipWhile(function (x) {\n          invoked++;\n          return isPrime(x);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n\n    equal(6, invoked);\n  });\n\n  test('skipWhile error before', function () {\n    var error = new Error();\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, -1), onNext(110, -1),\n      onNext(210, 2),\n      onNext(260, 5),\n      onError(270, error),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onCompleted(600)\n    );\n\n    var invoked = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipWhile(function (x) {\n        invoked++;\n        return isPrime(x);\n      });\n    });\n\n    results.messages.assertEqual(onError(270, error));\n    xs.subscriptions.assertEqual(subscribe(200, 270));\n    equal(2, invoked);\n  });\n\n  test('skipWhile error after', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, -1),\n      onNext(110, -1),\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onError(600, error)\n    );\n\n    var invoked = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipWhile(function (x) {\n        invoked++;\n        return isPrime(x);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onError(600, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n\n    equal(6, invoked);\n  });\n\n  test('skipWhile dispose before', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, -1),\n      onNext(110, -1),\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onCompleted(600)\n    );\n\n    var invoked = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipWhile(function (x) {\n        invoked++;\n        return isPrime(x);\n      });\n    }, { disposed: 300 });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300)\n    );\n\n    equal(3, invoked);\n  });\n\n  test('skipWhile dispose after', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, -1),\n      onNext(110, -1),\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onCompleted(600)\n    );\n\n    var invoked = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipWhile(function (x) {\n        invoked++;\n        return isPrime(x);\n      });\n    }, { disposed: 470 });\n\n    results.messages.assertEqual(\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 470)\n    );\n\n    equal(6, invoked);\n  });\n\n  test('skipWhile zero', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, -1),\n      onNext(110, -1),\n      onNext(205, 100),\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onCompleted(600)\n    );\n\n    var invoked = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipWhile(function (x) {\n        invoked++;\n        return isPrime(x);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(205, 100),\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n\n    equal(1, invoked);\n  });\n\n  test('skipWhile throw', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, -1),\n      onNext(110, -1),\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onCompleted(600)\n    );\n\n    var error = new Error();\n\n    var invoked = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipWhile(function (x) {\n        invoked++;\n        if (invoked === 3) { throw error; }\n        return isPrime(x);\n      });\n    });\n\n    results.messages.assertEqual(\n      onError(290, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 290)\n    );\n\n    equal(3, invoked);\n  });\n\n  test('skipWhile index', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, -1),\n      onNext(110, -1),\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipWhile(function (x, i) {\n        return i < 5;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/skipwithtime.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('skipWithTime');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('skipWithTime zero', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipWithTime(0, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230)\n    );\n  });\n\n  test('skipWithTime some', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipWithTime(15, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230)\n    );\n  });\n\n  test('skipWithTime late', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipWithTime(50, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(230)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230)\n    );\n  });\n\n  test('skipWithTime error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipWithTime(50, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 210)\n    );\n  });\n\n  test('skipWithTime never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable();\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipWithTime(50, scheduler);\n    });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n  test('skipWithTime twice 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(240, 4),\n      onNext(250, 5),\n      onNext(260, 6),\n      onCompleted(270)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipWithTime(15, scheduler).skipWithTime(30, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(240, 4),\n      onNext(250, 5),\n      onNext(260, 6),\n      onCompleted(270)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 270)\n    );\n  });\n\n  test('skipWithTime twice 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(240, 4),\n      onNext(250, 5),\n      onNext(260, 6),\n      onCompleted(270)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.skipWithTime(30, scheduler).skipWithTime(15, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(240, 4),\n      onNext(250, 5),\n      onNext(260, 6),\n      onCompleted(270)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 270)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/slice.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, raises */\n\n  QUnit.module('slice');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('slice arguments', function () {\n    raises(function () {\n      Rx.Observable.of(1,2,3).slice(-1);\n    });\n\n    raises(function () {\n      Rx.Observable.of(1,2,3).slice(0, -1);\n    });\n\n    raises(function () {\n      Rx.Observable.of(1,2,3).slice(25, 1);\n    });\n  });\n\n  test('slice never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.slice(0);\n    });\n\n    results.messages.assertEqual(\n\n    );\n  });\n\n  test('slice empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.slice(0);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(250)\n    );\n  });\n\n  test('slice error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(250, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.slice(0);\n    });\n\n    results.messages.assertEqual(\n      onError(250, error)\n    );\n  });\n\n  test('slice single no end', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.slice(0);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onCompleted(250)\n    );\n  });\n\n  test('slice single end', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.slice(0, 1);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onCompleted(220)\n    );\n  });\n\n  test('slice multiple no end', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.slice(0);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n  });\n\n  test('slice multiple one no end', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.slice(1);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n  });\n\n  test('slice multiple no end error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onError(230, error),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.slice(0);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onError(230, error)\n    );\n  });\n\n  test('slice multiple end', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.slice(0, 3);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onCompleted(240)\n    );\n  });\n\n  test('slice multiple one end', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.slice(1, 3);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 3),\n      onNext(230, 4),\n      onCompleted(240)\n    );\n  });\n\n  test('slice multiple end error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onError(230, error),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.slice(0, 3);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onError(230, error)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/some.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('some');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('some predicate empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.some(function (x) { return x > 0; });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, false),\n      onCompleted(250)\n    );\n  });\n\n  test('some predicate return', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.some(function (x) { return x > 0; });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, true),\n      onCompleted(210)\n    );\n  });\n\n  test('some predicate return not match', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, -2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.some(function (x) { return x > 0; });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, false),\n      onCompleted(250)\n    );\n  });\n\n  test('some predicate SomeNoneMatch', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, -2),\n      onNext(220, -3),\n      onNext(230, -4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.some(function (x) { return x > 0; });\n    });\n\n    results.messages.assertEqual(\n      onNext(250, false),\n      onCompleted(250)\n    );\n  });\n\n  test('some predicate some match', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, -2),\n      onNext(220, 3),\n      onNext(230, -4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.some(function (x) { return x > 0; });\n    });\n\n    results.messages.assertEqual(\n      onNext(220, true),\n      onCompleted(220)\n    );\n  });\n\n  test('some predicate throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.some(function (x) { return x > 0; });\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('some predicate throws error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, -2),\n      onNext(220, 3),\n      onNext(230, -4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.some(function () { throw error; });\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('some predicate never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.some(function (x) { return x > 0; });\n    });\n\n    results.messages.assertEqual();\n  });\n}());\n"
  },
  {
    "path": "tests/observable/spawn.js",
    "content": "/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n  \"use strict\";\n\n  var hasOwn = Object.prototype.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n  var iteratorSymbol =\n    typeof Symbol === \"function\" && Symbol.iterator || \"@@iterator\";\n\n  var inModule = typeof module === \"object\";\n  var runtime = global.regeneratorRuntime;\n  if (runtime) {\n    if (inModule) {\n      // If regeneratorRuntime is defined globally and we're in a module,\n      // make the exports object identical to regeneratorRuntime.\n      module.exports = runtime;\n    }\n    // Don't bother evaluating the rest of this file if the runtime was\n    // already defined globally.\n    return;\n  }\n\n  // Define the runtime globally (as expected by generated code) as either\n  // module.exports (if we're in a module) or a new, empty object.\n  runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided, then outerFn.prototype instanceof Generator.\n    var generator = Object.create((outerFn || Generator).prototype);\n    var context = new Context(tryLocsList || []);\n\n    // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n    return generator;\n  }\n  runtime.wrap = wrap;\n\n  // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n  function tryCatch(fn, obj, arg) {\n    try {\n      return { type: \"normal\", arg: fn.call(obj, arg) };\n    } catch (err) {\n      return { type: \"throw\", arg: err };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\";\n\n  // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n  var ContinueSentinel = {};\n\n  // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n\n  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype;\n  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n  GeneratorFunctionPrototype.constructor = GeneratorFunction;\n  GeneratorFunction.displayName = \"GeneratorFunction\";\n\n  // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function(method) {\n      prototype[method] = function(arg) {\n        return this._invoke(method, arg);\n      };\n    });\n  }\n\n  runtime.isGeneratorFunction = function(genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor\n      ? ctor === GeneratorFunction ||\n        // For the native GeneratorFunction constructor, the best we can\n        // do is to check its .name property.\n        (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n      : false;\n  };\n\n  runtime.mark = function(genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n    }\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  };\n\n  // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `value instanceof AwaitArgument` to determine if the yielded value is\n  // meant to be awaited. Some may consider the name of this method too\n  // cutesy, but they are curmudgeons.\n  runtime.awrap = function(arg) {\n    return new AwaitArgument(arg);\n  };\n\n  function AwaitArgument(arg) {\n    this.arg = arg;\n  }\n\n  function AsyncIterator(generator) {\n    function invoke(method, arg, resolve, reject) {\n      var record = tryCatch(generator[method], generator, arg);\n      if (record.type === \"throw\") {\n        reject(record.arg);\n      } else {\n        var result = record.arg;\n        var value = result.value;\n        if (value instanceof AwaitArgument) {\n          return Promise.resolve(value.arg).then(function(value) {\n            invoke(\"next\", value, resolve, reject);\n          }, function(err) {\n            invoke(\"throw\", err, resolve, reject);\n          });\n        }\n\n        return Promise.resolve(value).then(function(unwrapped) {\n          // When a yielded Promise is resolved, its final value becomes\n          // the .value of the Promise<{value,done}> result for the\n          // current iteration. If the Promise is rejected, however, the\n          // result for this iteration will be rejected with the same\n          // reason. Note that rejections of yielded Promises are not\n          // thrown back into the generator function, as is the case\n          // when an awaited Promise is rejected. This difference in\n          // behavior between yield and await is important, because it\n          // allows the consumer to decide what to do with the yielded\n          // rejection (swallow it and continue, manually .throw it back\n          // into the generator, abandon iteration, whatever). With\n          // await, by contrast, there is no opportunity to examine the\n          // rejection reason outside the generator function, so the\n          // only option is to throw it from the await expression, and\n          // let the generator function handle the exception.\n          result.value = unwrapped;\n          resolve(result);\n        }, reject);\n      }\n    }\n\n    if (typeof process === \"object\" && process.domain) {\n      invoke = process.domain.bind(invoke);\n    }\n\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return new Promise(function(resolve, reject) {\n          invoke(method, arg, resolve, reject);\n        });\n      }\n\n      return previousPromise =\n        // If enqueue has been called before, then we want to wait until\n        // all previous Promises have been resolved before calling invoke,\n        // so that results are always delivered in the correct order. If\n        // enqueue has not been called before, then it is important to\n        // call invoke immediately, without waiting on a callback to fire,\n        // so that the async generator function has the opportunity to do\n        // any necessary setup in a predictable way. This predictability\n        // is why the Promise constructor synchronously invokes its\n        // executor callback, and why async functions synchronously\n        // execute code before the first await. Since we implement simple\n        // async functions in terms of async generators, it is especially\n        // important to get this right, even though it requires care.\n        previousPromise ? previousPromise.then(\n          callInvokeWithMethodAndArg,\n          // Avoid propagating failures to Promises returned by later\n          // invocations of the iterator.\n          callInvokeWithMethodAndArg\n        ) : callInvokeWithMethodAndArg();\n    }\n\n    // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n\n  // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n  runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n    var iter = new AsyncIterator(\n      wrap(innerFn, outerFn, self, tryLocsList)\n    );\n\n    return runtime.isGeneratorFunction(outerFn)\n      ? iter // If outerFn is a generator, return the full iterator.\n      : iter.next().then(function(result) {\n          return result.done ? result.value : iter.next();\n        });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        }\n\n        // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n        return doneResult();\n      }\n\n      while (true) {\n        var delegate = context.delegate;\n        if (delegate) {\n          if (method === \"return\" ||\n              (method === \"throw\" && delegate.iterator[method] === undefined)) {\n            // A return or throw (when the delegate iterator has no throw\n            // method) always terminates the yield* loop.\n            context.delegate = null;\n\n            // If the delegate iterator has a return method, give it a\n            // chance to clean up.\n            var returnMethod = delegate.iterator[\"return\"];\n            if (returnMethod) {\n              var record = tryCatch(returnMethod, delegate.iterator, arg);\n              if (record.type === \"throw\") {\n                // If the return method threw an exception, let that\n                // exception prevail over the original return or throw.\n                method = \"throw\";\n                arg = record.arg;\n                continue;\n              }\n            }\n\n            if (method === \"return\") {\n              // Continue with the outer return, now that the delegate\n              // iterator has been terminated.\n              continue;\n            }\n          }\n\n          var record = tryCatch(\n            delegate.iterator[method],\n            delegate.iterator,\n            arg\n          );\n\n          if (record.type === \"throw\") {\n            context.delegate = null;\n\n            // Like returning generator.throw(uncaught), but without the\n            // overhead of an extra function call.\n            method = \"throw\";\n            arg = record.arg;\n            continue;\n          }\n\n          // Delegate generator ran and handled its own exceptions so\n          // regardless of what the method was, we continue as if it is\n          // \"next\" with an undefined arg.\n          method = \"next\";\n          arg = undefined;\n\n          var info = record.arg;\n          if (info.done) {\n            context[delegate.resultName] = info.value;\n            context.next = delegate.nextLoc;\n          } else {\n            state = GenStateSuspendedYield;\n            return info;\n          }\n\n          context.delegate = null;\n        }\n\n        if (method === \"next\") {\n          if (state === GenStateSuspendedYield) {\n            context.sent = arg;\n          } else {\n            context.sent = undefined;\n          }\n\n        } else if (method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw arg;\n          }\n\n          if (context.dispatchException(arg)) {\n            // If the dispatched exception was caught by a catch block,\n            // then let that catch block handle the exception normally.\n            method = \"next\";\n            arg = undefined;\n          }\n\n        } else if (method === \"return\") {\n          context.abrupt(\"return\", arg);\n        }\n\n        state = GenStateExecuting;\n\n        var record = tryCatch(innerFn, self, context);\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done\n            ? GenStateCompleted\n            : GenStateSuspendedYield;\n\n          var info = {\n            value: record.arg,\n            done: context.done\n          };\n\n          if (record.arg === ContinueSentinel) {\n            if (context.delegate && method === \"next\") {\n              // Deliberately forget the last sent value so that we don't\n              // accidentally pass it on to the delegate.\n              arg = undefined;\n            }\n          } else {\n            return info;\n          }\n\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted;\n          // Dispatch the exception by looping back around to the\n          // context.dispatchException(arg) call above.\n          method = \"throw\";\n          arg = record.arg;\n        }\n      }\n    };\n  }\n\n  // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n  defineIteratorMethods(Gp);\n\n  Gp[iteratorSymbol] = function() {\n    return this;\n  };\n\n  Gp.toString = function() {\n    return \"[object Generator]\";\n  };\n\n  function pushTryEntry(locs) {\n    var entry = { tryLoc: locs[0] };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{ tryLoc: \"root\" }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  runtime.keys = function(object) {\n    var keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    keys.reverse();\n\n    // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      }\n\n      // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1, next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n\n          return next;\n        };\n\n        return next.next = next;\n      }\n    }\n\n    // Return an iterator with no values.\n    return { next: doneResult };\n  }\n  runtime.values = values;\n\n  function doneResult() {\n    return { value: undefined, done: true };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n\n    reset: function(skipTempReset) {\n      this.prev = 0;\n      this.next = 0;\n      this.sent = undefined;\n      this.done = false;\n      this.delegate = null;\n\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" &&\n              hasOwn.call(this, name) &&\n              !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n\n    stop: function() {\n      this.done = true;\n\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n\n    dispatchException: function(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n        return !!caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n\n    abrupt: function(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev &&\n            hasOwn.call(entry, \"finallyLoc\") &&\n            this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry &&\n          (type === \"break\" ||\n           type === \"continue\") &&\n          finallyEntry.tryLoc <= arg &&\n          arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.next = finallyEntry.finallyLoc;\n      } else {\n        this.complete(record);\n      }\n\n      return ContinueSentinel;\n    },\n\n    complete: function(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" ||\n          record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = record.arg;\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n    },\n\n    finish: function(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n\n    \"catch\": function(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n\n      // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n      throw new Error(\"illegal catch attempt\");\n    },\n\n    delegateYield: function(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      return ContinueSentinel;\n    }\n  };\n})(\n  // Among the various tricks for obtaining a reference to the global\n  // object, this seems to be the most reliable technique that does not\n  // use indirect eval (which violates Content Security Policy).\n  typeof global === \"object\" ? global :\n  typeof window === \"object\" ? window :\n  typeof self === \"object\" ? self : this\n);\n\n(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('spawn');\n\n  var marked0$0 = [first].map(regeneratorRuntime.mark);\n  function first() {\n    var x, y;\n\n    return regeneratorRuntime.wrap(function first$(context$1$0) {\n      while (1) switch (context$1$0.prev = context$1$0.next) {\n      case 0:\n        context$1$0.next = 2;\n        return Rx.Observable.just(42);\n      case 2:\n        x = context$1$0.sent;\n        context$1$0.next = 5;\n        return Rx.Observable.just(56);\n      case 5:\n        y = context$1$0.sent;\n        return context$1$0.abrupt(\"return\", x + y);\n      case 7:\n      case \"end\":\n        return context$1$0.stop();\n      }\n    }, marked0$0[0], this);\n  }\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('spawn success 1', function () {\n    var scheduler = new TestScheduler();\n\n    var source, subscription;\n    var results = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, 100, function () { source = Observable.spawn(first); });\n    scheduler.scheduleAbsolute(null, 200, function () { subscription = source.subscribe(results); });\n    scheduler.scheduleAbsolute(null, 1000, function () { subscription.dispose(); });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(200, 98),\n      onCompleted(200)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/start.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, asyncTest, start, equal, ok, RSVP */\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  function noop() {}\n\n  QUnit.module('startAsync');\n\n  asyncTest('StartAsync', function () {\n    var source = Rx.Observable.startAsync(function () {\n      return new RSVP.Promise(function (res) { res(42); });\n    });\n\n    source.subscribe(function (x) {\n      equal(42, x);\n      start();\n    });\n  });\n\n  asyncTest('StartAsync_Error', function () {\n    var source = Rx.Observable.startAsync(function () {\n      return new RSVP.Promise(function (res, rej) { rej(42); });\n    });\n\n    source.subscribe(noop, function (err) {\n      equal(42, err);\n      start();\n    });\n  });\n\n  test('start action 2', function () {\n    var scheduler = new TestScheduler();\n\n    var done = false;\n\n    var res = scheduler.startScheduler(function () {\n      return Observable.start(function () {\n        done = true;\n      }, null, scheduler);\n    });\n\n    res.messages.assertEqual(\n      onNext(200, undefined),\n      onCompleted(200)\n    );\n\n    ok(done);\n  });\n\n  test('start function 2', function () {\n    var scheduler = new TestScheduler();\n\n    var res = scheduler.startScheduler(function () {\n      return Observable.start(function () {\n        return 1;\n      }, null, scheduler);\n    });\n\n    res.messages.assertEqual(\n      onNext(200, 1),\n      onCompleted(200)\n    );\n  });\n\n  test('start with error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var res = scheduler.startScheduler(function () {\n      return Observable.start(function () {\n        throw error;\n      }, null, scheduler);\n    });\n\n    res.messages.assertEqual(\n      onError(200, error)\n    );\n  });\n\n  test('start with context', function () {\n    var context = { value: 42 };\n\n    var scheduler = new TestScheduler();\n\n    var res = scheduler.startScheduler(function () {\n      return Observable.start(function () {\n        return this.value;\n      }, context, scheduler);\n    });\n\n    res.messages.assertEqual(\n      onNext(200, 42),\n      onCompleted(200)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/startwith.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('startWith');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('startWith normal', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.startWith(1);\n    });\n\n    results.messages.assertEqual(\n      onNext(200, 1),\n      onNext(220, 2),\n      onCompleted(250)\n    );\n  });\n\n  test('startWith never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.startWith(scheduler, 1);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 1)\n    );\n  });\n\n  test('startWith empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.startWith(scheduler, 1);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 1),\n      onCompleted(250)\n    );\n  });\n\n  test('startWith one', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.startWith(scheduler, 1);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 1),\n      onNext(220, 2),\n      onCompleted(250)\n    );\n  });\n\n  test('startWith multiple', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.startWith(scheduler, 1, 2, 3);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 1),\n      onNext(202, 2),\n      onNext(203, 3),\n      onNext(220, 4),\n      onCompleted(250)\n    );\n  });\n\n  test('startWith error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(250, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.startWith(scheduler, 1, 2, 3);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 1),\n      onNext(202, 2),\n      onNext(203, 3),\n      onError(250, error)\n    );\n  });\n\n  test('startWith is unaffected by currentThread scheduler', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onCompleted(250)\n    );\n\n    var results;\n\n    Rx.Scheduler.currentThread.schedule(null, function () {\n      results = scheduler.startScheduler(function () {\n        return xs.startWith(scheduler, 1);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 1),\n      onNext(220, 2),\n      onCompleted(250)\n    );\n\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/subscribeon.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('subscribeOn');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('subscribeOn normal', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.subscribeOn(scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(201, 251)\n    );\n  });\n\n  test('subscribeOn error', function () {\n    var scheduler = new TestScheduler();\n\n    var error = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.subscribeOn(scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(201, 211)\n    );\n  });\n\n  test('subscribeOn empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.subscribeOn(scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(201, 251)\n    );\n  });\n\n  test('subscribeOn never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.subscribeOn(scheduler);\n    });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(201, 1001)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/sum.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('sum');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('sum number empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sum();\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 0),\n      onCompleted(250)\n    );\n  });\n\n  test('sum number return', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sum();\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 2),\n      onCompleted(250)\n    );\n  });\n\n  test('sum number some', function () {\n\n      var scheduler = new TestScheduler();\n      var xs = scheduler.createHotObservable(onNext(150, 1), onNext(210, 2), onNext(220, 3), onNext(230, 4), onCompleted(250));\n      var results = scheduler.startScheduler(function () {\n          return xs.sum();\n      });\n      results.messages.assertEqual(onNext(250, 2 + 3 + 4), onCompleted(250));\n  });\n\n  test('sum number throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sum();\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('sum number never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sum();\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('sum with selector regular number', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 'fo'),\n      onNext(220, 'b'),\n      onNext(230, 'qux'),\n      onCompleted(240)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.sum(function (x) {\n        return x.length;\n      });\n    });\n\n    results.messages.assertEqual(onNext(240, 6), onCompleted(240));\n\n    xs.subscriptions.assertEqual(subscribe(200, 240));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/switch.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, asyncTest, start, equal, RSVP */\n  QUnit.module('switch');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  asyncTest('switch Promise', function () {\n    var sources = Rx.Observable.fromArray([\n      new RSVP.Promise(function (res) { res(0); }),\n      new RSVP.Promise(function (res) { res(1); }),\n      new RSVP.Promise(function (res) { res(2); }),\n      new RSVP.Promise(function (res) { res(3); })\n    ]);\n\n    sources['switch']().subscribe(function (x) {\n      equal(3, x);\n      start();\n    });\n  });\n\n  asyncTest('switch Promise error', function () {\n    var sources = Rx.Observable.fromArray([\n      new RSVP.Promise(function (res) { res(0); }),\n      new RSVP.Promise(function (res) { res(1); }),\n      new RSVP.Promise(function (res, rej) { rej(2); }),\n      new RSVP.Promise(function (res) { res(3); })\n    ]);\n\n    sources['switch']().subscribe(function (x) {\n      equal(3, x);\n      start();\n    }, function (err) {\n      equal(2, err);\n      start();\n    });\n  });\n\n  test('switch Data', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, scheduler.createColdObservable(\n        onNext(10, 101),\n        onNext(20, 102),\n        onNext(110, 103),\n        onNext(120, 104),\n        onNext(210, 105),\n        onNext(220, 106),\n        onCompleted(230))),\n      onNext(400, scheduler.createColdObservable(\n        onNext(10, 201),\n        onNext(20, 202),\n        onNext(30, 203),\n        onNext(40, 204),\n        onCompleted(50))),\n      onNext(500, scheduler.createColdObservable(\n        onNext(10, 301),\n        onNext(20, 302),\n        onNext(30, 303),\n        onNext(40, 304),\n        onCompleted(150))),\n      onCompleted(600));\n\n    var results = scheduler.startScheduler(function () {\n      return xs['switch']();\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 101),\n      onNext(320, 102),\n      onNext(410, 201),\n      onNext(420, 202),\n      onNext(430, 203),\n      onNext(440, 204),\n      onNext(510, 301),\n      onNext(520, 302),\n      onNext(530, 303),\n      onNext(540, 304),\n      onCompleted(650)\n    );\n  });\n\n  test('switch inner throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, scheduler.createColdObservable(\n        onNext(10, 101),\n        onNext(20, 102),\n        onNext(110, 103),\n        onNext(120, 104),\n        onNext(210, 105),\n        onNext(220, 106),\n        onCompleted(230))),\n      onNext(400, scheduler.createColdObservable(\n        onNext(10, 201),\n        onNext(20, 202),\n        onNext(30, 203),\n        onNext(40, 204),\n        onError(50, error))),\n      onNext(500, scheduler.createColdObservable(\n        onNext(10, 301),\n        onNext(20, 302),\n        onNext(30, 303),\n        onNext(40, 304),\n        onCompleted(150))),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs['switch']();\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 101),\n      onNext(320, 102),\n      onNext(410, 201),\n      onNext(420, 202),\n      onNext(430, 203),\n      onNext(440, 204),\n      onError(450, error));\n  });\n\n  test('switch outer throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, scheduler.createColdObservable(\n        onNext(10, 101),\n        onNext(20, 102),\n        onNext(110, 103),\n        onNext(120, 104),\n        onNext(210, 105),\n        onNext(220, 106),\n        onCompleted(230))),\n      onNext(400, scheduler.createColdObservable(\n        onNext(10, 201),\n        onNext(20, 202),\n        onNext(30, 203),\n        onNext(40, 204),\n        onCompleted(50))),\n      onError(500, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs['switch']();\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 101),\n      onNext(320, 102),\n      onNext(410, 201),\n      onNext(420, 202),\n      onNext(430, 203),\n      onNext(440, 204),\n      onError(500, error)\n    );\n  });\n\n  test('switch no inner', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onCompleted(500)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs['switch']();\n    });\n\n    results.messages.assertEqual(\n      onCompleted(500)\n    );\n  });\n\n  test('switch inner completes', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(300, scheduler.createColdObservable(\n        onNext(10, 101),\n        onNext(20, 102),\n        onNext(110, 103),\n        onNext(120, 104),\n        onNext(210, 105),\n        onNext(220, 106),\n        onCompleted(230))),\n      onCompleted(540)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs['switch']();\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 101),\n      onNext(320, 102),\n      onNext(410, 103),\n      onNext(420, 104),\n      onNext(510, 105),\n      onNext(520, 106),\n      onCompleted(540)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/take.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('take');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('take complete after', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 6),\n      onNext(150, 4),\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onCompleted(690)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.take(20);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onCompleted(690)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 690)\n    );\n  });\n\n  test('take complete same', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 6),\n      onNext(150, 4),\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onCompleted(690)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.take(17);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11), \n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onCompleted(630)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 630));\n  });\n\n  test('take complete before', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 6),\n      onNext(150, 4),\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onCompleted(690)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.take(10);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onCompleted(415)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 415)\n    );\n  });\n\n  test('take error after', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 6),\n      onNext(150, 4),\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onError(690, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.take(20);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onError(690, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 690)\n    );\n  });\n\n  test('take error same', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 6),\n      onNext(150, 4),\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onError(690, new Error())\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.take(17);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onCompleted(630)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 630)\n    );\n  });\n\n  test('take error before', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 6),\n      onNext(150, 4),\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10),\n      onError(690, new Error()));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.take(3);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onCompleted(270)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 270));\n  });\n\n  test('take dispose before', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 6),\n      onNext(150, 4),\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.take(3);\n    }, { disposed: 250 });\n\n    results.messages.assertEqual(\n      onNext(210, 9),\n      onNext(230, 13)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 250));\n  });\n\n  test('take dispose after', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 6),\n      onNext(150, 4),\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onNext(280, 1),\n      onNext(300, -1),\n      onNext(310, 3),\n      onNext(340, 8),\n      onNext(370, 11),\n      onNext(410, 15),\n      onNext(415, 16),\n      onNext(460, 72),\n      onNext(510, 76),\n      onNext(560, 32),\n      onNext(570, -100),\n      onNext(580, -3),\n      onNext(590, 5),\n      onNext(630, 10)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.take(3);\n    }, { disposed: 400 });\n\n    results.messages.assertEqual(\n      onNext(210, 9),\n      onNext(230, 13),\n      onNext(270, 7),\n      onCompleted(270)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 270));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/takelast.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('takeLast');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('takeLast zero completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onCompleted(650)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLast(0);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(650)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 650)\n    );\n  });\n\n  test('takeLast zero error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onError(650, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLast(0);\n    });\n\n    results.messages.assertEqual(\n      onError(650, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 650)\n    );\n  });\n\n  test('takeLast zero disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLast(0);\n    });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n  test('takeLast one completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onCompleted(650)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLast(1);\n    });\n\n    results.messages.assertEqual(\n      onNext(650, 9),\n      onCompleted(650)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 650)\n    );\n  });\n\n  test('takeLast one error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onError(650, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLast(1);\n    });\n\n    results.messages.assertEqual(\n      onError(650, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 650)\n    );\n  });\n\n  test('takeLast one disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLast(1);\n    });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n  test('takeLast three completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onCompleted(650)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLast(3);\n    });\n\n    results.messages.assertEqual(\n      onNext(650, 7),\n      onNext(650, 8),\n      onNext(650, 9),\n      onCompleted(650)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 650)\n    );\n  });\n\n  test('takeLast three error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onError(650, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLast(3);\n    });\n\n    results.messages.assertEqual(\n      onError(650, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 650)\n    );\n  });\n\n  test('takeLast three disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLast(3);\n    });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/takelastbuffer.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('takeLastBuffer');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('takeLastBuffer zero completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onCompleted(650)\n    );\n\n    var results = scheduler.startScheduler(function () {\n        return xs.takeLastBuffer(0);\n    });\n\n    results.messages.assertEqual(\n      onNext(650, []),\n      onCompleted(650)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 650));\n  });\n\n  test('takeLastBuffer zero error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onError(650, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLastBuffer(0);\n    });\n\n    results.messages.assertEqual(onError(650, error));\n\n    xs.subscriptions.assertEqual(subscribe(200, 650));\n  });\n\n  test('takeLastBuffer zero disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLastBuffer(0);\n    });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(subscribe(200, 1000));\n  });\n\n  test('takeLastBuffer one completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onCompleted(650)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLastBuffer(1);\n    });\n\n    results.messages.assertEqual(\n      onNext(650, [9]),\n      onCompleted(650)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 650));\n  });\n\n  test('takeLastBuffer one error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onError(650, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n        return xs.takeLastBuffer(1);\n    });\n\n    results.messages.assertEqual(onError(650, error));\n\n    xs.subscriptions.assertEqual(subscribe(200, 650));\n  });\n\n  test('takeLastBuffer one disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLastBuffer(1);\n    });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(subscribe(200, 1000));\n  });\n\n  test('takeLastBuffer three completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onCompleted(650)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLastBuffer(3);\n    });\n\n    results.messages.assertEqual(\n      onNext(650, [7, 8, 9]),\n      onCompleted(650)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 650));\n  });\n\n  test('takeLastBuffer three error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9),\n      onError(650, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n        return xs.takeLastBuffer(3);\n    });\n\n    results.messages.assertEqual(onError(650, error));\n\n    xs.subscriptions.assertEqual(subscribe(200, 650));\n  });\n\n  test('takeLastBuffer three disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(180, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(270, 4),\n      onNext(310, 5),\n      onNext(360, 6),\n      onNext(380, 7),\n      onNext(410, 8),\n      onNext(590, 9)\n    );\n\n    var results = scheduler.startScheduler(function () {\n        return xs.takeLastBuffer(3);\n    });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(subscribe(200, 1000));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/takelastbufferwithtime.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('takeLastBufferWithTime');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe;\n\n  // TakeLastBuffer\n  test('takeLastBufferWithTime zero 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.takeLastBufferWithTime(0, scheduler);\n    });\n\n    res.messages.assertEqual(\n      onNext(230, []),\n      onCompleted(230));\n\n    xs.subscriptions.assertEqual(subscribe(200, 230));\n  });\n\n  test('takeLastBufferWithTime zero 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onCompleted(230)\n    );\n\n    var res = scheduler.startScheduler(function () {\n        return xs.takeLastBufferWithTime(0, scheduler);\n    });\n\n    res.messages.assertEqual(\n      onNext(230, []),\n      onCompleted(230)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 230));\n  });\n\n  test('takeLastBufferWithTime some 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onCompleted(240)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.takeLastBufferWithTime(25, scheduler);\n    });\n\n    res.messages.assertEqual(\n      onNext(240, [2,3]),\n      onCompleted(240)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 240));\n  });\n\n  test('takeLastBufferWithTime some 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onCompleted(300)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.takeLastBufferWithTime(25, scheduler);\n    });\n\n    res.messages.assertEqual(\n      onNext(300, []),\n      onCompleted(300)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 300));\n  });\n\n  test('takeLastBufferWithTime some 3', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(240, 4),\n      onNext(250, 5),\n      onNext(260, 6),\n      onNext(270, 7),\n      onNext(280, 8),\n      onNext(290, 9),\n      onCompleted(300)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.takeLastBufferWithTime(45, scheduler);\n    });\n\n    res.messages.assertEqual(\n      onNext(300, [6,7,8,9]),\n      onCompleted(300)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 300));\n  });\n\n  test('takeLastBufferWithTime some 4', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(240, 2),\n      onNext(250, 3),\n      onNext(280, 4),\n      onNext(290, 5),\n      onNext(300, 6),\n      onCompleted(350)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.takeLastBufferWithTime(25, scheduler);\n    });\n\n    res.messages.assertEqual(\n      onNext(350, []),\n      onCompleted(350)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 350));\n  });\n\n  test('takeLastBufferWithTime All', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.takeLastBufferWithTime(50, scheduler);\n    });\n\n    res.messages.assertEqual(\n      onNext(230, [1,2]),\n      onCompleted(230)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 230));\n  });\n\n  test('takeLastBufferWithTime Error', function () {\n    var scheduler = new TestScheduler();\n\n    var ex = new Error();\n\n    var xs = scheduler.createHotObservable(onError(210, ex));\n\n    var res = scheduler.startScheduler(function () {\n      return xs.takeLastBufferWithTime(50, scheduler);\n    });\n\n    res.messages.assertEqual(onError(210, ex));\n\n    xs.subscriptions.assertEqual(subscribe(200, 210));\n  });\n\n  test('takeLastBufferWithTime never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable();\n\n    var res = scheduler.startScheduler(function () {\n      return xs.takeLastBufferWithTime(50, scheduler);\n    });\n\n    res.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(subscribe(200, 1000));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/takelastwithtime.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('takeLastWithTime');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe;\n\n  test('takeLastWithTime zero 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLastWithTime(0, scheduler);\n    });\n\n    results.messages.assertEqual(onCompleted(230));\n\n    xs.subscriptions.assertEqual(subscribe(200, 230));\n  });\n\n  test('takeLastWithTime zero 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onCompleted(230)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLastWithTime(0, scheduler);\n    });\n\n    results.messages.assertEqual(onCompleted(230));\n\n    xs.subscriptions.assertEqual(subscribe(200, 230));\n  });\n\n  test('takeLastWithTime some 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onCompleted(240)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLastWithTime(25, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(240, 2),\n      onNext(240, 3),\n      onCompleted(240)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 240));\n  });\n\n  test('takeLastWithTime some 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onCompleted(300)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLastWithTime(25, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(300)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300)\n    );\n  });\n\n  test('takeLastWithTime some 3', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(240, 4),\n      onNext(250, 5),\n      onNext(260, 6),\n      onNext(270, 7),\n      onNext(280, 8),\n      onNext(290, 9),\n      onCompleted(300)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLastWithTime(45, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(300, 6),\n      onNext(300, 7),\n      onNext(300, 8),\n      onNext(300, 9),\n      onCompleted(300)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 300));\n  });\n\n  test('takeLastWithTime some 4', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(240, 2),\n      onNext(250, 3),\n      onNext(280, 4),\n      onNext(290, 5),\n      onNext(300, 6),\n      onCompleted(350)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLastWithTime(25, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(350)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 350)\n    );\n  });\n\n  test('takeLastWithTime all', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLastWithTime(50, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(230, 1),\n      onNext(230, 2),\n      onCompleted(230)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230)\n    );\n  });\n\n  test('takeLastWithTime error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLastWithTime(50, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 210)\n    );\n  });\n\n  test('takeLastWithTime never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable();\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeLastWithTime(50, scheduler);\n    });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/takeuntil.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, ok */\n  QUnit.module('takeUntil');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('takeUntil preempt some data next', function () {\n    var scheduler = new TestScheduler();\n\n    var l = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var r = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(225, 99),\n      onCompleted(230)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return l.takeUntil(r);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onCompleted(225)\n    );\n  });\n\n  test('takeUntil preempt some data error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var l = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var r = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(225, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return l.takeUntil(r);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onError(225, error)\n    );\n  });\n\n  test('takeUntil no preempt some data empty', function () {\n    var scheduler = new TestScheduler();\n\n    var l = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var r = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(225)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return l.takeUntil(r);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n  });\n\n  test('takeUntil no preempt some data never', function () {\n    var scheduler = new TestScheduler();\n\n    var l = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var r = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return l.takeUntil(r);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n  });\n\n  test('takeUntil preempt never next', function () {\n    var scheduler = new TestScheduler();\n\n    var l = Observable.never();\n\n    var r = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(225, 2),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return l.takeUntil(r);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(225)\n    );\n  });\n\n  test('takeUntil preempt never error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var l = Observable.never();\n\n    var r = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(225, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return l.takeUntil(r);\n    });\n\n    results.messages.assertEqual(\n      onError(225, error)\n    );\n  });\n\n  test('takeUntil no preempt never empty', function () {\n    var scheduler = new TestScheduler();\n\n    var l = Observable.never();\n\n    var r = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(225)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return l.takeUntil(r);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('takeUntil no preempt never never', function () {\n    var scheduler = new TestScheduler();\n\n    var l = Observable.never();\n\n    var r = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return l.takeUntil(r);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('takeUntil preempt before first produced', function () {\n    var scheduler = new TestScheduler();\n\n    var l = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(230, 2),\n      onCompleted(240)\n    );\n\n    var r = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(220)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return l.takeUntil(r);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(210)\n    );\n  });\n\n  test('takeUntil preempt before first produced remain silent and proper disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var sourceNotDisposed = false;\n\n    var l = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(215, new Error()),\n      onCompleted(240)\n    ).tap(function () { sourceNotDisposed = true; });\n\n    var r = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(220)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return l.takeUntil(r);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(210)\n    );\n\n    ok(!sourceNotDisposed);\n  });\n\n  test('takeUntil no preempt after last produced proper disposed signal', function () {\n    var scheduler = new TestScheduler();\n\n    var signalNotDisposed = false;\n\n    var l = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(230, 2),\n      onCompleted(240)\n    );\n\n    var r = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(250, 2),\n      onCompleted(260)\n    ).tap(function () { signalNotDisposed = true; });\n\n    var results = scheduler.startScheduler(function () {\n      return l.takeUntil(r);\n    });\n\n    results.messages.assertEqual(\n      onNext(230, 2),\n      onCompleted(240)\n    );\n\n    ok(!signalNotDisposed);\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/takeuntilwithtime.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('takeUntilWithTime');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('takeUntilWithTime zero', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeUntilWithTime(new Date(0), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(201)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 201)\n    );\n  });\n\n  test('takeUntilWithTime late', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeUntilWithTime(new Date(250), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230)\n    );\n  });\n\n  test('takeUntilWithTime error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeUntilWithTime(new Date(250), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 210)\n    );\n  });\n\n  test('takeUntilWithTime never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable();\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeUntilWithTime(new Date(250), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n  });\n\n  test('takeUntilWithTime twice 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(240, 4),\n      onNext(250, 5),\n      onNext(260, 6),\n      onCompleted(270)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeUntilWithTime(new Date(255), scheduler).takeUntilWithTime(new Date(235), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onCompleted(235)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 235)\n    );\n  });\n\n  test('takeUntilWithTime twice 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(240, 4),\n      onNext(250, 5),\n      onNext(260, 6),\n      onCompleted(270)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeUntilWithTime(new Date(235), scheduler).takeUntilWithTime(new Date(255), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onCompleted(235)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 235)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/takewhile.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal */\n  QUnit.module('takeWhile');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  function isPrime(i) {\n    if (i <= 1) { return false; }\n    var max = Math.floor(Math.sqrt(i));\n    for (var j = 2; j <= max; ++j) {\n      if (i % j === 0) { return false; }\n    }\n\n    return true;\n  }\n\n  test('takeWhile complete before', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, -1),\n      onNext(110, -1),\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onCompleted(330),\n      onNext(350, 7),\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onCompleted(600)\n    );\n\n    var invoked = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeWhile(function (x) {\n        invoked++;\n        return isPrime(x);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onCompleted(330)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 330)\n    );\n\n    equal(4, invoked);\n  });\n\n  test('takeWhile complete after', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, -1),\n      onNext(110, -1),\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onCompleted(600)\n    );\n\n    var invoked = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeWhile(function (x) {\n        invoked++;\n        return isPrime(x);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onCompleted(390)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 390)\n    );\n\n    equal(6, invoked);\n  });\n\n  test('takeWhile error before', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, -1),\n      onNext(110, -1),\n      onNext(210, 2),\n      onNext(260, 5),\n      onError(270, error),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23)\n    );\n\n    var invoked = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeWhile(function (x) {\n        invoked++;\n        return isPrime(x);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(260, 5),\n      onError(270, error)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 270));\n\n    equal(2, invoked);\n  });\n\n  test('takeWhile error after', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, -1),\n      onNext(110, -1),\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onError(600, new Error())\n    );\n\n    var invoked = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeWhile(function (x) {\n        invoked++;\n        return isPrime(x);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onCompleted(390)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 390)\n    );\n\n    equal(6, invoked);\n  });\n\n  test('takeWhile dispose before', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, -1),\n      onNext(110, -1),\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onCompleted(600)\n    );\n\n    var invoked = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeWhile(function (x) {\n        invoked++;\n        return isPrime(x);\n      });\n    }, { disposed: 300 });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300)\n    );\n\n    equal(3, invoked);\n  });\n\n  test('takeWhile dispose after', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, -1),\n      onNext(110, -1),\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onCompleted(600)\n    );\n\n    var invoked = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeWhile(function (x) {\n        invoked++;\n        return isPrime(x);\n      });\n    }, { disposed: 400 });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onCompleted(390)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 390)\n    );\n\n    equal(6, invoked);\n  });\n\n  test('takeWhile zero', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, -1),\n      onNext(110, -1),\n      onNext(205, 100),\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onCompleted(600)\n    );\n\n    var invoked = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeWhile(function (x) {\n        invoked++;\n        return isPrime(x);\n      });\n    }, { disposed: 300 });\n\n    results.messages.assertEqual(\n      onCompleted(205)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 205)\n    );\n\n    equal(1, invoked);\n  });\n\n  test('takeWhile throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, -1),\n      onNext(110, -1),\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onCompleted(600)\n    );\n\n    var invoked = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeWhile(function (x) {\n        invoked++;\n        if (invoked === 3) { throw error; }\n        return isPrime(x);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(260, 5),\n      onError(290, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 290)\n    );\n\n    equal(3, invoked);\n  });\n\n  test('takeWhile index', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, -1),\n      onNext(110, -1),\n      onNext(205, 100),\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onNext(350, 7),\n      onNext(390, 4),\n      onNext(410, 17),\n      onNext(450, 8),\n      onNext(500, 23),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeWhile(function (x, i) {\n        return i < 5;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(205, 100),\n      onNext(210, 2),\n      onNext(260, 5),\n      onNext(290, 13),\n      onNext(320, 3),\n      onCompleted(350)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 350)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/takewithtime.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('takeWithTime');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('takeWithTime zero', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeWithTime(0, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(201)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 201)\n    );\n  });\n\n  test('takeWithTime some', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onCompleted(240)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeWithTime(25, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(225)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 225)\n    );\n  });\n\n  test('takeWithTime late', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeWithTime(50, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 230)\n    );\n  });\n\n  test('takeWithTime error', function () {\n    var scheduler = new TestScheduler();\n\n    var error = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeWithTime(50, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 210));\n  });\n\n  test('takeWithTime never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable();\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeWithTime(50, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n  });\n\n  test('takeWithTime twice 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(240, 4),\n      onNext(250, 5),\n      onNext(260, 6),\n      onCompleted(270)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeWithTime(55, scheduler).takeWithTime(35, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onCompleted(235)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 235)\n    );\n  });\n\n  test('takeWithTime twice 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onNext(240, 4),\n      onNext(250, 5),\n      onNext(260, 6),\n      onCompleted(270)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.takeWithTime(35, scheduler).takeWithTime(55, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onCompleted(235)\n    );\n\n    xs.subscriptions.assertEqual(subscribe(200, 235));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/throttle.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('throttle');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('throttle completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(310, 4),\n      onNext(350, 5),\n      onNext(410, 6),\n      onNext(450, 7),\n      onCompleted(500)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.throttle(200, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(410, 6),\n      onCompleted(500)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 500)\n    );\n  });\n\n  test('throttle never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.throttle(200, scheduler);\n    });\n\n    results.messages.assertEqual(\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n  test('throttle empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(500)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.throttle(200, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(500)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 500)\n    );\n  });\n\n  test('throttle error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(310, 4),\n      onNext(350, 5),\n      onError(410, error),\n      onNext(450, 7),\n      onCompleted(500)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.throttle(200, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onError(410, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 410)\n    );\n  });\n\n  test('throttle no end', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(250, 3),\n      onNext(310, 4),\n      onNext(350, 5),\n      onNext(410, 6),\n      onNext(450, 7)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.throttle(200, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(410, 6)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n}());\n"
  },
  {
    "path": "tests/observable/throw.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, raises */\n  QUnit.module('throw');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onError = Rx.ReactiveTest.onError;\n\n  function noop () { }\n\n  test('throw basic', function () {\n    var scheduler = new TestScheduler();\n\n    var error = new Error();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['throw'](error, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(201, error)\n    );\n  });\n\n  test('throw disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['throw'](new Error(), scheduler);\n    }, { disposed: 200 });\n\n    results.messages.assertEqual();\n  });\n\n  test('throw observer throws', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = Observable['throw'](new Error(), scheduler);\n\n    xs.subscribe(noop, function () { throw new Error(); });\n\n    raises(function () { scheduler.start(); });\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/timeinterval.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('timeInterval');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  function TimeInterval(value, interval) {\n    this.value = value;\n    this.interval = interval;\n  }\n\n  test('timeInterval regular', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(260, 4),\n      onNext(300, 5),\n      onNext(350, 6),\n      onCompleted(400));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeInterval(scheduler).map(function (x) {\n        return new TimeInterval(x.value, x.interval);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, new TimeInterval(2, 10)),\n      onNext(230, new TimeInterval(3, 20)),\n      onNext(260, new TimeInterval(4, 30)),\n      onNext(300, new TimeInterval(5, 40)),\n      onNext(350, new TimeInterval(6, 50)),\n      onCompleted(400)\n    );\n  });\n\n  test('timeInterval empty', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Rx.Observable.empty(scheduler).timeInterval(scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(201)\n    );\n  });\n\n  test('timeInterval error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Rx.Observable['throw'](error, scheduler).timeInterval(scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(201, error)\n    );\n  });\n\n  test('timeInterval never', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Rx.Observable.never().timeInterval(scheduler);\n    });\n\n    results.messages.assertEqual();\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/timeout.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, ok, equal */\n  QUnit.module('timeout');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe;\n\n  test('timeout in time', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(260, 4),\n      onNext(300, 5),\n      onNext(350, 6),\n      onCompleted(400)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(500, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(260, 4),\n      onNext(300, 5),\n      onNext(350, 6),\n      onCompleted(400)\n    );\n  });\n\n  test('timeout relative time timeout occurs with default error', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(410, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(200, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(400, function (e) { return e.error instanceof Rx.TimeoutError; })\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n  });\n\n  test('timeout relative time timeout occurs with custom error', function () {\n    var error = new Error('custom');\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(410, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(200, error, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(400, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n  });\n\n  test('timeout absolute time timeout occurs with default error', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(410, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(new Date(400), scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(400, function (e) { return e.error instanceof Rx.TimeoutError; })\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n  });\n\n  test('timeout absolute time timeout occurs with custom error', function () {\n    var error = new Error('custom');\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(410, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(new Date(400), error, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(400, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n  });\n\n  test('timeout out of time', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(260, 4),\n      onNext(300, 5),\n      onNext(350, 6),\n      onCompleted(400)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(205, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(260, 4),\n      onNext(300, 5),\n      onNext(350, 6),\n      onCompleted(400)\n    );\n  });\n\n  test('timeout timeout occurs 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 1),\n      onNext(130, 2),\n      onNext(310, 3),\n      onNext(400, 4),\n      onCompleted(500)\n    );\n\n    var ys = scheduler.createColdObservable(\n      onNext(50, -1),\n      onNext(200, -2),\n      onNext(310, -3),\n      onCompleted(320)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(100, ys, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(350, -1),\n      onNext(500, -2),\n      onNext(610, -3),\n      onCompleted(620)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(300, 620)\n    );\n  });\n\n  test('timeout timeout occurs 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 1),\n      onNext(130, 2),\n      onNext(240, 3),\n      onNext(310, 4),\n      onNext(430, 5),\n      onCompleted(500)\n    );\n\n    var ys = scheduler.createColdObservable(\n      onNext(50, -1),\n      onNext(200, -2),\n      onNext(310, -3),\n      onCompleted(320)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(100, ys, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(240, 3),\n      onNext(310, 4),\n      onNext(460, -1),\n      onNext(610, -2),\n      onNext(720, -3),\n      onCompleted(730)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 410)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(410, 730)\n    );\n  });\n\n  test('timeout timeout occurs never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 1),\n      onNext(130, 2),\n      onNext(240, 3),\n      onNext(310, 4),\n      onNext(430, 5),\n      onCompleted(500)\n    );\n\n    var ys = scheduler.createColdObservable();\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(100, ys, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(240, 3),\n      onNext(310, 4)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 410)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(410, 1000)\n    );\n  });\n\n  test('timeout timeout occurs completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onCompleted(500)\n    );\n\n    var ys = scheduler.createColdObservable(\n      onNext(100, -1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(100, ys, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(400, -1)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(300, 1000)\n    );\n  });\n\n  test('timeout timeout occurs Error', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onError(500, new Error())\n    );\n\n    var ys = scheduler.createColdObservable(\n      onNext(100, -1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(100, ys, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(400, -1)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(300, 1000)\n    );\n  });\n\n  test('timeout timeout does not occur completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onCompleted(250)\n    );\n\n    var ys = scheduler.createColdObservable(\n      onNext(100, -1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(100, ys, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n\n    ys.subscriptions.assertEqual();\n  });\n\n  test('timeout timeout does not occur Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onError(250, error)\n    );\n\n    var ys = scheduler.createColdObservable(\n      onNext(100, -1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(100, ys, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(250, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n\n    ys.subscriptions.assertEqual();\n  });\n\n  test('timeout timeout does not occur', function () {\n    var scheduler = new TestScheduler();\n    var xs = scheduler.createHotObservable(\n      onNext(70, 1),\n      onNext(130, 2),\n      onNext(240, 3),\n      onNext(320, 4),\n      onNext(410, 5),\n      onCompleted(500)\n    );\n\n    var ys = scheduler.createColdObservable(\n      onNext(50, -1),\n      onNext(200, -2),\n      onNext(310, -3),\n      onCompleted(320)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(100, ys, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(240, 3),\n      onNext(320, 4),\n      onNext(410, 5),\n      onCompleted(500)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 500)\n    );\n\n    ys.subscriptions.assertEqual();\n  });\n\n  test('timeout absolute time timeout occurs', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(410, 1)\n    );\n\n    var ys = scheduler.createColdObservable(\n      onNext(100, -1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(new Date(400), ys, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(500, -1)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n\n    ys.subscriptions.assertEqual(subscribe(400, 1000));\n  });\n\n  test('timeout absolute time timeout does not occur completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(310, 1),\n      onCompleted(390)\n    );\n\n    var ys = scheduler.createColdObservable(\n      onNext(100, -1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(new Date(400), ys, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 1), onCompleted(390)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 390)\n    );\n\n    ys.subscriptions.assertEqual();\n  });\n\n  test('timeout absolute time timeout does not occur Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(310, 1),\n      onError(390, error)\n    );\n\n    var ys = scheduler.createColdObservable(\n      onNext(100, -1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(new Date(400), ys, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 1),\n      onError(390, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 390)\n    );\n\n    ys.subscriptions.assertEqual();\n  });\n\n  test('timeout absolute time timeoutOccur 2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(310, 1),\n      onNext(350, 2),\n      onNext(420, 3),\n      onCompleted(450)\n    );\n\n    var ys = scheduler.createColdObservable(\n      onNext(100, -1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(new Date(400), ys, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 1),\n      onNext(350, 2),\n      onNext(500, -1)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(400, 1000)\n    );\n  });\n\n  test('timeout absolute time timeoutOccur 3', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(310, 1),\n      onNext(350, 2),\n      onNext(420, 3),\n      onCompleted(450)\n    );\n\n    var ys = scheduler.createColdObservable();\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(new Date(400), ys, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 1),\n      onNext(350, 2)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(400, 1000)\n    );\n  });\n\n  test('timeout duration simple never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(310, 1),\n      onNext(350, 2),\n      onNext(420, 3),\n      onCompleted(450));\n\n    var ys = scheduler.createColdObservable();\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(ys, function () { return ys; });\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 1),\n      onNext(350, 2),\n      onNext(420, 3),\n      onCompleted(450));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450));\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 310),\n      subscribe(310, 350),\n      subscribe(350, 420),\n      subscribe(420, 450));\n  });\n\n  test('timeout duration simple timeout first', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(310, 1),\n      onNext(350, 2),\n      onNext(420, 3),\n      onCompleted(450));\n\n    var ys = scheduler.createColdObservable(\n      onNext(100, 'boo!'));\n\n    var zs = scheduler.createColdObservable();\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(ys, function () { return zs; });\n    });\n\n    equal(1, results.messages.length);\n    ok(results.messages[0].time === 300 && results.messages[0].value.error !== null);\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 300));\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 300));\n\n    zs.subscriptions.assertEqual();\n  });\n\n  test('timeout duration simple timeout later', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(310, 1),\n      onNext(350, 2),\n      onNext(420, 3),\n      onCompleted(450));\n\n    var ys = scheduler.createColdObservable();\n\n    var zs = scheduler.createColdObservable(onNext(50, 'boo!'));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(ys, function () { return zs; });\n    });\n\n    equal(3, results.messages.length);\n    ok(onNext(310, 1).equals(results.messages[0]));\n    ok(onNext(350, 2).equals(results.messages[1]));\n    ok(results.messages[2].time === 400 && results.messages[2].value.error !== null);\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400));\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 310));\n\n    zs.subscriptions.assertEqual(\n      subscribe(310, 350),\n      subscribe(350, 400));\n  });\n\n  test('timeout duration simple timeoutByCompletion', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(310, 1),\n      onNext(350, 2),\n      onNext(420, 3),\n      onCompleted(450));\n\n    var ys = scheduler.createColdObservable();\n\n    var zs = scheduler.createColdObservable(\n      onCompleted(50));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(ys, function () { return zs; });\n    });\n\n    equal(3, results.messages.length);\n\n    ok(onNext(310, 1).equals(results.messages[0]));\n    ok(onNext(350, 2).equals(results.messages[1]));\n    ok(results.messages[2].time === 400 && results.messages[2].value.error !== null);\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400));\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 310));\n\n    zs.subscriptions.assertEqual(\n      subscribe(310, 350),\n      subscribe(350, 400));\n  });\n\n  test('timeout duration simple timeoutByCompletion', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(310, 1),\n      onNext(350, 2),\n      onNext(420, 3),\n      onCompleted(450));\n\n    var ys = scheduler.createColdObservable();\n\n    var zs = scheduler.createColdObservable();\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(ys, function (x) {\n        if (x < 3) { return zs; }\n        throw error;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 1),\n      onNext(350, 2),\n      onNext(420, 3),\n      onError(420, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 420));\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 310));\n\n    zs.subscriptions.assertEqual(\n      subscribe(310, 350),\n      subscribe(350, 420));\n  });\n\n  test('timeout duration simple inner throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(310, 1),\n      onNext(350, 2),\n      onNext(420, 3),\n      onCompleted(450));\n\n    var ys = scheduler.createColdObservable();\n\n    var zs = scheduler.createColdObservable(\n      onError(50, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(ys, function () { return zs; });\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 1),\n      onNext(350, 2),\n      onError(400, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400));\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 310));\n\n    zs.subscriptions.assertEqual(\n      subscribe(310, 350),\n      subscribe(350, 400));\n  });\n\n  test('timeout duration simple first throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(310, 1),\n      onNext(350, 2),\n      onNext(420, 3),\n      onCompleted(450));\n\n    var ys = scheduler.createColdObservable(\n      onError(50, error));\n\n    var zs = scheduler.createColdObservable();\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(ys, function () { return zs; });\n    });\n\n    results.messages.assertEqual(onError(250, error));\n    xs.subscriptions.assertEqual(subscribe(200, 250));\n    ys.subscriptions.assertEqual(subscribe(200, 250));\n    zs.subscriptions.assertEqual();\n  });\n\n  test('timeout duration simple source throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(310, 1),\n      onNext(350, 2),\n      onNext(420, 3),\n      onError(450, error));\n\n    var ys = scheduler.createColdObservable();\n\n    var zs = scheduler.createColdObservable();\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timeout(ys, function () { return zs; });\n    });\n\n    results.messages.assertEqual(\n      onNext(310, 1),\n      onNext(350, 2),\n      onNext(420, 3),\n      onError(450, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450));\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 310));\n\n    zs.subscriptions.assertEqual(\n      subscribe(310, 350),\n      subscribe(350, 420),\n      subscribe(420, 450));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/timer.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, raises */\n  QUnit.module('timer');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  function noop () { }\n\n  test('timer one shot relative time basic', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Rx.Observable.timer(300, scheduler);\n    });\n\n    results.messages.assertEqual(onNext(500, 0), onCompleted(500));\n  });\n\n  test('timer one shot relative time zero', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Rx.Observable.timer(0, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 0),\n      onCompleted(201)\n    );\n  });\n\n  test('timer one shot relative time negative', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Rx.Observable.timer(-1, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(201, 0),\n      onCompleted(201)\n    );\n  });\n\n  test('timer one shot relative time disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Rx.Observable.timer(1000, scheduler);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('timer one shot relative time observer throws', function () {\n    var scheduler1 = new TestScheduler();\n\n    var xs = Rx.Observable.timer(1, scheduler1);\n    xs.subscribe(function () { throw new Error(); });\n    raises(function () { scheduler1.start(); });\n\n    var scheduler2 = new TestScheduler();\n\n    var ys = Rx.Observable.timer(1, scheduler2);\n    ys.subscribe(noop, noop, function () { throw new Error(); });\n    raises(function () { scheduler2.start(); });\n  });\n\n  test('timer relative start and periodically repeat', function() {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function() {\n      return Rx.Observable.timer(300, 100, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(500, 0),\n      onNext(600, 1),\n      onNext(700, 2),\n      onNext(800, 3),\n      onNext(900, 4)\n    );\n  });\n\n  test('timer absolute start and periodically repeat', function() {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function() {\n      return Rx.Observable.timer(new Date(500), 100, scheduler);\n    });\n\n    results.messages.assertEqual(\n      onNext(500, 0),\n      onNext(600, 1),\n      onNext(700, 2),\n      onNext(800, 3),\n      onNext(900, 4)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/timestamp.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('timestamp');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted;\n\n  function Timestamp(value, timestamp) {\n    this.value = value;\n    this.timestamp = timestamp;\n  }\n\n  test('timestamp regular', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(230, 3),\n      onNext(260, 4),\n      onNext(300, 5),\n      onNext(350, 6),\n      onCompleted(400)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.timestamp(scheduler).map(function (x) {\n        return new Timestamp(x.value, x.timestamp);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(210, new Timestamp(2, 210)),\n      onNext(230, new Timestamp(3, 230)),\n      onNext(260, new Timestamp(4, 260)),\n      onNext(300, new Timestamp(5, 300)),\n      onNext(350, new Timestamp(6, 350)),\n      onCompleted(400)\n    );\n  });\n\n  test('timestamp empty', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Rx.Observable.empty(scheduler).timestamp(scheduler);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(201)\n    );\n  });\n\n  test('timestamp error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Rx.Observable['throw'](error, scheduler).timestamp(scheduler);\n    });\n\n    results.messages.assertEqual(\n      onError(201, error)\n    );\n  });\n\n  test('timestamp never', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Rx.Observable.never().timestamp(scheduler);\n    });\n\n    results.messages.assertEqual();\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/toarray.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('toArray');\n\n  var TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe;\n\n  test('toArray completed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(220, 2),\n      onNext(330, 3),\n      onNext(440, 4),\n      onNext(550, 5),\n      onCompleted(660)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.toArray();\n    });\n\n    results.messages.assertEqual(\n      onNext(660, [2,3,4,5]),\n      onCompleted(660)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 660)\n    );\n  });\n\n  test('toArray error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(220, 2),\n      onNext(330, 3),\n      onNext(440, 4),\n      onNext(550, 5),\n      onError(660, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.toArray();\n    });\n\n    results.messages.assertEqual(\n      onError(660, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 660)\n    );\n  });\n\n  test('toArray disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(220, 2),\n      onNext(330, 3),\n      onNext(440, 4),\n      onNext(550, 5)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.toArray();\n    });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/toasync.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('toAsync');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('toAsync context', function () {\n    var context = { value: 42 };\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.toAsync(function (x) {\n        return this.value + x;\n      }, context, scheduler)(42);\n    });\n\n    results.messages.assertEqual(\n      onNext(200, 84),\n      onCompleted(200)\n    );\n  });\n\n  test('toAsync 0', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.toAsync(function () {\n        return 0;\n      }, null, scheduler)();\n    });\n\n    results.messages.assertEqual(\n      onNext(200, 0),\n      onCompleted(200)\n    );\n  });\n\n  test('toAsync 1', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.toAsync(function (x) {\n        return x;\n      }, null, scheduler)(1);\n    });\n\n    results.messages.assertEqual(\n      onNext(200, 1),\n      onCompleted(200)\n    );\n  });\n\n  test('toAsync 2', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.toAsync(function (x, y) {\n          return x + y;\n      }, null, scheduler)(1, 2);\n    });\n\n    results.messages.assertEqual(\n      onNext(200, 3),\n      onCompleted(200)\n    );\n  });\n\n  test('toAsync 3', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.toAsync(function (x, y, z) {\n        return x + y + z;\n      }, null, scheduler)(1, 2, 3);\n    });\n\n    results.messages.assertEqual(\n      onNext(200, 6),\n      onCompleted(200)\n    );\n  });\n\n  test('toAsync 4', function () {\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.toAsync(function (a, b, c, d) {\n        return a + b + c + d;\n      }, null, scheduler)(1, 2, 3, 4);\n    });\n\n    results.messages.assertEqual(\n      onNext(200, 10),\n      onCompleted(200)\n    );\n  });\n\n  test('toAsync error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.toAsync(function () {\n        throw error;\n      }, null, scheduler)();\n    });\n\n    results.messages.assertEqual(\n      onError(200, error)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/tomap.js",
    "content": "if (!!window.Map) {\n  (function () {\n\n    'use strict';\n    /* jshint undef: true, unused: true */\n    /* globals QUnit, test, Rx */\n    QUnit.module('toMap');\n\n    var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n    function extractValues(x) {\n      var arr = [];\n      x.forEach(function (value, key) {\n        arr.push(key, value);\n      });\n      return arr;\n    }\n\n    test('toMap completed', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n        onNext(110, 1),\n        onNext(220, 2),\n        onNext(330, 3),\n        onNext(440, 4),\n        onNext(550, 5),\n        onCompleted(660)\n      );\n\n      var res = scheduler.startScheduler(function () {\n        return xs.toMap(function (x) { return x * 2; }, function (x) { return x * 4; }).map(extractValues);\n      });\n\n      res.messages.assertEqual(\n        onNext(660, [4, 8, 6, 12, 8, 16, 10, 20]),\n        onCompleted(660)\n      );\n\n      xs.subscriptions.assertEqual(\n        subscribe(200, 660)\n      );\n    });\n\n    test('toMap error', function () {\n      var scheduler = new TestScheduler();\n\n      var error = new Error();\n\n      var xs = scheduler.createHotObservable(\n        onNext(110, 1),\n        onNext(220, 2),\n        onNext(330, 3),\n        onNext(440, 4),\n        onNext(550, 5),\n        onError(660, error)\n      );\n\n      var res = scheduler.startScheduler(function () {\n        return xs.toMap(function (x) { return x * 2; }, function (x) { return x * 4; }).map(extractValues);\n      });\n\n      res.messages.assertEqual(\n        onError(660, error)\n      );\n\n      xs.subscriptions.assertEqual(\n        subscribe(200, 660)\n      );\n    });\n\n    test('toMap key selector throws', function () {\n      var scheduler = new TestScheduler();\n\n      var error = new Error();\n\n      var xs = scheduler.createHotObservable(\n        onNext(110, 1),\n        onNext(220, 2),\n        onNext(330, 3),\n        onNext(440, 4),\n        onNext(550, 5),\n        onCompleted(600)\n      );\n\n      var res = scheduler.startScheduler(function () {\n        return xs.toMap(function (x) { if (x < 4) { return x * 2; } else { throw error; } }, function (x) { return x * 4; }).map(extractValues);\n      });\n\n      res.messages.assertEqual(\n        onError(440, error)\n      );\n\n      xs.subscriptions.assertEqual(\n        subscribe(200, 440)\n      );\n    });\n\n    test('toMap element selector throws', function () {\n      var scheduler = new TestScheduler();\n\n      var error = new Error();\n\n      var xs = scheduler.createHotObservable(\n          onNext(110, 1),\n          onNext(220, 2),\n          onNext(330, 3),\n          onNext(440, 4),\n          onNext(550, 5),\n          onCompleted(600)\n      );\n\n      var res = scheduler.startScheduler(function () {\n        return xs.toMap(function (x) { return x * 2; }, function (x) { if (x < 4) { return x * 4; } else { throw error; } }).map(extractValues);\n      });\n\n      res.messages.assertEqual(\n        onError(440, error)\n      );\n\n      xs.subscriptions.assertEqual(\n        subscribe(200, 440)\n      );\n    });\n\n    test('toMap disposed', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n        onNext(110, 1),\n        onNext(220, 2),\n        onNext(330, 3),\n        onNext(440, 4),\n        onNext(550, 5)\n      );\n\n      var res = scheduler.startScheduler(function () {\n        return xs.toMap(function (x) { return x * 2; }, function (x) { return x * 4; }).map(extractValues);\n      });\n\n      res.messages.assertEqual(\n      );\n\n      xs.subscriptions.assertEqual(\n        subscribe(200, 1000)\n      );\n    });\n\n  }());\n}\n"
  },
  {
    "path": "tests/observable/topromise.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, Rx, asyncTest, start, equal, ok, RSVP */\n  QUnit.module('toPromise');\n\n  var Observable = Rx.Observable;\n\n  asyncTest('promise Success', function () {\n    var source = Observable.just(42);\n\n    var promise = source.toPromise(RSVP.Promise);\n\n    promise.then(\n      function (value) {\n        equal(42, value);\n        start();\n      },\n      function () {\n        ok(false);\n      }\n    );\n  });\n\n  asyncTest('Promise Failure', function () {\n    var error = new Error('woops');\n\n    var source = Rx.Observable['throw'](error);\n\n    var promise = source.toPromise(RSVP.Promise);\n\n    promise.then(\n      function () {\n        ok(false);\n      },\n      function (reason) {\n        equal(error, reason);\n        start();\n      }\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/toset.js",
    "content": "if (!!window.Set) {\n  (function () {\n    'use strict';\n    /* jshint undef: true, unused: true */\n    /* globals QUnit, test, Rx */\n\n    QUnit.module('toSet');\n\n    var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n    function extractValues(x) {\n      var arr = [];\n      x.forEach(function (item) {\n        arr.push(item);\n      });\n      return arr;\n    }\n\n    test('toSet completed', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n        onNext(110, 1),\n        onNext(220, 2),\n        onNext(330, 3),\n        onNext(440, 4),\n        onNext(550, 5),\n        onCompleted(660)\n      );\n\n      var results = scheduler.startScheduler(function () {\n        return xs.toSet().map(extractValues);\n      });\n\n      results.messages.assertEqual(\n        onNext(660, [2,3,4,5]),\n        onCompleted(660)\n      );\n\n      xs.subscriptions.assertEqual(\n        subscribe(200, 660)\n      );\n    });\n\n    test('toSet error', function () {\n      var error = new Error();\n\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n        onNext(110, 1),\n        onNext(220, 2),\n        onNext(330, 3),\n        onNext(440, 4),\n        onNext(550, 5),\n        onError(660, error)\n      );\n\n      var results = scheduler.startScheduler(function () {\n        return xs.toSet().map(extractValues);\n      });\n\n      results.messages.assertEqual(\n        onError(660, error)\n      );\n\n      xs.subscriptions.assertEqual(\n        subscribe(200, 660)\n      );\n    });\n\n    test('toSet disposed', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n        onNext(110, 1),\n        onNext(220, 2),\n        onNext(330, 3),\n        onNext(440, 4),\n        onNext(550, 5)\n      );\n\n      var results = scheduler.startScheduler(function () {\n        return xs.toSet().map(extractValues);\n      });\n\n      results.messages.assertEqual();\n\n      xs.subscriptions.assertEqual(\n        subscribe(200, 1000)\n      );\n    });\n  }());\n}\n"
  },
  {
    "path": "tests/observable/transduce.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, transducers, raises, equal */\n  QUnit.module('transduce');\n\n  var TestScheduler = Rx.TestScheduler,\n    Observable = Rx.Observable,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe,\n    t = transducers;\n\n  function even (x) { return x % 2 === 0; }\n  function mul10(x) { return x * 10; }\n  function noop () { }\n  function throwError () { throw new Error(); }\n\n  test('transduce raises', function () {\n\n    raises(function () {\n      Observable['throw'](new Error())\n        .transduce(t.comp(t.filter(even), t.map(mul10)))\n        .subscribe(noop, throwError);\n    });\n\n    raises(function () {\n      Observable.empty()\n        .transduce(t.comp(t.filter(even), t.map(mul10)))\n        .subscribe(noop, noop, throwError);\n    });\n\n    raises(function () {\n      Observable.create(throwError)\n        .transduce(t.comp(t.filter(even), t.map(mul10)))\n        .subscribe();\n    });\n\n  });\n\n  test('transduce never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.transduce(t.comp(t.filter(even), t.map(mul10)));\n    });\n\n    results.messages.assertEqual();\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n  test('transduce empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(250)\n    );\n\n    var i = 0;\n    var evenFilter = function (x) {\n      i++; return x % 2 === 0;\n    };\n\n    var results = scheduler.startScheduler(function () {\n      return xs.transduce(t.comp(t.filter(evenFilter), t.map(mul10)));\n    });\n\n    results.messages.assertEqual(\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n\n    equal(i, 0);\n  });\n\n  test('transduce some', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var i = 0;\n    var evenFilter = function (x) {\n      i++; return x % 2 === 0;\n    };\n\n    var results = scheduler.startScheduler(function () {\n      return xs.transduce(t.comp(t.filter(evenFilter), t.map(mul10)));\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 20),\n      onNext(230, 40),\n      onCompleted(250)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n\n    equal(4, i);\n  });\n\n  test('transduce ifinite', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5)\n    );\n\n    var i = 0;\n    var evenFilter = function (x) {\n      i++; return x % 2 === 0;\n    };\n\n    var results = scheduler.startScheduler(function () {\n      return xs.transduce(t.comp(t.filter(evenFilter), t.map(mul10)));\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 20),\n      onNext(230, 40)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n\n    equal(4, i);\n  });\n\n  test('transduce error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.transduce(t.comp(t.filter(even), t.map(mul10)));\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 210)\n    );\n  });\n\n  test('transduce throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5),\n      onCompleted(250)\n    );\n\n    var i = 0;\n    var evenFilter = function (x) {\n      if (i++ > 2) { throw error; } else { return x % 2 === 0; }\n    };\n\n    var results = scheduler.startScheduler(function () {\n      return xs.transduce(t.comp(t.filter(evenFilter), t.map(mul10)));\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 20),\n      onNext(230, 40),\n      onError(240, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 240)\n    );\n  });\n}());\n"
  },
  {
    "path": "tests/observable/using.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal */\n  QUnit.module('using');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('using null', function () {\n    var xs, _d, disposable;\n\n    var scheduler = new TestScheduler();\n\n    var disposeInvoked = 0;\n    var createInvoked = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.using(function () {\n        disposeInvoked++;\n        disposable = null;\n        return disposable;\n      }, function (d) {\n        _d = d;\n        createInvoked++;\n\n        xs = scheduler.createColdObservable(\n          onNext(100, scheduler.clock),\n          onCompleted(200));\n\n        return xs;\n      });\n    });\n\n    equal(disposable, _d);\n\n    results.messages.assertEqual(\n      onNext(300, 200),\n      onCompleted(400));\n\n    equal(1, createInvoked);\n    equal(1, disposeInvoked);\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400));\n\n    equal(disposable, null);\n  });\n\n  test('using complete', function () {\n    var disposable, xs, _d;\n\n    var scheduler = new TestScheduler();\n\n    var disposeInvoked = 0;\n    var createInvoked = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.using(function () {\n        disposeInvoked++;\n        disposable = new Rx.MockDisposable(scheduler);\n        return disposable;\n      }, function (d) {\n        _d = d;\n        createInvoked++;\n        xs = scheduler.createColdObservable(onNext(100, scheduler.clock), onCompleted(200));\n        return xs;\n      });\n    });\n\n    equal(disposable, _d);\n\n    results.messages.assertEqual(\n      onNext(300, 200),\n      onCompleted(400));\n\n    equal(1, createInvoked);\n    equal(1, disposeInvoked);\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400));\n\n    disposable.disposes.assertEqual(200, 400);\n  });\n\n  test('using error', function () {\n    var disposable, xs, _d;\n\n    var scheduler = new TestScheduler();\n\n    var disposeInvoked = 0;\n    var createInvoked = 0;\n\n    var error = new Error();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.using(function () {\n        disposeInvoked++;\n        disposable = new Rx.MockDisposable(scheduler);\n        return disposable;\n      }, function (d) {\n        _d = d;\n        createInvoked++;\n        xs = scheduler.createColdObservable(\n          onNext(100, scheduler.clock),\n          onError(200, error));\n\n        return xs;\n      });\n    });\n\n    equal(disposable, _d);\n\n    results.messages.assertEqual(\n      onNext(300, 200),\n      onError(400, error));\n\n    equal(1, createInvoked);\n    equal(1, disposeInvoked);\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400));\n\n    disposable.disposes.assertEqual(200, 400);\n  });\n\n  test('using Dispose', function () {\n    var disposable, xs, _d;\n\n    var scheduler = new TestScheduler();\n\n    var disposeInvoked = 0;\n    var createInvoked = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.using(function () {\n        disposeInvoked++;\n        disposable = new Rx.MockDisposable(scheduler);\n        return disposable;\n      }, function (d) {\n        _d = d;\n        createInvoked++;\n        xs = scheduler.createColdObservable(\n          onNext(100, scheduler.clock),\n          onNext(1000, scheduler.clock + 1));\n\n        return xs;\n      });\n    });\n\n    equal(disposable, _d);\n\n    results.messages.assertEqual(\n      onNext(300, 200));\n\n    equal(1, createInvoked);\n    equal(1, disposeInvoked);\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000));\n\n    disposable.disposes.assertEqual(200, 1000);\n  });\n\n  test('using throw resource selector', function () {\n    var scheduler = new TestScheduler();\n\n    var disposeInvoked = 0;\n    var createInvoked = 0;\n\n    var error = new Error();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.using(function () {\n        disposeInvoked++;\n        throw error;\n      }, function () {\n        createInvoked++;\n        return Observable.never();\n      });\n    });\n\n    results.messages.assertEqual(\n      onError(200, error));\n\n    equal(0, createInvoked);\n    equal(1, disposeInvoked);\n  });\n\n  test('using throw resource usage', function () {\n    var disposable;\n\n    var scheduler = new TestScheduler();\n\n    var disposeInvoked = 0;\n    var createInvoked = 0;\n\n    var error = new Error();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.using(function () {\n        disposeInvoked++;\n        disposable = new Rx.MockDisposable(scheduler);\n        return disposable;\n      }, function () {\n        createInvoked++;\n        throw error;\n      });\n    });\n\n    results.messages.assertEqual(\n      onError(200, error));\n\n    equal(1, createInvoked);\n    equal(1, disposeInvoked);\n\n    disposable.disposes.assertEqual(200, 200);\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/when.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('when');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  function throwError(error) { return function () { throw error; }; }\n  function multiply (x, y) { return x * y; }\n  function subtract (x, y) { return x - y; }\n  function add () {\n    var sum = 0;\n    for (var i = 0, len = arguments.length; i < len; i++) {\n      sum += arguments[i];\n    }\n    return sum;\n  }\n\n  test('then 1', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onCompleted(220)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(xs.thenDo(function (a) {\n        return a;\n      }));\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 1),\n      onCompleted(220)\n    );\n  });\n\n  test('then 1 error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n        onError(210, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(xs.thenDo(function (a) {\n        return a;\n      }));\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('then 1 throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onCompleted(220)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(xs.thenDo(throwError(error)));\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('and 2', function () {\n    var N = 2;\n\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var i = 0; i < N; i++) {\n      obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).thenDo(add));\n    });\n\n    results.messages.assertEqual(\n      onNext(210, N),\n      onCompleted(220)\n    );\n  });\n\n  test('and 2 error', function () {\n    var error = new Error();\n\n    var N = 2;\n\n    for (var i = 0; i < N; i++) {\n      var scheduler = new TestScheduler();\n\n      var obs = [];\n      for (var j = 0; j < N; j++) {\n        if (j === i) {\n          obs.push(scheduler.createHotObservable(onError(210, error)));\n        } else {\n          obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n        }\n      }\n\n      var results = scheduler.startScheduler(function () {\n        return Observable.when(obs[0].and(obs[1]).thenDo(add));\n      });\n\n      results.messages.assertEqual(\n        onError(210, error)\n      );\n    }\n  });\n\n  test('then 2 throws', function () {\n    var error = new Error();\n\n    var N = 2;\n\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var i = 0; i < N; i++) {\n      obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).thenDo(throwError(error)));\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('and 3', function () {\n    var N = 3;\n\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var i = 0; i < N; i++) {\n      obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n    }\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).thenDo(add));\n    });\n\n    results.messages.assertEqual(\n      onNext(210, N),\n      onCompleted(220)\n    );\n  });\n\n  test('and 3 error', function () {\n    var error = new Error();\n\n    var N = 3;\n\n    for (var i = 0; i < N; i++) {\n      var scheduler = new TestScheduler();\n\n      var obs = [];\n      for (var j = 0; j < N; j++) {\n        if (j === i) {\n          obs.push(scheduler.createHotObservable(onError(210, error)));\n        } else {\n          obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n        }\n      }\n\n      var results = scheduler.startScheduler(function () {\n        return Observable.when(obs[0].and(obs[1]).and(obs[2]).thenDo(add));\n      });\n\n      results.messages.assertEqual(\n        onError(210, error)\n      );\n    }\n  });\n\n  test('then 3 throws', function () {\n    var error = new Error();\n\n    var N = 3;\n\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var i = 0; i < N; i++) {\n      obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).thenDo(throwError(error)));\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('and 4', function () {\n    var N = 4;\n    var scheduler = new TestScheduler();\n    var obs = [];\n    for (var i = 0; i < N; i++) {\n      obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).thenDo(add));\n    });\n\n    results.messages.assertEqual(\n      onNext(210, N),\n      onCompleted(220)\n    );\n  });\n\n  test('and 4 error', function () {\n    var error = new Error();\n\n    var N = 4;\n\n    for (var i = 0; i < N; i++) {\n      var scheduler = new TestScheduler();\n\n      var obs = [];\n      for (var j = 0; j < N; j++) {\n        if (j === i) {\n          obs.push(scheduler.createHotObservable(onError(210, error)));\n        } else {\n          obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n        }\n      }\n\n      var results = scheduler.startScheduler(function () {\n        return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).thenDo(add));\n      });\n\n      results.messages.assertEqual(\n        onError(210, error)\n      );\n    }\n  });\n\n  test('then 4 throws', function () {\n    var error = new Error();\n\n    var N = 4;\n\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var i = 0; i < N; i++) {\n      obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).thenDo(throwError(error)));\n    });\n\n    results.messages.assertEqual(onError(210, error));\n  });\n\n  test('and 5', function () {\n    var N = 5;\n\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var i = 0; i < N; i++) {\n      obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).thenDo(add));\n    });\n\n    results.messages.assertEqual(\n      onNext(210, N),\n      onCompleted(220)\n    );\n  });\n\n  test('and 5 error', function () {\n    var error = new Error();\n    var N = 5;\n    for (var i = 0; i < N; i++) {\n      var scheduler = new TestScheduler();\n      var obs = [];\n      for (var j = 0; j < N; j++) {\n        if (j === i) {\n          obs.push(scheduler.createHotObservable(onError(210, error)));\n        } else {\n          obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n        }\n      }\n\n      var results = scheduler.startScheduler(function () {\n        return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).thenDo(add));\n      });\n\n      results.messages.assertEqual(\n        onError(210, error)\n      );\n    }\n  });\n\n  test('then 5 throws', function () {\n    var error = new Error();\n\n    var N = 5;\n\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var i = 0; i < N; i++) {\n      obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).thenDo(throwError(error)));\n    });\n\n    results.messages.assertEqual(onError(210, error));\n  });\n\n  test('and 6', function () {\n    var N = 6;\n\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var i = 0; i < N; i++) {\n      obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).thenDo(add));\n    });\n\n    results.messages.assertEqual(\n      onNext(210, N),\n      onCompleted(220)\n    );\n  });\n\n  test('and 6 error', function () {\n    var error = new Error();\n\n    var N = 6;\n\n    for (var i = 0; i < N; i++) {\n      var scheduler = new TestScheduler();\n\n      var obs = [];\n      for (var j = 0; j < N; j++) {\n        if (j === i) {\n          obs.push(scheduler.createHotObservable(onError(210, error)));\n        } else {\n          obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n        }\n      }\n\n      var results = scheduler.startScheduler(function () {\n        return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).thenDo(add));\n      });\n\n      results.messages.assertEqual(\n        onError(210, error)\n      );\n    }\n  });\n\n  test('then 6 throws', function () {\n    var error = new Error();\n\n    var N = 6;\n\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var i = 0; i < N; i++) {\n      obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).thenDo(throwError(error)));\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('and 7', function () {\n    var N = 7;\n\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var i = 0; i < N; i++) {\n      obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).and(obs[6]).thenDo(add));\n    });\n\n    results.messages.assertEqual(\n      onNext(210, N),\n      onCompleted(220)\n    );\n  });\n\n  test('and 7 error', function () {\n    var error = new Error();\n\n    var N = 7;\n\n    for (var i = 0; i < N; i++) {\n      var scheduler = new TestScheduler();\n\n      var obs = [];\n      for (var j = 0; j < N; j++) {\n        if (j === i) {\n          obs.push(scheduler.createHotObservable(onError(210, error)));\n        } else {\n          obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n        }\n      }\n\n      var results = scheduler.startScheduler(function () {\n        return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).and(obs[6]).thenDo(add));\n      });\n\n      results.messages.assertEqual(\n        onError(210, error)\n      );\n    }\n  });\n\n  test('then 7 throws', function () {\n    var error = new Error();\n\n    var N = 7;\n\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var i = 0; i < N; i++) {\n      obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).and(obs[6]).thenDo(throwError(error)));\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('and 8', function () {\n    var N = 8;\n\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var i = 0; i < N; i++) {\n      obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).and(obs[6]).and(obs[7]).thenDo(add));\n    });\n\n    results.messages.assertEqual(\n      onNext(210, N),\n      onCompleted(220)\n    );\n  });\n\n  test('and 8 error', function () {\n    var error = new Error();\n\n    var N = 8;\n\n    for (var i = 0; i < N; i++) {\n      var scheduler = new TestScheduler();\n\n      var obs = [];\n      for (var j = 0; j < N; j++) {\n        if (j === i) {\n          obs.push(scheduler.createHotObservable(onError(210, error)));\n        } else {\n          obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n        }\n      }\n\n      var results = scheduler.startScheduler(function () {\n        return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).and(obs[6]).and(obs[7]).thenDo(add));\n      });\n\n      results.messages.assertEqual(\n        onError(210, error)\n      );\n    }\n  });\n\n  test('then 8 throws', function () {\n    var error = new Error();\n\n    var N = 8;\n\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var i = 0; i < N; i++) {\n      obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).and(obs[6]).and(obs[7]).thenDo(throwError(error)));\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('and 9', function () {\n    var N = 9;\n\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var i = 0; i < N; i++) {\n      obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).and(obs[6]).and(obs[7]).and(obs[8]).thenDo(add));\n    });\n\n    results.messages.assertEqual(\n      onNext(210, N),\n      onCompleted(220)\n    );\n  });\n\n  test('and 9 error', function () {\n    var error = new Error();\n\n    var N = 9;\n\n    for (var i = 0; i < N; i++) {\n      var scheduler = new TestScheduler();\n\n      var obs = [];\n      for (var j = 0; j < N; j++) {\n        if (j === i) {\n          obs.push(scheduler.createHotObservable(onError(210, error)));\n        } else {\n          obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n        }\n      }\n\n      var results = scheduler.startScheduler(function () {\n        return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).and(obs[6]).and(obs[7]).and(obs[8]).thenDo(add));\n      });\n\n      results.messages.assertEqual(\n        onError(210, error)\n      );\n    }\n  });\n\n  test('then 9 throws', function () {\n    var error = new Error();\n\n    var N = 9;\n\n    var scheduler = new TestScheduler();\n\n    var obs = [];\n    for (var i = 0; i < N; i++) {\n      obs.push(scheduler.createHotObservable(onNext(210, 1), onCompleted(220)));\n    }\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(obs[0].and(obs[1]).and(obs[2]).and(obs[3]).and(obs[4]).and(obs[5]).and(obs[6]).and(obs[7]).and(obs[8]).thenDo(throwError(error)));\n    });\n\n    results.messages.assertEqual(\n      onError(210, error)\n    );\n  });\n\n  test('when multiple data symmetric', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onCompleted(240)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(240, 4),\n      onNext(250, 5),\n      onNext(260, 6),\n      onCompleted(270)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(xs.and(ys).thenDo(add));\n    });\n\n    results.messages.assertEqual(\n      onNext(240, 1 + 4),\n      onNext(250, 2 + 5),\n      onNext(260, 3 + 6),\n      onCompleted(270)\n    );\n  });\n\n  test('when multiple data asymmetric', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onCompleted(240)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(240, 4),\n      onNext(250, 5),\n      onCompleted(270)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(xs.and(ys).thenDo(add));\n    });\n\n    results.messages.assertEqual(\n      onNext(240, 1 + 4),\n      onNext(250, 2 + 5),\n      onCompleted(270)\n    );\n  });\n\n  test('when empty empty', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onCompleted(240)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onCompleted(270)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(xs.and(ys).thenDo(add));\n    });\n\n    results.messages.assertEqual(\n      onCompleted(270)\n    );\n  });\n\n  test('when never never', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = Observable.never();\n\n    var ys = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(xs.and(ys).thenDo(add));\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('when throw non-empty', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onError(240, error)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onCompleted(270)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(xs.and(ys).thenDo(add));\n    });\n\n    results.messages.assertEqual(\n      onError(240, error)\n    );\n  });\n\n  test('complicated when', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(210, 1),\n      onNext(220, 2),\n      onNext(230, 3),\n      onCompleted(240)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(240, 4),\n      onNext(250, 5),\n      onNext(260, 6),\n      onCompleted(270)\n    );\n\n    var zs = scheduler.createHotObservable(\n      onNext(220, 7),\n      onNext(230, 8),\n      onNext(240, 9),\n      onCompleted(300)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return Observable.when(\n        xs.and(ys).thenDo(add),\n        xs.and(zs).thenDo(multiply),\n        ys.and(zs).thenDo(subtract)\n      );\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 1 * 7),\n      onNext(230, 2 * 8),\n      onNext(240, 3 + 4),\n      onNext(250, 5 - 9),\n      onCompleted(300)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/where.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal */\n  QUnit.module('filter');\n\n  var TestScheduler = Rx.TestScheduler,\n    SerialDisposable = Rx.SerialDisposable,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted,\n    subscribe = Rx.ReactiveTest.subscribe,\n    created = Rx.ReactiveTest.created,\n    subscribed = Rx.ReactiveTest.subscribed,\n    disposed = Rx.ReactiveTest.disposed;\n\n  function isPrime(i) {\n    if (i <= 1) { return false; }\n    var max = Math.floor(Math.sqrt(i));\n    for (var j = 2; j <= max; ++j) {\n      if (i % j === 0) { return false; }\n    }\n    return true;\n  }\n\n  test('filter complete', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(180, 2),\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onCompleted(600),\n      onNext(610, 12),\n      onError(620, new Error()),\n      onCompleted(630));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.filter(function (x) {\n        invoked++;\n        return isPrime(x);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(230, 3),\n      onNext(340, 5),\n      onNext(390, 7),\n      onNext(580, 11),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n\n    equal(9, invoked);\n  });\n\n  test('filter True', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(180, 2),\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.filter(function () {\n        invoked++;\n        return true;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n\n    equal(9, invoked);\n  });\n\n  test('filter False', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(180, 2),\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.filter(function (x) {\n        invoked++;\n        return false;\n      });\n    });\n\n    results.messages.assertEqual(\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n\n    equal(9, invoked);\n  });\n\n  test('filter dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(180, 2),\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.filter(function (x) {\n        invoked++;\n        return isPrime(x);\n      });\n    }, { disposed: 400 });\n\n    results.messages.assertEqual(\n      onNext(230, 3),\n      onNext(340, 5),\n      onNext(390, 7)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n\n    equal(5, invoked);\n  });\n\n  test('filter error', function () {\n    var scheduler = new TestScheduler();\n    var invoked = 0;\n\n    var error = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(180, 2),\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onError(600, error),\n      onNext(610, 12),\n      onError(620, new Error()),\n      onCompleted(630)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.filter(function (x) {\n        invoked++;\n        return isPrime(x);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(230, 3),\n      onNext(340, 5),\n      onNext(390, 7),\n      onNext(580, 11),\n      onError(600, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n\n    equal(9, invoked);\n  });\n\n  test('filter Throw', function () {\n    var scheduler = new TestScheduler();\n    var invoked = 0;\n\n    var error = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(180, 2),\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onCompleted(600),\n      onNext(610, 12),\n      onError(620, new Error()),\n      onCompleted(630)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.filter(function (x) {\n        invoked++;\n        if (x > 5) {\n          throw error;\n        }\n        return isPrime(x);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(230, 3),\n      onNext(340, 5),\n      onError(380, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 380)\n    );\n\n    equal(4, invoked);\n  });\n\n  test('filter DisposeInPredicate', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(180, 2),\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onCompleted(600),\n      onNext(610, 12),\n      onError(620, new Error()),\n      onCompleted(630)\n    );\n\n    var results = scheduler.createObserver();\n\n    var d = new SerialDisposable();\n\n    var ys;\n    scheduler.scheduleAbsolute(null, created, function () {\n      return ys = xs.filter(function (x) {\n        invoked++;\n        if (x === 8) {\n          d.dispose();\n        }\n        return isPrime(x);\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      d.setDisposable(ys.subscribe(results));\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      d.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(230, 3),\n      onNext(340, 5),\n      onNext(390, 7)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450)\n    );\n\n    equal(6, invoked);\n  });\n\n  test('filter with index complete', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(180, 2),\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onCompleted(600),\n      onNext(610, 12),\n      onError(620, new Error()),\n      onCompleted(630)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.filter(function (x, index) {\n        invoked++;\n        return isPrime(x + index * 10);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(230, 3),\n      onNext(390, 7),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n\n    equal(9, invoked);\n  });\n\n  test('filter with index True', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(180, 2),\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.filter(function (x, index) {\n        invoked++;\n        return true;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n\n    equal(9, invoked);\n  });\n\n  test('filter with index False', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(180, 2),\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.filter(function (x, index) {\n        invoked++;\n        return false;\n      });\n    });\n\n    results.messages.assertEqual(\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n\n    equal(9, invoked);\n  });\n\n  test('filter with index dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(180, 2),\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onCompleted(600)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.filter(function (x, index) {\n        invoked++;\n        return isPrime(x + index * 10);\n      });\n    }, { disposed: 400 });\n\n    results.messages.assertEqual(\n      onNext(230, 3),\n      onNext(390, 7)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n\n    equal(5, invoked);\n  });\n\n  test('filter with index error', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked = 0;\n\n    var error = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(180, 2),\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onError(600, error),\n      onNext(610, 12),\n      onError(620, new Error()),\n      onCompleted(630)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.filter(function (x, index) {\n        invoked++;\n        return isPrime(x + index * 10);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(230, 3),\n      onNext(390, 7),\n      onError(600, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n\n    equal(9, invoked);\n  });\n\n  test('filter with index Throw', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked = 0;\n\n    var error = new Error();\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(180, 2),\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onCompleted(600),\n      onNext(610, 12),\n      onError(620, new Error()),\n      onCompleted(630)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs.filter(function (x, index) {\n        invoked++;\n        if (x > 5) {\n          throw error;\n        }\n        return isPrime(x + index * 10);\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(230, 3),\n      onError(380, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 380)\n    );\n\n    equal(4, invoked);\n  });\n\n  test('filter with index dispose in predicate', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(180, 2),\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onCompleted(600),\n      onNext(610, 12),\n      onError(620, new Error()),\n      onCompleted(630)\n    );\n\n    var results = scheduler.createObserver();\n\n    var d = new SerialDisposable();\n\n    var ys;\n    scheduler.scheduleAbsolute(null, created, function () {\n      ys = xs.filter(function (x, index) {\n        invoked++;\n        if (x === 8) {\n          d.dispose();\n        }\n        return isPrime(x + index * 10);\n      });\n    });\n\n    scheduler.scheduleAbsolute(null, subscribed, function () {\n      d.setDisposable(ys.subscribe(results));\n    });\n\n    scheduler.scheduleAbsolute(null, disposed, function () {\n      d.dispose();\n    });\n\n    scheduler.start();\n\n    results.messages.assertEqual(\n      onNext(230, 3),\n      onNext(390, 7)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450)\n    );\n\n    equal(6, invoked);\n  });\n\n  test('filter multiple subscribers', function () {\n    var s = new TestScheduler();\n\n    var xs = s.createHotObservable(onCompleted(100)).filter(function () { return true; });\n\n    var o1 = s.createObserver();\n    var o2 = s.createObserver();\n\n    xs.subscribe(o1);\n    xs.subscribe(o2);\n\n    s.start();\n\n    equal(o1.messages.length, 1);\n    equal(o2.messages.length, 1);\n  });\n\n  test('Filter and Filter Optimization', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked1 = 0;\n    var invoked2 = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(180, 2),\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onCompleted(600),\n      onNext(610, 12),\n      onError(620, new Error()),\n      onCompleted(630)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs\n        .filter(function(x) { invoked1++; return x % 2 === 0; })\n        .filter(function(x) { invoked2++; return x % 3 === 0; });\n    });\n\n    results.messages.assertEqual(\n      onNext(380, 6),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n\n    equal(9, invoked1);\n    equal(4, invoked2);\n  });\n\n  test('Filter and Filter ThisArg', function() {\n    var scheduler = new TestScheduler();\n\n    function Filterer() {\n      this.filter1 = function(item) { return item % 2 === 0; };\n      this.filter2 = function(item) { return item % 3 === 0; };\n    }\n\n    var filterer = new Filterer();\n\n    var xs = scheduler.createColdObservable(\n        onNext(10, 1),\n        onNext(20, 2),\n        onNext(30, 3),\n        onNext(40, 4),\n        onNext(50, 5),\n        onNext(60, 6),\n        onNext(70, 7),\n        onNext(80, 8),\n        onNext(90, 9),\n        onCompleted(100)\n    );\n\n    var results = scheduler.startScheduler(function() {\n      return xs\n        .filter(function(x){ return this.filter1(x);}, filterer)\n        .filter(function(x){ return this.filter2(x);}, filterer)\n        .filter(function(x){ return this.filter1(x);}, filterer);\n    });\n\n    results.messages.assertEqual(onNext(260, 6), onCompleted(300));\n\n  });\n\n  test('filter and map optimization', function () {\n    var scheduler = new TestScheduler();\n\n    var invoked1 = 0;\n    var invoked2 = 0;\n\n    var xs = scheduler.createHotObservable(\n      onNext(110, 1),\n      onNext(180, 2),\n      onNext(230, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(380, 6),\n      onNext(390, 7),\n      onNext(450, 8),\n      onNext(470, 9),\n      onNext(560, 10),\n      onNext(580, 11),\n      onCompleted(600),\n      onNext(610, 12),\n      onError(620, new Error()),\n      onCompleted(630)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return xs\n      .filter(function(x) { invoked1++; return x % 2 === 0; })\n      .map(function(x) { invoked2++; return x * x; });\n    });\n\n    results.messages.assertEqual(\n      onNext(270, 16),\n      onNext(380, 36),\n      onNext(450, 64),\n      onNext(560, 100),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n\n    equal(9, invoked1);\n    equal(4, invoked2);\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/while.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('while');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('while always false', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(50, 1),\n      onNext(100, 2),\n      onNext(150, 3),\n      onNext(200, 4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['while'](function () {\n        return false;\n      }, xs);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(200)\n    );\n\n    xs.subscriptions.assertEqual();\n  });\n\n  test('while always true', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(50, 1),\n      onNext(100, 2),\n      onNext(150, 3),\n      onNext(200, 4),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['while'](function () {\n        return true;\n      }, xs);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 1),\n      onNext(300, 2),\n      onNext(350, 3),\n      onNext(400, 4),\n      onNext(500, 1),\n      onNext(550, 2),\n      onNext(600, 3),\n      onNext(650, 4),\n      onNext(750, 1),\n      onNext(800, 2),\n      onNext(850, 3),\n      onNext(900, 4)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450),\n      subscribe(450, 700),\n      subscribe(700, 950),\n      subscribe(950, 1000)\n    );\n  });\n\n  test('while always true throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onError(50, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['while'](function () {\n        return true;\n      }, xs);\n    });\n\n    results.messages.assertEqual(\n      onError(250, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 250)\n    );\n  });\n\n  test('while always true infinite', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(onNext(50, 1));\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['while'](function () {\n        return true;\n      }, xs);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 1)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n  test('while sometimes true', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(50, 1),\n      onNext(100, 2),\n      onNext(150, 3),\n      onNext(200, 4),\n      onCompleted(250)\n    );\n\n    var n = 0;\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['while'](function () {\n        return ++n < 3;\n      }, xs);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 1),\n      onNext(300, 2),\n      onNext(350, 3),\n      onNext(400, 4),\n      onNext(500, 1),\n      onNext(550, 2),\n      onNext(600, 3),\n      onNext(650, 4),\n      onCompleted(700)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450),\n      subscribe(450, 700)\n    );\n  });\n\n  test('while sometimes throws', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createColdObservable(\n      onNext(50, 1),\n      onNext(100, 2),\n      onNext(150, 3),\n      onNext(200, 4),\n      onCompleted(250)\n    );\n\n    var n = 0;\n\n    var error = new Error();\n\n    var results = scheduler.startScheduler(function () {\n      return Observable['while'](function () {\n        if (++n < 3) { return true; }\n        throw error;\n      }, xs);\n    });\n\n    results.messages.assertEqual(\n      onNext(250, 1),\n      onNext(300, 2),\n      onNext(350, 3),\n      onNext(400, 4),\n      onNext(500, 1),\n      onNext(550, 2),\n      onNext(600, 3),\n      onNext(650, 4),\n      onError(700, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 450),\n      subscribe(450, 700)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/window.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('window');\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('window closings basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(180, 2),\n      onNext(250, 3),\n      onNext(260, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(410, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onNext(550, 10),\n      onCompleted(590)\n    );\n\n    var window = 1;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.window(function () {\n        return Observable.timer(window++ * 100, null, scheduler);\n      }).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(250, '0 3'),\n      onNext(260, '0 4'),\n      onNext(310, '1 5'),\n      onNext(340, '1 6'),\n      onNext(410, '1 7'),\n      onNext(420, '1 8'),\n      onNext(470, '1 9'),\n      onNext(550, '2 10'),\n      onCompleted(590)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 590));\n  });\n\n  test('window closings Dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(180, 2),\n      onNext(250, 3),\n      onNext(260, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(410, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onNext(550, 10),\n      onCompleted(590));\n\n    var window = 1;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.window(function () {\n        return Observable.timer(window++ * 100, null, scheduler);\n      }).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    }, { disposed: 400 });\n\n    results.messages.assertEqual(\n      onNext(250, '0 3'),\n      onNext(260, '0 4'),\n      onNext(310, '1 5'),\n      onNext(340, '1 6')\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400));\n  });\n\n  test('window closings Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(180, 2),\n      onNext(250, 3),\n      onNext(260, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(410, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onNext(550, 10),\n      onError(590, error));\n\n    var window = 1;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.window(function () {\n        return Observable.timer(window++ * 100, null, scheduler);\n      }).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(250, '0 3'),\n      onNext(260, '0 4'),\n      onNext(310, '1 5'),\n      onNext(340, '1 6'),\n      onNext(410, '1 7'),\n      onNext(420, '1 8'),\n      onNext(470, '1 9'),\n      onNext(550, '2 10'),\n      onError(590, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 590));\n  });\n\n  test('window closings Throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(180, 2),\n      onNext(250, 3),\n      onNext(260, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(410, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onNext(550, 10),\n      onCompleted(590));\n\n    var window = 1;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.window(function () { throw error; })\n        .map(function (w, i) { return w.map(function (x) { return i + ' ' + x; }); })\n        .mergeAll();\n    });\n    results.messages.assertEqual(\n      onError(200, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 200));\n  });\n\n  test('window closings WindowClose_Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(180, 2),\n      onNext(250, 3),\n      onNext(260, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(410, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onNext(550, 10),\n      onCompleted(590));\n\n    var window = 1;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.window(function () {\n        return Observable['throw'](error, scheduler);\n      }).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual\n    (onError(201, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 201));\n  });\n\n  test('window closings Default', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(180, 2),\n      onNext(250, 3),\n      onNext(260, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(410, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onNext(550, 10),\n      onCompleted(590));\n\n    var window = 1;\n\n    var results = scheduler.startScheduler(function () {\n      return xs.window(function () {\n        return Observable.timer(window++ * 100, null, scheduler);\n      }).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(250, '0 3'),\n      onNext(260, '0 4'),\n      onNext(310, '1 5'),\n      onNext(340, '1 6'),\n      onNext(410, '1 7'),\n      onNext(420, '1 8'),\n      onNext(470, '1 9'),\n      onNext(550, '2 10'),\n      onCompleted(590));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 590));\n  });\n\n  test('Window_OpeningClosings_basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(180, 2),\n      onNext(250, 3),\n      onNext(260, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(410, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onNext(550, 10),\n      onCompleted(590));\n\n    var ys = scheduler.createHotObservable(\n      onNext(255, 50),\n      onNext(330, 100),\n      onNext(350, 50),\n      onNext(400, 90),\n      onCompleted(900));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.window(ys, function (x) {\n        return Observable.timer(x, null, scheduler);\n      }).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(260, '0 4'),\n      onNext(340, '1 6'),\n      onNext(410, '1 7'),\n      onNext(410, '3 7'),\n      onNext(420, '1 8'),\n      onNext(420, '3 8'),\n      onNext(470, '3 9'),\n      onCompleted(900));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 900));\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 900));\n  });\n\n  test('Window_OpeningClosings_Throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(180, 2),\n      onNext(250, 3),\n      onNext(260, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(410, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onNext(550, 10),\n      onCompleted(590));\n\n    var ys = scheduler.createHotObservable(\n      onNext(255, 50),\n      onNext(330, 100),\n      onNext(350, 50),\n      onNext(400, 90),\n      onCompleted(900));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.window(ys, function (x) { throw error; })\n        .map(function (w, i) { return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onError(255, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 255));\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 255));\n  });\n\n  test('Window_OpeningClosings_Dispose', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(180, 2),\n      onNext(250, 3),\n      onNext(260, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(410, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onNext(550, 10),\n      onCompleted(590));\n\n    var ys = scheduler.createHotObservable(\n      onNext(255, 50),\n      onNext(330, 100),\n      onNext(350, 50),\n      onNext(400, 90),\n      onCompleted(900));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.window(ys, function (x) {\n        return Observable.timer(x, null, scheduler);\n      }).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    }, { disposed: 415 });\n\n    results.messages.assertEqual(\n      onNext(260, '0 4'),\n      onNext(340, '1 6'),\n      onNext(410, '1 7'),\n      onNext(410, '3 7'));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 415));\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 415));\n  });\n\n  test('Window_OpeningClosings_Data_Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(180, 2),\n      onNext(250, 3),\n      onNext(260, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(410, 7),\n      onError(415, error));\n\n    var ys = scheduler.createHotObservable(\n      onNext(255, 50),\n      onNext(330, 100),\n      onNext(350, 50),\n      onNext(400, 90),\n      onCompleted(900));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.window(ys, function (x) {\n        return Observable.timer(x, null, scheduler);\n      }).map(function (w, i) {\n          return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(260, '0 4'),\n      onNext(340, '1 6'),\n      onNext(410, '1 7'),\n      onNext(410, '3 7'),\n      onError(415, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 415));\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 415));\n  });\n\n  test('Window_OpeningClosings_Window_Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(180, 2),\n      onNext(250, 3),\n      onNext(260, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(410, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onNext(550, 10),\n      onCompleted(590));\n\n    var ys = scheduler.createHotObservable(\n      onNext(255, 50),\n      onNext(330, 100),\n      onNext(350, 50),\n      onNext(400, 90),\n      onError(415, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.window(ys, function (x) {\n        return Observable.timer(x, null, scheduler);\n      }).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(260, '0 4'),\n      onNext(340, '1 6'),\n      onNext(410, '1 7'),\n      onNext(410, '3 7'),\n      onError(415, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 415));\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 415));\n  });\n\n  test('Window_Boundaries_Simple', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(180, 2),\n      onNext(250, 3),\n      onNext(260, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(410, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onNext(550, 10),\n      onCompleted(590)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(255, true),\n      onNext(330, true),\n      onNext(350, true),\n      onNext(400, true),\n      onNext(500, true),\n      onCompleted(900)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.window(ys).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; })\n      }).mergeAll();\n    });\n\n    res.messages.assertEqual(\n      onNext(250, '0 3'),\n      onNext(260, '1 4'),\n      onNext(310, '1 5'),\n      onNext(340, '2 6'),\n      onNext(410, '4 7'),\n      onNext(420, '4 8'),\n      onNext(470, '4 9'),\n      onNext(550, '5 10'),\n      onCompleted(590)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 590)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 590)\n    );\n  });\n\n  test('Window_Boundaries_onCompletedBoundaries', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(180, 2),\n      onNext(250, 3),\n      onNext(260, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(410, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onNext(550, 10),\n      onCompleted(590)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(255, true),\n      onNext(330, true),\n      onNext(350, true),\n      onCompleted(400)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.window(ys).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    });\n\n    res.messages.assertEqual(\n            onNext(250, '0 3'),\n            onNext(260, '1 4'),\n            onNext(310, '1 5'),\n            onNext(340, '2 6'),\n            onCompleted(400)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n  });\n\n  test('Window_Boundaries_onErrorSource', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(180, 2),\n      onNext(250, 3),\n      onNext(260, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(380, 7),\n      onError(400, error)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(255, true),\n      onNext(330, true),\n      onNext(350, true),\n      onCompleted(500)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.window(ys).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    });\n\n    res.messages.assertEqual(\n      onNext(250, '0 3'),\n      onNext(260, '1 4'),\n      onNext(310, '1 5'),\n      onNext(340, '2 6'),\n      onNext(380, '3 7'),\n      onError(400, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n  });\n\n  test('Window_Boundaries_onErrorBoundaries', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(90, 1),\n      onNext(180, 2),\n      onNext(250, 3),\n      onNext(260, 4),\n      onNext(310, 5),\n      onNext(340, 6),\n      onNext(410, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onNext(550, 10),\n      onCompleted(590)\n    );\n\n    var ys = scheduler.createHotObservable(\n      onNext(255, true),\n      onNext(330, true),\n      onNext(350, true),\n      onError(400, error)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return xs.window(ys).map(function (w, i) {\n        return w.map(function (x) {\n          return i + ' ' + x;\n        })\n      }).mergeAll();\n    });\n\n    res.messages.assertEqual(\n      onNext(250, '0 3'),\n      onNext(260, '1 4'),\n      onNext(310, '1 5'),\n      onNext(340, '2 6'),\n      onError(400, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n\n    ys.subscriptions.assertEqual(\n      subscribe(200, 400)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/windowwithcount.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('windowWithCount');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('windowWithCount basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(100, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(280, 4),\n      onNext(320, 5),\n      onNext(350, 6),\n      onNext(380, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onCompleted(600));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.windowWithCount(3, 2).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(210, '0 2'),\n      onNext(240, '0 3'),\n      onNext(280, '0 4'),\n      onNext(280, '1 4'),\n      onNext(320, '1 5'),\n      onNext(350, '1 6'),\n      onNext(350, '2 6'),\n      onNext(380, '2 7'),\n      onNext(420, '2 8'),\n      onNext(420, '3 8'),\n      onNext(470, '3 9'),\n      onCompleted(600)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n  test('windowWithCount disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(100, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(280, 4),\n      onNext(320, 5),\n      onNext(350, 6),\n      onNext(380, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onCompleted(600));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.windowWithCount(3, 2).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    }, { disposed: 370 });\n\n    results.messages.assertEqual(\n      onNext(210, '0 2'),\n      onNext(240, '0 3'),\n      onNext(280, '0 4'),\n      onNext(280, '1 4'),\n      onNext(320, '1 5'),\n      onNext(350, '1 6'),\n      onNext(350, '2 6')\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 370));\n  });\n\n  test('windowWithCount error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(100, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(280, 4),\n      onNext(320, 5),\n      onNext(350, 6),\n      onNext(380, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onError(600, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.windowWithCount(3, 2).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(210, '0 2'),\n      onNext(240, '0 3'),\n      onNext(280, '0 4'),\n      onNext(280, '1 4'),\n      onNext(320, '1 5'),\n      onNext(350, '1 6'),\n      onNext(350, '2 6'),\n      onNext(380, '2 7'),\n      onNext(420, '2 8'),\n      onNext(420, '3 8'),\n      onNext(470, '3 9'),\n      onError(600, error)\n    );\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/windowwithtime.js",
    "content": "(function() {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('windowWithTime');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('windowWithTime basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(270, 4),\n      onNext(320, 5),\n      onNext(360, 6),\n      onNext(390, 7),\n      onNext(410, 8),\n      onNext(460, 9),\n      onNext(470, 10),\n      onCompleted(490));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.windowWithTime(100, scheduler).map(function (ys, i) {\n        return ys.map(function (y) { return i + ' ' + y; }).concat(Rx.Observable.just(i + ' end'));\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(210, '0 2'),\n      onNext(240, '0 3'),\n      onNext(270, '0 4'),\n      onNext(300, '0 end'),\n      onNext(320, '1 5'),\n      onNext(360, '1 6'),\n      onNext(390, '1 7'),\n      onNext(400, '1 end'),\n      onNext(410, '2 8'),\n      onNext(460, '2 9'),\n      onNext(470, '2 10'),\n      onNext(490, '2 end'),\n      onCompleted(490));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 490));\n  });\n\n  test('windowWithTime basic both', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(270, 4),\n      onNext(320, 5),\n      onNext(360, 6),\n      onNext(390, 7),\n      onNext(410, 8),\n      onNext(460, 9),\n      onNext(470, 10),\n      onCompleted(490));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.windowWithTime(100, 50, scheduler).map(function (ys, i) {\n        return ys.map(function (y) { return i + ' ' + y; }).concat(Rx.Observable.just(i + ' end'));\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(210, '0 2'),\n      onNext(240, '0 3'),\n      onNext(270, '0 4'),\n      onNext(270, '1 4'),\n      onNext(300, '0 end'),\n      onNext(320, '1 5'),\n      onNext(320, '2 5'),\n      onNext(350, '1 end'),\n      onNext(360, '2 6'),\n      onNext(360, '3 6'),\n      onNext(390, '2 7'),\n      onNext(390, '3 7'),\n      onNext(400, '2 end'),\n      onNext(410, '3 8'),\n      onNext(410, '4 8'),\n      onNext(450, '3 end'),\n      onNext(460, '4 9'),\n      onNext(460, '5 9'),\n      onNext(470, '4 10'),\n      onNext(470, '5 10'),\n      onNext(490, '4 end'),\n      onNext(490, '5 end'),\n      onCompleted(490));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 490));\n  });\n\n  test('windowWithTime basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(100, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(280, 4),\n      onNext(320, 5),\n      onNext(350, 6),\n      onNext(380, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onCompleted(600));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.windowWithTime(100, 70, scheduler).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(210, '0 2'),\n      onNext(240, '0 3'),\n      onNext(280, '0 4'),\n      onNext(280, '1 4'),\n      onNext(320, '1 5'),\n      onNext(350, '1 6'),\n      onNext(350, '2 6'),\n      onNext(380, '2 7'),\n      onNext(420, '2 8'),\n      onNext(420, '3 8'),\n      onNext(470, '3 9'),\n      onCompleted(600));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600));\n  });\n\n  test('windowWithTime Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(100, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(280, 4),\n      onNext(320, 5),\n      onNext(350, 6),\n      onNext(380, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onError(600, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.windowWithTime(100, 70, scheduler).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x;   });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(210, '0 2'),\n      onNext(240, '0 3'),\n      onNext(280, '0 4'),\n      onNext(280, '1 4'),\n      onNext(320, '1 5'),\n      onNext(350, '1 6'),\n      onNext(350, '2 6'),\n      onNext(380, '2 7'),\n      onNext(420, '2 8'),\n      onNext(420, '3 8'),\n      onNext(470, '3 9'),\n      onError(600, error));\n\n    xs.subscriptions.assertEqual(subscribe(200, 600));\n  });\n\n  test('windowWithTime disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(100, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(280, 4),\n      onNext(320, 5),\n      onNext(350, 6),\n      onNext(380, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onCompleted(600));\n\n    var results = scheduler.startScheduler(function () {\n        return xs.windowWithTime(100, 70, scheduler).map(function (w, i) {\n          return w.map(function (x) { return i + ' ' + x; });\n        }).mergeAll();\n    }, { disposed: 370 });\n\n    results.messages.assertEqual(\n      onNext(210, '0 2'),\n      onNext(240, '0 3'),\n      onNext(280, '0 4'),\n      onNext(280, '1 4'),\n      onNext(320, '1 5'),\n      onNext(350, '1 6'),\n      onNext(350, '2 6'));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 370));\n  });\n\n  test('windowWithTime basic same', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(100, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(280, 4),\n      onNext(320, 5),\n      onNext(350, 6),\n      onNext(380, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onCompleted(600));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.windowWithTime(100, scheduler).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(210, '0 2'),\n      onNext(240, '0 3'),\n      onNext(280, '0 4'),\n      onNext(320, '1 5'),\n      onNext(350, '1 6'),\n      onNext(380, '1 7'),\n      onNext(420, '2 8'),\n      onNext(470, '2 9'),\n      onCompleted(600));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/windowwithtimeorcount.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('windowWithTimeOrCount');\n\n  var TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('windowWithTimeOrCount basic', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(205, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(280, 4),\n      onNext(320, 5),\n      onNext(350, 6),\n      onNext(370, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onCompleted(600));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.windowWithTimeOrCount(70, 3, scheduler).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(205, '0 1'),\n      onNext(210, '0 2'),\n      onNext(240, '0 3'),\n      onNext(280, '1 4'),\n      onNext(320, '2 5'),\n      onNext(350, '2 6'),\n      onNext(370, '2 7'),\n      onNext(420, '3 8'),\n      onNext(470, '4 9'),\n      onCompleted(600));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600));\n  });\n\n  test('windowWithTimeOrCount Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(205, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(280, 4),\n      onNext(320, 5),\n      onNext(350, 6),\n      onNext(370, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onError(600, error));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.windowWithTimeOrCount(70, 3, scheduler).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    });\n\n    results.messages.assertEqual(\n      onNext(205, '0 1'),\n      onNext(210, '0 2'),\n      onNext(240, '0 3'),\n      onNext(280, '1 4'),\n      onNext(320, '2 5'),\n      onNext(350, '2 6'),\n      onNext(370, '2 7'),\n      onNext(420, '3 8'),\n      onNext(470, '4 9'),\n      onError(600, error));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 600));\n  });\n\n  test('windowWithTimeOrCount disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(205, 1),\n      onNext(210, 2),\n      onNext(240, 3),\n      onNext(280, 4),\n      onNext(320, 5),\n      onNext(350, 6),\n      onNext(370, 7),\n      onNext(420, 8),\n      onNext(470, 9),\n      onCompleted(600));\n\n    var results = scheduler.startScheduler(function () {\n      return xs.windowWithTimeOrCount(70, 3, scheduler).map(function (w, i) {\n        return w.map(function (x) { return i + ' ' + x; });\n      }).mergeAll();\n    }, { disposed: 370 });\n\n    results.messages.assertEqual(\n      onNext(205, '0 1'),\n      onNext(210, '0 2'),\n      onNext(240, '0 3'),\n      onNext(280, '1 4'),\n      onNext(320, '2 5'),\n      onNext(350, '2 6'),\n      onNext(370, '2 7'));\n\n    xs.subscriptions.assertEqual(\n      subscribe(200, 370));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/withlatestfrom.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx */\n  QUnit.module('withLatestFrom');\n\n  var Observable = Rx.Observable,\n    TestScheduler = Rx.TestScheduler,\n    onNext = Rx.ReactiveTest.onNext,\n    onError = Rx.ReactiveTest.onError,\n    onCompleted = Rx.ReactiveTest.onCompleted;\n\n  function add (x, y) { return x + y; }\n\n  test('withLatestFrom never never', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = Observable.never();\n    var e2 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return e1.withLatestFrom(e2, add);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('withLatestFrom never empty', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = Observable.never();\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.withLatestFrom(e2, add);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('withLatestFrom empty never', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = Observable.never();\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e2.withLatestFrom(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(210)\n    );\n  });\n\n  test('withLatestFrom emptyempty', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e2.withLatestFrom(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(210)\n    );\n  });\n\n  test('withLatestFrom empty return', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(220)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.withLatestFrom(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(210)\n    );\n  });\n\n  test('withLatestFrom return empty', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(220)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e2.withLatestFrom(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(220)\n    );\n  });\n\n  test('withLatestFrom never return', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(220)\n    );\n\n    var e2 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return e1.withLatestFrom(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(220)\n    );\n  });\n\n  test('withLatestFrom return never', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(210)\n    );\n\n    var e2 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return e2.withLatestFrom(e1, add);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('withLatestFrom return return', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onCompleted(230)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 3),\n      onCompleted(240)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.withLatestFrom(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 2 + 3),\n      onCompleted(230)\n    );\n  });\n\n  test('withLatestFrom empty error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(230)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.withLatestFrom(e2, add);\n    });\n\n    results.messages.assertEqual(onError(220, error));\n  });\n\n  test('withLatestFrom error empty', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(230)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e2.withLatestFrom(e1, add);\n    });\n\n    results.messages.assertEqual(onError(220, error));\n  });\n\n  test('withLatestFrom return throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(230)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.withLatestFrom(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error)\n    );\n  });\n\n  test('withLatestFrom throw return', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(230)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e2.withLatestFrom(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error)\n    );\n  });\n\n  test('withLatestFrom throw throw', function () {\n    var error1 = new Error('error1');\n    var error2 = new Error('error2');\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error1)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(230, error2)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.withLatestFrom(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error1)\n    );\n  });\n\n  test('withLatestFrom error throw', function () {\n    var error1 = new Error('error1');\n    var error2 = new Error('error2');\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(220, error1)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(230, error2)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.withLatestFrom(e2, add);\n    });\n\n    results.messages.assertEqual(onError(220, error1));\n  });\n\n  test('withLatestFrom throw error', function () {\n    var error1 = new Error('error1');\n    var error2 = new Error('error2');\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onError(220, error1)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(230, error2)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e2.withLatestFrom(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error1)\n    );\n  });\n\n  test('withLatestFrom never throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = Observable.never();\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.withLatestFrom(e2, add);\n    });\n\n    results.messages.assertEqual(onError(220, error));\n  });\n\n  test('withLatestFrom throw never', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = Observable.never();\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e2.withLatestFrom(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error)\n    );\n  });\n\n  test('withLatestFrom some throw', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(230)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.withLatestFrom(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error)\n    );\n  });\n\n  test('withLatestFrom throw some', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(230)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e2.withLatestFrom(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error)\n    );\n  });\n\n  test('withLatestFrom throw after complete left', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(220)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(230, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.withLatestFrom(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(220)\n    );\n  });\n\n  test('withLatestFrom throw after complete right', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(220)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(230, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e2.withLatestFrom(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onError(230, error)\n    );\n  });\n\n  test('withLatestFrom interleaved with tail', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 3),\n      onNext(230, 5),\n      onNext(235, 6),\n      onNext(240, 7),\n      onCompleted(250)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onNext(225, 4),\n      onCompleted(230)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.withLatestFrom(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 3 + 2),\n      onNext(230, 5 + 4),\n      onNext(235, 6 + 4),\n      onNext(240, 7 + 4),\n      onCompleted(250)\n    );\n  });\n\n  test('withLatestFrom consecutive', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onNext(235, 4),\n      onCompleted(240)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(225, 6),\n      onNext(240, 7),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.withLatestFrom(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onNext(235, 4 + 6),\n      onCompleted(240)\n    );\n  });\n\n  test('withLatestFrom consecutive array', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onNext(235, 4),\n      onCompleted(240)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(225, 6),\n      onNext(240, 7),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.withLatestFrom(e2);\n    });\n\n    results.messages.assertEqual(\n      onNext(235, [4,6]),\n      onCompleted(240)\n    );\n  });\n\n  test('withLatestFrom consecutive end with error left', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onNext(225, 4),\n      onError(230, error)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(235, 6),\n      onNext(240, 7),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.withLatestFrom(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onError(230, error)\n    );\n  });\n\n  test('withLatestFrom consecutive end with error right', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onNext(225, 4),\n      onCompleted(230)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(235, 6),\n      onNext(240, 7),\n      onError(245, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e2.withLatestFrom(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onNext(235, 4 + 6),\n      onNext(240, 4 + 7),\n      onError(245, error)\n    );\n  });\n\n  test('withLatestFrom consecutive end with error right array', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onNext(225, 4),\n      onCompleted(230)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(235, 6),\n      onNext(240, 7),\n      onError(245, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e2.withLatestFrom(e1);\n    });\n\n    results.messages.assertEqual(\n      onNext(235, [6,4]),\n      onNext(240, [7,4]),\n      onError(245, error)\n    );\n  });\n\n  test('withLatestFrom selector throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onCompleted(230));\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 3),\n      onCompleted(240));\n\n    var results = scheduler.startScheduler(function () {\n      return e1.withLatestFrom(e2, function () {\n        throw error;\n      });\n    });\n\n    results.messages.assertEqual(onError(220, error));\n  });\n\n}());\n"
  },
  {
    "path": "tests/observable/zip.js",
    "content": "(function () {\n  'use strict';\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal, ok */\n  QUnit.module('zip');\n\n  function add (x, y) { return x + y; }\n\n  var Observable = Rx.Observable,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted,\n      subscribe = Rx.ReactiveTest.subscribe;\n\n  test('zip n-ary symmetric', function () {\n    var scheduler = new TestScheduler();\n\n    var e0 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 1),\n      onNext(250, 4),\n      onCompleted(420));\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onNext(240, 5),\n      onCompleted(410));\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(230, 3),\n      onNext(260, 6),\n      onCompleted(400));\n\n    var res = scheduler.startScheduler(function () {\n      return Observable.zip(e0, e1, e2);\n    });\n\n    res.messages.assertEqual(\n      onNext(230, [1, 2, 3]),\n      onNext(260, [4, 5, 6]),\n      onCompleted(420)\n    );\n\n    e0.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n\n    e1.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n\n    e2.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n  });\n\n  test('zip n-ary symmetric selector', function () {\n    var scheduler = new TestScheduler();\n\n    var e0 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 1),\n      onNext(250, 4),\n      onCompleted(420));\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onNext(240, 5),\n      onCompleted(410));\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(230, 3),\n      onNext(260, 6),\n      onCompleted(400));\n\n    var res = scheduler.startScheduler(function () {\n      return Observable.zip(e0, e1, e2, function (r0, r1, r2) { return [r0, r1, r2]; });\n    });\n\n    res.messages.assertEqual(\n      onNext(230, [1, 2, 3]),\n      onNext(260, [4, 5, 6]),\n      onCompleted(420)\n    );\n\n    e0.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n\n    e1.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n\n    e2.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n  });\n\n  test('zip n-ary array symmetric', function () {\n    var scheduler = new TestScheduler();\n\n    var e0 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 1),\n      onNext(250, 4),\n      onCompleted(420));\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onNext(240, 5),\n      onCompleted(410));\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(230, 3),\n      onNext(260, 6),\n      onCompleted(400));\n\n    var res = scheduler.startScheduler(function () {\n      return Observable.zip([e0, e1, e2]);\n    });\n\n    res.messages.assertEqual(\n      onNext(230, [1, 2, 3]),\n      onNext(260, [4, 5, 6]),\n      onCompleted(420)\n    );\n\n    e0.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n\n    e1.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n\n    e2.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n  });\n\n  test('zip n-ary symmetric array selector', function () {\n    var scheduler = new TestScheduler();\n\n    var e0 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 1),\n      onNext(250, 4),\n      onCompleted(420));\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 2),\n      onNext(240, 5),\n      onCompleted(410));\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(230, 3),\n      onNext(260, 6),\n      onCompleted(400));\n\n    var res = scheduler.startScheduler(function () {\n      return Observable.zip([e0, e1, e2], function (r0, r1, r2) { return [r0, r1, r2]; });\n    });\n\n    res.messages.assertEqual(\n      onNext(230, [1, 2, 3]),\n      onNext(260, [4, 5, 6]),\n      onCompleted(420)\n    );\n\n    e0.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n\n    e1.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n\n    e2.subscriptions.assertEqual(\n      subscribe(200, 420)\n    );\n  });\n\n  test('zip never never', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = Observable.never();\n    var o2 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return o1.zip(o2, add);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('zip never empty', function () {\n    var scheduler = new TestScheduler();\n\n    var o1 = Observable.never();\n    var o2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return o1.zip(o2, add);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('zip empty empty', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210)\n    );\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.zip(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(210)\n    );\n  });\n\n  test('zip empty non-empty', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210)\n    );\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(220)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.zip(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(215)\n    );\n  });\n\n  test('zip non-empty empty', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210)\n    );\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(220)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e2.zip(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(215)\n    );\n  });\n\n  test('zip never non-empty', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(220)\n    );\n    var e2 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return e2.zip(e1, add);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('zip non-empty never', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(220)\n    );\n    var e2 = Observable.never();\n\n    var results = scheduler.startScheduler(function () {\n      return e1.zip(e2, add);\n    });\n\n    results.messages.assertEqual();\n  });\n\n  test('zip non-empty non-empty', function () {\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(230)\n    );\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 3),\n      onCompleted(240)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.zip(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 2 + 3),\n      onCompleted(240)\n    );\n  });\n\n  test('zip empty error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1), onCompleted(230)\n    );\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.zip(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error)\n    );\n  });\n\n  test('zip error empty', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(230)\n    );\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e2.zip(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error)\n    );\n  });\n\n  test('zip never error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = Observable.never();\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.zip(e2, add);\n    });\n\n    results.messages.assertEqual(onError(220, error));\n  });\n\n  test('zip error never', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = Observable.never();\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n        return e2.zip(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error)\n    );\n  });\n\n  test('zip error error', function () {\n    var error1 = new Error();\n    var error2 = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(230, error1)\n    );\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error2)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e2.zip(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error2)\n    );\n  });\n\n  test('zip some error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(230)\n    );\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.zip(e2, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error)\n    );\n  });\n\n  test('zip error some', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(230)\n    );\n\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e2.zip(e1, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error)\n    );\n  });\n\n  test('zip some data asymmetric 1', function () {\n    var i;\n    var scheduler = new TestScheduler();\n\n    var msgs1 = (function () {\n      var results = [];\n      for (i = 0; i < 5; i++) {\n        results.push(onNext(205 + i * 5, i));\n      }\n      return results;\n    })();\n\n    var msgs2 = (function () {\n      var results = [];\n      for (i = 0; i < 10; i++) {\n        results.push(onNext(205 + i * 8, i));\n      }\n      return results;\n    })();\n\n    var len = Math.min(msgs1.length, msgs2.length);\n\n    var e1 = scheduler.createHotObservable(msgs1);\n    var e2 = scheduler.createHotObservable(msgs2);\n\n    var results = scheduler.startScheduler(function () {\n      return e1.zip(e2, add);\n    }).messages;\n\n    equal(len, results.length);\n\n    for (i = 0; i < len; i++) {\n      var sum = msgs1[i].value.value + msgs2[i].value.value;\n      var time = Math.max(msgs1[i].time, msgs2[i].time);\n      ok(results[i].value.kind === 'N' && results[i].time === time && results[i].value.value === sum);\n    }\n  });\n\n  test('zip some data asymmetric 2', function () {\n    var i;\n    var scheduler = new TestScheduler();\n\n    var msgs1 = (function () {\n      var results = [];\n      for (i = 0; i < 10; i++) {\n        results.push(onNext(205 + i * 5, i));\n      }\n      return results;\n    })();\n\n    var msgs2 = (function () {\n      var results = [];\n      for (i = 0; i < 5; i++) {\n        results.push(onNext(205 + i * 8, i));\n      }\n      return results;\n    })();\n\n    var len = Math.min(msgs1.length, msgs2.length);\n\n    var e1 = scheduler.createHotObservable(msgs1);\n    var e2 = scheduler.createHotObservable(msgs2);\n\n    var results = scheduler.startScheduler(function () {\n      return e1.zip(e2, add);\n    }).messages;\n\n    equal(len, results.length);\n\n    for (i = 0; i < len; i++) {\n      var sum = msgs1[i].value.value + msgs2[i].value.value;\n      var time = Math.max(msgs1[i].time, msgs2[i].time);\n      ok(results[i].value.kind === 'N' && results[i].time === time && results[i].value.value === sum);\n    }\n  });\n\n  test('zip some data symmetric', function () {\n    var i;\n\n    var scheduler = new TestScheduler();\n\n    var msgs1 = (function () {\n      var results = [];\n      for (i = 0; i < 10; i++) {\n        results.push(onNext(205 + i * 5, i));\n      }\n      return results;\n    })();\n\n    var msgs2 = (function () {\n      var results = [];\n      for (i = 0; i < 10; i++) {\n        results.push(onNext(205 + i * 8, i));\n      }\n      return results;\n    })();\n\n    var len = Math.min(msgs1.length, msgs2.length);\n\n    var e1 = scheduler.createHotObservable(msgs1);\n    var e2 = scheduler.createHotObservable(msgs2);\n\n    var results = scheduler.startScheduler(function () {\n      return e1.zip(e2, add);\n    }).messages;\n\n    equal(len, results.length);\n\n    for (i = 0; i < len; i++) {\n      var sum = msgs1[i].value.value + msgs2[i].value.value;\n      var time = Math.max(msgs1[i].time, msgs2[i].time);\n      ok(results[i].value.kind === 'N' && results[i].time === time && results[i].value.value === sum);\n    }\n  });\n\n  test('zip selector throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var e1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onNext(225, 4),\n      onCompleted(240)\n    );\n    var e2 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(220, 3),\n      onNext(230, 5),\n      onCompleted(250)\n    );\n\n    var results = scheduler.startScheduler(function () {\n      return e1.zip(e2, function (x, y) {\n        if (y === 5) {\n          throw error;\n        } else {\n          return x + y;\n        }\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(220, 2 + 3),\n      onError(230, error)\n    );\n  });\n\n  test('zip right completes first', function () {\n    var scheduler = new TestScheduler();\n\n    var o = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 4),\n      onCompleted(225)\n    );\n\n    var e = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onCompleted(220)\n    );\n\n    var res = scheduler.startScheduler(function () {\n      return o.zip(e, add);\n    });\n\n    res.messages.assertEqual(\n      onNext(215, 6),\n      onCompleted(225)\n    );\n\n    o.subscriptions.assertEqual(\n      subscribe(200, 225)\n    );\n\n    e.subscriptions.assertEqual(\n      subscribe(200, 225)\n    );\n  });\n\n  test('zip with iterable never empty', function () {\n    var scheduler = new TestScheduler();\n\n    var n1 = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n    var n2 = [];\n\n    var results = scheduler.startScheduler(function () {\n      return n1.zip(n2, add);\n    });\n\n    results.messages.assertEqual();\n\n    n1.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n  test('zip with iterable empty empty', function () {\n    var scheduler = new TestScheduler();\n\n    var n1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210)\n    );\n    var n2 = [];\n\n    var results = scheduler.startScheduler(function () {\n      return n1.zipIterable(n2, add);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(210)\n    );\n\n    n1.subscriptions.assertEqual(\n      subscribe(200, 210)\n    );\n  });\n  test('zip with iterable empty non-empty', function () {\n    var scheduler = new TestScheduler();\n\n    var n1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onCompleted(210)\n    );\n    var n2 = [2];\n\n    var results = scheduler.startScheduler(function () {\n      return n1.zipIterable(n2, add);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(210)\n    );\n\n    n1.subscriptions.assertEqual(\n      subscribe(200, 210)\n    );\n  });\n  test('zip with iterable non-empty empty', function () {\n    var scheduler = new TestScheduler();\n\n    var n1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(220)\n    );\n    var n2 = [];\n\n    var results = scheduler.startScheduler(function () {\n      return n1.zipIterable(n2, add);\n    });\n\n    results.messages.assertEqual(\n      onCompleted(215)\n    );\n\n    n1.subscriptions.assertEqual(\n      subscribe(200, 215)\n    );\n  });\n  test('zip with iterable never non-empty', function () {\n    var scheduler = new TestScheduler();\n\n    var n1 = scheduler.createHotObservable(\n      onNext(150, 1)\n    );\n    var n2 = [2];\n\n    var results = scheduler.startScheduler(function () {\n      return n1.zipIterable(n2, add);\n    });\n\n    results.messages.assertEqual();\n\n    n1.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n  test('zip with iterable non-empty non-empty', function () {\n    var scheduler = new TestScheduler();\n\n    var n1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onCompleted(230)\n    );\n    var n2 = [3];\n\n    var results = scheduler.startScheduler(function () {\n      return n1.zipIterable(n2, add);\n    });\n\n    results.messages.assertEqual(\n      onNext(215, 2 + 3),\n      onCompleted(230)\n    );\n\n    n1.subscriptions.assertEqual(\n      subscribe(200, 230)\n    );\n  });\n\n  test('zip with iterable error empty', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var n1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error)\n    );\n    var n2 = [];\n\n    var results = scheduler.startScheduler(function () {\n      return n1.zipIterable(n2, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error)\n    );\n\n    n1.subscriptions.assertEqual(\n      subscribe(200, 220)\n    );\n  });\n\n  test('zip with iterable error some', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var n1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onError(220, error)\n    );\n    var n2 = [2];\n\n    var results = scheduler.startScheduler(function () {\n      return n1.zipIterable(n2, add);\n    });\n\n    results.messages.assertEqual(\n      onError(220, error)\n    );\n\n    n1.subscriptions.assertEqual(\n      subscribe(200, 220)\n    );\n  });\n\n  test('zip with iterable some data both sides', function () {\n    var scheduler = new TestScheduler();\n\n    var n1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(210, 2),\n      onNext(220, 3),\n      onNext(230, 4),\n      onNext(240, 5)\n    );\n    var n2 = [5, 4, 3, 2];\n\n    var results = scheduler.startScheduler(function () {\n      return n1.zipIterable(n2, add);\n    });\n\n    results.messages.assertEqual(\n      onNext(210, 7),\n      onNext(220, 7),\n      onNext(230, 7),\n      onNext(240, 7)\n    );\n\n    n1.subscriptions.assertEqual(\n      subscribe(200, 1000)\n    );\n  });\n\n  test('zip with iterable selector throws', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var n1 = scheduler.createHotObservable(\n      onNext(150, 1),\n      onNext(215, 2),\n      onNext(225, 4),\n      onCompleted(240)\n    );\n    var n2 = [3, 5];\n\n    var results = scheduler.startScheduler(function () {\n      return n1.zipIterable(n2, function (x, y) {\n        if (y === 5) { throw error; }\n        return x + y;\n      });\n    });\n\n    results.messages.assertEqual(\n      onNext(215, 2 + 3),\n      onError(225, error)\n    );\n\n    n1.subscriptions.assertEqual(\n      subscribe(200, 225)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/perf/old/rx.aggregates.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n    var objectTypes = {\n        'boolean': false,\n        'function': true,\n        'object': true,\n        'number': false,\n        'string': false,\n        'undefined': false\n    };\n\n    var root = (objectTypes[typeof window] && window) || this,\n        freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n        freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n        moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n        freeGlobal = objectTypes[typeof global] && global;\n\n    if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n        root = freeGlobal;\n    }\n\n    // Because of build optimizers\n    if (typeof define === 'function' && define.amd) {\n        define(['rx'], function (Rx, exports) {\n            return factory(root, exports, Rx);\n        });\n    } else if (typeof module === 'object' && module && module.exports === freeExports) {\n        module.exports = factory(root, module.exports, require('./rx'));\n    } else {\n        root.Rx = factory(root, {}, root.Rx);\n    }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // References\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    CompositeDisposable = Rx.CompositeDisposable,\n    AnonymousObservable = Rx.AnonymousObservable,\n    disposableEmpty = Rx.Disposable.empty,\n    isEqual = Rx.internals.isEqual,\n    helpers = Rx.helpers,\n    not = helpers.not,\n    defaultComparer = helpers.defaultComparer,\n    identity = helpers.identity,\n    defaultSubComparer = helpers.defaultSubComparer,\n    isFunction = helpers.isFunction,\n    isPromise = helpers.isPromise,\n    isArrayLike = helpers.isArrayLike,\n    isIterable = helpers.isIterable,\n    observableFromPromise = Observable.fromPromise,\n    observableFrom = Observable.from,\n    bindCallback = Rx.internals.bindCallback;\n\n  // Defaults\n  var argumentOutOfRange = 'Argument out of range',\n    sequenceContainsNoElements = \"Sequence contains no elements.\";\n\n  function extremaBy(source, keySelector, comparer) {\n    return new AnonymousObservable(function (o) {\n      var hasValue = false, lastKey = null, list = [];\n      return source.subscribe(function (x) {\n        var comparison, key;\n        try {\n          key = keySelector(x);\n        } catch (ex) {\n          o.onError(ex);\n          return;\n        }\n        comparison = 0;\n        if (!hasValue) {\n          hasValue = true;\n          lastKey = key;\n        } else {\n          try {\n            comparison = comparer(key, lastKey);\n          } catch (ex1) {\n            o.onError(ex1);\n            return;\n          }\n        }\n        if (comparison > 0) {\n          lastKey = key;\n          list = [];\n        }\n        if (comparison >= 0) { list.push(x); }\n      }, function (e) { o.onError(e); }, function () {\n        o.onNext(list);\n        o.onCompleted();\n      });\n    }, source);\n  }\n\n  function firstOnly(x) {\n    if (x.length === 0) { throw new Error(sequenceContainsNoElements); }\n    return x[0];\n  }\n\n  /**\n   * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n   * For aggregation behavior with incremental intermediate results, see Observable.scan.\n   * @deprecated Use #reduce instead\n   * @param {Mixed} [seed] The initial accumulator value.\n   * @param {Function} accumulator An accumulator function to be invoked on each element.\n   * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n   */\n  observableProto.aggregate = function () {\n    //deprecate('aggregate', 'reduce');\n    var hasSeed = false, accumulator, seed, source = this;\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[0];\n      accumulator = arguments[1];\n    } else {\n      accumulator = arguments[0];\n    }\n    return new AnonymousObservable(function (o) {\n      var hasAccumulation, accumulation, hasValue;\n      return source.subscribe (\n        function (x) {\n          !hasValue && (hasValue = true);\n          try {\n            if (hasAccumulation) {\n              accumulation = accumulator(accumulation, x);\n            } else {\n              accumulation = hasSeed ? accumulator(seed, x) : x;\n              hasAccumulation = true;\n            }\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        },\n        function (e) { o.onError(e); },\n        function () {\n          hasValue && o.onNext(accumulation);\n          !hasValue && hasSeed && o.onNext(seed);\n          !hasValue && !hasSeed && o.onError(new Error(sequenceContainsNoElements));\n          o.onCompleted();\n        }\n      );\n    }, source);\n  };\n\n  /**\n   * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n   * For aggregation behavior with incremental intermediate results, see Observable.scan.\n   * @param {Function} accumulator An accumulator function to be invoked on each element.\n   * @param {Any} [seed] The initial accumulator value.\n   * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n   */\n  observableProto.reduce = function (accumulator) {\n    var hasSeed = false, seed, source = this;\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new AnonymousObservable(function (o) {\n      var hasAccumulation, accumulation, hasValue;\n      return source.subscribe (\n        function (x) {\n          !hasValue && (hasValue = true);\n          try {\n            if (hasAccumulation) {\n              accumulation = accumulator(accumulation, x);\n            } else {\n              accumulation = hasSeed ? accumulator(seed, x) : x;\n              hasAccumulation = true;\n            }\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        },\n        function (e) { o.onError(e); },\n        function () {\n          hasValue && o.onNext(accumulation);\n          !hasValue && hasSeed && o.onNext(seed);\n          !hasValue && !hasSeed && o.onError(new Error(sequenceContainsNoElements));\n          o.onCompleted();\n        }\n      );\n    }, source);\n  };\n\n  /**\n   * Determines whether any element of an observable sequence satisfies a condition if present, else if any items are in the sequence.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @returns {Observable} An observable sequence containing a single element determining whether any elements in the source sequence pass the test in the specified predicate if given, else if any items are in the sequence.\n   */\n  observableProto.some = function (predicate, thisArg) {\n    var source = this;\n    return predicate ?\n      source.filter(predicate, thisArg).some() :\n      new AnonymousObservable(function (observer) {\n        return source.subscribe(function () {\n          observer.onNext(true);\n          observer.onCompleted();\n        }, function (e) { observer.onError(e); }, function () {\n          observer.onNext(false);\n          observer.onCompleted();\n        });\n      }, source);\n  };\n\n  /** @deprecated use #some instead */\n  observableProto.any = function () {\n    //deprecate('any', 'some');\n    return this.some.apply(this, arguments);\n  };\n\n  /**\n   * Determines whether an observable sequence is empty.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence is empty.\n   */\n  observableProto.isEmpty = function () {\n    return this.any().map(not);\n  };\n\n  /**\n   * Determines whether all elements of an observable sequence satisfy a condition.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element determining whether all elements in the source sequence pass the test in the specified predicate.\n   */\n  observableProto.every = function (predicate, thisArg) {\n    return this.filter(function (v) { return !predicate(v); }, thisArg).some().map(not);\n  };\n\n  /** @deprecated use #every instead */\n  observableProto.all = function () {\n    //deprecate('all', 'every');\n    return this.every.apply(this, arguments);\n  };\n\n  /**\n   * Determines whether an observable sequence includes a specified element with an optional equality comparer.\n   * @param searchElement The value to locate in the source sequence.\n   * @param {Number} [fromIndex] An equality comparer to compare elements.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence includes an element that has the specified value from the given index.\n   */\n  observableProto.includes = function (searchElement, fromIndex) {\n    var source = this;\n    function comparer(a, b) {\n      return (a === 0 && b === 0) || (a === b || (isNaN(a) && isNaN(b)));\n    }\n    return new AnonymousObservable(function (o) {\n      var i = 0, n = +fromIndex || 0;\n      Math.abs(n) === Infinity && (n = 0);\n      if (n < 0) {\n        o.onNext(false);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n      return source.subscribe(\n        function (x) {\n          if (i++ >= n && comparer(x, searchElement)) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        },\n        function (e) { o.onError(e); },\n        function () {\n          o.onNext(false);\n          o.onCompleted();\n        });\n    }, this);\n  };\n\n  /**\n   * @deprecated use #includes instead.\n   */\n  observableProto.contains = function (searchElement, fromIndex) {\n    //deprecate('contains', 'includes');\n    observableProto.includes(searchElement, fromIndex);\n  };\n  /**\n   * Returns an observable sequence containing a value that represents how many elements in the specified observable sequence satisfy a condition if provided, else the count of items.\n   * @example\n   * res = source.count();\n   * res = source.count(function (x) { return x > 3; });\n   * @param {Function} [predicate]A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with a number that represents how many elements in the input sequence satisfy the condition in the predicate function if provided, else the count of items in the sequence.\n   */\n  observableProto.count = function (predicate, thisArg) {\n    return predicate ?\n      this.filter(predicate, thisArg).count() :\n      this.reduce(function (count) { return count + 1; }, 0);\n  };\n\n  /**\n   * Returns the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   * @param {Any} searchElement Element to locate in the array.\n   * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n   * @returns {Observable} And observable sequence containing the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   */\n  observableProto.indexOf = function(searchElement, fromIndex) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var i = 0, n = +fromIndex || 0;\n      Math.abs(n) === Infinity && (n = 0);\n      if (n < 0) {\n        o.onNext(-1);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n      return source.subscribe(\n        function (x) {\n          if (i >= n && x === searchElement) {\n            o.onNext(i);\n            o.onCompleted();\n          }\n          i++;\n        },\n        function (e) { o.onError(e); },\n        function () {\n          o.onNext(-1);\n          o.onCompleted();\n        });\n    }, source);\n  };\n\n  /**\n   * Computes the sum of a sequence of values that are obtained by invoking an optional transform function on each element of the input sequence, else if not specified computes the sum on each item in the sequence.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the sum of the values in the source sequence.\n   */\n  observableProto.sum = function (keySelector, thisArg) {\n    return keySelector && isFunction(keySelector) ?\n      this.map(keySelector, thisArg).sum() :\n      this.reduce(function (prev, curr) { return prev + curr; }, 0);\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n   * @example\n   * var res = source.minBy(function (x) { return x.value; });\n   * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer] Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n   */\n  observableProto.minBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return extremaBy(this, keySelector, function (x, y) { return comparer(x, y) * -1; });\n  };\n\n  /**\n   * Returns the minimum element in an observable sequence according to the optional comparer else a default greater than less than check.\n   * @example\n   * var res = source.min();\n   * var res = source.min(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the minimum element in the source sequence.\n   */\n  observableProto.min = function (comparer) {\n    return this.minBy(identity, comparer).map(function (x) { return firstOnly(x); });\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n   * @example\n   * var res = source.maxBy(function (x) { return x.value; });\n   * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer]  Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n   */\n  observableProto.maxBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return extremaBy(this, keySelector, comparer);\n  };\n\n  /**\n   * Returns the maximum value in an observable sequence according to the specified comparer.\n   * @example\n   * var res = source.max();\n   * var res = source.max(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the maximum element in the source sequence.\n   */\n  observableProto.max = function (comparer) {\n    return this.maxBy(identity, comparer).map(function (x) { return firstOnly(x); });\n  };\n\n  /**\n   * Computes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the average of the sequence of values.\n   */\n  observableProto.average = function (keySelector, thisArg) {\n    return keySelector && isFunction(keySelector) ?\n      this.map(keySelector, thisArg).average() :\n      this.reduce(function (prev, cur) {\n        return {\n          sum: prev.sum + cur,\n          count: prev.count + 1\n        };\n      }, {sum: 0, count: 0 }).map(function (s) {\n        if (s.count === 0) { throw new Error(sequenceContainsNoElements); }\n        return s.sum / s.count;\n      });\n  };\n\n  /**\n   *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n   *\n   * @example\n   * var res = res = source.sequenceEqual([1,2,3]);\n   * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n   * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n   * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n   * @param {Observable} second Second observable sequence or array to compare.\n   * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n   * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n   */\n  observableProto.sequenceEqual = function (second, comparer) {\n    var first = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var donel = false, doner = false, ql = [], qr = [];\n      var subscription1 = first.subscribe(function (x) {\n        var equal, v;\n        if (qr.length > 0) {\n          v = qr.shift();\n          try {\n            equal = comparer(v, x);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (doner) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          ql.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        donel = true;\n        if (ql.length === 0) {\n          if (qr.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (doner) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n\n      (isArrayLike(second) || isIterable(second)) && (second = observableFrom(second));\n      isPromise(second) && (second = observableFromPromise(second));\n      var subscription2 = second.subscribe(function (x) {\n        var equal;\n        if (ql.length > 0) {\n          var v = ql.shift();\n          try {\n            equal = comparer(v, x);\n          } catch (exception) {\n            o.onError(exception);\n            return;\n          }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (donel) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          qr.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        doner = true;\n        if (qr.length === 0) {\n          if (ql.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (donel) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n      return new CompositeDisposable(subscription1, subscription2);\n    }, first);\n  };\n\n  function elementAtOrDefault(source, index, hasDefault, defaultValue) {\n    if (index < 0) { throw new Error(argumentOutOfRange); }\n    return new AnonymousObservable(function (o) {\n      var i = index;\n      return source.subscribe(function (x) {\n        if (i-- === 0) {\n          o.onNext(x);\n          o.onCompleted();\n        }\n      }, function (e) { o.onError(e); }, function () {\n        if (!hasDefault) {\n          o.onError(new Error(argumentOutOfRange));\n        } else {\n          o.onNext(defaultValue);\n          o.onCompleted();\n        }\n      });\n    }, source);\n  }\n\n  /**\n   * Returns the element at a specified index in a sequence.\n   * @example\n   * var res = source.elementAt(5);\n   * @param {Number} index The zero-based index of the element to retrieve.\n   * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence.\n   */\n  observableProto.elementAt =  function (index) {\n    return elementAtOrDefault(this, index, false);\n  };\n\n  /**\n   * Returns the element at a specified index in a sequence or a default value if the index is out of range.\n   * @example\n   * var res = source.elementAtOrDefault(5);\n   * var res = source.elementAtOrDefault(5, 0);\n   * @param {Number} index The zero-based index of the element to retrieve.\n   * @param [defaultValue] The default value if the index is outside the bounds of the source sequence.\n   * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence, or a default value if the index is outside the bounds of the source sequence.\n   */\n  observableProto.elementAtOrDefault = function (index, defaultValue) {\n    return elementAtOrDefault(this, index, true, defaultValue);\n  };\n\n  function singleOrDefaultAsync(source, hasDefault, defaultValue) {\n    return new AnonymousObservable(function (o) {\n      var value = defaultValue, seenValue = false;\n      return source.subscribe(function (x) {\n        if (seenValue) {\n          o.onError(new Error('Sequence contains more than one element'));\n        } else {\n          value = x;\n          seenValue = true;\n        }\n      }, function (e) { o.onError(e); }, function () {\n        if (!seenValue && !hasDefault) {\n          o.onError(new Error(sequenceContainsNoElements));\n        } else {\n          o.onNext(value);\n          o.onCompleted();\n        }\n      });\n    }, source);\n  }\n\n  /**\n   * Returns the only element of an observable sequence that satisfies the condition in the optional predicate, and reports an exception if there is not exactly one element in the observable sequence.\n   * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate.\n   */\n  observableProto.single = function (predicate, thisArg) {\n    return predicate && isFunction(predicate) ?\n      this.where(predicate, thisArg).single() :\n      singleOrDefaultAsync(this, false);\n  };\n\n  /**\n   * Returns the only element of an observable sequence that matches the predicate, or a default value if no such element exists; this method reports an exception if there is more than one element in the observable sequence.\n   * @example\n   * var res = res = source.singleOrDefault();\n   * var res = res = source.singleOrDefault(function (x) { return x === 42; });\n   * res = source.singleOrDefault(function (x) { return x === 42; }, 0);\n   * res = source.singleOrDefault(null, 0);\n   * @memberOf Observable#\n   * @param {Function} predicate A predicate function to evaluate for elements in the source sequence.\n   * @param [defaultValue] The default value if the index is outside the bounds of the source sequence.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate, or a default value if no such element exists.\n   */\n  observableProto.singleOrDefault = function (predicate, defaultValue, thisArg) {\n    return predicate && isFunction(predicate) ?\n      this.filter(predicate, thisArg).singleOrDefault(null, defaultValue) :\n      singleOrDefaultAsync(this, true, defaultValue);\n  };\n\n  function firstOrDefaultAsync(source, hasDefault, defaultValue) {\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(function (x) {\n        o.onNext(x);\n        o.onCompleted();\n      }, function (e) { o.onError(e); }, function () {\n        if (!hasDefault) {\n          o.onError(new Error(sequenceContainsNoElements));\n        } else {\n          o.onNext(defaultValue);\n          o.onCompleted();\n        }\n      });\n    }, source);\n  }\n\n  /**\n   * Returns the first element of an observable sequence that satisfies the condition in the predicate if present else the first item in the sequence.\n   * @example\n   * var res = res = source.first();\n   * var res = res = source.first(function (x) { return x > 3; });\n   * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate if provided, else the first item in the sequence.\n   */\n  observableProto.first = function (predicate, thisArg) {\n    return predicate ?\n      this.where(predicate, thisArg).first() :\n      firstOrDefaultAsync(this, false);\n  };\n\n  /**\n   * Returns the first element of an observable sequence that satisfies the condition in the predicate, or a default value if no such element exists.\n   * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n   * @param {Any} [defaultValue] The default value if no such element exists.  If not specified, defaults to null.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate, or a default value if no such element exists.\n   */\n  observableProto.firstOrDefault = function (predicate, defaultValue, thisArg) {\n    return predicate ?\n      this.where(predicate).firstOrDefault(null, defaultValue) :\n      firstOrDefaultAsync(this, true, defaultValue);\n  };\n\n  function lastOrDefaultAsync(source, hasDefault, defaultValue) {\n    return new AnonymousObservable(function (o) {\n      var value = defaultValue, seenValue = false;\n      return source.subscribe(function (x) {\n        value = x;\n        seenValue = true;\n      }, function (e) { o.onError(e); }, function () {\n        if (!seenValue && !hasDefault) {\n          o.onError(new Error(sequenceContainsNoElements));\n        } else {\n          o.onNext(value);\n          o.onCompleted();\n        }\n      });\n    }, source);\n  }\n\n  /**\n   * Returns the last element of an observable sequence that satisfies the condition in the predicate if specified, else the last element.\n   * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate.\n   */\n  observableProto.last = function (predicate, thisArg) {\n    return predicate ?\n      this.where(predicate, thisArg).last() :\n      lastOrDefaultAsync(this, false);\n  };\n\n  /**\n   * Returns the last element of an observable sequence that satisfies the condition in the predicate, or a default value if no such element exists.\n   * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n   * @param [defaultValue] The default value if no such element exists.  If not specified, defaults to null.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate, or a default value if no such element exists.\n   */\n  observableProto.lastOrDefault = function (predicate, defaultValue, thisArg) {\n    return predicate ?\n      this.where(predicate, thisArg).lastOrDefault(null, defaultValue) :\n      lastOrDefaultAsync(this, true, defaultValue);\n  };\n\n  function findValue (source, predicate, thisArg, yieldIndex) {\n    var callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      var i = 0;\n      return source.subscribe(function (x) {\n        var shouldRun;\n        try {\n          shouldRun = callback(x, i, source);\n        } catch (e) {\n          o.onError(e);\n          return;\n        }\n        if (shouldRun) {\n          o.onNext(yieldIndex ? i : x);\n          o.onCompleted();\n        } else {\n          i++;\n        }\n      }, function (e) { o.onError(e); }, function () {\n        o.onNext(yieldIndex ? -1 : undefined);\n        o.onCompleted();\n      });\n    }, source);\n  }\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the first element that matches the conditions defined by the specified predicate, if found; otherwise, undefined.\n   */\n  observableProto.find = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, false);\n  };\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns\n   * an Observable sequence with the zero-based index of the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the zero-based index of the first occurrence of an element that matches the conditions defined by match, if found; otherwise, –1.\n  */\n  observableProto.findIndex = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, true);\n  };\n\n  /**\n   * Converts the observable sequence to a Set if it exists.\n   * @returns {Observable} An observable sequence with a single value of a Set containing the values from the observable sequence.\n   */\n  observableProto.toSet = function () {\n    if (typeof root.Set === 'undefined') { throw new TypeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var s = new root.Set();\n      return source.subscribe(\n        function (x) { s.add(x); },\n        function (e) { o.onError(e); },\n        function () {\n          o.onNext(s);\n          o.onCompleted();\n        });\n    }, source);\n  };\n\n  /**\n  * Converts the observable sequence to a Map if it exists.\n  * @param {Function} keySelector A function which produces the key for the Map.\n  * @param {Function} [elementSelector] An optional function which produces the element for the Map. If not present, defaults to the value from the observable sequence.\n  * @returns {Observable} An observable sequence with a single value of a Map containing the values from the observable sequence.\n  */\n  observableProto.toMap = function (keySelector, elementSelector) {\n    if (typeof root.Map === 'undefined') { throw new TypeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var m = new root.Map();\n      return source.subscribe(\n        function (x) {\n          var key;\n          try {\n            key = keySelector(x);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n\n          var element = x;\n          if (elementSelector) {\n            try {\n              element = elementSelector(x);\n            } catch (e) {\n              o.onError(e);\n              return;\n            }\n          }\n\n          m.set(key, element);\n        },\n        function (e) { o.onError(e); },\n        function () {\n          o.onNext(m);\n          o.onCompleted();\n        });\n    }, source);\n  };\n\n    return Rx;\n}));\n"
  },
  {
    "path": "tests/perf/old/rx.all.compat.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n;(function (undefined) {\n\n  var objectTypes = {\n    'boolean': false,\n    'function': true,\n    'object': true,\n    'number': false,\n    'string': false,\n    'undefined': false\n  };\n\n  var root = (objectTypes[typeof window] && window) || this,\n    freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n    freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n    moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n    freeGlobal = objectTypes[typeof global] && global;\n\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n    root = freeGlobal;\n  }\n\n  var Rx = {\n      internals: {},\n      config: {\n        Promise: root.Promise\n      },\n      helpers: { }\n  };\n\n  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    notDefined = Rx.helpers.notDefined = function (x) { return typeof x === 'undefined'; },\n    isScheduler = Rx.helpers.isScheduler = function (x) { return x instanceof Rx.Scheduler; },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    pluck = Rx.helpers.pluck = function (property) { return function (x) { return x[property]; }; },\n    just = Rx.helpers.just = function (value) { return function () { return value; }; },\n    defaultNow = Rx.helpers.defaultNow = (function () { return !!Date.now ? Date.now : function () { return +new Date; }; }()),\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.then === 'function'; },\n    asArray = Rx.helpers.asArray = function () { return Array.prototype.slice.call(arguments); },\n    not = Rx.helpers.not = function (a) { return !a; },\n    isFunction = Rx.helpers.isFunction = (function () {\n\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      }\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n\n      return isFn;\n    }());\n\n  // Errors\n  var sequenceContainsNoElements = 'Sequence contains no elements.';\n  var argumentOutOfRange = 'Argument out of range';\n  var objectDisposed = 'Object has been disposed';\n  function checkDisposed(self) { if (self.isDisposed) { throw new Error(objectDisposed); } }\n  function cloneArray(arr) { for(var a = [], i = 0, len = arr.length; i < len; i++) { a.push(arr[i]); } return a;}\n\n  Rx.config.longStackSupport = false;\n  var hasStacks = false;\n  try {\n    throw new Error();\n  } catch (e) {\n    hasStacks = !!e.stack;\n  }\n\n  // All code after this point will be filtered from stack traces reported by RxJS\n  var rStartingLine = captureLine(), rFileName;\n\n  var STACK_JUMP_SEPARATOR = \"From previous event:\";\n\n  function makeStackTraceLong(error, observable) {\n      // If possible, transform the error stack trace by removing Node and RxJS\n      // cruft, then concatenating with the stack trace of `observable`.\n      if (hasStacks &&\n          observable.stack &&\n          typeof error === \"object\" &&\n          error !== null &&\n          error.stack &&\n          error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n      ) {\n        var stacks = [];\n        for (var o = observable; !!o; o = o.source) {\n          if (o.stack) {\n            stacks.unshift(o.stack);\n          }\n        }\n        stacks.unshift(error.stack);\n\n        var concatedStacks = stacks.join(\"\\n\" + STACK_JUMP_SEPARATOR + \"\\n\");\n        error.stack = filterStackString(concatedStacks);\n    }\n  }\n\n  function filterStackString(stackString) {\n    var lines = stackString.split(\"\\n\"),\n        desiredLines = [];\n    for (var i = 0, len = lines.length; i < len; i++) {\n      var line = lines[i];\n\n      if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n        desiredLines.push(line);\n      }\n    }\n    return desiredLines.join(\"\\n\");\n  }\n\n  function isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n    if (!fileNameAndLineNumber) {\n      return false;\n    }\n    var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === rFileName &&\n      lineNumber >= rStartingLine &&\n      lineNumber <= rEndingLine;\n  }\n\n  function isNodeFrame(stackLine) {\n    return stackLine.indexOf(\"(module.js:\") !== -1 ||\n      stackLine.indexOf(\"(node.js:\") !== -1;\n  }\n\n  function captureLine() {\n    if (!hasStacks) { return; }\n\n    try {\n      throw new Error();\n    } catch (e) {\n      var lines = e.stack.split(\"\\n\");\n      var firstLine = lines[0].indexOf(\"@\") > 0 ? lines[1] : lines[2];\n      var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n      if (!fileNameAndLineNumber) { return; }\n\n      rFileName = fileNameAndLineNumber[0];\n      return fileNameAndLineNumber[1];\n    }\n  }\n\n  function getFileNameAndLineNumber(stackLine) {\n    // Named functions: \"at functionName (filename:lineNumber:columnNumber)\"\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }\n\n    // Anonymous functions: \"at filename:lineNumber:columnNumber\"\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }\n\n    // Firefox style: \"function@filename:lineNumber or @filename:lineNumber\"\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }\n  }\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o[$iterator$] !== undefined;\n  }\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  }\n\n  Rx.helpers.iterator = $iterator$;\n\n  var bindCallback = Rx.internals.bindCallback = function (func, thisArg, argCount) {\n    if (typeof thisArg === 'undefined') { return func; }\n    switch(argCount) {\n      case 0:\n        return function() {\n          return func.call(thisArg)\n        };\n      case 1:\n        return function(arg) {\n          return func.call(thisArg, arg);\n        }\n      case 2:\n        return function(value, index) {\n          return func.call(thisArg, value, index);\n        };\n      case 3:\n        return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n    }\n\n    return function() {\n      return func.apply(thisArg, arguments);\n    };\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var dontEnums = ['toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'],\n  dontEnumsLength = dontEnums.length;\n\n  /** `Object#toString` result shortcuts */\n  var argsClass = '[object Arguments]',\n    arrayClass = '[object Array]',\n    boolClass = '[object Boolean]',\n    dateClass = '[object Date]',\n    errorClass = '[object Error]',\n    funcClass = '[object Function]',\n    numberClass = '[object Number]',\n    objectClass = '[object Object]',\n    regexpClass = '[object RegExp]',\n    stringClass = '[object String]';\n\n  var toString = Object.prototype.toString,\n    hasOwnProperty = Object.prototype.hasOwnProperty,\n    supportsArgsClass = toString.call(arguments) == argsClass, // For less <IE9 && FF<4\n    supportNodeClass,\n    errorProto = Error.prototype,\n    objectProto = Object.prototype,\n    stringProto = String.prototype,\n    propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n  try {\n    supportNodeClass = !(toString.call(document) == objectClass && !({ 'toString': 0 } + ''));\n  } catch (e) {\n    supportNodeClass = true;\n  }\n\n  var nonEnumProps = {};\n  nonEnumProps[arrayClass] = nonEnumProps[dateClass] = nonEnumProps[numberClass] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true };\n  nonEnumProps[boolClass] = nonEnumProps[stringClass] = { 'constructor': true, 'toString': true, 'valueOf': true };\n  nonEnumProps[errorClass] = nonEnumProps[funcClass] = nonEnumProps[regexpClass] = { 'constructor': true, 'toString': true };\n  nonEnumProps[objectClass] = { 'constructor': true };\n\n  var support = {};\n  (function () {\n    var ctor = function() { this.x = 1; },\n      props = [];\n\n    ctor.prototype = { 'valueOf': 1, 'y': 1 };\n    for (var key in new ctor) { props.push(key); }\n    for (key in arguments) { }\n\n    // Detect if `name` or `message` properties of `Error.prototype` are enumerable by default.\n    support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') || propertyIsEnumerable.call(errorProto, 'name');\n\n    // Detect if `prototype` properties are enumerable by default.\n    support.enumPrototypes = propertyIsEnumerable.call(ctor, 'prototype');\n\n    // Detect if `arguments` object indexes are non-enumerable\n    support.nonEnumArgs = key != 0;\n\n    // Detect if properties shadowing those on `Object.prototype` are non-enumerable.\n    support.nonEnumShadows = !/valueOf/.test(props);\n  }(1));\n\n  var isObject = Rx.internals.isObject = function(value) {\n    var type = typeof value;\n    return value && (type == 'function' || type == 'object') || false;\n  };\n\n  function keysIn(object) {\n    var result = [];\n    if (!isObject(object)) {\n      return result;\n    }\n    if (support.nonEnumArgs && object.length && isArguments(object)) {\n      object = slice.call(object);\n    }\n    var skipProto = support.enumPrototypes && typeof object == 'function',\n        skipErrorProps = support.enumErrorProps && (object === errorProto || object instanceof Error);\n\n    for (var key in object) {\n      if (!(skipProto && key == 'prototype') &&\n          !(skipErrorProps && (key == 'message' || key == 'name'))) {\n        result.push(key);\n      }\n    }\n\n    if (support.nonEnumShadows && object !== objectProto) {\n      var ctor = object.constructor,\n          index = -1,\n          length = dontEnumsLength;\n\n      if (object === (ctor && ctor.prototype)) {\n        var className = object === stringProto ? stringClass : object === errorProto ? errorClass : toString.call(object),\n            nonEnum = nonEnumProps[className];\n      }\n      while (++index < length) {\n        key = dontEnums[index];\n        if (!(nonEnum && nonEnum[key]) && hasOwnProperty.call(object, key)) {\n          result.push(key);\n        }\n      }\n    }\n    return result;\n  }\n\n  function internalFor(object, callback, keysFunc) {\n    var index = -1,\n      props = keysFunc(object),\n      length = props.length;\n\n    while (++index < length) {\n      var key = props[index];\n      if (callback(object[key], key, object) === false) {\n        break;\n      }\n    }\n    return object;\n  }\n\n  function internalForIn(object, callback) {\n    return internalFor(object, callback, keysIn);\n  }\n\n  function isNode(value) {\n    // IE < 9 presents DOM nodes as `Object` objects except they have `toString`\n    // methods that are `typeof` \"string\" and still can coerce nodes to strings\n    return typeof value.toString != 'function' && typeof (value + '') == 'string';\n  }\n\n  var isArguments = function(value) {\n    return (value && typeof value == 'object') ? toString.call(value) == argsClass : false;\n  }\n\n  // fallback for browsers that can't detect `arguments` objects by [[Class]]\n  if (!supportsArgsClass) {\n    isArguments = function(value) {\n      return (value && typeof value == 'object') ? hasOwnProperty.call(value, 'callee') : false;\n    };\n  }\n\n  var isEqual = Rx.internals.isEqual = function (x, y) {\n    return deepEquals(x, y, [], []);\n  };\n\n  /** @private\n   * Used for deep comparison\n   **/\n  function deepEquals(a, b, stackA, stackB) {\n    // exit early for identical values\n    if (a === b) {\n      // treat `+0` vs. `-0` as not equal\n      return a !== 0 || (1 / a == 1 / b);\n    }\n\n    var type = typeof a,\n        otherType = typeof b;\n\n    // exit early for unlike primitive values\n    if (a === a && (a == null || b == null ||\n        (type != 'function' && type != 'object' && otherType != 'function' && otherType != 'object'))) {\n      return false;\n    }\n\n    // compare [[Class]] names\n    var className = toString.call(a),\n        otherClass = toString.call(b);\n\n    if (className == argsClass) {\n      className = objectClass;\n    }\n    if (otherClass == argsClass) {\n      otherClass = objectClass;\n    }\n    if (className != otherClass) {\n      return false;\n    }\n    switch (className) {\n      case boolClass:\n      case dateClass:\n        // coerce dates and booleans to numbers, dates to milliseconds and booleans\n        // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\n        return +a == +b;\n\n      case numberClass:\n        // treat `NaN` vs. `NaN` as equal\n        return (a != +a) ?\n          b != +b :\n          // but treat `-0` vs. `+0` as not equal\n          (a == 0 ? (1 / a == 1 / b) : a == +b);\n\n      case regexpClass:\n      case stringClass:\n        // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\n        // treat string primitives and their corresponding object instances as equal\n        return a == String(b);\n    }\n    var isArr = className == arrayClass;\n    if (!isArr) {\n\n      // exit for functions and DOM nodes\n      if (className != objectClass || (!support.nodeClass && (isNode(a) || isNode(b)))) {\n        return false;\n      }\n      // in older versions of Opera, `arguments` objects have `Array` constructors\n      var ctorA = !support.argsObject && isArguments(a) ? Object : a.constructor,\n          ctorB = !support.argsObject && isArguments(b) ? Object : b.constructor;\n\n      // non `Object` object instances with different constructors are not equal\n      if (ctorA != ctorB &&\n            !(hasOwnProperty.call(a, 'constructor') && hasOwnProperty.call(b, 'constructor')) &&\n            !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\n            ('constructor' in a && 'constructor' in b)\n          ) {\n        return false;\n      }\n    }\n    // assume cyclic structures are equal\n    // the algorithm for detecting cyclic structures is adapted from ES 5.1\n    // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\n    var initedStack = !stackA;\n    stackA || (stackA = []);\n    stackB || (stackB = []);\n\n    var length = stackA.length;\n    while (length--) {\n      if (stackA[length] == a) {\n        return stackB[length] == b;\n      }\n    }\n    var size = 0;\n    var result = true;\n\n    // add `a` and `b` to the stack of traversed objects\n    stackA.push(a);\n    stackB.push(b);\n\n    // recursively compare objects and arrays (susceptible to call stack limits)\n    if (isArr) {\n      // compare lengths to determine if a deep comparison is necessary\n      length = a.length;\n      size = b.length;\n      result = size == length;\n\n      if (result) {\n        // deep compare the contents, ignoring non-numeric properties\n        while (size--) {\n          var index = length,\n              value = b[size];\n\n          if (!(result = deepEquals(a[size], value, stackA, stackB))) {\n            break;\n          }\n        }\n      }\n    }\n    else {\n      // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\n      // which, in this case, is more costly\n      internalForIn(b, function(value, key, b) {\n        if (hasOwnProperty.call(b, key)) {\n          // count the number of properties.\n          size++;\n          // deep compare each property value.\n          return (result = hasOwnProperty.call(a, key) && deepEquals(a[key], value, stackA, stackB));\n        }\n      });\n\n      if (result) {\n        // ensure both objects have the same number of properties\n        internalForIn(a, function(value, key, a) {\n          if (hasOwnProperty.call(a, key)) {\n            // `size` will be `-1` if `a` has more properties than `b`\n            return (result = --size > -1);\n          }\n        });\n      }\n    }\n    stackA.pop();\n    stackB.pop();\n\n    return result;\n  }\n\n  var hasProp = {}.hasOwnProperty,\n      slice = Array.prototype.slice;\n\n  var inherits = this.inherits = Rx.internals.inherits = function (child, parent) {\n    function __() { this.constructor = child; }\n    __.prototype = parent.prototype;\n    child.prototype = new __();\n  };\n\n  var addProperties = Rx.internals.addProperties = function (obj) {\n    for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n      var source = sources[idx];\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n  };\n\n  // Rx Utils\n  var addRef = Rx.internals.addRef = function (xs, r) {\n    return new AnonymousObservable(function (observer) {\n      return new CompositeDisposable(r.getDisposable(), xs.subscribe(observer));\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n\n  // Utilities\n  if (!Function.prototype.bind) {\n    Function.prototype.bind = function (that) {\n      var target = this,\n        args = slice.call(arguments, 1);\n      var bound = function () {\n        if (this instanceof bound) {\n          function F() { }\n          F.prototype = target.prototype;\n          var self = new F();\n          var result = target.apply(self, args.concat(slice.call(arguments)));\n          if (Object(result) === result) {\n            return result;\n          }\n          return self;\n        } else {\n          return target.apply(that, args.concat(slice.call(arguments)));\n        }\n      };\n\n      return bound;\n    };\n  }\n\n  if (!Array.prototype.forEach) {\n    Array.prototype.forEach = function (callback, thisArg) {\n      var T, k;\n\n      if (this == null) {\n        throw new TypeError(\" this is null or not defined\");\n      }\n\n      var O = Object(this);\n      var len = O.length >>> 0;\n\n      if (typeof callback !== \"function\") {\n        throw new TypeError(callback + \" is not a function\");\n      }\n\n      if (arguments.length > 1) {\n        T = thisArg;\n      }\n\n      k = 0;\n      while (k < len) {\n        var kValue;\n        if (k in O) {\n          kValue = O[k];\n          callback.call(T, kValue, k, O);\n        }\n        k++;\n      }\n    };\n  }\n\n  var boxedString = Object(\"a\"),\n      splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n  if (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n      var object = Object(this),\n        self = splitString && {}.toString.call(this) == stringClass ?\n          this.split(\"\") :\n          object,\n        length = self.length >>> 0,\n        thisp = arguments[1];\n\n      if ({}.toString.call(fun) != funcClass) {\n        throw new TypeError(fun + \" is not a function\");\n      }\n\n      for (var i = 0; i < length; i++) {\n        if (i in self && !fun.call(thisp, self[i], i, object)) {\n          return false;\n        }\n      }\n      return true;\n    };\n  }\n\n  if (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n      var object = Object(this),\n        self = splitString && {}.toString.call(this) == stringClass ?\n            this.split(\"\") :\n            object,\n        length = self.length >>> 0,\n        result = Array(length),\n        thisp = arguments[1];\n\n      if ({}.toString.call(fun) != funcClass) {\n        throw new TypeError(fun + \" is not a function\");\n      }\n\n      for (var i = 0; i < length; i++) {\n        if (i in self) {\n          result[i] = fun.call(thisp, self[i], i, object);\n        }\n      }\n      return result;\n    };\n  }\n\n  if (!Array.prototype.filter) {\n    Array.prototype.filter = function (predicate) {\n      var results = [], item, t = new Object(this);\n      for (var i = 0, len = t.length >>> 0; i < len; i++) {\n        item = t[i];\n        if (i in t && predicate.call(arguments[1], item, i, t)) {\n          results.push(item);\n        }\n      }\n      return results;\n    };\n  }\n\n  if (!Array.isArray) {\n    Array.isArray = function (arg) {\n      return {}.toString.call(arg) == arrayClass;\n    };\n  }\n\n  if (!Array.prototype.indexOf) {\n    Array.prototype.indexOf = function indexOf(searchElement) {\n      var t = Object(this);\n      var len = t.length >>> 0;\n      if (len === 0) {\n        return -1;\n      }\n      var n = 0;\n      if (arguments.length > 1) {\n        n = Number(arguments[1]);\n        if (n !== n) {\n          n = 0;\n        } else if (n !== 0 && n != Infinity && n !== -Infinity) {\n          n = (n > 0 || -1) * Math.floor(Math.abs(n));\n        }\n      }\n      if (n >= len) {\n        return -1;\n      }\n      var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);\n      for (; k < len; k++) {\n        if (k in t && t[k] === searchElement) {\n          return k;\n        }\n      }\n      return -1;\n    };\n  }\n\n  // Fix for Tessel\n  if (!Object.prototype.propertyIsEnumerable) {\n    Object.prototype.propertyIsEnumerable = function (key) {\n      for (var k in this) { if (k === key) { return true; } }\n      return false;\n    };\n  }\n\n  if (!Object.keys) {\n    Object.keys = (function() {\n      'use strict';\n      var hasOwnProperty = Object.prototype.hasOwnProperty,\n      hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString');\n\n      return function(obj) {\n        if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n          throw new TypeError('Object.keys called on non-object');\n        }\n\n        var result = [], prop, i;\n\n        for (prop in obj) {\n          if (hasOwnProperty.call(obj, prop)) {\n            result.push(prop);\n          }\n        }\n\n        if (hasDontEnumBug) {\n          for (i = 0; i < dontEnumsLength; i++) {\n            if (hasOwnProperty.call(obj, dontEnums[i])) {\n              result.push(dontEnums[i]);\n            }\n          }\n        }\n        return result;\n      };\n    }());\n  }\n\n  // Collections\n  function IndexedItem(id, value) {\n    this.id = id;\n    this.value = value;\n  }\n\n  IndexedItem.prototype.compareTo = function (other) {\n    var c = this.value.compareTo(other.value);\n    c === 0 && (c = this.id - other.id);\n    return c;\n  };\n\n  // Priority Queue for Scheduling\n  var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) {\n    this.items = new Array(capacity);\n    this.length = 0;\n  };\n\n  var priorityProto = PriorityQueue.prototype;\n  priorityProto.isHigherPriority = function (left, right) {\n    return this.items[left].compareTo(this.items[right]) < 0;\n  };\n\n  priorityProto.percolate = function (index) {\n    if (index >= this.length || index < 0) { return; }\n    var parent = index - 1 >> 1;\n    if (parent < 0 || parent === index) { return; }\n    if (this.isHigherPriority(index, parent)) {\n      var temp = this.items[index];\n      this.items[index] = this.items[parent];\n      this.items[parent] = temp;\n      this.percolate(parent);\n    }\n  };\n\n  priorityProto.heapify = function (index) {\n    +index || (index = 0);\n    if (index >= this.length || index < 0) { return; }\n    var left = 2 * index + 1,\n        right = 2 * index + 2,\n        first = index;\n    if (left < this.length && this.isHigherPriority(left, first)) {\n      first = left;\n    }\n    if (right < this.length && this.isHigherPriority(right, first)) {\n      first = right;\n    }\n    if (first !== index) {\n      var temp = this.items[index];\n      this.items[index] = this.items[first];\n      this.items[first] = temp;\n      this.heapify(first);\n    }\n  };\n\n  priorityProto.peek = function () { return this.items[0].value; };\n\n  priorityProto.removeAt = function (index) {\n    this.items[index] = this.items[--this.length];\n    this.items[this.length] = undefined;\n    this.heapify();\n  };\n\n  priorityProto.dequeue = function () {\n    var result = this.peek();\n    this.removeAt(0);\n    return result;\n  };\n\n  priorityProto.enqueue = function (item) {\n    var index = this.length++;\n    this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n    this.percolate(index);\n  };\n\n  priorityProto.remove = function (item) {\n    for (var i = 0; i < this.length; i++) {\n      if (this.items[i].value === item) {\n        this.removeAt(i);\n        return true;\n      }\n    }\n    return false;\n  };\n  PriorityQueue.count = 0;\n\n  /**\n   * Represents a group of disposable resources that are disposed together.\n   * @constructor\n   */\n  var CompositeDisposable = Rx.CompositeDisposable = function () {\n    var args = [];\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    }\n    this.disposables = args;\n    this.isDisposed = false;\n    this.length = this.disposables.length;\n  };\n\n  var CompositeDisposablePrototype = CompositeDisposable.prototype;\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Mixed} item Disposable to add.\n   */\n  CompositeDisposablePrototype.add = function (item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n      this.length++;\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Mixed} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n  CompositeDisposablePrototype.remove = function (item) {\n    var shouldDispose = false;\n    if (!this.isDisposed) {\n      var idx = this.disposables.indexOf(item);\n      if (idx !== -1) {\n        shouldDispose = true;\n        this.disposables.splice(idx, 1);\n        this.length--;\n        item.dispose();\n      }\n    }\n    return shouldDispose;\n  };\n\n  /**\n   *  Disposes all disposables in the group and removes them from the group.\n   */\n  CompositeDisposablePrototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      for(var currentDisposables = [], i = 0, len = this.disposables.length; i < len; i++) { currentDisposables.push(this.disposables[i]); }\n      this.disposables = [];\n      this.length = 0;\n\n      for (i = 0, len = currentDisposables.length; i < len; i++) {\n        currentDisposables[i].dispose();\n      }\n    }\n  };\n\n  /**\n   * Converts the existing CompositeDisposable to an array of disposables\n   * @returns {Array} An array of disposable objects.\n   */\n  CompositeDisposablePrototype.toArray = function () {\n    for(var currentDisposables = [], ix = 0, len = this.disposables.length; i < len; i++) { currentDisposables.push(this.disposables[i]); }\n    return currentDisposables;\n  };\n\n  /**\n   * Provides a set of static methods for creating Disposables.\n   *\n   * @constructor\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   */\n  var Disposable = Rx.Disposable = function (action) {\n    this.isDisposed = false;\n    this.action = action || noop;\n  };\n\n  /** Performs the task of cleaning up resources. */\n  Disposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.action();\n      this.isDisposed = true;\n    }\n  };\n\n  /**\n   * Creates a disposable object that invokes the specified action when disposed.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   * @return {Disposable} The disposable object that runs the given action upon disposal.\n   */\n  var disposableCreate = Disposable.create = function (action) { return new Disposable(action); };\n\n  /**\n   * Gets the disposable that does nothing when disposed.\n   */\n  var disposableEmpty = Disposable.empty = { dispose: noop };\n\n  var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = (function () {\n    function BooleanDisposable () {\n      this.isDisposed = false;\n      this.current = null;\n    }\n\n    var booleanDisposablePrototype = BooleanDisposable.prototype;\n\n    /**\n     * Gets the underlying disposable.\n     * @return The underlying disposable.\n     */\n    booleanDisposablePrototype.getDisposable = function () {\n      return this.current;\n    };\n\n    /**\n     * Sets the underlying disposable.\n     * @param {Disposable} value The new underlying disposable.\n     */\n    booleanDisposablePrototype.setDisposable = function (value) {\n      var shouldDispose = this.isDisposed;\n      if (!shouldDispose) {\n        var old = this.current;\n        this.current = value;\n      }\n      old && old.dispose();\n      shouldDispose && value && value.dispose();\n    };\n\n    /**\n     * Disposes the underlying disposable as well as all future replacements.\n     */\n    booleanDisposablePrototype.dispose = function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        var old = this.current;\n        this.current = null;\n      }\n      old && old.dispose();\n    };\n\n    return BooleanDisposable;\n  }());\n  var SerialDisposable = Rx.SerialDisposable = SingleAssignmentDisposable;\n\n  /**\n   * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n   */\n  var RefCountDisposable = Rx.RefCountDisposable = (function () {\n\n    function InnerDisposable(disposable) {\n      this.disposable = disposable;\n      this.disposable.count++;\n      this.isInnerDisposed = false;\n    }\n\n    InnerDisposable.prototype.dispose = function () {\n      if (!this.disposable.isDisposed && !this.isInnerDisposed) {\n        this.isInnerDisposed = true;\n        this.disposable.count--;\n        if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {\n          this.disposable.isDisposed = true;\n          this.disposable.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Initializes a new instance of the RefCountDisposable with the specified disposable.\n     * @constructor\n     * @param {Disposable} disposable Underlying disposable.\n      */\n    function RefCountDisposable(disposable) {\n      this.underlyingDisposable = disposable;\n      this.isDisposed = false;\n      this.isPrimaryDisposed = false;\n      this.count = 0;\n    }\n\n    /**\n     * Disposes the underlying disposable only when all dependent disposables have been disposed\n     */\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed && !this.isPrimaryDisposed) {\n        this.isPrimaryDisposed = true;\n        if (this.count === 0) {\n          this.isDisposed = true;\n          this.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n     * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n     */\n    RefCountDisposable.prototype.getDisposable = function () {\n      return this.isDisposed ? disposableEmpty : new InnerDisposable(this);\n    };\n\n    return RefCountDisposable;\n  })();\n\n  function ScheduledDisposable(scheduler, disposable) {\n    this.scheduler = scheduler;\n    this.disposable = disposable;\n    this.isDisposed = false;\n  }\n\n  function scheduleItem(s, self) {\n    if (!self.isDisposed) {\n      self.isDisposed = true;\n      self.disposable.dispose();\n    }\n  }\n\n  ScheduledDisposable.prototype.dispose = function () {\n    this.scheduler.scheduleWithState(this, scheduleItem);\n  };\n\n  var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) {\n    this.scheduler = scheduler;\n    this.state = state;\n    this.action = action;\n    this.dueTime = dueTime;\n    this.comparer = comparer || defaultSubComparer;\n    this.disposable = new SingleAssignmentDisposable();\n  }\n\n  ScheduledItem.prototype.invoke = function () {\n    this.disposable.setDisposable(this.invokeCore());\n  };\n\n  ScheduledItem.prototype.compareTo = function (other) {\n    return this.comparer(this.dueTime, other.dueTime);\n  };\n\n  ScheduledItem.prototype.isCancelled = function () {\n    return this.disposable.isDisposed;\n  };\n\n  ScheduledItem.prototype.invokeCore = function () {\n    return this.action(this.scheduler, this.state);\n  };\n\n  /** Provides a set of static properties to access commonly used schedulers. */\n  var Scheduler = Rx.Scheduler = (function () {\n\n    function Scheduler(now, schedule, scheduleRelative, scheduleAbsolute) {\n      this.now = now;\n      this._schedule = schedule;\n      this._scheduleRelative = scheduleRelative;\n      this._scheduleAbsolute = scheduleAbsolute;\n    }\n\n    function invokeAction(scheduler, action) {\n      action();\n      return disposableEmpty;\n    }\n\n    var schedulerProto = Scheduler.prototype;\n\n    /**\n     * Schedules an action to be executed.\n     * @param {Function} action Action to execute.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.schedule = function (action) {\n      return this._schedule(action, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed.\n     * @param state State passed to the action to be executed.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithState = function (state, action) {\n      return this._schedule(state, action);\n    };\n\n    /**\n     * Schedules an action to be executed after the specified relative due time.\n     * @param {Function} action Action to execute.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithRelative = function (dueTime, action) {\n      return this._scheduleRelative(action, dueTime, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed after dueTime.\n     * @param state State passed to the action to be executed.\n     * @param {Function} action Action to be executed.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithRelativeAndState = function (state, dueTime, action) {\n      return this._scheduleRelative(state, dueTime, action);\n    };\n\n    /**\n     * Schedules an action to be executed at the specified absolute due time.\n     * @param {Function} action Action to execute.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n      */\n    schedulerProto.scheduleWithAbsolute = function (dueTime, action) {\n      return this._scheduleAbsolute(action, dueTime, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to be executed.\n     * @param {Number}dueTime Absolute time at which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithAbsoluteAndState = function (state, dueTime, action) {\n      return this._scheduleAbsolute(state, dueTime, action);\n    };\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.now = defaultNow;\n\n    /**\n     * Normalizes the specified TimeSpan value to a positive value.\n     * @param {Number} timeSpan The time span value to normalize.\n     * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n     */\n    Scheduler.normalize = function (timeSpan) {\n      timeSpan < 0 && (timeSpan = 0);\n      return timeSpan;\n    };\n\n    return Scheduler;\n  }());\n\n  var normalizeTime = Scheduler.normalize;\n\n  (function (schedulerProto) {\n    function invokeRecImmediate(scheduler, pair) {\n      var state = pair.first, action = pair.second, group = new CompositeDisposable(),\n      recursiveAction = function (state1) {\n        action(state1, function (state2) {\n          var isAdded = false, isDone = false,\n          d = scheduler.scheduleWithState(state2, function (scheduler1, state3) {\n            if (isAdded) {\n              group.remove(d);\n            } else {\n              isDone = true;\n            }\n            recursiveAction(state3);\n            return disposableEmpty;\n          });\n          if (!isDone) {\n            group.add(d);\n            isAdded = true;\n          }\n        });\n      };\n      recursiveAction(state);\n      return group;\n    }\n\n    function invokeRecDate(scheduler, pair, method) {\n      var state = pair.first, action = pair.second, group = new CompositeDisposable(),\n      recursiveAction = function (state1) {\n        action(state1, function (state2, dueTime1) {\n          var isAdded = false, isDone = false,\n          d = scheduler[method](state2, dueTime1, function (scheduler1, state3) {\n            if (isAdded) {\n              group.remove(d);\n            } else {\n              isDone = true;\n            }\n            recursiveAction(state3);\n            return disposableEmpty;\n          });\n          if (!isDone) {\n            group.add(d);\n            isAdded = true;\n          }\n        });\n      };\n      recursiveAction(state);\n      return group;\n    }\n\n    function scheduleInnerRecursive(action, self) {\n      action(function(dt) { self(action, dt); });\n    }\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursive = function (action) {\n      return this.scheduleRecursiveWithState(action, function (_action, self) {\n        _action(function () { self(_action); }); });\n    };\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithState = function (state, action) {\n      return this.scheduleWithState({ first: state, second: action }, invokeRecImmediate);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative due time.\n     * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified relative time.\n     * @param {Number}dueTime Relative time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithRelative = function (dueTime, action) {\n      return this.scheduleRecursiveWithRelativeAndState(action, dueTime, scheduleInnerRecursive);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number}dueTime Relative time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithRelativeAndState = function (state, dueTime, action) {\n      return this._scheduleRelative({ first: state, second: action }, dueTime, function (s, p) {\n        return invokeRecDate(s, p, 'scheduleWithRelativeAndState');\n      });\n    };\n\n    /**\n     * Schedules an action to be executed recursively at a specified absolute due time.\n     * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified absolute time.\n     * @param {Number}dueTime Absolute time at which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithAbsolute = function (dueTime, action) {\n      return this.scheduleRecursiveWithAbsoluteAndState(action, dueTime, scheduleInnerRecursive);\n    };\n\n    /**\n     * Schedules an action to be executed recursively at a specified absolute due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number}dueTime Absolute time at which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithAbsoluteAndState = function (state, dueTime, action) {\n      return this._scheduleAbsolute({ first: state, second: action }, dueTime, function (s, p) {\n        return invokeRecDate(s, p, 'scheduleWithAbsoluteAndState');\n      });\n    };\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    Scheduler.prototype.schedulePeriodic = function (period, action) {\n      return this.schedulePeriodicWithState(null, period, action);\n    };\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    Scheduler.prototype.schedulePeriodicWithState = function(state, period, action) {\n      if (typeof root.setInterval === 'undefined') { throw new Error('Periodic scheduling not supported.'); }\n      var s = state;\n\n      var id = root.setInterval(function () {\n        s = action(s);\n      }, period);\n\n      return disposableCreate(function () {\n        root.clearInterval(id);\n      });\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n    /**\n     * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n     * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n     * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n     */\n    schedulerProto.catchError = schedulerProto['catch'] = function (handler) {\n      return new CatchScheduler(this, handler);\n    };\n  }(Scheduler.prototype));\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function tick(command, recurse) {\n      recurse(0, this._period);\n      try {\n        this._state = this._action(this._state);\n      } catch (e) {\n        this._cancel.dispose();\n        throw e;\n      }\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0, this._period, tick.bind(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  /** Gets a scheduler that schedules work immediately on the current thread. */\n  var immediateScheduler = Scheduler.immediate = (function () {\n\n    function scheduleNow(state, action) { return action(this, state); }\n\n    function scheduleRelative(state, dueTime, action) {\n      var dt = this.now() + normalizeTime(dueTime);\n      while (dt - this.now() > 0) { }\n      return action(this, state);\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);\n    }\n\n    return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n  }());\n\n  /**\n   * Gets a scheduler that schedules work as soon as possible on the current thread.\n   */\n  var currentThreadScheduler = Scheduler.currentThread = (function () {\n    var queue;\n\n    function runTrampoline (q) {\n      while (q.length > 0) {\n        var item = q.dequeue();\n        if (!item.isCancelled()) {\n          // Note, do not schedule blocking work!\n          while (item.dueTime - Scheduler.now() > 0) {\n          }\n          !item.isCancelled() && item.invoke();\n        }\n      }\n    }\n\n    function scheduleNow(state, action) {\n      return this.scheduleWithRelativeAndState(state, 0, action);\n    }\n\n    function scheduleRelative(state, dueTime, action) {\n      var dt = this.now() + Scheduler.normalize(dueTime),\n          si = new ScheduledItem(this, state, action, dt);\n\n      if (!queue) {\n        queue = new PriorityQueue(4);\n        queue.enqueue(si);\n        try {\n          runTrampoline(queue);\n        } catch (e) {\n          throw e;\n        } finally {\n          queue = null;\n        }\n      } else {\n        queue.enqueue(si);\n      }\n      return si.disposable;\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);\n    }\n\n    var currentScheduler = new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n\n    currentScheduler.scheduleRequired = function () { return !queue; };\n    currentScheduler.ensureTrampoline = function (action) {\n      if (!queue) { this.schedule(action); } else { action(); }\n    };\n\n    return currentScheduler;\n  }());\n\n  var scheduleMethod, clearMethod = noop;\n  var localTimer = (function () {\n    var localSetTimeout, localClearTimeout = noop;\n    if ('WScript' in this) {\n      localSetTimeout = function (fn, time) {\n        WScript.Sleep(time);\n        fn();\n      };\n    } else if (!!root.setTimeout) {\n      localSetTimeout = root.setTimeout;\n      localClearTimeout = root.clearTimeout;\n    } else {\n      throw new Error('No concurrency detected!');\n    }\n\n    return {\n      setTimeout: localSetTimeout,\n      clearTimeout: localClearTimeout\n    };\n  }());\n  var localSetTimeout = localTimer.setTimeout,\n    localClearTimeout = localTimer.clearTimeout;\n\n  (function () {\n\n    var reNative = RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&\n      !reNative.test(setImmediate) && setImmediate,\n      clearImmediate = typeof (clearImmediate = freeGlobal && moduleExports && freeGlobal.clearImmediate) == 'function' &&\n      !reNative.test(clearImmediate) && clearImmediate;\n\n    function postMessageSupported () {\n      // Ensure not in a worker\n      if (!root.postMessage || root.importScripts) { return false; }\n      var isAsync = false,\n          oldHandler = root.onmessage;\n      // Test for async\n      root.onmessage = function () { isAsync = true; };\n      root.postMessage('', '*');\n      root.onmessage = oldHandler;\n\n      return isAsync;\n    }\n\n    // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n    if (typeof setImmediate === 'function') {\n      scheduleMethod = setImmediate;\n      clearMethod = clearImmediate;\n    } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleMethod = process.nextTick;\n    } else if (postMessageSupported()) {\n      var MSG_PREFIX = 'ms.rx.schedule' + Math.random(),\n        tasks = {},\n        taskId = 0;\n\n      var onGlobalPostMessage = function (event) {\n        // Only if we're a match to avoid any other global events\n        if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n          var handleId = event.data.substring(MSG_PREFIX.length),\n            action = tasks[handleId];\n          action();\n          delete tasks[handleId];\n        }\n      }\n\n      if (root.addEventListener) {\n        root.addEventListener('message', onGlobalPostMessage, false);\n      } else {\n        root.attachEvent('onmessage', onGlobalPostMessage, false);\n      }\n\n      scheduleMethod = function (action) {\n        var currentId = taskId++;\n        tasks[currentId] = action;\n        root.postMessage(MSG_PREFIX + currentId, '*');\n      };\n    } else if (!!root.MessageChannel) {\n      var channel = new root.MessageChannel(),\n        channelTasks = {},\n        channelTaskId = 0;\n\n      channel.port1.onmessage = function (event) {\n        var id = event.data,\n          action = channelTasks[id];\n        action();\n        delete channelTasks[id];\n      };\n\n      scheduleMethod = function (action) {\n        var id = channelTaskId++;\n        channelTasks[id] = action;\n        channel.port2.postMessage(id);\n      };\n    } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {\n\n      scheduleMethod = function (action) {\n        var scriptElement = root.document.createElement('script');\n        scriptElement.onreadystatechange = function () {\n          action();\n          scriptElement.onreadystatechange = null;\n          scriptElement.parentNode.removeChild(scriptElement);\n          scriptElement = null;\n        };\n        root.document.documentElement.appendChild(scriptElement);\n      };\n\n    } else {\n      scheduleMethod = function (action) { return localSetTimeout(action, 0); };\n      clearMethod = localClearTimeout;\n    }\n  }());\n\n  /**\n   * Gets a scheduler that schedules work via a timed callback based upon platform.\n   */\n  var timeoutScheduler = Scheduler.timeout = (function () {\n\n    function scheduleNow(state, action) {\n      var scheduler = this,\n        disposable = new SingleAssignmentDisposable();\n      var id = scheduleMethod(function () {\n        if (!disposable.isDisposed) {\n          disposable.setDisposable(action(scheduler, state));\n        }\n      });\n      return new CompositeDisposable(disposable, disposableCreate(function () {\n        clearMethod(id);\n      }));\n    }\n\n    function scheduleRelative(state, dueTime, action) {\n      var scheduler = this,\n        dt = Scheduler.normalize(dueTime);\n      if (dt === 0) {\n        return scheduler.scheduleWithState(state, action);\n      }\n      var disposable = new SingleAssignmentDisposable();\n      var id = localSetTimeout(function () {\n        if (!disposable.isDisposed) {\n          disposable.setDisposable(action(scheduler, state));\n        }\n      }, dt);\n      return new CompositeDisposable(disposable, disposableCreate(function () {\n        localClearTimeout(id);\n      }));\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);\n    }\n\n    return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n  })();\n\n  var CatchScheduler = (function (__super__) {\n\n    function scheduleNow(state, action) {\n      return this._scheduler.scheduleWithState(state, this._wrap(action));\n    }\n\n    function scheduleRelative(state, dueTime, action) {\n      return this._scheduler.scheduleWithRelativeAndState(state, dueTime, this._wrap(action));\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this._scheduler.scheduleWithAbsoluteAndState(state, dueTime, this._wrap(action));\n    }\n\n    inherits(CatchScheduler, __super__);\n\n    function CatchScheduler(scheduler, handler) {\n      this._scheduler = scheduler;\n      this._handler = handler;\n      this._recursiveOriginal = null;\n      this._recursiveWrapper = null;\n      __super__.call(this, this._scheduler.now.bind(this._scheduler), scheduleNow, scheduleRelative, scheduleAbsolute);\n    }\n\n    CatchScheduler.prototype._clone = function (scheduler) {\n        return new CatchScheduler(scheduler, this._handler);\n    };\n\n    CatchScheduler.prototype._wrap = function (action) {\n      var parent = this;\n      return function (self, state) {\n        try {\n          return action(parent._getRecursiveWrapper(self), state);\n        } catch (e) {\n          if (!parent._handler(e)) { throw e; }\n          return disposableEmpty;\n        }\n      };\n    };\n\n    CatchScheduler.prototype._getRecursiveWrapper = function (scheduler) {\n      if (this._recursiveOriginal !== scheduler) {\n        this._recursiveOriginal = scheduler;\n        var wrapper = this._clone(scheduler);\n        wrapper._recursiveOriginal = scheduler;\n        wrapper._recursiveWrapper = wrapper;\n        this._recursiveWrapper = wrapper;\n      }\n      return this._recursiveWrapper;\n    };\n\n    CatchScheduler.prototype.schedulePeriodicWithState = function (state, period, action) {\n      var self = this, failed = false, d = new SingleAssignmentDisposable();\n\n      d.setDisposable(this._scheduler.schedulePeriodicWithState(state, period, function (state1) {\n        if (failed) { return null; }\n        try {\n          return action(state1);\n        } catch (e) {\n          failed = true;\n          if (!self._handler(e)) { throw e; }\n          d.dispose();\n          return null;\n        }\n      }));\n\n      return d;\n    };\n\n    return CatchScheduler;\n  }(Scheduler));\n\n  /**\n   *  Represents a notification to an observer.\n   */\n  var Notification = Rx.Notification = (function () {\n    function Notification(kind, hasValue) {\n      this.hasValue = hasValue == null ? false : hasValue;\n      this.kind = kind;\n    }\n\n    /**\n     * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n     *\n     * @memberOf Notification\n     * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n     * @param {Function} onError Delegate to invoke for an OnError notification.\n     * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n     * @returns {Any} Result produced by the observation.\n     */\n    Notification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n      return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n        this._acceptObservable(observerOrOnNext) :\n        this._accept(observerOrOnNext, onError, onCompleted);\n    };\n\n    /**\n     * Returns an observable sequence with a single notification.\n     *\n     * @memberOf Notifications\n     * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n     * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n     */\n    Notification.prototype.toObservable = function (scheduler) {\n      var notification = this;\n      isScheduler(scheduler) || (scheduler = immediateScheduler);\n      return new AnonymousObservable(function (observer) {\n        return scheduler.schedule(function () {\n          notification._acceptObservable(observer);\n          notification.kind === 'N' && observer.onCompleted();\n        });\n      });\n    };\n\n    return Notification;\n  })();\n\n  /**\n   * Creates an object that represents an OnNext notification to an observer.\n   * @param {Any} value The value contained in the notification.\n   * @returns {Notification} The OnNext notification containing the value.\n   */\n  var notificationCreateOnNext = Notification.createOnNext = (function () {\n\n      function _accept (onNext) { return onNext(this.value); }\n      function _acceptObservable(observer) { return observer.onNext(this.value); }\n      function toString () { return 'OnNext(' + this.value + ')'; }\n\n      return function (value) {\n        var notification = new Notification('N', true);\n        notification.value = value;\n        notification._accept = _accept;\n        notification._acceptObservable = _acceptObservable;\n        notification.toString = toString;\n        return notification;\n      };\n  }());\n\n  /**\n   * Creates an object that represents an OnError notification to an observer.\n   * @param {Any} error The exception contained in the notification.\n   * @returns {Notification} The OnError notification containing the exception.\n   */\n  var notificationCreateOnError = Notification.createOnError = (function () {\n\n    function _accept (onNext, onError) { return onError(this.exception); }\n    function _acceptObservable(observer) { return observer.onError(this.exception); }\n    function toString () { return 'OnError(' + this.exception + ')'; }\n\n    return function (e) {\n      var notification = new Notification('E');\n      notification.exception = e;\n      notification._accept = _accept;\n      notification._acceptObservable = _acceptObservable;\n      notification.toString = toString;\n      return notification;\n    };\n  }());\n\n  /**\n   * Creates an object that represents an OnCompleted notification to an observer.\n   * @returns {Notification} The OnCompleted notification.\n   */\n  var notificationCreateOnCompleted = Notification.createOnCompleted = (function () {\n\n    function _accept (onNext, onError, onCompleted) { return onCompleted(); }\n    function _acceptObservable(observer) { return observer.onCompleted(); }\n    function toString () { return 'OnCompleted()'; }\n\n    return function () {\n      var notification = new Notification('C');\n      notification._accept = _accept;\n      notification._acceptObservable = _acceptObservable;\n      notification.toString = toString;\n      return notification;\n    };\n  }());\n\n  var Enumerator = Rx.internals.Enumerator = function (next) {\n    this._next = next;\n  };\n\n  Enumerator.prototype.next = function () {\n    return this._next();\n  };\n\n  Enumerator.prototype[$iterator$] = function () { return this; }\n\n  var Enumerable = Rx.internals.Enumerable = function (iterator) {\n    this._iterator = iterator;\n  };\n\n  Enumerable.prototype[$iterator$] = function () {\n    return this._iterator();\n  };\n\n  Enumerable.prototype.concat = function () {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var e = sources[$iterator$]();\n\n      var isDisposed, subscription = new SerialDisposable();\n      var cancelable = immediateScheduler.scheduleRecursive(function (self) {\n        if (isDisposed) { return; }\n        try {\n          var currentItem = e.next();\n        } catch (ex) {\n          return o.onError(ex);\n        }\n\n        if (currentItem.done) {\n          return o.onCompleted();\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var d = new SingleAssignmentDisposable();\n        subscription.setDisposable(d);\n        d.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function(err) { o.onError(err); },\n          self)\n        );\n      });\n\n      return new CompositeDisposable(subscription, cancelable, disposableCreate(function () {\n        isDisposed = true;\n      }));\n    });\n  };\n\n  Enumerable.prototype.catchError = function () {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var e = sources[$iterator$]();\n\n      var isDisposed, subscription = new SerialDisposable();\n      var cancelable = immediateScheduler.scheduleRecursiveWithState(null, function (lastException, self) {\n        if (isDisposed) { return; }\n\n        try {\n          var currentItem = e.next();\n        } catch (ex) {\n          return observer.onError(ex);\n        }\n\n        if (currentItem.done) {\n          if (lastException !== null) {\n            o.onError(lastException);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var d = new SingleAssignmentDisposable();\n        subscription.setDisposable(d);\n        d.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          self,\n          function() { o.onCompleted(); }));\n      });\n      return new CompositeDisposable(subscription, cancelable, disposableCreate(function () {\n        isDisposed = true;\n      }));\n    });\n  };\n\n\n  Enumerable.prototype.catchErrorWhen = function (notificationHandler) {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var exceptions = new Subject(),\n        notifier = new Subject(),\n        handled = notificationHandler(exceptions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = sources[$iterator$]();\n\n      var isDisposed,\n        lastException,\n        subscription = new SerialDisposable();\n      var cancelable = immediateScheduler.scheduleRecursive(function (self) {\n        if (isDisposed) { return; }\n\n        try {\n          var currentItem = e.next();\n        } catch (ex) {\n          return o.onError(ex);\n        }\n\n        if (currentItem.done) {\n          if (lastException) {\n            o.onError(lastException);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new CompositeDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) {\n            inner.setDisposable(notifier.subscribe(self, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            exceptions.onNext(exn);\n          },\n          function() { o.onCompleted(); }));\n      });\n\n      return new CompositeDisposable(notificationDisposable, subscription, cancelable, disposableCreate(function () {\n        isDisposed = true;\n      }));\n    });\n  };\n\n  var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) {\n    if (repeatCount == null) { repeatCount = -1; }\n    return new Enumerable(function () {\n      var left = repeatCount;\n      return new Enumerator(function () {\n        if (left === 0) { return doneEnumerator; }\n        if (left > 0) { left--; }\n        return { done: false, value: value };\n      });\n    });\n  };\n\n  var enumerableOf = Enumerable.of = function (source, selector, thisArg) {\n    if (selector) {\n      var selectorFn = bindCallback(selector, thisArg, 3);\n    }\n    return new Enumerable(function () {\n      var index = -1;\n      return new Enumerator(\n        function () {\n          return ++index < source.length ?\n            { done: false, value: !selector ? source[index] : selectorFn(source[index], index, source) } :\n            doneEnumerator;\n        });\n    });\n  };\n\n  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates a notification callback from an observer.\n   * @returns The action that forwards its input notification to the underlying observer.\n   */\n  Observer.prototype.toNotifier = function () {\n    var observer = this;\n    return function (n) { return n.accept(observer); };\n  };\n\n  /**\n   *  Hides the identity of an observer.\n   * @returns An observer that hides the identity of the specified observer.\n   */\n  Observer.prototype.asObserver = function () {\n    return new AnonymousObserver(this.onNext.bind(this), this.onError.bind(this), this.onCompleted.bind(this));\n  };\n\n  /**\n   *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n   *  If a violation is detected, an Error is thrown from the offending observer method call.\n   * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n   */\n  Observer.prototype.checked = function () { return new CheckedObserver(this); };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n\n  /**\n   *  Creates an observer from a notification callback.\n   *\n   * @static\n   * @memberOf Observer\n   * @param {Function} handler Action that handles a notification.\n   * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n   */\n  Observer.fromNotifier = function (handler, thisArg) {\n    return new AnonymousObserver(function (x) {\n      return handler.call(thisArg, notificationCreateOnNext(x));\n    }, function (e) {\n      return handler.call(thisArg, notificationCreateOnError(e));\n    }, function () {\n      return handler.call(thisArg, notificationCreateOnCompleted());\n    });\n  };\n\n  /**\n   * Schedules the invocation of observer methods on the given scheduler.\n   * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n   * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n   */\n  Observer.prototype.notifyOn = function (scheduler) {\n    return new ObserveOnObserver(scheduler, this);\n  };\n\n  Observer.prototype.makeSafe = function(disposable) {\n    return new AnonymousSafeObserver(this._onNext, this._onError, this._onCompleted, disposable);\n  };\n\n  /**\n   * Abstract base class for implementations of the Observer class.\n   * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n   */\n  var AbstractObserver = Rx.internals.AbstractObserver = (function (__super__) {\n    inherits(AbstractObserver, __super__);\n\n    /**\n     * Creates a new observer in a non-stopped state.\n     */\n    function AbstractObserver() {\n      this.isStopped = false;\n      __super__.call(this);\n    }\n\n    /**\n     * Notifies the observer of a new element in the sequence.\n     * @param {Any} value Next element in the sequence.\n     */\n    AbstractObserver.prototype.onNext = function (value) {\n      if (!this.isStopped) { this.next(value); }\n    };\n\n    /**\n     * Notifies the observer that an exception has occurred.\n     * @param {Any} error The error that has occurred.\n     */\n    AbstractObserver.prototype.onError = function (error) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(error);\n      }\n    };\n\n    /**\n     * Notifies the observer of the end of the sequence.\n     */\n    AbstractObserver.prototype.onCompleted = function () {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.completed();\n      }\n    };\n\n    /**\n     * Disposes the observer, causing it to transition to the stopped state.\n     */\n    AbstractObserver.prototype.dispose = function () {\n      this.isStopped = true;\n    };\n\n    AbstractObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return AbstractObserver;\n  }(Observer));\n\n  /**\n   * Class to create an Observer instance from delegate-based implementations of the on* methods.\n   */\n  var AnonymousObserver = Rx.AnonymousObserver = (function (__super__) {\n    inherits(AnonymousObserver, __super__);\n\n    /**\n     * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n     * @param {Any} onNext Observer's OnNext action implementation.\n     * @param {Any} onError Observer's OnError action implementation.\n     * @param {Any} onCompleted Observer's OnCompleted action implementation.\n     */\n    function AnonymousObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    /**\n     * Calls the onNext action.\n     * @param {Any} value Next element in the sequence.\n     */\n    AnonymousObserver.prototype.next = function (value) {\n      this._onNext(value);\n    };\n\n    /**\n     * Calls the onError action.\n     * @param {Any} error The error that has occurred.\n     */\n    AnonymousObserver.prototype.error = function (error) {\n      this._onError(error);\n    };\n\n    /**\n     *  Calls the onCompleted action.\n     */\n    AnonymousObserver.prototype.completed = function () {\n      this._onCompleted();\n    };\n\n    return AnonymousObserver;\n  }(AbstractObserver));\n\n    var CheckedObserver = (function (_super) {\n        inherits(CheckedObserver, _super);\n\n        function CheckedObserver(observer) {\n            _super.call(this);\n            this._observer = observer;\n            this._state = 0; // 0 - idle, 1 - busy, 2 - done\n        }\n\n        var CheckedObserverPrototype = CheckedObserver.prototype;\n\n        CheckedObserverPrototype.onNext = function (value) {\n            this.checkAccess();\n            try {\n                this._observer.onNext(value);\n            } catch (e) {\n                throw e;\n            } finally {\n                this._state = 0;\n            }\n        };\n\n        CheckedObserverPrototype.onError = function (err) {\n            this.checkAccess();\n            try {\n                this._observer.onError(err);\n            } catch (e) {\n                throw e;\n            } finally {\n                this._state = 2;\n            }\n        };\n\n        CheckedObserverPrototype.onCompleted = function () {\n            this.checkAccess();\n            try {\n                this._observer.onCompleted();\n            } catch (e) {\n                throw e;\n            } finally {\n                this._state = 2;\n            }\n        };\n\n        CheckedObserverPrototype.checkAccess = function () {\n            if (this._state === 1) { throw new Error('Re-entrancy detected'); }\n            if (this._state === 2) { throw new Error('Observer completed'); }\n            if (this._state === 0) { this._state = 1; }\n        };\n\n        return CheckedObserver;\n    }(Observer));\n\n  var ScheduledObserver = Rx.internals.ScheduledObserver = (function (__super__) {\n    inherits(ScheduledObserver, __super__);\n\n    function ScheduledObserver(scheduler, observer) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.observer = observer;\n      this.isAcquired = false;\n      this.hasFaulted = false;\n      this.queue = [];\n      this.disposable = new SerialDisposable();\n    }\n\n    ScheduledObserver.prototype.next = function (value) {\n      var self = this;\n      this.queue.push(function () { self.observer.onNext(value); });\n    };\n\n    ScheduledObserver.prototype.error = function (e) {\n      var self = this;\n      this.queue.push(function () { self.observer.onError(e); });\n    };\n\n    ScheduledObserver.prototype.completed = function () {\n      var self = this;\n      this.queue.push(function () { self.observer.onCompleted(); });\n    };\n\n    ScheduledObserver.prototype.ensureActive = function () {\n      var isOwner = false, parent = this;\n      if (!this.hasFaulted && this.queue.length > 0) {\n        isOwner = !this.isAcquired;\n        this.isAcquired = true;\n      }\n      if (isOwner) {\n        this.disposable.setDisposable(this.scheduler.scheduleRecursive(function (self) {\n          var work;\n          if (parent.queue.length > 0) {\n            work = parent.queue.shift();\n          } else {\n            parent.isAcquired = false;\n            return;\n          }\n          try {\n            work();\n          } catch (ex) {\n            parent.queue = [];\n            parent.hasFaulted = true;\n            throw ex;\n          }\n          self();\n        }));\n      }\n    };\n\n    ScheduledObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.disposable.dispose();\n    };\n\n    return ScheduledObserver;\n  }(AbstractObserver));\n\n  var ObserveOnObserver = (function (__super__) {\n    inherits(ObserveOnObserver, __super__);\n\n    function ObserveOnObserver(scheduler, observer, cancel) {\n      __super__.call(this, scheduler, observer);\n      this._cancel = cancel;\n    }\n\n    ObserveOnObserver.prototype.next = function (value) {\n      __super__.prototype.next.call(this, value);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.error = function (e) {\n      __super__.prototype.error.call(this, e);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.completed = function () {\n      __super__.prototype.completed.call(this);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this._cancel && this._cancel.dispose();\n      this._cancel = null;\n    };\n\n    return ObserveOnObserver;\n  })(ScheduledObserver);\n\n  var observableProto;\n\n  /**\n   * Represents a push-style collection.\n   */\n  var Observable = Rx.Observable = (function () {\n\n    function Observable(subscribe) {\n      if (Rx.config.longStackSupport && hasStacks) {\n        try {\n          throw new Error();\n        } catch (e) {\n          this.stack = e.stack.substring(e.stack.indexOf(\"\\n\") + 1);\n        }\n\n        var self = this;\n        this._subscribe = function (observer) {\n          var oldOnError = observer.onError.bind(observer);\n\n          observer.onError = function (err) {\n            makeStackTraceLong(err, self);\n            oldOnError(err);\n          };\n\n          return subscribe.call(self, observer);\n        };\n      } else {\n        this._subscribe = subscribe;\n      }\n    }\n\n    observableProto = Observable.prototype;\n\n    /**\n     *  Subscribes an observer to the observable sequence.\n     *  @param {Mixed} [observerOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n     *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n     *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n     *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribe = observableProto.forEach = function (observerOrOnNext, onError, onCompleted) {\n      return this._subscribe(typeof observerOrOnNext === 'object' ?\n        observerOrOnNext :\n        observerCreate(observerOrOnNext, onError, onCompleted));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onNext The function to invoke on each element in the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnNext = function (onNext, thisArg) {\n      return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n    };\n\n    /**\n     * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n     * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnError = function (onError, thisArg) {\n      return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnCompleted = function (onCompleted, thisArg) {\n      return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n    };\n\n    return Observable;\n  })();\n\n  var ObservableBase = Rx.ObservableBase = (function (__super__) {\n\n  inherits(ObservableBase, __super__);\n\n  // Fix subscriber to check for undefined or function returned to decorate as Disposable\n  function fixSubscriber(subscriber) {\n    if (subscriber && typeof subscriber.dispose === 'function') { return subscriber; }\n\n      return typeof subscriber === 'function' ?\n        disposableCreate(subscriber) :\n        disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      try {\n        ado.setDisposable(fixSubscriber(self.subscribeCore(ado)));\n      } catch (e) {\n        if (!ado.fail(e)) { throw e; }\n      }\n    }\n\n    function subscribe(observer) {\n      var ado = new AutoDetachObserver(observer), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.scheduleWithState(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n\n      return ado;\n    }\n\n    function ObservableBase() {\n      __super__.call(this, subscribe);\n    }\n\n    ObservableBase.prototype.subscribeCore = function(observer) {\n      throw new Error('Not implemeneted');\n    }\n\n    return ObservableBase;\n\n  }(Observable));\n\n   /**\n   *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n   *\n   *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n   *  that require to be run on a scheduler, use subscribeOn.\n   *\n   *  @param {Scheduler} scheduler Scheduler to notify observers on.\n   *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n   */\n  observableProto.observeOn = function (scheduler) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      return source.subscribe(new ObserveOnObserver(scheduler, observer));\n    }, source);\n  };\n\n   /**\n   *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n   *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n   *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n   *  callbacks on a scheduler, use observeOn.\n\n   *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n   *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n   */\n  observableProto.subscribeOn = function (scheduler) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(), d = new SerialDisposable();\n      d.setDisposable(m);\n      m.setDisposable(scheduler.schedule(function () {\n        d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(observer)));\n      }));\n      return d;\n    }, source);\n  };\n\n  /**\n   * Converts a Promise to an Observable sequence\n   * @param {Promise} An ES6 Compliant promise.\n   * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n   */\n  var observableFromPromise = Observable.fromPromise = function (promise) {\n    return observableDefer(function () {\n      var subject = new Rx.AsyncSubject();\n\n      promise.then(\n        function (value) {\n          subject.onNext(value);\n          subject.onCompleted();\n        },\n        subject.onError.bind(subject));\n\n      return subject;\n    });\n  };\n\n  /*\n   * Converts an existing observable sequence to an ES6 Compatible Promise\n   * @example\n   * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n   *\n   * // With config\n   * Rx.config.Promise = RSVP.Promise;\n   * var promise = Rx.Observable.return(42).toPromise();\n   * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n   * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n   */\n  observableProto.toPromise = function (promiseCtor) {\n    promiseCtor || (promiseCtor = Rx.config.Promise);\n    if (!promiseCtor) { throw new TypeError('Promise type not provided nor in Rx.config.Promise'); }\n    var source = this;\n    return new promiseCtor(function (resolve, reject) {\n      // No cancellation can be done\n      var value, hasValue = false;\n      source.subscribe(function (v) {\n        value = v;\n        hasValue = true;\n      }, reject, function () {\n        hasValue && resolve(value);\n      });\n    });\n  };\n\n  /**\n   * Creates an array from an observable sequence.\n   * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n   */\n  observableProto.toArray = function () {\n    var source = this;\n    return new AnonymousObservable(function(observer) {\n      var arr = [];\n      return source.subscribe(\n        function (x) { arr.push(x); },\n        function (e) { observer.onError(e); },\n        function () {\n          observer.onNext(arr);\n          observer.onCompleted();\n        });\n    }, source);\n  };\n\n  /**\n   *  Creates an observable sequence from a specified subscribe method implementation.\n   * @example\n   *  var res = Rx.Observable.create(function (observer) { return function () { } );\n   *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n   *  var res = Rx.Observable.create(function (observer) { } );\n   * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n   * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n   */\n  Observable.create = Observable.createWithDisposable = function (subscribe, parent) {\n    return new AnonymousObservable(subscribe, parent);\n  };\n\n  /**\n   *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n   *\n   * @example\n   *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n   * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n   * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n   */\n  var observableDefer = Observable.defer = function (observableFactory) {\n    return new AnonymousObservable(function (observer) {\n      var result;\n      try {\n        result = observableFactory();\n      } catch (e) {\n        return observableThrow(e).subscribe(observer);\n      }\n      isPromise(result) && (result = observableFromPromise(result));\n      return result.subscribe(observer);\n    });\n  };\n\n  /**\n   *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n   *\n   * @example\n   *  var res = Rx.Observable.empty();\n   *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n   * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n   * @returns {Observable} An observable sequence with no elements.\n   */\n  var observableEmpty = Observable.empty = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.schedule(function () {\n        observer.onCompleted();\n      });\n    });\n  };\n\n  var maxSafeInteger = Math.pow(2, 53) - 1;\n\n  function StringIterable(str) {\n    this._s = s;\n  }\n\n  StringIterable.prototype[$iterator$] = function () {\n    return new StringIterator(this._s);\n  };\n\n  function StringIterator(str) {\n    this._s = s;\n    this._l = s.length;\n    this._i = 0;\n  }\n\n  StringIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  StringIterator.prototype.next = function () {\n    if (this._i < this._l) {\n      var val = this._s.charAt(this._i++);\n      return { done: false, value: val };\n    } else {\n      return doneEnumerator;\n    }\n  };\n\n  function ArrayIterable(a) {\n    this._a = a;\n  }\n\n  ArrayIterable.prototype[$iterator$] = function () {\n    return new ArrayIterator(this._a);\n  };\n\n  function ArrayIterator(a) {\n    this._a = a;\n    this._l = toLength(a);\n    this._i = 0;\n  }\n\n  ArrayIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  ArrayIterator.prototype.next = function () {\n    if (this._i < this._l) {\n      var val = this._a[this._i++];\n      return { done: false, value: val };\n    } else {\n      return doneEnumerator;\n    }\n  };\n\n  function numberIsFinite(value) {\n    return typeof value === 'number' && root.isFinite(value);\n  }\n\n  function isNan(n) {\n    return n !== n;\n  }\n\n  function getIterable(o) {\n    var i = o[$iterator$], it;\n    if (!i && typeof o === 'string') {\n      it = new StringIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i && o.length !== undefined) {\n      it = new ArrayIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i) { throw new TypeError('Object is not iterable'); }\n    return o[$iterator$]();\n  }\n\n  function sign(value) {\n    var number = +value;\n    if (number === 0) { return number; }\n    if (isNaN(number)) { return number; }\n    return number < 0 ? -1 : 1;\n  }\n\n  function toLength(o) {\n    var len = +o.length;\n    if (isNaN(len)) { return 0; }\n    if (len === 0 || !numberIsFinite(len)) { return len; }\n    len = sign(len) * Math.floor(Math.abs(len));\n    if (len <= 0) { return 0; }\n    if (len > maxSafeInteger) { return maxSafeInteger; }\n    return len;\n  }\n\n  /**\n   * This method creates a new Observable sequence from an array-like or iterable object.\n   * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n   * @param {Function} [mapFn] Map function to call on every element of the array.\n   * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n   * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n   */\n  var observableFrom = Observable.from = function (iterable, mapFn, thisArg, scheduler) {\n    if (iterable == null) {\n      throw new Error('iterable cannot be null.')\n    }\n    if (mapFn && !isFunction(mapFn)) {\n      throw new Error('mapFn when provided must be a function');\n    }\n    if (mapFn) {\n      var mapper = bindCallback(mapFn, thisArg, 2);\n    }\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    var list = Object(iterable), it = getIterable(list);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleRecursiveWithState(0, function (i, self) {\n        try {\n          var next = it.next();\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n        if (next.done) {\n          observer.onCompleted();\n          return;\n        }\n\n        var result = next.value;\n\n        if (mapper) {\n          try {\n            result = mapper(result, i);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n        }\n\n        observer.onNext(result);\n        self(i + 1);\n      });\n    });\n  };\n\n  var FromArrayObservable = (function(__super__) {\n    inherits(FromArrayObservable, __super__);\n    function FromArrayObservable(args, scheduler) {\n      this.args = args;\n      this.scheduler = scheduler || currentThreadScheduler;\n      __super__.call(this);\n    }\n\n    FromArrayObservable.prototype.subscribeCore = function (observer) {\n      var sink = new FromArraySink(observer, this);\n      return sink.run();\n    };\n\n    return FromArrayObservable;\n  }(ObservableBase));\n\n  var FromArraySink = (function () {\n    function FromArraySink(observer, parent) {\n      this.observer = observer;\n      this.parent = parent;\n    }\n\n    function loopRecursive(state, recurse) {\n      if (state.i < state.len) {\n        state.observer.onNext(state.args[state.i++]);\n        recurse(state);\n      } else {\n        state.observer.onCompleted();\n      }\n    }\n\n    FromArraySink.prototype.run = function () {\n      return this.parent.scheduler.scheduleRecursiveWithState(\n        {i: 0, args: this.parent.args, len: this.parent.args.length, observer: this.observer },\n        loopRecursive);\n    };\n\n    return FromArraySink;\n  }());\n\n  /**\n  *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n  * @deprecated use Observable.from or Observable.of\n  * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n  */\n  var observableFromArray = Observable.fromArray = function (array, scheduler) {\n    return new FromArrayObservable(array, scheduler)\n  };\n\n  /**\n   *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new AnonymousObservable(function (observer) {\n      var first = true, state = initialState;\n      return scheduler.scheduleRecursive(function (self) {\n        var hasResult, result;\n        try {\n          if (first) {\n            first = false;\n          } else {\n            state = iterate(state);\n          }\n          hasResult = condition(state);\n          if (hasResult) {\n            result = resultSelector(state);\n          }\n        } catch (exception) {\n          observer.onError(exception);\n          return;\n        }\n        if (hasResult) {\n          observer.onNext(result);\n          self();\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  function observableOf (scheduler, array) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new AnonymousObservable(function (observer) {\n      var count = 0, len = array.length;\n      return scheduler.scheduleRecursive(function (self) {\n        if (count < len) {\n          observer.onNext(array[count++]);\n          self();\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  }\n\n  /**\n   *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n   * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n   */\n  Observable.of = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableOf(null, args);\n  };\n\n  /**\n   *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n   * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n   * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n   */\n  Observable.ofWithScheduler = function (scheduler) {\n    for(var args = [], i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableOf(scheduler, args);\n  };\n\n  /**\n   *  Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n   * @returns {Observable} An observable sequence whose observers will never get called.\n   */\n  var observableNever = Observable.never = function () {\n    return new AnonymousObservable(function () {\n      return disposableEmpty;\n    });\n  };\n\n  /**\n   * Convert an object into an observable sequence of [key, value] pairs.\n   * @param {Object} obj The object to inspect.\n   * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n   * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n   */\n  Observable.pairs = function (obj, scheduler) {\n    scheduler || (scheduler = Rx.Scheduler.currentThread);\n    return new AnonymousObservable(function (observer) {\n      var keys = Object.keys(obj), len = keys.length;\n      return scheduler.scheduleRecursiveWithState(0, function (idx, self) {\n        if (idx < len) {\n          var key = keys[idx];\n          observer.onNext([key, obj[key]]);\n          self(idx + 1);\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.range(0, 10);\n   *  var res = Rx.Observable.range(0, 10, Rx.Scheduler.timeout);\n   * @param {Number} start The value of the first integer in the sequence.\n   * @param {Number} count The number of sequential integers to generate.\n   * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n   * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n   */\n  Observable.range = function (start, count, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleRecursiveWithState(0, function (i, self) {\n        if (i < count) {\n          observer.onNext(start + i);\n          self(i + 1);\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.repeat(42);\n   *  var res = Rx.Observable.repeat(42, 4);\n   *  3 - res = Rx.Observable.repeat(42, 4, Rx.Scheduler.timeout);\n   *  4 - res = Rx.Observable.repeat(42, null, Rx.Scheduler.timeout);\n   * @param {Mixed} value Element to repeat.\n   * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n   * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n   */\n  Observable.repeat = function (value, repeatCount, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return observableReturn(value, scheduler).repeat(repeatCount == null ? -1 : repeatCount);\n  };\n\n  /**\n   *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n   *  There is an alias called 'just', and 'returnValue' for browsers <IE9.\n   * @param {Mixed} value Single element in the resulting observable sequence.\n   * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence containing the single specified element.\n   */\n  var observableReturn = Observable['return'] = Observable.just = function (value, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.schedule(function () {\n        observer.onNext(value);\n        observer.onCompleted();\n      });\n    });\n  };\n\n  /** @deprecated use return or just */\n  Observable.returnValue = function () {\n    //deprecate('returnValue', 'return or just');\n    return observableReturn.apply(null, arguments);\n  };\n\n  /**\n   *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n   *  There is an alias to this method called 'throwError' for browsers <IE9.\n   * @param {Mixed} error An object used for the sequence's termination.\n   * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n   */\n  var observableThrow = Observable['throw'] = Observable.throwError = function (error, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.schedule(function () {\n        observer.onError(error);\n      });\n    });\n  };\n\n  /** @deprecated use #some instead */\n  Observable.throwException = function () {\n    //deprecate('throwException', 'throwError');\n    return Observable.throwError.apply(null, arguments);\n  };\n\n  /**\n   * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n   * @param {Function} resourceFactory Factory function to obtain a resource object.\n   * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n   * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n   */\n  Observable.using = function (resourceFactory, observableFactory) {\n    return new AnonymousObservable(function (observer) {\n      var disposable = disposableEmpty, resource, source;\n      try {\n        resource = resourceFactory();\n        resource && (disposable = resource);\n        source = observableFactory(resource);\n      } catch (exception) {\n        return new CompositeDisposable(observableThrow(exception).subscribe(observer), disposable);\n      }\n      return new CompositeDisposable(source.subscribe(observer), disposable);\n    });\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @param {Observable} rightSource Second observable sequence or Promise.\n   * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n   */\n  observableProto.amb = function (rightSource) {\n    var leftSource = this;\n    return new AnonymousObservable(function (observer) {\n      var choice,\n        leftChoice = 'L', rightChoice = 'R',\n        leftSubscription = new SingleAssignmentDisposable(),\n        rightSubscription = new SingleAssignmentDisposable();\n\n      isPromise(rightSource) && (rightSource = observableFromPromise(rightSource));\n\n      function choiceL() {\n        if (!choice) {\n          choice = leftChoice;\n          rightSubscription.dispose();\n        }\n      }\n\n      function choiceR() {\n        if (!choice) {\n          choice = rightChoice;\n          leftSubscription.dispose();\n        }\n      }\n\n      leftSubscription.setDisposable(leftSource.subscribe(function (left) {\n        choiceL();\n        if (choice === leftChoice) {\n          observer.onNext(left);\n        }\n      }, function (err) {\n        choiceL();\n        if (choice === leftChoice) {\n          observer.onError(err);\n        }\n      }, function () {\n        choiceL();\n        if (choice === leftChoice) {\n          observer.onCompleted();\n        }\n      }));\n\n      rightSubscription.setDisposable(rightSource.subscribe(function (right) {\n        choiceR();\n        if (choice === rightChoice) {\n          observer.onNext(right);\n        }\n      }, function (err) {\n        choiceR();\n        if (choice === rightChoice) {\n          observer.onError(err);\n        }\n      }, function () {\n        choiceR();\n        if (choice === rightChoice) {\n          observer.onCompleted();\n        }\n      }));\n\n      return new CompositeDisposable(leftSubscription, rightSubscription);\n    });\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   *\n   * @example\n   * var = Rx.Observable.amb(xs, ys, zs);\n   * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n   */\n  Observable.amb = function () {\n    var acc = observableNever(), items = [];\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { items.push(arguments[i]); }\n    }\n\n    function func(previous, current) {\n      return previous.amb(current);\n    }\n    for (var i = 0, len = items.length; i < len; i++) {\n      acc = func(acc, items[i]);\n    }\n    return acc;\n  };\n\n  function observableCatchHandler(source, handler) {\n    return new AnonymousObservable(function (observer) {\n      var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();\n      subscription.setDisposable(d1);\n      d1.setDisposable(source.subscribe(observer.onNext.bind(observer), function (exception) {\n        var d, result;\n        try {\n          result = handler(exception);\n        } catch (ex) {\n          observer.onError(ex);\n          return;\n        }\n        isPromise(result) && (result = observableFromPromise(result));\n\n        d = new SingleAssignmentDisposable();\n        subscription.setDisposable(d);\n        d.setDisposable(result.subscribe(observer));\n      }, observer.onCompleted.bind(observer)));\n\n      return subscription;\n    }, source);\n  }\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @example\n   * 1 - xs.catchException(ys)\n   * 2 - xs.catchException(function (ex) { return ys(ex); })\n   * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n   * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n   */\n  observableProto['catch'] = observableProto.catchError = function (handlerOrSecond) {\n    return typeof handlerOrSecond === 'function' ?\n      observableCatchHandler(this, handlerOrSecond) :\n      observableCatch([this, handlerOrSecond]);\n  };\n\n  /**\n   * @deprecated use #catch or #catchError instead.\n   */\n  observableProto.catchException = function (handlerOrSecond) {\n    //deprecate('catchException', 'catch or catchError');\n    return this.catchError(handlerOrSecond);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n   * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n   */\n  var observableCatch = Observable.catchError = Observable['catch'] = Observable.catchException = function () {\n    var items = [];\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { items.push(arguments[i]); }\n    }\n    return enumerableOf(items).catchError();\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   * This can be in the form of an argument list of observables or an array.\n   *\n   * @example\n   * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.combineLatest = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return combineLatest.apply(this, args);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   *\n   * @example\n   * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  var combineLatest = Observable.combineLatest = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    var resultSelector = args.pop();\n\n    if (Array.isArray(args[0])) {\n      args = args[0];\n    }\n\n    return new AnonymousObservable(function (observer) {\n      var falseFactory = function () { return false; },\n        n = args.length,\n        hasValue = arrayInitialize(n, falseFactory),\n        hasValueAll = false,\n        isDone = arrayInitialize(n, falseFactory),\n        values = new Array(n);\n\n      function next(i) {\n        var res;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          try {\n            res = resultSelector.apply(null, values);\n          } catch (ex) {\n            observer.onError(ex);\n            return;\n          }\n          observer.onNext(res);\n        } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n          observer.onCompleted();\n        }\n      }\n\n      function done (i) {\n        isDone[i] = true;\n        if (isDone.every(identity)) {\n          observer.onCompleted();\n        }\n      }\n\n      var subscriptions = new Array(n);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          var source = args[i], sad = new SingleAssignmentDisposable();\n          isPromise(source) && (source = observableFromPromise(source));\n          sad.setDisposable(source.subscribe(function (x) {\n              values[i] = x;\n              next(i);\n            },\n            function(e) { observer.onError(e); },\n            function () { done(i); }\n          ));\n          subscriptions[i] = sad;\n        }(idx));\n      }\n\n      return new CompositeDisposable(subscriptions);\n    }, this);\n  };\n\n  /**\n   * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  observableProto.concat = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    args.unshift(this);\n    return observableConcat.apply(null, args);\n  };\n\n  /**\n   * Concatenates all the observable sequences.\n   * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  var observableConcat = Observable.concat = function () {\n    var items = [];\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { items.push(arguments[i]); }\n    }\n    return enumerableOf(items).concat();\n  };\n\n  /**\n   * Concatenates an observable sequence of observable sequences.\n   * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n   */\n  observableProto.concatAll = observableProto.concatObservable = function () {\n    return this.merge(1);\n  };\n\n  /**\n   * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n   * Or merges two observable sequences into a single observable sequence.\n   *\n   * @example\n   * 1 - merged = sources.merge(1);\n   * 2 - merged = source.merge(otherSource);\n   * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n   * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n   */\n  observableProto.merge = function (maxConcurrentOrOther) {\n    if (typeof maxConcurrentOrOther !== 'number') { return observableMerge(this, maxConcurrentOrOther); }\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var activeCount = 0, group = new CompositeDisposable(), isStopped = false, q = [];\n\n      function subscribe(xs) {\n        var subscription = new SingleAssignmentDisposable();\n        group.add(subscription);\n\n        // Check for promises support\n        isPromise(xs) && (xs = observableFromPromise(xs));\n\n        subscription.setDisposable(xs.subscribe(function (x) { o.onNext(x); }, function (e) { o.onError(e); }, function () {\n          group.remove(subscription);\n          if (q.length > 0) {\n            subscribe(q.shift());\n          } else {\n            activeCount--;\n            isStopped && activeCount === 0 && o.onCompleted();\n          }\n        }));\n      }\n      group.add(sources.subscribe(function (innerSource) {\n        if (activeCount < maxConcurrentOrOther) {\n          activeCount++;\n          subscribe(innerSource);\n        } else {\n          q.push(innerSource);\n        }\n      }, function (e) { o.onError(e); }, function () {\n        isStopped = true;\n        activeCount === 0 && o.onCompleted();\n      }));\n      return group;\n    }, sources);\n  };\n\n  /**\n   * Merges all the observable sequences into a single observable sequence.\n   * The scheduler is optional and if not specified, the immediate scheduler is used.\n   * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n   */\n  var observableMerge = Observable.merge = function () {\n    var scheduler, sources = [], i, len = arguments.length;\n    if (!arguments[0]) {\n      scheduler = immediateScheduler;\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else if (isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else {\n      scheduler = immediateScheduler;\n      for(i = 0; i < len; i++) { sources.push(arguments[i]); }\n    }\n    if (Array.isArray(sources[0])) {\n      sources = sources[0];\n    }\n    return observableOf(scheduler, sources).mergeAll();\n  };\n\n  /**\n   * Merges an observable sequence of observable sequences into an observable sequence.\n   * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n   */\n  observableProto.mergeAll = function () {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable(),\n        isStopped = false,\n        m = new SingleAssignmentDisposable();\n\n      group.add(m);\n      m.setDisposable(sources.subscribe(function (innerSource) {\n        var innerSubscription = new SingleAssignmentDisposable();\n        group.add(innerSubscription);\n\n        // Check for promises support\n        isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n\n        innerSubscription.setDisposable(innerSource.subscribe(function (x) { o.onNext(x); }, function (e) { o.onError(e); }, function () {\n          group.remove(innerSubscription);\n          isStopped && group.length === 1 && o.onCompleted();\n        }));\n      }, function (e) { o.onError(e); }, function () {\n        isStopped = true;\n        group.length === 1 && o.onCompleted();\n      }));\n      return group;\n    }, sources);\n  };\n\n  /**\n   * @deprecated use #mergeAll instead.\n   */\n  observableProto.mergeObservable = function () {\n    //deprecate('mergeObservable', 'mergeAll');\n    return this.mergeAll.apply(this, arguments);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n   * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n   */\n  observableProto.onErrorResumeNext = function (second) {\n    if (!second) { throw new Error('Second observable is required'); }\n    return onErrorResumeNext([this, second]);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   *\n   * @example\n   * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);\n   * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);\n   * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n   */\n  var onErrorResumeNext = Observable.onErrorResumeNext = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    }\n    return new AnonymousObservable(function (observer) {\n      var pos = 0, subscription = new SerialDisposable(),\n      cancelable = immediateScheduler.scheduleRecursive(function (self) {\n        var current, d;\n        if (pos < sources.length) {\n          current = sources[pos++];\n          isPromise(current) && (current = observableFromPromise(current));\n          d = new SingleAssignmentDisposable();\n          subscription.setDisposable(d);\n          d.setDisposable(current.subscribe(observer.onNext.bind(observer), self, self));\n        } else {\n          observer.onCompleted();\n        }\n      });\n      return new CompositeDisposable(subscription, cancelable);\n    });\n  };\n\n  /**\n   * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n   * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n   */\n  observableProto.skipUntil = function (other) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var isOpen = false;\n      var disposables = new CompositeDisposable(source.subscribe(function (left) {\n        isOpen && o.onNext(left);\n      }, function (e) { o.onError(e); }, function () {\n        isOpen && o.onCompleted();\n      }));\n\n      isPromise(other) && (other = observableFromPromise(other));\n\n      var rightSubscription = new SingleAssignmentDisposable();\n      disposables.add(rightSubscription);\n      rightSubscription.setDisposable(other.subscribe(function () {\n        isOpen = true;\n        rightSubscription.dispose();\n      }, function (e) { o.onError(e); }, function () {\n        rightSubscription.dispose();\n      }));\n\n      return disposables;\n    }, source);\n  };\n\n  /**\n   * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n   * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n   */\n  observableProto['switch'] = observableProto.switchLatest = function () {\n    var sources = this;\n    return new AnonymousObservable(function (observer) {\n      var hasLatest = false,\n        innerSubscription = new SerialDisposable(),\n        isStopped = false,\n        latest = 0,\n        subscription = sources.subscribe(\n          function (innerSource) {\n            var d = new SingleAssignmentDisposable(), id = ++latest;\n            hasLatest = true;\n            innerSubscription.setDisposable(d);\n\n            // Check if Promise or Observable\n            isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n\n            d.setDisposable(innerSource.subscribe(\n              function (x) { latest === id && observer.onNext(x); },\n              function (e) { latest === id && observer.onError(e); },\n              function () {\n                if (latest === id) {\n                  hasLatest = false;\n                  isStopped && observer.onCompleted();\n                }\n              }));\n          },\n          function (e) { observer.onError(e); },\n          function () {\n            isStopped = true;\n            !hasLatest && observer.onCompleted();\n          });\n      return new CompositeDisposable(subscription, innerSubscription);\n    }, sources);\n  };\n\n  /**\n   * Returns the values from the source observable sequence until the other observable sequence produces a value.\n   * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n   */\n  observableProto.takeUntil = function (other) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      isPromise(other) && (other = observableFromPromise(other));\n      return new CompositeDisposable(\n        source.subscribe(o),\n        other.subscribe(function () { o.onCompleted(); }, function (e) { o.onError(e); }, noop)\n      );\n    }, source);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n   *\n   * @example\n   * 1 - obs = obs1.withLatestFrom(obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = obs1.withLatestFrom([obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.withLatestFrom = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    var resultSelector = args.pop(), source = this;\n\n    if (typeof source === 'undefined') {\n      throw new Error('Source observable not found for withLatestFrom().');\n    }\n    if (typeof resultSelector !== 'function') {\n      throw new Error('withLatestFrom() expects a resultSelector function.');\n    }\n    if (Array.isArray(args[0])) {\n      args = args[0];\n    }\n\n    return new AnonymousObservable(function (observer) {\n      var falseFactory = function () { return false; },\n        n = args.length,\n        hasValue = arrayInitialize(n, falseFactory),\n        hasValueAll = false,\n        values = new Array(n);\n\n      var subscriptions = new Array(n + 1);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          var other = args[i], sad = new SingleAssignmentDisposable();\n          isPromise(other) && (other = observableFromPromise(other));\n          sad.setDisposable(other.subscribe(function (x) {\n            values[i] = x;\n            hasValue[i] = true;\n            hasValueAll = hasValue.every(identity);\n          }, observer.onError.bind(observer), function () {}));\n          subscriptions[i] = sad;\n        }(idx));\n      }\n\n      var sad = new SingleAssignmentDisposable();\n      sad.setDisposable(source.subscribe(function (x) {\n        var res;\n        var allValues = [x].concat(values);\n        if (!hasValueAll) return;\n        try {\n          res = resultSelector.apply(null, allValues);\n        } catch (ex) {\n          observer.onError(ex);\n          return;\n        }\n        observer.onNext(res);\n      }, observer.onError.bind(observer), function () {\n        observer.onCompleted();\n      }));\n      subscriptions[n] = sad;\n\n      return new CompositeDisposable(subscriptions);\n    }, this);\n  };\n\n  function zipArray(second, resultSelector) {\n    var first = this;\n    return new AnonymousObservable(function (observer) {\n      var index = 0, len = second.length;\n      return first.subscribe(function (left) {\n        if (index < len) {\n          var right = second[index++], result;\n          try {\n            result = resultSelector(left, right);\n          } catch (e) {\n            return observer.onError(e);\n          }\n          observer.onNext(result);\n        } else {\n          observer.onCompleted();\n        }\n      }, function (e) { observer.onError(e); }, function () { observer.onCompleted(); });\n    }, first);\n  }\n\n  function falseFactory() { return false; }\n  function emptyArrayFactory() { return []; }\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n   * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n   *\n   * @example\n   * 1 - res = obs1.zip(obs2, fn);\n   * 1 - res = x1.zip([1,2,3], fn);\n   * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n   */\n  observableProto.zip = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    if (Array.isArray(args[0])) { return zipArray.apply(this, args); }\n    var parent = this, resultSelector = args.pop();\n    args.unshift(parent);\n    return new AnonymousObservable(function (observer) {\n      var n = args.length,\n        queues = arrayInitialize(n, emptyArrayFactory),\n        isDone = arrayInitialize(n, falseFactory);\n\n      function next(i) {\n        var res, queuedValues;\n        if (queues.every(function (x) { return x.length > 0; })) {\n          try {\n            queuedValues = queues.map(function (x) { return x.shift(); });\n            res = resultSelector.apply(parent, queuedValues);\n          } catch (ex) {\n            observer.onError(ex);\n            return;\n          }\n          observer.onNext(res);\n        } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n          observer.onCompleted();\n        }\n      };\n\n      function done(i) {\n        isDone[i] = true;\n        if (isDone.every(function (x) { return x; })) {\n          observer.onCompleted();\n        }\n      }\n\n      var subscriptions = new Array(n);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          var source = args[i], sad = new SingleAssignmentDisposable();\n          isPromise(source) && (source = observableFromPromise(source));\n          sad.setDisposable(source.subscribe(function (x) {\n            queues[i].push(x);\n            next(i);\n          }, function (e) { observer.onError(e); }, function () {\n            done(i);\n          }));\n          subscriptions[i] = sad;\n        })(idx);\n      }\n\n      return new CompositeDisposable(subscriptions);\n    }, parent);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n   * @param arguments Observable sources.\n   * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  Observable.zip = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    var first = args.shift();\n    return first.zip.apply(first, args);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n   * @param arguments Observable sources.\n   * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n   */\n  Observable.zipArray = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    }\n    return new AnonymousObservable(function (observer) {\n      var n = sources.length,\n        queues = arrayInitialize(n, function () { return []; }),\n        isDone = arrayInitialize(n, function () { return false; });\n\n      function next(i) {\n        if (queues.every(function (x) { return x.length > 0; })) {\n          var res = queues.map(function (x) { return x.shift(); });\n          observer.onNext(res);\n        } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n          observer.onCompleted();\n          return;\n        }\n      };\n\n      function done(i) {\n        isDone[i] = true;\n        if (isDone.every(identity)) {\n          observer.onCompleted();\n          return;\n        }\n      }\n\n      var subscriptions = new Array(n);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          subscriptions[i] = new SingleAssignmentDisposable();\n          subscriptions[i].setDisposable(sources[i].subscribe(function (x) {\n            queues[i].push(x);\n            next(i);\n          }, function (e) { observer.onError(e); }, function () {\n            done(i);\n          }));\n        })(idx);\n      }\n\n      return new CompositeDisposable(subscriptions);\n    });\n  };\n\n  /**\n   *  Hides the identity of an observable sequence.\n   * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n   */\n  observableProto.asObservable = function () {\n    var source = this;\n    return new AnonymousObservable(function (o) { return source.subscribe(o); }, this);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n   *\n   * @example\n   *  var res = xs.bufferWithCount(10);\n   *  var res = xs.bufferWithCount(10, 1);\n   * @param {Number} count Length of each buffer.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithCount = function (count, skip) {\n    if (typeof skip !== 'number') {\n      skip = count;\n    }\n    return this.windowWithCount(count, skip).selectMany(function (x) {\n      return x.toArray();\n    }).where(function (x) {\n      return x.length > 0;\n    });\n  };\n\n  /**\n   * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n   * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n   */\n  observableProto.dematerialize = function () {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(function (x) { return x.accept(o); }, function(e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, this);\n  };\n\n  /**\n   *  Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.\n   *\n   *  var obs = observable.distinctUntilChanged();\n   *  var obs = observable.distinctUntilChanged(function (x) { return x.id; });\n   *  var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; });\n   *\n   * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value.\n   * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n   * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinctUntilChanged = function (keySelector, comparer) {\n    var source = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var hasCurrentKey = false, currentKey;\n      return source.subscribe(function (value) {\n        var key = value;\n        if (keySelector) {\n          try {\n            key = keySelector(value);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        if (hasCurrentKey) {\n          try {\n            var comparerEquals = comparer(currentKey, key);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        if (!hasCurrentKey || !comparerEquals) {\n          hasCurrentKey = true;\n          currentKey = key;\n          o.onNext(value);\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, this);\n  };\n\n  /**\n   *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n   * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n   * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto['do'] = observableProto.tap = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) {\n    var source = this, tapObserver = typeof observerOrOnNext === 'function' || typeof observerOrOnNext === 'undefined'?\n      observerCreate(observerOrOnNext || noop, onError || noop, onCompleted || noop) :\n      observerOrOnNext;\n    return new AnonymousObservable(function (observer) {\n      return source.subscribe(function (x) {\n        try {\n          tapObserver.onNext(x);\n        } catch (e) {\n          observer.onError(e);\n        }\n        observer.onNext(x);\n      }, function (err) {\n          try {\n            tapObserver.onError(err);\n          } catch (e) {\n            observer.onError(e);\n          }\n        observer.onError(err);\n      }, function () {\n        try {\n          tapObserver.onCompleted();\n        } catch (e) {\n          observer.onError(e);\n        }\n        observer.onCompleted();\n      });\n    }, this);\n  };\n\n  /**\n   *  Invokes an action for each element in the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function} onNext Action to invoke for each element in the observable sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto.doOnNext = observableProto.tapOnNext = function (onNext, thisArg) {\n    return this.tap(typeof thisArg !== 'undefined' ? function (x) { onNext.call(thisArg, x); } : onNext);\n  };\n\n  /**\n   *  Invokes an action upon exceptional termination of the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto.doOnError = observableProto.tapOnError = function (onError, thisArg) {\n    return this.tap(noop, typeof thisArg !== 'undefined' ? function (e) { onError.call(thisArg, e); } : onError);\n  };\n\n  /**\n   *  Invokes an action upon graceful termination of the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto.doOnCompleted = observableProto.tapOnCompleted = function (onCompleted, thisArg) {\n    return this.tap(noop, null, typeof thisArg !== 'undefined' ? function () { onCompleted.call(thisArg); } : onCompleted);\n  };\n\n  /**\n   *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n   * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n   * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n   */\n  observableProto['finally'] = observableProto.ensure = function (action) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var subscription;\n      try {\n        subscription = source.subscribe(observer);\n      } catch (e) {\n        action();\n        throw e;\n      }\n      return disposableCreate(function () {\n        try {\n          subscription.dispose();\n        } catch (e) {\n          throw e;\n        } finally {\n          action();\n        }\n      });\n    }, this);\n  };\n\n  /**\n   * @deprecated use #finally or #ensure instead.\n   */\n  observableProto.finallyAction = function (action) {\n    //deprecate('finallyAction', 'finally or ensure');\n    return this.ensure(action);\n  };\n\n  /**\n   *  Ignores all elements in an observable sequence leaving only the termination messages.\n   * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n   */\n  observableProto.ignoreElements = function () {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(noop, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n   * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n   */\n  observableProto.materialize = function () {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      return source.subscribe(function (value) {\n        observer.onNext(notificationCreateOnNext(value));\n      }, function (e) {\n        observer.onNext(notificationCreateOnError(e));\n        observer.onCompleted();\n      }, function () {\n        observer.onNext(notificationCreateOnCompleted());\n        observer.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n   * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n   * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n   */\n  observableProto.repeat = function (repeatCount) {\n    return enumerableRepeat(this, repeatCount).concat();\n  };\n\n  /**\n   *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n   *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n   *\n   * @example\n   *  var res = retried = retry.repeat();\n   *  var res = retried = retry.repeat(2);\n   * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retry = function (retryCount) {\n    return enumerableRepeat(this, retryCount).catchError();\n  };\n\n  /**\n   *  Repeats the source observable sequence upon error each time the notifier emits or until it successfully terminates. \n   *  if the notifier completes, the observable sequence completes.\n   *\n   * @example\n   *  var timer = Observable.timer(500);\n   *  var source = observable.retryWhen(timer);\n   * @param {Observable} [notifier] An observable that triggers the retries or completes the observable with onNext or onCompleted respectively.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retryWhen = function (notifier) {\n    return enumerableRepeat(this).catchErrorWhen(notifier);\n  };\n  /**\n   *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n   *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n   * @example\n   *  var res = source.scan(function (acc, x) { return acc + x; });\n   *  var res = source.scan(0, function (acc, x) { return acc + x; });\n   * @param {Mixed} [seed] The initial accumulator value.\n   * @param {Function} accumulator An accumulator function to be invoked on each element.\n   * @returns {Observable} An observable sequence containing the accumulated values.\n   */\n  observableProto.scan = function () {\n    var hasSeed = false, seed, accumulator, source = this;\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[0];\n      accumulator = arguments[1];\n    } else {\n      accumulator = arguments[0];\n    }\n    return new AnonymousObservable(function (o) {\n      var hasAccumulation, accumulation, hasValue;\n      return source.subscribe (\n        function (x) {\n          !hasValue && (hasValue = true);\n          try {\n            if (hasAccumulation) {\n              accumulation = accumulator(accumulation, x);\n            } else {\n              accumulation = hasSeed ? accumulator(seed, x) : x;\n              hasAccumulation = true;\n            }\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n\n          o.onNext(accumulation);\n        },\n        function (e) { o.onError(e); },\n        function () {\n          !hasValue && hasSeed && o.onNext(seed);\n          o.onCompleted();\n        }\n      );\n    }, source);\n  };\n\n  /**\n   *  Bypasses a specified number of elements at the end of an observable sequence.\n   * @description\n   *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n   *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n   * @param count Number of elements to bypass at the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n   */\n  observableProto.skipLast = function (count) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        q.push(x);\n        q.length > count && o.onNext(q.shift());\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n   *  @example\n   *  var res = source.startWith(1, 2, 3);\n   *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n   * @param {Arguments} args The specified values to prepend to the observable sequence\n   * @returns {Observable} The source sequence prepended with the specified values.\n   */\n  observableProto.startWith = function () {\n    var values, scheduler, start = 0;\n    if (!!arguments.length && isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      start = 1;\n    } else {\n      scheduler = immediateScheduler;\n    }\n    for(var args = [], i = start, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return enumerableOf([observableFromArray(args, scheduler), this]).concat();\n  };\n\n  /**\n   *  Returns a specified number of contiguous elements from the end of an observable sequence.\n   * @description\n   *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n   *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLast = function (count) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        q.push(x);\n        q.length > count && q.shift();\n      }, function (e) { o.onError(e); }, function () {\n        while (q.length > 0) { o.onNext(q.shift()); }\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n   *\n   * @description\n   *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n   *  source sequence, this buffer is produced on the result sequence.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLastBuffer = function (count) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        q.push(x);\n        q.length > count && q.shift();\n      }, function (e) { o.onError(e); }, function () {\n        o.onNext(q);\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n   *\n   *  var res = xs.windowWithCount(10);\n   *  var res = xs.windowWithCount(10, 1);\n   * @param {Number} count Length of each window.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithCount = function (count, skip) {\n    var source = this;\n    +count || (count = 0);\n    Math.abs(count) === Infinity && (count = 0);\n    if (count <= 0) { throw new Error(argumentOutOfRange); }\n    skip == null && (skip = count);\n    +skip || (skip = 0);\n    Math.abs(skip) === Infinity && (skip = 0);\n\n    if (skip <= 0) { throw new Error(argumentOutOfRange); }\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(),\n        refCountDisposable = new RefCountDisposable(m),\n        n = 0,\n        q = [];\n\n      function createWindow () {\n        var s = new Subject();\n        q.push(s);\n        observer.onNext(addRef(s, refCountDisposable));\n      }\n\n      createWindow();\n\n      m.setDisposable(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n          var c = n - count + 1;\n          c >= 0 && c % skip === 0 && q.shift().onCompleted();\n          ++n % skip === 0 && createWindow();\n        },\n        function (e) {\n          while (q.length > 0) { q.shift().onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          while (q.length > 0) { q.shift().onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  function concatMap(source, selector, thisArg) {\n    var selectorFunc = bindCallback(selector, thisArg, 3);\n    return source.map(function (x, i) {\n      var result = selectorFunc(x, i, source);\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));\n      return result;\n    }).concatAll();\n  }\n\n  /**\n   *  One of the Following:\n   *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   * @example\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n   *  Or:\n   *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n   *\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n   *  Or:\n   *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n   * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n   * source sequence onto which could be either an observable or Promise.\n   * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n   */\n  observableProto.selectConcat = observableProto.concatMap = function (selector, resultSelector, thisArg) {\n    if (isFunction(selector) && isFunction(resultSelector)) {\n      return this.concatMap(function (x, i) {\n        var selectorResult = selector(x, i);\n        isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));\n        (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));\n\n        return selectorResult.map(function (y, i2) {\n          return resultSelector(x, y, i, i2);\n        });\n      });\n    }\n    return isFunction(selector) ?\n      concatMap(this, selector, thisArg) :\n      concatMap(this, function () { return selector; });\n  };\n\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.concatMapObserver = observableProto.selectConcatObserver = function(onNext, onError, onCompleted, thisArg) {\n    var source = this,\n        onNextFunc = bindCallback(onNext, thisArg, 2),\n        onErrorFunc = bindCallback(onError, thisArg, 1),\n        onCompletedFunc = bindCallback(onCompleted, thisArg, 0);\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNextFunc(x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onErrorFunc(err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompletedFunc();\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, this).concatAll();\n  };\n\n    /**\n     *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n     *\n     *  var res = obs = xs.defaultIfEmpty();\n     *  2 - obs = xs.defaultIfEmpty(false);\n     *\n     * @memberOf Observable#\n     * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n     * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n     */\n    observableProto.defaultIfEmpty = function (defaultValue) {\n      var source = this;\n      defaultValue === undefined && (defaultValue = null);\n      return new AnonymousObservable(function (observer) {\n        var found = false;\n        return source.subscribe(function (x) {\n          found = true;\n          observer.onNext(x);\n        },\n        function (e) { observer.onError(e); }, \n        function () {\n          !found && observer.onNext(defaultValue);\n          observer.onCompleted();\n        });\n      }, source);\n    };\n\n  // Swap out for Array.findIndex\n  function arrayIndexOfComparer(array, item, comparer) {\n    for (var i = 0, len = array.length; i < len; i++) {\n      if (comparer(array[i], item)) { return i; }\n    }\n    return -1;\n  }\n\n  function HashSet(comparer) {\n    this.comparer = comparer;\n    this.set = [];\n  }\n  HashSet.prototype.push = function(value) {\n    var retValue = arrayIndexOfComparer(this.set, value, this.comparer) === -1;\n    retValue && this.set.push(value);\n    return retValue;\n  };\n\n  /**\n   *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n   *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n   *\n   * @example\n   *  var res = obs = xs.distinct();\n   *  2 - obs = xs.distinct(function (x) { return x.id; });\n   *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n   * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n   * @param {Function} [comparer]  Used to compare items in the collection.\n   * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinct = function (keySelector, comparer) {\n    var source = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var hashSet = new HashSet(comparer);\n      return source.subscribe(function (x) {\n        var key = x;\n\n        if (keySelector) {\n          try {\n            key = keySelector(x);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        hashSet.push(key) && o.onNext(x);\n      },\n      function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, this);\n  };\n\n  /**\n   *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n   *\n   * @example\n   *  var res = observable.groupBy(function (x) { return x.id; });\n   *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n   *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n   * @param {Function} keySelector A function to extract the key for each element.\n   * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n   * @param {Function} [comparer] Used to determine whether the objects are equal.\n   * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n   */\n  observableProto.groupBy = function (keySelector, elementSelector, comparer) {\n    return this.groupByUntil(keySelector, elementSelector, observableNever, comparer);\n  };\n\n    /**\n     *  Groups the elements of an observable sequence according to a specified key selector function.\n     *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n     *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n     *\n     * @example\n     *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n     *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n     *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n     * @param {Function} keySelector A function to extract the key for each element.\n     * @param {Function} durationSelector A function to signal the expiration of a group.\n     * @param {Function} [comparer] Used to compare objects. When not specified, the default comparer is used.\n     * @returns {Observable}\n     *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n     *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n     *\n     */\n    observableProto.groupByUntil = function (keySelector, elementSelector, durationSelector, comparer) {\n      var source = this;\n      elementSelector || (elementSelector = identity);\n      comparer || (comparer = defaultComparer);\n      return new AnonymousObservable(function (observer) {\n        function handleError(e) { return function (item) { item.onError(e); }; }\n        var map = new Dictionary(0, comparer),\n          groupDisposable = new CompositeDisposable(),\n          refCountDisposable = new RefCountDisposable(groupDisposable);\n\n        groupDisposable.add(source.subscribe(function (x) {\n          var key;\n          try {\n            key = keySelector(x);\n          } catch (e) {\n            map.getValues().forEach(handleError(e));\n            observer.onError(e);\n            return;\n          }\n\n          var fireNewMapEntry = false,\n            writer = map.tryGetValue(key);\n          if (!writer) {\n            writer = new Subject();\n            map.set(key, writer);\n            fireNewMapEntry = true;\n          }\n\n          if (fireNewMapEntry) {\n            var group = new GroupedObservable(key, writer, refCountDisposable),\n              durationGroup = new GroupedObservable(key, writer);\n            try {\n              duration = durationSelector(durationGroup);\n            } catch (e) {\n              map.getValues().forEach(handleError(e));\n              observer.onError(e);\n              return;\n            }\n\n            observer.onNext(group);\n\n            var md = new SingleAssignmentDisposable();\n            groupDisposable.add(md);\n\n            var expire = function () {\n              map.remove(key) && writer.onCompleted();\n              groupDisposable.remove(md);\n            };\n\n            md.setDisposable(duration.take(1).subscribe(\n              noop,\n              function (exn) {\n                map.getValues().forEach(handleError(exn));\n                observer.onError(exn);\n              },\n              expire)\n            );\n          }\n\n          var element;\n          try {\n            element = elementSelector(x);\n          } catch (e) {\n            map.getValues().forEach(handleError(e));\n            observer.onError(e);\n            return;\n          }\n\n          writer.onNext(element);\n      }, function (ex) {\n        map.getValues().forEach(handleError(ex));\n        observer.onError(ex);\n      }, function () {\n        map.getValues().forEach(function (item) { item.onCompleted(); });\n        observer.onCompleted();\n      }));\n\n      return refCountDisposable;\n    }, source);\n  };\n\n  var MapObservable = (function (__super__) {\n    inherits(MapObservable, __super__);\n\n    function MapObservable(source, selector, thisArg) {\n      this.source = source;\n      this.selector = bindCallback(selector, thisArg, 3);\n      __super__.call(this);\n    }\n\n    MapObservable.prototype.internalMap = function (selector, thisArg) {\n      var self = this;\n      return new MapObservable(this.source, function (x, i, o) { return selector(self.selector(x, i, o), i, o); }, thisArg)\n    };\n\n    MapObservable.prototype.subscribeCore = function (observer) {\n      return this.source.subscribe(new MapObserver(observer, this.selector, this));\n    };\n\n    return MapObservable;\n\n  }(ObservableBase));\n\n  function MapObserver(observer, selector, source) {\n    this.observer = observer;\n    this.selector = selector;\n    this.source = source;\n    this.index = 0;\n    this.isStopped = false;\n  }\n\n  MapObserver.prototype.onNext = function(x) {\n    if (this.isStopped) { return; }\n    try {\n      var result = this.selector(x, this.index++, this.source);\n    } catch(e) {\n      return this.observer.onError(e);\n    }\n    this.observer.onNext(result);\n  };\n  MapObserver.prototype.onError = function (e) {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onError(e); }\n  };\n  MapObserver.prototype.onCompleted = function () {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onCompleted(); }\n  };\n  MapObserver.prototype.dispose = function() { this.isStopped = true; };\n  MapObserver.prototype.fail = function (e) {\n    if (!this.isStopped) {\n      this.isStopped = true;\n      this.observer.onError(e);\n      return true;\n    }\n\n    return false;\n  };\n\n  /**\n  * Projects each element of an observable sequence into a new form by incorporating the element's index.\n  * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n  */\n  observableProto.map = observableProto.select = function (selector, thisArg) {\n    var selectorFn = typeof selector === 'function' ? selector : function () { return selector; };\n    return this instanceof MapObservable ?\n      this.internalMap(selector, thisArg) :\n      new MapObservable(this, selectorFn, thisArg);\n  };\n\n  /**\n   * Retrieves the value of a specified nested property from all elements in\n   * the Observable sequence.\n   * @param {Arguments} arguments The nested properties to pluck.\n   * @returns {Observable} Returns a new Observable sequence of property values.\n   */\n  observableProto.pluck = function () {\n    var args = arguments, len = arguments.length;\n    if (len === 0) { throw new Error('List of properties cannot be empty.'); }\n    return this.map(function (x) {\n      var currentProp = x;\n      for (var i = 0; i < len; i++) {\n        var p = currentProp[args[i]];\n        if (typeof p !== 'undefined') {\n          currentProp = p;\n        } else {\n          return undefined;\n        }\n      }\n      return currentProp;\n    });\n  };\n\n  function flatMap(source, selector, thisArg) {\n    var selectorFunc = bindCallback(selector, thisArg, 3);\n    return source.map(function (x, i) {\n      var result = selectorFunc(x, i, source);\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));\n      return result;\n    }).mergeAll();\n  }\n\n  /**\n   *  One of the Following:\n   *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   * @example\n   *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n   *  Or:\n   *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n   *\n   *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n   *  Or:\n   *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n   * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n   * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n   */\n  observableProto.selectMany = observableProto.flatMap = function (selector, resultSelector, thisArg) {\n    if (isFunction(selector) && isFunction(resultSelector)) {\n      return this.flatMap(function (x, i) {\n        var selectorResult = selector(x, i);\n        isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));\n        (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));\n\n        return selectorResult.map(function (y, i2) {\n          return resultSelector(x, y, i, i2);\n        });\n      }, thisArg);\n    }\n    return isFunction(selector) ?\n      flatMap(this, selector, thisArg) :\n      flatMap(this, function () { return selector; });\n  };\n\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.flatMapObserver = observableProto.selectManyObserver = function (onNext, onError, onCompleted, thisArg) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNext.call(thisArg, x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onError.call(thisArg, err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompleted.call(thisArg);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, source).mergeAll();\n  };\n\n  /**\n   *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n   *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n   * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n   *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n   */\n  observableProto.selectSwitch = observableProto.flatMapLatest = observableProto.switchMap = function (selector, thisArg) {\n    return this.select(selector, thisArg).switchLatest();\n  };\n\n  /**\n   * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n   * @param {Number} count The number of elements to skip before returning the remaining elements.\n   * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n   */\n  observableProto.skip = function (count) {\n    if (count < 0) { throw new Error(argumentOutOfRange); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var remaining = count;\n      return source.subscribe(function (x) {\n        if (remaining <= 0) {\n          o.onNext(x);\n        } else {\n          remaining--;\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n   *  The element's index is used in the logic of the predicate function.\n   *\n   *  var res = source.skipWhile(function (value) { return value < 10; });\n   *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n   */\n  observableProto.skipWhile = function (predicate, thisArg) {\n    var source = this,\n        callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      var i = 0, running = false;\n      return source.subscribe(function (x) {\n        if (!running) {\n          try {\n            running = !callback(x, i++, source);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        running && o.onNext(x);\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n   *\n   *  var res = source.take(5);\n   *  var res = source.take(0, Rx.Scheduler.timeout);\n   * @param {Number} count The number of elements to return.\n   * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n   * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n   */\n  observableProto.take = function (count, scheduler) {\n    if (count < 0) { throw new RangeError(argumentOutOfRange); }\n    if (count === 0) { return observableEmpty(scheduler); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var remaining = count;\n      return source.subscribe(function (x) {\n        if (remaining-- > 0) {\n          o.onNext(x);\n          remaining === 0 && o.onCompleted();\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Returns elements from an observable sequence as long as a specified condition is true.\n   *  The element's index is used in the logic of the predicate function.\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n   */\n  observableProto.takeWhile = function (predicate, thisArg) {\n    var source = this,\n        callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      var i = 0, running = true;\n      return source.subscribe(function (x) {\n        if (running) {\n          try {\n            running = callback(x, i++, source);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n          if (running) {\n            o.onNext(x);\n          } else {\n            o.onCompleted();\n          }\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  var FilterObservable = (function (__super__) {\n    inherits(FilterObservable, __super__);\n\n    function FilterObservable(source, predicate, thisArg) {\n      this.source = source;\n      this.predicate = bindCallback(predicate, thisArg, 3);\n      __super__.call(this);\n    }\n\n    FilterObservable.prototype.subscribeCore = function (observer) {\n      return this.source.subscribe(new FilterObserver(observer, this.predicate, this));\n    };\n\n    FilterObservable.prototype.internalFilter = function(predicate, thisArg) {\n      var self = this;\n      return new FilterObservable(this.source, function(x, i, o) { return self.predicate(x, i, o) && predicate(x, i, o); }, thisArg);\n    };\n\n    return FilterObservable;\n\n  }(ObservableBase));\n\n  function FilterObserver(observer, predicate, source) {\n    this.observer = observer;\n    this.predicate = predicate;\n    this.source = source;\n    this.index = 0;\n    this.isStopped = false;\n  }\n\n  FilterObserver.prototype.onNext = function(x) {\n    try {\n      var shouldYield = this.predicate(x, this.index++, this.source);\n    } catch(e) {\n      return this.observer.onError(e);\n    }\n    shouldYield && this.observer.onNext(x);\n  };\n\n  FilterObserver.prototype.onError = function (e) {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onError(e); }\n  };\n  FilterObserver.prototype.onCompleted = function () {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onCompleted(); }\n  };\n  FilterObserver.prototype.dispose = function() { this.isStopped = true; };\n  FilterObserver.prototype.fail = function (e) {\n    if (!this.isStopped) {\n      this.isStopped = true;\n      this.observer.onError(e);\n      return true;\n    }\n\n    return false;\n  };\n\n\n\n  /**\n  *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n  * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n  */\n  observableProto.filter = observableProto.where = function (predicate, thisArg) {\n    return this instanceof FilterObservable ? this.internalFilter(predicate, thisArg) :\n      new FilterObservable(this, predicate, thisArg);\n  };\n\n  function extremaBy(source, keySelector, comparer) {\n    return new AnonymousObservable(function (o) {\n      var hasValue = false, lastKey = null, list = [];\n      return source.subscribe(function (x) {\n        var comparison, key;\n        try {\n          key = keySelector(x);\n        } catch (ex) {\n          o.onError(ex);\n          return;\n        }\n        comparison = 0;\n        if (!hasValue) {\n          hasValue = true;\n          lastKey = key;\n        } else {\n          try {\n            comparison = comparer(key, lastKey);\n          } catch (ex1) {\n            o.onError(ex1);\n            return;\n          }\n        }\n        if (comparison > 0) {\n          lastKey = key;\n          list = [];\n        }\n        if (comparison >= 0) { list.push(x); }\n      }, function (e) { o.onError(e); }, function () {\n        o.onNext(list);\n        o.onCompleted();\n      });\n    }, source);\n  }\n\n  function firstOnly(x) {\n    if (x.length === 0) { throw new Error(sequenceContainsNoElements); }\n    return x[0];\n  }\n\n  /**\n   * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n   * For aggregation behavior with incremental intermediate results, see Observable.scan.\n   * @deprecated Use #reduce instead\n   * @param {Mixed} [seed] The initial accumulator value.\n   * @param {Function} accumulator An accumulator function to be invoked on each element.\n   * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n   */\n  observableProto.aggregate = function () {\n    //deprecate('aggregate', 'reduce');\n    var hasSeed = false, accumulator, seed, source = this;\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[0];\n      accumulator = arguments[1];\n    } else {\n      accumulator = arguments[0];\n    }\n    return new AnonymousObservable(function (o) {\n      var hasAccumulation, accumulation, hasValue;\n      return source.subscribe (\n        function (x) {\n          !hasValue && (hasValue = true);\n          try {\n            if (hasAccumulation) {\n              accumulation = accumulator(accumulation, x);\n            } else {\n              accumulation = hasSeed ? accumulator(seed, x) : x;\n              hasAccumulation = true;\n            }\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        },\n        function (e) { o.onError(e); },\n        function () {\n          hasValue && o.onNext(accumulation);\n          !hasValue && hasSeed && o.onNext(seed);\n          !hasValue && !hasSeed && o.onError(new Error(sequenceContainsNoElements));\n          o.onCompleted();\n        }\n      );\n    }, source);\n  };\n\n  /**\n   * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n   * For aggregation behavior with incremental intermediate results, see Observable.scan.\n   * @param {Function} accumulator An accumulator function to be invoked on each element.\n   * @param {Any} [seed] The initial accumulator value.\n   * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n   */\n  observableProto.reduce = function (accumulator) {\n    var hasSeed = false, seed, source = this;\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new AnonymousObservable(function (o) {\n      var hasAccumulation, accumulation, hasValue;\n      return source.subscribe (\n        function (x) {\n          !hasValue && (hasValue = true);\n          try {\n            if (hasAccumulation) {\n              accumulation = accumulator(accumulation, x);\n            } else {\n              accumulation = hasSeed ? accumulator(seed, x) : x;\n              hasAccumulation = true;\n            }\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        },\n        function (e) { o.onError(e); },\n        function () {\n          hasValue && o.onNext(accumulation);\n          !hasValue && hasSeed && o.onNext(seed);\n          !hasValue && !hasSeed && o.onError(new Error(sequenceContainsNoElements));\n          o.onCompleted();\n        }\n      );\n    }, source);\n  };\n\n  /**\n   * Determines whether any element of an observable sequence satisfies a condition if present, else if any items are in the sequence.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @returns {Observable} An observable sequence containing a single element determining whether any elements in the source sequence pass the test in the specified predicate if given, else if any items are in the sequence.\n   */\n  observableProto.some = function (predicate, thisArg) {\n    var source = this;\n    return predicate ?\n      source.filter(predicate, thisArg).some() :\n      new AnonymousObservable(function (observer) {\n        return source.subscribe(function () {\n          observer.onNext(true);\n          observer.onCompleted();\n        }, function (e) { observer.onError(e); }, function () {\n          observer.onNext(false);\n          observer.onCompleted();\n        });\n      }, source);\n  };\n\n  /** @deprecated use #some instead */\n  observableProto.any = function () {\n    //deprecate('any', 'some');\n    return this.some.apply(this, arguments);\n  };\n\n  /**\n   * Determines whether an observable sequence is empty.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence is empty.\n   */\n  observableProto.isEmpty = function () {\n    return this.any().map(not);\n  };\n\n  /**\n   * Determines whether all elements of an observable sequence satisfy a condition.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element determining whether all elements in the source sequence pass the test in the specified predicate.\n   */\n  observableProto.every = function (predicate, thisArg) {\n    return this.filter(function (v) { return !predicate(v); }, thisArg).some().map(not);\n  };\n\n  /** @deprecated use #every instead */\n  observableProto.all = function () {\n    //deprecate('all', 'every');\n    return this.every.apply(this, arguments);\n  };\n\n  /**\n   * Determines whether an observable sequence includes a specified element with an optional equality comparer.\n   * @param searchElement The value to locate in the source sequence.\n   * @param {Number} [fromIndex] An equality comparer to compare elements.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence includes an element that has the specified value from the given index.\n   */\n  observableProto.includes = function (searchElement, fromIndex) {\n    var source = this;\n    function comparer(a, b) {\n      return (a === 0 && b === 0) || (a === b || (isNaN(a) && isNaN(b)));\n    }\n    return new AnonymousObservable(function (o) {\n      var i = 0, n = +fromIndex || 0;\n      Math.abs(n) === Infinity && (n = 0);\n      if (n < 0) {\n        o.onNext(false);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n      return source.subscribe(\n        function (x) {\n          if (i++ >= n && comparer(x, searchElement)) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        },\n        function (e) { o.onError(e); },\n        function () {\n          o.onNext(false);\n          o.onCompleted();\n        });\n    }, this);\n  };\n\n  /**\n   * @deprecated use #includes instead.\n   */\n  observableProto.contains = function (searchElement, fromIndex) {\n    //deprecate('contains', 'includes');\n    observableProto.includes(searchElement, fromIndex);\n  };\n  /**\n   * Returns an observable sequence containing a value that represents how many elements in the specified observable sequence satisfy a condition if provided, else the count of items.\n   * @example\n   * res = source.count();\n   * res = source.count(function (x) { return x > 3; });\n   * @param {Function} [predicate]A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with a number that represents how many elements in the input sequence satisfy the condition in the predicate function if provided, else the count of items in the sequence.\n   */\n  observableProto.count = function (predicate, thisArg) {\n    return predicate ?\n      this.filter(predicate, thisArg).count() :\n      this.reduce(function (count) { return count + 1; }, 0);\n  };\n\n  /**\n   * Returns the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   * @param {Any} searchElement Element to locate in the array.\n   * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n   * @returns {Observable} And observable sequence containing the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   */\n  observableProto.indexOf = function(searchElement, fromIndex) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var i = 0, n = +fromIndex || 0;\n      Math.abs(n) === Infinity && (n = 0);\n      if (n < 0) {\n        o.onNext(-1);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n      return source.subscribe(\n        function (x) {\n          if (i >= n && x === searchElement) {\n            o.onNext(i);\n            o.onCompleted();\n          }\n          i++;\n        },\n        function (e) { o.onError(e); },\n        function () {\n          o.onNext(-1);\n          o.onCompleted();\n        });\n    }, source);\n  };\n\n  /**\n   * Computes the sum of a sequence of values that are obtained by invoking an optional transform function on each element of the input sequence, else if not specified computes the sum on each item in the sequence.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the sum of the values in the source sequence.\n   */\n  observableProto.sum = function (keySelector, thisArg) {\n    return keySelector && isFunction(keySelector) ?\n      this.map(keySelector, thisArg).sum() :\n      this.reduce(function (prev, curr) { return prev + curr; }, 0);\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n   * @example\n   * var res = source.minBy(function (x) { return x.value; });\n   * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer] Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n   */\n  observableProto.minBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return extremaBy(this, keySelector, function (x, y) { return comparer(x, y) * -1; });\n  };\n\n  /**\n   * Returns the minimum element in an observable sequence according to the optional comparer else a default greater than less than check.\n   * @example\n   * var res = source.min();\n   * var res = source.min(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the minimum element in the source sequence.\n   */\n  observableProto.min = function (comparer) {\n    return this.minBy(identity, comparer).map(function (x) { return firstOnly(x); });\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n   * @example\n   * var res = source.maxBy(function (x) { return x.value; });\n   * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer]  Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n   */\n  observableProto.maxBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return extremaBy(this, keySelector, comparer);\n  };\n\n  /**\n   * Returns the maximum value in an observable sequence according to the specified comparer.\n   * @example\n   * var res = source.max();\n   * var res = source.max(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the maximum element in the source sequence.\n   */\n  observableProto.max = function (comparer) {\n    return this.maxBy(identity, comparer).map(function (x) { return firstOnly(x); });\n  };\n\n  /**\n   * Computes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the average of the sequence of values.\n   */\n  observableProto.average = function (keySelector, thisArg) {\n    return keySelector && isFunction(keySelector) ?\n      this.map(keySelector, thisArg).average() :\n      this.reduce(function (prev, cur) {\n        return {\n          sum: prev.sum + cur,\n          count: prev.count + 1\n        };\n      }, {sum: 0, count: 0 }).map(function (s) {\n        if (s.count === 0) { throw new Error(sequenceContainsNoElements); }\n        return s.sum / s.count;\n      });\n  };\n\n  /**\n   *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n   *\n   * @example\n   * var res = res = source.sequenceEqual([1,2,3]);\n   * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n   * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n   * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n   * @param {Observable} second Second observable sequence or array to compare.\n   * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n   * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n   */\n  observableProto.sequenceEqual = function (second, comparer) {\n    var first = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var donel = false, doner = false, ql = [], qr = [];\n      var subscription1 = first.subscribe(function (x) {\n        var equal, v;\n        if (qr.length > 0) {\n          v = qr.shift();\n          try {\n            equal = comparer(v, x);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (doner) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          ql.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        donel = true;\n        if (ql.length === 0) {\n          if (qr.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (doner) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n\n      (isArrayLike(second) || isIterable(second)) && (second = observableFrom(second));\n      isPromise(second) && (second = observableFromPromise(second));\n      var subscription2 = second.subscribe(function (x) {\n        var equal;\n        if (ql.length > 0) {\n          var v = ql.shift();\n          try {\n            equal = comparer(v, x);\n          } catch (exception) {\n            o.onError(exception);\n            return;\n          }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (donel) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          qr.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        doner = true;\n        if (qr.length === 0) {\n          if (ql.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (donel) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n      return new CompositeDisposable(subscription1, subscription2);\n    }, first);\n  };\n\n  function elementAtOrDefault(source, index, hasDefault, defaultValue) {\n    if (index < 0) { throw new Error(argumentOutOfRange); }\n    return new AnonymousObservable(function (o) {\n      var i = index;\n      return source.subscribe(function (x) {\n        if (i-- === 0) {\n          o.onNext(x);\n          o.onCompleted();\n        }\n      }, function (e) { o.onError(e); }, function () {\n        if (!hasDefault) {\n          o.onError(new Error(argumentOutOfRange));\n        } else {\n          o.onNext(defaultValue);\n          o.onCompleted();\n        }\n      });\n    }, source);\n  }\n\n  /**\n   * Returns the element at a specified index in a sequence.\n   * @example\n   * var res = source.elementAt(5);\n   * @param {Number} index The zero-based index of the element to retrieve.\n   * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence.\n   */\n  observableProto.elementAt =  function (index) {\n    return elementAtOrDefault(this, index, false);\n  };\n\n  /**\n   * Returns the element at a specified index in a sequence or a default value if the index is out of range.\n   * @example\n   * var res = source.elementAtOrDefault(5);\n   * var res = source.elementAtOrDefault(5, 0);\n   * @param {Number} index The zero-based index of the element to retrieve.\n   * @param [defaultValue] The default value if the index is outside the bounds of the source sequence.\n   * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence, or a default value if the index is outside the bounds of the source sequence.\n   */\n  observableProto.elementAtOrDefault = function (index, defaultValue) {\n    return elementAtOrDefault(this, index, true, defaultValue);\n  };\n\n  function singleOrDefaultAsync(source, hasDefault, defaultValue) {\n    return new AnonymousObservable(function (o) {\n      var value = defaultValue, seenValue = false;\n      return source.subscribe(function (x) {\n        if (seenValue) {\n          o.onError(new Error('Sequence contains more than one element'));\n        } else {\n          value = x;\n          seenValue = true;\n        }\n      }, function (e) { o.onError(e); }, function () {\n        if (!seenValue && !hasDefault) {\n          o.onError(new Error(sequenceContainsNoElements));\n        } else {\n          o.onNext(value);\n          o.onCompleted();\n        }\n      });\n    }, source);\n  }\n\n  /**\n   * Returns the only element of an observable sequence that satisfies the condition in the optional predicate, and reports an exception if there is not exactly one element in the observable sequence.\n   * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate.\n   */\n  observableProto.single = function (predicate, thisArg) {\n    return predicate && isFunction(predicate) ?\n      this.where(predicate, thisArg).single() :\n      singleOrDefaultAsync(this, false);\n  };\n\n  /**\n   * Returns the only element of an observable sequence that matches the predicate, or a default value if no such element exists; this method reports an exception if there is more than one element in the observable sequence.\n   * @example\n   * var res = res = source.singleOrDefault();\n   * var res = res = source.singleOrDefault(function (x) { return x === 42; });\n   * res = source.singleOrDefault(function (x) { return x === 42; }, 0);\n   * res = source.singleOrDefault(null, 0);\n   * @memberOf Observable#\n   * @param {Function} predicate A predicate function to evaluate for elements in the source sequence.\n   * @param [defaultValue] The default value if the index is outside the bounds of the source sequence.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate, or a default value if no such element exists.\n   */\n  observableProto.singleOrDefault = function (predicate, defaultValue, thisArg) {\n    return predicate && isFunction(predicate) ?\n      this.filter(predicate, thisArg).singleOrDefault(null, defaultValue) :\n      singleOrDefaultAsync(this, true, defaultValue);\n  };\n\n  function firstOrDefaultAsync(source, hasDefault, defaultValue) {\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(function (x) {\n        o.onNext(x);\n        o.onCompleted();\n      }, function (e) { o.onError(e); }, function () {\n        if (!hasDefault) {\n          o.onError(new Error(sequenceContainsNoElements));\n        } else {\n          o.onNext(defaultValue);\n          o.onCompleted();\n        }\n      });\n    }, source);\n  }\n\n  /**\n   * Returns the first element of an observable sequence that satisfies the condition in the predicate if present else the first item in the sequence.\n   * @example\n   * var res = res = source.first();\n   * var res = res = source.first(function (x) { return x > 3; });\n   * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate if provided, else the first item in the sequence.\n   */\n  observableProto.first = function (predicate, thisArg) {\n    return predicate ?\n      this.where(predicate, thisArg).first() :\n      firstOrDefaultAsync(this, false);\n  };\n\n  /**\n   * Returns the first element of an observable sequence that satisfies the condition in the predicate, or a default value if no such element exists.\n   * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n   * @param {Any} [defaultValue] The default value if no such element exists.  If not specified, defaults to null.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate, or a default value if no such element exists.\n   */\n  observableProto.firstOrDefault = function (predicate, defaultValue, thisArg) {\n    return predicate ?\n      this.where(predicate).firstOrDefault(null, defaultValue) :\n      firstOrDefaultAsync(this, true, defaultValue);\n  };\n\n  function lastOrDefaultAsync(source, hasDefault, defaultValue) {\n    return new AnonymousObservable(function (o) {\n      var value = defaultValue, seenValue = false;\n      return source.subscribe(function (x) {\n        value = x;\n        seenValue = true;\n      }, function (e) { o.onError(e); }, function () {\n        if (!seenValue && !hasDefault) {\n          o.onError(new Error(sequenceContainsNoElements));\n        } else {\n          o.onNext(value);\n          o.onCompleted();\n        }\n      });\n    }, source);\n  }\n\n  /**\n   * Returns the last element of an observable sequence that satisfies the condition in the predicate if specified, else the last element.\n   * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate.\n   */\n  observableProto.last = function (predicate, thisArg) {\n    return predicate ?\n      this.where(predicate, thisArg).last() :\n      lastOrDefaultAsync(this, false);\n  };\n\n  /**\n   * Returns the last element of an observable sequence that satisfies the condition in the predicate, or a default value if no such element exists.\n   * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n   * @param [defaultValue] The default value if no such element exists.  If not specified, defaults to null.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate, or a default value if no such element exists.\n   */\n  observableProto.lastOrDefault = function (predicate, defaultValue, thisArg) {\n    return predicate ?\n      this.where(predicate, thisArg).lastOrDefault(null, defaultValue) :\n      lastOrDefaultAsync(this, true, defaultValue);\n  };\n\n  function findValue (source, predicate, thisArg, yieldIndex) {\n    var callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      var i = 0;\n      return source.subscribe(function (x) {\n        var shouldRun;\n        try {\n          shouldRun = callback(x, i, source);\n        } catch (e) {\n          o.onError(e);\n          return;\n        }\n        if (shouldRun) {\n          o.onNext(yieldIndex ? i : x);\n          o.onCompleted();\n        } else {\n          i++;\n        }\n      }, function (e) { o.onError(e); }, function () {\n        o.onNext(yieldIndex ? -1 : undefined);\n        o.onCompleted();\n      });\n    }, source);\n  }\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the first element that matches the conditions defined by the specified predicate, if found; otherwise, undefined.\n   */\n  observableProto.find = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, false);\n  };\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns\n   * an Observable sequence with the zero-based index of the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the zero-based index of the first occurrence of an element that matches the conditions defined by match, if found; otherwise, –1.\n  */\n  observableProto.findIndex = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, true);\n  };\n\n  /**\n   * Converts the observable sequence to a Set if it exists.\n   * @returns {Observable} An observable sequence with a single value of a Set containing the values from the observable sequence.\n   */\n  observableProto.toSet = function () {\n    if (typeof root.Set === 'undefined') { throw new TypeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var s = new root.Set();\n      return source.subscribe(\n        function (x) { s.add(x); },\n        function (e) { o.onError(e); },\n        function () {\n          o.onNext(s);\n          o.onCompleted();\n        });\n    }, source);\n  };\n\n  /**\n  * Converts the observable sequence to a Map if it exists.\n  * @param {Function} keySelector A function which produces the key for the Map.\n  * @param {Function} [elementSelector] An optional function which produces the element for the Map. If not present, defaults to the value from the observable sequence.\n  * @returns {Observable} An observable sequence with a single value of a Map containing the values from the observable sequence.\n  */\n  observableProto.toMap = function (keySelector, elementSelector) {\n    if (typeof root.Map === 'undefined') { throw new TypeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var m = new root.Map();\n      return source.subscribe(\n        function (x) {\n          var key;\n          try {\n            key = keySelector(x);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n\n          var element = x;\n          if (elementSelector) {\n            try {\n              element = elementSelector(x);\n            } catch (e) {\n              o.onError(e);\n              return;\n            }\n          }\n\n          m.set(key, element);\n        },\n        function (e) { o.onError(e); },\n        function () {\n          o.onNext(m);\n          o.onCompleted();\n        });\n    }, source);\n  };\n\n  var fnString = 'function',\n      throwString = 'throw',\n      isObject = Rx.internals.isObject;\n\n  function toThunk(obj, ctx) {\n    if (Array.isArray(obj)) {  return objectToThunk.call(ctx, obj); }\n    if (isGeneratorFunction(obj)) { return observableSpawn(obj.call(ctx)); }\n    if (isGenerator(obj)) {  return observableSpawn(obj); }\n    if (isObservable(obj)) { return observableToThunk(obj); }\n    if (isPromise(obj)) { return promiseToThunk(obj); }\n    if (typeof obj === fnString) { return obj; }\n    if (isObject(obj) || Array.isArray(obj)) { return objectToThunk.call(ctx, obj); }\n\n    return obj;\n  }\n\n  function objectToThunk(obj) {\n    var ctx = this;\n\n    return function (done) {\n      var keys = Object.keys(obj),\n          pending = keys.length,\n          results = new obj.constructor(),\n          finished;\n\n      if (!pending) {\n        timeoutScheduler.schedule(function () { done(null, results); });\n        return;\n      }\n\n      for (var i = 0, len = keys.length; i < len; i++) {\n        run(obj[keys[i]], keys[i]);\n      }\n\n      function run(fn, key) {\n        if (finished) { return; }\n        try {\n          fn = toThunk(fn, ctx);\n\n          if (typeof fn !== fnString) {\n            results[key] = fn;\n            return --pending || done(null, results);\n          }\n\n          fn.call(ctx, function(err, res) {\n            if (finished) { return; }\n\n            if (err) {\n              finished = true;\n              return done(err);\n            }\n\n            results[key] = res;\n            --pending || done(null, results);\n          });\n        } catch (e) {\n          finished = true;\n          done(e);\n        }\n      }\n    }\n  }\n\n  function observableToThunk(observable) {\n    return function (fn) {\n      var value, hasValue = false;\n      observable.subscribe(\n        function (v) {\n          value = v;\n          hasValue = true;\n        },\n        fn,\n        function () {\n          hasValue && fn(null, value);\n        });\n    }\n  }\n\n  function promiseToThunk(promise) {\n    return function(fn) {\n      promise.then(function(res) {\n        fn(null, res);\n      }, fn);\n    }\n  }\n\n  function isObservable(obj) {\n    return obj && typeof obj.subscribe === fnString;\n  }\n\n  function isGeneratorFunction(obj) {\n    return obj && obj.constructor && obj.constructor.name === 'GeneratorFunction';\n  }\n\n  function isGenerator(obj) {\n    return obj && typeof obj.next === fnString && typeof obj[throwString] === fnString;\n  }\n\n  /*\n   * Spawns a generator function which allows for Promises, Observable sequences, Arrays, Objects, Generators and functions.\n   * @param {Function} The spawning function.\n   * @returns {Function} a function which has a done continuation.\n   */\n  var observableSpawn = Rx.spawn = function (fn) {\n    var isGenFun = isGeneratorFunction(fn);\n\n    return function (done) {\n      var ctx = this,\n        gen = fn;\n\n      if (isGenFun) {\n        for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n        var len = args.length,\n          hasCallback = len && typeof args[len - 1] === fnString;\n\n        done = hasCallback ? args.pop() : handleError;\n        gen = fn.apply(this, args);\n      } else {\n        done = done || handleError;\n      }\n\n      next();\n\n      function exit(err, res) {\n        timeoutScheduler.schedule(done.bind(ctx, err, res));\n      }\n\n      function next(err, res) {\n        var ret;\n\n        // multiple args\n        if (arguments.length > 2) {\n          for(var res = [], i = 1, len = arguments.length; i < len; i++) { res.push(arguments[i]); }\n        }\n\n        if (err) {\n          try {\n            ret = gen[throwString](err);\n          } catch (e) {\n            return exit(e);\n          }\n        }\n\n        if (!err) {\n          try {\n            ret = gen.next(res);\n          } catch (e) {\n            return exit(e);\n          }\n        }\n\n        if (ret.done)  {\n          return exit(null, ret.value);\n        }\n\n        ret.value = toThunk(ret.value, ctx);\n\n        if (typeof ret.value === fnString) {\n          var called = false;\n          try {\n            ret.value.call(ctx, function() {\n              if (called) {\n                return;\n              }\n\n              called = true;\n              next.apply(ctx, arguments);\n            });\n          } catch (e) {\n            timeoutScheduler.schedule(function () {\n              if (called) {\n                return;\n              }\n\n              called = true;\n              next.call(ctx, e);\n            });\n          }\n          return;\n        }\n\n        // Not supported\n        next(new TypeError('Rx.spawn only supports a function, Promise, Observable, Object or Array.'));\n      }\n    }\n  };\n\n  function handleError(err) {\n    if (!err) { return; }\n    timeoutScheduler.schedule(function() {\n      throw err;\n    });\n  }\n\n  /**\n   * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.\n   *\n   * @example\n   * var res = Rx.Observable.start(function () { console.log('hello'); });\n   * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout);\n   * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console);\n   *\n   * @param {Function} func Function to run asynchronously.\n   * @param {Scheduler} [scheduler]  Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param [context]  The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   *\n   * Remarks\n   * * The function is called immediately, not during the subscription of the resulting sequence.\n   * * Multiple subscriptions to the resulting sequence can observe the function's result.\n   */\n  Observable.start = function (func, context, scheduler) {\n    return observableToAsync(func, context, scheduler)();\n  };\n\n  /**\n   * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n   * @param {Function} function Function to convert to an asynchronous function.\n   * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Function} Asynchronous function.\n   */\n  var observableToAsync = Observable.toAsync = function (func, context, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return function () {\n      var args = arguments,\n        subject = new AsyncSubject();\n\n      scheduler.schedule(function () {\n        var result;\n        try {\n          result = func.apply(context, args);\n        } catch (e) {\n          subject.onError(e);\n          return;\n        }\n        subject.onNext(result);\n        subject.onCompleted();\n      });\n      return subject.asObservable();\n    };\n  };\n\n  /**\n   * Converts a callback function to an observable sequence.\n   *\n   * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n   * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n   */\n  Observable.fromCallback = function (func, context, selector) {\n    return function () {\n      for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n      return new AnonymousObservable(function (observer) {\n        function handler() {\n          var results = arguments;\n\n          if (selector) {\n            try {\n              results = selector(results);\n            } catch (err) {\n              return observer.onError(err);\n            }\n\n            observer.onNext(results);\n          } else {\n            if (results.length <= 1) {\n              observer.onNext.apply(observer, results);\n            } else {\n              observer.onNext(results);\n            }\n          }\n\n          observer.onCompleted();\n        }\n\n        args.push(handler);\n        func.apply(context, args);\n      }).publishLast().refCount();\n    };\n  };\n\n  /**\n   * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n   * @param {Function} func The function to call\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n   * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n   */\n  Observable.fromNodeCallback = function (func, context, selector) {\n    return function () {\n      for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n      return new AnonymousObservable(function (observer) {\n        function handler(err) {\n          if (err) {\n            observer.onError(err);\n            return;\n          }\n\n          for(var results = [], i = 1, len = arguments.length; i < len; i++) { results.push(arguments[i]); }\n\n          if (selector) {\n            try {\n              results = selector(results);\n            } catch (e) {\n              return observer.onError(e);\n            }\n            observer.onNext(results);\n          } else {\n            if (results.length <= 1) {\n              observer.onNext.apply(observer, results);\n            } else {\n              observer.onNext(results);\n            }\n          }\n\n          observer.onCompleted();\n        }\n\n        args.push(handler);\n        func.apply(context, args);\n      }).publishLast().refCount();\n    };\n  };\n\n  function fixEvent(event) {\n    var stopPropagation = function () {\n      this.cancelBubble = true;\n    };\n\n    var preventDefault = function () {\n      this.bubbledKeyCode = this.keyCode;\n      if (this.ctrlKey) {\n        try {\n          this.keyCode = 0;\n        } catch (e) { }\n      }\n      this.defaultPrevented = true;\n      this.returnValue = false;\n      this.modified = true;\n    };\n\n    event || (event = root.event);\n    if (!event.target) {\n      event.target = event.target || event.srcElement;\n\n      if (event.type == 'mouseover') {\n        event.relatedTarget = event.fromElement;\n      }\n      if (event.type == 'mouseout') {\n        event.relatedTarget = event.toElement;\n      }\n      // Adding stopPropogation and preventDefault to IE\n      if (!event.stopPropagation) {\n        event.stopPropagation = stopPropagation;\n        event.preventDefault = preventDefault;\n      }\n      // Normalize key events\n      switch (event.type) {\n        case 'keypress':\n          var c = ('charCode' in event ? event.charCode : event.keyCode);\n          if (c == 10) {\n            c = 0;\n            event.keyCode = 13;\n          } else if (c == 13 || c == 27) {\n            c = 0;\n          } else if (c == 3) {\n            c = 99;\n          }\n          event.charCode = c;\n          event.keyChar = event.charCode ? String.fromCharCode(event.charCode) : '';\n          break;\n      }\n    }\n\n    return event;\n  }\n\n  function createListener (element, name, handler) {\n    // Standards compliant\n    if (element.addEventListener) {\n      element.addEventListener(name, handler, false);\n      return disposableCreate(function () {\n        element.removeEventListener(name, handler, false);\n      });\n    }\n    if (element.attachEvent) {\n      // IE Specific\n      var innerHandler = function (event) {\n        handler(fixEvent(event));\n      };\n      element.attachEvent('on' + name, innerHandler);\n      return disposableCreate(function () {\n        element.detachEvent('on' + name, innerHandler);\n      });\n    }\n    // Level 1 DOM Events\n    element['on' + name] = handler;\n    return disposableCreate(function () {\n      element['on' + name] = null;\n    });\n  }\n\n  function createEventListener (el, eventName, handler) {\n    var disposables = new CompositeDisposable();\n\n    // Asume NodeList\n    if (Object.prototype.toString.call(el) === '[object NodeList]') {\n      for (var i = 0, len = el.length; i < len; i++) {\n        disposables.add(createEventListener(el.item(i), eventName, handler));\n      }\n    } else if (el) {\n      disposables.add(createListener(el, eventName, handler));\n    }\n\n    return disposables;\n  }\n\n  /**\n   * Configuration option to determine whether to use native events only\n   */\n  Rx.config.useNativeEvents = false;\n\n  /**\n   * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n   *\n   * @example\n   *   var source = Rx.Observable.fromEvent(element, 'mouseup');\n   *\n   * @param {Object} element The DOMElement or NodeList to attach a listener.\n   * @param {String} eventName The event name to attach the observable sequence.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n   */\n  Observable.fromEvent = function (element, eventName, selector) {\n    // Node.js specific\n    if (element.addListener) {\n      return fromEventPattern(\n        function (h) { element.addListener(eventName, h); },\n        function (h) { element.removeListener(eventName, h); },\n        selector);\n    }\n\n    // Use only if non-native events are allowed\n    if (!Rx.config.useNativeEvents) {\n      // Handles jq, Angular.js, Zepto, Marionette\n      if (typeof element.on === 'function' && typeof element.off === 'function') {\n        return fromEventPattern(\n          function (h) { element.on(eventName, h); },\n          function (h) { element.off(eventName, h); },\n          selector);\n      }\n      if (!!root.Ember && typeof root.Ember.addListener === 'function') {\n        return fromEventPattern(\n          function (h) { Ember.addListener(element, eventName, h); },\n          function (h) { Ember.removeListener(element, eventName, h); },\n          selector);\n        }\n    }\n    return new AnonymousObservable(function (observer) {\n      return createEventListener(\n        element,\n        eventName,\n        function handler (e) {\n          var results = e;\n\n          if (selector) {\n            try {\n              results = selector(arguments);\n            } catch (err) {\n              observer.onError(err);\n              return\n            }\n          }\n\n          observer.onNext(results);\n        });\n    }).publish().refCount();\n  };\n\n  /**\n   * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n   * @param {Function} addHandler The function to add a handler to the emitter.\n   * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence which wraps an event from an event emitter\n   */\n  var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) {\n    return new AnonymousObservable(function (observer) {\n      function innerHandler (e) {\n        var result = e;\n        if (selector) {\n          try {\n            result = selector(arguments);\n          } catch (err) {\n            observer.onError(err);\n            return;\n          }\n        }\n        observer.onNext(result);\n      }\n\n      var returnValue = addHandler(innerHandler);\n      return disposableCreate(function () {\n        if (removeHandler) {\n          removeHandler(innerHandler, returnValue);\n        }\n      });\n    }).publish().refCount();\n  };\n\n  /**\n   * Invokes the asynchronous function, surfacing the result through an observable sequence.\n   * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   */\n  Observable.startAsync = function (functionAsync) {\n    var promise;\n    try {\n      promise = functionAsync();\n    } catch (e) {\n      return observableThrow(e);\n    }\n    return observableFromPromise(promise);\n  }\n\n  var PausableObservable = (function (__super__) {\n\n    inherits(PausableObservable, __super__);\n\n    function subscribe(observer) {\n      var conn = this.source.publish(),\n        subscription = conn.subscribe(observer),\n        connection = disposableEmpty;\n\n      var pausable = this.pauser.distinctUntilChanged().subscribe(function (b) {\n        if (b) {\n          connection = conn.connect();\n        } else {\n          connection.dispose();\n          connection = disposableEmpty;\n        }\n      });\n\n      return new CompositeDisposable(subscription, connection, pausable);\n    }\n\n    function PausableObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this, subscribe, source);\n    }\n\n    PausableObservable.prototype.pause = function () {\n      this.controller.onNext(false);\n    };\n\n    PausableObservable.prototype.resume = function () {\n      this.controller.onNext(true);\n    };\n\n    return PausableObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausable(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausable = function (pauser) {\n    return new PausableObservable(this, pauser);\n  };\n\n  function combineLatestSource(source, subject, resultSelector) {\n    return new AnonymousObservable(function (o) {\n      var hasValue = [false, false],\n        hasValueAll = false,\n        isDone = false,\n        values = new Array(2),\n        err;\n\n      function next(x, i) {\n        values[i] = x\n        var res;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          if (err) {\n            o.onError(err);\n            return;\n          }\n\n          try {\n            res = resultSelector.apply(null, values);\n          } catch (ex) {\n            o.onError(ex);\n            return;\n          }\n          o.onNext(res);\n        }\n        if (isDone && values[1]) {\n          o.onCompleted();\n        }\n      }\n\n      return new CompositeDisposable(\n        source.subscribe(\n          function (x) {\n            next(x, 0);\n          },\n          function (e) {\n            if (values[1]) {\n              o.onError(e);\n            } else {\n              err = e;\n            }\n          },\n          function () {\n            isDone = true;\n            values[1] && o.onCompleted();\n          }),\n        subject.subscribe(\n          function (x) {\n            next(x, 1);\n          },\n          function (e) { o.onError(e); },\n          function () {\n            isDone = true;\n            next(true, 1);\n          })\n        );\n    }, source);\n  }\n\n  var PausableBufferedObservable = (function (__super__) {\n\n    inherits(PausableBufferedObservable, __super__);\n\n    function subscribe(o) {\n      var q = [], previousShouldFire;\n\n      var subscription =\n        combineLatestSource(\n          this.source,\n          this.pauser.distinctUntilChanged().startWith(false),\n          function (data, shouldFire) {\n            return { data: data, shouldFire: shouldFire };\n          })\n          .subscribe(\n            function (results) {\n              if (previousShouldFire !== undefined && results.shouldFire != previousShouldFire) {\n                previousShouldFire = results.shouldFire;\n                // change in shouldFire\n                if (results.shouldFire) {\n                  while (q.length > 0) {\n                    o.onNext(q.shift());\n                  }\n                }\n              } else {\n                previousShouldFire = results.shouldFire;\n                // new data\n                if (results.shouldFire) {\n                  o.onNext(results.data);\n                } else {\n                  q.push(results.data);\n                }\n              }\n            },\n            function (err) {\n              // Empty buffer before sending error\n              while (q.length > 0) {\n                o.onNext(q.shift());\n              }\n              o.onError(err);\n            },\n            function () {\n              // Empty buffer before sending completion\n              while (q.length > 0) {\n                o.onNext(q.shift());\n              }\n              o.onCompleted();\n            }\n          );\n      return subscription;\n    }\n\n    function PausableBufferedObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this, subscribe, source);\n    }\n\n    PausableBufferedObservable.prototype.pause = function () {\n      this.controller.onNext(false);\n    };\n\n    PausableBufferedObservable.prototype.resume = function () {\n      this.controller.onNext(true);\n    };\n\n    return PausableBufferedObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n   * and yields the values that were buffered while paused.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausableBuffered = function (subject) {\n    return new PausableBufferedObservable(this, subject);\n  };\n\n  var ControlledObservable = (function (__super__) {\n\n    inherits(ControlledObservable, __super__);\n\n    function subscribe (observer) {\n      return this.source.subscribe(observer);\n    }\n\n    function ControlledObservable (source, enableQueue) {\n      __super__.call(this, subscribe, source);\n      this.subject = new ControlledSubject(enableQueue);\n      this.source = source.multicast(this.subject).refCount();\n    }\n\n    ControlledObservable.prototype.request = function (numberOfItems) {\n      if (numberOfItems == null) { numberOfItems = -1; }\n      return this.subject.request(numberOfItems);\n    };\n\n    return ControlledObservable;\n\n  }(Observable));\n\n  var ControlledSubject = (function (__super__) {\n\n    function subscribe (observer) {\n      return this.subject.subscribe(observer);\n    }\n\n    inherits(ControlledSubject, __super__);\n\n    function ControlledSubject(enableQueue) {\n      enableQueue == null && (enableQueue = true);\n\n      __super__.call(this, subscribe);\n      this.subject = new Subject();\n      this.enableQueue = enableQueue;\n      this.queue = enableQueue ? [] : null;\n      this.requestedCount = 0;\n      this.requestedDisposable = disposableEmpty;\n      this.error = null;\n      this.hasFailed = false;\n      this.hasCompleted = false;\n      this.controlledDisposable = disposableEmpty;\n    }\n\n    addProperties(ControlledSubject.prototype, Observer, {\n      onCompleted: function () {\n        this.hasCompleted = true;\n        (!this.enableQueue || this.queue.length === 0) && this.subject.onCompleted();\n      },\n      onError: function (error) {\n        this.hasFailed = true;\n        this.error = error;\n        (!this.enableQueue || this.queue.length === 0) && this.subject.onError(error);\n      },\n      onNext: function (value) {\n        var hasRequested = false;\n\n        if (this.requestedCount === 0) {\n          this.enableQueue && this.queue.push(value);\n        } else {\n          (this.requestedCount !== -1 && this.requestedCount-- === 0) && this.disposeCurrentRequest();\n          hasRequested = true;\n        }\n        hasRequested && this.subject.onNext(value);\n      },\n      _processRequest: function (numberOfItems) {\n        if (this.enableQueue) {\n          while (this.queue.length >= numberOfItems && numberOfItems > 0) {\n            this.subject.onNext(this.queue.shift());\n            numberOfItems--;\n          }\n\n          return this.queue.length !== 0 ?\n            { numberOfItems: numberOfItems, returnValue: true } :\n            { numberOfItems: numberOfItems, returnValue: false };\n        }\n\n        if (this.hasFailed) {\n          this.subject.onError(this.error);\n          this.controlledDisposable.dispose();\n          this.controlledDisposable = disposableEmpty;\n        } else if (this.hasCompleted) {\n          this.subject.onCompleted();\n          this.controlledDisposable.dispose();\n          this.controlledDisposable = disposableEmpty;\n        }\n\n        return { numberOfItems: numberOfItems, returnValue: false };\n      },\n      request: function (number) {\n        this.disposeCurrentRequest();\n        var self = this, r = this._processRequest(number);\n\n        var number = r.numberOfItems;\n        if (!r.returnValue) {\n          this.requestedCount = number;\n          this.requestedDisposable = disposableCreate(function () {\n            self.requestedCount = 0;\n          });\n\n          return this.requestedDisposable\n        } else {\n          return disposableEmpty;\n        }\n      },\n      disposeCurrentRequest: function () {\n        this.requestedDisposable.dispose();\n        this.requestedDisposable = disposableEmpty;\n      }\n    });\n\n    return ControlledSubject;\n  }(Observable));\n\n  /**\n   * Attaches a controller to the observable sequence with the ability to queue.\n   * @example\n   * var source = Rx.Observable.interval(100).controlled();\n   * source.request(3); // Reads 3 values\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.controlled = function (enableQueue) {\n    if (enableQueue == null) {  enableQueue = true; }\n    return new ControlledObservable(this, enableQueue);\n  };\n\n  var StopAndWaitObservable = (function (__super__) {\n\n    function subscribe (observer) {\n      this.subscription = this.source.subscribe(new StopAndWaitObserver(observer, this, this.subscription));\n\n      var self = this;\n      timeoutScheduler.schedule(function () { self.source.request(1); });\n\n      return this.subscription;\n    }\n\n    inherits(StopAndWaitObservable, __super__);\n\n    function StopAndWaitObservable (source) {\n      __super__.call(this, subscribe, source);\n      this.source = source;\n    }\n\n    var StopAndWaitObserver = (function (__sub__) {\n\n      inherits(StopAndWaitObserver, __sub__);\n\n      function StopAndWaitObserver (observer, observable, cancel) {\n        __sub__.call(this);\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n      }\n\n      var stopAndWaitObserverProto = StopAndWaitObserver.prototype;\n\n      stopAndWaitObserverProto.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      stopAndWaitObserverProto.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      }\n\n      stopAndWaitObserverProto.next = function (value) {\n        this.observer.onNext(value);\n\n        var self = this;\n        timeoutScheduler.schedule(function () {\n          self.observable.source.request(1);\n        });\n      };\n\n      stopAndWaitObserverProto.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return StopAndWaitObserver;\n    }(AbstractObserver));\n\n    return StopAndWaitObservable;\n  }(Observable));\n\n\n  /**\n   * Attaches a stop and wait observable to the current observable.\n   * @returns {Observable} A stop and wait observable.\n   */\n  ControlledObservable.prototype.stopAndWait = function () {\n    return new StopAndWaitObservable(this);\n  };\n\n  var WindowedObservable = (function (__super__) {\n\n    function subscribe (observer) {\n      this.subscription = this.source.subscribe(new WindowedObserver(observer, this, this.subscription));\n\n      var self = this;\n      timeoutScheduler.schedule(function () {\n        self.source.request(self.windowSize);\n      });\n\n      return this.subscription;\n    }\n\n    inherits(WindowedObservable, __super__);\n\n    function WindowedObservable(source, windowSize) {\n      __super__.call(this, subscribe, source);\n      this.source = source;\n      this.windowSize = windowSize;\n    }\n\n    var WindowedObserver = (function (__sub__) {\n\n      inherits(WindowedObserver, __sub__);\n\n      function WindowedObserver(observer, observable, cancel) {\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n        this.received = 0;\n      }\n\n      var windowedObserverPrototype = WindowedObserver.prototype;\n\n      windowedObserverPrototype.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      windowedObserverPrototype.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      };\n\n      windowedObserverPrototype.next = function (value) {\n        this.observer.onNext(value);\n\n        this.received = ++this.received % this.observable.windowSize;\n        if (this.received === 0) {\n          var self = this;\n          timeoutScheduler.schedule(function () {\n            self.observable.source.request(self.observable.windowSize);\n          });\n        }\n      };\n\n      windowedObserverPrototype.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return WindowedObserver;\n    }(AbstractObserver));\n\n    return WindowedObservable;\n  }(Observable));\n\n  /**\n   * Creates a sliding windowed observable based upon the window size.\n   * @param {Number} windowSize The number of items in the window\n   * @returns {Observable} A windowed observable based upon the window size.\n   */\n  ControlledObservable.prototype.windowed = function (windowSize) {\n    return new WindowedObservable(this, windowSize);\n  };\n\n  /**\n   * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n   * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n   * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n   *\n   * @example\n   * 1 - res = source.multicast(observable);\n   * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n   *\n   * @param {Function|Subject} subjectOrSubjectSelector\n   * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n   * Or:\n   * Subject to push source elements into.\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.multicast = function (subjectOrSubjectSelector, selector) {\n    var source = this;\n    return typeof subjectOrSubjectSelector === 'function' ?\n      new AnonymousObservable(function (observer) {\n        var connectable = source.multicast(subjectOrSubjectSelector());\n        return new CompositeDisposable(selector(connectable).subscribe(observer), connectable.connect());\n      }, source) :\n      new ConnectableObservable(source, subjectOrSubjectSelector);\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of Multicast using a regular Subject.\n   *\n   * @example\n   * var resres = source.publish();\n   * var res = source.publish(function (x) { return x; });\n   *\n   * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publish = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new Subject(); }, selector) :\n      this.multicast(new Subject());\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.share = function () {\n    return this.publish().refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n   * This operator is a specialization of Multicast using a AsyncSubject.\n   *\n   * @example\n   * var res = source.publishLast();\n   * var res = source.publishLast(function (x) { return x; });\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishLast = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new AsyncSubject(); }, selector) :\n      this.multicast(new AsyncSubject());\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n   * This operator is a specialization of Multicast using a BehaviorSubject.\n   *\n   * @example\n   * var res = source.publishValue(42);\n   * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishValue = function (initialValueOrSelector, initialValue) {\n    return arguments.length === 2 ?\n      this.multicast(function () {\n        return new BehaviorSubject(initialValue);\n      }, initialValueOrSelector) :\n      this.multicast(new BehaviorSubject(initialValueOrSelector));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n   * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareValue = function (initialValue) {\n    return this.publishValue(initialValue).refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of Multicast using a ReplaySubject.\n   *\n   * @example\n   * var res = source.replay(null, 3);\n   * var res = source.replay(null, 3, 500);\n   * var res = source.replay(null, 3, 500, scheduler);\n   * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.replay = function (selector, bufferSize, window, scheduler) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new ReplaySubject(bufferSize, window, scheduler); }, selector) :\n      this.multicast(new ReplaySubject(bufferSize, window, scheduler));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   *\n   * @example\n   * var res = source.shareReplay(3);\n   * var res = source.shareReplay(3, 500);\n   * var res = source.shareReplay(3, 500, scheduler);\n   *\n\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareReplay = function (bufferSize, window, scheduler) {\n    return this.replay(null, bufferSize, window, scheduler).refCount();\n  };\n\n  var InnerSubscription = function (subject, observer) {\n    this.subject = subject;\n    this.observer = observer;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this.subject.isDisposed && this.observer !== null) {\n      var idx = this.subject.observers.indexOf(this.observer);\n      this.subject.observers.splice(idx, 1);\n      this.observer = null;\n    }\n  };\n\n  /**\n   *  Represents a value that changes over time.\n   *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n   */\n  var BehaviorSubject = Rx.BehaviorSubject = (function (__super__) {\n    function subscribe(observer) {\n      checkDisposed(this);\n      if (!this.isStopped) {\n        this.observers.push(observer);\n        observer.onNext(this.value);\n        return new InnerSubscription(this, observer);\n      }\n      if (this.hasError) {\n        observer.onError(this.error);\n      } else {\n        observer.onCompleted();\n      }\n      return disposableEmpty;\n    }\n\n    inherits(BehaviorSubject, __super__);\n\n    /**\n     *  Initializes a new instance of the BehaviorSubject class which creates a subject that caches its last value and starts with the specified value.\n     *  @param {Mixed} value Initial value sent to observers when no other value has been received by the subject yet.\n     */\n    function BehaviorSubject(value) {\n      __super__.call(this, subscribe);\n      this.value = value,\n      this.observers = [],\n      this.isDisposed = false,\n      this.isStopped = false,\n      this.hasError = false;\n    }\n\n    addProperties(BehaviorSubject.prototype, Observer, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onCompleted();\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.hasError = true;\n        this.error = error;\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onError(error);\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onNext(value);\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.value = null;\n        this.exception = null;\n      }\n    });\n\n    return BehaviorSubject;\n  }(Observable));\n\n  /**\n   * Represents an object that is both an observable sequence as well as an observer.\n   * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n   */\n  var ReplaySubject = Rx.ReplaySubject = (function (__super__) {\n\n    function createRemovableDisposable(subject, observer) {\n      return disposableCreate(function () {\n        observer.dispose();\n        !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n      });\n    }\n\n    function subscribe(observer) {\n      var so = new ScheduledObserver(this.scheduler, observer),\n        subscription = createRemovableDisposable(this, so);\n      checkDisposed(this);\n      this._trim(this.scheduler.now());\n      this.observers.push(so);\n\n      for (var i = 0, len = this.q.length; i < len; i++) {\n        so.onNext(this.q[i].value);\n      }\n\n      if (this.hasError) {\n        so.onError(this.error);\n      } else if (this.isStopped) {\n        so.onCompleted();\n      }\n\n      so.ensureActive();\n      return subscription;\n    }\n\n    inherits(ReplaySubject, __super__);\n\n    /**\n     *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n     *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n     *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n     *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n     */\n    function ReplaySubject(bufferSize, windowSize, scheduler) {\n      this.bufferSize = bufferSize == null ? Number.MAX_VALUE : bufferSize;\n      this.windowSize = windowSize == null ? Number.MAX_VALUE : windowSize;\n      this.scheduler = scheduler || currentThreadScheduler;\n      this.q = [];\n      this.observers = [];\n      this.isStopped = false;\n      this.isDisposed = false;\n      this.hasError = false;\n      this.error = null;\n      __super__.call(this, subscribe);\n    }\n\n    addProperties(ReplaySubject.prototype, Observer.prototype, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () {\n        return this.observers.length > 0;\n      },\n      _trim: function (now) {\n        while (this.q.length > this.bufferSize) {\n          this.q.shift();\n        }\n        while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {\n          this.q.shift();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        var now = this.scheduler.now();\n        this.q.push({ interval: now, value: value });\n        this._trim(now);\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onNext(value);\n          observer.ensureActive();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.error = error;\n        this.hasError = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onError(error);\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onCompleted();\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    return ReplaySubject;\n  }(Observable));\n\n  var ConnectableObservable = Rx.ConnectableObservable = (function (__super__) {\n    inherits(ConnectableObservable, __super__);\n\n    function ConnectableObservable(source, subject) {\n      var hasSubscription = false,\n        subscription,\n        sourceObservable = source.asObservable();\n\n      this.connect = function () {\n        if (!hasSubscription) {\n          hasSubscription = true;\n          subscription = new CompositeDisposable(sourceObservable.subscribe(subject), disposableCreate(function () {\n            hasSubscription = false;\n          }));\n        }\n        return subscription;\n      };\n\n      __super__.call(this, function (o) { return subject.subscribe(o); });\n    }\n\n    ConnectableObservable.prototype.refCount = function () {\n      var connectableSubscription, count = 0, source = this;\n      return new AnonymousObservable(function (observer) {\n          var shouldConnect = ++count === 1,\n            subscription = source.subscribe(observer);\n          shouldConnect && (connectableSubscription = source.connect());\n          return function () {\n            subscription.dispose();\n            --count === 0 && connectableSubscription.dispose();\n          };\n      });\n    };\n\n    return ConnectableObservable;\n  }(Observable));\n\n  var Dictionary = (function () {\n\n    var primes = [1, 3, 7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, 65521, 131071, 262139, 524287, 1048573, 2097143, 4194301, 8388593, 16777213, 33554393, 67108859, 134217689, 268435399, 536870909, 1073741789, 2147483647],\n      noSuchkey = \"no such key\",\n      duplicatekey = \"duplicate key\";\n\n    function isPrime(candidate) {\n      if ((candidate & 1) === 0) { return candidate === 2; }\n      var num1 = Math.sqrt(candidate),\n        num2 = 3;\n      while (num2 <= num1) {\n        if (candidate % num2 === 0) { return false; }\n        num2 += 2;\n      }\n      return true;\n    }\n\n    function getPrime(min) {\n      var index, num, candidate;\n      for (index = 0; index < primes.length; ++index) {\n        num = primes[index];\n        if (num >= min) { return num; }\n      }\n      candidate = min | 1;\n      while (candidate < primes[primes.length - 1]) {\n        if (isPrime(candidate)) { return candidate; }\n        candidate += 2;\n      }\n      return min;\n    }\n\n    function stringHashFn(str) {\n      var hash = 757602046;\n      if (!str.length) { return hash; }\n      for (var i = 0, len = str.length; i < len; i++) {\n        var character = str.charCodeAt(i);\n        hash = ((hash << 5) - hash) + character;\n        hash = hash & hash;\n      }\n      return hash;\n    }\n\n    function numberHashFn(key) {\n      var c2 = 0x27d4eb2d;\n      key = (key ^ 61) ^ (key >>> 16);\n      key = key + (key << 3);\n      key = key ^ (key >>> 4);\n      key = key * c2;\n      key = key ^ (key >>> 15);\n      return key;\n    }\n\n    var getHashCode = (function () {\n      var uniqueIdCounter = 0;\n\n      return function (obj) {\n        if (obj == null) { throw new Error(noSuchkey); }\n\n        // Check for built-ins before tacking on our own for any object\n        if (typeof obj === 'string') { return stringHashFn(obj); }\n        if (typeof obj === 'number') { return numberHashFn(obj); }\n        if (typeof obj === 'boolean') { return obj === true ? 1 : 0; }\n        if (obj instanceof Date) { return numberHashFn(obj.valueOf()); }\n        if (obj instanceof RegExp) { return stringHashFn(obj.toString()); }\n        if (typeof obj.valueOf === 'function') {\n          // Hack check for valueOf\n          var valueOf = obj.valueOf();\n          if (typeof valueOf === 'number') { return numberHashFn(valueOf); }\n          if (typeof valueOf === 'string') { return stringHashFn(valueOf); }\n        }\n        if (obj.hashCode) { return obj.hashCode(); }\n\n        var id = 17 * uniqueIdCounter++;\n        obj.hashCode = function () { return id; };\n        return id;\n      };\n    }());\n\n    function newEntry() {\n      return { key: null, value: null, next: 0, hashCode: 0 };\n    }\n\n    function Dictionary(capacity, comparer) {\n      if (capacity < 0) { throw new Error('out of range'); }\n      if (capacity > 0) { this._initialize(capacity); }\n\n      this.comparer = comparer || defaultComparer;\n      this.freeCount = 0;\n      this.size = 0;\n      this.freeList = -1;\n    }\n\n    var dictionaryProto = Dictionary.prototype;\n\n    dictionaryProto._initialize = function (capacity) {\n      var prime = getPrime(capacity), i;\n      this.buckets = new Array(prime);\n      this.entries = new Array(prime);\n      for (i = 0; i < prime; i++) {\n        this.buckets[i] = -1;\n        this.entries[i] = newEntry();\n      }\n      this.freeList = -1;\n    };\n\n    dictionaryProto.add = function (key, value) {\n      this._insert(key, value, true);\n    };\n\n    dictionaryProto._insert = function (key, value, add) {\n      if (!this.buckets) { this._initialize(0); }\n      var index3,\n        num = getHashCode(key) & 2147483647,\n        index1 = num % this.buckets.length;\n      for (var index2 = this.buckets[index1]; index2 >= 0; index2 = this.entries[index2].next) {\n        if (this.entries[index2].hashCode === num && this.comparer(this.entries[index2].key, key)) {\n          if (add) { throw new Error(duplicatekey); }\n          this.entries[index2].value = value;\n          return;\n        }\n      }\n      if (this.freeCount > 0) {\n        index3 = this.freeList;\n        this.freeList = this.entries[index3].next;\n        --this.freeCount;\n      } else {\n        if (this.size === this.entries.length) {\n          this._resize();\n          index1 = num % this.buckets.length;\n        }\n        index3 = this.size;\n        ++this.size;\n      }\n      this.entries[index3].hashCode = num;\n      this.entries[index3].next = this.buckets[index1];\n      this.entries[index3].key = key;\n      this.entries[index3].value = value;\n      this.buckets[index1] = index3;\n    };\n\n    dictionaryProto._resize = function () {\n      var prime = getPrime(this.size * 2),\n        numArray = new Array(prime);\n      for (index = 0; index < numArray.length; ++index) {  numArray[index] = -1; }\n      var entryArray = new Array(prime);\n      for (index = 0; index < this.size; ++index) { entryArray[index] = this.entries[index]; }\n      for (var index = this.size; index < prime; ++index) { entryArray[index] = newEntry(); }\n      for (var index1 = 0; index1 < this.size; ++index1) {\n        var index2 = entryArray[index1].hashCode % prime;\n        entryArray[index1].next = numArray[index2];\n        numArray[index2] = index1;\n      }\n      this.buckets = numArray;\n      this.entries = entryArray;\n    };\n\n    dictionaryProto.remove = function (key) {\n      if (this.buckets) {\n        var num = getHashCode(key) & 2147483647,\n          index1 = num % this.buckets.length,\n          index2 = -1;\n        for (var index3 = this.buckets[index1]; index3 >= 0; index3 = this.entries[index3].next) {\n          if (this.entries[index3].hashCode === num && this.comparer(this.entries[index3].key, key)) {\n            if (index2 < 0) {\n              this.buckets[index1] = this.entries[index3].next;\n            } else {\n              this.entries[index2].next = this.entries[index3].next;\n            }\n            this.entries[index3].hashCode = -1;\n            this.entries[index3].next = this.freeList;\n            this.entries[index3].key = null;\n            this.entries[index3].value = null;\n            this.freeList = index3;\n            ++this.freeCount;\n            return true;\n          } else {\n            index2 = index3;\n          }\n        }\n      }\n      return false;\n    };\n\n    dictionaryProto.clear = function () {\n      var index, len;\n      if (this.size <= 0) { return; }\n      for (index = 0, len = this.buckets.length; index < len; ++index) {\n        this.buckets[index] = -1;\n      }\n      for (index = 0; index < this.size; ++index) {\n        this.entries[index] = newEntry();\n      }\n      this.freeList = -1;\n      this.size = 0;\n    };\n\n    dictionaryProto._findEntry = function (key) {\n      if (this.buckets) {\n        var num = getHashCode(key) & 2147483647;\n        for (var index = this.buckets[num % this.buckets.length]; index >= 0; index = this.entries[index].next) {\n          if (this.entries[index].hashCode === num && this.comparer(this.entries[index].key, key)) {\n            return index;\n          }\n        }\n      }\n      return -1;\n    };\n\n    dictionaryProto.count = function () {\n      return this.size - this.freeCount;\n    };\n\n    dictionaryProto.tryGetValue = function (key) {\n      var entry = this._findEntry(key);\n      return entry >= 0 ?\n        this.entries[entry].value :\n        undefined;\n    };\n\n    dictionaryProto.getValues = function () {\n      var index = 0, results = [];\n      if (this.entries) {\n        for (var index1 = 0; index1 < this.size; index1++) {\n          if (this.entries[index1].hashCode >= 0) {\n            results[index++] = this.entries[index1].value;\n          }\n        }\n      }\n      return results;\n    };\n\n    dictionaryProto.get = function (key) {\n      var entry = this._findEntry(key);\n      if (entry >= 0) { return this.entries[entry].value; }\n      throw new Error(noSuchkey);\n    };\n\n    dictionaryProto.set = function (key, value) {\n      this._insert(key, value, false);\n    };\n\n    dictionaryProto.containskey = function (key) {\n      return this._findEntry(key) >= 0;\n    };\n\n    return Dictionary;\n  }());\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters passed to the function correspond with the elements from the left and right source sequences for which overlap occurs.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.join = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (observer) {\n      var group = new CompositeDisposable();\n      var leftDone = false, rightDone = false;\n      var leftId = 0, rightId = 0;\n      var leftMap = new Dictionary(), rightMap = new Dictionary();\n\n      group.add(left.subscribe(\n        function (value) {\n          var id = leftId++;\n          var md = new SingleAssignmentDisposable();\n\n          leftMap.add(id, value);\n          group.add(md);\n\n          var expire = function () {\n            leftMap.remove(id) && leftMap.count() === 0 && leftDone && observer.onCompleted();\n            group.remove(md);\n          };\n\n          var duration;\n          try {\n            duration = leftDurationSelector(value);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n\n          md.setDisposable(duration.take(1).subscribe(noop, observer.onError.bind(observer), expire));\n\n          rightMap.getValues().forEach(function (v) {\n            var result;\n            try {\n              result = resultSelector(value, v);\n            } catch (exn) {\n              observer.onError(exn);\n              return;\n            }\n\n            observer.onNext(result);\n          });\n        },\n        observer.onError.bind(observer),\n        function () {\n          leftDone = true;\n          (rightDone || leftMap.count() === 0) && observer.onCompleted();\n        })\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++;\n          var md = new SingleAssignmentDisposable();\n\n          rightMap.add(id, value);\n          group.add(md);\n\n          var expire = function () {\n            rightMap.remove(id) && rightMap.count() === 0 && rightDone && observer.onCompleted();\n            group.remove(md);\n          };\n\n          var duration;\n          try {\n            duration = rightDurationSelector(value);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n\n          md.setDisposable(duration.take(1).subscribe(noop, observer.onError.bind(observer), expire));\n\n          leftMap.getValues().forEach(function (v) {\n            var result;\n            try {\n              result = resultSelector(v, value);\n            } catch (exn) {\n              observer.onError(exn);\n              return;\n            }\n\n            observer.onNext(result);\n          });\n        },\n        observer.onError.bind(observer),\n        function () {\n          rightDone = true;\n          (leftDone || rightMap.count() === 0) && observer.onCompleted();\n        })\n      );\n      return group;\n    }, left);\n  };\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations, and groups the results.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. The first parameter passed to the function is an element of the left sequence. The second parameter passed to the function is an observable sequence with elements from the right sequence that overlap with the left sequence's element.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.groupJoin = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (observer) {\n      var group = new CompositeDisposable();\n      var r = new RefCountDisposable(group);\n      var leftMap = new Dictionary(), rightMap = new Dictionary();\n      var leftId = 0, rightId = 0;\n\n      function handleError(e) { return function (v) { v.onError(e); }; };\n\n      group.add(left.subscribe(\n        function (value) {\n          var s = new Subject();\n          var id = leftId++;\n          leftMap.add(id, s);\n\n          var result;\n          try {\n            result = resultSelector(value, addRef(s, r));\n          } catch (e) {\n            leftMap.getValues().forEach(handleError(e));\n            observer.onError(e);\n            return;\n          }\n          observer.onNext(result);\n\n          rightMap.getValues().forEach(function (v) { s.onNext(v); });\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var expire = function () {\n            leftMap.remove(id) && s.onCompleted();\n            group.remove(md);\n          };\n\n          var duration;\n          try {\n            duration = leftDurationSelector(value);\n          } catch (e) {\n            leftMap.getValues().forEach(handleError(e));\n            observer.onError(e);\n            return;\n          }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.getValues().forEach(handleError(e));\n              observer.onError(e);\n            },\n            expire)\n          );\n        },\n        function (e) {\n          leftMap.getValues().forEach(handleError(e));\n          observer.onError(e);\n        },\n        observer.onCompleted.bind(observer))\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++;\n          rightMap.add(id, value);\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var expire = function () {\n            rightMap.remove(id);\n            group.remove(md);\n          };\n\n          var duration;\n          try {\n            duration = rightDurationSelector(value);\n          } catch (e) {\n            leftMap.getValues().forEach(handleError(e));\n            observer.onError(e);\n            return;\n          }\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.getValues().forEach(handleError(e));\n              observer.onError(e);\n            },\n            expire)\n          );\n\n          leftMap.getValues().forEach(function (v) { v.onNext(value); });\n        },\n        function (e) {\n          leftMap.getValues().forEach(handleError(e));\n          observer.onError(e);\n        })\n      );\n\n      return r;\n    }, left);\n  };\n\n    /**\n     *  Projects each element of an observable sequence into zero or more buffers.\n     *\n     *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n     *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n     *  @returns {Observable} An observable sequence of windows.\n     */\n    observableProto.buffer = function (bufferOpeningsOrClosingSelector, bufferClosingSelector) {\n        return this.window.apply(this, arguments).selectMany(function (x) { return x.toArray(); });\n    };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows.\n   *\n   *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n   *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n   *  @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.window = function (windowOpeningsOrClosingSelector, windowClosingSelector) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'function') {\n      return observableWindowWithBoundaries.call(this, windowOpeningsOrClosingSelector);\n    }\n    return typeof windowOpeningsOrClosingSelector === 'function' ?\n      observableWindowWithClosingSelector.call(this, windowOpeningsOrClosingSelector) :\n      observableWindowWithOpenings.call(this, windowOpeningsOrClosingSelector, windowClosingSelector);\n  };\n\n  function observableWindowWithOpenings(windowOpenings, windowClosingSelector) {\n    return windowOpenings.groupJoin(this, windowClosingSelector, observableEmpty, function (_, win) {\n      return win;\n    });\n  }\n\n  function observableWindowWithBoundaries(windowBoundaries) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var win = new Subject(),\n        d = new CompositeDisposable(),\n        r = new RefCountDisposable(d);\n\n      observer.onNext(addRef(win, r));\n\n      d.add(source.subscribe(function (x) {\n        win.onNext(x);\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      isPromise(windowBoundaries) && (windowBoundaries = observableFromPromise(windowBoundaries));\n\n      d.add(windowBoundaries.subscribe(function (w) {\n        win.onCompleted();\n        win = new Subject();\n        observer.onNext(addRef(win, r));\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      return r;\n    }, source);\n  }\n\n  function observableWindowWithClosingSelector(windowClosingSelector) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        r = new RefCountDisposable(d),\n        win = new Subject();\n      observer.onNext(addRef(win, r));\n      d.add(source.subscribe(function (x) {\n          win.onNext(x);\n      }, function (err) {\n          win.onError(err);\n          observer.onError(err);\n      }, function () {\n          win.onCompleted();\n          observer.onCompleted();\n      }));\n\n      function createWindowClose () {\n        var windowClose;\n        try {\n          windowClose = windowClosingSelector();\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n\n        isPromise(windowClose) && (windowClose = observableFromPromise(windowClose));\n\n        var m1 = new SingleAssignmentDisposable();\n        m.setDisposable(m1);\n        m1.setDisposable(windowClose.take(1).subscribe(noop, function (err) {\n          win.onError(err);\n          observer.onError(err);\n        }, function () {\n          win.onCompleted();\n          win = new Subject();\n          observer.onNext(addRef(win, r));\n          createWindowClose();\n        }));\n      }\n\n      createWindowClose();\n      return r;\n    }, source);\n  }\n\n  /**\n   * Returns a new observable that triggers on the second and subsequent triggerings of the input observable.\n   * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair.\n   * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs.\n   * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array.\n   */\n  observableProto.pairwise = function () {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var previous, hasPrevious = false;\n      return source.subscribe(\n        function (x) {\n          if (hasPrevious) {\n            observer.onNext([previous, x]);\n          } else {\n            hasPrevious = true;\n          }\n          previous = x;\n        },\n        observer.onError.bind(observer),\n        observer.onCompleted.bind(observer));\n    }, source);\n  };\n\n  /**\n   * Returns two observables which partition the observations of the source by the given function.\n   * The first will trigger observations for those values for which the predicate returns true.\n   * The second will trigger observations for those values where the predicate returns false.\n   * The predicate is executed once for each subscribed observer.\n   * Both also propagate all error observations arising from the source and each completes\n   * when the source completes.\n   * @param {Function} predicate\n   *    The function to determine which output Observable will trigger a particular observation.\n   * @returns {Array}\n   *    An array of observables. The first triggers when the predicate returns true,\n   *    and the second triggers when the predicate returns false.\n  */\n  observableProto.partition = function(predicate, thisArg) {\n    return [\n      this.filter(predicate, thisArg),\n      this.filter(function (x, i, o) { return !predicate.call(thisArg, x, i, o); })\n    ];\n  };\n\n  function enumerableWhile(condition, source) {\n    return new Enumerable(function () {\n      return new Enumerator(function () {\n        return condition() ?\n          { done: false, value: source } :\n          { done: true, value: undefined };\n      });\n    });\n  }\n\n   /**\n   *  Returns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions.\n   *  This operator allows for a fluent style of writing queries that use the same sequence multiple times.\n   *\n   * @param {Function} selector Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.letBind = observableProto['let'] = function (func) {\n    return func(this);\n  };\n\n   /**\n   *  Determines whether an observable collection contains values. There is an alias for this method called 'ifThen' for browsers <IE9\n   *\n   * @example\n   *  1 - res = Rx.Observable.if(condition, obs1);\n   *  2 - res = Rx.Observable.if(condition, obs1, obs2);\n   *  3 - res = Rx.Observable.if(condition, obs1, scheduler);\n   * @param {Function} condition The condition which determines if the thenSource or elseSource will be run.\n   * @param {Observable} thenSource The observable sequence or Promise that will be run if the condition function returns true.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the condition function returns false. If this is not provided, it defaults to Rx.Observabe.Empty with the specified scheduler.\n   * @returns {Observable} An observable sequence which is either the thenSource or elseSource.\n   */\n  Observable['if'] = Observable.ifThen = function (condition, thenSource, elseSourceOrScheduler) {\n    return observableDefer(function () {\n      elseSourceOrScheduler || (elseSourceOrScheduler = observableEmpty());\n\n      isPromise(thenSource) && (thenSource = observableFromPromise(thenSource));\n      isPromise(elseSourceOrScheduler) && (elseSourceOrScheduler = observableFromPromise(elseSourceOrScheduler));\n\n      // Assume a scheduler for empty only\n      typeof elseSourceOrScheduler.now === 'function' && (elseSourceOrScheduler = observableEmpty(elseSourceOrScheduler));\n      return condition() ? thenSource : elseSourceOrScheduler;\n    });\n  };\n\n   /**\n   *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n   * There is an alias for this method called 'forIn' for browsers <IE9\n   * @param {Array} sources An array of values to turn into an observable sequence.\n   * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n   * @returns {Observable} An observable sequence from the concatenated observable sequences.\n   */\n  Observable['for'] = Observable.forIn = function (sources, resultSelector, thisArg) {\n    return enumerableOf(sources, resultSelector, thisArg).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a while loop.\n   * There is an alias for this method called 'whileDo' for browsers <IE9\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  var observableWhileDo = Observable['while'] = Observable.whileDo = function (condition, source) {\n    isPromise(source) && (source = observableFromPromise(source));\n    return enumerableWhile(condition, source).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a do while loop.\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  observableProto.doWhile = function (condition) {\n    return observableConcat([this, observableWhileDo(condition, this)]);\n  };\n\n   /**\n   *  Uses selector to determine which source in sources to use.\n   *  There is an alias 'switchCase' for browsers <IE9.\n   *\n   * @example\n   *  1 - res = Rx.Observable.case(selector, { '1': obs1, '2': obs2 });\n   *  1 - res = Rx.Observable.case(selector, { '1': obs1, '2': obs2 }, obs0);\n   *  1 - res = Rx.Observable.case(selector, { '1': obs1, '2': obs2 }, scheduler);\n   *\n   * @param {Function} selector The function which extracts the value for to test in a case statement.\n   * @param {Array} sources A object which has keys which correspond to the case statement labels.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n   *\n   * @returns {Observable} An observable sequence which is determined by a case statement.\n   */\n  Observable['case'] = Observable.switchCase = function (selector, sources, defaultSourceOrScheduler) {\n    return observableDefer(function () {\n      isPromise(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableFromPromise(defaultSourceOrScheduler));\n      defaultSourceOrScheduler || (defaultSourceOrScheduler = observableEmpty());\n\n      typeof defaultSourceOrScheduler.now === 'function' && (defaultSourceOrScheduler = observableEmpty(defaultSourceOrScheduler));\n\n      var result = sources[selector()];\n      isPromise(result) && (result = observableFromPromise(result));\n\n      return result || defaultSourceOrScheduler;\n    });\n  };\n\n   /**\n   *  Expands an observable sequence by recursively invoking selector.\n   *\n   * @param {Function} selector Selector function to invoke for each produced element, resulting in another sequence to which the selector will be invoked recursively again.\n   * @param {Scheduler} [scheduler] Scheduler on which to perform the expansion. If not provided, this defaults to the current thread scheduler.\n   * @returns {Observable} An observable sequence containing all the elements produced by the recursive expansion.\n   */\n  observableProto.expand = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var q = [],\n        m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        activeCount = 0,\n        isAcquired = false;\n\n      var ensureActive = function () {\n        var isOwner = false;\n        if (q.length > 0) {\n          isOwner = !isAcquired;\n          isAcquired = true;\n        }\n        if (isOwner) {\n          m.setDisposable(scheduler.scheduleRecursive(function (self) {\n            var work;\n            if (q.length > 0) {\n              work = q.shift();\n            } else {\n              isAcquired = false;\n              return;\n            }\n            var m1 = new SingleAssignmentDisposable();\n            d.add(m1);\n            m1.setDisposable(work.subscribe(function (x) {\n              observer.onNext(x);\n              var result = null;\n              try {\n                result = selector(x);\n              } catch (e) {\n                observer.onError(e);\n              }\n              q.push(result);\n              activeCount++;\n              ensureActive();\n            }, observer.onError.bind(observer), function () {\n              d.remove(m1);\n              activeCount--;\n              if (activeCount === 0) {\n                observer.onCompleted();\n              }\n            }));\n            self();\n          }));\n        }\n      };\n\n      q.push(source);\n      activeCount++;\n      ensureActive();\n      return d;\n    }, this);\n  };\n\n   /**\n   *  Runs all observable sequences in parallel and collect their last elements.\n   *\n   * @example\n   *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n   *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n   * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n   */\n  Observable.forkJoin = function () {\n    var allSources = [];\n    if (Array.isArray(arguments[0])) {\n      allSources = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { allSources.push(arguments[i]); }\n    }\n    return new AnonymousObservable(function (subscriber) {\n      var count = allSources.length;\n      if (count === 0) {\n        subscriber.onCompleted();\n        return disposableEmpty;\n      }\n      var group = new CompositeDisposable(),\n        finished = false,\n        hasResults = new Array(count),\n        hasCompleted = new Array(count),\n        results = new Array(count);\n\n      for (var idx = 0; idx < count; idx++) {\n        (function (i) {\n          var source = allSources[i];\n          isPromise(source) && (source = observableFromPromise(source));\n          group.add(\n            source.subscribe(\n              function (value) {\n              if (!finished) {\n                hasResults[i] = true;\n                results[i] = value;\n              }\n            },\n            function (e) {\n              finished = true;\n              subscriber.onError(e);\n              group.dispose();\n            },\n            function () {\n              if (!finished) {\n                if (!hasResults[i]) {\n                    subscriber.onCompleted();\n                    return;\n                }\n                hasCompleted[i] = true;\n                for (var ix = 0; ix < count; ix++) {\n                  if (!hasCompleted[ix]) { return; }\n                }\n                finished = true;\n                subscriber.onNext(results);\n                subscriber.onCompleted();\n              }\n            }));\n        })(idx);\n      }\n\n      return group;\n    });\n  };\n\n   /**\n   *  Runs two observable sequences in parallel and combines their last elemenets.\n   *\n   * @param {Observable} second Second observable sequence.\n   * @param {Function} resultSelector Result selector function to invoke with the last elements of both sequences.\n   * @returns {Observable} An observable sequence with the result of calling the selector function with the last elements of both input sequences.\n   */\n  observableProto.forkJoin = function (second, resultSelector) {\n    var first = this;\n    return new AnonymousObservable(function (observer) {\n      var leftStopped = false, rightStopped = false,\n        hasLeft = false, hasRight = false,\n        lastLeft, lastRight,\n        leftSubscription = new SingleAssignmentDisposable(), rightSubscription = new SingleAssignmentDisposable();\n\n      isPromise(second) && (second = observableFromPromise(second));\n\n      leftSubscription.setDisposable(\n          first.subscribe(function (left) {\n            hasLeft = true;\n            lastLeft = left;\n          }, function (err) {\n            rightSubscription.dispose();\n            observer.onError(err);\n          }, function () {\n            leftStopped = true;\n            if (rightStopped) {\n              if (!hasLeft) {\n                  observer.onCompleted();\n              } else if (!hasRight) {\n                  observer.onCompleted();\n              } else {\n                var result;\n                try {\n                  result = resultSelector(lastLeft, lastRight);\n                } catch (e) {\n                  observer.onError(e);\n                  return;\n                }\n                observer.onNext(result);\n                observer.onCompleted();\n              }\n            }\n          })\n      );\n\n      rightSubscription.setDisposable(\n        second.subscribe(function (right) {\n          hasRight = true;\n          lastRight = right;\n        }, function (err) {\n          leftSubscription.dispose();\n          observer.onError(err);\n        }, function () {\n          rightStopped = true;\n          if (leftStopped) {\n            if (!hasLeft) {\n              observer.onCompleted();\n            } else if (!hasRight) {\n              observer.onCompleted();\n            } else {\n              var result;\n              try {\n                result = resultSelector(lastLeft, lastRight);\n              } catch (e) {\n                observer.onError(e);\n                return;\n              }\n              observer.onNext(result);\n              observer.onCompleted();\n            }\n          }\n        })\n      );\n\n      return new CompositeDisposable(leftSubscription, rightSubscription);\n    }, first);\n  };\n\n  /**\n   * Comonadic bind operator.\n   * @param {Function} selector A transform function to apply to each element.\n   * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n   * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n   */\n  observableProto.manySelect = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    var source = this;\n    return observableDefer(function () {\n      var chain;\n\n      return source\n        .map(function (x) {\n          var curr = new ChainObservable(x);\n\n          chain && chain.onNext(x);\n          chain = curr;\n\n          return curr;\n        })\n        .tap(\n          noop,\n          function (e) { chain && chain.onError(e); },\n          function () { chain && chain.onCompleted(); }\n        )\n        .observeOn(scheduler)\n        .map(selector);\n    }, source);\n  };\n\n  var ChainObservable = (function (__super__) {\n\n    function subscribe (observer) {\n      var self = this, g = new CompositeDisposable();\n      g.add(currentThreadScheduler.schedule(function () {\n        observer.onNext(self.head);\n        g.add(self.tail.mergeAll().subscribe(observer));\n      }));\n\n      return g;\n    }\n\n    inherits(ChainObservable, __super__);\n\n    function ChainObservable(head) {\n      __super__.call(this, subscribe);\n      this.head = head;\n      this.tail = new AsyncSubject();\n    }\n\n    addProperties(ChainObservable.prototype, Observer, {\n      onCompleted: function () {\n        this.onNext(Observable.empty());\n      },\n      onError: function (e) {\n        this.onNext(Observable.throwException(e));\n      },\n      onNext: function (v) {\n        this.tail.onNext(v);\n        this.tail.onCompleted();\n      }\n    });\n\n    return ChainObservable;\n\n  }(Observable));\n\n  /** @private */\n  var Map = root.Map || (function () {\n\n    function Map() {\n      this._keys = [];\n      this._values = [];\n    }\n\n    Map.prototype.get = function (key) {\n      var i = this._keys.indexOf(key);\n      return i !== -1 ? this._values[i] : undefined;\n    };\n\n    Map.prototype.set = function (key, value) {\n      var i = this._keys.indexOf(key);\n      i !== -1 && (this._values[i] = value);\n      this._values[this._keys.push(key) - 1] = value;\n    };\n\n    Map.prototype.forEach = function (callback, thisArg) {\n      for (var i = 0, len = this._keys.length; i < len; i++) {\n        callback.call(thisArg, this._values[i], this._keys[i]);\n      }\n    };\n\n    return Map;\n  }());\n\n  /**\n   * @constructor\n   * Represents a join pattern over observable sequences.\n   */\n  function Pattern(patterns) {\n    this.patterns = patterns;\n  }\n\n  /**\n   *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n   *  @param other Observable sequence to match in addition to the current pattern.\n   *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n   */\n  Pattern.prototype.and = function (other) {\n    return new Pattern(this.patterns.concat(other));\n  };\n\n  /**\n   *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n   *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n   *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  Pattern.prototype.thenDo = function (selector) {\n    return new Plan(this, selector);\n  };\n\n  function Plan(expression, selector) {\n      this.expression = expression;\n      this.selector = selector;\n  }\n\n  Plan.prototype.activate = function (externalSubscriptions, observer, deactivate) {\n    var self = this;\n    var joinObservers = [];\n    for (var i = 0, len = this.expression.patterns.length; i < len; i++) {\n      joinObservers.push(planCreateObserver(externalSubscriptions, this.expression.patterns[i], observer.onError.bind(observer)));\n    }\n    var activePlan = new ActivePlan(joinObservers, function () {\n      var result;\n      try {\n        result = self.selector.apply(self, arguments);\n      } catch (e) {\n        observer.onError(e);\n        return;\n      }\n      observer.onNext(result);\n    }, function () {\n      for (var j = 0, jlen = joinObservers.length; j < jlen; j++) {\n        joinObservers[j].removeActivePlan(activePlan);\n      }\n      deactivate(activePlan);\n    });\n    for (i = 0, len = joinObservers.length; i < len; i++) {\n      joinObservers[i].addActivePlan(activePlan);\n    }\n    return activePlan;\n  };\n\n  function planCreateObserver(externalSubscriptions, observable, onError) {\n    var entry = externalSubscriptions.get(observable);\n    if (!entry) {\n      var observer = new JoinObserver(observable, onError);\n      externalSubscriptions.set(observable, observer);\n      return observer;\n    }\n    return entry;\n  }\n\n  function ActivePlan(joinObserverArray, onNext, onCompleted) {\n    this.joinObserverArray = joinObserverArray;\n    this.onNext = onNext;\n    this.onCompleted = onCompleted;\n    this.joinObservers = new Map();\n    for (var i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      var joinObserver = this.joinObserverArray[i];\n      this.joinObservers.set(joinObserver, joinObserver);\n    }\n  }\n\n  ActivePlan.prototype.dequeue = function () {\n    this.joinObservers.forEach(function (v) { v.queue.shift(); });\n  };\n\n  ActivePlan.prototype.match = function () {\n    var i, len, hasValues = true;\n    for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      if (this.joinObserverArray[i].queue.length === 0) {\n        hasValues = false;\n        break;\n      }\n    }\n    if (hasValues) {\n      var firstValues = [],\n          isCompleted = false;\n      for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n        firstValues.push(this.joinObserverArray[i].queue[0]);\n        this.joinObserverArray[i].queue[0].kind === 'C' && (isCompleted = true);\n      }\n      if (isCompleted) {\n        this.onCompleted();\n      } else {\n        this.dequeue();\n        var values = [];\n        for (i = 0, len = firstValues.length; i < firstValues.length; i++) {\n          values.push(firstValues[i].value);\n        }\n        this.onNext.apply(this, values);\n      }\n    }\n  };\n\n  var JoinObserver = (function (__super__) {\n    inherits(JoinObserver, __super__);\n\n    function JoinObserver(source, onError) {\n      __super__.call(this);\n      this.source = source;\n      this.onError = onError;\n      this.queue = [];\n      this.activePlans = [];\n      this.subscription = new SingleAssignmentDisposable();\n      this.isDisposed = false;\n    }\n\n    var JoinObserverPrototype = JoinObserver.prototype;\n\n    JoinObserverPrototype.next = function (notification) {\n      if (!this.isDisposed) {\n        if (notification.kind === 'E') {\n          return this.onError(notification.exception);\n        }\n        this.queue.push(notification);\n        var activePlans = this.activePlans.slice(0);\n        for (var i = 0, len = activePlans.length; i < len; i++) {\n          activePlans[i].match();\n        }\n      }\n    };\n\n    JoinObserverPrototype.error = noop;\n    JoinObserverPrototype.completed = noop;\n\n    JoinObserverPrototype.addActivePlan = function (activePlan) {\n      this.activePlans.push(activePlan);\n    };\n\n    JoinObserverPrototype.subscribe = function () {\n      this.subscription.setDisposable(this.source.materialize().subscribe(this));\n    };\n\n    JoinObserverPrototype.removeActivePlan = function (activePlan) {\n      this.activePlans.splice(this.activePlans.indexOf(activePlan), 1);\n      this.activePlans.length === 0 && this.dispose();\n    };\n\n    JoinObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this.subscription.dispose();\n      }\n    };\n\n    return JoinObserver;\n  } (AbstractObserver));\n\n  /**\n   *  Creates a pattern that matches when both observable sequences have an available value.\n   *\n   *  @param right Observable sequence to match with the current sequence.\n   *  @return {Pattern} Pattern object that matches when both observable sequences have an available value.\n   */\n  observableProto.and = function (right) {\n    return new Pattern([this, right]);\n  };\n\n  /**\n   *  Matches when the observable sequence has an available value and projects the value.\n   *\n   *  @param {Function} selector Selector that will be invoked for values in the source sequence.\n   *  @returns {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  observableProto.thenDo = function (selector) {\n    return new Pattern([this]).thenDo(selector);\n  };\n\n  /**\n   *  Joins together the results from several patterns.\n   *\n   *  @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns.\n   *  @returns {Observable} Observable sequence with the results form matching several patterns.\n   */\n  Observable.when = function () {\n    var plans = [];\n    if (Array.isArray(arguments[0])) {\n      plans = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { plans.push(arguments[i]); }\n    }\n    return new AnonymousObservable(function (observer) {\n      var activePlans = [],\n          externalSubscriptions = new Map();\n      var outObserver = observerCreate(\n        observer.onNext.bind(observer),\n        function (err) {\n          externalSubscriptions.forEach(function (v) { v.onError(err); });\n          observer.onError(err);\n        },\n        observer.onCompleted.bind(observer)\n      );\n      try {\n        for (var i = 0, len = plans.length; i < len; i++) {\n          activePlans.push(plans[i].activate(externalSubscriptions, outObserver, function (activePlan) {\n            var idx = activePlans.indexOf(activePlan);\n            activePlans.splice(idx, 1);\n            activePlans.length === 0 && observer.onCompleted();\n          }));\n        }\n      } catch (e) {\n        observableThrow(e).subscribe(observer);\n      }\n      var group = new CompositeDisposable();\n      externalSubscriptions.forEach(function (joinObserver) {\n        joinObserver.subscribe();\n        group.add(joinObserver);\n      });\n\n      return group;\n    });\n  };\n\n  function observableTimerDate(dueTime, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleWithAbsolute(dueTime, function () {\n        observer.onNext(0);\n        observer.onCompleted();\n      });\n    });\n  }\n\n  function observableTimerDateAndPeriod(dueTime, period, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var d = dueTime, p = normalizeTime(period);\n      return scheduler.scheduleRecursiveWithAbsoluteAndState(0, d, function (count, self) {\n        if (p > 0) {\n          var now = scheduler.now();\n          d = d + p;\n          d <= now && (d = now + p);\n        }\n        observer.onNext(count);\n        self(count + 1, d);\n      });\n    });\n  }\n\n  function observableTimerTimeSpan(dueTime, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleWithRelative(normalizeTime(dueTime), function () {\n        observer.onNext(0);\n        observer.onCompleted();\n      });\n    });\n  }\n\n  function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) {\n    return dueTime === period ?\n      new AnonymousObservable(function (observer) {\n        return scheduler.schedulePeriodicWithState(0, period, function (count) {\n          observer.onNext(count);\n          return count + 1;\n        });\n      }) :\n      observableDefer(function () {\n        return observableTimerDateAndPeriod(scheduler.now() + dueTime, period, scheduler);\n      });\n  }\n\n  /**\n   *  Returns an observable sequence that produces a value after each period.\n   *\n   * @example\n   *  1 - res = Rx.Observable.interval(1000);\n   *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n   *\n   * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n   * @returns {Observable} An observable sequence that produces a value after each period.\n   */\n  var observableinterval = Observable.interval = function (period, scheduler) {\n    return observableTimerTimeSpanAndPeriod(period, period, isScheduler(scheduler) ? scheduler : timeoutScheduler);\n  };\n\n  /**\n   *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n   * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n   */\n  var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) {\n    var period;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    if (periodOrScheduler !== undefined && typeof periodOrScheduler === 'number') {\n      period = periodOrScheduler;\n    } else if (isScheduler(periodOrScheduler)) {\n      scheduler = periodOrScheduler;\n    }\n    if (dueTime instanceof Date && period === undefined) {\n      return observableTimerDate(dueTime.getTime(), scheduler);\n    }\n    if (dueTime instanceof Date && period !== undefined) {\n      period = periodOrScheduler;\n      return observableTimerDateAndPeriod(dueTime.getTime(), period, scheduler);\n    }\n    return period === undefined ?\n      observableTimerTimeSpan(dueTime, scheduler) :\n      observableTimerTimeSpanAndPeriod(dueTime, period, scheduler);\n  };\n\n  function observableDelayTimeSpan(source, dueTime, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var active = false,\n        cancelable = new SerialDisposable(),\n        exception = null,\n        q = [],\n        running = false,\n        subscription;\n      subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) {\n        var d, shouldRun;\n        if (notification.value.kind === 'E') {\n          q = [];\n          q.push(notification);\n          exception = notification.value.exception;\n          shouldRun = !running;\n        } else {\n          q.push({ value: notification.value, timestamp: notification.timestamp + dueTime });\n          shouldRun = !active;\n          active = true;\n        }\n        if (shouldRun) {\n          if (exception !== null) {\n            observer.onError(exception);\n          } else {\n            d = new SingleAssignmentDisposable();\n            cancelable.setDisposable(d);\n            d.setDisposable(scheduler.scheduleRecursiveWithRelative(dueTime, function (self) {\n              var e, recurseDueTime, result, shouldRecurse;\n              if (exception !== null) {\n                return;\n              }\n              running = true;\n              do {\n                result = null;\n                if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) {\n                  result = q.shift().value;\n                }\n                if (result !== null) {\n                  result.accept(observer);\n                }\n              } while (result !== null);\n              shouldRecurse = false;\n              recurseDueTime = 0;\n              if (q.length > 0) {\n                shouldRecurse = true;\n                recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now());\n              } else {\n                active = false;\n              }\n              e = exception;\n              running = false;\n              if (e !== null) {\n                observer.onError(e);\n              } else if (shouldRecurse) {\n                self(recurseDueTime);\n              }\n            }));\n          }\n        }\n      });\n      return new CompositeDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  function observableDelayDate(source, dueTime, scheduler) {\n    return observableDefer(function () {\n      return observableDelayTimeSpan(source, dueTime - scheduler.now(), scheduler);\n    });\n  }\n\n  /**\n   *  Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n   *\n   * @example\n   *  1 - res = Rx.Observable.delay(new Date());\n   *  2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout);\n   *\n   *  3 - res = Rx.Observable.delay(5000);\n   *  4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout);\n   * @memberOf Observable#\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n   * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delay = function (dueTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return dueTime instanceof Date ?\n      observableDelayDate(this, dueTime.getTime(), scheduler) :\n      observableDelayTimeSpan(this, dueTime, scheduler);\n  };\n\n  /**\n   *  Ignores values from an observable sequence which are followed by another value before dueTime.\n   * @param {Number} dueTime Duration of the debounce period for each value (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler]  Scheduler to run the debounce timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The debounced sequence.\n   */\n  observableProto.debounce = observableProto.throttleWithTimeout = function (dueTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var cancelable = new SerialDisposable(), hasvalue = false, value, id = 0;\n      var subscription = source.subscribe(\n        function (x) {\n          hasvalue = true;\n          value = x;\n          id++;\n          var currentId = id,\n            d = new SingleAssignmentDisposable();\n          cancelable.setDisposable(d);\n          d.setDisposable(scheduler.scheduleWithRelative(dueTime, function () {\n            hasvalue && id === currentId && observer.onNext(value);\n            hasvalue = false;\n          }));\n        },\n        function (e) {\n          cancelable.dispose();\n          observer.onError(e);\n          hasvalue = false;\n          id++;\n        },\n        function () {\n          cancelable.dispose();\n          hasvalue && observer.onNext(value);\n          observer.onCompleted();\n          hasvalue = false;\n          id++;\n        });\n      return new CompositeDisposable(subscription, cancelable);\n    }, this);\n  };\n\n  /**\n   * @deprecated use #debounce or #throttleWithTimeout instead.\n   */\n  observableProto.throttle = function(dueTime, scheduler) {\n    //deprecate('throttle', 'debounce or throttleWithTimeout');\n    return this.debounce(dueTime, scheduler);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n   * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n   * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n    var source = this, timeShift;\n    timeShiftOrScheduler == null && (timeShift = timeSpan);\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    if (typeof timeShiftOrScheduler === 'number') {\n      timeShift = timeShiftOrScheduler;\n    } else if (isScheduler(timeShiftOrScheduler)) {\n      timeShift = timeSpan;\n      scheduler = timeShiftOrScheduler;\n    }\n    return new AnonymousObservable(function (observer) {\n      var groupDisposable,\n        nextShift = timeShift,\n        nextSpan = timeSpan,\n        q = [],\n        refCountDisposable,\n        timerD = new SerialDisposable(),\n        totalTime = 0;\n        groupDisposable = new CompositeDisposable(timerD),\n        refCountDisposable = new RefCountDisposable(groupDisposable);\n\n       function createTimer () {\n        var m = new SingleAssignmentDisposable(),\n          isSpan = false,\n          isShift = false;\n        timerD.setDisposable(m);\n        if (nextSpan === nextShift) {\n          isSpan = true;\n          isShift = true;\n        } else if (nextSpan < nextShift) {\n            isSpan = true;\n        } else {\n          isShift = true;\n        }\n        var newTotalTime = isSpan ? nextSpan : nextShift,\n          ts = newTotalTime - totalTime;\n        totalTime = newTotalTime;\n        if (isSpan) {\n          nextSpan += timeShift;\n        }\n        if (isShift) {\n          nextShift += timeShift;\n        }\n        m.setDisposable(scheduler.scheduleWithRelative(ts, function () {\n          if (isShift) {\n            var s = new Subject();\n            q.push(s);\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          isSpan && q.shift().onCompleted();\n          createTimer();\n        }));\n      };\n      q.push(new Subject());\n      observer.onNext(addRef(q[0], refCountDisposable));\n      createTimer();\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n        },\n        function (e) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed.\n   * @param {Number} timeSpan Maximum time length of a window.\n   * @param {Number} count Maximum element count of a window.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTimeOrCount = function (timeSpan, count, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (observer) {\n      var timerD = new SerialDisposable(),\n          groupDisposable = new CompositeDisposable(timerD),\n          refCountDisposable = new RefCountDisposable(groupDisposable),\n          n = 0,\n          windowId = 0,\n          s = new Subject();\n\n      function createTimer(id) {\n        var m = new SingleAssignmentDisposable();\n        timerD.setDisposable(m);\n        m.setDisposable(scheduler.scheduleWithRelative(timeSpan, function () {\n          if (id !== windowId) { return; }\n          n = 0;\n          var newId = ++windowId;\n          s.onCompleted();\n          s = new Subject();\n          observer.onNext(addRef(s, refCountDisposable));\n          createTimer(newId);\n        }));\n      }\n\n      observer.onNext(addRef(s, refCountDisposable));\n      createTimer(0);\n\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          var newId = 0, newWindow = false;\n          s.onNext(x);\n          if (++n === count) {\n            newWindow = true;\n            n = 0;\n            newId = ++windowId;\n            s.onCompleted();\n            s = new Subject();\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          newWindow && createTimer(newId);\n        },\n        function (e) {\n          s.onError(e);\n          observer.onError(e);\n        }, function () {\n          s.onCompleted();\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n    /**\n     *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n     *\n     * @example\n     *  1 - res = xs.bufferWithTime(1000, scheduler); // non-overlapping segments of 1 second\n     *  2 - res = xs.bufferWithTime(1000, 500, scheduler; // segments of 1 second with time shift 0.5 seconds\n     *\n     * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n     * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n     * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n     * @returns {Observable} An observable sequence of buffers.\n     */\n    observableProto.bufferWithTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n        return this.windowWithTime.apply(this, arguments).selectMany(function (x) { return x.toArray(); });\n    };\n\n    /**\n     *  Projects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed.\n     *\n     * @example\n     *  1 - res = source.bufferWithTimeOrCount(5000, 50); // 5s or 50 items in an array\n     *  2 - res = source.bufferWithTimeOrCount(5000, 50, scheduler); // 5s or 50 items in an array\n     *\n     * @param {Number} timeSpan Maximum time length of a buffer.\n     * @param {Number} count Maximum element count of a buffer.\n     * @param {Scheduler} [scheduler]  Scheduler to run bufferin timers on. If not specified, the timeout scheduler is used.\n     * @returns {Observable} An observable sequence of buffers.\n     */\n    observableProto.bufferWithTimeOrCount = function (timeSpan, count, scheduler) {\n        return this.windowWithTimeOrCount(timeSpan, count, scheduler).selectMany(function (x) {\n            return x.toArray();\n        });\n    };\n\n  /**\n   *  Records the time interval between consecutive values in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timeInterval();\n   *  2 - res = source.timeInterval(Rx.Scheduler.timeout);\n   *\n   * @param [scheduler]  Scheduler used to compute time intervals. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence with time interval information on values.\n   */\n  observableProto.timeInterval = function (scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return observableDefer(function () {\n      var last = scheduler.now();\n      return source.map(function (x) {\n        var now = scheduler.now(), span = now - last;\n        last = now;\n        return { value: x, interval: span };\n      });\n    });\n  };\n\n  /**\n   *  Records the timestamp for each value in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n   *  2 - res = source.timestamp(Rx.Scheduler.timeout);\n   *\n   * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence with timestamp information on values.\n   */\n  observableProto.timestamp = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return this.map(function (x) {\n      return { value: x, timestamp: scheduler.now() };\n    });\n  };\n\n  function sampleObservable(source, sampler) {\n    return new AnonymousObservable(function (observer) {\n      var atEnd, value, hasValue;\n\n      function sampleSubscribe() {\n        if (hasValue) {\n          hasValue = false;\n          observer.onNext(value);\n        }\n        atEnd && observer.onCompleted();\n      }\n\n      return new CompositeDisposable(\n        source.subscribe(function (newValue) {\n          hasValue = true;\n          value = newValue;\n        }, observer.onError.bind(observer), function () {\n          atEnd = true;\n        }),\n        sampler.subscribe(sampleSubscribe, observer.onError.bind(observer), sampleSubscribe)\n      );\n    }, source);\n  }\n\n  /**\n   *  Samples the observable sequence at each interval.\n   *\n   * @example\n   *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n   *  2 - res = source.sample(5000); // 5 seconds\n   *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n   *\n   * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n   * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Sampled observable sequence.\n   */\n  observableProto.sample = observableProto.throttleLatest = function (intervalOrSampler, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return typeof intervalOrSampler === 'number' ?\n      sampleObservable(this, observableinterval(intervalOrSampler, scheduler)) :\n      sampleObservable(this, intervalOrSampler);\n  };\n\n  /**\n   *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n   * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n   */\n  observableProto.timeout = function (dueTime, other, scheduler) {\n    (other == null || typeof other === 'string') && (other = observableThrow(new Error(other || 'Timeout')));\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n\n    var source = this, schedulerMethod = dueTime instanceof Date ?\n      'scheduleWithAbsolute' :\n      'scheduleWithRelative';\n\n    return new AnonymousObservable(function (observer) {\n      var id = 0,\n        original = new SingleAssignmentDisposable(),\n        subscription = new SerialDisposable(),\n        switched = false,\n        timer = new SerialDisposable();\n\n      subscription.setDisposable(original);\n\n      function createTimer() {\n        var myId = id;\n        timer.setDisposable(scheduler[schedulerMethod](dueTime, function () {\n          if (id === myId) {\n            isPromise(other) && (other = observableFromPromise(other));\n            subscription.setDisposable(other.subscribe(observer));\n          }\n        }));\n      }\n\n      createTimer();\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (!switched) {\n          id++;\n          observer.onNext(x);\n          createTimer();\n        }\n      }, function (e) {\n        if (!switched) {\n          id++;\n          observer.onError(e);\n        }\n      }, function () {\n        if (!switched) {\n          id++;\n          observer.onCompleted();\n        }\n      }));\n      return new CompositeDisposable(subscription, timer);\n    }, source);\n  };\n\n  /**\n   *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithAbsoluteTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return new Date(); }\n   *  });\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning Date values.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithAbsoluteTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (observer) {\n      var first = true,\n        hasResult = false,\n        result,\n        state = initialState,\n        time;\n      return scheduler.scheduleRecursiveWithAbsolute(scheduler.now(), function (self) {\n        hasResult && observer.onNext(result);\n\n        try {\n          if (first) {\n            first = false;\n          } else {\n            state = iterate(state);\n          }\n          hasResult = condition(state);\n          if (hasResult) {\n            result = resultSelector(state);\n            time = timeSelector(state);\n          }\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n        if (hasResult) {\n          self(time);\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithRelativeTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return 500; }\n   *  );\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithRelativeTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (observer) {\n      var first = true,\n        hasResult = false,\n        result,\n        state = initialState,\n        time;\n      return scheduler.scheduleRecursiveWithRelative(0, function (self) {\n        hasResult && observer.onNext(result);\n\n        try {\n          if (first) {\n            first = false;\n          } else {\n            state = iterate(state);\n          }\n          hasResult = condition(state);\n          if (hasResult) {\n            result = resultSelector(state);\n            time = timeSelector(state);\n          }\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n        if (hasResult) {\n          self(time);\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Time shifts the observable sequence by delaying the subscription.\n   *\n   * @example\n   *  1 - res = source.delaySubscription(5000); // 5s\n   *  2 - res = source.delaySubscription(5000, Rx.Scheduler.timeout); // 5 seconds\n   *\n   * @param {Number} dueTime Absolute or relative time to perform the subscription at.\n   * @param {Scheduler} [scheduler]  Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delaySubscription = function (dueTime, scheduler) {\n    return this.delayWithSelector(observableTimer(dueTime, isScheduler(scheduler) ? scheduler : timeoutScheduler), observableEmpty);\n  };\n\n  /**\n   *  Time shifts the observable sequence based on a subscription delay and a delay selector function for each element.\n   *\n   * @example\n   *  1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only\n   *  1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector\n   *\n   * @param {Observable} [subscriptionDelay]  Sequence indicating the delay for the subscription to the source.\n   * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delayWithSelector = function (subscriptionDelay, delayDurationSelector) {\n      var source = this, subDelay, selector;\n      if (typeof subscriptionDelay === 'function') {\n        selector = subscriptionDelay;\n      } else {\n        subDelay = subscriptionDelay;\n        selector = delayDurationSelector;\n      }\n      return new AnonymousObservable(function (observer) {\n        var delays = new CompositeDisposable(), atEnd = false, done = function () {\n            if (atEnd && delays.length === 0) { observer.onCompleted(); }\n        }, subscription = new SerialDisposable(), start = function () {\n          subscription.setDisposable(source.subscribe(function (x) {\n              var delay;\n              try {\n                delay = selector(x);\n              } catch (error) {\n                observer.onError(error);\n                return;\n              }\n              var d = new SingleAssignmentDisposable();\n              delays.add(d);\n              d.setDisposable(delay.subscribe(function () {\n                observer.onNext(x);\n                delays.remove(d);\n                done();\n              }, observer.onError.bind(observer), function () {\n                observer.onNext(x);\n                delays.remove(d);\n                done();\n              }));\n          }, observer.onError.bind(observer), function () {\n            atEnd = true;\n            subscription.dispose();\n            done();\n          }));\n      };\n\n      if (!subDelay) {\n        start();\n      } else {\n        subscription.setDisposable(subDelay.subscribe(start, observer.onError.bind(observer), start));\n      }\n\n      return new CompositeDisposable(subscription, delays);\n    }, this);\n  };\n\n    /**\n     *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n     * @param {Observable} [firstTimeout]  Observable sequence that represents the timeout for the first element. If not provided, this defaults to Observable.never().\n     * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n     * @param {Observable} [other]  Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException().\n     * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n     */\n    observableProto.timeoutWithSelector = function (firstTimeout, timeoutdurationSelector, other) {\n      if (arguments.length === 1) {\n          timeoutdurationSelector = firstTimeout;\n          firstTimeout = observableNever();\n      }\n      other || (other = observableThrow(new Error('Timeout')));\n      var source = this;\n      return new AnonymousObservable(function (observer) {\n        var subscription = new SerialDisposable(), timer = new SerialDisposable(), original = new SingleAssignmentDisposable();\n\n        subscription.setDisposable(original);\n\n        var id = 0, switched = false;\n\n        function setTimer(timeout) {\n          var myId = id;\n\n          function timerWins () {\n            return id === myId;\n          }\n\n          var d = new SingleAssignmentDisposable();\n          timer.setDisposable(d);\n          d.setDisposable(timeout.subscribe(function () {\n            timerWins() && subscription.setDisposable(other.subscribe(observer));\n            d.dispose();\n          }, function (e) {\n            timerWins() && observer.onError(e);\n          }, function () {\n            timerWins() && subscription.setDisposable(other.subscribe(observer));\n          }));\n        };\n\n        setTimer(firstTimeout);\n\n        function observerWins() {\n          var res = !switched;\n          if (res) { id++; }\n          return res;\n        }\n\n        original.setDisposable(source.subscribe(function (x) {\n          if (observerWins()) {\n            observer.onNext(x);\n            var timeout;\n            try {\n              timeout = timeoutdurationSelector(x);\n            } catch (e) {\n              observer.onError(e);\n              return;\n            }\n            setTimer(isPromise(timeout) ? observableFromPromise(timeout) : timeout);\n          }\n        }, function (e) {\n          observerWins() && observer.onError(e);\n        }, function () {\n          observerWins() && observer.onCompleted();\n        }));\n        return new CompositeDisposable(subscription, timer);\n      }, source);\n    };\n\n  /**\n   * Ignores values from an observable sequence which are followed by another value within a computed throttle duration.\n   * @param {Function} durationSelector Selector function to retrieve a sequence indicating the throttle duration for each given element.\n   * @returns {Observable} The debounced sequence.\n   */\n  observableProto.debounceWithSelector = function (durationSelector) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var value, hasValue = false, cancelable = new SerialDisposable(), id = 0;\n      var subscription = source.subscribe(function (x) {\n        var throttle;\n        try {\n          throttle = durationSelector(x);\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n\n        isPromise(throttle) && (throttle = observableFromPromise(throttle));\n\n        hasValue = true;\n        value = x;\n        id++;\n        var currentid = id, d = new SingleAssignmentDisposable();\n        cancelable.setDisposable(d);\n        d.setDisposable(throttle.subscribe(function () {\n          hasValue && id === currentid && observer.onNext(value);\n          hasValue = false;\n          d.dispose();\n        }, observer.onError.bind(observer), function () {\n          hasValue && id === currentid && observer.onNext(value);\n          hasValue = false;\n          d.dispose();\n        }));\n      }, function (e) {\n        cancelable.dispose();\n        observer.onError(e);\n        hasValue = false;\n        id++;\n      }, function () {\n        cancelable.dispose();\n        hasValue && observer.onNext(value);\n        observer.onCompleted();\n        hasValue = false;\n        id++;\n      });\n      return new CompositeDisposable(subscription, cancelable);\n    }, source);\n  };\n\n  observableProto.throttleWithSelector = function () {\n    //deprecate('throttleWithSelector', 'debounceWithSelector');\n    return this.debounceWithSelector.apply(this, arguments);\n  };\n\n  /**\n   *  Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   *\n   *  1 - res = source.skipLastWithTime(5000);\n   *  2 - res = source.skipLastWithTime(5000, scheduler);\n   *\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for skipping elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence.\n   */\n  observableProto.skipLastWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        var now = scheduler.now();\n        q.push({ interval: now, value: x });\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          o.onNext(q.shift().value);\n        }\n      }, function (e) { o.onError(e); }, function () {\n        var now = scheduler.now();\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          o.onNext(q.shift().value);\n        }\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        var now = scheduler.now();\n        q.push({ interval: now, value: x });\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          q.shift();\n        }\n      }, function (e) { o.onError(e); }, function () {\n        var now = scheduler.now();\n        while (q.length > 0) {\n          var next = q.shift();\n          if (now - next.interval <= duration) { o.onNext(next.value); }\n        }\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastBufferWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        var now = scheduler.now();\n        q.push({ interval: now, value: x });\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          q.shift();\n        }\n      }, function (e) { o.onError(e); }, function () {\n        var now = scheduler.now(), res = [];\n        while (q.length > 0) {\n          var next = q.shift();\n          now - next.interval <= duration && res.push(next.value);\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.takeWithTime(5000,  [optional scheduler]);\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence.\n   */\n  observableProto.takeWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (o) {\n      return new CompositeDisposable(scheduler.scheduleWithRelative(duration, function () { o.onCompleted(); }), source.subscribe(o));\n    }, source);\n  };\n\n  /**\n   *  Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.skipWithTime(5000, [optional scheduler]);\n   *\n   * @description\n   *  Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence.\n   *  This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded\n   *  may not execute immediately, despite the zero due time.\n   *\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration.\n   * @param {Number} duration Duration for skipping elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence.\n   */\n  observableProto.skipWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (observer) {\n      var open = false;\n      return new CompositeDisposable(\n        scheduler.scheduleWithRelative(duration, function () { open = true; }),\n        source.subscribe(function (x) { open && observer.onNext(x); }, observer.onError.bind(observer), observer.onCompleted.bind(observer)));\n    }, source);\n  };\n\n  /**\n   *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n   *\n   * @examples\n   *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n   *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n   * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n   */\n  observableProto.skipUntilWithTime = function (startTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    var source = this, schedulerMethod = startTime instanceof Date ?\n      'scheduleWithAbsolute' :\n      'scheduleWithRelative';\n    return new AnonymousObservable(function (o) {\n      var open = false;\n\n      return new CompositeDisposable(\n        scheduler[schedulerMethod](startTime, function () { open = true; }),\n        source.subscribe(\n          function (x) { open && o.onNext(x); },\n          function (e) { o.onError(e); }, function () { o.onCompleted(); }));\n    }, source);\n  };\n\n  /**\n   *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n   * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n   * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n   */\n  observableProto.takeUntilWithTime = function (endTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    var source = this, schedulerMethod = endTime instanceof Date ?\n      'scheduleWithAbsolute' :\n      'scheduleWithRelative';\n    return new AnonymousObservable(function (o) {\n      return new CompositeDisposable(\n        scheduler[schedulerMethod](endTime, function () { o.onCompleted(); }),\n        source.subscribe(o));\n    }, source);\n  };\n\n  /**\n   * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n   * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n   * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n   * @returns {Observable} An Observable that performs the throttle operation.\n   */\n  observableProto.throttleFirst = function (windowDuration, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    var duration = +windowDuration || 0;\n    if (duration <= 0) { throw new RangeError('windowDuration cannot be less or equal zero.'); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var lastOnNext = 0;\n      return source.subscribe(\n        function (x) {\n          var now = scheduler.now();\n          if (lastOnNext === 0 || now - lastOnNext >= duration) {\n            lastOnNext = now;\n            o.onNext(x);\n          }\n        },function (e) { o.onError(e); }, function () { o.onCompleted(); }\n      );\n    }, source);\n  };\n\n  /*\n   * Performs a exclusive waiting for the first to finish before subscribing to another observable.\n   * Observables that come in between subscriptions will be dropped on the floor.\n   * @returns {Observable} A exclusive observable with only the results that happen when subscribed.\n   */\n  observableProto.exclusive = function () {\n    var sources = this;\n    return new AnonymousObservable(function (observer) {\n      var hasCurrent = false,\n        isStopped = false,\n        m = new SingleAssignmentDisposable(),\n        g = new CompositeDisposable();\n\n      g.add(m);\n\n      m.setDisposable(sources.subscribe(\n        function (innerSource) {\n          if (!hasCurrent) {\n            hasCurrent = true;\n\n            isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n\n            var innerSubscription = new SingleAssignmentDisposable();\n            g.add(innerSubscription);\n\n            innerSubscription.setDisposable(innerSource.subscribe(\n              observer.onNext.bind(observer),\n              observer.onError.bind(observer),\n              function () {\n                g.remove(innerSubscription);\n                hasCurrent = false;\n                if (isStopped && g.length === 1) {\n                  observer.onCompleted();\n                }\n            }));\n          }\n        },\n        observer.onError.bind(observer),\n        function () {\n          isStopped = true;\n          if (!hasCurrent && g.length === 1) {\n            observer.onCompleted();\n          }\n        }));\n\n      return g;\n    }, this);\n  };\n\n  /*\n   * Performs a exclusive map waiting for the first to finish before subscribing to another observable.\n   * Observables that come in between subscriptions will be dropped on the floor.\n   * @param {Function} selector Selector to invoke for every item in the current subscription.\n   * @param {Any} [thisArg] An optional context to invoke with the selector parameter.\n   * @returns {Observable} An exclusive observable with only the results that happen when subscribed.\n   */\n  observableProto.exclusiveMap = function (selector, thisArg) {\n    var sources = this,\n        selectorFunc = bindCallback(selector, thisArg, 3);\n    return new AnonymousObservable(function (observer) {\n      var index = 0,\n        hasCurrent = false,\n        isStopped = true,\n        m = new SingleAssignmentDisposable(),\n        g = new CompositeDisposable();\n\n      g.add(m);\n\n      m.setDisposable(sources.subscribe(\n        function (innerSource) {\n\n          if (!hasCurrent) {\n            hasCurrent = true;\n\n            innerSubscription = new SingleAssignmentDisposable();\n            g.add(innerSubscription);\n\n            isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n\n            innerSubscription.setDisposable(innerSource.subscribe(\n              function (x) {\n                var result;\n                try {\n                  result = selectorFunc(x, index++, innerSource);\n                } catch (e) {\n                  observer.onError(e);\n                  return;\n                }\n\n                observer.onNext(result);\n              },\n              function (e) { observer.onError(e); },\n              function () {\n                g.remove(innerSubscription);\n                hasCurrent = false;\n\n                if (isStopped && g.length === 1) {\n                  observer.onCompleted();\n                }\n              }));\n          }\n        },\n        function (e) { observer.onError(e); },\n        function () {\n          isStopped = true;\n          if (g.length === 1 && !hasCurrent) {\n            observer.onCompleted();\n          }\n        }));\n      return g;\n    }, this);\n  };\n\n  /**\n   * Executes a transducer to transform the observable sequence\n   * @param {Transducer} transducer A transducer to execute\n   * @returns {Observable} An Observable sequence containing the results from the transducer.\n   */\n  observableProto.transduce = function(transducer) {\n    var source = this;\n\n    function transformForObserver(observer) {\n      return {\n        init: function() {\n          return observer;\n        },\n        step: function(obs, input) {\n          return obs.onNext(input);\n        },\n        result: function(obs) {\n          return obs.onCompleted();\n        }\n      };\n    }\n\n    return new AnonymousObservable(function(observer) {\n      var xform = transducer(transformForObserver(observer));\n      return source.subscribe(\n        function(v) {\n          try {\n            xform.step(observer, v);\n          } catch (e) {\n            observer.onError(e);\n          }\n        },\n        observer.onError.bind(observer),\n        function() { xform.result(observer); }\n      );\n    }, source);\n  };\n\n  /** Provides a set of extension methods for virtual time scheduling. */\n  Rx.VirtualTimeScheduler = (function (__super__) {\n\n    function notImplemented() {\n        throw new Error('Not implemented');\n    }\n\n    function localNow() {\n      return this.toDateTimeOffset(this.clock);\n    }\n\n    function scheduleNow(state, action) {\n      return this.scheduleAbsoluteWithState(state, this.clock, action);\n    }\n\n    function scheduleRelative(state, dueTime, action) {\n      return this.scheduleRelativeWithState(state, this.toRelative(dueTime), action);\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleRelativeWithState(state, this.toRelative(dueTime - this.now()), action);\n    }\n\n    function invokeAction(scheduler, action) {\n      action();\n      return disposableEmpty;\n    }\n\n    inherits(VirtualTimeScheduler, __super__);\n\n    /**\n     * Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer.\n     *\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function VirtualTimeScheduler(initialClock, comparer) {\n      this.clock = initialClock;\n      this.comparer = comparer;\n      this.isEnabled = false;\n      this.queue = new PriorityQueue(1024);\n      __super__.call(this, localNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n    }\n\n    var VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype;\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    VirtualTimeSchedulerPrototype.add = notImplemented;\n\n    /**\n     * Converts an absolute time to a number\n     * @param {Any} The absolute time.\n     * @returns {Number} The absolute time in ms\n     */\n    VirtualTimeSchedulerPrototype.toDateTimeOffset = notImplemented;\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    VirtualTimeSchedulerPrototype.toRelative = notImplemented;\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be emulated using recursive scheduling.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.schedulePeriodicWithState = function (state, period, action) {\n      var s = new SchedulePeriodicRecursive(this, state, period, action);\n      return s.start();\n    };\n\n    /**\n     * Schedules an action to be executed after dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleRelativeWithState = function (state, dueTime, action) {\n      var runAt = this.add(this.clock, dueTime);\n      return this.scheduleAbsoluteWithState(state, runAt, action);\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleRelative = function (dueTime, action) {\n      return this.scheduleRelativeWithState(action, dueTime, invokeAction);\n    };\n\n    /**\n     * Starts the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.start = function () {\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n      }\n    };\n\n    /**\n     * Stops the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.stop = function () {\n      this.isEnabled = false;\n    };\n\n    /**\n     * Advances the scheduler's clock to the specified time, running all work till that point.\n     * @param {Number} time Absolute time to advance the scheduler's clock to.\n     */\n    VirtualTimeSchedulerPrototype.advanceTo = function (time) {\n      var dueToClock = this.comparer(this.clock, time);\n      if (this.comparer(this.clock, time) > 0) {\n        throw new Error(argumentOutOfRange);\n      }\n      if (dueToClock === 0) {\n        return;\n      }\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null && this.comparer(next.dueTime, time) <= 0) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n        this.clock = time;\n      }\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.advanceBy = function (time) {\n      var dt = this.add(this.clock, time),\n          dueToClock = this.comparer(this.clock, dt);\n      if (dueToClock > 0) { throw new Error(argumentOutOfRange); }\n      if (dueToClock === 0) {  return; }\n\n      this.advanceTo(dt);\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.sleep = function (time) {\n      var dt = this.add(this.clock, time);\n      if (this.comparer(this.clock, dt) >= 0) { throw new Error(argumentOutOfRange); }\n\n      this.clock = dt;\n    };\n\n    /**\n     * Gets the next scheduled item to be executed.\n     * @returns {ScheduledItem} The next scheduled item.\n     */\n    VirtualTimeSchedulerPrototype.getNext = function () {\n      while (this.queue.length > 0) {\n        var next = this.queue.peek();\n        if (next.isCancelled()) {\n          this.queue.dequeue();\n        } else {\n          return next;\n        }\n      }\n      return null;\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Scheduler} scheduler Scheduler to execute the action on.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleAbsolute = function (dueTime, action) {\n      return this.scheduleAbsoluteWithState(action, dueTime, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleAbsoluteWithState = function (state, dueTime, action) {\n      var self = this;\n\n      function run(scheduler, state1) {\n        self.queue.remove(si);\n        return action(scheduler, state1);\n      }\n\n      var si = new ScheduledItem(this, state, run, dueTime, this.comparer);\n      this.queue.enqueue(si);\n\n      return si.disposable;\n    };\n\n    return VirtualTimeScheduler;\n  }(Scheduler));\n\n  /** Provides a virtual time scheduler that uses Date for absolute time and number for relative time. */\n  Rx.HistoricalScheduler = (function (__super__) {\n    inherits(HistoricalScheduler, __super__);\n\n    /**\n     * Creates a new historical scheduler with the specified initial clock value.\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function HistoricalScheduler(initialClock, comparer) {\n      var clock = initialClock == null ? 0 : initialClock;\n      var cmp = comparer || defaultSubComparer;\n      __super__.call(this, clock, cmp);\n    }\n\n    var HistoricalSchedulerProto = HistoricalScheduler.prototype;\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    HistoricalSchedulerProto.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n\n    HistoricalSchedulerProto.toDateTimeOffset = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @memberOf HistoricalScheduler\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    HistoricalSchedulerProto.toRelative = function (timeSpan) {\n      return timeSpan;\n    };\n\n    return HistoricalScheduler;\n  }(Rx.VirtualTimeScheduler));\n\n  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {\n    inherits(AnonymousObservable, __super__);\n\n    // Fix subscriber to check for undefined or function returned to decorate as Disposable\n    function fixSubscriber(subscriber) {\n      if (subscriber && typeof subscriber.dispose === 'function') { return subscriber; }\n\n      return typeof subscriber === 'function' ?\n        disposableCreate(subscriber) :\n        disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], subscribe = state[1];\n      try {\n        ado.setDisposable(fixSubscriber(subscribe(ado)));\n      } catch (e) {\n        if (!ado.fail(e)) { throw e; }\n      }\n    }\n\n    function AnonymousObservable(subscribe, parent) {\n      this.source = parent;\n\n      function s(observer) {\n\n        var ado = new AutoDetachObserver(observer), state = [ado, subscribe];\n\n        if (currentThreadScheduler.scheduleRequired()) {\n          currentThreadScheduler.scheduleWithState(state, setDisposable);\n        } else {\n          setDisposable(null, state);\n        }\n\n        return ado;\n      }\n\n      __super__.call(this, s);\n    }\n\n    return AnonymousObservable;\n\n  }(Observable));\n\n  var AutoDetachObserver = (function (__super__) {\n    inherits(AutoDetachObserver, __super__);\n\n    function AutoDetachObserver(observer) {\n      __super__.call(this);\n      this.observer = observer;\n      this.m = new SingleAssignmentDisposable();\n    }\n\n    var AutoDetachObserverPrototype = AutoDetachObserver.prototype;\n\n    AutoDetachObserverPrototype.next = function (value) {\n      var noError = false;\n      try {\n        this.observer.onNext(value);\n        noError = true;\n      } catch (e) {\n        throw e;\n      } finally {\n        !noError && this.dispose();\n      }\n    };\n\n    AutoDetachObserverPrototype.error = function (err) {\n      try {\n        this.observer.onError(err);\n      } catch (e) {\n        throw e;\n      } finally {\n        this.dispose();\n      }\n    };\n\n    AutoDetachObserverPrototype.completed = function () {\n      try {\n        this.observer.onCompleted();\n      } catch (e) {\n        throw e;\n      } finally {\n        this.dispose();\n      }\n    };\n\n    AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };\n    AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };\n\n    AutoDetachObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.m.dispose();\n    };\n\n    return AutoDetachObserver;\n  }(AbstractObserver));\n\n  var GroupedObservable = (function (__super__) {\n    inherits(GroupedObservable, __super__);\n\n    function subscribe(observer) {\n      return this.underlyingObservable.subscribe(observer);\n    }\n\n    function GroupedObservable(key, underlyingObservable, mergedDisposable) {\n      __super__.call(this, subscribe);\n      this.key = key;\n      this.underlyingObservable = !mergedDisposable ?\n        underlyingObservable :\n        new AnonymousObservable(function (observer) {\n          return new CompositeDisposable(mergedDisposable.getDisposable(), underlyingObservable.subscribe(observer));\n        });\n    }\n\n    return GroupedObservable;\n  }(Observable));\n\n  /**\n   *  Represents an object that is both an observable sequence as well as an observer.\n   *  Each notification is broadcasted to all subscribed observers.\n   */\n  var Subject = Rx.Subject = (function (__super__) {\n    function subscribe(observer) {\n      checkDisposed(this);\n      if (!this.isStopped) {\n        this.observers.push(observer);\n        return new InnerSubscription(this, observer);\n      }\n      if (this.hasError) {\n        observer.onError(this.error);\n        return disposableEmpty;\n      }\n      observer.onCompleted();\n      return disposableEmpty;\n    }\n\n    inherits(Subject, __super__);\n\n    /**\n     * Creates a subject.\n     */\n    function Subject() {\n      __super__.call(this, subscribe);\n      this.isDisposed = false,\n      this.isStopped = false,\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(Subject.prototype, Observer.prototype, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onCompleted();\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.error = error;\n          this.hasError = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onNext(value);\n          }\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    /**\n     * Creates a subject from the specified observer and observable.\n     * @param {Observer} observer The observer used to send messages to the subject.\n     * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n     * @returns {Subject} Subject implemented using the given observer and observable.\n     */\n    Subject.create = function (observer, observable) {\n      return new AnonymousSubject(observer, observable);\n    };\n\n    return Subject;\n  }(Observable));\n\n  /**\n   *  Represents the result of an asynchronous operation.\n   *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n   */\n  var AsyncSubject = Rx.AsyncSubject = (function (__super__) {\n\n    function subscribe(observer) {\n      checkDisposed(this);\n\n      if (!this.isStopped) {\n        this.observers.push(observer);\n        return new InnerSubscription(this, observer);\n      }\n\n      if (this.hasError) {\n        observer.onError(this.error);\n      } else if (this.hasValue) {\n        observer.onNext(this.value);\n        observer.onCompleted();\n      } else {\n        observer.onCompleted();\n      }\n\n      return disposableEmpty;\n    }\n\n    inherits(AsyncSubject, __super__);\n\n    /**\n     * Creates a subject that can only receive one value and that value is cached for all future observations.\n     * @constructor\n     */\n    function AsyncSubject() {\n      __super__.call(this, subscribe);\n\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasValue = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(AsyncSubject.prototype, Observer, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () {\n        checkDisposed(this);\n        return this.observers.length > 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n       */\n      onCompleted: function () {\n        var i, len;\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          var os = cloneArray(this.observers), len = os.length;\n\n          if (this.hasValue) {\n            for (i = 0; i < len; i++) {\n              var o = os[i];\n              o.onNext(this.value);\n              o.onCompleted();\n            }\n          } else {\n            for (i = 0; i < len; i++) {\n              os[i].onCompleted();\n            }\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the error.\n       * @param {Mixed} error The Error to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.hasError = true;\n          this.error = error;\n\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n       * @param {Mixed} value The value to store in the subject.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        this.hasValue = true;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.exception = null;\n        this.value = null;\n      }\n    });\n\n    return AsyncSubject;\n  }(Observable));\n\n  var AnonymousSubject = Rx.AnonymousSubject = (function (__super__) {\n    inherits(AnonymousSubject, __super__);\n\n    function subscribe(observer) {\n      return this.observable.subscribe(observer);\n    }\n\n    function AnonymousSubject(observer, observable) {\n      this.observer = observer;\n      this.observable = observable;\n      __super__.call(this, subscribe);\n    }\n\n    addProperties(AnonymousSubject.prototype, Observer.prototype, {\n      onCompleted: function () {\n        this.observer.onCompleted();\n      },\n      onError: function (error) {\n        this.observer.onError(error);\n      },\n      onNext: function (value) {\n        this.observer.onNext(value);\n      }\n    });\n\n    return AnonymousSubject;\n  }(Observable));\n\n  /**\n  * Used to pause and resume streams.\n  */\n  Rx.Pauser = (function (__super__) {\n    inherits(Pauser, __super__);\n\n    function Pauser() {\n      __super__.call(this);\n    }\n\n    /**\n     * Pauses the underlying sequence.\n     */\n    Pauser.prototype.pause = function () { this.onNext(false); };\n\n    /**\n    * Resumes the underlying sequence.\n    */\n    Pauser.prototype.resume = function () { this.onNext(true); };\n\n    return Pauser;\n  }(Subject));\n\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    root.Rx = Rx;\n\n    define(function() {\n      return Rx;\n    });\n  } else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = Rx).Rx = Rx;\n    } else {\n      freeExports.Rx = Rx;\n    }\n  } else {\n    // in a browser or Rhino\n    root.Rx = Rx;\n  }\n\n  // All code before this point will be filtered from stack traces.\n  var rEndingLine = captureLine();\n\n}.call(this));\n"
  },
  {
    "path": "tests/perf/old/rx.all.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n;(function (undefined) {\n\n  var objectTypes = {\n    'boolean': false,\n    'function': true,\n    'object': true,\n    'number': false,\n    'string': false,\n    'undefined': false\n  };\n\n  var root = (objectTypes[typeof window] && window) || this,\n    freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n    freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n    moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n    freeGlobal = objectTypes[typeof global] && global;\n\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n    root = freeGlobal;\n  }\n\n  var Rx = {\n      internals: {},\n      config: {\n        Promise: root.Promise\n      },\n      helpers: { }\n  };\n\n  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    notDefined = Rx.helpers.notDefined = function (x) { return typeof x === 'undefined'; },\n    isScheduler = Rx.helpers.isScheduler = function (x) { return x instanceof Rx.Scheduler; },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    pluck = Rx.helpers.pluck = function (property) { return function (x) { return x[property]; }; },\n    just = Rx.helpers.just = function (value) { return function () { return value; }; },\n    defaultNow = Rx.helpers.defaultNow = Date.now,\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.then === 'function'; },\n    asArray = Rx.helpers.asArray = function () { return Array.prototype.slice.call(arguments); },\n    not = Rx.helpers.not = function (a) { return !a; },\n    isFunction = Rx.helpers.isFunction = (function () {\n\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      }\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n\n      return isFn;\n    }());\n\n  // Errors\n  var sequenceContainsNoElements = 'Sequence contains no elements.';\n  var argumentOutOfRange = 'Argument out of range';\n  var objectDisposed = 'Object has been disposed';\n  function checkDisposed(self) { if (self.isDisposed) { throw new Error(objectDisposed); } }\n  function cloneArray(arr) { for(var a = [], i = 0, len = arr.length; i < len; i++) { a.push(arr[i]); } return a;}\n\n  Rx.config.longStackSupport = false;\n  var hasStacks = false;\n  try {\n    throw new Error();\n  } catch (e) {\n    hasStacks = !!e.stack;\n  }\n\n  // All code after this point will be filtered from stack traces reported by RxJS\n  var rStartingLine = captureLine(), rFileName;\n\n  var STACK_JUMP_SEPARATOR = \"From previous event:\";\n\n  function makeStackTraceLong(error, observable) {\n      // If possible, transform the error stack trace by removing Node and RxJS\n      // cruft, then concatenating with the stack trace of `observable`.\n      if (hasStacks &&\n          observable.stack &&\n          typeof error === \"object\" &&\n          error !== null &&\n          error.stack &&\n          error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n      ) {\n        var stacks = [];\n        for (var o = observable; !!o; o = o.source) {\n          if (o.stack) {\n            stacks.unshift(o.stack);\n          }\n        }\n        stacks.unshift(error.stack);\n\n        var concatedStacks = stacks.join(\"\\n\" + STACK_JUMP_SEPARATOR + \"\\n\");\n        error.stack = filterStackString(concatedStacks);\n    }\n  }\n\n  function filterStackString(stackString) {\n    var lines = stackString.split(\"\\n\"),\n        desiredLines = [];\n    for (var i = 0, len = lines.length; i < len; i++) {\n      var line = lines[i];\n\n      if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n        desiredLines.push(line);\n      }\n    }\n    return desiredLines.join(\"\\n\");\n  }\n\n  function isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n    if (!fileNameAndLineNumber) {\n      return false;\n    }\n    var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === rFileName &&\n      lineNumber >= rStartingLine &&\n      lineNumber <= rEndingLine;\n  }\n\n  function isNodeFrame(stackLine) {\n    return stackLine.indexOf(\"(module.js:\") !== -1 ||\n      stackLine.indexOf(\"(node.js:\") !== -1;\n  }\n\n  function captureLine() {\n    if (!hasStacks) { return; }\n\n    try {\n      throw new Error();\n    } catch (e) {\n      var lines = e.stack.split(\"\\n\");\n      var firstLine = lines[0].indexOf(\"@\") > 0 ? lines[1] : lines[2];\n      var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n      if (!fileNameAndLineNumber) { return; }\n\n      rFileName = fileNameAndLineNumber[0];\n      return fileNameAndLineNumber[1];\n    }\n  }\n\n  function getFileNameAndLineNumber(stackLine) {\n    // Named functions: \"at functionName (filename:lineNumber:columnNumber)\"\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }\n\n    // Anonymous functions: \"at filename:lineNumber:columnNumber\"\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }\n\n    // Firefox style: \"function@filename:lineNumber or @filename:lineNumber\"\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }\n  }\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o[$iterator$] !== undefined;\n  }\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  }\n\n  Rx.helpers.iterator = $iterator$;\n\n  var bindCallback = Rx.internals.bindCallback = function (func, thisArg, argCount) {\n    if (typeof thisArg === 'undefined') { return func; }\n    switch(argCount) {\n      case 0:\n        return function() {\n          return func.call(thisArg)\n        };\n      case 1:\n        return function(arg) {\n          return func.call(thisArg, arg);\n        }\n      case 2:\n        return function(value, index) {\n          return func.call(thisArg, value, index);\n        };\n      case 3:\n        return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n    }\n\n    return function() {\n      return func.apply(thisArg, arguments);\n    };\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var dontEnums = ['toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'],\n  dontEnumsLength = dontEnums.length;\n\n  /** `Object#toString` result shortcuts */\n  var argsClass = '[object Arguments]',\n    arrayClass = '[object Array]',\n    boolClass = '[object Boolean]',\n    dateClass = '[object Date]',\n    errorClass = '[object Error]',\n    funcClass = '[object Function]',\n    numberClass = '[object Number]',\n    objectClass = '[object Object]',\n    regexpClass = '[object RegExp]',\n    stringClass = '[object String]';\n\n  var toString = Object.prototype.toString,\n    hasOwnProperty = Object.prototype.hasOwnProperty,\n    supportsArgsClass = toString.call(arguments) == argsClass, // For less <IE9 && FF<4\n    supportNodeClass,\n    errorProto = Error.prototype,\n    objectProto = Object.prototype,\n    stringProto = String.prototype,\n    propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n  try {\n    supportNodeClass = !(toString.call(document) == objectClass && !({ 'toString': 0 } + ''));\n  } catch (e) {\n    supportNodeClass = true;\n  }\n\n  var nonEnumProps = {};\n  nonEnumProps[arrayClass] = nonEnumProps[dateClass] = nonEnumProps[numberClass] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true };\n  nonEnumProps[boolClass] = nonEnumProps[stringClass] = { 'constructor': true, 'toString': true, 'valueOf': true };\n  nonEnumProps[errorClass] = nonEnumProps[funcClass] = nonEnumProps[regexpClass] = { 'constructor': true, 'toString': true };\n  nonEnumProps[objectClass] = { 'constructor': true };\n\n  var support = {};\n  (function () {\n    var ctor = function() { this.x = 1; },\n      props = [];\n\n    ctor.prototype = { 'valueOf': 1, 'y': 1 };\n    for (var key in new ctor) { props.push(key); }\n    for (key in arguments) { }\n\n    // Detect if `name` or `message` properties of `Error.prototype` are enumerable by default.\n    support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') || propertyIsEnumerable.call(errorProto, 'name');\n\n    // Detect if `prototype` properties are enumerable by default.\n    support.enumPrototypes = propertyIsEnumerable.call(ctor, 'prototype');\n\n    // Detect if `arguments` object indexes are non-enumerable\n    support.nonEnumArgs = key != 0;\n\n    // Detect if properties shadowing those on `Object.prototype` are non-enumerable.\n    support.nonEnumShadows = !/valueOf/.test(props);\n  }(1));\n\n  var isObject = Rx.internals.isObject = function(value) {\n    var type = typeof value;\n    return value && (type == 'function' || type == 'object') || false;\n  };\n\n  function keysIn(object) {\n    var result = [];\n    if (!isObject(object)) {\n      return result;\n    }\n    if (support.nonEnumArgs && object.length && isArguments(object)) {\n      object = slice.call(object);\n    }\n    var skipProto = support.enumPrototypes && typeof object == 'function',\n        skipErrorProps = support.enumErrorProps && (object === errorProto || object instanceof Error);\n\n    for (var key in object) {\n      if (!(skipProto && key == 'prototype') &&\n          !(skipErrorProps && (key == 'message' || key == 'name'))) {\n        result.push(key);\n      }\n    }\n\n    if (support.nonEnumShadows && object !== objectProto) {\n      var ctor = object.constructor,\n          index = -1,\n          length = dontEnumsLength;\n\n      if (object === (ctor && ctor.prototype)) {\n        var className = object === stringProto ? stringClass : object === errorProto ? errorClass : toString.call(object),\n            nonEnum = nonEnumProps[className];\n      }\n      while (++index < length) {\n        key = dontEnums[index];\n        if (!(nonEnum && nonEnum[key]) && hasOwnProperty.call(object, key)) {\n          result.push(key);\n        }\n      }\n    }\n    return result;\n  }\n\n  function internalFor(object, callback, keysFunc) {\n    var index = -1,\n      props = keysFunc(object),\n      length = props.length;\n\n    while (++index < length) {\n      var key = props[index];\n      if (callback(object[key], key, object) === false) {\n        break;\n      }\n    }\n    return object;\n  }\n\n  function internalForIn(object, callback) {\n    return internalFor(object, callback, keysIn);\n  }\n\n  function isNode(value) {\n    // IE < 9 presents DOM nodes as `Object` objects except they have `toString`\n    // methods that are `typeof` \"string\" and still can coerce nodes to strings\n    return typeof value.toString != 'function' && typeof (value + '') == 'string';\n  }\n\n  var isArguments = function(value) {\n    return (value && typeof value == 'object') ? toString.call(value) == argsClass : false;\n  }\n\n  // fallback for browsers that can't detect `arguments` objects by [[Class]]\n  if (!supportsArgsClass) {\n    isArguments = function(value) {\n      return (value && typeof value == 'object') ? hasOwnProperty.call(value, 'callee') : false;\n    };\n  }\n\n  var isEqual = Rx.internals.isEqual = function (x, y) {\n    return deepEquals(x, y, [], []);\n  };\n\n  /** @private\n   * Used for deep comparison\n   **/\n  function deepEquals(a, b, stackA, stackB) {\n    // exit early for identical values\n    if (a === b) {\n      // treat `+0` vs. `-0` as not equal\n      return a !== 0 || (1 / a == 1 / b);\n    }\n\n    var type = typeof a,\n        otherType = typeof b;\n\n    // exit early for unlike primitive values\n    if (a === a && (a == null || b == null ||\n        (type != 'function' && type != 'object' && otherType != 'function' && otherType != 'object'))) {\n      return false;\n    }\n\n    // compare [[Class]] names\n    var className = toString.call(a),\n        otherClass = toString.call(b);\n\n    if (className == argsClass) {\n      className = objectClass;\n    }\n    if (otherClass == argsClass) {\n      otherClass = objectClass;\n    }\n    if (className != otherClass) {\n      return false;\n    }\n    switch (className) {\n      case boolClass:\n      case dateClass:\n        // coerce dates and booleans to numbers, dates to milliseconds and booleans\n        // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\n        return +a == +b;\n\n      case numberClass:\n        // treat `NaN` vs. `NaN` as equal\n        return (a != +a) ?\n          b != +b :\n          // but treat `-0` vs. `+0` as not equal\n          (a == 0 ? (1 / a == 1 / b) : a == +b);\n\n      case regexpClass:\n      case stringClass:\n        // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\n        // treat string primitives and their corresponding object instances as equal\n        return a == String(b);\n    }\n    var isArr = className == arrayClass;\n    if (!isArr) {\n\n      // exit for functions and DOM nodes\n      if (className != objectClass || (!support.nodeClass && (isNode(a) || isNode(b)))) {\n        return false;\n      }\n      // in older versions of Opera, `arguments` objects have `Array` constructors\n      var ctorA = !support.argsObject && isArguments(a) ? Object : a.constructor,\n          ctorB = !support.argsObject && isArguments(b) ? Object : b.constructor;\n\n      // non `Object` object instances with different constructors are not equal\n      if (ctorA != ctorB &&\n            !(hasOwnProperty.call(a, 'constructor') && hasOwnProperty.call(b, 'constructor')) &&\n            !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\n            ('constructor' in a && 'constructor' in b)\n          ) {\n        return false;\n      }\n    }\n    // assume cyclic structures are equal\n    // the algorithm for detecting cyclic structures is adapted from ES 5.1\n    // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\n    var initedStack = !stackA;\n    stackA || (stackA = []);\n    stackB || (stackB = []);\n\n    var length = stackA.length;\n    while (length--) {\n      if (stackA[length] == a) {\n        return stackB[length] == b;\n      }\n    }\n    var size = 0;\n    var result = true;\n\n    // add `a` and `b` to the stack of traversed objects\n    stackA.push(a);\n    stackB.push(b);\n\n    // recursively compare objects and arrays (susceptible to call stack limits)\n    if (isArr) {\n      // compare lengths to determine if a deep comparison is necessary\n      length = a.length;\n      size = b.length;\n      result = size == length;\n\n      if (result) {\n        // deep compare the contents, ignoring non-numeric properties\n        while (size--) {\n          var index = length,\n              value = b[size];\n\n          if (!(result = deepEquals(a[size], value, stackA, stackB))) {\n            break;\n          }\n        }\n      }\n    }\n    else {\n      // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\n      // which, in this case, is more costly\n      internalForIn(b, function(value, key, b) {\n        if (hasOwnProperty.call(b, key)) {\n          // count the number of properties.\n          size++;\n          // deep compare each property value.\n          return (result = hasOwnProperty.call(a, key) && deepEquals(a[key], value, stackA, stackB));\n        }\n      });\n\n      if (result) {\n        // ensure both objects have the same number of properties\n        internalForIn(a, function(value, key, a) {\n          if (hasOwnProperty.call(a, key)) {\n            // `size` will be `-1` if `a` has more properties than `b`\n            return (result = --size > -1);\n          }\n        });\n      }\n    }\n    stackA.pop();\n    stackB.pop();\n\n    return result;\n  }\n\n  var hasProp = {}.hasOwnProperty,\n      slice = Array.prototype.slice;\n\n  var inherits = this.inherits = Rx.internals.inherits = function (child, parent) {\n    function __() { this.constructor = child; }\n    __.prototype = parent.prototype;\n    child.prototype = new __();\n  };\n\n  var addProperties = Rx.internals.addProperties = function (obj) {\n    for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n      var source = sources[idx];\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n  };\n\n  // Rx Utils\n  var addRef = Rx.internals.addRef = function (xs, r) {\n    return new AnonymousObservable(function (observer) {\n      return new CompositeDisposable(r.getDisposable(), xs.subscribe(observer));\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n\n  // Collections\n  function IndexedItem(id, value) {\n    this.id = id;\n    this.value = value;\n  }\n\n  IndexedItem.prototype.compareTo = function (other) {\n    var c = this.value.compareTo(other.value);\n    c === 0 && (c = this.id - other.id);\n    return c;\n  };\n\n  // Priority Queue for Scheduling\n  var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) {\n    this.items = new Array(capacity);\n    this.length = 0;\n  };\n\n  var priorityProto = PriorityQueue.prototype;\n  priorityProto.isHigherPriority = function (left, right) {\n    return this.items[left].compareTo(this.items[right]) < 0;\n  };\n\n  priorityProto.percolate = function (index) {\n    if (index >= this.length || index < 0) { return; }\n    var parent = index - 1 >> 1;\n    if (parent < 0 || parent === index) { return; }\n    if (this.isHigherPriority(index, parent)) {\n      var temp = this.items[index];\n      this.items[index] = this.items[parent];\n      this.items[parent] = temp;\n      this.percolate(parent);\n    }\n  };\n\n  priorityProto.heapify = function (index) {\n    +index || (index = 0);\n    if (index >= this.length || index < 0) { return; }\n    var left = 2 * index + 1,\n        right = 2 * index + 2,\n        first = index;\n    if (left < this.length && this.isHigherPriority(left, first)) {\n      first = left;\n    }\n    if (right < this.length && this.isHigherPriority(right, first)) {\n      first = right;\n    }\n    if (first !== index) {\n      var temp = this.items[index];\n      this.items[index] = this.items[first];\n      this.items[first] = temp;\n      this.heapify(first);\n    }\n  };\n\n  priorityProto.peek = function () { return this.items[0].value; };\n\n  priorityProto.removeAt = function (index) {\n    this.items[index] = this.items[--this.length];\n    this.items[this.length] = undefined;\n    this.heapify();\n  };\n\n  priorityProto.dequeue = function () {\n    var result = this.peek();\n    this.removeAt(0);\n    return result;\n  };\n\n  priorityProto.enqueue = function (item) {\n    var index = this.length++;\n    this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n    this.percolate(index);\n  };\n\n  priorityProto.remove = function (item) {\n    for (var i = 0; i < this.length; i++) {\n      if (this.items[i].value === item) {\n        this.removeAt(i);\n        return true;\n      }\n    }\n    return false;\n  };\n  PriorityQueue.count = 0;\n\n  /**\n   * Represents a group of disposable resources that are disposed together.\n   * @constructor\n   */\n  var CompositeDisposable = Rx.CompositeDisposable = function () {\n    var args = [];\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    }\n    this.disposables = args;\n    this.isDisposed = false;\n    this.length = this.disposables.length;\n  };\n\n  var CompositeDisposablePrototype = CompositeDisposable.prototype;\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Mixed} item Disposable to add.\n   */\n  CompositeDisposablePrototype.add = function (item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n      this.length++;\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Mixed} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n  CompositeDisposablePrototype.remove = function (item) {\n    var shouldDispose = false;\n    if (!this.isDisposed) {\n      var idx = this.disposables.indexOf(item);\n      if (idx !== -1) {\n        shouldDispose = true;\n        this.disposables.splice(idx, 1);\n        this.length--;\n        item.dispose();\n      }\n    }\n    return shouldDispose;\n  };\n\n  /**\n   *  Disposes all disposables in the group and removes them from the group.\n   */\n  CompositeDisposablePrototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      for(var currentDisposables = [], i = 0, len = this.disposables.length; i < len; i++) { currentDisposables.push(this.disposables[i]); }\n      this.disposables = [];\n      this.length = 0;\n\n      for (i = 0, len = currentDisposables.length; i < len; i++) {\n        currentDisposables[i].dispose();\n      }\n    }\n  };\n\n  /**\n   * Converts the existing CompositeDisposable to an array of disposables\n   * @returns {Array} An array of disposable objects.\n   */\n  CompositeDisposablePrototype.toArray = function () {\n    for(var currentDisposables = [], ix = 0, len = this.disposables.length; i < len; i++) { currentDisposables.push(this.disposables[i]); }\n    return currentDisposables;\n  };\n\n  /**\n   * Provides a set of static methods for creating Disposables.\n   *\n   * @constructor\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   */\n  var Disposable = Rx.Disposable = function (action) {\n    this.isDisposed = false;\n    this.action = action || noop;\n  };\n\n  /** Performs the task of cleaning up resources. */\n  Disposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.action();\n      this.isDisposed = true;\n    }\n  };\n\n  /**\n   * Creates a disposable object that invokes the specified action when disposed.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   * @return {Disposable} The disposable object that runs the given action upon disposal.\n   */\n  var disposableCreate = Disposable.create = function (action) { return new Disposable(action); };\n\n  /**\n   * Gets the disposable that does nothing when disposed.\n   */\n  var disposableEmpty = Disposable.empty = { dispose: noop };\n\n  var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = (function () {\n    function BooleanDisposable () {\n      this.isDisposed = false;\n      this.current = null;\n    }\n\n    var booleanDisposablePrototype = BooleanDisposable.prototype;\n\n    /**\n     * Gets the underlying disposable.\n     * @return The underlying disposable.\n     */\n    booleanDisposablePrototype.getDisposable = function () {\n      return this.current;\n    };\n\n    /**\n     * Sets the underlying disposable.\n     * @param {Disposable} value The new underlying disposable.\n     */\n    booleanDisposablePrototype.setDisposable = function (value) {\n      var shouldDispose = this.isDisposed;\n      if (!shouldDispose) {\n        var old = this.current;\n        this.current = value;\n      }\n      old && old.dispose();\n      shouldDispose && value && value.dispose();\n    };\n\n    /**\n     * Disposes the underlying disposable as well as all future replacements.\n     */\n    booleanDisposablePrototype.dispose = function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        var old = this.current;\n        this.current = null;\n      }\n      old && old.dispose();\n    };\n\n    return BooleanDisposable;\n  }());\n  var SerialDisposable = Rx.SerialDisposable = SingleAssignmentDisposable;\n\n  /**\n   * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n   */\n  var RefCountDisposable = Rx.RefCountDisposable = (function () {\n\n    function InnerDisposable(disposable) {\n      this.disposable = disposable;\n      this.disposable.count++;\n      this.isInnerDisposed = false;\n    }\n\n    InnerDisposable.prototype.dispose = function () {\n      if (!this.disposable.isDisposed && !this.isInnerDisposed) {\n        this.isInnerDisposed = true;\n        this.disposable.count--;\n        if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {\n          this.disposable.isDisposed = true;\n          this.disposable.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Initializes a new instance of the RefCountDisposable with the specified disposable.\n     * @constructor\n     * @param {Disposable} disposable Underlying disposable.\n      */\n    function RefCountDisposable(disposable) {\n      this.underlyingDisposable = disposable;\n      this.isDisposed = false;\n      this.isPrimaryDisposed = false;\n      this.count = 0;\n    }\n\n    /**\n     * Disposes the underlying disposable only when all dependent disposables have been disposed\n     */\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed && !this.isPrimaryDisposed) {\n        this.isPrimaryDisposed = true;\n        if (this.count === 0) {\n          this.isDisposed = true;\n          this.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n     * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n     */\n    RefCountDisposable.prototype.getDisposable = function () {\n      return this.isDisposed ? disposableEmpty : new InnerDisposable(this);\n    };\n\n    return RefCountDisposable;\n  })();\n\n  function ScheduledDisposable(scheduler, disposable) {\n    this.scheduler = scheduler;\n    this.disposable = disposable;\n    this.isDisposed = false;\n  }\n\n  function scheduleItem(s, self) {\n    if (!self.isDisposed) {\n      self.isDisposed = true;\n      self.disposable.dispose();\n    }\n  }\n\n  ScheduledDisposable.prototype.dispose = function () {\n    this.scheduler.scheduleWithState(this, scheduleItem);\n  };\n\n  var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) {\n    this.scheduler = scheduler;\n    this.state = state;\n    this.action = action;\n    this.dueTime = dueTime;\n    this.comparer = comparer || defaultSubComparer;\n    this.disposable = new SingleAssignmentDisposable();\n  }\n\n  ScheduledItem.prototype.invoke = function () {\n    this.disposable.setDisposable(this.invokeCore());\n  };\n\n  ScheduledItem.prototype.compareTo = function (other) {\n    return this.comparer(this.dueTime, other.dueTime);\n  };\n\n  ScheduledItem.prototype.isCancelled = function () {\n    return this.disposable.isDisposed;\n  };\n\n  ScheduledItem.prototype.invokeCore = function () {\n    return this.action(this.scheduler, this.state);\n  };\n\n  /** Provides a set of static properties to access commonly used schedulers. */\n  var Scheduler = Rx.Scheduler = (function () {\n\n    function Scheduler(now, schedule, scheduleRelative, scheduleAbsolute) {\n      this.now = now;\n      this._schedule = schedule;\n      this._scheduleRelative = scheduleRelative;\n      this._scheduleAbsolute = scheduleAbsolute;\n    }\n\n    function invokeAction(scheduler, action) {\n      action();\n      return disposableEmpty;\n    }\n\n    var schedulerProto = Scheduler.prototype;\n\n    /**\n     * Schedules an action to be executed.\n     * @param {Function} action Action to execute.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.schedule = function (action) {\n      return this._schedule(action, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed.\n     * @param state State passed to the action to be executed.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithState = function (state, action) {\n      return this._schedule(state, action);\n    };\n\n    /**\n     * Schedules an action to be executed after the specified relative due time.\n     * @param {Function} action Action to execute.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithRelative = function (dueTime, action) {\n      return this._scheduleRelative(action, dueTime, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed after dueTime.\n     * @param state State passed to the action to be executed.\n     * @param {Function} action Action to be executed.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithRelativeAndState = function (state, dueTime, action) {\n      return this._scheduleRelative(state, dueTime, action);\n    };\n\n    /**\n     * Schedules an action to be executed at the specified absolute due time.\n     * @param {Function} action Action to execute.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n      */\n    schedulerProto.scheduleWithAbsolute = function (dueTime, action) {\n      return this._scheduleAbsolute(action, dueTime, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to be executed.\n     * @param {Number}dueTime Absolute time at which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithAbsoluteAndState = function (state, dueTime, action) {\n      return this._scheduleAbsolute(state, dueTime, action);\n    };\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.now = defaultNow;\n\n    /**\n     * Normalizes the specified TimeSpan value to a positive value.\n     * @param {Number} timeSpan The time span value to normalize.\n     * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n     */\n    Scheduler.normalize = function (timeSpan) {\n      timeSpan < 0 && (timeSpan = 0);\n      return timeSpan;\n    };\n\n    return Scheduler;\n  }());\n\n  var normalizeTime = Scheduler.normalize;\n\n  (function (schedulerProto) {\n    function invokeRecImmediate(scheduler, pair) {\n      var state = pair.first, action = pair.second, group = new CompositeDisposable(),\n      recursiveAction = function (state1) {\n        action(state1, function (state2) {\n          var isAdded = false, isDone = false,\n          d = scheduler.scheduleWithState(state2, function (scheduler1, state3) {\n            if (isAdded) {\n              group.remove(d);\n            } else {\n              isDone = true;\n            }\n            recursiveAction(state3);\n            return disposableEmpty;\n          });\n          if (!isDone) {\n            group.add(d);\n            isAdded = true;\n          }\n        });\n      };\n      recursiveAction(state);\n      return group;\n    }\n\n    function invokeRecDate(scheduler, pair, method) {\n      var state = pair.first, action = pair.second, group = new CompositeDisposable(),\n      recursiveAction = function (state1) {\n        action(state1, function (state2, dueTime1) {\n          var isAdded = false, isDone = false,\n          d = scheduler[method](state2, dueTime1, function (scheduler1, state3) {\n            if (isAdded) {\n              group.remove(d);\n            } else {\n              isDone = true;\n            }\n            recursiveAction(state3);\n            return disposableEmpty;\n          });\n          if (!isDone) {\n            group.add(d);\n            isAdded = true;\n          }\n        });\n      };\n      recursiveAction(state);\n      return group;\n    }\n\n    function scheduleInnerRecursive(action, self) {\n      action(function(dt) { self(action, dt); });\n    }\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursive = function (action) {\n      return this.scheduleRecursiveWithState(action, function (_action, self) {\n        _action(function () { self(_action); }); });\n    };\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithState = function (state, action) {\n      return this.scheduleWithState({ first: state, second: action }, invokeRecImmediate);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative due time.\n     * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified relative time.\n     * @param {Number}dueTime Relative time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithRelative = function (dueTime, action) {\n      return this.scheduleRecursiveWithRelativeAndState(action, dueTime, scheduleInnerRecursive);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number}dueTime Relative time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithRelativeAndState = function (state, dueTime, action) {\n      return this._scheduleRelative({ first: state, second: action }, dueTime, function (s, p) {\n        return invokeRecDate(s, p, 'scheduleWithRelativeAndState');\n      });\n    };\n\n    /**\n     * Schedules an action to be executed recursively at a specified absolute due time.\n     * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified absolute time.\n     * @param {Number}dueTime Absolute time at which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithAbsolute = function (dueTime, action) {\n      return this.scheduleRecursiveWithAbsoluteAndState(action, dueTime, scheduleInnerRecursive);\n    };\n\n    /**\n     * Schedules an action to be executed recursively at a specified absolute due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number}dueTime Absolute time at which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithAbsoluteAndState = function (state, dueTime, action) {\n      return this._scheduleAbsolute({ first: state, second: action }, dueTime, function (s, p) {\n        return invokeRecDate(s, p, 'scheduleWithAbsoluteAndState');\n      });\n    };\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    Scheduler.prototype.schedulePeriodic = function (period, action) {\n      return this.schedulePeriodicWithState(null, period, action);\n    };\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    Scheduler.prototype.schedulePeriodicWithState = function(state, period, action) {\n      if (typeof root.setInterval === 'undefined') { throw new Error('Periodic scheduling not supported.'); }\n      var s = state;\n\n      var id = root.setInterval(function () {\n        s = action(s);\n      }, period);\n\n      return disposableCreate(function () {\n        root.clearInterval(id);\n      });\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n    /**\n     * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n     * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n     * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n     */\n    schedulerProto.catchError = schedulerProto['catch'] = function (handler) {\n      return new CatchScheduler(this, handler);\n    };\n  }(Scheduler.prototype));\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function tick(command, recurse) {\n      recurse(0, this._period);\n      try {\n        this._state = this._action(this._state);\n      } catch (e) {\n        this._cancel.dispose();\n        throw e;\n      }\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0, this._period, tick.bind(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  /** Gets a scheduler that schedules work immediately on the current thread. */\n  var immediateScheduler = Scheduler.immediate = (function () {\n\n    function scheduleNow(state, action) { return action(this, state); }\n\n    function scheduleRelative(state, dueTime, action) {\n      var dt = this.now() + normalizeTime(dueTime);\n      while (dt - this.now() > 0) { }\n      return action(this, state);\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);\n    }\n\n    return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n  }());\n\n  /**\n   * Gets a scheduler that schedules work as soon as possible on the current thread.\n   */\n  var currentThreadScheduler = Scheduler.currentThread = (function () {\n    var queue;\n\n    function runTrampoline (q) {\n      while (q.length > 0) {\n        var item = q.dequeue();\n        if (!item.isCancelled()) {\n          // Note, do not schedule blocking work!\n          while (item.dueTime - Scheduler.now() > 0) {\n          }\n          !item.isCancelled() && item.invoke();\n        }\n      }\n    }\n\n    function scheduleNow(state, action) {\n      return this.scheduleWithRelativeAndState(state, 0, action);\n    }\n\n    function scheduleRelative(state, dueTime, action) {\n      var dt = this.now() + Scheduler.normalize(dueTime),\n          si = new ScheduledItem(this, state, action, dt);\n\n      if (!queue) {\n        queue = new PriorityQueue(4);\n        queue.enqueue(si);\n        try {\n          runTrampoline(queue);\n        } catch (e) {\n          throw e;\n        } finally {\n          queue = null;\n        }\n      } else {\n        queue.enqueue(si);\n      }\n      return si.disposable;\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);\n    }\n\n    var currentScheduler = new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n\n    currentScheduler.scheduleRequired = function () { return !queue; };\n    currentScheduler.ensureTrampoline = function (action) {\n      if (!queue) { this.schedule(action); } else { action(); }\n    };\n\n    return currentScheduler;\n  }());\n\n  var scheduleMethod, clearMethod = noop;\n  var localTimer = (function () {\n    var localSetTimeout, localClearTimeout = noop;\n    if ('WScript' in this) {\n      localSetTimeout = function (fn, time) {\n        WScript.Sleep(time);\n        fn();\n      };\n    } else if (!!root.setTimeout) {\n      localSetTimeout = root.setTimeout;\n      localClearTimeout = root.clearTimeout;\n    } else {\n      throw new Error('No concurrency detected!');\n    }\n\n    return {\n      setTimeout: localSetTimeout,\n      clearTimeout: localClearTimeout\n    };\n  }());\n  var localSetTimeout = localTimer.setTimeout,\n    localClearTimeout = localTimer.clearTimeout;\n\n  (function () {\n\n    var reNative = RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&\n      !reNative.test(setImmediate) && setImmediate,\n      clearImmediate = typeof (clearImmediate = freeGlobal && moduleExports && freeGlobal.clearImmediate) == 'function' &&\n      !reNative.test(clearImmediate) && clearImmediate;\n\n    function postMessageSupported () {\n      // Ensure not in a worker\n      if (!root.postMessage || root.importScripts) { return false; }\n      var isAsync = false,\n          oldHandler = root.onmessage;\n      // Test for async\n      root.onmessage = function () { isAsync = true; };\n      root.postMessage('', '*');\n      root.onmessage = oldHandler;\n\n      return isAsync;\n    }\n\n    // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n    if (typeof setImmediate === 'function') {\n      scheduleMethod = setImmediate;\n      clearMethod = clearImmediate;\n    } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleMethod = process.nextTick;\n    } else if (postMessageSupported()) {\n      var MSG_PREFIX = 'ms.rx.schedule' + Math.random(),\n        tasks = {},\n        taskId = 0;\n\n      var onGlobalPostMessage = function (event) {\n        // Only if we're a match to avoid any other global events\n        if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n          var handleId = event.data.substring(MSG_PREFIX.length),\n            action = tasks[handleId];\n          action();\n          delete tasks[handleId];\n        }\n      }\n\n      if (root.addEventListener) {\n        root.addEventListener('message', onGlobalPostMessage, false);\n      } else {\n        root.attachEvent('onmessage', onGlobalPostMessage, false);\n      }\n\n      scheduleMethod = function (action) {\n        var currentId = taskId++;\n        tasks[currentId] = action;\n        root.postMessage(MSG_PREFIX + currentId, '*');\n      };\n    } else if (!!root.MessageChannel) {\n      var channel = new root.MessageChannel(),\n        channelTasks = {},\n        channelTaskId = 0;\n\n      channel.port1.onmessage = function (event) {\n        var id = event.data,\n          action = channelTasks[id];\n        action();\n        delete channelTasks[id];\n      };\n\n      scheduleMethod = function (action) {\n        var id = channelTaskId++;\n        channelTasks[id] = action;\n        channel.port2.postMessage(id);\n      };\n    } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {\n\n      scheduleMethod = function (action) {\n        var scriptElement = root.document.createElement('script');\n        scriptElement.onreadystatechange = function () {\n          action();\n          scriptElement.onreadystatechange = null;\n          scriptElement.parentNode.removeChild(scriptElement);\n          scriptElement = null;\n        };\n        root.document.documentElement.appendChild(scriptElement);\n      };\n\n    } else {\n      scheduleMethod = function (action) { return localSetTimeout(action, 0); };\n      clearMethod = localClearTimeout;\n    }\n  }());\n\n  /**\n   * Gets a scheduler that schedules work via a timed callback based upon platform.\n   */\n  var timeoutScheduler = Scheduler.timeout = (function () {\n\n    function scheduleNow(state, action) {\n      var scheduler = this,\n        disposable = new SingleAssignmentDisposable();\n      var id = scheduleMethod(function () {\n        if (!disposable.isDisposed) {\n          disposable.setDisposable(action(scheduler, state));\n        }\n      });\n      return new CompositeDisposable(disposable, disposableCreate(function () {\n        clearMethod(id);\n      }));\n    }\n\n    function scheduleRelative(state, dueTime, action) {\n      var scheduler = this,\n        dt = Scheduler.normalize(dueTime);\n      if (dt === 0) {\n        return scheduler.scheduleWithState(state, action);\n      }\n      var disposable = new SingleAssignmentDisposable();\n      var id = localSetTimeout(function () {\n        if (!disposable.isDisposed) {\n          disposable.setDisposable(action(scheduler, state));\n        }\n      }, dt);\n      return new CompositeDisposable(disposable, disposableCreate(function () {\n        localClearTimeout(id);\n      }));\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);\n    }\n\n    return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n  })();\n\n  var CatchScheduler = (function (__super__) {\n\n    function scheduleNow(state, action) {\n      return this._scheduler.scheduleWithState(state, this._wrap(action));\n    }\n\n    function scheduleRelative(state, dueTime, action) {\n      return this._scheduler.scheduleWithRelativeAndState(state, dueTime, this._wrap(action));\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this._scheduler.scheduleWithAbsoluteAndState(state, dueTime, this._wrap(action));\n    }\n\n    inherits(CatchScheduler, __super__);\n\n    function CatchScheduler(scheduler, handler) {\n      this._scheduler = scheduler;\n      this._handler = handler;\n      this._recursiveOriginal = null;\n      this._recursiveWrapper = null;\n      __super__.call(this, this._scheduler.now.bind(this._scheduler), scheduleNow, scheduleRelative, scheduleAbsolute);\n    }\n\n    CatchScheduler.prototype._clone = function (scheduler) {\n        return new CatchScheduler(scheduler, this._handler);\n    };\n\n    CatchScheduler.prototype._wrap = function (action) {\n      var parent = this;\n      return function (self, state) {\n        try {\n          return action(parent._getRecursiveWrapper(self), state);\n        } catch (e) {\n          if (!parent._handler(e)) { throw e; }\n          return disposableEmpty;\n        }\n      };\n    };\n\n    CatchScheduler.prototype._getRecursiveWrapper = function (scheduler) {\n      if (this._recursiveOriginal !== scheduler) {\n        this._recursiveOriginal = scheduler;\n        var wrapper = this._clone(scheduler);\n        wrapper._recursiveOriginal = scheduler;\n        wrapper._recursiveWrapper = wrapper;\n        this._recursiveWrapper = wrapper;\n      }\n      return this._recursiveWrapper;\n    };\n\n    CatchScheduler.prototype.schedulePeriodicWithState = function (state, period, action) {\n      var self = this, failed = false, d = new SingleAssignmentDisposable();\n\n      d.setDisposable(this._scheduler.schedulePeriodicWithState(state, period, function (state1) {\n        if (failed) { return null; }\n        try {\n          return action(state1);\n        } catch (e) {\n          failed = true;\n          if (!self._handler(e)) { throw e; }\n          d.dispose();\n          return null;\n        }\n      }));\n\n      return d;\n    };\n\n    return CatchScheduler;\n  }(Scheduler));\n\n  /**\n   *  Represents a notification to an observer.\n   */\n  var Notification = Rx.Notification = (function () {\n    function Notification(kind, hasValue) {\n      this.hasValue = hasValue == null ? false : hasValue;\n      this.kind = kind;\n    }\n\n    /**\n     * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n     *\n     * @memberOf Notification\n     * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n     * @param {Function} onError Delegate to invoke for an OnError notification.\n     * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n     * @returns {Any} Result produced by the observation.\n     */\n    Notification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n      return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n        this._acceptObservable(observerOrOnNext) :\n        this._accept(observerOrOnNext, onError, onCompleted);\n    };\n\n    /**\n     * Returns an observable sequence with a single notification.\n     *\n     * @memberOf Notifications\n     * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n     * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n     */\n    Notification.prototype.toObservable = function (scheduler) {\n      var notification = this;\n      isScheduler(scheduler) || (scheduler = immediateScheduler);\n      return new AnonymousObservable(function (observer) {\n        return scheduler.schedule(function () {\n          notification._acceptObservable(observer);\n          notification.kind === 'N' && observer.onCompleted();\n        });\n      });\n    };\n\n    return Notification;\n  })();\n\n  /**\n   * Creates an object that represents an OnNext notification to an observer.\n   * @param {Any} value The value contained in the notification.\n   * @returns {Notification} The OnNext notification containing the value.\n   */\n  var notificationCreateOnNext = Notification.createOnNext = (function () {\n\n      function _accept (onNext) { return onNext(this.value); }\n      function _acceptObservable(observer) { return observer.onNext(this.value); }\n      function toString () { return 'OnNext(' + this.value + ')'; }\n\n      return function (value) {\n        var notification = new Notification('N', true);\n        notification.value = value;\n        notification._accept = _accept;\n        notification._acceptObservable = _acceptObservable;\n        notification.toString = toString;\n        return notification;\n      };\n  }());\n\n  /**\n   * Creates an object that represents an OnError notification to an observer.\n   * @param {Any} error The exception contained in the notification.\n   * @returns {Notification} The OnError notification containing the exception.\n   */\n  var notificationCreateOnError = Notification.createOnError = (function () {\n\n    function _accept (onNext, onError) { return onError(this.exception); }\n    function _acceptObservable(observer) { return observer.onError(this.exception); }\n    function toString () { return 'OnError(' + this.exception + ')'; }\n\n    return function (e) {\n      var notification = new Notification('E');\n      notification.exception = e;\n      notification._accept = _accept;\n      notification._acceptObservable = _acceptObservable;\n      notification.toString = toString;\n      return notification;\n    };\n  }());\n\n  /**\n   * Creates an object that represents an OnCompleted notification to an observer.\n   * @returns {Notification} The OnCompleted notification.\n   */\n  var notificationCreateOnCompleted = Notification.createOnCompleted = (function () {\n\n    function _accept (onNext, onError, onCompleted) { return onCompleted(); }\n    function _acceptObservable(observer) { return observer.onCompleted(); }\n    function toString () { return 'OnCompleted()'; }\n\n    return function () {\n      var notification = new Notification('C');\n      notification._accept = _accept;\n      notification._acceptObservable = _acceptObservable;\n      notification.toString = toString;\n      return notification;\n    };\n  }());\n\n  var Enumerator = Rx.internals.Enumerator = function (next) {\n    this._next = next;\n  };\n\n  Enumerator.prototype.next = function () {\n    return this._next();\n  };\n\n  Enumerator.prototype[$iterator$] = function () { return this; }\n\n  var Enumerable = Rx.internals.Enumerable = function (iterator) {\n    this._iterator = iterator;\n  };\n\n  Enumerable.prototype[$iterator$] = function () {\n    return this._iterator();\n  };\n\n  Enumerable.prototype.concat = function () {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var e = sources[$iterator$]();\n\n      var isDisposed, subscription = new SerialDisposable();\n      var cancelable = immediateScheduler.scheduleRecursive(function (self) {\n        if (isDisposed) { return; }\n        try {\n          var currentItem = e.next();\n        } catch (ex) {\n          return o.onError(ex);\n        }\n\n        if (currentItem.done) {\n          return o.onCompleted();\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var d = new SingleAssignmentDisposable();\n        subscription.setDisposable(d);\n        d.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function(err) { o.onError(err); },\n          self)\n        );\n      });\n\n      return new CompositeDisposable(subscription, cancelable, disposableCreate(function () {\n        isDisposed = true;\n      }));\n    });\n  };\n\n  Enumerable.prototype.catchError = function () {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var e = sources[$iterator$]();\n\n      var isDisposed, subscription = new SerialDisposable();\n      var cancelable = immediateScheduler.scheduleRecursiveWithState(null, function (lastException, self) {\n        if (isDisposed) { return; }\n\n        try {\n          var currentItem = e.next();\n        } catch (ex) {\n          return observer.onError(ex);\n        }\n\n        if (currentItem.done) {\n          if (lastException !== null) {\n            o.onError(lastException);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var d = new SingleAssignmentDisposable();\n        subscription.setDisposable(d);\n        d.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          self,\n          function() { o.onCompleted(); }));\n      });\n      return new CompositeDisposable(subscription, cancelable, disposableCreate(function () {\n        isDisposed = true;\n      }));\n    });\n  };\n\n\n  Enumerable.prototype.catchErrorWhen = function (notificationHandler) {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var exceptions = new Subject(),\n        notifier = new Subject(),\n        handled = notificationHandler(exceptions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = sources[$iterator$]();\n\n      var isDisposed,\n        lastException,\n        subscription = new SerialDisposable();\n      var cancelable = immediateScheduler.scheduleRecursive(function (self) {\n        if (isDisposed) { return; }\n\n        try {\n          var currentItem = e.next();\n        } catch (ex) {\n          return o.onError(ex);\n        }\n\n        if (currentItem.done) {\n          if (lastException) {\n            o.onError(lastException);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new CompositeDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) {\n            inner.setDisposable(notifier.subscribe(self, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            exceptions.onNext(exn);\n          },\n          function() { o.onCompleted(); }));\n      });\n\n      return new CompositeDisposable(notificationDisposable, subscription, cancelable, disposableCreate(function () {\n        isDisposed = true;\n      }));\n    });\n  };\n\n  var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) {\n    if (repeatCount == null) { repeatCount = -1; }\n    return new Enumerable(function () {\n      var left = repeatCount;\n      return new Enumerator(function () {\n        if (left === 0) { return doneEnumerator; }\n        if (left > 0) { left--; }\n        return { done: false, value: value };\n      });\n    });\n  };\n\n  var enumerableOf = Enumerable.of = function (source, selector, thisArg) {\n    if (selector) {\n      var selectorFn = bindCallback(selector, thisArg, 3);\n    }\n    return new Enumerable(function () {\n      var index = -1;\n      return new Enumerator(\n        function () {\n          return ++index < source.length ?\n            { done: false, value: !selector ? source[index] : selectorFn(source[index], index, source) } :\n            doneEnumerator;\n        });\n    });\n  };\n\n  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates a notification callback from an observer.\n   * @returns The action that forwards its input notification to the underlying observer.\n   */\n  Observer.prototype.toNotifier = function () {\n    var observer = this;\n    return function (n) { return n.accept(observer); };\n  };\n\n  /**\n   *  Hides the identity of an observer.\n   * @returns An observer that hides the identity of the specified observer.\n   */\n  Observer.prototype.asObserver = function () {\n    return new AnonymousObserver(this.onNext.bind(this), this.onError.bind(this), this.onCompleted.bind(this));\n  };\n\n  /**\n   *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n   *  If a violation is detected, an Error is thrown from the offending observer method call.\n   * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n   */\n  Observer.prototype.checked = function () { return new CheckedObserver(this); };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n\n  /**\n   *  Creates an observer from a notification callback.\n   *\n   * @static\n   * @memberOf Observer\n   * @param {Function} handler Action that handles a notification.\n   * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n   */\n  Observer.fromNotifier = function (handler, thisArg) {\n    return new AnonymousObserver(function (x) {\n      return handler.call(thisArg, notificationCreateOnNext(x));\n    }, function (e) {\n      return handler.call(thisArg, notificationCreateOnError(e));\n    }, function () {\n      return handler.call(thisArg, notificationCreateOnCompleted());\n    });\n  };\n\n  /**\n   * Schedules the invocation of observer methods on the given scheduler.\n   * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n   * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n   */\n  Observer.prototype.notifyOn = function (scheduler) {\n    return new ObserveOnObserver(scheduler, this);\n  };\n\n  Observer.prototype.makeSafe = function(disposable) {\n    return new AnonymousSafeObserver(this._onNext, this._onError, this._onCompleted, disposable);\n  };\n\n  /**\n   * Abstract base class for implementations of the Observer class.\n   * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n   */\n  var AbstractObserver = Rx.internals.AbstractObserver = (function (__super__) {\n    inherits(AbstractObserver, __super__);\n\n    /**\n     * Creates a new observer in a non-stopped state.\n     */\n    function AbstractObserver() {\n      this.isStopped = false;\n      __super__.call(this);\n    }\n\n    /**\n     * Notifies the observer of a new element in the sequence.\n     * @param {Any} value Next element in the sequence.\n     */\n    AbstractObserver.prototype.onNext = function (value) {\n      if (!this.isStopped) { this.next(value); }\n    };\n\n    /**\n     * Notifies the observer that an exception has occurred.\n     * @param {Any} error The error that has occurred.\n     */\n    AbstractObserver.prototype.onError = function (error) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(error);\n      }\n    };\n\n    /**\n     * Notifies the observer of the end of the sequence.\n     */\n    AbstractObserver.prototype.onCompleted = function () {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.completed();\n      }\n    };\n\n    /**\n     * Disposes the observer, causing it to transition to the stopped state.\n     */\n    AbstractObserver.prototype.dispose = function () {\n      this.isStopped = true;\n    };\n\n    AbstractObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return AbstractObserver;\n  }(Observer));\n\n  /**\n   * Class to create an Observer instance from delegate-based implementations of the on* methods.\n   */\n  var AnonymousObserver = Rx.AnonymousObserver = (function (__super__) {\n    inherits(AnonymousObserver, __super__);\n\n    /**\n     * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n     * @param {Any} onNext Observer's OnNext action implementation.\n     * @param {Any} onError Observer's OnError action implementation.\n     * @param {Any} onCompleted Observer's OnCompleted action implementation.\n     */\n    function AnonymousObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    /**\n     * Calls the onNext action.\n     * @param {Any} value Next element in the sequence.\n     */\n    AnonymousObserver.prototype.next = function (value) {\n      this._onNext(value);\n    };\n\n    /**\n     * Calls the onError action.\n     * @param {Any} error The error that has occurred.\n     */\n    AnonymousObserver.prototype.error = function (error) {\n      this._onError(error);\n    };\n\n    /**\n     *  Calls the onCompleted action.\n     */\n    AnonymousObserver.prototype.completed = function () {\n      this._onCompleted();\n    };\n\n    return AnonymousObserver;\n  }(AbstractObserver));\n\n    var CheckedObserver = (function (_super) {\n        inherits(CheckedObserver, _super);\n\n        function CheckedObserver(observer) {\n            _super.call(this);\n            this._observer = observer;\n            this._state = 0; // 0 - idle, 1 - busy, 2 - done\n        }\n\n        var CheckedObserverPrototype = CheckedObserver.prototype;\n\n        CheckedObserverPrototype.onNext = function (value) {\n            this.checkAccess();\n            try {\n                this._observer.onNext(value);\n            } catch (e) {\n                throw e;\n            } finally {\n                this._state = 0;\n            }\n        };\n\n        CheckedObserverPrototype.onError = function (err) {\n            this.checkAccess();\n            try {\n                this._observer.onError(err);\n            } catch (e) {\n                throw e;\n            } finally {\n                this._state = 2;\n            }\n        };\n\n        CheckedObserverPrototype.onCompleted = function () {\n            this.checkAccess();\n            try {\n                this._observer.onCompleted();\n            } catch (e) {\n                throw e;\n            } finally {\n                this._state = 2;\n            }\n        };\n\n        CheckedObserverPrototype.checkAccess = function () {\n            if (this._state === 1) { throw new Error('Re-entrancy detected'); }\n            if (this._state === 2) { throw new Error('Observer completed'); }\n            if (this._state === 0) { this._state = 1; }\n        };\n\n        return CheckedObserver;\n    }(Observer));\n\n  var ScheduledObserver = Rx.internals.ScheduledObserver = (function (__super__) {\n    inherits(ScheduledObserver, __super__);\n\n    function ScheduledObserver(scheduler, observer) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.observer = observer;\n      this.isAcquired = false;\n      this.hasFaulted = false;\n      this.queue = [];\n      this.disposable = new SerialDisposable();\n    }\n\n    ScheduledObserver.prototype.next = function (value) {\n      var self = this;\n      this.queue.push(function () { self.observer.onNext(value); });\n    };\n\n    ScheduledObserver.prototype.error = function (e) {\n      var self = this;\n      this.queue.push(function () { self.observer.onError(e); });\n    };\n\n    ScheduledObserver.prototype.completed = function () {\n      var self = this;\n      this.queue.push(function () { self.observer.onCompleted(); });\n    };\n\n    ScheduledObserver.prototype.ensureActive = function () {\n      var isOwner = false, parent = this;\n      if (!this.hasFaulted && this.queue.length > 0) {\n        isOwner = !this.isAcquired;\n        this.isAcquired = true;\n      }\n      if (isOwner) {\n        this.disposable.setDisposable(this.scheduler.scheduleRecursive(function (self) {\n          var work;\n          if (parent.queue.length > 0) {\n            work = parent.queue.shift();\n          } else {\n            parent.isAcquired = false;\n            return;\n          }\n          try {\n            work();\n          } catch (ex) {\n            parent.queue = [];\n            parent.hasFaulted = true;\n            throw ex;\n          }\n          self();\n        }));\n      }\n    };\n\n    ScheduledObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.disposable.dispose();\n    };\n\n    return ScheduledObserver;\n  }(AbstractObserver));\n\n  var ObserveOnObserver = (function (__super__) {\n    inherits(ObserveOnObserver, __super__);\n\n    function ObserveOnObserver(scheduler, observer, cancel) {\n      __super__.call(this, scheduler, observer);\n      this._cancel = cancel;\n    }\n\n    ObserveOnObserver.prototype.next = function (value) {\n      __super__.prototype.next.call(this, value);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.error = function (e) {\n      __super__.prototype.error.call(this, e);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.completed = function () {\n      __super__.prototype.completed.call(this);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this._cancel && this._cancel.dispose();\n      this._cancel = null;\n    };\n\n    return ObserveOnObserver;\n  })(ScheduledObserver);\n\n  var observableProto;\n\n  /**\n   * Represents a push-style collection.\n   */\n  var Observable = Rx.Observable = (function () {\n\n    function Observable(subscribe) {\n      if (Rx.config.longStackSupport && hasStacks) {\n        try {\n          throw new Error();\n        } catch (e) {\n          this.stack = e.stack.substring(e.stack.indexOf(\"\\n\") + 1);\n        }\n\n        var self = this;\n        this._subscribe = function (observer) {\n          var oldOnError = observer.onError.bind(observer);\n\n          observer.onError = function (err) {\n            makeStackTraceLong(err, self);\n            oldOnError(err);\n          };\n\n          return subscribe.call(self, observer);\n        };\n      } else {\n        this._subscribe = subscribe;\n      }\n    }\n\n    observableProto = Observable.prototype;\n\n    /**\n     *  Subscribes an observer to the observable sequence.\n     *  @param {Mixed} [observerOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n     *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n     *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n     *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribe = observableProto.forEach = function (observerOrOnNext, onError, onCompleted) {\n      return this._subscribe(typeof observerOrOnNext === 'object' ?\n        observerOrOnNext :\n        observerCreate(observerOrOnNext, onError, onCompleted));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onNext The function to invoke on each element in the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnNext = function (onNext, thisArg) {\n      return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n    };\n\n    /**\n     * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n     * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnError = function (onError, thisArg) {\n      return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnCompleted = function (onCompleted, thisArg) {\n      return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n    };\n\n    return Observable;\n  })();\n\n  var ObservableBase = Rx.ObservableBase = (function (__super__) {\n\n  inherits(ObservableBase, __super__);\n\n  // Fix subscriber to check for undefined or function returned to decorate as Disposable\n  function fixSubscriber(subscriber) {\n    if (subscriber && typeof subscriber.dispose === 'function') { return subscriber; }\n\n      return typeof subscriber === 'function' ?\n        disposableCreate(subscriber) :\n        disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      try {\n        ado.setDisposable(fixSubscriber(self.subscribeCore(ado)));\n      } catch (e) {\n        if (!ado.fail(e)) { throw e; }\n      }\n    }\n\n    function subscribe(observer) {\n      var ado = new AutoDetachObserver(observer), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.scheduleWithState(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n\n      return ado;\n    }\n\n    function ObservableBase() {\n      __super__.call(this, subscribe);\n    }\n\n    ObservableBase.prototype.subscribeCore = function(observer) {\n      throw new Error('Not implemeneted');\n    }\n\n    return ObservableBase;\n\n  }(Observable));\n\n   /**\n   *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n   *\n   *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n   *  that require to be run on a scheduler, use subscribeOn.\n   *\n   *  @param {Scheduler} scheduler Scheduler to notify observers on.\n   *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n   */\n  observableProto.observeOn = function (scheduler) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      return source.subscribe(new ObserveOnObserver(scheduler, observer));\n    }, source);\n  };\n\n   /**\n   *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n   *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n   *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n   *  callbacks on a scheduler, use observeOn.\n\n   *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n   *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n   */\n  observableProto.subscribeOn = function (scheduler) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(), d = new SerialDisposable();\n      d.setDisposable(m);\n      m.setDisposable(scheduler.schedule(function () {\n        d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(observer)));\n      }));\n      return d;\n    }, source);\n  };\n\n  /**\n   * Converts a Promise to an Observable sequence\n   * @param {Promise} An ES6 Compliant promise.\n   * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n   */\n  var observableFromPromise = Observable.fromPromise = function (promise) {\n    return observableDefer(function () {\n      var subject = new Rx.AsyncSubject();\n\n      promise.then(\n        function (value) {\n          subject.onNext(value);\n          subject.onCompleted();\n        },\n        subject.onError.bind(subject));\n\n      return subject;\n    });\n  };\n\n  /*\n   * Converts an existing observable sequence to an ES6 Compatible Promise\n   * @example\n   * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n   *\n   * // With config\n   * Rx.config.Promise = RSVP.Promise;\n   * var promise = Rx.Observable.return(42).toPromise();\n   * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n   * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n   */\n  observableProto.toPromise = function (promiseCtor) {\n    promiseCtor || (promiseCtor = Rx.config.Promise);\n    if (!promiseCtor) { throw new TypeError('Promise type not provided nor in Rx.config.Promise'); }\n    var source = this;\n    return new promiseCtor(function (resolve, reject) {\n      // No cancellation can be done\n      var value, hasValue = false;\n      source.subscribe(function (v) {\n        value = v;\n        hasValue = true;\n      }, reject, function () {\n        hasValue && resolve(value);\n      });\n    });\n  };\n\n  /**\n   * Creates an array from an observable sequence.\n   * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n   */\n  observableProto.toArray = function () {\n    var source = this;\n    return new AnonymousObservable(function(observer) {\n      var arr = [];\n      return source.subscribe(\n        function (x) { arr.push(x); },\n        function (e) { observer.onError(e); },\n        function () {\n          observer.onNext(arr);\n          observer.onCompleted();\n        });\n    }, source);\n  };\n\n  /**\n   *  Creates an observable sequence from a specified subscribe method implementation.\n   * @example\n   *  var res = Rx.Observable.create(function (observer) { return function () { } );\n   *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n   *  var res = Rx.Observable.create(function (observer) { } );\n   * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n   * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n   */\n  Observable.create = Observable.createWithDisposable = function (subscribe, parent) {\n    return new AnonymousObservable(subscribe, parent);\n  };\n\n  /**\n   *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n   *\n   * @example\n   *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n   * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n   * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n   */\n  var observableDefer = Observable.defer = function (observableFactory) {\n    return new AnonymousObservable(function (observer) {\n      var result;\n      try {\n        result = observableFactory();\n      } catch (e) {\n        return observableThrow(e).subscribe(observer);\n      }\n      isPromise(result) && (result = observableFromPromise(result));\n      return result.subscribe(observer);\n    });\n  };\n\n  /**\n   *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n   *\n   * @example\n   *  var res = Rx.Observable.empty();\n   *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n   * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n   * @returns {Observable} An observable sequence with no elements.\n   */\n  var observableEmpty = Observable.empty = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.schedule(function () {\n        observer.onCompleted();\n      });\n    });\n  };\n\n  var maxSafeInteger = Math.pow(2, 53) - 1;\n\n  function StringIterable(str) {\n    this._s = s;\n  }\n\n  StringIterable.prototype[$iterator$] = function () {\n    return new StringIterator(this._s);\n  };\n\n  function StringIterator(str) {\n    this._s = s;\n    this._l = s.length;\n    this._i = 0;\n  }\n\n  StringIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  StringIterator.prototype.next = function () {\n    if (this._i < this._l) {\n      var val = this._s.charAt(this._i++);\n      return { done: false, value: val };\n    } else {\n      return doneEnumerator;\n    }\n  };\n\n  function ArrayIterable(a) {\n    this._a = a;\n  }\n\n  ArrayIterable.prototype[$iterator$] = function () {\n    return new ArrayIterator(this._a);\n  };\n\n  function ArrayIterator(a) {\n    this._a = a;\n    this._l = toLength(a);\n    this._i = 0;\n  }\n\n  ArrayIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  ArrayIterator.prototype.next = function () {\n    if (this._i < this._l) {\n      var val = this._a[this._i++];\n      return { done: false, value: val };\n    } else {\n      return doneEnumerator;\n    }\n  };\n\n  function numberIsFinite(value) {\n    return typeof value === 'number' && root.isFinite(value);\n  }\n\n  function isNan(n) {\n    return n !== n;\n  }\n\n  function getIterable(o) {\n    var i = o[$iterator$], it;\n    if (!i && typeof o === 'string') {\n      it = new StringIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i && o.length !== undefined) {\n      it = new ArrayIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i) { throw new TypeError('Object is not iterable'); }\n    return o[$iterator$]();\n  }\n\n  function sign(value) {\n    var number = +value;\n    if (number === 0) { return number; }\n    if (isNaN(number)) { return number; }\n    return number < 0 ? -1 : 1;\n  }\n\n  function toLength(o) {\n    var len = +o.length;\n    if (isNaN(len)) { return 0; }\n    if (len === 0 || !numberIsFinite(len)) { return len; }\n    len = sign(len) * Math.floor(Math.abs(len));\n    if (len <= 0) { return 0; }\n    if (len > maxSafeInteger) { return maxSafeInteger; }\n    return len;\n  }\n\n  /**\n   * This method creates a new Observable sequence from an array-like or iterable object.\n   * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n   * @param {Function} [mapFn] Map function to call on every element of the array.\n   * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n   * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n   */\n  var observableFrom = Observable.from = function (iterable, mapFn, thisArg, scheduler) {\n    if (iterable == null) {\n      throw new Error('iterable cannot be null.')\n    }\n    if (mapFn && !isFunction(mapFn)) {\n      throw new Error('mapFn when provided must be a function');\n    }\n    if (mapFn) {\n      var mapper = bindCallback(mapFn, thisArg, 2);\n    }\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    var list = Object(iterable), it = getIterable(list);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleRecursiveWithState(0, function (i, self) {\n        try {\n          var next = it.next();\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n        if (next.done) {\n          observer.onCompleted();\n          return;\n        }\n\n        var result = next.value;\n\n        if (mapper) {\n          try {\n            result = mapper(result, i);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n        }\n\n        observer.onNext(result);\n        self(i + 1);\n      });\n    });\n  };\n\n  var FromArrayObservable = (function(__super__) {\n    inherits(FromArrayObservable, __super__);\n    function FromArrayObservable(args, scheduler) {\n      this.args = args;\n      this.scheduler = scheduler || currentThreadScheduler;\n      __super__.call(this);\n    }\n\n    FromArrayObservable.prototype.subscribeCore = function (observer) {\n      var sink = new FromArraySink(observer, this);\n      return sink.run();\n    };\n\n    return FromArrayObservable;\n  }(ObservableBase));\n\n  var FromArraySink = (function () {\n    function FromArraySink(observer, parent) {\n      this.observer = observer;\n      this.parent = parent;\n    }\n\n    function loopRecursive(state, recurse) {\n      if (state.i < state.len) {\n        state.observer.onNext(state.args[state.i++]);\n        recurse(state);\n      } else {\n        state.observer.onCompleted();\n      }\n    }\n\n    FromArraySink.prototype.run = function () {\n      return this.parent.scheduler.scheduleRecursiveWithState(\n        {i: 0, args: this.parent.args, len: this.parent.args.length, observer: this.observer },\n        loopRecursive);\n    };\n\n    return FromArraySink;\n  }());\n\n  /**\n  *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n  * @deprecated use Observable.from or Observable.of\n  * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n  */\n  var observableFromArray = Observable.fromArray = function (array, scheduler) {\n    return new FromArrayObservable(array, scheduler)\n  };\n\n  /**\n   *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new AnonymousObservable(function (observer) {\n      var first = true, state = initialState;\n      return scheduler.scheduleRecursive(function (self) {\n        var hasResult, result;\n        try {\n          if (first) {\n            first = false;\n          } else {\n            state = iterate(state);\n          }\n          hasResult = condition(state);\n          if (hasResult) {\n            result = resultSelector(state);\n          }\n        } catch (exception) {\n          observer.onError(exception);\n          return;\n        }\n        if (hasResult) {\n          observer.onNext(result);\n          self();\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  function observableOf (scheduler, array) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new AnonymousObservable(function (observer) {\n      var count = 0, len = array.length;\n      return scheduler.scheduleRecursive(function (self) {\n        if (count < len) {\n          observer.onNext(array[count++]);\n          self();\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  }\n\n  /**\n   *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n   * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n   */\n  Observable.of = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableOf(null, args);\n  };\n\n  /**\n   *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n   * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n   * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n   */\n  Observable.ofWithScheduler = function (scheduler) {\n    for(var args = [], i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableOf(scheduler, args);\n  };\n\n  /**\n   * Creates an Observable sequence from changes to an array using Array.observe.\n   * @param {Array} array An array to observe changes.\n   * @returns {Observable} An observable sequence containing changes to an array from Array.observe.\n   */\n  Observable.ofArrayChanges = function(array) {\n    if (!Array.isArray(array)) { throw new TypeError('Array.observe only accepts arrays.'); }\n    if (typeof Array.observe !== 'function' && typeof Array.unobserve !== 'function') { throw new TypeError('Array.observe is not supported on your platform') }\n    return new AnonymousObservable(function(observer) {\n      function observerFn(changes) {\n        for(var i = 0, len = changes.length; i < len; i++) {\n          observer.onNext(changes[i]);\n        }\n      }\n      \n      Array.observe(array, observerFn);\n\n      return function () {\n        Array.unobserve(array, observerFn);\n      };\n    });\n  };\n\n  /**\n   * Creates an Observable sequence from changes to an object using Object.observe.\n   * @param {Object} obj An object to observe changes.\n   * @returns {Observable} An observable sequence containing changes to an object from Object.observe.\n   */\n  Observable.ofObjectChanges = function(obj) {\n    if (obj == null) { throw new TypeError('object must not be null or undefined.'); }\n    if (typeof Object.observe !== 'function' && typeof Object.unobserve !== 'function') { throw new TypeError('Array.observe is not supported on your platform') }\n    return new AnonymousObservable(function(observer) {\n      function observerFn(changes) {\n        for(var i = 0, len = changes.length; i < len; i++) {\n          observer.onNext(changes[i]);\n        }\n      }\n\n      Object.observe(obj, observerFn);\n\n      return function () {\n        Object.unobserve(obj, observerFn);\n      };\n    });\n  };\n\n  /**\n   *  Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n   * @returns {Observable} An observable sequence whose observers will never get called.\n   */\n  var observableNever = Observable.never = function () {\n    return new AnonymousObservable(function () {\n      return disposableEmpty;\n    });\n  };\n\n  /**\n   * Convert an object into an observable sequence of [key, value] pairs.\n   * @param {Object} obj The object to inspect.\n   * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n   * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n   */\n  Observable.pairs = function (obj, scheduler) {\n    scheduler || (scheduler = Rx.Scheduler.currentThread);\n    return new AnonymousObservable(function (observer) {\n      var keys = Object.keys(obj), len = keys.length;\n      return scheduler.scheduleRecursiveWithState(0, function (idx, self) {\n        if (idx < len) {\n          var key = keys[idx];\n          observer.onNext([key, obj[key]]);\n          self(idx + 1);\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.range(0, 10);\n   *  var res = Rx.Observable.range(0, 10, Rx.Scheduler.timeout);\n   * @param {Number} start The value of the first integer in the sequence.\n   * @param {Number} count The number of sequential integers to generate.\n   * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n   * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n   */\n  Observable.range = function (start, count, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleRecursiveWithState(0, function (i, self) {\n        if (i < count) {\n          observer.onNext(start + i);\n          self(i + 1);\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.repeat(42);\n   *  var res = Rx.Observable.repeat(42, 4);\n   *  3 - res = Rx.Observable.repeat(42, 4, Rx.Scheduler.timeout);\n   *  4 - res = Rx.Observable.repeat(42, null, Rx.Scheduler.timeout);\n   * @param {Mixed} value Element to repeat.\n   * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n   * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n   */\n  Observable.repeat = function (value, repeatCount, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return observableReturn(value, scheduler).repeat(repeatCount == null ? -1 : repeatCount);\n  };\n\n  /**\n   *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n   *  There is an alias called 'just', and 'returnValue' for browsers <IE9.\n   * @param {Mixed} value Single element in the resulting observable sequence.\n   * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence containing the single specified element.\n   */\n  var observableReturn = Observable['return'] = Observable.just = function (value, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.schedule(function () {\n        observer.onNext(value);\n        observer.onCompleted();\n      });\n    });\n  };\n\n  /** @deprecated use return or just */\n  Observable.returnValue = function () {\n    //deprecate('returnValue', 'return or just');\n    return observableReturn.apply(null, arguments);\n  };\n\n  /**\n   *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n   *  There is an alias to this method called 'throwError' for browsers <IE9.\n   * @param {Mixed} error An object used for the sequence's termination.\n   * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n   */\n  var observableThrow = Observable['throw'] = Observable.throwError = function (error, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.schedule(function () {\n        observer.onError(error);\n      });\n    });\n  };\n\n  /** @deprecated use #some instead */\n  Observable.throwException = function () {\n    //deprecate('throwException', 'throwError');\n    return Observable.throwError.apply(null, arguments);\n  };\n\n  /**\n   * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n   * @param {Function} resourceFactory Factory function to obtain a resource object.\n   * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n   * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n   */\n  Observable.using = function (resourceFactory, observableFactory) {\n    return new AnonymousObservable(function (observer) {\n      var disposable = disposableEmpty, resource, source;\n      try {\n        resource = resourceFactory();\n        resource && (disposable = resource);\n        source = observableFactory(resource);\n      } catch (exception) {\n        return new CompositeDisposable(observableThrow(exception).subscribe(observer), disposable);\n      }\n      return new CompositeDisposable(source.subscribe(observer), disposable);\n    });\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @param {Observable} rightSource Second observable sequence or Promise.\n   * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n   */\n  observableProto.amb = function (rightSource) {\n    var leftSource = this;\n    return new AnonymousObservable(function (observer) {\n      var choice,\n        leftChoice = 'L', rightChoice = 'R',\n        leftSubscription = new SingleAssignmentDisposable(),\n        rightSubscription = new SingleAssignmentDisposable();\n\n      isPromise(rightSource) && (rightSource = observableFromPromise(rightSource));\n\n      function choiceL() {\n        if (!choice) {\n          choice = leftChoice;\n          rightSubscription.dispose();\n        }\n      }\n\n      function choiceR() {\n        if (!choice) {\n          choice = rightChoice;\n          leftSubscription.dispose();\n        }\n      }\n\n      leftSubscription.setDisposable(leftSource.subscribe(function (left) {\n        choiceL();\n        if (choice === leftChoice) {\n          observer.onNext(left);\n        }\n      }, function (err) {\n        choiceL();\n        if (choice === leftChoice) {\n          observer.onError(err);\n        }\n      }, function () {\n        choiceL();\n        if (choice === leftChoice) {\n          observer.onCompleted();\n        }\n      }));\n\n      rightSubscription.setDisposable(rightSource.subscribe(function (right) {\n        choiceR();\n        if (choice === rightChoice) {\n          observer.onNext(right);\n        }\n      }, function (err) {\n        choiceR();\n        if (choice === rightChoice) {\n          observer.onError(err);\n        }\n      }, function () {\n        choiceR();\n        if (choice === rightChoice) {\n          observer.onCompleted();\n        }\n      }));\n\n      return new CompositeDisposable(leftSubscription, rightSubscription);\n    });\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   *\n   * @example\n   * var = Rx.Observable.amb(xs, ys, zs);\n   * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n   */\n  Observable.amb = function () {\n    var acc = observableNever(), items = [];\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { items.push(arguments[i]); }\n    }\n\n    function func(previous, current) {\n      return previous.amb(current);\n    }\n    for (var i = 0, len = items.length; i < len; i++) {\n      acc = func(acc, items[i]);\n    }\n    return acc;\n  };\n\n  function observableCatchHandler(source, handler) {\n    return new AnonymousObservable(function (observer) {\n      var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();\n      subscription.setDisposable(d1);\n      d1.setDisposable(source.subscribe(observer.onNext.bind(observer), function (exception) {\n        var d, result;\n        try {\n          result = handler(exception);\n        } catch (ex) {\n          observer.onError(ex);\n          return;\n        }\n        isPromise(result) && (result = observableFromPromise(result));\n\n        d = new SingleAssignmentDisposable();\n        subscription.setDisposable(d);\n        d.setDisposable(result.subscribe(observer));\n      }, observer.onCompleted.bind(observer)));\n\n      return subscription;\n    }, source);\n  }\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @example\n   * 1 - xs.catchException(ys)\n   * 2 - xs.catchException(function (ex) { return ys(ex); })\n   * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n   * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n   */\n  observableProto['catch'] = observableProto.catchError = function (handlerOrSecond) {\n    return typeof handlerOrSecond === 'function' ?\n      observableCatchHandler(this, handlerOrSecond) :\n      observableCatch([this, handlerOrSecond]);\n  };\n\n  /**\n   * @deprecated use #catch or #catchError instead.\n   */\n  observableProto.catchException = function (handlerOrSecond) {\n    //deprecate('catchException', 'catch or catchError');\n    return this.catchError(handlerOrSecond);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n   * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n   */\n  var observableCatch = Observable.catchError = Observable['catch'] = Observable.catchException = function () {\n    var items = [];\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { items.push(arguments[i]); }\n    }\n    return enumerableOf(items).catchError();\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   * This can be in the form of an argument list of observables or an array.\n   *\n   * @example\n   * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.combineLatest = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return combineLatest.apply(this, args);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   *\n   * @example\n   * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  var combineLatest = Observable.combineLatest = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    var resultSelector = args.pop();\n\n    if (Array.isArray(args[0])) {\n      args = args[0];\n    }\n\n    return new AnonymousObservable(function (observer) {\n      var falseFactory = function () { return false; },\n        n = args.length,\n        hasValue = arrayInitialize(n, falseFactory),\n        hasValueAll = false,\n        isDone = arrayInitialize(n, falseFactory),\n        values = new Array(n);\n\n      function next(i) {\n        var res;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          try {\n            res = resultSelector.apply(null, values);\n          } catch (ex) {\n            observer.onError(ex);\n            return;\n          }\n          observer.onNext(res);\n        } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n          observer.onCompleted();\n        }\n      }\n\n      function done (i) {\n        isDone[i] = true;\n        if (isDone.every(identity)) {\n          observer.onCompleted();\n        }\n      }\n\n      var subscriptions = new Array(n);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          var source = args[i], sad = new SingleAssignmentDisposable();\n          isPromise(source) && (source = observableFromPromise(source));\n          sad.setDisposable(source.subscribe(function (x) {\n              values[i] = x;\n              next(i);\n            },\n            function(e) { observer.onError(e); },\n            function () { done(i); }\n          ));\n          subscriptions[i] = sad;\n        }(idx));\n      }\n\n      return new CompositeDisposable(subscriptions);\n    }, this);\n  };\n\n  /**\n   * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  observableProto.concat = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    args.unshift(this);\n    return observableConcat.apply(null, args);\n  };\n\n  /**\n   * Concatenates all the observable sequences.\n   * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  var observableConcat = Observable.concat = function () {\n    var items = [];\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { items.push(arguments[i]); }\n    }\n    return enumerableOf(items).concat();\n  };\n\n  /**\n   * Concatenates an observable sequence of observable sequences.\n   * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n   */\n  observableProto.concatAll = observableProto.concatObservable = function () {\n    return this.merge(1);\n  };\n\n  /**\n   * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n   * Or merges two observable sequences into a single observable sequence.\n   *\n   * @example\n   * 1 - merged = sources.merge(1);\n   * 2 - merged = source.merge(otherSource);\n   * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n   * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n   */\n  observableProto.merge = function (maxConcurrentOrOther) {\n    if (typeof maxConcurrentOrOther !== 'number') { return observableMerge(this, maxConcurrentOrOther); }\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var activeCount = 0, group = new CompositeDisposable(), isStopped = false, q = [];\n\n      function subscribe(xs) {\n        var subscription = new SingleAssignmentDisposable();\n        group.add(subscription);\n\n        // Check for promises support\n        isPromise(xs) && (xs = observableFromPromise(xs));\n\n        subscription.setDisposable(xs.subscribe(function (x) { o.onNext(x); }, function (e) { o.onError(e); }, function () {\n          group.remove(subscription);\n          if (q.length > 0) {\n            subscribe(q.shift());\n          } else {\n            activeCount--;\n            isStopped && activeCount === 0 && o.onCompleted();\n          }\n        }));\n      }\n      group.add(sources.subscribe(function (innerSource) {\n        if (activeCount < maxConcurrentOrOther) {\n          activeCount++;\n          subscribe(innerSource);\n        } else {\n          q.push(innerSource);\n        }\n      }, function (e) { o.onError(e); }, function () {\n        isStopped = true;\n        activeCount === 0 && o.onCompleted();\n      }));\n      return group;\n    }, sources);\n  };\n\n  /**\n   * Merges all the observable sequences into a single observable sequence.\n   * The scheduler is optional and if not specified, the immediate scheduler is used.\n   * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n   */\n  var observableMerge = Observable.merge = function () {\n    var scheduler, sources = [], i, len = arguments.length;\n    if (!arguments[0]) {\n      scheduler = immediateScheduler;\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else if (isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else {\n      scheduler = immediateScheduler;\n      for(i = 0; i < len; i++) { sources.push(arguments[i]); }\n    }\n    if (Array.isArray(sources[0])) {\n      sources = sources[0];\n    }\n    return observableOf(scheduler, sources).mergeAll();\n  };\n\n  /**\n   * Merges an observable sequence of observable sequences into an observable sequence.\n   * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n   */\n  observableProto.mergeAll = function () {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable(),\n        isStopped = false,\n        m = new SingleAssignmentDisposable();\n\n      group.add(m);\n      m.setDisposable(sources.subscribe(function (innerSource) {\n        var innerSubscription = new SingleAssignmentDisposable();\n        group.add(innerSubscription);\n\n        // Check for promises support\n        isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n\n        innerSubscription.setDisposable(innerSource.subscribe(function (x) { o.onNext(x); }, function (e) { o.onError(e); }, function () {\n          group.remove(innerSubscription);\n          isStopped && group.length === 1 && o.onCompleted();\n        }));\n      }, function (e) { o.onError(e); }, function () {\n        isStopped = true;\n        group.length === 1 && o.onCompleted();\n      }));\n      return group;\n    }, sources);\n  };\n\n  /**\n   * @deprecated use #mergeAll instead.\n   */\n  observableProto.mergeObservable = function () {\n    //deprecate('mergeObservable', 'mergeAll');\n    return this.mergeAll.apply(this, arguments);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n   * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n   */\n  observableProto.onErrorResumeNext = function (second) {\n    if (!second) { throw new Error('Second observable is required'); }\n    return onErrorResumeNext([this, second]);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   *\n   * @example\n   * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);\n   * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);\n   * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n   */\n  var onErrorResumeNext = Observable.onErrorResumeNext = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    }\n    return new AnonymousObservable(function (observer) {\n      var pos = 0, subscription = new SerialDisposable(),\n      cancelable = immediateScheduler.scheduleRecursive(function (self) {\n        var current, d;\n        if (pos < sources.length) {\n          current = sources[pos++];\n          isPromise(current) && (current = observableFromPromise(current));\n          d = new SingleAssignmentDisposable();\n          subscription.setDisposable(d);\n          d.setDisposable(current.subscribe(observer.onNext.bind(observer), self, self));\n        } else {\n          observer.onCompleted();\n        }\n      });\n      return new CompositeDisposable(subscription, cancelable);\n    });\n  };\n\n  /**\n   * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n   * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n   */\n  observableProto.skipUntil = function (other) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var isOpen = false;\n      var disposables = new CompositeDisposable(source.subscribe(function (left) {\n        isOpen && o.onNext(left);\n      }, function (e) { o.onError(e); }, function () {\n        isOpen && o.onCompleted();\n      }));\n\n      isPromise(other) && (other = observableFromPromise(other));\n\n      var rightSubscription = new SingleAssignmentDisposable();\n      disposables.add(rightSubscription);\n      rightSubscription.setDisposable(other.subscribe(function () {\n        isOpen = true;\n        rightSubscription.dispose();\n      }, function (e) { o.onError(e); }, function () {\n        rightSubscription.dispose();\n      }));\n\n      return disposables;\n    }, source);\n  };\n\n  /**\n   * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n   * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n   */\n  observableProto['switch'] = observableProto.switchLatest = function () {\n    var sources = this;\n    return new AnonymousObservable(function (observer) {\n      var hasLatest = false,\n        innerSubscription = new SerialDisposable(),\n        isStopped = false,\n        latest = 0,\n        subscription = sources.subscribe(\n          function (innerSource) {\n            var d = new SingleAssignmentDisposable(), id = ++latest;\n            hasLatest = true;\n            innerSubscription.setDisposable(d);\n\n            // Check if Promise or Observable\n            isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n\n            d.setDisposable(innerSource.subscribe(\n              function (x) { latest === id && observer.onNext(x); },\n              function (e) { latest === id && observer.onError(e); },\n              function () {\n                if (latest === id) {\n                  hasLatest = false;\n                  isStopped && observer.onCompleted();\n                }\n              }));\n          },\n          function (e) { observer.onError(e); },\n          function () {\n            isStopped = true;\n            !hasLatest && observer.onCompleted();\n          });\n      return new CompositeDisposable(subscription, innerSubscription);\n    }, sources);\n  };\n\n  /**\n   * Returns the values from the source observable sequence until the other observable sequence produces a value.\n   * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n   */\n  observableProto.takeUntil = function (other) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      isPromise(other) && (other = observableFromPromise(other));\n      return new CompositeDisposable(\n        source.subscribe(o),\n        other.subscribe(function () { o.onCompleted(); }, function (e) { o.onError(e); }, noop)\n      );\n    }, source);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n   *\n   * @example\n   * 1 - obs = obs1.withLatestFrom(obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = obs1.withLatestFrom([obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.withLatestFrom = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    var resultSelector = args.pop(), source = this;\n\n    if (typeof source === 'undefined') {\n      throw new Error('Source observable not found for withLatestFrom().');\n    }\n    if (typeof resultSelector !== 'function') {\n      throw new Error('withLatestFrom() expects a resultSelector function.');\n    }\n    if (Array.isArray(args[0])) {\n      args = args[0];\n    }\n\n    return new AnonymousObservable(function (observer) {\n      var falseFactory = function () { return false; },\n        n = args.length,\n        hasValue = arrayInitialize(n, falseFactory),\n        hasValueAll = false,\n        values = new Array(n);\n\n      var subscriptions = new Array(n + 1);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          var other = args[i], sad = new SingleAssignmentDisposable();\n          isPromise(other) && (other = observableFromPromise(other));\n          sad.setDisposable(other.subscribe(function (x) {\n            values[i] = x;\n            hasValue[i] = true;\n            hasValueAll = hasValue.every(identity);\n          }, observer.onError.bind(observer), function () {}));\n          subscriptions[i] = sad;\n        }(idx));\n      }\n\n      var sad = new SingleAssignmentDisposable();\n      sad.setDisposable(source.subscribe(function (x) {\n        var res;\n        var allValues = [x].concat(values);\n        if (!hasValueAll) return;\n        try {\n          res = resultSelector.apply(null, allValues);\n        } catch (ex) {\n          observer.onError(ex);\n          return;\n        }\n        observer.onNext(res);\n      }, observer.onError.bind(observer), function () {\n        observer.onCompleted();\n      }));\n      subscriptions[n] = sad;\n\n      return new CompositeDisposable(subscriptions);\n    }, this);\n  };\n\n  function zipArray(second, resultSelector) {\n    var first = this;\n    return new AnonymousObservable(function (observer) {\n      var index = 0, len = second.length;\n      return first.subscribe(function (left) {\n        if (index < len) {\n          var right = second[index++], result;\n          try {\n            result = resultSelector(left, right);\n          } catch (e) {\n            return observer.onError(e);\n          }\n          observer.onNext(result);\n        } else {\n          observer.onCompleted();\n        }\n      }, function (e) { observer.onError(e); }, function () { observer.onCompleted(); });\n    }, first);\n  }\n\n  function falseFactory() { return false; }\n  function emptyArrayFactory() { return []; }\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n   * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n   *\n   * @example\n   * 1 - res = obs1.zip(obs2, fn);\n   * 1 - res = x1.zip([1,2,3], fn);\n   * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n   */\n  observableProto.zip = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    if (Array.isArray(args[0])) { return zipArray.apply(this, args); }\n    var parent = this, resultSelector = args.pop();\n    args.unshift(parent);\n    return new AnonymousObservable(function (observer) {\n      var n = args.length,\n        queues = arrayInitialize(n, emptyArrayFactory),\n        isDone = arrayInitialize(n, falseFactory);\n\n      function next(i) {\n        var res, queuedValues;\n        if (queues.every(function (x) { return x.length > 0; })) {\n          try {\n            queuedValues = queues.map(function (x) { return x.shift(); });\n            res = resultSelector.apply(parent, queuedValues);\n          } catch (ex) {\n            observer.onError(ex);\n            return;\n          }\n          observer.onNext(res);\n        } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n          observer.onCompleted();\n        }\n      };\n\n      function done(i) {\n        isDone[i] = true;\n        if (isDone.every(function (x) { return x; })) {\n          observer.onCompleted();\n        }\n      }\n\n      var subscriptions = new Array(n);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          var source = args[i], sad = new SingleAssignmentDisposable();\n          isPromise(source) && (source = observableFromPromise(source));\n          sad.setDisposable(source.subscribe(function (x) {\n            queues[i].push(x);\n            next(i);\n          }, function (e) { observer.onError(e); }, function () {\n            done(i);\n          }));\n          subscriptions[i] = sad;\n        })(idx);\n      }\n\n      return new CompositeDisposable(subscriptions);\n    }, parent);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n   * @param arguments Observable sources.\n   * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  Observable.zip = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    var first = args.shift();\n    return first.zip.apply(first, args);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n   * @param arguments Observable sources.\n   * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n   */\n  Observable.zipArray = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    }\n    return new AnonymousObservable(function (observer) {\n      var n = sources.length,\n        queues = arrayInitialize(n, function () { return []; }),\n        isDone = arrayInitialize(n, function () { return false; });\n\n      function next(i) {\n        if (queues.every(function (x) { return x.length > 0; })) {\n          var res = queues.map(function (x) { return x.shift(); });\n          observer.onNext(res);\n        } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n          observer.onCompleted();\n          return;\n        }\n      };\n\n      function done(i) {\n        isDone[i] = true;\n        if (isDone.every(identity)) {\n          observer.onCompleted();\n          return;\n        }\n      }\n\n      var subscriptions = new Array(n);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          subscriptions[i] = new SingleAssignmentDisposable();\n          subscriptions[i].setDisposable(sources[i].subscribe(function (x) {\n            queues[i].push(x);\n            next(i);\n          }, function (e) { observer.onError(e); }, function () {\n            done(i);\n          }));\n        })(idx);\n      }\n\n      return new CompositeDisposable(subscriptions);\n    });\n  };\n\n  /**\n   *  Hides the identity of an observable sequence.\n   * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n   */\n  observableProto.asObservable = function () {\n    var source = this;\n    return new AnonymousObservable(function (o) { return source.subscribe(o); }, this);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n   *\n   * @example\n   *  var res = xs.bufferWithCount(10);\n   *  var res = xs.bufferWithCount(10, 1);\n   * @param {Number} count Length of each buffer.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithCount = function (count, skip) {\n    if (typeof skip !== 'number') {\n      skip = count;\n    }\n    return this.windowWithCount(count, skip).selectMany(function (x) {\n      return x.toArray();\n    }).where(function (x) {\n      return x.length > 0;\n    });\n  };\n\n  /**\n   * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n   * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n   */\n  observableProto.dematerialize = function () {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(function (x) { return x.accept(o); }, function(e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, this);\n  };\n\n  /**\n   *  Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.\n   *\n   *  var obs = observable.distinctUntilChanged();\n   *  var obs = observable.distinctUntilChanged(function (x) { return x.id; });\n   *  var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; });\n   *\n   * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value.\n   * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n   * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinctUntilChanged = function (keySelector, comparer) {\n    var source = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var hasCurrentKey = false, currentKey;\n      return source.subscribe(function (value) {\n        var key = value;\n        if (keySelector) {\n          try {\n            key = keySelector(value);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        if (hasCurrentKey) {\n          try {\n            var comparerEquals = comparer(currentKey, key);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        if (!hasCurrentKey || !comparerEquals) {\n          hasCurrentKey = true;\n          currentKey = key;\n          o.onNext(value);\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, this);\n  };\n\n  /**\n   *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n   * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n   * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto['do'] = observableProto.tap = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) {\n    var source = this, tapObserver = typeof observerOrOnNext === 'function' || typeof observerOrOnNext === 'undefined'?\n      observerCreate(observerOrOnNext || noop, onError || noop, onCompleted || noop) :\n      observerOrOnNext;\n    return new AnonymousObservable(function (observer) {\n      return source.subscribe(function (x) {\n        try {\n          tapObserver.onNext(x);\n        } catch (e) {\n          observer.onError(e);\n        }\n        observer.onNext(x);\n      }, function (err) {\n          try {\n            tapObserver.onError(err);\n          } catch (e) {\n            observer.onError(e);\n          }\n        observer.onError(err);\n      }, function () {\n        try {\n          tapObserver.onCompleted();\n        } catch (e) {\n          observer.onError(e);\n        }\n        observer.onCompleted();\n      });\n    }, this);\n  };\n\n  /**\n   *  Invokes an action for each element in the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function} onNext Action to invoke for each element in the observable sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto.doOnNext = observableProto.tapOnNext = function (onNext, thisArg) {\n    return this.tap(typeof thisArg !== 'undefined' ? function (x) { onNext.call(thisArg, x); } : onNext);\n  };\n\n  /**\n   *  Invokes an action upon exceptional termination of the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto.doOnError = observableProto.tapOnError = function (onError, thisArg) {\n    return this.tap(noop, typeof thisArg !== 'undefined' ? function (e) { onError.call(thisArg, e); } : onError);\n  };\n\n  /**\n   *  Invokes an action upon graceful termination of the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto.doOnCompleted = observableProto.tapOnCompleted = function (onCompleted, thisArg) {\n    return this.tap(noop, null, typeof thisArg !== 'undefined' ? function () { onCompleted.call(thisArg); } : onCompleted);\n  };\n\n  /**\n   *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n   * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n   * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n   */\n  observableProto['finally'] = observableProto.ensure = function (action) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var subscription;\n      try {\n        subscription = source.subscribe(observer);\n      } catch (e) {\n        action();\n        throw e;\n      }\n      return disposableCreate(function () {\n        try {\n          subscription.dispose();\n        } catch (e) {\n          throw e;\n        } finally {\n          action();\n        }\n      });\n    }, this);\n  };\n\n  /**\n   * @deprecated use #finally or #ensure instead.\n   */\n  observableProto.finallyAction = function (action) {\n    //deprecate('finallyAction', 'finally or ensure');\n    return this.ensure(action);\n  };\n\n  /**\n   *  Ignores all elements in an observable sequence leaving only the termination messages.\n   * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n   */\n  observableProto.ignoreElements = function () {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(noop, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n   * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n   */\n  observableProto.materialize = function () {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      return source.subscribe(function (value) {\n        observer.onNext(notificationCreateOnNext(value));\n      }, function (e) {\n        observer.onNext(notificationCreateOnError(e));\n        observer.onCompleted();\n      }, function () {\n        observer.onNext(notificationCreateOnCompleted());\n        observer.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n   * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n   * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n   */\n  observableProto.repeat = function (repeatCount) {\n    return enumerableRepeat(this, repeatCount).concat();\n  };\n\n  /**\n   *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n   *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n   *\n   * @example\n   *  var res = retried = retry.repeat();\n   *  var res = retried = retry.repeat(2);\n   * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retry = function (retryCount) {\n    return enumerableRepeat(this, retryCount).catchError();\n  };\n\n  /**\n   *  Repeats the source observable sequence upon error each time the notifier emits or until it successfully terminates. \n   *  if the notifier completes, the observable sequence completes.\n   *\n   * @example\n   *  var timer = Observable.timer(500);\n   *  var source = observable.retryWhen(timer);\n   * @param {Observable} [notifier] An observable that triggers the retries or completes the observable with onNext or onCompleted respectively.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retryWhen = function (notifier) {\n    return enumerableRepeat(this).catchErrorWhen(notifier);\n  };\n  /**\n   *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n   *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n   * @example\n   *  var res = source.scan(function (acc, x) { return acc + x; });\n   *  var res = source.scan(0, function (acc, x) { return acc + x; });\n   * @param {Mixed} [seed] The initial accumulator value.\n   * @param {Function} accumulator An accumulator function to be invoked on each element.\n   * @returns {Observable} An observable sequence containing the accumulated values.\n   */\n  observableProto.scan = function () {\n    var hasSeed = false, seed, accumulator, source = this;\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[0];\n      accumulator = arguments[1];\n    } else {\n      accumulator = arguments[0];\n    }\n    return new AnonymousObservable(function (o) {\n      var hasAccumulation, accumulation, hasValue;\n      return source.subscribe (\n        function (x) {\n          !hasValue && (hasValue = true);\n          try {\n            if (hasAccumulation) {\n              accumulation = accumulator(accumulation, x);\n            } else {\n              accumulation = hasSeed ? accumulator(seed, x) : x;\n              hasAccumulation = true;\n            }\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n\n          o.onNext(accumulation);\n        },\n        function (e) { o.onError(e); },\n        function () {\n          !hasValue && hasSeed && o.onNext(seed);\n          o.onCompleted();\n        }\n      );\n    }, source);\n  };\n\n  /**\n   *  Bypasses a specified number of elements at the end of an observable sequence.\n   * @description\n   *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n   *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n   * @param count Number of elements to bypass at the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n   */\n  observableProto.skipLast = function (count) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        q.push(x);\n        q.length > count && o.onNext(q.shift());\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n   *  @example\n   *  var res = source.startWith(1, 2, 3);\n   *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n   * @param {Arguments} args The specified values to prepend to the observable sequence\n   * @returns {Observable} The source sequence prepended with the specified values.\n   */\n  observableProto.startWith = function () {\n    var values, scheduler, start = 0;\n    if (!!arguments.length && isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      start = 1;\n    } else {\n      scheduler = immediateScheduler;\n    }\n    for(var args = [], i = start, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return enumerableOf([observableFromArray(args, scheduler), this]).concat();\n  };\n\n  /**\n   *  Returns a specified number of contiguous elements from the end of an observable sequence.\n   * @description\n   *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n   *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLast = function (count) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        q.push(x);\n        q.length > count && q.shift();\n      }, function (e) { o.onError(e); }, function () {\n        while (q.length > 0) { o.onNext(q.shift()); }\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n   *\n   * @description\n   *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n   *  source sequence, this buffer is produced on the result sequence.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLastBuffer = function (count) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        q.push(x);\n        q.length > count && q.shift();\n      }, function (e) { o.onError(e); }, function () {\n        o.onNext(q);\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n   *\n   *  var res = xs.windowWithCount(10);\n   *  var res = xs.windowWithCount(10, 1);\n   * @param {Number} count Length of each window.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithCount = function (count, skip) {\n    var source = this;\n    +count || (count = 0);\n    Math.abs(count) === Infinity && (count = 0);\n    if (count <= 0) { throw new Error(argumentOutOfRange); }\n    skip == null && (skip = count);\n    +skip || (skip = 0);\n    Math.abs(skip) === Infinity && (skip = 0);\n\n    if (skip <= 0) { throw new Error(argumentOutOfRange); }\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(),\n        refCountDisposable = new RefCountDisposable(m),\n        n = 0,\n        q = [];\n\n      function createWindow () {\n        var s = new Subject();\n        q.push(s);\n        observer.onNext(addRef(s, refCountDisposable));\n      }\n\n      createWindow();\n\n      m.setDisposable(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n          var c = n - count + 1;\n          c >= 0 && c % skip === 0 && q.shift().onCompleted();\n          ++n % skip === 0 && createWindow();\n        },\n        function (e) {\n          while (q.length > 0) { q.shift().onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          while (q.length > 0) { q.shift().onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  function concatMap(source, selector, thisArg) {\n    var selectorFunc = bindCallback(selector, thisArg, 3);\n    return source.map(function (x, i) {\n      var result = selectorFunc(x, i, source);\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));\n      return result;\n    }).concatAll();\n  }\n\n  /**\n   *  One of the Following:\n   *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   * @example\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n   *  Or:\n   *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n   *\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n   *  Or:\n   *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n   * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n   * source sequence onto which could be either an observable or Promise.\n   * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n   */\n  observableProto.selectConcat = observableProto.concatMap = function (selector, resultSelector, thisArg) {\n    if (isFunction(selector) && isFunction(resultSelector)) {\n      return this.concatMap(function (x, i) {\n        var selectorResult = selector(x, i);\n        isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));\n        (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));\n\n        return selectorResult.map(function (y, i2) {\n          return resultSelector(x, y, i, i2);\n        });\n      });\n    }\n    return isFunction(selector) ?\n      concatMap(this, selector, thisArg) :\n      concatMap(this, function () { return selector; });\n  };\n\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.concatMapObserver = observableProto.selectConcatObserver = function(onNext, onError, onCompleted, thisArg) {\n    var source = this,\n        onNextFunc = bindCallback(onNext, thisArg, 2),\n        onErrorFunc = bindCallback(onError, thisArg, 1),\n        onCompletedFunc = bindCallback(onCompleted, thisArg, 0);\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNextFunc(x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onErrorFunc(err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompletedFunc();\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, this).concatAll();\n  };\n\n    /**\n     *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n     *\n     *  var res = obs = xs.defaultIfEmpty();\n     *  2 - obs = xs.defaultIfEmpty(false);\n     *\n     * @memberOf Observable#\n     * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n     * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n     */\n    observableProto.defaultIfEmpty = function (defaultValue) {\n      var source = this;\n      defaultValue === undefined && (defaultValue = null);\n      return new AnonymousObservable(function (observer) {\n        var found = false;\n        return source.subscribe(function (x) {\n          found = true;\n          observer.onNext(x);\n        },\n        function (e) { observer.onError(e); }, \n        function () {\n          !found && observer.onNext(defaultValue);\n          observer.onCompleted();\n        });\n      }, source);\n    };\n\n  // Swap out for Array.findIndex\n  function arrayIndexOfComparer(array, item, comparer) {\n    for (var i = 0, len = array.length; i < len; i++) {\n      if (comparer(array[i], item)) { return i; }\n    }\n    return -1;\n  }\n\n  function HashSet(comparer) {\n    this.comparer = comparer;\n    this.set = [];\n  }\n  HashSet.prototype.push = function(value) {\n    var retValue = arrayIndexOfComparer(this.set, value, this.comparer) === -1;\n    retValue && this.set.push(value);\n    return retValue;\n  };\n\n  /**\n   *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n   *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n   *\n   * @example\n   *  var res = obs = xs.distinct();\n   *  2 - obs = xs.distinct(function (x) { return x.id; });\n   *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n   * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n   * @param {Function} [comparer]  Used to compare items in the collection.\n   * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinct = function (keySelector, comparer) {\n    var source = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var hashSet = new HashSet(comparer);\n      return source.subscribe(function (x) {\n        var key = x;\n\n        if (keySelector) {\n          try {\n            key = keySelector(x);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        hashSet.push(key) && o.onNext(x);\n      },\n      function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, this);\n  };\n\n  /**\n   *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n   *\n   * @example\n   *  var res = observable.groupBy(function (x) { return x.id; });\n   *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n   *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n   * @param {Function} keySelector A function to extract the key for each element.\n   * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n   * @param {Function} [comparer] Used to determine whether the objects are equal.\n   * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n   */\n  observableProto.groupBy = function (keySelector, elementSelector, comparer) {\n    return this.groupByUntil(keySelector, elementSelector, observableNever, comparer);\n  };\n\n    /**\n     *  Groups the elements of an observable sequence according to a specified key selector function.\n     *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n     *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n     *\n     * @example\n     *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n     *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n     *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n     * @param {Function} keySelector A function to extract the key for each element.\n     * @param {Function} durationSelector A function to signal the expiration of a group.\n     * @param {Function} [comparer] Used to compare objects. When not specified, the default comparer is used.\n     * @returns {Observable}\n     *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n     *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n     *\n     */\n    observableProto.groupByUntil = function (keySelector, elementSelector, durationSelector, comparer) {\n      var source = this;\n      elementSelector || (elementSelector = identity);\n      comparer || (comparer = defaultComparer);\n      return new AnonymousObservable(function (observer) {\n        function handleError(e) { return function (item) { item.onError(e); }; }\n        var map = new Dictionary(0, comparer),\n          groupDisposable = new CompositeDisposable(),\n          refCountDisposable = new RefCountDisposable(groupDisposable);\n\n        groupDisposable.add(source.subscribe(function (x) {\n          var key;\n          try {\n            key = keySelector(x);\n          } catch (e) {\n            map.getValues().forEach(handleError(e));\n            observer.onError(e);\n            return;\n          }\n\n          var fireNewMapEntry = false,\n            writer = map.tryGetValue(key);\n          if (!writer) {\n            writer = new Subject();\n            map.set(key, writer);\n            fireNewMapEntry = true;\n          }\n\n          if (fireNewMapEntry) {\n            var group = new GroupedObservable(key, writer, refCountDisposable),\n              durationGroup = new GroupedObservable(key, writer);\n            try {\n              duration = durationSelector(durationGroup);\n            } catch (e) {\n              map.getValues().forEach(handleError(e));\n              observer.onError(e);\n              return;\n            }\n\n            observer.onNext(group);\n\n            var md = new SingleAssignmentDisposable();\n            groupDisposable.add(md);\n\n            var expire = function () {\n              map.remove(key) && writer.onCompleted();\n              groupDisposable.remove(md);\n            };\n\n            md.setDisposable(duration.take(1).subscribe(\n              noop,\n              function (exn) {\n                map.getValues().forEach(handleError(exn));\n                observer.onError(exn);\n              },\n              expire)\n            );\n          }\n\n          var element;\n          try {\n            element = elementSelector(x);\n          } catch (e) {\n            map.getValues().forEach(handleError(e));\n            observer.onError(e);\n            return;\n          }\n\n          writer.onNext(element);\n      }, function (ex) {\n        map.getValues().forEach(handleError(ex));\n        observer.onError(ex);\n      }, function () {\n        map.getValues().forEach(function (item) { item.onCompleted(); });\n        observer.onCompleted();\n      }));\n\n      return refCountDisposable;\n    }, source);\n  };\n\n  var MapObservable = (function (__super__) {\n    inherits(MapObservable, __super__);\n\n    function MapObservable(source, selector, thisArg) {\n      this.source = source;\n      this.selector = bindCallback(selector, thisArg, 3);\n      __super__.call(this);\n    }\n\n    MapObservable.prototype.internalMap = function (selector, thisArg) {\n      var self = this;\n      return new MapObservable(this.source, function (x, i, o) { return selector(self.selector(x, i, o), i, o); }, thisArg)\n    };\n\n    MapObservable.prototype.subscribeCore = function (observer) {\n      return this.source.subscribe(new MapObserver(observer, this.selector, this));\n    };\n\n    return MapObservable;\n\n  }(ObservableBase));\n\n  function MapObserver(observer, selector, source) {\n    this.observer = observer;\n    this.selector = selector;\n    this.source = source;\n    this.index = 0;\n    this.isStopped = false;\n  }\n\n  MapObserver.prototype.onNext = function(x) {\n    if (this.isStopped) { return; }\n    try {\n      var result = this.selector(x, this.index++, this.source);\n    } catch(e) {\n      return this.observer.onError(e);\n    }\n    this.observer.onNext(result);\n  };\n  MapObserver.prototype.onError = function (e) {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onError(e); }\n  };\n  MapObserver.prototype.onCompleted = function () {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onCompleted(); }\n  };\n  MapObserver.prototype.dispose = function() { this.isStopped = true; };\n  MapObserver.prototype.fail = function (e) {\n    if (!this.isStopped) {\n      this.isStopped = true;\n      this.observer.onError(e);\n      return true;\n    }\n\n    return false;\n  };\n\n  /**\n  * Projects each element of an observable sequence into a new form by incorporating the element's index.\n  * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n  */\n  observableProto.map = observableProto.select = function (selector, thisArg) {\n    var selectorFn = typeof selector === 'function' ? selector : function () { return selector; };\n    return this instanceof MapObservable ?\n      this.internalMap(selector, thisArg) :\n      new MapObservable(this, selectorFn, thisArg);\n  };\n\n  /**\n   * Retrieves the value of a specified nested property from all elements in\n   * the Observable sequence.\n   * @param {Arguments} arguments The nested properties to pluck.\n   * @returns {Observable} Returns a new Observable sequence of property values.\n   */\n  observableProto.pluck = function () {\n    var args = arguments, len = arguments.length;\n    if (len === 0) { throw new Error('List of properties cannot be empty.'); }\n    return this.map(function (x) {\n      var currentProp = x;\n      for (var i = 0; i < len; i++) {\n        var p = currentProp[args[i]];\n        if (typeof p !== 'undefined') {\n          currentProp = p;\n        } else {\n          return undefined;\n        }\n      }\n      return currentProp;\n    });\n  };\n\n  function flatMap(source, selector, thisArg) {\n    var selectorFunc = bindCallback(selector, thisArg, 3);\n    return source.map(function (x, i) {\n      var result = selectorFunc(x, i, source);\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));\n      return result;\n    }).mergeAll();\n  }\n\n  /**\n   *  One of the Following:\n   *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   * @example\n   *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n   *  Or:\n   *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n   *\n   *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n   *  Or:\n   *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n   * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n   * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n   */\n  observableProto.selectMany = observableProto.flatMap = function (selector, resultSelector, thisArg) {\n    if (isFunction(selector) && isFunction(resultSelector)) {\n      return this.flatMap(function (x, i) {\n        var selectorResult = selector(x, i);\n        isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));\n        (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));\n\n        return selectorResult.map(function (y, i2) {\n          return resultSelector(x, y, i, i2);\n        });\n      }, thisArg);\n    }\n    return isFunction(selector) ?\n      flatMap(this, selector, thisArg) :\n      flatMap(this, function () { return selector; });\n  };\n\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.flatMapObserver = observableProto.selectManyObserver = function (onNext, onError, onCompleted, thisArg) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNext.call(thisArg, x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onError.call(thisArg, err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompleted.call(thisArg);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, source).mergeAll();\n  };\n\n  /**\n   *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n   *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n   * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n   *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n   */\n  observableProto.selectSwitch = observableProto.flatMapLatest = observableProto.switchMap = function (selector, thisArg) {\n    return this.select(selector, thisArg).switchLatest();\n  };\n\n  /**\n   * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n   * @param {Number} count The number of elements to skip before returning the remaining elements.\n   * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n   */\n  observableProto.skip = function (count) {\n    if (count < 0) { throw new Error(argumentOutOfRange); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var remaining = count;\n      return source.subscribe(function (x) {\n        if (remaining <= 0) {\n          o.onNext(x);\n        } else {\n          remaining--;\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n   *  The element's index is used in the logic of the predicate function.\n   *\n   *  var res = source.skipWhile(function (value) { return value < 10; });\n   *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n   */\n  observableProto.skipWhile = function (predicate, thisArg) {\n    var source = this,\n        callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      var i = 0, running = false;\n      return source.subscribe(function (x) {\n        if (!running) {\n          try {\n            running = !callback(x, i++, source);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        running && o.onNext(x);\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n   *\n   *  var res = source.take(5);\n   *  var res = source.take(0, Rx.Scheduler.timeout);\n   * @param {Number} count The number of elements to return.\n   * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n   * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n   */\n  observableProto.take = function (count, scheduler) {\n    if (count < 0) { throw new RangeError(argumentOutOfRange); }\n    if (count === 0) { return observableEmpty(scheduler); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var remaining = count;\n      return source.subscribe(function (x) {\n        if (remaining-- > 0) {\n          o.onNext(x);\n          remaining === 0 && o.onCompleted();\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Returns elements from an observable sequence as long as a specified condition is true.\n   *  The element's index is used in the logic of the predicate function.\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n   */\n  observableProto.takeWhile = function (predicate, thisArg) {\n    var source = this,\n        callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      var i = 0, running = true;\n      return source.subscribe(function (x) {\n        if (running) {\n          try {\n            running = callback(x, i++, source);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n          if (running) {\n            o.onNext(x);\n          } else {\n            o.onCompleted();\n          }\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  var FilterObservable = (function (__super__) {\n    inherits(FilterObservable, __super__);\n\n    function FilterObservable(source, predicate, thisArg) {\n      this.source = source;\n      this.predicate = bindCallback(predicate, thisArg, 3);\n      __super__.call(this);\n    }\n\n    FilterObservable.prototype.subscribeCore = function (observer) {\n      return this.source.subscribe(new FilterObserver(observer, this.predicate, this));\n    };\n\n    FilterObservable.prototype.internalFilter = function(predicate, thisArg) {\n      var self = this;\n      return new FilterObservable(this.source, function(x, i, o) { return self.predicate(x, i, o) && predicate(x, i, o); }, thisArg);\n    };\n\n    return FilterObservable;\n\n  }(ObservableBase));\n\n  function FilterObserver(observer, predicate, source) {\n    this.observer = observer;\n    this.predicate = predicate;\n    this.source = source;\n    this.index = 0;\n    this.isStopped = false;\n  }\n\n  FilterObserver.prototype.onNext = function(x) {\n    try {\n      var shouldYield = this.predicate(x, this.index++, this.source);\n    } catch(e) {\n      return this.observer.onError(e);\n    }\n    shouldYield && this.observer.onNext(x);\n  };\n\n  FilterObserver.prototype.onError = function (e) {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onError(e); }\n  };\n  FilterObserver.prototype.onCompleted = function () {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onCompleted(); }\n  };\n  FilterObserver.prototype.dispose = function() { this.isStopped = true; };\n  FilterObserver.prototype.fail = function (e) {\n    if (!this.isStopped) {\n      this.isStopped = true;\n      this.observer.onError(e);\n      return true;\n    }\n\n    return false;\n  };\n\n\n\n  /**\n  *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n  * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n  */\n  observableProto.filter = observableProto.where = function (predicate, thisArg) {\n    return this instanceof FilterObservable ? this.internalFilter(predicate, thisArg) :\n      new FilterObservable(this, predicate, thisArg);\n  };\n\n  function extremaBy(source, keySelector, comparer) {\n    return new AnonymousObservable(function (o) {\n      var hasValue = false, lastKey = null, list = [];\n      return source.subscribe(function (x) {\n        var comparison, key;\n        try {\n          key = keySelector(x);\n        } catch (ex) {\n          o.onError(ex);\n          return;\n        }\n        comparison = 0;\n        if (!hasValue) {\n          hasValue = true;\n          lastKey = key;\n        } else {\n          try {\n            comparison = comparer(key, lastKey);\n          } catch (ex1) {\n            o.onError(ex1);\n            return;\n          }\n        }\n        if (comparison > 0) {\n          lastKey = key;\n          list = [];\n        }\n        if (comparison >= 0) { list.push(x); }\n      }, function (e) { o.onError(e); }, function () {\n        o.onNext(list);\n        o.onCompleted();\n      });\n    }, source);\n  }\n\n  function firstOnly(x) {\n    if (x.length === 0) { throw new Error(sequenceContainsNoElements); }\n    return x[0];\n  }\n\n  /**\n   * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n   * For aggregation behavior with incremental intermediate results, see Observable.scan.\n   * @deprecated Use #reduce instead\n   * @param {Mixed} [seed] The initial accumulator value.\n   * @param {Function} accumulator An accumulator function to be invoked on each element.\n   * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n   */\n  observableProto.aggregate = function () {\n    //deprecate('aggregate', 'reduce');\n    var hasSeed = false, accumulator, seed, source = this;\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[0];\n      accumulator = arguments[1];\n    } else {\n      accumulator = arguments[0];\n    }\n    return new AnonymousObservable(function (o) {\n      var hasAccumulation, accumulation, hasValue;\n      return source.subscribe (\n        function (x) {\n          !hasValue && (hasValue = true);\n          try {\n            if (hasAccumulation) {\n              accumulation = accumulator(accumulation, x);\n            } else {\n              accumulation = hasSeed ? accumulator(seed, x) : x;\n              hasAccumulation = true;\n            }\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        },\n        function (e) { o.onError(e); },\n        function () {\n          hasValue && o.onNext(accumulation);\n          !hasValue && hasSeed && o.onNext(seed);\n          !hasValue && !hasSeed && o.onError(new Error(sequenceContainsNoElements));\n          o.onCompleted();\n        }\n      );\n    }, source);\n  };\n\n  /**\n   * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n   * For aggregation behavior with incremental intermediate results, see Observable.scan.\n   * @param {Function} accumulator An accumulator function to be invoked on each element.\n   * @param {Any} [seed] The initial accumulator value.\n   * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n   */\n  observableProto.reduce = function (accumulator) {\n    var hasSeed = false, seed, source = this;\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[1];\n    }\n    return new AnonymousObservable(function (o) {\n      var hasAccumulation, accumulation, hasValue;\n      return source.subscribe (\n        function (x) {\n          !hasValue && (hasValue = true);\n          try {\n            if (hasAccumulation) {\n              accumulation = accumulator(accumulation, x);\n            } else {\n              accumulation = hasSeed ? accumulator(seed, x) : x;\n              hasAccumulation = true;\n            }\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        },\n        function (e) { o.onError(e); },\n        function () {\n          hasValue && o.onNext(accumulation);\n          !hasValue && hasSeed && o.onNext(seed);\n          !hasValue && !hasSeed && o.onError(new Error(sequenceContainsNoElements));\n          o.onCompleted();\n        }\n      );\n    }, source);\n  };\n\n  /**\n   * Determines whether any element of an observable sequence satisfies a condition if present, else if any items are in the sequence.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @returns {Observable} An observable sequence containing a single element determining whether any elements in the source sequence pass the test in the specified predicate if given, else if any items are in the sequence.\n   */\n  observableProto.some = function (predicate, thisArg) {\n    var source = this;\n    return predicate ?\n      source.filter(predicate, thisArg).some() :\n      new AnonymousObservable(function (observer) {\n        return source.subscribe(function () {\n          observer.onNext(true);\n          observer.onCompleted();\n        }, function (e) { observer.onError(e); }, function () {\n          observer.onNext(false);\n          observer.onCompleted();\n        });\n      }, source);\n  };\n\n  /** @deprecated use #some instead */\n  observableProto.any = function () {\n    //deprecate('any', 'some');\n    return this.some.apply(this, arguments);\n  };\n\n  /**\n   * Determines whether an observable sequence is empty.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence is empty.\n   */\n  observableProto.isEmpty = function () {\n    return this.any().map(not);\n  };\n\n  /**\n   * Determines whether all elements of an observable sequence satisfy a condition.\n   * @param {Function} [predicate] A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element determining whether all elements in the source sequence pass the test in the specified predicate.\n   */\n  observableProto.every = function (predicate, thisArg) {\n    return this.filter(function (v) { return !predicate(v); }, thisArg).some().map(not);\n  };\n\n  /** @deprecated use #every instead */\n  observableProto.all = function () {\n    //deprecate('all', 'every');\n    return this.every.apply(this, arguments);\n  };\n\n  /**\n   * Determines whether an observable sequence includes a specified element with an optional equality comparer.\n   * @param searchElement The value to locate in the source sequence.\n   * @param {Number} [fromIndex] An equality comparer to compare elements.\n   * @returns {Observable} An observable sequence containing a single element determining whether the source sequence includes an element that has the specified value from the given index.\n   */\n  observableProto.includes = function (searchElement, fromIndex) {\n    var source = this;\n    function comparer(a, b) {\n      return (a === 0 && b === 0) || (a === b || (isNaN(a) && isNaN(b)));\n    }\n    return new AnonymousObservable(function (o) {\n      var i = 0, n = +fromIndex || 0;\n      Math.abs(n) === Infinity && (n = 0);\n      if (n < 0) {\n        o.onNext(false);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n      return source.subscribe(\n        function (x) {\n          if (i++ >= n && comparer(x, searchElement)) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        },\n        function (e) { o.onError(e); },\n        function () {\n          o.onNext(false);\n          o.onCompleted();\n        });\n    }, this);\n  };\n\n  /**\n   * @deprecated use #includes instead.\n   */\n  observableProto.contains = function (searchElement, fromIndex) {\n    //deprecate('contains', 'includes');\n    observableProto.includes(searchElement, fromIndex);\n  };\n  /**\n   * Returns an observable sequence containing a value that represents how many elements in the specified observable sequence satisfy a condition if provided, else the count of items.\n   * @example\n   * res = source.count();\n   * res = source.count(function (x) { return x > 3; });\n   * @param {Function} [predicate]A function to test each element for a condition.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with a number that represents how many elements in the input sequence satisfy the condition in the predicate function if provided, else the count of items in the sequence.\n   */\n  observableProto.count = function (predicate, thisArg) {\n    return predicate ?\n      this.filter(predicate, thisArg).count() :\n      this.reduce(function (count) { return count + 1; }, 0);\n  };\n\n  /**\n   * Returns the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   * @param {Any} searchElement Element to locate in the array.\n   * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n   * @returns {Observable} And observable sequence containing the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n   */\n  observableProto.indexOf = function(searchElement, fromIndex) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var i = 0, n = +fromIndex || 0;\n      Math.abs(n) === Infinity && (n = 0);\n      if (n < 0) {\n        o.onNext(-1);\n        o.onCompleted();\n        return disposableEmpty;\n      }\n      return source.subscribe(\n        function (x) {\n          if (i >= n && x === searchElement) {\n            o.onNext(i);\n            o.onCompleted();\n          }\n          i++;\n        },\n        function (e) { o.onError(e); },\n        function () {\n          o.onNext(-1);\n          o.onCompleted();\n        });\n    }, source);\n  };\n\n  /**\n   * Computes the sum of a sequence of values that are obtained by invoking an optional transform function on each element of the input sequence, else if not specified computes the sum on each item in the sequence.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the sum of the values in the source sequence.\n   */\n  observableProto.sum = function (keySelector, thisArg) {\n    return keySelector && isFunction(keySelector) ?\n      this.map(keySelector, thisArg).sum() :\n      this.reduce(function (prev, curr) { return prev + curr; }, 0);\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n   * @example\n   * var res = source.minBy(function (x) { return x.value; });\n   * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer] Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n   */\n  observableProto.minBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return extremaBy(this, keySelector, function (x, y) { return comparer(x, y) * -1; });\n  };\n\n  /**\n   * Returns the minimum element in an observable sequence according to the optional comparer else a default greater than less than check.\n   * @example\n   * var res = source.min();\n   * var res = source.min(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the minimum element in the source sequence.\n   */\n  observableProto.min = function (comparer) {\n    return this.minBy(identity, comparer).map(function (x) { return firstOnly(x); });\n  };\n\n  /**\n   * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n   * @example\n   * var res = source.maxBy(function (x) { return x.value; });\n   * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n   * @param {Function} keySelector Key selector function.\n   * @param {Function} [comparer]  Comparer used to compare key values.\n   * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n   */\n  observableProto.maxBy = function (keySelector, comparer) {\n    comparer || (comparer = defaultSubComparer);\n    return extremaBy(this, keySelector, comparer);\n  };\n\n  /**\n   * Returns the maximum value in an observable sequence according to the specified comparer.\n   * @example\n   * var res = source.max();\n   * var res = source.max(function (x, y) { return x.value - y.value; });\n   * @param {Function} [comparer] Comparer used to compare elements.\n   * @returns {Observable} An observable sequence containing a single element with the maximum element in the source sequence.\n   */\n  observableProto.max = function (comparer) {\n    return this.maxBy(identity, comparer).map(function (x) { return firstOnly(x); });\n  };\n\n  /**\n   * Computes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present.\n   * @param {Function} [selector] A transform function to apply to each element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence containing a single element with the average of the sequence of values.\n   */\n  observableProto.average = function (keySelector, thisArg) {\n    return keySelector && isFunction(keySelector) ?\n      this.map(keySelector, thisArg).average() :\n      this.reduce(function (prev, cur) {\n        return {\n          sum: prev.sum + cur,\n          count: prev.count + 1\n        };\n      }, {sum: 0, count: 0 }).map(function (s) {\n        if (s.count === 0) { throw new Error(sequenceContainsNoElements); }\n        return s.sum / s.count;\n      });\n  };\n\n  /**\n   *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n   *\n   * @example\n   * var res = res = source.sequenceEqual([1,2,3]);\n   * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n   * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n   * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n   * @param {Observable} second Second observable sequence or array to compare.\n   * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n   * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n   */\n  observableProto.sequenceEqual = function (second, comparer) {\n    var first = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var donel = false, doner = false, ql = [], qr = [];\n      var subscription1 = first.subscribe(function (x) {\n        var equal, v;\n        if (qr.length > 0) {\n          v = qr.shift();\n          try {\n            equal = comparer(v, x);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (doner) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          ql.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        donel = true;\n        if (ql.length === 0) {\n          if (qr.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (doner) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n\n      (isArrayLike(second) || isIterable(second)) && (second = observableFrom(second));\n      isPromise(second) && (second = observableFromPromise(second));\n      var subscription2 = second.subscribe(function (x) {\n        var equal;\n        if (ql.length > 0) {\n          var v = ql.shift();\n          try {\n            equal = comparer(v, x);\n          } catch (exception) {\n            o.onError(exception);\n            return;\n          }\n          if (!equal) {\n            o.onNext(false);\n            o.onCompleted();\n          }\n        } else if (donel) {\n          o.onNext(false);\n          o.onCompleted();\n        } else {\n          qr.push(x);\n        }\n      }, function(e) { o.onError(e); }, function () {\n        doner = true;\n        if (qr.length === 0) {\n          if (ql.length > 0) {\n            o.onNext(false);\n            o.onCompleted();\n          } else if (donel) {\n            o.onNext(true);\n            o.onCompleted();\n          }\n        }\n      });\n      return new CompositeDisposable(subscription1, subscription2);\n    }, first);\n  };\n\n  function elementAtOrDefault(source, index, hasDefault, defaultValue) {\n    if (index < 0) { throw new Error(argumentOutOfRange); }\n    return new AnonymousObservable(function (o) {\n      var i = index;\n      return source.subscribe(function (x) {\n        if (i-- === 0) {\n          o.onNext(x);\n          o.onCompleted();\n        }\n      }, function (e) { o.onError(e); }, function () {\n        if (!hasDefault) {\n          o.onError(new Error(argumentOutOfRange));\n        } else {\n          o.onNext(defaultValue);\n          o.onCompleted();\n        }\n      });\n    }, source);\n  }\n\n  /**\n   * Returns the element at a specified index in a sequence.\n   * @example\n   * var res = source.elementAt(5);\n   * @param {Number} index The zero-based index of the element to retrieve.\n   * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence.\n   */\n  observableProto.elementAt =  function (index) {\n    return elementAtOrDefault(this, index, false);\n  };\n\n  /**\n   * Returns the element at a specified index in a sequence or a default value if the index is out of range.\n   * @example\n   * var res = source.elementAtOrDefault(5);\n   * var res = source.elementAtOrDefault(5, 0);\n   * @param {Number} index The zero-based index of the element to retrieve.\n   * @param [defaultValue] The default value if the index is outside the bounds of the source sequence.\n   * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence, or a default value if the index is outside the bounds of the source sequence.\n   */\n  observableProto.elementAtOrDefault = function (index, defaultValue) {\n    return elementAtOrDefault(this, index, true, defaultValue);\n  };\n\n  function singleOrDefaultAsync(source, hasDefault, defaultValue) {\n    return new AnonymousObservable(function (o) {\n      var value = defaultValue, seenValue = false;\n      return source.subscribe(function (x) {\n        if (seenValue) {\n          o.onError(new Error('Sequence contains more than one element'));\n        } else {\n          value = x;\n          seenValue = true;\n        }\n      }, function (e) { o.onError(e); }, function () {\n        if (!seenValue && !hasDefault) {\n          o.onError(new Error(sequenceContainsNoElements));\n        } else {\n          o.onNext(value);\n          o.onCompleted();\n        }\n      });\n    }, source);\n  }\n\n  /**\n   * Returns the only element of an observable sequence that satisfies the condition in the optional predicate, and reports an exception if there is not exactly one element in the observable sequence.\n   * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate.\n   */\n  observableProto.single = function (predicate, thisArg) {\n    return predicate && isFunction(predicate) ?\n      this.where(predicate, thisArg).single() :\n      singleOrDefaultAsync(this, false);\n  };\n\n  /**\n   * Returns the only element of an observable sequence that matches the predicate, or a default value if no such element exists; this method reports an exception if there is more than one element in the observable sequence.\n   * @example\n   * var res = res = source.singleOrDefault();\n   * var res = res = source.singleOrDefault(function (x) { return x === 42; });\n   * res = source.singleOrDefault(function (x) { return x === 42; }, 0);\n   * res = source.singleOrDefault(null, 0);\n   * @memberOf Observable#\n   * @param {Function} predicate A predicate function to evaluate for elements in the source sequence.\n   * @param [defaultValue] The default value if the index is outside the bounds of the source sequence.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate, or a default value if no such element exists.\n   */\n  observableProto.singleOrDefault = function (predicate, defaultValue, thisArg) {\n    return predicate && isFunction(predicate) ?\n      this.filter(predicate, thisArg).singleOrDefault(null, defaultValue) :\n      singleOrDefaultAsync(this, true, defaultValue);\n  };\n\n  function firstOrDefaultAsync(source, hasDefault, defaultValue) {\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(function (x) {\n        o.onNext(x);\n        o.onCompleted();\n      }, function (e) { o.onError(e); }, function () {\n        if (!hasDefault) {\n          o.onError(new Error(sequenceContainsNoElements));\n        } else {\n          o.onNext(defaultValue);\n          o.onCompleted();\n        }\n      });\n    }, source);\n  }\n\n  /**\n   * Returns the first element of an observable sequence that satisfies the condition in the predicate if present else the first item in the sequence.\n   * @example\n   * var res = res = source.first();\n   * var res = res = source.first(function (x) { return x > 3; });\n   * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate if provided, else the first item in the sequence.\n   */\n  observableProto.first = function (predicate, thisArg) {\n    return predicate ?\n      this.where(predicate, thisArg).first() :\n      firstOrDefaultAsync(this, false);\n  };\n\n  /**\n   * Returns the first element of an observable sequence that satisfies the condition in the predicate, or a default value if no such element exists.\n   * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n   * @param {Any} [defaultValue] The default value if no such element exists.  If not specified, defaults to null.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate, or a default value if no such element exists.\n   */\n  observableProto.firstOrDefault = function (predicate, defaultValue, thisArg) {\n    return predicate ?\n      this.where(predicate).firstOrDefault(null, defaultValue) :\n      firstOrDefaultAsync(this, true, defaultValue);\n  };\n\n  function lastOrDefaultAsync(source, hasDefault, defaultValue) {\n    return new AnonymousObservable(function (o) {\n      var value = defaultValue, seenValue = false;\n      return source.subscribe(function (x) {\n        value = x;\n        seenValue = true;\n      }, function (e) { o.onError(e); }, function () {\n        if (!seenValue && !hasDefault) {\n          o.onError(new Error(sequenceContainsNoElements));\n        } else {\n          o.onNext(value);\n          o.onCompleted();\n        }\n      });\n    }, source);\n  }\n\n  /**\n   * Returns the last element of an observable sequence that satisfies the condition in the predicate if specified, else the last element.\n   * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate.\n   */\n  observableProto.last = function (predicate, thisArg) {\n    return predicate ?\n      this.where(predicate, thisArg).last() :\n      lastOrDefaultAsync(this, false);\n  };\n\n  /**\n   * Returns the last element of an observable sequence that satisfies the condition in the predicate, or a default value if no such element exists.\n   * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n   * @param [defaultValue] The default value if no such element exists.  If not specified, defaults to null.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate, or a default value if no such element exists.\n   */\n  observableProto.lastOrDefault = function (predicate, defaultValue, thisArg) {\n    return predicate ?\n      this.where(predicate, thisArg).lastOrDefault(null, defaultValue) :\n      lastOrDefaultAsync(this, true, defaultValue);\n  };\n\n  function findValue (source, predicate, thisArg, yieldIndex) {\n    var callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      var i = 0;\n      return source.subscribe(function (x) {\n        var shouldRun;\n        try {\n          shouldRun = callback(x, i, source);\n        } catch (e) {\n          o.onError(e);\n          return;\n        }\n        if (shouldRun) {\n          o.onNext(yieldIndex ? i : x);\n          o.onCompleted();\n        } else {\n          i++;\n        }\n      }, function (e) { o.onError(e); }, function () {\n        o.onNext(yieldIndex ? -1 : undefined);\n        o.onCompleted();\n      });\n    }, source);\n  }\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the first element that matches the conditions defined by the specified predicate, if found; otherwise, undefined.\n   */\n  observableProto.find = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, false);\n  };\n\n  /**\n   * Searches for an element that matches the conditions defined by the specified predicate, and returns\n   * an Observable sequence with the zero-based index of the first occurrence within the entire Observable sequence.\n   * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n   * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n   * @returns {Observable} An Observable sequence with the zero-based index of the first occurrence of an element that matches the conditions defined by match, if found; otherwise, –1.\n  */\n  observableProto.findIndex = function (predicate, thisArg) {\n    return findValue(this, predicate, thisArg, true);\n  };\n\n  /**\n   * Converts the observable sequence to a Set if it exists.\n   * @returns {Observable} An observable sequence with a single value of a Set containing the values from the observable sequence.\n   */\n  observableProto.toSet = function () {\n    if (typeof root.Set === 'undefined') { throw new TypeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var s = new root.Set();\n      return source.subscribe(\n        function (x) { s.add(x); },\n        function (e) { o.onError(e); },\n        function () {\n          o.onNext(s);\n          o.onCompleted();\n        });\n    }, source);\n  };\n\n  /**\n  * Converts the observable sequence to a Map if it exists.\n  * @param {Function} keySelector A function which produces the key for the Map.\n  * @param {Function} [elementSelector] An optional function which produces the element for the Map. If not present, defaults to the value from the observable sequence.\n  * @returns {Observable} An observable sequence with a single value of a Map containing the values from the observable sequence.\n  */\n  observableProto.toMap = function (keySelector, elementSelector) {\n    if (typeof root.Map === 'undefined') { throw new TypeError(); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var m = new root.Map();\n      return source.subscribe(\n        function (x) {\n          var key;\n          try {\n            key = keySelector(x);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n\n          var element = x;\n          if (elementSelector) {\n            try {\n              element = elementSelector(x);\n            } catch (e) {\n              o.onError(e);\n              return;\n            }\n          }\n\n          m.set(key, element);\n        },\n        function (e) { o.onError(e); },\n        function () {\n          o.onNext(m);\n          o.onCompleted();\n        });\n    }, source);\n  };\n\n  var fnString = 'function',\n      throwString = 'throw',\n      isObject = Rx.internals.isObject;\n\n  function toThunk(obj, ctx) {\n    if (Array.isArray(obj)) {  return objectToThunk.call(ctx, obj); }\n    if (isGeneratorFunction(obj)) { return observableSpawn(obj.call(ctx)); }\n    if (isGenerator(obj)) {  return observableSpawn(obj); }\n    if (isObservable(obj)) { return observableToThunk(obj); }\n    if (isPromise(obj)) { return promiseToThunk(obj); }\n    if (typeof obj === fnString) { return obj; }\n    if (isObject(obj) || Array.isArray(obj)) { return objectToThunk.call(ctx, obj); }\n\n    return obj;\n  }\n\n  function objectToThunk(obj) {\n    var ctx = this;\n\n    return function (done) {\n      var keys = Object.keys(obj),\n          pending = keys.length,\n          results = new obj.constructor(),\n          finished;\n\n      if (!pending) {\n        timeoutScheduler.schedule(function () { done(null, results); });\n        return;\n      }\n\n      for (var i = 0, len = keys.length; i < len; i++) {\n        run(obj[keys[i]], keys[i]);\n      }\n\n      function run(fn, key) {\n        if (finished) { return; }\n        try {\n          fn = toThunk(fn, ctx);\n\n          if (typeof fn !== fnString) {\n            results[key] = fn;\n            return --pending || done(null, results);\n          }\n\n          fn.call(ctx, function(err, res) {\n            if (finished) { return; }\n\n            if (err) {\n              finished = true;\n              return done(err);\n            }\n\n            results[key] = res;\n            --pending || done(null, results);\n          });\n        } catch (e) {\n          finished = true;\n          done(e);\n        }\n      }\n    }\n  }\n\n  function observableToThunk(observable) {\n    return function (fn) {\n      var value, hasValue = false;\n      observable.subscribe(\n        function (v) {\n          value = v;\n          hasValue = true;\n        },\n        fn,\n        function () {\n          hasValue && fn(null, value);\n        });\n    }\n  }\n\n  function promiseToThunk(promise) {\n    return function(fn) {\n      promise.then(function(res) {\n        fn(null, res);\n      }, fn);\n    }\n  }\n\n  function isObservable(obj) {\n    return obj && typeof obj.subscribe === fnString;\n  }\n\n  function isGeneratorFunction(obj) {\n    return obj && obj.constructor && obj.constructor.name === 'GeneratorFunction';\n  }\n\n  function isGenerator(obj) {\n    return obj && typeof obj.next === fnString && typeof obj[throwString] === fnString;\n  }\n\n  /*\n   * Spawns a generator function which allows for Promises, Observable sequences, Arrays, Objects, Generators and functions.\n   * @param {Function} The spawning function.\n   * @returns {Function} a function which has a done continuation.\n   */\n  var observableSpawn = Rx.spawn = function (fn) {\n    var isGenFun = isGeneratorFunction(fn);\n\n    return function (done) {\n      var ctx = this,\n        gen = fn;\n\n      if (isGenFun) {\n        for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n        var len = args.length,\n          hasCallback = len && typeof args[len - 1] === fnString;\n\n        done = hasCallback ? args.pop() : handleError;\n        gen = fn.apply(this, args);\n      } else {\n        done = done || handleError;\n      }\n\n      next();\n\n      function exit(err, res) {\n        timeoutScheduler.schedule(done.bind(ctx, err, res));\n      }\n\n      function next(err, res) {\n        var ret;\n\n        // multiple args\n        if (arguments.length > 2) {\n          for(var res = [], i = 1, len = arguments.length; i < len; i++) { res.push(arguments[i]); }\n        }\n\n        if (err) {\n          try {\n            ret = gen[throwString](err);\n          } catch (e) {\n            return exit(e);\n          }\n        }\n\n        if (!err) {\n          try {\n            ret = gen.next(res);\n          } catch (e) {\n            return exit(e);\n          }\n        }\n\n        if (ret.done)  {\n          return exit(null, ret.value);\n        }\n\n        ret.value = toThunk(ret.value, ctx);\n\n        if (typeof ret.value === fnString) {\n          var called = false;\n          try {\n            ret.value.call(ctx, function() {\n              if (called) {\n                return;\n              }\n\n              called = true;\n              next.apply(ctx, arguments);\n            });\n          } catch (e) {\n            timeoutScheduler.schedule(function () {\n              if (called) {\n                return;\n              }\n\n              called = true;\n              next.call(ctx, e);\n            });\n          }\n          return;\n        }\n\n        // Not supported\n        next(new TypeError('Rx.spawn only supports a function, Promise, Observable, Object or Array.'));\n      }\n    }\n  };\n\n  function handleError(err) {\n    if (!err) { return; }\n    timeoutScheduler.schedule(function() {\n      throw err;\n    });\n  }\n\n  /**\n   * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.\n   *\n   * @example\n   * var res = Rx.Observable.start(function () { console.log('hello'); });\n   * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout);\n   * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console);\n   *\n   * @param {Function} func Function to run asynchronously.\n   * @param {Scheduler} [scheduler]  Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param [context]  The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   *\n   * Remarks\n   * * The function is called immediately, not during the subscription of the resulting sequence.\n   * * Multiple subscriptions to the resulting sequence can observe the function's result.\n   */\n  Observable.start = function (func, context, scheduler) {\n    return observableToAsync(func, context, scheduler)();\n  };\n\n  /**\n   * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n   * @param {Function} function Function to convert to an asynchronous function.\n   * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Function} Asynchronous function.\n   */\n  var observableToAsync = Observable.toAsync = function (func, context, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return function () {\n      var args = arguments,\n        subject = new AsyncSubject();\n\n      scheduler.schedule(function () {\n        var result;\n        try {\n          result = func.apply(context, args);\n        } catch (e) {\n          subject.onError(e);\n          return;\n        }\n        subject.onNext(result);\n        subject.onCompleted();\n      });\n      return subject.asObservable();\n    };\n  };\n\n  /**\n   * Converts a callback function to an observable sequence.\n   *\n   * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n   * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n   */\n  Observable.fromCallback = function (func, context, selector) {\n    return function () {\n      for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n      return new AnonymousObservable(function (observer) {\n        function handler() {\n          var results = arguments;\n\n          if (selector) {\n            try {\n              results = selector(results);\n            } catch (err) {\n              return observer.onError(err);\n            }\n\n            observer.onNext(results);\n          } else {\n            if (results.length <= 1) {\n              observer.onNext.apply(observer, results);\n            } else {\n              observer.onNext(results);\n            }\n          }\n\n          observer.onCompleted();\n        }\n\n        args.push(handler);\n        func.apply(context, args);\n      }).publishLast().refCount();\n    };\n  };\n\n  /**\n   * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n   * @param {Function} func The function to call\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n   * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n   */\n  Observable.fromNodeCallback = function (func, context, selector) {\n    return function () {\n      for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n      return new AnonymousObservable(function (observer) {\n        function handler(err) {\n          if (err) {\n            observer.onError(err);\n            return;\n          }\n\n          for(var results = [], i = 1, len = arguments.length; i < len; i++) { results.push(arguments[i]); }\n\n          if (selector) {\n            try {\n              results = selector(results);\n            } catch (e) {\n              return observer.onError(e);\n            }\n            observer.onNext(results);\n          } else {\n            if (results.length <= 1) {\n              observer.onNext.apply(observer, results);\n            } else {\n              observer.onNext(results);\n            }\n          }\n\n          observer.onCompleted();\n        }\n\n        args.push(handler);\n        func.apply(context, args);\n      }).publishLast().refCount();\n    };\n  };\n\n  function createListener (element, name, handler) {\n    if (element.addEventListener) {\n      element.addEventListener(name, handler, false);\n      return disposableCreate(function () {\n        element.removeEventListener(name, handler, false);\n      });\n    }\n    throw new Error('No listener found');\n  }\n\n  function createEventListener (el, eventName, handler) {\n    var disposables = new CompositeDisposable();\n\n    // Asume NodeList\n    if (Object.prototype.toString.call(el) === '[object NodeList]') {\n      for (var i = 0, len = el.length; i < len; i++) {\n        disposables.add(createEventListener(el.item(i), eventName, handler));\n      }\n    } else if (el) {\n      disposables.add(createListener(el, eventName, handler));\n    }\n\n    return disposables;\n  }\n\n  /**\n   * Configuration option to determine whether to use native events only\n   */\n  Rx.config.useNativeEvents = false;\n\n  /**\n   * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n   *\n   * @example\n   *   var source = Rx.Observable.fromEvent(element, 'mouseup');\n   *\n   * @param {Object} element The DOMElement or NodeList to attach a listener.\n   * @param {String} eventName The event name to attach the observable sequence.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n   */\n  Observable.fromEvent = function (element, eventName, selector) {\n    // Node.js specific\n    if (element.addListener) {\n      return fromEventPattern(\n        function (h) { element.addListener(eventName, h); },\n        function (h) { element.removeListener(eventName, h); },\n        selector);\n    }\n\n    // Use only if non-native events are allowed\n    if (!Rx.config.useNativeEvents) {\n      // Handles jq, Angular.js, Zepto, Marionette\n      if (typeof element.on === 'function' && typeof element.off === 'function') {\n        return fromEventPattern(\n          function (h) { element.on(eventName, h); },\n          function (h) { element.off(eventName, h); },\n          selector);\n      }\n      if (!!root.Ember && typeof root.Ember.addListener === 'function') {\n        return fromEventPattern(\n          function (h) { Ember.addListener(element, eventName, h); },\n          function (h) { Ember.removeListener(element, eventName, h); },\n          selector);\n      }\n    }\n    return new AnonymousObservable(function (observer) {\n      return createEventListener(\n        element,\n        eventName,\n        function handler (e) {\n          var results = e;\n\n          if (selector) {\n            try {\n              results = selector(arguments);\n            } catch (err) {\n              observer.onError(err);\n              return\n            }\n          }\n\n          observer.onNext(results);\n        });\n    }).publish().refCount();\n  };\n\n  /**\n   * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n   * @param {Function} addHandler The function to add a handler to the emitter.\n   * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence which wraps an event from an event emitter\n   */\n  var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) {\n    return new AnonymousObservable(function (observer) {\n      function innerHandler (e) {\n        var result = e;\n        if (selector) {\n          try {\n            result = selector(arguments);\n          } catch (err) {\n            observer.onError(err);\n            return;\n          }\n        }\n        observer.onNext(result);\n      }\n\n      var returnValue = addHandler(innerHandler);\n      return disposableCreate(function () {\n        if (removeHandler) {\n          removeHandler(innerHandler, returnValue);\n        }\n      });\n    }).publish().refCount();\n  };\n\n  /**\n   * Invokes the asynchronous function, surfacing the result through an observable sequence.\n   * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   */\n  Observable.startAsync = function (functionAsync) {\n    var promise;\n    try {\n      promise = functionAsync();\n    } catch (e) {\n      return observableThrow(e);\n    }\n    return observableFromPromise(promise);\n  }\n\n  var PausableObservable = (function (__super__) {\n\n    inherits(PausableObservable, __super__);\n\n    function subscribe(observer) {\n      var conn = this.source.publish(),\n        subscription = conn.subscribe(observer),\n        connection = disposableEmpty;\n\n      var pausable = this.pauser.distinctUntilChanged().subscribe(function (b) {\n        if (b) {\n          connection = conn.connect();\n        } else {\n          connection.dispose();\n          connection = disposableEmpty;\n        }\n      });\n\n      return new CompositeDisposable(subscription, connection, pausable);\n    }\n\n    function PausableObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this, subscribe, source);\n    }\n\n    PausableObservable.prototype.pause = function () {\n      this.controller.onNext(false);\n    };\n\n    PausableObservable.prototype.resume = function () {\n      this.controller.onNext(true);\n    };\n\n    return PausableObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausable(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausable = function (pauser) {\n    return new PausableObservable(this, pauser);\n  };\n\n  function combineLatestSource(source, subject, resultSelector) {\n    return new AnonymousObservable(function (o) {\n      var hasValue = [false, false],\n        hasValueAll = false,\n        isDone = false,\n        values = new Array(2),\n        err;\n\n      function next(x, i) {\n        values[i] = x\n        var res;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          if (err) {\n            o.onError(err);\n            return;\n          }\n\n          try {\n            res = resultSelector.apply(null, values);\n          } catch (ex) {\n            o.onError(ex);\n            return;\n          }\n          o.onNext(res);\n        }\n        if (isDone && values[1]) {\n          o.onCompleted();\n        }\n      }\n\n      return new CompositeDisposable(\n        source.subscribe(\n          function (x) {\n            next(x, 0);\n          },\n          function (e) {\n            if (values[1]) {\n              o.onError(e);\n            } else {\n              err = e;\n            }\n          },\n          function () {\n            isDone = true;\n            values[1] && o.onCompleted();\n          }),\n        subject.subscribe(\n          function (x) {\n            next(x, 1);\n          },\n          function (e) { o.onError(e); },\n          function () {\n            isDone = true;\n            next(true, 1);\n          })\n        );\n    }, source);\n  }\n\n  var PausableBufferedObservable = (function (__super__) {\n\n    inherits(PausableBufferedObservable, __super__);\n\n    function subscribe(o) {\n      var q = [], previousShouldFire;\n\n      var subscription =\n        combineLatestSource(\n          this.source,\n          this.pauser.distinctUntilChanged().startWith(false),\n          function (data, shouldFire) {\n            return { data: data, shouldFire: shouldFire };\n          })\n          .subscribe(\n            function (results) {\n              if (previousShouldFire !== undefined && results.shouldFire != previousShouldFire) {\n                previousShouldFire = results.shouldFire;\n                // change in shouldFire\n                if (results.shouldFire) {\n                  while (q.length > 0) {\n                    o.onNext(q.shift());\n                  }\n                }\n              } else {\n                previousShouldFire = results.shouldFire;\n                // new data\n                if (results.shouldFire) {\n                  o.onNext(results.data);\n                } else {\n                  q.push(results.data);\n                }\n              }\n            },\n            function (err) {\n              // Empty buffer before sending error\n              while (q.length > 0) {\n                o.onNext(q.shift());\n              }\n              o.onError(err);\n            },\n            function () {\n              // Empty buffer before sending completion\n              while (q.length > 0) {\n                o.onNext(q.shift());\n              }\n              o.onCompleted();\n            }\n          );\n      return subscription;\n    }\n\n    function PausableBufferedObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this, subscribe, source);\n    }\n\n    PausableBufferedObservable.prototype.pause = function () {\n      this.controller.onNext(false);\n    };\n\n    PausableBufferedObservable.prototype.resume = function () {\n      this.controller.onNext(true);\n    };\n\n    return PausableBufferedObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n   * and yields the values that were buffered while paused.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausableBuffered = function (subject) {\n    return new PausableBufferedObservable(this, subject);\n  };\n\n  var ControlledObservable = (function (__super__) {\n\n    inherits(ControlledObservable, __super__);\n\n    function subscribe (observer) {\n      return this.source.subscribe(observer);\n    }\n\n    function ControlledObservable (source, enableQueue) {\n      __super__.call(this, subscribe, source);\n      this.subject = new ControlledSubject(enableQueue);\n      this.source = source.multicast(this.subject).refCount();\n    }\n\n    ControlledObservable.prototype.request = function (numberOfItems) {\n      if (numberOfItems == null) { numberOfItems = -1; }\n      return this.subject.request(numberOfItems);\n    };\n\n    return ControlledObservable;\n\n  }(Observable));\n\n  var ControlledSubject = (function (__super__) {\n\n    function subscribe (observer) {\n      return this.subject.subscribe(observer);\n    }\n\n    inherits(ControlledSubject, __super__);\n\n    function ControlledSubject(enableQueue) {\n      enableQueue == null && (enableQueue = true);\n\n      __super__.call(this, subscribe);\n      this.subject = new Subject();\n      this.enableQueue = enableQueue;\n      this.queue = enableQueue ? [] : null;\n      this.requestedCount = 0;\n      this.requestedDisposable = disposableEmpty;\n      this.error = null;\n      this.hasFailed = false;\n      this.hasCompleted = false;\n      this.controlledDisposable = disposableEmpty;\n    }\n\n    addProperties(ControlledSubject.prototype, Observer, {\n      onCompleted: function () {\n        this.hasCompleted = true;\n        (!this.enableQueue || this.queue.length === 0) && this.subject.onCompleted();\n      },\n      onError: function (error) {\n        this.hasFailed = true;\n        this.error = error;\n        (!this.enableQueue || this.queue.length === 0) && this.subject.onError(error);\n      },\n      onNext: function (value) {\n        var hasRequested = false;\n\n        if (this.requestedCount === 0) {\n          this.enableQueue && this.queue.push(value);\n        } else {\n          (this.requestedCount !== -1 && this.requestedCount-- === 0) && this.disposeCurrentRequest();\n          hasRequested = true;\n        }\n        hasRequested && this.subject.onNext(value);\n      },\n      _processRequest: function (numberOfItems) {\n        if (this.enableQueue) {\n          while (this.queue.length >= numberOfItems && numberOfItems > 0) {\n            this.subject.onNext(this.queue.shift());\n            numberOfItems--;\n          }\n\n          return this.queue.length !== 0 ?\n            { numberOfItems: numberOfItems, returnValue: true } :\n            { numberOfItems: numberOfItems, returnValue: false };\n        }\n\n        if (this.hasFailed) {\n          this.subject.onError(this.error);\n          this.controlledDisposable.dispose();\n          this.controlledDisposable = disposableEmpty;\n        } else if (this.hasCompleted) {\n          this.subject.onCompleted();\n          this.controlledDisposable.dispose();\n          this.controlledDisposable = disposableEmpty;\n        }\n\n        return { numberOfItems: numberOfItems, returnValue: false };\n      },\n      request: function (number) {\n        this.disposeCurrentRequest();\n        var self = this, r = this._processRequest(number);\n\n        var number = r.numberOfItems;\n        if (!r.returnValue) {\n          this.requestedCount = number;\n          this.requestedDisposable = disposableCreate(function () {\n            self.requestedCount = 0;\n          });\n\n          return this.requestedDisposable\n        } else {\n          return disposableEmpty;\n        }\n      },\n      disposeCurrentRequest: function () {\n        this.requestedDisposable.dispose();\n        this.requestedDisposable = disposableEmpty;\n      }\n    });\n\n    return ControlledSubject;\n  }(Observable));\n\n  /**\n   * Attaches a controller to the observable sequence with the ability to queue.\n   * @example\n   * var source = Rx.Observable.interval(100).controlled();\n   * source.request(3); // Reads 3 values\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.controlled = function (enableQueue) {\n    if (enableQueue == null) {  enableQueue = true; }\n    return new ControlledObservable(this, enableQueue);\n  };\n\n  var StopAndWaitObservable = (function (__super__) {\n\n    function subscribe (observer) {\n      this.subscription = this.source.subscribe(new StopAndWaitObserver(observer, this, this.subscription));\n\n      var self = this;\n      timeoutScheduler.schedule(function () { self.source.request(1); });\n\n      return this.subscription;\n    }\n\n    inherits(StopAndWaitObservable, __super__);\n\n    function StopAndWaitObservable (source) {\n      __super__.call(this, subscribe, source);\n      this.source = source;\n    }\n\n    var StopAndWaitObserver = (function (__sub__) {\n\n      inherits(StopAndWaitObserver, __sub__);\n\n      function StopAndWaitObserver (observer, observable, cancel) {\n        __sub__.call(this);\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n      }\n\n      var stopAndWaitObserverProto = StopAndWaitObserver.prototype;\n\n      stopAndWaitObserverProto.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      stopAndWaitObserverProto.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      }\n\n      stopAndWaitObserverProto.next = function (value) {\n        this.observer.onNext(value);\n\n        var self = this;\n        timeoutScheduler.schedule(function () {\n          self.observable.source.request(1);\n        });\n      };\n\n      stopAndWaitObserverProto.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return StopAndWaitObserver;\n    }(AbstractObserver));\n\n    return StopAndWaitObservable;\n  }(Observable));\n\n\n  /**\n   * Attaches a stop and wait observable to the current observable.\n   * @returns {Observable} A stop and wait observable.\n   */\n  ControlledObservable.prototype.stopAndWait = function () {\n    return new StopAndWaitObservable(this);\n  };\n\n  var WindowedObservable = (function (__super__) {\n\n    function subscribe (observer) {\n      this.subscription = this.source.subscribe(new WindowedObserver(observer, this, this.subscription));\n\n      var self = this;\n      timeoutScheduler.schedule(function () {\n        self.source.request(self.windowSize);\n      });\n\n      return this.subscription;\n    }\n\n    inherits(WindowedObservable, __super__);\n\n    function WindowedObservable(source, windowSize) {\n      __super__.call(this, subscribe, source);\n      this.source = source;\n      this.windowSize = windowSize;\n    }\n\n    var WindowedObserver = (function (__sub__) {\n\n      inherits(WindowedObserver, __sub__);\n\n      function WindowedObserver(observer, observable, cancel) {\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n        this.received = 0;\n      }\n\n      var windowedObserverPrototype = WindowedObserver.prototype;\n\n      windowedObserverPrototype.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      windowedObserverPrototype.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      };\n\n      windowedObserverPrototype.next = function (value) {\n        this.observer.onNext(value);\n\n        this.received = ++this.received % this.observable.windowSize;\n        if (this.received === 0) {\n          var self = this;\n          timeoutScheduler.schedule(function () {\n            self.observable.source.request(self.observable.windowSize);\n          });\n        }\n      };\n\n      windowedObserverPrototype.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return WindowedObserver;\n    }(AbstractObserver));\n\n    return WindowedObservable;\n  }(Observable));\n\n  /**\n   * Creates a sliding windowed observable based upon the window size.\n   * @param {Number} windowSize The number of items in the window\n   * @returns {Observable} A windowed observable based upon the window size.\n   */\n  ControlledObservable.prototype.windowed = function (windowSize) {\n    return new WindowedObservable(this, windowSize);\n  };\n\n  /**\n   * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n   * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n   * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n   *\n   * @example\n   * 1 - res = source.multicast(observable);\n   * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n   *\n   * @param {Function|Subject} subjectOrSubjectSelector\n   * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n   * Or:\n   * Subject to push source elements into.\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.multicast = function (subjectOrSubjectSelector, selector) {\n    var source = this;\n    return typeof subjectOrSubjectSelector === 'function' ?\n      new AnonymousObservable(function (observer) {\n        var connectable = source.multicast(subjectOrSubjectSelector());\n        return new CompositeDisposable(selector(connectable).subscribe(observer), connectable.connect());\n      }, source) :\n      new ConnectableObservable(source, subjectOrSubjectSelector);\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of Multicast using a regular Subject.\n   *\n   * @example\n   * var resres = source.publish();\n   * var res = source.publish(function (x) { return x; });\n   *\n   * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publish = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new Subject(); }, selector) :\n      this.multicast(new Subject());\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.share = function () {\n    return this.publish().refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n   * This operator is a specialization of Multicast using a AsyncSubject.\n   *\n   * @example\n   * var res = source.publishLast();\n   * var res = source.publishLast(function (x) { return x; });\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishLast = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new AsyncSubject(); }, selector) :\n      this.multicast(new AsyncSubject());\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n   * This operator is a specialization of Multicast using a BehaviorSubject.\n   *\n   * @example\n   * var res = source.publishValue(42);\n   * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishValue = function (initialValueOrSelector, initialValue) {\n    return arguments.length === 2 ?\n      this.multicast(function () {\n        return new BehaviorSubject(initialValue);\n      }, initialValueOrSelector) :\n      this.multicast(new BehaviorSubject(initialValueOrSelector));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n   * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareValue = function (initialValue) {\n    return this.publishValue(initialValue).refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of Multicast using a ReplaySubject.\n   *\n   * @example\n   * var res = source.replay(null, 3);\n   * var res = source.replay(null, 3, 500);\n   * var res = source.replay(null, 3, 500, scheduler);\n   * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.replay = function (selector, bufferSize, window, scheduler) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new ReplaySubject(bufferSize, window, scheduler); }, selector) :\n      this.multicast(new ReplaySubject(bufferSize, window, scheduler));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   *\n   * @example\n   * var res = source.shareReplay(3);\n   * var res = source.shareReplay(3, 500);\n   * var res = source.shareReplay(3, 500, scheduler);\n   *\n\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareReplay = function (bufferSize, window, scheduler) {\n    return this.replay(null, bufferSize, window, scheduler).refCount();\n  };\n\n  var InnerSubscription = function (subject, observer) {\n    this.subject = subject;\n    this.observer = observer;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this.subject.isDisposed && this.observer !== null) {\n      var idx = this.subject.observers.indexOf(this.observer);\n      this.subject.observers.splice(idx, 1);\n      this.observer = null;\n    }\n  };\n\n  /**\n   *  Represents a value that changes over time.\n   *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n   */\n  var BehaviorSubject = Rx.BehaviorSubject = (function (__super__) {\n    function subscribe(observer) {\n      checkDisposed(this);\n      if (!this.isStopped) {\n        this.observers.push(observer);\n        observer.onNext(this.value);\n        return new InnerSubscription(this, observer);\n      }\n      if (this.hasError) {\n        observer.onError(this.error);\n      } else {\n        observer.onCompleted();\n      }\n      return disposableEmpty;\n    }\n\n    inherits(BehaviorSubject, __super__);\n\n    /**\n     *  Initializes a new instance of the BehaviorSubject class which creates a subject that caches its last value and starts with the specified value.\n     *  @param {Mixed} value Initial value sent to observers when no other value has been received by the subject yet.\n     */\n    function BehaviorSubject(value) {\n      __super__.call(this, subscribe);\n      this.value = value,\n      this.observers = [],\n      this.isDisposed = false,\n      this.isStopped = false,\n      this.hasError = false;\n    }\n\n    addProperties(BehaviorSubject.prototype, Observer, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onCompleted();\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.hasError = true;\n        this.error = error;\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onError(error);\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onNext(value);\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.value = null;\n        this.exception = null;\n      }\n    });\n\n    return BehaviorSubject;\n  }(Observable));\n\n  /**\n   * Represents an object that is both an observable sequence as well as an observer.\n   * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n   */\n  var ReplaySubject = Rx.ReplaySubject = (function (__super__) {\n\n    function createRemovableDisposable(subject, observer) {\n      return disposableCreate(function () {\n        observer.dispose();\n        !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n      });\n    }\n\n    function subscribe(observer) {\n      var so = new ScheduledObserver(this.scheduler, observer),\n        subscription = createRemovableDisposable(this, so);\n      checkDisposed(this);\n      this._trim(this.scheduler.now());\n      this.observers.push(so);\n\n      for (var i = 0, len = this.q.length; i < len; i++) {\n        so.onNext(this.q[i].value);\n      }\n\n      if (this.hasError) {\n        so.onError(this.error);\n      } else if (this.isStopped) {\n        so.onCompleted();\n      }\n\n      so.ensureActive();\n      return subscription;\n    }\n\n    inherits(ReplaySubject, __super__);\n\n    /**\n     *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n     *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n     *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n     *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n     */\n    function ReplaySubject(bufferSize, windowSize, scheduler) {\n      this.bufferSize = bufferSize == null ? Number.MAX_VALUE : bufferSize;\n      this.windowSize = windowSize == null ? Number.MAX_VALUE : windowSize;\n      this.scheduler = scheduler || currentThreadScheduler;\n      this.q = [];\n      this.observers = [];\n      this.isStopped = false;\n      this.isDisposed = false;\n      this.hasError = false;\n      this.error = null;\n      __super__.call(this, subscribe);\n    }\n\n    addProperties(ReplaySubject.prototype, Observer.prototype, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () {\n        return this.observers.length > 0;\n      },\n      _trim: function (now) {\n        while (this.q.length > this.bufferSize) {\n          this.q.shift();\n        }\n        while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {\n          this.q.shift();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        var now = this.scheduler.now();\n        this.q.push({ interval: now, value: value });\n        this._trim(now);\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onNext(value);\n          observer.ensureActive();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.error = error;\n        this.hasError = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onError(error);\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onCompleted();\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    return ReplaySubject;\n  }(Observable));\n\n  var ConnectableObservable = Rx.ConnectableObservable = (function (__super__) {\n    inherits(ConnectableObservable, __super__);\n\n    function ConnectableObservable(source, subject) {\n      var hasSubscription = false,\n        subscription,\n        sourceObservable = source.asObservable();\n\n      this.connect = function () {\n        if (!hasSubscription) {\n          hasSubscription = true;\n          subscription = new CompositeDisposable(sourceObservable.subscribe(subject), disposableCreate(function () {\n            hasSubscription = false;\n          }));\n        }\n        return subscription;\n      };\n\n      __super__.call(this, function (o) { return subject.subscribe(o); });\n    }\n\n    ConnectableObservable.prototype.refCount = function () {\n      var connectableSubscription, count = 0, source = this;\n      return new AnonymousObservable(function (observer) {\n          var shouldConnect = ++count === 1,\n            subscription = source.subscribe(observer);\n          shouldConnect && (connectableSubscription = source.connect());\n          return function () {\n            subscription.dispose();\n            --count === 0 && connectableSubscription.dispose();\n          };\n      });\n    };\n\n    return ConnectableObservable;\n  }(Observable));\n\n  var Dictionary = (function () {\n\n    var primes = [1, 3, 7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, 65521, 131071, 262139, 524287, 1048573, 2097143, 4194301, 8388593, 16777213, 33554393, 67108859, 134217689, 268435399, 536870909, 1073741789, 2147483647],\n      noSuchkey = \"no such key\",\n      duplicatekey = \"duplicate key\";\n\n    function isPrime(candidate) {\n      if ((candidate & 1) === 0) { return candidate === 2; }\n      var num1 = Math.sqrt(candidate),\n        num2 = 3;\n      while (num2 <= num1) {\n        if (candidate % num2 === 0) { return false; }\n        num2 += 2;\n      }\n      return true;\n    }\n\n    function getPrime(min) {\n      var index, num, candidate;\n      for (index = 0; index < primes.length; ++index) {\n        num = primes[index];\n        if (num >= min) { return num; }\n      }\n      candidate = min | 1;\n      while (candidate < primes[primes.length - 1]) {\n        if (isPrime(candidate)) { return candidate; }\n        candidate += 2;\n      }\n      return min;\n    }\n\n    function stringHashFn(str) {\n      var hash = 757602046;\n      if (!str.length) { return hash; }\n      for (var i = 0, len = str.length; i < len; i++) {\n        var character = str.charCodeAt(i);\n        hash = ((hash << 5) - hash) + character;\n        hash = hash & hash;\n      }\n      return hash;\n    }\n\n    function numberHashFn(key) {\n      var c2 = 0x27d4eb2d;\n      key = (key ^ 61) ^ (key >>> 16);\n      key = key + (key << 3);\n      key = key ^ (key >>> 4);\n      key = key * c2;\n      key = key ^ (key >>> 15);\n      return key;\n    }\n\n    var getHashCode = (function () {\n      var uniqueIdCounter = 0;\n\n      return function (obj) {\n        if (obj == null) { throw new Error(noSuchkey); }\n\n        // Check for built-ins before tacking on our own for any object\n        if (typeof obj === 'string') { return stringHashFn(obj); }\n        if (typeof obj === 'number') { return numberHashFn(obj); }\n        if (typeof obj === 'boolean') { return obj === true ? 1 : 0; }\n        if (obj instanceof Date) { return numberHashFn(obj.valueOf()); }\n        if (obj instanceof RegExp) { return stringHashFn(obj.toString()); }\n        if (typeof obj.valueOf === 'function') {\n          // Hack check for valueOf\n          var valueOf = obj.valueOf();\n          if (typeof valueOf === 'number') { return numberHashFn(valueOf); }\n          if (typeof valueOf === 'string') { return stringHashFn(valueOf); }\n        }\n        if (obj.hashCode) { return obj.hashCode(); }\n\n        var id = 17 * uniqueIdCounter++;\n        obj.hashCode = function () { return id; };\n        return id;\n      };\n    }());\n\n    function newEntry() {\n      return { key: null, value: null, next: 0, hashCode: 0 };\n    }\n\n    function Dictionary(capacity, comparer) {\n      if (capacity < 0) { throw new Error('out of range'); }\n      if (capacity > 0) { this._initialize(capacity); }\n\n      this.comparer = comparer || defaultComparer;\n      this.freeCount = 0;\n      this.size = 0;\n      this.freeList = -1;\n    }\n\n    var dictionaryProto = Dictionary.prototype;\n\n    dictionaryProto._initialize = function (capacity) {\n      var prime = getPrime(capacity), i;\n      this.buckets = new Array(prime);\n      this.entries = new Array(prime);\n      for (i = 0; i < prime; i++) {\n        this.buckets[i] = -1;\n        this.entries[i] = newEntry();\n      }\n      this.freeList = -1;\n    };\n\n    dictionaryProto.add = function (key, value) {\n      this._insert(key, value, true);\n    };\n\n    dictionaryProto._insert = function (key, value, add) {\n      if (!this.buckets) { this._initialize(0); }\n      var index3,\n        num = getHashCode(key) & 2147483647,\n        index1 = num % this.buckets.length;\n      for (var index2 = this.buckets[index1]; index2 >= 0; index2 = this.entries[index2].next) {\n        if (this.entries[index2].hashCode === num && this.comparer(this.entries[index2].key, key)) {\n          if (add) { throw new Error(duplicatekey); }\n          this.entries[index2].value = value;\n          return;\n        }\n      }\n      if (this.freeCount > 0) {\n        index3 = this.freeList;\n        this.freeList = this.entries[index3].next;\n        --this.freeCount;\n      } else {\n        if (this.size === this.entries.length) {\n          this._resize();\n          index1 = num % this.buckets.length;\n        }\n        index3 = this.size;\n        ++this.size;\n      }\n      this.entries[index3].hashCode = num;\n      this.entries[index3].next = this.buckets[index1];\n      this.entries[index3].key = key;\n      this.entries[index3].value = value;\n      this.buckets[index1] = index3;\n    };\n\n    dictionaryProto._resize = function () {\n      var prime = getPrime(this.size * 2),\n        numArray = new Array(prime);\n      for (index = 0; index < numArray.length; ++index) {  numArray[index] = -1; }\n      var entryArray = new Array(prime);\n      for (index = 0; index < this.size; ++index) { entryArray[index] = this.entries[index]; }\n      for (var index = this.size; index < prime; ++index) { entryArray[index] = newEntry(); }\n      for (var index1 = 0; index1 < this.size; ++index1) {\n        var index2 = entryArray[index1].hashCode % prime;\n        entryArray[index1].next = numArray[index2];\n        numArray[index2] = index1;\n      }\n      this.buckets = numArray;\n      this.entries = entryArray;\n    };\n\n    dictionaryProto.remove = function (key) {\n      if (this.buckets) {\n        var num = getHashCode(key) & 2147483647,\n          index1 = num % this.buckets.length,\n          index2 = -1;\n        for (var index3 = this.buckets[index1]; index3 >= 0; index3 = this.entries[index3].next) {\n          if (this.entries[index3].hashCode === num && this.comparer(this.entries[index3].key, key)) {\n            if (index2 < 0) {\n              this.buckets[index1] = this.entries[index3].next;\n            } else {\n              this.entries[index2].next = this.entries[index3].next;\n            }\n            this.entries[index3].hashCode = -1;\n            this.entries[index3].next = this.freeList;\n            this.entries[index3].key = null;\n            this.entries[index3].value = null;\n            this.freeList = index3;\n            ++this.freeCount;\n            return true;\n          } else {\n            index2 = index3;\n          }\n        }\n      }\n      return false;\n    };\n\n    dictionaryProto.clear = function () {\n      var index, len;\n      if (this.size <= 0) { return; }\n      for (index = 0, len = this.buckets.length; index < len; ++index) {\n        this.buckets[index] = -1;\n      }\n      for (index = 0; index < this.size; ++index) {\n        this.entries[index] = newEntry();\n      }\n      this.freeList = -1;\n      this.size = 0;\n    };\n\n    dictionaryProto._findEntry = function (key) {\n      if (this.buckets) {\n        var num = getHashCode(key) & 2147483647;\n        for (var index = this.buckets[num % this.buckets.length]; index >= 0; index = this.entries[index].next) {\n          if (this.entries[index].hashCode === num && this.comparer(this.entries[index].key, key)) {\n            return index;\n          }\n        }\n      }\n      return -1;\n    };\n\n    dictionaryProto.count = function () {\n      return this.size - this.freeCount;\n    };\n\n    dictionaryProto.tryGetValue = function (key) {\n      var entry = this._findEntry(key);\n      return entry >= 0 ?\n        this.entries[entry].value :\n        undefined;\n    };\n\n    dictionaryProto.getValues = function () {\n      var index = 0, results = [];\n      if (this.entries) {\n        for (var index1 = 0; index1 < this.size; index1++) {\n          if (this.entries[index1].hashCode >= 0) {\n            results[index++] = this.entries[index1].value;\n          }\n        }\n      }\n      return results;\n    };\n\n    dictionaryProto.get = function (key) {\n      var entry = this._findEntry(key);\n      if (entry >= 0) { return this.entries[entry].value; }\n      throw new Error(noSuchkey);\n    };\n\n    dictionaryProto.set = function (key, value) {\n      this._insert(key, value, false);\n    };\n\n    dictionaryProto.containskey = function (key) {\n      return this._findEntry(key) >= 0;\n    };\n\n    return Dictionary;\n  }());\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters passed to the function correspond with the elements from the left and right source sequences for which overlap occurs.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.join = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (observer) {\n      var group = new CompositeDisposable();\n      var leftDone = false, rightDone = false;\n      var leftId = 0, rightId = 0;\n      var leftMap = new Dictionary(), rightMap = new Dictionary();\n\n      group.add(left.subscribe(\n        function (value) {\n          var id = leftId++;\n          var md = new SingleAssignmentDisposable();\n\n          leftMap.add(id, value);\n          group.add(md);\n\n          var expire = function () {\n            leftMap.remove(id) && leftMap.count() === 0 && leftDone && observer.onCompleted();\n            group.remove(md);\n          };\n\n          var duration;\n          try {\n            duration = leftDurationSelector(value);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n\n          md.setDisposable(duration.take(1).subscribe(noop, observer.onError.bind(observer), expire));\n\n          rightMap.getValues().forEach(function (v) {\n            var result;\n            try {\n              result = resultSelector(value, v);\n            } catch (exn) {\n              observer.onError(exn);\n              return;\n            }\n\n            observer.onNext(result);\n          });\n        },\n        observer.onError.bind(observer),\n        function () {\n          leftDone = true;\n          (rightDone || leftMap.count() === 0) && observer.onCompleted();\n        })\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++;\n          var md = new SingleAssignmentDisposable();\n\n          rightMap.add(id, value);\n          group.add(md);\n\n          var expire = function () {\n            rightMap.remove(id) && rightMap.count() === 0 && rightDone && observer.onCompleted();\n            group.remove(md);\n          };\n\n          var duration;\n          try {\n            duration = rightDurationSelector(value);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n\n          md.setDisposable(duration.take(1).subscribe(noop, observer.onError.bind(observer), expire));\n\n          leftMap.getValues().forEach(function (v) {\n            var result;\n            try {\n              result = resultSelector(v, value);\n            } catch (exn) {\n              observer.onError(exn);\n              return;\n            }\n\n            observer.onNext(result);\n          });\n        },\n        observer.onError.bind(observer),\n        function () {\n          rightDone = true;\n          (leftDone || rightMap.count() === 0) && observer.onCompleted();\n        })\n      );\n      return group;\n    }, left);\n  };\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations, and groups the results.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. The first parameter passed to the function is an element of the left sequence. The second parameter passed to the function is an observable sequence with elements from the right sequence that overlap with the left sequence's element.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.groupJoin = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (observer) {\n      var group = new CompositeDisposable();\n      var r = new RefCountDisposable(group);\n      var leftMap = new Dictionary(), rightMap = new Dictionary();\n      var leftId = 0, rightId = 0;\n\n      function handleError(e) { return function (v) { v.onError(e); }; };\n\n      group.add(left.subscribe(\n        function (value) {\n          var s = new Subject();\n          var id = leftId++;\n          leftMap.add(id, s);\n\n          var result;\n          try {\n            result = resultSelector(value, addRef(s, r));\n          } catch (e) {\n            leftMap.getValues().forEach(handleError(e));\n            observer.onError(e);\n            return;\n          }\n          observer.onNext(result);\n\n          rightMap.getValues().forEach(function (v) { s.onNext(v); });\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var expire = function () {\n            leftMap.remove(id) && s.onCompleted();\n            group.remove(md);\n          };\n\n          var duration;\n          try {\n            duration = leftDurationSelector(value);\n          } catch (e) {\n            leftMap.getValues().forEach(handleError(e));\n            observer.onError(e);\n            return;\n          }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.getValues().forEach(handleError(e));\n              observer.onError(e);\n            },\n            expire)\n          );\n        },\n        function (e) {\n          leftMap.getValues().forEach(handleError(e));\n          observer.onError(e);\n        },\n        observer.onCompleted.bind(observer))\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++;\n          rightMap.add(id, value);\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var expire = function () {\n            rightMap.remove(id);\n            group.remove(md);\n          };\n\n          var duration;\n          try {\n            duration = rightDurationSelector(value);\n          } catch (e) {\n            leftMap.getValues().forEach(handleError(e));\n            observer.onError(e);\n            return;\n          }\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.getValues().forEach(handleError(e));\n              observer.onError(e);\n            },\n            expire)\n          );\n\n          leftMap.getValues().forEach(function (v) { v.onNext(value); });\n        },\n        function (e) {\n          leftMap.getValues().forEach(handleError(e));\n          observer.onError(e);\n        })\n      );\n\n      return r;\n    }, left);\n  };\n\n    /**\n     *  Projects each element of an observable sequence into zero or more buffers.\n     *\n     *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n     *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n     *  @returns {Observable} An observable sequence of windows.\n     */\n    observableProto.buffer = function (bufferOpeningsOrClosingSelector, bufferClosingSelector) {\n        return this.window.apply(this, arguments).selectMany(function (x) { return x.toArray(); });\n    };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows.\n   *\n   *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n   *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n   *  @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.window = function (windowOpeningsOrClosingSelector, windowClosingSelector) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'function') {\n      return observableWindowWithBoundaries.call(this, windowOpeningsOrClosingSelector);\n    }\n    return typeof windowOpeningsOrClosingSelector === 'function' ?\n      observableWindowWithClosingSelector.call(this, windowOpeningsOrClosingSelector) :\n      observableWindowWithOpenings.call(this, windowOpeningsOrClosingSelector, windowClosingSelector);\n  };\n\n  function observableWindowWithOpenings(windowOpenings, windowClosingSelector) {\n    return windowOpenings.groupJoin(this, windowClosingSelector, observableEmpty, function (_, win) {\n      return win;\n    });\n  }\n\n  function observableWindowWithBoundaries(windowBoundaries) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var win = new Subject(),\n        d = new CompositeDisposable(),\n        r = new RefCountDisposable(d);\n\n      observer.onNext(addRef(win, r));\n\n      d.add(source.subscribe(function (x) {\n        win.onNext(x);\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      isPromise(windowBoundaries) && (windowBoundaries = observableFromPromise(windowBoundaries));\n\n      d.add(windowBoundaries.subscribe(function (w) {\n        win.onCompleted();\n        win = new Subject();\n        observer.onNext(addRef(win, r));\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      return r;\n    }, source);\n  }\n\n  function observableWindowWithClosingSelector(windowClosingSelector) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        r = new RefCountDisposable(d),\n        win = new Subject();\n      observer.onNext(addRef(win, r));\n      d.add(source.subscribe(function (x) {\n          win.onNext(x);\n      }, function (err) {\n          win.onError(err);\n          observer.onError(err);\n      }, function () {\n          win.onCompleted();\n          observer.onCompleted();\n      }));\n\n      function createWindowClose () {\n        var windowClose;\n        try {\n          windowClose = windowClosingSelector();\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n\n        isPromise(windowClose) && (windowClose = observableFromPromise(windowClose));\n\n        var m1 = new SingleAssignmentDisposable();\n        m.setDisposable(m1);\n        m1.setDisposable(windowClose.take(1).subscribe(noop, function (err) {\n          win.onError(err);\n          observer.onError(err);\n        }, function () {\n          win.onCompleted();\n          win = new Subject();\n          observer.onNext(addRef(win, r));\n          createWindowClose();\n        }));\n      }\n\n      createWindowClose();\n      return r;\n    }, source);\n  }\n\n  /**\n   * Returns a new observable that triggers on the second and subsequent triggerings of the input observable.\n   * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair.\n   * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs.\n   * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array.\n   */\n  observableProto.pairwise = function () {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var previous, hasPrevious = false;\n      return source.subscribe(\n        function (x) {\n          if (hasPrevious) {\n            observer.onNext([previous, x]);\n          } else {\n            hasPrevious = true;\n          }\n          previous = x;\n        },\n        observer.onError.bind(observer),\n        observer.onCompleted.bind(observer));\n    }, source);\n  };\n\n  /**\n   * Returns two observables which partition the observations of the source by the given function.\n   * The first will trigger observations for those values for which the predicate returns true.\n   * The second will trigger observations for those values where the predicate returns false.\n   * The predicate is executed once for each subscribed observer.\n   * Both also propagate all error observations arising from the source and each completes\n   * when the source completes.\n   * @param {Function} predicate\n   *    The function to determine which output Observable will trigger a particular observation.\n   * @returns {Array}\n   *    An array of observables. The first triggers when the predicate returns true,\n   *    and the second triggers when the predicate returns false.\n  */\n  observableProto.partition = function(predicate, thisArg) {\n    return [\n      this.filter(predicate, thisArg),\n      this.filter(function (x, i, o) { return !predicate.call(thisArg, x, i, o); })\n    ];\n  };\n\n  function enumerableWhile(condition, source) {\n    return new Enumerable(function () {\n      return new Enumerator(function () {\n        return condition() ?\n          { done: false, value: source } :\n          { done: true, value: undefined };\n      });\n    });\n  }\n\n   /**\n   *  Returns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions.\n   *  This operator allows for a fluent style of writing queries that use the same sequence multiple times.\n   *\n   * @param {Function} selector Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.letBind = observableProto['let'] = function (func) {\n    return func(this);\n  };\n\n   /**\n   *  Determines whether an observable collection contains values. There is an alias for this method called 'ifThen' for browsers <IE9\n   *\n   * @example\n   *  1 - res = Rx.Observable.if(condition, obs1);\n   *  2 - res = Rx.Observable.if(condition, obs1, obs2);\n   *  3 - res = Rx.Observable.if(condition, obs1, scheduler);\n   * @param {Function} condition The condition which determines if the thenSource or elseSource will be run.\n   * @param {Observable} thenSource The observable sequence or Promise that will be run if the condition function returns true.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the condition function returns false. If this is not provided, it defaults to Rx.Observabe.Empty with the specified scheduler.\n   * @returns {Observable} An observable sequence which is either the thenSource or elseSource.\n   */\n  Observable['if'] = Observable.ifThen = function (condition, thenSource, elseSourceOrScheduler) {\n    return observableDefer(function () {\n      elseSourceOrScheduler || (elseSourceOrScheduler = observableEmpty());\n\n      isPromise(thenSource) && (thenSource = observableFromPromise(thenSource));\n      isPromise(elseSourceOrScheduler) && (elseSourceOrScheduler = observableFromPromise(elseSourceOrScheduler));\n\n      // Assume a scheduler for empty only\n      typeof elseSourceOrScheduler.now === 'function' && (elseSourceOrScheduler = observableEmpty(elseSourceOrScheduler));\n      return condition() ? thenSource : elseSourceOrScheduler;\n    });\n  };\n\n   /**\n   *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n   * There is an alias for this method called 'forIn' for browsers <IE9\n   * @param {Array} sources An array of values to turn into an observable sequence.\n   * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n   * @returns {Observable} An observable sequence from the concatenated observable sequences.\n   */\n  Observable['for'] = Observable.forIn = function (sources, resultSelector, thisArg) {\n    return enumerableOf(sources, resultSelector, thisArg).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a while loop.\n   * There is an alias for this method called 'whileDo' for browsers <IE9\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  var observableWhileDo = Observable['while'] = Observable.whileDo = function (condition, source) {\n    isPromise(source) && (source = observableFromPromise(source));\n    return enumerableWhile(condition, source).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a do while loop.\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  observableProto.doWhile = function (condition) {\n    return observableConcat([this, observableWhileDo(condition, this)]);\n  };\n\n   /**\n   *  Uses selector to determine which source in sources to use.\n   *  There is an alias 'switchCase' for browsers <IE9.\n   *\n   * @example\n   *  1 - res = Rx.Observable.case(selector, { '1': obs1, '2': obs2 });\n   *  1 - res = Rx.Observable.case(selector, { '1': obs1, '2': obs2 }, obs0);\n   *  1 - res = Rx.Observable.case(selector, { '1': obs1, '2': obs2 }, scheduler);\n   *\n   * @param {Function} selector The function which extracts the value for to test in a case statement.\n   * @param {Array} sources A object which has keys which correspond to the case statement labels.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n   *\n   * @returns {Observable} An observable sequence which is determined by a case statement.\n   */\n  Observable['case'] = Observable.switchCase = function (selector, sources, defaultSourceOrScheduler) {\n    return observableDefer(function () {\n      isPromise(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableFromPromise(defaultSourceOrScheduler));\n      defaultSourceOrScheduler || (defaultSourceOrScheduler = observableEmpty());\n\n      typeof defaultSourceOrScheduler.now === 'function' && (defaultSourceOrScheduler = observableEmpty(defaultSourceOrScheduler));\n\n      var result = sources[selector()];\n      isPromise(result) && (result = observableFromPromise(result));\n\n      return result || defaultSourceOrScheduler;\n    });\n  };\n\n   /**\n   *  Expands an observable sequence by recursively invoking selector.\n   *\n   * @param {Function} selector Selector function to invoke for each produced element, resulting in another sequence to which the selector will be invoked recursively again.\n   * @param {Scheduler} [scheduler] Scheduler on which to perform the expansion. If not provided, this defaults to the current thread scheduler.\n   * @returns {Observable} An observable sequence containing all the elements produced by the recursive expansion.\n   */\n  observableProto.expand = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var q = [],\n        m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        activeCount = 0,\n        isAcquired = false;\n\n      var ensureActive = function () {\n        var isOwner = false;\n        if (q.length > 0) {\n          isOwner = !isAcquired;\n          isAcquired = true;\n        }\n        if (isOwner) {\n          m.setDisposable(scheduler.scheduleRecursive(function (self) {\n            var work;\n            if (q.length > 0) {\n              work = q.shift();\n            } else {\n              isAcquired = false;\n              return;\n            }\n            var m1 = new SingleAssignmentDisposable();\n            d.add(m1);\n            m1.setDisposable(work.subscribe(function (x) {\n              observer.onNext(x);\n              var result = null;\n              try {\n                result = selector(x);\n              } catch (e) {\n                observer.onError(e);\n              }\n              q.push(result);\n              activeCount++;\n              ensureActive();\n            }, observer.onError.bind(observer), function () {\n              d.remove(m1);\n              activeCount--;\n              if (activeCount === 0) {\n                observer.onCompleted();\n              }\n            }));\n            self();\n          }));\n        }\n      };\n\n      q.push(source);\n      activeCount++;\n      ensureActive();\n      return d;\n    }, this);\n  };\n\n   /**\n   *  Runs all observable sequences in parallel and collect their last elements.\n   *\n   * @example\n   *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n   *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n   * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n   */\n  Observable.forkJoin = function () {\n    var allSources = [];\n    if (Array.isArray(arguments[0])) {\n      allSources = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { allSources.push(arguments[i]); }\n    }\n    return new AnonymousObservable(function (subscriber) {\n      var count = allSources.length;\n      if (count === 0) {\n        subscriber.onCompleted();\n        return disposableEmpty;\n      }\n      var group = new CompositeDisposable(),\n        finished = false,\n        hasResults = new Array(count),\n        hasCompleted = new Array(count),\n        results = new Array(count);\n\n      for (var idx = 0; idx < count; idx++) {\n        (function (i) {\n          var source = allSources[i];\n          isPromise(source) && (source = observableFromPromise(source));\n          group.add(\n            source.subscribe(\n              function (value) {\n              if (!finished) {\n                hasResults[i] = true;\n                results[i] = value;\n              }\n            },\n            function (e) {\n              finished = true;\n              subscriber.onError(e);\n              group.dispose();\n            },\n            function () {\n              if (!finished) {\n                if (!hasResults[i]) {\n                    subscriber.onCompleted();\n                    return;\n                }\n                hasCompleted[i] = true;\n                for (var ix = 0; ix < count; ix++) {\n                  if (!hasCompleted[ix]) { return; }\n                }\n                finished = true;\n                subscriber.onNext(results);\n                subscriber.onCompleted();\n              }\n            }));\n        })(idx);\n      }\n\n      return group;\n    });\n  };\n\n   /**\n   *  Runs two observable sequences in parallel and combines their last elemenets.\n   *\n   * @param {Observable} second Second observable sequence.\n   * @param {Function} resultSelector Result selector function to invoke with the last elements of both sequences.\n   * @returns {Observable} An observable sequence with the result of calling the selector function with the last elements of both input sequences.\n   */\n  observableProto.forkJoin = function (second, resultSelector) {\n    var first = this;\n    return new AnonymousObservable(function (observer) {\n      var leftStopped = false, rightStopped = false,\n        hasLeft = false, hasRight = false,\n        lastLeft, lastRight,\n        leftSubscription = new SingleAssignmentDisposable(), rightSubscription = new SingleAssignmentDisposable();\n\n      isPromise(second) && (second = observableFromPromise(second));\n\n      leftSubscription.setDisposable(\n          first.subscribe(function (left) {\n            hasLeft = true;\n            lastLeft = left;\n          }, function (err) {\n            rightSubscription.dispose();\n            observer.onError(err);\n          }, function () {\n            leftStopped = true;\n            if (rightStopped) {\n              if (!hasLeft) {\n                  observer.onCompleted();\n              } else if (!hasRight) {\n                  observer.onCompleted();\n              } else {\n                var result;\n                try {\n                  result = resultSelector(lastLeft, lastRight);\n                } catch (e) {\n                  observer.onError(e);\n                  return;\n                }\n                observer.onNext(result);\n                observer.onCompleted();\n              }\n            }\n          })\n      );\n\n      rightSubscription.setDisposable(\n        second.subscribe(function (right) {\n          hasRight = true;\n          lastRight = right;\n        }, function (err) {\n          leftSubscription.dispose();\n          observer.onError(err);\n        }, function () {\n          rightStopped = true;\n          if (leftStopped) {\n            if (!hasLeft) {\n              observer.onCompleted();\n            } else if (!hasRight) {\n              observer.onCompleted();\n            } else {\n              var result;\n              try {\n                result = resultSelector(lastLeft, lastRight);\n              } catch (e) {\n                observer.onError(e);\n                return;\n              }\n              observer.onNext(result);\n              observer.onCompleted();\n            }\n          }\n        })\n      );\n\n      return new CompositeDisposable(leftSubscription, rightSubscription);\n    }, first);\n  };\n\n  /**\n   * Comonadic bind operator.\n   * @param {Function} selector A transform function to apply to each element.\n   * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n   * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n   */\n  observableProto.manySelect = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    var source = this;\n    return observableDefer(function () {\n      var chain;\n\n      return source\n        .map(function (x) {\n          var curr = new ChainObservable(x);\n\n          chain && chain.onNext(x);\n          chain = curr;\n\n          return curr;\n        })\n        .tap(\n          noop,\n          function (e) { chain && chain.onError(e); },\n          function () { chain && chain.onCompleted(); }\n        )\n        .observeOn(scheduler)\n        .map(selector);\n    }, source);\n  };\n\n  var ChainObservable = (function (__super__) {\n\n    function subscribe (observer) {\n      var self = this, g = new CompositeDisposable();\n      g.add(currentThreadScheduler.schedule(function () {\n        observer.onNext(self.head);\n        g.add(self.tail.mergeAll().subscribe(observer));\n      }));\n\n      return g;\n    }\n\n    inherits(ChainObservable, __super__);\n\n    function ChainObservable(head) {\n      __super__.call(this, subscribe);\n      this.head = head;\n      this.tail = new AsyncSubject();\n    }\n\n    addProperties(ChainObservable.prototype, Observer, {\n      onCompleted: function () {\n        this.onNext(Observable.empty());\n      },\n      onError: function (e) {\n        this.onNext(Observable.throwException(e));\n      },\n      onNext: function (v) {\n        this.tail.onNext(v);\n        this.tail.onCompleted();\n      }\n    });\n\n    return ChainObservable;\n\n  }(Observable));\n\n  /** @private */\n  var Map = root.Map || (function () {\n\n    function Map() {\n      this._keys = [];\n      this._values = [];\n    }\n\n    Map.prototype.get = function (key) {\n      var i = this._keys.indexOf(key);\n      return i !== -1 ? this._values[i] : undefined;\n    };\n\n    Map.prototype.set = function (key, value) {\n      var i = this._keys.indexOf(key);\n      i !== -1 && (this._values[i] = value);\n      this._values[this._keys.push(key) - 1] = value;\n    };\n\n    Map.prototype.forEach = function (callback, thisArg) {\n      for (var i = 0, len = this._keys.length; i < len; i++) {\n        callback.call(thisArg, this._values[i], this._keys[i]);\n      }\n    };\n\n    return Map;\n  }());\n\n  /**\n   * @constructor\n   * Represents a join pattern over observable sequences.\n   */\n  function Pattern(patterns) {\n    this.patterns = patterns;\n  }\n\n  /**\n   *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n   *  @param other Observable sequence to match in addition to the current pattern.\n   *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n   */\n  Pattern.prototype.and = function (other) {\n    return new Pattern(this.patterns.concat(other));\n  };\n\n  /**\n   *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n   *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n   *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  Pattern.prototype.thenDo = function (selector) {\n    return new Plan(this, selector);\n  };\n\n  function Plan(expression, selector) {\n      this.expression = expression;\n      this.selector = selector;\n  }\n\n  Plan.prototype.activate = function (externalSubscriptions, observer, deactivate) {\n    var self = this;\n    var joinObservers = [];\n    for (var i = 0, len = this.expression.patterns.length; i < len; i++) {\n      joinObservers.push(planCreateObserver(externalSubscriptions, this.expression.patterns[i], observer.onError.bind(observer)));\n    }\n    var activePlan = new ActivePlan(joinObservers, function () {\n      var result;\n      try {\n        result = self.selector.apply(self, arguments);\n      } catch (e) {\n        observer.onError(e);\n        return;\n      }\n      observer.onNext(result);\n    }, function () {\n      for (var j = 0, jlen = joinObservers.length; j < jlen; j++) {\n        joinObservers[j].removeActivePlan(activePlan);\n      }\n      deactivate(activePlan);\n    });\n    for (i = 0, len = joinObservers.length; i < len; i++) {\n      joinObservers[i].addActivePlan(activePlan);\n    }\n    return activePlan;\n  };\n\n  function planCreateObserver(externalSubscriptions, observable, onError) {\n    var entry = externalSubscriptions.get(observable);\n    if (!entry) {\n      var observer = new JoinObserver(observable, onError);\n      externalSubscriptions.set(observable, observer);\n      return observer;\n    }\n    return entry;\n  }\n\n  function ActivePlan(joinObserverArray, onNext, onCompleted) {\n    this.joinObserverArray = joinObserverArray;\n    this.onNext = onNext;\n    this.onCompleted = onCompleted;\n    this.joinObservers = new Map();\n    for (var i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      var joinObserver = this.joinObserverArray[i];\n      this.joinObservers.set(joinObserver, joinObserver);\n    }\n  }\n\n  ActivePlan.prototype.dequeue = function () {\n    this.joinObservers.forEach(function (v) { v.queue.shift(); });\n  };\n\n  ActivePlan.prototype.match = function () {\n    var i, len, hasValues = true;\n    for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      if (this.joinObserverArray[i].queue.length === 0) {\n        hasValues = false;\n        break;\n      }\n    }\n    if (hasValues) {\n      var firstValues = [],\n          isCompleted = false;\n      for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n        firstValues.push(this.joinObserverArray[i].queue[0]);\n        this.joinObserverArray[i].queue[0].kind === 'C' && (isCompleted = true);\n      }\n      if (isCompleted) {\n        this.onCompleted();\n      } else {\n        this.dequeue();\n        var values = [];\n        for (i = 0, len = firstValues.length; i < firstValues.length; i++) {\n          values.push(firstValues[i].value);\n        }\n        this.onNext.apply(this, values);\n      }\n    }\n  };\n\n  var JoinObserver = (function (__super__) {\n    inherits(JoinObserver, __super__);\n\n    function JoinObserver(source, onError) {\n      __super__.call(this);\n      this.source = source;\n      this.onError = onError;\n      this.queue = [];\n      this.activePlans = [];\n      this.subscription = new SingleAssignmentDisposable();\n      this.isDisposed = false;\n    }\n\n    var JoinObserverPrototype = JoinObserver.prototype;\n\n    JoinObserverPrototype.next = function (notification) {\n      if (!this.isDisposed) {\n        if (notification.kind === 'E') {\n          return this.onError(notification.exception);\n        }\n        this.queue.push(notification);\n        var activePlans = this.activePlans.slice(0);\n        for (var i = 0, len = activePlans.length; i < len; i++) {\n          activePlans[i].match();\n        }\n      }\n    };\n\n    JoinObserverPrototype.error = noop;\n    JoinObserverPrototype.completed = noop;\n\n    JoinObserverPrototype.addActivePlan = function (activePlan) {\n      this.activePlans.push(activePlan);\n    };\n\n    JoinObserverPrototype.subscribe = function () {\n      this.subscription.setDisposable(this.source.materialize().subscribe(this));\n    };\n\n    JoinObserverPrototype.removeActivePlan = function (activePlan) {\n      this.activePlans.splice(this.activePlans.indexOf(activePlan), 1);\n      this.activePlans.length === 0 && this.dispose();\n    };\n\n    JoinObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this.subscription.dispose();\n      }\n    };\n\n    return JoinObserver;\n  } (AbstractObserver));\n\n  /**\n   *  Creates a pattern that matches when both observable sequences have an available value.\n   *\n   *  @param right Observable sequence to match with the current sequence.\n   *  @return {Pattern} Pattern object that matches when both observable sequences have an available value.\n   */\n  observableProto.and = function (right) {\n    return new Pattern([this, right]);\n  };\n\n  /**\n   *  Matches when the observable sequence has an available value and projects the value.\n   *\n   *  @param {Function} selector Selector that will be invoked for values in the source sequence.\n   *  @returns {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  observableProto.thenDo = function (selector) {\n    return new Pattern([this]).thenDo(selector);\n  };\n\n  /**\n   *  Joins together the results from several patterns.\n   *\n   *  @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns.\n   *  @returns {Observable} Observable sequence with the results form matching several patterns.\n   */\n  Observable.when = function () {\n    var plans = [];\n    if (Array.isArray(arguments[0])) {\n      plans = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { plans.push(arguments[i]); }\n    }\n    return new AnonymousObservable(function (observer) {\n      var activePlans = [],\n          externalSubscriptions = new Map();\n      var outObserver = observerCreate(\n        observer.onNext.bind(observer),\n        function (err) {\n          externalSubscriptions.forEach(function (v) { v.onError(err); });\n          observer.onError(err);\n        },\n        observer.onCompleted.bind(observer)\n      );\n      try {\n        for (var i = 0, len = plans.length; i < len; i++) {\n          activePlans.push(plans[i].activate(externalSubscriptions, outObserver, function (activePlan) {\n            var idx = activePlans.indexOf(activePlan);\n            activePlans.splice(idx, 1);\n            activePlans.length === 0 && observer.onCompleted();\n          }));\n        }\n      } catch (e) {\n        observableThrow(e).subscribe(observer);\n      }\n      var group = new CompositeDisposable();\n      externalSubscriptions.forEach(function (joinObserver) {\n        joinObserver.subscribe();\n        group.add(joinObserver);\n      });\n\n      return group;\n    });\n  };\n\n  function observableTimerDate(dueTime, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleWithAbsolute(dueTime, function () {\n        observer.onNext(0);\n        observer.onCompleted();\n      });\n    });\n  }\n\n  function observableTimerDateAndPeriod(dueTime, period, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var d = dueTime, p = normalizeTime(period);\n      return scheduler.scheduleRecursiveWithAbsoluteAndState(0, d, function (count, self) {\n        if (p > 0) {\n          var now = scheduler.now();\n          d = d + p;\n          d <= now && (d = now + p);\n        }\n        observer.onNext(count);\n        self(count + 1, d);\n      });\n    });\n  }\n\n  function observableTimerTimeSpan(dueTime, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleWithRelative(normalizeTime(dueTime), function () {\n        observer.onNext(0);\n        observer.onCompleted();\n      });\n    });\n  }\n\n  function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) {\n    return dueTime === period ?\n      new AnonymousObservable(function (observer) {\n        return scheduler.schedulePeriodicWithState(0, period, function (count) {\n          observer.onNext(count);\n          return count + 1;\n        });\n      }) :\n      observableDefer(function () {\n        return observableTimerDateAndPeriod(scheduler.now() + dueTime, period, scheduler);\n      });\n  }\n\n  /**\n   *  Returns an observable sequence that produces a value after each period.\n   *\n   * @example\n   *  1 - res = Rx.Observable.interval(1000);\n   *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n   *\n   * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n   * @returns {Observable} An observable sequence that produces a value after each period.\n   */\n  var observableinterval = Observable.interval = function (period, scheduler) {\n    return observableTimerTimeSpanAndPeriod(period, period, isScheduler(scheduler) ? scheduler : timeoutScheduler);\n  };\n\n  /**\n   *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n   * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n   */\n  var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) {\n    var period;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    if (periodOrScheduler !== undefined && typeof periodOrScheduler === 'number') {\n      period = periodOrScheduler;\n    } else if (isScheduler(periodOrScheduler)) {\n      scheduler = periodOrScheduler;\n    }\n    if (dueTime instanceof Date && period === undefined) {\n      return observableTimerDate(dueTime.getTime(), scheduler);\n    }\n    if (dueTime instanceof Date && period !== undefined) {\n      period = periodOrScheduler;\n      return observableTimerDateAndPeriod(dueTime.getTime(), period, scheduler);\n    }\n    return period === undefined ?\n      observableTimerTimeSpan(dueTime, scheduler) :\n      observableTimerTimeSpanAndPeriod(dueTime, period, scheduler);\n  };\n\n  function observableDelayTimeSpan(source, dueTime, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var active = false,\n        cancelable = new SerialDisposable(),\n        exception = null,\n        q = [],\n        running = false,\n        subscription;\n      subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) {\n        var d, shouldRun;\n        if (notification.value.kind === 'E') {\n          q = [];\n          q.push(notification);\n          exception = notification.value.exception;\n          shouldRun = !running;\n        } else {\n          q.push({ value: notification.value, timestamp: notification.timestamp + dueTime });\n          shouldRun = !active;\n          active = true;\n        }\n        if (shouldRun) {\n          if (exception !== null) {\n            observer.onError(exception);\n          } else {\n            d = new SingleAssignmentDisposable();\n            cancelable.setDisposable(d);\n            d.setDisposable(scheduler.scheduleRecursiveWithRelative(dueTime, function (self) {\n              var e, recurseDueTime, result, shouldRecurse;\n              if (exception !== null) {\n                return;\n              }\n              running = true;\n              do {\n                result = null;\n                if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) {\n                  result = q.shift().value;\n                }\n                if (result !== null) {\n                  result.accept(observer);\n                }\n              } while (result !== null);\n              shouldRecurse = false;\n              recurseDueTime = 0;\n              if (q.length > 0) {\n                shouldRecurse = true;\n                recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now());\n              } else {\n                active = false;\n              }\n              e = exception;\n              running = false;\n              if (e !== null) {\n                observer.onError(e);\n              } else if (shouldRecurse) {\n                self(recurseDueTime);\n              }\n            }));\n          }\n        }\n      });\n      return new CompositeDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  function observableDelayDate(source, dueTime, scheduler) {\n    return observableDefer(function () {\n      return observableDelayTimeSpan(source, dueTime - scheduler.now(), scheduler);\n    });\n  }\n\n  /**\n   *  Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n   *\n   * @example\n   *  1 - res = Rx.Observable.delay(new Date());\n   *  2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout);\n   *\n   *  3 - res = Rx.Observable.delay(5000);\n   *  4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout);\n   * @memberOf Observable#\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n   * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delay = function (dueTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return dueTime instanceof Date ?\n      observableDelayDate(this, dueTime.getTime(), scheduler) :\n      observableDelayTimeSpan(this, dueTime, scheduler);\n  };\n\n  /**\n   *  Ignores values from an observable sequence which are followed by another value before dueTime.\n   * @param {Number} dueTime Duration of the debounce period for each value (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler]  Scheduler to run the debounce timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The debounced sequence.\n   */\n  observableProto.debounce = observableProto.throttleWithTimeout = function (dueTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var cancelable = new SerialDisposable(), hasvalue = false, value, id = 0;\n      var subscription = source.subscribe(\n        function (x) {\n          hasvalue = true;\n          value = x;\n          id++;\n          var currentId = id,\n            d = new SingleAssignmentDisposable();\n          cancelable.setDisposable(d);\n          d.setDisposable(scheduler.scheduleWithRelative(dueTime, function () {\n            hasvalue && id === currentId && observer.onNext(value);\n            hasvalue = false;\n          }));\n        },\n        function (e) {\n          cancelable.dispose();\n          observer.onError(e);\n          hasvalue = false;\n          id++;\n        },\n        function () {\n          cancelable.dispose();\n          hasvalue && observer.onNext(value);\n          observer.onCompleted();\n          hasvalue = false;\n          id++;\n        });\n      return new CompositeDisposable(subscription, cancelable);\n    }, this);\n  };\n\n  /**\n   * @deprecated use #debounce or #throttleWithTimeout instead.\n   */\n  observableProto.throttle = function(dueTime, scheduler) {\n    //deprecate('throttle', 'debounce or throttleWithTimeout');\n    return this.debounce(dueTime, scheduler);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n   * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n   * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n    var source = this, timeShift;\n    timeShiftOrScheduler == null && (timeShift = timeSpan);\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    if (typeof timeShiftOrScheduler === 'number') {\n      timeShift = timeShiftOrScheduler;\n    } else if (isScheduler(timeShiftOrScheduler)) {\n      timeShift = timeSpan;\n      scheduler = timeShiftOrScheduler;\n    }\n    return new AnonymousObservable(function (observer) {\n      var groupDisposable,\n        nextShift = timeShift,\n        nextSpan = timeSpan,\n        q = [],\n        refCountDisposable,\n        timerD = new SerialDisposable(),\n        totalTime = 0;\n        groupDisposable = new CompositeDisposable(timerD),\n        refCountDisposable = new RefCountDisposable(groupDisposable);\n\n       function createTimer () {\n        var m = new SingleAssignmentDisposable(),\n          isSpan = false,\n          isShift = false;\n        timerD.setDisposable(m);\n        if (nextSpan === nextShift) {\n          isSpan = true;\n          isShift = true;\n        } else if (nextSpan < nextShift) {\n            isSpan = true;\n        } else {\n          isShift = true;\n        }\n        var newTotalTime = isSpan ? nextSpan : nextShift,\n          ts = newTotalTime - totalTime;\n        totalTime = newTotalTime;\n        if (isSpan) {\n          nextSpan += timeShift;\n        }\n        if (isShift) {\n          nextShift += timeShift;\n        }\n        m.setDisposable(scheduler.scheduleWithRelative(ts, function () {\n          if (isShift) {\n            var s = new Subject();\n            q.push(s);\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          isSpan && q.shift().onCompleted();\n          createTimer();\n        }));\n      };\n      q.push(new Subject());\n      observer.onNext(addRef(q[0], refCountDisposable));\n      createTimer();\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n        },\n        function (e) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed.\n   * @param {Number} timeSpan Maximum time length of a window.\n   * @param {Number} count Maximum element count of a window.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTimeOrCount = function (timeSpan, count, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (observer) {\n      var timerD = new SerialDisposable(),\n          groupDisposable = new CompositeDisposable(timerD),\n          refCountDisposable = new RefCountDisposable(groupDisposable),\n          n = 0,\n          windowId = 0,\n          s = new Subject();\n\n      function createTimer(id) {\n        var m = new SingleAssignmentDisposable();\n        timerD.setDisposable(m);\n        m.setDisposable(scheduler.scheduleWithRelative(timeSpan, function () {\n          if (id !== windowId) { return; }\n          n = 0;\n          var newId = ++windowId;\n          s.onCompleted();\n          s = new Subject();\n          observer.onNext(addRef(s, refCountDisposable));\n          createTimer(newId);\n        }));\n      }\n\n      observer.onNext(addRef(s, refCountDisposable));\n      createTimer(0);\n\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          var newId = 0, newWindow = false;\n          s.onNext(x);\n          if (++n === count) {\n            newWindow = true;\n            n = 0;\n            newId = ++windowId;\n            s.onCompleted();\n            s = new Subject();\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          newWindow && createTimer(newId);\n        },\n        function (e) {\n          s.onError(e);\n          observer.onError(e);\n        }, function () {\n          s.onCompleted();\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n    /**\n     *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n     *\n     * @example\n     *  1 - res = xs.bufferWithTime(1000, scheduler); // non-overlapping segments of 1 second\n     *  2 - res = xs.bufferWithTime(1000, 500, scheduler; // segments of 1 second with time shift 0.5 seconds\n     *\n     * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n     * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n     * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n     * @returns {Observable} An observable sequence of buffers.\n     */\n    observableProto.bufferWithTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n        return this.windowWithTime.apply(this, arguments).selectMany(function (x) { return x.toArray(); });\n    };\n\n    /**\n     *  Projects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed.\n     *\n     * @example\n     *  1 - res = source.bufferWithTimeOrCount(5000, 50); // 5s or 50 items in an array\n     *  2 - res = source.bufferWithTimeOrCount(5000, 50, scheduler); // 5s or 50 items in an array\n     *\n     * @param {Number} timeSpan Maximum time length of a buffer.\n     * @param {Number} count Maximum element count of a buffer.\n     * @param {Scheduler} [scheduler]  Scheduler to run bufferin timers on. If not specified, the timeout scheduler is used.\n     * @returns {Observable} An observable sequence of buffers.\n     */\n    observableProto.bufferWithTimeOrCount = function (timeSpan, count, scheduler) {\n        return this.windowWithTimeOrCount(timeSpan, count, scheduler).selectMany(function (x) {\n            return x.toArray();\n        });\n    };\n\n  /**\n   *  Records the time interval between consecutive values in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timeInterval();\n   *  2 - res = source.timeInterval(Rx.Scheduler.timeout);\n   *\n   * @param [scheduler]  Scheduler used to compute time intervals. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence with time interval information on values.\n   */\n  observableProto.timeInterval = function (scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return observableDefer(function () {\n      var last = scheduler.now();\n      return source.map(function (x) {\n        var now = scheduler.now(), span = now - last;\n        last = now;\n        return { value: x, interval: span };\n      });\n    });\n  };\n\n  /**\n   *  Records the timestamp for each value in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n   *  2 - res = source.timestamp(Rx.Scheduler.timeout);\n   *\n   * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence with timestamp information on values.\n   */\n  observableProto.timestamp = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return this.map(function (x) {\n      return { value: x, timestamp: scheduler.now() };\n    });\n  };\n\n  function sampleObservable(source, sampler) {\n    return new AnonymousObservable(function (observer) {\n      var atEnd, value, hasValue;\n\n      function sampleSubscribe() {\n        if (hasValue) {\n          hasValue = false;\n          observer.onNext(value);\n        }\n        atEnd && observer.onCompleted();\n      }\n\n      return new CompositeDisposable(\n        source.subscribe(function (newValue) {\n          hasValue = true;\n          value = newValue;\n        }, observer.onError.bind(observer), function () {\n          atEnd = true;\n        }),\n        sampler.subscribe(sampleSubscribe, observer.onError.bind(observer), sampleSubscribe)\n      );\n    }, source);\n  }\n\n  /**\n   *  Samples the observable sequence at each interval.\n   *\n   * @example\n   *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n   *  2 - res = source.sample(5000); // 5 seconds\n   *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n   *\n   * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n   * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Sampled observable sequence.\n   */\n  observableProto.sample = observableProto.throttleLatest = function (intervalOrSampler, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return typeof intervalOrSampler === 'number' ?\n      sampleObservable(this, observableinterval(intervalOrSampler, scheduler)) :\n      sampleObservable(this, intervalOrSampler);\n  };\n\n  /**\n   *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n   * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n   */\n  observableProto.timeout = function (dueTime, other, scheduler) {\n    (other == null || typeof other === 'string') && (other = observableThrow(new Error(other || 'Timeout')));\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n\n    var source = this, schedulerMethod = dueTime instanceof Date ?\n      'scheduleWithAbsolute' :\n      'scheduleWithRelative';\n\n    return new AnonymousObservable(function (observer) {\n      var id = 0,\n        original = new SingleAssignmentDisposable(),\n        subscription = new SerialDisposable(),\n        switched = false,\n        timer = new SerialDisposable();\n\n      subscription.setDisposable(original);\n\n      function createTimer() {\n        var myId = id;\n        timer.setDisposable(scheduler[schedulerMethod](dueTime, function () {\n          if (id === myId) {\n            isPromise(other) && (other = observableFromPromise(other));\n            subscription.setDisposable(other.subscribe(observer));\n          }\n        }));\n      }\n\n      createTimer();\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (!switched) {\n          id++;\n          observer.onNext(x);\n          createTimer();\n        }\n      }, function (e) {\n        if (!switched) {\n          id++;\n          observer.onError(e);\n        }\n      }, function () {\n        if (!switched) {\n          id++;\n          observer.onCompleted();\n        }\n      }));\n      return new CompositeDisposable(subscription, timer);\n    }, source);\n  };\n\n  /**\n   *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithAbsoluteTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return new Date(); }\n   *  });\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning Date values.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithAbsoluteTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (observer) {\n      var first = true,\n        hasResult = false,\n        result,\n        state = initialState,\n        time;\n      return scheduler.scheduleRecursiveWithAbsolute(scheduler.now(), function (self) {\n        hasResult && observer.onNext(result);\n\n        try {\n          if (first) {\n            first = false;\n          } else {\n            state = iterate(state);\n          }\n          hasResult = condition(state);\n          if (hasResult) {\n            result = resultSelector(state);\n            time = timeSelector(state);\n          }\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n        if (hasResult) {\n          self(time);\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithRelativeTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return 500; }\n   *  );\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithRelativeTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (observer) {\n      var first = true,\n        hasResult = false,\n        result,\n        state = initialState,\n        time;\n      return scheduler.scheduleRecursiveWithRelative(0, function (self) {\n        hasResult && observer.onNext(result);\n\n        try {\n          if (first) {\n            first = false;\n          } else {\n            state = iterate(state);\n          }\n          hasResult = condition(state);\n          if (hasResult) {\n            result = resultSelector(state);\n            time = timeSelector(state);\n          }\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n        if (hasResult) {\n          self(time);\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Time shifts the observable sequence by delaying the subscription.\n   *\n   * @example\n   *  1 - res = source.delaySubscription(5000); // 5s\n   *  2 - res = source.delaySubscription(5000, Rx.Scheduler.timeout); // 5 seconds\n   *\n   * @param {Number} dueTime Absolute or relative time to perform the subscription at.\n   * @param {Scheduler} [scheduler]  Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delaySubscription = function (dueTime, scheduler) {\n    return this.delayWithSelector(observableTimer(dueTime, isScheduler(scheduler) ? scheduler : timeoutScheduler), observableEmpty);\n  };\n\n  /**\n   *  Time shifts the observable sequence based on a subscription delay and a delay selector function for each element.\n   *\n   * @example\n   *  1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only\n   *  1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector\n   *\n   * @param {Observable} [subscriptionDelay]  Sequence indicating the delay for the subscription to the source.\n   * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delayWithSelector = function (subscriptionDelay, delayDurationSelector) {\n      var source = this, subDelay, selector;\n      if (typeof subscriptionDelay === 'function') {\n        selector = subscriptionDelay;\n      } else {\n        subDelay = subscriptionDelay;\n        selector = delayDurationSelector;\n      }\n      return new AnonymousObservable(function (observer) {\n        var delays = new CompositeDisposable(), atEnd = false, done = function () {\n            if (atEnd && delays.length === 0) { observer.onCompleted(); }\n        }, subscription = new SerialDisposable(), start = function () {\n          subscription.setDisposable(source.subscribe(function (x) {\n              var delay;\n              try {\n                delay = selector(x);\n              } catch (error) {\n                observer.onError(error);\n                return;\n              }\n              var d = new SingleAssignmentDisposable();\n              delays.add(d);\n              d.setDisposable(delay.subscribe(function () {\n                observer.onNext(x);\n                delays.remove(d);\n                done();\n              }, observer.onError.bind(observer), function () {\n                observer.onNext(x);\n                delays.remove(d);\n                done();\n              }));\n          }, observer.onError.bind(observer), function () {\n            atEnd = true;\n            subscription.dispose();\n            done();\n          }));\n      };\n\n      if (!subDelay) {\n        start();\n      } else {\n        subscription.setDisposable(subDelay.subscribe(start, observer.onError.bind(observer), start));\n      }\n\n      return new CompositeDisposable(subscription, delays);\n    }, this);\n  };\n\n    /**\n     *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n     * @param {Observable} [firstTimeout]  Observable sequence that represents the timeout for the first element. If not provided, this defaults to Observable.never().\n     * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n     * @param {Observable} [other]  Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException().\n     * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n     */\n    observableProto.timeoutWithSelector = function (firstTimeout, timeoutdurationSelector, other) {\n      if (arguments.length === 1) {\n          timeoutdurationSelector = firstTimeout;\n          firstTimeout = observableNever();\n      }\n      other || (other = observableThrow(new Error('Timeout')));\n      var source = this;\n      return new AnonymousObservable(function (observer) {\n        var subscription = new SerialDisposable(), timer = new SerialDisposable(), original = new SingleAssignmentDisposable();\n\n        subscription.setDisposable(original);\n\n        var id = 0, switched = false;\n\n        function setTimer(timeout) {\n          var myId = id;\n\n          function timerWins () {\n            return id === myId;\n          }\n\n          var d = new SingleAssignmentDisposable();\n          timer.setDisposable(d);\n          d.setDisposable(timeout.subscribe(function () {\n            timerWins() && subscription.setDisposable(other.subscribe(observer));\n            d.dispose();\n          }, function (e) {\n            timerWins() && observer.onError(e);\n          }, function () {\n            timerWins() && subscription.setDisposable(other.subscribe(observer));\n          }));\n        };\n\n        setTimer(firstTimeout);\n\n        function observerWins() {\n          var res = !switched;\n          if (res) { id++; }\n          return res;\n        }\n\n        original.setDisposable(source.subscribe(function (x) {\n          if (observerWins()) {\n            observer.onNext(x);\n            var timeout;\n            try {\n              timeout = timeoutdurationSelector(x);\n            } catch (e) {\n              observer.onError(e);\n              return;\n            }\n            setTimer(isPromise(timeout) ? observableFromPromise(timeout) : timeout);\n          }\n        }, function (e) {\n          observerWins() && observer.onError(e);\n        }, function () {\n          observerWins() && observer.onCompleted();\n        }));\n        return new CompositeDisposable(subscription, timer);\n      }, source);\n    };\n\n  /**\n   * Ignores values from an observable sequence which are followed by another value within a computed throttle duration.\n   * @param {Function} durationSelector Selector function to retrieve a sequence indicating the throttle duration for each given element.\n   * @returns {Observable} The debounced sequence.\n   */\n  observableProto.debounceWithSelector = function (durationSelector) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var value, hasValue = false, cancelable = new SerialDisposable(), id = 0;\n      var subscription = source.subscribe(function (x) {\n        var throttle;\n        try {\n          throttle = durationSelector(x);\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n\n        isPromise(throttle) && (throttle = observableFromPromise(throttle));\n\n        hasValue = true;\n        value = x;\n        id++;\n        var currentid = id, d = new SingleAssignmentDisposable();\n        cancelable.setDisposable(d);\n        d.setDisposable(throttle.subscribe(function () {\n          hasValue && id === currentid && observer.onNext(value);\n          hasValue = false;\n          d.dispose();\n        }, observer.onError.bind(observer), function () {\n          hasValue && id === currentid && observer.onNext(value);\n          hasValue = false;\n          d.dispose();\n        }));\n      }, function (e) {\n        cancelable.dispose();\n        observer.onError(e);\n        hasValue = false;\n        id++;\n      }, function () {\n        cancelable.dispose();\n        hasValue && observer.onNext(value);\n        observer.onCompleted();\n        hasValue = false;\n        id++;\n      });\n      return new CompositeDisposable(subscription, cancelable);\n    }, source);\n  };\n\n  observableProto.throttleWithSelector = function () {\n    //deprecate('throttleWithSelector', 'debounceWithSelector');\n    return this.debounceWithSelector.apply(this, arguments);\n  };\n\n  /**\n   *  Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   *\n   *  1 - res = source.skipLastWithTime(5000);\n   *  2 - res = source.skipLastWithTime(5000, scheduler);\n   *\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for skipping elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence.\n   */\n  observableProto.skipLastWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        var now = scheduler.now();\n        q.push({ interval: now, value: x });\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          o.onNext(q.shift().value);\n        }\n      }, function (e) { o.onError(e); }, function () {\n        var now = scheduler.now();\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          o.onNext(q.shift().value);\n        }\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        var now = scheduler.now();\n        q.push({ interval: now, value: x });\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          q.shift();\n        }\n      }, function (e) { o.onError(e); }, function () {\n        var now = scheduler.now();\n        while (q.length > 0) {\n          var next = q.shift();\n          if (now - next.interval <= duration) { o.onNext(next.value); }\n        }\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastBufferWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        var now = scheduler.now();\n        q.push({ interval: now, value: x });\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          q.shift();\n        }\n      }, function (e) { o.onError(e); }, function () {\n        var now = scheduler.now(), res = [];\n        while (q.length > 0) {\n          var next = q.shift();\n          now - next.interval <= duration && res.push(next.value);\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.takeWithTime(5000,  [optional scheduler]);\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence.\n   */\n  observableProto.takeWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (o) {\n      return new CompositeDisposable(scheduler.scheduleWithRelative(duration, function () { o.onCompleted(); }), source.subscribe(o));\n    }, source);\n  };\n\n  /**\n   *  Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.skipWithTime(5000, [optional scheduler]);\n   *\n   * @description\n   *  Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence.\n   *  This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded\n   *  may not execute immediately, despite the zero due time.\n   *\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration.\n   * @param {Number} duration Duration for skipping elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence.\n   */\n  observableProto.skipWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (observer) {\n      var open = false;\n      return new CompositeDisposable(\n        scheduler.scheduleWithRelative(duration, function () { open = true; }),\n        source.subscribe(function (x) { open && observer.onNext(x); }, observer.onError.bind(observer), observer.onCompleted.bind(observer)));\n    }, source);\n  };\n\n  /**\n   *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n   *\n   * @examples\n   *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n   *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n   * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n   */\n  observableProto.skipUntilWithTime = function (startTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    var source = this, schedulerMethod = startTime instanceof Date ?\n      'scheduleWithAbsolute' :\n      'scheduleWithRelative';\n    return new AnonymousObservable(function (o) {\n      var open = false;\n\n      return new CompositeDisposable(\n        scheduler[schedulerMethod](startTime, function () { open = true; }),\n        source.subscribe(\n          function (x) { open && o.onNext(x); },\n          function (e) { o.onError(e); }, function () { o.onCompleted(); }));\n    }, source);\n  };\n\n  /**\n   *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n   * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n   * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n   */\n  observableProto.takeUntilWithTime = function (endTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    var source = this, schedulerMethod = endTime instanceof Date ?\n      'scheduleWithAbsolute' :\n      'scheduleWithRelative';\n    return new AnonymousObservable(function (o) {\n      return new CompositeDisposable(\n        scheduler[schedulerMethod](endTime, function () { o.onCompleted(); }),\n        source.subscribe(o));\n    }, source);\n  };\n\n  /**\n   * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n   * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n   * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n   * @returns {Observable} An Observable that performs the throttle operation.\n   */\n  observableProto.throttleFirst = function (windowDuration, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    var duration = +windowDuration || 0;\n    if (duration <= 0) { throw new RangeError('windowDuration cannot be less or equal zero.'); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var lastOnNext = 0;\n      return source.subscribe(\n        function (x) {\n          var now = scheduler.now();\n          if (lastOnNext === 0 || now - lastOnNext >= duration) {\n            lastOnNext = now;\n            o.onNext(x);\n          }\n        },function (e) { o.onError(e); }, function () { o.onCompleted(); }\n      );\n    }, source);\n  };\n\n  /**\n   * Executes a transducer to transform the observable sequence\n   * @param {Transducer} transducer A transducer to execute\n   * @returns {Observable} An Observable sequence containing the results from the transducer.\n   */\n  observableProto.transduce = function(transducer) {\n    var source = this;\n\n    function transformForObserver(observer) {\n      return {\n        init: function() {\n          return observer;\n        },\n        step: function(obs, input) {\n          return obs.onNext(input);\n        },\n        result: function(obs) {\n          return obs.onCompleted();\n        }\n      };\n    }\n\n    return new AnonymousObservable(function(observer) {\n      var xform = transducer(transformForObserver(observer));\n      return source.subscribe(\n        function(v) {\n          try {\n            xform.step(observer, v);\n          } catch (e) {\n            observer.onError(e);\n          }\n        },\n        observer.onError.bind(observer),\n        function() { xform.result(observer); }\n      );\n    }, source);\n  };\n\n  /*\n   * Performs a exclusive waiting for the first to finish before subscribing to another observable.\n   * Observables that come in between subscriptions will be dropped on the floor.\n   * @returns {Observable} A exclusive observable with only the results that happen when subscribed.\n   */\n  observableProto.exclusive = function () {\n    var sources = this;\n    return new AnonymousObservable(function (observer) {\n      var hasCurrent = false,\n        isStopped = false,\n        m = new SingleAssignmentDisposable(),\n        g = new CompositeDisposable();\n\n      g.add(m);\n\n      m.setDisposable(sources.subscribe(\n        function (innerSource) {\n          if (!hasCurrent) {\n            hasCurrent = true;\n\n            isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n\n            var innerSubscription = new SingleAssignmentDisposable();\n            g.add(innerSubscription);\n\n            innerSubscription.setDisposable(innerSource.subscribe(\n              observer.onNext.bind(observer),\n              observer.onError.bind(observer),\n              function () {\n                g.remove(innerSubscription);\n                hasCurrent = false;\n                if (isStopped && g.length === 1) {\n                  observer.onCompleted();\n                }\n            }));\n          }\n        },\n        observer.onError.bind(observer),\n        function () {\n          isStopped = true;\n          if (!hasCurrent && g.length === 1) {\n            observer.onCompleted();\n          }\n        }));\n\n      return g;\n    }, this);\n  };\n\n  /*\n   * Performs a exclusive map waiting for the first to finish before subscribing to another observable.\n   * Observables that come in between subscriptions will be dropped on the floor.\n   * @param {Function} selector Selector to invoke for every item in the current subscription.\n   * @param {Any} [thisArg] An optional context to invoke with the selector parameter.\n   * @returns {Observable} An exclusive observable with only the results that happen when subscribed.\n   */\n  observableProto.exclusiveMap = function (selector, thisArg) {\n    var sources = this,\n        selectorFunc = bindCallback(selector, thisArg, 3);\n    return new AnonymousObservable(function (observer) {\n      var index = 0,\n        hasCurrent = false,\n        isStopped = true,\n        m = new SingleAssignmentDisposable(),\n        g = new CompositeDisposable();\n\n      g.add(m);\n\n      m.setDisposable(sources.subscribe(\n        function (innerSource) {\n\n          if (!hasCurrent) {\n            hasCurrent = true;\n\n            innerSubscription = new SingleAssignmentDisposable();\n            g.add(innerSubscription);\n\n            isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n\n            innerSubscription.setDisposable(innerSource.subscribe(\n              function (x) {\n                var result;\n                try {\n                  result = selectorFunc(x, index++, innerSource);\n                } catch (e) {\n                  observer.onError(e);\n                  return;\n                }\n\n                observer.onNext(result);\n              },\n              function (e) { observer.onError(e); },\n              function () {\n                g.remove(innerSubscription);\n                hasCurrent = false;\n\n                if (isStopped && g.length === 1) {\n                  observer.onCompleted();\n                }\n              }));\n          }\n        },\n        function (e) { observer.onError(e); },\n        function () {\n          isStopped = true;\n          if (g.length === 1 && !hasCurrent) {\n            observer.onCompleted();\n          }\n        }));\n      return g;\n    }, this);\n  };\n\n  /** Provides a set of extension methods for virtual time scheduling. */\n  Rx.VirtualTimeScheduler = (function (__super__) {\n\n    function notImplemented() {\n        throw new Error('Not implemented');\n    }\n\n    function localNow() {\n      return this.toDateTimeOffset(this.clock);\n    }\n\n    function scheduleNow(state, action) {\n      return this.scheduleAbsoluteWithState(state, this.clock, action);\n    }\n\n    function scheduleRelative(state, dueTime, action) {\n      return this.scheduleRelativeWithState(state, this.toRelative(dueTime), action);\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleRelativeWithState(state, this.toRelative(dueTime - this.now()), action);\n    }\n\n    function invokeAction(scheduler, action) {\n      action();\n      return disposableEmpty;\n    }\n\n    inherits(VirtualTimeScheduler, __super__);\n\n    /**\n     * Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer.\n     *\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function VirtualTimeScheduler(initialClock, comparer) {\n      this.clock = initialClock;\n      this.comparer = comparer;\n      this.isEnabled = false;\n      this.queue = new PriorityQueue(1024);\n      __super__.call(this, localNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n    }\n\n    var VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype;\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    VirtualTimeSchedulerPrototype.add = notImplemented;\n\n    /**\n     * Converts an absolute time to a number\n     * @param {Any} The absolute time.\n     * @returns {Number} The absolute time in ms\n     */\n    VirtualTimeSchedulerPrototype.toDateTimeOffset = notImplemented;\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    VirtualTimeSchedulerPrototype.toRelative = notImplemented;\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be emulated using recursive scheduling.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.schedulePeriodicWithState = function (state, period, action) {\n      var s = new SchedulePeriodicRecursive(this, state, period, action);\n      return s.start();\n    };\n\n    /**\n     * Schedules an action to be executed after dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleRelativeWithState = function (state, dueTime, action) {\n      var runAt = this.add(this.clock, dueTime);\n      return this.scheduleAbsoluteWithState(state, runAt, action);\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleRelative = function (dueTime, action) {\n      return this.scheduleRelativeWithState(action, dueTime, invokeAction);\n    };\n\n    /**\n     * Starts the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.start = function () {\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n      }\n    };\n\n    /**\n     * Stops the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.stop = function () {\n      this.isEnabled = false;\n    };\n\n    /**\n     * Advances the scheduler's clock to the specified time, running all work till that point.\n     * @param {Number} time Absolute time to advance the scheduler's clock to.\n     */\n    VirtualTimeSchedulerPrototype.advanceTo = function (time) {\n      var dueToClock = this.comparer(this.clock, time);\n      if (this.comparer(this.clock, time) > 0) {\n        throw new Error(argumentOutOfRange);\n      }\n      if (dueToClock === 0) {\n        return;\n      }\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null && this.comparer(next.dueTime, time) <= 0) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n        this.clock = time;\n      }\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.advanceBy = function (time) {\n      var dt = this.add(this.clock, time),\n          dueToClock = this.comparer(this.clock, dt);\n      if (dueToClock > 0) { throw new Error(argumentOutOfRange); }\n      if (dueToClock === 0) {  return; }\n\n      this.advanceTo(dt);\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.sleep = function (time) {\n      var dt = this.add(this.clock, time);\n      if (this.comparer(this.clock, dt) >= 0) { throw new Error(argumentOutOfRange); }\n\n      this.clock = dt;\n    };\n\n    /**\n     * Gets the next scheduled item to be executed.\n     * @returns {ScheduledItem} The next scheduled item.\n     */\n    VirtualTimeSchedulerPrototype.getNext = function () {\n      while (this.queue.length > 0) {\n        var next = this.queue.peek();\n        if (next.isCancelled()) {\n          this.queue.dequeue();\n        } else {\n          return next;\n        }\n      }\n      return null;\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Scheduler} scheduler Scheduler to execute the action on.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleAbsolute = function (dueTime, action) {\n      return this.scheduleAbsoluteWithState(action, dueTime, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleAbsoluteWithState = function (state, dueTime, action) {\n      var self = this;\n\n      function run(scheduler, state1) {\n        self.queue.remove(si);\n        return action(scheduler, state1);\n      }\n\n      var si = new ScheduledItem(this, state, run, dueTime, this.comparer);\n      this.queue.enqueue(si);\n\n      return si.disposable;\n    };\n\n    return VirtualTimeScheduler;\n  }(Scheduler));\n\n  /** Provides a virtual time scheduler that uses Date for absolute time and number for relative time. */\n  Rx.HistoricalScheduler = (function (__super__) {\n    inherits(HistoricalScheduler, __super__);\n\n    /**\n     * Creates a new historical scheduler with the specified initial clock value.\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function HistoricalScheduler(initialClock, comparer) {\n      var clock = initialClock == null ? 0 : initialClock;\n      var cmp = comparer || defaultSubComparer;\n      __super__.call(this, clock, cmp);\n    }\n\n    var HistoricalSchedulerProto = HistoricalScheduler.prototype;\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    HistoricalSchedulerProto.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n\n    HistoricalSchedulerProto.toDateTimeOffset = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @memberOf HistoricalScheduler\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    HistoricalSchedulerProto.toRelative = function (timeSpan) {\n      return timeSpan;\n    };\n\n    return HistoricalScheduler;\n  }(Rx.VirtualTimeScheduler));\n\n  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {\n    inherits(AnonymousObservable, __super__);\n\n    // Fix subscriber to check for undefined or function returned to decorate as Disposable\n    function fixSubscriber(subscriber) {\n      if (subscriber && typeof subscriber.dispose === 'function') { return subscriber; }\n\n      return typeof subscriber === 'function' ?\n        disposableCreate(subscriber) :\n        disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], subscribe = state[1];\n      try {\n        ado.setDisposable(fixSubscriber(subscribe(ado)));\n      } catch (e) {\n        if (!ado.fail(e)) { throw e; }\n      }\n    }\n\n    function AnonymousObservable(subscribe, parent) {\n      this.source = parent;\n\n      function s(observer) {\n\n        var ado = new AutoDetachObserver(observer), state = [ado, subscribe];\n\n        if (currentThreadScheduler.scheduleRequired()) {\n          currentThreadScheduler.scheduleWithState(state, setDisposable);\n        } else {\n          setDisposable(null, state);\n        }\n\n        return ado;\n      }\n\n      __super__.call(this, s);\n    }\n\n    return AnonymousObservable;\n\n  }(Observable));\n\n  var AutoDetachObserver = (function (__super__) {\n    inherits(AutoDetachObserver, __super__);\n\n    function AutoDetachObserver(observer) {\n      __super__.call(this);\n      this.observer = observer;\n      this.m = new SingleAssignmentDisposable();\n    }\n\n    var AutoDetachObserverPrototype = AutoDetachObserver.prototype;\n\n    AutoDetachObserverPrototype.next = function (value) {\n      var noError = false;\n      try {\n        this.observer.onNext(value);\n        noError = true;\n      } catch (e) {\n        throw e;\n      } finally {\n        !noError && this.dispose();\n      }\n    };\n\n    AutoDetachObserverPrototype.error = function (err) {\n      try {\n        this.observer.onError(err);\n      } catch (e) {\n        throw e;\n      } finally {\n        this.dispose();\n      }\n    };\n\n    AutoDetachObserverPrototype.completed = function () {\n      try {\n        this.observer.onCompleted();\n      } catch (e) {\n        throw e;\n      } finally {\n        this.dispose();\n      }\n    };\n\n    AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };\n    AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };\n\n    AutoDetachObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.m.dispose();\n    };\n\n    return AutoDetachObserver;\n  }(AbstractObserver));\n\n  var GroupedObservable = (function (__super__) {\n    inherits(GroupedObservable, __super__);\n\n    function subscribe(observer) {\n      return this.underlyingObservable.subscribe(observer);\n    }\n\n    function GroupedObservable(key, underlyingObservable, mergedDisposable) {\n      __super__.call(this, subscribe);\n      this.key = key;\n      this.underlyingObservable = !mergedDisposable ?\n        underlyingObservable :\n        new AnonymousObservable(function (observer) {\n          return new CompositeDisposable(mergedDisposable.getDisposable(), underlyingObservable.subscribe(observer));\n        });\n    }\n\n    return GroupedObservable;\n  }(Observable));\n\n  /**\n   *  Represents an object that is both an observable sequence as well as an observer.\n   *  Each notification is broadcasted to all subscribed observers.\n   */\n  var Subject = Rx.Subject = (function (__super__) {\n    function subscribe(observer) {\n      checkDisposed(this);\n      if (!this.isStopped) {\n        this.observers.push(observer);\n        return new InnerSubscription(this, observer);\n      }\n      if (this.hasError) {\n        observer.onError(this.error);\n        return disposableEmpty;\n      }\n      observer.onCompleted();\n      return disposableEmpty;\n    }\n\n    inherits(Subject, __super__);\n\n    /**\n     * Creates a subject.\n     */\n    function Subject() {\n      __super__.call(this, subscribe);\n      this.isDisposed = false,\n      this.isStopped = false,\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(Subject.prototype, Observer.prototype, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onCompleted();\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.error = error;\n          this.hasError = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onNext(value);\n          }\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    /**\n     * Creates a subject from the specified observer and observable.\n     * @param {Observer} observer The observer used to send messages to the subject.\n     * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n     * @returns {Subject} Subject implemented using the given observer and observable.\n     */\n    Subject.create = function (observer, observable) {\n      return new AnonymousSubject(observer, observable);\n    };\n\n    return Subject;\n  }(Observable));\n\n  /**\n   *  Represents the result of an asynchronous operation.\n   *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n   */\n  var AsyncSubject = Rx.AsyncSubject = (function (__super__) {\n\n    function subscribe(observer) {\n      checkDisposed(this);\n\n      if (!this.isStopped) {\n        this.observers.push(observer);\n        return new InnerSubscription(this, observer);\n      }\n\n      if (this.hasError) {\n        observer.onError(this.error);\n      } else if (this.hasValue) {\n        observer.onNext(this.value);\n        observer.onCompleted();\n      } else {\n        observer.onCompleted();\n      }\n\n      return disposableEmpty;\n    }\n\n    inherits(AsyncSubject, __super__);\n\n    /**\n     * Creates a subject that can only receive one value and that value is cached for all future observations.\n     * @constructor\n     */\n    function AsyncSubject() {\n      __super__.call(this, subscribe);\n\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasValue = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(AsyncSubject.prototype, Observer, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () {\n        checkDisposed(this);\n        return this.observers.length > 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n       */\n      onCompleted: function () {\n        var i, len;\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          var os = cloneArray(this.observers), len = os.length;\n\n          if (this.hasValue) {\n            for (i = 0; i < len; i++) {\n              var o = os[i];\n              o.onNext(this.value);\n              o.onCompleted();\n            }\n          } else {\n            for (i = 0; i < len; i++) {\n              os[i].onCompleted();\n            }\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the error.\n       * @param {Mixed} error The Error to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.hasError = true;\n          this.error = error;\n\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n       * @param {Mixed} value The value to store in the subject.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        this.hasValue = true;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.exception = null;\n        this.value = null;\n      }\n    });\n\n    return AsyncSubject;\n  }(Observable));\n\n  var AnonymousSubject = Rx.AnonymousSubject = (function (__super__) {\n    inherits(AnonymousSubject, __super__);\n\n    function subscribe(observer) {\n      return this.observable.subscribe(observer);\n    }\n\n    function AnonymousSubject(observer, observable) {\n      this.observer = observer;\n      this.observable = observable;\n      __super__.call(this, subscribe);\n    }\n\n    addProperties(AnonymousSubject.prototype, Observer.prototype, {\n      onCompleted: function () {\n        this.observer.onCompleted();\n      },\n      onError: function (error) {\n        this.observer.onError(error);\n      },\n      onNext: function (value) {\n        this.observer.onNext(value);\n      }\n    });\n\n    return AnonymousSubject;\n  }(Observable));\n\n  /**\n  * Used to pause and resume streams.\n  */\n  Rx.Pauser = (function (__super__) {\n    inherits(Pauser, __super__);\n\n    function Pauser() {\n      __super__.call(this);\n    }\n\n    /**\n     * Pauses the underlying sequence.\n     */\n    Pauser.prototype.pause = function () { this.onNext(false); };\n\n    /**\n    * Resumes the underlying sequence.\n    */\n    Pauser.prototype.resume = function () { this.onNext(true); };\n\n    return Pauser;\n  }(Subject));\n\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    root.Rx = Rx;\n\n    define(function() {\n      return Rx;\n    });\n  } else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = Rx).Rx = Rx;\n    } else {\n      freeExports.Rx = Rx;\n    }\n  } else {\n    // in a browser or Rhino\n    root.Rx = Rx;\n  }\n\n  // All code before this point will be filtered from stack traces.\n  var rEndingLine = captureLine();\n\n}.call(this));\n"
  },
  {
    "path": "tests/perf/old/rx.async.compat.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n    var objectTypes = {\n        'boolean': false,\n        'function': true,\n        'object': true,\n        'number': false,\n        'string': false,\n        'undefined': false\n    };\n\n    var root = (objectTypes[typeof window] && window) || this,\n        freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n        freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n        moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n        freeGlobal = objectTypes[typeof global] && global;\n\n    if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n        root = freeGlobal;\n    }\n\n    // Because of build optimizers\n    if (typeof define === 'function' && define.amd) {\n        define(['rx.binding', 'exports'], function (Rx, exports) {\n            root.Rx = factory(root, exports, Rx);\n            return root.Rx;\n        });\n    } else if (typeof module === 'object' && module && module.exports === freeExports) {\n        module.exports = factory(root, module.exports, require('./rx'));\n    } else {\n        root.Rx = factory(root, {}, root.Rx);\n    }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Aliases\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    observableFromPromise = Observable.fromPromise,\n    observableThrow = Observable.throwException,\n    AnonymousObservable = Rx.AnonymousObservable,\n    AsyncSubject = Rx.AsyncSubject,\n    disposableCreate = Rx.Disposable.create,\n    CompositeDisposable = Rx.CompositeDisposable,\n    immediateScheduler = Rx.Scheduler.immediate,\n    timeoutScheduler = Rx.Scheduler.timeout,\n    isScheduler = Rx.helpers.isScheduler,\n    slice = Array.prototype.slice;\n\n  var fnString = 'function',\n      throwString = 'throw',\n      isObject = Rx.internals.isObject;\n\n  function toThunk(obj, ctx) {\n    if (Array.isArray(obj)) {  return objectToThunk.call(ctx, obj); }\n    if (isGeneratorFunction(obj)) { return observableSpawn(obj.call(ctx)); }\n    if (isGenerator(obj)) {  return observableSpawn(obj); }\n    if (isObservable(obj)) { return observableToThunk(obj); }\n    if (isPromise(obj)) { return promiseToThunk(obj); }\n    if (typeof obj === fnString) { return obj; }\n    if (isObject(obj) || Array.isArray(obj)) { return objectToThunk.call(ctx, obj); }\n\n    return obj;\n  }\n\n  function objectToThunk(obj) {\n    var ctx = this;\n\n    return function (done) {\n      var keys = Object.keys(obj),\n          pending = keys.length,\n          results = new obj.constructor(),\n          finished;\n\n      if (!pending) {\n        timeoutScheduler.schedule(function () { done(null, results); });\n        return;\n      }\n\n      for (var i = 0, len = keys.length; i < len; i++) {\n        run(obj[keys[i]], keys[i]);\n      }\n\n      function run(fn, key) {\n        if (finished) { return; }\n        try {\n          fn = toThunk(fn, ctx);\n\n          if (typeof fn !== fnString) {\n            results[key] = fn;\n            return --pending || done(null, results);\n          }\n\n          fn.call(ctx, function(err, res) {\n            if (finished) { return; }\n\n            if (err) {\n              finished = true;\n              return done(err);\n            }\n\n            results[key] = res;\n            --pending || done(null, results);\n          });\n        } catch (e) {\n          finished = true;\n          done(e);\n        }\n      }\n    }\n  }\n\n  function observableToThunk(observable) {\n    return function (fn) {\n      var value, hasValue = false;\n      observable.subscribe(\n        function (v) {\n          value = v;\n          hasValue = true;\n        },\n        fn,\n        function () {\n          hasValue && fn(null, value);\n        });\n    }\n  }\n\n  function promiseToThunk(promise) {\n    return function(fn) {\n      promise.then(function(res) {\n        fn(null, res);\n      }, fn);\n    }\n  }\n\n  function isObservable(obj) {\n    return obj && typeof obj.subscribe === fnString;\n  }\n\n  function isGeneratorFunction(obj) {\n    return obj && obj.constructor && obj.constructor.name === 'GeneratorFunction';\n  }\n\n  function isGenerator(obj) {\n    return obj && typeof obj.next === fnString && typeof obj[throwString] === fnString;\n  }\n\n  /*\n   * Spawns a generator function which allows for Promises, Observable sequences, Arrays, Objects, Generators and functions.\n   * @param {Function} The spawning function.\n   * @returns {Function} a function which has a done continuation.\n   */\n  var observableSpawn = Rx.spawn = function (fn) {\n    var isGenFun = isGeneratorFunction(fn);\n\n    return function (done) {\n      var ctx = this,\n        gen = fn;\n\n      if (isGenFun) {\n        for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n        var len = args.length,\n          hasCallback = len && typeof args[len - 1] === fnString;\n\n        done = hasCallback ? args.pop() : handleError;\n        gen = fn.apply(this, args);\n      } else {\n        done = done || handleError;\n      }\n\n      next();\n\n      function exit(err, res) {\n        timeoutScheduler.schedule(done.bind(ctx, err, res));\n      }\n\n      function next(err, res) {\n        var ret;\n\n        // multiple args\n        if (arguments.length > 2) {\n          for(var res = [], i = 1, len = arguments.length; i < len; i++) { res.push(arguments[i]); }\n        }\n\n        if (err) {\n          try {\n            ret = gen[throwString](err);\n          } catch (e) {\n            return exit(e);\n          }\n        }\n\n        if (!err) {\n          try {\n            ret = gen.next(res);\n          } catch (e) {\n            return exit(e);\n          }\n        }\n\n        if (ret.done)  {\n          return exit(null, ret.value);\n        }\n\n        ret.value = toThunk(ret.value, ctx);\n\n        if (typeof ret.value === fnString) {\n          var called = false;\n          try {\n            ret.value.call(ctx, function() {\n              if (called) {\n                return;\n              }\n\n              called = true;\n              next.apply(ctx, arguments);\n            });\n          } catch (e) {\n            timeoutScheduler.schedule(function () {\n              if (called) {\n                return;\n              }\n\n              called = true;\n              next.call(ctx, e);\n            });\n          }\n          return;\n        }\n\n        // Not supported\n        next(new TypeError('Rx.spawn only supports a function, Promise, Observable, Object or Array.'));\n      }\n    }\n  };\n\n  function handleError(err) {\n    if (!err) { return; }\n    timeoutScheduler.schedule(function() {\n      throw err;\n    });\n  }\n\n  /**\n   * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.\n   *\n   * @example\n   * var res = Rx.Observable.start(function () { console.log('hello'); });\n   * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout);\n   * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console);\n   *\n   * @param {Function} func Function to run asynchronously.\n   * @param {Scheduler} [scheduler]  Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param [context]  The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   *\n   * Remarks\n   * * The function is called immediately, not during the subscription of the resulting sequence.\n   * * Multiple subscriptions to the resulting sequence can observe the function's result.\n   */\n  Observable.start = function (func, context, scheduler) {\n    return observableToAsync(func, context, scheduler)();\n  };\n\n  /**\n   * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n   * @param {Function} function Function to convert to an asynchronous function.\n   * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Function} Asynchronous function.\n   */\n  var observableToAsync = Observable.toAsync = function (func, context, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return function () {\n      var args = arguments,\n        subject = new AsyncSubject();\n\n      scheduler.schedule(function () {\n        var result;\n        try {\n          result = func.apply(context, args);\n        } catch (e) {\n          subject.onError(e);\n          return;\n        }\n        subject.onNext(result);\n        subject.onCompleted();\n      });\n      return subject.asObservable();\n    };\n  };\n\n  /**\n   * Converts a callback function to an observable sequence.\n   *\n   * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n   * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n   */\n  Observable.fromCallback = function (func, context, selector) {\n    return function () {\n      for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n      return new AnonymousObservable(function (observer) {\n        function handler() {\n          var results = arguments;\n\n          if (selector) {\n            try {\n              results = selector(results);\n            } catch (err) {\n              return observer.onError(err);\n            }\n\n            observer.onNext(results);\n          } else {\n            if (results.length <= 1) {\n              observer.onNext.apply(observer, results);\n            } else {\n              observer.onNext(results);\n            }\n          }\n\n          observer.onCompleted();\n        }\n\n        args.push(handler);\n        func.apply(context, args);\n      }).publishLast().refCount();\n    };\n  };\n\n  /**\n   * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n   * @param {Function} func The function to call\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n   * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n   */\n  Observable.fromNodeCallback = function (func, context, selector) {\n    return function () {\n      for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n      return new AnonymousObservable(function (observer) {\n        function handler(err) {\n          if (err) {\n            observer.onError(err);\n            return;\n          }\n\n          for(var results = [], i = 1, len = arguments.length; i < len; i++) { results.push(arguments[i]); }\n\n          if (selector) {\n            try {\n              results = selector(results);\n            } catch (e) {\n              return observer.onError(e);\n            }\n            observer.onNext(results);\n          } else {\n            if (results.length <= 1) {\n              observer.onNext.apply(observer, results);\n            } else {\n              observer.onNext(results);\n            }\n          }\n\n          observer.onCompleted();\n        }\n\n        args.push(handler);\n        func.apply(context, args);\n      }).publishLast().refCount();\n    };\n  };\n\n  function fixEvent(event) {\n    var stopPropagation = function () {\n      this.cancelBubble = true;\n    };\n\n    var preventDefault = function () {\n      this.bubbledKeyCode = this.keyCode;\n      if (this.ctrlKey) {\n        try {\n          this.keyCode = 0;\n        } catch (e) { }\n      }\n      this.defaultPrevented = true;\n      this.returnValue = false;\n      this.modified = true;\n    };\n\n    event || (event = root.event);\n    if (!event.target) {\n      event.target = event.target || event.srcElement;\n\n      if (event.type == 'mouseover') {\n        event.relatedTarget = event.fromElement;\n      }\n      if (event.type == 'mouseout') {\n        event.relatedTarget = event.toElement;\n      }\n      // Adding stopPropogation and preventDefault to IE\n      if (!event.stopPropagation) {\n        event.stopPropagation = stopPropagation;\n        event.preventDefault = preventDefault;\n      }\n      // Normalize key events\n      switch (event.type) {\n        case 'keypress':\n          var c = ('charCode' in event ? event.charCode : event.keyCode);\n          if (c == 10) {\n            c = 0;\n            event.keyCode = 13;\n          } else if (c == 13 || c == 27) {\n            c = 0;\n          } else if (c == 3) {\n            c = 99;\n          }\n          event.charCode = c;\n          event.keyChar = event.charCode ? String.fromCharCode(event.charCode) : '';\n          break;\n      }\n    }\n\n    return event;\n  }\n\n  function createListener (element, name, handler) {\n    // Standards compliant\n    if (element.addEventListener) {\n      element.addEventListener(name, handler, false);\n      return disposableCreate(function () {\n        element.removeEventListener(name, handler, false);\n      });\n    }\n    if (element.attachEvent) {\n      // IE Specific\n      var innerHandler = function (event) {\n        handler(fixEvent(event));\n      };\n      element.attachEvent('on' + name, innerHandler);\n      return disposableCreate(function () {\n        element.detachEvent('on' + name, innerHandler);\n      });\n    }\n    // Level 1 DOM Events\n    element['on' + name] = handler;\n    return disposableCreate(function () {\n      element['on' + name] = null;\n    });\n  }\n\n  function createEventListener (el, eventName, handler) {\n    var disposables = new CompositeDisposable();\n\n    // Asume NodeList\n    if (Object.prototype.toString.call(el) === '[object NodeList]') {\n      for (var i = 0, len = el.length; i < len; i++) {\n        disposables.add(createEventListener(el.item(i), eventName, handler));\n      }\n    } else if (el) {\n      disposables.add(createListener(el, eventName, handler));\n    }\n\n    return disposables;\n  }\n\n  /**\n   * Configuration option to determine whether to use native events only\n   */\n  Rx.config.useNativeEvents = false;\n\n  /**\n   * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n   *\n   * @example\n   *   var source = Rx.Observable.fromEvent(element, 'mouseup');\n   *\n   * @param {Object} element The DOMElement or NodeList to attach a listener.\n   * @param {String} eventName The event name to attach the observable sequence.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n   */\n  Observable.fromEvent = function (element, eventName, selector) {\n    // Node.js specific\n    if (element.addListener) {\n      return fromEventPattern(\n        function (h) { element.addListener(eventName, h); },\n        function (h) { element.removeListener(eventName, h); },\n        selector);\n    }\n\n    // Use only if non-native events are allowed\n    if (!Rx.config.useNativeEvents) {\n      // Handles jq, Angular.js, Zepto, Marionette\n      if (typeof element.on === 'function' && typeof element.off === 'function') {\n        return fromEventPattern(\n          function (h) { element.on(eventName, h); },\n          function (h) { element.off(eventName, h); },\n          selector);\n      }\n      if (!!root.Ember && typeof root.Ember.addListener === 'function') {\n        return fromEventPattern(\n          function (h) { Ember.addListener(element, eventName, h); },\n          function (h) { Ember.removeListener(element, eventName, h); },\n          selector);\n        }\n    }\n    return new AnonymousObservable(function (observer) {\n      return createEventListener(\n        element,\n        eventName,\n        function handler (e) {\n          var results = e;\n\n          if (selector) {\n            try {\n              results = selector(arguments);\n            } catch (err) {\n              observer.onError(err);\n              return\n            }\n          }\n\n          observer.onNext(results);\n        });\n    }).publish().refCount();\n  };\n\n  /**\n   * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n   * @param {Function} addHandler The function to add a handler to the emitter.\n   * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence which wraps an event from an event emitter\n   */\n  var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) {\n    return new AnonymousObservable(function (observer) {\n      function innerHandler (e) {\n        var result = e;\n        if (selector) {\n          try {\n            result = selector(arguments);\n          } catch (err) {\n            observer.onError(err);\n            return;\n          }\n        }\n        observer.onNext(result);\n      }\n\n      var returnValue = addHandler(innerHandler);\n      return disposableCreate(function () {\n        if (removeHandler) {\n          removeHandler(innerHandler, returnValue);\n        }\n      });\n    }).publish().refCount();\n  };\n\n  /**\n   * Invokes the asynchronous function, surfacing the result through an observable sequence.\n   * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   */\n  Observable.startAsync = function (functionAsync) {\n    var promise;\n    try {\n      promise = functionAsync();\n    } catch (e) {\n      return observableThrow(e);\n    }\n    return observableFromPromise(promise);\n  }\n\n    return Rx;\n}));\n"
  },
  {
    "path": "tests/perf/old/rx.async.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n    var objectTypes = {\n        'boolean': false,\n        'function': true,\n        'object': true,\n        'number': false,\n        'string': false,\n        'undefined': false\n    };\n\n    var root = (objectTypes[typeof window] && window) || this,\n        freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n        freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n        moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n        freeGlobal = objectTypes[typeof global] && global;\n\n    if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n        root = freeGlobal;\n    }\n\n    // Because of build optimizers\n    if (typeof define === 'function' && define.amd) {\n        define(['rx.binding', 'exports'], function (Rx, exports) {\n            root.Rx = factory(root, exports, Rx);\n            return root.Rx;\n        });\n    } else if (typeof module === 'object' && module && module.exports === freeExports) {\n        module.exports = factory(root, module.exports, require('./rx'));\n    } else {\n        root.Rx = factory(root, {}, root.Rx);\n    }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Aliases\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    observableFromPromise = Observable.fromPromise,\n    observableThrow = Observable.throwException,\n    AnonymousObservable = Rx.AnonymousObservable,\n    AsyncSubject = Rx.AsyncSubject,\n    disposableCreate = Rx.Disposable.create,\n    CompositeDisposable = Rx.CompositeDisposable,\n    immediateScheduler = Rx.Scheduler.immediate,\n    timeoutScheduler = Rx.Scheduler.timeout,\n    isScheduler = Rx.helpers.isScheduler,\n    slice = Array.prototype.slice;\n\n  var fnString = 'function',\n      throwString = 'throw',\n      isObject = Rx.internals.isObject;\n\n  function toThunk(obj, ctx) {\n    if (Array.isArray(obj)) {  return objectToThunk.call(ctx, obj); }\n    if (isGeneratorFunction(obj)) { return observableSpawn(obj.call(ctx)); }\n    if (isGenerator(obj)) {  return observableSpawn(obj); }\n    if (isObservable(obj)) { return observableToThunk(obj); }\n    if (isPromise(obj)) { return promiseToThunk(obj); }\n    if (typeof obj === fnString) { return obj; }\n    if (isObject(obj) || Array.isArray(obj)) { return objectToThunk.call(ctx, obj); }\n\n    return obj;\n  }\n\n  function objectToThunk(obj) {\n    var ctx = this;\n\n    return function (done) {\n      var keys = Object.keys(obj),\n          pending = keys.length,\n          results = new obj.constructor(),\n          finished;\n\n      if (!pending) {\n        timeoutScheduler.schedule(function () { done(null, results); });\n        return;\n      }\n\n      for (var i = 0, len = keys.length; i < len; i++) {\n        run(obj[keys[i]], keys[i]);\n      }\n\n      function run(fn, key) {\n        if (finished) { return; }\n        try {\n          fn = toThunk(fn, ctx);\n\n          if (typeof fn !== fnString) {\n            results[key] = fn;\n            return --pending || done(null, results);\n          }\n\n          fn.call(ctx, function(err, res) {\n            if (finished) { return; }\n\n            if (err) {\n              finished = true;\n              return done(err);\n            }\n\n            results[key] = res;\n            --pending || done(null, results);\n          });\n        } catch (e) {\n          finished = true;\n          done(e);\n        }\n      }\n    }\n  }\n\n  function observableToThunk(observable) {\n    return function (fn) {\n      var value, hasValue = false;\n      observable.subscribe(\n        function (v) {\n          value = v;\n          hasValue = true;\n        },\n        fn,\n        function () {\n          hasValue && fn(null, value);\n        });\n    }\n  }\n\n  function promiseToThunk(promise) {\n    return function(fn) {\n      promise.then(function(res) {\n        fn(null, res);\n      }, fn);\n    }\n  }\n\n  function isObservable(obj) {\n    return obj && typeof obj.subscribe === fnString;\n  }\n\n  function isGeneratorFunction(obj) {\n    return obj && obj.constructor && obj.constructor.name === 'GeneratorFunction';\n  }\n\n  function isGenerator(obj) {\n    return obj && typeof obj.next === fnString && typeof obj[throwString] === fnString;\n  }\n\n  /*\n   * Spawns a generator function which allows for Promises, Observable sequences, Arrays, Objects, Generators and functions.\n   * @param {Function} The spawning function.\n   * @returns {Function} a function which has a done continuation.\n   */\n  var observableSpawn = Rx.spawn = function (fn) {\n    var isGenFun = isGeneratorFunction(fn);\n\n    return function (done) {\n      var ctx = this,\n        gen = fn;\n\n      if (isGenFun) {\n        for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n        var len = args.length,\n          hasCallback = len && typeof args[len - 1] === fnString;\n\n        done = hasCallback ? args.pop() : handleError;\n        gen = fn.apply(this, args);\n      } else {\n        done = done || handleError;\n      }\n\n      next();\n\n      function exit(err, res) {\n        timeoutScheduler.schedule(done.bind(ctx, err, res));\n      }\n\n      function next(err, res) {\n        var ret;\n\n        // multiple args\n        if (arguments.length > 2) {\n          for(var res = [], i = 1, len = arguments.length; i < len; i++) { res.push(arguments[i]); }\n        }\n\n        if (err) {\n          try {\n            ret = gen[throwString](err);\n          } catch (e) {\n            return exit(e);\n          }\n        }\n\n        if (!err) {\n          try {\n            ret = gen.next(res);\n          } catch (e) {\n            return exit(e);\n          }\n        }\n\n        if (ret.done)  {\n          return exit(null, ret.value);\n        }\n\n        ret.value = toThunk(ret.value, ctx);\n\n        if (typeof ret.value === fnString) {\n          var called = false;\n          try {\n            ret.value.call(ctx, function() {\n              if (called) {\n                return;\n              }\n\n              called = true;\n              next.apply(ctx, arguments);\n            });\n          } catch (e) {\n            timeoutScheduler.schedule(function () {\n              if (called) {\n                return;\n              }\n\n              called = true;\n              next.call(ctx, e);\n            });\n          }\n          return;\n        }\n\n        // Not supported\n        next(new TypeError('Rx.spawn only supports a function, Promise, Observable, Object or Array.'));\n      }\n    }\n  };\n\n  function handleError(err) {\n    if (!err) { return; }\n    timeoutScheduler.schedule(function() {\n      throw err;\n    });\n  }\n\n  /**\n   * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.\n   *\n   * @example\n   * var res = Rx.Observable.start(function () { console.log('hello'); });\n   * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout);\n   * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console);\n   *\n   * @param {Function} func Function to run asynchronously.\n   * @param {Scheduler} [scheduler]  Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param [context]  The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   *\n   * Remarks\n   * * The function is called immediately, not during the subscription of the resulting sequence.\n   * * Multiple subscriptions to the resulting sequence can observe the function's result.\n   */\n  Observable.start = function (func, context, scheduler) {\n    return observableToAsync(func, context, scheduler)();\n  };\n\n  /**\n   * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n   * @param {Function} function Function to convert to an asynchronous function.\n   * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @returns {Function} Asynchronous function.\n   */\n  var observableToAsync = Observable.toAsync = function (func, context, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return function () {\n      var args = arguments,\n        subject = new AsyncSubject();\n\n      scheduler.schedule(function () {\n        var result;\n        try {\n          result = func.apply(context, args);\n        } catch (e) {\n          subject.onError(e);\n          return;\n        }\n        subject.onNext(result);\n        subject.onCompleted();\n      });\n      return subject.asObservable();\n    };\n  };\n\n  /**\n   * Converts a callback function to an observable sequence.\n   *\n   * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n   * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n   */\n  Observable.fromCallback = function (func, context, selector) {\n    return function () {\n      for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n      return new AnonymousObservable(function (observer) {\n        function handler() {\n          var results = arguments;\n\n          if (selector) {\n            try {\n              results = selector(results);\n            } catch (err) {\n              return observer.onError(err);\n            }\n\n            observer.onNext(results);\n          } else {\n            if (results.length <= 1) {\n              observer.onNext.apply(observer, results);\n            } else {\n              observer.onNext(results);\n            }\n          }\n\n          observer.onCompleted();\n        }\n\n        args.push(handler);\n        func.apply(context, args);\n      }).publishLast().refCount();\n    };\n  };\n\n  /**\n   * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n   * @param {Function} func The function to call\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n   * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n   */\n  Observable.fromNodeCallback = function (func, context, selector) {\n    return function () {\n      for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n      return new AnonymousObservable(function (observer) {\n        function handler(err) {\n          if (err) {\n            observer.onError(err);\n            return;\n          }\n\n          for(var results = [], i = 1, len = arguments.length; i < len; i++) { results.push(arguments[i]); }\n\n          if (selector) {\n            try {\n              results = selector(results);\n            } catch (e) {\n              return observer.onError(e);\n            }\n            observer.onNext(results);\n          } else {\n            if (results.length <= 1) {\n              observer.onNext.apply(observer, results);\n            } else {\n              observer.onNext(results);\n            }\n          }\n\n          observer.onCompleted();\n        }\n\n        args.push(handler);\n        func.apply(context, args);\n      }).publishLast().refCount();\n    };\n  };\n\n  function createListener (element, name, handler) {\n    if (element.addEventListener) {\n      element.addEventListener(name, handler, false);\n      return disposableCreate(function () {\n        element.removeEventListener(name, handler, false);\n      });\n    }\n    throw new Error('No listener found');\n  }\n\n  function createEventListener (el, eventName, handler) {\n    var disposables = new CompositeDisposable();\n\n    // Asume NodeList\n    if (Object.prototype.toString.call(el) === '[object NodeList]') {\n      for (var i = 0, len = el.length; i < len; i++) {\n        disposables.add(createEventListener(el.item(i), eventName, handler));\n      }\n    } else if (el) {\n      disposables.add(createListener(el, eventName, handler));\n    }\n\n    return disposables;\n  }\n\n  /**\n   * Configuration option to determine whether to use native events only\n   */\n  Rx.config.useNativeEvents = false;\n\n  /**\n   * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n   *\n   * @example\n   *   var source = Rx.Observable.fromEvent(element, 'mouseup');\n   *\n   * @param {Object} element The DOMElement or NodeList to attach a listener.\n   * @param {String} eventName The event name to attach the observable sequence.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n   */\n  Observable.fromEvent = function (element, eventName, selector) {\n    // Node.js specific\n    if (element.addListener) {\n      return fromEventPattern(\n        function (h) { element.addListener(eventName, h); },\n        function (h) { element.removeListener(eventName, h); },\n        selector);\n    }\n\n    // Use only if non-native events are allowed\n    if (!Rx.config.useNativeEvents) {\n      // Handles jq, Angular.js, Zepto, Marionette\n      if (typeof element.on === 'function' && typeof element.off === 'function') {\n        return fromEventPattern(\n          function (h) { element.on(eventName, h); },\n          function (h) { element.off(eventName, h); },\n          selector);\n      }\n      if (!!root.Ember && typeof root.Ember.addListener === 'function') {\n        return fromEventPattern(\n          function (h) { Ember.addListener(element, eventName, h); },\n          function (h) { Ember.removeListener(element, eventName, h); },\n          selector);\n      }\n    }\n    return new AnonymousObservable(function (observer) {\n      return createEventListener(\n        element,\n        eventName,\n        function handler (e) {\n          var results = e;\n\n          if (selector) {\n            try {\n              results = selector(arguments);\n            } catch (err) {\n              observer.onError(err);\n              return\n            }\n          }\n\n          observer.onNext(results);\n        });\n    }).publish().refCount();\n  };\n\n  /**\n   * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n   * @param {Function} addHandler The function to add a handler to the emitter.\n   * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence which wraps an event from an event emitter\n   */\n  var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) {\n    return new AnonymousObservable(function (observer) {\n      function innerHandler (e) {\n        var result = e;\n        if (selector) {\n          try {\n            result = selector(arguments);\n          } catch (err) {\n            observer.onError(err);\n            return;\n          }\n        }\n        observer.onNext(result);\n      }\n\n      var returnValue = addHandler(innerHandler);\n      return disposableCreate(function () {\n        if (removeHandler) {\n          removeHandler(innerHandler, returnValue);\n        }\n      });\n    }).publish().refCount();\n  };\n\n  /**\n   * Invokes the asynchronous function, surfacing the result through an observable sequence.\n   * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   */\n  Observable.startAsync = function (functionAsync) {\n    var promise;\n    try {\n      promise = functionAsync();\n    } catch (e) {\n      return observableThrow(e);\n    }\n    return observableFromPromise(promise);\n  }\n\n    return Rx;\n}));\n"
  },
  {
    "path": "tests/perf/old/rx.backpressure.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n    var objectTypes = {\n        'boolean': false,\n        'function': true,\n        'object': true,\n        'number': false,\n        'string': false,\n        'undefined': false\n    };\n\n    var root = (objectTypes[typeof window] && window) || this,\n        freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n        freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n        moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n        freeGlobal = objectTypes[typeof global] && global;\n\n    if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n        root = freeGlobal;\n    }\n\n    // Because of build optimizers\n    if (typeof define === 'function' && define.amd) {\n        define(['rx'], function (Rx, exports) {\n            return factory(root, exports, Rx);\n        });\n    } else if (typeof module === 'object' && module && module.exports === freeExports) {\n        module.exports = factory(root, module.exports, require('./rx'));\n    } else {\n        root.Rx = factory(root, {}, root.Rx);\n    }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // References\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    AbstractObserver = Rx.internals.AbstractObserver,\n    CompositeDisposable = Rx.CompositeDisposable,\n    Subject = Rx.Subject,\n    Observer = Rx.Observer,\n    disposableEmpty = Rx.Disposable.empty,\n    disposableCreate = Rx.Disposable.create,\n    inherits = Rx.internals.inherits,\n    addProperties = Rx.internals.addProperties,\n    timeoutScheduler = Rx.Scheduler.timeout,\n    currentThreadScheduler = Rx.Scheduler.currentThread,\n    identity = Rx.helpers.identity;\n\n  var objectDisposed = 'Object has been disposed';\n  function checkDisposed() { if (this.isDisposed) { throw new Error(objectDisposed); } }\n\n  /**\n  * Used to pause and resume streams.\n  */\n  Rx.Pauser = (function (__super__) {\n    inherits(Pauser, __super__);\n\n    function Pauser() {\n      __super__.call(this);\n    }\n\n    /**\n     * Pauses the underlying sequence.\n     */\n    Pauser.prototype.pause = function () { this.onNext(false); };\n\n    /**\n    * Resumes the underlying sequence.\n    */\n    Pauser.prototype.resume = function () { this.onNext(true); };\n\n    return Pauser;\n  }(Subject));\n\n  var PausableObservable = (function (__super__) {\n\n    inherits(PausableObservable, __super__);\n\n    function subscribe(observer) {\n      var conn = this.source.publish(),\n        subscription = conn.subscribe(observer),\n        connection = disposableEmpty;\n\n      var pausable = this.pauser.distinctUntilChanged().subscribe(function (b) {\n        if (b) {\n          connection = conn.connect();\n        } else {\n          connection.dispose();\n          connection = disposableEmpty;\n        }\n      });\n\n      return new CompositeDisposable(subscription, connection, pausable);\n    }\n\n    function PausableObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this, subscribe, source);\n    }\n\n    PausableObservable.prototype.pause = function () {\n      this.controller.onNext(false);\n    };\n\n    PausableObservable.prototype.resume = function () {\n      this.controller.onNext(true);\n    };\n\n    return PausableObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausable(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausable = function (pauser) {\n    return new PausableObservable(this, pauser);\n  };\n\n  function combineLatestSource(source, subject, resultSelector) {\n    return new AnonymousObservable(function (o) {\n      var hasValue = [false, false],\n        hasValueAll = false,\n        isDone = false,\n        values = new Array(2),\n        err;\n\n      function next(x, i) {\n        values[i] = x\n        var res;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          if (err) {\n            o.onError(err);\n            return;\n          }\n\n          try {\n            res = resultSelector.apply(null, values);\n          } catch (ex) {\n            o.onError(ex);\n            return;\n          }\n          o.onNext(res);\n        }\n        if (isDone && values[1]) {\n          o.onCompleted();\n        }\n      }\n\n      return new CompositeDisposable(\n        source.subscribe(\n          function (x) {\n            next(x, 0);\n          },\n          function (e) {\n            if (values[1]) {\n              o.onError(e);\n            } else {\n              err = e;\n            }\n          },\n          function () {\n            isDone = true;\n            values[1] && o.onCompleted();\n          }),\n        subject.subscribe(\n          function (x) {\n            next(x, 1);\n          },\n          function (e) { o.onError(e); },\n          function () {\n            isDone = true;\n            next(true, 1);\n          })\n        );\n    }, source);\n  }\n\n  var PausableBufferedObservable = (function (__super__) {\n\n    inherits(PausableBufferedObservable, __super__);\n\n    function subscribe(o) {\n      var q = [], previousShouldFire;\n\n      var subscription =\n        combineLatestSource(\n          this.source,\n          this.pauser.distinctUntilChanged().startWith(false),\n          function (data, shouldFire) {\n            return { data: data, shouldFire: shouldFire };\n          })\n          .subscribe(\n            function (results) {\n              if (previousShouldFire !== undefined && results.shouldFire != previousShouldFire) {\n                previousShouldFire = results.shouldFire;\n                // change in shouldFire\n                if (results.shouldFire) {\n                  while (q.length > 0) {\n                    o.onNext(q.shift());\n                  }\n                }\n              } else {\n                previousShouldFire = results.shouldFire;\n                // new data\n                if (results.shouldFire) {\n                  o.onNext(results.data);\n                } else {\n                  q.push(results.data);\n                }\n              }\n            },\n            function (err) {\n              // Empty buffer before sending error\n              while (q.length > 0) {\n                o.onNext(q.shift());\n              }\n              o.onError(err);\n            },\n            function () {\n              // Empty buffer before sending completion\n              while (q.length > 0) {\n                o.onNext(q.shift());\n              }\n              o.onCompleted();\n            }\n          );\n      return subscription;\n    }\n\n    function PausableBufferedObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this, subscribe, source);\n    }\n\n    PausableBufferedObservable.prototype.pause = function () {\n      this.controller.onNext(false);\n    };\n\n    PausableBufferedObservable.prototype.resume = function () {\n      this.controller.onNext(true);\n    };\n\n    return PausableBufferedObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n   * and yields the values that were buffered while paused.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausableBuffered = function (subject) {\n    return new PausableBufferedObservable(this, subject);\n  };\n\n  var ControlledObservable = (function (__super__) {\n\n    inherits(ControlledObservable, __super__);\n\n    function subscribe (observer) {\n      return this.source.subscribe(observer);\n    }\n\n    function ControlledObservable (source, enableQueue) {\n      __super__.call(this, subscribe, source);\n      this.subject = new ControlledSubject(enableQueue);\n      this.source = source.multicast(this.subject).refCount();\n    }\n\n    ControlledObservable.prototype.request = function (numberOfItems) {\n      if (numberOfItems == null) { numberOfItems = -1; }\n      return this.subject.request(numberOfItems);\n    };\n\n    return ControlledObservable;\n\n  }(Observable));\n\n  var ControlledSubject = (function (__super__) {\n\n    function subscribe (observer) {\n      return this.subject.subscribe(observer);\n    }\n\n    inherits(ControlledSubject, __super__);\n\n    function ControlledSubject(enableQueue) {\n      enableQueue == null && (enableQueue = true);\n\n      __super__.call(this, subscribe);\n      this.subject = new Subject();\n      this.enableQueue = enableQueue;\n      this.queue = enableQueue ? [] : null;\n      this.requestedCount = 0;\n      this.requestedDisposable = disposableEmpty;\n      this.error = null;\n      this.hasFailed = false;\n      this.hasCompleted = false;\n      this.controlledDisposable = disposableEmpty;\n    }\n\n    addProperties(ControlledSubject.prototype, Observer, {\n      onCompleted: function () {\n        this.hasCompleted = true;\n        (!this.enableQueue || this.queue.length === 0) && this.subject.onCompleted();\n      },\n      onError: function (error) {\n        this.hasFailed = true;\n        this.error = error;\n        (!this.enableQueue || this.queue.length === 0) && this.subject.onError(error);\n      },\n      onNext: function (value) {\n        var hasRequested = false;\n\n        if (this.requestedCount === 0) {\n          this.enableQueue && this.queue.push(value);\n        } else {\n          (this.requestedCount !== -1 && this.requestedCount-- === 0) && this.disposeCurrentRequest();\n          hasRequested = true;\n        }\n        hasRequested && this.subject.onNext(value);\n      },\n      _processRequest: function (numberOfItems) {\n        if (this.enableQueue) {\n          while (this.queue.length >= numberOfItems && numberOfItems > 0) {\n            this.subject.onNext(this.queue.shift());\n            numberOfItems--;\n          }\n\n          return this.queue.length !== 0 ?\n            { numberOfItems: numberOfItems, returnValue: true } :\n            { numberOfItems: numberOfItems, returnValue: false };\n        }\n\n        if (this.hasFailed) {\n          this.subject.onError(this.error);\n          this.controlledDisposable.dispose();\n          this.controlledDisposable = disposableEmpty;\n        } else if (this.hasCompleted) {\n          this.subject.onCompleted();\n          this.controlledDisposable.dispose();\n          this.controlledDisposable = disposableEmpty;\n        }\n\n        return { numberOfItems: numberOfItems, returnValue: false };\n      },\n      request: function (number) {\n        this.disposeCurrentRequest();\n        var self = this, r = this._processRequest(number);\n\n        var number = r.numberOfItems;\n        if (!r.returnValue) {\n          this.requestedCount = number;\n          this.requestedDisposable = disposableCreate(function () {\n            self.requestedCount = 0;\n          });\n\n          return this.requestedDisposable\n        } else {\n          return disposableEmpty;\n        }\n      },\n      disposeCurrentRequest: function () {\n        this.requestedDisposable.dispose();\n        this.requestedDisposable = disposableEmpty;\n      }\n    });\n\n    return ControlledSubject;\n  }(Observable));\n\n  /**\n   * Attaches a controller to the observable sequence with the ability to queue.\n   * @example\n   * var source = Rx.Observable.interval(100).controlled();\n   * source.request(3); // Reads 3 values\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.controlled = function (enableQueue) {\n    if (enableQueue == null) {  enableQueue = true; }\n    return new ControlledObservable(this, enableQueue);\n  };\n\n  var StopAndWaitObservable = (function (__super__) {\n\n    function subscribe (observer) {\n      this.subscription = this.source.subscribe(new StopAndWaitObserver(observer, this, this.subscription));\n\n      var self = this;\n      timeoutScheduler.schedule(function () { self.source.request(1); });\n\n      return this.subscription;\n    }\n\n    inherits(StopAndWaitObservable, __super__);\n\n    function StopAndWaitObservable (source) {\n      __super__.call(this, subscribe, source);\n      this.source = source;\n    }\n\n    var StopAndWaitObserver = (function (__sub__) {\n\n      inherits(StopAndWaitObserver, __sub__);\n\n      function StopAndWaitObserver (observer, observable, cancel) {\n        __sub__.call(this);\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n      }\n\n      var stopAndWaitObserverProto = StopAndWaitObserver.prototype;\n\n      stopAndWaitObserverProto.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      stopAndWaitObserverProto.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      }\n\n      stopAndWaitObserverProto.next = function (value) {\n        this.observer.onNext(value);\n\n        var self = this;\n        timeoutScheduler.schedule(function () {\n          self.observable.source.request(1);\n        });\n      };\n\n      stopAndWaitObserverProto.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return StopAndWaitObserver;\n    }(AbstractObserver));\n\n    return StopAndWaitObservable;\n  }(Observable));\n\n\n  /**\n   * Attaches a stop and wait observable to the current observable.\n   * @returns {Observable} A stop and wait observable.\n   */\n  ControlledObservable.prototype.stopAndWait = function () {\n    return new StopAndWaitObservable(this);\n  };\n\n  var WindowedObservable = (function (__super__) {\n\n    function subscribe (observer) {\n      this.subscription = this.source.subscribe(new WindowedObserver(observer, this, this.subscription));\n\n      var self = this;\n      timeoutScheduler.schedule(function () {\n        self.source.request(self.windowSize);\n      });\n\n      return this.subscription;\n    }\n\n    inherits(WindowedObservable, __super__);\n\n    function WindowedObservable(source, windowSize) {\n      __super__.call(this, subscribe, source);\n      this.source = source;\n      this.windowSize = windowSize;\n    }\n\n    var WindowedObserver = (function (__sub__) {\n\n      inherits(WindowedObserver, __sub__);\n\n      function WindowedObserver(observer, observable, cancel) {\n        this.observer = observer;\n        this.observable = observable;\n        this.cancel = cancel;\n        this.received = 0;\n      }\n\n      var windowedObserverPrototype = WindowedObserver.prototype;\n\n      windowedObserverPrototype.completed = function () {\n        this.observer.onCompleted();\n        this.dispose();\n      };\n\n      windowedObserverPrototype.error = function (error) {\n        this.observer.onError(error);\n        this.dispose();\n      };\n\n      windowedObserverPrototype.next = function (value) {\n        this.observer.onNext(value);\n\n        this.received = ++this.received % this.observable.windowSize;\n        if (this.received === 0) {\n          var self = this;\n          timeoutScheduler.schedule(function () {\n            self.observable.source.request(self.observable.windowSize);\n          });\n        }\n      };\n\n      windowedObserverPrototype.dispose = function () {\n        this.observer = null;\n        if (this.cancel) {\n          this.cancel.dispose();\n          this.cancel = null;\n        }\n        __sub__.prototype.dispose.call(this);\n      };\n\n      return WindowedObserver;\n    }(AbstractObserver));\n\n    return WindowedObservable;\n  }(Observable));\n\n  /**\n   * Creates a sliding windowed observable based upon the window size.\n   * @param {Number} windowSize The number of items in the window\n   * @returns {Observable} A windowed observable based upon the window size.\n   */\n  ControlledObservable.prototype.windowed = function (windowSize) {\n    return new WindowedObservable(this, windowSize);\n  };\n\n    return Rx;\n}));\n"
  },
  {
    "path": "tests/perf/old/rx.binding.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n    var objectTypes = {\n        'boolean': false,\n        'function': true,\n        'object': true,\n        'number': false,\n        'string': false,\n        'undefined': false\n    };\n\n    var root = (objectTypes[typeof window] && window) || this,\n        freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n        freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n        moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n        freeGlobal = objectTypes[typeof global] && global;\n\n    if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n        root = freeGlobal;\n    }\n\n    // Because of build optimizers\n    if (typeof define === 'function' && define.amd) {\n        define(['rx'], function (Rx, exports) {\n            return factory(root, exports, Rx);\n        });\n    } else if (typeof module === 'object' && module && module.exports === freeExports) {\n        module.exports = factory(root, module.exports, require('./rx'));\n    } else {\n        root.Rx = factory(root, {}, root.Rx);\n    }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    Subject = Rx.Subject,\n    AsyncSubject = Rx.AsyncSubject,\n    Observer = Rx.Observer,\n    ScheduledObserver = Rx.internals.ScheduledObserver,\n    disposableCreate = Rx.Disposable.create,\n    disposableEmpty = Rx.Disposable.empty,\n    CompositeDisposable = Rx.CompositeDisposable,\n    currentThreadScheduler = Rx.Scheduler.currentThread,\n    isFunction = Rx.helpers.isFunction,\n    inherits = Rx.internals.inherits,\n    addProperties = Rx.internals.addProperties;\n\n  // Utilities\n  var objectDisposed = 'Object has been disposed';\n  function checkDisposed(self) { if (self.isDisposed) { throw new Error(objectDisposed); } }\n  function cloneArray(arr) { for(var a = [], i = 0, len = arr.length; i < len; i++) { a.push(arr[i]); } return a;}\n\n  /**\n   * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n   * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n   * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n   *\n   * @example\n   * 1 - res = source.multicast(observable);\n   * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n   *\n   * @param {Function|Subject} subjectOrSubjectSelector\n   * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n   * Or:\n   * Subject to push source elements into.\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.multicast = function (subjectOrSubjectSelector, selector) {\n    var source = this;\n    return typeof subjectOrSubjectSelector === 'function' ?\n      new AnonymousObservable(function (observer) {\n        var connectable = source.multicast(subjectOrSubjectSelector());\n        return new CompositeDisposable(selector(connectable).subscribe(observer), connectable.connect());\n      }, source) :\n      new ConnectableObservable(source, subjectOrSubjectSelector);\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of Multicast using a regular Subject.\n   *\n   * @example\n   * var resres = source.publish();\n   * var res = source.publish(function (x) { return x; });\n   *\n   * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publish = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new Subject(); }, selector) :\n      this.multicast(new Subject());\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.share = function () {\n    return this.publish().refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n   * This operator is a specialization of Multicast using a AsyncSubject.\n   *\n   * @example\n   * var res = source.publishLast();\n   * var res = source.publishLast(function (x) { return x; });\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishLast = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new AsyncSubject(); }, selector) :\n      this.multicast(new AsyncSubject());\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n   * This operator is a specialization of Multicast using a BehaviorSubject.\n   *\n   * @example\n   * var res = source.publishValue(42);\n   * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishValue = function (initialValueOrSelector, initialValue) {\n    return arguments.length === 2 ?\n      this.multicast(function () {\n        return new BehaviorSubject(initialValue);\n      }, initialValueOrSelector) :\n      this.multicast(new BehaviorSubject(initialValueOrSelector));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n   * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareValue = function (initialValue) {\n    return this.publishValue(initialValue).refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of Multicast using a ReplaySubject.\n   *\n   * @example\n   * var res = source.replay(null, 3);\n   * var res = source.replay(null, 3, 500);\n   * var res = source.replay(null, 3, 500, scheduler);\n   * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.replay = function (selector, bufferSize, window, scheduler) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new ReplaySubject(bufferSize, window, scheduler); }, selector) :\n      this.multicast(new ReplaySubject(bufferSize, window, scheduler));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   *\n   * @example\n   * var res = source.shareReplay(3);\n   * var res = source.shareReplay(3, 500);\n   * var res = source.shareReplay(3, 500, scheduler);\n   *\n\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareReplay = function (bufferSize, window, scheduler) {\n    return this.replay(null, bufferSize, window, scheduler).refCount();\n  };\n\n  var InnerSubscription = function (subject, observer) {\n    this.subject = subject;\n    this.observer = observer;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this.subject.isDisposed && this.observer !== null) {\n      var idx = this.subject.observers.indexOf(this.observer);\n      this.subject.observers.splice(idx, 1);\n      this.observer = null;\n    }\n  };\n\n  /**\n   *  Represents a value that changes over time.\n   *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n   */\n  var BehaviorSubject = Rx.BehaviorSubject = (function (__super__) {\n    function subscribe(observer) {\n      checkDisposed(this);\n      if (!this.isStopped) {\n        this.observers.push(observer);\n        observer.onNext(this.value);\n        return new InnerSubscription(this, observer);\n      }\n      if (this.hasError) {\n        observer.onError(this.error);\n      } else {\n        observer.onCompleted();\n      }\n      return disposableEmpty;\n    }\n\n    inherits(BehaviorSubject, __super__);\n\n    /**\n     *  Initializes a new instance of the BehaviorSubject class which creates a subject that caches its last value and starts with the specified value.\n     *  @param {Mixed} value Initial value sent to observers when no other value has been received by the subject yet.\n     */\n    function BehaviorSubject(value) {\n      __super__.call(this, subscribe);\n      this.value = value,\n      this.observers = [],\n      this.isDisposed = false,\n      this.isStopped = false,\n      this.hasError = false;\n    }\n\n    addProperties(BehaviorSubject.prototype, Observer, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onCompleted();\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.hasError = true;\n        this.error = error;\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onError(error);\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onNext(value);\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.value = null;\n        this.exception = null;\n      }\n    });\n\n    return BehaviorSubject;\n  }(Observable));\n\n  /**\n   * Represents an object that is both an observable sequence as well as an observer.\n   * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n   */\n  var ReplaySubject = Rx.ReplaySubject = (function (__super__) {\n\n    function createRemovableDisposable(subject, observer) {\n      return disposableCreate(function () {\n        observer.dispose();\n        !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n      });\n    }\n\n    function subscribe(observer) {\n      var so = new ScheduledObserver(this.scheduler, observer),\n        subscription = createRemovableDisposable(this, so);\n      checkDisposed(this);\n      this._trim(this.scheduler.now());\n      this.observers.push(so);\n\n      for (var i = 0, len = this.q.length; i < len; i++) {\n        so.onNext(this.q[i].value);\n      }\n\n      if (this.hasError) {\n        so.onError(this.error);\n      } else if (this.isStopped) {\n        so.onCompleted();\n      }\n\n      so.ensureActive();\n      return subscription;\n    }\n\n    inherits(ReplaySubject, __super__);\n\n    /**\n     *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n     *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n     *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n     *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n     */\n    function ReplaySubject(bufferSize, windowSize, scheduler) {\n      this.bufferSize = bufferSize == null ? Number.MAX_VALUE : bufferSize;\n      this.windowSize = windowSize == null ? Number.MAX_VALUE : windowSize;\n      this.scheduler = scheduler || currentThreadScheduler;\n      this.q = [];\n      this.observers = [];\n      this.isStopped = false;\n      this.isDisposed = false;\n      this.hasError = false;\n      this.error = null;\n      __super__.call(this, subscribe);\n    }\n\n    addProperties(ReplaySubject.prototype, Observer.prototype, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () {\n        return this.observers.length > 0;\n      },\n      _trim: function (now) {\n        while (this.q.length > this.bufferSize) {\n          this.q.shift();\n        }\n        while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {\n          this.q.shift();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        var now = this.scheduler.now();\n        this.q.push({ interval: now, value: value });\n        this._trim(now);\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onNext(value);\n          observer.ensureActive();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.error = error;\n        this.hasError = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onError(error);\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onCompleted();\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    return ReplaySubject;\n  }(Observable));\n\n  var ConnectableObservable = Rx.ConnectableObservable = (function (__super__) {\n    inherits(ConnectableObservable, __super__);\n\n    function ConnectableObservable(source, subject) {\n      var hasSubscription = false,\n        subscription,\n        sourceObservable = source.asObservable();\n\n      this.connect = function () {\n        if (!hasSubscription) {\n          hasSubscription = true;\n          subscription = new CompositeDisposable(sourceObservable.subscribe(subject), disposableCreate(function () {\n            hasSubscription = false;\n          }));\n        }\n        return subscription;\n      };\n\n      __super__.call(this, function (o) { return subject.subscribe(o); });\n    }\n\n    ConnectableObservable.prototype.refCount = function () {\n      var connectableSubscription, count = 0, source = this;\n      return new AnonymousObservable(function (observer) {\n          var shouldConnect = ++count === 1,\n            subscription = source.subscribe(observer);\n          shouldConnect && (connectableSubscription = source.connect());\n          return function () {\n            subscription.dispose();\n            --count === 0 && connectableSubscription.dispose();\n          };\n      });\n    };\n\n    return ConnectableObservable;\n  }(Observable));\n\n    return Rx;\n}));\n"
  },
  {
    "path": "tests/perf/old/rx.coincidence.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n    var objectTypes = {\n        'boolean': false,\n        'function': true,\n        'object': true,\n        'number': false,\n        'string': false,\n        'undefined': false\n    };\n\n    var root = (objectTypes[typeof window] && window) || this,\n        freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n        freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n        moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n        freeGlobal = objectTypes[typeof global] && global;\n\n    if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n        root = freeGlobal;\n    }\n\n    // Because of build optimizers\n    if (typeof define === 'function' && define.amd) {\n        define(['rx'], function (Rx, exports) {\n            return factory(root, exports, Rx);\n        });\n    } else if (typeof module === 'object' && module && module.exports === freeExports) {\n        module.exports = factory(root, module.exports, require('./rx'));\n    } else {\n        root.Rx = factory(root, {}, root.Rx);\n    }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  var Observable = Rx.Observable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    Subject = Rx.Subject,\n    observableProto = Observable.prototype,\n    observableEmpty = Observable.empty,\n    observableNever = Observable.never,\n    AnonymousObservable = Rx.AnonymousObservable,\n    observerCreate = Rx.Observer.create,\n    addRef = Rx.internals.addRef,\n    defaultComparer = Rx.internals.isEqual,\n    inherits = Rx.internals.inherits,\n    noop = Rx.helpers.noop,\n    identity = Rx.helpers.identity,\n    isPromise = Rx.helpers.isPromise,\n    observableFromPromise = Observable.fromPromise;\n\n  var Dictionary = (function () {\n\n    var primes = [1, 3, 7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, 65521, 131071, 262139, 524287, 1048573, 2097143, 4194301, 8388593, 16777213, 33554393, 67108859, 134217689, 268435399, 536870909, 1073741789, 2147483647],\n      noSuchkey = \"no such key\",\n      duplicatekey = \"duplicate key\";\n\n    function isPrime(candidate) {\n      if ((candidate & 1) === 0) { return candidate === 2; }\n      var num1 = Math.sqrt(candidate),\n        num2 = 3;\n      while (num2 <= num1) {\n        if (candidate % num2 === 0) { return false; }\n        num2 += 2;\n      }\n      return true;\n    }\n\n    function getPrime(min) {\n      var index, num, candidate;\n      for (index = 0; index < primes.length; ++index) {\n        num = primes[index];\n        if (num >= min) { return num; }\n      }\n      candidate = min | 1;\n      while (candidate < primes[primes.length - 1]) {\n        if (isPrime(candidate)) { return candidate; }\n        candidate += 2;\n      }\n      return min;\n    }\n\n    function stringHashFn(str) {\n      var hash = 757602046;\n      if (!str.length) { return hash; }\n      for (var i = 0, len = str.length; i < len; i++) {\n        var character = str.charCodeAt(i);\n        hash = ((hash << 5) - hash) + character;\n        hash = hash & hash;\n      }\n      return hash;\n    }\n\n    function numberHashFn(key) {\n      var c2 = 0x27d4eb2d;\n      key = (key ^ 61) ^ (key >>> 16);\n      key = key + (key << 3);\n      key = key ^ (key >>> 4);\n      key = key * c2;\n      key = key ^ (key >>> 15);\n      return key;\n    }\n\n    var getHashCode = (function () {\n      var uniqueIdCounter = 0;\n\n      return function (obj) {\n        if (obj == null) { throw new Error(noSuchkey); }\n\n        // Check for built-ins before tacking on our own for any object\n        if (typeof obj === 'string') { return stringHashFn(obj); }\n        if (typeof obj === 'number') { return numberHashFn(obj); }\n        if (typeof obj === 'boolean') { return obj === true ? 1 : 0; }\n        if (obj instanceof Date) { return numberHashFn(obj.valueOf()); }\n        if (obj instanceof RegExp) { return stringHashFn(obj.toString()); }\n        if (typeof obj.valueOf === 'function') {\n          // Hack check for valueOf\n          var valueOf = obj.valueOf();\n          if (typeof valueOf === 'number') { return numberHashFn(valueOf); }\n          if (typeof valueOf === 'string') { return stringHashFn(valueOf); }\n        }\n        if (obj.hashCode) { return obj.hashCode(); }\n\n        var id = 17 * uniqueIdCounter++;\n        obj.hashCode = function () { return id; };\n        return id;\n      };\n    }());\n\n    function newEntry() {\n      return { key: null, value: null, next: 0, hashCode: 0 };\n    }\n\n    function Dictionary(capacity, comparer) {\n      if (capacity < 0) { throw new Error('out of range'); }\n      if (capacity > 0) { this._initialize(capacity); }\n\n      this.comparer = comparer || defaultComparer;\n      this.freeCount = 0;\n      this.size = 0;\n      this.freeList = -1;\n    }\n\n    var dictionaryProto = Dictionary.prototype;\n\n    dictionaryProto._initialize = function (capacity) {\n      var prime = getPrime(capacity), i;\n      this.buckets = new Array(prime);\n      this.entries = new Array(prime);\n      for (i = 0; i < prime; i++) {\n        this.buckets[i] = -1;\n        this.entries[i] = newEntry();\n      }\n      this.freeList = -1;\n    };\n\n    dictionaryProto.add = function (key, value) {\n      this._insert(key, value, true);\n    };\n\n    dictionaryProto._insert = function (key, value, add) {\n      if (!this.buckets) { this._initialize(0); }\n      var index3,\n        num = getHashCode(key) & 2147483647,\n        index1 = num % this.buckets.length;\n      for (var index2 = this.buckets[index1]; index2 >= 0; index2 = this.entries[index2].next) {\n        if (this.entries[index2].hashCode === num && this.comparer(this.entries[index2].key, key)) {\n          if (add) { throw new Error(duplicatekey); }\n          this.entries[index2].value = value;\n          return;\n        }\n      }\n      if (this.freeCount > 0) {\n        index3 = this.freeList;\n        this.freeList = this.entries[index3].next;\n        --this.freeCount;\n      } else {\n        if (this.size === this.entries.length) {\n          this._resize();\n          index1 = num % this.buckets.length;\n        }\n        index3 = this.size;\n        ++this.size;\n      }\n      this.entries[index3].hashCode = num;\n      this.entries[index3].next = this.buckets[index1];\n      this.entries[index3].key = key;\n      this.entries[index3].value = value;\n      this.buckets[index1] = index3;\n    };\n\n    dictionaryProto._resize = function () {\n      var prime = getPrime(this.size * 2),\n        numArray = new Array(prime);\n      for (index = 0; index < numArray.length; ++index) {  numArray[index] = -1; }\n      var entryArray = new Array(prime);\n      for (index = 0; index < this.size; ++index) { entryArray[index] = this.entries[index]; }\n      for (var index = this.size; index < prime; ++index) { entryArray[index] = newEntry(); }\n      for (var index1 = 0; index1 < this.size; ++index1) {\n        var index2 = entryArray[index1].hashCode % prime;\n        entryArray[index1].next = numArray[index2];\n        numArray[index2] = index1;\n      }\n      this.buckets = numArray;\n      this.entries = entryArray;\n    };\n\n    dictionaryProto.remove = function (key) {\n      if (this.buckets) {\n        var num = getHashCode(key) & 2147483647,\n          index1 = num % this.buckets.length,\n          index2 = -1;\n        for (var index3 = this.buckets[index1]; index3 >= 0; index3 = this.entries[index3].next) {\n          if (this.entries[index3].hashCode === num && this.comparer(this.entries[index3].key, key)) {\n            if (index2 < 0) {\n              this.buckets[index1] = this.entries[index3].next;\n            } else {\n              this.entries[index2].next = this.entries[index3].next;\n            }\n            this.entries[index3].hashCode = -1;\n            this.entries[index3].next = this.freeList;\n            this.entries[index3].key = null;\n            this.entries[index3].value = null;\n            this.freeList = index3;\n            ++this.freeCount;\n            return true;\n          } else {\n            index2 = index3;\n          }\n        }\n      }\n      return false;\n    };\n\n    dictionaryProto.clear = function () {\n      var index, len;\n      if (this.size <= 0) { return; }\n      for (index = 0, len = this.buckets.length; index < len; ++index) {\n        this.buckets[index] = -1;\n      }\n      for (index = 0; index < this.size; ++index) {\n        this.entries[index] = newEntry();\n      }\n      this.freeList = -1;\n      this.size = 0;\n    };\n\n    dictionaryProto._findEntry = function (key) {\n      if (this.buckets) {\n        var num = getHashCode(key) & 2147483647;\n        for (var index = this.buckets[num % this.buckets.length]; index >= 0; index = this.entries[index].next) {\n          if (this.entries[index].hashCode === num && this.comparer(this.entries[index].key, key)) {\n            return index;\n          }\n        }\n      }\n      return -1;\n    };\n\n    dictionaryProto.count = function () {\n      return this.size - this.freeCount;\n    };\n\n    dictionaryProto.tryGetValue = function (key) {\n      var entry = this._findEntry(key);\n      return entry >= 0 ?\n        this.entries[entry].value :\n        undefined;\n    };\n\n    dictionaryProto.getValues = function () {\n      var index = 0, results = [];\n      if (this.entries) {\n        for (var index1 = 0; index1 < this.size; index1++) {\n          if (this.entries[index1].hashCode >= 0) {\n            results[index++] = this.entries[index1].value;\n          }\n        }\n      }\n      return results;\n    };\n\n    dictionaryProto.get = function (key) {\n      var entry = this._findEntry(key);\n      if (entry >= 0) { return this.entries[entry].value; }\n      throw new Error(noSuchkey);\n    };\n\n    dictionaryProto.set = function (key, value) {\n      this._insert(key, value, false);\n    };\n\n    dictionaryProto.containskey = function (key) {\n      return this._findEntry(key) >= 0;\n    };\n\n    return Dictionary;\n  }());\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters passed to the function correspond with the elements from the left and right source sequences for which overlap occurs.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.join = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (observer) {\n      var group = new CompositeDisposable();\n      var leftDone = false, rightDone = false;\n      var leftId = 0, rightId = 0;\n      var leftMap = new Dictionary(), rightMap = new Dictionary();\n\n      group.add(left.subscribe(\n        function (value) {\n          var id = leftId++;\n          var md = new SingleAssignmentDisposable();\n\n          leftMap.add(id, value);\n          group.add(md);\n\n          var expire = function () {\n            leftMap.remove(id) && leftMap.count() === 0 && leftDone && observer.onCompleted();\n            group.remove(md);\n          };\n\n          var duration;\n          try {\n            duration = leftDurationSelector(value);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n\n          md.setDisposable(duration.take(1).subscribe(noop, observer.onError.bind(observer), expire));\n\n          rightMap.getValues().forEach(function (v) {\n            var result;\n            try {\n              result = resultSelector(value, v);\n            } catch (exn) {\n              observer.onError(exn);\n              return;\n            }\n\n            observer.onNext(result);\n          });\n        },\n        observer.onError.bind(observer),\n        function () {\n          leftDone = true;\n          (rightDone || leftMap.count() === 0) && observer.onCompleted();\n        })\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++;\n          var md = new SingleAssignmentDisposable();\n\n          rightMap.add(id, value);\n          group.add(md);\n\n          var expire = function () {\n            rightMap.remove(id) && rightMap.count() === 0 && rightDone && observer.onCompleted();\n            group.remove(md);\n          };\n\n          var duration;\n          try {\n            duration = rightDurationSelector(value);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n\n          md.setDisposable(duration.take(1).subscribe(noop, observer.onError.bind(observer), expire));\n\n          leftMap.getValues().forEach(function (v) {\n            var result;\n            try {\n              result = resultSelector(v, value);\n            } catch (exn) {\n              observer.onError(exn);\n              return;\n            }\n\n            observer.onNext(result);\n          });\n        },\n        observer.onError.bind(observer),\n        function () {\n          rightDone = true;\n          (leftDone || rightMap.count() === 0) && observer.onCompleted();\n        })\n      );\n      return group;\n    }, left);\n  };\n\n  /**\n   *  Correlates the elements of two sequences based on overlapping durations, and groups the results.\n   *\n   *  @param {Observable} right The right observable sequence to join elements for.\n   *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n   *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n   *  @param {Function} resultSelector A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. The first parameter passed to the function is an element of the left sequence. The second parameter passed to the function is an observable sequence with elements from the right sequence that overlap with the left sequence's element.\n   *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n   */\n  observableProto.groupJoin = function (right, leftDurationSelector, rightDurationSelector, resultSelector) {\n    var left = this;\n    return new AnonymousObservable(function (observer) {\n      var group = new CompositeDisposable();\n      var r = new RefCountDisposable(group);\n      var leftMap = new Dictionary(), rightMap = new Dictionary();\n      var leftId = 0, rightId = 0;\n\n      function handleError(e) { return function (v) { v.onError(e); }; };\n\n      group.add(left.subscribe(\n        function (value) {\n          var s = new Subject();\n          var id = leftId++;\n          leftMap.add(id, s);\n\n          var result;\n          try {\n            result = resultSelector(value, addRef(s, r));\n          } catch (e) {\n            leftMap.getValues().forEach(handleError(e));\n            observer.onError(e);\n            return;\n          }\n          observer.onNext(result);\n\n          rightMap.getValues().forEach(function (v) { s.onNext(v); });\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var expire = function () {\n            leftMap.remove(id) && s.onCompleted();\n            group.remove(md);\n          };\n\n          var duration;\n          try {\n            duration = leftDurationSelector(value);\n          } catch (e) {\n            leftMap.getValues().forEach(handleError(e));\n            observer.onError(e);\n            return;\n          }\n\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.getValues().forEach(handleError(e));\n              observer.onError(e);\n            },\n            expire)\n          );\n        },\n        function (e) {\n          leftMap.getValues().forEach(handleError(e));\n          observer.onError(e);\n        },\n        observer.onCompleted.bind(observer))\n      );\n\n      group.add(right.subscribe(\n        function (value) {\n          var id = rightId++;\n          rightMap.add(id, value);\n\n          var md = new SingleAssignmentDisposable();\n          group.add(md);\n\n          var expire = function () {\n            rightMap.remove(id);\n            group.remove(md);\n          };\n\n          var duration;\n          try {\n            duration = rightDurationSelector(value);\n          } catch (e) {\n            leftMap.getValues().forEach(handleError(e));\n            observer.onError(e);\n            return;\n          }\n          md.setDisposable(duration.take(1).subscribe(\n            noop,\n            function (e) {\n              leftMap.getValues().forEach(handleError(e));\n              observer.onError(e);\n            },\n            expire)\n          );\n\n          leftMap.getValues().forEach(function (v) { v.onNext(value); });\n        },\n        function (e) {\n          leftMap.getValues().forEach(handleError(e));\n          observer.onError(e);\n        })\n      );\n\n      return r;\n    }, left);\n  };\n\n    /**\n     *  Projects each element of an observable sequence into zero or more buffers.\n     *\n     *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n     *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n     *  @returns {Observable} An observable sequence of windows.\n     */\n    observableProto.buffer = function (bufferOpeningsOrClosingSelector, bufferClosingSelector) {\n        return this.window.apply(this, arguments).selectMany(function (x) { return x.toArray(); });\n    };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows.\n   *\n   *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n   *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n   *  @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.window = function (windowOpeningsOrClosingSelector, windowClosingSelector) {\n    if (arguments.length === 1 && typeof arguments[0] !== 'function') {\n      return observableWindowWithBoundaries.call(this, windowOpeningsOrClosingSelector);\n    }\n    return typeof windowOpeningsOrClosingSelector === 'function' ?\n      observableWindowWithClosingSelector.call(this, windowOpeningsOrClosingSelector) :\n      observableWindowWithOpenings.call(this, windowOpeningsOrClosingSelector, windowClosingSelector);\n  };\n\n  function observableWindowWithOpenings(windowOpenings, windowClosingSelector) {\n    return windowOpenings.groupJoin(this, windowClosingSelector, observableEmpty, function (_, win) {\n      return win;\n    });\n  }\n\n  function observableWindowWithBoundaries(windowBoundaries) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var win = new Subject(),\n        d = new CompositeDisposable(),\n        r = new RefCountDisposable(d);\n\n      observer.onNext(addRef(win, r));\n\n      d.add(source.subscribe(function (x) {\n        win.onNext(x);\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      isPromise(windowBoundaries) && (windowBoundaries = observableFromPromise(windowBoundaries));\n\n      d.add(windowBoundaries.subscribe(function (w) {\n        win.onCompleted();\n        win = new Subject();\n        observer.onNext(addRef(win, r));\n      }, function (err) {\n        win.onError(err);\n        observer.onError(err);\n      }, function () {\n        win.onCompleted();\n        observer.onCompleted();\n      }));\n\n      return r;\n    }, source);\n  }\n\n  function observableWindowWithClosingSelector(windowClosingSelector) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        r = new RefCountDisposable(d),\n        win = new Subject();\n      observer.onNext(addRef(win, r));\n      d.add(source.subscribe(function (x) {\n          win.onNext(x);\n      }, function (err) {\n          win.onError(err);\n          observer.onError(err);\n      }, function () {\n          win.onCompleted();\n          observer.onCompleted();\n      }));\n\n      function createWindowClose () {\n        var windowClose;\n        try {\n          windowClose = windowClosingSelector();\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n\n        isPromise(windowClose) && (windowClose = observableFromPromise(windowClose));\n\n        var m1 = new SingleAssignmentDisposable();\n        m.setDisposable(m1);\n        m1.setDisposable(windowClose.take(1).subscribe(noop, function (err) {\n          win.onError(err);\n          observer.onError(err);\n        }, function () {\n          win.onCompleted();\n          win = new Subject();\n          observer.onNext(addRef(win, r));\n          createWindowClose();\n        }));\n      }\n\n      createWindowClose();\n      return r;\n    }, source);\n  }\n\n  /**\n   * Returns a new observable that triggers on the second and subsequent triggerings of the input observable.\n   * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair.\n   * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs.\n   * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array.\n   */\n  observableProto.pairwise = function () {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var previous, hasPrevious = false;\n      return source.subscribe(\n        function (x) {\n          if (hasPrevious) {\n            observer.onNext([previous, x]);\n          } else {\n            hasPrevious = true;\n          }\n          previous = x;\n        },\n        observer.onError.bind(observer),\n        observer.onCompleted.bind(observer));\n    }, source);\n  };\n\n  /**\n   * Returns two observables which partition the observations of the source by the given function.\n   * The first will trigger observations for those values for which the predicate returns true.\n   * The second will trigger observations for those values where the predicate returns false.\n   * The predicate is executed once for each subscribed observer.\n   * Both also propagate all error observations arising from the source and each completes\n   * when the source completes.\n   * @param {Function} predicate\n   *    The function to determine which output Observable will trigger a particular observation.\n   * @returns {Array}\n   *    An array of observables. The first triggers when the predicate returns true,\n   *    and the second triggers when the predicate returns false.\n  */\n  observableProto.partition = function(predicate, thisArg) {\n    return [\n      this.filter(predicate, thisArg),\n      this.filter(function (x, i, o) { return !predicate.call(thisArg, x, i, o); })\n    ];\n  };\n\n  /**\n   *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n   *\n   * @example\n   *  var res = observable.groupBy(function (x) { return x.id; });\n   *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n   *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n   * @param {Function} keySelector A function to extract the key for each element.\n   * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n   * @param {Function} [comparer] Used to determine whether the objects are equal.\n   * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n   */\n  observableProto.groupBy = function (keySelector, elementSelector, comparer) {\n    return this.groupByUntil(keySelector, elementSelector, observableNever, comparer);\n  };\n\n    /**\n     *  Groups the elements of an observable sequence according to a specified key selector function.\n     *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n     *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n     *\n     * @example\n     *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n     *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n     *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n     * @param {Function} keySelector A function to extract the key for each element.\n     * @param {Function} durationSelector A function to signal the expiration of a group.\n     * @param {Function} [comparer] Used to compare objects. When not specified, the default comparer is used.\n     * @returns {Observable}\n     *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n     *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n     *\n     */\n    observableProto.groupByUntil = function (keySelector, elementSelector, durationSelector, comparer) {\n      var source = this;\n      elementSelector || (elementSelector = identity);\n      comparer || (comparer = defaultComparer);\n      return new AnonymousObservable(function (observer) {\n        function handleError(e) { return function (item) { item.onError(e); }; }\n        var map = new Dictionary(0, comparer),\n          groupDisposable = new CompositeDisposable(),\n          refCountDisposable = new RefCountDisposable(groupDisposable);\n\n        groupDisposable.add(source.subscribe(function (x) {\n          var key;\n          try {\n            key = keySelector(x);\n          } catch (e) {\n            map.getValues().forEach(handleError(e));\n            observer.onError(e);\n            return;\n          }\n\n          var fireNewMapEntry = false,\n            writer = map.tryGetValue(key);\n          if (!writer) {\n            writer = new Subject();\n            map.set(key, writer);\n            fireNewMapEntry = true;\n          }\n\n          if (fireNewMapEntry) {\n            var group = new GroupedObservable(key, writer, refCountDisposable),\n              durationGroup = new GroupedObservable(key, writer);\n            try {\n              duration = durationSelector(durationGroup);\n            } catch (e) {\n              map.getValues().forEach(handleError(e));\n              observer.onError(e);\n              return;\n            }\n\n            observer.onNext(group);\n\n            var md = new SingleAssignmentDisposable();\n            groupDisposable.add(md);\n\n            var expire = function () {\n              map.remove(key) && writer.onCompleted();\n              groupDisposable.remove(md);\n            };\n\n            md.setDisposable(duration.take(1).subscribe(\n              noop,\n              function (exn) {\n                map.getValues().forEach(handleError(exn));\n                observer.onError(exn);\n              },\n              expire)\n            );\n          }\n\n          var element;\n          try {\n            element = elementSelector(x);\n          } catch (e) {\n            map.getValues().forEach(handleError(e));\n            observer.onError(e);\n            return;\n          }\n\n          writer.onNext(element);\n      }, function (ex) {\n        map.getValues().forEach(handleError(ex));\n        observer.onError(ex);\n      }, function () {\n        map.getValues().forEach(function (item) { item.onCompleted(); });\n        observer.onCompleted();\n      }));\n\n      return refCountDisposable;\n    }, source);\n  };\n\n  var GroupedObservable = (function (__super__) {\n    inherits(GroupedObservable, __super__);\n\n    function subscribe(observer) {\n      return this.underlyingObservable.subscribe(observer);\n    }\n\n    function GroupedObservable(key, underlyingObservable, mergedDisposable) {\n      __super__.call(this, subscribe);\n      this.key = key;\n      this.underlyingObservable = !mergedDisposable ?\n        underlyingObservable :\n        new AnonymousObservable(function (observer) {\n          return new CompositeDisposable(mergedDisposable.getDisposable(), underlyingObservable.subscribe(observer));\n        });\n    }\n\n    return GroupedObservable;\n  }(Observable));\n\n    return Rx;\n}));\n"
  },
  {
    "path": "tests/perf/old/rx.compat.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n;(function (undefined) {\n\n  var objectTypes = {\n    'boolean': false,\n    'function': true,\n    'object': true,\n    'number': false,\n    'string': false,\n    'undefined': false\n  };\n\n  var root = (objectTypes[typeof window] && window) || this,\n    freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n    freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n    moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n    freeGlobal = objectTypes[typeof global] && global;\n\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n    root = freeGlobal;\n  }\n\n  var Rx = {\n      internals: {},\n      config: {\n        Promise: root.Promise\n      },\n      helpers: { }\n  };\n\n  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    notDefined = Rx.helpers.notDefined = function (x) { return typeof x === 'undefined'; },\n    isScheduler = Rx.helpers.isScheduler = function (x) { return x instanceof Rx.Scheduler; },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    pluck = Rx.helpers.pluck = function (property) { return function (x) { return x[property]; }; },\n    just = Rx.helpers.just = function (value) { return function () { return value; }; },\n    defaultNow = Rx.helpers.defaultNow = (function () { return !!Date.now ? Date.now : function () { return +new Date; }; }()),\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.then === 'function'; },\n    asArray = Rx.helpers.asArray = function () { return Array.prototype.slice.call(arguments); },\n    not = Rx.helpers.not = function (a) { return !a; },\n    isFunction = Rx.helpers.isFunction = (function () {\n\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      }\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n\n      return isFn;\n    }());\n\n  // Errors\n  var sequenceContainsNoElements = 'Sequence contains no elements.';\n  var argumentOutOfRange = 'Argument out of range';\n  var objectDisposed = 'Object has been disposed';\n  function checkDisposed(self) { if (self.isDisposed) { throw new Error(objectDisposed); } }\n  function cloneArray(arr) { for(var a = [], i = 0, len = arr.length; i < len; i++) { a.push(arr[i]); } return a;}\n\n  Rx.config.longStackSupport = false;\n  var hasStacks = false;\n  try {\n    throw new Error();\n  } catch (e) {\n    hasStacks = !!e.stack;\n  }\n\n  // All code after this point will be filtered from stack traces reported by RxJS\n  var rStartingLine = captureLine(), rFileName;\n\n  var STACK_JUMP_SEPARATOR = \"From previous event:\";\n\n  function makeStackTraceLong(error, observable) {\n      // If possible, transform the error stack trace by removing Node and RxJS\n      // cruft, then concatenating with the stack trace of `observable`.\n      if (hasStacks &&\n          observable.stack &&\n          typeof error === \"object\" &&\n          error !== null &&\n          error.stack &&\n          error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n      ) {\n        var stacks = [];\n        for (var o = observable; !!o; o = o.source) {\n          if (o.stack) {\n            stacks.unshift(o.stack);\n          }\n        }\n        stacks.unshift(error.stack);\n\n        var concatedStacks = stacks.join(\"\\n\" + STACK_JUMP_SEPARATOR + \"\\n\");\n        error.stack = filterStackString(concatedStacks);\n    }\n  }\n\n  function filterStackString(stackString) {\n    var lines = stackString.split(\"\\n\"),\n        desiredLines = [];\n    for (var i = 0, len = lines.length; i < len; i++) {\n      var line = lines[i];\n\n      if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n        desiredLines.push(line);\n      }\n    }\n    return desiredLines.join(\"\\n\");\n  }\n\n  function isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n    if (!fileNameAndLineNumber) {\n      return false;\n    }\n    var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === rFileName &&\n      lineNumber >= rStartingLine &&\n      lineNumber <= rEndingLine;\n  }\n\n  function isNodeFrame(stackLine) {\n    return stackLine.indexOf(\"(module.js:\") !== -1 ||\n      stackLine.indexOf(\"(node.js:\") !== -1;\n  }\n\n  function captureLine() {\n    if (!hasStacks) { return; }\n\n    try {\n      throw new Error();\n    } catch (e) {\n      var lines = e.stack.split(\"\\n\");\n      var firstLine = lines[0].indexOf(\"@\") > 0 ? lines[1] : lines[2];\n      var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n      if (!fileNameAndLineNumber) { return; }\n\n      rFileName = fileNameAndLineNumber[0];\n      return fileNameAndLineNumber[1];\n    }\n  }\n\n  function getFileNameAndLineNumber(stackLine) {\n    // Named functions: \"at functionName (filename:lineNumber:columnNumber)\"\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }\n\n    // Anonymous functions: \"at filename:lineNumber:columnNumber\"\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }\n\n    // Firefox style: \"function@filename:lineNumber or @filename:lineNumber\"\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }\n  }\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o[$iterator$] !== undefined;\n  }\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  }\n\n  Rx.helpers.iterator = $iterator$;\n\n  var bindCallback = Rx.internals.bindCallback = function (func, thisArg, argCount) {\n    if (typeof thisArg === 'undefined') { return func; }\n    switch(argCount) {\n      case 0:\n        return function() {\n          return func.call(thisArg)\n        };\n      case 1:\n        return function(arg) {\n          return func.call(thisArg, arg);\n        }\n      case 2:\n        return function(value, index) {\n          return func.call(thisArg, value, index);\n        };\n      case 3:\n        return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n    }\n\n    return function() {\n      return func.apply(thisArg, arguments);\n    };\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var dontEnums = ['toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'],\n  dontEnumsLength = dontEnums.length;\n\n  /** `Object#toString` result shortcuts */\n  var argsClass = '[object Arguments]',\n    arrayClass = '[object Array]',\n    boolClass = '[object Boolean]',\n    dateClass = '[object Date]',\n    errorClass = '[object Error]',\n    funcClass = '[object Function]',\n    numberClass = '[object Number]',\n    objectClass = '[object Object]',\n    regexpClass = '[object RegExp]',\n    stringClass = '[object String]';\n\n  var toString = Object.prototype.toString,\n    hasOwnProperty = Object.prototype.hasOwnProperty,\n    supportsArgsClass = toString.call(arguments) == argsClass, // For less <IE9 && FF<4\n    supportNodeClass,\n    errorProto = Error.prototype,\n    objectProto = Object.prototype,\n    stringProto = String.prototype,\n    propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n  try {\n    supportNodeClass = !(toString.call(document) == objectClass && !({ 'toString': 0 } + ''));\n  } catch (e) {\n    supportNodeClass = true;\n  }\n\n  var nonEnumProps = {};\n  nonEnumProps[arrayClass] = nonEnumProps[dateClass] = nonEnumProps[numberClass] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true };\n  nonEnumProps[boolClass] = nonEnumProps[stringClass] = { 'constructor': true, 'toString': true, 'valueOf': true };\n  nonEnumProps[errorClass] = nonEnumProps[funcClass] = nonEnumProps[regexpClass] = { 'constructor': true, 'toString': true };\n  nonEnumProps[objectClass] = { 'constructor': true };\n\n  var support = {};\n  (function () {\n    var ctor = function() { this.x = 1; },\n      props = [];\n\n    ctor.prototype = { 'valueOf': 1, 'y': 1 };\n    for (var key in new ctor) { props.push(key); }\n    for (key in arguments) { }\n\n    // Detect if `name` or `message` properties of `Error.prototype` are enumerable by default.\n    support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') || propertyIsEnumerable.call(errorProto, 'name');\n\n    // Detect if `prototype` properties are enumerable by default.\n    support.enumPrototypes = propertyIsEnumerable.call(ctor, 'prototype');\n\n    // Detect if `arguments` object indexes are non-enumerable\n    support.nonEnumArgs = key != 0;\n\n    // Detect if properties shadowing those on `Object.prototype` are non-enumerable.\n    support.nonEnumShadows = !/valueOf/.test(props);\n  }(1));\n\n  var isObject = Rx.internals.isObject = function(value) {\n    var type = typeof value;\n    return value && (type == 'function' || type == 'object') || false;\n  };\n\n  function keysIn(object) {\n    var result = [];\n    if (!isObject(object)) {\n      return result;\n    }\n    if (support.nonEnumArgs && object.length && isArguments(object)) {\n      object = slice.call(object);\n    }\n    var skipProto = support.enumPrototypes && typeof object == 'function',\n        skipErrorProps = support.enumErrorProps && (object === errorProto || object instanceof Error);\n\n    for (var key in object) {\n      if (!(skipProto && key == 'prototype') &&\n          !(skipErrorProps && (key == 'message' || key == 'name'))) {\n        result.push(key);\n      }\n    }\n\n    if (support.nonEnumShadows && object !== objectProto) {\n      var ctor = object.constructor,\n          index = -1,\n          length = dontEnumsLength;\n\n      if (object === (ctor && ctor.prototype)) {\n        var className = object === stringProto ? stringClass : object === errorProto ? errorClass : toString.call(object),\n            nonEnum = nonEnumProps[className];\n      }\n      while (++index < length) {\n        key = dontEnums[index];\n        if (!(nonEnum && nonEnum[key]) && hasOwnProperty.call(object, key)) {\n          result.push(key);\n        }\n      }\n    }\n    return result;\n  }\n\n  function internalFor(object, callback, keysFunc) {\n    var index = -1,\n      props = keysFunc(object),\n      length = props.length;\n\n    while (++index < length) {\n      var key = props[index];\n      if (callback(object[key], key, object) === false) {\n        break;\n      }\n    }\n    return object;\n  }\n\n  function internalForIn(object, callback) {\n    return internalFor(object, callback, keysIn);\n  }\n\n  function isNode(value) {\n    // IE < 9 presents DOM nodes as `Object` objects except they have `toString`\n    // methods that are `typeof` \"string\" and still can coerce nodes to strings\n    return typeof value.toString != 'function' && typeof (value + '') == 'string';\n  }\n\n  var isArguments = function(value) {\n    return (value && typeof value == 'object') ? toString.call(value) == argsClass : false;\n  }\n\n  // fallback for browsers that can't detect `arguments` objects by [[Class]]\n  if (!supportsArgsClass) {\n    isArguments = function(value) {\n      return (value && typeof value == 'object') ? hasOwnProperty.call(value, 'callee') : false;\n    };\n  }\n\n  var isEqual = Rx.internals.isEqual = function (x, y) {\n    return deepEquals(x, y, [], []);\n  };\n\n  /** @private\n   * Used for deep comparison\n   **/\n  function deepEquals(a, b, stackA, stackB) {\n    // exit early for identical values\n    if (a === b) {\n      // treat `+0` vs. `-0` as not equal\n      return a !== 0 || (1 / a == 1 / b);\n    }\n\n    var type = typeof a,\n        otherType = typeof b;\n\n    // exit early for unlike primitive values\n    if (a === a && (a == null || b == null ||\n        (type != 'function' && type != 'object' && otherType != 'function' && otherType != 'object'))) {\n      return false;\n    }\n\n    // compare [[Class]] names\n    var className = toString.call(a),\n        otherClass = toString.call(b);\n\n    if (className == argsClass) {\n      className = objectClass;\n    }\n    if (otherClass == argsClass) {\n      otherClass = objectClass;\n    }\n    if (className != otherClass) {\n      return false;\n    }\n    switch (className) {\n      case boolClass:\n      case dateClass:\n        // coerce dates and booleans to numbers, dates to milliseconds and booleans\n        // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\n        return +a == +b;\n\n      case numberClass:\n        // treat `NaN` vs. `NaN` as equal\n        return (a != +a) ?\n          b != +b :\n          // but treat `-0` vs. `+0` as not equal\n          (a == 0 ? (1 / a == 1 / b) : a == +b);\n\n      case regexpClass:\n      case stringClass:\n        // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\n        // treat string primitives and their corresponding object instances as equal\n        return a == String(b);\n    }\n    var isArr = className == arrayClass;\n    if (!isArr) {\n\n      // exit for functions and DOM nodes\n      if (className != objectClass || (!support.nodeClass && (isNode(a) || isNode(b)))) {\n        return false;\n      }\n      // in older versions of Opera, `arguments` objects have `Array` constructors\n      var ctorA = !support.argsObject && isArguments(a) ? Object : a.constructor,\n          ctorB = !support.argsObject && isArguments(b) ? Object : b.constructor;\n\n      // non `Object` object instances with different constructors are not equal\n      if (ctorA != ctorB &&\n            !(hasOwnProperty.call(a, 'constructor') && hasOwnProperty.call(b, 'constructor')) &&\n            !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\n            ('constructor' in a && 'constructor' in b)\n          ) {\n        return false;\n      }\n    }\n    // assume cyclic structures are equal\n    // the algorithm for detecting cyclic structures is adapted from ES 5.1\n    // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\n    var initedStack = !stackA;\n    stackA || (stackA = []);\n    stackB || (stackB = []);\n\n    var length = stackA.length;\n    while (length--) {\n      if (stackA[length] == a) {\n        return stackB[length] == b;\n      }\n    }\n    var size = 0;\n    var result = true;\n\n    // add `a` and `b` to the stack of traversed objects\n    stackA.push(a);\n    stackB.push(b);\n\n    // recursively compare objects and arrays (susceptible to call stack limits)\n    if (isArr) {\n      // compare lengths to determine if a deep comparison is necessary\n      length = a.length;\n      size = b.length;\n      result = size == length;\n\n      if (result) {\n        // deep compare the contents, ignoring non-numeric properties\n        while (size--) {\n          var index = length,\n              value = b[size];\n\n          if (!(result = deepEquals(a[size], value, stackA, stackB))) {\n            break;\n          }\n        }\n      }\n    }\n    else {\n      // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\n      // which, in this case, is more costly\n      internalForIn(b, function(value, key, b) {\n        if (hasOwnProperty.call(b, key)) {\n          // count the number of properties.\n          size++;\n          // deep compare each property value.\n          return (result = hasOwnProperty.call(a, key) && deepEquals(a[key], value, stackA, stackB));\n        }\n      });\n\n      if (result) {\n        // ensure both objects have the same number of properties\n        internalForIn(a, function(value, key, a) {\n          if (hasOwnProperty.call(a, key)) {\n            // `size` will be `-1` if `a` has more properties than `b`\n            return (result = --size > -1);\n          }\n        });\n      }\n    }\n    stackA.pop();\n    stackB.pop();\n\n    return result;\n  }\n\n  var hasProp = {}.hasOwnProperty,\n      slice = Array.prototype.slice;\n\n  var inherits = this.inherits = Rx.internals.inherits = function (child, parent) {\n    function __() { this.constructor = child; }\n    __.prototype = parent.prototype;\n    child.prototype = new __();\n  };\n\n  var addProperties = Rx.internals.addProperties = function (obj) {\n    for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n      var source = sources[idx];\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n  };\n\n  // Rx Utils\n  var addRef = Rx.internals.addRef = function (xs, r) {\n    return new AnonymousObservable(function (observer) {\n      return new CompositeDisposable(r.getDisposable(), xs.subscribe(observer));\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n\n  // Utilities\n  if (!Function.prototype.bind) {\n    Function.prototype.bind = function (that) {\n      var target = this,\n        args = slice.call(arguments, 1);\n      var bound = function () {\n        if (this instanceof bound) {\n          function F() { }\n          F.prototype = target.prototype;\n          var self = new F();\n          var result = target.apply(self, args.concat(slice.call(arguments)));\n          if (Object(result) === result) {\n            return result;\n          }\n          return self;\n        } else {\n          return target.apply(that, args.concat(slice.call(arguments)));\n        }\n      };\n\n      return bound;\n    };\n  }\n\n  if (!Array.prototype.forEach) {\n    Array.prototype.forEach = function (callback, thisArg) {\n      var T, k;\n\n      if (this == null) {\n        throw new TypeError(\" this is null or not defined\");\n      }\n\n      var O = Object(this);\n      var len = O.length >>> 0;\n\n      if (typeof callback !== \"function\") {\n        throw new TypeError(callback + \" is not a function\");\n      }\n\n      if (arguments.length > 1) {\n        T = thisArg;\n      }\n\n      k = 0;\n      while (k < len) {\n        var kValue;\n        if (k in O) {\n          kValue = O[k];\n          callback.call(T, kValue, k, O);\n        }\n        k++;\n      }\n    };\n  }\n\n  var boxedString = Object(\"a\"),\n      splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n  if (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n      var object = Object(this),\n        self = splitString && {}.toString.call(this) == stringClass ?\n          this.split(\"\") :\n          object,\n        length = self.length >>> 0,\n        thisp = arguments[1];\n\n      if ({}.toString.call(fun) != funcClass) {\n        throw new TypeError(fun + \" is not a function\");\n      }\n\n      for (var i = 0; i < length; i++) {\n        if (i in self && !fun.call(thisp, self[i], i, object)) {\n          return false;\n        }\n      }\n      return true;\n    };\n  }\n\n  if (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n      var object = Object(this),\n        self = splitString && {}.toString.call(this) == stringClass ?\n            this.split(\"\") :\n            object,\n        length = self.length >>> 0,\n        result = Array(length),\n        thisp = arguments[1];\n\n      if ({}.toString.call(fun) != funcClass) {\n        throw new TypeError(fun + \" is not a function\");\n      }\n\n      for (var i = 0; i < length; i++) {\n        if (i in self) {\n          result[i] = fun.call(thisp, self[i], i, object);\n        }\n      }\n      return result;\n    };\n  }\n\n  if (!Array.prototype.filter) {\n    Array.prototype.filter = function (predicate) {\n      var results = [], item, t = new Object(this);\n      for (var i = 0, len = t.length >>> 0; i < len; i++) {\n        item = t[i];\n        if (i in t && predicate.call(arguments[1], item, i, t)) {\n          results.push(item);\n        }\n      }\n      return results;\n    };\n  }\n\n  if (!Array.isArray) {\n    Array.isArray = function (arg) {\n      return {}.toString.call(arg) == arrayClass;\n    };\n  }\n\n  if (!Array.prototype.indexOf) {\n    Array.prototype.indexOf = function indexOf(searchElement) {\n      var t = Object(this);\n      var len = t.length >>> 0;\n      if (len === 0) {\n        return -1;\n      }\n      var n = 0;\n      if (arguments.length > 1) {\n        n = Number(arguments[1]);\n        if (n !== n) {\n          n = 0;\n        } else if (n !== 0 && n != Infinity && n !== -Infinity) {\n          n = (n > 0 || -1) * Math.floor(Math.abs(n));\n        }\n      }\n      if (n >= len) {\n        return -1;\n      }\n      var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);\n      for (; k < len; k++) {\n        if (k in t && t[k] === searchElement) {\n          return k;\n        }\n      }\n      return -1;\n    };\n  }\n\n  // Fix for Tessel\n  if (!Object.prototype.propertyIsEnumerable) {\n    Object.prototype.propertyIsEnumerable = function (key) {\n      for (var k in this) { if (k === key) { return true; } }\n      return false;\n    };\n  }\n\n  if (!Object.keys) {\n    Object.keys = (function() {\n      'use strict';\n      var hasOwnProperty = Object.prototype.hasOwnProperty,\n      hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString');\n\n      return function(obj) {\n        if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n          throw new TypeError('Object.keys called on non-object');\n        }\n\n        var result = [], prop, i;\n\n        for (prop in obj) {\n          if (hasOwnProperty.call(obj, prop)) {\n            result.push(prop);\n          }\n        }\n\n        if (hasDontEnumBug) {\n          for (i = 0; i < dontEnumsLength; i++) {\n            if (hasOwnProperty.call(obj, dontEnums[i])) {\n              result.push(dontEnums[i]);\n            }\n          }\n        }\n        return result;\n      };\n    }());\n  }\n\n  // Collections\n  function IndexedItem(id, value) {\n    this.id = id;\n    this.value = value;\n  }\n\n  IndexedItem.prototype.compareTo = function (other) {\n    var c = this.value.compareTo(other.value);\n    c === 0 && (c = this.id - other.id);\n    return c;\n  };\n\n  // Priority Queue for Scheduling\n  var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) {\n    this.items = new Array(capacity);\n    this.length = 0;\n  };\n\n  var priorityProto = PriorityQueue.prototype;\n  priorityProto.isHigherPriority = function (left, right) {\n    return this.items[left].compareTo(this.items[right]) < 0;\n  };\n\n  priorityProto.percolate = function (index) {\n    if (index >= this.length || index < 0) { return; }\n    var parent = index - 1 >> 1;\n    if (parent < 0 || parent === index) { return; }\n    if (this.isHigherPriority(index, parent)) {\n      var temp = this.items[index];\n      this.items[index] = this.items[parent];\n      this.items[parent] = temp;\n      this.percolate(parent);\n    }\n  };\n\n  priorityProto.heapify = function (index) {\n    +index || (index = 0);\n    if (index >= this.length || index < 0) { return; }\n    var left = 2 * index + 1,\n        right = 2 * index + 2,\n        first = index;\n    if (left < this.length && this.isHigherPriority(left, first)) {\n      first = left;\n    }\n    if (right < this.length && this.isHigherPriority(right, first)) {\n      first = right;\n    }\n    if (first !== index) {\n      var temp = this.items[index];\n      this.items[index] = this.items[first];\n      this.items[first] = temp;\n      this.heapify(first);\n    }\n  };\n\n  priorityProto.peek = function () { return this.items[0].value; };\n\n  priorityProto.removeAt = function (index) {\n    this.items[index] = this.items[--this.length];\n    this.items[this.length] = undefined;\n    this.heapify();\n  };\n\n  priorityProto.dequeue = function () {\n    var result = this.peek();\n    this.removeAt(0);\n    return result;\n  };\n\n  priorityProto.enqueue = function (item) {\n    var index = this.length++;\n    this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n    this.percolate(index);\n  };\n\n  priorityProto.remove = function (item) {\n    for (var i = 0; i < this.length; i++) {\n      if (this.items[i].value === item) {\n        this.removeAt(i);\n        return true;\n      }\n    }\n    return false;\n  };\n  PriorityQueue.count = 0;\n\n  /**\n   * Represents a group of disposable resources that are disposed together.\n   * @constructor\n   */\n  var CompositeDisposable = Rx.CompositeDisposable = function () {\n    var args = [];\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    }\n    this.disposables = args;\n    this.isDisposed = false;\n    this.length = this.disposables.length;\n  };\n\n  var CompositeDisposablePrototype = CompositeDisposable.prototype;\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Mixed} item Disposable to add.\n   */\n  CompositeDisposablePrototype.add = function (item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n      this.length++;\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Mixed} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n  CompositeDisposablePrototype.remove = function (item) {\n    var shouldDispose = false;\n    if (!this.isDisposed) {\n      var idx = this.disposables.indexOf(item);\n      if (idx !== -1) {\n        shouldDispose = true;\n        this.disposables.splice(idx, 1);\n        this.length--;\n        item.dispose();\n      }\n    }\n    return shouldDispose;\n  };\n\n  /**\n   *  Disposes all disposables in the group and removes them from the group.\n   */\n  CompositeDisposablePrototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      for(var currentDisposables = [], i = 0, len = this.disposables.length; i < len; i++) { currentDisposables.push(this.disposables[i]); }\n      this.disposables = [];\n      this.length = 0;\n\n      for (i = 0, len = currentDisposables.length; i < len; i++) {\n        currentDisposables[i].dispose();\n      }\n    }\n  };\n\n  /**\n   * Converts the existing CompositeDisposable to an array of disposables\n   * @returns {Array} An array of disposable objects.\n   */\n  CompositeDisposablePrototype.toArray = function () {\n    for(var currentDisposables = [], ix = 0, len = this.disposables.length; i < len; i++) { currentDisposables.push(this.disposables[i]); }\n    return currentDisposables;\n  };\n\n  /**\n   * Provides a set of static methods for creating Disposables.\n   *\n   * @constructor\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   */\n  var Disposable = Rx.Disposable = function (action) {\n    this.isDisposed = false;\n    this.action = action || noop;\n  };\n\n  /** Performs the task of cleaning up resources. */\n  Disposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.action();\n      this.isDisposed = true;\n    }\n  };\n\n  /**\n   * Creates a disposable object that invokes the specified action when disposed.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   * @return {Disposable} The disposable object that runs the given action upon disposal.\n   */\n  var disposableCreate = Disposable.create = function (action) { return new Disposable(action); };\n\n  /**\n   * Gets the disposable that does nothing when disposed.\n   */\n  var disposableEmpty = Disposable.empty = { dispose: noop };\n\n  var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = (function () {\n    function BooleanDisposable () {\n      this.isDisposed = false;\n      this.current = null;\n    }\n\n    var booleanDisposablePrototype = BooleanDisposable.prototype;\n\n    /**\n     * Gets the underlying disposable.\n     * @return The underlying disposable.\n     */\n    booleanDisposablePrototype.getDisposable = function () {\n      return this.current;\n    };\n\n    /**\n     * Sets the underlying disposable.\n     * @param {Disposable} value The new underlying disposable.\n     */\n    booleanDisposablePrototype.setDisposable = function (value) {\n      var shouldDispose = this.isDisposed;\n      if (!shouldDispose) {\n        var old = this.current;\n        this.current = value;\n      }\n      old && old.dispose();\n      shouldDispose && value && value.dispose();\n    };\n\n    /**\n     * Disposes the underlying disposable as well as all future replacements.\n     */\n    booleanDisposablePrototype.dispose = function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        var old = this.current;\n        this.current = null;\n      }\n      old && old.dispose();\n    };\n\n    return BooleanDisposable;\n  }());\n  var SerialDisposable = Rx.SerialDisposable = SingleAssignmentDisposable;\n\n  /**\n   * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n   */\n  var RefCountDisposable = Rx.RefCountDisposable = (function () {\n\n    function InnerDisposable(disposable) {\n      this.disposable = disposable;\n      this.disposable.count++;\n      this.isInnerDisposed = false;\n    }\n\n    InnerDisposable.prototype.dispose = function () {\n      if (!this.disposable.isDisposed && !this.isInnerDisposed) {\n        this.isInnerDisposed = true;\n        this.disposable.count--;\n        if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {\n          this.disposable.isDisposed = true;\n          this.disposable.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Initializes a new instance of the RefCountDisposable with the specified disposable.\n     * @constructor\n     * @param {Disposable} disposable Underlying disposable.\n      */\n    function RefCountDisposable(disposable) {\n      this.underlyingDisposable = disposable;\n      this.isDisposed = false;\n      this.isPrimaryDisposed = false;\n      this.count = 0;\n    }\n\n    /**\n     * Disposes the underlying disposable only when all dependent disposables have been disposed\n     */\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed && !this.isPrimaryDisposed) {\n        this.isPrimaryDisposed = true;\n        if (this.count === 0) {\n          this.isDisposed = true;\n          this.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n     * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n     */\n    RefCountDisposable.prototype.getDisposable = function () {\n      return this.isDisposed ? disposableEmpty : new InnerDisposable(this);\n    };\n\n    return RefCountDisposable;\n  })();\n\n  function ScheduledDisposable(scheduler, disposable) {\n    this.scheduler = scheduler;\n    this.disposable = disposable;\n    this.isDisposed = false;\n  }\n\n  function scheduleItem(s, self) {\n    if (!self.isDisposed) {\n      self.isDisposed = true;\n      self.disposable.dispose();\n    }\n  }\n\n  ScheduledDisposable.prototype.dispose = function () {\n    this.scheduler.scheduleWithState(this, scheduleItem);\n  };\n\n  var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) {\n    this.scheduler = scheduler;\n    this.state = state;\n    this.action = action;\n    this.dueTime = dueTime;\n    this.comparer = comparer || defaultSubComparer;\n    this.disposable = new SingleAssignmentDisposable();\n  }\n\n  ScheduledItem.prototype.invoke = function () {\n    this.disposable.setDisposable(this.invokeCore());\n  };\n\n  ScheduledItem.prototype.compareTo = function (other) {\n    return this.comparer(this.dueTime, other.dueTime);\n  };\n\n  ScheduledItem.prototype.isCancelled = function () {\n    return this.disposable.isDisposed;\n  };\n\n  ScheduledItem.prototype.invokeCore = function () {\n    return this.action(this.scheduler, this.state);\n  };\n\n  /** Provides a set of static properties to access commonly used schedulers. */\n  var Scheduler = Rx.Scheduler = (function () {\n\n    function Scheduler(now, schedule, scheduleRelative, scheduleAbsolute) {\n      this.now = now;\n      this._schedule = schedule;\n      this._scheduleRelative = scheduleRelative;\n      this._scheduleAbsolute = scheduleAbsolute;\n    }\n\n    function invokeAction(scheduler, action) {\n      action();\n      return disposableEmpty;\n    }\n\n    var schedulerProto = Scheduler.prototype;\n\n    /**\n     * Schedules an action to be executed.\n     * @param {Function} action Action to execute.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.schedule = function (action) {\n      return this._schedule(action, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed.\n     * @param state State passed to the action to be executed.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithState = function (state, action) {\n      return this._schedule(state, action);\n    };\n\n    /**\n     * Schedules an action to be executed after the specified relative due time.\n     * @param {Function} action Action to execute.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithRelative = function (dueTime, action) {\n      return this._scheduleRelative(action, dueTime, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed after dueTime.\n     * @param state State passed to the action to be executed.\n     * @param {Function} action Action to be executed.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithRelativeAndState = function (state, dueTime, action) {\n      return this._scheduleRelative(state, dueTime, action);\n    };\n\n    /**\n     * Schedules an action to be executed at the specified absolute due time.\n     * @param {Function} action Action to execute.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n      */\n    schedulerProto.scheduleWithAbsolute = function (dueTime, action) {\n      return this._scheduleAbsolute(action, dueTime, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to be executed.\n     * @param {Number}dueTime Absolute time at which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithAbsoluteAndState = function (state, dueTime, action) {\n      return this._scheduleAbsolute(state, dueTime, action);\n    };\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.now = defaultNow;\n\n    /**\n     * Normalizes the specified TimeSpan value to a positive value.\n     * @param {Number} timeSpan The time span value to normalize.\n     * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n     */\n    Scheduler.normalize = function (timeSpan) {\n      timeSpan < 0 && (timeSpan = 0);\n      return timeSpan;\n    };\n\n    return Scheduler;\n  }());\n\n  var normalizeTime = Scheduler.normalize;\n\n  (function (schedulerProto) {\n    function invokeRecImmediate(scheduler, pair) {\n      var state = pair.first, action = pair.second, group = new CompositeDisposable(),\n      recursiveAction = function (state1) {\n        action(state1, function (state2) {\n          var isAdded = false, isDone = false,\n          d = scheduler.scheduleWithState(state2, function (scheduler1, state3) {\n            if (isAdded) {\n              group.remove(d);\n            } else {\n              isDone = true;\n            }\n            recursiveAction(state3);\n            return disposableEmpty;\n          });\n          if (!isDone) {\n            group.add(d);\n            isAdded = true;\n          }\n        });\n      };\n      recursiveAction(state);\n      return group;\n    }\n\n    function invokeRecDate(scheduler, pair, method) {\n      var state = pair.first, action = pair.second, group = new CompositeDisposable(),\n      recursiveAction = function (state1) {\n        action(state1, function (state2, dueTime1) {\n          var isAdded = false, isDone = false,\n          d = scheduler[method](state2, dueTime1, function (scheduler1, state3) {\n            if (isAdded) {\n              group.remove(d);\n            } else {\n              isDone = true;\n            }\n            recursiveAction(state3);\n            return disposableEmpty;\n          });\n          if (!isDone) {\n            group.add(d);\n            isAdded = true;\n          }\n        });\n      };\n      recursiveAction(state);\n      return group;\n    }\n\n    function scheduleInnerRecursive(action, self) {\n      action(function(dt) { self(action, dt); });\n    }\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursive = function (action) {\n      return this.scheduleRecursiveWithState(action, function (_action, self) {\n        _action(function () { self(_action); }); });\n    };\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithState = function (state, action) {\n      return this.scheduleWithState({ first: state, second: action }, invokeRecImmediate);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative due time.\n     * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified relative time.\n     * @param {Number}dueTime Relative time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithRelative = function (dueTime, action) {\n      return this.scheduleRecursiveWithRelativeAndState(action, dueTime, scheduleInnerRecursive);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number}dueTime Relative time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithRelativeAndState = function (state, dueTime, action) {\n      return this._scheduleRelative({ first: state, second: action }, dueTime, function (s, p) {\n        return invokeRecDate(s, p, 'scheduleWithRelativeAndState');\n      });\n    };\n\n    /**\n     * Schedules an action to be executed recursively at a specified absolute due time.\n     * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified absolute time.\n     * @param {Number}dueTime Absolute time at which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithAbsolute = function (dueTime, action) {\n      return this.scheduleRecursiveWithAbsoluteAndState(action, dueTime, scheduleInnerRecursive);\n    };\n\n    /**\n     * Schedules an action to be executed recursively at a specified absolute due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number}dueTime Absolute time at which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithAbsoluteAndState = function (state, dueTime, action) {\n      return this._scheduleAbsolute({ first: state, second: action }, dueTime, function (s, p) {\n        return invokeRecDate(s, p, 'scheduleWithAbsoluteAndState');\n      });\n    };\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    Scheduler.prototype.schedulePeriodic = function (period, action) {\n      return this.schedulePeriodicWithState(null, period, action);\n    };\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    Scheduler.prototype.schedulePeriodicWithState = function(state, period, action) {\n      if (typeof root.setInterval === 'undefined') { throw new Error('Periodic scheduling not supported.'); }\n      var s = state;\n\n      var id = root.setInterval(function () {\n        s = action(s);\n      }, period);\n\n      return disposableCreate(function () {\n        root.clearInterval(id);\n      });\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n    /**\n     * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n     * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n     * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n     */\n    schedulerProto.catchError = schedulerProto['catch'] = function (handler) {\n      return new CatchScheduler(this, handler);\n    };\n  }(Scheduler.prototype));\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function tick(command, recurse) {\n      recurse(0, this._period);\n      try {\n        this._state = this._action(this._state);\n      } catch (e) {\n        this._cancel.dispose();\n        throw e;\n      }\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0, this._period, tick.bind(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  /** Gets a scheduler that schedules work immediately on the current thread. */\n  var immediateScheduler = Scheduler.immediate = (function () {\n\n    function scheduleNow(state, action) { return action(this, state); }\n\n    function scheduleRelative(state, dueTime, action) {\n      var dt = this.now() + normalizeTime(dueTime);\n      while (dt - this.now() > 0) { }\n      return action(this, state);\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);\n    }\n\n    return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n  }());\n\n  /**\n   * Gets a scheduler that schedules work as soon as possible on the current thread.\n   */\n  var currentThreadScheduler = Scheduler.currentThread = (function () {\n    var queue;\n\n    function runTrampoline (q) {\n      while (q.length > 0) {\n        var item = q.dequeue();\n        if (!item.isCancelled()) {\n          // Note, do not schedule blocking work!\n          while (item.dueTime - Scheduler.now() > 0) {\n          }\n          !item.isCancelled() && item.invoke();\n        }\n      }\n    }\n\n    function scheduleNow(state, action) {\n      return this.scheduleWithRelativeAndState(state, 0, action);\n    }\n\n    function scheduleRelative(state, dueTime, action) {\n      var dt = this.now() + Scheduler.normalize(dueTime),\n          si = new ScheduledItem(this, state, action, dt);\n\n      if (!queue) {\n        queue = new PriorityQueue(4);\n        queue.enqueue(si);\n        try {\n          runTrampoline(queue);\n        } catch (e) {\n          throw e;\n        } finally {\n          queue = null;\n        }\n      } else {\n        queue.enqueue(si);\n      }\n      return si.disposable;\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);\n    }\n\n    var currentScheduler = new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n\n    currentScheduler.scheduleRequired = function () { return !queue; };\n    currentScheduler.ensureTrampoline = function (action) {\n      if (!queue) { this.schedule(action); } else { action(); }\n    };\n\n    return currentScheduler;\n  }());\n\n  var scheduleMethod, clearMethod = noop;\n  var localTimer = (function () {\n    var localSetTimeout, localClearTimeout = noop;\n    if ('WScript' in this) {\n      localSetTimeout = function (fn, time) {\n        WScript.Sleep(time);\n        fn();\n      };\n    } else if (!!root.setTimeout) {\n      localSetTimeout = root.setTimeout;\n      localClearTimeout = root.clearTimeout;\n    } else {\n      throw new Error('No concurrency detected!');\n    }\n\n    return {\n      setTimeout: localSetTimeout,\n      clearTimeout: localClearTimeout\n    };\n  }());\n  var localSetTimeout = localTimer.setTimeout,\n    localClearTimeout = localTimer.clearTimeout;\n\n  (function () {\n\n    var reNative = RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&\n      !reNative.test(setImmediate) && setImmediate,\n      clearImmediate = typeof (clearImmediate = freeGlobal && moduleExports && freeGlobal.clearImmediate) == 'function' &&\n      !reNative.test(clearImmediate) && clearImmediate;\n\n    function postMessageSupported () {\n      // Ensure not in a worker\n      if (!root.postMessage || root.importScripts) { return false; }\n      var isAsync = false,\n          oldHandler = root.onmessage;\n      // Test for async\n      root.onmessage = function () { isAsync = true; };\n      root.postMessage('', '*');\n      root.onmessage = oldHandler;\n\n      return isAsync;\n    }\n\n    // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n    if (typeof setImmediate === 'function') {\n      scheduleMethod = setImmediate;\n      clearMethod = clearImmediate;\n    } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleMethod = process.nextTick;\n    } else if (postMessageSupported()) {\n      var MSG_PREFIX = 'ms.rx.schedule' + Math.random(),\n        tasks = {},\n        taskId = 0;\n\n      var onGlobalPostMessage = function (event) {\n        // Only if we're a match to avoid any other global events\n        if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n          var handleId = event.data.substring(MSG_PREFIX.length),\n            action = tasks[handleId];\n          action();\n          delete tasks[handleId];\n        }\n      }\n\n      if (root.addEventListener) {\n        root.addEventListener('message', onGlobalPostMessage, false);\n      } else {\n        root.attachEvent('onmessage', onGlobalPostMessage, false);\n      }\n\n      scheduleMethod = function (action) {\n        var currentId = taskId++;\n        tasks[currentId] = action;\n        root.postMessage(MSG_PREFIX + currentId, '*');\n      };\n    } else if (!!root.MessageChannel) {\n      var channel = new root.MessageChannel(),\n        channelTasks = {},\n        channelTaskId = 0;\n\n      channel.port1.onmessage = function (event) {\n        var id = event.data,\n          action = channelTasks[id];\n        action();\n        delete channelTasks[id];\n      };\n\n      scheduleMethod = function (action) {\n        var id = channelTaskId++;\n        channelTasks[id] = action;\n        channel.port2.postMessage(id);\n      };\n    } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {\n\n      scheduleMethod = function (action) {\n        var scriptElement = root.document.createElement('script');\n        scriptElement.onreadystatechange = function () {\n          action();\n          scriptElement.onreadystatechange = null;\n          scriptElement.parentNode.removeChild(scriptElement);\n          scriptElement = null;\n        };\n        root.document.documentElement.appendChild(scriptElement);\n      };\n\n    } else {\n      scheduleMethod = function (action) { return localSetTimeout(action, 0); };\n      clearMethod = localClearTimeout;\n    }\n  }());\n\n  /**\n   * Gets a scheduler that schedules work via a timed callback based upon platform.\n   */\n  var timeoutScheduler = Scheduler.timeout = (function () {\n\n    function scheduleNow(state, action) {\n      var scheduler = this,\n        disposable = new SingleAssignmentDisposable();\n      var id = scheduleMethod(function () {\n        if (!disposable.isDisposed) {\n          disposable.setDisposable(action(scheduler, state));\n        }\n      });\n      return new CompositeDisposable(disposable, disposableCreate(function () {\n        clearMethod(id);\n      }));\n    }\n\n    function scheduleRelative(state, dueTime, action) {\n      var scheduler = this,\n        dt = Scheduler.normalize(dueTime);\n      if (dt === 0) {\n        return scheduler.scheduleWithState(state, action);\n      }\n      var disposable = new SingleAssignmentDisposable();\n      var id = localSetTimeout(function () {\n        if (!disposable.isDisposed) {\n          disposable.setDisposable(action(scheduler, state));\n        }\n      }, dt);\n      return new CompositeDisposable(disposable, disposableCreate(function () {\n        localClearTimeout(id);\n      }));\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);\n    }\n\n    return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n  })();\n\n  var CatchScheduler = (function (__super__) {\n\n    function scheduleNow(state, action) {\n      return this._scheduler.scheduleWithState(state, this._wrap(action));\n    }\n\n    function scheduleRelative(state, dueTime, action) {\n      return this._scheduler.scheduleWithRelativeAndState(state, dueTime, this._wrap(action));\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this._scheduler.scheduleWithAbsoluteAndState(state, dueTime, this._wrap(action));\n    }\n\n    inherits(CatchScheduler, __super__);\n\n    function CatchScheduler(scheduler, handler) {\n      this._scheduler = scheduler;\n      this._handler = handler;\n      this._recursiveOriginal = null;\n      this._recursiveWrapper = null;\n      __super__.call(this, this._scheduler.now.bind(this._scheduler), scheduleNow, scheduleRelative, scheduleAbsolute);\n    }\n\n    CatchScheduler.prototype._clone = function (scheduler) {\n        return new CatchScheduler(scheduler, this._handler);\n    };\n\n    CatchScheduler.prototype._wrap = function (action) {\n      var parent = this;\n      return function (self, state) {\n        try {\n          return action(parent._getRecursiveWrapper(self), state);\n        } catch (e) {\n          if (!parent._handler(e)) { throw e; }\n          return disposableEmpty;\n        }\n      };\n    };\n\n    CatchScheduler.prototype._getRecursiveWrapper = function (scheduler) {\n      if (this._recursiveOriginal !== scheduler) {\n        this._recursiveOriginal = scheduler;\n        var wrapper = this._clone(scheduler);\n        wrapper._recursiveOriginal = scheduler;\n        wrapper._recursiveWrapper = wrapper;\n        this._recursiveWrapper = wrapper;\n      }\n      return this._recursiveWrapper;\n    };\n\n    CatchScheduler.prototype.schedulePeriodicWithState = function (state, period, action) {\n      var self = this, failed = false, d = new SingleAssignmentDisposable();\n\n      d.setDisposable(this._scheduler.schedulePeriodicWithState(state, period, function (state1) {\n        if (failed) { return null; }\n        try {\n          return action(state1);\n        } catch (e) {\n          failed = true;\n          if (!self._handler(e)) { throw e; }\n          d.dispose();\n          return null;\n        }\n      }));\n\n      return d;\n    };\n\n    return CatchScheduler;\n  }(Scheduler));\n\n  /**\n   *  Represents a notification to an observer.\n   */\n  var Notification = Rx.Notification = (function () {\n    function Notification(kind, hasValue) {\n      this.hasValue = hasValue == null ? false : hasValue;\n      this.kind = kind;\n    }\n\n    /**\n     * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n     *\n     * @memberOf Notification\n     * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n     * @param {Function} onError Delegate to invoke for an OnError notification.\n     * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n     * @returns {Any} Result produced by the observation.\n     */\n    Notification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n      return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n        this._acceptObservable(observerOrOnNext) :\n        this._accept(observerOrOnNext, onError, onCompleted);\n    };\n\n    /**\n     * Returns an observable sequence with a single notification.\n     *\n     * @memberOf Notifications\n     * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n     * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n     */\n    Notification.prototype.toObservable = function (scheduler) {\n      var notification = this;\n      isScheduler(scheduler) || (scheduler = immediateScheduler);\n      return new AnonymousObservable(function (observer) {\n        return scheduler.schedule(function () {\n          notification._acceptObservable(observer);\n          notification.kind === 'N' && observer.onCompleted();\n        });\n      });\n    };\n\n    return Notification;\n  })();\n\n  /**\n   * Creates an object that represents an OnNext notification to an observer.\n   * @param {Any} value The value contained in the notification.\n   * @returns {Notification} The OnNext notification containing the value.\n   */\n  var notificationCreateOnNext = Notification.createOnNext = (function () {\n\n      function _accept (onNext) { return onNext(this.value); }\n      function _acceptObservable(observer) { return observer.onNext(this.value); }\n      function toString () { return 'OnNext(' + this.value + ')'; }\n\n      return function (value) {\n        var notification = new Notification('N', true);\n        notification.value = value;\n        notification._accept = _accept;\n        notification._acceptObservable = _acceptObservable;\n        notification.toString = toString;\n        return notification;\n      };\n  }());\n\n  /**\n   * Creates an object that represents an OnError notification to an observer.\n   * @param {Any} error The exception contained in the notification.\n   * @returns {Notification} The OnError notification containing the exception.\n   */\n  var notificationCreateOnError = Notification.createOnError = (function () {\n\n    function _accept (onNext, onError) { return onError(this.exception); }\n    function _acceptObservable(observer) { return observer.onError(this.exception); }\n    function toString () { return 'OnError(' + this.exception + ')'; }\n\n    return function (e) {\n      var notification = new Notification('E');\n      notification.exception = e;\n      notification._accept = _accept;\n      notification._acceptObservable = _acceptObservable;\n      notification.toString = toString;\n      return notification;\n    };\n  }());\n\n  /**\n   * Creates an object that represents an OnCompleted notification to an observer.\n   * @returns {Notification} The OnCompleted notification.\n   */\n  var notificationCreateOnCompleted = Notification.createOnCompleted = (function () {\n\n    function _accept (onNext, onError, onCompleted) { return onCompleted(); }\n    function _acceptObservable(observer) { return observer.onCompleted(); }\n    function toString () { return 'OnCompleted()'; }\n\n    return function () {\n      var notification = new Notification('C');\n      notification._accept = _accept;\n      notification._acceptObservable = _acceptObservable;\n      notification.toString = toString;\n      return notification;\n    };\n  }());\n\n  var Enumerator = Rx.internals.Enumerator = function (next) {\n    this._next = next;\n  };\n\n  Enumerator.prototype.next = function () {\n    return this._next();\n  };\n\n  Enumerator.prototype[$iterator$] = function () { return this; }\n\n  var Enumerable = Rx.internals.Enumerable = function (iterator) {\n    this._iterator = iterator;\n  };\n\n  Enumerable.prototype[$iterator$] = function () {\n    return this._iterator();\n  };\n\n  Enumerable.prototype.concat = function () {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var e = sources[$iterator$]();\n\n      var isDisposed, subscription = new SerialDisposable();\n      var cancelable = immediateScheduler.scheduleRecursive(function (self) {\n        if (isDisposed) { return; }\n        try {\n          var currentItem = e.next();\n        } catch (ex) {\n          return o.onError(ex);\n        }\n\n        if (currentItem.done) {\n          return o.onCompleted();\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var d = new SingleAssignmentDisposable();\n        subscription.setDisposable(d);\n        d.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function(err) { o.onError(err); },\n          self)\n        );\n      });\n\n      return new CompositeDisposable(subscription, cancelable, disposableCreate(function () {\n        isDisposed = true;\n      }));\n    });\n  };\n\n  Enumerable.prototype.catchError = function () {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var e = sources[$iterator$]();\n\n      var isDisposed, subscription = new SerialDisposable();\n      var cancelable = immediateScheduler.scheduleRecursiveWithState(null, function (lastException, self) {\n        if (isDisposed) { return; }\n\n        try {\n          var currentItem = e.next();\n        } catch (ex) {\n          return observer.onError(ex);\n        }\n\n        if (currentItem.done) {\n          if (lastException !== null) {\n            o.onError(lastException);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var d = new SingleAssignmentDisposable();\n        subscription.setDisposable(d);\n        d.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          self,\n          function() { o.onCompleted(); }));\n      });\n      return new CompositeDisposable(subscription, cancelable, disposableCreate(function () {\n        isDisposed = true;\n      }));\n    });\n  };\n\n\n  Enumerable.prototype.catchErrorWhen = function (notificationHandler) {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var exceptions = new Subject(),\n        notifier = new Subject(),\n        handled = notificationHandler(exceptions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = sources[$iterator$]();\n\n      var isDisposed,\n        lastException,\n        subscription = new SerialDisposable();\n      var cancelable = immediateScheduler.scheduleRecursive(function (self) {\n        if (isDisposed) { return; }\n\n        try {\n          var currentItem = e.next();\n        } catch (ex) {\n          return o.onError(ex);\n        }\n\n        if (currentItem.done) {\n          if (lastException) {\n            o.onError(lastException);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new CompositeDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) {\n            inner.setDisposable(notifier.subscribe(self, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            exceptions.onNext(exn);\n          },\n          function() { o.onCompleted(); }));\n      });\n\n      return new CompositeDisposable(notificationDisposable, subscription, cancelable, disposableCreate(function () {\n        isDisposed = true;\n      }));\n    });\n  };\n\n  var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) {\n    if (repeatCount == null) { repeatCount = -1; }\n    return new Enumerable(function () {\n      var left = repeatCount;\n      return new Enumerator(function () {\n        if (left === 0) { return doneEnumerator; }\n        if (left > 0) { left--; }\n        return { done: false, value: value };\n      });\n    });\n  };\n\n  var enumerableOf = Enumerable.of = function (source, selector, thisArg) {\n    if (selector) {\n      var selectorFn = bindCallback(selector, thisArg, 3);\n    }\n    return new Enumerable(function () {\n      var index = -1;\n      return new Enumerator(\n        function () {\n          return ++index < source.length ?\n            { done: false, value: !selector ? source[index] : selectorFn(source[index], index, source) } :\n            doneEnumerator;\n        });\n    });\n  };\n\n  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates a notification callback from an observer.\n   * @returns The action that forwards its input notification to the underlying observer.\n   */\n  Observer.prototype.toNotifier = function () {\n    var observer = this;\n    return function (n) { return n.accept(observer); };\n  };\n\n  /**\n   *  Hides the identity of an observer.\n   * @returns An observer that hides the identity of the specified observer.\n   */\n  Observer.prototype.asObserver = function () {\n    return new AnonymousObserver(this.onNext.bind(this), this.onError.bind(this), this.onCompleted.bind(this));\n  };\n\n  /**\n   *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n   *  If a violation is detected, an Error is thrown from the offending observer method call.\n   * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n   */\n  Observer.prototype.checked = function () { return new CheckedObserver(this); };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n\n  /**\n   *  Creates an observer from a notification callback.\n   *\n   * @static\n   * @memberOf Observer\n   * @param {Function} handler Action that handles a notification.\n   * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n   */\n  Observer.fromNotifier = function (handler, thisArg) {\n    return new AnonymousObserver(function (x) {\n      return handler.call(thisArg, notificationCreateOnNext(x));\n    }, function (e) {\n      return handler.call(thisArg, notificationCreateOnError(e));\n    }, function () {\n      return handler.call(thisArg, notificationCreateOnCompleted());\n    });\n  };\n\n  /**\n   * Schedules the invocation of observer methods on the given scheduler.\n   * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n   * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n   */\n  Observer.prototype.notifyOn = function (scheduler) {\n    return new ObserveOnObserver(scheduler, this);\n  };\n\n  Observer.prototype.makeSafe = function(disposable) {\n    return new AnonymousSafeObserver(this._onNext, this._onError, this._onCompleted, disposable);\n  };\n\n  /**\n   * Abstract base class for implementations of the Observer class.\n   * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n   */\n  var AbstractObserver = Rx.internals.AbstractObserver = (function (__super__) {\n    inherits(AbstractObserver, __super__);\n\n    /**\n     * Creates a new observer in a non-stopped state.\n     */\n    function AbstractObserver() {\n      this.isStopped = false;\n      __super__.call(this);\n    }\n\n    /**\n     * Notifies the observer of a new element in the sequence.\n     * @param {Any} value Next element in the sequence.\n     */\n    AbstractObserver.prototype.onNext = function (value) {\n      if (!this.isStopped) { this.next(value); }\n    };\n\n    /**\n     * Notifies the observer that an exception has occurred.\n     * @param {Any} error The error that has occurred.\n     */\n    AbstractObserver.prototype.onError = function (error) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(error);\n      }\n    };\n\n    /**\n     * Notifies the observer of the end of the sequence.\n     */\n    AbstractObserver.prototype.onCompleted = function () {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.completed();\n      }\n    };\n\n    /**\n     * Disposes the observer, causing it to transition to the stopped state.\n     */\n    AbstractObserver.prototype.dispose = function () {\n      this.isStopped = true;\n    };\n\n    AbstractObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return AbstractObserver;\n  }(Observer));\n\n  /**\n   * Class to create an Observer instance from delegate-based implementations of the on* methods.\n   */\n  var AnonymousObserver = Rx.AnonymousObserver = (function (__super__) {\n    inherits(AnonymousObserver, __super__);\n\n    /**\n     * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n     * @param {Any} onNext Observer's OnNext action implementation.\n     * @param {Any} onError Observer's OnError action implementation.\n     * @param {Any} onCompleted Observer's OnCompleted action implementation.\n     */\n    function AnonymousObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    /**\n     * Calls the onNext action.\n     * @param {Any} value Next element in the sequence.\n     */\n    AnonymousObserver.prototype.next = function (value) {\n      this._onNext(value);\n    };\n\n    /**\n     * Calls the onError action.\n     * @param {Any} error The error that has occurred.\n     */\n    AnonymousObserver.prototype.error = function (error) {\n      this._onError(error);\n    };\n\n    /**\n     *  Calls the onCompleted action.\n     */\n    AnonymousObserver.prototype.completed = function () {\n      this._onCompleted();\n    };\n\n    return AnonymousObserver;\n  }(AbstractObserver));\n\n    var CheckedObserver = (function (_super) {\n        inherits(CheckedObserver, _super);\n\n        function CheckedObserver(observer) {\n            _super.call(this);\n            this._observer = observer;\n            this._state = 0; // 0 - idle, 1 - busy, 2 - done\n        }\n\n        var CheckedObserverPrototype = CheckedObserver.prototype;\n\n        CheckedObserverPrototype.onNext = function (value) {\n            this.checkAccess();\n            try {\n                this._observer.onNext(value);\n            } catch (e) {\n                throw e;\n            } finally {\n                this._state = 0;\n            }\n        };\n\n        CheckedObserverPrototype.onError = function (err) {\n            this.checkAccess();\n            try {\n                this._observer.onError(err);\n            } catch (e) {\n                throw e;\n            } finally {\n                this._state = 2;\n            }\n        };\n\n        CheckedObserverPrototype.onCompleted = function () {\n            this.checkAccess();\n            try {\n                this._observer.onCompleted();\n            } catch (e) {\n                throw e;\n            } finally {\n                this._state = 2;\n            }\n        };\n\n        CheckedObserverPrototype.checkAccess = function () {\n            if (this._state === 1) { throw new Error('Re-entrancy detected'); }\n            if (this._state === 2) { throw new Error('Observer completed'); }\n            if (this._state === 0) { this._state = 1; }\n        };\n\n        return CheckedObserver;\n    }(Observer));\n\n  var ScheduledObserver = Rx.internals.ScheduledObserver = (function (__super__) {\n    inherits(ScheduledObserver, __super__);\n\n    function ScheduledObserver(scheduler, observer) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.observer = observer;\n      this.isAcquired = false;\n      this.hasFaulted = false;\n      this.queue = [];\n      this.disposable = new SerialDisposable();\n    }\n\n    ScheduledObserver.prototype.next = function (value) {\n      var self = this;\n      this.queue.push(function () { self.observer.onNext(value); });\n    };\n\n    ScheduledObserver.prototype.error = function (e) {\n      var self = this;\n      this.queue.push(function () { self.observer.onError(e); });\n    };\n\n    ScheduledObserver.prototype.completed = function () {\n      var self = this;\n      this.queue.push(function () { self.observer.onCompleted(); });\n    };\n\n    ScheduledObserver.prototype.ensureActive = function () {\n      var isOwner = false, parent = this;\n      if (!this.hasFaulted && this.queue.length > 0) {\n        isOwner = !this.isAcquired;\n        this.isAcquired = true;\n      }\n      if (isOwner) {\n        this.disposable.setDisposable(this.scheduler.scheduleRecursive(function (self) {\n          var work;\n          if (parent.queue.length > 0) {\n            work = parent.queue.shift();\n          } else {\n            parent.isAcquired = false;\n            return;\n          }\n          try {\n            work();\n          } catch (ex) {\n            parent.queue = [];\n            parent.hasFaulted = true;\n            throw ex;\n          }\n          self();\n        }));\n      }\n    };\n\n    ScheduledObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.disposable.dispose();\n    };\n\n    return ScheduledObserver;\n  }(AbstractObserver));\n\n  var ObserveOnObserver = (function (__super__) {\n    inherits(ObserveOnObserver, __super__);\n\n    function ObserveOnObserver(scheduler, observer, cancel) {\n      __super__.call(this, scheduler, observer);\n      this._cancel = cancel;\n    }\n\n    ObserveOnObserver.prototype.next = function (value) {\n      __super__.prototype.next.call(this, value);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.error = function (e) {\n      __super__.prototype.error.call(this, e);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.completed = function () {\n      __super__.prototype.completed.call(this);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this._cancel && this._cancel.dispose();\n      this._cancel = null;\n    };\n\n    return ObserveOnObserver;\n  })(ScheduledObserver);\n\n  var observableProto;\n\n  /**\n   * Represents a push-style collection.\n   */\n  var Observable = Rx.Observable = (function () {\n\n    function Observable(subscribe) {\n      if (Rx.config.longStackSupport && hasStacks) {\n        try {\n          throw new Error();\n        } catch (e) {\n          this.stack = e.stack.substring(e.stack.indexOf(\"\\n\") + 1);\n        }\n\n        var self = this;\n        this._subscribe = function (observer) {\n          var oldOnError = observer.onError.bind(observer);\n\n          observer.onError = function (err) {\n            makeStackTraceLong(err, self);\n            oldOnError(err);\n          };\n\n          return subscribe.call(self, observer);\n        };\n      } else {\n        this._subscribe = subscribe;\n      }\n    }\n\n    observableProto = Observable.prototype;\n\n    /**\n     *  Subscribes an observer to the observable sequence.\n     *  @param {Mixed} [observerOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n     *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n     *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n     *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribe = observableProto.forEach = function (observerOrOnNext, onError, onCompleted) {\n      return this._subscribe(typeof observerOrOnNext === 'object' ?\n        observerOrOnNext :\n        observerCreate(observerOrOnNext, onError, onCompleted));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onNext The function to invoke on each element in the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnNext = function (onNext, thisArg) {\n      return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n    };\n\n    /**\n     * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n     * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnError = function (onError, thisArg) {\n      return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnCompleted = function (onCompleted, thisArg) {\n      return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n    };\n\n    return Observable;\n  })();\n\n  var ObservableBase = Rx.ObservableBase = (function (__super__) {\n\n  inherits(ObservableBase, __super__);\n\n  // Fix subscriber to check for undefined or function returned to decorate as Disposable\n  function fixSubscriber(subscriber) {\n    if (subscriber && typeof subscriber.dispose === 'function') { return subscriber; }\n\n      return typeof subscriber === 'function' ?\n        disposableCreate(subscriber) :\n        disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      try {\n        ado.setDisposable(fixSubscriber(self.subscribeCore(ado)));\n      } catch (e) {\n        if (!ado.fail(e)) { throw e; }\n      }\n    }\n\n    function subscribe(observer) {\n      var ado = new AutoDetachObserver(observer), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.scheduleWithState(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n\n      return ado;\n    }\n\n    function ObservableBase() {\n      __super__.call(this, subscribe);\n    }\n\n    ObservableBase.prototype.subscribeCore = function(observer) {\n      throw new Error('Not implemeneted');\n    }\n\n    return ObservableBase;\n\n  }(Observable));\n\n   /**\n   *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n   *\n   *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n   *  that require to be run on a scheduler, use subscribeOn.\n   *\n   *  @param {Scheduler} scheduler Scheduler to notify observers on.\n   *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n   */\n  observableProto.observeOn = function (scheduler) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      return source.subscribe(new ObserveOnObserver(scheduler, observer));\n    }, source);\n  };\n\n   /**\n   *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n   *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n   *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n   *  callbacks on a scheduler, use observeOn.\n\n   *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n   *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n   */\n  observableProto.subscribeOn = function (scheduler) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(), d = new SerialDisposable();\n      d.setDisposable(m);\n      m.setDisposable(scheduler.schedule(function () {\n        d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(observer)));\n      }));\n      return d;\n    }, source);\n  };\n\n  /**\n   * Converts a Promise to an Observable sequence\n   * @param {Promise} An ES6 Compliant promise.\n   * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n   */\n  var observableFromPromise = Observable.fromPromise = function (promise) {\n    return observableDefer(function () {\n      var subject = new Rx.AsyncSubject();\n\n      promise.then(\n        function (value) {\n          subject.onNext(value);\n          subject.onCompleted();\n        },\n        subject.onError.bind(subject));\n\n      return subject;\n    });\n  };\n\n  /*\n   * Converts an existing observable sequence to an ES6 Compatible Promise\n   * @example\n   * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n   *\n   * // With config\n   * Rx.config.Promise = RSVP.Promise;\n   * var promise = Rx.Observable.return(42).toPromise();\n   * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n   * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n   */\n  observableProto.toPromise = function (promiseCtor) {\n    promiseCtor || (promiseCtor = Rx.config.Promise);\n    if (!promiseCtor) { throw new TypeError('Promise type not provided nor in Rx.config.Promise'); }\n    var source = this;\n    return new promiseCtor(function (resolve, reject) {\n      // No cancellation can be done\n      var value, hasValue = false;\n      source.subscribe(function (v) {\n        value = v;\n        hasValue = true;\n      }, reject, function () {\n        hasValue && resolve(value);\n      });\n    });\n  };\n\n  /**\n   * Creates an array from an observable sequence.\n   * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n   */\n  observableProto.toArray = function () {\n    var source = this;\n    return new AnonymousObservable(function(observer) {\n      var arr = [];\n      return source.subscribe(\n        function (x) { arr.push(x); },\n        function (e) { observer.onError(e); },\n        function () {\n          observer.onNext(arr);\n          observer.onCompleted();\n        });\n    }, source);\n  };\n\n  /**\n   *  Creates an observable sequence from a specified subscribe method implementation.\n   * @example\n   *  var res = Rx.Observable.create(function (observer) { return function () { } );\n   *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n   *  var res = Rx.Observable.create(function (observer) { } );\n   * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n   * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n   */\n  Observable.create = Observable.createWithDisposable = function (subscribe, parent) {\n    return new AnonymousObservable(subscribe, parent);\n  };\n\n  /**\n   *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n   *\n   * @example\n   *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n   * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n   * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n   */\n  var observableDefer = Observable.defer = function (observableFactory) {\n    return new AnonymousObservable(function (observer) {\n      var result;\n      try {\n        result = observableFactory();\n      } catch (e) {\n        return observableThrow(e).subscribe(observer);\n      }\n      isPromise(result) && (result = observableFromPromise(result));\n      return result.subscribe(observer);\n    });\n  };\n\n  /**\n   *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n   *\n   * @example\n   *  var res = Rx.Observable.empty();\n   *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n   * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n   * @returns {Observable} An observable sequence with no elements.\n   */\n  var observableEmpty = Observable.empty = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.schedule(function () {\n        observer.onCompleted();\n      });\n    });\n  };\n\n  var maxSafeInteger = Math.pow(2, 53) - 1;\n\n  function StringIterable(str) {\n    this._s = s;\n  }\n\n  StringIterable.prototype[$iterator$] = function () {\n    return new StringIterator(this._s);\n  };\n\n  function StringIterator(str) {\n    this._s = s;\n    this._l = s.length;\n    this._i = 0;\n  }\n\n  StringIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  StringIterator.prototype.next = function () {\n    if (this._i < this._l) {\n      var val = this._s.charAt(this._i++);\n      return { done: false, value: val };\n    } else {\n      return doneEnumerator;\n    }\n  };\n\n  function ArrayIterable(a) {\n    this._a = a;\n  }\n\n  ArrayIterable.prototype[$iterator$] = function () {\n    return new ArrayIterator(this._a);\n  };\n\n  function ArrayIterator(a) {\n    this._a = a;\n    this._l = toLength(a);\n    this._i = 0;\n  }\n\n  ArrayIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  ArrayIterator.prototype.next = function () {\n    if (this._i < this._l) {\n      var val = this._a[this._i++];\n      return { done: false, value: val };\n    } else {\n      return doneEnumerator;\n    }\n  };\n\n  function numberIsFinite(value) {\n    return typeof value === 'number' && root.isFinite(value);\n  }\n\n  function isNan(n) {\n    return n !== n;\n  }\n\n  function getIterable(o) {\n    var i = o[$iterator$], it;\n    if (!i && typeof o === 'string') {\n      it = new StringIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i && o.length !== undefined) {\n      it = new ArrayIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i) { throw new TypeError('Object is not iterable'); }\n    return o[$iterator$]();\n  }\n\n  function sign(value) {\n    var number = +value;\n    if (number === 0) { return number; }\n    if (isNaN(number)) { return number; }\n    return number < 0 ? -1 : 1;\n  }\n\n  function toLength(o) {\n    var len = +o.length;\n    if (isNaN(len)) { return 0; }\n    if (len === 0 || !numberIsFinite(len)) { return len; }\n    len = sign(len) * Math.floor(Math.abs(len));\n    if (len <= 0) { return 0; }\n    if (len > maxSafeInteger) { return maxSafeInteger; }\n    return len;\n  }\n\n  /**\n   * This method creates a new Observable sequence from an array-like or iterable object.\n   * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n   * @param {Function} [mapFn] Map function to call on every element of the array.\n   * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n   * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n   */\n  var observableFrom = Observable.from = function (iterable, mapFn, thisArg, scheduler) {\n    if (iterable == null) {\n      throw new Error('iterable cannot be null.')\n    }\n    if (mapFn && !isFunction(mapFn)) {\n      throw new Error('mapFn when provided must be a function');\n    }\n    if (mapFn) {\n      var mapper = bindCallback(mapFn, thisArg, 2);\n    }\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    var list = Object(iterable), it = getIterable(list);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleRecursiveWithState(0, function (i, self) {\n        try {\n          var next = it.next();\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n        if (next.done) {\n          observer.onCompleted();\n          return;\n        }\n\n        var result = next.value;\n\n        if (mapper) {\n          try {\n            result = mapper(result, i);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n        }\n\n        observer.onNext(result);\n        self(i + 1);\n      });\n    });\n  };\n\n  var FromArrayObservable = (function(__super__) {\n    inherits(FromArrayObservable, __super__);\n    function FromArrayObservable(args, scheduler) {\n      this.args = args;\n      this.scheduler = scheduler || currentThreadScheduler;\n      __super__.call(this);\n    }\n\n    FromArrayObservable.prototype.subscribeCore = function (observer) {\n      var sink = new FromArraySink(observer, this);\n      return sink.run();\n    };\n\n    return FromArrayObservable;\n  }(ObservableBase));\n\n  var FromArraySink = (function () {\n    function FromArraySink(observer, parent) {\n      this.observer = observer;\n      this.parent = parent;\n    }\n\n    function loopRecursive(state, recurse) {\n      if (state.i < state.len) {\n        state.observer.onNext(state.args[state.i++]);\n        recurse(state);\n      } else {\n        state.observer.onCompleted();\n      }\n    }\n\n    FromArraySink.prototype.run = function () {\n      return this.parent.scheduler.scheduleRecursiveWithState(\n        {i: 0, args: this.parent.args, len: this.parent.args.length, observer: this.observer },\n        loopRecursive);\n    };\n\n    return FromArraySink;\n  }());\n\n  /**\n  *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n  * @deprecated use Observable.from or Observable.of\n  * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n  */\n  var observableFromArray = Observable.fromArray = function (array, scheduler) {\n    return new FromArrayObservable(array, scheduler)\n  };\n\n  /**\n   *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new AnonymousObservable(function (observer) {\n      var first = true, state = initialState;\n      return scheduler.scheduleRecursive(function (self) {\n        var hasResult, result;\n        try {\n          if (first) {\n            first = false;\n          } else {\n            state = iterate(state);\n          }\n          hasResult = condition(state);\n          if (hasResult) {\n            result = resultSelector(state);\n          }\n        } catch (exception) {\n          observer.onError(exception);\n          return;\n        }\n        if (hasResult) {\n          observer.onNext(result);\n          self();\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n   * @returns {Observable} An observable sequence whose observers will never get called.\n   */\n  var observableNever = Observable.never = function () {\n    return new AnonymousObservable(function () {\n      return disposableEmpty;\n    });\n  };\n\n  function observableOf (scheduler, array) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new AnonymousObservable(function (observer) {\n      var count = 0, len = array.length;\n      return scheduler.scheduleRecursive(function (self) {\n        if (count < len) {\n          observer.onNext(array[count++]);\n          self();\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  }\n\n  /**\n   *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n   * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n   */\n  Observable.of = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableOf(null, args);\n  };\n\n  /**\n   *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n   * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n   * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n   */\n  Observable.ofWithScheduler = function (scheduler) {\n    for(var args = [], i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableOf(scheduler, args);\n  };\n\n  /**\n   * Convert an object into an observable sequence of [key, value] pairs.\n   * @param {Object} obj The object to inspect.\n   * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n   * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n   */\n  Observable.pairs = function (obj, scheduler) {\n    scheduler || (scheduler = Rx.Scheduler.currentThread);\n    return new AnonymousObservable(function (observer) {\n      var keys = Object.keys(obj), len = keys.length;\n      return scheduler.scheduleRecursiveWithState(0, function (idx, self) {\n        if (idx < len) {\n          var key = keys[idx];\n          observer.onNext([key, obj[key]]);\n          self(idx + 1);\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.range(0, 10);\n   *  var res = Rx.Observable.range(0, 10, Rx.Scheduler.timeout);\n   * @param {Number} start The value of the first integer in the sequence.\n   * @param {Number} count The number of sequential integers to generate.\n   * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n   * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n   */\n  Observable.range = function (start, count, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleRecursiveWithState(0, function (i, self) {\n        if (i < count) {\n          observer.onNext(start + i);\n          self(i + 1);\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.repeat(42);\n   *  var res = Rx.Observable.repeat(42, 4);\n   *  3 - res = Rx.Observable.repeat(42, 4, Rx.Scheduler.timeout);\n   *  4 - res = Rx.Observable.repeat(42, null, Rx.Scheduler.timeout);\n   * @param {Mixed} value Element to repeat.\n   * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n   * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n   */\n  Observable.repeat = function (value, repeatCount, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return observableReturn(value, scheduler).repeat(repeatCount == null ? -1 : repeatCount);\n  };\n\n  /**\n   *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n   *  There is an alias called 'just', and 'returnValue' for browsers <IE9.\n   * @param {Mixed} value Single element in the resulting observable sequence.\n   * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence containing the single specified element.\n   */\n  var observableReturn = Observable['return'] = Observable.just = function (value, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.schedule(function () {\n        observer.onNext(value);\n        observer.onCompleted();\n      });\n    });\n  };\n\n  /** @deprecated use return or just */\n  Observable.returnValue = function () {\n    //deprecate('returnValue', 'return or just');\n    return observableReturn.apply(null, arguments);\n  };\n\n  /**\n   *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n   *  There is an alias to this method called 'throwError' for browsers <IE9.\n   * @param {Mixed} error An object used for the sequence's termination.\n   * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n   */\n  var observableThrow = Observable['throw'] = Observable.throwError = function (error, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.schedule(function () {\n        observer.onError(error);\n      });\n    });\n  };\n\n  /** @deprecated use #some instead */\n  Observable.throwException = function () {\n    //deprecate('throwException', 'throwError');\n    return Observable.throwError.apply(null, arguments);\n  };\n\n  /**\n   * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n   * @param {Function} resourceFactory Factory function to obtain a resource object.\n   * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n   * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n   */\n  Observable.using = function (resourceFactory, observableFactory) {\n    return new AnonymousObservable(function (observer) {\n      var disposable = disposableEmpty, resource, source;\n      try {\n        resource = resourceFactory();\n        resource && (disposable = resource);\n        source = observableFactory(resource);\n      } catch (exception) {\n        return new CompositeDisposable(observableThrow(exception).subscribe(observer), disposable);\n      }\n      return new CompositeDisposable(source.subscribe(observer), disposable);\n    });\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @param {Observable} rightSource Second observable sequence or Promise.\n   * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n   */\n  observableProto.amb = function (rightSource) {\n    var leftSource = this;\n    return new AnonymousObservable(function (observer) {\n      var choice,\n        leftChoice = 'L', rightChoice = 'R',\n        leftSubscription = new SingleAssignmentDisposable(),\n        rightSubscription = new SingleAssignmentDisposable();\n\n      isPromise(rightSource) && (rightSource = observableFromPromise(rightSource));\n\n      function choiceL() {\n        if (!choice) {\n          choice = leftChoice;\n          rightSubscription.dispose();\n        }\n      }\n\n      function choiceR() {\n        if (!choice) {\n          choice = rightChoice;\n          leftSubscription.dispose();\n        }\n      }\n\n      leftSubscription.setDisposable(leftSource.subscribe(function (left) {\n        choiceL();\n        if (choice === leftChoice) {\n          observer.onNext(left);\n        }\n      }, function (err) {\n        choiceL();\n        if (choice === leftChoice) {\n          observer.onError(err);\n        }\n      }, function () {\n        choiceL();\n        if (choice === leftChoice) {\n          observer.onCompleted();\n        }\n      }));\n\n      rightSubscription.setDisposable(rightSource.subscribe(function (right) {\n        choiceR();\n        if (choice === rightChoice) {\n          observer.onNext(right);\n        }\n      }, function (err) {\n        choiceR();\n        if (choice === rightChoice) {\n          observer.onError(err);\n        }\n      }, function () {\n        choiceR();\n        if (choice === rightChoice) {\n          observer.onCompleted();\n        }\n      }));\n\n      return new CompositeDisposable(leftSubscription, rightSubscription);\n    });\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   *\n   * @example\n   * var = Rx.Observable.amb(xs, ys, zs);\n   * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n   */\n  Observable.amb = function () {\n    var acc = observableNever(), items = [];\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { items.push(arguments[i]); }\n    }\n\n    function func(previous, current) {\n      return previous.amb(current);\n    }\n    for (var i = 0, len = items.length; i < len; i++) {\n      acc = func(acc, items[i]);\n    }\n    return acc;\n  };\n\n  function observableCatchHandler(source, handler) {\n    return new AnonymousObservable(function (observer) {\n      var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();\n      subscription.setDisposable(d1);\n      d1.setDisposable(source.subscribe(observer.onNext.bind(observer), function (exception) {\n        var d, result;\n        try {\n          result = handler(exception);\n        } catch (ex) {\n          observer.onError(ex);\n          return;\n        }\n        isPromise(result) && (result = observableFromPromise(result));\n\n        d = new SingleAssignmentDisposable();\n        subscription.setDisposable(d);\n        d.setDisposable(result.subscribe(observer));\n      }, observer.onCompleted.bind(observer)));\n\n      return subscription;\n    }, source);\n  }\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @example\n   * 1 - xs.catchException(ys)\n   * 2 - xs.catchException(function (ex) { return ys(ex); })\n   * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n   * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n   */\n  observableProto['catch'] = observableProto.catchError = function (handlerOrSecond) {\n    return typeof handlerOrSecond === 'function' ?\n      observableCatchHandler(this, handlerOrSecond) :\n      observableCatch([this, handlerOrSecond]);\n  };\n\n  /**\n   * @deprecated use #catch or #catchError instead.\n   */\n  observableProto.catchException = function (handlerOrSecond) {\n    //deprecate('catchException', 'catch or catchError');\n    return this.catchError(handlerOrSecond);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n   * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n   */\n  var observableCatch = Observable.catchError = Observable['catch'] = Observable.catchException = function () {\n    var items = [];\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { items.push(arguments[i]); }\n    }\n    return enumerableOf(items).catchError();\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   * This can be in the form of an argument list of observables or an array.\n   *\n   * @example\n   * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.combineLatest = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return combineLatest.apply(this, args);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   *\n   * @example\n   * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  var combineLatest = Observable.combineLatest = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    var resultSelector = args.pop();\n\n    if (Array.isArray(args[0])) {\n      args = args[0];\n    }\n\n    return new AnonymousObservable(function (observer) {\n      var falseFactory = function () { return false; },\n        n = args.length,\n        hasValue = arrayInitialize(n, falseFactory),\n        hasValueAll = false,\n        isDone = arrayInitialize(n, falseFactory),\n        values = new Array(n);\n\n      function next(i) {\n        var res;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          try {\n            res = resultSelector.apply(null, values);\n          } catch (ex) {\n            observer.onError(ex);\n            return;\n          }\n          observer.onNext(res);\n        } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n          observer.onCompleted();\n        }\n      }\n\n      function done (i) {\n        isDone[i] = true;\n        if (isDone.every(identity)) {\n          observer.onCompleted();\n        }\n      }\n\n      var subscriptions = new Array(n);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          var source = args[i], sad = new SingleAssignmentDisposable();\n          isPromise(source) && (source = observableFromPromise(source));\n          sad.setDisposable(source.subscribe(function (x) {\n              values[i] = x;\n              next(i);\n            },\n            function(e) { observer.onError(e); },\n            function () { done(i); }\n          ));\n          subscriptions[i] = sad;\n        }(idx));\n      }\n\n      return new CompositeDisposable(subscriptions);\n    }, this);\n  };\n\n  /**\n   * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  observableProto.concat = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    args.unshift(this);\n    return observableConcat.apply(null, args);\n  };\n\n  /**\n   * Concatenates all the observable sequences.\n   * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  var observableConcat = Observable.concat = function () {\n    var items = [];\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { items.push(arguments[i]); }\n    }\n    return enumerableOf(items).concat();\n  };\n\n  /**\n   * Concatenates an observable sequence of observable sequences.\n   * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n   */\n  observableProto.concatAll = observableProto.concatObservable = function () {\n    return this.merge(1);\n  };\n\n  /**\n   * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n   * Or merges two observable sequences into a single observable sequence.\n   *\n   * @example\n   * 1 - merged = sources.merge(1);\n   * 2 - merged = source.merge(otherSource);\n   * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n   * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n   */\n  observableProto.merge = function (maxConcurrentOrOther) {\n    if (typeof maxConcurrentOrOther !== 'number') { return observableMerge(this, maxConcurrentOrOther); }\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var activeCount = 0, group = new CompositeDisposable(), isStopped = false, q = [];\n\n      function subscribe(xs) {\n        var subscription = new SingleAssignmentDisposable();\n        group.add(subscription);\n\n        // Check for promises support\n        isPromise(xs) && (xs = observableFromPromise(xs));\n\n        subscription.setDisposable(xs.subscribe(function (x) { o.onNext(x); }, function (e) { o.onError(e); }, function () {\n          group.remove(subscription);\n          if (q.length > 0) {\n            subscribe(q.shift());\n          } else {\n            activeCount--;\n            isStopped && activeCount === 0 && o.onCompleted();\n          }\n        }));\n      }\n      group.add(sources.subscribe(function (innerSource) {\n        if (activeCount < maxConcurrentOrOther) {\n          activeCount++;\n          subscribe(innerSource);\n        } else {\n          q.push(innerSource);\n        }\n      }, function (e) { o.onError(e); }, function () {\n        isStopped = true;\n        activeCount === 0 && o.onCompleted();\n      }));\n      return group;\n    }, sources);\n  };\n\n  /**\n   * Merges all the observable sequences into a single observable sequence.\n   * The scheduler is optional and if not specified, the immediate scheduler is used.\n   * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n   */\n  var observableMerge = Observable.merge = function () {\n    var scheduler, sources = [], i, len = arguments.length;\n    if (!arguments[0]) {\n      scheduler = immediateScheduler;\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else if (isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else {\n      scheduler = immediateScheduler;\n      for(i = 0; i < len; i++) { sources.push(arguments[i]); }\n    }\n    if (Array.isArray(sources[0])) {\n      sources = sources[0];\n    }\n    return observableOf(scheduler, sources).mergeAll();\n  };\n\n  /**\n   * Merges an observable sequence of observable sequences into an observable sequence.\n   * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n   */\n  observableProto.mergeAll = function () {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable(),\n        isStopped = false,\n        m = new SingleAssignmentDisposable();\n\n      group.add(m);\n      m.setDisposable(sources.subscribe(function (innerSource) {\n        var innerSubscription = new SingleAssignmentDisposable();\n        group.add(innerSubscription);\n\n        // Check for promises support\n        isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n\n        innerSubscription.setDisposable(innerSource.subscribe(function (x) { o.onNext(x); }, function (e) { o.onError(e); }, function () {\n          group.remove(innerSubscription);\n          isStopped && group.length === 1 && o.onCompleted();\n        }));\n      }, function (e) { o.onError(e); }, function () {\n        isStopped = true;\n        group.length === 1 && o.onCompleted();\n      }));\n      return group;\n    }, sources);\n  };\n\n  /**\n   * @deprecated use #mergeAll instead.\n   */\n  observableProto.mergeObservable = function () {\n    //deprecate('mergeObservable', 'mergeAll');\n    return this.mergeAll.apply(this, arguments);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n   * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n   */\n  observableProto.onErrorResumeNext = function (second) {\n    if (!second) { throw new Error('Second observable is required'); }\n    return onErrorResumeNext([this, second]);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   *\n   * @example\n   * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);\n   * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);\n   * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n   */\n  var onErrorResumeNext = Observable.onErrorResumeNext = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    }\n    return new AnonymousObservable(function (observer) {\n      var pos = 0, subscription = new SerialDisposable(),\n      cancelable = immediateScheduler.scheduleRecursive(function (self) {\n        var current, d;\n        if (pos < sources.length) {\n          current = sources[pos++];\n          isPromise(current) && (current = observableFromPromise(current));\n          d = new SingleAssignmentDisposable();\n          subscription.setDisposable(d);\n          d.setDisposable(current.subscribe(observer.onNext.bind(observer), self, self));\n        } else {\n          observer.onCompleted();\n        }\n      });\n      return new CompositeDisposable(subscription, cancelable);\n    });\n  };\n\n  /**\n   * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n   * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n   */\n  observableProto.skipUntil = function (other) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var isOpen = false;\n      var disposables = new CompositeDisposable(source.subscribe(function (left) {\n        isOpen && o.onNext(left);\n      }, function (e) { o.onError(e); }, function () {\n        isOpen && o.onCompleted();\n      }));\n\n      isPromise(other) && (other = observableFromPromise(other));\n\n      var rightSubscription = new SingleAssignmentDisposable();\n      disposables.add(rightSubscription);\n      rightSubscription.setDisposable(other.subscribe(function () {\n        isOpen = true;\n        rightSubscription.dispose();\n      }, function (e) { o.onError(e); }, function () {\n        rightSubscription.dispose();\n      }));\n\n      return disposables;\n    }, source);\n  };\n\n  /**\n   * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n   * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n   */\n  observableProto['switch'] = observableProto.switchLatest = function () {\n    var sources = this;\n    return new AnonymousObservable(function (observer) {\n      var hasLatest = false,\n        innerSubscription = new SerialDisposable(),\n        isStopped = false,\n        latest = 0,\n        subscription = sources.subscribe(\n          function (innerSource) {\n            var d = new SingleAssignmentDisposable(), id = ++latest;\n            hasLatest = true;\n            innerSubscription.setDisposable(d);\n\n            // Check if Promise or Observable\n            isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n\n            d.setDisposable(innerSource.subscribe(\n              function (x) { latest === id && observer.onNext(x); },\n              function (e) { latest === id && observer.onError(e); },\n              function () {\n                if (latest === id) {\n                  hasLatest = false;\n                  isStopped && observer.onCompleted();\n                }\n              }));\n          },\n          function (e) { observer.onError(e); },\n          function () {\n            isStopped = true;\n            !hasLatest && observer.onCompleted();\n          });\n      return new CompositeDisposable(subscription, innerSubscription);\n    }, sources);\n  };\n\n  /**\n   * Returns the values from the source observable sequence until the other observable sequence produces a value.\n   * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n   */\n  observableProto.takeUntil = function (other) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      isPromise(other) && (other = observableFromPromise(other));\n      return new CompositeDisposable(\n        source.subscribe(o),\n        other.subscribe(function () { o.onCompleted(); }, function (e) { o.onError(e); }, noop)\n      );\n    }, source);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n   *\n   * @example\n   * 1 - obs = obs1.withLatestFrom(obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = obs1.withLatestFrom([obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.withLatestFrom = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    var resultSelector = args.pop(), source = this;\n\n    if (typeof source === 'undefined') {\n      throw new Error('Source observable not found for withLatestFrom().');\n    }\n    if (typeof resultSelector !== 'function') {\n      throw new Error('withLatestFrom() expects a resultSelector function.');\n    }\n    if (Array.isArray(args[0])) {\n      args = args[0];\n    }\n\n    return new AnonymousObservable(function (observer) {\n      var falseFactory = function () { return false; },\n        n = args.length,\n        hasValue = arrayInitialize(n, falseFactory),\n        hasValueAll = false,\n        values = new Array(n);\n\n      var subscriptions = new Array(n + 1);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          var other = args[i], sad = new SingleAssignmentDisposable();\n          isPromise(other) && (other = observableFromPromise(other));\n          sad.setDisposable(other.subscribe(function (x) {\n            values[i] = x;\n            hasValue[i] = true;\n            hasValueAll = hasValue.every(identity);\n          }, observer.onError.bind(observer), function () {}));\n          subscriptions[i] = sad;\n        }(idx));\n      }\n\n      var sad = new SingleAssignmentDisposable();\n      sad.setDisposable(source.subscribe(function (x) {\n        var res;\n        var allValues = [x].concat(values);\n        if (!hasValueAll) return;\n        try {\n          res = resultSelector.apply(null, allValues);\n        } catch (ex) {\n          observer.onError(ex);\n          return;\n        }\n        observer.onNext(res);\n      }, observer.onError.bind(observer), function () {\n        observer.onCompleted();\n      }));\n      subscriptions[n] = sad;\n\n      return new CompositeDisposable(subscriptions);\n    }, this);\n  };\n\n  function zipArray(second, resultSelector) {\n    var first = this;\n    return new AnonymousObservable(function (observer) {\n      var index = 0, len = second.length;\n      return first.subscribe(function (left) {\n        if (index < len) {\n          var right = second[index++], result;\n          try {\n            result = resultSelector(left, right);\n          } catch (e) {\n            return observer.onError(e);\n          }\n          observer.onNext(result);\n        } else {\n          observer.onCompleted();\n        }\n      }, function (e) { observer.onError(e); }, function () { observer.onCompleted(); });\n    }, first);\n  }\n\n  function falseFactory() { return false; }\n  function emptyArrayFactory() { return []; }\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n   * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n   *\n   * @example\n   * 1 - res = obs1.zip(obs2, fn);\n   * 1 - res = x1.zip([1,2,3], fn);\n   * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n   */\n  observableProto.zip = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    if (Array.isArray(args[0])) { return zipArray.apply(this, args); }\n    var parent = this, resultSelector = args.pop();\n    args.unshift(parent);\n    return new AnonymousObservable(function (observer) {\n      var n = args.length,\n        queues = arrayInitialize(n, emptyArrayFactory),\n        isDone = arrayInitialize(n, falseFactory);\n\n      function next(i) {\n        var res, queuedValues;\n        if (queues.every(function (x) { return x.length > 0; })) {\n          try {\n            queuedValues = queues.map(function (x) { return x.shift(); });\n            res = resultSelector.apply(parent, queuedValues);\n          } catch (ex) {\n            observer.onError(ex);\n            return;\n          }\n          observer.onNext(res);\n        } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n          observer.onCompleted();\n        }\n      };\n\n      function done(i) {\n        isDone[i] = true;\n        if (isDone.every(function (x) { return x; })) {\n          observer.onCompleted();\n        }\n      }\n\n      var subscriptions = new Array(n);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          var source = args[i], sad = new SingleAssignmentDisposable();\n          isPromise(source) && (source = observableFromPromise(source));\n          sad.setDisposable(source.subscribe(function (x) {\n            queues[i].push(x);\n            next(i);\n          }, function (e) { observer.onError(e); }, function () {\n            done(i);\n          }));\n          subscriptions[i] = sad;\n        })(idx);\n      }\n\n      return new CompositeDisposable(subscriptions);\n    }, parent);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n   * @param arguments Observable sources.\n   * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  Observable.zip = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    var first = args.shift();\n    return first.zip.apply(first, args);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n   * @param arguments Observable sources.\n   * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n   */\n  Observable.zipArray = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    }\n    return new AnonymousObservable(function (observer) {\n      var n = sources.length,\n        queues = arrayInitialize(n, function () { return []; }),\n        isDone = arrayInitialize(n, function () { return false; });\n\n      function next(i) {\n        if (queues.every(function (x) { return x.length > 0; })) {\n          var res = queues.map(function (x) { return x.shift(); });\n          observer.onNext(res);\n        } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n          observer.onCompleted();\n          return;\n        }\n      };\n\n      function done(i) {\n        isDone[i] = true;\n        if (isDone.every(identity)) {\n          observer.onCompleted();\n          return;\n        }\n      }\n\n      var subscriptions = new Array(n);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          subscriptions[i] = new SingleAssignmentDisposable();\n          subscriptions[i].setDisposable(sources[i].subscribe(function (x) {\n            queues[i].push(x);\n            next(i);\n          }, function (e) { observer.onError(e); }, function () {\n            done(i);\n          }));\n        })(idx);\n      }\n\n      return new CompositeDisposable(subscriptions);\n    });\n  };\n\n  /**\n   *  Hides the identity of an observable sequence.\n   * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n   */\n  observableProto.asObservable = function () {\n    var source = this;\n    return new AnonymousObservable(function (o) { return source.subscribe(o); }, this);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n   *\n   * @example\n   *  var res = xs.bufferWithCount(10);\n   *  var res = xs.bufferWithCount(10, 1);\n   * @param {Number} count Length of each buffer.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithCount = function (count, skip) {\n    if (typeof skip !== 'number') {\n      skip = count;\n    }\n    return this.windowWithCount(count, skip).selectMany(function (x) {\n      return x.toArray();\n    }).where(function (x) {\n      return x.length > 0;\n    });\n  };\n\n  /**\n   * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n   * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n   */\n  observableProto.dematerialize = function () {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(function (x) { return x.accept(o); }, function(e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, this);\n  };\n\n  /**\n   *  Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.\n   *\n   *  var obs = observable.distinctUntilChanged();\n   *  var obs = observable.distinctUntilChanged(function (x) { return x.id; });\n   *  var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; });\n   *\n   * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value.\n   * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n   * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinctUntilChanged = function (keySelector, comparer) {\n    var source = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var hasCurrentKey = false, currentKey;\n      return source.subscribe(function (value) {\n        var key = value;\n        if (keySelector) {\n          try {\n            key = keySelector(value);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        if (hasCurrentKey) {\n          try {\n            var comparerEquals = comparer(currentKey, key);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        if (!hasCurrentKey || !comparerEquals) {\n          hasCurrentKey = true;\n          currentKey = key;\n          o.onNext(value);\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, this);\n  };\n\n  /**\n   *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n   * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n   * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto['do'] = observableProto.tap = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) {\n    var source = this, tapObserver = typeof observerOrOnNext === 'function' || typeof observerOrOnNext === 'undefined'?\n      observerCreate(observerOrOnNext || noop, onError || noop, onCompleted || noop) :\n      observerOrOnNext;\n    return new AnonymousObservable(function (observer) {\n      return source.subscribe(function (x) {\n        try {\n          tapObserver.onNext(x);\n        } catch (e) {\n          observer.onError(e);\n        }\n        observer.onNext(x);\n      }, function (err) {\n          try {\n            tapObserver.onError(err);\n          } catch (e) {\n            observer.onError(e);\n          }\n        observer.onError(err);\n      }, function () {\n        try {\n          tapObserver.onCompleted();\n        } catch (e) {\n          observer.onError(e);\n        }\n        observer.onCompleted();\n      });\n    }, this);\n  };\n\n  /**\n   *  Invokes an action for each element in the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function} onNext Action to invoke for each element in the observable sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto.doOnNext = observableProto.tapOnNext = function (onNext, thisArg) {\n    return this.tap(typeof thisArg !== 'undefined' ? function (x) { onNext.call(thisArg, x); } : onNext);\n  };\n\n  /**\n   *  Invokes an action upon exceptional termination of the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto.doOnError = observableProto.tapOnError = function (onError, thisArg) {\n    return this.tap(noop, typeof thisArg !== 'undefined' ? function (e) { onError.call(thisArg, e); } : onError);\n  };\n\n  /**\n   *  Invokes an action upon graceful termination of the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto.doOnCompleted = observableProto.tapOnCompleted = function (onCompleted, thisArg) {\n    return this.tap(noop, null, typeof thisArg !== 'undefined' ? function () { onCompleted.call(thisArg); } : onCompleted);\n  };\n\n  /**\n   *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n   * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n   * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n   */\n  observableProto['finally'] = observableProto.ensure = function (action) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var subscription;\n      try {\n        subscription = source.subscribe(observer);\n      } catch (e) {\n        action();\n        throw e;\n      }\n      return disposableCreate(function () {\n        try {\n          subscription.dispose();\n        } catch (e) {\n          throw e;\n        } finally {\n          action();\n        }\n      });\n    }, this);\n  };\n\n  /**\n   * @deprecated use #finally or #ensure instead.\n   */\n  observableProto.finallyAction = function (action) {\n    //deprecate('finallyAction', 'finally or ensure');\n    return this.ensure(action);\n  };\n\n  /**\n   *  Ignores all elements in an observable sequence leaving only the termination messages.\n   * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n   */\n  observableProto.ignoreElements = function () {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(noop, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n   * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n   */\n  observableProto.materialize = function () {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      return source.subscribe(function (value) {\n        observer.onNext(notificationCreateOnNext(value));\n      }, function (e) {\n        observer.onNext(notificationCreateOnError(e));\n        observer.onCompleted();\n      }, function () {\n        observer.onNext(notificationCreateOnCompleted());\n        observer.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n   * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n   * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n   */\n  observableProto.repeat = function (repeatCount) {\n    return enumerableRepeat(this, repeatCount).concat();\n  };\n\n  /**\n   *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n   *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n   *\n   * @example\n   *  var res = retried = retry.repeat();\n   *  var res = retried = retry.repeat(2);\n   * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retry = function (retryCount) {\n    return enumerableRepeat(this, retryCount).catchError();\n  };\n\n  /**\n   *  Repeats the source observable sequence upon error each time the notifier emits or until it successfully terminates. \n   *  if the notifier completes, the observable sequence completes.\n   *\n   * @example\n   *  var timer = Observable.timer(500);\n   *  var source = observable.retryWhen(timer);\n   * @param {Observable} [notifier] An observable that triggers the retries or completes the observable with onNext or onCompleted respectively.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retryWhen = function (notifier) {\n    return enumerableRepeat(this).catchErrorWhen(notifier);\n  };\n  /**\n   *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n   *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n   * @example\n   *  var res = source.scan(function (acc, x) { return acc + x; });\n   *  var res = source.scan(0, function (acc, x) { return acc + x; });\n   * @param {Mixed} [seed] The initial accumulator value.\n   * @param {Function} accumulator An accumulator function to be invoked on each element.\n   * @returns {Observable} An observable sequence containing the accumulated values.\n   */\n  observableProto.scan = function () {\n    var hasSeed = false, seed, accumulator, source = this;\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[0];\n      accumulator = arguments[1];\n    } else {\n      accumulator = arguments[0];\n    }\n    return new AnonymousObservable(function (o) {\n      var hasAccumulation, accumulation, hasValue;\n      return source.subscribe (\n        function (x) {\n          !hasValue && (hasValue = true);\n          try {\n            if (hasAccumulation) {\n              accumulation = accumulator(accumulation, x);\n            } else {\n              accumulation = hasSeed ? accumulator(seed, x) : x;\n              hasAccumulation = true;\n            }\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n\n          o.onNext(accumulation);\n        },\n        function (e) { o.onError(e); },\n        function () {\n          !hasValue && hasSeed && o.onNext(seed);\n          o.onCompleted();\n        }\n      );\n    }, source);\n  };\n\n  /**\n   *  Bypasses a specified number of elements at the end of an observable sequence.\n   * @description\n   *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n   *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n   * @param count Number of elements to bypass at the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n   */\n  observableProto.skipLast = function (count) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        q.push(x);\n        q.length > count && o.onNext(q.shift());\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n   *  @example\n   *  var res = source.startWith(1, 2, 3);\n   *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n   * @param {Arguments} args The specified values to prepend to the observable sequence\n   * @returns {Observable} The source sequence prepended with the specified values.\n   */\n  observableProto.startWith = function () {\n    var values, scheduler, start = 0;\n    if (!!arguments.length && isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      start = 1;\n    } else {\n      scheduler = immediateScheduler;\n    }\n    for(var args = [], i = start, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return enumerableOf([observableFromArray(args, scheduler), this]).concat();\n  };\n\n  /**\n   *  Returns a specified number of contiguous elements from the end of an observable sequence.\n   * @description\n   *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n   *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLast = function (count) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        q.push(x);\n        q.length > count && q.shift();\n      }, function (e) { o.onError(e); }, function () {\n        while (q.length > 0) { o.onNext(q.shift()); }\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n   *\n   * @description\n   *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n   *  source sequence, this buffer is produced on the result sequence.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLastBuffer = function (count) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        q.push(x);\n        q.length > count && q.shift();\n      }, function (e) { o.onError(e); }, function () {\n        o.onNext(q);\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n   *\n   *  var res = xs.windowWithCount(10);\n   *  var res = xs.windowWithCount(10, 1);\n   * @param {Number} count Length of each window.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithCount = function (count, skip) {\n    var source = this;\n    +count || (count = 0);\n    Math.abs(count) === Infinity && (count = 0);\n    if (count <= 0) { throw new Error(argumentOutOfRange); }\n    skip == null && (skip = count);\n    +skip || (skip = 0);\n    Math.abs(skip) === Infinity && (skip = 0);\n\n    if (skip <= 0) { throw new Error(argumentOutOfRange); }\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(),\n        refCountDisposable = new RefCountDisposable(m),\n        n = 0,\n        q = [];\n\n      function createWindow () {\n        var s = new Subject();\n        q.push(s);\n        observer.onNext(addRef(s, refCountDisposable));\n      }\n\n      createWindow();\n\n      m.setDisposable(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n          var c = n - count + 1;\n          c >= 0 && c % skip === 0 && q.shift().onCompleted();\n          ++n % skip === 0 && createWindow();\n        },\n        function (e) {\n          while (q.length > 0) { q.shift().onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          while (q.length > 0) { q.shift().onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  function concatMap(source, selector, thisArg) {\n    var selectorFunc = bindCallback(selector, thisArg, 3);\n    return source.map(function (x, i) {\n      var result = selectorFunc(x, i, source);\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));\n      return result;\n    }).concatAll();\n  }\n\n  /**\n   *  One of the Following:\n   *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   * @example\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n   *  Or:\n   *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n   *\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n   *  Or:\n   *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n   * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n   * source sequence onto which could be either an observable or Promise.\n   * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n   */\n  observableProto.selectConcat = observableProto.concatMap = function (selector, resultSelector, thisArg) {\n    if (isFunction(selector) && isFunction(resultSelector)) {\n      return this.concatMap(function (x, i) {\n        var selectorResult = selector(x, i);\n        isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));\n        (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));\n\n        return selectorResult.map(function (y, i2) {\n          return resultSelector(x, y, i, i2);\n        });\n      });\n    }\n    return isFunction(selector) ?\n      concatMap(this, selector, thisArg) :\n      concatMap(this, function () { return selector; });\n  };\n\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.concatMapObserver = observableProto.selectConcatObserver = function(onNext, onError, onCompleted, thisArg) {\n    var source = this,\n        onNextFunc = bindCallback(onNext, thisArg, 2),\n        onErrorFunc = bindCallback(onError, thisArg, 1),\n        onCompletedFunc = bindCallback(onCompleted, thisArg, 0);\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNextFunc(x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onErrorFunc(err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompletedFunc();\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, this).concatAll();\n  };\n\n    /**\n     *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n     *\n     *  var res = obs = xs.defaultIfEmpty();\n     *  2 - obs = xs.defaultIfEmpty(false);\n     *\n     * @memberOf Observable#\n     * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n     * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n     */\n    observableProto.defaultIfEmpty = function (defaultValue) {\n      var source = this;\n      defaultValue === undefined && (defaultValue = null);\n      return new AnonymousObservable(function (observer) {\n        var found = false;\n        return source.subscribe(function (x) {\n          found = true;\n          observer.onNext(x);\n        },\n        function (e) { observer.onError(e); }, \n        function () {\n          !found && observer.onNext(defaultValue);\n          observer.onCompleted();\n        });\n      }, source);\n    };\n\n  // Swap out for Array.findIndex\n  function arrayIndexOfComparer(array, item, comparer) {\n    for (var i = 0, len = array.length; i < len; i++) {\n      if (comparer(array[i], item)) { return i; }\n    }\n    return -1;\n  }\n\n  function HashSet(comparer) {\n    this.comparer = comparer;\n    this.set = [];\n  }\n  HashSet.prototype.push = function(value) {\n    var retValue = arrayIndexOfComparer(this.set, value, this.comparer) === -1;\n    retValue && this.set.push(value);\n    return retValue;\n  };\n\n  /**\n   *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n   *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n   *\n   * @example\n   *  var res = obs = xs.distinct();\n   *  2 - obs = xs.distinct(function (x) { return x.id; });\n   *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n   * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n   * @param {Function} [comparer]  Used to compare items in the collection.\n   * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinct = function (keySelector, comparer) {\n    var source = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var hashSet = new HashSet(comparer);\n      return source.subscribe(function (x) {\n        var key = x;\n\n        if (keySelector) {\n          try {\n            key = keySelector(x);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        hashSet.push(key) && o.onNext(x);\n      },\n      function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, this);\n  };\n\n  var MapObservable = (function (__super__) {\n    inherits(MapObservable, __super__);\n\n    function MapObservable(source, selector, thisArg) {\n      this.source = source;\n      this.selector = bindCallback(selector, thisArg, 3);\n      __super__.call(this);\n    }\n\n    MapObservable.prototype.internalMap = function (selector, thisArg) {\n      var self = this;\n      return new MapObservable(this.source, function (x, i, o) { return selector(self.selector(x, i, o), i, o); }, thisArg)\n    };\n\n    MapObservable.prototype.subscribeCore = function (observer) {\n      return this.source.subscribe(new MapObserver(observer, this.selector, this));\n    };\n\n    return MapObservable;\n\n  }(ObservableBase));\n\n  function MapObserver(observer, selector, source) {\n    this.observer = observer;\n    this.selector = selector;\n    this.source = source;\n    this.index = 0;\n    this.isStopped = false;\n  }\n\n  MapObserver.prototype.onNext = function(x) {\n    if (this.isStopped) { return; }\n    try {\n      var result = this.selector(x, this.index++, this.source);\n    } catch(e) {\n      return this.observer.onError(e);\n    }\n    this.observer.onNext(result);\n  };\n  MapObserver.prototype.onError = function (e) {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onError(e); }\n  };\n  MapObserver.prototype.onCompleted = function () {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onCompleted(); }\n  };\n  MapObserver.prototype.dispose = function() { this.isStopped = true; };\n  MapObserver.prototype.fail = function (e) {\n    if (!this.isStopped) {\n      this.isStopped = true;\n      this.observer.onError(e);\n      return true;\n    }\n\n    return false;\n  };\n\n  /**\n  * Projects each element of an observable sequence into a new form by incorporating the element's index.\n  * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n  */\n  observableProto.map = observableProto.select = function (selector, thisArg) {\n    var selectorFn = typeof selector === 'function' ? selector : function () { return selector; };\n    return this instanceof MapObservable ?\n      this.internalMap(selector, thisArg) :\n      new MapObservable(this, selectorFn, thisArg);\n  };\n\n  /**\n   * Retrieves the value of a specified nested property from all elements in\n   * the Observable sequence.\n   * @param {Arguments} arguments The nested properties to pluck.\n   * @returns {Observable} Returns a new Observable sequence of property values.\n   */\n  observableProto.pluck = function () {\n    var args = arguments, len = arguments.length;\n    if (len === 0) { throw new Error('List of properties cannot be empty.'); }\n    return this.map(function (x) {\n      var currentProp = x;\n      for (var i = 0; i < len; i++) {\n        var p = currentProp[args[i]];\n        if (typeof p !== 'undefined') {\n          currentProp = p;\n        } else {\n          return undefined;\n        }\n      }\n      return currentProp;\n    });\n  };\n\n  function flatMap(source, selector, thisArg) {\n    var selectorFunc = bindCallback(selector, thisArg, 3);\n    return source.map(function (x, i) {\n      var result = selectorFunc(x, i, source);\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));\n      return result;\n    }).mergeAll();\n  }\n\n  /**\n   *  One of the Following:\n   *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   * @example\n   *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n   *  Or:\n   *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n   *\n   *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n   *  Or:\n   *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n   * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n   * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n   */\n  observableProto.selectMany = observableProto.flatMap = function (selector, resultSelector, thisArg) {\n    if (isFunction(selector) && isFunction(resultSelector)) {\n      return this.flatMap(function (x, i) {\n        var selectorResult = selector(x, i);\n        isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));\n        (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));\n\n        return selectorResult.map(function (y, i2) {\n          return resultSelector(x, y, i, i2);\n        });\n      }, thisArg);\n    }\n    return isFunction(selector) ?\n      flatMap(this, selector, thisArg) :\n      flatMap(this, function () { return selector; });\n  };\n\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.flatMapObserver = observableProto.selectManyObserver = function (onNext, onError, onCompleted, thisArg) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNext.call(thisArg, x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onError.call(thisArg, err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompleted.call(thisArg);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, source).mergeAll();\n  };\n\n  /**\n   *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n   *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n   * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n   *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n   */\n  observableProto.selectSwitch = observableProto.flatMapLatest = observableProto.switchMap = function (selector, thisArg) {\n    return this.select(selector, thisArg).switchLatest();\n  };\n\n  /**\n   * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n   * @param {Number} count The number of elements to skip before returning the remaining elements.\n   * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n   */\n  observableProto.skip = function (count) {\n    if (count < 0) { throw new Error(argumentOutOfRange); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var remaining = count;\n      return source.subscribe(function (x) {\n        if (remaining <= 0) {\n          o.onNext(x);\n        } else {\n          remaining--;\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n   *  The element's index is used in the logic of the predicate function.\n   *\n   *  var res = source.skipWhile(function (value) { return value < 10; });\n   *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n   */\n  observableProto.skipWhile = function (predicate, thisArg) {\n    var source = this,\n        callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      var i = 0, running = false;\n      return source.subscribe(function (x) {\n        if (!running) {\n          try {\n            running = !callback(x, i++, source);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        running && o.onNext(x);\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n   *\n   *  var res = source.take(5);\n   *  var res = source.take(0, Rx.Scheduler.timeout);\n   * @param {Number} count The number of elements to return.\n   * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n   * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n   */\n  observableProto.take = function (count, scheduler) {\n    if (count < 0) { throw new RangeError(argumentOutOfRange); }\n    if (count === 0) { return observableEmpty(scheduler); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var remaining = count;\n      return source.subscribe(function (x) {\n        if (remaining-- > 0) {\n          o.onNext(x);\n          remaining === 0 && o.onCompleted();\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Returns elements from an observable sequence as long as a specified condition is true.\n   *  The element's index is used in the logic of the predicate function.\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n   */\n  observableProto.takeWhile = function (predicate, thisArg) {\n    var source = this,\n        callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      var i = 0, running = true;\n      return source.subscribe(function (x) {\n        if (running) {\n          try {\n            running = callback(x, i++, source);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n          if (running) {\n            o.onNext(x);\n          } else {\n            o.onCompleted();\n          }\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  var FilterObservable = (function (__super__) {\n    inherits(FilterObservable, __super__);\n\n    function FilterObservable(source, predicate, thisArg) {\n      this.source = source;\n      this.predicate = bindCallback(predicate, thisArg, 3);\n      __super__.call(this);\n    }\n\n    FilterObservable.prototype.subscribeCore = function (observer) {\n      return this.source.subscribe(new FilterObserver(observer, this.predicate, this));\n    };\n\n    FilterObservable.prototype.internalFilter = function(predicate, thisArg) {\n      var self = this;\n      return new FilterObservable(this.source, function(x, i, o) { return self.predicate(x, i, o) && predicate(x, i, o); }, thisArg);\n    };\n\n    return FilterObservable;\n\n  }(ObservableBase));\n\n  function FilterObserver(observer, predicate, source) {\n    this.observer = observer;\n    this.predicate = predicate;\n    this.source = source;\n    this.index = 0;\n    this.isStopped = false;\n  }\n\n  FilterObserver.prototype.onNext = function(x) {\n    try {\n      var shouldYield = this.predicate(x, this.index++, this.source);\n    } catch(e) {\n      return this.observer.onError(e);\n    }\n    shouldYield && this.observer.onNext(x);\n  };\n\n  FilterObserver.prototype.onError = function (e) {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onError(e); }\n  };\n  FilterObserver.prototype.onCompleted = function () {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onCompleted(); }\n  };\n  FilterObserver.prototype.dispose = function() { this.isStopped = true; };\n  FilterObserver.prototype.fail = function (e) {\n    if (!this.isStopped) {\n      this.isStopped = true;\n      this.observer.onError(e);\n      return true;\n    }\n\n    return false;\n  };\n\n\n\n  /**\n  *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n  * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n  */\n  observableProto.filter = observableProto.where = function (predicate, thisArg) {\n    return this instanceof FilterObservable ? this.internalFilter(predicate, thisArg) :\n      new FilterObservable(this, predicate, thisArg);\n  };\n\n  /**\n   * Executes a transducer to transform the observable sequence\n   * @param {Transducer} transducer A transducer to execute\n   * @returns {Observable} An Observable sequence containing the results from the transducer.\n   */\n  observableProto.transduce = function(transducer) {\n    var source = this;\n\n    function transformForObserver(observer) {\n      return {\n        init: function() {\n          return observer;\n        },\n        step: function(obs, input) {\n          return obs.onNext(input);\n        },\n        result: function(obs) {\n          return obs.onCompleted();\n        }\n      };\n    }\n\n    return new AnonymousObservable(function(observer) {\n      var xform = transducer(transformForObserver(observer));\n      return source.subscribe(\n        function(v) {\n          try {\n            xform.step(observer, v);\n          } catch (e) {\n            observer.onError(e);\n          }\n        },\n        observer.onError.bind(observer),\n        function() { xform.result(observer); }\n      );\n    }, source);\n  };\n\n  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {\n    inherits(AnonymousObservable, __super__);\n\n    // Fix subscriber to check for undefined or function returned to decorate as Disposable\n    function fixSubscriber(subscriber) {\n      if (subscriber && typeof subscriber.dispose === 'function') { return subscriber; }\n\n      return typeof subscriber === 'function' ?\n        disposableCreate(subscriber) :\n        disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], subscribe = state[1];\n      try {\n        ado.setDisposable(fixSubscriber(subscribe(ado)));\n      } catch (e) {\n        if (!ado.fail(e)) { throw e; }\n      }\n    }\n\n    function AnonymousObservable(subscribe, parent) {\n      this.source = parent;\n\n      function s(observer) {\n\n        var ado = new AutoDetachObserver(observer), state = [ado, subscribe];\n\n        if (currentThreadScheduler.scheduleRequired()) {\n          currentThreadScheduler.scheduleWithState(state, setDisposable);\n        } else {\n          setDisposable(null, state);\n        }\n\n        return ado;\n      }\n\n      __super__.call(this, s);\n    }\n\n    return AnonymousObservable;\n\n  }(Observable));\n\n  var AutoDetachObserver = (function (__super__) {\n    inherits(AutoDetachObserver, __super__);\n\n    function AutoDetachObserver(observer) {\n      __super__.call(this);\n      this.observer = observer;\n      this.m = new SingleAssignmentDisposable();\n    }\n\n    var AutoDetachObserverPrototype = AutoDetachObserver.prototype;\n\n    AutoDetachObserverPrototype.next = function (value) {\n      var noError = false;\n      try {\n        this.observer.onNext(value);\n        noError = true;\n      } catch (e) {\n        throw e;\n      } finally {\n        !noError && this.dispose();\n      }\n    };\n\n    AutoDetachObserverPrototype.error = function (err) {\n      try {\n        this.observer.onError(err);\n      } catch (e) {\n        throw e;\n      } finally {\n        this.dispose();\n      }\n    };\n\n    AutoDetachObserverPrototype.completed = function () {\n      try {\n        this.observer.onCompleted();\n      } catch (e) {\n        throw e;\n      } finally {\n        this.dispose();\n      }\n    };\n\n    AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };\n    AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };\n\n    AutoDetachObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.m.dispose();\n    };\n\n    return AutoDetachObserver;\n  }(AbstractObserver));\n\n  var InnerSubscription = function (subject, observer) {\n    this.subject = subject;\n    this.observer = observer;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this.subject.isDisposed && this.observer !== null) {\n      var idx = this.subject.observers.indexOf(this.observer);\n      this.subject.observers.splice(idx, 1);\n      this.observer = null;\n    }\n  };\n\n  /**\n   *  Represents an object that is both an observable sequence as well as an observer.\n   *  Each notification is broadcasted to all subscribed observers.\n   */\n  var Subject = Rx.Subject = (function (__super__) {\n    function subscribe(observer) {\n      checkDisposed(this);\n      if (!this.isStopped) {\n        this.observers.push(observer);\n        return new InnerSubscription(this, observer);\n      }\n      if (this.hasError) {\n        observer.onError(this.error);\n        return disposableEmpty;\n      }\n      observer.onCompleted();\n      return disposableEmpty;\n    }\n\n    inherits(Subject, __super__);\n\n    /**\n     * Creates a subject.\n     */\n    function Subject() {\n      __super__.call(this, subscribe);\n      this.isDisposed = false,\n      this.isStopped = false,\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(Subject.prototype, Observer.prototype, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onCompleted();\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.error = error;\n          this.hasError = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onNext(value);\n          }\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    /**\n     * Creates a subject from the specified observer and observable.\n     * @param {Observer} observer The observer used to send messages to the subject.\n     * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n     * @returns {Subject} Subject implemented using the given observer and observable.\n     */\n    Subject.create = function (observer, observable) {\n      return new AnonymousSubject(observer, observable);\n    };\n\n    return Subject;\n  }(Observable));\n\n  /**\n   *  Represents the result of an asynchronous operation.\n   *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n   */\n  var AsyncSubject = Rx.AsyncSubject = (function (__super__) {\n\n    function subscribe(observer) {\n      checkDisposed(this);\n\n      if (!this.isStopped) {\n        this.observers.push(observer);\n        return new InnerSubscription(this, observer);\n      }\n\n      if (this.hasError) {\n        observer.onError(this.error);\n      } else if (this.hasValue) {\n        observer.onNext(this.value);\n        observer.onCompleted();\n      } else {\n        observer.onCompleted();\n      }\n\n      return disposableEmpty;\n    }\n\n    inherits(AsyncSubject, __super__);\n\n    /**\n     * Creates a subject that can only receive one value and that value is cached for all future observations.\n     * @constructor\n     */\n    function AsyncSubject() {\n      __super__.call(this, subscribe);\n\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasValue = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(AsyncSubject.prototype, Observer, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () {\n        checkDisposed(this);\n        return this.observers.length > 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n       */\n      onCompleted: function () {\n        var i, len;\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          var os = cloneArray(this.observers), len = os.length;\n\n          if (this.hasValue) {\n            for (i = 0; i < len; i++) {\n              var o = os[i];\n              o.onNext(this.value);\n              o.onCompleted();\n            }\n          } else {\n            for (i = 0; i < len; i++) {\n              os[i].onCompleted();\n            }\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the error.\n       * @param {Mixed} error The Error to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.hasError = true;\n          this.error = error;\n\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n       * @param {Mixed} value The value to store in the subject.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        this.hasValue = true;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.exception = null;\n        this.value = null;\n      }\n    });\n\n    return AsyncSubject;\n  }(Observable));\n\n  var AnonymousSubject = Rx.AnonymousSubject = (function (__super__) {\n    inherits(AnonymousSubject, __super__);\n\n    function subscribe(observer) {\n      return this.observable.subscribe(observer);\n    }\n\n    function AnonymousSubject(observer, observable) {\n      this.observer = observer;\n      this.observable = observable;\n      __super__.call(this, subscribe);\n    }\n\n    addProperties(AnonymousSubject.prototype, Observer.prototype, {\n      onCompleted: function () {\n        this.observer.onCompleted();\n      },\n      onError: function (error) {\n        this.observer.onError(error);\n      },\n      onNext: function (value) {\n        this.observer.onNext(value);\n      }\n    });\n\n    return AnonymousSubject;\n  }(Observable));\n\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    root.Rx = Rx;\n\n    define(function() {\n      return Rx;\n    });\n  } else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = Rx).Rx = Rx;\n    } else {\n      freeExports.Rx = Rx;\n    }\n  } else {\n    // in a browser or Rhino\n    root.Rx = Rx;\n  }\n\n  // All code before this point will be filtered from stack traces.\n  var rEndingLine = captureLine();\n\n}.call(this));\n"
  },
  {
    "path": "tests/perf/old/rx.experimental.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n    var objectTypes = {\n        'boolean': false,\n        'function': true,\n        'object': true,\n        'number': false,\n        'string': false,\n        'undefined': false\n    };\n\n    var root = (objectTypes[typeof window] && window) || this,\n        freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n        freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n        moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n        freeGlobal = objectTypes[typeof global] && global;\n\n    if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n        root = freeGlobal;\n    }\n\n    // Because of build optimizers\n    if (typeof define === 'function' && define.amd) {\n        define(['rx'], function (Rx, exports) {\n            return factory(root, exports, Rx);\n        });\n    } else if (typeof module === 'object' && module && module.exports === freeExports) {\n        module.exports = factory(root, module.exports, require('./rx'));\n    } else {\n        root.Rx = factory(root, {}, root.Rx);\n    }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Aliases\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    observableConcat = Observable.concat,\n    observableDefer = Observable.defer,\n    observableEmpty = Observable.empty,\n    disposableEmpty = Rx.Disposable.empty,\n    CompositeDisposable = Rx.CompositeDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    Enumerator = Rx.internals.Enumerator,\n    Enumerable = Rx.internals.Enumerable,\n    enumerableOf = Enumerable.of,\n    immediateScheduler = Rx.Scheduler.immediate,\n    currentThreadScheduler = Rx.Scheduler.currentThread,\n    slice = Array.prototype.slice,\n    AsyncSubject = Rx.AsyncSubject,\n    Observer = Rx.Observer,\n    inherits = Rx.internals.inherits,\n    bindCallback = Rx.internals.bindCallback,\n    addProperties = Rx.internals.addProperties,\n    helpers = Rx.helpers,\n    noop = helpers.noop,\n    isPromise = helpers.isPromise,\n    isScheduler = helpers.isScheduler,\n    observableFromPromise = Observable.fromPromise;\n\n  // Utilities\n  function argsOrArray(args, idx) {\n    return args.length === 1 && Array.isArray(args[idx]) ?\n      args[idx] :\n      slice.call(args);\n  }\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o[$iterator$] !== undefined;\n  }\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  }\n\n  Rx.helpers.iterator = $iterator$;\n\n  function enumerableWhile(condition, source) {\n    return new Enumerable(function () {\n      return new Enumerator(function () {\n        return condition() ?\n          { done: false, value: source } :\n          { done: true, value: undefined };\n      });\n    });\n  }\n\n   /**\n   *  Returns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions.\n   *  This operator allows for a fluent style of writing queries that use the same sequence multiple times.\n   *\n   * @param {Function} selector Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.letBind = observableProto['let'] = function (func) {\n    return func(this);\n  };\n\n   /**\n   *  Determines whether an observable collection contains values. There is an alias for this method called 'ifThen' for browsers <IE9\n   *\n   * @example\n   *  1 - res = Rx.Observable.if(condition, obs1);\n   *  2 - res = Rx.Observable.if(condition, obs1, obs2);\n   *  3 - res = Rx.Observable.if(condition, obs1, scheduler);\n   * @param {Function} condition The condition which determines if the thenSource or elseSource will be run.\n   * @param {Observable} thenSource The observable sequence or Promise that will be run if the condition function returns true.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the condition function returns false. If this is not provided, it defaults to Rx.Observabe.Empty with the specified scheduler.\n   * @returns {Observable} An observable sequence which is either the thenSource or elseSource.\n   */\n  Observable['if'] = Observable.ifThen = function (condition, thenSource, elseSourceOrScheduler) {\n    return observableDefer(function () {\n      elseSourceOrScheduler || (elseSourceOrScheduler = observableEmpty());\n\n      isPromise(thenSource) && (thenSource = observableFromPromise(thenSource));\n      isPromise(elseSourceOrScheduler) && (elseSourceOrScheduler = observableFromPromise(elseSourceOrScheduler));\n\n      // Assume a scheduler for empty only\n      typeof elseSourceOrScheduler.now === 'function' && (elseSourceOrScheduler = observableEmpty(elseSourceOrScheduler));\n      return condition() ? thenSource : elseSourceOrScheduler;\n    });\n  };\n\n   /**\n   *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n   * There is an alias for this method called 'forIn' for browsers <IE9\n   * @param {Array} sources An array of values to turn into an observable sequence.\n   * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n   * @returns {Observable} An observable sequence from the concatenated observable sequences.\n   */\n  Observable['for'] = Observable.forIn = function (sources, resultSelector, thisArg) {\n    return enumerableOf(sources, resultSelector, thisArg).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a while loop.\n   * There is an alias for this method called 'whileDo' for browsers <IE9\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  var observableWhileDo = Observable['while'] = Observable.whileDo = function (condition, source) {\n    isPromise(source) && (source = observableFromPromise(source));\n    return enumerableWhile(condition, source).concat();\n  };\n\n   /**\n   *  Repeats source as long as condition holds emulating a do while loop.\n   *\n   * @param {Function} condition The condition which determines if the source will be repeated.\n   * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n   * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n   */\n  observableProto.doWhile = function (condition) {\n    return observableConcat([this, observableWhileDo(condition, this)]);\n  };\n\n   /**\n   *  Uses selector to determine which source in sources to use.\n   *  There is an alias 'switchCase' for browsers <IE9.\n   *\n   * @example\n   *  1 - res = Rx.Observable.case(selector, { '1': obs1, '2': obs2 });\n   *  1 - res = Rx.Observable.case(selector, { '1': obs1, '2': obs2 }, obs0);\n   *  1 - res = Rx.Observable.case(selector, { '1': obs1, '2': obs2 }, scheduler);\n   *\n   * @param {Function} selector The function which extracts the value for to test in a case statement.\n   * @param {Array} sources A object which has keys which correspond to the case statement labels.\n   * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n   *\n   * @returns {Observable} An observable sequence which is determined by a case statement.\n   */\n  Observable['case'] = Observable.switchCase = function (selector, sources, defaultSourceOrScheduler) {\n    return observableDefer(function () {\n      isPromise(defaultSourceOrScheduler) && (defaultSourceOrScheduler = observableFromPromise(defaultSourceOrScheduler));\n      defaultSourceOrScheduler || (defaultSourceOrScheduler = observableEmpty());\n\n      typeof defaultSourceOrScheduler.now === 'function' && (defaultSourceOrScheduler = observableEmpty(defaultSourceOrScheduler));\n\n      var result = sources[selector()];\n      isPromise(result) && (result = observableFromPromise(result));\n\n      return result || defaultSourceOrScheduler;\n    });\n  };\n\n   /**\n   *  Expands an observable sequence by recursively invoking selector.\n   *\n   * @param {Function} selector Selector function to invoke for each produced element, resulting in another sequence to which the selector will be invoked recursively again.\n   * @param {Scheduler} [scheduler] Scheduler on which to perform the expansion. If not provided, this defaults to the current thread scheduler.\n   * @returns {Observable} An observable sequence containing all the elements produced by the recursive expansion.\n   */\n  observableProto.expand = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var q = [],\n        m = new SerialDisposable(),\n        d = new CompositeDisposable(m),\n        activeCount = 0,\n        isAcquired = false;\n\n      var ensureActive = function () {\n        var isOwner = false;\n        if (q.length > 0) {\n          isOwner = !isAcquired;\n          isAcquired = true;\n        }\n        if (isOwner) {\n          m.setDisposable(scheduler.scheduleRecursive(function (self) {\n            var work;\n            if (q.length > 0) {\n              work = q.shift();\n            } else {\n              isAcquired = false;\n              return;\n            }\n            var m1 = new SingleAssignmentDisposable();\n            d.add(m1);\n            m1.setDisposable(work.subscribe(function (x) {\n              observer.onNext(x);\n              var result = null;\n              try {\n                result = selector(x);\n              } catch (e) {\n                observer.onError(e);\n              }\n              q.push(result);\n              activeCount++;\n              ensureActive();\n            }, observer.onError.bind(observer), function () {\n              d.remove(m1);\n              activeCount--;\n              if (activeCount === 0) {\n                observer.onCompleted();\n              }\n            }));\n            self();\n          }));\n        }\n      };\n\n      q.push(source);\n      activeCount++;\n      ensureActive();\n      return d;\n    }, this);\n  };\n\n   /**\n   *  Runs all observable sequences in parallel and collect their last elements.\n   *\n   * @example\n   *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n   *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n   * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n   */\n  Observable.forkJoin = function () {\n    var allSources = [];\n    if (Array.isArray(arguments[0])) {\n      allSources = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { allSources.push(arguments[i]); }\n    }\n    return new AnonymousObservable(function (subscriber) {\n      var count = allSources.length;\n      if (count === 0) {\n        subscriber.onCompleted();\n        return disposableEmpty;\n      }\n      var group = new CompositeDisposable(),\n        finished = false,\n        hasResults = new Array(count),\n        hasCompleted = new Array(count),\n        results = new Array(count);\n\n      for (var idx = 0; idx < count; idx++) {\n        (function (i) {\n          var source = allSources[i];\n          isPromise(source) && (source = observableFromPromise(source));\n          group.add(\n            source.subscribe(\n              function (value) {\n              if (!finished) {\n                hasResults[i] = true;\n                results[i] = value;\n              }\n            },\n            function (e) {\n              finished = true;\n              subscriber.onError(e);\n              group.dispose();\n            },\n            function () {\n              if (!finished) {\n                if (!hasResults[i]) {\n                    subscriber.onCompleted();\n                    return;\n                }\n                hasCompleted[i] = true;\n                for (var ix = 0; ix < count; ix++) {\n                  if (!hasCompleted[ix]) { return; }\n                }\n                finished = true;\n                subscriber.onNext(results);\n                subscriber.onCompleted();\n              }\n            }));\n        })(idx);\n      }\n\n      return group;\n    });\n  };\n\n   /**\n   *  Runs two observable sequences in parallel and combines their last elemenets.\n   *\n   * @param {Observable} second Second observable sequence.\n   * @param {Function} resultSelector Result selector function to invoke with the last elements of both sequences.\n   * @returns {Observable} An observable sequence with the result of calling the selector function with the last elements of both input sequences.\n   */\n  observableProto.forkJoin = function (second, resultSelector) {\n    var first = this;\n    return new AnonymousObservable(function (observer) {\n      var leftStopped = false, rightStopped = false,\n        hasLeft = false, hasRight = false,\n        lastLeft, lastRight,\n        leftSubscription = new SingleAssignmentDisposable(), rightSubscription = new SingleAssignmentDisposable();\n\n      isPromise(second) && (second = observableFromPromise(second));\n\n      leftSubscription.setDisposable(\n          first.subscribe(function (left) {\n            hasLeft = true;\n            lastLeft = left;\n          }, function (err) {\n            rightSubscription.dispose();\n            observer.onError(err);\n          }, function () {\n            leftStopped = true;\n            if (rightStopped) {\n              if (!hasLeft) {\n                  observer.onCompleted();\n              } else if (!hasRight) {\n                  observer.onCompleted();\n              } else {\n                var result;\n                try {\n                  result = resultSelector(lastLeft, lastRight);\n                } catch (e) {\n                  observer.onError(e);\n                  return;\n                }\n                observer.onNext(result);\n                observer.onCompleted();\n              }\n            }\n          })\n      );\n\n      rightSubscription.setDisposable(\n        second.subscribe(function (right) {\n          hasRight = true;\n          lastRight = right;\n        }, function (err) {\n          leftSubscription.dispose();\n          observer.onError(err);\n        }, function () {\n          rightStopped = true;\n          if (leftStopped) {\n            if (!hasLeft) {\n              observer.onCompleted();\n            } else if (!hasRight) {\n              observer.onCompleted();\n            } else {\n              var result;\n              try {\n                result = resultSelector(lastLeft, lastRight);\n              } catch (e) {\n                observer.onError(e);\n                return;\n              }\n              observer.onNext(result);\n              observer.onCompleted();\n            }\n          }\n        })\n      );\n\n      return new CompositeDisposable(leftSubscription, rightSubscription);\n    }, first);\n  };\n\n  /**\n   * Comonadic bind operator.\n   * @param {Function} selector A transform function to apply to each element.\n   * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n   * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n   */\n  observableProto.manySelect = function (selector, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    var source = this;\n    return observableDefer(function () {\n      var chain;\n\n      return source\n        .map(function (x) {\n          var curr = new ChainObservable(x);\n\n          chain && chain.onNext(x);\n          chain = curr;\n\n          return curr;\n        })\n        .tap(\n          noop,\n          function (e) { chain && chain.onError(e); },\n          function () { chain && chain.onCompleted(); }\n        )\n        .observeOn(scheduler)\n        .map(selector);\n    }, source);\n  };\n\n  var ChainObservable = (function (__super__) {\n\n    function subscribe (observer) {\n      var self = this, g = new CompositeDisposable();\n      g.add(currentThreadScheduler.schedule(function () {\n        observer.onNext(self.head);\n        g.add(self.tail.mergeAll().subscribe(observer));\n      }));\n\n      return g;\n    }\n\n    inherits(ChainObservable, __super__);\n\n    function ChainObservable(head) {\n      __super__.call(this, subscribe);\n      this.head = head;\n      this.tail = new AsyncSubject();\n    }\n\n    addProperties(ChainObservable.prototype, Observer, {\n      onCompleted: function () {\n        this.onNext(Observable.empty());\n      },\n      onError: function (e) {\n        this.onNext(Observable.throwException(e));\n      },\n      onNext: function (v) {\n        this.tail.onNext(v);\n        this.tail.onCompleted();\n      }\n    });\n\n    return ChainObservable;\n\n  }(Observable));\n\n  /*\n   * Performs a exclusive waiting for the first to finish before subscribing to another observable.\n   * Observables that come in between subscriptions will be dropped on the floor.\n   * @returns {Observable} A exclusive observable with only the results that happen when subscribed.\n   */\n  observableProto.exclusive = function () {\n    var sources = this;\n    return new AnonymousObservable(function (observer) {\n      var hasCurrent = false,\n        isStopped = false,\n        m = new SingleAssignmentDisposable(),\n        g = new CompositeDisposable();\n\n      g.add(m);\n\n      m.setDisposable(sources.subscribe(\n        function (innerSource) {\n          if (!hasCurrent) {\n            hasCurrent = true;\n\n            isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n\n            var innerSubscription = new SingleAssignmentDisposable();\n            g.add(innerSubscription);\n\n            innerSubscription.setDisposable(innerSource.subscribe(\n              observer.onNext.bind(observer),\n              observer.onError.bind(observer),\n              function () {\n                g.remove(innerSubscription);\n                hasCurrent = false;\n                if (isStopped && g.length === 1) {\n                  observer.onCompleted();\n                }\n            }));\n          }\n        },\n        observer.onError.bind(observer),\n        function () {\n          isStopped = true;\n          if (!hasCurrent && g.length === 1) {\n            observer.onCompleted();\n          }\n        }));\n\n      return g;\n    }, this);\n  };\n\n  /*\n   * Performs a exclusive map waiting for the first to finish before subscribing to another observable.\n   * Observables that come in between subscriptions will be dropped on the floor.\n   * @param {Function} selector Selector to invoke for every item in the current subscription.\n   * @param {Any} [thisArg] An optional context to invoke with the selector parameter.\n   * @returns {Observable} An exclusive observable with only the results that happen when subscribed.\n   */\n  observableProto.exclusiveMap = function (selector, thisArg) {\n    var sources = this,\n        selectorFunc = bindCallback(selector, thisArg, 3);\n    return new AnonymousObservable(function (observer) {\n      var index = 0,\n        hasCurrent = false,\n        isStopped = true,\n        m = new SingleAssignmentDisposable(),\n        g = new CompositeDisposable();\n\n      g.add(m);\n\n      m.setDisposable(sources.subscribe(\n        function (innerSource) {\n\n          if (!hasCurrent) {\n            hasCurrent = true;\n\n            innerSubscription = new SingleAssignmentDisposable();\n            g.add(innerSubscription);\n\n            isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n\n            innerSubscription.setDisposable(innerSource.subscribe(\n              function (x) {\n                var result;\n                try {\n                  result = selectorFunc(x, index++, innerSource);\n                } catch (e) {\n                  observer.onError(e);\n                  return;\n                }\n\n                observer.onNext(result);\n              },\n              function (e) { observer.onError(e); },\n              function () {\n                g.remove(innerSubscription);\n                hasCurrent = false;\n\n                if (isStopped && g.length === 1) {\n                  observer.onCompleted();\n                }\n              }));\n          }\n        },\n        function (e) { observer.onError(e); },\n        function () {\n          isStopped = true;\n          if (g.length === 1 && !hasCurrent) {\n            observer.onCompleted();\n          }\n        }));\n      return g;\n    }, this);\n  };\n\n    return Rx;\n}));\n"
  },
  {
    "path": "tests/perf/old/rx.joinpatterns.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n    var objectTypes = {\n        'boolean': false,\n        'function': true,\n        'object': true,\n        'number': false,\n        'string': false,\n        'undefined': false\n    };\n\n    var root = (objectTypes[typeof window] && window) || this,\n        freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n        freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n        moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n        freeGlobal = objectTypes[typeof global] && global;\n\n    if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n        root = freeGlobal;\n    }\n\n    // Because of build optimizers\n    if (typeof define === 'function' && define.amd) {\n        define(['rx'], function (Rx, exports) {\n            return factory(root, exports, Rx);\n        });\n    } else if (typeof module === 'object' && module && module.exports === freeExports) {\n        module.exports = factory(root, module.exports, require('./rx'));\n    } else {\n        root.Rx = factory(root, {}, root.Rx);\n    }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Aliases\n  var Observable = Rx.Observable,\n      observableProto = Observable.prototype,\n      AnonymousObservable = Rx.AnonymousObservable,\n      observableThrow = Observable.throwException,\n      observerCreate = Rx.Observer.create,\n      SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n      CompositeDisposable = Rx.CompositeDisposable,\n      AbstractObserver = Rx.internals.AbstractObserver,\n      noop = Rx.helpers.noop,\n      defaultComparer = Rx.internals.isEqual,\n      inherits = Rx.internals.inherits,\n      Enumerable = Rx.internals.Enumerable,\n      Enumerator = Rx.internals.Enumerator,\n      $iterator$ = Rx.iterator,\n      doneEnumerator = Rx.doneEnumerator,\n      slice = Array.prototype.slice;\n\n  // Utilities\n  function argsOrArray(args, idx) {\n    return args.length === 1 && Array.isArray(args[idx]) ?\n      args[idx] :\n      slice.call(args);\n  }\n\n  /** @private */\n  var Map = root.Map || (function () {\n\n    function Map() {\n      this._keys = [];\n      this._values = [];\n    }\n\n    Map.prototype.get = function (key) {\n      var i = this._keys.indexOf(key);\n      return i !== -1 ? this._values[i] : undefined;\n    };\n\n    Map.prototype.set = function (key, value) {\n      var i = this._keys.indexOf(key);\n      i !== -1 && (this._values[i] = value);\n      this._values[this._keys.push(key) - 1] = value;\n    };\n\n    Map.prototype.forEach = function (callback, thisArg) {\n      for (var i = 0, len = this._keys.length; i < len; i++) {\n        callback.call(thisArg, this._values[i], this._keys[i]);\n      }\n    };\n\n    return Map;\n  }());\n\n  /**\n   * @constructor\n   * Represents a join pattern over observable sequences.\n   */\n  function Pattern(patterns) {\n    this.patterns = patterns;\n  }\n\n  /**\n   *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n   *  @param other Observable sequence to match in addition to the current pattern.\n   *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n   */\n  Pattern.prototype.and = function (other) {\n    return new Pattern(this.patterns.concat(other));\n  };\n\n  /**\n   *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n   *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n   *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  Pattern.prototype.thenDo = function (selector) {\n    return new Plan(this, selector);\n  };\n\n  function Plan(expression, selector) {\n      this.expression = expression;\n      this.selector = selector;\n  }\n\n  Plan.prototype.activate = function (externalSubscriptions, observer, deactivate) {\n    var self = this;\n    var joinObservers = [];\n    for (var i = 0, len = this.expression.patterns.length; i < len; i++) {\n      joinObservers.push(planCreateObserver(externalSubscriptions, this.expression.patterns[i], observer.onError.bind(observer)));\n    }\n    var activePlan = new ActivePlan(joinObservers, function () {\n      var result;\n      try {\n        result = self.selector.apply(self, arguments);\n      } catch (e) {\n        observer.onError(e);\n        return;\n      }\n      observer.onNext(result);\n    }, function () {\n      for (var j = 0, jlen = joinObservers.length; j < jlen; j++) {\n        joinObservers[j].removeActivePlan(activePlan);\n      }\n      deactivate(activePlan);\n    });\n    for (i = 0, len = joinObservers.length; i < len; i++) {\n      joinObservers[i].addActivePlan(activePlan);\n    }\n    return activePlan;\n  };\n\n  function planCreateObserver(externalSubscriptions, observable, onError) {\n    var entry = externalSubscriptions.get(observable);\n    if (!entry) {\n      var observer = new JoinObserver(observable, onError);\n      externalSubscriptions.set(observable, observer);\n      return observer;\n    }\n    return entry;\n  }\n\n  function ActivePlan(joinObserverArray, onNext, onCompleted) {\n    this.joinObserverArray = joinObserverArray;\n    this.onNext = onNext;\n    this.onCompleted = onCompleted;\n    this.joinObservers = new Map();\n    for (var i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      var joinObserver = this.joinObserverArray[i];\n      this.joinObservers.set(joinObserver, joinObserver);\n    }\n  }\n\n  ActivePlan.prototype.dequeue = function () {\n    this.joinObservers.forEach(function (v) { v.queue.shift(); });\n  };\n\n  ActivePlan.prototype.match = function () {\n    var i, len, hasValues = true;\n    for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n      if (this.joinObserverArray[i].queue.length === 0) {\n        hasValues = false;\n        break;\n      }\n    }\n    if (hasValues) {\n      var firstValues = [],\n          isCompleted = false;\n      for (i = 0, len = this.joinObserverArray.length; i < len; i++) {\n        firstValues.push(this.joinObserverArray[i].queue[0]);\n        this.joinObserverArray[i].queue[0].kind === 'C' && (isCompleted = true);\n      }\n      if (isCompleted) {\n        this.onCompleted();\n      } else {\n        this.dequeue();\n        var values = [];\n        for (i = 0, len = firstValues.length; i < firstValues.length; i++) {\n          values.push(firstValues[i].value);\n        }\n        this.onNext.apply(this, values);\n      }\n    }\n  };\n\n  var JoinObserver = (function (__super__) {\n    inherits(JoinObserver, __super__);\n\n    function JoinObserver(source, onError) {\n      __super__.call(this);\n      this.source = source;\n      this.onError = onError;\n      this.queue = [];\n      this.activePlans = [];\n      this.subscription = new SingleAssignmentDisposable();\n      this.isDisposed = false;\n    }\n\n    var JoinObserverPrototype = JoinObserver.prototype;\n\n    JoinObserverPrototype.next = function (notification) {\n      if (!this.isDisposed) {\n        if (notification.kind === 'E') {\n          return this.onError(notification.exception);\n        }\n        this.queue.push(notification);\n        var activePlans = this.activePlans.slice(0);\n        for (var i = 0, len = activePlans.length; i < len; i++) {\n          activePlans[i].match();\n        }\n      }\n    };\n\n    JoinObserverPrototype.error = noop;\n    JoinObserverPrototype.completed = noop;\n\n    JoinObserverPrototype.addActivePlan = function (activePlan) {\n      this.activePlans.push(activePlan);\n    };\n\n    JoinObserverPrototype.subscribe = function () {\n      this.subscription.setDisposable(this.source.materialize().subscribe(this));\n    };\n\n    JoinObserverPrototype.removeActivePlan = function (activePlan) {\n      this.activePlans.splice(this.activePlans.indexOf(activePlan), 1);\n      this.activePlans.length === 0 && this.dispose();\n    };\n\n    JoinObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        this.subscription.dispose();\n      }\n    };\n\n    return JoinObserver;\n  } (AbstractObserver));\n\n  /**\n   *  Creates a pattern that matches when both observable sequences have an available value.\n   *\n   *  @param right Observable sequence to match with the current sequence.\n   *  @return {Pattern} Pattern object that matches when both observable sequences have an available value.\n   */\n  observableProto.and = function (right) {\n    return new Pattern([this, right]);\n  };\n\n  /**\n   *  Matches when the observable sequence has an available value and projects the value.\n   *\n   *  @param {Function} selector Selector that will be invoked for values in the source sequence.\n   *  @returns {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n   */\n  observableProto.thenDo = function (selector) {\n    return new Pattern([this]).thenDo(selector);\n  };\n\n  /**\n   *  Joins together the results from several patterns.\n   *\n   *  @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns.\n   *  @returns {Observable} Observable sequence with the results form matching several patterns.\n   */\n  Observable.when = function () {\n    var plans = [];\n    if (Array.isArray(arguments[0])) {\n      plans = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { plans.push(arguments[i]); }\n    }\n    return new AnonymousObservable(function (observer) {\n      var activePlans = [],\n          externalSubscriptions = new Map();\n      var outObserver = observerCreate(\n        observer.onNext.bind(observer),\n        function (err) {\n          externalSubscriptions.forEach(function (v) { v.onError(err); });\n          observer.onError(err);\n        },\n        observer.onCompleted.bind(observer)\n      );\n      try {\n        for (var i = 0, len = plans.length; i < len; i++) {\n          activePlans.push(plans[i].activate(externalSubscriptions, outObserver, function (activePlan) {\n            var idx = activePlans.indexOf(activePlan);\n            activePlans.splice(idx, 1);\n            activePlans.length === 0 && observer.onCompleted();\n          }));\n        }\n      } catch (e) {\n        observableThrow(e).subscribe(observer);\n      }\n      var group = new CompositeDisposable();\n      externalSubscriptions.forEach(function (joinObserver) {\n        joinObserver.subscribe();\n        group.add(joinObserver);\n      });\n\n      return group;\n    });\n  };\n\n    return Rx;\n}));\n"
  },
  {
    "path": "tests/perf/old/rx.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n;(function (undefined) {\n\n  var objectTypes = {\n    'boolean': false,\n    'function': true,\n    'object': true,\n    'number': false,\n    'string': false,\n    'undefined': false\n  };\n\n  var root = (objectTypes[typeof window] && window) || this,\n    freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n    freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n    moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n    freeGlobal = objectTypes[typeof global] && global;\n\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n    root = freeGlobal;\n  }\n\n  var Rx = {\n      internals: {},\n      config: {\n        Promise: root.Promise\n      },\n      helpers: { }\n  };\n\n  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    notDefined = Rx.helpers.notDefined = function (x) { return typeof x === 'undefined'; },\n    isScheduler = Rx.helpers.isScheduler = function (x) { return x instanceof Rx.Scheduler; },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    pluck = Rx.helpers.pluck = function (property) { return function (x) { return x[property]; }; },\n    just = Rx.helpers.just = function (value) { return function () { return value; }; },\n    defaultNow = Rx.helpers.defaultNow = Date.now,\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.then === 'function'; },\n    asArray = Rx.helpers.asArray = function () { return Array.prototype.slice.call(arguments); },\n    not = Rx.helpers.not = function (a) { return !a; },\n    isFunction = Rx.helpers.isFunction = (function () {\n\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      }\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n\n      return isFn;\n    }());\n\n  // Errors\n  var sequenceContainsNoElements = 'Sequence contains no elements.';\n  var argumentOutOfRange = 'Argument out of range';\n  var objectDisposed = 'Object has been disposed';\n  function checkDisposed(self) { if (self.isDisposed) { throw new Error(objectDisposed); } }\n  function cloneArray(arr) { for(var a = [], i = 0, len = arr.length; i < len; i++) { a.push(arr[i]); } return a;}\n\n  Rx.config.longStackSupport = false;\n  var hasStacks = false;\n  try {\n    throw new Error();\n  } catch (e) {\n    hasStacks = !!e.stack;\n  }\n\n  // All code after this point will be filtered from stack traces reported by RxJS\n  var rStartingLine = captureLine(), rFileName;\n\n  var STACK_JUMP_SEPARATOR = \"From previous event:\";\n\n  function makeStackTraceLong(error, observable) {\n      // If possible, transform the error stack trace by removing Node and RxJS\n      // cruft, then concatenating with the stack trace of `observable`.\n      if (hasStacks &&\n          observable.stack &&\n          typeof error === \"object\" &&\n          error !== null &&\n          error.stack &&\n          error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n      ) {\n        var stacks = [];\n        for (var o = observable; !!o; o = o.source) {\n          if (o.stack) {\n            stacks.unshift(o.stack);\n          }\n        }\n        stacks.unshift(error.stack);\n\n        var concatedStacks = stacks.join(\"\\n\" + STACK_JUMP_SEPARATOR + \"\\n\");\n        error.stack = filterStackString(concatedStacks);\n    }\n  }\n\n  function filterStackString(stackString) {\n    var lines = stackString.split(\"\\n\"),\n        desiredLines = [];\n    for (var i = 0, len = lines.length; i < len; i++) {\n      var line = lines[i];\n\n      if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n        desiredLines.push(line);\n      }\n    }\n    return desiredLines.join(\"\\n\");\n  }\n\n  function isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n    if (!fileNameAndLineNumber) {\n      return false;\n    }\n    var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === rFileName &&\n      lineNumber >= rStartingLine &&\n      lineNumber <= rEndingLine;\n  }\n\n  function isNodeFrame(stackLine) {\n    return stackLine.indexOf(\"(module.js:\") !== -1 ||\n      stackLine.indexOf(\"(node.js:\") !== -1;\n  }\n\n  function captureLine() {\n    if (!hasStacks) { return; }\n\n    try {\n      throw new Error();\n    } catch (e) {\n      var lines = e.stack.split(\"\\n\");\n      var firstLine = lines[0].indexOf(\"@\") > 0 ? lines[1] : lines[2];\n      var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n      if (!fileNameAndLineNumber) { return; }\n\n      rFileName = fileNameAndLineNumber[0];\n      return fileNameAndLineNumber[1];\n    }\n  }\n\n  function getFileNameAndLineNumber(stackLine) {\n    // Named functions: \"at functionName (filename:lineNumber:columnNumber)\"\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }\n\n    // Anonymous functions: \"at filename:lineNumber:columnNumber\"\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }\n\n    // Firefox style: \"function@filename:lineNumber or @filename:lineNumber\"\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }\n  }\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o[$iterator$] !== undefined;\n  }\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  }\n\n  Rx.helpers.iterator = $iterator$;\n\n  var bindCallback = Rx.internals.bindCallback = function (func, thisArg, argCount) {\n    if (typeof thisArg === 'undefined') { return func; }\n    switch(argCount) {\n      case 0:\n        return function() {\n          return func.call(thisArg)\n        };\n      case 1:\n        return function(arg) {\n          return func.call(thisArg, arg);\n        }\n      case 2:\n        return function(value, index) {\n          return func.call(thisArg, value, index);\n        };\n      case 3:\n        return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n    }\n\n    return function() {\n      return func.apply(thisArg, arguments);\n    };\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var dontEnums = ['toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'],\n  dontEnumsLength = dontEnums.length;\n\n  /** `Object#toString` result shortcuts */\n  var argsClass = '[object Arguments]',\n    arrayClass = '[object Array]',\n    boolClass = '[object Boolean]',\n    dateClass = '[object Date]',\n    errorClass = '[object Error]',\n    funcClass = '[object Function]',\n    numberClass = '[object Number]',\n    objectClass = '[object Object]',\n    regexpClass = '[object RegExp]',\n    stringClass = '[object String]';\n\n  var toString = Object.prototype.toString,\n    hasOwnProperty = Object.prototype.hasOwnProperty,\n    supportsArgsClass = toString.call(arguments) == argsClass, // For less <IE9 && FF<4\n    supportNodeClass,\n    errorProto = Error.prototype,\n    objectProto = Object.prototype,\n    stringProto = String.prototype,\n    propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n  try {\n    supportNodeClass = !(toString.call(document) == objectClass && !({ 'toString': 0 } + ''));\n  } catch (e) {\n    supportNodeClass = true;\n  }\n\n  var nonEnumProps = {};\n  nonEnumProps[arrayClass] = nonEnumProps[dateClass] = nonEnumProps[numberClass] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true };\n  nonEnumProps[boolClass] = nonEnumProps[stringClass] = { 'constructor': true, 'toString': true, 'valueOf': true };\n  nonEnumProps[errorClass] = nonEnumProps[funcClass] = nonEnumProps[regexpClass] = { 'constructor': true, 'toString': true };\n  nonEnumProps[objectClass] = { 'constructor': true };\n\n  var support = {};\n  (function () {\n    var ctor = function() { this.x = 1; },\n      props = [];\n\n    ctor.prototype = { 'valueOf': 1, 'y': 1 };\n    for (var key in new ctor) { props.push(key); }\n    for (key in arguments) { }\n\n    // Detect if `name` or `message` properties of `Error.prototype` are enumerable by default.\n    support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') || propertyIsEnumerable.call(errorProto, 'name');\n\n    // Detect if `prototype` properties are enumerable by default.\n    support.enumPrototypes = propertyIsEnumerable.call(ctor, 'prototype');\n\n    // Detect if `arguments` object indexes are non-enumerable\n    support.nonEnumArgs = key != 0;\n\n    // Detect if properties shadowing those on `Object.prototype` are non-enumerable.\n    support.nonEnumShadows = !/valueOf/.test(props);\n  }(1));\n\n  var isObject = Rx.internals.isObject = function(value) {\n    var type = typeof value;\n    return value && (type == 'function' || type == 'object') || false;\n  };\n\n  function keysIn(object) {\n    var result = [];\n    if (!isObject(object)) {\n      return result;\n    }\n    if (support.nonEnumArgs && object.length && isArguments(object)) {\n      object = slice.call(object);\n    }\n    var skipProto = support.enumPrototypes && typeof object == 'function',\n        skipErrorProps = support.enumErrorProps && (object === errorProto || object instanceof Error);\n\n    for (var key in object) {\n      if (!(skipProto && key == 'prototype') &&\n          !(skipErrorProps && (key == 'message' || key == 'name'))) {\n        result.push(key);\n      }\n    }\n\n    if (support.nonEnumShadows && object !== objectProto) {\n      var ctor = object.constructor,\n          index = -1,\n          length = dontEnumsLength;\n\n      if (object === (ctor && ctor.prototype)) {\n        var className = object === stringProto ? stringClass : object === errorProto ? errorClass : toString.call(object),\n            nonEnum = nonEnumProps[className];\n      }\n      while (++index < length) {\n        key = dontEnums[index];\n        if (!(nonEnum && nonEnum[key]) && hasOwnProperty.call(object, key)) {\n          result.push(key);\n        }\n      }\n    }\n    return result;\n  }\n\n  function internalFor(object, callback, keysFunc) {\n    var index = -1,\n      props = keysFunc(object),\n      length = props.length;\n\n    while (++index < length) {\n      var key = props[index];\n      if (callback(object[key], key, object) === false) {\n        break;\n      }\n    }\n    return object;\n  }\n\n  function internalForIn(object, callback) {\n    return internalFor(object, callback, keysIn);\n  }\n\n  function isNode(value) {\n    // IE < 9 presents DOM nodes as `Object` objects except they have `toString`\n    // methods that are `typeof` \"string\" and still can coerce nodes to strings\n    return typeof value.toString != 'function' && typeof (value + '') == 'string';\n  }\n\n  var isArguments = function(value) {\n    return (value && typeof value == 'object') ? toString.call(value) == argsClass : false;\n  }\n\n  // fallback for browsers that can't detect `arguments` objects by [[Class]]\n  if (!supportsArgsClass) {\n    isArguments = function(value) {\n      return (value && typeof value == 'object') ? hasOwnProperty.call(value, 'callee') : false;\n    };\n  }\n\n  var isEqual = Rx.internals.isEqual = function (x, y) {\n    return deepEquals(x, y, [], []);\n  };\n\n  /** @private\n   * Used for deep comparison\n   **/\n  function deepEquals(a, b, stackA, stackB) {\n    // exit early for identical values\n    if (a === b) {\n      // treat `+0` vs. `-0` as not equal\n      return a !== 0 || (1 / a == 1 / b);\n    }\n\n    var type = typeof a,\n        otherType = typeof b;\n\n    // exit early for unlike primitive values\n    if (a === a && (a == null || b == null ||\n        (type != 'function' && type != 'object' && otherType != 'function' && otherType != 'object'))) {\n      return false;\n    }\n\n    // compare [[Class]] names\n    var className = toString.call(a),\n        otherClass = toString.call(b);\n\n    if (className == argsClass) {\n      className = objectClass;\n    }\n    if (otherClass == argsClass) {\n      otherClass = objectClass;\n    }\n    if (className != otherClass) {\n      return false;\n    }\n    switch (className) {\n      case boolClass:\n      case dateClass:\n        // coerce dates and booleans to numbers, dates to milliseconds and booleans\n        // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\n        return +a == +b;\n\n      case numberClass:\n        // treat `NaN` vs. `NaN` as equal\n        return (a != +a) ?\n          b != +b :\n          // but treat `-0` vs. `+0` as not equal\n          (a == 0 ? (1 / a == 1 / b) : a == +b);\n\n      case regexpClass:\n      case stringClass:\n        // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\n        // treat string primitives and their corresponding object instances as equal\n        return a == String(b);\n    }\n    var isArr = className == arrayClass;\n    if (!isArr) {\n\n      // exit for functions and DOM nodes\n      if (className != objectClass || (!support.nodeClass && (isNode(a) || isNode(b)))) {\n        return false;\n      }\n      // in older versions of Opera, `arguments` objects have `Array` constructors\n      var ctorA = !support.argsObject && isArguments(a) ? Object : a.constructor,\n          ctorB = !support.argsObject && isArguments(b) ? Object : b.constructor;\n\n      // non `Object` object instances with different constructors are not equal\n      if (ctorA != ctorB &&\n            !(hasOwnProperty.call(a, 'constructor') && hasOwnProperty.call(b, 'constructor')) &&\n            !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\n            ('constructor' in a && 'constructor' in b)\n          ) {\n        return false;\n      }\n    }\n    // assume cyclic structures are equal\n    // the algorithm for detecting cyclic structures is adapted from ES 5.1\n    // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\n    var initedStack = !stackA;\n    stackA || (stackA = []);\n    stackB || (stackB = []);\n\n    var length = stackA.length;\n    while (length--) {\n      if (stackA[length] == a) {\n        return stackB[length] == b;\n      }\n    }\n    var size = 0;\n    var result = true;\n\n    // add `a` and `b` to the stack of traversed objects\n    stackA.push(a);\n    stackB.push(b);\n\n    // recursively compare objects and arrays (susceptible to call stack limits)\n    if (isArr) {\n      // compare lengths to determine if a deep comparison is necessary\n      length = a.length;\n      size = b.length;\n      result = size == length;\n\n      if (result) {\n        // deep compare the contents, ignoring non-numeric properties\n        while (size--) {\n          var index = length,\n              value = b[size];\n\n          if (!(result = deepEquals(a[size], value, stackA, stackB))) {\n            break;\n          }\n        }\n      }\n    }\n    else {\n      // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\n      // which, in this case, is more costly\n      internalForIn(b, function(value, key, b) {\n        if (hasOwnProperty.call(b, key)) {\n          // count the number of properties.\n          size++;\n          // deep compare each property value.\n          return (result = hasOwnProperty.call(a, key) && deepEquals(a[key], value, stackA, stackB));\n        }\n      });\n\n      if (result) {\n        // ensure both objects have the same number of properties\n        internalForIn(a, function(value, key, a) {\n          if (hasOwnProperty.call(a, key)) {\n            // `size` will be `-1` if `a` has more properties than `b`\n            return (result = --size > -1);\n          }\n        });\n      }\n    }\n    stackA.pop();\n    stackB.pop();\n\n    return result;\n  }\n\n  var hasProp = {}.hasOwnProperty,\n      slice = Array.prototype.slice;\n\n  var inherits = this.inherits = Rx.internals.inherits = function (child, parent) {\n    function __() { this.constructor = child; }\n    __.prototype = parent.prototype;\n    child.prototype = new __();\n  };\n\n  var addProperties = Rx.internals.addProperties = function (obj) {\n    for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n      var source = sources[idx];\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n  };\n\n  // Rx Utils\n  var addRef = Rx.internals.addRef = function (xs, r) {\n    return new AnonymousObservable(function (observer) {\n      return new CompositeDisposable(r.getDisposable(), xs.subscribe(observer));\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n\n  // Collections\n  function IndexedItem(id, value) {\n    this.id = id;\n    this.value = value;\n  }\n\n  IndexedItem.prototype.compareTo = function (other) {\n    var c = this.value.compareTo(other.value);\n    c === 0 && (c = this.id - other.id);\n    return c;\n  };\n\n  // Priority Queue for Scheduling\n  var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) {\n    this.items = new Array(capacity);\n    this.length = 0;\n  };\n\n  var priorityProto = PriorityQueue.prototype;\n  priorityProto.isHigherPriority = function (left, right) {\n    return this.items[left].compareTo(this.items[right]) < 0;\n  };\n\n  priorityProto.percolate = function (index) {\n    if (index >= this.length || index < 0) { return; }\n    var parent = index - 1 >> 1;\n    if (parent < 0 || parent === index) { return; }\n    if (this.isHigherPriority(index, parent)) {\n      var temp = this.items[index];\n      this.items[index] = this.items[parent];\n      this.items[parent] = temp;\n      this.percolate(parent);\n    }\n  };\n\n  priorityProto.heapify = function (index) {\n    +index || (index = 0);\n    if (index >= this.length || index < 0) { return; }\n    var left = 2 * index + 1,\n        right = 2 * index + 2,\n        first = index;\n    if (left < this.length && this.isHigherPriority(left, first)) {\n      first = left;\n    }\n    if (right < this.length && this.isHigherPriority(right, first)) {\n      first = right;\n    }\n    if (first !== index) {\n      var temp = this.items[index];\n      this.items[index] = this.items[first];\n      this.items[first] = temp;\n      this.heapify(first);\n    }\n  };\n\n  priorityProto.peek = function () { return this.items[0].value; };\n\n  priorityProto.removeAt = function (index) {\n    this.items[index] = this.items[--this.length];\n    this.items[this.length] = undefined;\n    this.heapify();\n  };\n\n  priorityProto.dequeue = function () {\n    var result = this.peek();\n    this.removeAt(0);\n    return result;\n  };\n\n  priorityProto.enqueue = function (item) {\n    var index = this.length++;\n    this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n    this.percolate(index);\n  };\n\n  priorityProto.remove = function (item) {\n    for (var i = 0; i < this.length; i++) {\n      if (this.items[i].value === item) {\n        this.removeAt(i);\n        return true;\n      }\n    }\n    return false;\n  };\n  PriorityQueue.count = 0;\n\n  /**\n   * Represents a group of disposable resources that are disposed together.\n   * @constructor\n   */\n  var CompositeDisposable = Rx.CompositeDisposable = function () {\n    var args = [];\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    }\n    this.disposables = args;\n    this.isDisposed = false;\n    this.length = this.disposables.length;\n  };\n\n  var CompositeDisposablePrototype = CompositeDisposable.prototype;\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Mixed} item Disposable to add.\n   */\n  CompositeDisposablePrototype.add = function (item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n      this.length++;\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Mixed} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n  CompositeDisposablePrototype.remove = function (item) {\n    var shouldDispose = false;\n    if (!this.isDisposed) {\n      var idx = this.disposables.indexOf(item);\n      if (idx !== -1) {\n        shouldDispose = true;\n        this.disposables.splice(idx, 1);\n        this.length--;\n        item.dispose();\n      }\n    }\n    return shouldDispose;\n  };\n\n  /**\n   *  Disposes all disposables in the group and removes them from the group.\n   */\n  CompositeDisposablePrototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      for(var currentDisposables = [], i = 0, len = this.disposables.length; i < len; i++) { currentDisposables.push(this.disposables[i]); }\n      this.disposables = [];\n      this.length = 0;\n\n      for (i = 0, len = currentDisposables.length; i < len; i++) {\n        currentDisposables[i].dispose();\n      }\n    }\n  };\n\n  /**\n   * Converts the existing CompositeDisposable to an array of disposables\n   * @returns {Array} An array of disposable objects.\n   */\n  CompositeDisposablePrototype.toArray = function () {\n    for(var currentDisposables = [], ix = 0, len = this.disposables.length; i < len; i++) { currentDisposables.push(this.disposables[i]); }\n    return currentDisposables;\n  };\n\n  /**\n   * Provides a set of static methods for creating Disposables.\n   *\n   * @constructor\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   */\n  var Disposable = Rx.Disposable = function (action) {\n    this.isDisposed = false;\n    this.action = action || noop;\n  };\n\n  /** Performs the task of cleaning up resources. */\n  Disposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.action();\n      this.isDisposed = true;\n    }\n  };\n\n  /**\n   * Creates a disposable object that invokes the specified action when disposed.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   * @return {Disposable} The disposable object that runs the given action upon disposal.\n   */\n  var disposableCreate = Disposable.create = function (action) { return new Disposable(action); };\n\n  /**\n   * Gets the disposable that does nothing when disposed.\n   */\n  var disposableEmpty = Disposable.empty = { dispose: noop };\n\n  var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = (function () {\n    function BooleanDisposable () {\n      this.isDisposed = false;\n      this.current = null;\n    }\n\n    var booleanDisposablePrototype = BooleanDisposable.prototype;\n\n    /**\n     * Gets the underlying disposable.\n     * @return The underlying disposable.\n     */\n    booleanDisposablePrototype.getDisposable = function () {\n      return this.current;\n    };\n\n    /**\n     * Sets the underlying disposable.\n     * @param {Disposable} value The new underlying disposable.\n     */\n    booleanDisposablePrototype.setDisposable = function (value) {\n      var shouldDispose = this.isDisposed;\n      if (!shouldDispose) {\n        var old = this.current;\n        this.current = value;\n      }\n      old && old.dispose();\n      shouldDispose && value && value.dispose();\n    };\n\n    /**\n     * Disposes the underlying disposable as well as all future replacements.\n     */\n    booleanDisposablePrototype.dispose = function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        var old = this.current;\n        this.current = null;\n      }\n      old && old.dispose();\n    };\n\n    return BooleanDisposable;\n  }());\n  var SerialDisposable = Rx.SerialDisposable = SingleAssignmentDisposable;\n\n  /**\n   * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n   */\n  var RefCountDisposable = Rx.RefCountDisposable = (function () {\n\n    function InnerDisposable(disposable) {\n      this.disposable = disposable;\n      this.disposable.count++;\n      this.isInnerDisposed = false;\n    }\n\n    InnerDisposable.prototype.dispose = function () {\n      if (!this.disposable.isDisposed && !this.isInnerDisposed) {\n        this.isInnerDisposed = true;\n        this.disposable.count--;\n        if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {\n          this.disposable.isDisposed = true;\n          this.disposable.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Initializes a new instance of the RefCountDisposable with the specified disposable.\n     * @constructor\n     * @param {Disposable} disposable Underlying disposable.\n      */\n    function RefCountDisposable(disposable) {\n      this.underlyingDisposable = disposable;\n      this.isDisposed = false;\n      this.isPrimaryDisposed = false;\n      this.count = 0;\n    }\n\n    /**\n     * Disposes the underlying disposable only when all dependent disposables have been disposed\n     */\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed && !this.isPrimaryDisposed) {\n        this.isPrimaryDisposed = true;\n        if (this.count === 0) {\n          this.isDisposed = true;\n          this.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n     * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n     */\n    RefCountDisposable.prototype.getDisposable = function () {\n      return this.isDisposed ? disposableEmpty : new InnerDisposable(this);\n    };\n\n    return RefCountDisposable;\n  })();\n\n  function ScheduledDisposable(scheduler, disposable) {\n    this.scheduler = scheduler;\n    this.disposable = disposable;\n    this.isDisposed = false;\n  }\n\n  function scheduleItem(s, self) {\n    if (!self.isDisposed) {\n      self.isDisposed = true;\n      self.disposable.dispose();\n    }\n  }\n\n  ScheduledDisposable.prototype.dispose = function () {\n    this.scheduler.scheduleWithState(this, scheduleItem);\n  };\n\n  var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) {\n    this.scheduler = scheduler;\n    this.state = state;\n    this.action = action;\n    this.dueTime = dueTime;\n    this.comparer = comparer || defaultSubComparer;\n    this.disposable = new SingleAssignmentDisposable();\n  }\n\n  ScheduledItem.prototype.invoke = function () {\n    this.disposable.setDisposable(this.invokeCore());\n  };\n\n  ScheduledItem.prototype.compareTo = function (other) {\n    return this.comparer(this.dueTime, other.dueTime);\n  };\n\n  ScheduledItem.prototype.isCancelled = function () {\n    return this.disposable.isDisposed;\n  };\n\n  ScheduledItem.prototype.invokeCore = function () {\n    return this.action(this.scheduler, this.state);\n  };\n\n  /** Provides a set of static properties to access commonly used schedulers. */\n  var Scheduler = Rx.Scheduler = (function () {\n\n    function Scheduler(now, schedule, scheduleRelative, scheduleAbsolute) {\n      this.now = now;\n      this._schedule = schedule;\n      this._scheduleRelative = scheduleRelative;\n      this._scheduleAbsolute = scheduleAbsolute;\n    }\n\n    function invokeAction(scheduler, action) {\n      action();\n      return disposableEmpty;\n    }\n\n    var schedulerProto = Scheduler.prototype;\n\n    /**\n     * Schedules an action to be executed.\n     * @param {Function} action Action to execute.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.schedule = function (action) {\n      return this._schedule(action, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed.\n     * @param state State passed to the action to be executed.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithState = function (state, action) {\n      return this._schedule(state, action);\n    };\n\n    /**\n     * Schedules an action to be executed after the specified relative due time.\n     * @param {Function} action Action to execute.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithRelative = function (dueTime, action) {\n      return this._scheduleRelative(action, dueTime, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed after dueTime.\n     * @param state State passed to the action to be executed.\n     * @param {Function} action Action to be executed.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithRelativeAndState = function (state, dueTime, action) {\n      return this._scheduleRelative(state, dueTime, action);\n    };\n\n    /**\n     * Schedules an action to be executed at the specified absolute due time.\n     * @param {Function} action Action to execute.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n      */\n    schedulerProto.scheduleWithAbsolute = function (dueTime, action) {\n      return this._scheduleAbsolute(action, dueTime, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to be executed.\n     * @param {Number}dueTime Absolute time at which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithAbsoluteAndState = function (state, dueTime, action) {\n      return this._scheduleAbsolute(state, dueTime, action);\n    };\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.now = defaultNow;\n\n    /**\n     * Normalizes the specified TimeSpan value to a positive value.\n     * @param {Number} timeSpan The time span value to normalize.\n     * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n     */\n    Scheduler.normalize = function (timeSpan) {\n      timeSpan < 0 && (timeSpan = 0);\n      return timeSpan;\n    };\n\n    return Scheduler;\n  }());\n\n  var normalizeTime = Scheduler.normalize;\n\n  (function (schedulerProto) {\n    function invokeRecImmediate(scheduler, pair) {\n      var state = pair.first, action = pair.second, group = new CompositeDisposable(),\n      recursiveAction = function (state1) {\n        action(state1, function (state2) {\n          var isAdded = false, isDone = false,\n          d = scheduler.scheduleWithState(state2, function (scheduler1, state3) {\n            if (isAdded) {\n              group.remove(d);\n            } else {\n              isDone = true;\n            }\n            recursiveAction(state3);\n            return disposableEmpty;\n          });\n          if (!isDone) {\n            group.add(d);\n            isAdded = true;\n          }\n        });\n      };\n      recursiveAction(state);\n      return group;\n    }\n\n    function invokeRecDate(scheduler, pair, method) {\n      var state = pair.first, action = pair.second, group = new CompositeDisposable(),\n      recursiveAction = function (state1) {\n        action(state1, function (state2, dueTime1) {\n          var isAdded = false, isDone = false,\n          d = scheduler[method](state2, dueTime1, function (scheduler1, state3) {\n            if (isAdded) {\n              group.remove(d);\n            } else {\n              isDone = true;\n            }\n            recursiveAction(state3);\n            return disposableEmpty;\n          });\n          if (!isDone) {\n            group.add(d);\n            isAdded = true;\n          }\n        });\n      };\n      recursiveAction(state);\n      return group;\n    }\n\n    function scheduleInnerRecursive(action, self) {\n      action(function(dt) { self(action, dt); });\n    }\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursive = function (action) {\n      return this.scheduleRecursiveWithState(action, function (_action, self) {\n        _action(function () { self(_action); }); });\n    };\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithState = function (state, action) {\n      return this.scheduleWithState({ first: state, second: action }, invokeRecImmediate);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative due time.\n     * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified relative time.\n     * @param {Number}dueTime Relative time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithRelative = function (dueTime, action) {\n      return this.scheduleRecursiveWithRelativeAndState(action, dueTime, scheduleInnerRecursive);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number}dueTime Relative time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithRelativeAndState = function (state, dueTime, action) {\n      return this._scheduleRelative({ first: state, second: action }, dueTime, function (s, p) {\n        return invokeRecDate(s, p, 'scheduleWithRelativeAndState');\n      });\n    };\n\n    /**\n     * Schedules an action to be executed recursively at a specified absolute due time.\n     * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified absolute time.\n     * @param {Number}dueTime Absolute time at which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithAbsolute = function (dueTime, action) {\n      return this.scheduleRecursiveWithAbsoluteAndState(action, dueTime, scheduleInnerRecursive);\n    };\n\n    /**\n     * Schedules an action to be executed recursively at a specified absolute due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number}dueTime Absolute time at which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithAbsoluteAndState = function (state, dueTime, action) {\n      return this._scheduleAbsolute({ first: state, second: action }, dueTime, function (s, p) {\n        return invokeRecDate(s, p, 'scheduleWithAbsoluteAndState');\n      });\n    };\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    Scheduler.prototype.schedulePeriodic = function (period, action) {\n      return this.schedulePeriodicWithState(null, period, action);\n    };\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    Scheduler.prototype.schedulePeriodicWithState = function(state, period, action) {\n      if (typeof root.setInterval === 'undefined') { throw new Error('Periodic scheduling not supported.'); }\n      var s = state;\n\n      var id = root.setInterval(function () {\n        s = action(s);\n      }, period);\n\n      return disposableCreate(function () {\n        root.clearInterval(id);\n      });\n    };\n\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n    /**\n     * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n     * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n     * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n     */\n    schedulerProto.catchError = schedulerProto['catch'] = function (handler) {\n      return new CatchScheduler(this, handler);\n    };\n  }(Scheduler.prototype));\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function tick(command, recurse) {\n      recurse(0, this._period);\n      try {\n        this._state = this._action(this._state);\n      } catch (e) {\n        this._cancel.dispose();\n        throw e;\n      }\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0, this._period, tick.bind(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  /** Gets a scheduler that schedules work immediately on the current thread. */\n  var immediateScheduler = Scheduler.immediate = (function () {\n\n    function scheduleNow(state, action) { return action(this, state); }\n\n    function scheduleRelative(state, dueTime, action) {\n      var dt = this.now() + normalizeTime(dueTime);\n      while (dt - this.now() > 0) { }\n      return action(this, state);\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);\n    }\n\n    return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n  }());\n\n  /**\n   * Gets a scheduler that schedules work as soon as possible on the current thread.\n   */\n  var currentThreadScheduler = Scheduler.currentThread = (function () {\n    var queue;\n\n    function runTrampoline (q) {\n      while (q.length > 0) {\n        var item = q.dequeue();\n        if (!item.isCancelled()) {\n          // Note, do not schedule blocking work!\n          while (item.dueTime - Scheduler.now() > 0) {\n          }\n          !item.isCancelled() && item.invoke();\n        }\n      }\n    }\n\n    function scheduleNow(state, action) {\n      return this.scheduleWithRelativeAndState(state, 0, action);\n    }\n\n    function scheduleRelative(state, dueTime, action) {\n      var dt = this.now() + Scheduler.normalize(dueTime),\n          si = new ScheduledItem(this, state, action, dt);\n\n      if (!queue) {\n        queue = new PriorityQueue(4);\n        queue.enqueue(si);\n        try {\n          runTrampoline(queue);\n        } catch (e) {\n          throw e;\n        } finally {\n          queue = null;\n        }\n      } else {\n        queue.enqueue(si);\n      }\n      return si.disposable;\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);\n    }\n\n    var currentScheduler = new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n\n    currentScheduler.scheduleRequired = function () { return !queue; };\n    currentScheduler.ensureTrampoline = function (action) {\n      if (!queue) { this.schedule(action); } else { action(); }\n    };\n\n    return currentScheduler;\n  }());\n\n  var scheduleMethod, clearMethod = noop;\n  var localTimer = (function () {\n    var localSetTimeout, localClearTimeout = noop;\n    if ('WScript' in this) {\n      localSetTimeout = function (fn, time) {\n        WScript.Sleep(time);\n        fn();\n      };\n    } else if (!!root.setTimeout) {\n      localSetTimeout = root.setTimeout;\n      localClearTimeout = root.clearTimeout;\n    } else {\n      throw new Error('No concurrency detected!');\n    }\n\n    return {\n      setTimeout: localSetTimeout,\n      clearTimeout: localClearTimeout\n    };\n  }());\n  var localSetTimeout = localTimer.setTimeout,\n    localClearTimeout = localTimer.clearTimeout;\n\n  (function () {\n\n    var reNative = RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&\n      !reNative.test(setImmediate) && setImmediate,\n      clearImmediate = typeof (clearImmediate = freeGlobal && moduleExports && freeGlobal.clearImmediate) == 'function' &&\n      !reNative.test(clearImmediate) && clearImmediate;\n\n    function postMessageSupported () {\n      // Ensure not in a worker\n      if (!root.postMessage || root.importScripts) { return false; }\n      var isAsync = false,\n          oldHandler = root.onmessage;\n      // Test for async\n      root.onmessage = function () { isAsync = true; };\n      root.postMessage('', '*');\n      root.onmessage = oldHandler;\n\n      return isAsync;\n    }\n\n    // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n    if (typeof setImmediate === 'function') {\n      scheduleMethod = setImmediate;\n      clearMethod = clearImmediate;\n    } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleMethod = process.nextTick;\n    } else if (postMessageSupported()) {\n      var MSG_PREFIX = 'ms.rx.schedule' + Math.random(),\n        tasks = {},\n        taskId = 0;\n\n      var onGlobalPostMessage = function (event) {\n        // Only if we're a match to avoid any other global events\n        if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n          var handleId = event.data.substring(MSG_PREFIX.length),\n            action = tasks[handleId];\n          action();\n          delete tasks[handleId];\n        }\n      }\n\n      if (root.addEventListener) {\n        root.addEventListener('message', onGlobalPostMessage, false);\n      } else {\n        root.attachEvent('onmessage', onGlobalPostMessage, false);\n      }\n\n      scheduleMethod = function (action) {\n        var currentId = taskId++;\n        tasks[currentId] = action;\n        root.postMessage(MSG_PREFIX + currentId, '*');\n      };\n    } else if (!!root.MessageChannel) {\n      var channel = new root.MessageChannel(),\n        channelTasks = {},\n        channelTaskId = 0;\n\n      channel.port1.onmessage = function (event) {\n        var id = event.data,\n          action = channelTasks[id];\n        action();\n        delete channelTasks[id];\n      };\n\n      scheduleMethod = function (action) {\n        var id = channelTaskId++;\n        channelTasks[id] = action;\n        channel.port2.postMessage(id);\n      };\n    } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {\n\n      scheduleMethod = function (action) {\n        var scriptElement = root.document.createElement('script');\n        scriptElement.onreadystatechange = function () {\n          action();\n          scriptElement.onreadystatechange = null;\n          scriptElement.parentNode.removeChild(scriptElement);\n          scriptElement = null;\n        };\n        root.document.documentElement.appendChild(scriptElement);\n      };\n\n    } else {\n      scheduleMethod = function (action) { return localSetTimeout(action, 0); };\n      clearMethod = localClearTimeout;\n    }\n  }());\n\n  /**\n   * Gets a scheduler that schedules work via a timed callback based upon platform.\n   */\n  var timeoutScheduler = Scheduler.timeout = (function () {\n\n    function scheduleNow(state, action) {\n      var scheduler = this,\n        disposable = new SingleAssignmentDisposable();\n      var id = scheduleMethod(function () {\n        if (!disposable.isDisposed) {\n          disposable.setDisposable(action(scheduler, state));\n        }\n      });\n      return new CompositeDisposable(disposable, disposableCreate(function () {\n        clearMethod(id);\n      }));\n    }\n\n    function scheduleRelative(state, dueTime, action) {\n      var scheduler = this,\n        dt = Scheduler.normalize(dueTime);\n      if (dt === 0) {\n        return scheduler.scheduleWithState(state, action);\n      }\n      var disposable = new SingleAssignmentDisposable();\n      var id = localSetTimeout(function () {\n        if (!disposable.isDisposed) {\n          disposable.setDisposable(action(scheduler, state));\n        }\n      }, dt);\n      return new CompositeDisposable(disposable, disposableCreate(function () {\n        localClearTimeout(id);\n      }));\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);\n    }\n\n    return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n  })();\n\n  var CatchScheduler = (function (__super__) {\n\n    function scheduleNow(state, action) {\n      return this._scheduler.scheduleWithState(state, this._wrap(action));\n    }\n\n    function scheduleRelative(state, dueTime, action) {\n      return this._scheduler.scheduleWithRelativeAndState(state, dueTime, this._wrap(action));\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this._scheduler.scheduleWithAbsoluteAndState(state, dueTime, this._wrap(action));\n    }\n\n    inherits(CatchScheduler, __super__);\n\n    function CatchScheduler(scheduler, handler) {\n      this._scheduler = scheduler;\n      this._handler = handler;\n      this._recursiveOriginal = null;\n      this._recursiveWrapper = null;\n      __super__.call(this, this._scheduler.now.bind(this._scheduler), scheduleNow, scheduleRelative, scheduleAbsolute);\n    }\n\n    CatchScheduler.prototype._clone = function (scheduler) {\n        return new CatchScheduler(scheduler, this._handler);\n    };\n\n    CatchScheduler.prototype._wrap = function (action) {\n      var parent = this;\n      return function (self, state) {\n        try {\n          return action(parent._getRecursiveWrapper(self), state);\n        } catch (e) {\n          if (!parent._handler(e)) { throw e; }\n          return disposableEmpty;\n        }\n      };\n    };\n\n    CatchScheduler.prototype._getRecursiveWrapper = function (scheduler) {\n      if (this._recursiveOriginal !== scheduler) {\n        this._recursiveOriginal = scheduler;\n        var wrapper = this._clone(scheduler);\n        wrapper._recursiveOriginal = scheduler;\n        wrapper._recursiveWrapper = wrapper;\n        this._recursiveWrapper = wrapper;\n      }\n      return this._recursiveWrapper;\n    };\n\n    CatchScheduler.prototype.schedulePeriodicWithState = function (state, period, action) {\n      var self = this, failed = false, d = new SingleAssignmentDisposable();\n\n      d.setDisposable(this._scheduler.schedulePeriodicWithState(state, period, function (state1) {\n        if (failed) { return null; }\n        try {\n          return action(state1);\n        } catch (e) {\n          failed = true;\n          if (!self._handler(e)) { throw e; }\n          d.dispose();\n          return null;\n        }\n      }));\n\n      return d;\n    };\n\n    return CatchScheduler;\n  }(Scheduler));\n\n  /**\n   *  Represents a notification to an observer.\n   */\n  var Notification = Rx.Notification = (function () {\n    function Notification(kind, hasValue) {\n      this.hasValue = hasValue == null ? false : hasValue;\n      this.kind = kind;\n    }\n\n    /**\n     * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n     *\n     * @memberOf Notification\n     * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n     * @param {Function} onError Delegate to invoke for an OnError notification.\n     * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n     * @returns {Any} Result produced by the observation.\n     */\n    Notification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n      return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n        this._acceptObservable(observerOrOnNext) :\n        this._accept(observerOrOnNext, onError, onCompleted);\n    };\n\n    /**\n     * Returns an observable sequence with a single notification.\n     *\n     * @memberOf Notifications\n     * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n     * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n     */\n    Notification.prototype.toObservable = function (scheduler) {\n      var notification = this;\n      isScheduler(scheduler) || (scheduler = immediateScheduler);\n      return new AnonymousObservable(function (observer) {\n        return scheduler.schedule(function () {\n          notification._acceptObservable(observer);\n          notification.kind === 'N' && observer.onCompleted();\n        });\n      });\n    };\n\n    return Notification;\n  })();\n\n  /**\n   * Creates an object that represents an OnNext notification to an observer.\n   * @param {Any} value The value contained in the notification.\n   * @returns {Notification} The OnNext notification containing the value.\n   */\n  var notificationCreateOnNext = Notification.createOnNext = (function () {\n\n      function _accept (onNext) { return onNext(this.value); }\n      function _acceptObservable(observer) { return observer.onNext(this.value); }\n      function toString () { return 'OnNext(' + this.value + ')'; }\n\n      return function (value) {\n        var notification = new Notification('N', true);\n        notification.value = value;\n        notification._accept = _accept;\n        notification._acceptObservable = _acceptObservable;\n        notification.toString = toString;\n        return notification;\n      };\n  }());\n\n  /**\n   * Creates an object that represents an OnError notification to an observer.\n   * @param {Any} error The exception contained in the notification.\n   * @returns {Notification} The OnError notification containing the exception.\n   */\n  var notificationCreateOnError = Notification.createOnError = (function () {\n\n    function _accept (onNext, onError) { return onError(this.exception); }\n    function _acceptObservable(observer) { return observer.onError(this.exception); }\n    function toString () { return 'OnError(' + this.exception + ')'; }\n\n    return function (e) {\n      var notification = new Notification('E');\n      notification.exception = e;\n      notification._accept = _accept;\n      notification._acceptObservable = _acceptObservable;\n      notification.toString = toString;\n      return notification;\n    };\n  }());\n\n  /**\n   * Creates an object that represents an OnCompleted notification to an observer.\n   * @returns {Notification} The OnCompleted notification.\n   */\n  var notificationCreateOnCompleted = Notification.createOnCompleted = (function () {\n\n    function _accept (onNext, onError, onCompleted) { return onCompleted(); }\n    function _acceptObservable(observer) { return observer.onCompleted(); }\n    function toString () { return 'OnCompleted()'; }\n\n    return function () {\n      var notification = new Notification('C');\n      notification._accept = _accept;\n      notification._acceptObservable = _acceptObservable;\n      notification.toString = toString;\n      return notification;\n    };\n  }());\n\n  var Enumerator = Rx.internals.Enumerator = function (next) {\n    this._next = next;\n  };\n\n  Enumerator.prototype.next = function () {\n    return this._next();\n  };\n\n  Enumerator.prototype[$iterator$] = function () { return this; }\n\n  var Enumerable = Rx.internals.Enumerable = function (iterator) {\n    this._iterator = iterator;\n  };\n\n  Enumerable.prototype[$iterator$] = function () {\n    return this._iterator();\n  };\n\n  Enumerable.prototype.concat = function () {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var e = sources[$iterator$]();\n\n      var isDisposed, subscription = new SerialDisposable();\n      var cancelable = immediateScheduler.scheduleRecursive(function (self) {\n        if (isDisposed) { return; }\n        try {\n          var currentItem = e.next();\n        } catch (ex) {\n          return o.onError(ex);\n        }\n\n        if (currentItem.done) {\n          return o.onCompleted();\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var d = new SingleAssignmentDisposable();\n        subscription.setDisposable(d);\n        d.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function(err) { o.onError(err); },\n          self)\n        );\n      });\n\n      return new CompositeDisposable(subscription, cancelable, disposableCreate(function () {\n        isDisposed = true;\n      }));\n    });\n  };\n\n  Enumerable.prototype.catchError = function () {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var e = sources[$iterator$]();\n\n      var isDisposed, subscription = new SerialDisposable();\n      var cancelable = immediateScheduler.scheduleRecursiveWithState(null, function (lastException, self) {\n        if (isDisposed) { return; }\n\n        try {\n          var currentItem = e.next();\n        } catch (ex) {\n          return observer.onError(ex);\n        }\n\n        if (currentItem.done) {\n          if (lastException !== null) {\n            o.onError(lastException);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var d = new SingleAssignmentDisposable();\n        subscription.setDisposable(d);\n        d.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          self,\n          function() { o.onCompleted(); }));\n      });\n      return new CompositeDisposable(subscription, cancelable, disposableCreate(function () {\n        isDisposed = true;\n      }));\n    });\n  };\n\n\n  Enumerable.prototype.catchErrorWhen = function (notificationHandler) {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var exceptions = new Subject(),\n        notifier = new Subject(),\n        handled = notificationHandler(exceptions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = sources[$iterator$]();\n\n      var isDisposed,\n        lastException,\n        subscription = new SerialDisposable();\n      var cancelable = immediateScheduler.scheduleRecursive(function (self) {\n        if (isDisposed) { return; }\n\n        try {\n          var currentItem = e.next();\n        } catch (ex) {\n          return o.onError(ex);\n        }\n\n        if (currentItem.done) {\n          if (lastException) {\n            o.onError(lastException);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new CompositeDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) {\n            inner.setDisposable(notifier.subscribe(self, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            exceptions.onNext(exn);\n          },\n          function() { o.onCompleted(); }));\n      });\n\n      return new CompositeDisposable(notificationDisposable, subscription, cancelable, disposableCreate(function () {\n        isDisposed = true;\n      }));\n    });\n  };\n\n  var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) {\n    if (repeatCount == null) { repeatCount = -1; }\n    return new Enumerable(function () {\n      var left = repeatCount;\n      return new Enumerator(function () {\n        if (left === 0) { return doneEnumerator; }\n        if (left > 0) { left--; }\n        return { done: false, value: value };\n      });\n    });\n  };\n\n  var enumerableOf = Enumerable.of = function (source, selector, thisArg) {\n    if (selector) {\n      var selectorFn = bindCallback(selector, thisArg, 3);\n    }\n    return new Enumerable(function () {\n      var index = -1;\n      return new Enumerator(\n        function () {\n          return ++index < source.length ?\n            { done: false, value: !selector ? source[index] : selectorFn(source[index], index, source) } :\n            doneEnumerator;\n        });\n    });\n  };\n\n  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates a notification callback from an observer.\n   * @returns The action that forwards its input notification to the underlying observer.\n   */\n  Observer.prototype.toNotifier = function () {\n    var observer = this;\n    return function (n) { return n.accept(observer); };\n  };\n\n  /**\n   *  Hides the identity of an observer.\n   * @returns An observer that hides the identity of the specified observer.\n   */\n  Observer.prototype.asObserver = function () {\n    return new AnonymousObserver(this.onNext.bind(this), this.onError.bind(this), this.onCompleted.bind(this));\n  };\n\n  /**\n   *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n   *  If a violation is detected, an Error is thrown from the offending observer method call.\n   * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n   */\n  Observer.prototype.checked = function () { return new CheckedObserver(this); };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n\n  /**\n   *  Creates an observer from a notification callback.\n   *\n   * @static\n   * @memberOf Observer\n   * @param {Function} handler Action that handles a notification.\n   * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n   */\n  Observer.fromNotifier = function (handler, thisArg) {\n    return new AnonymousObserver(function (x) {\n      return handler.call(thisArg, notificationCreateOnNext(x));\n    }, function (e) {\n      return handler.call(thisArg, notificationCreateOnError(e));\n    }, function () {\n      return handler.call(thisArg, notificationCreateOnCompleted());\n    });\n  };\n\n  /**\n   * Schedules the invocation of observer methods on the given scheduler.\n   * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n   * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n   */\n  Observer.prototype.notifyOn = function (scheduler) {\n    return new ObserveOnObserver(scheduler, this);\n  };\n\n  Observer.prototype.makeSafe = function(disposable) {\n    return new AnonymousSafeObserver(this._onNext, this._onError, this._onCompleted, disposable);\n  };\n\n  /**\n   * Abstract base class for implementations of the Observer class.\n   * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n   */\n  var AbstractObserver = Rx.internals.AbstractObserver = (function (__super__) {\n    inherits(AbstractObserver, __super__);\n\n    /**\n     * Creates a new observer in a non-stopped state.\n     */\n    function AbstractObserver() {\n      this.isStopped = false;\n      __super__.call(this);\n    }\n\n    /**\n     * Notifies the observer of a new element in the sequence.\n     * @param {Any} value Next element in the sequence.\n     */\n    AbstractObserver.prototype.onNext = function (value) {\n      if (!this.isStopped) { this.next(value); }\n    };\n\n    /**\n     * Notifies the observer that an exception has occurred.\n     * @param {Any} error The error that has occurred.\n     */\n    AbstractObserver.prototype.onError = function (error) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(error);\n      }\n    };\n\n    /**\n     * Notifies the observer of the end of the sequence.\n     */\n    AbstractObserver.prototype.onCompleted = function () {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.completed();\n      }\n    };\n\n    /**\n     * Disposes the observer, causing it to transition to the stopped state.\n     */\n    AbstractObserver.prototype.dispose = function () {\n      this.isStopped = true;\n    };\n\n    AbstractObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return AbstractObserver;\n  }(Observer));\n\n  /**\n   * Class to create an Observer instance from delegate-based implementations of the on* methods.\n   */\n  var AnonymousObserver = Rx.AnonymousObserver = (function (__super__) {\n    inherits(AnonymousObserver, __super__);\n\n    /**\n     * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n     * @param {Any} onNext Observer's OnNext action implementation.\n     * @param {Any} onError Observer's OnError action implementation.\n     * @param {Any} onCompleted Observer's OnCompleted action implementation.\n     */\n    function AnonymousObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    /**\n     * Calls the onNext action.\n     * @param {Any} value Next element in the sequence.\n     */\n    AnonymousObserver.prototype.next = function (value) {\n      this._onNext(value);\n    };\n\n    /**\n     * Calls the onError action.\n     * @param {Any} error The error that has occurred.\n     */\n    AnonymousObserver.prototype.error = function (error) {\n      this._onError(error);\n    };\n\n    /**\n     *  Calls the onCompleted action.\n     */\n    AnonymousObserver.prototype.completed = function () {\n      this._onCompleted();\n    };\n\n    return AnonymousObserver;\n  }(AbstractObserver));\n\n    var CheckedObserver = (function (_super) {\n        inherits(CheckedObserver, _super);\n\n        function CheckedObserver(observer) {\n            _super.call(this);\n            this._observer = observer;\n            this._state = 0; // 0 - idle, 1 - busy, 2 - done\n        }\n\n        var CheckedObserverPrototype = CheckedObserver.prototype;\n\n        CheckedObserverPrototype.onNext = function (value) {\n            this.checkAccess();\n            try {\n                this._observer.onNext(value);\n            } catch (e) {\n                throw e;\n            } finally {\n                this._state = 0;\n            }\n        };\n\n        CheckedObserverPrototype.onError = function (err) {\n            this.checkAccess();\n            try {\n                this._observer.onError(err);\n            } catch (e) {\n                throw e;\n            } finally {\n                this._state = 2;\n            }\n        };\n\n        CheckedObserverPrototype.onCompleted = function () {\n            this.checkAccess();\n            try {\n                this._observer.onCompleted();\n            } catch (e) {\n                throw e;\n            } finally {\n                this._state = 2;\n            }\n        };\n\n        CheckedObserverPrototype.checkAccess = function () {\n            if (this._state === 1) { throw new Error('Re-entrancy detected'); }\n            if (this._state === 2) { throw new Error('Observer completed'); }\n            if (this._state === 0) { this._state = 1; }\n        };\n\n        return CheckedObserver;\n    }(Observer));\n\n  var ScheduledObserver = Rx.internals.ScheduledObserver = (function (__super__) {\n    inherits(ScheduledObserver, __super__);\n\n    function ScheduledObserver(scheduler, observer) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.observer = observer;\n      this.isAcquired = false;\n      this.hasFaulted = false;\n      this.queue = [];\n      this.disposable = new SerialDisposable();\n    }\n\n    ScheduledObserver.prototype.next = function (value) {\n      var self = this;\n      this.queue.push(function () { self.observer.onNext(value); });\n    };\n\n    ScheduledObserver.prototype.error = function (e) {\n      var self = this;\n      this.queue.push(function () { self.observer.onError(e); });\n    };\n\n    ScheduledObserver.prototype.completed = function () {\n      var self = this;\n      this.queue.push(function () { self.observer.onCompleted(); });\n    };\n\n    ScheduledObserver.prototype.ensureActive = function () {\n      var isOwner = false, parent = this;\n      if (!this.hasFaulted && this.queue.length > 0) {\n        isOwner = !this.isAcquired;\n        this.isAcquired = true;\n      }\n      if (isOwner) {\n        this.disposable.setDisposable(this.scheduler.scheduleRecursive(function (self) {\n          var work;\n          if (parent.queue.length > 0) {\n            work = parent.queue.shift();\n          } else {\n            parent.isAcquired = false;\n            return;\n          }\n          try {\n            work();\n          } catch (ex) {\n            parent.queue = [];\n            parent.hasFaulted = true;\n            throw ex;\n          }\n          self();\n        }));\n      }\n    };\n\n    ScheduledObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.disposable.dispose();\n    };\n\n    return ScheduledObserver;\n  }(AbstractObserver));\n\n  var ObserveOnObserver = (function (__super__) {\n    inherits(ObserveOnObserver, __super__);\n\n    function ObserveOnObserver(scheduler, observer, cancel) {\n      __super__.call(this, scheduler, observer);\n      this._cancel = cancel;\n    }\n\n    ObserveOnObserver.prototype.next = function (value) {\n      __super__.prototype.next.call(this, value);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.error = function (e) {\n      __super__.prototype.error.call(this, e);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.completed = function () {\n      __super__.prototype.completed.call(this);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this._cancel && this._cancel.dispose();\n      this._cancel = null;\n    };\n\n    return ObserveOnObserver;\n  })(ScheduledObserver);\n\n  var observableProto;\n\n  /**\n   * Represents a push-style collection.\n   */\n  var Observable = Rx.Observable = (function () {\n\n    function Observable(subscribe) {\n      if (Rx.config.longStackSupport && hasStacks) {\n        try {\n          throw new Error();\n        } catch (e) {\n          this.stack = e.stack.substring(e.stack.indexOf(\"\\n\") + 1);\n        }\n\n        var self = this;\n        this._subscribe = function (observer) {\n          var oldOnError = observer.onError.bind(observer);\n\n          observer.onError = function (err) {\n            makeStackTraceLong(err, self);\n            oldOnError(err);\n          };\n\n          return subscribe.call(self, observer);\n        };\n      } else {\n        this._subscribe = subscribe;\n      }\n    }\n\n    observableProto = Observable.prototype;\n\n    /**\n     *  Subscribes an observer to the observable sequence.\n     *  @param {Mixed} [observerOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n     *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n     *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n     *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribe = observableProto.forEach = function (observerOrOnNext, onError, onCompleted) {\n      return this._subscribe(typeof observerOrOnNext === 'object' ?\n        observerOrOnNext :\n        observerCreate(observerOrOnNext, onError, onCompleted));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onNext The function to invoke on each element in the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnNext = function (onNext, thisArg) {\n      return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n    };\n\n    /**\n     * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n     * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnError = function (onError, thisArg) {\n      return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnCompleted = function (onCompleted, thisArg) {\n      return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n    };\n\n    return Observable;\n  })();\n\n  var ObservableBase = Rx.ObservableBase = (function (__super__) {\n\n  inherits(ObservableBase, __super__);\n\n  // Fix subscriber to check for undefined or function returned to decorate as Disposable\n  function fixSubscriber(subscriber) {\n    if (subscriber && typeof subscriber.dispose === 'function') { return subscriber; }\n\n      return typeof subscriber === 'function' ?\n        disposableCreate(subscriber) :\n        disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      try {\n        ado.setDisposable(fixSubscriber(self.subscribeCore(ado)));\n      } catch (e) {\n        if (!ado.fail(e)) { throw e; }\n      }\n    }\n\n    function subscribe(observer) {\n      var ado = new AutoDetachObserver(observer), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.scheduleWithState(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n\n      return ado;\n    }\n\n    function ObservableBase() {\n      __super__.call(this, subscribe);\n    }\n\n    ObservableBase.prototype.subscribeCore = function(observer) {\n      throw new Error('Not implemeneted');\n    }\n\n    return ObservableBase;\n\n  }(Observable));\n\n   /**\n   *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n   *\n   *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n   *  that require to be run on a scheduler, use subscribeOn.\n   *\n   *  @param {Scheduler} scheduler Scheduler to notify observers on.\n   *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n   */\n  observableProto.observeOn = function (scheduler) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      return source.subscribe(new ObserveOnObserver(scheduler, observer));\n    }, source);\n  };\n\n   /**\n   *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n   *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n   *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n   *  callbacks on a scheduler, use observeOn.\n\n   *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n   *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n   */\n  observableProto.subscribeOn = function (scheduler) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(), d = new SerialDisposable();\n      d.setDisposable(m);\n      m.setDisposable(scheduler.schedule(function () {\n        d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(observer)));\n      }));\n      return d;\n    }, source);\n  };\n\n  /**\n   * Converts a Promise to an Observable sequence\n   * @param {Promise} An ES6 Compliant promise.\n   * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n   */\n  var observableFromPromise = Observable.fromPromise = function (promise) {\n    return observableDefer(function () {\n      var subject = new Rx.AsyncSubject();\n\n      promise.then(\n        function (value) {\n          subject.onNext(value);\n          subject.onCompleted();\n        },\n        subject.onError.bind(subject));\n\n      return subject;\n    });\n  };\n\n  /*\n   * Converts an existing observable sequence to an ES6 Compatible Promise\n   * @example\n   * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n   *\n   * // With config\n   * Rx.config.Promise = RSVP.Promise;\n   * var promise = Rx.Observable.return(42).toPromise();\n   * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n   * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n   */\n  observableProto.toPromise = function (promiseCtor) {\n    promiseCtor || (promiseCtor = Rx.config.Promise);\n    if (!promiseCtor) { throw new TypeError('Promise type not provided nor in Rx.config.Promise'); }\n    var source = this;\n    return new promiseCtor(function (resolve, reject) {\n      // No cancellation can be done\n      var value, hasValue = false;\n      source.subscribe(function (v) {\n        value = v;\n        hasValue = true;\n      }, reject, function () {\n        hasValue && resolve(value);\n      });\n    });\n  };\n\n  /**\n   * Creates an array from an observable sequence.\n   * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n   */\n  observableProto.toArray = function () {\n    var source = this;\n    return new AnonymousObservable(function(observer) {\n      var arr = [];\n      return source.subscribe(\n        function (x) { arr.push(x); },\n        function (e) { observer.onError(e); },\n        function () {\n          observer.onNext(arr);\n          observer.onCompleted();\n        });\n    }, source);\n  };\n\n  /**\n   *  Creates an observable sequence from a specified subscribe method implementation.\n   * @example\n   *  var res = Rx.Observable.create(function (observer) { return function () { } );\n   *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n   *  var res = Rx.Observable.create(function (observer) { } );\n   * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n   * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n   */\n  Observable.create = Observable.createWithDisposable = function (subscribe, parent) {\n    return new AnonymousObservable(subscribe, parent);\n  };\n\n  /**\n   *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n   *\n   * @example\n   *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n   * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n   * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n   */\n  var observableDefer = Observable.defer = function (observableFactory) {\n    return new AnonymousObservable(function (observer) {\n      var result;\n      try {\n        result = observableFactory();\n      } catch (e) {\n        return observableThrow(e).subscribe(observer);\n      }\n      isPromise(result) && (result = observableFromPromise(result));\n      return result.subscribe(observer);\n    });\n  };\n\n  /**\n   *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n   *\n   * @example\n   *  var res = Rx.Observable.empty();\n   *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n   * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n   * @returns {Observable} An observable sequence with no elements.\n   */\n  var observableEmpty = Observable.empty = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.schedule(function () {\n        observer.onCompleted();\n      });\n    });\n  };\n\n  var maxSafeInteger = Math.pow(2, 53) - 1;\n\n  function StringIterable(str) {\n    this._s = s;\n  }\n\n  StringIterable.prototype[$iterator$] = function () {\n    return new StringIterator(this._s);\n  };\n\n  function StringIterator(str) {\n    this._s = s;\n    this._l = s.length;\n    this._i = 0;\n  }\n\n  StringIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  StringIterator.prototype.next = function () {\n    if (this._i < this._l) {\n      var val = this._s.charAt(this._i++);\n      return { done: false, value: val };\n    } else {\n      return doneEnumerator;\n    }\n  };\n\n  function ArrayIterable(a) {\n    this._a = a;\n  }\n\n  ArrayIterable.prototype[$iterator$] = function () {\n    return new ArrayIterator(this._a);\n  };\n\n  function ArrayIterator(a) {\n    this._a = a;\n    this._l = toLength(a);\n    this._i = 0;\n  }\n\n  ArrayIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  ArrayIterator.prototype.next = function () {\n    if (this._i < this._l) {\n      var val = this._a[this._i++];\n      return { done: false, value: val };\n    } else {\n      return doneEnumerator;\n    }\n  };\n\n  function numberIsFinite(value) {\n    return typeof value === 'number' && root.isFinite(value);\n  }\n\n  function isNan(n) {\n    return n !== n;\n  }\n\n  function getIterable(o) {\n    var i = o[$iterator$], it;\n    if (!i && typeof o === 'string') {\n      it = new StringIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i && o.length !== undefined) {\n      it = new ArrayIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i) { throw new TypeError('Object is not iterable'); }\n    return o[$iterator$]();\n  }\n\n  function sign(value) {\n    var number = +value;\n    if (number === 0) { return number; }\n    if (isNaN(number)) { return number; }\n    return number < 0 ? -1 : 1;\n  }\n\n  function toLength(o) {\n    var len = +o.length;\n    if (isNaN(len)) { return 0; }\n    if (len === 0 || !numberIsFinite(len)) { return len; }\n    len = sign(len) * Math.floor(Math.abs(len));\n    if (len <= 0) { return 0; }\n    if (len > maxSafeInteger) { return maxSafeInteger; }\n    return len;\n  }\n\n  /**\n   * This method creates a new Observable sequence from an array-like or iterable object.\n   * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n   * @param {Function} [mapFn] Map function to call on every element of the array.\n   * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n   * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n   */\n  var observableFrom = Observable.from = function (iterable, mapFn, thisArg, scheduler) {\n    if (iterable == null) {\n      throw new Error('iterable cannot be null.')\n    }\n    if (mapFn && !isFunction(mapFn)) {\n      throw new Error('mapFn when provided must be a function');\n    }\n    if (mapFn) {\n      var mapper = bindCallback(mapFn, thisArg, 2);\n    }\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    var list = Object(iterable), it = getIterable(list);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleRecursiveWithState(0, function (i, self) {\n        try {\n          var next = it.next();\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n        if (next.done) {\n          observer.onCompleted();\n          return;\n        }\n\n        var result = next.value;\n\n        if (mapper) {\n          try {\n            result = mapper(result, i);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n        }\n\n        observer.onNext(result);\n        self(i + 1);\n      });\n    });\n  };\n\n  var FromArrayObservable = (function(__super__) {\n    inherits(FromArrayObservable, __super__);\n    function FromArrayObservable(args, scheduler) {\n      this.args = args;\n      this.scheduler = scheduler || currentThreadScheduler;\n      __super__.call(this);\n    }\n\n    FromArrayObservable.prototype.subscribeCore = function (observer) {\n      var sink = new FromArraySink(observer, this);\n      return sink.run();\n    };\n\n    return FromArrayObservable;\n  }(ObservableBase));\n\n  var FromArraySink = (function () {\n    function FromArraySink(observer, parent) {\n      this.observer = observer;\n      this.parent = parent;\n    }\n\n    function loopRecursive(state, recurse) {\n      if (state.i < state.len) {\n        state.observer.onNext(state.args[state.i++]);\n        recurse(state);\n      } else {\n        state.observer.onCompleted();\n      }\n    }\n\n    FromArraySink.prototype.run = function () {\n      return this.parent.scheduler.scheduleRecursiveWithState(\n        {i: 0, args: this.parent.args, len: this.parent.args.length, observer: this.observer },\n        loopRecursive);\n    };\n\n    return FromArraySink;\n  }());\n\n  /**\n  *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n  * @deprecated use Observable.from or Observable.of\n  * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n  */\n  var observableFromArray = Observable.fromArray = function (array, scheduler) {\n    return new FromArrayObservable(array, scheduler)\n  };\n\n  /**\n   *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new AnonymousObservable(function (observer) {\n      var first = true, state = initialState;\n      return scheduler.scheduleRecursive(function (self) {\n        var hasResult, result;\n        try {\n          if (first) {\n            first = false;\n          } else {\n            state = iterate(state);\n          }\n          hasResult = condition(state);\n          if (hasResult) {\n            result = resultSelector(state);\n          }\n        } catch (exception) {\n          observer.onError(exception);\n          return;\n        }\n        if (hasResult) {\n          observer.onNext(result);\n          self();\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n   * @returns {Observable} An observable sequence whose observers will never get called.\n   */\n  var observableNever = Observable.never = function () {\n    return new AnonymousObservable(function () {\n      return disposableEmpty;\n    });\n  };\n\n  function observableOf (scheduler, array) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new AnonymousObservable(function (observer) {\n      var count = 0, len = array.length;\n      return scheduler.scheduleRecursive(function (self) {\n        if (count < len) {\n          observer.onNext(array[count++]);\n          self();\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  }\n\n  /**\n   *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n   * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n   */\n  Observable.of = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableOf(null, args);\n  };\n\n  /**\n   *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n   * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n   * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n   */\n  Observable.ofWithScheduler = function (scheduler) {\n    for(var args = [], i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableOf(scheduler, args);\n  };\n\n  /**\n   * Convert an object into an observable sequence of [key, value] pairs.\n   * @param {Object} obj The object to inspect.\n   * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n   * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n   */\n  Observable.pairs = function (obj, scheduler) {\n    scheduler || (scheduler = Rx.Scheduler.currentThread);\n    return new AnonymousObservable(function (observer) {\n      var keys = Object.keys(obj), len = keys.length;\n      return scheduler.scheduleRecursiveWithState(0, function (idx, self) {\n        if (idx < len) {\n          var key = keys[idx];\n          observer.onNext([key, obj[key]]);\n          self(idx + 1);\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.range(0, 10);\n   *  var res = Rx.Observable.range(0, 10, Rx.Scheduler.timeout);\n   * @param {Number} start The value of the first integer in the sequence.\n   * @param {Number} count The number of sequential integers to generate.\n   * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n   * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n   */\n  Observable.range = function (start, count, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleRecursiveWithState(0, function (i, self) {\n        if (i < count) {\n          observer.onNext(start + i);\n          self(i + 1);\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.repeat(42);\n   *  var res = Rx.Observable.repeat(42, 4);\n   *  3 - res = Rx.Observable.repeat(42, 4, Rx.Scheduler.timeout);\n   *  4 - res = Rx.Observable.repeat(42, null, Rx.Scheduler.timeout);\n   * @param {Mixed} value Element to repeat.\n   * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n   * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n   */\n  Observable.repeat = function (value, repeatCount, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return observableReturn(value, scheduler).repeat(repeatCount == null ? -1 : repeatCount);\n  };\n\n  /**\n   *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n   *  There is an alias called 'just', and 'returnValue' for browsers <IE9.\n   * @param {Mixed} value Single element in the resulting observable sequence.\n   * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence containing the single specified element.\n   */\n  var observableReturn = Observable['return'] = Observable.just = function (value, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.schedule(function () {\n        observer.onNext(value);\n        observer.onCompleted();\n      });\n    });\n  };\n\n  /** @deprecated use return or just */\n  Observable.returnValue = function () {\n    //deprecate('returnValue', 'return or just');\n    return observableReturn.apply(null, arguments);\n  };\n\n  /**\n   *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n   *  There is an alias to this method called 'throwError' for browsers <IE9.\n   * @param {Mixed} error An object used for the sequence's termination.\n   * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n   */\n  var observableThrow = Observable['throw'] = Observable.throwError = function (error, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.schedule(function () {\n        observer.onError(error);\n      });\n    });\n  };\n\n  /** @deprecated use #some instead */\n  Observable.throwException = function () {\n    //deprecate('throwException', 'throwError');\n    return Observable.throwError.apply(null, arguments);\n  };\n\n  /**\n   * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n   * @param {Function} resourceFactory Factory function to obtain a resource object.\n   * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n   * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n   */\n  Observable.using = function (resourceFactory, observableFactory) {\n    return new AnonymousObservable(function (observer) {\n      var disposable = disposableEmpty, resource, source;\n      try {\n        resource = resourceFactory();\n        resource && (disposable = resource);\n        source = observableFactory(resource);\n      } catch (exception) {\n        return new CompositeDisposable(observableThrow(exception).subscribe(observer), disposable);\n      }\n      return new CompositeDisposable(source.subscribe(observer), disposable);\n    });\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @param {Observable} rightSource Second observable sequence or Promise.\n   * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n   */\n  observableProto.amb = function (rightSource) {\n    var leftSource = this;\n    return new AnonymousObservable(function (observer) {\n      var choice,\n        leftChoice = 'L', rightChoice = 'R',\n        leftSubscription = new SingleAssignmentDisposable(),\n        rightSubscription = new SingleAssignmentDisposable();\n\n      isPromise(rightSource) && (rightSource = observableFromPromise(rightSource));\n\n      function choiceL() {\n        if (!choice) {\n          choice = leftChoice;\n          rightSubscription.dispose();\n        }\n      }\n\n      function choiceR() {\n        if (!choice) {\n          choice = rightChoice;\n          leftSubscription.dispose();\n        }\n      }\n\n      leftSubscription.setDisposable(leftSource.subscribe(function (left) {\n        choiceL();\n        if (choice === leftChoice) {\n          observer.onNext(left);\n        }\n      }, function (err) {\n        choiceL();\n        if (choice === leftChoice) {\n          observer.onError(err);\n        }\n      }, function () {\n        choiceL();\n        if (choice === leftChoice) {\n          observer.onCompleted();\n        }\n      }));\n\n      rightSubscription.setDisposable(rightSource.subscribe(function (right) {\n        choiceR();\n        if (choice === rightChoice) {\n          observer.onNext(right);\n        }\n      }, function (err) {\n        choiceR();\n        if (choice === rightChoice) {\n          observer.onError(err);\n        }\n      }, function () {\n        choiceR();\n        if (choice === rightChoice) {\n          observer.onCompleted();\n        }\n      }));\n\n      return new CompositeDisposable(leftSubscription, rightSubscription);\n    });\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   *\n   * @example\n   * var = Rx.Observable.amb(xs, ys, zs);\n   * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n   */\n  Observable.amb = function () {\n    var acc = observableNever(), items = [];\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { items.push(arguments[i]); }\n    }\n\n    function func(previous, current) {\n      return previous.amb(current);\n    }\n    for (var i = 0, len = items.length; i < len; i++) {\n      acc = func(acc, items[i]);\n    }\n    return acc;\n  };\n\n  function observableCatchHandler(source, handler) {\n    return new AnonymousObservable(function (observer) {\n      var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();\n      subscription.setDisposable(d1);\n      d1.setDisposable(source.subscribe(observer.onNext.bind(observer), function (exception) {\n        var d, result;\n        try {\n          result = handler(exception);\n        } catch (ex) {\n          observer.onError(ex);\n          return;\n        }\n        isPromise(result) && (result = observableFromPromise(result));\n\n        d = new SingleAssignmentDisposable();\n        subscription.setDisposable(d);\n        d.setDisposable(result.subscribe(observer));\n      }, observer.onCompleted.bind(observer)));\n\n      return subscription;\n    }, source);\n  }\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @example\n   * 1 - xs.catchException(ys)\n   * 2 - xs.catchException(function (ex) { return ys(ex); })\n   * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n   * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n   */\n  observableProto['catch'] = observableProto.catchError = function (handlerOrSecond) {\n    return typeof handlerOrSecond === 'function' ?\n      observableCatchHandler(this, handlerOrSecond) :\n      observableCatch([this, handlerOrSecond]);\n  };\n\n  /**\n   * @deprecated use #catch or #catchError instead.\n   */\n  observableProto.catchException = function (handlerOrSecond) {\n    //deprecate('catchException', 'catch or catchError');\n    return this.catchError(handlerOrSecond);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n   * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n   */\n  var observableCatch = Observable.catchError = Observable['catch'] = Observable.catchException = function () {\n    var items = [];\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { items.push(arguments[i]); }\n    }\n    return enumerableOf(items).catchError();\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   * This can be in the form of an argument list of observables or an array.\n   *\n   * @example\n   * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.combineLatest = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return combineLatest.apply(this, args);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   *\n   * @example\n   * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  var combineLatest = Observable.combineLatest = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    var resultSelector = args.pop();\n\n    if (Array.isArray(args[0])) {\n      args = args[0];\n    }\n\n    return new AnonymousObservable(function (observer) {\n      var falseFactory = function () { return false; },\n        n = args.length,\n        hasValue = arrayInitialize(n, falseFactory),\n        hasValueAll = false,\n        isDone = arrayInitialize(n, falseFactory),\n        values = new Array(n);\n\n      function next(i) {\n        var res;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          try {\n            res = resultSelector.apply(null, values);\n          } catch (ex) {\n            observer.onError(ex);\n            return;\n          }\n          observer.onNext(res);\n        } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n          observer.onCompleted();\n        }\n      }\n\n      function done (i) {\n        isDone[i] = true;\n        if (isDone.every(identity)) {\n          observer.onCompleted();\n        }\n      }\n\n      var subscriptions = new Array(n);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          var source = args[i], sad = new SingleAssignmentDisposable();\n          isPromise(source) && (source = observableFromPromise(source));\n          sad.setDisposable(source.subscribe(function (x) {\n              values[i] = x;\n              next(i);\n            },\n            function(e) { observer.onError(e); },\n            function () { done(i); }\n          ));\n          subscriptions[i] = sad;\n        }(idx));\n      }\n\n      return new CompositeDisposable(subscriptions);\n    }, this);\n  };\n\n  /**\n   * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  observableProto.concat = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    args.unshift(this);\n    return observableConcat.apply(null, args);\n  };\n\n  /**\n   * Concatenates all the observable sequences.\n   * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  var observableConcat = Observable.concat = function () {\n    var items = [];\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { items.push(arguments[i]); }\n    }\n    return enumerableOf(items).concat();\n  };\n\n  /**\n   * Concatenates an observable sequence of observable sequences.\n   * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n   */\n  observableProto.concatAll = observableProto.concatObservable = function () {\n    return this.merge(1);\n  };\n\n  /**\n   * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n   * Or merges two observable sequences into a single observable sequence.\n   *\n   * @example\n   * 1 - merged = sources.merge(1);\n   * 2 - merged = source.merge(otherSource);\n   * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n   * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n   */\n  observableProto.merge = function (maxConcurrentOrOther) {\n    if (typeof maxConcurrentOrOther !== 'number') { return observableMerge(this, maxConcurrentOrOther); }\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var activeCount = 0, group = new CompositeDisposable(), isStopped = false, q = [];\n\n      function subscribe(xs) {\n        var subscription = new SingleAssignmentDisposable();\n        group.add(subscription);\n\n        // Check for promises support\n        isPromise(xs) && (xs = observableFromPromise(xs));\n\n        subscription.setDisposable(xs.subscribe(function (x) { o.onNext(x); }, function (e) { o.onError(e); }, function () {\n          group.remove(subscription);\n          if (q.length > 0) {\n            subscribe(q.shift());\n          } else {\n            activeCount--;\n            isStopped && activeCount === 0 && o.onCompleted();\n          }\n        }));\n      }\n      group.add(sources.subscribe(function (innerSource) {\n        if (activeCount < maxConcurrentOrOther) {\n          activeCount++;\n          subscribe(innerSource);\n        } else {\n          q.push(innerSource);\n        }\n      }, function (e) { o.onError(e); }, function () {\n        isStopped = true;\n        activeCount === 0 && o.onCompleted();\n      }));\n      return group;\n    }, sources);\n  };\n\n  /**\n   * Merges all the observable sequences into a single observable sequence.\n   * The scheduler is optional and if not specified, the immediate scheduler is used.\n   * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n   */\n  var observableMerge = Observable.merge = function () {\n    var scheduler, sources = [], i, len = arguments.length;\n    if (!arguments[0]) {\n      scheduler = immediateScheduler;\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else if (isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else {\n      scheduler = immediateScheduler;\n      for(i = 0; i < len; i++) { sources.push(arguments[i]); }\n    }\n    if (Array.isArray(sources[0])) {\n      sources = sources[0];\n    }\n    return observableOf(scheduler, sources).mergeAll();\n  };\n\n  /**\n   * Merges an observable sequence of observable sequences into an observable sequence.\n   * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n   */\n  observableProto.mergeAll = function () {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable(),\n        isStopped = false,\n        m = new SingleAssignmentDisposable();\n\n      group.add(m);\n      m.setDisposable(sources.subscribe(function (innerSource) {\n        var innerSubscription = new SingleAssignmentDisposable();\n        group.add(innerSubscription);\n\n        // Check for promises support\n        isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n\n        innerSubscription.setDisposable(innerSource.subscribe(function (x) { o.onNext(x); }, function (e) { o.onError(e); }, function () {\n          group.remove(innerSubscription);\n          isStopped && group.length === 1 && o.onCompleted();\n        }));\n      }, function (e) { o.onError(e); }, function () {\n        isStopped = true;\n        group.length === 1 && o.onCompleted();\n      }));\n      return group;\n    }, sources);\n  };\n\n  /**\n   * @deprecated use #mergeAll instead.\n   */\n  observableProto.mergeObservable = function () {\n    //deprecate('mergeObservable', 'mergeAll');\n    return this.mergeAll.apply(this, arguments);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n   * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n   */\n  observableProto.onErrorResumeNext = function (second) {\n    if (!second) { throw new Error('Second observable is required'); }\n    return onErrorResumeNext([this, second]);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   *\n   * @example\n   * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);\n   * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);\n   * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n   */\n  var onErrorResumeNext = Observable.onErrorResumeNext = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    }\n    return new AnonymousObservable(function (observer) {\n      var pos = 0, subscription = new SerialDisposable(),\n      cancelable = immediateScheduler.scheduleRecursive(function (self) {\n        var current, d;\n        if (pos < sources.length) {\n          current = sources[pos++];\n          isPromise(current) && (current = observableFromPromise(current));\n          d = new SingleAssignmentDisposable();\n          subscription.setDisposable(d);\n          d.setDisposable(current.subscribe(observer.onNext.bind(observer), self, self));\n        } else {\n          observer.onCompleted();\n        }\n      });\n      return new CompositeDisposable(subscription, cancelable);\n    });\n  };\n\n  /**\n   * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n   * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n   */\n  observableProto.skipUntil = function (other) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var isOpen = false;\n      var disposables = new CompositeDisposable(source.subscribe(function (left) {\n        isOpen && o.onNext(left);\n      }, function (e) { o.onError(e); }, function () {\n        isOpen && o.onCompleted();\n      }));\n\n      isPromise(other) && (other = observableFromPromise(other));\n\n      var rightSubscription = new SingleAssignmentDisposable();\n      disposables.add(rightSubscription);\n      rightSubscription.setDisposable(other.subscribe(function () {\n        isOpen = true;\n        rightSubscription.dispose();\n      }, function (e) { o.onError(e); }, function () {\n        rightSubscription.dispose();\n      }));\n\n      return disposables;\n    }, source);\n  };\n\n  /**\n   * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n   * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n   */\n  observableProto['switch'] = observableProto.switchLatest = function () {\n    var sources = this;\n    return new AnonymousObservable(function (observer) {\n      var hasLatest = false,\n        innerSubscription = new SerialDisposable(),\n        isStopped = false,\n        latest = 0,\n        subscription = sources.subscribe(\n          function (innerSource) {\n            var d = new SingleAssignmentDisposable(), id = ++latest;\n            hasLatest = true;\n            innerSubscription.setDisposable(d);\n\n            // Check if Promise or Observable\n            isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n\n            d.setDisposable(innerSource.subscribe(\n              function (x) { latest === id && observer.onNext(x); },\n              function (e) { latest === id && observer.onError(e); },\n              function () {\n                if (latest === id) {\n                  hasLatest = false;\n                  isStopped && observer.onCompleted();\n                }\n              }));\n          },\n          function (e) { observer.onError(e); },\n          function () {\n            isStopped = true;\n            !hasLatest && observer.onCompleted();\n          });\n      return new CompositeDisposable(subscription, innerSubscription);\n    }, sources);\n  };\n\n  /**\n   * Returns the values from the source observable sequence until the other observable sequence produces a value.\n   * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n   */\n  observableProto.takeUntil = function (other) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      isPromise(other) && (other = observableFromPromise(other));\n      return new CompositeDisposable(\n        source.subscribe(o),\n        other.subscribe(function () { o.onCompleted(); }, function (e) { o.onError(e); }, noop)\n      );\n    }, source);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n   *\n   * @example\n   * 1 - obs = obs1.withLatestFrom(obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = obs1.withLatestFrom([obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.withLatestFrom = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    var resultSelector = args.pop(), source = this;\n\n    if (typeof source === 'undefined') {\n      throw new Error('Source observable not found for withLatestFrom().');\n    }\n    if (typeof resultSelector !== 'function') {\n      throw new Error('withLatestFrom() expects a resultSelector function.');\n    }\n    if (Array.isArray(args[0])) {\n      args = args[0];\n    }\n\n    return new AnonymousObservable(function (observer) {\n      var falseFactory = function () { return false; },\n        n = args.length,\n        hasValue = arrayInitialize(n, falseFactory),\n        hasValueAll = false,\n        values = new Array(n);\n\n      var subscriptions = new Array(n + 1);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          var other = args[i], sad = new SingleAssignmentDisposable();\n          isPromise(other) && (other = observableFromPromise(other));\n          sad.setDisposable(other.subscribe(function (x) {\n            values[i] = x;\n            hasValue[i] = true;\n            hasValueAll = hasValue.every(identity);\n          }, observer.onError.bind(observer), function () {}));\n          subscriptions[i] = sad;\n        }(idx));\n      }\n\n      var sad = new SingleAssignmentDisposable();\n      sad.setDisposable(source.subscribe(function (x) {\n        var res;\n        var allValues = [x].concat(values);\n        if (!hasValueAll) return;\n        try {\n          res = resultSelector.apply(null, allValues);\n        } catch (ex) {\n          observer.onError(ex);\n          return;\n        }\n        observer.onNext(res);\n      }, observer.onError.bind(observer), function () {\n        observer.onCompleted();\n      }));\n      subscriptions[n] = sad;\n\n      return new CompositeDisposable(subscriptions);\n    }, this);\n  };\n\n  function zipArray(second, resultSelector) {\n    var first = this;\n    return new AnonymousObservable(function (observer) {\n      var index = 0, len = second.length;\n      return first.subscribe(function (left) {\n        if (index < len) {\n          var right = second[index++], result;\n          try {\n            result = resultSelector(left, right);\n          } catch (e) {\n            return observer.onError(e);\n          }\n          observer.onNext(result);\n        } else {\n          observer.onCompleted();\n        }\n      }, function (e) { observer.onError(e); }, function () { observer.onCompleted(); });\n    }, first);\n  }\n\n  function falseFactory() { return false; }\n  function emptyArrayFactory() { return []; }\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n   * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n   *\n   * @example\n   * 1 - res = obs1.zip(obs2, fn);\n   * 1 - res = x1.zip([1,2,3], fn);\n   * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n   */\n  observableProto.zip = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    if (Array.isArray(args[0])) { return zipArray.apply(this, args); }\n    var parent = this, resultSelector = args.pop();\n    args.unshift(parent);\n    return new AnonymousObservable(function (observer) {\n      var n = args.length,\n        queues = arrayInitialize(n, emptyArrayFactory),\n        isDone = arrayInitialize(n, falseFactory);\n\n      function next(i) {\n        var res, queuedValues;\n        if (queues.every(function (x) { return x.length > 0; })) {\n          try {\n            queuedValues = queues.map(function (x) { return x.shift(); });\n            res = resultSelector.apply(parent, queuedValues);\n          } catch (ex) {\n            observer.onError(ex);\n            return;\n          }\n          observer.onNext(res);\n        } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n          observer.onCompleted();\n        }\n      };\n\n      function done(i) {\n        isDone[i] = true;\n        if (isDone.every(function (x) { return x; })) {\n          observer.onCompleted();\n        }\n      }\n\n      var subscriptions = new Array(n);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          var source = args[i], sad = new SingleAssignmentDisposable();\n          isPromise(source) && (source = observableFromPromise(source));\n          sad.setDisposable(source.subscribe(function (x) {\n            queues[i].push(x);\n            next(i);\n          }, function (e) { observer.onError(e); }, function () {\n            done(i);\n          }));\n          subscriptions[i] = sad;\n        })(idx);\n      }\n\n      return new CompositeDisposable(subscriptions);\n    }, parent);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n   * @param arguments Observable sources.\n   * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  Observable.zip = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    var first = args.shift();\n    return first.zip.apply(first, args);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n   * @param arguments Observable sources.\n   * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n   */\n  Observable.zipArray = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    }\n    return new AnonymousObservable(function (observer) {\n      var n = sources.length,\n        queues = arrayInitialize(n, function () { return []; }),\n        isDone = arrayInitialize(n, function () { return false; });\n\n      function next(i) {\n        if (queues.every(function (x) { return x.length > 0; })) {\n          var res = queues.map(function (x) { return x.shift(); });\n          observer.onNext(res);\n        } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n          observer.onCompleted();\n          return;\n        }\n      };\n\n      function done(i) {\n        isDone[i] = true;\n        if (isDone.every(identity)) {\n          observer.onCompleted();\n          return;\n        }\n      }\n\n      var subscriptions = new Array(n);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          subscriptions[i] = new SingleAssignmentDisposable();\n          subscriptions[i].setDisposable(sources[i].subscribe(function (x) {\n            queues[i].push(x);\n            next(i);\n          }, function (e) { observer.onError(e); }, function () {\n            done(i);\n          }));\n        })(idx);\n      }\n\n      return new CompositeDisposable(subscriptions);\n    });\n  };\n\n  /**\n   *  Hides the identity of an observable sequence.\n   * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n   */\n  observableProto.asObservable = function () {\n    var source = this;\n    return new AnonymousObservable(function (o) { return source.subscribe(o); }, this);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n   *\n   * @example\n   *  var res = xs.bufferWithCount(10);\n   *  var res = xs.bufferWithCount(10, 1);\n   * @param {Number} count Length of each buffer.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithCount = function (count, skip) {\n    if (typeof skip !== 'number') {\n      skip = count;\n    }\n    return this.windowWithCount(count, skip).selectMany(function (x) {\n      return x.toArray();\n    }).where(function (x) {\n      return x.length > 0;\n    });\n  };\n\n  /**\n   * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n   * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n   */\n  observableProto.dematerialize = function () {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(function (x) { return x.accept(o); }, function(e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, this);\n  };\n\n  /**\n   *  Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.\n   *\n   *  var obs = observable.distinctUntilChanged();\n   *  var obs = observable.distinctUntilChanged(function (x) { return x.id; });\n   *  var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; });\n   *\n   * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value.\n   * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n   * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinctUntilChanged = function (keySelector, comparer) {\n    var source = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var hasCurrentKey = false, currentKey;\n      return source.subscribe(function (value) {\n        var key = value;\n        if (keySelector) {\n          try {\n            key = keySelector(value);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        if (hasCurrentKey) {\n          try {\n            var comparerEquals = comparer(currentKey, key);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        if (!hasCurrentKey || !comparerEquals) {\n          hasCurrentKey = true;\n          currentKey = key;\n          o.onNext(value);\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, this);\n  };\n\n  /**\n   *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n   * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n   * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto['do'] = observableProto.tap = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) {\n    var source = this, tapObserver = typeof observerOrOnNext === 'function' || typeof observerOrOnNext === 'undefined'?\n      observerCreate(observerOrOnNext || noop, onError || noop, onCompleted || noop) :\n      observerOrOnNext;\n    return new AnonymousObservable(function (observer) {\n      return source.subscribe(function (x) {\n        try {\n          tapObserver.onNext(x);\n        } catch (e) {\n          observer.onError(e);\n        }\n        observer.onNext(x);\n      }, function (err) {\n          try {\n            tapObserver.onError(err);\n          } catch (e) {\n            observer.onError(e);\n          }\n        observer.onError(err);\n      }, function () {\n        try {\n          tapObserver.onCompleted();\n        } catch (e) {\n          observer.onError(e);\n        }\n        observer.onCompleted();\n      });\n    }, this);\n  };\n\n  /**\n   *  Invokes an action for each element in the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function} onNext Action to invoke for each element in the observable sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto.doOnNext = observableProto.tapOnNext = function (onNext, thisArg) {\n    return this.tap(typeof thisArg !== 'undefined' ? function (x) { onNext.call(thisArg, x); } : onNext);\n  };\n\n  /**\n   *  Invokes an action upon exceptional termination of the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto.doOnError = observableProto.tapOnError = function (onError, thisArg) {\n    return this.tap(noop, typeof thisArg !== 'undefined' ? function (e) { onError.call(thisArg, e); } : onError);\n  };\n\n  /**\n   *  Invokes an action upon graceful termination of the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto.doOnCompleted = observableProto.tapOnCompleted = function (onCompleted, thisArg) {\n    return this.tap(noop, null, typeof thisArg !== 'undefined' ? function () { onCompleted.call(thisArg); } : onCompleted);\n  };\n\n  /**\n   *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n   * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n   * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n   */\n  observableProto['finally'] = observableProto.ensure = function (action) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var subscription;\n      try {\n        subscription = source.subscribe(observer);\n      } catch (e) {\n        action();\n        throw e;\n      }\n      return disposableCreate(function () {\n        try {\n          subscription.dispose();\n        } catch (e) {\n          throw e;\n        } finally {\n          action();\n        }\n      });\n    }, this);\n  };\n\n  /**\n   * @deprecated use #finally or #ensure instead.\n   */\n  observableProto.finallyAction = function (action) {\n    //deprecate('finallyAction', 'finally or ensure');\n    return this.ensure(action);\n  };\n\n  /**\n   *  Ignores all elements in an observable sequence leaving only the termination messages.\n   * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n   */\n  observableProto.ignoreElements = function () {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(noop, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n   * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n   */\n  observableProto.materialize = function () {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      return source.subscribe(function (value) {\n        observer.onNext(notificationCreateOnNext(value));\n      }, function (e) {\n        observer.onNext(notificationCreateOnError(e));\n        observer.onCompleted();\n      }, function () {\n        observer.onNext(notificationCreateOnCompleted());\n        observer.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n   * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n   * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n   */\n  observableProto.repeat = function (repeatCount) {\n    return enumerableRepeat(this, repeatCount).concat();\n  };\n\n  /**\n   *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n   *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n   *\n   * @example\n   *  var res = retried = retry.repeat();\n   *  var res = retried = retry.repeat(2);\n   * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retry = function (retryCount) {\n    return enumerableRepeat(this, retryCount).catchError();\n  };\n\n  /**\n   *  Repeats the source observable sequence upon error each time the notifier emits or until it successfully terminates. \n   *  if the notifier completes, the observable sequence completes.\n   *\n   * @example\n   *  var timer = Observable.timer(500);\n   *  var source = observable.retryWhen(timer);\n   * @param {Observable} [notifier] An observable that triggers the retries or completes the observable with onNext or onCompleted respectively.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retryWhen = function (notifier) {\n    return enumerableRepeat(this).catchErrorWhen(notifier);\n  };\n  /**\n   *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n   *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n   * @example\n   *  var res = source.scan(function (acc, x) { return acc + x; });\n   *  var res = source.scan(0, function (acc, x) { return acc + x; });\n   * @param {Mixed} [seed] The initial accumulator value.\n   * @param {Function} accumulator An accumulator function to be invoked on each element.\n   * @returns {Observable} An observable sequence containing the accumulated values.\n   */\n  observableProto.scan = function () {\n    var hasSeed = false, seed, accumulator, source = this;\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[0];\n      accumulator = arguments[1];\n    } else {\n      accumulator = arguments[0];\n    }\n    return new AnonymousObservable(function (o) {\n      var hasAccumulation, accumulation, hasValue;\n      return source.subscribe (\n        function (x) {\n          !hasValue && (hasValue = true);\n          try {\n            if (hasAccumulation) {\n              accumulation = accumulator(accumulation, x);\n            } else {\n              accumulation = hasSeed ? accumulator(seed, x) : x;\n              hasAccumulation = true;\n            }\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n\n          o.onNext(accumulation);\n        },\n        function (e) { o.onError(e); },\n        function () {\n          !hasValue && hasSeed && o.onNext(seed);\n          o.onCompleted();\n        }\n      );\n    }, source);\n  };\n\n  /**\n   *  Bypasses a specified number of elements at the end of an observable sequence.\n   * @description\n   *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n   *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n   * @param count Number of elements to bypass at the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n   */\n  observableProto.skipLast = function (count) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        q.push(x);\n        q.length > count && o.onNext(q.shift());\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n   *  @example\n   *  var res = source.startWith(1, 2, 3);\n   *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n   * @param {Arguments} args The specified values to prepend to the observable sequence\n   * @returns {Observable} The source sequence prepended with the specified values.\n   */\n  observableProto.startWith = function () {\n    var values, scheduler, start = 0;\n    if (!!arguments.length && isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      start = 1;\n    } else {\n      scheduler = immediateScheduler;\n    }\n    for(var args = [], i = start, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return enumerableOf([observableFromArray(args, scheduler), this]).concat();\n  };\n\n  /**\n   *  Returns a specified number of contiguous elements from the end of an observable sequence.\n   * @description\n   *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n   *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLast = function (count) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        q.push(x);\n        q.length > count && q.shift();\n      }, function (e) { o.onError(e); }, function () {\n        while (q.length > 0) { o.onNext(q.shift()); }\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n   *\n   * @description\n   *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n   *  source sequence, this buffer is produced on the result sequence.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLastBuffer = function (count) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        q.push(x);\n        q.length > count && q.shift();\n      }, function (e) { o.onError(e); }, function () {\n        o.onNext(q);\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n   *\n   *  var res = xs.windowWithCount(10);\n   *  var res = xs.windowWithCount(10, 1);\n   * @param {Number} count Length of each window.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithCount = function (count, skip) {\n    var source = this;\n    +count || (count = 0);\n    Math.abs(count) === Infinity && (count = 0);\n    if (count <= 0) { throw new Error(argumentOutOfRange); }\n    skip == null && (skip = count);\n    +skip || (skip = 0);\n    Math.abs(skip) === Infinity && (skip = 0);\n\n    if (skip <= 0) { throw new Error(argumentOutOfRange); }\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(),\n        refCountDisposable = new RefCountDisposable(m),\n        n = 0,\n        q = [];\n\n      function createWindow () {\n        var s = new Subject();\n        q.push(s);\n        observer.onNext(addRef(s, refCountDisposable));\n      }\n\n      createWindow();\n\n      m.setDisposable(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n          var c = n - count + 1;\n          c >= 0 && c % skip === 0 && q.shift().onCompleted();\n          ++n % skip === 0 && createWindow();\n        },\n        function (e) {\n          while (q.length > 0) { q.shift().onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          while (q.length > 0) { q.shift().onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  function concatMap(source, selector, thisArg) {\n    var selectorFunc = bindCallback(selector, thisArg, 3);\n    return source.map(function (x, i) {\n      var result = selectorFunc(x, i, source);\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));\n      return result;\n    }).concatAll();\n  }\n\n  /**\n   *  One of the Following:\n   *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   * @example\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n   *  Or:\n   *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n   *\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n   *  Or:\n   *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n   * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n   * source sequence onto which could be either an observable or Promise.\n   * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n   */\n  observableProto.selectConcat = observableProto.concatMap = function (selector, resultSelector, thisArg) {\n    if (isFunction(selector) && isFunction(resultSelector)) {\n      return this.concatMap(function (x, i) {\n        var selectorResult = selector(x, i);\n        isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));\n        (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));\n\n        return selectorResult.map(function (y, i2) {\n          return resultSelector(x, y, i, i2);\n        });\n      });\n    }\n    return isFunction(selector) ?\n      concatMap(this, selector, thisArg) :\n      concatMap(this, function () { return selector; });\n  };\n\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.concatMapObserver = observableProto.selectConcatObserver = function(onNext, onError, onCompleted, thisArg) {\n    var source = this,\n        onNextFunc = bindCallback(onNext, thisArg, 2),\n        onErrorFunc = bindCallback(onError, thisArg, 1),\n        onCompletedFunc = bindCallback(onCompleted, thisArg, 0);\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNextFunc(x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onErrorFunc(err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompletedFunc();\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, this).concatAll();\n  };\n\n    /**\n     *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n     *\n     *  var res = obs = xs.defaultIfEmpty();\n     *  2 - obs = xs.defaultIfEmpty(false);\n     *\n     * @memberOf Observable#\n     * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n     * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n     */\n    observableProto.defaultIfEmpty = function (defaultValue) {\n      var source = this;\n      defaultValue === undefined && (defaultValue = null);\n      return new AnonymousObservable(function (observer) {\n        var found = false;\n        return source.subscribe(function (x) {\n          found = true;\n          observer.onNext(x);\n        },\n        function (e) { observer.onError(e); }, \n        function () {\n          !found && observer.onNext(defaultValue);\n          observer.onCompleted();\n        });\n      }, source);\n    };\n\n  // Swap out for Array.findIndex\n  function arrayIndexOfComparer(array, item, comparer) {\n    for (var i = 0, len = array.length; i < len; i++) {\n      if (comparer(array[i], item)) { return i; }\n    }\n    return -1;\n  }\n\n  function HashSet(comparer) {\n    this.comparer = comparer;\n    this.set = [];\n  }\n  HashSet.prototype.push = function(value) {\n    var retValue = arrayIndexOfComparer(this.set, value, this.comparer) === -1;\n    retValue && this.set.push(value);\n    return retValue;\n  };\n\n  /**\n   *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n   *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n   *\n   * @example\n   *  var res = obs = xs.distinct();\n   *  2 - obs = xs.distinct(function (x) { return x.id; });\n   *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n   * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n   * @param {Function} [comparer]  Used to compare items in the collection.\n   * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinct = function (keySelector, comparer) {\n    var source = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var hashSet = new HashSet(comparer);\n      return source.subscribe(function (x) {\n        var key = x;\n\n        if (keySelector) {\n          try {\n            key = keySelector(x);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        hashSet.push(key) && o.onNext(x);\n      },\n      function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, this);\n  };\n\n  var MapObservable = (function (__super__) {\n    inherits(MapObservable, __super__);\n\n    function MapObservable(source, selector, thisArg) {\n      this.source = source;\n      this.selector = bindCallback(selector, thisArg, 3);\n      __super__.call(this);\n    }\n\n    MapObservable.prototype.internalMap = function (selector, thisArg) {\n      var self = this;\n      return new MapObservable(this.source, function (x, i, o) { return selector(self.selector(x, i, o), i, o); }, thisArg)\n    };\n\n    MapObservable.prototype.subscribeCore = function (observer) {\n      return this.source.subscribe(new MapObserver(observer, this.selector, this));\n    };\n\n    return MapObservable;\n\n  }(ObservableBase));\n\n  function MapObserver(observer, selector, source) {\n    this.observer = observer;\n    this.selector = selector;\n    this.source = source;\n    this.index = 0;\n    this.isStopped = false;\n  }\n\n  MapObserver.prototype.onNext = function(x) {\n    if (this.isStopped) { return; }\n    try {\n      var result = this.selector(x, this.index++, this.source);\n    } catch(e) {\n      return this.observer.onError(e);\n    }\n    this.observer.onNext(result);\n  };\n  MapObserver.prototype.onError = function (e) {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onError(e); }\n  };\n  MapObserver.prototype.onCompleted = function () {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onCompleted(); }\n  };\n  MapObserver.prototype.dispose = function() { this.isStopped = true; };\n  MapObserver.prototype.fail = function (e) {\n    if (!this.isStopped) {\n      this.isStopped = true;\n      this.observer.onError(e);\n      return true;\n    }\n\n    return false;\n  };\n\n  /**\n  * Projects each element of an observable sequence into a new form by incorporating the element's index.\n  * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n  */\n  observableProto.map = observableProto.select = function (selector, thisArg) {\n    var selectorFn = typeof selector === 'function' ? selector : function () { return selector; };\n    return this instanceof MapObservable ?\n      this.internalMap(selector, thisArg) :\n      new MapObservable(this, selectorFn, thisArg);\n  };\n\n  /**\n   * Retrieves the value of a specified nested property from all elements in\n   * the Observable sequence.\n   * @param {Arguments} arguments The nested properties to pluck.\n   * @returns {Observable} Returns a new Observable sequence of property values.\n   */\n  observableProto.pluck = function () {\n    var args = arguments, len = arguments.length;\n    if (len === 0) { throw new Error('List of properties cannot be empty.'); }\n    return this.map(function (x) {\n      var currentProp = x;\n      for (var i = 0; i < len; i++) {\n        var p = currentProp[args[i]];\n        if (typeof p !== 'undefined') {\n          currentProp = p;\n        } else {\n          return undefined;\n        }\n      }\n      return currentProp;\n    });\n  };\n\n  /**\n   * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n   * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n   * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n   * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n   */\n  observableProto.flatMapObserver = observableProto.selectManyObserver = function (onNext, onError, onCompleted, thisArg) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var index = 0;\n\n      return source.subscribe(\n        function (x) {\n          var result;\n          try {\n            result = onNext.call(thisArg, x, index++);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n        },\n        function (err) {\n          var result;\n          try {\n            result = onError.call(thisArg, err);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        },\n        function () {\n          var result;\n          try {\n            result = onCompleted.call(thisArg);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n          isPromise(result) && (result = observableFromPromise(result));\n          observer.onNext(result);\n          observer.onCompleted();\n        });\n    }, source).mergeAll();\n  };\n\n  function flatMap(source, selector, thisArg) {\n    var selectorFunc = bindCallback(selector, thisArg, 3);\n    return source.map(function (x, i) {\n      var result = selectorFunc(x, i, source);\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));\n      return result;\n    }).mergeAll();\n  }\n\n  /**\n   *  One of the Following:\n   *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   * @example\n   *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n   *  Or:\n   *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n   *\n   *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n   *  Or:\n   *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n   * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n   * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n   */\n  observableProto.selectMany = observableProto.flatMap = function (selector, resultSelector, thisArg) {\n    if (isFunction(selector) && isFunction(resultSelector)) {\n      return this.flatMap(function (x, i) {\n        var selectorResult = selector(x, i);\n        isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));\n        (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));\n\n        return selectorResult.map(function (y, i2) {\n          return resultSelector(x, y, i, i2);\n        });\n      }, thisArg);\n    }\n    return isFunction(selector) ?\n      flatMap(this, selector, thisArg) :\n      flatMap(this, function () { return selector; });\n  };\n\n  /**\n   *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n   *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n   * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n   *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n   */\n  observableProto.selectSwitch = observableProto.flatMapLatest = observableProto.switchMap = function (selector, thisArg) {\n    return this.select(selector, thisArg).switchLatest();\n  };\n\n  /**\n   * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n   * @param {Number} count The number of elements to skip before returning the remaining elements.\n   * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n   */\n  observableProto.skip = function (count) {\n    if (count < 0) { throw new Error(argumentOutOfRange); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var remaining = count;\n      return source.subscribe(function (x) {\n        if (remaining <= 0) {\n          o.onNext(x);\n        } else {\n          remaining--;\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n   *  The element's index is used in the logic of the predicate function.\n   *\n   *  var res = source.skipWhile(function (value) { return value < 10; });\n   *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n   */\n  observableProto.skipWhile = function (predicate, thisArg) {\n    var source = this,\n        callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      var i = 0, running = false;\n      return source.subscribe(function (x) {\n        if (!running) {\n          try {\n            running = !callback(x, i++, source);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        running && o.onNext(x);\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n   *\n   *  var res = source.take(5);\n   *  var res = source.take(0, Rx.Scheduler.timeout);\n   * @param {Number} count The number of elements to return.\n   * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n   * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n   */\n  observableProto.take = function (count, scheduler) {\n    if (count < 0) { throw new RangeError(argumentOutOfRange); }\n    if (count === 0) { return observableEmpty(scheduler); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var remaining = count;\n      return source.subscribe(function (x) {\n        if (remaining-- > 0) {\n          o.onNext(x);\n          remaining === 0 && o.onCompleted();\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Returns elements from an observable sequence as long as a specified condition is true.\n   *  The element's index is used in the logic of the predicate function.\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n   */\n  observableProto.takeWhile = function (predicate, thisArg) {\n    var source = this,\n        callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      var i = 0, running = true;\n      return source.subscribe(function (x) {\n        if (running) {\n          try {\n            running = callback(x, i++, source);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n          if (running) {\n            o.onNext(x);\n          } else {\n            o.onCompleted();\n          }\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  var FilterObservable = (function (__super__) {\n    inherits(FilterObservable, __super__);\n\n    function FilterObservable(source, predicate, thisArg) {\n      this.source = source;\n      this.predicate = bindCallback(predicate, thisArg, 3);\n      __super__.call(this);\n    }\n\n    FilterObservable.prototype.subscribeCore = function (observer) {\n      return this.source.subscribe(new FilterObserver(observer, this.predicate, this));\n    };\n\n    FilterObservable.prototype.internalFilter = function(predicate, thisArg) {\n      var self = this;\n      return new FilterObservable(this.source, function(x, i, o) { return self.predicate(x, i, o) && predicate(x, i, o); }, thisArg);\n    };\n\n    return FilterObservable;\n\n  }(ObservableBase));\n\n  function FilterObserver(observer, predicate, source) {\n    this.observer = observer;\n    this.predicate = predicate;\n    this.source = source;\n    this.index = 0;\n    this.isStopped = false;\n  }\n\n  FilterObserver.prototype.onNext = function(x) {\n    try {\n      var shouldYield = this.predicate(x, this.index++, this.source);\n    } catch(e) {\n      return this.observer.onError(e);\n    }\n    shouldYield && this.observer.onNext(x);\n  };\n\n  FilterObserver.prototype.onError = function (e) {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onError(e); }\n  };\n  FilterObserver.prototype.onCompleted = function () {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onCompleted(); }\n  };\n  FilterObserver.prototype.dispose = function() { this.isStopped = true; };\n  FilterObserver.prototype.fail = function (e) {\n    if (!this.isStopped) {\n      this.isStopped = true;\n      this.observer.onError(e);\n      return true;\n    }\n\n    return false;\n  };\n\n\n\n  /**\n  *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n  * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n  */\n  observableProto.filter = observableProto.where = function (predicate, thisArg) {\n    return this instanceof FilterObservable ? this.internalFilter(predicate, thisArg) :\n      new FilterObservable(this, predicate, thisArg);\n  };\n\n  /**\n   * Executes a transducer to transform the observable sequence\n   * @param {Transducer} transducer A transducer to execute\n   * @returns {Observable} An Observable sequence containing the results from the transducer.\n   */\n  observableProto.transduce = function(transducer) {\n    var source = this;\n\n    function transformForObserver(observer) {\n      return {\n        init: function() {\n          return observer;\n        },\n        step: function(obs, input) {\n          return obs.onNext(input);\n        },\n        result: function(obs) {\n          return obs.onCompleted();\n        }\n      };\n    }\n\n    return new AnonymousObservable(function(observer) {\n      var xform = transducer(transformForObserver(observer));\n      return source.subscribe(\n        function(v) {\n          try {\n            xform.step(observer, v);\n          } catch (e) {\n            observer.onError(e);\n          }\n        },\n        observer.onError.bind(observer),\n        function() { xform.result(observer); }\n      );\n    }, source);\n  };\n\n  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {\n    inherits(AnonymousObservable, __super__);\n\n    // Fix subscriber to check for undefined or function returned to decorate as Disposable\n    function fixSubscriber(subscriber) {\n      if (subscriber && typeof subscriber.dispose === 'function') { return subscriber; }\n\n      return typeof subscriber === 'function' ?\n        disposableCreate(subscriber) :\n        disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], subscribe = state[1];\n      try {\n        ado.setDisposable(fixSubscriber(subscribe(ado)));\n      } catch (e) {\n        if (!ado.fail(e)) { throw e; }\n      }\n    }\n\n    function AnonymousObservable(subscribe, parent) {\n      this.source = parent;\n\n      function s(observer) {\n\n        var ado = new AutoDetachObserver(observer), state = [ado, subscribe];\n\n        if (currentThreadScheduler.scheduleRequired()) {\n          currentThreadScheduler.scheduleWithState(state, setDisposable);\n        } else {\n          setDisposable(null, state);\n        }\n\n        return ado;\n      }\n\n      __super__.call(this, s);\n    }\n\n    return AnonymousObservable;\n\n  }(Observable));\n\n  var AutoDetachObserver = (function (__super__) {\n    inherits(AutoDetachObserver, __super__);\n\n    function AutoDetachObserver(observer) {\n      __super__.call(this);\n      this.observer = observer;\n      this.m = new SingleAssignmentDisposable();\n    }\n\n    var AutoDetachObserverPrototype = AutoDetachObserver.prototype;\n\n    AutoDetachObserverPrototype.next = function (value) {\n      var noError = false;\n      try {\n        this.observer.onNext(value);\n        noError = true;\n      } catch (e) {\n        throw e;\n      } finally {\n        !noError && this.dispose();\n      }\n    };\n\n    AutoDetachObserverPrototype.error = function (err) {\n      try {\n        this.observer.onError(err);\n      } catch (e) {\n        throw e;\n      } finally {\n        this.dispose();\n      }\n    };\n\n    AutoDetachObserverPrototype.completed = function () {\n      try {\n        this.observer.onCompleted();\n      } catch (e) {\n        throw e;\n      } finally {\n        this.dispose();\n      }\n    };\n\n    AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };\n    AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };\n\n    AutoDetachObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.m.dispose();\n    };\n\n    return AutoDetachObserver;\n  }(AbstractObserver));\n\n  var InnerSubscription = function (subject, observer) {\n    this.subject = subject;\n    this.observer = observer;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this.subject.isDisposed && this.observer !== null) {\n      var idx = this.subject.observers.indexOf(this.observer);\n      this.subject.observers.splice(idx, 1);\n      this.observer = null;\n    }\n  };\n\n  /**\n   *  Represents an object that is both an observable sequence as well as an observer.\n   *  Each notification is broadcasted to all subscribed observers.\n   */\n  var Subject = Rx.Subject = (function (__super__) {\n    function subscribe(observer) {\n      checkDisposed(this);\n      if (!this.isStopped) {\n        this.observers.push(observer);\n        return new InnerSubscription(this, observer);\n      }\n      if (this.hasError) {\n        observer.onError(this.error);\n        return disposableEmpty;\n      }\n      observer.onCompleted();\n      return disposableEmpty;\n    }\n\n    inherits(Subject, __super__);\n\n    /**\n     * Creates a subject.\n     */\n    function Subject() {\n      __super__.call(this, subscribe);\n      this.isDisposed = false,\n      this.isStopped = false,\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(Subject.prototype, Observer.prototype, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onCompleted();\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.error = error;\n          this.hasError = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onNext(value);\n          }\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    /**\n     * Creates a subject from the specified observer and observable.\n     * @param {Observer} observer The observer used to send messages to the subject.\n     * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n     * @returns {Subject} Subject implemented using the given observer and observable.\n     */\n    Subject.create = function (observer, observable) {\n      return new AnonymousSubject(observer, observable);\n    };\n\n    return Subject;\n  }(Observable));\n\n  /**\n   *  Represents the result of an asynchronous operation.\n   *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n   */\n  var AsyncSubject = Rx.AsyncSubject = (function (__super__) {\n\n    function subscribe(observer) {\n      checkDisposed(this);\n\n      if (!this.isStopped) {\n        this.observers.push(observer);\n        return new InnerSubscription(this, observer);\n      }\n\n      if (this.hasError) {\n        observer.onError(this.error);\n      } else if (this.hasValue) {\n        observer.onNext(this.value);\n        observer.onCompleted();\n      } else {\n        observer.onCompleted();\n      }\n\n      return disposableEmpty;\n    }\n\n    inherits(AsyncSubject, __super__);\n\n    /**\n     * Creates a subject that can only receive one value and that value is cached for all future observations.\n     * @constructor\n     */\n    function AsyncSubject() {\n      __super__.call(this, subscribe);\n\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasValue = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(AsyncSubject.prototype, Observer, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () {\n        checkDisposed(this);\n        return this.observers.length > 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n       */\n      onCompleted: function () {\n        var i, len;\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          var os = cloneArray(this.observers), len = os.length;\n\n          if (this.hasValue) {\n            for (i = 0; i < len; i++) {\n              var o = os[i];\n              o.onNext(this.value);\n              o.onCompleted();\n            }\n          } else {\n            for (i = 0; i < len; i++) {\n              os[i].onCompleted();\n            }\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the error.\n       * @param {Mixed} error The Error to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.hasError = true;\n          this.error = error;\n\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n       * @param {Mixed} value The value to store in the subject.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        this.hasValue = true;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.exception = null;\n        this.value = null;\n      }\n    });\n\n    return AsyncSubject;\n  }(Observable));\n\n  var AnonymousSubject = Rx.AnonymousSubject = (function (__super__) {\n    inherits(AnonymousSubject, __super__);\n\n    function subscribe(observer) {\n      return this.observable.subscribe(observer);\n    }\n\n    function AnonymousSubject(observer, observable) {\n      this.observer = observer;\n      this.observable = observable;\n      __super__.call(this, subscribe);\n    }\n\n    addProperties(AnonymousSubject.prototype, Observer.prototype, {\n      onCompleted: function () {\n        this.observer.onCompleted();\n      },\n      onError: function (error) {\n        this.observer.onError(error);\n      },\n      onNext: function (value) {\n        this.observer.onNext(value);\n      }\n    });\n\n    return AnonymousSubject;\n  }(Observable));\n\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    root.Rx = Rx;\n\n    define(function() {\n      return Rx;\n    });\n  } else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = Rx).Rx = Rx;\n    } else {\n      freeExports.Rx = Rx;\n    }\n  } else {\n    // in a browser or Rhino\n    root.Rx = Rx;\n  }\n\n  // All code before this point will be filtered from stack traces.\n  var rEndingLine = captureLine();\n\n}.call(this));\n"
  },
  {
    "path": "tests/perf/old/rx.lite.compat.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n;(function (undefined) {\n\n  var objectTypes = {\n    'boolean': false,\n    'function': true,\n    'object': true,\n    'number': false,\n    'string': false,\n    'undefined': false\n  };\n\n  var root = (objectTypes[typeof window] && window) || this,\n    freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n    freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n    moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n    freeGlobal = objectTypes[typeof global] && global;\n\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n    root = freeGlobal;\n  }\n\n  var Rx = {\n      internals: {},\n      config: {\n        Promise: root.Promise\n      },\n      helpers: { }\n  };\n\n  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    notDefined = Rx.helpers.notDefined = function (x) { return typeof x === 'undefined'; },\n    isScheduler = Rx.helpers.isScheduler = function (x) { return x instanceof Rx.Scheduler; },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    pluck = Rx.helpers.pluck = function (property) { return function (x) { return x[property]; }; },\n    just = Rx.helpers.just = function (value) { return function () { return value; }; },\n    defaultNow = Rx.helpers.defaultNow = (function () { return !!Date.now ? Date.now : function () { return +new Date; }; }()),\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.then === 'function'; },\n    asArray = Rx.helpers.asArray = function () { return Array.prototype.slice.call(arguments); },\n    not = Rx.helpers.not = function (a) { return !a; },\n    isFunction = Rx.helpers.isFunction = (function () {\n\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      }\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n\n      return isFn;\n    }());\n\n  // Errors\n  var sequenceContainsNoElements = 'Sequence contains no elements.';\n  var argumentOutOfRange = 'Argument out of range';\n  var objectDisposed = 'Object has been disposed';\n  function checkDisposed(self) { if (self.isDisposed) { throw new Error(objectDisposed); } }\n  function cloneArray(arr) { for(var a = [], i = 0, len = arr.length; i < len; i++) { a.push(arr[i]); } return a;}\n\n  Rx.config.longStackSupport = false;\n  var hasStacks = false;\n  try {\n    throw new Error();\n  } catch (e) {\n    hasStacks = !!e.stack;\n  }\n\n  // All code after this point will be filtered from stack traces reported by RxJS\n  var rStartingLine = captureLine(), rFileName;\n\n  var STACK_JUMP_SEPARATOR = \"From previous event:\";\n\n  function makeStackTraceLong(error, observable) {\n      // If possible, transform the error stack trace by removing Node and RxJS\n      // cruft, then concatenating with the stack trace of `observable`.\n      if (hasStacks &&\n          observable.stack &&\n          typeof error === \"object\" &&\n          error !== null &&\n          error.stack &&\n          error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n      ) {\n        var stacks = [];\n        for (var o = observable; !!o; o = o.source) {\n          if (o.stack) {\n            stacks.unshift(o.stack);\n          }\n        }\n        stacks.unshift(error.stack);\n\n        var concatedStacks = stacks.join(\"\\n\" + STACK_JUMP_SEPARATOR + \"\\n\");\n        error.stack = filterStackString(concatedStacks);\n    }\n  }\n\n  function filterStackString(stackString) {\n    var lines = stackString.split(\"\\n\"),\n        desiredLines = [];\n    for (var i = 0, len = lines.length; i < len; i++) {\n      var line = lines[i];\n\n      if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n        desiredLines.push(line);\n      }\n    }\n    return desiredLines.join(\"\\n\");\n  }\n\n  function isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n    if (!fileNameAndLineNumber) {\n      return false;\n    }\n    var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === rFileName &&\n      lineNumber >= rStartingLine &&\n      lineNumber <= rEndingLine;\n  }\n\n  function isNodeFrame(stackLine) {\n    return stackLine.indexOf(\"(module.js:\") !== -1 ||\n      stackLine.indexOf(\"(node.js:\") !== -1;\n  }\n\n  function captureLine() {\n    if (!hasStacks) { return; }\n\n    try {\n      throw new Error();\n    } catch (e) {\n      var lines = e.stack.split(\"\\n\");\n      var firstLine = lines[0].indexOf(\"@\") > 0 ? lines[1] : lines[2];\n      var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n      if (!fileNameAndLineNumber) { return; }\n\n      rFileName = fileNameAndLineNumber[0];\n      return fileNameAndLineNumber[1];\n    }\n  }\n\n  function getFileNameAndLineNumber(stackLine) {\n    // Named functions: \"at functionName (filename:lineNumber:columnNumber)\"\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }\n\n    // Anonymous functions: \"at filename:lineNumber:columnNumber\"\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }\n\n    // Firefox style: \"function@filename:lineNumber or @filename:lineNumber\"\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }\n  }\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o[$iterator$] !== undefined;\n  }\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  }\n\n  Rx.helpers.iterator = $iterator$;\n\n  var bindCallback = Rx.internals.bindCallback = function (func, thisArg, argCount) {\n    if (typeof thisArg === 'undefined') { return func; }\n    switch(argCount) {\n      case 0:\n        return function() {\n          return func.call(thisArg)\n        };\n      case 1:\n        return function(arg) {\n          return func.call(thisArg, arg);\n        }\n      case 2:\n        return function(value, index) {\n          return func.call(thisArg, value, index);\n        };\n      case 3:\n        return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n    }\n\n    return function() {\n      return func.apply(thisArg, arguments);\n    };\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var dontEnums = ['toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'],\n  dontEnumsLength = dontEnums.length;\n\n  /** `Object#toString` result shortcuts */\n  var argsClass = '[object Arguments]',\n    arrayClass = '[object Array]',\n    boolClass = '[object Boolean]',\n    dateClass = '[object Date]',\n    errorClass = '[object Error]',\n    funcClass = '[object Function]',\n    numberClass = '[object Number]',\n    objectClass = '[object Object]',\n    regexpClass = '[object RegExp]',\n    stringClass = '[object String]';\n\n  var toString = Object.prototype.toString,\n    hasOwnProperty = Object.prototype.hasOwnProperty,\n    supportsArgsClass = toString.call(arguments) == argsClass, // For less <IE9 && FF<4\n    supportNodeClass,\n    errorProto = Error.prototype,\n    objectProto = Object.prototype,\n    stringProto = String.prototype,\n    propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n  try {\n    supportNodeClass = !(toString.call(document) == objectClass && !({ 'toString': 0 } + ''));\n  } catch (e) {\n    supportNodeClass = true;\n  }\n\n  var nonEnumProps = {};\n  nonEnumProps[arrayClass] = nonEnumProps[dateClass] = nonEnumProps[numberClass] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true };\n  nonEnumProps[boolClass] = nonEnumProps[stringClass] = { 'constructor': true, 'toString': true, 'valueOf': true };\n  nonEnumProps[errorClass] = nonEnumProps[funcClass] = nonEnumProps[regexpClass] = { 'constructor': true, 'toString': true };\n  nonEnumProps[objectClass] = { 'constructor': true };\n\n  var support = {};\n  (function () {\n    var ctor = function() { this.x = 1; },\n      props = [];\n\n    ctor.prototype = { 'valueOf': 1, 'y': 1 };\n    for (var key in new ctor) { props.push(key); }\n    for (key in arguments) { }\n\n    // Detect if `name` or `message` properties of `Error.prototype` are enumerable by default.\n    support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') || propertyIsEnumerable.call(errorProto, 'name');\n\n    // Detect if `prototype` properties are enumerable by default.\n    support.enumPrototypes = propertyIsEnumerable.call(ctor, 'prototype');\n\n    // Detect if `arguments` object indexes are non-enumerable\n    support.nonEnumArgs = key != 0;\n\n    // Detect if properties shadowing those on `Object.prototype` are non-enumerable.\n    support.nonEnumShadows = !/valueOf/.test(props);\n  }(1));\n\n  var isObject = Rx.internals.isObject = function(value) {\n    var type = typeof value;\n    return value && (type == 'function' || type == 'object') || false;\n  };\n\n  function keysIn(object) {\n    var result = [];\n    if (!isObject(object)) {\n      return result;\n    }\n    if (support.nonEnumArgs && object.length && isArguments(object)) {\n      object = slice.call(object);\n    }\n    var skipProto = support.enumPrototypes && typeof object == 'function',\n        skipErrorProps = support.enumErrorProps && (object === errorProto || object instanceof Error);\n\n    for (var key in object) {\n      if (!(skipProto && key == 'prototype') &&\n          !(skipErrorProps && (key == 'message' || key == 'name'))) {\n        result.push(key);\n      }\n    }\n\n    if (support.nonEnumShadows && object !== objectProto) {\n      var ctor = object.constructor,\n          index = -1,\n          length = dontEnumsLength;\n\n      if (object === (ctor && ctor.prototype)) {\n        var className = object === stringProto ? stringClass : object === errorProto ? errorClass : toString.call(object),\n            nonEnum = nonEnumProps[className];\n      }\n      while (++index < length) {\n        key = dontEnums[index];\n        if (!(nonEnum && nonEnum[key]) && hasOwnProperty.call(object, key)) {\n          result.push(key);\n        }\n      }\n    }\n    return result;\n  }\n\n  function internalFor(object, callback, keysFunc) {\n    var index = -1,\n      props = keysFunc(object),\n      length = props.length;\n\n    while (++index < length) {\n      var key = props[index];\n      if (callback(object[key], key, object) === false) {\n        break;\n      }\n    }\n    return object;\n  }\n\n  function internalForIn(object, callback) {\n    return internalFor(object, callback, keysIn);\n  }\n\n  function isNode(value) {\n    // IE < 9 presents DOM nodes as `Object` objects except they have `toString`\n    // methods that are `typeof` \"string\" and still can coerce nodes to strings\n    return typeof value.toString != 'function' && typeof (value + '') == 'string';\n  }\n\n  var isArguments = function(value) {\n    return (value && typeof value == 'object') ? toString.call(value) == argsClass : false;\n  }\n\n  // fallback for browsers that can't detect `arguments` objects by [[Class]]\n  if (!supportsArgsClass) {\n    isArguments = function(value) {\n      return (value && typeof value == 'object') ? hasOwnProperty.call(value, 'callee') : false;\n    };\n  }\n\n  var isEqual = Rx.internals.isEqual = function (x, y) {\n    return deepEquals(x, y, [], []);\n  };\n\n  /** @private\n   * Used for deep comparison\n   **/\n  function deepEquals(a, b, stackA, stackB) {\n    // exit early for identical values\n    if (a === b) {\n      // treat `+0` vs. `-0` as not equal\n      return a !== 0 || (1 / a == 1 / b);\n    }\n\n    var type = typeof a,\n        otherType = typeof b;\n\n    // exit early for unlike primitive values\n    if (a === a && (a == null || b == null ||\n        (type != 'function' && type != 'object' && otherType != 'function' && otherType != 'object'))) {\n      return false;\n    }\n\n    // compare [[Class]] names\n    var className = toString.call(a),\n        otherClass = toString.call(b);\n\n    if (className == argsClass) {\n      className = objectClass;\n    }\n    if (otherClass == argsClass) {\n      otherClass = objectClass;\n    }\n    if (className != otherClass) {\n      return false;\n    }\n    switch (className) {\n      case boolClass:\n      case dateClass:\n        // coerce dates and booleans to numbers, dates to milliseconds and booleans\n        // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\n        return +a == +b;\n\n      case numberClass:\n        // treat `NaN` vs. `NaN` as equal\n        return (a != +a) ?\n          b != +b :\n          // but treat `-0` vs. `+0` as not equal\n          (a == 0 ? (1 / a == 1 / b) : a == +b);\n\n      case regexpClass:\n      case stringClass:\n        // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\n        // treat string primitives and their corresponding object instances as equal\n        return a == String(b);\n    }\n    var isArr = className == arrayClass;\n    if (!isArr) {\n\n      // exit for functions and DOM nodes\n      if (className != objectClass || (!support.nodeClass && (isNode(a) || isNode(b)))) {\n        return false;\n      }\n      // in older versions of Opera, `arguments` objects have `Array` constructors\n      var ctorA = !support.argsObject && isArguments(a) ? Object : a.constructor,\n          ctorB = !support.argsObject && isArguments(b) ? Object : b.constructor;\n\n      // non `Object` object instances with different constructors are not equal\n      if (ctorA != ctorB &&\n            !(hasOwnProperty.call(a, 'constructor') && hasOwnProperty.call(b, 'constructor')) &&\n            !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\n            ('constructor' in a && 'constructor' in b)\n          ) {\n        return false;\n      }\n    }\n    // assume cyclic structures are equal\n    // the algorithm for detecting cyclic structures is adapted from ES 5.1\n    // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\n    var initedStack = !stackA;\n    stackA || (stackA = []);\n    stackB || (stackB = []);\n\n    var length = stackA.length;\n    while (length--) {\n      if (stackA[length] == a) {\n        return stackB[length] == b;\n      }\n    }\n    var size = 0;\n    var result = true;\n\n    // add `a` and `b` to the stack of traversed objects\n    stackA.push(a);\n    stackB.push(b);\n\n    // recursively compare objects and arrays (susceptible to call stack limits)\n    if (isArr) {\n      // compare lengths to determine if a deep comparison is necessary\n      length = a.length;\n      size = b.length;\n      result = size == length;\n\n      if (result) {\n        // deep compare the contents, ignoring non-numeric properties\n        while (size--) {\n          var index = length,\n              value = b[size];\n\n          if (!(result = deepEquals(a[size], value, stackA, stackB))) {\n            break;\n          }\n        }\n      }\n    }\n    else {\n      // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\n      // which, in this case, is more costly\n      internalForIn(b, function(value, key, b) {\n        if (hasOwnProperty.call(b, key)) {\n          // count the number of properties.\n          size++;\n          // deep compare each property value.\n          return (result = hasOwnProperty.call(a, key) && deepEquals(a[key], value, stackA, stackB));\n        }\n      });\n\n      if (result) {\n        // ensure both objects have the same number of properties\n        internalForIn(a, function(value, key, a) {\n          if (hasOwnProperty.call(a, key)) {\n            // `size` will be `-1` if `a` has more properties than `b`\n            return (result = --size > -1);\n          }\n        });\n      }\n    }\n    stackA.pop();\n    stackB.pop();\n\n    return result;\n  }\n\n  var hasProp = {}.hasOwnProperty,\n      slice = Array.prototype.slice;\n\n  var inherits = this.inherits = Rx.internals.inherits = function (child, parent) {\n    function __() { this.constructor = child; }\n    __.prototype = parent.prototype;\n    child.prototype = new __();\n  };\n\n  var addProperties = Rx.internals.addProperties = function (obj) {\n    for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n      var source = sources[idx];\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n  };\n\n  // Rx Utils\n  var addRef = Rx.internals.addRef = function (xs, r) {\n    return new AnonymousObservable(function (observer) {\n      return new CompositeDisposable(r.getDisposable(), xs.subscribe(observer));\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n\n  // Utilities\n  if (!Function.prototype.bind) {\n    Function.prototype.bind = function (that) {\n      var target = this,\n        args = slice.call(arguments, 1);\n      var bound = function () {\n        if (this instanceof bound) {\n          function F() { }\n          F.prototype = target.prototype;\n          var self = new F();\n          var result = target.apply(self, args.concat(slice.call(arguments)));\n          if (Object(result) === result) {\n            return result;\n          }\n          return self;\n        } else {\n          return target.apply(that, args.concat(slice.call(arguments)));\n        }\n      };\n\n      return bound;\n    };\n  }\n\n  if (!Array.prototype.forEach) {\n    Array.prototype.forEach = function (callback, thisArg) {\n      var T, k;\n\n      if (this == null) {\n        throw new TypeError(\" this is null or not defined\");\n      }\n\n      var O = Object(this);\n      var len = O.length >>> 0;\n\n      if (typeof callback !== \"function\") {\n        throw new TypeError(callback + \" is not a function\");\n      }\n\n      if (arguments.length > 1) {\n        T = thisArg;\n      }\n\n      k = 0;\n      while (k < len) {\n        var kValue;\n        if (k in O) {\n          kValue = O[k];\n          callback.call(T, kValue, k, O);\n        }\n        k++;\n      }\n    };\n  }\n\n  var boxedString = Object(\"a\"),\n      splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n  if (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n      var object = Object(this),\n        self = splitString && {}.toString.call(this) == stringClass ?\n          this.split(\"\") :\n          object,\n        length = self.length >>> 0,\n        thisp = arguments[1];\n\n      if ({}.toString.call(fun) != funcClass) {\n        throw new TypeError(fun + \" is not a function\");\n      }\n\n      for (var i = 0; i < length; i++) {\n        if (i in self && !fun.call(thisp, self[i], i, object)) {\n          return false;\n        }\n      }\n      return true;\n    };\n  }\n\n  if (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n      var object = Object(this),\n        self = splitString && {}.toString.call(this) == stringClass ?\n            this.split(\"\") :\n            object,\n        length = self.length >>> 0,\n        result = Array(length),\n        thisp = arguments[1];\n\n      if ({}.toString.call(fun) != funcClass) {\n        throw new TypeError(fun + \" is not a function\");\n      }\n\n      for (var i = 0; i < length; i++) {\n        if (i in self) {\n          result[i] = fun.call(thisp, self[i], i, object);\n        }\n      }\n      return result;\n    };\n  }\n\n  if (!Array.prototype.filter) {\n    Array.prototype.filter = function (predicate) {\n      var results = [], item, t = new Object(this);\n      for (var i = 0, len = t.length >>> 0; i < len; i++) {\n        item = t[i];\n        if (i in t && predicate.call(arguments[1], item, i, t)) {\n          results.push(item);\n        }\n      }\n      return results;\n    };\n  }\n\n  if (!Array.isArray) {\n    Array.isArray = function (arg) {\n      return {}.toString.call(arg) == arrayClass;\n    };\n  }\n\n  if (!Array.prototype.indexOf) {\n    Array.prototype.indexOf = function indexOf(searchElement) {\n      var t = Object(this);\n      var len = t.length >>> 0;\n      if (len === 0) {\n        return -1;\n      }\n      var n = 0;\n      if (arguments.length > 1) {\n        n = Number(arguments[1]);\n        if (n !== n) {\n          n = 0;\n        } else if (n !== 0 && n != Infinity && n !== -Infinity) {\n          n = (n > 0 || -1) * Math.floor(Math.abs(n));\n        }\n      }\n      if (n >= len) {\n        return -1;\n      }\n      var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);\n      for (; k < len; k++) {\n        if (k in t && t[k] === searchElement) {\n          return k;\n        }\n      }\n      return -1;\n    };\n  }\n\n  // Fix for Tessel\n  if (!Object.prototype.propertyIsEnumerable) {\n    Object.prototype.propertyIsEnumerable = function (key) {\n      for (var k in this) { if (k === key) { return true; } }\n      return false;\n    };\n  }\n\n  if (!Object.keys) {\n    Object.keys = (function() {\n      'use strict';\n      var hasOwnProperty = Object.prototype.hasOwnProperty,\n      hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString');\n\n      return function(obj) {\n        if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n          throw new TypeError('Object.keys called on non-object');\n        }\n\n        var result = [], prop, i;\n\n        for (prop in obj) {\n          if (hasOwnProperty.call(obj, prop)) {\n            result.push(prop);\n          }\n        }\n\n        if (hasDontEnumBug) {\n          for (i = 0; i < dontEnumsLength; i++) {\n            if (hasOwnProperty.call(obj, dontEnums[i])) {\n              result.push(dontEnums[i]);\n            }\n          }\n        }\n        return result;\n      };\n    }());\n  }\n\n  // Collections\n  function IndexedItem(id, value) {\n    this.id = id;\n    this.value = value;\n  }\n\n  IndexedItem.prototype.compareTo = function (other) {\n    var c = this.value.compareTo(other.value);\n    c === 0 && (c = this.id - other.id);\n    return c;\n  };\n\n  // Priority Queue for Scheduling\n  var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) {\n    this.items = new Array(capacity);\n    this.length = 0;\n  };\n\n  var priorityProto = PriorityQueue.prototype;\n  priorityProto.isHigherPriority = function (left, right) {\n    return this.items[left].compareTo(this.items[right]) < 0;\n  };\n\n  priorityProto.percolate = function (index) {\n    if (index >= this.length || index < 0) { return; }\n    var parent = index - 1 >> 1;\n    if (parent < 0 || parent === index) { return; }\n    if (this.isHigherPriority(index, parent)) {\n      var temp = this.items[index];\n      this.items[index] = this.items[parent];\n      this.items[parent] = temp;\n      this.percolate(parent);\n    }\n  };\n\n  priorityProto.heapify = function (index) {\n    +index || (index = 0);\n    if (index >= this.length || index < 0) { return; }\n    var left = 2 * index + 1,\n        right = 2 * index + 2,\n        first = index;\n    if (left < this.length && this.isHigherPriority(left, first)) {\n      first = left;\n    }\n    if (right < this.length && this.isHigherPriority(right, first)) {\n      first = right;\n    }\n    if (first !== index) {\n      var temp = this.items[index];\n      this.items[index] = this.items[first];\n      this.items[first] = temp;\n      this.heapify(first);\n    }\n  };\n\n  priorityProto.peek = function () { return this.items[0].value; };\n\n  priorityProto.removeAt = function (index) {\n    this.items[index] = this.items[--this.length];\n    this.items[this.length] = undefined;\n    this.heapify();\n  };\n\n  priorityProto.dequeue = function () {\n    var result = this.peek();\n    this.removeAt(0);\n    return result;\n  };\n\n  priorityProto.enqueue = function (item) {\n    var index = this.length++;\n    this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n    this.percolate(index);\n  };\n\n  priorityProto.remove = function (item) {\n    for (var i = 0; i < this.length; i++) {\n      if (this.items[i].value === item) {\n        this.removeAt(i);\n        return true;\n      }\n    }\n    return false;\n  };\n  PriorityQueue.count = 0;\n\n  /**\n   * Represents a group of disposable resources that are disposed together.\n   * @constructor\n   */\n  var CompositeDisposable = Rx.CompositeDisposable = function () {\n    var args = [];\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    }\n    this.disposables = args;\n    this.isDisposed = false;\n    this.length = this.disposables.length;\n  };\n\n  var CompositeDisposablePrototype = CompositeDisposable.prototype;\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Mixed} item Disposable to add.\n   */\n  CompositeDisposablePrototype.add = function (item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n      this.length++;\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Mixed} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n  CompositeDisposablePrototype.remove = function (item) {\n    var shouldDispose = false;\n    if (!this.isDisposed) {\n      var idx = this.disposables.indexOf(item);\n      if (idx !== -1) {\n        shouldDispose = true;\n        this.disposables.splice(idx, 1);\n        this.length--;\n        item.dispose();\n      }\n    }\n    return shouldDispose;\n  };\n\n  /**\n   *  Disposes all disposables in the group and removes them from the group.\n   */\n  CompositeDisposablePrototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      for(var currentDisposables = [], i = 0, len = this.disposables.length; i < len; i++) { currentDisposables.push(this.disposables[i]); }\n      this.disposables = [];\n      this.length = 0;\n\n      for (i = 0, len = currentDisposables.length; i < len; i++) {\n        currentDisposables[i].dispose();\n      }\n    }\n  };\n\n  /**\n   * Converts the existing CompositeDisposable to an array of disposables\n   * @returns {Array} An array of disposable objects.\n   */\n  CompositeDisposablePrototype.toArray = function () {\n    for(var currentDisposables = [], ix = 0, len = this.disposables.length; i < len; i++) { currentDisposables.push(this.disposables[i]); }\n    return currentDisposables;\n  };\n\n  /**\n   * Provides a set of static methods for creating Disposables.\n   *\n   * @constructor\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   */\n  var Disposable = Rx.Disposable = function (action) {\n    this.isDisposed = false;\n    this.action = action || noop;\n  };\n\n  /** Performs the task of cleaning up resources. */\n  Disposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.action();\n      this.isDisposed = true;\n    }\n  };\n\n  /**\n   * Creates a disposable object that invokes the specified action when disposed.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   * @return {Disposable} The disposable object that runs the given action upon disposal.\n   */\n  var disposableCreate = Disposable.create = function (action) { return new Disposable(action); };\n\n  /**\n   * Gets the disposable that does nothing when disposed.\n   */\n  var disposableEmpty = Disposable.empty = { dispose: noop };\n\n  var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = (function () {\n    function BooleanDisposable () {\n      this.isDisposed = false;\n      this.current = null;\n    }\n\n    var booleanDisposablePrototype = BooleanDisposable.prototype;\n\n    /**\n     * Gets the underlying disposable.\n     * @return The underlying disposable.\n     */\n    booleanDisposablePrototype.getDisposable = function () {\n      return this.current;\n    };\n\n    /**\n     * Sets the underlying disposable.\n     * @param {Disposable} value The new underlying disposable.\n     */\n    booleanDisposablePrototype.setDisposable = function (value) {\n      var shouldDispose = this.isDisposed;\n      if (!shouldDispose) {\n        var old = this.current;\n        this.current = value;\n      }\n      old && old.dispose();\n      shouldDispose && value && value.dispose();\n    };\n\n    /**\n     * Disposes the underlying disposable as well as all future replacements.\n     */\n    booleanDisposablePrototype.dispose = function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        var old = this.current;\n        this.current = null;\n      }\n      old && old.dispose();\n    };\n\n    return BooleanDisposable;\n  }());\n  var SerialDisposable = Rx.SerialDisposable = SingleAssignmentDisposable;\n\n  /**\n   * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n   */\n  var RefCountDisposable = Rx.RefCountDisposable = (function () {\n\n    function InnerDisposable(disposable) {\n      this.disposable = disposable;\n      this.disposable.count++;\n      this.isInnerDisposed = false;\n    }\n\n    InnerDisposable.prototype.dispose = function () {\n      if (!this.disposable.isDisposed && !this.isInnerDisposed) {\n        this.isInnerDisposed = true;\n        this.disposable.count--;\n        if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {\n          this.disposable.isDisposed = true;\n          this.disposable.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Initializes a new instance of the RefCountDisposable with the specified disposable.\n     * @constructor\n     * @param {Disposable} disposable Underlying disposable.\n      */\n    function RefCountDisposable(disposable) {\n      this.underlyingDisposable = disposable;\n      this.isDisposed = false;\n      this.isPrimaryDisposed = false;\n      this.count = 0;\n    }\n\n    /**\n     * Disposes the underlying disposable only when all dependent disposables have been disposed\n     */\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed && !this.isPrimaryDisposed) {\n        this.isPrimaryDisposed = true;\n        if (this.count === 0) {\n          this.isDisposed = true;\n          this.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n     * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n     */\n    RefCountDisposable.prototype.getDisposable = function () {\n      return this.isDisposed ? disposableEmpty : new InnerDisposable(this);\n    };\n\n    return RefCountDisposable;\n  })();\n\n  var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) {\n    this.scheduler = scheduler;\n    this.state = state;\n    this.action = action;\n    this.dueTime = dueTime;\n    this.comparer = comparer || defaultSubComparer;\n    this.disposable = new SingleAssignmentDisposable();\n  }\n\n  ScheduledItem.prototype.invoke = function () {\n    this.disposable.setDisposable(this.invokeCore());\n  };\n\n  ScheduledItem.prototype.compareTo = function (other) {\n    return this.comparer(this.dueTime, other.dueTime);\n  };\n\n  ScheduledItem.prototype.isCancelled = function () {\n    return this.disposable.isDisposed;\n  };\n\n  ScheduledItem.prototype.invokeCore = function () {\n    return this.action(this.scheduler, this.state);\n  };\n\n  /** Provides a set of static properties to access commonly used schedulers. */\n  var Scheduler = Rx.Scheduler = (function () {\n\n    function Scheduler(now, schedule, scheduleRelative, scheduleAbsolute) {\n      this.now = now;\n      this._schedule = schedule;\n      this._scheduleRelative = scheduleRelative;\n      this._scheduleAbsolute = scheduleAbsolute;\n    }\n\n    function invokeAction(scheduler, action) {\n      action();\n      return disposableEmpty;\n    }\n\n    var schedulerProto = Scheduler.prototype;\n\n    /**\n     * Schedules an action to be executed.\n     * @param {Function} action Action to execute.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.schedule = function (action) {\n      return this._schedule(action, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed.\n     * @param state State passed to the action to be executed.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithState = function (state, action) {\n      return this._schedule(state, action);\n    };\n\n    /**\n     * Schedules an action to be executed after the specified relative due time.\n     * @param {Function} action Action to execute.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithRelative = function (dueTime, action) {\n      return this._scheduleRelative(action, dueTime, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed after dueTime.\n     * @param state State passed to the action to be executed.\n     * @param {Function} action Action to be executed.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithRelativeAndState = function (state, dueTime, action) {\n      return this._scheduleRelative(state, dueTime, action);\n    };\n\n    /**\n     * Schedules an action to be executed at the specified absolute due time.\n     * @param {Function} action Action to execute.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n      */\n    schedulerProto.scheduleWithAbsolute = function (dueTime, action) {\n      return this._scheduleAbsolute(action, dueTime, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to be executed.\n     * @param {Number}dueTime Absolute time at which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithAbsoluteAndState = function (state, dueTime, action) {\n      return this._scheduleAbsolute(state, dueTime, action);\n    };\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.now = defaultNow;\n\n    /**\n     * Normalizes the specified TimeSpan value to a positive value.\n     * @param {Number} timeSpan The time span value to normalize.\n     * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n     */\n    Scheduler.normalize = function (timeSpan) {\n      timeSpan < 0 && (timeSpan = 0);\n      return timeSpan;\n    };\n\n    return Scheduler;\n  }());\n\n  var normalizeTime = Scheduler.normalize;\n\n  (function (schedulerProto) {\n    function invokeRecImmediate(scheduler, pair) {\n      var state = pair.first, action = pair.second, group = new CompositeDisposable(),\n      recursiveAction = function (state1) {\n        action(state1, function (state2) {\n          var isAdded = false, isDone = false,\n          d = scheduler.scheduleWithState(state2, function (scheduler1, state3) {\n            if (isAdded) {\n              group.remove(d);\n            } else {\n              isDone = true;\n            }\n            recursiveAction(state3);\n            return disposableEmpty;\n          });\n          if (!isDone) {\n            group.add(d);\n            isAdded = true;\n          }\n        });\n      };\n      recursiveAction(state);\n      return group;\n    }\n\n    function invokeRecDate(scheduler, pair, method) {\n      var state = pair.first, action = pair.second, group = new CompositeDisposable(),\n      recursiveAction = function (state1) {\n        action(state1, function (state2, dueTime1) {\n          var isAdded = false, isDone = false,\n          d = scheduler[method](state2, dueTime1, function (scheduler1, state3) {\n            if (isAdded) {\n              group.remove(d);\n            } else {\n              isDone = true;\n            }\n            recursiveAction(state3);\n            return disposableEmpty;\n          });\n          if (!isDone) {\n            group.add(d);\n            isAdded = true;\n          }\n        });\n      };\n      recursiveAction(state);\n      return group;\n    }\n\n    function scheduleInnerRecursive(action, self) {\n      action(function(dt) { self(action, dt); });\n    }\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursive = function (action) {\n      return this.scheduleRecursiveWithState(action, function (_action, self) {\n        _action(function () { self(_action); }); });\n    };\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithState = function (state, action) {\n      return this.scheduleWithState({ first: state, second: action }, invokeRecImmediate);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative due time.\n     * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified relative time.\n     * @param {Number}dueTime Relative time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithRelative = function (dueTime, action) {\n      return this.scheduleRecursiveWithRelativeAndState(action, dueTime, scheduleInnerRecursive);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number}dueTime Relative time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithRelativeAndState = function (state, dueTime, action) {\n      return this._scheduleRelative({ first: state, second: action }, dueTime, function (s, p) {\n        return invokeRecDate(s, p, 'scheduleWithRelativeAndState');\n      });\n    };\n\n    /**\n     * Schedules an action to be executed recursively at a specified absolute due time.\n     * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified absolute time.\n     * @param {Number}dueTime Absolute time at which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithAbsolute = function (dueTime, action) {\n      return this.scheduleRecursiveWithAbsoluteAndState(action, dueTime, scheduleInnerRecursive);\n    };\n\n    /**\n     * Schedules an action to be executed recursively at a specified absolute due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number}dueTime Absolute time at which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithAbsoluteAndState = function (state, dueTime, action) {\n      return this._scheduleAbsolute({ first: state, second: action }, dueTime, function (s, p) {\n        return invokeRecDate(s, p, 'scheduleWithAbsoluteAndState');\n      });\n    };\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    Scheduler.prototype.schedulePeriodic = function (period, action) {\n      return this.schedulePeriodicWithState(null, period, action);\n    };\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    Scheduler.prototype.schedulePeriodicWithState = function(state, period, action) {\n      if (typeof root.setInterval === 'undefined') { throw new Error('Periodic scheduling not supported.'); }\n      var s = state;\n\n      var id = root.setInterval(function () {\n        s = action(s);\n      }, period);\n\n      return disposableCreate(function () {\n        root.clearInterval(id);\n      });\n    };\n\n  }(Scheduler.prototype));\n\n  /** Gets a scheduler that schedules work immediately on the current thread. */\n  var immediateScheduler = Scheduler.immediate = (function () {\n\n    function scheduleNow(state, action) { return action(this, state); }\n\n    function scheduleRelative(state, dueTime, action) {\n      var dt = this.now() + normalizeTime(dueTime);\n      while (dt - this.now() > 0) { }\n      return action(this, state);\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);\n    }\n\n    return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n  }());\n\n  /**\n   * Gets a scheduler that schedules work as soon as possible on the current thread.\n   */\n  var currentThreadScheduler = Scheduler.currentThread = (function () {\n    var queue;\n\n    function runTrampoline (q) {\n      while (q.length > 0) {\n        var item = q.dequeue();\n        if (!item.isCancelled()) {\n          // Note, do not schedule blocking work!\n          while (item.dueTime - Scheduler.now() > 0) {\n          }\n          !item.isCancelled() && item.invoke();\n        }\n      }\n    }\n\n    function scheduleNow(state, action) {\n      return this.scheduleWithRelativeAndState(state, 0, action);\n    }\n\n    function scheduleRelative(state, dueTime, action) {\n      var dt = this.now() + Scheduler.normalize(dueTime),\n          si = new ScheduledItem(this, state, action, dt);\n\n      if (!queue) {\n        queue = new PriorityQueue(4);\n        queue.enqueue(si);\n        try {\n          runTrampoline(queue);\n        } catch (e) {\n          throw e;\n        } finally {\n          queue = null;\n        }\n      } else {\n        queue.enqueue(si);\n      }\n      return si.disposable;\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);\n    }\n\n    var currentScheduler = new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n\n    currentScheduler.scheduleRequired = function () { return !queue; };\n    currentScheduler.ensureTrampoline = function (action) {\n      if (!queue) { this.schedule(action); } else { action(); }\n    };\n\n    return currentScheduler;\n  }());\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function tick(command, recurse) {\n      recurse(0, this._period);\n      try {\n        this._state = this._action(this._state);\n      } catch (e) {\n        this._cancel.dispose();\n        throw e;\n      }\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0, this._period, tick.bind(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  var scheduleMethod, clearMethod = noop;\n  var localTimer = (function () {\n    var localSetTimeout, localClearTimeout = noop;\n    if ('WScript' in this) {\n      localSetTimeout = function (fn, time) {\n        WScript.Sleep(time);\n        fn();\n      };\n    } else if (!!root.setTimeout) {\n      localSetTimeout = root.setTimeout;\n      localClearTimeout = root.clearTimeout;\n    } else {\n      throw new Error('No concurrency detected!');\n    }\n\n    return {\n      setTimeout: localSetTimeout,\n      clearTimeout: localClearTimeout\n    };\n  }());\n  var localSetTimeout = localTimer.setTimeout,\n    localClearTimeout = localTimer.clearTimeout;\n\n  (function () {\n\n    var reNative = RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&\n      !reNative.test(setImmediate) && setImmediate,\n      clearImmediate = typeof (clearImmediate = freeGlobal && moduleExports && freeGlobal.clearImmediate) == 'function' &&\n      !reNative.test(clearImmediate) && clearImmediate;\n\n    function postMessageSupported () {\n      // Ensure not in a worker\n      if (!root.postMessage || root.importScripts) { return false; }\n      var isAsync = false,\n          oldHandler = root.onmessage;\n      // Test for async\n      root.onmessage = function () { isAsync = true; };\n      root.postMessage('', '*');\n      root.onmessage = oldHandler;\n\n      return isAsync;\n    }\n\n    // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n    if (typeof setImmediate === 'function') {\n      scheduleMethod = setImmediate;\n      clearMethod = clearImmediate;\n    } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleMethod = process.nextTick;\n    } else if (postMessageSupported()) {\n      var MSG_PREFIX = 'ms.rx.schedule' + Math.random(),\n        tasks = {},\n        taskId = 0;\n\n      var onGlobalPostMessage = function (event) {\n        // Only if we're a match to avoid any other global events\n        if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n          var handleId = event.data.substring(MSG_PREFIX.length),\n            action = tasks[handleId];\n          action();\n          delete tasks[handleId];\n        }\n      }\n\n      if (root.addEventListener) {\n        root.addEventListener('message', onGlobalPostMessage, false);\n      } else {\n        root.attachEvent('onmessage', onGlobalPostMessage, false);\n      }\n\n      scheduleMethod = function (action) {\n        var currentId = taskId++;\n        tasks[currentId] = action;\n        root.postMessage(MSG_PREFIX + currentId, '*');\n      };\n    } else if (!!root.MessageChannel) {\n      var channel = new root.MessageChannel(),\n        channelTasks = {},\n        channelTaskId = 0;\n\n      channel.port1.onmessage = function (event) {\n        var id = event.data,\n          action = channelTasks[id];\n        action();\n        delete channelTasks[id];\n      };\n\n      scheduleMethod = function (action) {\n        var id = channelTaskId++;\n        channelTasks[id] = action;\n        channel.port2.postMessage(id);\n      };\n    } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {\n\n      scheduleMethod = function (action) {\n        var scriptElement = root.document.createElement('script');\n        scriptElement.onreadystatechange = function () {\n          action();\n          scriptElement.onreadystatechange = null;\n          scriptElement.parentNode.removeChild(scriptElement);\n          scriptElement = null;\n        };\n        root.document.documentElement.appendChild(scriptElement);\n      };\n\n    } else {\n      scheduleMethod = function (action) { return localSetTimeout(action, 0); };\n      clearMethod = localClearTimeout;\n    }\n  }());\n\n  /**\n   * Gets a scheduler that schedules work via a timed callback based upon platform.\n   */\n  var timeoutScheduler = Scheduler.timeout = (function () {\n\n    function scheduleNow(state, action) {\n      var scheduler = this,\n        disposable = new SingleAssignmentDisposable();\n      var id = scheduleMethod(function () {\n        if (!disposable.isDisposed) {\n          disposable.setDisposable(action(scheduler, state));\n        }\n      });\n      return new CompositeDisposable(disposable, disposableCreate(function () {\n        clearMethod(id);\n      }));\n    }\n\n    function scheduleRelative(state, dueTime, action) {\n      var scheduler = this,\n        dt = Scheduler.normalize(dueTime);\n      if (dt === 0) {\n        return scheduler.scheduleWithState(state, action);\n      }\n      var disposable = new SingleAssignmentDisposable();\n      var id = localSetTimeout(function () {\n        if (!disposable.isDisposed) {\n          disposable.setDisposable(action(scheduler, state));\n        }\n      }, dt);\n      return new CompositeDisposable(disposable, disposableCreate(function () {\n        localClearTimeout(id);\n      }));\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);\n    }\n\n    return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n  })();\n\n  /**\n   *  Represents a notification to an observer.\n   */\n  var Notification = Rx.Notification = (function () {\n    function Notification(kind, hasValue) {\n      this.hasValue = hasValue == null ? false : hasValue;\n      this.kind = kind;\n    }\n\n    /**\n     * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n     *\n     * @memberOf Notification\n     * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n     * @param {Function} onError Delegate to invoke for an OnError notification.\n     * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n     * @returns {Any} Result produced by the observation.\n     */\n    Notification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n      return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n        this._acceptObservable(observerOrOnNext) :\n        this._accept(observerOrOnNext, onError, onCompleted);\n    };\n\n    /**\n     * Returns an observable sequence with a single notification.\n     *\n     * @memberOf Notifications\n     * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n     * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n     */\n    Notification.prototype.toObservable = function (scheduler) {\n      var notification = this;\n      isScheduler(scheduler) || (scheduler = immediateScheduler);\n      return new AnonymousObservable(function (observer) {\n        return scheduler.schedule(function () {\n          notification._acceptObservable(observer);\n          notification.kind === 'N' && observer.onCompleted();\n        });\n      });\n    };\n\n    return Notification;\n  })();\n\n  /**\n   * Creates an object that represents an OnNext notification to an observer.\n   * @param {Any} value The value contained in the notification.\n   * @returns {Notification} The OnNext notification containing the value.\n   */\n  var notificationCreateOnNext = Notification.createOnNext = (function () {\n\n      function _accept (onNext) { return onNext(this.value); }\n      function _acceptObservable(observer) { return observer.onNext(this.value); }\n      function toString () { return 'OnNext(' + this.value + ')'; }\n\n      return function (value) {\n        var notification = new Notification('N', true);\n        notification.value = value;\n        notification._accept = _accept;\n        notification._acceptObservable = _acceptObservable;\n        notification.toString = toString;\n        return notification;\n      };\n  }());\n\n  /**\n   * Creates an object that represents an OnError notification to an observer.\n   * @param {Any} error The exception contained in the notification.\n   * @returns {Notification} The OnError notification containing the exception.\n   */\n  var notificationCreateOnError = Notification.createOnError = (function () {\n\n    function _accept (onNext, onError) { return onError(this.exception); }\n    function _acceptObservable(observer) { return observer.onError(this.exception); }\n    function toString () { return 'OnError(' + this.exception + ')'; }\n\n    return function (e) {\n      var notification = new Notification('E');\n      notification.exception = e;\n      notification._accept = _accept;\n      notification._acceptObservable = _acceptObservable;\n      notification.toString = toString;\n      return notification;\n    };\n  }());\n\n  /**\n   * Creates an object that represents an OnCompleted notification to an observer.\n   * @returns {Notification} The OnCompleted notification.\n   */\n  var notificationCreateOnCompleted = Notification.createOnCompleted = (function () {\n\n    function _accept (onNext, onError, onCompleted) { return onCompleted(); }\n    function _acceptObservable(observer) { return observer.onCompleted(); }\n    function toString () { return 'OnCompleted()'; }\n\n    return function () {\n      var notification = new Notification('C');\n      notification._accept = _accept;\n      notification._acceptObservable = _acceptObservable;\n      notification.toString = toString;\n      return notification;\n    };\n  }());\n\n  var Enumerator = Rx.internals.Enumerator = function (next) {\n    this._next = next;\n  };\n\n  Enumerator.prototype.next = function () {\n    return this._next();\n  };\n\n  Enumerator.prototype[$iterator$] = function () { return this; }\n\n  var Enumerable = Rx.internals.Enumerable = function (iterator) {\n    this._iterator = iterator;\n  };\n\n  Enumerable.prototype[$iterator$] = function () {\n    return this._iterator();\n  };\n\n  Enumerable.prototype.concat = function () {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var e = sources[$iterator$]();\n\n      var isDisposed, subscription = new SerialDisposable();\n      var cancelable = immediateScheduler.scheduleRecursive(function (self) {\n        if (isDisposed) { return; }\n        try {\n          var currentItem = e.next();\n        } catch (ex) {\n          return o.onError(ex);\n        }\n\n        if (currentItem.done) {\n          return o.onCompleted();\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var d = new SingleAssignmentDisposable();\n        subscription.setDisposable(d);\n        d.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function(err) { o.onError(err); },\n          self)\n        );\n      });\n\n      return new CompositeDisposable(subscription, cancelable, disposableCreate(function () {\n        isDisposed = true;\n      }));\n    });\n  };\n\n  Enumerable.prototype.catchError = function () {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var e = sources[$iterator$]();\n\n      var isDisposed, subscription = new SerialDisposable();\n      var cancelable = immediateScheduler.scheduleRecursiveWithState(null, function (lastException, self) {\n        if (isDisposed) { return; }\n\n        try {\n          var currentItem = e.next();\n        } catch (ex) {\n          return observer.onError(ex);\n        }\n\n        if (currentItem.done) {\n          if (lastException !== null) {\n            o.onError(lastException);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var d = new SingleAssignmentDisposable();\n        subscription.setDisposable(d);\n        d.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          self,\n          function() { o.onCompleted(); }));\n      });\n      return new CompositeDisposable(subscription, cancelable, disposableCreate(function () {\n        isDisposed = true;\n      }));\n    });\n  };\n\n\n  Enumerable.prototype.catchErrorWhen = function (notificationHandler) {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var exceptions = new Subject(),\n        notifier = new Subject(),\n        handled = notificationHandler(exceptions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = sources[$iterator$]();\n\n      var isDisposed,\n        lastException,\n        subscription = new SerialDisposable();\n      var cancelable = immediateScheduler.scheduleRecursive(function (self) {\n        if (isDisposed) { return; }\n\n        try {\n          var currentItem = e.next();\n        } catch (ex) {\n          return o.onError(ex);\n        }\n\n        if (currentItem.done) {\n          if (lastException) {\n            o.onError(lastException);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new CompositeDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) {\n            inner.setDisposable(notifier.subscribe(self, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            exceptions.onNext(exn);\n          },\n          function() { o.onCompleted(); }));\n      });\n\n      return new CompositeDisposable(notificationDisposable, subscription, cancelable, disposableCreate(function () {\n        isDisposed = true;\n      }));\n    });\n  };\n\n  var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) {\n    if (repeatCount == null) { repeatCount = -1; }\n    return new Enumerable(function () {\n      var left = repeatCount;\n      return new Enumerator(function () {\n        if (left === 0) { return doneEnumerator; }\n        if (left > 0) { left--; }\n        return { done: false, value: value };\n      });\n    });\n  };\n\n  var enumerableOf = Enumerable.of = function (source, selector, thisArg) {\n    if (selector) {\n      var selectorFn = bindCallback(selector, thisArg, 3);\n    }\n    return new Enumerable(function () {\n      var index = -1;\n      return new Enumerator(\n        function () {\n          return ++index < source.length ?\n            { done: false, value: !selector ? source[index] : selectorFn(source[index], index, source) } :\n            doneEnumerator;\n        });\n    });\n  };\n\n  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n\n  /**\n   * Abstract base class for implementations of the Observer class.\n   * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n   */\n  var AbstractObserver = Rx.internals.AbstractObserver = (function (__super__) {\n    inherits(AbstractObserver, __super__);\n\n    /**\n     * Creates a new observer in a non-stopped state.\n     */\n    function AbstractObserver() {\n      this.isStopped = false;\n      __super__.call(this);\n    }\n\n    /**\n     * Notifies the observer of a new element in the sequence.\n     * @param {Any} value Next element in the sequence.\n     */\n    AbstractObserver.prototype.onNext = function (value) {\n      if (!this.isStopped) { this.next(value); }\n    };\n\n    /**\n     * Notifies the observer that an exception has occurred.\n     * @param {Any} error The error that has occurred.\n     */\n    AbstractObserver.prototype.onError = function (error) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(error);\n      }\n    };\n\n    /**\n     * Notifies the observer of the end of the sequence.\n     */\n    AbstractObserver.prototype.onCompleted = function () {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.completed();\n      }\n    };\n\n    /**\n     * Disposes the observer, causing it to transition to the stopped state.\n     */\n    AbstractObserver.prototype.dispose = function () {\n      this.isStopped = true;\n    };\n\n    AbstractObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return AbstractObserver;\n  }(Observer));\n\n  /**\n   * Class to create an Observer instance from delegate-based implementations of the on* methods.\n   */\n  var AnonymousObserver = Rx.AnonymousObserver = (function (__super__) {\n    inherits(AnonymousObserver, __super__);\n\n    /**\n     * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n     * @param {Any} onNext Observer's OnNext action implementation.\n     * @param {Any} onError Observer's OnError action implementation.\n     * @param {Any} onCompleted Observer's OnCompleted action implementation.\n     */\n    function AnonymousObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    /**\n     * Calls the onNext action.\n     * @param {Any} value Next element in the sequence.\n     */\n    AnonymousObserver.prototype.next = function (value) {\n      this._onNext(value);\n    };\n\n    /**\n     * Calls the onError action.\n     * @param {Any} error The error that has occurred.\n     */\n    AnonymousObserver.prototype.error = function (error) {\n      this._onError(error);\n    };\n\n    /**\n     *  Calls the onCompleted action.\n     */\n    AnonymousObserver.prototype.completed = function () {\n      this._onCompleted();\n    };\n\n    return AnonymousObserver;\n  }(AbstractObserver));\n\n  var observableProto;\n\n  /**\n   * Represents a push-style collection.\n   */\n  var Observable = Rx.Observable = (function () {\n\n    function Observable(subscribe) {\n      if (Rx.config.longStackSupport && hasStacks) {\n        try {\n          throw new Error();\n        } catch (e) {\n          this.stack = e.stack.substring(e.stack.indexOf(\"\\n\") + 1);\n        }\n\n        var self = this;\n        this._subscribe = function (observer) {\n          var oldOnError = observer.onError.bind(observer);\n\n          observer.onError = function (err) {\n            makeStackTraceLong(err, self);\n            oldOnError(err);\n          };\n\n          return subscribe.call(self, observer);\n        };\n      } else {\n        this._subscribe = subscribe;\n      }\n    }\n\n    observableProto = Observable.prototype;\n\n    /**\n     *  Subscribes an observer to the observable sequence.\n     *  @param {Mixed} [observerOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n     *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n     *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n     *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribe = observableProto.forEach = function (observerOrOnNext, onError, onCompleted) {\n      return this._subscribe(typeof observerOrOnNext === 'object' ?\n        observerOrOnNext :\n        observerCreate(observerOrOnNext, onError, onCompleted));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onNext The function to invoke on each element in the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnNext = function (onNext, thisArg) {\n      return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n    };\n\n    /**\n     * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n     * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnError = function (onError, thisArg) {\n      return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnCompleted = function (onCompleted, thisArg) {\n      return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n    };\n\n    return Observable;\n  })();\n\n  var ObservableBase = Rx.ObservableBase = (function (__super__) {\n\n  inherits(ObservableBase, __super__);\n\n  // Fix subscriber to check for undefined or function returned to decorate as Disposable\n  function fixSubscriber(subscriber) {\n    if (subscriber && typeof subscriber.dispose === 'function') { return subscriber; }\n\n      return typeof subscriber === 'function' ?\n        disposableCreate(subscriber) :\n        disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      try {\n        ado.setDisposable(fixSubscriber(self.subscribeCore(ado)));\n      } catch (e) {\n        if (!ado.fail(e)) { throw e; }\n      }\n    }\n\n    function subscribe(observer) {\n      var ado = new AutoDetachObserver(observer), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.scheduleWithState(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n\n      return ado;\n    }\n\n    function ObservableBase() {\n      __super__.call(this, subscribe);\n    }\n\n    ObservableBase.prototype.subscribeCore = function(observer) {\n      throw new Error('Not implemeneted');\n    }\n\n    return ObservableBase;\n\n  }(Observable));\n\n  var ScheduledObserver = Rx.internals.ScheduledObserver = (function (__super__) {\n    inherits(ScheduledObserver, __super__);\n\n    function ScheduledObserver(scheduler, observer) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.observer = observer;\n      this.isAcquired = false;\n      this.hasFaulted = false;\n      this.queue = [];\n      this.disposable = new SerialDisposable();\n    }\n\n    ScheduledObserver.prototype.next = function (value) {\n      var self = this;\n      this.queue.push(function () { self.observer.onNext(value); });\n    };\n\n    ScheduledObserver.prototype.error = function (e) {\n      var self = this;\n      this.queue.push(function () { self.observer.onError(e); });\n    };\n\n    ScheduledObserver.prototype.completed = function () {\n      var self = this;\n      this.queue.push(function () { self.observer.onCompleted(); });\n    };\n\n    ScheduledObserver.prototype.ensureActive = function () {\n      var isOwner = false, parent = this;\n      if (!this.hasFaulted && this.queue.length > 0) {\n        isOwner = !this.isAcquired;\n        this.isAcquired = true;\n      }\n      if (isOwner) {\n        this.disposable.setDisposable(this.scheduler.scheduleRecursive(function (self) {\n          var work;\n          if (parent.queue.length > 0) {\n            work = parent.queue.shift();\n          } else {\n            parent.isAcquired = false;\n            return;\n          }\n          try {\n            work();\n          } catch (ex) {\n            parent.queue = [];\n            parent.hasFaulted = true;\n            throw ex;\n          }\n          self();\n        }));\n      }\n    };\n\n    ScheduledObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.disposable.dispose();\n    };\n\n    return ScheduledObserver;\n  }(AbstractObserver));\n\n  /**\n   * Creates an array from an observable sequence.\n   * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n   */\n  observableProto.toArray = function () {\n    var source = this;\n    return new AnonymousObservable(function(observer) {\n      var arr = [];\n      return source.subscribe(\n        function (x) { arr.push(x); },\n        function (e) { observer.onError(e); },\n        function () {\n          observer.onNext(arr);\n          observer.onCompleted();\n        });\n    }, source);\n  };\n\n  /**\n   *  Creates an observable sequence from a specified subscribe method implementation.\n   * @example\n   *  var res = Rx.Observable.create(function (observer) { return function () { } );\n   *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n   *  var res = Rx.Observable.create(function (observer) { } );\n   * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n   * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n   */\n  Observable.create = Observable.createWithDisposable = function (subscribe, parent) {\n    return new AnonymousObservable(subscribe, parent);\n  };\n\n  /**\n   *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n   *\n   * @example\n   *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n   * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n   * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n   */\n  var observableDefer = Observable.defer = function (observableFactory) {\n    return new AnonymousObservable(function (observer) {\n      var result;\n      try {\n        result = observableFactory();\n      } catch (e) {\n        return observableThrow(e).subscribe(observer);\n      }\n      isPromise(result) && (result = observableFromPromise(result));\n      return result.subscribe(observer);\n    });\n  };\n\n  /**\n   *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n   *\n   * @example\n   *  var res = Rx.Observable.empty();\n   *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n   * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n   * @returns {Observable} An observable sequence with no elements.\n   */\n  var observableEmpty = Observable.empty = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.schedule(function () {\n        observer.onCompleted();\n      });\n    });\n  };\n\n  var maxSafeInteger = Math.pow(2, 53) - 1;\n\n  function StringIterable(str) {\n    this._s = s;\n  }\n\n  StringIterable.prototype[$iterator$] = function () {\n    return new StringIterator(this._s);\n  };\n\n  function StringIterator(str) {\n    this._s = s;\n    this._l = s.length;\n    this._i = 0;\n  }\n\n  StringIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  StringIterator.prototype.next = function () {\n    if (this._i < this._l) {\n      var val = this._s.charAt(this._i++);\n      return { done: false, value: val };\n    } else {\n      return doneEnumerator;\n    }\n  };\n\n  function ArrayIterable(a) {\n    this._a = a;\n  }\n\n  ArrayIterable.prototype[$iterator$] = function () {\n    return new ArrayIterator(this._a);\n  };\n\n  function ArrayIterator(a) {\n    this._a = a;\n    this._l = toLength(a);\n    this._i = 0;\n  }\n\n  ArrayIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  ArrayIterator.prototype.next = function () {\n    if (this._i < this._l) {\n      var val = this._a[this._i++];\n      return { done: false, value: val };\n    } else {\n      return doneEnumerator;\n    }\n  };\n\n  function numberIsFinite(value) {\n    return typeof value === 'number' && root.isFinite(value);\n  }\n\n  function isNan(n) {\n    return n !== n;\n  }\n\n  function getIterable(o) {\n    var i = o[$iterator$], it;\n    if (!i && typeof o === 'string') {\n      it = new StringIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i && o.length !== undefined) {\n      it = new ArrayIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i) { throw new TypeError('Object is not iterable'); }\n    return o[$iterator$]();\n  }\n\n  function sign(value) {\n    var number = +value;\n    if (number === 0) { return number; }\n    if (isNaN(number)) { return number; }\n    return number < 0 ? -1 : 1;\n  }\n\n  function toLength(o) {\n    var len = +o.length;\n    if (isNaN(len)) { return 0; }\n    if (len === 0 || !numberIsFinite(len)) { return len; }\n    len = sign(len) * Math.floor(Math.abs(len));\n    if (len <= 0) { return 0; }\n    if (len > maxSafeInteger) { return maxSafeInteger; }\n    return len;\n  }\n\n  /**\n   * This method creates a new Observable sequence from an array-like or iterable object.\n   * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n   * @param {Function} [mapFn] Map function to call on every element of the array.\n   * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n   * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n   */\n  var observableFrom = Observable.from = function (iterable, mapFn, thisArg, scheduler) {\n    if (iterable == null) {\n      throw new Error('iterable cannot be null.')\n    }\n    if (mapFn && !isFunction(mapFn)) {\n      throw new Error('mapFn when provided must be a function');\n    }\n    if (mapFn) {\n      var mapper = bindCallback(mapFn, thisArg, 2);\n    }\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    var list = Object(iterable), it = getIterable(list);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleRecursiveWithState(0, function (i, self) {\n        try {\n          var next = it.next();\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n        if (next.done) {\n          observer.onCompleted();\n          return;\n        }\n\n        var result = next.value;\n\n        if (mapper) {\n          try {\n            result = mapper(result, i);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n        }\n\n        observer.onNext(result);\n        self(i + 1);\n      });\n    });\n  };\n\n  var FromArrayObservable = (function(__super__) {\n    inherits(FromArrayObservable, __super__);\n    function FromArrayObservable(args, scheduler) {\n      this.args = args;\n      this.scheduler = scheduler || currentThreadScheduler;\n      __super__.call(this);\n    }\n\n    FromArrayObservable.prototype.subscribeCore = function (observer) {\n      var sink = new FromArraySink(observer, this);\n      return sink.run();\n    };\n\n    return FromArrayObservable;\n  }(ObservableBase));\n\n  var FromArraySink = (function () {\n    function FromArraySink(observer, parent) {\n      this.observer = observer;\n      this.parent = parent;\n    }\n\n    function loopRecursive(state, recurse) {\n      if (state.i < state.len) {\n        state.observer.onNext(state.args[state.i++]);\n        recurse(state);\n      } else {\n        state.observer.onCompleted();\n      }\n    }\n\n    FromArraySink.prototype.run = function () {\n      return this.parent.scheduler.scheduleRecursiveWithState(\n        {i: 0, args: this.parent.args, len: this.parent.args.length, observer: this.observer },\n        loopRecursive);\n    };\n\n    return FromArraySink;\n  }());\n\n  /**\n  *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n  * @deprecated use Observable.from or Observable.of\n  * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n  */\n  var observableFromArray = Observable.fromArray = function (array, scheduler) {\n    return new FromArrayObservable(array, scheduler)\n  };\n\n  /**\n   *  Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n   * @returns {Observable} An observable sequence whose observers will never get called.\n   */\n  var observableNever = Observable.never = function () {\n    return new AnonymousObservable(function () {\n      return disposableEmpty;\n    });\n  };\n\n  function observableOf (scheduler, array) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new AnonymousObservable(function (observer) {\n      var count = 0, len = array.length;\n      return scheduler.scheduleRecursive(function (self) {\n        if (count < len) {\n          observer.onNext(array[count++]);\n          self();\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  }\n\n  /**\n   *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n   * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n   */\n  Observable.of = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableOf(null, args);\n  };\n\n  /**\n   *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n   * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n   * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n   */\n  Observable.ofWithScheduler = function (scheduler) {\n    for(var args = [], i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableOf(scheduler, args);\n  };\n\n  /**\n   * Convert an object into an observable sequence of [key, value] pairs.\n   * @param {Object} obj The object to inspect.\n   * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n   * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n   */\n  Observable.pairs = function (obj, scheduler) {\n    scheduler || (scheduler = Rx.Scheduler.currentThread);\n    return new AnonymousObservable(function (observer) {\n      var keys = Object.keys(obj), len = keys.length;\n      return scheduler.scheduleRecursiveWithState(0, function (idx, self) {\n        if (idx < len) {\n          var key = keys[idx];\n          observer.onNext([key, obj[key]]);\n          self(idx + 1);\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.range(0, 10);\n   *  var res = Rx.Observable.range(0, 10, Rx.Scheduler.timeout);\n   * @param {Number} start The value of the first integer in the sequence.\n   * @param {Number} count The number of sequential integers to generate.\n   * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n   * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n   */\n  Observable.range = function (start, count, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleRecursiveWithState(0, function (i, self) {\n        if (i < count) {\n          observer.onNext(start + i);\n          self(i + 1);\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.repeat(42);\n   *  var res = Rx.Observable.repeat(42, 4);\n   *  3 - res = Rx.Observable.repeat(42, 4, Rx.Scheduler.timeout);\n   *  4 - res = Rx.Observable.repeat(42, null, Rx.Scheduler.timeout);\n   * @param {Mixed} value Element to repeat.\n   * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n   * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n   */\n  Observable.repeat = function (value, repeatCount, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return observableReturn(value, scheduler).repeat(repeatCount == null ? -1 : repeatCount);\n  };\n\n  /**\n   *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n   *  There is an alias called 'just', and 'returnValue' for browsers <IE9.\n   * @param {Mixed} value Single element in the resulting observable sequence.\n   * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence containing the single specified element.\n   */\n  var observableReturn = Observable['return'] = Observable.just = function (value, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.schedule(function () {\n        observer.onNext(value);\n        observer.onCompleted();\n      });\n    });\n  };\n\n  /** @deprecated use return or just */\n  Observable.returnValue = function () {\n    //deprecate('returnValue', 'return or just');\n    return observableReturn.apply(null, arguments);\n  };\n\n  /**\n   *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n   *  There is an alias to this method called 'throwError' for browsers <IE9.\n   * @param {Mixed} error An object used for the sequence's termination.\n   * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n   */\n  var observableThrow = Observable['throw'] = Observable.throwError = function (error, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.schedule(function () {\n        observer.onError(error);\n      });\n    });\n  };\n\n  /** @deprecated use #some instead */\n  Observable.throwException = function () {\n    //deprecate('throwException', 'throwError');\n    return Observable.throwError.apply(null, arguments);\n  };\n\n  function observableCatchHandler(source, handler) {\n    return new AnonymousObservable(function (observer) {\n      var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();\n      subscription.setDisposable(d1);\n      d1.setDisposable(source.subscribe(observer.onNext.bind(observer), function (exception) {\n        var d, result;\n        try {\n          result = handler(exception);\n        } catch (ex) {\n          observer.onError(ex);\n          return;\n        }\n        isPromise(result) && (result = observableFromPromise(result));\n\n        d = new SingleAssignmentDisposable();\n        subscription.setDisposable(d);\n        d.setDisposable(result.subscribe(observer));\n      }, observer.onCompleted.bind(observer)));\n\n      return subscription;\n    }, source);\n  }\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @example\n   * 1 - xs.catchException(ys)\n   * 2 - xs.catchException(function (ex) { return ys(ex); })\n   * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n   * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n   */\n  observableProto['catch'] = observableProto.catchError = function (handlerOrSecond) {\n    return typeof handlerOrSecond === 'function' ?\n      observableCatchHandler(this, handlerOrSecond) :\n      observableCatch([this, handlerOrSecond]);\n  };\n\n  /**\n   * @deprecated use #catch or #catchError instead.\n   */\n  observableProto.catchException = function (handlerOrSecond) {\n    //deprecate('catchException', 'catch or catchError');\n    return this.catchError(handlerOrSecond);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n   * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n   */\n  var observableCatch = Observable.catchError = Observable['catch'] = Observable.catchException = function () {\n    var items = [];\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { items.push(arguments[i]); }\n    }\n    return enumerableOf(items).catchError();\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   * This can be in the form of an argument list of observables or an array.\n   *\n   * @example\n   * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.combineLatest = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return combineLatest.apply(this, args);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   *\n   * @example\n   * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  var combineLatest = Observable.combineLatest = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    var resultSelector = args.pop();\n\n    if (Array.isArray(args[0])) {\n      args = args[0];\n    }\n\n    return new AnonymousObservable(function (observer) {\n      var falseFactory = function () { return false; },\n        n = args.length,\n        hasValue = arrayInitialize(n, falseFactory),\n        hasValueAll = false,\n        isDone = arrayInitialize(n, falseFactory),\n        values = new Array(n);\n\n      function next(i) {\n        var res;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          try {\n            res = resultSelector.apply(null, values);\n          } catch (ex) {\n            observer.onError(ex);\n            return;\n          }\n          observer.onNext(res);\n        } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n          observer.onCompleted();\n        }\n      }\n\n      function done (i) {\n        isDone[i] = true;\n        if (isDone.every(identity)) {\n          observer.onCompleted();\n        }\n      }\n\n      var subscriptions = new Array(n);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          var source = args[i], sad = new SingleAssignmentDisposable();\n          isPromise(source) && (source = observableFromPromise(source));\n          sad.setDisposable(source.subscribe(function (x) {\n              values[i] = x;\n              next(i);\n            },\n            function(e) { observer.onError(e); },\n            function () { done(i); }\n          ));\n          subscriptions[i] = sad;\n        }(idx));\n      }\n\n      return new CompositeDisposable(subscriptions);\n    }, this);\n  };\n\n  /**\n   * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  observableProto.concat = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    args.unshift(this);\n    return observableConcat.apply(null, args);\n  };\n\n  /**\n   * Concatenates all the observable sequences.\n   * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  var observableConcat = Observable.concat = function () {\n    var items = [];\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { items.push(arguments[i]); }\n    }\n    return enumerableOf(items).concat();\n  };\n\n  /**\n   * Concatenates an observable sequence of observable sequences.\n   * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n   */\n  observableProto.concatAll = observableProto.concatObservable = function () {\n    return this.merge(1);\n  };\n\n  /**\n   * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n   * Or merges two observable sequences into a single observable sequence.\n   *\n   * @example\n   * 1 - merged = sources.merge(1);\n   * 2 - merged = source.merge(otherSource);\n   * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n   * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n   */\n  observableProto.merge = function (maxConcurrentOrOther) {\n    if (typeof maxConcurrentOrOther !== 'number') { return observableMerge(this, maxConcurrentOrOther); }\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var activeCount = 0, group = new CompositeDisposable(), isStopped = false, q = [];\n\n      function subscribe(xs) {\n        var subscription = new SingleAssignmentDisposable();\n        group.add(subscription);\n\n        // Check for promises support\n        isPromise(xs) && (xs = observableFromPromise(xs));\n\n        subscription.setDisposable(xs.subscribe(function (x) { o.onNext(x); }, function (e) { o.onError(e); }, function () {\n          group.remove(subscription);\n          if (q.length > 0) {\n            subscribe(q.shift());\n          } else {\n            activeCount--;\n            isStopped && activeCount === 0 && o.onCompleted();\n          }\n        }));\n      }\n      group.add(sources.subscribe(function (innerSource) {\n        if (activeCount < maxConcurrentOrOther) {\n          activeCount++;\n          subscribe(innerSource);\n        } else {\n          q.push(innerSource);\n        }\n      }, function (e) { o.onError(e); }, function () {\n        isStopped = true;\n        activeCount === 0 && o.onCompleted();\n      }));\n      return group;\n    }, sources);\n  };\n\n  /**\n   * Merges all the observable sequences into a single observable sequence.\n   * The scheduler is optional and if not specified, the immediate scheduler is used.\n   * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n   */\n  var observableMerge = Observable.merge = function () {\n    var scheduler, sources = [], i, len = arguments.length;\n    if (!arguments[0]) {\n      scheduler = immediateScheduler;\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else if (isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else {\n      scheduler = immediateScheduler;\n      for(i = 0; i < len; i++) { sources.push(arguments[i]); }\n    }\n    if (Array.isArray(sources[0])) {\n      sources = sources[0];\n    }\n    return observableOf(scheduler, sources).mergeAll();\n  };\n\n  /**\n   * Merges an observable sequence of observable sequences into an observable sequence.\n   * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n   */\n  observableProto.mergeAll = function () {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable(),\n        isStopped = false,\n        m = new SingleAssignmentDisposable();\n\n      group.add(m);\n      m.setDisposable(sources.subscribe(function (innerSource) {\n        var innerSubscription = new SingleAssignmentDisposable();\n        group.add(innerSubscription);\n\n        // Check for promises support\n        isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n\n        innerSubscription.setDisposable(innerSource.subscribe(function (x) { o.onNext(x); }, function (e) { o.onError(e); }, function () {\n          group.remove(innerSubscription);\n          isStopped && group.length === 1 && o.onCompleted();\n        }));\n      }, function (e) { o.onError(e); }, function () {\n        isStopped = true;\n        group.length === 1 && o.onCompleted();\n      }));\n      return group;\n    }, sources);\n  };\n\n  /**\n   * @deprecated use #mergeAll instead.\n   */\n  observableProto.mergeObservable = function () {\n    //deprecate('mergeObservable', 'mergeAll');\n    return this.mergeAll.apply(this, arguments);\n  };\n\n  /**\n   * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n   * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n   */\n  observableProto.skipUntil = function (other) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var isOpen = false;\n      var disposables = new CompositeDisposable(source.subscribe(function (left) {\n        isOpen && o.onNext(left);\n      }, function (e) { o.onError(e); }, function () {\n        isOpen && o.onCompleted();\n      }));\n\n      isPromise(other) && (other = observableFromPromise(other));\n\n      var rightSubscription = new SingleAssignmentDisposable();\n      disposables.add(rightSubscription);\n      rightSubscription.setDisposable(other.subscribe(function () {\n        isOpen = true;\n        rightSubscription.dispose();\n      }, function (e) { o.onError(e); }, function () {\n        rightSubscription.dispose();\n      }));\n\n      return disposables;\n    }, source);\n  };\n\n  /**\n   * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n   * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n   */\n  observableProto['switch'] = observableProto.switchLatest = function () {\n    var sources = this;\n    return new AnonymousObservable(function (observer) {\n      var hasLatest = false,\n        innerSubscription = new SerialDisposable(),\n        isStopped = false,\n        latest = 0,\n        subscription = sources.subscribe(\n          function (innerSource) {\n            var d = new SingleAssignmentDisposable(), id = ++latest;\n            hasLatest = true;\n            innerSubscription.setDisposable(d);\n\n            // Check if Promise or Observable\n            isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n\n            d.setDisposable(innerSource.subscribe(\n              function (x) { latest === id && observer.onNext(x); },\n              function (e) { latest === id && observer.onError(e); },\n              function () {\n                if (latest === id) {\n                  hasLatest = false;\n                  isStopped && observer.onCompleted();\n                }\n              }));\n          },\n          function (e) { observer.onError(e); },\n          function () {\n            isStopped = true;\n            !hasLatest && observer.onCompleted();\n          });\n      return new CompositeDisposable(subscription, innerSubscription);\n    }, sources);\n  };\n\n  /**\n   * Returns the values from the source observable sequence until the other observable sequence produces a value.\n   * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n   */\n  observableProto.takeUntil = function (other) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      isPromise(other) && (other = observableFromPromise(other));\n      return new CompositeDisposable(\n        source.subscribe(o),\n        other.subscribe(function () { o.onCompleted(); }, function (e) { o.onError(e); }, noop)\n      );\n    }, source);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n   *\n   * @example\n   * 1 - obs = obs1.withLatestFrom(obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = obs1.withLatestFrom([obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.withLatestFrom = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    var resultSelector = args.pop(), source = this;\n\n    if (typeof source === 'undefined') {\n      throw new Error('Source observable not found for withLatestFrom().');\n    }\n    if (typeof resultSelector !== 'function') {\n      throw new Error('withLatestFrom() expects a resultSelector function.');\n    }\n    if (Array.isArray(args[0])) {\n      args = args[0];\n    }\n\n    return new AnonymousObservable(function (observer) {\n      var falseFactory = function () { return false; },\n        n = args.length,\n        hasValue = arrayInitialize(n, falseFactory),\n        hasValueAll = false,\n        values = new Array(n);\n\n      var subscriptions = new Array(n + 1);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          var other = args[i], sad = new SingleAssignmentDisposable();\n          isPromise(other) && (other = observableFromPromise(other));\n          sad.setDisposable(other.subscribe(function (x) {\n            values[i] = x;\n            hasValue[i] = true;\n            hasValueAll = hasValue.every(identity);\n          }, observer.onError.bind(observer), function () {}));\n          subscriptions[i] = sad;\n        }(idx));\n      }\n\n      var sad = new SingleAssignmentDisposable();\n      sad.setDisposable(source.subscribe(function (x) {\n        var res;\n        var allValues = [x].concat(values);\n        if (!hasValueAll) return;\n        try {\n          res = resultSelector.apply(null, allValues);\n        } catch (ex) {\n          observer.onError(ex);\n          return;\n        }\n        observer.onNext(res);\n      }, observer.onError.bind(observer), function () {\n        observer.onCompleted();\n      }));\n      subscriptions[n] = sad;\n\n      return new CompositeDisposable(subscriptions);\n    }, this);\n  };\n\n  function zipArray(second, resultSelector) {\n    var first = this;\n    return new AnonymousObservable(function (observer) {\n      var index = 0, len = second.length;\n      return first.subscribe(function (left) {\n        if (index < len) {\n          var right = second[index++], result;\n          try {\n            result = resultSelector(left, right);\n          } catch (e) {\n            return observer.onError(e);\n          }\n          observer.onNext(result);\n        } else {\n          observer.onCompleted();\n        }\n      }, function (e) { observer.onError(e); }, function () { observer.onCompleted(); });\n    }, first);\n  }\n\n  function falseFactory() { return false; }\n  function emptyArrayFactory() { return []; }\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n   * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n   *\n   * @example\n   * 1 - res = obs1.zip(obs2, fn);\n   * 1 - res = x1.zip([1,2,3], fn);\n   * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n   */\n  observableProto.zip = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    if (Array.isArray(args[0])) { return zipArray.apply(this, args); }\n    var parent = this, resultSelector = args.pop();\n    args.unshift(parent);\n    return new AnonymousObservable(function (observer) {\n      var n = args.length,\n        queues = arrayInitialize(n, emptyArrayFactory),\n        isDone = arrayInitialize(n, falseFactory);\n\n      function next(i) {\n        var res, queuedValues;\n        if (queues.every(function (x) { return x.length > 0; })) {\n          try {\n            queuedValues = queues.map(function (x) { return x.shift(); });\n            res = resultSelector.apply(parent, queuedValues);\n          } catch (ex) {\n            observer.onError(ex);\n            return;\n          }\n          observer.onNext(res);\n        } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n          observer.onCompleted();\n        }\n      };\n\n      function done(i) {\n        isDone[i] = true;\n        if (isDone.every(function (x) { return x; })) {\n          observer.onCompleted();\n        }\n      }\n\n      var subscriptions = new Array(n);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          var source = args[i], sad = new SingleAssignmentDisposable();\n          isPromise(source) && (source = observableFromPromise(source));\n          sad.setDisposable(source.subscribe(function (x) {\n            queues[i].push(x);\n            next(i);\n          }, function (e) { observer.onError(e); }, function () {\n            done(i);\n          }));\n          subscriptions[i] = sad;\n        })(idx);\n      }\n\n      return new CompositeDisposable(subscriptions);\n    }, parent);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n   * @param arguments Observable sources.\n   * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  Observable.zip = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    var first = args.shift();\n    return first.zip.apply(first, args);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n   * @param arguments Observable sources.\n   * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n   */\n  Observable.zipArray = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    }\n    return new AnonymousObservable(function (observer) {\n      var n = sources.length,\n        queues = arrayInitialize(n, function () { return []; }),\n        isDone = arrayInitialize(n, function () { return false; });\n\n      function next(i) {\n        if (queues.every(function (x) { return x.length > 0; })) {\n          var res = queues.map(function (x) { return x.shift(); });\n          observer.onNext(res);\n        } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n          observer.onCompleted();\n          return;\n        }\n      };\n\n      function done(i) {\n        isDone[i] = true;\n        if (isDone.every(identity)) {\n          observer.onCompleted();\n          return;\n        }\n      }\n\n      var subscriptions = new Array(n);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          subscriptions[i] = new SingleAssignmentDisposable();\n          subscriptions[i].setDisposable(sources[i].subscribe(function (x) {\n            queues[i].push(x);\n            next(i);\n          }, function (e) { observer.onError(e); }, function () {\n            done(i);\n          }));\n        })(idx);\n      }\n\n      return new CompositeDisposable(subscriptions);\n    });\n  };\n\n  /**\n   *  Hides the identity of an observable sequence.\n   * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n   */\n  observableProto.asObservable = function () {\n    var source = this;\n    return new AnonymousObservable(function (o) { return source.subscribe(o); }, this);\n  };\n\n  /**\n   * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n   * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n   */\n  observableProto.dematerialize = function () {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(function (x) { return x.accept(o); }, function(e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, this);\n  };\n\n  /**\n   *  Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.\n   *\n   *  var obs = observable.distinctUntilChanged();\n   *  var obs = observable.distinctUntilChanged(function (x) { return x.id; });\n   *  var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; });\n   *\n   * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value.\n   * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n   * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinctUntilChanged = function (keySelector, comparer) {\n    var source = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var hasCurrentKey = false, currentKey;\n      return source.subscribe(function (value) {\n        var key = value;\n        if (keySelector) {\n          try {\n            key = keySelector(value);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        if (hasCurrentKey) {\n          try {\n            var comparerEquals = comparer(currentKey, key);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        if (!hasCurrentKey || !comparerEquals) {\n          hasCurrentKey = true;\n          currentKey = key;\n          o.onNext(value);\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, this);\n  };\n\n  /**\n   *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n   * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n   * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto['do'] = observableProto.tap = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) {\n    var source = this, tapObserver = typeof observerOrOnNext === 'function' || typeof observerOrOnNext === 'undefined'?\n      observerCreate(observerOrOnNext || noop, onError || noop, onCompleted || noop) :\n      observerOrOnNext;\n    return new AnonymousObservable(function (observer) {\n      return source.subscribe(function (x) {\n        try {\n          tapObserver.onNext(x);\n        } catch (e) {\n          observer.onError(e);\n        }\n        observer.onNext(x);\n      }, function (err) {\n          try {\n            tapObserver.onError(err);\n          } catch (e) {\n            observer.onError(e);\n          }\n        observer.onError(err);\n      }, function () {\n        try {\n          tapObserver.onCompleted();\n        } catch (e) {\n          observer.onError(e);\n        }\n        observer.onCompleted();\n      });\n    }, this);\n  };\n\n  /**\n   *  Invokes an action for each element in the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function} onNext Action to invoke for each element in the observable sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto.doOnNext = observableProto.tapOnNext = function (onNext, thisArg) {\n    return this.tap(typeof thisArg !== 'undefined' ? function (x) { onNext.call(thisArg, x); } : onNext);\n  };\n\n  /**\n   *  Invokes an action upon exceptional termination of the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto.doOnError = observableProto.tapOnError = function (onError, thisArg) {\n    return this.tap(noop, typeof thisArg !== 'undefined' ? function (e) { onError.call(thisArg, e); } : onError);\n  };\n\n  /**\n   *  Invokes an action upon graceful termination of the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto.doOnCompleted = observableProto.tapOnCompleted = function (onCompleted, thisArg) {\n    return this.tap(noop, null, typeof thisArg !== 'undefined' ? function () { onCompleted.call(thisArg); } : onCompleted);\n  };\n\n  /**\n   *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n   * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n   * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n   */\n  observableProto['finally'] = observableProto.ensure = function (action) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var subscription;\n      try {\n        subscription = source.subscribe(observer);\n      } catch (e) {\n        action();\n        throw e;\n      }\n      return disposableCreate(function () {\n        try {\n          subscription.dispose();\n        } catch (e) {\n          throw e;\n        } finally {\n          action();\n        }\n      });\n    }, this);\n  };\n\n  /**\n   * @deprecated use #finally or #ensure instead.\n   */\n  observableProto.finallyAction = function (action) {\n    //deprecate('finallyAction', 'finally or ensure');\n    return this.ensure(action);\n  };\n\n  /**\n   *  Ignores all elements in an observable sequence leaving only the termination messages.\n   * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n   */\n  observableProto.ignoreElements = function () {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(noop, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n   * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n   */\n  observableProto.materialize = function () {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      return source.subscribe(function (value) {\n        observer.onNext(notificationCreateOnNext(value));\n      }, function (e) {\n        observer.onNext(notificationCreateOnError(e));\n        observer.onCompleted();\n      }, function () {\n        observer.onNext(notificationCreateOnCompleted());\n        observer.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n   * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n   * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n   */\n  observableProto.repeat = function (repeatCount) {\n    return enumerableRepeat(this, repeatCount).concat();\n  };\n\n  /**\n   *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n   *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n   *\n   * @example\n   *  var res = retried = retry.repeat();\n   *  var res = retried = retry.repeat(2);\n   * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retry = function (retryCount) {\n    return enumerableRepeat(this, retryCount).catchError();\n  };\n\n  /**\n   *  Repeats the source observable sequence upon error each time the notifier emits or until it successfully terminates. \n   *  if the notifier completes, the observable sequence completes.\n   *\n   * @example\n   *  var timer = Observable.timer(500);\n   *  var source = observable.retryWhen(timer);\n   * @param {Observable} [notifier] An observable that triggers the retries or completes the observable with onNext or onCompleted respectively.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retryWhen = function (notifier) {\n    return enumerableRepeat(this).catchErrorWhen(notifier);\n  };\n  /**\n   *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n   *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n   * @example\n   *  var res = source.scan(function (acc, x) { return acc + x; });\n   *  var res = source.scan(0, function (acc, x) { return acc + x; });\n   * @param {Mixed} [seed] The initial accumulator value.\n   * @param {Function} accumulator An accumulator function to be invoked on each element.\n   * @returns {Observable} An observable sequence containing the accumulated values.\n   */\n  observableProto.scan = function () {\n    var hasSeed = false, seed, accumulator, source = this;\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[0];\n      accumulator = arguments[1];\n    } else {\n      accumulator = arguments[0];\n    }\n    return new AnonymousObservable(function (o) {\n      var hasAccumulation, accumulation, hasValue;\n      return source.subscribe (\n        function (x) {\n          !hasValue && (hasValue = true);\n          try {\n            if (hasAccumulation) {\n              accumulation = accumulator(accumulation, x);\n            } else {\n              accumulation = hasSeed ? accumulator(seed, x) : x;\n              hasAccumulation = true;\n            }\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n\n          o.onNext(accumulation);\n        },\n        function (e) { o.onError(e); },\n        function () {\n          !hasValue && hasSeed && o.onNext(seed);\n          o.onCompleted();\n        }\n      );\n    }, source);\n  };\n\n  /**\n   *  Bypasses a specified number of elements at the end of an observable sequence.\n   * @description\n   *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n   *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n   * @param count Number of elements to bypass at the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n   */\n  observableProto.skipLast = function (count) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        q.push(x);\n        q.length > count && o.onNext(q.shift());\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n   *  @example\n   *  var res = source.startWith(1, 2, 3);\n   *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n   * @param {Arguments} args The specified values to prepend to the observable sequence\n   * @returns {Observable} The source sequence prepended with the specified values.\n   */\n  observableProto.startWith = function () {\n    var values, scheduler, start = 0;\n    if (!!arguments.length && isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      start = 1;\n    } else {\n      scheduler = immediateScheduler;\n    }\n    for(var args = [], i = start, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return enumerableOf([observableFromArray(args, scheduler), this]).concat();\n  };\n\n  /**\n   *  Returns a specified number of contiguous elements from the end of an observable sequence.\n   * @description\n   *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n   *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLast = function (count) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        q.push(x);\n        q.length > count && q.shift();\n      }, function (e) { o.onError(e); }, function () {\n        while (q.length > 0) { o.onNext(q.shift()); }\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  function concatMap(source, selector, thisArg) {\n    var selectorFunc = bindCallback(selector, thisArg, 3);\n    return source.map(function (x, i) {\n      var result = selectorFunc(x, i, source);\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));\n      return result;\n    }).concatAll();\n  }\n\n  /**\n   *  One of the Following:\n   *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   * @example\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n   *  Or:\n   *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n   *\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n   *  Or:\n   *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n   * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n   * source sequence onto which could be either an observable or Promise.\n   * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n   */\n  observableProto.selectConcat = observableProto.concatMap = function (selector, resultSelector, thisArg) {\n    if (isFunction(selector) && isFunction(resultSelector)) {\n      return this.concatMap(function (x, i) {\n        var selectorResult = selector(x, i);\n        isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));\n        (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));\n\n        return selectorResult.map(function (y, i2) {\n          return resultSelector(x, y, i, i2);\n        });\n      });\n    }\n    return isFunction(selector) ?\n      concatMap(this, selector, thisArg) :\n      concatMap(this, function () { return selector; });\n  };\n\n  var MapObservable = (function (__super__) {\n    inherits(MapObservable, __super__);\n\n    function MapObservable(source, selector, thisArg) {\n      this.source = source;\n      this.selector = bindCallback(selector, thisArg, 3);\n      __super__.call(this);\n    }\n\n    MapObservable.prototype.internalMap = function (selector, thisArg) {\n      var self = this;\n      return new MapObservable(this.source, function (x, i, o) { return selector(self.selector(x, i, o), i, o); }, thisArg)\n    };\n\n    MapObservable.prototype.subscribeCore = function (observer) {\n      return this.source.subscribe(new MapObserver(observer, this.selector, this));\n    };\n\n    return MapObservable;\n\n  }(ObservableBase));\n\n  function MapObserver(observer, selector, source) {\n    this.observer = observer;\n    this.selector = selector;\n    this.source = source;\n    this.index = 0;\n    this.isStopped = false;\n  }\n\n  MapObserver.prototype.onNext = function(x) {\n    if (this.isStopped) { return; }\n    try {\n      var result = this.selector(x, this.index++, this.source);\n    } catch(e) {\n      return this.observer.onError(e);\n    }\n    this.observer.onNext(result);\n  };\n  MapObserver.prototype.onError = function (e) {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onError(e); }\n  };\n  MapObserver.prototype.onCompleted = function () {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onCompleted(); }\n  };\n  MapObserver.prototype.dispose = function() { this.isStopped = true; };\n  MapObserver.prototype.fail = function (e) {\n    if (!this.isStopped) {\n      this.isStopped = true;\n      this.observer.onError(e);\n      return true;\n    }\n\n    return false;\n  };\n\n  /**\n  * Projects each element of an observable sequence into a new form by incorporating the element's index.\n  * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n  */\n  observableProto.map = observableProto.select = function (selector, thisArg) {\n    var selectorFn = typeof selector === 'function' ? selector : function () { return selector; };\n    return this instanceof MapObservable ?\n      this.internalMap(selector, thisArg) :\n      new MapObservable(this, selectorFn, thisArg);\n  };\n\n  /**\n   * Retrieves the value of a specified nested property from all elements in\n   * the Observable sequence.\n   * @param {Arguments} arguments The nested properties to pluck.\n   * @returns {Observable} Returns a new Observable sequence of property values.\n   */\n  observableProto.pluck = function () {\n    var args = arguments, len = arguments.length;\n    if (len === 0) { throw new Error('List of properties cannot be empty.'); }\n    return this.map(function (x) {\n      var currentProp = x;\n      for (var i = 0; i < len; i++) {\n        var p = currentProp[args[i]];\n        if (typeof p !== 'undefined') {\n          currentProp = p;\n        } else {\n          return undefined;\n        }\n      }\n      return currentProp;\n    });\n  };\n\n  function flatMap(source, selector, thisArg) {\n    var selectorFunc = bindCallback(selector, thisArg, 3);\n    return source.map(function (x, i) {\n      var result = selectorFunc(x, i, source);\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));\n      return result;\n    }).mergeAll();\n  }\n\n  /**\n   *  One of the Following:\n   *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   * @example\n   *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n   *  Or:\n   *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n   *\n   *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n   *  Or:\n   *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n   * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n   * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n   */\n  observableProto.selectMany = observableProto.flatMap = function (selector, resultSelector, thisArg) {\n    if (isFunction(selector) && isFunction(resultSelector)) {\n      return this.flatMap(function (x, i) {\n        var selectorResult = selector(x, i);\n        isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));\n        (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));\n\n        return selectorResult.map(function (y, i2) {\n          return resultSelector(x, y, i, i2);\n        });\n      }, thisArg);\n    }\n    return isFunction(selector) ?\n      flatMap(this, selector, thisArg) :\n      flatMap(this, function () { return selector; });\n  };\n\n  /**\n   *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n   *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n   * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n   *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n   */\n  observableProto.selectSwitch = observableProto.flatMapLatest = observableProto.switchMap = function (selector, thisArg) {\n    return this.select(selector, thisArg).switchLatest();\n  };\n\n  /**\n   * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n   * @param {Number} count The number of elements to skip before returning the remaining elements.\n   * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n   */\n  observableProto.skip = function (count) {\n    if (count < 0) { throw new Error(argumentOutOfRange); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var remaining = count;\n      return source.subscribe(function (x) {\n        if (remaining <= 0) {\n          o.onNext(x);\n        } else {\n          remaining--;\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n   *  The element's index is used in the logic of the predicate function.\n   *\n   *  var res = source.skipWhile(function (value) { return value < 10; });\n   *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n   */\n  observableProto.skipWhile = function (predicate, thisArg) {\n    var source = this,\n        callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      var i = 0, running = false;\n      return source.subscribe(function (x) {\n        if (!running) {\n          try {\n            running = !callback(x, i++, source);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        running && o.onNext(x);\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n   *\n   *  var res = source.take(5);\n   *  var res = source.take(0, Rx.Scheduler.timeout);\n   * @param {Number} count The number of elements to return.\n   * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n   * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n   */\n  observableProto.take = function (count, scheduler) {\n    if (count < 0) { throw new RangeError(argumentOutOfRange); }\n    if (count === 0) { return observableEmpty(scheduler); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var remaining = count;\n      return source.subscribe(function (x) {\n        if (remaining-- > 0) {\n          o.onNext(x);\n          remaining === 0 && o.onCompleted();\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Returns elements from an observable sequence as long as a specified condition is true.\n   *  The element's index is used in the logic of the predicate function.\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n   */\n  observableProto.takeWhile = function (predicate, thisArg) {\n    var source = this,\n        callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      var i = 0, running = true;\n      return source.subscribe(function (x) {\n        if (running) {\n          try {\n            running = callback(x, i++, source);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n          if (running) {\n            o.onNext(x);\n          } else {\n            o.onCompleted();\n          }\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  var FilterObservable = (function (__super__) {\n    inherits(FilterObservable, __super__);\n\n    function FilterObservable(source, predicate, thisArg) {\n      this.source = source;\n      this.predicate = bindCallback(predicate, thisArg, 3);\n      __super__.call(this);\n    }\n\n    FilterObservable.prototype.subscribeCore = function (observer) {\n      return this.source.subscribe(new FilterObserver(observer, this.predicate, this));\n    };\n\n    FilterObservable.prototype.internalFilter = function(predicate, thisArg) {\n      var self = this;\n      return new FilterObservable(this.source, function(x, i, o) { return self.predicate(x, i, o) && predicate(x, i, o); }, thisArg);\n    };\n\n    return FilterObservable;\n\n  }(ObservableBase));\n\n  function FilterObserver(observer, predicate, source) {\n    this.observer = observer;\n    this.predicate = predicate;\n    this.source = source;\n    this.index = 0;\n    this.isStopped = false;\n  }\n\n  FilterObserver.prototype.onNext = function(x) {\n    try {\n      var shouldYield = this.predicate(x, this.index++, this.source);\n    } catch(e) {\n      return this.observer.onError(e);\n    }\n    shouldYield && this.observer.onNext(x);\n  };\n\n  FilterObserver.prototype.onError = function (e) {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onError(e); }\n  };\n  FilterObserver.prototype.onCompleted = function () {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onCompleted(); }\n  };\n  FilterObserver.prototype.dispose = function() { this.isStopped = true; };\n  FilterObserver.prototype.fail = function (e) {\n    if (!this.isStopped) {\n      this.isStopped = true;\n      this.observer.onError(e);\n      return true;\n    }\n\n    return false;\n  };\n\n\n\n  /**\n  *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n  * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n  */\n  observableProto.filter = observableProto.where = function (predicate, thisArg) {\n    return this instanceof FilterObservable ? this.internalFilter(predicate, thisArg) :\n      new FilterObservable(this, predicate, thisArg);\n  };\n\n  /**\n   * Converts a callback function to an observable sequence.\n   *\n   * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n   * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n   */\n  Observable.fromCallback = function (func, context, selector) {\n    return function () {\n      for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n      return new AnonymousObservable(function (observer) {\n        function handler() {\n          var results = arguments;\n\n          if (selector) {\n            try {\n              results = selector(results);\n            } catch (err) {\n              return observer.onError(err);\n            }\n\n            observer.onNext(results);\n          } else {\n            if (results.length <= 1) {\n              observer.onNext.apply(observer, results);\n            } else {\n              observer.onNext(results);\n            }\n          }\n\n          observer.onCompleted();\n        }\n\n        args.push(handler);\n        func.apply(context, args);\n      }).publishLast().refCount();\n    };\n  };\n\n  /**\n   * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n   * @param {Function} func The function to call\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n   * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n   */\n  Observable.fromNodeCallback = function (func, context, selector) {\n    return function () {\n      for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n      return new AnonymousObservable(function (observer) {\n        function handler(err) {\n          if (err) {\n            observer.onError(err);\n            return;\n          }\n\n          for(var results = [], i = 1, len = arguments.length; i < len; i++) { results.push(arguments[i]); }\n\n          if (selector) {\n            try {\n              results = selector(results);\n            } catch (e) {\n              return observer.onError(e);\n            }\n            observer.onNext(results);\n          } else {\n            if (results.length <= 1) {\n              observer.onNext.apply(observer, results);\n            } else {\n              observer.onNext(results);\n            }\n          }\n\n          observer.onCompleted();\n        }\n\n        args.push(handler);\n        func.apply(context, args);\n      }).publishLast().refCount();\n    };\n  };\n\n  function fixEvent(event) {\n    var stopPropagation = function () {\n      this.cancelBubble = true;\n    };\n\n    var preventDefault = function () {\n      this.bubbledKeyCode = this.keyCode;\n      if (this.ctrlKey) {\n        try {\n          this.keyCode = 0;\n        } catch (e) { }\n      }\n      this.defaultPrevented = true;\n      this.returnValue = false;\n      this.modified = true;\n    };\n\n    event || (event = root.event);\n    if (!event.target) {\n      event.target = event.target || event.srcElement;\n\n      if (event.type == 'mouseover') {\n        event.relatedTarget = event.fromElement;\n      }\n      if (event.type == 'mouseout') {\n        event.relatedTarget = event.toElement;\n      }\n      // Adding stopPropogation and preventDefault to IE\n      if (!event.stopPropagation) {\n        event.stopPropagation = stopPropagation;\n        event.preventDefault = preventDefault;\n      }\n      // Normalize key events\n      switch (event.type) {\n        case 'keypress':\n          var c = ('charCode' in event ? event.charCode : event.keyCode);\n          if (c == 10) {\n            c = 0;\n            event.keyCode = 13;\n          } else if (c == 13 || c == 27) {\n            c = 0;\n          } else if (c == 3) {\n            c = 99;\n          }\n          event.charCode = c;\n          event.keyChar = event.charCode ? String.fromCharCode(event.charCode) : '';\n          break;\n      }\n    }\n\n    return event;\n  }\n\n  function createListener (element, name, handler) {\n    // Standards compliant\n    if (element.addEventListener) {\n      element.addEventListener(name, handler, false);\n      return disposableCreate(function () {\n        element.removeEventListener(name, handler, false);\n      });\n    }\n    if (element.attachEvent) {\n      // IE Specific\n      var innerHandler = function (event) {\n        handler(fixEvent(event));\n      };\n      element.attachEvent('on' + name, innerHandler);\n      return disposableCreate(function () {\n        element.detachEvent('on' + name, innerHandler);\n      });\n    }\n    // Level 1 DOM Events\n    element['on' + name] = handler;\n    return disposableCreate(function () {\n      element['on' + name] = null;\n    });\n  }\n\n  function createEventListener (el, eventName, handler) {\n    var disposables = new CompositeDisposable();\n\n    // Asume NodeList\n    if (Object.prototype.toString.call(el) === '[object NodeList]') {\n      for (var i = 0, len = el.length; i < len; i++) {\n        disposables.add(createEventListener(el.item(i), eventName, handler));\n      }\n    } else if (el) {\n      disposables.add(createListener(el, eventName, handler));\n    }\n\n    return disposables;\n  }\n\n  /**\n   * Configuration option to determine whether to use native events only\n   */\n  Rx.config.useNativeEvents = false;\n\n  /**\n   * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n   *\n   * @example\n   *   var source = Rx.Observable.fromEvent(element, 'mouseup');\n   *\n   * @param {Object} element The DOMElement or NodeList to attach a listener.\n   * @param {String} eventName The event name to attach the observable sequence.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n   */\n  Observable.fromEvent = function (element, eventName, selector) {\n    // Node.js specific\n    if (element.addListener) {\n      return fromEventPattern(\n        function (h) { element.addListener(eventName, h); },\n        function (h) { element.removeListener(eventName, h); },\n        selector);\n    }\n\n    // Use only if non-native events are allowed\n    if (!Rx.config.useNativeEvents) {\n      // Handles jq, Angular.js, Zepto, Marionette\n      if (typeof element.on === 'function' && typeof element.off === 'function') {\n        return fromEventPattern(\n          function (h) { element.on(eventName, h); },\n          function (h) { element.off(eventName, h); },\n          selector);\n      }\n      if (!!root.Ember && typeof root.Ember.addListener === 'function') {\n        return fromEventPattern(\n          function (h) { Ember.addListener(element, eventName, h); },\n          function (h) { Ember.removeListener(element, eventName, h); },\n          selector);\n        }\n    }\n    return new AnonymousObservable(function (observer) {\n      return createEventListener(\n        element,\n        eventName,\n        function handler (e) {\n          var results = e;\n\n          if (selector) {\n            try {\n              results = selector(arguments);\n            } catch (err) {\n              observer.onError(err);\n              return\n            }\n          }\n\n          observer.onNext(results);\n        });\n    }).publish().refCount();\n  };\n\n  /**\n   * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n   * @param {Function} addHandler The function to add a handler to the emitter.\n   * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence which wraps an event from an event emitter\n   */\n  var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) {\n    return new AnonymousObservable(function (observer) {\n      function innerHandler (e) {\n        var result = e;\n        if (selector) {\n          try {\n            result = selector(arguments);\n          } catch (err) {\n            observer.onError(err);\n            return;\n          }\n        }\n        observer.onNext(result);\n      }\n\n      var returnValue = addHandler(innerHandler);\n      return disposableCreate(function () {\n        if (removeHandler) {\n          removeHandler(innerHandler, returnValue);\n        }\n      });\n    }).publish().refCount();\n  };\n\n  /**\n   * Converts a Promise to an Observable sequence\n   * @param {Promise} An ES6 Compliant promise.\n   * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n   */\n  var observableFromPromise = Observable.fromPromise = function (promise) {\n    return observableDefer(function () {\n      var subject = new Rx.AsyncSubject();\n\n      promise.then(\n        function (value) {\n          subject.onNext(value);\n          subject.onCompleted();\n        },\n        subject.onError.bind(subject));\n\n      return subject;\n    });\n  };\n\n  /*\n   * Converts an existing observable sequence to an ES6 Compatible Promise\n   * @example\n   * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n   *\n   * // With config\n   * Rx.config.Promise = RSVP.Promise;\n   * var promise = Rx.Observable.return(42).toPromise();\n   * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n   * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n   */\n  observableProto.toPromise = function (promiseCtor) {\n    promiseCtor || (promiseCtor = Rx.config.Promise);\n    if (!promiseCtor) { throw new TypeError('Promise type not provided nor in Rx.config.Promise'); }\n    var source = this;\n    return new promiseCtor(function (resolve, reject) {\n      // No cancellation can be done\n      var value, hasValue = false;\n      source.subscribe(function (v) {\n        value = v;\n        hasValue = true;\n      }, reject, function () {\n        hasValue && resolve(value);\n      });\n    });\n  };\n\n  /**\n   * Invokes the asynchronous function, surfacing the result through an observable sequence.\n   * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   */\n  Observable.startAsync = function (functionAsync) {\n    var promise;\n    try {\n      promise = functionAsync();\n    } catch (e) {\n      return observableThrow(e);\n    }\n    return observableFromPromise(promise);\n  }\n\n  /**\n   * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n   * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n   * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n   *\n   * @example\n   * 1 - res = source.multicast(observable);\n   * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n   *\n   * @param {Function|Subject} subjectOrSubjectSelector\n   * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n   * Or:\n   * Subject to push source elements into.\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.multicast = function (subjectOrSubjectSelector, selector) {\n    var source = this;\n    return typeof subjectOrSubjectSelector === 'function' ?\n      new AnonymousObservable(function (observer) {\n        var connectable = source.multicast(subjectOrSubjectSelector());\n        return new CompositeDisposable(selector(connectable).subscribe(observer), connectable.connect());\n      }, source) :\n      new ConnectableObservable(source, subjectOrSubjectSelector);\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of Multicast using a regular Subject.\n   *\n   * @example\n   * var resres = source.publish();\n   * var res = source.publish(function (x) { return x; });\n   *\n   * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publish = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new Subject(); }, selector) :\n      this.multicast(new Subject());\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.share = function () {\n    return this.publish().refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n   * This operator is a specialization of Multicast using a AsyncSubject.\n   *\n   * @example\n   * var res = source.publishLast();\n   * var res = source.publishLast(function (x) { return x; });\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishLast = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new AsyncSubject(); }, selector) :\n      this.multicast(new AsyncSubject());\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n   * This operator is a specialization of Multicast using a BehaviorSubject.\n   *\n   * @example\n   * var res = source.publishValue(42);\n   * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishValue = function (initialValueOrSelector, initialValue) {\n    return arguments.length === 2 ?\n      this.multicast(function () {\n        return new BehaviorSubject(initialValue);\n      }, initialValueOrSelector) :\n      this.multicast(new BehaviorSubject(initialValueOrSelector));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n   * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareValue = function (initialValue) {\n    return this.publishValue(initialValue).refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of Multicast using a ReplaySubject.\n   *\n   * @example\n   * var res = source.replay(null, 3);\n   * var res = source.replay(null, 3, 500);\n   * var res = source.replay(null, 3, 500, scheduler);\n   * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.replay = function (selector, bufferSize, window, scheduler) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new ReplaySubject(bufferSize, window, scheduler); }, selector) :\n      this.multicast(new ReplaySubject(bufferSize, window, scheduler));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   *\n   * @example\n   * var res = source.shareReplay(3);\n   * var res = source.shareReplay(3, 500);\n   * var res = source.shareReplay(3, 500, scheduler);\n   *\n\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareReplay = function (bufferSize, window, scheduler) {\n    return this.replay(null, bufferSize, window, scheduler).refCount();\n  };\n\n  var ConnectableObservable = Rx.ConnectableObservable = (function (__super__) {\n    inherits(ConnectableObservable, __super__);\n\n    function ConnectableObservable(source, subject) {\n      var hasSubscription = false,\n        subscription,\n        sourceObservable = source.asObservable();\n\n      this.connect = function () {\n        if (!hasSubscription) {\n          hasSubscription = true;\n          subscription = new CompositeDisposable(sourceObservable.subscribe(subject), disposableCreate(function () {\n            hasSubscription = false;\n          }));\n        }\n        return subscription;\n      };\n\n      __super__.call(this, function (o) { return subject.subscribe(o); });\n    }\n\n    ConnectableObservable.prototype.refCount = function () {\n      var connectableSubscription, count = 0, source = this;\n      return new AnonymousObservable(function (observer) {\n          var shouldConnect = ++count === 1,\n            subscription = source.subscribe(observer);\n          shouldConnect && (connectableSubscription = source.connect());\n          return function () {\n            subscription.dispose();\n            --count === 0 && connectableSubscription.dispose();\n          };\n      });\n    };\n\n    return ConnectableObservable;\n  }(Observable));\n\n  function observableTimerDate(dueTime, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleWithAbsolute(dueTime, function () {\n        observer.onNext(0);\n        observer.onCompleted();\n      });\n    });\n  }\n\n  function observableTimerDateAndPeriod(dueTime, period, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var d = dueTime, p = normalizeTime(period);\n      return scheduler.scheduleRecursiveWithAbsoluteAndState(0, d, function (count, self) {\n        if (p > 0) {\n          var now = scheduler.now();\n          d = d + p;\n          d <= now && (d = now + p);\n        }\n        observer.onNext(count);\n        self(count + 1, d);\n      });\n    });\n  }\n\n  function observableTimerTimeSpan(dueTime, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleWithRelative(normalizeTime(dueTime), function () {\n        observer.onNext(0);\n        observer.onCompleted();\n      });\n    });\n  }\n\n  function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) {\n    return dueTime === period ?\n      new AnonymousObservable(function (observer) {\n        return scheduler.schedulePeriodicWithState(0, period, function (count) {\n          observer.onNext(count);\n          return count + 1;\n        });\n      }) :\n      observableDefer(function () {\n        return observableTimerDateAndPeriod(scheduler.now() + dueTime, period, scheduler);\n      });\n  }\n\n  /**\n   *  Returns an observable sequence that produces a value after each period.\n   *\n   * @example\n   *  1 - res = Rx.Observable.interval(1000);\n   *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n   *\n   * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n   * @returns {Observable} An observable sequence that produces a value after each period.\n   */\n  var observableinterval = Observable.interval = function (period, scheduler) {\n    return observableTimerTimeSpanAndPeriod(period, period, isScheduler(scheduler) ? scheduler : timeoutScheduler);\n  };\n\n  /**\n   *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n   * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n   */\n  var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) {\n    var period;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    if (periodOrScheduler !== undefined && typeof periodOrScheduler === 'number') {\n      period = periodOrScheduler;\n    } else if (isScheduler(periodOrScheduler)) {\n      scheduler = periodOrScheduler;\n    }\n    if (dueTime instanceof Date && period === undefined) {\n      return observableTimerDate(dueTime.getTime(), scheduler);\n    }\n    if (dueTime instanceof Date && period !== undefined) {\n      period = periodOrScheduler;\n      return observableTimerDateAndPeriod(dueTime.getTime(), period, scheduler);\n    }\n    return period === undefined ?\n      observableTimerTimeSpan(dueTime, scheduler) :\n      observableTimerTimeSpanAndPeriod(dueTime, period, scheduler);\n  };\n\n  function observableDelayTimeSpan(source, dueTime, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var active = false,\n        cancelable = new SerialDisposable(),\n        exception = null,\n        q = [],\n        running = false,\n        subscription;\n      subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) {\n        var d, shouldRun;\n        if (notification.value.kind === 'E') {\n          q = [];\n          q.push(notification);\n          exception = notification.value.exception;\n          shouldRun = !running;\n        } else {\n          q.push({ value: notification.value, timestamp: notification.timestamp + dueTime });\n          shouldRun = !active;\n          active = true;\n        }\n        if (shouldRun) {\n          if (exception !== null) {\n            observer.onError(exception);\n          } else {\n            d = new SingleAssignmentDisposable();\n            cancelable.setDisposable(d);\n            d.setDisposable(scheduler.scheduleRecursiveWithRelative(dueTime, function (self) {\n              var e, recurseDueTime, result, shouldRecurse;\n              if (exception !== null) {\n                return;\n              }\n              running = true;\n              do {\n                result = null;\n                if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) {\n                  result = q.shift().value;\n                }\n                if (result !== null) {\n                  result.accept(observer);\n                }\n              } while (result !== null);\n              shouldRecurse = false;\n              recurseDueTime = 0;\n              if (q.length > 0) {\n                shouldRecurse = true;\n                recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now());\n              } else {\n                active = false;\n              }\n              e = exception;\n              running = false;\n              if (e !== null) {\n                observer.onError(e);\n              } else if (shouldRecurse) {\n                self(recurseDueTime);\n              }\n            }));\n          }\n        }\n      });\n      return new CompositeDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  function observableDelayDate(source, dueTime, scheduler) {\n    return observableDefer(function () {\n      return observableDelayTimeSpan(source, dueTime - scheduler.now(), scheduler);\n    });\n  }\n\n  /**\n   *  Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n   *\n   * @example\n   *  1 - res = Rx.Observable.delay(new Date());\n   *  2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout);\n   *\n   *  3 - res = Rx.Observable.delay(5000);\n   *  4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout);\n   * @memberOf Observable#\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n   * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delay = function (dueTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return dueTime instanceof Date ?\n      observableDelayDate(this, dueTime.getTime(), scheduler) :\n      observableDelayTimeSpan(this, dueTime, scheduler);\n  };\n\n  /**\n   *  Ignores values from an observable sequence which are followed by another value before dueTime.\n   * @param {Number} dueTime Duration of the debounce period for each value (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler]  Scheduler to run the debounce timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The debounced sequence.\n   */\n  observableProto.debounce = observableProto.throttleWithTimeout = function (dueTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var cancelable = new SerialDisposable(), hasvalue = false, value, id = 0;\n      var subscription = source.subscribe(\n        function (x) {\n          hasvalue = true;\n          value = x;\n          id++;\n          var currentId = id,\n            d = new SingleAssignmentDisposable();\n          cancelable.setDisposable(d);\n          d.setDisposable(scheduler.scheduleWithRelative(dueTime, function () {\n            hasvalue && id === currentId && observer.onNext(value);\n            hasvalue = false;\n          }));\n        },\n        function (e) {\n          cancelable.dispose();\n          observer.onError(e);\n          hasvalue = false;\n          id++;\n        },\n        function () {\n          cancelable.dispose();\n          hasvalue && observer.onNext(value);\n          observer.onCompleted();\n          hasvalue = false;\n          id++;\n        });\n      return new CompositeDisposable(subscription, cancelable);\n    }, this);\n  };\n\n  /**\n   * @deprecated use #debounce or #throttleWithTimeout instead.\n   */\n  observableProto.throttle = function(dueTime, scheduler) {\n    //deprecate('throttle', 'debounce or throttleWithTimeout');\n    return this.debounce(dueTime, scheduler);\n  };\n\n  /**\n   *  Records the timestamp for each value in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n   *  2 - res = source.timestamp(Rx.Scheduler.timeout);\n   *\n   * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence with timestamp information on values.\n   */\n  observableProto.timestamp = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return this.map(function (x) {\n      return { value: x, timestamp: scheduler.now() };\n    });\n  };\n\n  function sampleObservable(source, sampler) {\n    return new AnonymousObservable(function (observer) {\n      var atEnd, value, hasValue;\n\n      function sampleSubscribe() {\n        if (hasValue) {\n          hasValue = false;\n          observer.onNext(value);\n        }\n        atEnd && observer.onCompleted();\n      }\n\n      return new CompositeDisposable(\n        source.subscribe(function (newValue) {\n          hasValue = true;\n          value = newValue;\n        }, observer.onError.bind(observer), function () {\n          atEnd = true;\n        }),\n        sampler.subscribe(sampleSubscribe, observer.onError.bind(observer), sampleSubscribe)\n      );\n    }, source);\n  }\n\n  /**\n   *  Samples the observable sequence at each interval.\n   *\n   * @example\n   *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n   *  2 - res = source.sample(5000); // 5 seconds\n   *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n   *\n   * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n   * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Sampled observable sequence.\n   */\n  observableProto.sample = observableProto.throttleLatest = function (intervalOrSampler, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return typeof intervalOrSampler === 'number' ?\n      sampleObservable(this, observableinterval(intervalOrSampler, scheduler)) :\n      sampleObservable(this, intervalOrSampler);\n  };\n\n  /**\n   *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n   * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n   */\n  observableProto.timeout = function (dueTime, other, scheduler) {\n    (other == null || typeof other === 'string') && (other = observableThrow(new Error(other || 'Timeout')));\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n\n    var source = this, schedulerMethod = dueTime instanceof Date ?\n      'scheduleWithAbsolute' :\n      'scheduleWithRelative';\n\n    return new AnonymousObservable(function (observer) {\n      var id = 0,\n        original = new SingleAssignmentDisposable(),\n        subscription = new SerialDisposable(),\n        switched = false,\n        timer = new SerialDisposable();\n\n      subscription.setDisposable(original);\n\n      function createTimer() {\n        var myId = id;\n        timer.setDisposable(scheduler[schedulerMethod](dueTime, function () {\n          if (id === myId) {\n            isPromise(other) && (other = observableFromPromise(other));\n            subscription.setDisposable(other.subscribe(observer));\n          }\n        }));\n      }\n\n      createTimer();\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (!switched) {\n          id++;\n          observer.onNext(x);\n          createTimer();\n        }\n      }, function (e) {\n        if (!switched) {\n          id++;\n          observer.onError(e);\n        }\n      }, function () {\n        if (!switched) {\n          id++;\n          observer.onCompleted();\n        }\n      }));\n      return new CompositeDisposable(subscription, timer);\n    }, source);\n  };\n\n  /**\n   * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n   * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n   * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n   * @returns {Observable} An Observable that performs the throttle operation.\n   */\n  observableProto.throttleFirst = function (windowDuration, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    var duration = +windowDuration || 0;\n    if (duration <= 0) { throw new RangeError('windowDuration cannot be less or equal zero.'); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var lastOnNext = 0;\n      return source.subscribe(\n        function (x) {\n          var now = scheduler.now();\n          if (lastOnNext === 0 || now - lastOnNext >= duration) {\n            lastOnNext = now;\n            o.onNext(x);\n          }\n        },function (e) { o.onError(e); }, function () { o.onCompleted(); }\n      );\n    }, source);\n  };\n\n  var PausableObservable = (function (__super__) {\n\n    inherits(PausableObservable, __super__);\n\n    function subscribe(observer) {\n      var conn = this.source.publish(),\n        subscription = conn.subscribe(observer),\n        connection = disposableEmpty;\n\n      var pausable = this.pauser.distinctUntilChanged().subscribe(function (b) {\n        if (b) {\n          connection = conn.connect();\n        } else {\n          connection.dispose();\n          connection = disposableEmpty;\n        }\n      });\n\n      return new CompositeDisposable(subscription, connection, pausable);\n    }\n\n    function PausableObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this, subscribe, source);\n    }\n\n    PausableObservable.prototype.pause = function () {\n      this.controller.onNext(false);\n    };\n\n    PausableObservable.prototype.resume = function () {\n      this.controller.onNext(true);\n    };\n\n    return PausableObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausable(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausable = function (pauser) {\n    return new PausableObservable(this, pauser);\n  };\n\n  function combineLatestSource(source, subject, resultSelector) {\n    return new AnonymousObservable(function (o) {\n      var hasValue = [false, false],\n        hasValueAll = false,\n        isDone = false,\n        values = new Array(2),\n        err;\n\n      function next(x, i) {\n        values[i] = x\n        var res;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          if (err) {\n            o.onError(err);\n            return;\n          }\n\n          try {\n            res = resultSelector.apply(null, values);\n          } catch (ex) {\n            o.onError(ex);\n            return;\n          }\n          o.onNext(res);\n        }\n        if (isDone && values[1]) {\n          o.onCompleted();\n        }\n      }\n\n      return new CompositeDisposable(\n        source.subscribe(\n          function (x) {\n            next(x, 0);\n          },\n          function (e) {\n            if (values[1]) {\n              o.onError(e);\n            } else {\n              err = e;\n            }\n          },\n          function () {\n            isDone = true;\n            values[1] && o.onCompleted();\n          }),\n        subject.subscribe(\n          function (x) {\n            next(x, 1);\n          },\n          function (e) { o.onError(e); },\n          function () {\n            isDone = true;\n            next(true, 1);\n          })\n        );\n    }, source);\n  }\n\n  var PausableBufferedObservable = (function (__super__) {\n\n    inherits(PausableBufferedObservable, __super__);\n\n    function subscribe(o) {\n      var q = [], previousShouldFire;\n\n      var subscription =\n        combineLatestSource(\n          this.source,\n          this.pauser.distinctUntilChanged().startWith(false),\n          function (data, shouldFire) {\n            return { data: data, shouldFire: shouldFire };\n          })\n          .subscribe(\n            function (results) {\n              if (previousShouldFire !== undefined && results.shouldFire != previousShouldFire) {\n                previousShouldFire = results.shouldFire;\n                // change in shouldFire\n                if (results.shouldFire) {\n                  while (q.length > 0) {\n                    o.onNext(q.shift());\n                  }\n                }\n              } else {\n                previousShouldFire = results.shouldFire;\n                // new data\n                if (results.shouldFire) {\n                  o.onNext(results.data);\n                } else {\n                  q.push(results.data);\n                }\n              }\n            },\n            function (err) {\n              // Empty buffer before sending error\n              while (q.length > 0) {\n                o.onNext(q.shift());\n              }\n              o.onError(err);\n            },\n            function () {\n              // Empty buffer before sending completion\n              while (q.length > 0) {\n                o.onNext(q.shift());\n              }\n              o.onCompleted();\n            }\n          );\n      return subscription;\n    }\n\n    function PausableBufferedObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this, subscribe, source);\n    }\n\n    PausableBufferedObservable.prototype.pause = function () {\n      this.controller.onNext(false);\n    };\n\n    PausableBufferedObservable.prototype.resume = function () {\n      this.controller.onNext(true);\n    };\n\n    return PausableBufferedObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n   * and yields the values that were buffered while paused.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausableBuffered = function (subject) {\n    return new PausableBufferedObservable(this, subject);\n  };\n\n  var ControlledObservable = (function (__super__) {\n\n    inherits(ControlledObservable, __super__);\n\n    function subscribe (observer) {\n      return this.source.subscribe(observer);\n    }\n\n    function ControlledObservable (source, enableQueue) {\n      __super__.call(this, subscribe, source);\n      this.subject = new ControlledSubject(enableQueue);\n      this.source = source.multicast(this.subject).refCount();\n    }\n\n    ControlledObservable.prototype.request = function (numberOfItems) {\n      if (numberOfItems == null) { numberOfItems = -1; }\n      return this.subject.request(numberOfItems);\n    };\n\n    return ControlledObservable;\n\n  }(Observable));\n\n  var ControlledSubject = (function (__super__) {\n\n    function subscribe (observer) {\n      return this.subject.subscribe(observer);\n    }\n\n    inherits(ControlledSubject, __super__);\n\n    function ControlledSubject(enableQueue) {\n      enableQueue == null && (enableQueue = true);\n\n      __super__.call(this, subscribe);\n      this.subject = new Subject();\n      this.enableQueue = enableQueue;\n      this.queue = enableQueue ? [] : null;\n      this.requestedCount = 0;\n      this.requestedDisposable = disposableEmpty;\n      this.error = null;\n      this.hasFailed = false;\n      this.hasCompleted = false;\n      this.controlledDisposable = disposableEmpty;\n    }\n\n    addProperties(ControlledSubject.prototype, Observer, {\n      onCompleted: function () {\n        this.hasCompleted = true;\n        (!this.enableQueue || this.queue.length === 0) && this.subject.onCompleted();\n      },\n      onError: function (error) {\n        this.hasFailed = true;\n        this.error = error;\n        (!this.enableQueue || this.queue.length === 0) && this.subject.onError(error);\n      },\n      onNext: function (value) {\n        var hasRequested = false;\n\n        if (this.requestedCount === 0) {\n          this.enableQueue && this.queue.push(value);\n        } else {\n          (this.requestedCount !== -1 && this.requestedCount-- === 0) && this.disposeCurrentRequest();\n          hasRequested = true;\n        }\n        hasRequested && this.subject.onNext(value);\n      },\n      _processRequest: function (numberOfItems) {\n        if (this.enableQueue) {\n          while (this.queue.length >= numberOfItems && numberOfItems > 0) {\n            this.subject.onNext(this.queue.shift());\n            numberOfItems--;\n          }\n\n          return this.queue.length !== 0 ?\n            { numberOfItems: numberOfItems, returnValue: true } :\n            { numberOfItems: numberOfItems, returnValue: false };\n        }\n\n        if (this.hasFailed) {\n          this.subject.onError(this.error);\n          this.controlledDisposable.dispose();\n          this.controlledDisposable = disposableEmpty;\n        } else if (this.hasCompleted) {\n          this.subject.onCompleted();\n          this.controlledDisposable.dispose();\n          this.controlledDisposable = disposableEmpty;\n        }\n\n        return { numberOfItems: numberOfItems, returnValue: false };\n      },\n      request: function (number) {\n        this.disposeCurrentRequest();\n        var self = this, r = this._processRequest(number);\n\n        var number = r.numberOfItems;\n        if (!r.returnValue) {\n          this.requestedCount = number;\n          this.requestedDisposable = disposableCreate(function () {\n            self.requestedCount = 0;\n          });\n\n          return this.requestedDisposable\n        } else {\n          return disposableEmpty;\n        }\n      },\n      disposeCurrentRequest: function () {\n        this.requestedDisposable.dispose();\n        this.requestedDisposable = disposableEmpty;\n      }\n    });\n\n    return ControlledSubject;\n  }(Observable));\n\n  /**\n   * Attaches a controller to the observable sequence with the ability to queue.\n   * @example\n   * var source = Rx.Observable.interval(100).controlled();\n   * source.request(3); // Reads 3 values\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.controlled = function (enableQueue) {\n    if (enableQueue == null) {  enableQueue = true; }\n    return new ControlledObservable(this, enableQueue);\n  };\n\n  /**\n   * Executes a transducer to transform the observable sequence\n   * @param {Transducer} transducer A transducer to execute\n   * @returns {Observable} An Observable sequence containing the results from the transducer.\n   */\n  observableProto.transduce = function(transducer) {\n    var source = this;\n\n    function transformForObserver(observer) {\n      return {\n        init: function() {\n          return observer;\n        },\n        step: function(obs, input) {\n          return obs.onNext(input);\n        },\n        result: function(obs) {\n          return obs.onCompleted();\n        }\n      };\n    }\n\n    return new AnonymousObservable(function(observer) {\n      var xform = transducer(transformForObserver(observer));\n      return source.subscribe(\n        function(v) {\n          try {\n            xform.step(observer, v);\n          } catch (e) {\n            observer.onError(e);\n          }\n        },\n        observer.onError.bind(observer),\n        function() { xform.result(observer); }\n      );\n    }, source);\n  };\n\n  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {\n    inherits(AnonymousObservable, __super__);\n\n    // Fix subscriber to check for undefined or function returned to decorate as Disposable\n    function fixSubscriber(subscriber) {\n      if (subscriber && typeof subscriber.dispose === 'function') { return subscriber; }\n\n      return typeof subscriber === 'function' ?\n        disposableCreate(subscriber) :\n        disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], subscribe = state[1];\n      try {\n        ado.setDisposable(fixSubscriber(subscribe(ado)));\n      } catch (e) {\n        if (!ado.fail(e)) { throw e; }\n      }\n    }\n\n    function AnonymousObservable(subscribe, parent) {\n      this.source = parent;\n\n      function s(observer) {\n\n        var ado = new AutoDetachObserver(observer), state = [ado, subscribe];\n\n        if (currentThreadScheduler.scheduleRequired()) {\n          currentThreadScheduler.scheduleWithState(state, setDisposable);\n        } else {\n          setDisposable(null, state);\n        }\n\n        return ado;\n      }\n\n      __super__.call(this, s);\n    }\n\n    return AnonymousObservable;\n\n  }(Observable));\n\n  var AutoDetachObserver = (function (__super__) {\n    inherits(AutoDetachObserver, __super__);\n\n    function AutoDetachObserver(observer) {\n      __super__.call(this);\n      this.observer = observer;\n      this.m = new SingleAssignmentDisposable();\n    }\n\n    var AutoDetachObserverPrototype = AutoDetachObserver.prototype;\n\n    AutoDetachObserverPrototype.next = function (value) {\n      var noError = false;\n      try {\n        this.observer.onNext(value);\n        noError = true;\n      } catch (e) {\n        throw e;\n      } finally {\n        !noError && this.dispose();\n      }\n    };\n\n    AutoDetachObserverPrototype.error = function (err) {\n      try {\n        this.observer.onError(err);\n      } catch (e) {\n        throw e;\n      } finally {\n        this.dispose();\n      }\n    };\n\n    AutoDetachObserverPrototype.completed = function () {\n      try {\n        this.observer.onCompleted();\n      } catch (e) {\n        throw e;\n      } finally {\n        this.dispose();\n      }\n    };\n\n    AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };\n    AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };\n\n    AutoDetachObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.m.dispose();\n    };\n\n    return AutoDetachObserver;\n  }(AbstractObserver));\n\n  var InnerSubscription = function (subject, observer) {\n    this.subject = subject;\n    this.observer = observer;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this.subject.isDisposed && this.observer !== null) {\n      var idx = this.subject.observers.indexOf(this.observer);\n      this.subject.observers.splice(idx, 1);\n      this.observer = null;\n    }\n  };\n\n  /**\n   *  Represents an object that is both an observable sequence as well as an observer.\n   *  Each notification is broadcasted to all subscribed observers.\n   */\n  var Subject = Rx.Subject = (function (__super__) {\n    function subscribe(observer) {\n      checkDisposed(this);\n      if (!this.isStopped) {\n        this.observers.push(observer);\n        return new InnerSubscription(this, observer);\n      }\n      if (this.hasError) {\n        observer.onError(this.error);\n        return disposableEmpty;\n      }\n      observer.onCompleted();\n      return disposableEmpty;\n    }\n\n    inherits(Subject, __super__);\n\n    /**\n     * Creates a subject.\n     */\n    function Subject() {\n      __super__.call(this, subscribe);\n      this.isDisposed = false,\n      this.isStopped = false,\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(Subject.prototype, Observer.prototype, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onCompleted();\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.error = error;\n          this.hasError = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onNext(value);\n          }\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    /**\n     * Creates a subject from the specified observer and observable.\n     * @param {Observer} observer The observer used to send messages to the subject.\n     * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n     * @returns {Subject} Subject implemented using the given observer and observable.\n     */\n    Subject.create = function (observer, observable) {\n      return new AnonymousSubject(observer, observable);\n    };\n\n    return Subject;\n  }(Observable));\n\n  /**\n   *  Represents the result of an asynchronous operation.\n   *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n   */\n  var AsyncSubject = Rx.AsyncSubject = (function (__super__) {\n\n    function subscribe(observer) {\n      checkDisposed(this);\n\n      if (!this.isStopped) {\n        this.observers.push(observer);\n        return new InnerSubscription(this, observer);\n      }\n\n      if (this.hasError) {\n        observer.onError(this.error);\n      } else if (this.hasValue) {\n        observer.onNext(this.value);\n        observer.onCompleted();\n      } else {\n        observer.onCompleted();\n      }\n\n      return disposableEmpty;\n    }\n\n    inherits(AsyncSubject, __super__);\n\n    /**\n     * Creates a subject that can only receive one value and that value is cached for all future observations.\n     * @constructor\n     */\n    function AsyncSubject() {\n      __super__.call(this, subscribe);\n\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasValue = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(AsyncSubject.prototype, Observer, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () {\n        checkDisposed(this);\n        return this.observers.length > 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n       */\n      onCompleted: function () {\n        var i, len;\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          var os = cloneArray(this.observers), len = os.length;\n\n          if (this.hasValue) {\n            for (i = 0; i < len; i++) {\n              var o = os[i];\n              o.onNext(this.value);\n              o.onCompleted();\n            }\n          } else {\n            for (i = 0; i < len; i++) {\n              os[i].onCompleted();\n            }\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the error.\n       * @param {Mixed} error The Error to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.hasError = true;\n          this.error = error;\n\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n       * @param {Mixed} value The value to store in the subject.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        this.hasValue = true;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.exception = null;\n        this.value = null;\n      }\n    });\n\n    return AsyncSubject;\n  }(Observable));\n\n  var AnonymousSubject = Rx.AnonymousSubject = (function (__super__) {\n    inherits(AnonymousSubject, __super__);\n\n    function subscribe(observer) {\n      return this.observable.subscribe(observer);\n    }\n\n    function AnonymousSubject(observer, observable) {\n      this.observer = observer;\n      this.observable = observable;\n      __super__.call(this, subscribe);\n    }\n\n    addProperties(AnonymousSubject.prototype, Observer.prototype, {\n      onCompleted: function () {\n        this.observer.onCompleted();\n      },\n      onError: function (error) {\n        this.observer.onError(error);\n      },\n      onNext: function (value) {\n        this.observer.onNext(value);\n      }\n    });\n\n    return AnonymousSubject;\n  }(Observable));\n\n  /**\n   *  Represents a value that changes over time.\n   *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n   */\n  var BehaviorSubject = Rx.BehaviorSubject = (function (__super__) {\n    function subscribe(observer) {\n      checkDisposed(this);\n      if (!this.isStopped) {\n        this.observers.push(observer);\n        observer.onNext(this.value);\n        return new InnerSubscription(this, observer);\n      }\n      if (this.hasError) {\n        observer.onError(this.error);\n      } else {\n        observer.onCompleted();\n      }\n      return disposableEmpty;\n    }\n\n    inherits(BehaviorSubject, __super__);\n\n    /**\n     *  Initializes a new instance of the BehaviorSubject class which creates a subject that caches its last value and starts with the specified value.\n     *  @param {Mixed} value Initial value sent to observers when no other value has been received by the subject yet.\n     */\n    function BehaviorSubject(value) {\n      __super__.call(this, subscribe);\n      this.value = value,\n      this.observers = [],\n      this.isDisposed = false,\n      this.isStopped = false,\n      this.hasError = false;\n    }\n\n    addProperties(BehaviorSubject.prototype, Observer, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onCompleted();\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.hasError = true;\n        this.error = error;\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onError(error);\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onNext(value);\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.value = null;\n        this.exception = null;\n      }\n    });\n\n    return BehaviorSubject;\n  }(Observable));\n\n  /**\n   * Represents an object that is both an observable sequence as well as an observer.\n   * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n   */\n  var ReplaySubject = Rx.ReplaySubject = (function (__super__) {\n\n    function createRemovableDisposable(subject, observer) {\n      return disposableCreate(function () {\n        observer.dispose();\n        !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n      });\n    }\n\n    function subscribe(observer) {\n      var so = new ScheduledObserver(this.scheduler, observer),\n        subscription = createRemovableDisposable(this, so);\n      checkDisposed(this);\n      this._trim(this.scheduler.now());\n      this.observers.push(so);\n\n      for (var i = 0, len = this.q.length; i < len; i++) {\n        so.onNext(this.q[i].value);\n      }\n\n      if (this.hasError) {\n        so.onError(this.error);\n      } else if (this.isStopped) {\n        so.onCompleted();\n      }\n\n      so.ensureActive();\n      return subscription;\n    }\n\n    inherits(ReplaySubject, __super__);\n\n    /**\n     *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n     *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n     *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n     *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n     */\n    function ReplaySubject(bufferSize, windowSize, scheduler) {\n      this.bufferSize = bufferSize == null ? Number.MAX_VALUE : bufferSize;\n      this.windowSize = windowSize == null ? Number.MAX_VALUE : windowSize;\n      this.scheduler = scheduler || currentThreadScheduler;\n      this.q = [];\n      this.observers = [];\n      this.isStopped = false;\n      this.isDisposed = false;\n      this.hasError = false;\n      this.error = null;\n      __super__.call(this, subscribe);\n    }\n\n    addProperties(ReplaySubject.prototype, Observer.prototype, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () {\n        return this.observers.length > 0;\n      },\n      _trim: function (now) {\n        while (this.q.length > this.bufferSize) {\n          this.q.shift();\n        }\n        while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {\n          this.q.shift();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        var now = this.scheduler.now();\n        this.q.push({ interval: now, value: value });\n        this._trim(now);\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onNext(value);\n          observer.ensureActive();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.error = error;\n        this.hasError = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onError(error);\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onCompleted();\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    return ReplaySubject;\n  }(Observable));\n\n  /**\n  * Used to pause and resume streams.\n  */\n  Rx.Pauser = (function (__super__) {\n    inherits(Pauser, __super__);\n\n    function Pauser() {\n      __super__.call(this);\n    }\n\n    /**\n     * Pauses the underlying sequence.\n     */\n    Pauser.prototype.pause = function () { this.onNext(false); };\n\n    /**\n    * Resumes the underlying sequence.\n    */\n    Pauser.prototype.resume = function () { this.onNext(true); };\n\n    return Pauser;\n  }(Subject));\n\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    root.Rx = Rx;\n\n    define(function() {\n      return Rx;\n    });\n  } else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = Rx).Rx = Rx;\n    } else {\n      freeExports.Rx = Rx;\n    }\n  } else {\n    // in a browser or Rhino\n    root.Rx = Rx;\n  }\n\n  // All code before this point will be filtered from stack traces.\n  var rEndingLine = captureLine();\n\n}.call(this));\n"
  },
  {
    "path": "tests/perf/old/rx.lite.extras.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n    var objectTypes = {\n        'boolean': false,\n        'function': true,\n        'object': true,\n        'number': false,\n        'string': false,\n        'undefined': false\n    };\n\n    var root = (objectTypes[typeof window] && window) || this,\n        freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n        freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n        moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n        freeGlobal = objectTypes[typeof global] && global;\n\n    if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n        root = freeGlobal;\n    }\n\n    // Because of build optimizers\n    if (typeof define === 'function' && define.amd) {\n        define(['rx'], function (Rx, exports) {\n            return factory(root, exports, Rx);\n        });\n    } else if (typeof module === 'object' && module && module.exports === freeExports) {\n        module.exports = factory(root, module.exports, require('./rx'));\n    } else {\n        root.Rx = factory(root, {}, root.Rx);\n    }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // References\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    observableNever = Observable.never,\n    observableThrow = Observable.throwException,\n    AnonymousObservable = Rx.AnonymousObservable,\n    AnonymousObserver = Rx.AnonymousObserver,\n    notificationCreateOnNext = Rx.Notification.createOnNext,\n    notificationCreateOnError = Rx.Notification.createOnError,\n    notificationCreateOnCompleted = Rx.Notification.createOnCompleted,\n    Observer = Rx.Observer,\n    Subject = Rx.Subject,\n    internals = Rx.internals,\n    helpers = Rx.helpers,\n    ScheduledObserver = internals.ScheduledObserver,\n    SerialDisposable = Rx.SerialDisposable,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    disposableEmpty = Rx.Disposable.empty,\n    immediateScheduler = Rx.Scheduler.immediate,\n    defaultKeySerializer = helpers.defaultKeySerializer,\n    addRef = Rx.internals.addRef,\n    identity = helpers.identity,\n    isPromise = helpers.isPromise,\n    inherits = internals.inherits,\n    bindCallback = internals.bindCallback,\n    noop = helpers.noop,\n    isScheduler = helpers.isScheduler,\n    observableFromPromise = Observable.fromPromise,\n    slice = Array.prototype.slice;\n\n  function argsOrArray(args, idx) {\n    return args.length === 1 && Array.isArray(args[idx]) ?\n      args[idx] :\n      slice.call(args);\n  }\n\n  var argumentOutOfRange = 'Argument out of range';\n\n  function ScheduledDisposable(scheduler, disposable) {\n    this.scheduler = scheduler;\n    this.disposable = disposable;\n    this.isDisposed = false;\n  }\n\n  function scheduleItem(s, self) {\n    if (!self.isDisposed) {\n      self.isDisposed = true;\n      self.disposable.dispose();\n    }\n  }\n\n  ScheduledDisposable.prototype.dispose = function () {\n    this.scheduler.scheduleWithState(this, scheduleItem);\n  };\n\n    var CheckedObserver = (function (_super) {\n        inherits(CheckedObserver, _super);\n\n        function CheckedObserver(observer) {\n            _super.call(this);\n            this._observer = observer;\n            this._state = 0; // 0 - idle, 1 - busy, 2 - done\n        }\n\n        var CheckedObserverPrototype = CheckedObserver.prototype;\n\n        CheckedObserverPrototype.onNext = function (value) {\n            this.checkAccess();\n            try {\n                this._observer.onNext(value);\n            } catch (e) {\n                throw e;\n            } finally {\n                this._state = 0;\n            }\n        };\n\n        CheckedObserverPrototype.onError = function (err) {\n            this.checkAccess();\n            try {\n                this._observer.onError(err);\n            } catch (e) {\n                throw e;\n            } finally {\n                this._state = 2;\n            }\n        };\n\n        CheckedObserverPrototype.onCompleted = function () {\n            this.checkAccess();\n            try {\n                this._observer.onCompleted();\n            } catch (e) {\n                throw e;\n            } finally {\n                this._state = 2;\n            }\n        };\n\n        CheckedObserverPrototype.checkAccess = function () {\n            if (this._state === 1) { throw new Error('Re-entrancy detected'); }\n            if (this._state === 2) { throw new Error('Observer completed'); }\n            if (this._state === 0) { this._state = 1; }\n        };\n\n        return CheckedObserver;\n    }(Observer));\n\n  var ObserveOnObserver = (function (__super__) {\n    inherits(ObserveOnObserver, __super__);\n\n    function ObserveOnObserver(scheduler, observer, cancel) {\n      __super__.call(this, scheduler, observer);\n      this._cancel = cancel;\n    }\n\n    ObserveOnObserver.prototype.next = function (value) {\n      __super__.prototype.next.call(this, value);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.error = function (e) {\n      __super__.prototype.error.call(this, e);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.completed = function () {\n      __super__.prototype.completed.call(this);\n      this.ensureActive();\n    };\n\n    ObserveOnObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this._cancel && this._cancel.dispose();\n      this._cancel = null;\n    };\n\n    return ObserveOnObserver;\n  })(ScheduledObserver);\n\n  /**\n   *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n   *  If a violation is detected, an Error is thrown from the offending observer method call.\n   *\n   * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n   */\n  Observer.prototype.checked = function () { return new CheckedObserver(this); };\n\n  /**\n   * Schedules the invocation of observer methods on the given scheduler.\n   * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n   * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n   */\n  Observer.notifyOn = function (scheduler) {\n    return new ObserveOnObserver(scheduler, this);\n  };\n\n  /**\n  *  Creates an observer from a notification callback.\n  * @param {Function} handler Action that handles a notification.\n  * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n  */\n  Observer.fromNotifier = function (handler, thisArg) {\n    var handlerFunc = bindCallback(handler, thisArg, 1);\n    return new AnonymousObserver(function (x) {\n      return handlerFunc(notificationCreateOnNext(x));\n    }, function (e) {\n      return handlerFunc(notificationCreateOnError(e));\n    }, function () {\n      return handlerFunc(notificationCreateOnCompleted());\n    });\n  };\n\n  /**\n  *  Creates a notification callback from an observer.\n  * @returns The action that forwards its input notification to the underlying observer.\n  */\n  Observer.prototype.toNotifier = function () {\n    var observer = this;\n    return function (n) { return n.accept(observer); };\n  };\n\n  /**\n  *  Hides the identity of an observer.\n  * @returns An observer that hides the identity of the specified observer.\n  */\n  Observer.prototype.asObserver = function () {\n    var source = this;\n    return new AnonymousObserver(\n      function (x) { source.onNext(x); },\n      function (e) { source.onError(e); },\n      function () { source.onCompleted(); }\n    );\n  };\n\n   /**\n   *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n   *\n   *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n   *  that require to be run on a scheduler, use subscribeOn.\n   *\n   *  @param {Scheduler} scheduler Scheduler to notify observers on.\n   *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n   */\n  observableProto.observeOn = function (scheduler) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      return source.subscribe(new ObserveOnObserver(scheduler, observer));\n    }, source);\n  };\n\n   /**\n   *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n   *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n   *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n   *  callbacks on a scheduler, use observeOn.\n\n   *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n   *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n   */\n  observableProto.subscribeOn = function (scheduler) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(), d = new SerialDisposable();\n      d.setDisposable(m);\n      m.setDisposable(scheduler.schedule(function () {\n        d.setDisposable(new ScheduledDisposable(scheduler, source.subscribe(observer)));\n      }));\n      return d;\n    }, source);\n  };\n\n  /**\n   *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n   *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generate = function (initialState, condition, iterate, resultSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new AnonymousObservable(function (observer) {\n      var first = true, state = initialState;\n      return scheduler.scheduleRecursive(function (self) {\n        var hasResult, result;\n        try {\n          if (first) {\n            first = false;\n          } else {\n            state = iterate(state);\n          }\n          hasResult = condition(state);\n          if (hasResult) {\n            result = resultSelector(state);\n          }\n        } catch (exception) {\n          observer.onError(exception);\n          return;\n        }\n        if (hasResult) {\n          observer.onNext(result);\n          self();\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n   * @param {Function} resourceFactory Factory function to obtain a resource object.\n   * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n   * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n   */\n  Observable.using = function (resourceFactory, observableFactory) {\n    return new AnonymousObservable(function (observer) {\n      var disposable = disposableEmpty, resource, source;\n      try {\n        resource = resourceFactory();\n        resource && (disposable = resource);\n        source = observableFactory(resource);\n      } catch (exception) {\n        return new CompositeDisposable(observableThrow(exception).subscribe(observer), disposable);\n      }\n      return new CompositeDisposable(source.subscribe(observer), disposable);\n    });\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   * @param {Observable} rightSource Second observable sequence or Promise.\n   * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n   */\n  observableProto.amb = function (rightSource) {\n    var leftSource = this;\n    return new AnonymousObservable(function (observer) {\n      var choice,\n        leftChoice = 'L', rightChoice = 'R',\n        leftSubscription = new SingleAssignmentDisposable(),\n        rightSubscription = new SingleAssignmentDisposable();\n\n      isPromise(rightSource) && (rightSource = observableFromPromise(rightSource));\n\n      function choiceL() {\n        if (!choice) {\n          choice = leftChoice;\n          rightSubscription.dispose();\n        }\n      }\n\n      function choiceR() {\n        if (!choice) {\n          choice = rightChoice;\n          leftSubscription.dispose();\n        }\n      }\n\n      leftSubscription.setDisposable(leftSource.subscribe(function (left) {\n        choiceL();\n        if (choice === leftChoice) {\n          observer.onNext(left);\n        }\n      }, function (err) {\n        choiceL();\n        if (choice === leftChoice) {\n          observer.onError(err);\n        }\n      }, function () {\n        choiceL();\n        if (choice === leftChoice) {\n          observer.onCompleted();\n        }\n      }));\n\n      rightSubscription.setDisposable(rightSource.subscribe(function (right) {\n        choiceR();\n        if (choice === rightChoice) {\n          observer.onNext(right);\n        }\n      }, function (err) {\n        choiceR();\n        if (choice === rightChoice) {\n          observer.onError(err);\n        }\n      }, function () {\n        choiceR();\n        if (choice === rightChoice) {\n          observer.onCompleted();\n        }\n      }));\n\n      return new CompositeDisposable(leftSubscription, rightSubscription);\n    });\n  };\n\n  /**\n   * Propagates the observable sequence or Promise that reacts first.\n   *\n   * @example\n   * var = Rx.Observable.amb(xs, ys, zs);\n   * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n   */\n  Observable.amb = function () {\n    var acc = observableNever(), items = [];\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { items.push(arguments[i]); }\n    }\n\n    function func(previous, current) {\n      return previous.amb(current);\n    }\n    for (var i = 0, len = items.length; i < len; i++) {\n      acc = func(acc, items[i]);\n    }\n    return acc;\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n   * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n   */\n  observableProto.onErrorResumeNext = function (second) {\n    if (!second) { throw new Error('Second observable is required'); }\n    return onErrorResumeNext([this, second]);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n   *\n   * @example\n   * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);\n   * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);\n   * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n   */\n  var onErrorResumeNext = Observable.onErrorResumeNext = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    }\n    return new AnonymousObservable(function (observer) {\n      var pos = 0, subscription = new SerialDisposable(),\n      cancelable = immediateScheduler.scheduleRecursive(function (self) {\n        var current, d;\n        if (pos < sources.length) {\n          current = sources[pos++];\n          isPromise(current) && (current = observableFromPromise(current));\n          d = new SingleAssignmentDisposable();\n          subscription.setDisposable(d);\n          d.setDisposable(current.subscribe(observer.onNext.bind(observer), self, self));\n        } else {\n          observer.onCompleted();\n        }\n      });\n      return new CompositeDisposable(subscription, cancelable);\n    });\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n   *\n   * @example\n   *  var res = xs.bufferWithCount(10);\n   *  var res = xs.bufferWithCount(10, 1);\n   * @param {Number} count Length of each buffer.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n   * @returns {Observable} An observable sequence of buffers.\n   */\n  observableProto.bufferWithCount = function (count, skip) {\n    if (typeof skip !== 'number') {\n      skip = count;\n    }\n    return this.windowWithCount(count, skip).selectMany(function (x) {\n      return x.toArray();\n    }).where(function (x) {\n      return x.length > 0;\n    });\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n   *\n   *  var res = xs.windowWithCount(10);\n   *  var res = xs.windowWithCount(10, 1);\n   * @param {Number} count Length of each window.\n   * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithCount = function (count, skip) {\n    var source = this;\n    +count || (count = 0);\n    Math.abs(count) === Infinity && (count = 0);\n    if (count <= 0) { throw new Error(argumentOutOfRange); }\n    skip == null && (skip = count);\n    +skip || (skip = 0);\n    Math.abs(skip) === Infinity && (skip = 0);\n\n    if (skip <= 0) { throw new Error(argumentOutOfRange); }\n    return new AnonymousObservable(function (observer) {\n      var m = new SingleAssignmentDisposable(),\n        refCountDisposable = new RefCountDisposable(m),\n        n = 0,\n        q = [];\n\n      function createWindow () {\n        var s = new Subject();\n        q.push(s);\n        observer.onNext(addRef(s, refCountDisposable));\n      }\n\n      createWindow();\n\n      m.setDisposable(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n          var c = n - count + 1;\n          c >= 0 && c % skip === 0 && q.shift().onCompleted();\n          ++n % skip === 0 && createWindow();\n        },\n        function (e) {\n          while (q.length > 0) { q.shift().onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          while (q.length > 0) { q.shift().onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  /**\n   *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n   *\n   * @description\n   *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n   *  source sequence, this buffer is produced on the result sequence.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLastBuffer = function (count) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        q.push(x);\n        q.length > count && q.shift();\n      }, function (e) { o.onError(e); }, function () {\n        o.onNext(q);\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n    /**\n     *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n     *\n     *  var res = obs = xs.defaultIfEmpty();\n     *  2 - obs = xs.defaultIfEmpty(false);\n     *\n     * @memberOf Observable#\n     * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n     * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n     */\n    observableProto.defaultIfEmpty = function (defaultValue) {\n      var source = this;\n      defaultValue === undefined && (defaultValue = null);\n      return new AnonymousObservable(function (observer) {\n        var found = false;\n        return source.subscribe(function (x) {\n          found = true;\n          observer.onNext(x);\n        },\n        function (e) { observer.onError(e); }, \n        function () {\n          !found && observer.onNext(defaultValue);\n          observer.onCompleted();\n        });\n      }, source);\n    };\n\n  // Swap out for Array.findIndex\n  function arrayIndexOfComparer(array, item, comparer) {\n    for (var i = 0, len = array.length; i < len; i++) {\n      if (comparer(array[i], item)) { return i; }\n    }\n    return -1;\n  }\n\n  function HashSet(comparer) {\n    this.comparer = comparer;\n    this.set = [];\n  }\n  HashSet.prototype.push = function(value) {\n    var retValue = arrayIndexOfComparer(this.set, value, this.comparer) === -1;\n    retValue && this.set.push(value);\n    return retValue;\n  };\n\n  /**\n   *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n   *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n   *\n   * @example\n   *  var res = obs = xs.distinct();\n   *  2 - obs = xs.distinct(function (x) { return x.id; });\n   *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n   * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n   * @param {Function} [comparer]  Used to compare items in the collection.\n   * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinct = function (keySelector, comparer) {\n    var source = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var hashSet = new HashSet(comparer);\n      return source.subscribe(function (x) {\n        var key = x;\n\n        if (keySelector) {\n          try {\n            key = keySelector(x);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        hashSet.push(key) && o.onNext(x);\n      },\n      function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, this);\n  };\n\n    return Rx;\n}));\n"
  },
  {
    "path": "tests/perf/old/rx.lite.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n;(function (undefined) {\n\n  var objectTypes = {\n    'boolean': false,\n    'function': true,\n    'object': true,\n    'number': false,\n    'string': false,\n    'undefined': false\n  };\n\n  var root = (objectTypes[typeof window] && window) || this,\n    freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n    freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n    moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n    freeGlobal = objectTypes[typeof global] && global;\n\n  if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n    root = freeGlobal;\n  }\n\n  var Rx = {\n      internals: {},\n      config: {\n        Promise: root.Promise\n      },\n      helpers: { }\n  };\n\n  // Defaults\n  var noop = Rx.helpers.noop = function () { },\n    notDefined = Rx.helpers.notDefined = function (x) { return typeof x === 'undefined'; },\n    isScheduler = Rx.helpers.isScheduler = function (x) { return x instanceof Rx.Scheduler; },\n    identity = Rx.helpers.identity = function (x) { return x; },\n    pluck = Rx.helpers.pluck = function (property) { return function (x) { return x[property]; }; },\n    just = Rx.helpers.just = function (value) { return function () { return value; }; },\n    defaultNow = Rx.helpers.defaultNow = Date.now,\n    defaultComparer = Rx.helpers.defaultComparer = function (x, y) { return isEqual(x, y); },\n    defaultSubComparer = Rx.helpers.defaultSubComparer = function (x, y) { return x > y ? 1 : (x < y ? -1 : 0); },\n    defaultKeySerializer = Rx.helpers.defaultKeySerializer = function (x) { return x.toString(); },\n    defaultError = Rx.helpers.defaultError = function (err) { throw err; },\n    isPromise = Rx.helpers.isPromise = function (p) { return !!p && typeof p.then === 'function'; },\n    asArray = Rx.helpers.asArray = function () { return Array.prototype.slice.call(arguments); },\n    not = Rx.helpers.not = function (a) { return !a; },\n    isFunction = Rx.helpers.isFunction = (function () {\n\n      var isFn = function (value) {\n        return typeof value == 'function' || false;\n      }\n\n      // fallback for older versions of Chrome and Safari\n      if (isFn(/x/)) {\n        isFn = function(value) {\n          return typeof value == 'function' && toString.call(value) == '[object Function]';\n        };\n      }\n\n      return isFn;\n    }());\n\n  // Errors\n  var sequenceContainsNoElements = 'Sequence contains no elements.';\n  var argumentOutOfRange = 'Argument out of range';\n  var objectDisposed = 'Object has been disposed';\n  function checkDisposed(self) { if (self.isDisposed) { throw new Error(objectDisposed); } }\n  function cloneArray(arr) { for(var a = [], i = 0, len = arr.length; i < len; i++) { a.push(arr[i]); } return a;}\n\n  Rx.config.longStackSupport = false;\n  var hasStacks = false;\n  try {\n    throw new Error();\n  } catch (e) {\n    hasStacks = !!e.stack;\n  }\n\n  // All code after this point will be filtered from stack traces reported by RxJS\n  var rStartingLine = captureLine(), rFileName;\n\n  var STACK_JUMP_SEPARATOR = \"From previous event:\";\n\n  function makeStackTraceLong(error, observable) {\n      // If possible, transform the error stack trace by removing Node and RxJS\n      // cruft, then concatenating with the stack trace of `observable`.\n      if (hasStacks &&\n          observable.stack &&\n          typeof error === \"object\" &&\n          error !== null &&\n          error.stack &&\n          error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1\n      ) {\n        var stacks = [];\n        for (var o = observable; !!o; o = o.source) {\n          if (o.stack) {\n            stacks.unshift(o.stack);\n          }\n        }\n        stacks.unshift(error.stack);\n\n        var concatedStacks = stacks.join(\"\\n\" + STACK_JUMP_SEPARATOR + \"\\n\");\n        error.stack = filterStackString(concatedStacks);\n    }\n  }\n\n  function filterStackString(stackString) {\n    var lines = stackString.split(\"\\n\"),\n        desiredLines = [];\n    for (var i = 0, len = lines.length; i < len; i++) {\n      var line = lines[i];\n\n      if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n        desiredLines.push(line);\n      }\n    }\n    return desiredLines.join(\"\\n\");\n  }\n\n  function isInternalFrame(stackLine) {\n    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n    if (!fileNameAndLineNumber) {\n      return false;\n    }\n    var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];\n\n    return fileName === rFileName &&\n      lineNumber >= rStartingLine &&\n      lineNumber <= rEndingLine;\n  }\n\n  function isNodeFrame(stackLine) {\n    return stackLine.indexOf(\"(module.js:\") !== -1 ||\n      stackLine.indexOf(\"(node.js:\") !== -1;\n  }\n\n  function captureLine() {\n    if (!hasStacks) { return; }\n\n    try {\n      throw new Error();\n    } catch (e) {\n      var lines = e.stack.split(\"\\n\");\n      var firstLine = lines[0].indexOf(\"@\") > 0 ? lines[1] : lines[2];\n      var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n      if (!fileNameAndLineNumber) { return; }\n\n      rFileName = fileNameAndLineNumber[0];\n      return fileNameAndLineNumber[1];\n    }\n  }\n\n  function getFileNameAndLineNumber(stackLine) {\n    // Named functions: \"at functionName (filename:lineNumber:columnNumber)\"\n    var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n    if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }\n\n    // Anonymous functions: \"at filename:lineNumber:columnNumber\"\n    var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n    if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }\n\n    // Firefox style: \"function@filename:lineNumber or @filename:lineNumber\"\n    var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n    if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }\n  }\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (root.Set && typeof new root.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  var isIterable = Rx.helpers.isIterable = function (o) {\n    return o[$iterator$] !== undefined;\n  }\n\n  var isArrayLike = Rx.helpers.isArrayLike = function (o) {\n    return o && o.length !== undefined;\n  }\n\n  Rx.helpers.iterator = $iterator$;\n\n  var bindCallback = Rx.internals.bindCallback = function (func, thisArg, argCount) {\n    if (typeof thisArg === 'undefined') { return func; }\n    switch(argCount) {\n      case 0:\n        return function() {\n          return func.call(thisArg)\n        };\n      case 1:\n        return function(arg) {\n          return func.call(thisArg, arg);\n        }\n      case 2:\n        return function(value, index) {\n          return func.call(thisArg, value, index);\n        };\n      case 3:\n        return function(value, index, collection) {\n          return func.call(thisArg, value, index, collection);\n        };\n    }\n\n    return function() {\n      return func.apply(thisArg, arguments);\n    };\n  };\n\n  /** Used to determine if values are of the language type Object */\n  var dontEnums = ['toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'],\n  dontEnumsLength = dontEnums.length;\n\n  /** `Object#toString` result shortcuts */\n  var argsClass = '[object Arguments]',\n    arrayClass = '[object Array]',\n    boolClass = '[object Boolean]',\n    dateClass = '[object Date]',\n    errorClass = '[object Error]',\n    funcClass = '[object Function]',\n    numberClass = '[object Number]',\n    objectClass = '[object Object]',\n    regexpClass = '[object RegExp]',\n    stringClass = '[object String]';\n\n  var toString = Object.prototype.toString,\n    hasOwnProperty = Object.prototype.hasOwnProperty,\n    supportsArgsClass = toString.call(arguments) == argsClass, // For less <IE9 && FF<4\n    supportNodeClass,\n    errorProto = Error.prototype,\n    objectProto = Object.prototype,\n    stringProto = String.prototype,\n    propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n  try {\n    supportNodeClass = !(toString.call(document) == objectClass && !({ 'toString': 0 } + ''));\n  } catch (e) {\n    supportNodeClass = true;\n  }\n\n  var nonEnumProps = {};\n  nonEnumProps[arrayClass] = nonEnumProps[dateClass] = nonEnumProps[numberClass] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true };\n  nonEnumProps[boolClass] = nonEnumProps[stringClass] = { 'constructor': true, 'toString': true, 'valueOf': true };\n  nonEnumProps[errorClass] = nonEnumProps[funcClass] = nonEnumProps[regexpClass] = { 'constructor': true, 'toString': true };\n  nonEnumProps[objectClass] = { 'constructor': true };\n\n  var support = {};\n  (function () {\n    var ctor = function() { this.x = 1; },\n      props = [];\n\n    ctor.prototype = { 'valueOf': 1, 'y': 1 };\n    for (var key in new ctor) { props.push(key); }\n    for (key in arguments) { }\n\n    // Detect if `name` or `message` properties of `Error.prototype` are enumerable by default.\n    support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') || propertyIsEnumerable.call(errorProto, 'name');\n\n    // Detect if `prototype` properties are enumerable by default.\n    support.enumPrototypes = propertyIsEnumerable.call(ctor, 'prototype');\n\n    // Detect if `arguments` object indexes are non-enumerable\n    support.nonEnumArgs = key != 0;\n\n    // Detect if properties shadowing those on `Object.prototype` are non-enumerable.\n    support.nonEnumShadows = !/valueOf/.test(props);\n  }(1));\n\n  var isObject = Rx.internals.isObject = function(value) {\n    var type = typeof value;\n    return value && (type == 'function' || type == 'object') || false;\n  };\n\n  function keysIn(object) {\n    var result = [];\n    if (!isObject(object)) {\n      return result;\n    }\n    if (support.nonEnumArgs && object.length && isArguments(object)) {\n      object = slice.call(object);\n    }\n    var skipProto = support.enumPrototypes && typeof object == 'function',\n        skipErrorProps = support.enumErrorProps && (object === errorProto || object instanceof Error);\n\n    for (var key in object) {\n      if (!(skipProto && key == 'prototype') &&\n          !(skipErrorProps && (key == 'message' || key == 'name'))) {\n        result.push(key);\n      }\n    }\n\n    if (support.nonEnumShadows && object !== objectProto) {\n      var ctor = object.constructor,\n          index = -1,\n          length = dontEnumsLength;\n\n      if (object === (ctor && ctor.prototype)) {\n        var className = object === stringProto ? stringClass : object === errorProto ? errorClass : toString.call(object),\n            nonEnum = nonEnumProps[className];\n      }\n      while (++index < length) {\n        key = dontEnums[index];\n        if (!(nonEnum && nonEnum[key]) && hasOwnProperty.call(object, key)) {\n          result.push(key);\n        }\n      }\n    }\n    return result;\n  }\n\n  function internalFor(object, callback, keysFunc) {\n    var index = -1,\n      props = keysFunc(object),\n      length = props.length;\n\n    while (++index < length) {\n      var key = props[index];\n      if (callback(object[key], key, object) === false) {\n        break;\n      }\n    }\n    return object;\n  }\n\n  function internalForIn(object, callback) {\n    return internalFor(object, callback, keysIn);\n  }\n\n  function isNode(value) {\n    // IE < 9 presents DOM nodes as `Object` objects except they have `toString`\n    // methods that are `typeof` \"string\" and still can coerce nodes to strings\n    return typeof value.toString != 'function' && typeof (value + '') == 'string';\n  }\n\n  var isArguments = function(value) {\n    return (value && typeof value == 'object') ? toString.call(value) == argsClass : false;\n  }\n\n  // fallback for browsers that can't detect `arguments` objects by [[Class]]\n  if (!supportsArgsClass) {\n    isArguments = function(value) {\n      return (value && typeof value == 'object') ? hasOwnProperty.call(value, 'callee') : false;\n    };\n  }\n\n  var isEqual = Rx.internals.isEqual = function (x, y) {\n    return deepEquals(x, y, [], []);\n  };\n\n  /** @private\n   * Used for deep comparison\n   **/\n  function deepEquals(a, b, stackA, stackB) {\n    // exit early for identical values\n    if (a === b) {\n      // treat `+0` vs. `-0` as not equal\n      return a !== 0 || (1 / a == 1 / b);\n    }\n\n    var type = typeof a,\n        otherType = typeof b;\n\n    // exit early for unlike primitive values\n    if (a === a && (a == null || b == null ||\n        (type != 'function' && type != 'object' && otherType != 'function' && otherType != 'object'))) {\n      return false;\n    }\n\n    // compare [[Class]] names\n    var className = toString.call(a),\n        otherClass = toString.call(b);\n\n    if (className == argsClass) {\n      className = objectClass;\n    }\n    if (otherClass == argsClass) {\n      otherClass = objectClass;\n    }\n    if (className != otherClass) {\n      return false;\n    }\n    switch (className) {\n      case boolClass:\n      case dateClass:\n        // coerce dates and booleans to numbers, dates to milliseconds and booleans\n        // to `1` or `0` treating invalid dates coerced to `NaN` as not equal\n        return +a == +b;\n\n      case numberClass:\n        // treat `NaN` vs. `NaN` as equal\n        return (a != +a) ?\n          b != +b :\n          // but treat `-0` vs. `+0` as not equal\n          (a == 0 ? (1 / a == 1 / b) : a == +b);\n\n      case regexpClass:\n      case stringClass:\n        // coerce regexes to strings (http://es5.github.io/#x15.10.6.4)\n        // treat string primitives and their corresponding object instances as equal\n        return a == String(b);\n    }\n    var isArr = className == arrayClass;\n    if (!isArr) {\n\n      // exit for functions and DOM nodes\n      if (className != objectClass || (!support.nodeClass && (isNode(a) || isNode(b)))) {\n        return false;\n      }\n      // in older versions of Opera, `arguments` objects have `Array` constructors\n      var ctorA = !support.argsObject && isArguments(a) ? Object : a.constructor,\n          ctorB = !support.argsObject && isArguments(b) ? Object : b.constructor;\n\n      // non `Object` object instances with different constructors are not equal\n      if (ctorA != ctorB &&\n            !(hasOwnProperty.call(a, 'constructor') && hasOwnProperty.call(b, 'constructor')) &&\n            !(isFunction(ctorA) && ctorA instanceof ctorA && isFunction(ctorB) && ctorB instanceof ctorB) &&\n            ('constructor' in a && 'constructor' in b)\n          ) {\n        return false;\n      }\n    }\n    // assume cyclic structures are equal\n    // the algorithm for detecting cyclic structures is adapted from ES 5.1\n    // section 15.12.3, abstract operation `JO` (http://es5.github.io/#x15.12.3)\n    var initedStack = !stackA;\n    stackA || (stackA = []);\n    stackB || (stackB = []);\n\n    var length = stackA.length;\n    while (length--) {\n      if (stackA[length] == a) {\n        return stackB[length] == b;\n      }\n    }\n    var size = 0;\n    var result = true;\n\n    // add `a` and `b` to the stack of traversed objects\n    stackA.push(a);\n    stackB.push(b);\n\n    // recursively compare objects and arrays (susceptible to call stack limits)\n    if (isArr) {\n      // compare lengths to determine if a deep comparison is necessary\n      length = a.length;\n      size = b.length;\n      result = size == length;\n\n      if (result) {\n        // deep compare the contents, ignoring non-numeric properties\n        while (size--) {\n          var index = length,\n              value = b[size];\n\n          if (!(result = deepEquals(a[size], value, stackA, stackB))) {\n            break;\n          }\n        }\n      }\n    }\n    else {\n      // deep compare objects using `forIn`, instead of `forOwn`, to avoid `Object.keys`\n      // which, in this case, is more costly\n      internalForIn(b, function(value, key, b) {\n        if (hasOwnProperty.call(b, key)) {\n          // count the number of properties.\n          size++;\n          // deep compare each property value.\n          return (result = hasOwnProperty.call(a, key) && deepEquals(a[key], value, stackA, stackB));\n        }\n      });\n\n      if (result) {\n        // ensure both objects have the same number of properties\n        internalForIn(a, function(value, key, a) {\n          if (hasOwnProperty.call(a, key)) {\n            // `size` will be `-1` if `a` has more properties than `b`\n            return (result = --size > -1);\n          }\n        });\n      }\n    }\n    stackA.pop();\n    stackB.pop();\n\n    return result;\n  }\n\n  var hasProp = {}.hasOwnProperty,\n      slice = Array.prototype.slice;\n\n  var inherits = this.inherits = Rx.internals.inherits = function (child, parent) {\n    function __() { this.constructor = child; }\n    __.prototype = parent.prototype;\n    child.prototype = new __();\n  };\n\n  var addProperties = Rx.internals.addProperties = function (obj) {\n    for(var sources = [], i = 1, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    for (var idx = 0, ln = sources.length; idx < ln; idx++) {\n      var source = sources[idx];\n      for (var prop in source) {\n        obj[prop] = source[prop];\n      }\n    }\n  };\n\n  // Rx Utils\n  var addRef = Rx.internals.addRef = function (xs, r) {\n    return new AnonymousObservable(function (observer) {\n      return new CompositeDisposable(r.getDisposable(), xs.subscribe(observer));\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n\n  // Collections\n  function IndexedItem(id, value) {\n    this.id = id;\n    this.value = value;\n  }\n\n  IndexedItem.prototype.compareTo = function (other) {\n    var c = this.value.compareTo(other.value);\n    c === 0 && (c = this.id - other.id);\n    return c;\n  };\n\n  // Priority Queue for Scheduling\n  var PriorityQueue = Rx.internals.PriorityQueue = function (capacity) {\n    this.items = new Array(capacity);\n    this.length = 0;\n  };\n\n  var priorityProto = PriorityQueue.prototype;\n  priorityProto.isHigherPriority = function (left, right) {\n    return this.items[left].compareTo(this.items[right]) < 0;\n  };\n\n  priorityProto.percolate = function (index) {\n    if (index >= this.length || index < 0) { return; }\n    var parent = index - 1 >> 1;\n    if (parent < 0 || parent === index) { return; }\n    if (this.isHigherPriority(index, parent)) {\n      var temp = this.items[index];\n      this.items[index] = this.items[parent];\n      this.items[parent] = temp;\n      this.percolate(parent);\n    }\n  };\n\n  priorityProto.heapify = function (index) {\n    +index || (index = 0);\n    if (index >= this.length || index < 0) { return; }\n    var left = 2 * index + 1,\n        right = 2 * index + 2,\n        first = index;\n    if (left < this.length && this.isHigherPriority(left, first)) {\n      first = left;\n    }\n    if (right < this.length && this.isHigherPriority(right, first)) {\n      first = right;\n    }\n    if (first !== index) {\n      var temp = this.items[index];\n      this.items[index] = this.items[first];\n      this.items[first] = temp;\n      this.heapify(first);\n    }\n  };\n\n  priorityProto.peek = function () { return this.items[0].value; };\n\n  priorityProto.removeAt = function (index) {\n    this.items[index] = this.items[--this.length];\n    this.items[this.length] = undefined;\n    this.heapify();\n  };\n\n  priorityProto.dequeue = function () {\n    var result = this.peek();\n    this.removeAt(0);\n    return result;\n  };\n\n  priorityProto.enqueue = function (item) {\n    var index = this.length++;\n    this.items[index] = new IndexedItem(PriorityQueue.count++, item);\n    this.percolate(index);\n  };\n\n  priorityProto.remove = function (item) {\n    for (var i = 0; i < this.length; i++) {\n      if (this.items[i].value === item) {\n        this.removeAt(i);\n        return true;\n      }\n    }\n    return false;\n  };\n  PriorityQueue.count = 0;\n\n  /**\n   * Represents a group of disposable resources that are disposed together.\n   * @constructor\n   */\n  var CompositeDisposable = Rx.CompositeDisposable = function () {\n    var args = [];\n    if (Array.isArray(arguments[0])) {\n      args = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    }\n    this.disposables = args;\n    this.isDisposed = false;\n    this.length = this.disposables.length;\n  };\n\n  var CompositeDisposablePrototype = CompositeDisposable.prototype;\n\n  /**\n   * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n   * @param {Mixed} item Disposable to add.\n   */\n  CompositeDisposablePrototype.add = function (item) {\n    if (this.isDisposed) {\n      item.dispose();\n    } else {\n      this.disposables.push(item);\n      this.length++;\n    }\n  };\n\n  /**\n   * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n   * @param {Mixed} item Disposable to remove.\n   * @returns {Boolean} true if found; false otherwise.\n   */\n  CompositeDisposablePrototype.remove = function (item) {\n    var shouldDispose = false;\n    if (!this.isDisposed) {\n      var idx = this.disposables.indexOf(item);\n      if (idx !== -1) {\n        shouldDispose = true;\n        this.disposables.splice(idx, 1);\n        this.length--;\n        item.dispose();\n      }\n    }\n    return shouldDispose;\n  };\n\n  /**\n   *  Disposes all disposables in the group and removes them from the group.\n   */\n  CompositeDisposablePrototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.isDisposed = true;\n      for(var currentDisposables = [], i = 0, len = this.disposables.length; i < len; i++) { currentDisposables.push(this.disposables[i]); }\n      this.disposables = [];\n      this.length = 0;\n\n      for (i = 0, len = currentDisposables.length; i < len; i++) {\n        currentDisposables[i].dispose();\n      }\n    }\n  };\n\n  /**\n   * Converts the existing CompositeDisposable to an array of disposables\n   * @returns {Array} An array of disposable objects.\n   */\n  CompositeDisposablePrototype.toArray = function () {\n    for(var currentDisposables = [], ix = 0, len = this.disposables.length; i < len; i++) { currentDisposables.push(this.disposables[i]); }\n    return currentDisposables;\n  };\n\n  /**\n   * Provides a set of static methods for creating Disposables.\n   *\n   * @constructor\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   */\n  var Disposable = Rx.Disposable = function (action) {\n    this.isDisposed = false;\n    this.action = action || noop;\n  };\n\n  /** Performs the task of cleaning up resources. */\n  Disposable.prototype.dispose = function () {\n    if (!this.isDisposed) {\n      this.action();\n      this.isDisposed = true;\n    }\n  };\n\n  /**\n   * Creates a disposable object that invokes the specified action when disposed.\n   * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n   * @return {Disposable} The disposable object that runs the given action upon disposal.\n   */\n  var disposableCreate = Disposable.create = function (action) { return new Disposable(action); };\n\n  /**\n   * Gets the disposable that does nothing when disposed.\n   */\n  var disposableEmpty = Disposable.empty = { dispose: noop };\n\n  var SingleAssignmentDisposable = Rx.SingleAssignmentDisposable = (function () {\n    function BooleanDisposable () {\n      this.isDisposed = false;\n      this.current = null;\n    }\n\n    var booleanDisposablePrototype = BooleanDisposable.prototype;\n\n    /**\n     * Gets the underlying disposable.\n     * @return The underlying disposable.\n     */\n    booleanDisposablePrototype.getDisposable = function () {\n      return this.current;\n    };\n\n    /**\n     * Sets the underlying disposable.\n     * @param {Disposable} value The new underlying disposable.\n     */\n    booleanDisposablePrototype.setDisposable = function (value) {\n      var shouldDispose = this.isDisposed;\n      if (!shouldDispose) {\n        var old = this.current;\n        this.current = value;\n      }\n      old && old.dispose();\n      shouldDispose && value && value.dispose();\n    };\n\n    /**\n     * Disposes the underlying disposable as well as all future replacements.\n     */\n    booleanDisposablePrototype.dispose = function () {\n      if (!this.isDisposed) {\n        this.isDisposed = true;\n        var old = this.current;\n        this.current = null;\n      }\n      old && old.dispose();\n    };\n\n    return BooleanDisposable;\n  }());\n  var SerialDisposable = Rx.SerialDisposable = SingleAssignmentDisposable;\n\n  /**\n   * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n   */\n  var RefCountDisposable = Rx.RefCountDisposable = (function () {\n\n    function InnerDisposable(disposable) {\n      this.disposable = disposable;\n      this.disposable.count++;\n      this.isInnerDisposed = false;\n    }\n\n    InnerDisposable.prototype.dispose = function () {\n      if (!this.disposable.isDisposed && !this.isInnerDisposed) {\n        this.isInnerDisposed = true;\n        this.disposable.count--;\n        if (this.disposable.count === 0 && this.disposable.isPrimaryDisposed) {\n          this.disposable.isDisposed = true;\n          this.disposable.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Initializes a new instance of the RefCountDisposable with the specified disposable.\n     * @constructor\n     * @param {Disposable} disposable Underlying disposable.\n      */\n    function RefCountDisposable(disposable) {\n      this.underlyingDisposable = disposable;\n      this.isDisposed = false;\n      this.isPrimaryDisposed = false;\n      this.count = 0;\n    }\n\n    /**\n     * Disposes the underlying disposable only when all dependent disposables have been disposed\n     */\n    RefCountDisposable.prototype.dispose = function () {\n      if (!this.isDisposed && !this.isPrimaryDisposed) {\n        this.isPrimaryDisposed = true;\n        if (this.count === 0) {\n          this.isDisposed = true;\n          this.underlyingDisposable.dispose();\n        }\n      }\n    };\n\n    /**\n     * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n     * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n     */\n    RefCountDisposable.prototype.getDisposable = function () {\n      return this.isDisposed ? disposableEmpty : new InnerDisposable(this);\n    };\n\n    return RefCountDisposable;\n  })();\n\n  var ScheduledItem = Rx.internals.ScheduledItem = function (scheduler, state, action, dueTime, comparer) {\n    this.scheduler = scheduler;\n    this.state = state;\n    this.action = action;\n    this.dueTime = dueTime;\n    this.comparer = comparer || defaultSubComparer;\n    this.disposable = new SingleAssignmentDisposable();\n  }\n\n  ScheduledItem.prototype.invoke = function () {\n    this.disposable.setDisposable(this.invokeCore());\n  };\n\n  ScheduledItem.prototype.compareTo = function (other) {\n    return this.comparer(this.dueTime, other.dueTime);\n  };\n\n  ScheduledItem.prototype.isCancelled = function () {\n    return this.disposable.isDisposed;\n  };\n\n  ScheduledItem.prototype.invokeCore = function () {\n    return this.action(this.scheduler, this.state);\n  };\n\n  /** Provides a set of static properties to access commonly used schedulers. */\n  var Scheduler = Rx.Scheduler = (function () {\n\n    function Scheduler(now, schedule, scheduleRelative, scheduleAbsolute) {\n      this.now = now;\n      this._schedule = schedule;\n      this._scheduleRelative = scheduleRelative;\n      this._scheduleAbsolute = scheduleAbsolute;\n    }\n\n    function invokeAction(scheduler, action) {\n      action();\n      return disposableEmpty;\n    }\n\n    var schedulerProto = Scheduler.prototype;\n\n    /**\n     * Schedules an action to be executed.\n     * @param {Function} action Action to execute.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.schedule = function (action) {\n      return this._schedule(action, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed.\n     * @param state State passed to the action to be executed.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithState = function (state, action) {\n      return this._schedule(state, action);\n    };\n\n    /**\n     * Schedules an action to be executed after the specified relative due time.\n     * @param {Function} action Action to execute.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithRelative = function (dueTime, action) {\n      return this._scheduleRelative(action, dueTime, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed after dueTime.\n     * @param state State passed to the action to be executed.\n     * @param {Function} action Action to be executed.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithRelativeAndState = function (state, dueTime, action) {\n      return this._scheduleRelative(state, dueTime, action);\n    };\n\n    /**\n     * Schedules an action to be executed at the specified absolute due time.\n     * @param {Function} action Action to execute.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n      */\n    schedulerProto.scheduleWithAbsolute = function (dueTime, action) {\n      return this._scheduleAbsolute(action, dueTime, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to be executed.\n     * @param {Number}dueTime Absolute time at which to execute the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleWithAbsoluteAndState = function (state, dueTime, action) {\n      return this._scheduleAbsolute(state, dueTime, action);\n    };\n\n    /** Gets the current time according to the local machine's system clock. */\n    Scheduler.now = defaultNow;\n\n    /**\n     * Normalizes the specified TimeSpan value to a positive value.\n     * @param {Number} timeSpan The time span value to normalize.\n     * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n     */\n    Scheduler.normalize = function (timeSpan) {\n      timeSpan < 0 && (timeSpan = 0);\n      return timeSpan;\n    };\n\n    return Scheduler;\n  }());\n\n  var normalizeTime = Scheduler.normalize;\n\n  (function (schedulerProto) {\n    function invokeRecImmediate(scheduler, pair) {\n      var state = pair.first, action = pair.second, group = new CompositeDisposable(),\n      recursiveAction = function (state1) {\n        action(state1, function (state2) {\n          var isAdded = false, isDone = false,\n          d = scheduler.scheduleWithState(state2, function (scheduler1, state3) {\n            if (isAdded) {\n              group.remove(d);\n            } else {\n              isDone = true;\n            }\n            recursiveAction(state3);\n            return disposableEmpty;\n          });\n          if (!isDone) {\n            group.add(d);\n            isAdded = true;\n          }\n        });\n      };\n      recursiveAction(state);\n      return group;\n    }\n\n    function invokeRecDate(scheduler, pair, method) {\n      var state = pair.first, action = pair.second, group = new CompositeDisposable(),\n      recursiveAction = function (state1) {\n        action(state1, function (state2, dueTime1) {\n          var isAdded = false, isDone = false,\n          d = scheduler[method](state2, dueTime1, function (scheduler1, state3) {\n            if (isAdded) {\n              group.remove(d);\n            } else {\n              isDone = true;\n            }\n            recursiveAction(state3);\n            return disposableEmpty;\n          });\n          if (!isDone) {\n            group.add(d);\n            isAdded = true;\n          }\n        });\n      };\n      recursiveAction(state);\n      return group;\n    }\n\n    function scheduleInnerRecursive(action, self) {\n      action(function(dt) { self(action, dt); });\n    }\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursive = function (action) {\n      return this.scheduleRecursiveWithState(action, function (_action, self) {\n        _action(function () { self(_action); }); });\n    };\n\n    /**\n     * Schedules an action to be executed recursively.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithState = function (state, action) {\n      return this.scheduleWithState({ first: state, second: action }, invokeRecImmediate);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative due time.\n     * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified relative time.\n     * @param {Number}dueTime Relative time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithRelative = function (dueTime, action) {\n      return this.scheduleRecursiveWithRelativeAndState(action, dueTime, scheduleInnerRecursive);\n    };\n\n    /**\n     * Schedules an action to be executed recursively after a specified relative due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number}dueTime Relative time after which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithRelativeAndState = function (state, dueTime, action) {\n      return this._scheduleRelative({ first: state, second: action }, dueTime, function (s, p) {\n        return invokeRecDate(s, p, 'scheduleWithRelativeAndState');\n      });\n    };\n\n    /**\n     * Schedules an action to be executed recursively at a specified absolute due time.\n     * @param {Function} action Action to execute recursively. The parameter passed to the action is used to trigger recursive scheduling of the action at the specified absolute time.\n     * @param {Number}dueTime Absolute time at which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithAbsolute = function (dueTime, action) {\n      return this.scheduleRecursiveWithAbsoluteAndState(action, dueTime, scheduleInnerRecursive);\n    };\n\n    /**\n     * Schedules an action to be executed recursively at a specified absolute due time.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n     * @param {Number}dueTime Absolute time at which to execute the action for the first time.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    schedulerProto.scheduleRecursiveWithAbsoluteAndState = function (state, dueTime, action) {\n      return this._scheduleAbsolute({ first: state, second: action }, dueTime, function (s, p) {\n        return invokeRecDate(s, p, 'scheduleWithAbsoluteAndState');\n      });\n    };\n  }(Scheduler.prototype));\n\n  (function (schedulerProto) {\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    Scheduler.prototype.schedulePeriodic = function (period, action) {\n      return this.schedulePeriodicWithState(null, period, action);\n    };\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    Scheduler.prototype.schedulePeriodicWithState = function(state, period, action) {\n      if (typeof root.setInterval === 'undefined') { throw new Error('Periodic scheduling not supported.'); }\n      var s = state;\n\n      var id = root.setInterval(function () {\n        s = action(s);\n      }, period);\n\n      return disposableCreate(function () {\n        root.clearInterval(id);\n      });\n    };\n\n  }(Scheduler.prototype));\n\n  /** Gets a scheduler that schedules work immediately on the current thread. */\n  var immediateScheduler = Scheduler.immediate = (function () {\n\n    function scheduleNow(state, action) { return action(this, state); }\n\n    function scheduleRelative(state, dueTime, action) {\n      var dt = this.now() + normalizeTime(dueTime);\n      while (dt - this.now() > 0) { }\n      return action(this, state);\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);\n    }\n\n    return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n  }());\n\n  /**\n   * Gets a scheduler that schedules work as soon as possible on the current thread.\n   */\n  var currentThreadScheduler = Scheduler.currentThread = (function () {\n    var queue;\n\n    function runTrampoline (q) {\n      while (q.length > 0) {\n        var item = q.dequeue();\n        if (!item.isCancelled()) {\n          // Note, do not schedule blocking work!\n          while (item.dueTime - Scheduler.now() > 0) {\n          }\n          !item.isCancelled() && item.invoke();\n        }\n      }\n    }\n\n    function scheduleNow(state, action) {\n      return this.scheduleWithRelativeAndState(state, 0, action);\n    }\n\n    function scheduleRelative(state, dueTime, action) {\n      var dt = this.now() + Scheduler.normalize(dueTime),\n          si = new ScheduledItem(this, state, action, dt);\n\n      if (!queue) {\n        queue = new PriorityQueue(4);\n        queue.enqueue(si);\n        try {\n          runTrampoline(queue);\n        } catch (e) {\n          throw e;\n        } finally {\n          queue = null;\n        }\n      } else {\n        queue.enqueue(si);\n      }\n      return si.disposable;\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);\n    }\n\n    var currentScheduler = new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n\n    currentScheduler.scheduleRequired = function () { return !queue; };\n    currentScheduler.ensureTrampoline = function (action) {\n      if (!queue) { this.schedule(action); } else { action(); }\n    };\n\n    return currentScheduler;\n  }());\n\n  var SchedulePeriodicRecursive = Rx.internals.SchedulePeriodicRecursive = (function () {\n    function tick(command, recurse) {\n      recurse(0, this._period);\n      try {\n        this._state = this._action(this._state);\n      } catch (e) {\n        this._cancel.dispose();\n        throw e;\n      }\n    }\n\n    function SchedulePeriodicRecursive(scheduler, state, period, action) {\n      this._scheduler = scheduler;\n      this._state = state;\n      this._period = period;\n      this._action = action;\n    }\n\n    SchedulePeriodicRecursive.prototype.start = function () {\n      var d = new SingleAssignmentDisposable();\n      this._cancel = d;\n      d.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0, this._period, tick.bind(this)));\n\n      return d;\n    };\n\n    return SchedulePeriodicRecursive;\n  }());\n\n  var scheduleMethod, clearMethod = noop;\n  var localTimer = (function () {\n    var localSetTimeout, localClearTimeout = noop;\n    if ('WScript' in this) {\n      localSetTimeout = function (fn, time) {\n        WScript.Sleep(time);\n        fn();\n      };\n    } else if (!!root.setTimeout) {\n      localSetTimeout = root.setTimeout;\n      localClearTimeout = root.clearTimeout;\n    } else {\n      throw new Error('No concurrency detected!');\n    }\n\n    return {\n      setTimeout: localSetTimeout,\n      clearTimeout: localClearTimeout\n    };\n  }());\n  var localSetTimeout = localTimer.setTimeout,\n    localClearTimeout = localTimer.clearTimeout;\n\n  (function () {\n\n    var reNative = RegExp('^' +\n      String(toString)\n        .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n        .replace(/toString| for [^\\]]+/g, '.*?') + '$'\n    );\n\n    var setImmediate = typeof (setImmediate = freeGlobal && moduleExports && freeGlobal.setImmediate) == 'function' &&\n      !reNative.test(setImmediate) && setImmediate,\n      clearImmediate = typeof (clearImmediate = freeGlobal && moduleExports && freeGlobal.clearImmediate) == 'function' &&\n      !reNative.test(clearImmediate) && clearImmediate;\n\n    function postMessageSupported () {\n      // Ensure not in a worker\n      if (!root.postMessage || root.importScripts) { return false; }\n      var isAsync = false,\n          oldHandler = root.onmessage;\n      // Test for async\n      root.onmessage = function () { isAsync = true; };\n      root.postMessage('', '*');\n      root.onmessage = oldHandler;\n\n      return isAsync;\n    }\n\n    // Use in order, setImmediate, nextTick, postMessage, MessageChannel, script readystatechanged, setTimeout\n    if (typeof setImmediate === 'function') {\n      scheduleMethod = setImmediate;\n      clearMethod = clearImmediate;\n    } else if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleMethod = process.nextTick;\n    } else if (postMessageSupported()) {\n      var MSG_PREFIX = 'ms.rx.schedule' + Math.random(),\n        tasks = {},\n        taskId = 0;\n\n      var onGlobalPostMessage = function (event) {\n        // Only if we're a match to avoid any other global events\n        if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {\n          var handleId = event.data.substring(MSG_PREFIX.length),\n            action = tasks[handleId];\n          action();\n          delete tasks[handleId];\n        }\n      }\n\n      if (root.addEventListener) {\n        root.addEventListener('message', onGlobalPostMessage, false);\n      } else {\n        root.attachEvent('onmessage', onGlobalPostMessage, false);\n      }\n\n      scheduleMethod = function (action) {\n        var currentId = taskId++;\n        tasks[currentId] = action;\n        root.postMessage(MSG_PREFIX + currentId, '*');\n      };\n    } else if (!!root.MessageChannel) {\n      var channel = new root.MessageChannel(),\n        channelTasks = {},\n        channelTaskId = 0;\n\n      channel.port1.onmessage = function (event) {\n        var id = event.data,\n          action = channelTasks[id];\n        action();\n        delete channelTasks[id];\n      };\n\n      scheduleMethod = function (action) {\n        var id = channelTaskId++;\n        channelTasks[id] = action;\n        channel.port2.postMessage(id);\n      };\n    } else if ('document' in root && 'onreadystatechange' in root.document.createElement('script')) {\n\n      scheduleMethod = function (action) {\n        var scriptElement = root.document.createElement('script');\n        scriptElement.onreadystatechange = function () {\n          action();\n          scriptElement.onreadystatechange = null;\n          scriptElement.parentNode.removeChild(scriptElement);\n          scriptElement = null;\n        };\n        root.document.documentElement.appendChild(scriptElement);\n      };\n\n    } else {\n      scheduleMethod = function (action) { return localSetTimeout(action, 0); };\n      clearMethod = localClearTimeout;\n    }\n  }());\n\n  /**\n   * Gets a scheduler that schedules work via a timed callback based upon platform.\n   */\n  var timeoutScheduler = Scheduler.timeout = (function () {\n\n    function scheduleNow(state, action) {\n      var scheduler = this,\n        disposable = new SingleAssignmentDisposable();\n      var id = scheduleMethod(function () {\n        if (!disposable.isDisposed) {\n          disposable.setDisposable(action(scheduler, state));\n        }\n      });\n      return new CompositeDisposable(disposable, disposableCreate(function () {\n        clearMethod(id);\n      }));\n    }\n\n    function scheduleRelative(state, dueTime, action) {\n      var scheduler = this,\n        dt = Scheduler.normalize(dueTime);\n      if (dt === 0) {\n        return scheduler.scheduleWithState(state, action);\n      }\n      var disposable = new SingleAssignmentDisposable();\n      var id = localSetTimeout(function () {\n        if (!disposable.isDisposed) {\n          disposable.setDisposable(action(scheduler, state));\n        }\n      }, dt);\n      return new CompositeDisposable(disposable, disposableCreate(function () {\n        localClearTimeout(id);\n      }));\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleWithRelativeAndState(state, dueTime - this.now(), action);\n    }\n\n    return new Scheduler(defaultNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n  })();\n\n  /**\n   *  Represents a notification to an observer.\n   */\n  var Notification = Rx.Notification = (function () {\n    function Notification(kind, hasValue) {\n      this.hasValue = hasValue == null ? false : hasValue;\n      this.kind = kind;\n    }\n\n    /**\n     * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n     *\n     * @memberOf Notification\n     * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n     * @param {Function} onError Delegate to invoke for an OnError notification.\n     * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n     * @returns {Any} Result produced by the observation.\n     */\n    Notification.prototype.accept = function (observerOrOnNext, onError, onCompleted) {\n      return observerOrOnNext && typeof observerOrOnNext === 'object' ?\n        this._acceptObservable(observerOrOnNext) :\n        this._accept(observerOrOnNext, onError, onCompleted);\n    };\n\n    /**\n     * Returns an observable sequence with a single notification.\n     *\n     * @memberOf Notifications\n     * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n     * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n     */\n    Notification.prototype.toObservable = function (scheduler) {\n      var notification = this;\n      isScheduler(scheduler) || (scheduler = immediateScheduler);\n      return new AnonymousObservable(function (observer) {\n        return scheduler.schedule(function () {\n          notification._acceptObservable(observer);\n          notification.kind === 'N' && observer.onCompleted();\n        });\n      });\n    };\n\n    return Notification;\n  })();\n\n  /**\n   * Creates an object that represents an OnNext notification to an observer.\n   * @param {Any} value The value contained in the notification.\n   * @returns {Notification} The OnNext notification containing the value.\n   */\n  var notificationCreateOnNext = Notification.createOnNext = (function () {\n\n      function _accept (onNext) { return onNext(this.value); }\n      function _acceptObservable(observer) { return observer.onNext(this.value); }\n      function toString () { return 'OnNext(' + this.value + ')'; }\n\n      return function (value) {\n        var notification = new Notification('N', true);\n        notification.value = value;\n        notification._accept = _accept;\n        notification._acceptObservable = _acceptObservable;\n        notification.toString = toString;\n        return notification;\n      };\n  }());\n\n  /**\n   * Creates an object that represents an OnError notification to an observer.\n   * @param {Any} error The exception contained in the notification.\n   * @returns {Notification} The OnError notification containing the exception.\n   */\n  var notificationCreateOnError = Notification.createOnError = (function () {\n\n    function _accept (onNext, onError) { return onError(this.exception); }\n    function _acceptObservable(observer) { return observer.onError(this.exception); }\n    function toString () { return 'OnError(' + this.exception + ')'; }\n\n    return function (e) {\n      var notification = new Notification('E');\n      notification.exception = e;\n      notification._accept = _accept;\n      notification._acceptObservable = _acceptObservable;\n      notification.toString = toString;\n      return notification;\n    };\n  }());\n\n  /**\n   * Creates an object that represents an OnCompleted notification to an observer.\n   * @returns {Notification} The OnCompleted notification.\n   */\n  var notificationCreateOnCompleted = Notification.createOnCompleted = (function () {\n\n    function _accept (onNext, onError, onCompleted) { return onCompleted(); }\n    function _acceptObservable(observer) { return observer.onCompleted(); }\n    function toString () { return 'OnCompleted()'; }\n\n    return function () {\n      var notification = new Notification('C');\n      notification._accept = _accept;\n      notification._acceptObservable = _acceptObservable;\n      notification.toString = toString;\n      return notification;\n    };\n  }());\n\n  var Enumerator = Rx.internals.Enumerator = function (next) {\n    this._next = next;\n  };\n\n  Enumerator.prototype.next = function () {\n    return this._next();\n  };\n\n  Enumerator.prototype[$iterator$] = function () { return this; }\n\n  var Enumerable = Rx.internals.Enumerable = function (iterator) {\n    this._iterator = iterator;\n  };\n\n  Enumerable.prototype[$iterator$] = function () {\n    return this._iterator();\n  };\n\n  Enumerable.prototype.concat = function () {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var e = sources[$iterator$]();\n\n      var isDisposed, subscription = new SerialDisposable();\n      var cancelable = immediateScheduler.scheduleRecursive(function (self) {\n        if (isDisposed) { return; }\n        try {\n          var currentItem = e.next();\n        } catch (ex) {\n          return o.onError(ex);\n        }\n\n        if (currentItem.done) {\n          return o.onCompleted();\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var d = new SingleAssignmentDisposable();\n        subscription.setDisposable(d);\n        d.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function(err) { o.onError(err); },\n          self)\n        );\n      });\n\n      return new CompositeDisposable(subscription, cancelable, disposableCreate(function () {\n        isDisposed = true;\n      }));\n    });\n  };\n\n  Enumerable.prototype.catchError = function () {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var e = sources[$iterator$]();\n\n      var isDisposed, subscription = new SerialDisposable();\n      var cancelable = immediateScheduler.scheduleRecursiveWithState(null, function (lastException, self) {\n        if (isDisposed) { return; }\n\n        try {\n          var currentItem = e.next();\n        } catch (ex) {\n          return observer.onError(ex);\n        }\n\n        if (currentItem.done) {\n          if (lastException !== null) {\n            o.onError(lastException);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var d = new SingleAssignmentDisposable();\n        subscription.setDisposable(d);\n        d.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          self,\n          function() { o.onCompleted(); }));\n      });\n      return new CompositeDisposable(subscription, cancelable, disposableCreate(function () {\n        isDisposed = true;\n      }));\n    });\n  };\n\n\n  Enumerable.prototype.catchErrorWhen = function (notificationHandler) {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var exceptions = new Subject(),\n        notifier = new Subject(),\n        handled = notificationHandler(exceptions),\n        notificationDisposable = handled.subscribe(notifier);\n\n      var e = sources[$iterator$]();\n\n      var isDisposed,\n        lastException,\n        subscription = new SerialDisposable();\n      var cancelable = immediateScheduler.scheduleRecursive(function (self) {\n        if (isDisposed) { return; }\n\n        try {\n          var currentItem = e.next();\n        } catch (ex) {\n          return o.onError(ex);\n        }\n\n        if (currentItem.done) {\n          if (lastException) {\n            o.onError(lastException);\n          } else {\n            o.onCompleted();\n          }\n          return;\n        }\n\n        // Check if promise\n        var currentValue = currentItem.value;\n        isPromise(currentValue) && (currentValue = observableFromPromise(currentValue));\n\n        var outer = new SingleAssignmentDisposable();\n        var inner = new SingleAssignmentDisposable();\n        subscription.setDisposable(new CompositeDisposable(inner, outer));\n        outer.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function (exn) {\n            inner.setDisposable(notifier.subscribe(self, function(ex) {\n              o.onError(ex);\n            }, function() {\n              o.onCompleted();\n            }));\n\n            exceptions.onNext(exn);\n          },\n          function() { o.onCompleted(); }));\n      });\n\n      return new CompositeDisposable(notificationDisposable, subscription, cancelable, disposableCreate(function () {\n        isDisposed = true;\n      }));\n    });\n  };\n\n  var enumerableRepeat = Enumerable.repeat = function (value, repeatCount) {\n    if (repeatCount == null) { repeatCount = -1; }\n    return new Enumerable(function () {\n      var left = repeatCount;\n      return new Enumerator(function () {\n        if (left === 0) { return doneEnumerator; }\n        if (left > 0) { left--; }\n        return { done: false, value: value };\n      });\n    });\n  };\n\n  var enumerableOf = Enumerable.of = function (source, selector, thisArg) {\n    if (selector) {\n      var selectorFn = bindCallback(selector, thisArg, 3);\n    }\n    return new Enumerable(function () {\n      var index = -1;\n      return new Enumerator(\n        function () {\n          return ++index < source.length ?\n            { done: false, value: !selector ? source[index] : selectorFn(source[index], index, source) } :\n            doneEnumerator;\n        });\n    });\n  };\n\n  /**\n   * Supports push-style iteration over an observable sequence.\n   */\n  var Observer = Rx.Observer = function () { };\n\n  /**\n   *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n   * @param {Function} [onNext] Observer's OnNext action implementation.\n   * @param {Function} [onError] Observer's OnError action implementation.\n   * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n   * @returns {Observer} The observer object implemented using the given actions.\n   */\n  var observerCreate = Observer.create = function (onNext, onError, onCompleted) {\n    onNext || (onNext = noop);\n    onError || (onError = defaultError);\n    onCompleted || (onCompleted = noop);\n    return new AnonymousObserver(onNext, onError, onCompleted);\n  };\n\n  /**\n   * Abstract base class for implementations of the Observer class.\n   * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n   */\n  var AbstractObserver = Rx.internals.AbstractObserver = (function (__super__) {\n    inherits(AbstractObserver, __super__);\n\n    /**\n     * Creates a new observer in a non-stopped state.\n     */\n    function AbstractObserver() {\n      this.isStopped = false;\n      __super__.call(this);\n    }\n\n    /**\n     * Notifies the observer of a new element in the sequence.\n     * @param {Any} value Next element in the sequence.\n     */\n    AbstractObserver.prototype.onNext = function (value) {\n      if (!this.isStopped) { this.next(value); }\n    };\n\n    /**\n     * Notifies the observer that an exception has occurred.\n     * @param {Any} error The error that has occurred.\n     */\n    AbstractObserver.prototype.onError = function (error) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(error);\n      }\n    };\n\n    /**\n     * Notifies the observer of the end of the sequence.\n     */\n    AbstractObserver.prototype.onCompleted = function () {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.completed();\n      }\n    };\n\n    /**\n     * Disposes the observer, causing it to transition to the stopped state.\n     */\n    AbstractObserver.prototype.dispose = function () {\n      this.isStopped = true;\n    };\n\n    AbstractObserver.prototype.fail = function (e) {\n      if (!this.isStopped) {\n        this.isStopped = true;\n        this.error(e);\n        return true;\n      }\n\n      return false;\n    };\n\n    return AbstractObserver;\n  }(Observer));\n\n  /**\n   * Class to create an Observer instance from delegate-based implementations of the on* methods.\n   */\n  var AnonymousObserver = Rx.AnonymousObserver = (function (__super__) {\n    inherits(AnonymousObserver, __super__);\n\n    /**\n     * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n     * @param {Any} onNext Observer's OnNext action implementation.\n     * @param {Any} onError Observer's OnError action implementation.\n     * @param {Any} onCompleted Observer's OnCompleted action implementation.\n     */\n    function AnonymousObserver(onNext, onError, onCompleted) {\n      __super__.call(this);\n      this._onNext = onNext;\n      this._onError = onError;\n      this._onCompleted = onCompleted;\n    }\n\n    /**\n     * Calls the onNext action.\n     * @param {Any} value Next element in the sequence.\n     */\n    AnonymousObserver.prototype.next = function (value) {\n      this._onNext(value);\n    };\n\n    /**\n     * Calls the onError action.\n     * @param {Any} error The error that has occurred.\n     */\n    AnonymousObserver.prototype.error = function (error) {\n      this._onError(error);\n    };\n\n    /**\n     *  Calls the onCompleted action.\n     */\n    AnonymousObserver.prototype.completed = function () {\n      this._onCompleted();\n    };\n\n    return AnonymousObserver;\n  }(AbstractObserver));\n\n  var observableProto;\n\n  /**\n   * Represents a push-style collection.\n   */\n  var Observable = Rx.Observable = (function () {\n\n    function Observable(subscribe) {\n      if (Rx.config.longStackSupport && hasStacks) {\n        try {\n          throw new Error();\n        } catch (e) {\n          this.stack = e.stack.substring(e.stack.indexOf(\"\\n\") + 1);\n        }\n\n        var self = this;\n        this._subscribe = function (observer) {\n          var oldOnError = observer.onError.bind(observer);\n\n          observer.onError = function (err) {\n            makeStackTraceLong(err, self);\n            oldOnError(err);\n          };\n\n          return subscribe.call(self, observer);\n        };\n      } else {\n        this._subscribe = subscribe;\n      }\n    }\n\n    observableProto = Observable.prototype;\n\n    /**\n     *  Subscribes an observer to the observable sequence.\n     *  @param {Mixed} [observerOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n     *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n     *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n     *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribe = observableProto.forEach = function (observerOrOnNext, onError, onCompleted) {\n      return this._subscribe(typeof observerOrOnNext === 'object' ?\n        observerOrOnNext :\n        observerCreate(observerOrOnNext, onError, onCompleted));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onNext The function to invoke on each element in the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnNext = function (onNext, thisArg) {\n      return this._subscribe(observerCreate(typeof thisArg !== 'undefined' ? function(x) { onNext.call(thisArg, x); } : onNext));\n    };\n\n    /**\n     * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n     * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnError = function (onError, thisArg) {\n      return this._subscribe(observerCreate(null, typeof thisArg !== 'undefined' ? function(e) { onError.call(thisArg, e); } : onError));\n    };\n\n    /**\n     * Subscribes to the next value in the sequence with an optional \"this\" argument.\n     * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n     * @param {Any} [thisArg] Object to use as this when executing callback.\n     * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n     */\n    observableProto.subscribeOnCompleted = function (onCompleted, thisArg) {\n      return this._subscribe(observerCreate(null, null, typeof thisArg !== 'undefined' ? function() { onCompleted.call(thisArg); } : onCompleted));\n    };\n\n    return Observable;\n  })();\n\n  var ScheduledObserver = Rx.internals.ScheduledObserver = (function (__super__) {\n    inherits(ScheduledObserver, __super__);\n\n    function ScheduledObserver(scheduler, observer) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.observer = observer;\n      this.isAcquired = false;\n      this.hasFaulted = false;\n      this.queue = [];\n      this.disposable = new SerialDisposable();\n    }\n\n    ScheduledObserver.prototype.next = function (value) {\n      var self = this;\n      this.queue.push(function () { self.observer.onNext(value); });\n    };\n\n    ScheduledObserver.prototype.error = function (e) {\n      var self = this;\n      this.queue.push(function () { self.observer.onError(e); });\n    };\n\n    ScheduledObserver.prototype.completed = function () {\n      var self = this;\n      this.queue.push(function () { self.observer.onCompleted(); });\n    };\n\n    ScheduledObserver.prototype.ensureActive = function () {\n      var isOwner = false, parent = this;\n      if (!this.hasFaulted && this.queue.length > 0) {\n        isOwner = !this.isAcquired;\n        this.isAcquired = true;\n      }\n      if (isOwner) {\n        this.disposable.setDisposable(this.scheduler.scheduleRecursive(function (self) {\n          var work;\n          if (parent.queue.length > 0) {\n            work = parent.queue.shift();\n          } else {\n            parent.isAcquired = false;\n            return;\n          }\n          try {\n            work();\n          } catch (ex) {\n            parent.queue = [];\n            parent.hasFaulted = true;\n            throw ex;\n          }\n          self();\n        }));\n      }\n    };\n\n    ScheduledObserver.prototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.disposable.dispose();\n    };\n\n    return ScheduledObserver;\n  }(AbstractObserver));\n\n  var ObservableBase = Rx.ObservableBase = (function (__super__) {\n\n  inherits(ObservableBase, __super__);\n\n  // Fix subscriber to check for undefined or function returned to decorate as Disposable\n  function fixSubscriber(subscriber) {\n    if (subscriber && typeof subscriber.dispose === 'function') { return subscriber; }\n\n      return typeof subscriber === 'function' ?\n        disposableCreate(subscriber) :\n        disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], self = state[1];\n      try {\n        ado.setDisposable(fixSubscriber(self.subscribeCore(ado)));\n      } catch (e) {\n        if (!ado.fail(e)) { throw e; }\n      }\n    }\n\n    function subscribe(observer) {\n      var ado = new AutoDetachObserver(observer), state = [ado, this];\n\n      if (currentThreadScheduler.scheduleRequired()) {\n        currentThreadScheduler.scheduleWithState(state, setDisposable);\n      } else {\n        setDisposable(null, state);\n      }\n\n      return ado;\n    }\n\n    function ObservableBase() {\n      __super__.call(this, subscribe);\n    }\n\n    ObservableBase.prototype.subscribeCore = function(observer) {\n      throw new Error('Not implemeneted');\n    }\n\n    return ObservableBase;\n\n  }(Observable));\n\n  /**\n   * Creates an array from an observable sequence.\n   * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n   */\n  observableProto.toArray = function () {\n    var source = this;\n    return new AnonymousObservable(function(observer) {\n      var arr = [];\n      return source.subscribe(\n        function (x) { arr.push(x); },\n        function (e) { observer.onError(e); },\n        function () {\n          observer.onNext(arr);\n          observer.onCompleted();\n        });\n    }, source);\n  };\n\n  /**\n   *  Creates an observable sequence from a specified subscribe method implementation.\n   * @example\n   *  var res = Rx.Observable.create(function (observer) { return function () { } );\n   *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n   *  var res = Rx.Observable.create(function (observer) { } );\n   * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n   * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n   */\n  Observable.create = Observable.createWithDisposable = function (subscribe, parent) {\n    return new AnonymousObservable(subscribe, parent);\n  };\n\n  /**\n   *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n   *\n   * @example\n   *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n   * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n   * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n   */\n  var observableDefer = Observable.defer = function (observableFactory) {\n    return new AnonymousObservable(function (observer) {\n      var result;\n      try {\n        result = observableFactory();\n      } catch (e) {\n        return observableThrow(e).subscribe(observer);\n      }\n      isPromise(result) && (result = observableFromPromise(result));\n      return result.subscribe(observer);\n    });\n  };\n\n  /**\n   *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n   *\n   * @example\n   *  var res = Rx.Observable.empty();\n   *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n   * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n   * @returns {Observable} An observable sequence with no elements.\n   */\n  var observableEmpty = Observable.empty = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.schedule(function () {\n        observer.onCompleted();\n      });\n    });\n  };\n\n  var maxSafeInteger = Math.pow(2, 53) - 1;\n\n  function StringIterable(str) {\n    this._s = s;\n  }\n\n  StringIterable.prototype[$iterator$] = function () {\n    return new StringIterator(this._s);\n  };\n\n  function StringIterator(str) {\n    this._s = s;\n    this._l = s.length;\n    this._i = 0;\n  }\n\n  StringIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  StringIterator.prototype.next = function () {\n    if (this._i < this._l) {\n      var val = this._s.charAt(this._i++);\n      return { done: false, value: val };\n    } else {\n      return doneEnumerator;\n    }\n  };\n\n  function ArrayIterable(a) {\n    this._a = a;\n  }\n\n  ArrayIterable.prototype[$iterator$] = function () {\n    return new ArrayIterator(this._a);\n  };\n\n  function ArrayIterator(a) {\n    this._a = a;\n    this._l = toLength(a);\n    this._i = 0;\n  }\n\n  ArrayIterator.prototype[$iterator$] = function () {\n    return this;\n  };\n\n  ArrayIterator.prototype.next = function () {\n    if (this._i < this._l) {\n      var val = this._a[this._i++];\n      return { done: false, value: val };\n    } else {\n      return doneEnumerator;\n    }\n  };\n\n  function numberIsFinite(value) {\n    return typeof value === 'number' && root.isFinite(value);\n  }\n\n  function isNan(n) {\n    return n !== n;\n  }\n\n  function getIterable(o) {\n    var i = o[$iterator$], it;\n    if (!i && typeof o === 'string') {\n      it = new StringIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i && o.length !== undefined) {\n      it = new ArrayIterable(o);\n      return it[$iterator$]();\n    }\n    if (!i) { throw new TypeError('Object is not iterable'); }\n    return o[$iterator$]();\n  }\n\n  function sign(value) {\n    var number = +value;\n    if (number === 0) { return number; }\n    if (isNaN(number)) { return number; }\n    return number < 0 ? -1 : 1;\n  }\n\n  function toLength(o) {\n    var len = +o.length;\n    if (isNaN(len)) { return 0; }\n    if (len === 0 || !numberIsFinite(len)) { return len; }\n    len = sign(len) * Math.floor(Math.abs(len));\n    if (len <= 0) { return 0; }\n    if (len > maxSafeInteger) { return maxSafeInteger; }\n    return len;\n  }\n\n  /**\n   * This method creates a new Observable sequence from an array-like or iterable object.\n   * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n   * @param {Function} [mapFn] Map function to call on every element of the array.\n   * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n   * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n   */\n  var observableFrom = Observable.from = function (iterable, mapFn, thisArg, scheduler) {\n    if (iterable == null) {\n      throw new Error('iterable cannot be null.')\n    }\n    if (mapFn && !isFunction(mapFn)) {\n      throw new Error('mapFn when provided must be a function');\n    }\n    if (mapFn) {\n      var mapper = bindCallback(mapFn, thisArg, 2);\n    }\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    var list = Object(iterable), it = getIterable(list);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleRecursiveWithState(0, function (i, self) {\n        try {\n          var next = it.next();\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n        if (next.done) {\n          observer.onCompleted();\n          return;\n        }\n\n        var result = next.value;\n\n        if (mapper) {\n          try {\n            result = mapper(result, i);\n          } catch (e) {\n            observer.onError(e);\n            return;\n          }\n        }\n\n        observer.onNext(result);\n        self(i + 1);\n      });\n    });\n  };\n\n  var FromArrayObservable = (function(__super__) {\n    inherits(FromArrayObservable, __super__);\n    function FromArrayObservable(args, scheduler) {\n      this.args = args;\n      this.scheduler = scheduler || currentThreadScheduler;\n      __super__.call(this);\n    }\n\n    FromArrayObservable.prototype.subscribeCore = function (observer) {\n      var sink = new FromArraySink(observer, this);\n      return sink.run();\n    };\n\n    return FromArrayObservable;\n  }(ObservableBase));\n\n  var FromArraySink = (function () {\n    function FromArraySink(observer, parent) {\n      this.observer = observer;\n      this.parent = parent;\n    }\n\n    function loopRecursive(state, recurse) {\n      if (state.i < state.len) {\n        state.observer.onNext(state.args[state.i++]);\n        recurse(state);\n      } else {\n        state.observer.onCompleted();\n      }\n    }\n\n    FromArraySink.prototype.run = function () {\n      return this.parent.scheduler.scheduleRecursiveWithState(\n        {i: 0, args: this.parent.args, len: this.parent.args.length, observer: this.observer },\n        loopRecursive);\n    };\n\n    return FromArraySink;\n  }());\n\n  /**\n  *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n  * @deprecated use Observable.from or Observable.of\n  * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n  * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n  */\n  var observableFromArray = Observable.fromArray = function (array, scheduler) {\n    return new FromArrayObservable(array, scheduler)\n  };\n\n  /**\n   *  Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n   * @returns {Observable} An observable sequence whose observers will never get called.\n   */\n  var observableNever = Observable.never = function () {\n    return new AnonymousObservable(function () {\n      return disposableEmpty;\n    });\n  };\n\n  function observableOf (scheduler, array) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new AnonymousObservable(function (observer) {\n      var count = 0, len = array.length;\n      return scheduler.scheduleRecursive(function (self) {\n        if (count < len) {\n          observer.onNext(array[count++]);\n          self();\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  }\n\n  /**\n   *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n   * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n   */\n  Observable.of = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableOf(null, args);\n  };\n\n  /**\n   *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n   * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n   * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n   */\n  Observable.ofWithScheduler = function (scheduler) {\n    for(var args = [], i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return observableOf(scheduler, args);\n  };\n\n  /**\n   * Convert an object into an observable sequence of [key, value] pairs.\n   * @param {Object} obj The object to inspect.\n   * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n   * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n   */\n  Observable.pairs = function (obj, scheduler) {\n    scheduler || (scheduler = Rx.Scheduler.currentThread);\n    return new AnonymousObservable(function (observer) {\n      var keys = Object.keys(obj), len = keys.length;\n      return scheduler.scheduleRecursiveWithState(0, function (idx, self) {\n        if (idx < len) {\n          var key = keys[idx];\n          observer.onNext([key, obj[key]]);\n          self(idx + 1);\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.range(0, 10);\n   *  var res = Rx.Observable.range(0, 10, Rx.Scheduler.timeout);\n   * @param {Number} start The value of the first integer in the sequence.\n   * @param {Number} count The number of sequential integers to generate.\n   * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n   * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n   */\n  Observable.range = function (start, count, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleRecursiveWithState(0, function (i, self) {\n        if (i < count) {\n          observer.onNext(start + i);\n          self(i + 1);\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n   *\n   * @example\n   *  var res = Rx.Observable.repeat(42);\n   *  var res = Rx.Observable.repeat(42, 4);\n   *  3 - res = Rx.Observable.repeat(42, 4, Rx.Scheduler.timeout);\n   *  4 - res = Rx.Observable.repeat(42, null, Rx.Scheduler.timeout);\n   * @param {Mixed} value Element to repeat.\n   * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n   * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n   */\n  Observable.repeat = function (value, repeatCount, scheduler) {\n    isScheduler(scheduler) || (scheduler = currentThreadScheduler);\n    return observableReturn(value, scheduler).repeat(repeatCount == null ? -1 : repeatCount);\n  };\n\n  /**\n   *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n   *  There is an alias called 'just', and 'returnValue' for browsers <IE9.\n   * @param {Mixed} value Single element in the resulting observable sequence.\n   * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} An observable sequence containing the single specified element.\n   */\n  var observableReturn = Observable['return'] = Observable.just = function (value, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.schedule(function () {\n        observer.onNext(value);\n        observer.onCompleted();\n      });\n    });\n  };\n\n  /** @deprecated use return or just */\n  Observable.returnValue = function () {\n    //deprecate('returnValue', 'return or just');\n    return observableReturn.apply(null, arguments);\n  };\n\n  /**\n   *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n   *  There is an alias to this method called 'throwError' for browsers <IE9.\n   * @param {Mixed} error An object used for the sequence's termination.\n   * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n   * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n   */\n  var observableThrow = Observable['throw'] = Observable.throwError = function (error, scheduler) {\n    isScheduler(scheduler) || (scheduler = immediateScheduler);\n    return new AnonymousObservable(function (observer) {\n      return scheduler.schedule(function () {\n        observer.onError(error);\n      });\n    });\n  };\n\n  /** @deprecated use #some instead */\n  Observable.throwException = function () {\n    //deprecate('throwException', 'throwError');\n    return Observable.throwError.apply(null, arguments);\n  };\n\n  function observableCatchHandler(source, handler) {\n    return new AnonymousObservable(function (observer) {\n      var d1 = new SingleAssignmentDisposable(), subscription = new SerialDisposable();\n      subscription.setDisposable(d1);\n      d1.setDisposable(source.subscribe(observer.onNext.bind(observer), function (exception) {\n        var d, result;\n        try {\n          result = handler(exception);\n        } catch (ex) {\n          observer.onError(ex);\n          return;\n        }\n        isPromise(result) && (result = observableFromPromise(result));\n\n        d = new SingleAssignmentDisposable();\n        subscription.setDisposable(d);\n        d.setDisposable(result.subscribe(observer));\n      }, observer.onCompleted.bind(observer)));\n\n      return subscription;\n    }, source);\n  }\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @example\n   * 1 - xs.catchException(ys)\n   * 2 - xs.catchException(function (ex) { return ys(ex); })\n   * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n   * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n   */\n  observableProto['catch'] = observableProto.catchError = function (handlerOrSecond) {\n    return typeof handlerOrSecond === 'function' ?\n      observableCatchHandler(this, handlerOrSecond) :\n      observableCatch([this, handlerOrSecond]);\n  };\n\n  /**\n   * @deprecated use #catch or #catchError instead.\n   */\n  observableProto.catchException = function (handlerOrSecond) {\n    //deprecate('catchException', 'catch or catchError');\n    return this.catchError(handlerOrSecond);\n  };\n\n  /**\n   * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n   * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n   * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n   */\n  var observableCatch = Observable.catchError = Observable['catch'] = Observable.catchException = function () {\n    var items = [];\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { items.push(arguments[i]); }\n    }\n    return enumerableOf(items).catchError();\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   * This can be in the form of an argument list of observables or an array.\n   *\n   * @example\n   * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.combineLatest = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    if (Array.isArray(args[0])) {\n      args[0].unshift(this);\n    } else {\n      args.unshift(this);\n    }\n    return combineLatest.apply(this, args);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n   *\n   * @example\n   * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  var combineLatest = Observable.combineLatest = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    var resultSelector = args.pop();\n\n    if (Array.isArray(args[0])) {\n      args = args[0];\n    }\n\n    return new AnonymousObservable(function (observer) {\n      var falseFactory = function () { return false; },\n        n = args.length,\n        hasValue = arrayInitialize(n, falseFactory),\n        hasValueAll = false,\n        isDone = arrayInitialize(n, falseFactory),\n        values = new Array(n);\n\n      function next(i) {\n        var res;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          try {\n            res = resultSelector.apply(null, values);\n          } catch (ex) {\n            observer.onError(ex);\n            return;\n          }\n          observer.onNext(res);\n        } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n          observer.onCompleted();\n        }\n      }\n\n      function done (i) {\n        isDone[i] = true;\n        if (isDone.every(identity)) {\n          observer.onCompleted();\n        }\n      }\n\n      var subscriptions = new Array(n);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          var source = args[i], sad = new SingleAssignmentDisposable();\n          isPromise(source) && (source = observableFromPromise(source));\n          sad.setDisposable(source.subscribe(function (x) {\n              values[i] = x;\n              next(i);\n            },\n            function(e) { observer.onError(e); },\n            function () { done(i); }\n          ));\n          subscriptions[i] = sad;\n        }(idx));\n      }\n\n      return new CompositeDisposable(subscriptions);\n    }, this);\n  };\n\n  /**\n   * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  observableProto.concat = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    args.unshift(this);\n    return observableConcat.apply(null, args);\n  };\n\n  /**\n   * Concatenates all the observable sequences.\n   * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n   * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n   */\n  var observableConcat = Observable.concat = function () {\n    var items = [];\n    if (Array.isArray(arguments[0])) {\n      items = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { items.push(arguments[i]); }\n    }\n    return enumerableOf(items).concat();\n  };\n\n  /**\n   * Concatenates an observable sequence of observable sequences.\n   * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n   */\n  observableProto.concatAll = observableProto.concatObservable = function () {\n    return this.merge(1);\n  };\n\n  /**\n   * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n   * Or merges two observable sequences into a single observable sequence.\n   *\n   * @example\n   * 1 - merged = sources.merge(1);\n   * 2 - merged = source.merge(otherSource);\n   * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n   * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n   */\n  observableProto.merge = function (maxConcurrentOrOther) {\n    if (typeof maxConcurrentOrOther !== 'number') { return observableMerge(this, maxConcurrentOrOther); }\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var activeCount = 0, group = new CompositeDisposable(), isStopped = false, q = [];\n\n      function subscribe(xs) {\n        var subscription = new SingleAssignmentDisposable();\n        group.add(subscription);\n\n        // Check for promises support\n        isPromise(xs) && (xs = observableFromPromise(xs));\n\n        subscription.setDisposable(xs.subscribe(function (x) { o.onNext(x); }, function (e) { o.onError(e); }, function () {\n          group.remove(subscription);\n          if (q.length > 0) {\n            subscribe(q.shift());\n          } else {\n            activeCount--;\n            isStopped && activeCount === 0 && o.onCompleted();\n          }\n        }));\n      }\n      group.add(sources.subscribe(function (innerSource) {\n        if (activeCount < maxConcurrentOrOther) {\n          activeCount++;\n          subscribe(innerSource);\n        } else {\n          q.push(innerSource);\n        }\n      }, function (e) { o.onError(e); }, function () {\n        isStopped = true;\n        activeCount === 0 && o.onCompleted();\n      }));\n      return group;\n    }, sources);\n  };\n\n  /**\n   * Merges all the observable sequences into a single observable sequence.\n   * The scheduler is optional and if not specified, the immediate scheduler is used.\n   * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n   */\n  var observableMerge = Observable.merge = function () {\n    var scheduler, sources = [], i, len = arguments.length;\n    if (!arguments[0]) {\n      scheduler = immediateScheduler;\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else if (isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      for(i = 1; i < len; i++) { sources.push(arguments[i]); }\n    } else {\n      scheduler = immediateScheduler;\n      for(i = 0; i < len; i++) { sources.push(arguments[i]); }\n    }\n    if (Array.isArray(sources[0])) {\n      sources = sources[0];\n    }\n    return observableOf(scheduler, sources).mergeAll();\n  };\n\n  /**\n   * Merges an observable sequence of observable sequences into an observable sequence.\n   * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n   */\n  observableProto.mergeAll = function () {\n    var sources = this;\n    return new AnonymousObservable(function (o) {\n      var group = new CompositeDisposable(),\n        isStopped = false,\n        m = new SingleAssignmentDisposable();\n\n      group.add(m);\n      m.setDisposable(sources.subscribe(function (innerSource) {\n        var innerSubscription = new SingleAssignmentDisposable();\n        group.add(innerSubscription);\n\n        // Check for promises support\n        isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n\n        innerSubscription.setDisposable(innerSource.subscribe(function (x) { o.onNext(x); }, function (e) { o.onError(e); }, function () {\n          group.remove(innerSubscription);\n          isStopped && group.length === 1 && o.onCompleted();\n        }));\n      }, function (e) { o.onError(e); }, function () {\n        isStopped = true;\n        group.length === 1 && o.onCompleted();\n      }));\n      return group;\n    }, sources);\n  };\n\n  /**\n   * @deprecated use #mergeAll instead.\n   */\n  observableProto.mergeObservable = function () {\n    //deprecate('mergeObservable', 'mergeAll');\n    return this.mergeAll.apply(this, arguments);\n  };\n\n  /**\n   * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n   * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n   */\n  observableProto.skipUntil = function (other) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var isOpen = false;\n      var disposables = new CompositeDisposable(source.subscribe(function (left) {\n        isOpen && o.onNext(left);\n      }, function (e) { o.onError(e); }, function () {\n        isOpen && o.onCompleted();\n      }));\n\n      isPromise(other) && (other = observableFromPromise(other));\n\n      var rightSubscription = new SingleAssignmentDisposable();\n      disposables.add(rightSubscription);\n      rightSubscription.setDisposable(other.subscribe(function () {\n        isOpen = true;\n        rightSubscription.dispose();\n      }, function (e) { o.onError(e); }, function () {\n        rightSubscription.dispose();\n      }));\n\n      return disposables;\n    }, source);\n  };\n\n  /**\n   * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n   * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n   */\n  observableProto['switch'] = observableProto.switchLatest = function () {\n    var sources = this;\n    return new AnonymousObservable(function (observer) {\n      var hasLatest = false,\n        innerSubscription = new SerialDisposable(),\n        isStopped = false,\n        latest = 0,\n        subscription = sources.subscribe(\n          function (innerSource) {\n            var d = new SingleAssignmentDisposable(), id = ++latest;\n            hasLatest = true;\n            innerSubscription.setDisposable(d);\n\n            // Check if Promise or Observable\n            isPromise(innerSource) && (innerSource = observableFromPromise(innerSource));\n\n            d.setDisposable(innerSource.subscribe(\n              function (x) { latest === id && observer.onNext(x); },\n              function (e) { latest === id && observer.onError(e); },\n              function () {\n                if (latest === id) {\n                  hasLatest = false;\n                  isStopped && observer.onCompleted();\n                }\n              }));\n          },\n          function (e) { observer.onError(e); },\n          function () {\n            isStopped = true;\n            !hasLatest && observer.onCompleted();\n          });\n      return new CompositeDisposable(subscription, innerSubscription);\n    }, sources);\n  };\n\n  /**\n   * Returns the values from the source observable sequence until the other observable sequence produces a value.\n   * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n   * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n   */\n  observableProto.takeUntil = function (other) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      isPromise(other) && (other = observableFromPromise(other));\n      return new CompositeDisposable(\n        source.subscribe(o),\n        other.subscribe(function () { o.onCompleted(); }, function (e) { o.onError(e); }, noop)\n      );\n    }, source);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n   *\n   * @example\n   * 1 - obs = obs1.withLatestFrom(obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n   * 2 - obs = obs1.withLatestFrom([obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  observableProto.withLatestFrom = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    var resultSelector = args.pop(), source = this;\n\n    if (typeof source === 'undefined') {\n      throw new Error('Source observable not found for withLatestFrom().');\n    }\n    if (typeof resultSelector !== 'function') {\n      throw new Error('withLatestFrom() expects a resultSelector function.');\n    }\n    if (Array.isArray(args[0])) {\n      args = args[0];\n    }\n\n    return new AnonymousObservable(function (observer) {\n      var falseFactory = function () { return false; },\n        n = args.length,\n        hasValue = arrayInitialize(n, falseFactory),\n        hasValueAll = false,\n        values = new Array(n);\n\n      var subscriptions = new Array(n + 1);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          var other = args[i], sad = new SingleAssignmentDisposable();\n          isPromise(other) && (other = observableFromPromise(other));\n          sad.setDisposable(other.subscribe(function (x) {\n            values[i] = x;\n            hasValue[i] = true;\n            hasValueAll = hasValue.every(identity);\n          }, observer.onError.bind(observer), function () {}));\n          subscriptions[i] = sad;\n        }(idx));\n      }\n\n      var sad = new SingleAssignmentDisposable();\n      sad.setDisposable(source.subscribe(function (x) {\n        var res;\n        var allValues = [x].concat(values);\n        if (!hasValueAll) return;\n        try {\n          res = resultSelector.apply(null, allValues);\n        } catch (ex) {\n          observer.onError(ex);\n          return;\n        }\n        observer.onNext(res);\n      }, observer.onError.bind(observer), function () {\n        observer.onCompleted();\n      }));\n      subscriptions[n] = sad;\n\n      return new CompositeDisposable(subscriptions);\n    }, this);\n  };\n\n  function zipArray(second, resultSelector) {\n    var first = this;\n    return new AnonymousObservable(function (observer) {\n      var index = 0, len = second.length;\n      return first.subscribe(function (left) {\n        if (index < len) {\n          var right = second[index++], result;\n          try {\n            result = resultSelector(left, right);\n          } catch (e) {\n            return observer.onError(e);\n          }\n          observer.onNext(result);\n        } else {\n          observer.onCompleted();\n        }\n      }, function (e) { observer.onError(e); }, function () { observer.onCompleted(); });\n    }, first);\n  }\n\n  function falseFactory() { return false; }\n  function emptyArrayFactory() { return []; }\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n   * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n   *\n   * @example\n   * 1 - res = obs1.zip(obs2, fn);\n   * 1 - res = x1.zip([1,2,3], fn);\n   * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n   */\n  observableProto.zip = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    if (Array.isArray(args[0])) { return zipArray.apply(this, args); }\n    var parent = this, resultSelector = args.pop();\n    args.unshift(parent);\n    return new AnonymousObservable(function (observer) {\n      var n = args.length,\n        queues = arrayInitialize(n, emptyArrayFactory),\n        isDone = arrayInitialize(n, falseFactory);\n\n      function next(i) {\n        var res, queuedValues;\n        if (queues.every(function (x) { return x.length > 0; })) {\n          try {\n            queuedValues = queues.map(function (x) { return x.shift(); });\n            res = resultSelector.apply(parent, queuedValues);\n          } catch (ex) {\n            observer.onError(ex);\n            return;\n          }\n          observer.onNext(res);\n        } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n          observer.onCompleted();\n        }\n      };\n\n      function done(i) {\n        isDone[i] = true;\n        if (isDone.every(function (x) { return x; })) {\n          observer.onCompleted();\n        }\n      }\n\n      var subscriptions = new Array(n);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          var source = args[i], sad = new SingleAssignmentDisposable();\n          isPromise(source) && (source = observableFromPromise(source));\n          sad.setDisposable(source.subscribe(function (x) {\n            queues[i].push(x);\n            next(i);\n          }, function (e) { observer.onError(e); }, function () {\n            done(i);\n          }));\n          subscriptions[i] = sad;\n        })(idx);\n      }\n\n      return new CompositeDisposable(subscriptions);\n    }, parent);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n   * @param arguments Observable sources.\n   * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n   * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n   */\n  Observable.zip = function () {\n    for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    var first = args.shift();\n    return first.zip.apply(first, args);\n  };\n\n  /**\n   * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n   * @param arguments Observable sources.\n   * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n   */\n  Observable.zipArray = function () {\n    var sources = [];\n    if (Array.isArray(arguments[0])) {\n      sources = arguments[0];\n    } else {\n      for(var i = 0, len = arguments.length; i < len; i++) { sources.push(arguments[i]); }\n    }\n    return new AnonymousObservable(function (observer) {\n      var n = sources.length,\n        queues = arrayInitialize(n, function () { return []; }),\n        isDone = arrayInitialize(n, function () { return false; });\n\n      function next(i) {\n        if (queues.every(function (x) { return x.length > 0; })) {\n          var res = queues.map(function (x) { return x.shift(); });\n          observer.onNext(res);\n        } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n          observer.onCompleted();\n          return;\n        }\n      };\n\n      function done(i) {\n        isDone[i] = true;\n        if (isDone.every(identity)) {\n          observer.onCompleted();\n          return;\n        }\n      }\n\n      var subscriptions = new Array(n);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          subscriptions[i] = new SingleAssignmentDisposable();\n          subscriptions[i].setDisposable(sources[i].subscribe(function (x) {\n            queues[i].push(x);\n            next(i);\n          }, function (e) { observer.onError(e); }, function () {\n            done(i);\n          }));\n        })(idx);\n      }\n\n      return new CompositeDisposable(subscriptions);\n    });\n  };\n\n  /**\n   *  Hides the identity of an observable sequence.\n   * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n   */\n  observableProto.asObservable = function () {\n    var source = this;\n    return new AnonymousObservable(function (o) { return source.subscribe(o); }, this);\n  };\n\n  /**\n   * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n   * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n   */\n  observableProto.dematerialize = function () {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(function (x) { return x.accept(o); }, function(e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, this);\n  };\n\n  /**\n   *  Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.\n   *\n   *  var obs = observable.distinctUntilChanged();\n   *  var obs = observable.distinctUntilChanged(function (x) { return x.id; });\n   *  var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; });\n   *\n   * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value.\n   * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n   * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n   */\n  observableProto.distinctUntilChanged = function (keySelector, comparer) {\n    var source = this;\n    comparer || (comparer = defaultComparer);\n    return new AnonymousObservable(function (o) {\n      var hasCurrentKey = false, currentKey;\n      return source.subscribe(function (value) {\n        var key = value;\n        if (keySelector) {\n          try {\n            key = keySelector(value);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        if (hasCurrentKey) {\n          try {\n            var comparerEquals = comparer(currentKey, key);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        if (!hasCurrentKey || !comparerEquals) {\n          hasCurrentKey = true;\n          currentKey = key;\n          o.onNext(value);\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, this);\n  };\n\n  /**\n   *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n   * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n   * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto['do'] = observableProto.tap = observableProto.doAction = function (observerOrOnNext, onError, onCompleted) {\n    var source = this, tapObserver = typeof observerOrOnNext === 'function' || typeof observerOrOnNext === 'undefined'?\n      observerCreate(observerOrOnNext || noop, onError || noop, onCompleted || noop) :\n      observerOrOnNext;\n    return new AnonymousObservable(function (observer) {\n      return source.subscribe(function (x) {\n        try {\n          tapObserver.onNext(x);\n        } catch (e) {\n          observer.onError(e);\n        }\n        observer.onNext(x);\n      }, function (err) {\n          try {\n            tapObserver.onError(err);\n          } catch (e) {\n            observer.onError(e);\n          }\n        observer.onError(err);\n      }, function () {\n        try {\n          tapObserver.onCompleted();\n        } catch (e) {\n          observer.onError(e);\n        }\n        observer.onCompleted();\n      });\n    }, this);\n  };\n\n  /**\n   *  Invokes an action for each element in the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function} onNext Action to invoke for each element in the observable sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto.doOnNext = observableProto.tapOnNext = function (onNext, thisArg) {\n    return this.tap(typeof thisArg !== 'undefined' ? function (x) { onNext.call(thisArg, x); } : onNext);\n  };\n\n  /**\n   *  Invokes an action upon exceptional termination of the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto.doOnError = observableProto.tapOnError = function (onError, thisArg) {\n    return this.tap(noop, typeof thisArg !== 'undefined' ? function (e) { onError.call(thisArg, e); } : onError);\n  };\n\n  /**\n   *  Invokes an action upon graceful termination of the observable sequence.\n   *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n   * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} The source sequence with the side-effecting behavior applied.\n   */\n  observableProto.doOnCompleted = observableProto.tapOnCompleted = function (onCompleted, thisArg) {\n    return this.tap(noop, null, typeof thisArg !== 'undefined' ? function () { onCompleted.call(thisArg); } : onCompleted);\n  };\n\n  /**\n   *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n   * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n   * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n   */\n  observableProto['finally'] = observableProto.ensure = function (action) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var subscription;\n      try {\n        subscription = source.subscribe(observer);\n      } catch (e) {\n        action();\n        throw e;\n      }\n      return disposableCreate(function () {\n        try {\n          subscription.dispose();\n        } catch (e) {\n          throw e;\n        } finally {\n          action();\n        }\n      });\n    }, this);\n  };\n\n  /**\n   * @deprecated use #finally or #ensure instead.\n   */\n  observableProto.finallyAction = function (action) {\n    //deprecate('finallyAction', 'finally or ensure');\n    return this.ensure(action);\n  };\n\n  /**\n   *  Ignores all elements in an observable sequence leaving only the termination messages.\n   * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n   */\n  observableProto.ignoreElements = function () {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      return source.subscribe(noop, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n   * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n   */\n  observableProto.materialize = function () {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      return source.subscribe(function (value) {\n        observer.onNext(notificationCreateOnNext(value));\n      }, function (e) {\n        observer.onNext(notificationCreateOnError(e));\n        observer.onCompleted();\n      }, function () {\n        observer.onNext(notificationCreateOnCompleted());\n        observer.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n   * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n   * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n   */\n  observableProto.repeat = function (repeatCount) {\n    return enumerableRepeat(this, repeatCount).concat();\n  };\n\n  /**\n   *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n   *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n   *\n   * @example\n   *  var res = retried = retry.repeat();\n   *  var res = retried = retry.repeat(2);\n   * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retry = function (retryCount) {\n    return enumerableRepeat(this, retryCount).catchError();\n  };\n\n  /**\n   *  Repeats the source observable sequence upon error each time the notifier emits or until it successfully terminates. \n   *  if the notifier completes, the observable sequence completes.\n   *\n   * @example\n   *  var timer = Observable.timer(500);\n   *  var source = observable.retryWhen(timer);\n   * @param {Observable} [notifier] An observable that triggers the retries or completes the observable with onNext or onCompleted respectively.\n   * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n   */\n  observableProto.retryWhen = function (notifier) {\n    return enumerableRepeat(this).catchErrorWhen(notifier);\n  };\n  /**\n   *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n   *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n   * @example\n   *  var res = source.scan(function (acc, x) { return acc + x; });\n   *  var res = source.scan(0, function (acc, x) { return acc + x; });\n   * @param {Mixed} [seed] The initial accumulator value.\n   * @param {Function} accumulator An accumulator function to be invoked on each element.\n   * @returns {Observable} An observable sequence containing the accumulated values.\n   */\n  observableProto.scan = function () {\n    var hasSeed = false, seed, accumulator, source = this;\n    if (arguments.length === 2) {\n      hasSeed = true;\n      seed = arguments[0];\n      accumulator = arguments[1];\n    } else {\n      accumulator = arguments[0];\n    }\n    return new AnonymousObservable(function (o) {\n      var hasAccumulation, accumulation, hasValue;\n      return source.subscribe (\n        function (x) {\n          !hasValue && (hasValue = true);\n          try {\n            if (hasAccumulation) {\n              accumulation = accumulator(accumulation, x);\n            } else {\n              accumulation = hasSeed ? accumulator(seed, x) : x;\n              hasAccumulation = true;\n            }\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n\n          o.onNext(accumulation);\n        },\n        function (e) { o.onError(e); },\n        function () {\n          !hasValue && hasSeed && o.onNext(seed);\n          o.onCompleted();\n        }\n      );\n    }, source);\n  };\n\n  /**\n   *  Bypasses a specified number of elements at the end of an observable sequence.\n   * @description\n   *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n   *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n   * @param count Number of elements to bypass at the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n   */\n  observableProto.skipLast = function (count) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        q.push(x);\n        q.length > count && o.onNext(q.shift());\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n   *  @example\n   *  var res = source.startWith(1, 2, 3);\n   *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n   * @param {Arguments} args The specified values to prepend to the observable sequence\n   * @returns {Observable} The source sequence prepended with the specified values.\n   */\n  observableProto.startWith = function () {\n    var values, scheduler, start = 0;\n    if (!!arguments.length && isScheduler(arguments[0])) {\n      scheduler = arguments[0];\n      start = 1;\n    } else {\n      scheduler = immediateScheduler;\n    }\n    for(var args = [], i = start, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n    return enumerableOf([observableFromArray(args, scheduler), this]).concat();\n  };\n\n  /**\n   *  Returns a specified number of contiguous elements from the end of an observable sequence.\n   * @description\n   *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n   *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n   * @param {Number} count Number of elements to take from the end of the source sequence.\n   * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n   */\n  observableProto.takeLast = function (count) {\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        q.push(x);\n        q.length > count && q.shift();\n      }, function (e) { o.onError(e); }, function () {\n        while (q.length > 0) { o.onNext(q.shift()); }\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  function concatMap(source, selector, thisArg) {\n    var selectorFunc = bindCallback(selector, thisArg, 3);\n    return source.map(function (x, i) {\n      var result = selectorFunc(x, i, source);\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));\n      return result;\n    }).concatAll();\n  }\n\n  /**\n   *  One of the Following:\n   *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   * @example\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n   *  Or:\n   *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n   *\n   *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n   *  Or:\n   *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n   * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n   * source sequence onto which could be either an observable or Promise.\n   * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n   */\n  observableProto.selectConcat = observableProto.concatMap = function (selector, resultSelector, thisArg) {\n    if (isFunction(selector) && isFunction(resultSelector)) {\n      return this.concatMap(function (x, i) {\n        var selectorResult = selector(x, i);\n        isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));\n        (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));\n\n        return selectorResult.map(function (y, i2) {\n          return resultSelector(x, y, i, i2);\n        });\n      });\n    }\n    return isFunction(selector) ?\n      concatMap(this, selector, thisArg) :\n      concatMap(this, function () { return selector; });\n  };\n\n  var MapObservable = (function (__super__) {\n    inherits(MapObservable, __super__);\n\n    function MapObservable(source, selector, thisArg) {\n      this.source = source;\n      this.selector = bindCallback(selector, thisArg, 3);\n      __super__.call(this);\n    }\n\n    MapObservable.prototype.internalMap = function (selector, thisArg) {\n      var self = this;\n      return new MapObservable(this.source, function (x, i, o) { return selector(self.selector(x, i, o), i, o); }, thisArg)\n    };\n\n    MapObservable.prototype.subscribeCore = function (observer) {\n      return this.source.subscribe(new MapObserver(observer, this.selector, this));\n    };\n\n    return MapObservable;\n\n  }(ObservableBase));\n\n  function MapObserver(observer, selector, source) {\n    this.observer = observer;\n    this.selector = selector;\n    this.source = source;\n    this.index = 0;\n    this.isStopped = false;\n  }\n\n  MapObserver.prototype.onNext = function(x) {\n    if (this.isStopped) { return; }\n    try {\n      var result = this.selector(x, this.index++, this.source);\n    } catch(e) {\n      return this.observer.onError(e);\n    }\n    this.observer.onNext(result);\n  };\n  MapObserver.prototype.onError = function (e) {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onError(e); }\n  };\n  MapObserver.prototype.onCompleted = function () {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onCompleted(); }\n  };\n  MapObserver.prototype.dispose = function() { this.isStopped = true; };\n  MapObserver.prototype.fail = function (e) {\n    if (!this.isStopped) {\n      this.isStopped = true;\n      this.observer.onError(e);\n      return true;\n    }\n\n    return false;\n  };\n\n  /**\n  * Projects each element of an observable sequence into a new form by incorporating the element's index.\n  * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n  */\n  observableProto.map = observableProto.select = function (selector, thisArg) {\n    var selectorFn = typeof selector === 'function' ? selector : function () { return selector; };\n    return this instanceof MapObservable ?\n      this.internalMap(selector, thisArg) :\n      new MapObservable(this, selectorFn, thisArg);\n  };\n\n  /**\n   * Retrieves the value of a specified nested property from all elements in\n   * the Observable sequence.\n   * @param {Arguments} arguments The nested properties to pluck.\n   * @returns {Observable} Returns a new Observable sequence of property values.\n   */\n  observableProto.pluck = function () {\n    var args = arguments, len = arguments.length;\n    if (len === 0) { throw new Error('List of properties cannot be empty.'); }\n    return this.map(function (x) {\n      var currentProp = x;\n      for (var i = 0; i < len; i++) {\n        var p = currentProp[args[i]];\n        if (typeof p !== 'undefined') {\n          currentProp = p;\n        } else {\n          return undefined;\n        }\n      }\n      return currentProp;\n    });\n  };\n\n  function flatMap(source, selector, thisArg) {\n    var selectorFunc = bindCallback(selector, thisArg, 3);\n    return source.map(function (x, i) {\n      var result = selectorFunc(x, i, source);\n      isPromise(result) && (result = observableFromPromise(result));\n      (isArrayLike(result) || isIterable(result)) && (result = observableFrom(result));\n      return result;\n    }).mergeAll();\n  }\n\n  /**\n   *  One of the Following:\n   *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   * @example\n   *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n   *  Or:\n   *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n   *\n   *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n   *  Or:\n   *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n   *\n   *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n   * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n   * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n   */\n  observableProto.selectMany = observableProto.flatMap = function (selector, resultSelector, thisArg) {\n    if (isFunction(selector) && isFunction(resultSelector)) {\n      return this.flatMap(function (x, i) {\n        var selectorResult = selector(x, i);\n        isPromise(selectorResult) && (selectorResult = observableFromPromise(selectorResult));\n        (isArrayLike(selectorResult) || isIterable(selectorResult)) && (selectorResult = observableFrom(selectorResult));\n\n        return selectorResult.map(function (y, i2) {\n          return resultSelector(x, y, i, i2);\n        });\n      }, thisArg);\n    }\n    return isFunction(selector) ?\n      flatMap(this, selector, thisArg) :\n      flatMap(this, function () { return selector; });\n  };\n\n  /**\n   *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n   *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n   * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n   *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n   */\n  observableProto.selectSwitch = observableProto.flatMapLatest = observableProto.switchMap = function (selector, thisArg) {\n    return this.select(selector, thisArg).switchLatest();\n  };\n\n  /**\n   * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n   * @param {Number} count The number of elements to skip before returning the remaining elements.\n   * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n   */\n  observableProto.skip = function (count) {\n    if (count < 0) { throw new Error(argumentOutOfRange); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var remaining = count;\n      return source.subscribe(function (x) {\n        if (remaining <= 0) {\n          o.onNext(x);\n        } else {\n          remaining--;\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n   *  The element's index is used in the logic of the predicate function.\n   *\n   *  var res = source.skipWhile(function (value) { return value < 10; });\n   *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n   */\n  observableProto.skipWhile = function (predicate, thisArg) {\n    var source = this,\n        callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      var i = 0, running = false;\n      return source.subscribe(function (x) {\n        if (!running) {\n          try {\n            running = !callback(x, i++, source);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n        }\n        running && o.onNext(x);\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n   *\n   *  var res = source.take(5);\n   *  var res = source.take(0, Rx.Scheduler.timeout);\n   * @param {Number} count The number of elements to return.\n   * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n   * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n   */\n  observableProto.take = function (count, scheduler) {\n    if (count < 0) { throw new RangeError(argumentOutOfRange); }\n    if (count === 0) { return observableEmpty(scheduler); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var remaining = count;\n      return source.subscribe(function (x) {\n        if (remaining-- > 0) {\n          o.onNext(x);\n          remaining === 0 && o.onCompleted();\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  /**\n   *  Returns elements from an observable sequence as long as a specified condition is true.\n   *  The element's index is used in the logic of the predicate function.\n   * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n   * @param {Any} [thisArg] Object to use as this when executing callback.\n   * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n   */\n  observableProto.takeWhile = function (predicate, thisArg) {\n    var source = this,\n        callback = bindCallback(predicate, thisArg, 3);\n    return new AnonymousObservable(function (o) {\n      var i = 0, running = true;\n      return source.subscribe(function (x) {\n        if (running) {\n          try {\n            running = callback(x, i++, source);\n          } catch (e) {\n            o.onError(e);\n            return;\n          }\n          if (running) {\n            o.onNext(x);\n          } else {\n            o.onCompleted();\n          }\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  var FilterObservable = (function (__super__) {\n    inherits(FilterObservable, __super__);\n\n    function FilterObservable(source, predicate, thisArg) {\n      this.source = source;\n      this.predicate = bindCallback(predicate, thisArg, 3);\n      __super__.call(this);\n    }\n\n    FilterObservable.prototype.subscribeCore = function (observer) {\n      return this.source.subscribe(new FilterObserver(observer, this.predicate, this));\n    };\n\n    FilterObservable.prototype.internalFilter = function(predicate, thisArg) {\n      var self = this;\n      return new FilterObservable(this.source, function(x, i, o) { return self.predicate(x, i, o) && predicate(x, i, o); }, thisArg);\n    };\n\n    return FilterObservable;\n\n  }(ObservableBase));\n\n  function FilterObserver(observer, predicate, source) {\n    this.observer = observer;\n    this.predicate = predicate;\n    this.source = source;\n    this.index = 0;\n    this.isStopped = false;\n  }\n\n  FilterObserver.prototype.onNext = function(x) {\n    try {\n      var shouldYield = this.predicate(x, this.index++, this.source);\n    } catch(e) {\n      return this.observer.onError(e);\n    }\n    shouldYield && this.observer.onNext(x);\n  };\n\n  FilterObserver.prototype.onError = function (e) {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onError(e); }\n  };\n  FilterObserver.prototype.onCompleted = function () {\n    if(!this.isStopped) { this.isStopped = true; this.observer.onCompleted(); }\n  };\n  FilterObserver.prototype.dispose = function() { this.isStopped = true; };\n  FilterObserver.prototype.fail = function (e) {\n    if (!this.isStopped) {\n      this.isStopped = true;\n      this.observer.onError(e);\n      return true;\n    }\n\n    return false;\n  };\n\n\n\n  /**\n  *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n  * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n  * @param {Any} [thisArg] Object to use as this when executing callback.\n  * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n  */\n  observableProto.filter = observableProto.where = function (predicate, thisArg) {\n    return this instanceof FilterObservable ? this.internalFilter(predicate, thisArg) :\n      new FilterObservable(this, predicate, thisArg);\n  };\n\n  /**\n   * Converts a callback function to an observable sequence.\n   *\n   * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n   * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n   */\n  Observable.fromCallback = function (func, context, selector) {\n    return function () {\n      for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n      return new AnonymousObservable(function (observer) {\n        function handler() {\n          var results = arguments;\n\n          if (selector) {\n            try {\n              results = selector(results);\n            } catch (err) {\n              return observer.onError(err);\n            }\n\n            observer.onNext(results);\n          } else {\n            if (results.length <= 1) {\n              observer.onNext.apply(observer, results);\n            } else {\n              observer.onNext(results);\n            }\n          }\n\n          observer.onCompleted();\n        }\n\n        args.push(handler);\n        func.apply(context, args);\n      }).publishLast().refCount();\n    };\n  };\n\n  /**\n   * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n   * @param {Function} func The function to call\n   * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n   * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n   * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n   */\n  Observable.fromNodeCallback = function (func, context, selector) {\n    return function () {\n      for(var args = [], i = 0, len = arguments.length; i < len; i++) { args.push(arguments[i]); }\n\n      return new AnonymousObservable(function (observer) {\n        function handler(err) {\n          if (err) {\n            observer.onError(err);\n            return;\n          }\n\n          for(var results = [], i = 1, len = arguments.length; i < len; i++) { results.push(arguments[i]); }\n\n          if (selector) {\n            try {\n              results = selector(results);\n            } catch (e) {\n              return observer.onError(e);\n            }\n            observer.onNext(results);\n          } else {\n            if (results.length <= 1) {\n              observer.onNext.apply(observer, results);\n            } else {\n              observer.onNext(results);\n            }\n          }\n\n          observer.onCompleted();\n        }\n\n        args.push(handler);\n        func.apply(context, args);\n      }).publishLast().refCount();\n    };\n  };\n\n  function createListener (element, name, handler) {\n    if (element.addEventListener) {\n      element.addEventListener(name, handler, false);\n      return disposableCreate(function () {\n        element.removeEventListener(name, handler, false);\n      });\n    }\n    throw new Error('No listener found');\n  }\n\n  function createEventListener (el, eventName, handler) {\n    var disposables = new CompositeDisposable();\n\n    // Asume NodeList\n    if (Object.prototype.toString.call(el) === '[object NodeList]') {\n      for (var i = 0, len = el.length; i < len; i++) {\n        disposables.add(createEventListener(el.item(i), eventName, handler));\n      }\n    } else if (el) {\n      disposables.add(createListener(el, eventName, handler));\n    }\n\n    return disposables;\n  }\n\n  /**\n   * Configuration option to determine whether to use native events only\n   */\n  Rx.config.useNativeEvents = false;\n\n  /**\n   * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n   *\n   * @example\n   *   var source = Rx.Observable.fromEvent(element, 'mouseup');\n   *\n   * @param {Object} element The DOMElement or NodeList to attach a listener.\n   * @param {String} eventName The event name to attach the observable sequence.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n   */\n  Observable.fromEvent = function (element, eventName, selector) {\n    // Node.js specific\n    if (element.addListener) {\n      return fromEventPattern(\n        function (h) { element.addListener(eventName, h); },\n        function (h) { element.removeListener(eventName, h); },\n        selector);\n    }\n\n    // Use only if non-native events are allowed\n    if (!Rx.config.useNativeEvents) {\n      // Handles jq, Angular.js, Zepto, Marionette\n      if (typeof element.on === 'function' && typeof element.off === 'function') {\n        return fromEventPattern(\n          function (h) { element.on(eventName, h); },\n          function (h) { element.off(eventName, h); },\n          selector);\n      }\n      if (!!root.Ember && typeof root.Ember.addListener === 'function') {\n        return fromEventPattern(\n          function (h) { Ember.addListener(element, eventName, h); },\n          function (h) { Ember.removeListener(element, eventName, h); },\n          selector);\n      }\n    }\n    return new AnonymousObservable(function (observer) {\n      return createEventListener(\n        element,\n        eventName,\n        function handler (e) {\n          var results = e;\n\n          if (selector) {\n            try {\n              results = selector(arguments);\n            } catch (err) {\n              observer.onError(err);\n              return\n            }\n          }\n\n          observer.onNext(results);\n        });\n    }).publish().refCount();\n  };\n\n  /**\n   * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n   * @param {Function} addHandler The function to add a handler to the emitter.\n   * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n   * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n   * @returns {Observable} An observable sequence which wraps an event from an event emitter\n   */\n  var fromEventPattern = Observable.fromEventPattern = function (addHandler, removeHandler, selector) {\n    return new AnonymousObservable(function (observer) {\n      function innerHandler (e) {\n        var result = e;\n        if (selector) {\n          try {\n            result = selector(arguments);\n          } catch (err) {\n            observer.onError(err);\n            return;\n          }\n        }\n        observer.onNext(result);\n      }\n\n      var returnValue = addHandler(innerHandler);\n      return disposableCreate(function () {\n        if (removeHandler) {\n          removeHandler(innerHandler, returnValue);\n        }\n      });\n    }).publish().refCount();\n  };\n\n  /**\n   * Converts a Promise to an Observable sequence\n   * @param {Promise} An ES6 Compliant promise.\n   * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n   */\n  var observableFromPromise = Observable.fromPromise = function (promise) {\n    return observableDefer(function () {\n      var subject = new Rx.AsyncSubject();\n\n      promise.then(\n        function (value) {\n          subject.onNext(value);\n          subject.onCompleted();\n        },\n        subject.onError.bind(subject));\n\n      return subject;\n    });\n  };\n\n  /*\n   * Converts an existing observable sequence to an ES6 Compatible Promise\n   * @example\n   * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n   *\n   * // With config\n   * Rx.config.Promise = RSVP.Promise;\n   * var promise = Rx.Observable.return(42).toPromise();\n   * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n   * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n   */\n  observableProto.toPromise = function (promiseCtor) {\n    promiseCtor || (promiseCtor = Rx.config.Promise);\n    if (!promiseCtor) { throw new TypeError('Promise type not provided nor in Rx.config.Promise'); }\n    var source = this;\n    return new promiseCtor(function (resolve, reject) {\n      // No cancellation can be done\n      var value, hasValue = false;\n      source.subscribe(function (v) {\n        value = v;\n        hasValue = true;\n      }, reject, function () {\n        hasValue && resolve(value);\n      });\n    });\n  };\n\n  /**\n   * Invokes the asynchronous function, surfacing the result through an observable sequence.\n   * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n   * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n   */\n  Observable.startAsync = function (functionAsync) {\n    var promise;\n    try {\n      promise = functionAsync();\n    } catch (e) {\n      return observableThrow(e);\n    }\n    return observableFromPromise(promise);\n  }\n\n  /**\n   * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n   * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n   * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n   *\n   * @example\n   * 1 - res = source.multicast(observable);\n   * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n   *\n   * @param {Function|Subject} subjectOrSubjectSelector\n   * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n   * Or:\n   * Subject to push source elements into.\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.multicast = function (subjectOrSubjectSelector, selector) {\n    var source = this;\n    return typeof subjectOrSubjectSelector === 'function' ?\n      new AnonymousObservable(function (observer) {\n        var connectable = source.multicast(subjectOrSubjectSelector());\n        return new CompositeDisposable(selector(connectable).subscribe(observer), connectable.connect());\n      }, source) :\n      new ConnectableObservable(source, subjectOrSubjectSelector);\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of Multicast using a regular Subject.\n   *\n   * @example\n   * var resres = source.publish();\n   * var res = source.publish(function (x) { return x; });\n   *\n   * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publish = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new Subject(); }, selector) :\n      this.multicast(new Subject());\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence.\n   * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.share = function () {\n    return this.publish().refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n   * This operator is a specialization of Multicast using a AsyncSubject.\n   *\n   * @example\n   * var res = source.publishLast();\n   * var res = source.publishLast(function (x) { return x; });\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishLast = function (selector) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new AsyncSubject(); }, selector) :\n      this.multicast(new AsyncSubject());\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n   * This operator is a specialization of Multicast using a BehaviorSubject.\n   *\n   * @example\n   * var res = source.publishValue(42);\n   * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n   *\n   * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.publishValue = function (initialValueOrSelector, initialValue) {\n    return arguments.length === 2 ?\n      this.multicast(function () {\n        return new BehaviorSubject(initialValue);\n      }, initialValueOrSelector) :\n      this.multicast(new BehaviorSubject(initialValueOrSelector));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n   * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   * @param {Mixed} initialValue Initial value received by observers upon subscription.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareValue = function (initialValue) {\n    return this.publishValue(initialValue).refCount();\n  };\n\n  /**\n   * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of Multicast using a ReplaySubject.\n   *\n   * @example\n   * var res = source.replay(null, 3);\n   * var res = source.replay(null, 3, 500);\n   * var res = source.replay(null, 3, 500, scheduler);\n   * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n   *\n   * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n   */\n  observableProto.replay = function (selector, bufferSize, window, scheduler) {\n    return selector && isFunction(selector) ?\n      this.multicast(function () { return new ReplaySubject(bufferSize, window, scheduler); }, selector) :\n      this.multicast(new ReplaySubject(bufferSize, window, scheduler));\n  };\n\n  /**\n   * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n   * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n   *\n   * @example\n   * var res = source.shareReplay(3);\n   * var res = source.shareReplay(3, 500);\n   * var res = source.shareReplay(3, 500, scheduler);\n   *\n\n   * @param bufferSize [Optional] Maximum element count of the replay buffer.\n   * @param window [Optional] Maximum time length of the replay buffer.\n   * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n   * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n   */\n  observableProto.shareReplay = function (bufferSize, window, scheduler) {\n    return this.replay(null, bufferSize, window, scheduler).refCount();\n  };\n\n  var ConnectableObservable = Rx.ConnectableObservable = (function (__super__) {\n    inherits(ConnectableObservable, __super__);\n\n    function ConnectableObservable(source, subject) {\n      var hasSubscription = false,\n        subscription,\n        sourceObservable = source.asObservable();\n\n      this.connect = function () {\n        if (!hasSubscription) {\n          hasSubscription = true;\n          subscription = new CompositeDisposable(sourceObservable.subscribe(subject), disposableCreate(function () {\n            hasSubscription = false;\n          }));\n        }\n        return subscription;\n      };\n\n      __super__.call(this, function (o) { return subject.subscribe(o); });\n    }\n\n    ConnectableObservable.prototype.refCount = function () {\n      var connectableSubscription, count = 0, source = this;\n      return new AnonymousObservable(function (observer) {\n          var shouldConnect = ++count === 1,\n            subscription = source.subscribe(observer);\n          shouldConnect && (connectableSubscription = source.connect());\n          return function () {\n            subscription.dispose();\n            --count === 0 && connectableSubscription.dispose();\n          };\n      });\n    };\n\n    return ConnectableObservable;\n  }(Observable));\n\n  function observableTimerDate(dueTime, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleWithAbsolute(dueTime, function () {\n        observer.onNext(0);\n        observer.onCompleted();\n      });\n    });\n  }\n\n  function observableTimerDateAndPeriod(dueTime, period, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var d = dueTime, p = normalizeTime(period);\n      return scheduler.scheduleRecursiveWithAbsoluteAndState(0, d, function (count, self) {\n        if (p > 0) {\n          var now = scheduler.now();\n          d = d + p;\n          d <= now && (d = now + p);\n        }\n        observer.onNext(count);\n        self(count + 1, d);\n      });\n    });\n  }\n\n  function observableTimerTimeSpan(dueTime, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleWithRelative(normalizeTime(dueTime), function () {\n        observer.onNext(0);\n        observer.onCompleted();\n      });\n    });\n  }\n\n  function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) {\n    return dueTime === period ?\n      new AnonymousObservable(function (observer) {\n        return scheduler.schedulePeriodicWithState(0, period, function (count) {\n          observer.onNext(count);\n          return count + 1;\n        });\n      }) :\n      observableDefer(function () {\n        return observableTimerDateAndPeriod(scheduler.now() + dueTime, period, scheduler);\n      });\n  }\n\n  /**\n   *  Returns an observable sequence that produces a value after each period.\n   *\n   * @example\n   *  1 - res = Rx.Observable.interval(1000);\n   *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n   *\n   * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n   * @returns {Observable} An observable sequence that produces a value after each period.\n   */\n  var observableinterval = Observable.interval = function (period, scheduler) {\n    return observableTimerTimeSpanAndPeriod(period, period, isScheduler(scheduler) ? scheduler : timeoutScheduler);\n  };\n\n  /**\n   *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n   * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n   */\n  var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) {\n    var period;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    if (periodOrScheduler !== undefined && typeof periodOrScheduler === 'number') {\n      period = periodOrScheduler;\n    } else if (isScheduler(periodOrScheduler)) {\n      scheduler = periodOrScheduler;\n    }\n    if (dueTime instanceof Date && period === undefined) {\n      return observableTimerDate(dueTime.getTime(), scheduler);\n    }\n    if (dueTime instanceof Date && period !== undefined) {\n      period = periodOrScheduler;\n      return observableTimerDateAndPeriod(dueTime.getTime(), period, scheduler);\n    }\n    return period === undefined ?\n      observableTimerTimeSpan(dueTime, scheduler) :\n      observableTimerTimeSpanAndPeriod(dueTime, period, scheduler);\n  };\n\n  function observableDelayTimeSpan(source, dueTime, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var active = false,\n        cancelable = new SerialDisposable(),\n        exception = null,\n        q = [],\n        running = false,\n        subscription;\n      subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) {\n        var d, shouldRun;\n        if (notification.value.kind === 'E') {\n          q = [];\n          q.push(notification);\n          exception = notification.value.exception;\n          shouldRun = !running;\n        } else {\n          q.push({ value: notification.value, timestamp: notification.timestamp + dueTime });\n          shouldRun = !active;\n          active = true;\n        }\n        if (shouldRun) {\n          if (exception !== null) {\n            observer.onError(exception);\n          } else {\n            d = new SingleAssignmentDisposable();\n            cancelable.setDisposable(d);\n            d.setDisposable(scheduler.scheduleRecursiveWithRelative(dueTime, function (self) {\n              var e, recurseDueTime, result, shouldRecurse;\n              if (exception !== null) {\n                return;\n              }\n              running = true;\n              do {\n                result = null;\n                if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) {\n                  result = q.shift().value;\n                }\n                if (result !== null) {\n                  result.accept(observer);\n                }\n              } while (result !== null);\n              shouldRecurse = false;\n              recurseDueTime = 0;\n              if (q.length > 0) {\n                shouldRecurse = true;\n                recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now());\n              } else {\n                active = false;\n              }\n              e = exception;\n              running = false;\n              if (e !== null) {\n                observer.onError(e);\n              } else if (shouldRecurse) {\n                self(recurseDueTime);\n              }\n            }));\n          }\n        }\n      });\n      return new CompositeDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  function observableDelayDate(source, dueTime, scheduler) {\n    return observableDefer(function () {\n      return observableDelayTimeSpan(source, dueTime - scheduler.now(), scheduler);\n    });\n  }\n\n  /**\n   *  Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n   *\n   * @example\n   *  1 - res = Rx.Observable.delay(new Date());\n   *  2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout);\n   *\n   *  3 - res = Rx.Observable.delay(5000);\n   *  4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout);\n   * @memberOf Observable#\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n   * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delay = function (dueTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return dueTime instanceof Date ?\n      observableDelayDate(this, dueTime.getTime(), scheduler) :\n      observableDelayTimeSpan(this, dueTime, scheduler);\n  };\n\n  /**\n   *  Ignores values from an observable sequence which are followed by another value before dueTime.\n   * @param {Number} dueTime Duration of the debounce period for each value (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler]  Scheduler to run the debounce timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The debounced sequence.\n   */\n  observableProto.debounce = observableProto.throttleWithTimeout = function (dueTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var cancelable = new SerialDisposable(), hasvalue = false, value, id = 0;\n      var subscription = source.subscribe(\n        function (x) {\n          hasvalue = true;\n          value = x;\n          id++;\n          var currentId = id,\n            d = new SingleAssignmentDisposable();\n          cancelable.setDisposable(d);\n          d.setDisposable(scheduler.scheduleWithRelative(dueTime, function () {\n            hasvalue && id === currentId && observer.onNext(value);\n            hasvalue = false;\n          }));\n        },\n        function (e) {\n          cancelable.dispose();\n          observer.onError(e);\n          hasvalue = false;\n          id++;\n        },\n        function () {\n          cancelable.dispose();\n          hasvalue && observer.onNext(value);\n          observer.onCompleted();\n          hasvalue = false;\n          id++;\n        });\n      return new CompositeDisposable(subscription, cancelable);\n    }, this);\n  };\n\n  /**\n   * @deprecated use #debounce or #throttleWithTimeout instead.\n   */\n  observableProto.throttle = function(dueTime, scheduler) {\n    //deprecate('throttle', 'debounce or throttleWithTimeout');\n    return this.debounce(dueTime, scheduler);\n  };\n\n  /**\n   *  Records the timestamp for each value in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n   *  2 - res = source.timestamp(Rx.Scheduler.timeout);\n   *\n   * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence with timestamp information on values.\n   */\n  observableProto.timestamp = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return this.map(function (x) {\n      return { value: x, timestamp: scheduler.now() };\n    });\n  };\n\n  function sampleObservable(source, sampler) {\n    return new AnonymousObservable(function (observer) {\n      var atEnd, value, hasValue;\n\n      function sampleSubscribe() {\n        if (hasValue) {\n          hasValue = false;\n          observer.onNext(value);\n        }\n        atEnd && observer.onCompleted();\n      }\n\n      return new CompositeDisposable(\n        source.subscribe(function (newValue) {\n          hasValue = true;\n          value = newValue;\n        }, observer.onError.bind(observer), function () {\n          atEnd = true;\n        }),\n        sampler.subscribe(sampleSubscribe, observer.onError.bind(observer), sampleSubscribe)\n      );\n    }, source);\n  }\n\n  /**\n   *  Samples the observable sequence at each interval.\n   *\n   * @example\n   *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n   *  2 - res = source.sample(5000); // 5 seconds\n   *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n   *\n   * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n   * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Sampled observable sequence.\n   */\n  observableProto.sample = observableProto.throttleLatest = function (intervalOrSampler, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return typeof intervalOrSampler === 'number' ?\n      sampleObservable(this, observableinterval(intervalOrSampler, scheduler)) :\n      sampleObservable(this, intervalOrSampler);\n  };\n\n  /**\n   *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n   * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n   */\n  observableProto.timeout = function (dueTime, other, scheduler) {\n    (other == null || typeof other === 'string') && (other = observableThrow(new Error(other || 'Timeout')));\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n\n    var source = this, schedulerMethod = dueTime instanceof Date ?\n      'scheduleWithAbsolute' :\n      'scheduleWithRelative';\n\n    return new AnonymousObservable(function (observer) {\n      var id = 0,\n        original = new SingleAssignmentDisposable(),\n        subscription = new SerialDisposable(),\n        switched = false,\n        timer = new SerialDisposable();\n\n      subscription.setDisposable(original);\n\n      function createTimer() {\n        var myId = id;\n        timer.setDisposable(scheduler[schedulerMethod](dueTime, function () {\n          if (id === myId) {\n            isPromise(other) && (other = observableFromPromise(other));\n            subscription.setDisposable(other.subscribe(observer));\n          }\n        }));\n      }\n\n      createTimer();\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (!switched) {\n          id++;\n          observer.onNext(x);\n          createTimer();\n        }\n      }, function (e) {\n        if (!switched) {\n          id++;\n          observer.onError(e);\n        }\n      }, function () {\n        if (!switched) {\n          id++;\n          observer.onCompleted();\n        }\n      }));\n      return new CompositeDisposable(subscription, timer);\n    }, source);\n  };\n\n  /**\n   * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n   * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n   * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n   * @returns {Observable} An Observable that performs the throttle operation.\n   */\n  observableProto.throttleFirst = function (windowDuration, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    var duration = +windowDuration || 0;\n    if (duration <= 0) { throw new RangeError('windowDuration cannot be less or equal zero.'); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var lastOnNext = 0;\n      return source.subscribe(\n        function (x) {\n          var now = scheduler.now();\n          if (lastOnNext === 0 || now - lastOnNext >= duration) {\n            lastOnNext = now;\n            o.onNext(x);\n          }\n        },function (e) { o.onError(e); }, function () { o.onCompleted(); }\n      );\n    }, source);\n  };\n\n  var PausableObservable = (function (__super__) {\n\n    inherits(PausableObservable, __super__);\n\n    function subscribe(observer) {\n      var conn = this.source.publish(),\n        subscription = conn.subscribe(observer),\n        connection = disposableEmpty;\n\n      var pausable = this.pauser.distinctUntilChanged().subscribe(function (b) {\n        if (b) {\n          connection = conn.connect();\n        } else {\n          connection.dispose();\n          connection = disposableEmpty;\n        }\n      });\n\n      return new CompositeDisposable(subscription, connection, pausable);\n    }\n\n    function PausableObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this, subscribe, source);\n    }\n\n    PausableObservable.prototype.pause = function () {\n      this.controller.onNext(false);\n    };\n\n    PausableObservable.prototype.resume = function () {\n      this.controller.onNext(true);\n    };\n\n    return PausableObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausable(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausable = function (pauser) {\n    return new PausableObservable(this, pauser);\n  };\n\n  function combineLatestSource(source, subject, resultSelector) {\n    return new AnonymousObservable(function (o) {\n      var hasValue = [false, false],\n        hasValueAll = false,\n        isDone = false,\n        values = new Array(2),\n        err;\n\n      function next(x, i) {\n        values[i] = x\n        var res;\n        hasValue[i] = true;\n        if (hasValueAll || (hasValueAll = hasValue.every(identity))) {\n          if (err) {\n            o.onError(err);\n            return;\n          }\n\n          try {\n            res = resultSelector.apply(null, values);\n          } catch (ex) {\n            o.onError(ex);\n            return;\n          }\n          o.onNext(res);\n        }\n        if (isDone && values[1]) {\n          o.onCompleted();\n        }\n      }\n\n      return new CompositeDisposable(\n        source.subscribe(\n          function (x) {\n            next(x, 0);\n          },\n          function (e) {\n            if (values[1]) {\n              o.onError(e);\n            } else {\n              err = e;\n            }\n          },\n          function () {\n            isDone = true;\n            values[1] && o.onCompleted();\n          }),\n        subject.subscribe(\n          function (x) {\n            next(x, 1);\n          },\n          function (e) { o.onError(e); },\n          function () {\n            isDone = true;\n            next(true, 1);\n          })\n        );\n    }, source);\n  }\n\n  var PausableBufferedObservable = (function (__super__) {\n\n    inherits(PausableBufferedObservable, __super__);\n\n    function subscribe(o) {\n      var q = [], previousShouldFire;\n\n      var subscription =\n        combineLatestSource(\n          this.source,\n          this.pauser.distinctUntilChanged().startWith(false),\n          function (data, shouldFire) {\n            return { data: data, shouldFire: shouldFire };\n          })\n          .subscribe(\n            function (results) {\n              if (previousShouldFire !== undefined && results.shouldFire != previousShouldFire) {\n                previousShouldFire = results.shouldFire;\n                // change in shouldFire\n                if (results.shouldFire) {\n                  while (q.length > 0) {\n                    o.onNext(q.shift());\n                  }\n                }\n              } else {\n                previousShouldFire = results.shouldFire;\n                // new data\n                if (results.shouldFire) {\n                  o.onNext(results.data);\n                } else {\n                  q.push(results.data);\n                }\n              }\n            },\n            function (err) {\n              // Empty buffer before sending error\n              while (q.length > 0) {\n                o.onNext(q.shift());\n              }\n              o.onError(err);\n            },\n            function () {\n              // Empty buffer before sending completion\n              while (q.length > 0) {\n                o.onNext(q.shift());\n              }\n              o.onCompleted();\n            }\n          );\n      return subscription;\n    }\n\n    function PausableBufferedObservable(source, pauser) {\n      this.source = source;\n      this.controller = new Subject();\n\n      if (pauser && pauser.subscribe) {\n        this.pauser = this.controller.merge(pauser);\n      } else {\n        this.pauser = this.controller;\n      }\n\n      __super__.call(this, subscribe, source);\n    }\n\n    PausableBufferedObservable.prototype.pause = function () {\n      this.controller.onNext(false);\n    };\n\n    PausableBufferedObservable.prototype.resume = function () {\n      this.controller.onNext(true);\n    };\n\n    return PausableBufferedObservable;\n\n  }(Observable));\n\n  /**\n   * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n   * and yields the values that were buffered while paused.\n   * @example\n   * var pauser = new Rx.Subject();\n   * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.pausableBuffered = function (subject) {\n    return new PausableBufferedObservable(this, subject);\n  };\n\n  var ControlledObservable = (function (__super__) {\n\n    inherits(ControlledObservable, __super__);\n\n    function subscribe (observer) {\n      return this.source.subscribe(observer);\n    }\n\n    function ControlledObservable (source, enableQueue) {\n      __super__.call(this, subscribe, source);\n      this.subject = new ControlledSubject(enableQueue);\n      this.source = source.multicast(this.subject).refCount();\n    }\n\n    ControlledObservable.prototype.request = function (numberOfItems) {\n      if (numberOfItems == null) { numberOfItems = -1; }\n      return this.subject.request(numberOfItems);\n    };\n\n    return ControlledObservable;\n\n  }(Observable));\n\n  var ControlledSubject = (function (__super__) {\n\n    function subscribe (observer) {\n      return this.subject.subscribe(observer);\n    }\n\n    inherits(ControlledSubject, __super__);\n\n    function ControlledSubject(enableQueue) {\n      enableQueue == null && (enableQueue = true);\n\n      __super__.call(this, subscribe);\n      this.subject = new Subject();\n      this.enableQueue = enableQueue;\n      this.queue = enableQueue ? [] : null;\n      this.requestedCount = 0;\n      this.requestedDisposable = disposableEmpty;\n      this.error = null;\n      this.hasFailed = false;\n      this.hasCompleted = false;\n      this.controlledDisposable = disposableEmpty;\n    }\n\n    addProperties(ControlledSubject.prototype, Observer, {\n      onCompleted: function () {\n        this.hasCompleted = true;\n        (!this.enableQueue || this.queue.length === 0) && this.subject.onCompleted();\n      },\n      onError: function (error) {\n        this.hasFailed = true;\n        this.error = error;\n        (!this.enableQueue || this.queue.length === 0) && this.subject.onError(error);\n      },\n      onNext: function (value) {\n        var hasRequested = false;\n\n        if (this.requestedCount === 0) {\n          this.enableQueue && this.queue.push(value);\n        } else {\n          (this.requestedCount !== -1 && this.requestedCount-- === 0) && this.disposeCurrentRequest();\n          hasRequested = true;\n        }\n        hasRequested && this.subject.onNext(value);\n      },\n      _processRequest: function (numberOfItems) {\n        if (this.enableQueue) {\n          while (this.queue.length >= numberOfItems && numberOfItems > 0) {\n            this.subject.onNext(this.queue.shift());\n            numberOfItems--;\n          }\n\n          return this.queue.length !== 0 ?\n            { numberOfItems: numberOfItems, returnValue: true } :\n            { numberOfItems: numberOfItems, returnValue: false };\n        }\n\n        if (this.hasFailed) {\n          this.subject.onError(this.error);\n          this.controlledDisposable.dispose();\n          this.controlledDisposable = disposableEmpty;\n        } else if (this.hasCompleted) {\n          this.subject.onCompleted();\n          this.controlledDisposable.dispose();\n          this.controlledDisposable = disposableEmpty;\n        }\n\n        return { numberOfItems: numberOfItems, returnValue: false };\n      },\n      request: function (number) {\n        this.disposeCurrentRequest();\n        var self = this, r = this._processRequest(number);\n\n        var number = r.numberOfItems;\n        if (!r.returnValue) {\n          this.requestedCount = number;\n          this.requestedDisposable = disposableCreate(function () {\n            self.requestedCount = 0;\n          });\n\n          return this.requestedDisposable\n        } else {\n          return disposableEmpty;\n        }\n      },\n      disposeCurrentRequest: function () {\n        this.requestedDisposable.dispose();\n        this.requestedDisposable = disposableEmpty;\n      }\n    });\n\n    return ControlledSubject;\n  }(Observable));\n\n  /**\n   * Attaches a controller to the observable sequence with the ability to queue.\n   * @example\n   * var source = Rx.Observable.interval(100).controlled();\n   * source.request(3); // Reads 3 values\n   * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n   * @returns {Observable} The observable sequence which is paused based upon the pauser.\n   */\n  observableProto.controlled = function (enableQueue) {\n    if (enableQueue == null) {  enableQueue = true; }\n    return new ControlledObservable(this, enableQueue);\n  };\n\n  /**\n   * Executes a transducer to transform the observable sequence\n   * @param {Transducer} transducer A transducer to execute\n   * @returns {Observable} An Observable sequence containing the results from the transducer.\n   */\n  observableProto.transduce = function(transducer) {\n    var source = this;\n\n    function transformForObserver(observer) {\n      return {\n        init: function() {\n          return observer;\n        },\n        step: function(obs, input) {\n          return obs.onNext(input);\n        },\n        result: function(obs) {\n          return obs.onCompleted();\n        }\n      };\n    }\n\n    return new AnonymousObservable(function(observer) {\n      var xform = transducer(transformForObserver(observer));\n      return source.subscribe(\n        function(v) {\n          try {\n            xform.step(observer, v);\n          } catch (e) {\n            observer.onError(e);\n          }\n        },\n        observer.onError.bind(observer),\n        function() { xform.result(observer); }\n      );\n    }, source);\n  };\n\n  var AnonymousObservable = Rx.AnonymousObservable = (function (__super__) {\n    inherits(AnonymousObservable, __super__);\n\n    // Fix subscriber to check for undefined or function returned to decorate as Disposable\n    function fixSubscriber(subscriber) {\n      if (subscriber && typeof subscriber.dispose === 'function') { return subscriber; }\n\n      return typeof subscriber === 'function' ?\n        disposableCreate(subscriber) :\n        disposableEmpty;\n    }\n\n    function setDisposable(s, state) {\n      var ado = state[0], subscribe = state[1];\n      try {\n        ado.setDisposable(fixSubscriber(subscribe(ado)));\n      } catch (e) {\n        if (!ado.fail(e)) { throw e; }\n      }\n    }\n\n    function AnonymousObservable(subscribe, parent) {\n      this.source = parent;\n\n      function s(observer) {\n\n        var ado = new AutoDetachObserver(observer), state = [ado, subscribe];\n\n        if (currentThreadScheduler.scheduleRequired()) {\n          currentThreadScheduler.scheduleWithState(state, setDisposable);\n        } else {\n          setDisposable(null, state);\n        }\n\n        return ado;\n      }\n\n      __super__.call(this, s);\n    }\n\n    return AnonymousObservable;\n\n  }(Observable));\n\n  var AutoDetachObserver = (function (__super__) {\n    inherits(AutoDetachObserver, __super__);\n\n    function AutoDetachObserver(observer) {\n      __super__.call(this);\n      this.observer = observer;\n      this.m = new SingleAssignmentDisposable();\n    }\n\n    var AutoDetachObserverPrototype = AutoDetachObserver.prototype;\n\n    AutoDetachObserverPrototype.next = function (value) {\n      var noError = false;\n      try {\n        this.observer.onNext(value);\n        noError = true;\n      } catch (e) {\n        throw e;\n      } finally {\n        !noError && this.dispose();\n      }\n    };\n\n    AutoDetachObserverPrototype.error = function (err) {\n      try {\n        this.observer.onError(err);\n      } catch (e) {\n        throw e;\n      } finally {\n        this.dispose();\n      }\n    };\n\n    AutoDetachObserverPrototype.completed = function () {\n      try {\n        this.observer.onCompleted();\n      } catch (e) {\n        throw e;\n      } finally {\n        this.dispose();\n      }\n    };\n\n    AutoDetachObserverPrototype.setDisposable = function (value) { this.m.setDisposable(value); };\n    AutoDetachObserverPrototype.getDisposable = function () { return this.m.getDisposable(); };\n\n    AutoDetachObserverPrototype.dispose = function () {\n      __super__.prototype.dispose.call(this);\n      this.m.dispose();\n    };\n\n    return AutoDetachObserver;\n  }(AbstractObserver));\n\n  var InnerSubscription = function (subject, observer) {\n    this.subject = subject;\n    this.observer = observer;\n  };\n\n  InnerSubscription.prototype.dispose = function () {\n    if (!this.subject.isDisposed && this.observer !== null) {\n      var idx = this.subject.observers.indexOf(this.observer);\n      this.subject.observers.splice(idx, 1);\n      this.observer = null;\n    }\n  };\n\n  /**\n   *  Represents an object that is both an observable sequence as well as an observer.\n   *  Each notification is broadcasted to all subscribed observers.\n   */\n  var Subject = Rx.Subject = (function (__super__) {\n    function subscribe(observer) {\n      checkDisposed(this);\n      if (!this.isStopped) {\n        this.observers.push(observer);\n        return new InnerSubscription(this, observer);\n      }\n      if (this.hasError) {\n        observer.onError(this.error);\n        return disposableEmpty;\n      }\n      observer.onCompleted();\n      return disposableEmpty;\n    }\n\n    inherits(Subject, __super__);\n\n    /**\n     * Creates a subject.\n     */\n    function Subject() {\n      __super__.call(this, subscribe);\n      this.isDisposed = false,\n      this.isStopped = false,\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(Subject.prototype, Observer.prototype, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onCompleted();\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.error = error;\n          this.hasError = true;\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onNext(value);\n          }\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    /**\n     * Creates a subject from the specified observer and observable.\n     * @param {Observer} observer The observer used to send messages to the subject.\n     * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n     * @returns {Subject} Subject implemented using the given observer and observable.\n     */\n    Subject.create = function (observer, observable) {\n      return new AnonymousSubject(observer, observable);\n    };\n\n    return Subject;\n  }(Observable));\n\n  /**\n   *  Represents the result of an asynchronous operation.\n   *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n   */\n  var AsyncSubject = Rx.AsyncSubject = (function (__super__) {\n\n    function subscribe(observer) {\n      checkDisposed(this);\n\n      if (!this.isStopped) {\n        this.observers.push(observer);\n        return new InnerSubscription(this, observer);\n      }\n\n      if (this.hasError) {\n        observer.onError(this.error);\n      } else if (this.hasValue) {\n        observer.onNext(this.value);\n        observer.onCompleted();\n      } else {\n        observer.onCompleted();\n      }\n\n      return disposableEmpty;\n    }\n\n    inherits(AsyncSubject, __super__);\n\n    /**\n     * Creates a subject that can only receive one value and that value is cached for all future observations.\n     * @constructor\n     */\n    function AsyncSubject() {\n      __super__.call(this, subscribe);\n\n      this.isDisposed = false;\n      this.isStopped = false;\n      this.hasValue = false;\n      this.observers = [];\n      this.hasError = false;\n    }\n\n    addProperties(AsyncSubject.prototype, Observer, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () {\n        checkDisposed(this);\n        return this.observers.length > 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence, also causing the last received value to be sent out (if any).\n       */\n      onCompleted: function () {\n        var i, len;\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          var os = cloneArray(this.observers), len = os.length;\n\n          if (this.hasValue) {\n            for (i = 0; i < len; i++) {\n              var o = os[i];\n              o.onNext(this.value);\n              o.onCompleted();\n            }\n          } else {\n            for (i = 0; i < len; i++) {\n              os[i].onCompleted();\n            }\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the error.\n       * @param {Mixed} error The Error to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (!this.isStopped) {\n          this.isStopped = true;\n          this.hasError = true;\n          this.error = error;\n\n          for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n            os[i].onError(error);\n          }\n\n          this.observers.length = 0;\n        }\n      },\n      /**\n       * Sends a value to the subject. The last value received before successful termination will be sent to all subscribed and future observers.\n       * @param {Mixed} value The value to store in the subject.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        this.hasValue = true;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.exception = null;\n        this.value = null;\n      }\n    });\n\n    return AsyncSubject;\n  }(Observable));\n\n  var AnonymousSubject = Rx.AnonymousSubject = (function (__super__) {\n    inherits(AnonymousSubject, __super__);\n\n    function subscribe(observer) {\n      return this.observable.subscribe(observer);\n    }\n\n    function AnonymousSubject(observer, observable) {\n      this.observer = observer;\n      this.observable = observable;\n      __super__.call(this, subscribe);\n    }\n\n    addProperties(AnonymousSubject.prototype, Observer.prototype, {\n      onCompleted: function () {\n        this.observer.onCompleted();\n      },\n      onError: function (error) {\n        this.observer.onError(error);\n      },\n      onNext: function (value) {\n        this.observer.onNext(value);\n      }\n    });\n\n    return AnonymousSubject;\n  }(Observable));\n\n  /**\n   *  Represents a value that changes over time.\n   *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n   */\n  var BehaviorSubject = Rx.BehaviorSubject = (function (__super__) {\n    function subscribe(observer) {\n      checkDisposed(this);\n      if (!this.isStopped) {\n        this.observers.push(observer);\n        observer.onNext(this.value);\n        return new InnerSubscription(this, observer);\n      }\n      if (this.hasError) {\n        observer.onError(this.error);\n      } else {\n        observer.onCompleted();\n      }\n      return disposableEmpty;\n    }\n\n    inherits(BehaviorSubject, __super__);\n\n    /**\n     *  Initializes a new instance of the BehaviorSubject class which creates a subject that caches its last value and starts with the specified value.\n     *  @param {Mixed} value Initial value sent to observers when no other value has been received by the subject yet.\n     */\n    function BehaviorSubject(value) {\n      __super__.call(this, subscribe);\n      this.value = value,\n      this.observers = [],\n      this.isDisposed = false,\n      this.isStopped = false,\n      this.hasError = false;\n    }\n\n    addProperties(BehaviorSubject.prototype, Observer, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () { return this.observers.length > 0; },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onCompleted();\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.hasError = true;\n        this.error = error;\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onError(error);\n        }\n\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.value = value;\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          os[i].onNext(value);\n        }\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n        this.value = null;\n        this.exception = null;\n      }\n    });\n\n    return BehaviorSubject;\n  }(Observable));\n\n  /**\n   * Represents an object that is both an observable sequence as well as an observer.\n   * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n   */\n  var ReplaySubject = Rx.ReplaySubject = (function (__super__) {\n\n    function createRemovableDisposable(subject, observer) {\n      return disposableCreate(function () {\n        observer.dispose();\n        !subject.isDisposed && subject.observers.splice(subject.observers.indexOf(observer), 1);\n      });\n    }\n\n    function subscribe(observer) {\n      var so = new ScheduledObserver(this.scheduler, observer),\n        subscription = createRemovableDisposable(this, so);\n      checkDisposed(this);\n      this._trim(this.scheduler.now());\n      this.observers.push(so);\n\n      for (var i = 0, len = this.q.length; i < len; i++) {\n        so.onNext(this.q[i].value);\n      }\n\n      if (this.hasError) {\n        so.onError(this.error);\n      } else if (this.isStopped) {\n        so.onCompleted();\n      }\n\n      so.ensureActive();\n      return subscription;\n    }\n\n    inherits(ReplaySubject, __super__);\n\n    /**\n     *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n     *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n     *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n     *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n     */\n    function ReplaySubject(bufferSize, windowSize, scheduler) {\n      this.bufferSize = bufferSize == null ? Number.MAX_VALUE : bufferSize;\n      this.windowSize = windowSize == null ? Number.MAX_VALUE : windowSize;\n      this.scheduler = scheduler || currentThreadScheduler;\n      this.q = [];\n      this.observers = [];\n      this.isStopped = false;\n      this.isDisposed = false;\n      this.hasError = false;\n      this.error = null;\n      __super__.call(this, subscribe);\n    }\n\n    addProperties(ReplaySubject.prototype, Observer.prototype, {\n      /**\n       * Indicates whether the subject has observers subscribed to it.\n       * @returns {Boolean} Indicates whether the subject has observers subscribed to it.\n       */\n      hasObservers: function () {\n        return this.observers.length > 0;\n      },\n      _trim: function (now) {\n        while (this.q.length > this.bufferSize) {\n          this.q.shift();\n        }\n        while (this.q.length > 0 && (now - this.q[0].interval) > this.windowSize) {\n          this.q.shift();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the arrival of the specified element in the sequence.\n       * @param {Mixed} value The value to send to all observers.\n       */\n      onNext: function (value) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        var now = this.scheduler.now();\n        this.q.push({ interval: now, value: value });\n        this._trim(now);\n\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onNext(value);\n          observer.ensureActive();\n        }\n      },\n      /**\n       * Notifies all subscribed observers about the exception.\n       * @param {Mixed} error The exception to send to all observers.\n       */\n      onError: function (error) {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        this.error = error;\n        this.hasError = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onError(error);\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Notifies all subscribed observers about the end of the sequence.\n       */\n      onCompleted: function () {\n        checkDisposed(this);\n        if (this.isStopped) { return; }\n        this.isStopped = true;\n        var now = this.scheduler.now();\n        this._trim(now);\n        for (var i = 0, os = cloneArray(this.observers), len = os.length; i < len; i++) {\n          var observer = os[i];\n          observer.onCompleted();\n          observer.ensureActive();\n        }\n        this.observers.length = 0;\n      },\n      /**\n       * Unsubscribe all observers and release resources.\n       */\n      dispose: function () {\n        this.isDisposed = true;\n        this.observers = null;\n      }\n    });\n\n    return ReplaySubject;\n  }(Observable));\n\n  /**\n  * Used to pause and resume streams.\n  */\n  Rx.Pauser = (function (__super__) {\n    inherits(Pauser, __super__);\n\n    function Pauser() {\n      __super__.call(this);\n    }\n\n    /**\n     * Pauses the underlying sequence.\n     */\n    Pauser.prototype.pause = function () { this.onNext(false); };\n\n    /**\n    * Resumes the underlying sequence.\n    */\n    Pauser.prototype.resume = function () { this.onNext(true); };\n\n    return Pauser;\n  }(Subject));\n\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    root.Rx = Rx;\n\n    define(function() {\n      return Rx;\n    });\n  } else if (freeExports && freeModule) {\n    // in Node.js or RingoJS\n    if (moduleExports) {\n      (freeModule.exports = Rx).Rx = Rx;\n    } else {\n      freeExports.Rx = Rx;\n    }\n  } else {\n    // in a browser or Rhino\n    root.Rx = Rx;\n  }\n\n  // All code before this point will be filtered from stack traces.\n  var rEndingLine = captureLine();\n\n}.call(this));\n"
  },
  {
    "path": "tests/perf/old/rx.sorting.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n    var objectTypes = {\n        'boolean': false,\n        'function': true,\n        'object': true,\n        'number': false,\n        'string': false,\n        'undefined': false\n    };\n\n    var root = (objectTypes[typeof window] && window) || this,\n        freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n        freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n        moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n        freeGlobal = objectTypes[typeof global] && global;\n\n    if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n        root = freeGlobal;\n    }\n\n    // Because of build optimizers\n    if (typeof define === 'function' && define.amd) {\n        define(['rx'], function (Rx, exports) {\n            return factory(root, exports, Rx);\n        });\n    } else if (typeof module === 'object' && module && module.exports === freeExports) {\n        module.exports = factory(root, module.exports, require('./rx'));\n    } else {\n        root.Rx = factory(root, {}, root.Rx);\n    }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    observableNever = Observable.never,\n    isEqual = Rx.internals.isEqual,\n    defaultSubComparer = Rx.helpers.defaultSubComparer;\n\n  /**\n   * jortSort checks if your inputs are sorted.  Note that this is only for a sequence with an end.\n   * See http://jort.technology/ for full details.\n   * @returns {Observable} An observable which has a single value of true if sorted, else false.\n   */\n  observableProto.jortSort = function () {\n    return this.jortSortUntil(observableNever());\n  };\n\n  /**\n   * jortSort checks if your inputs are sorted until another Observable sequence fires.\n   * See http://jort.technology/ for full details.\n   * @returns {Observable} An observable which has a single value of true if sorted, else false.\n   */\n  observableProto.jortSortUntil = function (other) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var arr = [];\n      return source.takeUntil(other).subscribe(\n        arr.push.bind(arr),\n        observer.onError.bind(observer),\n        function () {\n          var sorted = arr.slice(0).sort(defaultSubComparer);\n          observer.onNext(isEqual(arr, sorted));\n          observer.onCompleted();\n        });\n    }, source);\n  };\n\n    return Rx;\n}));\n"
  },
  {
    "path": "tests/perf/old/rx.testing.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n    var objectTypes = {\n        'boolean': false,\n        'function': true,\n        'object': true,\n        'number': false,\n        'string': false,\n        'undefined': false\n    };\n\n    var root = (objectTypes[typeof window] && window) || this,\n        freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n        freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n        moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n        freeGlobal = objectTypes[typeof global] && global;\n\n    if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n        root = freeGlobal;\n    }\n\n    // Because of build optimizers\n    if (typeof define === 'function' && define.amd) {\n        define(['rx.virtualtime', 'exports'], function (Rx, exports) {\n            root.Rx = factory(root, exports, Rx);\n            return root.Rx;\n        });\n    } else if (typeof module === 'object' && module && module.exports === freeExports) {\n        module.exports = factory(root, module.exports, require('./rx.all'));\n    } else {\n        root.Rx = factory(root, {}, root.Rx);\n    }\n}.call(this, function (root, exp, Rx, undefined) {\n\n    // Defaults\n    var Observer = Rx.Observer,\n        Observable = Rx.Observable,\n        Notification = Rx.Notification,\n        VirtualTimeScheduler = Rx.VirtualTimeScheduler,\n        Disposable = Rx.Disposable,\n        disposableEmpty = Disposable.empty,\n        disposableCreate = Disposable.create,\n        CompositeDisposable = Rx.CompositeDisposable,\n        SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n        slice = Array.prototype.slice,\n        inherits = Rx.internals.inherits,\n        defaultComparer = Rx.internals.isEqual;\n\n    function argsOrArray(args, idx) {\n        return args.length === 1 && Array.isArray(args[idx]) ?\n            args[idx] :\n            slice.call(args);\n    }\n\nfunction OnNextPredicate(predicate) {\n    this.predicate = predicate;\n};\n\nOnNextPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'N') { return false; }\n  return this.predicate(other.value);\n};\n\nfunction OnErrorPredicate(predicate) {\n  this.predicate = predicate;\n};\n\nOnErrorPredicate.prototype.equals = function (other) {\n  if (other === this) { return true; }\n  if (other == null) { return false; }\n  if (other.kind !== 'E') { return false; }\n  return this.predicate(other.exception);\n};\n\nvar ReactiveTest = Rx.ReactiveTest = {\n  /** Default virtual time used for creation of observable sequences in unit tests. */\n  created: 100,\n  /** Default virtual time used to subscribe to observable sequences in unit tests. */\n  subscribed: 200,\n  /** Default virtual time used to dispose subscriptions in unit tests. */\n  disposed: 1000,\n\n  /**\n   * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n   *\n   * 1 - ReactiveTest.onNext(200, 42);\n   * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n   *\n   * @param ticks Recorded virtual time the OnNext notification occurs.\n   * @param value Recorded value stored in the OnNext notification or a predicate.\n   * @return Recorded OnNext notification.\n   */\n  onNext: function (ticks, value) {\n    return typeof value === 'function' ?\n      new Recorded(ticks, new OnNextPredicate(value)) :\n      new Recorded(ticks, Notification.createOnNext(value));\n  },\n  /**\n   * Factory method for an OnError notification record at a given time with a given error.\n   *\n   * 1 - ReactiveTest.onNext(200, new Error('error'));\n   * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n   *\n   * @param ticks Recorded virtual time the OnError notification occurs.\n   * @param exception Recorded exception stored in the OnError notification.\n   * @return Recorded OnError notification.\n   */\n  onError: function (ticks, error) {\n    return typeof error === 'function' ?\n      new Recorded(ticks, new OnErrorPredicate(error)) :\n      new Recorded(ticks, Notification.createOnError(error));\n  },\n  /**\n   * Factory method for an OnCompleted notification record at a given time.\n   *\n   * @param ticks Recorded virtual time the OnCompleted notification occurs.\n   * @return Recorded OnCompleted notification.\n   */\n  onCompleted: function (ticks) {\n    return new Recorded(ticks, Notification.createOnCompleted());\n  },\n  /**\n   * Factory method for a subscription record based on a given subscription and disposal time.\n   *\n   * @param start Virtual time indicating when the subscription was created.\n   * @param end Virtual time indicating when the subscription was disposed.\n   * @return Subscription object.\n   */\n  subscribe: function (start, end) {\n    return new Subscription(start, end);\n  }\n};\n\n  /**\n   * Creates a new object recording the production of the specified value at the given virtual time.\n   *\n   * @constructor\n   * @param {Number} time Virtual time the value was produced on.\n   * @param {Mixed} value Value that was produced.\n   * @param {Function} comparer An optional comparer.\n   */\n  var Recorded = Rx.Recorded = function (time, value, comparer) {\n    this.time = time;\n    this.value = value;\n    this.comparer = comparer || defaultComparer;\n  };\n\n  /**\n   * Checks whether the given recorded object is equal to the current instance.\n   *\n   * @param {Recorded} other Recorded object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Recorded.prototype.equals = function (other) {\n    return this.time === other.time && this.comparer(this.value, other.value);\n  };\n\n  /**\n   * Returns a string representation of the current Recorded value.\n   *\n   * @returns {String} String representation of the current Recorded value.\n   */\n  Recorded.prototype.toString = function () {\n    return this.value.toString() + '@' + this.time;\n  };\n\n  /**\n   * Creates a new subscription object with the given virtual subscription and unsubscription time.\n   *\n   * @constructor\n   * @param {Number} subscribe Virtual time at which the subscription occurred.\n   * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n   */\n  var Subscription = Rx.Subscription = function (start, end) {\n    this.subscribe = start;\n    this.unsubscribe = end || Number.MAX_VALUE;\n  };\n\n  /**\n   * Checks whether the given subscription is equal to the current instance.\n   * @param other Subscription object to check for equality.\n   * @returns {Boolean} true if both objects are equal; false otherwise.\n   */\n  Subscription.prototype.equals = function (other) {\n    return this.subscribe === other.subscribe && this.unsubscribe === other.unsubscribe;\n  };\n\n  /**\n   * Returns a string representation of the current Subscription value.\n   * @returns {String} String representation of the current Subscription value.\n   */\n  Subscription.prototype.toString = function () {\n    return '(' + this.subscribe + ', ' + (this.unsubscribe === Number.MAX_VALUE ? 'Infinite' : this.unsubscribe) + ')';\n  };\n\n    /** @private */\n    var MockDisposable = Rx.MockDisposable = function (scheduler) {\n        this.scheduler = scheduler;\n        this.disposes = [];\n        this.disposes.push(this.scheduler.clock);\n    };\n\n    /*\n     * @memberOf MockDisposable#\n     * @prviate\n     */\n    MockDisposable.prototype.dispose = function () {\n        this.disposes.push(this.scheduler.clock);\n    };\n\n  var MockObserver = (function (__super__) {\n    inherits(MockObserver, __super__);\n\n    function MockObserver(scheduler) {\n      __super__.call(this);\n      this.scheduler = scheduler;\n      this.messages = [];\n    }\n\n    var MockObserverPrototype = MockObserver.prototype;\n\n    MockObserverPrototype.onNext = function (value) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnNext(value)));\n    };\n\n    MockObserverPrototype.onError = function (exception) {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnError(exception)));\n    };\n\n    MockObserverPrototype.onCompleted = function () {\n      this.messages.push(new Recorded(this.scheduler.clock, Notification.createOnCompleted()));\n    };\n\n    return MockObserver;\n  })(Observer);\n\n  function MockPromise(scheduler, messages) {\n    var self = this;\n    this.scheduler = scheduler;\n    this.messages = messages;\n    this.subscriptions = [];\n    this.observers = [];\n    for (var i = 0, len = this.messages.length; i < len; i++) {\n      var message = this.messages[i],\n          notification = message.value;\n      (function (innerNotification) {\n        scheduler.scheduleAbsoluteWithState(null, message.time, function () {\n          var obs = self.observers.slice(0);\n\n          for (var j = 0, jLen = obs.length; j < jLen; j++) {\n            innerNotification.accept(obs[j]);\n          }\n          return disposableEmpty;\n        });\n      })(notification);\n    }\n  }\n\n  MockPromise.prototype.then = function (onResolved, onRejected) {\n    var self = this;\n\n    this.subscriptions.push(new Subscription(this.scheduler.clock));\n    var index = this.subscriptions.length - 1;\n\n    var newPromise;\n\n    var observer = Rx.Observer.create(\n      function (x) {\n        var retValue = onResolved(x);\n        if (retValue && typeof retValue.then === 'function') {\n          newPromise = retValue;\n        } else {\n          var ticks = self.scheduler.clock;\n          newPromise = new MockPromise(self.scheduler, [Rx.ReactiveTest.onNext(ticks, undefined), Rx.ReactiveTest.onCompleted(ticks)]);\n        }\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      },\n      function (err) {\n        onRejected(err);\n        var idx = self.observers.indexOf(observer);\n        self.observers.splice(idx, 1);\n        self.subscriptions[index] = new Subscription(self.subscriptions[index].subscribe, self.scheduler.clock);\n      }\n    );\n    this.observers.push(observer);\n\n    return newPromise || new MockPromise(this.scheduler, this.messages);\n  };\n\n  var HotObservable = (function (__super__) {\n\n    function subscribe(observer) {\n      var observable = this;\n      this.observers.push(observer);\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      return disposableCreate(function () {\n        var idx = observable.observers.indexOf(observer);\n        observable.observers.splice(idx, 1);\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n      });\n    }\n\n    inherits(HotObservable, __super__);\n\n    function HotObservable(scheduler, messages) {\n      __super__.call(this, subscribe);\n      var message, notification, observable = this;\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n      this.observers = [];\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          scheduler.scheduleAbsoluteWithState(null, message.time, function () {\n            var obs = observable.observers.slice(0);\n\n            for (var j = 0, jLen = obs.length; j < jLen; j++) {\n              innerNotification.accept(obs[j]);\n            }\n            return disposableEmpty;\n          });\n        })(notification);\n      }\n    }\n\n    return HotObservable;\n  })(Observable);\n\n  var ColdObservable = (function (__super__) {\n\n    function subscribe(observer) {\n      var message, notification, observable = this;\n      this.subscriptions.push(new Subscription(this.scheduler.clock));\n      var index = this.subscriptions.length - 1;\n      var d = new CompositeDisposable();\n      for (var i = 0, len = this.messages.length; i < len; i++) {\n        message = this.messages[i];\n        notification = message.value;\n        (function (innerNotification) {\n          d.add(observable.scheduler.scheduleRelativeWithState(null, message.time, function () {\n            innerNotification.accept(observer);\n            return disposableEmpty;\n          }));\n        })(notification);\n      }\n      return disposableCreate(function () {\n        observable.subscriptions[index] = new Subscription(observable.subscriptions[index].subscribe, observable.scheduler.clock);\n        d.dispose();\n      });\n    }\n\n    inherits(ColdObservable, __super__);\n\n    function ColdObservable(scheduler, messages) {\n      __super__.call(this, subscribe);\n      this.scheduler = scheduler;\n      this.messages = messages;\n      this.subscriptions = [];\n    }\n\n    return ColdObservable;\n  })(Observable);\n\n  /** Virtual time scheduler used for testing applications and libraries built using Reactive Extensions. */\n  Rx.TestScheduler = (function (__super__) {\n    inherits(TestScheduler, __super__);\n\n    function baseComparer(x, y) {\n      return x > y ? 1 : (x < y ? -1 : 0);\n    }\n\n    function TestScheduler() {\n      __super__.call(this, 0, baseComparer);\n    }\n\n    /**\n     * Schedules an action to be executed at the specified virtual time.\n     *\n     * @param state State passed to the action to be executed.\n     * @param dueTime Absolute virtual time at which to execute the action.\n     * @param action Action to be executed.\n     * @return Disposable object used to cancel the scheduled action (best effort).\n     */\n    TestScheduler.prototype.scheduleAbsoluteWithState = function (state, dueTime, action) {\n      dueTime <= this.clock && (dueTime = this.clock + 1);\n        return __super__.prototype.scheduleAbsoluteWithState.call(this, state, dueTime, action);\n    };\n    /**\n     * Adds a relative virtual time to an absolute virtual time value.\n     *\n     * @param absolute Absolute virtual time value.\n     * @param relative Relative virtual time value to add.\n     * @return Resulting absolute virtual time sum value.\n     */\n    TestScheduler.prototype.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n    /**\n     * Converts the absolute virtual time value to a DateTimeOffset value.\n     *\n     * @param absolute Absolute virtual time value to convert.\n     * @return Corresponding DateTimeOffset value.\n     */\n    TestScheduler.prototype.toDateTimeOffset = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     *\n     * @param timeSpan TimeSpan value to convert.\n     * @return Corresponding relative virtual time value.\n     */\n    TestScheduler.prototype.toRelative = function (timeSpan) {\n      return timeSpan;\n    };\n    /**\n     * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n     *\n     * @param create Factory method to create an observable sequence.\n     * @param created Virtual time at which to invoke the factory to create an observable sequence.\n     * @param subscribed Virtual time at which to subscribe to the created observable sequence.\n     * @param disposed Virtual time at which to dispose the subscription.\n     * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n     */\n    TestScheduler.prototype.startWithTiming = function (create, created, subscribed, disposed) {\n      var observer = this.createObserver(), source, subscription;\n\n      this.scheduleAbsoluteWithState(null, created, function () {\n        source = create();\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsoluteWithState(null, subscribed, function () {\n        subscription = source.subscribe(observer);\n        return disposableEmpty;\n      });\n\n      this.scheduleAbsoluteWithState(null, disposed, function () {\n        subscription.dispose();\n        return disposableEmpty;\n      });\n\n      this.start();\n\n      return observer;\n    };\n\n    /**\n     * Starts the test scheduler and uses the specified virtual time to dispose the subscription to the sequence obtained through the factory function.\n     * Default virtual times are used for factory invocation and sequence subscription.\n     *\n     * @param create Factory method to create an observable sequence.\n     * @param disposed Virtual time at which to dispose the subscription.\n     * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n     */\n    TestScheduler.prototype.startWithDispose = function (create, disposed) {\n        return this.startWithTiming(create, ReactiveTest.created, ReactiveTest.subscribed, disposed);\n    };\n\n    /**\n     * Starts the test scheduler and uses default virtual times to invoke the factory function, to subscribe to the resulting sequence, and to dispose the subscription.\n     *\n     * @param create Factory method to create an observable sequence.\n     * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n     */\n    TestScheduler.prototype.startWithCreate = function (create) {\n        return this.startWithTiming(create, ReactiveTest.created, ReactiveTest.subscribed, ReactiveTest.disposed);\n    };\n\n    /**\n     * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n     * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createHotObservable = function () {\n        var messages = argsOrArray(arguments, 0);\n        return new HotObservable(this, messages);\n    };\n\n    /**\n     * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n     * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n     * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n     */\n    TestScheduler.prototype.createColdObservable = function () {\n        var messages = argsOrArray(arguments, 0);\n        return new ColdObservable(this, messages);\n    };\n\n    /**\n     * Creates a resolved promise with the given value and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} value The value to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which fulfills with the given value.\n     */\n    TestScheduler.prototype.createResolvedPromise = function (ticks, value) {\n      return new MockPromise(this, [Rx.ReactiveTest.onNext(ticks, value), Rx.ReactiveTest.onCompleted(ticks)]);\n    };\n\n    /**\n     * Creates a rejected promise with the given reason and ticks\n     * @param {Number} ticks The absolute time of the resolution.\n     * @param {Any} reason The reason for rejection to yield at the given tick.\n     * @returns {MockPromise} A mock Promise which rejects with the given reason.\n     */\n    TestScheduler.prototype.createRejectedPromise = function (ticks, reason) {\n      return new MockPromise(this, [Rx.ReactiveTest.onError(ticks, reason)]);\n    };\n\n    /**\n     * Creates an observer that records received notification messages and timestamps those.\n     * @return Observer that can be used to assert the timing of received notifications.\n     */\n    TestScheduler.prototype.createObserver = function () {\n      return new MockObserver(this);\n    };\n\n    return TestScheduler;\n  })(VirtualTimeScheduler);\n\n    return Rx;\n}));\n"
  },
  {
    "path": "tests/perf/old/rx.time.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n    var objectTypes = {\n        'boolean': false,\n        'function': true,\n        'object': true,\n        'number': false,\n        'string': false,\n        'undefined': false\n    };\n\n    var root = (objectTypes[typeof window] && window) || this,\n        freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n        freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n        moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n        freeGlobal = objectTypes[typeof global] && global;\n\n    if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n        root = freeGlobal;\n    }\n\n    // Because of build optimizers\n    if (typeof define === 'function' && define.amd) {\n        define(['rx'], function (Rx, exports) {\n            return factory(root, exports, Rx);\n        });\n    } else if (typeof module === 'object' && module && module.exports === freeExports) {\n        module.exports = factory(root, module.exports, require('./rx'));\n    } else {\n        root.Rx = factory(root, {}, root.Rx);\n    }\n}.call(this, function (root, exp, Rx, undefined) {\n\n  // Refernces\n  var Observable = Rx.Observable,\n    observableProto = Observable.prototype,\n    AnonymousObservable = Rx.AnonymousObservable,\n    observableDefer = Observable.defer,\n    observableEmpty = Observable.empty,\n    observableNever = Observable.never,\n    observableThrow = Observable.throwException,\n    observableFromArray = Observable.fromArray,\n    timeoutScheduler = Rx.Scheduler.timeout,\n    SingleAssignmentDisposable = Rx.SingleAssignmentDisposable,\n    SerialDisposable = Rx.SerialDisposable,\n    CompositeDisposable = Rx.CompositeDisposable,\n    RefCountDisposable = Rx.RefCountDisposable,\n    Subject = Rx.Subject,\n    addRef = Rx.internals.addRef,\n    normalizeTime = Rx.Scheduler.normalize,\n    helpers = Rx.helpers,\n    isPromise = helpers.isPromise,\n    isScheduler = helpers.isScheduler,\n    observableFromPromise = Observable.fromPromise,\n    deprecate = helpers.deprecate;\n\n  function observableTimerDate(dueTime, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleWithAbsolute(dueTime, function () {\n        observer.onNext(0);\n        observer.onCompleted();\n      });\n    });\n  }\n\n  function observableTimerDateAndPeriod(dueTime, period, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var d = dueTime, p = normalizeTime(period);\n      return scheduler.scheduleRecursiveWithAbsoluteAndState(0, d, function (count, self) {\n        if (p > 0) {\n          var now = scheduler.now();\n          d = d + p;\n          d <= now && (d = now + p);\n        }\n        observer.onNext(count);\n        self(count + 1, d);\n      });\n    });\n  }\n\n  function observableTimerTimeSpan(dueTime, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      return scheduler.scheduleWithRelative(normalizeTime(dueTime), function () {\n        observer.onNext(0);\n        observer.onCompleted();\n      });\n    });\n  }\n\n  function observableTimerTimeSpanAndPeriod(dueTime, period, scheduler) {\n    return dueTime === period ?\n      new AnonymousObservable(function (observer) {\n        return scheduler.schedulePeriodicWithState(0, period, function (count) {\n          observer.onNext(count);\n          return count + 1;\n        });\n      }) :\n      observableDefer(function () {\n        return observableTimerDateAndPeriod(scheduler.now() + dueTime, period, scheduler);\n      });\n  }\n\n  /**\n   *  Returns an observable sequence that produces a value after each period.\n   *\n   * @example\n   *  1 - res = Rx.Observable.interval(1000);\n   *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n   *\n   * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n   * @returns {Observable} An observable sequence that produces a value after each period.\n   */\n  var observableinterval = Observable.interval = function (period, scheduler) {\n    return observableTimerTimeSpanAndPeriod(period, period, isScheduler(scheduler) ? scheduler : timeoutScheduler);\n  };\n\n  /**\n   *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n   * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n   */\n  var observableTimer = Observable.timer = function (dueTime, periodOrScheduler, scheduler) {\n    var period;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    if (periodOrScheduler !== undefined && typeof periodOrScheduler === 'number') {\n      period = periodOrScheduler;\n    } else if (isScheduler(periodOrScheduler)) {\n      scheduler = periodOrScheduler;\n    }\n    if (dueTime instanceof Date && period === undefined) {\n      return observableTimerDate(dueTime.getTime(), scheduler);\n    }\n    if (dueTime instanceof Date && period !== undefined) {\n      period = periodOrScheduler;\n      return observableTimerDateAndPeriod(dueTime.getTime(), period, scheduler);\n    }\n    return period === undefined ?\n      observableTimerTimeSpan(dueTime, scheduler) :\n      observableTimerTimeSpanAndPeriod(dueTime, period, scheduler);\n  };\n\n  function observableDelayTimeSpan(source, dueTime, scheduler) {\n    return new AnonymousObservable(function (observer) {\n      var active = false,\n        cancelable = new SerialDisposable(),\n        exception = null,\n        q = [],\n        running = false,\n        subscription;\n      subscription = source.materialize().timestamp(scheduler).subscribe(function (notification) {\n        var d, shouldRun;\n        if (notification.value.kind === 'E') {\n          q = [];\n          q.push(notification);\n          exception = notification.value.exception;\n          shouldRun = !running;\n        } else {\n          q.push({ value: notification.value, timestamp: notification.timestamp + dueTime });\n          shouldRun = !active;\n          active = true;\n        }\n        if (shouldRun) {\n          if (exception !== null) {\n            observer.onError(exception);\n          } else {\n            d = new SingleAssignmentDisposable();\n            cancelable.setDisposable(d);\n            d.setDisposable(scheduler.scheduleRecursiveWithRelative(dueTime, function (self) {\n              var e, recurseDueTime, result, shouldRecurse;\n              if (exception !== null) {\n                return;\n              }\n              running = true;\n              do {\n                result = null;\n                if (q.length > 0 && q[0].timestamp - scheduler.now() <= 0) {\n                  result = q.shift().value;\n                }\n                if (result !== null) {\n                  result.accept(observer);\n                }\n              } while (result !== null);\n              shouldRecurse = false;\n              recurseDueTime = 0;\n              if (q.length > 0) {\n                shouldRecurse = true;\n                recurseDueTime = Math.max(0, q[0].timestamp - scheduler.now());\n              } else {\n                active = false;\n              }\n              e = exception;\n              running = false;\n              if (e !== null) {\n                observer.onError(e);\n              } else if (shouldRecurse) {\n                self(recurseDueTime);\n              }\n            }));\n          }\n        }\n      });\n      return new CompositeDisposable(subscription, cancelable);\n    }, source);\n  }\n\n  function observableDelayDate(source, dueTime, scheduler) {\n    return observableDefer(function () {\n      return observableDelayTimeSpan(source, dueTime - scheduler.now(), scheduler);\n    });\n  }\n\n  /**\n   *  Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n   *\n   * @example\n   *  1 - res = Rx.Observable.delay(new Date());\n   *  2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout);\n   *\n   *  3 - res = Rx.Observable.delay(5000);\n   *  4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout);\n   * @memberOf Observable#\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n   * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delay = function (dueTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return dueTime instanceof Date ?\n      observableDelayDate(this, dueTime.getTime(), scheduler) :\n      observableDelayTimeSpan(this, dueTime, scheduler);\n  };\n\n  /**\n   *  Ignores values from an observable sequence which are followed by another value before dueTime.\n   * @param {Number} dueTime Duration of the debounce period for each value (specified as an integer denoting milliseconds).\n   * @param {Scheduler} [scheduler]  Scheduler to run the debounce timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The debounced sequence.\n   */\n  observableProto.debounce = observableProto.throttleWithTimeout = function (dueTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var cancelable = new SerialDisposable(), hasvalue = false, value, id = 0;\n      var subscription = source.subscribe(\n        function (x) {\n          hasvalue = true;\n          value = x;\n          id++;\n          var currentId = id,\n            d = new SingleAssignmentDisposable();\n          cancelable.setDisposable(d);\n          d.setDisposable(scheduler.scheduleWithRelative(dueTime, function () {\n            hasvalue && id === currentId && observer.onNext(value);\n            hasvalue = false;\n          }));\n        },\n        function (e) {\n          cancelable.dispose();\n          observer.onError(e);\n          hasvalue = false;\n          id++;\n        },\n        function () {\n          cancelable.dispose();\n          hasvalue && observer.onNext(value);\n          observer.onCompleted();\n          hasvalue = false;\n          id++;\n        });\n      return new CompositeDisposable(subscription, cancelable);\n    }, this);\n  };\n\n  /**\n   * @deprecated use #debounce or #throttleWithTimeout instead.\n   */\n  observableProto.throttle = function(dueTime, scheduler) {\n    //deprecate('throttle', 'debounce or throttleWithTimeout');\n    return this.debounce(dueTime, scheduler);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n   * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n   * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n    var source = this, timeShift;\n    timeShiftOrScheduler == null && (timeShift = timeSpan);\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    if (typeof timeShiftOrScheduler === 'number') {\n      timeShift = timeShiftOrScheduler;\n    } else if (isScheduler(timeShiftOrScheduler)) {\n      timeShift = timeSpan;\n      scheduler = timeShiftOrScheduler;\n    }\n    return new AnonymousObservable(function (observer) {\n      var groupDisposable,\n        nextShift = timeShift,\n        nextSpan = timeSpan,\n        q = [],\n        refCountDisposable,\n        timerD = new SerialDisposable(),\n        totalTime = 0;\n        groupDisposable = new CompositeDisposable(timerD),\n        refCountDisposable = new RefCountDisposable(groupDisposable);\n\n       function createTimer () {\n        var m = new SingleAssignmentDisposable(),\n          isSpan = false,\n          isShift = false;\n        timerD.setDisposable(m);\n        if (nextSpan === nextShift) {\n          isSpan = true;\n          isShift = true;\n        } else if (nextSpan < nextShift) {\n            isSpan = true;\n        } else {\n          isShift = true;\n        }\n        var newTotalTime = isSpan ? nextSpan : nextShift,\n          ts = newTotalTime - totalTime;\n        totalTime = newTotalTime;\n        if (isSpan) {\n          nextSpan += timeShift;\n        }\n        if (isShift) {\n          nextShift += timeShift;\n        }\n        m.setDisposable(scheduler.scheduleWithRelative(ts, function () {\n          if (isShift) {\n            var s = new Subject();\n            q.push(s);\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          isSpan && q.shift().onCompleted();\n          createTimer();\n        }));\n      };\n      q.push(new Subject());\n      observer.onNext(addRef(q[0], refCountDisposable));\n      createTimer();\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onNext(x); }\n        },\n        function (e) {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onError(e); }\n          observer.onError(e);\n        },\n        function () {\n          for (var i = 0, len = q.length; i < len; i++) { q[i].onCompleted(); }\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n  /**\n   *  Projects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed.\n   * @param {Number} timeSpan Maximum time length of a window.\n   * @param {Number} count Maximum element count of a window.\n   * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence of windows.\n   */\n  observableProto.windowWithTimeOrCount = function (timeSpan, count, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (observer) {\n      var timerD = new SerialDisposable(),\n          groupDisposable = new CompositeDisposable(timerD),\n          refCountDisposable = new RefCountDisposable(groupDisposable),\n          n = 0,\n          windowId = 0,\n          s = new Subject();\n\n      function createTimer(id) {\n        var m = new SingleAssignmentDisposable();\n        timerD.setDisposable(m);\n        m.setDisposable(scheduler.scheduleWithRelative(timeSpan, function () {\n          if (id !== windowId) { return; }\n          n = 0;\n          var newId = ++windowId;\n          s.onCompleted();\n          s = new Subject();\n          observer.onNext(addRef(s, refCountDisposable));\n          createTimer(newId);\n        }));\n      }\n\n      observer.onNext(addRef(s, refCountDisposable));\n      createTimer(0);\n\n      groupDisposable.add(source.subscribe(\n        function (x) {\n          var newId = 0, newWindow = false;\n          s.onNext(x);\n          if (++n === count) {\n            newWindow = true;\n            n = 0;\n            newId = ++windowId;\n            s.onCompleted();\n            s = new Subject();\n            observer.onNext(addRef(s, refCountDisposable));\n          }\n          newWindow && createTimer(newId);\n        },\n        function (e) {\n          s.onError(e);\n          observer.onError(e);\n        }, function () {\n          s.onCompleted();\n          observer.onCompleted();\n        }\n      ));\n      return refCountDisposable;\n    }, source);\n  };\n\n    /**\n     *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n     *\n     * @example\n     *  1 - res = xs.bufferWithTime(1000, scheduler); // non-overlapping segments of 1 second\n     *  2 - res = xs.bufferWithTime(1000, 500, scheduler; // segments of 1 second with time shift 0.5 seconds\n     *\n     * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n     * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n     * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n     * @returns {Observable} An observable sequence of buffers.\n     */\n    observableProto.bufferWithTime = function (timeSpan, timeShiftOrScheduler, scheduler) {\n        return this.windowWithTime.apply(this, arguments).selectMany(function (x) { return x.toArray(); });\n    };\n\n    /**\n     *  Projects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed.\n     *\n     * @example\n     *  1 - res = source.bufferWithTimeOrCount(5000, 50); // 5s or 50 items in an array\n     *  2 - res = source.bufferWithTimeOrCount(5000, 50, scheduler); // 5s or 50 items in an array\n     *\n     * @param {Number} timeSpan Maximum time length of a buffer.\n     * @param {Number} count Maximum element count of a buffer.\n     * @param {Scheduler} [scheduler]  Scheduler to run bufferin timers on. If not specified, the timeout scheduler is used.\n     * @returns {Observable} An observable sequence of buffers.\n     */\n    observableProto.bufferWithTimeOrCount = function (timeSpan, count, scheduler) {\n        return this.windowWithTimeOrCount(timeSpan, count, scheduler).selectMany(function (x) {\n            return x.toArray();\n        });\n    };\n\n  /**\n   *  Records the time interval between consecutive values in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timeInterval();\n   *  2 - res = source.timeInterval(Rx.Scheduler.timeout);\n   *\n   * @param [scheduler]  Scheduler used to compute time intervals. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence with time interval information on values.\n   */\n  observableProto.timeInterval = function (scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return observableDefer(function () {\n      var last = scheduler.now();\n      return source.map(function (x) {\n        var now = scheduler.now(), span = now - last;\n        last = now;\n        return { value: x, interval: span };\n      });\n    });\n  };\n\n  /**\n   *  Records the timestamp for each value in an observable sequence.\n   *\n   * @example\n   *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n   *  2 - res = source.timestamp(Rx.Scheduler.timeout);\n   *\n   * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the timeout scheduler is used.\n   * @returns {Observable} An observable sequence with timestamp information on values.\n   */\n  observableProto.timestamp = function (scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return this.map(function (x) {\n      return { value: x, timestamp: scheduler.now() };\n    });\n  };\n\n  function sampleObservable(source, sampler) {\n    return new AnonymousObservable(function (observer) {\n      var atEnd, value, hasValue;\n\n      function sampleSubscribe() {\n        if (hasValue) {\n          hasValue = false;\n          observer.onNext(value);\n        }\n        atEnd && observer.onCompleted();\n      }\n\n      return new CompositeDisposable(\n        source.subscribe(function (newValue) {\n          hasValue = true;\n          value = newValue;\n        }, observer.onError.bind(observer), function () {\n          atEnd = true;\n        }),\n        sampler.subscribe(sampleSubscribe, observer.onError.bind(observer), sampleSubscribe)\n      );\n    }, source);\n  }\n\n  /**\n   *  Samples the observable sequence at each interval.\n   *\n   * @example\n   *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n   *  2 - res = source.sample(5000); // 5 seconds\n   *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n   *\n   * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n   * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Sampled observable sequence.\n   */\n  observableProto.sample = observableProto.throttleLatest = function (intervalOrSampler, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return typeof intervalOrSampler === 'number' ?\n      sampleObservable(this, observableinterval(intervalOrSampler, scheduler)) :\n      sampleObservable(this, intervalOrSampler);\n  };\n\n  /**\n   *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n   * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n   * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n   */\n  observableProto.timeout = function (dueTime, other, scheduler) {\n    (other == null || typeof other === 'string') && (other = observableThrow(new Error(other || 'Timeout')));\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n\n    var source = this, schedulerMethod = dueTime instanceof Date ?\n      'scheduleWithAbsolute' :\n      'scheduleWithRelative';\n\n    return new AnonymousObservable(function (observer) {\n      var id = 0,\n        original = new SingleAssignmentDisposable(),\n        subscription = new SerialDisposable(),\n        switched = false,\n        timer = new SerialDisposable();\n\n      subscription.setDisposable(original);\n\n      function createTimer() {\n        var myId = id;\n        timer.setDisposable(scheduler[schedulerMethod](dueTime, function () {\n          if (id === myId) {\n            isPromise(other) && (other = observableFromPromise(other));\n            subscription.setDisposable(other.subscribe(observer));\n          }\n        }));\n      }\n\n      createTimer();\n\n      original.setDisposable(source.subscribe(function (x) {\n        if (!switched) {\n          id++;\n          observer.onNext(x);\n          createTimer();\n        }\n      }, function (e) {\n        if (!switched) {\n          id++;\n          observer.onError(e);\n        }\n      }, function () {\n        if (!switched) {\n          id++;\n          observer.onCompleted();\n        }\n      }));\n      return new CompositeDisposable(subscription, timer);\n    }, source);\n  };\n\n  /**\n   *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithAbsoluteTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return new Date(); }\n   *  });\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning Date values.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithAbsoluteTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (observer) {\n      var first = true,\n        hasResult = false,\n        result,\n        state = initialState,\n        time;\n      return scheduler.scheduleRecursiveWithAbsolute(scheduler.now(), function (self) {\n        hasResult && observer.onNext(result);\n\n        try {\n          if (first) {\n            first = false;\n          } else {\n            state = iterate(state);\n          }\n          hasResult = condition(state);\n          if (hasResult) {\n            result = resultSelector(state);\n            time = timeSelector(state);\n          }\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n        if (hasResult) {\n          self(time);\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n   *\n   * @example\n   *  res = source.generateWithRelativeTime(0,\n   *      function (x) { return return true; },\n   *      function (x) { return x + 1; },\n   *      function (x) { return x; },\n   *      function (x) { return 500; }\n   *  );\n   *\n   * @param {Mixed} initialState Initial state.\n   * @param {Function} condition Condition to terminate generation (upon returning false).\n   * @param {Function} iterate Iteration step function.\n   * @param {Function} resultSelector Selector function for results produced in the sequence.\n   * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds.\n   * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n   * @returns {Observable} The generated sequence.\n   */\n  Observable.generateWithRelativeTime = function (initialState, condition, iterate, resultSelector, timeSelector, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (observer) {\n      var first = true,\n        hasResult = false,\n        result,\n        state = initialState,\n        time;\n      return scheduler.scheduleRecursiveWithRelative(0, function (self) {\n        hasResult && observer.onNext(result);\n\n        try {\n          if (first) {\n            first = false;\n          } else {\n            state = iterate(state);\n          }\n          hasResult = condition(state);\n          if (hasResult) {\n            result = resultSelector(state);\n            time = timeSelector(state);\n          }\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n        if (hasResult) {\n          self(time);\n        } else {\n          observer.onCompleted();\n        }\n      });\n    });\n  };\n\n  /**\n   *  Time shifts the observable sequence by delaying the subscription.\n   *\n   * @example\n   *  1 - res = source.delaySubscription(5000); // 5s\n   *  2 - res = source.delaySubscription(5000, Rx.Scheduler.timeout); // 5 seconds\n   *\n   * @param {Number} dueTime Absolute or relative time to perform the subscription at.\n   * @param {Scheduler} [scheduler]  Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delaySubscription = function (dueTime, scheduler) {\n    return this.delayWithSelector(observableTimer(dueTime, isScheduler(scheduler) ? scheduler : timeoutScheduler), observableEmpty);\n  };\n\n  /**\n   *  Time shifts the observable sequence based on a subscription delay and a delay selector function for each element.\n   *\n   * @example\n   *  1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only\n   *  1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector\n   *\n   * @param {Observable} [subscriptionDelay]  Sequence indicating the delay for the subscription to the source.\n   * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element.\n   * @returns {Observable} Time-shifted sequence.\n   */\n  observableProto.delayWithSelector = function (subscriptionDelay, delayDurationSelector) {\n      var source = this, subDelay, selector;\n      if (typeof subscriptionDelay === 'function') {\n        selector = subscriptionDelay;\n      } else {\n        subDelay = subscriptionDelay;\n        selector = delayDurationSelector;\n      }\n      return new AnonymousObservable(function (observer) {\n        var delays = new CompositeDisposable(), atEnd = false, done = function () {\n            if (atEnd && delays.length === 0) { observer.onCompleted(); }\n        }, subscription = new SerialDisposable(), start = function () {\n          subscription.setDisposable(source.subscribe(function (x) {\n              var delay;\n              try {\n                delay = selector(x);\n              } catch (error) {\n                observer.onError(error);\n                return;\n              }\n              var d = new SingleAssignmentDisposable();\n              delays.add(d);\n              d.setDisposable(delay.subscribe(function () {\n                observer.onNext(x);\n                delays.remove(d);\n                done();\n              }, observer.onError.bind(observer), function () {\n                observer.onNext(x);\n                delays.remove(d);\n                done();\n              }));\n          }, observer.onError.bind(observer), function () {\n            atEnd = true;\n            subscription.dispose();\n            done();\n          }));\n      };\n\n      if (!subDelay) {\n        start();\n      } else {\n        subscription.setDisposable(subDelay.subscribe(start, observer.onError.bind(observer), start));\n      }\n\n      return new CompositeDisposable(subscription, delays);\n    }, this);\n  };\n\n    /**\n     *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n     * @param {Observable} [firstTimeout]  Observable sequence that represents the timeout for the first element. If not provided, this defaults to Observable.never().\n     * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n     * @param {Observable} [other]  Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException().\n     * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n     */\n    observableProto.timeoutWithSelector = function (firstTimeout, timeoutdurationSelector, other) {\n      if (arguments.length === 1) {\n          timeoutdurationSelector = firstTimeout;\n          firstTimeout = observableNever();\n      }\n      other || (other = observableThrow(new Error('Timeout')));\n      var source = this;\n      return new AnonymousObservable(function (observer) {\n        var subscription = new SerialDisposable(), timer = new SerialDisposable(), original = new SingleAssignmentDisposable();\n\n        subscription.setDisposable(original);\n\n        var id = 0, switched = false;\n\n        function setTimer(timeout) {\n          var myId = id;\n\n          function timerWins () {\n            return id === myId;\n          }\n\n          var d = new SingleAssignmentDisposable();\n          timer.setDisposable(d);\n          d.setDisposable(timeout.subscribe(function () {\n            timerWins() && subscription.setDisposable(other.subscribe(observer));\n            d.dispose();\n          }, function (e) {\n            timerWins() && observer.onError(e);\n          }, function () {\n            timerWins() && subscription.setDisposable(other.subscribe(observer));\n          }));\n        };\n\n        setTimer(firstTimeout);\n\n        function observerWins() {\n          var res = !switched;\n          if (res) { id++; }\n          return res;\n        }\n\n        original.setDisposable(source.subscribe(function (x) {\n          if (observerWins()) {\n            observer.onNext(x);\n            var timeout;\n            try {\n              timeout = timeoutdurationSelector(x);\n            } catch (e) {\n              observer.onError(e);\n              return;\n            }\n            setTimer(isPromise(timeout) ? observableFromPromise(timeout) : timeout);\n          }\n        }, function (e) {\n          observerWins() && observer.onError(e);\n        }, function () {\n          observerWins() && observer.onCompleted();\n        }));\n        return new CompositeDisposable(subscription, timer);\n      }, source);\n    };\n\n  /**\n   * Ignores values from an observable sequence which are followed by another value within a computed throttle duration.\n   * @param {Function} durationSelector Selector function to retrieve a sequence indicating the throttle duration for each given element.\n   * @returns {Observable} The debounced sequence.\n   */\n  observableProto.debounceWithSelector = function (durationSelector) {\n    var source = this;\n    return new AnonymousObservable(function (observer) {\n      var value, hasValue = false, cancelable = new SerialDisposable(), id = 0;\n      var subscription = source.subscribe(function (x) {\n        var throttle;\n        try {\n          throttle = durationSelector(x);\n        } catch (e) {\n          observer.onError(e);\n          return;\n        }\n\n        isPromise(throttle) && (throttle = observableFromPromise(throttle));\n\n        hasValue = true;\n        value = x;\n        id++;\n        var currentid = id, d = new SingleAssignmentDisposable();\n        cancelable.setDisposable(d);\n        d.setDisposable(throttle.subscribe(function () {\n          hasValue && id === currentid && observer.onNext(value);\n          hasValue = false;\n          d.dispose();\n        }, observer.onError.bind(observer), function () {\n          hasValue && id === currentid && observer.onNext(value);\n          hasValue = false;\n          d.dispose();\n        }));\n      }, function (e) {\n        cancelable.dispose();\n        observer.onError(e);\n        hasValue = false;\n        id++;\n      }, function () {\n        cancelable.dispose();\n        hasValue && observer.onNext(value);\n        observer.onCompleted();\n        hasValue = false;\n        id++;\n      });\n      return new CompositeDisposable(subscription, cancelable);\n    }, source);\n  };\n\n  observableProto.throttleWithSelector = function () {\n    //deprecate('throttleWithSelector', 'debounceWithSelector');\n    return this.debounceWithSelector.apply(this, arguments);\n  };\n\n  /**\n   *  Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   *\n   *  1 - res = source.skipLastWithTime(5000);\n   *  2 - res = source.skipLastWithTime(5000, scheduler);\n   *\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for skipping elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence.\n   */\n  observableProto.skipLastWithTime = function (duration, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        var now = scheduler.now();\n        q.push({ interval: now, value: x });\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          o.onNext(q.shift().value);\n        }\n      }, function (e) { o.onError(e); }, function () {\n        var now = scheduler.now();\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          o.onNext(q.shift().value);\n        }\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        var now = scheduler.now();\n        q.push({ interval: now, value: x });\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          q.shift();\n        }\n      }, function (e) { o.onError(e); }, function () {\n        var now = scheduler.now();\n        while (q.length > 0) {\n          var next = q.shift();\n          if (now - next.interval <= duration) { o.onNext(next.value); }\n        }\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the end of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence.\n   */\n  observableProto.takeLastBufferWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (o) {\n      var q = [];\n      return source.subscribe(function (x) {\n        var now = scheduler.now();\n        q.push({ interval: now, value: x });\n        while (q.length > 0 && now - q[0].interval >= duration) {\n          q.shift();\n        }\n      }, function (e) { o.onError(e); }, function () {\n        var now = scheduler.now(), res = [];\n        while (q.length > 0) {\n          var next = q.shift();\n          now - next.interval <= duration && res.push(next.value);\n        }\n        o.onNext(res);\n        o.onCompleted();\n      });\n    }, source);\n  };\n\n  /**\n   *  Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.takeWithTime(5000,  [optional scheduler]);\n   * @description\n   *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n   *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n   *  result sequence. This causes elements to be delayed with duration.\n   * @param {Number} duration Duration for taking elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence.\n   */\n  observableProto.takeWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (o) {\n      return new CompositeDisposable(scheduler.scheduleWithRelative(duration, function () { o.onCompleted(); }), source.subscribe(o));\n    }, source);\n  };\n\n  /**\n   *  Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n   *\n   * @example\n   *  1 - res = source.skipWithTime(5000, [optional scheduler]);\n   *\n   * @description\n   *  Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence.\n   *  This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded\n   *  may not execute immediately, despite the zero due time.\n   *\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration.\n   * @param {Number} duration Duration for skipping elements from the start of the sequence.\n   * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence.\n   */\n  observableProto.skipWithTime = function (duration, scheduler) {\n    var source = this;\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    return new AnonymousObservable(function (observer) {\n      var open = false;\n      return new CompositeDisposable(\n        scheduler.scheduleWithRelative(duration, function () { open = true; }),\n        source.subscribe(function (x) { open && observer.onNext(x); }, observer.onError.bind(observer), observer.onCompleted.bind(observer)));\n    }, source);\n  };\n\n  /**\n   *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n   *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n   *\n   * @examples\n   *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n   *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n   * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n   * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n   */\n  observableProto.skipUntilWithTime = function (startTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    var source = this, schedulerMethod = startTime instanceof Date ?\n      'scheduleWithAbsolute' :\n      'scheduleWithRelative';\n    return new AnonymousObservable(function (o) {\n      var open = false;\n\n      return new CompositeDisposable(\n        scheduler[schedulerMethod](startTime, function () { open = true; }),\n        source.subscribe(\n          function (x) { open && o.onNext(x); },\n          function (e) { o.onError(e); }, function () { o.onCompleted(); }));\n    }, source);\n  };\n\n  /**\n   *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n   * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n   * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n   * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n   */\n  observableProto.takeUntilWithTime = function (endTime, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    var source = this, schedulerMethod = endTime instanceof Date ?\n      'scheduleWithAbsolute' :\n      'scheduleWithRelative';\n    return new AnonymousObservable(function (o) {\n      return new CompositeDisposable(\n        scheduler[schedulerMethod](endTime, function () { o.onCompleted(); }),\n        source.subscribe(o));\n    }, source);\n  };\n\n  /**\n   * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n   * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n   * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n   * @returns {Observable} An Observable that performs the throttle operation.\n   */\n  observableProto.throttleFirst = function (windowDuration, scheduler) {\n    isScheduler(scheduler) || (scheduler = timeoutScheduler);\n    var duration = +windowDuration || 0;\n    if (duration <= 0) { throw new RangeError('windowDuration cannot be less or equal zero.'); }\n    var source = this;\n    return new AnonymousObservable(function (o) {\n      var lastOnNext = 0;\n      return source.subscribe(\n        function (x) {\n          var now = scheduler.now();\n          if (lastOnNext === 0 || now - lastOnNext >= duration) {\n            lastOnNext = now;\n            o.onNext(x);\n          }\n        },function (e) { o.onError(e); }, function () { o.onCompleted(); }\n      );\n    }, source);\n  };\n\n    return Rx;\n}));\n"
  },
  {
    "path": "tests/perf/old/rx.virtualtime.js",
    "content": "// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information.\n\n;(function (factory) {\n    var objectTypes = {\n        'boolean': false,\n        'function': true,\n        'object': true,\n        'number': false,\n        'string': false,\n        'undefined': false\n    };\n\n    var root = (objectTypes[typeof window] && window) || this,\n        freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports,\n        freeModule = objectTypes[typeof module] && module && !module.nodeType && module,\n        moduleExports = freeModule && freeModule.exports === freeExports && freeExports,\n        freeGlobal = objectTypes[typeof global] && global;\n\n    if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal)) {\n        root = freeGlobal;\n    }\n\n    // Because of build optimizers\n    if (typeof define === 'function' && define.amd) {\n        define(['rx'], function (Rx, exports) {\n            return factory(root, exports, Rx);\n        });\n    } else if (typeof module === 'object' && module && module.exports === freeExports) {\n        module.exports = factory(root, module.exports, require('./rx'));\n    } else {\n        root.Rx = factory(root, {}, root.Rx);\n    }\n}.call(this, function (root, exp, Rx, undefined) {\n\n\t// Aliases\n\tvar Scheduler = Rx.Scheduler,\n\t\tPriorityQueue = Rx.internals.PriorityQueue,\n\t\tScheduledItem = Rx.internals.ScheduledItem,\n\t\tSchedulePeriodicRecursive  = Rx.internals.SchedulePeriodicRecursive,\n\t\tdisposableEmpty = Rx.Disposable.empty,\n\t\tinherits = Rx.internals.inherits,\n    defaultSubComparer = Rx.helpers.defaultSubComparer;\n\n  /** Provides a set of extension methods for virtual time scheduling. */\n  Rx.VirtualTimeScheduler = (function (__super__) {\n\n    function notImplemented() {\n        throw new Error('Not implemented');\n    }\n\n    function localNow() {\n      return this.toDateTimeOffset(this.clock);\n    }\n\n    function scheduleNow(state, action) {\n      return this.scheduleAbsoluteWithState(state, this.clock, action);\n    }\n\n    function scheduleRelative(state, dueTime, action) {\n      return this.scheduleRelativeWithState(state, this.toRelative(dueTime), action);\n    }\n\n    function scheduleAbsolute(state, dueTime, action) {\n      return this.scheduleRelativeWithState(state, this.toRelative(dueTime - this.now()), action);\n    }\n\n    function invokeAction(scheduler, action) {\n      action();\n      return disposableEmpty;\n    }\n\n    inherits(VirtualTimeScheduler, __super__);\n\n    /**\n     * Creates a new virtual time scheduler with the specified initial clock value and absolute time comparer.\n     *\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function VirtualTimeScheduler(initialClock, comparer) {\n      this.clock = initialClock;\n      this.comparer = comparer;\n      this.isEnabled = false;\n      this.queue = new PriorityQueue(1024);\n      __super__.call(this, localNow, scheduleNow, scheduleRelative, scheduleAbsolute);\n    }\n\n    var VirtualTimeSchedulerPrototype = VirtualTimeScheduler.prototype;\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    VirtualTimeSchedulerPrototype.add = notImplemented;\n\n    /**\n     * Converts an absolute time to a number\n     * @param {Any} The absolute time.\n     * @returns {Number} The absolute time in ms\n     */\n    VirtualTimeSchedulerPrototype.toDateTimeOffset = notImplemented;\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    VirtualTimeSchedulerPrototype.toRelative = notImplemented;\n\n    /**\n     * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be emulated using recursive scheduling.\n     * @param {Mixed} state Initial state passed to the action upon the first iteration.\n     * @param {Number} period Period for running the work periodically.\n     * @param {Function} action Action to be executed, potentially updating the state.\n     * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.schedulePeriodicWithState = function (state, period, action) {\n      var s = new SchedulePeriodicRecursive(this, state, period, action);\n      return s.start();\n    };\n\n    /**\n     * Schedules an action to be executed after dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleRelativeWithState = function (state, dueTime, action) {\n      var runAt = this.add(this.clock, dueTime);\n      return this.scheduleAbsoluteWithState(state, runAt, action);\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Number} dueTime Relative time after which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleRelative = function (dueTime, action) {\n      return this.scheduleRelativeWithState(action, dueTime, invokeAction);\n    };\n\n    /**\n     * Starts the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.start = function () {\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n      }\n    };\n\n    /**\n     * Stops the virtual time scheduler.\n     */\n    VirtualTimeSchedulerPrototype.stop = function () {\n      this.isEnabled = false;\n    };\n\n    /**\n     * Advances the scheduler's clock to the specified time, running all work till that point.\n     * @param {Number} time Absolute time to advance the scheduler's clock to.\n     */\n    VirtualTimeSchedulerPrototype.advanceTo = function (time) {\n      var dueToClock = this.comparer(this.clock, time);\n      if (this.comparer(this.clock, time) > 0) {\n        throw new Error(argumentOutOfRange);\n      }\n      if (dueToClock === 0) {\n        return;\n      }\n      if (!this.isEnabled) {\n        this.isEnabled = true;\n        do {\n          var next = this.getNext();\n          if (next !== null && this.comparer(next.dueTime, time) <= 0) {\n            this.comparer(next.dueTime, this.clock) > 0 && (this.clock = next.dueTime);\n            next.invoke();\n          } else {\n            this.isEnabled = false;\n          }\n        } while (this.isEnabled);\n        this.clock = time;\n      }\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.advanceBy = function (time) {\n      var dt = this.add(this.clock, time),\n          dueToClock = this.comparer(this.clock, dt);\n      if (dueToClock > 0) { throw new Error(argumentOutOfRange); }\n      if (dueToClock === 0) {  return; }\n\n      this.advanceTo(dt);\n    };\n\n    /**\n     * Advances the scheduler's clock by the specified relative time.\n     * @param {Number} time Relative time to advance the scheduler's clock by.\n     */\n    VirtualTimeSchedulerPrototype.sleep = function (time) {\n      var dt = this.add(this.clock, time);\n      if (this.comparer(this.clock, dt) >= 0) { throw new Error(argumentOutOfRange); }\n\n      this.clock = dt;\n    };\n\n    /**\n     * Gets the next scheduled item to be executed.\n     * @returns {ScheduledItem} The next scheduled item.\n     */\n    VirtualTimeSchedulerPrototype.getNext = function () {\n      while (this.queue.length > 0) {\n        var next = this.queue.peek();\n        if (next.isCancelled()) {\n          this.queue.dequeue();\n        } else {\n          return next;\n        }\n      }\n      return null;\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Scheduler} scheduler Scheduler to execute the action on.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleAbsolute = function (dueTime, action) {\n      return this.scheduleAbsoluteWithState(action, dueTime, invokeAction);\n    };\n\n    /**\n     * Schedules an action to be executed at dueTime.\n     * @param {Mixed} state State passed to the action to be executed.\n     * @param {Number} dueTime Absolute time at which to execute the action.\n     * @param {Function} action Action to be executed.\n     * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n     */\n    VirtualTimeSchedulerPrototype.scheduleAbsoluteWithState = function (state, dueTime, action) {\n      var self = this;\n\n      function run(scheduler, state1) {\n        self.queue.remove(si);\n        return action(scheduler, state1);\n      }\n\n      var si = new ScheduledItem(this, state, run, dueTime, this.comparer);\n      this.queue.enqueue(si);\n\n      return si.disposable;\n    };\n\n    return VirtualTimeScheduler;\n  }(Scheduler));\n\n  /** Provides a virtual time scheduler that uses Date for absolute time and number for relative time. */\n  Rx.HistoricalScheduler = (function (__super__) {\n    inherits(HistoricalScheduler, __super__);\n\n    /**\n     * Creates a new historical scheduler with the specified initial clock value.\n     * @constructor\n     * @param {Number} initialClock Initial value for the clock.\n     * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n     */\n    function HistoricalScheduler(initialClock, comparer) {\n      var clock = initialClock == null ? 0 : initialClock;\n      var cmp = comparer || defaultSubComparer;\n      __super__.call(this, clock, cmp);\n    }\n\n    var HistoricalSchedulerProto = HistoricalScheduler.prototype;\n\n    /**\n     * Adds a relative time value to an absolute time value.\n     * @param {Number} absolute Absolute virtual time value.\n     * @param {Number} relative Relative virtual time value to add.\n     * @return {Number} Resulting absolute virtual time sum value.\n     */\n    HistoricalSchedulerProto.add = function (absolute, relative) {\n      return absolute + relative;\n    };\n\n    HistoricalSchedulerProto.toDateTimeOffset = function (absolute) {\n      return new Date(absolute).getTime();\n    };\n\n    /**\n     * Converts the TimeSpan value to a relative virtual time value.\n     * @memberOf HistoricalScheduler\n     * @param {Number} timeSpan TimeSpan value to convert.\n     * @return {Number} Corresponding relative virtual time value.\n     */\n    HistoricalSchedulerProto.toRelative = function (timeSpan) {\n      return timeSpan;\n    };\n\n    return HistoricalScheduler;\n  }(Rx.VirtualTimeScheduler));\n\n    return Rx;\n}));\n"
  },
  {
    "path": "tests/perf/operators/combinelatest.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.combineLatest(\n    RxOld.Observable.range(0, 10),\n    RxOld.Observable.range(0, 10),\n    function (x, y) { return x + y; }\n  ).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.combineLatest(\n    RxNew.Observable.range(0, 10),\n    RxNew.Observable.range(0, 10),\n    function (x, y) { return x + y; }\n  ).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/concat.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.concat(\n\t\tRxOld.Observable.range(0, 10),\n    RxOld.Observable.range(0, 10),\n\t\tRxOld.Observable.range(0, 10)).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.concat(\n\t\tRxNew.Observable.range(0, 10),\n    RxNew.Observable.range(0, 10),\n\t\tRxNew.Observable.range(0, 10)).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/concatmap.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.range(0, 25)\n    .concatMap(function (x) {\n      return RxOld.Observable.range(x, 25);\n    }).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.range(0, 25)\n    .concatMap(function (x) {\n      return RxNew.Observable.range(x, 25);\n    }).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/count.js",
    "content": "var RxOld = require('../old/rx.aggregates');\nvar RxNew = require('../../../dist/rx.aggregates');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.range(0, 25).count().subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.range(0, 25).count().subscribe();\n})\n.add('old predicate', function() {\n  RxOld.Observable.range(0, 25).count(function (x) { return x % 2 === 0; }).subscribe();\n})\n.add('new predicate', function() {\n  RxNew.Observable.range(0, 25).count(function (x) { return x % 2 === 0; }).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/defer.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.defer(function () { return RxOld.Observable.range(0, 50); }).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.defer(function () { return RxNew.Observable.range(0, 50); }).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/distinctuntilchanged.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.range(0, 50)\n    .distinctUntilChanged().subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.range(0, 50)\n    .distinctUntilChanged().subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n\nfunction divByTwo(x) { return x / 2 === 0; }\nfunction divByTen(x) { return x / 10 === 0; }\n"
  },
  {
    "path": "tests/perf/operators/empty.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.empty().subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.empty().subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/filter.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old single', function() {\n  RxOld.Observable.range(0, 10)\n    .filter(divByTwo)\n    .filter(divByTen).subscribe();\n})\n.add('new single', function() {\n  RxNew.Observable.range(0, 10)\n    .filter(divByTwo)\n    .filter(divByTen).subscribe();\n})\n.add('old chained', function() {\n  RxOld.Observable.range(0, 10)\n    .filter(divByTwo)\n    .filter(divByTen).subscribe();\n})\n.add('new chained', function() {\n  RxNew.Observable.range(0, 10)\n    .filter(divByTwo)\n    .filter(divByTen).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n\nfunction divByTwo(x) { return x / 2 === 0; }\nfunction divByTen(x) { return x / 10 === 0; }\n"
  },
  {
    "path": "tests/perf/operators/finally.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\nfunction add() { return this.x + this.y; }\nvar thisArg = {\n\tx:42,\n\ty:42\n};\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.range(0, 50)\n  \t.finally(add, thisArg).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.range(0, 50)\n  \t.finally(add, thisArg).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/flatmap.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.range(0, 10)\n    .flatMap(function (x) {\n      return RxOld.Observable.range(x, 10);\n    }).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.range(0, 10)\n    .flatMap(function (x) {\n      return RxNew.Observable.range(x, 10);\n    }).subscribe();\n})\n.add('old__with_intermediate_result', function() {\n  RxOld.Observable.range(0, 10)\n    .flatMap(function(x){\n      return RxOld.Observable.range(x, 10);\n    }, function(x, y, i, i2) { return x + y + i + i2;})\n    .subscribe();\n})\n.add('new_with_intermediate_result', function() {\n  RxNew.Observable.range(0, 10)\n    .flatMap(function(x){\n      return RxNew.Observable.range(x, 10);\n    }, function(x, y, i, i2) { return x + y + i + i2;})\n    .subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/forkjoin.js",
    "content": "var RxOld = require('../old/rx.all');\nvar RxNew = require('../../../dist/rx.all');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.forkJoin(\n    RxOld.Observable.range(0, 10),\n    RxOld.Observable.range(10, 10),\n    RxOld.Observable.range(20, 10),\n    RxOld.Observable.range(30, 10)\n  )\n  .subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.forkJoin(\n    RxNew.Observable.range(0, 10),\n    RxNew.Observable.range(10, 10),\n    RxNew.Observable.range(20, 10),\n    RxNew.Observable.range(30, 10)\n  )\n  .subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/from.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\nvar args = [];\nfor (var i = 0; i < 25; i++) { args.push(i); }\nvar argStr = args.join('');\n\n// add tests\nsuite.add('old array', function() {\n  RxOld.Observable.from(args).subscribe();\n})\n.add('new array', function() {\n  RxNew.Observable.from(args).subscribe();\n})\n.add('old string', function() {\n  RxOld.Observable.from(argStr).subscribe();\n})\n.add('new string', function() {\n  RxNew.Observable.from(argStr).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/fromarray.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../src/modular/.');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\nvar args = [];\nfor (var i = 0; i < 25; i++) { args.push(i); }\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.fromArray(args).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.fromArray(args).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/fromcallback.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\nvar fs = require('fs');\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.fromCallback(fs.exists)(__filename).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.fromCallback(fs.exists)(__filename).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/fromnodecallback.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\nvar fs = require('fs');\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.fromNodeCallback(fs.stat)(__filename).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.fromNodeCallback(fs.stat)(__filename).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/frompromise.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\nfunction MockPromise(value) {\n  this.value = value;\n}\nMockPromise.resolve = function (value) {\n  return new MockPromise(value);\n}\nMockPromise.prototype.then = function (onSuccess) {\n  return MockPromise.resolve(onSuccess(this.value));\n};\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.fromPromise(MockPromise.resolve(42)).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.fromPromise(MockPromise.resolve(42)).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });"
  },
  {
    "path": "tests/perf/operators/ignoreelements.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.range(0, 50)\n  \t.ignoreElements().subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.range(0, 50)\n  \t.ignoreElements().subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/just.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.just(42).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.just(42).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/map.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old single', function() {\n  RxOld.Observable.range(0, 10)\n  .map(double).subscribe();\n})\n.add('new single', function() {\n  RxNew.Observable.range(0, 10)\n  .map(double).subscribe();\n})\n.add('old chained', function() {\n  RxOld.Observable.range(0, 10)\n  .map(square)\n  .map(double).subscribe();\n})\n.add('new chained', function() {\n  RxNew.Observable.range(0, 10)\n  .map(square)\n  .map(double).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n\n\nfunction square(x) { return x * x; }\nfunction double(x) { return x + x; }\n"
  },
  {
    "path": "tests/perf/operators/materialize.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.range(0, 25)\n  .materialize().dematerialize().subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.range(0, 25)\n  .materialize().dematerialize().subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/mergeall.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.range(0, 25)\n    .map(RxOld.Observable.range(0,25)).mergeAll().subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.range(0, 25)\n    .map(RxNew.Observable.range(0,25)).mergeAll().subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/mergeproto.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.range(0, 250)\n    .merge(RxOld.Observable.range(0,250)).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.range(0, 250)\n    .merge(RxNew.Observable.range(0,250)).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/never.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.never().subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.never().subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/of.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\nvar args = [];\nfor (var i = 0; i < 25; i++) { args.push(i); }\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.of.apply(null, args).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.of.apply(null, args).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/pairs.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\nvar obj = {foo: 'foo',bar: 'bar',baz:'baz',quux:'quux'};\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.pairs(obj).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.pairs(obj).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/range.js",
    "content": "var RxOld = require('../../../dist/rx.lite');\nvar RxNew = require('../../../src/modular/.');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.range(0, 25).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.range(0, 25).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/reduce.js",
    "content": "var RxOld = require('../old/rx.aggregates');\nvar RxNew = require('../../../dist/rx.aggregates');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.range(0, 25)\n  .reduce(add, 0)\n  .subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.range(0, 25)\n  .reduce(add, 0)\n  .subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n\nfunction double(x) { return x + x; }\nfunction mod3(x) { return x % 3 === 0; }\nfunction add(x, y) { return x + y; }\n"
  },
  {
    "path": "tests/perf/operators/repeat.js",
    "content": "var RxOld = require('../../../dist/rx.lite');\nvar RxNew = require('../../../src/modular/.');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.repeat(42, 25).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.repeat(42, 25).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/scan.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.range(0, 25)\n  .scan(addX).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.range(0, 25)\n  .scan(addX).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n\nfunction addX(acc, x) { return acc + x; }\n"
  },
  {
    "path": "tests/perf/operators/skip.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.range(0, 50)\n    .skip(25).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.range(0, 50)\n    .skip(25).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/skipuntil.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.range(0, 50)\n  .skipUntil(RxOld.range(0, 25)).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.range(0, 50)\n  .skipUntil(RxOld.range(0, 25)).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/switch.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.range(0, 50)\n    .map(function (x) { return RxOld.Observable.range(x, 50)})\n    .switch()\n    .subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.range(0, 50)\n    .map(function (x) { return RxNew.Observable.range(x, 50)})\n    .switch()\n    .subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/take.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.range(0, 50)\n    .take(25).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.range(0, 50)\n    .take(25).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/takeuntil.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.range(0, 50)\n  .takeUntil(RxOld.range(0, 25)).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.range(0, 50)\n  .takeUntil(RxOld.range(0, 25)).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/throw.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\nfunction noop() { }\nvar error = new Error();\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.throwError(error).subscribe(noop,noop,noop);\n})\n.add('new', function() {\n  RxNew.Observable.throwError(error).subscribe(noop,noop,noop);\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/toarray.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.range(0, 25).toArray().subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.range(0, 25).toArray().subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/withlatestfrom.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.range(0, 10).withLatestFrom(\n    RxOld.Observable.range(0, 10),\n    function (x, y) { return x + y; }\n  ).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.range(0, 10).withLatestFrom(\n    RxNew.Observable.range(0, 10),\n    function (x, y) { return x + y; }\n  ).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/operators/zip.js",
    "content": "var RxOld = require('../old/rx.lite');\nvar RxNew = require('../../../dist/rx.lite');\nvar Benchmark = require('benchmark');\n\nvar suite = new Benchmark.Suite;\n\n// Backfill range to get rid of differences\nRxOld.range = function (start, count) {\n  var scheduler = RxNew.Scheduler.currentThread;\n  return new RxNew.AnonymousObservable(function (observer) {\n    return scheduler.scheduleRecursive(0, function (i, self) {\n      if (i < count) {\n        observer.onNext(start + i);\n        self(i + 1);\n      } else {\n        observer.onCompleted();\n      }\n    });\n  });\n};\nRxNew.range = RxOld.range;\n\n// add tests\nsuite.add('old', function() {\n  RxOld.Observable.zip(\n    RxOld.Observable.range(0, 10),\n    RxOld.Observable.range(0, 10),\n    function (x, y) { return x + y; }\n  ).subscribe();\n})\n.add('new', function() {\n  RxNew.Observable.zip(\n    RxNew.Observable.range(0, 10),\n    RxNew.Observable.range(0, 10),\n    function (x, y) { return x + y; }\n  ).subscribe();\n})\n// add listeners\n.on('cycle', function(event) {\n  console.log(String(event.target));\n})\n.on('complete', function() {\n  console.log('Fastest is ' + this.filter('fastest').pluck('name'));\n})\n// run async\n.run({ 'async': true });\n"
  },
  {
    "path": "tests/perf/vendor/benchmark.js",
    "content": "/*!\n * Benchmark.js v1.0.0 <http://benchmarkjs.com/>\n * Copyright 2010-2012 Mathias Bynens <http://mths.be/>\n * Based on JSLitmus.js, copyright Robert Kieffer <http://broofa.com/>\n * Modified by John-David Dalton <http://allyoucanleet.com/>\n * Available under MIT license <http://mths.be/mit>\n */\n;(function(window, undefined) {\n  'use strict';\n\n  /** Used to assign each benchmark an incrimented id */\n  var counter = 0;\n\n  /** Detect DOM document object */\n  var doc = isHostType(window, 'document') && document;\n\n  /** Detect free variable `define` */\n  var freeDefine = typeof define == 'function' &&\n    typeof define.amd == 'object' && define.amd && define;\n\n  /** Detect free variable `exports` */\n  var freeExports = typeof exports == 'object' && exports &&\n    (typeof global == 'object' && global && global == global.global && (window = global), exports);\n\n  /** Detect free variable `require` */\n  var freeRequire = typeof require == 'function' && require;\n\n  /** Used to crawl all properties regardless of enumerability */\n  var getAllKeys = Object.getOwnPropertyNames;\n\n  /** Used to get property descriptors */\n  var getDescriptor = Object.getOwnPropertyDescriptor;\n\n  /** Used in case an object doesn't have its own method */\n  var hasOwnProperty = {}.hasOwnProperty;\n\n  /** Used to check if an object is extensible */\n  var isExtensible = Object.isExtensible || function() { return true; };\n\n  /** Used to access Wade Simmons' Node microtime module */\n  var microtimeObject = req('microtime');\n\n  /** Used to access the browser's high resolution timer */\n  var perfObject = isHostType(window, 'performance') && performance;\n\n  /** Used to call the browser's high resolution timer */\n  var perfName = perfObject && (\n    perfObject.now && 'now' ||\n    perfObject.webkitNow && 'webkitNow'\n  );\n\n  /** Used to access Node's high resolution timer */\n  var processObject = isHostType(window, 'process') && process;\n\n  /** Used to check if an own property is enumerable */\n  var propertyIsEnumerable = {}.propertyIsEnumerable;\n\n  /** Used to set property descriptors */\n  var setDescriptor = Object.defineProperty;\n\n  /** Used to resolve a value's internal [[Class]] */\n  var toString = {}.toString;\n\n  /** Used to prevent a `removeChild` memory leak in IE < 9 */\n  var trash = doc && doc.createElement('div');\n\n  /** Used to integrity check compiled tests */\n  var uid = 'uid' + (+new Date);\n\n  /** Used to avoid infinite recursion when methods call each other */\n  var calledBy = {};\n\n  /** Used to avoid hz of Infinity */\n  var divisors = {\n    '1': 4096,\n    '2': 512,\n    '3': 64,\n    '4': 8,\n    '5': 0\n  };\n\n  /**\n   * T-Distribution two-tailed critical values for 95% confidence\n   * http://www.itl.nist.gov/div898/handbook/eda/section3/eda3672.htm\n   */\n  var tTable = {\n    '1':  12.706,'2':  4.303, '3':  3.182, '4':  2.776, '5':  2.571, '6':  2.447,\n    '7':  2.365, '8':  2.306, '9':  2.262, '10': 2.228, '11': 2.201, '12': 2.179,\n    '13': 2.16,  '14': 2.145, '15': 2.131, '16': 2.12,  '17': 2.11,  '18': 2.101,\n    '19': 2.093, '20': 2.086, '21': 2.08,  '22': 2.074, '23': 2.069, '24': 2.064,\n    '25': 2.06,  '26': 2.056, '27': 2.052, '28': 2.048, '29': 2.045, '30': 2.042,\n    'infinity': 1.96\n  };\n\n  /**\n   * Critical Mann-Whitney U-values for 95% confidence\n   * http://www.saburchill.com/IBbiology/stats/003.html\n   */\n  var uTable = {\n    '5':  [0, 1, 2],\n    '6':  [1, 2, 3, 5],\n    '7':  [1, 3, 5, 6, 8],\n    '8':  [2, 4, 6, 8, 10, 13],\n    '9':  [2, 4, 7, 10, 12, 15, 17],\n    '10': [3, 5, 8, 11, 14, 17, 20, 23],\n    '11': [3, 6, 9, 13, 16, 19, 23, 26, 30],\n    '12': [4, 7, 11, 14, 18, 22, 26, 29, 33, 37],\n    '13': [4, 8, 12, 16, 20, 24, 28, 33, 37, 41, 45],\n    '14': [5, 9, 13, 17, 22, 26, 31, 36, 40, 45, 50, 55],\n    '15': [5, 10, 14, 19, 24, 29, 34, 39, 44, 49, 54, 59, 64],\n    '16': [6, 11, 15, 21, 26, 31, 37, 42, 47, 53, 59, 64, 70, 75],\n    '17': [6, 11, 17, 22, 28, 34, 39, 45, 51, 57, 63, 67, 75, 81, 87],\n    '18': [7, 12, 18, 24, 30, 36, 42, 48, 55, 61, 67, 74, 80, 86, 93, 99],\n    '19': [7, 13, 19, 25, 32, 38, 45, 52, 58, 65, 72, 78, 85, 92, 99, 106, 113],\n    '20': [8, 14, 20, 27, 34, 41, 48, 55, 62, 69, 76, 83, 90, 98, 105, 112, 119, 127],\n    '21': [8, 15, 22, 29, 36, 43, 50, 58, 65, 73, 80, 88, 96, 103, 111, 119, 126, 134, 142],\n    '22': [9, 16, 23, 30, 38, 45, 53, 61, 69, 77, 85, 93, 101, 109, 117, 125, 133, 141, 150, 158],\n    '23': [9, 17, 24, 32, 40, 48, 56, 64, 73, 81, 89, 98, 106, 115, 123, 132, 140, 149, 157, 166, 175],\n    '24': [10, 17, 25, 33, 42, 50, 59, 67, 76, 85, 94, 102, 111, 120, 129, 138, 147, 156, 165, 174, 183, 192],\n    '25': [10, 18, 27, 35, 44, 53, 62, 71, 80, 89, 98, 107, 117, 126, 135, 145, 154, 163, 173, 182, 192, 201, 211],\n    '26': [11, 19, 28, 37, 46, 55, 64, 74, 83, 93, 102, 112, 122, 132, 141, 151, 161, 171, 181, 191, 200, 210, 220, 230],\n    '27': [11, 20, 29, 38, 48, 57, 67, 77, 87, 97, 107, 118, 125, 138, 147, 158, 168, 178, 188, 199, 209, 219, 230, 240, 250],\n    '28': [12, 21, 30, 40, 50, 60, 70, 80, 90, 101, 111, 122, 132, 143, 154, 164, 175, 186, 196, 207, 218, 228, 239, 250, 261, 272],\n    '29': [13, 22, 32, 42, 52, 62, 73, 83, 94, 105, 116, 127, 138, 149, 160, 171, 182, 193, 204, 215, 226, 238, 249, 260, 271, 282, 294],\n    '30': [13, 23, 33, 43, 54, 65, 76, 87, 98, 109, 120, 131, 143, 154, 166, 177, 189, 200, 212, 223, 235, 247, 258, 270, 282, 293, 305, 317]\n  };\n\n  /**\n   * An object used to flag environments/features.\n   *\n   * @static\n   * @memberOf Benchmark\n   * @type Object\n   */\n  var support = {};\n\n  (function() {\n\n    /**\n     * Detect Adobe AIR.\n     *\n     * @memberOf Benchmark.support\n     * @type Boolean\n     */\n    support.air = isClassOf(window.runtime, 'ScriptBridgingProxyObject');\n\n    /**\n     * Detect if `arguments` objects have the correct internal [[Class]] value.\n     *\n     * @memberOf Benchmark.support\n     * @type Boolean\n     */\n    support.argumentsClass = isClassOf(arguments, 'Arguments');\n\n    /**\n     * Detect if in a browser environment.\n     *\n     * @memberOf Benchmark.support\n     * @type Boolean\n     */\n    support.browser = doc && isHostType(window, 'navigator');\n\n    /**\n     * Detect if strings support accessing characters by index.\n     *\n     * @memberOf Benchmark.support\n     * @type Boolean\n     */\n    support.charByIndex =\n      // IE 8 supports indexes on string literals but not string objects\n      ('x'[0] + Object('x')[0]) == 'xx';\n\n    /**\n     * Detect if strings have indexes as own properties.\n     *\n     * @memberOf Benchmark.support\n     * @type Boolean\n     */\n    support.charByOwnIndex =\n      // Narwhal, Rhino, RingoJS, IE 8, and Opera < 10.52 support indexes on\n      // strings but don't detect them as own properties\n      support.charByIndex && hasKey('x', '0');\n\n    /**\n     * Detect if Java is enabled/exposed.\n     *\n     * @memberOf Benchmark.support\n     * @type Boolean\n     */\n    support.java = isClassOf(window.java, 'JavaPackage');\n\n    /**\n     * Detect if the Timers API exists.\n     *\n     * @memberOf Benchmark.support\n     * @type Boolean\n     */\n    support.timeout = isHostType(window, 'setTimeout') && isHostType(window, 'clearTimeout');\n\n    /**\n     * Detect if functions support decompilation.\n     *\n     * @name decompilation\n     * @memberOf Benchmark.support\n     * @type Boolean\n     */\n    try {\n      // Safari 2.x removes commas in object literals\n      // from Function#toString results\n      // http://webk.it/11609\n      // Firefox 3.6 and Opera 9.25 strip grouping\n      // parentheses from Function#toString results\n      // http://bugzil.la/559438\n      support.decompilation = Function(\n        'return (' + (function(x) { return { 'x': '' + (1 + x) + '', 'y': 0 }; }) + ')'\n      )()(0).x === '1';\n    } catch(e) {\n      support.decompilation = false;\n    }\n\n    /**\n     * Detect ES5+ property descriptor API.\n     *\n     * @name descriptors\n     * @memberOf Benchmark.support\n     * @type Boolean\n     */\n    try {\n      var o = {};\n      support.descriptors = (setDescriptor(o, o, o), 'value' in getDescriptor(o, o));\n    } catch(e) {\n      support.descriptors = false;\n    }\n\n    /**\n     * Detect ES5+ Object.getOwnPropertyNames().\n     *\n     * @name getAllKeys\n     * @memberOf Benchmark.support\n     * @type Boolean\n     */\n    try {\n      support.getAllKeys = /\\bvalueOf\\b/.test(getAllKeys(Object.prototype));\n    } catch(e) {\n      support.getAllKeys = false;\n    }\n\n    /**\n     * Detect if own properties are iterated before inherited properties (all but IE < 9).\n     *\n     * @name iteratesOwnLast\n     * @memberOf Benchmark.support\n     * @type Boolean\n     */\n    support.iteratesOwnFirst = (function() {\n      var props = [];\n      function ctor() { this.x = 1; }\n      ctor.prototype = { 'y': 1 };\n      for (var prop in new ctor) { props.push(prop); }\n      return props[0] == 'x';\n    }());\n\n    /**\n     * Detect if a node's [[Class]] is resolvable (all but IE < 9)\n     * and that the JS engine errors when attempting to coerce an object to a\n     * string without a `toString` property value of `typeof` \"function\".\n     *\n     * @name nodeClass\n     * @memberOf Benchmark.support\n     * @type Boolean\n     */\n    try {\n      support.nodeClass = ({ 'toString': 0 } + '', toString.call(doc || 0) != '[object Object]');\n    } catch(e) {\n      support.nodeClass = true;\n    }\n  }());\n\n  /**\n   * Timer object used by `clock()` and `Deferred#resolve`.\n   *\n   * @private\n   * @type Object\n   */\n  var timer = {\n\n   /**\n    * The timer namespace object or constructor.\n    *\n    * @private\n    * @memberOf timer\n    * @type Function|Object\n    */\n    'ns': Date,\n\n   /**\n    * Starts the deferred timer.\n    *\n    * @private\n    * @memberOf timer\n    * @param {Object} deferred The deferred instance.\n    */\n    'start': null, // lazy defined in `clock()`\n\n   /**\n    * Stops the deferred timer.\n    *\n    * @private\n    * @memberOf timer\n    * @param {Object} deferred The deferred instance.\n    */\n    'stop': null // lazy defined in `clock()`\n  };\n\n  /** Shortcut for inverse results */\n  var noArgumentsClass = !support.argumentsClass,\n      noCharByIndex = !support.charByIndex,\n      noCharByOwnIndex = !support.charByOwnIndex;\n\n  /** Math shortcuts */\n  var abs   = Math.abs,\n      floor = Math.floor,\n      max   = Math.max,\n      min   = Math.min,\n      pow   = Math.pow,\n      sqrt  = Math.sqrt;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * The Benchmark constructor.\n   *\n   * @constructor\n   * @param {String} name A name to identify the benchmark.\n   * @param {Function|String} fn The test to benchmark.\n   * @param {Object} [options={}] Options object.\n   * @example\n   *\n   * // basic usage (the `new` operator is optional)\n   * var bench = new Benchmark(fn);\n   *\n   * // or using a name first\n   * var bench = new Benchmark('foo', fn);\n   *\n   * // or with options\n   * var bench = new Benchmark('foo', fn, {\n   *\n   *   // displayed by Benchmark#toString if `name` is not available\n   *   'id': 'xyz',\n   *\n   *   // called when the benchmark starts running\n   *   'onStart': onStart,\n   *\n   *   // called after each run cycle\n   *   'onCycle': onCycle,\n   *\n   *   // called when aborted\n   *   'onAbort': onAbort,\n   *\n   *   // called when a test errors\n   *   'onError': onError,\n   *\n   *   // called when reset\n   *   'onReset': onReset,\n   *\n   *   // called when the benchmark completes running\n   *   'onComplete': onComplete,\n   *\n   *   // compiled/called before the test loop\n   *   'setup': setup,\n   *\n   *   // compiled/called after the test loop\n   *   'teardown': teardown\n   * });\n   *\n   * // or name and options\n   * var bench = new Benchmark('foo', {\n   *\n   *   // a flag to indicate the benchmark is deferred\n   *   'defer': true,\n   *\n   *   // benchmark test function\n   *   'fn': function(deferred) {\n   *     // call resolve() when the deferred test is finished\n   *     deferred.resolve();\n   *   }\n   * });\n   *\n   * // or options only\n   * var bench = new Benchmark({\n   *\n   *   // benchmark name\n   *   'name': 'foo',\n   *\n   *   // benchmark test as a string\n   *   'fn': '[1,2,3,4].sort()'\n   * });\n   *\n   * // a test's `this` binding is set to the benchmark instance\n   * var bench = new Benchmark('foo', function() {\n   *   'My name is '.concat(this.name); // My name is foo\n   * });\n   */\n  function Benchmark(name, fn, options) {\n    var me = this;\n\n    // allow instance creation without the `new` operator\n    if (me == null || me.constructor != Benchmark) {\n      return new Benchmark(name, fn, options);\n    }\n    // juggle arguments\n    if (isClassOf(name, 'Object')) {\n      // 1 argument (options)\n      options = name;\n    }\n    else if (isClassOf(name, 'Function')) {\n      // 2 arguments (fn, options)\n      options = fn;\n      fn = name;\n    }\n    else if (isClassOf(fn, 'Object')) {\n      // 2 arguments (name, options)\n      options = fn;\n      fn = null;\n      me.name = name;\n    }\n    else {\n      // 3 arguments (name, fn [, options])\n      me.name = name;\n    }\n    setOptions(me, options);\n    me.id || (me.id = ++counter);\n    me.fn == null && (me.fn = fn);\n    me.stats = deepClone(me.stats);\n    me.times = deepClone(me.times);\n  }\n\n  /**\n   * The Deferred constructor.\n   *\n   * @constructor\n   * @memberOf Benchmark\n   * @param {Object} clone The cloned benchmark instance.\n   */\n  function Deferred(clone) {\n    var me = this;\n    if (me == null || me.constructor != Deferred) {\n      return new Deferred(clone);\n    }\n    me.benchmark = clone;\n    clock(me);\n  }\n\n  /**\n   * The Event constructor.\n   *\n   * @constructor\n   * @memberOf Benchmark\n   * @param {String|Object} type The event type.\n   */\n  function Event(type) {\n    var me = this;\n    return (me == null || me.constructor != Event)\n      ? new Event(type)\n      : (type instanceof Event)\n          ? type\n          : extend(me, { 'timeStamp': +new Date }, typeof type == 'string' ? { 'type': type } : type);\n  }\n\n  /**\n   * The Suite constructor.\n   *\n   * @constructor\n   * @memberOf Benchmark\n   * @param {String} name A name to identify the suite.\n   * @param {Object} [options={}] Options object.\n   * @example\n   *\n   * // basic usage (the `new` operator is optional)\n   * var suite = new Benchmark.Suite;\n   *\n   * // or using a name first\n   * var suite = new Benchmark.Suite('foo');\n   *\n   * // or with options\n   * var suite = new Benchmark.Suite('foo', {\n   *\n   *   // called when the suite starts running\n   *   'onStart': onStart,\n   *\n   *   // called between running benchmarks\n   *   'onCycle': onCycle,\n   *\n   *   // called when aborted\n   *   'onAbort': onAbort,\n   *\n   *   // called when a test errors\n   *   'onError': onError,\n   *\n   *   // called when reset\n   *   'onReset': onReset,\n   *\n   *   // called when the suite completes running\n   *   'onComplete': onComplete\n   * });\n   */\n  function Suite(name, options) {\n    var me = this;\n\n    // allow instance creation without the `new` operator\n    if (me == null || me.constructor != Suite) {\n      return new Suite(name, options);\n    }\n    // juggle arguments\n    if (isClassOf(name, 'Object')) {\n      // 1 argument (options)\n      options = name;\n    } else {\n      // 2 arguments (name [, options])\n      me.name = name;\n    }\n    setOptions(me, options);\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Note: Some array methods have been implemented in plain JavaScript to avoid\n   * bugs in IE, Opera, Rhino, and Mobile Safari.\n   *\n   * IE compatibility mode and IE < 9 have buggy Array `shift()` and `splice()`\n   * functions that fail to remove the last element, `object[0]`, of\n   * array-like-objects even though the `length` property is set to `0`.\n   * The `shift()` method is buggy in IE 8 compatibility mode, while `splice()`\n   * is buggy regardless of mode in IE < 9 and buggy in compatibility mode in IE 9.\n   *\n   * In Opera < 9.50 and some older/beta Mobile Safari versions using `unshift()`\n   * generically to augment the `arguments` object will pave the value at index 0\n   * without incrimenting the other values's indexes.\n   * https://github.com/documentcloud/underscore/issues/9\n   *\n   * Rhino and environments it powers, like Narwhal and RingoJS, may have\n   * buggy Array `concat()`, `reverse()`, `shift()`, `slice()`, `splice()` and\n   * `unshift()` functions that make sparse arrays non-sparse by assigning the\n   * undefined indexes a value of undefined.\n   * https://github.com/mozilla/rhino/commit/702abfed3f8ca043b2636efd31c14ba7552603dd\n   */\n\n  /**\n   * Creates an array containing the elements of the host array followed by the\n   * elements of each argument in order.\n   *\n   * @memberOf Benchmark.Suite\n   * @returns {Array} The new array.\n   */\n  function concat() {\n    var value,\n        j = -1,\n        length = arguments.length,\n        result = slice.call(this),\n        index = result.length;\n\n    while (++j < length) {\n      value = arguments[j];\n      if (isClassOf(value, 'Array')) {\n        for (var k = 0, l = value.length; k < l; k++, index++) {\n          if (k in value) {\n            result[index] = value[k];\n          }\n        }\n      } else {\n        result[index++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Utility function used by `shift()`, `splice()`, and `unshift()`.\n   *\n   * @private\n   * @param {Number} start The index to start inserting elements.\n   * @param {Number} deleteCount The number of elements to delete from the insert point.\n   * @param {Array} elements The elements to insert.\n   * @returns {Array} An array of deleted elements.\n   */\n  function insert(start, deleteCount, elements) {\n    // `result` should have its length set to the `deleteCount`\n    // see https://bugs.ecmascript.org/show_bug.cgi?id=332\n    var deleteEnd = start + deleteCount,\n        elementCount = elements ? elements.length : 0,\n        index = start - 1,\n        length = start + elementCount,\n        object = this,\n        result = Array(deleteCount),\n        tail = slice.call(object, deleteEnd);\n\n    // delete elements from the array\n    while (++index < deleteEnd) {\n      if (index in object) {\n        result[index - start] = object[index];\n        delete object[index];\n      }\n    }\n    // insert elements\n    index = start - 1;\n    while (++index < length) {\n      object[index] = elements[index - start];\n    }\n    // append tail elements\n    start = index--;\n    length = max(0, (object.length >>> 0) - deleteCount + elementCount);\n    while (++index < length) {\n      if ((index - start) in tail) {\n        object[index] = tail[index - start];\n      } else if (index in object) {\n        delete object[index];\n      }\n    }\n    // delete excess elements\n    deleteCount = deleteCount > elementCount ? deleteCount - elementCount : 0;\n    while (deleteCount--) {\n      index = length + deleteCount;\n      if (index in object) {\n        delete object[index];\n      }\n    }\n    object.length = length;\n    return result;\n  }\n\n  /**\n   * Rearrange the host array's elements in reverse order.\n   *\n   * @memberOf Benchmark.Suite\n   * @returns {Array} The reversed array.\n   */\n  function reverse() {\n    var upperIndex,\n        value,\n        index = -1,\n        object = Object(this),\n        length = object.length >>> 0,\n        middle = floor(length / 2);\n\n    if (length > 1) {\n      while (++index < middle) {\n        upperIndex = length - index - 1;\n        value = upperIndex in object ? object[upperIndex] : uid;\n        if (index in object) {\n          object[upperIndex] = object[index];\n        } else {\n          delete object[upperIndex];\n        }\n        if (value != uid) {\n          object[index] = value;\n        } else {\n          delete object[index];\n        }\n      }\n    }\n    return object;\n  }\n\n  /**\n   * Removes the first element of the host array and returns it.\n   *\n   * @memberOf Benchmark.Suite\n   * @returns {Mixed} The first element of the array.\n   */\n  function shift() {\n    return insert.call(this, 0, 1)[0];\n  }\n\n  /**\n   * Creates an array of the host array's elements from the start index up to,\n   * but not including, the end index.\n   *\n   * @memberOf Benchmark.Suite\n   * @param {Number} start The starting index.\n   * @param {Number} end The end index.\n   * @returns {Array} The new array.\n   */\n  function slice(start, end) {\n    var index = -1,\n        object = Object(this),\n        length = object.length >>> 0,\n        result = [];\n\n    start = toInteger(start);\n    start = start < 0 ? max(length + start, 0) : min(start, length);\n    start--;\n    end = end == null ? length : toInteger(end);\n    end = end < 0 ? max(length + end, 0) : min(end, length);\n\n    while ((++index, ++start) < end) {\n      if (start in object) {\n        result[index] = object[start];\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Allows removing a range of elements and/or inserting elements into the\n   * host array.\n   *\n   * @memberOf Benchmark.Suite\n   * @param {Number} start The start index.\n   * @param {Number} deleteCount The number of elements to delete.\n   * @param {Mixed} [val1, val2, ...] values to insert at the `start` index.\n   * @returns {Array} An array of removed elements.\n   */\n  function splice(start, deleteCount) {\n    var object = Object(this),\n        length = object.length >>> 0;\n\n    start = toInteger(start);\n    start = start < 0 ? max(length + start, 0) : min(start, length);\n\n    // support the de-facto SpiderMonkey extension\n    // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/splice#Parameters\n    // https://bugs.ecmascript.org/show_bug.cgi?id=429\n    deleteCount = arguments.length == 1\n      ? length - start\n      : min(max(toInteger(deleteCount), 0), length - start);\n\n    return insert.call(object, start, deleteCount, slice.call(arguments, 2));\n  }\n\n  /**\n   * Converts the specified `value` to an integer.\n   *\n   * @private\n   * @param {Mixed} value The value to convert.\n   * @returns {Number} The resulting integer.\n   */\n  function toInteger(value) {\n    value = +value;\n    return value === 0 || !isFinite(value) ? value || 0 : value - (value % 1);\n  }\n\n  /**\n   * Appends arguments to the host array.\n   *\n   * @memberOf Benchmark.Suite\n   * @returns {Number} The new length.\n   */\n  function unshift() {\n    var object = Object(this);\n    insert.call(object, 0, 0, arguments);\n    return object.length;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A generic `Function#bind` like method.\n   *\n   * @private\n   * @param {Function} fn The function to be bound to `thisArg`.\n   * @param {Mixed} thisArg The `this` binding for the given function.\n   * @returns {Function} The bound function.\n   */\n  function bind(fn, thisArg) {\n    return function() { fn.apply(thisArg, arguments); };\n  }\n\n  /**\n   * Creates a function from the given arguments string and body.\n   *\n   * @private\n   * @param {String} args The comma separated function arguments.\n   * @param {String} body The function body.\n   * @returns {Function} The new function.\n   */\n  function createFunction() {\n    // lazy define\n    createFunction = function(args, body) {\n      var result,\n          anchor = freeDefine ? define.amd : Benchmark,\n          prop = uid + 'createFunction';\n\n      runScript((freeDefine ? 'define.amd.' : 'Benchmark.') + prop + '=function(' + args + '){' + body + '}');\n      result = anchor[prop];\n      delete anchor[prop];\n      return result;\n    };\n    // fix JaegerMonkey bug\n    // http://bugzil.la/639720\n    createFunction = support.browser && (createFunction('', 'return\"' + uid + '\"') || noop)() == uid ? createFunction : Function;\n    return createFunction.apply(null, arguments);\n  }\n\n  /**\n   * Delay the execution of a function based on the benchmark's `delay` property.\n   *\n   * @private\n   * @param {Object} bench The benchmark instance.\n   * @param {Object} fn The function to execute.\n   */\n  function delay(bench, fn) {\n    bench._timerId = setTimeout(fn, bench.delay * 1e3);\n  }\n\n  /**\n   * Destroys the given element.\n   *\n   * @private\n   * @param {Element} element The element to destroy.\n   */\n  function destroyElement(element) {\n    trash.appendChild(element);\n    trash.innerHTML = '';\n  }\n\n  /**\n   * Iterates over an object's properties, executing the `callback` for each.\n   * Callbacks may terminate the loop by explicitly returning `false`.\n   *\n   * @private\n   * @param {Object} object The object to iterate over.\n   * @param {Function} callback The function executed per own property.\n   * @param {Object} options The options object.\n   * @returns {Object} Returns the object iterated over.\n   */\n  function forProps() {\n    var forShadowed,\n        skipSeen,\n        forArgs = true,\n        shadowed = ['constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'valueOf'];\n\n    (function(enumFlag, key) {\n      // must use a non-native constructor to catch the Safari 2 issue\n      function Klass() { this.valueOf = 0; };\n      Klass.prototype.valueOf = 0;\n      // check various for-in bugs\n      for (key in new Klass) {\n        enumFlag += key == 'valueOf' ? 1 : 0;\n      }\n      // check if `arguments` objects have non-enumerable indexes\n      for (key in arguments) {\n        key == '0' && (forArgs = false);\n      }\n      // Safari 2 iterates over shadowed properties twice\n      // http://replay.waybackmachine.org/20090428222941/http://tobielangel.com/2007/1/29/for-in-loop-broken-in-safari/\n      skipSeen = enumFlag == 2;\n      // IE < 9 incorrectly makes an object's properties non-enumerable if they have\n      // the same name as other non-enumerable properties in its prototype chain.\n      forShadowed = !enumFlag;\n    }(0));\n\n    // lazy define\n    forProps = function(object, callback, options) {\n      options || (options = {});\n\n      var result = object;\n      object = Object(object);\n\n      var ctor,\n          key,\n          keys,\n          skipCtor,\n          done = !result,\n          which = options.which,\n          allFlag = which == 'all',\n          index = -1,\n          iteratee = object,\n          length = object.length,\n          ownFlag = allFlag || which == 'own',\n          seen = {},\n          skipProto = isClassOf(object, 'Function'),\n          thisArg = options.bind;\n\n      if (thisArg !== undefined) {\n        callback = bind(callback, thisArg);\n      }\n      // iterate all properties\n      if (allFlag && support.getAllKeys) {\n        for (index = 0, keys = getAllKeys(object), length = keys.length; index < length; index++) {\n          key = keys[index];\n          if (callback(object[key], key, object) === false) {\n            break;\n          }\n        }\n      }\n      // else iterate only enumerable properties\n      else {\n        for (key in object) {\n          // Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1\n          // (if the prototype or a property on the prototype has been set)\n          // incorrectly set a function's `prototype` property [[Enumerable]] value\n          // to `true`. Because of this we standardize on skipping the `prototype`\n          // property of functions regardless of their [[Enumerable]] value.\n          if ((done =\n              !(skipProto && key == 'prototype') &&\n              !(skipSeen && (hasKey(seen, key) || !(seen[key] = true))) &&\n              (!ownFlag || ownFlag && hasKey(object, key)) &&\n              callback(object[key], key, object) === false)) {\n            break;\n          }\n        }\n        // in IE < 9 strings don't support accessing characters by index\n        if (!done && (forArgs && isArguments(object) ||\n            ((noCharByIndex || noCharByOwnIndex) && isClassOf(object, 'String') &&\n              (iteratee = noCharByIndex ? object.split('') : object)))) {\n          while (++index < length) {\n            if ((done =\n                callback(iteratee[index], String(index), object) === false)) {\n              break;\n            }\n          }\n        }\n        if (!done && forShadowed) {\n          // Because IE < 9 can't set the `[[Enumerable]]` attribute of an existing\n          // property and the `constructor` property of a prototype defaults to\n          // non-enumerable, we manually skip the `constructor` property when we\n          // think we are iterating over a `prototype` object.\n          ctor = object.constructor;\n          skipCtor = ctor && ctor.prototype && ctor.prototype.constructor === ctor;\n          for (index = 0; index < 7; index++) {\n            key = shadowed[index];\n            if (!(skipCtor && key == 'constructor') &&\n                hasKey(object, key) &&\n                callback(object[key], key, object) === false) {\n              break;\n            }\n          }\n        }\n      }\n      return result;\n    };\n    return forProps.apply(null, arguments);\n  }\n\n  /**\n   * Gets the name of the first argument from a function's source.\n   *\n   * @private\n   * @param {Function} fn The function.\n   * @returns {String} The argument name.\n   */\n  function getFirstArgument(fn) {\n    return (!hasKey(fn, 'toString') &&\n      (/^[\\s(]*function[^(]*\\(([^\\s,)]+)/.exec(fn) || 0)[1]) || '';\n  }\n\n  /**\n   * Computes the arithmetic mean of a sample.\n   *\n   * @private\n   * @param {Array} sample The sample.\n   * @returns {Number} The mean.\n   */\n  function getMean(sample) {\n    return reduce(sample, function(sum, x) {\n      return sum + x;\n    }) / sample.length || 0;\n  }\n\n  /**\n   * Gets the source code of a function.\n   *\n   * @private\n   * @param {Function} fn The function.\n   * @param {String} altSource A string used when a function's source code is unretrievable.\n   * @returns {String} The function's source code.\n   */\n  function getSource(fn, altSource) {\n    var result = altSource;\n    if (isStringable(fn)) {\n      result = String(fn);\n    } else if (support.decompilation) {\n      // escape the `{` for Firefox 1\n      result = (/^[^{]+\\{([\\s\\S]*)}\\s*$/.exec(fn) || 0)[1];\n    }\n    // trim string\n    result = (result || '').replace(/^\\s+|\\s+$/g, '');\n\n    // detect strings containing only the \"use strict\" directive\n    return /^(?:\\/\\*+[\\w|\\W]*?\\*\\/|\\/\\/.*?[\\n\\r\\u2028\\u2029]|\\s)*([\"'])use strict\\1;?$/.test(result)\n      ? ''\n      : result;\n  }\n\n  /**\n   * Checks if a value is an `arguments` object.\n   *\n   * @private\n   * @param {Mixed} value The value to check.\n   * @returns {Boolean} Returns `true` if the value is an `arguments` object, else `false`.\n   */\n  function isArguments() {\n    // lazy define\n    isArguments = function(value) {\n      return toString.call(value) == '[object Arguments]';\n    };\n    if (noArgumentsClass) {\n      isArguments = function(value) {\n        return hasKey(value, 'callee') &&\n          !(propertyIsEnumerable && propertyIsEnumerable.call(value, 'callee'));\n      };\n    }\n    return isArguments(arguments[0]);\n  }\n\n  /**\n   * Checks if an object is of the specified class.\n   *\n   * @private\n   * @param {Mixed} value The value to check.\n   * @param {String} name The name of the class.\n   * @returns {Boolean} Returns `true` if the value is of the specified class, else `false`.\n   */\n  function isClassOf(value, name) {\n    return value != null && toString.call(value) == '[object ' + name + ']';\n  }\n\n  /**\n   * Host objects can return type values that are different from their actual\n   * data type. The objects we are concerned with usually return non-primitive\n   * types of object, function, or unknown.\n   *\n   * @private\n   * @param {Mixed} object The owner of the property.\n   * @param {String} property The property to check.\n   * @returns {Boolean} Returns `true` if the property value is a non-primitive, else `false`.\n   */\n  function isHostType(object, property) {\n    var type = object != null ? typeof object[property] : 'number';\n    return !/^(?:boolean|number|string|undefined)$/.test(type) &&\n      (type == 'object' ? !!object[property] : true);\n  }\n\n  /**\n   * Checks if a given `value` is an object created by the `Object` constructor\n   * assuming objects created by the `Object` constructor have no inherited\n   * enumerable properties and that there are no `Object.prototype` extensions.\n   *\n   * @private\n   * @param {Mixed} value The value to check.\n   * @returns {Boolean} Returns `true` if the `value` is a plain `Object` object, else `false`.\n   */\n  function isPlainObject(value) {\n    // avoid non-objects and false positives for `arguments` objects in IE < 9\n    var result = false;\n    if (!(value && typeof value == 'object') || isArguments(value)) {\n      return result;\n    }\n    // IE < 9 presents DOM nodes as `Object` objects except they have `toString`\n    // methods that are `typeof` \"string\" and still can coerce nodes to strings.\n    // Also check that the constructor is `Object` (i.e. `Object instanceof Object`)\n    var ctor = value.constructor;\n    if ((support.nodeClass || !(typeof value.toString != 'function' && typeof (value + '') == 'string')) &&\n        (!isClassOf(ctor, 'Function') || ctor instanceof ctor)) {\n      // In most environments an object's own properties are iterated before\n      // its inherited properties. If the last iterated property is an object's\n      // own property then there are no inherited enumerable properties.\n      if (support.iteratesOwnFirst) {\n        forProps(value, function(subValue, subKey) {\n          result = subKey;\n        });\n        return result === false || hasKey(value, result);\n      }\n      // IE < 9 iterates inherited properties before own properties. If the first\n      // iterated property is an object's own property then there are no inherited\n      // enumerable properties.\n      forProps(value, function(subValue, subKey) {\n        result = !hasKey(value, subKey);\n        return false;\n      });\n      return result === false;\n    }\n    return result;\n  }\n\n  /**\n   * Checks if a value can be safely coerced to a string.\n   *\n   * @private\n   * @param {Mixed} value The value to check.\n   * @returns {Boolean} Returns `true` if the value can be coerced, else `false`.\n   */\n  function isStringable(value) {\n    return hasKey(value, 'toString') || isClassOf(value, 'String');\n  }\n\n  /**\n   * Wraps a function and passes `this` to the original function as the\n   * first argument.\n   *\n   * @private\n   * @param {Function} fn The function to be wrapped.\n   * @returns {Function} The new function.\n   */\n  function methodize(fn) {\n    return function() {\n      var args = [this];\n      args.push.apply(args, arguments);\n      return fn.apply(null, args);\n    };\n  }\n\n  /**\n   * A no-operation function.\n   *\n   * @private\n   */\n  function noop() {\n    // no operation performed\n  }\n\n  /**\n   * A wrapper around require() to suppress `module missing` errors.\n   *\n   * @private\n   * @param {String} id The module id.\n   * @returns {Mixed} The exported module or `null`.\n   */\n  function req(id) {\n    try {\n      var result = freeExports && freeRequire(id);\n    } catch(e) { }\n    return result || null;\n  }\n\n  /**\n   * Runs a snippet of JavaScript via script injection.\n   *\n   * @private\n   * @param {String} code The code to run.\n   */\n  function runScript(code) {\n    var anchor = freeDefine ? define.amd : Benchmark,\n        script = doc.createElement('script'),\n        sibling = doc.getElementsByTagName('script')[0],\n        parent = sibling.parentNode,\n        prop = uid + 'runScript',\n        prefix = '(' + (freeDefine ? 'define.amd.' : 'Benchmark.') + prop + '||function(){})();';\n\n    // Firefox 2.0.0.2 cannot use script injection as intended because it executes\n    // asynchronously, but that's OK because script injection is only used to avoid\n    // the previously commented JaegerMonkey bug.\n    try {\n      // remove the inserted script *before* running the code to avoid differences\n      // in the expected script element count/order of the document.\n      script.appendChild(doc.createTextNode(prefix + code));\n      anchor[prop] = function() { destroyElement(script); };\n    } catch(e) {\n      parent = parent.cloneNode(false);\n      sibling = null;\n      script.text = code;\n    }\n    parent.insertBefore(script, sibling);\n    delete anchor[prop];\n  }\n\n  /**\n   * A helper function for setting options/event handlers.\n   *\n   * @private\n   * @param {Object} bench The benchmark instance.\n   * @param {Object} [options={}] Options object.\n   */\n  function setOptions(bench, options) {\n    options = extend({}, bench.constructor.options, options);\n    bench.options = forOwn(options, function(value, key) {\n      if (value != null) {\n        // add event listeners\n        if (/^on[A-Z]/.test(key)) {\n          forEach(key.split(' '), function(key) {\n            bench.on(key.slice(2).toLowerCase(), value);\n          });\n        } else if (!hasKey(bench, key)) {\n          bench[key] = deepClone(value);\n        }\n      }\n    });\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Handles cycling/completing the deferred benchmark.\n   *\n   * @memberOf Benchmark.Deferred\n   */\n  function resolve() {\n    var me = this,\n        clone = me.benchmark,\n        bench = clone._original;\n\n    if (bench.aborted) {\n      // cycle() -> clone cycle/complete event -> compute()'s invoked bench.run() cycle/complete\n      me.teardown();\n      clone.running = false;\n      cycle(me);\n    }\n    else if (++me.cycles < clone.count) {\n      // continue the test loop\n      if (support.timeout) {\n        // use setTimeout to avoid a call stack overflow if called recursively\n        setTimeout(function() { clone.compiled.call(me, timer); }, 0);\n      } else {\n        clone.compiled.call(me, timer);\n      }\n    }\n    else {\n      timer.stop(me);\n      me.teardown();\n      delay(clone, function() { cycle(me); });\n    }\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A deep clone utility.\n   *\n   * @static\n   * @memberOf Benchmark\n   * @param {Mixed} value The value to clone.\n   * @returns {Mixed} The cloned value.\n   */\n  function deepClone(value) {\n    var accessor,\n        circular,\n        clone,\n        ctor,\n        descriptor,\n        extensible,\n        key,\n        length,\n        markerKey,\n        parent,\n        result,\n        source,\n        subIndex,\n        data = { 'value': value },\n        index = 0,\n        marked = [],\n        queue = { 'length': 0 },\n        unmarked = [];\n\n    /**\n     * An easily detectable decorator for cloned values.\n     */\n    function Marker(object) {\n      this.raw = object;\n    }\n\n    /**\n     * The callback used by `forProps()`.\n     */\n    function forPropsCallback(subValue, subKey) {\n      // exit early to avoid cloning the marker\n      if (subValue && subValue.constructor == Marker) {\n        return;\n      }\n      // add objects to the queue\n      if (subValue === Object(subValue)) {\n        queue[queue.length++] = { 'key': subKey, 'parent': clone, 'source': value };\n      }\n      // assign non-objects\n      else {\n        try {\n          // will throw an error in strict mode if the property is read-only\n          clone[subKey] = subValue;\n        } catch(e) { }\n      }\n    }\n\n    /**\n     * Gets an available marker key for the given object.\n     */\n    function getMarkerKey(object) {\n      // avoid collisions with existing keys\n      var result = uid;\n      while (object[result] && object[result].constructor != Marker) {\n        result += 1;\n      }\n      return result;\n    }\n\n    do {\n      key = data.key;\n      parent = data.parent;\n      source = data.source;\n      clone = value = source ? source[key] : data.value;\n      accessor = circular = descriptor = false;\n\n      // create a basic clone to filter out functions, DOM elements, and\n      // other non `Object` objects\n      if (value === Object(value)) {\n        // use custom deep clone function if available\n        if (isClassOf(value.deepClone, 'Function')) {\n          clone = value.deepClone();\n        } else {\n          ctor = value.constructor;\n          switch (toString.call(value)) {\n            case '[object Array]':\n              clone = new ctor(value.length);\n              break;\n\n            case '[object Boolean]':\n              clone = new ctor(value == true);\n              break;\n\n            case '[object Date]':\n              clone = new ctor(+value);\n              break;\n\n            case '[object Object]':\n              isPlainObject(value) && (clone = {});\n              break;\n\n            case '[object Number]':\n            case '[object String]':\n              clone = new ctor(value);\n              break;\n\n            case '[object RegExp]':\n              clone = ctor(value.source,\n                (value.global     ? 'g' : '') +\n                (value.ignoreCase ? 'i' : '') +\n                (value.multiline  ? 'm' : ''));\n          }\n        }\n        // continue clone if `value` doesn't have an accessor descriptor\n        // http://es5.github.com/#x8.10.1\n        if (clone && clone != value &&\n            !(descriptor = source && support.descriptors && getDescriptor(source, key),\n              accessor = descriptor && (descriptor.get || descriptor.set))) {\n          // use an existing clone (circular reference)\n          if ((extensible = isExtensible(value))) {\n            markerKey = getMarkerKey(value);\n            if (value[markerKey]) {\n              circular = clone = value[markerKey].raw;\n            }\n          } else {\n            // for frozen/sealed objects\n            for (subIndex = 0, length = unmarked.length; subIndex < length; subIndex++) {\n              data = unmarked[subIndex];\n              if (data.object === value) {\n                circular = clone = data.clone;\n                break;\n              }\n            }\n          }\n          if (!circular) {\n            // mark object to allow quickly detecting circular references and tie it to its clone\n            if (extensible) {\n              value[markerKey] = new Marker(clone);\n              marked.push({ 'key': markerKey, 'object': value });\n            } else {\n              // for frozen/sealed objects\n              unmarked.push({ 'clone': clone, 'object': value });\n            }\n            // iterate over object properties\n            forProps(value, forPropsCallback, { 'which': 'all' });\n          }\n        }\n      }\n      if (parent) {\n        // for custom property descriptors\n        if (accessor || (descriptor && !(descriptor.configurable && descriptor.enumerable && descriptor.writable))) {\n          if ('value' in descriptor) {\n            descriptor.value = clone;\n          }\n          setDescriptor(parent, key, descriptor);\n        }\n        // for default property descriptors\n        else {\n          parent[key] = clone;\n        }\n      } else {\n        result = clone;\n      }\n    } while ((data = queue[index++]));\n\n    // remove markers\n    for (index = 0, length = marked.length; index < length; index++) {\n      data = marked[index];\n      delete data.object[data.key];\n    }\n    return result;\n  }\n\n  /**\n   * An iteration utility for arrays and objects.\n   * Callbacks may terminate the loop by explicitly returning `false`.\n   *\n   * @static\n   * @memberOf Benchmark\n   * @param {Array|Object} object The object to iterate over.\n   * @param {Function} callback The function called per iteration.\n   * @param {Mixed} thisArg The `this` binding for the callback.\n   * @returns {Array|Object} Returns the object iterated over.\n   */\n  function each(object, callback, thisArg) {\n    var result = object;\n    object = Object(object);\n\n    var fn = callback,\n        index = -1,\n        length = object.length,\n        isSnapshot = !!(object.snapshotItem && (length = object.snapshotLength)),\n        isSplittable = (noCharByIndex || noCharByOwnIndex) && isClassOf(object, 'String'),\n        isConvertable = isSnapshot || isSplittable || 'item' in object,\n        origObject = object;\n\n    // in Opera < 10.5 `hasKey(object, 'length')` returns `false` for NodeLists\n    if (length === length >>> 0) {\n      if (isConvertable) {\n        // the third argument of the callback is the original non-array object\n        callback = function(value, index) {\n          return fn.call(this, value, index, origObject);\n        };\n        // in IE < 9 strings don't support accessing characters by index\n        if (isSplittable) {\n          object = object.split('');\n        } else {\n          object = [];\n          while (++index < length) {\n            // in Safari 2 `index in object` is always `false` for NodeLists\n            object[index] = isSnapshot ? result.snapshotItem(index) : result[index];\n          }\n        }\n      }\n      forEach(object, callback, thisArg);\n    } else {\n      forOwn(object, callback, thisArg);\n    }\n    return result;\n  }\n\n  /**\n   * Copies enumerable properties from the source(s) object to the destination object.\n   *\n   * @static\n   * @memberOf Benchmark\n   * @param {Object} destination The destination object.\n   * @param {Object} [source={}] The source object.\n   * @returns {Object} The destination object.\n   */\n  function extend(destination, source) {\n    // Chrome < 14 incorrectly sets `destination` to `undefined` when we `delete arguments[0]`\n    // http://code.google.com/p/v8/issues/detail?id=839\n    var result = destination;\n    delete arguments[0];\n\n    forEach(arguments, function(source) {\n      forProps(source, function(value, key) {\n        result[key] = value;\n      });\n    });\n    return result;\n  }\n\n  /**\n   * A generic `Array#filter` like method.\n   *\n   * @static\n   * @memberOf Benchmark\n   * @param {Array} array The array to iterate over.\n   * @param {Function|String} callback The function/alias called per iteration.\n   * @param {Mixed} thisArg The `this` binding for the callback.\n   * @returns {Array} A new array of values that passed callback filter.\n   * @example\n   *\n   * // get odd numbers\n   * Benchmark.filter([1, 2, 3, 4, 5], function(n) {\n   *   return n % 2;\n   * }); // -> [1, 3, 5];\n   *\n   * // get fastest benchmarks\n   * Benchmark.filter(benches, 'fastest');\n   *\n   * // get slowest benchmarks\n   * Benchmark.filter(benches, 'slowest');\n   *\n   * // get benchmarks that completed without erroring\n   * Benchmark.filter(benches, 'successful');\n   */\n  function filter(array, callback, thisArg) {\n    var result;\n\n    if (callback == 'successful') {\n      // callback to exclude those that are errored, unrun, or have hz of Infinity\n      callback = function(bench) { return bench.cycles && isFinite(bench.hz); };\n    }\n    else if (callback == 'fastest' || callback == 'slowest') {\n      // get successful, sort by period + margin of error, and filter fastest/slowest\n      result = filter(array, 'successful').sort(function(a, b) {\n        a = a.stats; b = b.stats;\n        return (a.mean + a.moe > b.mean + b.moe ? 1 : -1) * (callback == 'fastest' ? 1 : -1);\n      });\n      result = filter(result, function(bench) {\n        return result[0].compare(bench) == 0;\n      });\n    }\n    return result || reduce(array, function(result, value, index) {\n      return callback.call(thisArg, value, index, array) ? (result.push(value), result) : result;\n    }, []);\n  }\n\n  /**\n   * A generic `Array#forEach` like method.\n   * Callbacks may terminate the loop by explicitly returning `false`.\n   *\n   * @static\n   * @memberOf Benchmark\n   * @param {Array} array The array to iterate over.\n   * @param {Function} callback The function called per iteration.\n   * @param {Mixed} thisArg The `this` binding for the callback.\n   * @returns {Array} Returns the array iterated over.\n   */\n  function forEach(array, callback, thisArg) {\n    var index = -1,\n        length = (array = Object(array)).length >>> 0;\n\n    if (thisArg !== undefined) {\n      callback = bind(callback, thisArg);\n    }\n    while (++index < length) {\n      if (index in array &&\n          callback(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * Iterates over an object's own properties, executing the `callback` for each.\n   * Callbacks may terminate the loop by explicitly returning `false`.\n   *\n   * @static\n   * @memberOf Benchmark\n   * @param {Object} object The object to iterate over.\n   * @param {Function} callback The function executed per own property.\n   * @param {Mixed} thisArg The `this` binding for the callback.\n   * @returns {Object} Returns the object iterated over.\n   */\n  function forOwn(object, callback, thisArg) {\n    return forProps(object, callback, { 'bind': thisArg, 'which': 'own' });\n  }\n\n  /**\n   * Converts a number to a more readable comma-separated string representation.\n   *\n   * @static\n   * @memberOf Benchmark\n   * @param {Number} number The number to convert.\n   * @returns {String} The more readable string representation.\n   */\n  function formatNumber(number) {\n    number = String(number).split('.');\n    return number[0].replace(/(?=(?:\\d{3})+$)(?!\\b)/g, ',') +\n      (number[1] ? '.' + number[1] : '');\n  }\n\n  /**\n   * Checks if an object has the specified key as a direct property.\n   *\n   * @static\n   * @memberOf Benchmark\n   * @param {Object} object The object to check.\n   * @param {String} key The key to check for.\n   * @returns {Boolean} Returns `true` if key is a direct property, else `false`.\n   */\n  function hasKey() {\n    // lazy define for worst case fallback (not as accurate)\n    hasKey = function(object, key) {\n      var parent = object != null && (object.constructor || Object).prototype;\n      return !!parent && key in Object(object) && !(key in parent && object[key] === parent[key]);\n    };\n    // for modern browsers\n    if (isClassOf(hasOwnProperty, 'Function')) {\n      hasKey = function(object, key) {\n        return object != null && hasOwnProperty.call(object, key);\n      };\n    }\n    // for Safari 2\n    else if ({}.__proto__ == Object.prototype) {\n      hasKey = function(object, key) {\n        var result = false;\n        if (object != null) {\n          object = Object(object);\n          object.__proto__ = [object.__proto__, object.__proto__ = null, result = key in object][0];\n        }\n        return result;\n      };\n    }\n    return hasKey.apply(this, arguments);\n  }\n\n  /**\n   * A generic `Array#indexOf` like method.\n   *\n   * @static\n   * @memberOf Benchmark\n   * @param {Array} array The array to iterate over.\n   * @param {Mixed} value The value to search for.\n   * @param {Number} [fromIndex=0] The index to start searching from.\n   * @returns {Number} The index of the matched value or `-1`.\n   */\n  function indexOf(array, value, fromIndex) {\n    var index = toInteger(fromIndex),\n        length = (array = Object(array)).length >>> 0;\n\n    index = (index < 0 ? max(0, length + index) : index) - 1;\n    while (++index < length) {\n      if (index in array && value === array[index]) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * Modify a string by replacing named tokens with matching object property values.\n   *\n   * @static\n   * @memberOf Benchmark\n   * @param {String} string The string to modify.\n   * @param {Object} object The template object.\n   * @returns {String} The modified string.\n   */\n  function interpolate(string, object) {\n    forOwn(object, function(value, key) {\n      // escape regexp special characters in `key`\n      string = string.replace(RegExp('#\\\\{' + key.replace(/([.*+?^=!:${}()|[\\]\\/\\\\])/g, '\\\\$1') + '\\\\}', 'g'), value);\n    });\n    return string;\n  }\n\n  /**\n   * Invokes a method on all items in an array.\n   *\n   * @static\n   * @memberOf Benchmark\n   * @param {Array} benches Array of benchmarks to iterate over.\n   * @param {String|Object} name The name of the method to invoke OR options object.\n   * @param {Mixed} [arg1, arg2, ...] Arguments to invoke the method with.\n   * @returns {Array} A new array of values returned from each method invoked.\n   * @example\n   *\n   * // invoke `reset` on all benchmarks\n   * Benchmark.invoke(benches, 'reset');\n   *\n   * // invoke `emit` with arguments\n   * Benchmark.invoke(benches, 'emit', 'complete', listener);\n   *\n   * // invoke `run(true)`, treat benchmarks as a queue, and register invoke callbacks\n   * Benchmark.invoke(benches, {\n   *\n   *   // invoke the `run` method\n   *   'name': 'run',\n   *\n   *   // pass a single argument\n   *   'args': true,\n   *\n   *   // treat as queue, removing benchmarks from front of `benches` until empty\n   *   'queued': true,\n   *\n   *   // called before any benchmarks have been invoked.\n   *   'onStart': onStart,\n   *\n   *   // called between invoking benchmarks\n   *   'onCycle': onCycle,\n   *\n   *   // called after all benchmarks have been invoked.\n   *   'onComplete': onComplete\n   * });\n   */\n  function invoke(benches, name) {\n    var args,\n        bench,\n        queued,\n        index = -1,\n        eventProps = { 'currentTarget': benches },\n        options = { 'onStart': noop, 'onCycle': noop, 'onComplete': noop },\n        result = map(benches, function(bench) { return bench; });\n\n    /**\n     * Invokes the method of the current object and if synchronous, fetches the next.\n     */\n    function execute() {\n      var listeners,\n          async = isAsync(bench);\n\n      if (async) {\n        // use `getNext` as the first listener\n        bench.on('complete', getNext);\n        listeners = bench.events.complete;\n        listeners.splice(0, 0, listeners.pop());\n      }\n      // execute method\n      result[index] = isClassOf(bench && bench[name], 'Function') ? bench[name].apply(bench, args) : undefined;\n      // if synchronous return true until finished\n      return !async && getNext();\n    }\n\n    /**\n     * Fetches the next bench or executes `onComplete` callback.\n     */\n    function getNext(event) {\n      var cycleEvent,\n          last = bench,\n          async = isAsync(last);\n\n      if (async) {\n        last.off('complete', getNext);\n        last.emit('complete');\n      }\n      // emit \"cycle\" event\n      eventProps.type = 'cycle';\n      eventProps.target = last;\n      cycleEvent = Event(eventProps);\n      options.onCycle.call(benches, cycleEvent);\n\n      // choose next benchmark if not exiting early\n      if (!cycleEvent.aborted && raiseIndex() !== false) {\n        bench = queued ? benches[0] : result[index];\n        if (isAsync(bench)) {\n          delay(bench, execute);\n        }\n        else if (async) {\n          // resume execution if previously asynchronous but now synchronous\n          while (execute()) { }\n        }\n        else {\n          // continue synchronous execution\n          return true;\n        }\n      } else {\n        // emit \"complete\" event\n        eventProps.type = 'complete';\n        options.onComplete.call(benches, Event(eventProps));\n      }\n      // When used as a listener `event.aborted = true` will cancel the rest of\n      // the \"complete\" listeners because they were already called above and when\n      // used as part of `getNext` the `return false` will exit the execution while-loop.\n      if (event) {\n        event.aborted = true;\n      } else {\n        return false;\n      }\n    }\n\n    /**\n     * Checks if invoking `Benchmark#run` with asynchronous cycles.\n     */\n    function isAsync(object) {\n      // avoid using `instanceof` here because of IE memory leak issues with host objects\n      var async = args[0] && args[0].async;\n      return Object(object).constructor == Benchmark && name == 'run' &&\n        ((async == null ? object.options.async : async) && support.timeout || object.defer);\n    }\n\n    /**\n     * Raises `index` to the next defined index or returns `false`.\n     */\n    function raiseIndex() {\n      var length = result.length;\n      if (queued) {\n        // if queued remove the previous bench and subsequent skipped non-entries\n        do {\n          ++index > 0 && shift.call(benches);\n        } while ((length = benches.length) && !('0' in benches));\n      }\n      else {\n        while (++index < length && !(index in result)) { }\n      }\n      // if we reached the last index then return `false`\n      return (queued ? length : index < length) ? index : (index = false);\n    }\n\n    // juggle arguments\n    if (isClassOf(name, 'String')) {\n      // 2 arguments (array, name)\n      args = slice.call(arguments, 2);\n    } else {\n      // 2 arguments (array, options)\n      options = extend(options, name);\n      name = options.name;\n      args = isClassOf(args = 'args' in options ? options.args : [], 'Array') ? args : [args];\n      queued = options.queued;\n    }\n\n    // start iterating over the array\n    if (raiseIndex() !== false) {\n      // emit \"start\" event\n      bench = result[index];\n      eventProps.type = 'start';\n      eventProps.target = bench;\n      options.onStart.call(benches, Event(eventProps));\n\n      // end early if the suite was aborted in an \"onStart\" listener\n      if (benches.aborted && benches.constructor == Suite && name == 'run') {\n        // emit \"cycle\" event\n        eventProps.type = 'cycle';\n        options.onCycle.call(benches, Event(eventProps));\n        // emit \"complete\" event\n        eventProps.type = 'complete';\n        options.onComplete.call(benches, Event(eventProps));\n      }\n      // else start\n      else {\n        if (isAsync(bench)) {\n          delay(bench, execute);\n        } else {\n          while (execute()) { }\n        }\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Creates a string of joined array values or object key-value pairs.\n   *\n   * @static\n   * @memberOf Benchmark\n   * @param {Array|Object} object The object to operate on.\n   * @param {String} [separator1=','] The separator used between key-value pairs.\n   * @param {String} [separator2=': '] The separator used between keys and values.\n   * @returns {String} The joined result.\n   */\n  function join(object, separator1, separator2) {\n    var result = [],\n        length = (object = Object(object)).length,\n        arrayLike = length === length >>> 0;\n\n    separator2 || (separator2 = ': ');\n    each(object, function(value, key) {\n      result.push(arrayLike ? value : key + separator2 + value);\n    });\n    return result.join(separator1 || ',');\n  }\n\n  /**\n   * A generic `Array#map` like method.\n   *\n   * @static\n   * @memberOf Benchmark\n   * @param {Array} array The array to iterate over.\n   * @param {Function} callback The function called per iteration.\n   * @param {Mixed} thisArg The `this` binding for the callback.\n   * @returns {Array} A new array of values returned by the callback.\n   */\n  function map(array, callback, thisArg) {\n    return reduce(array, function(result, value, index) {\n      result[index] = callback.call(thisArg, value, index, array);\n      return result;\n    }, Array(Object(array).length >>> 0));\n  }\n\n  /**\n   * Retrieves the value of a specified property from all items in an array.\n   *\n   * @static\n   * @memberOf Benchmark\n   * @param {Array} array The array to iterate over.\n   * @param {String} property The property to pluck.\n   * @returns {Array} A new array of property values.\n   */\n  function pluck(array, property) {\n    return map(array, function(object) {\n      return object == null ? undefined : object[property];\n    });\n  }\n\n  /**\n   * A generic `Array#reduce` like method.\n   *\n   * @static\n   * @memberOf Benchmark\n   * @param {Array} array The array to iterate over.\n   * @param {Function} callback The function called per iteration.\n   * @param {Mixed} accumulator Initial value of the accumulator.\n   * @returns {Mixed} The accumulator.\n   */\n  function reduce(array, callback, accumulator) {\n    var noaccum = arguments.length < 3;\n    forEach(array, function(value, index) {\n      accumulator = noaccum ? (noaccum = false, value) : callback(accumulator, value, index, array);\n    });\n    return accumulator;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Aborts all benchmarks in the suite.\n   *\n   * @name abort\n   * @memberOf Benchmark.Suite\n   * @returns {Object} The suite instance.\n   */\n  function abortSuite() {\n    var event,\n        me = this,\n        resetting = calledBy.resetSuite;\n\n    if (me.running) {\n      event = Event('abort');\n      me.emit(event);\n      if (!event.cancelled || resetting) {\n        // avoid infinite recursion\n        calledBy.abortSuite = true;\n        me.reset();\n        delete calledBy.abortSuite;\n\n        if (!resetting) {\n          me.aborted = true;\n          invoke(me, 'abort');\n        }\n      }\n    }\n    return me;\n  }\n\n  /**\n   * Adds a test to the benchmark suite.\n   *\n   * @memberOf Benchmark.Suite\n   * @param {String} name A name to identify the benchmark.\n   * @param {Function|String} fn The test to benchmark.\n   * @param {Object} [options={}] Options object.\n   * @returns {Object} The benchmark instance.\n   * @example\n   *\n   * // basic usage\n   * suite.add(fn);\n   *\n   * // or using a name first\n   * suite.add('foo', fn);\n   *\n   * // or with options\n   * suite.add('foo', fn, {\n   *   'onCycle': onCycle,\n   *   'onComplete': onComplete\n   * });\n   *\n   * // or name and options\n   * suite.add('foo', {\n   *   'fn': fn,\n   *   'onCycle': onCycle,\n   *   'onComplete': onComplete\n   * });\n   *\n   * // or options only\n   * suite.add({\n   *   'name': 'foo',\n   *   'fn': fn,\n   *   'onCycle': onCycle,\n   *   'onComplete': onComplete\n   * });\n   */\n  function add(name, fn, options) {\n    var me = this,\n        bench = Benchmark(name, fn, options),\n        event = Event({ 'type': 'add', 'target': bench });\n\n    if (me.emit(event), !event.cancelled) {\n      me.push(bench);\n    }\n    return me;\n  }\n\n  /**\n   * Creates a new suite with cloned benchmarks.\n   *\n   * @name clone\n   * @memberOf Benchmark.Suite\n   * @param {Object} options Options object to overwrite cloned options.\n   * @returns {Object} The new suite instance.\n   */\n  function cloneSuite(options) {\n    var me = this,\n        result = new me.constructor(extend({}, me.options, options));\n\n    // copy own properties\n    forOwn(me, function(value, key) {\n      if (!hasKey(result, key)) {\n        result[key] = value && isClassOf(value.clone, 'Function')\n          ? value.clone()\n          : deepClone(value);\n      }\n    });\n    return result;\n  }\n\n  /**\n   * An `Array#filter` like method.\n   *\n   * @name filter\n   * @memberOf Benchmark.Suite\n   * @param {Function|String} callback The function/alias called per iteration.\n   * @returns {Object} A new suite of benchmarks that passed callback filter.\n   */\n  function filterSuite(callback) {\n    var me = this,\n        result = new me.constructor;\n\n    result.push.apply(result, filter(me, callback));\n    return result;\n  }\n\n  /**\n   * Resets all benchmarks in the suite.\n   *\n   * @name reset\n   * @memberOf Benchmark.Suite\n   * @returns {Object} The suite instance.\n   */\n  function resetSuite() {\n    var event,\n        me = this,\n        aborting = calledBy.abortSuite;\n\n    if (me.running && !aborting) {\n      // no worries, `resetSuite()` is called within `abortSuite()`\n      calledBy.resetSuite = true;\n      me.abort();\n      delete calledBy.resetSuite;\n    }\n    // reset if the state has changed\n    else if ((me.aborted || me.running) &&\n        (me.emit(event = Event('reset')), !event.cancelled)) {\n      me.running = false;\n      if (!aborting) {\n        invoke(me, 'reset');\n      }\n    }\n    return me;\n  }\n\n  /**\n   * Runs the suite.\n   *\n   * @name run\n   * @memberOf Benchmark.Suite\n   * @param {Object} [options={}] Options object.\n   * @returns {Object} The suite instance.\n   * @example\n   *\n   * // basic usage\n   * suite.run();\n   *\n   * // or with options\n   * suite.run({ 'async': true, 'queued': true });\n   */\n  function runSuite(options) {\n    var me = this;\n\n    me.reset();\n    me.running = true;\n    options || (options = {});\n\n    invoke(me, {\n      'name': 'run',\n      'args': options,\n      'queued': options.queued,\n      'onStart': function(event) {\n        me.emit(event);\n      },\n      'onCycle': function(event) {\n        var bench = event.target;\n        if (bench.error) {\n          me.emit({ 'type': 'error', 'target': bench });\n        }\n        me.emit(event);\n        event.aborted = me.aborted;\n      },\n      'onComplete': function(event) {\n        me.running = false;\n        me.emit(event);\n      }\n    });\n    return me;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Executes all registered listeners of the specified event type.\n   *\n   * @memberOf Benchmark, Benchmark.Suite\n   * @param {String|Object} type The event type or object.\n   * @returns {Mixed} Returns the return value of the last listener executed.\n   */\n  function emit(type) {\n    var listeners,\n        me = this,\n        event = Event(type),\n        events = me.events,\n        args = (arguments[0] = event, arguments);\n\n    event.currentTarget || (event.currentTarget = me);\n    event.target || (event.target = me);\n    delete event.result;\n\n    if (events && (listeners = hasKey(events, event.type) && events[event.type])) {\n      forEach(listeners.slice(), function(listener) {\n        if ((event.result = listener.apply(me, args)) === false) {\n          event.cancelled = true;\n        }\n        return !event.aborted;\n      });\n    }\n    return event.result;\n  }\n\n  /**\n   * Returns an array of event listeners for a given type that can be manipulated\n   * to add or remove listeners.\n   *\n   * @memberOf Benchmark, Benchmark.Suite\n   * @param {String} type The event type.\n   * @returns {Array} The listeners array.\n   */\n  function listeners(type) {\n    var me = this,\n        events = me.events || (me.events = {});\n\n    return hasKey(events, type) ? events[type] : (events[type] = []);\n  }\n\n  /**\n   * Unregisters a listener for the specified event type(s),\n   * or unregisters all listeners for the specified event type(s),\n   * or unregisters all listeners for all event types.\n   *\n   * @memberOf Benchmark, Benchmark.Suite\n   * @param {String} [type] The event type.\n   * @param {Function} [listener] The function to unregister.\n   * @returns {Object} The benchmark instance.\n   * @example\n   *\n   * // unregister a listener for an event type\n   * bench.off('cycle', listener);\n   *\n   * // unregister a listener for multiple event types\n   * bench.off('start cycle', listener);\n   *\n   * // unregister all listeners for an event type\n   * bench.off('cycle');\n   *\n   * // unregister all listeners for multiple event types\n   * bench.off('start cycle complete');\n   *\n   * // unregister all listeners for all event types\n   * bench.off();\n   */\n  function off(type, listener) {\n    var me = this,\n        events = me.events;\n\n    events && each(type ? type.split(' ') : events, function(listeners, type) {\n      var index;\n      if (typeof listeners == 'string') {\n        type = listeners;\n        listeners = hasKey(events, type) && events[type];\n      }\n      if (listeners) {\n        if (listener) {\n          index = indexOf(listeners, listener);\n          if (index > -1) {\n            listeners.splice(index, 1);\n          }\n        } else {\n          listeners.length = 0;\n        }\n      }\n    });\n    return me;\n  }\n\n  /**\n   * Registers a listener for the specified event type(s).\n   *\n   * @memberOf Benchmark, Benchmark.Suite\n   * @param {String} type The event type.\n   * @param {Function} listener The function to register.\n   * @returns {Object} The benchmark instance.\n   * @example\n   *\n   * // register a listener for an event type\n   * bench.on('cycle', listener);\n   *\n   * // register a listener for multiple event types\n   * bench.on('start cycle', listener);\n   */\n  function on(type, listener) {\n    var me = this,\n        events = me.events || (me.events = {});\n\n    forEach(type.split(' '), function(type) {\n      (hasKey(events, type)\n        ? events[type]\n        : (events[type] = [])\n      ).push(listener);\n    });\n    return me;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Aborts the benchmark without recording times.\n   *\n   * @memberOf Benchmark\n   * @returns {Object} The benchmark instance.\n   */\n  function abort() {\n    var event,\n        me = this,\n        resetting = calledBy.reset;\n\n    if (me.running) {\n      event = Event('abort');\n      me.emit(event);\n      if (!event.cancelled || resetting) {\n        // avoid infinite recursion\n        calledBy.abort = true;\n        me.reset();\n        delete calledBy.abort;\n\n        if (support.timeout) {\n          clearTimeout(me._timerId);\n          delete me._timerId;\n        }\n        if (!resetting) {\n          me.aborted = true;\n          me.running = false;\n        }\n      }\n    }\n    return me;\n  }\n\n  /**\n   * Creates a new benchmark using the same test and options.\n   *\n   * @memberOf Benchmark\n   * @param {Object} options Options object to overwrite cloned options.\n   * @returns {Object} The new benchmark instance.\n   * @example\n   *\n   * var bizarro = bench.clone({\n   *   'name': 'doppelganger'\n   * });\n   */\n  function clone(options) {\n    var me = this,\n        result = new me.constructor(extend({}, me, options));\n\n    // correct the `options` object\n    result.options = extend({}, me.options, options);\n\n    // copy own custom properties\n    forOwn(me, function(value, key) {\n      if (!hasKey(result, key)) {\n        result[key] = deepClone(value);\n      }\n    });\n    return result;\n  }\n\n  /**\n   * Determines if a benchmark is faster than another.\n   *\n   * @memberOf Benchmark\n   * @param {Object} other The benchmark to compare.\n   * @returns {Number} Returns `-1` if slower, `1` if faster, and `0` if indeterminate.\n   */\n  function compare(other) {\n    var critical,\n        zStat,\n        me = this,\n        sample1 = me.stats.sample,\n        sample2 = other.stats.sample,\n        size1 = sample1.length,\n        size2 = sample2.length,\n        maxSize = max(size1, size2),\n        minSize = min(size1, size2),\n        u1 = getU(sample1, sample2),\n        u2 = getU(sample2, sample1),\n        u = min(u1, u2);\n\n    function getScore(xA, sampleB) {\n      return reduce(sampleB, function(total, xB) {\n        return total + (xB > xA ? 0 : xB < xA ? 1 : 0.5);\n      }, 0);\n    }\n\n    function getU(sampleA, sampleB) {\n      return reduce(sampleA, function(total, xA) {\n        return total + getScore(xA, sampleB);\n      }, 0);\n    }\n\n    function getZ(u) {\n      return (u - ((size1 * size2) / 2)) / sqrt((size1 * size2 * (size1 + size2 + 1)) / 12);\n    }\n\n    // exit early if comparing the same benchmark\n    if (me == other) {\n      return 0;\n    }\n    // reject the null hyphothesis the two samples come from the\n    // same population (i.e. have the same median) if...\n    if (size1 + size2 > 30) {\n      // ...the z-stat is greater than 1.96 or less than -1.96\n      // http://www.statisticslectures.com/topics/mannwhitneyu/\n      zStat = getZ(u);\n      return abs(zStat) > 1.96 ? (u == u1 ? 1 : -1) : 0;\n    }\n    // ...the U value is less than or equal the critical U value\n    // http://www.geoib.com/mann-whitney-u-test.html\n    critical = maxSize < 5 || minSize < 3 ? 0 : uTable[maxSize][minSize - 3];\n    return u <= critical ? (u == u1 ? 1 : -1) : 0;\n  }\n\n  /**\n   * Reset properties and abort if running.\n   *\n   * @memberOf Benchmark\n   * @returns {Object} The benchmark instance.\n   */\n  function reset() {\n    var data,\n        event,\n        me = this,\n        index = 0,\n        changes = { 'length': 0 },\n        queue = { 'length': 0 };\n\n    if (me.running && !calledBy.abort) {\n      // no worries, `reset()` is called within `abort()`\n      calledBy.reset = true;\n      me.abort();\n      delete calledBy.reset;\n    }\n    else {\n      // a non-recursive solution to check if properties have changed\n      // http://www.jslab.dk/articles/non.recursive.preorder.traversal.part4\n      data = { 'destination': me, 'source': extend({}, me.constructor.prototype, me.options) };\n      do {\n        forOwn(data.source, function(value, key) {\n          var changed,\n              destination = data.destination,\n              currValue = destination[key];\n\n          if (value && typeof value == 'object') {\n            if (isClassOf(value, 'Array')) {\n              // check if an array value has changed to a non-array value\n              if (!isClassOf(currValue, 'Array')) {\n                changed = currValue = [];\n              }\n              // or has changed its length\n              if (currValue.length != value.length) {\n                changed = currValue = currValue.slice(0, value.length);\n                currValue.length = value.length;\n              }\n            }\n            // check if an object has changed to a non-object value\n            else if (!currValue || typeof currValue != 'object') {\n              changed = currValue = {};\n            }\n            // register a changed object\n            if (changed) {\n              changes[changes.length++] = { 'destination': destination, 'key': key, 'value': currValue };\n            }\n            queue[queue.length++] = { 'destination': currValue, 'source': value };\n          }\n          // register a changed primitive\n          else if (value !== currValue && !(value == null || isClassOf(value, 'Function'))) {\n            changes[changes.length++] = { 'destination': destination, 'key': key, 'value': value };\n          }\n        });\n      }\n      while ((data = queue[index++]));\n\n      // if changed emit the `reset` event and if it isn't cancelled reset the benchmark\n      if (changes.length && (me.emit(event = Event('reset')), !event.cancelled)) {\n        forEach(changes, function(data) {\n          data.destination[data.key] = data.value;\n        });\n      }\n    }\n    return me;\n  }\n\n  /**\n   * Displays relevant benchmark information when coerced to a string.\n   *\n   * @name toString\n   * @memberOf Benchmark\n   * @returns {String} A string representation of the benchmark instance.\n   */\n  function toStringBench() {\n    var me = this,\n        error = me.error,\n        hz = me.hz,\n        id = me.id,\n        stats = me.stats,\n        size = stats.sample.length,\n        pm = support.java ? '+/-' : '\\xb1',\n        result = me.name || (isNaN(id) ? id : '<Test #' + id + '>');\n\n    if (error) {\n      result += ': ' + join(error);\n    } else {\n      result += ' x ' + formatNumber(hz.toFixed(hz < 100 ? 2 : 0)) + ' ops/sec ' + pm +\n        stats.rme.toFixed(2) + '% (' + size + ' run' + (size == 1 ? '' : 's') + ' sampled)';\n    }\n    return result;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Clocks the time taken to execute a test per cycle (secs).\n   *\n   * @private\n   * @param {Object} bench The benchmark instance.\n   * @returns {Number} The time taken.\n   */\n  function clock() {\n    var applet,\n        options = Benchmark.options,\n        template = { 'begin': 's$=new n$', 'end': 'r$=(new n$-s$)/1e3', 'uid': uid },\n        timers = [{ 'ns': timer.ns, 'res': max(0.0015, getRes('ms')), 'unit': 'ms' }];\n\n    // lazy define for hi-res timers\n    clock = function(clone) {\n      var deferred;\n      if (clone instanceof Deferred) {\n        deferred = clone;\n        clone = deferred.benchmark;\n      }\n\n      var bench = clone._original,\n          fn = bench.fn,\n          fnArg = deferred ? getFirstArgument(fn) || 'deferred' : '',\n          stringable = isStringable(fn);\n\n      var source = {\n        'setup': getSource(bench.setup, preprocess('m$.setup()')),\n        'fn': getSource(fn, preprocess('m$.fn(' + fnArg + ')')),\n        'fnArg': fnArg,\n        'teardown': getSource(bench.teardown, preprocess('m$.teardown()'))\n      };\n\n      var count = bench.count = clone.count,\n          decompilable = support.decompilation || stringable,\n          id = bench.id,\n          isEmpty = !(source.fn || stringable),\n          name = bench.name || (typeof id == 'number' ? '<Test #' + id + '>' : id),\n          ns = timer.ns,\n          result = 0;\n\n      // init `minTime` if needed\n      clone.minTime = bench.minTime || (bench.minTime = bench.options.minTime = options.minTime);\n\n      // repair nanosecond timer\n      // (some Chrome builds erase the `ns` variable after millions of executions)\n      if (applet) {\n        try {\n          ns.nanoTime();\n        } catch(e) {\n          // use non-element to avoid issues with libs that augment them\n          ns = timer.ns = new applet.Packages.nano;\n        }\n      }\n\n      // Compile in setup/teardown functions and the test loop.\n      // Create a new compiled test, instead of using the cached `bench.compiled`,\n      // to avoid potential engine optimizations enabled over the life of the test.\n      var compiled = bench.compiled = createFunction(preprocess('t$'), interpolate(\n        preprocess(deferred\n          ? 'var d$=this,#{fnArg}=d$,m$=d$.benchmark._original,f$=m$.fn,su$=m$.setup,td$=m$.teardown;' +\n            // when `deferred.cycles` is `0` then...\n            'if(!d$.cycles){' +\n            // set `deferred.fn`\n            'd$.fn=function(){var #{fnArg}=d$;if(typeof f$==\"function\"){try{#{fn}\\n}catch(e$){f$(d$)}}else{#{fn}\\n}};' +\n            // set `deferred.teardown`\n            'd$.teardown=function(){d$.cycles=0;if(typeof td$==\"function\"){try{#{teardown}\\n}catch(e$){td$()}}else{#{teardown}\\n}};' +\n            // execute the benchmark's `setup`\n            'if(typeof su$==\"function\"){try{#{setup}\\n}catch(e$){su$()}}else{#{setup}\\n};' +\n            // start timer\n            't$.start(d$);' +\n            // execute `deferred.fn` and return a dummy object\n            '}d$.fn();return{}'\n\n          : 'var r$,s$,m$=this,f$=m$.fn,i$=m$.count,n$=t$.ns;#{setup}\\n#{begin};' +\n            'while(i$--){#{fn}\\n}#{end};#{teardown}\\nreturn{elapsed:r$,uid:\"#{uid}\"}'),\n        source\n      ));\n\n      try {\n        if (isEmpty) {\n          // Firefox may remove dead code from Function#toString results\n          // http://bugzil.la/536085\n          throw new Error('The test \"' + name + '\" is empty. This may be the result of dead code removal.');\n        }\n        else if (!deferred) {\n          // pretest to determine if compiled code is exits early, usually by a\n          // rogue `return` statement, by checking for a return object with the uid\n          bench.count = 1;\n          compiled = (compiled.call(bench, timer) || {}).uid == uid && compiled;\n          bench.count = count;\n        }\n      } catch(e) {\n        compiled = null;\n        clone.error = e || new Error(String(e));\n        bench.count = count;\n      }\n      // fallback when a test exits early or errors during pretest\n      if (decompilable && !compiled && !deferred && !isEmpty) {\n        compiled = createFunction(preprocess('t$'), interpolate(\n          preprocess(\n            (clone.error && !stringable\n              ? 'var r$,s$,m$=this,f$=m$.fn,i$=m$.count'\n              : 'function f$(){#{fn}\\n}var r$,s$,m$=this,i$=m$.count'\n            ) +\n            ',n$=t$.ns;#{setup}\\n#{begin};m$.f$=f$;while(i$--){m$.f$()}#{end};' +\n            'delete m$.f$;#{teardown}\\nreturn{elapsed:r$}'\n          ),\n          source\n        ));\n\n        try {\n          // pretest one more time to check for errors\n          bench.count = 1;\n          compiled.call(bench, timer);\n          bench.compiled = compiled;\n          bench.count = count;\n          delete clone.error;\n        }\n        catch(e) {\n          bench.count = count;\n          if (clone.error) {\n            compiled = null;\n          } else {\n            bench.compiled = compiled;\n            clone.error = e || new Error(String(e));\n          }\n        }\n      }\n      // assign `compiled` to `clone` before calling in case a deferred benchmark\n      // immediately calls `deferred.resolve()`\n      clone.compiled = compiled;\n      // if no errors run the full test loop\n      if (!clone.error) {\n        result = compiled.call(deferred || bench, timer).elapsed;\n      }\n      return result;\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the current timer's minimum resolution (secs).\n     */\n    function getRes(unit) {\n      var measured,\n          begin,\n          count = 30,\n          divisor = 1e3,\n          ns = timer.ns,\n          sample = [];\n\n      // get average smallest measurable time\n      while (count--) {\n        if (unit == 'us') {\n          divisor = 1e6;\n          if (ns.stop) {\n            ns.start();\n            while (!(measured = ns.microseconds())) { }\n          } else if (ns[perfName]) {\n            divisor = 1e3;\n            measured = Function('n', 'var r,s=n.' + perfName + '();while(!(r=n.' + perfName + '()-s)){};return r')(ns);\n          } else {\n            begin = ns();\n            while (!(measured = ns() - begin)) { }\n          }\n        }\n        else if (unit == 'ns') {\n          divisor = 1e9;\n          if (ns.nanoTime) {\n            begin = ns.nanoTime();\n            while (!(measured = ns.nanoTime() - begin)) { }\n          } else {\n            begin = (begin = ns())[0] + (begin[1] / divisor);\n            while (!(measured = ((measured = ns())[0] + (measured[1] / divisor)) - begin)) { }\n            divisor = 1;\n          }\n        }\n        else {\n          begin = new ns;\n          while (!(measured = new ns - begin)) { }\n        }\n        // check for broken timers (nanoTime may have issues)\n        // http://alivebutsleepy.srnet.cz/unreliable-system-nanotime/\n        if (measured > 0) {\n          sample.push(measured);\n        } else {\n          sample.push(Infinity);\n          break;\n        }\n      }\n      // convert to seconds\n      return getMean(sample) / divisor;\n    }\n\n    /**\n     * Replaces all occurrences of `$` with a unique number and\n     * template tokens with content.\n     */\n    function preprocess(code) {\n      return interpolate(code, template).replace(/\\$/g, /\\d+/.exec(uid));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // detect nanosecond support from a Java applet\n    each(doc && doc.applets || [], function(element) {\n      return !(timer.ns = applet = 'nanoTime' in element && element);\n    });\n\n    // check type in case Safari returns an object instead of a number\n    try {\n      if (typeof timer.ns.nanoTime() == 'number') {\n        timers.push({ 'ns': timer.ns, 'res': getRes('ns'), 'unit': 'ns' });\n      }\n    } catch(e) { }\n\n    // detect Chrome's microsecond timer:\n    // enable benchmarking via the --enable-benchmarking command\n    // line switch in at least Chrome 7 to use chrome.Interval\n    try {\n      if ((timer.ns = new (window.chrome || window.chromium).Interval)) {\n        timers.push({ 'ns': timer.ns, 'res': getRes('us'), 'unit': 'us' });\n      }\n    } catch(e) { }\n\n    // detect `performance.now` microsecond resolution timer\n    if ((timer.ns = perfName && perfObject)) {\n      timers.push({ 'ns': timer.ns, 'res': getRes('us'), 'unit': 'us' });\n    }\n\n    // detect Node's nanosecond resolution timer available in Node >= 0.8\n    if (processObject && typeof (timer.ns = processObject.hrtime) == 'function') {\n      timers.push({ 'ns': timer.ns, 'res': getRes('ns'), 'unit': 'ns' });\n    }\n\n    // detect Wade Simmons' Node microtime module\n    if (microtimeObject && typeof (timer.ns = microtimeObject.now) == 'function') {\n      timers.push({ 'ns': timer.ns,  'res': getRes('us'), 'unit': 'us' });\n    }\n\n    // pick timer with highest resolution\n    timer = reduce(timers, function(timer, other) {\n      return other.res < timer.res ? other : timer;\n    });\n\n    // remove unused applet\n    if (timer.unit != 'ns' && applet) {\n      applet = destroyElement(applet);\n    }\n    // error if there are no working timers\n    if (timer.res == Infinity) {\n      throw new Error('Benchmark.js was unable to find a working timer.');\n    }\n    // use API of chosen timer\n    if (timer.unit == 'ns') {\n      if (timer.ns.nanoTime) {\n        extend(template, {\n          'begin': 's$=n$.nanoTime()',\n          'end': 'r$=(n$.nanoTime()-s$)/1e9'\n        });\n      } else {\n        extend(template, {\n          'begin': 's$=n$()',\n          'end': 'r$=n$(s$);r$=r$[0]+(r$[1]/1e9)'\n        });\n      }\n    }\n    else if (timer.unit == 'us') {\n      if (timer.ns.stop) {\n        extend(template, {\n          'begin': 's$=n$.start()',\n          'end': 'r$=n$.microseconds()/1e6'\n        });\n      } else if (perfName) {\n        extend(template, {\n          'begin': 's$=n$.' + perfName + '()',\n          'end': 'r$=(n$.' + perfName + '()-s$)/1e3'\n        });\n      } else {\n        extend(template, {\n          'begin': 's$=n$()',\n          'end': 'r$=(n$()-s$)/1e6'\n        });\n      }\n    }\n\n    // define `timer` methods\n    timer.start = createFunction(preprocess('o$'),\n      preprocess('var n$=this.ns,#{begin};o$.elapsed=0;o$.timeStamp=s$'));\n\n    timer.stop = createFunction(preprocess('o$'),\n      preprocess('var n$=this.ns,s$=o$.timeStamp,#{end};o$.elapsed=r$'));\n\n    // resolve time span required to achieve a percent uncertainty of at most 1%\n    // http://spiff.rit.edu/classes/phys273/uncert/uncert.html\n    options.minTime || (options.minTime = max(timer.res / 2 / 0.01, 0.05));\n    return clock.apply(null, arguments);\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Computes stats on benchmark results.\n   *\n   * @private\n   * @param {Object} bench The benchmark instance.\n   * @param {Object} options The options object.\n   */\n  function compute(bench, options) {\n    options || (options = {});\n\n    var async = options.async,\n        elapsed = 0,\n        initCount = bench.initCount,\n        minSamples = bench.minSamples,\n        queue = [],\n        sample = bench.stats.sample;\n\n    /**\n     * Adds a clone to the queue.\n     */\n    function enqueue() {\n      queue.push(bench.clone({\n        '_original': bench,\n        'events': {\n          'abort': [update],\n          'cycle': [update],\n          'error': [update],\n          'start': [update]\n        }\n      }));\n    }\n\n    /**\n     * Updates the clone/original benchmarks to keep their data in sync.\n     */\n    function update(event) {\n      var clone = this,\n          type = event.type;\n\n      if (bench.running) {\n        if (type == 'start') {\n          // Note: `clone.minTime` prop is inited in `clock()`\n          clone.count = bench.initCount;\n        }\n        else {\n          if (type == 'error') {\n            bench.error = clone.error;\n          }\n          if (type == 'abort') {\n            bench.abort();\n            bench.emit('cycle');\n          } else {\n            event.currentTarget = event.target = bench;\n            bench.emit(event);\n          }\n        }\n      } else if (bench.aborted) {\n        // clear abort listeners to avoid triggering bench's abort/cycle again\n        clone.events.abort.length = 0;\n        clone.abort();\n      }\n    }\n\n    /**\n     * Determines if more clones should be queued or if cycling should stop.\n     */\n    function evaluate(event) {\n      var critical,\n          df,\n          mean,\n          moe,\n          rme,\n          sd,\n          sem,\n          variance,\n          clone = event.target,\n          done = bench.aborted,\n          now = +new Date,\n          size = sample.push(clone.times.period),\n          maxedOut = size >= minSamples && (elapsed += now - clone.times.timeStamp) / 1e3 > bench.maxTime,\n          times = bench.times,\n          varOf = function(sum, x) { return sum + pow(x - mean, 2); };\n\n      // exit early for aborted or unclockable tests\n      if (done || clone.hz == Infinity) {\n        maxedOut = !(size = sample.length = queue.length = 0);\n      }\n\n      if (!done) {\n        // sample mean (estimate of the population mean)\n        mean = getMean(sample);\n        // sample variance (estimate of the population variance)\n        variance = reduce(sample, varOf, 0) / (size - 1) || 0;\n        // sample standard deviation (estimate of the population standard deviation)\n        sd = sqrt(variance);\n        // standard error of the mean (a.k.a. the standard deviation of the sampling distribution of the sample mean)\n        sem = sd / sqrt(size);\n        // degrees of freedom\n        df = size - 1;\n        // critical value\n        critical = tTable[Math.round(df) || 1] || tTable.infinity;\n        // margin of error\n        moe = sem * critical;\n        // relative margin of error\n        rme = (moe / mean) * 100 || 0;\n\n        extend(bench.stats, {\n          'deviation': sd,\n          'mean': mean,\n          'moe': moe,\n          'rme': rme,\n          'sem': sem,\n          'variance': variance\n        });\n\n        // Abort the cycle loop when the minimum sample size has been collected\n        // and the elapsed time exceeds the maximum time allowed per benchmark.\n        // We don't count cycle delays toward the max time because delays may be\n        // increased by browsers that clamp timeouts for inactive tabs.\n        // https://developer.mozilla.org/en/window.setTimeout#Inactive_tabs\n        if (maxedOut) {\n          // reset the `initCount` in case the benchmark is rerun\n          bench.initCount = initCount;\n          bench.running = false;\n          done = true;\n          times.elapsed = (now - times.timeStamp) / 1e3;\n        }\n        if (bench.hz != Infinity) {\n          bench.hz = 1 / mean;\n          times.cycle = mean * bench.count;\n          times.period = mean;\n        }\n      }\n      // if time permits, increase sample size to reduce the margin of error\n      if (queue.length < 2 && !maxedOut) {\n        enqueue();\n      }\n      // abort the invoke cycle when done\n      event.aborted = done;\n    }\n\n    // init queue and begin\n    enqueue();\n    invoke(queue, {\n      'name': 'run',\n      'args': { 'async': async },\n      'queued': true,\n      'onCycle': evaluate,\n      'onComplete': function() { bench.emit('complete'); }\n    });\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Cycles a benchmark until a run `count` can be established.\n   *\n   * @private\n   * @param {Object} clone The cloned benchmark instance.\n   * @param {Object} options The options object.\n   */\n  function cycle(clone, options) {\n    options || (options = {});\n\n    var deferred;\n    if (clone instanceof Deferred) {\n      deferred = clone;\n      clone = clone.benchmark;\n    }\n\n    var clocked,\n        cycles,\n        divisor,\n        event,\n        minTime,\n        period,\n        async = options.async,\n        bench = clone._original,\n        count = clone.count,\n        times = clone.times;\n\n    // continue, if not aborted between cycles\n    if (clone.running) {\n      // `minTime` is set to `Benchmark.options.minTime` in `clock()`\n      cycles = ++clone.cycles;\n      clocked = deferred ? deferred.elapsed : clock(clone);\n      minTime = clone.minTime;\n\n      if (cycles > bench.cycles) {\n        bench.cycles = cycles;\n      }\n      if (clone.error) {\n        event = Event('error');\n        event.message = clone.error;\n        clone.emit(event);\n        if (!event.cancelled) {\n          clone.abort();\n        }\n      }\n    }\n\n    // continue, if not errored\n    if (clone.running) {\n      // time taken to complete last test cycle\n      bench.times.cycle = times.cycle = clocked;\n      // seconds per operation\n      period = bench.times.period = times.period = clocked / count;\n      // ops per second\n      bench.hz = clone.hz = 1 / period;\n      // avoid working our way up to this next time\n      bench.initCount = clone.initCount = count;\n      // do we need to do another cycle?\n      clone.running = clocked < minTime;\n\n      if (clone.running) {\n        // tests may clock at `0` when `initCount` is a small number,\n        // to avoid that we set its count to something a bit higher\n        if (!clocked && (divisor = divisors[clone.cycles]) != null) {\n          count = floor(4e6 / divisor);\n        }\n        // calculate how many more iterations it will take to achive the `minTime`\n        if (count <= clone.count) {\n          count += Math.ceil((minTime - clocked) / period);\n        }\n        clone.running = count != Infinity;\n      }\n    }\n    // should we exit early?\n    event = Event('cycle');\n    clone.emit(event);\n    if (event.aborted) {\n      clone.abort();\n    }\n    // figure out what to do next\n    if (clone.running) {\n      // start a new cycle\n      clone.count = count;\n      if (deferred) {\n        clone.compiled.call(deferred, timer);\n      } else if (async) {\n        delay(clone, function() { cycle(clone, options); });\n      } else {\n        cycle(clone);\n      }\n    }\n    else {\n      // fix TraceMonkey bug associated with clock fallbacks\n      // http://bugzil.la/509069\n      if (support.browser) {\n        runScript(uid + '=1;delete ' + uid);\n      }\n      // done\n      clone.emit('complete');\n    }\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Runs the benchmark.\n   *\n   * @memberOf Benchmark\n   * @param {Object} [options={}] Options object.\n   * @returns {Object} The benchmark instance.\n   * @example\n   *\n   * // basic usage\n   * bench.run();\n   *\n   * // or with options\n   * bench.run({ 'async': true });\n   */\n  function run(options) {\n    var me = this,\n        event = Event('start');\n\n    // set `running` to `false` so `reset()` won't call `abort()`\n    me.running = false;\n    me.reset();\n    me.running = true;\n\n    me.count = me.initCount;\n    me.times.timeStamp = +new Date;\n    me.emit(event);\n\n    if (!event.cancelled) {\n      options = { 'async': ((options = options && options.async) == null ? me.async : options) && support.timeout };\n\n      // for clones created within `compute()`\n      if (me._original) {\n        if (me.defer) {\n          Deferred(me);\n        } else {\n          cycle(me, options);\n        }\n      }\n      // for original benchmarks\n      else {\n        compute(me, options);\n      }\n    }\n    return me;\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  // Firefox 1 erroneously defines variable and argument names of functions on\n  // the function itself as non-configurable properties with `undefined` values.\n  // The bugginess continues as the `Benchmark` constructor has an argument\n  // named `options` and Firefox 1 will not assign a value to `Benchmark.options`,\n  // making it non-writable in the process, unless it is the first property\n  // assigned by for-in loop of `extend()`.\n  extend(Benchmark, {\n\n    /**\n     * The default options copied by benchmark instances.\n     *\n     * @static\n     * @memberOf Benchmark\n     * @type Object\n     */\n    'options': {\n\n      /**\n       * A flag to indicate that benchmark cycles will execute asynchronously\n       * by default.\n       *\n       * @memberOf Benchmark.options\n       * @type Boolean\n       */\n      'async': false,\n\n      /**\n       * A flag to indicate that the benchmark clock is deferred.\n       *\n       * @memberOf Benchmark.options\n       * @type Boolean\n       */\n      'defer': false,\n\n      /**\n       * The delay between test cycles (secs).\n       * @memberOf Benchmark.options\n       * @type Number\n       */\n      'delay': 0.005,\n\n      /**\n       * Displayed by Benchmark#toString when a `name` is not available\n       * (auto-generated if absent).\n       *\n       * @memberOf Benchmark.options\n       * @type String\n       */\n      'id': undefined,\n\n      /**\n       * The default number of times to execute a test on a benchmark's first cycle.\n       *\n       * @memberOf Benchmark.options\n       * @type Number\n       */\n      'initCount': 1,\n\n      /**\n       * The maximum time a benchmark is allowed to run before finishing (secs).\n       *\n       * Note: Cycle delays aren't counted toward the maximum time.\n       *\n       * @memberOf Benchmark.options\n       * @type Number\n       */\n      'maxTime': 5,\n\n      /**\n       * The minimum sample size required to perform statistical analysis.\n       *\n       * @memberOf Benchmark.options\n       * @type Number\n       */\n      'minSamples': 5,\n\n      /**\n       * The time needed to reduce the percent uncertainty of measurement to 1% (secs).\n       *\n       * @memberOf Benchmark.options\n       * @type Number\n       */\n      'minTime': 0,\n\n      /**\n       * The name of the benchmark.\n       *\n       * @memberOf Benchmark.options\n       * @type String\n       */\n      'name': undefined,\n\n      /**\n       * An event listener called when the benchmark is aborted.\n       *\n       * @memberOf Benchmark.options\n       * @type Function\n       */\n      'onAbort': undefined,\n\n      /**\n       * An event listener called when the benchmark completes running.\n       *\n       * @memberOf Benchmark.options\n       * @type Function\n       */\n      'onComplete': undefined,\n\n      /**\n       * An event listener called after each run cycle.\n       *\n       * @memberOf Benchmark.options\n       * @type Function\n       */\n      'onCycle': undefined,\n\n      /**\n       * An event listener called when a test errors.\n       *\n       * @memberOf Benchmark.options\n       * @type Function\n       */\n      'onError': undefined,\n\n      /**\n       * An event listener called when the benchmark is reset.\n       *\n       * @memberOf Benchmark.options\n       * @type Function\n       */\n      'onReset': undefined,\n\n      /**\n       * An event listener called when the benchmark starts running.\n       *\n       * @memberOf Benchmark.options\n       * @type Function\n       */\n      'onStart': undefined\n    },\n\n    /**\n     * Platform object with properties describing things like browser name,\n     * version, and operating system.\n     *\n     * @static\n     * @memberOf Benchmark\n     * @type Object\n     */\n    'platform': req('platform') || window.platform || {\n\n      /**\n       * The platform description.\n       *\n       * @memberOf Benchmark.platform\n       * @type String\n       */\n      'description': window.navigator && navigator.userAgent || null,\n\n      /**\n       * The name of the browser layout engine.\n       *\n       * @memberOf Benchmark.platform\n       * @type String|Null\n       */\n      'layout': null,\n\n      /**\n       * The name of the product hosting the browser.\n       *\n       * @memberOf Benchmark.platform\n       * @type String|Null\n       */\n      'product': null,\n\n      /**\n       * The name of the browser/environment.\n       *\n       * @memberOf Benchmark.platform\n       * @type String|Null\n       */\n      'name': null,\n\n      /**\n       * The name of the product's manufacturer.\n       *\n       * @memberOf Benchmark.platform\n       * @type String|Null\n       */\n      'manufacturer': null,\n\n      /**\n       * The name of the operating system.\n       *\n       * @memberOf Benchmark.platform\n       * @type String|Null\n       */\n      'os': null,\n\n      /**\n       * The alpha/beta release indicator.\n       *\n       * @memberOf Benchmark.platform\n       * @type String|Null\n       */\n      'prerelease': null,\n\n      /**\n       * The browser/environment version.\n       *\n       * @memberOf Benchmark.platform\n       * @type String|Null\n       */\n      'version': null,\n\n      /**\n       * Return platform description when the platform object is coerced to a string.\n       *\n       * @memberOf Benchmark.platform\n       * @type Function\n       * @returns {String} The platform description.\n       */\n      'toString': function() {\n        return this.description || '';\n      }\n    },\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf Benchmark\n     * @type String\n     */\n    'version': '1.0.0',\n\n    // an object of environment/feature detection flags\n    'support': support,\n\n    // clone objects\n    'deepClone': deepClone,\n\n    // iteration utility\n    'each': each,\n\n    // augment objects\n    'extend': extend,\n\n    // generic Array#filter\n    'filter': filter,\n\n    // generic Array#forEach\n    'forEach': forEach,\n\n    // generic own property iteration utility\n    'forOwn': forOwn,\n\n    // converts a number to a comma-separated string\n    'formatNumber': formatNumber,\n\n    // generic Object#hasOwnProperty\n    // (trigger hasKey's lazy define before assigning it to Benchmark)\n    'hasKey': (hasKey(Benchmark, ''), hasKey),\n\n    // generic Array#indexOf\n    'indexOf': indexOf,\n\n    // template utility\n    'interpolate': interpolate,\n\n    // invokes a method on each item in an array\n    'invoke': invoke,\n\n    // generic Array#join for arrays and objects\n    'join': join,\n\n    // generic Array#map\n    'map': map,\n\n    // retrieves a property value from each item in an array\n    'pluck': pluck,\n\n    // generic Array#reduce\n    'reduce': reduce\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  extend(Benchmark.prototype, {\n\n    /**\n     * The number of times a test was executed.\n     *\n     * @memberOf Benchmark\n     * @type Number\n     */\n    'count': 0,\n\n    /**\n     * The number of cycles performed while benchmarking.\n     *\n     * @memberOf Benchmark\n     * @type Number\n     */\n    'cycles': 0,\n\n    /**\n     * The number of executions per second.\n     *\n     * @memberOf Benchmark\n     * @type Number\n     */\n    'hz': 0,\n\n    /**\n     * The compiled test function.\n     *\n     * @memberOf Benchmark\n     * @type Function|String\n     */\n    'compiled': undefined,\n\n    /**\n     * The error object if the test failed.\n     *\n     * @memberOf Benchmark\n     * @type Object\n     */\n    'error': undefined,\n\n    /**\n     * The test to benchmark.\n     *\n     * @memberOf Benchmark\n     * @type Function|String\n     */\n    'fn': undefined,\n\n    /**\n     * A flag to indicate if the benchmark is aborted.\n     *\n     * @memberOf Benchmark\n     * @type Boolean\n     */\n    'aborted': false,\n\n    /**\n     * A flag to indicate if the benchmark is running.\n     *\n     * @memberOf Benchmark\n     * @type Boolean\n     */\n    'running': false,\n\n    /**\n     * Compiled into the test and executed immediately **before** the test loop.\n     *\n     * @memberOf Benchmark\n     * @type Function|String\n     * @example\n     *\n     * // basic usage\n     * var bench = Benchmark({\n     *   'setup': function() {\n     *     var c = this.count,\n     *         element = document.getElementById('container');\n     *     while (c--) {\n     *       element.appendChild(document.createElement('div'));\n     *     }\n     *   },\n     *   'fn': function() {\n     *     element.removeChild(element.lastChild);\n     *   }\n     * });\n     *\n     * // compiles to something like:\n     * var c = this.count,\n     *     element = document.getElementById('container');\n     * while (c--) {\n     *   element.appendChild(document.createElement('div'));\n     * }\n     * var start = new Date;\n     * while (count--) {\n     *   element.removeChild(element.lastChild);\n     * }\n     * var end = new Date - start;\n     *\n     * // or using strings\n     * var bench = Benchmark({\n     *   'setup': '\\\n     *     var a = 0;\\n\\\n     *     (function() {\\n\\\n     *       (function() {\\n\\\n     *         (function() {',\n     *   'fn': 'a += 1;',\n     *   'teardown': '\\\n     *          }())\\n\\\n     *        }())\\n\\\n     *      }())'\n     * });\n     *\n     * // compiles to something like:\n     * var a = 0;\n     * (function() {\n     *   (function() {\n     *     (function() {\n     *       var start = new Date;\n     *       while (count--) {\n     *         a += 1;\n     *       }\n     *       var end = new Date - start;\n     *     }())\n     *   }())\n     * }())\n     */\n    'setup': noop,\n\n    /**\n     * Compiled into the test and executed immediately **after** the test loop.\n     *\n     * @memberOf Benchmark\n     * @type Function|String\n     */\n    'teardown': noop,\n\n    /**\n     * An object of stats including mean, margin or error, and standard deviation.\n     *\n     * @memberOf Benchmark\n     * @type Object\n     */\n    'stats': {\n\n      /**\n       * The margin of error.\n       *\n       * @memberOf Benchmark#stats\n       * @type Number\n       */\n      'moe': 0,\n\n      /**\n       * The relative margin of error (expressed as a percentage of the mean).\n       *\n       * @memberOf Benchmark#stats\n       * @type Number\n       */\n      'rme': 0,\n\n      /**\n       * The standard error of the mean.\n       *\n       * @memberOf Benchmark#stats\n       * @type Number\n       */\n      'sem': 0,\n\n      /**\n       * The sample standard deviation.\n       *\n       * @memberOf Benchmark#stats\n       * @type Number\n       */\n      'deviation': 0,\n\n      /**\n       * The sample arithmetic mean.\n       *\n       * @memberOf Benchmark#stats\n       * @type Number\n       */\n      'mean': 0,\n\n      /**\n       * The array of sampled periods.\n       *\n       * @memberOf Benchmark#stats\n       * @type Array\n       */\n      'sample': [],\n\n      /**\n       * The sample variance.\n       *\n       * @memberOf Benchmark#stats\n       * @type Number\n       */\n      'variance': 0\n    },\n\n    /**\n     * An object of timing data including cycle, elapsed, period, start, and stop.\n     *\n     * @memberOf Benchmark\n     * @type Object\n     */\n    'times': {\n\n      /**\n       * The time taken to complete the last cycle (secs).\n       *\n       * @memberOf Benchmark#times\n       * @type Number\n       */\n      'cycle': 0,\n\n      /**\n       * The time taken to complete the benchmark (secs).\n       *\n       * @memberOf Benchmark#times\n       * @type Number\n       */\n      'elapsed': 0,\n\n      /**\n       * The time taken to execute the test once (secs).\n       *\n       * @memberOf Benchmark#times\n       * @type Number\n       */\n      'period': 0,\n\n      /**\n       * A timestamp of when the benchmark started (ms).\n       *\n       * @memberOf Benchmark#times\n       * @type Number\n       */\n      'timeStamp': 0\n    },\n\n    // aborts benchmark (does not record times)\n    'abort': abort,\n\n    // creates a new benchmark using the same test and options\n    'clone': clone,\n\n    // compares benchmark's hertz with another\n    'compare': compare,\n\n    // executes listeners\n    'emit': emit,\n\n    // get listeners\n    'listeners': listeners,\n\n    // unregister listeners\n    'off': off,\n\n    // register listeners\n    'on': on,\n\n    // reset benchmark properties\n    'reset': reset,\n\n    // runs the benchmark\n    'run': run,\n\n    // pretty print benchmark info\n    'toString': toStringBench\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  extend(Deferred.prototype, {\n\n    /**\n     * The deferred benchmark instance.\n     *\n     * @memberOf Benchmark.Deferred\n     * @type Object\n     */\n    'benchmark': null,\n\n    /**\n     * The number of deferred cycles performed while benchmarking.\n     *\n     * @memberOf Benchmark.Deferred\n     * @type Number\n     */\n    'cycles': 0,\n\n    /**\n     * The time taken to complete the deferred benchmark (secs).\n     *\n     * @memberOf Benchmark.Deferred\n     * @type Number\n     */\n    'elapsed': 0,\n\n    /**\n     * A timestamp of when the deferred benchmark started (ms).\n     *\n     * @memberOf Benchmark.Deferred\n     * @type Number\n     */\n    'timeStamp': 0,\n\n    // cycles/completes the deferred benchmark\n    'resolve': resolve\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  extend(Event.prototype, {\n\n    /**\n     * A flag to indicate if the emitters listener iteration is aborted.\n     *\n     * @memberOf Benchmark.Event\n     * @type Boolean\n     */\n    'aborted': false,\n\n    /**\n     * A flag to indicate if the default action is cancelled.\n     *\n     * @memberOf Benchmark.Event\n     * @type Boolean\n     */\n    'cancelled': false,\n\n    /**\n     * The object whose listeners are currently being processed.\n     *\n     * @memberOf Benchmark.Event\n     * @type Object\n     */\n    'currentTarget': undefined,\n\n    /**\n     * The return value of the last executed listener.\n     *\n     * @memberOf Benchmark.Event\n     * @type Mixed\n     */\n    'result': undefined,\n\n    /**\n     * The object to which the event was originally emitted.\n     *\n     * @memberOf Benchmark.Event\n     * @type Object\n     */\n    'target': undefined,\n\n    /**\n     * A timestamp of when the event was created (ms).\n     *\n     * @memberOf Benchmark.Event\n     * @type Number\n     */\n    'timeStamp': 0,\n\n    /**\n     * The event type.\n     *\n     * @memberOf Benchmark.Event\n     * @type String\n     */\n    'type': ''\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * The default options copied by suite instances.\n   *\n   * @static\n   * @memberOf Benchmark.Suite\n   * @type Object\n   */\n  Suite.options = {\n\n    /**\n     * The name of the suite.\n     *\n     * @memberOf Benchmark.Suite.options\n     * @type String\n     */\n    'name': undefined\n  };\n\n  /*--------------------------------------------------------------------------*/\n\n  extend(Suite.prototype, {\n\n    /**\n     * The number of benchmarks in the suite.\n     *\n     * @memberOf Benchmark.Suite\n     * @type Number\n     */\n    'length': 0,\n\n    /**\n     * A flag to indicate if the suite is aborted.\n     *\n     * @memberOf Benchmark.Suite\n     * @type Boolean\n     */\n    'aborted': false,\n\n    /**\n     * A flag to indicate if the suite is running.\n     *\n     * @memberOf Benchmark.Suite\n     * @type Boolean\n     */\n    'running': false,\n\n    /**\n     * An `Array#forEach` like method.\n     * Callbacks may terminate the loop by explicitly returning `false`.\n     *\n     * @memberOf Benchmark.Suite\n     * @param {Function} callback The function called per iteration.\n     * @returns {Object} The suite iterated over.\n     */\n    'forEach': methodize(forEach),\n\n    /**\n     * An `Array#indexOf` like method.\n     *\n     * @memberOf Benchmark.Suite\n     * @param {Mixed} value The value to search for.\n     * @returns {Number} The index of the matched value or `-1`.\n     */\n    'indexOf': methodize(indexOf),\n\n    /**\n     * Invokes a method on all benchmarks in the suite.\n     *\n     * @memberOf Benchmark.Suite\n     * @param {String|Object} name The name of the method to invoke OR options object.\n     * @param {Mixed} [arg1, arg2, ...] Arguments to invoke the method with.\n     * @returns {Array} A new array of values returned from each method invoked.\n     */\n    'invoke': methodize(invoke),\n\n    /**\n     * Converts the suite of benchmarks to a string.\n     *\n     * @memberOf Benchmark.Suite\n     * @param {String} [separator=','] A string to separate each element of the array.\n     * @returns {String} The string.\n     */\n    'join': [].join,\n\n    /**\n     * An `Array#map` like method.\n     *\n     * @memberOf Benchmark.Suite\n     * @param {Function} callback The function called per iteration.\n     * @returns {Array} A new array of values returned by the callback.\n     */\n    'map': methodize(map),\n\n    /**\n     * Retrieves the value of a specified property from all benchmarks in the suite.\n     *\n     * @memberOf Benchmark.Suite\n     * @param {String} property The property to pluck.\n     * @returns {Array} A new array of property values.\n     */\n    'pluck': methodize(pluck),\n\n    /**\n     * Removes the last benchmark from the suite and returns it.\n     *\n     * @memberOf Benchmark.Suite\n     * @returns {Mixed} The removed benchmark.\n     */\n    'pop': [].pop,\n\n    /**\n     * Appends benchmarks to the suite.\n     *\n     * @memberOf Benchmark.Suite\n     * @returns {Number} The suite's new length.\n     */\n    'push': [].push,\n\n    /**\n     * Sorts the benchmarks of the suite.\n     *\n     * @memberOf Benchmark.Suite\n     * @param {Function} [compareFn=null] A function that defines the sort order.\n     * @returns {Object} The sorted suite.\n     */\n    'sort': [].sort,\n\n    /**\n     * An `Array#reduce` like method.\n     *\n     * @memberOf Benchmark.Suite\n     * @param {Function} callback The function called per iteration.\n     * @param {Mixed} accumulator Initial value of the accumulator.\n     * @returns {Mixed} The accumulator.\n     */\n    'reduce': methodize(reduce),\n\n    // aborts all benchmarks in the suite\n    'abort': abortSuite,\n\n    // adds a benchmark to the suite\n    'add': add,\n\n    // creates a new suite with cloned benchmarks\n    'clone': cloneSuite,\n\n    // executes listeners of a specified type\n    'emit': emit,\n\n    // creates a new suite of filtered benchmarks\n    'filter': filterSuite,\n\n    // get listeners\n    'listeners': listeners,\n\n    // unregister listeners\n    'off': off,\n\n   // register listeners\n    'on': on,\n\n    // resets all benchmarks in the suite\n    'reset': resetSuite,\n\n    // runs all benchmarks in the suite\n    'run': runSuite,\n\n    // array methods\n    'concat': concat,\n\n    'reverse': reverse,\n\n    'shift': shift,\n\n    'slice': slice,\n\n    'splice': splice,\n\n    'unshift': unshift\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  // expose Deferred, Event and Suite\n  extend(Benchmark, {\n    'Deferred': Deferred,\n    'Event': Event,\n    'Suite': Suite\n  });\n\n  // expose Benchmark\n  // some AMD build optimizers, like r.js, check for specific condition patterns like the following:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // define as an anonymous module so, through path mapping, it can be aliased\n    define(function() {\n      return Benchmark;\n    });\n  }\n  // check for `exports` after `define` in case a build optimizer adds an `exports` object\n  else if (freeExports) {\n    // in Node.js or RingoJS v0.8.0+\n    if (typeof module == 'object' && module && module.exports == freeExports) {\n      (module.exports = Benchmark).Benchmark = Benchmark;\n    }\n    // in Narwhal or RingoJS v0.7.0-\n    else {\n      freeExports.Benchmark = Benchmark;\n    }\n  }\n  // in a browser or Rhino\n  else {\n    // use square bracket notation so Closure Compiler won't munge `Benchmark`\n    // http://code.google.com/closure/compiler/docs/api-tutorial3.html#export\n    window['Benchmark'] = Benchmark;\n  }\n\n  // trigger clock's lazy define early to avoid a security error\n  if (support.air) {\n    clock({ '_original': { 'fn': noop, 'count': 1, 'options': {} } });\n  }\n}(this));\n"
  },
  {
    "path": "tests/perf/vendor/rsvp-latest.js",
    "content": "/*!\n * @overview RSVP - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors\n * @license   Licensed under MIT license\n *            See https://raw.githubusercontent.com/tildeio/rsvp.js/master/LICENSE\n * @version   3.0.18\n */\n\n(function() {\n    \"use strict\";\n    function lib$rsvp$utils$$objectOrFunction(x) {\n      return typeof x === 'function' || (typeof x === 'object' && x !== null);\n    }\n\n    function lib$rsvp$utils$$isFunction(x) {\n      return typeof x === 'function';\n    }\n\n    function lib$rsvp$utils$$isMaybeThenable(x) {\n      return typeof x === 'object' && x !== null;\n    }\n\n    var lib$rsvp$utils$$_isArray;\n    if (!Array.isArray) {\n      lib$rsvp$utils$$_isArray = function (x) {\n        return Object.prototype.toString.call(x) === '[object Array]';\n      };\n    } else {\n      lib$rsvp$utils$$_isArray = Array.isArray;\n    }\n\n    var lib$rsvp$utils$$isArray = lib$rsvp$utils$$_isArray;\n\n    var lib$rsvp$utils$$now = Date.now || function() { return new Date().getTime(); };\n\n    function lib$rsvp$utils$$F() { }\n\n    var lib$rsvp$utils$$o_create = (Object.create || function (o) {\n      if (arguments.length > 1) {\n        throw new Error('Second argument not supported');\n      }\n      if (typeof o !== 'object') {\n        throw new TypeError('Argument must be an object');\n      }\n      lib$rsvp$utils$$F.prototype = o;\n      return new lib$rsvp$utils$$F();\n    });\n    function lib$rsvp$events$$indexOf(callbacks, callback) {\n      for (var i=0, l=callbacks.length; i<l; i++) {\n        if (callbacks[i] === callback) { return i; }\n      }\n\n      return -1;\n    }\n\n    function lib$rsvp$events$$callbacksFor(object) {\n      var callbacks = object._promiseCallbacks;\n\n      if (!callbacks) {\n        callbacks = object._promiseCallbacks = {};\n      }\n\n      return callbacks;\n    }\n\n    var lib$rsvp$events$$default = {\n\n      /**\n        `RSVP.EventTarget.mixin` extends an object with EventTarget methods. For\n        Example:\n\n        ```javascript\n        var object = {};\n\n        RSVP.EventTarget.mixin(object);\n\n        object.on('finished', function(event) {\n          // handle event\n        });\n\n        object.trigger('finished', { detail: value });\n        ```\n\n        `EventTarget.mixin` also works with prototypes:\n\n        ```javascript\n        var Person = function() {};\n        RSVP.EventTarget.mixin(Person.prototype);\n\n        var yehuda = new Person();\n        var tom = new Person();\n\n        yehuda.on('poke', function(event) {\n          console.log('Yehuda says OW');\n        });\n\n        tom.on('poke', function(event) {\n          console.log('Tom says OW');\n        });\n\n        yehuda.trigger('poke');\n        tom.trigger('poke');\n        ```\n\n        @method mixin\n        @for RSVP.EventTarget\n        @private\n        @param {Object} object object to extend with EventTarget methods\n      */\n      'mixin': function(object) {\n        object['on']      = this['on'];\n        object['off']     = this['off'];\n        object['trigger'] = this['trigger'];\n        object._promiseCallbacks = undefined;\n        return object;\n      },\n\n      /**\n        Registers a callback to be executed when `eventName` is triggered\n\n        ```javascript\n        object.on('event', function(eventInfo){\n          // handle the event\n        });\n\n        object.trigger('event');\n        ```\n\n        @method on\n        @for RSVP.EventTarget\n        @private\n        @param {String} eventName name of the event to listen for\n        @param {Function} callback function to be called when the event is triggered.\n      */\n      'on': function(eventName, callback) {\n        var allCallbacks = lib$rsvp$events$$callbacksFor(this), callbacks;\n\n        callbacks = allCallbacks[eventName];\n\n        if (!callbacks) {\n          callbacks = allCallbacks[eventName] = [];\n        }\n\n        if (lib$rsvp$events$$indexOf(callbacks, callback) === -1) {\n          callbacks.push(callback);\n        }\n      },\n\n      /**\n        You can use `off` to stop firing a particular callback for an event:\n\n        ```javascript\n        function doStuff() { // do stuff! }\n        object.on('stuff', doStuff);\n\n        object.trigger('stuff'); // doStuff will be called\n\n        // Unregister ONLY the doStuff callback\n        object.off('stuff', doStuff);\n        object.trigger('stuff'); // doStuff will NOT be called\n        ```\n\n        If you don't pass a `callback` argument to `off`, ALL callbacks for the\n        event will not be executed when the event fires. For example:\n\n        ```javascript\n        var callback1 = function(){};\n        var callback2 = function(){};\n\n        object.on('stuff', callback1);\n        object.on('stuff', callback2);\n\n        object.trigger('stuff'); // callback1 and callback2 will be executed.\n\n        object.off('stuff');\n        object.trigger('stuff'); // callback1 and callback2 will not be executed!\n        ```\n\n        @method off\n        @for RSVP.EventTarget\n        @private\n        @param {String} eventName event to stop listening to\n        @param {Function} callback optional argument. If given, only the function\n        given will be removed from the event's callback queue. If no `callback`\n        argument is given, all callbacks will be removed from the event's callback\n        queue.\n      */\n      'off': function(eventName, callback) {\n        var allCallbacks = lib$rsvp$events$$callbacksFor(this), callbacks, index;\n\n        if (!callback) {\n          allCallbacks[eventName] = [];\n          return;\n        }\n\n        callbacks = allCallbacks[eventName];\n\n        index = lib$rsvp$events$$indexOf(callbacks, callback);\n\n        if (index !== -1) { callbacks.splice(index, 1); }\n      },\n\n      /**\n        Use `trigger` to fire custom events. For example:\n\n        ```javascript\n        object.on('foo', function(){\n          console.log('foo event happened!');\n        });\n        object.trigger('foo');\n        // 'foo event happened!' logged to the console\n        ```\n\n        You can also pass a value as a second argument to `trigger` that will be\n        passed as an argument to all event listeners for the event:\n\n        ```javascript\n        object.on('foo', function(value){\n          console.log(value.name);\n        });\n\n        object.trigger('foo', { name: 'bar' });\n        // 'bar' logged to the console\n        ```\n\n        @method trigger\n        @for RSVP.EventTarget\n        @private\n        @param {String} eventName name of the event to be triggered\n        @param {Any} options optional value to be passed to any event handlers for\n        the given `eventName`\n      */\n      'trigger': function(eventName, options) {\n        var allCallbacks = lib$rsvp$events$$callbacksFor(this), callbacks, callback;\n\n        if (callbacks = allCallbacks[eventName]) {\n          // Don't cache the callbacks.length since it may grow\n          for (var i=0; i<callbacks.length; i++) {\n            callback = callbacks[i];\n\n            callback(options);\n          }\n        }\n      }\n    };\n\n    var lib$rsvp$config$$config = {\n      instrument: false\n    };\n\n    lib$rsvp$events$$default['mixin'](lib$rsvp$config$$config);\n\n    function lib$rsvp$config$$configure(name, value) {\n      if (name === 'onerror') {\n        // handle for legacy users that expect the actual\n        // error to be passed to their function added via\n        // `RSVP.configure('onerror', someFunctionHere);`\n        lib$rsvp$config$$config['on']('error', value);\n        return;\n      }\n\n      if (arguments.length === 2) {\n        lib$rsvp$config$$config[name] = value;\n      } else {\n        return lib$rsvp$config$$config[name];\n      }\n    }\n\n    var lib$rsvp$instrument$$queue = [];\n\n    function lib$rsvp$instrument$$scheduleFlush() {\n      setTimeout(function() {\n        var entry;\n        for (var i = 0; i < lib$rsvp$instrument$$queue.length; i++) {\n          entry = lib$rsvp$instrument$$queue[i];\n\n          var payload = entry.payload;\n\n          payload.guid = payload.key + payload.id;\n          payload.childGuid = payload.key + payload.childId;\n          if (payload.error) {\n            payload.stack = payload.error.stack;\n          }\n\n          lib$rsvp$config$$config['trigger'](entry.name, entry.payload);\n        }\n        lib$rsvp$instrument$$queue.length = 0;\n      }, 50);\n    }\n\n    function lib$rsvp$instrument$$instrument(eventName, promise, child) {\n      if (1 === lib$rsvp$instrument$$queue.push({\n        name: eventName,\n        payload: {\n          key: promise._guidKey,\n          id:  promise._id,\n          eventName: eventName,\n          detail: promise._result,\n          childId: child && child._id,\n          label: promise._label,\n          timeStamp: lib$rsvp$utils$$now(),\n          error: lib$rsvp$config$$config[\"instrument-with-stack\"] ? new Error(promise._label) : null\n        }})) {\n          lib$rsvp$instrument$$scheduleFlush();\n        }\n      }\n    var lib$rsvp$instrument$$default = lib$rsvp$instrument$$instrument;\n\n    function  lib$rsvp$$internal$$withOwnPromise() {\n      return new TypeError('A promises callback cannot return that same promise.');\n    }\n\n    function lib$rsvp$$internal$$noop() {}\n\n    var lib$rsvp$$internal$$PENDING   = void 0;\n    var lib$rsvp$$internal$$FULFILLED = 1;\n    var lib$rsvp$$internal$$REJECTED  = 2;\n\n    var lib$rsvp$$internal$$GET_THEN_ERROR = new lib$rsvp$$internal$$ErrorObject();\n\n    function lib$rsvp$$internal$$getThen(promise) {\n      try {\n        return promise.then;\n      } catch(error) {\n        lib$rsvp$$internal$$GET_THEN_ERROR.error = error;\n        return lib$rsvp$$internal$$GET_THEN_ERROR;\n      }\n    }\n\n    function lib$rsvp$$internal$$tryThen(then, value, fulfillmentHandler, rejectionHandler) {\n      try {\n        then.call(value, fulfillmentHandler, rejectionHandler);\n      } catch(e) {\n        return e;\n      }\n    }\n\n    function lib$rsvp$$internal$$handleForeignThenable(promise, thenable, then) {\n      lib$rsvp$config$$config.async(function(promise) {\n        var sealed = false;\n        var error = lib$rsvp$$internal$$tryThen(then, thenable, function(value) {\n          if (sealed) { return; }\n          sealed = true;\n          if (thenable !== value) {\n            lib$rsvp$$internal$$resolve(promise, value);\n          } else {\n            lib$rsvp$$internal$$fulfill(promise, value);\n          }\n        }, function(reason) {\n          if (sealed) { return; }\n          sealed = true;\n\n          lib$rsvp$$internal$$reject(promise, reason);\n        }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n        if (!sealed && error) {\n          sealed = true;\n          lib$rsvp$$internal$$reject(promise, error);\n        }\n      }, promise);\n    }\n\n    function lib$rsvp$$internal$$handleOwnThenable(promise, thenable) {\n      if (thenable._state === lib$rsvp$$internal$$FULFILLED) {\n        lib$rsvp$$internal$$fulfill(promise, thenable._result);\n      } else if (thenable._state === lib$rsvp$$internal$$REJECTED) {\n        thenable._onError = null;\n        lib$rsvp$$internal$$reject(promise, thenable._result);\n      } else {\n        lib$rsvp$$internal$$subscribe(thenable, undefined, function(value) {\n          if (thenable !== value) {\n            lib$rsvp$$internal$$resolve(promise, value);\n          } else {\n            lib$rsvp$$internal$$fulfill(promise, value);\n          }\n        }, function(reason) {\n          lib$rsvp$$internal$$reject(promise, reason);\n        });\n      }\n    }\n\n    function lib$rsvp$$internal$$handleMaybeThenable(promise, maybeThenable) {\n      if (maybeThenable.constructor === promise.constructor) {\n        lib$rsvp$$internal$$handleOwnThenable(promise, maybeThenable);\n      } else {\n        var then = lib$rsvp$$internal$$getThen(maybeThenable);\n\n        if (then === lib$rsvp$$internal$$GET_THEN_ERROR) {\n          lib$rsvp$$internal$$reject(promise, lib$rsvp$$internal$$GET_THEN_ERROR.error);\n        } else if (then === undefined) {\n          lib$rsvp$$internal$$fulfill(promise, maybeThenable);\n        } else if (lib$rsvp$utils$$isFunction(then)) {\n          lib$rsvp$$internal$$handleForeignThenable(promise, maybeThenable, then);\n        } else {\n          lib$rsvp$$internal$$fulfill(promise, maybeThenable);\n        }\n      }\n    }\n\n    function lib$rsvp$$internal$$resolve(promise, value) {\n      if (promise === value) {\n        lib$rsvp$$internal$$fulfill(promise, value);\n      } else if (lib$rsvp$utils$$objectOrFunction(value)) {\n        lib$rsvp$$internal$$handleMaybeThenable(promise, value);\n      } else {\n        lib$rsvp$$internal$$fulfill(promise, value);\n      }\n    }\n\n    function lib$rsvp$$internal$$publishRejection(promise) {\n      if (promise._onError) {\n        promise._onError(promise._result);\n      }\n\n      lib$rsvp$$internal$$publish(promise);\n    }\n\n    function lib$rsvp$$internal$$fulfill(promise, value) {\n      if (promise._state !== lib$rsvp$$internal$$PENDING) { return; }\n\n      promise._result = value;\n      promise._state = lib$rsvp$$internal$$FULFILLED;\n\n      if (promise._subscribers.length === 0) {\n        if (lib$rsvp$config$$config.instrument) {\n          lib$rsvp$instrument$$default('fulfilled', promise);\n        }\n      } else {\n        lib$rsvp$config$$config.async(lib$rsvp$$internal$$publish, promise);\n      }\n    }\n\n    function lib$rsvp$$internal$$reject(promise, reason) {\n      if (promise._state !== lib$rsvp$$internal$$PENDING) { return; }\n      promise._state = lib$rsvp$$internal$$REJECTED;\n      promise._result = reason;\n      lib$rsvp$config$$config.async(lib$rsvp$$internal$$publishRejection, promise);\n    }\n\n    function lib$rsvp$$internal$$subscribe(parent, child, onFulfillment, onRejection) {\n      var subscribers = parent._subscribers;\n      var length = subscribers.length;\n\n      parent._onError = null;\n\n      subscribers[length] = child;\n      subscribers[length + lib$rsvp$$internal$$FULFILLED] = onFulfillment;\n      subscribers[length + lib$rsvp$$internal$$REJECTED]  = onRejection;\n\n      if (length === 0 && parent._state) {\n        lib$rsvp$config$$config.async(lib$rsvp$$internal$$publish, parent);\n      }\n    }\n\n    function lib$rsvp$$internal$$publish(promise) {\n      var subscribers = promise._subscribers;\n      var settled = promise._state;\n\n      if (lib$rsvp$config$$config.instrument) {\n        lib$rsvp$instrument$$default(settled === lib$rsvp$$internal$$FULFILLED ? 'fulfilled' : 'rejected', promise);\n      }\n\n      if (subscribers.length === 0) { return; }\n\n      var child, callback, detail = promise._result;\n\n      for (var i = 0; i < subscribers.length; i += 3) {\n        child = subscribers[i];\n        callback = subscribers[i + settled];\n\n        if (child) {\n          lib$rsvp$$internal$$invokeCallback(settled, child, callback, detail);\n        } else {\n          callback(detail);\n        }\n      }\n\n      promise._subscribers.length = 0;\n    }\n\n    function lib$rsvp$$internal$$ErrorObject() {\n      this.error = null;\n    }\n\n    var lib$rsvp$$internal$$TRY_CATCH_ERROR = new lib$rsvp$$internal$$ErrorObject();\n\n    function lib$rsvp$$internal$$tryCatch(callback, detail) {\n      try {\n        return callback(detail);\n      } catch(e) {\n        lib$rsvp$$internal$$TRY_CATCH_ERROR.error = e;\n        return lib$rsvp$$internal$$TRY_CATCH_ERROR;\n      }\n    }\n\n    function lib$rsvp$$internal$$invokeCallback(settled, promise, callback, detail) {\n      var hasCallback = lib$rsvp$utils$$isFunction(callback),\n          value, error, succeeded, failed;\n\n      if (hasCallback) {\n        value = lib$rsvp$$internal$$tryCatch(callback, detail);\n\n        if (value === lib$rsvp$$internal$$TRY_CATCH_ERROR) {\n          failed = true;\n          error = value.error;\n          value = null;\n        } else {\n          succeeded = true;\n        }\n\n        if (promise === value) {\n          lib$rsvp$$internal$$reject(promise, lib$rsvp$$internal$$withOwnPromise());\n          return;\n        }\n\n      } else {\n        value = detail;\n        succeeded = true;\n      }\n\n      if (promise._state !== lib$rsvp$$internal$$PENDING) {\n        // noop\n      } else if (hasCallback && succeeded) {\n        lib$rsvp$$internal$$resolve(promise, value);\n      } else if (failed) {\n        lib$rsvp$$internal$$reject(promise, error);\n      } else if (settled === lib$rsvp$$internal$$FULFILLED) {\n        lib$rsvp$$internal$$fulfill(promise, value);\n      } else if (settled === lib$rsvp$$internal$$REJECTED) {\n        lib$rsvp$$internal$$reject(promise, value);\n      }\n    }\n\n    function lib$rsvp$$internal$$initializePromise(promise, resolver) {\n      var resolved = false;\n      try {\n        resolver(function resolvePromise(value){\n          if (resolved) { return; }\n          resolved = true;\n          lib$rsvp$$internal$$resolve(promise, value);\n        }, function rejectPromise(reason) {\n          if (resolved) { return; }\n          resolved = true;\n          lib$rsvp$$internal$$reject(promise, reason);\n        });\n      } catch(e) {\n        lib$rsvp$$internal$$reject(promise, e);\n      }\n    }\n\n    function lib$rsvp$enumerator$$makeSettledResult(state, position, value) {\n      if (state === lib$rsvp$$internal$$FULFILLED) {\n        return {\n          state: 'fulfilled',\n          value: value\n        };\n      } else {\n         return {\n          state: 'rejected',\n          reason: value\n        };\n      }\n    }\n\n    function lib$rsvp$enumerator$$Enumerator(Constructor, input, abortOnReject, label) {\n      var enumerator = this;\n\n      enumerator._instanceConstructor = Constructor;\n      enumerator.promise = new Constructor(lib$rsvp$$internal$$noop, label);\n      enumerator._abortOnReject = abortOnReject;\n\n      if (enumerator._validateInput(input)) {\n        enumerator._input     = input;\n        enumerator.length     = input.length;\n        enumerator._remaining = input.length;\n\n        enumerator._init();\n\n        if (enumerator.length === 0) {\n          lib$rsvp$$internal$$fulfill(enumerator.promise, enumerator._result);\n        } else {\n          enumerator.length = enumerator.length || 0;\n          enumerator._enumerate();\n          if (enumerator._remaining === 0) {\n            lib$rsvp$$internal$$fulfill(enumerator.promise, enumerator._result);\n          }\n        }\n      } else {\n        lib$rsvp$$internal$$reject(enumerator.promise, enumerator._validationError());\n      }\n    }\n\n    var lib$rsvp$enumerator$$default = lib$rsvp$enumerator$$Enumerator;\n\n    lib$rsvp$enumerator$$Enumerator.prototype._validateInput = function(input) {\n      return lib$rsvp$utils$$isArray(input);\n    };\n\n    lib$rsvp$enumerator$$Enumerator.prototype._validationError = function() {\n      return new Error('Array Methods must be provided an Array');\n    };\n\n    lib$rsvp$enumerator$$Enumerator.prototype._init = function() {\n      this._result = new Array(this.length);\n    };\n\n    lib$rsvp$enumerator$$Enumerator.prototype._enumerate = function() {\n      var enumerator = this;\n      var length     = enumerator.length;\n      var promise    = enumerator.promise;\n      var input      = enumerator._input;\n\n      for (var i = 0; promise._state === lib$rsvp$$internal$$PENDING && i < length; i++) {\n        enumerator._eachEntry(input[i], i);\n      }\n    };\n\n    lib$rsvp$enumerator$$Enumerator.prototype._eachEntry = function(entry, i) {\n      var enumerator = this;\n      var c = enumerator._instanceConstructor;\n      if (lib$rsvp$utils$$isMaybeThenable(entry)) {\n        if (entry.constructor === c && entry._state !== lib$rsvp$$internal$$PENDING) {\n          entry._onError = null;\n          enumerator._settledAt(entry._state, i, entry._result);\n        } else {\n          enumerator._willSettleAt(c.resolve(entry), i);\n        }\n      } else {\n        enumerator._remaining--;\n        enumerator._result[i] = enumerator._makeResult(lib$rsvp$$internal$$FULFILLED, i, entry);\n      }\n    };\n\n    lib$rsvp$enumerator$$Enumerator.prototype._settledAt = function(state, i, value) {\n      var enumerator = this;\n      var promise = enumerator.promise;\n\n      if (promise._state === lib$rsvp$$internal$$PENDING) {\n        enumerator._remaining--;\n\n        if (enumerator._abortOnReject && state === lib$rsvp$$internal$$REJECTED) {\n          lib$rsvp$$internal$$reject(promise, value);\n        } else {\n          enumerator._result[i] = enumerator._makeResult(state, i, value);\n        }\n      }\n\n      if (enumerator._remaining === 0) {\n        lib$rsvp$$internal$$fulfill(promise, enumerator._result);\n      }\n    };\n\n    lib$rsvp$enumerator$$Enumerator.prototype._makeResult = function(state, i, value) {\n      return value;\n    };\n\n    lib$rsvp$enumerator$$Enumerator.prototype._willSettleAt = function(promise, i) {\n      var enumerator = this;\n\n      lib$rsvp$$internal$$subscribe(promise, undefined, function(value) {\n        enumerator._settledAt(lib$rsvp$$internal$$FULFILLED, i, value);\n      }, function(reason) {\n        enumerator._settledAt(lib$rsvp$$internal$$REJECTED, i, reason);\n      });\n    };\n    function lib$rsvp$promise$all$$all(entries, label) {\n      return new lib$rsvp$enumerator$$default(this, entries, true /* abort on reject */, label).promise;\n    }\n    var lib$rsvp$promise$all$$default = lib$rsvp$promise$all$$all;\n    function lib$rsvp$promise$race$$race(entries, label) {\n      /*jshint validthis:true */\n      var Constructor = this;\n\n      var promise = new Constructor(lib$rsvp$$internal$$noop, label);\n\n      if (!lib$rsvp$utils$$isArray(entries)) {\n        lib$rsvp$$internal$$reject(promise, new TypeError('You must pass an array to race.'));\n        return promise;\n      }\n\n      var length = entries.length;\n\n      function onFulfillment(value) {\n        lib$rsvp$$internal$$resolve(promise, value);\n      }\n\n      function onRejection(reason) {\n        lib$rsvp$$internal$$reject(promise, reason);\n      }\n\n      for (var i = 0; promise._state === lib$rsvp$$internal$$PENDING && i < length; i++) {\n        lib$rsvp$$internal$$subscribe(Constructor.resolve(entries[i]), undefined, onFulfillment, onRejection);\n      }\n\n      return promise;\n    }\n    var lib$rsvp$promise$race$$default = lib$rsvp$promise$race$$race;\n    function lib$rsvp$promise$resolve$$resolve(object, label) {\n      /*jshint validthis:true */\n      var Constructor = this;\n\n      if (object && typeof object === 'object' && object.constructor === Constructor) {\n        return object;\n      }\n\n      var promise = new Constructor(lib$rsvp$$internal$$noop, label);\n      lib$rsvp$$internal$$resolve(promise, object);\n      return promise;\n    }\n    var lib$rsvp$promise$resolve$$default = lib$rsvp$promise$resolve$$resolve;\n    function lib$rsvp$promise$reject$$reject(reason, label) {\n      /*jshint validthis:true */\n      var Constructor = this;\n      var promise = new Constructor(lib$rsvp$$internal$$noop, label);\n      lib$rsvp$$internal$$reject(promise, reason);\n      return promise;\n    }\n    var lib$rsvp$promise$reject$$default = lib$rsvp$promise$reject$$reject;\n\n    var lib$rsvp$promise$$guidKey = 'rsvp_' + lib$rsvp$utils$$now() + '-';\n    var lib$rsvp$promise$$counter = 0;\n\n    function lib$rsvp$promise$$needsResolver() {\n      throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n    }\n\n    function lib$rsvp$promise$$needsNew() {\n      throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n    }\n\n    function lib$rsvp$promise$$Promise(resolver, label) {\n      var promise = this;\n\n      promise._id = lib$rsvp$promise$$counter++;\n      promise._label = label;\n      promise._state = undefined;\n      promise._result = undefined;\n      promise._subscribers = [];\n\n      if (lib$rsvp$config$$config.instrument) {\n        lib$rsvp$instrument$$default('created', promise);\n      }\n\n      if (lib$rsvp$$internal$$noop !== resolver) {\n        if (!lib$rsvp$utils$$isFunction(resolver)) {\n          lib$rsvp$promise$$needsResolver();\n        }\n\n        if (!(promise instanceof lib$rsvp$promise$$Promise)) {\n          lib$rsvp$promise$$needsNew();\n        }\n\n        lib$rsvp$$internal$$initializePromise(promise, resolver);\n      }\n    }\n\n    var lib$rsvp$promise$$default = lib$rsvp$promise$$Promise;\n\n    // deprecated\n    lib$rsvp$promise$$Promise.cast = lib$rsvp$promise$resolve$$default;\n    lib$rsvp$promise$$Promise.all = lib$rsvp$promise$all$$default;\n    lib$rsvp$promise$$Promise.race = lib$rsvp$promise$race$$default;\n    lib$rsvp$promise$$Promise.resolve = lib$rsvp$promise$resolve$$default;\n    lib$rsvp$promise$$Promise.reject = lib$rsvp$promise$reject$$default;\n\n    lib$rsvp$promise$$Promise.prototype = {\n      constructor: lib$rsvp$promise$$Promise,\n\n      _guidKey: lib$rsvp$promise$$guidKey,\n\n      _onError: function (reason) {\n        lib$rsvp$config$$config.async(function(promise) {\n          setTimeout(function() {\n            if (promise._onError) {\n              lib$rsvp$config$$config['trigger']('error', reason);\n            }\n          }, 0);\n        }, this);\n      },\n\n    /**\n      The primary way of interacting with a promise is through its `then` method,\n      which registers callbacks to receive either a promise's eventual value or the\n      reason why the promise cannot be fulfilled.\n\n      ```js\n      findUser().then(function(user){\n        // user is available\n      }, function(reason){\n        // user is unavailable, and you are given the reason why\n      });\n      ```\n\n      Chaining\n      --------\n\n      The return value of `then` is itself a promise.  This second, 'downstream'\n      promise is resolved with the return value of the first promise's fulfillment\n      or rejection handler, or rejected if the handler throws an exception.\n\n      ```js\n      findUser().then(function (user) {\n        return user.name;\n      }, function (reason) {\n        return 'default name';\n      }).then(function (userName) {\n        // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n        // will be `'default name'`\n      });\n\n      findUser().then(function (user) {\n        throw new Error('Found user, but still unhappy');\n      }, function (reason) {\n        throw new Error('`findUser` rejected and we're unhappy');\n      }).then(function (value) {\n        // never reached\n      }, function (reason) {\n        // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n        // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n      });\n      ```\n      If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n\n      ```js\n      findUser().then(function (user) {\n        throw new PedagogicalException('Upstream error');\n      }).then(function (value) {\n        // never reached\n      }).then(function (value) {\n        // never reached\n      }, function (reason) {\n        // The `PedgagocialException` is propagated all the way down to here\n      });\n      ```\n\n      Assimilation\n      ------------\n\n      Sometimes the value you want to propagate to a downstream promise can only be\n      retrieved asynchronously. This can be achieved by returning a promise in the\n      fulfillment or rejection handler. The downstream promise will then be pending\n      until the returned promise is settled. This is called *assimilation*.\n\n      ```js\n      findUser().then(function (user) {\n        return findCommentsByAuthor(user);\n      }).then(function (comments) {\n        // The user's comments are now available\n      });\n      ```\n\n      If the assimliated promise rejects, then the downstream promise will also reject.\n\n      ```js\n      findUser().then(function (user) {\n        return findCommentsByAuthor(user);\n      }).then(function (comments) {\n        // If `findCommentsByAuthor` fulfills, we'll have the value here\n      }, function (reason) {\n        // If `findCommentsByAuthor` rejects, we'll have the reason here\n      });\n      ```\n\n      Simple Example\n      --------------\n\n      Synchronous Example\n\n      ```javascript\n      var result;\n\n      try {\n        result = findResult();\n        // success\n      } catch(reason) {\n        // failure\n      }\n      ```\n\n      Errback Example\n\n      ```js\n      findResult(function(result, err){\n        if (err) {\n          // failure\n        } else {\n          // success\n        }\n      });\n      ```\n\n      Promise Example;\n\n      ```javascript\n      findResult().then(function(result){\n        // success\n      }, function(reason){\n        // failure\n      });\n      ```\n\n      Advanced Example\n      --------------\n\n      Synchronous Example\n\n      ```javascript\n      var author, books;\n\n      try {\n        author = findAuthor();\n        books  = findBooksByAuthor(author);\n        // success\n      } catch(reason) {\n        // failure\n      }\n      ```\n\n      Errback Example\n\n      ```js\n\n      function foundBooks(books) {\n\n      }\n\n      function failure(reason) {\n\n      }\n\n      findAuthor(function(author, err){\n        if (err) {\n          failure(err);\n          // failure\n        } else {\n          try {\n            findBoooksByAuthor(author, function(books, err) {\n              if (err) {\n                failure(err);\n              } else {\n                try {\n                  foundBooks(books);\n                } catch(reason) {\n                  failure(reason);\n                }\n              }\n            });\n          } catch(error) {\n            failure(err);\n          }\n          // success\n        }\n      });\n      ```\n\n      Promise Example;\n\n      ```javascript\n      findAuthor().\n        then(findBooksByAuthor).\n        then(function(books){\n          // found books\n      }).catch(function(reason){\n        // something went wrong\n      });\n      ```\n\n      @method then\n      @param {Function} onFulfilled\n      @param {Function} onRejected\n      @param {String} label optional string for labeling the promise.\n      Useful for tooling.\n      @return {Promise}\n    */\n      then: function(onFulfillment, onRejection, label) {\n        var parent = this;\n        var state = parent._state;\n\n        if (state === lib$rsvp$$internal$$FULFILLED && !onFulfillment || state === lib$rsvp$$internal$$REJECTED && !onRejection) {\n          if (lib$rsvp$config$$config.instrument) {\n            lib$rsvp$instrument$$default('chained', parent, parent);\n          }\n          return parent;\n        }\n\n        parent._onError = null;\n\n        var child = new parent.constructor(lib$rsvp$$internal$$noop, label);\n        var result = parent._result;\n\n        if (lib$rsvp$config$$config.instrument) {\n          lib$rsvp$instrument$$default('chained', parent, child);\n        }\n\n        if (state) {\n          var callback = arguments[state - 1];\n          lib$rsvp$config$$config.async(function(){\n            lib$rsvp$$internal$$invokeCallback(state, child, callback, result);\n          });\n        } else {\n          lib$rsvp$$internal$$subscribe(parent, child, onFulfillment, onRejection);\n        }\n\n        return child;\n      },\n\n    /**\n      `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n      as the catch block of a try/catch statement.\n\n      ```js\n      function findAuthor(){\n        throw new Error('couldn't find that author');\n      }\n\n      // synchronous\n      try {\n        findAuthor();\n      } catch(reason) {\n        // something went wrong\n      }\n\n      // async with promises\n      findAuthor().catch(function(reason){\n        // something went wrong\n      });\n      ```\n\n      @method catch\n      @param {Function} onRejection\n      @param {String} label optional string for labeling the promise.\n      Useful for tooling.\n      @return {Promise}\n    */\n      'catch': function(onRejection, label) {\n        return this.then(undefined, onRejection, label);\n      },\n\n    /**\n      `finally` will be invoked regardless of the promise's fate just as native\n      try/catch/finally behaves\n\n      Synchronous example:\n\n      ```js\n      findAuthor() {\n        if (Math.random() > 0.5) {\n          throw new Error();\n        }\n        return new Author();\n      }\n\n      try {\n        return findAuthor(); // succeed or fail\n      } catch(error) {\n        return findOtherAuther();\n      } finally {\n        // always runs\n        // doesn't affect the return value\n      }\n      ```\n\n      Asynchronous example:\n\n      ```js\n      findAuthor().catch(function(reason){\n        return findOtherAuther();\n      }).finally(function(){\n        // author was either found, or not\n      });\n      ```\n\n      @method finally\n      @param {Function} callback\n      @param {String} label optional string for labeling the promise.\n      Useful for tooling.\n      @return {Promise}\n    */\n      'finally': function(callback, label) {\n        var promise = this;\n        var constructor = promise.constructor;\n\n        return promise.then(function(value) {\n          return constructor.resolve(callback()).then(function(){\n            return value;\n          });\n        }, function(reason) {\n          return constructor.resolve(callback()).then(function(){\n            throw reason;\n          });\n        }, label);\n      }\n    };\n\n    function lib$rsvp$all$settled$$AllSettled(Constructor, entries, label) {\n      this._superConstructor(Constructor, entries, false /* don't abort on reject */, label);\n    }\n\n    lib$rsvp$all$settled$$AllSettled.prototype = lib$rsvp$utils$$o_create(lib$rsvp$enumerator$$default.prototype);\n    lib$rsvp$all$settled$$AllSettled.prototype._superConstructor = lib$rsvp$enumerator$$default;\n    lib$rsvp$all$settled$$AllSettled.prototype._makeResult = lib$rsvp$enumerator$$makeSettledResult;\n    lib$rsvp$all$settled$$AllSettled.prototype._validationError = function() {\n      return new Error('allSettled must be called with an array');\n    };\n\n    function lib$rsvp$all$settled$$allSettled(entries, label) {\n      return new lib$rsvp$all$settled$$AllSettled(lib$rsvp$promise$$default, entries, label).promise;\n    }\n    var lib$rsvp$all$settled$$default = lib$rsvp$all$settled$$allSettled;\n    function lib$rsvp$all$$all(array, label) {\n      return lib$rsvp$promise$$default.all(array, label);\n    }\n    var lib$rsvp$all$$default = lib$rsvp$all$$all;\n    var lib$rsvp$asap$$len = 0;\n    var lib$rsvp$asap$$toString = {}.toString;\n    var lib$rsvp$asap$$vertxNext;\n    function lib$rsvp$asap$$asap(callback, arg) {\n      lib$rsvp$asap$$queue[lib$rsvp$asap$$len] = callback;\n      lib$rsvp$asap$$queue[lib$rsvp$asap$$len + 1] = arg;\n      lib$rsvp$asap$$len += 2;\n      if (lib$rsvp$asap$$len === 2) {\n        // If len is 1, that means that we need to schedule an async flush.\n        // If additional callbacks are queued before the queue is flushed, they\n        // will be processed by this flush that we are scheduling.\n        lib$rsvp$asap$$scheduleFlush();\n      }\n    }\n\n    var lib$rsvp$asap$$default = lib$rsvp$asap$$asap;\n\n    var lib$rsvp$asap$$browserWindow = (typeof window !== 'undefined') ? window : undefined;\n    var lib$rsvp$asap$$browserGlobal = lib$rsvp$asap$$browserWindow || {};\n    var lib$rsvp$asap$$BrowserMutationObserver = lib$rsvp$asap$$browserGlobal.MutationObserver || lib$rsvp$asap$$browserGlobal.WebKitMutationObserver;\n    var lib$rsvp$asap$$isNode = typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n    // test for web worker but not in IE10\n    var lib$rsvp$asap$$isWorker = typeof Uint8ClampedArray !== 'undefined' &&\n      typeof importScripts !== 'undefined' &&\n      typeof MessageChannel !== 'undefined';\n\n    // node\n    function lib$rsvp$asap$$useNextTick() {\n      var nextTick = process.nextTick;\n      // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n      // setImmediate should be used instead instead\n      var version = process.versions.node.match(/^(?:(\\d+)\\.)?(?:(\\d+)\\.)?(\\*|\\d+)$/);\n      if (Array.isArray(version) && version[1] === '0' && version[2] === '10') {\n        nextTick = setImmediate;\n      }\n      return function() {\n        nextTick(lib$rsvp$asap$$flush);\n      };\n    }\n\n    // vertx\n    function lib$rsvp$asap$$useVertxTimer() {\n      return function() {\n        lib$rsvp$asap$$vertxNext(lib$rsvp$asap$$flush);\n      };\n    }\n\n    function lib$rsvp$asap$$useMutationObserver() {\n      var iterations = 0;\n      var observer = new lib$rsvp$asap$$BrowserMutationObserver(lib$rsvp$asap$$flush);\n      var node = document.createTextNode('');\n      observer.observe(node, { characterData: true });\n\n      return function() {\n        node.data = (iterations = ++iterations % 2);\n      };\n    }\n\n    // web worker\n    function lib$rsvp$asap$$useMessageChannel() {\n      var channel = new MessageChannel();\n      channel.port1.onmessage = lib$rsvp$asap$$flush;\n      return function () {\n        channel.port2.postMessage(0);\n      };\n    }\n\n    function lib$rsvp$asap$$useSetTimeout() {\n      return function() {\n        setTimeout(lib$rsvp$asap$$flush, 1);\n      };\n    }\n\n    var lib$rsvp$asap$$queue = new Array(1000);\n    function lib$rsvp$asap$$flush() {\n      for (var i = 0; i < lib$rsvp$asap$$len; i+=2) {\n        var callback = lib$rsvp$asap$$queue[i];\n        var arg = lib$rsvp$asap$$queue[i+1];\n\n        callback(arg);\n\n        lib$rsvp$asap$$queue[i] = undefined;\n        lib$rsvp$asap$$queue[i+1] = undefined;\n      }\n\n      lib$rsvp$asap$$len = 0;\n    }\n\n    function lib$rsvp$asap$$attemptVertex() {\n      try {\n        var r = require;\n        var vertx = r('vertx');\n        lib$rsvp$asap$$vertxNext = vertx.runOnLoop || vertx.runOnContext;\n        return lib$rsvp$asap$$useVertxTimer();\n      } catch(e) {\n        return lib$rsvp$asap$$useSetTimeout();\n      }\n    }\n\n    var lib$rsvp$asap$$scheduleFlush;\n    // Decide what async method to use to triggering processing of queued callbacks:\n    if (lib$rsvp$asap$$isNode) {\n      lib$rsvp$asap$$scheduleFlush = lib$rsvp$asap$$useNextTick();\n    } else if (lib$rsvp$asap$$BrowserMutationObserver) {\n      lib$rsvp$asap$$scheduleFlush = lib$rsvp$asap$$useMutationObserver();\n    } else if (lib$rsvp$asap$$isWorker) {\n      lib$rsvp$asap$$scheduleFlush = lib$rsvp$asap$$useMessageChannel();\n    } else if (lib$rsvp$asap$$browserWindow === undefined && typeof require === 'function') {\n      lib$rsvp$asap$$scheduleFlush = lib$rsvp$asap$$attemptVertex();\n    } else {\n      lib$rsvp$asap$$scheduleFlush = lib$rsvp$asap$$useSetTimeout();\n    }\n    function lib$rsvp$defer$$defer(label) {\n      var deferred = {};\n\n      deferred['promise'] = new lib$rsvp$promise$$default(function(resolve, reject) {\n        deferred['resolve'] = resolve;\n        deferred['reject'] = reject;\n      }, label);\n\n      return deferred;\n    }\n    var lib$rsvp$defer$$default = lib$rsvp$defer$$defer;\n    function lib$rsvp$filter$$filter(promises, filterFn, label) {\n      return lib$rsvp$promise$$default.all(promises, label).then(function(values) {\n        if (!lib$rsvp$utils$$isFunction(filterFn)) {\n          throw new TypeError(\"You must pass a function as filter's second argument.\");\n        }\n\n        var length = values.length;\n        var filtered = new Array(length);\n\n        for (var i = 0; i < length; i++) {\n          filtered[i] = filterFn(values[i]);\n        }\n\n        return lib$rsvp$promise$$default.all(filtered, label).then(function(filtered) {\n          var results = new Array(length);\n          var newLength = 0;\n\n          for (var i = 0; i < length; i++) {\n            if (filtered[i]) {\n              results[newLength] = values[i];\n              newLength++;\n            }\n          }\n\n          results.length = newLength;\n\n          return results;\n        });\n      });\n    }\n    var lib$rsvp$filter$$default = lib$rsvp$filter$$filter;\n\n    function lib$rsvp$promise$hash$$PromiseHash(Constructor, object, label) {\n      this._superConstructor(Constructor, object, true, label);\n    }\n\n    var lib$rsvp$promise$hash$$default = lib$rsvp$promise$hash$$PromiseHash;\n\n    lib$rsvp$promise$hash$$PromiseHash.prototype = lib$rsvp$utils$$o_create(lib$rsvp$enumerator$$default.prototype);\n    lib$rsvp$promise$hash$$PromiseHash.prototype._superConstructor = lib$rsvp$enumerator$$default;\n    lib$rsvp$promise$hash$$PromiseHash.prototype._init = function() {\n      this._result = {};\n    };\n\n    lib$rsvp$promise$hash$$PromiseHash.prototype._validateInput = function(input) {\n      return input && typeof input === 'object';\n    };\n\n    lib$rsvp$promise$hash$$PromiseHash.prototype._validationError = function() {\n      return new Error('Promise.hash must be called with an object');\n    };\n\n    lib$rsvp$promise$hash$$PromiseHash.prototype._enumerate = function() {\n      var enumerator = this;\n      var promise    = enumerator.promise;\n      var input      = enumerator._input;\n      var results    = [];\n\n      for (var key in input) {\n        if (promise._state === lib$rsvp$$internal$$PENDING && Object.prototype.hasOwnProperty.call(input, key)) {\n          results.push({\n            position: key,\n            entry: input[key]\n          });\n        }\n      }\n\n      var length = results.length;\n      enumerator._remaining = length;\n      var result;\n\n      for (var i = 0; promise._state === lib$rsvp$$internal$$PENDING && i < length; i++) {\n        result = results[i];\n        enumerator._eachEntry(result.entry, result.position);\n      }\n    };\n\n    function lib$rsvp$hash$settled$$HashSettled(Constructor, object, label) {\n      this._superConstructor(Constructor, object, false, label);\n    }\n\n    lib$rsvp$hash$settled$$HashSettled.prototype = lib$rsvp$utils$$o_create(lib$rsvp$promise$hash$$default.prototype);\n    lib$rsvp$hash$settled$$HashSettled.prototype._superConstructor = lib$rsvp$enumerator$$default;\n    lib$rsvp$hash$settled$$HashSettled.prototype._makeResult = lib$rsvp$enumerator$$makeSettledResult;\n\n    lib$rsvp$hash$settled$$HashSettled.prototype._validationError = function() {\n      return new Error('hashSettled must be called with an object');\n    };\n\n    function lib$rsvp$hash$settled$$hashSettled(object, label) {\n      return new lib$rsvp$hash$settled$$HashSettled(lib$rsvp$promise$$default, object, label).promise;\n    }\n    var lib$rsvp$hash$settled$$default = lib$rsvp$hash$settled$$hashSettled;\n    function lib$rsvp$hash$$hash(object, label) {\n      return new lib$rsvp$promise$hash$$default(lib$rsvp$promise$$default, object, label).promise;\n    }\n    var lib$rsvp$hash$$default = lib$rsvp$hash$$hash;\n    function lib$rsvp$map$$map(promises, mapFn, label) {\n      return lib$rsvp$promise$$default.all(promises, label).then(function(values) {\n        if (!lib$rsvp$utils$$isFunction(mapFn)) {\n          throw new TypeError(\"You must pass a function as map's second argument.\");\n        }\n\n        var length = values.length;\n        var results = new Array(length);\n\n        for (var i = 0; i < length; i++) {\n          results[i] = mapFn(values[i]);\n        }\n\n        return lib$rsvp$promise$$default.all(results, label);\n      });\n    }\n    var lib$rsvp$map$$default = lib$rsvp$map$$map;\n\n    function lib$rsvp$node$$Result() {\n      this.value = undefined;\n    }\n\n    var lib$rsvp$node$$ERROR = new lib$rsvp$node$$Result();\n    var lib$rsvp$node$$GET_THEN_ERROR = new lib$rsvp$node$$Result();\n\n    function lib$rsvp$node$$getThen(obj) {\n      try {\n       return obj.then;\n      } catch(error) {\n        lib$rsvp$node$$ERROR.value= error;\n        return lib$rsvp$node$$ERROR;\n      }\n    }\n\n\n    function lib$rsvp$node$$tryApply(f, s, a) {\n      try {\n        f.apply(s, a);\n      } catch(error) {\n        lib$rsvp$node$$ERROR.value = error;\n        return lib$rsvp$node$$ERROR;\n      }\n    }\n\n    function lib$rsvp$node$$makeObject(_, argumentNames) {\n      var obj = {};\n      var name;\n      var i;\n      var length = _.length;\n      var args = new Array(length);\n\n      for (var x = 0; x < length; x++) {\n        args[x] = _[x];\n      }\n\n      for (i = 0; i < argumentNames.length; i++) {\n        name = argumentNames[i];\n        obj[name] = args[i + 1];\n      }\n\n      return obj;\n    }\n\n    function lib$rsvp$node$$arrayResult(_) {\n      var length = _.length;\n      var args = new Array(length - 1);\n\n      for (var i = 1; i < length; i++) {\n        args[i - 1] = _[i];\n      }\n\n      return args;\n    }\n\n    function lib$rsvp$node$$wrapThenable(then, promise) {\n      return {\n        then: function(onFulFillment, onRejection) {\n          return then.call(promise, onFulFillment, onRejection);\n        }\n      };\n    }\n\n    function lib$rsvp$node$$denodeify(nodeFunc, options) {\n      var fn = function() {\n        var self = this;\n        var l = arguments.length;\n        var args = new Array(l + 1);\n        var arg;\n        var promiseInput = false;\n\n        for (var i = 0; i < l; ++i) {\n          arg = arguments[i];\n\n          if (!promiseInput) {\n            // TODO: clean this up\n            promiseInput = lib$rsvp$node$$needsPromiseInput(arg);\n            if (promiseInput === lib$rsvp$node$$GET_THEN_ERROR) {\n              var p = new lib$rsvp$promise$$default(lib$rsvp$$internal$$noop);\n              lib$rsvp$$internal$$reject(p, lib$rsvp$node$$GET_THEN_ERROR.value);\n              return p;\n            } else if (promiseInput && promiseInput !== true) {\n              arg = lib$rsvp$node$$wrapThenable(promiseInput, arg);\n            }\n          }\n          args[i] = arg;\n        }\n\n        var promise = new lib$rsvp$promise$$default(lib$rsvp$$internal$$noop);\n\n        args[l] = function(err, val) {\n          if (err)\n            lib$rsvp$$internal$$reject(promise, err);\n          else if (options === undefined)\n            lib$rsvp$$internal$$resolve(promise, val);\n          else if (options === true)\n            lib$rsvp$$internal$$resolve(promise, lib$rsvp$node$$arrayResult(arguments));\n          else if (lib$rsvp$utils$$isArray(options))\n            lib$rsvp$$internal$$resolve(promise, lib$rsvp$node$$makeObject(arguments, options));\n          else\n            lib$rsvp$$internal$$resolve(promise, val);\n        };\n\n        if (promiseInput) {\n          return lib$rsvp$node$$handlePromiseInput(promise, args, nodeFunc, self);\n        } else {\n          return lib$rsvp$node$$handleValueInput(promise, args, nodeFunc, self);\n        }\n      };\n\n      fn.__proto__ = nodeFunc;\n\n      return fn;\n    }\n\n    var lib$rsvp$node$$default = lib$rsvp$node$$denodeify;\n\n    function lib$rsvp$node$$handleValueInput(promise, args, nodeFunc, self) {\n      var result = lib$rsvp$node$$tryApply(nodeFunc, self, args);\n      if (result === lib$rsvp$node$$ERROR) {\n        lib$rsvp$$internal$$reject(promise, result.value);\n      }\n      return promise;\n    }\n\n    function lib$rsvp$node$$handlePromiseInput(promise, args, nodeFunc, self){\n      return lib$rsvp$promise$$default.all(args).then(function(args){\n        var result = lib$rsvp$node$$tryApply(nodeFunc, self, args);\n        if (result === lib$rsvp$node$$ERROR) {\n          lib$rsvp$$internal$$reject(promise, result.value);\n        }\n        return promise;\n      });\n    }\n\n    function lib$rsvp$node$$needsPromiseInput(arg) {\n      if (arg && typeof arg === 'object') {\n        if (arg.constructor === lib$rsvp$promise$$default) {\n          return true;\n        } else {\n          return lib$rsvp$node$$getThen(arg);\n        }\n      } else {\n        return false;\n      }\n    }\n    var lib$rsvp$platform$$platform;\n\n    /* global self */\n    if (typeof self === 'object') {\n      lib$rsvp$platform$$platform = self;\n\n    /* global global */\n    } else if (typeof global === 'object') {\n      lib$rsvp$platform$$platform = global;\n    } else {\n      throw new Error('no global: `self` or `global` found');\n    }\n\n    var lib$rsvp$platform$$default = lib$rsvp$platform$$platform;\n    function lib$rsvp$race$$race(array, label) {\n      return lib$rsvp$promise$$default.race(array, label);\n    }\n    var lib$rsvp$race$$default = lib$rsvp$race$$race;\n    function lib$rsvp$reject$$reject(reason, label) {\n      return lib$rsvp$promise$$default.reject(reason, label);\n    }\n    var lib$rsvp$reject$$default = lib$rsvp$reject$$reject;\n    function lib$rsvp$resolve$$resolve(value, label) {\n      return lib$rsvp$promise$$default.resolve(value, label);\n    }\n    var lib$rsvp$resolve$$default = lib$rsvp$resolve$$resolve;\n    function lib$rsvp$rethrow$$rethrow(reason) {\n      setTimeout(function() {\n        throw reason;\n      });\n      throw reason;\n    }\n    var lib$rsvp$rethrow$$default = lib$rsvp$rethrow$$rethrow;\n\n    // default async is asap;\n    lib$rsvp$config$$config.async = lib$rsvp$asap$$default;\n    var lib$rsvp$$cast = lib$rsvp$resolve$$default;\n    function lib$rsvp$$async(callback, arg) {\n      lib$rsvp$config$$config.async(callback, arg);\n    }\n\n    function lib$rsvp$$on() {\n      lib$rsvp$config$$config['on'].apply(lib$rsvp$config$$config, arguments);\n    }\n\n    function lib$rsvp$$off() {\n      lib$rsvp$config$$config['off'].apply(lib$rsvp$config$$config, arguments);\n    }\n\n    // Set up instrumentation through `window.__PROMISE_INTRUMENTATION__`\n    if (typeof window !== 'undefined' && typeof window['__PROMISE_INSTRUMENTATION__'] === 'object') {\n      var lib$rsvp$$callbacks = window['__PROMISE_INSTRUMENTATION__'];\n      lib$rsvp$config$$configure('instrument', true);\n      for (var lib$rsvp$$eventName in lib$rsvp$$callbacks) {\n        if (lib$rsvp$$callbacks.hasOwnProperty(lib$rsvp$$eventName)) {\n          lib$rsvp$$on(lib$rsvp$$eventName, lib$rsvp$$callbacks[lib$rsvp$$eventName]);\n        }\n      }\n    }\n\n    var lib$rsvp$umd$$RSVP = {\n      'race': lib$rsvp$race$$default,\n      'Promise': lib$rsvp$promise$$default,\n      'allSettled': lib$rsvp$all$settled$$default,\n      'hash': lib$rsvp$hash$$default,\n      'hashSettled': lib$rsvp$hash$settled$$default,\n      'denodeify': lib$rsvp$node$$default,\n      'on': lib$rsvp$$on,\n      'off': lib$rsvp$$off,\n      'map': lib$rsvp$map$$default,\n      'filter': lib$rsvp$filter$$default,\n      'resolve': lib$rsvp$resolve$$default,\n      'reject': lib$rsvp$reject$$default,\n      'all': lib$rsvp$all$$default,\n      'rethrow': lib$rsvp$rethrow$$default,\n      'defer': lib$rsvp$defer$$default,\n      'EventTarget': lib$rsvp$events$$default,\n      'configure': lib$rsvp$config$$configure,\n      'async': lib$rsvp$$async\n    };\n\n    /* global define:true module:true window: true */\n    if (typeof define === 'function' && define['amd']) {\n      define(function() { return lib$rsvp$umd$$RSVP; });\n    } else if (typeof module !== 'undefined' && module['exports']) {\n      module['exports'] = lib$rsvp$umd$$RSVP;\n    } else if (typeof lib$rsvp$platform$$default !== 'undefined') {\n      lib$rsvp$platform$$default['RSVP'] = lib$rsvp$umd$$RSVP;\n    }\n}).call(this);\n\n"
  },
  {
    "path": "tests/rx.aggregates.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Reactive Extensions for JavaScript Tests</title>\n  <link rel=\"stylesheet\" href=\"./vendor/qunit-1.11.0.css\">\n</head>\n<body>\n  <div id=\"qunit\"></div>\n  <script src=\"./vendor/qunit-1.11.0.js\"></script>\n  <script src=\"./vendor/es6-shim.min.js\"></script>\n  <script src=\"../dist/rx.compat.js\"></script>\n  <script src=\"../dist/rx.aggregates.js\"></script>\n  <script src=\"../dist/rx.virtualtime.js\"></script>\n  <script src=\"../dist/rx.testing.js\"></script>\n  <script src=\"helpers/reactiveassert.js\"></script>\n\n  <!-- Individual Tests -->\n  <script src=\"observable/reduce.js\"></script>\n  <script src=\"observable/some.js\"></script>\n  <script src=\"observable/every.js\"></script>\n  <script src=\"observable/includes.js\"></script>\n  <script src=\"observable/count.js\"></script>\n  <script src=\"observable/indexof.js\"></script>\n  <script src=\"observable/sum.js\"></script>\n  <script src=\"observable/min.js\"></script>\n  <script src=\"observable/minby.js\"></script>\n  <script src=\"observable/max.js\"></script>\n  <script src=\"observable/maxby.js\"></script>\n  <script src=\"observable/average.js\"></script>\n  <script src=\"observable/sequenceequal.js\"></script>\n  <script src=\"observable/isempty.js\"></script>\n  <script src=\"observable/elementat.js\"></script>\n  <script src=\"observable/first.js\"></script>\n  <script src=\"observable/last.js\"></script>\n  <script src=\"observable/single.js\"></script>\n  <script src=\"observable/findindex.js\"></script>\n  <script src=\"observable/find.js\"></script>\n  <script src=\"observable/toset.js\"></script>\n  <script src=\"observable/tomap.js\"></script>\n  <script src=\"observable/slice.js\"></script>\n  <script src=\"observable/lastindexof.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/rx.all.compat.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Reactive Extensions for JavaScript Tests</title>\n  <link rel=\"stylesheet\" href=\"./vendor/qunit-1.11.0.css\">\n</head>\n<body>\n  <div id=\"qunit\"></div>\n  <script>\n    // Backfill for Phantom.js / JSCore\n    if (!Function.prototype.bind) {\n      Function.prototype.bind = function (context) {\n        var self = this;\n        return function () {\n          return self.apply(context, arguments);\n        };\n      };\n    }\n\n    // Polyfills\n    if (!Array.prototype.forEach)\n    {\n      Array.prototype.forEach = function(fun /*, thisArg */)\n      {\n        \"use strict\";\n\n        if (this === void 0 || this === null)\n          throw new TypeError();\n\n        var t = Object(this);\n        var len = t.length >>> 0;\n        if (typeof fun !== \"function\")\n          throw new TypeError();\n\n        var thisArg = arguments.length >= 2 ? arguments[1] : void 0;\n        for (var i = 0; i < len; i++)\n        {\n          if (i in t)\n            fun.call(thisArg, t[i], i, t);\n        }\n      };\n    }\n\n    if (!Object.keys) {\n      Object.keys = (function () {\n        'use strict';\n        var hasOwnProperty = Object.prototype.hasOwnProperty,\n            hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),\n            dontEnums = [\n              'toString',\n              'toLocaleString',\n              'valueOf',\n              'hasOwnProperty',\n              'isPrototypeOf',\n              'propertyIsEnumerable',\n              'constructor'\n            ],\n            dontEnumsLength = dontEnums.length;\n\n        return function (obj) {\n          if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n            throw new TypeError('Object.keys called on non-object');\n          }\n\n          var result = [], prop, i;\n\n          for (prop in obj) {\n            if (hasOwnProperty.call(obj, prop)) {\n              result.push(prop);\n            }\n          }\n\n          if (hasDontEnumBug) {\n            for (i = 0; i < dontEnumsLength; i++) {\n              if (hasOwnProperty.call(obj, dontEnums[i])) {\n                result.push(dontEnums[i]);\n              }\n            }\n          }\n          return result;\n        };\n      }());\n    }\n  </script>\n  <script src=\"./vendor/qunit-1.11.0.js\"></script>\n  <script src=\"./vendor/es5-shim.js\"></script>\n  <script src=\"./vendor/es6-shim.js\"></script>\n  <script src=\"./vendor/rsvp.js\"></script>\n  <script src=\"./vendor/transducers-0.4.158-min.js\"></script>\n  <script src=\"../dist/rx.all.compat.js\"></script>\n  <script src=\"../dist/rx.testing.js\"></script>\n  <script src=\"helpers/reactiveassert.js\"></script>\n\n  <!-- Individual Tests -->\n  <script src=\"internal/isequal.js\"></script>\n  <script src=\"subjects/asyncsubject.js\"></script>\n  <script src=\"subjects/subject.js\"></script>\n\n  <script src=\"concurrency/scheduler.js\"></script>\n  <script src=\"concurrency/immediatescheduler.js\"></script>\n  <script src=\"concurrency/currentthreadscheduler.js\"></script>\n  <script src=\"concurrency/defaultscheduler.js\"></script>\n\n  <script src=\"disposables/compositedisposable.js\"></script>\n  <script src=\"disposables/disposable.js\"></script>\n  <script src=\"disposables/refcountdisposable.js\"></script>\n  <script src=\"disposables/serialdisposable.js\"></script>\n  <script src=\"disposables/singleassignmentdisposable.js\"></script>\n\n  <script src=\"core/notification.js\"></script>\n  <script src=\"core/observable.js\"></script>\n  <script src=\"core/observer.js\"></script>\n\n  <!-- Concurrency -->\n  <script src=\"observable/observeon.js\"></script>\n  <script src=\"observable/subscribeon.js\"></script>\n\n  <!-- Creation -->\n  <script src=\"observable/create.js\"></script>\n  <script src=\"observable/defer.js\"></script>\n  <script src=\"observable/empty.js\"></script>\n  <script src=\"observable/from.js\"></script>\n  <script src=\"observable/fromarray.js\"></script>\n  <script src=\"observable/generate.js\"></script>\n  <script src=\"observable/of.js\"></script>\n  <script src=\"observable/never.js\"></script>\n  <script src=\"observable/range.js\"></script>\n  <script src=\"observable/repeat.js\"></script>\n  <script src=\"observable/return.js\"></script>\n  <script src=\"observable/throw.js\"></script>\n  <script src=\"observable/using.js\"></script>\n\n  <!-- Multiple -->\n\n  <script src=\"observable/amb.js\"></script>\n  <script src=\"observable/catch.js\"></script>\n  <script src=\"observable/combinelatest.js\"></script>\n  <script src=\"observable/concat.js\"></script>\n  <script src=\"observable/merge.js\"></script>\n  <script src=\"observable/mergeconcat.js\"></script>\n  <script src=\"observable/mergeall.js\"></script>\n  <script src=\"observable/onerrorresumenext.js\"></script>\n  <script src=\"observable/skipuntil.js\"></script>\n  <script src=\"observable/switch.js\"></script>\n  <script src=\"observable/takeuntil.js\"></script>\n  <script src=\"observable/withlatestfrom.js\"></script>\n  <script src=\"observable/zip.js\"></script>\n\n  <!-- Single -->\n\n  <script src=\"observable/asobservable.js\"></script>\n  <script src=\"observable/bufferwithcount.js\"></script>\n  <script src=\"observable/distinct.js\"></script>\n  <script src=\"observable/distinctuntilchanged.js\"></script>\n  <script src=\"observable/do.js\"></script>\n  <script src=\"observable/finally.js\"></script>\n  <script src=\"observable/ignoreelements.js\"></script>\n  <script src=\"observable/materialize.js\"></script>\n  <script src=\"observable/retry.js\"></script>\n  <script src=\"observable/retrywhen.js\"></script>\n  <script src=\"observable/repeatwhen.js\"></script>\n  <script src=\"observable/scan.js\"></script>\n  <script src=\"observable/skiplast.js\"></script>\n  <script src=\"observable/startwith.js\"></script>\n  <script src=\"observable/takelast.js\"></script>\n  <script src=\"observable/takelastbuffer.js\"></script>\n  <script src=\"observable/windowwithcount.js\"></script>\n\n  <!-- Standard Query Operators -->\n  <script src=\"observable/concatmap.js\"></script>\n  <script src=\"observable/concatmapobserver.js\"></script>\n  <script src=\"observable/defaultifempty.js\"></script>\n  <script src=\"observable/groupby.js\"></script>\n  <script src=\"observable/groupbyuntil.js\"></script>\n  <script src=\"observable/pluck.js\"></script>\n  <script src=\"observable/select.js\"></script>\n  <script src=\"observable/selectmany.js\"></script>\n  <script src=\"observable/selectmanyobserver.js\"></script>\n  <script src=\"observable/skip.js\"></script>\n  <script src=\"observable/skipwhile.js\"></script>\n  <script src=\"observable/take.js\"></script>\n  <script src=\"observable/takewhile.js\"></script>\n  <script src=\"observable/toarray.js\"></script>\n  <script src=\"observable/where.js\"></script>\n\n  <!-- Aggregate operators -->\n  <script src=\"observable/reduce.js\"></script>\n  <script src=\"observable/any.js\"></script>\n  <script src=\"observable/all.js\"></script>\n  <script src=\"observable/includes.js\"></script>\n  <script src=\"observable/count.js\"></script>\n  <script src=\"observable/indexof.js\"></script>\n  <script src=\"observable/sum.js\"></script>\n  <script src=\"observable/min.js\"></script>\n  <script src=\"observable/minby.js\"></script>\n  <script src=\"observable/max.js\"></script>\n  <script src=\"observable/maxby.js\"></script>\n  <script src=\"observable/average.js\"></script>\n  <script src=\"observable/sequenceequal.js\"></script>\n  <script src=\"observable/isempty.js\"></script>\n  <script src=\"observable/elementat.js\"></script>\n  <script src=\"observable/first.js\"></script>\n  <script src=\"observable/last.js\"></script>\n  <script src=\"observable/single.js\"></script>\n  <script src=\"observable/findindex.js\"></script>\n  <script src=\"observable/find.js\"></script>\n  <script src=\"observable/toset.js\"></script>\n  <script src=\"observable/tomap.js\"></script>\n  <script src=\"observable/slice.js\"></script>\n  <script src=\"observable/lastindexof.js\"></script>\n\n  <!-- Async compat operators -->\n  <script src=\"observable/toasync.js\"></script>\n  <script src=\"observable/start.js\"></script>\n  <script src=\"observable/fromcallback.js\"></script>\n  <script src=\"observable/fromnodecallback.js\"></script>\n  <script src=\"observable/fromevent.js\"></script>\n  <script src=\"observable/fromeventpattern.js\"></script>\n  <script src=\"observable/frompromise.js\"></script>\n  <script src=\"observable/topromise.js\"></script>\n\n  <!-- Backpressure operators -->\n  <script src=\"observable/pausable.js\"></script>\n  <script src=\"observable/pausablebuffered.js\"></script>\n  <script src=\"observable/controlled.js\"></script>\n\n  <!-- Binding operators -->\n  <script src=\"observable/multicast.js\"></script>\n  <script src=\"observable/publish.js\"></script>\n  <script src=\"observable/publishlast.js\"></script>\n  <script src=\"observable/replay.js\"></script>\n  <script src=\"observable/publishvalue.js\"></script>\n  <script src=\"subjects/behaviorsubject.js\"></script>\n  <script src=\"subjects/replaysubject.js\"></script>\n  <script src=\"observable/connectableobservable.js\"></script>\n\n  <!-- Coincidence operators -->\n  <script src=\"observable/join.js\"></script>\n  <script src=\"observable/groupjoin.js\"></script>\n  <script src=\"observable/window.js\"></script>\n  <script src=\"observable/buffer.js\"></script>\n  <script src=\"observable/pairwise.js\"></script>\n  <script src=\"observable/partition.js\"></script>\n\n  <!-- Experimental operators -->\n  <script src=\"observable/forkjoin.js\"></script>\n  <script src=\"observable/expand.js\"></script>\n  <script src=\"observable/let.js\"></script>\n  <script src=\"observable/manyselect.js\"></script>\n  <script src=\"observable/while.js\"></script>\n  <script src=\"observable/if.js\"></script>\n  <script src=\"observable/dowhile.js\"></script>\n  <script src=\"observable/case.js\"></script>\n  <script src=\"observable/for.js\"></script>\n\n  <!-- Join patterns operators -->\n  <script src=\"observable/when.js\"></script>\n\n  <!-- Time based operators -->\n  <script src=\"observable/windowwithtimeorcount.js\"></script>\n  <script src=\"observable/bufferwithtimeorcount.js\"></script>\n  <script src=\"observable/timer.js\"></script>\n  <script src=\"observable/interval.js\"></script>\n  <script src=\"observable/delay.js\"></script>\n  <script src=\"observable/debounce.js\"></script>\n  <script src=\"observable/bufferwithtime.js\"></script>\n  <script src=\"observable/windowwithtime.js\"></script>\n  <script src=\"observable/timeinterval.js\"></script>\n  <script src=\"observable/timestamp.js\"></script>\n  <script src=\"observable/sample.js\"></script>\n  <script src=\"observable/timeout.js\"></script>\n  <script src=\"observable/generatewithrelativetime.js\"></script>\n  <script src=\"observable/generatewithabsolutetime.js\"></script>\n  <script src=\"observable/takelastbufferwithtime.js\"></script>\n  <script src=\"observable/takewithtime.js\"></script>\n  <script src=\"observable/skipwithtime.js\"></script>\n  <script src=\"observable/takelastwithtime.js\"></script>\n  <script src=\"observable/skiplastwithtime.js\"></script>\n  <script src=\"observable/skipuntilwithtime.js\"></script>\n  <script src=\"observable/takeuntilwithtime.js\"></script>\n  <script src=\"observable/delaysubscription.js\"></script>\n  <script src=\"observable/throttle.js\"></script>\n\n  <!-- Transducers -->\n  <script src=\"observable/transduce.js\"></script>\n\n  <!-- Virtual time tests -->\n  <script src=\"concurrency/historicalscheduler.js\"></script>\n  <script src=\"concurrency/virtualtimescheduler.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/rx.all.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Reactive Extensions for JavaScript Tests</title>\n  <link rel=\"stylesheet\" href=\"./vendor/qunit-1.11.0.css\">\n</head>\n<body>\n  <div id=\"qunit\"></div>\n  <script src=\"./vendor/qunit-1.11.0.js\"></script>\n  <script src=\"./vendor/es5-shim.js\"></script>\n  <script src=\"./vendor/es6-shim.js\"></script>\n  <script src=\"./vendor/rsvp.js\"></script>\n  <script src=\"./vendor/transducers-0.4.158-min.js\"></script>\n  <script src=\"../dist/rx.all.js\"></script>\n  <script src=\"../dist/rx.testing.js\"></script>\n  <script src=\"helpers/reactiveassert.js\"></script>\n\n  <script>\n    // Backfill for Phantom.js / JSCore\n    if (!Function.prototype.bind) {\n      Function.prototype.bind = function (context) {\n        var self = this;\n        return function () {\n          return self.apply(context, arguments);\n        };\n      };\n    }\n\n    // Polyfills\n    if (!Array.prototype.forEach)\n    {\n      Array.prototype.forEach = function(fun /*, thisArg */)\n      {\n        \"use strict\";\n\n        if (this === void 0 || this === null)\n          throw new TypeError();\n\n        var t = Object(this);\n        var len = t.length >>> 0;\n        if (typeof fun !== \"function\")\n          throw new TypeError();\n\n        var thisArg = arguments.length >= 2 ? arguments[1] : void 0;\n        for (var i = 0; i < len; i++)\n        {\n          if (i in t)\n            fun.call(thisArg, t[i], i, t);\n        }\n      };\n    }\n\n    if (!Object.keys) {\n      Object.keys = (function () {\n        'use strict';\n        var hasOwnProperty = Object.prototype.hasOwnProperty,\n            hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),\n            dontEnums = [\n              'toString',\n              'toLocaleString',\n              'valueOf',\n              'hasOwnProperty',\n              'isPrototypeOf',\n              'propertyIsEnumerable',\n              'constructor'\n            ],\n            dontEnumsLength = dontEnums.length;\n\n        return function (obj) {\n          if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n            throw new TypeError('Object.keys called on non-object');\n          }\n\n          var result = [], prop, i;\n\n          for (prop in obj) {\n            if (hasOwnProperty.call(obj, prop)) {\n              result.push(prop);\n            }\n          }\n\n          if (hasDontEnumBug) {\n            for (i = 0; i < dontEnumsLength; i++) {\n              if (hasOwnProperty.call(obj, dontEnums[i])) {\n                result.push(dontEnums[i]);\n              }\n            }\n          }\n          return result;\n        };\n      }());\n    }\n  </script>\n\n  <!-- Individual Tests -->\n  <script src=\"internal/isequal.js\"></script>\n  <script src=\"subjects/asyncsubject.js\"></script>\n  <script src=\"subjects/subject.js\"></script>\n\n  <script src=\"concurrency/scheduler.js\"></script>\n  <script src=\"concurrency/immediatescheduler.js\"></script>\n  <script src=\"concurrency/currentthreadscheduler.js\"></script>\n  <script src=\"concurrency/defaultscheduler.js\"></script>\n\n  <script src=\"disposables/compositedisposable.js\"></script>\n  <script src=\"disposables/disposable.js\"></script>\n  <script src=\"disposables/refcountdisposable.js\"></script>\n  <script src=\"disposables/serialdisposable.js\"></script>\n  <script src=\"disposables/singleassignmentdisposable.js\"></script>\n\n  <script src=\"core/notification.js\"></script>\n  <script src=\"core/observable.js\"></script>\n  <script src=\"core/observer.js\"></script>\n\n  <!-- Concurrency -->\n\n  <script src=\"observable/observeon.js\"></script>\n  <script src=\"observable/subscribeon.js\"></script>\n\n  <!-- Creation -->\n\n  <script src=\"observable/create.js\"></script>\n  <script src=\"observable/defer.js\"></script>\n  <script src=\"observable/empty.js\"></script>\n  <script src=\"observable/from.js\"></script>\n  <script src=\"observable/fromarray.js\"></script>\n  <script src=\"observable/generate.js\"></script>\n  <script src=\"observable/of.js\"></script>\n  <script src=\"observable/ofarraychanges.js\"></script>\n  <script src=\"observable/ofobjectchanges.js\"></script>\n  <script src=\"observable/never.js\"></script>\n  <script src=\"observable/range.js\"></script>\n  <script src=\"observable/repeat.js\"></script>\n  <script src=\"observable/return.js\"></script>\n  <script src=\"observable/throw.js\"></script>\n  <script src=\"observable/using.js\"></script>\n\n  <!-- Multiple -->\n\n  <script src=\"observable/amb.js\"></script>\n  <script src=\"observable/catch.js\"></script>\n  <script src=\"observable/combinelatest.js\"></script>\n  <script src=\"observable/concat.js\"></script>\n  <script src=\"observable/merge.js\"></script>\n  <script src=\"observable/mergedelayerror.js\"></script>\n  <script src=\"observable/mergeconcat.js\"></script>\n  <script src=\"observable/mergeall.js\"></script>\n  <script src=\"observable/onerrorresumenext.js\"></script>\n  <script src=\"observable/skipuntil.js\"></script>\n  <script src=\"observable/switch.js\"></script>\n  <script src=\"observable/takeuntil.js\"></script>\n  <script src=\"observable/zip.js\"></script>\n\n  <!-- Single -->\n\n  <script src=\"observable/asobservable.js\"></script>\n  <script src=\"observable/bufferwithcount.js\"></script>\n  <script src=\"observable/distinct.js\"></script>\n  <script src=\"observable/distinctuntilchanged.js\"></script>\n  <script src=\"observable/do.js\"></script>\n  <script src=\"observable/finally.js\"></script>\n  <script src=\"observable/ignoreelements.js\"></script>\n  <script src=\"observable/materialize.js\"></script>\n  <script src=\"observable/retry.js\"></script>\n  <script src=\"observable/retrywhen.js\"></script>\n  <script src=\"observable/repeatwhen.js\"></script>\n  <script src=\"observable/scan.js\"></script>\n  <script src=\"observable/skiplast.js\"></script>\n  <script src=\"observable/startwith.js\"></script>\n  <script src=\"observable/takelast.js\"></script>\n  <script src=\"observable/takelastbuffer.js\"></script>\n  <script src=\"observable/withlatestfrom.js\"></script>\n  <script src=\"observable/windowwithcount.js\"></script>\n\n  <!-- Standard Query Operators -->\n  <script src=\"observable/concatmap.js\"></script>\n  <script src=\"observable/concatmapobserver.js\"></script>\n  <script src=\"observable/defaultifempty.js\"></script>\n  <script src=\"observable/groupby.js\"></script>\n  <script src=\"observable/groupbyuntil.js\"></script>\n  <script src=\"observable/pluck.js\"></script>\n  <script src=\"observable/select.js\"></script>\n  <script src=\"observable/selectmany.js\"></script>\n  <script src=\"observable/selectmanyobserver.js\"></script>\n  <script src=\"observable/skip.js\"></script>\n  <script src=\"observable/skipwhile.js\"></script>\n  <script src=\"observable/take.js\"></script>\n  <script src=\"observable/takewhile.js\"></script>\n  <script src=\"observable/toarray.js\"></script>\n  <script src=\"observable/where.js\"></script>\n\n  <!-- Aggregate operators -->\n  <script src=\"observable/reduce.js\"></script>\n  <script src=\"observable/some.js\"></script>\n  <script src=\"observable/every.js\"></script>\n  <script src=\"observable/includes.js\"></script>\n  <script src=\"observable/count.js\"></script>\n  <script src=\"observable/indexof.js\"></script>\n  <script src=\"observable/sum.js\"></script>\n  <script src=\"observable/min.js\"></script>\n  <script src=\"observable/minby.js\"></script>\n  <script src=\"observable/max.js\"></script>\n  <script src=\"observable/maxby.js\"></script>\n  <script src=\"observable/average.js\"></script>\n  <script src=\"observable/sequenceequal.js\"></script>\n  <script src=\"observable/isempty.js\"></script>\n  <script src=\"observable/elementat.js\"></script>\n  <script src=\"observable/first.js\"></script>\n  <script src=\"observable/last.js\"></script>\n  <script src=\"observable/single.js\"></script>\n  <script src=\"observable/findindex.js\"></script>\n  <script src=\"observable/find.js\"></script>\n  <script src=\"observable/toset.js\"></script>\n  <script src=\"observable/tomap.js\"></script>\n  <script src=\"observable/slice.js\"></script>\n  <script src=\"observable/lastindexof.js\"></script>\n\n  <!-- Async operators -->\n  <script src=\"observable/toasync.js\"></script>\n  <script src=\"observable/start.js\"></script>\n  <script src=\"observable/fromcallback.js\"></script>\n  <script src=\"observable/fromnodecallback.js\"></script>\n  <script src=\"observable/fromevent.js\"></script>\n  <script src=\"observable/fromeventpattern.js\"></script>\n  <script src=\"observable/frompromise.js\"></script>\n  <script src=\"observable/topromise.js\"></script>\n\n  <!-- Backpressure operators -->\n  <script src=\"observable/pausable.js\"></script>\n  <script src=\"observable/pausablebuffered.js\"></script>\n  <script src=\"observable/controlled.js\"></script>\n\n  <!-- Binding operators -->\n  <script src=\"observable/multicast.js\"></script>\n  <script src=\"observable/publish.js\"></script>\n  <script src=\"observable/publishlast.js\"></script>\n  <script src=\"observable/replay.js\"></script>\n  <script src=\"observable/publishvalue.js\"></script>\n  <script src=\"subjects/behaviorsubject.js\"></script>\n  <script src=\"subjects/replaysubject.js\"></script>\n  <script src=\"observable/connectableobservable.js\"></script>\n\n  <!-- Coincidence operators -->\n  <script src=\"observable/join.js\"></script>\n  <script src=\"observable/groupjoin.js\"></script>\n  <script src=\"observable/window.js\"></script>\n  <script src=\"observable/buffer.js\"></script>\n  <script src=\"observable/pairwise.js\"></script>\n  <script src=\"observable/partition.js\"></script>\n\n  <!-- Experimental operators -->\n  <script src=\"observable/forkjoin.js\"></script>\n  <script src=\"observable/expand.js\"></script>\n  <script src=\"observable/let.js\"></script>\n  <script src=\"observable/manyselect.js\"></script>\n  <script src=\"observable/while.js\"></script>\n  <script src=\"observable/if.js\"></script>\n  <script src=\"observable/dowhile.js\"></script>\n  <script src=\"observable/case.js\"></script>\n  <script src=\"observable/for.js\"></script>\n  <script src=\"observable/spawn.js\"></script>\n\n  <!-- Join patterns operators -->\n  <script src=\"observable/when.js\"></script>\n\n  <!-- Time based operators -->\n  <script src=\"observable/windowwithtimeorcount.js\"></script>\n  <script src=\"observable/bufferwithtimeorcount.js\"></script>\n  <script src=\"observable/timer.js\"></script>\n  <script src=\"observable/interval.js\"></script>\n  <script src=\"observable/delay.js\"></script>\n  <script src=\"observable/debounce.js\"></script>\n  <script src=\"observable/debounce.js\"></script>\n  <script src=\"observable/bufferwithtime.js\"></script>\n  <script src=\"observable/windowwithtime.js\"></script>\n  <script src=\"observable/timeinterval.js\"></script>\n  <script src=\"observable/timestamp.js\"></script>\n  <script src=\"observable/sample.js\"></script>\n  <script src=\"observable/timeout.js\"></script>\n  <script src=\"observable/generatewithrelativetime.js\"></script>\n  <script src=\"observable/generatewithabsolutetime.js\"></script>\n  <script src=\"observable/takelastbufferwithtime.js\"></script>\n  <script src=\"observable/takewithtime.js\"></script>\n  <script src=\"observable/skipwithtime.js\"></script>\n  <script src=\"observable/takelastwithtime.js\"></script>\n  <script src=\"observable/skiplastwithtime.js\"></script>\n  <script src=\"observable/skipuntilwithtime.js\"></script>\n  <script src=\"observable/takeuntilwithtime.js\"></script>\n  <script src=\"observable/delaysubscription.js\"></script>\n  <script src=\"observable/throttle.js\"></script>\n\n  <!-- Transducers -->\n  <script src=\"observable/transduce.js\"></script>\n\n  <!-- Virtual time tests -->\n  <script src=\"concurrency/historicalscheduler.js\"></script>\n  <script src=\"concurrency/virtualtimescheduler.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/rx.async.compat.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Reactive Extensions for JavaScript Tests</title>\n  <link rel=\"stylesheet\" href=\"./vendor/qunit-1.11.0.css\">\n</head>\n<body>\n  <div id=\"qunit\"></div>\n  <script src=\"./vendor/qunit-1.11.0.js\"></script>\n  <script src=\"./vendor/rsvp.js\"></script>\n  <script src=\"../dist/rx.compat.js\"></script>\n  <script src=\"../dist/rx.binding.js\"></script>\n  <script src=\"../dist/rx.async.compat.js\"></script>\n  <script src=\"../dist/rx.virtualtime.js\"></script>\n  <script src=\"../dist/rx.testing.js\"></script>\n  <script src=\"helpers/reactiveassert.js\"></script>\n\n  <!-- Individual Tests -->\n  <script src=\"observable/toasync.js\"></script>\n  <script src=\"observable/start.js\"></script>\n  <script src=\"observable/fromcallback.js\"></script>\n  <script src=\"observable/fromnodecallback.js\"></script>\n  <script src=\"observable/fromevent.js\"></script>\n  <script src=\"observable/fromeventpattern.js\"></script>\n  <script src=\"observable/frompromise.js\"></script>\n  <script src=\"observable/topromise.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/rx.async.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Reactive Extensions for JavaScript Tests</title>\n  <link rel=\"stylesheet\" href=\"./vendor/qunit-1.11.0.css\">\n</head>\n<body>\n  <div id=\"qunit\"></div>\n  <script src=\"./vendor/qunit-1.11.0.js\"></script>\n  <script src=\"./vendor/rsvp.js\"></script>\n  <script src=\"../dist/rx.js\"></script>\n  <script src=\"../dist/rx.binding.js\"></script>\n  <script src=\"../dist/rx.async.js\"></script>\n  <script src=\"../dist/rx.virtualtime.js\"></script>\n  <script src=\"../dist/rx.testing.js\"></script>\n  <script src=\"helpers/reactiveassert.js\"></script>\n\n  <script>\n    // Backfill for Phantom.js\n    if (!Function.prototype.bind) {\n      Function.prototype.bind = function (context) {\n        var self = this;\n        return function () {\n          return self.apply(context, arguments);\n        };\n      };\n    }\n  </script>\n\n  <!-- Individual Tests -->\n  <script src=\"observable/toasync.js\"></script>\n  <script src=\"observable/start.js\"></script>\n  <script src=\"observable/fromcallback.js\"></script>\n  <script src=\"observable/fromnodecallback.js\"></script>\n  <script src=\"observable/fromevent.js\"></script>\n  <script src=\"observable/fromeventpattern.js\"></script>\n  <script src=\"observable/frompromise.js\"></script>\n  <script src=\"observable/topromise.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/rx.backpressure.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Reactive Extensions for JavaScript Tests</title>\n  <link rel=\"stylesheet\" href=\"./vendor/qunit-1.11.0.css\">\n</head>\n<body>\n  <div id=\"qunit\"></div>\n  <script src=\"./vendor/qunit-1.11.0.js\"></script>\n  <script src=\"../dist/rx.compat.js\"></script>\n  <script src=\"../dist/rx.binding.js\"></script>\n  <script src=\"../dist/rx.backpressure.js\"></script>\n  <script src=\"../dist/rx.virtualtime.js\"></script>\n  <script src=\"../dist/rx.testing.js\"></script>\n  <script src=\"helpers/reactiveassert.js\"></script>\n\n  <!-- Individual Tests -->\n  <script src=\"observable/pausable.js\"></script>\n  <script src=\"observable/pausablebuffered.js\"></script>\n  <script src=\"observable/controlled.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/rx.binding.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Reactive Extensions for JavaScript Binding Tests</title>\n  <link rel=\"stylesheet\" href=\"./vendor/qunit-1.11.0.css\">\n</head>\n<body>\n  <div id=\"qunit\"></div>\n  <script src=\"./vendor/qunit-1.11.0.js\"></script>\n  <script src=\"../dist/rx.compat.js\"></script>\n  <script src=\"../dist/rx.binding.js\"></script>\n  <script src=\"../dist/rx.virtualtime.js\"></script>\n  <script src=\"../dist/rx.testing.js\"></script>\n  <script src=\"helpers/reactiveassert.js\"></script>\n\n  <!-- Individual Tests -->\n  <script src=\"observable/multicast.js\"></script>\n  <script src=\"observable/publish.js\"></script>\n  <script src=\"observable/publishlast.js\"></script>\n  <script src=\"observable/replay.js\"></script>\n  <script src=\"observable/publishvalue.js\"></script>\n  <script src=\"subjects/behaviorsubject.js\"></script>\n  <script src=\"subjects/replaysubject.js\"></script>\n  <script src=\"observable/connectableobservable.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/rx.coincidence.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Reactive Extensions for JavaScript Tests</title>\n  <link rel=\"stylesheet\" href=\"./vendor/qunit-1.11.0.css\">\n</head>\n<body>\n  <div id=\"qunit\"></div>\n  <script src=\"./vendor/qunit-1.11.0.js\"></script>\n  <script src=\"./vendor/es5-shim.js\"></script>\n  <script src=\"./vendor/es6-shim.js\"></script>\n  <script src=\"../dist/rx.compat.js\"></script>\n  <script src=\"../dist/rx.binding.js\"></script>\n  <script src=\"../dist/rx.coincidence.js\"></script>\n  <script src=\"../dist/rx.time.js\"></script>\n  <script src=\"../dist/rx.virtualtime.js\"></script>\n  <script src=\"../dist/rx.testing.js\"></script>\n  <script src=\"helpers/reactiveassert.js\"></script>\n\n  <!-- Individual Tests -->\n  <script src=\"observable/join.js\"></script>\n  <script src=\"observable/groupjoin.js\"></script>\n  <script src=\"observable/window.js\"></script>\n  <script src=\"observable/buffer.js\"></script>\n  <script src=\"observable/pairwise.js\"></script>\n  <script src=\"observable/partition.js\"></script>\n  <script src=\"observable/groupby.js\"></script>\n  <script src=\"observable/groupbyuntil.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/rx.compat.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Reactive Extensions for JavaScript Tests</title>\n  <link rel=\"stylesheet\" href=\"./vendor/qunit-1.11.0.css\">\n</head>\n<body>\n  <div id=\"qunit\"></div>\n  <script>\n    // Backfill for Phantom.js / JSCore\n    if (!Function.prototype.bind) {\n      Function.prototype.bind = function (context) {\n        var self = this;\n        return function () {\n          return self.apply(context, arguments);\n        };\n      };\n    }\n\n    // Polyfills\n    if (!Array.prototype.forEach)\n    {\n      Array.prototype.forEach = function(fun /*, thisArg */)\n      {\n        \"use strict\";\n\n        if (this === void 0 || this === null)\n          throw new TypeError();\n\n        var t = Object(this);\n        var len = t.length >>> 0;\n        if (typeof fun !== \"function\")\n          throw new TypeError();\n\n        var thisArg = arguments.length >= 2 ? arguments[1] : void 0;\n        for (var i = 0; i < len; i++)\n        {\n          if (i in t)\n            fun.call(thisArg, t[i], i, t);\n        }\n      };\n    }\n\n    if (!Object.keys) {\n      Object.keys = (function () {\n        'use strict';\n        var hasOwnProperty = Object.prototype.hasOwnProperty,\n            hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),\n            dontEnums = [\n              'toString',\n              'toLocaleString',\n              'valueOf',\n              'hasOwnProperty',\n              'isPrototypeOf',\n              'propertyIsEnumerable',\n              'constructor'\n            ],\n            dontEnumsLength = dontEnums.length;\n\n        return function (obj) {\n          if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n            throw new TypeError('Object.keys called on non-object');\n          }\n\n          var result = [], prop, i;\n\n          for (prop in obj) {\n            if (hasOwnProperty.call(obj, prop)) {\n              result.push(prop);\n            }\n          }\n\n          if (hasDontEnumBug) {\n            for (i = 0; i < dontEnumsLength; i++) {\n              if (hasOwnProperty.call(obj, dontEnums[i])) {\n                result.push(dontEnums[i]);\n              }\n            }\n          }\n          return result;\n        };\n      }());\n    }\n  </script>\n  <script src=\"./vendor/qunit-1.11.0.js\"></script>\n\n  <script src=\"./vendor/rsvp.js\"></script>\n  <script src=\"./vendor/transducers-0.4.158-min.js\"></script>\n  <script src=\"../dist/rx.compat.js\"></script>\n  <script src=\"../dist/rx.virtualtime.js\"></script>\n  <script src=\"../dist/rx.time.js\"></script>\n  <script src=\"../dist/rx.testing.js\"></script>\n  <script src=\"helpers/reactiveassert.js\"></script>\n\n  <!-- Individual Tests -->\n  <script src=\"internal/isequal.js\"></script>\n  <script src=\"subjects/asyncsubject.js\"></script>\n  <script src=\"subjects/subject.js\"></script>\n\n  <script src=\"concurrency/scheduler.js\"></script>\n  <script src=\"concurrency/immediatescheduler.js\"></script>\n  <script src=\"concurrency/currentthreadscheduler.js\"></script>\n  <script src=\"concurrency/defaultscheduler.js\"></script>\n\n  <script src=\"disposables/compositedisposable.js\"></script>\n  <script src=\"disposables/disposable.js\"></script>\n  <script src=\"disposables/refcountdisposable.js\"></script>\n  <script src=\"disposables/serialdisposable.js\"></script>\n  <script src=\"disposables/singleassignmentdisposable.js\"></script>\n\n  <script src=\"core/notification.js\"></script>\n  <script src=\"core/observable.js\"></script>\n  <script src=\"core/observer.js\"></script>\n\n  <!-- Concurrency -->\n  <script src=\"observable/observeon.js\"></script>\n  <script src=\"observable/subscribeon.js\"></script>\n\n  <!-- Creation -->\n  <script src=\"observable/create.js\"></script>\n  <script src=\"observable/defer.js\"></script>\n  <script src=\"observable/empty.js\"></script>\n  <script src=\"observable/from.js\"></script>\n  <script src=\"observable/fromarray.js\"></script>\n  <script src=\"observable/generate.js\"></script>\n  <script src=\"observable/never.js\"></script>\n  <script src=\"observable/of.js\"></script>\n  <script src=\"observable/pairs.js\"></script>\n  <script src=\"observable/range.js\"></script>\n  <script src=\"observable/repeat.js\"></script>\n  <script src=\"observable/return.js\"></script>\n  <script src=\"observable/throw.js\"></script>\n  <script src=\"observable/using.js\"></script>\n\n  <!-- Multiple -->\n\n  <script src=\"observable/amb.js\"></script>\n  <script src=\"observable/catch.js\"></script>\n  <script src=\"observable/combinelatest.js\"></script>\n  <script src=\"observable/concat.js\"></script>\n  <script src=\"observable/merge.js\"></script>\n  <script src=\"observable/mergeconcat.js\"></script>\n  <script src=\"observable/mergeobservable.js\"></script>\n  <script src=\"observable/onerrorresumenext.js\"></script>\n  <script src=\"observable/skipuntil.js\"></script>\n  <script src=\"observable/switch.js\"></script>\n  <script src=\"observable/takeuntil.js\"></script>\n  <script src=\"observable/withlatestfrom.js\"></script>\n  <script src=\"observable/zip.js\"></script>\n\n  <!-- Single -->\n\n  <script src=\"observable/asobservable.js\"></script>\n  <script src=\"observable/bufferwithcount.js\"></script>\n  <script src=\"observable/distinct.js\"></script>\n  <script src=\"observable/distinctuntilchanged.js\"></script>\n  <script src=\"observable/do.js\"></script>\n  <script src=\"observable/finally.js\"></script>\n  <script src=\"observable/ignoreelements.js\"></script>\n  <script src=\"observable/materialize.js\"></script>\n  <script src=\"observable/retry.js\"></script>\n  <script src=\"observable/retrywhen.js\"></script>\n  <script src=\"observable/repeatwhen.js\"></script>\n  <script src=\"observable/scan.js\"></script>\n  <script src=\"observable/skiplast.js\"></script>\n  <script src=\"observable/startwith.js\"></script>\n  <script src=\"observable/takelast.js\"></script>\n  <script src=\"observable/takelastbuffer.js\"></script>\n  <script src=\"observable/windowwithcount.js\"></script>\n\n  <!-- Standard Query Operators -->\n  <script src=\"observable/concatmap.js\"></script>\n  <script src=\"observable/concatmapobserver.js\"></script>\n  <script src=\"observable/defaultifempty.js\"></script>\n  <script src=\"observable/pluck.js\"></script>\n  <script src=\"observable/select.js\"></script>\n  <script src=\"observable/selectmany.js\"></script>\n  <script src=\"observable/selectmanyobserver.js\"></script>\n  <script src=\"observable/skip.js\"></script>\n  <script src=\"observable/skipwhile.js\"></script>\n  <script src=\"observable/take.js\"></script>\n  <script src=\"observable/takewhile.js\"></script>\n  <script src=\"observable/toarray.js\"></script>\n  <script src=\"observable/where.js\"></script>\n\n  <!-- Transducers -->\n  <script src=\"observable/transduce.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/rx.core.binding.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Reactive Extensions for JavaScript Binding Tests</title>\n  <link rel=\"stylesheet\" href=\"./vendor/qunit-1.11.0.css\">\n</head>\n<body>\n  <div id=\"qunit\"></div>\n  <script src=\"./vendor/qunit-1.11.0.js\"></script>\n  <script src=\"../dist/rx.core.js\"></script>\n  <script src=\"../dist/rx.core.binding.js\"></script>\n  <script src=\"../dist/rx.core.testing.js\"></script>\n  <script src=\"helpers/reactiveassert.js\"></script>\n  <script>\n    // Backfill for Phantom.js / JSCore\n    if (!Function.prototype.bind) {\n      Function.prototype.bind = function (context) {\n        var self = this;\n        return function () {\n          return self.apply(context, arguments);\n        };\n      };\n    }\n\n    // Polyfills\n    if (!Array.prototype.forEach)\n    {\n      Array.prototype.forEach = function(fun /*, thisArg */)\n      {\n        \"use strict\";\n\n        if (this === void 0 || this === null)\n          throw new TypeError();\n\n        var t = Object(this);\n        var len = t.length >>> 0;\n        if (typeof fun !== \"function\")\n          throw new TypeError();\n\n        var thisArg = arguments.length >= 2 ? arguments[1] : void 0;\n        for (var i = 0; i < len; i++)\n        {\n          if (i in t)\n            fun.call(thisArg, t[i], i, t);\n        }\n      };\n    }\n\n    if (!Object.keys) {\n      Object.keys = (function () {\n        'use strict';\n        var hasOwnProperty = Object.prototype.hasOwnProperty,\n            hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),\n            dontEnums = [\n              'toString',\n              'toLocaleString',\n              'valueOf',\n              'hasOwnProperty',\n              'isPrototypeOf',\n              'propertyIsEnumerable',\n              'constructor'\n            ],\n            dontEnumsLength = dontEnums.length;\n\n        return function (obj) {\n          if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n            throw new TypeError('Object.keys called on non-object');\n          }\n\n          var result = [], prop, i;\n\n          for (prop in obj) {\n            if (hasOwnProperty.call(obj, prop)) {\n              result.push(prop);\n            }\n          }\n\n          if (hasDontEnumBug) {\n            for (i = 0; i < dontEnumsLength; i++) {\n              if (hasOwnProperty.call(obj, dontEnums[i])) {\n                result.push(dontEnums[i]);\n              }\n            }\n          }\n          return result;\n        };\n      }());\n    }\n  </script>\n\n  <script>\n  // Missing RxJS operators\n  Rx.Observable.prototype.asObservable = function () {\n    var source = this;\n    return new Rx.AnonymousObservable(function (o) { return source.subscribe(o); }, source);\n  };\n\n  Rx.Observable.defer = function (observableFactory) {\n    return new Rx.AnonymousObservable(function (observer) {\n      var result;\n      try {\n        result = observableFactory();\n      } catch (e) {\n        return Rx.Observable['throw'](e).subscribe(observer);\n      }\n\n      return result.subscribe(observer);\n    });\n  };\n\n  Rx.Observable.never = function () {\n    return new Rx.AnonymousObservable(function () {\n      return Rx.Disposable.empty;\n    });\n  };\n\n  Rx.Observable.prototype.repeat = function (repeatCount) {\n    return Enumerable.repeat(this, repeatCount).concat();\n  };\n\n  Rx.Observable['return'] = Rx.Observable.just = function (value) {\n    return new Rx.AnonymousObservable(function (o) {\n      return Rx.Scheduler.immediate.schedule(value, function(_,v) {\n        o.onNext(v);\n        o.onCompleted();\n      });\n    });\n  };\n\n  Rx.Observable.prototype.skip = function (count) {\n    var source = this;\n    return new Rx.AnonymousObservable(function (o) {\n      var remaining = count;\n      return source.subscribe(function (x) {\n        if (remaining <= 0) {\n          o.onNext(x);\n        } else {\n          remaining--;\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  Rx.Observable.prototype.take = function (count) {\n    var source = this;\n    return new Rx.AnonymousObservable(function (o) {\n      var remaining = count;\n      return source.subscribe(function (x) {\n        if (remaining-- > 0) {\n          o.onNext(x);\n          remaining <= 0 && o.onCompleted();\n        }\n      }, function (e) { o.onError(e); }, function () { o.onCompleted(); });\n    }, source);\n  };\n\n  Rx.Observable['throw'] = Rx.Observable.throwError = function (error) {\n    return new Rx.AnonymousObservable(function (observer) {\n      return Rx.Scheduler.immediate.schedule(error, function (_,e) {\n        observer.onError(e);\n      });\n    });\n  };\n\n  function arrayInitialize(count, factory) {\n    var a = new Array(count);\n    for (var i = 0; i < count; i++) {\n      a[i] = factory();\n    }\n    return a;\n  }\n\n  function identity(x) { return x; }\n  function falseFactory() { return false; }\n  function emptyArrayFactory() { return []; }\n\n  Rx.Observable.prototype.zip = function () {\n    var len = arguments.length, args = new Array(len);\n    for(var i = 0; i < len; i++) { args[i] = arguments[i]; }\n\n    var parent = this, resultSelector = args.pop();\n    args.unshift(parent);\n    return new Rx.AnonymousObservable(function (o) {\n      var n = args.length,\n        queues = arrayInitialize(n, emptyArrayFactory),\n        isDone = arrayInitialize(n, falseFactory);\n\n      var subscriptions = new Array(n);\n      for (var idx = 0; idx < n; idx++) {\n        (function (i) {\n          var source = args[i], sad = new Rx.SingleAssignmentDisposable();\n          sad.setDisposable(source.subscribe(function (x) {\n            queues[i].push(x);\n            if (queues.every(function (x) { return x.length > 0; })) {\n              var queuedValues = queues.map(function (x) { return x.shift(); }),\n                  res = tryCatch(resultSelector).apply(parent, queuedValues);\n              if (res === errorObj) { return o.onError(res.e); }\n              o.onNext(res);\n            } else if (isDone.filter(function (x, j) { return j !== i; }).every(identity)) {\n              o.onCompleted();\n            }\n          }, function (e) { o.onError(e); }, function () {\n            isDone[i] = true;\n            isDone.every(identity) && o.onCompleted();\n          }));\n          subscriptions[i] = sad;\n        })(idx);\n      }\n\n      return new Rx.CompositeDisposable(subscriptions);\n    }, parent);\n  };\n\n  var errorObj = {e: {}};\n  var tryCatchTarget;\n  function tryCatcher() {\n    try {\n      return tryCatchTarget.apply(this, arguments);\n    } catch (e) {\n      errorObj.e = e;\n      return errorObj;\n    }\n  }\n  function tryCatch(fn) {\n    tryCatchTarget = fn;\n    return tryCatcher;\n  }\n  function thrower(e) {\n    throw e;\n  }\n\n  // Shim in iterator support\n  var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||\n    '_es6shim_iterator_';\n  // Bug for mozilla version\n  if (window.Set && typeof new window.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n\n  var doneEnumerator = Rx.doneEnumerator = { done: true, value: undefined };\n\n  function Enumerator(next) {\n    this._next = next;\n  }\n\n  Enumerator.prototype.next = function () {\n    return this._next();\n  };\n\n  Enumerator.prototype[$iterator$] = function () { return this; };\n\n  function Enumerable (iterator) {\n    this._iterator = iterator;\n  };\n\n  Enumerable.prototype[$iterator$] = function () {\n    return this._iterator();\n  };\n\n  Enumerable.prototype.concat = function () {\n    var sources = this;\n    return new Rx.AnonymousObservable(function (o) {\n      var e = sources[$iterator$]();\n\n      var isDisposed, subscription = new Rx.SerialDisposable();\n      var cancelable = Rx.Scheduler.immediate.scheduleRecursive(null, function (_, self) {\n        if (isDisposed) { return; }\n        try {\n          var currentItem = e.next();\n        } catch (ex) {\n          return o.onError(ex);\n        }\n\n        if (currentItem.done) {\n          return o.onCompleted();\n        }\n\n        var currentValue = currentItem.value;\n\n        var d = new Rx.SingleAssignmentDisposable();\n        subscription.setDisposable(d);\n        d.setDisposable(currentValue.subscribe(\n          function(x) { o.onNext(x); },\n          function(err) { o.onError(err); },\n          self)\n        );\n      });\n\n      return new Rx.CompositeDisposable(subscription, cancelable, Rx.Disposable.create(function () {\n        isDisposed = true;\n      }));\n    });\n  };\n\n  Enumerable.repeat = function (value, repeatCount) {\n    if (repeatCount == null) { repeatCount = -1; }\n    return new Enumerable(function () {\n      var left = repeatCount;\n      return new Enumerator(function () {\n        if (left === 0) { return doneEnumerator; }\n        if (left > 0) { left--; }\n        return { done: false, value: value };\n      });\n    });\n  };\n  </script>\n\n  <!-- Individual Tests -->\n  <script src=\"observable/multicast.js\"></script>\n  <script src=\"observable/publish.js\"></script>\n  <script src=\"observable/publishlast.js\"></script>\n  <script src=\"observable/replay.js\"></script>\n  <script src=\"observable/publishvalue.js\"></script>\n  <script src=\"subjects/subject.js\"></script>\n  <script src=\"subjects/asyncsubject.js\"></script>\n  <script src=\"subjects/behaviorsubject.js\"></script>\n  <script src=\"subjects/replaysubject.js\"></script>\n  <script src=\"observable/connectableobservable.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/rx.core.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Reactive Extensions for JavaScript Tests</title>\n  <link rel=\"stylesheet\" href=\"./vendor/qunit-1.11.0.css\">\n</head>\n<body>\n  <div id=\"qunit\"></div>\n  <script src=\"./vendor/qunit-1.11.0.js\"></script>\n  <script src=\"../dist/rx.core.js\"></script>\n  <script src=\"../dist/rx.core.testing.js\"></script>\n  <script src=\"helpers/reactiveassert.js\"></script>\n  <script>\n    // Backfill for Phantom.js / JSCore\n    if (!Function.prototype.bind) {\n      Function.prototype.bind = function (context) {\n        var self = this;\n        return function () {\n          return self.apply(context, arguments);\n        };\n      };\n    }\n\n    // Polyfills\n    if (!Array.prototype.forEach)\n    {\n      Array.prototype.forEach = function(fun /*, thisArg */)\n      {\n        \"use strict\";\n\n        if (this === void 0 || this === null)\n          throw new TypeError();\n\n        var t = Object(this);\n        var len = t.length >>> 0;\n        if (typeof fun !== \"function\")\n          throw new TypeError();\n\n        var thisArg = arguments.length >= 2 ? arguments[1] : void 0;\n        for (var i = 0; i < len; i++)\n        {\n          if (i in t)\n            fun.call(thisArg, t[i], i, t);\n        }\n      };\n    }\n\n    if (!Object.keys) {\n      Object.keys = (function () {\n        'use strict';\n        var hasOwnProperty = Object.prototype.hasOwnProperty,\n            hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),\n            dontEnums = [\n              'toString',\n              'toLocaleString',\n              'valueOf',\n              'hasOwnProperty',\n              'isPrototypeOf',\n              'propertyIsEnumerable',\n              'constructor'\n            ],\n            dontEnumsLength = dontEnums.length;\n\n        return function (obj) {\n          if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n            throw new TypeError('Object.keys called on non-object');\n          }\n\n          var result = [], prop, i;\n\n          for (prop in obj) {\n            if (hasOwnProperty.call(obj, prop)) {\n              result.push(prop);\n            }\n          }\n\n          if (hasDontEnumBug) {\n            for (i = 0; i < dontEnumsLength; i++) {\n              if (hasOwnProperty.call(obj, dontEnums[i])) {\n                result.push(dontEnums[i]);\n              }\n            }\n          }\n          return result;\n        };\n      }());\n    }\n  </script>\n  <script>\n  // RxJS Polyfills\n  Rx.Observable.empty = function () {\n    return new Rx.AnonymousObservable(function (observer) {\n      return Rx.Scheduler.immediate.schedule(null, function () {\n        observer.onCompleted();\n      });\n    });\n  };\n\n  Rx.Observable['return'] = Rx.Observable.just = function (value) {\n    return new Rx.AnonymousObservable(function (o) {\n      return Rx.Scheduler.immediate.schedule(value, function(_,v) {\n        o.onNext(v);\n        o.onCompleted();\n      });\n    });\n  };\n\n  Rx.Observable['throw'] = Rx.Observable.throwError = function (error) {\n    return new Rx.AnonymousObservable(function (observer) {\n      return Rx.Scheduler.immediate.schedule(error, function (_,e) {\n        observer.onError(e);\n      });\n    });\n  };\n  </script>\n\n  <!-- Individual Tests -->\n  <script src=\"concurrency/scheduler-lite.js\"></script>\n  <script src=\"concurrency/immediatescheduler.js\"></script>\n  <script src=\"concurrency/currentthreadscheduler.js\"></script>\n  <script src=\"concurrency/defaultscheduler.js\"></script>\n\n  <script src=\"disposables/compositedisposable.js\"></script>\n  <script src=\"disposables/disposable.js\"></script>\n  <script src=\"disposables/serialdisposable.js\"></script>\n  <script src=\"disposables/singleassignmentdisposable.js\"></script>\n\n  <script src=\"core/observer-lite.js\"></script>\n  <script src=\"core/observable.js\"></script>\n  <script src=\"observable/create.js\"></script>\n\n</body>\n</html>\n"
  },
  {
    "path": "tests/rx.experimental.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Reactive Extensions for JavaScript Tests</title>\n  <link rel=\"stylesheet\" href=\"./vendor/qunit-1.11.0.css\">\n</head>\n<body>\n  <div id=\"qunit\"></div>\n  <script src=\"./vendor/qunit-1.11.0.js\"></script>\n  <script src=\"../dist/rx.compat.js\"></script>\n  <script src=\"../dist/rx.aggregates.js\"></script>\n  <script src=\"../dist/rx.experimental.js\"></script>\n  <script src=\"../dist/rx.virtualtime.js\"></script>\n  <script src=\"../dist/rx.testing.js\"></script>\n  <script src=\"helpers/reactiveassert.js\"></script>\n\n  <!-- Individual Tests -->\n  <script src=\"observable/forkjoinproto.js\"></script>\n  <script src=\"observable/forkjoin.js\"></script>\n  <script src=\"observable/expand.js\"></script>\n  <script src=\"observable/let.js\"></script>\n  <script src=\"observable/manyselect.js\"></script>\n  <script src=\"observable/while.js\"></script>\n  <script src=\"observable/if.js\"></script>\n  <script src=\"observable/dowhile.js\"></script>\n  <script src=\"observable/case.js\"></script>\n  <script src=\"observable/for.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/rx.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Reactive Extensions for JavaScript Tests</title>\n  <link rel=\"stylesheet\" href=\"./vendor/qunit-1.11.0.css\">\n</head>\n<body>\n  <div id=\"qunit\"></div>\n  <script src=\"./vendor/qunit-1.11.0.js\"></script>\n  <script src=\"./vendor/rsvp.js\"></script>\n  <script src=\"./vendor/transducers-0.4.158-min.js\"></script>\n  <script src=\"../dist/rx.js\"></script>\n  <script src=\"../dist/rx.time.js\"></script>\n  <script src=\"../dist/rx.virtualtime.js\"></script>\n  <script src=\"../dist/rx.testing.js\"></script>\n  <script src=\"helpers/reactiveassert.js\"></script>\n\n  <script>\n    // Backfill for Phantom.js / JSCore\n    if (!Function.prototype.bind) {\n      Function.prototype.bind = function (context) {\n        var self = this;\n        return function () {\n          return self.apply(context, arguments);\n        };\n      };\n    }\n\n    // Polyfills\n    if (!Array.prototype.forEach)\n    {\n      Array.prototype.forEach = function(fun /*, thisArg */)\n      {\n        \"use strict\";\n\n        if (this === void 0 || this === null)\n          throw new TypeError();\n\n        var t = Object(this);\n        var len = t.length >>> 0;\n        if (typeof fun !== \"function\")\n          throw new TypeError();\n\n        var thisArg = arguments.length >= 2 ? arguments[1] : void 0;\n        for (var i = 0; i < len; i++)\n        {\n          if (i in t)\n            fun.call(thisArg, t[i], i, t);\n        }\n      };\n    }\n\n    if (!Object.keys) {\n      Object.keys = (function () {\n        'use strict';\n        var hasOwnProperty = Object.prototype.hasOwnProperty,\n            hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),\n            dontEnums = [\n              'toString',\n              'toLocaleString',\n              'valueOf',\n              'hasOwnProperty',\n              'isPrototypeOf',\n              'propertyIsEnumerable',\n              'constructor'\n            ],\n            dontEnumsLength = dontEnums.length;\n\n        return function (obj) {\n          if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n            throw new TypeError('Object.keys called on non-object');\n          }\n\n          var result = [], prop, i;\n\n          for (prop in obj) {\n            if (hasOwnProperty.call(obj, prop)) {\n              result.push(prop);\n            }\n          }\n\n          if (hasDontEnumBug) {\n            for (i = 0; i < dontEnumsLength; i++) {\n              if (hasOwnProperty.call(obj, dontEnums[i])) {\n                result.push(dontEnums[i]);\n              }\n            }\n          }\n          return result;\n        };\n      }());\n    }\n  </script>\n\n  <!-- Individual Tests -->\n  <script src=\"internal/isequal.js\"></script>\n  <script src=\"internal/trycatch.js\"></script>\n  <script src=\"subjects/asyncsubject.js\"></script>\n  <script src=\"subjects/subject.js\"></script>\n\n  <script src=\"concurrency/scheduler.js\"></script>\n  <script src=\"concurrency/immediatescheduler.js\"></script>\n  <script src=\"concurrency/currentthreadscheduler.js\"></script>\n  <script src=\"concurrency/defaultscheduler.js\"></script>\n\n  <script src=\"disposables/compositedisposable.js\"></script>\n  <script src=\"disposables/disposable.js\"></script>\n  <script src=\"disposables/refcountdisposable.js\"></script>\n  <script src=\"disposables/serialdisposable.js\"></script>\n  <script src=\"disposables/singleassignmentdisposable.js\"></script>\n\n  <script src=\"core/notification.js\"></script>\n  <script src=\"core/observable.js\"></script>\n  <script src=\"core/observer.js\"></script>\n\n  <!-- Concurrency -->\n\n  <script src=\"observable/observeon.js\"></script>\n  <script src=\"observable/subscribeon.js\"></script>\n\n  <!-- Creation -->\n\n  <script src=\"observable/create.js\"></script>\n  <script src=\"observable/defer.js\"></script>\n  <script src=\"observable/empty.js\"></script>\n  <script src=\"observable/fromarray.js\"></script>\n  <script src=\"observable/from.js\"></script>\n  <script src=\"observable/generate.js\"></script>\n  <script src=\"observable/never.js\"></script>\n  <script src=\"observable/of.js\"></script>\n  <script src=\"observable/pairs.js\"></script>\n  <script src=\"observable/range.js\"></script>\n  <script src=\"observable/repeat.js\"></script>\n  <script src=\"observable/return.js\"></script>\n  <script src=\"observable/throw.js\"></script>\n  <script src=\"observable/using.js\"></script>\n\n  <!-- Multiple -->\n\n  <script src=\"observable/amb.js\"></script>\n  <script src=\"observable/catch.js\"></script>\n  <script src=\"observable/combinelatest.js\"></script>\n  <script src=\"observable/concat.js\"></script>\n  <script src=\"observable/merge.js\"></script>\n  <script src=\"observable/mergeconcat.js\"></script>\n  <script src=\"observable/mergeall.js\"></script>\n  <script src=\"observable/onerrorresumenext.js\"></script>\n  <script src=\"observable/skipuntil.js\"></script>\n  <script src=\"observable/switch.js\"></script>\n  <script src=\"observable/takeuntil.js\"></script>\n  <script src=\"observable/zip.js\"></script>\n\n  <!-- Single -->\n\n  <script src=\"observable/asobservable.js\"></script>\n  <script src=\"observable/bufferwithcount.js\"></script>\n  <script src=\"observable/distinct.js\"></script>\n  <script src=\"observable/distinctuntilchanged.js\"></script>\n  <script src=\"observable/do.js\"></script>\n  <script src=\"observable/finally.js\"></script>\n  <script src=\"observable/ignoreelements.js\"></script>\n  <script src=\"observable/materialize.js\"></script>\n  <script src=\"observable/retry.js\"></script>\n  <script src=\"observable/retrywhen.js\"></script>\n  <script src=\"observable/repeatwhen.js\"></script>\n  <script src=\"observable/scan.js\"></script>\n  <script src=\"observable/skiplast.js\"></script>\n  <script src=\"observable/startwith.js\"></script>\n  <script src=\"observable/takelast.js\"></script>\n  <script src=\"observable/takelastbuffer.js\"></script>\n  <script src=\"observable/windowwithcount.js\"></script>\n\n  <!-- Standard Query Operators -->\n  <script src=\"observable/concatmap.js\"></script>\n  <script src=\"observable/concatmapobserver.js\"></script>\n  <script src=\"observable/defaultifempty.js\"></script>\n  <script src=\"observable/pluck.js\"></script>\n  <script src=\"observable/select.js\"></script>\n  <script src=\"observable/selectmany.js\"></script>\n  <script src=\"observable/selectmanyobserver.js\"></script>\n  <script src=\"observable/skip.js\"></script>\n  <script src=\"observable/skipwhile.js\"></script>\n  <script src=\"observable/take.js\"></script>\n  <script src=\"observable/takewhile.js\"></script>\n  <script src=\"observable/toarray.js\"></script>\n  <script src=\"observable/where.js\"></script>\n\n  <!-- Transducers -->\n  <script src=\"observable/transduce.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/rx.joinpatterns.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Reactive Extensions for JavaScript Join Pattern Tests</title>\n  <link rel=\"stylesheet\" href=\"./vendor/qunit-1.11.0.css\">\n</head>\n<body>\n  <div id=\"qunit\"></div>\n  <script src=\"./vendor/qunit-1.11.0.js\"></script>\n  <script src=\"../dist/rx.compat.js\"></script>\n  <script src=\"../dist/rx.joinpatterns.js\"></script>\n  <script src=\"../dist/rx.virtualtime.js\"></script>\n  <script src=\"../dist/rx.testing.js\"></script>\n  <script src=\"helpers/reactiveassert.js\"></script>\n\n  <!-- Individual Tests -->\n  <script src=\"observable/when.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/rx.lite.compat.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\" />\n  <meta charset=\"utf-8\">\n  <title>Reactive Extensions for JavaScript Tests</title>\n  <link rel=\"stylesheet\" href=\"./vendor/qunit-1.11.0.css\">\n</head>\n<body>\n  <div id=\"qunit\"></div>\n  <script>\n    // Backfill for Phantom.js / JSCore\n    if (!Function.prototype.bind) {\n      Function.prototype.bind = function (context) {\n        var self = this;\n        return function () {\n          return self.apply(context, arguments);\n        };\n      };\n    }\n\n    // Polyfills\n    if (!Array.prototype.forEach)\n    {\n      Array.prototype.forEach = function(fun /*, thisArg */)\n      {\n        \"use strict\";\n\n        if (this === void 0 || this === null)\n          throw new TypeError();\n\n        var t = Object(this);\n        var len = t.length >>> 0;\n        if (typeof fun !== \"function\")\n          throw new TypeError();\n\n        var thisArg = arguments.length >= 2 ? arguments[1] : void 0;\n        for (var i = 0; i < len; i++)\n        {\n          if (i in t)\n            fun.call(thisArg, t[i], i, t);\n        }\n      };\n    }\n\n    if (!Object.keys) {\n      Object.keys = (function () {\n        'use strict';\n        var hasOwnProperty = Object.prototype.hasOwnProperty,\n            hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),\n            dontEnums = [\n              'toString',\n              'toLocaleString',\n              'valueOf',\n              'hasOwnProperty',\n              'isPrototypeOf',\n              'propertyIsEnumerable',\n              'constructor'\n            ],\n            dontEnumsLength = dontEnums.length;\n\n        return function (obj) {\n          if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n            throw new TypeError('Object.keys called on non-object');\n          }\n\n          var result = [], prop, i;\n\n          for (prop in obj) {\n            if (hasOwnProperty.call(obj, prop)) {\n              result.push(prop);\n            }\n          }\n\n          if (hasDontEnumBug) {\n            for (i = 0; i < dontEnumsLength; i++) {\n              if (hasOwnProperty.call(obj, dontEnums[i])) {\n                result.push(dontEnums[i]);\n              }\n            }\n          }\n          return result;\n        };\n      }());\n    }\n  </script>\n  <script src=\"./vendor/qunit-1.11.0.js\"></script>\n  <script src=\"./vendor/rsvp.js\"></script>\n  <script src=\"./vendor/transducers-0.4.158-min.js\"></script>\n\n  <script src=\"../dist/rx.lite.compat.js\"></script>\n  <script src=\"../dist/rx.virtualtime.js\"></script>\n  <script src=\"../dist/rx.testing.js\"></script>\n  <script src=\"helpers/reactiveassert.js\"></script>\n\n  <!-- Individual Tests -->\n  <script src=\"internal/isequal.js\"></script>\n  <script src=\"subjects/asyncsubject.js\"></script>\n  <script src=\"subjects/subject.js\"></script>\n\n  <script src=\"observable/pausable.js\"></script>\n  <script src=\"observable/pausablebuffered.js\"></script>\n  <script src=\"observable/controlled.js\"></script>\n\n  <script src=\"concurrency/scheduler-lite.js\"></script>\n  <script src=\"concurrency/currentthreadscheduler.js\"></script>\n  <script src=\"concurrency/immediatescheduler.js\"></script>\n  <script src=\"concurrency/defaultscheduler.js\"></script>\n\n  <script src=\"disposables/compositedisposable.js\"></script>\n  <script src=\"disposables/disposable.js\"></script>\n  <script src=\"disposables/refcountdisposable.js\"></script>\n  <script src=\"disposables/serialdisposable.js\"></script>\n\n  <script src=\"core/notification.js\"></script>\n  <script src=\"core/observable.js\"></script>\n  <script src=\"core/observer-lite.js\"></script>\n\n  <!-- Creation -->\n  <script src=\"observable/create.js\"></script>\n  <script src=\"observable/createwithdisposable.js\"></script>\n  <script src=\"observable/defer.js\"></script>\n  <script src=\"observable/empty.js\"></script>\n  <script src=\"observable/from.js\"></script>\n  <script src=\"observable/fromarray.js\"></script>\n  <script src=\"observable/fromevent.js\"></script>\n  <script src=\"observable/never.js\"></script>\n  <script src=\"observable/of.js\"></script>\n  <script src=\"observable/pairs.js\"></script>\n  <script src=\"observable/range.js\"></script>\n  <script src=\"observable/repeat.js\"></script>\n  <script src=\"observable/return.js\"></script>\n  <script src=\"observable/throw.js\"></script>\n\n  <!-- Multiple -->\n  <script src=\"observable/catch.js\"></script>\n  <script src=\"observable/combinelatest.js\"></script>\n  <script src=\"observable/concat.js\"></script>\n  <script src=\"observable/merge.js\"></script>\n  <script src=\"observable/mergeconcat.js\"></script>\n  <script src=\"observable/mergeall.js\"></script>\n  <script src=\"observable/skipuntil.js\"></script>\n  <script src=\"observable/switch.js\"></script>\n  <script src=\"observable/takeuntil.js\"></script>\n  <script src=\"observable/withlatestfrom.js\"></script>\n  <script src=\"observable/zip.js\"></script>\n\n  <!-- Single -->\n  <script src=\"observable/asobservable.js\"></script>\n  <script src=\"observable/distinctuntilchanged.js\"></script>\n  <script src=\"observable/do.js\"></script>\n  <script src=\"observable/finally.js\"></script>\n  <script src=\"observable/ignoreelements.js\"></script>\n  <script src=\"observable/materialize.js\"></script>\n  <script src=\"observable/retrywhen.js\"></script>\n  <script src=\"observable/repeatwhen.js\"></script>\n  <script src=\"observable/scan.js\"></script>\n  <script src=\"observable/skiplast.js\"></script>\n  <script src=\"observable/startwith.js\"></script>\n  <script src=\"observable/takelast.js\"></script>\n\n  <!-- Standard Query Operators -->\n  <script src=\"observable/concatmap.js\"></script>\n  <script src=\"observable/select.js\"></script>\n  <script src=\"observable/selectmany.js\"></script>\n  <script src=\"observable/skip.js\"></script>\n  <script src=\"observable/skipwhile.js\"></script>\n  <script src=\"observable/take.js\"></script>\n  <script src=\"observable/takewhile.js\"></script>\n  <script src=\"observable/toarray.js\"></script>\n  <script src=\"observable/where.js\"></script>\n\n  <!-- Async Operators -->\n  <script src=\"observable/fromcallback.js\"></script>\n  <script src=\"observable/fromnodecallback.js\"></script>\n  <script src=\"observable/fromevent.js\"></script>\n  <script src=\"observable/fromeventpattern.js\"></script>\n  <script src=\"observable/frompromise.js\"></script>\n  <script src=\"observable/topromise.js\"></script>\n\n  <!-- Binding -->\n  <script src=\"observable/multicast.js\"></script>\n  <script src=\"observable/publish.js\"></script>\n  <script src=\"observable/publishlast.js\"></script>\n  <script src=\"observable/replay.js\"></script>\n  <script src=\"observable/publishvalue.js\"></script>\n  <script src=\"subjects/behaviorsubject.js\"></script>\n  <script src=\"subjects/replaysubject.js\"></script>\n  <script src=\"observable/connectableobservable.js\"></script>\n\n  <!-- Time -->\n  <script src=\"observable/timer.js\"></script>\n  <script src=\"observable/interval.js\"></script>\n  <script src=\"observable/delay.js\"></script>\n  <script src=\"observable/debounce.js\"></script>\n  <script src=\"observable/timestamp.js\"></script>\n  <script src=\"observable/sample.js\"></script>\n  <script src=\"observable/timeout.js\"></script>\n  <script src=\"observable/throttlefirst.js\"></script>\n\n  <!-- Transducers -->\n  <script src=\"observable/transduce.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/rx.lite.extras.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Reactive Extensions for JavaScript Tests</title>\n  <link rel=\"stylesheet\" href=\"./vendor/qunit-1.11.0.css\">\n</head>\n<body>\n  <div id=\"qunit\"></div>\n  <script>\n    // Backfill for Phantom.js / JSCore\n    if (!Function.prototype.bind) {\n      Function.prototype.bind = function (context) {\n        var self = this;\n        return function () {\n          return self.apply(context, arguments);\n        };\n      };\n    }\n\n    // Polyfills\n    if (!Array.prototype.forEach)\n    {\n      Array.prototype.forEach = function(fun /*, thisArg */)\n      {\n        \"use strict\";\n\n        if (this === void 0 || this === null)\n          throw new TypeError();\n\n        var t = Object(this);\n        var len = t.length >>> 0;\n        if (typeof fun !== \"function\")\n          throw new TypeError();\n\n        var thisArg = arguments.length >= 2 ? arguments[1] : void 0;\n        for (var i = 0; i < len; i++)\n        {\n          if (i in t)\n            fun.call(thisArg, t[i], i, t);\n        }\n      };\n    }\n\n    if (!Object.keys) {\n      Object.keys = (function () {\n        'use strict';\n        var hasOwnProperty = Object.prototype.hasOwnProperty,\n            hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),\n            dontEnums = [\n              'toString',\n              'toLocaleString',\n              'valueOf',\n              'hasOwnProperty',\n              'isPrototypeOf',\n              'propertyIsEnumerable',\n              'constructor'\n            ],\n            dontEnumsLength = dontEnums.length;\n\n        return function (obj) {\n          if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n            throw new TypeError('Object.keys called on non-object');\n          }\n\n          var result = [], prop, i;\n\n          for (prop in obj) {\n            if (hasOwnProperty.call(obj, prop)) {\n              result.push(prop);\n            }\n          }\n\n          if (hasDontEnumBug) {\n            for (i = 0; i < dontEnumsLength; i++) {\n              if (hasOwnProperty.call(obj, dontEnums[i])) {\n                result.push(dontEnums[i]);\n              }\n            }\n          }\n          return result;\n        };\n      }());\n    }\n  </script>\n  <script src=\"./vendor/qunit-1.11.0.js\"></script>\n  <script src=\"./vendor/rsvp.js\"></script>\n  <script src=\"./vendor/es6-shim.min.js\"></script>\n  <script src=\"../dist/rx.lite.compat.js\"></script>\n  <script src=\"../dist/rx.lite.extras.js\"></script>\n  <script src=\"../dist/rx.virtualtime.js\"></script>\n  <script src=\"../dist/rx.time.js\"></script>\n  <script src=\"../dist/rx.testing.js\"></script>\n  <script src=\"helpers/reactiveassert.js\"></script>\n\n  <!-- Individual Tests -->\n\n  <!-- Core -->\n  <script src=\"core/observer-extras.js\"></script>\n\n  <!-- Concurrency -->\n  <script src=\"observable/observeon.js\"></script>\n  <script src=\"observable/subscribeon.js\"></script>\n\n  <!-- Creation -->\n  <script src=\"observable/generate.js\"></script>\n  <script src=\"observable/using.js\"></script>\n\n  <!-- Multiple -->\n  <script src=\"observable/ambproto.js\"></script>\n  <script src=\"observable/onerrorresumenext.js\"></script>\n  <script src=\"observable/onerrorresumenextproto.js\"></script>\n\n  <!-- Single -->\n  <script src=\"observable/bufferwithcount.js\"></script>\n  <script src=\"observable/windowwithcount.js\"></script>\n  <script src=\"observable/takelastbuffer.js\"></script>\n\n  <!-- Standard Query Operators -->\n  <script src=\"observable/defaultifempty.js\"></script>\n  <script src=\"observable/pluck.js\"></script>\n\n</body>\n</html>\n"
  },
  {
    "path": "tests/rx.lite.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\" />\n  <meta charset=\"utf-8\">\n  <title>Reactive Extensions for JavaScript Tests</title>\n  <link rel=\"stylesheet\" href=\"./vendor/qunit-1.11.0.css\">\n</head>\n<body>\n  <div id=\"qunit\"></div>\n  <script src=\"./vendor/qunit-1.11.0.js\"></script>\n  <script src=\"./vendor/rsvp.js\"></script>\n  <script src=\"./vendor/transducers-0.4.158-min.js\"></script>\n  <script src=\"../dist/rx.lite.js\"></script>\n  <script src=\"../dist/rx.virtualtime.js\"></script>\n  <script src=\"../dist/rx.testing.js\"></script>\n  <script src=\"helpers/reactiveassert.js\"></script>\n\n  <script>\n    // Backfill for Phantom.js / JSCore\n    if (!Function.prototype.bind) {\n      Function.prototype.bind = function (context) {\n        var self = this;\n        return function () {\n          return self.apply(context, arguments);\n        };\n      };\n    }\n\n    // Polyfills\n    if (!Array.prototype.forEach)\n    {\n      Array.prototype.forEach = function(fun /*, thisArg */)\n      {\n        \"use strict\";\n\n        if (this === void 0 || this === null)\n          throw new TypeError();\n\n        var t = Object(this);\n        var len = t.length >>> 0;\n        if (typeof fun !== \"function\")\n          throw new TypeError();\n\n        var thisArg = arguments.length >= 2 ? arguments[1] : void 0;\n        for (var i = 0; i < len; i++)\n        {\n          if (i in t)\n            fun.call(thisArg, t[i], i, t);\n        }\n      };\n    }\n\n    if (!Object.keys) {\n      Object.keys = (function () {\n        'use strict';\n        var hasOwnProperty = Object.prototype.hasOwnProperty,\n            hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),\n            dontEnums = [\n              'toString',\n              'toLocaleString',\n              'valueOf',\n              'hasOwnProperty',\n              'isPrototypeOf',\n              'propertyIsEnumerable',\n              'constructor'\n            ],\n            dontEnumsLength = dontEnums.length;\n\n        return function (obj) {\n          if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {\n            throw new TypeError('Object.keys called on non-object');\n          }\n\n          var result = [], prop, i;\n\n          for (prop in obj) {\n            if (hasOwnProperty.call(obj, prop)) {\n              result.push(prop);\n            }\n          }\n\n          if (hasDontEnumBug) {\n            for (i = 0; i < dontEnumsLength; i++) {\n              if (hasOwnProperty.call(obj, dontEnums[i])) {\n                result.push(dontEnums[i]);\n              }\n            }\n          }\n          return result;\n        };\n      }());\n    }\n  </script>\n\n  <!-- Individual Tests -->\n  <script src=\"internal/isequal.js\"></script>\n  <script src=\"subjects/asyncsubject.js\"></script>\n  <script src=\"subjects/subject.js\"></script>\n\n  <script src=\"observable/pausable.js\"></script>\n  <script src=\"observable/pausablebuffered.js\"></script>\n  <script src=\"observable/controlled.js\"></script>\n\n  <script src=\"concurrency/scheduler-lite.js\"></script>\n  <script src=\"concurrency/immediatescheduler.js\"></script>\n  <script src=\"concurrency/currentthreadscheduler.js\"></script>\n  <script src=\"concurrency/defaultscheduler.js\"></script>\n\n  <script src=\"disposables/compositedisposable.js\"></script>\n  <script src=\"disposables/disposable.js\"></script>\n  <script src=\"disposables/refcountdisposable.js\"></script>\n  <script src=\"disposables/serialdisposable.js\"></script>\n\n  <script src=\"core/notification.js\"></script>\n  <script src=\"core/observable.js\"></script>\n  <script src=\"core/observer-lite.js\"></script>\n\n  <!-- Creation -->\n\n  <script src=\"observable/create.js\"></script>\n  <script src=\"observable/defer.js\"></script>\n  <script src=\"observable/empty.js\"></script>\n  <script src=\"observable/from.js\"></script>\n  <script src=\"observable/fromarray.js\"></script>\n  <script src=\"observable/never.js\"></script>\n  <script src=\"observable/of.js\"></script>\n  <script src=\"observable/pairs.js\"></script>\n  <script src=\"observable/range.js\"></script>\n  <script src=\"observable/repeat.js\"></script>\n  <script src=\"observable/return.js\"></script>\n  <script src=\"observable/throw.js\"></script>\n\n  <!-- Multiple -->\n  <script src=\"observable/catch.js\"></script>\n  <script src=\"observable/combinelatest.js\"></script>\n  <script src=\"observable/concat.js\"></script>\n  <script src=\"observable/merge.js\"></script>\n  <script src=\"observable/mergeconcat.js\"></script>\n  <script src=\"observable/mergeall.js\"></script>\n  <script src=\"observable/mergedelayerror.js\"></script>\n  <script src=\"observable/skipuntil.js\"></script>\n  <script src=\"observable/switch.js\"></script>\n  <script src=\"observable/takeuntil.js\"></script>\n  <script src=\"observable/withlatestfrom.js\"></script>\n  <script src=\"observable/zip.js\"></script>\n\n  <!-- Single -->\n  <script src=\"observable/asobservable.js\"></script>\n  <script src=\"observable/distinctuntilchanged.js\"></script>\n  <script src=\"observable/do.js\"></script>\n  <script src=\"observable/finally.js\"></script>\n  <script src=\"observable/ignoreelements.js\"></script>\n  <script src=\"observable/materialize.js\"></script>\n  <script src=\"observable/retry.js\"></script>\n  <script src=\"observable/retrywhen.js\"></script>\n  <script src=\"observable/repeatwhen.js\"></script>\n  <script src=\"observable/scan.js\"></script>\n  <script src=\"observable/skiplast.js\"></script>\n  <script src=\"observable/startwith.js\"></script>\n  <script src=\"observable/takelast.js\"></script>\n\n  <!-- Standard Query Operators -->\n  <script src=\"observable/concatmap.js\"></script>\n  <script src=\"observable/select.js\"></script>\n  <script src=\"observable/selectmany.js\"></script>\n  <script src=\"observable/skip.js\"></script>\n  <script src=\"observable/skipwhile.js\"></script>\n  <script src=\"observable/take.js\"></script>\n  <script src=\"observable/takewhile.js\"></script>\n  <script src=\"observable/toarray.js\"></script>\n  <script src=\"observable/where.js\"></script>\n\n  <!-- Async Operators -->\n  <script src=\"observable/fromcallback.js\"></script>\n  <script src=\"observable/fromnodecallback.js\"></script>\n  <script src=\"observable/fromevent.js\"></script>\n  <script src=\"observable/fromeventpattern.js\"></script>\n  <script src=\"observable/frompromise.js\"></script>\n  <script src=\"observable/topromise.js\"></script>\n\n  <!-- Binding -->\n  <script src=\"observable/multicast.js\"></script>\n  <script src=\"observable/publish.js\"></script>\n  <script src=\"observable/publishlast.js\"></script>\n  <script src=\"observable/replay.js\"></script>\n  <script src=\"observable/publishvalue.js\"></script>\n  <script src=\"subjects/behaviorsubject.js\"></script>\n  <script src=\"subjects/replaysubject.js\"></script>\n  <script src=\"observable/connectableobservable.js\"></script>\n\n  <!-- Time -->\n  <script src=\"observable/timer.js\"></script>\n  <script src=\"observable/interval.js\"></script>\n  <script src=\"observable/delay.js\"></script>\n  <script src=\"observable/debounce.js\"></script>\n  <script src=\"observable/timestamp.js\"></script>\n  <script src=\"observable/sample.js\"></script>\n  <script src=\"observable/timeout.js\"></script>\n  <script src=\"observable/throttlefirst.js\"></script>\n\n  <!-- Transducers -->\n  <script src=\"observable/transduce.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/rx.time.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Reactive Extensions for JavaScript Tests</title>\n  <link rel=\"stylesheet\" href=\"./vendor/qunit-1.11.0.css\">\n</head>\n<body>\n  <div id=\"qunit\"></div>\n  <script src=\"./vendor/qunit-1.11.0.js\"></script>\n  <script src=\"../dist/rx.compat.js\"></script>\n  <script src=\"../dist/rx.virtualtime.js\"></script>\n  <script src=\"../dist/rx.time.js\"></script>\n  <script src=\"../dist/rx.testing.js\"></script>\n  <script src=\"helpers/reactiveassert.js\"></script>\n\n  <!-- Individual Tests -->\n  <script src=\"observable/windowwithtimeorcount.js\"></script>\n  <script src=\"observable/bufferwithtimeorcount.js\"></script>\n  <script src=\"observable/timer.js\"></script>\n  <script src=\"observable/interval.js\"></script>\n  <script src=\"observable/delay.js\"></script>\n  <script src=\"observable/debounce.js\"></script>\n  <script src=\"observable/debounce.js\"></script>\n  <script src=\"observable/bufferwithtime.js\"></script>\n  <script src=\"observable/windowwithtime.js\"></script>\n  <script src=\"observable/timeinterval.js\"></script>\n  <script src=\"observable/timestamp.js\"></script>\n  <script src=\"observable/sample.js\"></script>\n  <script src=\"observable/timeout.js\"></script>\n  <script src=\"observable/generatewithrelativetime.js\"></script>\n  <script src=\"observable/generatewithabsolutetime.js\"></script>\n  <script src=\"observable/takelastbufferwithtime.js\"></script>\n  <script src=\"observable/takewithtime.js\"></script>\n  <script src=\"observable/skipwithtime.js\"></script>\n  <script src=\"observable/takelastwithtime.js\"></script>\n  <script src=\"observable/skiplastwithtime.js\"></script>\n  <script src=\"observable/skipuntilwithtime.js\"></script>\n  <script src=\"observable/takeuntilwithtime.js\"></script>\n  <script src=\"observable/throttle.js\"></script>\n  <script src=\"observable/delaysubscription.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/rx.virtualtime.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Reactive Extensions for JavaScript Join Pattern Tests</title>\n  <link rel=\"stylesheet\" href=\"./vendor/qunit-1.11.0.css\">\n</head>\n<body>\n  <div id=\"qunit\"></div>\n  <script src=\"./vendor/qunit-1.11.0.js\"></script>\n  <script src=\"../dist/rx.compat.js\"></script>\n  <script src=\"../dist/rx.virtualtime.js\"></script>\n  <script src=\"../dist/rx.testing.js\"></script>\n  <script src=\"helpers/reactiveassert.js\"></script>\n\n  <!-- Individual Tests -->\n  <script src=\"concurrency/historicalscheduler.js\"></script>\n  <script src=\"concurrency/virtualtimescheduler.js\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/subjects/asyncsubject.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, raises */\n\n  QUnit.module('AsyncSubject');\n\n  var AsyncSubject = Rx.AsyncSubject,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('Infinite', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 1),\n      onNext(110, 2),\n      onNext(220, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(410, 6),\n      onNext(520, 7),\n      onNext(630, 8),\n      onNext(710, 9),\n      onNext(870, 10),\n      onNext(940, 11),\n      onNext(1020, 12)\n    );\n\n    var results1 = scheduler.createObserver();\n    var results2 = scheduler.createObserver();\n    var results3 = scheduler.createObserver();\n    var subject;\n\n    var subscription, subscription1, subscription2, subscription3;\n\n    scheduler.scheduleAbsolute(null, 100, function () {\n        subject = new AsyncSubject();\n    });\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = xs.subscribe(subject);\n    });\n    scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      subscription1 = subject.subscribe(results1);\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      subscription2 = subject.subscribe(results2);\n    });\n\n    scheduler.scheduleAbsolute(null, 900, function () {\n      subscription3 = subject.subscribe(results3);\n    });\n\n    scheduler.scheduleAbsolute(null, 600, function () {\n      subscription1.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 700, function () {\n      subscription2.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      subscription1.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 950, function () {\n      subscription3.dispose();\n    });\n\n    scheduler.start();\n\n    results1.messages.assertEqual();\n\n    results2.messages.assertEqual();\n\n    results3.messages.assertEqual();\n  });\n\n  test('Finite', function () {\n      var scheduler = new TestScheduler();\n      var xs = scheduler.createHotObservable(\n        onNext(70, 1),\n        onNext(110, 2),\n        onNext(220, 3),\n        onNext(270, 4),\n        onNext(340, 5),\n        onNext(410, 6),\n        onNext(520, 7),\n        onCompleted(630),\n        onNext(640, 9),\n        onCompleted(650),\n        onError(660, new Error())\n      );\n\n      var results1 = scheduler.createObserver();\n      var results2 = scheduler.createObserver();\n      var results3 = scheduler.createObserver();\n      var subject;\n\n      var subscription, subscription1, subscription2, subscription3;\n\n      scheduler.scheduleAbsolute(null, 100, function () {\n        subject = new AsyncSubject();\n      });\n      scheduler.scheduleAbsolute(null, 200, function () {\n        subscription = xs.subscribe(subject);\n      });\n      scheduler.scheduleAbsolute(null, 1000, function () {\n        subscription.dispose();\n      });\n      scheduler.scheduleAbsolute(null, 300, function () {\n        subscription1 = subject.subscribe(results1);\n      });\n      scheduler.scheduleAbsolute(null, 400, function () {\n        subscription2 = subject.subscribe(results2);\n      });\n      scheduler.scheduleAbsolute(null, 900, function () {\n        subscription3 = subject.subscribe(results3);\n      });\n      scheduler.scheduleAbsolute(null, 600, function () {\n        subscription1.dispose();\n      });\n      scheduler.scheduleAbsolute(null, 700, function () {\n        subscription2.dispose();\n      });\n      scheduler.scheduleAbsolute(null, 800, function () {\n        subscription1.dispose();\n      });\n      scheduler.scheduleAbsolute(null, 950, function () {\n        subscription3.dispose();\n      });\n      scheduler.start();\n      results1.messages.assertEqual();\n      results2.messages.assertEqual(onNext(630, 7), onCompleted(630));\n      results3.messages.assertEqual(onNext(900, 7), onCompleted(900));\n  });\n\n  test('Error', function () {\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 1),\n      onNext(110, 2),\n      onNext(220, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(410, 6),\n      onNext(520, 7),\n      onError(630, error),\n      onNext(640, 9),\n      onCompleted(650),\n      onError(660, new Error())\n    );\n\n    var results1 = scheduler.createObserver();\n    var results2 = scheduler.createObserver();\n    var results3 = scheduler.createObserver();\n    var subject;\n\n    var subscription, subscription1, subscription2, subscription3;\n\n    scheduler.scheduleAbsolute(null, 100, function () {\n      subject = new AsyncSubject();\n    });\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = xs.subscribe(subject);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      subscription1 = subject.subscribe(results1);\n    });\n    scheduler.scheduleAbsolute(null, 400, function () {\n      subscription2 = subject.subscribe(results2);\n    });\n\n    scheduler.scheduleAbsolute(null, 900, function () {\n      subscription3 = subject.subscribe(results3);\n    });\n\n    scheduler.scheduleAbsolute(null, 600, function () {\n      subscription1.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 700, function () {\n      subscription2.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      subscription1.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 950, function () {\n      subscription3.dispose();\n    });\n\n    scheduler.start();\n\n    results1.messages.assertEqual();\n    results2.messages.assertEqual(onError(630, error));\n    results3.messages.assertEqual(onError(900, error));\n  });\n\n  test('cancelled', function () {\n    var scheduler = new TestScheduler();\n    var xs = scheduler.createHotObservable(\n      onCompleted(630),\n      onNext(640, 9),\n      onCompleted(650),\n      onError(660, new Error()));\n\n    var results1 = scheduler.createObserver();\n    var results2 = scheduler.createObserver();\n    var results3 = scheduler.createObserver();\n    var subject;\n\n    var subscription, subscription1, subscription2, subscription3;\n\n    scheduler.scheduleAbsolute(null, 100, function () {\n      subject = new AsyncSubject();\n    });\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = xs.subscribe(subject);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      subscription1 = subject.subscribe(results1);\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      subscription2 = subject.subscribe(results2);\n    });\n\n    scheduler.scheduleAbsolute(null, 900, function () {\n      subscription3 = subject.subscribe(results3);\n    });\n\n    scheduler.scheduleAbsolute(null, 600, function () {\n      subscription1.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 700, function () {\n      subscription2.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      subscription1.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 950, function () {\n      subscription3.dispose();\n    });\n\n    scheduler.start();\n\n    results1.messages.assertEqual();\n    results2.messages.assertEqual(onCompleted(630));\n    results3.messages.assertEqual(onCompleted(900));\n  });\n\n  test('disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var results1 = scheduler.createObserver();\n    var results2 = scheduler.createObserver();\n    var results3 = scheduler.createObserver();\n    var subject;\n\n    var subscription1, subscription2, subscription3;\n\n    scheduler.scheduleAbsolute(null, 100, function () {\n      subject = new AsyncSubject();\n    });\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription1 = subject.subscribe(results1);\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      subscription2 = subject.subscribe(results2);\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      subscription3 = subject.subscribe(results3);\n    });\n\n    scheduler.scheduleAbsolute(null, 500, function () {\n      subscription1.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 600, function () {\n      subject.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 700, function () {\n      subscription2.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      subscription3.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 150, function () {\n      subject.onNext(1);\n    });\n\n    scheduler.scheduleAbsolute(null, 250, function () {\n      subject.onNext(2);\n    });\n\n    scheduler.scheduleAbsolute(null, 350, function () {\n      subject.onNext(3);\n    });\n\n    scheduler.scheduleAbsolute(null, 450, function () {\n      subject.onNext(4);\n    });\n\n    scheduler.scheduleAbsolute(null, 550, function () {\n      subject.onNext(5);\n    });\n\n    scheduler.scheduleAbsolute(null, 650, function () {\n      raises(function () { subject.onNext(6); });\n    });\n\n    scheduler.scheduleAbsolute(null, 750, function () {\n      raises(function () { subject.onCompleted(); });\n    });\n\n    scheduler.scheduleAbsolute(null, 850, function () {\n        raises(function () { subject.onError(new Error()); });\n    });\n\n    scheduler.scheduleAbsolute(null, 950, function () {\n        raises(function () { subject.subscribe(); });\n    });\n\n    scheduler.start();\n\n    results1.messages.assertEqual();\n    results2.messages.assertEqual();\n    results3.messages.assertEqual();\n  });\n\n}());\n"
  },
  {
    "path": "tests/subjects/behaviorsubject.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, raises */\n\n  QUnit.module('BehaviorSubject');\n\n  var BehaviorSubject = Rx.BehaviorSubject,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('Infinite', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n          onNext(70, 1),\n          onNext(110, 2),\n          onNext(220, 3),\n          onNext(270, 4),\n          onNext(340, 5),\n          onNext(410, 6),\n          onNext(520, 7),\n          onNext(630, 8),\n          onNext(710, 9),\n          onNext(870, 10),\n          onNext(940, 11),\n          onNext(1020, 12)\n      );\n\n      var subject, subscription, subscription1, subscription2, subscription3;\n\n      var results1 = scheduler.createObserver();\n      var results2 = scheduler.createObserver();\n      var results3 = scheduler.createObserver();\n\n      scheduler.scheduleAbsolute(null, 100, function () { subject = new BehaviorSubject(100); });\n      scheduler.scheduleAbsolute(null, 200, function () { subscription = xs.subscribe(subject); });\n      scheduler.scheduleAbsolute(null, 1000, function () { subscription.dispose(); });\n\n      scheduler.scheduleAbsolute(null, 300, function () { subscription1 = subject.subscribe(results1); });\n      scheduler.scheduleAbsolute(null, 400, function () { subscription2 = subject.subscribe(results2); });\n      scheduler.scheduleAbsolute(null, 900, function () { subscription3 = subject.subscribe(results3); });\n\n      scheduler.scheduleAbsolute(null, 600, function () { subscription1.dispose(); });\n      scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n      scheduler.scheduleAbsolute(null, 800, function () { subscription1.dispose(); });\n      scheduler.scheduleAbsolute(null, 950, function () { subscription3.dispose(); });\n\n      scheduler.start();\n\n      results1.messages.assertEqual(\n          onNext(300, 4),\n          onNext(340, 5),\n          onNext(410, 6),\n          onNext(520, 7)\n      );\n\n      results2.messages.assertEqual(\n          onNext(400, 5),\n          onNext(410, 6),\n          onNext(520, 7),\n          onNext(630, 8)\n      );\n\n      results3.messages.assertEqual(\n          onNext(900, 10),\n          onNext(940, 11)\n      );\n  });\n\n  test('Finite', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n          onNext(70, 1),\n          onNext(110, 2),\n          onNext(220, 3),\n          onNext(270, 4),\n          onNext(340, 5),\n          onNext(410, 6),\n          onNext(520, 7),\n          onCompleted(630),\n          onNext(640, 9),\n          onCompleted(650),\n          onError(660, new Error())\n      );\n\n      var subject, subscription, subscription1, subscription2, subscription3;\n\n      var results1 = scheduler.createObserver();\n      var results2 = scheduler.createObserver();\n      var results3 = scheduler.createObserver();\n\n      scheduler.scheduleAbsolute(null, 100, function () { subject = new BehaviorSubject(100); });\n      scheduler.scheduleAbsolute(null, 200, function () { subscription = xs.subscribe(subject); });\n      scheduler.scheduleAbsolute(null, 1000, function () { subscription.dispose(); });\n\n      scheduler.scheduleAbsolute(null, 300, function () { subscription1 = subject.subscribe(results1); });\n      scheduler.scheduleAbsolute(null, 400, function () { subscription2 = subject.subscribe(results2); });\n      scheduler.scheduleAbsolute(null, 900, function () { subscription3 = subject.subscribe(results3); });\n\n      scheduler.scheduleAbsolute(null, 600, function () { subscription1.dispose(); });\n      scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n      scheduler.scheduleAbsolute(null, 800, function () { subscription1.dispose(); });\n      scheduler.scheduleAbsolute(null, 950, function () { subscription3.dispose(); });\n\n      scheduler.start();\n\n      results1.messages.assertEqual(\n          onNext(300, 4),\n          onNext(340, 5),\n          onNext(410, 6),\n          onNext(520, 7)\n      );\n\n      results2.messages.assertEqual(\n          onNext(400, 5),\n          onNext(410, 6),\n          onNext(520, 7),\n          onCompleted(630)\n      );\n\n      results3.messages.assertEqual(\n          onCompleted(900)\n      );\n  });\n\n  test('Error', function () {\n      var scheduler = new TestScheduler();\n\n      var ex = new Error();\n\n      var xs = scheduler.createHotObservable(\n          onNext(70, 1),\n          onNext(110, 2),\n          onNext(220, 3),\n          onNext(270, 4),\n          onNext(340, 5),\n          onNext(410, 6),\n          onNext(520, 7),\n          onError(630, ex),\n          onNext(640, 9),\n          onCompleted(650),\n          onError(660, new Error())\n      );\n\n      var subject, subscription, subscription1, subscription2, subscription3;\n\n      var results1 = scheduler.createObserver();\n      var results2 = scheduler.createObserver();\n      var results3 = scheduler.createObserver();\n\n      scheduler.scheduleAbsolute(null, 100, function () { subject = new BehaviorSubject(100); });\n      scheduler.scheduleAbsolute(null, 200, function () { subscription = xs.subscribe(subject); });\n      scheduler.scheduleAbsolute(null, 1000, function () { subscription.dispose(); });\n\n      scheduler.scheduleAbsolute(null, 300, function () { subscription1 = subject.subscribe(results1); });\n      scheduler.scheduleAbsolute(null, 400, function () { subscription2 = subject.subscribe(results2); });\n      scheduler.scheduleAbsolute(null, 900, function () { subscription3 = subject.subscribe(results3); });\n\n      scheduler.scheduleAbsolute(null, 600, function () { subscription1.dispose(); });\n      scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n      scheduler.scheduleAbsolute(null, 800, function () { subscription1.dispose(); });\n      scheduler.scheduleAbsolute(null, 950, function () { subscription3.dispose(); });\n\n      scheduler.start();\n\n      results1.messages.assertEqual(\n          onNext(300, 4),\n          onNext(340, 5),\n          onNext(410, 6),\n          onNext(520, 7)\n      );\n\n      results2.messages.assertEqual(\n          onNext(400, 5),\n          onNext(410, 6),\n          onNext(520, 7),\n          onError(630, ex)\n      );\n\n      results3.messages.assertEqual(\n          onError(900, ex)\n      );\n  });\n\n  test('Canceled', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n          onCompleted(630),\n          onNext(640, 9),\n          onCompleted(650),\n          onError(660, new Error())\n      );\n\n      var subject, subscription, subscription1, subscription2, subscription3;\n\n      var results1 = scheduler.createObserver();\n      var results2 = scheduler.createObserver();\n      var results3 = scheduler.createObserver();\n\n      scheduler.scheduleAbsolute(null, 100, function () { subject = new BehaviorSubject(100); });\n      scheduler.scheduleAbsolute(null, 200, function () { subscription = xs.subscribe(subject); });\n      scheduler.scheduleAbsolute(null, 1000, function () { subscription.dispose(); });\n\n      scheduler.scheduleAbsolute(null, 300, function () { subscription1 = subject.subscribe(results1); });\n      scheduler.scheduleAbsolute(null, 400, function () { subscription2 = subject.subscribe(results2); });\n      scheduler.scheduleAbsolute(null, 900, function () { subscription3 = subject.subscribe(results3); });\n\n      scheduler.scheduleAbsolute(null, 600, function () { subscription1.dispose(); });\n      scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n      scheduler.scheduleAbsolute(null, 800, function () { subscription1.dispose(); });\n      scheduler.scheduleAbsolute(null, 950, function () { subscription3.dispose(); });\n\n      scheduler.start();\n\n      results1.messages.assertEqual(\n          onNext(300, 100)\n      );\n\n      results2.messages.assertEqual(\n          onNext(400, 100),\n          onCompleted(630)\n      );\n\n      results3.messages.assertEqual(\n          onCompleted(900)\n      );\n  });\n\n  test('SubjectDisposed', function () {\n      var scheduler = new TestScheduler();\n\n      var subject;\n\n      var results1 = scheduler.createObserver();\n      var subscription1;\n\n      var results2 = scheduler.createObserver();\n      var subscription2;\n\n      var results3 = scheduler.createObserver();\n      var subscription3;\n\n      scheduler.scheduleAbsolute(null, 100, function () { subject = new BehaviorSubject(0); });\n      scheduler.scheduleAbsolute(null, 200, function () { subscription1 = subject.subscribe(results1); });\n      scheduler.scheduleAbsolute(null, 300, function () { subscription2 = subject.subscribe(results2); });\n      scheduler.scheduleAbsolute(null, 400, function () { subscription3 = subject.subscribe(results3); });\n      scheduler.scheduleAbsolute(null, 500, function () { subscription1.dispose(); });\n      scheduler.scheduleAbsolute(null, 600, function () { subject.dispose(); });\n      scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n      scheduler.scheduleAbsolute(null, 800, function () { subscription3.dispose(); });\n\n      scheduler.scheduleAbsolute(null, 150, function () { subject.onNext(1); });\n      scheduler.scheduleAbsolute(null, 250, function () { subject.onNext(2); });\n      scheduler.scheduleAbsolute(null, 350, function () { subject.onNext(3); });\n      scheduler.scheduleAbsolute(null, 450, function () { subject.onNext(4); });\n      scheduler.scheduleAbsolute(null, 550, function () { subject.onNext(5); });\n      scheduler.scheduleAbsolute(null, 650, function () { raises(function () { subject.onNext(6); }); });\n      scheduler.scheduleAbsolute(null, 750, function () { raises(function () { subject.onCompleted(); }); });\n      scheduler.scheduleAbsolute(null, 850, function () { raises(function () { subject.onError(new Error()); }); });\n      scheduler.scheduleAbsolute(null, 950, function () { raises(function () { subject.subscribe(); }); });\n\n      scheduler.start();\n\n      results1.messages.assertEqual(\n          onNext(200, 1),\n          onNext(250, 2),\n          onNext(350, 3),\n          onNext(450, 4)\n      );\n\n      results2.messages.assertEqual(\n          onNext(300, 2),\n          onNext(350, 3),\n          onNext(450, 4),\n          onNext(550, 5)\n      );\n\n      results3.messages.assertEqual(\n          onNext(400, 3),\n          onNext(450, 4),\n          onNext(550, 5)\n      );\n  });\n\n  test('value vs getValue()', function () {\n      var scheduler = new TestScheduler();\n\n      var subject;\n\n      var resultsGetValue = scheduler.createObserver();\n      var resultsValue = scheduler.createObserver();\n\n      // create and dispose\n      scheduler.scheduleAbsolute(null, 100, function () { subject = new BehaviorSubject(0); });\n      scheduler.scheduleAbsolute(null, 650, function () { subject.dispose(); });\n\n      // fill the subject with values\n      scheduler.scheduleAbsolute(null, 150, function () { subject.onNext(1); });\n      scheduler.scheduleAbsolute(null, 250, function () { subject.onNext(2); });\n      scheduler.scheduleAbsolute(null, 350, function () { subject.onNext(3); });\n      scheduler.scheduleAbsolute(null, 450, function () { subject.onNext(4); });\n      scheduler.scheduleAbsolute(null, 550, function () { subject.onError(new Error('Subject onError() method has been called')); });\n\n      // getValue()\n      scheduler.scheduleAbsolute(null, 200, function () { resultsGetValue.onNext(subject.getValue()); });\n      scheduler.scheduleAbsolute(null, 300, function () { resultsGetValue.onNext(subject.getValue()); });\n      scheduler.scheduleAbsolute(null, 400, function () { resultsGetValue.onNext(subject.getValue()); });\n      scheduler.scheduleAbsolute(null, 500, function () { resultsGetValue.onNext(subject.getValue()); });\n      scheduler.scheduleAbsolute(null, 600, function () { raises(function () { resultsGetValue.onNext(subject.getValue()); }); });\n      scheduler.scheduleAbsolute(null, 700, function () { raises(function () { resultsGetValue.onNext(subject.getValue()); }); });\n\n      // value\n      scheduler.scheduleAbsolute(null, 200, function () { resultsValue.onNext(subject.value); });\n      scheduler.scheduleAbsolute(null, 300, function () { resultsValue.onNext(subject.value); });\n      scheduler.scheduleAbsolute(null, 400, function () { resultsValue.onNext(subject.value); });\n      scheduler.scheduleAbsolute(null, 500, function () { resultsValue.onNext(subject.value); });\n      scheduler.scheduleAbsolute(null, 600, function () { resultsValue.onNext(subject.value); });\n      scheduler.scheduleAbsolute(null, 700, function () { resultsValue.onNext(subject.value); });\n\n      scheduler.start();\n\n      resultsGetValue.messages.assertEqual(\n          onNext(200, 1),\n          onNext(300, 2),\n          onNext(400, 3),\n          onNext(500, 4)\n\n          // getValue() throws an exception if BehaviorSubject.onError() has been called\n          //onNext(600)\n\n          // getValue() throws an exception if BehaviorSubject has been disposed\n          //onNext(700)\n      );\n\n      resultsValue.messages.assertEqual(\n          onNext(200, 1),\n          onNext(300, 2),\n          onNext(400, 3),\n          onNext(500, 4),\n\n          // value is frozen if BehaviorSubject.onError() has been called\n          onNext(600, 4),\n\n          // value returns null if BehaviorSubject has been disposed\n          onNext(700, null)\n      );\n  });\n\n}());\n"
  },
  {
    "path": "tests/subjects/replaysubject.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, raises */\n\n  QUnit.module('ReplaySubject');\n\n  var ReplaySubject = Rx.ReplaySubject,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('Infinite', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 1),\n      onNext(110, 2),\n      onNext(220, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(410, 6),\n      onNext(520, 7),\n      onNext(630, 8),\n      onNext(710, 9),\n      onNext(870, 10),\n      onNext(940, 11),\n      onNext(1020, 12)\n    );\n\n    var subject, subscription, subscription1, subscription2, subscription3;\n\n    var results1 = scheduler.createObserver();\n    var results2 = scheduler.createObserver();\n    var results3 = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, 100, function () { subject = new ReplaySubject(3, 100, scheduler); });\n    scheduler.scheduleAbsolute(null, 200, function () { subscription = xs.subscribe(subject); });\n    scheduler.scheduleAbsolute(null, 1000, function () { subscription.dispose(); });\n\n    scheduler.scheduleAbsolute(null, 300, function () { subscription1 = subject.subscribe(results1); });\n    scheduler.scheduleAbsolute(null, 400, function () { subscription2 = subject.subscribe(results2); });\n    scheduler.scheduleAbsolute(null, 900, function () { subscription3 = subject.subscribe(results3); });\n\n    scheduler.scheduleAbsolute(null, 600, function () { subscription1.dispose(); });\n    scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n    scheduler.scheduleAbsolute(null, 800, function () { subscription1.dispose(); });\n    scheduler.scheduleAbsolute(null, 950, function () { subscription3.dispose(); });\n\n    scheduler.start();\n\n    results1.messages.assertEqual(\n      onNext(301, 3),\n      onNext(302, 4),\n      onNext(341, 5),\n      onNext(411, 6),\n      onNext(521, 7)\n    );\n\n    results2.messages.assertEqual(\n      onNext(401, 5),\n      onNext(411, 6),\n      onNext(521, 7),\n      onNext(631, 8)\n    );\n\n    results3.messages.assertEqual(\n      onNext(901, 10),\n      onNext(941, 11)\n    );\n  });\n\n  test('Infinite2', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 1),\n      onNext(110, 2),\n      onNext(220, 3),\n      onNext(270, 4),\n      onNext(280, -1),\n      onNext(290, -2),\n      onNext(340, 5),\n      onNext(410, 6),\n      onNext(520, 7),\n      onNext(630, 8),\n      onNext(710, 9),\n      onNext(870, 10),\n      onNext(940, 11),\n      onNext(1020, 12)\n    );\n\n    var subject, subscription, subscription1, subscription2, subscription3;\n\n    var results1 = scheduler.createObserver();\n    var results2 = scheduler.createObserver();\n    var results3 = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, 100, function () { subject = new ReplaySubject(3, 100, scheduler); });\n    scheduler.scheduleAbsolute(null, 200, function () { subscription = xs.subscribe(subject); });\n    scheduler.scheduleAbsolute(null, 1000, function () { subscription.dispose(); });\n\n    scheduler.scheduleAbsolute(null, 300, function () { subscription1 = subject.subscribe(results1); });\n    scheduler.scheduleAbsolute(null, 400, function () { subscription2 = subject.subscribe(results2); });\n    scheduler.scheduleAbsolute(null, 900, function () { subscription3 = subject.subscribe(results3); });\n\n    scheduler.scheduleAbsolute(null, 600, function () { subscription1.dispose(); });\n    scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n    scheduler.scheduleAbsolute(null, 800, function () { subscription1.dispose(); });\n    scheduler.scheduleAbsolute(null, 950, function () { subscription3.dispose(); });\n\n    scheduler.start();\n\n    results1.messages.assertEqual(\n      onNext(301, 4),\n      onNext(302, -1),\n      onNext(303, -2),\n      onNext(341, 5),\n      onNext(411, 6),\n      onNext(521, 7)\n    );\n\n    results2.messages.assertEqual(\n      onNext(401, 5),\n      onNext(411, 6),\n      onNext(521, 7),\n      onNext(631, 8)\n    );\n\n    results3.messages.assertEqual(\n      onNext(901, 10),\n      onNext(941, 11)\n    );\n  });\n\n  test('Finite', function () {\n      var scheduler = new TestScheduler();\n\n      var xs = scheduler.createHotObservable(\n        onNext(70, 1),\n        onNext(110, 2),\n        onNext(220, 3),\n        onNext(270, 4),\n        onNext(340, 5),\n        onNext(410, 6),\n        onNext(520, 7),\n        onCompleted(630),\n        onNext(640, 9),\n        onCompleted(650),\n        onError(660, new Error())\n      );\n\n      var subject, subscription, subscription1, subscription2, subscription3;\n\n      var results1 = scheduler.createObserver();\n      var results2 = scheduler.createObserver();\n      var results3 = scheduler.createObserver();\n\n      scheduler.scheduleAbsolute(null, 100, function () { subject = new ReplaySubject(3, 100, scheduler); });\n      scheduler.scheduleAbsolute(null, 200, function () { subscription = xs.subscribe(subject); });\n      scheduler.scheduleAbsolute(null, 1000, function () { subscription.dispose(); });\n\n      scheduler.scheduleAbsolute(null, 300, function () { subscription1 = subject.subscribe(results1); });\n      scheduler.scheduleAbsolute(null, 400, function () { subscription2 = subject.subscribe(results2); });\n      scheduler.scheduleAbsolute(null, 900, function () { subscription3 = subject.subscribe(results3); });\n\n      scheduler.scheduleAbsolute(null, 600, function () { subscription1.dispose(); });\n      scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n      scheduler.scheduleAbsolute(null, 800, function () { subscription1.dispose(); });\n      scheduler.scheduleAbsolute(null, 950, function () { subscription3.dispose(); });\n\n      scheduler.start();\n\n      results1.messages.assertEqual(\n        onNext(301, 3),\n        onNext(302, 4),\n        onNext(341, 5),\n        onNext(411, 6),\n        onNext(521, 7)\n      );\n\n      results2.messages.assertEqual(\n        onNext(401, 5),\n        onNext(411, 6),\n        onNext(521, 7),\n        onCompleted(631)\n      );\n\n      results3.messages.assertEqual(\n        onCompleted(901)\n      );\n  });\n\n  test('Error', function () {\n      var scheduler = new TestScheduler();\n\n      var error = new Error();\n\n      var xs = scheduler.createHotObservable(\n          onNext(70, 1),\n          onNext(110, 2),\n          onNext(220, 3),\n          onNext(270, 4),\n          onNext(340, 5),\n          onNext(410, 6),\n          onNext(520, 7),\n          onError(630, error),\n          onNext(640, 9),\n          onCompleted(650),\n          onError(660, new Error(new Error()))\n      );\n\n      var subject, subscription, subscription1, subscription2, subscription3;\n\n      var results1 = scheduler.createObserver();\n      var results2 = scheduler.createObserver();\n      var results3 = scheduler.createObserver();\n\n      scheduler.scheduleAbsolute(null, 100, function () { subject = new ReplaySubject(3, 100, scheduler); });\n      scheduler.scheduleAbsolute(null, 200, function () { subscription = xs.subscribe(subject); });\n      scheduler.scheduleAbsolute(null, 1000, function () { subscription.dispose(); });\n\n      scheduler.scheduleAbsolute(null, 300, function () { subscription1 = subject.subscribe(results1); });\n      scheduler.scheduleAbsolute(null, 400, function () { subscription2 = subject.subscribe(results2); });\n      scheduler.scheduleAbsolute(null, 900, function () { subscription3 = subject.subscribe(results3); });\n\n      scheduler.scheduleAbsolute(null, 600, function () { subscription1.dispose(); });\n      scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n      scheduler.scheduleAbsolute(null, 800, function () { subscription1.dispose(); });\n      scheduler.scheduleAbsolute(null, 950, function () { subscription3.dispose(); });\n\n      scheduler.start();\n\n      results1.messages.assertEqual(\n        onNext(301, 3),\n        onNext(302, 4),\n        onNext(341, 5),\n        onNext(411, 6),\n        onNext(521, 7)\n      );\n\n      results2.messages.assertEqual(\n        onNext(401, 5),\n        onNext(411, 6),\n        onNext(521, 7),\n        onError(631, error)\n      );\n\n      results3.messages.assertEqual(\n        onError(901, error)\n      );\n  });\n\n  test('Canceled', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onCompleted(630),\n      onNext(640, 9),\n      onCompleted(650),\n      onError(660, new Error())\n    );\n\n    var subject, subscription, subscription1, subscription2, subscription3;\n\n    var results1 = scheduler.createObserver();\n    var results2 = scheduler.createObserver();\n    var results3 = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, 100, function () { subject = new ReplaySubject(3, 100, scheduler); });\n    scheduler.scheduleAbsolute(null, 200, function () { subscription = xs.subscribe(subject); });\n    scheduler.scheduleAbsolute(null, 1000, function () { subscription.dispose(); });\n\n    scheduler.scheduleAbsolute(null, 300, function () { subscription1 = subject.subscribe(results1); });\n    scheduler.scheduleAbsolute(null, 400, function () { subscription2 = subject.subscribe(results2); });\n    scheduler.scheduleAbsolute(null, 900, function () { subscription3 = subject.subscribe(results3); });\n\n    scheduler.scheduleAbsolute(null, 600, function () { subscription1.dispose(); });\n    scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n    scheduler.scheduleAbsolute(null, 800, function () { subscription1.dispose(); });\n    scheduler.scheduleAbsolute(null, 950, function () { subscription3.dispose(); });\n\n    scheduler.start();\n\n    results1.messages.assertEqual(\n    );\n\n    results2.messages.assertEqual(\n      onCompleted(631)\n    );\n\n    results3.messages.assertEqual(\n      onCompleted(901)\n    );\n  });\n\n  test('Disposed', function () {\n    var scheduler = new TestScheduler();\n\n    var subject, subscription1, subscription2, subscription3;\n\n    var results1 = scheduler.createObserver();\n    var results2 = scheduler.createObserver();\n    var results3 = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, 100, function () { subject = new ReplaySubject(undefined, undefined, scheduler); });\n    scheduler.scheduleAbsolute(null, 200, function () { subscription1 = subject.subscribe(results1); });\n    scheduler.scheduleAbsolute(null, 300, function () { subscription2 = subject.subscribe(results2); });\n    scheduler.scheduleAbsolute(null, 400, function () { subscription3 = subject.subscribe(results3); });\n    scheduler.scheduleAbsolute(null, 500, function () { subscription1.dispose(); });\n    scheduler.scheduleAbsolute(null, 600, function () { subject.dispose(); });\n    scheduler.scheduleAbsolute(null, 700, function () { subscription2.dispose(); });\n    scheduler.scheduleAbsolute(null, 800, function () { subscription3.dispose(); });\n\n    scheduler.scheduleAbsolute(null, 150, function () { subject.onNext(1); });\n    scheduler.scheduleAbsolute(null, 250, function () { subject.onNext(2); });\n    scheduler.scheduleAbsolute(null, 350, function () { subject.onNext(3); });\n    scheduler.scheduleAbsolute(null, 450, function () { subject.onNext(4); });\n    scheduler.scheduleAbsolute(null, 550, function () { subject.onNext(5); });\n    scheduler.scheduleAbsolute(null, 650, function () { raises(function () { subject.onNext(6); }); });\n    scheduler.scheduleAbsolute(null, 750, function () { raises(function () { subject.onCompleted(); }); });\n    scheduler.scheduleAbsolute(null, 850, function () { raises(function () { subject.onError(new Error()); }); });\n    scheduler.scheduleAbsolute(null, 950, function () { raises(function () { subject.subscribe(); }); });\n\n    scheduler.start();\n\n    results1.messages.assertEqual(\n      onNext(201, 1),\n      onNext(251, 2),\n      onNext(351, 3),\n      onNext(451, 4)\n    );\n\n    results2.messages.assertEqual(\n      onNext(301, 1),\n      onNext(302, 2),\n      onNext(351, 3),\n      onNext(451, 4),\n      onNext(551, 5)\n    );\n\n    results3.messages.assertEqual(\n      onNext(401, 1),\n      onNext(402, 2),\n      onNext(403, 3),\n      onNext(451, 4),\n      onNext(551, 5)\n    );\n  });\n\n  test('Dies out', function () {\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 1),\n      onNext(110, 2),\n      onNext(220, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(410, 6),\n      onNext(520, 7),\n      onCompleted(580)\n    );\n\n    var subject;\n\n    var results1 = scheduler.createObserver();\n    var results2 = scheduler.createObserver();\n    var results3 = scheduler.createObserver();\n    var results4 = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, 100, function () { subject = new ReplaySubject(Number.MAX_VALUE, 100, scheduler); });\n    scheduler.scheduleAbsolute(null, 200, function () { xs.subscribe(subject); });\n\n    scheduler.scheduleAbsolute(null, 300, function () { subject.subscribe(results1); });\n    scheduler.scheduleAbsolute(null, 400, function () { subject.subscribe(results2); });\n    scheduler.scheduleAbsolute(null, 600, function () { subject.subscribe(results3); });\n    scheduler.scheduleAbsolute(null, 900, function () { subject.subscribe(results4); });\n\n    scheduler.start();\n\n    results1.messages.assertEqual(\n      onNext(301, 3),\n      onNext(302, 4),\n      onNext(341, 5),\n      onNext(411, 6),\n      onNext(521, 7),\n      onCompleted(581)\n    );\n\n    results2.messages.assertEqual(\n      onNext(401, 5),\n      onNext(411, 6),\n      onNext(521, 7),\n      onCompleted(581)\n    );\n\n    results3.messages.assertEqual(\n      onNext(601, 7),\n      onCompleted(602)\n    );\n\n    results4.messages.assertEqual(\n      onCompleted(901)\n    );\n  });\n\n}());\n"
  },
  {
    "path": "tests/subjects/subject.js",
    "content": "(function () {\n  /* jshint undef: true, unused: true */\n  /* globals QUnit, test, Rx, equal, ok */\n\n  QUnit.module('Subject');\n\n  var Subject = Rx.Subject,\n      Observable = Rx.Observable,\n      Observer = Rx.Observer,\n      TestScheduler = Rx.TestScheduler,\n      onNext = Rx.ReactiveTest.onNext,\n      onError = Rx.ReactiveTest.onError,\n      onCompleted = Rx.ReactiveTest.onCompleted;\n\n  test('Infinite', function () {\n    var s, subscription, subscription1, subscription2, subscription3;\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 1),\n      onNext(110, 2),\n      onNext(220, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(410, 6),\n      onNext(520, 7),\n      onNext(630, 8),\n      onNext(710, 9),\n      onNext(870, 10),\n      onNext(940, 11),\n      onNext(1020, 12)\n    );\n\n    var results1 = scheduler.createObserver();\n    var results2 = scheduler.createObserver();\n    var results3 = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, 100, function () {\n      s = new Subject();\n    });\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = xs.subscribe(s);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      subscription1 = s.subscribe(results1);\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      subscription2 = s.subscribe(results2);\n    });\n\n    scheduler.scheduleAbsolute(null, 900, function () {\n      subscription3 = s.subscribe(results3);\n    });\n\n    scheduler.scheduleAbsolute(null, 600, function () {\n      subscription1.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 700, function () {\n      subscription2.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      subscription1.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 950, function () {\n      subscription3.dispose();\n    });\n\n    scheduler.start();\n\n    results1.messages.assertEqual(\n      onNext(340, 5),\n      onNext(410, 6),\n      onNext(520, 7)\n    );\n    \n    results2.messages.assertEqual(\n      onNext(410, 6),\n      onNext(520, 7),\n      onNext(630, 8)\n    );\n\n    results3.messages.assertEqual(\n      onNext(940, 11)\n    );\n  });\n\n  test('Finite', function () {\n    var s, subscription, subscription1, subscription2, subscription3;\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 1),\n      onNext(110, 2),\n      onNext(220, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(410, 6),\n      onNext(520, 7),\n      onCompleted(630),\n      onNext(640, 9),\n      onCompleted(650),\n      onError(660, new Error())\n    );\n\n    var results1 = scheduler.createObserver();\n    var results2 = scheduler.createObserver();\n    var results3 = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, 100, function () {\n      s = new Subject();\n    });\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = xs.subscribe(s);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      subscription1 = s.subscribe(results1);\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      subscription2 = s.subscribe(results2);\n    });\n\n    scheduler.scheduleAbsolute(null, 900, function () {\n      subscription3 = s.subscribe(results3);\n    });\n\n    scheduler.scheduleAbsolute(null, 600, function () {\n      subscription1.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 700, function () {\n      subscription2.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      subscription1.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 950, function () {\n      subscription3.dispose();\n    });\n\n    scheduler.start();\n\n    results1.messages.assertEqual(\n        onNext(340, 5),\n        onNext(410, 6),\n        onNext(520, 7)\n    );\n\n    results2.messages.assertEqual(\n        onNext(410, 6),\n        onNext(520, 7),\n        onCompleted(630)\n    );\n\n    results3.messages.assertEqual(\n        onCompleted(900)\n    );\n  });\n\n  test(new Error(), function () {\n    var s, subscription, subscription1, subscription2, subscription3;\n\n    var error = new Error();\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onNext(70, 1),\n      onNext(110, 2),\n      onNext(220, 3),\n      onNext(270, 4),\n      onNext(340, 5),\n      onNext(410, 6),\n      onNext(520, 7),\n      onError(630, error),\n      onNext(640, 9),\n      onCompleted(650),\n      onError(660, 'foo')\n    );\n\n    var results1 = scheduler.createObserver();\n    var results2 = scheduler.createObserver();\n    var results3 = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, 100, function () {\n      s = new Subject();\n    });\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = xs.subscribe(s);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      subscription1 = s.subscribe(results1);\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      subscription2 = s.subscribe(results2);\n    });\n\n    scheduler.scheduleAbsolute(null, 900, function () {\n      subscription3 = s.subscribe(results3);\n    });\n\n    scheduler.scheduleAbsolute(null, 600, function () {\n      subscription1.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 700, function () {\n      subscription2.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      subscription1.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 950, function () {\n      subscription3.dispose();\n    });\n\n    scheduler.start();\n\n    results1.messages.assertEqual(\n      onNext(340, 5),\n      onNext(410, 6),\n      onNext(520, 7));\n\n    results2.messages.assertEqual(\n      onNext(410, 6),\n      onNext(520, 7),\n      onError(630, error));\n\n    results3.messages.assertEqual(\n      onError(900, error));\n  });\n\n  test('Canceled', function () {\n    var s, subscription, subscription1, subscription2, subscription3;\n\n    var scheduler = new TestScheduler();\n\n    var xs = scheduler.createHotObservable(\n      onCompleted(630),\n      onNext(640, 9),\n      onCompleted(650),\n      onError(660, new Error())\n    );\n\n    var results1 = scheduler.createObserver();\n    var results2 = scheduler.createObserver();\n    var results3 = scheduler.createObserver();\n\n    scheduler.scheduleAbsolute(null, 100, function () {\n      s = new Subject();\n    });\n\n    scheduler.scheduleAbsolute(null, 200, function () {\n      subscription = xs.subscribe(s);\n    });\n\n    scheduler.scheduleAbsolute(null, 1000, function () {\n      subscription.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 300, function () {\n      subscription1 = s.subscribe(results1);\n    });\n\n    scheduler.scheduleAbsolute(null, 400, function () {\n      subscription2 = s.subscribe(results2);\n    });\n\n    scheduler.scheduleAbsolute(null, 900, function () {\n      subscription3 = s.subscribe(results3);\n    });\n\n    scheduler.scheduleAbsolute(null, 600, function () {\n      subscription1.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 700, function () {\n      subscription2.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 800, function () {\n      subscription1.dispose();\n    });\n\n    scheduler.scheduleAbsolute(null, 950, function () {\n      subscription3.dispose();\n    });\n\n    scheduler.start();\n\n    results1.messages.assertEqual();\n    results2.messages.assertEqual(onCompleted(630));\n    results3.messages.assertEqual(onCompleted(900));\n  });\n\n  test('Subject_Create', function () {\n    var _x, _ex, done = false;\n\n    var v = Observer.create(\n      function (x) { _x = x; },\n      function (ex) { _ex = ex; },\n      function () { done = true; });\n\n    var o = Observable.just(42);\n\n    var s = Subject.create(v, o);\n    s.subscribe(function (x) { _x = x; });\n\n    equal(42, _x);\n    s.onNext(21);\n\n    var e = new Error();\n    s.onError(e);\n\n    equal(e, _ex);\n\n    s.onCompleted();\n    ok(!done);\n  });\n\n}());\n"
  },
  {
    "path": "tests/vendor/es5-shim.js",
    "content": "/*!\n * https://github.com/es-shims/es5-shim\n * @license es5-shim Copyright 2009-2015 by contributors, MIT License\n * see https://github.com/es-shims/es5-shim/blob/master/LICENSE\n */\n\n// vim: ts=4 sts=4 sw=4 expandtab\n\n// Add semicolon to prevent IIFE from being passed as argument to concatenated code.\n;\n\n// UMD (Universal Module Definition)\n// see https://github.com/umdjs/umd/blob/master/returnExports.js\n(function (root, factory) {\n    'use strict';\n\n    /* global define, exports, module */\n    if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymous module.\n        define(factory);\n    } else if (typeof exports === 'object') {\n        // Node. Does not work with strict CommonJS, but\n        // only CommonJS-like enviroments that support module.exports,\n        // like Node.\n        module.exports = factory();\n    } else {\n        // Browser globals (root is window)\n        root.returnExports = factory();\n    }\n}(this, function () {\n\n/**\n * Brings an environment as close to ECMAScript 5 compliance\n * as is possible with the facilities of erstwhile engines.\n *\n * Annotated ES5: http://es5.github.com/ (specific links below)\n * ES5 Spec: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf\n * Required reading: http://javascriptweblog.wordpress.com/2011/12/05/extending-javascript-natives/\n */\n\n// Shortcut to an often accessed properties, in order to avoid multiple\n// dereference that costs universally. This also holds a reference to known-good\n// functions.\nvar $Array = Array;\nvar ArrayPrototype = $Array.prototype;\nvar $Object = Object;\nvar ObjectPrototype = $Object.prototype;\nvar FunctionPrototype = Function.prototype;\nvar $String = String;\nvar StringPrototype = $String.prototype;\nvar $Number = Number;\nvar NumberPrototype = $Number.prototype;\nvar array_slice = ArrayPrototype.slice;\nvar array_splice = ArrayPrototype.splice;\nvar array_push = ArrayPrototype.push;\nvar array_unshift = ArrayPrototype.unshift;\nvar array_concat = ArrayPrototype.concat;\nvar call = FunctionPrototype.call;\nvar max = Math.max;\nvar min = Math.min;\n\n// Having a toString local variable name breaks in Opera so use to_string.\nvar to_string = ObjectPrototype.toString;\n\nvar hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\nvar isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, tryFunctionObject = function tryFunctionObject(value) { try { fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]'; isCallable = function isCallable(value) { if (typeof value !== 'function') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; };\nvar isRegex; /* inlined from https://npmjs.com/is-regex */ var regexExec = RegExp.prototype.exec, tryRegexExec = function tryRegexExec(value) { try { regexExec.call(value); return true; } catch (e) { return false; } }, regexClass = '[object RegExp]'; isRegex = function isRegex(value) { if (typeof value !== 'object') { return false; } return hasToStringTag ? tryRegexExec(value) : to_string.call(value) === regexClass; };\nvar isString; /* inlined from https://npmjs.com/is-string */ var strValue = String.prototype.valueOf, tryStringObject = function tryStringObject(value) { try { strValue.call(value); return true; } catch (e) { return false; } }, stringClass = '[object String]'; isString = function isString(value) { if (typeof value === 'string') { return true; } if (typeof value !== 'object') { return false; } return hasToStringTag ? tryStringObject(value) : to_string.call(value) === stringClass; };\n\n/* inlined from http://npmjs.com/define-properties */\nvar defineProperties = (function (has) {\n  var supportsDescriptors = $Object.defineProperty && (function () {\n      try {\n          var obj = {};\n          $Object.defineProperty(obj, 'x', { enumerable: false, value: obj });\n          for (var _ in obj) { return false; }\n          return obj.x === obj;\n      } catch (e) { /* this is ES3 */\n          return false;\n      }\n  }());\n\n  // Define configurable, writable and non-enumerable props\n  // if they don't exist.\n  var defineProperty;\n  if (supportsDescriptors) {\n      defineProperty = function (object, name, method, forceAssign) {\n          if (!forceAssign && (name in object)) { return; }\n          $Object.defineProperty(object, name, {\n              configurable: true,\n              enumerable: false,\n              writable: true,\n              value: method\n          });\n      };\n  } else {\n      defineProperty = function (object, name, method, forceAssign) {\n          if (!forceAssign && (name in object)) { return; }\n          object[name] = method;\n      };\n  }\n  return function defineProperties(object, map, forceAssign) {\n      for (var name in map) {\n          if (has.call(map, name)) {\n            defineProperty(object, name, map[name], forceAssign);\n          }\n      }\n  };\n}(ObjectPrototype.hasOwnProperty));\n\n//\n// Util\n// ======\n//\n\n/* replaceable with https://npmjs.com/package/es-abstract /helpers/isPrimitive */\nvar isPrimitive = function isPrimitive(input) {\n    var type = typeof input;\n    return input === null || (type !== 'object' && type !== 'function');\n};\n\nvar ES = {\n    // ES5 9.4\n    // http://es5.github.com/#x9.4\n    // http://jsperf.com/to-integer\n    /* replaceable with https://npmjs.com/package/es-abstract ES5.ToInteger */\n    ToInteger: function ToInteger(num) {\n        var n = +num;\n        if (n !== n) { // isNaN\n            n = 0;\n        } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {\n            n = (n > 0 || -1) * Math.floor(Math.abs(n));\n        }\n        return n;\n    },\n\n    /* replaceable with https://npmjs.com/package/es-abstract ES5.ToPrimitive */\n    ToPrimitive: function ToPrimitive(input) {\n        var val, valueOf, toStr;\n        if (isPrimitive(input)) {\n            return input;\n        }\n        valueOf = input.valueOf;\n        if (isCallable(valueOf)) {\n            val = valueOf.call(input);\n            if (isPrimitive(val)) {\n                return val;\n            }\n        }\n        toStr = input.toString;\n        if (isCallable(toStr)) {\n            val = toStr.call(input);\n            if (isPrimitive(val)) {\n                return val;\n            }\n        }\n        throw new TypeError();\n    },\n\n    // ES5 9.9\n    // http://es5.github.com/#x9.9\n    /* replaceable with https://npmjs.com/package/es-abstract ES5.ToObject */\n    ToObject: function (o) {\n        /* jshint eqnull: true */\n        if (o == null) { // this matches both null and undefined\n            throw new TypeError(\"can't convert \" + o + ' to object');\n        }\n        return $Object(o);\n    },\n\n    /* replaceable with https://npmjs.com/package/es-abstract ES5.ToUint32 */\n    ToUint32: function ToUint32(x) {\n        return x >>> 0;\n    }\n};\n\n//\n// Function\n// ========\n//\n\n// ES-5 15.3.4.5\n// http://es5.github.com/#x15.3.4.5\n\nvar Empty = function Empty() {};\n\ndefineProperties(FunctionPrototype, {\n    bind: function bind(that) { // .length is 1\n        // 1. Let Target be the this value.\n        var target = this;\n        // 2. If IsCallable(Target) is false, throw a TypeError exception.\n        if (!isCallable(target)) {\n            throw new TypeError('Function.prototype.bind called on incompatible ' + target);\n        }\n        // 3. Let A be a new (possibly empty) internal list of all of the\n        //   argument values provided after thisArg (arg1, arg2 etc), in order.\n        // XXX slicedArgs will stand in for \"A\" if used\n        var args = array_slice.call(arguments, 1); // for normal call\n        // 4. Let F be a new native ECMAScript object.\n        // 11. Set the [[Prototype]] internal property of F to the standard\n        //   built-in Function prototype object as specified in 15.3.3.1.\n        // 12. Set the [[Call]] internal property of F as described in\n        //   15.3.4.5.1.\n        // 13. Set the [[Construct]] internal property of F as described in\n        //   15.3.4.5.2.\n        // 14. Set the [[HasInstance]] internal property of F as described in\n        //   15.3.4.5.3.\n        var bound;\n        var binder = function () {\n\n            if (this instanceof bound) {\n                // 15.3.4.5.2 [[Construct]]\n                // When the [[Construct]] internal method of a function object,\n                // F that was created using the bind function is called with a\n                // list of arguments ExtraArgs, the following steps are taken:\n                // 1. Let target be the value of F's [[TargetFunction]]\n                //   internal property.\n                // 2. If target has no [[Construct]] internal method, a\n                //   TypeError exception is thrown.\n                // 3. Let boundArgs be the value of F's [[BoundArgs]] internal\n                //   property.\n                // 4. Let args be a new list containing the same values as the\n                //   list boundArgs in the same order followed by the same\n                //   values as the list ExtraArgs in the same order.\n                // 5. Return the result of calling the [[Construct]] internal\n                //   method of target providing args as the arguments.\n\n                var result = target.apply(\n                    this,\n                    array_concat.call(args, array_slice.call(arguments))\n                );\n                if ($Object(result) === result) {\n                    return result;\n                }\n                return this;\n\n            } else {\n                // 15.3.4.5.1 [[Call]]\n                // When the [[Call]] internal method of a function object, F,\n                // which was created using the bind function is called with a\n                // this value and a list of arguments ExtraArgs, the following\n                // steps are taken:\n                // 1. Let boundArgs be the value of F's [[BoundArgs]] internal\n                //   property.\n                // 2. Let boundThis be the value of F's [[BoundThis]] internal\n                //   property.\n                // 3. Let target be the value of F's [[TargetFunction]] internal\n                //   property.\n                // 4. Let args be a new list containing the same values as the\n                //   list boundArgs in the same order followed by the same\n                //   values as the list ExtraArgs in the same order.\n                // 5. Return the result of calling the [[Call]] internal method\n                //   of target providing boundThis as the this value and\n                //   providing args as the arguments.\n\n                // equiv: target.call(this, ...boundArgs, ...args)\n                return target.apply(\n                    that,\n                    array_concat.call(args, array_slice.call(arguments))\n                );\n\n            }\n\n        };\n\n        // 15. If the [[Class]] internal property of Target is \"Function\", then\n        //     a. Let L be the length property of Target minus the length of A.\n        //     b. Set the length own property of F to either 0 or L, whichever is\n        //       larger.\n        // 16. Else set the length own property of F to 0.\n\n        var boundLength = max(0, target.length - args.length);\n\n        // 17. Set the attributes of the length own property of F to the values\n        //   specified in 15.3.5.1.\n        var boundArgs = [];\n        for (var i = 0; i < boundLength; i++) {\n            array_push.call(boundArgs, '$' + i);\n        }\n\n        // XXX Build a dynamic function with desired amount of arguments is the only\n        // way to set the length property of a function.\n        // In environments where Content Security Policies enabled (Chrome extensions,\n        // for ex.) all use of eval or Function costructor throws an exception.\n        // However in all of these environments Function.prototype.bind exists\n        // and so this code will never be executed.\n        bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this, arguments); }')(binder);\n\n        if (target.prototype) {\n            Empty.prototype = target.prototype;\n            bound.prototype = new Empty();\n            // Clean up dangling references.\n            Empty.prototype = null;\n        }\n\n        // TODO\n        // 18. Set the [[Extensible]] internal property of F to true.\n\n        // TODO\n        // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).\n        // 20. Call the [[DefineOwnProperty]] internal method of F with\n        //   arguments \"caller\", PropertyDescriptor {[[Get]]: thrower, [[Set]]:\n        //   thrower, [[Enumerable]]: false, [[Configurable]]: false}, and\n        //   false.\n        // 21. Call the [[DefineOwnProperty]] internal method of F with\n        //   arguments \"arguments\", PropertyDescriptor {[[Get]]: thrower,\n        //   [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},\n        //   and false.\n\n        // TODO\n        // NOTE Function objects created using Function.prototype.bind do not\n        // have a prototype property or the [[Code]], [[FormalParameters]], and\n        // [[Scope]] internal properties.\n        // XXX can't delete prototype in pure-js.\n\n        // 22. Return F.\n        return bound;\n    }\n});\n\n// _Please note: Shortcuts are defined after `Function.prototype.bind` as we\n// us it in defining shortcuts.\nvar owns = call.bind(ObjectPrototype.hasOwnProperty);\nvar toStr = call.bind(ObjectPrototype.toString);\nvar strSlice = call.bind(StringPrototype.slice);\nvar strSplit = call.bind(StringPrototype.split);\n\n//\n// Array\n// =====\n//\n\nvar isArray = $Array.isArray || function isArray(obj) {\n    return toStr(obj) === '[object Array]';\n};\n\n// ES5 15.4.4.12\n// http://es5.github.com/#x15.4.4.13\n// Return len+argCount.\n// [bugfix, ielt8]\n// IE < 8 bug: [].unshift(0) === undefined but should be \"1\"\nvar hasUnshiftReturnValueBug = [].unshift(0) !== 1;\ndefineProperties(ArrayPrototype, {\n    unshift: function () {\n        array_unshift.apply(this, arguments);\n        return this.length;\n    }\n}, hasUnshiftReturnValueBug);\n\n// ES5 15.4.3.2\n// http://es5.github.com/#x15.4.3.2\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray\ndefineProperties($Array, { isArray: isArray });\n\n// The IsCallable() check in the Array functions\n// has been replaced with a strict check on the\n// internal class of the object to trap cases where\n// the provided function was actually a regular\n// expression literal, which in V8 and\n// JavaScriptCore is a typeof \"function\".  Only in\n// V8 are regular expression literals permitted as\n// reduce parameters, so it is desirable in the\n// general case for the shim to match the more\n// strict and common behavior of rejecting regular\n// expressions.\n\n// ES5 15.4.4.18\n// http://es5.github.com/#x15.4.4.18\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach\n\n// Check failure of by-index access of string characters (IE < 9)\n// and failure of `0 in boxedString` (Rhino)\nvar boxedString = $Object('a');\nvar splitString = boxedString[0] !== 'a' || !(0 in boxedString);\n\nvar properlyBoxesContext = function properlyBoxed(method) {\n    // Check node 0.6.21 bug where third parameter is not boxed\n    var properlyBoxesNonStrict = true;\n    var properlyBoxesStrict = true;\n    if (method) {\n        method.call('foo', function (_, __, context) {\n            if (typeof context !== 'object') { properlyBoxesNonStrict = false; }\n        });\n\n        method.call([1], function () {\n            'use strict';\n\n            properlyBoxesStrict = typeof this === 'string';\n        }, 'x');\n    }\n    return !!method && properlyBoxesNonStrict && properlyBoxesStrict;\n};\n\ndefineProperties(ArrayPrototype, {\n    forEach: function forEach(callbackfn /*, thisArg*/) {\n        var object = ES.ToObject(this);\n        var self = splitString && isString(this) ? strSplit(this, '') : object;\n        var i = -1;\n        var length = self.length >>> 0;\n        var T;\n        if (arguments.length > 1) {\n          T = arguments[1];\n        }\n\n        // If no callback function or if callback is not a callable function\n        if (!isCallable(callbackfn)) {\n            throw new TypeError('Array.prototype.forEach callback must be a function');\n        }\n\n        while (++i < length) {\n            if (i in self) {\n                // Invoke the callback function with call, passing arguments:\n                // context, property value, property key, thisArg object\n                if (typeof T !== 'undefined') {\n                    callbackfn.call(T, self[i], i, object);\n                } else {\n                    callbackfn(self[i], i, object);\n                }\n            }\n        }\n    }\n}, !properlyBoxesContext(ArrayPrototype.forEach));\n\n// ES5 15.4.4.19\n// http://es5.github.com/#x15.4.4.19\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map\ndefineProperties(ArrayPrototype, {\n    map: function map(callbackfn/*, thisArg*/) {\n        var object = ES.ToObject(this);\n        var self = splitString && isString(this) ? strSplit(this, '') : object;\n        var length = self.length >>> 0;\n        var result = $Array(length);\n        var T;\n        if (arguments.length > 1) {\n            T = arguments[1];\n        }\n\n        // If no callback function or if callback is not a callable function\n        if (!isCallable(callbackfn)) {\n            throw new TypeError('Array.prototype.map callback must be a function');\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self) {\n                if (typeof T !== 'undefined') {\n                    result[i] = callbackfn.call(T, self[i], i, object);\n                } else {\n                    result[i] = callbackfn(self[i], i, object);\n                }\n            }\n        }\n        return result;\n    }\n}, !properlyBoxesContext(ArrayPrototype.map));\n\n// ES5 15.4.4.20\n// http://es5.github.com/#x15.4.4.20\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter\ndefineProperties(ArrayPrototype, {\n    filter: function filter(callbackfn /*, thisArg*/) {\n        var object = ES.ToObject(this);\n        var self = splitString && isString(this) ? strSplit(this, '') : object;\n        var length = self.length >>> 0;\n        var result = [];\n        var value;\n        var T;\n        if (arguments.length > 1) {\n            T = arguments[1];\n        }\n\n        // If no callback function or if callback is not a callable function\n        if (!isCallable(callbackfn)) {\n            throw new TypeError('Array.prototype.filter callback must be a function');\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self) {\n                value = self[i];\n                if (typeof T === 'undefined' ? callbackfn(value, i, object) : callbackfn.call(T, value, i, object)) {\n                    array_push.call(result, value);\n                }\n            }\n        }\n        return result;\n    }\n}, !properlyBoxesContext(ArrayPrototype.filter));\n\n// ES5 15.4.4.16\n// http://es5.github.com/#x15.4.4.16\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every\ndefineProperties(ArrayPrototype, {\n    every: function every(callbackfn /*, thisArg*/) {\n        var object = ES.ToObject(this);\n        var self = splitString && isString(this) ? strSplit(this, '') : object;\n        var length = self.length >>> 0;\n        var T;\n        if (arguments.length > 1) {\n            T = arguments[1];\n        }\n\n        // If no callback function or if callback is not a callable function\n        if (!isCallable(callbackfn)) {\n            throw new TypeError('Array.prototype.every callback must be a function');\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !(typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) {\n                return false;\n            }\n        }\n        return true;\n    }\n}, !properlyBoxesContext(ArrayPrototype.every));\n\n// ES5 15.4.4.17\n// http://es5.github.com/#x15.4.4.17\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some\ndefineProperties(ArrayPrototype, {\n    some: function some(callbackfn/*, thisArg */) {\n        var object = ES.ToObject(this);\n        var self = splitString && isString(this) ? strSplit(this, '') : object;\n        var length = self.length >>> 0;\n        var T;\n        if (arguments.length > 1) {\n            T = arguments[1];\n        }\n\n        // If no callback function or if callback is not a callable function\n        if (!isCallable(callbackfn)) {\n            throw new TypeError('Array.prototype.some callback must be a function');\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && (typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) {\n                return true;\n            }\n        }\n        return false;\n    }\n}, !properlyBoxesContext(ArrayPrototype.some));\n\n// ES5 15.4.4.21\n// http://es5.github.com/#x15.4.4.21\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce\nvar reduceCoercesToObject = false;\nif (ArrayPrototype.reduce) {\n    reduceCoercesToObject = typeof ArrayPrototype.reduce.call('es5', function (_, __, ___, list) { return list; }) === 'object';\n}\ndefineProperties(ArrayPrototype, {\n    reduce: function reduce(callbackfn /*, initialValue*/) {\n        var object = ES.ToObject(this);\n        var self = splitString && isString(this) ? strSplit(this, '') : object;\n        var length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (!isCallable(callbackfn)) {\n            throw new TypeError('Array.prototype.reduce callback must be a function');\n        }\n\n        // no value to return if no initial value and an empty array\n        if (length === 0 && arguments.length === 1) {\n            throw new TypeError('reduce of empty array with no initial value');\n        }\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n\n                // if array contains no values, no initial value to return\n                if (++i >= length) {\n                    throw new TypeError('reduce of empty array with no initial value');\n                }\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self) {\n                result = callbackfn(result, self[i], i, object);\n            }\n        }\n\n        return result;\n    }\n}, !reduceCoercesToObject);\n\n// ES5 15.4.4.22\n// http://es5.github.com/#x15.4.4.22\n// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight\nvar reduceRightCoercesToObject = false;\nif (ArrayPrototype.reduceRight) {\n    reduceRightCoercesToObject = typeof ArrayPrototype.reduceRight.call('es5', function (_, __, ___, list) { return list; }) === 'object';\n}\ndefineProperties(ArrayPrototype, {\n    reduceRight: function reduceRight(callbackfn/*, initial*/) {\n        var object = ES.ToObject(this);\n        var self = splitString && isString(this) ? strSplit(this, '') : object;\n        var length = self.length >>> 0;\n\n        // If no callback function or if callback is not a callable function\n        if (!isCallable(callbackfn)) {\n            throw new TypeError('Array.prototype.reduceRight callback must be a function');\n        }\n\n        // no value to return if no initial value, empty array\n        if (length === 0 && arguments.length === 1) {\n            throw new TypeError('reduceRight of empty array with no initial value');\n        }\n\n        var result;\n        var i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n\n                // if array contains no values, no initial value to return\n                if (--i < 0) {\n                    throw new TypeError('reduceRight of empty array with no initial value');\n                }\n            } while (true);\n        }\n\n        if (i < 0) {\n            return result;\n        }\n\n        do {\n            if (i in self) {\n                result = callbackfn(result, self[i], i, object);\n            }\n        } while (i--);\n\n        return result;\n    }\n}, !reduceRightCoercesToObject);\n\n// ES5 15.4.4.14\n// http://es5.github.com/#x15.4.4.14\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf\nvar hasFirefox2IndexOfBug = ArrayPrototype.indexOf && [0, 1].indexOf(1, 2) !== -1;\ndefineProperties(ArrayPrototype, {\n    indexOf: function indexOf(searchElement /*, fromIndex */) {\n        var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this);\n        var length = self.length >>> 0;\n\n        if (length === 0) {\n            return -1;\n        }\n\n        var i = 0;\n        if (arguments.length > 1) {\n            i = ES.ToInteger(arguments[1]);\n        }\n\n        // handle negative indices\n        i = i >= 0 ? i : max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === searchElement) {\n                return i;\n            }\n        }\n        return -1;\n    }\n}, hasFirefox2IndexOfBug);\n\n// ES5 15.4.4.15\n// http://es5.github.com/#x15.4.4.15\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf\nvar hasFirefox2LastIndexOfBug = ArrayPrototype.lastIndexOf && [0, 1].lastIndexOf(0, -3) !== -1;\ndefineProperties(ArrayPrototype, {\n    lastIndexOf: function lastIndexOf(searchElement /*, fromIndex */) {\n        var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this);\n        var length = self.length >>> 0;\n\n        if (length === 0) {\n            return -1;\n        }\n        var i = length - 1;\n        if (arguments.length > 1) {\n            i = min(i, ES.ToInteger(arguments[1]));\n        }\n        // handle negative indices\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && searchElement === self[i]) {\n                return i;\n            }\n        }\n        return -1;\n    }\n}, hasFirefox2LastIndexOfBug);\n\n// ES5 15.4.4.12\n// http://es5.github.com/#x15.4.4.12\nvar spliceNoopReturnsEmptyArray = (function () {\n    var a = [1, 2];\n    var result = a.splice();\n    return a.length === 2 && isArray(result) && result.length === 0;\n}());\ndefineProperties(ArrayPrototype, {\n    // Safari 5.0 bug where .splice() returns undefined\n    splice: function splice(start, deleteCount) {\n        if (arguments.length === 0) {\n            return [];\n        } else {\n            return array_splice.apply(this, arguments);\n        }\n    }\n}, !spliceNoopReturnsEmptyArray);\n\nvar spliceWorksWithEmptyObject = (function () {\n    var obj = {};\n    ArrayPrototype.splice.call(obj, 0, 0, 1);\n    return obj.length === 1;\n}());\ndefineProperties(ArrayPrototype, {\n    splice: function splice(start, deleteCount) {\n        if (arguments.length === 0) { return []; }\n        var args = arguments;\n        this.length = max(ES.ToInteger(this.length), 0);\n        if (arguments.length > 0 && typeof deleteCount !== 'number') {\n            args = array_slice.call(arguments);\n            if (args.length < 2) {\n                array_push.call(args, this.length - start);\n            } else {\n                args[1] = ES.ToInteger(deleteCount);\n            }\n        }\n        return array_splice.apply(this, args);\n    }\n}, !spliceWorksWithEmptyObject);\nvar spliceWorksWithLargeSparseArrays = (function () {\n    // Per https://github.com/es-shims/es5-shim/issues/295\n    // Safari 7/8 breaks with sparse arrays of size 1e5 or greater\n    var arr = new $Array(1e5);\n    // note: the index MUST be 8 or larger or the test will false pass\n    arr[8] = 'x';\n    arr.splice(1, 1);\n    // note: this test must be defined *after* the indexOf shim\n    // per https://github.com/es-shims/es5-shim/issues/313\n    return arr.indexOf('x') === 7;\n}());\nvar spliceWorksWithSmallSparseArrays = (function () {\n    // Per https://github.com/es-shims/es5-shim/issues/295\n    // Opera 12.15 breaks on this, no idea why.\n    var n = 256;\n    var arr = [];\n    arr[n] = 'a';\n    arr.splice(n + 1, 0, 'b');\n    return arr[n] === 'a';\n}());\ndefineProperties(ArrayPrototype, {\n    splice: function splice(start, deleteCount) {\n        var O = ES.ToObject(this);\n        var A = [];\n        var len = ES.ToUint32(O.length);\n        var relativeStart = ES.ToInteger(start);\n        var actualStart = relativeStart < 0 ? max((len + relativeStart), 0) : min(relativeStart, len);\n        var actualDeleteCount = min(max(ES.ToInteger(deleteCount), 0), len - actualStart);\n\n        var k = 0;\n        var from;\n        while (k < actualDeleteCount) {\n            from = $String(actualStart + k);\n            if (owns(O, from)) {\n                A[k] = O[from];\n            }\n            k += 1;\n        }\n\n        var items = array_slice.call(arguments, 2);\n        var itemCount = items.length;\n        var to;\n        if (itemCount < actualDeleteCount) {\n            k = actualStart;\n            while (k < (len - actualDeleteCount)) {\n                from = $String(k + actualDeleteCount);\n                to = $String(k + itemCount);\n                if (owns(O, from)) {\n                    O[to] = O[from];\n                } else {\n                    delete O[to];\n                }\n                k += 1;\n            }\n            k = len;\n            while (k > (len - actualDeleteCount + itemCount)) {\n                delete O[k - 1];\n                k -= 1;\n            }\n        } else if (itemCount > actualDeleteCount) {\n            k = len - actualDeleteCount;\n            while (k > actualStart) {\n                from = $String(k + actualDeleteCount - 1);\n                to = $String(k + itemCount - 1);\n                if (owns(O, from)) {\n                    O[to] = O[from];\n                } else {\n                    delete O[to];\n                }\n                k -= 1;\n            }\n        }\n        k = actualStart;\n        for (var i = 0; i < items.length; ++i) {\n            O[k] = items[i];\n            k += 1;\n        }\n        O.length = len - actualDeleteCount + itemCount;\n\n        return A;\n    }\n}, !spliceWorksWithLargeSparseArrays || !spliceWorksWithSmallSparseArrays);\n\n//\n// Object\n// ======\n//\n\n// ES5 15.2.3.14\n// http://es5.github.com/#x15.2.3.14\n\n// http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation\nvar hasDontEnumBug = !({ 'toString': null }).propertyIsEnumerable('toString');\nvar hasProtoEnumBug = function () {}.propertyIsEnumerable('prototype');\nvar hasStringEnumBug = !owns('x', '0');\nvar equalsConstructorPrototype = function (o) {\n    var ctor = o.constructor;\n    return ctor && ctor.prototype === o;\n};\nvar blacklistedKeys = {\n    $window: true,\n    $console: true,\n    $parent: true,\n    $self: true,\n    $frames: true,\n    $frameElement: true,\n    $webkitIndexedDB: true,\n    $webkitStorageInfo: true\n};\nvar hasAutomationEqualityBug = (function () {\n    /* globals window */\n    if (typeof window === 'undefined') { return false; }\n    for (var k in window) {\n        if (!blacklistedKeys['$' + k] && owns(window, k) && window[k] !== null && typeof window[k] === 'object') {\n            try {\n                equalsConstructorPrototype(window[k]);\n            } catch (e) {\n                return true;\n            }\n        }\n    }\n    return false;\n}());\nvar equalsConstructorPrototypeIfNotBuggy = function (object) {\n    if (typeof window === 'undefined' || !hasAutomationEqualityBug) { return equalsConstructorPrototype(object); }\n    try {\n        return equalsConstructorPrototype(object);\n    } catch (e) {\n        return false;\n    }\n};\nvar dontEnums = [\n    'toString',\n    'toLocaleString',\n    'valueOf',\n    'hasOwnProperty',\n    'isPrototypeOf',\n    'propertyIsEnumerable',\n    'constructor'\n];\nvar dontEnumsLength = dontEnums.length;\n\nvar isArguments = function isArguments(value) {\n    var str = toStr(value);\n    var isArgs = str === '[object Arguments]';\n    if (!isArgs) {\n        isArgs = !isArray(value) &&\n          value !== null &&\n          typeof value === 'object' &&\n          typeof value.length === 'number' &&\n          value.length >= 0 &&\n          isCallable(value.callee);\n    }\n    return isArgs;\n};\n\ndefineProperties($Object, {\n    keys: function keys(object) {\n        var isFn = isCallable(object);\n        var isArgs = isArguments(object);\n        var isObject = object !== null && typeof object === 'object';\n        var isStr = isObject && isString(object);\n\n        if (!isObject && !isFn && !isArgs) {\n            throw new TypeError('Object.keys called on a non-object');\n        }\n\n        var theKeys = [];\n        var skipProto = hasProtoEnumBug && isFn;\n        if ((isStr && hasStringEnumBug) || isArgs) {\n            for (var i = 0; i < object.length; ++i) {\n                array_push.call(theKeys, $String(i));\n            }\n        }\n\n        if (!isArgs) {\n            for (var name in object) {\n                if (!(skipProto && name === 'prototype') && owns(object, name)) {\n                    array_push.call(theKeys, $String(name));\n                }\n            }\n        }\n\n        if (hasDontEnumBug) {\n            var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);\n            for (var j = 0; j < dontEnumsLength; j++) {\n                var dontEnum = dontEnums[j];\n                if (!(skipConstructor && dontEnum === 'constructor') && owns(object, dontEnum)) {\n                    array_push.call(theKeys, dontEnum);\n                }\n            }\n        }\n        return theKeys;\n    }\n});\n\nvar keysWorksWithArguments = $Object.keys && (function () {\n    // Safari 5.0 bug\n    return $Object.keys(arguments).length === 2;\n}(1, 2));\nvar originalKeys = $Object.keys;\ndefineProperties($Object, {\n    keys: function keys(object) {\n        if (isArguments(object)) {\n            return originalKeys(array_slice.call(object));\n        } else {\n            return originalKeys(object);\n        }\n    }\n}, !keysWorksWithArguments);\n\n//\n// Date\n// ====\n//\n\n// ES5 15.9.5.43\n// http://es5.github.com/#x15.9.5.43\n// This function returns a String value represent the instance in time\n// represented by this Date object. The format of the String is the Date Time\n// string format defined in 15.9.1.15. All fields are present in the String.\n// The time zone is always UTC, denoted by the suffix Z. If the time value of\n// this object is not a finite Number a RangeError exception is thrown.\nvar negativeDate = -62198755200000;\nvar negativeYearString = '-000001';\nvar hasNegativeDateBug = Date.prototype.toISOString && new Date(negativeDate).toISOString().indexOf(negativeYearString) === -1;\nvar hasSafari51DateBug = Date.prototype.toISOString && new Date(-1).toISOString() !== '1969-12-31T23:59:59.999Z';\n\ndefineProperties(Date.prototype, {\n    toISOString: function toISOString() {\n        var result, length, value, year, month;\n        if (!isFinite(this)) {\n            throw new RangeError('Date.prototype.toISOString called on non-finite value.');\n        }\n\n        year = this.getUTCFullYear();\n\n        month = this.getUTCMonth();\n        // see https://github.com/es-shims/es5-shim/issues/111\n        year += Math.floor(month / 12);\n        month = (month % 12 + 12) % 12;\n\n        // the date time string format is specified in 15.9.1.15.\n        result = [month + 1, this.getUTCDate(), this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()];\n        year = (\n            (year < 0 ? '-' : (year > 9999 ? '+' : '')) +\n            strSlice('00000' + Math.abs(year), (0 <= year && year <= 9999) ? -4 : -6)\n        );\n\n        length = result.length;\n        while (length--) {\n            value = result[length];\n            // pad months, days, hours, minutes, and seconds to have two\n            // digits.\n            if (value < 10) {\n                result[length] = '0' + value;\n            }\n        }\n        // pad milliseconds to have three digits.\n        return (\n            year + '-' + array_slice.call(result, 0, 2).join('-') +\n            'T' + array_slice.call(result, 2).join(':') + '.' +\n            strSlice('000' + this.getUTCMilliseconds(), -3) + 'Z'\n        );\n    }\n}, hasNegativeDateBug || hasSafari51DateBug);\n\n// ES5 15.9.5.44\n// http://es5.github.com/#x15.9.5.44\n// This function provides a String representation of a Date object for use by\n// JSON.stringify (15.12.3).\nvar dateToJSONIsSupported = (function () {\n    try {\n        return Date.prototype.toJSON &&\n            new Date(NaN).toJSON() === null &&\n            new Date(negativeDate).toJSON().indexOf(negativeYearString) !== -1 &&\n            Date.prototype.toJSON.call({ // generic\n                toISOString: function () { return true; }\n            });\n    } catch (e) {\n        return false;\n    }\n}());\nif (!dateToJSONIsSupported) {\n    Date.prototype.toJSON = function toJSON(key) {\n        // When the toJSON method is called with argument key, the following\n        // steps are taken:\n\n        // 1.  Let O be the result of calling ToObject, giving it the this\n        // value as its argument.\n        // 2. Let tv be ES.ToPrimitive(O, hint Number).\n        var O = $Object(this);\n        var tv = ES.ToPrimitive(O);\n        // 3. If tv is a Number and is not finite, return null.\n        if (typeof tv === 'number' && !isFinite(tv)) {\n            return null;\n        }\n        // 4. Let toISO be the result of calling the [[Get]] internal method of\n        // O with argument \"toISOString\".\n        var toISO = O.toISOString;\n        // 5. If IsCallable(toISO) is false, throw a TypeError exception.\n        if (!isCallable(toISO)) {\n            throw new TypeError('toISOString property is not callable');\n        }\n        // 6. Return the result of calling the [[Call]] internal method of\n        //  toISO with O as the this value and an empty argument list.\n        return toISO.call(O);\n\n        // NOTE 1 The argument is ignored.\n\n        // NOTE 2 The toJSON function is intentionally generic; it does not\n        // require that its this value be a Date object. Therefore, it can be\n        // transferred to other kinds of objects for use as a method. However,\n        // it does require that any such object have a toISOString method. An\n        // object is free to use the argument key to filter its\n        // stringification.\n    };\n}\n\n// ES5 15.9.4.2\n// http://es5.github.com/#x15.9.4.2\n// based on work shared by Daniel Friesen (dantman)\n// http://gist.github.com/303249\nvar supportsExtendedYears = Date.parse('+033658-09-27T01:46:40.000Z') === 1e15;\nvar acceptsInvalidDates = !isNaN(Date.parse('2012-04-04T24:00:00.500Z')) || !isNaN(Date.parse('2012-11-31T23:59:59.000Z')) || !isNaN(Date.parse('2012-12-31T23:59:60.000Z'));\nvar doesNotParseY2KNewYear = isNaN(Date.parse('2000-01-01T00:00:00.000Z'));\nif (!Date.parse || doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExtendedYears) {\n    // XXX global assignment won't work in embeddings that use\n    // an alternate object for the context.\n    /* global Date: true */\n    /* eslint-disable no-undef */\n    Date = (function (NativeDate) {\n    /* eslint-enable no-undef */\n        // Date.length === 7\n        var DateShim = function Date(Y, M, D, h, m, s, ms) {\n            var length = arguments.length;\n            var date;\n            if (this instanceof NativeDate) {\n                date = length === 1 && $String(Y) === Y ? // isString(Y)\n                    // We explicitly pass it through parse:\n                    new NativeDate(DateShim.parse(Y)) :\n                    // We have to manually make calls depending on argument\n                    // length here\n                    length >= 7 ? new NativeDate(Y, M, D, h, m, s, ms) :\n                    length >= 6 ? new NativeDate(Y, M, D, h, m, s) :\n                    length >= 5 ? new NativeDate(Y, M, D, h, m) :\n                    length >= 4 ? new NativeDate(Y, M, D, h) :\n                    length >= 3 ? new NativeDate(Y, M, D) :\n                    length >= 2 ? new NativeDate(Y, M) :\n                    length >= 1 ? new NativeDate(Y) :\n                                  new NativeDate();\n            } else {\n                date = NativeDate.apply(this, arguments);\n            }\n            // Prevent mixups with unfixed Date object\n            defineProperties(date, { constructor: DateShim }, true);\n            return date;\n        };\n\n        // 15.9.1.15 Date Time String Format.\n        var isoDateExpression = new RegExp('^' +\n            '(\\\\d{4}|[+-]\\\\d{6})' + // four-digit year capture or sign +\n                                      // 6-digit extended year\n            '(?:-(\\\\d{2})' + // optional month capture\n            '(?:-(\\\\d{2})' + // optional day capture\n            '(?:' + // capture hours:minutes:seconds.milliseconds\n                'T(\\\\d{2})' + // hours capture\n                ':(\\\\d{2})' + // minutes capture\n                '(?:' + // optional :seconds.milliseconds\n                    ':(\\\\d{2})' + // seconds capture\n                    '(?:(\\\\.\\\\d{1,}))?' + // milliseconds capture\n                ')?' +\n            '(' + // capture UTC offset component\n                'Z|' + // UTC capture\n                '(?:' + // offset specifier +/-hours:minutes\n                    '([-+])' + // sign capture\n                    '(\\\\d{2})' + // hours offset capture\n                    ':(\\\\d{2})' + // minutes offset capture\n                ')' +\n            ')?)?)?)?' +\n        '$');\n\n        var months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365];\n\n        var dayFromMonth = function dayFromMonth(year, month) {\n            var t = month > 1 ? 1 : 0;\n            return (\n                months[month] +\n                Math.floor((year - 1969 + t) / 4) -\n                Math.floor((year - 1901 + t) / 100) +\n                Math.floor((year - 1601 + t) / 400) +\n                365 * (year - 1970)\n            );\n        };\n\n        var toUTC = function toUTC(t) {\n            return $Number(new NativeDate(1970, 0, 1, 0, 0, 0, t));\n        };\n\n        // Copy any custom methods a 3rd party library may have added\n        for (var key in NativeDate) {\n            if (owns(NativeDate, key)) {\n                DateShim[key] = NativeDate[key];\n            }\n        }\n\n        // Copy \"native\" methods explicitly; they may be non-enumerable\n        defineProperties(DateShim, {\n            now: NativeDate.now,\n            UTC: NativeDate.UTC\n        }, true);\n        DateShim.prototype = NativeDate.prototype;\n        defineProperties(DateShim.prototype, {\n            constructor: DateShim\n        }, true);\n\n        // Upgrade Date.parse to handle simplified ISO 8601 strings\n        var parseShim = function parse(string) {\n            var match = isoDateExpression.exec(string);\n            if (match) {\n                // parse months, days, hours, minutes, seconds, and milliseconds\n                // provide default values if necessary\n                // parse the UTC offset component\n                var year = $Number(match[1]),\n                    month = $Number(match[2] || 1) - 1,\n                    day = $Number(match[3] || 1) - 1,\n                    hour = $Number(match[4] || 0),\n                    minute = $Number(match[5] || 0),\n                    second = $Number(match[6] || 0),\n                    millisecond = Math.floor($Number(match[7] || 0) * 1000),\n                    // When time zone is missed, local offset should be used\n                    // (ES 5.1 bug)\n                    // see https://bugs.ecmascript.org/show_bug.cgi?id=112\n                    isLocalTime = Boolean(match[4] && !match[8]),\n                    signOffset = match[9] === '-' ? 1 : -1,\n                    hourOffset = $Number(match[10] || 0),\n                    minuteOffset = $Number(match[11] || 0),\n                    result;\n                if (\n                    hour < (\n                        minute > 0 || second > 0 || millisecond > 0 ?\n                        24 : 25\n                    ) &&\n                    minute < 60 && second < 60 && millisecond < 1000 &&\n                    month > -1 && month < 12 && hourOffset < 24 &&\n                    minuteOffset < 60 && // detect invalid offsets\n                    day > -1 &&\n                    day < (\n                        dayFromMonth(year, month + 1) -\n                        dayFromMonth(year, month)\n                    )\n                ) {\n                    result = (\n                        (dayFromMonth(year, month) + day) * 24 +\n                        hour +\n                        hourOffset * signOffset\n                    ) * 60;\n                    result = (\n                        (result + minute + minuteOffset * signOffset) * 60 +\n                        second\n                    ) * 1000 + millisecond;\n                    if (isLocalTime) {\n                        result = toUTC(result);\n                    }\n                    if (-8.64e15 <= result && result <= 8.64e15) {\n                        return result;\n                    }\n                }\n                return NaN;\n            }\n            return NativeDate.parse.apply(this, arguments);\n        };\n        defineProperties(DateShim, { parse: parseShim });\n\n        return DateShim;\n    }(Date));\n    /* global Date: false */\n}\n\n// ES5 15.9.4.4\n// http://es5.github.com/#x15.9.4.4\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\n\n//\n// Number\n// ======\n//\n\n// ES5.1 15.7.4.5\n// http://es5.github.com/#x15.7.4.5\nvar hasToFixedBugs = NumberPrototype.toFixed && (\n  (0.00008).toFixed(3) !== '0.000' ||\n  (0.9).toFixed(0) !== '1' ||\n  (1.255).toFixed(2) !== '1.25' ||\n  (1000000000000000128).toFixed(0) !== '1000000000000000128'\n);\n\nvar toFixedHelpers = {\n  base: 1e7,\n  size: 6,\n  data: [0, 0, 0, 0, 0, 0],\n  multiply: function multiply(n, c) {\n      var i = -1;\n      var c2 = c;\n      while (++i < toFixedHelpers.size) {\n          c2 += n * toFixedHelpers.data[i];\n          toFixedHelpers.data[i] = c2 % toFixedHelpers.base;\n          c2 = Math.floor(c2 / toFixedHelpers.base);\n      }\n  },\n  divide: function divide(n) {\n      var i = toFixedHelpers.size, c = 0;\n      while (--i >= 0) {\n          c += toFixedHelpers.data[i];\n          toFixedHelpers.data[i] = Math.floor(c / n);\n          c = (c % n) * toFixedHelpers.base;\n      }\n  },\n  numToString: function numToString() {\n      var i = toFixedHelpers.size;\n      var s = '';\n      while (--i >= 0) {\n          if (s !== '' || i === 0 || toFixedHelpers.data[i] !== 0) {\n              var t = $String(toFixedHelpers.data[i]);\n              if (s === '') {\n                  s = t;\n              } else {\n                  s += strSlice('0000000', 0, 7 - t.length) + t;\n              }\n          }\n      }\n      return s;\n  },\n  pow: function pow(x, n, acc) {\n      return (n === 0 ? acc : (n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc)));\n  },\n  log: function log(x) {\n      var n = 0;\n      var x2 = x;\n      while (x2 >= 4096) {\n          n += 12;\n          x2 /= 4096;\n      }\n      while (x2 >= 2) {\n          n += 1;\n          x2 /= 2;\n      }\n      return n;\n  }\n};\n\ndefineProperties(NumberPrototype, {\n    toFixed: function toFixed(fractionDigits) {\n        var f, x, s, m, e, z, j, k;\n\n        // Test for NaN and round fractionDigits down\n        f = $Number(fractionDigits);\n        f = f !== f ? 0 : Math.floor(f);\n\n        if (f < 0 || f > 20) {\n            throw new RangeError('Number.toFixed called with invalid number of decimals');\n        }\n\n        x = $Number(this);\n\n        // Test for NaN\n        if (x !== x) {\n            return 'NaN';\n        }\n\n        // If it is too big or small, return the string value of the number\n        if (x <= -1e21 || x >= 1e21) {\n            return $String(x);\n        }\n\n        s = '';\n\n        if (x < 0) {\n            s = '-';\n            x = -x;\n        }\n\n        m = '0';\n\n        if (x > 1e-21) {\n            // 1e-21 < x < 1e21\n            // -70 < log2(x) < 70\n            e = toFixedHelpers.log(x * toFixedHelpers.pow(2, 69, 1)) - 69;\n            z = (e < 0 ? x * toFixedHelpers.pow(2, -e, 1) : x / toFixedHelpers.pow(2, e, 1));\n            z *= 0x10000000000000; // Math.pow(2, 52);\n            e = 52 - e;\n\n            // -18 < e < 122\n            // x = z / 2 ^ e\n            if (e > 0) {\n                toFixedHelpers.multiply(0, z);\n                j = f;\n\n                while (j >= 7) {\n                    toFixedHelpers.multiply(1e7, 0);\n                    j -= 7;\n                }\n\n                toFixedHelpers.multiply(toFixedHelpers.pow(10, j, 1), 0);\n                j = e - 1;\n\n                while (j >= 23) {\n                    toFixedHelpers.divide(1 << 23);\n                    j -= 23;\n                }\n\n                toFixedHelpers.divide(1 << j);\n                toFixedHelpers.multiply(1, 1);\n                toFixedHelpers.divide(2);\n                m = toFixedHelpers.numToString();\n            } else {\n                toFixedHelpers.multiply(0, z);\n                toFixedHelpers.multiply(1 << (-e), 0);\n                m = toFixedHelpers.numToString() + strSlice('0.00000000000000000000', 2, 2 + f);\n            }\n        }\n\n        if (f > 0) {\n            k = m.length;\n\n            if (k <= f) {\n                m = s + strSlice('0.0000000000000000000', 0, f - k + 2) + m;\n            } else {\n                m = s + strSlice(m, 0, k - f) + '.' + strSlice(m, k - f);\n            }\n        } else {\n            m = s + m;\n        }\n\n        return m;\n    }\n}, hasToFixedBugs);\n\n//\n// String\n// ======\n//\n\n// ES5 15.5.4.14\n// http://es5.github.com/#x15.5.4.14\n\n// [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers]\n// Many browsers do not split properly with regular expressions or they\n// do not perform the split correctly under obscure conditions.\n// See http://blog.stevenlevithan.com/archives/cross-browser-split\n// I've tested in many browsers and this seems to cover the deviant ones:\n//    'ab'.split(/(?:ab)*/) should be [\"\", \"\"], not [\"\"]\n//    '.'.split(/(.?)(.?)/) should be [\"\", \".\", \"\", \"\"], not [\"\", \"\"]\n//    'tesst'.split(/(s)*/) should be [\"t\", undefined, \"e\", \"s\", \"t\"], not\n//       [undefined, \"t\", undefined, \"e\", ...]\n//    ''.split(/.?/) should be [], not [\"\"]\n//    '.'.split(/()()/) should be [\".\"], not [\"\", \"\", \".\"]\n\nif (\n    'ab'.split(/(?:ab)*/).length !== 2 ||\n    '.'.split(/(.?)(.?)/).length !== 4 ||\n    'tesst'.split(/(s)*/)[1] === 't' ||\n    'test'.split(/(?:)/, -1).length !== 4 ||\n    ''.split(/.?/).length ||\n    '.'.split(/()()/).length > 1\n) {\n    (function () {\n        var compliantExecNpcg = typeof (/()??/).exec('')[1] === 'undefined'; // NPCG: nonparticipating capturing group\n\n        StringPrototype.split = function (separator, limit) {\n            var string = this;\n            if (typeof separator === 'undefined' && limit === 0) {\n                return [];\n            }\n\n            // If `separator` is not a regex, use native split\n            if (!isRegex(separator)) {\n                return strSplit(this, separator, limit);\n            }\n\n            var output = [];\n            var flags = (separator.ignoreCase ? 'i' : '') +\n                        (separator.multiline ? 'm' : '') +\n                        (separator.unicode ? 'u' : '') + // in ES6\n                        (separator.sticky ? 'y' : ''), // Firefox 3+ and ES6\n                lastLastIndex = 0,\n                // Make `global` and avoid `lastIndex` issues by working with a copy\n                separator2, match, lastIndex, lastLength;\n            var separatorCopy = new RegExp(separator.source, flags + 'g');\n            string += ''; // Type-convert\n            if (!compliantExecNpcg) {\n                // Doesn't need flags gy, but they don't hurt\n                separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n            }\n            /* Values for `limit`, per the spec:\n             * If undefined: 4294967295 // Math.pow(2, 32) - 1\n             * If 0, Infinity, or NaN: 0\n             * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;\n             * If negative number: 4294967296 - Math.floor(Math.abs(limit))\n             * If other: Type-convert, then use the above rules\n             */\n            var splitLimit = typeof limit === 'undefined' ?\n                -1 >>> 0 : // Math.pow(2, 32) - 1\n                ES.ToUint32(limit);\n            match = separatorCopy.exec(string);\n            while (match) {\n                // `separatorCopy.lastIndex` is not reliable cross-browser\n                lastIndex = match.index + match[0].length;\n                if (lastIndex > lastLastIndex) {\n                    array_push.call(output, strSlice(string, lastLastIndex, match.index));\n                    // Fix browsers whose `exec` methods don't consistently return `undefined` for\n                    // nonparticipating capturing groups\n                    if (!compliantExecNpcg && match.length > 1) {\n                        /* eslint-disable no-loop-func */\n                        match[0].replace(separator2, function () {\n                            for (var i = 1; i < arguments.length - 2; i++) {\n                                if (typeof arguments[i] === 'undefined') {\n                                    match[i] = void 0;\n                                }\n                            }\n                        });\n                        /* eslint-enable no-loop-func */\n                    }\n                    if (match.length > 1 && match.index < string.length) {\n                        array_push.apply(output, array_slice.call(match, 1));\n                    }\n                    lastLength = match[0].length;\n                    lastLastIndex = lastIndex;\n                    if (output.length >= splitLimit) {\n                        break;\n                    }\n                }\n                if (separatorCopy.lastIndex === match.index) {\n                    separatorCopy.lastIndex++; // Avoid an infinite loop\n                }\n                match = separatorCopy.exec(string);\n            }\n            if (lastLastIndex === string.length) {\n                if (lastLength || !separatorCopy.test('')) {\n                    array_push.call(output, '');\n                }\n            } else {\n                array_push.call(output, strSlice(string, lastLastIndex));\n            }\n            return output.length > splitLimit ? strSlice(output, 0, splitLimit) : output;\n        };\n    }());\n\n// [bugfix, chrome]\n// If separator is undefined, then the result array contains just one String,\n// which is the this value (converted to a String). If limit is not undefined,\n// then the output array is truncated so that it contains no more than limit\n// elements.\n// \"0\".split(undefined, 0) -> []\n} else if ('0'.split(void 0, 0).length) {\n    StringPrototype.split = function split(separator, limit) {\n        if (typeof separator === 'undefined' && limit === 0) { return []; }\n        return strSplit(this, separator, limit);\n    };\n}\n\nvar str_replace = StringPrototype.replace;\nvar replaceReportsGroupsCorrectly = (function () {\n    var groups = [];\n    'x'.replace(/x(.)?/g, function (match, group) {\n        array_push.call(groups, group);\n    });\n    return groups.length === 1 && typeof groups[0] === 'undefined';\n}());\n\nif (!replaceReportsGroupsCorrectly) {\n    StringPrototype.replace = function replace(searchValue, replaceValue) {\n        var isFn = isCallable(replaceValue);\n        var hasCapturingGroups = isRegex(searchValue) && (/\\)[*?]/).test(searchValue.source);\n        if (!isFn || !hasCapturingGroups) {\n            return str_replace.call(this, searchValue, replaceValue);\n        } else {\n            var wrappedReplaceValue = function (match) {\n                var length = arguments.length;\n                var originalLastIndex = searchValue.lastIndex;\n                searchValue.lastIndex = 0;\n                var args = searchValue.exec(match) || [];\n                searchValue.lastIndex = originalLastIndex;\n                array_push.call(args, arguments[length - 2], arguments[length - 1]);\n                return replaceValue.apply(this, args);\n            };\n            return str_replace.call(this, searchValue, wrappedReplaceValue);\n        }\n    };\n}\n\n// ECMA-262, 3rd B.2.3\n// Not an ECMAScript standard, although ECMAScript 3rd Edition has a\n// non-normative section suggesting uniform semantics and it should be\n// normalized across all browsers\n// [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE\nvar string_substr = StringPrototype.substr;\nvar hasNegativeSubstrBug = ''.substr && '0b'.substr(-1) !== 'b';\ndefineProperties(StringPrototype, {\n    substr: function substr(start, length) {\n        var normalizedStart = start;\n        if (start < 0) {\n            normalizedStart = max(this.length + start, 0);\n        }\n        return string_substr.call(this, normalizedStart, length);\n    }\n}, hasNegativeSubstrBug);\n\n// ES5 15.5.4.20\n// whitespace from: http://es5.github.io/#x15.5.4.20\nvar ws = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n    '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028' +\n    '\\u2029\\uFEFF';\nvar zeroWidth = '\\u200b';\nvar wsRegexChars = '[' + ws + ']';\nvar trimBeginRegexp = new RegExp('^' + wsRegexChars + wsRegexChars + '*');\nvar trimEndRegexp = new RegExp(wsRegexChars + wsRegexChars + '*$');\nvar hasTrimWhitespaceBug = StringPrototype.trim && (ws.trim() || !zeroWidth.trim());\ndefineProperties(StringPrototype, {\n    // http://blog.stevenlevithan.com/archives/faster-trim-javascript\n    // http://perfectionkills.com/whitespace-deviations/\n    trim: function trim() {\n        if (typeof this === 'undefined' || this === null) {\n            throw new TypeError(\"can't convert \" + this + ' to object');\n        }\n        return $String(this).replace(trimBeginRegexp, '').replace(trimEndRegexp, '');\n    }\n}, hasTrimWhitespaceBug);\n\n// ES-5 15.1.2.2\nif (parseInt(ws + '08') !== 8 || parseInt(ws + '0x16') !== 22) {\n    /* global parseInt: true */\n    parseInt = (function (origParseInt) {\n        var hexRegex = /^0[xX]/;\n        return function parseInt(str, radix) {\n            var string = $String(str).trim();\n            var defaultedRadix = $Number(radix) || (hexRegex.test(string) ? 16 : 10);\n            return origParseInt(string, defaultedRadix);\n        };\n    }(parseInt));\n}\n\n}));\n"
  },
  {
    "path": "tests/vendor/es6-shim.js",
    "content": " /*!\n  * https://github.com/paulmillr/es6-shim\n  * @license es6-shim Copyright 2013-2015 by Paul Miller (http://paulmillr.com)\n  *   and contributors,  MIT License\n  * es6-shim: v0.32.3\n  * see https://github.com/paulmillr/es6-shim/blob/0.32.3/LICENSE\n  * Details and documentation:\n  * https://github.com/paulmillr/es6-shim/\n  */\n\n// UMD (Universal Module Definition)\n// see https://github.com/umdjs/umd/blob/master/returnExports.js\n(function (root, factory) {\n  /*global define, module, exports */\n  if (typeof define === 'function' && define.amd) {\n    // AMD. Register as an anonymous module.\n    define(factory);\n  } else if (typeof exports === 'object') {\n    // Node. Does not work with strict CommonJS, but\n    // only CommonJS-like enviroments that support module.exports,\n    // like Node.\n    module.exports = factory();\n  } else {\n    // Browser globals (root is window)\n    root.returnExports = factory();\n  }\n}(this, function () {\n  'use strict';\n\n  var _apply = Function.call.bind(Function.apply);\n  var _call = Function.call.bind(Function.call);\n\n  var not = function notThunker(func) {\n    return function notThunk() { return !_apply(func, this, arguments); };\n  };\n  var throwsError = function (func) {\n    try {\n      func();\n      return false;\n    } catch (e) {\n      return true;\n    }\n  };\n  var valueOrFalseIfThrows = function valueOrFalseIfThrows(func) {\n    try {\n      return func();\n    } catch (e) {\n      return false;\n    }\n  };\n\n  var isCallableWithoutNew = not(throwsError);\n  var arePropertyDescriptorsSupported = function () {\n    // if Object.defineProperty exists but throws, it's IE 8\n    return !throwsError(function () { Object.defineProperty({}, 'x', {}); });\n  };\n  var supportsDescriptors = !!Object.defineProperty && arePropertyDescriptorsSupported();\n  var functionsHaveNames = (function foo() {}).name === 'foo';\n\n  var _forEach = Function.call.bind(Array.prototype.forEach);\n  var _reduce = Function.call.bind(Array.prototype.reduce);\n  var _filter = Function.call.bind(Array.prototype.filter);\n  var _every = Function.call.bind(Array.prototype.every);\n\n  var createDataProperty = function createDataProperty(object, name, value) {\n    if (supportsDescriptors) {\n      Object.defineProperty(object, name, {\n        configurable: true,\n        enumerable: true,\n        writable: true,\n        value: value\n      });\n    } else {\n      object[name] = value;\n    }\n  };\n  var createDataPropertyOrThrow = function createDataPropertyOrThrow(object, name, value) {\n    createDataProperty(object, name, value);\n    if (!ES.SameValue(object[name], value)) {\n      throw new TypeError('property is nonconfigurable');\n    }\n  };\n  var defineProperty = function (object, name, value, force) {\n    if (!force && name in object) { return; }\n    if (supportsDescriptors) {\n      Object.defineProperty(object, name, {\n        configurable: true,\n        enumerable: false,\n        writable: true,\n        value: value\n      });\n    } else {\n      object[name] = value;\n    }\n  };\n\n  // Define configurable, writable and non-enumerable props\n  // if they don’t exist.\n  var defineProperties = function (object, map) {\n    _forEach(Object.keys(map), function (name) {\n      var method = map[name];\n      defineProperty(object, name, method, false);\n    });\n  };\n\n  // Simple shim for Object.create on ES3 browsers\n  // (unlike real shim, no attempt to support `prototype === null`)\n  var create = Object.create || function (prototype, properties) {\n    var Prototype = function Prototype() {};\n    Prototype.prototype = prototype;\n    var object = new Prototype();\n    if (typeof properties !== 'undefined') {\n      Object.keys(properties).forEach(function (key) {\n        Value.defineByDescriptor(object, key, properties[key]);\n      });\n    }\n    return object;\n  };\n\n  var supportsSubclassing = function (C, f) {\n    if (!Object.setPrototypeOf) { return false; /* skip test on IE < 11 */ }\n    return valueOrFalseIfThrows(function () {\n      var Sub = function Subclass(arg) {\n        var o = new C(arg);\n        Object.setPrototypeOf(o, Subclass.prototype);\n        return o;\n      };\n      Object.setPrototypeOf(Sub, C);\n      Sub.prototype = create(C.prototype, {\n        constructor: { value: Sub }\n      });\n      return f(Sub);\n    });\n  };\n\n  var startsWithRejectsRegex = function () {\n    return String.prototype.startsWith && throwsError(function () {\n      /* throws if spec-compliant */\n      '/a/'.startsWith(/a/);\n    });\n  };\n  var startsWithHandlesInfinity = (function () {\n    return String.prototype.startsWith && 'abc'.startsWith('a', Infinity) === false;\n  }());\n\n  /*jshint evil: true */\n  var getGlobal = new Function('return this;');\n  /*jshint evil: false */\n\n  var globals = getGlobal();\n  var globalIsFinite = globals.isFinite;\n  var hasStrictMode = (function () { return this === null; }.call(null));\n  var startsWithIsCompliant = startsWithRejectsRegex() && startsWithHandlesInfinity;\n  var _indexOf = Function.call.bind(String.prototype.indexOf);\n  var _toString = Function.call.bind(Object.prototype.toString);\n  var _concat = Function.call.bind(Array.prototype.concat);\n  var _strSlice = Function.call.bind(String.prototype.slice);\n  var _push = Function.call.bind(Array.prototype.push);\n  var _pushApply = Function.apply.bind(Array.prototype.push);\n  var _shift = Function.call.bind(Array.prototype.shift);\n  var _max = Math.max;\n  var _min = Math.min;\n  var _floor = Math.floor;\n  var _abs = Math.abs;\n  var _log = Math.log;\n  var _sqrt = Math.sqrt;\n  var _hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);\n  var ArrayIterator; // make our implementation private\n  var noop = function () {};\n\n  var Symbol = globals.Symbol || {};\n  var symbolSpecies = Symbol.species || '@@species';\n\n  var Value = {\n    getter: function (object, name, getter) {\n      if (!supportsDescriptors) {\n        throw new TypeError('getters require true ES5 support');\n      }\n      Object.defineProperty(object, name, {\n        configurable: true,\n        enumerable: false,\n        get: getter\n      });\n    },\n    proxy: function (originalObject, key, targetObject) {\n      if (!supportsDescriptors) {\n        throw new TypeError('getters require true ES5 support');\n      }\n      var originalDescriptor = Object.getOwnPropertyDescriptor(originalObject, key);\n      Object.defineProperty(targetObject, key, {\n        configurable: originalDescriptor.configurable,\n        enumerable: originalDescriptor.enumerable,\n        get: function getKey() { return originalObject[key]; },\n        set: function setKey(value) { originalObject[key] = value; }\n      });\n    },\n    redefine: function (object, property, newValue) {\n      if (supportsDescriptors) {\n        var descriptor = Object.getOwnPropertyDescriptor(object, property);\n        descriptor.value = newValue;\n        Object.defineProperty(object, property, descriptor);\n      } else {\n        object[property] = newValue;\n      }\n    },\n    defineByDescriptor: function (object, property, descriptor) {\n      if (supportsDescriptors) {\n        Object.defineProperty(object, property, descriptor);\n      } else if ('value' in descriptor) {\n        object[property] = descriptor.value;\n      }\n    },\n    preserveToString: function (target, source) {\n      defineProperty(target, 'toString', source.toString.bind(source), true);\n    }\n  };\n\n  var defaultSpeciesGetter = function () { return this; };\n  var addDefaultSpecies = function (C) {\n    if (supportsDescriptors && !_hasOwnProperty(C, symbolSpecies)) {\n      Value.getter(C, symbolSpecies, defaultSpeciesGetter);\n    }\n  };\n  var Type = {\n    object: function (x) { return x !== null && typeof x === 'object'; },\n    string: function (x) { return _toString(x) === '[object String]'; },\n    regex: function (x) { return _toString(x) === '[object RegExp]'; },\n    symbol: function (x) {\n      return typeof globals.Symbol === 'function' && typeof x === 'symbol';\n    }\n  };\n\n  var numberIsNaN = Number.isNaN || function isNaN(value) {\n    // NaN !== NaN, but they are identical.\n    // NaNs are the only non-reflexive value, i.e., if x !== x,\n    // then x is NaN.\n    // isNaN is broken: it converts its argument to number, so\n    // isNaN('foo') => true\n    return value !== value;\n  };\n  var numberIsFinite = Number.isFinite || function isFinite(value) {\n    return typeof value === 'number' && globalIsFinite(value);\n  };\n\n  var overrideNative = function overrideNative(object, property, replacement) {\n    var original = object[property];\n    defineProperty(object, property, replacement, true);\n    Value.preserveToString(object[property], original);\n  };\n\n  // This is a private name in the es6 spec, equal to '[Symbol.iterator]'\n  // we're going to use an arbitrary _-prefixed name to make our shims\n  // work properly with each other, even though we don't have full Iterator\n  // support.  That is, `Array.from(map.keys())` will work, but we don't\n  // pretend to export a \"real\" Iterator interface.\n  var $iterator$ = Type.symbol(Symbol.iterator) ? Symbol.iterator : '_es6-shim iterator_';\n  // Firefox ships a partial implementation using the name @@iterator.\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=907077#c14\n  // So use that name if we detect it.\n  if (globals.Set && typeof new globals.Set()['@@iterator'] === 'function') {\n    $iterator$ = '@@iterator';\n  }\n  var addIterator = function (prototype, impl) {\n    var implementation = impl || function iterator() { return this; };\n    defineProperty(prototype, $iterator$, implementation);\n    if (!prototype[$iterator$] && Type.symbol($iterator$)) {\n      // implementations are buggy when $iterator$ is a Symbol\n      prototype[$iterator$] = implementation;\n    }\n  };\n\n  // taken directly from https://github.com/ljharb/is-arguments/blob/master/index.js\n  // can be replaced with require('is-arguments') if we ever use a build process instead\n  var isArguments = function isArguments(value) {\n    var str = _toString(value);\n    var result = str === '[object Arguments]';\n    if (!result) {\n      result = str !== '[object Array]' &&\n        value !== null &&\n        typeof value === 'object' &&\n        typeof value.length === 'number' &&\n        value.length >= 0 &&\n        _toString(value.callee) === '[object Function]';\n    }\n    return result;\n  };\n\n  var ES = {\n    // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-call-f-v-args\n    Call: function Call(F, V) {\n      var args = arguments.length > 2 ? arguments[2] : [];\n      if (!ES.IsCallable(F)) {\n        throw new TypeError(F + ' is not a function');\n      }\n      return _apply(F, V, args);\n    },\n\n    RequireObjectCoercible: function (x, optMessage) {\n      /* jshint eqnull:true */\n      if (x == null) {\n        throw new TypeError(optMessage || 'Cannot call method on ' + x);\n      }\n    },\n\n    TypeIsObject: function (x) {\n      /* jshint eqnull:true */\n      // this is expensive when it returns false; use this function\n      // when you expect it to return true in the common case.\n      return x != null && Object(x) === x;\n    },\n\n    ToObject: function (o, optMessage) {\n      ES.RequireObjectCoercible(o, optMessage);\n      return Object(o);\n    },\n\n    IsCallable: function (x) {\n      // some versions of IE say that typeof /abc/ === 'function'\n      return typeof x === 'function' && _toString(x) === '[object Function]';\n    },\n\n    IsConstructor: function (x) {\n      // We can't tell callables from constructors in ES5\n      return ES.IsCallable(x);\n    },\n\n    ToInt32: function (x) {\n      return ES.ToNumber(x) >> 0;\n    },\n\n    ToUint32: function (x) {\n      return ES.ToNumber(x) >>> 0;\n    },\n\n    ToNumber: function (value) {\n      if (_toString(value) === '[object Symbol]') {\n        throw new TypeError('Cannot convert a Symbol value to a number');\n      }\n      return +value;\n    },\n\n    ToInteger: function (value) {\n      var number = ES.ToNumber(value);\n      if (numberIsNaN(number)) { return 0; }\n      if (number === 0 || !numberIsFinite(number)) { return number; }\n      return (number > 0 ? 1 : -1) * _floor(_abs(number));\n    },\n\n    ToLength: function (value) {\n      var len = ES.ToInteger(value);\n      if (len <= 0) { return 0; } // includes converting -0 to +0\n      if (len > Number.MAX_SAFE_INTEGER) { return Number.MAX_SAFE_INTEGER; }\n      return len;\n    },\n\n    SameValue: function (a, b) {\n      if (a === b) {\n        // 0 === -0, but they are not identical.\n        if (a === 0) { return 1 / a === 1 / b; }\n        return true;\n      }\n      return numberIsNaN(a) && numberIsNaN(b);\n    },\n\n    SameValueZero: function (a, b) {\n      // same as SameValue except for SameValueZero(+0, -0) == true\n      return (a === b) || (numberIsNaN(a) && numberIsNaN(b));\n    },\n\n    IsIterable: function (o) {\n      return ES.TypeIsObject(o) && (typeof o[$iterator$] !== 'undefined' || isArguments(o));\n    },\n\n    GetIterator: function (o) {\n      if (isArguments(o)) {\n        // special case support for `arguments`\n        return new ArrayIterator(o, 'value');\n      }\n      var itFn = ES.GetMethod(o, $iterator$);\n      if (!ES.IsCallable(itFn)) {\n        // Better diagnostics if itFn is null or undefined\n        throw new TypeError('value is not an iterable');\n      }\n      var it = _call(itFn, o);\n      if (!ES.TypeIsObject(it)) {\n        throw new TypeError('bad iterator');\n      }\n      return it;\n    },\n\n    GetMethod: function (o, p) {\n      var func = ES.ToObject(o)[p];\n      if (func === void 0 || func === null) {\n        return void 0;\n      }\n      if (!ES.IsCallable(func)) {\n        throw new TypeError('Method not callable: ' + p);\n      }\n      return func;\n    },\n\n    IteratorComplete: function (iterResult) {\n      return !!(iterResult.done);\n    },\n\n    IteratorClose: function (iterator, completionIsThrow) {\n      var returnMethod = ES.GetMethod(iterator, 'return');\n      if (returnMethod === void 0) {\n        return;\n      }\n      var innerResult, innerException;\n      try {\n        innerResult = _call(returnMethod, iterator);\n      } catch (e) {\n        innerException = e;\n      }\n      if (completionIsThrow) {\n        return;\n      }\n      if (innerException) {\n        throw innerException;\n      }\n      if (!ES.TypeIsObject(innerResult)) {\n        throw new TypeError(\"Iterator's return method returned a non-object.\");\n      }\n    },\n\n    IteratorNext: function (it) {\n      var result = arguments.length > 1 ? it.next(arguments[1]) : it.next();\n      if (!ES.TypeIsObject(result)) {\n        throw new TypeError('bad iterator');\n      }\n      return result;\n    },\n\n    IteratorStep: function (it) {\n      var result = ES.IteratorNext(it);\n      var done = ES.IteratorComplete(result);\n      return done ? false : result;\n    },\n\n    Construct: function (C, args, newTarget, isES6internal) {\n      if (newTarget === void 0) {\n        newTarget = C;\n      }\n      if (!isES6internal) {\n        // Try to use Reflect.construct if available\n        return Reflect.construct(C, args, newTarget);\n      }\n      // OK, we have to fake it.  This will only work if the\n      // C.[[ConstructorKind]] == \"base\" -- but that's the only\n      // kind we can make in ES5 code anyway.\n\n      // OrdinaryCreateFromConstructor(newTarget, \"%ObjectPrototype%\")\n      var proto = newTarget.prototype;\n      if (!ES.TypeIsObject(proto)) {\n        proto = Object.prototype;\n      }\n      var obj = create(proto);\n      // Call the constructor.\n      var result = ES.Call(C, obj, args);\n      return ES.TypeIsObject(result) ? result : obj;\n    },\n\n    SpeciesConstructor: function (O, defaultConstructor) {\n      var C = O.constructor;\n      if (C === void 0) {\n        return defaultConstructor;\n      }\n      if (!ES.TypeIsObject(C)) {\n        throw new TypeError('Bad constructor');\n      }\n      var S = C[symbolSpecies];\n      if (S === void 0 || S === null) {\n        return defaultConstructor;\n      }\n      if (!ES.IsConstructor(S)) {\n        throw new TypeError('Bad @@species');\n      }\n      return S;\n    },\n\n    CreateHTML: function (string, tag, attribute, value) {\n      var S = String(string);\n      var p1 = '<' + tag;\n      if (attribute !== '') {\n        var V = String(value);\n        var escapedV = V.replace(/\"/g, '&quot;');\n        p1 += ' ' + attribute + '=\"' + escapedV + '\"';\n      }\n      var p2 = p1 + '>';\n      var p3 = p2 + S;\n      return p3 + '</' + tag + '>';\n    }\n  };\n\n  var emulateES6construct = function (o, defaultNewTarget, defaultProto, slots) {\n    // This is an es5 approximation to es6 construct semantics.  in es6,\n    // 'new Foo' invokes Foo.[[Construct]] which (for almost all objects)\n    // just sets the internal variable NewTarget (in es6 syntax `new.target`)\n    // to Foo and then returns Foo().\n\n    // Many ES6 object then have constructors of the form:\n    // 1. If NewTarget is undefined, throw a TypeError exception\n    // 2. Let xxx by OrdinaryCreateFromConstructor(NewTarget, yyy, zzz)\n\n    // So we're going to emulate those first two steps.\n    if (!ES.TypeIsObject(o)) {\n      throw new TypeError('Constructor requires `new`: ' + defaultNewTarget.name);\n    }\n    var proto = defaultNewTarget.prototype;\n    if (!ES.TypeIsObject(proto)) {\n      proto = defaultProto;\n    }\n    o = create(proto);\n    for (var name in slots) {\n      if (_hasOwnProperty(slots, name)) {\n        var value = slots[name];\n        defineProperty(o, name, value, true);\n      }\n    }\n    return o;\n  };\n\n  // Firefox 31 reports this function's length as 0\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=1062484\n  if (String.fromCodePoint && String.fromCodePoint.length !== 1) {\n    var originalFromCodePoint = String.fromCodePoint;\n    overrideNative(String, 'fromCodePoint', function fromCodePoint(codePoints) { return _apply(originalFromCodePoint, this, arguments); });\n  }\n\n  var StringShims = {\n    fromCodePoint: function fromCodePoint(codePoints) {\n      var result = [];\n      var next;\n      for (var i = 0, length = arguments.length; i < length; i++) {\n        next = Number(arguments[i]);\n        if (!ES.SameValue(next, ES.ToInteger(next)) || next < 0 || next > 0x10FFFF) {\n          throw new RangeError('Invalid code point ' + next);\n        }\n\n        if (next < 0x10000) {\n          _push(result, String.fromCharCode(next));\n        } else {\n          next -= 0x10000;\n          _push(result, String.fromCharCode((next >> 10) + 0xD800));\n          _push(result, String.fromCharCode((next % 0x400) + 0xDC00));\n        }\n      }\n      return result.join('');\n    },\n\n    raw: function raw(callSite) {\n      var cooked = ES.ToObject(callSite, 'bad callSite');\n      var rawString = ES.ToObject(cooked.raw, 'bad raw value');\n      var len = rawString.length;\n      var literalsegments = ES.ToLength(len);\n      if (literalsegments <= 0) {\n        return '';\n      }\n\n      var stringElements = [];\n      var nextIndex = 0;\n      var nextKey, next, nextSeg, nextSub;\n      while (nextIndex < literalsegments) {\n        nextKey = String(nextIndex);\n        nextSeg = String(rawString[nextKey]);\n        _push(stringElements, nextSeg);\n        if (nextIndex + 1 >= literalsegments) {\n          break;\n        }\n        next = nextIndex + 1 < arguments.length ? arguments[nextIndex + 1] : '';\n        nextSub = String(next);\n        _push(stringElements, nextSub);\n        nextIndex++;\n      }\n      return stringElements.join('');\n    }\n  };\n  defineProperties(String, StringShims);\n  if (String.raw({ raw: { 0: 'x', 1: 'y', length: 2 } }) !== 'xy') {\n    // IE 11 TP has a broken String.raw implementation\n    overrideNative(String, 'raw', StringShims.raw);\n  }\n\n  // Fast repeat, uses the `Exponentiation by squaring` algorithm.\n  // Perf: http://jsperf.com/string-repeat2/2\n  var stringRepeat = function repeat(s, times) {\n    if (times < 1) { return ''; }\n    if (times % 2) { return repeat(s, times - 1) + s; }\n    var half = repeat(s, times / 2);\n    return half + half;\n  };\n  var stringMaxLength = Infinity;\n\n  var StringPrototypeShims = {\n    repeat: function repeat(times) {\n      ES.RequireObjectCoercible(this);\n      var thisStr = String(this);\n      var numTimes = ES.ToInteger(times);\n      if (numTimes < 0 || numTimes >= stringMaxLength) {\n        throw new RangeError('repeat count must be less than infinity and not overflow maximum string size');\n      }\n      return stringRepeat(thisStr, numTimes);\n    },\n\n    startsWith: function startsWith(searchString) {\n      ES.RequireObjectCoercible(this);\n      var thisStr = String(this);\n      if (Type.regex(searchString)) {\n        throw new TypeError('Cannot call method \"startsWith\" with a regex');\n      }\n      var searchStr = String(searchString);\n      var startArg = arguments.length > 1 ? arguments[1] : void 0;\n      var start = _max(ES.ToInteger(startArg), 0);\n      return _strSlice(thisStr, start, start + searchStr.length) === searchStr;\n    },\n\n    endsWith: function endsWith(searchString) {\n      ES.RequireObjectCoercible(this);\n      var thisStr = String(this);\n      if (Type.regex(searchString)) {\n        throw new TypeError('Cannot call method \"endsWith\" with a regex');\n      }\n      var searchStr = String(searchString);\n      var thisLen = thisStr.length;\n      var posArg = arguments.length > 1 ? arguments[1] : void 0;\n      var pos = typeof posArg === 'undefined' ? thisLen : ES.ToInteger(posArg);\n      var end = _min(_max(pos, 0), thisLen);\n      return _strSlice(thisStr, end - searchStr.length, end) === searchStr;\n    },\n\n    includes: function includes(searchString) {\n      if (Type.regex(searchString)) {\n        throw new TypeError('\"includes\" does not accept a RegExp');\n      }\n      var position;\n      if (arguments.length > 1) {\n        position = arguments[1];\n      }\n      // Somehow this trick makes method 100% compat with the spec.\n      return _indexOf(this, searchString, position) !== -1;\n    },\n\n    codePointAt: function codePointAt(pos) {\n      ES.RequireObjectCoercible(this);\n      var thisStr = String(this);\n      var position = ES.ToInteger(pos);\n      var length = thisStr.length;\n      if (position >= 0 && position < length) {\n        var first = thisStr.charCodeAt(position);\n        var isEnd = (position + 1 === length);\n        if (first < 0xD800 || first > 0xDBFF || isEnd) { return first; }\n        var second = thisStr.charCodeAt(position + 1);\n        if (second < 0xDC00 || second > 0xDFFF) { return first; }\n        return ((first - 0xD800) * 1024) + (second - 0xDC00) + 0x10000;\n      }\n    }\n  };\n  defineProperties(String.prototype, StringPrototypeShims);\n\n  if ('a'.includes('a', Infinity) !== false) {\n    overrideNative(String.prototype, 'includes', StringPrototypeShims.includes);\n  }\n\n  var hasStringTrimBug = '\\u0085'.trim().length !== 1;\n  if (hasStringTrimBug) {\n    delete String.prototype.trim;\n    // whitespace from: http://es5.github.io/#x15.5.4.20\n    // implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324\n    var ws = [\n      '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003',\n      '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028',\n      '\\u2029\\uFEFF'\n    ].join('');\n    var trimRegexp = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');\n    defineProperties(String.prototype, {\n      trim: function trim() {\n        if (typeof this === 'undefined' || this === null) {\n          throw new TypeError(\"can't convert \" + this + ' to object');\n        }\n        return String(this).replace(trimRegexp, '');\n      }\n    });\n  }\n\n  // see https://people.mozilla.org/~jorendorff/es6-draft.html#sec-string.prototype-@@iterator\n  var StringIterator = function (s) {\n    ES.RequireObjectCoercible(s);\n    this._s = String(s);\n    this._i = 0;\n  };\n  StringIterator.prototype.next = function () {\n    var s = this._s, i = this._i;\n    if (typeof s === 'undefined' || i >= s.length) {\n      this._s = void 0;\n      return { value: void 0, done: true };\n    }\n    var first = s.charCodeAt(i), second, len;\n    if (first < 0xD800 || first > 0xDBFF || (i + 1) === s.length) {\n      len = 1;\n    } else {\n      second = s.charCodeAt(i + 1);\n      len = (second < 0xDC00 || second > 0xDFFF) ? 1 : 2;\n    }\n    this._i = i + len;\n    return { value: s.substr(i, len), done: false };\n  };\n  addIterator(StringIterator.prototype);\n  addIterator(String.prototype, function () {\n    return new StringIterator(this);\n  });\n\n  if (!startsWithIsCompliant) {\n    // Firefox (< 37?) and IE 11 TP have a noncompliant startsWith implementation\n    overrideNative(String.prototype, 'startsWith', StringPrototypeShims.startsWith);\n    overrideNative(String.prototype, 'endsWith', StringPrototypeShims.endsWith);\n  }\n\n  var ArrayShims = {\n    from: function from(items) {\n      var C = this;\n      var mapFn = arguments.length > 1 ? arguments[1] : void 0;\n      var mapping, T;\n      if (mapFn === void 0) {\n        mapping = false;\n      } else {\n        if (!ES.IsCallable(mapFn)) {\n          throw new TypeError('Array.from: when provided, the second argument must be a function');\n        }\n        T = arguments.length > 2 ? arguments[2] : void 0;\n        mapping = true;\n      }\n\n      // Note that that Arrays will use ArrayIterator:\n      // https://bugs.ecmascript.org/show_bug.cgi?id=2416\n      var usingIterator = isArguments(items) || ES.GetMethod(items, $iterator$);\n\n      var length, result, i;\n      if (usingIterator !== void 0) {\n        result = ES.IsConstructor(C) ? Object(new C()) : [];\n        var iterator = ES.GetIterator(items);\n        var next, nextValue;\n\n        for (i = 0; ; ++i) {\n          next = ES.IteratorStep(iterator);\n          if (next === false) {\n            break;\n          }\n          nextValue = next.value;\n          try {\n            if (mapping) {\n              nextValue = T !== undefined ? _call(mapFn, T, nextValue, i) : mapFn(nextValue, i);\n            }\n            result[i] = nextValue;\n          } catch (e) {\n            ES.IteratorClose(iterator, true);\n            throw e;\n          }\n        }\n        length = i;\n      } else {\n        var arrayLike = ES.ToObject(items);\n        length = ES.ToLength(arrayLike.length);\n        result = ES.IsConstructor(C) ? Object(new C(length)) : new Array(length);\n        var value;\n        for (i = 0; i < length; ++i) {\n          value = arrayLike[i];\n          if (mapping) {\n            value = T !== undefined ? _call(mapFn, T, value, i) : mapFn(value, i);\n          }\n          result[i] = value;\n        }\n      }\n\n      result.length = length;\n      return result;\n    },\n\n    of: function of() {\n      var len = arguments.length;\n      var C = this;\n      var A = Array.isArray(C) || !ES.IsCallable(C) ? new Array(len) : ES.Construct(C, [len]);\n      for (var k = 0; k < len; ++k) {\n        createDataPropertyOrThrow(A, k, arguments[k]);\n      }\n      A.length = len;\n      return A;\n    }\n  };\n  defineProperties(Array, ArrayShims);\n  addDefaultSpecies(Array);\n\n  // Given an argument x, it will return an IteratorResult object,\n  // with value set to x and done to false.\n  // Given no arguments, it will return an iterator completion object.\n  var iteratorResult = function (x) {\n    return { value: x, done: arguments.length === 0 };\n  };\n\n  // Our ArrayIterator is private; see\n  // https://github.com/paulmillr/es6-shim/issues/252\n  ArrayIterator = function (array, kind) {\n      this.i = 0;\n      this.array = array;\n      this.kind = kind;\n  };\n\n  defineProperties(ArrayIterator.prototype, {\n    next: function () {\n      var i = this.i, array = this.array;\n      if (!(this instanceof ArrayIterator)) {\n        throw new TypeError('Not an ArrayIterator');\n      }\n      if (typeof array !== 'undefined') {\n        var len = ES.ToLength(array.length);\n        for (; i < len; i++) {\n          var kind = this.kind;\n          var retval;\n          if (kind === 'key') {\n            retval = i;\n          } else if (kind === 'value') {\n            retval = array[i];\n          } else if (kind === 'entry') {\n            retval = [i, array[i]];\n          }\n          this.i = i + 1;\n          return { value: retval, done: false };\n        }\n      }\n      this.array = void 0;\n      return { value: void 0, done: true };\n    }\n  });\n  addIterator(ArrayIterator.prototype);\n\n  var ObjectIterator = function (object, kind) {\n    this.object = object;\n    // Don't generate keys yet.\n    this.array = null;\n    this.kind = kind;\n  };\n\n  var getAllKeys = function getAllKeys(object) {\n    var keys = [];\n\n    for (var key in object) {\n      _push(keys, key);\n    }\n\n    return keys;\n  };\n\n  defineProperties(ObjectIterator.prototype, {\n    next: function () {\n      var key, array = this.array;\n\n      if (!(this instanceof ObjectIterator)) {\n        throw new TypeError('Not an ObjectIterator');\n      }\n\n      // Keys not generated\n      if (array === null) {\n        array = this.array = getAllKeys(this.object);\n      }\n\n      // Find next key in the object\n      while (ES.ToLength(array.length) > 0) {\n        key = _shift(array);\n\n        // The candidate key isn't defined on object.\n        // Must have been deleted, or object[[Prototype]]\n        // has been modified.\n        if (!(key in this.object)) {\n          continue;\n        }\n\n        if (this.kind === 'key') {\n          return iteratorResult(key);\n        } else if (this.kind === 'value') {\n          return iteratorResult(this.object[key]);\n        } else {\n          return iteratorResult([key, this.object[key]]);\n        }\n      }\n\n      return iteratorResult();\n    }\n  });\n  addIterator(ObjectIterator.prototype);\n\n  // note: this is positioned here because it depends on ArrayIterator\n  var arrayOfSupportsSubclassing = Array.of === ArrayShims.of || (function () {\n    // Detects a bug in Webkit nightly r181886\n    var Foo = function Foo(len) { this.length = len; };\n    Foo.prototype = [];\n    var fooArr = Array.of.apply(Foo, [1, 2]);\n    return fooArr instanceof Foo && fooArr.length === 2;\n  }());\n  if (!arrayOfSupportsSubclassing) {\n    overrideNative(Array, 'of', ArrayShims.of);\n  }\n\n  var ArrayPrototypeShims = {\n    copyWithin: function copyWithin(target, start) {\n      var end = arguments[2]; // copyWithin.length must be 2\n      var o = ES.ToObject(this);\n      var len = ES.ToLength(o.length);\n      var relativeTarget = ES.ToInteger(target);\n      var relativeStart = ES.ToInteger(start);\n      var to = relativeTarget < 0 ? _max(len + relativeTarget, 0) : _min(relativeTarget, len);\n      var from = relativeStart < 0 ? _max(len + relativeStart, 0) : _min(relativeStart, len);\n      end = typeof end === 'undefined' ? len : ES.ToInteger(end);\n      var fin = end < 0 ? _max(len + end, 0) : _min(end, len);\n      var count = _min(fin - from, len - to);\n      var direction = 1;\n      if (from < to && to < (from + count)) {\n        direction = -1;\n        from += count - 1;\n        to += count - 1;\n      }\n      while (count > 0) {\n        if (_hasOwnProperty(o, from)) {\n          o[to] = o[from];\n        } else {\n          delete o[from];\n        }\n        from += direction;\n        to += direction;\n        count -= 1;\n      }\n      return o;\n    },\n\n    fill: function fill(value) {\n      var start = arguments.length > 1 ? arguments[1] : void 0;\n      var end = arguments.length > 2 ? arguments[2] : void 0;\n      var O = ES.ToObject(this);\n      var len = ES.ToLength(O.length);\n      start = ES.ToInteger(typeof start === 'undefined' ? 0 : start);\n      end = ES.ToInteger(typeof end === 'undefined' ? len : end);\n\n      var relativeStart = start < 0 ? _max(len + start, 0) : _min(start, len);\n      var relativeEnd = end < 0 ? len + end : end;\n\n      for (var i = relativeStart; i < len && i < relativeEnd; ++i) {\n        O[i] = value;\n      }\n      return O;\n    },\n\n    find: function find(predicate) {\n      var list = ES.ToObject(this);\n      var length = ES.ToLength(list.length);\n      if (!ES.IsCallable(predicate)) {\n        throw new TypeError('Array#find: predicate must be a function');\n      }\n      var thisArg = arguments.length > 1 ? arguments[1] : null;\n      for (var i = 0, value; i < length; i++) {\n        value = list[i];\n        if (thisArg) {\n          if (_call(predicate, thisArg, value, i, list)) { return value; }\n        } else if (predicate(value, i, list)) {\n          return value;\n        }\n      }\n    },\n\n    findIndex: function findIndex(predicate) {\n      var list = ES.ToObject(this);\n      var length = ES.ToLength(list.length);\n      if (!ES.IsCallable(predicate)) {\n        throw new TypeError('Array#findIndex: predicate must be a function');\n      }\n      var thisArg = arguments.length > 1 ? arguments[1] : null;\n      for (var i = 0; i < length; i++) {\n        if (thisArg) {\n          if (_call(predicate, thisArg, list[i], i, list)) { return i; }\n        } else if (predicate(list[i], i, list)) {\n          return i;\n        }\n      }\n      return -1;\n    },\n\n    keys: function keys() {\n      return new ArrayIterator(this, 'key');\n    },\n\n    values: function values() {\n      return new ArrayIterator(this, 'value');\n    },\n\n    entries: function entries() {\n      return new ArrayIterator(this, 'entry');\n    }\n  };\n  // Safari 7.1 defines Array#keys and Array#entries natively,\n  // but the resulting ArrayIterator objects don't have a \"next\" method.\n  if (Array.prototype.keys && !ES.IsCallable([1].keys().next)) {\n    delete Array.prototype.keys;\n  }\n  if (Array.prototype.entries && !ES.IsCallable([1].entries().next)) {\n    delete Array.prototype.entries;\n  }\n\n  // Chrome 38 defines Array#keys and Array#entries, and Array#@@iterator, but not Array#values\n  if (Array.prototype.keys && Array.prototype.entries && !Array.prototype.values && Array.prototype[$iterator$]) {\n    defineProperties(Array.prototype, {\n      values: Array.prototype[$iterator$]\n    });\n    if (Type.symbol(Symbol.unscopables)) {\n      Array.prototype[Symbol.unscopables].values = true;\n    }\n  }\n  // Chrome 40 defines Array#values with the incorrect name, although Array#{keys,entries} have the correct name\n  if (functionsHaveNames && Array.prototype.values && Array.prototype.values.name !== 'values') {\n    var originalArrayPrototypeValues = Array.prototype.values;\n    overrideNative(Array.prototype, 'values', function values() { return _call(originalArrayPrototypeValues, this); });\n    defineProperty(Array.prototype, $iterator$, Array.prototype.values, true);\n  }\n  defineProperties(Array.prototype, ArrayPrototypeShims);\n\n  addIterator(Array.prototype, function () { return this.values(); });\n  // Chrome defines keys/values/entries on Array, but doesn't give us\n  // any way to identify its iterator.  So add our own shimmed field.\n  if (Object.getPrototypeOf) {\n    addIterator(Object.getPrototypeOf([].values()));\n  }\n\n  // note: this is positioned here because it relies on Array#entries\n  var arrayFromSwallowsNegativeLengths = (function () {\n    // Detects a Firefox bug in v32\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=1063993\n    return valueOrFalseIfThrows(function () { return Array.from({ length: -1 }).length === 0; });\n  }());\n  var arrayFromHandlesIterables = (function () {\n    // Detects a bug in Webkit nightly r181886\n    var arr = Array.from([0].entries());\n    return arr.length === 1 && Array.isArray(arr[0]) && arr[0][0] === 0 && arr[0][1] === 0;\n  }());\n  if (!arrayFromSwallowsNegativeLengths || !arrayFromHandlesIterables) {\n    overrideNative(Array, 'from', ArrayShims.from);\n  }\n  var arrayFromHandlesUndefinedMapFunction = (function () {\n    // Microsoft Edge v0.11 throws if the mapFn argument is *provided* but undefined,\n    // but the spec doesn't care if it's provided or not - undefined doesn't throw.\n    return valueOrFalseIfThrows(function () { return Array.from([0], undefined); });\n  }());\n  if (!arrayFromHandlesUndefinedMapFunction) {\n    var origArrayFrom = Array.from;\n    overrideNative(Array, 'from', function from(items) {\n      if (arguments.length > 0 && typeof arguments[1] !== 'undefined') {\n        return _apply(origArrayFrom, this, arguments);\n      } else {\n        return _call(origArrayFrom, this, items);\n      }\n    });\n  }\n\n  var toLengthsCorrectly = function (method, reversed) {\n    var obj = { length: -1 };\n    obj[reversed ? ((-1 >>> 0) - 1) : 0] = true;\n    return valueOrFalseIfThrows(function () {\n      _call(method, obj, function () {\n        // note: in nonconforming browsers, this will be called\n        // -1 >>> 0 times, which is 4294967295, so the throw matters.\n        throw new RangeError('should not reach here');\n      }, []);\n    });\n  };\n  if (!toLengthsCorrectly(Array.prototype.forEach)) {\n    var originalForEach = Array.prototype.forEach;\n    overrideNative(Array.prototype, 'forEach', function forEach(callbackFn) {\n      return _apply(originalForEach, this.length >= 0 ? this : [], arguments);\n    }, true);\n  }\n  if (!toLengthsCorrectly(Array.prototype.map)) {\n    var originalMap = Array.prototype.map;\n    overrideNative(Array.prototype, 'map', function map(callbackFn) {\n      return _apply(originalMap, this.length >= 0 ? this : [], arguments);\n    }, true);\n  }\n  if (!toLengthsCorrectly(Array.prototype.filter)) {\n    var originalFilter = Array.prototype.filter;\n    overrideNative(Array.prototype, 'filter', function filter(callbackFn) {\n      return _apply(originalFilter, this.length >= 0 ? this : [], arguments);\n    }, true);\n  }\n  if (!toLengthsCorrectly(Array.prototype.some)) {\n    var originalSome = Array.prototype.some;\n    overrideNative(Array.prototype, 'some', function some(callbackFn) {\n      return _apply(originalSome, this.length >= 0 ? this : [], arguments);\n    }, true);\n  }\n  if (!toLengthsCorrectly(Array.prototype.every)) {\n    var originalEvery = Array.prototype.every;\n    overrideNative(Array.prototype, 'every', function every(callbackFn) {\n      return _apply(originalEvery, this.length >= 0 ? this : [], arguments);\n    }, true);\n  }\n  if (!toLengthsCorrectly(Array.prototype.reduce)) {\n    var originalReduce = Array.prototype.reduce;\n    overrideNative(Array.prototype, 'reduce', function reduce(callbackFn) {\n      return _apply(originalReduce, this.length >= 0 ? this : [], arguments);\n    }, true);\n  }\n  if (!toLengthsCorrectly(Array.prototype.reduceRight, true)) {\n    var originalReduceRight = Array.prototype.reduceRight;\n    overrideNative(Array.prototype, 'reduceRight', function reduceRight(callbackFn) {\n      return _apply(originalReduceRight, this.length >= 0 ? this : [], arguments);\n    }, true);\n  }\n\n  var maxSafeInteger = Math.pow(2, 53) - 1;\n  defineProperties(Number, {\n    MAX_SAFE_INTEGER: maxSafeInteger,\n    MIN_SAFE_INTEGER: -maxSafeInteger,\n    EPSILON: 2.220446049250313e-16,\n\n    parseInt: globals.parseInt,\n    parseFloat: globals.parseFloat,\n\n    isFinite: numberIsFinite,\n\n    isInteger: function isInteger(value) {\n      return numberIsFinite(value) && ES.ToInteger(value) === value;\n    },\n\n    isSafeInteger: function isSafeInteger(value) {\n      return Number.isInteger(value) && _abs(value) <= Number.MAX_SAFE_INTEGER;\n    },\n\n    isNaN: numberIsNaN\n  });\n  // Firefox 37 has a conforming Number.parseInt, but it's not === to the global parseInt (fixed in v40)\n  defineProperty(Number, 'parseInt', globals.parseInt, Number.parseInt !== globals.parseInt);\n\n  // Work around bugs in Array#find and Array#findIndex -- early\n  // implementations skipped holes in sparse arrays. (Note that the\n  // implementations of find/findIndex indirectly use shimmed\n  // methods of Number, so this test has to happen down here.)\n  /*jshint elision: true */\n  if (![, 1].find(function (item, idx) { return idx === 0; })) {\n    overrideNative(Array.prototype, 'find', ArrayPrototypeShims.find);\n  }\n  if ([, 1].findIndex(function (item, idx) { return idx === 0; }) !== 0) {\n    overrideNative(Array.prototype, 'findIndex', ArrayPrototypeShims.findIndex);\n  }\n  /*jshint elision: false */\n\n  var isEnumerableOn = Function.bind.call(Function.bind, Object.prototype.propertyIsEnumerable);\n  var sliceArgs = function sliceArgs() {\n    // per https://github.com/petkaantonov/bluebird/wiki/Optimization-killers#32-leaking-arguments\n    // and https://gist.github.com/WebReflection/4327762cb87a8c634a29\n    var initial = Number(this);\n    var len = arguments.length;\n    var desiredArgCount = len - initial;\n    var args = new Array(desiredArgCount < 0 ? 0 : desiredArgCount);\n    for (var i = initial; i < len; ++i) {\n      args[i - initial] = arguments[i];\n    }\n    return args;\n  };\n  var assignTo = function assignTo(source) {\n    return function assignToSource(target, key) {\n      target[key] = source[key];\n      return target;\n    };\n  };\n  var assignReducer = function (target, source) {\n    var keys = Object.keys(Object(source));\n    var symbols;\n    if (ES.IsCallable(Object.getOwnPropertySymbols)) {\n      symbols = _filter(Object.getOwnPropertySymbols(Object(source)), isEnumerableOn(source));\n    }\n    return _reduce(_concat(keys, symbols || []), assignTo(source), target);\n  };\n\n  var ObjectShims = {\n    // 19.1.3.1\n    assign: function (target, source) {\n      var to = ES.ToObject(target, 'Cannot convert undefined or null to object');\n      return _reduce(_apply(sliceArgs, 1, arguments), assignReducer, to);\n    },\n\n    // Added in WebKit in https://bugs.webkit.org/show_bug.cgi?id=143865\n    is: function is(a, b) {\n      return ES.SameValue(a, b);\n    }\n  };\n  var assignHasPendingExceptions = Object.assign && Object.preventExtensions && (function () {\n    // Firefox 37 still has \"pending exception\" logic in its Object.assign implementation,\n    // which is 72% slower than our shim, and Firefox 40's native implementation.\n    var thrower = Object.preventExtensions({ 1: 2 });\n    try {\n      Object.assign(thrower, 'xy');\n    } catch (e) {\n      return thrower[1] === 'y';\n    }\n  }());\n  if (assignHasPendingExceptions) {\n    overrideNative(Object, 'assign', ObjectShims.assign);\n  }\n  defineProperties(Object, ObjectShims);\n\n  if (supportsDescriptors) {\n    var ES5ObjectShims = {\n      // 19.1.3.9\n      // shim from https://gist.github.com/WebReflection/5593554\n      setPrototypeOf: (function (Object, magic) {\n        var set;\n\n        var checkArgs = function (O, proto) {\n          if (!ES.TypeIsObject(O)) {\n            throw new TypeError('cannot set prototype on a non-object');\n          }\n          if (!(proto === null || ES.TypeIsObject(proto))) {\n            throw new TypeError('can only set prototype to an object or null' + proto);\n          }\n        };\n\n        var setPrototypeOf = function (O, proto) {\n          checkArgs(O, proto);\n          _call(set, O, proto);\n          return O;\n        };\n\n        try {\n          // this works already in Firefox and Safari\n          set = Object.getOwnPropertyDescriptor(Object.prototype, magic).set;\n          _call(set, {}, null);\n        } catch (e) {\n          if (Object.prototype !== {}[magic]) {\n            // IE < 11 cannot be shimmed\n            return;\n          }\n          // probably Chrome or some old Mobile stock browser\n          set = function (proto) {\n            this[magic] = proto;\n          };\n          // please note that this will **not** work\n          // in those browsers that do not inherit\n          // __proto__ by mistake from Object.prototype\n          // in these cases we should probably throw an error\n          // or at least be informed about the issue\n          setPrototypeOf.polyfill = setPrototypeOf(\n            setPrototypeOf({}, null),\n            Object.prototype\n          ) instanceof Object;\n          // setPrototypeOf.polyfill === true means it works as meant\n          // setPrototypeOf.polyfill === false means it's not 100% reliable\n          // setPrototypeOf.polyfill === undefined\n          // or\n          // setPrototypeOf.polyfill ==  null means it's not a polyfill\n          // which means it works as expected\n          // we can even delete Object.prototype.__proto__;\n        }\n        return setPrototypeOf;\n      }(Object, '__proto__'))\n    };\n\n    defineProperties(Object, ES5ObjectShims);\n  }\n\n  // Workaround bug in Opera 12 where setPrototypeOf(x, null) doesn't work,\n  // but Object.create(null) does.\n  if (Object.setPrototypeOf && Object.getPrototypeOf &&\n      Object.getPrototypeOf(Object.setPrototypeOf({}, null)) !== null &&\n      Object.getPrototypeOf(Object.create(null)) === null) {\n    (function () {\n      var FAKENULL = Object.create(null);\n      var gpo = Object.getPrototypeOf, spo = Object.setPrototypeOf;\n      Object.getPrototypeOf = function (o) {\n        var result = gpo(o);\n        return result === FAKENULL ? null : result;\n      };\n      Object.setPrototypeOf = function (o, p) {\n        var proto = p === null ? FAKENULL : p;\n        return spo(o, proto);\n      };\n      Object.setPrototypeOf.polyfill = false;\n    }());\n  }\n\n  var objectKeysAcceptsPrimitives = !throwsError(function () { Object.keys('foo'); });\n  if (!objectKeysAcceptsPrimitives) {\n    var originalObjectKeys = Object.keys;\n    overrideNative(Object, 'keys', function keys(value) {\n      return originalObjectKeys(ES.ToObject(value));\n    });\n  }\n\n  if (Object.getOwnPropertyNames) {\n    var objectGOPNAcceptsPrimitives = !throwsError(function () { Object.getOwnPropertyNames('foo'); });\n    if (!objectGOPNAcceptsPrimitives) {\n      var cachedWindowNames = typeof window === 'object' ? Object.getOwnPropertyNames(window) : [];\n      var originalObjectGetOwnPropertyNames = Object.getOwnPropertyNames;\n      overrideNative(Object, 'getOwnPropertyNames', function getOwnPropertyNames(value) {\n        var val = ES.ToObject(value);\n        if (_toString(val) === '[object Window]') {\n          try {\n            return originalObjectGetOwnPropertyNames(val);\n          } catch (e) {\n            // IE bug where layout engine calls userland gOPN for cross-domain `window` objects\n            return _concat([], cachedWindowNames);\n          }\n        }\n        return originalObjectGetOwnPropertyNames(val);\n      });\n    }\n  }\n  if (Object.getOwnPropertyDescriptor) {\n    var objectGOPDAcceptsPrimitives = !throwsError(function () { Object.getOwnPropertyDescriptor('foo', 'bar'); });\n    if (!objectGOPDAcceptsPrimitives) {\n      var originalObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n      overrideNative(Object, 'getOwnPropertyDescriptor', function getOwnPropertyDescriptor(value, property) {\n        return originalObjectGetOwnPropertyDescriptor(ES.ToObject(value), property);\n      });\n    }\n  }\n  if (Object.seal) {\n    var objectSealAcceptsPrimitives = !throwsError(function () { Object.seal('foo'); });\n    if (!objectSealAcceptsPrimitives) {\n      var originalObjectSeal = Object.seal;\n      overrideNative(Object, 'seal', function seal(value) {\n        if (!Type.object(value)) { return value; }\n        return originalObjectSeal(value);\n      });\n    }\n  }\n  if (Object.isSealed) {\n    var objectIsSealedAcceptsPrimitives = !throwsError(function () { Object.isSealed('foo'); });\n    if (!objectIsSealedAcceptsPrimitives) {\n      var originalObjectIsSealed = Object.isSealed;\n      overrideNative(Object, 'isSealed', function isSealed(value) {\n        if (!Type.object(value)) { return true; }\n        return originalObjectIsSealed(value);\n      });\n    }\n  }\n  if (Object.freeze) {\n    var objectFreezeAcceptsPrimitives = !throwsError(function () { Object.freeze('foo'); });\n    if (!objectFreezeAcceptsPrimitives) {\n      var originalObjectFreeze = Object.freeze;\n      overrideNative(Object, 'freeze', function freeze(value) {\n        if (!Type.object(value)) { return value; }\n        return originalObjectFreeze(value);\n      });\n    }\n  }\n  if (Object.isFrozen) {\n    var objectIsFrozenAcceptsPrimitives = !throwsError(function () { Object.isFrozen('foo'); });\n    if (!objectIsFrozenAcceptsPrimitives) {\n      var originalObjectIsFrozen = Object.isFrozen;\n      overrideNative(Object, 'isFrozen', function isFrozen(value) {\n        if (!Type.object(value)) { return true; }\n        return originalObjectIsFrozen(value);\n      });\n    }\n  }\n  if (Object.preventExtensions) {\n    var objectPreventExtensionsAcceptsPrimitives = !throwsError(function () { Object.preventExtensions('foo'); });\n    if (!objectPreventExtensionsAcceptsPrimitives) {\n      var originalObjectPreventExtensions = Object.preventExtensions;\n      overrideNative(Object, 'preventExtensions', function preventExtensions(value) {\n        if (!Type.object(value)) { return value; }\n        return originalObjectPreventExtensions(value);\n      });\n    }\n  }\n  if (Object.isExtensible) {\n    var objectIsExtensibleAcceptsPrimitives = !throwsError(function () { Object.isExtensible('foo'); });\n    if (!objectIsExtensibleAcceptsPrimitives) {\n      var originalObjectIsExtensible = Object.isExtensible;\n      overrideNative(Object, 'isExtensible', function isExtensible(value) {\n        if (!Type.object(value)) { return false; }\n        return originalObjectIsExtensible(value);\n      });\n    }\n  }\n  if (Object.getPrototypeOf) {\n    var objectGetProtoAcceptsPrimitives = !throwsError(function () { Object.getPrototypeOf('foo'); });\n    if (!objectGetProtoAcceptsPrimitives) {\n      var originalGetProto = Object.getPrototypeOf;\n      overrideNative(Object, 'getPrototypeOf', function getPrototypeOf(value) {\n        return originalGetProto(ES.ToObject(value));\n      });\n    }\n  }\n\n  if (!RegExp.prototype.flags && supportsDescriptors) {\n    var regExpFlagsGetter = function flags() {\n      if (!ES.TypeIsObject(this)) {\n        throw new TypeError('Method called on incompatible type: must be an object.');\n      }\n      var result = '';\n      if (this.global) {\n        result += 'g';\n      }\n      if (this.ignoreCase) {\n        result += 'i';\n      }\n      if (this.multiline) {\n        result += 'm';\n      }\n      if (this.unicode) {\n        result += 'u';\n      }\n      if (this.sticky) {\n        result += 'y';\n      }\n      return result;\n    };\n\n    Value.getter(RegExp.prototype, 'flags', regExpFlagsGetter);\n  }\n\n  var regExpSupportsFlagsWithRegex = valueOrFalseIfThrows(function () {\n    return String(new RegExp(/a/g, 'i')) === '/a/i';\n  });\n\n  if (!regExpSupportsFlagsWithRegex && supportsDescriptors) {\n    var OrigRegExp = RegExp;\n    var RegExpShim = function RegExp(pattern, flags) {\n      var calledWithNew = this instanceof RegExp;\n      if (!calledWithNew && (Type.regex(pattern) || (pattern && pattern.constructor === RegExp))) {\n        return pattern;\n      }\n      if (Type.regex(pattern) && Type.string(flags)) {\n        return new RegExp(pattern.source, flags);\n      }\n      return new OrigRegExp(pattern, flags);\n    };\n    Value.preserveToString(RegExpShim, OrigRegExp);\n    if (Object.setPrototypeOf) {\n      // sets up proper prototype chain where possible\n      Object.setPrototypeOf(OrigRegExp, RegExpShim);\n    }\n    _forEach(Object.getOwnPropertyNames(OrigRegExp), function (key) {\n      if (key === '$input') { return; } // Chrome < v39 & Opera < 26 have a nonstandard \"$input\" property\n      if (key in noop) { return; }\n      Value.proxy(OrigRegExp, key, RegExpShim);\n    });\n    RegExpShim.prototype = OrigRegExp.prototype;\n    Value.redefine(OrigRegExp.prototype, 'constructor', RegExpShim);\n    /*globals RegExp: true */\n    RegExp = RegExpShim;\n    Value.redefine(globals, 'RegExp', RegExpShim);\n    /*globals RegExp: false */\n  }\n\n  if (supportsDescriptors) {\n    var regexGlobals = {\n      input: '$_',\n      lastMatch: '$&',\n      lastParen: '$+',\n      leftContext: '$`',\n      rightContext: '$\\''\n    };\n    _forEach(Object.keys(regexGlobals), function (prop) {\n      if (prop in RegExp && !(regexGlobals[prop] in RegExp)) {\n        Value.getter(RegExp, regexGlobals[prop], function get() {\n          return RegExp[prop];\n        });\n      }\n    });\n  }\n  addDefaultSpecies(RegExp);\n\n  var inverseEpsilon = 1 / Number.EPSILON;\n  var roundTiesToEven = function roundTiesToEven(n) {\n    // Even though this reduces down to `return n`, it takes advantage of built-in rounding.\n    return (n + inverseEpsilon) - inverseEpsilon;\n  };\n  var BINARY_32_EPSILON = Math.pow(2, -23);\n  var BINARY_32_MAX_VALUE = Math.pow(2, 127) * (2 - BINARY_32_EPSILON);\n  var BINARY_32_MIN_VALUE = Math.pow(2, -126);\n  var numberCLZ = Number.prototype.clz;\n  delete Number.prototype.clz; // Safari 8 has Number#clz\n\n  var MathShims = {\n    acosh: function acosh(value) {\n      var x = Number(value);\n      if (Number.isNaN(x) || value < 1) { return NaN; }\n      if (x === 1) { return 0; }\n      if (x === Infinity) { return x; }\n      return _log(x / Math.E + _sqrt(x + 1) * _sqrt(x - 1) / Math.E) + 1;\n    },\n\n    asinh: function asinh(value) {\n      var x = Number(value);\n      if (x === 0 || !globalIsFinite(x)) {\n        return x;\n      }\n      return x < 0 ? -Math.asinh(-x) : _log(x + _sqrt(x * x + 1));\n    },\n\n    atanh: function atanh(value) {\n      var x = Number(value);\n      if (Number.isNaN(x) || x < -1 || x > 1) {\n        return NaN;\n      }\n      if (x === -1) { return -Infinity; }\n      if (x === 1) { return Infinity; }\n      if (x === 0) { return x; }\n      return 0.5 * _log((1 + x) / (1 - x));\n    },\n\n    cbrt: function cbrt(value) {\n      var x = Number(value);\n      if (x === 0) { return x; }\n      var negate = x < 0, result;\n      if (negate) { x = -x; }\n      if (x === Infinity) {\n        result = Infinity;\n      } else {\n        result = Math.exp(_log(x) / 3);\n        // from http://en.wikipedia.org/wiki/Cube_root#Numerical_methods\n        result = (x / (result * result) + (2 * result)) / 3;\n      }\n      return negate ? -result : result;\n    },\n\n    clz32: function clz32(value) {\n      // See https://bugs.ecmascript.org/show_bug.cgi?id=2465\n      var x = Number(value);\n      var number = ES.ToUint32(x);\n      if (number === 0) {\n        return 32;\n      }\n      return numberCLZ ? _call(numberCLZ, number) : 31 - _floor(_log(number + 0.5) * Math.LOG2E);\n    },\n\n    cosh: function cosh(value) {\n      var x = Number(value);\n      if (x === 0) { return 1; } // +0 or -0\n      if (Number.isNaN(x)) { return NaN; }\n      if (!globalIsFinite(x)) { return Infinity; }\n      if (x < 0) { x = -x; }\n      if (x > 21) { return Math.exp(x) / 2; }\n      return (Math.exp(x) + Math.exp(-x)) / 2;\n    },\n\n    expm1: function expm1(value) {\n      var x = Number(value);\n      if (x === -Infinity) { return -1; }\n      if (!globalIsFinite(x) || x === 0) { return x; }\n      if (_abs(x) > 0.5) {\n        return Math.exp(x) - 1;\n      }\n      // A more precise approximation using Taylor series expansion\n      // from https://github.com/paulmillr/es6-shim/issues/314#issuecomment-70293986\n      var t = x;\n      var sum = 0;\n      var n = 1;\n      while (sum + t !== sum) {\n        sum += t;\n        n += 1;\n        t *= x / n;\n      }\n      return sum;\n    },\n\n    hypot: function hypot(x, y) {\n      var result = 0;\n      var largest = 0;\n      for (var i = 0; i < arguments.length; ++i) {\n        var value = _abs(Number(arguments[i]));\n        if (largest < value) {\n          result *= (largest / value) * (largest / value);\n          result += 1;\n          largest = value;\n        } else {\n          result += (value > 0 ? (value / largest) * (value / largest) : value);\n        }\n      }\n      return largest === Infinity ? Infinity : largest * _sqrt(result);\n    },\n\n    log2: function log2(value) {\n      return _log(value) * Math.LOG2E;\n    },\n\n    log10: function log10(value) {\n      return _log(value) * Math.LOG10E;\n    },\n\n    log1p: function log1p(value) {\n      var x = Number(value);\n      if (x < -1 || Number.isNaN(x)) { return NaN; }\n      if (x === 0 || x === Infinity) { return x; }\n      if (x === -1) { return -Infinity; }\n\n      return (1 + x) - 1 === 0 ? x : x * (_log(1 + x) / ((1 + x) - 1));\n    },\n\n    sign: function sign(value) {\n      var number = Number(value);\n      if (number === 0) { return number; }\n      if (Number.isNaN(number)) { return number; }\n      return number < 0 ? -1 : 1;\n    },\n\n    sinh: function sinh(value) {\n      var x = Number(value);\n      if (!globalIsFinite(x) || x === 0) { return x; }\n\n      if (_abs(x) < 1) {\n        return (Math.expm1(x) - Math.expm1(-x)) / 2;\n      }\n      return (Math.exp(x - 1) - Math.exp(-x - 1)) * Math.E / 2;\n    },\n\n    tanh: function tanh(value) {\n      var x = Number(value);\n      if (Number.isNaN(x) || x === 0) { return x; }\n      if (x === Infinity) { return 1; }\n      if (x === -Infinity) { return -1; }\n      var a = Math.expm1(x);\n      var b = Math.expm1(-x);\n      if (a === Infinity) { return 1; }\n      if (b === Infinity) { return -1; }\n      return (a - b) / (Math.exp(x) + Math.exp(-x));\n    },\n\n    trunc: function trunc(value) {\n      var x = Number(value);\n      return x < 0 ? -_floor(-x) : _floor(x);\n    },\n\n    imul: function imul(x, y) {\n      // taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul\n      var a = ES.ToUint32(x);\n      var b = ES.ToUint32(y);\n      var ah = (a >>> 16) & 0xffff;\n      var al = a & 0xffff;\n      var bh = (b >>> 16) & 0xffff;\n      var bl = b & 0xffff;\n      // the shift by 0 fixes the sign on the high part\n      // the final |0 converts the unsigned value into a signed value\n      return ((al * bl) + (((ah * bl + al * bh) << 16) >>> 0) | 0);\n    },\n\n    fround: function fround(x) {\n      var v = Number(x);\n      if (v === 0 || v === Infinity || v === -Infinity || numberIsNaN(v)) {\n        return v;\n      }\n      var sign = Math.sign(v);\n      var abs = _abs(v);\n      if (abs < BINARY_32_MIN_VALUE) {\n        return sign * roundTiesToEven(abs / BINARY_32_MIN_VALUE / BINARY_32_EPSILON) * BINARY_32_MIN_VALUE * BINARY_32_EPSILON;\n      }\n      // Veltkamp's splitting (?)\n      var a = (1 + BINARY_32_EPSILON / Number.EPSILON) * abs;\n      var result = a - (a - abs);\n      if (result > BINARY_32_MAX_VALUE || numberIsNaN(result)) {\n        return sign * Infinity;\n      }\n      return sign * result;\n    }\n  };\n  defineProperties(Math, MathShims);\n  // IE 11 TP has an imprecise log1p: reports Math.log1p(-1e-17) as 0\n  defineProperty(Math, 'log1p', MathShims.log1p, Math.log1p(-1e-17) !== -1e-17);\n  // IE 11 TP has an imprecise asinh: reports Math.asinh(-1e7) as not exactly equal to -Math.asinh(1e7)\n  defineProperty(Math, 'asinh', MathShims.asinh, Math.asinh(-1e7) !== -Math.asinh(1e7));\n  // Chrome 40 has an imprecise Math.tanh with very small numbers\n  defineProperty(Math, 'tanh', MathShims.tanh, Math.tanh(-2e-17) !== -2e-17);\n  // Chrome 40 loses Math.acosh precision with high numbers\n  defineProperty(Math, 'acosh', MathShims.acosh, Math.acosh(Number.MAX_VALUE) === Infinity);\n  // Firefox 38 on Windows\n  defineProperty(Math, 'cbrt', MathShims.cbrt, Math.abs(1 - Math.cbrt(1e-300) / 1e-100) / Number.EPSILON > 8);\n  // node 0.11 has an imprecise Math.sinh with very small numbers\n  defineProperty(Math, 'sinh', MathShims.sinh, Math.sinh(-2e-17) !== -2e-17);\n  // FF 35 on Linux reports 22025.465794806725 for Math.expm1(10)\n  var expm1OfTen = Math.expm1(10);\n  defineProperty(Math, 'expm1', MathShims.expm1, expm1OfTen > 22025.465794806719 || expm1OfTen < 22025.4657948067165168);\n\n  var origMathRound = Math.round;\n  // breaks in e.g. Safari 8, Internet Explorer 11, Opera 12\n  var roundHandlesBoundaryConditions = Math.round(0.5 - Number.EPSILON / 4) === 0 && Math.round(-0.5 + Number.EPSILON / 3.99) === 1;\n\n  // When engines use Math.floor(x + 0.5) internally, Math.round can be buggy for large integers.\n  // This behavior should be governed by \"round to nearest, ties to even mode\"\n  // see https://people.mozilla.org/~jorendorff/es6-draft.html#sec-ecmascript-language-types-number-type\n  // These are the boundary cases where it breaks.\n  var smallestPositiveNumberWhereRoundBreaks = inverseEpsilon + 1;\n  var largestPositiveNumberWhereRoundBreaks = 2 * inverseEpsilon - 1;\n  var roundDoesNotIncreaseIntegers = [smallestPositiveNumberWhereRoundBreaks, largestPositiveNumberWhereRoundBreaks].every(function (num) {\n    return Math.round(num) === num;\n  });\n  defineProperty(Math, 'round', function round(x) {\n    var floor = _floor(x);\n    var ceil = floor === -1 ? -0 : floor + 1;\n    return x - floor < 0.5 ? floor : ceil;\n  }, !roundHandlesBoundaryConditions || !roundDoesNotIncreaseIntegers);\n  Value.preserveToString(Math.round, origMathRound);\n\n  var origImul = Math.imul;\n  if (Math.imul(0xffffffff, 5) !== -5) {\n    // Safari 6.1, at least, reports \"0\" for this value\n    Math.imul = MathShims.imul;\n    Value.preserveToString(Math.imul, origImul);\n  }\n  if (Math.imul.length !== 2) {\n    // Safari 8.0.4 has a length of 1\n    // fixed in https://bugs.webkit.org/show_bug.cgi?id=143658\n    overrideNative(Math, 'imul', function imul(x, y) {\n      return _apply(origImul, Math, arguments);\n    });\n  }\n\n  // Promises\n  // Simplest possible implementation; use a 3rd-party library if you\n  // want the best possible speed and/or long stack traces.\n  var PromiseShim = (function () {\n\n    ES.IsPromise = function (promise) {\n      if (!ES.TypeIsObject(promise)) {\n        return false;\n      }\n      if (typeof promise._promise === 'undefined') {\n        return false; // uninitialized, or missing our hidden field.\n      }\n      return true;\n    };\n\n    // \"PromiseCapability\" in the spec is what most promise implementations\n    // call a \"deferred\".\n    var PromiseCapability = function (C) {\n      if (!ES.IsConstructor(C)) {\n        throw new TypeError('Bad promise constructor');\n      }\n      var capability = this;\n      var resolver = function (resolve, reject) {\n        if (capability.resolve !== void 0 || capability.reject !== void 0) {\n          throw new TypeError('Bad Promise implementation!');\n        }\n        capability.resolve = resolve;\n        capability.reject = reject;\n      };\n      capability.promise = new C(resolver);\n      if (!(ES.IsCallable(capability.resolve) && ES.IsCallable(capability.reject))) {\n        throw new TypeError('Bad promise constructor');\n      }\n    };\n\n    // find an appropriate setImmediate-alike\n    var setTimeout = globals.setTimeout;\n    var makeZeroTimeout;\n    /*global window */\n    if (typeof window !== 'undefined' && ES.IsCallable(window.postMessage)) {\n      makeZeroTimeout = function () {\n        // from http://dbaron.org/log/20100309-faster-timeouts\n        var timeouts = [];\n        var messageName = 'zero-timeout-message';\n        var setZeroTimeout = function (fn) {\n          _push(timeouts, fn);\n          window.postMessage(messageName, '*');\n        };\n        var handleMessage = function (event) {\n          if (event.source === window && event.data === messageName) {\n            event.stopPropagation();\n            if (timeouts.length === 0) { return; }\n            var fn = _shift(timeouts);\n            fn();\n          }\n        };\n        window.addEventListener('message', handleMessage, true);\n        return setZeroTimeout;\n      };\n    }\n    var makePromiseAsap = function () {\n      // An efficient task-scheduler based on a pre-existing Promise\n      // implementation, which we can use even if we override the\n      // global Promise below (in order to workaround bugs)\n      // https://github.com/Raynos/observ-hash/issues/2#issuecomment-35857671\n      var P = globals.Promise;\n      return P && P.resolve && function (task) {\n        return P.resolve().then(task);\n      };\n    };\n    /*global process */\n    var enqueue = ES.IsCallable(globals.setImmediate) ?\n      globals.setImmediate.bind(globals) :\n      typeof process === 'object' && process.nextTick ? process.nextTick :\n      makePromiseAsap() ||\n      (ES.IsCallable(makeZeroTimeout) ? makeZeroTimeout() :\n      function (task) { setTimeout(task, 0); }); // fallback\n\n    // Constants for Promise implementation\n    var PROMISE_IDENTITY = 1;\n    var PROMISE_THROWER = 2;\n    var PROMISE_PENDING = 3;\n    var PROMISE_FULFILLED = 4;\n    var PROMISE_REJECTED = 5;\n\n    var promiseReactionJob = function (reaction, argument) {\n      var promiseCapability = reaction.capabilities;\n      var handler = reaction.handler;\n      var handlerResult, handlerException = false, f;\n      if (handler === PROMISE_IDENTITY) {\n        handlerResult = argument;\n      } else if (handler === PROMISE_THROWER) {\n        handlerResult = argument;\n        handlerException = true;\n      } else {\n        try {\n          handlerResult = handler(argument);\n        } catch (e) {\n          handlerResult = e;\n          handlerException = true;\n        }\n      }\n      f = handlerException ? promiseCapability.reject : promiseCapability.resolve;\n      f(handlerResult);\n    };\n\n    var triggerPromiseReactions = function (reactions, argument) {\n      _forEach(reactions, function (reaction) {\n        enqueue(function () {\n          promiseReactionJob(reaction, argument);\n        });\n      });\n    };\n\n    var fulfillPromise = function (promise, value) {\n      var _promise = promise._promise;\n      var reactions = _promise.fulfillReactions;\n      _promise.result = value;\n      _promise.fulfillReactions = void 0;\n      _promise.rejectReactions = void 0;\n      _promise.state = PROMISE_FULFILLED;\n      triggerPromiseReactions(reactions, value);\n    };\n\n    var rejectPromise = function (promise, reason) {\n      var _promise = promise._promise;\n      var reactions = _promise.rejectReactions;\n      _promise.result = reason;\n      _promise.fulfillReactions = void 0;\n      _promise.rejectReactions = void 0;\n      _promise.state = PROMISE_REJECTED;\n      triggerPromiseReactions(reactions, reason);\n    };\n\n    var createResolvingFunctions = function (promise) {\n      var alreadyResolved = false;\n      var resolve = function (resolution) {\n        var then;\n        if (alreadyResolved) { return; }\n        alreadyResolved = true;\n        if (resolution === promise) {\n          return rejectPromise(promise, new TypeError('Self resolution'));\n        }\n        if (!ES.TypeIsObject(resolution)) {\n          return fulfillPromise(promise, resolution);\n        }\n        try {\n          then = resolution.then;\n        } catch (e) {\n          return rejectPromise(promise, e);\n        }\n        if (!ES.IsCallable(then)) {\n          return fulfillPromise(promise, resolution);\n        }\n        enqueue(function () {\n          promiseResolveThenableJob(promise, resolution, then);\n        });\n      };\n      var reject = function (reason) {\n        if (alreadyResolved) { return; }\n        alreadyResolved = true;\n        return rejectPromise(promise, reason);\n      };\n      return { resolve: resolve, reject: reject };\n    };\n\n    var promiseResolveThenableJob = function (promise, thenable, then) {\n      var resolvingFunctions = createResolvingFunctions(promise);\n      var resolve = resolvingFunctions.resolve;\n      var reject = resolvingFunctions.reject;\n      try {\n        _call(then, thenable, resolve, reject);\n      } catch (e) {\n        reject(e);\n      }\n    };\n\n    // This is a common step in many Promise methods\n    var getPromiseSpecies = function (C) {\n      if (!ES.TypeIsObject(C)) {\n        throw new TypeError('Promise is not object');\n      }\n      var S = C[symbolSpecies];\n      if (S !== void 0 && S !== null) {\n        return S;\n      }\n      return C;\n    };\n\n    var Promise = function Promise(resolver) {\n      if (!(this instanceof Promise)) {\n        throw new TypeError('Constructor Promise requires \"new\"');\n      }\n      if (this && this._promise) {\n        throw new TypeError('Bad construction');\n      }\n      // see https://bugs.ecmascript.org/show_bug.cgi?id=2482\n      if (!ES.IsCallable(resolver)) {\n        throw new TypeError('not a valid resolver');\n      }\n      var promise = emulateES6construct(this, Promise, Promise$prototype, {\n        _promise: {\n          result: void 0,\n          state: PROMISE_PENDING,\n          fulfillReactions: [],\n          rejectReactions: []\n        }\n      });\n      var resolvingFunctions = createResolvingFunctions(promise);\n      var reject = resolvingFunctions.reject;\n      try {\n        resolver(resolvingFunctions.resolve, reject);\n      } catch (e) {\n        reject(e);\n      }\n      return promise;\n    };\n    var Promise$prototype = Promise.prototype;\n\n    var _promiseAllResolver = function (index, values, capability, remaining) {\n      var alreadyCalled = false;\n      return function (x) {\n        if (alreadyCalled) { return; }\n        alreadyCalled = true;\n        values[index] = x;\n        if ((--remaining.count) === 0) {\n          var resolve = capability.resolve;\n          resolve(values); // call w/ this===undefined\n        }\n      };\n    };\n\n    var performPromiseAll = function (iteratorRecord, C, resultCapability) {\n      var it = iteratorRecord.iterator;\n      var values = [], remaining = { count: 1 }, next, nextValue;\n      for (var index = 0; ; index++) {\n        try {\n          next = ES.IteratorStep(it);\n          if (next === false) {\n            iteratorRecord.done = true;\n            break;\n          }\n          nextValue = next.value;\n        } catch (e) {\n          iteratorRecord.done = true;\n          throw e;\n        }\n        values[index] = void 0;\n        var nextPromise = C.resolve(nextValue);\n        var resolveElement = _promiseAllResolver(\n          index, values, resultCapability, remaining\n        );\n        remaining.count++;\n        nextPromise.then(resolveElement, resultCapability.reject);\n      }\n      if ((--remaining.count) === 0) {\n        var resolve = resultCapability.resolve;\n        resolve(values); // call w/ this===undefined\n      }\n      return resultCapability.promise;\n    };\n\n    var performPromiseRace = function (iteratorRecord, C, resultCapability) {\n      var it = iteratorRecord.iterator, next, nextValue, nextPromise;\n      while (true) {\n        try {\n          next = ES.IteratorStep(it);\n          if (next === false) {\n            // NOTE: If iterable has no items, resulting promise will never\n            // resolve; see:\n            // https://github.com/domenic/promises-unwrapping/issues/75\n            // https://bugs.ecmascript.org/show_bug.cgi?id=2515\n            iteratorRecord.done = true;\n            break;\n          }\n          nextValue = next.value;\n        } catch (e) {\n          iteratorRecord.done = true;\n          throw e;\n        }\n        nextPromise = C.resolve(nextValue);\n        nextPromise.then(resultCapability.resolve, resultCapability.reject);\n      }\n      return resultCapability.promise;\n    };\n\n    defineProperties(Promise, {\n      all: function all(iterable) {\n        var C = getPromiseSpecies(this);\n        var capability = new PromiseCapability(C);\n        var iterator, iteratorRecord;\n        try {\n          iterator = ES.GetIterator(iterable);\n          iteratorRecord = { iterator: iterator, done: false };\n          return performPromiseAll(iteratorRecord, C, capability);\n        } catch (e) {\n          if (iteratorRecord && !iteratorRecord.done) {\n            try {\n              ES.IteratorClose(iterator, true);\n            } catch (ee) {\n              e = ee;\n            }\n          }\n          var reject = capability.reject;\n          reject(e);\n          return capability.promise;\n        }\n      },\n\n      race: function race(iterable) {\n        var C = getPromiseSpecies(this);\n        var capability = new PromiseCapability(C);\n        var iterator, iteratorRecord;\n        try {\n          iterator = ES.GetIterator(iterable);\n          iteratorRecord = { iterator: iterator, done: false };\n          return performPromiseRace(iteratorRecord, C, capability);\n        } catch (e) {\n          if (iteratorRecord && !iteratorRecord.done) {\n            try {\n              ES.IteratorClose(iterator, true);\n            } catch (ee) {\n              e = ee;\n            }\n          }\n          var reject = capability.reject;\n          reject(e);\n          return capability.promise;\n        }\n      },\n\n      reject: function reject(reason) {\n        var C = this;\n        var capability = new PromiseCapability(C);\n        var rejectFunc = capability.reject;\n        rejectFunc(reason); // call with this===undefined\n        return capability.promise;\n      },\n\n      resolve: function resolve(v) {\n        // See https://esdiscuss.org/topic/fixing-promise-resolve for spec\n        var C = this;\n        if (ES.IsPromise(v)) {\n          var constructor = v.constructor;\n          if (constructor === C) { return v; }\n        }\n        var capability = new PromiseCapability(C);\n        var resolveFunc = capability.resolve;\n        resolveFunc(v); // call with this===undefined\n        return capability.promise;\n      }\n    });\n\n    defineProperties(Promise$prototype, {\n      'catch': function (onRejected) {\n        return this.then(void 0, onRejected);\n      },\n\n      then: function then(onFulfilled, onRejected) {\n        var promise = this;\n        if (!ES.IsPromise(promise)) { throw new TypeError('not a promise'); }\n        var C = ES.SpeciesConstructor(promise, Promise);\n        var resultCapability = new PromiseCapability(C);\n        // PerformPromiseThen(promise, onFulfilled, onRejected, resultCapability)\n        if (!ES.IsCallable(onFulfilled)) {\n          onFulfilled = PROMISE_IDENTITY;\n        }\n        if (!ES.IsCallable(onRejected)) {\n          onRejected = PROMISE_THROWER;\n        }\n        var fulfillReaction = { capabilities: resultCapability, handler: onFulfilled };\n        var rejectReaction = { capabilities: resultCapability, handler: onRejected };\n        var _promise = promise._promise, value;\n        switch (_promise.state) {\n          case PROMISE_PENDING:\n            _push(_promise.fulfillReactions, fulfillReaction);\n            _push(_promise.rejectReactions, rejectReaction);\n            break;\n          case PROMISE_FULFILLED:\n            value = _promise.result;\n            enqueue(function () {\n              promiseReactionJob(fulfillReaction, value);\n            });\n            break;\n          case PROMISE_REJECTED:\n            value = _promise.result;\n            enqueue(function () {\n              promiseReactionJob(rejectReaction, value);\n            });\n            break;\n          default:\n            throw new TypeError('unexpected');\n        }\n        return resultCapability.promise;\n      }\n    });\n\n    return Promise;\n  }());\n\n  // Chrome's native Promise has extra methods that it shouldn't have. Let's remove them.\n  if (globals.Promise) {\n    delete globals.Promise.accept;\n    delete globals.Promise.defer;\n    delete globals.Promise.prototype.chain;\n  }\n\n  // export the Promise constructor.\n  defineProperties(globals, { Promise: PromiseShim });\n  // In Chrome 33 (and thereabouts) Promise is defined, but the\n  // implementation is buggy in a number of ways.  Let's check subclassing\n  // support to see if we have a buggy implementation.\n  var promiseSupportsSubclassing = supportsSubclassing(globals.Promise, function (S) {\n    return S.resolve(42).then(function () {}) instanceof S;\n  });\n  var promiseIgnoresNonFunctionThenCallbacks = !throwsError(function () { globals.Promise.reject(42).then(null, 5).then(null, noop); });\n  var promiseRequiresObjectContext = throwsError(function () { globals.Promise.call(3, noop); });\n  // Promise.resolve() was errata'ed late in the ES6 process.\n  // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1170742\n  //      https://code.google.com/p/v8/issues/detail?id=4161\n  // It serves as a proxy for a number of other bugs in early Promise\n  // implementations.\n  var promiseResolveBroken = (function (Promise) {\n    var p = Promise.resolve(5);\n    p.constructor = {};\n    var p2 = Promise.resolve(p);\n    return (p === p2); // This *should* be false!\n  }(globals.Promise));\n  if (!promiseSupportsSubclassing || !promiseIgnoresNonFunctionThenCallbacks ||\n      !promiseRequiresObjectContext || promiseResolveBroken) {\n    /*globals Promise: true */\n    Promise = PromiseShim;\n    /*globals Promise: false */\n    overrideNative(globals, 'Promise', PromiseShim);\n  }\n  addDefaultSpecies(Promise);\n\n  // Map and Set require a true ES5 environment\n  // Their fast path also requires that the environment preserve\n  // property insertion order, which is not guaranteed by the spec.\n  var testOrder = function (a) {\n    var b = Object.keys(_reduce(a, function (o, k) {\n      o[k] = true;\n      return o;\n    }, {}));\n    return a.join(':') === b.join(':');\n  };\n  var preservesInsertionOrder = testOrder(['z', 'a', 'bb']);\n  // some engines (eg, Chrome) only preserve insertion order for string keys\n  var preservesNumericInsertionOrder = testOrder(['z', 1, 'a', '3', 2]);\n\n  if (supportsDescriptors) {\n\n    var fastkey = function fastkey(key) {\n      if (!preservesInsertionOrder) {\n        return null;\n      }\n      var type = typeof key;\n      if (type === 'undefined' || key === null) {\n        return '^' + String(key);\n      } else if (type === 'string') {\n        return '$' + key;\n      } else if (type === 'number') {\n        // note that -0 will get coerced to \"0\" when used as a property key\n        if (!preservesNumericInsertionOrder) {\n          return 'n' + key;\n        }\n        return key;\n      } else if (type === 'boolean') {\n        return 'b' + key;\n      }\n      return null;\n    };\n\n    var emptyObject = function emptyObject() {\n      // accomodate some older not-quite-ES5 browsers\n      return Object.create ? Object.create(null) : {};\n    };\n\n    var addIterableToMap = function addIterableToMap(MapConstructor, map, iterable) {\n      if (Array.isArray(iterable) || Type.string(iterable)) {\n        _forEach(iterable, function (entry) {\n          map.set(entry[0], entry[1]);\n        });\n      } else if (iterable instanceof MapConstructor) {\n        _call(MapConstructor.prototype.forEach, iterable, function (value, key) {\n          map.set(key, value);\n        });\n      } else {\n        var iter, adder;\n        if (iterable !== null && typeof iterable !== 'undefined') {\n          adder = map.set;\n          if (!ES.IsCallable(adder)) { throw new TypeError('bad map'); }\n          iter = ES.GetIterator(iterable);\n        }\n        if (typeof iter !== 'undefined') {\n          while (true) {\n            var next = ES.IteratorStep(iter);\n            if (next === false) { break; }\n            var nextItem = next.value;\n            try {\n              if (!ES.TypeIsObject(nextItem)) {\n                throw new TypeError('expected iterable of pairs');\n              }\n              _call(adder, map, nextItem[0], nextItem[1]);\n            } catch (e) {\n              ES.IteratorClose(iter, true);\n              throw e;\n            }\n          }\n        }\n      }\n    };\n    var addIterableToSet = function addIterableToSet(SetConstructor, set, iterable) {\n      if (Array.isArray(iterable) || Type.string(iterable)) {\n        _forEach(iterable, function (value) {\n          set.add(value);\n        });\n      } else if (iterable instanceof SetConstructor) {\n        _call(SetConstructor.prototype.forEach, iterable, function (value) {\n          set.add(value);\n        });\n      } else {\n        var iter, adder;\n        if (iterable !== null && typeof iterable !== 'undefined') {\n          adder = set.add;\n          if (!ES.IsCallable(adder)) { throw new TypeError('bad set'); }\n          iter = ES.GetIterator(iterable);\n        }\n        if (typeof iter !== 'undefined') {\n          while (true) {\n            var next = ES.IteratorStep(iter);\n            if (next === false) { break; }\n            var nextValue = next.value;\n            try {\n              _call(adder, set, nextValue);\n            } catch (e) {\n              ES.IteratorClose(iter, true);\n              throw e;\n            }\n          }\n        }\n      }\n    };\n\n    var collectionShims = {\n      Map: (function () {\n\n        var empty = {};\n\n        var MapEntry = function MapEntry(key, value) {\n          this.key = key;\n          this.value = value;\n          this.next = null;\n          this.prev = null;\n        };\n\n        MapEntry.prototype.isRemoved = function isRemoved() {\n          return this.key === empty;\n        };\n\n        var isMap = function isMap(map) {\n          return !!map._es6map;\n        };\n\n        var requireMapSlot = function requireMapSlot(map, method) {\n          if (!ES.TypeIsObject(map) || !isMap(map)) {\n            throw new TypeError('Method Map.prototype.' + method + ' called on incompatible receiver ' + String(map));\n          }\n        };\n\n        var MapIterator = function MapIterator(map, kind) {\n          requireMapSlot(map, '[[MapIterator]]');\n          this.head = map._head;\n          this.i = this.head;\n          this.kind = kind;\n        };\n\n        MapIterator.prototype = {\n          next: function next() {\n            var i = this.i, kind = this.kind, head = this.head, result;\n            if (typeof this.i === 'undefined') {\n              return { value: void 0, done: true };\n            }\n            while (i.isRemoved() && i !== head) {\n              // back up off of removed entries\n              i = i.prev;\n            }\n            // advance to next unreturned element.\n            while (i.next !== head) {\n              i = i.next;\n              if (!i.isRemoved()) {\n                if (kind === 'key') {\n                  result = i.key;\n                } else if (kind === 'value') {\n                  result = i.value;\n                } else {\n                  result = [i.key, i.value];\n                }\n                this.i = i;\n                return { value: result, done: false };\n              }\n            }\n            // once the iterator is done, it is done forever.\n            this.i = void 0;\n            return { value: void 0, done: true };\n          }\n        };\n        addIterator(MapIterator.prototype);\n\n        var MapShim = function Map() {\n          if (!(this instanceof Map)) {\n            throw new TypeError('Constructor Map requires \"new\"');\n          }\n          if (this && this._es6map) {\n            throw new TypeError('Bad construction');\n          }\n          var map = emulateES6construct(this, Map, Map$prototype, {\n            _es6map: true,\n            _head: null,\n            _storage: emptyObject(),\n            _size: 0\n          });\n\n          var head = new MapEntry(null, null);\n          // circular doubly-linked list.\n          head.next = head.prev = head;\n          map._head = head;\n\n          // Optionally initialize map from iterable\n          if (arguments.length > 0) {\n            addIterableToMap(Map, map, arguments[0]);\n          }\n          return map;\n        };\n        var Map$prototype = MapShim.prototype;\n\n        Value.getter(Map$prototype, 'size', function () {\n          if (typeof this._size === 'undefined') {\n            throw new TypeError('size method called on incompatible Map');\n          }\n          return this._size;\n        });\n\n        defineProperties(Map$prototype, {\n          get: function get(key) {\n            requireMapSlot(this, 'get');\n            var fkey = fastkey(key);\n            if (fkey !== null) {\n              // fast O(1) path\n              var entry = this._storage[fkey];\n              if (entry) {\n                return entry.value;\n              } else {\n                return;\n              }\n            }\n            var head = this._head, i = head;\n            while ((i = i.next) !== head) {\n              if (ES.SameValueZero(i.key, key)) {\n                return i.value;\n              }\n            }\n          },\n\n          has: function has(key) {\n            requireMapSlot(this, 'has');\n            var fkey = fastkey(key);\n            if (fkey !== null) {\n              // fast O(1) path\n              return typeof this._storage[fkey] !== 'undefined';\n            }\n            var head = this._head, i = head;\n            while ((i = i.next) !== head) {\n              if (ES.SameValueZero(i.key, key)) {\n                return true;\n              }\n            }\n            return false;\n          },\n\n          set: function set(key, value) {\n            requireMapSlot(this, 'set');\n            var head = this._head, i = head, entry;\n            var fkey = fastkey(key);\n            if (fkey !== null) {\n              // fast O(1) path\n              if (typeof this._storage[fkey] !== 'undefined') {\n                this._storage[fkey].value = value;\n                return this;\n              } else {\n                entry = this._storage[fkey] = new MapEntry(key, value);\n                i = head.prev;\n                // fall through\n              }\n            }\n            while ((i = i.next) !== head) {\n              if (ES.SameValueZero(i.key, key)) {\n                i.value = value;\n                return this;\n              }\n            }\n            entry = entry || new MapEntry(key, value);\n            if (ES.SameValue(-0, key)) {\n              entry.key = +0; // coerce -0 to +0 in entry\n            }\n            entry.next = this._head;\n            entry.prev = this._head.prev;\n            entry.prev.next = entry;\n            entry.next.prev = entry;\n            this._size += 1;\n            return this;\n          },\n\n          'delete': function (key) {\n            requireMapSlot(this, 'delete');\n            var head = this._head, i = head;\n            var fkey = fastkey(key);\n            if (fkey !== null) {\n              // fast O(1) path\n              if (typeof this._storage[fkey] === 'undefined') {\n                return false;\n              }\n              i = this._storage[fkey].prev;\n              delete this._storage[fkey];\n              // fall through\n            }\n            while ((i = i.next) !== head) {\n              if (ES.SameValueZero(i.key, key)) {\n                i.key = i.value = empty;\n                i.prev.next = i.next;\n                i.next.prev = i.prev;\n                this._size -= 1;\n                return true;\n              }\n            }\n            return false;\n          },\n\n          clear: function clear() {\n            requireMapSlot(this, 'clear');\n            this._size = 0;\n            this._storage = emptyObject();\n            var head = this._head, i = head, p = i.next;\n            while ((i = p) !== head) {\n              i.key = i.value = empty;\n              p = i.next;\n              i.next = i.prev = head;\n            }\n            head.next = head.prev = head;\n          },\n\n          keys: function keys() {\n            requireMapSlot(this, 'keys');\n            return new MapIterator(this, 'key');\n          },\n\n          values: function values() {\n            requireMapSlot(this, 'values');\n            return new MapIterator(this, 'value');\n          },\n\n          entries: function entries() {\n            requireMapSlot(this, 'entries');\n            return new MapIterator(this, 'key+value');\n          },\n\n          forEach: function forEach(callback) {\n            requireMapSlot(this, 'forEach');\n            var context = arguments.length > 1 ? arguments[1] : null;\n            var it = this.entries();\n            for (var entry = it.next(); !entry.done; entry = it.next()) {\n              if (context) {\n                _call(callback, context, entry.value[1], entry.value[0], this);\n              } else {\n                callback(entry.value[1], entry.value[0], this);\n              }\n            }\n          }\n        });\n        addIterator(Map$prototype, Map$prototype.entries);\n\n        return MapShim;\n      }()),\n\n      Set: (function () {\n        var isSet = function isSet(set) {\n          return set._es6set && typeof set._storage !== 'undefined';\n        };\n        var requireSetSlot = function requireSetSlot(set, method) {\n          if (!ES.TypeIsObject(set) || !isSet(set)) {\n            // https://github.com/paulmillr/es6-shim/issues/176\n            throw new TypeError('Set.prototype.' + method + ' called on incompatible receiver ' + String(set));\n          }\n        };\n\n        // Creating a Map is expensive.  To speed up the common case of\n        // Sets containing only string or numeric keys, we use an object\n        // as backing storage and lazily create a full Map only when\n        // required.\n        var SetShim = function Set() {\n          if (!(this instanceof Set)) {\n            throw new TypeError('Constructor Set requires \"new\"');\n          }\n          if (this && this._es6set) {\n            throw new TypeError('Bad construction');\n          }\n          var set = emulateES6construct(this, Set, Set$prototype, {\n            _es6set: true,\n            '[[SetData]]': null,\n            _storage: emptyObject()\n          });\n          if (!set._es6set) {\n            throw new TypeError('bad set');\n          }\n\n          // Optionally initialize Set from iterable\n          if (arguments.length > 0) {\n            addIterableToSet(Set, set, arguments[0]);\n          }\n          return set;\n        };\n        var Set$prototype = SetShim.prototype;\n\n        // Switch from the object backing storage to a full Map.\n        var ensureMap = function ensureMap(set) {\n          if (!set['[[SetData]]']) {\n            var m = set['[[SetData]]'] = new collectionShims.Map();\n            _forEach(Object.keys(set._storage), function (k) {\n              if (k === '^null') {\n                k = null;\n              } else if (k === '^undefined') {\n                k = void 0;\n              } else {\n                var first = k.charAt(0);\n                if (first === '$') {\n                  k = _strSlice(k, 1);\n                } else if (first === 'n') {\n                  k = +_strSlice(k, 1);\n                } else if (first === 'b') {\n                  k = k === 'btrue';\n                } else {\n                  k = +k;\n                }\n              }\n              m.set(k, k);\n            });\n            set._storage = null; // free old backing storage\n          }\n        };\n\n        Value.getter(SetShim.prototype, 'size', function () {\n          requireSetSlot(this, 'size');\n          ensureMap(this);\n          return this['[[SetData]]'].size;\n        });\n\n        defineProperties(SetShim.prototype, {\n          has: function has(key) {\n            requireSetSlot(this, 'has');\n            var fkey;\n            if (this._storage && (fkey = fastkey(key)) !== null) {\n              return !!this._storage[fkey];\n            }\n            ensureMap(this);\n            return this['[[SetData]]'].has(key);\n          },\n\n          add: function add(key) {\n            requireSetSlot(this, 'add');\n            var fkey;\n            if (this._storage && (fkey = fastkey(key)) !== null) {\n              this._storage[fkey] = true;\n              return this;\n            }\n            ensureMap(this);\n            this['[[SetData]]'].set(key, key);\n            return this;\n          },\n\n          'delete': function (key) {\n            requireSetSlot(this, 'delete');\n            var fkey;\n            if (this._storage && (fkey = fastkey(key)) !== null) {\n              var hasFKey = _hasOwnProperty(this._storage, fkey);\n              return (delete this._storage[fkey]) && hasFKey;\n            }\n            ensureMap(this);\n            return this['[[SetData]]']['delete'](key);\n          },\n\n          clear: function clear() {\n            requireSetSlot(this, 'clear');\n            if (this._storage) {\n              this._storage = emptyObject();\n            } else {\n              this['[[SetData]]'].clear();\n            }\n          },\n\n          values: function values() {\n            requireSetSlot(this, 'values');\n            ensureMap(this);\n            return this['[[SetData]]'].values();\n          },\n\n          entries: function entries() {\n            requireSetSlot(this, 'entries');\n            ensureMap(this);\n            return this['[[SetData]]'].entries();\n          },\n\n          forEach: function forEach(callback) {\n            requireSetSlot(this, 'forEach');\n            var context = arguments.length > 1 ? arguments[1] : null;\n            var entireSet = this;\n            ensureMap(entireSet);\n            this['[[SetData]]'].forEach(function (value, key) {\n              if (context) {\n                _call(callback, context, key, key, entireSet);\n              } else {\n                callback(key, key, entireSet);\n              }\n            });\n          }\n        });\n        defineProperty(SetShim.prototype, 'keys', SetShim.prototype.values, true);\n        addIterator(SetShim.prototype, SetShim.prototype.values);\n\n        return SetShim;\n      }())\n    };\n\n    if (globals.Map || globals.Set) {\n      // Safari 8, for example, doesn't accept an iterable.\n      var mapAcceptsArguments = valueOrFalseIfThrows(function () { return new Map([[1, 2]]).get(1) === 2; });\n      if (!mapAcceptsArguments) {\n        var OrigMapNoArgs = globals.Map;\n        globals.Map = function Map() {\n          if (!(this instanceof Map)) {\n            throw new TypeError('Constructor Map requires \"new\"');\n          }\n          var m = new OrigMapNoArgs();\n          if (arguments.length > 0) {\n            addIterableToMap(Map, m, arguments[0]);\n          }\n          Object.setPrototypeOf(m, globals.Map.prototype);\n          defineProperty(m, 'constructor', Map, true);\n          return m;\n        };\n        globals.Map.prototype = create(OrigMapNoArgs.prototype);\n        Value.preserveToString(globals.Map, OrigMapNoArgs);\n      }\n      var testMap = new Map();\n      var mapUsesSameValueZero = (function (m) {\n        m['delete'](0);\n        m['delete'](-0);\n        m.set(0, 3);\n        m.get(-0, 4);\n        return m.get(0) === 3 && m.get(-0) === 4;\n      }(testMap));\n      var mapSupportsChaining = testMap.set(1, 2) === testMap;\n      if (!mapUsesSameValueZero || !mapSupportsChaining) {\n        var origMapSet = Map.prototype.set;\n        overrideNative(Map.prototype, 'set', function set(k, v) {\n          _call(origMapSet, this, k === 0 ? 0 : k, v);\n          return this;\n        });\n      }\n      if (!mapUsesSameValueZero) {\n        var origMapGet = Map.prototype.get;\n        var origMapHas = Map.prototype.has;\n        defineProperties(Map.prototype, {\n          get: function get(k) {\n            return _call(origMapGet, this, k === 0 ? 0 : k);\n          },\n          has: function has(k) {\n            return _call(origMapHas, this, k === 0 ? 0 : k);\n          }\n        }, true);\n        Value.preserveToString(Map.prototype.get, origMapGet);\n        Value.preserveToString(Map.prototype.has, origMapHas);\n      }\n      var testSet = new Set();\n      var setUsesSameValueZero = (function (s) {\n        s['delete'](0);\n        s.add(-0);\n        return !s.has(0);\n      }(testSet));\n      var setSupportsChaining = testSet.add(1) === testSet;\n      if (!setUsesSameValueZero || !setSupportsChaining) {\n        var origSetAdd = Set.prototype.add;\n        Set.prototype.add = function add(v) {\n          _call(origSetAdd, this, v === 0 ? 0 : v);\n          return this;\n        };\n        Value.preserveToString(Set.prototype.add, origSetAdd);\n      }\n      if (!setUsesSameValueZero) {\n        var origSetHas = Set.prototype.has;\n        Set.prototype.has = function has(v) {\n          return _call(origSetHas, this, v === 0 ? 0 : v);\n        };\n        Value.preserveToString(Set.prototype.has, origSetHas);\n        var origSetDel = Set.prototype['delete'];\n        Set.prototype['delete'] = function SetDelete(v) {\n          return _call(origSetDel, this, v === 0 ? 0 : v);\n        };\n        Value.preserveToString(Set.prototype['delete'], origSetDel);\n      }\n      var mapSupportsSubclassing = supportsSubclassing(globals.Map, function (M) {\n        var m = new M([]);\n        // Firefox 32 is ok with the instantiating the subclass but will\n        // throw when the map is used.\n        m.set(42, 42);\n        return m instanceof M;\n      });\n      var mapFailsToSupportSubclassing = Object.setPrototypeOf && !mapSupportsSubclassing; // without Object.setPrototypeOf, subclassing is not possible\n      var mapRequiresNew = (function () {\n        try {\n          return !(globals.Map() instanceof globals.Map);\n        } catch (e) {\n          return e instanceof TypeError;\n        }\n      }());\n      if (globals.Map.length !== 0 || mapFailsToSupportSubclassing || !mapRequiresNew) {\n        var OrigMap = globals.Map;\n        globals.Map = function Map() {\n          if (!(this instanceof Map)) {\n            throw new TypeError('Constructor Map requires \"new\"');\n          }\n          var m = new OrigMap();\n          if (arguments.length > 0) {\n            addIterableToMap(Map, m, arguments[0]);\n          }\n          Object.setPrototypeOf(m, Map.prototype);\n          defineProperty(m, 'constructor', Map, true);\n          return m;\n        };\n        globals.Map.prototype = OrigMap.prototype;\n        Value.preserveToString(globals.Map, OrigMap);\n      }\n      var setSupportsSubclassing = supportsSubclassing(globals.Set, function (S) {\n        var s = new S([]);\n        s.add(42, 42);\n        return s instanceof S;\n      });\n      var setFailsToSupportSubclassing = Object.setPrototypeOf && !setSupportsSubclassing; // without Object.setPrototypeOf, subclassing is not possible\n      var setRequiresNew = (function () {\n        try {\n          return !(globals.Set() instanceof globals.Set);\n        } catch (e) {\n          return e instanceof TypeError;\n        }\n      }());\n      if (globals.Set.length !== 0 || setFailsToSupportSubclassing || !setRequiresNew) {\n        var OrigSet = globals.Set;\n        globals.Set = function Set() {\n          if (!(this instanceof Set)) {\n            throw new TypeError('Constructor Set requires \"new\"');\n          }\n          var s = new OrigSet();\n          if (arguments.length > 0) {\n            addIterableToSet(Set, s, arguments[0]);\n          }\n          Object.setPrototypeOf(s, Set.prototype);\n          defineProperty(s, 'constructor', Set, true);\n          return s;\n        };\n        globals.Set.prototype = OrigSet.prototype;\n        Value.preserveToString(globals.Set, OrigSet);\n      }\n      var mapIterationThrowsStopIterator = !valueOrFalseIfThrows(function () {\n        return (new Map()).keys().next().done;\n      });\n      /*\n        - In Firefox < 23, Map#size is a function.\n        - In all current Firefox, Set#entries/keys/values & Map#clear do not exist\n        - https://bugzilla.mozilla.org/show_bug.cgi?id=869996\n        - In Firefox 24, Map and Set do not implement forEach\n        - In Firefox 25 at least, Map and Set are callable without \"new\"\n      */\n      if (\n        typeof globals.Map.prototype.clear !== 'function' ||\n        new globals.Set().size !== 0 ||\n        new globals.Map().size !== 0 ||\n        typeof globals.Map.prototype.keys !== 'function' ||\n        typeof globals.Set.prototype.keys !== 'function' ||\n        typeof globals.Map.prototype.forEach !== 'function' ||\n        typeof globals.Set.prototype.forEach !== 'function' ||\n        isCallableWithoutNew(globals.Map) ||\n        isCallableWithoutNew(globals.Set) ||\n        typeof (new globals.Map().keys().next) !== 'function' || // Safari 8\n        mapIterationThrowsStopIterator || // Firefox 25\n        !mapSupportsSubclassing\n      ) {\n        delete globals.Map; // necessary to overwrite in Safari 8\n        delete globals.Set; // necessary to overwrite in Safari 8\n        defineProperties(globals, {\n          Map: collectionShims.Map,\n          Set: collectionShims.Set\n        }, true);\n      }\n\n      if (globals.Set.prototype.keys !== globals.Set.prototype.values) {\n        // Fixed in WebKit with https://bugs.webkit.org/show_bug.cgi?id=144190\n        defineProperty(globals.Set.prototype, 'keys', globals.Set.prototype.values, true);\n      }\n\n      // Shim incomplete iterator implementations.\n      addIterator(Object.getPrototypeOf((new globals.Map()).keys()));\n      addIterator(Object.getPrototypeOf((new globals.Set()).keys()));\n\n      if (functionsHaveNames && globals.Set.prototype.has.name !== 'has') {\n        // Microsoft Edge v0.11.10074.0 is missing a name on Set#has\n        var anonymousSetHas = globals.Set.prototype.has;\n        overrideNative(globals.Set.prototype, 'has', function has(key) {\n          return _call(anonymousSetHas, this, key);\n        });\n      }\n    }\n    defineProperties(globals, collectionShims);\n    addDefaultSpecies(globals.Map);\n    addDefaultSpecies(globals.Set);\n  }\n\n  // Reflect\n  if (!globals.Reflect) {\n    defineProperty(globals, 'Reflect', {});\n  }\n  var Reflect = globals.Reflect;\n\n  var throwUnlessTargetIsObject = function throwUnlessTargetIsObject(target) {\n    if (!ES.TypeIsObject(target)) {\n      throw new TypeError('target must be an object');\n    }\n  };\n\n  // Some Reflect methods are basically the same as\n  // those on the Object global, except that a TypeError is thrown if\n  // target isn't an object. As well as returning a boolean indicating\n  // the success of the operation.\n  var ReflectShims = {\n    // Apply method in a functional form.\n    apply: function apply() {\n      return _apply(ES.Call, null, arguments);\n    },\n\n    // New operator in a functional form.\n    construct: function construct(constructor, args) {\n      if (!ES.IsConstructor(constructor)) {\n        throw new TypeError('First argument must be a constructor.');\n      }\n      var newTarget = (arguments.length < 3) ? constructor : arguments[2];\n      if (!ES.IsConstructor(newTarget)) {\n        throw new TypeError('new.target must be a constructor.');\n      }\n      return ES.Construct(constructor, args, newTarget, 'internal');\n    },\n\n    // When deleting a non-existent or configurable property,\n    // true is returned.\n    // When attempting to delete a non-configurable property,\n    // it will return false.\n    deleteProperty: function deleteProperty(target, key) {\n      throwUnlessTargetIsObject(target);\n      if (supportsDescriptors) {\n        var desc = Object.getOwnPropertyDescriptor(target, key);\n\n        if (desc && !desc.configurable) {\n          return false;\n        }\n      }\n\n      // Will return true.\n      return delete target[key];\n    },\n\n    enumerate: function enumerate(target) {\n      throwUnlessTargetIsObject(target);\n      return new ObjectIterator(target, 'key');\n    },\n\n    has: function has(target, key) {\n      throwUnlessTargetIsObject(target);\n      return key in target;\n    }\n  };\n\n  if (Object.getOwnPropertyNames) {\n    Object.assign(ReflectShims, {\n      // Basically the result of calling the internal [[OwnPropertyKeys]].\n      // Concatenating propertyNames and propertySymbols should do the trick.\n      // This should continue to work together with a Symbol shim\n      // which overrides Object.getOwnPropertyNames and implements\n      // Object.getOwnPropertySymbols.\n      ownKeys: function ownKeys(target) {\n        throwUnlessTargetIsObject(target);\n        var keys = Object.getOwnPropertyNames(target);\n\n        if (ES.IsCallable(Object.getOwnPropertySymbols)) {\n          _pushApply(keys, Object.getOwnPropertySymbols(target));\n        }\n\n        return keys;\n      }\n    });\n  }\n\n  var callAndCatchException = function ConvertExceptionToBoolean(func) {\n    return !throwsError(func);\n  };\n\n  if (Object.preventExtensions) {\n    Object.assign(ReflectShims, {\n      isExtensible: function isExtensible(target) {\n        throwUnlessTargetIsObject(target);\n        return Object.isExtensible(target);\n      },\n      preventExtensions: function preventExtensions(target) {\n        throwUnlessTargetIsObject(target);\n        return callAndCatchException(function () {\n          Object.preventExtensions(target);\n        });\n      }\n    });\n  }\n\n  if (supportsDescriptors) {\n    var internalGet = function get(target, key, receiver) {\n      var desc = Object.getOwnPropertyDescriptor(target, key);\n\n      if (!desc) {\n        var parent = Object.getPrototypeOf(target);\n\n        if (parent === null) {\n          return undefined;\n        }\n\n        return internalGet(parent, key, receiver);\n      }\n\n      if ('value' in desc) {\n        return desc.value;\n      }\n\n      if (desc.get) {\n        return _call(desc.get, receiver);\n      }\n\n      return undefined;\n    };\n\n    var internalSet = function set(target, key, value, receiver) {\n      var desc = Object.getOwnPropertyDescriptor(target, key);\n\n      if (!desc) {\n        var parent = Object.getPrototypeOf(target);\n\n        if (parent !== null) {\n          return internalSet(parent, key, value, receiver);\n        }\n\n        desc = {\n          value: void 0,\n          writable: true,\n          enumerable: true,\n          configurable: true\n        };\n      }\n\n      if ('value' in desc) {\n        if (!desc.writable) {\n          return false;\n        }\n\n        if (!ES.TypeIsObject(receiver)) {\n          return false;\n        }\n\n        var existingDesc = Object.getOwnPropertyDescriptor(receiver, key);\n\n        if (existingDesc) {\n          return Reflect.defineProperty(receiver, key, {\n            value: value\n          });\n        } else {\n          return Reflect.defineProperty(receiver, key, {\n            value: value,\n            writable: true,\n            enumerable: true,\n            configurable: true\n          });\n        }\n      }\n\n      if (desc.set) {\n        _call(desc.set, receiver, value);\n        return true;\n      }\n\n      return false;\n    };\n\n    Object.assign(ReflectShims, {\n      defineProperty: function defineProperty(target, propertyKey, attributes) {\n        throwUnlessTargetIsObject(target);\n        return callAndCatchException(function () {\n          Object.defineProperty(target, propertyKey, attributes);\n        });\n      },\n\n      getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n        throwUnlessTargetIsObject(target);\n        return Object.getOwnPropertyDescriptor(target, propertyKey);\n      },\n\n      // Syntax in a functional form.\n      get: function get(target, key) {\n        throwUnlessTargetIsObject(target);\n        var receiver = arguments.length > 2 ? arguments[2] : target;\n\n        return internalGet(target, key, receiver);\n      },\n\n      set: function set(target, key, value) {\n        throwUnlessTargetIsObject(target);\n        var receiver = arguments.length > 3 ? arguments[3] : target;\n\n        return internalSet(target, key, value, receiver);\n      }\n    });\n  }\n\n  if (Object.getPrototypeOf) {\n    var objectDotGetPrototypeOf = Object.getPrototypeOf;\n    ReflectShims.getPrototypeOf = function getPrototypeOf(target) {\n      throwUnlessTargetIsObject(target);\n      return objectDotGetPrototypeOf(target);\n    };\n  }\n\n  if (Object.setPrototypeOf && ReflectShims.getPrototypeOf) {\n    var willCreateCircularPrototype = function (object, proto) {\n      while (proto) {\n        if (object === proto) {\n          return true;\n        }\n        proto = ReflectShims.getPrototypeOf(proto);\n      }\n      return false;\n    };\n\n    Object.assign(ReflectShims, {\n      // Sets the prototype of the given object.\n      // Returns true on success, otherwise false.\n      setPrototypeOf: function setPrototypeOf(object, proto) {\n        throwUnlessTargetIsObject(object);\n        if (proto !== null && !ES.TypeIsObject(proto)) {\n          throw new TypeError('proto must be an object or null');\n        }\n\n        // If they already are the same, we're done.\n        if (proto === Reflect.getPrototypeOf(object)) {\n          return true;\n        }\n\n        // Cannot alter prototype if object not extensible.\n        if (Reflect.isExtensible && !Reflect.isExtensible(object)) {\n          return false;\n        }\n\n        // Ensure that we do not create a circular prototype chain.\n        if (willCreateCircularPrototype(object, proto)) {\n          return false;\n        }\n\n        Object.setPrototypeOf(object, proto);\n\n        return true;\n      }\n    });\n  }\n  var defineOrOverrideReflectProperty = function (key, shim) {\n    if (!ES.IsCallable(globals.Reflect[key])) {\n      defineProperty(globals.Reflect, key, shim);\n    } else {\n      var acceptsPrimitives = valueOrFalseIfThrows(function () {\n        globals.Reflect[key](1);\n        globals.Reflect[key](NaN);\n        globals.Reflect[key](true);\n        return true;\n      });\n      if (acceptsPrimitives) {\n        overrideNative(globals.Reflect, key, shim);\n      }\n    }\n  };\n  Object.keys(ReflectShims).forEach(function (key) {\n    defineOrOverrideReflectProperty(key, ReflectShims[key]);\n  });\n  if (functionsHaveNames && globals.Reflect.getPrototypeOf.name !== 'getPrototypeOf') {\n    var originalReflectGetProto = globals.Reflect.getPrototypeOf;\n    overrideNative(globals.Reflect, 'getPrototypeOf', function getPrototypeOf(target) {\n      return _call(originalReflectGetProto, globals.Reflect, target);\n    });\n  }\n  if (globals.Reflect.setPrototypeOf) {\n    if (valueOrFalseIfThrows(function () {\n      globals.Reflect.setPrototypeOf(1, {});\n      return true;\n    })) {\n      overrideNative(globals.Reflect, 'setPrototypeOf', ReflectShims.setPrototypeOf);\n    }\n  }\n  if (globals.Reflect.defineProperty) {\n    if (valueOrFalseIfThrows(function () {\n      globals.Reflect.defineProperty(1, 'test', { value: 1 });\n      return true;\n    })) {\n      overrideNative(globals.Reflect, 'defineProperty', ReflectShims.defineProperty);\n    }\n  }\n\n  if (String(new Date(NaN)) !== 'Invalid Date') {\n    var dateToString = Date.prototype.toString;\n    var shimmedDateToString = function toString() {\n      var valueOf = +this;\n      if (valueOf !== valueOf) {\n        return 'Invalid Date';\n      }\n      return _call(dateToString, this);\n    };\n    overrideNative(Date.prototype, 'toString', shimmedDateToString);\n  }\n\n  // Annex B HTML methods\n  // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-additional-properties-of-the-string.prototype-object\n  var stringHTMLshims = {\n    anchor: function anchor(name) { return ES.CreateHTML(this, 'a', 'name', name); },\n    big: function big() { return ES.CreateHTML(this, 'big', '', ''); },\n    blink: function blink() { return ES.CreateHTML(this, 'blink', '', ''); },\n    bold: function bold() { return ES.CreateHTML(this, 'b', '', ''); },\n    fixed: function fixed() { return ES.CreateHTML(this, 'tt', '', ''); },\n    fontcolor: function fontcolor(color) { return ES.CreateHTML(this, 'font', 'color', color); },\n    fontsize: function fontsize(size) { return ES.CreateHTML(this, 'font', 'size', size); },\n    italics: function italics() { return ES.CreateHTML(this, 'i', '', ''); },\n    link: function link(url) { return ES.CreateHTML(this, 'a', 'href', url); },\n    small: function small() { return ES.CreateHTML(this, 'small', '', ''); },\n    strike: function strike() { return ES.CreateHTML(this, 'strike', '', ''); },\n    sub: function sub() { return ES.CreateHTML(this, 'sub', '', ''); },\n    sup: function sub() { return ES.CreateHTML(this, 'sup', '', ''); }\n  };\n  _forEach(Object.keys(stringHTMLshims), function (key) {\n    var method = String.prototype[key];\n    var shouldOverwrite = false;\n    if (ES.IsCallable(method)) {\n      var output = _call(method, '', ' \" ');\n      var quotesCount = _concat([], output.match(/\"/g)).length;\n      shouldOverwrite = output !== output.toLowerCase() || quotesCount > 2;\n    } else {\n      shouldOverwrite = true;\n    }\n    if (shouldOverwrite) {\n      defineProperty(String.prototype, key, stringHTMLshims[key], true);\n    }\n  });\n\n  return globals;\n}));\n"
  },
  {
    "path": "tests/vendor/qunit-1.11.0.css",
    "content": "/**\n * QUnit v1.11.0 - A JavaScript Unit Testing Framework\n *\n * http://qunitjs.com\n *\n * Copyright 2012 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n/** Font Family and Sizes */\n\n#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {\n\tfont-family: \"Helvetica Neue Light\", \"HelveticaNeue-Light\", \"Helvetica Neue\", Calibri, Helvetica, Arial, sans-serif;\n}\n\n#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }\n#qunit-tests { font-size: smaller; }\n\n/** Resets */\n\n#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n/** Header */\n\n#qunit-header {\n\tpadding: 0.5em 0 0.5em 1em;\n\n\tcolor: #8699a4;\n\tbackground-color: #0d3349;\n\n\tfont-size: 1.5em;\n\tline-height: 1em;\n\tfont-weight: normal;\n\n\tborder-radius: 5px 5px 0 0;\n\t-moz-border-radius: 5px 5px 0 0;\n\t-webkit-border-top-right-radius: 5px;\n\t-webkit-border-top-left-radius: 5px;\n}\n\n#qunit-header a {\n\ttext-decoration: none;\n\tcolor: #c2ccd1;\n}\n\n#qunit-header a:hover,\n#qunit-header a:focus {\n\tcolor: #fff;\n}\n\n#qunit-testrunner-toolbar label {\n\tdisplay: inline-block;\n\tpadding: 0 .5em 0 .1em;\n}\n\n#qunit-banner {\n\theight: 5px;\n}\n\n#qunit-testrunner-toolbar {\n\tpadding: 0.5em 0 0.5em 2em;\n\tcolor: #5E740B;\n\tbackground-color: #eee;\n\toverflow: hidden;\n}\n\n#qunit-userAgent {\n\tpadding: 0.5em 0 0.5em 2.5em;\n\tbackground-color: #2b81af;\n\tcolor: #fff;\n\ttext-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;\n}\n\n#qunit-modulefilter-container {\n\tfloat: right;\n}\n\n/** Tests: Pass/Fail */\n\n#qunit-tests {\n\tlist-style-position: inside;\n}\n\n#qunit-tests li {\n\tpadding: 0.4em 0.5em 0.4em 2.5em;\n\tborder-bottom: 1px solid #fff;\n\tlist-style-position: inside;\n}\n\n#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running  {\n\tdisplay: none;\n}\n\n#qunit-tests li strong {\n\tcursor: pointer;\n}\n\n#qunit-tests li a {\n\tpadding: 0.5em;\n\tcolor: #c2ccd1;\n\ttext-decoration: none;\n}\n#qunit-tests li a:hover,\n#qunit-tests li a:focus {\n\tcolor: #000;\n}\n\n#qunit-tests li .runtime {\n\tfloat: right;\n\tfont-size: smaller;\n}\n\n.qunit-assert-list {\n\tmargin-top: 0.5em;\n\tpadding: 0.5em;\n\n\tbackground-color: #fff;\n\n\tborder-radius: 5px;\n\t-moz-border-radius: 5px;\n\t-webkit-border-radius: 5px;\n}\n\n.qunit-collapsed {\n\tdisplay: none;\n}\n\n#qunit-tests table {\n\tborder-collapse: collapse;\n\tmargin-top: .2em;\n}\n\n#qunit-tests th {\n\ttext-align: right;\n\tvertical-align: top;\n\tpadding: 0 .5em 0 0;\n}\n\n#qunit-tests td {\n\tvertical-align: top;\n}\n\n#qunit-tests pre {\n\tmargin: 0;\n\twhite-space: pre-wrap;\n\tword-wrap: break-word;\n}\n\n#qunit-tests del {\n\tbackground-color: #e0f2be;\n\tcolor: #374e0c;\n\ttext-decoration: none;\n}\n\n#qunit-tests ins {\n\tbackground-color: #ffcaca;\n\tcolor: #500;\n\ttext-decoration: none;\n}\n\n/*** Test Counts */\n\n#qunit-tests b.counts                       { color: black; }\n#qunit-tests b.passed                       { color: #5E740B; }\n#qunit-tests b.failed                       { color: #710909; }\n\n#qunit-tests li li {\n\tpadding: 5px;\n\tbackground-color: #fff;\n\tborder-bottom: none;\n\tlist-style-position: inside;\n}\n\n/*** Passing Styles */\n\n#qunit-tests li li.pass {\n\tcolor: #3c510c;\n\tbackground-color: #fff;\n\tborder-left: 10px solid #C6E746;\n}\n\n#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }\n#qunit-tests .pass .test-name               { color: #366097; }\n\n#qunit-tests .pass .test-actual,\n#qunit-tests .pass .test-expected           { color: #999999; }\n\n#qunit-banner.qunit-pass                    { background-color: #C6E746; }\n\n/*** Failing Styles */\n\n#qunit-tests li li.fail {\n\tcolor: #710909;\n\tbackground-color: #fff;\n\tborder-left: 10px solid #EE5757;\n\twhite-space: pre;\n}\n\n#qunit-tests > li:last-child {\n\tborder-radius: 0 0 5px 5px;\n\t-moz-border-radius: 0 0 5px 5px;\n\t-webkit-border-bottom-right-radius: 5px;\n\t-webkit-border-bottom-left-radius: 5px;\n}\n\n#qunit-tests .fail                          { color: #000000; background-color: #EE5757; }\n#qunit-tests .fail .test-name,\n#qunit-tests .fail .module-name             { color: #000000; }\n\n#qunit-tests .fail .test-actual             { color: #EE5757; }\n#qunit-tests .fail .test-expected           { color: green;   }\n\n#qunit-banner.qunit-fail                    { background-color: #EE5757; }\n\n/** Result */\n\n#qunit-testresult {\n\tpadding: 0.5em 0.5em 0.5em 2.5em;\n\n\tcolor: #2b81af;\n\tbackground-color: #D2E0E6;\n\n\tborder-bottom: 1px solid white;\n}\n#qunit-testresult .module-name {\n\tfont-weight: bold;\n}\n\n/** Fixture */\n\n#qunit-fixture {\n\tposition: absolute;\n\ttop: -10000px;\n\tleft: -10000px;\n\twidth: 1000px;\n\theight: 1000px;\n}\n"
  },
  {
    "path": "tests/vendor/qunit-1.11.0.js",
    "content": "/**\n * QUnit v1.11.0 - A JavaScript Unit Testing Framework\n *\n * http://qunitjs.com\n *\n * Copyright 2012 jQuery Foundation and other contributors\n * Released under the MIT license.\n * http://jquery.org/license\n */\n\n(function( window ) {\n\nvar QUnit,\n\tassert,\n\tconfig,\n\tonErrorFnPrev,\n\ttestId = 0,\n\tfileName = (sourceFromStacktrace( 0 ) || \"\" ).replace(/(:\\d+)+\\)?/, \"\").replace(/.+\\//, \"\"),\n\ttoString = Object.prototype.toString,\n\thasOwn = Object.prototype.hasOwnProperty,\n\t// Keep a local reference to Date (GH-283)\n\tDate = window.Date,\n\tdefined = {\n\t\tsetTimeout: typeof window.setTimeout !== \"undefined\",\n\t\tsessionStorage: (function() {\n\t\t\tvar x = \"qunit-test-string\";\n\t\t\ttry {\n\t\t\t\tsessionStorage.setItem( x, x );\n\t\t\t\tsessionStorage.removeItem( x );\n\t\t\t\treturn true;\n\t\t\t} catch( e ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}())\n\t},\n\t/**\n\t * Provides a normalized error string, correcting an issue\n\t * with IE 7 (and prior) where Error.prototype.toString is\n\t * not properly implemented\n\t *\n\t * Based on http://es5.github.com/#x15.11.4.4\n\t *\n\t * @param {String|Error} error\n\t * @return {String} error message\n\t */\n\terrorString = function( error ) {\n\t\tvar name, message,\n\t\t\terrorString = error.toString();\n\t\tif ( errorString.substring( 0, 7 ) === \"[object\" ) {\n\t\t\tname = error.name ? error.name.toString() : \"Error\";\n\t\t\tmessage = error.message ? error.message.toString() : \"\";\n\t\t\tif ( name && message ) {\n\t\t\t\treturn name + \": \" + message;\n\t\t\t} else if ( name ) {\n\t\t\t\treturn name;\n\t\t\t} else if ( message ) {\n\t\t\t\treturn message;\n\t\t\t} else {\n\t\t\t\treturn \"Error\";\n\t\t\t}\n\t\t} else {\n\t\t\treturn errorString;\n\t\t}\n\t},\n\t/**\n\t * Makes a clone of an object using only Array or Object as base,\n\t * and copies over the own enumerable properties.\n\t *\n\t * @param {Object} obj\n\t * @return {Object} New object with only the own properties (recursively).\n\t */\n\tobjectValues = function( obj ) {\n\t\t// Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392.\n\t\t/*jshint newcap: false */\n\t\tvar key, val,\n\t\t\tvals = QUnit.is( \"array\", obj ) ? [] : {};\n\t\tfor ( key in obj ) {\n\t\t\tif ( hasOwn.call( obj, key ) ) {\n\t\t\t\tval = obj[key];\n\t\t\t\tvals[key] = val === Object(val) ? objectValues(val) : val;\n\t\t\t}\n\t\t}\n\t\treturn vals;\n\t};\n\nfunction Test( settings ) {\n\textend( this, settings );\n\tthis.assertions = [];\n\tthis.testNumber = ++Test.count;\n}\n\nTest.count = 0;\n\nTest.prototype = {\n\tinit: function() {\n\t\tvar a, b, li,\n\t\t\ttests = id( \"qunit-tests\" );\n\n\t\tif ( tests ) {\n\t\t\tb = document.createElement( \"strong\" );\n\t\t\tb.innerHTML = this.nameHtml;\n\n\t\t\t// `a` initialized at top of scope\n\t\t\ta = document.createElement( \"a\" );\n\t\t\ta.innerHTML = \"Rerun\";\n\t\t\ta.href = QUnit.url({ testNumber: this.testNumber });\n\n\t\t\tli = document.createElement( \"li\" );\n\t\t\tli.appendChild( b );\n\t\t\tli.appendChild( a );\n\t\t\tli.className = \"running\";\n\t\t\tli.id = this.id = \"qunit-test-output\" + testId++;\n\n\t\t\ttests.appendChild( li );\n\t\t}\n\t},\n\tsetup: function() {\n\t\tif ( this.module !== config.previousModule ) {\n\t\t\tif ( config.previousModule ) {\n\t\t\t\trunLoggingCallbacks( \"moduleDone\", QUnit, {\n\t\t\t\t\tname: config.previousModule,\n\t\t\t\t\tfailed: config.moduleStats.bad,\n\t\t\t\t\tpassed: config.moduleStats.all - config.moduleStats.bad,\n\t\t\t\t\ttotal: config.moduleStats.all\n\t\t\t\t});\n\t\t\t}\n\t\t\tconfig.previousModule = this.module;\n\t\t\tconfig.moduleStats = { all: 0, bad: 0 };\n\t\t\trunLoggingCallbacks( \"moduleStart\", QUnit, {\n\t\t\t\tname: this.module\n\t\t\t});\n\t\t} else if ( config.autorun ) {\n\t\t\trunLoggingCallbacks( \"moduleStart\", QUnit, {\n\t\t\t\tname: this.module\n\t\t\t});\n\t\t}\n\n\t\tconfig.current = this;\n\n\t\tthis.testEnvironment = extend({\n\t\t\tsetup: function() {},\n\t\t\tteardown: function() {}\n\t\t}, this.moduleTestEnvironment );\n\n\t\tthis.started = +new Date();\n\t\trunLoggingCallbacks( \"testStart\", QUnit, {\n\t\t\tname: this.testName,\n\t\t\tmodule: this.module\n\t\t});\n\n\t\t// allow utility functions to access the current test environment\n\t\t// TODO why??\n\t\tQUnit.current_testEnvironment = this.testEnvironment;\n\n\t\tif ( !config.pollution ) {\n\t\t\tsaveGlobal();\n\t\t}\n\t\tif ( config.notrycatch ) {\n\t\t\tthis.testEnvironment.setup.call( this.testEnvironment );\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tthis.testEnvironment.setup.call( this.testEnvironment );\n\t\t} catch( e ) {\n\t\t\tQUnit.pushFailure( \"Setup failed on \" + this.testName + \": \" + ( e.message || e ), extractStacktrace( e, 1 ) );\n\t\t}\n\t},\n\trun: function() {\n\t\tconfig.current = this;\n\n\t\tvar running = id( \"qunit-testresult\" );\n\n\t\tif ( running ) {\n\t\t\trunning.innerHTML = \"Running: <br/>\" + this.nameHtml;\n\t\t}\n\n\t\tif ( this.async ) {\n\t\t\tQUnit.stop();\n\t\t}\n\n\t\tthis.callbackStarted = +new Date();\n\n\t\tif ( config.notrycatch ) {\n\t\t\tthis.callback.call( this.testEnvironment, QUnit.assert );\n\t\t\tthis.callbackRuntime = +new Date() - this.callbackStarted;\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tthis.callback.call( this.testEnvironment, QUnit.assert );\n\t\t\tthis.callbackRuntime = +new Date() - this.callbackStarted;\n\t\t} catch( e ) {\n\t\t\tthis.callbackRuntime = +new Date() - this.callbackStarted;\n\n\t\t\tQUnit.pushFailure( \"Died on test #\" + (this.assertions.length + 1) + \" \" + this.stack + \": \" + ( e.message || e ), extractStacktrace( e, 0 ) );\n\t\t\t// else next test will carry the responsibility\n\t\t\tsaveGlobal();\n\n\t\t\t// Restart the tests if they're blocking\n\t\t\tif ( config.blocking ) {\n\t\t\t\tQUnit.start();\n\t\t\t}\n\t\t}\n\t},\n\tteardown: function() {\n\t\tconfig.current = this;\n\t\tif ( config.notrycatch ) {\n\t\t\tif ( typeof this.callbackRuntime === \"undefined\" ) {\n\t\t\t\tthis.callbackRuntime = +new Date() - this.callbackStarted;\n\t\t\t}\n\t\t\tthis.testEnvironment.teardown.call( this.testEnvironment );\n\t\t\treturn;\n\t\t} else {\n\t\t\ttry {\n\t\t\t\tthis.testEnvironment.teardown.call( this.testEnvironment );\n\t\t\t} catch( e ) {\n\t\t\t\tQUnit.pushFailure( \"Teardown failed on \" + this.testName + \": \" + ( e.message || e ), extractStacktrace( e, 1 ) );\n\t\t\t}\n\t\t}\n\t\tcheckPollution();\n\t},\n\tfinish: function() {\n\t\tconfig.current = this;\n\t\tif ( config.requireExpects && this.expected === null ) {\n\t\t\tQUnit.pushFailure( \"Expected number of assertions to be defined, but expect() was not called.\", this.stack );\n\t\t} else if ( this.expected !== null && this.expected !== this.assertions.length ) {\n\t\t\tQUnit.pushFailure( \"Expected \" + this.expected + \" assertions, but \" + this.assertions.length + \" were run\", this.stack );\n\t\t} else if ( this.expected === null && !this.assertions.length ) {\n\t\t\tQUnit.pushFailure( \"Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.\", this.stack );\n\t\t}\n\n\t\tvar i, assertion, a, b, time, li, ol,\n\t\t\ttest = this,\n\t\t\tgood = 0,\n\t\t\tbad = 0,\n\t\t\ttests = id( \"qunit-tests\" );\n\n\t\tthis.runtime = +new Date() - this.started;\n\t\tconfig.stats.all += this.assertions.length;\n\t\tconfig.moduleStats.all += this.assertions.length;\n\n\t\tif ( tests ) {\n\t\t\tol = document.createElement( \"ol\" );\n\t\t\tol.className = \"qunit-assert-list\";\n\n\t\t\tfor ( i = 0; i < this.assertions.length; i++ ) {\n\t\t\t\tassertion = this.assertions[i];\n\n\t\t\t\tli = document.createElement( \"li\" );\n\t\t\t\tli.className = assertion.result ? \"pass\" : \"fail\";\n\t\t\t\tli.innerHTML = assertion.message || ( assertion.result ? \"okay\" : \"failed\" );\n\t\t\t\tol.appendChild( li );\n\n\t\t\t\tif ( assertion.result ) {\n\t\t\t\t\tgood++;\n\t\t\t\t} else {\n\t\t\t\t\tbad++;\n\t\t\t\t\tconfig.stats.bad++;\n\t\t\t\t\tconfig.moduleStats.bad++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// store result when possible\n\t\t\tif ( QUnit.config.reorder && defined.sessionStorage ) {\n\t\t\t\tif ( bad ) {\n\t\t\t\t\tsessionStorage.setItem( \"qunit-test-\" + this.module + \"-\" + this.testName, bad );\n\t\t\t\t} else {\n\t\t\t\t\tsessionStorage.removeItem( \"qunit-test-\" + this.module + \"-\" + this.testName );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( bad === 0 ) {\n\t\t\t\taddClass( ol, \"qunit-collapsed\" );\n\t\t\t}\n\n\t\t\t// `b` initialized at top of scope\n\t\t\tb = document.createElement( \"strong\" );\n\t\t\tb.innerHTML = this.nameHtml + \" <b class='counts'>(<b class='failed'>\" + bad + \"</b>, <b class='passed'>\" + good + \"</b>, \" + this.assertions.length + \")</b>\";\n\n\t\t\taddEvent(b, \"click\", function() {\n\t\t\t\tvar next = b.parentNode.lastChild,\n\t\t\t\t\tcollapsed = hasClass( next, \"qunit-collapsed\" );\n\t\t\t\t( collapsed ? removeClass : addClass )( next, \"qunit-collapsed\" );\n\t\t\t});\n\n\t\t\taddEvent(b, \"dblclick\", function( e ) {\n\t\t\t\tvar target = e && e.target ? e.target : window.event.srcElement;\n\t\t\t\tif ( target.nodeName.toLowerCase() === \"span\" || target.nodeName.toLowerCase() === \"b\" ) {\n\t\t\t\t\ttarget = target.parentNode;\n\t\t\t\t}\n\t\t\t\tif ( window.location && target.nodeName.toLowerCase() === \"strong\" ) {\n\t\t\t\t\twindow.location = QUnit.url({ testNumber: test.testNumber });\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// `time` initialized at top of scope\n\t\t\ttime = document.createElement( \"span\" );\n\t\t\ttime.className = \"runtime\";\n\t\t\ttime.innerHTML = this.runtime + \" ms\";\n\n\t\t\t// `li` initialized at top of scope\n\t\t\tli = id( this.id );\n\t\t\tli.className = bad ? \"fail\" : \"pass\";\n\t\t\tli.removeChild( li.firstChild );\n\t\t\ta = li.firstChild;\n\t\t\tli.appendChild( b );\n\t\t\tli.appendChild( a );\n\t\t\tli.appendChild( time );\n\t\t\tli.appendChild( ol );\n\n\t\t} else {\n\t\t\tfor ( i = 0; i < this.assertions.length; i++ ) {\n\t\t\t\tif ( !this.assertions[i].result ) {\n\t\t\t\t\tbad++;\n\t\t\t\t\tconfig.stats.bad++;\n\t\t\t\t\tconfig.moduleStats.bad++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\trunLoggingCallbacks( \"testDone\", QUnit, {\n\t\t\tname: this.testName,\n\t\t\tmodule: this.module,\n\t\t\tfailed: bad,\n\t\t\tpassed: this.assertions.length - bad,\n\t\t\ttotal: this.assertions.length,\n\t\t\tduration: this.runtime\n\t\t});\n\n\t\tQUnit.reset();\n\n\t\tconfig.current = undefined;\n\t},\n\n\tqueue: function() {\n\t\tvar bad,\n\t\t\ttest = this;\n\n\t\tsynchronize(function() {\n\t\t\ttest.init();\n\t\t});\n\t\tfunction run() {\n\t\t\t// each of these can by async\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.setup();\n\t\t\t});\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.run();\n\t\t\t});\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.teardown();\n\t\t\t});\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.finish();\n\t\t\t});\n\t\t}\n\n\t\t// `bad` initialized at top of scope\n\t\t// defer when previous test run passed, if storage is available\n\t\tbad = QUnit.config.reorder && defined.sessionStorage &&\n\t\t\t\t\t\t+sessionStorage.getItem( \"qunit-test-\" + this.module + \"-\" + this.testName );\n\n\t\tif ( bad ) {\n\t\t\trun();\n\t\t} else {\n\t\t\tsynchronize( run, true );\n\t\t}\n\t}\n};\n\n// Root QUnit object.\n// `QUnit` initialized at top of scope\nQUnit = {\n\n\t// call on start of module test to prepend name to all tests\n\tmodule: function( name, testEnvironment ) {\n\t\tconfig.currentModule = name;\n\t\tconfig.currentModuleTestEnvironment = testEnvironment;\n\t\tconfig.modules[name] = true;\n\t},\n\n\tasyncTest: function( testName, expected, callback ) {\n\t\tif ( arguments.length === 2 ) {\n\t\t\tcallback = expected;\n\t\t\texpected = null;\n\t\t}\n\n\t\tQUnit.test( testName, expected, callback, true );\n\t},\n\n\ttest: function( testName, expected, callback, async ) {\n\t\tvar test,\n\t\t\tnameHtml = \"<span class='test-name'>\" + escapeText( testName ) + \"</span>\";\n\n\t\tif ( arguments.length === 2 ) {\n\t\t\tcallback = expected;\n\t\t\texpected = null;\n\t\t}\n\n\t\tif ( config.currentModule ) {\n\t\t\tnameHtml = \"<span class='module-name'>\" + escapeText( config.currentModule ) + \"</span>: \" + nameHtml;\n\t\t}\n\n\t\ttest = new Test({\n\t\t\tnameHtml: nameHtml,\n\t\t\ttestName: testName,\n\t\t\texpected: expected,\n\t\t\tasync: async,\n\t\t\tcallback: callback,\n\t\t\tmodule: config.currentModule,\n\t\t\tmoduleTestEnvironment: config.currentModuleTestEnvironment,\n\t\t\tstack: sourceFromStacktrace( 2 )\n\t\t});\n\n\t\tif ( !validTest( test ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\ttest.queue();\n\t},\n\n\t// Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.\n\texpect: function( asserts ) {\n\t\tif (arguments.length === 1) {\n\t\t\tconfig.current.expected = asserts;\n\t\t} else {\n\t\t\treturn config.current.expected;\n\t\t}\n\t},\n\n\tstart: function( count ) {\n\t\t// QUnit hasn't been initialized yet.\n\t\t// Note: RequireJS (et al) may delay onLoad\n\t\tif ( config.semaphore === undefined ) {\n\t\t\tQUnit.begin(function() {\n\t\t\t\t// This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tQUnit.start( count );\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tconfig.semaphore -= count || 1;\n\t\t// don't start until equal number of stop-calls\n\t\tif ( config.semaphore > 0 ) {\n\t\t\treturn;\n\t\t}\n\t\t// ignore if start is called more often then stop\n\t\tif ( config.semaphore < 0 ) {\n\t\t\tconfig.semaphore = 0;\n\t\t\tQUnit.pushFailure( \"Called start() while already started (QUnit.config.semaphore was 0 already)\", null, sourceFromStacktrace(2) );\n\t\t\treturn;\n\t\t}\n\t\t// A slight delay, to avoid any current callbacks\n\t\tif ( defined.setTimeout ) {\n\t\t\twindow.setTimeout(function() {\n\t\t\t\tif ( config.semaphore > 0 ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( config.timeout ) {\n\t\t\t\t\tclearTimeout( config.timeout );\n\t\t\t\t}\n\n\t\t\t\tconfig.blocking = false;\n\t\t\t\tprocess( true );\n\t\t\t}, 13);\n\t\t} else {\n\t\t\tconfig.blocking = false;\n\t\t\tprocess( true );\n\t\t}\n\t},\n\n\tstop: function( count ) {\n\t\tconfig.semaphore += count || 1;\n\t\tconfig.blocking = true;\n\n\t\tif ( config.testTimeout && defined.setTimeout ) {\n\t\t\tclearTimeout( config.timeout );\n\t\t\tconfig.timeout = window.setTimeout(function() {\n\t\t\t\tQUnit.ok( false, \"Test timed out\" );\n\t\t\t\tconfig.semaphore = 1;\n\t\t\t\tQUnit.start();\n\t\t\t}, config.testTimeout );\n\t\t}\n\t}\n};\n\n// `assert` initialized at top of scope\n// Asssert helpers\n// All of these must either call QUnit.push() or manually do:\n// - runLoggingCallbacks( \"log\", .. );\n// - config.current.assertions.push({ .. });\n// We attach it to the QUnit object *after* we expose the public API,\n// otherwise `assert` will become a global variable in browsers (#341).\nassert = {\n\t/**\n\t * Asserts rough true-ish result.\n\t * @name ok\n\t * @function\n\t * @example ok( \"asdfasdf\".length > 5, \"There must be at least 5 chars\" );\n\t */\n\tok: function( result, msg ) {\n\t\tif ( !config.current ) {\n\t\t\tthrow new Error( \"ok() assertion outside test context, was \" + sourceFromStacktrace(2) );\n\t\t}\n\t\tresult = !!result;\n\n\t\tvar source,\n\t\t\tdetails = {\n\t\t\t\tmodule: config.current.module,\n\t\t\t\tname: config.current.testName,\n\t\t\t\tresult: result,\n\t\t\t\tmessage: msg\n\t\t\t};\n\n\t\tmsg = escapeText( msg || (result ? \"okay\" : \"failed\" ) );\n\t\tmsg = \"<span class='test-message'>\" + msg + \"</span>\";\n\n\t\tif ( !result ) {\n\t\t\tsource = sourceFromStacktrace( 2 );\n\t\t\tif ( source ) {\n\t\t\t\tdetails.source = source;\n\t\t\t\tmsg += \"<table><tr class='test-source'><th>Source: </th><td><pre>\" + escapeText( source ) + \"</pre></td></tr></table>\";\n\t\t\t}\n\t\t}\n\t\trunLoggingCallbacks( \"log\", QUnit, details );\n\t\tconfig.current.assertions.push({\n\t\t\tresult: result,\n\t\t\tmessage: msg\n\t\t});\n\t},\n\n\t/**\n\t * Assert that the first two arguments are equal, with an optional message.\n\t * Prints out both actual and expected values.\n\t * @name equal\n\t * @function\n\t * @example equal( format( \"Received {0} bytes.\", 2), \"Received 2 bytes.\", \"format() replaces {0} with next argument\" );\n\t */\n\tequal: function( actual, expected, message ) {\n\t\t/*jshint eqeqeq:false */\n\t\tQUnit.push( expected == actual, actual, expected, message );\n\t},\n\n\t/**\n\t * @name notEqual\n\t * @function\n\t */\n\tnotEqual: function( actual, expected, message ) {\n\t\t/*jshint eqeqeq:false */\n\t\tQUnit.push( expected != actual, actual, expected, message );\n\t},\n\n\t/**\n\t * @name propEqual\n\t * @function\n\t */\n\tpropEqual: function( actual, expected, message ) {\n\t\tactual = objectValues(actual);\n\t\texpected = objectValues(expected);\n\t\tQUnit.push( QUnit.equiv(actual, expected), actual, expected, message );\n\t},\n\n\t/**\n\t * @name notPropEqual\n\t * @function\n\t */\n\tnotPropEqual: function( actual, expected, message ) {\n\t\tactual = objectValues(actual);\n\t\texpected = objectValues(expected);\n\t\tQUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );\n\t},\n\n\t/**\n\t * @name deepEqual\n\t * @function\n\t */\n\tdeepEqual: function( actual, expected, message ) {\n\t\tQUnit.push( QUnit.equiv(actual, expected), actual, expected, message );\n\t},\n\n\t/**\n\t * @name notDeepEqual\n\t * @function\n\t */\n\tnotDeepEqual: function( actual, expected, message ) {\n\t\tQUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );\n\t},\n\n\t/**\n\t * @name strictEqual\n\t * @function\n\t */\n\tstrictEqual: function( actual, expected, message ) {\n\t\tQUnit.push( expected === actual, actual, expected, message );\n\t},\n\n\t/**\n\t * @name notStrictEqual\n\t * @function\n\t */\n\tnotStrictEqual: function( actual, expected, message ) {\n\t\tQUnit.push( expected !== actual, actual, expected, message );\n\t},\n\n\t\"throws\": function( block, expected, message ) {\n\t\tvar actual,\n\t\t\texpectedOutput = expected,\n\t\t\tok = false;\n\n\t\t// 'expected' is optional\n\t\tif ( typeof expected === \"string\" ) {\n\t\t\tmessage = expected;\n\t\t\texpected = null;\n\t\t}\n\n\t\tconfig.current.ignoreGlobalErrors = true;\n\t\ttry {\n\t\t\tblock.call( config.current.testEnvironment );\n\t\t} catch (e) {\n\t\t\tactual = e;\n\t\t}\n\t\tconfig.current.ignoreGlobalErrors = false;\n\n\t\tif ( actual ) {\n\t\t\t// we don't want to validate thrown error\n\t\t\tif ( !expected ) {\n\t\t\t\tok = true;\n\t\t\t\texpectedOutput = null;\n\t\t\t// expected is a regexp\n\t\t\t} else if ( QUnit.objectType( expected ) === \"regexp\" ) {\n\t\t\t\tok = expected.test( errorString( actual ) );\n\t\t\t// expected is a constructor\n\t\t\t} else if ( actual instanceof expected ) {\n\t\t\t\tok = true;\n\t\t\t// expected is a validation function which returns true is validation passed\n\t\t\t} else if ( expected.call( {}, actual ) === true ) {\n\t\t\t\texpectedOutput = null;\n\t\t\t\tok = true;\n\t\t\t}\n\n\t\t\tQUnit.push( ok, actual, expectedOutput, message );\n\t\t} else {\n\t\t\tQUnit.pushFailure( message, null, 'No exception was thrown.' );\n\t\t}\n\t}\n};\n\n/**\n * @deprecate since 1.8.0\n * Kept assertion helpers in root for backwards compatibility.\n */\nextend( QUnit, assert );\n\n/**\n * @deprecated since 1.9.0\n * Kept root \"raises()\" for backwards compatibility.\n * (Note that we don't introduce assert.raises).\n */\nQUnit.raises = assert[ \"throws\" ];\n\n/**\n * @deprecated since 1.0.0, replaced with error pushes since 1.3.0\n * Kept to avoid TypeErrors for undefined methods.\n */\nQUnit.equals = function() {\n\tQUnit.push( false, false, false, \"QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead\" );\n};\nQUnit.same = function() {\n\tQUnit.push( false, false, false, \"QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead\" );\n};\n\n// We want access to the constructor's prototype\n(function() {\n\tfunction F() {}\n\tF.prototype = QUnit;\n\tQUnit = new F();\n\t// Make F QUnit's constructor so that we can add to the prototype later\n\tQUnit.constructor = F;\n}());\n\n/**\n * Config object: Maintain internal state\n * Later exposed as QUnit.config\n * `config` initialized at top of scope\n */\nconfig = {\n\t// The queue of tests to run\n\tqueue: [],\n\n\t// block until document ready\n\tblocking: true,\n\n\t// when enabled, show only failing tests\n\t// gets persisted through sessionStorage and can be changed in UI via checkbox\n\thidepassed: false,\n\n\t// by default, run previously failed tests first\n\t// very useful in combination with \"Hide passed tests\" checked\n\treorder: true,\n\n\t// by default, modify document.title when suite is done\n\taltertitle: true,\n\n\t// when enabled, all tests must call expect()\n\trequireExpects: false,\n\n\t// add checkboxes that are persisted in the query-string\n\t// when enabled, the id is set to `true` as a `QUnit.config` property\n\turlConfig: [\n\t\t{\n\t\t\tid: \"noglobals\",\n\t\t\tlabel: \"Check for Globals\",\n\t\t\ttooltip: \"Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings.\"\n\t\t},\n\t\t{\n\t\t\tid: \"notrycatch\",\n\t\t\tlabel: \"No try-catch\",\n\t\t\ttooltip: \"Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings.\"\n\t\t}\n\t],\n\n\t// Set of all modules.\n\tmodules: {},\n\n\t// logging callback queues\n\tbegin: [],\n\tdone: [],\n\tlog: [],\n\ttestStart: [],\n\ttestDone: [],\n\tmoduleStart: [],\n\tmoduleDone: []\n};\n\n// Export global variables, unless an 'exports' object exists,\n// in that case we assume we're in CommonJS (dealt with on the bottom of the script)\nif ( typeof exports === \"undefined\" ) {\n\textend( window, QUnit );\n\n\t// Expose QUnit object\n\twindow.QUnit = QUnit;\n}\n\n// Initialize more QUnit.config and QUnit.urlParams\n(function() {\n\tvar i,\n\t\tlocation = window.location || { search: \"\", protocol: \"file:\" },\n\t\tparams = location.search.slice( 1 ).split( \"&\" ),\n\t\tlength = params.length,\n\t\turlParams = {},\n\t\tcurrent;\n\n\tif ( params[ 0 ] ) {\n\t\tfor ( i = 0; i < length; i++ ) {\n\t\t\tcurrent = params[ i ].split( \"=\" );\n\t\t\tcurrent[ 0 ] = decodeURIComponent( current[ 0 ] );\n\t\t\t// allow just a key to turn on a flag, e.g., test.html?noglobals\n\t\t\tcurrent[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;\n\t\t\turlParams[ current[ 0 ] ] = current[ 1 ];\n\t\t}\n\t}\n\n\tQUnit.urlParams = urlParams;\n\n\t// String search anywhere in moduleName+testName\n\tconfig.filter = urlParams.filter;\n\n\t// Exact match of the module name\n\tconfig.module = urlParams.module;\n\n\tconfig.testNumber = parseInt( urlParams.testNumber, 10 ) || null;\n\n\t// Figure out if we're running the tests from a server or not\n\tQUnit.isLocal = location.protocol === \"file:\";\n}());\n\n// Extend QUnit object,\n// these after set here because they should not be exposed as global functions\nextend( QUnit, {\n\tassert: assert,\n\n\tconfig: config,\n\n\t// Initialize the configuration options\n\tinit: function() {\n\t\textend( config, {\n\t\t\tstats: { all: 0, bad: 0 },\n\t\t\tmoduleStats: { all: 0, bad: 0 },\n\t\t\tstarted: +new Date(),\n\t\t\tupdateRate: 1000,\n\t\t\tblocking: false,\n\t\t\tautostart: true,\n\t\t\tautorun: false,\n\t\t\tfilter: \"\",\n\t\t\tqueue: [],\n\t\t\tsemaphore: 1\n\t\t});\n\n\t\tvar tests, banner, result,\n\t\t\tqunit = id( \"qunit\" );\n\n\t\tif ( qunit ) {\n\t\t\tqunit.innerHTML =\n\t\t\t\t\"<h1 id='qunit-header'>\" + escapeText( document.title ) + \"</h1>\" +\n\t\t\t\t\"<h2 id='qunit-banner'></h2>\" +\n\t\t\t\t\"<div id='qunit-testrunner-toolbar'></div>\" +\n\t\t\t\t\"<h2 id='qunit-userAgent'></h2>\" +\n\t\t\t\t\"<ol id='qunit-tests'></ol>\";\n\t\t}\n\n\t\ttests = id( \"qunit-tests\" );\n\t\tbanner = id( \"qunit-banner\" );\n\t\tresult = id( \"qunit-testresult\" );\n\n\t\tif ( tests ) {\n\t\t\ttests.innerHTML = \"\";\n\t\t}\n\n\t\tif ( banner ) {\n\t\t\tbanner.className = \"\";\n\t\t}\n\n\t\tif ( result ) {\n\t\t\tresult.parentNode.removeChild( result );\n\t\t}\n\n\t\tif ( tests ) {\n\t\t\tresult = document.createElement( \"p\" );\n\t\t\tresult.id = \"qunit-testresult\";\n\t\t\tresult.className = \"result\";\n\t\t\ttests.parentNode.insertBefore( result, tests );\n\t\t\tresult.innerHTML = \"Running...<br/>&nbsp;\";\n\t\t}\n\t},\n\n\t// Resets the test setup. Useful for tests that modify the DOM.\n\treset: function() {\n\t\tvar fixture = id( \"qunit-fixture\" );\n\t\tif ( fixture ) {\n\t\t\tfixture.innerHTML = config.fixture;\n\t\t}\n\t},\n\n\t// Trigger an event on an element.\n\t// @example triggerEvent( document.body, \"click\" );\n\ttriggerEvent: function( elem, type, event ) {\n\t\tif ( document.createEvent ) {\n\t\t\tevent = document.createEvent( \"MouseEvents\" );\n\t\t\tevent.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,\n\t\t\t\t0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\n\t\t\telem.dispatchEvent( event );\n\t\t} else if ( elem.fireEvent ) {\n\t\t\telem.fireEvent( \"on\" + type );\n\t\t}\n\t},\n\n\t// Safe object type checking\n\tis: function( type, obj ) {\n\t\treturn QUnit.objectType( obj ) === type;\n\t},\n\n\tobjectType: function( obj ) {\n\t\tif ( typeof obj === \"undefined\" ) {\n\t\t\t\treturn \"undefined\";\n\t\t// consider: typeof null === object\n\t\t}\n\t\tif ( obj === null ) {\n\t\t\t\treturn \"null\";\n\t\t}\n\n\t\tvar match = toString.call( obj ).match(/^\\[object\\s(.*)\\]$/),\n\t\t\ttype = match && match[1] || \"\";\n\n\t\tswitch ( type ) {\n\t\t\tcase \"Number\":\n\t\t\t\tif ( isNaN(obj) ) {\n\t\t\t\t\treturn \"nan\";\n\t\t\t\t}\n\t\t\t\treturn \"number\";\n\t\t\tcase \"String\":\n\t\t\tcase \"Boolean\":\n\t\t\tcase \"Array\":\n\t\t\tcase \"Date\":\n\t\t\tcase \"RegExp\":\n\t\t\tcase \"Function\":\n\t\t\t\treturn type.toLowerCase();\n\t\t}\n\t\tif ( typeof obj === \"object\" ) {\n\t\t\treturn \"object\";\n\t\t}\n\t\treturn undefined;\n\t},\n\n\tpush: function( result, actual, expected, message ) {\n\t\tif ( !config.current ) {\n\t\t\tthrow new Error( \"assertion outside test context, was \" + sourceFromStacktrace() );\n\t\t}\n\n\t\tvar output, source,\n\t\t\tdetails = {\n\t\t\t\tmodule: config.current.module,\n\t\t\t\tname: config.current.testName,\n\t\t\t\tresult: result,\n\t\t\t\tmessage: message,\n\t\t\t\tactual: actual,\n\t\t\t\texpected: expected\n\t\t\t};\n\n\t\tmessage = escapeText( message ) || ( result ? \"okay\" : \"failed\" );\n\t\tmessage = \"<span class='test-message'>\" + message + \"</span>\";\n\t\toutput = message;\n\n\t\tif ( !result ) {\n\t\t\texpected = escapeText( QUnit.jsDump.parse(expected) );\n\t\t\tactual = escapeText( QUnit.jsDump.parse(actual) );\n\t\t\toutput += \"<table><tr class='test-expected'><th>Expected: </th><td><pre>\" + expected + \"</pre></td></tr>\";\n\n\t\t\tif ( actual !== expected ) {\n\t\t\t\toutput += \"<tr class='test-actual'><th>Result: </th><td><pre>\" + actual + \"</pre></td></tr>\";\n\t\t\t\toutput += \"<tr class='test-diff'><th>Diff: </th><td><pre>\" + QUnit.diff( expected, actual ) + \"</pre></td></tr>\";\n\t\t\t}\n\n\t\t\tsource = sourceFromStacktrace();\n\n\t\t\tif ( source ) {\n\t\t\t\tdetails.source = source;\n\t\t\t\toutput += \"<tr class='test-source'><th>Source: </th><td><pre>\" + escapeText( source ) + \"</pre></td></tr>\";\n\t\t\t}\n\n\t\t\toutput += \"</table>\";\n\t\t}\n\n\t\trunLoggingCallbacks( \"log\", QUnit, details );\n\n\t\tconfig.current.assertions.push({\n\t\t\tresult: !!result,\n\t\t\tmessage: output\n\t\t});\n\t},\n\n\tpushFailure: function( message, source, actual ) {\n\t\tif ( !config.current ) {\n\t\t\tthrow new Error( \"pushFailure() assertion outside test context, was \" + sourceFromStacktrace(2) );\n\t\t}\n\n\t\tvar output,\n\t\t\tdetails = {\n\t\t\t\tmodule: config.current.module,\n\t\t\t\tname: config.current.testName,\n\t\t\t\tresult: false,\n\t\t\t\tmessage: message\n\t\t\t};\n\n\t\tmessage = escapeText( message ) || \"error\";\n\t\tmessage = \"<span class='test-message'>\" + message + \"</span>\";\n\t\toutput = message;\n\n\t\toutput += \"<table>\";\n\n\t\tif ( actual ) {\n\t\t\toutput += \"<tr class='test-actual'><th>Result: </th><td><pre>\" + escapeText( actual ) + \"</pre></td></tr>\";\n\t\t}\n\n\t\tif ( source ) {\n\t\t\tdetails.source = source;\n\t\t\toutput += \"<tr class='test-source'><th>Source: </th><td><pre>\" + escapeText( source ) + \"</pre></td></tr>\";\n\t\t}\n\n\t\toutput += \"</table>\";\n\n\t\trunLoggingCallbacks( \"log\", QUnit, details );\n\n\t\tconfig.current.assertions.push({\n\t\t\tresult: false,\n\t\t\tmessage: output\n\t\t});\n\t},\n\n\turl: function( params ) {\n\t\tparams = extend( extend( {}, QUnit.urlParams ), params );\n\t\tvar key,\n\t\t\tquerystring = \"?\";\n\n\t\tfor ( key in params ) {\n\t\t\tif ( !hasOwn.call( params, key ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tquerystring += encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( params[ key ] ) + \"&\";\n\t\t}\n\t\treturn window.location.protocol + \"//\" + window.location.host +\n\t\t\twindow.location.pathname + querystring.slice( 0, -1 );\n\t},\n\n\textend: extend,\n\tid: id,\n\taddEvent: addEvent\n\t// load, equiv, jsDump, diff: Attached later\n});\n\n/**\n * @deprecated: Created for backwards compatibility with test runner that set the hook function\n * into QUnit.{hook}, instead of invoking it and passing the hook function.\n * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here.\n * Doing this allows us to tell if the following methods have been overwritten on the actual\n * QUnit object.\n */\nextend( QUnit.constructor.prototype, {\n\n\t// Logging callbacks; all receive a single argument with the listed properties\n\t// run test/logs.html for any related changes\n\tbegin: registerLoggingCallback( \"begin\" ),\n\n\t// done: { failed, passed, total, runtime }\n\tdone: registerLoggingCallback( \"done\" ),\n\n\t// log: { result, actual, expected, message }\n\tlog: registerLoggingCallback( \"log\" ),\n\n\t// testStart: { name }\n\ttestStart: registerLoggingCallback( \"testStart\" ),\n\n\t// testDone: { name, failed, passed, total, duration }\n\ttestDone: registerLoggingCallback( \"testDone\" ),\n\n\t// moduleStart: { name }\n\tmoduleStart: registerLoggingCallback( \"moduleStart\" ),\n\n\t// moduleDone: { name, failed, passed, total }\n\tmoduleDone: registerLoggingCallback( \"moduleDone\" )\n});\n\nif ( typeof document === \"undefined\" || document.readyState === \"complete\" ) {\n\tconfig.autorun = true;\n}\n\nQUnit.load = function() {\n\trunLoggingCallbacks( \"begin\", QUnit, {} );\n\n\t// Initialize the config, saving the execution queue\n\tvar banner, filter, i, label, len, main, ol, toolbar, userAgent, val,\n\t\turlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter,\n\t\tnumModules = 0,\n\t\tmoduleFilterHtml = \"\",\n\t\turlConfigHtml = \"\",\n\t\toldconfig = extend( {}, config );\n\n\tQUnit.init();\n\textend(config, oldconfig);\n\n\tconfig.blocking = false;\n\n\tlen = config.urlConfig.length;\n\n\tfor ( i = 0; i < len; i++ ) {\n\t\tval = config.urlConfig[i];\n\t\tif ( typeof val === \"string\" ) {\n\t\t\tval = {\n\t\t\t\tid: val,\n\t\t\t\tlabel: val,\n\t\t\t\ttooltip: \"[no tooltip available]\"\n\t\t\t};\n\t\t}\n\t\tconfig[ val.id ] = QUnit.urlParams[ val.id ];\n\t\turlConfigHtml += \"<input id='qunit-urlconfig-\" + escapeText( val.id ) +\n\t\t\t\"' name='\" + escapeText( val.id ) +\n\t\t\t\"' type='checkbox'\" + ( config[ val.id ] ? \" checked='checked'\" : \"\" ) +\n\t\t\t\" title='\" + escapeText( val.tooltip ) +\n\t\t\t\"'><label for='qunit-urlconfig-\" + escapeText( val.id ) +\n\t\t\t\"' title='\" + escapeText( val.tooltip ) + \"'>\" + val.label + \"</label>\";\n\t}\n\n\tmoduleFilterHtml += \"<label for='qunit-modulefilter'>Module: </label><select id='qunit-modulefilter' name='modulefilter'><option value='' \" +\n\t\t( config.module === undefined  ? \"selected='selected'\" : \"\" ) +\n\t\t\">< All Modules ></option>\";\n\n\tfor ( i in config.modules ) {\n\t\tif ( config.modules.hasOwnProperty( i ) ) {\n\t\t\tnumModules += 1;\n\t\t\tmoduleFilterHtml += \"<option value='\" + escapeText( encodeURIComponent(i) ) + \"' \" +\n\t\t\t\t( config.module === i ? \"selected='selected'\" : \"\" ) +\n\t\t\t\t\">\" + escapeText(i) + \"</option>\";\n\t\t}\n\t}\n\tmoduleFilterHtml += \"</select>\";\n\n\t// `userAgent` initialized at top of scope\n\tuserAgent = id( \"qunit-userAgent\" );\n\tif ( userAgent ) {\n\t\tuserAgent.innerHTML = navigator.userAgent;\n\t}\n\n\t// `banner` initialized at top of scope\n\tbanner = id( \"qunit-header\" );\n\tif ( banner ) {\n\t\tbanner.innerHTML = \"<a href='\" + QUnit.url({ filter: undefined, module: undefined, testNumber: undefined }) + \"'>\" + banner.innerHTML + \"</a> \";\n\t}\n\n\t// `toolbar` initialized at top of scope\n\ttoolbar = id( \"qunit-testrunner-toolbar\" );\n\tif ( toolbar ) {\n\t\t// `filter` initialized at top of scope\n\t\tfilter = document.createElement( \"input\" );\n\t\tfilter.type = \"checkbox\";\n\t\tfilter.id = \"qunit-filter-pass\";\n\n\t\taddEvent( filter, \"click\", function() {\n\t\t\tvar tmp,\n\t\t\t\tol = document.getElementById( \"qunit-tests\" );\n\n\t\t\tif ( filter.checked ) {\n\t\t\t\tol.className = ol.className + \" hidepass\";\n\t\t\t} else {\n\t\t\t\ttmp = \" \" + ol.className.replace( /[\\n\\t\\r]/g, \" \" ) + \" \";\n\t\t\t\tol.className = tmp.replace( / hidepass /, \" \" );\n\t\t\t}\n\t\t\tif ( defined.sessionStorage ) {\n\t\t\t\tif (filter.checked) {\n\t\t\t\t\tsessionStorage.setItem( \"qunit-filter-passed-tests\", \"true\" );\n\t\t\t\t} else {\n\t\t\t\t\tsessionStorage.removeItem( \"qunit-filter-passed-tests\" );\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( \"qunit-filter-passed-tests\" ) ) {\n\t\t\tfilter.checked = true;\n\t\t\t// `ol` initialized at top of scope\n\t\t\tol = document.getElementById( \"qunit-tests\" );\n\t\t\tol.className = ol.className + \" hidepass\";\n\t\t}\n\t\ttoolbar.appendChild( filter );\n\n\t\t// `label` initialized at top of scope\n\t\tlabel = document.createElement( \"label\" );\n\t\tlabel.setAttribute( \"for\", \"qunit-filter-pass\" );\n\t\tlabel.setAttribute( \"title\", \"Only show tests and assertons that fail. Stored in sessionStorage.\" );\n\t\tlabel.innerHTML = \"Hide passed tests\";\n\t\ttoolbar.appendChild( label );\n\n\t\turlConfigCheckboxesContainer = document.createElement(\"span\");\n\t\turlConfigCheckboxesContainer.innerHTML = urlConfigHtml;\n\t\turlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName(\"input\");\n\t\t// For oldIE support:\n\t\t// * Add handlers to the individual elements instead of the container\n\t\t// * Use \"click\" instead of \"change\"\n\t\t// * Fallback from event.target to event.srcElement\n\t\taddEvents( urlConfigCheckboxes, \"click\", function( event ) {\n\t\t\tvar params = {},\n\t\t\t\ttarget = event.target || event.srcElement;\n\t\t\tparams[ target.name ] = target.checked ? true : undefined;\n\t\t\twindow.location = QUnit.url( params );\n\t\t});\n\t\ttoolbar.appendChild( urlConfigCheckboxesContainer );\n\n\t\tif (numModules > 1) {\n\t\t\tmoduleFilter = document.createElement( 'span' );\n\t\t\tmoduleFilter.setAttribute( 'id', 'qunit-modulefilter-container' );\n\t\t\tmoduleFilter.innerHTML = moduleFilterHtml;\n\t\t\taddEvent( moduleFilter.lastChild, \"change\", function() {\n\t\t\t\tvar selectBox = moduleFilter.getElementsByTagName(\"select\")[0],\n\t\t\t\t\tselectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);\n\n\t\t\t\twindow.location = QUnit.url( { module: ( selectedModule === \"\" ) ? undefined : selectedModule } );\n\t\t\t});\n\t\t\ttoolbar.appendChild(moduleFilter);\n\t\t}\n\t}\n\n\t// `main` initialized at top of scope\n\tmain = id( \"qunit-fixture\" );\n\tif ( main ) {\n\t\tconfig.fixture = main.innerHTML;\n\t}\n\n\tif ( config.autostart ) {\n\t\tQUnit.start();\n\t}\n};\n\naddEvent( window, \"load\", QUnit.load );\n\n// `onErrorFnPrev` initialized at top of scope\n// Preserve other handlers\nonErrorFnPrev = window.onerror;\n\n// Cover uncaught exceptions\n// Returning true will surpress the default browser handler,\n// returning false will let it run.\nwindow.onerror = function ( error, filePath, linerNr ) {\n\tvar ret = false;\n\tif ( onErrorFnPrev ) {\n\t\tret = onErrorFnPrev( error, filePath, linerNr );\n\t}\n\n\t// Treat return value as window.onerror itself does,\n\t// Only do our handling if not surpressed.\n\tif ( ret !== true ) {\n\t\tif ( QUnit.config.current ) {\n\t\t\tif ( QUnit.config.current.ignoreGlobalErrors ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tQUnit.pushFailure( error, filePath + \":\" + linerNr );\n\t\t} else {\n\t\t\tQUnit.test( \"global failure\", extend( function() {\n\t\t\t\tQUnit.pushFailure( error, filePath + \":\" + linerNr );\n\t\t\t}, { validTest: validTest } ) );\n\t\t}\n\t\treturn false;\n\t}\n\n\treturn ret;\n};\n\nfunction done() {\n\tconfig.autorun = true;\n\n\t// Log the last module results\n\tif ( config.currentModule ) {\n\t\trunLoggingCallbacks( \"moduleDone\", QUnit, {\n\t\t\tname: config.currentModule,\n\t\t\tfailed: config.moduleStats.bad,\n\t\t\tpassed: config.moduleStats.all - config.moduleStats.bad,\n\t\t\ttotal: config.moduleStats.all\n\t\t});\n\t}\n\n\tvar i, key,\n\t\tbanner = id( \"qunit-banner\" ),\n\t\ttests = id( \"qunit-tests\" ),\n\t\truntime = +new Date() - config.started,\n\t\tpassed = config.stats.all - config.stats.bad,\n\t\thtml = [\n\t\t\t\"Tests completed in \",\n\t\t\truntime,\n\t\t\t\" milliseconds.<br/>\",\n\t\t\t\"<span class='passed'>\",\n\t\t\tpassed,\n\t\t\t\"</span> assertions of <span class='total'>\",\n\t\t\tconfig.stats.all,\n\t\t\t\"</span> passed, <span class='failed'>\",\n\t\t\tconfig.stats.bad,\n\t\t\t\"</span> failed.\"\n\t\t].join( \"\" );\n\n\tif ( banner ) {\n\t\tbanner.className = ( config.stats.bad ? \"qunit-fail\" : \"qunit-pass\" );\n\t}\n\n\tif ( tests ) {\n\t\tid( \"qunit-testresult\" ).innerHTML = html;\n\t}\n\n\tif ( config.altertitle && typeof document !== \"undefined\" && document.title ) {\n\t\t// show ✖ for good, ✔ for bad suite result in title\n\t\t// use escape sequences in case file gets loaded with non-utf-8-charset\n\t\tdocument.title = [\n\t\t\t( config.stats.bad ? \"\\u2716\" : \"\\u2714\" ),\n\t\t\tdocument.title.replace( /^[\\u2714\\u2716] /i, \"\" )\n\t\t].join( \" \" );\n\t}\n\n\t// clear own sessionStorage items if all tests passed\n\tif ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) {\n\t\t// `key` & `i` initialized at top of scope\n\t\tfor ( i = 0; i < sessionStorage.length; i++ ) {\n\t\t\tkey = sessionStorage.key( i++ );\n\t\t\tif ( key.indexOf( \"qunit-test-\" ) === 0 ) {\n\t\t\t\tsessionStorage.removeItem( key );\n\t\t\t}\n\t\t}\n\t}\n\n\t// scroll back to top to show results\n\tif ( window.scrollTo ) {\n\t\twindow.scrollTo(0, 0);\n\t}\n\n\trunLoggingCallbacks( \"done\", QUnit, {\n\t\tfailed: config.stats.bad,\n\t\tpassed: passed,\n\t\ttotal: config.stats.all,\n\t\truntime: runtime\n\t});\n}\n\n/** @return Boolean: true if this test should be ran */\nfunction validTest( test ) {\n\tvar include,\n\t\tfilter = config.filter && config.filter.toLowerCase(),\n\t\tmodule = config.module && config.module.toLowerCase(),\n\t\tfullName = (test.module + \": \" + test.testName).toLowerCase();\n\n\t// Internally-generated tests are always valid\n\tif ( test.callback && test.callback.validTest === validTest ) {\n\t\tdelete test.callback.validTest;\n\t\treturn true;\n\t}\n\n\tif ( config.testNumber ) {\n\t\treturn test.testNumber === config.testNumber;\n\t}\n\n\tif ( module && ( !test.module || test.module.toLowerCase() !== module ) ) {\n\t\treturn false;\n\t}\n\n\tif ( !filter ) {\n\t\treturn true;\n\t}\n\n\tinclude = filter.charAt( 0 ) !== \"!\";\n\tif ( !include ) {\n\t\tfilter = filter.slice( 1 );\n\t}\n\n\t// If the filter matches, we need to honour include\n\tif ( fullName.indexOf( filter ) !== -1 ) {\n\t\treturn include;\n\t}\n\n\t// Otherwise, do the opposite\n\treturn !include;\n}\n\n// so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions)\n// Later Safari and IE10 are supposed to support error.stack as well\n// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack\nfunction extractStacktrace( e, offset ) {\n\toffset = offset === undefined ? 3 : offset;\n\n\tvar stack, include, i;\n\n\tif ( e.stacktrace ) {\n\t\t// Opera\n\t\treturn e.stacktrace.split( \"\\n\" )[ offset + 3 ];\n\t} else if ( e.stack ) {\n\t\t// Firefox, Chrome\n\t\tstack = e.stack.split( \"\\n\" );\n\t\tif (/^error$/i.test( stack[0] ) ) {\n\t\t\tstack.shift();\n\t\t}\n\t\tif ( fileName ) {\n\t\t\tinclude = [];\n\t\t\tfor ( i = offset; i < stack.length; i++ ) {\n\t\t\t\tif ( stack[ i ].indexOf( fileName ) !== -1 ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tinclude.push( stack[ i ] );\n\t\t\t}\n\t\t\tif ( include.length ) {\n\t\t\t\treturn include.join( \"\\n\" );\n\t\t\t}\n\t\t}\n\t\treturn stack[ offset ];\n\t} else if ( e.sourceURL ) {\n\t\t// Safari, PhantomJS\n\t\t// hopefully one day Safari provides actual stacktraces\n\t\t// exclude useless self-reference for generated Error objects\n\t\tif ( /qunit.js$/.test( e.sourceURL ) ) {\n\t\t\treturn;\n\t\t}\n\t\t// for actual exceptions, this is useful\n\t\treturn e.sourceURL + \":\" + e.line;\n\t}\n}\nfunction sourceFromStacktrace( offset ) {\n\ttry {\n\t\tthrow new Error();\n\t} catch ( e ) {\n\t\treturn extractStacktrace( e, offset );\n\t}\n}\n\n/**\n * Escape text for attribute or text content.\n */\nfunction escapeText( s ) {\n\tif ( !s ) {\n\t\treturn \"\";\n\t}\n\ts = s + \"\";\n\t// Both single quotes and double quotes (for attributes)\n\treturn s.replace( /['\"<>&]/g, function( s ) {\n\t\tswitch( s ) {\n\t\t\tcase '\\'':\n\t\t\t\treturn '&#039;';\n\t\t\tcase '\"':\n\t\t\t\treturn '&quot;';\n\t\t\tcase '<':\n\t\t\t\treturn '&lt;';\n\t\t\tcase '>':\n\t\t\t\treturn '&gt;';\n\t\t\tcase '&':\n\t\t\t\treturn '&amp;';\n\t\t}\n\t});\n}\n\nfunction synchronize( callback, last ) {\n\tconfig.queue.push( callback );\n\n\tif ( config.autorun && !config.blocking ) {\n\t\tprocess( last );\n\t}\n}\n\nfunction process( last ) {\n\tfunction next() {\n\t\tprocess( last );\n\t}\n\tvar start = new Date().getTime();\n\tconfig.depth = config.depth ? config.depth + 1 : 1;\n\n\twhile ( config.queue.length && !config.blocking ) {\n\t\tif ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {\n\t\t\tconfig.queue.shift()();\n\t\t} else {\n\t\t\twindow.setTimeout( next, 13 );\n\t\t\tbreak;\n\t\t}\n\t}\n\tconfig.depth--;\n\tif ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {\n\t\tdone();\n\t}\n}\n\nfunction saveGlobal() {\n\tconfig.pollution = [];\n\n\tif ( config.noglobals ) {\n\t\tfor ( var key in window ) {\n\t\t\t// in Opera sometimes DOM element ids show up here, ignore them\n\t\t\tif ( !hasOwn.call( window, key ) || /^qunit-test-output/.test( key ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconfig.pollution.push( key );\n\t\t}\n\t}\n}\n\nfunction checkPollution() {\n\tvar newGlobals,\n\t\tdeletedGlobals,\n\t\told = config.pollution;\n\n\tsaveGlobal();\n\n\tnewGlobals = diff( config.pollution, old );\n\tif ( newGlobals.length > 0 ) {\n\t\tQUnit.pushFailure( \"Introduced global variable(s): \" + newGlobals.join(\", \") );\n\t}\n\n\tdeletedGlobals = diff( old, config.pollution );\n\tif ( deletedGlobals.length > 0 ) {\n\t\tQUnit.pushFailure( \"Deleted global variable(s): \" + deletedGlobals.join(\", \") );\n\t}\n}\n\n// returns a new Array with the elements that are in a but not in b\nfunction diff( a, b ) {\n\tvar i, j,\n\t\tresult = a.slice();\n\n\tfor ( i = 0; i < result.length; i++ ) {\n\t\tfor ( j = 0; j < b.length; j++ ) {\n\t\t\tif ( result[i] === b[j] ) {\n\t\t\t\tresult.splice( i, 1 );\n\t\t\t\ti--;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction extend( a, b ) {\n\tfor ( var prop in b ) {\n\t\tif ( b[ prop ] === undefined ) {\n\t\t\tdelete a[ prop ];\n\n\t\t// Avoid \"Member not found\" error in IE8 caused by setting window.constructor\n\t\t} else if ( prop !== \"constructor\" || a !== window ) {\n\t\t\ta[ prop ] = b[ prop ];\n\t\t}\n\t}\n\n\treturn a;\n}\n\n/**\n * @param {HTMLElement} elem\n * @param {string} type\n * @param {Function} fn\n */\nfunction addEvent( elem, type, fn ) {\n\t// Standards-based browsers\n\tif ( elem.addEventListener ) {\n\t\telem.addEventListener( type, fn, false );\n\t// IE\n\t} else {\n\t\telem.attachEvent( \"on\" + type, fn );\n\t}\n}\n\n/**\n * @param {Array|NodeList} elems\n * @param {string} type\n * @param {Function} fn\n */\nfunction addEvents( elems, type, fn ) {\n\tvar i = elems.length;\n\twhile ( i-- ) {\n\t\taddEvent( elems[i], type, fn );\n\t}\n}\n\nfunction hasClass( elem, name ) {\n\treturn (\" \" + elem.className + \" \").indexOf(\" \" + name + \" \") > -1;\n}\n\nfunction addClass( elem, name ) {\n\tif ( !hasClass( elem, name ) ) {\n\t\telem.className += (elem.className ? \" \" : \"\") + name;\n\t}\n}\n\nfunction removeClass( elem, name ) {\n\tvar set = \" \" + elem.className + \" \";\n\t// Class name may appear multiple times\n\twhile ( set.indexOf(\" \" + name + \" \") > -1 ) {\n\t\tset = set.replace(\" \" + name + \" \" , \" \");\n\t}\n\t// If possible, trim it for prettiness, but not neccecarily\n\telem.className = window.jQuery ? jQuery.trim( set ) : ( set.trim ? set.trim() : set );\n}\n\nfunction id( name ) {\n\treturn !!( typeof document !== \"undefined\" && document && document.getElementById ) &&\n\t\tdocument.getElementById( name );\n}\n\nfunction registerLoggingCallback( key ) {\n\treturn function( callback ) {\n\t\tconfig[key].push( callback );\n\t};\n}\n\n// Supports deprecated method of completely overwriting logging callbacks\nfunction runLoggingCallbacks( key, scope, args ) {\n\tvar i, callbacks;\n\tif ( QUnit.hasOwnProperty( key ) ) {\n\t\tQUnit[ key ].call(scope, args );\n\t} else {\n\t\tcallbacks = config[ key ];\n\t\tfor ( i = 0; i < callbacks.length; i++ ) {\n\t\t\tcallbacks[ i ].call( scope, args );\n\t\t}\n\t}\n}\n\n// Test for equality any JavaScript type.\n// Author: Philippe Rathé <prathe@gmail.com>\nQUnit.equiv = (function() {\n\n\t// Call the o related callback with the given arguments.\n\tfunction bindCallbacks( o, callbacks, args ) {\n\t\tvar prop = QUnit.objectType( o );\n\t\tif ( prop ) {\n\t\t\tif ( QUnit.objectType( callbacks[ prop ] ) === \"function\" ) {\n\t\t\t\treturn callbacks[ prop ].apply( callbacks, args );\n\t\t\t} else {\n\t\t\t\treturn callbacks[ prop ]; // or undefined\n\t\t\t}\n\t\t}\n\t}\n\n\t// the real equiv function\n\tvar innerEquiv,\n\t\t// stack to decide between skip/abort functions\n\t\tcallers = [],\n\t\t// stack to avoiding loops from circular referencing\n\t\tparents = [],\n\n\t\tgetProto = Object.getPrototypeOf || function ( obj ) {\n\t\t\treturn obj.__proto__;\n\t\t},\n\t\tcallbacks = (function () {\n\n\t\t\t// for string, boolean, number and null\n\t\t\tfunction useStrictEquality( b, a ) {\n\t\t\t\t/*jshint eqeqeq:false */\n\t\t\t\tif ( b instanceof a.constructor || a instanceof b.constructor ) {\n\t\t\t\t\t// to catch short annotaion VS 'new' annotation of a\n\t\t\t\t\t// declaration\n\t\t\t\t\t// e.g. var i = 1;\n\t\t\t\t\t// var j = new Number(1);\n\t\t\t\t\treturn a == b;\n\t\t\t\t} else {\n\t\t\t\t\treturn a === b;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t\"string\": useStrictEquality,\n\t\t\t\t\"boolean\": useStrictEquality,\n\t\t\t\t\"number\": useStrictEquality,\n\t\t\t\t\"null\": useStrictEquality,\n\t\t\t\t\"undefined\": useStrictEquality,\n\n\t\t\t\t\"nan\": function( b ) {\n\t\t\t\t\treturn isNaN( b );\n\t\t\t\t},\n\n\t\t\t\t\"date\": function( b, a ) {\n\t\t\t\t\treturn QUnit.objectType( b ) === \"date\" && a.valueOf() === b.valueOf();\n\t\t\t\t},\n\n\t\t\t\t\"regexp\": function( b, a ) {\n\t\t\t\t\treturn QUnit.objectType( b ) === \"regexp\" &&\n\t\t\t\t\t\t// the regex itself\n\t\t\t\t\t\ta.source === b.source &&\n\t\t\t\t\t\t// and its modifers\n\t\t\t\t\t\ta.global === b.global &&\n\t\t\t\t\t\t// (gmi) ...\n\t\t\t\t\t\ta.ignoreCase === b.ignoreCase &&\n\t\t\t\t\t\ta.multiline === b.multiline &&\n\t\t\t\t\t\ta.sticky === b.sticky;\n\t\t\t\t},\n\n\t\t\t\t// - skip when the property is a method of an instance (OOP)\n\t\t\t\t// - abort otherwise,\n\t\t\t\t// initial === would have catch identical references anyway\n\t\t\t\t\"function\": function() {\n\t\t\t\t\tvar caller = callers[callers.length - 1];\n\t\t\t\t\treturn caller !== Object && typeof caller !== \"undefined\";\n\t\t\t\t},\n\n\t\t\t\t\"array\": function( b, a ) {\n\t\t\t\t\tvar i, j, len, loop;\n\n\t\t\t\t\t// b could be an object literal here\n\t\t\t\t\tif ( QUnit.objectType( b ) !== \"array\" ) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tlen = a.length;\n\t\t\t\t\tif ( len !== b.length ) {\n\t\t\t\t\t\t// safe and faster\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\t// track reference to avoid circular references\n\t\t\t\t\tparents.push( a );\n\t\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\t\tloop = false;\n\t\t\t\t\t\tfor ( j = 0; j < parents.length; j++ ) {\n\t\t\t\t\t\t\tif ( parents[j] === a[i] ) {\n\t\t\t\t\t\t\t\tloop = true;// dont rewalk array\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( !loop && !innerEquiv(a[i], b[i]) ) {\n\t\t\t\t\t\t\tparents.pop();\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tparents.pop();\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\n\t\t\t\t\"object\": function( b, a ) {\n\t\t\t\t\tvar i, j, loop,\n\t\t\t\t\t\t// Default to true\n\t\t\t\t\t\teq = true,\n\t\t\t\t\t\taProperties = [],\n\t\t\t\t\t\tbProperties = [];\n\n\t\t\t\t\t// comparing constructors is more strict than using\n\t\t\t\t\t// instanceof\n\t\t\t\t\tif ( a.constructor !== b.constructor ) {\n\t\t\t\t\t\t// Allow objects with no prototype to be equivalent to\n\t\t\t\t\t\t// objects with Object as their constructor.\n\t\t\t\t\t\tif ( !(( getProto(a) === null && getProto(b) === Object.prototype ) ||\n\t\t\t\t\t\t\t( getProto(b) === null && getProto(a) === Object.prototype ) ) ) {\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// stack constructor before traversing properties\n\t\t\t\t\tcallers.push( a.constructor );\n\t\t\t\t\t// track reference to avoid circular references\n\t\t\t\t\tparents.push( a );\n\n\t\t\t\t\tfor ( i in a ) { // be strict: don't ensures hasOwnProperty\n\t\t\t\t\t\t\t\t\t// and go deep\n\t\t\t\t\t\tloop = false;\n\t\t\t\t\t\tfor ( j = 0; j < parents.length; j++ ) {\n\t\t\t\t\t\t\tif ( parents[j] === a[i] ) {\n\t\t\t\t\t\t\t\t// don't go down the same path twice\n\t\t\t\t\t\t\t\tloop = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\taProperties.push(i); // collect a's properties\n\n\t\t\t\t\t\tif (!loop && !innerEquiv( a[i], b[i] ) ) {\n\t\t\t\t\t\t\teq = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallers.pop(); // unstack, we are done\n\t\t\t\t\tparents.pop();\n\n\t\t\t\t\tfor ( i in b ) {\n\t\t\t\t\t\tbProperties.push( i ); // collect b's properties\n\t\t\t\t\t}\n\n\t\t\t\t\t// Ensures identical properties name\n\t\t\t\t\treturn eq && innerEquiv( aProperties.sort(), bProperties.sort() );\n\t\t\t\t}\n\t\t\t};\n\t\t}());\n\n\tinnerEquiv = function() { // can take multiple arguments\n\t\tvar args = [].slice.apply( arguments );\n\t\tif ( args.length < 2 ) {\n\t\t\treturn true; // end transition\n\t\t}\n\n\t\treturn (function( a, b ) {\n\t\t\tif ( a === b ) {\n\t\t\t\treturn true; // catch the most you can\n\t\t\t} else if ( a === null || b === null || typeof a === \"undefined\" ||\n\t\t\t\t\ttypeof b === \"undefined\" ||\n\t\t\t\t\tQUnit.objectType(a) !== QUnit.objectType(b) ) {\n\t\t\t\treturn false; // don't lose time with error prone cases\n\t\t\t} else {\n\t\t\t\treturn bindCallbacks(a, callbacks, [ b, a ]);\n\t\t\t}\n\n\t\t\t// apply transition with (1..n) arguments\n\t\t}( args[0], args[1] ) && arguments.callee.apply( this, args.splice(1, args.length - 1 )) );\n\t};\n\n\treturn innerEquiv;\n}());\n\n/**\n * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |\n * http://flesler.blogspot.com Licensed under BSD\n * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008\n *\n * @projectDescription Advanced and extensible data dumping for Javascript.\n * @version 1.0.0\n * @author Ariel Flesler\n * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}\n */\nQUnit.jsDump = (function() {\n\tfunction quote( str ) {\n\t\treturn '\"' + str.toString().replace( /\"/g, '\\\\\"' ) + '\"';\n\t}\n\tfunction literal( o ) {\n\t\treturn o + \"\";\n\t}\n\tfunction join( pre, arr, post ) {\n\t\tvar s = jsDump.separator(),\n\t\t\tbase = jsDump.indent(),\n\t\t\tinner = jsDump.indent(1);\n\t\tif ( arr.join ) {\n\t\t\tarr = arr.join( \",\" + s + inner );\n\t\t}\n\t\tif ( !arr ) {\n\t\t\treturn pre + post;\n\t\t}\n\t\treturn [ pre, inner + arr, base + post ].join(s);\n\t}\n\tfunction array( arr, stack ) {\n\t\tvar i = arr.length, ret = new Array(i);\n\t\tthis.up();\n\t\twhile ( i-- ) {\n\t\t\tret[i] = this.parse( arr[i] , undefined , stack);\n\t\t}\n\t\tthis.down();\n\t\treturn join( \"[\", ret, \"]\" );\n\t}\n\n\tvar reName = /^function (\\w+)/,\n\t\tjsDump = {\n\t\t\t// type is used mostly internally, you can fix a (custom)type in advance\n\t\t\tparse: function( obj, type, stack ) {\n\t\t\t\tstack = stack || [ ];\n\t\t\t\tvar inStack, res,\n\t\t\t\t\tparser = this.parsers[ type || this.typeOf(obj) ];\n\n\t\t\t\ttype = typeof parser;\n\t\t\t\tinStack = inArray( obj, stack );\n\n\t\t\t\tif ( inStack !== -1 ) {\n\t\t\t\t\treturn \"recursion(\" + (inStack - stack.length) + \")\";\n\t\t\t\t}\n\t\t\t\tif ( type === \"function\" )  {\n\t\t\t\t\tstack.push( obj );\n\t\t\t\t\tres = parser.call( this, obj, stack );\n\t\t\t\t\tstack.pop();\n\t\t\t\t\treturn res;\n\t\t\t\t}\n\t\t\t\treturn ( type === \"string\" ) ? parser : this.parsers.error;\n\t\t\t},\n\t\t\ttypeOf: function( obj ) {\n\t\t\t\tvar type;\n\t\t\t\tif ( obj === null ) {\n\t\t\t\t\ttype = \"null\";\n\t\t\t\t} else if ( typeof obj === \"undefined\" ) {\n\t\t\t\t\ttype = \"undefined\";\n\t\t\t\t} else if ( QUnit.is( \"regexp\", obj) ) {\n\t\t\t\t\ttype = \"regexp\";\n\t\t\t\t} else if ( QUnit.is( \"date\", obj) ) {\n\t\t\t\t\ttype = \"date\";\n\t\t\t\t} else if ( QUnit.is( \"function\", obj) ) {\n\t\t\t\t\ttype = \"function\";\n\t\t\t\t} else if ( typeof obj.setInterval !== undefined && typeof obj.document !== \"undefined\" && typeof obj.nodeType === \"undefined\" ) {\n\t\t\t\t\ttype = \"window\";\n\t\t\t\t} else if ( obj.nodeType === 9 ) {\n\t\t\t\t\ttype = \"document\";\n\t\t\t\t} else if ( obj.nodeType ) {\n\t\t\t\t\ttype = \"node\";\n\t\t\t\t} else if (\n\t\t\t\t\t// native arrays\n\t\t\t\t\ttoString.call( obj ) === \"[object Array]\" ||\n\t\t\t\t\t// NodeList objects\n\t\t\t\t\t( typeof obj.length === \"number\" && typeof obj.item !== \"undefined\" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === \"undefined\" ) ) )\n\t\t\t\t) {\n\t\t\t\t\ttype = \"array\";\n\t\t\t\t} else if ( obj.constructor === Error.prototype.constructor ) {\n\t\t\t\t\ttype = \"error\";\n\t\t\t\t} else {\n\t\t\t\t\ttype = typeof obj;\n\t\t\t\t}\n\t\t\t\treturn type;\n\t\t\t},\n\t\t\tseparator: function() {\n\t\t\t\treturn this.multiline ?\tthis.HTML ? \"<br />\" : \"\\n\" : this.HTML ? \"&nbsp;\" : \" \";\n\t\t\t},\n\t\t\t// extra can be a number, shortcut for increasing-calling-decreasing\n\t\t\tindent: function( extra ) {\n\t\t\t\tif ( !this.multiline ) {\n\t\t\t\t\treturn \"\";\n\t\t\t\t}\n\t\t\t\tvar chr = this.indentChar;\n\t\t\t\tif ( this.HTML ) {\n\t\t\t\t\tchr = chr.replace( /\\t/g, \"   \" ).replace( / /g, \"&nbsp;\" );\n\t\t\t\t}\n\t\t\t\treturn new Array( this._depth_ + (extra||0) ).join(chr);\n\t\t\t},\n\t\t\tup: function( a ) {\n\t\t\t\tthis._depth_ += a || 1;\n\t\t\t},\n\t\t\tdown: function( a ) {\n\t\t\t\tthis._depth_ -= a || 1;\n\t\t\t},\n\t\t\tsetParser: function( name, parser ) {\n\t\t\t\tthis.parsers[name] = parser;\n\t\t\t},\n\t\t\t// The next 3 are exposed so you can use them\n\t\t\tquote: quote,\n\t\t\tliteral: literal,\n\t\t\tjoin: join,\n\t\t\t//\n\t\t\t_depth_: 1,\n\t\t\t// This is the list of parsers, to modify them, use jsDump.setParser\n\t\t\tparsers: {\n\t\t\t\twindow: \"[Window]\",\n\t\t\t\tdocument: \"[Document]\",\n\t\t\t\terror: function(error) {\n\t\t\t\t\treturn \"Error(\\\"\" + error.message + \"\\\")\";\n\t\t\t\t},\n\t\t\t\tunknown: \"[Unknown]\",\n\t\t\t\t\"null\": \"null\",\n\t\t\t\t\"undefined\": \"undefined\",\n\t\t\t\t\"function\": function( fn ) {\n\t\t\t\t\tvar ret = \"function\",\n\t\t\t\t\t\t// functions never have name in IE\n\t\t\t\t\t\tname = \"name\" in fn ? fn.name : (reName.exec(fn) || [])[1];\n\n\t\t\t\t\tif ( name ) {\n\t\t\t\t\t\tret += \" \" + name;\n\t\t\t\t\t}\n\t\t\t\t\tret += \"( \";\n\n\t\t\t\t\tret = [ ret, QUnit.jsDump.parse( fn, \"functionArgs\" ), \"){\" ].join( \"\" );\n\t\t\t\t\treturn join( ret, QUnit.jsDump.parse(fn,\"functionCode\" ), \"}\" );\n\t\t\t\t},\n\t\t\t\tarray: array,\n\t\t\t\tnodelist: array,\n\t\t\t\t\"arguments\": array,\n\t\t\t\tobject: function( map, stack ) {\n\t\t\t\t\tvar ret = [ ], keys, key, val, i;\n\t\t\t\t\tQUnit.jsDump.up();\n\t\t\t\t\tkeys = [];\n\t\t\t\t\tfor ( key in map ) {\n\t\t\t\t\t\tkeys.push( key );\n\t\t\t\t\t}\n\t\t\t\t\tkeys.sort();\n\t\t\t\t\tfor ( i = 0; i < keys.length; i++ ) {\n\t\t\t\t\t\tkey = keys[ i ];\n\t\t\t\t\t\tval = map[ key ];\n\t\t\t\t\t\tret.push( QUnit.jsDump.parse( key, \"key\" ) + \": \" + QUnit.jsDump.parse( val, undefined, stack ) );\n\t\t\t\t\t}\n\t\t\t\t\tQUnit.jsDump.down();\n\t\t\t\t\treturn join( \"{\", ret, \"}\" );\n\t\t\t\t},\n\t\t\t\tnode: function( node ) {\n\t\t\t\t\tvar len, i, val,\n\t\t\t\t\t\topen = QUnit.jsDump.HTML ? \"&lt;\" : \"<\",\n\t\t\t\t\t\tclose = QUnit.jsDump.HTML ? \"&gt;\" : \">\",\n\t\t\t\t\t\ttag = node.nodeName.toLowerCase(),\n\t\t\t\t\t\tret = open + tag,\n\t\t\t\t\t\tattrs = node.attributes;\n\n\t\t\t\t\tif ( attrs ) {\n\t\t\t\t\t\tfor ( i = 0, len = attrs.length; i < len; i++ ) {\n\t\t\t\t\t\t\tval = attrs[i].nodeValue;\n\t\t\t\t\t\t\t// IE6 includes all attributes in .attributes, even ones not explicitly set.\n\t\t\t\t\t\t\t// Those have values like undefined, null, 0, false, \"\" or \"inherit\".\n\t\t\t\t\t\t\tif ( val && val !== \"inherit\" ) {\n\t\t\t\t\t\t\t\tret += \" \" + attrs[i].nodeName + \"=\" + QUnit.jsDump.parse( val, \"attribute\" );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tret += close;\n\n\t\t\t\t\t// Show content of TextNode or CDATASection\n\t\t\t\t\tif ( node.nodeType === 3 || node.nodeType === 4 ) {\n\t\t\t\t\t\tret += node.nodeValue;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn ret + open + \"/\" + tag + close;\n\t\t\t\t},\n\t\t\t\t// function calls it internally, it's the arguments part of the function\n\t\t\t\tfunctionArgs: function( fn ) {\n\t\t\t\t\tvar args,\n\t\t\t\t\t\tl = fn.length;\n\n\t\t\t\t\tif ( !l ) {\n\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t}\n\n\t\t\t\t\targs = new Array(l);\n\t\t\t\t\twhile ( l-- ) {\n\t\t\t\t\t\t// 97 is 'a'\n\t\t\t\t\t\targs[l] = String.fromCharCode(97+l);\n\t\t\t\t\t}\n\t\t\t\t\treturn \" \" + args.join( \", \" ) + \" \";\n\t\t\t\t},\n\t\t\t\t// object calls it internally, the key part of an item in a map\n\t\t\t\tkey: quote,\n\t\t\t\t// function calls it internally, it's the content of the function\n\t\t\t\tfunctionCode: \"[code]\",\n\t\t\t\t// node calls it internally, it's an html attribute value\n\t\t\t\tattribute: quote,\n\t\t\t\tstring: quote,\n\t\t\t\tdate: quote,\n\t\t\t\tregexp: literal,\n\t\t\t\tnumber: literal,\n\t\t\t\t\"boolean\": literal\n\t\t\t},\n\t\t\t// if true, entities are escaped ( <, >, \\t, space and \\n )\n\t\t\tHTML: false,\n\t\t\t// indentation unit\n\t\t\tindentChar: \"  \",\n\t\t\t// if true, items in a collection, are separated by a \\n, else just a space.\n\t\t\tmultiline: true\n\t\t};\n\n\treturn jsDump;\n}());\n\n// from jquery.js\nfunction inArray( elem, array ) {\n\tif ( array.indexOf ) {\n\t\treturn array.indexOf( elem );\n\t}\n\n\tfor ( var i = 0, length = array.length; i < length; i++ ) {\n\t\tif ( array[ i ] === elem ) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n/*\n * Javascript Diff Algorithm\n *  By John Resig (http://ejohn.org/)\n *  Modified by Chu Alan \"sprite\"\n *\n * Released under the MIT license.\n *\n * More Info:\n *  http://ejohn.org/projects/javascript-diff-algorithm/\n *\n * Usage: QUnit.diff(expected, actual)\n *\n * QUnit.diff( \"the quick brown fox jumped over\", \"the quick fox jumps over\" ) == \"the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over\"\n */\nQUnit.diff = (function() {\n\t/*jshint eqeqeq:false, eqnull:true */\n\tfunction diff( o, n ) {\n\t\tvar i,\n\t\t\tns = {},\n\t\t\tos = {};\n\n\t\tfor ( i = 0; i < n.length; i++ ) {\n\t\t\tif ( !hasOwn.call( ns, n[i] ) ) {\n\t\t\t\tns[ n[i] ] = {\n\t\t\t\t\trows: [],\n\t\t\t\t\to: null\n\t\t\t\t};\n\t\t\t}\n\t\t\tns[ n[i] ].rows.push( i );\n\t\t}\n\n\t\tfor ( i = 0; i < o.length; i++ ) {\n\t\t\tif ( !hasOwn.call( os, o[i] ) ) {\n\t\t\t\tos[ o[i] ] = {\n\t\t\t\t\trows: [],\n\t\t\t\t\tn: null\n\t\t\t\t};\n\t\t\t}\n\t\t\tos[ o[i] ].rows.push( i );\n\t\t}\n\n\t\tfor ( i in ns ) {\n\t\t\tif ( !hasOwn.call( ns, i ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) {\n\t\t\t\tn[ ns[i].rows[0] ] = {\n\t\t\t\t\ttext: n[ ns[i].rows[0] ],\n\t\t\t\t\trow: os[i].rows[0]\n\t\t\t\t};\n\t\t\t\to[ os[i].rows[0] ] = {\n\t\t\t\t\ttext: o[ os[i].rows[0] ],\n\t\t\t\t\trow: ns[i].rows[0]\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = 0; i < n.length - 1; i++ ) {\n\t\t\tif ( n[i].text != null && n[ i + 1 ].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null &&\n\t\t\t\t\t\tn[ i + 1 ] == o[ n[i].row + 1 ] ) {\n\n\t\t\t\tn[ i + 1 ] = {\n\t\t\t\t\ttext: n[ i + 1 ],\n\t\t\t\t\trow: n[i].row + 1\n\t\t\t\t};\n\t\t\t\to[ n[i].row + 1 ] = {\n\t\t\t\t\ttext: o[ n[i].row + 1 ],\n\t\t\t\t\trow: i + 1\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tfor ( i = n.length - 1; i > 0; i-- ) {\n\t\t\tif ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null &&\n\t\t\t\t\t\tn[ i - 1 ] == o[ n[i].row - 1 ]) {\n\n\t\t\t\tn[ i - 1 ] = {\n\t\t\t\t\ttext: n[ i - 1 ],\n\t\t\t\t\trow: n[i].row - 1\n\t\t\t\t};\n\t\t\t\to[ n[i].row - 1 ] = {\n\t\t\t\t\ttext: o[ n[i].row - 1 ],\n\t\t\t\t\trow: i - 1\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\to: o,\n\t\t\tn: n\n\t\t};\n\t}\n\n\treturn function( o, n ) {\n\t\to = o.replace( /\\s+$/, \"\" );\n\t\tn = n.replace( /\\s+$/, \"\" );\n\n\t\tvar i, pre,\n\t\t\tstr = \"\",\n\t\t\tout = diff( o === \"\" ? [] : o.split(/\\s+/), n === \"\" ? [] : n.split(/\\s+/) ),\n\t\t\toSpace = o.match(/\\s+/g),\n\t\t\tnSpace = n.match(/\\s+/g);\n\n\t\tif ( oSpace == null ) {\n\t\t\toSpace = [ \" \" ];\n\t\t}\n\t\telse {\n\t\t\toSpace.push( \" \" );\n\t\t}\n\n\t\tif ( nSpace == null ) {\n\t\t\tnSpace = [ \" \" ];\n\t\t}\n\t\telse {\n\t\t\tnSpace.push( \" \" );\n\t\t}\n\n\t\tif ( out.n.length === 0 ) {\n\t\t\tfor ( i = 0; i < out.o.length; i++ ) {\n\t\t\t\tstr += \"<del>\" + out.o[i] + oSpace[i] + \"</del>\";\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif ( out.n[0].text == null ) {\n\t\t\t\tfor ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) {\n\t\t\t\t\tstr += \"<del>\" + out.o[n] + oSpace[n] + \"</del>\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( i = 0; i < out.n.length; i++ ) {\n\t\t\t\tif (out.n[i].text == null) {\n\t\t\t\t\tstr += \"<ins>\" + out.n[i] + nSpace[i] + \"</ins>\";\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// `pre` initialized at top of scope\n\t\t\t\t\tpre = \"\";\n\n\t\t\t\t\tfor ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) {\n\t\t\t\t\t\tpre += \"<del>\" + out.o[n] + oSpace[n] + \"</del>\";\n\t\t\t\t\t}\n\t\t\t\t\tstr += \" \" + out.n[i].text + nSpace[i] + pre;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn str;\n\t};\n}());\n\n// for CommonJS enviroments, export everything\nif ( typeof exports !== \"undefined\" ) {\n\textend( exports, QUnit );\n}\n\n// get at whatever the global object is, like window in browsers\n}( (function() {return this;}.call()) ));\n"
  },
  {
    "path": "tests/vendor/rsvp.js",
    "content": "(function(globals) {\nvar define, requireModule;\n\n(function() {\n  var registry = {}, seen = {};\n\n  define = function(name, deps, callback) {\n    registry[name] = { deps: deps, callback: callback };\n  };\n\n  requireModule = function(name) {\n    if (seen[name]) { return seen[name]; }\n    seen[name] = {};\n\n    var mod = registry[name];\n    if (!mod) {\n      throw new Error(\"Module '\" + name + \"' not found.\");\n    }\n\n    var deps = mod.deps,\n        callback = mod.callback,\n        reified = [],\n        exports;\n\n    for (var i=0, l=deps.length; i<l; i++) {\n      if (deps[i] === 'exports') {\n        reified.push(exports = {});\n      } else {\n        reified.push(requireModule(deps[i]));\n      }\n    }\n\n    var value = callback.apply(this, reified);\n    return seen[name] = exports || value;\n  };\n})();\n\ndefine(\"rsvp/all\",\n  [\"rsvp/promise\",\"exports\"],\n  function(__dependency1__, __exports__) {\n    \"use strict\";\n    var Promise = __dependency1__.Promise;\n    /* global toString */\n\n    function all(promises) {\n      if (Object.prototype.toString.call(promises) !== \"[object Array]\") {\n        throw new TypeError('You must pass an array to all.');\n      }\n\n      return new Promise(function(resolve, reject) {\n        var results = [], remaining = promises.length,\n        promise;\n\n        if (remaining === 0) {\n          resolve([]);\n        }\n\n        function resolver(index) {\n          return function(value) {\n            resolveAll(index, value);\n          };\n        }\n\n        function resolveAll(index, value) {\n          results[index] = value;\n          if (--remaining === 0) {\n            resolve(results);\n          }\n        }\n\n        for (var i = 0; i < promises.length; i++) {\n          promise = promises[i];\n\n          if (promise && typeof promise.then === 'function') {\n            promise.then(resolver(i), reject);\n          } else {\n            resolveAll(i, promise);\n          }\n        }\n      });\n    }\n\n    __exports__.all = all;\n  });\ndefine(\"rsvp/async\",\n  [\"exports\"],\n  function(__exports__) {\n    \"use strict\";\n    var browserGlobal = (typeof window !== 'undefined') ? window : {};\n    var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\n    var local = (typeof global !== 'undefined') ? global : this;\n\n    // node\n    function useNextTick() {\n      return function() {\n        process.nextTick(flush);\n      };\n    }\n\n    function useMutationObserver() {\n      var observer = new BrowserMutationObserver(flush);\n      var element = document.createElement('div');\n      observer.observe(element, { attributes: true });\n\n      // Chrome Memory Leak: https://bugs.webkit.org/show_bug.cgi?id=93661\n      window.addEventListener('unload', function(){\n        observer.disconnect();\n        observer = null;\n      }, false);\n\n      return function() {\n        element.setAttribute('drainQueue', 'drainQueue');\n      };\n    }\n\n    function useSetTimeout() {\n      return function() {\n        local.setTimeout(flush, 1);\n      };\n    }\n\n    var queue = [];\n    function flush() {\n      for (var i = 0; i < queue.length; i++) {\n        var tuple = queue[i];\n        var callback = tuple[0], arg = tuple[1];\n        callback(arg);\n      }\n      queue = [];\n    }\n\n    var scheduleFlush;\n\n    // Decide what async method to use to triggering processing of queued callbacks:\n    if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {\n      scheduleFlush = useNextTick();\n    } else if (BrowserMutationObserver) {\n      scheduleFlush = useMutationObserver();\n    } else {\n      scheduleFlush = useSetTimeout();\n    }\n\n    function async(callback, arg) {\n      var length = queue.push([callback, arg]);\n      if (length === 1) {\n        // If length is 1, that means that we need to schedule an async flush.\n        // If additional callbacks are queued before the queue is flushed, they\n        // will be processed by this flush that we are scheduling.\n        scheduleFlush();\n      }\n    }\n\n    __exports__.async = async;\n  });\ndefine(\"rsvp/config\",\n  [\"rsvp/async\",\"exports\"],\n  function(__dependency1__, __exports__) {\n    \"use strict\";\n    var async = __dependency1__.async;\n\n    var config = {};\n    config.async = async;\n\n    __exports__.config = config;\n  });\ndefine(\"rsvp/defer\",\n  [\"rsvp/promise\",\"exports\"],\n  function(__dependency1__, __exports__) {\n    \"use strict\";\n    var Promise = __dependency1__.Promise;\n\n    function defer() {\n      var deferred = {\n        // pre-allocate shape\n        resolve: undefined,\n        reject:  undefined,\n        promise: undefined\n      };\n\n      deferred.promise = new Promise(function(resolve, reject) {\n        deferred.resolve = resolve;\n        deferred.reject = reject;\n      });\n\n      return deferred;\n    }\n\n    __exports__.defer = defer;\n  });\ndefine(\"rsvp/events\",\n  [\"exports\"],\n  function(__exports__) {\n    \"use strict\";\n    var Event = function(type, options) {\n      this.type = type;\n\n      for (var option in options) {\n        if (!options.hasOwnProperty(option)) { continue; }\n\n        this[option] = options[option];\n      }\n    };\n\n    var indexOf = function(callbacks, callback) {\n      for (var i=0, l=callbacks.length; i<l; i++) {\n        if (callbacks[i][0] === callback) { return i; }\n      }\n\n      return -1;\n    };\n\n    var callbacksFor = function(object) {\n      var callbacks = object._promiseCallbacks;\n\n      if (!callbacks) {\n        callbacks = object._promiseCallbacks = {};\n      }\n\n      return callbacks;\n    };\n\n    var EventTarget = {\n      mixin: function(object) {\n        object.on = this.on;\n        object.off = this.off;\n        object.trigger = this.trigger;\n        return object;\n      },\n\n      on: function(eventNames, callback, binding) {\n        var allCallbacks = callbacksFor(this), callbacks, eventName;\n        eventNames = eventNames.split(/\\s+/);\n        binding = binding || this;\n\n        while (eventName = eventNames.shift()) {\n          callbacks = allCallbacks[eventName];\n\n          if (!callbacks) {\n            callbacks = allCallbacks[eventName] = [];\n          }\n\n          if (indexOf(callbacks, callback) === -1) {\n            callbacks.push([callback, binding]);\n          }\n        }\n      },\n\n      off: function(eventNames, callback) {\n        var allCallbacks = callbacksFor(this), callbacks, eventName, index;\n        eventNames = eventNames.split(/\\s+/);\n\n        while (eventName = eventNames.shift()) {\n          if (!callback) {\n            allCallbacks[eventName] = [];\n            continue;\n          }\n\n          callbacks = allCallbacks[eventName];\n\n          index = indexOf(callbacks, callback);\n\n          if (index !== -1) { callbacks.splice(index, 1); }\n        }\n      },\n\n      trigger: function(eventName, options) {\n        var allCallbacks = callbacksFor(this),\n            callbacks, callbackTuple, callback, binding, event;\n\n        if (callbacks = allCallbacks[eventName]) {\n          // Don't cache the callbacks.length since it may grow\n          for (var i=0; i<callbacks.length; i++) {\n            callbackTuple = callbacks[i];\n            callback = callbackTuple[0];\n            binding = callbackTuple[1];\n\n            if (typeof options !== 'object') {\n              options = { detail: options };\n            }\n\n            event = new Event(eventName, options);\n            callback.call(binding, event);\n          }\n        }\n      }\n    };\n\n    __exports__.EventTarget = EventTarget;\n  });\ndefine(\"rsvp/hash\",\n  [\"rsvp/defer\",\"exports\"],\n  function(__dependency1__, __exports__) {\n    \"use strict\";\n    var defer = __dependency1__.defer;\n\n    function size(object) {\n      var s = 0;\n\n      for (var prop in object) {\n        s++;\n      }\n\n      return s;\n    }\n\n    function hash(promises) {\n      var results = {}, deferred = defer(), remaining = size(promises);\n\n      if (remaining === 0) {\n        deferred.resolve({});\n      }\n\n      var resolver = function(prop) {\n        return function(value) {\n          resolveAll(prop, value);\n        };\n      };\n\n      var resolveAll = function(prop, value) {\n        results[prop] = value;\n        if (--remaining === 0) {\n          deferred.resolve(results);\n        }\n      };\n\n      var rejectAll = function(error) {\n        deferred.reject(error);\n      };\n\n      for (var prop in promises) {\n        if (promises[prop] && typeof promises[prop].then === 'function') {\n          promises[prop].then(resolver(prop), rejectAll);\n        } else {\n          resolveAll(prop, promises[prop]);\n        }\n      }\n\n      return deferred.promise;\n    }\n\n    __exports__.hash = hash;\n  });\ndefine(\"rsvp/node\",\n  [\"rsvp/promise\",\"rsvp/all\",\"exports\"],\n  function(__dependency1__, __dependency2__, __exports__) {\n    \"use strict\";\n    var Promise = __dependency1__.Promise;\n    var all = __dependency2__.all;\n\n    function makeNodeCallbackFor(resolve, reject) {\n      return function (error, value) {\n        if (error) {\n          reject(error);\n        } else if (arguments.length > 2) {\n          resolve(Array.prototype.slice.call(arguments, 1));\n        } else {\n          resolve(value);\n        }\n      };\n    }\n\n    function denodeify(nodeFunc) {\n      return function()  {\n        var nodeArgs = Array.prototype.slice.call(arguments), resolve, reject;\n        var thisArg = this;\n\n        var promise = new Promise(function(nodeResolve, nodeReject) {\n          resolve = nodeResolve;\n          reject = nodeReject;\n        });\n\n        all(nodeArgs).then(function(nodeArgs) {\n          nodeArgs.push(makeNodeCallbackFor(resolve, reject));\n\n          try {\n            nodeFunc.apply(thisArg, nodeArgs);\n          } catch(e) {\n            reject(e);\n          }\n        });\n\n        return promise;\n      };\n    }\n\n    __exports__.denodeify = denodeify;\n  });\ndefine(\"rsvp/promise\",\n  [\"rsvp/config\",\"rsvp/events\",\"exports\"],\n  function(__dependency1__, __dependency2__, __exports__) {\n    \"use strict\";\n    var config = __dependency1__.config;\n    var EventTarget = __dependency2__.EventTarget;\n\n    function objectOrFunction(x) {\n      return isFunction(x) || (typeof x === \"object\" && x !== null);\n    }\n\n    function isFunction(x){\n      return typeof x === \"function\";\n    }\n\n    var Promise = function(resolver) {\n      var promise = this,\n      resolved = false;\n\n      if (typeof resolver !== 'function') {\n        throw new TypeError('You must pass a resolver function as the sole argument to the promise constructor');\n      }\n\n      if (!(promise instanceof Promise)) {\n        return new Promise(resolver);\n      }\n\n      var resolvePromise = function(value) {\n        if (resolved) { return; }\n        resolved = true;\n        resolve(promise, value);\n      };\n\n      var rejectPromise = function(value) {\n        if (resolved) { return; }\n        resolved = true;\n        reject(promise, value);\n      };\n\n      this.on('promise:failed', function(event) {\n        this.trigger('error', { detail: event.detail });\n      }, this);\n\n      this.on('error', onerror);\n\n      try {\n        resolver(resolvePromise, rejectPromise);\n      } catch(e) {\n        rejectPromise(e);\n      }\n    };\n\n    function onerror(event) {\n      if (config.onerror) {\n        config.onerror(event.detail);\n      }\n    }\n\n    var invokeCallback = function(type, promise, callback, event) {\n      var hasCallback = isFunction(callback),\n          value, error, succeeded, failed;\n\n      if (hasCallback) {\n        try {\n          value = callback(event.detail);\n          succeeded = true;\n        } catch(e) {\n          failed = true;\n          error = e;\n        }\n      } else {\n        value = event.detail;\n        succeeded = true;\n      }\n\n      if (handleThenable(promise, value)) {\n        return;\n      } else if (hasCallback && succeeded) {\n        resolve(promise, value);\n      } else if (failed) {\n        reject(promise, error);\n      } else if (type === 'resolve') {\n        resolve(promise, value);\n      } else if (type === 'reject') {\n        reject(promise, value);\n      }\n    };\n\n    Promise.prototype = {\n      constructor: Promise,\n\n      isRejected: undefined,\n      isFulfilled: undefined,\n      rejectedReason: undefined,\n      fulfillmentValue: undefined,\n\n      then: function(done, fail) {\n        this.off('error', onerror);\n\n        var thenPromise = new this.constructor(function() {});\n\n        if (this.isFulfilled) {\n          config.async(function(promise) {\n            invokeCallback('resolve', thenPromise, done, { detail: promise.fulfillmentValue });\n          }, this);\n        }\n\n        if (this.isRejected) {\n          config.async(function(promise) {\n            invokeCallback('reject', thenPromise, fail, { detail: promise.rejectedReason });\n          }, this);\n        }\n\n        this.on('promise:resolved', function(event) {\n          invokeCallback('resolve', thenPromise, done, event);\n        });\n\n        this.on('promise:failed', function(event) {\n          invokeCallback('reject', thenPromise, fail, event);\n        });\n\n        return thenPromise;\n      },\n\n      fail: function(fail) {\n        return this.then(null, fail);\n      }\n    };\n\n    EventTarget.mixin(Promise.prototype);\n\n    function resolve(promise, value) {\n      if (promise === value) {\n        fulfill(promise, value);\n      } else if (!handleThenable(promise, value)) {\n        fulfill(promise, value);\n      }\n    }\n\n    function handleThenable(promise, value) {\n      var then = null,\n      resolved;\n\n      try {\n        if (promise === value) {\n          throw new TypeError(\"A promises callback cannot return that same promise.\");\n        }\n\n        if (objectOrFunction(value)) {\n          then = value.then;\n\n          if (isFunction(then)) {\n            then.call(value, function(val) {\n              if (resolved) { return true; }\n              resolved = true;\n\n              if (value !== val) {\n                resolve(promise, val);\n              } else {\n                fulfill(promise, val);\n              }\n            }, function(val) {\n              if (resolved) { return true; }\n              resolved = true;\n\n              reject(promise, val);\n            });\n\n            return true;\n          }\n        }\n      } catch (error) {\n        reject(promise, error);\n        return true;\n      }\n\n      return false;\n    }\n\n    function fulfill(promise, value) {\n      config.async(function() {\n        promise.trigger('promise:resolved', { detail: value });\n        promise.isFulfilled = true;\n        promise.fulfillmentValue = value;\n      });\n    }\n\n    function reject(promise, value) {\n      config.async(function() {\n        promise.trigger('promise:failed', { detail: value });\n        promise.isRejected = true;\n        promise.rejectedReason = value;\n      });\n    }\n\n    __exports__.Promise = Promise;\n  });\ndefine(\"rsvp/reject\",\n  [\"rsvp/promise\",\"exports\"],\n  function(__dependency1__, __exports__) {\n    \"use strict\";\n    var Promise = __dependency1__.Promise;\n\n    function reject(reason) {\n      return new Promise(function (resolve, reject) {\n        reject(reason);\n      });\n    }\n\n    __exports__.reject = reject;\n  });\ndefine(\"rsvp/resolve\",\n  [\"rsvp/promise\",\"exports\"],\n  function(__dependency1__, __exports__) {\n    \"use strict\";\n    var Promise = __dependency1__.Promise;\n\n    function resolve(thenable) {\n      return new Promise(function(resolve, reject) {\n        resolve(thenable);\n      });\n    }\n\n    __exports__.resolve = resolve;\n  });\ndefine(\"rsvp/rethrow\",\n  [\"exports\"],\n  function(__exports__) {\n    \"use strict\";\n    var local = (typeof global === \"undefined\") ? this : global;\n\n    function rethrow(reason) {\n      local.setTimeout(function() {\n        throw reason;\n      });\n      throw reason;\n    }\n\n    __exports__.rethrow = rethrow;\n  });\ndefine(\"rsvp\",\n  [\"rsvp/events\",\"rsvp/promise\",\"rsvp/node\",\"rsvp/all\",\"rsvp/hash\",\"rsvp/rethrow\",\"rsvp/defer\",\"rsvp/config\",\"rsvp/resolve\",\"rsvp/reject\",\"exports\"],\n  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __exports__) {\n    \"use strict\";\n    var EventTarget = __dependency1__.EventTarget;\n    var Promise = __dependency2__.Promise;\n    var denodeify = __dependency3__.denodeify;\n    var all = __dependency4__.all;\n    var hash = __dependency5__.hash;\n    var rethrow = __dependency6__.rethrow;\n    var defer = __dependency7__.defer;\n    var config = __dependency8__.config;\n    var resolve = __dependency9__.resolve;\n    var reject = __dependency10__.reject;\n\n    function configure(name, value) {\n      config[name] = value;\n    }\n\n    __exports__.Promise = Promise;\n    __exports__.EventTarget = EventTarget;\n    __exports__.all = all;\n    __exports__.hash = hash;\n    __exports__.rethrow = rethrow;\n    __exports__.defer = defer;\n    __exports__.denodeify = denodeify;\n    __exports__.configure = configure;\n    __exports__.resolve = resolve;\n    __exports__.reject = reject;\n  });\nwindow.RSVP = requireModule(\"rsvp\");\n})(window);\n"
  },
  {
    "path": "tests/vendor/transducers-0.4.158-min.js",
    "content": "// transducers-js 0.4.158\n// http://github.com/cognitect-labs/transducers-js\n// \n// Copyright 2014-2015 Cognitect. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License..\n;(function(){var d=this;\nfunction f(a){var b=typeof a;if(\"object\"==b)if(a){if(a instanceof Array)return\"array\";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a);if(\"[object Window]\"==c)return\"object\";if(\"[object Array]\"==c||\"number\"==typeof a.length&&\"undefined\"!=typeof a.splice&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"splice\"))return\"array\";if(\"[object Function]\"==c||\"undefined\"!=typeof a.call&&\"undefined\"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable(\"call\"))return\"function\"}else return\"null\";else if(\"function\"==\nb&&\"undefined\"==typeof a.call)return\"object\";return b}function g(a,b){var c=a.split(\".\"),e=d;c[0]in e||!e.execScript||e.execScript(\"var \"+c[0]);for(var k;c.length&&(k=c.shift());)c.length||void 0===b?e[k]?e=e[k]:e=e[k]={}:e[k]=b};var h=\"undefined\"!=typeof Array.isArray?function(a){return Array.isArray(a)}:function(a){return\"array\"==f(a)};function l(a){return function(b){return!a.apply(null,Array.prototype.slice.call(arguments,0))}}function m(a){this.a=a}m.prototype[\"@@transducer/init\"]=function(){throw Error(\"init not implemented\");};m.prototype[\"@@transducer/result\"]=function(a){return a};m.prototype[\"@@transducer/step\"]=function(a,b){return this.a(a,b)};function n(a){return\"function\"==typeof a?new m(a):a}\nfunction p(a){this[\"@@transducer/reduced\"]=!0;this[\"@@transducer/value\"]=a}function q(a){return new p(a)}function r(a){return a instanceof p||a&&a[\"@@transducer/reduced\"]}function t(a){return r(a)?a:q(a)}function u(a){return a[\"@@transducer/value\"]}function v(a){return r(a)?u(a):a}function w(a){return a}\nfunction x(a){var b=arguments.length;if(2==b){var c=arguments[0],e=arguments[1];return function(a){return c(e.apply(null,Array.prototype.slice.call(arguments,0)))}}if(2<b)return y(x,arguments[0],Array.prototype.slice.call(arguments,1))}function z(a,b){this.b=a;this.a=b}z.prototype[\"@@transducer/init\"]=function(){return this.a[\"@@transducer/init\"]()};z.prototype[\"@@transducer/result\"]=function(a){return this.a[\"@@transducer/result\"](a)};\nz.prototype[\"@@transducer/step\"]=function(a,b){return this.a[\"@@transducer/step\"](a,this.b(b))};function A(a){return function(b){return new z(a,b)}}function B(a,b){this.b=a;this.a=b}B.prototype[\"@@transducer/init\"]=function(){return this.a[\"@@transducer/init\"]()};B.prototype[\"@@transducer/result\"]=function(a){return this.a[\"@@transducer/result\"](a)};B.prototype[\"@@transducer/step\"]=function(a,b){return this.b(b)?this.a[\"@@transducer/step\"](a,b):a};\nfunction C(a){return function(b){return new B(a,b)}}function D(a,b){this.b=a;this.a=b}D.prototype[\"@@transducer/init\"]=function(){return this.a[\"@@transducer/init\"]()};D.prototype[\"@@transducer/result\"]=function(a){return this.a[\"@@transducer/result\"](a)};D.prototype[\"@@transducer/step\"]=function(a,b){0<this.b?a=this.a[\"@@transducer/step\"](a,b):a=t(a);this.b--;return a};function E(a,b){this.b=a;this.a=b}E.prototype[\"@@transducer/init\"]=function(){return this.a[\"@@transducer/init\"]()};\nE.prototype[\"@@transducer/result\"]=function(a){return this.a[\"@@transducer/result\"](a)};E.prototype[\"@@transducer/step\"]=function(a,b){return this.b(b)?this.a[\"@@transducer/step\"](a,b):q(a)};function F(a,b){this.b=-1;this.c=a;this.a=b}F.prototype[\"@@transducer/init\"]=function(){return this.a[\"@@transducer/init\"]()};F.prototype[\"@@transducer/result\"]=function(a){return this.a[\"@@transducer/result\"](a)};\nF.prototype[\"@@transducer/step\"]=function(a,b){this.b++;return 0==this.b%this.c?this.a[\"@@transducer/step\"](a,b):a};function G(a,b){this.b=a;this.a=b}G.prototype[\"@@transducer/init\"]=function(){return this.a[\"@@transducer/init\"]()};G.prototype[\"@@transducer/result\"]=function(a){return this.a[\"@@transducer/result\"](a)};G.prototype[\"@@transducer/step\"]=function(a,b){return 0<this.b?(this.b--,a):this.a[\"@@transducer/step\"](a,b)};function H(a,b){this.b=!0;this.c=a;this.a=b}\nH.prototype[\"@@transducer/init\"]=function(){return this.a[\"@@transducer/init\"]()};H.prototype[\"@@transducer/result\"]=function(a){return this.a[\"@@transducer/result\"](a)};H.prototype[\"@@transducer/step\"]=function(a,b){if(this.b&&this.c(b))return a;this.b&&(this.b=!1);return this.a[\"@@transducer/step\"](a,b)};var I={};function J(a,b){this.d=a;this.b=b;this.a=[];this.c=I}J.prototype[\"@@transducer/init\"]=function(){return this.b[\"@@transducer/init\"]()};\nJ.prototype[\"@@transducer/result\"]=function(a){0<this.a.length&&(a=v(this.b[\"@@transducer/step\"](a,this.a)),this.a=[]);return this.b[\"@@transducer/result\"](a)};J.prototype[\"@@transducer/step\"]=function(a,b){var c=this.c,e=this.d(b);this.c=e;if(c==I||c==e)return this.a.push(b),a;c=this.b[\"@@transducer/step\"](a,this.a);this.a=[];r(c)||this.a.push(b);return c};function K(a,b){this.c=a;this.b=b;this.a=[]}K.prototype[\"@@transducer/init\"]=function(){return this.b[\"@@transducer/init\"]()};\nK.prototype[\"@@transducer/result\"]=function(a){0<this.a.length&&(a=v(this.b[\"@@transducer/step\"](a,this.a)),this.a=[]);return this.b[\"@@transducer/result\"](a)};K.prototype[\"@@transducer/step\"]=function(a,b){this.a.push(b);if(this.c==this.a.length){var c=this.a;this.a=[];return this.b[\"@@transducer/step\"](a,c)}return a};function L(a,b){this.b=a;this.a=b}L.prototype[\"@@transducer/init\"]=function(){return this.a[\"@@transducer/init\"]()};L.prototype[\"@@transducer/result\"]=function(a){return this.a[\"@@transducer/result\"](a)};\nL.prototype[\"@@transducer/step\"]=function(a,b){return null==this.b(b)?a:this.a[\"@@transducer/step\"](a,b)};function M(a,b){this.b=-1;this.c=a;this.a=b}M.prototype[\"@@transducer/init\"]=function(){return this.a[\"@@transducer/init\"]()};M.prototype[\"@@transducer/result\"]=function(a){return this.a[\"@@transducer/result\"](a)};M.prototype[\"@@transducer/step\"]=function(a,b){this.b++;return null==this.c(this.b,b)?a:this.a[\"@@transducer/step\"](a,b)};\nfunction N(a){return{\"@@transducer/init\":function(){return a[\"@@transducer/init\"]()},\"@@transducer/result\":function(a){return a},\"@@transducer/step\":function(b,c){var e=a[\"@@transducer/step\"](b,c);return r(e)?q(e):e}}}function O(a){var b=N(a);return{\"@@transducer/init\":function(){return a[\"@@transducer/init\"]()},\"@@transducer/result\":function(b){return a[\"@@transducer/result\"](b)},\"@@transducer/step\":function(a,e){return y(b,a,e)}}}\nfunction y(a,b,c){if(c){a=\"function\"==typeof a?n(a):a;if(\"string\"==typeof c){var e=a;for(a=0;a<c.length;a++)if(b=e[\"@@transducer/step\"](b,c.charAt(a)),r(b)){b=u(b);break}return e[\"@@transducer/result\"](b)}if(h(c)){e=a;for(a=0;a<c.length;a++)if(b=e[\"@@transducer/step\"](b,c[a]),r(b)){b=u(b);break}return e[\"@@transducer/result\"](b)}if(c[\"@@iterator\"]||c.next){e=a;c[\"@@iterator\"]&&(c=c[\"@@iterator\"]());for(a=c.next();!a.done;){b=e[\"@@transducer/step\"](b,a.value);if(r(b)){b=u(b);break}a=c.next()}return e[\"@@transducer/result\"](b)}if(\"object\"==\nf(c)){for(e in c)if(c.hasOwnProperty(e)&&(b=a[\"@@transducer/step\"](b,[e,c[e]]),r(b))){b=u(b);break}return a[\"@@transducer/result\"](b)}throw Error(\"Cannot reduce instance of \"+c.constructor.name);}}function P(a,b,c,e){b=\"function\"==typeof b?n(b):b;a=a(b);return y(a,c,e)}function Q(a,b){return a+b}function R(a,b){a.push(b);return a}function S(a,b){a[b[0]]=b[1];return a}function T(a,b){this.b=a;this.a=b}T.prototype[\"@@transducer/init\"]=function(){return this.a[\"@@transducer/init\"]()};\nT.prototype[\"@@transducer/result\"]=function(a){return this.b(a)};T.prototype[\"@@transducer/step\"]=function(a,b){return this.a[\"@@transducer/step\"](a,b)};var U=n(function(a,b){return q(b)});g(\"transducers.reduced\",q);g(\"transducers.isReduced\",r);g(\"transducers.comp\",x);g(\"transducers.complement\",l);g(\"transducers.transduce\",P);g(\"transducers.reduce\",y);g(\"transducers.map\",A);g(\"transducers.Map\",z);g(\"transducers.filter\",C);g(\"transducers.Filter\",B);g(\"transducers.remove\",function(a){return C(l(a))});\ng(\"transducers.Remove\",{}.e);g(\"transducers.keep\",function(a){return function(b){return new L(a,b)}});g(\"transducers.Keep\",L);g(\"transducers.keepIndexed\",function(a){return function(b){return new M(a,b)}});g(\"transducers.KeepIndexed\",M);g(\"transducers.take\",function(a){return function(b){return new D(a,b)}});g(\"transducers.Take\",D);g(\"transducers.takeWhile\",function(a){return function(b){return new E(a,b)}});g(\"transducers.TakeWhile\",E);\ng(\"transducers.takeNth\",function(a){return function(b){return new F(a,b)}});g(\"transducers.TakeNth\",F);g(\"transducers.drop\",function(a){return function(b){return new G(a,b)}});g(\"transducers.Drop\",G);g(\"transducers.dropWhile\",function(a){return function(b){return new H(a,b)}});g(\"transducers.DropWhile\",H);g(\"transducers.partitionBy\",function(a){return function(b){return new J(a,b)}});g(\"transducers.PartitionBy\",J);g(\"transducers.partitionAll\",function(a){return function(b){return new K(a,b)}});\ng(\"transducers.PartitionAll\",K);g(\"transducers.completing\",function(a,b){a=\"function\"==typeof a?n(a):a;b=b||w;return new T(b,a)});g(\"transducers.Completing\",T);g(\"transducers.wrap\",n);g(\"transducers.Wrap\",m);g(\"transducers.cat\",O);g(\"transducers.mapcat\",function(a){return x(A(a),O)});g(\"transducers.into\",function(a,b,c){if(\"string\"==typeof a)return P(b,Q,a,c);if(h(a))return P(b,R,a,c);if(\"object\"==f(a))return P(b,S,a,c)});\ng(\"transducers.toFn\",function(a,b){\"function\"==typeof b&&(b=n(b));var c=a(b);return c[\"@@transducer/step\"].bind(c)});g(\"transducers.first\",U);g(\"transducers.ensureReduced\",t);g(\"transducers.unreduced\",v);g(\"transducers.deref\",u);})();\n"
  },
  {
    "path": "travis.sh",
    "content": "repo=\"https://${GH_TOKEN}@github.com/$TRAVIS_REPO_SLUG.git\"\n\n# If this is a pull request, we dont want to continue\nif [ \"$TRAVIS_PULL_REQUEST\" != \"false\" ] ; then\n  echo \"Nothing to do on a pull request\"\n  exit 0\nfi\n\n# All Pull requests are to the branch called incoming-pr\n# If this is not that branch, the rest of the script is irrelevant\nif [ \"$TRAVIS_BRANCH\" != \"incoming-pr\" ] ; then\n  echo \"Nothing to do on the master branch\"\n  exit 0\nfi\n\ngit fetch\ngit branch --all\n# This part of the script is run before installing deps or tests\nif [ \"$1\" = \"before\" ] ; then\n\t# So this is incoming-pr branch. Need to check if this is exactly same as the master\n\t# If it is, this branch does not have anything new, so no need to try and build it\n\tincoming_commit=$(git rev-parse HEAD)\n\tgit checkout --orphan master\n\tgit pull origin master --depth=1\n\tmaster_commit=$(git rev-parse HEAD)\n\tif [ \"$incoming_commit\" = \"$master_commit\" ] ; then\n\t\techo \"Not required to build this as this is same as the master branch\"\n\t\texit 1\n\telse\n\t\tgit checkout incoming-pr\n\t\techo \"Current branch is - $(git rev-parse HEAD)\"\n\t\texit 0\n\tfi\nfi\n\ngit checkout incoming-pr\nif [ \"$1\" = \"merge\" ] ; then\n\t# If the build was successful, travis after-success will send merge\n\techo \"Merging incoming-pr to master\"\n\tgit checkout master\n\tgit merge incoming-pr --log\n\tgit push $repo master -q 2> /dev/null\nelse\n\t# If build failed, travis after-failure will send ./travis.sh revert\n\techo \"Reverting dev branch to what master was\"\n\t# Save the current changes to a new branch\n\techo \"Creating a new branch for failed build - incoming-pr-fail-$TRAVIS_BUILD_ID\"\n\tgit checkout -b incoming-pr-fail-$TRAVIS_BUILD_ID\n\tgit push $repo incoming-pr-fail-$TRAVIS_BUILD_ID -q 2> /dev/null\n\tgit checkout master\nfi\n\necho \"Making incoming-pr same as master\"\n# Merge or revert is done, so make incoming-pr branch at par with master\n# This is done to make it ready for accepting the next pull request\ngit push $repo --delete incoming-pr -q 2> /dev/null\ngit branch -D incoming-pr\ngit branch incoming-pr\ngit push $repo incoming-pr -q 2> /dev/null\n"
  },
  {
    "path": "ts/core/abstractobserver.ts",
    "content": "/// <reference path=\"./disposables/disposable.ts\" />\n/// <reference path=\"./observer-lite.ts\" />\nmodule Rx {\n    export module internals {\n        /**\n        * Abstract base class for implementations of the Observer class.\n        * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n        */\n        export interface AbstractObserver<T> extends Rx.IObserver<T>, Rx.IDisposable {\n            /**\n            * Notifies the observer of a new element in the sequence.\n            * @param {Any} value Next element in the sequence.\n            */\n            onNext(value: T): void;\n            /**\n            * Notifies the observer that an exception has occurred.\n            * @param {Any} error The error that has occurred.\n            */\n            onError(exception: any): void;\n            /**\n            * Notifies the observer of the end of the sequence.\n            */\n            onCompleted(): void;\n\n            isStopped: boolean;\n\n            /**\n            * Disposes the observer, causing it to transition to the stopped state.\n            */\n            dispose(): void;\n\n            fail(e: any): boolean;\n\n            // Must be implemented by other observers\n            next(value: T): void;\n            error(error: any): void;\n            completed(): void;\n        }\n\n        interface AbstractObserverStatic {\n            new <T>(): AbstractObserver<T>;\n        }\n\n        export var AbstractObserver: AbstractObserverStatic\n    }\n}\n\n(function() {\n    var iObserver: Rx.IObserver<number>;\n    var abstractObserver: Rx.internals.AbstractObserver<number>;\n\n    iObserver = abstractObserver;\n});\n"
  },
  {
    "path": "ts/core/anonymousobservable.ts",
    "content": "/// <reference path=\"./observable.ts\" />\nmodule Rx {\n    export interface AnonymousObservable<T> extends Observable<T> { }\n}\n\n(function() {\n    var observable: Rx.Observable<number>;\n    var anonymousObservable: Rx.AnonymousObservable<number>;\n\n    observable = anonymousObservable;\n});\n"
  },
  {
    "path": "ts/core/anonymousobserver.ts",
    "content": "/// <reference path=\"./observer-lite.ts\" />\nmodule Rx {\n    /**\n     * Class to create an Observer instance from delegate-based implementations of the on* methods.\n     */\n    export interface AnonymousObserver<T> extends Observer<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n\n    interface AnonymousObserverStatic {\n        /**\n         * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n         * @param {Any} onNext Observer's OnNext action implementation.\n         * @param {Any} onError Observer's OnError action implementation.\n         * @param {Any} onCompleted Observer's OnCompleted action implementation.\n         */\n        new <T>(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): AnonymousObserver<T>;\n    }\n\n    export var AnonymousObserver : AnonymousObserverStatic;\n}\n\n\n(function() {\n    var iObserver: Rx.IObserver<number>;\n    var anonymousObserver: Rx.AnonymousObserver<number>;\n\n    iObserver = anonymousObserver;\n});\n"
  },
  {
    "path": "ts/core/backpressure/controlled.ts",
    "content": "/// <reference path=\"../disposables/disposable.ts\" />\n/// <reference path=\"../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Attaches a controller to the observable sequence with the ability to queue.\n        * @example\n        * var source = Rx.Observable.interval(100).controlled();\n        * source.request(3); // Reads 3 values\n        * @param {bool} enableQueue truthy value to determine if values should be queued pending the next request\n        * @param {Scheduler} scheduler determines how the requests will be scheduled\n        * @returns {Observable} The observable sequence which only propagates values on request.\n        */\n        controlled(enableQueue?: boolean, scheduler?: IScheduler): ControlledObservable<T>;\n    }\n\n    export interface ControlledObservable<T> extends Observable<T> {\n        request(numberOfItems?: number): IDisposable;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<string>;\n    var c = o.controlled();\n\n    var d: Rx.IDisposable = c.request();\n    d = c.request();\n    d = c.request(5);\n});\n"
  },
  {
    "path": "ts/core/backpressure/pausable.ts",
    "content": "/// <reference path=\"../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n         * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n         * @example\n         * var pauser = new Rx.Subject();\n         * var source = Rx.Observable.interval(100).pausable(pauser);\n         * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n         * @returns {Observable} The observable sequence which is paused based upon the pauser.\n         */\n        pausable(pauser?: Observable<boolean>): PausableObservable<T>;\n    }\n\n    export interface PausableObservable<T> extends Observable<T> {\n        pause(): void;\n        resume(): void;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<string>;\n    var b: Rx.Observable<boolean>;\n    var c = o.pausable();\n    var c = o.pausable(b);\n\n    c.pause();\n    c.resume();\n})\n"
  },
  {
    "path": "ts/core/backpressure/pausablebuffered.ts",
    "content": "/// <reference path=\"./pausable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n         * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n         * and yields the values that were buffered while paused.\n         * @example\n         * var pauser = new Rx.Subject();\n         * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n         * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n         * @returns {Observable} The observable sequence which is paused based upon the pauser.\n         */\n        pausableBuffered(pauser?: Observable<boolean>): PausableObservable<T>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<string>;\n    var b: Rx.Observable<boolean>;\n    var c = o.pausableBuffered();\n    var c = o.pausableBuffered(b);\n})\n"
  },
  {
    "path": "ts/core/backpressure/pauser.ts",
    "content": "module Rx {\n    /**\n    * Used to pause and resume streams.\n    */\n    export interface Pauser {\n        /**\n         * Pauses the underlying sequence.\n         */\n        pause(): void;\n\n        /**\n        * Resumes the underlying sequence.\n        */\n        resume(): void;\n    }\n}\n\n(function() {\n    var p: Rx.Pauser;\n\n    p.pause;\n    p.resume;\n})\n"
  },
  {
    "path": "ts/core/backpressure/stopandwait.ts",
    "content": "/// <reference path=\"./controlled.ts\" />\nmodule Rx {\n    export interface ControlledObservable<T> {\n        /**\n         * Attaches a stop and wait observable to the current observable.\n         * @returns {Observable} A stop and wait observable.\n         */\n        stopAndWait(): Observable<T>;\n    }\n}\n\n(function() {\n    var observer: Rx.Observable<boolean>;\n    var controlledObserver: Rx.ControlledObservable<boolean>;\n\tobserver = controlledObserver.stopAndWait();\n})\n"
  },
  {
    "path": "ts/core/backpressure/windowed.ts",
    "content": "/// <reference path=\"./controlled.ts\" />\nmodule Rx {\n    export interface ControlledObservable<T> {\n        /**\n         * Creates a sliding windowed observable based upon the window size.\n         * @param {Number} windowSize The number of items in the window\n         * @returns {Observable} A windowed observable based upon the window size.\n         */\n        windowed(windowSize: number): Observable<T>;\n    }\n}\n\n(function() {\n    var observer: Rx.Observable<boolean>;\n    var controlledObserver: Rx.ControlledObservable<boolean>;\n\tobserver = controlledObserver.windowed(1);\n})\n"
  },
  {
    "path": "ts/core/checkedobserver.ts",
    "content": "/// <reference path=\"./observer-lite.ts\" />\nmodule Rx {\n    export interface CheckedObserver<T> extends Observer<T> {\n        checkAccess(): void;\n    }\n}\n\n\n(function() {\n    var iObserver: Rx.IObserver<number>;\n    var checkedObserver: Rx.CheckedObserver<number>;\n\n    iObserver = checkedObserver;\n    checkedObserver.checkAccess();\n});\n"
  },
  {
    "path": "ts/core/concurrency/currentthreadscheduler.ts",
    "content": "/// <reference path=\"./scheduler.ts\" />\nmodule Rx {\n    export interface ICurrentThreadScheduler extends IScheduler {\n        scheduleRequired(): boolean;\n    }\n\n    export interface SchedulerStatic {\n        currentThread: ICurrentThreadScheduler;\n    }\n}\n\n(function() {\n    var a: Rx.ICurrentThreadScheduler;\n    a.scheduleRequired();\n\n    a = Rx.Scheduler.currentThread;\n})\n"
  },
  {
    "path": "ts/core/concurrency/defaultscheduler.ts",
    "content": "/// <reference path=\"./scheduler.ts\" />\nmodule Rx {\n    export interface SchedulerStatic {\n        default: IScheduler;\n        async: IScheduler;\n    }\n}\n\n(function() {\n    var s : Rx.IScheduler;\n    s = Rx.Scheduler.async;\n    s = Rx.Scheduler.default;\n})\n"
  },
  {
    "path": "ts/core/concurrency/historicalscheduler.ts",
    "content": "/// <reference path=\"./virtualtimescheduler.ts\" />\nmodule Rx {\n    export interface HistoricalScheduler extends VirtualTimeScheduler<number, number> {\n    }\n\n    export var HistoricalScheduler: {\n        /**\n         * Creates a new historical scheduler with the specified initial clock value.\n         * @constructor\n         * @param {Number} initialClock Initial value for the clock.\n         * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n         */\n        new (initialClock: number, comparer: _Comparer<number, number>): HistoricalScheduler;\n    };\n}\n\n(function() {\n    var a: Rx.HistoricalScheduler = new Rx.HistoricalScheduler(1, (a, b) => 1);\n})\n"
  },
  {
    "path": "ts/core/concurrency/immediatescheduler.ts",
    "content": "/// <reference path=\"./scheduler.ts\" />\nmodule Rx {\n    export interface SchedulerStatic {\n        immediate: IScheduler;\n    }\n}\n\n(function() {\n    var s : Rx.IScheduler;\n    s = Rx.Scheduler.immediate;\n})\n"
  },
  {
    "path": "ts/core/concurrency/scheduleditem.ts",
    "content": "/// <reference path=\"./scheduler.ts\" />\n/// <reference path=\"../disposables/booleandisposable.ts\" />\nmodule Rx {\n    export module internals {\n        export interface ScheduledItem<TTime> {\n            scheduler: IScheduler;\n            state: TTime;\n            action: (scheduler: IScheduler, state: any) => IDisposable;\n            dueTime: TTime;\n            comparer: (x: TTime, y: TTime) => number;\n            disposable: SingleAssignmentDisposable;\n\n            invoke(): void;\n            compareTo(other: ScheduledItem<TTime>): number;\n            isCancelled(): boolean;\n            invokeCore(): IDisposable;\n        }\n\n        interface ScheduledItemStatic {\n            new <TTime>(scheduler: IScheduler, state: any, action: (scheduler: IScheduler, state: any) => IDisposable, dueTime: TTime, comparer?: _Comparer<TTime, number>):ScheduledItem<TTime>;\n        }\n\n        export var ScheduledItem: ScheduledItemStatic\n    }\n}\n\n(function() {\n    var item = new Rx.internals.ScheduledItem(Rx.Scheduler.default, {}, (sc, s) => Rx.Disposable.create(() => {}), 100);\n    var item = new Rx.internals.ScheduledItem(Rx.Scheduler.default, {}, (sc, s) => Rx.Disposable.create(() => {}), 100, (x, y) => 500);\n\n    item.scheduler\n    item.state;\n    item.action;\n    item.dueTime;\n    item.comparer;\n    item.disposable;\n\n    item.invoke();\n    var n: number = item.compareTo(item);\n    var b: boolean = item.isCancelled();\n    var d : Rx.IDisposable= item.invokeCore();\n})\n"
  },
  {
    "path": "ts/core/concurrency/scheduleperiodicrecursive.ts",
    "content": "/// <reference path=\"./scheduler.ts\" />\nmodule Rx {\n    export module internals {\n        export interface SchedulePeriodicRecursive {\n            start(): IDisposable;\n        }\n\n        interface SchedulePeriodicRecursiveStatic {\n            new (scheduler: any, state: any, period: any, action: any) : SchedulePeriodicRecursive;\n        }\n\n        export var SchedulePeriodicRecursive: SchedulePeriodicRecursiveStatic;\n    }\n}\n\n(function() {\n    var item = new Rx.internals.SchedulePeriodicRecursive(undefined, undefined, undefined, undefined);\n\n    var d : Rx.IDisposable = item.start();\n})\n"
  },
  {
    "path": "ts/core/concurrency/scheduler.periodic.ts",
    "content": "/// <reference path=\"../disposables/disposable.ts\" />\nmodule Rx {\n    export interface IScheduler {\n        /**\n         * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n         * @param {Mixed} state Initial state passed to the action upon the first iteration.\n         * @param {Number} period Period for running the work periodically.\n         * @param {Function} action Action to be executed, potentially updating the state.\n         * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n         */\n        schedulePeriodic<TState>(state: TState, period: number, action: (state: TState) => TState): IDisposable;\n    }\n}\n\n(function() {\n    var s : Rx.IScheduler;\n\n    var d : Rx.IDisposable = s.schedulePeriodic('state', 100, (s) => s);\n})\n"
  },
  {
    "path": "ts/core/concurrency/scheduler.recursive.ts",
    "content": "/// <reference path=\"../disposables/disposable.ts\" />\nmodule Rx {\n    export interface IScheduler {\n        /**\n         * Schedules an action to be executed recursively.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleRecursive<TState>(state: TState, action: (state: TState, action: (state: TState) => void) => void): IDisposable;\n\n        /**\n         * Schedules an action to be executed recursively after a specified relative due time.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n         * @param {Number}dueTime Relative time after which to execute the action for the first time.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleRecursiveFuture<TState, TTime extends number | Date>(state: TState, dueTime: TTime, action: (state: TState, action: (state: TState, dueTime: TTime) => void) => void): IDisposable;\n    }\n}\n\n(function() {\n    var s: Rx.IScheduler;\n\n    var d: Rx.IDisposable = s.scheduleRecursive('state', (s, a) => Rx.Disposable.empty);\n    var d: Rx.IDisposable = s.scheduleRecursiveFuture('state', 100, (s, a) => Rx.Disposable.empty);\n})\n"
  },
  {
    "path": "ts/core/concurrency/scheduler.ts",
    "content": "/// <reference path=\"../disposables/disposable.ts\" />\nmodule Rx {\n    export interface IScheduler {\n        /** Gets the current time according to the local machine's system clock. */\n        now(): number;\n\n        /**\n          * Schedules an action to be executed.\n          * @param state State passed to the action to be executed.\n          * @param {Function} action Action to be executed.\n          * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n          */\n        schedule<TState>(state: TState, action: (scheduler: IScheduler, state: TState) => IDisposable): IDisposable;\n\n        /**\n         * Schedules an action to be executed after dueTime.\n         * @param state State passed to the action to be executed.\n         * @param {Function} action Action to be executed.\n         * @param {Number} dueTime Relative time after which to execute the action.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleFuture<TState>(state: TState, dueTime: number | Date, action: (scheduler: IScheduler, state: TState) => IDisposable): IDisposable;\n    }\n\n    export interface SchedulerStatic {\n        /** Gets the current time according to the local machine's system clock. */\n        now(): number;\n\n        /**\n         * Normalizes the specified TimeSpan value to a positive value.\n         * @param {Number} timeSpan The time span value to normalize.\n         * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n         */\n        normalize(timeSpan: number): number;\n\n        /** Determines whether the given object is a scheduler */\n        isScheduler(s: any): boolean;\n    }\n\n    /** Provides a set of static properties to access commonly used schedulers. */\n    export var Scheduler: SchedulerStatic;\n}\n\n(function() {\n    var s: Rx.IScheduler;\n\n    var d: Rx.IDisposable = s.schedule('state', (sh, s ) => Rx.Disposable.empty);\n    var d: Rx.IDisposable = s.scheduleFuture('state', 100, (sh, s ) => Rx.Disposable.empty);\n    var n : () => number = Rx.Scheduler.now;\n    var a : number = Rx.Scheduler.normalize(1000);\n})\n"
  },
  {
    "path": "ts/core/concurrency/scheduler.wrappers.ts",
    "content": "/// <reference path=\"../disposables/disposable.ts\" />\nmodule Rx {\n    export interface IScheduler {\n        /**\n         * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n         * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n         * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n         */\n        catch(handler: Function): IScheduler;\n    }\n}\n\n(function() {\n    var s : Rx.IScheduler = Rx.Scheduler.default.catch(() => {});\n})\n"
  },
  {
    "path": "ts/core/concurrency/virtualtimescheduler.ts",
    "content": "/// <reference path=\"../disposables/disposable.ts\" />\n/// <reference path=\"./scheduler.ts\" />\n/// <reference path=\"./scheduleditem.ts\" />\nmodule Rx {\n    export interface VirtualTimeScheduler<TAbsolute, TRelative> extends IScheduler {\n        /**\n         * Adds a relative time value to an absolute time value.\n         * @param {Number} absolute Absolute virtual time value.\n         * @param {Number} relative Relative virtual time value to add.\n         * @return {Number} Resulting absolute virtual time sum value.\n         */\n        add(from: TAbsolute, by: TRelative): TAbsolute;\n\n        /**\n         * Converts an absolute time to a number\n         * @param {Any} The absolute time.\n         * @returns {Number} The absolute time in ms\n         */\n        toAbsoluteTime(duetime: TAbsolute): number;\n\n        /**\n         * Converts the TimeSpan value to a relative virtual time value.\n         * @param {Number} timeSpan TimeSpan value to convert.\n         * @return {Number} Corresponding relative virtual time value.\n         */\n        toRelativeTime(duetime: number): TRelative;\n\n        /**\n         * Starts the virtual time scheduler.\n         */\n        start(): IDisposable;\n\n        /**\n         * Stops the virtual time scheduler.\n         */\n        stop(): void;\n\n        /**\n         * Advances the scheduler's clock to the specified time, running all work till that point.\n         * @param {Number} time Absolute time to advance the scheduler's clock to.\n         */\n        advanceTo(time: TAbsolute): void;\n\n        /**\n         * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n         * @param {Number} time Relative time to advance the scheduler's clock by.\n         */\n        advanceBy(time: TRelative): void;\n\n        /**\n         * Advances the scheduler's clock by the specified relative time.\n         * @param {Number} time Relative time to advance the scheduler's clock by.\n         */\n        sleep(time: TRelative): void;\n\n        isEnabled: boolean;\n\n        /**\n         * Gets the next scheduled item to be executed.\n         * @returns {ScheduledItem} The next scheduled item.\n         */\n        getNext(): internals.ScheduledItem<TAbsolute>;\n\n        /**\n         * Schedules an action to be executed after dueTime.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Number} dueTime Relative time after which to execute the action.\n         * @param {Function} action Action to be executed.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleRelative(state: any, dueTime: TRelative, action: (scheduler: IScheduler, state: any) => IDisposable):IDisposable;\n\n        /**\n         * Schedules an action to be executed at dueTime.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Number} dueTime Absolute time at which to execute the action.\n         * @param {Function} action Action to be executed.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleAbsolute(state: any, dueTime: TAbsolute, action: (scheduler: IScheduler, state: any) => IDisposable):IDisposable;\n    }\n}\n\n(function() {\n    interface TA { }\n    interface TR { }\n    var vts: Rx.VirtualTimeScheduler<TA, TR>;\n\n    var b: boolean = vts.isEnabled;\n    var a: TA = vts.add(100, 500);\n    var n: number = vts.toAbsoluteTime(1000);\n    var r: TR = vts.toRelativeTime(1000);\n    var d: Rx.IDisposable = vts.start();\n    vts.stop();\n    vts.advanceTo(<TA>null);\n    vts.advanceBy(<TR>null);\n    vts.sleep(<TR>null);\n    var i: Rx.internals.ScheduledItem<TA> = vts.getNext();\n    b = vts.isEnabled;\n})\n"
  },
  {
    "path": "ts/core/disposables/booleandisposable.ts",
    "content": "/// <reference path=\"./disposable.ts\" />\nmodule Rx {\n    export interface SingleAssignmentDisposable {\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        getDisposable(): IDisposable;\n\n        setDisposable(value: IDisposable): void;\n    }\n\n    interface SingleAssignmentDisposableStatic {\n        new() : SingleAssignmentDisposable;\n    }\n\n    export var SingleAssignmentDisposable : SingleAssignmentDisposableStatic;\n\n    export interface SerialDisposable {\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        getDisposable(): IDisposable;\n\n        setDisposable(value: IDisposable): void;\n    }\n\n    interface SerialDisposableStatic {\n        new() : SerialDisposable;\n    }\n\n    export var SerialDisposable : SerialDisposableStatic;\n}\n\n(function() {\n    var sad: Rx.SingleAssignmentDisposable = new Rx.SingleAssignmentDisposable();\n    sad.dispose();\n    sad.isDisposed;\n    var d = sad.getDisposable();\n    sad.setDisposable(d);\n    \n    var sad: Rx.SerialDisposable = new Rx.SerialDisposable();\n    sad.dispose();\n    sad.isDisposed;\n    var d = sad.getDisposable();\n    sad.setDisposable(d);\n});\n"
  },
  {
    "path": "ts/core/disposables/compositedisposable.ts",
    "content": "/// <reference path=\"./disposable.ts\" />\nmodule Rx {\n    /**\n     * Represents a group of disposable resources that are disposed together.\n     * @constructor\n     */\n    export interface CompositeDisposable extends Disposable {\n        /**\n         * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n         * @param {Mixed} item Disposable to add.\n         */\n        add(item: IDisposable): void;\n\n        /**\n         * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n         * @param {Mixed} item Disposable to remove.\n         * @returns {Boolean} true if found; false otherwise.\n         */\n        remove(item: IDisposable): void;\n    }\n\n    interface CompositeDisposableStatic {\n        /**\n         * Represents a group of disposable resources that are disposed together.\n         * @constructor\n         */\n        new (...disposables: Rx.IDisposable[]): CompositeDisposable;\n        /**\n         * Represents a group of disposable resources that are disposed together.\n         * @constructor\n         */\n        new(disposables: Rx.IDisposable[]): CompositeDisposable;\n    }\n\n    export var CompositeDisposable: CompositeDisposableStatic;\n}\n\n(function() {\n    var cd = new Rx.CompositeDisposable();\n    var cd = new Rx.CompositeDisposable(Rx.Disposable.create(() => { }));\n    var cd = new Rx.CompositeDisposable([Rx.Disposable.create(() => { })]);\n\n    cd.add(Rx.Disposable.create(() => { }));\n    cd.remove(Rx.Disposable.create(() => { }));\n\n    cd.dispose();\n    cd.isDisposed;\n})\n"
  },
  {
    "path": "ts/core/disposables/disposable.ts",
    "content": "module Rx {\n    export interface IDisposable {\n        dispose(): void;\n    }\n\n    export interface Disposable extends IDisposable {\n        /** Is this value disposed. */\n        isDisposed?: boolean;\n    }\n\n    interface DisposableStatic {\n        /**\n         * Provides a set of static methods for creating Disposables.\n         * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n         */\n        new (action: () => void): Disposable;\n\n        /**\n         * Creates a disposable object that invokes the specified action when disposed.\n         * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n         * @return {Disposable} The disposable object that runs the given action upon disposal.\n         */\n        create(action: () => void): Disposable;\n\n        /**\n         * Gets the disposable that does nothing when disposed.\n         */\n        empty: IDisposable;\n\n        /**\n         * Validates whether the given object is a disposable\n         * @param {Object} Object to test whether it has a dispose method\n         * @returns {Boolean} true if a disposable object, else false.\n         */\n        isDisposable(d: any): boolean;\n    }\n\n    /**\n     * Provides a set of static methods for creating Disposables.\n     * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n     */\n    export var Disposable: DisposableStatic;\n}\n\n(function() {\n    var id: Rx.IDisposable;\n    var d : Rx.Disposable;\n\n    id.dispose();\n    d.dispose();\n\n    d.isDisposed;\n\n    Rx.Disposable.create(() => {})\n    Rx.Disposable.empty;\n    Rx.Disposable.isDisposable(d);\n})\n"
  },
  {
    "path": "ts/core/disposables/refcountdisposable.ts",
    "content": "/// <reference path=\"./disposable.ts\" />\nmodule Rx {\n    /**\n     * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n     */\n    export interface RefCountDisposable extends Disposable {\n\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        /**\n         * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n         * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n         */\n        getDisposable(): IDisposable;\n    }\n\n    interface RefCountDisposableStatic {\n        /**\n         * Initializes a new instance of the RefCountDisposable with the specified disposable.\n         * @constructor\n         * @param {Disposable} disposable Underlying disposable.\n         */\n        new(disposable: IDisposable): RefCountDisposable;\n    }\n\n    export var RefCountDisposable : RefCountDisposableStatic;\n}\n\n(function() {\n    var d = Rx.Disposable.create(() => {});\n    var rcd = new Rx.RefCountDisposable(d);\n    d = rcd.getDisposable();\n    rcd.dispose();\n    rcd.isDisposed;\n})\n"
  },
  {
    "path": "ts/core/es5.ts",
    "content": "module Rx {\n    // Type alias for observables and promises\n    export type ObservableOrPromise<T> = IObservable<T> | Observable<T> | Promise<T>;\n\n    export type ArrayLike<T> = Array<T> | { length: number;[index: number]: T; };\n\n    // Type alias for arrays and array like objects\n    export type ArrayOrIterable<T> = ArrayLike<T>;\n\n    /**\n     * Promise A+\n     */\n    export interface Promise<T> {\n        then<R>(onFulfilled: (value: T) => R|Promise<R>, onRejected: (error: any) => Promise<R>): Promise<R>;\n        then<R>(onFulfilled: (value: T) => R|Promise<R>, onRejected?: (error: any) => R): Promise<R>;\n    }\n\n    /**\n     * Promise A+\n     */\n    export interface IPromise<T> extends Promise<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface IObservable<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface Observable<T> extends IObservable<T> { }\n}\n"
  },
  {
    "path": "ts/core/es6-iterable.d.ts",
    "content": "interface Symbol {\n    /** Returns a string representation of an object. */\n    toString(): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): Object;\n\n    [Symbol.toStringTag]: string;\n}\n\ninterface SymbolConstructor {\n    /**\n      * A reference to the prototype.\n      */\n    prototype: Symbol;\n\n    /**\n      * Returns a new unique Symbol value.\n      * @param  description Description of the new Symbol object.\n      */\n    (description?: string|number): symbol;\n\n    /**\n      * Returns a Symbol object from the global symbol registry matching the given key if found.\n      * Otherwise, returns a new symbol with this key.\n      * @param key key to search for.\n      */\n    for(key: string): symbol;\n\n    /**\n      * Returns a key from the global symbol registry matching the given Symbol if found.\n      * Otherwise, returns a undefined.\n      * @param sym Symbol to find the key for.\n      */\n    keyFor(sym: symbol): string;\n\n    // Well-known Symbols\n\n    /**\n      * A method that determines if a constructor object recognizes an object as one of the\n      * constructor’s instances. Called by the semantics of the instanceof operator.\n      */\n    hasInstance: symbol;\n\n    /**\n      * A Boolean value that if true indicates that an object should flatten to its array elements\n      * by Array.prototype.concat.\n      */\n    isConcatSpreadable: symbol;\n\n    /**\n      * A method that returns the default iterator for an object. Called by the semantics of the\n      * for-of statement.\n      */\n    iterator: symbol;\n\n    /**\n      * A regular expression method that matches the regular expression against a string. Called\n      * by the String.prototype.match method.\n      */\n    match: symbol;\n\n    /**\n      * A regular expression method that replaces matched substrings of a string. Called by the\n      * String.prototype.replace method.\n      */\n    replace: symbol;\n\n    /**\n      * A regular expression method that returns the index within a string that matches the\n      * regular expression. Called by the String.prototype.search method.\n      */\n    search: symbol;\n\n    /**\n      * A function valued property that is the constructor function that is used to create\n      * derived objects.\n      */\n    species: symbol;\n\n    /**\n      * A regular expression method that splits a string at the indices that match the regular\n      * expression. Called by the String.prototype.split method.\n      */\n    split: symbol;\n\n    /**\n      * A method that converts an object to a corresponding primitive value.Called by the ToPrimitive\n      * abstract operation.\n      */\n    toPrimitive: symbol;\n\n    /**\n      * A String value that is used in the creation of the default string description of an object.\n      * Called by the built-in method Object.prototype.toString.\n      */\n    toStringTag: symbol;\n\n    /**\n      * An Object whose own property names are property names that are excluded from the with\n      * environment bindings of the associated objects.\n      */\n    unscopables: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\n\ninterface IteratorResult<T> {\n    done: boolean;\n    value?: T;\n}\n\ninterface Iterator<T> {\n    next(value?: any): IteratorResult<T>;\n    return?(value?: any): IteratorResult<T>;\n    throw?(e?: any): IteratorResult<T>;\n}\n\ninterface Iterable<T> {\n    [Symbol.iterator](): Iterator<T>;\n}\n\ninterface IterableIterator<T> extends Iterator<T> {\n    [Symbol.iterator](): IterableIterator<T>;\n}\n\ninterface WeakMap<K, V> {\n    clear(): void;\n    delete(key: K): boolean;\n    get(key: K): V;\n    has(key: K): boolean;\n    set(key: K, value?: V): WeakMap<K, V>;\n}\n\ninterface WeakMapConstructor {\n    new <K, V>(): WeakMap<K, V>;\n    prototype: WeakMap<any, any>;\n}\n\ndeclare var WeakMap: WeakMapConstructor;\n\ninterface Map<K, V> {\n    clear(): void;\n    delete(key: K): boolean;\n    entries(): IterableIterator<[K, V]>;\n    forEach(callbackfn: (value: V, index: K, map: Map<K, V>) => void, thisArg?: any): void;\n    get(key: K): V;\n    has(key: K): boolean;\n    keys(): IterableIterator<K>;\n    set(key: K, value?: V): Map<K, V>;\n    size: number;\n    values(): IterableIterator<V>;\n    [Symbol.iterator]():IterableIterator<[K,V]>;\n    [Symbol.toStringTag]: string;\n}\n\ninterface MapConstructor {\n    new <K, V>(): Map<K, V>;\n    new <K, V>(iterable: Iterable<[K, V]>): Map<K, V>;\n    prototype: Map<any, any>;\n}\ndeclare var Map: MapConstructor;\n\ninterface Set<T> {\n    add(value: T): Set<T>;\n    clear(): void;\n    delete(value: T): boolean;\n    entries(): IterableIterator<[T, T]>;\n    forEach(callbackfn: (value: T, index: T, set: Set<T>) => void, thisArg?: any): void;\n    has(value: T): boolean;\n    keys(): IterableIterator<T>;\n    size: number;\n    values(): IterableIterator<T>;\n    [Symbol.iterator]():IterableIterator<T>;\n    [Symbol.toStringTag]: string;\n}\n\ninterface SetConstructor {\n    new <T>(): Set<T>;\n    new <T>(iterable: Iterable<T>): Set<T>;\n    prototype: Set<any>;\n}\ndeclare var Set: SetConstructor;\n\ninterface WeakSet<T> {\n    add(value: T): WeakSet<T>;\n    clear(): void;\n    delete(value: T): boolean;\n    has(value: T): boolean;\n    [Symbol.toStringTag]: string;\n}\n\ninterface WeakSetConstructor {\n    new <T>(): WeakSet<T>;\n    new <T>(iterable: Iterable<T>): WeakSet<T>;\n    prototype: WeakSet<any>;\n}\ndeclare var WeakSet: WeakSetConstructor;\n"
  },
  {
    "path": "ts/core/es6-promise.d.ts",
    "content": "\ninterface PromiseLike<T> {\n    /**\n    * Attaches callbacks for the resolution and/or rejection of the Promise.\n    * @param onfulfilled The callback to execute when the Promise is resolved.\n    * @param onrejected The callback to execute when the Promise is rejected.\n    * @returns A Promise for the completion of which ever callback is executed.\n    */\n    then<TResult>(onfulfilled?: (value: T) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): PromiseLike<TResult>;\n    then<TResult>(onfulfilled?: (value: T) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => void): PromiseLike<TResult>;\n}\n\n/**\n * Represents the completion of an asynchronous operation\n */\ninterface Promise<T> {\n    /**\n    * Attaches callbacks for the resolution and/or rejection of the Promise.\n    * @param onfulfilled The callback to execute when the Promise is resolved.\n    * @param onrejected The callback to execute when the Promise is rejected.\n    * @returns A Promise for the completion of which ever callback is executed.\n    */\n    then<TResult>(onfulfilled?: (value: T) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>;\n    then<TResult>(onfulfilled?: (value: T) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => void): Promise<TResult>;\n\n    /**\n     * Attaches a callback for only the rejection of the Promise.\n     * @param onrejected The callback to execute when the Promise is rejected.\n     * @returns A Promise for the completion of the callback.\n     */\n    catch(onrejected?: (reason: any) => T | PromiseLike<T>): Promise<T>;\n    catch(onrejected?: (reason: any) => void): Promise<T>;\n\n    [Symbol.toStringTag]: string;\n}\n\ninterface PromiseConstructor {\n    /**\n      * A reference to the prototype.\n      */\n    prototype: Promise<any>;\n\n    /**\n     * Creates a new Promise.\n     * @param executor A callback used to initialize the promise. This callback is passed two arguments:\n     * a resolve callback used resolve the promise with a value or the result of another promise,\n     * and a reject callback used to reject the promise with a provided reason or error.\n     */\n    new <T>(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void): Promise<T>;\n\n    /**\n     * Creates a Promise that is resolved with an array of results when all of the provided Promises\n     * resolve, or rejected when any Promise is rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    all<T>(values: Iterable<T | PromiseLike<T>>): Promise<T[]>;\n\n    /**\n     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved\n     * or rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    race<T>(values: Iterable<T | PromiseLike<T>>): Promise<T>;\n\n    /**\n     * Creates a new rejected promise for the provided reason.\n     * @param reason The reason the promise was rejected.\n     * @returns A new rejected Promise.\n     */\n    reject(reason: any): Promise<void>;\n\n    /**\n     * Creates a new rejected promise for the provided reason.\n     * @param reason The reason the promise was rejected.\n     * @returns A new rejected Promise.\n     */\n    reject<T>(reason: any): Promise<T>;\n\n    /**\n      * Creates a new resolved promise for the provided value.\n      * @param value A promise.\n      * @returns A promise whose internal state matches the provided promise.\n      */\n    resolve<T>(value: T | PromiseLike<T>): Promise<T>;\n\n    /**\n     * Creates a new resolved promise .\n     * @returns A resolved promise.\n     */\n    resolve(): Promise<void>;\n\n    [Symbol.species]: Function;\n}\n\ndeclare var Promise: PromiseConstructor;\n"
  },
  {
    "path": "ts/core/es6.ts",
    "content": "/// <reference path=\"./es6-iterable.d.ts\" />\n/// <reference path=\"./es6-promise.d.ts\" />\nmodule Rx {\n    // Type alias for observables and promises\n    export type ObservableOrPromise<T> = IObservable<T> | Observable<T> | Promise<T>;\n\n    export type ArrayLike<T> = Array<T> | { length: number;[index: number]: T; };\n\n    // Type alias for arrays and array like objects\n    export type ArrayOrIterable<T> = ArrayLike<T> | Iterable<T>;\n\n    /**\n     * Promise A+\n     */\n    export interface Promise<T> extends PromiseLike<T> { }\n\n    /**\n     * Promise A+\n     */\n    export interface IPromise<T> extends PromiseLike<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface IObservable<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface Observable<T> extends IObservable<T> { }\n}\n"
  },
  {
    "path": "ts/core/internal/bindcallback.ts",
    "content": "module Rx {\n    export module internals {\n        export var bindCallback: (func: Function, thisArg: any, argCount: number) => Function;\n    }\n}\n\n(function() {\n    Rx.internals.bindCallback(() => {}, null, 100);\n});\n"
  },
  {
    "path": "ts/core/internal/errors.ts",
    "content": "module Rx {\n    export module internals {\n        export interface EmptyError extends Error { message: string; }\n        export interface EmptyErrorStatic { new (): EmptyError; }\n\n        export interface ObjectDisposedError extends Error { message: string; }\n        export interface ObjectDisposedErrorStatic { new (): ObjectDisposedError; }\n\n        export interface ArgumentOutOfRangeError extends Error { message: string; }\n        export interface ArgumentOutOfRangeErrorStatic { new (): ArgumentOutOfRangeError; }\n\n        export interface NotSupportedError extends Error { message: string; }\n        export interface NotSupportedErrorStatic { new (): NotSupportedError; }\n\n        export interface NotImplementedError extends Error { message: string; }\n        export interface NotImplementedErrorStatic { new (): NotImplementedError; }\n    }\n\n    export module helpers {\n        export var notImplemented: () => internals.NotImplementedError;\n        export var notSupported: () => internals.NotSupportedError;\n    }\n}\n"
  },
  {
    "path": "ts/core/internal/isequal.ts",
    "content": "module Rx {\n    export module internals {\n        export var isEqual : (left: any, right: any) => boolean;\n    }\n}\n\n(function() {\n    var b : boolean = Rx.internals.isEqual(1, 1);\n});\n"
  },
  {
    "path": "ts/core/internal/priorityqueue.ts",
    "content": "/// <reference path=\"../concurrency/scheduleditem.ts\" />\nmodule Rx {\n    export module internals {\n        // Priority Queue for Scheduling\n        export interface PriorityQueue<TTime> {\n            length: number;\n\n            isHigherPriority(left: number, right: number): boolean;\n            percolate(index: number): void;\n            heapify(index: number): void;\n            peek(): ScheduledItem<TTime>;\n            removeAt(index: number): void;\n            dequeue(): ScheduledItem<TTime>;\n            enqueue(item: ScheduledItem<TTime>): void;\n            remove(item: ScheduledItem<TTime>): boolean;\n        }\n\n        interface PriorityQueueStatic {\n                new <T>(capacity: number) : PriorityQueue<T>;\n                count: number;\n        }\n\n        export var PriorityQueue : PriorityQueueStatic;\n    }\n}\n\n(function() {\n    var queue = new Rx.internals.PriorityQueue<number>(100);\n    var n : number = queue.length\n    var b : boolean = queue.isHigherPriority(1, 100);\n    queue.percolate(100);\n    queue.heapify(100);\n    var item: Rx.internals.ScheduledItem<number> = queue.peek();\n    queue.removeAt(100);\n    var item: Rx.internals.ScheduledItem<number> = queue.dequeue();\n    queue.enqueue(item);\n    b = queue.remove(item);\n\n    n = Rx.internals.PriorityQueue.count;\n});\n"
  },
  {
    "path": "ts/core/internal/util.ts",
    "content": "/// <reference path=\"../disposables/disposable.ts\" />\n/// <reference path=\"../observable.ts\" />\nmodule Rx {\n    export module internals {\n        export var inherits: (child: any, parent: any) => void;\n        export var addProperties: (obj: any, ...sources: any[]) => void;\n        export var addRef: <T>(xs: Observable<T>, r: { getDisposable(): IDisposable; }) => Observable<T>;\n    }\n}\n\n(function() {\n    Rx.internals.inherits(null, null);\n    Rx.internals.addProperties({}, 1, 2, 3);\n    var o: Rx.Observable<number> = Rx.internals.addRef(<Rx.Observable<number>>{}, new Rx.SingleAssignmentDisposable());\n});\n"
  },
  {
    "path": "ts/core/joins/pattern.ts",
    "content": "/// <reference path=\"./plan.ts\" />\n/// <reference path=\"../observable.ts\" />\nmodule Rx {\n    export interface Pattern2<T1, T2> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T3>(other: Observable<T3>): Pattern3<T1, T2, T3>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2) => TR): Plan<TR>;\n    }\n    interface Pattern3<T1, T2, T3> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T4>(other: Observable<T4>): Pattern4<T1, T2, T3, T4>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3) => TR): Plan<TR>;\n    }\n    interface Pattern4<T1, T2, T3, T4> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T5>(other: Observable<T5>): Pattern5<T1, T2, T3, T4, T5>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4) => TR): Plan<TR>;\n    }\n    interface Pattern5<T1, T2, T3, T4, T5> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T6>(other: Observable<T6>): Pattern6<T1, T2, T3, T4, T5, T6>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5) => TR): Plan<TR>;\n    }\n    interface Pattern6<T1, T2, T3, T4, T5, T6> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T7>(other: Observable<T7>): Pattern7<T1, T2, T3, T4, T5, T6, T7>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6) => TR): Plan<TR>;\n    }\n    interface Pattern7<T1, T2, T3, T4, T5, T6, T7> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T8>(other: Observable<T8>): Pattern8<T1, T2, T3, T4, T5, T6, T7, T8>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7) => TR): Plan<TR>;\n    }\n    interface Pattern8<T1, T2, T3, T4, T5, T6, T7, T8> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T9>(other: Observable<T9>): Pattern9<T1, T2, T3, T4, T5, T6, T7, T8, T9>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8) => TR): Plan<TR>;\n    }\n    interface Pattern9<T1, T2, T3, T4, T5, T6, T7, T8, T9> {\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8, item9: T9) => TR): Plan<TR>;\n    }\n}\n"
  },
  {
    "path": "ts/core/joins/plan.ts",
    "content": "module Rx {\n    export class Plan<T> { }\n}\n"
  },
  {
    "path": "ts/core/linq/connectableobservable.ts",
    "content": "/// <reference path=\"../observable.ts\" />\nmodule Rx {\n        export interface ConnectableObservable<T> extends Observable<T> {\n    \t\tconnect(): IDisposable;\n    \t\trefCount(): Observable<T>;\n        }\n}\n\n(function() {\n    var co: Rx.ConnectableObservable<boolean>;\n\n    var d : Rx.IDisposable = co.connect();\n    var o : Rx.Observable<boolean> = co.refCount();\n});\n"
  },
  {
    "path": "ts/core/linq/groupedobservable.ts",
    "content": "/// <reference path=\"../observable.ts\" />\nmodule Rx {\n    export interface GroupedObservable<TKey, TElement> extends Observable<TElement> {\n        key: TKey;\n        underlyingObservable: Observable<TElement>;\n    }\n}\n\n(function() {\n    var go: Rx.GroupedObservable<string, boolean>;\n\n    var k: string = go.key;\n    var o : Rx.Observable<boolean> = go.underlyingObservable;\n});\n"
  },
  {
    "path": "ts/core/linq/observable/amb.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n        */\n        amb<T>(observables: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n        */\n        amb<T>(...observables: ObservableOrPromise<T>[]): Observable<T>;\n    }\n}\n\n(function() {\n    var p : Rx.Promise<boolean>;\n    var o : Rx.Observable<boolean>;\n    var io : Rx.IObservable<boolean>;\n\n    var any: Rx.Observable<boolean> = Rx.Observable.amb(p, o, io, p, o, io);\n    var any: Rx.Observable<boolean> = Rx.Observable.amb(p, p);\n    var any: Rx.Observable<boolean> = Rx.Observable.amb(o, o);\n    var any: Rx.Observable<boolean> = Rx.Observable.amb(io, io);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/ambproto.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @param {Observable} rightSource Second observable sequence or Promise.\n        * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n        */\n        amb(observable: ObservableOrPromise<T>): Observable<T>;\n    }\n}\n\n(function() {\n    var r : Rx.Observable<string>;\n    var o : Rx.Observable<string>;\n    var io : Rx.IObservable<string>;\n    var p : Rx.Promise<string>;\n\n    r = r.amb(o);\n    r = r.amb(io);\n    r = r.amb(p);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/and.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../joins/pattern.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Creates a pattern that matches when both observable sequences have an available value.\n        *\n        *  @param right Observable sequence to match with the current sequence.\n        *  @return {Pattern} Pattern object that matches when both observable sequences have an available value.\n        */\n        and<T2>(right: Observable<T2>): Pattern2<T, T2>;\n    }\n}\n\n(function() {\n    var r: Rx.Observable<string>;\n    interface A { }\n    var a: Rx.Observable<A>;\n\n    interface B { }\n    var b: Rx.Observable<B>;\n\n    interface C { }\n    var c: Rx.Observable<C>;\n\n    var n: Rx.Observable<number> = Rx.Observable.when(\n        r.and(a).and(b).and(c).thenDo((r, a, b, c) => {\n            return 123;\n        })\n    );\n});\n"
  },
  {
    "path": "ts/core/linq/observable/asobservable.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n       *  Hides the identity of an observable sequence.\n       * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n       */\n        asObservable(): Observable<T>;\n    }\n}\n\n(function() {\n    var s : Rx.Subject<boolean>;\n\n    var o : Rx.Observable<boolean> = s.asObservable();\n});\n"
  },
  {
    "path": "ts/core/linq/observable/average.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Computes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present.\n        * @param {Function} [selector] A transform function to apply to each element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element with the average of the sequence of values.\n        */\n        average(keySelector?: _Selector<T, number>, thisArg?: any): Observable<number>;\n    }\n}\n\n(function () {\n    var os : Rx.Observable<string>;\n    var on : Rx.Observable<number>;\n\n    on.average();\n    os.average((v, i, s) => v.length + i);\n    os.average((v, i, s) => v.length + i, {});\n});\n"
  },
  {
    "path": "ts/core/linq/observable/buffer.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers.\n        *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        buffer<TBufferOpening>(bufferOpenings: Observable<TBufferOpening>): Observable<T[]>;\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers.\n        *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        buffer<TBufferClosing>(bufferClosingSelector: () => Observable<TBufferClosing>): Observable<T[]>;\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers.\n        *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        buffer<TBufferOpening, TBufferClosing>(bufferOpenings: Observable<TBufferOpening>, bufferClosingSelector: () => Observable<TBufferClosing>): Observable<T[]>;\n    }\n}\n\n(function() {\n    var o : Rx.Observable<string>;\n    var open : Rx.Observable<boolean>;\n\n    var so : Rx.Observable<string[]> = o.buffer(open);\n    so = o.buffer(() => Rx.Observable.timer(100));\n    so = o.buffer(open, () => Rx.Observable.timer(100));\n});\n"
  },
  {
    "path": "ts/core/linq/observable/bufferwithcount.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n        * @param {Number} count Length of each buffer.\n        * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithCount(count: number, skip?: number): Observable<T[]>;\n    }\n}\n\n(function() {\n    var o : Rx.Observable<string>;\n\n    var so : Rx.Observable<string[]> = o.bufferWithCount(100);\n    so = o.bufferWithCount(100, 5);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/bufferwithtime.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n        * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n        * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithTime(timeSpan: number, timeShift: number, scheduler?: IScheduler): Observable<T[]>;\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n        * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n        * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithTime(timeSpan: number, scheduler?: IScheduler): Observable<T[]>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<string>;\n\n    var so: Rx.Observable<string[]> = o.bufferWithTime(100);\n    so = o.bufferWithTime(100, 5);\n    var so: Rx.Observable<string[]> = o.bufferWithTime(100, Rx.Scheduler.async);\n    so = o.bufferWithTime(100, 5, Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/bufferwithtimeorcount.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed.\n        * @param {Number} timeSpan Maximum time length of a buffer.\n        * @param {Number} count Maximum element count of a buffer.\n        * @param {Scheduler} [scheduler]  Scheduler to run bufferin timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithTimeOrCount(timeSpan: number, count: number, scheduler?: IScheduler): Observable<T[]>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<string>;\n    var so: Rx.Observable<string[]> = o.bufferWithTimeOrCount(100, 200);\n    var so: Rx.Observable<string[]> = o.bufferWithTimeOrCount(100, 200, Rx.Scheduler.default);\n})\n"
  },
  {
    "path": "ts/core/linq/observable/case.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        *  Uses selector to determine which source in sources to use.\n        * @param {Function} selector The function which extracts the value for to test in a case statement.\n        * @param {Array} sources A object which has keys which correspond to the case statement labels.\n        * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n        *\n        * @returns {Observable} An observable sequence which is determined by a case statement.\n        */\n        case<T>(selector: () => string, sources: { [key: string]: ObservableOrPromise<T>; }, schedulerOrElseSource?: IScheduler | ObservableOrPromise<T>): Observable<T>;\n        /**\n        *  Uses selector to determine which source in sources to use.\n        * @param {Function} selector The function which extracts the value for to test in a case statement.\n        * @param {Array} sources A object which has keys which correspond to the case statement labels.\n        * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n        *\n        * @returns {Observable} An observable sequence which is determined by a case statement.\n        */\n        case<T>(selector: () => number, sources: { [key: number]: ObservableOrPromise<T>; }, schedulerOrElseSource?: IScheduler | ObservableOrPromise<T>): Observable<T>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<string>;\n    var p: Rx.Promise<string>;\n    var e: Rx.Observable<string>;\n    var on: Rx.Observable<number>;\n    var pn: Rx.Promise<number>;\n    var en: Rx.Observable<number>;\n\n    var so : { [key: string]: Rx.ObservableOrPromise<string>; } = {};\n    so['abc'] = p;\n    so['def'] = e;\n    so['xyz'] = o;\n\n    var no : { [key: number]: Rx.ObservableOrPromise<number>; } = {}\n    no[1] = pn;\n    no[2] = en;\n    no[3] = on;\n\n    o = Rx.Observable.case(() => 'abc', so)\n    o = Rx.Observable.case(() => 'abc', so, e)\n    o = Rx.Observable.case(() => 'abc', so, Rx.Scheduler.async);\n\n    on = Rx.Observable.case(() => 1, no)\n    on = Rx.Observable.case(() => 2, no, en);\n    on = Rx.Observable.case(() => 3, no, Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/catch.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n        * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n        */\n        catch<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n        * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n        */\n        catch<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n}\n\n(function() {\n    var o : Rx.Observable<string>;\n    var io : Rx.IObservable<string>;\n    var p : Rx.Promise<string>;\n\n    var t = [o, p, o, p, io];\n    o = Rx.Observable.catch(o, p, o, p, io);\n    o = Rx.Observable.catch(...t);\n    o = Rx.Observable.catch(t);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/catchproto.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n        * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n        */\n        catch(handler: (exception: any) => ObservableOrPromise<T>): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n        * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n        */\n        catch(second: ObservableOrPromise<T>): Observable<T>;\n    }\n}\n\n(function() {\n\n    var o: Rx.Observable<string>;\n    var io: Rx.IObservable<string>;\n    var p: Rx.Promise<string>;\n\n    o = o.catch((e) => o);\n    o = o.catch((e) => io);\n    o = o.catch((e) => p);\n\n    o = o.catch(o);\n    o = o.catch(io);\n    o = o.catch(p);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/combinelatest.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, eventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, T9, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther, TResult>(sources: ObservableOrPromise<TOther>[], resultSelector: (...otherValues: TOther[]) => TResult): Observable<TResult>;\n\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>): Observable<[T, T2]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>): Observable<[T, T2, T3]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>): Observable<[T, T2, T3, T4]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>): Observable<[T, T2, T3, T4, T5]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>): Observable<[T, T2, T3, T4, T5, T6]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>): Observable<[T, T2, T3, T4, T5, T6, T7]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>): Observable<[T, T2, T3, T4, T5, T6, T7, T8]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, T9>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>): Observable<[T, T2, T3, T4, T5, T6, T7, T8, T9]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<TOther>(sources: ObservableOrPromise<TOther>[]): Observable<TOther[]>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<boolean>;\n    var io: Rx.IObservable<string>;\n    var so: Rx.Subject<number>;\n    var p: Rx.Promise<{ a: string }>;\n\n    var r1: Rx.Observable<{ vo: boolean, vio: string, vp: { a: string }, vso: number }> = Rx.Observable.combineLatest(o, io, p, so, (vo, vio, vp, vso) => ({ vo, vio, vp, vso }));\n\n    var r2: Rx.Observable<[boolean, string, { a: string }, number]> = Rx.Observable.combineLatest(o, io, p, so);\n\n    var r3 : Rx.Observable<number> = Rx.Observable.combineLatest(<any[]>[o, io, so, p], (items) => 5);\n\n    var r4: Rx.Observable<any[]> = Rx.Observable.combineLatest(<any[]>[o, io, so, p]);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/combinelatestproto.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther, TResult>(sources: ObservableOrPromise<TOther>[], resultSelector: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2>(second: ObservableOrPromise<T2>): Observable<[T, T2]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>): Observable<[T, T2, T3]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>): Observable<[T, T2, T3, T4]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>): Observable<[T, T2, T3, T4, T5]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>): Observable<[T, T2, T3, T4, T5, T6]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>): Observable<[T, T2, T3, T4, T5, T6, T7]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>): Observable<[T, T2, T3, T4, T5, T6, T7, T8]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, T9>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>): Observable<[T, T2, T3, T4, T5, T6, T7, T8, T9]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther>(sources: ObservableOrPromise<TOther>[]): Observable<TOther[]>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<boolean>;\n    var io: Rx.IObservable<string>;\n    var so: Rx.Subject<number>;\n    var p: Rx.Promise<{ a: string }>;\n\n    var r1: Rx.Observable<{ vo: boolean, vio: string, vp: { a: string }, vso: number }> = o.combineLatest(io, p, so, (vo, vio, vp, vso) => ({ vo, vio, vp, vso }));\n\n    var r2 : Rx.Observable<[boolean, string, { a: string }, number]> = o.combineLatest(io, p, so);\n\n    var r3 : Rx.Observable<number> = o.combineLatest(<any[]>[io, so, p], (v1, items) => 5);\n\n    var r4 : Rx.Observable<any[]> = o.combineLatest(<any[]>[io, so, p]);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/concat.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        * Concatenates all the observable sequences.\n        * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Concatenates all the observable sequences.\n        * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n}\n\n(function() {\n\n    var o: Rx.Observable<string>;\n    var io: Rx.IObservable<string>;\n    var so: Rx.Subject<string>;\n    var p: Rx.Promise<string>;\n\n    var o: Rx.Observable<string> = Rx.Observable.concat(o, io, so, p);\n    var o: Rx.Observable<string> = Rx.Observable.concat([o, io, so, p]);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/concatall.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n          * Concatenates an observable sequence of observable sequences.\n          * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n          */\n        concatAll(): T;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<Rx.Observable<string>>;\n\n    var oo : Rx.Observable<string> = o.concatAll();\n});\n"
  },
  {
    "path": "ts/core/linq/observable/concatmap.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n}\n\n\n(function() {\n    var os: Rx.Observable<string>;\n    var on: Rx.Observable<number>;\n\n    on = os.concatMap((v, i) => Rx.Observable.range(0, i));\n    os = os.concatMap(z => Rx.Observable.just('abc').toPromise());\n    on = os.concatMap(z => [1, 2, 3]);\n\n    os = os.concatMap((v, i) => Rx.Observable.range(0, i), (v1, v2, i) => v2.toString());\n    on = os.concatMap(z => Rx.Observable.just('abc').toPromise(), (v1, v2, i) => i);\n    on = os.concatMap(z => [1, 2, 3], (v1, v2, i) => i);\n\n    os.concatMap(on);\n    os = os.concatMap(Rx.Observable.range(0, 5), (v1, v2, i) => v2.toString());\n    on = os.concatMap(Rx.Observable.just('abc').toPromise(), (v1, v2, i) => i);\n    on = os.concatMap([1, 2, 3], (v1, v2, i) => i);\n\n    on = os.selectConcat((v, i) => Rx.Observable.range(0, i));\n\n    on = os.selectConcat((v, i) => Rx.Observable.range(0, i));\n    os = os.selectConcat(z => Rx.Observable.just('abc').toPromise());\n    on = os.selectConcat(z => [1, 2, 3]);\n\n    os = os.selectConcat((v, i) => Rx.Observable.range(0, i), (v1, v2, i) => v2.toString());\n    on = os.selectConcat(z => Rx.Observable.just('abc').toPromise(), (v1, v2, i) => i);\n    on = os.selectConcat(z => [1, 2, 3], (v1, v2, i) => i);\n\n    os.selectConcat(on);\n    os = os.selectConcat(Rx.Observable.range(0, 5), (v1, v2, i) => v2.toString());\n    on = os.selectConcat(Rx.Observable.just('abc').toPromise(), (v1, v2, i) => i);\n    on = os.selectConcat([1, 2, 3], (v1, v2, i) => i);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/concatmapobserver.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        concatMapObserver<T, TResult>(onNext: (value: T, i: number) => ObservableOrPromise<TResult>, onError: (error: any) => ObservableOrPromise<any>, onCompleted: () => ObservableOrPromise<any>, thisArg?: any): Observable<TResult>;\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        selectConcatObserver<T, TResult>(onNext: (value: T, i: number) => ObservableOrPromise<TResult>, onError: (error: any) => ObservableOrPromise<any>, onCompleted: () => ObservableOrPromise<any>, thisArg?: any): Observable<TResult>;\n    }\n}\n\n\n(function() {\n    var os: Rx.Observable<string>;\n    var on: Rx.Observable<number>;\n\n    os.concatMapObserver((v, i) => Rx.Observable.just(i), (e) => Rx.Observable.just(e), () => Rx.Observable.empty());\n    os.selectConcatObserver((v, i) => Rx.Observable.just(i), (e) => Rx.Observable.just(e), () => Rx.Observable.empty());\n\n    os.concatMapObserver((v, i) => Rx.Observable.just(i), (e) => Rx.Observable.just(e), () => Rx.Observable.empty(), {});\n    os.selectConcatObserver((v, i) => Rx.Observable.just(i), (e) => Rx.Observable.just(e), () => Rx.Observable.empty(), {});\n});\n"
  },
  {
    "path": "ts/core/linq/observable/concatproto.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat(...sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<string>;\n    var io: Rx.IObservable<string>;\n    var so: Rx.Subject<string>;\n    var p: Rx.Promise<string>;\n\n    var o: Rx.Observable<string> = o.concat(o, io, so, p);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/count.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence containing a value that represents how many elements in the specified observable sequence satisfy a condition if provided, else the count of items.\n        * @example\n        * res = source.count();\n        * res = source.count(function (x) { return x > 3; });\n        * @param {Function} [predicate]A function to test each element for a condition.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element with a number that represents how many elements in the input sequence satisfy the condition in the predicate function if provided, else the count of items in the sequence.\n        */\n        count(predicate?: _Predicate<T>, thisArg?: any): Observable<number>;\n    }\n}\n\n\n(function () {\n    var os : Rx.Observable<string>;\n    var on : Rx.Observable<number>;\n\n    on.count();\n    os.count((v, i, s) => false);\n    os.count((v, i, s) => true, {});\n});\n"
  },
  {
    "path": "ts/core/linq/observable/create.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../observer-lite.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        *  Creates an observable sequence from a specified subscribe method implementation.\n        * @example\n        *  var res = Rx.Observable.create(function (observer) { return function () { } );\n        *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n        *  var res = Rx.Observable.create(function (observer) { } );\n        * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n        * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n        */\n        create<T>(subscribe: (observer: Observer<T>) => IDisposable | Function | void): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<string>;\n    o = Rx.Observable.create<string>(o => {});\n    o = Rx.Observable.create<string>(o => Rx.Disposable.empty);\n    o = Rx.Observable.create<string>(o => () => {});\n});\n"
  },
  {
    "path": "ts/core/linq/observable/debounce.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Ignores values from an observable sequence which are followed by another value before dueTime.\n        * @param {Number} dueTime Duration of the debounce period for each value (specified as an integer denoting milliseconds).\n        * @param {Scheduler} [scheduler]  Scheduler to run the debounce timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The debounced sequence.\n        */\n        debounce(dueTime: number, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        * Ignores values from an observable sequence which are followed by another value within a computed throttle duration.\n        * @param {Function} durationSelector Selector function to retrieve a sequence indicating the throttle duration for each given element.\n        * @returns {Observable} The debounced sequence.\n        */\n        debounce(debounceDurationSelector: (item: T) => ObservableOrPromise<any>): Observable<T>;\n    }\n}\n\n(function () {\n    var o: Rx.Observable<string>;\n    o.debounce(100);\n    o.debounce(100, Rx.Scheduler.async);\n    o.debounce(x => Rx.Observable.just(x.length));\n});\n"
  },
  {
    "path": "ts/core/linq/observable/defaultifempty.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n        *\n        *  var res = obs = xs.defaultIfEmpty();\n        *  2 - obs = xs.defaultIfEmpty(false);\n        *\n        * @memberOf Observable#\n        * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n        * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n        */\n        defaultIfEmpty(defaultValue?: T): Observable<T>;\n    }\n}\n\n\n(function () {\n    var o: Rx.Observable<string>;\n    o.defaultIfEmpty();\n    o.defaultIfEmpty('default');\n});\n"
  },
  {
    "path": "ts/core/linq/observable/defer.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n          *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n          *\n          * @example\n          *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n          * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n          * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n          */\n        defer<T>(observableFactory: () => ObservableOrPromise<T>): Observable<T>;\n    }\n}\n\n(function () {\n    var o: Rx.Observable<string>;\n    Rx.Observable.defer(() => o);\n    Rx.Observable.defer(() => o.toPromise());\n});\n"
  },
  {
    "path": "ts/core/linq/observable/delay.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n        *\n        * @example\n        *  1 - res = Rx.Observable.delay(new Date());\n        *  2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout);\n        *\n        *  3 - res = Rx.Observable.delay(5000);\n        *  4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout);\n        * @memberOf Observable#\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n        * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(dueTime: Date, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n        *\n        * @example\n        *  1 - res = Rx.Observable.delay(new Date());\n        *  2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout);\n        *\n        *  3 - res = Rx.Observable.delay(5000);\n        *  4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout);\n        * @memberOf Observable#\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n        * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(dueTime: number, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Time shifts the observable sequence based on a subscription delay and a delay selector function for each element.\n        *\n        * @example\n        *  1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only\n        *  1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector\n        *\n        * @param {Observable} [subscriptionDelay]  Sequence indicating the delay for the subscription to the source.\n        * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(delayDurationSelector: (item: T) => ObservableOrPromise<number>): Observable<T>;\n\n        /**\n        *  Time shifts the observable sequence based on a subscription delay and a delay selector function for each element.\n        *\n        * @example\n        *  1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only\n        *  1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector\n        *\n        * @param {Observable} [subscriptionDelay]  Sequence indicating the delay for the subscription to the source.\n        * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(subscriptionDelay: Observable<number>, delayDurationSelector: (item: T) => ObservableOrPromise<number>): Observable<T>;\n    }\n}\n\n(function () {\n    var o: Rx.Observable<string>;\n    o.delay(1000);\n    o.delay(new Date());\n    o.delay(1000, Rx.Scheduler.async);\n    o.delay(new Date(), Rx.Scheduler.async);\n\n    o.delay(x => Rx.Observable.timer(x.length));\n    o.delay(Rx.Observable.timer(1000), x => Rx.Observable.timer(x.length));\n    o.delay(x => Rx.Observable.timer(x.length).toPromise());\n});\n"
  },
  {
    "path": "ts/core/linq/observable/delaysubscription.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n        *\n        * @example\n        *  1 - res = source.delaySubscription(5000); // 5s\n        *  2 - res = source.delaySubscription(5000, Rx.Scheduler.default); // 5 seconds\n        *\n        * @param {Number} dueTime Relative or absolute time shift of the subscription.\n        * @param {Scheduler} [scheduler]  Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delaySubscription(dueTime: number, scheduler?: IScheduler): Observable<T>;\n    }\n}\n\n(function () {\n    var o: Rx.Observable<string>;\n    o.delaySubscription(1000);\n    o.delaySubscription(1000, Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/dematerialize.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n        * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n        */\n        dematerialize<TOrigin>(): Observable<TOrigin>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<any>;\n    o.dematerialize();\n});\n"
  },
  {
    "path": "ts/core/linq/observable/distinct.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n        *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n        *\n        * @example\n        *  var res = obs = xs.distinct();\n        *  2 - obs = xs.distinct(function (x) { return x.id; });\n        *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n        * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n        * @param {Function} [comparer]  Used to compare items in the collection.\n        * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n        */\n        distinct<TKey>(keySelector?: (value: T) => TKey, comparer?: _Comparer<TKey, boolean>): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<string>;\n    o = o.distinct();\n    o = o.distinct(x => x.length);\n    o = o.distinct(x => x.length, (x,y) => x.toString() === y.toString());\n});\n"
  },
  {
    "path": "ts/core/linq/observable/distinctuntilchanged.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.\n        *\n        *  var obs = observable.distinctUntilChanged();\n        *  var obs = observable.distinctUntilChanged(function (x) { return x.id; });\n        *  var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; });\n        *\n        * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value.\n        * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n        * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n        */\n        distinctUntilChanged<TValue>(keySelector?: (value: T) => TValue, comparer?: _Comparer<TValue, boolean>): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<string>;\n    o = o.distinctUntilChanged();\n    o = o.distinctUntilChanged(x => x.length);\n    o = o.distinctUntilChanged(x => x.length, (x, y) => true);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/dowhile.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Repeats source as long as condition holds emulating a do while loop.\n        *\n        * @param {Function} condition The condition which determines if the source will be repeated.\n        * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n        * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n        */\n        doWhile(condition: () => boolean): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<string>;\n    o = o.doWhile(() => false);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/elementat.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns the element at a specified index in a sequence or default value if not found.\n        * @param {Number} index The zero-based index of the element to retrieve.\n        * @param {Any} [defaultValue] The default value to use if elementAt does not find a value.\n        * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence.\n        */\n        elementAt(index: number): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<string>;\n    o = o.elementAt(5);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/empty.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n  *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n  *\n  * @example\n  *  var res = Rx.Observable.empty();\n  *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n  * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n  * @returns {Observable} An observable sequence with no elements.\n  */\n        empty<T>(scheduler?: IScheduler): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<string>;\n    o = Rx.Observable.empty<string>();\n    o = Rx.Observable.empty<string>(Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/every.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Determines whether all elements of an observable sequence satisfy a condition.\n        * @param {Function} [predicate] A function to test each element for a condition.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element determining whether all elements in the source sequence pass the test in the specified predicate.\n        */\n        every(predicate?: _Predicate<T>, thisArg?: any): Observable<boolean>;\t// alias for all\n    }\n}\n\n(function () {\n    var o : Rx.Observable<string>;\n    var b : Rx.Observable<boolean>;\n    b = o.every();\n    b = o.every(() => true);\n    b = o.every(() => true, {});\n});\n"
  },
  {
    "path": "ts/core/linq/observable/expand.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Expands an observable sequence by recursively invoking selector.\n        *\n        * @param {Function} selector Selector function to invoke for each produced element, resulting in another sequence to which the selector will be invoked recursively again.\n        * @param {Scheduler} [scheduler] Scheduler on which to perform the expansion. If not provided, this defaults to the current thread scheduler.\n        * @returns {Observable} An observable sequence containing all the elements produced by the recursive expansion.\n        */\n        expand(selector: (item: T) => Observable<T>, scheduler?: IScheduler): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<number>;\n    o = o.expand(i => Rx.Observable.return(i + 1));\n    o = o.expand(i => Rx.Observable.return(i + 1), Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/filter.ts",
    "content": "/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n        *\n        * @example\n        *  var res = source.where(function (value) { return value < 10; });\n        *  var res = source.where(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n        */\n        where(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n        /**\n        *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n        *\n        * @example\n        *  var res = source.where(function (value) { return value < 10; });\n        *  var res = source.where(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n        */\n        filter(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<number>;\n    o = o.where(i => true);\n    o = o.where(i => true, {});\n    o = o.filter(i => true);\n    o = o.filter(i => true, {});\n\n});\n"
  },
  {
    "path": "ts/core/linq/observable/finally.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n        * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n        * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n        */\n        finally(action: () => void): Observable<T>;\n\n        /**\n        *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n        * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n        * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n        */\n        ensure(action: () => void): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<number>;\n    o = o.finally(() => {});\n    o = o.ensure(() => {});\n});\n"
  },
  {
    "path": "ts/core/linq/observable/find.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Searches for an element that matches the conditions defined by the specified predicate, and returns the first occurrence within the entire Observable sequence.\n        * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n        * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n        * @returns {Observable} An Observable sequence with the first element that matches the conditions defined by the specified predicate, if found; otherwise, undefined.\n        */\n        find(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<number>;\n    o = o.find((x) => true);\n    o = o.find((x) => true, {});\n});\n"
  },
  {
    "path": "ts/core/linq/observable/findindex.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n          * Searches for an element that matches the conditions defined by the specified predicate, and returns\n          * an Observable sequence with the zero-based index of the first occurrence within the entire Observable sequence.\n          * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n          * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n          * @returns {Observable} An Observable sequence with the zero-based index of the first occurrence of an element that matches the conditions defined by match, if found; otherwise, –1.\n        */\n        findIndex(predicate: _Predicate<T>, thisArg?: any): Observable<number>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<number>;\n    o = o.findIndex((x) => true);\n    o = o.findIndex((x) => true, {});\n});\n"
  },
  {
    "path": "ts/core/linq/observable/first.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns the first element of an observable sequence that satisfies the condition in the predicate if present else the first item in the sequence.\n        * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate if provided, else the first item in the sequence.\n        */\n        first(predicate?: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<number>;\n    o = o.first((x) => true);\n    o = o.first((x) => true, {});\n});\n"
  },
  {
    "path": "ts/core/linq/observable/flatmap.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n\n    export interface Observable<T> {\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<string>;\n    var n: Rx.Observable<number>;\n    n = o.flatMap(x => Rx.Observable.from([1, 2, 3]));\n    n = o.flatMap(x => Rx.Observable.from([1, 2, 3]).toPromise());\n    n = o.flatMap(x => [1, 2, 3]);\n    n = o.flatMap((x, z, b) => Rx.Observable.from([1, 2, 3]), (x, y, a, b) => y);\n    n = o.flatMap(x => Rx.Observable.from([1, 2, 3]).toPromise(), (x, y) => y);\n    n = o.flatMap(x => [1, 2, 3], (x, y) => y);\n    n = o.flatMap(Rx.Observable.from([1, 2, 3]));\n    n = o.flatMap(Rx.Observable.from([1, 2, 3]).toPromise());\n    n = o.flatMap([1, 2, 3]);\n    n = o.flatMap(Rx.Observable.from([1, 2, 3]), (x, y) => y);\n    n = o.flatMap(Rx.Observable.from([1, 2, 3]).toPromise(), (x, y) => y);\n    n = o.flatMap([1, 2, 3], (x, y) => y);\n\n    n = o.selectMany(x => Rx.Observable.from([1, 2, 3]));\n    n = o.selectMany(x => Rx.Observable.from([1, 2, 3]).toPromise());\n    n = o.selectMany(x => [1, 2, 3]);\n    n = o.selectMany(x => Rx.Observable.from([1, 2, 3]), (x, y) => y);\n    n = o.selectMany(x => Rx.Observable.from([1, 2, 3]).toPromise(), (x, y) => y);\n    n = o.selectMany(x => [1, 2, 3], (x, y) => y);\n    n = o.selectMany(Rx.Observable.from([1, 2, 3]));\n    n = o.selectMany(Rx.Observable.from([1, 2, 3]).toPromise());\n    n = o.selectMany([1, 2, 3]);\n    n = o.selectMany(Rx.Observable.from([1, 2, 3]), (x, y) => y);\n    n = o.selectMany(Rx.Observable.from([1, 2, 3]).toPromise(), (x, y) => y);\n    n = o.selectMany([1, 2, 3], (x, y) => y);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/flatmapfirst.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<string>;\n    var n: Rx.Observable<number>;\n    n = o.flatMapFirst(x => Rx.Observable.from([1, 2, 3]));\n    n = o.flatMapFirst(x => Rx.Observable.from([1, 2, 3]).toPromise());\n    n = o.flatMapFirst(x => [1, 2, 3]);\n    n = o.flatMapFirst(x => Rx.Observable.from([1, 2, 3]), (x, y) => y);\n    n = o.flatMapFirst(x => Rx.Observable.from([1, 2, 3]).toPromise(), (x, y) => y);\n    n = o.flatMapFirst(x => [1, 2, 3], (x, y) => y);\n    n = o.flatMapFirst(Rx.Observable.from([1, 2, 3]));\n    n = o.flatMapFirst(Rx.Observable.from([1, 2, 3]).toPromise());\n    n = o.flatMapFirst([1, 2, 3]);\n    n = o.flatMapFirst(Rx.Observable.from([1, 2, 3]), (x, y) => y);\n    n = o.flatMapFirst(Rx.Observable.from([1, 2, 3]).toPromise(), (x, y) => y);\n    n = o.flatMapFirst([1, 2, 3], (x, y) => y);\n\n    n = o.selectSwitchFirst(x => Rx.Observable.from([1, 2, 3]));\n    n = o.selectSwitchFirst(x => Rx.Observable.from([1, 2, 3]).toPromise());\n    n = o.selectSwitchFirst(x => [1, 2, 3]);\n    n = o.selectSwitchFirst(x => Rx.Observable.from([1, 2, 3]), (x, y) => y);\n    n = o.selectSwitchFirst(x => Rx.Observable.from([1, 2, 3]).toPromise(), (x, y) => y);\n    n = o.selectSwitchFirst(x => [1, 2, 3], (x, y) => y);\n    n = o.selectSwitchFirst(Rx.Observable.from([1, 2, 3]));\n    n = o.selectSwitchFirst(Rx.Observable.from([1, 2, 3]).toPromise());\n    n = o.selectSwitchFirst([1, 2, 3]);\n    n = o.selectSwitchFirst(Rx.Observable.from([1, 2, 3]), (x, y) => y);\n    n = o.selectSwitchFirst(Rx.Observable.from([1, 2, 3]).toPromise(), (x, y) => y);\n    n = o.selectSwitchFirst([1, 2, 3], (x, y) => y);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/flatmaplatest.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<string>;\n    var n: Rx.Observable<number>;\n    n = o.flatMapLatest(x => Rx.Observable.from([1, 2, 3]));\n    n = o.flatMapLatest(x => Rx.Observable.from([1, 2, 3]).toPromise());\n    n = o.flatMapLatest(x => [1, 2, 3]);\n    n = o.flatMapLatest(x => Rx.Observable.from([1, 2, 3]), (x, y) => y);\n    n = o.flatMapLatest(x => Rx.Observable.from([1, 2, 3]).toPromise(), (x, y) => y);\n    n = o.flatMapLatest(x => [1, 2, 3], (x, y) => y);\n    n = o.flatMapLatest(Rx.Observable.from([1, 2, 3]));\n    n = o.flatMapLatest(Rx.Observable.from([1, 2, 3]).toPromise());\n    n = o.flatMapLatest([1, 2, 3]);\n    n = o.flatMapLatest(Rx.Observable.from([1, 2, 3]), (x, y) => y);\n    n = o.flatMapLatest(Rx.Observable.from([1, 2, 3]).toPromise(), (x, y) => y);\n    n = o.flatMapLatest([1, 2, 3], (x, y) => y);\n\n    n = o.selectSwitch(x => Rx.Observable.from([1, 2, 3]));\n    n = o.selectSwitch(x => Rx.Observable.from([1, 2, 3]).toPromise());\n    n = o.selectSwitch(x => [1, 2, 3]);\n    n = o.selectSwitch(x => Rx.Observable.from([1, 2, 3]), (x, y) => y);\n    n = o.selectSwitch(x => Rx.Observable.from([1, 2, 3]).toPromise(), (x, y) => y);\n    n = o.selectSwitch(x => [1, 2, 3], (x, y) => y);\n    n = o.selectSwitch(Rx.Observable.from([1, 2, 3]));\n    n = o.selectSwitch(Rx.Observable.from([1, 2, 3]).toPromise());\n    n = o.selectSwitch([1, 2, 3]);\n    n = o.selectSwitch(Rx.Observable.from([1, 2, 3]), (x, y) => y);\n    n = o.selectSwitch(Rx.Observable.from([1, 2, 3]).toPromise(), (x, y) => y);\n    n = o.selectSwitch([1, 2, 3], (x, y) => y);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/flatmapwithmaxconcurrent.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<string>;\n    var n: Rx.Observable<number>;\n    n = o.flatMapWithMaxConcurrent(1, x => Rx.Observable.from([1, 2, 3]));\n    n = o.flatMapWithMaxConcurrent(1, x => Rx.Observable.from([1, 2, 3]).toPromise());\n    n = o.flatMapWithMaxConcurrent(1, x => [1, 2, 3]);\n    n = o.flatMapWithMaxConcurrent(1, x => Rx.Observable.from([1, 2, 3]), (x, y) => y);\n    n = o.flatMapWithMaxConcurrent(1, x => Rx.Observable.from([1, 2, 3]).toPromise(), (x, y) => y);\n    n = o.flatMapWithMaxConcurrent(1, x => [1, 2, 3], (x, y) => y);\n    n = o.flatMapWithMaxConcurrent(1, Rx.Observable.from([1, 2, 3]));\n    n = o.flatMapWithMaxConcurrent(1, Rx.Observable.from([1, 2, 3]).toPromise());\n    n = o.flatMapWithMaxConcurrent(1, [1, 2, 3]);\n    n = o.flatMapWithMaxConcurrent(1, Rx.Observable.from([1, 2, 3]), (x, y) => y);\n    n = o.flatMapWithMaxConcurrent(1, Rx.Observable.from([1, 2, 3]).toPromise(), (x, y) => y);\n    n = o.flatMapWithMaxConcurrent(1, [1, 2, 3], (x, y) => y);\n\n    n = o.selectManyWithMaxConcurrent(1, x => Rx.Observable.from([1, 2, 3]));\n    n = o.selectManyWithMaxConcurrent(1, x => Rx.Observable.from([1, 2, 3]).toPromise());\n    n = o.selectManyWithMaxConcurrent(1, x => [1, 2, 3]);\n    n = o.selectManyWithMaxConcurrent(1, x => Rx.Observable.from([1, 2, 3]), (x, y) => y);\n    n = o.selectManyWithMaxConcurrent(1, x => Rx.Observable.from([1, 2, 3]).toPromise(), (x, y) => y);\n    n = o.selectManyWithMaxConcurrent(1, x => [1, 2, 3], (x, y) => y);\n    n = o.selectManyWithMaxConcurrent(1, Rx.Observable.from([1, 2, 3]));\n    n = o.selectManyWithMaxConcurrent(1, Rx.Observable.from([1, 2, 3]).toPromise());\n    n = o.selectManyWithMaxConcurrent(1, [1, 2, 3]);\n    n = o.selectManyWithMaxConcurrent(1, Rx.Observable.from([1, 2, 3]), (x, y) => y);\n    n = o.selectManyWithMaxConcurrent(1, Rx.Observable.from([1, 2, 3]).toPromise(), (x, y) => y);\n    n = o.selectManyWithMaxConcurrent(1, [1, 2, 3], (x, y) => y);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/for.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n        * There is an alias for this method called 'forIn' for browsers <IE9\n        * @param {Array} sources An array of values to turn into an observable sequence.\n        * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n        * @returns {Observable} An observable sequence from the concatenated observable sequences.\n        */\n        for<T, TResult>(sources: T[], resultSelector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n        * There is an alias for this method called 'forIn' for browsers <IE9\n        * @param {Array} sources An array of values to turn into an observable sequence.\n        * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n        * @returns {Observable} An observable sequence from the concatenated observable sequences.\n        */\n        forIn<T, TResult>(sources: T[], resultSelector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n    }\n}\n\n(function() {\n    Rx.Observable.for(['a'], x => x);\n    Rx.Observable.forIn(['a'], x => x);\n\n});\n"
  },
  {
    "path": "ts/core/linq/observable/forkjoin.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        *  Runs all observable sequences in parallel and collect their last elements.\n        *\n        * @example\n        *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n        *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n        * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n        */\n        forkJoin<T>(sources: ObservableOrPromise<T>[]): Observable<T[]>;\n\n        /**\n        *  Runs all observable sequences in parallel and collect their last elements.\n        *\n        * @example\n        *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n        *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n        * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n        */\n        forkJoin<T>(...args: ObservableOrPromise<T>[]): Observable<T[]>;\n    }\n}\n\n(function () {\n    var a : Rx.Observable<string>;\n    var b : Rx.Promise<string>;\n    Rx.Observable.forkJoin(a, b);\n    Rx.Observable.forkJoin([a, b]);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/forkjoinproto.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Runs two observable sequences in parallel and combines their last elemenets.\n        *\n        * @param {Observable} second Second observable sequence.\n        * @param {Function} resultSelector Result selector function to invoke with the last elements of both sequences.\n        * @returns {Observable} An observable sequence with the result of calling the selector function with the last elements of both input sequences.\n        */\n        forkJoin<TSecond, TResult>(second: ObservableOrPromise<TSecond>, resultSelector: (left: T, right: TSecond) => TResult): Observable<TResult>;\n    }\n}\n\n(function () {\n    var a : Rx.Observable<string>;\n    var b : Rx.Observable<number>;\n    a = a.forkJoin(b, (a, b) => a);\n    b = a.forkJoin(b, (a, b) => b);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/from.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n         * This method creates a new Observable sequence from an array-like or iterable object.\n         * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n         * @param {Function} [mapFn] Map function to call on every element of the array.\n         * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n         * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n         */\n        from<T>(array: ArrayOrIterable<T>): Observable<T>;\n        /**\n         * This method creates a new Observable sequence from an array-like or iterable object.\n         * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n         * @param {Function} [mapFn] Map function to call on every element of the array.\n         * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n         * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n         */\n        from<T, TResult>(array: ArrayOrIterable<T>, mapFn: (value: T, index: number) => TResult, thisArg?: any, scheduler?: IScheduler): Observable<TResult>;\n    }\n}\n\n(function () {\n    var a : Rx.Observable<string>;\n    var b : Rx.Promise<string>;\n    Rx.Observable.from([1,2,3]);\n    Rx.Observable.from([1,2,3], x => x + 1);\n    Rx.Observable.from([1,2,3], x => x + 1, {});\n    Rx.Observable.from([1,2,3], x => x + 1, {}, Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/fromarray.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n         *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n         * @deprecated use Observable.from or Observable.of\n         * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n         * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n         */\n        fromArray<T>(array: ArrayLike<T>, scheduler?: IScheduler): Observable<T>;\n    }\n}\n\n(function () {\n    Rx.Observable.fromArray([1,2,3]);\n    Rx.Observable.fromArray([1,2,3], Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/fromcallback.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult>(func: Function, context: any, selector: Function): (...args: any[]) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1>(func: (arg1: T1, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2>(func: (arg1: T1, arg2: T2, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3>(func: (arg1: T1, arg2: T2, arg3: T3, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8, T9>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9) => Observable<TResult>;\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/fromevent.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n         * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n         * @param {Object} element The DOMElement or NodeList to attach a listener.\n         * @param {String} eventName The event name to attach the observable sequence.\n         * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n         * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n         */\n        fromEvent<T>(element: EventTarget, eventName: string, selector?: (arguments: any[]) => T): Observable<T>;\n        /**\n         * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n         * @param {Object} element The DOMElement or NodeList to attach a listener.\n         * @param {String} eventName The event name to attach the observable sequence.\n         * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n         * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n         */\n        fromEvent<T>(element: { on: (name: string, cb: (e: any) => any) => void; off: (name: string, cb: (e: any) => any) => void }, eventName: string, selector?: (arguments: any[]) => T): Observable<T>;\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/fromeventpattern.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n        * @param {Function} addHandler The function to add a handler to the emitter.\n        * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n        * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n        * @returns {Observable} An observable sequence which wraps an event from an event emitter\n        */\n        fromEventPattern<T>(addHandler: (handler: Function) => void, removeHandler: (handler: Function) => void, selector?: (arguments: any[]) => T): Observable<T>;\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/fromnodecallback.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult>(func: Function, context?: any, selector?: Function): (...args: any[]) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1>(func: (arg1: T1, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2>(func: (arg1: T1, arg2: T2, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3>(func: (arg1: T1, arg2: T2, arg3: T3, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8, T9>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9) => Observable<TResult>;\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/frompromise.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        * Converts a Promise to an Observable sequence\n        * @param {Promise} An ES6 Compliant promise.\n        * @param {Scheduler} [scheduler] Scheduler to run the conversion from Promises to Observable on. Defaults to Scheduler.async if not provided.\n        * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n        */\n        fromPromise<T>(promise: Promise<T>, scheduler?: IScheduler): Observable<T>;\n    }\n}\n\n(function () {\n    var p : Rx.Promise<string>;\n    var o : Rx.Observable<string> = Rx.Observable.fromPromise(p);\n})\n"
  },
  {
    "path": "ts/core/linq/observable/generate.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n         *\n         * @example\n         *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n         *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n         * @param {Mixed} initialState Initial state.\n         * @param {Function} condition Condition to terminate generation (upon returning false).\n         * @param {Function} iterate Iteration step function.\n         * @param {Function} resultSelector Selector function for results produced in the sequence.\n         * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n         * @returns {Observable} The generated sequence.\n         */\n        generate<TState, TResult>(initialState: TState, condition: (state: TState) => boolean, iterate: (state: TState) => TState, resultSelector: (state: TState) => TResult, scheduler?: IScheduler): Observable<TResult>;\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/generatewithabsolutetime.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n         *\n         * @example\n         *  res = source.generateWithAbsoluteTime(0,\n         *      function (x) { return return true; },\n         *      function (x) { return x + 1; },\n         *      function (x) { return x; },\n         *      function (x) { return new Date(); }\n         *  });\n         *\n         * @param {Mixed} initialState Initial state.\n         * @param {Function} condition Condition to terminate generation (upon returning false).\n         * @param {Function} iterate Iteration step function.\n         * @param {Function} resultSelector Selector function for results produced in the sequence.\n         * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning Date values.\n         * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n         * @returns {Observable} The generated sequence.\n         */\n        generateWithAbsoluteTime<TState, TResult>(\n            initialState: TState,\n            condition: (state: TState) => boolean,\n            iterate: (state: TState) => TState,\n            resultSelector: (state: TState) => TResult,\n            timeSelector: (state: TState) => Date,\n            scheduler?: IScheduler): Observable<TResult>;\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/generatewithrelativetime.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n         *\n         * @example\n         *  res = source.generateWithRelativeTime(0,\n         *      function (x) { return return true; },\n         *      function (x) { return x + 1; },\n         *      function (x) { return x; },\n         *      function (x) { return 500; }\n         *  );\n         *\n         * @param {Mixed} initialState Initial state.\n         * @param {Function} condition Condition to terminate generation (upon returning false).\n         * @param {Function} iterate Iteration step function.\n         * @param {Function} resultSelector Selector function for results produced in the sequence.\n         * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds.\n         * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n         * @returns {Observable} The generated sequence.\n         */\n        generateWithRelativeTime<TState, TResult>(\n            initialState: TState,\n            condition: (state: TState) => boolean,\n            iterate: (state: TState) => TState,\n            resultSelector: (state: TState) => TResult,\n            timeSelector: (state: TState) => number,\n            scheduler?: IScheduler): Observable<TResult>;\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/groupby.ts",
    "content": "/// <reference path=\"./groupbyuntil.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n         *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n         *\n         * @example\n         *  var res = observable.groupBy(function (x) { return x.id; });\n         *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n         *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n         * @param {Function} keySelector A function to extract the key for each element.\n         * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n         * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n         */\n        groupBy<TKey, TElement>(keySelector: (value: T) => TKey, skipElementSelector?: boolean, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, T>>;\n        /**\n         *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n         *\n         * @example\n         *  var res = observable.groupBy(function (x) { return x.id; });\n         *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n         *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n         * @param {Function} keySelector A function to extract the key for each element.\n         * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n         * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n         */\n        groupBy<TKey, TElement>(keySelector: (value: T) => TKey, elementSelector: (value: T) => TElement, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, TElement>>;\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/groupbyuntil.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../groupedobservable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Groups the elements of an observable sequence according to a specified key selector function.\n        *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n        *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n        *\n        * @example\n        *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n        *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n        *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n        * @param {Function} keySelector A function to extract the key for each element.\n        * @param {Function} durationSelector A function to signal the expiration of a group.\n        * @returns {Observable}\n        *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n        *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n        *\n        */\n        groupByUntil<TKey, TDuration>(keySelector: (value: T) => TKey, skipElementSelector: boolean, durationSelector: (group: GroupedObservable<TKey, T>) => Observable<TDuration>, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, T>>;\n\n        /**\n        *  Groups the elements of an observable sequence according to a specified key selector function.\n        *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n        *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n        *\n        * @example\n        *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n        *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n        *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n        * @param {Function} keySelector A function to extract the key for each element.\n        * @param {Function} durationSelector A function to signal the expiration of a group.\n        * @returns {Observable}\n        *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n        *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n        *\n        */\n        groupByUntil<TKey, TElement, TDuration>(keySelector: (value: T) => TKey, elementSelector: (value: T) => TElement, durationSelector: (group: GroupedObservable<TKey, TElement>) => Observable<TDuration>, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, TElement>>;\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/groupjoin.ts",
    "content": "/// <reference path=\"./groupbyuntil.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Correlates the elements of two sequences based on overlapping durations, and groups the results.\n        *\n        *  @param {Observable} right The right observable sequence to join elements for.\n        *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n        *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n        *  @param {Function} resultSelector A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. The first parameter passed to the function is an element of the left sequence. The second parameter passed to the function is an observable sequence with elements from the right sequence that overlap with the left sequence's element.\n        *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n        */\n        groupJoin<TRight, TDurationLeft, TDurationRight, TResult>(\n            right: Observable<TRight>,\n            leftDurationSelector: (leftItem: T) => Observable<TDurationLeft>,\n            rightDurationSelector: (rightItem: TRight) => Observable<TDurationRight>,\n            resultSelector: (leftItem: T, rightItem: Observable<TRight>) => TResult): Observable<TResult>;\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/if.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        *  Determines whether an observable collection contains values.\n        *\n        * @example\n        *  1 - res = Rx.Observable.if(condition, obs1);\n        *  2 - res = Rx.Observable.if(condition, obs1, obs2);\n        *  3 - res = Rx.Observable.if(condition, obs1, scheduler);\n        * @param {Function} condition The condition which determines if the thenSource or elseSource will be run.\n        * @param {Observable} thenSource The observable sequence or Promise that will be run if the condition function returns true.\n        * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the condition function returns false. If this is not provided, it defaults to Rx.Observabe.Empty with the specified scheduler.\n        * @returns {Observable} An observable sequence which is either the thenSource or elseSource.\n        */\n        if<T>(condition: () => boolean, thenSource: ObservableOrPromise<T>, elseSourceOrScheduler?: ObservableOrPromise<T> | IScheduler): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<string>;\n\n    Rx.Observable.if(() => false, o);\n    Rx.Observable.if(() => false, o, o);\n    Rx.Observable.if(() => false, o, Rx.Scheduler.async);\n})\n"
  },
  {
    "path": "ts/core/linq/observable/ignoreelements.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Ignores all elements in an observable sequence leaving only the termination messages.\n        * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n        */\n        ignoreElements(): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<string>;\n    o.ignoreElements();\n});\n"
  },
  {
    "path": "ts/core/linq/observable/includes.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Determines whether an observable sequence includes a specified element with an optional equality comparer.\n        * @param searchElement The value to locate in the source sequence.\n        * @param {Number} [fromIndex] An equality comparer to compare elements.\n        * @returns {Observable} An observable sequence containing a single element determining whether the source sequence includes an element that has the specified value from the given index.\n        */\n        includes(value: T, comparer?: _Comparer<T, boolean>): Observable<boolean>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<string>;\n    var b : Rx.Observable<boolean> = o.includes('a');\n});\n"
  },
  {
    "path": "ts/core/linq/observable/indexof.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n        * @param {Any} searchElement Element to locate in the array.\n        * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n        * @returns {Observable} And observable sequence containing the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n        */\n        indexOf(element: T, fromIndex?: number): Observable<number>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<string>;\n    var b : Rx.Observable<number> = o.indexOf('a');\n    var b : Rx.Observable<number> = o.indexOf('a', 1);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/interval.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n         *  Returns an observable sequence that produces a value after each period.\n         *\n         * @example\n         *  1 - res = Rx.Observable.interval(1000);\n         *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n         *\n         * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n         * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n         * @returns {Observable} An observable sequence that produces a value after each period.\n         */\n        interval(period: number, scheduler?: IScheduler): Observable<number>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<number>;\n    o = Rx.Observable.interval(100);\n    o = Rx.Observable.interval(100, Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/isempty.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n         * Determines whether an observable sequence is empty.\n         * @returns {Observable} An observable sequence containing a single element determining whether the source sequence is empty.\n         */\n        isEmpty(): Observable<boolean>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<number>;\n    var b : Rx.Observable<boolean> =  o.isEmpty();\n});\n"
  },
  {
    "path": "ts/core/linq/observable/join.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Correlates the elements of two sequences based on overlapping durations.\n        *\n        *  @param {Observable} right The right observable sequence to join elements for.\n        *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n        *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n        *  @param {Function} resultSelector A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters passed to the function correspond with the elements from the left and right source sequences for which overlap occurs.\n        *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n        */\n        join<TRight, TDurationLeft, TDurationRight, TResult>(\n            right: Observable<TRight>,\n            leftDurationSelector: (leftItem: T) => Observable<TDurationLeft>,\n            rightDurationSelector: (rightItem: TRight) => Observable<TDurationRight>,\n            resultSelector: (leftItem: T, rightItem: TRight) => TResult): Observable<TResult>;\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/jortsort.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * jortSort checks if your inputs are sorted.  Note that this is only for a sequence with an end.\n        * See http://jort.technology/ for full details.\n        * @returns {Observable} An observable which has a single value of true if sorted, else false.\n        */\n        jortSort(): Observable<boolean>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<number>;\n    var b : Rx.Observable<boolean> =  o.jortSort();\n});\n"
  },
  {
    "path": "ts/core/linq/observable/jortsortuntil.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * jortSort checks if your inputs are sorted until another Observable sequence fires.\n        * See http://jort.technology/ for full details.\n        * @returns {Observable} An observable which has a single value of true if sorted, else false.\n        */\n        jortSortUntil<TOther>(other: TOther): Observable<boolean>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<number>;\n    var b : Rx.Observable<boolean> =  o.jortSortUntil(o);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/just.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n        *  There is an alias called 'just' or browsers <IE9.\n        * @param {Mixed} value Single element in the resulting observable sequence.\n        * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} An observable sequence containing the single specified element.\n        */\n        return<T>(value: T, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n        *  There is an alias called 'just' or browsers <IE9.\n        * @param {Mixed} value Single element in the resulting observable sequence.\n        * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} An observable sequence containing the single specified element.\n        */\n        just<T>(value: T, scheduler?: IScheduler): Observable<T>;\n    }\n}\n\n(function () {\n    var a : Rx.Observable<string>;\n    var b : Rx.Observable<number>;\n    b = Rx.Observable.return(1);\n    a = Rx.Observable.return('a', Rx.Scheduler.async);\n    b = Rx.Observable.just(1);\n    a = Rx.Observable.just('a', Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/last.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns the last element of an observable sequence that satisfies the condition in the predicate if specified, else the last element.\n        * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate.\n        */\n        last(predicate?: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<number>;\n    o = o.last((x) => true);\n    o = o.last((x) => true, {});\n});\n"
  },
  {
    "path": "ts/core/linq/observable/let.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Returns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions.\n        *  This operator allows for a fluent style of writing queries that use the same sequence multiple times.\n        *\n        * @param {Function} selector Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        let<TResult>(selector: (source: Observable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n}\n\n(function () {\n    var a : Rx.Observable<string>;\n    var b : Rx.Observable<number>;\n    a.let(x => x.concat(Rx.Observable.just('a')));\n});\n"
  },
  {
    "path": "ts/core/linq/observable/manyselect.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Comonadic bind operator.\n        * @param {Function} selector A transform function to apply to each element.\n        * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n        * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n        */\n        manySelect<TResult>(selector: _Selector<Observable<T>, TResult>, scheduler?: IScheduler): Observable<TResult>;\n        /**\n        * Comonadic bind operator.\n        * @param {Function} selector A transform function to apply to each element.\n        * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n        * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n        */\n        extend<TResult>(selector: _Selector<Observable<T>, TResult>, scheduler?: IScheduler): Observable<TResult>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<string>;\n\n    var oo: Rx.Observable<Rx.Observable<string>> = o.extend(x => x.first());\n    var oo: Rx.Observable<Rx.Observable<string>> = o.manySelect(x => x.first());\n});\n"
  },
  {
    "path": "ts/core/linq/observable/map.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Projects each element of an observable sequence into a new form by incorporating the element's index.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n        */\n        select<TResult>(selector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        * Projects each element of an observable sequence into a new form by incorporating the element's index.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n        */\n        map<TResult>(selector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<boolean>;\n    o = o.map((x) => true);\n    o = o.map((x) => true, {});\n    o = o.select((x) => true);\n    o = o.select((x) => true, {});\n});\n"
  },
  {
    "path": "ts/core/linq/observable/materialize.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n        * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n        */\n        materialize(): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<boolean>;\n    o = o.materialize();\n});\n"
  },
  {
    "path": "ts/core/linq/observable/max.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns the maximum value in an observable sequence according to the specified comparer.\n        * @example\n        * var res = source.max();\n        * var res = source.max(function (x, y) { return x.value - y.value; });\n        * @param {Function} [comparer] Comparer used to compare elements.\n        * @returns {Observable} An observable sequence containing a single element with the maximum element in the source sequence.\n        */\n        max(comparer?: _Comparer<T, number>): Observable<number>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<number>;\n    var a : Rx.Observable<string>;\n    o = o.max();\n    o = a.max((x, y) => x.length - y.length);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/maxby.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n        * @example\n        * var res = source.maxBy(function (x) { return x.value; });\n        * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer]  Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n        */\n        maxBy<TKey>(keySelector: (item: T) => TKey, comparer: _Comparer<TKey, number>): Observable<T>;\n        /**\n        * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n        * @example\n        * var res = source.maxBy(function (x) { return x.value; });\n        * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer]  Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n        */\n        maxBy(keySelector: (item: T) => number): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<{value:number}>;\n    var a : Rx.Observable<{value: string}>;\n    o = o.maxBy(x => x.value);\n    a = a.maxBy(x => x.value, (x, y) => x.length - y.length);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/merge.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(scheduler: IScheduler, ...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(scheduler: IScheduler, sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<string>;\n    var p: Rx.Promise<string>;\n\n    o = Rx.Observable.merge(o, p, o, p);\n    o = Rx.Observable.merge([o, p, o, p]);\n    o = Rx.Observable.merge(Rx.Scheduler.async, o, p, o, p);\n    o = Rx.Observable.merge(Rx.Scheduler.async, [o, p, o, p]);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/mergeall.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        mergeAll(): T;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<Rx.Observable<string>>;\n\n    var oo : Rx.Observable<string> = o.mergeAll();\n});\n"
  },
  {
    "path": "ts/core/linq/observable/mergeconcat.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n        * Or merges two observable sequences into a single observable sequence.\n        *\n        * @example\n        * 1 - merged = sources.merge(1);\n        * 2 - merged = source.merge(otherSource);\n        * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        merge(maxConcurrent: number): T;\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n        * Or merges two observable sequences into a single observable sequence.\n        *\n        * @example\n        * 1 - merged = sources.merge(1);\n        * 2 - merged = source.merge(otherSource);\n        * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        merge(other: ObservableOrPromise<T>): Observable<T>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<string>;\n    var oo: Rx.Observable<Rx.Observable<string>>;\n    var p: Rx.Promise<string>;\n\n    o = oo.merge(1);\n    o = o.merge(p);\n    o = o.merge(o);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/mergedelayerror.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n        * receive all successfully emitted items from all of the source Observables without being interrupted by\n        * an error notification from one of them.\n        *\n        * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n        * error via the Observer's onError, mergeDelayError will refrain from propagating that\n        * error notification until all of the merged Observables have finished emitting items.\n        * @param {Array | Arguments} args Arguments or an array to merge.\n        * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n        */\n        mergeDelayError<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n        * receive all successfully emitted items from all of the source Observables without being interrupted by\n        * an error notification from one of them.\n        *\n        * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n        * error via the Observer's onError, mergeDelayError will refrain from propagating that\n        * error notification until all of the merged Observables have finished emitting items.\n        * @param {Array | Arguments} args Arguments or an array to merge.\n        * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n        */\n        mergeDelayError<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<string>;\n    var p: Rx.Promise<string>;\n\n    Rx.Observable.mergeDelayError(o, p, o, p);\n    Rx.Observable.mergeDelayError([o, p, o, p]);\n})\n"
  },
  {
    "path": "ts/core/linq/observable/min.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns the minimum element in an observable sequence according to the optional comparer else a default greater than less than check.\n        * @example\n        * var res = source.min();\n        * var res = source.min(function (x, y) { return x.value - y.value; });\n        * @param {Function} [comparer] Comparer used to compare elements.\n        * @returns {Observable} An observable sequence containing a single element with the minimum element in the source sequence.\n        */\n        min(comparer?: _Comparer<T, number>): Observable<number>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<number>;\n    var a : Rx.Observable<string>;\n    o = o.min();\n    o = a.min((x, y) => x.length - y.length);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/minby.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n        * @example\n        * var res = source.minBy(function (x) { return x.value; });\n        * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer] Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n        */\n        minBy<TKey>(keySelector: (item: T) => TKey, comparer: _Comparer<TKey, number>): Observable<T>;\n        /**\n        * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n        * @example\n        * var res = source.minBy(function (x) { return x.value; });\n        * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer] Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n        */\n        minBy(keySelector: (item: T) => number): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<{value:number}>;\n    var a : Rx.Observable<{value: string}>;\n    o = o.minBy(x => x.value);\n    a = a.minBy(x => x.value, (x, y) => x.length - y.length);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/multicast.ts",
    "content": "/// <reference path=\"../../subjects/subject.ts\" />\n/// <reference path=\"../connectableobservable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n        * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n        * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n        *\n        * @example\n        * 1 - res = source.multicast(observable);\n        * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n        *\n        * @param {Function|Subject} subjectOrSubjectSelector\n        * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n        * Or:\n        * Subject to push source elements into.\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        multicast(subject: ISubject<T> | (() => ISubject<T>)): ConnectableObservable<T>;\n        /**\n        * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n        * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n        * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n        *\n        * @example\n        * 1 - res = source.multicast(observable);\n        * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n        *\n        * @param {Function|Subject} subjectOrSubjectSelector\n        * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n        * Or:\n        * Subject to push source elements into.\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        multicast<TResult>(subjectSelector: ISubject<T> | (() => ISubject<T>), selector: (source: ConnectableObservable<T>) => Observable<T>): Observable<T>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<number>;\n    var oc: Rx.ConnectableObservable<number>;\n    var is: Rx.ISubject<number>;\n    var s: Rx.Subject<number>;\n    var a: Rx.Observable<string>;\n\n    oc = o.multicast(is);\n    oc = o.multicast(s);\n    oc = o.multicast(() => s);\n\n    o = o.multicast(is, a => a.asObservable());\n    o = o.multicast(s, a => a.asObservable());\n    o = o.multicast(() => s, a => a.asObservable());\n});\n"
  },
  {
    "path": "ts/core/linq/observable/never.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n        * @returns {Observable} An observable sequence whose observers will never get called.\n        */\n        never<T>(): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<string>;\n    o = Rx.Observable.never<string>();\n});\n"
  },
  {
    "path": "ts/core/linq/observable/observeon.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n        *\n        *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n        *  that require to be run on a scheduler, use subscribeOn.\n        *\n        *  @param {Scheduler} scheduler Scheduler to notify observers on.\n        *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n        */\n        observeOn(scheduler: IScheduler): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<string>;\n    o = o.observeOn(Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/of.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n        * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n        */\n        of<T>(...values: T[]): Observable<T>;\n\n        /**\n        *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n        * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n        * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n        */\n        ofWithScheduler<T>(scheduler?: IScheduler, ...values: T[]): Observable<T>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<number>;\n    o = Rx.Observable.of(1, 2, 3, 4, 5);\n    o = Rx.Observable.ofWithScheduler(Rx.Scheduler.async, 1, 2, 3, 4, 5);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/ofarraychanges.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface ArrayObserveChange<T> {\n        type: string;\n        object: T[];\n        name?: string;\n        oldValue?: T;\n        index?: number;\n        removed?: T[];\n        added?: number;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Creates an Observable sequence from changes to an array using Array.observe.\n         * @param {Array} array An array to observe changes.\n         * @returns {Observable} An observable sequence containing changes to an array from Array.observe.\n         */\n        ofArrayChanges<T>(obj: T[]): Observable<ArrayObserveChange<T>>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<Rx.ArrayObserveChange<string>>;\n    o = Rx.Observable.ofArrayChanges(<string[]>[]);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/ofobjectchanges.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface ObjectObserveChange<T> {\n        type: string;\n        object: T;\n        name: string;\n        oldValue?: any;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Creates an Observable sequence from changes to an object using Object.observe.\n         * @param {Object} obj An object to observe changes.\n         * @returns {Observable} An observable sequence containing changes to an object from Object.observe.\n         */\n        ofObjectChanges<T>(obj: T): Observable<ObjectObserveChange<T>>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<Rx.ObjectObserveChange<{}>>;\n    o = Rx.Observable.ofObjectChanges({});\n});\n"
  },
  {
    "path": "ts/core/linq/observable/onerrorresumenext.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        *\n        * @example\n        * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);\n        * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);\n        * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n        */\n        onErrorResumeNext<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        *\n        * @example\n        * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);\n        * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);\n        * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n        */\n        onErrorResumeNext<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<number>;\n    var p: Rx.Promise<number>;\n    o = Rx.Observable.onErrorResumeNext(o, p, o, p);\n    o = Rx.Observable.onErrorResumeNext([o, p, o, p]);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/onerrorresumenextproto.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n        * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n        */\n        onErrorResumeNext(second: ObservableOrPromise<T>): Observable<T>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<number>;\n    var p: Rx.Promise<number>;\n    o = o.onErrorResumeNext(p);\n    o = o.onErrorResumeNext(o);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/pairs.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        * Convert an object into an observable sequence of [key, value] pairs.\n        * @param {Object} obj The object to inspect.\n        * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n        * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n        */\n        pairs<T>(obj: { [key: string]: T }, scheduler?: IScheduler): Observable<[string, T]>;\n        /**\n        * Convert an object into an observable sequence of [key, value] pairs.\n        * @param {Object} obj The object to inspect.\n        * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n        * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n        */\n        pairs<T>(obj: { [key: number]: T }, scheduler?: IScheduler): Observable<[number, T]>;\n    }\n}\n\n(function() {\n    var n: Rx.Observable<[number, string]>;\n    var s: Rx.Observable<[string, number]>;\n\n    s = Rx.Observable.pairs(<{ [key: string]: number }>{});\n    s = Rx.Observable.pairs(<{ [key: string]: number }>{}, Rx.Scheduler.default);\n    n = Rx.Observable.pairs(<{ [key: number]: string }>{});\n    n = Rx.Observable.pairs(<{ [key: number]: string }>{}, Rx.Scheduler.default);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/pairwise.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n         * Returns a new observable that triggers on the second and subsequent triggerings of the input observable.\n         * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair.\n         * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs.\n         * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array.\n         */\n        pairwise(): Observable<[T, T]>;\n    }\n}\n\n\n(function () {\n    var o : Rx.Observable<number>;\n    var r : Rx.Observable<[number, number]>;\n\n    r = o.pairwise();\n});\n"
  },
  {
    "path": "ts/core/linq/observable/partition.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n         * Returns two observables which partition the observations of the source by the given function.\n         * The first will trigger observations for those values for which the predicate returns true.\n         * The second will trigger observations for those values where the predicate returns false.\n         * The predicate is executed once for each subscribed observer.\n         * Both also propagate all error observations arising from the source and each completes\n         * when the source completes.\n         * @param {Function} predicate\n         *    The function to determine which output Observable will trigger a particular observation.\n         * @returns {Array}\n         *    An array of observables. The first triggers when the predicate returns true,\n         *    and the second triggers when the predicate returns false.\n        */\n        partition(predicate: _Predicate<T>, thisArg?: any): [Observable<T>, Observable<T>];\n    }\n}\n\n(function() {\n    var o: Rx.Observable<number>;\n    var r: [Rx.Observable<number>, Rx.Observable<number>];\n\n    r = o.partition(x => x % 2 === 0);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/pipe.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Pipes the existing Observable sequence into a Node.js Stream.\n        * @param {Stream} dest The destination Node.js stream.\n        * @returns {Stream} The destination stream.\n        */\n        pipe<TDest>(dest: TDest): TDest;\n        // TODO: Add link to node.d.ts some where\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/pluck.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Retrieves the value of a specified nested property from all elements in\n        * the Observable sequence.\n        * @param {Arguments} arguments The nested properties to pluck.\n        * @returns {Observable} Returns a new Observable sequence of property values.\n        */\n        pluck<TResult>(prop: string): Observable<TResult>;\n        pluck<TResult>(...props: string[]): Observable<TResult>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<{}>;\n    var n: Rx.Observable<number>;\n\n    n = o.pluck<number>('abc');\n});\n"
  },
  {
    "path": "ts/core/linq/observable/publish.ts",
    "content": "/// <reference path=\"./multicast.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of Multicast using a regular Subject.\n        *\n        * @example\n        * var resres = source.publish();\n        * var res = source.publish(function (x) { return x; });\n        *\n        * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publish(): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of Multicast using a regular Subject.\n        *\n        * @example\n        * var resres = source.publish();\n        * var res = source.publish(function (x) { return x; });\n        *\n        * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publish<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<number>;\n    var oc: Rx.ConnectableObservable<number>;\n    var is: Rx.ISubject<number>;\n    var s: Rx.Subject<number>;\n    var a: Rx.Observable<string>;\n\n    oc = o.publish();\n    o = o.publish(a => a.asObservable());\n});\n"
  },
  {
    "path": "ts/core/linq/observable/publishlast.ts",
    "content": "/// <reference path=\"./multicast.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n        * This operator is a specialization of Multicast using a AsyncSubject.\n        *\n        * @example\n        * var res = source.publishLast();\n        * var res = source.publishLast(function (x) { return x; });\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishLast(): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n        * This operator is a specialization of Multicast using a AsyncSubject.\n        *\n        * @example\n        * var res = source.publishLast();\n        * var res = source.publishLast(function (x) { return x; });\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishLast<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    var oc: Rx.ConnectableObservable<number>;\n    var is: Rx.ISubject<number>;\n    var s: Rx.Subject<number>;\n    var a: Rx.Observable<string>;\n\n    oc = o.publishLast();\n    o = o.publishLast(a => a.asObservable());\n});\n"
  },
  {
    "path": "ts/core/linq/observable/publishvalue.ts",
    "content": "/// <reference path=\"./multicast.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n        * This operator is a specialization of Multicast using a BehaviorSubject.\n        *\n        * @example\n        * var res = source.publishValue(42);\n        * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishValue(initialValue: T): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n        * This operator is a specialization of Multicast using a BehaviorSubject.\n        *\n        * @example\n        * var res = source.publishValue(42);\n        * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishValue<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>, initialValue: T): Observable<TResult>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<number>;\n    var oc: Rx.ConnectableObservable<number>;\n    var is: Rx.ISubject<number>;\n    var s: Rx.Subject<number>;\n    var a: Rx.Observable<string>;\n\n    oc = o.publishValue(12);\n    o = o.publishValue(a => a.asObservable(), 12);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/range.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n        *\n        * @example\n        *  var res = Rx.Observable.range(0, 10);\n        *  var res = Rx.Observable.range(0, 10, Rx.Scheduler.timeout);\n        * @param {Number} start The value of the first integer in the sequence.\n        * @param {Number} count The number of sequential integers to generate.\n        * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n        * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n        */\n        range(start: number, count: number, scheduler?: IScheduler): Observable<number>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<number> = Rx.Observable.range(1, 2);\n    o = Rx.Observable.range(1, 2, Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/reduce.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n         * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n         * For aggregation behavior with incremental intermediate results, see Observable.scan.\n         * @param {Function} accumulator An accumulator function to be invoked on each element.\n         * @param {Any} [seed] The initial accumulator value.\n         * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n         */\n        reduce<TAcc>(accumulator: _Accumulator<T, TAcc>, seed?: TAcc): Observable<TAcc>;\n        /**\n         * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n         * For aggregation behavior with incremental intermediate results, see Observable.scan.\n         * @param {Function} accumulator An accumulator function to be invoked on each element.\n         * @param {Any} [seed] The initial accumulator value.\n         * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n         */\n        reduce(accumulator: _Accumulator<T, T>, seed?: T): Observable<T>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<number>;\n\n    o = o.reduce<number>((a, x) => a * x);\n    o = o.reduce((a, x) => a * x, 1);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/repeat.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n         *\n         * @example\n         *  var res = Rx.Observable.repeat(42);\n         *  var res = Rx.Observable.repeat(42, 4);\n         *  3 - res = Rx.Observable.repeat(42, 4, Rx.Scheduler.timeout);\n         *  4 - res = Rx.Observable.repeat(42, null, Rx.Scheduler.timeout);\n         * @param {Mixed} value Element to repeat.\n         * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n         * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n         * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n         */\n        repeat<T>(value: T, repeatCount?: number | void, scheduler?: IScheduler): Observable<T>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<number>;\n    Rx.Observable.repeat(42, 4, Rx.Scheduler.async);\n    Rx.Observable.repeat(42, null, Rx.Scheduler.async);\n    Rx.Observable.repeat(42);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/repeatproto.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n         *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n         * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n         * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n         */\n        repeat(repeatCount?: number): Observable<T>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    o.repeat();\n    o.repeat(42);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/replay.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of Multicast using a ReplaySubject.\n        *\n        * @example\n        * var res = source.replay(null, 3);\n        * var res = source.replay(null, 3, 500);\n        * var res = source.replay(null, 3, 500, scheduler);\n        * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param windowSize [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        replay(selector?: void, bufferSize?: number, window?: number, scheduler?: IScheduler): ConnectableObservable<T>;\t// hack to catch first omitted parameter\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of Multicast using a ReplaySubject.\n        *\n        * @example\n        * var res = source.replay(null, 3);\n        * var res = source.replay(null, 3, 500);\n        * var res = source.replay(null, 3, 500, scheduler);\n        * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param windowSize [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        replay(selector: (source: ConnectableObservable<T>) => Observable<T>, bufferSize?: number, window?: number, scheduler?: IScheduler): Observable<T>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<number>;\n    var oc: Rx.ConnectableObservable<number>;\n    var is: Rx.ISubject<number>;\n    var s: Rx.Subject<number>;\n    var a: Rx.Observable<string>;\n\n    o = o.replay(null, 1, 2, Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/retry.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n        *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n        *\n        * @example\n        *  var res = retried = retry.repeat();\n        *  var res = retried = retry.repeat(2);\n        * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n        * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n        */\n        retry(retryCount?: number): Observable<T>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<number>;\n    o.retry();\n    o.retry(42);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/retrywhen.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n         *  Repeats the source observable sequence upon error each time the notifier emits or until it successfully terminates.\n         *  if the notifier completes, the observable sequence completes.\n         *\n         * @example\n         *  var timer = Observable.timer(500);\n         *  var source = observable.retryWhen(timer);\n         * @param {Observable} [notifier] An observable that triggers the retries or completes the observable with onNext or onCompleted respectively.\n         * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n         */\n        retryWhen(notifier: (errors: Observable<any>) => Observable<any>): Observable<T>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    o.retryWhen(() => Rx.Observable.of(1));\n});\n"
  },
  {
    "path": "ts/core/linq/observable/sample.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        sample(intervalOrSampler: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        sample<TSample>(sampler: Observable<TSample>, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        throttleLatest(interval: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        throttleLatest<TSample>(sampler: Observable<TSample>, scheduler?: IScheduler): Observable<T>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    o.sample(100);\n    o.sample(100, Rx.Scheduler.async);\n    o.sample(Rx.Observable.interval(100));\n    o.sample(Rx.Observable.interval(100), Rx.Scheduler.async);\n\n    o.throttleLatest(100);\n    o.throttleLatest(100, Rx.Scheduler.async);\n    o.throttleLatest(Rx.Observable.interval(100));\n    o.throttleLatest(Rx.Observable.interval(100), Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/scan.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n        *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n        * @example\n        *  var res = source.scan(function (acc, x) { return acc + x; });\n        *  var res = source.scan(function (acc, x) { return acc + x; }, 0);\n        * @param {Function} accumulator An accumulator function to be invoked on each element.\n        * @param {Mixed} [seed] The initial accumulator value.\n        * @returns {Observable} An observable sequence containing the accumulated values.\n        */\n        scan<TAcc>(accumulator: _Accumulator<T, TAcc>, seed?: TAcc): Observable<TAcc>;\n        /**\n        *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n        *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n        * @example\n        *  var res = source.scan(function (acc, x) { return acc + x; });\n        *  var res = source.scan(function (acc, x) { return acc + x; }, 0);\n        * @param {Function} accumulator An accumulator function to be invoked on each element.\n        * @param {Mixed} [seed] The initial accumulator value.\n        * @returns {Observable} An observable sequence containing the accumulated values.\n        */\n        scan(accumulator: _Accumulator<T, T>, seed?: T): Observable<T>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n\n    o = o.scan<number>((a, x) => a * x);\n    o = o.scan((a, x) => a * x, 1);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/selectmanyobserver.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        selectManyObserver<T2, T3, T4>(onNext: (value: T, index: number) => Observable<T2>, onError: (exception: any) => Observable<T3>, onCompleted: () => Observable<T4>, thisArg?: any): Observable<T2 | T3 | T4>;\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        flatMapObserver<T2, T3, T4>(onNext: (value: T, index: number) => Observable<T2>, onError: (exception: any) => Observable<T3>, onCompleted: () => Observable<T4>, thisArg?: any): Observable<T2 | T3 | T4>;\n    }\n}\n\n\n(function() {\n    var os: Rx.Observable<string>;\n    var on: Rx.Observable<number>;\n\n    os.flatMapObserver((v, i) => Rx.Observable.just(i), (e) => Rx.Observable.just(e), () => Rx.Observable.empty());\n    os.selectManyObserver((v, i) => Rx.Observable.just(i), (e) => Rx.Observable.just(e), () => Rx.Observable.empty());\n\n    os.flatMapObserver((v, i) => Rx.Observable.just(i), (e) => Rx.Observable.just(e), () => Rx.Observable.empty(), {});\n    os.selectManyObserver((v, i) => Rx.Observable.just(i), (e) => Rx.Observable.just(e), () => Rx.Observable.empty(), {});\n});\n"
  },
  {
    "path": "ts/core/linq/observable/sequenceequal.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n        *\n        * @example\n        * var res = res = source.sequenceEqual([1,2,3]);\n        * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n        * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n        * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n        * @param {Observable} second Second observable sequence or array to compare.\n        * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n        * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n        */\n        sequenceEqual(second: ObservableOrPromise<T> | ArrayOrIterable<T>, comparer?: _Comparer<T, boolean>): Observable<boolean>;\n        /**\n        *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n        *\n        * @example\n        * var res = res = source.sequenceEqual([1,2,3]);\n        * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n        * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n        * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n        * @param {Observable} second Second observable sequence or array to compare.\n        * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n        * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n        */\n        sequenceEqual<TOther>(second: ObservableOrPromise<T> | ArrayOrIterable<T>, comparer: _Comparer<T | TOther, boolean>): Observable<boolean>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<string>;\n    var o2 : Rx.Observable<string>;\n    var b : Rx.Observable<boolean>;\n    b = o.sequenceEqual(o2);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/share.ts",
    "content": "/// <reference path=\"./multicast.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        share(): Observable<T>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<number>;\n    var oc: Rx.ConnectableObservable<number>;\n    var is: Rx.ISubject<number>;\n    var s: Rx.Subject<number>;\n    var a: Rx.Observable<string>;\n\n    o = o.share();\n});\n"
  },
  {
    "path": "ts/core/linq/observable/sharereplay.ts",
    "content": "/// <reference path=\"./multicast.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        *\n        * @example\n        * var res = source.shareReplay(3);\n        * var res = source.shareReplay(3, 500);\n        * var res = source.shareReplay(3, 500, scheduler);\n        *\n\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param window [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        shareReplay(bufferSize?: number, window?: number, scheduler?: IScheduler): Observable<T>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<number>;\n    var oc: Rx.ConnectableObservable<number>;\n    var is: Rx.ISubject<number>;\n    var s: Rx.Subject<number>;\n    var a: Rx.Observable<string>;\n\n    o = o.shareReplay();\n    o = o.shareReplay(1);\n    o = o.shareReplay(1,2);\n    o = o.shareReplay(1,2, Rx.Scheduler.default);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/sharevalue.ts",
    "content": "/// <reference path=\"./multicast.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n        * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        shareValue(initialValue: T): Observable<T>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    var oc: Rx.ConnectableObservable<number>;\n    var is: Rx.ISubject<number>;\n    var s: Rx.Subject<number>;\n    var a: Rx.Observable<string>;\n\n    o = o.shareValue(12);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/single.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns the only element of an observable sequence that satisfies the condition in the optional predicate, and reports an exception if there is not exactly one element in the observable sequence.\n        * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n        * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n        * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate.\n        */\n        single(predicate?: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    var oc: Rx.ConnectableObservable<number>;\n    var is: Rx.ISubject<number>;\n    var s: Rx.Subject<number>;\n    var a: Rx.Observable<string>;\n\n    o = o.single();\n    o = o.single(x => true);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/singleinstance.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence. This observable sequence\n        * can be resubscribed to, even if all prior subscriptions have ended. (unlike `.publish().refCount()`)\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source.\n        */\n        singleInstance(): Observable<T>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    var oc: Rx.ConnectableObservable<number>;\n    var is: Rx.ISubject<number>;\n    var s: Rx.Subject<number>;\n    var a: Rx.Observable<string>;\n\n    o = o.singleInstance();\n});\n"
  },
  {
    "path": "ts/core/linq/observable/skip.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n        * @param {Number} count The number of elements to skip before returning the remaining elements.\n        * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n        */\n        skip(count: number): Observable<T>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<number>;\n    o = o.skip(1);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/skiplast.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Bypasses a specified number of elements at the end of an observable sequence.\n        * @description\n        *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n        *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n        * @param count Number of elements to bypass at the end of the source sequence.\n        * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n        */\n        skipLast(count: number): Observable<T>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    o = o.skipLast(1);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/skiplastwithtime.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n        *\n        *  1 - res = source.skipLastWithTime(5000);\n        *  2 - res = source.skipLastWithTime(5000, scheduler);\n        *\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for skipping elements from the end of the sequence.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout\n        * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence.\n        */\n        skipLastWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    o = o.skipLastWithTime(1);\n    o = o.skipLastWithTime(1, Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/skipuntil.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n        * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n        * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n        */\n        skipUntil<T2>(other: ObservableOrPromise<T2>): Observable<T>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<number>;\n    var o2: Rx.Observable<number>;\n\n    o = o.skipUntil(o2);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/skipuntilwithtime.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n        *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n        *\n        * @examples\n        *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n        *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n        * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n        */\n        skipUntilWithTime(startTime: Date, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n        *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n        *\n        * @examples\n        *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n        *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n        * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n        */\n        skipUntilWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    var o2: Rx.Observable<number>;\n\n    o = o.skipUntilWithTime(new Date());\n    o = o.skipUntilWithTime(new Date(), Rx.Scheduler.default);\n    o = o.skipUntilWithTime(1000);\n    o = o.skipUntilWithTime(1000, Rx.Scheduler.default);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/skipwhile.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n        *  The element's index is used in the logic of the predicate function.\n        *\n        *  var res = source.skipWhile(function (value) { return value < 10; });\n        *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n        */\n        skipWhile(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/skipwithtime.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n        *\n        * @example\n        *  1 - res = source.skipWithTime(5000, [optional scheduler]);\n        *\n        * @description\n        *  Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence.\n        *  This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded\n        *  may not execute immediately, despite the zero due time.\n        *\n        *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration.\n        * @param {Number} duration Duration for skipping elements from the start of the sequence.\n        * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence.\n        */\n        skipWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<number>;\n    o = o.skipWithTime(1);\n    o = o.skipWithTime(100, Rx.Scheduler.default);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/some.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Determines whether any element of an observable sequence satisfies a condition if present, else if any items are in the sequence.\n        * @param {Function} [predicate] A function to test each element for a condition.\n        * @returns {Observable} An observable sequence containing a single element determining whether any elements in the source sequence pass the test in the specified predicate if given, else if any items are in the sequence.\n        */\n        some(predicate?: _Predicate<T>, thisArg?: any): Observable<boolean>;\t// alias for any\n    }\n}\n\n\n(function () {\n    var os : Rx.Observable<string>;\n    var on : Rx.Observable<number>;\n\n    on.some();\n    os.some((v, i, s) => true);\n    os.some((v, i, s) => true, {});\n});\n"
  },
  {
    "path": "ts/core/linq/observable/spawn.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface ObservableStatic {\n        wrap<T>(fn: Function): Observable<T>;\n        spawn<T>(fn: Function): Observable<T>;\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/start.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.\n        *\n        * @example\n        * var res = Rx.Observable.start(function () { console.log('hello'); });\n        * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout);\n        * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console);\n        *\n        * @param {Function} func Function to run asynchronously.\n        * @param {Scheduler} [scheduler]  Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param [context]  The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n        *\n        * Remarks\n        * * The function is called immediately, not during the subscription of the resulting sequence.\n        * * Multiple subscriptions to the resulting sequence can observe the function's result.\n        */\n        start<T>(func: () => T, scheduler?: IScheduler, context?: any): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<string> = Rx.Observable.start(() => 'abc');\n    var o : Rx.Observable<string> = Rx.Observable.start(() => 'abc', Rx.Scheduler.default);\n    var o : Rx.Observable<string> = Rx.Observable.start(() => 'abc', Rx.Scheduler.default, {});\n});\n"
  },
  {
    "path": "ts/core/linq/observable/startasync.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        * Invokes the asynchronous function, surfacing the result through an observable sequence.\n        * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n        * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n        */\n        startAsync<T>(functionAsync: () => IPromise<T>): Observable<T>;\n    }\n}\n\n\n(function () {\n    var o : Rx.Observable<string> = Rx.Observable.startAsync(() => Rx.Observable.just('a').toPromise());\n});\n"
  },
  {
    "path": "ts/core/linq/observable/startwith.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n        *  @example\n        *  var res = source.startWith(1, 2, 3);\n        *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n        * @param {Arguments} args The specified values to prepend to the observable sequence\n        * @returns {Observable} The source sequence prepended with the specified values.\n        */\n        startWith(...values: T[]): Observable<T>;\n        /**\n        *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n        *  @example\n        *  var res = source.startWith(1, 2, 3);\n        *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n        * @param {Arguments} args The specified values to prepend to the observable sequence\n        * @returns {Observable} The source sequence prepended with the specified values.\n        */\n        startWith(scheduler: IScheduler, ...values: T[]): Observable<T>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    o = o.startWith(1, 2, 3, 4, 5);\n    o = o.startWith(Rx.Scheduler.async, 1, 2, 3, 4, 5);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/subscribeon.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n        *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n        *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n        *  callbacks on a scheduler, use observeOn.\n\n        *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n        *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n        */\n        subscribeOn(scheduler: IScheduler): Observable<T>;\n    }\n}\n\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    o = o.subscribeOn(Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/sum.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Computes the sum of a sequence of values that are obtained by invoking an optional transform function on each element of the input sequence, else if not specified computes the sum on each item in the sequence.\n        * @param {Function} [selector] A transform function to apply to each element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element with the sum of the values in the source sequence.\n        */\n        sum(keySelector?: _Selector<T, number>, thisArg?: any): Observable<number>;\n    }\n}\n\n\n(function () {\n    var os : Rx.Observable<string>;\n    var on : Rx.Observable<number>;\n\n    on.sum();\n    os.sum((v, i, s) => v.length + i);\n    os.sum((v, i, s) => v.length + i, {});\n});\n"
  },
  {
    "path": "ts/core/linq/observable/switch.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        switch(): T;\n        /**\n        * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        switchLatest(): T;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<Rx.Observable<number>>;\n    var or: Rx.Observable<number>;\n    or = o.switch();\n    or = o.switchLatest();\n});\n"
  },
  {
    "path": "ts/core/linq/observable/switchfirst.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * Observables that come in between subscriptions will be dropped on the floor.\n        * @returns {Observable} A exclusive observable with only the results that happen when subscribed.\n        */\n        switchFirst(): T;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<Rx.Observable<number>>;\n    var or: Rx.Observable<number>;\n    or = o.switchFirst();\n});\n"
  },
  {
    "path": "ts/core/linq/observable/take.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n        *\n        *  var res = source.take(5);\n        *  var res = source.take(0, Rx.Scheduler.timeout);\n        * @param {Number} count The number of elements to return.\n        * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n        * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n        */\n        take(count: number, scheduler?: IScheduler): Observable<T>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    o = o.take(1, Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/takelast.ts",
    "content": "/// <reference path=\"../../disposables/disposable.ts\" />\n/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Returns a specified number of contiguous elements from the end of an observable sequence.\n        * @description\n        *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n        *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n        * @param {Number} count Number of elements to take from the end of the source sequence.\n        * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n        */\n        takeLast(count: number): Observable<T>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    o = o.takeLast(1);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/takelastbuffer.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n        *\n        * @description\n        *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n        *  source sequence, this buffer is produced on the result sequence.\n        * @param {Number} count Number of elements to take from the end of the source sequence.\n        * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n        */\n        takeLastBuffer(count: number): Observable<T[]>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    var o2: Rx.Observable<number[]>;\n    o2 = o.takeLastBuffer(1);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/takelastbufferwithtime.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for taking elements from the end of the sequence.\n        * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence.\n        */\n        takeLastBufferWithTime(duration: number, scheduler?: IScheduler): Observable<T[]>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    var o2: Rx.Observable<number[]>;\n    o2 = o.takeLastBufferWithTime(1);\n    o2 = o.takeLastBufferWithTime(1, Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/takelastwithtime.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements.\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for taking elements from the end of the sequence.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence.\n        */\n        takeLastWithTime(duration: number, timerScheduler?: IScheduler, loopScheduler?: IScheduler): Observable<T>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    o = o.takeLastWithTime(1);\n    o = o.takeLastWithTime(1, Rx.Scheduler.async, Rx.Scheduler.default);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/takeuntil.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns the values from the source observable sequence until the other observable sequence produces a value.\n        * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n        * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n        */\n        takeUntil<T2>(other: ObservableOrPromise<T2>): Observable<T>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    var o2: Rx.Observable<number>;\n\n    o = o.skipUntil(o2);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/takeuntilwithtime.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n        * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n        * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n        */\n        takeUntilWithTime(endTime: Date, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n        * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n        * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n        */\n        takeUntilWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    var o2: Rx.Observable<number>;\n\n    o = o.skipUntilWithTime(new Date());\n    o = o.skipUntilWithTime(new Date(), Rx.Scheduler.default);\n    o = o.skipUntilWithTime(1000);\n    o = o.skipUntilWithTime(1000, Rx.Scheduler.default);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/takewhile.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Returns elements from an observable sequence as long as a specified condition is true.\n        *  The element's index is used in the logic of the predicate function.\n        * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n        */\n        takeWhile(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/takewithtime.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n        *\n        * @example\n        *  1 - res = source.takeWithTime(5000,  [optional scheduler]);\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for taking elements from the start of the sequence.\n        * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence.\n        */\n        takeWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<number>;\n    o = o.takeWithTime(1);\n    o = o.takeWithTime(100, Rx.Scheduler.default);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/tap.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\n/// <reference path=\"../../observer-lite.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        do(observer: Observer<T>): Observable<T>;\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tap(observer: Observer<T>): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        do(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observable<T>;\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tap(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onNext Action to invoke for each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnNext(onNext: (value: T) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnError(onError: (exception: any) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon graceful termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnCompleted(onCompleted: () => void, thisArg?: any): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onNext Action to invoke for each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnNext(onNext: (value: T) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnError(onError: (exception: any) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon graceful termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnCompleted(onCompleted: () => void, thisArg?: any): Observable<T>;\n    }\n}\n\n\n(function() {\n    var o: Rx.Observable<string>;\n    var or: Rx.Observer<string>;\n\n    o.do(or);\n    o.tap(or);\n\n    o.do((v) => {}, e => {}, () => {});\n    o.tap((v) => {}, e => {}, () => {});\n\n    o.doOnNext((v) => { });\n    o.tapOnNext((v) => { });\n    o.doOnError((e) => { });\n    o.tapOnError((e) => { });\n    o.doOnCompleted(() => { });\n    o.tapOnCompleted(() => { });\n    o.doOnNext((v) => { }, {});\n    o.tapOnNext((v) => { }, {});\n    o.doOnError((e) => { }, {});\n    o.tapOnError((e) => { }, {});\n    o.doOnCompleted(() => { }, {});\n    o.tapOnCompleted(() => { }, {});\n});\n"
  },
  {
    "path": "ts/core/linq/observable/thendo.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../joins/plan.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Matches when the observable sequence has an available value and projects the value.\n        *\n        *  @param {Function} selector Selector that will be invoked for values in the source sequence.\n        *  @returns {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T) => TR): Plan<TR>;\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/throttle.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n        * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n        * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n        * @returns {Observable} An Observable that performs the throttle operation.\n        */\n        throttle(windowDuration: number, scheduler?: IScheduler): Observable<T>;\n    }\n}\n\n\n(function () {\n    var o: Rx.Observable<string>;\n    o.throttle(100);\n    o.throttle(100, Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/throw.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n        * @param {Mixed} error An object used for the sequence's termination.\n        * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n        */\n        throw<T>(exception: Error, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n        * @param {Mixed} error An object used for the sequence's termination.\n        * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n        */\n        throw<T>(exception: any, scheduler?: IScheduler): Observable<T>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<any>;\n    o = Rx.Observable.throw(new Error());\n    o = Rx.Observable.throw(new Error(), Rx.Scheduler.async);\n    o = Rx.Observable.throw('abc');\n    o = Rx.Observable.throw('abc', Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/timeinterval.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n\texport interface TimeInterval<T> {\n\t\tvalue: T;\n\t\tinterval: number;\n\t}\n\n    export interface Observable<T> {\n        /**\n        *  Records the time interval between consecutive values in an observable sequence.\n        *\n        * @example\n        *  1 - res = source.timeInterval();\n        *  2 - res = source.timeInterval(Rx.Scheduler.timeout);\n        *\n        * @param [scheduler]  Scheduler used to compute time intervals. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence with time interval information on values.\n        */\n        timeInterval(scheduler?: IScheduler): Observable<TimeInterval<T>>;\n    }\n}\n\n(function () {\n\tvar o : Rx.Observable<string>;\n\tvar t : Rx.Observable<Rx.TimeInterval<string>>;\n\n\tt = o.timeInterval(Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/timeout.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: Date, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: Date, other?: Observable<T>, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: number, other?: Observable<T>, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(timeoutdurationSelector: (item: T) => Observable<TTimeout>): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @param {Observable} other  Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException().\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(timeoutdurationSelector: (item: T) => Observable<TTimeout>, other: Observable<T>): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Observable} [firstTimeout]  Observable sequence that represents the timeout for the first element. If not provided, this defaults to Observable.never().\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException().\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(firstTimeout: Observable<TTimeout>, timeoutdurationSelector: (item: T) => Observable<TTimeout>, other?: Observable<T>): Observable<T>;\n    }\n}\n\n\n(function () {\n    var o: Rx.Observable<string>;\n    o.timeout(100);\n    o.timeout(100, Rx.Scheduler.default);\n    o.timeout(new Date());\n    o.timeout(new Date(), Rx.Scheduler.default);\n    o.timeout(100, o);\n    o.timeout(new Date(), o);\n    o.timeout(100, o, Rx.Scheduler.async);\n    o.timeout(new Date(), o, Rx.Scheduler.async);\n\n    o.timeout(x => Rx.Observable.interval(1000));\n    o.timeout(x => Rx.Observable.interval(1000), Rx.Observable.just('100'));\n    o.timeout(Rx.Observable.interval(1000), x => Rx.Observable.interval(1000));\n    o.timeout(Rx.Observable.interval(1000), x => Rx.Observable.interval(1000), Rx.Observable.just('100'));\n});\n"
  },
  {
    "path": "ts/core/linq/observable/timer.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n         *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n         * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n         * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n         * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n         * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n         */\n        timer(dueTime: number, period: number, scheduler?: IScheduler): Observable<number>;\n        /**\n         *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n         * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n         * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n         * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n         * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n         */\n        timer(dueTime: number, scheduler?: IScheduler): Observable<number>;\n    }\n}\n\n\n(function () {\n    var o : Rx.Observable<number>;\n    o = Rx.Observable.timer(100);\n    o = Rx.Observable.timer(100, 100);\n    o = Rx.Observable.timer(100, 100, Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/timestamp.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Timestamp<T> {\n        value: T;\n        timestamp: number;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Records the timestamp for each value in an observable sequence.\n        *\n        * @example\n        *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n        *  2 - res = source.timestamp(Rx.Scheduler.default);\n        *\n        * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the default scheduler is used.\n        * @returns {Observable} An observable sequence with timestamp information on values.\n        */\n        timestamp(scheduler?: IScheduler): Observable<Timestamp<T>>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<number>;\n    var t : Rx.Observable<Rx.Timestamp<number>>;\n    t = o.timestamp(Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/toarray.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Creates an array from an observable sequence.\n        * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n        */\n        toArray(): Observable<T[]>;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<number>;\n    var t : Rx.Observable<number[]>;\n    t = o.toArray();\n});\n"
  },
  {
    "path": "ts/core/linq/observable/toasync.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<TResult>(func: () => TResult, context?: any, scheduler?: IScheduler): () => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, TResult>(func: (arg1: T1) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1) => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, T2, TResult>(func: (arg1: T1, arg2: T2) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1, arg2: T2) => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, T2, T3, TResult>(func: (arg1: T1, arg2: T2, arg3: T3) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1, arg2: T2, arg3: T3) => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, T2, T3, T4, TResult>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Observable<TResult>;\n    }\n}\n\n\n(function() {\n    var o: () => Rx.Observable<string>;\n    var o2: (a: any) => Rx.Observable<string>;\n    var o3: (a: any, b: any) => Rx.Observable<string>;\n    var o4: (a: any, b: any, c: any) => Rx.Observable<string>;\n    o = Rx.Observable.toAsync(() => 'abc');\n    o2 = Rx.Observable.toAsync((a) => 'abc');\n    o3 = Rx.Observable.toAsync((a, b) => 'abc');\n    o4 = Rx.Observable.toAsync((a, b, c) => 'abc');\n    o = Rx.Observable.toAsync(() => 'abc', {}, Rx.Scheduler.async);\n\n});\n"
  },
  {
    "path": "ts/core/linq/observable/tomap.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Converts the observable sequence to a Map if it exists.\n        * @param {Function} keySelector A function which produces the key for the Map.\n        * @param {Function} [elementSelector] An optional function which produces the element for the Map. If not present, defaults to the value from the observable sequence.\n        * @returns {Observable} An observable sequence with a single value of a Map containing the values from the observable sequence.\n        */\n        toMap<TKey>(keySelector: (value: T) => TKey): Observable<Map<TKey, T>>;\n        /**\n        * Converts the observable sequence to a Map if it exists.\n        * @param {Function} keySelector A function which produces the key for the Map.\n        * @param {Function} [elementSelector] An optional function which produces the element for the Map. If not present, defaults to the value from the observable sequence.\n        * @returns {Observable} An observable sequence with a single value of a Map containing the values from the observable sequence.\n        */\n        toMap<TKey, TElement>(keySelector: (value: T) => TKey, elementSelector: (value: T) => TElement): Observable<Map<TKey, TElement>>;\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/topromise.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /*\n         * Converts an existing observable sequence to an ES6 Compatible Promise\n         * @example\n         * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n         *\n         * // With config\n         * Rx.config.Promise = RSVP.Promise;\n         * var promise = Rx.Observable.return(42).toPromise();\n         * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n         * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n         */\n        toPromise(promiseCtor?: { new (resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): IPromise<T>; }): IPromise<T>;\n        /*\n         * Converts an existing observable sequence to an ES6 Compatible Promise\n         * @example\n         * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n         *\n         * // With config\n         * Rx.config.Promise = RSVP.Promise;\n         * var promise = Rx.Observable.return(42).toPromise();\n         * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n         * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n         */\n        toPromise<TPromise extends IPromise<T>>(promiseCtor: { new (resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): TPromise; }): TPromise;\n    }\n}\n\n(function () {\n    var o : Rx.Observable<number>;\n    var t : Rx.Promise<number>;\n    t = o.toPromise();\n});\n"
  },
  {
    "path": "ts/core/linq/observable/toset.ts",
    "content": "/// <reference path=\"../../observable.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n         * Converts the observable sequence to a Set if it exists.\n         * @returns {Observable} An observable sequence with a single value of a Set containing the values from the observable sequence.\n         */\n        toSet() : Observable< Set<T>>;\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/transduce.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n         * Executes a transducer to transform the observable sequence\n         * @param {Transducer} transducer A transducer to execute\n         * @returns {Observable} An Observable sequence containing the results from the transducer.\n         */\n        transduce(transducer: any): any;\n        //TODO: Setup transducer\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/using.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n         * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n         * @param {Function} resourceFactory Factory function to obtain a resource object.\n         * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n         * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n         */\n        using<TSource, TResource extends IDisposable>(resourceFactory: () => TResource, observableFactory: (resource: TResource) => Observable<TSource>): Observable<TSource>;\n    }\n}\n\n(function () {\n    var s : Rx.Observable<string>;\n    var r : Rx.Disposable;\n    s = Rx.Observable.using(() => r, () => s);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/when.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../joins/plan.ts\" />\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        *  Joins together the results from several patterns.\n        *\n        *  @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns.\n        *  @returns {Observable} Observable sequence with the results form matching several patterns.\n        */\n        when<TR>(plan: Plan<TR>): Observable<TR>;\n    }\n}\n"
  },
  {
    "path": "ts/core/linq/observable/while.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        *  Repeats source as long as condition holds emulating a while loop.\n        * There is an alias for this method called 'whileDo' for browsers <IE9\n        *\n        * @param {Function} condition The condition which determines if the source will be repeated.\n        * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n        * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n        */\n        while<T>(condition: () => boolean, source: ObservableOrPromise<T>): Observable<T>;\n        /**\n        *  Repeats source as long as condition holds emulating a while loop.\n        * There is an alias for this method called 'whileDo' for browsers <IE9\n        *\n        * @param {Function} condition The condition which determines if the source will be repeated.\n        * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n        * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n        */\n        whileDo<T>(condition: () => boolean, source: ObservableOrPromise<T>): Observable<T>;\n    }\n}\n\n(function () {\n    var o :Rx.Observable<number>;\n\n    o = Rx.Observable.while(() => true, Rx.Observable.just(1));\n});\n"
  },
  {
    "path": "ts/core/linq/observable/window.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more windows.\n        *\n        *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        window<TWindowOpening>(windowOpenings: Observable<TWindowOpening>): Observable<Observable<T>>;\n        /**\n        *  Projects each element of an observable sequence into zero or more windows.\n        *\n        *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        window<TWindowClosing>(windowClosingSelector: () => Observable<TWindowClosing>): Observable<Observable<T>>;\n        /**\n        *  Projects each element of an observable sequence into zero or more windows.\n        *\n        *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        window<TWindowOpening, TWindowClosing>(windowOpenings: Observable<TWindowOpening>, windowClosingSelector: () => Observable<TWindowClosing>): Observable<Observable<T>>;\n    }\n}\n\n(function() {\n    var o : Rx.Observable<string>;\n    var open : Rx.Observable<boolean>;\n\n    var so : Rx.Observable<Rx.Observable<string>> = o.window(open);\n    so = o.window(() => Rx.Observable.timer(100));\n    so = o.window(open, () => Rx.Observable.timer(100));\n});\n"
  },
  {
    "path": "ts/core/linq/observable/windowwithcount.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n        *\n        *  var res = xs.windowWithCount(10);\n        *  var res = xs.windowWithCount(10, 1);\n        * @param {Number} count Length of each window.\n        * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithCount(count: number, skip?: number): Observable<Observable<T>>;\n    }\n}\n\n(function() {\n    var o : Rx.Observable<string>;\n\n    var so : Rx.Observable<Rx.Observable<string>> = o.windowWithTime(100);\n    so = o.windowWithCount(100, 5);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/windowwithtime.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n        * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n        * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithTime(timeSpan: number, timeShift: number, scheduler?: IScheduler): Observable<Observable<T>>;\n        /**\n        *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n        * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n        * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithTime(timeSpan: number, scheduler?: IScheduler): Observable<Observable<T>>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<string>;\n\n    var so: Rx.Observable<Rx.Observable<string>> = o.windowWithTime(100);\n    so = o.windowWithTime(100, 5);\n    var so: Rx.Observable<Rx.Observable<string>> = o.windowWithTime(100, Rx.Scheduler.async);\n    so = o.windowWithTime(100, 5, Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/windowwithtimeorcount.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\n/// <reference path=\"../../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed.\n        * @param {Number} timeSpan Maximum time length of a window.\n        * @param {Number} count Maximum element count of a window.\n        * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithTimeOrCount(timeSpan: number, count: number, scheduler?: IScheduler): Observable<Observable<T>>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<string>;\n    var so: Rx.Observable<Rx.Observable<string>> = o.windowWithTimeOrCount(100, 200);\n    var so: Rx.Observable<Rx.Observable<string>> = o.windowWithTimeOrCount(100, 200, Rx.Scheduler.default);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/withlatestfrom.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface Observable<T> {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<TOther, TResult>(souces: ObservableOrPromise<TOther>[], resultSelector: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n    }\n}\n\n(function() {\n    var o: Rx.Observable<boolean>;\n    var io: Rx.IObservable<string>;\n    var so: Rx.Subject<number>;\n    var p: Rx.Promise<{ a: string }>;\n\n    var r: Rx.Observable<{ vo: boolean, vio: string, vp: { a: string }, vso: number }> = o.withLatestFrom(io, p, so, (vo, vio, vp, vso) => ({ vo, vio, vp, vso }));\n\n    var rr : Rx.Observable<number> = o.withLatestFrom(<any[]>[io, so, p], (v1, items) => 5);\n});\n"
  },
  {
    "path": "ts/core/linq/observable/zip.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, TResult>(sources: ObservableOrPromise<T2>[], resultSelector?: (item1: T1, ...right: T2[]) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, TResult>(source1: ObservableOrPromise<T1>, ObservableOrPromise: Observable<T2>, resultSelector?: (item1: T1, item2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, resultSelector?: (item1: T1, item2: T2, item3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, TResult>(source1: Observable<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, T8, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, source8: ObservableOrPromise<T8>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, source8: ObservableOrPromise<T8>, source9: ObservableOrPromise<T9>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8, item9: T9) => TResult): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector?: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector?: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<TOther, TResult>(souces: ObservableOrPromise<TOther>[], resultSelector?: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n    }\n}\n\n"
  },
  {
    "path": "ts/core/linq/observable/zipiterable.ts",
    "content": "/// <reference path=\"../../observable.ts\"/>\nmodule Rx {\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n        * @param arguments Observable sources.\n        * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n        */\n        zipIterable<T>(...sources: Observable<T>[]): Observable<T[]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n        * @param arguments Observable sources.\n        * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n        */\n        zipIterable<T>(sources: Observable<T>[]): Observable<T[]>;\n    }\n}\n"
  },
  {
    "path": "ts/core/notification.ts",
    "content": "/// <reference path=\"./disposables/disposable.ts\" />\n/// <reference path=\"./concurrency/scheduler.ts\" />\n/// <reference path=\"./observable.ts\" />\n/// <reference path=\"./observer-lite.ts\" />\nmodule Rx {\n    /**\n     *  Represents a notification to an observer.\n     */\n    export interface Notification<T> {\n        /**\n         * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n         *\n         * @memberOf Notification\n         * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n         * @param {Function} onError Delegate to invoke for an OnError notification.\n         * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n         * @returns {Any} Result produced by the observation.\n         */\n        accept(observer: IObserver<T>): void;\n        /**\n         * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n         *\n         * @memberOf Notification\n         * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n         * @param {Function} onError Delegate to invoke for an OnError notification.\n         * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n         * @returns {Any} Result produced by the observation.\n         */\n        accept<TResult>(onNext: (value: T) => TResult, onError: (exception: any) => TResult, onCompleted: () => TResult): TResult;\n\n        /**\n         * Returns an observable sequence with a single notification.\n         *\n         * @memberOf Notifications\n         * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n         * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n         */\n        toObservable(scheduler?: IScheduler): Observable<T>;\n\n        hasValue: boolean;\n        equals(other: Notification<T>): boolean;\n        kind: string;\n        value: T;\n        error: any;\n    }\n\n    interface NotificationStatic {\n        new <T>(kind: any, value: any, exception: any, accept: any, acceptObservable: any, toString: any) : Notification<T>;\n\n        /**\n        * Creates an object that represents an OnNext notification to an observer.\n        * @param {Any} value The value contained in the notification.\n        * @returns {Notification} The OnNext notification containing the value.\n        */\n        createOnNext<T>(value: T): Notification<T>;\n        /**\n        * Creates an object that represents an OnError notification to an observer.\n        * @param {Any} error The exception contained in the notification.\n        * @returns {Notification} The OnError notification containing the exception.\n        */\n        createOnError<T>(exception: any): Notification<T>;\n        /**\n        * Creates an object that represents an OnCompleted notification to an observer.\n        * @returns {Notification} The OnCompleted notification.\n        */\n        createOnCompleted<T>(): Notification<T>;\n    }\n\n    export var Notification : NotificationStatic;\n}\n\n\n(function() {\n    var notification: Rx.Notification<number> = new Rx.Notification<number>(undefined, undefined, undefined, undefined, undefined, undefined);\n\n    var observer: Rx.IObserver<number>;\n    notification.accept(observer);\n    notification.accept((n) => n.toString(), (e) => e, () => false.toString());\n\n    var observable: Rx.Observable<number> = notification.toObservable();\n    var observable: Rx.Observable<number> = notification.toObservable(Rx.Scheduler.currentThread);\n\n    Rx.Notification.createOnNext(() => true);\n    Rx.Notification.createOnError(new Error('a'));\n    Rx.Notification.createOnCompleted();\n});\n"
  },
  {
    "path": "ts/core/observable.ts",
    "content": "/// <reference path=\"./es6.ts\" />\n/// <reference path=\"./disposables/disposable.ts\" />\n/// <reference path=\"./observer-lite.ts\" />\nmodule Rx {\n    export module config {\n        export var Promise: { new <T>(resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): IPromise<T>; };\n    }\n\n    export module helpers {\n        export var noop: () => void;\n        export var notDefined: (value: any) => boolean;\n        export var identity: <T>(value: T) => T;\n        export var defaultNow: () => number;\n        export var defaultComparer: (left: any, right: any) =>  boolean;\n        export var defaultSubComparer: (left: any, right: any) =>  number;\n        export var defaultKeySerializer: (key: any) =>  string;\n        export var defaultError: (err: any) =>  void;\n        export var isPromise: (p: any) =>  boolean;\n        export var asArray: <T>(...args: T[]) =>  T[];\n        export var not: (value: any) =>  boolean;\n        export var isFunction: (value: any) =>  boolean;\n    }\n\n    export type _Selector<T, TResult> = (value: T, index: number, observable: Observable<T>) => TResult;\n    export type _ValueOrSelector<T, TResult> = TResult | _Selector<T, TResult>;\n    export type _Predicate<T> = _Selector<T, boolean>;\n    export type _Comparer<T, TResult> = (value1: T, value2: T) => TResult;\n    export type _Accumulator<T, TAcc> = (acc: TAcc, value: T) => TAcc;\n\n    export module special {\n        export type _FlatMapResultSelector<T1, T2, TResult> = (value: T1, selectorValue: T2, index: number, selectorOther: number) => TResult;\n    }\n\n    export interface IObservable<T> {\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(observer: IObserver<T>): IDisposable;\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(observer: IObserver<T>): IDisposable;\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n\n        /**\n        * Subscribes to the next value in the sequence with an optional \"this\" argument.\n        * @param {Function} onNext The function to invoke on each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnNext(onNext: (value: T) => void, thisArg?: any): IDisposable;\n        /**\n        * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n        * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnError(onError: (exception: any) => void, thisArg?: any): IDisposable;\n        /**\n        * Subscribes to the next value in the sequence with an optional \"this\" argument.\n        * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnCompleted(onCompleted: () => void, thisArg?: any): IDisposable;\n\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        forEach(observer: IObserver<T>): IDisposable;\n\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        forEach(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Determines whether the given object is an Observable\n        * @param {Any} An object to determine whether it is an Observable\n        * @returns {Boolean} true if an Observable, else false.\n        */\n        isObservable(o: any): boolean;\n    }\n\n    export var Observable: ObservableStatic;\n}\n\n\n(function() {\n    var observer: Rx.IObserver<number>;\n    var observable: Rx.Observable<number>;\n\n    observable.subscribe(observer);\n    observable.subscribe((v) => {});\n    observable.subscribe((v) => {}, (e) => {});\n    observable.subscribe((v) => {}, (e) => {}, () => {});\n\n    observable.subscribeOnNext((v) => {});\n    observable.subscribeOnNext((v) => {}, {});\n\n    observable.subscribeOnError((v) => {});\n    observable.subscribeOnError((v) => {}, {});\n\n    observable.subscribeOnCompleted(() => {});\n    observable.subscribeOnCompleted(() => {}, {});\n\n    observable.forEach(observer);\n    observable.forEach((v) => {});\n    observable.forEach((v) => {}, (e) => {});\n    observable.forEach((v) => {}, (e) => {}, () => {});\n\n    Rx.Observable.isObservable({});\n});\n"
  },
  {
    "path": "ts/core/observer-extras.ts",
    "content": "/// <reference path=\"./disposables/disposable.ts\" />\n/// <reference path=\"./checkedobserver.ts\" />\n/// <reference path=\"./notification.ts\" />\nmodule Rx {\n\texport interface Observer<T> {\n        /**\n        *  Creates a notification callback from an observer.\n        * @returns The action that forwards its input notification to the underlying observer.\n        */\n\t\ttoNotifier(): (notification: Notification<T>) => void;\n\n        /**\n        *  Hides the identity of an observer.\n        * @returns An observer that hides the identity of the specified observer.\n        */\n\t\tasObserver(): Observer<T>;\n\n        /**\n        *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n        *  If a violation is detected, an Error is thrown from the offending observer method call.\n        * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n        */\n        checked(): CheckedObserver<T>;\n\n        /**\n        * Schedules the invocation of observer methods on the given scheduler.\n        * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n        * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n        */\n        notifyOn(scheduler: IScheduler): Observer<T>;\n\t}\n\n\texport interface ObserverStatic {\n        /**\n        *  Creates an observer from a notification callback.\n        *\n        * @static\n        * @memberOf Observer\n        * @param {Function} handler Action that handles a notification.\n        * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n        */\n\t\tfromNotifier<T>(handler: (notification: Notification<T>, thisArg?: any) => void): Observer<T>;\n\t}\n}\n\n\n(function() {\n    var observer: Rx.Observer<boolean>;\n    var n: (notification: Rx.Notification<boolean>) => void = observer.toNotifier();\n\n    var o: Rx.Observer<boolean> = observer.asObserver();\n\n    var c: Rx.CheckedObserver<boolean> = observer.checked();\n\n    o = observer.notifyOn(Rx.Scheduler.immediate);\n\n    var so : Rx.Observer<number> = Rx.Observer.fromNotifier<number>((n) => {\n        // Handle next calls\n        if (n.kind === 'N') {\n            console.log('Next: ' + n.value);\n        }\n\n        // Handle error calls\n        if (n.kind === 'E') {\n            console.log('Error: ' + n.exception);\n        }\n\n        // Handle completed\n        if (n.kind === 'C') {\n            console.log('Completed')\n        }\n    });\n});\n"
  },
  {
    "path": "ts/core/observer-lite.ts",
    "content": "/// <reference path=\"./disposables/disposable.ts\" />\n/// <reference path=\"./checkedobserver.ts\" />\nmodule Rx {\n    /**\n    * Supports push-style iteration over an observable sequence.\n    */\n    export interface IObserver<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n    \n    export interface Observer<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n\n    export interface ObserverStatic {\n        /**\n        *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n        * @param {Function} [onNext] Observer's OnNext action implementation.\n        * @param {Function} [onError] Observer's OnError action implementation.\n        * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n        * @returns {Observer} The observer object implemented using the given actions.\n        */\n        create<T>(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observer<T>;\n    }\n\n    /**\n    * Supports push-style iteration over an observable sequence.\n    */\n    export var Observer: ObserverStatic;\n}\n\n\n(function() {\n    var iobserver: Rx.IObserver<boolean>;\n    var observer: Rx.Observer<boolean>;\n\n    iobserver.onNext(false);\n    iobserver.onError(new Error('a'));\n    iobserver.onCompleted();\n\n    observer.onNext(false);\n    observer.onError(new Error('a'));\n    observer.onCompleted();\n\n    var so: Rx.Observer<number> = Rx.Observer.create((v) => 1);\n    so = Rx.Observer.create((v) => 1, (e) => { });\n    so = Rx.Observer.create((v) => 1, (e) => { }, () => { });\n});\n"
  },
  {
    "path": "ts/core/observer.ts",
    "content": "/// <reference path=\"./disposables/disposable.ts\" />\nmodule Rx {\n\texport interface Observer<T> {\n        makeSafe(disposable: IDisposable): Observer<T>;\n\t}\n}\n\n(function() {\n    var observer: Rx.Observer<boolean>;\n\tobserver = observer.makeSafe(Rx.Disposable.create(() => {}));\n});\n"
  },
  {
    "path": "ts/core/scheduledobserver.ts",
    "content": "/// <reference path=\"./observer-lite.ts\" />\nmodule Rx {\n    export module internals {\n        export interface ScheduledObserver<T> extends Observer<T> {\n            ensureActive(): void;\n        }\n    }\n}\n\n(function() {\n    var observer: Rx.internals.ScheduledObserver<boolean>;\n\tobserver.ensureActive();\n});\n"
  },
  {
    "path": "ts/core/subjects/anonymoussubject.ts",
    "content": "/// <reference path=\"./subject.ts\" />\nmodule Rx {\n    export interface AnonymousSubject<T> extends Subject<T> { }\n\n    interface AnonymousSubjectStatic {\n        /**\n         * Creates a subject that can only receive one value and that value is cached for all future observations.\n         * @constructor\n         */\n        new <T>(): AnonymousSubject<T>;\n    }\n\n    /**\n     *  Represents the result of an asynchronous operation.\n     *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n     */\n    export var AnonymousSubject: AnonymousSubjectStatic;\n}\n\n(function() {\n    var s : Rx.AnonymousSubject<boolean> = new Rx.AnonymousSubject<boolean>();\n});\n"
  },
  {
    "path": "ts/core/subjects/asyncsubject.ts",
    "content": "/// <reference path=\"./subject.ts\" />\n\nmodule Rx {\n    export interface AsyncSubject<T> extends Subject<T> { }\n\n    interface AsyncSubjectStatic {\n        /**\n         * Creates a subject that can only receive one value and that value is cached for all future observations.\n         * @constructor\n         */\n        new <T>(): AsyncSubject<T>;\n    }\n\n    /**\n     *  Represents the result of an asynchronous operation.\n     *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n     */\n    export var AsyncSubject: AsyncSubjectStatic;\n}\n\n(function() {\n    var s : Rx.AsyncSubject<boolean> = new Rx.AsyncSubject<boolean>();\n});\n"
  },
  {
    "path": "ts/core/subjects/behaviorsubject.ts",
    "content": "/// <reference path=\"./subject.ts\" />\n\nmodule Rx {\n    export interface BehaviorSubject<T> extends Subject<T> {\n        /**\n         * Gets the current value or throws an exception.\n         * Value is frozen after onCompleted is called.\n         * After onError is called always throws the specified exception.\n         * An exception is always thrown after dispose is called.\n         * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n         */\n        getValue(): T;\n    }\n\n    interface BehaviorSubjectStatic {\n        /**\n         *  Initializes a new instance of the BehaviorSubject class which creates a subject that caches its last value and starts with the specified value.\n         *  @param {Mixed} value Initial value sent to observers when no other value has been received by the subject yet.\n         */\n        new <T>(initialValue: T): BehaviorSubject<T>;\n    }\n\n    /**\n     *  Represents a value that changes over time.\n     *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n     */\n    export var BehaviorSubject: BehaviorSubjectStatic;\n}\n\n(function() {\n    var s : Rx.BehaviorSubject<boolean> = new Rx.BehaviorSubject(false);\n    var b : boolean = s.getValue();\n});\n"
  },
  {
    "path": "ts/core/subjects/replaysubject.ts",
    "content": "/// <reference path=\"./subject.ts\" />\n/// <reference path=\"../concurrency/scheduler.ts\" />\nmodule Rx {\n    export interface ReplaySubject<T> extends Subject<T> { }\n\n    interface ReplaySubjectStatic {\n        /**\n         *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n         *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n         *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n         *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n         */\n        new <T>(bufferSize?: number, window?: number, scheduler?: IScheduler): ReplaySubject<T>;\n    }\n\n    /**\n    * Represents an object that is both an observable sequence as well as an observer.\n    * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n    */\n    export var ReplaySubject: ReplaySubjectStatic;\n}\n\n(function() {\n    var s : Rx.ReplaySubject<boolean> = new Rx.ReplaySubject<boolean>();\n    var s : Rx.ReplaySubject<boolean> = new Rx.ReplaySubject<boolean>(10);\n    var s : Rx.ReplaySubject<boolean> = new Rx.ReplaySubject<boolean>(10, 10);\n    var s : Rx.ReplaySubject<boolean> = new Rx.ReplaySubject<boolean>(10, 10, Rx.Scheduler.async);\n});\n"
  },
  {
    "path": "ts/core/subjects/subject.ts",
    "content": "/// <reference path=\"../observable.ts\" />\n/// <reference path=\"../observer-lite.ts\" />\n/// <reference path=\"../disposables/disposable.ts\"/>\n\nmodule Rx {\n    /**\n     *  Represents an object that is both an observable sequence as well as an observer.\n     *  Each notification is broadcasted to all subscribed observers.\n     */\n    export interface ISubject<T> extends IObservable<T>, IObserver<T>, IDisposable {\n        hasObservers(): boolean;\n    }\n\n    export interface Subject<T> extends Observable<T>, Observer<T>, IDisposable {\n        hasObservers(): boolean;\n        /** Is this value disposed. */\n        isDisposed: boolean;\n    }\n\n    interface SubjectStatic {\n        /**\n         * Creates a subject.\n         */\n        new <T>(): Subject<T>;\n\n        /**\n         * Creates a subject from the specified observer and observable.\n         * @param {Observer} observer The observer used to send messages to the subject.\n         * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n         * @returns {Subject} Subject implemented using the given observer and observable.\n         */\n        create<T>(observer?: IObserver<T>, observable?: IObservable<T>): Subject<T>;\n    }\n\n    /**\n     *  Represents an object that is both an observable sequence as well as an observer.\n     *  Each notification is broadcasted to all subscribed observers.\n     */\n    export var Subject: SubjectStatic;\n}\n\n(function() {\n    var is: Rx.ISubject<boolean> = new Rx.Subject<boolean>();\n    var s : Rx.Subject<boolean> = new Rx.Subject<boolean>();\n\n    is.hasObservers();\n    s.hasObservers();\n\n    s.isDisposed;\n\n    var iob : Rx.IObserver<boolean> = s;\n    var io : Rx.IObservable<boolean> = s;\n    var ob : Rx.Observer<boolean> = s;\n    var o : Rx.Observable<boolean> = s;\n    var d : Rx.IDisposable = s;\n\n    var ns : Rx.ISubject<boolean> = Rx.Subject.create(iob, io);\n    var ns : Rx.ISubject<boolean> = Rx.Subject.create(ob, o);\n});\n"
  },
  {
    "path": "ts/core/testing/mockdisposable.ts",
    "content": "  // var MockDisposable = Rx.MockDisposable = function (scheduler) {\n  //   this.scheduler = scheduler;\n  //   this.disposes = [];\n  //   this.disposes.push(this.scheduler.clock);\n  // };\n  //\n  // MockDisposable.prototype.dispose = function () {\n  //   this.disposes.push(this.scheduler.clock);\n  // };\n"
  },
  {
    "path": "ts/core/testing/mockobserver.ts",
    "content": "/// <reference path=\"../observer-lite.ts\" />\n/// <reference path=\"./recorded.ts\" />\n/// <reference path=\"../concurrency/scheduler.ts\" />\n\nmodule Rx {\n    export interface MockObserver<T> extends Observer<T> {\n        messages: Recorded[];\n    }\n\n    interface MockObserverStatic extends ObserverStatic {\n        new <T>(scheduler: IScheduler): MockObserver<T>;\n    }\n\n    export var MockObserver: MockObserverStatic;\n}\n\n(function() {\n    var o : Rx.MockObserver<string>;\n    var r: Rx.Recorded[] =  o.messages;\n    var oo : Rx.IObserver<string> = o;\n});\n"
  },
  {
    "path": "ts/core/testing/reactivetest.ts",
    "content": "/// <reference path=\"./subscription.ts\" />\n/// <reference path=\"./recorded.ts\" />\n\nmodule Rx {\n    export var ReactiveTest: {\n        /** Default virtual time used for creation of observable sequences in unit tests. */\n        created: number;\n        /** Default virtual time used to subscribe to observable sequences in unit tests. */\n        subscribed: number;\n        /** Default virtual time used to dispose subscriptions in unit tests. */\n        disposed: number;\n\n        /**\n         * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n         *\n         * 1 - ReactiveTest.onNext(200, 42);\n         * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n         *\n         * @param ticks Recorded virtual time the OnNext notification occurs.\n         * @param value Recorded value stored in the OnNext notification or a predicate.\n         * @return Recorded OnNext notification.\n         */\n        onNext(ticks: number, value: any): Recorded;\n        /**\n         * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n         *\n         * 1 - ReactiveTest.onNext(200, 42);\n         * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n         *\n         * @param ticks Recorded virtual time the OnNext notification occurs.\n         * @param value Recorded value stored in the OnNext notification or a predicate.\n         * @return Recorded OnNext notification.\n         */\n        onNext(ticks: number, predicate: (value: any) => boolean): Recorded;\n        /**\n         * Factory method for an OnError notification record at a given time with a given error.\n         *\n         * 1 - ReactiveTest.onNext(200, new Error('error'));\n         * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n         *\n         * @param ticks Recorded virtual time the OnError notification occurs.\n         * @param exception Recorded exception stored in the OnError notification.\n         * @return Recorded OnError notification.\n         */\n        onError(ticks: number, exception: any): Recorded;\n        /**\n         * Factory method for an OnError notification record at a given time with a given error.\n         *\n         * 1 - ReactiveTest.onNext(200, new Error('error'));\n         * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n         *\n         * @param ticks Recorded virtual time the OnError notification occurs.\n         * @param exception Recorded exception stored in the OnError notification.\n         * @return Recorded OnError notification.\n         */\n        onError(ticks: number, predicate: (exception: any) => boolean): Recorded;\n        /**\n         * Factory method for an OnCompleted notification record at a given time.\n         *\n         * @param ticks Recorded virtual time the OnCompleted notification occurs.\n         * @return Recorded OnCompleted notification.\n         */\n        onCompleted(ticks: number): Recorded;\n\n        /**\n         * Factory method for a subscription record based on a given subscription and disposal time.\n         *\n         * @param start Virtual time indicating when the subscription was created.\n         * @param end Virtual time indicating when the subscription was disposed.\n         * @return Subscription object.\n         */\n        subscribe(subscribeAt: number, unsubscribeAt?: number): Subscription;\n    }\n}\n\n(function() {\n    var n : number = Rx.ReactiveTest.created;\n    var n : number = Rx.ReactiveTest.subscribed;\n    var n : number = Rx.ReactiveTest.disposed;\n\n    var r : Rx.Recorded = Rx.ReactiveTest.onNext(100, 'abc');\n    var r : Rx.Recorded = Rx.ReactiveTest.onNext(100, (v: any) => false);\n    var r : Rx.Recorded = Rx.ReactiveTest.onError(100, new Error('abc'));\n    var r : Rx.Recorded = Rx.ReactiveTest.onError(100, (v: any) => true);\n    var r : Rx.Recorded = Rx.ReactiveTest.onCompleted(100);\n\n    var s : Rx.Subscription = Rx.ReactiveTest.subscribe(100);\n    var s : Rx.Subscription = Rx.ReactiveTest.subscribe(100, 200);\n});\n"
  },
  {
    "path": "ts/core/testing/recorded.ts",
    "content": "module Rx {\n    export interface Recorded {\n        /**\n         * Checks whether the given recorded object is equal to the current instance.\n         *\n         * @param {Recorded} other Recorded object to check for equality.\n         * @returns {Boolean} true if both objects are equal; false otherwise.\n         */\n        equals(other: Recorded): boolean;\n        /**\n         * Returns a string representation of the current Recorded value.\n         *\n         * @returns {String} String representation of the current Recorded value.\n         */\n        toString(): string;\n        time: number;\n        value: any;\n    }\n\n    interface RecordedStatic {\n        /**\n         * Creates a new object recording the production of the specified value at the given virtual time.\n         *\n         * @constructor\n         * @param {Number} time Virtual time the value was produced on.\n         * @param {Mixed} value Value that was produced.\n         * @param {Function} comparer An optional comparer.\n         */\n        new (time: number, value: any, equalityComparer?: _Comparer<any, boolean>): Recorded;\n    }\n\n    export var Recorded: RecordedStatic;\n}\n\n(function() {\n    var r: Rx.Recorded = new Rx.Recorded(100, 'abc');\n    var r: Rx.Recorded = new Rx.Recorded(100, 'abc', (x, y) => false);\n\n    var b: boolean = r.equals(r);\n    var s: string = r.toString();\n    var t: number = r.time;\n    var a: any = r.value;\n});\n"
  },
  {
    "path": "ts/core/testing/subscription.ts",
    "content": "module Rx {\n    export interface Subscription {\n        /**\n         * Checks whether the given subscription is equal to the current instance.\n         * @param other Subscription object to check for equality.\n         * @returns {Boolean} true if both objects are equal; false otherwise.\n         */\n        equals(other: Subscription): boolean;\n        /**\n         * Returns a string representation of the current Subscription value.\n         * @returns {String} String representation of the current Subscription value.\n         */\n        toString(): string;\n    }\n\n    interface SubscriptionStatic {\n        /**\n         * Creates a new subscription object with the given virtual subscription and unsubscription time.\n         *\n         * @constructor\n         * @param {Number} subscribe Virtual time at which the subscription occurred.\n         * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n         */\n        new (subscribeAt: number, unsubscribeAt?: number): Subscription;\n    }\n\n    export var Subscription: SubscriptionStatic;\n}\n\n(function() {\n    var s: Rx.Subscription = new Rx.Subscription(100);\n    var s: Rx.Subscription = new Rx.Subscription(100, 200);\n\n    var b: boolean = s.equals(s);\n    var st: string = s.toString();\n});\n"
  },
  {
    "path": "ts/core/testing/testscheduler.ts",
    "content": "/// <reference path=\"../concurrency/virtualtimescheduler.ts\" />\n/// <reference path=\"../observable.ts\" />\n/// <reference path=\"./recorded.ts\" />\n/// <reference path=\"./mockobserver.ts\" />\nmodule Rx {\n\n    export interface TestScheduler extends VirtualTimeScheduler<number, number> {\n        /**\n         * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n         * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n         * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n         */\n        createColdObservable<T>(...records: Recorded[]): Observable<T>;\n        /**\n         * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n         * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n         * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n         */\n        createHotObservable<T>(...records: Recorded[]): Observable<T>;\n        /**\n         * Creates an observer that records received notification messages and timestamps those.\n         * @return Observer that can be used to assert the timing of received notifications.\n         */\n        createObserver<T>(): MockObserver<T>;\n\n        /**\n         * Creates a resolved promise with the given value and ticks\n         * @param {Number} ticks The absolute time of the resolution.\n         * @param {Any} value The value to yield at the given tick.\n         * @returns {MockPromise} A mock Promise which fulfills with the given value.\n         */\n        createResolvedPromise<T>(ticks: number, value: T): IPromise<T>;\n        /**\n         * Creates a rejected promise with the given reason and ticks\n         * @param {Number} ticks The absolute time of the resolution.\n         * @param {Any} reason The reason for rejection to yield at the given tick.\n         * @returns {MockPromise} A mock Promise which rejects with the given reason.\n         */\n        createRejectedPromise<T>(ticks: number, value: T): IPromise<T>;\n\n        /**\n         * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n         *\n         * @param create Factory method to create an observable sequence.\n         * @param settings.created Virtual time at which to invoke the factory to create an observable sequence.\n         * @param settings.subscribed Virtual time at which to subscribe to the created observable sequence.\n         * @param settings.disposed Virtual time at which to dispose the subscription.\n         * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n         */\n        startScheduler<T>(create: () => Observable<T>, settings?: {created?: number, subscribed?: number, disposed?: number}): MockObserver<T>;\n    }\n\n    export var TestScheduler: {\n        new (): TestScheduler;\n    }\n}\n\n(function() {\n    var ts : Rx.TestScheduler = new Rx.TestScheduler();\n\n    var o : Rx.Observable<string> = ts.createColdObservable<string>(new Rx.Recorded(100, '5'));\n    var o : Rx.Observable<string> = ts.createHotObservable<string>(new Rx.Recorded(100, '5'));\n    var ob : Rx.MockObserver<boolean> = ts.createObserver<boolean>();\n\n    var p : Rx.Promise<boolean> = ts.createResolvedPromise<boolean>(100, false);\n    var p : Rx.Promise<boolean> = ts.createRejectedPromise<boolean>(100, false);\n\n    var ob = ts.startScheduler<boolean>(() => Rx.Observable.create<boolean>(<any>null), {\n        created: 100,\n        subscribed: 200,\n        disposed: 300\n    });\n    var ob = ts.startScheduler<boolean>(() => Rx.Observable.create<boolean>(<any>null), {\n        disposed: 300\n    });\n    var ob = ts.startScheduler<boolean>(() => Rx.Observable.create<boolean>(<any>null));\n});\n"
  },
  {
    "path": "ts/es6-promise.es6.d.ts",
    "content": "\ninterface PromiseLike<T> {\n    /**\n    * Attaches callbacks for the resolution and/or rejection of the Promise.\n    * @param onfulfilled The callback to execute when the Promise is resolved.\n    * @param onrejected The callback to execute when the Promise is rejected.\n    * @returns A Promise for the completion of which ever callback is executed.\n    */\n    then<TResult>(onfulfilled?: (value: T) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): PromiseLike<TResult>;\n    then<TResult>(onfulfilled?: (value: T) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => void): PromiseLike<TResult>;\n}\n\n/**\n * Represents the completion of an asynchronous operation\n */\ninterface Promise<T> {\n    /**\n    * Attaches callbacks for the resolution and/or rejection of the Promise.\n    * @param onfulfilled The callback to execute when the Promise is resolved.\n    * @param onrejected The callback to execute when the Promise is rejected.\n    * @returns A Promise for the completion of which ever callback is executed.\n    */\n    then<TResult>(onfulfilled?: (value: T) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => TResult | PromiseLike<TResult>): Promise<TResult>;\n    then<TResult>(onfulfilled?: (value: T) => TResult | PromiseLike<TResult>, onrejected?: (reason: any) => void): Promise<TResult>;\n\n    /**\n     * Attaches a callback for only the rejection of the Promise.\n     * @param onrejected The callback to execute when the Promise is rejected.\n     * @returns A Promise for the completion of the callback.\n     */\n    catch(onrejected?: (reason: any) => T | PromiseLike<T>): Promise<T>;\n    catch(onrejected?: (reason: any) => void): Promise<T>;\n\n    [Symbol.toStringTag]: string;\n}\n\ninterface PromiseConstructor {\n    /**\n      * A reference to the prototype.\n      */\n    prototype: Promise<any>;\n\n    /**\n     * Creates a new Promise.\n     * @param executor A callback used to initialize the promise. This callback is passed two arguments:\n     * a resolve callback used resolve the promise with a value or the result of another promise,\n     * and a reject callback used to reject the promise with a provided reason or error.\n     */\n    new <T>(executor: (resolve: (value?: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void): Promise<T>;\n\n    /**\n     * Creates a Promise that is resolved with an array of results when all of the provided Promises\n     * resolve, or rejected when any Promise is rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    all<T>(values: Iterable<T | PromiseLike<T>>): Promise<T[]>;\n\n    /**\n     * Creates a Promise that is resolved or rejected when any of the provided Promises are resolved\n     * or rejected.\n     * @param values An array of Promises.\n     * @returns A new Promise.\n     */\n    race<T>(values: Iterable<T | PromiseLike<T>>): Promise<T>;\n\n    /**\n     * Creates a new rejected promise for the provided reason.\n     * @param reason The reason the promise was rejected.\n     * @returns A new rejected Promise.\n     */\n    reject(reason: any): Promise<void>;\n\n    /**\n     * Creates a new rejected promise for the provided reason.\n     * @param reason The reason the promise was rejected.\n     * @returns A new rejected Promise.\n     */\n    reject<T>(reason: any): Promise<T>;\n\n    /**\n      * Creates a new resolved promise for the provided value.\n      * @param value A promise.\n      * @returns A promise whose internal state matches the provided promise.\n      */\n    resolve<T>(value: T | PromiseLike<T>): Promise<T>;\n\n    /**\n     * Creates a new resolved promise .\n     * @returns A resolved promise.\n     */\n    resolve(): Promise<void>;\n\n    [Symbol.species]: Function;\n}\n\ndeclare var Promise: PromiseConstructor;\n"
  },
  {
    "path": "ts/iterable.es6.d.ts",
    "content": "interface Symbol {\n    /** Returns a string representation of an object. */\n    toString(): string;\n\n    /** Returns the primitive value of the specified object. */\n    valueOf(): Object;\n\n    [Symbol.toStringTag]: string;\n}\n\ninterface SymbolConstructor {\n    /**\n      * A reference to the prototype.\n      */\n    prototype: Symbol;\n\n    /**\n      * Returns a new unique Symbol value.\n      * @param  description Description of the new Symbol object.\n      */\n    (description?: string|number): symbol;\n\n    /**\n      * Returns a Symbol object from the global symbol registry matching the given key if found.\n      * Otherwise, returns a new symbol with this key.\n      * @param key key to search for.\n      */\n    for(key: string): symbol;\n\n    /**\n      * Returns a key from the global symbol registry matching the given Symbol if found.\n      * Otherwise, returns a undefined.\n      * @param sym Symbol to find the key for.\n      */\n    keyFor(sym: symbol): string;\n\n    // Well-known Symbols\n\n    /**\n      * A method that determines if a constructor object recognizes an object as one of the\n      * constructor’s instances. Called by the semantics of the instanceof operator.\n      */\n    hasInstance: symbol;\n\n    /**\n      * A Boolean value that if true indicates that an object should flatten to its array elements\n      * by Array.prototype.concat.\n      */\n    isConcatSpreadable: symbol;\n\n    /**\n      * A method that returns the default iterator for an object. Called by the semantics of the\n      * for-of statement.\n      */\n    iterator: symbol;\n\n    /**\n      * A regular expression method that matches the regular expression against a string. Called\n      * by the String.prototype.match method.\n      */\n    match: symbol;\n\n    /**\n      * A regular expression method that replaces matched substrings of a string. Called by the\n      * String.prototype.replace method.\n      */\n    replace: symbol;\n\n    /**\n      * A regular expression method that returns the index within a string that matches the\n      * regular expression. Called by the String.prototype.search method.\n      */\n    search: symbol;\n\n    /**\n      * A function valued property that is the constructor function that is used to create\n      * derived objects.\n      */\n    species: symbol;\n\n    /**\n      * A regular expression method that splits a string at the indices that match the regular\n      * expression. Called by the String.prototype.split method.\n      */\n    split: symbol;\n\n    /**\n      * A method that converts an object to a corresponding primitive value.Called by the ToPrimitive\n      * abstract operation.\n      */\n    toPrimitive: symbol;\n\n    /**\n      * A String value that is used in the creation of the default string description of an object.\n      * Called by the built-in method Object.prototype.toString.\n      */\n    toStringTag: symbol;\n\n    /**\n      * An Object whose own property names are property names that are excluded from the with\n      * environment bindings of the associated objects.\n      */\n    unscopables: symbol;\n}\ndeclare var Symbol: SymbolConstructor;\n\ninterface IteratorResult<T> {\n    done: boolean;\n    value?: T;\n}\n\ninterface Iterator<T> {\n    next(value?: any): IteratorResult<T>;\n    return?(value?: any): IteratorResult<T>;\n    throw?(e?: any): IteratorResult<T>;\n}\n\ninterface Iterable<T> {\n    [Symbol.iterator](): Iterator<T>;\n}\n\ninterface IterableIterator<T> extends Iterator<T> {\n    [Symbol.iterator](): IterableIterator<T>;\n}\n\ninterface WeakMap<K, V> {\n    clear(): void;\n    delete(key: K): boolean;\n    get(key: K): V;\n    has(key: K): boolean;\n    set(key: K, value?: V): WeakMap<K, V>;\n}\n\ninterface WeakMapConstructor {\n    new <K, V>(): WeakMap<K, V>;\n    prototype: WeakMap<any, any>;\n}\n\ndeclare var WeakMap: WeakMapConstructor;\n\ninterface Map<K, V> {\n    clear(): void;\n    delete(key: K): boolean;\n    entries(): IterableIterator<[K, V]>;\n    forEach(callbackfn: (value: V, index: K, map: Map<K, V>) => void, thisArg?: any): void;\n    get(key: K): V;\n    has(key: K): boolean;\n    keys(): IterableIterator<K>;\n    set(key: K, value?: V): Map<K, V>;\n    size: number;\n    values(): IterableIterator<V>;\n    [Symbol.iterator]():IterableIterator<[K,V]>;\n    [Symbol.toStringTag]: string;\n}\n\ninterface MapConstructor {\n    new <K, V>(): Map<K, V>;\n    new <K, V>(iterable: Iterable<[K, V]>): Map<K, V>;\n    prototype: Map<any, any>;\n}\ndeclare var Map: MapConstructor;\n\ninterface Set<T> {\n    add(value: T): Set<T>;\n    clear(): void;\n    delete(value: T): boolean;\n    entries(): IterableIterator<[T, T]>;\n    forEach(callbackfn: (value: T, index: T, set: Set<T>) => void, thisArg?: any): void;\n    has(value: T): boolean;\n    keys(): IterableIterator<T>;\n    size: number;\n    values(): IterableIterator<T>;\n    [Symbol.iterator]():IterableIterator<T>;\n    [Symbol.toStringTag]: string;\n}\n\ninterface SetConstructor {\n    new <T>(): Set<T>;\n    new <T>(iterable: Iterable<T>): Set<T>;\n    prototype: Set<any>;\n}\ndeclare var Set: SetConstructor;\n\ninterface WeakSet<T> {\n    add(value: T): WeakSet<T>;\n    clear(): void;\n    delete(value: T): boolean;\n    has(value: T): boolean;\n    [Symbol.toStringTag]: string;\n}\n\ninterface WeakSetConstructor {\n    new <T>(): WeakSet<T>;\n    new <T>(iterable: Iterable<T>): WeakSet<T>;\n    prototype: WeakSet<any>;\n}\ndeclare var WeakSet: WeakSetConstructor;\n"
  },
  {
    "path": "ts/rx.aggregates.d.ts",
    "content": "declare module Rx {\n\n    export interface Observable<T> {\n        /**\n         * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n         * For aggregation behavior with incremental intermediate results, see Observable.scan.\n         * @param {Function} accumulator An accumulator function to be invoked on each element.\n         * @param {Any} [seed] The initial accumulator value.\n         * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n         */\n        reduce<TAcc>(accumulator: _Accumulator<T, TAcc>, seed?: TAcc): Observable<TAcc>;\n        /**\n         * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n         * For aggregation behavior with incremental intermediate results, see Observable.scan.\n         * @param {Function} accumulator An accumulator function to be invoked on each element.\n         * @param {Any} [seed] The initial accumulator value.\n         * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n         */\n        reduce(accumulator: _Accumulator<T, T>, seed?: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Determines whether any element of an observable sequence satisfies a condition if present, else if any items are in the sequence.\n        * @param {Function} [predicate] A function to test each element for a condition.\n        * @returns {Observable} An observable sequence containing a single element determining whether any elements in the source sequence pass the test in the specified predicate if given, else if any items are in the sequence.\n        */\n        some(predicate?: _Predicate<T>, thisArg?: any): Observable<boolean>;\t// alias for any\n    }\n\n    export interface Observable<T> {\n        /**\n         * Determines whether an observable sequence is empty.\n         * @returns {Observable} An observable sequence containing a single element determining whether the source sequence is empty.\n         */\n        isEmpty(): Observable<boolean>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Determines whether all elements of an observable sequence satisfy a condition.\n        * @param {Function} [predicate] A function to test each element for a condition.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element determining whether all elements in the source sequence pass the test in the specified predicate.\n        */\n        every(predicate?: _Predicate<T>, thisArg?: any): Observable<boolean>;\t// alias for all\n    }\n\n    export interface Observable<T> {\n        /**\n        * Determines whether an observable sequence includes a specified element with an optional equality comparer.\n        * @param searchElement The value to locate in the source sequence.\n        * @param {Number} [fromIndex] An equality comparer to compare elements.\n        * @returns {Observable} An observable sequence containing a single element determining whether the source sequence includes an element that has the specified value from the given index.\n        */\n        includes(value: T, comparer?: _Comparer<T, boolean>): Observable<boolean>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence containing a value that represents how many elements in the specified observable sequence satisfy a condition if provided, else the count of items.\n        * @example\n        * res = source.count();\n        * res = source.count(function (x) { return x > 3; });\n        * @param {Function} [predicate]A function to test each element for a condition.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element with a number that represents how many elements in the input sequence satisfy the condition in the predicate function if provided, else the count of items in the sequence.\n        */\n        count(predicate?: _Predicate<T>, thisArg?: any): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n        * @param {Any} searchElement Element to locate in the array.\n        * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n        * @returns {Observable} And observable sequence containing the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n        */\n        indexOf(element: T, fromIndex?: number): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Computes the sum of a sequence of values that are obtained by invoking an optional transform function on each element of the input sequence, else if not specified computes the sum on each item in the sequence.\n        * @param {Function} [selector] A transform function to apply to each element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element with the sum of the values in the source sequence.\n        */\n        sum(keySelector?: _Selector<T, number>, thisArg?: any): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n        * @example\n        * var res = source.minBy(function (x) { return x.value; });\n        * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer] Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n        */\n        minBy<TKey>(keySelector: (item: T) => TKey, comparer: _Comparer<TKey, number>): Observable<T>;\n        /**\n        * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n        * @example\n        * var res = source.minBy(function (x) { return x.value; });\n        * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer] Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n        */\n        minBy(keySelector: (item: T) => number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the minimum element in an observable sequence according to the optional comparer else a default greater than less than check.\n        * @example\n        * var res = source.min();\n        * var res = source.min(function (x, y) { return x.value - y.value; });\n        * @param {Function} [comparer] Comparer used to compare elements.\n        * @returns {Observable} An observable sequence containing a single element with the minimum element in the source sequence.\n        */\n        min(comparer?: _Comparer<T, number>): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n        * @example\n        * var res = source.maxBy(function (x) { return x.value; });\n        * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer]  Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n        */\n        maxBy<TKey>(keySelector: (item: T) => TKey, comparer: _Comparer<TKey, number>): Observable<T>;\n        /**\n        * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n        * @example\n        * var res = source.maxBy(function (x) { return x.value; });\n        * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer]  Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n        */\n        maxBy(keySelector: (item: T) => number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the maximum value in an observable sequence according to the specified comparer.\n        * @example\n        * var res = source.max();\n        * var res = source.max(function (x, y) { return x.value - y.value; });\n        * @param {Function} [comparer] Comparer used to compare elements.\n        * @returns {Observable} An observable sequence containing a single element with the maximum element in the source sequence.\n        */\n        max(comparer?: _Comparer<T, number>): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Computes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present.\n        * @param {Function} [selector] A transform function to apply to each element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element with the average of the sequence of values.\n        */\n        average(keySelector?: _Selector<T, number>, thisArg?: any): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n        *\n        * @example\n        * var res = res = source.sequenceEqual([1,2,3]);\n        * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n        * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n        * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n        * @param {Observable} second Second observable sequence or array to compare.\n        * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n        * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n        */\n        sequenceEqual(second: ObservableOrPromise<T> | ArrayOrIterable<T>, comparer?: _Comparer<T, boolean>): Observable<boolean>;\n        /**\n        *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n        *\n        * @example\n        * var res = res = source.sequenceEqual([1,2,3]);\n        * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n        * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n        * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n        * @param {Observable} second Second observable sequence or array to compare.\n        * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n        * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n        */\n        sequenceEqual<TOther>(second: ObservableOrPromise<T> | ArrayOrIterable<T>, comparer: _Comparer<T | TOther, boolean>): Observable<boolean>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the element at a specified index in a sequence or default value if not found.\n        * @param {Number} index The zero-based index of the element to retrieve.\n        * @param {Any} [defaultValue] The default value to use if elementAt does not find a value.\n        * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence.\n        */\n        elementAt(index: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the only element of an observable sequence that satisfies the condition in the optional predicate, and reports an exception if there is not exactly one element in the observable sequence.\n        * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n        * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n        * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate.\n        */\n        single(predicate?: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the first element of an observable sequence that satisfies the condition in the predicate if present else the first item in the sequence.\n        * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate if provided, else the first item in the sequence.\n        */\n        first(predicate?: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the last element of an observable sequence that satisfies the condition in the predicate if specified, else the last element.\n        * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate.\n        */\n        last(predicate?: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Searches for an element that matches the conditions defined by the specified predicate, and returns the first occurrence within the entire Observable sequence.\n        * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n        * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n        * @returns {Observable} An Observable sequence with the first element that matches the conditions defined by the specified predicate, if found; otherwise, undefined.\n        */\n        find(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n          * Searches for an element that matches the conditions defined by the specified predicate, and returns\n          * an Observable sequence with the zero-based index of the first occurrence within the entire Observable sequence.\n          * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n          * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n          * @returns {Observable} An Observable sequence with the zero-based index of the first occurrence of an element that matches the conditions defined by match, if found; otherwise, –1.\n        */\n        findIndex(predicate: _Predicate<T>, thisArg?: any): Observable<number>;\n    }\n\n}\ndeclare module \"rx.aggregates\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.aggregates.es6.d.ts",
    "content": "declare module Rx {\n\n    export interface Observable<T> {\n        /**\n         * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n         * For aggregation behavior with incremental intermediate results, see Observable.scan.\n         * @param {Function} accumulator An accumulator function to be invoked on each element.\n         * @param {Any} [seed] The initial accumulator value.\n         * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n         */\n        reduce<TAcc>(accumulator: _Accumulator<T, TAcc>, seed?: TAcc): Observable<TAcc>;\n        /**\n         * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n         * For aggregation behavior with incremental intermediate results, see Observable.scan.\n         * @param {Function} accumulator An accumulator function to be invoked on each element.\n         * @param {Any} [seed] The initial accumulator value.\n         * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n         */\n        reduce(accumulator: _Accumulator<T, T>, seed?: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Determines whether any element of an observable sequence satisfies a condition if present, else if any items are in the sequence.\n        * @param {Function} [predicate] A function to test each element for a condition.\n        * @returns {Observable} An observable sequence containing a single element determining whether any elements in the source sequence pass the test in the specified predicate if given, else if any items are in the sequence.\n        */\n        some(predicate?: _Predicate<T>, thisArg?: any): Observable<boolean>;\t// alias for any\n    }\n\n    export interface Observable<T> {\n        /**\n         * Determines whether an observable sequence is empty.\n         * @returns {Observable} An observable sequence containing a single element determining whether the source sequence is empty.\n         */\n        isEmpty(): Observable<boolean>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Determines whether all elements of an observable sequence satisfy a condition.\n        * @param {Function} [predicate] A function to test each element for a condition.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element determining whether all elements in the source sequence pass the test in the specified predicate.\n        */\n        every(predicate?: _Predicate<T>, thisArg?: any): Observable<boolean>;\t// alias for all\n    }\n\n    export interface Observable<T> {\n        /**\n        * Determines whether an observable sequence includes a specified element with an optional equality comparer.\n        * @param searchElement The value to locate in the source sequence.\n        * @param {Number} [fromIndex] An equality comparer to compare elements.\n        * @returns {Observable} An observable sequence containing a single element determining whether the source sequence includes an element that has the specified value from the given index.\n        */\n        includes(value: T, comparer?: _Comparer<T, boolean>): Observable<boolean>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence containing a value that represents how many elements in the specified observable sequence satisfy a condition if provided, else the count of items.\n        * @example\n        * res = source.count();\n        * res = source.count(function (x) { return x > 3; });\n        * @param {Function} [predicate]A function to test each element for a condition.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element with a number that represents how many elements in the input sequence satisfy the condition in the predicate function if provided, else the count of items in the sequence.\n        */\n        count(predicate?: _Predicate<T>, thisArg?: any): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n        * @param {Any} searchElement Element to locate in the array.\n        * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n        * @returns {Observable} And observable sequence containing the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n        */\n        indexOf(element: T, fromIndex?: number): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Computes the sum of a sequence of values that are obtained by invoking an optional transform function on each element of the input sequence, else if not specified computes the sum on each item in the sequence.\n        * @param {Function} [selector] A transform function to apply to each element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element with the sum of the values in the source sequence.\n        */\n        sum(keySelector?: _Selector<T, number>, thisArg?: any): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n        * @example\n        * var res = source.minBy(function (x) { return x.value; });\n        * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer] Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n        */\n        minBy<TKey>(keySelector: (item: T) => TKey, comparer: _Comparer<TKey, number>): Observable<T>;\n        /**\n        * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n        * @example\n        * var res = source.minBy(function (x) { return x.value; });\n        * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer] Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n        */\n        minBy(keySelector: (item: T) => number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the minimum element in an observable sequence according to the optional comparer else a default greater than less than check.\n        * @example\n        * var res = source.min();\n        * var res = source.min(function (x, y) { return x.value - y.value; });\n        * @param {Function} [comparer] Comparer used to compare elements.\n        * @returns {Observable} An observable sequence containing a single element with the minimum element in the source sequence.\n        */\n        min(comparer?: _Comparer<T, number>): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n        * @example\n        * var res = source.maxBy(function (x) { return x.value; });\n        * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer]  Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n        */\n        maxBy<TKey>(keySelector: (item: T) => TKey, comparer: _Comparer<TKey, number>): Observable<T>;\n        /**\n        * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n        * @example\n        * var res = source.maxBy(function (x) { return x.value; });\n        * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer]  Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n        */\n        maxBy(keySelector: (item: T) => number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the maximum value in an observable sequence according to the specified comparer.\n        * @example\n        * var res = source.max();\n        * var res = source.max(function (x, y) { return x.value - y.value; });\n        * @param {Function} [comparer] Comparer used to compare elements.\n        * @returns {Observable} An observable sequence containing a single element with the maximum element in the source sequence.\n        */\n        max(comparer?: _Comparer<T, number>): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Computes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present.\n        * @param {Function} [selector] A transform function to apply to each element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element with the average of the sequence of values.\n        */\n        average(keySelector?: _Selector<T, number>, thisArg?: any): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n        *\n        * @example\n        * var res = res = source.sequenceEqual([1,2,3]);\n        * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n        * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n        * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n        * @param {Observable} second Second observable sequence or array to compare.\n        * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n        * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n        */\n        sequenceEqual(second: ObservableOrPromise<T> | ArrayOrIterable<T>, comparer?: _Comparer<T, boolean>): Observable<boolean>;\n        /**\n        *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n        *\n        * @example\n        * var res = res = source.sequenceEqual([1,2,3]);\n        * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n        * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n        * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n        * @param {Observable} second Second observable sequence or array to compare.\n        * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n        * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n        */\n        sequenceEqual<TOther>(second: ObservableOrPromise<T> | ArrayOrIterable<T>, comparer: _Comparer<T | TOther, boolean>): Observable<boolean>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the element at a specified index in a sequence or default value if not found.\n        * @param {Number} index The zero-based index of the element to retrieve.\n        * @param {Any} [defaultValue] The default value to use if elementAt does not find a value.\n        * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence.\n        */\n        elementAt(index: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the only element of an observable sequence that satisfies the condition in the optional predicate, and reports an exception if there is not exactly one element in the observable sequence.\n        * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n        * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n        * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate.\n        */\n        single(predicate?: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the first element of an observable sequence that satisfies the condition in the predicate if present else the first item in the sequence.\n        * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate if provided, else the first item in the sequence.\n        */\n        first(predicate?: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the last element of an observable sequence that satisfies the condition in the predicate if specified, else the last element.\n        * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate.\n        */\n        last(predicate?: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Searches for an element that matches the conditions defined by the specified predicate, and returns the first occurrence within the entire Observable sequence.\n        * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n        * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n        * @returns {Observable} An Observable sequence with the first element that matches the conditions defined by the specified predicate, if found; otherwise, undefined.\n        */\n        find(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n          * Searches for an element that matches the conditions defined by the specified predicate, and returns\n          * an Observable sequence with the zero-based index of the first occurrence within the entire Observable sequence.\n          * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n          * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n          * @returns {Observable} An Observable sequence with the zero-based index of the first occurrence of an element that matches the conditions defined by match, if found; otherwise, –1.\n        */\n        findIndex(predicate: _Predicate<T>, thisArg?: any): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Converts the observable sequence to a Set if it exists.\n         * @returns {Observable} An observable sequence with a single value of a Set containing the values from the observable sequence.\n         */\n        toSet() : Observable< Set<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Converts the observable sequence to a Map if it exists.\n        * @param {Function} keySelector A function which produces the key for the Map.\n        * @param {Function} [elementSelector] An optional function which produces the element for the Map. If not present, defaults to the value from the observable sequence.\n        * @returns {Observable} An observable sequence with a single value of a Map containing the values from the observable sequence.\n        */\n        toMap<TKey>(keySelector: (value: T) => TKey): Observable<Map<TKey, T>>;\n        /**\n        * Converts the observable sequence to a Map if it exists.\n        * @param {Function} keySelector A function which produces the key for the Map.\n        * @param {Function} [elementSelector] An optional function which produces the element for the Map. If not present, defaults to the value from the observable sequence.\n        * @returns {Observable} An observable sequence with a single value of a Map containing the values from the observable sequence.\n        */\n        toMap<TKey, TElement>(keySelector: (value: T) => TKey, elementSelector: (value: T) => TElement): Observable<Map<TKey, TElement>>;\n    }\n\n}\ndeclare module \"rx.aggregates\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.all.d.ts",
    "content": "declare module Rx {\n\n    // Type alias for observables and promises\n    export type ObservableOrPromise<T> = IObservable<T> | Observable<T> | Promise<T>;\n\n    export type ArrayLike<T> = Array<T> | { length: number;[index: number]: T; };\n\n    // Type alias for arrays and array like objects\n    export type ArrayOrIterable<T> = ArrayLike<T>;\n\n    /**\n     * Promise A+\n     */\n    export interface Promise<T> {\n        then<R>(onFulfilled: (value: T) => R|Promise<R>, onRejected: (error: any) => Promise<R>): Promise<R>;\n        then<R>(onFulfilled: (value: T) => R|Promise<R>, onRejected?: (error: any) => R): Promise<R>;\n    }\n\n    /**\n     * Promise A+\n     */\n    export interface IPromise<T> extends Promise<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface IObservable<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface Observable<T> extends IObservable<T> { }\n\n    export module internals {\n        export interface EmptyError extends Error { message: string; }\n        export interface EmptyErrorStatic { new (): EmptyError; }\n\n        export interface ObjectDisposedError extends Error { message: string; }\n        export interface ObjectDisposedErrorStatic { new (): ObjectDisposedError; }\n\n        export interface ArgumentOutOfRangeError extends Error { message: string; }\n        export interface ArgumentOutOfRangeErrorStatic { new (): ArgumentOutOfRangeError; }\n\n        export interface NotSupportedError extends Error { message: string; }\n        export interface NotSupportedErrorStatic { new (): NotSupportedError; }\n\n        export interface NotImplementedError extends Error { message: string; }\n        export interface NotImplementedErrorStatic { new (): NotImplementedError; }\n    }\n\n    export module helpers {\n        export var notImplemented: () => internals.NotImplementedError;\n        export var notSupported: () => internals.NotSupportedError;\n    }\n\n    export module internals {\n        export var bindCallback: (func: Function, thisArg: any, argCount: number) => Function;\n    }\n\n    export module internals {\n        export var isEqual : (left: any, right: any) => boolean;\n    }\n\n    export interface IDisposable {\n        dispose(): void;\n    }\n\n    export interface Disposable extends IDisposable {\n        /** Is this value disposed. */\n        isDisposed?: boolean;\n    }\n\n    interface DisposableStatic {\n        /**\n         * Provides a set of static methods for creating Disposables.\n         * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n         */\n        new (action: () => void): Disposable;\n\n        /**\n         * Creates a disposable object that invokes the specified action when disposed.\n         * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n         * @return {Disposable} The disposable object that runs the given action upon disposal.\n         */\n        create(action: () => void): Disposable;\n\n        /**\n         * Gets the disposable that does nothing when disposed.\n         */\n        empty: IDisposable;\n\n        /**\n         * Validates whether the given object is a disposable\n         * @param {Object} Object to test whether it has a dispose method\n         * @returns {Boolean} true if a disposable object, else false.\n         */\n        isDisposable(d: any): boolean;\n    }\n\n    /**\n     * Provides a set of static methods for creating Disposables.\n     * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n     */\n    export var Disposable: DisposableStatic;\n\n    export module config {\n        export var Promise: { new <T>(resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): IPromise<T>; };\n    }\n\n    export module helpers {\n        export var noop: () => void;\n        export var notDefined: (value: any) => boolean;\n        export var identity: <T>(value: T) => T;\n        export var defaultNow: () => number;\n        export var defaultComparer: (left: any, right: any) =>  boolean;\n        export var defaultSubComparer: (left: any, right: any) =>  number;\n        export var defaultKeySerializer: (key: any) =>  string;\n        export var defaultError: (err: any) =>  void;\n        export var isPromise: (p: any) =>  boolean;\n        export var asArray: <T>(...args: T[]) =>  T[];\n        export var not: (value: any) =>  boolean;\n        export var isFunction: (value: any) =>  boolean;\n    }\n\n    export type _Selector<T, TResult> = (value: T, index: number, observable: Observable<T>) => TResult;\n    export type _ValueOrSelector<T, TResult> = TResult | _Selector<T, TResult>;\n    export type _Predicate<T> = _Selector<T, boolean>;\n    export type _Comparer<T, TResult> = (value1: T, value2: T) => TResult;\n    export type _Accumulator<T, TAcc> = (acc: TAcc, value: T) => TAcc;\n\n    export module special {\n        export type _FlatMapResultSelector<T1, T2, TResult> = (value: T1, selectorValue: T2, index: number, selectorOther: number) => TResult;\n    }\n\n    export interface IObservable<T> {\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(observer: IObserver<T>): IDisposable;\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(observer: IObserver<T>): IDisposable;\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n\n        /**\n        * Subscribes to the next value in the sequence with an optional \"this\" argument.\n        * @param {Function} onNext The function to invoke on each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnNext(onNext: (value: T) => void, thisArg?: any): IDisposable;\n        /**\n        * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n        * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnError(onError: (exception: any) => void, thisArg?: any): IDisposable;\n        /**\n        * Subscribes to the next value in the sequence with an optional \"this\" argument.\n        * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnCompleted(onCompleted: () => void, thisArg?: any): IDisposable;\n\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        forEach(observer: IObserver<T>): IDisposable;\n\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        forEach(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Determines whether the given object is an Observable\n        * @param {Any} An object to determine whether it is an Observable\n        * @returns {Boolean} true if an Observable, else false.\n        */\n        isObservable(o: any): boolean;\n    }\n\n    export var Observable: ObservableStatic;\n    export var ConnectableObservable: ObservableStatic;\n\n\n    export module internals {\n        export var inherits: (child: any, parent: any) => void;\n        export var addProperties: (obj: any, ...sources: any[]) => void;\n        export var addRef: <T>(xs: Observable<T>, r: { getDisposable(): IDisposable; }) => Observable<T>;\n    }\n\n    export module internals {\n        export interface ScheduledItem<TTime> {\n            scheduler: IScheduler;\n            state: TTime;\n            action: (scheduler: IScheduler, state: any) => IDisposable;\n            dueTime: TTime;\n            comparer: (x: TTime, y: TTime) => number;\n            disposable: SingleAssignmentDisposable;\n\n            invoke(): void;\n            compareTo(other: ScheduledItem<TTime>): number;\n            isCancelled(): boolean;\n            invokeCore(): IDisposable;\n        }\n\n        interface ScheduledItemStatic {\n            new <TTime>(scheduler: IScheduler, state: any, action: (scheduler: IScheduler, state: any) => IDisposable, dueTime: TTime, comparer?: _Comparer<TTime, number>):ScheduledItem<TTime>;\n        }\n\n        export var ScheduledItem: ScheduledItemStatic\n    }\n\n    export module internals {\n        // Priority Queue for Scheduling\n        export interface PriorityQueue<TTime> {\n            length: number;\n\n            isHigherPriority(left: number, right: number): boolean;\n            percolate(index: number): void;\n            heapify(index: number): void;\n            peek(): ScheduledItem<TTime>;\n            removeAt(index: number): void;\n            dequeue(): ScheduledItem<TTime>;\n            enqueue(item: ScheduledItem<TTime>): void;\n            remove(item: ScheduledItem<TTime>): boolean;\n        }\n\n        interface PriorityQueueStatic {\n                new <T>(capacity: number) : PriorityQueue<T>;\n                count: number;\n        }\n\n        export var PriorityQueue : PriorityQueueStatic;\n    }\n\n    /**\n     * Represents a group of disposable resources that are disposed together.\n     * @constructor\n     */\n    export interface CompositeDisposable extends Disposable {\n        /**\n         * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n         * @param {Mixed} item Disposable to add.\n         */\n        add(item: IDisposable): void;\n\n        /**\n         * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n         * @param {Mixed} item Disposable to remove.\n         * @returns {Boolean} true if found; false otherwise.\n         */\n        remove(item: IDisposable): void;\n    }\n\n    interface CompositeDisposableStatic {\n        /**\n         * Represents a group of disposable resources that are disposed together.\n         * @constructor\n         */\n        new (...disposables: Rx.IDisposable[]): CompositeDisposable;\n        /**\n         * Represents a group of disposable resources that are disposed together.\n         * @constructor\n         */\n        new(disposables: Rx.IDisposable[]): CompositeDisposable;\n    }\n\n    export var CompositeDisposable: CompositeDisposableStatic;\n\n    export interface SingleAssignmentDisposable {\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        getDisposable(): IDisposable;\n\n        setDisposable(value: IDisposable): void;\n    }\n\n    interface SingleAssignmentDisposableStatic {\n        new() : SingleAssignmentDisposable;\n    }\n\n    export var SingleAssignmentDisposable : SingleAssignmentDisposableStatic;\n\n    export interface SerialDisposable {\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        getDisposable(): IDisposable;\n\n        setDisposable(value: IDisposable): void;\n    }\n\n    interface SerialDisposableStatic {\n        new() : SerialDisposable;\n    }\n\n    export var SerialDisposable : SerialDisposableStatic;\n\n    /**\n     * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n     */\n    export interface RefCountDisposable extends Disposable {\n\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        /**\n         * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n         * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n         */\n        getDisposable(): IDisposable;\n    }\n\n    interface RefCountDisposableStatic {\n        /**\n         * Initializes a new instance of the RefCountDisposable with the specified disposable.\n         * @constructor\n         * @param {Disposable} disposable Underlying disposable.\n         */\n        new(disposable: IDisposable): RefCountDisposable;\n    }\n\n    export var RefCountDisposable : RefCountDisposableStatic;\n\n    export interface IScheduler {\n        /** Gets the current time according to the local machine's system clock. */\n        now(): number;\n\n        /**\n          * Schedules an action to be executed.\n          * @param state State passed to the action to be executed.\n          * @param {Function} action Action to be executed.\n          * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n          */\n        schedule<TState>(state: TState, action: (scheduler: IScheduler, state: TState) => IDisposable): IDisposable;\n\n        /**\n         * Schedules an action to be executed after dueTime.\n         * @param state State passed to the action to be executed.\n         * @param {Function} action Action to be executed.\n         * @param {Number} dueTime Relative time after which to execute the action.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleFuture<TState>(state: TState, dueTime: number | Date, action: (scheduler: IScheduler, state: TState) => IDisposable): IDisposable;\n    }\n\n    export interface SchedulerStatic {\n        /** Gets the current time according to the local machine's system clock. */\n        now(): number;\n\n        /**\n         * Normalizes the specified TimeSpan value to a positive value.\n         * @param {Number} timeSpan The time span value to normalize.\n         * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n         */\n        normalize(timeSpan: number): number;\n\n        /** Determines whether the given object is a scheduler */\n        isScheduler(s: any): boolean;\n    }\n\n    /** Provides a set of static properties to access commonly used schedulers. */\n    export var Scheduler: SchedulerStatic;\n\n    export interface IScheduler {\n        /**\n         * Schedules an action to be executed recursively.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleRecursive<TState>(state: TState, action: (state: TState, action: (state: TState) => void) => void): IDisposable;\n\n        /**\n         * Schedules an action to be executed recursively after a specified relative due time.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n         * @param {Number}dueTime Relative time after which to execute the action for the first time.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleRecursiveFuture<TState, TTime extends number | Date>(state: TState, dueTime: TTime, action: (state: TState, action: (state: TState, dueTime: TTime) => void) => void): IDisposable;\n    }\n\n    export interface IScheduler {\n        /**\n         * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n         * @param {Mixed} state Initial state passed to the action upon the first iteration.\n         * @param {Number} period Period for running the work periodically.\n         * @param {Function} action Action to be executed, potentially updating the state.\n         * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n         */\n        schedulePeriodic<TState>(state: TState, period: number, action: (state: TState) => TState): IDisposable;\n    }\n\n    export interface IScheduler {\n        /**\n         * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n         * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n         * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n         */\n        catch(handler: Function): IScheduler;\n    }\n\n    export module internals {\n        export interface SchedulePeriodicRecursive {\n            start(): IDisposable;\n        }\n\n        interface SchedulePeriodicRecursiveStatic {\n            new (scheduler: any, state: any, period: any, action: any) : SchedulePeriodicRecursive;\n        }\n\n        export var SchedulePeriodicRecursive: SchedulePeriodicRecursiveStatic;\n    }\n\n    export interface SchedulerStatic {\n        immediate: IScheduler;\n    }\n\n    export interface ICurrentThreadScheduler extends IScheduler {\n        scheduleRequired(): boolean;\n    }\n\n    export interface SchedulerStatic {\n        currentThread: ICurrentThreadScheduler;\n    }\n\n    export interface SchedulerStatic {\n        default: IScheduler;\n        async: IScheduler;\n    }\n\n    /**\n    * Supports push-style iteration over an observable sequence.\n    */\n    export interface IObserver<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n\n    export interface Observer<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n\n    export interface ObserverStatic {\n        /**\n        *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n        * @param {Function} [onNext] Observer's OnNext action implementation.\n        * @param {Function} [onError] Observer's OnError action implementation.\n        * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n        * @returns {Observer} The observer object implemented using the given actions.\n        */\n        create<T>(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observer<T>;\n    }\n\n    /**\n    * Supports push-style iteration over an observable sequence.\n    */\n    export var Observer: ObserverStatic;\n\n    /**\n     *  Represents a notification to an observer.\n     */\n    export interface Notification<T> {\n        /**\n         * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n         *\n         * @memberOf Notification\n         * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n         * @param {Function} onError Delegate to invoke for an OnError notification.\n         * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n         * @returns {Any} Result produced by the observation.\n         */\n        accept(observer: IObserver<T>): void;\n        /**\n         * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n         *\n         * @memberOf Notification\n         * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n         * @param {Function} onError Delegate to invoke for an OnError notification.\n         * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n         * @returns {Any} Result produced by the observation.\n         */\n        accept<TResult>(onNext: (value: T) => TResult, onError: (exception: any) => TResult, onCompleted: () => TResult): TResult;\n\n        /**\n         * Returns an observable sequence with a single notification.\n         *\n         * @memberOf Notifications\n         * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n         * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n         */\n        toObservable(scheduler?: IScheduler): Observable<T>;\n\n        hasValue: boolean;\n        equals(other: Notification<T>): boolean;\n        kind: string;\n        value: T;\n        error: any;\n    }\n\n    interface NotificationStatic {\n        new <T>(kind: any, value: any, exception: any, accept: any, acceptObservable: any, toString: any) : Notification<T>;\n\n        /**\n        * Creates an object that represents an OnNext notification to an observer.\n        * @param {Any} value The value contained in the notification.\n        * @returns {Notification} The OnNext notification containing the value.\n        */\n        createOnNext<T>(value: T): Notification<T>;\n        /**\n        * Creates an object that represents an OnError notification to an observer.\n        * @param {Any} error The exception contained in the notification.\n        * @returns {Notification} The OnError notification containing the exception.\n        */\n        createOnError<T>(exception: any): Notification<T>;\n        /**\n        * Creates an object that represents an OnCompleted notification to an observer.\n        * @returns {Notification} The OnCompleted notification.\n        */\n        createOnCompleted<T>(): Notification<T>;\n    }\n\n    export var Notification : NotificationStatic;\n\n\texport interface Observer<T> {\n        makeSafe(disposable: IDisposable): Observer<T>;\n\t}\n\n    export module internals {\n        /**\n        * Abstract base class for implementations of the Observer class.\n        * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n        */\n        export interface AbstractObserver<T> extends Rx.IObserver<T>, Rx.IDisposable {\n            /**\n            * Notifies the observer of a new element in the sequence.\n            * @param {Any} value Next element in the sequence.\n            */\n            onNext(value: T): void;\n            /**\n            * Notifies the observer that an exception has occurred.\n            * @param {Any} error The error that has occurred.\n            */\n            onError(exception: any): void;\n            /**\n            * Notifies the observer of the end of the sequence.\n            */\n            onCompleted(): void;\n\n            isStopped: boolean;\n\n            /**\n            * Disposes the observer, causing it to transition to the stopped state.\n            */\n            dispose(): void;\n\n            fail(e: any): boolean;\n\n            // Must be implemented by other observers\n            next(value: T): void;\n            error(error: any): void;\n            completed(): void;\n        }\n\n        interface AbstractObserverStatic {\n            new <T>(): AbstractObserver<T>;\n        }\n\n        export var AbstractObserver: AbstractObserverStatic\n    }\n\n    /**\n     * Class to create an Observer instance from delegate-based implementations of the on* methods.\n     */\n    export interface AnonymousObserver<T> extends Observer<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n\n    interface AnonymousObserverStatic {\n        /**\n         * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n         * @param {Any} onNext Observer's OnNext action implementation.\n         * @param {Any} onError Observer's OnError action implementation.\n         * @param {Any} onCompleted Observer's OnCompleted action implementation.\n         */\n        new <T>(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): AnonymousObserver<T>;\n    }\n\n    export var AnonymousObserver : AnonymousObserverStatic;\n\n    export interface CheckedObserver<T> extends Observer<T> {\n        checkAccess(): void;\n    }\n\n    export module internals {\n        export interface ScheduledObserver<T> extends Observer<T> {\n            ensureActive(): void;\n        }\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n        *\n        *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n        *  that require to be run on a scheduler, use subscribeOn.\n        *\n        *  @param {Scheduler} scheduler Scheduler to notify observers on.\n        *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n        */\n        observeOn(scheduler: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n        *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n        *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n        *  callbacks on a scheduler, use observeOn.\n\n        *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n        *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n        */\n        subscribeOn(scheduler: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Converts a Promise to an Observable sequence\n        * @param {Promise} An ES6 Compliant promise.\n        * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n        */\n \t\tfromPromise<T>(promise: Promise<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /*\n         * Converts an existing observable sequence to an ES6 Compatible Promise\n         * @example\n         * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n         *\n         * // With config\n         * Rx.config.Promise = RSVP.Promise;\n         * var promise = Rx.Observable.return(42).toPromise();\n         * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n         * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n         */\n        toPromise(promiseCtor?: { new (resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): IPromise<T>; }): IPromise<T>;\n        /*\n         * Converts an existing observable sequence to an ES6 Compatible Promise\n         * @example\n         * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n         *\n         * // With config\n         * Rx.config.Promise = RSVP.Promise;\n         * var promise = Rx.Observable.return(42).toPromise();\n         * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n         * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n         */\n        toPromise<TPromise extends IPromise<T>>(promiseCtor: { new (resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): TPromise; }): TPromise;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Creates an array from an observable sequence.\n        * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n        */\n        toArray(): Observable<T[]>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Creates an observable sequence from a specified subscribe method implementation.\n        * @example\n        *  var res = Rx.Observable.create(function (observer) { return function () { } );\n        *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n        *  var res = Rx.Observable.create(function (observer) { } );\n        * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n        * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n        */\n        create<T>(subscribe: (observer: Observer<T>) => IDisposable | Function | void): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n          *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n          *\n          * @example\n          *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n          * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n          * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n          */\n        defer<T>(observableFactory: () => ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n  *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n  *\n  * @example\n  *  var res = Rx.Observable.empty();\n  *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n  * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n  * @returns {Observable} An observable sequence with no elements.\n  */\n        empty<T>(scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * This method creates a new Observable sequence from an array-like or iterable object.\n         * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n         * @param {Function} [mapFn] Map function to call on every element of the array.\n         * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n         * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n         */\n        from<T>(array: ArrayOrIterable<T>): Observable<T>;\n        /**\n         * This method creates a new Observable sequence from an array-like or iterable object.\n         * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n         * @param {Function} [mapFn] Map function to call on every element of the array.\n         * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n         * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n         */\n        from<T, TResult>(array: ArrayOrIterable<T>, mapFn: (value: T, index: number) => TResult, thisArg?: any, scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n         * @deprecated use Observable.from or Observable.of\n         * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n         * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n         */\n        fromArray<T>(array: ArrayLike<T>, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n         *\n         * @example\n         *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n         *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n         * @param {Mixed} initialState Initial state.\n         * @param {Function} condition Condition to terminate generation (upon returning false).\n         * @param {Function} iterate Iteration step function.\n         * @param {Function} resultSelector Selector function for results produced in the sequence.\n         * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n         * @returns {Observable} The generated sequence.\n         */\n        generate<TState, TResult>(initialState: TState, condition: (state: TState) => boolean, iterate: (state: TState) => TState, resultSelector: (state: TState) => TResult, scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n        * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n        */\n        of<T>(...values: T[]): Observable<T>;\n\n        /**\n        *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n        * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n        * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n        */\n        ofWithScheduler<T>(scheduler?: IScheduler, ...values: T[]): Observable<T>;\n    }\n\n    export interface ArrayObserveChange<T> {\n        type: string;\n        object: T[];\n        name?: string;\n        oldValue?: T;\n        index?: number;\n        removed?: T[];\n        added?: number;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Creates an Observable sequence from changes to an array using Array.observe.\n         * @param {Array} array An array to observe changes.\n         * @returns {Observable} An observable sequence containing changes to an array from Array.observe.\n         */\n        ofArrayChanges<T>(obj: T[]): Observable<ArrayObserveChange<T>>;\n    }\n\n    export interface ObjectObserveChange<T> {\n        type: string;\n        object: T;\n        name: string;\n        oldValue?: any;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Creates an Observable sequence from changes to an object using Object.observe.\n         * @param {Object} obj An object to observe changes.\n         * @returns {Observable} An observable sequence containing changes to an object from Object.observe.\n         */\n        ofObjectChanges<T>(obj: T): Observable<ObjectObserveChange<T>>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n        * @returns {Observable} An observable sequence whose observers will never get called.\n        */\n        never<T>(): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Convert an object into an observable sequence of [key, value] pairs.\n        * @param {Object} obj The object to inspect.\n        * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n        * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n        */\n        pairs<T>(obj: { [key: string]: T }, scheduler?: IScheduler): Observable<[string, T]>;\n        /**\n        * Convert an object into an observable sequence of [key, value] pairs.\n        * @param {Object} obj The object to inspect.\n        * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n        * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n        */\n        pairs<T>(obj: { [key: number]: T }, scheduler?: IScheduler): Observable<[number, T]>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n        *\n        * @example\n        *  var res = Rx.Observable.range(0, 10);\n        *  var res = Rx.Observable.range(0, 10, Rx.Scheduler.timeout);\n        * @param {Number} start The value of the first integer in the sequence.\n        * @param {Number} count The number of sequential integers to generate.\n        * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n        * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n        */\n        range(start: number, count: number, scheduler?: IScheduler): Observable<number>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n         *\n         * @example\n         *  var res = Rx.Observable.repeat(42);\n         *  var res = Rx.Observable.repeat(42, 4);\n         *  3 - res = Rx.Observable.repeat(42, 4, Rx.Scheduler.timeout);\n         *  4 - res = Rx.Observable.repeat(42, null, Rx.Scheduler.timeout);\n         * @param {Mixed} value Element to repeat.\n         * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n         * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n         * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n         */\n        repeat<T>(value: T, repeatCount?: number | void, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n        *  There is an alias called 'just' or browsers <IE9.\n        * @param {Mixed} value Single element in the resulting observable sequence.\n        * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} An observable sequence containing the single specified element.\n        */\n        return<T>(value: T, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n        *  There is an alias called 'just' or browsers <IE9.\n        * @param {Mixed} value Single element in the resulting observable sequence.\n        * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} An observable sequence containing the single specified element.\n        */\n        just<T>(value: T, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n        * @param {Mixed} error An object used for the sequence's termination.\n        * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n        */\n        throw<T>(exception: Error, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n        * @param {Mixed} error An object used for the sequence's termination.\n        * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n        */\n        throw<T>(exception: any, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n         * @param {Function} resourceFactory Factory function to obtain a resource object.\n         * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n         * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n         */\n        using<TSource, TResource extends IDisposable>(resourceFactory: () => TResource, observableFactory: (resource: TResource) => Observable<TSource>): Observable<TSource>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @param {Observable} rightSource Second observable sequence or Promise.\n        * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n        */\n        amb(observable: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n        */\n        amb<T>(observables: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n        */\n        amb<T>(...observables: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n        * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n        */\n        catch(handler: (exception: any) => ObservableOrPromise<T>): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n        * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n        */\n        catch(second: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n        * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n        */\n        catch<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n        * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n        */\n        catch<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther, TResult>(sources: ObservableOrPromise<TOther>[], resultSelector: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2>(second: ObservableOrPromise<T2>): Observable<[T, T2]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>): Observable<[T, T2, T3]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>): Observable<[T, T2, T3, T4]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>): Observable<[T, T2, T3, T4, T5]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>): Observable<[T, T2, T3, T4, T5, T6]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>): Observable<[T, T2, T3, T4, T5, T6, T7]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>): Observable<[T, T2, T3, T4, T5, T6, T7, T8]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, T9>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>): Observable<[T, T2, T3, T4, T5, T6, T7, T8, T9]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther>(sources: ObservableOrPromise<TOther>[]): Observable<TOther[]>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, eventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, T9, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther, TResult>(sources: ObservableOrPromise<TOther>[], resultSelector: (...otherValues: TOther[]) => TResult): Observable<TResult>;\n\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>): Observable<[T, T2]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>): Observable<[T, T2, T3]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>): Observable<[T, T2, T3, T4]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>): Observable<[T, T2, T3, T4, T5]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>): Observable<[T, T2, T3, T4, T5, T6]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>): Observable<[T, T2, T3, T4, T5, T6, T7]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>): Observable<[T, T2, T3, T4, T5, T6, T7, T8]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, T9>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>): Observable<[T, T2, T3, T4, T5, T6, T7, T8, T9]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<TOther>(sources: ObservableOrPromise<TOther>[]): Observable<TOther[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat(...sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Concatenates all the observable sequences.\n        * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Concatenates all the observable sequences.\n        * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n          * Concatenates an observable sequence of observable sequences.\n          * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n          */\n        concatAll(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n        * Or merges two observable sequences into a single observable sequence.\n        *\n        * @example\n        * 1 - merged = sources.merge(1);\n        * 2 - merged = source.merge(otherSource);\n        * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        merge(maxConcurrent: number): T;\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n        * Or merges two observable sequences into a single observable sequence.\n        *\n        * @example\n        * 1 - merged = sources.merge(1);\n        * 2 - merged = source.merge(otherSource);\n        * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        merge(other: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(scheduler: IScheduler, ...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(scheduler: IScheduler, sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        mergeAll(): T;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n        * receive all successfully emitted items from all of the source Observables without being interrupted by\n        * an error notification from one of them.\n        *\n        * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n        * error via the Observer's onError, mergeDelayError will refrain from propagating that\n        * error notification until all of the merged Observables have finished emitting items.\n        * @param {Array | Arguments} args Arguments or an array to merge.\n        * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n        */\n        mergeDelayError<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n        * receive all successfully emitted items from all of the source Observables without being interrupted by\n        * an error notification from one of them.\n        *\n        * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n        * error via the Observer's onError, mergeDelayError will refrain from propagating that\n        * error notification until all of the merged Observables have finished emitting items.\n        * @param {Array | Arguments} args Arguments or an array to merge.\n        * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n        */\n        mergeDelayError<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n        * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n        */\n        onErrorResumeNext(second: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        *\n        * @example\n        * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);\n        * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);\n        * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n        */\n        onErrorResumeNext<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        *\n        * @example\n        * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);\n        * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);\n        * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n        */\n        onErrorResumeNext<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n        * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n        * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n        */\n        skipUntil<T2>(other: ObservableOrPromise<T2>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        switch(): T;\n        /**\n        * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        switchLatest(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the values from the source observable sequence until the other observable sequence produces a value.\n        * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n        * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n        */\n        takeUntil<T2>(other: ObservableOrPromise<T2>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<TOther, TResult>(souces: ObservableOrPromise<TOther>[], resultSelector: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, TResult>(sources: ObservableOrPromise<T2>[], resultSelector?: (item1: T1, ...right: T2[]) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, TResult>(source1: ObservableOrPromise<T1>, ObservableOrPromise: Observable<T2>, resultSelector?: (item1: T1, item2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, resultSelector?: (item1: T1, item2: T2, item3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, TResult>(source1: Observable<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, T8, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, source8: ObservableOrPromise<T8>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, source8: ObservableOrPromise<T8>, source9: ObservableOrPromise<T9>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8, item9: T9) => TResult): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector?: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector?: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<TOther, TResult>(souces: ObservableOrPromise<TOther>[], resultSelector?: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n        * @param arguments Observable sources.\n        * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n        */\n        zipIterable<T>(...sources: Observable<T>[]): Observable<T[]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n        * @param arguments Observable sources.\n        * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n        */\n        zipIterable<T>(sources: Observable<T>[]): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n       *  Hides the identity of an observable sequence.\n       * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n       */\n        asObservable(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n        * @param {Number} count Length of each buffer.\n        * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithCount(count: number, skip?: number): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n        * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n        */\n        dematerialize<TOrigin>(): Observable<TOrigin>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.\n        *\n        *  var obs = observable.distinctUntilChanged();\n        *  var obs = observable.distinctUntilChanged(function (x) { return x.id; });\n        *  var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; });\n        *\n        * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value.\n        * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n        * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n        */\n        distinctUntilChanged<TValue>(keySelector?: (value: T) => TValue, comparer?: _Comparer<TValue, boolean>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        do(observer: Observer<T>): Observable<T>;\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tap(observer: Observer<T>): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        do(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observable<T>;\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tap(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onNext Action to invoke for each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnNext(onNext: (value: T) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnError(onError: (exception: any) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon graceful termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnCompleted(onCompleted: () => void, thisArg?: any): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onNext Action to invoke for each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnNext(onNext: (value: T) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnError(onError: (exception: any) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon graceful termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnCompleted(onCompleted: () => void, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n        * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n        * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n        */\n        finally(action: () => void): Observable<T>;\n\n        /**\n        *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n        * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n        * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n        */\n        ensure(action: () => void): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Ignores all elements in an observable sequence leaving only the termination messages.\n        * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n        */\n        ignoreElements(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n        * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n        */\n        materialize(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n         * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n         * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n         */\n        repeat(repeatCount?: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n        *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n        *\n        * @example\n        *  var res = retried = retry.repeat();\n        *  var res = retried = retry.repeat(2);\n        * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n        * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n        */\n        retry(retryCount?: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         *  Repeats the source observable sequence upon error each time the notifier emits or until it successfully terminates.\n         *  if the notifier completes, the observable sequence completes.\n         *\n         * @example\n         *  var timer = Observable.timer(500);\n         *  var source = observable.retryWhen(timer);\n         * @param {Observable} [notifier] An observable that triggers the retries or completes the observable with onNext or onCompleted respectively.\n         * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n         */\n        retryWhen(notifier: (errors: Observable<any>) => Observable<any>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n        *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n        * @example\n        *  var res = source.scan(function (acc, x) { return acc + x; });\n        *  var res = source.scan(function (acc, x) { return acc + x; }, 0);\n        * @param {Function} accumulator An accumulator function to be invoked on each element.\n        * @param {Mixed} [seed] The initial accumulator value.\n        * @returns {Observable} An observable sequence containing the accumulated values.\n        */\n        scan<TAcc>(accumulator: _Accumulator<T, TAcc>, seed?: TAcc): Observable<TAcc>;\n        /**\n        *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n        *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n        * @example\n        *  var res = source.scan(function (acc, x) { return acc + x; });\n        *  var res = source.scan(function (acc, x) { return acc + x; }, 0);\n        * @param {Function} accumulator An accumulator function to be invoked on each element.\n        * @param {Mixed} [seed] The initial accumulator value.\n        * @returns {Observable} An observable sequence containing the accumulated values.\n        */\n        scan(accumulator: _Accumulator<T, T>, seed?: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Bypasses a specified number of elements at the end of an observable sequence.\n        * @description\n        *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n        *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n        * @param count Number of elements to bypass at the end of the source sequence.\n        * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n        */\n        skipLast(count: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n        *  @example\n        *  var res = source.startWith(1, 2, 3);\n        *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n        * @param {Arguments} args The specified values to prepend to the observable sequence\n        * @returns {Observable} The source sequence prepended with the specified values.\n        */\n        startWith(...values: T[]): Observable<T>;\n        /**\n        *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n        *  @example\n        *  var res = source.startWith(1, 2, 3);\n        *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n        * @param {Arguments} args The specified values to prepend to the observable sequence\n        * @returns {Observable} The source sequence prepended with the specified values.\n        */\n        startWith(scheduler: IScheduler, ...values: T[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns a specified number of contiguous elements from the end of an observable sequence.\n        * @description\n        *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n        *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n        * @param {Number} count Number of elements to take from the end of the source sequence.\n        * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n        */\n        takeLast(count: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n        *\n        * @description\n        *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n        *  source sequence, this buffer is produced on the result sequence.\n        * @param {Number} count Number of elements to take from the end of the source sequence.\n        * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n        */\n        takeLastBuffer(count: number): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n        *\n        *  var res = xs.windowWithCount(10);\n        *  var res = xs.windowWithCount(10, 1);\n        * @param {Number} count Length of each window.\n        * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithCount(count: number, skip?: number): Observable<Observable<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        concatMapObserver<T, TResult>(onNext: (value: T, i: number) => ObservableOrPromise<TResult>, onError: (error: any) => ObservableOrPromise<any>, onCompleted: () => ObservableOrPromise<any>, thisArg?: any): Observable<TResult>;\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        selectConcatObserver<T, TResult>(onNext: (value: T, i: number) => ObservableOrPromise<TResult>, onError: (error: any) => ObservableOrPromise<any>, onCompleted: () => ObservableOrPromise<any>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n        *\n        *  var res = obs = xs.defaultIfEmpty();\n        *  2 - obs = xs.defaultIfEmpty(false);\n        *\n        * @memberOf Observable#\n        * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n        * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n        */\n        defaultIfEmpty(defaultValue?: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n        *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n        *\n        * @example\n        *  var res = obs = xs.distinct();\n        *  2 - obs = xs.distinct(function (x) { return x.id; });\n        *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n        * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n        * @param {Function} [comparer]  Used to compare items in the collection.\n        * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n        */\n        distinct<TKey>(keySelector?: (value: T) => TKey, comparer?: _Comparer<TKey, boolean>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Groups the elements of an observable sequence according to a specified key selector function.\n        *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n        *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n        *\n        * @example\n        *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n        *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n        *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n        * @param {Function} keySelector A function to extract the key for each element.\n        * @param {Function} durationSelector A function to signal the expiration of a group.\n        * @returns {Observable}\n        *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n        *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n        *\n        */\n        groupByUntil<TKey, TDuration>(keySelector: (value: T) => TKey, skipElementSelector: boolean, durationSelector: (group: GroupedObservable<TKey, T>) => Observable<TDuration>, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, T>>;\n\n        /**\n        *  Groups the elements of an observable sequence according to a specified key selector function.\n        *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n        *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n        *\n        * @example\n        *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n        *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n        *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n        * @param {Function} keySelector A function to extract the key for each element.\n        * @param {Function} durationSelector A function to signal the expiration of a group.\n        * @returns {Observable}\n        *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n        *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n        *\n        */\n        groupByUntil<TKey, TElement, TDuration>(keySelector: (value: T) => TKey, elementSelector: (value: T) => TElement, durationSelector: (group: GroupedObservable<TKey, TElement>) => Observable<TDuration>, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, TElement>>;\n    }\n\n    export interface Observable<T> {\n        /**\n         *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n         *\n         * @example\n         *  var res = observable.groupBy(function (x) { return x.id; });\n         *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n         *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n         * @param {Function} keySelector A function to extract the key for each element.\n         * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n         * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n         */\n        groupBy<TKey, TElement>(keySelector: (value: T) => TKey, skipElementSelector?: boolean, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, T>>;\n        /**\n         *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n         *\n         * @example\n         *  var res = observable.groupBy(function (x) { return x.id; });\n         *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n         *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n         * @param {Function} keySelector A function to extract the key for each element.\n         * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n         * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n         */\n        groupBy<TKey, TElement>(keySelector: (value: T) => TKey, elementSelector: (value: T) => TElement, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, TElement>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Projects each element of an observable sequence into a new form by incorporating the element's index.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n        */\n        select<TResult>(selector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        * Projects each element of an observable sequence into a new form by incorporating the element's index.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n        */\n        map<TResult>(selector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Retrieves the value of a specified nested property from all elements in\n        * the Observable sequence.\n        * @param {Arguments} arguments The nested properties to pluck.\n        * @returns {Observable} Returns a new Observable sequence of property values.\n        */\n        pluck<TResult>(prop: string): Observable<TResult>;\n        pluck<TResult>(...props: string[]): Observable<TResult>;\n    }\n\n\n    export interface Observable<T> {\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        selectManyObserver<T2, T3, T4>(onNext: (value: T, index: number) => Observable<T2>, onError: (exception: any) => Observable<T3>, onCompleted: () => Observable<T4>, thisArg?: any): Observable<T2 | T3 | T4>;\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        flatMapObserver<T2, T3, T4>(onNext: (value: T, index: number) => Observable<T2>, onError: (exception: any) => Observable<T3>, onCompleted: () => Observable<T4>, thisArg?: any): Observable<T2 | T3 | T4>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n        * @param {Number} count The number of elements to skip before returning the remaining elements.\n        * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n        */\n        skip(count: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n        *  The element's index is used in the logic of the predicate function.\n        *\n        *  var res = source.skipWhile(function (value) { return value < 10; });\n        *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n        */\n        skipWhile(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n        *\n        *  var res = source.take(5);\n        *  var res = source.take(0, Rx.Scheduler.timeout);\n        * @param {Number} count The number of elements to return.\n        * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n        * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n        */\n        take(count: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns elements from an observable sequence as long as a specified condition is true.\n        *  The element's index is used in the logic of the predicate function.\n        * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n        */\n        takeWhile(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n        *\n        * @example\n        *  var res = source.where(function (value) { return value < 10; });\n        *  var res = source.where(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n        */\n        where(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n        /**\n        *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n        *\n        * @example\n        *  var res = source.where(function (value) { return value < 10; });\n        *  var res = source.where(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n        */\n        filter(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n         * For aggregation behavior with incremental intermediate results, see Observable.scan.\n         * @param {Function} accumulator An accumulator function to be invoked on each element.\n         * @param {Any} [seed] The initial accumulator value.\n         * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n         */\n        reduce<TAcc>(accumulator: _Accumulator<T, TAcc>, seed?: TAcc): Observable<TAcc>;\n        /**\n         * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n         * For aggregation behavior with incremental intermediate results, see Observable.scan.\n         * @param {Function} accumulator An accumulator function to be invoked on each element.\n         * @param {Any} [seed] The initial accumulator value.\n         * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n         */\n        reduce(accumulator: _Accumulator<T, T>, seed?: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Determines whether any element of an observable sequence satisfies a condition if present, else if any items are in the sequence.\n        * @param {Function} [predicate] A function to test each element for a condition.\n        * @returns {Observable} An observable sequence containing a single element determining whether any elements in the source sequence pass the test in the specified predicate if given, else if any items are in the sequence.\n        */\n        some(predicate?: _Predicate<T>, thisArg?: any): Observable<boolean>;\t// alias for any\n    }\n\n    export interface Observable<T> {\n        /**\n         * Determines whether an observable sequence is empty.\n         * @returns {Observable} An observable sequence containing a single element determining whether the source sequence is empty.\n         */\n        isEmpty(): Observable<boolean>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Determines whether all elements of an observable sequence satisfy a condition.\n        * @param {Function} [predicate] A function to test each element for a condition.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element determining whether all elements in the source sequence pass the test in the specified predicate.\n        */\n        every(predicate?: _Predicate<T>, thisArg?: any): Observable<boolean>;\t// alias for all\n    }\n\n    export interface Observable<T> {\n        /**\n        * Determines whether an observable sequence includes a specified element with an optional equality comparer.\n        * @param searchElement The value to locate in the source sequence.\n        * @param {Number} [fromIndex] An equality comparer to compare elements.\n        * @returns {Observable} An observable sequence containing a single element determining whether the source sequence includes an element that has the specified value from the given index.\n        */\n        includes(value: T, comparer?: _Comparer<T, boolean>): Observable<boolean>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence containing a value that represents how many elements in the specified observable sequence satisfy a condition if provided, else the count of items.\n        * @example\n        * res = source.count();\n        * res = source.count(function (x) { return x > 3; });\n        * @param {Function} [predicate]A function to test each element for a condition.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element with a number that represents how many elements in the input sequence satisfy the condition in the predicate function if provided, else the count of items in the sequence.\n        */\n        count(predicate?: _Predicate<T>, thisArg?: any): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n        * @param {Any} searchElement Element to locate in the array.\n        * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n        * @returns {Observable} And observable sequence containing the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n        */\n        indexOf(element: T, fromIndex?: number): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Computes the sum of a sequence of values that are obtained by invoking an optional transform function on each element of the input sequence, else if not specified computes the sum on each item in the sequence.\n        * @param {Function} [selector] A transform function to apply to each element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element with the sum of the values in the source sequence.\n        */\n        sum(keySelector?: _Selector<T, number>, thisArg?: any): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n        * @example\n        * var res = source.minBy(function (x) { return x.value; });\n        * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer] Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n        */\n        minBy<TKey>(keySelector: (item: T) => TKey, comparer: _Comparer<TKey, number>): Observable<T>;\n        /**\n        * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n        * @example\n        * var res = source.minBy(function (x) { return x.value; });\n        * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer] Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n        */\n        minBy(keySelector: (item: T) => number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the minimum element in an observable sequence according to the optional comparer else a default greater than less than check.\n        * @example\n        * var res = source.min();\n        * var res = source.min(function (x, y) { return x.value - y.value; });\n        * @param {Function} [comparer] Comparer used to compare elements.\n        * @returns {Observable} An observable sequence containing a single element with the minimum element in the source sequence.\n        */\n        min(comparer?: _Comparer<T, number>): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n        * @example\n        * var res = source.maxBy(function (x) { return x.value; });\n        * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer]  Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n        */\n        maxBy<TKey>(keySelector: (item: T) => TKey, comparer: _Comparer<TKey, number>): Observable<T>;\n        /**\n        * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n        * @example\n        * var res = source.maxBy(function (x) { return x.value; });\n        * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer]  Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n        */\n        maxBy(keySelector: (item: T) => number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the maximum value in an observable sequence according to the specified comparer.\n        * @example\n        * var res = source.max();\n        * var res = source.max(function (x, y) { return x.value - y.value; });\n        * @param {Function} [comparer] Comparer used to compare elements.\n        * @returns {Observable} An observable sequence containing a single element with the maximum element in the source sequence.\n        */\n        max(comparer?: _Comparer<T, number>): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Computes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present.\n        * @param {Function} [selector] A transform function to apply to each element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element with the average of the sequence of values.\n        */\n        average(keySelector?: _Selector<T, number>, thisArg?: any): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n        *\n        * @example\n        * var res = res = source.sequenceEqual([1,2,3]);\n        * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n        * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n        * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n        * @param {Observable} second Second observable sequence or array to compare.\n        * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n        * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n        */\n        sequenceEqual(second: ObservableOrPromise<T> | ArrayOrIterable<T>, comparer?: _Comparer<T, boolean>): Observable<boolean>;\n        /**\n        *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n        *\n        * @example\n        * var res = res = source.sequenceEqual([1,2,3]);\n        * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n        * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n        * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n        * @param {Observable} second Second observable sequence or array to compare.\n        * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n        * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n        */\n        sequenceEqual<TOther>(second: ObservableOrPromise<T> | ArrayOrIterable<T>, comparer: _Comparer<T | TOther, boolean>): Observable<boolean>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the element at a specified index in a sequence or default value if not found.\n        * @param {Number} index The zero-based index of the element to retrieve.\n        * @param {Any} [defaultValue] The default value to use if elementAt does not find a value.\n        * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence.\n        */\n        elementAt(index: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the only element of an observable sequence that satisfies the condition in the optional predicate, and reports an exception if there is not exactly one element in the observable sequence.\n        * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n        * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n        * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate.\n        */\n        single(predicate?: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the first element of an observable sequence that satisfies the condition in the predicate if present else the first item in the sequence.\n        * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate if provided, else the first item in the sequence.\n        */\n        first(predicate?: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the last element of an observable sequence that satisfies the condition in the predicate if specified, else the last element.\n        * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate.\n        */\n        last(predicate?: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Searches for an element that matches the conditions defined by the specified predicate, and returns the first occurrence within the entire Observable sequence.\n        * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n        * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n        * @returns {Observable} An Observable sequence with the first element that matches the conditions defined by the specified predicate, if found; otherwise, undefined.\n        */\n        find(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n          * Searches for an element that matches the conditions defined by the specified predicate, and returns\n          * an Observable sequence with the zero-based index of the first occurrence within the entire Observable sequence.\n          * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n          * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n          * @returns {Observable} An Observable sequence with the zero-based index of the first occurrence of an element that matches the conditions defined by match, if found; otherwise, –1.\n        */\n        findIndex(predicate: _Predicate<T>, thisArg?: any): Observable<number>;\n    }\n\n    export interface ObservableStatic {\n        wrap<T>(fn: Function): Observable<T>;\n        spawn<T>(fn: Function): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.\n        *\n        * @example\n        * var res = Rx.Observable.start(function () { console.log('hello'); });\n        * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout);\n        * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console);\n        *\n        * @param {Function} func Function to run asynchronously.\n        * @param {Scheduler} [scheduler]  Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param [context]  The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n        *\n        * Remarks\n        * * The function is called immediately, not during the subscription of the resulting sequence.\n        * * Multiple subscriptions to the resulting sequence can observe the function's result.\n        */\n        start<T>(func: () => T, scheduler?: IScheduler, context?: any): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<TResult>(func: () => TResult, context?: any, scheduler?: IScheduler): () => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, TResult>(func: (arg1: T1) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1) => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, T2, TResult>(func: (arg1: T1, arg2: T2) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1, arg2: T2) => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, T2, T3, TResult>(func: (arg1: T1, arg2: T2, arg3: T3) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1, arg2: T2, arg3: T3) => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, T2, T3, T4, TResult>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult>(func: Function, context: any, selector: Function): (...args: any[]) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1>(func: (arg1: T1, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2>(func: (arg1: T1, arg2: T2, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3>(func: (arg1: T1, arg2: T2, arg3: T3, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8, T9>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9) => Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult>(func: Function, context?: any, selector?: Function): (...args: any[]) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1>(func: (arg1: T1, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2>(func: (arg1: T1, arg2: T2, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3>(func: (arg1: T1, arg2: T2, arg3: T3, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8, T9>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9) => Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n         * @param {Object} element The DOMElement or NodeList to attach a listener.\n         * @param {String} eventName The event name to attach the observable sequence.\n         * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n         * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n         */\n        fromEvent<T>(element: EventTarget, eventName: string, selector?: (arguments: any[]) => T): Observable<T>;\n        /**\n         * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n         * @param {Object} element The DOMElement or NodeList to attach a listener.\n         * @param {String} eventName The event name to attach the observable sequence.\n         * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n         * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n         */\n        fromEvent<T>(element: { on: (name: string, cb: (e: any) => any) => void; off: (name: string, cb: (e: any) => any) => void }, eventName: string, selector?: (arguments: any[]) => T): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n        * @param {Function} addHandler The function to add a handler to the emitter.\n        * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n        * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n        * @returns {Observable} An observable sequence which wraps an event from an event emitter\n        */\n        fromEventPattern<T>(addHandler: (handler: Function) => void, removeHandler: (handler: Function) => void, selector?: (arguments: any[]) => T): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Invokes the asynchronous function, surfacing the result through an observable sequence.\n        * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n        * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n        */\n        startAsync<T>(functionAsync: () => IPromise<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n         * @example\n         * var pauser = new Rx.Subject();\n         * var source = Rx.Observable.interval(100).pausable(pauser);\n         * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n         * @returns {Observable} The observable sequence which is paused based upon the pauser.\n         */\n        pausable(pauser?: Observable<boolean>): PausableObservable<T>;\n    }\n\n    export interface PausableObservable<T> extends Observable<T> {\n        pause(): void;\n        resume(): void;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n         * and yields the values that were buffered while paused.\n         * @example\n         * var pauser = new Rx.Subject();\n         * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n         * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n         * @returns {Observable} The observable sequence which is paused based upon the pauser.\n         */\n        pausableBuffered(pauser?: Observable<boolean>): PausableObservable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Attaches a controller to the observable sequence with the ability to queue.\n        * @example\n        * var source = Rx.Observable.interval(100).controlled();\n        * source.request(3); // Reads 3 values\n        * @param {bool} enableQueue truthy value to determine if values should be queued pending the next request\n        * @param {Scheduler} scheduler determines how the requests will be scheduled\n        * @returns {Observable} The observable sequence which only propagates values on request.\n        */\n        controlled(enableQueue?: boolean, scheduler?: IScheduler): ControlledObservable<T>;\n    }\n\n    export interface ControlledObservable<T> extends Observable<T> {\n        request(numberOfItems?: number): IDisposable;\n    }\n\n    export interface ControlledObservable<T> {\n        /**\n         * Attaches a stop and wait observable to the current observable.\n         * @returns {Observable} A stop and wait observable.\n         */\n        stopAndWait(): Observable<T>;\n    }\n\n    export interface ControlledObservable<T> {\n        /**\n         * Creates a sliding windowed observable based upon the window size.\n         * @param {Number} windowSize The number of items in the window\n         * @returns {Observable} A windowed observable based upon the window size.\n         */\n        windowed(windowSize: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Pipes the existing Observable sequence into a Node.js Stream.\n        * @param {Stream} dest The destination Node.js stream.\n        * @returns {Stream} The destination stream.\n        */\n        pipe<TDest>(dest: TDest): TDest;\n        // TODO: Add link to node.d.ts some where\n    }\n\n    /**\n     *  Represents an object that is both an observable sequence as well as an observer.\n     *  Each notification is broadcasted to all subscribed observers.\n     */\n    export interface ISubject<T> extends IObservable<T>, IObserver<T>, IDisposable {\n        hasObservers(): boolean;\n    }\n\n    export interface Subject<T> extends Observable<T>, Observer<T>, IDisposable {\n        hasObservers(): boolean;\n        /** Is this value disposed. */\n        isDisposed: boolean;\n    }\n\n    interface SubjectStatic {\n        /**\n         * Creates a subject.\n         */\n        new <T>(): Subject<T>;\n\n        /**\n         * Creates a subject from the specified observer and observable.\n         * @param {Observer} observer The observer used to send messages to the subject.\n         * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n         * @returns {Subject} Subject implemented using the given observer and observable.\n         */\n        create<T>(observer?: IObserver<T>, observable?: IObservable<T>): Subject<T>;\n    }\n\n    /**\n     *  Represents an object that is both an observable sequence as well as an observer.\n     *  Each notification is broadcasted to all subscribed observers.\n     */\n    export var Subject: SubjectStatic;\n\n        export interface ConnectableObservable<T> extends Observable<T> {\n    \t\tconnect(): IDisposable;\n    \t\trefCount(): Observable<T>;\n        }\n\n    export interface Observable<T> {\n        /**\n        * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n        * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n        * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n        *\n        * @example\n        * 1 - res = source.multicast(observable);\n        * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n        *\n        * @param {Function|Subject} subjectOrSubjectSelector\n        * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n        * Or:\n        * Subject to push source elements into.\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        multicast(subject: ISubject<T> | (() => ISubject<T>)): ConnectableObservable<T>;\n        /**\n        * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n        * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n        * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n        *\n        * @example\n        * 1 - res = source.multicast(observable);\n        * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n        *\n        * @param {Function|Subject} subjectOrSubjectSelector\n        * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n        * Or:\n        * Subject to push source elements into.\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        multicast<TResult>(subjectSelector: ISubject<T> | (() => ISubject<T>), selector: (source: ConnectableObservable<T>) => Observable<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of Multicast using a regular Subject.\n        *\n        * @example\n        * var resres = source.publish();\n        * var res = source.publish(function (x) { return x; });\n        *\n        * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publish(): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of Multicast using a regular Subject.\n        *\n        * @example\n        * var resres = source.publish();\n        * var res = source.publish(function (x) { return x; });\n        *\n        * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publish<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        share(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n        * This operator is a specialization of Multicast using a AsyncSubject.\n        *\n        * @example\n        * var res = source.publishLast();\n        * var res = source.publishLast(function (x) { return x; });\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishLast(): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n        * This operator is a specialization of Multicast using a AsyncSubject.\n        *\n        * @example\n        * var res = source.publishLast();\n        * var res = source.publishLast(function (x) { return x; });\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishLast<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n        * This operator is a specialization of Multicast using a BehaviorSubject.\n        *\n        * @example\n        * var res = source.publishValue(42);\n        * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishValue(initialValue: T): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n        * This operator is a specialization of Multicast using a BehaviorSubject.\n        *\n        * @example\n        * var res = source.publishValue(42);\n        * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishValue<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>, initialValue: T): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n        * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        shareValue(initialValue: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of Multicast using a ReplaySubject.\n        *\n        * @example\n        * var res = source.replay(null, 3);\n        * var res = source.replay(null, 3, 500);\n        * var res = source.replay(null, 3, 500, scheduler);\n        * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param windowSize [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        replay(selector?: void, bufferSize?: number, window?: number, scheduler?: IScheduler): ConnectableObservable<T>;\t// hack to catch first omitted parameter\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of Multicast using a ReplaySubject.\n        *\n        * @example\n        * var res = source.replay(null, 3);\n        * var res = source.replay(null, 3, 500);\n        * var res = source.replay(null, 3, 500, scheduler);\n        * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param windowSize [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        replay(selector: (source: ConnectableObservable<T>) => Observable<T>, bufferSize?: number, window?: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        *\n        * @example\n        * var res = source.shareReplay(3);\n        * var res = source.shareReplay(3, 500);\n        * var res = source.shareReplay(3, 500, scheduler);\n        *\n\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param window [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        shareReplay(bufferSize?: number, window?: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence. This observable sequence\n        * can be resubscribed to, even if all prior subscriptions have ended. (unlike `.publish().refCount()`)\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source.\n        */\n        singleInstance(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Correlates the elements of two sequences based on overlapping durations.\n        *\n        *  @param {Observable} right The right observable sequence to join elements for.\n        *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n        *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n        *  @param {Function} resultSelector A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters passed to the function correspond with the elements from the left and right source sequences for which overlap occurs.\n        *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n        */\n        join<TRight, TDurationLeft, TDurationRight, TResult>(\n            right: Observable<TRight>,\n            leftDurationSelector: (leftItem: T) => Observable<TDurationLeft>,\n            rightDurationSelector: (rightItem: TRight) => Observable<TDurationRight>,\n            resultSelector: (leftItem: T, rightItem: TRight) => TResult): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Correlates the elements of two sequences based on overlapping durations, and groups the results.\n        *\n        *  @param {Observable} right The right observable sequence to join elements for.\n        *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n        *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n        *  @param {Function} resultSelector A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. The first parameter passed to the function is an element of the left sequence. The second parameter passed to the function is an observable sequence with elements from the right sequence that overlap with the left sequence's element.\n        *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n        */\n        groupJoin<TRight, TDurationLeft, TDurationRight, TResult>(\n            right: Observable<TRight>,\n            leftDurationSelector: (leftItem: T) => Observable<TDurationLeft>,\n            rightDurationSelector: (rightItem: TRight) => Observable<TDurationRight>,\n            resultSelector: (leftItem: T, rightItem: Observable<TRight>) => TResult): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers.\n        *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        buffer<TBufferOpening>(bufferOpenings: Observable<TBufferOpening>): Observable<T[]>;\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers.\n        *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        buffer<TBufferClosing>(bufferClosingSelector: () => Observable<TBufferClosing>): Observable<T[]>;\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers.\n        *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        buffer<TBufferOpening, TBufferClosing>(bufferOpenings: Observable<TBufferOpening>, bufferClosingSelector: () => Observable<TBufferClosing>): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more windows.\n        *\n        *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        window<TWindowOpening>(windowOpenings: Observable<TWindowOpening>): Observable<Observable<T>>;\n        /**\n        *  Projects each element of an observable sequence into zero or more windows.\n        *\n        *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        window<TWindowClosing>(windowClosingSelector: () => Observable<TWindowClosing>): Observable<Observable<T>>;\n        /**\n        *  Projects each element of an observable sequence into zero or more windows.\n        *\n        *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        window<TWindowOpening, TWindowClosing>(windowOpenings: Observable<TWindowOpening>, windowClosingSelector: () => Observable<TWindowClosing>): Observable<Observable<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Returns a new observable that triggers on the second and subsequent triggerings of the input observable.\n         * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair.\n         * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs.\n         * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array.\n         */\n        pairwise(): Observable<[T, T]>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Returns two observables which partition the observations of the source by the given function.\n         * The first will trigger observations for those values for which the predicate returns true.\n         * The second will trigger observations for those values where the predicate returns false.\n         * The predicate is executed once for each subscribed observer.\n         * Both also propagate all error observations arising from the source and each completes\n         * when the source completes.\n         * @param {Function} predicate\n         *    The function to determine which output Observable will trigger a particular observation.\n         * @returns {Array}\n         *    An array of observables. The first triggers when the predicate returns true,\n         *    and the second triggers when the predicate returns false.\n        */\n        partition(predicate: _Predicate<T>, thisArg?: any): [Observable<T>, Observable<T>];\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions.\n        *  This operator allows for a fluent style of writing queries that use the same sequence multiple times.\n        *\n        * @param {Function} selector Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        let<TResult>(selector: (source: Observable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Determines whether an observable collection contains values.\n        *\n        * @example\n        *  1 - res = Rx.Observable.if(condition, obs1);\n        *  2 - res = Rx.Observable.if(condition, obs1, obs2);\n        *  3 - res = Rx.Observable.if(condition, obs1, scheduler);\n        * @param {Function} condition The condition which determines if the thenSource or elseSource will be run.\n        * @param {Observable} thenSource The observable sequence or Promise that will be run if the condition function returns true.\n        * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the condition function returns false. If this is not provided, it defaults to Rx.Observabe.Empty with the specified scheduler.\n        * @returns {Observable} An observable sequence which is either the thenSource or elseSource.\n        */\n        if<T>(condition: () => boolean, thenSource: ObservableOrPromise<T>, elseSourceOrScheduler?: ObservableOrPromise<T> | IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n        * There is an alias for this method called 'forIn' for browsers <IE9\n        * @param {Array} sources An array of values to turn into an observable sequence.\n        * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n        * @returns {Observable} An observable sequence from the concatenated observable sequences.\n        */\n        for<T, TResult>(sources: T[], resultSelector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n        * There is an alias for this method called 'forIn' for browsers <IE9\n        * @param {Array} sources An array of values to turn into an observable sequence.\n        * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n        * @returns {Observable} An observable sequence from the concatenated observable sequences.\n        */\n        forIn<T, TResult>(sources: T[], resultSelector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Repeats source as long as condition holds emulating a while loop.\n        * There is an alias for this method called 'whileDo' for browsers <IE9\n        *\n        * @param {Function} condition The condition which determines if the source will be repeated.\n        * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n        * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n        */\n        while<T>(condition: () => boolean, source: ObservableOrPromise<T>): Observable<T>;\n        /**\n        *  Repeats source as long as condition holds emulating a while loop.\n        * There is an alias for this method called 'whileDo' for browsers <IE9\n        *\n        * @param {Function} condition The condition which determines if the source will be repeated.\n        * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n        * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n        */\n        whileDo<T>(condition: () => boolean, source: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Repeats source as long as condition holds emulating a do while loop.\n        *\n        * @param {Function} condition The condition which determines if the source will be repeated.\n        * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n        * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n        */\n        doWhile(condition: () => boolean): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Uses selector to determine which source in sources to use.\n        * @param {Function} selector The function which extracts the value for to test in a case statement.\n        * @param {Array} sources A object which has keys which correspond to the case statement labels.\n        * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n        *\n        * @returns {Observable} An observable sequence which is determined by a case statement.\n        */\n        case<T>(selector: () => string, sources: { [key: string]: ObservableOrPromise<T>; }, schedulerOrElseSource?: IScheduler | ObservableOrPromise<T>): Observable<T>;\n        /**\n        *  Uses selector to determine which source in sources to use.\n        * @param {Function} selector The function which extracts the value for to test in a case statement.\n        * @param {Array} sources A object which has keys which correspond to the case statement labels.\n        * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n        *\n        * @returns {Observable} An observable sequence which is determined by a case statement.\n        */\n        case<T>(selector: () => number, sources: { [key: number]: ObservableOrPromise<T>; }, schedulerOrElseSource?: IScheduler | ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Expands an observable sequence by recursively invoking selector.\n        *\n        * @param {Function} selector Selector function to invoke for each produced element, resulting in another sequence to which the selector will be invoked recursively again.\n        * @param {Scheduler} [scheduler] Scheduler on which to perform the expansion. If not provided, this defaults to the current thread scheduler.\n        * @returns {Observable} An observable sequence containing all the elements produced by the recursive expansion.\n        */\n        expand(selector: (item: T) => Observable<T>, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Runs all observable sequences in parallel and collect their last elements.\n        *\n        * @example\n        *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n        *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n        * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n        */\n        forkJoin<T>(sources: ObservableOrPromise<T>[]): Observable<T[]>;\n\n        /**\n        *  Runs all observable sequences in parallel and collect their last elements.\n        *\n        * @example\n        *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n        *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n        * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n        */\n        forkJoin<T>(...args: ObservableOrPromise<T>[]): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Runs two observable sequences in parallel and combines their last elemenets.\n        *\n        * @param {Observable} second Second observable sequence.\n        * @param {Function} resultSelector Result selector function to invoke with the last elements of both sequences.\n        * @returns {Observable} An observable sequence with the result of calling the selector function with the last elements of both input sequences.\n        */\n        forkJoin<TSecond, TResult>(second: ObservableOrPromise<TSecond>, resultSelector: (left: T, right: TSecond) => TResult): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Comonadic bind operator.\n        * @param {Function} selector A transform function to apply to each element.\n        * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n        * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n        */\n        manySelect<TResult>(selector: _Selector<Observable<T>, TResult>, scheduler?: IScheduler): Observable<TResult>;\n        /**\n        * Comonadic bind operator.\n        * @param {Function} selector A transform function to apply to each element.\n        * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n        * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n        */\n        extend<TResult>(selector: _Selector<Observable<T>, TResult>, scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export class Plan<T> { }\n\n    export interface Pattern2<T1, T2> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T3>(other: Observable<T3>): Pattern3<T1, T2, T3>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2) => TR): Plan<TR>;\n    }\n    interface Pattern3<T1, T2, T3> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T4>(other: Observable<T4>): Pattern4<T1, T2, T3, T4>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3) => TR): Plan<TR>;\n    }\n    interface Pattern4<T1, T2, T3, T4> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T5>(other: Observable<T5>): Pattern5<T1, T2, T3, T4, T5>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4) => TR): Plan<TR>;\n    }\n    interface Pattern5<T1, T2, T3, T4, T5> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T6>(other: Observable<T6>): Pattern6<T1, T2, T3, T4, T5, T6>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5) => TR): Plan<TR>;\n    }\n    interface Pattern6<T1, T2, T3, T4, T5, T6> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T7>(other: Observable<T7>): Pattern7<T1, T2, T3, T4, T5, T6, T7>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6) => TR): Plan<TR>;\n    }\n    interface Pattern7<T1, T2, T3, T4, T5, T6, T7> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T8>(other: Observable<T8>): Pattern8<T1, T2, T3, T4, T5, T6, T7, T8>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7) => TR): Plan<TR>;\n    }\n    interface Pattern8<T1, T2, T3, T4, T5, T6, T7, T8> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T9>(other: Observable<T9>): Pattern9<T1, T2, T3, T4, T5, T6, T7, T8, T9>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8) => TR): Plan<TR>;\n    }\n    interface Pattern9<T1, T2, T3, T4, T5, T6, T7, T8, T9> {\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8, item9: T9) => TR): Plan<TR>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Creates a pattern that matches when both observable sequences have an available value.\n        *\n        *  @param right Observable sequence to match with the current sequence.\n        *  @return {Pattern} Pattern object that matches when both observable sequences have an available value.\n        */\n        and<T2>(right: Observable<T2>): Pattern2<T, T2>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Matches when the observable sequence has an available value and projects the value.\n        *\n        *  @param {Function} selector Selector that will be invoked for values in the source sequence.\n        *  @returns {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T) => TR): Plan<TR>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Joins together the results from several patterns.\n        *\n        *  @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns.\n        *  @returns {Observable} Observable sequence with the results form matching several patterns.\n        */\n        when<TR>(plan: Plan<TR>): Observable<TR>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Returns an observable sequence that produces a value after each period.\n         *\n         * @example\n         *  1 - res = Rx.Observable.interval(1000);\n         *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n         *\n         * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n         * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n         * @returns {Observable} An observable sequence that produces a value after each period.\n         */\n        interval(period: number, scheduler?: IScheduler): Observable<number>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n         * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n         * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n         * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n         * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n         */\n        timer(dueTime: number, period: number, scheduler?: IScheduler): Observable<number>;\n        /**\n         *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n         * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n         * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n         * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n         * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n         */\n        timer(dueTime: number, scheduler?: IScheduler): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n        *\n        * @example\n        *  1 - res = Rx.Observable.delay(new Date());\n        *  2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout);\n        *\n        *  3 - res = Rx.Observable.delay(5000);\n        *  4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout);\n        * @memberOf Observable#\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n        * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(dueTime: Date, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n        *\n        * @example\n        *  1 - res = Rx.Observable.delay(new Date());\n        *  2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout);\n        *\n        *  3 - res = Rx.Observable.delay(5000);\n        *  4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout);\n        * @memberOf Observable#\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n        * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(dueTime: number, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Time shifts the observable sequence based on a subscription delay and a delay selector function for each element.\n        *\n        * @example\n        *  1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only\n        *  1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector\n        *\n        * @param {Observable} [subscriptionDelay]  Sequence indicating the delay for the subscription to the source.\n        * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(delayDurationSelector: (item: T) => ObservableOrPromise<number>): Observable<T>;\n\n        /**\n        *  Time shifts the observable sequence based on a subscription delay and a delay selector function for each element.\n        *\n        * @example\n        *  1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only\n        *  1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector\n        *\n        * @param {Observable} [subscriptionDelay]  Sequence indicating the delay for the subscription to the source.\n        * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(subscriptionDelay: Observable<number>, delayDurationSelector: (item: T) => ObservableOrPromise<number>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Ignores values from an observable sequence which are followed by another value before dueTime.\n        * @param {Number} dueTime Duration of the debounce period for each value (specified as an integer denoting milliseconds).\n        * @param {Scheduler} [scheduler]  Scheduler to run the debounce timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The debounced sequence.\n        */\n        debounce(dueTime: number, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        * Ignores values from an observable sequence which are followed by another value within a computed throttle duration.\n        * @param {Function} durationSelector Selector function to retrieve a sequence indicating the throttle duration for each given element.\n        * @returns {Observable} The debounced sequence.\n        */\n        debounce(debounceDurationSelector: (item: T) => ObservableOrPromise<any>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n        * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n        * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithTime(timeSpan: number, timeShift: number, scheduler?: IScheduler): Observable<Observable<T>>;\n        /**\n        *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n        * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n        * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithTime(timeSpan: number, scheduler?: IScheduler): Observable<Observable<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed.\n        * @param {Number} timeSpan Maximum time length of a window.\n        * @param {Number} count Maximum element count of a window.\n        * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithTimeOrCount(timeSpan: number, count: number, scheduler?: IScheduler): Observable<Observable<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n        * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n        * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithTime(timeSpan: number, timeShift: number, scheduler?: IScheduler): Observable<T[]>;\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n        * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n        * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithTime(timeSpan: number, scheduler?: IScheduler): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed.\n        * @param {Number} timeSpan Maximum time length of a buffer.\n        * @param {Number} count Maximum element count of a buffer.\n        * @param {Scheduler} [scheduler]  Scheduler to run bufferin timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithTimeOrCount(timeSpan: number, count: number, scheduler?: IScheduler): Observable<T[]>;\n    }\n\n\texport interface TimeInterval<T> {\n\t\tvalue: T;\n\t\tinterval: number;\n\t}\n\n    export interface Observable<T> {\n        /**\n        *  Records the time interval between consecutive values in an observable sequence.\n        *\n        * @example\n        *  1 - res = source.timeInterval();\n        *  2 - res = source.timeInterval(Rx.Scheduler.timeout);\n        *\n        * @param [scheduler]  Scheduler used to compute time intervals. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence with time interval information on values.\n        */\n        timeInterval(scheduler?: IScheduler): Observable<TimeInterval<T>>;\n    }\n\n    export interface Timestamp<T> {\n        value: T;\n        timestamp: number;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Records the timestamp for each value in an observable sequence.\n        *\n        * @example\n        *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n        *  2 - res = source.timestamp(Rx.Scheduler.default);\n        *\n        * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the default scheduler is used.\n        * @returns {Observable} An observable sequence with timestamp information on values.\n        */\n        timestamp(scheduler?: IScheduler): Observable<Timestamp<T>>;\n    }\n\n    export interface ObservableStatic {\n         prototype: any;\n     }\n\n    export interface Observable<T> {\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        sample(intervalOrSampler: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        sample<TSample>(sampler: Observable<TSample>, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        throttleLatest(interval: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        throttleLatest<TSample>(sampler: Observable<TSample>, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: Date, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: Date, other?: Observable<T>, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: number, other?: Observable<T>, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(timeoutdurationSelector: (item: T) => Observable<TTimeout>): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @param {Observable} other  Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException().\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(timeoutdurationSelector: (item: T) => Observable<TTimeout>, other: Observable<T>): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Observable} [firstTimeout]  Observable sequence that represents the timeout for the first element. If not provided, this defaults to Observable.never().\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException().\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(firstTimeout: Observable<TTimeout>, timeoutdurationSelector: (item: T) => Observable<TTimeout>, other?: Observable<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n         *\n         * @example\n         *  res = source.generateWithAbsoluteTime(0,\n         *      function (x) { return return true; },\n         *      function (x) { return x + 1; },\n         *      function (x) { return x; },\n         *      function (x) { return new Date(); }\n         *  });\n         *\n         * @param {Mixed} initialState Initial state.\n         * @param {Function} condition Condition to terminate generation (upon returning false).\n         * @param {Function} iterate Iteration step function.\n         * @param {Function} resultSelector Selector function for results produced in the sequence.\n         * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning Date values.\n         * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n         * @returns {Observable} The generated sequence.\n         */\n        generateWithAbsoluteTime<TState, TResult>(\n            initialState: TState,\n            condition: (state: TState) => boolean,\n            iterate: (state: TState) => TState,\n            resultSelector: (state: TState) => TResult,\n            timeSelector: (state: TState) => Date,\n            scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n         *\n         * @example\n         *  res = source.generateWithRelativeTime(0,\n         *      function (x) { return return true; },\n         *      function (x) { return x + 1; },\n         *      function (x) { return x; },\n         *      function (x) { return 500; }\n         *  );\n         *\n         * @param {Mixed} initialState Initial state.\n         * @param {Function} condition Condition to terminate generation (upon returning false).\n         * @param {Function} iterate Iteration step function.\n         * @param {Function} resultSelector Selector function for results produced in the sequence.\n         * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds.\n         * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n         * @returns {Observable} The generated sequence.\n         */\n        generateWithRelativeTime<TState, TResult>(\n            initialState: TState,\n            condition: (state: TState) => boolean,\n            iterate: (state: TState) => TState,\n            resultSelector: (state: TState) => TResult,\n            timeSelector: (state: TState) => number,\n            scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n        *\n        * @example\n        *  1 - res = source.delaySubscription(5000); // 5s\n        *  2 - res = source.delaySubscription(5000, Rx.Scheduler.default); // 5 seconds\n        *\n        * @param {Number} dueTime Relative or absolute time shift of the subscription.\n        * @param {Scheduler} [scheduler]  Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delaySubscription(dueTime: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n        *\n        *  1 - res = source.skipLastWithTime(5000);\n        *  2 - res = source.skipLastWithTime(5000, scheduler);\n        *\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for skipping elements from the end of the sequence.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout\n        * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence.\n        */\n        skipLastWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements.\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for taking elements from the end of the sequence.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence.\n        */\n        takeLastWithTime(duration: number, timerScheduler?: IScheduler, loopScheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for taking elements from the end of the sequence.\n        * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence.\n        */\n        takeLastBufferWithTime(duration: number, scheduler?: IScheduler): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n        *\n        * @example\n        *  1 - res = source.takeWithTime(5000,  [optional scheduler]);\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for taking elements from the start of the sequence.\n        * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence.\n        */\n        takeWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n        *\n        * @example\n        *  1 - res = source.skipWithTime(5000, [optional scheduler]);\n        *\n        * @description\n        *  Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence.\n        *  This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded\n        *  may not execute immediately, despite the zero due time.\n        *\n        *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration.\n        * @param {Number} duration Duration for skipping elements from the start of the sequence.\n        * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence.\n        */\n        skipWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n        *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n        *\n        * @examples\n        *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n        *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n        * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n        */\n        skipUntilWithTime(startTime: Date, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n        *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n        *\n        * @examples\n        *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n        *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n        * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n        */\n        skipUntilWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n        * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n        * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n        */\n        takeUntilWithTime(endTime: Date, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n        * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n        * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n        */\n        takeUntilWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n        * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n        * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n        * @returns {Observable} An Observable that performs the throttle operation.\n        */\n        throttle(windowDuration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Executes a transducer to transform the observable sequence\n         * @param {Transducer} transducer A transducer to execute\n         * @returns {Observable} An Observable sequence containing the results from the transducer.\n         */\n        transduce(transducer: any): any;\n        //TODO: Setup transducer\n    }\n\n    export interface Observable<T> {\n        /**\n        * Performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * Observables that come in between subscriptions will be dropped on the floor.\n        * @returns {Observable} A exclusive observable with only the results that happen when subscribed.\n        */\n        switchFirst(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface VirtualTimeScheduler<TAbsolute, TRelative> extends IScheduler {\n        clock: TAbsolute;\n        /**\n         * Adds a relative time value to an absolute time value.\n         * @param {Number} absolute Absolute virtual time value.\n         * @param {Number} relative Relative virtual time value to add.\n         * @return {Number} Resulting absolute virtual time sum value.\n         */\n        add(from: TAbsolute, by: TRelative): TAbsolute;\n\n        /**\n         * Converts an absolute time to a number\n         * @param {Any} The absolute time.\n         * @returns {Number} The absolute time in ms\n         */\n        toAbsoluteTime(duetime: TAbsolute): number;\n\n        /**\n         * Converts the TimeSpan value to a relative virtual time value.\n         * @param {Number} timeSpan TimeSpan value to convert.\n         * @return {Number} Corresponding relative virtual time value.\n         */\n        toRelativeTime(duetime: number): TRelative;\n\n        /**\n         * Starts the virtual time scheduler.\n         */\n        start(): IDisposable;\n\n        /**\n         * Stops the virtual time scheduler.\n         */\n        stop(): void;\n\n        /**\n         * Advances the scheduler's clock to the specified time, running all work till that point.\n         * @param {Number} time Absolute time to advance the scheduler's clock to.\n         */\n        advanceTo(time: TAbsolute): void;\n\n        /**\n         * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n         * @param {Number} time Relative time to advance the scheduler's clock by.\n         */\n        advanceBy(time: TRelative): void;\n\n        /**\n         * Advances the scheduler's clock by the specified relative time.\n         * @param {Number} time Relative time to advance the scheduler's clock by.\n         */\n        sleep(time: TRelative): void;\n\n        isEnabled: boolean;\n\n        /**\n         * Gets the next scheduled item to be executed.\n         * @returns {ScheduledItem} The next scheduled item.\n         */\n        getNext(): internals.ScheduledItem<TAbsolute>;\n\n        /**\n         * Schedules an action to be executed at dueTime.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Any} dueTime Absolute time at which to execute the action.\n         * @param {Function} action Action to be executed.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleAbsolute(\n            state: any,\n            dueTime: TAbsolute,\n            action: (scheduler: VirtualTimeScheduler<TAbsolute, TRelative>, state: any) => any\n        ): SingleAssignmentDisposable;\n    }\n\n    export var VirtualTimeScheduler: {\n        /**\n         * Creates a new historical scheduler with the specified initial clock value.\n         * @constructor\n         * @param {Any} initialClock Initial value for the clock.\n         * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n         */\n        new <TAbsolute, TRelative>(initialClock: TAbsolute, comparer: _Comparer<TAbsolute, TRelative>): VirtualTimeScheduler<TAbsolute, TRelative>;\n    };\n\n    export interface HistoricalScheduler extends VirtualTimeScheduler<number, number> {\n    }\n\n    export var HistoricalScheduler: {\n        /**\n         * Creates a new historical scheduler with the specified initial clock value.\n         * @constructor\n         * @param {Number} initialClock Initial value for the clock.\n         * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n         */\n        new (initialClock: number, comparer: _Comparer<number, number>): HistoricalScheduler;\n    };\n\n    export interface Subscription {\n        /**\n         * Checks whether the given subscription is equal to the current instance.\n         * @param other Subscription object to check for equality.\n         * @returns {Boolean} true if both objects are equal; false otherwise.\n         */\n        equals(other: Subscription): boolean;\n        /**\n         * Returns a string representation of the current Subscription value.\n         * @returns {String} String representation of the current Subscription value.\n         */\n        toString(): string;\n    }\n\n    interface SubscriptionStatic {\n        /**\n         * Creates a new subscription object with the given virtual subscription and unsubscription time.\n         *\n         * @constructor\n         * @param {Number} subscribe Virtual time at which the subscription occurred.\n         * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n         */\n        new (subscribeAt: number, unsubscribeAt?: number): Subscription;\n    }\n\n    export var Subscription: SubscriptionStatic;\n\n    export interface Recorded {\n        /**\n         * Checks whether the given recorded object is equal to the current instance.\n         *\n         * @param {Recorded} other Recorded object to check for equality.\n         * @returns {Boolean} true if both objects are equal; false otherwise.\n         */\n        equals(other: Recorded): boolean;\n        /**\n         * Returns a string representation of the current Recorded value.\n         *\n         * @returns {String} String representation of the current Recorded value.\n         */\n        toString(): string;\n        time: number;\n        value: any;\n    }\n\n    interface RecordedStatic {\n        /**\n         * Creates a new object recording the production of the specified value at the given virtual time.\n         *\n         * @constructor\n         * @param {Number} time Virtual time the value was produced on.\n         * @param {Mixed} value Value that was produced.\n         * @param {Function} comparer An optional comparer.\n         */\n        new (time: number, value: any, equalityComparer?: _Comparer<any, boolean>): Recorded;\n    }\n\n    export var Recorded: RecordedStatic;\n\n    export var ReactiveTest: {\n        /** Default virtual time used for creation of observable sequences in unit tests. */\n        created: number;\n        /** Default virtual time used to subscribe to observable sequences in unit tests. */\n        subscribed: number;\n        /** Default virtual time used to dispose subscriptions in unit tests. */\n        disposed: number;\n\n        /**\n         * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n         *\n         * 1 - ReactiveTest.onNext(200, 42);\n         * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n         *\n         * @param ticks Recorded virtual time the OnNext notification occurs.\n         * @param value Recorded value stored in the OnNext notification or a predicate.\n         * @return Recorded OnNext notification.\n         */\n        onNext(ticks: number, value: any): Recorded;\n        /**\n         * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n         *\n         * 1 - ReactiveTest.onNext(200, 42);\n         * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n         *\n         * @param ticks Recorded virtual time the OnNext notification occurs.\n         * @param value Recorded value stored in the OnNext notification or a predicate.\n         * @return Recorded OnNext notification.\n         */\n        onNext(ticks: number, predicate: (value: any) => boolean): Recorded;\n        /**\n         * Factory method for an OnError notification record at a given time with a given error.\n         *\n         * 1 - ReactiveTest.onNext(200, new Error('error'));\n         * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n         *\n         * @param ticks Recorded virtual time the OnError notification occurs.\n         * @param exception Recorded exception stored in the OnError notification.\n         * @return Recorded OnError notification.\n         */\n        onError(ticks: number, exception: any): Recorded;\n        /**\n         * Factory method for an OnError notification record at a given time with a given error.\n         *\n         * 1 - ReactiveTest.onNext(200, new Error('error'));\n         * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n         *\n         * @param ticks Recorded virtual time the OnError notification occurs.\n         * @param exception Recorded exception stored in the OnError notification.\n         * @return Recorded OnError notification.\n         */\n        onError(ticks: number, predicate: (exception: any) => boolean): Recorded;\n        /**\n         * Factory method for an OnCompleted notification record at a given time.\n         *\n         * @param ticks Recorded virtual time the OnCompleted notification occurs.\n         * @return Recorded OnCompleted notification.\n         */\n        onCompleted(ticks: number): Recorded;\n\n        /**\n         * Factory method for a subscription record based on a given subscription and disposal time.\n         *\n         * @param start Virtual time indicating when the subscription was created.\n         * @param end Virtual time indicating when the subscription was disposed.\n         * @return Subscription object.\n         */\n        subscribe(subscribeAt: number, unsubscribeAt?: number): Subscription;\n    }\n\n    export interface MockObserver<T> extends Observer<T> {\n        messages: Recorded[];\n    }\n\n    interface MockObserverStatic extends ObserverStatic {\n        new <T>(scheduler: IScheduler): MockObserver<T>;\n    }\n\n    export var MockObserver: MockObserverStatic;\n\n\n    export interface TestScheduler extends VirtualTimeScheduler<number, number> {\n        /**\n         * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n         * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n         * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n         */\n        createColdObservable<T>(...records: Recorded[]): Observable<T>;\n        /**\n         * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n         * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n         * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n         */\n        createHotObservable<T>(...records: Recorded[]): Observable<T>;\n        /**\n         * Creates an observer that records received notification messages and timestamps those.\n         * @return Observer that can be used to assert the timing of received notifications.\n         */\n        createObserver<T>(): MockObserver<T>;\n\n        /**\n         * Creates a resolved promise with the given value and ticks\n         * @param {Number} ticks The absolute time of the resolution.\n         * @param {Any} value The value to yield at the given tick.\n         * @returns {MockPromise} A mock Promise which fulfills with the given value.\n         */\n        createResolvedPromise<T>(ticks: number, value: T): IPromise<T>;\n        /**\n         * Creates a rejected promise with the given reason and ticks\n         * @param {Number} ticks The absolute time of the resolution.\n         * @param {Any} reason The reason for rejection to yield at the given tick.\n         * @returns {MockPromise} A mock Promise which rejects with the given reason.\n         */\n        createRejectedPromise<T>(ticks: number, value: T): IPromise<T>;\n\n        /**\n         * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n         *\n         * @param create Factory method to create an observable sequence.\n         * @param created Virtual time at which to invoke the factory to create an observable sequence.\n         * @param subscribed Virtual time at which to subscribe to the created observable sequence.\n         * @param disposed Virtual time at which to dispose the subscription.\n         * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n         */\n        startWithTiming<T>(create: () => Observable<T>, createdAt: number, subscribedAt: number, disposedAt: number): MockObserver<T>;\n        /**\n         * Starts the test scheduler and uses the specified virtual time to dispose the subscription to the sequence obtained through the factory function.\n         * Default virtual times are used for factory invocation and sequence subscription.\n         *\n         * @param create Factory method to create an observable sequence.\n         * @param disposed Virtual time at which to dispose the subscription.\n         * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n         */\n        startWithDispose<T>(create: () => Observable<T>, disposedAt: number): MockObserver<T>;\n        /**\n         * Starts the test scheduler and uses default virtual times to invoke the factory function, to subscribe to the resulting sequence, and to dispose the subscription.\n         *\n         * @param create Factory method to create an observable sequence.\n         * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n         */\n        startWithCreate<T>(create: () => Observable<T>): MockObserver<T>;\n    }\n\n    export var TestScheduler: {\n        new (): TestScheduler;\n    }\n\n    export interface AnonymousObservable<T> extends Observable<T> { }\n\n    export interface GroupedObservable<TKey, TElement> extends Observable<TElement> {\n        key: TKey;\n        underlyingObservable: Observable<TElement>;\n    }\n\n    export interface AsyncSubject<T> extends Subject<T> { }\n\n    interface AsyncSubjectStatic {\n        /**\n         * Creates a subject that can only receive one value and that value is cached for all future observations.\n         * @constructor\n         */\n        new <T>(): AsyncSubject<T>;\n    }\n\n    /**\n     *  Represents the result of an asynchronous operation.\n     *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n     */\n    export var AsyncSubject: AsyncSubjectStatic;\n\n    export interface BehaviorSubject<T> extends Subject<T> {\n        /**\n         * Gets the current value or throws an exception.\n         * Value is frozen after onCompleted is called.\n         * After onError is called always throws the specified exception.\n         * An exception is always thrown after dispose is called.\n         * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n         */\n        getValue(): T;\n    }\n\n    interface BehaviorSubjectStatic {\n        /**\n         *  Initializes a new instance of the BehaviorSubject class which creates a subject that caches its last value and starts with the specified value.\n         *  @param {Mixed} value Initial value sent to observers when no other value has been received by the subject yet.\n         */\n        new <T>(initialValue: T): BehaviorSubject<T>;\n    }\n\n    /**\n     *  Represents a value that changes over time.\n     *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n     */\n    export var BehaviorSubject: BehaviorSubjectStatic;\n\n    export interface ReplaySubject<T> extends Subject<T> { }\n\n    interface ReplaySubjectStatic {\n        /**\n         *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n         *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n         *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n         *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n         */\n        new <T>(bufferSize?: number, window?: number, scheduler?: IScheduler): ReplaySubject<T>;\n    }\n\n    /**\n    * Represents an object that is both an observable sequence as well as an observer.\n    * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n    */\n    export var ReplaySubject: ReplaySubjectStatic;\n\n    export interface AnonymousSubject<T> extends Subject<T> { }\n\n    interface AnonymousSubjectStatic {\n        /**\n         * Creates a subject that can only receive one value and that value is cached for all future observations.\n         * @constructor\n         */\n        new <T>(): AnonymousSubject<T>;\n    }\n\n    /**\n     *  Represents the result of an asynchronous operation.\n     *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n     */\n    export var AnonymousSubject: AnonymousSubjectStatic;\n\n    /**\n    * Used to pause and resume streams.\n    */\n    export interface Pauser {\n        /**\n         * Pauses the underlying sequence.\n         */\n        pause(): void;\n\n        /**\n        * Resumes the underlying sequence.\n        */\n        resume(): void;\n    }\n\n}\n\ndeclare module \"rx\" { export = Rx; }\ndeclare module \"rx.all\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.all.es6.d.ts",
    "content": "declare module Rx {\n\n    // Type alias for observables and promises\n    export type ObservableOrPromise<T> = IObservable<T> | Observable<T> | Promise<T>;\n\n    export type ArrayLike<T> = Array<T> | { length: number;[index: number]: T; };\n\n    // Type alias for arrays and array like objects\n    export type ArrayOrIterable<T> = ArrayLike<T> | Iterable<T>;\n\n    /**\n     * Promise A+\n     */\n    export interface Promise<T> extends PromiseLike<T> { }\n\n    /**\n     * Promise A+\n     */\n    export interface IPromise<T> extends PromiseLike<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface IObservable<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface Observable<T> extends IObservable<T> { }\n\n    export module internals {\n        export interface EmptyError extends Error { message: string; }\n        export interface EmptyErrorStatic { new (): EmptyError; }\n\n        export interface ObjectDisposedError extends Error { message: string; }\n        export interface ObjectDisposedErrorStatic { new (): ObjectDisposedError; }\n\n        export interface ArgumentOutOfRangeError extends Error { message: string; }\n        export interface ArgumentOutOfRangeErrorStatic { new (): ArgumentOutOfRangeError; }\n\n        export interface NotSupportedError extends Error { message: string; }\n        export interface NotSupportedErrorStatic { new (): NotSupportedError; }\n\n        export interface NotImplementedError extends Error { message: string; }\n        export interface NotImplementedErrorStatic { new (): NotImplementedError; }\n    }\n\n    export module helpers {\n        export var notImplemented: () => internals.NotImplementedError;\n        export var notSupported: () => internals.NotSupportedError;\n    }\n\n    export module internals {\n        export var bindCallback: (func: Function, thisArg: any, argCount: number) => Function;\n    }\n\n    export module internals {\n        export var isEqual : (left: any, right: any) => boolean;\n    }\n\n    export interface IDisposable {\n        dispose(): void;\n    }\n\n    export interface Disposable extends IDisposable {\n        /** Is this value disposed. */\n        isDisposed?: boolean;\n    }\n\n    interface DisposableStatic {\n        /**\n         * Provides a set of static methods for creating Disposables.\n         * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n         */\n        new (action: () => void): Disposable;\n\n        /**\n         * Creates a disposable object that invokes the specified action when disposed.\n         * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n         * @return {Disposable} The disposable object that runs the given action upon disposal.\n         */\n        create(action: () => void): Disposable;\n\n        /**\n         * Gets the disposable that does nothing when disposed.\n         */\n        empty: IDisposable;\n\n        /**\n         * Validates whether the given object is a disposable\n         * @param {Object} Object to test whether it has a dispose method\n         * @returns {Boolean} true if a disposable object, else false.\n         */\n        isDisposable(d: any): boolean;\n    }\n\n    /**\n     * Provides a set of static methods for creating Disposables.\n     * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n     */\n    export var Disposable: DisposableStatic;\n\n    export module config {\n        export var Promise: { new <T>(resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): IPromise<T>; };\n    }\n\n    export module helpers {\n        export var noop: () => void;\n        export var notDefined: (value: any) => boolean;\n        export var identity: <T>(value: T) => T;\n        export var defaultNow: () => number;\n        export var defaultComparer: (left: any, right: any) =>  boolean;\n        export var defaultSubComparer: (left: any, right: any) =>  number;\n        export var defaultKeySerializer: (key: any) =>  string;\n        export var defaultError: (err: any) =>  void;\n        export var isPromise: (p: any) =>  boolean;\n        export var asArray: <T>(...args: T[]) =>  T[];\n        export var not: (value: any) =>  boolean;\n        export var isFunction: (value: any) =>  boolean;\n    }\n\n    export type _Selector<T, TResult> = (value: T, index: number, observable: Observable<T>) => TResult;\n    export type _ValueOrSelector<T, TResult> = TResult | _Selector<T, TResult>;\n    export type _Predicate<T> = _Selector<T, boolean>;\n    export type _Comparer<T, TResult> = (value1: T, value2: T) => TResult;\n    export type _Accumulator<T, TAcc> = (acc: TAcc, value: T) => TAcc;\n\n    export module special {\n        export type _FlatMapResultSelector<T1, T2, TResult> = (value: T1, selectorValue: T2, index: number, selectorOther: number) => TResult;\n    }\n\n    export interface IObservable<T> {\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(observer: IObserver<T>): IDisposable;\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(observer: IObserver<T>): IDisposable;\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n\n        /**\n        * Subscribes to the next value in the sequence with an optional \"this\" argument.\n        * @param {Function} onNext The function to invoke on each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnNext(onNext: (value: T) => void, thisArg?: any): IDisposable;\n        /**\n        * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n        * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnError(onError: (exception: any) => void, thisArg?: any): IDisposable;\n        /**\n        * Subscribes to the next value in the sequence with an optional \"this\" argument.\n        * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnCompleted(onCompleted: () => void, thisArg?: any): IDisposable;\n\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        forEach(observer: IObserver<T>): IDisposable;\n\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        forEach(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Determines whether the given object is an Observable\n        * @param {Any} An object to determine whether it is an Observable\n        * @returns {Boolean} true if an Observable, else false.\n        */\n        isObservable(o: any): boolean;\n    }\n\n    export var Observable: ObservableStatic;\n\n    export module internals {\n        export var inherits: (child: any, parent: any) => void;\n        export var addProperties: (obj: any, ...sources: any[]) => void;\n        export var addRef: <T>(xs: Observable<T>, r: { getDisposable(): IDisposable; }) => Observable<T>;\n    }\n\n    export module internals {\n        export interface ScheduledItem<TTime> {\n            scheduler: IScheduler;\n            state: TTime;\n            action: (scheduler: IScheduler, state: any) => IDisposable;\n            dueTime: TTime;\n            comparer: (x: TTime, y: TTime) => number;\n            disposable: SingleAssignmentDisposable;\n\n            invoke(): void;\n            compareTo(other: ScheduledItem<TTime>): number;\n            isCancelled(): boolean;\n            invokeCore(): IDisposable;\n        }\n\n        interface ScheduledItemStatic {\n            new <TTime>(scheduler: IScheduler, state: any, action: (scheduler: IScheduler, state: any) => IDisposable, dueTime: TTime, comparer?: _Comparer<TTime, number>):ScheduledItem<TTime>;\n        }\n\n        export var ScheduledItem: ScheduledItemStatic\n    }\n\n    export module internals {\n        // Priority Queue for Scheduling\n        export interface PriorityQueue<TTime> {\n            length: number;\n\n            isHigherPriority(left: number, right: number): boolean;\n            percolate(index: number): void;\n            heapify(index: number): void;\n            peek(): ScheduledItem<TTime>;\n            removeAt(index: number): void;\n            dequeue(): ScheduledItem<TTime>;\n            enqueue(item: ScheduledItem<TTime>): void;\n            remove(item: ScheduledItem<TTime>): boolean;\n        }\n\n        interface PriorityQueueStatic {\n                new <T>(capacity: number) : PriorityQueue<T>;\n                count: number;\n        }\n\n        export var PriorityQueue : PriorityQueueStatic;\n    }\n\n    /**\n     * Represents a group of disposable resources that are disposed together.\n     * @constructor\n     */\n    export interface CompositeDisposable extends Disposable {\n        /**\n         * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n         * @param {Mixed} item Disposable to add.\n         */\n        add(item: IDisposable): void;\n\n        /**\n         * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n         * @param {Mixed} item Disposable to remove.\n         * @returns {Boolean} true if found; false otherwise.\n         */\n        remove(item: IDisposable): void;\n    }\n\n    interface CompositeDisposableStatic {\n        /**\n         * Represents a group of disposable resources that are disposed together.\n         * @constructor\n         */\n        new (...disposables: Rx.IDisposable[]): CompositeDisposable;\n        /**\n         * Represents a group of disposable resources that are disposed together.\n         * @constructor\n         */\n        new(disposables: Rx.IDisposable[]): CompositeDisposable;\n    }\n\n    export var CompositeDisposable: CompositeDisposableStatic;\n\n    export interface SingleAssignmentDisposable {\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        getDisposable(): IDisposable;\n\n        setDisposable(value: IDisposable): void;\n    }\n\n    interface SingleAssignmentDisposableStatic {\n        new() : SingleAssignmentDisposable;\n    }\n\n    export var SingleAssignmentDisposable : SingleAssignmentDisposableStatic;\n\n    export interface SerialDisposable {\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        getDisposable(): IDisposable;\n\n        setDisposable(value: IDisposable): void;\n    }\n\n    interface SerialDisposableStatic {\n        new() : SerialDisposable;\n    }\n\n    export var SerialDisposable : SerialDisposableStatic;\n\n    /**\n     * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n     */\n    export interface RefCountDisposable extends Disposable {\n\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        /**\n         * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n         * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n         */\n        getDisposable(): IDisposable;\n    }\n\n    interface RefCountDisposableStatic {\n        /**\n         * Initializes a new instance of the RefCountDisposable with the specified disposable.\n         * @constructor\n         * @param {Disposable} disposable Underlying disposable.\n         */\n        new(disposable: IDisposable): RefCountDisposable;\n    }\n\n    export var RefCountDisposable : RefCountDisposableStatic;\n\n    export interface IScheduler {\n        /** Gets the current time according to the local machine's system clock. */\n        now(): number;\n\n        /**\n          * Schedules an action to be executed.\n          * @param state State passed to the action to be executed.\n          * @param {Function} action Action to be executed.\n          * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n          */\n        schedule<TState>(state: TState, action: (scheduler: IScheduler, state: TState) => IDisposable): IDisposable;\n\n        /**\n         * Schedules an action to be executed after dueTime.\n         * @param state State passed to the action to be executed.\n         * @param {Function} action Action to be executed.\n         * @param {Number} dueTime Relative time after which to execute the action.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleFuture<TState>(state: TState, dueTime: number | Date, action: (scheduler: IScheduler, state: TState) => IDisposable): IDisposable;\n    }\n\n    export interface SchedulerStatic {\n        /** Gets the current time according to the local machine's system clock. */\n        now(): number;\n\n        /**\n         * Normalizes the specified TimeSpan value to a positive value.\n         * @param {Number} timeSpan The time span value to normalize.\n         * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n         */\n        normalize(timeSpan: number): number;\n\n        /** Determines whether the given object is a scheduler */\n        isScheduler(s: any): boolean;\n    }\n\n    /** Provides a set of static properties to access commonly used schedulers. */\n    export var Scheduler: SchedulerStatic;\n\n    export interface IScheduler {\n        /**\n         * Schedules an action to be executed recursively.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleRecursive<TState>(state: TState, action: (state: TState, action: (state: TState) => void) => void): IDisposable;\n\n        /**\n         * Schedules an action to be executed recursively after a specified relative due time.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n         * @param {Number}dueTime Relative time after which to execute the action for the first time.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleRecursiveFuture<TState, TTime extends number | Date>(state: TState, dueTime: TTime, action: (state: TState, action: (state: TState, dueTime: TTime) => void) => void): IDisposable;\n    }\n\n    export interface IScheduler {\n        /**\n         * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n         * @param {Mixed} state Initial state passed to the action upon the first iteration.\n         * @param {Number} period Period for running the work periodically.\n         * @param {Function} action Action to be executed, potentially updating the state.\n         * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n         */\n        schedulePeriodic<TState>(state: TState, period: number, action: (state: TState) => TState): IDisposable;\n    }\n\n    export interface IScheduler {\n        /**\n         * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n         * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n         * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n         */\n        catch(handler: Function): IScheduler;\n    }\n\n    export module internals {\n        export interface SchedulePeriodicRecursive {\n            start(): IDisposable;\n        }\n\n        interface SchedulePeriodicRecursiveStatic {\n            new (scheduler: any, state: any, period: any, action: any) : SchedulePeriodicRecursive;\n        }\n\n        export var SchedulePeriodicRecursive: SchedulePeriodicRecursiveStatic;\n    }\n\n    export interface SchedulerStatic {\n        immediate: IScheduler;\n    }\n\n    export interface ICurrentThreadScheduler extends IScheduler {\n        scheduleRequired(): boolean;\n    }\n\n    export interface SchedulerStatic {\n        currentThread: ICurrentThreadScheduler;\n    }\n\n    export interface SchedulerStatic {\n        default: IScheduler;\n        async: IScheduler;\n    }\n\n    /**\n    * Supports push-style iteration over an observable sequence.\n    */\n    export interface IObserver<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n    \n    export interface Observer<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n\n    export interface ObserverStatic {\n        /**\n        *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n        * @param {Function} [onNext] Observer's OnNext action implementation.\n        * @param {Function} [onError] Observer's OnError action implementation.\n        * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n        * @returns {Observer} The observer object implemented using the given actions.\n        */\n        create<T>(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observer<T>;\n    }\n\n    /**\n    * Supports push-style iteration over an observable sequence.\n    */\n    export var Observer: ObserverStatic;\n\n    /**\n     *  Represents a notification to an observer.\n     */\n    export interface Notification<T> {\n        /**\n         * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n         *\n         * @memberOf Notification\n         * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n         * @param {Function} onError Delegate to invoke for an OnError notification.\n         * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n         * @returns {Any} Result produced by the observation.\n         */\n        accept(observer: IObserver<T>): void;\n        /**\n         * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n         *\n         * @memberOf Notification\n         * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n         * @param {Function} onError Delegate to invoke for an OnError notification.\n         * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n         * @returns {Any} Result produced by the observation.\n         */\n        accept<TResult>(onNext: (value: T) => TResult, onError: (exception: any) => TResult, onCompleted: () => TResult): TResult;\n\n        /**\n         * Returns an observable sequence with a single notification.\n         *\n         * @memberOf Notifications\n         * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n         * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n         */\n        toObservable(scheduler?: IScheduler): Observable<T>;\n\n        hasValue: boolean;\n        equals(other: Notification<T>): boolean;\n        kind: string;\n        value: T;\n        error: any;\n    }\n\n    interface NotificationStatic {\n        new <T>(kind: any, value: any, exception: any, accept: any, acceptObservable: any, toString: any) : Notification<T>;\n\n        /**\n        * Creates an object that represents an OnNext notification to an observer.\n        * @param {Any} value The value contained in the notification.\n        * @returns {Notification} The OnNext notification containing the value.\n        */\n        createOnNext<T>(value: T): Notification<T>;\n        /**\n        * Creates an object that represents an OnError notification to an observer.\n        * @param {Any} error The exception contained in the notification.\n        * @returns {Notification} The OnError notification containing the exception.\n        */\n        createOnError<T>(exception: any): Notification<T>;\n        /**\n        * Creates an object that represents an OnCompleted notification to an observer.\n        * @returns {Notification} The OnCompleted notification.\n        */\n        createOnCompleted<T>(): Notification<T>;\n    }\n\n    export var Notification : NotificationStatic;\n\n\texport interface Observer<T> {\n        makeSafe(disposable: IDisposable): Observer<T>;\n\t}\n\n    export module internals {\n        /**\n        * Abstract base class for implementations of the Observer class.\n        * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n        */\n        export interface AbstractObserver<T> extends Rx.IObserver<T>, Rx.IDisposable {\n            /**\n            * Notifies the observer of a new element in the sequence.\n            * @param {Any} value Next element in the sequence.\n            */\n            onNext(value: T): void;\n            /**\n            * Notifies the observer that an exception has occurred.\n            * @param {Any} error The error that has occurred.\n            */\n            onError(exception: any): void;\n            /**\n            * Notifies the observer of the end of the sequence.\n            */\n            onCompleted(): void;\n\n            isStopped: boolean;\n\n            /**\n            * Disposes the observer, causing it to transition to the stopped state.\n            */\n            dispose(): void;\n\n            fail(e: any): boolean;\n\n            // Must be implemented by other observers\n            next(value: T): void;\n            error(error: any): void;\n            completed(): void;\n        }\n\n        interface AbstractObserverStatic {\n            new <T>(): AbstractObserver<T>;\n        }\n\n        export var AbstractObserver: AbstractObserverStatic\n    }\n\n    /**\n     * Class to create an Observer instance from delegate-based implementations of the on* methods.\n     */\n    export interface AnonymousObserver<T> extends Observer<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n\n    interface AnonymousObserverStatic {\n        /**\n         * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n         * @param {Any} onNext Observer's OnNext action implementation.\n         * @param {Any} onError Observer's OnError action implementation.\n         * @param {Any} onCompleted Observer's OnCompleted action implementation.\n         */\n        new <T>(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): AnonymousObserver<T>;\n    }\n\n    export var AnonymousObserver : AnonymousObserverStatic;\n\n    export interface CheckedObserver<T> extends Observer<T> {\n        checkAccess(): void;\n    }\n\n    export module internals {\n        export interface ScheduledObserver<T> extends Observer<T> {\n            ensureActive(): void;\n        }\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n        *\n        *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n        *  that require to be run on a scheduler, use subscribeOn.\n        *\n        *  @param {Scheduler} scheduler Scheduler to notify observers on.\n        *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n        */\n        observeOn(scheduler: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n        *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n        *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n        *  callbacks on a scheduler, use observeOn.\n\n        *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n        *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n        */\n        subscribeOn(scheduler: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Converts a Promise to an Observable sequence\n        * @param {Promise} An ES6 Compliant promise.\n        * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n        */\n \t\tfromPromise<T>(promise: Promise<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /*\n         * Converts an existing observable sequence to an ES6 Compatible Promise\n         * @example\n         * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n         *\n         * // With config\n         * Rx.config.Promise = RSVP.Promise;\n         * var promise = Rx.Observable.return(42).toPromise();\n         * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n         * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n         */\n        toPromise(promiseCtor?: { new (resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): IPromise<T>; }): IPromise<T>;\n        /*\n         * Converts an existing observable sequence to an ES6 Compatible Promise\n         * @example\n         * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n         *\n         * // With config\n         * Rx.config.Promise = RSVP.Promise;\n         * var promise = Rx.Observable.return(42).toPromise();\n         * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n         * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n         */\n        toPromise<TPromise extends IPromise<T>>(promiseCtor: { new (resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): TPromise; }): TPromise;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Creates an array from an observable sequence.\n        * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n        */\n        toArray(): Observable<T[]>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Creates an observable sequence from a specified subscribe method implementation.\n        * @example\n        *  var res = Rx.Observable.create(function (observer) { return function () { } );\n        *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n        *  var res = Rx.Observable.create(function (observer) { } );\n        * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n        * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n        */\n        create<T>(subscribe: (observer: Observer<T>) => IDisposable | Function | void): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n          *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n          *\n          * @example\n          *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n          * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n          * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n          */\n        defer<T>(observableFactory: () => ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n  *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n  *\n  * @example\n  *  var res = Rx.Observable.empty();\n  *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n  * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n  * @returns {Observable} An observable sequence with no elements.\n  */\n        empty<T>(scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * This method creates a new Observable sequence from an array-like or iterable object.\n         * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n         * @param {Function} [mapFn] Map function to call on every element of the array.\n         * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n         * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n         */\n        from<T>(array: ArrayOrIterable<T>): Observable<T>;\n        /**\n         * This method creates a new Observable sequence from an array-like or iterable object.\n         * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n         * @param {Function} [mapFn] Map function to call on every element of the array.\n         * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n         * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n         */\n        from<T, TResult>(array: ArrayOrIterable<T>, mapFn: (value: T, index: number) => TResult, thisArg?: any, scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n         * @deprecated use Observable.from or Observable.of\n         * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n         * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n         */\n        fromArray<T>(array: ArrayLike<T>, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n         *\n         * @example\n         *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n         *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n         * @param {Mixed} initialState Initial state.\n         * @param {Function} condition Condition to terminate generation (upon returning false).\n         * @param {Function} iterate Iteration step function.\n         * @param {Function} resultSelector Selector function for results produced in the sequence.\n         * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n         * @returns {Observable} The generated sequence.\n         */\n        generate<TState, TResult>(initialState: TState, condition: (state: TState) => boolean, iterate: (state: TState) => TState, resultSelector: (state: TState) => TResult, scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n        * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n        */\n        of<T>(...values: T[]): Observable<T>;\n\n        /**\n        *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n        * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n        * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n        */\n        ofWithScheduler<T>(scheduler?: IScheduler, ...values: T[]): Observable<T>;\n    }\n\n    export interface ArrayObserveChange<T> {\n        type: string;\n        object: T[];\n        name?: string;\n        oldValue?: T;\n        index?: number;\n        removed?: T[];\n        added?: number;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Creates an Observable sequence from changes to an array using Array.observe.\n         * @param {Array} array An array to observe changes.\n         * @returns {Observable} An observable sequence containing changes to an array from Array.observe.\n         */\n        ofArrayChanges<T>(obj: T[]): Observable<ArrayObserveChange<T>>;\n    }\n\n    export interface ObjectObserveChange<T> {\n        type: string;\n        object: T;\n        name: string;\n        oldValue?: any;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Creates an Observable sequence from changes to an object using Object.observe.\n         * @param {Object} obj An object to observe changes.\n         * @returns {Observable} An observable sequence containing changes to an object from Object.observe.\n         */\n        ofObjectChanges<T>(obj: T): Observable<ObjectObserveChange<T>>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n        * @returns {Observable} An observable sequence whose observers will never get called.\n        */\n        never<T>(): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Convert an object into an observable sequence of [key, value] pairs.\n        * @param {Object} obj The object to inspect.\n        * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n        * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n        */\n        pairs<T>(obj: { [key: string]: T }, scheduler?: IScheduler): Observable<[string, T]>;\n        /**\n        * Convert an object into an observable sequence of [key, value] pairs.\n        * @param {Object} obj The object to inspect.\n        * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n        * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n        */\n        pairs<T>(obj: { [key: number]: T }, scheduler?: IScheduler): Observable<[number, T]>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n        *\n        * @example\n        *  var res = Rx.Observable.range(0, 10);\n        *  var res = Rx.Observable.range(0, 10, Rx.Scheduler.timeout);\n        * @param {Number} start The value of the first integer in the sequence.\n        * @param {Number} count The number of sequential integers to generate.\n        * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n        * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n        */\n        range(start: number, count: number, scheduler?: IScheduler): Observable<number>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n         *\n         * @example\n         *  var res = Rx.Observable.repeat(42);\n         *  var res = Rx.Observable.repeat(42, 4);\n         *  3 - res = Rx.Observable.repeat(42, 4, Rx.Scheduler.timeout);\n         *  4 - res = Rx.Observable.repeat(42, null, Rx.Scheduler.timeout);\n         * @param {Mixed} value Element to repeat.\n         * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n         * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n         * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n         */\n        repeat<T>(value: T, repeatCount?: number | void, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n        *  There is an alias called 'just' or browsers <IE9.\n        * @param {Mixed} value Single element in the resulting observable sequence.\n        * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} An observable sequence containing the single specified element.\n        */\n        return<T>(value: T, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n        *  There is an alias called 'just' or browsers <IE9.\n        * @param {Mixed} value Single element in the resulting observable sequence.\n        * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} An observable sequence containing the single specified element.\n        */\n        just<T>(value: T, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n        * @param {Mixed} error An object used for the sequence's termination.\n        * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n        */\n        throw<T>(exception: Error, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n        * @param {Mixed} error An object used for the sequence's termination.\n        * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n        */\n        throw<T>(exception: any, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n         * @param {Function} resourceFactory Factory function to obtain a resource object.\n         * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n         * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n         */\n        using<TSource, TResource extends IDisposable>(resourceFactory: () => TResource, observableFactory: (resource: TResource) => Observable<TSource>): Observable<TSource>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @param {Observable} rightSource Second observable sequence or Promise.\n        * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n        */\n        amb(observable: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n        */\n        amb<T>(observables: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n        */\n        amb<T>(...observables: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n        * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n        */\n        catch(handler: (exception: any) => ObservableOrPromise<T>): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n        * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n        */\n        catch(second: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n        * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n        */\n        catch<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n        * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n        */\n        catch<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther, TResult>(sources: ObservableOrPromise<TOther>[], resultSelector: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2>(second: ObservableOrPromise<T2>): Observable<[T, T2]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>): Observable<[T, T2, T3]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>): Observable<[T, T2, T3, T4]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>): Observable<[T, T2, T3, T4, T5]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>): Observable<[T, T2, T3, T4, T5, T6]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>): Observable<[T, T2, T3, T4, T5, T6, T7]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>): Observable<[T, T2, T3, T4, T5, T6, T7, T8]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, T9>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>): Observable<[T, T2, T3, T4, T5, T6, T7, T8, T9]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther>(sources: ObservableOrPromise<TOther>[]): Observable<TOther[]>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, eventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, T9, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther, TResult>(sources: ObservableOrPromise<TOther>[], resultSelector: (...otherValues: TOther[]) => TResult): Observable<TResult>;\n\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>): Observable<[T, T2]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>): Observable<[T, T2, T3]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>): Observable<[T, T2, T3, T4]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>): Observable<[T, T2, T3, T4, T5]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>): Observable<[T, T2, T3, T4, T5, T6]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>): Observable<[T, T2, T3, T4, T5, T6, T7]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>): Observable<[T, T2, T3, T4, T5, T6, T7, T8]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, T9>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>): Observable<[T, T2, T3, T4, T5, T6, T7, T8, T9]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<TOther>(sources: ObservableOrPromise<TOther>[]): Observable<TOther[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat(...sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Concatenates all the observable sequences.\n        * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Concatenates all the observable sequences.\n        * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n          * Concatenates an observable sequence of observable sequences.\n          * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n          */\n        concatAll(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n        * Or merges two observable sequences into a single observable sequence.\n        *\n        * @example\n        * 1 - merged = sources.merge(1);\n        * 2 - merged = source.merge(otherSource);\n        * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        merge(maxConcurrent: number): T;\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n        * Or merges two observable sequences into a single observable sequence.\n        *\n        * @example\n        * 1 - merged = sources.merge(1);\n        * 2 - merged = source.merge(otherSource);\n        * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        merge(other: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(scheduler: IScheduler, ...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(scheduler: IScheduler, sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        mergeAll(): T;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n        * receive all successfully emitted items from all of the source Observables without being interrupted by\n        * an error notification from one of them.\n        *\n        * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n        * error via the Observer's onError, mergeDelayError will refrain from propagating that\n        * error notification until all of the merged Observables have finished emitting items.\n        * @param {Array | Arguments} args Arguments or an array to merge.\n        * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n        */\n        mergeDelayError<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n        * receive all successfully emitted items from all of the source Observables without being interrupted by\n        * an error notification from one of them.\n        *\n        * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n        * error via the Observer's onError, mergeDelayError will refrain from propagating that\n        * error notification until all of the merged Observables have finished emitting items.\n        * @param {Array | Arguments} args Arguments or an array to merge.\n        * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n        */\n        mergeDelayError<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n        * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n        */\n        onErrorResumeNext(second: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        *\n        * @example\n        * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);\n        * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);\n        * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n        */\n        onErrorResumeNext<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        *\n        * @example\n        * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);\n        * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);\n        * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n        */\n        onErrorResumeNext<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n        * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n        * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n        */\n        skipUntil<T2>(other: ObservableOrPromise<T2>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        switch(): T;\n        /**\n        * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        switchLatest(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the values from the source observable sequence until the other observable sequence produces a value.\n        * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n        * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n        */\n        takeUntil<T2>(other: ObservableOrPromise<T2>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<TOther, TResult>(souces: ObservableOrPromise<TOther>[], resultSelector: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, TResult>(sources: ObservableOrPromise<T2>[], resultSelector?: (item1: T1, ...right: T2[]) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, TResult>(source1: ObservableOrPromise<T1>, ObservableOrPromise: Observable<T2>, resultSelector?: (item1: T1, item2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, resultSelector?: (item1: T1, item2: T2, item3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, TResult>(source1: Observable<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, T8, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, source8: ObservableOrPromise<T8>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, source8: ObservableOrPromise<T8>, source9: ObservableOrPromise<T9>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8, item9: T9) => TResult): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector?: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector?: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<TOther, TResult>(souces: ObservableOrPromise<TOther>[], resultSelector?: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n        * @param arguments Observable sources.\n        * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n        */\n        zipIterable<T>(...sources: Observable<T>[]): Observable<T[]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n        * @param arguments Observable sources.\n        * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n        */\n        zipIterable<T>(sources: Observable<T>[]): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n       *  Hides the identity of an observable sequence.\n       * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n       */\n        asObservable(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n        * @param {Number} count Length of each buffer.\n        * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithCount(count: number, skip?: number): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n        * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n        */\n        dematerialize<TOrigin>(): Observable<TOrigin>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.\n        *\n        *  var obs = observable.distinctUntilChanged();\n        *  var obs = observable.distinctUntilChanged(function (x) { return x.id; });\n        *  var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; });\n        *\n        * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value.\n        * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n        * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n        */\n        distinctUntilChanged<TValue>(keySelector?: (value: T) => TValue, comparer?: _Comparer<TValue, boolean>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        do(observer: Observer<T>): Observable<T>;\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tap(observer: Observer<T>): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        do(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observable<T>;\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tap(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onNext Action to invoke for each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnNext(onNext: (value: T) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnError(onError: (exception: any) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon graceful termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnCompleted(onCompleted: () => void, thisArg?: any): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onNext Action to invoke for each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnNext(onNext: (value: T) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnError(onError: (exception: any) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon graceful termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnCompleted(onCompleted: () => void, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n        * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n        * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n        */\n        finally(action: () => void): Observable<T>;\n\n        /**\n        *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n        * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n        * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n        */\n        ensure(action: () => void): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Ignores all elements in an observable sequence leaving only the termination messages.\n        * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n        */\n        ignoreElements(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n        * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n        */\n        materialize(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n         * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n         * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n         */\n        repeat(repeatCount?: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n        *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n        *\n        * @example\n        *  var res = retried = retry.repeat();\n        *  var res = retried = retry.repeat(2);\n        * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n        * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n        */\n        retry(retryCount?: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         *  Repeats the source observable sequence upon error each time the notifier emits or until it successfully terminates.\n         *  if the notifier completes, the observable sequence completes.\n         *\n         * @example\n         *  var timer = Observable.timer(500);\n         *  var source = observable.retryWhen(timer);\n         * @param {Observable} [notifier] An observable that triggers the retries or completes the observable with onNext or onCompleted respectively.\n         * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n         */\n        retryWhen(notifier: (errors: Observable<any>) => Observable<any>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n        *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n        * @example\n        *  var res = source.scan(function (acc, x) { return acc + x; });\n        *  var res = source.scan(function (acc, x) { return acc + x; }, 0);\n        * @param {Function} accumulator An accumulator function to be invoked on each element.\n        * @param {Mixed} [seed] The initial accumulator value.\n        * @returns {Observable} An observable sequence containing the accumulated values.\n        */\n        scan<TAcc>(accumulator: _Accumulator<T, TAcc>, seed?: TAcc): Observable<TAcc>;\n        /**\n        *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n        *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n        * @example\n        *  var res = source.scan(function (acc, x) { return acc + x; });\n        *  var res = source.scan(function (acc, x) { return acc + x; }, 0);\n        * @param {Function} accumulator An accumulator function to be invoked on each element.\n        * @param {Mixed} [seed] The initial accumulator value.\n        * @returns {Observable} An observable sequence containing the accumulated values.\n        */\n        scan(accumulator: _Accumulator<T, T>, seed?: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Bypasses a specified number of elements at the end of an observable sequence.\n        * @description\n        *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n        *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n        * @param count Number of elements to bypass at the end of the source sequence.\n        * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n        */\n        skipLast(count: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n        *  @example\n        *  var res = source.startWith(1, 2, 3);\n        *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n        * @param {Arguments} args The specified values to prepend to the observable sequence\n        * @returns {Observable} The source sequence prepended with the specified values.\n        */\n        startWith(...values: T[]): Observable<T>;\n        /**\n        *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n        *  @example\n        *  var res = source.startWith(1, 2, 3);\n        *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n        * @param {Arguments} args The specified values to prepend to the observable sequence\n        * @returns {Observable} The source sequence prepended with the specified values.\n        */\n        startWith(scheduler: IScheduler, ...values: T[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns a specified number of contiguous elements from the end of an observable sequence.\n        * @description\n        *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n        *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n        * @param {Number} count Number of elements to take from the end of the source sequence.\n        * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n        */\n        takeLast(count: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n        *\n        * @description\n        *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n        *  source sequence, this buffer is produced on the result sequence.\n        * @param {Number} count Number of elements to take from the end of the source sequence.\n        * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n        */\n        takeLastBuffer(count: number): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n        *\n        *  var res = xs.windowWithCount(10);\n        *  var res = xs.windowWithCount(10, 1);\n        * @param {Number} count Length of each window.\n        * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithCount(count: number, skip?: number): Observable<Observable<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        concatMapObserver<T, TResult>(onNext: (value: T, i: number) => ObservableOrPromise<TResult>, onError: (error: any) => ObservableOrPromise<any>, onCompleted: () => ObservableOrPromise<any>, thisArg?: any): Observable<TResult>;\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        selectConcatObserver<T, TResult>(onNext: (value: T, i: number) => ObservableOrPromise<TResult>, onError: (error: any) => ObservableOrPromise<any>, onCompleted: () => ObservableOrPromise<any>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n        *\n        *  var res = obs = xs.defaultIfEmpty();\n        *  2 - obs = xs.defaultIfEmpty(false);\n        *\n        * @memberOf Observable#\n        * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n        * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n        */\n        defaultIfEmpty(defaultValue?: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n        *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n        *\n        * @example\n        *  var res = obs = xs.distinct();\n        *  2 - obs = xs.distinct(function (x) { return x.id; });\n        *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n        * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n        * @param {Function} [comparer]  Used to compare items in the collection.\n        * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n        */\n        distinct<TKey>(keySelector?: (value: T) => TKey, comparer?: _Comparer<TKey, boolean>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Groups the elements of an observable sequence according to a specified key selector function.\n        *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n        *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n        *\n        * @example\n        *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n        *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n        *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n        * @param {Function} keySelector A function to extract the key for each element.\n        * @param {Function} durationSelector A function to signal the expiration of a group.\n        * @returns {Observable}\n        *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n        *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n        *\n        */\n        groupByUntil<TKey, TDuration>(keySelector: (value: T) => TKey, skipElementSelector: boolean, durationSelector: (group: GroupedObservable<TKey, T>) => Observable<TDuration>, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, T>>;\n\n        /**\n        *  Groups the elements of an observable sequence according to a specified key selector function.\n        *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n        *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n        *\n        * @example\n        *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n        *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n        *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n        * @param {Function} keySelector A function to extract the key for each element.\n        * @param {Function} durationSelector A function to signal the expiration of a group.\n        * @returns {Observable}\n        *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n        *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n        *\n        */\n        groupByUntil<TKey, TElement, TDuration>(keySelector: (value: T) => TKey, elementSelector: (value: T) => TElement, durationSelector: (group: GroupedObservable<TKey, TElement>) => Observable<TDuration>, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, TElement>>;\n    }\n\n    export interface Observable<T> {\n        /**\n         *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n         *\n         * @example\n         *  var res = observable.groupBy(function (x) { return x.id; });\n         *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n         *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n         * @param {Function} keySelector A function to extract the key for each element.\n         * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n         * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n         */\n        groupBy<TKey, TElement>(keySelector: (value: T) => TKey, skipElementSelector?: boolean, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, T>>;\n        /**\n         *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n         *\n         * @example\n         *  var res = observable.groupBy(function (x) { return x.id; });\n         *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n         *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n         * @param {Function} keySelector A function to extract the key for each element.\n         * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n         * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n         */\n        groupBy<TKey, TElement>(keySelector: (value: T) => TKey, elementSelector: (value: T) => TElement, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, TElement>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Projects each element of an observable sequence into a new form by incorporating the element's index.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n        */\n        select<TResult>(selector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        * Projects each element of an observable sequence into a new form by incorporating the element's index.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n        */\n        map<TResult>(selector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Retrieves the value of a specified nested property from all elements in\n        * the Observable sequence.\n        * @param {Arguments} arguments The nested properties to pluck.\n        * @returns {Observable} Returns a new Observable sequence of property values.\n        */\n        pluck<TResult>(prop: string): Observable<TResult>;\n        pluck<TResult>(...props: string[]): Observable<TResult>;\n    }\n\n\n    export interface Observable<T> {\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        selectManyObserver<T2, T3, T4>(onNext: (value: T, index: number) => Observable<T2>, onError: (exception: any) => Observable<T3>, onCompleted: () => Observable<T4>, thisArg?: any): Observable<T2 | T3 | T4>;\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        flatMapObserver<T2, T3, T4>(onNext: (value: T, index: number) => Observable<T2>, onError: (exception: any) => Observable<T3>, onCompleted: () => Observable<T4>, thisArg?: any): Observable<T2 | T3 | T4>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n        * @param {Number} count The number of elements to skip before returning the remaining elements.\n        * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n        */\n        skip(count: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n        *  The element's index is used in the logic of the predicate function.\n        *\n        *  var res = source.skipWhile(function (value) { return value < 10; });\n        *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n        */\n        skipWhile(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n        *\n        *  var res = source.take(5);\n        *  var res = source.take(0, Rx.Scheduler.timeout);\n        * @param {Number} count The number of elements to return.\n        * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n        * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n        */\n        take(count: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns elements from an observable sequence as long as a specified condition is true.\n        *  The element's index is used in the logic of the predicate function.\n        * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n        */\n        takeWhile(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n        *\n        * @example\n        *  var res = source.where(function (value) { return value < 10; });\n        *  var res = source.where(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n        */\n        where(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n        /**\n        *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n        *\n        * @example\n        *  var res = source.where(function (value) { return value < 10; });\n        *  var res = source.where(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n        */\n        filter(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n         * For aggregation behavior with incremental intermediate results, see Observable.scan.\n         * @param {Function} accumulator An accumulator function to be invoked on each element.\n         * @param {Any} [seed] The initial accumulator value.\n         * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n         */\n        reduce<TAcc>(accumulator: _Accumulator<T, TAcc>, seed?: TAcc): Observable<TAcc>;\n        /**\n         * Applies an accumulator function over an observable sequence, returning the result of the aggregation as a single element in the result sequence. The specified seed value is used as the initial accumulator value.\n         * For aggregation behavior with incremental intermediate results, see Observable.scan.\n         * @param {Function} accumulator An accumulator function to be invoked on each element.\n         * @param {Any} [seed] The initial accumulator value.\n         * @returns {Observable} An observable sequence containing a single element with the final accumulator value.\n         */\n        reduce(accumulator: _Accumulator<T, T>, seed?: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Determines whether any element of an observable sequence satisfies a condition if present, else if any items are in the sequence.\n        * @param {Function} [predicate] A function to test each element for a condition.\n        * @returns {Observable} An observable sequence containing a single element determining whether any elements in the source sequence pass the test in the specified predicate if given, else if any items are in the sequence.\n        */\n        some(predicate?: _Predicate<T>, thisArg?: any): Observable<boolean>;\t// alias for any\n    }\n\n    export interface Observable<T> {\n        /**\n         * Determines whether an observable sequence is empty.\n         * @returns {Observable} An observable sequence containing a single element determining whether the source sequence is empty.\n         */\n        isEmpty(): Observable<boolean>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Determines whether all elements of an observable sequence satisfy a condition.\n        * @param {Function} [predicate] A function to test each element for a condition.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element determining whether all elements in the source sequence pass the test in the specified predicate.\n        */\n        every(predicate?: _Predicate<T>, thisArg?: any): Observable<boolean>;\t// alias for all\n    }\n\n    export interface Observable<T> {\n        /**\n        * Determines whether an observable sequence includes a specified element with an optional equality comparer.\n        * @param searchElement The value to locate in the source sequence.\n        * @param {Number} [fromIndex] An equality comparer to compare elements.\n        * @returns {Observable} An observable sequence containing a single element determining whether the source sequence includes an element that has the specified value from the given index.\n        */\n        includes(value: T, comparer?: _Comparer<T, boolean>): Observable<boolean>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence containing a value that represents how many elements in the specified observable sequence satisfy a condition if provided, else the count of items.\n        * @example\n        * res = source.count();\n        * res = source.count(function (x) { return x > 3; });\n        * @param {Function} [predicate]A function to test each element for a condition.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element with a number that represents how many elements in the input sequence satisfy the condition in the predicate function if provided, else the count of items in the sequence.\n        */\n        count(predicate?: _Predicate<T>, thisArg?: any): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n        * @param {Any} searchElement Element to locate in the array.\n        * @param {Number} [fromIndex] The index to start the search.  If not specified, defaults to 0.\n        * @returns {Observable} And observable sequence containing the first index at which a given element can be found in the observable sequence, or -1 if it is not present.\n        */\n        indexOf(element: T, fromIndex?: number): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Computes the sum of a sequence of values that are obtained by invoking an optional transform function on each element of the input sequence, else if not specified computes the sum on each item in the sequence.\n        * @param {Function} [selector] A transform function to apply to each element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element with the sum of the values in the source sequence.\n        */\n        sum(keySelector?: _Selector<T, number>, thisArg?: any): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n        * @example\n        * var res = source.minBy(function (x) { return x.value; });\n        * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer] Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n        */\n        minBy<TKey>(keySelector: (item: T) => TKey, comparer: _Comparer<TKey, number>): Observable<T>;\n        /**\n        * Returns the elements in an observable sequence with the minimum key value according to the specified comparer.\n        * @example\n        * var res = source.minBy(function (x) { return x.value; });\n        * var res = source.minBy(function (x) { return x.value; }, function (x, y) { return x - y; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer] Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a minimum key value.\n        */\n        minBy(keySelector: (item: T) => number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the minimum element in an observable sequence according to the optional comparer else a default greater than less than check.\n        * @example\n        * var res = source.min();\n        * var res = source.min(function (x, y) { return x.value - y.value; });\n        * @param {Function} [comparer] Comparer used to compare elements.\n        * @returns {Observable} An observable sequence containing a single element with the minimum element in the source sequence.\n        */\n        min(comparer?: _Comparer<T, number>): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n        * @example\n        * var res = source.maxBy(function (x) { return x.value; });\n        * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer]  Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n        */\n        maxBy<TKey>(keySelector: (item: T) => TKey, comparer: _Comparer<TKey, number>): Observable<T>;\n        /**\n        * Returns the elements in an observable sequence with the maximum  key value according to the specified comparer.\n        * @example\n        * var res = source.maxBy(function (x) { return x.value; });\n        * var res = source.maxBy(function (x) { return x.value; }, function (x, y) { return x - y;; });\n        * @param {Function} keySelector Key selector function.\n        * @param {Function} [comparer]  Comparer used to compare key values.\n        * @returns {Observable} An observable sequence containing a list of zero or more elements that have a maximum key value.\n        */\n        maxBy(keySelector: (item: T) => number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the maximum value in an observable sequence according to the specified comparer.\n        * @example\n        * var res = source.max();\n        * var res = source.max(function (x, y) { return x.value - y.value; });\n        * @param {Function} [comparer] Comparer used to compare elements.\n        * @returns {Observable} An observable sequence containing a single element with the maximum element in the source sequence.\n        */\n        max(comparer?: _Comparer<T, number>): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Computes the average of an observable sequence of values that are in the sequence or obtained by invoking a transform function on each element of the input sequence if present.\n        * @param {Function} [selector] A transform function to apply to each element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence containing a single element with the average of the sequence of values.\n        */\n        average(keySelector?: _Selector<T, number>, thisArg?: any): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n        *\n        * @example\n        * var res = res = source.sequenceEqual([1,2,3]);\n        * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n        * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n        * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n        * @param {Observable} second Second observable sequence or array to compare.\n        * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n        * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n        */\n        sequenceEqual(second: ObservableOrPromise<T> | ArrayOrIterable<T>, comparer?: _Comparer<T, boolean>): Observable<boolean>;\n        /**\n        *  Determines whether two sequences are equal by comparing the elements pairwise using a specified equality comparer.\n        *\n        * @example\n        * var res = res = source.sequenceEqual([1,2,3]);\n        * var res = res = source.sequenceEqual([{ value: 42 }], function (x, y) { return x.value === y.value; });\n        * 3 - res = source.sequenceEqual(Rx.Observable.returnValue(42));\n        * 4 - res = source.sequenceEqual(Rx.Observable.returnValue({ value: 42 }), function (x, y) { return x.value === y.value; });\n        * @param {Observable} second Second observable sequence or array to compare.\n        * @param {Function} [comparer] Comparer used to compare elements of both sequences.\n        * @returns {Observable} An observable sequence that contains a single element which indicates whether both sequences are of equal length and their corresponding elements are equal according to the specified equality comparer.\n        */\n        sequenceEqual<TOther>(second: ObservableOrPromise<T> | ArrayOrIterable<T>, comparer: _Comparer<T | TOther, boolean>): Observable<boolean>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the element at a specified index in a sequence or default value if not found.\n        * @param {Number} index The zero-based index of the element to retrieve.\n        * @param {Any} [defaultValue] The default value to use if elementAt does not find a value.\n        * @returns {Observable} An observable sequence that produces the element at the specified position in the source sequence.\n        */\n        elementAt(index: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the only element of an observable sequence that satisfies the condition in the optional predicate, and reports an exception if there is not exactly one element in the observable sequence.\n        * @param {Function} [predicate] A predicate function to evaluate for elements in the source sequence.\n        * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n        * @returns {Observable} Sequence containing the single element in the observable sequence that satisfies the condition in the predicate.\n        */\n        single(predicate?: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the first element of an observable sequence that satisfies the condition in the predicate if present else the first item in the sequence.\n        * @returns {Observable} Sequence containing the first element in the observable sequence that satisfies the condition in the predicate if provided, else the first item in the sequence.\n        */\n        first(predicate?: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the last element of an observable sequence that satisfies the condition in the predicate if specified, else the last element.\n        * @returns {Observable} Sequence containing the last element in the observable sequence that satisfies the condition in the predicate.\n        */\n        last(predicate?: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Searches for an element that matches the conditions defined by the specified predicate, and returns the first occurrence within the entire Observable sequence.\n        * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n        * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n        * @returns {Observable} An Observable sequence with the first element that matches the conditions defined by the specified predicate, if found; otherwise, undefined.\n        */\n        find(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n          * Searches for an element that matches the conditions defined by the specified predicate, and returns\n          * an Observable sequence with the zero-based index of the first occurrence within the entire Observable sequence.\n          * @param {Function} predicate The predicate that defines the conditions of the element to search for.\n          * @param {Any} [thisArg] Object to use as `this` when executing the predicate.\n          * @returns {Observable} An Observable sequence with the zero-based index of the first occurrence of an element that matches the conditions defined by match, if found; otherwise, –1.\n        */\n        findIndex(predicate: _Predicate<T>, thisArg?: any): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Converts the observable sequence to a Set if it exists.\n         * @returns {Observable} An observable sequence with a single value of a Set containing the values from the observable sequence.\n         */\n        toSet() : Observable< Set<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Converts the observable sequence to a Map if it exists.\n        * @param {Function} keySelector A function which produces the key for the Map.\n        * @param {Function} [elementSelector] An optional function which produces the element for the Map. If not present, defaults to the value from the observable sequence.\n        * @returns {Observable} An observable sequence with a single value of a Map containing the values from the observable sequence.\n        */\n        toMap<TKey>(keySelector: (value: T) => TKey): Observable<Map<TKey, T>>;\n        /**\n        * Converts the observable sequence to a Map if it exists.\n        * @param {Function} keySelector A function which produces the key for the Map.\n        * @param {Function} [elementSelector] An optional function which produces the element for the Map. If not present, defaults to the value from the observable sequence.\n        * @returns {Observable} An observable sequence with a single value of a Map containing the values from the observable sequence.\n        */\n        toMap<TKey, TElement>(keySelector: (value: T) => TKey, elementSelector: (value: T) => TElement): Observable<Map<TKey, TElement>>;\n    }\n\n    export interface ObservableStatic {\n        wrap<T>(fn: Function): Observable<T>;\n        spawn<T>(fn: Function): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.\n        *\n        * @example\n        * var res = Rx.Observable.start(function () { console.log('hello'); });\n        * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout);\n        * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console);\n        *\n        * @param {Function} func Function to run asynchronously.\n        * @param {Scheduler} [scheduler]  Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param [context]  The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n        *\n        * Remarks\n        * * The function is called immediately, not during the subscription of the resulting sequence.\n        * * Multiple subscriptions to the resulting sequence can observe the function's result.\n        */\n        start<T>(func: () => T, scheduler?: IScheduler, context?: any): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<TResult>(func: () => TResult, context?: any, scheduler?: IScheduler): () => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, TResult>(func: (arg1: T1) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1) => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, T2, TResult>(func: (arg1: T1, arg2: T2) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1, arg2: T2) => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, T2, T3, TResult>(func: (arg1: T1, arg2: T2, arg3: T3) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1, arg2: T2, arg3: T3) => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, T2, T3, T4, TResult>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult>(func: Function, context: any, selector: Function): (...args: any[]) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1>(func: (arg1: T1, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2>(func: (arg1: T1, arg2: T2, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3>(func: (arg1: T1, arg2: T2, arg3: T3, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8, T9>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9) => Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult>(func: Function, context?: any, selector?: Function): (...args: any[]) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1>(func: (arg1: T1, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2>(func: (arg1: T1, arg2: T2, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3>(func: (arg1: T1, arg2: T2, arg3: T3, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8, T9>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9) => Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n         * @param {Object} element The DOMElement or NodeList to attach a listener.\n         * @param {String} eventName The event name to attach the observable sequence.\n         * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n         * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n         */\n        fromEvent<T>(element: EventTarget, eventName: string, selector?: (arguments: any[]) => T): Observable<T>;\n        /**\n         * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n         * @param {Object} element The DOMElement or NodeList to attach a listener.\n         * @param {String} eventName The event name to attach the observable sequence.\n         * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n         * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n         */\n        fromEvent<T>(element: { on: (name: string, cb: (e: any) => any) => void; off: (name: string, cb: (e: any) => any) => void }, eventName: string, selector?: (arguments: any[]) => T): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n        * @param {Function} addHandler The function to add a handler to the emitter.\n        * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n        * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n        * @returns {Observable} An observable sequence which wraps an event from an event emitter\n        */\n        fromEventPattern<T>(addHandler: (handler: Function) => void, removeHandler: (handler: Function) => void, selector?: (arguments: any[]) => T): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Invokes the asynchronous function, surfacing the result through an observable sequence.\n        * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n        * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n        */\n        startAsync<T>(functionAsync: () => IPromise<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n         * @example\n         * var pauser = new Rx.Subject();\n         * var source = Rx.Observable.interval(100).pausable(pauser);\n         * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n         * @returns {Observable} The observable sequence which is paused based upon the pauser.\n         */\n        pausable(pauser?: Observable<boolean>): PausableObservable<T>;\n    }\n\n    export interface PausableObservable<T> extends Observable<T> {\n        pause(): void;\n        resume(): void;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n         * and yields the values that were buffered while paused.\n         * @example\n         * var pauser = new Rx.Subject();\n         * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n         * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n         * @returns {Observable} The observable sequence which is paused based upon the pauser.\n         */\n        pausableBuffered(pauser?: Observable<boolean>): PausableObservable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Attaches a controller to the observable sequence with the ability to queue.\n        * @example\n        * var source = Rx.Observable.interval(100).controlled();\n        * source.request(3); // Reads 3 values\n        * @param {bool} enableQueue truthy value to determine if values should be queued pending the next request\n        * @param {Scheduler} scheduler determines how the requests will be scheduled\n        * @returns {Observable} The observable sequence which only propagates values on request.\n        */\n        controlled(enableQueue?: boolean, scheduler?: IScheduler): ControlledObservable<T>;\n    }\n\n    export interface ControlledObservable<T> extends Observable<T> {\n        request(numberOfItems?: number): IDisposable;\n    }\n\n    export interface ControlledObservable<T> {\n        /**\n         * Attaches a stop and wait observable to the current observable.\n         * @returns {Observable} A stop and wait observable.\n         */\n        stopAndWait(): Observable<T>;\n    }\n\n    export interface ControlledObservable<T> {\n        /**\n         * Creates a sliding windowed observable based upon the window size.\n         * @param {Number} windowSize The number of items in the window\n         * @returns {Observable} A windowed observable based upon the window size.\n         */\n        windowed(windowSize: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Pipes the existing Observable sequence into a Node.js Stream.\n        * @param {Stream} dest The destination Node.js stream.\n        * @returns {Stream} The destination stream.\n        */\n        pipe<TDest>(dest: TDest): TDest;\n        // TODO: Add link to node.d.ts some where\n    }\n\n    /**\n     *  Represents an object that is both an observable sequence as well as an observer.\n     *  Each notification is broadcasted to all subscribed observers.\n     */\n    export interface ISubject<T> extends IObservable<T>, IObserver<T>, IDisposable {\n        hasObservers(): boolean;\n    }\n\n    export interface Subject<T> extends Observable<T>, Observer<T>, IDisposable {\n        hasObservers(): boolean;\n        /** Is this value disposed. */\n        isDisposed: boolean;\n    }\n\n    interface SubjectStatic {\n        /**\n         * Creates a subject.\n         */\n        new <T>(): Subject<T>;\n\n        /**\n         * Creates a subject from the specified observer and observable.\n         * @param {Observer} observer The observer used to send messages to the subject.\n         * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n         * @returns {Subject} Subject implemented using the given observer and observable.\n         */\n        create<T>(observer?: IObserver<T>, observable?: IObservable<T>): Subject<T>;\n    }\n\n    /**\n     *  Represents an object that is both an observable sequence as well as an observer.\n     *  Each notification is broadcasted to all subscribed observers.\n     */\n    export var Subject: SubjectStatic;\n\n        export interface ConnectableObservable<T> extends Observable<T> {\n    \t\tconnect(): IDisposable;\n    \t\trefCount(): Observable<T>;\n        }\n\n    export interface Observable<T> {\n        /**\n        * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n        * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n        * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n        *\n        * @example\n        * 1 - res = source.multicast(observable);\n        * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n        *\n        * @param {Function|Subject} subjectOrSubjectSelector\n        * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n        * Or:\n        * Subject to push source elements into.\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        multicast(subject: ISubject<T> | (() => ISubject<T>)): ConnectableObservable<T>;\n        /**\n        * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n        * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n        * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n        *\n        * @example\n        * 1 - res = source.multicast(observable);\n        * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n        *\n        * @param {Function|Subject} subjectOrSubjectSelector\n        * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n        * Or:\n        * Subject to push source elements into.\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        multicast<TResult>(subjectSelector: ISubject<T> | (() => ISubject<T>), selector: (source: ConnectableObservable<T>) => Observable<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of Multicast using a regular Subject.\n        *\n        * @example\n        * var resres = source.publish();\n        * var res = source.publish(function (x) { return x; });\n        *\n        * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publish(): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of Multicast using a regular Subject.\n        *\n        * @example\n        * var resres = source.publish();\n        * var res = source.publish(function (x) { return x; });\n        *\n        * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publish<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        share(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n        * This operator is a specialization of Multicast using a AsyncSubject.\n        *\n        * @example\n        * var res = source.publishLast();\n        * var res = source.publishLast(function (x) { return x; });\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishLast(): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n        * This operator is a specialization of Multicast using a AsyncSubject.\n        *\n        * @example\n        * var res = source.publishLast();\n        * var res = source.publishLast(function (x) { return x; });\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishLast<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n        * This operator is a specialization of Multicast using a BehaviorSubject.\n        *\n        * @example\n        * var res = source.publishValue(42);\n        * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishValue(initialValue: T): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n        * This operator is a specialization of Multicast using a BehaviorSubject.\n        *\n        * @example\n        * var res = source.publishValue(42);\n        * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishValue<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>, initialValue: T): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n        * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        shareValue(initialValue: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of Multicast using a ReplaySubject.\n        *\n        * @example\n        * var res = source.replay(null, 3);\n        * var res = source.replay(null, 3, 500);\n        * var res = source.replay(null, 3, 500, scheduler);\n        * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param windowSize [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        replay(selector?: void, bufferSize?: number, window?: number, scheduler?: IScheduler): ConnectableObservable<T>;\t// hack to catch first omitted parameter\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of Multicast using a ReplaySubject.\n        *\n        * @example\n        * var res = source.replay(null, 3);\n        * var res = source.replay(null, 3, 500);\n        * var res = source.replay(null, 3, 500, scheduler);\n        * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param windowSize [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        replay(selector: (source: ConnectableObservable<T>) => Observable<T>, bufferSize?: number, window?: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        *\n        * @example\n        * var res = source.shareReplay(3);\n        * var res = source.shareReplay(3, 500);\n        * var res = source.shareReplay(3, 500, scheduler);\n        *\n\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param window [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        shareReplay(bufferSize?: number, window?: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence. This observable sequence\n        * can be resubscribed to, even if all prior subscriptions have ended. (unlike `.publish().refCount()`)\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source.\n        */\n        singleInstance(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Correlates the elements of two sequences based on overlapping durations.\n        *\n        *  @param {Observable} right The right observable sequence to join elements for.\n        *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n        *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n        *  @param {Function} resultSelector A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters passed to the function correspond with the elements from the left and right source sequences for which overlap occurs.\n        *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n        */\n        join<TRight, TDurationLeft, TDurationRight, TResult>(\n            right: Observable<TRight>,\n            leftDurationSelector: (leftItem: T) => Observable<TDurationLeft>,\n            rightDurationSelector: (rightItem: TRight) => Observable<TDurationRight>,\n            resultSelector: (leftItem: T, rightItem: TRight) => TResult): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Correlates the elements of two sequences based on overlapping durations, and groups the results.\n        *\n        *  @param {Observable} right The right observable sequence to join elements for.\n        *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n        *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n        *  @param {Function} resultSelector A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. The first parameter passed to the function is an element of the left sequence. The second parameter passed to the function is an observable sequence with elements from the right sequence that overlap with the left sequence's element.\n        *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n        */\n        groupJoin<TRight, TDurationLeft, TDurationRight, TResult>(\n            right: Observable<TRight>,\n            leftDurationSelector: (leftItem: T) => Observable<TDurationLeft>,\n            rightDurationSelector: (rightItem: TRight) => Observable<TDurationRight>,\n            resultSelector: (leftItem: T, rightItem: Observable<TRight>) => TResult): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers.\n        *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        buffer<TBufferOpening>(bufferOpenings: Observable<TBufferOpening>): Observable<T[]>;\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers.\n        *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        buffer<TBufferClosing>(bufferClosingSelector: () => Observable<TBufferClosing>): Observable<T[]>;\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers.\n        *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        buffer<TBufferOpening, TBufferClosing>(bufferOpenings: Observable<TBufferOpening>, bufferClosingSelector: () => Observable<TBufferClosing>): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more windows.\n        *\n        *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        window<TWindowOpening>(windowOpenings: Observable<TWindowOpening>): Observable<Observable<T>>;\n        /**\n        *  Projects each element of an observable sequence into zero or more windows.\n        *\n        *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        window<TWindowClosing>(windowClosingSelector: () => Observable<TWindowClosing>): Observable<Observable<T>>;\n        /**\n        *  Projects each element of an observable sequence into zero or more windows.\n        *\n        *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        window<TWindowOpening, TWindowClosing>(windowOpenings: Observable<TWindowOpening>, windowClosingSelector: () => Observable<TWindowClosing>): Observable<Observable<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Returns a new observable that triggers on the second and subsequent triggerings of the input observable.\n         * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair.\n         * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs.\n         * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array.\n         */\n        pairwise(): Observable<[T, T]>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Returns two observables which partition the observations of the source by the given function.\n         * The first will trigger observations for those values for which the predicate returns true.\n         * The second will trigger observations for those values where the predicate returns false.\n         * The predicate is executed once for each subscribed observer.\n         * Both also propagate all error observations arising from the source and each completes\n         * when the source completes.\n         * @param {Function} predicate\n         *    The function to determine which output Observable will trigger a particular observation.\n         * @returns {Array}\n         *    An array of observables. The first triggers when the predicate returns true,\n         *    and the second triggers when the predicate returns false.\n        */\n        partition(predicate: _Predicate<T>, thisArg?: any): [Observable<T>, Observable<T>];\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions.\n        *  This operator allows for a fluent style of writing queries that use the same sequence multiple times.\n        *\n        * @param {Function} selector Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        let<TResult>(selector: (source: Observable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Determines whether an observable collection contains values.\n        *\n        * @example\n        *  1 - res = Rx.Observable.if(condition, obs1);\n        *  2 - res = Rx.Observable.if(condition, obs1, obs2);\n        *  3 - res = Rx.Observable.if(condition, obs1, scheduler);\n        * @param {Function} condition The condition which determines if the thenSource or elseSource will be run.\n        * @param {Observable} thenSource The observable sequence or Promise that will be run if the condition function returns true.\n        * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the condition function returns false. If this is not provided, it defaults to Rx.Observabe.Empty with the specified scheduler.\n        * @returns {Observable} An observable sequence which is either the thenSource or elseSource.\n        */\n        if<T>(condition: () => boolean, thenSource: ObservableOrPromise<T>, elseSourceOrScheduler?: ObservableOrPromise<T> | IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n        * There is an alias for this method called 'forIn' for browsers <IE9\n        * @param {Array} sources An array of values to turn into an observable sequence.\n        * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n        * @returns {Observable} An observable sequence from the concatenated observable sequences.\n        */\n        for<T, TResult>(sources: T[], resultSelector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n        * There is an alias for this method called 'forIn' for browsers <IE9\n        * @param {Array} sources An array of values to turn into an observable sequence.\n        * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n        * @returns {Observable} An observable sequence from the concatenated observable sequences.\n        */\n        forIn<T, TResult>(sources: T[], resultSelector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Repeats source as long as condition holds emulating a while loop.\n        * There is an alias for this method called 'whileDo' for browsers <IE9\n        *\n        * @param {Function} condition The condition which determines if the source will be repeated.\n        * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n        * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n        */\n        while<T>(condition: () => boolean, source: ObservableOrPromise<T>): Observable<T>;\n        /**\n        *  Repeats source as long as condition holds emulating a while loop.\n        * There is an alias for this method called 'whileDo' for browsers <IE9\n        *\n        * @param {Function} condition The condition which determines if the source will be repeated.\n        * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n        * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n        */\n        whileDo<T>(condition: () => boolean, source: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Repeats source as long as condition holds emulating a do while loop.\n        *\n        * @param {Function} condition The condition which determines if the source will be repeated.\n        * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n        * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n        */\n        doWhile(condition: () => boolean): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Uses selector to determine which source in sources to use.\n        * @param {Function} selector The function which extracts the value for to test in a case statement.\n        * @param {Array} sources A object which has keys which correspond to the case statement labels.\n        * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n        *\n        * @returns {Observable} An observable sequence which is determined by a case statement.\n        */\n        case<T>(selector: () => string, sources: { [key: string]: ObservableOrPromise<T>; }, schedulerOrElseSource?: IScheduler | ObservableOrPromise<T>): Observable<T>;\n        /**\n        *  Uses selector to determine which source in sources to use.\n        * @param {Function} selector The function which extracts the value for to test in a case statement.\n        * @param {Array} sources A object which has keys which correspond to the case statement labels.\n        * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n        *\n        * @returns {Observable} An observable sequence which is determined by a case statement.\n        */\n        case<T>(selector: () => number, sources: { [key: number]: ObservableOrPromise<T>; }, schedulerOrElseSource?: IScheduler | ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Expands an observable sequence by recursively invoking selector.\n        *\n        * @param {Function} selector Selector function to invoke for each produced element, resulting in another sequence to which the selector will be invoked recursively again.\n        * @param {Scheduler} [scheduler] Scheduler on which to perform the expansion. If not provided, this defaults to the current thread scheduler.\n        * @returns {Observable} An observable sequence containing all the elements produced by the recursive expansion.\n        */\n        expand(selector: (item: T) => Observable<T>, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Runs all observable sequences in parallel and collect their last elements.\n        *\n        * @example\n        *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n        *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n        * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n        */\n        forkJoin<T>(sources: ObservableOrPromise<T>[]): Observable<T[]>;\n\n        /**\n        *  Runs all observable sequences in parallel and collect their last elements.\n        *\n        * @example\n        *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n        *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n        * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n        */\n        forkJoin<T>(...args: ObservableOrPromise<T>[]): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Runs two observable sequences in parallel and combines their last elemenets.\n        *\n        * @param {Observable} second Second observable sequence.\n        * @param {Function} resultSelector Result selector function to invoke with the last elements of both sequences.\n        * @returns {Observable} An observable sequence with the result of calling the selector function with the last elements of both input sequences.\n        */\n        forkJoin<TSecond, TResult>(second: ObservableOrPromise<TSecond>, resultSelector: (left: T, right: TSecond) => TResult): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Comonadic bind operator.\n        * @param {Function} selector A transform function to apply to each element.\n        * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n        * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n        */\n        manySelect<TResult>(selector: _Selector<Observable<T>, TResult>, scheduler?: IScheduler): Observable<TResult>;\n        /**\n        * Comonadic bind operator.\n        * @param {Function} selector A transform function to apply to each element.\n        * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n        * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n        */\n        extend<TResult>(selector: _Selector<Observable<T>, TResult>, scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export class Plan<T> { }\n\n    export interface Pattern2<T1, T2> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T3>(other: Observable<T3>): Pattern3<T1, T2, T3>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2) => TR): Plan<TR>;\n    }\n    interface Pattern3<T1, T2, T3> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T4>(other: Observable<T4>): Pattern4<T1, T2, T3, T4>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3) => TR): Plan<TR>;\n    }\n    interface Pattern4<T1, T2, T3, T4> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T5>(other: Observable<T5>): Pattern5<T1, T2, T3, T4, T5>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4) => TR): Plan<TR>;\n    }\n    interface Pattern5<T1, T2, T3, T4, T5> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T6>(other: Observable<T6>): Pattern6<T1, T2, T3, T4, T5, T6>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5) => TR): Plan<TR>;\n    }\n    interface Pattern6<T1, T2, T3, T4, T5, T6> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T7>(other: Observable<T7>): Pattern7<T1, T2, T3, T4, T5, T6, T7>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6) => TR): Plan<TR>;\n    }\n    interface Pattern7<T1, T2, T3, T4, T5, T6, T7> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T8>(other: Observable<T8>): Pattern8<T1, T2, T3, T4, T5, T6, T7, T8>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7) => TR): Plan<TR>;\n    }\n    interface Pattern8<T1, T2, T3, T4, T5, T6, T7, T8> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T9>(other: Observable<T9>): Pattern9<T1, T2, T3, T4, T5, T6, T7, T8, T9>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8) => TR): Plan<TR>;\n    }\n    interface Pattern9<T1, T2, T3, T4, T5, T6, T7, T8, T9> {\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8, item9: T9) => TR): Plan<TR>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Creates a pattern that matches when both observable sequences have an available value.\n        *\n        *  @param right Observable sequence to match with the current sequence.\n        *  @return {Pattern} Pattern object that matches when both observable sequences have an available value.\n        */\n        and<T2>(right: Observable<T2>): Pattern2<T, T2>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Matches when the observable sequence has an available value and projects the value.\n        *\n        *  @param {Function} selector Selector that will be invoked for values in the source sequence.\n        *  @returns {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T) => TR): Plan<TR>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Joins together the results from several patterns.\n        *\n        *  @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns.\n        *  @returns {Observable} Observable sequence with the results form matching several patterns.\n        */\n        when<TR>(plan: Plan<TR>): Observable<TR>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Returns an observable sequence that produces a value after each period.\n         *\n         * @example\n         *  1 - res = Rx.Observable.interval(1000);\n         *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n         *\n         * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n         * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n         * @returns {Observable} An observable sequence that produces a value after each period.\n         */\n        interval(period: number, scheduler?: IScheduler): Observable<number>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n         * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n         * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n         * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n         * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n         */\n        timer(dueTime: number, period: number, scheduler?: IScheduler): Observable<number>;\n        /**\n         *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n         * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n         * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n         * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n         * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n         */\n        timer(dueTime: number, scheduler?: IScheduler): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n        *\n        * @example\n        *  1 - res = Rx.Observable.delay(new Date());\n        *  2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout);\n        *\n        *  3 - res = Rx.Observable.delay(5000);\n        *  4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout);\n        * @memberOf Observable#\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n        * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(dueTime: Date, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n        *\n        * @example\n        *  1 - res = Rx.Observable.delay(new Date());\n        *  2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout);\n        *\n        *  3 - res = Rx.Observable.delay(5000);\n        *  4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout);\n        * @memberOf Observable#\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n        * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(dueTime: number, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Time shifts the observable sequence based on a subscription delay and a delay selector function for each element.\n        *\n        * @example\n        *  1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only\n        *  1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector\n        *\n        * @param {Observable} [subscriptionDelay]  Sequence indicating the delay for the subscription to the source.\n        * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(delayDurationSelector: (item: T) => ObservableOrPromise<number>): Observable<T>;\n\n        /**\n        *  Time shifts the observable sequence based on a subscription delay and a delay selector function for each element.\n        *\n        * @example\n        *  1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only\n        *  1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector\n        *\n        * @param {Observable} [subscriptionDelay]  Sequence indicating the delay for the subscription to the source.\n        * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(subscriptionDelay: Observable<number>, delayDurationSelector: (item: T) => ObservableOrPromise<number>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Ignores values from an observable sequence which are followed by another value before dueTime.\n        * @param {Number} dueTime Duration of the debounce period for each value (specified as an integer denoting milliseconds).\n        * @param {Scheduler} [scheduler]  Scheduler to run the debounce timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The debounced sequence.\n        */\n        debounce(dueTime: number, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        * Ignores values from an observable sequence which are followed by another value within a computed throttle duration.\n        * @param {Function} durationSelector Selector function to retrieve a sequence indicating the throttle duration for each given element.\n        * @returns {Observable} The debounced sequence.\n        */\n        debounce(debounceDurationSelector: (item: T) => ObservableOrPromise<any>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n        * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n        * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithTime(timeSpan: number, timeShift: number, scheduler?: IScheduler): Observable<Observable<T>>;\n        /**\n        *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n        * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n        * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithTime(timeSpan: number, scheduler?: IScheduler): Observable<Observable<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed.\n        * @param {Number} timeSpan Maximum time length of a window.\n        * @param {Number} count Maximum element count of a window.\n        * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithTimeOrCount(timeSpan: number, count: number, scheduler?: IScheduler): Observable<Observable<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n        * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n        * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithTime(timeSpan: number, timeShift: number, scheduler?: IScheduler): Observable<T[]>;\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n        * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n        * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithTime(timeSpan: number, scheduler?: IScheduler): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed.\n        * @param {Number} timeSpan Maximum time length of a buffer.\n        * @param {Number} count Maximum element count of a buffer.\n        * @param {Scheduler} [scheduler]  Scheduler to run bufferin timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithTimeOrCount(timeSpan: number, count: number, scheduler?: IScheduler): Observable<T[]>;\n    }\n\n\texport interface TimeInterval<T> {\n\t\tvalue: T;\n\t\tinterval: number;\n\t}\n\n    export interface Observable<T> {\n        /**\n        *  Records the time interval between consecutive values in an observable sequence.\n        *\n        * @example\n        *  1 - res = source.timeInterval();\n        *  2 - res = source.timeInterval(Rx.Scheduler.timeout);\n        *\n        * @param [scheduler]  Scheduler used to compute time intervals. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence with time interval information on values.\n        */\n        timeInterval(scheduler?: IScheduler): Observable<TimeInterval<T>>;\n    }\n\n    export interface Timestamp<T> {\n        value: T;\n        timestamp: number;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Records the timestamp for each value in an observable sequence.\n        *\n        * @example\n        *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n        *  2 - res = source.timestamp(Rx.Scheduler.default);\n        *\n        * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the default scheduler is used.\n        * @returns {Observable} An observable sequence with timestamp information on values.\n        */\n        timestamp(scheduler?: IScheduler): Observable<Timestamp<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        sample(intervalOrSampler: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        sample<TSample>(sampler: Observable<TSample>, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        throttleLatest(interval: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        throttleLatest<TSample>(sampler: Observable<TSample>, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: Date, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: Date, other?: Observable<T>, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: number, other?: Observable<T>, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(timeoutdurationSelector: (item: T) => Observable<TTimeout>): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @param {Observable} other  Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException().\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(timeoutdurationSelector: (item: T) => Observable<TTimeout>, other: Observable<T>): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Observable} [firstTimeout]  Observable sequence that represents the timeout for the first element. If not provided, this defaults to Observable.never().\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException().\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(firstTimeout: Observable<TTimeout>, timeoutdurationSelector: (item: T) => Observable<TTimeout>, other?: Observable<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n         *\n         * @example\n         *  res = source.generateWithAbsoluteTime(0,\n         *      function (x) { return return true; },\n         *      function (x) { return x + 1; },\n         *      function (x) { return x; },\n         *      function (x) { return new Date(); }\n         *  });\n         *\n         * @param {Mixed} initialState Initial state.\n         * @param {Function} condition Condition to terminate generation (upon returning false).\n         * @param {Function} iterate Iteration step function.\n         * @param {Function} resultSelector Selector function for results produced in the sequence.\n         * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning Date values.\n         * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n         * @returns {Observable} The generated sequence.\n         */\n        generateWithAbsoluteTime<TState, TResult>(\n            initialState: TState,\n            condition: (state: TState) => boolean,\n            iterate: (state: TState) => TState,\n            resultSelector: (state: TState) => TResult,\n            timeSelector: (state: TState) => Date,\n            scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n         *\n         * @example\n         *  res = source.generateWithRelativeTime(0,\n         *      function (x) { return return true; },\n         *      function (x) { return x + 1; },\n         *      function (x) { return x; },\n         *      function (x) { return 500; }\n         *  );\n         *\n         * @param {Mixed} initialState Initial state.\n         * @param {Function} condition Condition to terminate generation (upon returning false).\n         * @param {Function} iterate Iteration step function.\n         * @param {Function} resultSelector Selector function for results produced in the sequence.\n         * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds.\n         * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n         * @returns {Observable} The generated sequence.\n         */\n        generateWithRelativeTime<TState, TResult>(\n            initialState: TState,\n            condition: (state: TState) => boolean,\n            iterate: (state: TState) => TState,\n            resultSelector: (state: TState) => TResult,\n            timeSelector: (state: TState) => number,\n            scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n        *\n        * @example\n        *  1 - res = source.delaySubscription(5000); // 5s\n        *  2 - res = source.delaySubscription(5000, Rx.Scheduler.default); // 5 seconds\n        *\n        * @param {Number} dueTime Relative or absolute time shift of the subscription.\n        * @param {Scheduler} [scheduler]  Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delaySubscription(dueTime: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n        *\n        *  1 - res = source.skipLastWithTime(5000);\n        *  2 - res = source.skipLastWithTime(5000, scheduler);\n        *\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for skipping elements from the end of the sequence.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout\n        * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence.\n        */\n        skipLastWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements.\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for taking elements from the end of the sequence.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence.\n        */\n        takeLastWithTime(duration: number, timerScheduler?: IScheduler, loopScheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for taking elements from the end of the sequence.\n        * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence.\n        */\n        takeLastBufferWithTime(duration: number, scheduler?: IScheduler): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n        *\n        * @example\n        *  1 - res = source.takeWithTime(5000,  [optional scheduler]);\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for taking elements from the start of the sequence.\n        * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence.\n        */\n        takeWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n        *\n        * @example\n        *  1 - res = source.skipWithTime(5000, [optional scheduler]);\n        *\n        * @description\n        *  Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence.\n        *  This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded\n        *  may not execute immediately, despite the zero due time.\n        *\n        *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration.\n        * @param {Number} duration Duration for skipping elements from the start of the sequence.\n        * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence.\n        */\n        skipWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n        *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n        *\n        * @examples\n        *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n        *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n        * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n        */\n        skipUntilWithTime(startTime: Date, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n        *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n        *\n        * @examples\n        *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n        *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n        * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n        */\n        skipUntilWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n        * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n        * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n        */\n        takeUntilWithTime(endTime: Date, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n        * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n        * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n        */\n        takeUntilWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n        * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n        * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n        * @returns {Observable} An Observable that performs the throttle operation.\n        */\n        throttle(windowDuration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Executes a transducer to transform the observable sequence\n         * @param {Transducer} transducer A transducer to execute\n         * @returns {Observable} An Observable sequence containing the results from the transducer.\n         */\n        transduce(transducer: any): any;\n        //TODO: Setup transducer\n    }\n\n    export interface Observable<T> {\n        /**\n        * Performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * Observables that come in between subscriptions will be dropped on the floor.\n        * @returns {Observable} A exclusive observable with only the results that happen when subscribed.\n        */\n        switchFirst(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface VirtualTimeScheduler<TAbsolute, TRelative> extends IScheduler {\n        clock: TAbsolute;\n        /**\n         * Adds a relative time value to an absolute time value.\n         * @param {Number} absolute Absolute virtual time value.\n         * @param {Number} relative Relative virtual time value to add.\n         * @return {Number} Resulting absolute virtual time sum value.\n         */\n        add(from: TAbsolute, by: TRelative): TAbsolute;\n\n        /**\n         * Converts an absolute time to a number\n         * @param {Any} The absolute time.\n         * @returns {Number} The absolute time in ms\n         */\n        toAbsoluteTime(duetime: TAbsolute): number;\n\n        /**\n         * Converts the TimeSpan value to a relative virtual time value.\n         * @param {Number} timeSpan TimeSpan value to convert.\n         * @return {Number} Corresponding relative virtual time value.\n         */\n        toRelativeTime(duetime: number): TRelative;\n\n        /**\n         * Starts the virtual time scheduler.\n         */\n        start(): IDisposable;\n\n        /**\n         * Stops the virtual time scheduler.\n         */\n        stop(): void;\n\n        /**\n         * Advances the scheduler's clock to the specified time, running all work till that point.\n         * @param {Number} time Absolute time to advance the scheduler's clock to.\n         */\n        advanceTo(time: TAbsolute): void;\n\n        /**\n         * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n         * @param {Number} time Relative time to advance the scheduler's clock by.\n         */\n        advanceBy(time: TRelative): void;\n\n        /**\n         * Advances the scheduler's clock by the specified relative time.\n         * @param {Number} time Relative time to advance the scheduler's clock by.\n         */\n        sleep(time: TRelative): void;\n\n        isEnabled: boolean;\n\n        /**\n         * Gets the next scheduled item to be executed.\n         * @returns {ScheduledItem} The next scheduled item.\n         */\n        getNext(): internals.ScheduledItem<TAbsolute>;\n\n        /**\n         * Schedules an action to be executed at dueTime.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Any} dueTime Absolute time at which to execute the action.\n         * @param {Function} action Action to be executed.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleAbsolute(\n            state: any,\n            dueTime: TAbsolute,\n            action: (scheduler: VirtualTimeScheduler<TAbsolute, TRelative>, state: any) => any\n        ): SingleAssignmentDisposable;\n    }\n\n    export var VirtualTimeScheduler: {\n        /**\n         * Creates a new historical scheduler with the specified initial clock value.\n         * @constructor\n         * @param {Any} initialClock Initial value for the clock.\n         * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n         */\n        new <TAbsolute, TRelative>(initialClock: TAbsolute, comparer: _Comparer<TAbsolute, TRelative>): VirtualTimeScheduler<TAbsolute, TRelative>;\n    };\n\n    export interface HistoricalScheduler extends VirtualTimeScheduler<number, number> {\n    }\n\n    export var HistoricalScheduler: {\n        /**\n         * Creates a new historical scheduler with the specified initial clock value.\n         * @constructor\n         * @param {Number} initialClock Initial value for the clock.\n         * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n         */\n        new (initialClock: number, comparer: _Comparer<number, number>): HistoricalScheduler;\n    };\n\n    export interface Subscription {\n        /**\n         * Checks whether the given subscription is equal to the current instance.\n         * @param other Subscription object to check for equality.\n         * @returns {Boolean} true if both objects are equal; false otherwise.\n         */\n        equals(other: Subscription): boolean;\n        /**\n         * Returns a string representation of the current Subscription value.\n         * @returns {String} String representation of the current Subscription value.\n         */\n        toString(): string;\n    }\n\n    interface SubscriptionStatic {\n        /**\n         * Creates a new subscription object with the given virtual subscription and unsubscription time.\n         *\n         * @constructor\n         * @param {Number} subscribe Virtual time at which the subscription occurred.\n         * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n         */\n        new (subscribeAt: number, unsubscribeAt?: number): Subscription;\n    }\n\n    export var Subscription: SubscriptionStatic;\n\n    export interface Recorded {\n        /**\n         * Checks whether the given recorded object is equal to the current instance.\n         *\n         * @param {Recorded} other Recorded object to check for equality.\n         * @returns {Boolean} true if both objects are equal; false otherwise.\n         */\n        equals(other: Recorded): boolean;\n        /**\n         * Returns a string representation of the current Recorded value.\n         *\n         * @returns {String} String representation of the current Recorded value.\n         */\n        toString(): string;\n        time: number;\n        value: any;\n    }\n\n    interface RecordedStatic {\n        /**\n         * Creates a new object recording the production of the specified value at the given virtual time.\n         *\n         * @constructor\n         * @param {Number} time Virtual time the value was produced on.\n         * @param {Mixed} value Value that was produced.\n         * @param {Function} comparer An optional comparer.\n         */\n        new (time: number, value: any, equalityComparer?: _Comparer<any, boolean>): Recorded;\n    }\n\n    export var Recorded: RecordedStatic;\n\n    export var ReactiveTest: {\n        /** Default virtual time used for creation of observable sequences in unit tests. */\n        created: number;\n        /** Default virtual time used to subscribe to observable sequences in unit tests. */\n        subscribed: number;\n        /** Default virtual time used to dispose subscriptions in unit tests. */\n        disposed: number;\n\n        /**\n         * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n         *\n         * 1 - ReactiveTest.onNext(200, 42);\n         * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n         *\n         * @param ticks Recorded virtual time the OnNext notification occurs.\n         * @param value Recorded value stored in the OnNext notification or a predicate.\n         * @return Recorded OnNext notification.\n         */\n        onNext(ticks: number, value: any): Recorded;\n        /**\n         * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n         *\n         * 1 - ReactiveTest.onNext(200, 42);\n         * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n         *\n         * @param ticks Recorded virtual time the OnNext notification occurs.\n         * @param value Recorded value stored in the OnNext notification or a predicate.\n         * @return Recorded OnNext notification.\n         */\n        onNext(ticks: number, predicate: (value: any) => boolean): Recorded;\n        /**\n         * Factory method for an OnError notification record at a given time with a given error.\n         *\n         * 1 - ReactiveTest.onNext(200, new Error('error'));\n         * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n         *\n         * @param ticks Recorded virtual time the OnError notification occurs.\n         * @param exception Recorded exception stored in the OnError notification.\n         * @return Recorded OnError notification.\n         */\n        onError(ticks: number, exception: any): Recorded;\n        /**\n         * Factory method for an OnError notification record at a given time with a given error.\n         *\n         * 1 - ReactiveTest.onNext(200, new Error('error'));\n         * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n         *\n         * @param ticks Recorded virtual time the OnError notification occurs.\n         * @param exception Recorded exception stored in the OnError notification.\n         * @return Recorded OnError notification.\n         */\n        onError(ticks: number, predicate: (exception: any) => boolean): Recorded;\n        /**\n         * Factory method for an OnCompleted notification record at a given time.\n         *\n         * @param ticks Recorded virtual time the OnCompleted notification occurs.\n         * @return Recorded OnCompleted notification.\n         */\n        onCompleted(ticks: number): Recorded;\n\n        /**\n         * Factory method for a subscription record based on a given subscription and disposal time.\n         *\n         * @param start Virtual time indicating when the subscription was created.\n         * @param end Virtual time indicating when the subscription was disposed.\n         * @return Subscription object.\n         */\n        subscribe(subscribeAt: number, unsubscribeAt?: number): Subscription;\n    }\n\n    export interface MockObserver<T> extends Observer<T> {\n        messages: Recorded[];\n    }\n\n    interface MockObserverStatic extends ObserverStatic {\n        new <T>(scheduler: IScheduler): MockObserver<T>;\n    }\n\n    export var MockObserver: MockObserverStatic;\n\n\n    export interface TestScheduler extends VirtualTimeScheduler<number, number> {\n        /**\n         * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n         * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n         * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n         */\n        createColdObservable<T>(...records: Recorded[]): Observable<T>;\n        /**\n         * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n         * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n         * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n         */\n        createHotObservable<T>(...records: Recorded[]): Observable<T>;\n        /**\n         * Creates an observer that records received notification messages and timestamps those.\n         * @return Observer that can be used to assert the timing of received notifications.\n         */\n        createObserver<T>(): MockObserver<T>;\n\n        /**\n         * Creates a resolved promise with the given value and ticks\n         * @param {Number} ticks The absolute time of the resolution.\n         * @param {Any} value The value to yield at the given tick.\n         * @returns {MockPromise} A mock Promise which fulfills with the given value.\n         */\n        createResolvedPromise<T>(ticks: number, value: T): IPromise<T>;\n        /**\n         * Creates a rejected promise with the given reason and ticks\n         * @param {Number} ticks The absolute time of the resolution.\n         * @param {Any} reason The reason for rejection to yield at the given tick.\n         * @returns {MockPromise} A mock Promise which rejects with the given reason.\n         */\n        createRejectedPromise<T>(ticks: number, value: T): IPromise<T>;\n\n        /**\n         * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n         *\n         * @param create Factory method to create an observable sequence.\n         * @param created Virtual time at which to invoke the factory to create an observable sequence.\n         * @param subscribed Virtual time at which to subscribe to the created observable sequence.\n         * @param disposed Virtual time at which to dispose the subscription.\n         * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n         */\n        startWithTiming<T>(create: () => Observable<T>, createdAt: number, subscribedAt: number, disposedAt: number): MockObserver<T>;\n        /**\n         * Starts the test scheduler and uses the specified virtual time to dispose the subscription to the sequence obtained through the factory function.\n         * Default virtual times are used for factory invocation and sequence subscription.\n         *\n         * @param create Factory method to create an observable sequence.\n         * @param disposed Virtual time at which to dispose the subscription.\n         * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n         */\n        startWithDispose<T>(create: () => Observable<T>, disposedAt: number): MockObserver<T>;\n        /**\n         * Starts the test scheduler and uses default virtual times to invoke the factory function, to subscribe to the resulting sequence, and to dispose the subscription.\n         *\n         * @param create Factory method to create an observable sequence.\n         * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n         */\n        startWithCreate<T>(create: () => Observable<T>): MockObserver<T>;\n    }\n\n    export var TestScheduler: {\n        new (): TestScheduler;\n    }\n\n    export interface AnonymousObservable<T> extends Observable<T> { }\n\n    export interface GroupedObservable<TKey, TElement> extends Observable<TElement> {\n        key: TKey;\n        underlyingObservable: Observable<TElement>;\n    }\n\n    export interface AsyncSubject<T> extends Subject<T> { }\n\n    interface AsyncSubjectStatic {\n        /**\n         * Creates a subject that can only receive one value and that value is cached for all future observations.\n         * @constructor\n         */\n        new <T>(): AsyncSubject<T>;\n    }\n\n    /**\n     *  Represents the result of an asynchronous operation.\n     *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n     */\n    export var AsyncSubject: AsyncSubjectStatic;\n\n    export interface BehaviorSubject<T> extends Subject<T> {\n        /**\n         * Gets the current value or throws an exception.\n         * Value is frozen after onCompleted is called.\n         * After onError is called always throws the specified exception.\n         * An exception is always thrown after dispose is called.\n         * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n         */\n        getValue(): T;\n    }\n\n    interface BehaviorSubjectStatic {\n        /**\n         *  Initializes a new instance of the BehaviorSubject class which creates a subject that caches its last value and starts with the specified value.\n         *  @param {Mixed} value Initial value sent to observers when no other value has been received by the subject yet.\n         */\n        new <T>(initialValue: T): BehaviorSubject<T>;\n    }\n\n    /**\n     *  Represents a value that changes over time.\n     *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n     */\n    export var BehaviorSubject: BehaviorSubjectStatic;\n\n    export interface ReplaySubject<T> extends Subject<T> { }\n\n    interface ReplaySubjectStatic {\n        /**\n         *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n         *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n         *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n         *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n         */\n        new <T>(bufferSize?: number, window?: number, scheduler?: IScheduler): ReplaySubject<T>;\n    }\n\n    /**\n    * Represents an object that is both an observable sequence as well as an observer.\n    * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n    */\n    export var ReplaySubject: ReplaySubjectStatic;\n\n    export interface AnonymousSubject<T> extends Subject<T> { }\n\n    interface AnonymousSubjectStatic {\n        /**\n         * Creates a subject that can only receive one value and that value is cached for all future observations.\n         * @constructor\n         */\n        new <T>(): AnonymousSubject<T>;\n    }\n\n    /**\n     *  Represents the result of an asynchronous operation.\n     *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n     */\n    export var AnonymousSubject: AnonymousSubjectStatic;\n\n    /**\n    * Used to pause and resume streams.\n    */\n    export interface Pauser {\n        /**\n         * Pauses the underlying sequence.\n         */\n        pause(): void;\n\n        /**\n        * Resumes the underlying sequence.\n        */\n        resume(): void;\n    }\n\n}\n\ndeclare module \"rx\" { export = Rx; }\ndeclare module \"rx.all\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.async.d.ts",
    "content": "declare module Rx {\n\n    export interface ObservableStatic {\n        wrap<T>(fn: Function): Observable<T>;\n        spawn<T>(fn: Function): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.\n        *\n        * @example\n        * var res = Rx.Observable.start(function () { console.log('hello'); });\n        * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout);\n        * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console);\n        *\n        * @param {Function} func Function to run asynchronously.\n        * @param {Scheduler} [scheduler]  Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param [context]  The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n        *\n        * Remarks\n        * * The function is called immediately, not during the subscription of the resulting sequence.\n        * * Multiple subscriptions to the resulting sequence can observe the function's result.\n        */\n        start<T>(func: () => T, scheduler?: IScheduler, context?: any): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<TResult>(func: () => TResult, context?: any, scheduler?: IScheduler): () => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, TResult>(func: (arg1: T1) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1) => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, T2, TResult>(func: (arg1: T1, arg2: T2) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1, arg2: T2) => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, T2, T3, TResult>(func: (arg1: T1, arg2: T2, arg3: T3) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1, arg2: T2, arg3: T3) => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, T2, T3, T4, TResult>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult>(func: Function, context: any, selector: Function): (...args: any[]) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1>(func: (arg1: T1, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2>(func: (arg1: T1, arg2: T2, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3>(func: (arg1: T1, arg2: T2, arg3: T3, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8, T9>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9) => Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult>(func: Function, context?: any, selector?: Function): (...args: any[]) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1>(func: (arg1: T1, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2>(func: (arg1: T1, arg2: T2, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3>(func: (arg1: T1, arg2: T2, arg3: T3, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8, T9>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9) => Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n         * @param {Object} element The DOMElement or NodeList to attach a listener.\n         * @param {String} eventName The event name to attach the observable sequence.\n         * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n         * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n         */\n        fromEvent<T>(element: EventTarget, eventName: string, selector?: (arguments: any[]) => T): Observable<T>;\n        /**\n         * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n         * @param {Object} element The DOMElement or NodeList to attach a listener.\n         * @param {String} eventName The event name to attach the observable sequence.\n         * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n         * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n         */\n        fromEvent<T>(element: { on: (name: string, cb: (e: any) => any) => void; off: (name: string, cb: (e: any) => any) => void }, eventName: string, selector?: (arguments: any[]) => T): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n        * @param {Function} addHandler The function to add a handler to the emitter.\n        * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n        * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n        * @returns {Observable} An observable sequence which wraps an event from an event emitter\n        */\n        fromEventPattern<T>(addHandler: (handler: Function) => void, removeHandler: (handler: Function) => void, selector?: (arguments: any[]) => T): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Invokes the asynchronous function, surfacing the result through an observable sequence.\n        * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n        * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n        */\n        startAsync<T>(functionAsync: () => IPromise<T>): Observable<T>;\n    }\n\n}\ndeclare module \"rx.async\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.async.es6.d.ts",
    "content": "declare module Rx {\n\n    export interface ObservableStatic {\n        wrap<T>(fn: Function): Observable<T>;\n        spawn<T>(fn: Function): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Invokes the specified function asynchronously on the specified scheduler, surfacing the result through an observable sequence.\n        *\n        * @example\n        * var res = Rx.Observable.start(function () { console.log('hello'); });\n        * var res = Rx.Observable.start(function () { console.log('hello'); }, Rx.Scheduler.timeout);\n        * var res = Rx.Observable.start(function () { this.log('hello'); }, Rx.Scheduler.timeout, console);\n        *\n        * @param {Function} func Function to run asynchronously.\n        * @param {Scheduler} [scheduler]  Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param [context]  The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n        *\n        * Remarks\n        * * The function is called immediately, not during the subscription of the resulting sequence.\n        * * Multiple subscriptions to the resulting sequence can observe the function's result.\n        */\n        start<T>(func: () => T, scheduler?: IScheduler, context?: any): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<TResult>(func: () => TResult, context?: any, scheduler?: IScheduler): () => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, TResult>(func: (arg1: T1) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1) => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, T2, TResult>(func: (arg1: T1, arg2: T2) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1, arg2: T2) => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, T2, T3, TResult>(func: (arg1: T1, arg2: T2, arg3: T3) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1, arg2: T2, arg3: T3) => Observable<TResult>;\n        /**\n        * Converts the function into an asynchronous function. Each invocation of the resulting asynchronous function causes an invocation of the original synchronous function on the specified scheduler.\n        * @param {Function} function Function to convert to an asynchronous function.\n        * @param {Scheduler} [scheduler] Scheduler to run the function on. If not specified, defaults to Scheduler.timeout.\n        * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n        * @returns {Function} Asynchronous function.\n        */\n        toAsync<T1, T2, T3, T4, TResult>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => TResult, context?: any, scheduler?: IScheduler): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult>(func: Function, context: any, selector: Function): (...args: any[]) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1>(func: (arg1: T1, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2>(func: (arg1: T1, arg2: T2, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3>(func: (arg1: T1, arg2: T2, arg3: T3, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8, T9>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9) => Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult>(func: Function, context?: any, selector?: Function): (...args: any[]) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1>(func: (arg1: T1, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2>(func: (arg1: T1, arg2: T2, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3>(func: (arg1: T1, arg2: T2, arg3: T3, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8, T9>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9) => Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n         * @param {Object} element The DOMElement or NodeList to attach a listener.\n         * @param {String} eventName The event name to attach the observable sequence.\n         * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n         * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n         */\n        fromEvent<T>(element: EventTarget, eventName: string, selector?: (arguments: any[]) => T): Observable<T>;\n        /**\n         * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n         * @param {Object} element The DOMElement or NodeList to attach a listener.\n         * @param {String} eventName The event name to attach the observable sequence.\n         * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n         * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n         */\n        fromEvent<T>(element: { on: (name: string, cb: (e: any) => any) => void; off: (name: string, cb: (e: any) => any) => void }, eventName: string, selector?: (arguments: any[]) => T): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n        * @param {Function} addHandler The function to add a handler to the emitter.\n        * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n        * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n        * @returns {Observable} An observable sequence which wraps an event from an event emitter\n        */\n        fromEventPattern<T>(addHandler: (handler: Function) => void, removeHandler: (handler: Function) => void, selector?: (arguments: any[]) => T): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Invokes the asynchronous function, surfacing the result through an observable sequence.\n        * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n        * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n        */\n        startAsync<T>(functionAsync: () => IPromise<T>): Observable<T>;\n    }\n\n}\ndeclare module \"rx.async\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.backpressure.d.ts",
    "content": "declare module Rx {\n\n    /**\n    * Used to pause and resume streams.\n    */\n    export interface Pauser {\n        /**\n         * Pauses the underlying sequence.\n         */\n        pause(): void;\n\n        /**\n        * Resumes the underlying sequence.\n        */\n        resume(): void;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n         * @example\n         * var pauser = new Rx.Subject();\n         * var source = Rx.Observable.interval(100).pausable(pauser);\n         * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n         * @returns {Observable} The observable sequence which is paused based upon the pauser.\n         */\n        pausable(pauser?: Observable<boolean>): PausableObservable<T>;\n    }\n\n    export interface PausableObservable<T> extends Observable<T> {\n        pause(): void;\n        resume(): void;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n         * and yields the values that were buffered while paused.\n         * @example\n         * var pauser = new Rx.Subject();\n         * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n         * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n         * @returns {Observable} The observable sequence which is paused based upon the pauser.\n         */\n        pausableBuffered(pauser?: Observable<boolean>): PausableObservable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Attaches a controller to the observable sequence with the ability to queue.\n        * @example\n        * var source = Rx.Observable.interval(100).controlled();\n        * source.request(3); // Reads 3 values\n        * @param {bool} enableQueue truthy value to determine if values should be queued pending the next request\n        * @param {Scheduler} scheduler determines how the requests will be scheduled\n        * @returns {Observable} The observable sequence which only propagates values on request.\n        */\n        controlled(enableQueue?: boolean, scheduler?: IScheduler): ControlledObservable<T>;\n    }\n\n    export interface ControlledObservable<T> extends Observable<T> {\n        request(numberOfItems?: number): IDisposable;\n    }\n\n    export interface ControlledObservable<T> {\n        /**\n         * Attaches a stop and wait observable to the current observable.\n         * @returns {Observable} A stop and wait observable.\n         */\n        stopAndWait(): Observable<T>;\n    }\n\n    export interface ControlledObservable<T> {\n        /**\n         * Creates a sliding windowed observable based upon the window size.\n         * @param {Number} windowSize The number of items in the window\n         * @returns {Observable} A windowed observable based upon the window size.\n         */\n        windowed(windowSize: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Pipes the existing Observable sequence into a Node.js Stream.\n        * @param {Stream} dest The destination Node.js stream.\n        * @returns {Stream} The destination stream.\n        */\n        pipe<TDest>(dest: TDest): TDest;\n        // TODO: Add link to node.d.ts some where\n    }\n\n}\ndeclare module \"rx.backpressure\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.backpressure.es6.d.ts",
    "content": "declare module Rx {\n\n    /**\n    * Used to pause and resume streams.\n    */\n    export interface Pauser {\n        /**\n         * Pauses the underlying sequence.\n         */\n        pause(): void;\n\n        /**\n        * Resumes the underlying sequence.\n        */\n        resume(): void;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n         * @example\n         * var pauser = new Rx.Subject();\n         * var source = Rx.Observable.interval(100).pausable(pauser);\n         * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n         * @returns {Observable} The observable sequence which is paused based upon the pauser.\n         */\n        pausable(pauser?: Observable<boolean>): PausableObservable<T>;\n    }\n\n    export interface PausableObservable<T> extends Observable<T> {\n        pause(): void;\n        resume(): void;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n         * and yields the values that were buffered while paused.\n         * @example\n         * var pauser = new Rx.Subject();\n         * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n         * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n         * @returns {Observable} The observable sequence which is paused based upon the pauser.\n         */\n        pausableBuffered(pauser?: Observable<boolean>): PausableObservable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Attaches a controller to the observable sequence with the ability to queue.\n        * @example\n        * var source = Rx.Observable.interval(100).controlled();\n        * source.request(3); // Reads 3 values\n        * @param {bool} enableQueue truthy value to determine if values should be queued pending the next request\n        * @param {Scheduler} scheduler determines how the requests will be scheduled\n        * @returns {Observable} The observable sequence which only propagates values on request.\n        */\n        controlled(enableQueue?: boolean, scheduler?: IScheduler): ControlledObservable<T>;\n    }\n\n    export interface ControlledObservable<T> extends Observable<T> {\n        request(numberOfItems?: number): IDisposable;\n    }\n\n    export interface ControlledObservable<T> {\n        /**\n         * Attaches a stop and wait observable to the current observable.\n         * @returns {Observable} A stop and wait observable.\n         */\n        stopAndWait(): Observable<T>;\n    }\n\n    export interface ControlledObservable<T> {\n        /**\n         * Creates a sliding windowed observable based upon the window size.\n         * @param {Number} windowSize The number of items in the window\n         * @returns {Observable} A windowed observable based upon the window size.\n         */\n        windowed(windowSize: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Pipes the existing Observable sequence into a Node.js Stream.\n        * @param {Stream} dest The destination Node.js stream.\n        * @returns {Stream} The destination stream.\n        */\n        pipe<TDest>(dest: TDest): TDest;\n        // TODO: Add link to node.d.ts some where\n    }\n\n}\ndeclare module \"rx.backpressure\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.binding.d.ts",
    "content": "declare module Rx {\n\n        export interface ConnectableObservable<T> extends Observable<T> {\n    \t\tconnect(): IDisposable;\n    \t\trefCount(): Observable<T>;\n        }\n\n    export interface Observable<T> {\n        /**\n        * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n        * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n        * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n        *\n        * @example\n        * 1 - res = source.multicast(observable);\n        * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n        *\n        * @param {Function|Subject} subjectOrSubjectSelector\n        * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n        * Or:\n        * Subject to push source elements into.\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        multicast(subject: ISubject<T> | (() => ISubject<T>)): ConnectableObservable<T>;\n        /**\n        * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n        * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n        * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n        *\n        * @example\n        * 1 - res = source.multicast(observable);\n        * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n        *\n        * @param {Function|Subject} subjectOrSubjectSelector\n        * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n        * Or:\n        * Subject to push source elements into.\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        multicast<TResult>(subjectSelector: ISubject<T> | (() => ISubject<T>), selector: (source: ConnectableObservable<T>) => Observable<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of Multicast using a regular Subject.\n        *\n        * @example\n        * var resres = source.publish();\n        * var res = source.publish(function (x) { return x; });\n        *\n        * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publish(): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of Multicast using a regular Subject.\n        *\n        * @example\n        * var resres = source.publish();\n        * var res = source.publish(function (x) { return x; });\n        *\n        * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publish<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        share(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n        * This operator is a specialization of Multicast using a AsyncSubject.\n        *\n        * @example\n        * var res = source.publishLast();\n        * var res = source.publishLast(function (x) { return x; });\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishLast(): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n        * This operator is a specialization of Multicast using a AsyncSubject.\n        *\n        * @example\n        * var res = source.publishLast();\n        * var res = source.publishLast(function (x) { return x; });\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishLast<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n        * This operator is a specialization of Multicast using a BehaviorSubject.\n        *\n        * @example\n        * var res = source.publishValue(42);\n        * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishValue(initialValue: T): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n        * This operator is a specialization of Multicast using a BehaviorSubject.\n        *\n        * @example\n        * var res = source.publishValue(42);\n        * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishValue<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>, initialValue: T): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n        * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        shareValue(initialValue: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of Multicast using a ReplaySubject.\n        *\n        * @example\n        * var res = source.replay(null, 3);\n        * var res = source.replay(null, 3, 500);\n        * var res = source.replay(null, 3, 500, scheduler);\n        * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param windowSize [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        replay(selector?: void, bufferSize?: number, window?: number, scheduler?: IScheduler): ConnectableObservable<T>;\t// hack to catch first omitted parameter\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of Multicast using a ReplaySubject.\n        *\n        * @example\n        * var res = source.replay(null, 3);\n        * var res = source.replay(null, 3, 500);\n        * var res = source.replay(null, 3, 500, scheduler);\n        * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param windowSize [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        replay(selector: (source: ConnectableObservable<T>) => Observable<T>, bufferSize?: number, window?: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        *\n        * @example\n        * var res = source.shareReplay(3);\n        * var res = source.shareReplay(3, 500);\n        * var res = source.shareReplay(3, 500, scheduler);\n        *\n\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param window [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        shareReplay(bufferSize?: number, window?: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface BehaviorSubject<T> extends Subject<T> {\n        /**\n         * Gets the current value or throws an exception.\n         * Value is frozen after onCompleted is called.\n         * After onError is called always throws the specified exception.\n         * An exception is always thrown after dispose is called.\n         * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n         */\n        getValue(): T;\n    }\n\n    interface BehaviorSubjectStatic {\n        /**\n         *  Initializes a new instance of the BehaviorSubject class which creates a subject that caches its last value and starts with the specified value.\n         *  @param {Mixed} value Initial value sent to observers when no other value has been received by the subject yet.\n         */\n        new <T>(initialValue: T): BehaviorSubject<T>;\n    }\n\n    /**\n     *  Represents a value that changes over time.\n     *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n     */\n    export var BehaviorSubject: BehaviorSubjectStatic;\n\n    export interface ReplaySubject<T> extends Subject<T> { }\n\n    interface ReplaySubjectStatic {\n        /**\n         *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n         *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n         *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n         *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n         */\n        new <T>(bufferSize?: number, window?: number, scheduler?: IScheduler): ReplaySubject<T>;\n    }\n\n    /**\n    * Represents an object that is both an observable sequence as well as an observer.\n    * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n    */\n    export var ReplaySubject: ReplaySubjectStatic;\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence. This observable sequence\n        * can be resubscribed to, even if all prior subscriptions have ended. (unlike `.publish().refCount()`)\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source.\n        */\n        singleInstance(): Observable<T>;\n    }\n\n}\ndeclare module \"rx.binding\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.binding.es6.d.ts",
    "content": "declare module Rx {\n\n        export interface ConnectableObservable<T> extends Observable<T> {\n    \t\tconnect(): IDisposable;\n    \t\trefCount(): Observable<T>;\n        }\n\n    export interface Observable<T> {\n        /**\n        * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n        * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n        * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n        *\n        * @example\n        * 1 - res = source.multicast(observable);\n        * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n        *\n        * @param {Function|Subject} subjectOrSubjectSelector\n        * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n        * Or:\n        * Subject to push source elements into.\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        multicast(subject: ISubject<T> | (() => ISubject<T>)): ConnectableObservable<T>;\n        /**\n        * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n        * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n        * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n        *\n        * @example\n        * 1 - res = source.multicast(observable);\n        * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n        *\n        * @param {Function|Subject} subjectOrSubjectSelector\n        * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n        * Or:\n        * Subject to push source elements into.\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        multicast<TResult>(subjectSelector: ISubject<T> | (() => ISubject<T>), selector: (source: ConnectableObservable<T>) => Observable<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of Multicast using a regular Subject.\n        *\n        * @example\n        * var resres = source.publish();\n        * var res = source.publish(function (x) { return x; });\n        *\n        * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publish(): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of Multicast using a regular Subject.\n        *\n        * @example\n        * var resres = source.publish();\n        * var res = source.publish(function (x) { return x; });\n        *\n        * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publish<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        share(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n        * This operator is a specialization of Multicast using a AsyncSubject.\n        *\n        * @example\n        * var res = source.publishLast();\n        * var res = source.publishLast(function (x) { return x; });\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishLast(): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n        * This operator is a specialization of Multicast using a AsyncSubject.\n        *\n        * @example\n        * var res = source.publishLast();\n        * var res = source.publishLast(function (x) { return x; });\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishLast<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n        * This operator is a specialization of Multicast using a BehaviorSubject.\n        *\n        * @example\n        * var res = source.publishValue(42);\n        * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishValue(initialValue: T): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n        * This operator is a specialization of Multicast using a BehaviorSubject.\n        *\n        * @example\n        * var res = source.publishValue(42);\n        * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishValue<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>, initialValue: T): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n        * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        shareValue(initialValue: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of Multicast using a ReplaySubject.\n        *\n        * @example\n        * var res = source.replay(null, 3);\n        * var res = source.replay(null, 3, 500);\n        * var res = source.replay(null, 3, 500, scheduler);\n        * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param windowSize [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        replay(selector?: void, bufferSize?: number, window?: number, scheduler?: IScheduler): ConnectableObservable<T>;\t// hack to catch first omitted parameter\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of Multicast using a ReplaySubject.\n        *\n        * @example\n        * var res = source.replay(null, 3);\n        * var res = source.replay(null, 3, 500);\n        * var res = source.replay(null, 3, 500, scheduler);\n        * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param windowSize [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        replay(selector: (source: ConnectableObservable<T>) => Observable<T>, bufferSize?: number, window?: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        *\n        * @example\n        * var res = source.shareReplay(3);\n        * var res = source.shareReplay(3, 500);\n        * var res = source.shareReplay(3, 500, scheduler);\n        *\n\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param window [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        shareReplay(bufferSize?: number, window?: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface BehaviorSubject<T> extends Subject<T> {\n        /**\n         * Gets the current value or throws an exception.\n         * Value is frozen after onCompleted is called.\n         * After onError is called always throws the specified exception.\n         * An exception is always thrown after dispose is called.\n         * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n         */\n        getValue(): T;\n    }\n\n    interface BehaviorSubjectStatic {\n        /**\n         *  Initializes a new instance of the BehaviorSubject class which creates a subject that caches its last value and starts with the specified value.\n         *  @param {Mixed} value Initial value sent to observers when no other value has been received by the subject yet.\n         */\n        new <T>(initialValue: T): BehaviorSubject<T>;\n    }\n\n    /**\n     *  Represents a value that changes over time.\n     *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n     */\n    export var BehaviorSubject: BehaviorSubjectStatic;\n\n    export interface ReplaySubject<T> extends Subject<T> { }\n\n    interface ReplaySubjectStatic {\n        /**\n         *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n         *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n         *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n         *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n         */\n        new <T>(bufferSize?: number, window?: number, scheduler?: IScheduler): ReplaySubject<T>;\n    }\n\n    /**\n    * Represents an object that is both an observable sequence as well as an observer.\n    * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n    */\n    export var ReplaySubject: ReplaySubjectStatic;\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence. This observable sequence\n        * can be resubscribed to, even if all prior subscriptions have ended. (unlike `.publish().refCount()`)\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source.\n        */\n        singleInstance(): Observable<T>;\n    }\n\n}\ndeclare module \"rx.binding\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.coincidence.d.ts",
    "content": "declare module Rx {\n\n    export interface Observable<T> {\n        /**\n        *  Correlates the elements of two sequences based on overlapping durations.\n        *\n        *  @param {Observable} right The right observable sequence to join elements for.\n        *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n        *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n        *  @param {Function} resultSelector A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters passed to the function correspond with the elements from the left and right source sequences for which overlap occurs.\n        *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n        */\n        join<TRight, TDurationLeft, TDurationRight, TResult>(\n            right: Observable<TRight>,\n            leftDurationSelector: (leftItem: T) => Observable<TDurationLeft>,\n            rightDurationSelector: (rightItem: TRight) => Observable<TDurationRight>,\n            resultSelector: (leftItem: T, rightItem: TRight) => TResult): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Groups the elements of an observable sequence according to a specified key selector function.\n        *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n        *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n        *\n        * @example\n        *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n        *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n        *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n        * @param {Function} keySelector A function to extract the key for each element.\n        * @param {Function} durationSelector A function to signal the expiration of a group.\n        * @returns {Observable}\n        *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n        *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n        *\n        */\n        groupByUntil<TKey, TDuration>(keySelector: (value: T) => TKey, skipElementSelector: boolean, durationSelector: (group: GroupedObservable<TKey, T>) => Observable<TDuration>, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, T>>;\n\n        /**\n        *  Groups the elements of an observable sequence according to a specified key selector function.\n        *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n        *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n        *\n        * @example\n        *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n        *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n        *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n        * @param {Function} keySelector A function to extract the key for each element.\n        * @param {Function} durationSelector A function to signal the expiration of a group.\n        * @returns {Observable}\n        *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n        *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n        *\n        */\n        groupByUntil<TKey, TElement, TDuration>(keySelector: (value: T) => TKey, elementSelector: (value: T) => TElement, durationSelector: (group: GroupedObservable<TKey, TElement>) => Observable<TDuration>, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, TElement>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Correlates the elements of two sequences based on overlapping durations, and groups the results.\n        *\n        *  @param {Observable} right The right observable sequence to join elements for.\n        *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n        *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n        *  @param {Function} resultSelector A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. The first parameter passed to the function is an element of the left sequence. The second parameter passed to the function is an observable sequence with elements from the right sequence that overlap with the left sequence's element.\n        *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n        */\n        groupJoin<TRight, TDurationLeft, TDurationRight, TResult>(\n            right: Observable<TRight>,\n            leftDurationSelector: (leftItem: T) => Observable<TDurationLeft>,\n            rightDurationSelector: (rightItem: TRight) => Observable<TDurationRight>,\n            resultSelector: (leftItem: T, rightItem: Observable<TRight>) => TResult): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers.\n        *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        buffer<TBufferOpening>(bufferOpenings: Observable<TBufferOpening>): Observable<T[]>;\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers.\n        *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        buffer<TBufferClosing>(bufferClosingSelector: () => Observable<TBufferClosing>): Observable<T[]>;\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers.\n        *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        buffer<TBufferOpening, TBufferClosing>(bufferOpenings: Observable<TBufferOpening>, bufferClosingSelector: () => Observable<TBufferClosing>): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more windows.\n        *\n        *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        window<TWindowOpening>(windowOpenings: Observable<TWindowOpening>): Observable<Observable<T>>;\n        /**\n        *  Projects each element of an observable sequence into zero or more windows.\n        *\n        *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        window<TWindowClosing>(windowClosingSelector: () => Observable<TWindowClosing>): Observable<Observable<T>>;\n        /**\n        *  Projects each element of an observable sequence into zero or more windows.\n        *\n        *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        window<TWindowOpening, TWindowClosing>(windowOpenings: Observable<TWindowOpening>, windowClosingSelector: () => Observable<TWindowClosing>): Observable<Observable<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Returns a new observable that triggers on the second and subsequent triggerings of the input observable.\n         * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair.\n         * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs.\n         * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array.\n         */\n        pairwise(): Observable<[T, T]>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Returns two observables which partition the observations of the source by the given function.\n         * The first will trigger observations for those values for which the predicate returns true.\n         * The second will trigger observations for those values where the predicate returns false.\n         * The predicate is executed once for each subscribed observer.\n         * Both also propagate all error observations arising from the source and each completes\n         * when the source completes.\n         * @param {Function} predicate\n         *    The function to determine which output Observable will trigger a particular observation.\n         * @returns {Array}\n         *    An array of observables. The first triggers when the predicate returns true,\n         *    and the second triggers when the predicate returns false.\n        */\n        partition(predicate: _Predicate<T>, thisArg?: any): [Observable<T>, Observable<T>];\n    }\n\n    export interface Observable<T> {\n        /**\n         *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n         *\n         * @example\n         *  var res = observable.groupBy(function (x) { return x.id; });\n         *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n         *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n         * @param {Function} keySelector A function to extract the key for each element.\n         * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n         * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n         */\n        groupBy<TKey, TElement>(keySelector: (value: T) => TKey, skipElementSelector?: boolean, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, T>>;\n        /**\n         *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n         *\n         * @example\n         *  var res = observable.groupBy(function (x) { return x.id; });\n         *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n         *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n         * @param {Function} keySelector A function to extract the key for each element.\n         * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n         * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n         */\n        groupBy<TKey, TElement>(keySelector: (value: T) => TKey, elementSelector: (value: T) => TElement, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, TElement>>;\n    }\n\n    export interface GroupedObservable<TKey, TElement> extends Observable<TElement> {\n        key: TKey;\n        underlyingObservable: Observable<TElement>;\n    }\n\n}\ndeclare module \"rx.coincidence\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.coincidence.es6.d.ts",
    "content": "declare module Rx {\n\n    export interface Observable<T> {\n        /**\n        *  Correlates the elements of two sequences based on overlapping durations.\n        *\n        *  @param {Observable} right The right observable sequence to join elements for.\n        *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n        *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n        *  @param {Function} resultSelector A function invoked to compute a result element for any two overlapping elements of the left and right observable sequences. The parameters passed to the function correspond with the elements from the left and right source sequences for which overlap occurs.\n        *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n        */\n        join<TRight, TDurationLeft, TDurationRight, TResult>(\n            right: Observable<TRight>,\n            leftDurationSelector: (leftItem: T) => Observable<TDurationLeft>,\n            rightDurationSelector: (rightItem: TRight) => Observable<TDurationRight>,\n            resultSelector: (leftItem: T, rightItem: TRight) => TResult): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Groups the elements of an observable sequence according to a specified key selector function.\n        *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n        *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n        *\n        * @example\n        *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n        *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n        *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n        * @param {Function} keySelector A function to extract the key for each element.\n        * @param {Function} durationSelector A function to signal the expiration of a group.\n        * @returns {Observable}\n        *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n        *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n        *\n        */\n        groupByUntil<TKey, TDuration>(keySelector: (value: T) => TKey, skipElementSelector: boolean, durationSelector: (group: GroupedObservable<TKey, T>) => Observable<TDuration>, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, T>>;\n\n        /**\n        *  Groups the elements of an observable sequence according to a specified key selector function.\n        *  A duration selector function is used to control the lifetime of groups. When a group expires, it receives an OnCompleted notification. When a new element with the same\n        *  key value as a reclaimed group occurs, the group will be reborn with a new lifetime request.\n        *\n        * @example\n        *  var res = observable.groupByUntil(function (x) { return x.id; }, null,  function () { return Rx.Observable.never(); });\n        *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); });\n        *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; },  function () { return Rx.Observable.never(); }, function (x) { return x.toString(); });\n        * @param {Function} keySelector A function to extract the key for each element.\n        * @param {Function} durationSelector A function to signal the expiration of a group.\n        * @returns {Observable}\n        *  A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n        *  If a group's lifetime expires, a new group with the same key value can be created once an element with such a key value is encoutered.\n        *\n        */\n        groupByUntil<TKey, TElement, TDuration>(keySelector: (value: T) => TKey, elementSelector: (value: T) => TElement, durationSelector: (group: GroupedObservable<TKey, TElement>) => Observable<TDuration>, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, TElement>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Correlates the elements of two sequences based on overlapping durations, and groups the results.\n        *\n        *  @param {Observable} right The right observable sequence to join elements for.\n        *  @param {Function} leftDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the left observable sequence, used to determine overlap.\n        *  @param {Function} rightDurationSelector A function to select the duration (expressed as an observable sequence) of each element of the right observable sequence, used to determine overlap.\n        *  @param {Function} resultSelector A function invoked to compute a result element for any element of the left sequence with overlapping elements from the right observable sequence. The first parameter passed to the function is an element of the left sequence. The second parameter passed to the function is an observable sequence with elements from the right sequence that overlap with the left sequence's element.\n        *  @returns {Observable} An observable sequence that contains result elements computed from source elements that have an overlapping duration.\n        */\n        groupJoin<TRight, TDurationLeft, TDurationRight, TResult>(\n            right: Observable<TRight>,\n            leftDurationSelector: (leftItem: T) => Observable<TDurationLeft>,\n            rightDurationSelector: (rightItem: TRight) => Observable<TDurationRight>,\n            resultSelector: (leftItem: T, rightItem: Observable<TRight>) => TResult): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers.\n        *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        buffer<TBufferOpening>(bufferOpenings: Observable<TBufferOpening>): Observable<T[]>;\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers.\n        *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        buffer<TBufferClosing>(bufferClosingSelector: () => Observable<TBufferClosing>): Observable<T[]>;\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers.\n        *  @param {Mixed} bufferOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [bufferClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        buffer<TBufferOpening, TBufferClosing>(bufferOpenings: Observable<TBufferOpening>, bufferClosingSelector: () => Observable<TBufferClosing>): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more windows.\n        *\n        *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        window<TWindowOpening>(windowOpenings: Observable<TWindowOpening>): Observable<Observable<T>>;\n        /**\n        *  Projects each element of an observable sequence into zero or more windows.\n        *\n        *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        window<TWindowClosing>(windowClosingSelector: () => Observable<TWindowClosing>): Observable<Observable<T>>;\n        /**\n        *  Projects each element of an observable sequence into zero or more windows.\n        *\n        *  @param {Mixed} windowOpeningsOrClosingSelector Observable sequence whose elements denote the creation of new windows, or, a function invoked to define the boundaries of the produced windows (a new window is started when the previous one is closed, resulting in non-overlapping windows).\n        *  @param {Function} [windowClosingSelector] A function invoked to define the closing of each produced window. If a closing selector function is specified for the first parameter, this parameter is ignored.\n        *  @returns {Observable} An observable sequence of windows.\n        */\n        window<TWindowOpening, TWindowClosing>(windowOpenings: Observable<TWindowOpening>, windowClosingSelector: () => Observable<TWindowClosing>): Observable<Observable<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Returns a new observable that triggers on the second and subsequent triggerings of the input observable.\n         * The Nth triggering of the input observable passes the arguments from the N-1th and Nth triggering as a pair.\n         * The argument passed to the N-1th triggering is held in hidden internal state until the Nth triggering occurs.\n         * @returns {Observable} An observable that triggers on successive pairs of observations from the input observable as an array.\n         */\n        pairwise(): Observable<[T, T]>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Returns two observables which partition the observations of the source by the given function.\n         * The first will trigger observations for those values for which the predicate returns true.\n         * The second will trigger observations for those values where the predicate returns false.\n         * The predicate is executed once for each subscribed observer.\n         * Both also propagate all error observations arising from the source and each completes\n         * when the source completes.\n         * @param {Function} predicate\n         *    The function to determine which output Observable will trigger a particular observation.\n         * @returns {Array}\n         *    An array of observables. The first triggers when the predicate returns true,\n         *    and the second triggers when the predicate returns false.\n        */\n        partition(predicate: _Predicate<T>, thisArg?: any): [Observable<T>, Observable<T>];\n    }\n\n    export interface Observable<T> {\n        /**\n         *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n         *\n         * @example\n         *  var res = observable.groupBy(function (x) { return x.id; });\n         *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n         *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n         * @param {Function} keySelector A function to extract the key for each element.\n         * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n         * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n         */\n        groupBy<TKey, TElement>(keySelector: (value: T) => TKey, skipElementSelector?: boolean, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, T>>;\n        /**\n         *  Groups the elements of an observable sequence according to a specified key selector function and comparer and selects the resulting elements by using a specified function.\n         *\n         * @example\n         *  var res = observable.groupBy(function (x) { return x.id; });\n         *  2 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; });\n         *  3 - observable.groupBy(function (x) { return x.id; }), function (x) { return x.name; }, function (x) { return x.toString(); });\n         * @param {Function} keySelector A function to extract the key for each element.\n         * @param {Function} [elementSelector]  A function to map each source element to an element in an observable group.\n         * @returns {Observable} A sequence of observable groups, each of which corresponds to a unique key value, containing all elements that share that same key value.\n         */\n        groupBy<TKey, TElement>(keySelector: (value: T) => TKey, elementSelector: (value: T) => TElement, keySerializer?: (key: TKey) => string): Observable<GroupedObservable<TKey, TElement>>;\n    }\n\n    export interface GroupedObservable<TKey, TElement> extends Observable<TElement> {\n        key: TKey;\n        underlyingObservable: Observable<TElement>;\n    }\n\n}\ndeclare module \"rx.coincidence\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.core.binding.d.ts",
    "content": "declare module Rx {\n\n        export interface ConnectableObservable<T> extends Observable<T> {\n    \t\tconnect(): IDisposable;\n    \t\trefCount(): Observable<T>;\n        }\n\n    export interface Observable<T> {\n        /**\n        * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n        * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n        * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n        *\n        * @example\n        * 1 - res = source.multicast(observable);\n        * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n        *\n        * @param {Function|Subject} subjectOrSubjectSelector\n        * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n        * Or:\n        * Subject to push source elements into.\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        multicast(subject: ISubject<T> | (() => ISubject<T>)): ConnectableObservable<T>;\n        /**\n        * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n        * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n        * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n        *\n        * @example\n        * 1 - res = source.multicast(observable);\n        * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n        *\n        * @param {Function|Subject} subjectOrSubjectSelector\n        * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n        * Or:\n        * Subject to push source elements into.\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        multicast<TResult>(subjectSelector: ISubject<T> | (() => ISubject<T>), selector: (source: ConnectableObservable<T>) => Observable<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of Multicast using a regular Subject.\n        *\n        * @example\n        * var resres = source.publish();\n        * var res = source.publish(function (x) { return x; });\n        *\n        * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publish(): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of Multicast using a regular Subject.\n        *\n        * @example\n        * var resres = source.publish();\n        * var res = source.publish(function (x) { return x; });\n        *\n        * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publish<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        share(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n        * This operator is a specialization of Multicast using a AsyncSubject.\n        *\n        * @example\n        * var res = source.publishLast();\n        * var res = source.publishLast(function (x) { return x; });\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishLast(): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n        * This operator is a specialization of Multicast using a AsyncSubject.\n        *\n        * @example\n        * var res = source.publishLast();\n        * var res = source.publishLast(function (x) { return x; });\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishLast<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n        * This operator is a specialization of Multicast using a BehaviorSubject.\n        *\n        * @example\n        * var res = source.publishValue(42);\n        * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishValue(initialValue: T): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n        * This operator is a specialization of Multicast using a BehaviorSubject.\n        *\n        * @example\n        * var res = source.publishValue(42);\n        * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishValue<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>, initialValue: T): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n        * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        shareValue(initialValue: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of Multicast using a ReplaySubject.\n        *\n        * @example\n        * var res = source.replay(null, 3);\n        * var res = source.replay(null, 3, 500);\n        * var res = source.replay(null, 3, 500, scheduler);\n        * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param windowSize [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        replay(selector?: void, bufferSize?: number, window?: number, scheduler?: IScheduler): ConnectableObservable<T>;\t// hack to catch first omitted parameter\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of Multicast using a ReplaySubject.\n        *\n        * @example\n        * var res = source.replay(null, 3);\n        * var res = source.replay(null, 3, 500);\n        * var res = source.replay(null, 3, 500, scheduler);\n        * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param windowSize [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        replay(selector: (source: ConnectableObservable<T>) => Observable<T>, bufferSize?: number, window?: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        *\n        * @example\n        * var res = source.shareReplay(3);\n        * var res = source.shareReplay(3, 500);\n        * var res = source.shareReplay(3, 500, scheduler);\n        *\n\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param window [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        shareReplay(bufferSize?: number, window?: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface BehaviorSubject<T> extends Subject<T> {\n        /**\n         * Gets the current value or throws an exception.\n         * Value is frozen after onCompleted is called.\n         * After onError is called always throws the specified exception.\n         * An exception is always thrown after dispose is called.\n         * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n         */\n        getValue(): T;\n    }\n\n    interface BehaviorSubjectStatic {\n        /**\n         *  Initializes a new instance of the BehaviorSubject class which creates a subject that caches its last value and starts with the specified value.\n         *  @param {Mixed} value Initial value sent to observers when no other value has been received by the subject yet.\n         */\n        new <T>(initialValue: T): BehaviorSubject<T>;\n    }\n\n    /**\n     *  Represents a value that changes over time.\n     *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n     */\n    export var BehaviorSubject: BehaviorSubjectStatic;\n\n    export interface ReplaySubject<T> extends Subject<T> { }\n\n    interface ReplaySubjectStatic {\n        /**\n         *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n         *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n         *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n         *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n         */\n        new <T>(bufferSize?: number, window?: number, scheduler?: IScheduler): ReplaySubject<T>;\n    }\n\n    /**\n    * Represents an object that is both an observable sequence as well as an observer.\n    * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n    */\n    export var ReplaySubject: ReplaySubjectStatic;\n\n}\ndeclare module \"rx.core.binding\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.core.binding.es6.d.ts",
    "content": "declare module Rx {\n\n        export interface ConnectableObservable<T> extends Observable<T> {\n    \t\tconnect(): IDisposable;\n    \t\trefCount(): Observable<T>;\n        }\n\n    export interface Observable<T> {\n        /**\n        * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n        * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n        * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n        *\n        * @example\n        * 1 - res = source.multicast(observable);\n        * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n        *\n        * @param {Function|Subject} subjectOrSubjectSelector\n        * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n        * Or:\n        * Subject to push source elements into.\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        multicast(subject: ISubject<T> | (() => ISubject<T>)): ConnectableObservable<T>;\n        /**\n        * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n        * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n        * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n        *\n        * @example\n        * 1 - res = source.multicast(observable);\n        * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n        *\n        * @param {Function|Subject} subjectOrSubjectSelector\n        * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n        * Or:\n        * Subject to push source elements into.\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        multicast<TResult>(subjectSelector: ISubject<T> | (() => ISubject<T>), selector: (source: ConnectableObservable<T>) => Observable<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of Multicast using a regular Subject.\n        *\n        * @example\n        * var resres = source.publish();\n        * var res = source.publish(function (x) { return x; });\n        *\n        * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publish(): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of Multicast using a regular Subject.\n        *\n        * @example\n        * var resres = source.publish();\n        * var res = source.publish(function (x) { return x; });\n        *\n        * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publish<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        share(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n        * This operator is a specialization of Multicast using a AsyncSubject.\n        *\n        * @example\n        * var res = source.publishLast();\n        * var res = source.publishLast(function (x) { return x; });\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishLast(): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n        * This operator is a specialization of Multicast using a AsyncSubject.\n        *\n        * @example\n        * var res = source.publishLast();\n        * var res = source.publishLast(function (x) { return x; });\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishLast<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n        * This operator is a specialization of Multicast using a BehaviorSubject.\n        *\n        * @example\n        * var res = source.publishValue(42);\n        * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishValue(initialValue: T): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n        * This operator is a specialization of Multicast using a BehaviorSubject.\n        *\n        * @example\n        * var res = source.publishValue(42);\n        * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishValue<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>, initialValue: T): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n        * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        shareValue(initialValue: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of Multicast using a ReplaySubject.\n        *\n        * @example\n        * var res = source.replay(null, 3);\n        * var res = source.replay(null, 3, 500);\n        * var res = source.replay(null, 3, 500, scheduler);\n        * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param windowSize [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        replay(selector?: void, bufferSize?: number, window?: number, scheduler?: IScheduler): ConnectableObservable<T>;\t// hack to catch first omitted parameter\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of Multicast using a ReplaySubject.\n        *\n        * @example\n        * var res = source.replay(null, 3);\n        * var res = source.replay(null, 3, 500);\n        * var res = source.replay(null, 3, 500, scheduler);\n        * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param windowSize [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        replay(selector: (source: ConnectableObservable<T>) => Observable<T>, bufferSize?: number, window?: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        *\n        * @example\n        * var res = source.shareReplay(3);\n        * var res = source.shareReplay(3, 500);\n        * var res = source.shareReplay(3, 500, scheduler);\n        *\n\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param window [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        shareReplay(bufferSize?: number, window?: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface BehaviorSubject<T> extends Subject<T> {\n        /**\n         * Gets the current value or throws an exception.\n         * Value is frozen after onCompleted is called.\n         * After onError is called always throws the specified exception.\n         * An exception is always thrown after dispose is called.\n         * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n         */\n        getValue(): T;\n    }\n\n    interface BehaviorSubjectStatic {\n        /**\n         *  Initializes a new instance of the BehaviorSubject class which creates a subject that caches its last value and starts with the specified value.\n         *  @param {Mixed} value Initial value sent to observers when no other value has been received by the subject yet.\n         */\n        new <T>(initialValue: T): BehaviorSubject<T>;\n    }\n\n    /**\n     *  Represents a value that changes over time.\n     *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n     */\n    export var BehaviorSubject: BehaviorSubjectStatic;\n\n    export interface ReplaySubject<T> extends Subject<T> { }\n\n    interface ReplaySubjectStatic {\n        /**\n         *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n         *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n         *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n         *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n         */\n        new <T>(bufferSize?: number, window?: number, scheduler?: IScheduler): ReplaySubject<T>;\n    }\n\n    /**\n    * Represents an object that is both an observable sequence as well as an observer.\n    * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n    */\n    export var ReplaySubject: ReplaySubjectStatic;\n\n}\ndeclare module \"rx.core.binding\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.core.d.ts",
    "content": "declare module Rx {\n\n    // Type alias for observables and promises\n    export type ObservableOrPromise<T> = IObservable<T> | Observable<T> | Promise<T>;\n\n    export type ArrayLike<T> = Array<T> | { length: number;[index: number]: T; };\n\n    // Type alias for arrays and array like objects\n    export type ArrayOrIterable<T> = ArrayLike<T>;\n\n    /**\n     * Promise A+\n     */\n    export interface Promise<T> {\n        then<R>(onFulfilled: (value: T) => R|Promise<R>, onRejected: (error: any) => Promise<R>): Promise<R>;\n        then<R>(onFulfilled: (value: T) => R|Promise<R>, onRejected?: (error: any) => R): Promise<R>;\n    }\n\n    /**\n     * Promise A+\n     */\n    export interface IPromise<T> extends Promise<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface IObservable<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface Observable<T> extends IObservable<T> { }\n\n    export interface IDisposable {\n        dispose(): void;\n    }\n\n    export interface Disposable extends IDisposable {\n        /** Is this value disposed. */\n        isDisposed?: boolean;\n    }\n\n    interface DisposableStatic {\n        /**\n         * Provides a set of static methods for creating Disposables.\n         * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n         */\n        new (action: () => void): Disposable;\n\n        /**\n         * Creates a disposable object that invokes the specified action when disposed.\n         * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n         * @return {Disposable} The disposable object that runs the given action upon disposal.\n         */\n        create(action: () => void): Disposable;\n\n        /**\n         * Gets the disposable that does nothing when disposed.\n         */\n        empty: IDisposable;\n\n        /**\n         * Validates whether the given object is a disposable\n         * @param {Object} Object to test whether it has a dispose method\n         * @returns {Boolean} true if a disposable object, else false.\n         */\n        isDisposable(d: any): boolean;\n    }\n\n    /**\n     * Provides a set of static methods for creating Disposables.\n     * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n     */\n    export var Disposable: DisposableStatic;\n\n    export module config {\n        export var Promise: { new <T>(resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): IPromise<T>; };\n    }\n\n    export module helpers {\n        export var noop: () => void;\n        export var notDefined: (value: any) => boolean;\n        export var identity: <T>(value: T) => T;\n        export var defaultNow: () => number;\n        export var defaultComparer: (left: any, right: any) =>  boolean;\n        export var defaultSubComparer: (left: any, right: any) =>  number;\n        export var defaultKeySerializer: (key: any) =>  string;\n        export var defaultError: (err: any) =>  void;\n        export var isPromise: (p: any) =>  boolean;\n        export var asArray: <T>(...args: T[]) =>  T[];\n        export var not: (value: any) =>  boolean;\n        export var isFunction: (value: any) =>  boolean;\n    }\n\n    export type _Selector<T, TResult> = (value: T, index: number, observable: Observable<T>) => TResult;\n    export type _ValueOrSelector<T, TResult> = TResult | _Selector<T, TResult>;\n    export type _Predicate<T> = _Selector<T, boolean>;\n    export type _Comparer<T, TResult> = (value1: T, value2: T) => TResult;\n    export type _Accumulator<T, TAcc> = (acc: TAcc, value: T) => TAcc;\n\n    export module special {\n        export type _FlatMapResultSelector<T1, T2, TResult> = (value: T1, selectorValue: T2, index: number, selectorOther: number) => TResult;\n    }\n\n    export interface IObservable<T> {\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(observer: IObserver<T>): IDisposable;\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(observer: IObserver<T>): IDisposable;\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n\n        /**\n        * Subscribes to the next value in the sequence with an optional \"this\" argument.\n        * @param {Function} onNext The function to invoke on each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnNext(onNext: (value: T) => void, thisArg?: any): IDisposable;\n        /**\n        * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n        * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnError(onError: (exception: any) => void, thisArg?: any): IDisposable;\n        /**\n        * Subscribes to the next value in the sequence with an optional \"this\" argument.\n        * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnCompleted(onCompleted: () => void, thisArg?: any): IDisposable;\n\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        forEach(observer: IObserver<T>): IDisposable;\n\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        forEach(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Determines whether the given object is an Observable\n        * @param {Any} An object to determine whether it is an Observable\n        * @returns {Boolean} true if an Observable, else false.\n        */\n        isObservable(o: any): boolean;\n    }\n\n    export var Observable: ObservableStatic;\n\n    export module internals {\n        export var inherits: (child: any, parent: any) => void;\n        export var addProperties: (obj: any, ...sources: any[]) => void;\n        export var addRef: <T>(xs: Observable<T>, r: { getDisposable(): IDisposable; }) => Observable<T>;\n    }\n\n    /**\n     * Represents a group of disposable resources that are disposed together.\n     * @constructor\n     */\n    export interface CompositeDisposable extends Disposable {\n        /**\n         * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n         * @param {Mixed} item Disposable to add.\n         */\n        add(item: IDisposable): void;\n\n        /**\n         * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n         * @param {Mixed} item Disposable to remove.\n         * @returns {Boolean} true if found; false otherwise.\n         */\n        remove(item: IDisposable): void;\n    }\n\n    interface CompositeDisposableStatic {\n        /**\n         * Represents a group of disposable resources that are disposed together.\n         * @constructor\n         */\n        new (...disposables: Rx.IDisposable[]): CompositeDisposable;\n        /**\n         * Represents a group of disposable resources that are disposed together.\n         * @constructor\n         */\n        new(disposables: Rx.IDisposable[]): CompositeDisposable;\n    }\n\n    export var CompositeDisposable: CompositeDisposableStatic;\n\n    export interface SingleAssignmentDisposable {\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        getDisposable(): IDisposable;\n\n        setDisposable(value: IDisposable): void;\n    }\n\n    interface SingleAssignmentDisposableStatic {\n        new() : SingleAssignmentDisposable;\n    }\n\n    export var SingleAssignmentDisposable : SingleAssignmentDisposableStatic;\n\n    export interface SerialDisposable {\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        getDisposable(): IDisposable;\n\n        setDisposable(value: IDisposable): void;\n    }\n\n    interface SerialDisposableStatic {\n        new() : SerialDisposable;\n    }\n\n    export var SerialDisposable : SerialDisposableStatic;\n\n    export interface IScheduler {\n        /** Gets the current time according to the local machine's system clock. */\n        now(): number;\n\n        /**\n          * Schedules an action to be executed.\n          * @param state State passed to the action to be executed.\n          * @param {Function} action Action to be executed.\n          * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n          */\n        schedule<TState>(state: TState, action: (scheduler: IScheduler, state: TState) => IDisposable): IDisposable;\n\n        /**\n         * Schedules an action to be executed after dueTime.\n         * @param state State passed to the action to be executed.\n         * @param {Function} action Action to be executed.\n         * @param {Number} dueTime Relative time after which to execute the action.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleFuture<TState>(state: TState, dueTime: number | Date, action: (scheduler: IScheduler, state: TState) => IDisposable): IDisposable;\n    }\n\n    export interface SchedulerStatic {\n        /** Gets the current time according to the local machine's system clock. */\n        now(): number;\n\n        /**\n         * Normalizes the specified TimeSpan value to a positive value.\n         * @param {Number} timeSpan The time span value to normalize.\n         * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n         */\n        normalize(timeSpan: number): number;\n\n        /** Determines whether the given object is a scheduler */\n        isScheduler(s: any): boolean;\n    }\n\n    /** Provides a set of static properties to access commonly used schedulers. */\n    export var Scheduler: SchedulerStatic;\n\n    export module internals {\n        export interface ScheduledItem<TTime> {\n            scheduler: IScheduler;\n            state: TTime;\n            action: (scheduler: IScheduler, state: any) => IDisposable;\n            dueTime: TTime;\n            comparer: (x: TTime, y: TTime) => number;\n            disposable: SingleAssignmentDisposable;\n\n            invoke(): void;\n            compareTo(other: ScheduledItem<TTime>): number;\n            isCancelled(): boolean;\n            invokeCore(): IDisposable;\n        }\n\n        interface ScheduledItemStatic {\n            new <TTime>(scheduler: IScheduler, state: any, action: (scheduler: IScheduler, state: any) => IDisposable, dueTime: TTime, comparer?: _Comparer<TTime, number>):ScheduledItem<TTime>;\n        }\n\n        export var ScheduledItem: ScheduledItemStatic\n    }\n\n    export interface IScheduler {\n        /**\n         * Schedules an action to be executed recursively.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleRecursive<TState>(state: TState, action: (state: TState, action: (state: TState) => void) => void): IDisposable;\n\n        /**\n         * Schedules an action to be executed recursively after a specified relative due time.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n         * @param {Number}dueTime Relative time after which to execute the action for the first time.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleRecursiveFuture<TState, TTime extends number | Date>(state: TState, dueTime: TTime, action: (state: TState, action: (state: TState, dueTime: TTime) => void) => void): IDisposable;\n    }\n\n    export interface IScheduler {\n        /**\n         * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n         * @param {Mixed} state Initial state passed to the action upon the first iteration.\n         * @param {Number} period Period for running the work periodically.\n         * @param {Function} action Action to be executed, potentially updating the state.\n         * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n         */\n        schedulePeriodic<TState>(state: TState, period: number, action: (state: TState) => TState): IDisposable;\n    }\n\n    export module internals {\n        export interface SchedulePeriodicRecursive {\n            start(): IDisposable;\n        }\n\n        interface SchedulePeriodicRecursiveStatic {\n            new (scheduler: any, state: any, period: any, action: any) : SchedulePeriodicRecursive;\n        }\n\n        export var SchedulePeriodicRecursive: SchedulePeriodicRecursiveStatic;\n    }\n\n    export interface SchedulerStatic {\n        immediate: IScheduler;\n    }\n\n    export interface ICurrentThreadScheduler extends IScheduler {\n        scheduleRequired(): boolean;\n    }\n\n    export interface SchedulerStatic {\n        currentThread: ICurrentThreadScheduler;\n    }\n\n    export interface SchedulerStatic {\n        default: IScheduler;\n        async: IScheduler;\n    }\n\n    export module internals {\n        // Priority Queue for Scheduling\n        export interface PriorityQueue<TTime> {\n            length: number;\n\n            isHigherPriority(left: number, right: number): boolean;\n            percolate(index: number): void;\n            heapify(index: number): void;\n            peek(): ScheduledItem<TTime>;\n            removeAt(index: number): void;\n            dequeue(): ScheduledItem<TTime>;\n            enqueue(item: ScheduledItem<TTime>): void;\n            remove(item: ScheduledItem<TTime>): boolean;\n        }\n\n        interface PriorityQueueStatic {\n                new <T>(capacity: number) : PriorityQueue<T>;\n                count: number;\n        }\n\n        export var PriorityQueue : PriorityQueueStatic;\n    }\n\n    export interface CheckedObserver<T> extends Observer<T> {\n        checkAccess(): void;\n    }\n\n    /**\n    * Supports push-style iteration over an observable sequence.\n    */\n    export interface IObserver<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n    \n    export interface Observer<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n\n    export interface ObserverStatic {\n        /**\n        *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n        * @param {Function} [onNext] Observer's OnNext action implementation.\n        * @param {Function} [onError] Observer's OnError action implementation.\n        * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n        * @returns {Observer} The observer object implemented using the given actions.\n        */\n        create<T>(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observer<T>;\n    }\n\n    /**\n    * Supports push-style iteration over an observable sequence.\n    */\n    export var Observer: ObserverStatic;\n\n    export module internals {\n        /**\n        * Abstract base class for implementations of the Observer class.\n        * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n        */\n        export interface AbstractObserver<T> extends Rx.IObserver<T>, Rx.IDisposable {\n            /**\n            * Notifies the observer of a new element in the sequence.\n            * @param {Any} value Next element in the sequence.\n            */\n            onNext(value: T): void;\n            /**\n            * Notifies the observer that an exception has occurred.\n            * @param {Any} error The error that has occurred.\n            */\n            onError(exception: any): void;\n            /**\n            * Notifies the observer of the end of the sequence.\n            */\n            onCompleted(): void;\n\n            isStopped: boolean;\n\n            /**\n            * Disposes the observer, causing it to transition to the stopped state.\n            */\n            dispose(): void;\n\n            fail(e: any): boolean;\n\n            // Must be implemented by other observers\n            next(value: T): void;\n            error(error: any): void;\n            completed(): void;\n        }\n\n        interface AbstractObserverStatic {\n            new <T>(): AbstractObserver<T>;\n        }\n\n        export var AbstractObserver: AbstractObserverStatic\n    }\n\n    /**\n     * Class to create an Observer instance from delegate-based implementations of the on* methods.\n     */\n    export interface AnonymousObserver<T> extends Observer<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n\n    interface AnonymousObserverStatic {\n        /**\n         * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n         * @param {Any} onNext Observer's OnNext action implementation.\n         * @param {Any} onError Observer's OnError action implementation.\n         * @param {Any} onCompleted Observer's OnCompleted action implementation.\n         */\n        new <T>(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): AnonymousObserver<T>;\n    }\n\n    export var AnonymousObserver : AnonymousObserverStatic;\n\n    export interface AnonymousObservable<T> extends Observable<T> { }\n\n    export interface ObservableStatic {\n        /**\n        *  Creates an observable sequence from a specified subscribe method implementation.\n        * @example\n        *  var res = Rx.Observable.create(function (observer) { return function () { } );\n        *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n        *  var res = Rx.Observable.create(function (observer) { } );\n        * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n        * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n        */\n        create<T>(subscribe: (observer: Observer<T>) => IDisposable | Function | void): Observable<T>;\n    }\n\n}\n\ndeclare module \"rx\" { export = Rx; }\n\n"
  },
  {
    "path": "ts/rx.core.es6.d.ts",
    "content": "declare module Rx {\n\n    // Type alias for observables and promises\n    export type ObservableOrPromise<T> = IObservable<T> | Observable<T> | Promise<T>;\n\n    export type ArrayLike<T> = Array<T> | { length: number;[index: number]: T; };\n\n    // Type alias for arrays and array like objects\n    export type ArrayOrIterable<T> = ArrayLike<T> | Iterable<T>;\n\n    /**\n     * Promise A+\n     */\n    export interface Promise<T> extends PromiseLike<T> { }\n\n    /**\n     * Promise A+\n     */\n    export interface IPromise<T> extends PromiseLike<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface IObservable<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface Observable<T> extends IObservable<T> { }\n\n    export interface IDisposable {\n        dispose(): void;\n    }\n\n    export interface Disposable extends IDisposable {\n        /** Is this value disposed. */\n        isDisposed?: boolean;\n    }\n\n    interface DisposableStatic {\n        /**\n         * Provides a set of static methods for creating Disposables.\n         * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n         */\n        new (action: () => void): Disposable;\n\n        /**\n         * Creates a disposable object that invokes the specified action when disposed.\n         * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n         * @return {Disposable} The disposable object that runs the given action upon disposal.\n         */\n        create(action: () => void): Disposable;\n\n        /**\n         * Gets the disposable that does nothing when disposed.\n         */\n        empty: IDisposable;\n\n        /**\n         * Validates whether the given object is a disposable\n         * @param {Object} Object to test whether it has a dispose method\n         * @returns {Boolean} true if a disposable object, else false.\n         */\n        isDisposable(d: any): boolean;\n    }\n\n    /**\n     * Provides a set of static methods for creating Disposables.\n     * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n     */\n    export var Disposable: DisposableStatic;\n\n    export module config {\n        export var Promise: { new <T>(resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): IPromise<T>; };\n    }\n\n    export module helpers {\n        export var noop: () => void;\n        export var notDefined: (value: any) => boolean;\n        export var identity: <T>(value: T) => T;\n        export var defaultNow: () => number;\n        export var defaultComparer: (left: any, right: any) =>  boolean;\n        export var defaultSubComparer: (left: any, right: any) =>  number;\n        export var defaultKeySerializer: (key: any) =>  string;\n        export var defaultError: (err: any) =>  void;\n        export var isPromise: (p: any) =>  boolean;\n        export var asArray: <T>(...args: T[]) =>  T[];\n        export var not: (value: any) =>  boolean;\n        export var isFunction: (value: any) =>  boolean;\n    }\n\n    export type _Selector<T, TResult> = (value: T, index: number, observable: Observable<T>) => TResult;\n    export type _ValueOrSelector<T, TResult> = TResult | _Selector<T, TResult>;\n    export type _Predicate<T> = _Selector<T, boolean>;\n    export type _Comparer<T, TResult> = (value1: T, value2: T) => TResult;\n    export type _Accumulator<T, TAcc> = (acc: TAcc, value: T) => TAcc;\n\n    export module special {\n        export type _FlatMapResultSelector<T1, T2, TResult> = (value: T1, selectorValue: T2, index: number, selectorOther: number) => TResult;\n    }\n\n    export interface IObservable<T> {\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(observer: IObserver<T>): IDisposable;\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(observer: IObserver<T>): IDisposable;\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n\n        /**\n        * Subscribes to the next value in the sequence with an optional \"this\" argument.\n        * @param {Function} onNext The function to invoke on each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnNext(onNext: (value: T) => void, thisArg?: any): IDisposable;\n        /**\n        * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n        * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnError(onError: (exception: any) => void, thisArg?: any): IDisposable;\n        /**\n        * Subscribes to the next value in the sequence with an optional \"this\" argument.\n        * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnCompleted(onCompleted: () => void, thisArg?: any): IDisposable;\n\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        forEach(observer: IObserver<T>): IDisposable;\n\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        forEach(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Determines whether the given object is an Observable\n        * @param {Any} An object to determine whether it is an Observable\n        * @returns {Boolean} true if an Observable, else false.\n        */\n        isObservable(o: any): boolean;\n    }\n\n    export var Observable: ObservableStatic;\n\n    export module internals {\n        export var inherits: (child: any, parent: any) => void;\n        export var addProperties: (obj: any, ...sources: any[]) => void;\n        export var addRef: <T>(xs: Observable<T>, r: { getDisposable(): IDisposable; }) => Observable<T>;\n    }\n\n    /**\n     * Represents a group of disposable resources that are disposed together.\n     * @constructor\n     */\n    export interface CompositeDisposable extends Disposable {\n        /**\n         * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n         * @param {Mixed} item Disposable to add.\n         */\n        add(item: IDisposable): void;\n\n        /**\n         * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n         * @param {Mixed} item Disposable to remove.\n         * @returns {Boolean} true if found; false otherwise.\n         */\n        remove(item: IDisposable): void;\n    }\n\n    interface CompositeDisposableStatic {\n        /**\n         * Represents a group of disposable resources that are disposed together.\n         * @constructor\n         */\n        new (...disposables: Rx.IDisposable[]): CompositeDisposable;\n        /**\n         * Represents a group of disposable resources that are disposed together.\n         * @constructor\n         */\n        new(disposables: Rx.IDisposable[]): CompositeDisposable;\n    }\n\n    export var CompositeDisposable: CompositeDisposableStatic;\n\n    export interface SingleAssignmentDisposable {\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        getDisposable(): IDisposable;\n\n        setDisposable(value: IDisposable): void;\n    }\n\n    interface SingleAssignmentDisposableStatic {\n        new() : SingleAssignmentDisposable;\n    }\n\n    export var SingleAssignmentDisposable : SingleAssignmentDisposableStatic;\n\n    export interface SerialDisposable {\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        getDisposable(): IDisposable;\n\n        setDisposable(value: IDisposable): void;\n    }\n\n    interface SerialDisposableStatic {\n        new() : SerialDisposable;\n    }\n\n    export var SerialDisposable : SerialDisposableStatic;\n\n    export interface IScheduler {\n        /** Gets the current time according to the local machine's system clock. */\n        now(): number;\n\n        /**\n          * Schedules an action to be executed.\n          * @param state State passed to the action to be executed.\n          * @param {Function} action Action to be executed.\n          * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n          */\n        schedule<TState>(state: TState, action: (scheduler: IScheduler, state: TState) => IDisposable): IDisposable;\n\n        /**\n         * Schedules an action to be executed after dueTime.\n         * @param state State passed to the action to be executed.\n         * @param {Function} action Action to be executed.\n         * @param {Number} dueTime Relative time after which to execute the action.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleFuture<TState>(state: TState, dueTime: number | Date, action: (scheduler: IScheduler, state: TState) => IDisposable): IDisposable;\n    }\n\n    export interface SchedulerStatic {\n        /** Gets the current time according to the local machine's system clock. */\n        now(): number;\n\n        /**\n         * Normalizes the specified TimeSpan value to a positive value.\n         * @param {Number} timeSpan The time span value to normalize.\n         * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n         */\n        normalize(timeSpan: number): number;\n\n        /** Determines whether the given object is a scheduler */\n        isScheduler(s: any): boolean;\n    }\n\n    /** Provides a set of static properties to access commonly used schedulers. */\n    export var Scheduler: SchedulerStatic;\n\n    export module internals {\n        export interface ScheduledItem<TTime> {\n            scheduler: IScheduler;\n            state: TTime;\n            action: (scheduler: IScheduler, state: any) => IDisposable;\n            dueTime: TTime;\n            comparer: (x: TTime, y: TTime) => number;\n            disposable: SingleAssignmentDisposable;\n\n            invoke(): void;\n            compareTo(other: ScheduledItem<TTime>): number;\n            isCancelled(): boolean;\n            invokeCore(): IDisposable;\n        }\n\n        interface ScheduledItemStatic {\n            new <TTime>(scheduler: IScheduler, state: any, action: (scheduler: IScheduler, state: any) => IDisposable, dueTime: TTime, comparer?: _Comparer<TTime, number>):ScheduledItem<TTime>;\n        }\n\n        export var ScheduledItem: ScheduledItemStatic\n    }\n\n    export interface IScheduler {\n        /**\n         * Schedules an action to be executed recursively.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleRecursive<TState>(state: TState, action: (state: TState, action: (state: TState) => void) => void): IDisposable;\n\n        /**\n         * Schedules an action to be executed recursively after a specified relative due time.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n         * @param {Number}dueTime Relative time after which to execute the action for the first time.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleRecursiveFuture<TState, TTime extends number | Date>(state: TState, dueTime: TTime, action: (state: TState, action: (state: TState, dueTime: TTime) => void) => void): IDisposable;\n    }\n\n    export interface IScheduler {\n        /**\n         * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n         * @param {Mixed} state Initial state passed to the action upon the first iteration.\n         * @param {Number} period Period for running the work periodically.\n         * @param {Function} action Action to be executed, potentially updating the state.\n         * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n         */\n        schedulePeriodic<TState>(state: TState, period: number, action: (state: TState) => TState): IDisposable;\n    }\n\n    export module internals {\n        export interface SchedulePeriodicRecursive {\n            start(): IDisposable;\n        }\n\n        interface SchedulePeriodicRecursiveStatic {\n            new (scheduler: any, state: any, period: any, action: any) : SchedulePeriodicRecursive;\n        }\n\n        export var SchedulePeriodicRecursive: SchedulePeriodicRecursiveStatic;\n    }\n\n    export interface SchedulerStatic {\n        immediate: IScheduler;\n    }\n\n    export interface ICurrentThreadScheduler extends IScheduler {\n        scheduleRequired(): boolean;\n    }\n\n    export interface SchedulerStatic {\n        currentThread: ICurrentThreadScheduler;\n    }\n\n    export interface SchedulerStatic {\n        default: IScheduler;\n        async: IScheduler;\n    }\n\n    export module internals {\n        // Priority Queue for Scheduling\n        export interface PriorityQueue<TTime> {\n            length: number;\n\n            isHigherPriority(left: number, right: number): boolean;\n            percolate(index: number): void;\n            heapify(index: number): void;\n            peek(): ScheduledItem<TTime>;\n            removeAt(index: number): void;\n            dequeue(): ScheduledItem<TTime>;\n            enqueue(item: ScheduledItem<TTime>): void;\n            remove(item: ScheduledItem<TTime>): boolean;\n        }\n\n        interface PriorityQueueStatic {\n                new <T>(capacity: number) : PriorityQueue<T>;\n                count: number;\n        }\n\n        export var PriorityQueue : PriorityQueueStatic;\n    }\n\n    export interface CheckedObserver<T> extends Observer<T> {\n        checkAccess(): void;\n    }\n\n    /**\n    * Supports push-style iteration over an observable sequence.\n    */\n    export interface IObserver<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n    \n    export interface Observer<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n\n    export interface ObserverStatic {\n        /**\n        *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n        * @param {Function} [onNext] Observer's OnNext action implementation.\n        * @param {Function} [onError] Observer's OnError action implementation.\n        * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n        * @returns {Observer} The observer object implemented using the given actions.\n        */\n        create<T>(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observer<T>;\n    }\n\n    /**\n    * Supports push-style iteration over an observable sequence.\n    */\n    export var Observer: ObserverStatic;\n\n    export module internals {\n        /**\n        * Abstract base class for implementations of the Observer class.\n        * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n        */\n        export interface AbstractObserver<T> extends Rx.IObserver<T>, Rx.IDisposable {\n            /**\n            * Notifies the observer of a new element in the sequence.\n            * @param {Any} value Next element in the sequence.\n            */\n            onNext(value: T): void;\n            /**\n            * Notifies the observer that an exception has occurred.\n            * @param {Any} error The error that has occurred.\n            */\n            onError(exception: any): void;\n            /**\n            * Notifies the observer of the end of the sequence.\n            */\n            onCompleted(): void;\n\n            isStopped: boolean;\n\n            /**\n            * Disposes the observer, causing it to transition to the stopped state.\n            */\n            dispose(): void;\n\n            fail(e: any): boolean;\n\n            // Must be implemented by other observers\n            next(value: T): void;\n            error(error: any): void;\n            completed(): void;\n        }\n\n        interface AbstractObserverStatic {\n            new <T>(): AbstractObserver<T>;\n        }\n\n        export var AbstractObserver: AbstractObserverStatic\n    }\n\n    /**\n     * Class to create an Observer instance from delegate-based implementations of the on* methods.\n     */\n    export interface AnonymousObserver<T> extends Observer<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n\n    interface AnonymousObserverStatic {\n        /**\n         * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n         * @param {Any} onNext Observer's OnNext action implementation.\n         * @param {Any} onError Observer's OnError action implementation.\n         * @param {Any} onCompleted Observer's OnCompleted action implementation.\n         */\n        new <T>(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): AnonymousObserver<T>;\n    }\n\n    export var AnonymousObserver : AnonymousObserverStatic;\n\n    export interface AnonymousObservable<T> extends Observable<T> { }\n\n    export interface ObservableStatic {\n        /**\n        *  Creates an observable sequence from a specified subscribe method implementation.\n        * @example\n        *  var res = Rx.Observable.create(function (observer) { return function () { } );\n        *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n        *  var res = Rx.Observable.create(function (observer) { } );\n        * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n        * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n        */\n        create<T>(subscribe: (observer: Observer<T>) => IDisposable | Function | void): Observable<T>;\n    }\n\n}\n\ndeclare module \"rx\" { export = Rx; }\n\n"
  },
  {
    "path": "ts/rx.core.testing.d.ts",
    "content": "declare module Rx {\n\n    export interface VirtualTimeScheduler<TAbsolute, TRelative> extends IScheduler {\n        /**\n         * Adds a relative time value to an absolute time value.\n         * @param {Number} absolute Absolute virtual time value.\n         * @param {Number} relative Relative virtual time value to add.\n         * @return {Number} Resulting absolute virtual time sum value.\n         */\n        add(from: TAbsolute, by: TRelative): TAbsolute;\n\n        /**\n         * Converts an absolute time to a number\n         * @param {Any} The absolute time.\n         * @returns {Number} The absolute time in ms\n         */\n        toAbsoluteTime(duetime: TAbsolute): number;\n\n        /**\n         * Converts the TimeSpan value to a relative virtual time value.\n         * @param {Number} timeSpan TimeSpan value to convert.\n         * @return {Number} Corresponding relative virtual time value.\n         */\n        toRelativeTime(duetime: number): TRelative;\n\n        /**\n         * Starts the virtual time scheduler.\n         */\n        start(): IDisposable;\n\n        /**\n         * Stops the virtual time scheduler.\n         */\n        stop(): void;\n\n        /**\n         * Advances the scheduler's clock to the specified time, running all work till that point.\n         * @param {Number} time Absolute time to advance the scheduler's clock to.\n         */\n        advanceTo(time: TAbsolute): void;\n\n        /**\n         * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n         * @param {Number} time Relative time to advance the scheduler's clock by.\n         */\n        advanceBy(time: TRelative): void;\n\n        /**\n         * Advances the scheduler's clock by the specified relative time.\n         * @param {Number} time Relative time to advance the scheduler's clock by.\n         */\n        sleep(time: TRelative): void;\n\n        isEnabled: boolean;\n\n        /**\n         * Gets the next scheduled item to be executed.\n         * @returns {ScheduledItem} The next scheduled item.\n         */\n        getNext(): internals.ScheduledItem<TAbsolute>;\n    }\n\n    export interface Subscription {\n        /**\n         * Checks whether the given subscription is equal to the current instance.\n         * @param other Subscription object to check for equality.\n         * @returns {Boolean} true if both objects are equal; false otherwise.\n         */\n        equals(other: Subscription): boolean;\n        /**\n         * Returns a string representation of the current Subscription value.\n         * @returns {String} String representation of the current Subscription value.\n         */\n        toString(): string;\n    }\n\n    interface SubscriptionStatic {\n        /**\n         * Creates a new subscription object with the given virtual subscription and unsubscription time.\n         *\n         * @constructor\n         * @param {Number} subscribe Virtual time at which the subscription occurred.\n         * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n         */\n        new (subscribeAt: number, unsubscribeAt?: number): Subscription;\n    }\n\n    export var Subscription: SubscriptionStatic;\n\n    export interface Recorded {\n        /**\n         * Checks whether the given recorded object is equal to the current instance.\n         *\n         * @param {Recorded} other Recorded object to check for equality.\n         * @returns {Boolean} true if both objects are equal; false otherwise.\n         */\n        equals(other: Recorded): boolean;\n        /**\n         * Returns a string representation of the current Recorded value.\n         *\n         * @returns {String} String representation of the current Recorded value.\n         */\n        toString(): string;\n        time: number;\n        value: any;\n    }\n\n    interface RecordedStatic {\n        /**\n         * Creates a new object recording the production of the specified value at the given virtual time.\n         *\n         * @constructor\n         * @param {Number} time Virtual time the value was produced on.\n         * @param {Mixed} value Value that was produced.\n         * @param {Function} comparer An optional comparer.\n         */\n        new (time: number, value: any, equalityComparer?: _Comparer<any, boolean>): Recorded;\n    }\n\n    export var Recorded: RecordedStatic;\n\n    export var ReactiveTest: {\n        /** Default virtual time used for creation of observable sequences in unit tests. */\n        created: number;\n        /** Default virtual time used to subscribe to observable sequences in unit tests. */\n        subscribed: number;\n        /** Default virtual time used to dispose subscriptions in unit tests. */\n        disposed: number;\n\n        /**\n         * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n         *\n         * 1 - ReactiveTest.onNext(200, 42);\n         * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n         *\n         * @param ticks Recorded virtual time the OnNext notification occurs.\n         * @param value Recorded value stored in the OnNext notification or a predicate.\n         * @return Recorded OnNext notification.\n         */\n        onNext(ticks: number, value: any): Recorded;\n        /**\n         * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n         *\n         * 1 - ReactiveTest.onNext(200, 42);\n         * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n         *\n         * @param ticks Recorded virtual time the OnNext notification occurs.\n         * @param value Recorded value stored in the OnNext notification or a predicate.\n         * @return Recorded OnNext notification.\n         */\n        onNext(ticks: number, predicate: (value: any) => boolean): Recorded;\n        /**\n         * Factory method for an OnError notification record at a given time with a given error.\n         *\n         * 1 - ReactiveTest.onNext(200, new Error('error'));\n         * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n         *\n         * @param ticks Recorded virtual time the OnError notification occurs.\n         * @param exception Recorded exception stored in the OnError notification.\n         * @return Recorded OnError notification.\n         */\n        onError(ticks: number, exception: any): Recorded;\n        /**\n         * Factory method for an OnError notification record at a given time with a given error.\n         *\n         * 1 - ReactiveTest.onNext(200, new Error('error'));\n         * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n         *\n         * @param ticks Recorded virtual time the OnError notification occurs.\n         * @param exception Recorded exception stored in the OnError notification.\n         * @return Recorded OnError notification.\n         */\n        onError(ticks: number, predicate: (exception: any) => boolean): Recorded;\n        /**\n         * Factory method for an OnCompleted notification record at a given time.\n         *\n         * @param ticks Recorded virtual time the OnCompleted notification occurs.\n         * @return Recorded OnCompleted notification.\n         */\n        onCompleted(ticks: number): Recorded;\n\n        /**\n         * Factory method for a subscription record based on a given subscription and disposal time.\n         *\n         * @param start Virtual time indicating when the subscription was created.\n         * @param end Virtual time indicating when the subscription was disposed.\n         * @return Subscription object.\n         */\n        subscribe(subscribeAt: number, unsubscribeAt?: number): Subscription;\n    }\n\n    export interface MockObserver<T> extends Observer<T> {\n        messages: Recorded[];\n    }\n\n    interface MockObserverStatic extends ObserverStatic {\n        new <T>(scheduler: IScheduler): MockObserver<T>;\n    }\n\n    export var MockObserver: MockObserverStatic;\n\n\n    export interface TestScheduler extends VirtualTimeScheduler<number, number> {\n        /**\n         * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n         * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n         * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n         */\n        createColdObservable<T>(...records: Recorded[]): Observable<T>;\n        /**\n         * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n         * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n         * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n         */\n        createHotObservable<T>(...records: Recorded[]): Observable<T>;\n        /**\n         * Creates an observer that records received notification messages and timestamps those.\n         * @return Observer that can be used to assert the timing of received notifications.\n         */\n        createObserver<T>(): MockObserver<T>;\n\n        /**\n         * Creates a resolved promise with the given value and ticks\n         * @param {Number} ticks The absolute time of the resolution.\n         * @param {Any} value The value to yield at the given tick.\n         * @returns {MockPromise} A mock Promise which fulfills with the given value.\n         */\n        createResolvedPromise<T>(ticks: number, value: T): IPromise<T>;\n        /**\n         * Creates a rejected promise with the given reason and ticks\n         * @param {Number} ticks The absolute time of the resolution.\n         * @param {Any} reason The reason for rejection to yield at the given tick.\n         * @returns {MockPromise} A mock Promise which rejects with the given reason.\n         */\n        createRejectedPromise<T>(ticks: number, value: T): IPromise<T>;\n\n        /**\n         * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n         *\n         * @param create Factory method to create an observable sequence.\n         * @param created Virtual time at which to invoke the factory to create an observable sequence.\n         * @param subscribed Virtual time at which to subscribe to the created observable sequence.\n         * @param disposed Virtual time at which to dispose the subscription.\n         * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n         */\n        startWithTiming<T>(create: () => Observable<T>, createdAt: number, subscribedAt: number, disposedAt: number): MockObserver<T>;\n        /**\n         * Starts the test scheduler and uses the specified virtual time to dispose the subscription to the sequence obtained through the factory function.\n         * Default virtual times are used for factory invocation and sequence subscription.\n         *\n         * @param create Factory method to create an observable sequence.\n         * @param disposed Virtual time at which to dispose the subscription.\n         * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n         */\n        startWithDispose<T>(create: () => Observable<T>, disposedAt: number): MockObserver<T>;\n        /**\n         * Starts the test scheduler and uses default virtual times to invoke the factory function, to subscribe to the resulting sequence, and to dispose the subscription.\n         *\n         * @param create Factory method to create an observable sequence.\n         * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n         */\n        startWithCreate<T>(create: () => Observable<T>): MockObserver<T>;\n    }\n\n    export var TestScheduler: {\n        new (): TestScheduler;\n    }\n\n}\ndeclare module \"rx.core.testing\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.core.testing.es6.d.ts",
    "content": "declare module Rx {\n\n    export interface VirtualTimeScheduler<TAbsolute, TRelative> extends IScheduler {\n        /**\n         * Adds a relative time value to an absolute time value.\n         * @param {Number} absolute Absolute virtual time value.\n         * @param {Number} relative Relative virtual time value to add.\n         * @return {Number} Resulting absolute virtual time sum value.\n         */\n        add(from: TAbsolute, by: TRelative): TAbsolute;\n\n        /**\n         * Converts an absolute time to a number\n         * @param {Any} The absolute time.\n         * @returns {Number} The absolute time in ms\n         */\n        toAbsoluteTime(duetime: TAbsolute): number;\n\n        /**\n         * Converts the TimeSpan value to a relative virtual time value.\n         * @param {Number} timeSpan TimeSpan value to convert.\n         * @return {Number} Corresponding relative virtual time value.\n         */\n        toRelativeTime(duetime: number): TRelative;\n\n        /**\n         * Starts the virtual time scheduler.\n         */\n        start(): IDisposable;\n\n        /**\n         * Stops the virtual time scheduler.\n         */\n        stop(): void;\n\n        /**\n         * Advances the scheduler's clock to the specified time, running all work till that point.\n         * @param {Number} time Absolute time to advance the scheduler's clock to.\n         */\n        advanceTo(time: TAbsolute): void;\n\n        /**\n         * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n         * @param {Number} time Relative time to advance the scheduler's clock by.\n         */\n        advanceBy(time: TRelative): void;\n\n        /**\n         * Advances the scheduler's clock by the specified relative time.\n         * @param {Number} time Relative time to advance the scheduler's clock by.\n         */\n        sleep(time: TRelative): void;\n\n        isEnabled: boolean;\n\n        /**\n         * Gets the next scheduled item to be executed.\n         * @returns {ScheduledItem} The next scheduled item.\n         */\n        getNext(): internals.ScheduledItem<TAbsolute>;\n    }\n\n    export interface Subscription {\n        /**\n         * Checks whether the given subscription is equal to the current instance.\n         * @param other Subscription object to check for equality.\n         * @returns {Boolean} true if both objects are equal; false otherwise.\n         */\n        equals(other: Subscription): boolean;\n        /**\n         * Returns a string representation of the current Subscription value.\n         * @returns {String} String representation of the current Subscription value.\n         */\n        toString(): string;\n    }\n\n    interface SubscriptionStatic {\n        /**\n         * Creates a new subscription object with the given virtual subscription and unsubscription time.\n         *\n         * @constructor\n         * @param {Number} subscribe Virtual time at which the subscription occurred.\n         * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n         */\n        new (subscribeAt: number, unsubscribeAt?: number): Subscription;\n    }\n\n    export var Subscription: SubscriptionStatic;\n\n    export interface Recorded {\n        /**\n         * Checks whether the given recorded object is equal to the current instance.\n         *\n         * @param {Recorded} other Recorded object to check for equality.\n         * @returns {Boolean} true if both objects are equal; false otherwise.\n         */\n        equals(other: Recorded): boolean;\n        /**\n         * Returns a string representation of the current Recorded value.\n         *\n         * @returns {String} String representation of the current Recorded value.\n         */\n        toString(): string;\n        time: number;\n        value: any;\n    }\n\n    interface RecordedStatic {\n        /**\n         * Creates a new object recording the production of the specified value at the given virtual time.\n         *\n         * @constructor\n         * @param {Number} time Virtual time the value was produced on.\n         * @param {Mixed} value Value that was produced.\n         * @param {Function} comparer An optional comparer.\n         */\n        new (time: number, value: any, equalityComparer?: _Comparer<any, boolean>): Recorded;\n    }\n\n    export var Recorded: RecordedStatic;\n\n    export var ReactiveTest: {\n        /** Default virtual time used for creation of observable sequences in unit tests. */\n        created: number;\n        /** Default virtual time used to subscribe to observable sequences in unit tests. */\n        subscribed: number;\n        /** Default virtual time used to dispose subscriptions in unit tests. */\n        disposed: number;\n\n        /**\n         * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n         *\n         * 1 - ReactiveTest.onNext(200, 42);\n         * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n         *\n         * @param ticks Recorded virtual time the OnNext notification occurs.\n         * @param value Recorded value stored in the OnNext notification or a predicate.\n         * @return Recorded OnNext notification.\n         */\n        onNext(ticks: number, value: any): Recorded;\n        /**\n         * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n         *\n         * 1 - ReactiveTest.onNext(200, 42);\n         * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n         *\n         * @param ticks Recorded virtual time the OnNext notification occurs.\n         * @param value Recorded value stored in the OnNext notification or a predicate.\n         * @return Recorded OnNext notification.\n         */\n        onNext(ticks: number, predicate: (value: any) => boolean): Recorded;\n        /**\n         * Factory method for an OnError notification record at a given time with a given error.\n         *\n         * 1 - ReactiveTest.onNext(200, new Error('error'));\n         * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n         *\n         * @param ticks Recorded virtual time the OnError notification occurs.\n         * @param exception Recorded exception stored in the OnError notification.\n         * @return Recorded OnError notification.\n         */\n        onError(ticks: number, exception: any): Recorded;\n        /**\n         * Factory method for an OnError notification record at a given time with a given error.\n         *\n         * 1 - ReactiveTest.onNext(200, new Error('error'));\n         * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n         *\n         * @param ticks Recorded virtual time the OnError notification occurs.\n         * @param exception Recorded exception stored in the OnError notification.\n         * @return Recorded OnError notification.\n         */\n        onError(ticks: number, predicate: (exception: any) => boolean): Recorded;\n        /**\n         * Factory method for an OnCompleted notification record at a given time.\n         *\n         * @param ticks Recorded virtual time the OnCompleted notification occurs.\n         * @return Recorded OnCompleted notification.\n         */\n        onCompleted(ticks: number): Recorded;\n\n        /**\n         * Factory method for a subscription record based on a given subscription and disposal time.\n         *\n         * @param start Virtual time indicating when the subscription was created.\n         * @param end Virtual time indicating when the subscription was disposed.\n         * @return Subscription object.\n         */\n        subscribe(subscribeAt: number, unsubscribeAt?: number): Subscription;\n    }\n\n    export interface MockObserver<T> extends Observer<T> {\n        messages: Recorded[];\n    }\n\n    interface MockObserverStatic extends ObserverStatic {\n        new <T>(scheduler: IScheduler): MockObserver<T>;\n    }\n\n    export var MockObserver: MockObserverStatic;\n\n\n    export interface TestScheduler extends VirtualTimeScheduler<number, number> {\n        /**\n         * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n         * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n         * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n         */\n        createColdObservable<T>(...records: Recorded[]): Observable<T>;\n        /**\n         * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n         * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n         * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n         */\n        createHotObservable<T>(...records: Recorded[]): Observable<T>;\n        /**\n         * Creates an observer that records received notification messages and timestamps those.\n         * @return Observer that can be used to assert the timing of received notifications.\n         */\n        createObserver<T>(): MockObserver<T>;\n\n        /**\n         * Creates a resolved promise with the given value and ticks\n         * @param {Number} ticks The absolute time of the resolution.\n         * @param {Any} value The value to yield at the given tick.\n         * @returns {MockPromise} A mock Promise which fulfills with the given value.\n         */\n        createResolvedPromise<T>(ticks: number, value: T): IPromise<T>;\n        /**\n         * Creates a rejected promise with the given reason and ticks\n         * @param {Number} ticks The absolute time of the resolution.\n         * @param {Any} reason The reason for rejection to yield at the given tick.\n         * @returns {MockPromise} A mock Promise which rejects with the given reason.\n         */\n        createRejectedPromise<T>(ticks: number, value: T): IPromise<T>;\n\n        /**\n         * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n         *\n         * @param create Factory method to create an observable sequence.\n         * @param created Virtual time at which to invoke the factory to create an observable sequence.\n         * @param subscribed Virtual time at which to subscribe to the created observable sequence.\n         * @param disposed Virtual time at which to dispose the subscription.\n         * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n         */\n        startWithTiming<T>(create: () => Observable<T>, createdAt: number, subscribedAt: number, disposedAt: number): MockObserver<T>;\n        /**\n         * Starts the test scheduler and uses the specified virtual time to dispose the subscription to the sequence obtained through the factory function.\n         * Default virtual times are used for factory invocation and sequence subscription.\n         *\n         * @param create Factory method to create an observable sequence.\n         * @param disposed Virtual time at which to dispose the subscription.\n         * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n         */\n        startWithDispose<T>(create: () => Observable<T>, disposedAt: number): MockObserver<T>;\n        /**\n         * Starts the test scheduler and uses default virtual times to invoke the factory function, to subscribe to the resulting sequence, and to dispose the subscription.\n         *\n         * @param create Factory method to create an observable sequence.\n         * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n         */\n        startWithCreate<T>(create: () => Observable<T>): MockObserver<T>;\n    }\n\n    export var TestScheduler: {\n        new (): TestScheduler;\n    }\n\n}\ndeclare module \"rx.core.testing\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.d.ts",
    "content": "declare module Rx {\n\n    // Type alias for observables and promises\n    export type ObservableOrPromise<T> = IObservable<T> | Observable<T> | Promise<T>;\n\n    export type ArrayLike<T> = Array<T> | { length: number;[index: number]: T; };\n\n    // Type alias for arrays and array like objects\n    export type ArrayOrIterable<T> = ArrayLike<T>;\n\n    /**\n     * Promise A+\n     */\n    export interface Promise<T> {\n        then<R>(onFulfilled: (value: T) => R|Promise<R>, onRejected: (error: any) => Promise<R>): Promise<R>;\n        then<R>(onFulfilled: (value: T) => R|Promise<R>, onRejected?: (error: any) => R): Promise<R>;\n    }\n\n    /**\n     * Promise A+\n     */\n    export interface IPromise<T> extends Promise<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface IObservable<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface Observable<T> extends IObservable<T> { }\n\n    export module internals {\n        export interface EmptyError extends Error { message: string; }\n        export interface EmptyErrorStatic { new (): EmptyError; }\n\n        export interface ObjectDisposedError extends Error { message: string; }\n        export interface ObjectDisposedErrorStatic { new (): ObjectDisposedError; }\n\n        export interface ArgumentOutOfRangeError extends Error { message: string; }\n        export interface ArgumentOutOfRangeErrorStatic { new (): ArgumentOutOfRangeError; }\n\n        export interface NotSupportedError extends Error { message: string; }\n        export interface NotSupportedErrorStatic { new (): NotSupportedError; }\n\n        export interface NotImplementedError extends Error { message: string; }\n        export interface NotImplementedErrorStatic { new (): NotImplementedError; }\n    }\n\n    export module helpers {\n        export var notImplemented: () => internals.NotImplementedError;\n        export var notSupported: () => internals.NotSupportedError;\n    }\n\n    export module internals {\n        export var bindCallback: (func: Function, thisArg: any, argCount: number) => Function;\n    }\n\n    export module internals {\n        export var isEqual : (left: any, right: any) => boolean;\n    }\n\n    export interface IDisposable {\n        dispose(): void;\n    }\n\n    export interface Disposable extends IDisposable {\n        /** Is this value disposed. */\n        isDisposed?: boolean;\n    }\n\n    interface DisposableStatic {\n        /**\n         * Provides a set of static methods for creating Disposables.\n         * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n         */\n        new (action: () => void): Disposable;\n\n        /**\n         * Creates a disposable object that invokes the specified action when disposed.\n         * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n         * @return {Disposable} The disposable object that runs the given action upon disposal.\n         */\n        create(action: () => void): Disposable;\n\n        /**\n         * Gets the disposable that does nothing when disposed.\n         */\n        empty: IDisposable;\n\n        /**\n         * Validates whether the given object is a disposable\n         * @param {Object} Object to test whether it has a dispose method\n         * @returns {Boolean} true if a disposable object, else false.\n         */\n        isDisposable(d: any): boolean;\n    }\n\n    /**\n     * Provides a set of static methods for creating Disposables.\n     * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n     */\n    export var Disposable: DisposableStatic;\n\n    export module config {\n        export var Promise: { new <T>(resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): IPromise<T>; };\n    }\n\n    export module helpers {\n        export var noop: () => void;\n        export var notDefined: (value: any) => boolean;\n        export var identity: <T>(value: T) => T;\n        export var defaultNow: () => number;\n        export var defaultComparer: (left: any, right: any) =>  boolean;\n        export var defaultSubComparer: (left: any, right: any) =>  number;\n        export var defaultKeySerializer: (key: any) =>  string;\n        export var defaultError: (err: any) =>  void;\n        export var isPromise: (p: any) =>  boolean;\n        export var asArray: <T>(...args: T[]) =>  T[];\n        export var not: (value: any) =>  boolean;\n        export var isFunction: (value: any) =>  boolean;\n    }\n\n    export type _Selector<T, TResult> = (value: T, index: number, observable: Observable<T>) => TResult;\n    export type _ValueOrSelector<T, TResult> = TResult | _Selector<T, TResult>;\n    export type _Predicate<T> = _Selector<T, boolean>;\n    export type _Comparer<T, TResult> = (value1: T, value2: T) => TResult;\n    export type _Accumulator<T, TAcc> = (acc: TAcc, value: T) => TAcc;\n\n    export module special {\n        export type _FlatMapResultSelector<T1, T2, TResult> = (value: T1, selectorValue: T2, index: number, selectorOther: number) => TResult;\n    }\n\n    export interface IObservable<T> {\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(observer: IObserver<T>): IDisposable;\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(observer: IObserver<T>): IDisposable;\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n\n        /**\n        * Subscribes to the next value in the sequence with an optional \"this\" argument.\n        * @param {Function} onNext The function to invoke on each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnNext(onNext: (value: T) => void, thisArg?: any): IDisposable;\n        /**\n        * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n        * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnError(onError: (exception: any) => void, thisArg?: any): IDisposable;\n        /**\n        * Subscribes to the next value in the sequence with an optional \"this\" argument.\n        * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnCompleted(onCompleted: () => void, thisArg?: any): IDisposable;\n\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        forEach(observer: IObserver<T>): IDisposable;\n\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        forEach(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Determines whether the given object is an Observable\n        * @param {Any} An object to determine whether it is an Observable\n        * @returns {Boolean} true if an Observable, else false.\n        */\n        isObservable(o: any): boolean;\n    }\n\n    export var Observable: ObservableStatic;\n\n    export module internals {\n        export var inherits: (child: any, parent: any) => void;\n        export var addProperties: (obj: any, ...sources: any[]) => void;\n        export var addRef: <T>(xs: Observable<T>, r: { getDisposable(): IDisposable; }) => Observable<T>;\n    }\n\n    /**\n     * Represents a group of disposable resources that are disposed together.\n     * @constructor\n     */\n    export interface CompositeDisposable extends Disposable {\n        /**\n         * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n         * @param {Mixed} item Disposable to add.\n         */\n        add(item: IDisposable): void;\n\n        /**\n         * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n         * @param {Mixed} item Disposable to remove.\n         * @returns {Boolean} true if found; false otherwise.\n         */\n        remove(item: IDisposable): void;\n    }\n\n    interface CompositeDisposableStatic {\n        /**\n         * Represents a group of disposable resources that are disposed together.\n         * @constructor\n         */\n        new (...disposables: Rx.IDisposable[]): CompositeDisposable;\n        /**\n         * Represents a group of disposable resources that are disposed together.\n         * @constructor\n         */\n        new(disposables: Rx.IDisposable[]): CompositeDisposable;\n    }\n\n    export var CompositeDisposable: CompositeDisposableStatic;\n\n    export interface SingleAssignmentDisposable {\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        getDisposable(): IDisposable;\n\n        setDisposable(value: IDisposable): void;\n    }\n\n    interface SingleAssignmentDisposableStatic {\n        new() : SingleAssignmentDisposable;\n    }\n\n    export var SingleAssignmentDisposable : SingleAssignmentDisposableStatic;\n\n    export interface SerialDisposable {\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        getDisposable(): IDisposable;\n\n        setDisposable(value: IDisposable): void;\n    }\n\n    interface SerialDisposableStatic {\n        new() : SerialDisposable;\n    }\n\n    export var SerialDisposable : SerialDisposableStatic;\n\n    /**\n     * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n     */\n    export interface RefCountDisposable extends Disposable {\n\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        /**\n         * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n         * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n         */\n        getDisposable(): IDisposable;\n    }\n\n    interface RefCountDisposableStatic {\n        /**\n         * Initializes a new instance of the RefCountDisposable with the specified disposable.\n         * @constructor\n         * @param {Disposable} disposable Underlying disposable.\n         */\n        new(disposable: IDisposable): RefCountDisposable;\n    }\n\n    export var RefCountDisposable : RefCountDisposableStatic;\n\n    export interface IScheduler {\n        /** Gets the current time according to the local machine's system clock. */\n        now(): number;\n\n        /**\n          * Schedules an action to be executed.\n          * @param state State passed to the action to be executed.\n          * @param {Function} action Action to be executed.\n          * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n          */\n        schedule<TState>(state: TState, action: (scheduler: IScheduler, state: TState) => IDisposable): IDisposable;\n\n        /**\n         * Schedules an action to be executed after dueTime.\n         * @param state State passed to the action to be executed.\n         * @param {Function} action Action to be executed.\n         * @param {Number} dueTime Relative time after which to execute the action.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleFuture<TState>(state: TState, dueTime: number | Date, action: (scheduler: IScheduler, state: TState) => IDisposable): IDisposable;\n    }\n\n    export interface SchedulerStatic {\n        /** Gets the current time according to the local machine's system clock. */\n        now(): number;\n\n        /**\n         * Normalizes the specified TimeSpan value to a positive value.\n         * @param {Number} timeSpan The time span value to normalize.\n         * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n         */\n        normalize(timeSpan: number): number;\n\n        /** Determines whether the given object is a scheduler */\n        isScheduler(s: any): boolean;\n    }\n\n    /** Provides a set of static properties to access commonly used schedulers. */\n    export var Scheduler: SchedulerStatic;\n\n    export module internals {\n        export interface ScheduledItem<TTime> {\n            scheduler: IScheduler;\n            state: TTime;\n            action: (scheduler: IScheduler, state: any) => IDisposable;\n            dueTime: TTime;\n            comparer: (x: TTime, y: TTime) => number;\n            disposable: SingleAssignmentDisposable;\n\n            invoke(): void;\n            compareTo(other: ScheduledItem<TTime>): number;\n            isCancelled(): boolean;\n            invokeCore(): IDisposable;\n        }\n\n        interface ScheduledItemStatic {\n            new <TTime>(scheduler: IScheduler, state: any, action: (scheduler: IScheduler, state: any) => IDisposable, dueTime: TTime, comparer?: _Comparer<TTime, number>):ScheduledItem<TTime>;\n        }\n\n        export var ScheduledItem: ScheduledItemStatic\n    }\n\n    export interface IScheduler {\n        /**\n         * Schedules an action to be executed recursively.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleRecursive<TState>(state: TState, action: (state: TState, action: (state: TState) => void) => void): IDisposable;\n\n        /**\n         * Schedules an action to be executed recursively after a specified relative due time.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n         * @param {Number}dueTime Relative time after which to execute the action for the first time.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleRecursiveFuture<TState, TTime extends number | Date>(state: TState, dueTime: TTime, action: (state: TState, action: (state: TState, dueTime: TTime) => void) => void): IDisposable;\n    }\n\n    export interface IScheduler {\n        /**\n         * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n         * @param {Mixed} state Initial state passed to the action upon the first iteration.\n         * @param {Number} period Period for running the work periodically.\n         * @param {Function} action Action to be executed, potentially updating the state.\n         * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n         */\n        schedulePeriodic<TState>(state: TState, period: number, action: (state: TState) => TState): IDisposable;\n    }\n\n    export interface IScheduler {\n        /**\n         * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n         * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n         * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n         */\n        catch(handler: Function): IScheduler;\n    }\n\n    export module internals {\n        export interface SchedulePeriodicRecursive {\n            start(): IDisposable;\n        }\n\n        interface SchedulePeriodicRecursiveStatic {\n            new (scheduler: any, state: any, period: any, action: any) : SchedulePeriodicRecursive;\n        }\n\n        export var SchedulePeriodicRecursive: SchedulePeriodicRecursiveStatic;\n    }\n\n    export interface SchedulerStatic {\n        immediate: IScheduler;\n    }\n\n    export interface ICurrentThreadScheduler extends IScheduler {\n        scheduleRequired(): boolean;\n    }\n\n    export interface SchedulerStatic {\n        currentThread: ICurrentThreadScheduler;\n    }\n\n    export interface SchedulerStatic {\n        default: IScheduler;\n        async: IScheduler;\n    }\n\n    export module internals {\n        // Priority Queue for Scheduling\n        export interface PriorityQueue<TTime> {\n            length: number;\n\n            isHigherPriority(left: number, right: number): boolean;\n            percolate(index: number): void;\n            heapify(index: number): void;\n            peek(): ScheduledItem<TTime>;\n            removeAt(index: number): void;\n            dequeue(): ScheduledItem<TTime>;\n            enqueue(item: ScheduledItem<TTime>): void;\n            remove(item: ScheduledItem<TTime>): boolean;\n        }\n\n        interface PriorityQueueStatic {\n                new <T>(capacity: number) : PriorityQueue<T>;\n                count: number;\n        }\n\n        export var PriorityQueue : PriorityQueueStatic;\n    }\n\n    /**\n    * Supports push-style iteration over an observable sequence.\n    */\n    export interface IObserver<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n    \n    export interface Observer<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n\n    export interface ObserverStatic {\n        /**\n        *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n        * @param {Function} [onNext] Observer's OnNext action implementation.\n        * @param {Function} [onError] Observer's OnError action implementation.\n        * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n        * @returns {Observer} The observer object implemented using the given actions.\n        */\n        create<T>(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observer<T>;\n    }\n\n    /**\n    * Supports push-style iteration over an observable sequence.\n    */\n    export var Observer: ObserverStatic;\n\n    /**\n     *  Represents a notification to an observer.\n     */\n    export interface Notification<T> {\n        /**\n         * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n         *\n         * @memberOf Notification\n         * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n         * @param {Function} onError Delegate to invoke for an OnError notification.\n         * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n         * @returns {Any} Result produced by the observation.\n         */\n        accept(observer: IObserver<T>): void;\n        /**\n         * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n         *\n         * @memberOf Notification\n         * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n         * @param {Function} onError Delegate to invoke for an OnError notification.\n         * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n         * @returns {Any} Result produced by the observation.\n         */\n        accept<TResult>(onNext: (value: T) => TResult, onError: (exception: any) => TResult, onCompleted: () => TResult): TResult;\n\n        /**\n         * Returns an observable sequence with a single notification.\n         *\n         * @memberOf Notifications\n         * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n         * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n         */\n        toObservable(scheduler?: IScheduler): Observable<T>;\n\n        hasValue: boolean;\n        equals(other: Notification<T>): boolean;\n        kind: string;\n        value: T;\n        error: any;\n    }\n\n    interface NotificationStatic {\n        new <T>(kind: any, value: any, exception: any, accept: any, acceptObservable: any, toString: any) : Notification<T>;\n\n        /**\n        * Creates an object that represents an OnNext notification to an observer.\n        * @param {Any} value The value contained in the notification.\n        * @returns {Notification} The OnNext notification containing the value.\n        */\n        createOnNext<T>(value: T): Notification<T>;\n        /**\n        * Creates an object that represents an OnError notification to an observer.\n        * @param {Any} error The exception contained in the notification.\n        * @returns {Notification} The OnError notification containing the exception.\n        */\n        createOnError<T>(exception: any): Notification<T>;\n        /**\n        * Creates an object that represents an OnCompleted notification to an observer.\n        * @returns {Notification} The OnCompleted notification.\n        */\n        createOnCompleted<T>(): Notification<T>;\n    }\n\n    export var Notification : NotificationStatic;\n\n\texport interface Observer<T> {\n        makeSafe(disposable: IDisposable): Observer<T>;\n\t}\n\n    export module internals {\n        /**\n        * Abstract base class for implementations of the Observer class.\n        * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n        */\n        export interface AbstractObserver<T> extends Rx.IObserver<T>, Rx.IDisposable {\n            /**\n            * Notifies the observer of a new element in the sequence.\n            * @param {Any} value Next element in the sequence.\n            */\n            onNext(value: T): void;\n            /**\n            * Notifies the observer that an exception has occurred.\n            * @param {Any} error The error that has occurred.\n            */\n            onError(exception: any): void;\n            /**\n            * Notifies the observer of the end of the sequence.\n            */\n            onCompleted(): void;\n\n            isStopped: boolean;\n\n            /**\n            * Disposes the observer, causing it to transition to the stopped state.\n            */\n            dispose(): void;\n\n            fail(e: any): boolean;\n\n            // Must be implemented by other observers\n            next(value: T): void;\n            error(error: any): void;\n            completed(): void;\n        }\n\n        interface AbstractObserverStatic {\n            new <T>(): AbstractObserver<T>;\n        }\n\n        export var AbstractObserver: AbstractObserverStatic\n    }\n\n    /**\n     * Class to create an Observer instance from delegate-based implementations of the on* methods.\n     */\n    export interface AnonymousObserver<T> extends Observer<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n\n    interface AnonymousObserverStatic {\n        /**\n         * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n         * @param {Any} onNext Observer's OnNext action implementation.\n         * @param {Any} onError Observer's OnError action implementation.\n         * @param {Any} onCompleted Observer's OnCompleted action implementation.\n         */\n        new <T>(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): AnonymousObserver<T>;\n    }\n\n    export var AnonymousObserver : AnonymousObserverStatic;\n\n    export interface CheckedObserver<T> extends Observer<T> {\n        checkAccess(): void;\n    }\n\n    export module internals {\n        export interface ScheduledObserver<T> extends Observer<T> {\n            ensureActive(): void;\n        }\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n        *\n        *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n        *  that require to be run on a scheduler, use subscribeOn.\n        *\n        *  @param {Scheduler} scheduler Scheduler to notify observers on.\n        *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n        */\n        observeOn(scheduler: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n        *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n        *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n        *  callbacks on a scheduler, use observeOn.\n\n        *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n        *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n        */\n        subscribeOn(scheduler: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Converts a Promise to an Observable sequence\n        * @param {Promise} An ES6 Compliant promise.\n        * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n        */\n \t\tfromPromise<T>(promise: Promise<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /*\n         * Converts an existing observable sequence to an ES6 Compatible Promise\n         * @example\n         * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n         *\n         * // With config\n         * Rx.config.Promise = RSVP.Promise;\n         * var promise = Rx.Observable.return(42).toPromise();\n         * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n         * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n         */\n        toPromise(promiseCtor?: { new (resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): IPromise<T>; }): IPromise<T>;\n        /*\n         * Converts an existing observable sequence to an ES6 Compatible Promise\n         * @example\n         * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n         *\n         * // With config\n         * Rx.config.Promise = RSVP.Promise;\n         * var promise = Rx.Observable.return(42).toPromise();\n         * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n         * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n         */\n        toPromise<TPromise extends IPromise<T>>(promiseCtor: { new (resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): TPromise; }): TPromise;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Creates an array from an observable sequence.\n        * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n        */\n        toArray(): Observable<T[]>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Creates an observable sequence from a specified subscribe method implementation.\n        * @example\n        *  var res = Rx.Observable.create(function (observer) { return function () { } );\n        *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n        *  var res = Rx.Observable.create(function (observer) { } );\n        * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n        * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n        */\n        create<T>(subscribe: (observer: Observer<T>) => IDisposable | Function | void): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n          *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n          *\n          * @example\n          *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n          * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n          * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n          */\n        defer<T>(observableFactory: () => ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n  *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n  *\n  * @example\n  *  var res = Rx.Observable.empty();\n  *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n  * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n  * @returns {Observable} An observable sequence with no elements.\n  */\n        empty<T>(scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * This method creates a new Observable sequence from an array-like or iterable object.\n         * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n         * @param {Function} [mapFn] Map function to call on every element of the array.\n         * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n         * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n         */\n        from<T>(array: ArrayOrIterable<T>): Observable<T>;\n        /**\n         * This method creates a new Observable sequence from an array-like or iterable object.\n         * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n         * @param {Function} [mapFn] Map function to call on every element of the array.\n         * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n         * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n         */\n        from<T, TResult>(array: ArrayOrIterable<T>, mapFn: (value: T, index: number) => TResult, thisArg?: any, scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n         * @deprecated use Observable.from or Observable.of\n         * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n         * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n         */\n        fromArray<T>(array: ArrayLike<T>, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n         *\n         * @example\n         *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n         *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n         * @param {Mixed} initialState Initial state.\n         * @param {Function} condition Condition to terminate generation (upon returning false).\n         * @param {Function} iterate Iteration step function.\n         * @param {Function} resultSelector Selector function for results produced in the sequence.\n         * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n         * @returns {Observable} The generated sequence.\n         */\n        generate<TState, TResult>(initialState: TState, condition: (state: TState) => boolean, iterate: (state: TState) => TState, resultSelector: (state: TState) => TResult, scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n        * @returns {Observable} An observable sequence whose observers will never get called.\n        */\n        never<T>(): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n        * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n        */\n        of<T>(...values: T[]): Observable<T>;\n\n        /**\n        *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n        * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n        * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n        */\n        ofWithScheduler<T>(scheduler?: IScheduler, ...values: T[]): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Convert an object into an observable sequence of [key, value] pairs.\n        * @param {Object} obj The object to inspect.\n        * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n        * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n        */\n        pairs<T>(obj: { [key: string]: T }, scheduler?: IScheduler): Observable<[string, T]>;\n        /**\n        * Convert an object into an observable sequence of [key, value] pairs.\n        * @param {Object} obj The object to inspect.\n        * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n        * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n        */\n        pairs<T>(obj: { [key: number]: T }, scheduler?: IScheduler): Observable<[number, T]>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n        *\n        * @example\n        *  var res = Rx.Observable.range(0, 10);\n        *  var res = Rx.Observable.range(0, 10, Rx.Scheduler.timeout);\n        * @param {Number} start The value of the first integer in the sequence.\n        * @param {Number} count The number of sequential integers to generate.\n        * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n        * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n        */\n        range(start: number, count: number, scheduler?: IScheduler): Observable<number>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n         *\n         * @example\n         *  var res = Rx.Observable.repeat(42);\n         *  var res = Rx.Observable.repeat(42, 4);\n         *  3 - res = Rx.Observable.repeat(42, 4, Rx.Scheduler.timeout);\n         *  4 - res = Rx.Observable.repeat(42, null, Rx.Scheduler.timeout);\n         * @param {Mixed} value Element to repeat.\n         * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n         * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n         * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n         */\n        repeat<T>(value: T, repeatCount?: number | void, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n        *  There is an alias called 'just' or browsers <IE9.\n        * @param {Mixed} value Single element in the resulting observable sequence.\n        * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} An observable sequence containing the single specified element.\n        */\n        return<T>(value: T, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n        *  There is an alias called 'just' or browsers <IE9.\n        * @param {Mixed} value Single element in the resulting observable sequence.\n        * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} An observable sequence containing the single specified element.\n        */\n        just<T>(value: T, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n        * @param {Mixed} error An object used for the sequence's termination.\n        * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n        */\n        throw<T>(exception: Error, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n        * @param {Mixed} error An object used for the sequence's termination.\n        * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n        */\n        throw<T>(exception: any, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n         * @param {Function} resourceFactory Factory function to obtain a resource object.\n         * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n         * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n         */\n        using<TSource, TResource extends IDisposable>(resourceFactory: () => TResource, observableFactory: (resource: TResource) => Observable<TSource>): Observable<TSource>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @param {Observable} rightSource Second observable sequence or Promise.\n        * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n        */\n        amb(observable: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n        */\n        amb<T>(observables: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n        */\n        amb<T>(...observables: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n        * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n        */\n        catch(handler: (exception: any) => ObservableOrPromise<T>): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n        * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n        */\n        catch(second: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n        * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n        */\n        catch<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n        * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n        */\n        catch<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther, TResult>(sources: ObservableOrPromise<TOther>[], resultSelector: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2>(second: ObservableOrPromise<T2>): Observable<[T, T2]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>): Observable<[T, T2, T3]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>): Observable<[T, T2, T3, T4]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>): Observable<[T, T2, T3, T4, T5]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>): Observable<[T, T2, T3, T4, T5, T6]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>): Observable<[T, T2, T3, T4, T5, T6, T7]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>): Observable<[T, T2, T3, T4, T5, T6, T7, T8]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, T9>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>): Observable<[T, T2, T3, T4, T5, T6, T7, T8, T9]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther>(sources: ObservableOrPromise<TOther>[]): Observable<TOther[]>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, eventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, T9, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther, TResult>(sources: ObservableOrPromise<TOther>[], resultSelector: (...otherValues: TOther[]) => TResult): Observable<TResult>;\n\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>): Observable<[T, T2]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>): Observable<[T, T2, T3]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>): Observable<[T, T2, T3, T4]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>): Observable<[T, T2, T3, T4, T5]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>): Observable<[T, T2, T3, T4, T5, T6]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>): Observable<[T, T2, T3, T4, T5, T6, T7]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>): Observable<[T, T2, T3, T4, T5, T6, T7, T8]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, T9>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>): Observable<[T, T2, T3, T4, T5, T6, T7, T8, T9]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<TOther>(sources: ObservableOrPromise<TOther>[]): Observable<TOther[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat(...sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Concatenates all the observable sequences.\n        * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Concatenates all the observable sequences.\n        * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n          * Concatenates an observable sequence of observable sequences.\n          * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n          */\n        concatAll(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n        * Or merges two observable sequences into a single observable sequence.\n        *\n        * @example\n        * 1 - merged = sources.merge(1);\n        * 2 - merged = source.merge(otherSource);\n        * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        merge(maxConcurrent: number): T;\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n        * Or merges two observable sequences into a single observable sequence.\n        *\n        * @example\n        * 1 - merged = sources.merge(1);\n        * 2 - merged = source.merge(otherSource);\n        * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        merge(other: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(scheduler: IScheduler, ...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(scheduler: IScheduler, sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n        * receive all successfully emitted items from all of the source Observables without being interrupted by\n        * an error notification from one of them.\n        *\n        * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n        * error via the Observer's onError, mergeDelayError will refrain from propagating that\n        * error notification until all of the merged Observables have finished emitting items.\n        * @param {Array | Arguments} args Arguments or an array to merge.\n        * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n        */\n        mergeDelayError<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n        * receive all successfully emitted items from all of the source Observables without being interrupted by\n        * an error notification from one of them.\n        *\n        * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n        * error via the Observer's onError, mergeDelayError will refrain from propagating that\n        * error notification until all of the merged Observables have finished emitting items.\n        * @param {Array | Arguments} args Arguments or an array to merge.\n        * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n        */\n        mergeDelayError<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        mergeAll(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n        * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n        */\n        onErrorResumeNext(second: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        *\n        * @example\n        * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);\n        * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);\n        * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n        */\n        onErrorResumeNext<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        *\n        * @example\n        * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);\n        * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);\n        * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n        */\n        onErrorResumeNext<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n        * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n        * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n        */\n        skipUntil<T2>(other: ObservableOrPromise<T2>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        switch(): T;\n        /**\n        * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        switchLatest(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the values from the source observable sequence until the other observable sequence produces a value.\n        * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n        * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n        */\n        takeUntil<T2>(other: ObservableOrPromise<T2>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<TOther, TResult>(souces: ObservableOrPromise<TOther>[], resultSelector: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, TResult>(sources: ObservableOrPromise<T2>[], resultSelector?: (item1: T1, ...right: T2[]) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, TResult>(source1: ObservableOrPromise<T1>, ObservableOrPromise: Observable<T2>, resultSelector?: (item1: T1, item2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, resultSelector?: (item1: T1, item2: T2, item3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, TResult>(source1: Observable<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, T8, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, source8: ObservableOrPromise<T8>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, source8: ObservableOrPromise<T8>, source9: ObservableOrPromise<T9>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8, item9: T9) => TResult): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector?: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector?: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<TOther, TResult>(souces: ObservableOrPromise<TOther>[], resultSelector?: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n        * @param arguments Observable sources.\n        * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n        */\n        zipIterable<T>(...sources: Observable<T>[]): Observable<T[]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n        * @param arguments Observable sources.\n        * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n        */\n        zipIterable<T>(sources: Observable<T>[]): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n       *  Hides the identity of an observable sequence.\n       * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n       */\n        asObservable(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n        * @param {Number} count Length of each buffer.\n        * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithCount(count: number, skip?: number): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n        * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n        */\n        dematerialize<TOrigin>(): Observable<TOrigin>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.\n        *\n        *  var obs = observable.distinctUntilChanged();\n        *  var obs = observable.distinctUntilChanged(function (x) { return x.id; });\n        *  var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; });\n        *\n        * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value.\n        * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n        * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n        */\n        distinctUntilChanged<TValue>(keySelector?: (value: T) => TValue, comparer?: _Comparer<TValue, boolean>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        do(observer: Observer<T>): Observable<T>;\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tap(observer: Observer<T>): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        do(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observable<T>;\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tap(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onNext Action to invoke for each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnNext(onNext: (value: T) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnError(onError: (exception: any) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon graceful termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnCompleted(onCompleted: () => void, thisArg?: any): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onNext Action to invoke for each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnNext(onNext: (value: T) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnError(onError: (exception: any) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon graceful termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnCompleted(onCompleted: () => void, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n        * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n        * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n        */\n        finally(action: () => void): Observable<T>;\n\n        /**\n        *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n        * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n        * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n        */\n        ensure(action: () => void): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Ignores all elements in an observable sequence leaving only the termination messages.\n        * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n        */\n        ignoreElements(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n        * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n        */\n        materialize(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n         * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n         * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n         */\n        repeat(repeatCount?: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n        *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n        *\n        * @example\n        *  var res = retried = retry.repeat();\n        *  var res = retried = retry.repeat(2);\n        * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n        * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n        */\n        retry(retryCount?: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         *  Repeats the source observable sequence upon error each time the notifier emits or until it successfully terminates.\n         *  if the notifier completes, the observable sequence completes.\n         *\n         * @example\n         *  var timer = Observable.timer(500);\n         *  var source = observable.retryWhen(timer);\n         * @param {Observable} [notifier] An observable that triggers the retries or completes the observable with onNext or onCompleted respectively.\n         * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n         */\n        retryWhen(notifier: (errors: Observable<any>) => Observable<any>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n        *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n        * @example\n        *  var res = source.scan(function (acc, x) { return acc + x; });\n        *  var res = source.scan(function (acc, x) { return acc + x; }, 0);\n        * @param {Function} accumulator An accumulator function to be invoked on each element.\n        * @param {Mixed} [seed] The initial accumulator value.\n        * @returns {Observable} An observable sequence containing the accumulated values.\n        */\n        scan<TAcc>(accumulator: _Accumulator<T, TAcc>, seed?: TAcc): Observable<TAcc>;\n        /**\n        *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n        *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n        * @example\n        *  var res = source.scan(function (acc, x) { return acc + x; });\n        *  var res = source.scan(function (acc, x) { return acc + x; }, 0);\n        * @param {Function} accumulator An accumulator function to be invoked on each element.\n        * @param {Mixed} [seed] The initial accumulator value.\n        * @returns {Observable} An observable sequence containing the accumulated values.\n        */\n        scan(accumulator: _Accumulator<T, T>, seed?: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Bypasses a specified number of elements at the end of an observable sequence.\n        * @description\n        *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n        *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n        * @param count Number of elements to bypass at the end of the source sequence.\n        * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n        */\n        skipLast(count: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n        *  @example\n        *  var res = source.startWith(1, 2, 3);\n        *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n        * @param {Arguments} args The specified values to prepend to the observable sequence\n        * @returns {Observable} The source sequence prepended with the specified values.\n        */\n        startWith(...values: T[]): Observable<T>;\n        /**\n        *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n        *  @example\n        *  var res = source.startWith(1, 2, 3);\n        *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n        * @param {Arguments} args The specified values to prepend to the observable sequence\n        * @returns {Observable} The source sequence prepended with the specified values.\n        */\n        startWith(scheduler: IScheduler, ...values: T[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns a specified number of contiguous elements from the end of an observable sequence.\n        * @description\n        *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n        *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n        * @param {Number} count Number of elements to take from the end of the source sequence.\n        * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n        */\n        takeLast(count: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n        *\n        * @description\n        *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n        *  source sequence, this buffer is produced on the result sequence.\n        * @param {Number} count Number of elements to take from the end of the source sequence.\n        * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n        */\n        takeLastBuffer(count: number): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n        *\n        *  var res = xs.windowWithCount(10);\n        *  var res = xs.windowWithCount(10, 1);\n        * @param {Number} count Length of each window.\n        * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithCount(count: number, skip?: number): Observable<Observable<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        concatMapObserver<T, TResult>(onNext: (value: T, i: number) => ObservableOrPromise<TResult>, onError: (error: any) => ObservableOrPromise<any>, onCompleted: () => ObservableOrPromise<any>, thisArg?: any): Observable<TResult>;\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        selectConcatObserver<T, TResult>(onNext: (value: T, i: number) => ObservableOrPromise<TResult>, onError: (error: any) => ObservableOrPromise<any>, onCompleted: () => ObservableOrPromise<any>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n        *\n        *  var res = obs = xs.defaultIfEmpty();\n        *  2 - obs = xs.defaultIfEmpty(false);\n        *\n        * @memberOf Observable#\n        * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n        * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n        */\n        defaultIfEmpty(defaultValue?: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n        *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n        *\n        * @example\n        *  var res = obs = xs.distinct();\n        *  2 - obs = xs.distinct(function (x) { return x.id; });\n        *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n        * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n        * @param {Function} [comparer]  Used to compare items in the collection.\n        * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n        */\n        distinct<TKey>(keySelector?: (value: T) => TKey, comparer?: _Comparer<TKey, boolean>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Projects each element of an observable sequence into a new form by incorporating the element's index.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n        */\n        select<TResult>(selector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        * Projects each element of an observable sequence into a new form by incorporating the element's index.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n        */\n        map<TResult>(selector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Retrieves the value of a specified nested property from all elements in\n        * the Observable sequence.\n        * @param {Arguments} arguments The nested properties to pluck.\n        * @returns {Observable} Returns a new Observable sequence of property values.\n        */\n        pluck<TResult>(prop: string): Observable<TResult>;\n        pluck<TResult>(...props: string[]): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        selectManyObserver<T2, T3, T4>(onNext: (value: T, index: number) => Observable<T2>, onError: (exception: any) => Observable<T3>, onCompleted: () => Observable<T4>, thisArg?: any): Observable<T2 | T3 | T4>;\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        flatMapObserver<T2, T3, T4>(onNext: (value: T, index: number) => Observable<T2>, onError: (exception: any) => Observable<T3>, onCompleted: () => Observable<T4>, thisArg?: any): Observable<T2 | T3 | T4>;\n    }\n\n\n    export interface Observable<T> {\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n        * @param {Number} count The number of elements to skip before returning the remaining elements.\n        * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n        */\n        skip(count: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n        *  The element's index is used in the logic of the predicate function.\n        *\n        *  var res = source.skipWhile(function (value) { return value < 10; });\n        *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n        */\n        skipWhile(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n        *\n        *  var res = source.take(5);\n        *  var res = source.take(0, Rx.Scheduler.timeout);\n        * @param {Number} count The number of elements to return.\n        * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n        * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n        */\n        take(count: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns elements from an observable sequence as long as a specified condition is true.\n        *  The element's index is used in the logic of the predicate function.\n        * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n        */\n        takeWhile(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n        *\n        * @example\n        *  var res = source.where(function (value) { return value < 10; });\n        *  var res = source.where(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n        */\n        where(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n        /**\n        *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n        *\n        * @example\n        *  var res = source.where(function (value) { return value < 10; });\n        *  var res = source.where(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n        */\n        filter(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Executes a transducer to transform the observable sequence\n         * @param {Transducer} transducer A transducer to execute\n         * @returns {Observable} An Observable sequence containing the results from the transducer.\n         */\n        transduce(transducer: any): any;\n        //TODO: Setup transducer\n    }\n\n    export interface AnonymousObservable<T> extends Observable<T> { }\n\n    /**\n     *  Represents an object that is both an observable sequence as well as an observer.\n     *  Each notification is broadcasted to all subscribed observers.\n     */\n    export interface ISubject<T> extends IObservable<T>, IObserver<T>, IDisposable {\n        hasObservers(): boolean;\n    }\n\n    export interface Subject<T> extends Observable<T>, Observer<T>, IDisposable {\n        hasObservers(): boolean;\n        /** Is this value disposed. */\n        isDisposed: boolean;\n    }\n\n    interface SubjectStatic {\n        /**\n         * Creates a subject.\n         */\n        new <T>(): Subject<T>;\n\n        /**\n         * Creates a subject from the specified observer and observable.\n         * @param {Observer} observer The observer used to send messages to the subject.\n         * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n         * @returns {Subject} Subject implemented using the given observer and observable.\n         */\n        create<T>(observer?: IObserver<T>, observable?: IObservable<T>): Subject<T>;\n    }\n\n    /**\n     *  Represents an object that is both an observable sequence as well as an observer.\n     *  Each notification is broadcasted to all subscribed observers.\n     */\n    export var Subject: SubjectStatic;\n\n    export interface AsyncSubject<T> extends Subject<T> { }\n\n    interface AsyncSubjectStatic {\n        /**\n         * Creates a subject that can only receive one value and that value is cached for all future observations.\n         * @constructor\n         */\n        new <T>(): AsyncSubject<T>;\n    }\n\n    /**\n     *  Represents the result of an asynchronous operation.\n     *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n     */\n    export var AsyncSubject: AsyncSubjectStatic;\n\n    export interface AnonymousSubject<T> extends Subject<T> { }\n\n    interface AnonymousSubjectStatic {\n        /**\n         * Creates a subject that can only receive one value and that value is cached for all future observations.\n         * @constructor\n         */\n        new <T>(): AnonymousSubject<T>;\n    }\n\n    /**\n     *  Represents the result of an asynchronous operation.\n     *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n     */\n    export var AnonymousSubject: AnonymousSubjectStatic;\n\n}\n\ndeclare module \"rx\" { export = Rx; }\n\n"
  },
  {
    "path": "ts/rx.es6.d.ts",
    "content": "declare module Rx {\n\n    // Type alias for observables and promises\n    export type ObservableOrPromise<T> = IObservable<T> | Observable<T> | Promise<T>;\n\n    export type ArrayLike<T> = Array<T> | { length: number;[index: number]: T; };\n\n    // Type alias for arrays and array like objects\n    export type ArrayOrIterable<T> = ArrayLike<T> | Iterable<T>;\n\n    /**\n     * Promise A+\n     */\n    export interface Promise<T> extends PromiseLike<T> { }\n\n    /**\n     * Promise A+\n     */\n    export interface IPromise<T> extends PromiseLike<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface IObservable<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface Observable<T> extends IObservable<T> { }\n\n    export module internals {\n        export interface EmptyError extends Error { message: string; }\n        export interface EmptyErrorStatic { new (): EmptyError; }\n\n        export interface ObjectDisposedError extends Error { message: string; }\n        export interface ObjectDisposedErrorStatic { new (): ObjectDisposedError; }\n\n        export interface ArgumentOutOfRangeError extends Error { message: string; }\n        export interface ArgumentOutOfRangeErrorStatic { new (): ArgumentOutOfRangeError; }\n\n        export interface NotSupportedError extends Error { message: string; }\n        export interface NotSupportedErrorStatic { new (): NotSupportedError; }\n\n        export interface NotImplementedError extends Error { message: string; }\n        export interface NotImplementedErrorStatic { new (): NotImplementedError; }\n    }\n\n    export module helpers {\n        export var notImplemented: () => internals.NotImplementedError;\n        export var notSupported: () => internals.NotSupportedError;\n    }\n\n    export module internals {\n        export var bindCallback: (func: Function, thisArg: any, argCount: number) => Function;\n    }\n\n    export module internals {\n        export var isEqual : (left: any, right: any) => boolean;\n    }\n\n    export interface IDisposable {\n        dispose(): void;\n    }\n\n    export interface Disposable extends IDisposable {\n        /** Is this value disposed. */\n        isDisposed?: boolean;\n    }\n\n    interface DisposableStatic {\n        /**\n         * Provides a set of static methods for creating Disposables.\n         * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n         */\n        new (action: () => void): Disposable;\n\n        /**\n         * Creates a disposable object that invokes the specified action when disposed.\n         * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n         * @return {Disposable} The disposable object that runs the given action upon disposal.\n         */\n        create(action: () => void): Disposable;\n\n        /**\n         * Gets the disposable that does nothing when disposed.\n         */\n        empty: IDisposable;\n\n        /**\n         * Validates whether the given object is a disposable\n         * @param {Object} Object to test whether it has a dispose method\n         * @returns {Boolean} true if a disposable object, else false.\n         */\n        isDisposable(d: any): boolean;\n    }\n\n    /**\n     * Provides a set of static methods for creating Disposables.\n     * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n     */\n    export var Disposable: DisposableStatic;\n\n    export module config {\n        export var Promise: { new <T>(resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): IPromise<T>; };\n    }\n\n    export module helpers {\n        export var noop: () => void;\n        export var notDefined: (value: any) => boolean;\n        export var identity: <T>(value: T) => T;\n        export var defaultNow: () => number;\n        export var defaultComparer: (left: any, right: any) =>  boolean;\n        export var defaultSubComparer: (left: any, right: any) =>  number;\n        export var defaultKeySerializer: (key: any) =>  string;\n        export var defaultError: (err: any) =>  void;\n        export var isPromise: (p: any) =>  boolean;\n        export var asArray: <T>(...args: T[]) =>  T[];\n        export var not: (value: any) =>  boolean;\n        export var isFunction: (value: any) =>  boolean;\n    }\n\n    export type _Selector<T, TResult> = (value: T, index: number, observable: Observable<T>) => TResult;\n    export type _ValueOrSelector<T, TResult> = TResult | _Selector<T, TResult>;\n    export type _Predicate<T> = _Selector<T, boolean>;\n    export type _Comparer<T, TResult> = (value1: T, value2: T) => TResult;\n    export type _Accumulator<T, TAcc> = (acc: TAcc, value: T) => TAcc;\n\n    export module special {\n        export type _FlatMapResultSelector<T1, T2, TResult> = (value: T1, selectorValue: T2, index: number, selectorOther: number) => TResult;\n    }\n\n    export interface IObservable<T> {\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(observer: IObserver<T>): IDisposable;\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(observer: IObserver<T>): IDisposable;\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n\n        /**\n        * Subscribes to the next value in the sequence with an optional \"this\" argument.\n        * @param {Function} onNext The function to invoke on each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnNext(onNext: (value: T) => void, thisArg?: any): IDisposable;\n        /**\n        * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n        * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnError(onError: (exception: any) => void, thisArg?: any): IDisposable;\n        /**\n        * Subscribes to the next value in the sequence with an optional \"this\" argument.\n        * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnCompleted(onCompleted: () => void, thisArg?: any): IDisposable;\n\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        forEach(observer: IObserver<T>): IDisposable;\n\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        forEach(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Determines whether the given object is an Observable\n        * @param {Any} An object to determine whether it is an Observable\n        * @returns {Boolean} true if an Observable, else false.\n        */\n        isObservable(o: any): boolean;\n    }\n\n    export var Observable: ObservableStatic;\n\n    export module internals {\n        export var inherits: (child: any, parent: any) => void;\n        export var addProperties: (obj: any, ...sources: any[]) => void;\n        export var addRef: <T>(xs: Observable<T>, r: { getDisposable(): IDisposable; }) => Observable<T>;\n    }\n\n    /**\n     * Represents a group of disposable resources that are disposed together.\n     * @constructor\n     */\n    export interface CompositeDisposable extends Disposable {\n        /**\n         * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n         * @param {Mixed} item Disposable to add.\n         */\n        add(item: IDisposable): void;\n\n        /**\n         * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n         * @param {Mixed} item Disposable to remove.\n         * @returns {Boolean} true if found; false otherwise.\n         */\n        remove(item: IDisposable): void;\n    }\n\n    interface CompositeDisposableStatic {\n        /**\n         * Represents a group of disposable resources that are disposed together.\n         * @constructor\n         */\n        new (...disposables: Rx.IDisposable[]): CompositeDisposable;\n        /**\n         * Represents a group of disposable resources that are disposed together.\n         * @constructor\n         */\n        new(disposables: Rx.IDisposable[]): CompositeDisposable;\n    }\n\n    export var CompositeDisposable: CompositeDisposableStatic;\n\n    export interface SingleAssignmentDisposable {\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        getDisposable(): IDisposable;\n\n        setDisposable(value: IDisposable): void;\n    }\n\n    interface SingleAssignmentDisposableStatic {\n        new() : SingleAssignmentDisposable;\n    }\n\n    export var SingleAssignmentDisposable : SingleAssignmentDisposableStatic;\n\n    export interface SerialDisposable {\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        getDisposable(): IDisposable;\n\n        setDisposable(value: IDisposable): void;\n    }\n\n    interface SerialDisposableStatic {\n        new() : SerialDisposable;\n    }\n\n    export var SerialDisposable : SerialDisposableStatic;\n\n    /**\n     * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n     */\n    export interface RefCountDisposable extends Disposable {\n\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        /**\n         * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n         * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n         */\n        getDisposable(): IDisposable;\n    }\n\n    interface RefCountDisposableStatic {\n        /**\n         * Initializes a new instance of the RefCountDisposable with the specified disposable.\n         * @constructor\n         * @param {Disposable} disposable Underlying disposable.\n         */\n        new(disposable: IDisposable): RefCountDisposable;\n    }\n\n    export var RefCountDisposable : RefCountDisposableStatic;\n\n    export interface IScheduler {\n        /** Gets the current time according to the local machine's system clock. */\n        now(): number;\n\n        /**\n          * Schedules an action to be executed.\n          * @param state State passed to the action to be executed.\n          * @param {Function} action Action to be executed.\n          * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n          */\n        schedule<TState>(state: TState, action: (scheduler: IScheduler, state: TState) => IDisposable): IDisposable;\n\n        /**\n         * Schedules an action to be executed after dueTime.\n         * @param state State passed to the action to be executed.\n         * @param {Function} action Action to be executed.\n         * @param {Number} dueTime Relative time after which to execute the action.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleFuture<TState>(state: TState, dueTime: number | Date, action: (scheduler: IScheduler, state: TState) => IDisposable): IDisposable;\n    }\n\n    export interface SchedulerStatic {\n        /** Gets the current time according to the local machine's system clock. */\n        now(): number;\n\n        /**\n         * Normalizes the specified TimeSpan value to a positive value.\n         * @param {Number} timeSpan The time span value to normalize.\n         * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n         */\n        normalize(timeSpan: number): number;\n\n        /** Determines whether the given object is a scheduler */\n        isScheduler(s: any): boolean;\n    }\n\n    /** Provides a set of static properties to access commonly used schedulers. */\n    export var Scheduler: SchedulerStatic;\n\n    export module internals {\n        export interface ScheduledItem<TTime> {\n            scheduler: IScheduler;\n            state: TTime;\n            action: (scheduler: IScheduler, state: any) => IDisposable;\n            dueTime: TTime;\n            comparer: (x: TTime, y: TTime) => number;\n            disposable: SingleAssignmentDisposable;\n\n            invoke(): void;\n            compareTo(other: ScheduledItem<TTime>): number;\n            isCancelled(): boolean;\n            invokeCore(): IDisposable;\n        }\n\n        interface ScheduledItemStatic {\n            new <TTime>(scheduler: IScheduler, state: any, action: (scheduler: IScheduler, state: any) => IDisposable, dueTime: TTime, comparer?: _Comparer<TTime, number>):ScheduledItem<TTime>;\n        }\n\n        export var ScheduledItem: ScheduledItemStatic\n    }\n\n    export interface IScheduler {\n        /**\n         * Schedules an action to be executed recursively.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleRecursive<TState>(state: TState, action: (state: TState, action: (state: TState) => void) => void): IDisposable;\n\n        /**\n         * Schedules an action to be executed recursively after a specified relative due time.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n         * @param {Number}dueTime Relative time after which to execute the action for the first time.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleRecursiveFuture<TState, TTime extends number | Date>(state: TState, dueTime: TTime, action: (state: TState, action: (state: TState, dueTime: TTime) => void) => void): IDisposable;\n    }\n\n    export interface IScheduler {\n        /**\n         * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n         * @param {Mixed} state Initial state passed to the action upon the first iteration.\n         * @param {Number} period Period for running the work periodically.\n         * @param {Function} action Action to be executed, potentially updating the state.\n         * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n         */\n        schedulePeriodic<TState>(state: TState, period: number, action: (state: TState) => TState): IDisposable;\n    }\n\n    export interface IScheduler {\n        /**\n         * Returns a scheduler that wraps the original scheduler, adding exception handling for scheduled actions.\n         * @param {Function} handler Handler that's run if an exception is caught. The exception will be rethrown if the handler returns false.\n         * @returns {Scheduler} Wrapper around the original scheduler, enforcing exception handling.\n         */\n        catch(handler: Function): IScheduler;\n    }\n\n    export module internals {\n        export interface SchedulePeriodicRecursive {\n            start(): IDisposable;\n        }\n\n        interface SchedulePeriodicRecursiveStatic {\n            new (scheduler: any, state: any, period: any, action: any) : SchedulePeriodicRecursive;\n        }\n\n        export var SchedulePeriodicRecursive: SchedulePeriodicRecursiveStatic;\n    }\n\n    export interface SchedulerStatic {\n        immediate: IScheduler;\n    }\n\n    export interface ICurrentThreadScheduler extends IScheduler {\n        scheduleRequired(): boolean;\n    }\n\n    export interface SchedulerStatic {\n        currentThread: ICurrentThreadScheduler;\n    }\n\n    export interface SchedulerStatic {\n        default: IScheduler;\n        async: IScheduler;\n    }\n\n    export module internals {\n        // Priority Queue for Scheduling\n        export interface PriorityQueue<TTime> {\n            length: number;\n\n            isHigherPriority(left: number, right: number): boolean;\n            percolate(index: number): void;\n            heapify(index: number): void;\n            peek(): ScheduledItem<TTime>;\n            removeAt(index: number): void;\n            dequeue(): ScheduledItem<TTime>;\n            enqueue(item: ScheduledItem<TTime>): void;\n            remove(item: ScheduledItem<TTime>): boolean;\n        }\n\n        interface PriorityQueueStatic {\n                new <T>(capacity: number) : PriorityQueue<T>;\n                count: number;\n        }\n\n        export var PriorityQueue : PriorityQueueStatic;\n    }\n\n    /**\n    * Supports push-style iteration over an observable sequence.\n    */\n    export interface IObserver<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n    \n    export interface Observer<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n\n    export interface ObserverStatic {\n        /**\n        *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n        * @param {Function} [onNext] Observer's OnNext action implementation.\n        * @param {Function} [onError] Observer's OnError action implementation.\n        * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n        * @returns {Observer} The observer object implemented using the given actions.\n        */\n        create<T>(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observer<T>;\n    }\n\n    /**\n    * Supports push-style iteration over an observable sequence.\n    */\n    export var Observer: ObserverStatic;\n\n    /**\n     *  Represents a notification to an observer.\n     */\n    export interface Notification<T> {\n        /**\n         * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n         *\n         * @memberOf Notification\n         * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n         * @param {Function} onError Delegate to invoke for an OnError notification.\n         * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n         * @returns {Any} Result produced by the observation.\n         */\n        accept(observer: IObserver<T>): void;\n        /**\n         * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n         *\n         * @memberOf Notification\n         * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n         * @param {Function} onError Delegate to invoke for an OnError notification.\n         * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n         * @returns {Any} Result produced by the observation.\n         */\n        accept<TResult>(onNext: (value: T) => TResult, onError: (exception: any) => TResult, onCompleted: () => TResult): TResult;\n\n        /**\n         * Returns an observable sequence with a single notification.\n         *\n         * @memberOf Notifications\n         * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n         * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n         */\n        toObservable(scheduler?: IScheduler): Observable<T>;\n\n        hasValue: boolean;\n        equals(other: Notification<T>): boolean;\n        kind: string;\n        value: T;\n        error: any;\n    }\n\n    interface NotificationStatic {\n        new <T>(kind: any, value: any, exception: any, accept: any, acceptObservable: any, toString: any) : Notification<T>;\n\n        /**\n        * Creates an object that represents an OnNext notification to an observer.\n        * @param {Any} value The value contained in the notification.\n        * @returns {Notification} The OnNext notification containing the value.\n        */\n        createOnNext<T>(value: T): Notification<T>;\n        /**\n        * Creates an object that represents an OnError notification to an observer.\n        * @param {Any} error The exception contained in the notification.\n        * @returns {Notification} The OnError notification containing the exception.\n        */\n        createOnError<T>(exception: any): Notification<T>;\n        /**\n        * Creates an object that represents an OnCompleted notification to an observer.\n        * @returns {Notification} The OnCompleted notification.\n        */\n        createOnCompleted<T>(): Notification<T>;\n    }\n\n    export var Notification : NotificationStatic;\n\n\texport interface Observer<T> {\n        makeSafe(disposable: IDisposable): Observer<T>;\n\t}\n\n    export module internals {\n        /**\n        * Abstract base class for implementations of the Observer class.\n        * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n        */\n        export interface AbstractObserver<T> extends Rx.IObserver<T>, Rx.IDisposable {\n            /**\n            * Notifies the observer of a new element in the sequence.\n            * @param {Any} value Next element in the sequence.\n            */\n            onNext(value: T): void;\n            /**\n            * Notifies the observer that an exception has occurred.\n            * @param {Any} error The error that has occurred.\n            */\n            onError(exception: any): void;\n            /**\n            * Notifies the observer of the end of the sequence.\n            */\n            onCompleted(): void;\n\n            isStopped: boolean;\n\n            /**\n            * Disposes the observer, causing it to transition to the stopped state.\n            */\n            dispose(): void;\n\n            fail(e: any): boolean;\n\n            // Must be implemented by other observers\n            next(value: T): void;\n            error(error: any): void;\n            completed(): void;\n        }\n\n        interface AbstractObserverStatic {\n            new <T>(): AbstractObserver<T>;\n        }\n\n        export var AbstractObserver: AbstractObserverStatic\n    }\n\n    /**\n     * Class to create an Observer instance from delegate-based implementations of the on* methods.\n     */\n    export interface AnonymousObserver<T> extends Observer<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n\n    interface AnonymousObserverStatic {\n        /**\n         * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n         * @param {Any} onNext Observer's OnNext action implementation.\n         * @param {Any} onError Observer's OnError action implementation.\n         * @param {Any} onCompleted Observer's OnCompleted action implementation.\n         */\n        new <T>(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): AnonymousObserver<T>;\n    }\n\n    export var AnonymousObserver : AnonymousObserverStatic;\n\n    export interface CheckedObserver<T> extends Observer<T> {\n        checkAccess(): void;\n    }\n\n    export module internals {\n        export interface ScheduledObserver<T> extends Observer<T> {\n            ensureActive(): void;\n        }\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n        *\n        *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n        *  that require to be run on a scheduler, use subscribeOn.\n        *\n        *  @param {Scheduler} scheduler Scheduler to notify observers on.\n        *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n        */\n        observeOn(scheduler: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n        *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n        *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n        *  callbacks on a scheduler, use observeOn.\n\n        *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n        *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n        */\n        subscribeOn(scheduler: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Converts a Promise to an Observable sequence\n        * @param {Promise} An ES6 Compliant promise.\n        * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n        */\n \t\tfromPromise<T>(promise: Promise<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /*\n         * Converts an existing observable sequence to an ES6 Compatible Promise\n         * @example\n         * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n         *\n         * // With config\n         * Rx.config.Promise = RSVP.Promise;\n         * var promise = Rx.Observable.return(42).toPromise();\n         * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n         * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n         */\n        toPromise(promiseCtor?: { new (resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): IPromise<T>; }): IPromise<T>;\n        /*\n         * Converts an existing observable sequence to an ES6 Compatible Promise\n         * @example\n         * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n         *\n         * // With config\n         * Rx.config.Promise = RSVP.Promise;\n         * var promise = Rx.Observable.return(42).toPromise();\n         * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n         * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n         */\n        toPromise<TPromise extends IPromise<T>>(promiseCtor: { new (resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): TPromise; }): TPromise;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Creates an array from an observable sequence.\n        * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n        */\n        toArray(): Observable<T[]>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Creates an observable sequence from a specified subscribe method implementation.\n        * @example\n        *  var res = Rx.Observable.create(function (observer) { return function () { } );\n        *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n        *  var res = Rx.Observable.create(function (observer) { } );\n        * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n        * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n        */\n        create<T>(subscribe: (observer: Observer<T>) => IDisposable | Function | void): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n          *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n          *\n          * @example\n          *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n          * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n          * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n          */\n        defer<T>(observableFactory: () => ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n  *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n  *\n  * @example\n  *  var res = Rx.Observable.empty();\n  *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n  * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n  * @returns {Observable} An observable sequence with no elements.\n  */\n        empty<T>(scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * This method creates a new Observable sequence from an array-like or iterable object.\n         * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n         * @param {Function} [mapFn] Map function to call on every element of the array.\n         * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n         * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n         */\n        from<T>(array: ArrayOrIterable<T>): Observable<T>;\n        /**\n         * This method creates a new Observable sequence from an array-like or iterable object.\n         * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n         * @param {Function} [mapFn] Map function to call on every element of the array.\n         * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n         * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n         */\n        from<T, TResult>(array: ArrayOrIterable<T>, mapFn: (value: T, index: number) => TResult, thisArg?: any, scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n         * @deprecated use Observable.from or Observable.of\n         * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n         * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n         */\n        fromArray<T>(array: ArrayLike<T>, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n         *\n         * @example\n         *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n         *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n         * @param {Mixed} initialState Initial state.\n         * @param {Function} condition Condition to terminate generation (upon returning false).\n         * @param {Function} iterate Iteration step function.\n         * @param {Function} resultSelector Selector function for results produced in the sequence.\n         * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n         * @returns {Observable} The generated sequence.\n         */\n        generate<TState, TResult>(initialState: TState, condition: (state: TState) => boolean, iterate: (state: TState) => TState, resultSelector: (state: TState) => TResult, scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n        * @returns {Observable} An observable sequence whose observers will never get called.\n        */\n        never<T>(): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n        * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n        */\n        of<T>(...values: T[]): Observable<T>;\n\n        /**\n        *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n        * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n        * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n        */\n        ofWithScheduler<T>(scheduler?: IScheduler, ...values: T[]): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Convert an object into an observable sequence of [key, value] pairs.\n        * @param {Object} obj The object to inspect.\n        * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n        * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n        */\n        pairs<T>(obj: { [key: string]: T }, scheduler?: IScheduler): Observable<[string, T]>;\n        /**\n        * Convert an object into an observable sequence of [key, value] pairs.\n        * @param {Object} obj The object to inspect.\n        * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n        * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n        */\n        pairs<T>(obj: { [key: number]: T }, scheduler?: IScheduler): Observable<[number, T]>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n        *\n        * @example\n        *  var res = Rx.Observable.range(0, 10);\n        *  var res = Rx.Observable.range(0, 10, Rx.Scheduler.timeout);\n        * @param {Number} start The value of the first integer in the sequence.\n        * @param {Number} count The number of sequential integers to generate.\n        * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n        * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n        */\n        range(start: number, count: number, scheduler?: IScheduler): Observable<number>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n         *\n         * @example\n         *  var res = Rx.Observable.repeat(42);\n         *  var res = Rx.Observable.repeat(42, 4);\n         *  3 - res = Rx.Observable.repeat(42, 4, Rx.Scheduler.timeout);\n         *  4 - res = Rx.Observable.repeat(42, null, Rx.Scheduler.timeout);\n         * @param {Mixed} value Element to repeat.\n         * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n         * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n         * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n         */\n        repeat<T>(value: T, repeatCount?: number | void, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n        *  There is an alias called 'just' or browsers <IE9.\n        * @param {Mixed} value Single element in the resulting observable sequence.\n        * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} An observable sequence containing the single specified element.\n        */\n        return<T>(value: T, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n        *  There is an alias called 'just' or browsers <IE9.\n        * @param {Mixed} value Single element in the resulting observable sequence.\n        * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} An observable sequence containing the single specified element.\n        */\n        just<T>(value: T, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n        * @param {Mixed} error An object used for the sequence's termination.\n        * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n        */\n        throw<T>(exception: Error, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n        * @param {Mixed} error An object used for the sequence's termination.\n        * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n        */\n        throw<T>(exception: any, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n         * @param {Function} resourceFactory Factory function to obtain a resource object.\n         * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n         * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n         */\n        using<TSource, TResource extends IDisposable>(resourceFactory: () => TResource, observableFactory: (resource: TResource) => Observable<TSource>): Observable<TSource>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @param {Observable} rightSource Second observable sequence or Promise.\n        * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n        */\n        amb(observable: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n        */\n        amb<T>(observables: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n        */\n        amb<T>(...observables: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n        * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n        */\n        catch(handler: (exception: any) => ObservableOrPromise<T>): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n        * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n        */\n        catch(second: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n        * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n        */\n        catch<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n        * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n        */\n        catch<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther, TResult>(sources: ObservableOrPromise<TOther>[], resultSelector: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2>(second: ObservableOrPromise<T2>): Observable<[T, T2]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>): Observable<[T, T2, T3]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>): Observable<[T, T2, T3, T4]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>): Observable<[T, T2, T3, T4, T5]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>): Observable<[T, T2, T3, T4, T5, T6]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>): Observable<[T, T2, T3, T4, T5, T6, T7]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>): Observable<[T, T2, T3, T4, T5, T6, T7, T8]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, T9>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>): Observable<[T, T2, T3, T4, T5, T6, T7, T8, T9]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther>(sources: ObservableOrPromise<TOther>[]): Observable<TOther[]>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, eventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, T9, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther, TResult>(sources: ObservableOrPromise<TOther>[], resultSelector: (...otherValues: TOther[]) => TResult): Observable<TResult>;\n\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>): Observable<[T, T2]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>): Observable<[T, T2, T3]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>): Observable<[T, T2, T3, T4]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>): Observable<[T, T2, T3, T4, T5]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>): Observable<[T, T2, T3, T4, T5, T6]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>): Observable<[T, T2, T3, T4, T5, T6, T7]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>): Observable<[T, T2, T3, T4, T5, T6, T7, T8]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, T9>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>): Observable<[T, T2, T3, T4, T5, T6, T7, T8, T9]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<TOther>(sources: ObservableOrPromise<TOther>[]): Observable<TOther[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat(...sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Concatenates all the observable sequences.\n        * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Concatenates all the observable sequences.\n        * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n          * Concatenates an observable sequence of observable sequences.\n          * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n          */\n        concatAll(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n        * Or merges two observable sequences into a single observable sequence.\n        *\n        * @example\n        * 1 - merged = sources.merge(1);\n        * 2 - merged = source.merge(otherSource);\n        * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        merge(maxConcurrent: number): T;\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n        * Or merges two observable sequences into a single observable sequence.\n        *\n        * @example\n        * 1 - merged = sources.merge(1);\n        * 2 - merged = source.merge(otherSource);\n        * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        merge(other: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(scheduler: IScheduler, ...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(scheduler: IScheduler, sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n        * receive all successfully emitted items from all of the source Observables without being interrupted by\n        * an error notification from one of them.\n        *\n        * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n        * error via the Observer's onError, mergeDelayError will refrain from propagating that\n        * error notification until all of the merged Observables have finished emitting items.\n        * @param {Array | Arguments} args Arguments or an array to merge.\n        * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n        */\n        mergeDelayError<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n        * receive all successfully emitted items from all of the source Observables without being interrupted by\n        * an error notification from one of them.\n        *\n        * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n        * error via the Observer's onError, mergeDelayError will refrain from propagating that\n        * error notification until all of the merged Observables have finished emitting items.\n        * @param {Array | Arguments} args Arguments or an array to merge.\n        * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n        */\n        mergeDelayError<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        mergeAll(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n        * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n        */\n        onErrorResumeNext(second: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        *\n        * @example\n        * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);\n        * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);\n        * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n        */\n        onErrorResumeNext<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        *\n        * @example\n        * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);\n        * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);\n        * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n        */\n        onErrorResumeNext<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n        * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n        * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n        */\n        skipUntil<T2>(other: ObservableOrPromise<T2>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        switch(): T;\n        /**\n        * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        switchLatest(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the values from the source observable sequence until the other observable sequence produces a value.\n        * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n        * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n        */\n        takeUntil<T2>(other: ObservableOrPromise<T2>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<TOther, TResult>(souces: ObservableOrPromise<TOther>[], resultSelector: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, TResult>(sources: ObservableOrPromise<T2>[], resultSelector?: (item1: T1, ...right: T2[]) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, TResult>(source1: ObservableOrPromise<T1>, ObservableOrPromise: Observable<T2>, resultSelector?: (item1: T1, item2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, resultSelector?: (item1: T1, item2: T2, item3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, TResult>(source1: Observable<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, T8, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, source8: ObservableOrPromise<T8>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, source8: ObservableOrPromise<T8>, source9: ObservableOrPromise<T9>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8, item9: T9) => TResult): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector?: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector?: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<TOther, TResult>(souces: ObservableOrPromise<TOther>[], resultSelector?: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n        * @param arguments Observable sources.\n        * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n        */\n        zipIterable<T>(...sources: Observable<T>[]): Observable<T[]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n        * @param arguments Observable sources.\n        * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n        */\n        zipIterable<T>(sources: Observable<T>[]): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n       *  Hides the identity of an observable sequence.\n       * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n       */\n        asObservable(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n        * @param {Number} count Length of each buffer.\n        * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithCount(count: number, skip?: number): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n        * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n        */\n        dematerialize<TOrigin>(): Observable<TOrigin>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.\n        *\n        *  var obs = observable.distinctUntilChanged();\n        *  var obs = observable.distinctUntilChanged(function (x) { return x.id; });\n        *  var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; });\n        *\n        * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value.\n        * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n        * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n        */\n        distinctUntilChanged<TValue>(keySelector?: (value: T) => TValue, comparer?: _Comparer<TValue, boolean>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        do(observer: Observer<T>): Observable<T>;\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tap(observer: Observer<T>): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        do(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observable<T>;\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tap(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onNext Action to invoke for each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnNext(onNext: (value: T) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnError(onError: (exception: any) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon graceful termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnCompleted(onCompleted: () => void, thisArg?: any): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onNext Action to invoke for each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnNext(onNext: (value: T) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnError(onError: (exception: any) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon graceful termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnCompleted(onCompleted: () => void, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n        * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n        * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n        */\n        finally(action: () => void): Observable<T>;\n\n        /**\n        *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n        * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n        * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n        */\n        ensure(action: () => void): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Ignores all elements in an observable sequence leaving only the termination messages.\n        * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n        */\n        ignoreElements(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n        * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n        */\n        materialize(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n         * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n         * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n         */\n        repeat(repeatCount?: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n        *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n        *\n        * @example\n        *  var res = retried = retry.repeat();\n        *  var res = retried = retry.repeat(2);\n        * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n        * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n        */\n        retry(retryCount?: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         *  Repeats the source observable sequence upon error each time the notifier emits or until it successfully terminates.\n         *  if the notifier completes, the observable sequence completes.\n         *\n         * @example\n         *  var timer = Observable.timer(500);\n         *  var source = observable.retryWhen(timer);\n         * @param {Observable} [notifier] An observable that triggers the retries or completes the observable with onNext or onCompleted respectively.\n         * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n         */\n        retryWhen(notifier: (errors: Observable<any>) => Observable<any>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n        *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n        * @example\n        *  var res = source.scan(function (acc, x) { return acc + x; });\n        *  var res = source.scan(function (acc, x) { return acc + x; }, 0);\n        * @param {Function} accumulator An accumulator function to be invoked on each element.\n        * @param {Mixed} [seed] The initial accumulator value.\n        * @returns {Observable} An observable sequence containing the accumulated values.\n        */\n        scan<TAcc>(accumulator: _Accumulator<T, TAcc>, seed?: TAcc): Observable<TAcc>;\n        /**\n        *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n        *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n        * @example\n        *  var res = source.scan(function (acc, x) { return acc + x; });\n        *  var res = source.scan(function (acc, x) { return acc + x; }, 0);\n        * @param {Function} accumulator An accumulator function to be invoked on each element.\n        * @param {Mixed} [seed] The initial accumulator value.\n        * @returns {Observable} An observable sequence containing the accumulated values.\n        */\n        scan(accumulator: _Accumulator<T, T>, seed?: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Bypasses a specified number of elements at the end of an observable sequence.\n        * @description\n        *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n        *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n        * @param count Number of elements to bypass at the end of the source sequence.\n        * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n        */\n        skipLast(count: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n        *  @example\n        *  var res = source.startWith(1, 2, 3);\n        *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n        * @param {Arguments} args The specified values to prepend to the observable sequence\n        * @returns {Observable} The source sequence prepended with the specified values.\n        */\n        startWith(...values: T[]): Observable<T>;\n        /**\n        *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n        *  @example\n        *  var res = source.startWith(1, 2, 3);\n        *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n        * @param {Arguments} args The specified values to prepend to the observable sequence\n        * @returns {Observable} The source sequence prepended with the specified values.\n        */\n        startWith(scheduler: IScheduler, ...values: T[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns a specified number of contiguous elements from the end of an observable sequence.\n        * @description\n        *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n        *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n        * @param {Number} count Number of elements to take from the end of the source sequence.\n        * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n        */\n        takeLast(count: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n        *\n        * @description\n        *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n        *  source sequence, this buffer is produced on the result sequence.\n        * @param {Number} count Number of elements to take from the end of the source sequence.\n        * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n        */\n        takeLastBuffer(count: number): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n        *\n        *  var res = xs.windowWithCount(10);\n        *  var res = xs.windowWithCount(10, 1);\n        * @param {Number} count Length of each window.\n        * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithCount(count: number, skip?: number): Observable<Observable<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        concatMapObserver<T, TResult>(onNext: (value: T, i: number) => ObservableOrPromise<TResult>, onError: (error: any) => ObservableOrPromise<any>, onCompleted: () => ObservableOrPromise<any>, thisArg?: any): Observable<TResult>;\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and concats the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        selectConcatObserver<T, TResult>(onNext: (value: T, i: number) => ObservableOrPromise<TResult>, onError: (error: any) => ObservableOrPromise<any>, onCompleted: () => ObservableOrPromise<any>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n        *\n        *  var res = obs = xs.defaultIfEmpty();\n        *  2 - obs = xs.defaultIfEmpty(false);\n        *\n        * @memberOf Observable#\n        * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n        * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n        */\n        defaultIfEmpty(defaultValue?: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n        *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n        *\n        * @example\n        *  var res = obs = xs.distinct();\n        *  2 - obs = xs.distinct(function (x) { return x.id; });\n        *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n        * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n        * @param {Function} [comparer]  Used to compare items in the collection.\n        * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n        */\n        distinct<TKey>(keySelector?: (value: T) => TKey, comparer?: _Comparer<TKey, boolean>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Projects each element of an observable sequence into a new form by incorporating the element's index.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n        */\n        select<TResult>(selector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        * Projects each element of an observable sequence into a new form by incorporating the element's index.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n        */\n        map<TResult>(selector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Retrieves the value of a specified nested property from all elements in\n        * the Observable sequence.\n        * @param {Arguments} arguments The nested properties to pluck.\n        * @returns {Observable} Returns a new Observable sequence of property values.\n        */\n        pluck<TResult>(prop: string): Observable<TResult>;\n        pluck<TResult>(...props: string[]): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        selectManyObserver<T2, T3, T4>(onNext: (value: T, index: number) => Observable<T2>, onError: (exception: any) => Observable<T3>, onCompleted: () => Observable<T4>, thisArg?: any): Observable<T2 | T3 | T4>;\n        /**\n        * Projects each notification of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        * @param {Function} onNext A transform function to apply to each element; the second parameter of the function represents the index of the source element.\n        * @param {Function} onError A transform function to apply when an error occurs in the source sequence.\n        * @param {Function} onCompleted A transform function to apply when the end of the source sequence is reached.\n        * @param {Any} [thisArg] An optional \"this\" to use to invoke each transform.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function corresponding to each notification in the input sequence.\n        */\n        flatMapObserver<T2, T3, T4>(onNext: (value: T, index: number) => Observable<T2>, onError: (exception: any) => Observable<T3>, onCompleted: () => Observable<T4>, thisArg?: any): Observable<T2 | T3 | T4>;\n    }\n\n\n    export interface Observable<T> {\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n        * @param {Number} count The number of elements to skip before returning the remaining elements.\n        * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n        */\n        skip(count: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n        *  The element's index is used in the logic of the predicate function.\n        *\n        *  var res = source.skipWhile(function (value) { return value < 10; });\n        *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n        */\n        skipWhile(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n        *\n        *  var res = source.take(5);\n        *  var res = source.take(0, Rx.Scheduler.timeout);\n        * @param {Number} count The number of elements to return.\n        * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n        * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n        */\n        take(count: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns elements from an observable sequence as long as a specified condition is true.\n        *  The element's index is used in the logic of the predicate function.\n        * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n        */\n        takeWhile(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n        *\n        * @example\n        *  var res = source.where(function (value) { return value < 10; });\n        *  var res = source.where(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n        */\n        where(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n        /**\n        *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n        *\n        * @example\n        *  var res = source.where(function (value) { return value < 10; });\n        *  var res = source.where(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n        */\n        filter(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Executes a transducer to transform the observable sequence\n         * @param {Transducer} transducer A transducer to execute\n         * @returns {Observable} An Observable sequence containing the results from the transducer.\n         */\n        transduce(transducer: any): any;\n        //TODO: Setup transducer\n    }\n\n    export interface AnonymousObservable<T> extends Observable<T> { }\n\n    /**\n     *  Represents an object that is both an observable sequence as well as an observer.\n     *  Each notification is broadcasted to all subscribed observers.\n     */\n    export interface ISubject<T> extends IObservable<T>, IObserver<T>, IDisposable {\n        hasObservers(): boolean;\n    }\n\n    export interface Subject<T> extends Observable<T>, Observer<T>, IDisposable {\n        hasObservers(): boolean;\n        /** Is this value disposed. */\n        isDisposed: boolean;\n    }\n\n    interface SubjectStatic {\n        /**\n         * Creates a subject.\n         */\n        new <T>(): Subject<T>;\n\n        /**\n         * Creates a subject from the specified observer and observable.\n         * @param {Observer} observer The observer used to send messages to the subject.\n         * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n         * @returns {Subject} Subject implemented using the given observer and observable.\n         */\n        create<T>(observer?: IObserver<T>, observable?: IObservable<T>): Subject<T>;\n    }\n\n    /**\n     *  Represents an object that is both an observable sequence as well as an observer.\n     *  Each notification is broadcasted to all subscribed observers.\n     */\n    export var Subject: SubjectStatic;\n\n    export interface AsyncSubject<T> extends Subject<T> { }\n\n    interface AsyncSubjectStatic {\n        /**\n         * Creates a subject that can only receive one value and that value is cached for all future observations.\n         * @constructor\n         */\n        new <T>(): AsyncSubject<T>;\n    }\n\n    /**\n     *  Represents the result of an asynchronous operation.\n     *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n     */\n    export var AsyncSubject: AsyncSubjectStatic;\n\n    export interface AnonymousSubject<T> extends Subject<T> { }\n\n    interface AnonymousSubjectStatic {\n        /**\n         * Creates a subject that can only receive one value and that value is cached for all future observations.\n         * @constructor\n         */\n        new <T>(): AnonymousSubject<T>;\n    }\n\n    /**\n     *  Represents the result of an asynchronous operation.\n     *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n     */\n    export var AnonymousSubject: AnonymousSubjectStatic;\n\n}\n\ndeclare module \"rx\" { export = Rx; }\n\n"
  },
  {
    "path": "ts/rx.experimental.d.ts",
    "content": "declare module Rx {\n\n    export interface Observable<T> {\n        /**\n        *  Returns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions.\n        *  This operator allows for a fluent style of writing queries that use the same sequence multiple times.\n        *\n        * @param {Function} selector Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        let<TResult>(selector: (source: Observable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Determines whether an observable collection contains values.\n        *\n        * @example\n        *  1 - res = Rx.Observable.if(condition, obs1);\n        *  2 - res = Rx.Observable.if(condition, obs1, obs2);\n        *  3 - res = Rx.Observable.if(condition, obs1, scheduler);\n        * @param {Function} condition The condition which determines if the thenSource or elseSource will be run.\n        * @param {Observable} thenSource The observable sequence or Promise that will be run if the condition function returns true.\n        * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the condition function returns false. If this is not provided, it defaults to Rx.Observabe.Empty with the specified scheduler.\n        * @returns {Observable} An observable sequence which is either the thenSource or elseSource.\n        */\n        if<T>(condition: () => boolean, thenSource: ObservableOrPromise<T>, elseSourceOrScheduler?: ObservableOrPromise<T> | IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n        * There is an alias for this method called 'forIn' for browsers <IE9\n        * @param {Array} sources An array of values to turn into an observable sequence.\n        * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n        * @returns {Observable} An observable sequence from the concatenated observable sequences.\n        */\n        for<T, TResult>(sources: T[], resultSelector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n        * There is an alias for this method called 'forIn' for browsers <IE9\n        * @param {Array} sources An array of values to turn into an observable sequence.\n        * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n        * @returns {Observable} An observable sequence from the concatenated observable sequences.\n        */\n        forIn<T, TResult>(sources: T[], resultSelector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Repeats source as long as condition holds emulating a while loop.\n        * There is an alias for this method called 'whileDo' for browsers <IE9\n        *\n        * @param {Function} condition The condition which determines if the source will be repeated.\n        * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n        * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n        */\n        while<T>(condition: () => boolean, source: ObservableOrPromise<T>): Observable<T>;\n        /**\n        *  Repeats source as long as condition holds emulating a while loop.\n        * There is an alias for this method called 'whileDo' for browsers <IE9\n        *\n        * @param {Function} condition The condition which determines if the source will be repeated.\n        * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n        * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n        */\n        whileDo<T>(condition: () => boolean, source: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Repeats source as long as condition holds emulating a do while loop.\n        *\n        * @param {Function} condition The condition which determines if the source will be repeated.\n        * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n        * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n        */\n        doWhile(condition: () => boolean): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Uses selector to determine which source in sources to use.\n        * @param {Function} selector The function which extracts the value for to test in a case statement.\n        * @param {Array} sources A object which has keys which correspond to the case statement labels.\n        * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n        *\n        * @returns {Observable} An observable sequence which is determined by a case statement.\n        */\n        case<T>(selector: () => string, sources: { [key: string]: ObservableOrPromise<T>; }, schedulerOrElseSource?: IScheduler | ObservableOrPromise<T>): Observable<T>;\n        /**\n        *  Uses selector to determine which source in sources to use.\n        * @param {Function} selector The function which extracts the value for to test in a case statement.\n        * @param {Array} sources A object which has keys which correspond to the case statement labels.\n        * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n        *\n        * @returns {Observable} An observable sequence which is determined by a case statement.\n        */\n        case<T>(selector: () => number, sources: { [key: number]: ObservableOrPromise<T>; }, schedulerOrElseSource?: IScheduler | ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Expands an observable sequence by recursively invoking selector.\n        *\n        * @param {Function} selector Selector function to invoke for each produced element, resulting in another sequence to which the selector will be invoked recursively again.\n        * @param {Scheduler} [scheduler] Scheduler on which to perform the expansion. If not provided, this defaults to the current thread scheduler.\n        * @returns {Observable} An observable sequence containing all the elements produced by the recursive expansion.\n        */\n        expand(selector: (item: T) => Observable<T>, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Runs all observable sequences in parallel and collect their last elements.\n        *\n        * @example\n        *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n        *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n        * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n        */\n        forkJoin<T>(sources: ObservableOrPromise<T>[]): Observable<T[]>;\n\n        /**\n        *  Runs all observable sequences in parallel and collect their last elements.\n        *\n        * @example\n        *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n        *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n        * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n        */\n        forkJoin<T>(...args: ObservableOrPromise<T>[]): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Runs two observable sequences in parallel and combines their last elemenets.\n        *\n        * @param {Observable} second Second observable sequence.\n        * @param {Function} resultSelector Result selector function to invoke with the last elements of both sequences.\n        * @returns {Observable} An observable sequence with the result of calling the selector function with the last elements of both input sequences.\n        */\n        forkJoin<TSecond, TResult>(second: ObservableOrPromise<TSecond>, resultSelector: (left: T, right: TSecond) => TResult): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Comonadic bind operator.\n        * @param {Function} selector A transform function to apply to each element.\n        * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n        * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n        */\n        manySelect<TResult>(selector: _Selector<Observable<T>, TResult>, scheduler?: IScheduler): Observable<TResult>;\n        /**\n        * Comonadic bind operator.\n        * @param {Function} selector A transform function to apply to each element.\n        * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n        * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n        */\n        extend<TResult>(selector: _Selector<Observable<T>, TResult>, scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * Observables that come in between subscriptions will be dropped on the floor.\n        * @returns {Observable} A exclusive observable with only the results that happen when subscribed.\n        */\n        switchFirst(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n}\ndeclare module \"rx.experimental\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.experimental.es6.d.ts",
    "content": "declare module Rx {\n\n    export interface Observable<T> {\n        /**\n        *  Returns an observable sequence that is the result of invoking the selector on the source sequence, without sharing subscriptions.\n        *  This operator allows for a fluent style of writing queries that use the same sequence multiple times.\n        *\n        * @param {Function} selector Selector function which can use the source sequence as many times as needed, without sharing subscriptions to the source sequence.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        let<TResult>(selector: (source: Observable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Determines whether an observable collection contains values.\n        *\n        * @example\n        *  1 - res = Rx.Observable.if(condition, obs1);\n        *  2 - res = Rx.Observable.if(condition, obs1, obs2);\n        *  3 - res = Rx.Observable.if(condition, obs1, scheduler);\n        * @param {Function} condition The condition which determines if the thenSource or elseSource will be run.\n        * @param {Observable} thenSource The observable sequence or Promise that will be run if the condition function returns true.\n        * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the condition function returns false. If this is not provided, it defaults to Rx.Observabe.Empty with the specified scheduler.\n        * @returns {Observable} An observable sequence which is either the thenSource or elseSource.\n        */\n        if<T>(condition: () => boolean, thenSource: ObservableOrPromise<T>, elseSourceOrScheduler?: ObservableOrPromise<T> | IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n        * There is an alias for this method called 'forIn' for browsers <IE9\n        * @param {Array} sources An array of values to turn into an observable sequence.\n        * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n        * @returns {Observable} An observable sequence from the concatenated observable sequences.\n        */\n        for<T, TResult>(sources: T[], resultSelector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Concatenates the observable sequences obtained by running the specified result selector for each element in source.\n        * There is an alias for this method called 'forIn' for browsers <IE9\n        * @param {Array} sources An array of values to turn into an observable sequence.\n        * @param {Function} resultSelector A function to apply to each item in the sources array to turn it into an observable sequence.\n        * @returns {Observable} An observable sequence from the concatenated observable sequences.\n        */\n        forIn<T, TResult>(sources: T[], resultSelector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Repeats source as long as condition holds emulating a while loop.\n        * There is an alias for this method called 'whileDo' for browsers <IE9\n        *\n        * @param {Function} condition The condition which determines if the source will be repeated.\n        * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n        * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n        */\n        while<T>(condition: () => boolean, source: ObservableOrPromise<T>): Observable<T>;\n        /**\n        *  Repeats source as long as condition holds emulating a while loop.\n        * There is an alias for this method called 'whileDo' for browsers <IE9\n        *\n        * @param {Function} condition The condition which determines if the source will be repeated.\n        * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n        * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n        */\n        whileDo<T>(condition: () => boolean, source: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Repeats source as long as condition holds emulating a do while loop.\n        *\n        * @param {Function} condition The condition which determines if the source will be repeated.\n        * @param {Observable} source The observable sequence that will be run if the condition function returns true.\n        * @returns {Observable} An observable sequence which is repeated as long as the condition holds.\n        */\n        doWhile(condition: () => boolean): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Uses selector to determine which source in sources to use.\n        * @param {Function} selector The function which extracts the value for to test in a case statement.\n        * @param {Array} sources A object which has keys which correspond to the case statement labels.\n        * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n        *\n        * @returns {Observable} An observable sequence which is determined by a case statement.\n        */\n        case<T>(selector: () => string, sources: { [key: string]: ObservableOrPromise<T>; }, schedulerOrElseSource?: IScheduler | ObservableOrPromise<T>): Observable<T>;\n        /**\n        *  Uses selector to determine which source in sources to use.\n        * @param {Function} selector The function which extracts the value for to test in a case statement.\n        * @param {Array} sources A object which has keys which correspond to the case statement labels.\n        * @param {Observable} [elseSource] The observable sequence or Promise that will be run if the sources are not matched. If this is not provided, it defaults to Rx.Observabe.empty with the specified scheduler.\n        *\n        * @returns {Observable} An observable sequence which is determined by a case statement.\n        */\n        case<T>(selector: () => number, sources: { [key: number]: ObservableOrPromise<T>; }, schedulerOrElseSource?: IScheduler | ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Expands an observable sequence by recursively invoking selector.\n        *\n        * @param {Function} selector Selector function to invoke for each produced element, resulting in another sequence to which the selector will be invoked recursively again.\n        * @param {Scheduler} [scheduler] Scheduler on which to perform the expansion. If not provided, this defaults to the current thread scheduler.\n        * @returns {Observable} An observable sequence containing all the elements produced by the recursive expansion.\n        */\n        expand(selector: (item: T) => Observable<T>, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Runs all observable sequences in parallel and collect their last elements.\n        *\n        * @example\n        *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n        *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n        * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n        */\n        forkJoin<T>(sources: ObservableOrPromise<T>[]): Observable<T[]>;\n\n        /**\n        *  Runs all observable sequences in parallel and collect their last elements.\n        *\n        * @example\n        *  1 - res = Rx.Observable.forkJoin([obs1, obs2]);\n        *  1 - res = Rx.Observable.forkJoin(obs1, obs2, ...);\n        * @returns {Observable} An observable sequence with an array collecting the last elements of all the input sequences.\n        */\n        forkJoin<T>(...args: ObservableOrPromise<T>[]): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Runs two observable sequences in parallel and combines their last elemenets.\n        *\n        * @param {Observable} second Second observable sequence.\n        * @param {Function} resultSelector Result selector function to invoke with the last elements of both sequences.\n        * @returns {Observable} An observable sequence with the result of calling the selector function with the last elements of both input sequences.\n        */\n        forkJoin<TSecond, TResult>(second: ObservableOrPromise<TSecond>, resultSelector: (left: T, right: TSecond) => TResult): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Comonadic bind operator.\n        * @param {Function} selector A transform function to apply to each element.\n        * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n        * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n        */\n        manySelect<TResult>(selector: _Selector<Observable<T>, TResult>, scheduler?: IScheduler): Observable<TResult>;\n        /**\n        * Comonadic bind operator.\n        * @param {Function} selector A transform function to apply to each element.\n        * @param {Object} scheduler Scheduler used to execute the operation. If not specified, defaults to the ImmediateScheduler.\n        * @returns {Observable} An observable sequence which results from the comonadic bind operation.\n        */\n        extend<TResult>(selector: _Selector<Observable<T>, TResult>, scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * Observables that come in between subscriptions will be dropped on the floor.\n        * @returns {Observable} A exclusive observable with only the results that happen when subscribed.\n        */\n        switchFirst(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        selectSwitchFirst<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence which performs a exclusive waiting for the first to finish before subscribing to another observable.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time performs a exclusive waiting for the first to finish before subscribing to another observable.\n        */\n        flatMapFirst<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectManyWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.flatMapWithMaxConcurrent(5, Rx.Observable.fromArray([1,2,3]));\n        * @param selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMapWithMaxConcurrent<TOther, TResult>(maxConcurrent: number, selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n}\ndeclare module \"rx.experimental\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.joinpatterns.d.ts",
    "content": "declare module Rx {\n\n    export class Plan<T> { }\n\n    export interface Pattern2<T1, T2> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T3>(other: Observable<T3>): Pattern3<T1, T2, T3>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2) => TR): Plan<TR>;\n    }\n    interface Pattern3<T1, T2, T3> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T4>(other: Observable<T4>): Pattern4<T1, T2, T3, T4>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3) => TR): Plan<TR>;\n    }\n    interface Pattern4<T1, T2, T3, T4> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T5>(other: Observable<T5>): Pattern5<T1, T2, T3, T4, T5>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4) => TR): Plan<TR>;\n    }\n    interface Pattern5<T1, T2, T3, T4, T5> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T6>(other: Observable<T6>): Pattern6<T1, T2, T3, T4, T5, T6>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5) => TR): Plan<TR>;\n    }\n    interface Pattern6<T1, T2, T3, T4, T5, T6> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T7>(other: Observable<T7>): Pattern7<T1, T2, T3, T4, T5, T6, T7>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6) => TR): Plan<TR>;\n    }\n    interface Pattern7<T1, T2, T3, T4, T5, T6, T7> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T8>(other: Observable<T8>): Pattern8<T1, T2, T3, T4, T5, T6, T7, T8>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7) => TR): Plan<TR>;\n    }\n    interface Pattern8<T1, T2, T3, T4, T5, T6, T7, T8> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T9>(other: Observable<T9>): Pattern9<T1, T2, T3, T4, T5, T6, T7, T8, T9>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8) => TR): Plan<TR>;\n    }\n    interface Pattern9<T1, T2, T3, T4, T5, T6, T7, T8, T9> {\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8, item9: T9) => TR): Plan<TR>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Creates a pattern that matches when both observable sequences have an available value.\n        *\n        *  @param right Observable sequence to match with the current sequence.\n        *  @return {Pattern} Pattern object that matches when both observable sequences have an available value.\n        */\n        and<T2>(right: Observable<T2>): Pattern2<T, T2>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Matches when the observable sequence has an available value and projects the value.\n        *\n        *  @param {Function} selector Selector that will be invoked for values in the source sequence.\n        *  @returns {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T) => TR): Plan<TR>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Joins together the results from several patterns.\n        *\n        *  @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns.\n        *  @returns {Observable} Observable sequence with the results form matching several patterns.\n        */\n        when<TR>(plan: Plan<TR>): Observable<TR>;\n    }\n\n}\ndeclare module \"rx.joinpatterns\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.joinpatterns.es6.d.ts",
    "content": "declare module Rx {\n\n    export class Plan<T> { }\n\n    export interface Pattern2<T1, T2> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T3>(other: Observable<T3>): Pattern3<T1, T2, T3>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2) => TR): Plan<TR>;\n    }\n    interface Pattern3<T1, T2, T3> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T4>(other: Observable<T4>): Pattern4<T1, T2, T3, T4>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3) => TR): Plan<TR>;\n    }\n    interface Pattern4<T1, T2, T3, T4> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T5>(other: Observable<T5>): Pattern5<T1, T2, T3, T4, T5>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4) => TR): Plan<TR>;\n    }\n    interface Pattern5<T1, T2, T3, T4, T5> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T6>(other: Observable<T6>): Pattern6<T1, T2, T3, T4, T5, T6>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5) => TR): Plan<TR>;\n    }\n    interface Pattern6<T1, T2, T3, T4, T5, T6> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T7>(other: Observable<T7>): Pattern7<T1, T2, T3, T4, T5, T6, T7>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6) => TR): Plan<TR>;\n    }\n    interface Pattern7<T1, T2, T3, T4, T5, T6, T7> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T8>(other: Observable<T8>): Pattern8<T1, T2, T3, T4, T5, T6, T7, T8>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7) => TR): Plan<TR>;\n    }\n    interface Pattern8<T1, T2, T3, T4, T5, T6, T7, T8> {\n        /**\n        *  Creates a pattern that matches the current plan matches and when the specified observable sequences has an available value.\n        *  @param other Observable sequence to match in addition to the current pattern.\n        *  @return {Pattern} Pattern object that matches when all observable sequences in the pattern have an available value.\n        */\n        and<T9>(other: Observable<T9>): Pattern9<T1, T2, T3, T4, T5, T6, T7, T8, T9>;\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8) => TR): Plan<TR>;\n    }\n    interface Pattern9<T1, T2, T3, T4, T5, T6, T7, T8, T9> {\n        /**\n        *  Matches when all observable sequences in the pattern (specified using a chain of and operators) have an available value and projects the values.\n        *  @param {Function} selector Selector that will be invoked with available values from the source sequences, in the same order of the sequences in the pattern.\n        *  @return {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8, item9: T9) => TR): Plan<TR>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Creates a pattern that matches when both observable sequences have an available value.\n        *\n        *  @param right Observable sequence to match with the current sequence.\n        *  @return {Pattern} Pattern object that matches when both observable sequences have an available value.\n        */\n        and<T2>(right: Observable<T2>): Pattern2<T, T2>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Matches when the observable sequence has an available value and projects the value.\n        *\n        *  @param {Function} selector Selector that will be invoked for values in the source sequence.\n        *  @returns {Plan} Plan that produces the projected values, to be fed (with other plans) to the when operator.\n        */\n        thenDo<TR>(selector: (item1: T) => TR): Plan<TR>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Joins together the results from several patterns.\n        *\n        *  @param plans A series of plans (specified as an Array of as a series of arguments) created by use of the Then operator on patterns.\n        *  @returns {Observable} Observable sequence with the results form matching several patterns.\n        */\n        when<TR>(plan: Plan<TR>): Observable<TR>;\n    }\n\n}\ndeclare module \"rx.joinpatterns\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.lite.d.ts",
    "content": "declare module Rx {\n\n    // Type alias for observables and promises\n    export type ObservableOrPromise<T> = IObservable<T> | Observable<T> | Promise<T>;\n\n    export type ArrayLike<T> = Array<T> | { length: number;[index: number]: T; };\n\n    // Type alias for arrays and array like objects\n    export type ArrayOrIterable<T> = ArrayLike<T>;\n\n    /**\n     * Promise A+\n     */\n    export interface Promise<T> {\n        then<R>(onFulfilled: (value: T) => R|Promise<R>, onRejected: (error: any) => Promise<R>): Promise<R>;\n        then<R>(onFulfilled: (value: T) => R|Promise<R>, onRejected?: (error: any) => R): Promise<R>;\n    }\n\n    /**\n     * Promise A+\n     */\n    export interface IPromise<T> extends Promise<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface IObservable<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface Observable<T> extends IObservable<T> { }\n\n    export module internals {\n        export interface EmptyError extends Error { message: string; }\n        export interface EmptyErrorStatic { new (): EmptyError; }\n\n        export interface ObjectDisposedError extends Error { message: string; }\n        export interface ObjectDisposedErrorStatic { new (): ObjectDisposedError; }\n\n        export interface ArgumentOutOfRangeError extends Error { message: string; }\n        export interface ArgumentOutOfRangeErrorStatic { new (): ArgumentOutOfRangeError; }\n\n        export interface NotSupportedError extends Error { message: string; }\n        export interface NotSupportedErrorStatic { new (): NotSupportedError; }\n\n        export interface NotImplementedError extends Error { message: string; }\n        export interface NotImplementedErrorStatic { new (): NotImplementedError; }\n    }\n\n    export module helpers {\n        export var notImplemented: () => internals.NotImplementedError;\n        export var notSupported: () => internals.NotSupportedError;\n    }\n\n    export module internals {\n        export var bindCallback: (func: Function, thisArg: any, argCount: number) => Function;\n    }\n\n    export module internals {\n        export var isEqual : (left: any, right: any) => boolean;\n    }\n\n    export interface IDisposable {\n        dispose(): void;\n    }\n\n    export interface Disposable extends IDisposable {\n        /** Is this value disposed. */\n        isDisposed?: boolean;\n    }\n\n    interface DisposableStatic {\n        /**\n         * Provides a set of static methods for creating Disposables.\n         * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n         */\n        new (action: () => void): Disposable;\n\n        /**\n         * Creates a disposable object that invokes the specified action when disposed.\n         * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n         * @return {Disposable} The disposable object that runs the given action upon disposal.\n         */\n        create(action: () => void): Disposable;\n\n        /**\n         * Gets the disposable that does nothing when disposed.\n         */\n        empty: IDisposable;\n\n        /**\n         * Validates whether the given object is a disposable\n         * @param {Object} Object to test whether it has a dispose method\n         * @returns {Boolean} true if a disposable object, else false.\n         */\n        isDisposable(d: any): boolean;\n    }\n\n    /**\n     * Provides a set of static methods for creating Disposables.\n     * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n     */\n    export var Disposable: DisposableStatic;\n\n    export module config {\n        export var Promise: { new <T>(resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): IPromise<T>; };\n    }\n\n    export module helpers {\n        export var noop: () => void;\n        export var notDefined: (value: any) => boolean;\n        export var identity: <T>(value: T) => T;\n        export var defaultNow: () => number;\n        export var defaultComparer: (left: any, right: any) =>  boolean;\n        export var defaultSubComparer: (left: any, right: any) =>  number;\n        export var defaultKeySerializer: (key: any) =>  string;\n        export var defaultError: (err: any) =>  void;\n        export var isPromise: (p: any) =>  boolean;\n        export var asArray: <T>(...args: T[]) =>  T[];\n        export var not: (value: any) =>  boolean;\n        export var isFunction: (value: any) =>  boolean;\n    }\n\n    export type _Selector<T, TResult> = (value: T, index: number, observable: Observable<T>) => TResult;\n    export type _ValueOrSelector<T, TResult> = TResult | _Selector<T, TResult>;\n    export type _Predicate<T> = _Selector<T, boolean>;\n    export type _Comparer<T, TResult> = (value1: T, value2: T) => TResult;\n    export type _Accumulator<T, TAcc> = (acc: TAcc, value: T) => TAcc;\n\n    export module special {\n        export type _FlatMapResultSelector<T1, T2, TResult> = (value: T1, selectorValue: T2, index: number, selectorOther: number) => TResult;\n    }\n\n    export interface IObservable<T> {\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(observer: IObserver<T>): IDisposable;\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(observer: IObserver<T>): IDisposable;\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n\n        /**\n        * Subscribes to the next value in the sequence with an optional \"this\" argument.\n        * @param {Function} onNext The function to invoke on each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnNext(onNext: (value: T) => void, thisArg?: any): IDisposable;\n        /**\n        * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n        * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnError(onError: (exception: any) => void, thisArg?: any): IDisposable;\n        /**\n        * Subscribes to the next value in the sequence with an optional \"this\" argument.\n        * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnCompleted(onCompleted: () => void, thisArg?: any): IDisposable;\n\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        forEach(observer: IObserver<T>): IDisposable;\n\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        forEach(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Determines whether the given object is an Observable\n        * @param {Any} An object to determine whether it is an Observable\n        * @returns {Boolean} true if an Observable, else false.\n        */\n        isObservable(o: any): boolean;\n    }\n\n    export var Observable: ObservableStatic;\n\n    export module internals {\n        export var inherits: (child: any, parent: any) => void;\n        export var addProperties: (obj: any, ...sources: any[]) => void;\n        export var addRef: <T>(xs: Observable<T>, r: { getDisposable(): IDisposable; }) => Observable<T>;\n    }\n\n    /**\n     * Represents a group of disposable resources that are disposed together.\n     * @constructor\n     */\n    export interface CompositeDisposable extends Disposable {\n        /**\n         * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n         * @param {Mixed} item Disposable to add.\n         */\n        add(item: IDisposable): void;\n\n        /**\n         * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n         * @param {Mixed} item Disposable to remove.\n         * @returns {Boolean} true if found; false otherwise.\n         */\n        remove(item: IDisposable): void;\n    }\n\n    interface CompositeDisposableStatic {\n        /**\n         * Represents a group of disposable resources that are disposed together.\n         * @constructor\n         */\n        new (...disposables: Rx.IDisposable[]): CompositeDisposable;\n        /**\n         * Represents a group of disposable resources that are disposed together.\n         * @constructor\n         */\n        new(disposables: Rx.IDisposable[]): CompositeDisposable;\n    }\n\n    export var CompositeDisposable: CompositeDisposableStatic;\n\n    export interface SingleAssignmentDisposable {\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        getDisposable(): IDisposable;\n\n        setDisposable(value: IDisposable): void;\n    }\n\n    interface SingleAssignmentDisposableStatic {\n        new() : SingleAssignmentDisposable;\n    }\n\n    export var SingleAssignmentDisposable : SingleAssignmentDisposableStatic;\n\n    export interface SerialDisposable {\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        getDisposable(): IDisposable;\n\n        setDisposable(value: IDisposable): void;\n    }\n\n    interface SerialDisposableStatic {\n        new() : SerialDisposable;\n    }\n\n    export var SerialDisposable : SerialDisposableStatic;\n\n    /**\n     * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n     */\n    export interface RefCountDisposable extends Disposable {\n\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        /**\n         * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n         * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n         */\n        getDisposable(): IDisposable;\n    }\n\n    interface RefCountDisposableStatic {\n        /**\n         * Initializes a new instance of the RefCountDisposable with the specified disposable.\n         * @constructor\n         * @param {Disposable} disposable Underlying disposable.\n         */\n        new(disposable: IDisposable): RefCountDisposable;\n    }\n\n    export var RefCountDisposable : RefCountDisposableStatic;\n\n    export interface IScheduler {\n        /** Gets the current time according to the local machine's system clock. */\n        now(): number;\n\n        /**\n          * Schedules an action to be executed.\n          * @param state State passed to the action to be executed.\n          * @param {Function} action Action to be executed.\n          * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n          */\n        schedule<TState>(state: TState, action: (scheduler: IScheduler, state: TState) => IDisposable): IDisposable;\n\n        /**\n         * Schedules an action to be executed after dueTime.\n         * @param state State passed to the action to be executed.\n         * @param {Function} action Action to be executed.\n         * @param {Number} dueTime Relative time after which to execute the action.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleFuture<TState>(state: TState, dueTime: number | Date, action: (scheduler: IScheduler, state: TState) => IDisposable): IDisposable;\n    }\n\n    export interface SchedulerStatic {\n        /** Gets the current time according to the local machine's system clock. */\n        now(): number;\n\n        /**\n         * Normalizes the specified TimeSpan value to a positive value.\n         * @param {Number} timeSpan The time span value to normalize.\n         * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n         */\n        normalize(timeSpan: number): number;\n\n        /** Determines whether the given object is a scheduler */\n        isScheduler(s: any): boolean;\n    }\n\n    /** Provides a set of static properties to access commonly used schedulers. */\n    export var Scheduler: SchedulerStatic;\n\n    export module internals {\n        export interface ScheduledItem<TTime> {\n            scheduler: IScheduler;\n            state: TTime;\n            action: (scheduler: IScheduler, state: any) => IDisposable;\n            dueTime: TTime;\n            comparer: (x: TTime, y: TTime) => number;\n            disposable: SingleAssignmentDisposable;\n\n            invoke(): void;\n            compareTo(other: ScheduledItem<TTime>): number;\n            isCancelled(): boolean;\n            invokeCore(): IDisposable;\n        }\n\n        interface ScheduledItemStatic {\n            new <TTime>(scheduler: IScheduler, state: any, action: (scheduler: IScheduler, state: any) => IDisposable, dueTime: TTime, comparer?: _Comparer<TTime, number>):ScheduledItem<TTime>;\n        }\n\n        export var ScheduledItem: ScheduledItemStatic\n    }\n\n    export interface IScheduler {\n        /**\n         * Schedules an action to be executed recursively.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleRecursive<TState>(state: TState, action: (state: TState, action: (state: TState) => void) => void): IDisposable;\n\n        /**\n         * Schedules an action to be executed recursively after a specified relative due time.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n         * @param {Number}dueTime Relative time after which to execute the action for the first time.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleRecursiveFuture<TState, TTime extends number | Date>(state: TState, dueTime: TTime, action: (state: TState, action: (state: TState, dueTime: TTime) => void) => void): IDisposable;\n    }\n\n    export interface IScheduler {\n        /**\n         * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n         * @param {Mixed} state Initial state passed to the action upon the first iteration.\n         * @param {Number} period Period for running the work periodically.\n         * @param {Function} action Action to be executed, potentially updating the state.\n         * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n         */\n        schedulePeriodic<TState>(state: TState, period: number, action: (state: TState) => TState): IDisposable;\n    }\n\n    export interface SchedulerStatic {\n        immediate: IScheduler;\n    }\n\n    export interface ICurrentThreadScheduler extends IScheduler {\n        scheduleRequired(): boolean;\n    }\n\n    export interface SchedulerStatic {\n        currentThread: ICurrentThreadScheduler;\n    }\n\n    export module internals {\n        export interface SchedulePeriodicRecursive {\n            start(): IDisposable;\n        }\n\n        interface SchedulePeriodicRecursiveStatic {\n            new (scheduler: any, state: any, period: any, action: any) : SchedulePeriodicRecursive;\n        }\n\n        export var SchedulePeriodicRecursive: SchedulePeriodicRecursiveStatic;\n    }\n\n    export interface SchedulerStatic {\n        default: IScheduler;\n        async: IScheduler;\n    }\n\n    export module internals {\n        // Priority Queue for Scheduling\n        export interface PriorityQueue<TTime> {\n            length: number;\n\n            isHigherPriority(left: number, right: number): boolean;\n            percolate(index: number): void;\n            heapify(index: number): void;\n            peek(): ScheduledItem<TTime>;\n            removeAt(index: number): void;\n            dequeue(): ScheduledItem<TTime>;\n            enqueue(item: ScheduledItem<TTime>): void;\n            remove(item: ScheduledItem<TTime>): boolean;\n        }\n\n        interface PriorityQueueStatic {\n                new <T>(capacity: number) : PriorityQueue<T>;\n                count: number;\n        }\n\n        export var PriorityQueue : PriorityQueueStatic;\n    }\n\n    /**\n    * Supports push-style iteration over an observable sequence.\n    */\n    export interface IObserver<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n    \n    export interface Observer<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n\n    export interface ObserverStatic {\n        /**\n        *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n        * @param {Function} [onNext] Observer's OnNext action implementation.\n        * @param {Function} [onError] Observer's OnError action implementation.\n        * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n        * @returns {Observer} The observer object implemented using the given actions.\n        */\n        create<T>(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observer<T>;\n    }\n\n    /**\n    * Supports push-style iteration over an observable sequence.\n    */\n    export var Observer: ObserverStatic;\n\n    /**\n     *  Represents a notification to an observer.\n     */\n    export interface Notification<T> {\n        /**\n         * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n         *\n         * @memberOf Notification\n         * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n         * @param {Function} onError Delegate to invoke for an OnError notification.\n         * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n         * @returns {Any} Result produced by the observation.\n         */\n        accept(observer: IObserver<T>): void;\n        /**\n         * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n         *\n         * @memberOf Notification\n         * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n         * @param {Function} onError Delegate to invoke for an OnError notification.\n         * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n         * @returns {Any} Result produced by the observation.\n         */\n        accept<TResult>(onNext: (value: T) => TResult, onError: (exception: any) => TResult, onCompleted: () => TResult): TResult;\n\n        /**\n         * Returns an observable sequence with a single notification.\n         *\n         * @memberOf Notifications\n         * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n         * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n         */\n        toObservable(scheduler?: IScheduler): Observable<T>;\n\n        hasValue: boolean;\n        equals(other: Notification<T>): boolean;\n        kind: string;\n        value: T;\n        error: any;\n    }\n\n    interface NotificationStatic {\n        new <T>(kind: any, value: any, exception: any, accept: any, acceptObservable: any, toString: any) : Notification<T>;\n\n        /**\n        * Creates an object that represents an OnNext notification to an observer.\n        * @param {Any} value The value contained in the notification.\n        * @returns {Notification} The OnNext notification containing the value.\n        */\n        createOnNext<T>(value: T): Notification<T>;\n        /**\n        * Creates an object that represents an OnError notification to an observer.\n        * @param {Any} error The exception contained in the notification.\n        * @returns {Notification} The OnError notification containing the exception.\n        */\n        createOnError<T>(exception: any): Notification<T>;\n        /**\n        * Creates an object that represents an OnCompleted notification to an observer.\n        * @returns {Notification} The OnCompleted notification.\n        */\n        createOnCompleted<T>(): Notification<T>;\n    }\n\n    export var Notification : NotificationStatic;\n\n    export module internals {\n        /**\n        * Abstract base class for implementations of the Observer class.\n        * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n        */\n        export interface AbstractObserver<T> extends Rx.IObserver<T>, Rx.IDisposable {\n            /**\n            * Notifies the observer of a new element in the sequence.\n            * @param {Any} value Next element in the sequence.\n            */\n            onNext(value: T): void;\n            /**\n            * Notifies the observer that an exception has occurred.\n            * @param {Any} error The error that has occurred.\n            */\n            onError(exception: any): void;\n            /**\n            * Notifies the observer of the end of the sequence.\n            */\n            onCompleted(): void;\n\n            isStopped: boolean;\n\n            /**\n            * Disposes the observer, causing it to transition to the stopped state.\n            */\n            dispose(): void;\n\n            fail(e: any): boolean;\n\n            // Must be implemented by other observers\n            next(value: T): void;\n            error(error: any): void;\n            completed(): void;\n        }\n\n        interface AbstractObserverStatic {\n            new <T>(): AbstractObserver<T>;\n        }\n\n        export var AbstractObserver: AbstractObserverStatic\n    }\n\n    /**\n     * Class to create an Observer instance from delegate-based implementations of the on* methods.\n     */\n    export interface AnonymousObserver<T> extends Observer<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n\n    interface AnonymousObserverStatic {\n        /**\n         * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n         * @param {Any} onNext Observer's OnNext action implementation.\n         * @param {Any} onError Observer's OnError action implementation.\n         * @param {Any} onCompleted Observer's OnCompleted action implementation.\n         */\n        new <T>(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): AnonymousObserver<T>;\n    }\n\n    export var AnonymousObserver : AnonymousObserverStatic;\n\n    export module internals {\n        export interface ScheduledObserver<T> extends Observer<T> {\n            ensureActive(): void;\n        }\n    }\n\n    export interface Observable<T> {\n        /**\n        * Creates an array from an observable sequence.\n        * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n        */\n        toArray(): Observable<T[]>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Creates an observable sequence from a specified subscribe method implementation.\n        * @example\n        *  var res = Rx.Observable.create(function (observer) { return function () { } );\n        *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n        *  var res = Rx.Observable.create(function (observer) { } );\n        * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n        * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n        */\n        create<T>(subscribe: (observer: Observer<T>) => IDisposable | Function | void): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n          *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n          *\n          * @example\n          *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n          * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n          * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n          */\n        defer<T>(observableFactory: () => ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n  *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n  *\n  * @example\n  *  var res = Rx.Observable.empty();\n  *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n  * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n  * @returns {Observable} An observable sequence with no elements.\n  */\n        empty<T>(scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * This method creates a new Observable sequence from an array-like or iterable object.\n         * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n         * @param {Function} [mapFn] Map function to call on every element of the array.\n         * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n         * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n         */\n        from<T>(array: ArrayOrIterable<T>): Observable<T>;\n        /**\n         * This method creates a new Observable sequence from an array-like or iterable object.\n         * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n         * @param {Function} [mapFn] Map function to call on every element of the array.\n         * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n         * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n         */\n        from<T, TResult>(array: ArrayOrIterable<T>, mapFn: (value: T, index: number) => TResult, thisArg?: any, scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n         * @deprecated use Observable.from or Observable.of\n         * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n         * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n         */\n        fromArray<T>(array: ArrayLike<T>, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n        * @returns {Observable} An observable sequence whose observers will never get called.\n        */\n        never<T>(): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n        * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n        */\n        of<T>(...values: T[]): Observable<T>;\n\n        /**\n        *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n        * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n        * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n        */\n        ofWithScheduler<T>(scheduler?: IScheduler, ...values: T[]): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Convert an object into an observable sequence of [key, value] pairs.\n        * @param {Object} obj The object to inspect.\n        * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n        * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n        */\n        pairs<T>(obj: { [key: string]: T }, scheduler?: IScheduler): Observable<[string, T]>;\n        /**\n        * Convert an object into an observable sequence of [key, value] pairs.\n        * @param {Object} obj The object to inspect.\n        * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n        * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n        */\n        pairs<T>(obj: { [key: number]: T }, scheduler?: IScheduler): Observable<[number, T]>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n        *\n        * @example\n        *  var res = Rx.Observable.range(0, 10);\n        *  var res = Rx.Observable.range(0, 10, Rx.Scheduler.timeout);\n        * @param {Number} start The value of the first integer in the sequence.\n        * @param {Number} count The number of sequential integers to generate.\n        * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n        * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n        */\n        range(start: number, count: number, scheduler?: IScheduler): Observable<number>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n         *\n         * @example\n         *  var res = Rx.Observable.repeat(42);\n         *  var res = Rx.Observable.repeat(42, 4);\n         *  3 - res = Rx.Observable.repeat(42, 4, Rx.Scheduler.timeout);\n         *  4 - res = Rx.Observable.repeat(42, null, Rx.Scheduler.timeout);\n         * @param {Mixed} value Element to repeat.\n         * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n         * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n         * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n         */\n        repeat<T>(value: T, repeatCount?: number | void, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n        *  There is an alias called 'just' or browsers <IE9.\n        * @param {Mixed} value Single element in the resulting observable sequence.\n        * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} An observable sequence containing the single specified element.\n        */\n        return<T>(value: T, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n        *  There is an alias called 'just' or browsers <IE9.\n        * @param {Mixed} value Single element in the resulting observable sequence.\n        * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} An observable sequence containing the single specified element.\n        */\n        just<T>(value: T, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n        * @param {Mixed} error An object used for the sequence's termination.\n        * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n        */\n        throw<T>(exception: Error, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n        * @param {Mixed} error An object used for the sequence's termination.\n        * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n        */\n        throw<T>(exception: any, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n        * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n        */\n        catch(handler: (exception: any) => ObservableOrPromise<T>): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n        * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n        */\n        catch(second: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n        * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n        */\n        catch<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n        * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n        */\n        catch<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther, TResult>(sources: ObservableOrPromise<TOther>[], resultSelector: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2>(second: ObservableOrPromise<T2>): Observable<[T, T2]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>): Observable<[T, T2, T3]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>): Observable<[T, T2, T3, T4]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>): Observable<[T, T2, T3, T4, T5]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>): Observable<[T, T2, T3, T4, T5, T6]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>): Observable<[T, T2, T3, T4, T5, T6, T7]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>): Observable<[T, T2, T3, T4, T5, T6, T7, T8]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, T9>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>): Observable<[T, T2, T3, T4, T5, T6, T7, T8, T9]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther>(sources: ObservableOrPromise<TOther>[]): Observable<TOther[]>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, eventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, T9, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther, TResult>(sources: ObservableOrPromise<TOther>[], resultSelector: (...otherValues: TOther[]) => TResult): Observable<TResult>;\n\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>): Observable<[T, T2]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>): Observable<[T, T2, T3]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>): Observable<[T, T2, T3, T4]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>): Observable<[T, T2, T3, T4, T5]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>): Observable<[T, T2, T3, T4, T5, T6]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>): Observable<[T, T2, T3, T4, T5, T6, T7]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>): Observable<[T, T2, T3, T4, T5, T6, T7, T8]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, T9>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>): Observable<[T, T2, T3, T4, T5, T6, T7, T8, T9]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<TOther>(sources: ObservableOrPromise<TOther>[]): Observable<TOther[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat(...sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Concatenates all the observable sequences.\n        * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Concatenates all the observable sequences.\n        * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n          * Concatenates an observable sequence of observable sequences.\n          * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n          */\n        concatAll(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n        * Or merges two observable sequences into a single observable sequence.\n        *\n        * @example\n        * 1 - merged = sources.merge(1);\n        * 2 - merged = source.merge(otherSource);\n        * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        merge(maxConcurrent: number): T;\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n        * Or merges two observable sequences into a single observable sequence.\n        *\n        * @example\n        * 1 - merged = sources.merge(1);\n        * 2 - merged = source.merge(otherSource);\n        * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        merge(other: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(scheduler: IScheduler, ...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(scheduler: IScheduler, sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n        * receive all successfully emitted items from all of the source Observables without being interrupted by\n        * an error notification from one of them.\n        *\n        * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n        * error via the Observer's onError, mergeDelayError will refrain from propagating that\n        * error notification until all of the merged Observables have finished emitting items.\n        * @param {Array | Arguments} args Arguments or an array to merge.\n        * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n        */\n        mergeDelayError<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n        * receive all successfully emitted items from all of the source Observables without being interrupted by\n        * an error notification from one of them.\n        *\n        * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n        * error via the Observer's onError, mergeDelayError will refrain from propagating that\n        * error notification until all of the merged Observables have finished emitting items.\n        * @param {Array | Arguments} args Arguments or an array to merge.\n        * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n        */\n        mergeDelayError<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        mergeAll(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n        * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n        * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n        */\n        skipUntil<T2>(other: ObservableOrPromise<T2>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        switch(): T;\n        /**\n        * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        switchLatest(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the values from the source observable sequence until the other observable sequence produces a value.\n        * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n        * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n        */\n        takeUntil<T2>(other: ObservableOrPromise<T2>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<TOther, TResult>(souces: ObservableOrPromise<TOther>[], resultSelector: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, TResult>(sources: ObservableOrPromise<T2>[], resultSelector?: (item1: T1, ...right: T2[]) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, TResult>(source1: ObservableOrPromise<T1>, ObservableOrPromise: Observable<T2>, resultSelector?: (item1: T1, item2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, resultSelector?: (item1: T1, item2: T2, item3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, TResult>(source1: Observable<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, T8, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, source8: ObservableOrPromise<T8>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, source8: ObservableOrPromise<T8>, source9: ObservableOrPromise<T9>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8, item9: T9) => TResult): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector?: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector?: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<TOther, TResult>(souces: ObservableOrPromise<TOther>[], resultSelector?: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n        * @param arguments Observable sources.\n        * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n        */\n        zipIterable<T>(...sources: Observable<T>[]): Observable<T[]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n        * @param arguments Observable sources.\n        * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n        */\n        zipIterable<T>(sources: Observable<T>[]): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n       *  Hides the identity of an observable sequence.\n       * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n       */\n        asObservable(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n        * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n        */\n        dematerialize<TOrigin>(): Observable<TOrigin>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.\n        *\n        *  var obs = observable.distinctUntilChanged();\n        *  var obs = observable.distinctUntilChanged(function (x) { return x.id; });\n        *  var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; });\n        *\n        * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value.\n        * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n        * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n        */\n        distinctUntilChanged<TValue>(keySelector?: (value: T) => TValue, comparer?: _Comparer<TValue, boolean>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        do(observer: Observer<T>): Observable<T>;\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tap(observer: Observer<T>): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        do(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observable<T>;\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tap(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onNext Action to invoke for each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnNext(onNext: (value: T) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnError(onError: (exception: any) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon graceful termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnCompleted(onCompleted: () => void, thisArg?: any): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onNext Action to invoke for each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnNext(onNext: (value: T) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnError(onError: (exception: any) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon graceful termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnCompleted(onCompleted: () => void, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n        * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n        * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n        */\n        finally(action: () => void): Observable<T>;\n\n        /**\n        *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n        * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n        * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n        */\n        ensure(action: () => void): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Ignores all elements in an observable sequence leaving only the termination messages.\n        * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n        */\n        ignoreElements(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n        * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n        */\n        materialize(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n         * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n         * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n         */\n        repeat(repeatCount?: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n        *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n        *\n        * @example\n        *  var res = retried = retry.repeat();\n        *  var res = retried = retry.repeat(2);\n        * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n        * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n        */\n        retry(retryCount?: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         *  Repeats the source observable sequence upon error each time the notifier emits or until it successfully terminates.\n         *  if the notifier completes, the observable sequence completes.\n         *\n         * @example\n         *  var timer = Observable.timer(500);\n         *  var source = observable.retryWhen(timer);\n         * @param {Observable} [notifier] An observable that triggers the retries or completes the observable with onNext or onCompleted respectively.\n         * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n         */\n        retryWhen(notifier: (errors: Observable<any>) => Observable<any>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n        *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n        * @example\n        *  var res = source.scan(function (acc, x) { return acc + x; });\n        *  var res = source.scan(function (acc, x) { return acc + x; }, 0);\n        * @param {Function} accumulator An accumulator function to be invoked on each element.\n        * @param {Mixed} [seed] The initial accumulator value.\n        * @returns {Observable} An observable sequence containing the accumulated values.\n        */\n        scan<TAcc>(accumulator: _Accumulator<T, TAcc>, seed?: TAcc): Observable<TAcc>;\n        /**\n        *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n        *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n        * @example\n        *  var res = source.scan(function (acc, x) { return acc + x; });\n        *  var res = source.scan(function (acc, x) { return acc + x; }, 0);\n        * @param {Function} accumulator An accumulator function to be invoked on each element.\n        * @param {Mixed} [seed] The initial accumulator value.\n        * @returns {Observable} An observable sequence containing the accumulated values.\n        */\n        scan(accumulator: _Accumulator<T, T>, seed?: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Bypasses a specified number of elements at the end of an observable sequence.\n        * @description\n        *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n        *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n        * @param count Number of elements to bypass at the end of the source sequence.\n        * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n        */\n        skipLast(count: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n        *  @example\n        *  var res = source.startWith(1, 2, 3);\n        *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n        * @param {Arguments} args The specified values to prepend to the observable sequence\n        * @returns {Observable} The source sequence prepended with the specified values.\n        */\n        startWith(...values: T[]): Observable<T>;\n        /**\n        *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n        *  @example\n        *  var res = source.startWith(1, 2, 3);\n        *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n        * @param {Arguments} args The specified values to prepend to the observable sequence\n        * @returns {Observable} The source sequence prepended with the specified values.\n        */\n        startWith(scheduler: IScheduler, ...values: T[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns a specified number of contiguous elements from the end of an observable sequence.\n        * @description\n        *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n        *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n        * @param {Number} count Number of elements to take from the end of the source sequence.\n        * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n        */\n        takeLast(count: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Projects each element of an observable sequence into a new form by incorporating the element's index.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n        */\n        select<TResult>(selector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        * Projects each element of an observable sequence into a new form by incorporating the element's index.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n        */\n        map<TResult>(selector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Retrieves the value of a specified nested property from all elements in\n        * the Observable sequence.\n        * @param {Arguments} arguments The nested properties to pluck.\n        * @returns {Observable} Returns a new Observable sequence of property values.\n        */\n        pluck<TResult>(prop: string): Observable<TResult>;\n        pluck<TResult>(...props: string[]): Observable<TResult>;\n    }\n\n\n    export interface Observable<T> {\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n        * @param {Number} count The number of elements to skip before returning the remaining elements.\n        * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n        */\n        skip(count: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n        *  The element's index is used in the logic of the predicate function.\n        *\n        *  var res = source.skipWhile(function (value) { return value < 10; });\n        *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n        */\n        skipWhile(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n        *\n        *  var res = source.take(5);\n        *  var res = source.take(0, Rx.Scheduler.timeout);\n        * @param {Number} count The number of elements to return.\n        * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n        * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n        */\n        take(count: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns elements from an observable sequence as long as a specified condition is true.\n        *  The element's index is used in the logic of the predicate function.\n        * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n        */\n        takeWhile(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n        *\n        * @example\n        *  var res = source.where(function (value) { return value < 10; });\n        *  var res = source.where(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n        */\n        where(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n        /**\n        *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n        *\n        * @example\n        *  var res = source.where(function (value) { return value < 10; });\n        *  var res = source.where(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n        */\n        filter(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult>(func: Function, context: any, selector: Function): (...args: any[]) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1>(func: (arg1: T1, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2>(func: (arg1: T1, arg2: T2, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3>(func: (arg1: T1, arg2: T2, arg3: T3, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8, T9>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9) => Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult>(func: Function, context?: any, selector?: Function): (...args: any[]) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1>(func: (arg1: T1, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2>(func: (arg1: T1, arg2: T2, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3>(func: (arg1: T1, arg2: T2, arg3: T3, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8, T9>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9) => Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n         * @param {Object} element The DOMElement or NodeList to attach a listener.\n         * @param {String} eventName The event name to attach the observable sequence.\n         * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n         * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n         */\n        fromEvent<T>(element: EventTarget, eventName: string, selector?: (arguments: any[]) => T): Observable<T>;\n        /**\n         * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n         * @param {Object} element The DOMElement or NodeList to attach a listener.\n         * @param {String} eventName The event name to attach the observable sequence.\n         * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n         * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n         */\n        fromEvent<T>(element: { on: (name: string, cb: (e: any) => any) => void; off: (name: string, cb: (e: any) => any) => void }, eventName: string, selector?: (arguments: any[]) => T): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n        * @param {Function} addHandler The function to add a handler to the emitter.\n        * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n        * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n        * @returns {Observable} An observable sequence which wraps an event from an event emitter\n        */\n        fromEventPattern<T>(addHandler: (handler: Function) => void, removeHandler: (handler: Function) => void, selector?: (arguments: any[]) => T): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Converts a Promise to an Observable sequence\n        * @param {Promise} An ES6 Compliant promise.\n        * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n        */\n \t\tfromPromise<T>(promise: Promise<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /*\n         * Converts an existing observable sequence to an ES6 Compatible Promise\n         * @example\n         * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n         *\n         * // With config\n         * Rx.config.Promise = RSVP.Promise;\n         * var promise = Rx.Observable.return(42).toPromise();\n         * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n         * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n         */\n        toPromise(promiseCtor?: { new (resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): IPromise<T>; }): IPromise<T>;\n        /*\n         * Converts an existing observable sequence to an ES6 Compatible Promise\n         * @example\n         * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n         *\n         * // With config\n         * Rx.config.Promise = RSVP.Promise;\n         * var promise = Rx.Observable.return(42).toPromise();\n         * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n         * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n         */\n        toPromise<TPromise extends IPromise<T>>(promiseCtor: { new (resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): TPromise; }): TPromise;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Invokes the asynchronous function, surfacing the result through an observable sequence.\n        * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n        * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n        */\n        startAsync<T>(functionAsync: () => IPromise<T>): Observable<T>;\n    }\n\n    /**\n     *  Represents an object that is both an observable sequence as well as an observer.\n     *  Each notification is broadcasted to all subscribed observers.\n     */\n    export interface ISubject<T> extends IObservable<T>, IObserver<T>, IDisposable {\n        hasObservers(): boolean;\n    }\n\n    export interface Subject<T> extends Observable<T>, Observer<T>, IDisposable {\n        hasObservers(): boolean;\n        /** Is this value disposed. */\n        isDisposed: boolean;\n    }\n\n    interface SubjectStatic {\n        /**\n         * Creates a subject.\n         */\n        new <T>(): Subject<T>;\n\n        /**\n         * Creates a subject from the specified observer and observable.\n         * @param {Observer} observer The observer used to send messages to the subject.\n         * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n         * @returns {Subject} Subject implemented using the given observer and observable.\n         */\n        create<T>(observer?: IObserver<T>, observable?: IObservable<T>): Subject<T>;\n    }\n\n    /**\n     *  Represents an object that is both an observable sequence as well as an observer.\n     *  Each notification is broadcasted to all subscribed observers.\n     */\n    export var Subject: SubjectStatic;\n\n        export interface ConnectableObservable<T> extends Observable<T> {\n    \t\tconnect(): IDisposable;\n    \t\trefCount(): Observable<T>;\n        }\n\n    export interface Observable<T> {\n        /**\n        * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n        * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n        * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n        *\n        * @example\n        * 1 - res = source.multicast(observable);\n        * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n        *\n        * @param {Function|Subject} subjectOrSubjectSelector\n        * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n        * Or:\n        * Subject to push source elements into.\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        multicast(subject: ISubject<T> | (() => ISubject<T>)): ConnectableObservable<T>;\n        /**\n        * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n        * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n        * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n        *\n        * @example\n        * 1 - res = source.multicast(observable);\n        * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n        *\n        * @param {Function|Subject} subjectOrSubjectSelector\n        * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n        * Or:\n        * Subject to push source elements into.\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        multicast<TResult>(subjectSelector: ISubject<T> | (() => ISubject<T>), selector: (source: ConnectableObservable<T>) => Observable<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of Multicast using a regular Subject.\n        *\n        * @example\n        * var resres = source.publish();\n        * var res = source.publish(function (x) { return x; });\n        *\n        * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publish(): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of Multicast using a regular Subject.\n        *\n        * @example\n        * var resres = source.publish();\n        * var res = source.publish(function (x) { return x; });\n        *\n        * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publish<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        share(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n        * This operator is a specialization of Multicast using a AsyncSubject.\n        *\n        * @example\n        * var res = source.publishLast();\n        * var res = source.publishLast(function (x) { return x; });\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishLast(): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n        * This operator is a specialization of Multicast using a AsyncSubject.\n        *\n        * @example\n        * var res = source.publishLast();\n        * var res = source.publishLast(function (x) { return x; });\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishLast<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n        * This operator is a specialization of Multicast using a BehaviorSubject.\n        *\n        * @example\n        * var res = source.publishValue(42);\n        * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishValue(initialValue: T): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n        * This operator is a specialization of Multicast using a BehaviorSubject.\n        *\n        * @example\n        * var res = source.publishValue(42);\n        * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishValue<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>, initialValue: T): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n        * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        shareValue(initialValue: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of Multicast using a ReplaySubject.\n        *\n        * @example\n        * var res = source.replay(null, 3);\n        * var res = source.replay(null, 3, 500);\n        * var res = source.replay(null, 3, 500, scheduler);\n        * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param windowSize [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        replay(selector?: void, bufferSize?: number, window?: number, scheduler?: IScheduler): ConnectableObservable<T>;\t// hack to catch first omitted parameter\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of Multicast using a ReplaySubject.\n        *\n        * @example\n        * var res = source.replay(null, 3);\n        * var res = source.replay(null, 3, 500);\n        * var res = source.replay(null, 3, 500, scheduler);\n        * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param windowSize [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        replay(selector: (source: ConnectableObservable<T>) => Observable<T>, bufferSize?: number, window?: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        *\n        * @example\n        * var res = source.shareReplay(3);\n        * var res = source.shareReplay(3, 500);\n        * var res = source.shareReplay(3, 500, scheduler);\n        *\n\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param window [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        shareReplay(bufferSize?: number, window?: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Returns an observable sequence that produces a value after each period.\n         *\n         * @example\n         *  1 - res = Rx.Observable.interval(1000);\n         *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n         *\n         * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n         * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n         * @returns {Observable} An observable sequence that produces a value after each period.\n         */\n        interval(period: number, scheduler?: IScheduler): Observable<number>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n         * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n         * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n         * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n         * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n         */\n        timer(dueTime: number, period: number, scheduler?: IScheduler): Observable<number>;\n        /**\n         *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n         * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n         * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n         * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n         * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n         */\n        timer(dueTime: number, scheduler?: IScheduler): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n        *\n        * @example\n        *  1 - res = Rx.Observable.delay(new Date());\n        *  2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout);\n        *\n        *  3 - res = Rx.Observable.delay(5000);\n        *  4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout);\n        * @memberOf Observable#\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n        * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(dueTime: Date, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n        *\n        * @example\n        *  1 - res = Rx.Observable.delay(new Date());\n        *  2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout);\n        *\n        *  3 - res = Rx.Observable.delay(5000);\n        *  4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout);\n        * @memberOf Observable#\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n        * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(dueTime: number, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Time shifts the observable sequence based on a subscription delay and a delay selector function for each element.\n        *\n        * @example\n        *  1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only\n        *  1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector\n        *\n        * @param {Observable} [subscriptionDelay]  Sequence indicating the delay for the subscription to the source.\n        * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(delayDurationSelector: (item: T) => ObservableOrPromise<number>): Observable<T>;\n\n        /**\n        *  Time shifts the observable sequence based on a subscription delay and a delay selector function for each element.\n        *\n        * @example\n        *  1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only\n        *  1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector\n        *\n        * @param {Observable} [subscriptionDelay]  Sequence indicating the delay for the subscription to the source.\n        * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(subscriptionDelay: Observable<number>, delayDurationSelector: (item: T) => ObservableOrPromise<number>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Ignores values from an observable sequence which are followed by another value before dueTime.\n        * @param {Number} dueTime Duration of the debounce period for each value (specified as an integer denoting milliseconds).\n        * @param {Scheduler} [scheduler]  Scheduler to run the debounce timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The debounced sequence.\n        */\n        debounce(dueTime: number, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        * Ignores values from an observable sequence which are followed by another value within a computed throttle duration.\n        * @param {Function} durationSelector Selector function to retrieve a sequence indicating the throttle duration for each given element.\n        * @returns {Observable} The debounced sequence.\n        */\n        debounce(debounceDurationSelector: (item: T) => ObservableOrPromise<any>): Observable<T>;\n    }\n\n    export interface Timestamp<T> {\n        value: T;\n        timestamp: number;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Records the timestamp for each value in an observable sequence.\n        *\n        * @example\n        *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n        *  2 - res = source.timestamp(Rx.Scheduler.default);\n        *\n        * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the default scheduler is used.\n        * @returns {Observable} An observable sequence with timestamp information on values.\n        */\n        timestamp(scheduler?: IScheduler): Observable<Timestamp<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        sample(intervalOrSampler: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        sample<TSample>(sampler: Observable<TSample>, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        throttleLatest(interval: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        throttleLatest<TSample>(sampler: Observable<TSample>, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: Date, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: Date, other?: Observable<T>, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: number, other?: Observable<T>, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(timeoutdurationSelector: (item: T) => Observable<TTimeout>): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @param {Observable} other  Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException().\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(timeoutdurationSelector: (item: T) => Observable<TTimeout>, other: Observable<T>): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Observable} [firstTimeout]  Observable sequence that represents the timeout for the first element. If not provided, this defaults to Observable.never().\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException().\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(firstTimeout: Observable<TTimeout>, timeoutdurationSelector: (item: T) => Observable<TTimeout>, other?: Observable<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n        * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n        * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n        * @returns {Observable} An Observable that performs the throttle operation.\n        */\n        throttle(windowDuration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n         * @example\n         * var pauser = new Rx.Subject();\n         * var source = Rx.Observable.interval(100).pausable(pauser);\n         * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n         * @returns {Observable} The observable sequence which is paused based upon the pauser.\n         */\n        pausable(pauser?: Observable<boolean>): PausableObservable<T>;\n    }\n\n    export interface PausableObservable<T> extends Observable<T> {\n        pause(): void;\n        resume(): void;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n         * and yields the values that were buffered while paused.\n         * @example\n         * var pauser = new Rx.Subject();\n         * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n         * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n         * @returns {Observable} The observable sequence which is paused based upon the pauser.\n         */\n        pausableBuffered(pauser?: Observable<boolean>): PausableObservable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Attaches a controller to the observable sequence with the ability to queue.\n        * @example\n        * var source = Rx.Observable.interval(100).controlled();\n        * source.request(3); // Reads 3 values\n        * @param {bool} enableQueue truthy value to determine if values should be queued pending the next request\n        * @param {Scheduler} scheduler determines how the requests will be scheduled\n        * @returns {Observable} The observable sequence which only propagates values on request.\n        */\n        controlled(enableQueue?: boolean, scheduler?: IScheduler): ControlledObservable<T>;\n    }\n\n    export interface ControlledObservable<T> extends Observable<T> {\n        request(numberOfItems?: number): IDisposable;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Pipes the existing Observable sequence into a Node.js Stream.\n        * @param {Stream} dest The destination Node.js stream.\n        * @returns {Stream} The destination stream.\n        */\n        pipe<TDest>(dest: TDest): TDest;\n        // TODO: Add link to node.d.ts some where\n    }\n\n    export interface Observable<T> {\n        /**\n         * Executes a transducer to transform the observable sequence\n         * @param {Transducer} transducer A transducer to execute\n         * @returns {Observable} An Observable sequence containing the results from the transducer.\n         */\n        transduce(transducer: any): any;\n        //TODO: Setup transducer\n    }\n\n    export interface AnonymousObservable<T> extends Observable<T> { }\n\n    export interface AsyncSubject<T> extends Subject<T> { }\n\n    interface AsyncSubjectStatic {\n        /**\n         * Creates a subject that can only receive one value and that value is cached for all future observations.\n         * @constructor\n         */\n        new <T>(): AsyncSubject<T>;\n    }\n\n    /**\n     *  Represents the result of an asynchronous operation.\n     *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n     */\n    export var AsyncSubject: AsyncSubjectStatic;\n\n    export interface AnonymousSubject<T> extends Subject<T> { }\n\n    interface AnonymousSubjectStatic {\n        /**\n         * Creates a subject that can only receive one value and that value is cached for all future observations.\n         * @constructor\n         */\n        new <T>(): AnonymousSubject<T>;\n    }\n\n    /**\n     *  Represents the result of an asynchronous operation.\n     *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n     */\n    export var AnonymousSubject: AnonymousSubjectStatic;\n\n    export interface BehaviorSubject<T> extends Subject<T> {\n        /**\n         * Gets the current value or throws an exception.\n         * Value is frozen after onCompleted is called.\n         * After onError is called always throws the specified exception.\n         * An exception is always thrown after dispose is called.\n         * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n         */\n        getValue(): T;\n    }\n\n    interface BehaviorSubjectStatic {\n        /**\n         *  Initializes a new instance of the BehaviorSubject class which creates a subject that caches its last value and starts with the specified value.\n         *  @param {Mixed} value Initial value sent to observers when no other value has been received by the subject yet.\n         */\n        new <T>(initialValue: T): BehaviorSubject<T>;\n    }\n\n    /**\n     *  Represents a value that changes over time.\n     *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n     */\n    export var BehaviorSubject: BehaviorSubjectStatic;\n\n    export interface ReplaySubject<T> extends Subject<T> { }\n\n    interface ReplaySubjectStatic {\n        /**\n         *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n         *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n         *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n         *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n         */\n        new <T>(bufferSize?: number, window?: number, scheduler?: IScheduler): ReplaySubject<T>;\n    }\n\n    /**\n    * Represents an object that is both an observable sequence as well as an observer.\n    * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n    */\n    export var ReplaySubject: ReplaySubjectStatic;\n\n    /**\n    * Used to pause and resume streams.\n    */\n    export interface Pauser {\n        /**\n         * Pauses the underlying sequence.\n         */\n        pause(): void;\n\n        /**\n        * Resumes the underlying sequence.\n        */\n        resume(): void;\n    }\n\n}\n\ndeclare module \"rx\" { export = Rx; }\ndeclare module \"rx.lite\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.lite.es6.d.ts",
    "content": "declare module Rx {\n\n    // Type alias for observables and promises\n    export type ObservableOrPromise<T> = IObservable<T> | Observable<T> | Promise<T>;\n\n    export type ArrayLike<T> = Array<T> | { length: number;[index: number]: T; };\n\n    // Type alias for arrays and array like objects\n    export type ArrayOrIterable<T> = ArrayLike<T> | Iterable<T>;\n\n    /**\n     * Promise A+\n     */\n    export interface Promise<T> extends PromiseLike<T> { }\n\n    /**\n     * Promise A+\n     */\n    export interface IPromise<T> extends PromiseLike<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface IObservable<T> { }\n\n    /**\n    * Represents a push-style collection.\n    */\n    export interface Observable<T> extends IObservable<T> { }\n\n    export module internals {\n        export interface EmptyError extends Error { message: string; }\n        export interface EmptyErrorStatic { new (): EmptyError; }\n\n        export interface ObjectDisposedError extends Error { message: string; }\n        export interface ObjectDisposedErrorStatic { new (): ObjectDisposedError; }\n\n        export interface ArgumentOutOfRangeError extends Error { message: string; }\n        export interface ArgumentOutOfRangeErrorStatic { new (): ArgumentOutOfRangeError; }\n\n        export interface NotSupportedError extends Error { message: string; }\n        export interface NotSupportedErrorStatic { new (): NotSupportedError; }\n\n        export interface NotImplementedError extends Error { message: string; }\n        export interface NotImplementedErrorStatic { new (): NotImplementedError; }\n    }\n\n    export module helpers {\n        export var notImplemented: () => internals.NotImplementedError;\n        export var notSupported: () => internals.NotSupportedError;\n    }\n\n    export module internals {\n        export var bindCallback: (func: Function, thisArg: any, argCount: number) => Function;\n    }\n\n    export module internals {\n        export var isEqual : (left: any, right: any) => boolean;\n    }\n\n    export interface IDisposable {\n        dispose(): void;\n    }\n\n    export interface Disposable extends IDisposable {\n        /** Is this value disposed. */\n        isDisposed?: boolean;\n    }\n\n    interface DisposableStatic {\n        /**\n         * Provides a set of static methods for creating Disposables.\n         * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n         */\n        new (action: () => void): Disposable;\n\n        /**\n         * Creates a disposable object that invokes the specified action when disposed.\n         * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n         * @return {Disposable} The disposable object that runs the given action upon disposal.\n         */\n        create(action: () => void): Disposable;\n\n        /**\n         * Gets the disposable that does nothing when disposed.\n         */\n        empty: IDisposable;\n\n        /**\n         * Validates whether the given object is a disposable\n         * @param {Object} Object to test whether it has a dispose method\n         * @returns {Boolean} true if a disposable object, else false.\n         */\n        isDisposable(d: any): boolean;\n    }\n\n    /**\n     * Provides a set of static methods for creating Disposables.\n     * @param {Function} dispose Action to run during the first call to dispose. The action is guaranteed to be run at most once.\n     */\n    export var Disposable: DisposableStatic;\n\n    export module config {\n        export var Promise: { new <T>(resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): IPromise<T>; };\n    }\n\n    export module helpers {\n        export var noop: () => void;\n        export var notDefined: (value: any) => boolean;\n        export var identity: <T>(value: T) => T;\n        export var defaultNow: () => number;\n        export var defaultComparer: (left: any, right: any) =>  boolean;\n        export var defaultSubComparer: (left: any, right: any) =>  number;\n        export var defaultKeySerializer: (key: any) =>  string;\n        export var defaultError: (err: any) =>  void;\n        export var isPromise: (p: any) =>  boolean;\n        export var asArray: <T>(...args: T[]) =>  T[];\n        export var not: (value: any) =>  boolean;\n        export var isFunction: (value: any) =>  boolean;\n    }\n\n    export type _Selector<T, TResult> = (value: T, index: number, observable: Observable<T>) => TResult;\n    export type _ValueOrSelector<T, TResult> = TResult | _Selector<T, TResult>;\n    export type _Predicate<T> = _Selector<T, boolean>;\n    export type _Comparer<T, TResult> = (value1: T, value2: T) => TResult;\n    export type _Accumulator<T, TAcc> = (acc: TAcc, value: T) => TAcc;\n\n    export module special {\n        export type _FlatMapResultSelector<T1, T2, TResult> = (value: T1, selectorValue: T2, index: number, selectorOther: number) => TResult;\n    }\n\n    export interface IObservable<T> {\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(observer: IObserver<T>): IDisposable;\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(observer: IObserver<T>): IDisposable;\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribe(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n\n        /**\n        * Subscribes to the next value in the sequence with an optional \"this\" argument.\n        * @param {Function} onNext The function to invoke on each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnNext(onNext: (value: T) => void, thisArg?: any): IDisposable;\n        /**\n        * Subscribes to an exceptional condition in the sequence with an optional \"this\" argument.\n        * @param {Function} onError The function to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnError(onError: (exception: any) => void, thisArg?: any): IDisposable;\n        /**\n        * Subscribes to the next value in the sequence with an optional \"this\" argument.\n        * @param {Function} onCompleted The function to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        subscribeOnCompleted(onCompleted: () => void, thisArg?: any): IDisposable;\n\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        forEach(observer: IObserver<T>): IDisposable;\n\n        /**\n        *  Subscribes an o to the observable sequence.\n        *  @param {Mixed} [oOrOnNext] The object that is to receive notifications or an action to invoke for each element in the observable sequence.\n        *  @param {Function} [onError] Action to invoke upon exceptional termination of the observable sequence.\n        *  @param {Function} [onCompleted] Action to invoke upon graceful termination of the observable sequence.\n        *  @returns {Disposable} A disposable handling the subscriptions and unsubscriptions.\n        */\n        forEach(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): IDisposable;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Determines whether the given object is an Observable\n        * @param {Any} An object to determine whether it is an Observable\n        * @returns {Boolean} true if an Observable, else false.\n        */\n        isObservable(o: any): boolean;\n    }\n\n    export var Observable: ObservableStatic;\n\n    export module internals {\n        export var inherits: (child: any, parent: any) => void;\n        export var addProperties: (obj: any, ...sources: any[]) => void;\n        export var addRef: <T>(xs: Observable<T>, r: { getDisposable(): IDisposable; }) => Observable<T>;\n    }\n\n    /**\n     * Represents a group of disposable resources that are disposed together.\n     * @constructor\n     */\n    export interface CompositeDisposable extends Disposable {\n        /**\n         * Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.\n         * @param {Mixed} item Disposable to add.\n         */\n        add(item: IDisposable): void;\n\n        /**\n         * Removes and disposes the first occurrence of a disposable from the CompositeDisposable.\n         * @param {Mixed} item Disposable to remove.\n         * @returns {Boolean} true if found; false otherwise.\n         */\n        remove(item: IDisposable): void;\n    }\n\n    interface CompositeDisposableStatic {\n        /**\n         * Represents a group of disposable resources that are disposed together.\n         * @constructor\n         */\n        new (...disposables: Rx.IDisposable[]): CompositeDisposable;\n        /**\n         * Represents a group of disposable resources that are disposed together.\n         * @constructor\n         */\n        new(disposables: Rx.IDisposable[]): CompositeDisposable;\n    }\n\n    export var CompositeDisposable: CompositeDisposableStatic;\n\n    export interface SingleAssignmentDisposable {\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        getDisposable(): IDisposable;\n\n        setDisposable(value: IDisposable): void;\n    }\n\n    interface SingleAssignmentDisposableStatic {\n        new() : SingleAssignmentDisposable;\n    }\n\n    export var SingleAssignmentDisposable : SingleAssignmentDisposableStatic;\n\n    export interface SerialDisposable {\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        getDisposable(): IDisposable;\n\n        setDisposable(value: IDisposable): void;\n    }\n\n    interface SerialDisposableStatic {\n        new() : SerialDisposable;\n    }\n\n    export var SerialDisposable : SerialDisposableStatic;\n\n    /**\n     * Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed.\n     */\n    export interface RefCountDisposable extends Disposable {\n\n        /** Performs the task of cleaning up resources. */\n        dispose(): void;\n\n        /** Is this value disposed. */\n        isDisposed: boolean;\n\n        /**\n         * Returns a dependent disposable that when disposed decreases the refcount on the underlying disposable.\n         * @returns {Disposable} A dependent disposable contributing to the reference count that manages the underlying disposable's lifetime.\n         */\n        getDisposable(): IDisposable;\n    }\n\n    interface RefCountDisposableStatic {\n        /**\n         * Initializes a new instance of the RefCountDisposable with the specified disposable.\n         * @constructor\n         * @param {Disposable} disposable Underlying disposable.\n         */\n        new(disposable: IDisposable): RefCountDisposable;\n    }\n\n    export var RefCountDisposable : RefCountDisposableStatic;\n\n    export interface IScheduler {\n        /** Gets the current time according to the local machine's system clock. */\n        now(): number;\n\n        /**\n          * Schedules an action to be executed.\n          * @param state State passed to the action to be executed.\n          * @param {Function} action Action to be executed.\n          * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n          */\n        schedule<TState>(state: TState, action: (scheduler: IScheduler, state: TState) => IDisposable): IDisposable;\n\n        /**\n         * Schedules an action to be executed after dueTime.\n         * @param state State passed to the action to be executed.\n         * @param {Function} action Action to be executed.\n         * @param {Number} dueTime Relative time after which to execute the action.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleFuture<TState>(state: TState, dueTime: number | Date, action: (scheduler: IScheduler, state: TState) => IDisposable): IDisposable;\n    }\n\n    export interface SchedulerStatic {\n        /** Gets the current time according to the local machine's system clock. */\n        now(): number;\n\n        /**\n         * Normalizes the specified TimeSpan value to a positive value.\n         * @param {Number} timeSpan The time span value to normalize.\n         * @returns {Number} The specified TimeSpan value if it is zero or positive; otherwise, 0\n         */\n        normalize(timeSpan: number): number;\n\n        /** Determines whether the given object is a scheduler */\n        isScheduler(s: any): boolean;\n    }\n\n    /** Provides a set of static properties to access commonly used schedulers. */\n    export var Scheduler: SchedulerStatic;\n\n    export module internals {\n        export interface ScheduledItem<TTime> {\n            scheduler: IScheduler;\n            state: TTime;\n            action: (scheduler: IScheduler, state: any) => IDisposable;\n            dueTime: TTime;\n            comparer: (x: TTime, y: TTime) => number;\n            disposable: SingleAssignmentDisposable;\n\n            invoke(): void;\n            compareTo(other: ScheduledItem<TTime>): number;\n            isCancelled(): boolean;\n            invokeCore(): IDisposable;\n        }\n\n        interface ScheduledItemStatic {\n            new <TTime>(scheduler: IScheduler, state: any, action: (scheduler: IScheduler, state: any) => IDisposable, dueTime: TTime, comparer?: _Comparer<TTime, number>):ScheduledItem<TTime>;\n        }\n\n        export var ScheduledItem: ScheduledItemStatic\n    }\n\n    export interface IScheduler {\n        /**\n         * Schedules an action to be executed recursively.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in recursive invocation state.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleRecursive<TState>(state: TState, action: (state: TState, action: (state: TState) => void) => void): IDisposable;\n\n        /**\n         * Schedules an action to be executed recursively after a specified relative due time.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Function} action Action to execute recursively. The last parameter passed to the action is used to trigger recursive scheduling of the action, passing in the recursive due time and invocation state.\n         * @param {Number}dueTime Relative time after which to execute the action for the first time.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleRecursiveFuture<TState, TTime extends number | Date>(state: TState, dueTime: TTime, action: (state: TState, action: (state: TState, dueTime: TTime) => void) => void): IDisposable;\n    }\n\n    export interface IScheduler {\n        /**\n         * Schedules a periodic piece of work by dynamically discovering the scheduler's capabilities. The periodic task will be scheduled using window.setInterval for the base implementation.\n         * @param {Mixed} state Initial state passed to the action upon the first iteration.\n         * @param {Number} period Period for running the work periodically.\n         * @param {Function} action Action to be executed, potentially updating the state.\n         * @returns {Disposable} The disposable object used to cancel the scheduled recurring action (best effort).\n         */\n        schedulePeriodic<TState>(state: TState, period: number, action: (state: TState) => TState): IDisposable;\n    }\n\n    export interface SchedulerStatic {\n        immediate: IScheduler;\n    }\n\n    export interface ICurrentThreadScheduler extends IScheduler {\n        scheduleRequired(): boolean;\n    }\n\n    export interface SchedulerStatic {\n        currentThread: ICurrentThreadScheduler;\n    }\n\n    export module internals {\n        export interface SchedulePeriodicRecursive {\n            start(): IDisposable;\n        }\n\n        interface SchedulePeriodicRecursiveStatic {\n            new (scheduler: any, state: any, period: any, action: any) : SchedulePeriodicRecursive;\n        }\n\n        export var SchedulePeriodicRecursive: SchedulePeriodicRecursiveStatic;\n    }\n\n    export interface SchedulerStatic {\n        default: IScheduler;\n        async: IScheduler;\n    }\n\n    export module internals {\n        // Priority Queue for Scheduling\n        export interface PriorityQueue<TTime> {\n            length: number;\n\n            isHigherPriority(left: number, right: number): boolean;\n            percolate(index: number): void;\n            heapify(index: number): void;\n            peek(): ScheduledItem<TTime>;\n            removeAt(index: number): void;\n            dequeue(): ScheduledItem<TTime>;\n            enqueue(item: ScheduledItem<TTime>): void;\n            remove(item: ScheduledItem<TTime>): boolean;\n        }\n\n        interface PriorityQueueStatic {\n                new <T>(capacity: number) : PriorityQueue<T>;\n                count: number;\n        }\n\n        export var PriorityQueue : PriorityQueueStatic;\n    }\n\n    /**\n    * Supports push-style iteration over an observable sequence.\n    */\n    export interface IObserver<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n    \n    export interface Observer<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n\n    export interface ObserverStatic {\n        /**\n        *  Creates an observer from the specified OnNext, along with optional OnError, and OnCompleted actions.\n        * @param {Function} [onNext] Observer's OnNext action implementation.\n        * @param {Function} [onError] Observer's OnError action implementation.\n        * @param {Function} [onCompleted] Observer's OnCompleted action implementation.\n        * @returns {Observer} The observer object implemented using the given actions.\n        */\n        create<T>(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observer<T>;\n    }\n\n    /**\n    * Supports push-style iteration over an observable sequence.\n    */\n    export var Observer: ObserverStatic;\n\n    /**\n     *  Represents a notification to an observer.\n     */\n    export interface Notification<T> {\n        /**\n         * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n         *\n         * @memberOf Notification\n         * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n         * @param {Function} onError Delegate to invoke for an OnError notification.\n         * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n         * @returns {Any} Result produced by the observation.\n         */\n        accept(observer: IObserver<T>): void;\n        /**\n         * Invokes the delegate corresponding to the notification or the observer's method corresponding to the notification and returns the produced result.\n         *\n         * @memberOf Notification\n         * @param {Any} observerOrOnNext Delegate to invoke for an OnNext notification or Observer to invoke the notification on..\n         * @param {Function} onError Delegate to invoke for an OnError notification.\n         * @param {Function} onCompleted Delegate to invoke for an OnCompleted notification.\n         * @returns {Any} Result produced by the observation.\n         */\n        accept<TResult>(onNext: (value: T) => TResult, onError: (exception: any) => TResult, onCompleted: () => TResult): TResult;\n\n        /**\n         * Returns an observable sequence with a single notification.\n         *\n         * @memberOf Notifications\n         * @param {Scheduler} [scheduler] Scheduler to send out the notification calls on.\n         * @returns {Observable} The observable sequence that surfaces the behavior of the notification upon subscription.\n         */\n        toObservable(scheduler?: IScheduler): Observable<T>;\n\n        hasValue: boolean;\n        equals(other: Notification<T>): boolean;\n        kind: string;\n        value: T;\n        error: any;\n    }\n\n    interface NotificationStatic {\n        new <T>(kind: any, value: any, exception: any, accept: any, acceptObservable: any, toString: any) : Notification<T>;\n\n        /**\n        * Creates an object that represents an OnNext notification to an observer.\n        * @param {Any} value The value contained in the notification.\n        * @returns {Notification} The OnNext notification containing the value.\n        */\n        createOnNext<T>(value: T): Notification<T>;\n        /**\n        * Creates an object that represents an OnError notification to an observer.\n        * @param {Any} error The exception contained in the notification.\n        * @returns {Notification} The OnError notification containing the exception.\n        */\n        createOnError<T>(exception: any): Notification<T>;\n        /**\n        * Creates an object that represents an OnCompleted notification to an observer.\n        * @returns {Notification} The OnCompleted notification.\n        */\n        createOnCompleted<T>(): Notification<T>;\n    }\n\n    export var Notification : NotificationStatic;\n\n    export module internals {\n        /**\n        * Abstract base class for implementations of the Observer class.\n        * This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.\n        */\n        export interface AbstractObserver<T> extends Rx.IObserver<T>, Rx.IDisposable {\n            /**\n            * Notifies the observer of a new element in the sequence.\n            * @param {Any} value Next element in the sequence.\n            */\n            onNext(value: T): void;\n            /**\n            * Notifies the observer that an exception has occurred.\n            * @param {Any} error The error that has occurred.\n            */\n            onError(exception: any): void;\n            /**\n            * Notifies the observer of the end of the sequence.\n            */\n            onCompleted(): void;\n\n            isStopped: boolean;\n\n            /**\n            * Disposes the observer, causing it to transition to the stopped state.\n            */\n            dispose(): void;\n\n            fail(e: any): boolean;\n\n            // Must be implemented by other observers\n            next(value: T): void;\n            error(error: any): void;\n            completed(): void;\n        }\n\n        interface AbstractObserverStatic {\n            new <T>(): AbstractObserver<T>;\n        }\n\n        export var AbstractObserver: AbstractObserverStatic\n    }\n\n    /**\n     * Class to create an Observer instance from delegate-based implementations of the on* methods.\n     */\n    export interface AnonymousObserver<T> extends Observer<T> {\n        /**\n        * Notifies the observer of a new element in the sequence.\n        * @param {Any} value Next element in the sequence.\n        */\n        onNext(value: T): void;\n        /**\n        * Notifies the observer that an exception has occurred.\n        * @param {Any} error The error that has occurred.\n        */\n        onError(exception: any): void;\n        /**\n        * Notifies the observer of the end of the sequence.\n        */\n        onCompleted(): void;\n    }\n\n    interface AnonymousObserverStatic {\n        /**\n         * Creates an observer from the specified OnNext, OnError, and OnCompleted actions.\n         * @param {Any} onNext Observer's OnNext action implementation.\n         * @param {Any} onError Observer's OnError action implementation.\n         * @param {Any} onCompleted Observer's OnCompleted action implementation.\n         */\n        new <T>(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): AnonymousObserver<T>;\n    }\n\n    export var AnonymousObserver : AnonymousObserverStatic;\n\n    export module internals {\n        export interface ScheduledObserver<T> extends Observer<T> {\n            ensureActive(): void;\n        }\n    }\n\n    export interface Observable<T> {\n        /**\n        * Creates an array from an observable sequence.\n        * @returns {Observable} An observable sequence containing a single element with a list containing all the elements of the source sequence.\n        */\n        toArray(): Observable<T[]>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Creates an observable sequence from a specified subscribe method implementation.\n        * @example\n        *  var res = Rx.Observable.create(function (observer) { return function () { } );\n        *  var res = Rx.Observable.create(function (observer) { return Rx.Disposable.empty; } );\n        *  var res = Rx.Observable.create(function (observer) { } );\n        * @param {Function} subscribe Implementation of the resulting observable sequence's subscribe method, returning a function that will be wrapped in a Disposable.\n        * @returns {Observable} The observable sequence with the specified implementation for the Subscribe method.\n        */\n        create<T>(subscribe: (observer: Observer<T>) => IDisposable | Function | void): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n          *  Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes.\n          *\n          * @example\n          *  var res = Rx.Observable.defer(function () { return Rx.Observable.fromArray([1,2,3]); });\n          * @param {Function} observableFactory Observable factory function to invoke for each observer that subscribes to the resulting sequence or Promise.\n          * @returns {Observable} An observable sequence whose observers trigger an invocation of the given observable factory function.\n          */\n        defer<T>(observableFactory: () => ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n  *  Returns an empty observable sequence, using the specified scheduler to send out the single OnCompleted message.\n  *\n  * @example\n  *  var res = Rx.Observable.empty();\n  *  var res = Rx.Observable.empty(Rx.Scheduler.timeout);\n  * @param {Scheduler} [scheduler] Scheduler to send the termination call on.\n  * @returns {Observable} An observable sequence with no elements.\n  */\n        empty<T>(scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * This method creates a new Observable sequence from an array-like or iterable object.\n         * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n         * @param {Function} [mapFn] Map function to call on every element of the array.\n         * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n         * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n         */\n        from<T>(array: ArrayOrIterable<T>): Observable<T>;\n        /**\n         * This method creates a new Observable sequence from an array-like or iterable object.\n         * @param {Any} arrayLike An array-like or iterable object to convert to an Observable sequence.\n         * @param {Function} [mapFn] Map function to call on every element of the array.\n         * @param {Any} [thisArg] The context to use calling the mapFn if provided.\n         * @param {Scheduler} [scheduler] Optional scheduler to use for scheduling.  If not provided, defaults to Scheduler.currentThread.\n         */\n        from<T, TResult>(array: ArrayOrIterable<T>, mapFn: (value: T, index: number) => TResult, thisArg?: any, scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Converts an array to an observable sequence, using an optional scheduler to enumerate the array.\n         * @deprecated use Observable.from or Observable.of\n         * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n         * @returns {Observable} The observable sequence whose elements are pulled from the given enumerable sequence.\n         */\n        fromArray<T>(array: ArrayLike<T>, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Returns a non-terminating observable sequence, which can be used to denote an infinite duration (e.g. when using reactive joins).\n        * @returns {Observable} An observable sequence whose observers will never get called.\n        */\n        never<T>(): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n        * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n        */\n        of<T>(...values: T[]): Observable<T>;\n\n        /**\n        *  This method creates a new Observable instance with a variable number of arguments, regardless of number or type of the arguments.\n        * @param {Scheduler} scheduler A scheduler to use for scheduling the arguments.\n        * @returns {Observable} The observable sequence whose elements are pulled from the given arguments.\n        */\n        ofWithScheduler<T>(scheduler?: IScheduler, ...values: T[]): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Convert an object into an observable sequence of [key, value] pairs.\n        * @param {Object} obj The object to inspect.\n        * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n        * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n        */\n        pairs<T>(obj: { [key: string]: T }, scheduler?: IScheduler): Observable<[string, T]>;\n        /**\n        * Convert an object into an observable sequence of [key, value] pairs.\n        * @param {Object} obj The object to inspect.\n        * @param {Scheduler} [scheduler] Scheduler to run the enumeration of the input sequence on.\n        * @returns {Observable} An observable sequence of [key, value] pairs from the object.\n        */\n        pairs<T>(obj: { [key: number]: T }, scheduler?: IScheduler): Observable<[number, T]>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Generates an observable sequence of integral numbers within a specified range, using the specified scheduler to send out observer messages.\n        *\n        * @example\n        *  var res = Rx.Observable.range(0, 10);\n        *  var res = Rx.Observable.range(0, 10, Rx.Scheduler.timeout);\n        * @param {Number} start The value of the first integer in the sequence.\n        * @param {Number} count The number of sequential integers to generate.\n        * @param {Scheduler} [scheduler] Scheduler to run the generator loop on. If not specified, defaults to Scheduler.currentThread.\n        * @returns {Observable} An observable sequence that contains a range of sequential integral numbers.\n        */\n        range(start: number, count: number, scheduler?: IScheduler): Observable<number>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence that repeats the given element the specified number of times, using the specified scheduler to send out observer messages.\n         *\n         * @example\n         *  var res = Rx.Observable.repeat(42);\n         *  var res = Rx.Observable.repeat(42, 4);\n         *  3 - res = Rx.Observable.repeat(42, 4, Rx.Scheduler.timeout);\n         *  4 - res = Rx.Observable.repeat(42, null, Rx.Scheduler.timeout);\n         * @param {Mixed} value Element to repeat.\n         * @param {Number} repeatCount [Optiona] Number of times to repeat the element. If not specified, repeats indefinitely.\n         * @param {Scheduler} scheduler Scheduler to run the producer loop on. If not specified, defaults to Scheduler.immediate.\n         * @returns {Observable} An observable sequence that repeats the given element the specified number of times.\n         */\n        repeat<T>(value: T, repeatCount?: number | void, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n        *  There is an alias called 'just' or browsers <IE9.\n        * @param {Mixed} value Single element in the resulting observable sequence.\n        * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} An observable sequence containing the single specified element.\n        */\n        return<T>(value: T, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns an observable sequence that contains a single element, using the specified scheduler to send out observer messages.\n        *  There is an alias called 'just' or browsers <IE9.\n        * @param {Mixed} value Single element in the resulting observable sequence.\n        * @param {Scheduler} scheduler Scheduler to send the single element on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} An observable sequence containing the single specified element.\n        */\n        just<T>(value: T, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n        * @param {Mixed} error An object used for the sequence's termination.\n        * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n        */\n        throw<T>(exception: Error, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns an observable sequence that terminates with an exception, using the specified scheduler to send out the single onError message.\n        * @param {Mixed} error An object used for the sequence's termination.\n        * @param {Scheduler} scheduler Scheduler to send the exceptional termination call on. If not specified, defaults to Scheduler.immediate.\n        * @returns {Observable} The observable sequence that terminates exceptionally with the specified exception object.\n        */\n        throw<T>(exception: any, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n        * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n        */\n        catch(handler: (exception: any) => ObservableOrPromise<T>): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Mixed} handlerOrSecond Exception handler function that returns an observable sequence given the error that occurred in the first sequence, or a second observable sequence used to produce results when an error occurred in the first sequence.\n        * @returns {Observable} An observable sequence containing the first sequence's elements, followed by the elements of the handler sequence in case an exception occurred.\n        */\n        catch(second: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n        * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n        */\n        catch<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated by an exception with the next observable sequence.\n        * @param {Array | Arguments} args Arguments or an array to use as the next sequence if an error occurs.\n        * @returns {Observable} An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully.\n        */\n        catch<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther, TResult>(sources: ObservableOrPromise<TOther>[], resultSelector: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2>(second: ObservableOrPromise<T2>): Observable<[T, T2]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>): Observable<[T, T2, T3]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>): Observable<[T, T2, T3, T4]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>): Observable<[T, T2, T3, T4, T5]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>): Observable<[T, T2, T3, T4, T5, T6]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>): Observable<[T, T2, T3, T4, T5, T6, T7]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>): Observable<[T, T2, T3, T4, T5, T6, T7, T8]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T2, T3, T4, T5, T6, T7, T8, T9>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>): Observable<[T, T2, T3, T4, T5, T6, T7, T8, T9]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        * This can be in the form of an argument list of observables or an array.\n        *\n        * @example\n        * 1 - obs = observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther>(sources: ObservableOrPromise<TOther>[]): Observable<TOther[]>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, eventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, T9, TResult>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        combineLatest<TOther, TResult>(sources: ObservableOrPromise<TOther>[], resultSelector: (...otherValues: TOther[]) => TResult): Observable<TResult>;\n\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>): Observable<[T, T2]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>): Observable<[T, T2, T3]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>): Observable<[T, T2, T3, T4]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>): Observable<[T, T2, T3, T4, T5]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>): Observable<[T, T2, T3, T4, T5, T6]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>): Observable<[T, T2, T3, T4, T5, T6, T7]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>): Observable<[T, T2, T3, T4, T5, T6, T7, T8]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<T, T2, T3, T4, T5, T6, T7, T8, T9>(first: ObservableOrPromise<T>, second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>): Observable<[T, T2, T3, T4, T5, T6, T7, T8, T9]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences or Promises produces an element.\n        *\n        * @example\n        * 1 - obs = Rx.Observable.combineLatest(obs1, obs2, obs3, function (o1, o2, o3) { return o1 + o2 + o3; });\n        * 2 - obs = Rx.Observable.combineLatest([obs1, obs2, obs3], function (o1, o2, o3) { return o1 + o2 + o3; });\n        * @returns {Observable} An observable sequence containing a list of elements of the sources.\n        */\n        combineLatest<TOther>(sources: ObservableOrPromise<TOther>[]): Observable<TOther[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Concatenates all the observable sequences.  This takes in either an array or variable arguments to concatenate.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat(...sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Concatenates all the observable sequences.\n        * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Concatenates all the observable sequences.\n        * @param {Array | Arguments} args Arguments or an array to concat to the observable sequence.\n        * @returns {Observable} An observable sequence that contains the elements of each given sequence, in sequential order.\n        */\n        concat<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n          * Concatenates an observable sequence of observable sequences.\n          * @returns {Observable} An observable sequence that contains the elements of each observed inner sequence, in sequential order.\n          */\n        concatAll(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n        * Or merges two observable sequences into a single observable sequence.\n        *\n        * @example\n        * 1 - merged = sources.merge(1);\n        * 2 - merged = source.merge(otherSource);\n        * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        merge(maxConcurrent: number): T;\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence, limiting the number of concurrent subscriptions to inner sequences.\n        * Or merges two observable sequences into a single observable sequence.\n        *\n        * @example\n        * 1 - merged = sources.merge(1);\n        * 2 - merged = source.merge(otherSource);\n        * @param {Mixed} [maxConcurrentOrOther] Maximum number of inner observable sequences being subscribed to concurrently or the second observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        merge(other: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(scheduler: IScheduler, ...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Merges all the observable sequences into a single observable sequence.\n        * The scheduler is optional and if not specified, the immediate scheduler is used.\n        * @returns {Observable} The observable sequence that merges the elements of the observable sequences.\n        */\n        merge<T>(scheduler: IScheduler, sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n        * receive all successfully emitted items from all of the source Observables without being interrupted by\n        * an error notification from one of them.\n        *\n        * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n        * error via the Observer's onError, mergeDelayError will refrain from propagating that\n        * error notification until all of the merged Observables have finished emitting items.\n        * @param {Array | Arguments} args Arguments or an array to merge.\n        * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n        */\n        mergeDelayError<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Flattens an Observable that emits Observables into one Observable, in a way that allows an Observer to\n        * receive all successfully emitted items from all of the source Observables without being interrupted by\n        * an error notification from one of them.\n        *\n        * This behaves like Observable.prototype.mergeAll except that if any of the merged Observables notify of an\n        * error via the Observer's onError, mergeDelayError will refrain from propagating that\n        * error notification until all of the merged Observables have finished emitting items.\n        * @param {Array | Arguments} args Arguments or an array to merge.\n        * @returns {Observable} an Observable that emits all of the items emitted by the Observables emitted by the Observable\n        */\n        mergeDelayError<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges an observable sequence of observable sequences into an observable sequence.\n        * @returns {Observable} The observable sequence that merges the elements of the inner sequences.\n        */\n        mergeAll(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the values from the source observable sequence only after the other observable sequence produces a value.\n        * @param {Observable | Promise} other The observable sequence or Promise that triggers propagation of elements of the source sequence.\n        * @returns {Observable} An observable sequence containing the elements of the source sequence starting from the point the other sequence triggered propagation.\n        */\n        skipUntil<T2>(other: ObservableOrPromise<T2>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        switch(): T;\n        /**\n        * Transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @returns {Observable} The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        switchLatest(): T;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns the values from the source observable sequence until the other observable sequence produces a value.\n        * @param {Observable | Promise} other Observable sequence or Promise that terminates propagation of elements of the source sequence.\n        * @returns {Observable} An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation.\n        */\n        takeUntil<T2>(other: ObservableOrPromise<T2>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function only when the (first) source observable sequence produces an element.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        withLatestFrom<TOther, TResult>(souces: ObservableOrPromise<TOther>[], resultSelector: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, TResult>(sources: ObservableOrPromise<T2>[], resultSelector?: (item1: T1, ...right: T2[]) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, TResult>(source1: ObservableOrPromise<T1>, ObservableOrPromise: Observable<T2>, resultSelector?: (item1: T1, item2: T2) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, resultSelector?: (item1: T1, item2: T2, item3: T3) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, TResult>(source1: Observable<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, T8, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, source8: ObservableOrPromise<T8>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8) => TResult): Observable<TResult>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index.\n        * @param arguments Observable sources.\n        * @param {Function} resultSelector Function to invoke for each series of elements at corresponding indexes in the sources.\n        * @returns {Observable} An observable sequence containing the result of combining elements of the sources using the specified result selector function.\n        */\n        zip<T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult>(source1: ObservableOrPromise<T1>, source2: ObservableOrPromise<T2>, source3: ObservableOrPromise<T3>, source4: ObservableOrPromise<T4>, source5: ObservableOrPromise<T5>, source6: ObservableOrPromise<T6>, source7: ObservableOrPromise<T7>, source8: ObservableOrPromise<T8>, source9: ObservableOrPromise<T9>, resultSelector?: (item1: T1, item2: T2, item3: T3, item4: T4, item5: T5, item6: T6, item7: T7, item8: T8, item9: T9) => TResult): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, TResult>(second: ObservableOrPromise<T2>, resultSelector?: (v1: T, v2: T2) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, resultSelector?: (v1: T, v2: T2, v3: T3) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, T8, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<T2, T3, T4, T5, T6, T7, T8, T9, TResult>(second: ObservableOrPromise<T2>, third: ObservableOrPromise<T3>, fourth: ObservableOrPromise<T4>, fifth: ObservableOrPromise<T5>, sixth: ObservableOrPromise<T6>, seventh: ObservableOrPromise<T7>, eighth: ObservableOrPromise<T8>, ninth: ObservableOrPromise<T9>, resultSelector?: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, v7: T7, v8: T8, v9: T9) => TResult): Observable<TResult>;\n        /**\n         * Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences or an array have produced an element at a corresponding index.\n         * The last element in the arguments must be a function to invoke for each series of elements at corresponding indexes in the args.\n         * @returns {Observable} An observable sequence containing the result of combining elements of the args using the specified result selector function.\n         */\n        zip<TOther, TResult>(souces: ObservableOrPromise<TOther>[], resultSelector?: (firstValue: T, ...otherValues: TOther[]) => TResult): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n        * @param arguments Observable sources.\n        * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n        */\n        zipIterable<T>(...sources: Observable<T>[]): Observable<T[]>;\n        /**\n        * Merges the specified observable sequences into one observable sequence by emitting a list with the elements of the observable sequences at corresponding indexes.\n        * @param arguments Observable sources.\n        * @returns {Observable} An observable sequence containing lists of elements at corresponding indexes.\n        */\n        zipIterable<T>(sources: Observable<T>[]): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n       *  Hides the identity of an observable sequence.\n       * @returns {Observable} An observable sequence that hides the identity of the source sequence.\n       */\n        asObservable(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Dematerializes the explicit notification values of an observable sequence as implicit notifications.\n        * @returns {Observable} An observable sequence exhibiting the behavior corresponding to the source sequence's notification values.\n        */\n        dematerialize<TOrigin>(): Observable<TOrigin>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an observable sequence that contains only distinct contiguous elements according to the keySelector and the comparer.\n        *\n        *  var obs = observable.distinctUntilChanged();\n        *  var obs = observable.distinctUntilChanged(function (x) { return x.id; });\n        *  var obs = observable.distinctUntilChanged(function (x) { return x.id; }, function (x, y) { return x === y; });\n        *\n        * @param {Function} [keySelector] A function to compute the comparison key for each element. If not provided, it projects the value.\n        * @param {Function} [comparer] Equality comparer for computed key values. If not provided, defaults to an equality comparer function.\n        * @returns {Observable} An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence.\n        */\n        distinctUntilChanged<TValue>(keySelector?: (value: T) => TValue, comparer?: _Comparer<TValue, boolean>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        do(observer: Observer<T>): Observable<T>;\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tap(observer: Observer<T>): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        do(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observable<T>;\n        /**\n        *  Invokes an action for each element in the observable sequence and invokes an action upon graceful or exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function | Observer} observerOrOnNext Action to invoke for each element in the observable sequence or an observer.\n        * @param {Function} [onError]  Action to invoke upon exceptional termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @param {Function} [onCompleted]  Action to invoke upon graceful termination of the observable sequence. Used if only the observerOrOnNext parameter is also a function.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tap(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onNext Action to invoke for each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnNext(onNext: (value: T) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnError(onError: (exception: any) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon graceful termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        doOnCompleted(onCompleted: () => void, thisArg?: any): Observable<T>;\n\n        /**\n        *  Invokes an action for each element in the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onNext Action to invoke for each element in the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnNext(onNext: (value: T) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon exceptional termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onError Action to invoke upon exceptional termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnError(onError: (exception: any) => void, thisArg?: any): Observable<T>;\n        /**\n        *  Invokes an action upon graceful termination of the observable sequence.\n        *  This method can be used for debugging, logging, etc. of query behavior by intercepting the message stream to run arbitrary actions for messages on the pipeline.\n        * @param {Function} onCompleted Action to invoke upon graceful termination of the observable sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} The source sequence with the side-effecting behavior applied.\n        */\n        tapOnCompleted(onCompleted: () => void, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n        * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n        * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n        */\n        finally(action: () => void): Observable<T>;\n\n        /**\n        *  Invokes a specified action after the source observable sequence terminates gracefully or exceptionally.\n        * @param {Function} finallyAction Action to invoke after the source observable sequence terminates.\n        * @returns {Observable} Source sequence with the action-invoking termination behavior applied.\n        */\n        ensure(action: () => void): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Ignores all elements in an observable sequence leaving only the termination messages.\n        * @returns {Observable} An empty observable sequence that signals termination, successful or exceptional, of the source sequence.\n        */\n        ignoreElements(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Materializes the implicit notifications of an observable sequence as explicit notification values.\n        * @returns {Observable} An observable sequence containing the materialized notification values from the source sequence.\n        */\n        materialize(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         *  Repeats the observable sequence a specified number of times. If the repeat count is not specified, the sequence repeats indefinitely.\n         * @param {Number} [repeatCount]  Number of times to repeat the sequence. If not provided, repeats the sequence indefinitely.\n         * @returns {Observable} The observable sequence producing the elements of the given sequence repeatedly.\n         */\n        repeat(repeatCount?: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Repeats the source observable sequence the specified number of times or until it successfully terminates. If the retry count is not specified, it retries indefinitely.\n        *  Note if you encounter an error and want it to retry once, then you must use .retry(2);\n        *\n        * @example\n        *  var res = retried = retry.repeat();\n        *  var res = retried = retry.repeat(2);\n        * @param {Number} [retryCount]  Number of times to retry the sequence. If not provided, retry the sequence indefinitely.\n        * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n        */\n        retry(retryCount?: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         *  Repeats the source observable sequence upon error each time the notifier emits or until it successfully terminates.\n         *  if the notifier completes, the observable sequence completes.\n         *\n         * @example\n         *  var timer = Observable.timer(500);\n         *  var source = observable.retryWhen(timer);\n         * @param {Observable} [notifier] An observable that triggers the retries or completes the observable with onNext or onCompleted respectively.\n         * @returns {Observable} An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully.\n         */\n        retryWhen(notifier: (errors: Observable<any>) => Observable<any>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n        *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n        * @example\n        *  var res = source.scan(function (acc, x) { return acc + x; });\n        *  var res = source.scan(function (acc, x) { return acc + x; }, 0);\n        * @param {Function} accumulator An accumulator function to be invoked on each element.\n        * @param {Mixed} [seed] The initial accumulator value.\n        * @returns {Observable} An observable sequence containing the accumulated values.\n        */\n        scan<TAcc>(accumulator: _Accumulator<T, TAcc>, seed?: TAcc): Observable<TAcc>;\n        /**\n        *  Applies an accumulator function over an observable sequence and returns each intermediate result. The optional seed value is used as the initial accumulator value.\n        *  For aggregation behavior with no intermediate results, see Observable.aggregate.\n        * @example\n        *  var res = source.scan(function (acc, x) { return acc + x; });\n        *  var res = source.scan(function (acc, x) { return acc + x; }, 0);\n        * @param {Function} accumulator An accumulator function to be invoked on each element.\n        * @param {Mixed} [seed] The initial accumulator value.\n        * @returns {Observable} An observable sequence containing the accumulated values.\n        */\n        scan(accumulator: _Accumulator<T, T>, seed?: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Bypasses a specified number of elements at the end of an observable sequence.\n        * @description\n        *  This operator accumulates a queue with a length enough to store the first `count` elements. As more elements are\n        *  received, elements are taken from the front of the queue and produced on the result sequence. This causes elements to be delayed.\n        * @param count Number of elements to bypass at the end of the source sequence.\n        * @returns {Observable} An observable sequence containing the source sequence elements except for the bypassed ones at the end.\n        */\n        skipLast(count: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n        *  @example\n        *  var res = source.startWith(1, 2, 3);\n        *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n        * @param {Arguments} args The specified values to prepend to the observable sequence\n        * @returns {Observable} The source sequence prepended with the specified values.\n        */\n        startWith(...values: T[]): Observable<T>;\n        /**\n        *  Prepends a sequence of values to an observable sequence with an optional scheduler and an argument list of values to prepend.\n        *  @example\n        *  var res = source.startWith(1, 2, 3);\n        *  var res = source.startWith(Rx.Scheduler.timeout, 1, 2, 3);\n        * @param {Arguments} args The specified values to prepend to the observable sequence\n        * @returns {Observable} The source sequence prepended with the specified values.\n        */\n        startWith(scheduler: IScheduler, ...values: T[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns a specified number of contiguous elements from the end of an observable sequence.\n        * @description\n        *  This operator accumulates a buffer with a length enough to store elements count elements. Upon completion of\n        *  the source sequence, this buffer is drained on the result sequence. This causes the elements to be delayed.\n        * @param {Number} count Number of elements to take from the end of the source sequence.\n        * @returns {Observable} An observable sequence containing the specified number of elements from the end of the source sequence.\n        */\n        takeLast(count: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        concatMap<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.concatMap(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.concatMap(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the\n        * source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectConcat<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Projects each element of an observable sequence into a new form by incorporating the element's index.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n        */\n        select<TResult>(selector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        * Projects each element of an observable sequence into a new form by incorporating the element's index.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source.\n        */\n        map<TResult>(selector: _Selector<T, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Retrieves the value of a specified nested property from all elements in\n        * the Observable sequence.\n        * @param {Arguments} arguments The nested properties to pluck.\n        * @returns {Observable} Returns a new Observable sequence of property values.\n        */\n        pluck<TResult>(prop: string): Observable<TResult>;\n        pluck<TResult>(...props: string[]): Observable<TResult>;\n    }\n\n\n    export interface Observable<T> {\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        flatMap<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  One of the Following:\n        *  Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        * @example\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); });\n        *  Or:\n        *  Projects each element of an observable sequence to an observable sequence, invokes the result selector for the source element and each of the corresponding inner sequence's elements, and merges the results into one observable sequence.\n        *\n        *  var res = source.selectMany(function (x) { return Rx.Observable.range(0, x); }, function (x, y) { return x + y; });\n        *  Or:\n        *  Projects each element of the source observable sequence to the other observable sequence and merges the resulting observable sequences into one observable sequence.\n        *\n        *  var res = source.selectMany(Rx.Observable.fromArray([1,2,3]));\n        * @param {Function} selector A transform function to apply to each element or an observable sequence to project each element from the source sequence onto which could be either an observable or Promise.\n        * @param {Function} [resultSelector]  A transform function to apply to each element of the intermediate sequence.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the one-to-many transform function collectionSelector on each element of the input sequence and then mapping each of those sequence elements and their corresponding source element to a result element.\n        */\n        selectMany<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        selectSwitch<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TResult>>): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TOther, TResult>(selector: _ValueOrSelector<T, ObservableOrPromise<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n        /**\n        *  Projects each element of an observable sequence into a new sequence of observable sequences by incorporating the element's index and then\n        *  transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence.\n        * @param {Function} selector A transform function to apply to each source element; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences\n        *  and that at any point in time produces the elements of the most recent inner observable sequence that has been received.\n        */\n        flatMapLatest<TOther, TResult>(selector: _ValueOrSelector<T, ArrayOrIterable<TOther>>, resultSelector: special._FlatMapResultSelector<T, TOther, TResult>, thisArg?: any): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Bypasses a specified number of elements in an observable sequence and then returns the remaining elements.\n        * @param {Number} count The number of elements to skip before returning the remaining elements.\n        * @returns {Observable} An observable sequence that contains the elements that occur after the specified index in the input sequence.\n        */\n        skip(count: number): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Bypasses elements in an observable sequence as long as a specified condition is true and then returns the remaining elements.\n        *  The element's index is used in the logic of the predicate function.\n        *\n        *  var res = source.skipWhile(function (value) { return value < 10; });\n        *  var res = source.skipWhile(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate.\n        */\n        skipWhile(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns a specified number of contiguous elements from the start of an observable sequence, using the specified scheduler for the edge case of take(0).\n        *\n        *  var res = source.take(5);\n        *  var res = source.take(0, Rx.Scheduler.timeout);\n        * @param {Number} count The number of elements to return.\n        * @param {Scheduler} [scheduler] Scheduler used to produce an OnCompleted message in case <paramref name=\"count count</paramref> is set to 0.\n        * @returns {Observable} An observable sequence that contains the specified number of elements from the start of the input sequence.\n        */\n        take(count: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns elements from an observable sequence as long as a specified condition is true.\n        *  The element's index is used in the logic of the predicate function.\n        * @param {Function} predicate A function to test each element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes.\n        */\n        takeWhile(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n        *\n        * @example\n        *  var res = source.where(function (value) { return value < 10; });\n        *  var res = source.where(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n        */\n        where(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n        /**\n        *  Filters the elements of an observable sequence based on a predicate by incorporating the element's index.\n        *\n        * @example\n        *  var res = source.where(function (value) { return value < 10; });\n        *  var res = source.where(function (value, index) { return value < 10 || index < 10; });\n        * @param {Function} predicate A function to test each source element for a condition; the second parameter of the function represents the index of the source element.\n        * @param {Any} [thisArg] Object to use as this when executing callback.\n        * @returns {Observable} An observable sequence that contains elements from the input sequence that satisfy the condition.\n        */\n        filter(predicate: _Predicate<T>, thisArg?: any): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult>(func: Function, context: any, selector: Function): (...args: any[]) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1>(func: (arg1: T1, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2>(func: (arg1: T1, arg2: T2, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3>(func: (arg1: T1, arg2: T2, arg3: T3, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Observable<TResult>;\n        /**\n         * Converts a callback function to an observable sequence.\n         *\n         * @param {Function} function Function with a callback as the last parameter to convert to an Observable sequence.\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback to produce a single item to yield on next.\n         * @returns {Function} A function, when executed with the required parameters minus the callback, produces an Observable sequence with a single value of the arguments to the callback as an array.\n         */\n        fromCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8, T9>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, callback: (result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9) => Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult>(func: Function, context?: any, selector?: Function): (...args: any[]) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1>(func: (arg1: T1, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2>(func: (arg1: T1, arg2: T2, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3>(func: (arg1: T1, arg2: T2, arg3: T3, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8) => Observable<TResult>;\n        /**\n         * Converts a Node.js callback style function to an observable sequence.  This must be in function (err, ...) format.\n         * @param {Function} func The function to call\n         * @param {Mixed} [context] The context for the func parameter to be executed.  If not specified, defaults to undefined.\n         * @param {Function} [selector] A selector which takes the arguments from the callback minus the error to produce a single item to yield on next.\n         * @returns {Function} An async function which when applied, returns an observable sequence with the callback arguments as an array.\n         */\n        fromNodeCallback<TResult, T1, T2, T3, T4, T5, T6, T7, T8, T9>(func: (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9, callback: (err: any, result: TResult) => any) => any, context?: any, selector?: Function): (arg1: T1, arg2: T2, arg3: T3, arg4: T4, arg5: T5, arg6: T6, arg7: T7, arg8: T8, arg9: T9) => Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n         * @param {Object} element The DOMElement or NodeList to attach a listener.\n         * @param {String} eventName The event name to attach the observable sequence.\n         * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n         * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n         */\n        fromEvent<T>(element: EventTarget, eventName: string, selector?: (arguments: any[]) => T): Observable<T>;\n        /**\n         * Creates an observable sequence by adding an event listener to the matching DOMElement or each item in the NodeList.\n         * @param {Object} element The DOMElement or NodeList to attach a listener.\n         * @param {String} eventName The event name to attach the observable sequence.\n         * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n         * @returns {Observable} An observable sequence of events from the specified element and the specified event.\n         */\n        fromEvent<T>(element: { on: (name: string, cb: (e: any) => any) => void; off: (name: string, cb: (e: any) => any) => void }, eventName: string, selector?: (arguments: any[]) => T): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Creates an observable sequence from an event emitter via an addHandler/removeHandler pair.\n        * @param {Function} addHandler The function to add a handler to the emitter.\n        * @param {Function} [removeHandler] The optional function to remove a handler from an emitter.\n        * @param {Function} [selector] A selector which takes the arguments from the event handler to produce a single item to yield on next.\n        * @returns {Observable} An observable sequence which wraps an event from an event emitter\n        */\n        fromEventPattern<T>(addHandler: (handler: Function) => void, removeHandler: (handler: Function) => void, selector?: (arguments: any[]) => T): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Converts a Promise to an Observable sequence\n        * @param {Promise} An ES6 Compliant promise.\n        * @returns {Observable} An Observable sequence which wraps the existing promise success and failure.\n        */\n \t\tfromPromise<T>(promise: Promise<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /*\n         * Converts an existing observable sequence to an ES6 Compatible Promise\n         * @example\n         * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n         *\n         * // With config\n         * Rx.config.Promise = RSVP.Promise;\n         * var promise = Rx.Observable.return(42).toPromise();\n         * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n         * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n         */\n        toPromise(promiseCtor?: { new (resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): IPromise<T>; }): IPromise<T>;\n        /*\n         * Converts an existing observable sequence to an ES6 Compatible Promise\n         * @example\n         * var promise = Rx.Observable.return(42).toPromise(RSVP.Promise);\n         *\n         * // With config\n         * Rx.config.Promise = RSVP.Promise;\n         * var promise = Rx.Observable.return(42).toPromise();\n         * @param {Function} [promiseCtor] The constructor of the promise. If not provided, it looks for it in Rx.config.Promise.\n         * @returns {Promise} An ES6 compatible promise with the last value from the observable sequence.\n         */\n        toPromise<TPromise extends IPromise<T>>(promiseCtor: { new (resolver: (resolvePromise: (value: T) => void, rejectPromise: (reason: any) => void) => void): TPromise; }): TPromise;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Invokes the asynchronous function, surfacing the result through an observable sequence.\n        * @param {Function} functionAsync Asynchronous function which returns a Promise to run.\n        * @returns {Observable} An observable sequence exposing the function's result value, or an exception.\n        */\n        startAsync<T>(functionAsync: () => IPromise<T>): Observable<T>;\n    }\n\n    /**\n     *  Represents an object that is both an observable sequence as well as an observer.\n     *  Each notification is broadcasted to all subscribed observers.\n     */\n    export interface ISubject<T> extends IObservable<T>, IObserver<T>, IDisposable {\n        hasObservers(): boolean;\n    }\n\n    export interface Subject<T> extends Observable<T>, Observer<T>, IDisposable {\n        hasObservers(): boolean;\n        /** Is this value disposed. */\n        isDisposed: boolean;\n    }\n\n    interface SubjectStatic {\n        /**\n         * Creates a subject.\n         */\n        new <T>(): Subject<T>;\n\n        /**\n         * Creates a subject from the specified observer and observable.\n         * @param {Observer} observer The observer used to send messages to the subject.\n         * @param {Observable} observable The observable used to subscribe to messages sent from the subject.\n         * @returns {Subject} Subject implemented using the given observer and observable.\n         */\n        create<T>(observer?: IObserver<T>, observable?: IObservable<T>): Subject<T>;\n    }\n\n    /**\n     *  Represents an object that is both an observable sequence as well as an observer.\n     *  Each notification is broadcasted to all subscribed observers.\n     */\n    export var Subject: SubjectStatic;\n\n        export interface ConnectableObservable<T> extends Observable<T> {\n    \t\tconnect(): IDisposable;\n    \t\trefCount(): Observable<T>;\n        }\n\n    export interface Observable<T> {\n        /**\n        * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n        * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n        * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n        *\n        * @example\n        * 1 - res = source.multicast(observable);\n        * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n        *\n        * @param {Function|Subject} subjectOrSubjectSelector\n        * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n        * Or:\n        * Subject to push source elements into.\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        multicast(subject: ISubject<T> | (() => ISubject<T>)): ConnectableObservable<T>;\n        /**\n        * Multicasts the source sequence notifications through an instantiated subject into all uses of the sequence within a selector function. Each\n        * subscription to the resulting sequence causes a separate multicast invocation, exposing the sequence resulting from the selector function's\n        * invocation. For specializations with fixed subject types, see Publish, PublishLast, and Replay.\n        *\n        * @example\n        * 1 - res = source.multicast(observable);\n        * 2 - res = source.multicast(function () { return new Subject(); }, function (x) { return x; });\n        *\n        * @param {Function|Subject} subjectOrSubjectSelector\n        * Factory function to create an intermediate subject through which the source sequence's elements will be multicast to the selector function.\n        * Or:\n        * Subject to push source elements into.\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. Specified only if <paramref name=\"subjectOrSubjectSelector\" is a factory function.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        multicast<TResult>(subjectSelector: ISubject<T> | (() => ISubject<T>), selector: (source: ConnectableObservable<T>) => Observable<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of Multicast using a regular Subject.\n        *\n        * @example\n        * var resres = source.publish();\n        * var res = source.publish(function (x) { return x; });\n        *\n        * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publish(): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of Multicast using a regular Subject.\n        *\n        * @example\n        * var resres = source.publish();\n        * var res = source.publish(function (x) { return x; });\n        *\n        * @param {Function} [selector] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all notifications of the source from the time of the subscription on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publish<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence.\n        * This operator is a specialization of publish which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        share(): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n        * This operator is a specialization of Multicast using a AsyncSubject.\n        *\n        * @example\n        * var res = source.publishLast();\n        * var res = source.publishLast(function (x) { return x; });\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishLast(): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence containing only the last notification.\n        * This operator is a specialization of Multicast using a AsyncSubject.\n        *\n        * @example\n        * var res = source.publishLast();\n        * var res = source.publishLast(function (x) { return x; });\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will only receive the last notification of the source.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishLast<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n        * This operator is a specialization of Multicast using a BehaviorSubject.\n        *\n        * @example\n        * var res = source.publishValue(42);\n        * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishValue(initialValue: T): ConnectableObservable<T>;\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence and starts with initialValue.\n        * This operator is a specialization of Multicast using a BehaviorSubject.\n        *\n        * @example\n        * var res = source.publishValue(42);\n        * var res = source.publishValue(function (x) { return x.select(function (y) { return y * y; }) }, 42);\n        *\n        * @param {Function} [selector] Optional selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive immediately receive the initial value, followed by all notifications of the source from the time of the subscription on.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        publishValue<TResult>(selector: (source: ConnectableObservable<T>) => Observable<TResult>, initialValue: T): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence and starts with an initialValue.\n        * This operator is a specialization of publishValue which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        * @param {Mixed} initialValue Initial value received by observers upon subscription.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        shareValue(initialValue: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of Multicast using a ReplaySubject.\n        *\n        * @example\n        * var res = source.replay(null, 3);\n        * var res = source.replay(null, 3, 500);\n        * var res = source.replay(null, 3, 500, scheduler);\n        * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param windowSize [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        replay(selector?: void, bufferSize?: number, window?: number, scheduler?: IScheduler): ConnectableObservable<T>;\t// hack to catch first omitted parameter\n        /**\n        * Returns an observable sequence that is the result of invoking the selector on a connectable observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of Multicast using a ReplaySubject.\n        *\n        * @example\n        * var res = source.replay(null, 3);\n        * var res = source.replay(null, 3, 500);\n        * var res = source.replay(null, 3, 500, scheduler);\n        * var res = source.replay(function (x) { return x.take(6).repeat(); }, 3, 500, scheduler);\n        *\n        * @param selector [Optional] Selector function which can use the multicasted source sequence as many times as needed, without causing multiple subscriptions to the source sequence. Subscribers to the given source will receive all the notifications of the source subject to the specified replay buffer trimming policy.\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param windowSize [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function.\n        */\n        replay(selector: (source: ConnectableObservable<T>) => Observable<T>, bufferSize?: number, window?: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence replaying notifications subject to a maximum time length for the replay buffer.\n        * This operator is a specialization of replay which creates a subscription when the number of observers goes from zero to one, then shares that subscription with all subsequent observers until the number of observers returns to zero, at which point the subscription is disposed.\n        *\n        * @example\n        * var res = source.shareReplay(3);\n        * var res = source.shareReplay(3, 500);\n        * var res = source.shareReplay(3, 500, scheduler);\n        *\n\n        * @param bufferSize [Optional] Maximum element count of the replay buffer.\n        * @param window [Optional] Maximum time length of the replay buffer.\n        * @param scheduler [Optional] Scheduler where connected observers within the selector function will be invoked on.\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source sequence.\n        */\n        shareReplay(bufferSize?: number, window?: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Returns an observable sequence that produces a value after each period.\n         *\n         * @example\n         *  1 - res = Rx.Observable.interval(1000);\n         *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n         *\n         * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n         * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n         * @returns {Observable} An observable sequence that produces a value after each period.\n         */\n        interval(period: number, scheduler?: IScheduler): Observable<number>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n         * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n         * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n         * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n         * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n         */\n        timer(dueTime: number, period: number, scheduler?: IScheduler): Observable<number>;\n        /**\n         *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n         * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n         * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n         * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n         * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n         */\n        timer(dueTime: number, scheduler?: IScheduler): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n        *\n        * @example\n        *  1 - res = Rx.Observable.delay(new Date());\n        *  2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout);\n        *\n        *  3 - res = Rx.Observable.delay(5000);\n        *  4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout);\n        * @memberOf Observable#\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n        * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(dueTime: Date, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n        *\n        * @example\n        *  1 - res = Rx.Observable.delay(new Date());\n        *  2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout);\n        *\n        *  3 - res = Rx.Observable.delay(5000);\n        *  4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout);\n        * @memberOf Observable#\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n        * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(dueTime: number, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Time shifts the observable sequence based on a subscription delay and a delay selector function for each element.\n        *\n        * @example\n        *  1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only\n        *  1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector\n        *\n        * @param {Observable} [subscriptionDelay]  Sequence indicating the delay for the subscription to the source.\n        * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(delayDurationSelector: (item: T) => ObservableOrPromise<number>): Observable<T>;\n\n        /**\n        *  Time shifts the observable sequence based on a subscription delay and a delay selector function for each element.\n        *\n        * @example\n        *  1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only\n        *  1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector\n        *\n        * @param {Observable} [subscriptionDelay]  Sequence indicating the delay for the subscription to the source.\n        * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(subscriptionDelay: Observable<number>, delayDurationSelector: (item: T) => ObservableOrPromise<number>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Ignores values from an observable sequence which are followed by another value before dueTime.\n        * @param {Number} dueTime Duration of the debounce period for each value (specified as an integer denoting milliseconds).\n        * @param {Scheduler} [scheduler]  Scheduler to run the debounce timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The debounced sequence.\n        */\n        debounce(dueTime: number, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        * Ignores values from an observable sequence which are followed by another value within a computed throttle duration.\n        * @param {Function} durationSelector Selector function to retrieve a sequence indicating the throttle duration for each given element.\n        * @returns {Observable} The debounced sequence.\n        */\n        debounce(debounceDurationSelector: (item: T) => ObservableOrPromise<any>): Observable<T>;\n    }\n\n    export interface Timestamp<T> {\n        value: T;\n        timestamp: number;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Records the timestamp for each value in an observable sequence.\n        *\n        * @example\n        *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n        *  2 - res = source.timestamp(Rx.Scheduler.default);\n        *\n        * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the default scheduler is used.\n        * @returns {Observable} An observable sequence with timestamp information on values.\n        */\n        timestamp(scheduler?: IScheduler): Observable<Timestamp<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        sample(intervalOrSampler: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        sample<TSample>(sampler: Observable<TSample>, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        throttleLatest(interval: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        throttleLatest<TSample>(sampler: Observable<TSample>, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: Date, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: Date, other?: Observable<T>, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: number, other?: Observable<T>, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(timeoutdurationSelector: (item: T) => Observable<TTimeout>): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @param {Observable} other  Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException().\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(timeoutdurationSelector: (item: T) => Observable<TTimeout>, other: Observable<T>): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Observable} [firstTimeout]  Observable sequence that represents the timeout for the first element. If not provided, this defaults to Observable.never().\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException().\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(firstTimeout: Observable<TTimeout>, timeoutdurationSelector: (item: T) => Observable<TTimeout>, other?: Observable<T>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n        * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n        * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n        * @returns {Observable} An Observable that performs the throttle operation.\n        */\n        throttle(windowDuration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Pauses the underlying observable sequence based upon the observable sequence which yields true/false.\n         * @example\n         * var pauser = new Rx.Subject();\n         * var source = Rx.Observable.interval(100).pausable(pauser);\n         * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n         * @returns {Observable} The observable sequence which is paused based upon the pauser.\n         */\n        pausable(pauser?: Observable<boolean>): PausableObservable<T>;\n    }\n\n    export interface PausableObservable<T> extends Observable<T> {\n        pause(): void;\n        resume(): void;\n    }\n\n    export interface Observable<T> {\n        /**\n         * Pauses the underlying observable sequence based upon the observable sequence which yields true/false,\n         * and yields the values that were buffered while paused.\n         * @example\n         * var pauser = new Rx.Subject();\n         * var source = Rx.Observable.interval(100).pausableBuffered(pauser);\n         * @param {Observable} pauser The observable sequence used to pause the underlying sequence.\n         * @returns {Observable} The observable sequence which is paused based upon the pauser.\n         */\n        pausableBuffered(pauser?: Observable<boolean>): PausableObservable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Attaches a controller to the observable sequence with the ability to queue.\n        * @example\n        * var source = Rx.Observable.interval(100).controlled();\n        * source.request(3); // Reads 3 values\n        * @param {bool} enableQueue truthy value to determine if values should be queued pending the next request\n        * @param {Scheduler} scheduler determines how the requests will be scheduled\n        * @returns {Observable} The observable sequence which only propagates values on request.\n        */\n        controlled(enableQueue?: boolean, scheduler?: IScheduler): ControlledObservable<T>;\n    }\n\n    export interface ControlledObservable<T> extends Observable<T> {\n        request(numberOfItems?: number): IDisposable;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Pipes the existing Observable sequence into a Node.js Stream.\n        * @param {Stream} dest The destination Node.js stream.\n        * @returns {Stream} The destination stream.\n        */\n        pipe<TDest>(dest: TDest): TDest;\n        // TODO: Add link to node.d.ts some where\n    }\n\n    export interface Observable<T> {\n        /**\n         * Executes a transducer to transform the observable sequence\n         * @param {Transducer} transducer A transducer to execute\n         * @returns {Observable} An Observable sequence containing the results from the transducer.\n         */\n        transduce(transducer: any): any;\n        //TODO: Setup transducer\n    }\n\n    export interface AnonymousObservable<T> extends Observable<T> { }\n\n    export interface AsyncSubject<T> extends Subject<T> { }\n\n    interface AsyncSubjectStatic {\n        /**\n         * Creates a subject that can only receive one value and that value is cached for all future observations.\n         * @constructor\n         */\n        new <T>(): AsyncSubject<T>;\n    }\n\n    /**\n     *  Represents the result of an asynchronous operation.\n     *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n     */\n    export var AsyncSubject: AsyncSubjectStatic;\n\n    export interface AnonymousSubject<T> extends Subject<T> { }\n\n    interface AnonymousSubjectStatic {\n        /**\n         * Creates a subject that can only receive one value and that value is cached for all future observations.\n         * @constructor\n         */\n        new <T>(): AnonymousSubject<T>;\n    }\n\n    /**\n     *  Represents the result of an asynchronous operation.\n     *  The last value before the OnCompleted notification, or the error received through OnError, is sent to all subscribed observers.\n     */\n    export var AnonymousSubject: AnonymousSubjectStatic;\n\n    export interface BehaviorSubject<T> extends Subject<T> {\n        /**\n         * Gets the current value or throws an exception.\n         * Value is frozen after onCompleted is called.\n         * After onError is called always throws the specified exception.\n         * An exception is always thrown after dispose is called.\n         * @returns {Mixed} The initial value passed to the constructor until onNext is called; after which, the last value passed to onNext.\n         */\n        getValue(): T;\n    }\n\n    interface BehaviorSubjectStatic {\n        /**\n         *  Initializes a new instance of the BehaviorSubject class which creates a subject that caches its last value and starts with the specified value.\n         *  @param {Mixed} value Initial value sent to observers when no other value has been received by the subject yet.\n         */\n        new <T>(initialValue: T): BehaviorSubject<T>;\n    }\n\n    /**\n     *  Represents a value that changes over time.\n     *  Observers can subscribe to the subject to receive the last (or initial) value and all subsequent notifications.\n     */\n    export var BehaviorSubject: BehaviorSubjectStatic;\n\n    export interface ReplaySubject<T> extends Subject<T> { }\n\n    interface ReplaySubjectStatic {\n        /**\n         *  Initializes a new instance of the ReplaySubject class with the specified buffer size, window size and scheduler.\n         *  @param {Number} [bufferSize] Maximum element count of the replay buffer.\n         *  @param {Number} [windowSize] Maximum time length of the replay buffer.\n         *  @param {Scheduler} [scheduler] Scheduler the observers are invoked on.\n         */\n        new <T>(bufferSize?: number, window?: number, scheduler?: IScheduler): ReplaySubject<T>;\n    }\n\n    /**\n    * Represents an object that is both an observable sequence as well as an observer.\n    * Each notification is broadcasted to all subscribed and future observers, subject to buffer trimming policies.\n    */\n    export var ReplaySubject: ReplaySubjectStatic;\n\n    /**\n    * Used to pause and resume streams.\n    */\n    export interface Pauser {\n        /**\n         * Pauses the underlying sequence.\n         */\n        pause(): void;\n\n        /**\n        * Resumes the underlying sequence.\n        */\n        resume(): void;\n    }\n\n}\n\ndeclare module \"rx\" { export = Rx; }\ndeclare module \"rx.lite\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.lite.extras.d.ts",
    "content": "declare module Rx {\n\n\texport interface Observer<T> {\n        /**\n        *  Creates a notification callback from an observer.\n        * @returns The action that forwards its input notification to the underlying observer.\n        */\n\t\ttoNotifier(): (notification: Notification<T>) => void;\n\n        /**\n        *  Hides the identity of an observer.\n        * @returns An observer that hides the identity of the specified observer.\n        */\n\t\tasObserver(): Observer<T>;\n\n        /**\n        *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n        *  If a violation is detected, an Error is thrown from the offending observer method call.\n        * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n        */\n        checked(): CheckedObserver<T>;\n\n        /**\n        * Schedules the invocation of observer methods on the given scheduler.\n        * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n        * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n        */\n        notifyOn(scheduler: IScheduler): Observer<T>;\n\t}\n\n\texport interface ObserverStatic {\n        /**\n        *  Creates an observer from a notification callback.\n        *\n        * @static\n        * @memberOf Observer\n        * @param {Function} handler Action that handles a notification.\n        * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n        */\n\t\tfromNotifier<T>(handler: (notification: Notification<T>, thisArg?: any) => void): Observer<T>;\n\t}\n\n    export interface Observable<T> {\n        /**\n        *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n        *\n        *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n        *  that require to be run on a scheduler, use subscribeOn.\n        *\n        *  @param {Scheduler} scheduler Scheduler to notify observers on.\n        *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n        */\n        observeOn(scheduler: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n        *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n        *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n        *  callbacks on a scheduler, use observeOn.\n\n        *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n        *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n        */\n        subscribeOn(scheduler: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n         *\n         * @example\n         *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n         *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n         * @param {Mixed} initialState Initial state.\n         * @param {Function} condition Condition to terminate generation (upon returning false).\n         * @param {Function} iterate Iteration step function.\n         * @param {Function} resultSelector Selector function for results produced in the sequence.\n         * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n         * @returns {Observable} The generated sequence.\n         */\n        generate<TState, TResult>(initialState: TState, condition: (state: TState) => boolean, iterate: (state: TState) => TState, resultSelector: (state: TState) => TResult, scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n         * @param {Function} resourceFactory Factory function to obtain a resource object.\n         * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n         * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n         */\n        using<TSource, TResource extends IDisposable>(resourceFactory: () => TResource, observableFactory: (resource: TResource) => Observable<TSource>): Observable<TSource>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @param {Observable} rightSource Second observable sequence or Promise.\n        * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n        */\n        amb(observable: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n        */\n        amb<T>(observables: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n        */\n        amb<T>(...observables: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n        * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n        */\n        onErrorResumeNext(second: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        *\n        * @example\n        * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);\n        * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);\n        * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n        */\n        onErrorResumeNext<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        *\n        * @example\n        * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);\n        * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);\n        * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n        */\n        onErrorResumeNext<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n        * @param {Number} count Length of each buffer.\n        * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithCount(count: number, skip?: number): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n        *\n        *  var res = xs.windowWithCount(10);\n        *  var res = xs.windowWithCount(10, 1);\n        * @param {Number} count Length of each window.\n        * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithCount(count: number, skip?: number): Observable<Observable<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n        *\n        * @description\n        *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n        *  source sequence, this buffer is produced on the result sequence.\n        * @param {Number} count Number of elements to take from the end of the source sequence.\n        * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n        */\n        takeLastBuffer(count: number): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n        *\n        *  var res = obs = xs.defaultIfEmpty();\n        *  2 - obs = xs.defaultIfEmpty(false);\n        *\n        * @memberOf Observable#\n        * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n        * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n        */\n        defaultIfEmpty(defaultValue?: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n        *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n        *\n        * @example\n        *  var res = obs = xs.distinct();\n        *  2 - obs = xs.distinct(function (x) { return x.id; });\n        *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n        * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n        * @param {Function} [comparer]  Used to compare items in the collection.\n        * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n        */\n        distinct<TKey>(keySelector?: (value: T) => TKey, comparer?: _Comparer<TKey, boolean>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence. This observable sequence\n        * can be resubscribed to, even if all prior subscriptions have ended. (unlike `.publish().refCount()`)\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source.\n        */\n        singleInstance(): Observable<T>;\n    }\n\n}\ndeclare module \"rx.lite.extras\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.lite.extras.es6.d.ts",
    "content": "declare module Rx {\n\n\texport interface Observer<T> {\n        /**\n        *  Creates a notification callback from an observer.\n        * @returns The action that forwards its input notification to the underlying observer.\n        */\n\t\ttoNotifier(): (notification: Notification<T>) => void;\n\n        /**\n        *  Hides the identity of an observer.\n        * @returns An observer that hides the identity of the specified observer.\n        */\n\t\tasObserver(): Observer<T>;\n\n        /**\n        *  Checks access to the observer for grammar violations. This includes checking for multiple OnError or OnCompleted calls, as well as reentrancy in any of the observer methods.\n        *  If a violation is detected, an Error is thrown from the offending observer method call.\n        * @returns An observer that checks callbacks invocations against the observer grammar and, if the checks pass, forwards those to the specified observer.\n        */\n        checked(): CheckedObserver<T>;\n\n        /**\n        * Schedules the invocation of observer methods on the given scheduler.\n        * @param {Scheduler} scheduler Scheduler to schedule observer messages on.\n        * @returns {Observer} Observer whose messages are scheduled on the given scheduler.\n        */\n        notifyOn(scheduler: IScheduler): Observer<T>;\n\t}\n\n\texport interface ObserverStatic {\n        /**\n        *  Creates an observer from a notification callback.\n        *\n        * @static\n        * @memberOf Observer\n        * @param {Function} handler Action that handles a notification.\n        * @returns The observer object that invokes the specified handler using a notification corresponding to each message it receives.\n        */\n\t\tfromNotifier<T>(handler: (notification: Notification<T>, thisArg?: any) => void): Observer<T>;\n\t}\n\n    export interface Observable<T> {\n        /**\n        *  Wraps the source sequence in order to run its observer callbacks on the specified scheduler.\n        *\n        *  This only invokes observer callbacks on a scheduler. In case the subscription and/or unsubscription actions have side-effects\n        *  that require to be run on a scheduler, use subscribeOn.\n        *\n        *  @param {Scheduler} scheduler Scheduler to notify observers on.\n        *  @returns {Observable} The source sequence whose observations happen on the specified scheduler.\n        */\n        observeOn(scheduler: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Wraps the source sequence in order to run its subscription and unsubscription logic on the specified scheduler. This operation is not commonly used;\n        *  see the remarks section for more information on the distinction between subscribeOn and observeOn.\n\n        *  This only performs the side-effects of subscription and unsubscription on the specified scheduler. In order to invoke observer\n        *  callbacks on a scheduler, use observeOn.\n\n        *  @param {Scheduler} scheduler Scheduler to perform subscription and unsubscription actions on.\n        *  @returns {Observable} The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler.\n        */\n        subscribeOn(scheduler: IScheduler): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence by running a state-driven loop producing the sequence's elements, using the specified scheduler to send out observer messages.\n         *\n         * @example\n         *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; });\n         *  var res = Rx.Observable.generate(0, function (x) { return x < 10; }, function (x) { return x + 1; }, function (x) { return x; }, Rx.Scheduler.timeout);\n         * @param {Mixed} initialState Initial state.\n         * @param {Function} condition Condition to terminate generation (upon returning false).\n         * @param {Function} iterate Iteration step function.\n         * @param {Function} resultSelector Selector function for results produced in the sequence.\n         * @param {Scheduler} [scheduler] Scheduler on which to run the generator loop. If not provided, defaults to Scheduler.currentThread.\n         * @returns {Observable} The generated sequence.\n         */\n        generate<TState, TResult>(initialState: TState, condition: (state: TState) => boolean, iterate: (state: TState) => TState, resultSelector: (state: TState) => TResult, scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         * Constructs an observable sequence that depends on a resource object, whose lifetime is tied to the resulting observable sequence's lifetime.\n         * @param {Function} resourceFactory Factory function to obtain a resource object.\n         * @param {Function} observableFactory Factory function to obtain an observable sequence that depends on the obtained resource.\n         * @returns {Observable} An observable sequence whose lifetime controls the lifetime of the dependent resource object.\n         */\n        using<TSource, TResource extends IDisposable>(resourceFactory: () => TResource, observableFactory: (resource: TResource) => Observable<TSource>): Observable<TSource>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @param {Observable} rightSource Second observable sequence or Promise.\n        * @returns {Observable} {Observable} An observable sequence that surfaces either of the given sequences, whichever reacted first.\n        */\n        amb(observable: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n        */\n        amb<T>(observables: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Propagates the observable sequence or Promise that reacts first.\n        * @returns {Observable} An observable sequence that surfaces any of the given sequences, whichever reacted first.\n        */\n        amb<T>(...observables: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        * @param {Observable} second Second observable sequence used to produce results after the first sequence terminates.\n        * @returns {Observable} An observable sequence that concatenates the first and second sequence, even if the first sequence terminates exceptionally.\n        */\n        onErrorResumeNext(second: ObservableOrPromise<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        *\n        * @example\n        * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);\n        * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);\n        * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n        */\n        onErrorResumeNext<T>(...sources: ObservableOrPromise<T>[]): Observable<T>;\n        /**\n        * Continues an observable sequence that is terminated normally or by an exception with the next observable sequence.\n        *\n        * @example\n        * 1 - res = Rx.Observable.onErrorResumeNext(xs, ys, zs);\n        * 1 - res = Rx.Observable.onErrorResumeNext([xs, ys, zs]);\n        * @returns {Observable} An observable sequence that concatenates the source sequences, even if a sequence terminates exceptionally.\n        */\n        onErrorResumeNext<T>(sources: ObservableOrPromise<T>[]): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers which are produced based on element count information.\n        * @param {Number} count Length of each buffer.\n        * @param {Number} [skip] Number of elements to skip between creation of consecutive buffers. If not provided, defaults to the count.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithCount(count: number, skip?: number): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more windows which are produced based on element count information.\n        *\n        *  var res = xs.windowWithCount(10);\n        *  var res = xs.windowWithCount(10, 1);\n        * @param {Number} count Length of each window.\n        * @param {Number} [skip] Number of elements to skip between creation of consecutive windows. If not specified, defaults to the count.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithCount(count: number, skip?: number): Observable<Observable<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an array with the specified number of contiguous elements from the end of an observable sequence.\n        *\n        * @description\n        *  This operator accumulates a buffer with a length enough to store count elements. Upon completion of the\n        *  source sequence, this buffer is produced on the result sequence.\n        * @param {Number} count Number of elements to take from the end of the source sequence.\n        * @returns {Observable} An observable sequence containing a single array with the specified number of elements from the end of the source sequence.\n        */\n        takeLastBuffer(count: number): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns the elements of the specified sequence or the specified value in a singleton sequence if the sequence is empty.\n        *\n        *  var res = obs = xs.defaultIfEmpty();\n        *  2 - obs = xs.defaultIfEmpty(false);\n        *\n        * @memberOf Observable#\n        * @param defaultValue The value to return if the sequence is empty. If not provided, this defaults to null.\n        * @returns {Observable} An observable sequence that contains the specified default value if the source is empty; otherwise, the elements of the source itself.\n        */\n        defaultIfEmpty(defaultValue?: T): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an observable sequence that contains only distinct elements according to the keySelector and the comparer.\n        *  Usage of this operator should be considered carefully due to the maintenance of an internal lookup structure which can grow large.\n        *\n        * @example\n        *  var res = obs = xs.distinct();\n        *  2 - obs = xs.distinct(function (x) { return x.id; });\n        *  2 - obs = xs.distinct(function (x) { return x.id; }, function (a,b) { return a === b; });\n        * @param {Function} [keySelector]  A function to compute the comparison key for each element.\n        * @param {Function} [comparer]  Used to compare items in the collection.\n        * @returns {Observable} An observable sequence only containing the distinct elements, based on a computed key value, from the source sequence.\n        */\n        distinct<TKey>(keySelector?: (value: T) => TKey, comparer?: _Comparer<TKey, boolean>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an observable sequence that shares a single subscription to the underlying sequence. This observable sequence\n        * can be resubscribed to, even if all prior subscriptions have ended. (unlike `.publish().refCount()`)\n        * @returns {Observable} An observable sequence that contains the elements of a sequence produced by multicasting the source.\n        */\n        singleInstance(): Observable<T>;\n    }\n\n}\ndeclare module \"rx.lite.extras\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.sorting.d.ts",
    "content": "declare module Rx {\n\n    export interface Observable<T> {\n        /**\n        * jortSort checks if your inputs are sorted.  Note that this is only for a sequence with an end.\n        * See http://jort.technology/ for full details.\n        * @returns {Observable} An observable which has a single value of true if sorted, else false.\n        */\n        jortSort(): Observable<boolean>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * jortSort checks if your inputs are sorted until another Observable sequence fires.\n        * See http://jort.technology/ for full details.\n        * @returns {Observable} An observable which has a single value of true if sorted, else false.\n        */\n        jortSortUntil<TOther>(other: TOther): Observable<boolean>;\n    }\n\n}\ndeclare module \"rx.sorting\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.sorting.es6.d.ts",
    "content": "declare module Rx {\n\n    export interface Observable<T> {\n        /**\n        * jortSort checks if your inputs are sorted.  Note that this is only for a sequence with an end.\n        * See http://jort.technology/ for full details.\n        * @returns {Observable} An observable which has a single value of true if sorted, else false.\n        */\n        jortSort(): Observable<boolean>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * jortSort checks if your inputs are sorted until another Observable sequence fires.\n        * See http://jort.technology/ for full details.\n        * @returns {Observable} An observable which has a single value of true if sorted, else false.\n        */\n        jortSortUntil<TOther>(other: TOther): Observable<boolean>;\n    }\n\n}\ndeclare module \"rx.sorting\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.testing.d.ts",
    "content": "declare module Rx {\n\n    export interface Subscription {\n        /**\n         * Checks whether the given subscription is equal to the current instance.\n         * @param other Subscription object to check for equality.\n         * @returns {Boolean} true if both objects are equal; false otherwise.\n         */\n        equals(other: Subscription): boolean;\n        /**\n         * Returns a string representation of the current Subscription value.\n         * @returns {String} String representation of the current Subscription value.\n         */\n        toString(): string;\n    }\n\n    interface SubscriptionStatic {\n        /**\n         * Creates a new subscription object with the given virtual subscription and unsubscription time.\n         *\n         * @constructor\n         * @param {Number} subscribe Virtual time at which the subscription occurred.\n         * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n         */\n        new (subscribeAt: number, unsubscribeAt?: number): Subscription;\n    }\n\n    export var Subscription: SubscriptionStatic;\n\n    export interface Recorded {\n        /**\n         * Checks whether the given recorded object is equal to the current instance.\n         *\n         * @param {Recorded} other Recorded object to check for equality.\n         * @returns {Boolean} true if both objects are equal; false otherwise.\n         */\n        equals(other: Recorded): boolean;\n        /**\n         * Returns a string representation of the current Recorded value.\n         *\n         * @returns {String} String representation of the current Recorded value.\n         */\n        toString(): string;\n        time: number;\n        value: any;\n    }\n\n    interface RecordedStatic {\n        /**\n         * Creates a new object recording the production of the specified value at the given virtual time.\n         *\n         * @constructor\n         * @param {Number} time Virtual time the value was produced on.\n         * @param {Mixed} value Value that was produced.\n         * @param {Function} comparer An optional comparer.\n         */\n        new (time: number, value: any, equalityComparer?: _Comparer<any, boolean>): Recorded;\n    }\n\n    export var Recorded: RecordedStatic;\n\n    export var ReactiveTest: {\n        /** Default virtual time used for creation of observable sequences in unit tests. */\n        created: number;\n        /** Default virtual time used to subscribe to observable sequences in unit tests. */\n        subscribed: number;\n        /** Default virtual time used to dispose subscriptions in unit tests. */\n        disposed: number;\n\n        /**\n         * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n         *\n         * 1 - ReactiveTest.onNext(200, 42);\n         * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n         *\n         * @param ticks Recorded virtual time the OnNext notification occurs.\n         * @param value Recorded value stored in the OnNext notification or a predicate.\n         * @return Recorded OnNext notification.\n         */\n        onNext(ticks: number, value: any): Recorded;\n        /**\n         * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n         *\n         * 1 - ReactiveTest.onNext(200, 42);\n         * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n         *\n         * @param ticks Recorded virtual time the OnNext notification occurs.\n         * @param value Recorded value stored in the OnNext notification or a predicate.\n         * @return Recorded OnNext notification.\n         */\n        onNext(ticks: number, predicate: (value: any) => boolean): Recorded;\n        /**\n         * Factory method for an OnError notification record at a given time with a given error.\n         *\n         * 1 - ReactiveTest.onNext(200, new Error('error'));\n         * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n         *\n         * @param ticks Recorded virtual time the OnError notification occurs.\n         * @param exception Recorded exception stored in the OnError notification.\n         * @return Recorded OnError notification.\n         */\n        onError(ticks: number, exception: any): Recorded;\n        /**\n         * Factory method for an OnError notification record at a given time with a given error.\n         *\n         * 1 - ReactiveTest.onNext(200, new Error('error'));\n         * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n         *\n         * @param ticks Recorded virtual time the OnError notification occurs.\n         * @param exception Recorded exception stored in the OnError notification.\n         * @return Recorded OnError notification.\n         */\n        onError(ticks: number, predicate: (exception: any) => boolean): Recorded;\n        /**\n         * Factory method for an OnCompleted notification record at a given time.\n         *\n         * @param ticks Recorded virtual time the OnCompleted notification occurs.\n         * @return Recorded OnCompleted notification.\n         */\n        onCompleted(ticks: number): Recorded;\n\n        /**\n         * Factory method for a subscription record based on a given subscription and disposal time.\n         *\n         * @param start Virtual time indicating when the subscription was created.\n         * @param end Virtual time indicating when the subscription was disposed.\n         * @return Subscription object.\n         */\n        subscribe(subscribeAt: number, unsubscribeAt?: number): Subscription;\n    }\n\n    export interface MockObserver<T> extends Observer<T> {\n        messages: Recorded[];\n    }\n\n    interface MockObserverStatic extends ObserverStatic {\n        new <T>(scheduler: IScheduler): MockObserver<T>;\n    }\n\n    export var MockObserver: MockObserverStatic;\n\n\n    export interface TestScheduler extends VirtualTimeScheduler<number, number> {\n        /**\n         * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n         * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n         * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n         */\n        createColdObservable<T>(...records: Recorded[]): Observable<T>;\n        /**\n         * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n         * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n         * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n         */\n        createHotObservable<T>(...records: Recorded[]): Observable<T>;\n        /**\n         * Creates an observer that records received notification messages and timestamps those.\n         * @return Observer that can be used to assert the timing of received notifications.\n         */\n        createObserver<T>(): MockObserver<T>;\n\n        /**\n         * Creates a resolved promise with the given value and ticks\n         * @param {Number} ticks The absolute time of the resolution.\n         * @param {Any} value The value to yield at the given tick.\n         * @returns {MockPromise} A mock Promise which fulfills with the given value.\n         */\n        createResolvedPromise<T>(ticks: number, value: T): IPromise<T>;\n        /**\n         * Creates a rejected promise with the given reason and ticks\n         * @param {Number} ticks The absolute time of the resolution.\n         * @param {Any} reason The reason for rejection to yield at the given tick.\n         * @returns {MockPromise} A mock Promise which rejects with the given reason.\n         */\n        createRejectedPromise<T>(ticks: number, value: T): IPromise<T>;\n\n        /**\n         * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n         *\n         * @param create Factory method to create an observable sequence.\n         * @param created Virtual time at which to invoke the factory to create an observable sequence.\n         * @param subscribed Virtual time at which to subscribe to the created observable sequence.\n         * @param disposed Virtual time at which to dispose the subscription.\n         * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n         */\n        startWithTiming<T>(create: () => Observable<T>, createdAt: number, subscribedAt: number, disposedAt: number): MockObserver<T>;\n        /**\n         * Starts the test scheduler and uses the specified virtual time to dispose the subscription to the sequence obtained through the factory function.\n         * Default virtual times are used for factory invocation and sequence subscription.\n         *\n         * @param create Factory method to create an observable sequence.\n         * @param disposed Virtual time at which to dispose the subscription.\n         * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n         */\n        startWithDispose<T>(create: () => Observable<T>, disposedAt: number): MockObserver<T>;\n        /**\n         * Starts the test scheduler and uses default virtual times to invoke the factory function, to subscribe to the resulting sequence, and to dispose the subscription.\n         *\n         * @param create Factory method to create an observable sequence.\n         * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n         */\n        startWithCreate<T>(create: () => Observable<T>): MockObserver<T>;\n    }\n\n    export var TestScheduler: {\n        new (): TestScheduler;\n    }\n\n}\ndeclare module \"rx.testing\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.testing.es6.d.ts",
    "content": "declare module Rx {\n\n    export interface Subscription {\n        /**\n         * Checks whether the given subscription is equal to the current instance.\n         * @param other Subscription object to check for equality.\n         * @returns {Boolean} true if both objects are equal; false otherwise.\n         */\n        equals(other: Subscription): boolean;\n        /**\n         * Returns a string representation of the current Subscription value.\n         * @returns {String} String representation of the current Subscription value.\n         */\n        toString(): string;\n    }\n\n    interface SubscriptionStatic {\n        /**\n         * Creates a new subscription object with the given virtual subscription and unsubscription time.\n         *\n         * @constructor\n         * @param {Number} subscribe Virtual time at which the subscription occurred.\n         * @param {Number} unsubscribe Virtual time at which the unsubscription occurred.\n         */\n        new (subscribeAt: number, unsubscribeAt?: number): Subscription;\n    }\n\n    export var Subscription: SubscriptionStatic;\n\n    export interface Recorded {\n        /**\n         * Checks whether the given recorded object is equal to the current instance.\n         *\n         * @param {Recorded} other Recorded object to check for equality.\n         * @returns {Boolean} true if both objects are equal; false otherwise.\n         */\n        equals(other: Recorded): boolean;\n        /**\n         * Returns a string representation of the current Recorded value.\n         *\n         * @returns {String} String representation of the current Recorded value.\n         */\n        toString(): string;\n        time: number;\n        value: any;\n    }\n\n    interface RecordedStatic {\n        /**\n         * Creates a new object recording the production of the specified value at the given virtual time.\n         *\n         * @constructor\n         * @param {Number} time Virtual time the value was produced on.\n         * @param {Mixed} value Value that was produced.\n         * @param {Function} comparer An optional comparer.\n         */\n        new (time: number, value: any, equalityComparer?: _Comparer<any, boolean>): Recorded;\n    }\n\n    export var Recorded: RecordedStatic;\n\n    export var ReactiveTest: {\n        /** Default virtual time used for creation of observable sequences in unit tests. */\n        created: number;\n        /** Default virtual time used to subscribe to observable sequences in unit tests. */\n        subscribed: number;\n        /** Default virtual time used to dispose subscriptions in unit tests. */\n        disposed: number;\n\n        /**\n         * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n         *\n         * 1 - ReactiveTest.onNext(200, 42);\n         * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n         *\n         * @param ticks Recorded virtual time the OnNext notification occurs.\n         * @param value Recorded value stored in the OnNext notification or a predicate.\n         * @return Recorded OnNext notification.\n         */\n        onNext(ticks: number, value: any): Recorded;\n        /**\n         * Factory method for an OnNext notification record at a given time with a given value or a predicate function.\n         *\n         * 1 - ReactiveTest.onNext(200, 42);\n         * 2 - ReactiveTest.onNext(200, function (x) { return x.length == 2; });\n         *\n         * @param ticks Recorded virtual time the OnNext notification occurs.\n         * @param value Recorded value stored in the OnNext notification or a predicate.\n         * @return Recorded OnNext notification.\n         */\n        onNext(ticks: number, predicate: (value: any) => boolean): Recorded;\n        /**\n         * Factory method for an OnError notification record at a given time with a given error.\n         *\n         * 1 - ReactiveTest.onNext(200, new Error('error'));\n         * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n         *\n         * @param ticks Recorded virtual time the OnError notification occurs.\n         * @param exception Recorded exception stored in the OnError notification.\n         * @return Recorded OnError notification.\n         */\n        onError(ticks: number, exception: any): Recorded;\n        /**\n         * Factory method for an OnError notification record at a given time with a given error.\n         *\n         * 1 - ReactiveTest.onNext(200, new Error('error'));\n         * 2 - ReactiveTest.onNext(200, function (e) { return e.message === 'error'; });\n         *\n         * @param ticks Recorded virtual time the OnError notification occurs.\n         * @param exception Recorded exception stored in the OnError notification.\n         * @return Recorded OnError notification.\n         */\n        onError(ticks: number, predicate: (exception: any) => boolean): Recorded;\n        /**\n         * Factory method for an OnCompleted notification record at a given time.\n         *\n         * @param ticks Recorded virtual time the OnCompleted notification occurs.\n         * @return Recorded OnCompleted notification.\n         */\n        onCompleted(ticks: number): Recorded;\n\n        /**\n         * Factory method for a subscription record based on a given subscription and disposal time.\n         *\n         * @param start Virtual time indicating when the subscription was created.\n         * @param end Virtual time indicating when the subscription was disposed.\n         * @return Subscription object.\n         */\n        subscribe(subscribeAt: number, unsubscribeAt?: number): Subscription;\n    }\n\n    export interface MockObserver<T> extends Observer<T> {\n        messages: Recorded[];\n    }\n\n    interface MockObserverStatic extends ObserverStatic {\n        new <T>(scheduler: IScheduler): MockObserver<T>;\n    }\n\n    export var MockObserver: MockObserverStatic;\n\n\n    export interface TestScheduler extends VirtualTimeScheduler<number, number> {\n        /**\n         * Creates a cold observable using the specified timestamped notification messages either as an array or arguments.\n         * @param messages Notifications to surface through the created sequence at their specified virtual time offsets from the sequence subscription time.\n         * @return Cold observable sequence that can be used to assert the timing of subscriptions and notifications.\n         */\n        createColdObservable<T>(...records: Recorded[]): Observable<T>;\n        /**\n         * Creates a hot observable using the specified timestamped notification messages either as an array or arguments.\n         * @param messages Notifications to surface through the created sequence at their specified absolute virtual times.\n         * @return Hot observable sequence that can be used to assert the timing of subscriptions and notifications.\n         */\n        createHotObservable<T>(...records: Recorded[]): Observable<T>;\n        /**\n         * Creates an observer that records received notification messages and timestamps those.\n         * @return Observer that can be used to assert the timing of received notifications.\n         */\n        createObserver<T>(): MockObserver<T>;\n\n        /**\n         * Creates a resolved promise with the given value and ticks\n         * @param {Number} ticks The absolute time of the resolution.\n         * @param {Any} value The value to yield at the given tick.\n         * @returns {MockPromise} A mock Promise which fulfills with the given value.\n         */\n        createResolvedPromise<T>(ticks: number, value: T): IPromise<T>;\n        /**\n         * Creates a rejected promise with the given reason and ticks\n         * @param {Number} ticks The absolute time of the resolution.\n         * @param {Any} reason The reason for rejection to yield at the given tick.\n         * @returns {MockPromise} A mock Promise which rejects with the given reason.\n         */\n        createRejectedPromise<T>(ticks: number, value: T): IPromise<T>;\n\n        /**\n         * Starts the test scheduler and uses the specified virtual times to invoke the factory function, subscribe to the resulting sequence, and dispose the subscription.\n         *\n         * @param create Factory method to create an observable sequence.\n         * @param created Virtual time at which to invoke the factory to create an observable sequence.\n         * @param subscribed Virtual time at which to subscribe to the created observable sequence.\n         * @param disposed Virtual time at which to dispose the subscription.\n         * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n         */\n        startWithTiming<T>(create: () => Observable<T>, createdAt: number, subscribedAt: number, disposedAt: number): MockObserver<T>;\n        /**\n         * Starts the test scheduler and uses the specified virtual time to dispose the subscription to the sequence obtained through the factory function.\n         * Default virtual times are used for factory invocation and sequence subscription.\n         *\n         * @param create Factory method to create an observable sequence.\n         * @param disposed Virtual time at which to dispose the subscription.\n         * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n         */\n        startWithDispose<T>(create: () => Observable<T>, disposedAt: number): MockObserver<T>;\n        /**\n         * Starts the test scheduler and uses default virtual times to invoke the factory function, to subscribe to the resulting sequence, and to dispose the subscription.\n         *\n         * @param create Factory method to create an observable sequence.\n         * @return Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.\n         */\n        startWithCreate<T>(create: () => Observable<T>): MockObserver<T>;\n    }\n\n    export var TestScheduler: {\n        new (): TestScheduler;\n    }\n\n}\ndeclare module \"rx.testing\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.time.d.ts",
    "content": "declare module Rx {\n\n    export interface ObservableStatic {\n        /**\n         *  Returns an observable sequence that produces a value after each period.\n         *\n         * @example\n         *  1 - res = Rx.Observable.interval(1000);\n         *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n         *\n         * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n         * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n         * @returns {Observable} An observable sequence that produces a value after each period.\n         */\n        interval(period: number, scheduler?: IScheduler): Observable<number>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n         * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n         * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n         * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n         * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n         */\n        timer(dueTime: number, period: number, scheduler?: IScheduler): Observable<number>;\n        /**\n         *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n         * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n         * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n         * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n         * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n         */\n        timer(dueTime: number, scheduler?: IScheduler): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n        *\n        * @example\n        *  1 - res = Rx.Observable.delay(new Date());\n        *  2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout);\n        *\n        *  3 - res = Rx.Observable.delay(5000);\n        *  4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout);\n        * @memberOf Observable#\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n        * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(dueTime: Date, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n        *\n        * @example\n        *  1 - res = Rx.Observable.delay(new Date());\n        *  2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout);\n        *\n        *  3 - res = Rx.Observable.delay(5000);\n        *  4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout);\n        * @memberOf Observable#\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n        * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(dueTime: number, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Time shifts the observable sequence based on a subscription delay and a delay selector function for each element.\n        *\n        * @example\n        *  1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only\n        *  1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector\n        *\n        * @param {Observable} [subscriptionDelay]  Sequence indicating the delay for the subscription to the source.\n        * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(delayDurationSelector: (item: T) => ObservableOrPromise<number>): Observable<T>;\n\n        /**\n        *  Time shifts the observable sequence based on a subscription delay and a delay selector function for each element.\n        *\n        * @example\n        *  1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only\n        *  1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector\n        *\n        * @param {Observable} [subscriptionDelay]  Sequence indicating the delay for the subscription to the source.\n        * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(subscriptionDelay: Observable<number>, delayDurationSelector: (item: T) => ObservableOrPromise<number>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Ignores values from an observable sequence which are followed by another value before dueTime.\n        * @param {Number} dueTime Duration of the debounce period for each value (specified as an integer denoting milliseconds).\n        * @param {Scheduler} [scheduler]  Scheduler to run the debounce timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The debounced sequence.\n        */\n        debounce(dueTime: number, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        * Ignores values from an observable sequence which are followed by another value within a computed throttle duration.\n        * @param {Function} durationSelector Selector function to retrieve a sequence indicating the throttle duration for each given element.\n        * @returns {Observable} The debounced sequence.\n        */\n        debounce(debounceDurationSelector: (item: T) => ObservableOrPromise<any>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n        * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n        * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithTime(timeSpan: number, timeShift: number, scheduler?: IScheduler): Observable<Observable<T>>;\n        /**\n        *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n        * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n        * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithTime(timeSpan: number, scheduler?: IScheduler): Observable<Observable<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed.\n        * @param {Number} timeSpan Maximum time length of a window.\n        * @param {Number} count Maximum element count of a window.\n        * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithTimeOrCount(timeSpan: number, count: number, scheduler?: IScheduler): Observable<Observable<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n        * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n        * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithTime(timeSpan: number, timeShift: number, scheduler?: IScheduler): Observable<T[]>;\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n        * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n        * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithTime(timeSpan: number, scheduler?: IScheduler): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed.\n        * @param {Number} timeSpan Maximum time length of a buffer.\n        * @param {Number} count Maximum element count of a buffer.\n        * @param {Scheduler} [scheduler]  Scheduler to run bufferin timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithTimeOrCount(timeSpan: number, count: number, scheduler?: IScheduler): Observable<T[]>;\n    }\n\n\texport interface TimeInterval<T> {\n\t\tvalue: T;\n\t\tinterval: number;\n\t}\n\n    export interface Observable<T> {\n        /**\n        *  Records the time interval between consecutive values in an observable sequence.\n        *\n        * @example\n        *  1 - res = source.timeInterval();\n        *  2 - res = source.timeInterval(Rx.Scheduler.timeout);\n        *\n        * @param [scheduler]  Scheduler used to compute time intervals. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence with time interval information on values.\n        */\n        timeInterval(scheduler?: IScheduler): Observable<TimeInterval<T>>;\n    }\n\n    export interface Timestamp<T> {\n        value: T;\n        timestamp: number;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Records the timestamp for each value in an observable sequence.\n        *\n        * @example\n        *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n        *  2 - res = source.timestamp(Rx.Scheduler.default);\n        *\n        * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the default scheduler is used.\n        * @returns {Observable} An observable sequence with timestamp information on values.\n        */\n        timestamp(scheduler?: IScheduler): Observable<Timestamp<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        sample(intervalOrSampler: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        sample<TSample>(sampler: Observable<TSample>, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        throttleLatest(interval: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        throttleLatest<TSample>(sampler: Observable<TSample>, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: Date, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: Date, other?: Observable<T>, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: number, other?: Observable<T>, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(timeoutdurationSelector: (item: T) => Observable<TTimeout>): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @param {Observable} other  Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException().\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(timeoutdurationSelector: (item: T) => Observable<TTimeout>, other: Observable<T>): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Observable} [firstTimeout]  Observable sequence that represents the timeout for the first element. If not provided, this defaults to Observable.never().\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException().\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(firstTimeout: Observable<TTimeout>, timeoutdurationSelector: (item: T) => Observable<TTimeout>, other?: Observable<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n         *\n         * @example\n         *  res = source.generateWithAbsoluteTime(0,\n         *      function (x) { return return true; },\n         *      function (x) { return x + 1; },\n         *      function (x) { return x; },\n         *      function (x) { return new Date(); }\n         *  });\n         *\n         * @param {Mixed} initialState Initial state.\n         * @param {Function} condition Condition to terminate generation (upon returning false).\n         * @param {Function} iterate Iteration step function.\n         * @param {Function} resultSelector Selector function for results produced in the sequence.\n         * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning Date values.\n         * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n         * @returns {Observable} The generated sequence.\n         */\n        generateWithAbsoluteTime<TState, TResult>(\n            initialState: TState,\n            condition: (state: TState) => boolean,\n            iterate: (state: TState) => TState,\n            resultSelector: (state: TState) => TResult,\n            timeSelector: (state: TState) => Date,\n            scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n         *\n         * @example\n         *  res = source.generateWithRelativeTime(0,\n         *      function (x) { return return true; },\n         *      function (x) { return x + 1; },\n         *      function (x) { return x; },\n         *      function (x) { return 500; }\n         *  );\n         *\n         * @param {Mixed} initialState Initial state.\n         * @param {Function} condition Condition to terminate generation (upon returning false).\n         * @param {Function} iterate Iteration step function.\n         * @param {Function} resultSelector Selector function for results produced in the sequence.\n         * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds.\n         * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n         * @returns {Observable} The generated sequence.\n         */\n        generateWithRelativeTime<TState, TResult>(\n            initialState: TState,\n            condition: (state: TState) => boolean,\n            iterate: (state: TState) => TState,\n            resultSelector: (state: TState) => TResult,\n            timeSelector: (state: TState) => number,\n            scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n        *\n        * @example\n        *  1 - res = source.delaySubscription(5000); // 5s\n        *  2 - res = source.delaySubscription(5000, Rx.Scheduler.default); // 5 seconds\n        *\n        * @param {Number} dueTime Relative or absolute time shift of the subscription.\n        * @param {Scheduler} [scheduler]  Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delaySubscription(dueTime: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n        *\n        *  1 - res = source.skipLastWithTime(5000);\n        *  2 - res = source.skipLastWithTime(5000, scheduler);\n        *\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for skipping elements from the end of the sequence.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout\n        * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence.\n        */\n        skipLastWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements.\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for taking elements from the end of the sequence.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence.\n        */\n        takeLastWithTime(duration: number, timerScheduler?: IScheduler, loopScheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for taking elements from the end of the sequence.\n        * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence.\n        */\n        takeLastBufferWithTime(duration: number, scheduler?: IScheduler): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n        *\n        * @example\n        *  1 - res = source.takeWithTime(5000,  [optional scheduler]);\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for taking elements from the start of the sequence.\n        * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence.\n        */\n        takeWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n        *\n        * @example\n        *  1 - res = source.skipWithTime(5000, [optional scheduler]);\n        *\n        * @description\n        *  Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence.\n        *  This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded\n        *  may not execute immediately, despite the zero due time.\n        *\n        *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration.\n        * @param {Number} duration Duration for skipping elements from the start of the sequence.\n        * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence.\n        */\n        skipWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n        *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n        *\n        * @examples\n        *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n        *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n        * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n        */\n        skipUntilWithTime(startTime: Date, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n        *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n        *\n        * @examples\n        *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n        *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n        * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n        */\n        skipUntilWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n        * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n        * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n        */\n        takeUntilWithTime(endTime: Date, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n        * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n        * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n        */\n        takeUntilWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n        * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n        * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n        * @returns {Observable} An Observable that performs the throttle operation.\n        */\n        throttle(windowDuration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n}\ndeclare module \"rx.time\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.time.es6.d.ts",
    "content": "declare module Rx {\n\n    export interface ObservableStatic {\n        /**\n         *  Returns an observable sequence that produces a value after each period.\n         *\n         * @example\n         *  1 - res = Rx.Observable.interval(1000);\n         *  2 - res = Rx.Observable.interval(1000, Rx.Scheduler.timeout);\n         *\n         * @param {Number} period Period for producing the values in the resulting sequence (specified as an integer denoting milliseconds).\n         * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, Rx.Scheduler.timeout is used.\n         * @returns {Observable} An observable sequence that produces a value after each period.\n         */\n        interval(period: number, scheduler?: IScheduler): Observable<number>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n         * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n         * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n         * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n         * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n         */\n        timer(dueTime: number, period: number, scheduler?: IScheduler): Observable<number>;\n        /**\n         *  Returns an observable sequence that produces a value after dueTime has elapsed and then after each period.\n         * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) at which to produce the first value.\n         * @param {Mixed} [periodOrScheduler]  Period to produce subsequent values (specified as an integer denoting milliseconds), or the scheduler to run the timer on. If not specified, the resulting timer is not recurring.\n         * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, the timeout scheduler is used.\n         * @returns {Observable} An observable sequence that produces a value after due time has elapsed and then each period.\n         */\n        timer(dueTime: number, scheduler?: IScheduler): Observable<number>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n        *\n        * @example\n        *  1 - res = Rx.Observable.delay(new Date());\n        *  2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout);\n        *\n        *  3 - res = Rx.Observable.delay(5000);\n        *  4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout);\n        * @memberOf Observable#\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n        * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(dueTime: Date, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Time shifts the observable sequence by dueTime. The relative time intervals between the values are preserved.\n        *\n        * @example\n        *  1 - res = Rx.Observable.delay(new Date());\n        *  2 - res = Rx.Observable.delay(new Date(), Rx.Scheduler.timeout);\n        *\n        *  3 - res = Rx.Observable.delay(5000);\n        *  4 - res = Rx.Observable.delay(5000, 1000, Rx.Scheduler.timeout);\n        * @memberOf Observable#\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) by which to shift the observable sequence.\n        * @param {Scheduler} [scheduler] Scheduler to run the delay timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(dueTime: number, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Time shifts the observable sequence based on a subscription delay and a delay selector function for each element.\n        *\n        * @example\n        *  1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only\n        *  1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector\n        *\n        * @param {Observable} [subscriptionDelay]  Sequence indicating the delay for the subscription to the source.\n        * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(delayDurationSelector: (item: T) => ObservableOrPromise<number>): Observable<T>;\n\n        /**\n        *  Time shifts the observable sequence based on a subscription delay and a delay selector function for each element.\n        *\n        * @example\n        *  1 - res = source.delayWithSelector(function (x) { return Rx.Scheduler.timer(5000); }); // with selector only\n        *  1 - res = source.delayWithSelector(Rx.Observable.timer(2000), function (x) { return Rx.Observable.timer(x); }); // with delay and selector\n        *\n        * @param {Observable} [subscriptionDelay]  Sequence indicating the delay for the subscription to the source.\n        * @param {Function} delayDurationSelector Selector function to retrieve a sequence indicating the delay for each given element.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delay(subscriptionDelay: Observable<number>, delayDurationSelector: (item: T) => ObservableOrPromise<number>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Ignores values from an observable sequence which are followed by another value before dueTime.\n        * @param {Number} dueTime Duration of the debounce period for each value (specified as an integer denoting milliseconds).\n        * @param {Scheduler} [scheduler]  Scheduler to run the debounce timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The debounced sequence.\n        */\n        debounce(dueTime: number, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        * Ignores values from an observable sequence which are followed by another value within a computed throttle duration.\n        * @param {Function} durationSelector Selector function to retrieve a sequence indicating the throttle duration for each given element.\n        * @returns {Observable} The debounced sequence.\n        */\n        debounce(debounceDurationSelector: (item: T) => ObservableOrPromise<any>): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n        * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n        * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithTime(timeSpan: number, timeShift: number, scheduler?: IScheduler): Observable<Observable<T>>;\n        /**\n        *  Projects each element of an observable sequence into zero or more windows which are produced based on timing information.\n        * @param {Number} timeSpan Length of each window (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive windows (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent windows.\n        * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithTime(timeSpan: number, scheduler?: IScheduler): Observable<Observable<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a window that is completed when either it's full or a given amount of time has elapsed.\n        * @param {Number} timeSpan Maximum time length of a window.\n        * @param {Number} count Maximum element count of a window.\n        * @param {Scheduler} [scheduler]  Scheduler to run windowing timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of windows.\n        */\n        windowWithTimeOrCount(timeSpan: number, count: number, scheduler?: IScheduler): Observable<Observable<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n        * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n        * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithTime(timeSpan: number, timeShift: number, scheduler?: IScheduler): Observable<T[]>;\n        /**\n        *  Projects each element of an observable sequence into zero or more buffers which are produced based on timing information.\n        * @param {Number} timeSpan Length of each buffer (specified as an integer denoting milliseconds).\n        * @param {Mixed} [timeShiftOrScheduler]  Interval between creation of consecutive buffers (specified as an integer denoting milliseconds), or an optional scheduler parameter. If not specified, the time shift corresponds to the timeSpan parameter, resulting in non-overlapping adjacent buffers.\n        * @param {Scheduler} [scheduler]  Scheduler to run buffer timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithTime(timeSpan: number, scheduler?: IScheduler): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Projects each element of an observable sequence into a buffer that is completed when either it's full or a given amount of time has elapsed.\n        * @param {Number} timeSpan Maximum time length of a buffer.\n        * @param {Number} count Maximum element count of a buffer.\n        * @param {Scheduler} [scheduler]  Scheduler to run bufferin timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence of buffers.\n        */\n        bufferWithTimeOrCount(timeSpan: number, count: number, scheduler?: IScheduler): Observable<T[]>;\n    }\n\n\texport interface TimeInterval<T> {\n\t\tvalue: T;\n\t\tinterval: number;\n\t}\n\n    export interface Observable<T> {\n        /**\n        *  Records the time interval between consecutive values in an observable sequence.\n        *\n        * @example\n        *  1 - res = source.timeInterval();\n        *  2 - res = source.timeInterval(Rx.Scheduler.timeout);\n        *\n        * @param [scheduler]  Scheduler used to compute time intervals. If not specified, the timeout scheduler is used.\n        * @returns {Observable} An observable sequence with time interval information on values.\n        */\n        timeInterval(scheduler?: IScheduler): Observable<TimeInterval<T>>;\n    }\n\n    export interface Timestamp<T> {\n        value: T;\n        timestamp: number;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Records the timestamp for each value in an observable sequence.\n        *\n        * @example\n        *  1 - res = source.timestamp(); // produces { value: x, timestamp: ts }\n        *  2 - res = source.timestamp(Rx.Scheduler.default);\n        *\n        * @param {Scheduler} [scheduler]  Scheduler used to compute timestamps. If not specified, the default scheduler is used.\n        * @returns {Observable} An observable sequence with timestamp information on values.\n        */\n        timestamp(scheduler?: IScheduler): Observable<Timestamp<T>>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        sample(intervalOrSampler: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        sample<TSample>(sampler: Observable<TSample>, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        throttleLatest(interval: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Samples the observable sequence at each interval.\n        *\n        * @example\n        *  1 - res = source.sample(sampleObservable); // Sampler tick sequence\n        *  2 - res = source.sample(5000); // 5 seconds\n        *  2 - res = source.sample(5000, Rx.Scheduler.timeout); // 5 seconds\n        *\n        * @param {Mixed} intervalOrSampler Interval at which to sample (specified as an integer denoting milliseconds) or Sampler Observable.\n        * @param {Scheduler} [scheduler]  Scheduler to run the sampling timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Sampled observable sequence.\n        */\n        throttleLatest<TSample>(sampler: Observable<TSample>, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: Date, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: Date, other?: Observable<T>, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: number, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Returns the source observable sequence or the other observable sequence if dueTime elapses.\n        * @param {Number} dueTime Absolute (specified as a Date object) or relative time (specified as an integer denoting milliseconds) when a timeout occurs.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not specified, a timeout error throwing sequence will be used.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timeout timers on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout(dueTime: number, other?: Observable<T>, scheduler?: IScheduler): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(timeoutdurationSelector: (item: T) => Observable<TTimeout>): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @param {Observable} other  Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException().\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(timeoutdurationSelector: (item: T) => Observable<TTimeout>, other: Observable<T>): Observable<T>;\n\n        /**\n        *  Returns the source observable sequence, switching to the other observable sequence if a timeout is signaled.\n        * @param {Observable} [firstTimeout]  Observable sequence that represents the timeout for the first element. If not provided, this defaults to Observable.never().\n        * @param {Function} timeoutDurationSelector Selector to retrieve an observable sequence that represents the timeout between the current element and the next element.\n        * @param {Observable} [other]  Sequence to return in case of a timeout. If not provided, this is set to Observable.throwException().\n        * @returns {Observable} The source sequence switching to the other sequence in case of a timeout.\n        */\n        timeout<TTimeout>(firstTimeout: Observable<TTimeout>, timeoutdurationSelector: (item: T) => Observable<TTimeout>, other?: Observable<T>): Observable<T>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n         *\n         * @example\n         *  res = source.generateWithAbsoluteTime(0,\n         *      function (x) { return return true; },\n         *      function (x) { return x + 1; },\n         *      function (x) { return x; },\n         *      function (x) { return new Date(); }\n         *  });\n         *\n         * @param {Mixed} initialState Initial state.\n         * @param {Function} condition Condition to terminate generation (upon returning false).\n         * @param {Function} iterate Iteration step function.\n         * @param {Function} resultSelector Selector function for results produced in the sequence.\n         * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning Date values.\n         * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n         * @returns {Observable} The generated sequence.\n         */\n        generateWithAbsoluteTime<TState, TResult>(\n            initialState: TState,\n            condition: (state: TState) => boolean,\n            iterate: (state: TState) => TState,\n            resultSelector: (state: TState) => TResult,\n            timeSelector: (state: TState) => Date,\n            scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface ObservableStatic {\n        /**\n         *  Generates an observable sequence by iterating a state from an initial state until the condition fails.\n         *\n         * @example\n         *  res = source.generateWithRelativeTime(0,\n         *      function (x) { return return true; },\n         *      function (x) { return x + 1; },\n         *      function (x) { return x; },\n         *      function (x) { return 500; }\n         *  );\n         *\n         * @param {Mixed} initialState Initial state.\n         * @param {Function} condition Condition to terminate generation (upon returning false).\n         * @param {Function} iterate Iteration step function.\n         * @param {Function} resultSelector Selector function for results produced in the sequence.\n         * @param {Function} timeSelector Time selector function to control the speed of values being produced each iteration, returning integer values denoting milliseconds.\n         * @param {Scheduler} [scheduler]  Scheduler on which to run the generator loop. If not specified, the timeout scheduler is used.\n         * @returns {Observable} The generated sequence.\n         */\n        generateWithRelativeTime<TState, TResult>(\n            initialState: TState,\n            condition: (state: TState) => boolean,\n            iterate: (state: TState) => TState,\n            resultSelector: (state: TState) => TResult,\n            timeSelector: (state: TState) => number,\n            scheduler?: IScheduler): Observable<TResult>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Time shifts the observable sequence by delaying the subscription with the specified relative time duration, using the specified scheduler to run timers.\n        *\n        * @example\n        *  1 - res = source.delaySubscription(5000); // 5s\n        *  2 - res = source.delaySubscription(5000, Rx.Scheduler.default); // 5 seconds\n        *\n        * @param {Number} dueTime Relative or absolute time shift of the subscription.\n        * @param {Scheduler} [scheduler]  Scheduler to run the subscription delay timer on. If not specified, the timeout scheduler is used.\n        * @returns {Observable} Time-shifted sequence.\n        */\n        delaySubscription(dueTime: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Skips elements for the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n        *\n        *  1 - res = source.skipLastWithTime(5000);\n        *  2 - res = source.skipLastWithTime(5000, scheduler);\n        *\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for skipping elements from the end of the sequence.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout\n        * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the end of the source sequence.\n        */\n        skipLastWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns elements within the specified duration from the end of the observable source sequence, using the specified schedulers to run timers and to drain the collected elements.\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for taking elements from the end of the sequence.\n        * @param {Scheduler} [scheduler]  Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements taken during the specified duration from the end of the source sequence.\n        */\n        takeLastWithTime(duration: number, timerScheduler?: IScheduler, loopScheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Returns an array with the elements within the specified duration from the end of the observable source sequence, using the specified scheduler to run timers.\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for taking elements from the end of the sequence.\n        * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence containing a single array with the elements taken during the specified duration from the end of the source sequence.\n        */\n        takeLastBufferWithTime(duration: number, scheduler?: IScheduler): Observable<T[]>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Takes elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n        *\n        * @example\n        *  1 - res = source.takeWithTime(5000,  [optional scheduler]);\n        * @description\n        *  This operator accumulates a queue with a length enough to store elements received during the initial duration window.\n        *  As more elements are received, elements older than the specified duration are taken from the queue and produced on the\n        *  result sequence. This causes elements to be delayed with duration.\n        * @param {Number} duration Duration for taking elements from the start of the sequence.\n        * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements taken during the specified duration from the start of the source sequence.\n        */\n        takeWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Skips elements for the specified duration from the start of the observable source sequence, using the specified scheduler to run timers.\n        *\n        * @example\n        *  1 - res = source.skipWithTime(5000, [optional scheduler]);\n        *\n        * @description\n        *  Specifying a zero value for duration doesn't guarantee no elements will be dropped from the start of the source sequence.\n        *  This is a side-effect of the asynchrony introduced by the scheduler, where the action that causes callbacks from the source sequence to be forwarded\n        *  may not execute immediately, despite the zero due time.\n        *\n        *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the duration.\n        * @param {Number} duration Duration for skipping elements from the start of the sequence.\n        * @param {Scheduler} scheduler Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements skipped during the specified duration from the start of the source sequence.\n        */\n        skipWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n        *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n        *\n        * @examples\n        *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n        *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n        * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n        */\n        skipUntilWithTime(startTime: Date, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Skips elements from the observable source sequence until the specified start time, using the specified scheduler to run timers.\n        *  Errors produced by the source sequence are always forwarded to the result sequence, even if the error occurs before the start time.\n        *\n        * @examples\n        *  1 - res = source.skipUntilWithTime(new Date(), [scheduler]);\n        *  2 - res = source.skipUntilWithTime(5000, [scheduler]);\n        * @param {Date|Number} startTime Time to start taking elements from the source sequence. If this value is less than or equal to Date(), no elements will be skipped.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on. If not specified, defaults to Rx.Scheduler.timeout.\n        * @returns {Observable} An observable sequence with the elements skipped until the specified start time.\n        */\n        skipUntilWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n        * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n        * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n        */\n        takeUntilWithTime(endTime: Date, scheduler?: IScheduler): Observable<T>;\n        /**\n        *  Takes elements for the specified duration until the specified end time, using the specified scheduler to run timers.\n        * @param {Number | Date} endTime Time to stop taking elements from the source sequence. If this value is less than or equal to new Date(), the result stream will complete immediately.\n        * @param {Scheduler} [scheduler] Scheduler to run the timer on.\n        * @returns {Observable} An observable sequence with the elements taken until the specified end time.\n        */\n        takeUntilWithTime(duration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n    export interface Observable<T> {\n        /**\n        * Returns an Observable that emits only the first item emitted by the source Observable during sequential time windows of a specified duration.\n        * @param {Number} windowDuration time to wait before emitting another item after emitting the last item\n        * @param {Scheduler} [scheduler] the Scheduler to use internally to manage the timers that handle timeout for each item. If not provided, defaults to Scheduler.timeout.\n        * @returns {Observable} An Observable that performs the throttle operation.\n        */\n        throttle(windowDuration: number, scheduler?: IScheduler): Observable<T>;\n    }\n\n}\ndeclare module \"rx.time\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.virtualtime.d.ts",
    "content": "declare module Rx {\n\n    export interface VirtualTimeScheduler<TAbsolute, TRelative> extends IScheduler {\n        clock: TAbsolute;\n        /**\n         * Adds a relative time value to an absolute time value.\n         * @param {Number} absolute Absolute virtual time value.\n         * @param {Number} relative Relative virtual time value to add.\n         * @return {Number} Resulting absolute virtual time sum value.\n         */\n        add(from: TAbsolute, by: TRelative): TAbsolute;\n\n        /**\n         * Converts an absolute time to a number\n         * @param {Any} The absolute time.\n         * @returns {Number} The absolute time in ms\n         */\n        toAbsoluteTime(duetime: TAbsolute): number;\n\n        /**\n         * Converts the TimeSpan value to a relative virtual time value.\n         * @param {Number} timeSpan TimeSpan value to convert.\n         * @return {Number} Corresponding relative virtual time value.\n         */\n        toRelativeTime(duetime: number): TRelative;\n\n        /**\n         * Starts the virtual time scheduler.\n         */\n        start(): IDisposable;\n\n        /**\n         * Stops the virtual time scheduler.\n         */\n        stop(): void;\n\n        /**\n         * Advances the scheduler's clock to the specified time, running all work till that point.\n         * @param {Number} time Absolute time to advance the scheduler's clock to.\n         */\n        advanceTo(time: TAbsolute): void;\n\n        /**\n         * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n         * @param {Number} time Relative time to advance the scheduler's clock by.\n         */\n        advanceBy(time: TRelative): void;\n\n        /**\n         * Advances the scheduler's clock by the specified relative time.\n         * @param {Number} time Relative time to advance the scheduler's clock by.\n         */\n        sleep(time: TRelative): void;\n\n        isEnabled: boolean;\n\n        /**\n         * Gets the next scheduled item to be executed.\n         * @returns {ScheduledItem} The next scheduled item.\n         */\n        getNext(): internals.ScheduledItem<TAbsolute>;\n\n        /**\n         * Schedules an action to be executed at dueTime.\n         * @param {Mixed} state State passed to the action to be executed.\n         * @param {Any} dueTime Absolute time at which to execute the action.\n         * @param {Function} action Action to be executed.\n         * @returns {Disposable} The disposable object used to cancel the scheduled action (best effort).\n         */\n        scheduleAbsolute(\n            state: any,\n            dueTime: TAbsolute,\n            action: (scheduler: VirtualTimeScheduler<TAbsolute, TRelative>, state: any) => any\n        ): SingleAssignmentDisposable;\n    }\n\n    export var VirtualTimeScheduler: {\n        /**\n         * Creates a new historical scheduler with the specified initial clock value.\n         * @constructor\n         * @param {Any} initialClock Initial value for the clock.\n         * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n         */\n        new <TAbsolute, TRelative>(initialClock: TAbsolute, comparer: _Comparer<TAbsolute, TRelative>): VirtualTimeScheduler<TAbsolute, TRelative>;\n    };\n\n    export interface HistoricalScheduler extends VirtualTimeScheduler<number, number> {\n    }\n\n    export var HistoricalScheduler: {\n        /**\n         * Creates a new historical scheduler with the specified initial clock value.\n         * @constructor\n         * @param {Number} initialClock Initial value for the clock.\n         * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n         */\n        new (initialClock: number, comparer: _Comparer<number, number>): HistoricalScheduler;\n    };\n\n}\ndeclare module \"rx.virtualtime\" { export = Rx; }\n"
  },
  {
    "path": "ts/rx.virtualtime.es6.d.ts",
    "content": "declare module Rx {\n\n    export interface VirtualTimeScheduler<TAbsolute, TRelative> extends IScheduler {\n        /**\n         * Adds a relative time value to an absolute time value.\n         * @param {Number} absolute Absolute virtual time value.\n         * @param {Number} relative Relative virtual time value to add.\n         * @return {Number} Resulting absolute virtual time sum value.\n         */\n        add(from: TAbsolute, by: TRelative): TAbsolute;\n\n        /**\n         * Converts an absolute time to a number\n         * @param {Any} The absolute time.\n         * @returns {Number} The absolute time in ms\n         */\n        toAbsoluteTime(duetime: TAbsolute): number;\n\n        /**\n         * Converts the TimeSpan value to a relative virtual time value.\n         * @param {Number} timeSpan TimeSpan value to convert.\n         * @return {Number} Corresponding relative virtual time value.\n         */\n        toRelativeTime(duetime: number): TRelative;\n\n        /**\n         * Starts the virtual time scheduler.\n         */\n        start(): IDisposable;\n\n        /**\n         * Stops the virtual time scheduler.\n         */\n        stop(): void;\n\n        /**\n         * Advances the scheduler's clock to the specified time, running all work till that point.\n         * @param {Number} time Absolute time to advance the scheduler's clock to.\n         */\n        advanceTo(time: TAbsolute): void;\n\n        /**\n         * Advances the scheduler's clock by the specified relative time, running all work scheduled for that timespan.\n         * @param {Number} time Relative time to advance the scheduler's clock by.\n         */\n        advanceBy(time: TRelative): void;\n\n        /**\n         * Advances the scheduler's clock by the specified relative time.\n         * @param {Number} time Relative time to advance the scheduler's clock by.\n         */\n        sleep(time: TRelative): void;\n\n        isEnabled: boolean;\n\n        /**\n         * Gets the next scheduled item to be executed.\n         * @returns {ScheduledItem} The next scheduled item.\n         */\n        getNext(): internals.ScheduledItem<TAbsolute>;\n    }\n\n    export interface HistoricalScheduler extends VirtualTimeScheduler<number, number> {\n    }\n\n    export var HistoricalScheduler: {\n        /**\n         * Creates a new historical scheduler with the specified initial clock value.\n         * @constructor\n         * @param {Number} initialClock Initial value for the clock.\n         * @param {Function} comparer Comparer to determine causality of events based on absolute time.\n         */\n        new (initialClock: number, comparer: _Comparer<number, number>): HistoricalScheduler;\n    };\n\n}\ndeclare module \"rx.virtualtime\" { export = Rx; }\n"
  },
  {
    "path": "ts/tsconfig.json",
    "content": "{\n    \"version\": \"1.5.0-beta\",\n    \"compilerOptions\": {\n        \"target\": \"es5\",\n        \"module\": \"commonjs\",\n        \"isolatedModules\": false,\n        \"jsx\": \"react\",\n        \"experimentalDecorators\": true,\n        \"emitDecoratorMetadata\": true,\n        \"declaration\": false,\n        \"noImplicitAny\": true,\n        \"removeComments\": true,\n        \"noLib\": false,\n        \"preserveConstEnums\": true,\n        \"suppressImplicitAnyIndexErrors\": true\n    },\n    \"compileOnSave\": false,\n    \"filesGlob\": [\n        \"./**/*.ts\",\n        \"!./core/es*.ts\",\n        \"!./**/*.d.ts\"\n    ],\n    \"files\": [\n        \"core/abstractobserver.ts\",\n        \"core/anonymousobservable.ts\",\n        \"core/anonymousobserver.ts\",\n        \"core/backpressure/controlled.ts\",\n        \"core/backpressure/pausable.ts\",\n        \"core/backpressure/pausablebuffered.ts\",\n        \"core/backpressure/pauser.ts\",\n        \"core/backpressure/stopandwait.ts\",\n        \"core/backpressure/windowed.ts\",\n        \"core/checkedobserver.ts\",\n        \"core/concurrency/currentthreadscheduler.ts\",\n        \"core/concurrency/defaultscheduler.ts\",\n        \"core/concurrency/historicalscheduler.ts\",\n        \"core/concurrency/immediatescheduler.ts\",\n        \"core/concurrency/scheduleditem.ts\",\n        \"core/concurrency/scheduleperiodicrecursive.ts\",\n        \"core/concurrency/scheduler.periodic.ts\",\n        \"core/concurrency/scheduler.recursive.ts\",\n        \"core/concurrency/scheduler.ts\",\n        \"core/concurrency/scheduler.wrappers.ts\",\n        \"core/concurrency/virtualtimescheduler.ts\",\n        \"core/disposables/booleandisposable.ts\",\n        \"core/disposables/compositedisposable.ts\",\n        \"core/disposables/disposable.ts\",\n        \"core/disposables/refcountdisposable.ts\",\n        \"core/internal/bindcallback.ts\",\n        \"core/internal/errors.ts\",\n        \"core/internal/isequal.ts\",\n        \"core/internal/priorityqueue.ts\",\n        \"core/internal/util.ts\",\n        \"core/joins/pattern.ts\",\n        \"core/joins/plan.ts\",\n        \"core/linq/connectableobservable.ts\",\n        \"core/linq/groupedobservable.ts\",\n        \"core/linq/observable/amb.ts\",\n        \"core/linq/observable/ambproto.ts\",\n        \"core/linq/observable/and.ts\",\n        \"core/linq/observable/asobservable.ts\",\n        \"core/linq/observable/average.ts\",\n        \"core/linq/observable/buffer.ts\",\n        \"core/linq/observable/bufferwithcount.ts\",\n        \"core/linq/observable/bufferwithtime.ts\",\n        \"core/linq/observable/bufferwithtimeorcount.ts\",\n        \"core/linq/observable/case.ts\",\n        \"core/linq/observable/catch.ts\",\n        \"core/linq/observable/catchproto.ts\",\n        \"core/linq/observable/combinelatest.ts\",\n        \"core/linq/observable/combinelatestproto.ts\",\n        \"core/linq/observable/concat.ts\",\n        \"core/linq/observable/concatall.ts\",\n        \"core/linq/observable/concatmap.ts\",\n        \"core/linq/observable/concatmapobserver.ts\",\n        \"core/linq/observable/concatproto.ts\",\n        \"core/linq/observable/count.ts\",\n        \"core/linq/observable/create.ts\",\n        \"core/linq/observable/debounce.ts\",\n        \"core/linq/observable/defaultifempty.ts\",\n        \"core/linq/observable/defer.ts\",\n        \"core/linq/observable/delay.ts\",\n        \"core/linq/observable/delaysubscription.ts\",\n        \"core/linq/observable/dematerialize.ts\",\n        \"core/linq/observable/distinct.ts\",\n        \"core/linq/observable/distinctuntilchanged.ts\",\n        \"core/linq/observable/dowhile.ts\",\n        \"core/linq/observable/elementat.ts\",\n        \"core/linq/observable/empty.ts\",\n        \"core/linq/observable/every.ts\",\n        \"core/linq/observable/expand.ts\",\n        \"core/linq/observable/filter.ts\",\n        \"core/linq/observable/finally.ts\",\n        \"core/linq/observable/find.ts\",\n        \"core/linq/observable/findindex.ts\",\n        \"core/linq/observable/first.ts\",\n        \"core/linq/observable/flatmap.ts\",\n        \"core/linq/observable/flatmapfirst.ts\",\n        \"core/linq/observable/flatmaplatest.ts\",\n        \"core/linq/observable/flatmapwithmaxconcurrent.ts\",\n        \"core/linq/observable/for.ts\",\n        \"core/linq/observable/forkjoin.ts\",\n        \"core/linq/observable/forkjoinproto.ts\",\n        \"core/linq/observable/from.ts\",\n        \"core/linq/observable/fromarray.ts\",\n        \"core/linq/observable/fromcallback.ts\",\n        \"core/linq/observable/fromevent.ts\",\n        \"core/linq/observable/fromeventpattern.ts\",\n        \"core/linq/observable/fromnodecallback.ts\",\n        \"core/linq/observable/frompromise.ts\",\n        \"core/linq/observable/generate.ts\",\n        \"core/linq/observable/generatewithabsolutetime.ts\",\n        \"core/linq/observable/generatewithrelativetime.ts\",\n        \"core/linq/observable/groupby.ts\",\n        \"core/linq/observable/groupbyuntil.ts\",\n        \"core/linq/observable/groupjoin.ts\",\n        \"core/linq/observable/if.ts\",\n        \"core/linq/observable/ignoreelements.ts\",\n        \"core/linq/observable/includes.ts\",\n        \"core/linq/observable/indexof.ts\",\n        \"core/linq/observable/interval.ts\",\n        \"core/linq/observable/isempty.ts\",\n        \"core/linq/observable/join.ts\",\n        \"core/linq/observable/jortsort.ts\",\n        \"core/linq/observable/jortsortuntil.ts\",\n        \"core/linq/observable/just.ts\",\n        \"core/linq/observable/last.ts\",\n        \"core/linq/observable/let.ts\",\n        \"core/linq/observable/manyselect.ts\",\n        \"core/linq/observable/map.ts\",\n        \"core/linq/observable/materialize.ts\",\n        \"core/linq/observable/max.ts\",\n        \"core/linq/observable/maxby.ts\",\n        \"core/linq/observable/merge.ts\",\n        \"core/linq/observable/mergeall.ts\",\n        \"core/linq/observable/mergedelayerror.ts\",\n        \"core/linq/observable/mergeproto.ts\",\n        \"core/linq/observable/min.ts\",\n        \"core/linq/observable/minby.ts\",\n        \"core/linq/observable/multicast.ts\",\n        \"core/linq/observable/never.ts\",\n        \"core/linq/observable/observeon.ts\",\n        \"core/linq/observable/of.ts\",\n        \"core/linq/observable/ofarraychanges.ts\",\n        \"core/linq/observable/ofobjectchanges.ts\",\n        \"core/linq/observable/onerrorresumenext.ts\",\n        \"core/linq/observable/onerrorresumenextproto.ts\",\n        \"core/linq/observable/pairs.ts\",\n        \"core/linq/observable/pairwise.ts\",\n        \"core/linq/observable/partition.ts\",\n        \"core/linq/observable/pipe.ts\",\n        \"core/linq/observable/pluck.ts\",\n        \"core/linq/observable/publish.ts\",\n        \"core/linq/observable/publishlast.ts\",\n        \"core/linq/observable/publishvalue.ts\",\n        \"core/linq/observable/range.ts\",\n        \"core/linq/observable/reduce.ts\",\n        \"core/linq/observable/repeat.ts\",\n        \"core/linq/observable/repeatproto.ts\",\n        \"core/linq/observable/replay.ts\",\n        \"core/linq/observable/retry.ts\",\n        \"core/linq/observable/retrywhen.ts\",\n        \"core/linq/observable/sample.ts\",\n        \"core/linq/observable/scan.ts\",\n        \"core/linq/observable/selectmanyobserver.ts\",\n        \"core/linq/observable/sequenceequal.ts\",\n        \"core/linq/observable/share.ts\",\n        \"core/linq/observable/sharereplay.ts\",\n        \"core/linq/observable/sharevalue.ts\",\n        \"core/linq/observable/single.ts\",\n        \"core/linq/observable/singleinstance.ts\",\n        \"core/linq/observable/skip.ts\",\n        \"core/linq/observable/skiplast.ts\",\n        \"core/linq/observable/skiplastwithtime.ts\",\n        \"core/linq/observable/skipuntil.ts\",\n        \"core/linq/observable/skipuntilwithtime.ts\",\n        \"core/linq/observable/skipwhile.ts\",\n        \"core/linq/observable/skipwithtime.ts\",\n        \"core/linq/observable/some.ts\",\n        \"core/linq/observable/spawn.ts\",\n        \"core/linq/observable/start.ts\",\n        \"core/linq/observable/startasync.ts\",\n        \"core/linq/observable/startwith.ts\",\n        \"core/linq/observable/subscribeon.ts\",\n        \"core/linq/observable/sum.ts\",\n        \"core/linq/observable/switch.ts\",\n        \"core/linq/observable/switchfirst.ts\",\n        \"core/linq/observable/take.ts\",\n        \"core/linq/observable/takelast.ts\",\n        \"core/linq/observable/takelastbuffer.ts\",\n        \"core/linq/observable/takelastbufferwithtime.ts\",\n        \"core/linq/observable/takelastwithtime.ts\",\n        \"core/linq/observable/takeuntil.ts\",\n        \"core/linq/observable/takeuntilwithtime.ts\",\n        \"core/linq/observable/takewhile.ts\",\n        \"core/linq/observable/takewithtime.ts\",\n        \"core/linq/observable/tap.ts\",\n        \"core/linq/observable/thendo.ts\",\n        \"core/linq/observable/throttle.ts\",\n        \"core/linq/observable/throw.ts\",\n        \"core/linq/observable/timeinterval.ts\",\n        \"core/linq/observable/timeout.ts\",\n        \"core/linq/observable/timer.ts\",\n        \"core/linq/observable/timestamp.ts\",\n        \"core/linq/observable/toarray.ts\",\n        \"core/linq/observable/toasync.ts\",\n        \"core/linq/observable/tomap.ts\",\n        \"core/linq/observable/topromise.ts\",\n        \"core/linq/observable/toset.ts\",\n        \"core/linq/observable/transduce.ts\",\n        \"core/linq/observable/using.ts\",\n        \"core/linq/observable/when.ts\",\n        \"core/linq/observable/while.ts\",\n        \"core/linq/observable/window.ts\",\n        \"core/linq/observable/windowwithcount.ts\",\n        \"core/linq/observable/windowwithtime.ts\",\n        \"core/linq/observable/windowwithtimeorcount.ts\",\n        \"core/linq/observable/withlatestfrom.ts\",\n        \"core/linq/observable/zip.ts\",\n        \"core/linq/observable/zipiterable.ts\",\n        \"core/linq/observable/zipproto.ts\",\n        \"core/notification.ts\",\n        \"core/observable.ts\",\n        \"core/observer-extras.ts\",\n        \"core/observer-lite.ts\",\n        \"core/observer.ts\",\n        \"core/scheduledobserver.ts\",\n        \"core/subjects/anonymoussubject.ts\",\n        \"core/subjects/asyncsubject.ts\",\n        \"core/subjects/behaviorsubject.ts\",\n        \"core/subjects/replaysubject.ts\",\n        \"core/subjects/subject.ts\",\n        \"core/testing/mockdisposable.ts\",\n        \"core/testing/mockobserver.ts\",\n        \"core/testing/reactivetest.ts\",\n        \"core/testing/recorded.ts\",\n        \"core/testing/subscription.ts\",\n        \"core/testing/testscheduler.ts\"\n    ],\n    \"exclude\": []\n}\n"
  }
]